ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmVlZjgKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsNTYgQEAKKy0tLQorTGFuZ3VhZ2U6ICAgICAgICBDcHAKKyMgQmFzZWRPblN0eWxlOiAgTExWTQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitDb25zdHJ1Y3RvckluaXRpYWxpemVySW5kZW50V2lkdGg6IDIKK0FsaWduRXNjYXBlZE5ld2xpbmVzTGVmdDogZmFsc2UKK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWxsb3dBbGxQYXJhbWV0ZXJzT2ZEZWNsYXJhdGlvbk9uTmV4dExpbmU6IGZhbHNlCitBbGxvd1Nob3J0QmxvY2tzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRJZlN0YXRlbWVudHNPbkFTaW5nbGVMaW5lOiBmYWxzZQorQWxsb3dTaG9ydExvb3BzT25BU2luZ2xlTGluZTogZmFsc2UKK0FsbG93U2hvcnRGdW5jdGlvbnNPbkFTaW5nbGVMaW5lOiBJbmxpbmUKK0Fsd2F5c0JyZWFrVGVtcGxhdGVEZWNsYXJhdGlvbnM6IHRydWUKK0Fsd2F5c0JyZWFrQmVmb3JlTXVsdGlsaW5lU3RyaW5nczogdHJ1ZQorQnJlYWtCZWZvcmVCaW5hcnlPcGVyYXRvcnM6IHRydWUKK0JyZWFrQmVmb3JlVGVybmFyeU9wZXJhdG9yczogdHJ1ZQorQnJlYWtDb25zdHJ1Y3RvckluaXRpYWxpemVyc0JlZm9yZUNvbW1hOiBmYWxzZQorQmluUGFja1BhcmFtZXRlcnM6IGZhbHNlCitDb2x1bW5MaW1pdDogICAgIDEwMAorQ29uc3RydWN0b3JJbml0aWFsaXplckFsbE9uT25lTGluZU9yT25lUGVyTGluZTogdHJ1ZQorRGVyaXZlUG9pbnRlckFsaWdubWVudDogZmFsc2UKK0luZGVudENhc2VMYWJlbHM6IGZhbHNlCitJbmRlbnRXcmFwcGVkRnVuY3Rpb25OYW1lczogZmFsc2UKK0luZGVudEZ1bmN0aW9uRGVjbGFyYXRpb25BZnRlclR5cGU6IGZhbHNlCitNYXhFbXB0eUxpbmVzVG9LZWVwOiAxCitLZWVwRW1wdHlMaW5lc0F0VGhlU3RhcnRPZkJsb2NrczogdHJ1ZQorTmFtZXNwYWNlSW5kZW50YXRpb246IE5vbmUKK09iakNTcGFjZUFmdGVyUHJvcGVydHk6IGZhbHNlCitPYmpDU3BhY2VCZWZvcmVQcm90b2NvbExpc3Q6IHRydWUKK1BlbmFsdHlCcmVha0JlZm9yZUZpcnN0Q2FsbFBhcmFtZXRlcjogMTkwCitQZW5hbHR5QnJlYWtDb21tZW50OiAzMDAKK1BlbmFsdHlCcmVha1N0cmluZzogMTAwMDAKK1BlbmFsdHlCcmVha0ZpcnN0TGVzc0xlc3M6IDEyMAorUGVuYWx0eUV4Y2Vzc0NoYXJhY3RlcjogMTAwMDAwMAorUGVuYWx0eVJldHVyblR5cGVPbkl0c093bkxpbmU6IDEyMDAKK1BvaW50ZXJBbGlnbm1lbnQ6IExlZnQKK1NwYWNlc0JlZm9yZVRyYWlsaW5nQ29tbWVudHM6IDEKK0NwcDExQnJhY2VkTGlzdFN0eWxlOiB0cnVlCitTdGFuZGFyZDogICAgICAgIEF1dG8KK0luZGVudFdpZHRoOiAgICAgMgorVGFiV2lkdGg6ICAgICAgICA0CitVc2VUYWI6ICAgICAgICAgIE5ldmVyCitCcmVha0JlZm9yZUJyYWNlczogQXR0YWNoCitTcGFjZXNJblBhcmVudGhlc2VzOiBmYWxzZQorU3BhY2VzSW5BbmdsZXM6ICBmYWxzZQorU3BhY2VJbkVtcHR5UGFyZW50aGVzZXM6IGZhbHNlCitTcGFjZXNJbkNTdHlsZUNhc3RQYXJlbnRoZXNlczogZmFsc2UKK1NwYWNlc0luQ29udGFpbmVyTGl0ZXJhbHM6IHRydWUKK1NwYWNlQmVmb3JlQXNzaWdubWVudE9wZXJhdG9yczogdHJ1ZQorQ29udGludWF0aW9uSW5kZW50V2lkdGg6IDQKK0NvbW1lbnRQcmFnbWFzOiAgJ14gSVdZVSBwcmFnbWE6JworRm9yRWFjaE1hY3JvczogICBbIGZvcmVhY2gsIFFfRk9SRUFDSCwgQk9PU1RfRk9SRUFDSCBdCitTcGFjZUJlZm9yZVBhcmVuczogQ29udHJvbFN0YXRlbWVudHMKK0Rpc2FibGVGb3JtYXQ6ICAgZmFsc2UKKy4uLgorCmRpZmYgLS1naXQgYS8uZG9ja2VyaWdub3JlIGIvLmRvY2tlcmlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJlY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvLmRvY2tlcmlnbm9yZQpAQCAtMCwwICsxIEBACisuZ2l0LwpkaWZmIC0tZ2l0IGEvLmVkaXRvcmNvbmZpZyBiLy5lZGl0b3Jjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzYxMTc2MgotLS0gL2Rldi9udWxsCisrKyBiLy5lZGl0b3Jjb25maWcKQEAgLTAsMCArMSwxMTIgQEAKKyMKKyMjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyMKKyMjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjCisKKyMgRWRpdG9yQ29uZmlnOiBodHRwOi8vZWRpdG9yY29uZmlnLm9yZworIyBzZWUgZG9jL2NvZGluZ19zdGFuZGFyZHMubWQKKworcm9vdCA9IHRydWUKKworWypdCitlbmRfb2ZfbGluZSA9IGxmCitjaGFyc2V0ID0gdXRmLTgKK3RyaW1fdHJhaWxpbmdfd2hpdGVzcGFjZSA9IHRydWUKK2luc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQorCisjIEFjdGlvblNjcmlwdAorIyBbKi5hc10KKworIyBDCisjIFsqLmNdCisKKyMgQysrCitbKi5jcHBdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgQy1TaGFycAorIyBbKi5jc10KKworIyBECisjIFsqLmRdCisKKyMgRXJsYW5nCisjIFsqLmVybF0KKworIyBHby1sYW5nCitbKi5nb10KK2luZGVudF9zdHlsZSA9IHRhYgoraW5kZW50X3NpemUgPSA4CisKKyMgQyBoZWFkZXIgZmlsZXMKKyMgWyouaF0KKworIyBIYXNrZWxsCisjIFsqLmhzXQorCisjIEhheGUKKyMgWyouaHhdCisKKyMgSmF2YQorIyBbKi5qYXZhXQorCisjIEphdmFzY3JpcHQKK1sqLmpzXQoraW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgorCisjIEpTT04KK1sqLmpzb25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQoraW5kZW50X3NpemUgPSAyCisKKyMgTHVhCisjIFsqLmx1YV0KKworWyoubWFya2Rvd25dCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworWyoubWRdCitpbmRlbnRfc3R5bGUgPSBzcGFjZQordHJpbV90cmFpbGluZ193aGl0ZXNwYWNlID0gZmFsc2UKKworIyBPQ2FtbAorIyBbKi5tbF0KKworIyBEZWxwaGkgUGFzY2FsCisjIFsqLnBhc10KKworIyBQSFAKKyMgWyoucGhwXQorCisjIFBlcmwKKyMgWyoucG1dCisKKyMgUHl0aG9uCisjIFsqLnB5XQorCisjIFJ1YnkKKyMgWyoucmJdCisKKyMgVHlwZXNjcmlwdAorIyBbKi50c10KKworIyBYTUwKKyMgWyoueG1sXQpkaWZmIC0tZ2l0IGEvLmVzbGludGlnbm9yZSBiLy5lc2xpbnRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMmRiYQotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRpZ25vcmUKQEAgLTAsMCArMSw5IEBACisjIFRPRE86IFVzZSBlc2xpbnQgb24ganMgbGliIGFuZCBnZW5lcmF0ZWQgY29kZQorCisjIElnbm9yZSBsaWIvanMgZm9yIG5vdywgd2hpY2ggdXNlcyBqc2hpbnQgY3VycmVudGx5CitsaWIvanMvKgorIyBJZ25vcmUgYWxsIGdlbmVyYXRlZCBjb2RlIGZvciBub3cKKyoqL2dlbi0qCisKKyMgRG9uJ3QgbGludCBuZXN0ZWQgbm9kZV9tb2R1bGVzCisqKi9ub2RlX21vZHVsZXMKZGlmZiAtLWdpdCBhLy5lc2xpbnRyYy5qc29uIGIvLmVzbGludHJjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFhZTgyMAotLS0gL2Rldi9udWxsCisrKyBiLy5lc2xpbnRyYy5qc29uCkBAIC0wLDAgKzEsMjQgQEAKK3sKKyAgImVudiI6IHsKKyAgICAiZXM2IjogdHJ1ZSwKKyAgICAibm9kZSI6IHRydWUKKyAgfSwKKyAgImV4dGVuZHMiOiBbCisgICAgImVzbGludDpyZWNvbW1lbmRlZCIsCisgICAgInBsdWdpbjpwcmV0dGllci9yZWNvbW1lbmRlZCIKKyAgXSwKKyAgInBhcnNlck9wdGlvbnMiOiB7CisgICAgImVjbWFWZXJzaW9uIjogMjAxNworICB9LAorICAicnVsZXMiOiB7CisgICAgIm5vLWNvbnNvbGUiOiAib2ZmIiwKKyAgICAibm8tdmFyIjogImVycm9yIiwKKyAgICAicHJlZmVyLWNvbnN0IjogImVycm9yIiwKKyAgICAibm8tY29uc3RhbnQtY29uZGl0aW9uIjogWworICAgICAgImVycm9yIiwKKyAgICAgIHsKKyAgICAgICAgImNoZWNrTG9vcHMiOiBmYWxzZQorICAgICAgfQorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvLmdpdGF0dHJpYnV0ZXMgYi8uZ2l0YXR0cmlidXRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzZhNDU4Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTAsMCArMSBAQAorKiB0ZXh0PWF1dG8KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDEwYzc2N2YuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMyw5ICszLDEyIEBACiAqLmxvCiAqLm8KICouZGVwcworKi5kaXJzdGFtcAogKi5saWJzCi1nZW4tKgorKi5sb2cKKyoudHJzCiAqLnN1bworKi5weWMKICouY2FjaGUKICoudXNlcgogKi5pcGNoCkBAIC0xNSw0NCArMTgsODUgQEAKICouZGxsCiAqX1JlU2hhcnBlcioKICoub3BlbnNkZgorKi5zd3AKKyouaGkKKyp+Cit0YWdzCiAKLS9NYWtlZmlsZQotL01ha2VmaWxlLmluCisuKnByb2plY3QKKy5jbGFzc3BhdGgKKy5kdWIKKy5zZXR0aW5ncworLmNoZWNrc3R5bGUKK2p1bml0Ki5wcm9wZXJ0aWVzCisuaWRlYQorKi5pbWwKKyouaXByCisqLml3cworZ2VuLSoKK01ha2VmaWxlCitNYWtlZmlsZS5pbgorYWNsb2NhbC5tNAorYWNpbmNsdWRlLm00CithcGFjaGUtdGhyaWZ0LXRlc3QtbGlicmFyeQorYXV0b200dGUuY2FjaGUKK2NtYWtlLSoKK2R1Yi5zZWxlY3Rpb25zLmpzb24KK2xpYmFwYWNoZS10aHJpZnQuYQorbm9kZV9tb2R1bGVzCitjb21waWxlCit0ZXN0LWRyaXZlcgorZXJsX2NyYXNoLmR1bXAKK3Byb2plY3QubG9jay5qc29uCisKKy5zb25hcgorLkRTX1N0b3JlCisuc3ZuCisudmFncmFudAorLnZzY29kZQorLnZzCisKIC9hY2xvY2FsL2xpYnRvb2wubTQKLS9hY2xvY2FsL2x0b3B0aW9ucy5tNAotL2FjbG9jYWwvbHRzdWdhci5tNAotL2FjbG9jYWwvbHR2ZXJzaW9uLm00Ci0vYWNsb2NhbC9sdH5vYnNvbGV0ZS5tNAotL2FjbG9jYWwubTQKLS9hdXRvbTR0ZS5jYWNoZQorL2FjbG9jYWwvbHQqLm00CiAvYXV0b3NjYW4ubG9nCisvYXV0b3NjYW4tKi5sb2cKKy9jbWFrZV8qCisvY29tcGlsZXIvY3BwL2NvbXBpbGVyLlZDLmRiCisvY29tcGlsZXIvY3BwL2NvbXBpbGVyLlZDLlZDLm9wZW5kYgorL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi90X2NwcF9nZW5lcmF0b3IuY2MKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5oCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5jcHAKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgKKy9jb21waWxlci9jcHAvdGVzdC8qdGVzdAorL2NvbXBpbGVyL2NwcC90ZXN0L3RocmlmdC1nZW4tKgorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1ib290c3RyYXAKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vZ2VuLnN0YW1wCiAvY29tcGlsZXIvY3BwL0RlYnVnCi0vY29tcGlsZXIvY3BwL2xpYnBhcnNlLmEKLS9jb21waWxlci9jcHAvTWFrZWZpbGUKLS9jb21waWxlci9jcHAvTWFrZWZpbGUuaW4KKy9jb21waWxlci9jcHAvUmVsZWFzZQorL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xpYnBhcnNlLmEKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmNjCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS5jYworL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkuaGgKKy9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL3ZlcnNpb24uaAogL2NvbXBpbGVyL2NwcC90aHJpZnQKIC9jb21waWxlci9jcHAvdGhyaWZ0bC5jYwogL2NvbXBpbGVyL2NwcC90aHJpZnR5LmNjCisvY29tcGlsZXIvY3BwL2xleC55eXRocmlmdGwuY2MKIC9jb21waWxlci9jcHAvdGhyaWZ0eS5oCi0vY29tcGlsZXIvY3BwL3ZlcnNpb24uaAorL2NvbXBpbGVyL2NwcC90aHJpZnR5LmhoCisvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAvY29uZmlnLioKIC9jb25maWd1cmUKIC9jb25maWd1cmUubGluZW5vCiAvY29uZmlndXJlLnNjYW4KLS9jb250cmliL2ZiMzAzL01ha2VmaWxlCi0vY29udHJpYi9mYjMwMy9NYWtlZmlsZS5pbgotL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC5tNAotL2NvbnRyaWIvZmIzMDMvYXV0b200dGUuY2FjaGUvCisvY29udHJpYi8udmFncmFudC8KIC9jb250cmliL2ZiMzAzL2NvbmZpZy5jYWNoZQogL2NvbnRyaWIvZmIzMDMvY29uZmlnLmxvZwogL2NvbnRyaWIvZmIzMDMvY29uZmlnLnN0YXR1cwogL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlCi0vY29udHJpYi9mYjMwMy9jcHAvTWFrZWZpbGUKLS9jb250cmliL2ZiMzAzL2NwcC9NYWtlZmlsZS5pbgogL2NvbnRyaWIvZmIzMDMvY3BwL2xpYmZiMzAzLmEKIC9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQvCi0vY29udHJpYi9mYjMwMy9weS9NYWtlZmlsZQotL2NvbnRyaWIvZmIzMDMvcHkvTWFrZWZpbGUuaW4KIC9jb250cmliL2ZiMzAzL3B5L2J1aWxkLwogL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tTZXJ2aWNlLXJlbW90ZQogL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvRmFjZWJvb2tTZXJ2aWNlLnB5CkBAIC02MCwzNCArMTA0LDQ5IEBACiAvY29udHJpYi9mYjMwMy9weS9mYjMwMy9jb25zdGFudHMucHkKIC9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL3R0eXBlcy5weQogL2RlcGNvbXAKLS9pZi9NYWtlZmlsZQotL2lmL01ha2VmaWxlLmluCiAvaW5zdGFsbC1zaAotL2xpYi9NYWtlZmlsZQotL2xpYi9NYWtlZmlsZS5pbgotL2xpYi9jcHAvTWFrZWZpbGUKLS9saWIvY3BwL01ha2VmaWxlLmluCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvbGliL2NsL3J1bi10ZXN0cworL2xpYi9jbC9xdWlja2xpc3AubGlzcAorL2xpYi9jbC9leHRlcm5hbHMvCisvbGliL2NsL3J1bi10ZXN0cworL2xpYi9jbC9xdWlja2xpc3AvCiAvbGliL2NwcC9EZWJ1Zy8KIC9saWIvY3BwL0RlYnVnLW10LwogL2xpYi9jcHAvUmVsZWFzZS8KIC9saWIvY3BwL1JlbGVhc2UtbXQvCiAvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L21vY19UUVRjcFNlcnZlci5jcHAKLS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUKLS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuaW4KKy9saWIvY3BwL3NyYy90aHJpZnQvcXQvbW9jX19UUVRjcFNlcnZlci5jcHAKKy9saWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmgKKy9saWIvY3BwL3NyYy90aHJpZnQvc3RhbXAtaDIKIC9saWIvY3BwL3Rlc3QvQmVuY2htYXJrCiAvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sc1Rlc3QKKy9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QKIC9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QKKy9saWIvY3BwL3Rlc3QvRGVuc2VQcm90b1Rlc3QKKy9saWIvY3BwL3Rlc3QvRW51bVRlc3QKIC9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdAogL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdAorL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QKIC9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0CisvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QKIC9saWIvY3BwL3Rlc3QvUmVmbGVjdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0CiAvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1RJbnRlcnJ1cHRUZXN0CisvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAogL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0CisvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QKIC9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdAogL2xpYi9jcHAvdGVzdC9Vbml0VGVzdHMKIC9saWIvY3BwL3Rlc3QvWmxpYlRlc3QKKy9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0CiAvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5X3Rlc3QKKy9saWIvY3BwL3Rlc3QvbGlua190ZXN0CiAvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvcl90ZXN0CiAvbGliL2NwcC90ZXN0L3Rlc3RzLnhtbAogL2xpYi9jcHAvY29uY3VycmVuY3lfdGVzdApAQCAtOTksODMgKzE1OCwxMDEgQEAKIC9saWIvY19nbGliLyouZ2NkYQogL2xpYi9jX2dsaWIvKi5nY25vCiAvbGliL2NfZ2xpYi8qLmxvVAotL2xpYi9jX2dsaWIvTWFrZWZpbGUuaW4KLS9saWIvY19nbGliL01ha2VmaWxlCisvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NvbmZpZy5oCisvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3N0YW1wLWgzCisvbGliL2NfZ2xpYi90ZXN0LyouZ2NubwogL2xpYi9jX2dsaWIvdGVzdC90ZXN0d3JhcHBlci5zaAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0d3JhcHBlci10ZXN0KgotL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZQotL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5pbgorL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24KIC9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wKIC9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0CisvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvCisvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIKIC9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQKKy9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QKIC9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QKIC9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQKIC9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldAorL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbgogL2xpYi9jX2dsaWIvdGhyaWZ0Yy5wYwogL2xpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYwotL2xpYi9jc2hhcnAvTWFrZWZpbGUKLS9saWIvY3NoYXJwL01ha2VmaWxlLmluCi0vbGliL2NzaGFycC9zcmMvYmluLwotL2xpYi9jc2hhcnAvc3JjL29iai8KLS9saWIvZC9saWJ0aHJpZnRkLmEKLS9saWIvZC9NYWtlZmlsZQotL2xpYi9kL01ha2VmaWxlLmluCi0vbGliL2QvdGVzdC9NYWtlZmlsZQotL2xpYi9kL3Rlc3QvTWFrZWZpbGUuaW4KLS9saWIvZXJsLy5nZW5lcmF0ZWQKKy9saWIvY3NoYXJwLyoqL2Jpbi8KKy9saWIvY3NoYXJwLyoqL29iai8KKy9saWIvY3NoYXJwL3NyYy9wYWNrYWdlcworL2xpYi9kL3Rlc3QvKi5wZW0KKy9saWIvZC9saWJ0aHJpZnRkKi5hCisvbGliL2QvdGVzdC9hc3luY190ZXN0CisvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0CisvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyaworL2xpYi9kL3Rlc3Qvc3RyZXNzX3Rlc3Rfc2VydmVyCisvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQKKy9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlcgorL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QKKy9saWIvZC91bml0dGVzdC8KKy9saWIvZGFydC9jb3ZlcmFnZQorL2xpYi9kYXJ0LyoqLy5wYWNrYWdlcworL2xpYi9kYXJ0LyoqL3BhY2thZ2VzCisvbGliL2RhcnQvKiovLnB1Yi8KKy9saWIvZGFydC8qKi9wdWJzcGVjLmxvY2sKKy9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLnJlcXVlc3QKKy9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLnJlc3BvbnNlCisvbGliL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy9saWIvZGVscGhpLyoqLyoubG9jYWwKKy9saWIvZGVscGhpLyoqLyouZGN1CisvbGliL2RlbHBoaS8qKi8qLjIwMDcKKy9saWIvZGVscGhpLyoqLyouZHByb2oKKy9saWIvZGVscGhpLyoqL2NvZGVnZW4vKi5iYXQKIC9saWIvZXJsLy5ldW5pdAotL2xpYi9lcmwvZWJpbgorL2xpYi9lcmwvLmdlbmVyYXRlZAorL2xpYi9lcmwvLnJlYmFyLwogL2xpYi9lcmwvZGVwcy8KKy9saWIvZXJsL2ViaW4KIC9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwotL2xpYi9lcmwvdGVzdC8qLmVybAotL2xpYi9lcmwvdGVzdC8qLmhybAogL2xpYi9lcmwvdGVzdC8qLmJlYW0KKy9saWIvZXJsL3Rlc3QvKi5ocmwKKy9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aG91dC50aHJpZnQKKy9saWIvaGF4ZS90ZXN0L2JpbgorL2xpYi9oYXhlL3Rlc3QvZGF0YS50bXAKIC9saWIvaHMvZGlzdAotL2xpYi9ocy9NYWtlZmlsZQotL2xpYi9ocy9NYWtlZmlsZS5pbgotL2xpYi9qYXZhL01ha2VmaWxlCi0vbGliL2phdmEvTWFrZWZpbGUuaW4KKy9saWIvamF2YS8uZ3JhZGxlCisvbGliL2phdmEvYW5kcm9pZC8uZ3JhZGxlCiAvbGliL2phdmEvYnVpbGQKKy9saWIvamF2YS90YXJnZXQKKy9saWIvanMvZGlzdAorL2xpYi9qcy9kb2MKIC9saWIvanMvdGVzdC9idWlsZAotL2xpYi9qcy90ZXN0L01ha2VmaWxlCi0vbGliL2pzL3Rlc3QvTWFrZWZpbGUuaW4KKy9saWIvbmV0Y29yZS8qKi9iaW4KKy9saWIvbmV0Y29yZS8qKi9vYmoKKy9saWIvbm9kZWpzL2NvdmVyYWdlCisvbGliL25vZGVqcy9ub2RlX21vZHVsZXMvCiAvbGliL3BlcmwvTUFOSUZFU1QKLS9saWIvcGVybC9NYWtlZmlsZQotL2xpYi9wZXJsL01ha2VmaWxlLmluCisvbGliL3BlcmwvTVlNRVRBLmpzb24KKy9saWIvcGVybC9NWU1FVEEueW1sCiAvbGliL3BlcmwvTWFrZWZpbGUtcGVybC5tawogL2xpYi9wZXJsL2JsaWIKIC9saWIvcGVybC9wbV90b19ibGliCi0vbGliL3BlcmwvdGVzdC9NYWtlZmlsZQotL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuaW4KLS9saWIvcHkvTWFrZWZpbGUKLS9saWIvcHkvTWFrZWZpbGUuaW4KIC9saWIvcHkvYnVpbGQKLS9saWIvcmIvTWFrZWZpbGUKLS9saWIvcmIvTWFrZWZpbGUuaW4KKy9saWIvcHkvdGhyaWZ0LmVnZy1pbmZvLworL2xpYi9yYi9HZW1maWxlLmxvY2sKIC9saWIvcmIvZGVidWdfcHJvdG9fdGVzdAogL2xpYi9yYi8uY29uZmlnCi0vbGliL3JiL2V4dC9NYWtlZmlsZQogL2xpYi9yYi9leHQvY29uZnRlc3QuZFNZTS8KIC9saWIvcmIvZXh0L21rbWYubG9nCiAvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmJ1bmRsZQogL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5zbwogL2xpYi9yYi90ZXN0LwogL2xpYi9yYi90aHJpZnQtKi5nZW0KLS9saWIvcGhwL01ha2VmaWxlCi0vbGliL3BocC9NYWtlZmlsZS5pbgotL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvTWFrZWZpbGUKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL01ha2VmaWxlLioKLS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2FjaW5jbHVkZS5tNAotL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYWNsb2NhbC5tNAotL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYXV0b200dGUuY2FjaGUvCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9idWlsZC8KIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy4qCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUKKy9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZS5hYwogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlLmluCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9pbnN0YWxsLXNoCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9saWJ0b29sCkBAIC0xODgsNDIgKzI2NSwxMzIgQEAKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5sYQogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvdG1wLXBocC5pbmkKIC9saWIvcGhwL3NyYy9wYWNrYWdlcy8KLS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUKLS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuaW4KLS9saWIvcGhwL3Rlc3QvcGhwdW5pdC54bWwKKy9saWIvcGhwL3Rlc3QvVEVTVC0qLnhtbAorL2xpYi9waHAvdGVzdC9wYWNrYWdlcy8KKy9saWIvcHkvZGlzdC8KIC9saWIvZXJsL2xvZ3MvCi0vbGliL2VybC9NYWtlZmlsZQotL2xpYi9lcmwvTWFrZWZpbGUuaW4KLS9saWIvZXJsL3NyYy9NYWtlZmlsZQotL2xpYi9lcmwvc3JjL01ha2VmaWxlLmluCisvbGliL2dvL3BrZworL2xpYi9nby9zcmMKKy9saWIvZ28vdGVzdC9nb3BhdGgvCisvbGliL2dvL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKy9saWIvcnMvdGFyZ2V0LworL2xpYi9ycy9DYXJnby5sb2NrCisvbGliL3JzL3Rlc3QvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L3RhcmdldC8KKy9saWIvcnMvdGVzdC9iaW4vCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2Vfb25lLnJzCisvbGliL3JzL3Rlc3Qvc3JjL2Jhc2VfdHdvLnJzCisvbGliL3JzL3Rlc3Qvc3JjL21pZGxheWVyLnJzCisvbGliL3JzL3Rlc3Qvc3JjL3JlY3Vyc2l2ZS5ycworL2xpYi9ycy90ZXN0L3NyYy91bHRpbWF0ZS5ycworL2xpYi9ycy8qLmltbAorL2xpYi9ycy8qKi8qLmltbAorL2xpYi9zd2lmdC8uYnVpbGQKIC9saWJ0b29sCiAvbHRtYWluLnNoCiAvbWlzc2luZworL25vZGVfbW9kdWxlcy8KKy92ZW5kb3IvCisvY29tcG9zZXIubG9jawogL3N0YW1wLWgxCi0vdGVzdC9NYWtlZmlsZQotL3Rlc3QvTWFrZWZpbGUuaW4KLS90ZXN0L2NwcC9NYWtlZmlsZQotL3Rlc3QvY3BwL01ha2VmaWxlLmluCisvdGVzdC9mZWF0dXJlcy9yZXN1bHRzLmpzb24KKy90ZXN0L3Jlc3VsdHMuanNvbgorL3Rlc3QvY19nbGliL3Rlc3RfY2xpZW50CisvdGVzdC9jX2dsaWIvdGVzdF9zZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RTZXJ2ZXIKKy90ZXN0L2NsL1Rlc3RDbGllbnQKIC90ZXN0L2NwcC9TdHJlc3NUZXN0CiAvdGVzdC9jcHAvU3RyZXNzVGVzdE5vbkJsb2NraW5nCiAvdGVzdC9jcHAvVGVzdENsaWVudAogL3Rlc3QvY3BwL1Rlc3RTZXJ2ZXIKLS90ZXN0L2hzL01ha2VmaWxlCi0vdGVzdC9ocy9NYWtlZmlsZS5pbgorL3Rlc3QvY3NoYXJwL29iagorL3Rlc3QvY3NoYXJwL2JpbgorL3Rlc3QvZGFydC8qKi8ucGFja2FnZXMKKy90ZXN0L2RhcnQvKiovcGFja2FnZXMKKy90ZXN0L2RhcnQvKiovLnB1Yi8KKy90ZXN0L2RhcnQvKiovcHVic3BlYy5sb2NrCiAvdGVzdC9sb2cvCiAvdGVzdC90ZXN0LmxvZwotL3Rlc3Qvbm9kZWpzL01ha2VmaWxlCi0vdGVzdC9ub2RlanMvTWFrZWZpbGUuaW4KLS90ZXN0L3BlcmwvTWFrZWZpbGUKLS90ZXN0L3BlcmwvTWFrZWZpbGUuaW4KLS90ZXN0L3BocC9NYWtlZmlsZQotL3Rlc3QvcGhwL01ha2VmaWxlLmluCi0vdGVzdC9weS9NYWtlZmlsZQotL3Rlc3QvcHkvTWFrZWZpbGUuaW4KLS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUKLS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuaW4KKy90ZXN0L2VybC8uZ2VuZXJhdGVkCisvdGVzdC9lcmwvLnJlYmFyCisvdGVzdC9lcmwvZWJpbgorL3Rlc3QvZ28vYmluLworL3Rlc3QvZ28vVGhyaWZ0VGVzdC50aHJpZnQKKy90ZXN0L2dvL2dvcGF0aAorL3Rlc3QvZ28vcGtnLworL3Rlc3QvZ28vc3JjL2NvZGUuZ29vZ2xlLmNvbS8KKy90ZXN0L2dvL3NyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvCisvdGVzdC9nby9zcmMvZ2l0aHViLmNvbS9nb2xhbmcvCisvdGVzdC9nby9zcmMvZ29sYW5nLm9yZy8KKy90ZXN0L2dvL3NyYy9nZW4vCisvdGVzdC9nby9zcmMvdGhyaWZ0CisvdGVzdC9oYXhlL2JpbgorL3Rlc3QvaHMvVGVzdENsaWVudAorL3Rlc3QvaHMvVGVzdFNlcnZlcgorL3Rlc3QvcGhwL3BocF9leHRfZGlyLwogL3Rlc3QvcHkudHdpc3RlZC9fdHJpYWxfdGVtcC8KLS90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weWMKLS90ZXN0L3JiL01ha2VmaWxlCi0vdGVzdC9yYi9NYWtlZmlsZS5pbgorL3Rlc3QvcmIvR2VtZmlsZS5sb2NrCisvdGVzdC9uZXRjb3JlLyoqL2JpbgorL3Rlc3QvbmV0Y29yZS8qKi9vYmoKKy90ZXN0L25ldGNvcmUvVGhyaWZ0CisvdGVzdC9waHAvcGhwX2V4dF9kaXIvCisvdGVzdC9ycy9DYXJnby5sb2NrCisvdGVzdC9ycy9zcmMvdGhyaWZ0X3Rlc3QucnMKKy90ZXN0L3JzL2Jpbi8KKy90ZXN0L3JzL3RhcmdldC8KKy90ZXN0L3JzLyouaW1sCisvdGVzdC9ycy8qKi8qLmltbAorL2xpYi9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvbGliL2NsL2xpYgorL3R1dG9yaWFsL2NsL3F1aWNrbGlzcC5saXNwCisvdHV0b3JpYWwvY2wvZXh0ZXJuYWxzLworL3R1dG9yaWFsL2NsL3F1aWNrbGlzcC8KKy90dXRvcmlhbC9jbC9UdXRvcmlhbENsaWVudAorL3R1dG9yaWFsL2NsL1R1dG9yaWFsU2VydmVyCisvdHV0b3JpYWwvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL3R1dG9yaWFsL2NsL2xpYi8KKy90dXRvcmlhbC9jbC9zaGFyZWQtaW1wbGVtZW50YXRpb24uZmFzbAorL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmZhc2wKKy90dXRvcmlhbC9jcHAvVHV0b3JpYWxDbGllbnQKKy90dXRvcmlhbC9jcHAvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jX2dsaWIvdHV0b3JpYWxfY2xpZW50CisvdHV0b3JpYWwvY19nbGliL3R1dG9yaWFsX3NlcnZlcgorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvb2JqCisvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9iaW4KKy90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L29iagorL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvYmluCisvdHV0b3JpYWwvZC9hc3luY19jbGllbnQKKy90dXRvcmlhbC9kL2NsaWVudAorL3R1dG9yaWFsL2Qvc2VydmVyCisvdHV0b3JpYWwvZGFydC8qKi8ucGFja2FnZXMKKy90dXRvcmlhbC9kYXJ0LyoqL3BhY2thZ2VzCisvdHV0b3JpYWwvZGFydC8qKi8ucHViLworL3R1dG9yaWFsL2RhcnQvKiovcHVic3BlYy5sb2NrCisvdHV0b3JpYWwvZGVscGhpLyoqLyouZHNrCisvdHV0b3JpYWwvZGVscGhpLyoqLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi50dnNjb25maWcKKy90dXRvcmlhbC9kZWxwaGkvKiovZGN1CisvdHV0b3JpYWwvZGVscGhpLyoqLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5pZGVudGNhY2hlCisvdHV0b3JpYWwvZ28vZ29wYXRoCisvdHV0b3JpYWwvZ28vZ28tdHV0b3JpYWwKKy90dXRvcmlhbC9nby9jYWxjdWxhdG9yLXJlbW90ZQorL3R1dG9yaWFsL2dvL3NyYy9zaGFyZWQKKy90dXRvcmlhbC9nby9zcmMvdHV0b3JpYWwKKy90dXRvcmlhbC9nby9zcmMvZ2l0LmFwYWNoZS5vcmcKKy90dXRvcmlhbC9nby9zcmMvZ29sYW5nLm9yZworL3R1dG9yaWFsL2hheGUvYmluCisvdHV0b3JpYWwvaHMvZGlzdC8KKy90dXRvcmlhbC9qYXZhL2J1aWxkLworL3R1dG9yaWFsL2pzL2J1aWxkLworL3R1dG9yaWFsL25ldGNvcmUvKiovYmluCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9vYmoKKy90dXRvcmlhbC9uZXRjb3JlL1RocmlmdAorL3R1dG9yaWFsL3JzLyouaW1sCisvdHV0b3JpYWwvcnMvc3JjL3NoYXJlZC5ycworL3R1dG9yaWFsL3JzL3NyYy90dXRvcmlhbC5ycworL3R1dG9yaWFsL3JzL2JpbgorL3R1dG9yaWFsL3JzL3RhcmdldAorL3R1dG9yaWFsL3JzL0NhcmdvLmxvY2sKIC95bHdyYXAKKwpkaWZmIC0tZ2l0IGEvLnJ1c3RmbXQudG9tbCBiLy5ydXN0Zm10LnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNWFmZAotLS0gL2Rldi9udWxsCisrKyBiLy5ydXN0Zm10LnRvbWwKQEAgLTAsMCArMSw2NCBAQAorbWF4X3dpZHRoID0gMTAwCitoYXJkX3RhYnMgPSBmYWxzZQordGFiX3NwYWNlcyA9IDQKK25ld2xpbmVfc3R5bGUgPSAiQXV0byIKK3VzZV9zbWFsbF9oZXVyaXN0aWNzID0gIkRlZmF1bHQiCitpbmRlbnRfc3R5bGUgPSAiQmxvY2siCit3cmFwX2NvbW1lbnRzID0gZmFsc2UKK2Zvcm1hdF9kb2NfY29tbWVudHMgPSBmYWxzZQorY29tbWVudF93aWR0aCA9IDgwCitub3JtYWxpemVfY29tbWVudHMgPSBmYWxzZQorbm9ybWFsaXplX2RvY19hdHRyaWJ1dGVzID0gZmFsc2UKK2xpY2Vuc2VfdGVtcGxhdGVfcGF0aCA9ICIiCitmb3JtYXRfc3RyaW5ncyA9IGZhbHNlCitmb3JtYXRfbWFjcm9fbWF0Y2hlcnMgPSBmYWxzZQorZm9ybWF0X21hY3JvX2JvZGllcyA9IHRydWUKK2VtcHR5X2l0ZW1fc2luZ2xlX2xpbmUgPSB0cnVlCitzdHJ1Y3RfbGl0X3NpbmdsZV9saW5lID0gdHJ1ZQorZm5fc2luZ2xlX2xpbmUgPSBmYWxzZQord2hlcmVfc2luZ2xlX2xpbmUgPSBmYWxzZQoraW1wb3J0c19pbmRlbnQgPSAiQmxvY2siCitpbXBvcnRzX2xheW91dCA9ICJNaXhlZCIKK21lcmdlX2ltcG9ydHMgPSBmYWxzZQorcmVvcmRlcl9pbXBvcnRzID0gdHJ1ZQorcmVvcmRlcl9tb2R1bGVzID0gdHJ1ZQorcmVvcmRlcl9pbXBsX2l0ZW1zID0gZmFsc2UKK3R5cGVfcHVuY3R1YXRpb25fZGVuc2l0eSA9ICJXaWRlIgorc3BhY2VfYmVmb3JlX2NvbG9uID0gZmFsc2UKK3NwYWNlX2FmdGVyX2NvbG9uID0gdHJ1ZQorc3BhY2VzX2Fyb3VuZF9yYW5nZXMgPSBmYWxzZQorYmlub3Bfc2VwYXJhdG9yID0gIkZyb250IgorcmVtb3ZlX25lc3RlZF9wYXJlbnMgPSB0cnVlCitjb21iaW5lX2NvbnRyb2xfZXhwciA9IHRydWUKK292ZXJmbG93X2RlbGltaXRlZF9leHByID0gZmFsc2UKK3N0cnVjdF9maWVsZF9hbGlnbl90aHJlc2hvbGQgPSAwCitlbnVtX2Rpc2NyaW1fYWxpZ25fdGhyZXNob2xkID0gMAorbWF0Y2hfYXJtX2Jsb2NrcyA9IHRydWUKK2ZvcmNlX211bHRpbGluZV9ibG9ja3MgPSBmYWxzZQorZm5fYXJnc19kZW5zaXR5ID0gIlRhbGwiCiticmFjZV9zdHlsZSA9ICJTYW1lTGluZVdoZXJlIgorY29udHJvbF9icmFjZV9zdHlsZSA9ICJBbHdheXNTYW1lTGluZSIKK3RyYWlsaW5nX3NlbWljb2xvbiA9IHRydWUKK3RyYWlsaW5nX2NvbW1hID0gIlZlcnRpY2FsIgorbWF0Y2hfYmxvY2tfdHJhaWxpbmdfY29tbWEgPSBmYWxzZQorYmxhbmtfbGluZXNfdXBwZXJfYm91bmQgPSAxCitibGFua19saW5lc19sb3dlcl9ib3VuZCA9IDAKK2VkaXRpb24gPSAiMjAxNSIKK21lcmdlX2Rlcml2ZXMgPSB0cnVlCit1c2VfdHJ5X3Nob3J0aGFuZCA9IGZhbHNlCit1c2VfZmllbGRfaW5pdF9zaG9ydGhhbmQgPSBmYWxzZQorZm9yY2VfZXhwbGljaXRfYWJpID0gdHJ1ZQorY29uZGVuc2Vfd2lsZGNhcmRfc3VmZml4ZXMgPSBmYWxzZQorY29sb3IgPSAiQXV0byIKK3JlcXVpcmVkX3ZlcnNpb24gPSAiMS4wLjAiCit1bnN0YWJsZV9mZWF0dXJlcyA9IGZhbHNlCitkaXNhYmxlX2FsbF9mb3JtYXR0aW5nID0gZmFsc2UKK3NraXBfY2hpbGRyZW4gPSBmYWxzZQoraGlkZV9wYXJzZV9lcnJvcnMgPSBmYWxzZQorZXJyb3Jfb25fbGluZV9vdmVyZmxvdyA9IGZhbHNlCitlcnJvcl9vbl91bmZvcm1hdHRlZCA9IGZhbHNlCityZXBvcnRfdG9kbyA9ICJOZXZlciIKK3JlcG9ydF9maXhtZSA9ICJOZXZlciIKK2lnbm9yZSA9IFtdCitlbWl0X21vZGUgPSAiRmlsZXMiCittYWtlX2JhY2t1cCA9IGZhbHNlCmRpZmYgLS1naXQgYS8udHJhdmlzLnltbCBiLy50cmF2aXMueW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzN2I1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi8udHJhdmlzLnltbApAQCAtMCwwICsxLDE3MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBUcmF2aXMgQ0kgLSBodHRwczovL3RyYXZpcy1jaS5vcmcvCisKKyMKKyMgRG9ja2VyIEludGVncmF0aW9uCisjIHNlZTogYnVpbGQvZG9ja2VyL1JFQURNRS5tZAorIyAKKworc3VkbzogcmVxdWlyZWQKK2Rpc3Q6IHRydXN0eQorbGFuZ3VhZ2U6IGNwcAorCitzZXJ2aWNlczoKKyAgLSBkb2NrZXIKKworaW5zdGFsbDoKKyAgLSBpZiBbWyBgdW5hbWVgID09ICJMaW51eCIgXV07IHRoZW4gYnVpbGQvZG9ja2VyL3JlZnJlc2guc2g7IGZpCisKK3N0YWdlczoKKyAgLSBkb2NrZXIgICAgIyBkb2NrZXIgaW1hZ2VzCisgIC0gdGhyaWZ0ICAgICMgdGhyaWZ0IGJ1aWxkIGpvYnMKKworZW52OgorICBnbG9iYWw6CisgICAgLSBTQ1JJUFQ9ImNtYWtlLnNoIgorICAgIC0gQlVJTERfQVJHPSIiCisgICAgLSBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIC1lIFRIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1k9NCIKKyAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCisgICAgLSBCVUlMRF9MSUJTPSJDUFAgQ19HTElCIEhBU0tFTEwgSkFWQSBQWVRIT04gVEVTVElORyBUVVRPUklBTFMiICAjIG9ubHkgbWVhbmluZ2Z1bCBmb3IgQ01ha2UgYnVpbGRzCisgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9dGVzdAorICAgICMgRE9DS0VSX1JFUE8gKHRoaXMgd29ya3MgZm9yIGFsbCBidWlsZHMgYXMgYSBzb3VyY2UgZm9yIGRvY2tlciBpbWFnZXMgLSB5b3UgY2FuIG92ZXJyaWRlIGZvciBmb3JrIGJ1aWxkcyBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncykKKyAgICAtIERPQ0tFUl9SRVBPPSJ0aHJpZnQvdGhyaWZ0LWJ1aWxkIgorICAgICMgRE9DS0VSX1VTRVIgKHByb3ZpZGUgaW4geW91ciBUcmF2aXMgc2V0dGluZ3MgaWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHVwZGF0ZSBkb2NrZXIgaW1hZ2VzIG9uY2UsIGluc3RlYWQgb2Ygb24gZXZlcnkgam9iKQorICAgICMgRE9DS0VSX1BBU1MgKHNhbWUpCisKK2pvYnM6CisgIGluY2x1ZGU6CisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09IHN0YWdlOiBkb2NrZXIgPT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC0gc3RhZ2U6IGRvY2tlcgorICAgICAgc2NyaXB0OiB0cnVlCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEb2NrZXIgQnVpbGQgdWJ1bnR1LXhlbmlhbCAxNi4wNCBMVFMiCisgICAgICAgIC0gRElTVFJPPXVidW50dS14ZW5pYWwKKyAgICAgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9ZG9ja2VyCisgICAgLSBzY3JpcHQ6IHRydWUKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkRvY2tlciBCdWlsZCB1YnVudHUtYmlvbmljIDE4LjA0IExUUyIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LWJpb25pYworICAgICAgICAtIFRSQVZJU19CVUlMRF9TVEFHRT1kb2NrZXIKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PSBzdGFnZTogdGhyaWZ0ID09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjcm9zcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIGFwYWNoZS90aHJpZnQgb2ZmaWNpYWwgUFIgYnVpbGRzIGNhbiBleGNlZWQgNTAgbWludXRlcyBwZXIgam9iIHNvIGNvbWJpbmUgYWxsIGNyb3NzIHRlc3RzCisgICAgLSBzdGFnZTogdGhyaWZ0CisgICAgICBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGlmOiByZXBvID0gYXBhY2hlL3RocmlmdAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorCisgICAgIyBmb3JrIGJhc2VkIFBSIGJ1aWxkcyBjYW5ub3QgZXhjZWVkIDUwIG1pbnV0ZXMgcGVyIGpvYgorICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyAhPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQmluYXJ5IFByb3RvY29sKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhiaW5hcnkpJyIKKworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyAhPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoSGVhZGVyLCBKU09OIFByb3RvY29scykiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLScoaGVhZGVyfGpzb24pJyIKKworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyAhPSBhcGFjaGUvdGhyaWZ0CisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQ29tcGFjdCBhbmQgTXVsdGlwbGV4ZWQgUHJvdG9jb2xzKSIKKyAgICAgICAgLSBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCisgICAgICAgIC0gQlVJTERfQVJHPSItJyhjb21wYWN0fG11bHRpcGxleGVkKSciCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IHNjYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgUUEgam9icyBmb3IgY29kZSBhbmFseXRpY3MgYW5kIG1ldHJpY3MKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iU3RhdGljIENvZGUgQW5hbHlzaXMiCisgICAgICAgIC0gU0NSSVBUPSJzY2Euc2giCisKKyAgICAjIEMgYW5kIEMrKyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgIyBBIGJpbmFyeSBjcmFzaGVzIGlmIHVuZGVmaW5lZCBiZWhhdmlvciBvY2N1cnMgYW5kIHByb2R1Y2VzIGEgc3RhY2sgdHJhY2UuCisgICAgIyBweXRob24gaXMgZGlzYWJsZWQsIHNlZTogVEhSSUZULTQzNjAKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iVUJTYW4iCisgICAgICAgIC0gU0NSSVBUPSJ1YnNhbi5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0td2l0aG91dC1weXRob24gLS13aXRob3V0LXB5MyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogYXV0b3Rvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUT0RPOiBSZW1vdmUgdGhlbSBvbmNlIG1pZ3JhdGVkIHRvIENNYWtlCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkF1dG90b29scyAoVWJ1bnR1IEJpb25pYykiCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgWGVuaWFsKSIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFNDUklQVD0iYXV0b3Rvb2xzLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjbWFrZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ01ha2UiCisKKyAgICAjIEMrKyBzcGVjaWZpYyBvcHRpb25zOiBjb21waWxlciBwbHVnLWluLCB0aHJlYWRpbmcgbW9kZWwKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQysrIChTdGQgVGhyZWFkKSBhbmQgUGx1Z2luIgorICAgICAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgICAgIC0gQlVJTERfTElCUz0iQ1BQIFRFU1RJTkcgVFVUT1JJQUxTIgorICAgICAgICAtIEJVSUxEX0FSRz0iLURXSVRIX1BMVUdJTj1PTiAtRFdJVEhfU1REVEhSRUFEUz1PTiAtRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfQ19HTElCPU9GRiAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX0hBU0tFTEw9T0ZGIgorICAgICAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Y2xhbmcgLWUgQ1hYPWNsYW5nKysiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGRpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJtYWtlIGRpc3QiCisgICAgICAgIC0gU0NSSVBUPSJtYWtlLWRpc3Quc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRGViaWFuIFBhY2thZ2VzIgorICAgICAgICAtIFNDUklQVD0iZHBrZy5zaCIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogY292ZXJpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBXZSBidWlsZCB0aGUgY292ZXJpdHkgc2NhbiBidWlsZCBvbmNlIG1vbnRobHkgdXNpbmcgYSB0cmF2aXMgY3JvbiBqb2IKKyAgICAtIGlmOiAoZW52KENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMKSBJUyBwcmVzZW50KSBBTkQgKGJyYW5jaCBJTiAobWFzdGVyKSkgQU5EICh0eXBlIElOIChjcm9uKSkKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ292ZXJpdHkgU2NhbiIKKyAgICAgICAgLSBTQ1JJUFQ9ImNvdnNjYW4uc2giCisgICAgIAorCisgICMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBvc3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBkaXNhYmxlZCBkdWUgdG8gdGhlIHRpbWUgZGVsYXlzIGl0IGltcG9zZXMgb24gYnVpbGQgam9icworICAjIC0gb3M6IG9zeAorICAjICAgb3N4X2ltYWdlOiB4Y29kZTkKKyAgIyAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKZGlmZiAtLWdpdCBhL0FwYWNoZVRocmlmdC5udXNwZWMgYi9BcGFjaGVUaHJpZnQubnVzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWQyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9BcGFjaGVUaHJpZnQubnVzcGVjCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGEgbnVnZXQgcGFja2FnZToKKworICAxLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXGNzaGFycFxzcmMgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24KKyAgICAgb2YgdGhlICJUaHJpZnQiIGFuZCAiVGhyaWZ0LjQ1IiBwcm9qZWN0cy4KKyAgMi4gT3BlbiBUaHJpZnQuc2xuIGluIGxpYlxuZXRjb3JlIGFuZCBidWlsZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mCisgICAgIHRoZSAiVGhyaWZ0IiBwcm9qZWN0LgorICAzLiBudWdldCBzZXRBcGlLZXkgPHlvdXItYXBpLWtleT4KKyAgMy4gbnVnZXQgcGFjayBBcGFjaGVUaHJpZnQubnVzcGVjIC1TeW1ib2xzIC1TeW1ib2xQYWNrYWdlRm9ybWF0IHNudXBrZworICA0LiBudWdldCBwdXNoIEFwYWNoZVRocmlmdC4xLjAuMC5udXBrZyAtU291cmNlIGh0dHBzOi8vYXBpLm51Z2V0Lm9yZy92My9pbmRleC5qc29uCisgIC0tPgorCis8cGFja2FnZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9wYWNrYWdpbmcvMjAxMy8wNS9udXNwZWMueHNkIj4KKyAgPG1ldGFkYXRhPgorICAgIDxpZD5BcGFjaGVUaHJpZnQ8L2lkPgorICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICAgIDx0aXRsZT5BcGFjaGUgVGhyaWZ0IDEuMC4wPC90aXRsZT4KKyAgICA8YXV0aG9ycz5BcGFjaGUgVGhyaWZ0IERldmVsb3BlcnM8L2F1dGhvcnM+CisgICAgPG93bmVycz5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3duZXJzPgorICAgIDxsaWNlbnNlIHR5cGU9ImV4cHJlc3Npb24iPkFwYWNoZS0yLjA8L2xpY2Vuc2U+CisgICAgPHByb2plY3RVcmw+aHR0cDovL3RocmlmdC5hcGFjaGUub3JnLzwvcHJvamVjdFVybD4KKyAgICA8cmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPnRydWU8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KKyAgICA8c3VtbWFyeT5BcGFjaGUgVGhyaWZ0IC5ORVQgTGlicmFyeTwvc3VtbWFyeT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBDb250YWlucyBydW50aW1lIGxpYnJhcmllcyBmcm9tIGxpYi9jc2hhcnAgZm9yIG5ldDM1IGFuZCBuZXQ0NSBmcmFtZXdvcmtzLCAKKyAgICAgIGFuZCBmcm9tIGxpYi9uZXRjb3JlIGZvciBuZXRzdGFuZGFyZDIuMCBmcmFtZXdvcmsgZGV2ZWxvcG1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cmVwb3NpdG9yeSB0eXBlPSJHaXRIdWIiIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiIGJyYW5jaD0icmVsZWFzZS8xLjAuMCIgLz4KKyAgICA8dGFncz5BcGFjaGUgVGhyaWZ0IFJQQzwvdGFncz4KKyAgPC9tZXRhZGF0YT4KKyAgPGZpbGVzPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0LioiIHRhcmdldD0ibGliXG5ldDM1IiAvPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0NDUuKiIgdGFyZ2V0PSJsaWJcbmV0NDUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcbmV0Y29yZVxUaHJpZnRcYmluXFJlbGVhc2VcbmV0c3RhbmRhcmQyLjBcKi4qIiB0YXJnZXQ9ImxpYlxuZXRzdGFuZGFyZDIuMCIgLz4KKyAgPC9maWxlcz4KKzwvcGFja2FnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DSEFOR0VTIGIvQ0hBTkdFUwppbmRleCAxNjE1NjQ5Li4yNDRmMGRhIDEwMDY0NAotLS0gYS9DSEFOR0VTCisrKyBiL0NIQU5HRVMKQEAgLTEsNDgxICsxLDI3NTIgQEAKLVRocmlmdCBDaGFuZ2Vsb2cKK0FwYWNoZSBUaHJpZnQgQ2hhbmdlbG9nCiAKLVZlcnNpb24gMC45LjAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgTmV3IExhbmd1YWdlcworICAgICogQ29tbW9uIExJU1AgKGNsKQorICAgICogU3dpZnQKKyAgICAqIFR5cGVzY3JpcHQgKG5vZGV0cykKIAotVEhSSUZULTE2NCAgICBXZWJzaXRlICAgICAgICAgICAgICBCdWlsZCB3ZWIgdHV0b3JpYWwgb24gSW5jdWJhdG9yIHdlYiAgc2l0ZQotVEhSSUZULTMwNCAgICBQeXRob24gICAgICAgICAgICAgICBCdWlsZGluZyB0aGUgUHl0aG9uIGxpYnJhcnkgcmVxdWlyZXMgZGV2ZWxvcG1lbnQgIGhlYWRlcnMKLVRIUklGVC0zMTcgICAgSmF2YSAgICAgICAgICAgICAgICAgSXNzdWVzIHdpdGggSmF2YSBzdHJ1Y3QgIHZhbGlkYXRpb24KLVRIUklGVC0zMzAgICAgQ29tcGlsZXIgKEdlbmVyYWwpICAgQWRkaXRpb25hbCBtZXRob2QgdG8gY2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyAgYnJva2VuCi1USFJJRlQtMzM2ICAgIENzaGFycCAgICAgICAgICAgICAgIENvbXBhY3QgUHJvdG9jb2wgaW4gIEMjCi1USFJJRlQtMzY5ICAgIFJ1YnkgICAgICAgICAgICAgICAgIFNldHMgYW5kIG1hcHMgYnJlYWsgIGVxdWFsaXR5Ci1USFJJRlQtNDgxICAgIFJ1YnkgICAgICAgICAgICAgICAgIEluZGVudGF0aW9uIG9mIHJ1YnkgY2xhc3NlcyBpcyBvZmYgYnkgYSAgZmV3Ci1USFJJRlQtNDkxICAgIEMrKyAgICAgICAgICAgICAgICAgIFJpcHBpbmcgcmF3IHB0aHJlYWRzIG91dCBvZiBURmlsZVRyYW5zcG9ydCBhbmQgYXNzb2NpYXRlZCB0ZXN0ICBpc3N1ZXMKLVRIUklGVC01NDEgICAgQ29jb2EgICAgICAgICAgICAgICAgQ29jb2EgY29kZSBnZW5lcmF0b3IgZG9lc24ndCBwdXQga2V5d29yZHMgYmVmb3JlIGFsbCAgYXJndW1lbnRzLgotVEhSSUZULTU1NiAgICBSdWJ5ICAgICAgICAgICAgICAgICBub3QgY29ycmVjdGx5IHJlZmVycmVkIHRvIHRvcC1sZXZlbCBtb2R1bGVzIHdoZW4gYSBzdWJtb2R1bGUgbWFza3MgdGhlIHRvcC1sZXZlbCAgbmFtZQotVEhSSUZULTY4MSAgICBDb21waWxlciAoR2VuZXJhbCkgICBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIEphdmFEb2Mgc3R5bGUgY29tbWVudHMgdmVyeSAgd2VsbAotVEhSSUZULTk1NiAgICBQeXRob24gICAgICAgICAgICAgICBQeXRob24gbW9kdWxlJ3MgdmVyc2lvbiBtZXRhLWRhdGEgc2hvdWxkIGJlICB1cGRhdGVkCi1USFJJRlQtOTczICAgIENvY29hICAgICAgICAgICAgICAgIENvY29hIGxpYnJhcnkgd29uJ3QgY29tcGlsZSB1c2luZyAgY2xhbmcKLVRIUklGVC05ODIgICAgSmF2YU1FICAgICAgICAgICAgICAgYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgIGxpYnJhcnkKLVRIUklGVC0xMDIzICAgUnVieSAgICAgICAgICAgICAgICAgVGhyaWZ0IGVuY29kaW5nIChVVEYtOCkgaXNzdWUgd2l0aCBSdWJ5IDEuOS4yCi1USFJJRlQtMTA2MSAgIEphdmEsIFBIUCAgICAgICAgICAgIFJlYWQgYW4gaW52YWxpZCBmcmFtZSBzaXplIG9mIDAuIEFyZSB5b3UgdXNpbmcgVEZyYW1lZFRyYW5zcG9ydCBvbiB0aGUgY2xpZW50IHNpZGU/Ci1USFJJRlQtMTA3MiAgIENvY29hICAgICAgICAgICAgICAgIE1pc3NpbmcgLSAoaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yIGluIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKLVRIUklGVC0xMDgyICAgUGVybCAgICAgICAgICAgICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgc29tZXRpbWVzIGNhbGxzIGNsb3NlKCkgb24gYW4gdW5kZWZpbmVkIHZhbHVlCi1USFJJRlQtMTA5MCAgIFdlYnNpdGUgICAgICAgICAgICAgIERvY3VtZW50IHRoZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSBjYWxsZWQgIkNvbnN0YW50cy5qYXZhIgotVEhSSUZULTExMSAgICBQeXRob24gICAgICAgICAgICAgICBUQmFzZSBjbGFzcyBmb3IgZHluYW1pYyAoZGUpc2VyaWFsaXphdGlvbiwgYW5kIF9fc2xvdHNfXyBvcHRpb24gZm9yIG1lbW9yeSAgc2F2aW5ncwotVEhSSUZULTExMjggICBCdWlsZCAgICAgICAgICAgICAgICBPUyBYIHRocmlmdC5oIGluY29tcGF0aWJpbGl0eSB3aXRoIFRocmlmdC5oCi1USFJJRlQtMTE1OSAgIENTaGFycCAgICAgICAgICAgICAgIFRIdHRwQ2xpZW50LT5GbHVzaCgpIGlzc3VlIChjb25uZWN0aW9uIHRocnUgcHJveHkpCi1USFJJRlQtMTIwNCAgIFJ1YnkgICAgICAgICAgICAgICAgIFJ1YnkgYXV0b2dlbmVyYXRlZCBmaWxlcyBzaG91bGQgcmVxdWlyZSAndGhyaWZ0JyBnZW0KLVRIUklGVC0xMjI0ICAgUnVieSAgICAgICAgICAgICAgICAgQ2Fubm90IGluc2VydCBVVEYtOCB0ZXh0Ci1USFJJRlQtMTIzNSAgIEMrKyAgICAgICAgICAgICAgICAgIEhvdyBjb3VsZCBJIHVzZSBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnkgd2l0aFROb25CbG9ja2luZ1NlcnZlcgotVEhSSUZULTEyNjcgICBKYXZhU2NyaXB0ICAgICAgICAgICBOb2RlLmpzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuCi1USFJJRlQtMTI3NyAgIEphdmFTY3JpcHQgICAgICAgICAgIE5vZGUuanMgc2VyaWFsaXplcyBmYWxzZSBib29sZWFucyBhcyBudWxsCi1USFJJRlQtMTMyNiAgIEMrKyAgICAgICAgICAgICAgICAgIG9uIHNvbWUgcGxhdGZvcm1zLCAjaW5jbHVkZSA8c3RkaW50Lmg+IGlzIG5lY2Vzc2FyeSB0byBiZSBpbmNsdWRlZCBpbiBUaHJpZnQuaAotVEhSSUZULTEzMjcgICBSdWJ5ICAgICAgICAgICAgICAgICBGaXggU3BlYyBTdWl0ZSB1bmRlciBSdWJ5LTEuOC43ICh3b3JrcyBmb3IgTVJJIFJ1YnktMS45LjIpCi1USFJJRlQtMTMzOCAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIERvIG5vdCB1c2UgYW4gdW5wYXRjaGVkIGF1dG9jb25mIDIuNjUgdG8gZ2VuZXJhdGUgcmVsZWFzZSB0YXJiYWxsCi1USFJJRlQtMTM0MCAgIENvY29hICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IG9mIEFSQyB0byBPYmplY3RpdmUtQwotVEhSSUZULTEzNDMgICBFcmxhbmcgICAgICAgICAgICAgICBub19hdXRvX2ltcG9ydCBtaW4vMiB0byBhdm9pZCBjb21waWxlIHdhcm5pbmcKLVRIUklGVC0xMzQ0ICAgRXJsYW5nICAgICAgICAgICAgICAgVXNpbmcgdGhlIGh0dHBjIG1vZHVsZSBkaXJlY3RseSByYXRoZXIgdGhhbiB0aGUgZGVwcmVjYXRlZCBodHRwIGxheWVyCi1USFJJRlQtMTM2OCAgIEphdmEgICAgICAgICAgICAgICAgIFROb25ibG9ja2luZ1NlcnZlciB1c2FnZQotVEhSSUZULTEzOTQgICBDKysgICAgICAgICAgICAgICAgICBUcmVhdG1lbnQgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gQysrIGFuZCBKYXZhCi1USFJJRlQtMTQyMSAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIERlYmlhbiBQYWNrYWdlcyBjYW4gbm90IGJlIGJ1aWx0Ci1USFJJRlQtMTQyNyAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBsaWJyYXJ5IHVzZXMgbm9uLW11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB3aXRoIG1ic3RyaW5nIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCi1USFJJRlQtMTQyOSAgIEphdmEgICAgICAgICAgICAgICAgIFRoZSBub25ibG9ja2luZyBzZXJ2ZXJzIGlzIHN1cHBvc2VkIHRvIHVzZSBUcmFuc3BvcnRGYWN0b3J5IHRvIHJlYWQgdGhlICBkYXRhCi1USFJJRlQtMTQzMyAgIEMrKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJTb2NrZXQgZml4IGZvciBNU1ZDCi1USFJJRlQtMTQzOCAgIEMrKyAgICAgICAgICAgICAgICAgIGxpYi9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmggc2hvdWxkIHJlYWQgdmVyc2lvbiBmcm9tIGNvbmZpZ3VyZS5hYyByYXRoZXIgdGhhbiBhICAjZGVmaW5lCi1USFJJRlQtMTQ0MSAgIERlbHBoaSAgICAgICAgICAgICAgIEdlbmVyYXRlIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVycyBmb3IgZXhjZXB0aW9uIGNsYXNzIGZvciBtZXNzYWdlIHByb3BlcnR5IGF1dG8gdXBkYXRlCi1USFJJRlQtMTQ0MyAgIEMrKyAgICAgICAgICAgICAgICAgIGRlZmluZSBhIFRQcm9jZXNzb3IgaGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwcm9jZXNzKCkKLVRIUklGVC0xNDQ0ICAgQysrICAgICAgICAgICAgICAgICAgRnVuY3Rpb25SdW5uZXIgLSBhZGQgc3ludGFjdGljIHN1Z2FyIHRvIGNyZWF0ZSBzaGFyZWRfcHRycwotVEhSSUZULTE0NDYgICBEZWxwaGkgICAgICAgICAgICAgICBDb21waWxlIGVycm9yIHdpdGggRGVscGhpIDIwMDkgaW4gY29uc3RhbnQgIGluaXRpYWxpemVyCi1USFJJRlQtMTQ0NyAgIEphdmEgICAgICAgICAgICAgICAgIE51bGxwb2ludGVyRXhjZXB0aW9uIGluIFByb2Nlc3NGdW5jdGlvbi5jbGFzcyA6aW4gIm9uZXdheSIgIG1ldGhvZAotVEhSSUZULTE0NDkgICBSdWJ5ICAgICAgICAgICAgICAgICBSdWJ5IGNsaWVudCBkb2VzIG5vdCB3b3JrIG9uIHNvbGFyaXMgICg/KQotVEhSSUZULTE0NTAgICBCdWlsZCAgICAgICAgICAgICAgICBQcm9jZXNzICBQcm9ibGVtcyBidWlsZGluZyB0aHJpZnQgMC44LjAgZm9yIFB5dGhvbiBhbmQgIFJ1YnkKLVRIUklGVC0xNDUxICAgQysrICAgICAgICAgICAgICAgICAgRnJhbWVkVHJhbnNwb3J0OiBQcmV2ZW50IGluZmluaXRlIGxvb3Agd2hlbiAgd3JpdGluZwotVEhSSUZULTE0NTIgICBDKysgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBhIHN3YXAoKSBtZXRob2QgZm9yIGFsbCBnZW5lcmF0ZWQgIHN0cnVjdHMKLVRIUklGVC0xNDUzICAgQysrICAgICAgICAgICAgICAgICAgRG9uJ3QgY2hhbmdlIHR5cGVzIG9mIGFyZ3VtZW50cyB3aGVuIHNlcmlhbGl6aW5nIHdpdGggdGhyaWZ0IHBocCAgZXh0ZW5zaW9uCi1USFJJRlQtMTQ1NiAgIEMjICAgICAgICAgICAgICAgICAgIFN5c3RlbS5OZXQuSHR0cFdlYlJlcXVlc3QnIGRvZXMgbm90IGNvbnRhaW4gYSBkZWZpbml0aW9uIGZvciAgJ1Byb3h5JwotVEhSSUZULTE0NjAgICBQeXRob24gICAgICAgICAgICAgICB3aHkgbm90IGFkZCB1bmljb2RlIHN0cmluZ3Mgc3VwcG9ydCB0byBweXRob24gIGRpcmVjdGx5PwotVEhSSUZULTE0NjEgICBDKysgICAgICAgICAgICAgICAgICBSZWNlbnQgVE5vbmJsb2NraW5nU2VydmVyIGNoYW5nZXMgYnJva2UgLS1lbmFibGUtYm9vc3R0aHJlYWRzPXllcywgIFdpbmRvd3MKLVRIUklGVC0xNDYzICAgQ29tcGlsZXIgICAgICAgICAgICAgRGVjb3VwbGUgVGhyaWZ0IElETCBmcm9tICBnZW5lcmF0b3JzCi1USFJJRlQtMTQ2NCAgIEphdmEgICAgICAgICAgICAgICAgIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXIgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGNoYW5nZWQgcHVibGljIHRvICBwcml2YXRlCi1USFJJRlQtMTQ2NSAgIEphdmEgICAgICAgICAgICAgICAgIFZpc2liaWxpdHkgb2YgbWV0aG9kcyBpbiBnZW5lcmF0ZWQgamF2YSAgY29kZQotVEhSSUZULTE0NjYgICBDIGdsaWIgICAgICAgICAgICAgICBQcm9wZXIgRG9jdW1lbnRhdGlvbiBmb3IgVGhyaWZ0IEMgIEdsaWIKLVRIUklGVC0xNDY3ICAgRGVscGhpICAgICAgICAgICAgICAgUG9zc2libGUgQVYgd2l0aCBlbXB0eSBzdHJpbmdzIHdoZW4gdXNpbmcgSlNPTiAgcHJvdG9jb2wKLVRIUklGVC0xNDY4ICAgSmF2YSAgICAgICAgICAgICAgICAgTWVtb3J5IGxlYWsgaW4gIFRTYXNsU2VydmVyVHJhbnNwb3J0Ci1USFJJRlQtMTQ2OSAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgaXNzZXQgc3BhY2UgIG9wdGltaXphdGlvbgotVEhSSUZULTE0NzMgICBEZWxwaGkgICAgICAgICAgICAgICBKU09OIGNvbnRleHQgc3RhY2sgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBleGNlcHRpb24gdGhyb3duIGR1cmluZyAgcmVhZC93cml0ZQotVEhSSUZULTE0NzUgICBFcmxhbmcgICAgICAgICAgICAgICBJbmNvbXBsZXRlIHJlY29yZHMgZ2VuZXJhdGlvbiBmb3IgIEVybGFuZwotVEhSSUZULTE0NzkgICBQSFAgICAgICAgICAgICAgICAgICBDb21waWxlZCBQSFAgcHJvY2VzcyBmdW5jdGlvbnMgbWlzc2luZyAgd3JpdGVNZXNzYWdlRW5kKCkKLVRIUklGVC0xNDgwICAgUHl0aG9uICAgICAgICAgICAgICAgcmVtb3ZlIHRhYnMsIGFkanVzdCB3aGl0ZXNwYWNlIGFuZCBhZGRyZXNzIFBFUDggIHdhcm5pbmdzCi1USFJJRlQtMTQ4MyAgIEphdmEgICAgICAgICAgICAgICAgIGphdmEgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGUgdHlwZSBwYXJhbWV0ZXJzIGZvciBzZXJ2aWNlcyBpbiBleHRlbmRlZCAgY2xhdXNlcwotVEhSSUZULTE0ODQgICBQSFAgICAgICAgICAgICAgICAgICBJbnRyb2R1Y2UgcGhwdW5pdCB0ZXN0ICBzdWl0ZQotVEhSSUZULTE0ODUgICBEZWxwaGkgICAgICAgICAgICAgICBQZXJmb3JtYW5jZTogcGFzcyBsYXJnZSBhbmQvb3IgcmVmY291bnRlZCBhcmd1bWVudHMgYXMgICJjb25zdCIKLVRIUklGVC0xNDg2ICAgVGVzdCBTdWl0ZSAgICAgICAgICAgSmF2YXNjcmlwdCBtYW51YWwgdGVzdHNlcnZlciBub3QgcmV0dXJuaW5nIGNvbnRlbnQgIHR5cGVzCi1USFJJRlQtMTQ4OCAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIGludmFsaWQgY29udmVyc2lvbiAncHRocmVhZF90IHtha2EgX29wYXF1ZV9wdGhyZWFkX3QqfScgdG8ge2FrYSBsb25nIGxvbmcgdW5zaWduZWQgIGludH0nCi1USFJJRlQtMTQ5MCAgIEMrKyAgICAgICAgICAgICAgICAgIFdpbmRvd3Mtc3BlY2lmaWMgaGVhZGVyIGZpbGVzIC0gZml4ZXMgJiAgdHdlYWtzCi1USFJJRlQtMTQ5MSAgIEMrKyAgICAgICAgICAgICAgICAgIFVuaW5pdGlhbGl6ZSBwcm9jZXNzb3JGYWN0b3J5XyBtZW1iZXIgaW4gIFRTZXJ2ZXIuaAotVEhSSUZULTE0OTIgICBDIGdsaWIgICAgICAgICAgICAgICBlbmFibGluZyBjX2dsaWIgcmVuZGVyIHRocmlmdCB1bnVzYWJsZSAoZXZlbiBmb3IgQysrICBjb2RlKQotVEhSSUZULTE0OTUgICBUZXN0IFN1aXRlICAgICAgICAgICBQSFAgVGVzdENsaWVudCBmYXRhbHMgb24gbWlzc2luZyAgY2xhc3MKLVRIUklGVC0xNDk2ICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIGNvbXBpbGVyIG5vdCBuYW1lc3BhY2luZyAgZW51bXMKLVRIUklGVC0xNDk4ICAgSmF2YSAgICAgICAgICAgICAgICAgQWxsb3cgVFRocmVhZGVkUG9vbFNlcnZlci5BcmdzIHRvIHBhc3MgYSAgRXhlY3V0b3JTZXJ2aWNlCi1USFJJRlQtMTUwMCAgIEQgICAgICAgICAgICAgICAgICAgIEQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgIHN1cHBvcnQKLVRIUklGVC0xNTAxICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIG9sZCBuYW1lc3BhY2VzIG5vdCBnZW5lcmF0ZWQgZm9yICBlbnVtcwotVEhSSUZULTE1MDIgICBDKysgICAgICAgICAgICAgICAgICBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpOiBEbyBub3QgcHJpbnQgb3V0IGVycm9yIG1lc3NhZ2UgaWYgc2VydmVyIHdhcyAgc3RvcHBlZC4KLVRIUklGVC0xNTA0ICAgQ29jb2EgICAgICAgICAgICAgICAgQ29jb2EgR2VuZXJhdG9yIHNob3VsZCB1c2UgbG9jYWwgZmlsZSBpbXBvcnRzIGZvciBiYXNlIFRocmlmdCAgaGVhZGVycwotVEhSSUZULTE1MDggICBDKysgICAgICAgICAgICAgICAgICBUU2VydmVyU29ja2V0IGRvZXMgbm90IGFsbG93IGZvciB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIHRvIGJpbmQgIHRvCi1USFJJRlQtMTUxMCAgIFJ1YnkgICAgICAgICAgICAgICAgIFRoZXJlIHNob3VsZCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnNvblByb3RvY29sIGZvciAgcnVieQotVEhSSUZULTE1MTEgICBKYXZhICAgICAgICAgICAgICAgICBTZXJ2ZXIgd2l0aCBvbmV3YXkgc3VwcG9ydCAoIEpBVkEgICkKLVRIUklGVC0xNTEyICAgQysrICAgICAgICAgICAgICAgICAgVGhyaWZ0IHNvY2tldCBzdXBwb3J0IGZvciBXaW5kb3dzICBYUAotVEhSSUZULTE1MTUgICBQeXRob24gICAgICAgICAgICAgICBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCAgZGVmaW5lZAotVEhSSUZULTE1MTggICBDKysgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgQysrIGNvZGUgc2VuZHMgdGhlIGZpcnN0IG9wdGlvbmFsIGZpZWxkIGluIHRoZSB3cml0ZSgpIGZ1bmN0aW9uIGZvciBhICBzdHJ1Y3QuCi1USFJJRlQtMTUxOSAgIFJ1YnkgICAgICAgICAgICAgICAgIFRoaXJmdCBCdWlsZCBGYWlsdXJlIHJlZmVyZW5jaW5nIHJiX2ludGVybjIgIHN5bWJvbAotVEhSSUZULTE1MjAgICBFcmxhbmcgICAgICAgICAgICAgICBFbWJlZCB2ZXJzaW9uIG51bWJlciBpbiBlcmxhbmcgLmFwcCAgZmlsZQotVEhSSUZULTE1MjEgICBQSFAgICAgICAgICAgICAgICAgICBUd28gcGF0Y2hlcyBmb3IgbW9yZSAgUGVyZm9ybWFuY2UKLVRIUklGVC0xNTIzICAgSmF2YSAgICAgICAgICAgICAgICAgY2xpZW50VGltZW91dCBub3Qgd29ya2VkIGFzIGV4cGVjdGVkIGluIFRTZXJ2ZXJTb2NrZXQgY3JlYXRlZCBieSAgVFNTTFRyYW5zcG9ydEZhY3RvcnkKLVRIUklGVC0xNTI0ICAgQysrICAgICAgICAgICAgICAgICAgVE5vbkJsb2NraW5nU2VydmVyIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIFN0dWRpbyAgMjAxMAotVEhSSUZULTE1MjYgICBKYXZhICAgICAgICAgICAgICAgICBVbmlvbiBUdXBsZVNjaGVtZUZhY3RvcnkgcmV0dXJucyAgU3RhbmRhcmRTY2hlbWVzCi1USFJJRlQtMTUyNyAgIEphdmEgICAgICAgICAgICAgICAgIEdlbiB0dXBsZVJlYWRTdHJ1Y3QgaW4gdW5pb25zIHJldHVybiBudWxsIHdoZW4gdGhlIHNldGZpZWxkIGlzICB1bnJlY29nbml6ZWQKLVRIUklGVC0xNTI5ICAgSmF2YSAgICAgICAgICAgICAgICAgVHVwbGVQcm90b2NvbCB1bmludGVudGlvbmFsbHkgaW5jbHVkZXMgZXh0cmEgYnl0ZSBpbiBiaXQgdmVjdG9ycyB3aXRoIHB0aW9uYWwgZmllbGRzIGlzICA4Ci1USFJJRlQtMTUzMiAgIEVybGFuZyAgICAgICAgICAgICAgIFRoZSB0eXBlIHNwZWNpZmljYXRpb25zIGluIHRoZSBnZW4gRXJsYW5nIGNvZGUgc2hvdWxkIGluY2x1ZGUgInVuZGVmaW5lZCIgZm9yIGRlZmF1bHQgIHZhbAotVEhSSUZULTE1MzQgICBEZWxwaGkgICAgICAgICAgICAgICBSZXF1aXJlZCBmaWVsZHMgaW4gdGhlIERlbHBoaSBjb2RlICBnZW5lcmF0b3IuCi1USFJJRlQtMTUzNSAgIEphdmEgICAgICAgICAgICAgICAgIFdoeSB0aHJpZnQgZG9uJ3QgdXNlIHdyYXBwZWQgY2xhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcyAgPwotVEhSSUZULTE1MzcgICBEZWxwaGkgICAgICAgICAgICAgICBURnJhbWVkVHJhbnNwb3J0ICBpc3N1ZXMKLVRIUklGVC0xNTM5ICAgUHl0aG9uICAgICAgICAgICAgICAgQnVpbGQgYW5kIGRpc3RyaWJ1dGUgdGhlIGZiMzAzIHB5dGhvbiBsaWJyYXJpZXMgYWxvbmcgd2l0aCAgdGhyaWZ0Ci1USFJJRlQtMTU1MyAgIE5vZGUuanMgICAgICAgICAgICAgIHRocmlmdCBub2RlanMgc2VydmljZSBzaWRlIGNhbid0IHJlYWQgbWFwIHN0cnVjdHVyZSwga2V5IGFzIGVudW0sIHZhbHVlIGFzICBPYmplY3QKLVRIUklGVC0xNTU0ICAgRGVscGhpICAgICAgICAgICAgICAgSW5oZXJpdGVkIHNlcnZpY2UgbWV0aG9kcyBhcmUgbm90IHJlc29sdmVkIGluIGRlcml2ZWQgc2VydmljZSAgaW1wbGVtZW50YXRpb25zCi1USFJJRlQtMTU1NSAgIERlbHBoaSAgICAgICAgICAgICAgIERlbHBoaSB2ZXJzaW9uIG9mIHRoZSB0dXRvcmlhbCAgY29kZQotVEhSSUZULTE1NjcgICBDKysgICAgICAgICAgICAgICAgICBUaHJpZnQvY3BwOiBBbGxvdyBhbHRlcm5hdGUgY2xhc3NlcyB0byBiZSB1c2VkICBmb3IKLVRIUklGVC0xNTcxICAgUnVieSAgICAgICAgICAgICAgICAgVXBkYXRlIFJ1YnkgSFRUUCB0cmFuc3BvcnQgZm9yIHJlY2VudCBSdWJ5ICB2ZXJzaW9ucwotVEhSSUZULTE1NzUgICBDKysgICAgICAgICAgICAgICAgICBUeXBvIGluICBzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAotVEhSSUZULTE1NzggICBDIGdsaWIgICAgICAgICAgICAgICBDX0dMaWIgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgIGNvbXBpbGUKLVRIUklGVC0xNTgyICAgQyBnbGliICAgICAgICAgICAgICAgQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gIGNfZ2xpYgotVEhSSUZULTE1ODMgICBDIGdsaWIgICAgICAgICAgICAgICBjX2dsaWIgbGVha3MgIG1lbW9yeQotVEhSSUZULTE1OTEgICBSdWJ5ICAgICAgICAgICAgICAgICBFbmFibGUgVENQX05PREVMQVkgZm9yIHJ1YnkgIGdlbQotVEhSSUZULTE1OTMgICBFcmxhbmcgICAgICAgICAgICAgICBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIgdG8gdGhlIGhhbmRsZXIgIG1vZHVsZQotVEhSSUZULTE1OTYgICBEZWxwaGkgICAgICAgICAgICAgICBUZXN0IGNsaWVudHMgc2hvdWxkIGhhdmUgYSByZXR1cm4gY29kZXMgdGhhdCByZWZsZWN0IHdoZXRoZXIgdGhleSBzdWNjZWVkZWQgb3IgIG5vdAotVEhSSUZULTE1OTcgICBQSFAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sLnBocCBpcyBtaXNzaW5nIGZyb20gIE1ha2VmaWxlLmFtCi1USFJJRlQtMTYwMiAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCBDIEV4dGVuc2lvbiBpcyBub3QgQ29tcGF0aWJsZSB3aXRoIFBIUCAgNS40Ci1USFJJRlQtMTYwNCAgIFB5dGhvbiAgICAgICAgICAgICAgIFB5dGhvbiBleGNlcHRpb24gaGFuZGVsaW5nIGZvciBjaGFuZ2VzIGZyb20gUEVQICAzMTEwCi1USFJJRlQtMTYwNiAgIEMrKyAgICAgICAgICAgICAgICAgIFJhY2UgY29uZGl0aW9uIGluICBCb29zdFRocmVhZEZhY3RvcnkuY3BwCi1USFJJRlQtMTYwNyAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIEluY29ycmVjdCBmaWxlIG1vZGVzIGZvciBzZXZlcmFsIHNvdXJjZSAgZmlsZXMKLVRIUklGVC0xNjEwICAgQyMgICAgICAgICAgICAgICAgICAgSVdlYlByb3h5IG5vdCBhdmFpbGFibGUgb24gV1A3ICBwbGF0Zm9ybQotVEhSSUZULTE2MTEgICBEZWxwaGkgICAgICAgICAgICAgICBJbXByb3ZlZCBjb2RlIGdlbmVyYXRpb24gZm9yICB0eXBlZGVmcwotVEhSSUZULTE2MTIgICBDIyAgICAgICAgICAgICAgICAgICBCYXNlNjQgZW5jb2RpbmcgaXMgIGJyb2tlbgotVEhSSUZULTE2MTMgICBKYXZhICAgICAgICAgICAgICAgICBBZGQgY29kZSBiYWNrIGludG8gZW1wdHkgc291cmNlIGZpbGUgIFRvU3RyaW5nVGVzdC5qYXZhCi1USFJJRlQtMTYxNSAgIFBIUCAgICAgICAgICAgICAgICAgIFBIUCAgTmFtZXNwYWNlCi1USFJJRlQtMTYyMSAgIERlbHBoaSAgICAgICAgICAgICAgIE1lbW9yeSAgbGVha3MKLVRIUklGVC0xNjIyICAgQysrICAgICAgICAgICAgICAgICAgSW5jb3JyZWN0IHNpemUgcmV0dXJuZWQgb24gIHJlYWQKLVRIUklGVC0xNjI0ICAgSmF2YSAgICAgICAgICAgICAgICAgSXNzZXQgR2VuZXJhdGVkIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCAgcGxhdGZvcm1zCi1USFJJRlQtMTYyNyAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIGNvbXBpbGVyIGJ1aWx0IHVzaW5nIGNvbXBpbGVycy52Y3hwcm9qIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHNvbWUgdGVzdCAudGhyaWZ0ICBmaWxlcwotVEhSSUZULTE2MzEgICBDKysgICAgICAgICAgICAgICAgICBGaXggQysrIHNlcnZlciBjb25zdHJ1Y3RvciAgdHlwb3MKLVRIUklGVC0xNjMyICAgUnVieSAgICAgICAgICAgICAgICAgZGF0YSBjb3JydXB0aW9uIGluIHRocmlmdF9uYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgIE1lbW9yeUJ1ZmZlclRyYW5zcG9ydAotVEhSSUZULTE2NDQgICBSdWJ5ICAgICAgICAgICAgICAgICBVcGdyYWRlIFJTcGVjIHRvIDIuMTAueCBhbmQgcmVmYWN0b3Igc3BlY3MgYXMgIG5lZWRlZAotVEhSSUZULTE2NDUgICBSdWJ5ICAgICAgICAgICAgICAgICBSZXBsYWNlIE9iamVjdCN0ZWUgd2l0aCBtb3JlIGNvbnZlbnRpb25hbCBPYmplY3QjdGFwIGluICBzcGVjcwotVEhSSUZULTE2NTAgICBSdWJ5ICAgICAgICAgICAgICAgICBVcGRhdGUgY2xlYW4gaXRlbXMgYW5kIHN2bjppZ25vcmUgZW50cmllcyBmb3IgT1MgWCAgYXJ0aWZhY3RzCi1USFJJRlQtMTY1MiAgIEphdmEgICAgICAgICAgICAgICAgIFRTYXNsVHJhbnNwb3J0IGRvZXMgbm90IGxvZyB0aGUgZXJyb3Igd2hlbiBrZXJiZXJvcyBhdXRoICBmYWlscwotVEhSSUZULTE2NTMgICBKYXZhICAgICAgICAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBsZWFrcyBDTE9TRV9XQUlUICBzb2NrZXRzCi1USFJJRlQtMTY1NCAgIEMgZ2xpYiAgICAgICAgICAgICAgIGNfZ2xpYiB0aHJpZnRfc29ja2V0X3JlYWQoKSByZXR1cm5zIGNvcnJ1cHRlZCAgZGF0YQotVEhSSUZULTE2NTUgICBCdWlsZCBQcm9jZXNzICAgICAgICBDb25maWd1cmUgc3RpbGwgdHJ5aW5nIHRvIHVzZSB0aHJpZnRfZ2VuZXJhdG9ycyBpbiAgb3V0cHV0Ci1USFJJRlQtMTY1NiAgIEMrKyAgICAgICAgICAgICAgICAgIFNldCBwcm9wZXIgaGVhZGVycyBpbiBUSHR0cFNlcnZlci5jcHAgc28gIkNyb3NzLU9yaWdpbiBSZXNvdXJjZSBTaGFyaW5nIiB0byBmaXgganMgY2xpZW50IAotVEhSSUZULTE2NTggICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIHRocmlmdCBzZXJ2ZXIgaXMgbm90IHRocm93aW5nICBUQXBwbGljYXRpb25FeGNlcHRpb24KLVRIUklGVC0xNjYxICAgQnVpbGQgUHJvY2VzcyAgICAgICAgQWRkIC0td2l0aC1xdDQgY29uZmlndXJlICBvcHRpb24KLVRIUklGVC0xNjYyICAgQ29jb2EgICAgICAgICAgICAgICAgInJlbW92ZU9iamVjdDoiIHNob3VsZCBiZSAicmVtb3ZlT2JzZXJ2ZXI6IiBpbiBbLVRTb2NrZXRTZXJ2ZXIgIGRlYWxsb2NdPwotVEhSSUZULTE2NjMgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIFRocmlmdCBzZXJ2ZXIgaXMgbm90IHRocm93aW5nICBleGNlcHRpb25zCi1USFJJRlQtMTY2NCAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIFJlZmVyZW5jZSB0byBub24tZXhpc3RpbmcgdmFyaWFibGUgaW4gYnVpbGQgIHNjcmlwdAotVEhSSUZULTE2NjUgICBKYXZhICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2w6IGV4Y2VlZGVkIG1lc3NhZ2UgbGVuZ3RoIHJhaXNlcyBnZW5lcmljICBURXhjZXB0aW9uCi1USFJJRlQtMTY2OCAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIENvbXBpbGUgZXJyb3IgaW4gY29udHJpYi9mYjMwMywgdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oOiBObyBzdWNoIGZpbGUgb3IgIGRpcmVjdG9yeQotVEhSSUZULTE2NjkgICBQeXRob24gICAgICAgICAgICAgICBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCAgZGVmaW5lZAotVEhSSUZULTE2NzAgICBEZWxwaGkgICAgICAgICAgICAgICBJbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhIFRocmlmdCAgaW50ZXJmYWNlCi1USFJJRlQtMTY3MSAgIENvY29hICAgICAgICAgICAgICAgIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXMgbm90IHB1dCBrZXl3b3JkcyBpbnRvIGdlbmVyYXRlZCBtZXRob2QgIGNhbGxzCi1USFJJRlQtMTY3MiAgIEMjICAgICAgICAgICAgICAgICAgIE1vbm9Ub3VjaCAoYW5kIE1vbm8gZm9yIEFuZHJvaWQpICBjb21wYXRpYmlsaXR5Ci1USFJJRlQtMTY3MyAgIFJ1YnkgICAgICAgICAgICAgICAgIFJ1YnkgY29tcGlsZSBmbGFncyBmb3IgZXh0ZW5zaW9uIGZvciBtdWx0aSBhcmNoIGJ1aWxkcyAob3MgIHgpCi1USFJJRlQtMTY3NCAgIEQgICAgICAgICAgICAgICAgICAgIFVwZGF0ZSBUaHJpZnQgRCBsaWJyYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCAgMi4wNjAKLVRIUklGVC0xNjc1ICAgSmF2YSAgICAgICAgICAgICAgICAgRG8gd2UgaGF2ZSBhbnkgcGxhbiB0byBzdXBwb3J0ICBzY2FsYT8KLVRIUklGVC0xNjc2ICAgQysrICAgICAgICAgICAgICAgICAgQWxsb3cgc3BlY2lmeWluZyBJUC9ob3N0bmFtZSBpbiAgVFNlcnZlcjo6c2VydmUKLVRIUklGVC0xNjg1ICAgV2Vic2l0ZSAgICAgICAgICAgICAgUGxlYXNlIGFkZCAiYWVyZW8uY29tIiB0byAiUG93ZXJlZCBieSBBcGFjaGUgVGhyaWZ0IiBsaXN0IGluIGFib3V0ICBwYWdlCi1USFJJRlQtMTY4NiAgIFBIUCAgICAgICAgICAgICAgICAgIHBocCBnZW5lcmF0b3IgdXNlcyAiYW5kIiBpbnN0ZWFkIG9mICImJiIsIGFuZCBjYXVzZXMgY29tcGlsZXIgZXJyb3JzIHdpdGggVmlzdWFsICBTdHVkaW8KLVRIUklGVC0xNjg4ICAgV2Vic2l0ZSAgICAgICAgICAgICAgVXBkYXRlIElETCBwYWdlICBtYXJrdXAKLVRIUklGVC0xNjg5ICAgQysrICAgICAgICAgICAgICAgICAgZG9uJ3QgZXhpdCgtMSkgaW4gIFROb25ibG9ja2luZ1NlcnZlcgotVEhSSUZULTE2OTEgICBEZWxwaGkgICAgICAgICAgICAgICBTZXJpYWxpemVyL2Rlc2VyaWFsaXplciBzdXBwb3J0IGZvciAgRGVscGhpCi1USFJJRlQtMTY5MyAgIEphdmEgICAgICAgICAgICAgICAgIGxpYnRocmlmdCBoYXMgZGVwZW5kZW5jeSBvbiB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mICBodHRwY29yZQotVEhSSUZULTE2OTQgICBDIyAgICAgICAgICAgICAgICAgICBSZS1FbmFibGUgc2VyaWFsaXphdGlvbiBmb3IgV1A3ICBTaWx2ZXJsaWdodAotVEhSSUZULTE3MDIgICBEb2N1bWVudGF0aW9uICAgICAgICBhIHRocmlmdCAgbWFudWFsCi1USFJJRlQtMTcwNyAgIFJ1YnkgICAgICAgICAgICAgICAgIEFkanVzdCBzZXJ2ZXJfc3BlYy5yYiBmb3IgUlNwZWMgMi4xMS54IGFuZCBSdWJ5ICAxLjkuMwotVEhSSUZULTE3MDkgICBDIyAgICAgICAgICAgICAgICAgICBXYXJuaW5nICJCaXR3aXNlLW9yIG9wZXJhdG9yIHVzZWQgb24gYSBzaWduLWV4dGVuZGVkIG9wZXJhbmQ7IiBjYXN0ICBlcnJvcgotVEhSSUZULTE3MTAgICBEZWxwaGkgICAgICAgICAgICAgICBNaW5vciBpc3N1ZXMgaW4gdGVzdCBjYXNlICBjb2RlCi1USFJJRlQtMTcxNCAgIFJ1YnkgICAgICAgICAgICAgICAgIEV4cGxpY2l0bHkgYWRkIENXRCB0byBSdWJ5ICB0ZXN0X3N1aXRlcy5yYgotVEhSSUZULTE3MTggICBDKysgICAgICAgICAgICAgICAgICBJbmNvcnJlY3QgY2hlY2sgaW4gIFRGaWxlVHJhbnNwb3J0VGVzdAotVEhSSUZULTE3MjEgICBCdWlsZCAgICAgICAgICAgICAgICBEaXN0IGJyb2tlbiBkdWUgdG8gMC44LjAgdG8gMC45LjAgIGNoYW5nZXMKLVRIUklGVC0xNzIyICAgQ3NoYXJwICAgICAgICAgICAgICAgQyMgV1A3IEFzc2VtYmx5IGFkZGl0aW9uIGJlYWtzIG1vbm8gIGJ1aWxkCi1USFJJRlQtMTcyNSAgIFdlYnNpdGUgICAgICAgICAgICAgIFR1dG9yaWFsIHdlYiBwYWdlcyBmb3IgRGVscGhpIGFuZCAgQyMKKyMjIERlcHJlY2F0ZWQgTGFuZ3VhZ2VzCisgICAgKiBDb2NvYQorCisjIyBCcmVha2luZyBDaGFuZ2VzIChzaW5jZSAwLjExLjApCisgICAgKiBbVEhSSUZULTQ1MjldIC0gUnVzdCBlbnVtIHZhcmlhbnRzIGFyZSBub3cgY2FtZWwtY2FzZWQgaW5zdGVhZCBvZiB1cHBlcmNhc2VkIHRvIGNvbmZvcm0gdG8gUnVzdCBuYW1pbmcgY29udmVudGlvbnMKKyAgICAqIFtUSFJJRlQtNDQ0OF0gLSBTdXBwb3J0IGZvciBnb2xhbmcgMS42IGFuZCBlYXJsaWVyIGhhcyBiZWVuIGRyb3BwZWQuCisgICAgKiBbVEhSSUZULTQ0NzRdIC0gUEhQIG5vdyB1c2VzIHRoZSBQU1ItNCBsb2FkZXIgYnkgZGVmYXVsdCBpbnN0ZWFkIG9mIGNsYXNzIG1hcHMuCisgICAgKiBbVEhSSUZULTQ1MzJdIC0gbWV0aG9kIHNpZ25hdHVyZXMgY2hhbmdlZCBpbiB0aGUgY29tcGlsZXIncyB0X29vcF9nZW5lcmF0b3IuCisgICAgKiBbVEhSSUZULTQ2NDhdIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKworIyMgS25vd24gSXNzdWVzIChCbG9ja2VyIG9yIENyaXRpY2FsKQorICAgICogW1RIUklGVC00MDM3XSAtIGJ1aWxkOiB1c2UgYSBzaW5nbGUgYnVpbGQgc3lzdGVtIGZvciB0aHJpZnQKKyAgICAqIFtUSFJJRlQtNDExOV0gLSBidWlsZDogYm9vdHN0cmFwLnNoIGlzIG1pc3NpbmcgZnJvbSBzb3VyY2UgdGFyYmFsbAorICAgICogW1RIUklGVC0zMjg5XSAtIGNzaGFycDogc29ja2V0IGV4aGF1c3Rpb24gaW4gY3NoYXJwIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMwMjldIC0gY29jb2E6IEdldHRlcnMgZm9yIGZpZWxkcyBkZWZpbmVkIHdpdGggdXBwZXJjYXNlIG5hbWVzIGRvIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTMzMjVdIC0gY29jb2E6IEV4dGVuZGVkIHNlcnZpY2VzIGFyZW4ndCBzdWJjbGFzc2VzIGluIGdlbmVyYXRlZCBDb2NvYQorICAgICogW1RIUklGVC00MTE2XSAtIGNvY29hOiBUaHJpZnQgZGUtY2FwaXRhbGl6ZXMgdGhlIG5hbWUgb2YgSXNTZXQgcHJvcGVydHkgaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMzg3N10gLSBjcHA6IHRoZSBodHRwIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzdGFuZGFyZDsgaW50ZXJvcCB3aXRoIG90aGVyIGxhbmd1YWdlcyBpcyBzcG90dHkgYXQgYmVzdAorICAgICogW1RIUklGVC00MTgwXSAtIGNwcDogSW1wb3NzaWJsZSB0byBidWlsZCBUaHJpZnQgQysrIGxpYnJhcnkgZm9yIEFuZHJvaWQgKE5ESykKKyAgICAqIFtUSFJJRlQtNDM4NF0gLSBjcHA6IFVzaW5nIG11bHRpcGxlIGFzeW5jIHNlcnZpY2VzIHNpbXVsdGFuZW91c2x5IGlzIG5vdCB0aHJlYWQtc2FmZQorICAgICogW1RIUklGVC0zMTA4XSAtIGhhc2tlbGw6IERlZmF1bHRlZCBzdHJ1Y3QgcGFyYW1ldGVycyBvbiBhIHNlcnZpY2UgZ2VuZXJhdGVzIGludmFsaWQgSGFza2VsbAorICAgICogW1RIUklGVC0zOTkwXSAtIG5vZGVqczogRXhjZXB0aW9uIHN3YWxsb3dlZCBieSBkZXNlcmlhbGl6YXRpb24gZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDIxNF0gLSBub2RlanM6IG1hcDxpNjQsdmFsdWU+IGtleSB0cmVhdGVkIGFzIGhleCB2YWx1ZSBpbiBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTQ2MDJdIC0gbm9kZWpzOiBFUlJPUiBpbiAuL25vZGVfbW9kdWxlcy90aHJpZnQvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMgTW9kdWxlIG5vdCBmb3VuZDogRXJyb3I6IENhbid0IHJlc29sdmUgJ2NoaWxkX3Byb2Nlc3MnCisgICAgKiBbVEhSSUZULTQ2MzldIC0gbm9kZWpzOiBTZXF1ZW5jZSBudW1iZXJpbmcgZm9yIG11bHRpcGxleGVkIHByb3RvY29sIGJyb2tlbgorICAgICogW1RIUklGVC0xMzEwXSAtIHBocDogc2VxdWVuY2UgYW5kIHJlY29ubmVjdGlvbiBtYW5hZ2VtZW50IGlzc3VlcworICAgICogW1RIUklGVC0xNTM4XSAtIHBocDogRXJyb3IgZHVyaW5nIGRlc2VyaWFsaXphdGlvbiBpbnQ2NCBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlCisgICAgKiBbVEhSSUZULTE1ODBdIC0gcGhwOiB0aHJpZnQgdHlwZSBpNjQgamF2YSB0byBwaHAgc2VyaWFsaXplL2Rlc2VyZWFsaXplIG5vdCB3b3JraW5nCisgICAgKiBbVEhSSUZULTE5NTBdIC0gcGhwOiBQSFAgZ2V0cyBzdHVjayBpbiBpbmZpbml0ZSBsb29wCisgICAgKiBbVEhSSUZULTI5NTRdIC0gcHl0aG9uOiBzZW5kaW5nIGludCBvciBmbG9hdCBpbiBhIGRvdWJsZSBmaWVsZCBicmVha3MgdGhlIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtNDA4MF0gLSBweXRob246IHVuaXggc29ja2V0cyBjYW4gZ2V0IHN0dWNrIGZvcmV2ZXIKKyAgICAqIFtUSFJJRlQtNDI4MV0gLSBweXRob246IGdlbmVyYXRlZCBjb2RlIGlzIG91dCBvZiBvcmRlciBhbmQgY2F1c2VzIGxvYWQgaXNzdWVzCisgICAgKiBbVEhSSUZULTQ2NzddIC0gcHkzOiBVbmljb2RlRGVjaWRlRXJyb3IgaW4gUHl0aG9uMworCisjIyBCdWlsZCBQcm9jZXNzCisgICAgKiBbVEhSSUZULTQwNjddIC0gV2luZG93cyB0aHJpZnQgY29tcGlsZXIgZGlzdHJpYnV0ZWQgb24gdGhlIGFwYWNoZSB3ZWIgc2l0ZSBoYXMgcnVudGltZSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtNDMwOF0gLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisgICAgKiBbVEhSSUZULTQ1NzldIC0gVXNlIFVidW50dSBCaW9uaWMgKDE4LjA0IExUUykgZm9yIENJIGJ1aWxkcyBpbnN0ZWFkIG9mIEFydGZ1bCAoMTcuMTApCisgICAgKiBbVEhSSUZULTQ1MDhdIC0gRGVmaW5lIENJIG9wZXJhdGluZyBzeXN0ZW0gY292ZXJhZ2UgcnVsZXMgZm9yIHRoZSBwcm9qZWN0IGFuZCAoaG9wZWZ1bGx5KSBzaW1wbGlmeSBDSSBhIGxpdHRsZSBtb3JlCisgICAgKiBbVEhSSUZULTQzOTddIC0gdWJ1bnR1IGluc3RhbGwgaW5zdHJ1Y3Rpb25zIGJyb2tlbiBvbiAxNi4wNAorICAgICogW1RIUklGVC00NTQ1XSAtIEFwcHZleW9yIGJ1aWxkcyBhcmUgZmFpbGluZyBkdWUgdG8gYSBoYXNrZWxsIC8gY2FiYWwgdXBkYXRlIGluIGNob2NvbGF0ZXkKKyAgICAqIFtUSFJJRlQtNDQ1Ml0gLSBvcHRpbWl6ZSBEb2NrZXJmaWxlIChvbmx5IG9uZXRpbWUgYXB0LWdldCB1cGRhdGUpCisgICAgKiBbVEhSSUZULTQ0NDBdIC0gcm0gYGJ1aWxkL2RvY2tlci91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUub3JpZ2AKKyAgICAqIFtUSFJJRlQtNDM1Ml0gLSBVYnVudHUgQXJ0ZnVsIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBUaHJpZnQgYW5kIEhheGUgMy40LjIKKyAgICAqIFtUSFJJRlQtNDY2Nl0gLSBETGFuZyBDbGllbnQgUG9vbCBUZXN0IGZhaWxzIHNwb3JhZGljYWxseQorICAgICogW1RIUklGVC00Njc2XSAtIENMIHR1dG9yaWFsIGJ1aWxkIGZhaWxzIHNwb3JhZGljYWxseQorICAgICogW1RIUklGVC00NDU2XSAtIE1ha2UgaGF4ZWxpYiBkb3dubG9hZCBxdWlldCBzbyBpdCBkb2Vzbid0IGJsb3cgdXAgdGhlIGJ1aWxkIGxvZworICAgICogW1RIUklGVC00NjA1XSAtIGJvb3RzdHJhcC5zaCBmYWlscyBpZiBhdXRvbWFrZT0xLjE2LjEKKworIyMgY19nbGliCisgICAgKiBbVEhSSUZULTQ2NDhdIC0gVGhlIEMgKEdMaWIpIGNvbXBpbGVyJ3MgaGFuZGxpbmcgb2YgbmFtZXNwYWNlcyBoYXMgYmVlbiBpbXByb3ZlZC4KKyAgICAqIFtUSFJJRlQtNDYyMl0gLSBnbGliQyBjb21waWxhdGlvbiBpc3N1ZQorICAgICogW1RIUklGVC00NjcxXSAtIGMgZ2xpYiBpcyB1bmFibGUgdG8gaGFuZGxlIGNsaWVudCBjbG9zZSB1bmV4cGVjdGVkbHkKKworIyMgY2wgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtODJdIC0gQ29tbW9uIExpc3Agc3VwcG9ydAorCisjIyBjc2hhcnAKKyAgICAqIFtUSFJJRlQtNDU1OF0gLSByZXNlcnZlZCBDc2hhcnAga2V5d29yZHMgYXJlIG5vdCBlc2NhcGVkIGluIHNvbWUgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDYzN10gLSBDIyBhc3luYyBtb2RlIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSB3aXRoIGluaGVyaXRlZCBzZXJ2aWNlcworICAgICogW1RIUklGVC00NjcyXSAtIElBc3luY1Jlc3VsdCBzdHlsZSBtZXRob2RzIG5vdCBiZWluZyBzdXBwb3J0ZWQgYnkgY2VydGFpbiB0cmFuc3BvcnRzIGxlYWRzIHRvIGlzc3VlcyBpbiBtaXhlZCBJU3luYy9JQXN5bmMgdXNlIGNhc2VzCisgICAgKiBbVEhSSUZULTQ1MzldIC0gQWxsb3cgVEJ1ZmZlcmVkVHJhbnNwb3J0IHRvIGJlIHVzZWQgYXMgYmFzZSBjbGFzcworICAgICogW1RIUklGVC00NTM1XSAtIFhNTCBkb2NzOyBjb2RlIGNsZWFudXAgKHRhYnMtPnNwYWNlczsgU3RyaW5nLT5zdHJpbmcpCisgICAgKiBbVEhSSUZULTQ0OTJdIC0gcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZSBtZW1iZXIgb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGNhbm5vdCBiZSBhY2Nlc3NlZAorICAgICogW1RIUklGVC00NDQ2XSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworICAgICogW1RIUklGVC00NDU1XSAtIE1pc3NpbmcgZGlzcG9zZSBjYWxscyBpbiBUaHJlYWRlZFNlcnZlciAmIFRocmVhZHBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDYwOV0gLSBrZWVwIElubmVyRXhjZXB0aW9uIHdoZXJldmVyIGFwcHJvcHJpYXRlCisgICAgKiBbVEhSSUZULTQ2NzNdIC0gSUFzeW5jUmVzdWx0IG5vdCBzdXBwb3J0ZWQgYnkgbGF5ZXJlZCB0cmFuc3BvcnRzIChidWZmZXJlZC9mcmFtZWQpCisKKyMjIGNwcAorICAgICogW1RIUklGVC00NDc2XSAtIFR5cGVjYXN0aW5nIHByb2JsZW0gb24gbGlzdCBpdGVtcworICAgICogW1RIUklGVC00NDY1XSAtIFROb25ibG9ja2luZ1NlcnZlciB0aHJvd2luZyBUSFJJRlQgTE9HR0VSOiBUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiBUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpCisgICAgKiBbVEhSSUZULTQ2ODBdIC0gVEJ1ZmZlclRyYW5zcG9ydHMuaCBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFZpc3VhbCBTdHVkaW8gMjAxNworICAgICogW1RIUklGVC00NjE4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjcmFzaCBiZWNhdXNlIG9mIGxpbWl0YXRpb24gb2Ygc2VsZWN0KCkKKyAgICAqIFtUSFJJRlQtNDYyMF0gLSBUWmxpYlRyYW5zcG9ydC5jcHAgZG9lc24ndCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSB6bGliIGZsdXNoIG1hcmtlciBpbiB0aGUgYnVmZmVyLgorICAgICogW1RIUklGVC00NTcxXSAtIFplcm9NUSBjb250cmliIGxpYnJhcnkgbmVlZHMgYSByZWZyZXNoCisgICAgKiBbVEhSSUZULTQ1NTldIC0gVFNTTFNlcnZlclNvY2tldCBpbmNvcnJlY3RseSBwcmludHMgZXJyb3JzCisgICAgKiBbVEhSSUZULTQ1NzhdIC0gTW92ZSBgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3JgIGludG8gbWFpbiB0aHJpZnQgbGlicmFyeQorICAgICogW1RIUklGVC00NDE4XSAtIGV2aHR0cF9jb25uZWN0aW9uX25ldyBpcyBkZXByZWNhdGVkOyB1c2UgZXZodHRwX2Nvbm5lY3Rpb25fYmFzZV9uZXcKKworIyMgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDY0NF0gLSBDb21waWxlciBjYW5ub3QgYmUgY29tcGlsZWQgb24gbWFjT1MobWF5YmUgYWxzbyBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjbGFuZykKKyAgICAqIFtUSFJJRlQtNDUzMV0gLSBUaHJpZnQgZ2VuZXJhdGVzIHdyb25nIFB5dGhvbiBjb2RlIGZvciBpbW11dGFibGUgc3RydWN0dXJlcyB3aXRoIG9wdGlvbmFsIG1lbWJlcnMKKyAgICAqIFtUSFJJRlQtNDUxM10gLSB0aHJpZnQgZ2VuZXJhdGVkIGNvZGUgaXMgbm90IHN0YWJsZSBmb3IgY29uc3RhbnRzCisgICAgKiBbVEhSSUZULTQ1MzJdIC0gQXZvaWQgdXBkYXRpbmcgVGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIGlmIHRoZSBvdXRwdXQgaGFzIG5vdCBjaGFuZ2VkCisgICAgKiBbVEhSSUZULTQ0MDBdIC0gVmlzdWFsIFN0dWRpbyBDb21waWxlciBwcm9qZWN0IHNob3VsZCBsaW5rIHJ1bnRpbWUgc3RhdGljYWxseSBpbiByZWxlYXNlIGJ1aWxkcworICAgICogW1RIUklGVC00Mzk5XSAtIHBsdWdpbi50aHJpZnQgdF9jb25zdF92YWx1ZSBpcyBub3QgdXNlZCBhcyBhIHVuaW9uIGluIEMrKyBjb2RlIC0tIGZpeCB0aGlzCisgICAgKiBbVEhSSUZULTQ0OTZdIC0gRGVhbGluZyB3aXRoIGxhbmd1YWdlIGtleXdvcmRzIGluIFRocmlmdCAoZS5nLiBzZXJ2aWNlIG1ldGhvZCBuYW1lcykKKyAgICAqIFtUSFJJRlQtNDM5M10gLSByZXBlYXRlZCBydW5zIG9mIGNvbXBpbGVyIHByb2R1Y2UgZGlmZmVyZW50IGJpbmFyeSBvdXRwdXQgYXQgcGx1Z2luIGludGVyZmFjZQorCisjIyBkbGFuZworICAgICogW1RIUklGVC00NDc4XSAtIFRocmlmdCB3aWxsIG5vdCBidWlsZCB3aXRoIGRsYW5nIDIuMDc4IG9yIGxhdGVyCisgICAgKiBbVEhSSUZULTQ1MDNdIC0gZGxhbmcgc2VydmVycyBsb2dFcnJvciBvbiBub3JtYWwgY2xpZW50IGRpc2Nvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtNDMwOF0gLSBEIGxhbmd1YWdlIGRvY2tlciBpbWFnZXMgbmVlZCBkZW1pb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGZpeGVkIHRvIHJlLWVuYWJsZSBtYWtlIGNyb3NzIG9uIGRsYW5nCisKKyMjIGRhcnQKKyAgICAqIFtUSFJJRlQtNDY0Nl0gLSBFZmZlY3RpdmUgRGFydCBhbmQgRXhjZXB0aW9ucworICAgICogW1RIUklGVC00NDM5XSAtIFNob3VsZG4ndCBkb3dubG9hZCBkYXJ0LmRlYiBkaXJlY3RseS4KKworIyMgZGVscGhpCisgICAgKiBbVEhSSUZULTQ1NjJdIC0gQ2FsbGluZyB3cm9uZyBleGNlcHRpb24gQ1RPUiBsZWFkcyB0byAiY2FsbCBmYWlsZWQ6IHVua25vd24gcmVzdWx0IiBpbnN0ZWFkIG9mIHRoZSByZWFsIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24KKyAgICAqIFtUSFJJRlQtNDU1NF0gLSB1bmNvbXBpbGVhYmxlIGNvZGUgd2l0aCBtZW1iZXIgbmFtZXMgdGhhdCBhcmUgYWxzbyB0eXBlcyB1bmRlciBzcGVjaWZpYyBjb25kaXRpb25zCisgICAgKiBbVEhSSUZULTQ0MjJdIC0gQWRkIEFzeW5jIGltcGxlbWVudGF0aW9uIHZpYSBJRnV0dXJlCisgICAgKiBbVEhSSUZULTQ0ODVdIC0gUG9zc2libGUgaW52YWxpZCBwdHIgQVYgd2l0aCBvdmVybGFwcGVkIHJlYWQvd3JpdGUgb24gcGlwZXMKKyAgICAqIFtUSFJJRlQtNDU0OV0gLSBUaHJpZnQgZXhjZXB0aW9ucyBzaG91bGQgZGVyaXZlIGZyb20gVEV4Y2VwdGlvbgorICAgICogW1RIUklGVC00NTQwXSAtIGJ1ZmZlcmVkIHRyYW5zcG9ydCBicm9rZW4gd2hlbiB0cnlpbmcgdG8gcmUtb3BlbiBhIGZvcm1lcmx5IGNsb3NlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDQ3M10gLSBNb3ZlIFRocmlmdC5Db25zb2xlLnBhcyBvdXQgb2YgdGhlIExpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQ5MF0gLSBBbGxvdyBhIGRlZmF1bHQgc2VydmljZSBhcyBmYWxsYmFjayBmb3IgbXVsdGlwbGV4IHByb2Nlc3NvcnMgY29ubmVjdGVkIGJ5IG9sZCBjbGllbnRzCisgICAgKiBbVEhSSUZULTQ0NTRdIC0gTGFyZ2Ugd3JpdGVzL3JlYWRzIG1heSBjYXVzZSByYW5nZSBjaGVjayBlcnJvcnMgaW4gZGVidWcgbW9kZQorICAgICogW1RIUklGVC00NDYxXSAtIENvbXBpbGVyIGRpcmVjdGl2ZSBzaG91bGQgbWF0Y2ggRGVscGhpIFhFNAorICAgICogW1RIUklGVC00NDYyXSAtIEZpcnN0IGxpbmUgaW4gQ29uc29sZSBkdXBsaWNhdGVkCisgICAgKiBbVEhSSUZULTQ2NDJdIC0gRlBVIGN0cmwgd29yZCBzZXR0aW5ncyBtYXkgY2F1c2UgYW4gdW5leHBlY3RlZCAiZGVub3JtYWxpemVkIiBlcnJvcgorICAgICogW1RIUklGVC00NTg5XSAtIEhUVFAgY2xpZW50IHRpbWVvdXRzIGFyZSBhKSBpbmNvbXBsZXRlIGFuZCBiKSBub3QgdXNlZCBhdCBhbGwKKyAgICAqIFtUSFJJRlQtNDU5MF0gLSBydW5uaW5nIHRoZSB0ZXN0IGNsaWVudCB1c2luZyBIVFRQIHRyYW5zcG9ydCBsZWFkcyB0byAiQ29Jbml0aWFsaXplIG5vdCBjYWxsZWQiCisKKyMjIGVybGFuZworICAgICogW1RIUklGVC00NDk3XSAtIEVybGFuZyByZWNvcmRzIHNob3VsZCB1c2UgbWFwKCkgZm9yIG1hcCB0eXBlCisgICAgKiBbVEhSSUZULTQ0OTVdIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIGFsbG93ICd1bmRlZmluZWQnIGZvciBub24tcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTQ1ODBdIC0gRml4IGVybGFuZyB0dXRvcmlhbCB1bnBhY2sgb24gV2luZG93cworICAgICogW1RIUklGVC00NTgyXSAtIFVidW50dSBYZW5pYWwgZXJsYW5nIDE4LjMgIm1ha2UgY2hlY2siIGZhaWxzCisKKyMjIGdvbGFuZworICAgICogW1RIUklGVC00NDQ4XSAtIFN1cHBvcnQgZm9yIGdvbGFuZyAxLjYgYW5kIGVhcmxpZXIgaGFzIGJlZW4gZHJvcHBlZC4KKyAgICAqIFtUSFJJRlQtNDI1M10gLSBHbyBnZW5lcmF0b3IgYXNzaWducyBzdHJpbmdzIHRvIGZpZWxkIGluIGNvbnN0IGluc3RlYWQgb2YgcG9pbnRlcnMuCisgICAgKiBbVEhSSUZULTQ1NzNdIC0gVW5pb25zIEZpZWxkIENvdW50IERvZXMgTm90IENvbnNpZGVyIEJpbmFyeQorICAgICogW1RIUklGVC00NDQ3XSAtIEdvbGFuZzogUGFuaWMgb24gcC5jLkNhbGwgd2hlbiB1c2luZyBkZXByZWNhdGVkIGluaXRpYWxpemVycworICAgICogW1RIUklGVC00NjUwXSAtIFJlcXVpcmVkIGZpZWxkIGluY29ycmVjdGx5IG1hcmtlZCBhcyBzZXQgd2hlbiBmaWVsZFR5cGUgZG9lcyBub3QgbWF0Y2gKKyAgICAqIFtUSFJJRlQtNDQ4Nl0gLSBHb2xhbmc6IC1yZW1vdGUuZ28gY2xpZW50IGNsZWFudXAKKyAgICAqIFtUSFJJRlQtNDUzN10gLSBUU2ltcGxlU2VydmVyIGNhbiBleGl0IEFjY2VwdCBsb29wIHdpdGggbG9jayBzdGlsbCBhY3F1aXJlZAorICAgICogW1RIUklGVC00NTE2XSAtIEFkZCBzdXBwb3J0IGZvciBnbyAxLjEwCisgICAgKiBbVEhSSUZULTQ0MjFdIC0gZ29sYW5nIHRlc3RzIHJlbHkgb24gZ29tb2NrLCB3aGljaCBoYXMgY2hhbmdlIGJlaGF2aW91ciwgY2F1c2luZyB0ZXN0cyB0byBmYWlsCisgICAgKiBbVEhSSUZULTQ2MjZdIC0gQ29tbXVuaWNhdGlvbiBjcmFzaCB3aGVuIHVzaW5nIGJpbmFyeS9jb21wYWN0IHByb3RvY29sIGFuZCB6bGliIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NjU5XSAtIGdvbGFuZyByYWNlIGRldGVjdGVkIHdoZW4gY2xvc2luZyBsaXN0ZW5lciBzb2NrZXQKKworIyMgaGFza2VsbAorICAgICogW1RIUklGVC00NjM0XSAtIEhhc2tlbGwgYnVpbGRzIHdpdGggb2xkZXIgY2FiYWwgY2Fubm90IHJlY29uY2lsZSBjb21wbGV4IHZlcnNpb24gcmVxdWlyZW1lbnRzCisKKyMjIGphdmEKKyAgICAqIFtUSFJJRlQtNDI1OV0gLSBUaHJpZnQgZG9lcyBub3QgY29tcGlsZSBkdWUgdG8gQW50IE1hdmVuIHRhc2sgZXJyb3JzCisgICAgKiBbVEhSSUZULTE0MThdIC0gQ29tcGlsaW5nIFRocmlmdCBmcm9tIHNvdXJjZTogQ2xhc3Mgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29uZGl0aW9uVGFzayBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCAidHlwZWZvdW5kIiBlbGVtZW50CisgICAgKiBbVEhSSUZULTQ1MzBdIC0gcHJvcG9zYWw6IGFkZCBudWxsYWJpbGl0eSBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgICAgKiBbVEhSSUZULTQ2MTRdIC0gR2VuZXJhdGUgbWlzc2luZyBATnVsbGFibGUgYW5ub3RhdGlvbnMgZm9yIEphdmEgaXRlcmF0b3IgZ2V0dGVycworICAgICogW1RIUklGVC00NTU1XSAtIEdldHRlciBvZiBiaW5hcnkgZmllbGQgaW4gSmF2YSBjcmVhdGVzIHVubmVjZXNzYXJ5IGNvcHkKKyAgICAqIFtUSFJJRlQtMzk4M10gLSBsaWJ0aHJpZnQgaXMgZGVwbG95ZWQgb24gY2VudHJhbCB3aXRoIHBvbSBwYWNrYWdpbmcgaW5zdGVhZCBvZiBqYXIKKyAgICAqIFtUSFJJRlQtNDI5NF0gLSBKYXZhIENvbmZpZ3VyZSBGYWlscyBmb3IgQW50ID49IDEuMTAKKyAgICAqIFtUSFJJRlQtNDE3OF0gLSBKYXZhIGxpYnJhcmllcyBtaXNzaW5nIGZyb20gcGFja2FnZSB3aGVuIHVzaW5nIGNtYWtlCisgICAgKiBbVEhSSUZULTQxMjBdIC0gcG9tIGZpbGVzIGFyZSBub3QgZ2VuZXJhdGVkIG9yIHByb3ZpZGVkIGluIHRoZSBidWlsZAorICAgICogW1RIUklGVC0xNTA3XSAtIE1hdmVuIGNhbid0IGRvd25sb2FkIHJlc291cmNlIGZyb20gY2VudHJhbCB3aGVuIGJlaGluZCBhIHByb3h5IGFuZCB3b24ndCB1c2UgbG9jYWwgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC00NTU2XSAtIE9wdGlvbmFsIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgaW4gamF2YSBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtNDMzN10gLSBBYmxlIHRvIHNldCBrZXlTdG9yZSBhbmQgdHJ1c3RTdG9yZSBhcyBJbnB1dFN0cmVhbSBpbiB0aGUgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMKKyAgICAqIFtUSFJJRlQtNDU2Nl0gLSBQYXNzIG1lc3NhZ2Ugb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbiB0byBvcHRpb25hbCByZXRocm93LgorICAgICogW1RIUklGVC00NTA2XSAtIFJlbW92ZSBhc3NlcnRpb24gaW4gSmF2YSBTQVNMIGNvZGUgdGhhdCB3b3VsZCBiZSBpZ25vcmVkIGluIHJlbGVhc2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTQ0NzBdIC0gSW5jbHVkZSBwb3B1bGFyIElERSBmaWxlIHRlbXBsYXRlcyB0byBnaXRpZ25vcmUKKyAgICAqIFtUSFJJRlQtNDQyOV0gLSBNYWtlIFRUaHJlYWRQb29sU2VydmVyLmV4ZWN1dG9yU2VydmljZV8gYXZhaWxhYmxlIGluIGluaGVyaXRlZCBjbGFzc2VzIGFuZCByZWZhY3RvciBtZXRob2RzIHRvIGJlIGFibGUgY3VzdG9taXphdGlvbgorICAgICogW1RIUklGVC0zNzY5XSAtIEZpeCBsb2dpYyBvZiBUSFJJRlQtMjI2OAorICAgICogW1RIUklGVC00NDk0XSAtIEluY3JlYXNlIEphdmEgU29ja2V0IEJ1ZmZlciBTaXplCisgICAgKiBbVEhSSUZULTQ0OTldIC0gUmVtb3ZlIE1hZ2ljIE51bWJlciBJbiBURklsZVRyYW5zcG9ydAorCisjIyBqcworICAgICogW1RIUklGVC00NDA2XSAtIEphdmFTY3JpcHQ6IFVzZSBtb2Rlcm4gUHJvbWlzZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAqIFtUSFJJRlQtNDYyNV0gLSBsZXQgLyBjb25zdCB2YXJpYWJsZSBkZWNvcmF0b3JzIGZvciBlczYgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtNDY1M10gLSBFUzYgQ2xhc3NlcworICAgICogW1RIUklGVC00NTkyXSAtIEpTOiByZWFkSTMyIHBlcmZvcm1hbmNlIG9uIGxhcmdlIGFycmF5cyBpcyB2ZXJ5IHBvb3IgaW4gQ2hyb21lCisgICAgKiBbVEhSSUZULTQ1MDldIC0ganMgYW5kIG5vZGVqcyBsaWJyYXJpZXMgbmVlZCB0byBiZSByZWZyZXNoZWQgd2l0aCBjdXJyZW50IGxpYnJhcmllcworICAgICogW1RIUklGVC00NDAzXSAtIHRocmlmdC5qczogSW5jb3JyZWN0IHVzYWdlIG9mICd0aGlzJyBpbiBUV2ViU29ja2V0VHJhbnNwb3J0Ll9fb25PcGVuCisgICAgKiBbVEhSSUZULTQ0MzZdIC0gRGVzZXJpYWxpemF0aW9uIG9mIG5lc3RlZCBsaXN0IGRpc2NhcmRzIGNvbnRlbnQKKyAgICAqIFtUSFJJRlQtNDQzN10gLSBKUyBXZWJTb2NrZXQgY2xpZW50IGNhbGxiYWNrcyBpbnZva2VkIHR3aWNlIG9uIHBhcmFsbGVsIHJlcXVlc3RzCisgICAgKiBbVEhSSUZULTQ2NzldIC0gRHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciBpbiBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcworICAgICogW1RIUklGVC00NTUxXSAtIEFkZCBwcmV0dGllciBmb3IgY29uc2lzdGVudCBKUyBjb2RlIGZvcm1hdHRpbmcKKworIyMgbHVhCisgICAgKiBbVEhSSUZULTQ1OTFdIC0gbHVhIGNsaWVudCB1c2VzIHR3byB3cml0ZSgpIGNhbGxzIHBlciBmcmFtZWQgbWVzc2FnZSBzZW5kCisgICAgKiBbVEhSSUZULTM4NjNdIC0gQ2FuJ3QgIm1ha2UgaW5zdGFsbCIgTHVhIExpYnJhcnkKKworIyMgbmV0Y29yZQorICAgICogW1RIUklGVC00NTI0XSAtIC5ORVQgQ29yZSBTZXJ2ZXIgZG9lc24ndCBjbG9zZSBwcm9wZXJseSB3aGVuIGNhbmNlbGxlZAorICAgICogW1RIUklGVC00NDM0XSAtIFVwZGF0ZSAuTkVUIENvcmUgY29tcG9uZW50cywgYWRkIHRlc3RzIGZvciAuTmV0IENvcmUgbGlicmFyeSBhbmQgLk5ldCBDb3JlIGNvbXBpbGVyLCBmaXggYnVncyBhbmQgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC00NDQ2XSAtIEpTT05Qcm90b2NvbCBCYXNlNjQgRW5jb2RpbmcgVHJpbXMgUGFkZGluZworCisjIyBub2RlLmpzCisgICAgKiBbVEhSSUZULTQyMjVdIC0gRXJyb3IgaGFuZGxpbmcgbWFsZm9ybWVkIGFyZ3VtZW50cyBsZWFrcyBtZW1vcnksIGNvcnJ1cHRzIHRyYW5zcG9ydCBidWZmZXJzIGNhdXNpbmcgbmV4dCBSUEMgdG8gZmFpbAorICAgICogW1RIUklGVC0zOTUwXSAtIE1lbW9yeSBsZWFrIHdoaWxlIGNhbGxpbmcgb25ld2F5IG1ldGhvZAorICAgICogW1RIUklGVC0zMTQzXSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTQ1NjRdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGNhbiBsZWF2ZSBjb3JydXB0IGRhdGEgaW4gdGhlIGJ1ZmZlcgorICAgICogW1RIUklGVC00NjQ3XSAtIE5vZGUuanMgRmlsZXNlcnZlciB3ZWJyb290IHBhdGgKKyAgICAqIFtUSFJJRlQtNDQ4OV0gLSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCBmb3IgTm9kZUpTIGNsaWVudAorICAgICogW1RIUklGVC00NDQzXSAtIG5vZGUuanMganNvbl9wcm90b2NvbCB0aHJvd3MgZXJyb3IgaW4gc2tpcCBmdW5jdGlvbgorICAgICogW1RIUklGVC00NjA0XSAtIE5vZGVKUzogRXhwb3NlIEludDY0IGZyb20gYnJvd3Nlci5qcyBmb3IgY29uc3VtcHRpb24gYnkgYnJvd3NlcgorICAgICogW1RIUklGVC00NDgwXSAtIE5vZGVKUyB3YXJuaW5nIG9uIGJpbmFyeV9wcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmQgd2hlbiBzZXFpZCA9IDAKKworIyMgcGVybAorICAgICogW1RIUklGVC00MzgyXSAtIFJlcGxhY2UgdGhlIHVzZSBvZiBQZXJsIEluZGlyZWN0IE9iamVjdCBTeW50YXggY2FsbHMgdG8gbmV3KCkKKyAgICAqIFtUSFJJRlQtNDQ3MV0gLSBUaHJpZnQgQ1BBTiByZWxlYXNlIGlzIG1pc3NpbmcgTWFrZWZpbGUuUEwgYW5kIHRoZSBjbGllbnRzIGFyZSB1bmFibGUgdG8gYnVpbGQgdGhlIG1vZHVsZQorICAgICogW1RIUklGVC00NDE2XSAtIFBlcmwgQ1BBTiBQYWNrYWdpbmcgSW1wcm92ZW1lbnRzCisKKyMjIHBocAorICAgICogW1RIUklGVC00NDc0XSAtIFBIUCBnZW5lcmF0b3IgdXNlIFBTUi00IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtNDQ2M10gLSBQSFAgZ2VuZXJhdGVkIGNvZGUgbWF0Y2ggUFNSLTIKKyAgICAqIFtUSFJJRlQtNDM3M10gLSBFeHRlbmRpbmcgVGhyaWZ0IGNsYXNzIHJlc3VsdHMgaW4gIkF0dGVtcHQgc2VyaWFsaXplIGZyb20gbm9uLVRocmlmdCBvYmplY3QiCisgICAgKiBbVEhSSUZULTQzNTRdIC0gVFNvY2tldCBibG9jayBvbiByZWFkCisgICAgKiBbVEhSSUZULTQ0MjNdIC0gbWlncmF0ZSBwaHAgbGlicmFyeSB0byBwc3ItNAorICAgICogW1RIUklGVC00NjU2XSAtIGluZmluaXRlIGxvb3AgaW4gbGF0ZXN0IFBIUCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0NzddIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IG11c3QgaGF2ZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NDc1XSAtIGxpYi9waHAvdGVzdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgUFNSLTIKKyAgICAqIFtUSFJJRlQtNDQ5OF0gLSBhZGQgcGhwY3MgYmFjaworICAgICogW1RIUklGVC00NDYwXSAtIHBocCBsaWJyYXJ5IHVzZSBQU1ItMgorICAgICogW1RIUklGVC00NjQxXSAtIFRDdXJsQ2xpZW50IGRvZXNuJ3QgY2hlY2sgZm9yIEhUVFAgc3RhdHVzIGNvZGUKKyAgICAqIFtUSFJJRlQtNDY0NV0gLSBUQ3VybENsaWVudDogc2hvdyBhY3R1YWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRocm93aW5nIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDY3NF0gLSBBZGQgc3RyZWFtIGNvbnRleHQgc3VwcG9ydCBpbnRvIFBIUC9USHR0cENsaWVudAorICAgICogW1RIUklGVC00NDU5XSAtIHJlZHVjZSBwaHAgbGlicmFyeSBkaXJlY3RvcnkgZGVwdGgKKworIyMgcHl0aG9uCisgICAgKiBbVEhSSUZULTQ2NzBdIC0gVHdpc3RlZCwgc2xvdHMsIGFuZCB2b2lkIG1ldGhvZCBmYWlscyB3aXRoICJvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc3VjY2VzcyciCisgICAgKiBbVEhSSUZULTQ0NjRdIC0gUG90ZW50aWFsbHkgc2VydmVyLWNyYXNoaW5nIHR5cG8gaW4gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlcgorICAgICogW1RIUklGVC00NTQ4XSAtIFN1cHBvcnRpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgcHJvdG9jb2wgd2hlbiB1c2luZyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW4gUHl0aG9uCisgICAgKiBbVEhSSUZULTQ1NzddIC0gT3V0ZGF0ZWQgY2lwaGVyIHN0cmluZyBpbiBweXRob24gdW5pdCB0ZXN0CisgICAgKiBbVEhSSUZULTQ1MDVdIC0gcHl0aG9uIGJ1aWxkIG9uIFZhZ3JhbnQgV2luZG93cyBib3hlcyBmYWlscworICAgICogW1RIUklGVC00NjIxXSAtIFRIZWFkZXIgZm9yIFB5dGhvbgorICAgICogW1RIUklGVC00NjY4XSAtIG1ha2Ugc29ja2V0IGJhY2tsb2cgY29uZmlndXJhYmxlIGZvciBweXRob24KKyAgICAqIFtUSFJJRlQtNDU2MV0gLSBQeXRob246IGNsZWFudXAgc29ja2V0IHRpbWVvdXQgc2V0dGluZ3MKKworIyMgcnVieQorICAgICogW1RIUklGVC00Mjg5XSAtIFRocmlmdCBSU3BlYyB0ZXN0IHN1aXRlIGZhaWxzIHdpdGggUnVieSAyLjQueCBkdWUgdG8gRml4bnVtIGRlcHJlY2F0aW9uCisgICAgKiBbVEhSSUZULTQzNDJdIC0gU3VwcG9ydCBydWJ5IHJzcGVjIDMKKyAgICAqIFtUSFJJRlQtNDUyNV0gLSBBZGQgc3NsIHNvY2tldCBvcHRpb24gdG8gcnVieSBjcm9zcyB0ZXN0cworICAgICogW1RIUklGVC00NDUwXSAtIEFkZCBzZWVrIHN1cHBvcnQgdG8gVENvbXBhY3RJbnB1dFByb3RvY29sIGluIFJ1c3QKKyAgICAqIFtUSFJJRlQtNDYzMV0gLSBDb2RlZ2VuIENyZWF0ZXMgSW52YWxpZCBSdWJ5IGZvciBSZWN1cnNpdmUgU3RydWN0cworICAgICogW1RIUklGVC00NDcyXSAtIEZpeCB0aGUgZ2Vuc3BlYyBmb3IgcnVieSBzbyBpdCBkb2VzIG5vdCBjb21wbGFpbiBhYm91dCBhbiBpbnZhbGlkIGxpY2Vuc2UKKworIyMgcnVzdAorICAgICogW1RIUklGVC00NjYyXSAtIFJ1c3QgY29uc3Qgc3RyaW5nIGNhbGxzIGZ1bmN0aW9uIGF0IGNvbXBpbGUgdGltZQorICAgICogW1RIUklGVC00NjYxXSAtIFJ1c3QgZW51bSBuYW1lIHdyb25nIGNhc2UgaW4gZ2VuZXJhdGVkIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDYxN10gLSBBdm9pZCBnZW5lcmF0aW5nIGNvbmZsaWN0aW5nIHN0cnVjdCBuYW1lcyBpbiBSdXN0IGNvZGUKKyAgICAqIFtUSFJJRlQtNDUyOV0gLSBSdXN0IGdlbmVyYXRpb24gc2hvdWxkIGluY2x1ZGUgIyFbYWxsb3cobm9uX3NuYWtlX2Nhc2UpXSBvciBmb3JjZSBjb25mb3JtIHRvIFJ1c3Qgc3R5bGUgZ3VpZGVsaW5lcworICAgICogW1RIUklGVC00MzkwXSAtIFJ1c3QgYmluYXJ5IHByb3RvY29sIGFuZCBidWZmZXJlZCB0cmFuc3BvcnQgY2Fubm90IGhhbmRsZSB3cml0ZXMgYWJvdmUgNDA5NiBieXRlcworICAgICogW1RIUklGVC00NDE5XSAtIFJ1c3QgZnJhbWVkIHRyYW5zcG9ydCBjYW5ub3QgaGFuZGxlIHdyaXRlcyBhYm92ZSA0MDk2IGJ5dGVzCisgICAgKiBbVEhSSUZULTQ2NThdIC0gUnVzdCdzIFRCaW5hcnlJbnB1dFByb3RvY29sIGZhaWxzIHdoZW4gc3RyaWN0IGlzIGZhbHNlCisgICAgKiBbVEhSSUZULTQxODddIC0gRGFydCAtPiBSdXN0IEZyYW1lZCBjcm9zcyB0ZXN0cyBmYWlsCisgICAgKiBbVEhSSUZULTQ2NjRdIC0gUnVzdCBjYW5ub3QgY3JlYXRlIFJlYWRIYWxmL1dyaXRlSGFsZiB0byBpbXBsZW1lbnQgY3VzdG9tIHRyYW5wb3J0cworICAgICogW1RIUklGVC00NjY1XSAtIEtlZXAgUnVzdCBsaWJyYXJ5IHVwLXRvLWRhdGUgb24gY3JhdGVzLmlvCisKKyMjIHN3aWZ0IChuZXcgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiAwLjEyLjApCisgICAgKiBbVEhSSUZULTM3NzNdIC0gU3dpZnQgTGlicmFyeQorCisjIyB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTQ1MTVdIC0gR3JhY2VmdWxseSBzaHV0ZG93biBjcm9zcy10ZXN0IHNlcnZlcnMgdG8gZnVsbHkgdGVzdCB0ZWFyZG93bgorICAgICogW1RIUklGVC00MDg1XSAtIEFkZCAuTkVUIENvcmUgdG8gdGhlIG1ha2UgY3Jvc3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC00MzU4XSAtIEFkZCB1bml4IGRvbWFpbiBzb2NrZXRzIGluIHJ1YnkgdG8gY3Jvc3MgdGVzdCAtIGNvZGUgZXhpc3RzCisKKyMjIHR5cGVzY3JpcHQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtMzE0M10gLSBhZGQgdHlwZXNjcmlwdCBkaXJlY3Rvcnkgc3VwcG9ydAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhyaWZ0IDAuMTEuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTI3MzNdIC0gRXJsYW5nIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMjc0MF0gLSBQZXJsIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMzYxMF0gLSBTdHJlYW1saW5lIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBQeXRob24gc2VydmVyIGhhbmRsZXIKKyAgICAqIFtUSFJJRlQtMzY4Nl0gLSBKYXZhIHByb2Nlc3NvciBzaG91bGQgcmVwb3J0IGludGVybmFsIGVycm9yIG9uIHVuY2F1Z2h0IGV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MDQ5XSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDA1M10gLSBTa2lwKCkgc2hvdWxkIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEgb24gdW5rbm93biBkYXRhIHR5cGVzCisgICAgKiBbVEhSSUZULTQxMzZdIC0gQWxpZ24gaXNfYmluYXJ5KCkgbWV0aG9kIHdpdGggaXNfc3RyaW5nKCkgdG8gc2ltcGxpZnkgdGhvc2UgY2hlY2tzCisgICAgKiBbVEhSSUZULTQxMzddIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIFRocmlmdCBDb21waWxlcgorICAgICogW1RIUklGVC00MTM4XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cyBpbiBDKysgbGlicmFyeQorICAgICogW1RIUklGVC00Mjk2XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgcHl0aG9uIGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTQyOThdIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBnbyAxLjYgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDI5OV0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIEQgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDMwMF0gLSBGaXggbWFrZSBjcm9zcyBpbiBVYnVudHUgWGVuaWFsIGRvY2tlciBlbnZpcm9ubWVudCwgb25jZSBhbGwgbGFuZ3VhZ2Ugc3VwcG9ydCBpc3N1ZXMgYXJlIGZpeGVkCisgICAgKiBbVEhSSUZULTQzMDJdIC0gRml4IFVidW50dSBYZW5pYWwgbWFrZSBjcm9zcyB0ZXN0aW5nIGZvciBsdWEgYW5kIHBocDcKKyAgICAqIFtUSFJJRlQtNDM5OF0gLSBVcGRhdGUgRVhUUkFfRElTVCBmb3IgIm1ha2UgZGlzdCIKKworIyMgQnVnCisgICAgKiBbVEhSSUZULTM4MV0gLSBGYWlsIGZhc3QgaWYgY29uZmlndXJlIGRldGVjdHMgQysrIHByb2JsZW1zCisgICAgKiBbVEhSSUZULTE2NzddIC0gTWluR1cgc3VwcG9ydCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMTgwNV0gLSBUaHJpZnQgc2hvdWxkIG5vdCBzd2FsbG93IEFMTCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTIwMjZdIC0gRml4IFRDb21wYWN0UHJvdG9jb2wgNjQgYml0IGJ1aWxkcworICAgICogW1RIUklGVC0yNjQyXSAtIFJlY3Vyc2l2ZSBzdHJ1Y3RzIGRvbid0IHdvcmsgaW4gcHl0aG9uCisgICAgKiBbVEhSSUZULTI4ODldIC0gc3RhYmxlIHJlbGVhc2UgMC45LjIsIGVybGFuZyB0dXRvcmlhbCBicm9rZW4KKyAgICAqIFtUSFJJRlQtMjkxM10gLSBSdWJ5IFNlcnZlciBUaHJpZnQ6OlRocmVhZFBvb2xTZXJ2ZXIgc2hvdWxkIHNlcnZlIGluc2lkZSBhIHRocmVhZAorICAgICogW1RIUklGVC0yOTk4XSAtIE5vZGUuanM6IE1pc3NpbmcgaGVhZGVyIGZyb20gaHR0cCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTMwMDBdIC0gLk5FVCBpbXBsZW1lbnRhdGlvbiBoYXMgdHJvdWJsZSB3aXRoIG1peGVkIElQIG1vZGVzCisgICAgKiBbVEhSSUZULTMyODFdIC0gVHJhdmlzIENJIGJ1aWxkIHBhc3NlZCBidXQgdGhlIGxvZyBzYXlzIEJVSUxEIEZBSUxFRAorICAgICogW1RIUklGVC0zMzU4XSAtIE1ha2VmaWxlOjEzNjI6ICoqKiBtaXNzaW5nIHNlcGFyYXRvci4gU3RvcC4KKyAgICAqIFtUSFJJRlQtMzYwMF0gLSBNYWtlIFRUd2lzdGVkIHNlcnZlciBzZW5kIGV4Y2VwdGlvbiBvbiB1bmV4cGVjdGVkIGhhbmRsZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMzYwMl0gLSBNYWtlIFRvcm5hZG8gc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorICAgICogW1RIUklGVC0zNjU3XSAtIEQgVEZpbGVXcml0ZXJUcmFuc3BvcnQgY2xvc2Ugc2hvdWxkIHVzZSBub24tcHJpb3JpdHkgc2VuZAorICAgICogW1RIUklGVC0zNzAwXSAtIEdvIE1hcCBoYXMgd3JvbmcgZGVmYXVsdCB2YWx1ZSB3aGVuIG9wdGlvbmFsCisgICAgKiBbVEhSSUZULTM3MDNdIC0gVW5pb25zIEZpZWxkIENvdW50IERvZXMgTm90IENvbnNpZGVyIE1hcC9TZXQvTGlzdCBGaWVsZHMKKyAgICAqIFtUSFJJRlQtMzczMF0gLSBzZXJ2ZXIgbG9nIGVycm9yIHR3aWNlCisgICAgKiBbVEhSSUZULTM3NzhdIC0gZ28gY2xpZW50IGNhbiBub3QgcGFzcyBtZXRob2QgcGFyYW1ldGVyIHRvIHNlcnZlciBvZiBvdGhlciBsYW5ndWFnZSBpZiBubyBmaWVsZF9pZCBpcyBnaXZlbgorICAgICogW1RIUklGVC0zNzg0XSAtIHRocmlmdC1tYXZlbi1wbHVnaW4gZ2VuZXJhdGVzIGludmFsaWQgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgSURMIGluIGRlcGVuZGVuY3kgSkFScworICAgICogW1RIUklGVC0zODAxXSAtIE5vZGUgVGhyaWZ0IGNsaWVudCB0aHJvd3MgZXhjZXB0aW9uIHdpdGggbXVsdGlwbGV4ZXIgYW5kIHJlc3BvbnNlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiBhIHNpbmdsZSBidWZmZXIKKyAgICAqIFtUSFJJRlQtMzgyMV0gLSBUTWVtb3J5QnVmZmVyIGJ1ZmZlciBtYXkgb3ZlcmZsb3cgd2hlbiByZXNpemluZworICAgICogW1RIUklGVC0zODMyXSAtIFRocmlmdCB2ZXJzaW9uIDAuOS4zIGV4YW1wbGUgb24gV2luZG93cywgVmlzdWFsIFN0dWRpbywgbGlua2luZyBlcnJvcnMgZHVyaW5nIGNvbXBpbGluZworICAgICogW1RIUklGVC0zODQ3XSAtIHRocmlmdC9jb25maWcuaCBpbmNsdWRlcyBhICNkZWZpbmUgZm9yIFZFUlNJT04gd2hpY2ggd2lsbCBsaWtlbHkgY29uZmxpY3Qgd2l0aCBleGlzdGluZyB1c2VyIGVudmlyb25tZW50IG9yIGNvZGUKKyAgICAqIFtUSFJJRlQtMzg3M10gLSBGaXggdmFyaW91cyBidWlsZCB3YXJuaW5ncyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8KKyAgICAqIFtUSFJJRlQtMzg5MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgY29uZmlndXJlZCB3aXRoIG1vcmUgdGhhbiBvbmUgSU8gdGhyZWFkcyBkb2VzIG5vdCBhbHdheXMgcmV0dXJuIGZyb20gc2VydmUoKSB1cG9uIHN0b3AoKQorICAgICogW1RIUklGVC0zODkyXSAtIFRocmlmdCB1c2VzIFRMUyBTTkkgZXh0ZW5zaW9uIHByb3ZpZGVkIGJ5IE9wZW5TU0wgbGlicmFyeS4gT2xkZXIgdmVyc2lvbiBvZiBPcGVuU1NMKDwgMC45LjhmKSBtYXkgY3JlYXRlIHByb2JsZW0gYmVjYXVzZSB0aGV5IGRvIG5vdCBzdXBwb3J0ICdTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKScuCisgICAgKiBbVEhSSUZULTM4OTVdIC0gQnVpbGQgZmFpbHMgdXNpbmcgSmF2YSAxLjggd2l0aCBBbnQgPCAxLjkKKyAgICAqIFtUSFJJRlQtMzg5Nl0gLSBtYXA8c3RyaW5nLHN0cmluZz4gZGF0YSB3aXRoIG51bWJlciBzdHJpbmcga2V5IGNhbm5vdCBhY2Nlc3MgdGhhdCBkZXNlcmlhbGl6ZWQgYnkgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zOTM4XSAtIFB5dGhvbiBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3Qgd29yayB3aXRoIFNTTAorICAgICogW1RIUklGVC0zOTQ0XSAtIFRTU0xTb2NrZXQgaGFzIGRlYWQgY29kZSBpbiBjaGVja0hhbmRzaGFrZQorICAgICogW1RIUklGVC0zOTQ2XSAtIEphdmEgMS41IGNvbXBhdGliaWxpdHkgYnJva2VuIGZvciBiaW5hcnkgZmllbGRzIChqYXZhNSBvcHRpb24pCisgICAgKiBbVEhSSUZULTM5NjBdIC0gSW5oZXJpdGVkIHNlcnZpY2VzIGluIEx1YSBnZW5lcmF0b3IgYXJlIG5vdCBuYW1lZCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzk2Ml0gLSBBbnQgYnVpbGQueG1sIGJyb2tlbiBvbiBXaW5kb3dzIGZvciBKYXZhIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzk2M10gLSBUaHJpZnQuY2FiYWwgZmlsZW5hbWUgZG9lcyBub3QgbWF0Y2ggbW9kdWxlIG5hbWUKKyAgICAqIFtUSFJJRlQtMzk2N10gLSBnb2JqZWN0L2dwYXJhbS5oOjE2NjozMzogd2FybmluZzogZW51bWVyYXRvciB2YWx1ZSBmb3Ig4oCYR19QQVJBTV9ERVBSRUNBVEVE4oCZIGlzIG5vdCBhbiBpbnRlZ2VyIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgICAqIFtUSFJJRlQtMzk2OF0gLSBEZXNlcmlhbGl6aW5nIGVtcHR5IHN0cmluZy9iaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTM5NzRdIC0gVXNpbmcgY2xhbmctMy44IGFuZCBUaHJlYWRTYW5pdGl6ZXIgb24gdGhlIGNvbmN1cnJlbmN5X3Rlc3QgY2xhaW1zIGJhZCBQVGhyZWFkIGJlaGF2aW9yCisgICAgKiBbVEhSSUZULTM5ODRdIC0gUEhQNyBleHRlbnNpb24gY2F1c2VzIHNlZ2ZhdWx0CisgICAgKiBbVEhSSUZULTQwMDhdIC0gYnJva2VuIGNpIGR1ZSB0byB1cHN0cmVhbSBkZXBlbmRlbmN5IHZlcnNpb25pbmcgYnJlYWsKKyAgICAqIFtUSFJJRlQtNDAwOV0gLSBVc2UgQGltcGxlbWVudGVyIGluc3RlYWQgb2YgaW1wbGVtZW50cyBpbiBUVHdpc3RlZC5weQorICAgICogW1RIUklGVC00MDEwXSAtIFEuZmNhbGwgbWVzc2luZyB1cCB3aXRoICp0aGlzKiBwb2ludGVyIGluc2lkZSBjYWxsZWQgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtNDAxMV0gLSBTZXRzIG9mIFRocmlmdCBzdHJ1Y3RzIGdlbmVyYXRlIEdvIGNvZGUgdGhhdCBjYW4ndCBiZSBzZXJpYWxpemVkIHRvIEpTT04KKyAgICAqIFtUSFJJRlQtNDAxMl0gLSBQeXRob24gVHdpc3RlZCBpbXBsZW1lbnRhdGlvbiB1c2VzIGltcGxlbWVudHMsIG5vdCBjb21wYXRpYmxlIHdpdGggUHkzCisgICAgKiBbVEhSSUZULTQwMTRdIC0gYWxpZ24gQyMgbWV0YSBkYXRhIGluIEFzc2VtYmx5SW5mby5jcworICAgICogW1RIUklGVC00MDE1XSAtIEZpeCB3cm9uZ2x5IHNwZWxsZWQgIlRoaXJmdCJzCisgICAgKiBbVEhSSUZULTQwMTZdIC0gdGVzdEluc2FuaXR5KCkgaW1wbCBkb2VzIG5vdCBjb25mb3JtIHRvIHRlc3Qgc3BlYyBpbiBUaHJpZnRUZXN0LnRocmlmdAorICAgICogW1RIUklGVC00MDIzXSAtIFNraXAgdW5leHBlY3RlZCBmaWVsZCB0eXBlcyBvbiByZWFkL3dyaXRlCisgICAgKiBbVEhSSUZULTQwMjRdIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDAyNl0gLSBUU1NMU29ja2V0IGRvZXNuJ3Qgd29yayB3aXRoIFB5dGhvbiA8IDIuNy45CisgICAgKiBbVEhSSUZULTQwMjldIC0gQWNjZWxlcmF0ZWQgcHJvdG9jb2xzIGRvIG5vdCBidWlsZCBmcm9tIHRocmlmdC1weSAwLjEwLjAgb24gUHlQSQorICAgICogW1RIUklGVC00MDMxXSAtIEdvIHBsdWdpbiBnZW5lcmF0ZXMgaW52YWxpZCBjb2RlIGZvciBsaXN0cyBvZiB0eXBlZGVmJ2VkIGJ1aWx0LWluIHR5cGVzCisgICAgKiBbVEhSSUZULTQwMzNdIC0gRGVmYXVsdCBidWlsZCBXSVRIX1BMVUdJTj1PTiBmb3IgYWxsIGJ1aWxkcyByZXN1bHRzIGluIHBhY2thZ2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDAzNF0gLSBDTWFrZSBkb2Vzbid0IHdvcmsgdG8gYnVpbGQgY29tcGlsZXIgb24gTWFjT1MKKyAgICAqIFtUSFJJRlQtNDAzNl0gLSBBZGQgLk5FVCBDb3JlIGVudmlyb25tZW50L2J1aWxkIHN1cHBvcnQgdG8gdGhlIGRvY2tlciBpbWFnZQorICAgICogW1RIUklGVC00MDM4XSAtIHNvY2tldCBjaGVjazogY2hlY2tpbmcgYW4gdW5zaWduZWQgbnVtYmVyIGFnYWluc3QgPj0gMCBuZXZlciBmYWlscworICAgICogW1RIUklGVC00MDQyXSAtIEV4dHJhY3Rpb25FcnJvciB3aGVuIHVzaW5nIGFjY2VsZXJhdGVkIHRocmlmdCBpbiBhIG11bHRpcHJvY2VzcyB0ZXN0CisgICAgKiBbVEhSSUZULTQwNDNdIC0gdGhyaWZ0IHBlcmwgZGViaWFuIHBhY2thZ2UgaXMgcGxhY2luZyBmaWxlcyBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAqIFtUSFJJRlQtNDA0NF0gLSBCdWlsZCBqb2IgMTcgZmFpbGluZyBvbiBldmVyeSBwdWxsIHJlcXVlc3Q7IGhzcGVjIGNvcmUgKGhhc2tlbGwpIDIuNCBpc3N1ZQorICAgICogW1RIUklGVC00MDQ2XSAtIE1pbkdXIHdpdGggZ2NjIDYuMiBkb2VzIG5vdCBjb21waWxlIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDA2MF0gLSBUaHJpZnQgcHJpbnRUbyBvc3RyZWFtIG92ZXJsb2FkIG1lY2hhbmlzbSBicmVha3MgZG93biB3aGVuIHR5cGVzIGFyZSBuZXN0ZWQKKyAgICAqIFtUSFJJRlQtNDA2Ml0gLSBSZW1vdmUgZGVidWcgcHJpbnQgZnJvbSBUU2VydmljZUNsaWVudAorICAgICogW1RIUklGVC00MDY1XSAtIERvY3VtZW50IFBlcmwgRm9ya2luZ1NlcnZlciBzaWduYWwgcmVzdHJpY3Rpb24gaW1wb3NlZCBieSBUSFJJRlQtMzg0OCBhbmQgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvZGUKKyAgICAqIFtUSFJJRlQtNDA2OF0gLSBBIGNvZGUgY29tbWVudCBpbiBKYXZhIFNlcnZlclNvY2tldCBpcyB3cm9uZyBhcm91bmQgYWNjZXB0KCkKKyAgICAqIFtUSFJJRlQtNDA3M10gLSBlbnVtIGZpbGVzIGFyZSBzdGlsbCBiZWluZyBnZW5lcmF0ZWQgd2l0aCB1bnVzZWQgaW1wb3J0cworICAgICogW1RIUklGVC00MDc2XSAtIEFwcHZleW9yIGJ1aWxkcyBmYWlsaW5nIGJlY2F1c2UgYW50IDEuOS44IHdhcyByZW1vdmVkIGZyb20gYXBhY2hlIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtNDA3N10gLSBBSV9BRERSQ09ORklHIHJlZGVmaW5lZCBhZnRlciByZWNlbnQgY2hhbmdlIHRvIFBsYXRmb3JtU29ja2V0IGhlYWRlcgorICAgICogW1RIUklGVC00MDc5XSAtIEdlbmVyYXRlZCBwZXJsIGNvZGUgdGhhdCByZXR1cm5zIHN0cnVjdHVyZXMgZnJvbSBpbmNsdWRlZCB0aHJpZnQgZmlsZXMgaXMgbWlzc2luZyBhIG5lY2Vzc2FyeSB1c2UgY2xhdXNlCisgICAgKiBbVEhSSUZULTQwODddIC0gU3B1cmlvdXMgZXhjZXB0aW9uIGRlc3Ryb3lpbmcgVFRocmVhZGVkU2VydmVyIGJlY2F1c2Ugb2YgaW5jb3JyZWN0IGpvaW4oKSBjYWxsCisgICAgKiBbVEhSSUZULTQxMDJdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IHBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIDAuMTAuMAorICAgICogW1RIUklGVC00MTA2XSAtIGNvbmN1cnJlbmN5X3Rlc3QgZmFpbHMgcmFuZG9tbHkKKyAgICAqIFtUSFJJRlQtNDEwOF0gLSBjX2dsaWIgdGhyaWZ0IHNzbCBoYXMgbXVsdGlwbGUgYnVncyBhbmQgZGVwcmVjYXRlZCBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtNDEwOV0gLSBDb25maWd1cmUgU2NyaXB0IHVzZXMgc3RyaW5nIGNvbXBhcmlzb24gZm9yIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTQxMjldIC0gQysrIFROb25ibG9ja2luZ1NlcnZlciBmZCBsZWFrIHdoZW4gZmFpbGluZyB0byBkaXNwYXRjaCBuZXcgY29ubmVjdGlvbnMKKyAgICAqIFtUSFJJRlQtNDEzMV0gLSBKYXZhc2NyaXB0IHdpdGggV2ViU29ja2V0IGhhbmRsZXMgb25ld2F5IG1ldGhvZHMgd3JvbmcKKyAgICAqIFtUSFJJRlQtNDEzNF0gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMKKyAgICAqIFtUSFJJRlQtNDE0MF0gLSBVc2Ugb2Ygbm9uLXRocmVhZC1zYWZlIGZ1bmN0aW9uIGdtdGltZSgpCisgICAgKiBbVEhSSUZULTQxNDFdIC0gSW5zdGFsbGF0aW9uIG9mIGhheGUgaW4gZG9ja2VyIGZpbGVzIHJlZmVycyB0byBhIHJlZGlyZWN0IGxpbmsgYW5kIGZhaWxzCisgICAgKiBbVEhSSUZULTQxNDddIC0gUnVzdDogcHJvdG9jb2wgc2hvdWxkIGFjY2VwdCB0cmFuc3BvcnRzIHdpdGggbm9uLXN0YXRpYyBsaWZldGltZQorICAgICogW1RIUklGVC00MTQ4XSAtIFttYXZlbi10aHJpZnQtcGx1Z2luXSBjb21waWxlIGVycm9yIHdoaWxlIGltcG9ydCBhIHRocmlmdCBpbiBkZXBlbmRlbmN5IGphciBmaWxlLgorICAgICogW1RIUklGVC00MTQ5XSAtIFN5c3RlbS5vdXQgcG9sbHV0ZXMgbG9nIGZpbGVzIAorICAgICogW1RIUklGVC00MTU0XSAtIFBIUCBjbG9zZSgpIG9mIGEgVFNvY2tldCBuZWVkcyB0byBjbG9zZSBhbnkgdHlwZSBvZiBzb2NrZXQKKyAgICAqIFtUSFJJRlQtNDE1OF0gLSBtaW5vciBpc3N1ZSBpbiBSRUFETUUtTVNZUzIubWQKKyAgICAqIFtUSFJJRlQtNDE1OV0gLSBCdWlsZGluZyB0ZXN0cyBmYWlscyBvbiBNU1lTMiAoTWluR1c2NCkgZHVlIHRvIGEgKHNtYWxsPykgbGlua2VyIGVycm9yCisgICAgKiBbVEhSSUZULTQxNjBdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBmaXggdXNlIG9mIGNsb3NlZC9mcmVlZCBjb25uZWN0aW9ucworICAgICogW1RIUklGVC00MTYxXSAtIFROb25CbG9ja2luZyBzZXJ2ZXIgdXNpbmcgdW5pbml0aWFsaXplZCBldmVudCBpbiBlcnJvciBwYXRocworICAgICogW1RIUklGVC00MTYyXSAtIFROb25CbG9ja2luZyBoYW5kbGluZyBvZiBUU29ja2V0cyBpbiBlcnJvciBzdGF0ZSBpcyBpbmNvcnJlY3QgYWZ0ZXIgZmQgaXMgY2xvc2VkCisgICAgKiBbVEhSSUZULTQxNjRdIC0gQ29yZSBpbiBUU1NMU29ja2V0IGNsZWFudXBPcGVuU1NMIHdoZW4gZGVzdHJveWluZyBhIG11dGV4IHVzZWQgYnkgb3BlbnNzbAorICAgICogW1RIUklGVC00MTY1XSAtIEMrKyBidWlsZCBoYXMgbWFueSB3YXJuaW5ncyB1bmRlciBjKyswMyBkdWUgdG8gcmVjZW50IGNoYW5nZXMsIGNtYWtlIG5lZWRzIGJldHRlciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsYW5ndWFnZSBsZXZlbCBjb250cm9sCisgICAgKiBbVEhSSUZULTQxNjZdIC0gUmVjZW50IGZpeCB0byByZW1vdmUgYm9vc3Q6OmxleGljYWxfY2FzdCB1c2FnZSBicm9rZSBWUzIwMTAKKyAgICAqIFtUSFJJRlQtNDE2N10gLSBNaXNzaW5nIGNvbXBpbGUgZmxhZworICAgICogW1RIUklGVC00MTcwXSAtIFN1cHBvcnQgbHVhIDUuMSBvciBlYXJsaWVyIHByb3Blcmx5IGZvciBvYmplY3QgbGVuZ3RoIGRldGVybWluYXRpb24KKyAgICAqIFtUSFJJRlQtNDE3Ml0gLSBub2RlLmpzIHR1dG9yaWFsIGNsaWVudCBkb2VzIG5vdCBpbXBvcnQgYXNzZXJ0LCBjb25uZWN0aW9uIGlzc3VlcyBhcmUgbm90IGhhbmRsZWQgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtNDE3N10gLSBKYXZhIGNvbXBpbGVyIHByb2R1Y2VzIGRlZXAgY29weSBjb25zdHJ1Y3RvciB0aGF0IGNvdWxkIG1ha2Ugc2hhbGxvdyBjb3B5IGluc3RlYWQKKyAgICAqIFtUSFJJRlQtNDE4NF0gLSBCdWlsZGluZyBvbiBBcHB2ZXlvcjogaW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgXEwKKyAgICAqIFtUSFJJRlQtNDE4NV0gLSBmYjMwMyBjb3VudGVyIGVuY29kaW5nIGZpeAorICAgICogW1RIUklGVC00MTg5XSAtIEZyYW1lZC9idWZmZXJlZCB0cmFuc3BvcnQgRGlzcG9zZSgpIGRvZXMgbm90IGRpc3Bvc2UgdGhlIG5lc3RlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtNDE5M10gLSBMb3dlciB0aGUgZGVmYXVsdCBtYXhSZWFkQnVmZmVyQnl0ZXMgZm9yIG5vbi1ibG9ja2luZyBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTQxOTVdIC0gQ29tcGlsYXRpb24gdG8gR08gcHJvZHVjZXMgYnJva2VuIGNvZGUKKyAgICAqIFtUSFJJRlQtNDE5Nl0gLSBDYW5ub3QgZ2VuZXJhdGUgcmVjdXJzaXZlIFJ1c3QgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDIwNF0gLSB0eXBvIGluIGNvbXBhY3Qgc3BlYworICAgICogW1RIUklGVC00MjA2XSAtIFN0cmluZ3MgaW4gY29udGFpbmVyIGZpZWxkcyBhcmUgbm90IGRlY29kZWQgcHJvcGVybHkgd2l0aCBweTpkeW5hbWljIGFuZCBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC00MjA4XSAtIEMjIE5hbWVkUGlwZXNTZXJ2ZXIgbm90IHJlYWxseSB3b3JraW5nIGluIHNvbWUgc2NlbmFyaW9zCisgICAgKiBbVEhSSUZULTQyMTFdIC0gRml4IEdFcnJvciBnbGliIG1hbmFnZW1lbnQgdW5kZXIgVGhyaWZ0CisgICAgKiBbVEhSSUZULTQyMTJdIC0gY19nbGliIGZsdXNoIHRyaWVzIHRvIGNsb3NlIFNTTCBldmVuIGlmIHNvY2tldCBpcyBpbnZhbGlkCisgICAgKiBbVEhSSUZULTQyMTNdIC0gVHJhdmlzIGJ1aWxkIGZhaWxzIGF0IGN1cmwgLXNTTCBodHRwczovL3d3dy5ucG1qcy5jb20vaW5zdGFsbC5zaCB8IHNoCisgICAgKiBbVEhSSUZULTQyMTVdIC0gR29sYW5nIFRUcmFuc3BvcnRGYWN0b3J5IFBhdHRlcm4gU3F1ZWxjaGVzIEVycm9ycworICAgICogW1RIUklGVC00MjE2XSAtIEdvbGFuZyBIdHRwIENsaWVudHMgRG8gTm90IFJlc3BlY3QgVXNlciBPcHRpb25zCisgICAgKiBbVEhSSUZULTQyMThdIC0gU2V0IFRDUF9OT0RFTEFZIGZvciBQSFAgY2xpZW50IHNvY2tldAorICAgICogW1RIUklGVC00MjE5XSAtIEdvbGFuZyBIVFRQIGNsaWVudHMgY3JlYXRlZCB3aXRoIE5pbCBidWZmZXIKKyAgICAqIFtUSFJJRlQtNDIzMV0gLSBUSlNPTlByb3RvY29sIHRocm93cyB1bmV4cGVjdGVkIG5vbi1UaHJpZnQtZXhjZXB0aW9uIG9uIG51bGwgc3RyaW5ncworICAgICogW1RIUklGVC00MjMyXSAtIC4vY29uZmlndXJlIGRvZXMgYmFkIGFudCB2ZXJzaW9uIGNoZWNrCisgICAgKiBbVEhSSUZULTQyMzRdIC0gVHJhdmlzIGJ1aWxkIGZhaWxzIGNyb3NzIGxhbmd1YWdlIHRlc3RzIHdpdGggIlVuc3VwcG9ydGVkIHNlY3VyaXR5IHByb3RvY29sIHR5cGUiCisgICAgKiBbVEhSSUZULTQyMzddIC0gR28gVFNlcnZlclNvY2tldCBSYWNlIENvbmRpdGlvbnMKKyAgICAqIFtUSFJJRlQtNDI0MF0gLSBHbyBUU2ltcGxlU2VydmVyIGRvZXMgbm90IGNsb3NlIHByb3Blcmx5CisgICAgKiBbVEhSSUZULTQyNDNdIC0gR28gVFNpbXBsZVNlcnZlciByYWNlIG9uIHdhaXQgaW4gU3RvcCgpIG1ldGhvZAorICAgICogW1RIUklGVC00MjQ1XSAtIEdvbGFuZyBURnJhbWVkVHJhbnNwb3J0J3Mgd3JpdGVCdWZmZXIgaW5jcmVhc2VzIGlmIHdyaXRlcyB0byB0cmFuc3BvcnQgZmFpbGVkCisgICAgKiBbVEhSSUZULTQyNDZdIC0gU2VxdWVuY2UgbnVtYmVyIG1pc21hdGNoIG9uIG11bHRpcGxleGVkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtNDI0N10gLSBDb21waWxlIGZhaWxzIHdpdGggb3BlbnNzbCAxLjEKKyAgICAqIFtUSFJJRlQtNDI0OF0gLSBDb21waWxlIGZhaWxzIC0gc3RybmNweSwgbWVtY21wLCBtZW1zZXQgbm90IGRlY2xhcmVkIGluIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTQyNTFdIC0gSmF2YSBFcG9sbCBTZWxlY3RvciBCdWcKKyAgICAqIFtUSFJJRlQtNDI1N10gLSBUeXBlc2NyaXB0IGFzeW5jIGNhbGxiYWNrcyBkbyBub3QgcHJvdmlkZSB0aGUgY29ycmVjdCB0eXBlcworICAgICogW1RIUklGVC00MjU4XSAtIEJvb3N0L3N0ZCB0aHJlYWQgd3JhcHBpbmcgZmF1bHRpbmVzcworICAgICogW1RIUklGVC00MjYwXSAtIEdvIGNvbnRleHQgZ2VuZXJhdGlvbiBpc3N1ZS4gQ29udGV4dCBpcyBwYXJhbWV0ZXIgaW4gSW50ZXJmYWNlIG5vdCBpbiBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC00MjYxXSAtIEdvIGNvbnRleHQgZ2VuZXJhdGlvbiBpc3N1ZTogYnJlYWtpbmcgY2hhbmdlIGluIGdlbmVyYXRlZCBjb2RlIHJlZ2FyZGluZyB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZQorICAgICogW1RIUklGVC00MjYyXSAtIEludmFsaWQgYmluZGluZyB0byBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCkgd2l0aCA2NC1iaXQgdGFyZ2V0cworICAgICogW1RIUklGVC00MjYzXSAtIEZpeCB1c2UgYWZ0ZXIgZnJlZSBidWcgZm9yIHRocm93biBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQyNjZdIC0gRXJsYW5nIGxpYnJhcnkgdGhyb3dzIGR1cmluZyBza2lwcGluZyBmaWVsZHMgb2YgY29tcG9zaXRlIHR5cGUgKG1hcHMsIGxpc3RzLCBzdHJ1Y3RzLCBzZXRzKQorICAgICogW1RIUklGVC00MjY4XSAtIEVybGFuZyBsaWJyYXJ5IGVtaXRzIGRlYnVnZ2luZyBvdXRwdXQgaW4gdHJhbnNwb3J0IGxheWVyCisgICAgKiBbVEhSSUZULTQyNzNdIC0gZXJsYW5nOm5vdy8wOiBEZXByZWNhdGVkIEJJRi4gCisgICAgKiBbVEhSSUZULTQyNzRdIC0gUHl0aG9uIGZlYXR1cmUgdGVzdHMgZm9yIFNTTC9UTFMgZmFpbGluZworICAgICogW1RIUklGVC00Mjc5XSAtIFdyb25nIHBhdGggaW4gaW5jbHVkZSBkaXJlY3RpdmUgaW4gZ2VuZXJhdGVkIFRocmlmdCBzb3VyY2VzCisgICAgKiBbVEhSSUZULTQyODNdIC0gVE5hbWVkUGlwZVNlcnZlciByYWNlIGNvbmRpdGlvbiBpbiBpbnRlcnJ1cHQKKyAgICAqIFtUSFJJRlQtNDI4NF0gLSBGaWxlIGNvbnRhaW5zIGEgTkJTUDogbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKKyAgICAqIFtUSFJJRlQtNDI5MF0gLSBDIyBudWxsYWJsZSBvcHRpb24gZ2VuZXJhdGVzIGludmFsaWQgY29kZSBmb3Igbm9uLXJlcXVpcmVkIGVudW0gZmllbGQgd2l0aCBkZWZhdWx0IHZhbHVlCisgICAgKiBbVEhSSUZULTQyOTJdIC0gVGltZXJNYW5hZ2VyOjpyZW1vdmUoKSBpcyBub3QgaW1wbGVtZW50ZWQKKyAgICAqIFtUSFJJRlQtNDMwN10gLSBNYWtlIHNzbC1vcGVuIHRpbWVvdXQgZWZmZWN0aXZlIGluIGdvbGFuZyBjbGllbnQKKyAgICAqIFtUSFJJRlQtNDMxMl0gLSBFcmxhbmcgY2xpZW50IGNhbm5vdCBjb25uZWN0IHRvIFB5dGhvbiBzZXJ2ZXI6IGV4Y2VwdGlvbiBlcnJvcjogZWNvbm5yZWZ1c2VkCisgICAgKiBbVEhSSUZULTQzMTNdIC0gUHJvZ3JhbSBjb2RlIG9mIHRoZSBFcmxhbmcgdHV0b3JpYWwgZmlsZXMgY29udGFpbiBzeW50YXggZXJyb3JzCisgICAgKiBbVEhSSUZULTQzMTZdIC0gVEJ5dGVCdWZmZXIuamF2YSB3aWxsIHJlYWQgdG9vIG11Y2ggZGF0YSBpZiBhIHByZXZpb3VzIHJlYWQgcmV0dXJucyBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZAorICAgICogW1RIUklGVC00MzE5XSAtIGNvbW1hbmQgbGluZSBzd2l0Y2ggZm9yICJldmh0dHAiIGluY29ycmVjdGx5IHJlc29sdmVkIHRvIGFub24gcGlwZXMKKyAgICAqIFtUSFJJRlQtNDMyM10gLSByYW5nZSBjaGVjayBlcnJvcnMgb3IgTlBFIGluIGVkZ2UgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDMyNF0gLSBmaWVsZCBuYW1lcyBjYW4gY29uZmxpY3Qgd2l0aCBsb2NhbCB2YXJzIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTQzMjhdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgdGltaW5nIG91dCAoam9iIDEpIGFuZCBoYXhlIGJ1aWxkcyBhcmUgZmFpbGluZyBzaW5jZSA5LzExCisgICAgKiBbVEhSSUZULTQzMjldIC0gY19nbGliIERvZXNuJ3QgaGF2ZSBhIG11bHRpcGxleGVkIHByb2Nlc3NvcgorICAgICogW1RIUklGVC00MzMxXSAtIEMrKzogVFNTTFNvY2tldHMgYnVnIGluIGhhbmRsaW5nIGh1Z2UgbWVzc2FnZXMsIGJ1ZyBpbiBoYW5kbGluZyBwb2xsaW5nCisgICAgKiBbVEhSSUZULTQzMzJdIC0gQmluYXJ5IHByb3RvY29sIGhhcyBtZW1vcnkgbGVha3MKKyAgICAqIFtUSFJJRlQtNDMzNF0gLSBQZXJsIGluZGVudGF0aW9uIGluY29ycmVjdCB3aGVuIGRlZmF1bHRpbmcgZmllbGQgYXR0cmlidXRlIHRvIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTQzMzldIC0gVGhyaWZ0IEZyYW1lZCBUcmFuc3BvcnQgaW4gRXJsYW5nIGNyYXNoZXMgc2VydmVyIHdoZW4gY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgKiBbVEhSSUZULTQzNDBdIC0gRXJsYW5nIGZpeCBhIGNyYXNoIG9uIGNsaWVudCBjbG9zZQorICAgICogW1RIUklGVC00MzU1XSAtIEphdmFzY3JpcHQgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtNDM1Nl0gLSB0aHJpZnRfcHJvdG9jb2wgY2FsbCBUcmFuc3BvcnQgY2F1c2UgU2VnbWVudGF0aW9uIGZhdWx0CisgICAgKiBbVEhSSUZULTQzNTldIC0gSGF4ZSBjb21waWxlciBsb29rcyBsaWtlIGl0IGlzIHByb2R1Y2luZyBpbmNvcnJlY3QgY29kZSBmb3IgbWFwIG9yIHNldCBrZXkgdGhhdCBpcyBiaW5hcnkgdHlwZQorICAgICogW1RIUklGVC00MzYyXSAtIE1pc3Npbmcgc2l6ZS1jaGVjayBjYW4gbGVhZCB0byBodWdlIG1lbW9yeSBhbGxvY2F0aW9uCisgICAgKiBbVEhSSUZULTQzNjRdIC0gV2Vic2l0ZSBjb250cmlidXRpbmcgZ3VpZGUgZXJyb25lb3VzbHkgcmVjb21tZW5kcyBzdWJtaXR0aW5nIHBhdGNoZXMgaW4gSklSQQorICAgICogW1RIUklGVC00MzY1XSAtIFBlcmwgZ2VuZXJhdGVkIGNvZGUgdXNlcyBpbmRpcmVjdCBvYmplY3Qgc3ludGF4LCB3aGljaCBvY2Nhc2lvbmFsbHkgY2F1c2VzIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICAqIFtUSFJJRlQtNDM2N10gLSBweXRob24gVFByb2Nlc3Nvci5wcm9jZXNzIGlzIG1pc3NpbmcgInNlbGYiCisgICAgKiBbVEhSSUZULTQzNzBdIC0gVWJ1bnR1IEFydGZ1bCBjcHBjaGVjayBhbmQgZmxha2U4IGFyZSBtb3JlIHN0cmluZ2VudCBhbmQgY2F1c2luZyBTQ0EgYnVpbGQgam9iIGZhaWx1cmVzCisgICAgKiBbVEhSSUZULTQzNzJdIC0gUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gCisgICAgKiBbVEhSSUZULTQzNzRdIC0gY2Fubm90IGxvYWQgdGhyaWZ0X3Byb3RvY29sIGR1ZSB0byB1bmRlZmluZWQgc3ltYm9sOiBfWlRWTjEwX19jeHhhYml2MTIwX19zaV9jbGFzc190eXBlX2luZm9FCisgICAgKiBbVEhSSUZULTQzNzVdIC0gVE1lbW9yeSB0aHJvdyBiYWRfYWxsb2MgZHVlIHRvIGNvdW50ZXIgb3ZlcmZsb3cKKyAgICAqIFtUSFJJRlQtNDM3Nl0gLSBDb3Zlcml0eSBoaWdoIGltcGFjdCBpc3N1ZSByZXNvbHV0aW9uCisgICAgKiBbVEhSSUZULTQzNzddIC0gaGF4ZS4gc29ja2V0IGhhbmRsZXMgbGVhayBpbiBUU2ltcGxlU2VydmVyCisgICAgKiBbVEhSSUZULTQzODFdIC0gV3JvbmcgaXNzZXQgYml0ZmllbGQgdmFsdWUgYWZ0ZXIgdHJhbnNtaXNzaW9uCisgICAgKiBbVEhSSUZULTQzODVdIC0gR28gcmVtb3RlIGNsaWVudCAtdSBmbGFnIGlzIGJyb2tlbgorICAgICogW1RIUklGVC00MzkyXSAtIGNvbXBpbGVyLy4uLi4vcGx1Z2luLnRocmlmdCBzdHJ1Y3RzIG1pcy1vcmRlcmVkIGJsb3dzIHVwIG9jYW1sIGdlbmVyYXRvcgorICAgICogW1RIUklGVC00Mzk1XSAtIFVuYWJsZSB0byBidWlsZCBpbiB0aGUgdWJ1bnR1LXhlbmlhbCBkb2NrZXIgaW1hZ2U6IGNsYXAgMi4yOCByZXF1aXJlcyBSdXN0IDEuMjAKKyAgICAqIFtUSFJJRlQtNDM5Nl0gLSBpbmNvbnNpc3RlbnQgKG9yIHBsYWluIHdyb25nKSB2ZXJzaW9uIG51bWJlcnMgaW4gbWFzdGVyL3RydW5rIAorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQxNTddIC0gb3V0ZGF0ZWQgcmVhZG1lIGFib3V0IEhheGUgaW5zdGFsbGF0aW9uIG9uIExpbnV4CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTEwNV0gLSBtYWtlIGEgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0dXJlcyB3aXRoIG5lZ2F0aXZlIHRhZ3MKKyAgICAqIFtUSFJJRlQtMjgxXSAtIENvY29hIGxpYnJhcnkgY29kZSBuZWVkcyBjb21tZW50cywgYmFkbHkKKyAgICAqIFtUSFJJRlQtNzc1XSAtIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmb3IgUGVybAorICAgICogW1RIUklGVC0yMjIxXSAtIEdlbmVyYXRlIGMrKyBjb2RlIHdpdGggc3RkOjpzaGFyZWRfcHRyIGluc3RlYWQgb2YgYm9vc3Q6OnNoYXJlZF9wdHIuCisgICAgKiBbVEhSSUZULTIzNjRdIC0gT0NhbWw6IFVzZSBPYXNpcyBleGNsdXNpdmVseSBmb3IgYnVpbGQgcHJvY2VzcworICAgICogW1RIUklGVC0yNTA0XSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBzaG91bGQgYWxsb3cgcmVnaXN0ZXJpbmcgZGVmYXVsdCBwcm9jZXNzb3IgY2FsbGVkIGlmIG5vIHNlcnZpY2UgbmFtZSBpcyBwcmVzZW50CisgICAgKiBbVEhSSUZULTMyMDddIC0gRW5hYmxlIGJ1aWxkIHdpdGggT3BlblNTTCAxLjEuMCBzZXJpZXMKKyAgICAqIFtUSFJJRlQtMzI3Ml0gLSBQZXJsIFNTTCBBdXRoZW50aWNhdGlvbiBTdXBwb3J0CisgICAgKiBbVEhSSUZULTMzNTddIC0gR2VuZXJhdGUgRW51bVNldC9FbnVtTWFwIHdoZXJlIGVsZW1lbnRzL2tleXMgYXJlIGVudW1zCisgICAgKiBbVEhSSUZULTMzNjldIC0gSW1wbGVtZW50IFNTTC9UTFMgc3VwcG9ydCBvbiBDIHdpdGggY19nbGliCisgICAgKiBbVEhSSUZULTM0NjddIC0gR28gTWFwcyBmb3IgVGhyaWZ0IFNldHMgU2hvdWxkIEhhdmUgVmFsdWVzIG9mIFR5cGUgc3RydWN0e30gCisgICAgKiBbVEhSSUZULTM1ODBdIC0gVEhlYWRlciBmb3IgSGFza2VsbAorICAgICogW1RIUklGVC0zNjI3XSAtIE1pc3NpbmcgYmFzaWMgY29kZSBzdHlsZSBjb25zaXN0ZW5jeSBvZiBKYXZhU2NyaXB0LgorICAgICogW1RIUklGVC0zNzA2XSAtIFRoZXJlJ3Mgbm8gc3VwcG9ydCBmb3IgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgb24gY19nbGliIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzc2Nl0gLSBBZGQgZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHRvIFRabGliVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM3NzZdIC0gR28gY29kZSBmcm9tIG11bHRpcGxlIHRocmlmdCBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZQorICAgICogW1RIUklGVC0zODIzXSAtIEVzY2FwZSBkb2N1bWVudGF0aW9uIHdoaWxlIGdlbmVyYXRpbmcgbm9uIGVzY2FwZWQgZG9jdW1ldGF0aW9uCisgICAgKiBbVEhSSUZULTM4NTRdIC0gYWxsb3cgdXNlcnMgdG8gY2xlYXIgcmVhZCBidWZmZXJzCisgICAgKiBbVEhSSUZULTM4NTldIC0gVW5peCBEb21haW4gU29ja2V0IFN1cHBvcnQgaW4gT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMzkyMV0gLSBDKysgY29kZSBzaG91bGQgcHJpbnQgZW51bXMgYXMgc3RyaW5ncworICAgICogW1RIUklGVC0zOTI2XSAtIFRoZXJlIHNob3VsZCBiZSBhbiBlcnJvciBlbWl0dGVkIHdoZW4gaHR0cCBzdGF0dXMgY29kZSBpcyBub3QgMjAwIAorICAgICogW1RIUklGVC00MDA3XSAtIE1pY3JvLW9wdGltaXphdGlvbiBvZiBUVHJhbnNwb3J0LnB5CisgICAgKiBbVEhSSUZULTQwNDBdIC0gQWRkIHJlYWwgY2F1c2Ugb2YgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IGVycm9yIHRvIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC00MDY0XSAtIFVwZGF0ZSBub2RlIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisgICAgKiBbVEhSSUZULTQwNjldIC0gQWxsIHBlcmwgcGFja2FnZXMgc2hvdWxkIGhhdmUgcHJvcGVyIG5hbWVzcGFjZSwgdmVyc2lvbiBzeW50YXgsIGFuZCB1c2UgcHJvcGVyIHRocmlmdCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQwNzFdIC0gQ29uc29saWRhdGUgdGhlIFRyYXZpcyBDSSBqb2JzIHdoZXJlIHBvc3NpYmxlIHRvIHB1dCBsZXNzIHN0cmVzcyBvbiB0aGUgQXBhY2hlIEZvdW5kYXRpb24ncyBhbGxvY2F0aW9uIG9mIENJIGJ1aWxkIHNsYXZlcworICAgICogW1RIUklGVC00MDcyXSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycyBpbiBUQ3VybENsaWVudAorICAgICogW1RIUklGVC00MDc1XSAtIEJldHRlciBNaW5HVyBzdXBwb3J0IGZvciBoZWFkZXJzLW9ubHkgYm9vc3QgKHdpdGhvdXQgdGhyZWFkIGxpYnJhcnkpCisgICAgKiBbVEhSSUZULTQwODFdIC0gUHJvdmlkZSBhIE1pbkdXIDY0LWJpdCBBcHB2ZXlvciBDSSBidWlsZCBmb3IgYmV0dGVyIHB1bGwgcmVxdWVzdCB2YWxpZGF0aW9uCisgICAgKiBbVEhSSUZULTQwODRdIC0gSW1wcm92ZSBTU0wgc2VjdXJpdHkgaW4gdGhyaWZ0IGJ5IGFkZGluZyBhIG1ha2UgY3Jvc3MgY2xpZW50IHRoYXQgY2hlY2tzIHRvIG1ha2Ugc3VyZSBTU0x2MyBwcm90b2NvbCBjYW5ub3QgYmUgbmVnb3RpYXRlZAorICAgICogW1RIUklGVC00MDk1XSAtIEFkZCBtdWx0aXBsZXhlZCBwcm90b2NvbCB0byBUcmF2aXMgQ0kgZm9yIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtNDA5OV0gLSBBdXRvLWRlcml2ZSBIYXNoIGZvciBnZW5lcmF0ZWQgUnVzdCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQxMTBdIC0gVGhlIGRlYmlhbiBidWlsZCBmaWxlcyBkbyBub3QgcHJvZHVjZSBhICItZGJnIiBwYWNrYWdlIGZvciBkZWJ1ZyBzeW1ib2xzIG9mIGxpYnRocmlmdDAKKyAgICAqIFtUSFJJRlQtNDExNF0gLSBTcGFjZSBhZnRlciAnLy8vJyBpbiBkb2MgY29tbWVudHMKKyAgICAqIFtUSFJJRlQtNDEyNl0gLSBWYWxpZGF0ZSBvYmplY3RzIGluIHBocCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtNDEzMF0gLSBFbnN1cmUgQXBhY2hlIEh0dHAgY29ubmVjdGlvbiBpcyByZWxlYXNlZCBiYWNrIHRvIHBvb2wgYWZ0ZXIgdXNlCisgICAgKiBbVEhSSUZULTQxNTFdIC0gVGhyaWZ0IE11dGV4IENvbnRlbnRpb24gUHJvZmlsaW5nIChwdGhyZWFkcykgc2hvdWxkIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtNDE3Nl0gLSBJbXBsZW1lbnQgYSB0aHJlYWRlZCBhbmQgdGhyZWFkcG9vbCBzZXJ2ZXIgdHlwZSBmb3IgUnVzdAorICAgICogW1RIUklGVC00MTgzXSAtIE5hbWVkIHBpcGUgY2xpZW50IGJsb2NrcyBmb3JldmVyIG9uIE9wZW4oKSB3aGVuIHRoZXJlIGlzIG5vIHNlcnZlciBhdCB0aGUgb3RoZXIgZW5kCisgICAgKiBbVEhSSUZULTQxOTBdIC0gaW1wcm92ZSBDIyBUVGhyZWFkUG9vbFNlcnZlciBkZWZhdWx0cworICAgICogW1RIUklGVC00MTk3XSAtIEltcGxlbWVudCB0cmFuc3BhcmVudCBnemlwIGNvbXByZXNzaW9uIGZvciBIVFRQIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00MTk4XSAtIFJ1Ynkgc2hvdWxkIGxvZyBUaHJpZnQgaW50ZXJuYWwgZXJyb3JzIHRvIGdsb2JhbCBsb2dnZXIKKyAgICAqIFtUSFJJRlQtNDIwM10gLSB0aHJpZnQgc2VydmVyIHN0b3AgZ3JhY2VmdWxseQorICAgICogW1RIUklGVC00MjA1XSAtIGNfZ2xpYiBpcyBub3QgbGlua2luZyBhZ2FpbnN0IGdsaWIgKyBnb2JqZWN0CisgICAgKiBbVEhSSUZULTQyMDldIC0gd2FybmluZyBDUzA0MTQgaW4gVFtUTFNdU2VydmVyU29ja2V0LmNzCisgICAgKiBbVEhSSUZULTQyMTBdIC0gaW5jbHVkZSBUaHJpZnQuNDUuY3Nwcm9qIGludG8gQ0kgcnVucyAKKyAgICAqIFtUSFJJRlQtNDIxN10gLSBIdHRwQ2xpZW50IHNob3VsZCBzdXBwb3J0IGd6aXAgYW5kIGRlZmxhdGUKKyAgICAqIFtUSFJJRlQtNDIyMl0gLSBTdXBwb3J0IFVuaXggRG9tYWluIFNvY2tldHMgaW4gR29sYW5nIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtNDIzM10gLSBNYWtlIFRIc0hhU2VydmVyLmludm9rZXIgYXZhaWxhYmxlIChnZXQgbWV0aG9kIG9ubHkpIGluIGluaGVyaXRlZCBjbGFzc2VzCisgICAgKiBbVEhSSUZULTQyMzZdIC0gU3VwcG9ydCBjb250ZXh0IGluIGdvIGdlbmVyYXRlZCBjb2RlLgorICAgICogW1RIUklGVC00MjM4XSAtIEpTT04gZ2VuZXJhdG9yOiBtYWtlIGFubm90YXRpb24tYXdhcmUKKyAgICAqIFtUSFJJRlQtNDI2OV0gLSBEb24ndCBhcHBlbmQgJy4nIHRvIEVybGFuZyBuYW1lc3BhY2UgaWYgaXQgZW5kcyBpbiAnXycuCisgICAgKiBbVEhSSUZULTQyNzBdIC0gR2VuZXJhdGUgRXJsYW5nIG1hcHBpbmcgZnVuY3Rpb25zIGZvciBjb25zdCBtYXBzIGFuZCBsaXN0cworICAgICogW1RIUklGVC00Mjc1XSAtIEFkZCBzdXBwb3J0IGZvciB6b3BlLmludGVyZmFjZSBvbmx5LCBhcGFydCBmcm9tIHR3aXN0ZWQgc3VwcG9ydC4KKyAgICAqIFtUSFJJRlQtNDI4NV0gLSBQdWxsIGdlbmVyYXRlZCBzZW5kL3JlY3YgaW50byBsaWJyYXJ5IHRvIGFsbG93IGJlaGF2aW91ciB0byBiZSBjdXN0b21pc2VkCisgICAgKiBbVEhSSUZULTQyODddIC0gQWRkIGMrKyBjb21waWxlciAibm9fc2tlbGV0b24iIGZsYWcgb3B0aW9uCisgICAgKiBbVEhSSUZULTQyODhdIC0gSW1wbGVtZW50IGxvZ2dpbmcgbGV2ZWxzIHByb3Blcmx5IGZvciBub2RlLmpzCisgICAgKiBbVEhSSUZULTQyOTVdIC0gUmVmcmVzaCB0aGUgRG9ja2VyIGltYWdlIGZpbGUgc3VpdGUgZm9yIFVidW50dSwgRGViaWFuLCBhbmQgQ2VudE9TCisgICAgKiBbVEhSSUZULTQzMDVdIC0gRW1pdCBkZG9jIGZvciBnZW5lcmF0ZWQgaXRlbXMKKyAgICAqIFtUSFJJRlQtNDMwNl0gLSBUaHJpZnQgaW1wb3J0cyBub3QgcmVwbGljYXRlZCB0byBEIHNlcnZpY2Ugb3V0cHV0CisgICAgKiBbVEhSSUZULTQzMTVdIC0gQWRkIGRlZmF1bHQgbWVzc2FnZSBmb3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQzMThdIC0gRGVscGhpIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC00MzI1XSAtIFNpbXBsaWZ5IGF1dG9tYWtlIGNyb3NzIGNvbXBpbGF0aW9uIGJ5IHJlbHlpbmcgb24gb25lIGdsb2JhbCBUSFJJRlQgY29tcGlsZXIgcGF0aAorICAgICogW1RIUklGVC00MzI3XSAtIEltcHJvdmUgVGltZXJNYW5hZ2VyIEFQSSB0byBhbGxvdyByZW1vdmluZyBzcGVjaWZpYyB0YXNrCisgICAgKiBbVEhSSUZULTQzMzBdIC0gQWxsb3cgdW51c2VkIGNyYXRlcyBpbiBSdXN0IGZpbGVzCisgICAgKiBbVEhSSUZULTQzMzNdIC0gRXJsYW5nIHR1dG9yaWFsIGV4YW1wbGVzIGFyZSB1c2luZyBhIGRpZmZlcmVudCBwb3J0ICg5OTk5KQorICAgICogW1RIUklGVC00MzQzXSAtIENoYW5nZSBDSSBidWlsZHMgdG8gdXNlIG5vZGUuanMgOC54IExUUyBvbmNlIGF2YWlsYWJsZQorICAgICogW1RIUklGVC00MzQ1XSAtIENyZWF0ZSBhIGRvY2tlciBidWlsZCBlbnZpcm9ubWVudCB0aGF0IHVzZXMgdGhlIG1pbmltdW0gc3VwcG9ydGVkIGxhbmd1YWdlIGxldmVscworICAgICogW1RIUklGVC00MzQ2XSAtIEFsbG93IFpsaWIgdHJhbnNwb3J0IGZhY3RvcnkgdG8gd3JhcCBvdGhlciB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTQzNDhdIC0gUGVybCBIVFRQIENsaWVudCBjdXN0b20gSFRUUCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTQzNTBdIC0gVXBkYXRlIG5ldGNvcmUgYnVpbGQgZm9yIGRvdG5ldCAyLjAgc2RrIGFuZCBtYWtlIGNyb3NzIHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtNDM1MV0gLSBVc2UgVHJhdmlzIENJIEJ1aWxkIFN0YWdlcyB0byBvcHRpbWl6ZSB0aGUgQ0kgYnVpbGQKKyAgICAqIFtUSFJJRlQtNDM1M10gLSBjYW5ub3QgcmVhZCB2aWEgdGhyaWZ0X3Byb3RvY29sIGF0IHNlcnZlciBzaWRlCisgICAgKiBbVEhSSUZULTQzNzhdIC0gYWRkIHNldCBzdG9wVGltZW91dFVuaXQgbWV0aG9kIHRvIFRUaHJlYWRQb29sU2VydmVyCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTc1MF0gLSBDKysgQ29tcGlsZXIgVmlydHVhbCBGdW5jdGlvbiBPcHRpb24KKyAgICAqIFtUSFJJRlQtMjk0NV0gLSBJbXBsZW1lbnQgc3VwcG9ydCBmb3IgUnVzdCBsYW5ndWFnZQorICAgICogW1RIUklGVC0zODU3XSAtIHRocmlmdCBqczpub2RlIGNvbXBsaWVyIHN1cHBvcnQgYW4gb2JqZWN0IGFzIHBhcmFtZXRlciBub3QgYW4gaW5zdGFuY2Ugb2Ygc3RydWN0CisgICAgKiBbVEhSSUZULTM5MzNdIC0gUG9ydCBvZmZpY2lhbCBDIyAuTkVUIGxpYnJhcnkgZm9yIFRocmlmdCB0byBDIyAuTkVUIENvcmUgbGliYXJ5CisgICAgKiBbVEhSSUZULTQwMzldIC0gVXBkYXRlIG9mIEFwYWNoZSBUaHJpZnQgLk5ldCBDb3JlIGxpYiAKKyAgICAqIFtUSFJJRlQtNDExM10gLSBQcm92aWRlIGEgYnVmZmVyIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nIGluIG1lbW9yeSBieXRlIHN0cmVhbQorCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0yOTU2XSAtIGF1dG9jb25mIC0gcG9zc2libHkgdW5kZWZpbmVkIG1hY3JvIC0gQUNfUFJPR19CSVNPTgorICAgICogW1RIUklGVC00MjIzXSAtIEFkZCBzdXBwb3J0IHRvIHRoZSBpc1NlcnZpbmcoKSBtZXRob2QgZm9yIHRoZSBDKysgbGlicmFyeQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTM2MjJdIC0gRml4IGRlcHJlY2F0ZWQgdXNlcyBvZiBzdGQ6OmF1dG9fcHRyCisgICAgKiBbVEhSSUZULTQwMjhdIC0gUGxlYXNlIHJlbW92ZSBTeXN0ZW0ub3V0LmZvcm1hdCBmcm9tIHRoZSBzb3VyY2UgY29kZQorICAgICogW1RIUklGVC00MTg2XSAtIEJ1aWxkIGFuZCB0ZXN0IHJ1c3QgY2xpZW50IGluIFRyYXZpcworCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTQyNjRdIC0gUEhQIC0gU3VwcG9ydCBib3RoIHNoYXJlZCAmIHN0YXRpYyBsaW5raW5nIG9mIHNvY2tldHMgbGlicmFyeQorCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTQzNDRdIC0gRGVmaW5lIGFuZCBtYWludGFpbiB0aGUgbWluaW11bSBsYW5ndWFnZSBsZXZlbCBmb3IgYWxsIGxhbmd1YWdlcyBpbiBvbmUgcGxhY2UKKworCQorVGhyaWZ0IDAuMTAuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xODQwXSAtIFRocmlmdCBHZW5lcmF0ZWQgQ29kZSBDYXVzZXMgR2xvYmFsIFZhcmlhYmxlIExlYWtzCisgICAgKiBbVEhSSUZULTE4MjhdIC0gbW9jX1RRVGNwU2VydmVyLmNwcCB3YXMgcmVtb3ZlZCBmcm9tIHNvdXJjZSB0cmVlIGJ1dCBpcyBpbiB0aHJpZnQtMC45LjAudGFyLmd6CisgICAgKiBbVEhSSUZULTE3OTBdIC0gY29jb2E6IER1cGxpY2F0ZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBlcnJvcgorICAgICogW1RIUklGVC0xNzc2XSAtIFRQaXBlU2VydmVyIHNob3VsZCBpbXBsZW1lbnQgImxpc3RlbiIsIHNvIHRoYXQgVFNlcnZlckV2ZW50SGFuZGxlciBwcmVTZXJ2ZSB3aWxsIHdvcmsgcmlnaHQKKyAgICAqIFtUSFJJRlQtMTM1MV0gLSBDb21waWxlciBkb2VzIG5vdCBjYXJlIGFib3V0IGJpbmFyeSBzdHJpbmdzCisgICAgKiBbVEhSSUZULTEyMjldIC0gUHl0aG9uIGZhc3RiaW5hcnkuYyBjYW4gbm90IGhhbmRsZSB1bmljb2RlIGFzIGdlbmVyYXRlZCBweXRob24gY29kZQorICAgICogW1RIUklGVC03NDldIC0gQysrIFRCdWZmZXJlZFRyYW5zcG9ydHMgZG8gbm90IGZsdXNoIHRoZWlyIGJ1ZmZlcnMgb24gZGVsZXRlCisgICAgKiBbVEhSSUZULTc0N10gLSBDKysgVFNvY2tldC0+Y2xvc2UgY2FsbHMgc2h1dGRvd24gYnJlYWtpbmcgZm9ya2VkIHBhcmVudCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTczMl0gLSBzZXJ2ZXIgZXhpdHMgYWJub3JtYWxseSB3aGVuIGNsaWVudCBjYWxscyBzZW5kX3h4eCBmdW5jdGlvbiB3aXRob3V0IGNhbGxpbmcgcmVjdl94eHggZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzk0Ml0gLSBUU1NMU29ja2V0IGRvZXMgbm90IGhvbm9yIHNlbmQgYW5kIHJlY2VpdmUgdGltZW91dHMKKyAgICAqIFtUSFJJRlQtMzk0MV0gLSBXaW5YUCB2ZXJzaW9uIG9mIHRocmlmdF9wb2xsKCkgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvciBieSBwYXNzaW5nIGEgZGVzdHJ1Y3RlZCB2YXJpYWJsZSB0byBzZWxlY3QoKQorICAgICogW1RIUklGVC0zOTQwXSAtIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlIGZvciBjb21waWxlciBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzk0M10gLSBDb3Zlcml0eSBTY2FuIGlkZW50aWZpZWQgc29tZSBoaWdoIHNldmVyaXR5IGRlZmVjdHMKKyAgICAqIFtUSFJJRlQtMzkyOV0gLSBQSFAgIm5zZ2xvYmFsIiBPcHRpb24gUmVzdWx0cyBpbiBTeW50YXggRXJyb3IgaW4gR2VuZXJhdGVkIENvZGUgKFRyYWlsaW5nIEJhY2tzbGFzaCkKKyAgICAqIFtUSFJJRlQtMzkzNl0gLSBDYW5ub3QgY29tcGlsZSAwLjEwLjAgZGV2ZWxvcG1lbnQgdGlwIHdpdGggVlMyMDEzIGFuZCBlYXJsaWVyIChzbnByaW50ZiwgdWludDMyX3QpCisgICAgKiBbVEhSSUZULTM5MzVdIC0gSW5jb3JyZWN0IHNraXBwaW5nIG9mIG1hcCBhbmQgc2V0CisgICAgKiBbVEhSSUZULTM5MjBdIC0gUnVieTogRW5zdXJpbmcgdGhhdCBIVFRQIGZhaWx1cmVzIHdpbGwgY2xlYXIgdGhlIGh0dHAgdHJhbnNwb3J0IG91dGJ1ZiB2YXIKKyAgICAqIFtUSFJJRlQtMzkxOV0gLSBDIyBUVExTU2VydmVyU29ja2V0IGRvZXMgbm90IHVzZSBjbGllbnRUaW1lb3V0CisgICAgKiBbVEhSSUZULTM5MTddIC0gQ2hlY2sgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgdmVyc2lvbgorICAgICogW1RIUklGVC0zOTA5XSAtIEZpeCBjX2dsaWIgc3RhdGljIGxpYiBDTWFrZSBidWlsZAorICAgICogW1RIUklGVC0zOTA0XSAtIFR5cG8gaW4gbm9kZSB0dXRvcmlhbCBsZWFkcyB0byB3cm9uZyB0cmFuc3BvcnQgYmVpbmcgdXNlZAorICAgICogW1RIUklGVC0zODQ4XSAtIEFzIGFuIGltcGxlbWVudGVyIG9mIGEgcGVybCBzb2NrZXQgc2VydmVyLCBJIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gcmVtZW1iZXIgdG8gaWdub3JlIFNJR0NITEQgZm9yIGl0IHRvIHdvcmsgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMzg0NF0gLSB0aHJpZnRfcHJvdG9jb2wgY2Fubm90IGNvbXBpbGUgaW4gNy4wLjcKKyAgICAqIFtUSFJJRlQtMzg0M10gLSBpbnRlZ2VyIGlzc3VlcyB3aXRoIEhheGUgUEhQIHRhcmdldHMgY2F1c2UgWmlnWmFnIGVuY29kaW5nIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtMzg0Ml0gLSBEYXJ0IGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3IgYSBjb25zdCBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMzg0MV0gLSBkYXJ0IGNvbXBhY3QgcHJvdG9jb2wgaW5jb3JyZWN0bHkgc2VyaWFsaXplcy9kZXNlcmlhbGl6ZWQgZG91YmxlcworICAgICogW1RIUklGVC0zNzA4XSAtIE5hbWVFcnJvcjogZ2xvYmFsIG5hbWUgJ1RQcm90b2NvbCcgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMzcwNF0gLSAiVENvbm5lY3RlZENsaWVudCBkaWVkOiBDb3VsZCBub3QgcmVmaWxsIGJ1ZmZlciIgbWVzc2FnZSBzaG93biB3aGVuIHVzaW5nIEhUVFAgU2VydmVyCisgICAgKiBbVEhSSUZULTM2NzhdIC0gRml4IGphdmFkb2MgZXJyb3JzIG9uIEpESyA4CisgICAgKiBbVEhSSUZULTMwMTRdIC0gQXBwVmV5b3Igc3VwcG9ydAorICAgICogW1RIUklGVC0yOTk0XSAtIE5vZGUuanMgVEpTT05Qcm90b2NvbCBjYW5ub3QgYmUgdXNlZCBmb3Igb2JqZWN0IHNlcmlhbGl6YXRpb24uCisgICAgKiBbVEhSSUZULTI5NzRdIC0gd3JpdGVUb1BhcmNlbCB0aHJvd3MgTlBFIGZvciBvcHRpb25hbCBlbnVtIGZpZWxkcworICAgICogW1RIUklGVC0yOTQ4XSAtIFB5dGhvbiBUSlNPTlByb3RvY29sIGRvZXNuJ3QgaGFuZGxlIHN0cnVjdHMgd2l0aCBiaW5hcnkgZmllbGRzIGNvbnRhaW5pbmcgaW52YWxpZCB1bmljb2RlLgorICAgICogW1RIUklGVC0yODQ1XSAtIENoaWxkU2VydmljZS5QbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMzI3Nl0gLSBCaW5hcnkgZGF0YSBkb2VzIG5vdCBkZWNvZGUgY29ycmVjdGx5IHVzaW5nIHRoZSBUSlNPTlByb3RvY29sIHdoZW4gdGhlIGJhc2U2NCBlbmNvZGVkIGRhdGEgaXMgcGFkZGVkLgorICAgICogW1RIUklGVC0zMjUzXSAtIFVzaW5nIGxhdGVzdCB2ZXJzaW9uIG9mIEQgZ2l2ZXMgZGVwcmVjYXRpb24gbm90aWNlcworICAgICogW1RIUklGVC0yODgzXSAtIFRUd2lzdGVkLnB5LCBkdXJpbmcgQ29ubmVjdGlvbkxvc3QgcHJvY2Vzc2luZzogZXhjZXB0aW9ucy5SdW50aW1lRXJyb3I6IGRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjAxOV0gLSBXcml0aW5nIG9uIGEgZGlzY29ubmVjdGVkIHNvY2tldCBvbiBNYWMgY2F1c2VzIFNJRyBQSVBFCisgICAgKiBbVEhSSUZULTIwMjBdIC0gVGhyaWZ0IGxpYnJhcnkgaGFzIHNvbWUgZW1wdHkgZmlsZXMgdGhhdCBoYXZlbid0IHJlYWxseSBiZWVuIGRlbGV0ZWQKKyAgICAqIFtUSFJJRlQtMjA0OV0gLSBHbyBjb21waWxlciBkb2Vzbid0IGJ1aWxkIG9uIG5hdGl2ZSBXaW5kb3dzCisgICAgKiBbVEhSSUZULTIwMjRdIC0gVFNlcnZlci5jcHAgd2FybnMgb24gNjQtYml0IHBsYXRmb3JtcyBhYm91dCB0cnVuY2F0aW5nIGFuIHJsaW1fdCBpbnRvIGFuIGludAorICAgICogW1RIUklGVC0yMDIzXSAtIGdldHRpbWVvZmRheSBpbXBsZW1lbnRhdGlvbiBvbiBXaW5kb3dzIGVycm9ycyB3aGVuIG5vIHRpbWUgem9uZSBpcyBwYXNzZWQgaW4uCisgICAgKiBbVEhSSUZULTIwMjJdIC0gQ29CIGFuZCBkZW5zZSBjb2RlIGdlbmVyYXRpb24gc3RpbGwgdXNlcyBUUjEgYmluZCwgZXZlbiB0aG91Z2ggdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCBjbGFuZworICAgICogW1RIUklGVC0yMDI3XSAtIE1pbm9yIDY0LWJpdCBhbmQgTk9NSU5NQVggaXNzdWVzIGluIEMrKyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIxNTZdIC0gVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgaXMgdGhyb3dpbmcgZXhjZXB0aW9ucyB3aXRoIG1pc2xlYWRpbmcgaW5mb3JtYXRpb24KKyAgICAqIFtUSFJJRlQtMjE1NF0gLSBNaXNzaW5nIDxvcGVyYXRvciBib2R5CisgICAgKiBbVEhSSUZULTIxNDhdIC0gVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCBpbXBvcnRzIGxvZzRqCisgICAgKiBbVEhSSUZULTIxMDNdIC0gW3B5dGhvbl0gU3VwcG9ydCBmb3IgU1NMIGNlcnRpZmljYXRlcyB3aXRoIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZXMKKyAgICAqIFtUSFJJRlQtMTkzMV0gLSBTZW5kaW5nIGEgZnJhbWUgc2l6ZSBvZiB6ZXJvIHRvIGEgVE5vbmJsb2NraW5nU2VydmVyIGNhdXNlcyBhbiBhc3NlcnRpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0xNzUxXSAtIGRlZmluaXRpb24gb2YgaW5jcmVhc2VfbWF4X2ZkcyBkb2Vzbid0IGNvbXBpbGUgd2hlbiBIQVZFX1NZU19SRVNPVVJDRV9IIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE1MjJdIC0gVFNlcnZlclNvY2tldCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgd2l0aCBhZGRyaW5mbyAqcmVzMAorICAgICogW1RIUklGVC0xNTQ3XSAtIFByb2JsZW1zIGJ1aWxkaW5nIGFnYWluc3Qgc3RhdGljIGxpYmV2ZW50CisgICAgKiBbVEhSSUZULTE1NDVdIC0gR2VuZXJhdGVkIGphdmFzY3JpcHQgY29kZSB1c2VzICJmb3IgaW4iIGZvciBsb29waW5nIG92ZXIgYXJyYXlzCisgICAgKiBbVEhSSUZULTE0ODddIC0gTmFtZXNwYWNlIHByb2JsZW0sIGNvbXBpbGUgZmFpbHMgb24gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ3Ml0gLSBDb25maWd1cmF0aW9uIGNvbmZsaWN0cyB3aXRoIGJvb3N0IHBsYXRmb3JtIGluY2x1ZGUgaGVhZGVyCisgICAgKiBbVEhSSUZULTZdIC0gVGhyaWZ0IGxpYnJhcmllcyBhbmQgY29tcGlsZXIgbGFjayB2ZXJzaW9uIG51bWJlcgorICAgICogW1RIUklGVC0xNjgwXSAtIG1ha2UgaW5zdGFsbCByZXF1aXJlcyBHTlUgbWFrZQorICAgICogW1RIUklGVC0zODY5XSAtIERhcnQgVHV0b3JpYWwgYnVpbGQgZmFpbHMgd2l0aCBFcnJvciA2NSBhdCAicHViIGdldCIKKyAgICAqIFtUSFJJRlQtMzg2MV0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSB0aW1pbmcgb3V0IC0gQysrVFNlcnZlckludGVncmF0aW9uVGVzdCBhcHBlYXJzIHRvIGJlIGhhbmdpbmcKKyAgICAqIFtUSFJJRlQtMzg1NV0gLSBJbiB0aGUgZ28gc2ltcGxlIHNlcnZlciwgaWYgU3RvcCgpIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpdCBoYW5ncworICAgICogW1RIUklGVC0zODg1XSAtIFBIUDogRXJyb3Igd2hlbiByZWFkSTY0IGluIFRDb21wYWN0UHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzg4M10gLSBHbyBUZXN0QWxsQ29ubmVjdGlvbiBjYW4gZmFpbCB3aXRoIHBvcnQgOTA5MCBjb2xsaXNpb24KKyAgICAqIFtUSFJJRlQtMzg4NF0gLSBGaXggRXJsYW5nIGNvbXBhY3QgcHJvdG9jb2wgZG91YmxlIGVuZGlhbmVzcyBhbmQgYm9vbGVhbiBsaXN0CisgICAgKiBbVEhSSUZULTM4ODBdIC0gRXJsYW5nIENvbXBhY3QgcHJvdG9jb2wgLSBib29sZWFuIHZhbHVlcyBpbnZlcnRlZAorICAgICogW1RIUklGVC0zODc5XSAtIFVuZGVmaW5lZCBldmFsdWF0aW9uIG9yZGVyIGNhdXNlcyBpbmNvcnJlY3QgcHJvY2Vzc2luZyBpbiB0aGUgQysrIGxpYnJhcnkgSlNPTiBwcm90b2NvbAorICAgICogW1RIUklGVC0zODUxXSAtIEdvbGFuZyB0aHJpZnQgY29udGludWFsbHkgYWRkcyB0aGUgeC90aHJpZnQgY29udGVudCB0eXBlIAorICAgICogW1RIUklGVC0zODUwXSAtIEFsbCBhcGFjaGUgYnVpbGRzIGFyZSBmYWlsaW5nIHdoZW4gaW5pdGlhdGVkIGZyb20gYSBnaXRodWIgcHVsbCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTM4MzddIC0gVGhpZnQgMC45LjMgY2FuJ3QgYmUgYnVpbGQgd2l0aCBRdWlja0NoZWNrIDIuOC4yIGFuZCB1bm9yZGVyZWQtY29udGFpbmVycyAwLjIuNgorICAgICogW1RIUklGVC0zODMxXSAtIGJ1aWxkIG9mIHRlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBmYWlscyB3aXRoIG5ld2VyIGdjYyBvbiBwbGF0Zm9ybXMgd2l0aCB1bnNpZ25lZCBjaGFyIGR1ZSB0byBuYXJyb3dpbmcgY29udmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtMzgyN10gLSBwaHAgQ29tcGFjdFByb3RvY29sIHJlYWRJNjQgZnVuY3Rpb24gaGFzIGJ1Zywgd2hlbiB2YWx1ZSBoYXMgMzJiaXQgfjY0Yml0LCBFeGFtcGxl77yadmFsdWU9MTQ2MTU2MzQ1NzAwMCAKKyAgICAqIFtUSFJJRlQtMzgyNV0gLSBKYXZhc2NyaXB0IHRlc3QgZGVwZW5kZW5jeSBpcyBubyBsb25nZXIgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM4MTRdIC0gRml4IGNvbnRlbnRpb24gaW4gVE5vbmJsb2NraW5nU2VydmVyVGVzdAorICAgICogW1RIUklGVC0zNzkzXSAtIEFwcHZleW9yIGJ1aWxkcyByZWZlcmVuY2UgYW4gYW50IHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKyAgICAqIFtUSFJJRlQtMzc4Nl0gLSBOb2RlLmpzIFRMUyBlbWl0cyAnY29ubmVjdCcgYmVmb3JlIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICAqIFtUSFJJRlQtMzc4MF0gLSBGaXggZGFydCBpbnQ2NCB1c2FnZSB3aGVuIGNvbXBpbGVkIHRvIGpzCisgICAgKiBbVEhSSUZULTM3ODldIC0gTm9kZS5qcyBsYWNrcyBhYmlsaXR5IHRvIGRlc3Ryb3kgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0zNzk2XSAtIFRoZXJlJ3Mgbm8gLS1kYmcgZm9yIGRoX3N0cmlwLCBtYXliZSBzb21lb25lIGhhcyBtaXN0YWtlbiB0aGlzIGZvciAtLWRiZy1wYWNrYWdlLgorICAgICogW1RIUklGVC0zNzk1XSAtIEdlbmVyYXRlZCBoYXNoVmFsdWUgbWV0aG9kIGluIFN3aWZ0IHdpbGwgb3ZlcmZsb3cKKyAgICAqIFtUSFJJRlQtMzc5MF0gLSBGaXggRGVscGhpIG5hbWVkIHBpcGUgY2xpZW50IHRvIHVzZSB0aW1lb3V0IGV2ZW4gd2hlbiBwaXBlIGRvZXNuJ3QgeWV0IGV4aXN0CisgICAgKiBbVEhSSUZULTM3ODddIC0gTm9kZS5qcyBDb25uZWN0aW9uIG9iamVjdCBkb2Vzbid0IGhhbmRsZSBlcnJvcnMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTM3OTFdIC0gRGVscGhpIHBpcGUgY2xpZW50IG1heSBmYWlsIGV2ZW4gaW4gYSBub24tZXJyb3IgY29uZGl0aW9uCisgICAgKiBbVEhSSUZULTM3NzFdIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGdldHMgaW4gaW52YWxpZCBzdGF0ZSBvbiByZWFkL3dyaXRlIGVycm9ycworICAgICogW1RIUklGVC0zNzY0XSAtIFBIUCAibWFrZSBpbnN0YWxsIiBkb2VzIG5vdCBpbnN0YWxsIFRNdWx0aXBsZXhlZFByb3RvY29sLnBocCBub3IgVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKKyAgICAqIFtUSFJJRlQtMzc2OF0gLSBUVGhyZWFkZWRTZXJ2ZXIgbWF5IGNyYXNoIGlmIGl0IGlzIGRlc3Ryb3llZCBpbW1lZGlhdGVseSBhZnRlciBpdCByZXR1cm5zIGZyb20gc2VydmUoKTsgVFRocmVhZGVkU2VydmVyIGRpc2Nvbm5lY3RzIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzc2NV0gLSBtZW1vcnkgbGVhayBpbiBweXRob24gY29tcGFjdCBwcm90b2NvbCBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzc1OF0gLSBUQXBwbGljYXRpb25FeGNlcHRpb246OmdldFR5cGUgYW5kIFRQcm90b2NvbEV4Y2VwdGlvbjo6Z2V0VHlwZSBzaG91bGQgYmUgY29uc3QKKyAgICAqIFtUSFJJRlQtMzc2M10gLSBGaXggc2VyaWFsaXphdGlvbiBvZiBpNjQgbGFyZ2VyIHRoYW4gMl41MyBmb3IgYnJvd3NlcmlmeQorICAgICogW1RIUklGVC0zNzU5XSAtIHJlcXVpcmVkIGZpZWxkcyB0aGF0IGFyZSBuaWwgYXJlIHNpbGVudGx5IGlnbm9yZWQgb24gd3JpdGUKKyAgICAqIFtUSFJJRlQtMzc1M10gLSBUU2VydmVyRnJhbWV3b3JrOjpzdG9wIG1heSBmYWlsIHRvIGludGVycnVwdCBjb25uZWN0ZWQgY2xpZW50cworICAgICogW1RIUklGVC0zNzU1XSAtIFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyBoaXRzIGFzc2VydCBpbiBpc3ByaW50IG9uIFdpbmRvd3Mgd2l0aCBkZWJ1ZyBDUlQKKyAgICAqIFtUSFJJRlQtMzc1MV0gLSBDb21waWxlciBhbGxvd3MgZmllbGQgaWRzIHRoYXQgYXJlIHRvbyBsYXJnZSBmb3IgZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMzc0OF0gLSBOb2RlLmpzIERlc2VyaWFsaXphdGlvbiBvZiBsaXN0cyBvZiBsaXN0cyBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzc2MF0gLSBGaXggaW5zdGFsbCBwYXRocyBldGMgb2YgZGViaWFuIHBhY2thZ2VzIGZvciBweSBhbmQgcGVybAorICAgICogW1RIUklGVC0zNzU3XSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIG9uIFdpbmRvd3Mgd2l0aCBWUzIwMTUgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzc1MF0gLSBOU0NvcHlpbmcgY29weVdpdGhab25lOiBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBjaGVjayBpc1NldAorICAgICogW1RIUklGVC0zNzQ3XSAtIER1cGxpY2F0ZSBub2RlLmpzIGJ1aWxkIG9uIFRyYXZpcy1DSQorICAgICogW1RIUklGVC0zNzQ0XSAtIFRoZSBwcmVjaXNpb24gc2hvdWxkIGJlIDE3ICgxNiBiaXRzIG5lZWQgYWZ0ZXIgZG90KSBhZnRlciBkb3QgZm9yIGRvdWJsZSB0eXBlLgorICAgICogW1RIUklGVC0zNzQxXSAtIGhheGUgdGVzdCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzczOV0gLSBEZXByZWNhdGlvbiB3YXJuaW5nIGluIGNvZGVnZW4vYmFzZS5kCisgICAgKiBbVEhSSUZULTM3MzVdIC0gSlNPTiBwcm90b2NvbCBsZWZ0IGluIGluY29ycmVjdCBzdGF0ZSB3aGVuIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9ucworICAgICogW1RIUklGVC0zNzM0XSAtIFRvIGNvbXBhcmUgdHdvIHN0cmluZyBhcyBsb3dlcmNhc2UuCisgICAgKiBbVEhSSUZULTM3NDNdIC0gSmF2YSBKU09OIHByb3RvY29sIGxlZnQgaW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTM3MzFdIC0gUGVybCBtdWx0aXBsZXggdGVzdCBpcyBmbGFreQorICAgICogW1RIUklGVC0zNzI5XSAtIFJlc3RyaWN0IHJha2UgdmVyc2lvbgorICAgICogW1RIUklGVC0zNzI3XSAtIEluY29ycmVjdCByZXF1aXJlIHBhdGhzIGluIE5vZGUuanMgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMzcyM10gLSBGaXggTHVhIGluY2x1ZGUgcGF0aAorICAgICogW1RIUklGVC0zNzIyXSAtIEZpeCBjZXJ0IHBhdGggaW4gQysrIGNyb3NzIHRlc3RzIGZvciBub24tTGludXggcGxhdGZvcm0KKyAgICAqIFtUSFJJRlQtMzcyNl0gLSBGaXggaW5jb3JyZWN0IGNvbmRpdGlvbmFsIGluIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQorICAgICogW1RIUklGVC0zNzI1XSAtIFNraXAgYSBmbGFreSBjcm9zcyB0ZXN0IGVudHJ5IChkLWRhcnQgY29tcGFjdCBmcmFtZWQtaXApCisgICAgKiBbVEhSSUZULTM3MjRdIC0gRml4IGluY29ycmVjdCB0aW1ldmFsIGNvbnZlcnNpb24gaW4gbGliZXZlbnQuZAorICAgICogW1RIUklGVC0zNzIxXSAtIENMT05FIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworICAgICogW1RIUklGVC0zNzIwXSAtIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlJlYWQoKSByZXR1cm5zIDAgaWYgbm90IGFsbCByZXF1ZXN0ZWQgYnl0ZXMgY291bGQgYmUgcmVhZAorICAgICogW1RIUklGVC0zNzE5XSAtIERhcnQgZ2VuZXJhdG9yIHNob3VsZCB1c2UgbG93ZXJDYW1lbENhc2UgZm9yIHNlcnZpY2UgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzkwMl0gLSBUU29ja2V0Lm9wZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTM5MDFdIC0gVEZyYW1lZFRyYW5zcG9ydC5vcGVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICogW1RIUklGVC0zODkzXSAtIENvbW1hbmQgaW5qZWN0aW9uIGluIGZvcm1hdF9nb19vdXRwdXQKKyAgICAqIFtUSFJJRlQtMzgwN10gLSBTd2lmdCBjb21waWxlciBkb2VzIG5vdCBlc2NhcGUgcmVzZXJ2ZWQgd29yZHMKKyAgICAqIFtUSFJJRlQtMzc5OF0gLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAqIFtUSFJJRlQtMzgwOV0gLSB3cm9uZy91bnVzZWQgQklOQVJZIHR5cGUgY29kZQorICAgICogW1RIUklGVC0zODA2XSAtIFN3aWZ0IGdlbmVyYXRvciBkb2VzIG5vdCBoYW5kbGUgc2VsZi1yZWZlcnJpbmcgc3RydWN0cworICAgICogW1RIUklGVC0zODA1XSAtIEdvbGFuZyBzZXJ2ZXIgc3VzY2VwdGlibGUgdG8gbWVtb3J5IHNwaWtlIGZyb20gbWFsZm9ybWVkIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMzc5N10gLSBHZW5lcmF0ZWQgRGVscGhpIHByb2Nlc3NvciBzaG91bGRuJ3QgZXJyb3Igb3V0IG9uIHRpbWVkIG91dCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTM4MTNdIC0gQXBwdmV5b3IgYnVpbGRzIHJlZmVyZW5jZSBhbiBvcGVuc3NsIHZlcnNpb24gdGhhdCBpcyBubyBsb25nZXIgdGhlcmUKKyAgICAqIFtUSFJJRlQtMzY1OF0gLSBNaXNzaW5nIGZpbGUgaW4gVEhSSUZULTM1OTkKKyAgICAqIFtUSFJJRlQtMzY0OV0gLSBQeXRob24gVFNhc2xDbGllbnRUcmFuc3BvcnQgaW5pdGlhbGl6ZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbmNvcnJlY3RseQorICAgICogW1RIUklGVC0zNjUwXSAtIGluY29ycmVjdCB1bmlvbiBzZXJpYWxpemF0aW9uIAorICAgICogW1RIUklGVC0zNzEzXSAtIGxpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGlzIGZsYWt5IG9uIEplbmtpbnMKKyAgICAqIFtUSFJJRlQtMzY2OF0gLSByYW5nZSBjaGVjayBlcnJvciBpbiBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM2NjNdIC0gQ01ha2UgY3BwIHRlc3QgZmFpbHMgdG8gYnVpbGQgb24gc3lzdGVtIHdpdGhvdXQgemxpYgorICAgICogW1RIUklGVC0zNzEyXSAtIFRUb3JuYWRvU2VydmVyIGNhbm5vdCBoYW5kbGUgSVB2NiBhZGRyZXNzCisgICAgKiBbVEhSSUZULTM3MTBdIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgY2FtZWwgY2FzZSBDb25zdGFudHMgY2xhc3MgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzY5N10gLSBEYXJ0IGdlbmVyYXRvciBkb2VzIG5vdCBuYW1lIGltcG9ydHMKKyAgICAqIFtUSFJJRlQtMzY5MF0gLSBXb3JrIGFyb3VuZCBkb2NrZXIgaW1hZ2UgYnVpbGQgZmFpbHVyZXMgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM2ODldIC0gdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQgc3RhcnQgZmFpbGVkIHdoZW4gc2VydmVyIGlzIG5vdCBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzY5NV0gLSBGaXggRCB0ZXN0IHNjcmlwdHMKKyAgICAqIFtUSFJJRlQtMzY3NV0gLSBVbmlvbiBpcyBub3Qgc2VyaWFsaXplZCBjb3JyZWN0bHkgYnkgVGhyaWZ0IEMgR2xpYgorICAgICogW1RIUklGVC0zNjczXSAtIEFQSSBmYWlscyB3aXRoIHN0ZDo6ZXhjZXB0aW9uIGFmdGVyIGEgdGltZW91dCBvY2N1cmVkIGluIGVhcmxpZXIgYW55IEFQSSBjYWxsCisgICAgKiBbVEhSSUZULTM3MDldIC0gQ29tbWVudCBzeW50YXggY2FuIHByb2R1Y2UgYnJva2VuIGNvZGUKKyAgICAqIFtUSFJJRlQtMzcwNV0gLSBHbyBtYXAgaGFzIGluY29ycmVjdCB0eXBlcyB3aGVuIHVzZWQgd2l0aCBmb3J3YXJkLWRlZmluZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzcwMl0gLSBGaXggY3Jvc3MgdGVzdHMgZm9yIERhcnQgY29tcGFjdCBwcm90b2NvbCAoMyBmYWlsaW5nKQorICAgICogW1RIUklGVC0zNjgzXSAtIEJhZFlpZWxkRXJyb3IgaW4gdGhyaWZ0IHB5OnRvcm5hZG8gc2VydmVyCisgICAgKiBbVEhSSUZULTM2ODJdIC0gRG8gbm90IHJldXNlIHJlZnVzZWQgc29ja2V0cyBpbiB0ZXN0IHNjcmlwdHMKKyAgICAqIFtUSFJJRlQtMzY4MV0gLSBGaXggRGFydCB0dXRvcmlhbCBidWlsZAorICAgICogW1RIUklGVC0zNjgwXSAtIEphdmEgYXN5bmMgcHJvY2Vzc29yIGZhaWxzIHRvIG5vdGlmeSBlcnJvcnMgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNzE0XSAtIFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24gaXMgbm90IGRlZmluZWQgaW4ganMvc3JjL3RocmlmdC5qcworICAgICogW1RIUklGVC0zNjg4XSAtIEZpeCBzb2NrZXQgYmluZCBmYWlsdXJlIGRldGVjdGlvbiBvZiBjcm9zcyB0ZXN0CisgICAgKiBbVEhSSUZULTM2NDFdIC0gUnVieSBjbGllbnQgc2hvdWxkIHRyeSB0byBjb25uZWN0IHRvIGV2ZXJ5IHJlc3VsdCBvZiBnZXRhZGRyaW5mbworICAgICogW1RIUklGVC0zNjM1XSAtIEQgdHJhbnNwb3J0X3Rlc3QgaXMgZmxha3kgb24gSmVua2lucyBhbmQgVHJhdmlzCisgICAgKiBbVEhSSUZULTM2MThdIC0gUHl0aG9uIFRTU0xTb2NrZXQgZGVwcmVjYXRpb24gbWVzc2FnZSBzaG91bGQgcHJpbnQgY2FsbGVyJ3MgbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtMzE0NV0gLSBKU09OIHByb3RvY29sIGRvZXMgbm90IGhhbmRsZSBib29sIGFuZCBlbXB0eSBjb250YWluZXJzIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zMTU4XSAtIFRCYXNlPFQsRj4jZGVlcENvcHkgc2hvdWxkIHJldHVybiBUCisgICAgKiBbVEhSSUZULTMxNTddIC0gVEJhc2Ugc2lnbmF0dXJlIHNob3VsZCBiZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4KKyAgICAqIFtUSFJJRlQtMzE1Nl0gLSBOb2RlIFRMUzogc2VydmVyIGV4ZWN1dGVzIHByb2Nlc3NpbmcgbG9naWMgdHdvIGZ1bGwgdGltZXMKKyAgICAqIFtUSFJJRlQtMzE1NF0gLSB0dXRvcmlhbC9weS50b3JuYWRvIHRocm93IEVPRiBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzA2M10gLSBDKysgYnVpbGQgLVd1bnVzZWQtcGFyYW1ldGVyIHdhcm5pbmdzIG9uIHByb2Nlc3Nvcl90ZXN0LCBUcmFuc3BvcnRUZXN0CisgICAgKiBbVEhSSUZULTMwNTZdIC0gQWRkIHN0cmluZy9jb2xsZWN0aW9uIGxlbmd0aCBsaW1pdHMgZm9yIFB5dGhvbiBwcm90b2NvbCByZWFkZXJzCisgICAgKiBbVEhSSUZULTMyMzddIC0gRml4IFROYW1lZFBpcGVTZXJ2ZXI6OmNyZWF0ZU5hbWVkUGlwZSBtZW1vcnkgbGVhaworICAgICogW1RIUklGVC0zMjMzXSAtIEZpeCBDKysgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2VyIHdvcmtlciBqb2luCisgICAgKiBbVEhSSUZULTMyMzJdIC0gQ2Fubm90IGRlc2VyaWFsaXplIGpzb24gbWVzc2FnZXMgY3JlYXRlZCB3aXRoIGZpZWxkTmFtZXNBc1N0cmluZyAKKyAgICAqIFtUSFJJRlQtMzIwNl0gLSBGaXggVmlzdWFsIFN0dWRpbyBidWlsZCBmYWlsdXJlIGR1ZSAncHRocmVhZF9zZWxmJzogaWRlbnRpZmllciBub3QgZm91bmQKKyAgICAqIFtUSFJJRlQtMzIwMF0gLSBKUyBhbmQgbm9kZWpzIGRvIG5vdCBlbmNvZGUgSlNPTiBwcm90b2NvbCBiaW5hcnkgZmllbGRzIGFzIGJhc2U2NAorICAgICogW1RIUklGVC0zMTk5XSAtIEV4Y2VwdGlvbiBmaWVsZCBoYXMgYmFzaWMgbWV0YWRhdGEKKyAgICAqIFtUSFJJRlQtMzE4Ml0gLSBURnJhbWVkVHJhbnNwb3J0IGlzIGluIGFuIGludmFsaWQgc3RhdGUgYWZ0ZXIgZnJhbWUgc2l6ZSBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjUzNl0gLSBuZXcgVFNvY2tldCwgdW5pbml0aWFsaXNlZCB2YWx1ZSByZXBvcnRlZCBieSB2YWxncmluZAorICAgICogW1RIUklGVC0yNTI3XSAtIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyIGNvZGUgZ2VuZXJhdGVkIGZvciBOb2RlLmpzIHNob3VsZCBiZSBqc2hpbnQgY2xlYW4KKyAgICAqIFtUSFJJRlQtMjUxOV0gLSAicHJvY2Vzc29yIiBjbGFzcyBpcyBub3QgYmVpbmcgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTI0MzFdIC0gVEZpbGVUcmFuc3BvcnRUZXN0IGZhaWxzIHdpdGggImNoZWNrIGRlbHRhIDwgWFhYIGZhaWxlZCIKKyAgICAqIFtUSFJJRlQtMjcwOF0gLSBFcmxhbmcgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0ICJvbmV3YXkiIG1lc3NhZ2UgdHlwZQorICAgICogW1RIUklGVC0zMzc3XSAtIERlZXAgY29weSBpcyBhY3R1YWxseSBzaGFsbG93IHdoZW4gdXNpbmcgdHlwZWRlZiBtZW1iZXJzCisgICAgKiBbVEhSSUZULTMzNzZdIC0gQyMgYW5kIFB5dGhvbiBKU09OIHByb3RvY29sIGRvdWJsZSB2YWx1ZXMgbG9zZSBwcmVjaXNpb24KKyAgICAqIFtUSFJJRlQtMzM3M10gLSBWYXJpb3VzIGZpeGVzIGZvciBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzM3MF0gLSBlcnJubyBleHRlcm4gdmFyaWFibGUgcmVkZWZpbmVkLiBOb3QgY29tcGlsaW5nIGZvciBBbmRyb2lkCisgICAgKiBbVEhSSUZULTMzNzldIC0gIFBvdGVudGlhbCBvdXQgb2YgcmFuZ2UgcGFuaWMgaW4gR28gSlNPTiBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzM3MV0gLSBBYnN0cmFjdCBuYW1lc3BhY2UgVW5peCBkb21haW4gc29ja2V0cyBicm9rZW4gaW4gQysrCisgICAgKiBbVEhSSUZULTMzODBdIC0gbm9kZWpzOiAwLjkuMiAtPiAwLjkuMyB1cGdyYWRlIGJyZWFrcyBQcm90b2NvbCBhbmQgVHJhbnNwb3J0IHJlcXVpcmVzCisgICAgKiBbVEhSSUZULTMzNjddIC0gRml4IGJhZCBsaW5rcyB0byBjb2Rpbmdfc3RhbmRhcmRzLm1kICM2MzQgCisgICAgKiBbVEhSSUZULTM0MDFdIC0gTmVzdGVkIGNvbGxlY3Rpb25zIGVtaXQgT2JqZWN0aXZlLUMgY29kZSB0aGF0IGNhbm5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTM0MDNdIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMKKyAgICAqIFtUSFJJRlQtMzM2Ml0gLSBtYWtlIGNoZWNrIGZhaWxzIGZvciBDKysgYXQgdGhlIFNlY3VyaXR5VGVzdAorICAgICogW1RIUklGVC0zMzk1XSAtIENvY29hIGNvbXBpbGVyIHByb2R1Y2VzIGNvcnJ1cHQgY29kZSB3aGVuIGJveGluZyBlbnVtcyBpbnNpZGUgbWFwLgorICAgICogW1RIUklGVC0zMzk0XSAtIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0zMzg4XSAtIGhhc2ggZG9lc24ndCB3b3JrIG9uIHNldC9saXN0CisgICAgKiBbVEhSSUZULTMzOTFdIC0gV3JvbmcgYm9vbCBmb3JtYXR0aW5nIGluIHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTMzOTBdIC0gVFRvcm5hZG8gc2VydmVyIGRvZXNuJ3QgaGFuZGxlIGNsb3NlZCBjb25uZWN0aW9ucyBwcm9wZXJseQorICAgICogW1RIUklGVC0zMzgyXSAtIFRCYXNlIGNsYXNzIGZvciBDKysgTGlicmFyeQorICAgICogW1RIUklGVC0zMzkyXSAtIEphdmEgVFpsaWJUcmFuc3BvcnQgZG9lcyBub3QgY2xvc2UgaXRzIHdyYXBwZXIgc3RyZWFtcyB1cG9uIGNsb3NlKCkKKyAgICAqIFtUSFJJRlQtMzM4M10gLSBpNjQgcmVsYXRlZCB3YXJuaW5ncyAKKyAgICAqIFtUSFJJRlQtMzM4Nl0gLSBtaXNjLiB3YXJuaW5ncyB3aXRoIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzM4NV0gLSB3YXJuaW5nOiBmb3JtYXQg4oCYJWx14oCZIGV4cGVjdHMg4oCYbG9uZyB1bnNpZ25lZCBpbnTigJksIGJ1dCBoYXMgdHlwZSDigJhzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjo6c2l6ZV90eXBlIHtha2EgdW5zaWduZWQgaW50fQorICAgICogW1RIUklGVC0zMzU1XSAtIG5wbSBXQVJOIHBhY2thZ2UuanNvbiB0aHJpZnRAMS4wLjAtZGV2IE5vIGxpY2Vuc2UgZmllbGQuCisgICAgKiBbVEhSSUZULTMzNjBdIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMgZnVydGhlcgorICAgICogW1RIUklGVC0zMzU5XSAtIEJpbmFyeSBmaWVsZCBpbmNvbXBhdGliaWxpdGllcworICAgICogW1RIUklGVC0zMzU0XSAtIEZpeCB3b3JkLWV4dHJhY3Rpb24gc3Vic3RyIGJ1ZyBpbiBpbml0aWFsaXNtIGNvZGUKKyAgICAqIFtUSFJJRlQtMzM1MF0gLSBQeXRob24gSlNPTiBwcm90b2NvbCBkb2VzIG5vdCBlbmNvZGUgYmluYXJ5IGFzIEJhc2U2NAorICAgICogW1RIUklGVC0zNTc3XSAtIGFzc2VydGlvbiBmYWlsZWQgYXQgbGluZSA1MTIgb2YgdGVzdGNvbnRhaW5lcnRlc3QuYworICAgICogW1RIUklGVC0zNTc2XSAtIEJvb3N0IHRlc3QgLS1sb2dfZm9ybWF0IGFyZyBkb2VzIG5vdCBhY2NlcHQgbG93ZXJjYXNlCisgICAgKiBbVEhSSUZULTM1NzVdIC0gR28gY29tcGlsZXIgdHJpZXMgdG8gdXNlIHVuZXhwb3J0ZWQgbGlicmFyeSBtZXRob2RzIHdoZW4gdXNpbmcgcmVhZF93cml0ZV9wcml2YXRlCisgICAgKiBbVEhSSUZULTM1NzRdIC0gQ29jb2EgZ2VuZXJhdG9yIG1ha2VzIHVuY29tcGlsYWJsZSBpbXBvcnRzCisgICAgKiBbVEhSSUZULTM1NzBdIC0gUmVtb3ZlIGR1cGxpY2F0ZSBpbnN0YW5jZXMgdGhhdCBhcmUgYWRkZWQgYnkgdXBzdHJlYW0KKyAgICAqIFtUSFJJRlQtMzU3MV0gLSBNYWtlIGZlYXR1cmUgdGVzdCByZXN1bHQgYnJvd3NhYmxlCisgICAgKiBbVEhSSUZULTM1NjldIC0gY19nbGliIHByb3RvY29scyBkbyBub3QgY2hlY2sgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYnkgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM1NjhdIC0gVEhlYWRlciBzZXJ2ZXIgY3Jhc2hlcyBvbiByZWFkU2xvdworICAgICogW1RIUklGVC0zNTY3XSAtIEdMaWItR09iamVjdC1DUklUSUNBTCAqKjogZ19vYmplY3RfdW5yZWY6IGFzc2VydGlvbiAnR19JU19PQkpFQ1QgKG9iamVjdCknIGZhaWxlZAorICAgICogW1RIUklGVC0zNTY2XSAtIEMrKy9RdDogVFFUY3BTZXJ2ZXJUZXN0Ojp0ZXN0X2NvbW11bmljYXRlKCkgaXMgbmV2ZXIgZXhlY3V0ZWQKKyAgICAqIFtUSFJJRlQtMzU2NF0gLSBDKysvUXQ6IHBvdGVudGlhbCBjb3JlIGR1bXAgaW4gVFFUY3BTZXJ2ZXIgaW4gY2FzZSBhbiBleGNlcHRpb24gb2NjdXJzIGluIFRBc3luY1Byb2Nlc3Nvcjo6cHJvY2VzcygpCisgICAgKiBbVEhSSUZULTM1NThdIC0gdHlwb3MgaW4gY19nbGliIHRlc3RzCisgICAgKiBbVEhSSUZULTM1NTldIC0gRml4IGF3a3dhcmQgZXh0cmEgc2VtaS1jb2xvbnMgd2l0aCBDb2NvYSBjb250YWluZXIgbGl0ZXJhbHMKKyAgICAqIFtUSFJJRlQtMzU1NV0gLSAnY29uZmlndXJlJyBzY3JpcHQgZG9lcyBub3QgaG9ub3IgLS13aXRoLW9wZW5zc2w9PHBhdGg+IGZvciBsaWJjcnlwdG8gZm9yIEJOX2luaXQKKyAgICAqIFtUSFJJRlQtMzU1NF0gLSBDb25zdGFudCBkZWNscyBtYXkgbGVhZCB0byAiRXJyb3I6IGludGVybmFsIGVycm9yOiBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoKSBhbHJlYWR5IGFjdGl2ZSBmb3IgZGlmZmVyZW50IHN0cnVjdCIKKyAgICAqIFtUSFJJRlQtMzU1Ml0gLSBnbGliX2MgTWVtb3J5IExlYWsKKyAgICAqIFtUSFJJRlQtMzU1MV0gLSBUaHJpZnQgcGVybCBsaWJyYXJ5IG1pc3NpbmcgcGFja2FnZSBkZWNsYXJhdGlvbgorICAgICogW1RIUklGVC0zNTQ5XSAtIEV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBzdHJpbmdpZmllZCBpbiBQZXJsIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzU0Nl0gLSBOb2RlSlMgY29kZSBzaG91bGQgbm90IGJlIG5hbWVzcGFjZWQgKGFuZCBpcyBjdXJyZW50bHkgbm90IHN0cmljdC1tb2RlIGNvbXBsaWFudCkKKyAgICAqIFtUSFJJRlQtMzU0NV0gLSBDb250YWluZXIgdHlwZSBsaXRlcmFscyBkbyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0zNTM4XSAtIFJlbW92ZSBVbmJvdW5kTWV0aG9kVHlwZSBpbiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAqIFtUSFJJRlQtMzUzNl0gLSBFcnJvciAnY2hhcicgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdJc0xvd1N1cnJvZ2F0ZScgZm9yIFdQNyB0YXJnZXQKKyAgICAqIFtUSFJJRlQtMzUzNF0gLSBMaW5rIGVycm9yIHdoZW4gYnVpbGRpbmcgd2l0aCBRdDUKKyAgICAqIFtUSFJJRlQtMzUzM10gLSBDYW4gbm90IHNlbmQgbmlsIHBvaW50ZXIgYXMgc2VydmljZSBtZXRob2QgYXJndW1lbnQKKyAgICAqIFtUSFJJRlQtMzUwN10gLSBUSHR0cENsaWVudCBkb2VzIG5vdCB1c2UgcHJveHkgZnJvbSBodHRwX3Byb3h5LCBodHRwc19wcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAqIFtUSFJJRlQtMzUwMl0gLSBDKysgVFNlcnZlclNvY2tldCBwYXNzZXMgc21hbGwgYnVmZmVyIHRvIGdldHNvY2tuYW1lCisgICAgKiBbVEhSSUZULTM1MDFdIC0gRm9yd2FyZCBzbGFzaCBpbiBjb21tZW50IGNhdXNlcyBjb21waWxlciBlcnJvcgorICAgICogW1RIUklGVC0zNDk4XSAtIEMrKyBsaWJyYXJ5IGFzc3VtZXMgb3B0aW9uYWwgZnVuY3Rpb24gcHRocmVhZF9hdHRyX3NldHNjaGVkcG9saWN5IGlzIGF2YWlsYWJsZQorICAgICogW1RIUklGVC0zNDk3XSAtIEJ1aWxkIGZhaWxzIHdpdGggImludmFsaWQgdXNlIG9mIGluY29tcGxldGUgdHlwZSIKKyAgICAqIFtUSFJJRlQtMzQ5Nl0gLSBDKys6IENvYiBzdHlsZSBjbGllbnQgZmFpbHMgd2hlbiBzZW5kaW5nIGEgY29uc2VjdXRpdmUgcmVxdWVzdAorICAgICogW1RIUklGVC0zNDkzXSAtIGxpYnRocmlmdCBkb2VzIG5vdCBjb21waWxlIG9uIHdpbmRvd3MgdXNpbmcgdmlzdWFsIHN0dWRpbworICAgICogW1RIUklGVC0zNDg4XSAtIHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAncHJvZ3JhbScKKyAgICAqIFtUSFJJRlQtMzQ4OV0gLSB3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyBbLVd3cml0ZS1zdHJpbmdzXQorICAgICogW1RIUklGVC0zNDg3XSAtIEZ1bGwgc3VwcG9ydCBmb3IgbmV3ZXIgRGVscGhpIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTM1MjhdIC0gRml4IHdhcm5pbmdzIGluIHRocmlmdC5sbAorICAgICogW1RIUklGVC0zNTI3XSAtIC1nZW4gcHk6ZHluYW1pYyx1dGY4c3RyaW5ncyBpZ25vcmVzIHV0ZjhzdHJpbmdzIG9wdGlvbgorICAgICogW1RIUklGVC0zNTI2XSAtIENvZGUgZ2VuZXJhdGVkIGJ5IHB5OnV0ZjhzdHJpbmdzIGRvZXMgbm90IHdvcmsgZm9yIFB5dGhvbjMKKyAgICAqIFtUSFJJRlQtMzUyNF0gLSBkY2MzMiB3YXJuaW5nICJXMTAwMCBTeW1ib2wgJ0lzTG93U3Vycm9nYXRlJyBpcyBkZXByZWNhdGVkOiAnVXNlIFRDaGFySGVscGVyJyIgaW4gVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCisgICAgKiBbVEhSSUZULTM1MjVdIC0gcHk6ZHluYW1pYyBmYWlscyB0byBoYW5kbGUgYmluYXJ5IGxpc3Qvc2V0L21hcCBlbGVtZW50CisgICAgKiBbVEhSSUZULTM1MjFdIC0gVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgaXMgbm90IGRldGVybWluaXN0aWMgKGZhaWxzIHdoZW4gcnVuIG9uIEpESyA4KQorICAgICogW1RIUklGVC0zNTIwXSAtIERhcnQgVFNvY2tldCBvbkVycm9yIHN0cmVhbSBzaG91bGQgYmUgdHlwZWQgYXMgT2JqZWN0CisgICAgKiBbVEhSSUZULTM1MTldIC0gZmFzdGJpbmFyeSBkb2VzIG5vdCB3b3JrIHdpdGggLWdlbiBweTp1dGY4c3RyaW5ncworICAgICogW1RIUklGVC0zNTE4XSAtIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gZmlsZXMgd2VyZSBtaXNzaW5nIGZvciBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTM1MTJdIC0gY19nbGliOiBCdWlsZCBmYWlscyBkdWUgdG8gbWlzc2luZyBmZWF0dXJlcy5oCisgICAgKiBbVEhSSUZULTM0ODNdIC0gSW5jb3JyZWN0IGVtcHR5IGJpbmFyeSBoYW5kbGluZyBpbnRyb2R1Y2VkIGJ5IFRIUklGVC0zMzU5CisgICAgKiBbVEhSSUZULTM0NzldIC0gT25ld2F5IGNhbGxzIHNob3VsZCBub3QgcmV0dXJuIGV4Y2VwdGlvbnMgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNDc4XSAtIFJlc3RvcmUgZHJvcHBlZCBtZXRob2QgdG8gVEhzSGFTZXJ2ZXIuamF2YQorICAgICogW1RIUklGVC0zNDc3XSAtIFBhcnNlciBmYWlscyBvbiBlbnVtIGl0ZW0gdGhhdCBzdGFydHMgd2l0aCAnRScgbGV0dGVyIGFuZCBjb250aW51ZXMgd2l0aCBudW1iZXIgCisgICAgKiBbVEhSSUZULTM0NzZdIC0gTWlzc2luZyBpbmNsdWRlIGluIC4vc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorICAgICogW1RIUklGVC0zNDc0XSAtIERvY2tlcjogdGhyaWZ0LWNvbXBpbGVyCisgICAgKiBbVEhSSUZULTM0NzNdIC0gV2hlbiAib3B0aW9uYWwnIGlzIHVzZWQgd2l0aCBhIHN0cnVjdCBtZW1iZXIsIEMrKyBzZXJ2ZXIgc2VlbXMgdG8gbm90IHJldHVybiBpdCBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzQ2OF0gLSBEYXJ0IFRTb2NrZXRUcmFuc3BvcnQgb25FcnJvciBoYW5kbGVyIGlzIHRvbyByZXN0cmljdGl2ZQorICAgICogW1RIUklGVC0zNDUxXSAtIHRocmlmdF9wcm90b2NvbCBQSFAgZXh0ZW5zaW9uIG1pc3NpbmcgY29uZmlnLm00IGZpbGUKKyAgICAqIFtUSFJJRlQtMzQ1Nl0gLSByb3VuZGluZyBpc3N1ZSBpbiBzdGF0aWMgYXNzZXJ0CisgICAgKiBbVEhSSUZULTM0NTVdIC0gc3RydWN0IHdyaXRlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBpcyBpbmNvcnJlY3QKKyAgICAqIFtUSFJJRlQtMzQ1NF0gLSBQeXRob24gVG9ybmFkbyB0dXRvcmlhbCBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMzQ2M10gLSBKYXZhIGNhbid0IGJlIGRpc2FibGVkIGluIENNYWtlIGJ1aWxkCisgICAgKiBbVEhSSUZULTM0NTBdIC0gTlBFIHdoZW4gdXNpbmcgU1NMCisgICAgKiBbVEhSSUZULTM0NDldIC0gVEJhc2VBc3luY1Byb2Nlc3NvciBmYi5yZXNwb25zZVJlYWR5KCkgbmV2ZXIgY2FsbGVkIGZvciBvbmV3YXkgZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTM0NzFdIC0gRGFydCBnZW5lcmF0b3IgZG9lcyBub3QgaGFuZGxlIHVwcGVyY2FzZSBhcmd1bWVudCBuYW1lcworICAgICogW1RIUklGVC0zNDcwXSAtIFNwb3JhZGljIHRpbWVvdXRzIHdpdGggcGlwZXMKKyAgICAqIFtUSFJJRlQtMzQ2NV0gLSBHbyBDb2RlIFdpdGggQ29tcGxleCBDb25zdCBJbml0aWFsaXplciBDb21waWxhdGlvbiBEZXBlbmRzIE9uIFN0cnVjdCBPcmRlcgorICAgICogW1RIUklGVC0zNDY0XSAtIEZpeCBzZXZlcmFsIGRlZmVjdHMgaW4gY19nbGliIGNvZGUgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTM0NjJdIC0gQ29jb2EgZ2VuZXJhdGVzIEluY29ycmVjdCAjaW1wb3J0IGhlYWRlciBuYW1lcworICAgICogW1RIUklGVC0zNDUzXSAtIHJlbW92ZSByYXRfZXhjbHVkZQorICAgICogW1RIUklGVC0zNDE4XSAtIFVzZSBvZiBjaXBoZXJzIGluIHNzbC53cmFwX3NvY2tldCgpIGJyZWFrcyBweXRob24gMi42IGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMzQxN10gLSAibmFtZXNwYWNlIHhzZCIgaXMgbm90IHJlYWxseSB3b3JraW5nCisgICAgKiBbVEhSSUZULTM0MTNdIC0gVGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gR28gd2hlbiBleHRlbmRpbmcgc2VydmljZQorICAgICogW1RIUklGVC0zNDIwXSAtIEMrKzogVFNTTFNvY2tldHMgYXJlIG5vdCBpbnRlcnJ1cHRhYmxlCisgICAgKiBbVEhSSUZULTM0MTVdIC0gaW5jbHVkZSB1bmlzdGQuaCBjb25kaXRpb25hbGx5CisgICAgKiBbVEhSSUZULTM0MTRdIC0gI2luY2x1ZGUgPHB3ZC5oPiBpbiBUSGVhZGVyVHJhbnNwb3J0LmggYnJlYWtzIHdpbmRvd3MgYnVpbGQKKyAgICAqIFtUSFJJRlQtMzQxMV0gLSBHbyBnZW5lcmF0ZXMgcmVtb3RlcyB3aXRoIHdyb25nIHBhY2thZ2UgcXVhbGlmaWVycyB3aGVuIGluY2x1ZGluZworICAgICogW1RIUklGVC0zNDMwXSAtIEdvIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlYWQgSFRUUCByZXNwb25zZSBib2R5IHRvIGNvbXBsZXRpb24gd2hlbiBjbG9zaW5nCisgICAgKiBbVEhSSUZULTM0MjNdIC0gRmlyc3QgY2FsbCB0byB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QgZmFpbHMgdG8gZGlzcGF0Y2ggY29ycmVjdCBmdW5jdGlvbgorICAgICogW1RIUklGVC0zNDIyXSAtIEdvIFRTZXJ2ZXJTb2NrZXQgZG9lc24ndCBjbG9zZSBvbiBJbnRlcnJ1cHQKKyAgICAqIFtUSFJJRlQtMzQyMV0gLSByZWJhciBhcyBkZXBlbmRlbmN5IGluc3RlYWQgb2YgYnVuZGxpbmcgKHdhczogIHJlYmFyIGZhaWxzIGlmIFBXRCBjb250YWlucyBVbmljb2RlKQorICAgICogW1RIUklGVC0zNDI4XSAtIEdvIHRlc3QgZmFpbHMgd2hlbiBydW5uaW5nIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzQ0NV0gLSBUaHJvd2FibGUgbWVzc2FnZXMgYXJlIGhpZGRlbiBmcm9tIEpWTSBzdGFjayB0cmFjZSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMzQ0M10gLSBUaHJpZnQgaW5jbHVkZSBjYW4gZ2VuZXJhdGUgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMzQ0NF0gLSBMYXJnZSA2NCBiaXQgSW50ZWdlciBkb2VzIG5vdCBwcmVzZXJ2ZSB2YWx1ZSB0aHJvdWdoIE5vZGUuanMgSlNPTlByb3RvY29sIAorICAgICogW1RIUklGVC0zNDM2XSAtIG1pc2MuIGNyb3NzIHRlc3QgaXNzdWVzIHdpdGggVVRGLTggcGF0aCBuYW1lcworICAgICogW1RIUklGVC0zNDM1XSAtIFB1dCBnZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBmdWxsY2FtZWwgdGVzdHMgaW4gYSBzZXBhcmF0ZSBwYWNrYWdlL25hbWVzcGFjZQorICAgICogW1RIUklGVC0zNDMzXSAtIERvdWJsZXMgYXJlbid0IGludGVycHJldGVkIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zNDM3XSAtIE1pbmd3LXc2NCBidWlsZCBmYWlsCisgICAgKiBbVEhSSUZULTM0MzRdIC0gRGFydCBnZW5lcmF0b3IgcHJvZHVjZXMgZW1wdHkgbmFtZSBpbiBwdWJzcGVjLnlhbWwgZm9yIGluY2x1ZGVzIHdpdGhvdXQgbmFtZXNwYWNlcworICAgICogW1RIUklGVC0zNDA4XSAtIEpTT04gZ2VuZXJhdG9yIGVtaXRzIGluY29ycmVjdCB0eXBlcworICAgICogW1RIUklGVC0zNDA2XSAtIENvY29hIGNsaWVudCBzaG91bGQgbm90IHNjaGVkdWxlIHN0cmVhbXMgb24gbWFpbiBydW5sb29wCisgICAgKiBbVEhSSUZULTM0MDRdIC0gSlNPTiBTdHJpbmcgcmVhZGVyIGRvZXNuJ3QgcmVjb2duaXplIFVURi0xNiBzdXJyb2dhdGUgcGFpcgorICAgICogW1RIUklGVC0zNjM2XSAtIERvdWJsZSBwcmVjaXNpb24gaXMgbm90IGZ1bGx5IHByZXNlcnZlZCBpbiBDKysgVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zNjMyXSAtIGNfZ2xpYiB0ZXN0c2VyaWFsaXphdGlvbiBmYWlscyB3aXRoIGdsaWIgYXNzZXJ0aW9uCisgICAgKiBbVEhSSUZULTM2MTldIC0gVXNpbmcgVGhyaWZ0IDAuOS4zIHdpdGggZ29vZ2xldGVzdCBvbiBMaW51eCBnY2MgNC45IC8gQysrMTEKKyAgICAqIFtUSFJJRlQtMzYxN10gLSBDTWFrZSBkb2VzIG5vdCBidWlsZCBndi94bWwgZ2VuZXJhdG9ycworICAgICogW1RIUklGVC0zNjE1XSAtIEZpeCBQeXRob24gU1NMIGNsaWVudCByZXNvdXJjZSBsZWFrIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0zNjE2XSAtIGxpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5IGlzIGZsYWt5CisgICAgKiBbVEhSSUZULTM2NDNdIC0gUGVybCBTU0wgc2VydmVyIGNydXNoZXMgaWYgYSBjbGllbnQgZGlzY29ubmVjdCB3aXRob3V0IGhhbmRzaGFrZQorICAgICogW1RIUklGVC0zNjM5XSAtIEMjIFRocmlmdCBsaWJyYXJ5IGZvcmNlcyBUTFMgMS4wLCB0aHdhcnRpbmcgVExTIDEuMiB1c2FnZQorICAgICogW1RIUklGVC0zNjMzXSAtIFRyYXZpcyAiQyBDKysgLSBHQ0MiIGJ1aWxkIHdhcyB1c2luZyBjbGFuZworICAgICogW1RIUklGVC0zNjM0XSAtIEZpeCBQeXRob24gVFNvY2tldCByZXNvdXJjZSBsZWFrIG9uIGNvbm5lY3Rpb24gZmFpbHVyZQorICAgICogW1RIUklGVC0zNjMwXSAtIERlYmlhbi9VYnVudHUgaW5zdGFsbCBkb2NzIG5lZWQgYW4gdXBkYXRlCisgICAgKiBbVEhSSUZULTM2MjldIC0gUGFyc2VyIHNldHMgZXhpdGNvZGUgb24gZXJyb3JzLCBidXQgZ2VuZXJhdG9yIGRvZXMgbm90CisgICAgKiBbVEhSSUZULTM2MDhdIC0gbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdCBpcyBmbGFreSBpbiBqZW5raW5zIFRocmlmdC1wcmVjb21taXQgYnVpbGQuCisgICAgKiBbVEhSSUZULTM2MDFdIC0gQmV0dGVyIGNvbmZvcm1hbmNlIHRvIFBFUDggZm9yIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTM1OTldIC0gVmFsaWRhdGUgY2xpZW50IElQIGFkZHJlc3MgYWdhaW5zdCBjZXJ0J3MgU3ViamVjdEFsdE5hbWUKKyAgICAqIFtUSFJJRlQtMzU5OF0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgZG9lc24ndCBpbnN0YW50aWF0ZSBjbGllbnQgY29ubmVjdGlvbgorICAgICogW1RIUklGVC0zNTk3XSAtIGBtYWtlIGNoZWNrYCBoYW5ncyBpbiBnbyB0ZXN0cworICAgICogW1RIUklGVC0zNTg5XSAtIERhcnQgZ2VuZXJhdG9yIHVzZXMgd3JvbmcgbmFtZSBpbiBjb25zdHJ1Y3RvciBmb3IgdXBwZXJjYXNlIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHRzCisgICAgKiBbVEhSSUZULTM1ODhdIC0gVXNpbmcgVHlwZVNjcmlwdCB3aXRoIC0tbm9JbXBsaWNpdEFueSBmYWlscworICAgICogW1RIUklGVC0zNTg0XSAtIGJvb2xlYW4gZmFsc2UgdmFsdWUgY2Fubm90IGJlIHRyYW5zZmVycmVkCisgICAgKiBbVEhSSUZULTM1NzhdIC0gTWFrZSBUSGVhZGVyVHJhbnNwb3J0IGRldGVjdCBUQ29tcGFjdCBmcmFtZWQgYW5kIHVuZnJhbWVkCisgICAgKiBbVEhSSUZULTMzMjNdIC0gUHl0aG9uIGxpYnJhcnkgZG9lcyBub3QgaGFuZGxlIGVzY2FwZWQgZm9yd2FyZCBzbGFzaCAoIi8iKSBpbiBKU09OCisgICAgKiBbVEhSSUZULTMzMjJdIC0gQ01ha2UgZ2VuZXJhdGVkICJtYWtlIGNoZWNrIiBmYWlsZXMgb24gcHl0aG9uX3Rlc3QKKyAgICAqIFtUSFJJRlQtMzMyMV0gLSBUaHJpZnQgY2FuJ3QgYmUgYWRkZWQgYXMgYSBzdWJkaXJlY3Rvcnkgb2YgYW5vdGhlciBDTWFrZS1iYXNlZCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTMzMTRdIC0gRG90cyBpbiBmaWxlIG5hbWVzIG9mIGluY2x1ZGVzIGNhdXNlcyBkb3RzIGluIGphdmFzY3JpcHQgdmFyaWFibGUgbmFtZXMKKyAgICAqIFtUSFJJRlQtMzMwN10gLSBTZWdmYXVsdCBpbiBSdWJ5IHNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMzMwOV0gLSBNaXNzaW5nIFRDb25zdGFudC5waHAgaW4gL2xpYi9waHAvTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMzgxMF0gLSB1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbCBwdWJsaWM6IHZpcnR1YWwgdm9pZCBfX2NkZWNsIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKHZvaWQpCisgICAgKiBbVEhSSUZULTM3MzZdIC0gQysrIGxpYnJhcnkgYnVpbGQgZmFpbHMgaWYgT3BlblNTTCBkb2VzIG5vdCBzdXJycG90IFNTTHYzCisgICAgKiBbVEhSSUZULTM4NzhdIC0gQ29tcGlsZSBlcnJvciBpbiBUU1NMU29ja2V0LmNwcCB3aXRoIG5ldyBPcGVuU1NMIFtDUllQVE9fbnVtX2xvY2tzXQorICAgICogW1RIUklGVC0zOTQ5XSAtIG1pc3NpbmcgbWFrZSBkaXN0IGVudHJ5IGZvciBjb21waWxlci9jcHAvdGVzdAorICAgICogW1RIUklGVC00NDldIC0gVGhlIHdpcmUgZm9ybWF0IG9mIHRoZSBKU09OIFByb3RvY29sIG1heSBub3QgYWx3YXlzIGJlIHZhbGlkIEpTT04gaWYgaXQgY29udGFpbnMgbm9uLVVURjggZW5jb2RlZCBzdHJpbmdzCisgICAgKiBbVEhSSUZULTE2Ml0gLSBUaHJpZnQgc3RydWN0dXJlcyBhcmUgdW5oYXNoYWJsZSwgcHJldmVudGluZyB0aGVtIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMKKyAgICAqIFtUSFJJRlQtMzk2MV0gLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50IGlmIGFuIGV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHRoZSByZWNlaXZlZCBtZXNzYWdlIG9jY3VyZXMuCisgICAgKiBbVEhSSUZULTM4ODFdIC0gVHJhdmlzIENJIGJ1aWxkcyBhcmUgZmFpbGluZyBkdWUgdG8gZG9ja2VyIGZhaWx1cmVzICh0aHJlZSByZXRyaWVzLCBhbmQgZ2l2ZXMgdXApCisgICAgKiBbVEhSSUZULTM5MzddIC0gQ2Fubm90IGNvbXBpbGUgMC4xMC4wIGRldmVsb3BtZW50IHRpcCB3aXRoIGdjYy00LjYueAorICAgICogW1RIUklGVC0zOTY0XSAtIFVuc3VwcG9ydGVkIG1lY2hhbmlzbSB0eXBlID8/Pz8/IGR1ZSB0byBkZXBlbmRlbmN5IG9uIGRlZmF1bHQgT1MtZGVwZW5kZW50IGNoYXJzZXQKKyAgICAqIFtUSFJJRlQtMzAzOF0gLSBVc2Ugb2Ygdm9sYXRpbGUgaW4gY3BwIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMzMwMV0gLSBKYXZhIGdlbmVyYXRlZCBjb2RlIHVzZXMgaW1wb3J0cyB0aGF0IGNhbiBsZWFkIHRvIGNsYXNzIG5hbWUgY29sbGlzaW9ucyB3aXRoIElETCBkZWZpbmVkIHR5cGVzCisgICAgKiBbVEhSSUZULTMzNDhdIC0gUEhQIFRDb21wYWN0UHJvdG9jb2wgYm9vbCZpbnQ2NCByZWFkdmFsdWUgYnVnCisgICAgKiBbVEhSSUZULTM5NTVdIC0gVFRocmVhZGVkU2VydmVyIE1lbW9yeSBMZWFrCisgICAgKiBbVEhSSUZULTM4MjldIC0gVGhyaWZ0IGRvZXMgbm90IGluc3RhbGwgUHl0aG9uIExpYnJhcmllcyBpZiBUd2lzdGVkIGlzIG5vdCBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMzkzMl0gLSBDKysgVGhyZWFkTWFuYWdlciBoYXMgYSByYXJlIHRlcm1pbmF0aW9uIHJhY2UKKyAgICAqIFtUSFJJRlQtMzgyOF0gLSBjbWFrZSBmYWlscyB3aGVuIEJvb3N0X0lOQ0xVREVfRElSUyAoYW5kIG90aGVyIHZhcmlhYmxlcyBwYXNzZWQgdG8gaW5jbHVkZV9kaXJlY3RvcmllcygpKSBpcyBlbXB0eSAKKyAgICAqIFtUSFJJRlQtMzk1OF0gLSBDTWFrZSBXSVRIX01UIG9wdGlvbiBmb3Igd2luZG93cyBzdGF0aWMgcnVudGltZSBsaW5raW5nIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNtYWtlIGJ1aWxkIHR5cGUgUmVsV2l0aERlYkluZm8KKyAgICAqIFtUSFJJRlQtMzk1N10gLSBUQ29ubmVjdGVkQ2xpZW50IGRvZXMgbm90IGRpc2Nvbm5lY3QgZnJvbSBjbGllbnRzIHdoZW4gdGhlaXIgdGltZW91dCBpcyByZWFjaGVkLgorICAgICogW1RIUklGVC0zOTUzXSAtIFRTU0xTb2NrZXQ6OmNsb3NlIHNob3VsZCBoYW5kbGUgZXhjZXB0aW9ucyBmcm9tIHdhaXRGb3JFdmVudCBiZWNhdXNlIGl0IGlzIGNhbGxlZCBieSB0aGUgZGVzdHJ1Y3Rvci4KKyAgICAqIFtUSFJJRlQtMzk3N10gLSBQSFAgZXh0ZW5zaW9uIGNyZWF0ZXMgdW5kZWZpbmVkIHZhbHVlcyB3aGVuIGRlc2VyaWFsaXppbmcgc2V0cworICAgICogW1RIUklGVC0zOTQ3XSAtIHNvY2thZGRyIHR5cGUgaXNuJ3QgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgdGhlIHJldHVybiBvZiBnZXRzb2NrbmFtZQorICAgICogW1RIUklGVC0yNzU1XSAtIFRocmVhZFNhbml0aXplciByZXBvcnRzIGRhdGEgcmFjZSBpbiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIKKyAgICAqIFtUSFJJRlQtMzk0OF0gLSBlcnJubyBpcyBub3QgdGhlIGNvcnJlY3QgbWV0aG9kIG9mIGdldHRpbmcgdGhlIGVycm9yIGluIHdpbmRvd3MKKyAgICAqIFtUSFJJRlQtNDAwOF0gLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworICAgICogW1RIUklGVC0zOTk5XSAtIEZpeCBEZWJpYW4gJiBVYnVudHUgcGFja2FnZSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMzg4Nl0gLSBQSFAgY3Jvc3MgdGVzdCBjbGllbnQgcmV0dXJucyAwIGV2ZW4gd2hlbiBmYWlsaW5nCisgICAgKiBbVEhSSUZULTM5OTddIC0gYnVpbGRpbmcgdGhyaWZ0IGxpYnMgZG9lcyBub3Qgc3VwcG9ydCBuZXcgb3BlbnNzbAorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTM4NjddIC0gU3BlY2lmeSBCaW5hcnlQcm90b2NvbCBhbmQgQ29tcGFjdFByb3RvY29sCisKKyMjIEVwaWMKKyAgICAqIFtUSFJJRlQtMzA0OV0gLSBBcyBhbiBpT1MgZGV2ZWxvcGVyLCBJIHdhbnQgYSBnZW5lcmF0b3IgYW5kIGxpYnJhcnkgdGhhdCBwcm9kdWNlcyBTd2lmdCBjb2RlCisgICAgKiBbVEhSSUZULTIzMzZdIC0gVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE4NjddIC0gUHl0aG9uIGNsaWVudC9zZXJ2ZXIgc2hvdWxkIHN1cHBvcnQgY2xpZW50LXNpZGUgY2VydGlmaWNhdGVzLgorICAgICogW1RIUklGVC0xMzEzXSAtIGNfZ2xpYiBjb21wYWN0IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTM4NV0gLSBtYWtlIGluc3RhbGwgZG9lc24ndCBpbnN0YWxsIGphdmEgbGlicmFyeSBpbiB0aGUgc2V0dGVkIGZvbGRlcgorICAgICogW1RIUklGVC0xNDM3XSAtIFVwZGF0ZSBSUE0gc3BlYworICAgICogW1RIUklGVC04NDddIC0gVGVzdCBGcmFtZXdvcmsgaGFybW9uaXphdGlvbiBhY3Jvc3MgYWxsIGxhbmd1YWdlcworICAgICogW1RIUklGVC04MTldIC0gYWRkIEVudW1lcmF0aW9uIGZvciBwcm90b2NvbCwgdHJhbnNwb3J0IGFuZCBzZXJ2ZXIgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzkyN10gLSBFbWl0IGFuIGVycm9yIGluc3RlYWQgb2YgdGhyb3cgYW4gZXJyb3IgaW4gdGhlIGFzeW5jIGNhbGxiYWNrCisgICAgKiBbVEhSSUZULTM5MzFdIC0gVFNpbXBsZVNlcnZlcjogSWYgcHJvY2VzcyByZXF1ZXN0IGVuY291bnRlciBVTktOT1dOX01FVEhPRCwgZG9uJ3QgY2xvc2UgdHJhbnNwb3J0LgorICAgICogW1RIUklGVC0zOTM0XSAtIEF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBPcGVuU1NMIGJpbmFyeSB2ZXJzaW9uIG9uIFdpbmRvd3MgQ0kKKyAgICAqIFtUSFJJRlQtMzkxOF0gLSBSdW4gc3Vic2V0IG9mIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtMzkwOF0gLSBSZW1vdmUgcmVkdW5kYW50IGRlcGVuZGVuY2llcyBmcm9tIERvY2tlcmZpbGUKKyAgICAqIFtUSFJJRlQtMzkwN10gLSBTa2lwIERvY2tlciBpbWFnZSBidWlsZCBvbiBDSSB3aGVuIHVuY2hhbmdlZAorICAgICogW1RIUklGVC0zODY4XSAtIEphdmEgc3RydWN0IGVxdWFscyBzaG91bGQgZG8gaWRlbnRpdHkgY2hlY2sgYmVmb3JlIGZpZWxkIGNvbXBhcmlzb24KKyAgICAqIFtUSFJJRlQtMzg0OV0gLSBQb3J0IEdvIHNlcmlhbGl6ZXIgYW5kIGRlc2VyaWFsaXplciB0byBkYXJ0CisgICAgKiBbVEhSSUZULTI5ODldIC0gQ29tcGxldGUgQ01ha2UgYnVpbGQgZm9yIEFwYWNoZSBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMjk4MF0gLSBUaHJpZnRNZW1vcnlCdWZmZXIgZG9lc24ndCBoYXZlIGEgY29uc3RydWN0b3Igb3B0aW9uIHRvIHRha2UgYW4gZXhpc3RpbmcgYnVmZmVyCisgICAgKiBbVEhSSUZULTI4NTZdIC0gcmVmYWN0b3IgZXJsYW5nIGJhc2ljIHRyYW5zcG9ydHMgYW5kIHVuaWZ5IGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMjg3N10gLSBPcHRpbWl6ZSBnZW5lcmF0ZWQgaGFzaENvZGUKKyAgICAqIFtUSFJJRlQtMjg2OV0gLSBKU09OOiBydW4gc2NoZW1hIHZhbGlkYXRpb24gZnJvbSB0ZXN0cworICAgICogW1RIUklGVC0zMTEyXSAtIFtKYXZhXSBBc3luY01ldGhvZENhbGxiYWNrIHNob3VsZCBiZSB0eXBlZCBpbiBnZW5lcmF0ZWQgQXN5bmNJZmFjZQorICAgICogW1RIUklGVC0zMjYzXSAtIFBIUCBqc29uU2VyaWFsaXplKCkgc2hvdWxkIGNhc3Qgc2NhbGFyIHR5cGVzCisgICAgKiBbVEhSSUZULTI5MDVdIC0gQ29jb2EgY29tcGlsZXIgc2hvdWxkIGhhdmUgb3B0aW9uIHRvIHByb2R1Y2UgIm1vZGVybiIgT2JqZWN0aXZlLUMKKyAgICAqIFtUSFJJRlQtMjgyMV0gLSBFbmFibGUgdGhlIHVzZSBvZiBjdXN0b20gSFRUUC1IZWFkZXIgaW4gdGhlIFRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMDkzXSAtIGFkZGVkIHRoZSBhYmlsaXR5IHRvIHNldCBjb21wcmVzc2lvbiBsZXZlbCBpbiBDKysgemxpYiB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA4OV0gLSBDb21waWxlciBpZ25vcmVzIGR1cGxpY2F0ZSB0eXBlbmFtZXMKKyAgICAqIFtUSFJJRlQtMjA1Nl0gLSBNb3ZlZCBhbGwgI2luY2x1ZGUgY29uZmlnLmggc3RhdGVtZW50cyB0byAjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorICAgICogW1RIUklGVC0yMDMxXSAtIE1ha2UgU09fS0VFUEFMSVZFIGNvbmZpZ3VyYWJsZSBmb3IgQysrIGxpYgorICAgICogW1RIUklGVC0yMDIxXSAtIEltcHJvdmUgbGFyZ2UgYmluYXJ5IHByb3RvY29sIHN0cmluZyBwZXJmb3JtYW5jZQorICAgICogW1RIUklGVC0yMDI4XSAtIENsZWFudXAgdGhyZWFkaW5nIGhlYWRlcnMgLyBsaWJyYXJpZXMKKyAgICAqIFtUSFJJRlQtMjAxNF0gLSBDaGFuZ2UgQysrIGxpYiBpbmNsdWRlcyB0byB1c2UgPG5hbWVzcGFjZS8+IHN0eWxlIHRocm91Z2hvdXQKKyAgICAqIFtUSFJJRlQtMjMxMl0gLSB0cmF2aXMueW1sOiBidWlsZCBldmVyeXRoaW5nCisgICAgKiBbVEhSSUZULTE5MTVdIC0gTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTE3MzZdIC0gVmlzdWFsIFN0dWRpbyB0b3AgbGV2ZWwgcHJvamVjdCBmaWxlcyB3aXRoaW4gbXN2YworICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTUzM10gLSBNYWtlIFRUcmFuc3BvcnQgc2hvdWxkIGJlIENsb3NlYWJsZQorICAgICogW1RIUklGVC0zNV0gLSBNb3ZlIGxhbmd1YWdlIHRlc3RzIGludG8gdGhlaXIgYXBwcm9wcmlhdGUgbGlicmFyeSBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMTA3OV0gLSBTdXBwb3J0IGk2NCBpbiBBUzMKKyAgICAqIFtUSFJJRlQtMTEwOF0gLSBTU0wgc3VwcG9ydCBmb3IgdGhlIFJ1YnkgbGlicmFyeSAKKyAgICAqIFtUSFJJRlQtMzg1Nl0gLSB1cGRhdGUgZGViaWFuIHBhY2thZ2UgZGVlcGVuZGVuY2llcworICAgICogW1RIUklGVC0zODMzXSAtIGhheGUgaHR0cCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gKGJ5IGVtYmVkaW5nIGludG8gcGhwIHdlYiBzZXJ2ZXIpCisgICAgKiBbVEhSSUZULTM4MzldIC0gUGVyZm9ybWFuY2UgaXNzdWUgd2l0aCBiaWcgbWVzc2FnZSBkZXNlcmlhbGl6YXRpb24gdXNpbmcgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0zODIwXSAtIEVybGFuZzogRGV0ZWN0IE9UUCA+PSAxOCB0byB1c2UgbmV3IHRpbWUgY29ycmVjdGlvbgorICAgICogW1RIUklGVC0zODE2XSAtIFJlZHVjZSBkb2NrZXIgYnVpbGQgZHVyYXRpb24gb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM4MTVdIC0gUHV0IGFwcHZleW9yIGRlcGVuZGVuY3kgdmVyc2lvbnMgdG8gb25lIHBsYWNlCisgICAgKiBbVEhSSUZULTM3ODhdIC0gQ29tcGF0aWJpbGl0eSBpbXByb3ZlbWVudHMgYW5kIFdpbjY0IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzc5Ml0gLSBUaW1lb3V0cyBmb3IgYW5vbnltb3VzIHBpcGVzIHNob3VsZCBiZSBjb25maWd1cmFibGUKKyAgICAqIFtUSFJJRlQtMzc5NF0gLSBTcGxpdCBEZWxwaGkgYXBwbGljYXRpb24sIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgZXhjZXB0aW9uIHN1YnR5cGVzIGludG8gc2VwYXJhdGUgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0zNzc0XSAtIFRoZSBnZW5lcmF0ZWQgY29kZSBzaG91bGQgaGF2ZSBleGNlcHRpb25fbmFtZXMgbWV0YSBpbmZvCisgICAgKiBbVEhSSUZULTM3NjJdIC0gRml4IGJ1aWxkIHdhcm5pbmdzIGZvciBkZXByZWNhdGVkIFRocmlmdCAiYnl0ZSIgZmllbGRzCisgICAgKiBbVEhSSUZULTM3NTZdIC0gSW1wcm92ZSByZXF1aXJlZG5lc3MgZG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zNzYxXSAtIEFkZCBkZWJpYW4gcGFja2FnZSBmb3IgUHl0aG9uMworICAgICogW1RIUklGVC0zNzQyXSAtIGhheGUgcGhwIGNsaSBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM3MzNdIC0gU29ja2V0IHRpbWVvdXQgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTM3MjhdIC0gaHR0cCB0cmFuc3BvcnQgZm9yIHRocmlmdC1sdWEKKyAgICAqIFtUSFJJRlQtMzkwNV0gLSBEYXJ0IGNvbXBpbGVyIGRvZXMgbm90IGluaXRpYWxpemUgYm9vbCwgaW50LCBhbmQgZG91YmxlIHByb3BlcnRpZXMKKyAgICAqIFtUSFJJRlQtMzkxMV0gLSBMb29zZW4gUnVieSBkZXYgZGVwZW5kZW5jeSB2ZXJzaW9uIHJlcXVpcmVtZW50cworICAgICogW1RIUklGVC0zOTA2XSAtIFJ1biBDIyB0ZXN0cyB3aXRoIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMzkwMF0gLSBBZGQgUHl0aG9uIFNTTCBmbGFncworICAgICogW1RIUklGVC0zODk3XSAtIFByb3ZpZGUgbWVhbmluZ2Z1bCBleGNlcHRpb24gdHlwZSBiYXNlZCBvbiBXZWJFeGNlcHRpb25TdGF0dXMgaW4gY2FzZSBvZiB0aW1lb3V0CisgICAgKiBbVEhSSUZULTM4MDhdIC0gTWlzc2luZyBgRE9VQkxFYCBpbiB0aHJpZnQgdHlwZSBlbnVtZXJhdGlvbgorICAgICogW1RIUklGVC0zODAzXSAtIFJlbW92ZSAiZmlsZSIgYXR0cmlidXRlIGZyb20gWE1MIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNjYwXSAtIEFkZCBWNCBtYXBwZWQgYWRkcmVzcyB0byB0ZXN0IGNsaWVudCBjZXJ0J3MgYWx0bmFtZQorICAgICogW1RIUklGVC0zNjYxXSAtIFVzZSBodHRwcyB0byBkb3dubG9hZCBtZWNrIGluIGVybGFuZyB0ZXN0IGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NTldIC0gQ2hlY2sgY29uZmlndXJlIHJlc3VsdCBvZiBDTWFrZSBvbiBDSQorICAgICogW1RIUklGVC0zNjY3XSAtIEFkZCBUTFMgU05JIHN1cHBvcnQgdG8gY2xpZW50cworICAgICogW1RIUklGVC0zNjUxXSAtIE1ha2UgYmFja3BvcnRzLm1hdGNoX2hvc3RuYW1lIGFuZCBpcGFkZHJlc3Mgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMzY2Nl0gLSBCdWlsZCBEIHR1dG9yaWFsIGFzIHBhcnQgb2YgQXV0b3Rvb2xzIGJ1aWxkCisgICAgKiBbVEhSSUZULTM2NjVdIC0gQWRkIEQgbGliZXZlbnQgYW5kIE9wZW5TU0wgdG8gZG9ja2VyIGltYWdlcworICAgICogW1RIUklGVC0zNjY0XSAtIFJlbW92ZSBtZDUuYworICAgICogW1RIUklGVC0zNjYyXSAtIEFkZCBIYXNrZWxsIHRvIGRlYmlhbiBkb2NrZXIgaW1hZ2UKKyAgICAqIFtUSFJJRlQtMzcxMV0gLSBBZGQgRCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0CisgICAgKiBbVEhSSUZULTM2OTFdIC0gUnVuIGZsYWtlOCBQeXRob24gc3R5bGUgY2hlY2sgb24gVHJhdmlzLUNJCisgICAgKiBbVEhSSUZULTM2OTJdIC0gKFJlKWVuYWJsZSBBcHB2ZXlvciBDKysgYW5kIFB5dGhvbiBidWlsZAorICAgICogW1RIUklGVC0zNjc3XSAtIEltcHJvdmUgQ01ha2UgSmF2YSBidWlsZAorICAgICogW1RIUklGVC0zNjc5XSAtIEFkZCBzdGRvdXQgbG9nIHRvIHRlc3RCaW5hcnkgaW4gSmF2YSB0ZXN0IHNlcnZlcgorICAgICogW1RIUklGVC0zNzE4XSAtIFJlZHVjZSBzaXplIG9mIGRvY2tlciBpbWFnZSBmb3IgYnVpbGQgZW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMzY5OF0gLSBbVHJhdmlzLUNJXSBJbnRyb2R1Y2UgcmV0cnkgdG8gYXB0IGNvbW1hbmRzCisgICAgKiBbVEhSSUZULTMxMjddIC0gc3dpdGNoIC1yZWN1cnNlIHRvIC0tcmVjdXJzZSBhbmQgcmVzZXJ2ZSAtcgorICAgICogW1RIUklGVC0zMDg3XSAtIFBhc3Mgb24gZXJyb3JzIGxpa2UgImNvbm5lY3Rpb24gY2xvc2VkIgorICAgICogW1RIUklGVC0zMjQwXSAtIFRocmlmdCBQeXRob24gY2xpZW50IHNob3VsZCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIGFuZCB3aWxkY2FyZCBjZXJ0cyBpbiBUU1NMU29ja2V0CisgICAgKiBbVEhSSUZULTMyMTNdIC0gbWFrZSBjcm9zcyBzaG91bGQgaW5kaWNhdGUgd2hlbiBpdCBza2lwcyBhIGtub3duIGZhaWxpbmcgdGVzdAorICAgICogW1RIUklGVC0zMjA4XSAtIEZpeCBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGJ1aWxkIGZhaWx1cmUgZHVlIHRvIG1pc3Npbmcgc291cmNlCisgICAgKiBbVEhSSUZULTMxODZdIC0gQWRkIFRTZXJ2ZXJIVFRQIHRvIEdvIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjM0Ml0gLSBBZGQgX19GSUxFX18gYW5kIF9fTElORV9fIHRvIFRocmlmdCBDKysgZXhjcGV0aW9ucworICAgICogW1RIUklGVC0zMzcyXSAtIEFkZCBkYXJ0IGdlbmVyYXRvciB0byBWaXN1YWwgU3R1ZGlvIHByb2plY3QKKyAgICAqIFtUSFJJRlQtMzM2Nl0gLSBUaHJpZnRUZXN0IHRvIGltcGxlbWVudCBzdGFuZGFyZCByZXR1cm4gdmFsdWVzIAorICAgICogW1RIUklGVC0zNDAyXSAtIFByb3ZpZGUgYSBwZXJsIFVuaXggU29ja2V0IGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMzNjFdIC0gSW1wcm92ZSBDIyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTMzOTNdIC0gSW50cm9kdWNlIGk4IHRvIHByb3ZpZGUgY29uc2lzdGVudCBzZXQgb2YgVGhyaWZ0IElETCBpbnRlZ2VyIHR5cGVzCisgICAgKiBbVEhSSUZULTMzMzldIC0gU3VwcG9ydCBmb3IgZGF0YWJhc2Uvc3FsCisgICAgKiBbVEhSSUZULTM1NjVdIC0gQysrOiBUW0FzeW5jXVByb2Nlc3Nvcjo6Z2V0RXZlbnRIYW5kbGVyKCkgc2hvdWxkIGJlIGRlY2xhcmVkIGFzIGNvbnN0IG1lbWJlciBmdW5jdGlvbnMKKyAgICAqIFtUSFJJRlQtMzU2M10gLSBDKysvUXQ6IHJlbW92ZWQgdXNhZ2Ugb2YgbWFjcm8gUVRfUFJFUEVORF9OQU1FU1BBQ0UgYXMgaXQgaXNuJ3QgY29uc2VxdWVudGx5IHVzZWQgZm9yIGFsbCByZWZlcmVuY2VzIHRvIFF0IHR5cGVzLgorICAgICogW1RIUklGVC0zNTYyXSAtIFJlbW92ZWQgdW51c2VkIFRBc3luY1Byb2Nlc3Nvcjo6Z2V0QXN5bmNTZXJ2ZXIoKQorICAgICogW1RIUklGVC0zNTYxXSAtIEMrKy9RdDogbWFrZSB1c2Ugb2YgUV9ESVNBQkxFX0NPUFkoKSB0byBnZXQgcmlkIG9mIGNvcHkgY3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvcgorICAgICogW1RIUklGVC0zNTU2XSAtIGNfZ2xpYiBmaWxlIGRlc2NyaXB0b3IgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTM1NDRdIC0gTWFrZSBjcm9zcyB0ZXN0IGZhaWwgd2hlbiBzZXJ2ZXIgcHJvY2VzcyBkaWVkIHVuZXhwZWN0ZWRseQorICAgICogW1RIUklGVC0zNTQwXSAtIE1ha2UgcHl0aG9uIHR1dG9yaWFsIG1vcmUgaW4gbGluZSB3aXRoIFBFUDgKKyAgICAqIFtUSFJJRlQtMzUzNV0gLSBEYXJ0IGdlbmVyYXRvciBhcmd1bWVudCB0byBwcm9kdWNlIGEgZmlsZSBzdHJ1Y3R1cmUgdXNhYmxlIGluIHBhcmVudCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM1MDVdIC0gRW5oYW5jZSBQeXRob24gVFNTTFNvY2tldAorICAgICogW1RIUklGVC0zNTA2XSAtIEVsaW1pbmF0ZSBvbGQgc3R5bGUgY2xhc3NlcyBmcm9tIGxpYnJhcnkgY29kZQorICAgICogW1RIUklGVC0zNTAzXSAtIEVuYWJsZSBweTp1dGY4c3RyaW5nIGJ5IGRlZmF1bHQKKyAgICAqIFtUSFJJRlQtMzQ5OV0gLSBBZGQgcGFja2FnZV9wcmVmaXggdG8gcHl0aG9uIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0zNDk1XSAtIE1pbm9yIGVuaGFuY2VtZW50cyBhbmQgZml4ZXMgZm9yIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzQ4Nl0gLSBKYXZhIGdlbmVyYXRlZCBgZ2V0RmllbGRWYWx1ZWAgaXMgaW5jb21wYXRpYmxlIHdpdGggYHNldEZpZWxkVmFsdWVgIGZvciBiaW5hcnkgdmFsdWVzLgorICAgICogW1RIUklGVC0zNDg0XSAtIENvbnNvbGlkYXRlIHRlbXBvcmFyeSBidWZmZXJzIGluIEphdmEncyBUQ29tcGFjdFByb3RvY29sCisgICAgKiBbVEhSSUZULTM1MTZdIC0gQWRkIGZlYXR1cmUgdGVzdCBmb3IgVEhlYWRlciBUQmluYXJ5UHJvdG9jb2wgaW50ZXJvcAorICAgICogW1RIUklGVC0zNTE1XSAtIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBhbmQgdGVzdCBvbiBDSQorICAgICogW1RIUklGVC0zNTE0XSAtIFBIUCA3IGNvbXBhdGlibGUgdmVyc2lvbiBvZiBiaW5hcnkgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMzQ2OV0gLSBEb2NrZXI6IERlYmlhbiBzdXBwb3J0CisgICAgKiBbVEhSSUZULTM0MTZdIC0gUmV0aXJlIG9sZCAieHh4X25hbWVzcGFjZSIgZGVjbGFyYXRpb25zIGZyb20gdGhlIElETAorICAgICogW1RIUklGVC0zNDI2XSAtIEFsaWduIGF1dG9nZW4gY29tbWVudCBpbiBYU0QKKyAgICAqIFtUSFJJRlQtMzQyNF0gLSBBZGQgQ01ha2UgYW5kcm9pZCBidWlsZCBvcHRpb24KKyAgICAqIFtUSFJJRlQtMzQzOV0gLSBSdW4gbWFrZSBjcm9zcyB1c2luZyBQeXRob24zIHdoZW4gYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTM0NDBdIC0gUHl0aG9uIG1ha2UgY2hlY2sgdGFrZXMgdG9vIG11Y2ggdGltZQorICAgICogW1RIUklGVC0zNDQxXSAtIFN0YWJpbGl6ZSBUcmF2aXMtQ0kgYnVpbGRzCisgICAgKiBbVEhSSUZULTM0MzFdIC0gQXZvaWQgInNjaGVtZXMiIEhhc2hNYXAgbG9va3VwcyBkdXJpbmcgc3RydWN0IHJlYWRzL3dyaXRlcworICAgICogW1RIUklGVC0zNDMyXSAtIEFkZCBhIFRCeXRlQnVmZmVyIHRyYW5zcG9ydCB0byB0aGUgSmF2YSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM0MzhdIC0gRW5hYmxlIHB5Om5ld19zdHlsZSBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTM0MDVdIC0gR28gVEh0dHBDbGllbnQgbWlzdXNlcyBodHRwLkNsaWVudCBvYmplY3RzCisgICAgKiBbVEhSSUZULTM2MTRdIC0gSW1wcm92ZSBsb2dnaW5nIG9mIHRlc3Rfc3Nsc29ja2V0LnB5CisgICAgKiBbVEhSSUZULTM2NDddIC0gRml4IHBocCBleHRlbnNpb24gYnVpbGQgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMzY0Ml0gLSBTcGVlZCB1cCBjcm9zcyB0ZXN0IHJ1bm5lcgorICAgICogW1RIUklGVC0zNjM3XSAtIEltcGxlbWVudCBjb21wYWN0IHByb3RvY29sIGZvciBkYXJ0CisgICAgKiBbVEhSSUZULTM2MTNdIC0gUG9ydCBQeXRob24gQyBleHRlbnNpb24gdG8gUHl0aG9uIDMKKyAgICAqIFtUSFJJRlQtMzYxMl0gLSBBZGQgUHl0aG9uIEMgZXh0ZW5zaW9uIGZvciBjb21wYWN0IHByb3RvY29sCisgICAgKiBbVEhSSUZULTM2MTFdIC0gQWRkIC0tcmVnZXggZmlsdGVyIHRvIGNyb3NzIHRlc3QgcnVubmVyCisgICAgKiBbVEhSSUZULTM2MzFdIC0gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCisgICAgKiBbVEhSSUZULTM2MDldIC0gUmVtb3ZlIG9yIHJlcGxhY2UgVGVzdFBvcnRGaXh0dXJlLmgKKyAgICAqIFtUSFJJRlQtMzYwNV0gLSBIYXZlIHRoZSBjb21waWxlciBjb21wbGFpbiBhYm91dCBpbnZhbGlkIGFyZ3VtZW50cyBhbmQgb3B0aW9ucworICAgICogW1RIUklGVC0zNTk2XSAtIEJldHRlciBjb25mb3JtYW5jZSB0byBQRVA4CisgICAgKiBbVEhSSUZULTM1ODVdIC0gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgTHVhCisgICAgKiBbVEhSSUZULTM1ODJdIC0gRXJsYW5nIGxpYnJhcmllcyBzaG91bGQgaGF2ZSBzZXJ2aWNlIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTM1NzldIC0gSW50cm9kdWNlIHJldHJ5IHRvIG1ha2UgY3Jvc3MKKyAgICAqIFtUSFJJRlQtMzMwNl0gLSBKYXZhOiBUQmluYXJ5UHJvdG9jb2w6IFVzZSAxIHRlbXAgYnVmZmVyIGluc3RlYWQgb2YgYWxsb2NhdGluZyA4CisgICAgKiBbVEhSSUZULTM5MTBdIC0gRG8gbm90IGludm9rZSBwaXAgYXMgcGFydCBvZiBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTE4NTddIC0gUHl0aG9uIDMuWCBTdXBwb3J0CisgICAgKiBbVEhSSUZULTE5NDRdIC0gQmluZGluZyB0byB6ZXJvIHBvcnQKKyAgICAqIFtUSFJJRlQtMzk1NF0gLSBFbmFibGUgdGhlIHVzYWdlIG9mIHN0cnVjdHMgY2FsbGVkICJPYmplY3QiIGluIEphdmEKKyAgICAqIFtUSFJJRlQtMzk4MV0gLSBFbmFibGUgYW5hbHl6ZXIgc3Ryb25nIG1vZGUgaW4gRGFydCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTM5OThdIC0gRG9jdW1lbnQgYWJpbGl0eSB0byBhZGQgY3VzdG9tIHRhZ3MgdG8gdGhyaWZ0IHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDAwNl0gLSBBZGQgYSByZW1vdmVFdmVudExpc3RlbmVyIG1ldGhvZCBvbiBUU29ja2V0CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTY0MF0gLSBTdXBwb3J0IGRlcHJlY2F0aW9uCisgICAgKiBbVEhSSUZULTk0OF0gLSBTU0wgc29ja2V0IHN1cHBvcnQgZm9yIFBIUAorICAgICogW1RIUklGVC03NjRdIC0gYWRkIFN1cHBvcnQgZm9yIFZhbGEgbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtMzA0Nl0gLSBBbGxvdyBQU1I0IGNsYXNzIGxvYWRpbmcgZm9yIGdlbmVyYXRlZCBjbGFzc2VzIChQSFApCisgICAgKiBbVEhSSUZULTIxMTNdIC0gRXJsYW5nIFNTTCBTb2NrZXQgU3VwcG9ydAorICAgICogW1RIUklGVC0xNDgyXSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IHVuZGVyIFBIUAorICAgICogW1RIUklGVC01MTldIC0gU3VwcG9ydCBjb2xsZWN0aW9ucyBvZiB0eXBlcyB3aXRob3V0IGhhdmluZyB0byBleHBsaWNpdGx5IGRlZmluZSBpdAorICAgICogW1RIUklGVC00NjhdIC0gUmFjayBNaWRkbGV3YXJlIEFwcGxpY2F0aW9uIGZvciBSYWlscworICAgICogW1RIUklGVC0xNzA4XSAtIEFkZCBldmVudCBoYW5kbGVycyBmb3IgcHJvY2Vzc29yIGV2ZW50cworICAgICogW1RIUklGVC0zODM0XSAtIEVybGFuZyBuYW1lc3BhY2luZyBhbmQgZXhjZXB0aW9uIG1ldGFkYXRhCisgICAgKiBbVEhSSUZULTI1MTBdIC0gSW1wbGVtZW50IFROb25ibG9ja2luZ1NlcnZlcidzIGFiaWxpdHkgdG8gbGlzdGVuIG9uIHVuaXggZG9tYWluIHNvY2tldHMKKyAgICAqIFtUSFJJRlQtMzM5N10gLSBJbXBsZW1lbnQgVFByb2Nlc3NvckZhY3RvcnkgaW4gQyMgdG8gZW5hYmxlIHBlci1jbGllbnQgcHJvY2Vzc29ycworICAgICogW1RIUklGVC0zNTIzXSAtIFhNTCBHZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMzUxMF0gLSBBZGQgSHR0cFRhc2tBc3luY0hhbmRsZXIgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzMxOF0gLSBQSFA6IFNpbXBsZUpTT05Qcm90b2NvbCBJbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0zMjk5XSAtIERhcnQgbGFuZ3VhZ2UgYmluZGluZ3MgaW4gVGhyaWZ0CisgICAgKiBbVEhSSUZULTI4MzVdIC0gQWRkIHBvc3NpYmlsaXR5IHRvIGRpc3RyaWJ1dGUgZ2VuZXJhdG9ycyBzZXBhcmF0ZWx5IGZyb20gdGhyaWZ0IGNvcmUsIGFuZCBsb2FkIHRoZW0gZHluYW1pY2FsbHkKKyAgICAqIFtUSFJJRlQtMTg0XSAtIEFkZCBPU0dpIE1hbmlmZXN0IGhlYWRlcnMgdG8gdGhlIGxpYnRocmlmdCBqYXZhIGxpYnJhcnkgdG8gYmUgYWJsZSB0byB1c2UgVGhyaWZ0IGluIHRoZSBPU0dpIHJ1bnRpbWUKKyAgICAqIFtUSFJJRlQtMTQxXSAtIElmIGEgcmVxdWlyZWQgZmllbGQgaXMgbm90IHByZXNlbnQgb24gc2VyaWFsaXphdGlvbiwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE4OTFdIC0gQWRkIFdpbmRvd3MgQUxQQyB0cmFuc3BvcnQgd2hpY2ggaXMgcmlnaHQgY291bnRlcnBhcnQgb2YgVW5peCBkb21haW4gc29ja2V0cworCisjIyBRdWVzdGlvbgorICAgICogW1RIUklGVC0xODA4XSAtIFRoZSBUaHJpZnQgc3RydWN0IHNob3VsZCBiZSBjb25zaWRlcmVkIHNlbGYtY29udGFpbmVkPworICAgICogW1RIUklGVC0yODk1XSAtIFR1dG9yaWFsIGNwcAorICAgICogW1RIUklGVC0zODYwXSAtIEVsZXBoYW50LWJpcmQgYXBwbGljYXRpb24gVGVzdCBmYWlscyBmb3IgVGhyaWZ0CisgICAgKiBbVEhSSUZULTM4MTFdIC0gSFRUUFMgU3VwcG9ydCBmb3IgQysrIGFwcGxpY2F0aW9ucworICAgICogW1RIUklGVC0zNTA5XSAtICJtYWtlIGNoZWNrIiBlcnJvcgorCisjIyBTdG9yeQorICAgICogW1RIUklGVC0zNDUyXSAtIC50cmF2aXMueW1sOiBNaWdyYXRpbmcgZnJvbSBsZWdhY3kgdG8gY29udGFpbmVyLWJhc2VkIGluZnJhc3RydWN0dXJlCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE4MTFdIC0gcnVieSB0dXRvcmlhbCBhcyBwYXJ0IG9mIHRoZSByZWd1bGFyIGJ1aWxkCisgICAgKiBbVEhSSUZULTI3NzldIC0gUEhQIFRKU09OUHJvdG9jb2wgZW5jb2RlIHVuaWNvZGUgaW50byBVQ1MtNExFIHdoaWNoIGNhbid0IGJlIHBhcnNlZCBieSBvdGhlciBsYW5ndWFnZSBiaW5kaW5ncworICAgICogW1RIUklGVC0yMTEwXSAtIEVybGFuZzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzg1Ml0gLSBBIFRyYXZpcy1DSSBqb2IgZmFpbHMgd2l0aCAid3JpdGUgZXJyb3IiCisgICAgKiBbVEhSSUZULTM3NDBdIC0gRml4IGhheGVsaWIuanNvbiBjbGFzc3BhdGggCisgICAgKiBbVEhSSUZULTM2NTNdIC0gaW5jb3JyZWN0IHVuaW9uIHNlcmlhbGl6YXRpb24KKyAgICAqIFtUSFJJRlQtMzY1Ml0gLSBpbmNvcnJlY3Qgc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbHMKKyAgICAqIFtUSFJJRlQtMzY1NV0gLSBpbmNvcnJlY3QgdW5pb24gc2VyaWFsaXphdGlvbgorICAgICogW1RIUklGVC0zNjU0XSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjU2XSAtIGluY29ycmVjdCBzZXJpYWxpemF0aW9uIG9mIG9wdGlvbmFscworICAgICogW1RIUklGVC0zNjk5XSAtIEZpeCBpbnRlZ2VyIGxpbWl0IHN5bWJvbCBpbmNsdWRlcyBpbiBQeXRob24gQyBleHRlbnNpb24KKyAgICAqIFtUSFJJRlQtMzY5M10gLSBGaXggaW5jbHVkZSBpc3N1ZSBpbiBDKysgVFNTTFNvY2tldEludGVycnVwdFRlc3Qgb24gV2luZG93cworICAgICogW1RIUklGVC0zNjk0XSAtIFtXaW5kb3dzXSBEaXNhYmxlIHRlc3RzIG9mIGEgZmV3IHNlcnZlcnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZAorICAgICogW1RIUklGVC0zNjk2XSAtIEluc3RhbGwgcGlwIHRvIENlbnRPUyBEb2NrZXIgaW1hZ2VzIHRvIGZpeCBQeXRob24gYnVpbGRzCisgICAgKiBbVEhSSUZULTM2MzhdIC0gRml4IGhheGVsaWIuanNvbgorICAgICogW1RIUklGVC0zMjUxXSAtIEFkZCBodHRwIHRyYW5zcG9ydCBmb3Igc2VydmVyIHRvIEdvIGxpYgorICAgICogW1RIUklGVC0yNDI0XSAtIFJlY3Vyc2l2ZSBUeXBlcworICAgICogW1RIUklGVC0yNDIzXSAtIFRIZWFkZXIKKyAgICAqIFtUSFJJRlQtMjQxM10gLSBQeXRob246IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDA5XSAtIEphdmE6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDEyXSAtIEQ6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yNDExXSAtIEMrKzogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTI0MTBdIC0gSmF2YU1lOiBVVEYtOCBzZW50IGJ5IFBIUCBhcyBKU09OIGlzIG5vdCB1bmRlcnN0b29kIGJ5IFRKc29uUHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjY2OF0gLSBUZXN0U3VpdGU6IGRldGFpbGVkIHJlc3VsdCBvbiBwYXNzZWQgdGVzdHMgYnkgZmVhdHVyZQorICAgICogW1RIUklGVC0yNjU5XSAtIHB5dGhvbiBUZXN0IFNlcnZlciBmYWlscyB3aGVuIHRocm93aW5nIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzM5OF0gLSBBZGQgQ01ha2UgYnVpbGQgIGZvciBIYXNrZWxsIGxpYnJhcnkgYW5kIHRlc3RzCisgICAgKiBbVEhSSUZULTMzOTZdIC0gREFSVDogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTMzNjRdIC0gICBGaXggcnVieSBiaW5hcnkgZmllbGQgZW5jb2RpbmcgaW4gVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zMzgxXSAtIEZpeCBmb3IgbWlzYy4gY29kZWdlbiBpc3N1ZXMgd2l0aCBUSFJJRlQtMjkwNQorICAgICogW1RIUklGVC0zNTczXSAtIE5vIHJ1bGUgdG8gbWFrZSB0YXJnZXQgYC4uLy4uLy4uL3Rlc3QvY19nbGliL3NyYy8uZGVwcy90ZXN0dGhyaWZ0dGVzdC10aHJpZnRfdGVzdF9oYW5kbGVyLlBvJy4KKyAgICAqIFtUSFJJRlQtMzU3Ml0gLSAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgYSBzaWduZWQgcmlnaHQgc2hpZnQiCisgICAgKiBbVEhSSUZULTM1NDJdIC0gQWRkIGxlbmd0aCBsaW1pdCBzdXBwb3J0IHRvIEphdmEgdGVzdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzUzN10gLSBSZW1vdmUgdGhlIChub3cgb2Jzb2xldGUpIGNzaGFycDphc3luY2N0cCBmbGFnIAorICAgICogW1RIUklGVC0zNTMyXSAtIEFkZCBjb25maWd1cmFibGUgc3RyaW5nIGFuZCBjb250YWluZXIgcmVhZCBzaXplIGxpbWl0IHRvIFB5dGhvbiBwcm90b2NvbHMKKyAgICAqIFtUSFJJRlQtMzUzMV0gLSBDcmVhdGUgY3Jvc3MgbGFuZyBmZWF0dXJlIHRlc3QgZm9yIHN0cmluZyBhbmQgY29udGFpbmVyIHJlYWQgbGVuZ3RoIGxpbWl0CisgICAgKiBbVEhSSUZULTM0ODJdIC0gSGFza2VsbCBKU09OIHByb3RvY29sIGRvZXMgbm90IGVuY29kZSBiaW5hcnkgZmllbGQgYXMgQmFzZTY0CisgICAgKiBbVEhSSUZULTM0MjVdIC0gTWlub3IgZml4ZXMgKyBzaW1wbGlmaWNhdGlvbiBmb3IgQ2VudE9TIERvY2tlcmZpbGUKKyAgICAqIFtUSFJJRlQtMzQ0Ml0gLSBSdW4gQ01ha2UgdGVzdHMgb24gQXBwdmV5b3IKKyAgICAqIFtUSFJJRlQtMzQwOV0gLSBOb2RlSlMgYmluYXJ5IGZpZWxkIGlzc3VlcworICAgICogW1RIUklGVC0zNjIxXSAtIEZpeCBsaWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjhdIC0gRml4IGxpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjVdIC0gS2lsbCB1bnVzZWQgI2luY2x1ZGUgIlRlc3RQb3J0Rml4dHVyZS5oIiBpbiBsaWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwLgorICAgICogW1RIUklGVC0zNjQ2XSAtIEZpeCBQeXRob24gZXh0ZW5zaW9uIGJ1aWxkIHdhcm5pbmdzCisgICAgKiBbVEhSSUZULTM2MjZdIC0gRml4IGxpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgdG8gdXNlIGVwaGVtZXJhbCBwb3J0cy4KKyAgICAqIFtUSFJJRlQtMzYyNF0gLSBGaXggbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcCB0byB1c2UgZXBoZW1lcmFsIHBvcnRzCisgICAgKiBbVEhSSUZULTM2MjNdIC0gRml4IEZpeCBjcHAvbGliL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwIHRvIHVzZSBlcGhlbWVyYWwgcG9ydHMKKyAgICAqIFtUSFJJRlQtMzU5Ml0gLSBBZGQgYmFzaWMgdGVzdCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMzk4MF0gLSBhZGQgVEV4dGVuZGVkQmluYXJ5UHJvdG9jb2wuamF2YQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTE4MDFdIC0gU3luYyB1cCBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMgYWNyb3NzIGxhbmd1YWdlcyBhbmQgdGhyaWZ0IGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC0xMjU5XSAtIEF1dG9tYXRlIHZlcnNpb25pbmcgCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtMzQwMF0gLSBBZGQgRXJsYW5nIHRvIGNyb3NzIHRlc3QKKyAgICAqIFtUSFJJRlQtMzUwNF0gLSBGaXggRmFzdGJpbmFyeVRlc3QucHkKKworIyMgV2lzaAorICAgICogW1RIUklGVC0zOTIzXSAtIE1heWJlIHJlbW92ZSBBZXJlbyBmcm9tIHRoZSAiUG93ZXJlZCBieSIgbGlzdAorICAgICogW1RIUklGVC0yMTQ5XSAtIEFkZCBhbiBvcHRpb24gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBkZWZhdWx0IG9wZXJhdG9ycwogCiAKLVZlcnNpb24gMC44LjAKIAotVEhSSUZULTEzMzAgICBQSFAgICAgICAgICAgICAgICAgICBQSFAgTmFtZXNwYWNlcyBubyBsb25nZXIgZ2VuZXJhdGVkCi1USFJJRlQtMTM5MiAgIFBIUCAgICAgICAgICAgICAgICAgIEVuYWJsaW5nIGJvdGggbmFtZXNwYWNlcyBhbmQgYXV0b2xvYWRpbmcgaW4gZ2VuZXJhdGVkIFBIUCBjb2RlIHdvbid0IHdvcmsuCi1USFJJRlQtMzg2ICAgIFB5dGhvbiAgICAgICAgICAgICAgIE1ha2UgaXQgcG9zc2libGUgdG8gYnVpbGQgdGhlIFB5dGhvbiBsaWJyYXJ5IHdpdGhvdXQgdGhlIGV4dGVuc2lvbgotVEhSSUZULTE0MzEgICBOb2RlLmpzICAgICAgICAgICAgICBSZW5hbWUgJ3N5cycgbW9kdWxlIHRvICd1dGlsJwotVEhSSUZULTE0MzUgICBEZWxwaGkgICAgICAgICAgICAgICBtYWtlIFRFeGNlcHRpb24uTWVzc2FnZSBwcm9wZXJ0eSBjb25mb3JtYW50IHRvIHRoZSB1c3VhbCBleHBlY3RhdGlvbnMKLVRIUklGVC0xNDMyICAgSmF2YVNjcmlwdCAgICAgICAgICAgSmF2YXNjcmlwdCBzdHJ1Y3QgY29uc3RhbnRzIGRlY2xhcmVkIGluIHRoZSBzYW1lIGZpbGUgYXMgdGhlaXIgc3RydWN0IGNhdXNlIGFuIGVycm9yCi1USFJJRlQtMTM5MSAgIERlbHBoaSAgICAgICAgICAgICAgIEltcHJvdmVkIERlbHBoaSBYRSB0ZXN0IGNhc2VzCi1USFJJRlQtMTM4NyAgIEMrKyAgICAgICAgICAgICAgICAgIEJ1aWxkIE1TVkMgbGlicmFyaWVzIHdpdGggQm9vc3QgVGhyZWFkcyBpbnN0ZWFkIG9mIFB0aHJlYWRzCi1USFJJRlQtMTQyNiAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIERpc3QgcGFja2FnZSBtaXNzaW5nIGZpbGVzIGZvciByZWxlYXNlIDAuOAotVEhSSUZULTE0MjggICBUdXRvcmlhbCAgICAgICAgICAgICBzaGFyZWQudGhyZnQgZG9lcyBub3QgaW5jbHVkZSBuYW1lc3BhY2UgZm9yIHBocCwgY29tcGlsZXIgZ2VuZXJhdGUgaW5jb3JyZWN0IG5hbWUKLVRIUklGVC0xNDExICAgSmF2YSAgICAgICAgICAgICAgICAgamF2YSBnZW5lcmF0b3IgZG9lcyBub3QgcHJvdmlkZSB0eXBlIHBhcmFtZXRlciBmb3IgVEJhc2VQcm9jZXNzb3IKLVRIUklGVC0xNDI1ICAgTm9kZS5qcyAgICAgICAgICAgICAgVGhlIE5vZGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXRlc3Qgbm9kZSAoMC42KSAmIG5wbSAoMS4wLjI3KQotVEhSSUZULTE0MDEgICBEZWxwaGkgICAgICAgICAgICAgICBKU09OLXByb3RvY29sIGZvciBEZWxwaGkgWEUgTGlicmFyaWVzCi1USFJJRlQtMTQyNCAgIFJ1YnkgICAgICAgICAgICAgICAgIFJ1Ynkgc3BlY3MgZmFpbCB3aGVuIHJ1biB3aXRoIHJha2UKLVRIUklGVC0xMzgyICAgUnVieSAgICAgICAgICAgICAgICAgQnVuZGxlIGluc3RhbGwgZG9lc25vdCB3b3JrIGJlY2F1c2UgdGhyaWZ0IGNyYXNoZXMKLVRIUklGVC0xMjUxICAgSmF2YSAgICAgICAgICAgICAgICAgR2VuZXJhdGVkIGphdmEgY29kZSBzaG91bGQgaW5kaWNhdGUgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZCBhbmQgd2hpY2ggYXJlIG9wdGlvbmFsCi1USFJJRlQtMTM2MSAgIEMrKyAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIHJlcGxhY2VtZW50IG9mIHB0aHJlYWQgYnkgYm9vc3Q6OnRocmVhZAotVEhSSUZULTE0MTUgICBEZWxwaGkgICAgICAgICAgICAgICBkZWxwaGk6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKLVRIUklGVC0xMDMxICAgQysrICAgICAgICAgICAgICAgICAgUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCi1USFJJRlQtMTQyMCAgIEphdmEgICAgICAgICAgICAgICAgIE5vbmJsb2NraW5nIGFuZCBIc0hhIHNlcnZlciBzaG91bGQgY2xvc2UgYWxsIHNvY2tldCBjb25uZWN0aW9ucyB3aGVuIHRoZSBzZWxlY3RvciBleGl0cwotVEhSSUZULTE0MTkgICBKYXZhICAgICAgICAgICAgICAgICBBYnN0cmFjdE5vbkJsb2NraW5nU2VydmVyIGRvZXMgbm90IGNhdGNoIGVycm9ycyB3aGVuIGludm9raW5nIHRoZSBwcm9jZXNzb3IKLVRIUklGVC0xNDE2ICAgUHl0aG9uICAgICAgICAgICAgICAgUHl0aG9uIFVuaXQgdGVzdCBpcyBicm9rZW4gb24gY2kKLVRIUklGVC0xNDA5ICAgRGVscGhpICAgICAgICAgICAgICAgTmFtZSBjb25mbGljdCBjaGVjayBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGZvciBleGNlcHRpb24gb2JqZWN0KERlbHBoaSkuCi1USFJJRlQtMTQxMyAgIERlbHBoaSAgICAgICAgICAgICAgIEdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHJlYWQgTWFwRW5kIC8gTGlzdEVuZCAvIFNldEVuZAotVEhSSUZULTE0MDggICBEZWxwaGkgICAgICAgICAgICAgICBEZWxwaGkgVGVzdCBTZXJ2ZXI6IEV4Y2VwdGlvbiB0ZXN0IGNhc2UgZmFpbHMgZHVlIHRvIG5hbWluZyBjb25mbGljdCB3aXRoIGUubWVzc2FnZQotVEhSSUZULTE0MDcgICBQeXRob24gICAgICAgICAgICAgICBUeXBvIGluIFB5dGhvbiBzb2NrZXQgc2VydmVyIGNhdXNlcyBUaHJpZnQgdG8gZmFpbCB3aGVuIHdlIGVuYWJsZSBhIGdsb2JhbCBzb2NrZXQgdGltb3V0Ci1USFJJRlQtMTQwNSAgIERlbHBoaSAgICAgICAgICAgICAgIERlbHBoaSBjb21waWxlciBkb2VzIG5vdCBnZW5lcmF0ZXMgY29udGFpbmVyIHNlcmlhbGl6ZXIgcHJvcGVybHkuCi1USFJJRlQtMTM5OSAgIERlbHBoaSAgICAgICAgICAgICAgIE9uZSBvZiB0aGUgVFNlcnZlckltcGwuQ3JlYXRlIENUT1JzIGxhY2tzIGltcGxlbWVudGF0aW9uCi1USFJJRlQtMTQwNiAgIERlbHBoaSAgICAgICAgICAgICAgIEJ1aWxkIGVycm9yIGFmdGVyIGFwcGx5aW5nIFRIUklGVC0xMzk1Ci1USFJJRlQtMTQwNCAgIERlbHBoaSAgICAgICAgICAgICAgIERlbHBoaSBjb21waWxlciBnZW5lcmF0ZXMgc3RydWN0IHJlYWRlciBjb2RlIHdpdGggcHJvYmxlbS4KLVRIUklGVC0xMzk1ICAgRGVscGhpICAgICAgICAgICAgICAgUGF0Y2ggdG8gcHJldmVudCB3YXJuaW5ncyBmb3IgaW50ZWdlciB0eXBlcyBpbiBzb21lIGNhc2VzCi1USFJJRlQtMTQwMCAgIFJ1YnkgICAgICAgICAgICAgICAgIFJ1YnkgbmF0aXZlIGV4dGVuc2lvbiBhYm9ydHMgd2l0aCBfX3N0YWNrX2Noa19mYWlsIGluIE9TWAotVEhSSUZULTEzOTcgICBUZXN0IFN1aXRlICAgICAgICAgICBDSSBzZXJ2ZXIgZmFpbHMgZHVyaW5nIGJ1aWxkIGR1ZSB0byB1bnVzZWQgcGFyYW1ldGVycyBpbiBkZWxwaGkgZ2VuZXJhdG9yCi1USFJJRlQtMTM5NiAgIERlbHBoaSAgICAgICAgICAgICAgIERlcGhpIGdlbmVyYXRvciBoYXMgZGVwZW5kYWN5IG9uIGJvb3N0IDEuNDIgbGF0ZXIuCi1USFJJRlQtMTM5MCAgIEJ1aWxkIFByb2Nlc3MgICAgICAgIERlYmlhbiBwYWNrYWdlcyBidWlsZCBmaXggZm9yIFNxdWVlemUgKGJ1aWxkIGZyb20gdGhlIG9mZmljaWFsICAwLjcuMCB0YXJiYWxsKQotVEhSSUZULTEzOTMgICBQSFAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uJ3MgdGhyb3duIGZyb20gVEh0dHBDbGllbnQgaGFzIGV4dHJhIHNsYXNoZXMgaW4gdGhlIEV4Y2VwdGlvbiBtZXNzYWdlCi1USFJJRlQtMTM2NiAgIERlbHBoaSAgICAgICAgICAgICAgIERlbHBoaSBnZW5lcmF0b3IsIGxpcmJyYXJ5IGFuZCB1bml0IHRlc3QuCi1USFJJRlQtMTEzMCAgIENvbXBpbGVyIChHZW5lcmFsKSAgIEFkZCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHN5bWJvbGljIGRlZmF1bHQgdmFsdWUgZm9yIG9wdGlvbmFsIGJvb2xlYW4KLVRIUklGVC0xMzgxICAgQysrICAgICAgICAgICAgICAgICAgVGhyaWZ0IEMrKyBsaWJzIGhhdmUgaW5jb3JyZWN0bHkgdmVyc2lvbmVkIG5hbWVzCi1USFJJRlQtMTM4NCAgIEphdmFtZSAgICAgICAgICAgICAgIEphdmEgaGVscCBtZW51IG1pc3NpbmcgbmV3bGluZSBuZWFyIGphdmFtZSBmbGFnCi1USFJJRlQtMTM3MyAgIEMrKyAgICAgICAgICAgICAgICAgIEZpeCB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGdlbmVyYXRpb24gaW4gdGhyaWZ0IChweXRob24pCi1USFJJRlQtMTM3OSAgIEMrKyAgICAgICAgICAgICAgICAgIGZpeCB1bmluaXRpYWxpemVkIGVudW0gdmFsdWVzIGluIHRocmlmdCBDKysgb2JqZWN0cwotVEhSSUZULTEzNzcgICBDKysgICAgICAgICAgICAgICAgICBhYm9ydCBQSFAgZGVzZXJpYWxpemF0aW9uIG9uIHVua25vd24gZmllbGQgdHlwZQotVEhSSUZULTEzNzYgICBDKysgICAgICAgICAgICAgICAgICBNYWtlIHBvcnQgc3BlY2lmaWNhdGlvbiBvcHRpb24gaW4gdGhyaWZ0IHJlbW90ZQotVEhSSUZULTEzNzUgICBDKysgICAgICAgICAgICAgICAgICBmaXhlZCBhIGhleCBjaGFyIGNvbnZlcnNpb24gYnVnIGluIFRKU09OUHJvdG9jb2wKLVRIUklGVC0xMzcwICAgQyBnbGliICAgICAgICAgICAgICAgRGViaWFuIHBhY2thZ2luZyBzaG91bGQgQnVpbGQtRGVwZW5kIG9uIGxpYmdsaWIyLjAtZGV2Ci1USFJJRlQtMTEyMSAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgc2VydmVyIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gaW4gMC42Ci1USFJJRlQtMTM2NSAgIEphdmEgICAgICAgICAgICAgICAgIFR1cGxlUHJvdG9jb2wjd3JpdGVCaXRTZXQgdW5pbnRlbnRpb25hbGx5IHdyaXRlcyBhIHZhcmlhYmxlIGxlbmd0aCBieXRlIGFycmF5Ci1USFJJRlQtMTM1OSAgIEMrKyAgICAgICAgICAgICAgICAgIC0tZ2VuLWNvYiBjcHA6Y29iX3N0eWxlIGRvZXMgbm90IGNvbXBpbGUgYW55bW9yZQotVEhSSUZULTEzNTUgICBSdWJ5ICAgICAgICAgICAgICAgICBSdW5uaW5nIG1ha2UgaW4gbGliL3JiIGRvZXNuJ3QgYnVpbGQgdGhlIG5hdGl2ZSBleHRlbnNpb25zCi1USFJJRlQtMTM1NCAgIFJ1YnkgICAgICAgICAgICAgICAgIEFkZCByYWtlIHRhc2sgdG8gYnVpbGQganVzdCB0aGUgZ2VtIGZpbGUKLVRIUklGVC04NTcgICAgVGVzdCBTdWl0ZSAgICAgICAgICAgdGVzdHMgcnVuIGJ5ICJtYWtlIGluc3RhbGwiIGZhaWwgaWYgZ2VuZXJhdG9ycyBhcmUgZGlzYWJsZWQKLVRIUklGVC0xMzM5ICAgSmF2YSAgICAgICAgICAgICAgICAgRXh0ZW5kIFR1cGxlIFByb3RvY29sIHRvIFRVbmlvbnMKLVRIUklGVC0xMzMxICAgUnVieSAgICAgICAgICAgICAgICAgUnVieSBsaWJyYXJ5IGRlc2VyaWFsaXplcyBhbiBlbXB0eSBtYXAgdG8gbmlsCi1USFJJRlQtMTM1MCAgIEdvICAgICAgICAgICAgICAgICAgIEdvIGxpYnJhcnkgY29kZSBkb2VzIG5vdCBidWlsZCBhcyBvZiByNjAgKG1vc3QgcmVjZW50IHJlbGVhc2UpCi1USFJJRlQtMTIyNyAgIEVybGFuZyAgICAgICAgICAgICAgIEVybGFuZyBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgSlNPTiBwcm90b2NvbAotVEhSSUZULTEzMzUgICBDKysgICAgICAgICAgICAgICAgICBBZGQgYWNjZXB0IHRpbWVvdXQgdG8gVFNlcnZlclNvY2tldAotVEhSSUZULTEzNDUgICBCdWlsZCBQcm9jZXNzICAgICAgICBBbGxvdyBidWlsZGluZyB3aXRob3V0IHRlc3RzCi1USFJJRlQtMTM0MiAgIFB5dGhvbiAgICAgICAgICAgICAgIENvbXBpbGF0aW9uIHByb2JsZW0gb24gV2luZG93cyBvZiBmYXN0YmluYXJ5LmMKLVRIUklGVC0xMzQxICAgQysrICAgICAgICAgICAgICAgICAgVFByb3RvY29sLmggZW5kaWFuIGRldGVjdGlvbiB3cm9uZyB3aXRoIGJvb3N0Ci1USFJJRlQtMTI0MyAgIEMrKyAgICAgICAgICAgICAgICAgIFRBc3luY0NoYW5uZWwgY2FsbGJhY2tzCi1USFJJRlQtMTIzOCAgIEphdmFTY3JpcHQgICAgICAgICAgIFRocmlmdCBKUyBjbGllbnQgY2Fubm90IHJlYWQgbWFwIG9mIHN0cnVjdHVyZXMKLVRIUklGVC0xMzMzICAgQysrICAgICAgICAgICAgICAgICAgTWFrZSBSV0d1YXJkIG5vdCBjb3B5YWJsZQotVEhSSUZULTEzMzQgICBDKysgICAgICAgICAgICAgICAgICBBZGQgbW9yZSBpbmZvIHRvIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotVEhSSUZULTEzMzIgICBKYXZhICAgICAgICAgICAgICAgICBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBjbGFzcyB1c2VzIGhhcmQgY29kZWQgdmFsdWUga2V5TWFuYWdlclR5cGU6IFN1blg1MDkKLVRIUklGVC0xMzI4ICAgSmF2YSAgICAgICAgICAgICAgICAgVEJhc2VIZWxwZXIudG9TdHJpbmcoLi4uKSBhcHBlbmRzIEJ5dGVCdWZmZXIgZGF0YSBvdXRzaWRlIG9mIHZhbGlkIGJ1ZmZlciByYW5nZQotVEhSSUZULTEzMjIgICBPQ2FtbCAgICAgICAgICAgICAgICBPQ2FtbCBsaWIgZmFpbCB0byBjb21waWxlOiBUaHJpZnQubWwgbGluZSAzMDUsIGludCB2cyBpbnQzMiBtaXNtYXRjaAotVEhSSUZULTEyNzkgICBQSFAgICAgICAgICAgICAgICAgICB0eXBlIHNldCBpcyBoYW5kbGVkIGluY29ycmVjdGx5IHdoZW4gd3JpdGluZyBvYmplY3QKLVRIUklGVC0xMzIwICAgQysrICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3kgb2YgY29uZmlndXJlIGdlbmVyYXRlZCBjb25maWcuaAotVEhSSUZULTEzMTkgICBKYXZhICAgICAgICAgICAgICAgICBNaXNtYXRjaCBiZXR3ZWVuIGhvdyBhIHVuaW9uIHJlYWRzIGFuZCB3cml0ZXMgYSBjb250YWluZXIKLVRIUklGVC0xMzE2ICAgQysrICAgICAgICAgICAgICAgICAgdGhyaWZ0OiB1cGRhdGUgc2VydmVyIGNsYXNzZXMgdG8gYWNjZXB0Ci1USFJJRlQtMTMxNCAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogYWRkIFRQcm9jZXNzb3JGYWN0b3J5Ci1USFJJRlQtMTMxNSAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogZ2VuZXJhdGUgc2VydmVyIGludGVyZmFjZSBmYWN0b3J5IGNsYXNzZXMKLVRIUklGVC0xMzE3ICAgQysrICAgICAgICAgICAgICAgICAgUmVtb3ZlIGNvcHkgY29uc3RydWN0aWJpbGl0eSBmcm9tCi1USFJJRlQtMTMwNSAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogbWFrZSBUQ29ubmVjdGlvbiBhIHByaXZhdGUgaW5uZXIgY2xhc3Mgb2YKLVRIUklGVC0xMjg2ICAgUnVieSAgICAgICAgICAgICAgICAgTW9kZXJuaXplIHRoZSBUaHJpZnQgUnVieSBMaWJyYXJ5IERldiBFbnZpcm9ubWVudAotVEhSSUZULTEzMDQgICBDKysgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXI6IHBhc3MgaW4gdGhlIGNvbm5lY3Rpb24gY29udGV4dCB0bwotVEhSSUZULTEzMDIgICBDKysgICAgICAgICAgICAgICAgICB0aHJpZnQ6IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBzZW5kKCkgdGltZXMgb3V0IGluCi1USFJJRlQtMTMwMSAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogY29uc29saWRhdGUgY29tbW9uIGNvZGUgaW4gVE5vbmJsb2NraW5nU2VydmVyCi1USFJJRlQtMTI5OCAgIEphdmEgICAgICAgICAgICAgICAgIFN0YW5kYXJkIHNjaGVtZSBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgYWxvbmcgd2l0aCBmaWVsZCB2YWx1ZXMKLVRIUklGVC0xMjU3ICAgSmF2YSAgICAgICAgICAgICAgICAgdGhyaWZ0J3MgZGVwZW5kZW5jeSBzY29wZSBvbiBqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpIHNob3VsZCBiZSAncHJvdmlkZWQnCi1USFJJRlQtMTI0MCAgIFBIUCAgICAgICAgICAgICAgICAgIFRCaW5hcnlTZXJpYWxpemVyIGludmFsaWQgc2VyaWFsaXphdGlvbiBkdWUgdG8gVEJ1ZmZlclRyYW5zcG9ydCBub3QgZmx1c2hpbmcgCi1USFJJRlQtMTI5NSAgIEMrKyAgICAgICAgICAgICAgICAgIER1cGxpY2F0ZSBpbmNsdWRlIGluIFRTb2NrZXQuY3BwCi1USFJJRlQtMTI5NCAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogZml4IGxvZyBtZXNzYWdlIHR5cG9zIGluIFRTaW1wbGVTZXJ2ZXIKLVRIUklGVC0xMjkzICAgQysrICAgICAgICAgICAgICAgICAgdGhyaWZ0OiBpbXByb3ZlIGhhbmRsaW5nIG9mIGV4Y2VwdGlvbnMgdGhyb3duIGJ5Ci1USFJJRlQtMTI5MiAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogc2lsZW5jZSBsb2cgc3BldyBmcm9tIFRUaHJlYWRlZFNlcnZlcgotVEhSSUZULTEyOTAgICBDKysgICAgICAgICAgICAgICAgICB0aHJpZnQ6IFROb25ibG9ja2luZ1NlcnZlcjogY2xlYW4gdXAgc3RhdGUgaW4gdGhlCi1USFJJRlQtMTI4OSAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogaW1wbGVtZW50IFROb25ibG9ja2luZ1NlcnZlcjo6c3RvcCgpCi1USFJJRlQtMTI4OCAgIEMrKyAgICAgICAgICAgICAgICAgIEFsbG93IHR5cGVkZWZlZCBleGNlcHRpb25zIGluIHRocm93cyBjbGF1c2VzCi1USFJJRlQtMTI4NyAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogc3RhcnQgcmVmYWN0b3Jpbmcgc29tZSBvZiB0aGUgQysrIHByb2Nlc3NvcgotVEhSSUZULTEyODAgICBDKysgICAgICAgICAgICAgICAgICBUaHJpZnQ6IEltcHJvdmUgTW9uaXRvciBleGNlcHRpb24tZnJlZSBpbnRlcmZhY2VzCi1USFJJRlQtMTI4MSAgIENvbXBpbGVyIChHZW5lcmFsKSAgIGFkZCBAZ2VuZXJhdGVkIHRvIHRoZSBkb2NibG9jawotVEhSSUZULTEyODIgICBKYXZhICAgICAgICAgICAgICAgICBVcGdyYWRlIGh0dHBjbGllbnQgdG8gNC4xLjIgKGZyb20gNC4wLjEpCi1USFJJRlQtMTI4NCAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogZml4IHByb2Nlc3NvciBpbmhlcml0YW5jZQotVEhSSUZULTEyODMgICBDKysgICAgICAgICAgICAgICAgICB0aHJpZnQ6IHdyYXAgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKCkgdG8gODAKLVRIUklGVC0xMjc4ICAgSmF2YSAgICAgICAgICAgICAgICAgamF2YWRvYyB3YXJuaW5ncyAtIGNvbXBpbGF0aW9uCi1USFJJRlQtMTI1NCAgIEphdmFNRSAgICAgICAgICAgICAgIENvZGUgY29tcGlsZWQgYWdhaW5zdCBhIHJlZ3VsYXIgSlJFOiBPYmplY3QuY2xvbmUoKSBvdmVycmlkZSBoYXMgYSBkaWZmZXJlbnQgcmV0dXJuIHR5cGUKLVRIUklGVC0xMjcxICAgQysrICAgICAgICAgICAgICAgICAgdGhyaWZ0OiBmaXggbWlzc2luZyBuYW1lc3BhY2UgaW4gZ2VuZXJhdGVkIGxvY2FsCi1USFJJRlQtMTI3NCAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogZmFpbCBjb21waWxhdGlvbiBpZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzCi1USFJJRlQtMTI3NSAgIEMrKyAgICAgICAgICAgICAgICAgIHRocmlmdDogYWx3YXlzIHByZWZpeCBuYW1lc3BhY2VzIHdpdGggIiA6OiIKLVRIUklGVC0xMjY1ICAgQysrICAgICAgICAgICAgICAgICAgQysrIGNvbnRhaW5lciBkZXNlcmlhbGl6ZQotVEhSSUZULTExNjcgICBKYXZhICAgICAgICAgICAgICAgICBKYXZhIG5vbmJsb2NraW5nIHNlcnZlciB3aXRoIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGZvciBzZWxlY3QgYW5kIGhhbmRsaW5nIElPCi1USFJJRlQtMzgwICAgIFB5dGhvbiAgICAgICAgICAgICAgIFVzZSBzZXR1cHRvb2xzIGZvciBweXRob24gYnVpbGQKLVRIUklGVC0xMjcwICAgQysrICAgICAgICAgICAgICAgICAgdGhyaWZ0OiBhZGQgLS1hbGxvdy1uZWcta2V5cyBhcmd1bWVudCB0byBhbGxvdwotVEhSSUZULTEyNjMgICBSdWJ5ICAgICAgICAgICAgICAgICBwdWJsaXNoIHJ1YnkgY2xpZW50IHRvIHJ1YnlnZW1zCi1USFJJRlQtMTIwNSAgIEphdmEgICAgICAgICAgICAgICAgIHBvcnQgc2VydmVyIHVuZHVseSBmcmFnaWxlIHdpdGggYXJiaXRyYXJ5IGlucHV0Ci1USFJJRlQtNzY5ICAgIEphdmEgICAgICAgICAgICAgICAgIFBsdWdnYWJsZSBTZXJpYWxpemVycwotVEhSSUZULTEyMzkgICBKYXZhICAgICAgICAgICAgICAgICBUdXBsZVByb3RvY29sLSBBbiBleHRyZW1lbHkgY29tcGFjdCwgdGVtcG9yYXJ5IHByb3RvY29sCitUaHJpZnQgMC45LjMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMjQ0MV0gLSBDYW5ub3Qgc2h1dGRvd24gVFRocmVhZGVkU2VydmVyIHdoZW4gY2xpZW50cyBhcmUgc3RpbGwgY29ubmVjdGVkCisgICAgKiBbVEhSSUZULTI0NjVdIC0gVEJpbmFyeVByb3RvY29sVCBicmVha3MgaWYgY29waWVkL21vdmVkCisgICAgKiBbVEhSSUZULTI0NzRdIC0gdGhyaWZ0LmggY2F1c2VzIGEgY29tcGlsZSBmYWlsdXJlCisgICAgKiBbVEhSSUZULTI1NDBdIC0gUnVubmluZyBjb25maWd1cmUgZnJvbSBvdXRzaWRlIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGZhaWxzCisgICAgKiBbVEhSSUZULTI1OThdIC0gQWRkIGNoZWNrIGZvciBtaW5pbXVtIEdvIHZlcnNpb24gdG8gY29uZmlndXJlLmFjCisgICAgKiBbVEhSSUZULTI2NDddIC0gY29tcGlsZXItaHM6IGRvbid0IGRlY2FwaXRhbGl6ZSBmaWVsZCBuYW1lcywgZG8gZGVjYXBpdGFsaXplIGFyZ3VtZW50IGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTI3NzNdIC0gR2VuZXJhdGVkIEphdmEgY29kZSBmb3IgJ29uZXdheScgbWV0aG9kcyBpcyBpbmNvcnJlY3QuCisgICAgKiBbVEhSSUZULTI3ODldIC0gVE5vbmJsb2NraW5nU2VydmVyIGxlYWtzIHNvY2tldCBGRCdzIHVuZGVyIGxvYWQKKyAgICAqIFtUSFJJRlQtMjY4Ml0gLSBUVGhyZWFkZWRTZXJ2ZXIgbGVha3MgcGVyLXRocmVhZCBtZW1vcnkKKyAgICAqIFtUSFJJRlQtMjY3NF0gLSBKYXZhU2NyaXB0OiBkZWNsYXJlIEFjY2VwdDogYW5kIENvbnRlbnQtVHlwZTogaW4gcmVxdWVzdAorICAgICogW1RIUklGVC0zMDc4XSAtIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCdzIGxvZ2dlciBpcyBub3QgbmFtZWQgYWZ0ZXIgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0CisgICAgKiBbVEhSSUZULTMwNzddIC0gQysrIFRGaWxlVHJhbnNwb3J0IGlnbm9yZXMgcmV0dXJuIGNvZGUgZnJvbSBmdHJ1bmNhdGUKKyAgICAqIFtUSFJJRlQtMzA2N10gLSBDKysgY3BwY2hlY2sgcGVyZm9ybWFuY2UgcmVsYXRlZCB3YXJuaW5ncworICAgICogW1RIUklGVC0zMDY2XSAtIEMrKyBURGVuc2VQcm90b2NvbCBhc3NlcnQgbW9kaWZpZXMgaW5zdGVhZCBvZiBjaGVja3MKKyAgICAqIFtUSFJJRlQtMzA3MV0gLSBib290c3RyYXAuc2ggb24gVWJ1bnR1IDEyLjA0IChQcmVjaXNlKSBhdXRvbWFrZSBlcnJvcgorICAgICogW1RIUklGVC0zMDY5XSAtIEMrKyBUU2VydmVyU29ja2V0IGxlYWtzIHNvY2tldCBvbiBmY250bCBnZXQgb3Igc2V0IGZsYWdzIGVycm9yCisgICAgKiBbVEhSSUZULTMwNzldIC0gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0J3MgbG9nZ2VyIGlzIG5vdCBuYW1lZCBhZnRlciBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMzA4MF0gLSBDKysgVE5vbmJsb2NraW5nU2VydmVyIGNvbm5lY3Rpb24gbGVhayB3aGlsZSBhY2NlcHQgaHVnZSBudW1iZXIgY29ubmVjdGlvbnMuCisgICAgKiBbVEhSSUZULTMwODZdIC0gQysrIFZhbGdyaW5kIEVycm9yIENsZWFudXAKKyAgICAqIFtUSFJJRlQtMzA4NV0gLSB0aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudCBuZXZlciB0cnkgdG8gcmVjb25uZWN0CisgICAgKiBbVEhSSUZULTMxMjNdIC0gTWlzc2luZyBpbmNsdWRlIGluIGNvbXBpbGVyL2NwcC9zcmMvbWFpbi5oIGJyZWFrcyBidWlsZCBpbiBzb21lIGVudmlyb25tZW50cworICAgICogW1RIUklGVC0zMTI1XSAtIEZpeCB0aGUgbGlzdCBvZiBleHBvcnRlZCBoZWFkZXJzIGluIGF1dG9tYWtlIGlucHV0CisgICAgKiBbVEhSSUZULTMxMjZdIC0gUEhQIEpTT04gc2VyaWFsaXplciBjb252ZXJ0cyBlbXB0eSBvciBpbnQtaW5kZXhlZCBtYXBzIHRvIGxpc3RzCisgICAgKiBbVEhSSUZULTMxMzJdIC0gUHJvcGVybHkgZm9ybWF0IGRhdGUgaW4gSmF2YSBAR2VuZXJhdGVkIGFubm90YXRpb25zCisgICAgKiBbVEhSSUZULTMxMzddIC0gVHJhdmlzIGJ1aWxkIGhhbmdzIGFmdGVyIGZhaWx1cmUKKyAgICAqIFtUSFJJRlQtMzEzOF0gLSAibWFrZSBjaGVjayIgcGFyYWxsZWwgZXhlY3V0aW9uIGlzIHVuZGVybWluaXN0aWMKKyAgICAqIFtUSFJJRlQtMzEzOV0gLSBKUyBsaWJyYXJ5IHRlc3QgaXMgZmxha3kKKyAgICAqIFtUSFJJRlQtMzE0MF0gLSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGlzIHRocm93biBieSBKYXZhU2NyaXB0IHRlc3Qgc2VydmVyCisgICAgKiBbVEhSSUZULTMxMjRdIC0gU29tZSBzaWduZWQvdW5zaWduZWQgd2FybmluZ3Mgd2hpbGUgYnVpbGRpbmcgY29tcGlsZXIKKyAgICAqIFtUSFJJRlQtMzEyOF0gLSBHbyBnZW5lcmF0ZWQgY29kZSBwcm9kdWNlcyBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworICAgICogW1RIUklGVC0zMTQ2XSAtIEdyYXBodml6IGdlbmVyYXRlcyBmdW5jdGlvbiBuYW1lIGNvbGxpc2lvbnMgYmV0d2VlbiBzZXJ2aWNlcworICAgICogW1RIUklGVC0zMTQ3XSAtIFNlZ2ZhdWx0IHdoaWxlIHJlY2VpdmluZyBkYXRhCisgICAgKiBbVEhSSUZULTMxNDhdIC0gTWFya2Rvd24gbGlua3MgdG8gY29kaW5nX3N0YW5kYXJkcyBhcmUgZGVhZAorICAgICogW1RIUklGVC0zMDkwXSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBNYWNPU1gKKyAgICAqIFtUSFJJRlQtMzA5N10gLSBjbWFrZSB0YXJnZXRzIHVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gb3B0aW9uYWwgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTMwOTRdIC0gbWFzdGVyIGFzIG9mIDIwMTUtQVBSLTEzIGZhaWxzIC1EQk9PU1RfVEhSRUFEUyBjbWFrZSBidWlsZAorICAgICogW1RIUklGVC0zMDk5XSAtIGNtYWtlIGJ1aWxkIGlzIGJyb2tlbiBvbiBGcmVlQlNECisgICAgKiBbVEhSSUZULTMwODldIC0gQXNzaWduaW5nIGRlZmF1bHQgRU5VTSB2YWx1ZXMgcmVzdWx0cyBpbiBub24tY29tcGlsYWJsZSBqYXZhIGNvZGUgaWYgamF2YSBuYW1lc3BhY2UgaXMgbm90IGRlZmluZWQKKyAgICAqIFtUSFJJRlQtMzA5M10gLSBtaW5ndyBjb21waWxlIGZpeGVzIGZvciBjKysgbGlicmFyeSAwLjkuMgorICAgICogW1RIUklGVC0zMDk4XSAtIFRocmlmdCBkb2VzIG5vdCBwcmV0dHkgcHJpbnQgYmluYXJ5IHR5cGVkZWZzIHRoZSB3YXkgaXQgZG9lcyBiaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTMwOTFdIC0gY19nbGliIHNlcnZpY2UgbWV0aG9kIHNob3VsZCByZXR1cm4gcmVzdWx0IGZyb20gaGFuZGxlciBtZXRob2QKKyAgICAqIFtUSFJJRlQtMzA4OF0gLSBUVGhyZWFkUG9vbFNlcnZlciB3aXRoIFNhc2wgYXV0aCBtYXkgbGVhayBDTE9TRV9XQUlUIHNvY2tldAorICAgICogW1RIUklGVC0zMTA5XSAtIENyb3NzIHRlc3QgbG9nIGZpbGUgY2Fubm90IGJlIGJyb3dzZWQgd2hlbiBzZXJ2ZWQgaW4gSFRUUCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzExM10gLSBtNCBDKysxMSBtYWNybyBpc3N1ZQorICAgICogW1RIUklGVC0zMTA1XSAtIEMrKyBsaWJ0aHJpZnRuYiBsaWJyYXJ5IG9uIFdpbmRvd3MgYnVpbGQgZmFpbHVyZQorICAgICogW1RIUklGVC0zMTE1XSAtIFVuY29tcGlsZWFibGUgY29kZSBkdWUgdG8gbmFtZSBjb2xsaXNpb24gd2l0aCBwcmVkZWZpbmVkIHVzZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzExN10gLSBKYXZhIFRTU0xUcmFuc3BvcnRGYWN0b3J5IGNhbid0IGxvYWQgY2VydGlmaWNhdGVzIHdpdGhpbiBKQVIgYXJjaGl2ZQorICAgICogW1RIUklGVC0zMTAyXSAtIGNvdWxkIG5vdCBtYWtlIGNoZWNrIGZvciBHbyBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTMxMjBdIC0gTWlub3Igc3BlbGxpbmcgZXJyb3JzIGFuZCBhbiBvdXRkYXRlZCBVUkwKKyAgICAqIFtUSFJJRlQtMzEyMV0gLSBMaWJydCBkb2VzIG5vdCBleGlzdCBvbiBPUyBYCisgICAgKiBbVEhSSUZULTMxNTJdIC0gQ29tcGlsZXIgZXJyb3Igb24gTWFjIE9TWCAobWlzc2luZyAjaW5jbHVkZSA8Y3N0ZGxpYj4pCisgICAgKiBbVEhSSUZULTMxNjJdIC0gbWFrZSBmYWlscyBmb3IgZG1kIDIuMDY3CisgICAgKiBbVEhSSUZULTMxNjRdIC0gVGhyaWZ0IEMrKyBsaWJyYXJ5IFNTTCBzb2NrZXQgYnkgZGVmYXVsdCBhbGxvd3MgZm9yIHVuc2VjdXJlIFNTTHYzIG5lZ290aWF0aW9uCisgICAgKiBbVEhSSUZULTMxNjhdIC0gRml4IE1hdmVuIFBPTQorICAgICogW1RIUklGVC0zMTcwXSAtIEluaXRpYWxpc20gY29kZSBpbiB0aGUgR28gY29tcGlsZXIgY2F1c2VzIGNoYW9zCisgICAgKiBbVEhSSUZULTMxNjldIC0gRG8gbm90IGV4cG9ydCB0aHJpZnQuVGVzdFN0cnVjdCBhbmQgdGhyaWZ0LlRlc3RFbnVtIGluIHRocmlmdCBHbyBsaWJyYXJ5IAorICAgICogW1RIUklGVC0zMTkxXSAtIFBlcmwgY29tcGlsZXIgZG9lcyBub3QgYWRkIHN1cHBvcnQgZm9yIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTMxNzhdIC0gZ2xpYiBDIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMzE4OV0gLSBQZXJsIFNlcnZlclNvY2tldCBzaG91bGQgYWxsb3cgYSBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYmUgbGlzdGVuZWQgdG8KKyAgICAqIFtUSFJJRlQtMzI1Ml0gLSBNaXNzaW5nIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCBpbiBjcHAgTWFrZWZpbGUsIHNvIGRvZXNuJ3QgaW5zdGFsbAorICAgICogW1RIUklGVC0zMjU1XSAtIFRocmlmdCBnZW5lcmF0b3IgZG9lc24ndCBleGNsdWRlICdwYWNrYWdlJyBrZXl3b3JkIGZvciB0aHJpZnQgcHJvcGVydHkgbmFtZXMgYnJlYWtpbmcgamF2YSBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzI2MF0gLSBtdWx0aXBsZSB3YXJuaW5ncyBpbiBjX2dsaWIgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMzI1Nl0gLSBTb21lIEQgdGVzdCB0aW1pbmdzIGFyZSB0b28gYWdncmVzc2l2ZSBmb3Igc2xvdyBtYWNoaW5lcworICAgICogW1RIUklGVC0zMjU3XSAtIHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2VuZGlmIGRpcmVjdGl2ZQorICAgICogW1RIUklGVC0zMTg0XSAtIFRocmlmdCBHbyBsZWF2ZXMgZmlsZSBkZXNjcmlwdG9ycyBvcGVuCisgICAgKiBbVEhSSUZULTMyMDNdIC0gRE9BUCAtIHBsZWFzZSBmaXggIk9jYW1sIiA9PiAiT0NhbWwiCisgICAgKiBbVEhSSUZULTMyMTBdIC0gKHVuY29tcGlsZWFibGUpIGNvZGUgZ2VuZXJhdGVkIGZvciBzZXJ2ZXIgZXZlbnRzIHdoaWxlIGFyZSBldmVudHMgbm90IGVuYWJsZWQKKyAgICAqIFtUSFJJRlQtMzIxNV0gLSBUSlNPTlByb3RvY29sICcoYysrKSB1c2VzICJ0aHJvdyBuZXciIHRvIHRocm93IGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiAidGhyb3ciCisgICAgKiBbVEhSSUZULTMyMDJdIC0gQWxsb3cgSFNIQVNlcnZlciB0byBjb25maWd1cmUgbWluIGFuZCBtYXggd29ya2VyIHRocmVhZHMgc2VwYXJhdGVseS4KKyAgICAqIFtUSFJJRlQtMzIwNV0gLSBUQ29tcGFjdFByb3RvY29sIHJldHVybiBhIHdyb25nIGVycm9yIHdoZW4gdGhlIGlvLkVPRiBoYXBwZW5zCisgICAgKiBbVEhSSUZULTMyMDldIC0gTEdQTCBtZW50aW9uZWQgaW4gbGljZW5zZSBmaWxlCisgICAgKiBbVEhSSUZULTMxOTddIC0ga2VlcEFsaXZlVGltZSBpcyBoYXJkIGNvZGVkIGFzIDYwIHNlYyBpbiBUVGhyZWFkUG9vbFNlcnZlcgorICAgICogW1RIUklGVC0zMTk2XSAtIE1pc3NwZWxsaW5nIGluIGx1YSBUQmluYXJ5UHJvdG9jb2wgKHN0aXJjdFdyaXRlID0+IHN0cmljdFdyaXRlKQorICAgICogW1RIUklGVC0zMTk4XSAtIEFsbG93IGNvbnN0cnVjdGlvbiBvZiBUVHJhbnNwb3J0RmFjdG9yeSB3aXRoIGEgc3BlY2lmaWVkIG1heExlbmd0aAorICAgICogW1RIUklGVC0zMTkyXSAtIEdvIGltcG9ydCBwYXRocyBjaGFuZ2VkIGluIDEuNCwgYW5kIGV4cGlyZWQgSnVuZSAxCisgICAgKiBbVEhSSUZULTMyNzFdIC0gQ291bGQgbm90IGZpbmQgb3IgbG9hZCBtYWluIGNsYXNzIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgb24gc29tZSBub24tZW5nbGlzaCBzeXN0ZW1zCisgICAgKiBbVEhSSUZULTMyNzNdIC0gY19nbGliOiBHZW5lcmF0ZWQgY29kZSB0cmllcyB0byBjb252ZXJ0IGJldHdlZW4gZnVuY3Rpb24gYW5kIHZvaWQgcG9pbnRlcnMKKyAgICAqIFtUSFJJRlQtMzI2NF0gLSBGaXggRXJsYW5nIDE2IG5hbWVzcGFjZWQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMzI3MF0gLSByZXVzaW5nIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24gY2F1c2UgZGlydHkgVFNvY2tldAorICAgICogW1RIUklGVC0zMjY3XSAtIGNfZ2xpYjogIkNyaXRpY2FsIiBmYWlsdXJlIGR1cmluZyB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTMyNzddIC0gVEh0dHBDbGllbnQgbGVha3MgY29ubmVjdGlvbnMgaWYgaXQncyB1c2VkIGZvciBtdWx0aXBsZSByZXF1ZXN0cworICAgICogW1RIUklGVC0zMjc4XSAtIE5vZGVKUzogRml4IGV4Y2VwdGlvbiBzdGFjayB0cmFjZXMgYW5kIG5hbWVzCisgICAgKiBbVEhSSUZULTMyNzldIC0gRml4IGEgYnVnIGluIHJldHJ5X21heF9kZWxheSAoTm9kZUpTKQorICAgICogW1RIUklGVC0zMjgwXSAtIEluaXRpYWxpemUgcmV0cnkgdmFyaWFibGVzIG9uIGNvbnN0cnVjdGlvbgorICAgICogW1RIUklGVC0zMjgzXSAtIGNfZ2xpYjogVHV0b3JpYWwgc2VydmVyIGFsd2F5cyBleGl0cyB3aXRoIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMzI4NF0gLSBjX2dsaWI6IEVtcHR5IHNlcnZpY2UgcHJvZHVjZXMgdW51c2VkLXZhcmlhYmxlIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTkyNV0gLSBjX2dsaWIgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgY29tcGlsZQorICAgICogW1RIUklGVC0xODQ5XSAtIGFmdGVyIHRyYW5zcG9ydC0+b3BlbigpIG9wZW5zIGlzT3BlbiByZXR1cm5zIHRydWUgYW5kIG5leHQgb3BlbigpIGdvZXMgdGhydSB3aGVuIGl0IHNoYWxsIG5vdAorICAgICogW1RIUklGVC0xODY2XSAtIGphdmEgY29tcGlsZXIgZ2VuZXJhdGVzIG5vbi1jb21waWxpbmcgY29kZSB3aXRoIGNvbnN0J3MgZGVmaW5lZCBpbiBhIHRocmlmdCB3aGVuIG5hbWUgaW5jbHVkZXMgbm9uLWlkZW50aWZpZXIgY2hhcnMKKyAgICAqIFtUSFJJRlQtMTkzOF0gLSBGdW5jdGlvblJ1bm5lci5oIC0tIHVzZXMgd3JvbmcgcGF0aCBmb3IgVGhyZWFkLmggd2hlbiBpbnN0YWxsZWQKKyAgICAqIFtUSFJJRlQtMTg0NF0gLSBQYXNzd29yZCBzdHJpbmcgbm90IGNsZWFyZWQKKyAgICAqIFtUSFJJRlQtMjAwNF0gLSBUaHJpZnQ6OlVuaW9uIHZpb2xhdGVzIDo9PSBtZXRob2QgY29udHJhY3QgYW5kIGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMjA3M10gLSBUaHJpZnQgQysrIFRIdHRwQ2xpZW50IGVycm9yOiBjYW5ub3QgcmVmaWxsIGJ1ZmZlcgorICAgICogW1RIUklGVC0yMTI3XSAtIEF1dG9jb25mIHNjcmlwdGluZyBkb2VzIG5vdCBwcm9wZXJseSBhY2NvdW50IGZvciBjcm9zcy1jb21waWxlCisgICAgKiBbVEhSSUZULTIxODBdIC0gSW50ZWdlciB0eXBlcyBpc3N1ZXMgaW4gQ29jb2EgbGliIG9uIEFSTTY0CisgICAgKiBbVEhSSUZULTIxODldIC0gR28gbmVlZHMgImlzc2V0IiB0byBmdWxseSBzdXBwb3J0ICJ1bmlvbiIgdHlwZSAoYW5kIG9wdGlvbmFscykKKyAgICAqIFtUSFJJRlQtMjE5Ml0gLSBhdXRvdG9vbHMgb24gUmVkaGF0IGJhc2VkIHN5c3RlbXMKKyAgICAqIFtUSFJJRlQtMjU0Nl0gLSBjcm9zcyBsYW5ndWFnZSB0ZXN0cyBmYWlscyBhdCAnVGVzdE11bHRpRXhjZXB0aW9uJyB3aGVuIHVzaW5nIG5vZGVqcyBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjU0N10gLSBub2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBmYWlscyB0byBjb25uZWN0IHdpdGggY3BwIHVzaW5nIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjU0OF0gLSBOb2RlanMgc2VydmVycyBhbmQgY2xpZW50cyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggIC1zc2wKKyAgICAqIFtUSFJJRlQtMTQ3MV0gLSB0b1N0cmluZygpIGRvZXMgbm90IHByaW50IEJ5dGVCdWZmZXIgdmFsdWVzIHdoZW4gbmVzdGVkIGluIGEgTGlzdAorICAgICogW1RIUklGVC0xMjAxXSAtIGdldGFkZHJpbmZvIHJlc291cmNlIGxlYWsKKyAgICAqIFtUSFJJRlQtNjE1XSAtIFRUaHJlYWRQb29sU2VydmVyIGRvZXNuJ3QgY2FsbCB0YXNrX2RvbmUgYWZ0ZXIgcHVsbGluZyB0YXNrcyBmcm9tIGl0J3MgY2xpZW50cyBxdWV1ZQorICAgICogW1RIUklGVC0xNjJdIC0gVGhyaWZ0IHN0cnVjdHVyZXMgYXJlIHVuaGFzaGFibGUsIHByZXZlbnRpbmcgdGhlbSBmcm9tIGJlaW5nIHVzZWQgYXMgc2V0IGVsZW1lbnRzCisgICAgKiBbVEhSSUZULTgxMF0gLSBDcmFzaGVkIGNsaWVudCBvbiBUU29ja2V0OjpjbG9zZSB1bmRlciBsb2FkcworICAgICogW1RIUklGVC01NTddIC0gY2hhcnNldCBwcm9ibGVtIHdpdGggZmlsZSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdAorICAgICogW1RIUklGVC0yMzNdIC0gSURMIGRvZXNuJ3Qgc3VwcG9ydCBuZWdhdGl2ZSBoZXggbGl0ZXJhbHMKKyAgICAqIFtUSFJJRlQtMTY0OV0gLSBjb250cmliL3plcm9tcSBkb2VzIG5vdCBidWlsZCBpbiAwLjguMAorICAgICogW1RIUklGVC0xNjQyXSAtIE1pc2NhbGN1bGF0aW9uIGxlYWQgdG8gdGhyb3cgdW5leHBlY3RlZCAiVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIihvciBjYWxsZWQgIkVBR0FJTiAodGltZWQgb3V0KSIpIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xNTg3XSAtIFRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0IGVycm9yCisgICAgKiBbVEhSSUZULTEyNDhdIC0gcG9pbnRlciBzdWJ0cmFjdGlvbiBpbiBUTWVtb3J5QnVmZmVyIHJlbGllcyBvbiB1bmRlZmluZWQgYmVoYXZpb3IKKyAgICAqIFtUSFJJRlQtMTc3NF0gLSBTYXNsIFRyYW5zcG9ydCBjbGllbnQgd291bGQgaGFuZyB3aGVuIHRyeWluZyB0byBjb25uZWN0IG5vbi1zYXNsIHRyYW5zcG9ydCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTc1NF0gLSBSYW5nZUVycm9yIGluIGJ1ZmZlciBoYW5kbGluZworICAgICogW1RIUklGVC0xNjE4XSAtIHN0YXRpYyBzdHJ1Y3RNYXAgaW4gRmllbGRNZXRhRGF0YSBpcyBub3QgdGhyZWFkIHNhZmUgYW5kIGNhbiBsZWFkIHRvIGRlYWRsb2NrcworICAgICogW1RIUklGVC0yMzM1XSAtIHRocmlmdCBpbmNvbXBhdGliaWxpdHkgd2l0aCBweTp0b3JuYWRvIGFzIHNlcnZlciwgamF2YSBhcyBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjgwM10gLSBUQ1BfREVGRVJfQUNDRVBUIG5vdCBzdXBwb3J0ZWQgd2l0aCBkb21haW4gc29ja2V0cworICAgICogW1RIUklGVC0yNzk5XSAtIEJ1aWxkIFByb2JsZW0ocyk6IGxkOiBsaWJyYXJ5IG5vdCBmb3VuZCBmb3IgLWw6bGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hCisgICAgKiBbVEhSSUZULTI4MDFdIC0gQysrIHRlc3Qgc3VpdGUgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMjgwMl0gLSBDKysgdHV0b3JpYWwgY29tcGlsYXRpb24gd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtMjc5NV0gLSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sLmM6ICdkZXJlZmVyZW5jaW5nIHR5cGUtcHVubmVkIHBvaW50ZXIgd2lsbCBicmVhayBzdHJpY3QtYWxpYXNpbmcgcnVsZXMnCisgICAgKiBbVEhSSUZULTI4MTddIC0gVFNpbXBsZUpTT05Qcm90b2NvbCByZWFkcyBiZXlvbmQgZW5kIG9mIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMjgyNl0gLSBodG1sOnN0YW5kYWxvbmUgc29tZXRpbWVzIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjgyOV0gLSBTdXBwb3J0IGhheGVsaWIgaW5zdGFsbGF0aW9uIHZpYSBnaXRodWIKKyAgICAqIFtUSFJJRlQtMjgyOF0gLSBzbGlnaHRseSB3cm9uZyBoZWxwIHNjcmVlbiBpbmRlbnQKKyAgICAqIFtUSFJJRlQtMjgzMV0gLSBSZW1vdmVzIGRlYWQgY29kZSBpbiB3ZWJfc2VydmVyLmpzIGludHJvZHVjZWQgaW4gVEhSSUZULTI4MTkKKyAgICAqIFtUSFJJRlQtMjgyM10gLSBBbGwgSlMtdGVzdHMgYXJlIGZhaWxpbmcgd2hlbiBydW4gd2l0aCBncnVudCB0ZXN0CisgICAgKiBbVEhSSUZULTI4MjddIC0gVGhyaWZ0IDAuOS4yIGZhaWxzIHRvIGNvbXBpbGUgb24gWW9zZW1pdGUgZHVlIHRvIHRyMS9mdW5jdGlvbmFsIGluY2x1ZGUgaW4gUHJvY2Vzc29yVGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMjg0M10gLSBBdXRvbWFrZSBjb25maWd1cmUuYWMgaGFzIHBvc3NpYmxlIHR5cG8gcmVsYXRlZCB0byBKYXZhCisgICAgKiBbVEhSSUZULTI4MTNdIC0gbXVsdGlwbGUgaGF4ZSBsaWJyYXJ5IGZpeGVzL2ltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yODI1XSAtIFN1cHBseWluZyB1bmljb2RlIHRvIHB5dGhvbiBUaHJpZnQgY2xpZW50IGNhbiBjYXVzZSBuZXh0IHJlcXVlc3QgYXJndW1lbnRzIHRvIGdldCBvdmVyd3JpdHRlbgorICAgICogW1RIUklGVC0yODQwXSAtIENhYmFsIGZpbGUgcG9pbnRzIHRvIExJQ0VOU0UgZmlsZSBvdXRzaWRlIHRoZSBwYXRoIG9mIHRoZSBIYXNrZWxsIHByb2plY3QuCisgICAgKiBbVEhSSUZULTI4MThdIC0gVHJhaWxpbmcgY29tbWFzIGluIGFycmF5CisgICAgKiBbVEhSSUZULTI4MzBdIC0gQ2xlYW4gdXAgYW50IHdhcm5pbmdzIGluIHR1dG9yaWFsIGRpcgorICAgICogW1RIUklGVC0yODQyXSAtIEVybGFuZyB0aHJpZnQgY2xpZW50IGhhcyBpbmZpbml0ZSB0aW1lb3V0CisgICAgKiBbVEhSSUZULTI4MTBdIC0gRG8gbm90IGxlYXZlIHRoZSB1bmRlcmx5aW5nIFNlcnZlclNvY2tldCBvcGVuIGlmIGNvbnN0cnVjdGlvbiBvZiBUU2VydmVyU29ja2V0IGZhaWxzCisgICAgKiBbVEhSSUZULTI4MTJdIC0gR28gc2VydmVyIGFkZGluZyByZWR1bmRhbnQgYnVmZmVyaW5nIGxheWVyCisgICAgKiBbVEhSSUZULTI4MzldIC0gVEZyYW1lZFRyYW5zcG9ydCByZWFkIGJ1ZworICAgICogW1RIUklGVC0yODQ0XSAtIE5vZGVqcyBzdXBwb3J0IGJyb2tlbiB3aGVuIHJ1bm5pbmcgdW5kZXIgQnJvd3NlcmlmeQorICAgICogW1RIUklGVC0yODE0XSAtIGFyZ3MvcmVzdWx0IGNsYXNzZXMgbm90IGZvdW5kIHdoZW4gbm8gbmFtZXNwYWNlIGlzIHNldAorICAgICogW1RIUklGVC0yODQ3XSAtIGZ1bmN0aW9uIElmVmFsdWUoKSBpcyBhIGR1cGxpY2F0ZSBvZiBTeXN0ZW0uU3RyVXRpbHMuSWZUaGVuCisgICAgKiBbVEhSSUZULTI4NDhdIC0gY2VydGFpbiBEZWxwaGkgdGVzdHMgZG8gbm90IGJ1aWxkIGlmIFR5cGVSZWdpc3RyeSBpcyB1c2VkCisgICAgKiBbVEhSSUZULTI4NTRdIC0gR28gU3RydWN0IHdyaXRlciBhbmQgcmVhZGVyIGxvb3NlcyBpbXBvcnRhbnQgZXJyb3IgaW5mb3JtYXRpb24KKyAgICAqIFtUSFJJRlQtMjg1OF0gLSBFbmFibGUgaGVhZGVyIGZpZWxkIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggaW4gVEh0dHBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjg1N10gLSBDIyBnZW5lcmF0b3IgY3JlYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3Igc3RydWN0IGNvbnN0YW50cworICAgICogW1RIUklGVC0yODYwXSAtIERlbHBoaSBzZXJ2ZXIgY2xvc2VzIGNvbm5lY3Rpb24gb24gdW5leHBlY3RlZCBleGNlcHRpb25zCisgICAgKiBbVEhSSUZULTI4NjhdIC0gRW5oYW5jZSBlcnJvciBoYW5kbGluZyBpbiB0aGUgR28gY2xpZW50IAorICAgICogW1RIUklGVC0yODc5XSAtIFRNZW1vcnlCdWZmZXI6IHVzaW5nIGx1YSBzdHJpbmcgaW4gd3Jvbmcgd2F5CisgICAgKiBbVEhSSUZULTI4NTFdIC0gUmVtb3ZlIHN0cmFuZ2UgcHVibGljIFBlZWsoKSBmcm9tIEdvIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtMjg1Ml0gLSBCZXR0ZXIgT3Blbi9Jc09wZW4vQ2xvc2UgYmVoYXZpb3IgZm9yIFN0cmVhbVRyYW5zcG9ydC4KKyAgICAqIFtUSFJJRlQtMjg3MV0gLSBNaXNzaW5nIHNlbWljb2xvbiBpbiB0aHJpZnQuanMKKyAgICAqIFtUSFJJRlQtMjg3Ml0gLSBUaHJlYWRNYW5hZ2VyIGRlYWRsb2NrIGZvciB0YXNrIGV4cGlyYXRpb24KKyAgICAqIFtUSFJJRlQtMjg4MV0gLSBIYW5kbGUgZXJyb3JzIGZyb20gQWNjZXB0KCkgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTI4NDldIC0gU3BlbGwgZXJyb3JzIHJlcG9ydGVkIGJ5IGNvZGVzcGVsbCB0b29sCisgICAgKiBbVEhSSUZULTI4NzBdIC0gQysrIFRKU09OUHJvdG9jb2wgdXNpbmcgbG9jYWxlIGRlcGVuZGVudCBmb3JtYXR0aW5nCisgICAgKiBbVEhSSUZULTI4ODJdIC0gTHVhIEdlbmVyYXRvcjogdXNpbmcgc3RyaW5nLmxlbiBmdW50aW9uIHRvIGdldCBzdHJ1Y3QobWFwLGxpc3Qsc2V0KSBzaXplCisgICAgKiBbVEhSSUZULTI4NjRdIC0gSlNPTiBnZW5lcmF0b3IgbWlzc2luZyBmcm9tIFZpc3VhbCBTdHVkaW8gYnVpbGQgcHJvamVjdCAKKyAgICAqIFtUSFJJRlQtMjg3OF0gLSBHbyB2YWxpZGF0aW9uIHN1cHBvcnQgb2YgcmVxdWlyZWQgZmllbGRzCisgICAgKiBbVEhSSUZULTI4NzNdIC0gVFBpcGUgYW5kIFRQaXBlU2VydmVyIGRvbid0IGNvbXBpbGUgb24gV2luZG93cyB3aXRoIFVOSUNPREUgZW5hYmxlZAorICAgICogW1RIUklGVC0yODg4XSAtIGltcG9ydCBvZiA8bGltaXRzPiBpcyBtaXNzaW5nIGluIEpTT04gZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI5MDBdIC0gUHl0aG9uIFRIdHRwQ2xpZW50IGRvZXMgbm90IHJlc2V0IHNvY2tldCB0aW1lb3V0IG9uIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0yOTA3XSAtICdudG9obGwnIG1hY3JvIHJlZGVmaW5lZAorICAgICogW1RIUklGVC0yODg0XSAtIE1hcCBkb2VzIG5vdCBzZXJpYWxpemUgY29ycmVjdGx5IGZvciBKU09OIHByb3RvY29sIGluIEdvIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjg4N10gLSAtLXdpdGgtb3BlbnNzbCBjb25maWd1cmUgZmxhZyBpcyBpZ25vcmVkCisgICAgKiBbVEhSSUZULTI4OTRdIC0gUEhQIGpzb24gc2VyaWFsaXplciBza2lwcyBtYXBzIHdpdGggaW50L2Jvb2wga2V5cworICAgICogW1RIUklGVC0yOTA0XSAtIGpzb25fcHJvdG9jb2xfdGVzdC5nbyBmYWlscworICAgICogW1RIUklGVC0yOTA2XSAtIGxpYnJhcnkgbm90IGZvdW5kIGZvciAtbDpsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMjg5MF0gLSBiaW5hcnkgZGF0YSBtYXkgbG9zZSBieXRlcyB3aXRoIEpTT04gdHJhbnNwb3J0IHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMKKyAgICAqIFtUSFJJRlQtMjg5MV0gLSBiaW5hcnkgZGF0YSBtYXkgY2F1c2UgYSBmYWlsdXJlIHdpdGggSlNPTiB0cmFuc3BvcnQgdW5kZXIgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcworICAgICogW1RIUklGVC0yOTAxXSAtIEZpeCBmb3IgZ2VuZXJhdGVkIFR5cGVTY3JpcHQgZnVuY3Rpb25zICsgaW5kZW50YXRpb24gb2YgSmF2YVNjcmlwdCBtYXBzCisgICAgKiBbVEhSSUZULTI5MTZdIC0gbWFrZSBjaGVjayBmYWlscyBmb3IgRCBsYW5ndWFnZQorICAgICogW1RIUklGVC0yOTE4XSAtIFJhY2UgY29uZGl0aW9uIGluIFB5dGhvbiBUUHJvY2Vzc1Bvb2xTZXJ2ZXIgdGVzdAorICAgICogW1RIUklGVC0yOTIwXSAtIEVybGFuZyBUaHJpZnQgdGVzdCB1c2VzIHdyb25nIElETCBmaWxlCisgICAgKiBbVEhSSUZULTI5MjJdIC0gJFRSSUFMIGlzIHVzZWQgd2l0aCBQeXRob24gdGVzdHMgYnV0IG5vdCB0ZXN0ZWQgYWNjb3JkaW5nbHkKKyAgICAqIFtUSFJJRlQtMjkxMl0gLSBBdXRvdG9vbCBidWlsZCBmb3IgQysrIFF0IGxpYnJhcnkgaXMgaW52YWxpZAorICAgICogW1RIUklGVC0yOTE0XSAtIGV4cGxpY2l0IGRlcGVuZGVuY3kgdG8gTHVhNS4yIGZhaWxzIG9uIHNvbWUgc3lzdGVtcworICAgICogW1RIUklGVC0yOTEwXSAtIGxpYmV2ZW50IGlzIG5vdCByZWFsbHkgb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMjkxMV0gLSBmaXggYysrIHZlcnNpb24gemVyb21xIHRyYW5zcG9ydCwgdGhlIG9sZCB2ZXJzaW9uIGNhbm5vdCB3b3JrCisgICAgKiBbVEhSSUZULTI5MTVdIC0gTHVhIGdlbmVyYXRvciBtaXNzaW5nIGZyb20gVmlzdWFsIFN0dWRpbyBidWlsZCBwcm9qZWN0CisgICAgKiBbVEhSSUZULTI5MTddIC0gIm1ha2UgY2xlYW4iIGJyZWFrcyB0ZXN0L2NfZ2xpYgorICAgICogW1RIUklGVC0yOTE5XSAtIEhheGUgdGVzdCBzZXJ2ZXIgdGltZW91dCB0b28gbGFyZ2UKKyAgICAqIFtUSFJJRlQtMjkyM10gLSBKYXZhU2NyaXB0IGNsaWVudCBhc3N1bWVzIGEgbWVzc2FnZSBiZWluZyB3cml0dGVuCisgICAgKiBbVEhSSUZULTI5MjRdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoZXMgd2hlbiB1c2VyLXByb3ZpZGVkIGV2ZW50X2Jhc2UgaXMgdXNlZAorICAgICogW1RIUklGVC0yOTI1XSAtIENNYWtlIGJ1aWxkIGRvZXMgbm90IHdvcmsgd2l0aCBPcGVuU1NMIG5vciBhbnl0aGluZyBpbnN0YWxsZWQgaW4gbm9uLXN5c3RlbSBsb2NhdGlvbgorICAgICogW1RIUklGVC0yOTMxXSAtIEFjY2VzcyB0byB1bmRlY2xhcmVkIHN0YXRpYyBwcm9wZXJ0eTogVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVECisgICAgKiBbVEhSSUZULTI4OTNdIC0gQ01ha2UgYnVpbGQgZmFpbHMgd2l0aCBib29zdCB0aHJlYWQgb3Igc3RkIHRocmVhZAorICAgICogW1RIUklGVC0yOTAyXSAtIEdlbmVyYXRlZCBjX2dsaWIgY29kZSBkb2VzIG5vdCBjb21waWxlIHdpdGggY2xhbmcKKyAgICAqIFtUSFJJRlQtMjkwM10gLSBRdDQgbGlicmFyeSBidWlsdCB3aXRoIENNYWtlIGRvZXMgbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMjk0Ml0gLSBDU2hhcnAgZ2VuZXJhdGUgaW52YWxpZCBjb2RlIGZvciBwcm9wZXJ0eSBuYW1lZCByZWFkIG9yIHdyaXRlCisgICAgKiBbVEhSSUZULTI5MzJdIC0gTm9kZS5qcyBUaHJpZnQgY29ubmVjdGlvbiBsaWJyYXJpZXMgdGhyb3cgRXhjZXB0aW9ucyBpbnRvIGV2ZW50IGVtaXR0ZXIKKyAgICAqIFtUSFJJRlQtMjkzM10gLSB2MC45LjI6IGRvdWJsZXMgZW5jb2RlZCBpbiBub2RlIHdpdGggY29tcGFjdCBwcm90b2NvbCBjYW5ub3QgYmUgZGVjb2RlZCBieSBweXRob24KKyAgICAqIFtUSFJJRlQtMjkzNF0gLSBjcmVhdGVTZXJ2ZXIgc2lnbmF0dXJlIG1pc21hdGNoCisgICAgKiBbVEhSSUZULTI5ODFdIC0gSURMIHdpdGggbm8gbmFtZXNwYWNlIHByb2R1Y2VzIHVucGFyc2FibGUgUEhQCisgICAgKiBbVEhSSUZULTI5OTldIC0gQWRkaXRpb24gb2YgLmdpdGF0dHJpYnV0ZXMgdGV4dCBhdXRvIGluIFRIUklGVC0yNzI0IGNhdXNlcyBtb2RpZmllZCBmaWxlcyBvbiBjaGVja291dAorICAgICogW1RIUklGVC0yOTQ5XSAtIHR5cG8gaW4gY29tcGlsZXIvY3BwL1JFQURNRS5tZAorICAgICogW1RIUklGVC0yOTU3XSAtIHdhcm5pbmc6IHNvdXJjZSBmaWxlICVzIGlzIGluIGEgc3ViZGlyZWN0b3J5LCBidXQgb3B0aW9uICdzdWJkaXItb2JqZWN0cycgaXMgZGlzYWJsZWQKKyAgICAqIFtUSFJJRlQtMjk1M10gLSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IGlzIG5vdCBTdG9wKClhYmxlCisgICAgKiBbVEhSSUZULTI5NjJdIC0gRG9ja2VyIFRocmlmdCBlbnYgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nCisgICAgKiBbVEhSSUZULTI5NzFdIC0gQysrIHRlc3QgYW5kIHR1dG9yaWFsIHBhcmFsbGVsIGJ1aWxkIGlzIHVuc3RhYmxlCisgICAgKiBbVEhSSUZULTI5NzJdIC0gTWlzc2luZyBiYWNrc2xhc2ggaW4gbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCisgICAgKiBbVEhSSUZULTI5NTFdIC0gRml4IEVybGFuZyBuYW1lIGNvbmZsaWN0IHRlc3QKKyAgICAqIFtUSFJJRlQtMjk1NV0gLSBVc2luZyBsaXN0IG9mIHR5cGVkZWZzIGRvZXMgbm90IGNvbXBpbGUgb24gR28KKyAgICAqIFtUSFJJRlQtMjk2MF0gLSBuYW1lc3BhY2UgcmVncmVzc2lvbiBmb3IgUnVieQorICAgICogW1RIUklGVC0yOTU5XSAtIG5vZGVqczogZml4IGJpbmFyeSB1bml0IHRlc3RzCisgICAgKiBbVEhSSUZULTI5NjZdIC0gbm9kZWpzOiBGaXggYmFkIHJlZmVyZW5jZXMgdG8gVFByb3RvY29sRXhjZXB0aW9uIGFuZCBUUHJvdG9jb2xFeGNlcHRpb25UeXBlCisgICAgKiBbVEhSSUZULTI5NzBdIC0gZ3J1bnQtanNkb2MgZmFpbHMgZHVlIHRvIGRlcGVuZGVuY3kgaXNzdWVzCisgICAgKiBbVEhSSUZULTMwMDFdIC0gQyMgRXF1YWxzIGZhaWxzIGZvciBiaW5hcnkgZmllbGRzIChieXRlW10pCisgICAgKiBbVEhSSUZULTMwMDNdIC0gTWlzc2luZyBMSUNFTlNFIGZpbGUgcHJldmVudHMgcGFja2FnZSBmcm9tIGJlaW5nIGluc3RhbGxlZAorICAgICogW1RIUklGVC0zMDA4XSAtIE5vZGUuanMgc2VydmVyIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMwMDddIC0gVHJhdmlzIGJ1aWxkIGlzIGJyb2tlbiBiZWNhdXNlIG9mIGRpcmVjdG9yeSBjb25mbGljdAorICAgICogW1RIUklGVC0zMDA5XSAtIFRTU0xTb2NrZXQgZG9lcyBub3QgdXNlIHRoZSBjb3JyZWN0IGhvc3RuYW1lIChicmVha3MgY2VydGlmaWNhdGUgY2hlY2tzKQorICAgICogW1RIUklGVC0zMDExXSAtIEMjIHRlc3Qgc2VydmVyIHRlc3RFeGNlcHRpb24oKSBub3QgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHNwZWNzCisgICAgKiBbVEhSSUZULTMwMTJdIC0gVGltaW5nIHByb2JsZW1zIGluIE5hbWVkUGlwZSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdW5uZWNlc3Nhcnkgb3Blbi9jbG9zZQorICAgICogW1RIUklGVC0zMDE5XSAtIEdvbGFuZyBnZW5lcmF0b3IgbWlzc2luZyBkb2NzdHJpbmcgZm9yIHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtMzAyMV0gLSBTZXJ2aWNlIHJlbW90ZSB0b29sIGRvZXMgbm90IGltcG9ydCBzdHViIHBhY2thZ2Ugd2l0aCBwYWNrYWdlIHByZWZpeAorICAgICogW1RIUklGVC0zMDI2XSAtIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMzAyOF0gLSBSZWdyZXNzaW9uIGNhdXNlZCBieSBUSFJJRlQtMjE4MAorICAgICogW1RIUklGVC0zMDE3XSAtIG9yZGVyIG9mIG1hcCBrZXkvdmFsdWUgdHlwZXMgaW5jb3JyZWN0IGZvciBvbmUgQ1RPUgorICAgICogW1RIUklGVC0zMDIwXSAtIENhbm5vdCBjb21waWxlIHRocmlmdCBhcyBDKyswMworICAgICogW1RIUklGVC0zMDI0XSAtIFVzZXItQWdlbnQgIkJhdHRsZU5ldCIgdXNlZCBpbiBzb21lIFRocmlmdCBsaWJyYXJ5IGZpbGVzCisgICAgKiBbVEhSSUZULTMwNDddIC0gVW5ldmVuIGNhbGxzIHRvIGluZGVudF91cCBhbmQgaW5kZW50X2Rvd24gaW4gQ29jb2EgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTMwNDhdIC0gTm9kZUpTIGRlY29kaW5nIG9mIEk2NCBpcyBpbmNvbnNpc3RlbnQgYWNyb3NzIHByb3RvY29scworICAgICogW1RIUklGVC0zMDQzXSAtIGdvIGNvbXBpbGVyIGdlbmVyYXRvciB1c2VzIG5vbiBDKys5OCBjb2RlCisgICAgKiBbVEhSSUZULTMwNDRdIC0gRG9ja2VyIFJFQURNRS5tZCBwYXRocyB0byBEb2NrZXJmaWxlcyBhcmUgaW5jb3JyZWN0CisgICAgKiBbVEhSSUZULTMwNDBdIC0gYm93ZXIuanNvbiB3cm9uZyAibWFpbiIgcGF0aAorICAgICogW1RIUklGVC0zMDUxXSAtIEdvIFRocmlmdCBnZW5lcmF0b3IgY3JlYXRlcyBiYWQgZ28gY29kZQorICAgICogW1RIUklGVC0zMDU3XSAtIEphdmEgY29tcGlsZXIgYnVpbGQgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTMwNjFdIC0gQysrIFRTU0xTb2NrZXQgc2h1dGRvd24gZGVsYXkvdnVsbmVyYWJpbGl0eQorICAgICogW1RIUklGVC0zMDYyXSAtIEMrKyBUU2VydmVyU29ja2V0IGludmFsaWQgcG9ydCBudW1iZXIgKG92ZXIgOTk5OTk5KSBjYXVzZXMgc3RhY2sgY29ycnVwdGlvbgorICAgICogW1RIUklGVC0zMDY1XSAtIFVwZGF0ZSBsaWJ0aHJpZnQgZGVwZW5kZW5jaWVzIChzbGY0aiwgaHR0cGNvcmUsIGh0dHBjbGllbnQpCisgICAgKiBbVEhSSUZULTMyNDRdIC0gVHlwZVNjcmlwdDogZml4IG5hbWVzcGFjZSBvZiBpbmNsdWRlZCB0eXBlcworICAgICogW1RIUklGVC0zMjQ2XSAtIFJlZHVjZSB0aGUgbnVtYmVyIG9mIHRyaXZpYWwgd2FybmluZ3MgaW4gV2luZG93cyBDKysgQ01ha2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTMyMjRdIC0gRml4IFROYW1lZFBpcGVTZXJ2ZXIgdW5wcmVkaWN0YWJsZSBiZWhhdmlvciBvbiBhY2NlcHQKKyAgICAqIFtUSFJJRlQtMzIzMF0gLSBQeXRob24gY29tcGlsZXIgZ2VuZXJhdGVzIHdyb25nIGNvZGUgaWYgdGhlcmUgaXMgZnVuY3Rpb24gdGhyb3dpbmcgYSB0eXBlZGVmIG9mIGV4Y2VwdGlvbiB3aXRoIGFub3RoZXIgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTMyMzZdIC0gTWF4U2tpcERlcHRoIG5ldmVyIGNoZWNrZWQKKyAgICAqIFtUSFJJRlQtMzIzOV0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzI0MV0gLSBmYXRhbCBlcnJvcjogcnVudGltZTogY2Fubm90IG1hcCBwYWdlcyBpbiBhcmVuYSBhZGRyZXNzIHNwYWNlCisgICAgKiBbVEhSSUZULTMyNDJdIC0gT1NHaSBJbXBvcnQtUGFja2FnZSBkaXJlY3RpdmUgaXMgbWlzc2luZyB0aGUgQXBhY2hlIEhUVFAgcGFja2FnZXMKKyAgICAqIFtUSFJJRlQtMzIzNF0gLSBMaW1pdCByZWN1cnNpb24gZGVwdGgKKyAgICAqIFtUSFJJRlQtMzIyMl0gLSBUeXBlU2NyaXB0OiBHZW5lcmF0ZWQgRW51bXMgYXJlIHF1b3RlZAorICAgICogW1RIUklGVC0zMjI5XSAtIHVuZXhwZWN0ZWQgVGltZW91dCBleGNlcHRpb24gd2hlbiBkZXNpcmVkIGJ5dGVzIGFyZSBvbmx5IHBhcnRpYWxseSBhdmFpbGFibGUKKyAgICAqIFtUSFJJRlQtMzIzMV0gLSBDUFA6IExpbWl0IHJlY3Vyc2lvbiBkZXB0aCB0byA2NAorICAgICogW1RIUklGVC0zMjM1XSAtIExpbWl0IHJlY3Vyc2lvbiBkZXB0aAorICAgICogW1RIUklGVC0zMTc1XSAtIGZhc3RiaW5hcnkuYyBweXRob24gZGVzZXJpYWxpemUgY2FuIGNhdXNlIGh1Z2UgYWxsb2NhdGlvbnMgZnJvbSBnYXJiYWdlCisgICAgKiBbVEhSSUZULTMxNzZdIC0gVW5pb24gaW5jb3JyZWN0bHkgaW1wbGVtZW50cyA9PQorICAgICogW1RIUklGVC0zMTc3XSAtIEZhaWxzIHRvIHJ1biByYWtlIHRlc3QKKyAgICAqIFtUSFJJRlQtMzE4MF0gLSBsdWEgcGx1Z2luOiBmcmFtZWQgdHJhbnNwb3J0IGRvIG5vdCB3b3JrCisgICAgKiBbVEhSSUZULTMxNzldIC0gbHVhIHBsdWdpbiBjYW50IGNvbm5lY3QgdG8gcmVtb3RlIHNlcnZlciBiZWNhdXNlIGZ1bmN0aW9uIGxfc29ja2V0X2NyZWF0ZV9hbmRfY29ubmVjdCBhbHdheXMgYmluZCBzb2NrZXQgdG8gbG9jYWxob3N0CisgICAgKiBbVEhSSUZULTMyNDhdIC0gVHlwZVNjcmlwdDogYWRkaXRpb25hbCBjb21tYSBpbiBtZXRob2Qgc2lnbmF0dXJlIHdpdGhvdXQgcGFyYW1ldGVycworICAgICogW1RIUklGVC0zMzAyXSAtIEdvIEpTT04gcHJvdG9jb2wgc2hvdWxkIGVuY29kZSBUaHJpZnQgYnl0ZSB0eXBlIGFzIHNpZ25lZCBpbnRlZ2VyIHN0cmluZworICAgICogW1RIUklGVC0zMjk3XSAtIGNfZ2xpYjogYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTMyOTRdIC0gVFpsaWJUcmFuc3BvcnQgZm9yIEphdmEgZG9lcyBub3Qgd3JpdGUgZGF0YSBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzI5Nl0gLSBHbyBjcm9zcyB0ZXN0IGRvZXMgbm90IGNvbmZvcm0gdG8gc3BlYworICAgICogW1RIUklGVC0zMjk1XSAtIEMjIGxpYnJhcnkgZG9lcyBub3QgYnVpbGQgb24gTW9ubyA0LjAuMi41IG9yIGxhdGVyCisgICAgKiBbVEhSSUZULTMyOTNdIC0gSmF2YVNjcmlwdDogbnVsbCB2YWx1ZXMgdHVybiBpbnRvIGVtcHR5IHN0cnVjdHMgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMzMxMF0gLSBsaWIvZXJsL1JFQURNRS5tZCBoYXMgaW5jb3JyZWN0IGZvcm1hdHRpbmcKKyAgICAqIFtUSFJJRlQtMzMxOV0gLSBDU2hhcnAgdHV0b3JpYWwgd2lsbCBub3QgYnVpbGQgdXNpbmcgdGhlICouc2xuCisgICAgKiBbVEhSSUZULTMzMzVdIC0gUnVieSBzZXJ2ZXIgZG9lcyBub3QgaGFuZGxlIHByb2Nlc3NvciBleGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMzMzOF0gLSBTdHJheSB1bmRlcnNjb3JlIGluIGdlbmVyYXRlZCBnbyB3aGVuIHNlcnZpY2UgbmFtZSBzdGFydHMgd2l0aCAiTmV3IgorICAgICogW1RIUklGVC0zMzI0XSAtIFVwZGF0ZSBHbyBEb2NzIGZvciBwdWxsaW5nIGFsbCBwYWNrYWdlcworICAgICogW1RIUklGVC0zMzQ1XSAtIENsaWVudHMgYmxvY2tlZCBpbmRlZmluaXRlbHkgd2hlbiBhIGphdmEubGFuZy5FcnJvciBpcyB0aHJvd24KKyAgICAqIFtUSFJJRlQtMzMzMl0gLSBtYWtlIGRpc3QgZmFpbHMgb24gY2xlYW4gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzMyNl0gLSBUZXN0cyBkbyBub3QgY29tcGlsZSB1bmRlciAqQlNECisgICAgKiBbVEhSSUZULTMzMzRdIC0gTWFya2Rvd24gbm90YXRpb24gb2YgcHJvdG9jb2wgc3BlYyBpcyBtYWxmb3JtZWQKKyAgICAqIFtUSFJJRlQtMzMzMV0gLSB3YXJuaW5nOiDDouKCrMucZXR5cGXDouKCrOKEoiBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAgICAqIFtUSFJJRlQtMzM0OV0gLSBQeXRob24gc2VydmVyIGRvZXMgbm90IGhhbmRsZSBwcm9jZXNzb3IgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTMzNDNdIC0gRml4IGhhc2tlbGwgUkVBRE1FCisgICAgKiBbVEhSSUZULTMzNDBdIC0gUHl0aG9uOiBlbmFibGUganNvbiB0ZXN0cyBhZ2FpbgorICAgICogW1RIUklGVC0zMzExXSAtIFRvcCBsZXZlbCBSRUFETUUubWQgaGFzIGluY29ycmVjdCBmb3JtbWF0aW5nCisgICAgKiBbVEhSSUZULTI5MzZdIC0gTWlub3IgbWVtb3J5IGxlYWsgaW4gU1NMCisgICAgKiBbVEhSSUZULTMyOTBdIC0gVXNpbmcgZnJvbSBpbiB2YXJpYWJsZSBuYW1lcyBjYXVzZXMgdGhlIGdlbmVyYXRlZCBQeXRob24gY29kZSB0byBoYXZlIGVycm9ycworICAgICogW1RIUklGVC0zMjI1XSAtIEZpeCBUUGlwZVNlcnZlciB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIG9uIGludGVycnVwdCgpCisgICAgKiBbVEhSSUZULTMzNTRdIC0gRml4IHdvcmQtZXh0cmFjdGlvbiBzdWJzdHIgYnVnIGluIGluaXRpYWxpc20gY29kZQorICAgICogW1RIUklGVC0yMDA2XSAtIFRCaW5hcnlQcm90b2NvbCBtZXNzYWdlIGhlYWRlciBjYWxsIG5hbWUgbGVuZ3RoIGlzIG5vdCB2YWxpZGF0ZWQgYW5kIGNhbiBiZSB1c2VkIHRvIGNvcmUgdGhlIHNlcnZlcgorICAgICogW1RIUklGVC0zMzI5XSAtIEMrKyBsaWJyYXJ5IHVuaXQgdGVzdHMgZG9uJ3QgY29tcGlsZSBhZ2FpbnN0IHRoZSBuZXcgYm9vc3QtMS41OSB1bml0IHRlc3QgZnJhbWV3b3JrCisgICAgKiBbVEhSSUZULTI2MzBdIC0gd2luZG93czcgNjRiaXQgcGMuIGlwdjQgYW5kIGlwdjYgcGMuY2FuJ3QgdXNlCisgICAgKiBbVEhSSUZULTMzMzZdIC0gVGhyaWZ0IGdlbmVyYXRlZCBzdHJlYW1pbmcgb3BlcmF0b3JzIGFkZGVkIGluIDAuOS4yIGNhbm5vdCBiZSBvdmVycmlkZGVuCisgICAgKiBbVEhSSUZULTI2ODFdIC0gQ29yZSBvZiB1bndpbmRfY2xlYW51cAorICAgICogW1RIUklGVC0zMzE3XSAtIGNwcCBuYW1lc3BhY2Ugb3JnLmFwYWNoZSBpc3N1ZSBhcHBlYXJzIGluIDAuOQorCisjIyBEb2N1bWVudGF0aW9uCisgICAgKiBbVEhSSUZULTMyODZdIC0gQXBhY2hlIEFudCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlbmN5CisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTIyN10gLSBCeXRlW10gaW4gY29sbGVjdGlvbnMgYXJlbid0IHByZXR0eSBwcmludGVkIGxpa2UgcmVndWxhciBiaW5hcnkgZmllbGRzCisgICAgKiBbVEhSSUZULTI3NDRdIC0gVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKyAgICAqIFtUSFJJRlQtMjY0NF0gLSBIYXhlIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjc1Nl0gLSByZWdpc3RlciBNZWRpYSBUeXBlIEAgSUFOQQorICAgICogW1RIUklGVC0zMDc2XSAtIENvbXBhdGliaWxpdHkgd2l0aCBIYXhlIDMuMi4wCisgICAgKiBbVEhSSUZULTMwODFdIC0gQysrIENvbnNvbGlkYXRlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3BzIGluIFRTZXJ2ZXJzCisgICAgKiBbVEhSSUZULTMwODNdIC0gQysrIENvbnNvbGlkYXRlIHNlcnZlciBwcm9jZXNzaW5nIGxvb3BzIGluIFRTaW1wbGVTZXJ2ZXIsIFRUaHJlYWRlZFNlcnZlciwgVFRocmVhZFBvb2xTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzA4NF0gLSBDKysgYWRkIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0IHRvIHRocmVhZGVkIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtMzA3NF0gLSAgICAgQWRkIGNvbXBpbGVyL2NwcC9sZXgueXl0aHJpZnRsLmNjIHRvIGdpdGlnbm9yZS4KKyAgICAqIFtUSFJJRlQtMzEzNF0gLSBSZW1vdmUgdXNlIG9mIGRlcHJlY2F0ZWQgInBoYW50b20uYXJncyIKKyAgICAqIFtUSFJJRlQtMzEzM10gLSBBbGxvdyAibWFrZSBjcm9zcyIgYW5kICJtYWtlIHByZWNyb3NzIiB0byBydW4gd2l0aG91dCBidWlsZGluZyBhbGwgbGFuZ3VhZ2VzCisgICAgKiBbVEhSSUZULTMxNDJdIC0gTWFrZSBKYXZhU2NyaXB0IHVzZSBkb3dubG9hZGVkIGxpYnJhcmllcworICAgICogW1RIUklGVC0zMTQxXSAtIEltcHJvdmUgbG9nZ2luZyBvZiBKYXZhU2NyaXB0IHRlc3QKKyAgICAqIFtUSFJJRlQtMzE0NF0gLSBQcm9wb3NhbDogbWFrZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW51bXMgaW4gZ2VuZXJhdGVkIGdvIGNvZGUgbGVzcyB2ZXJib3NlCisgICAgKiBbVEhSSUZULTMxMzBdIC0gUmVtb3ZlIHRoZSBsYXN0IHZlc3RpZ2VzIG9mIFRIUklGVF9PVkVSTE9BRF9JRiBmcm9tIFRIUklGVC0xMzE2CisgICAgKiBbVEhSSUZULTMxMzFdIC0gQ29uc29saWRhdGUgc3VnZ2VzdGVkIGltcG9ydCBwYXRoIGZvciBnbyB0aHJpZnQgbGlicmFyeSB0byBnaXQuYXBhY2hlLm9yZyBpbiBkb2NzIGFuZCBjb2RlCisgICAgKiBbVEhSSUZULTMwOTJdIC0gR2VuZXJhdGVkIEhhc2tlbGwgdHlwZXMgc2hvdWxkIGRlcml2ZSBHZW5lcmljCisgICAgKiBbVEhSSUZULTMxMTBdIC0gIFByaW50IGVycm9yIGxvZyBhZnRlciBjcm9zcyB0ZXN0IGZhaWx1cmVzIG9uIFRyYXZpcworICAgICogW1RIUklGVC0zMTE0XSAtIFVzaW5nIGxvY2FsIHRlbXAgdmFyaWFibGVzIHRvIG5vdCBwb2xsdXRlIHRoZSBnbG9iYWwgdGFibGUKKyAgICAqIFtUSFJJRlQtMzEwNl0gLSBDTWFrZSBzdW1tYXJ5IHNob3VsZCBnaXZlIG1vcmUgaW5mb3JtYXRpb24gd2h5IGEgbGlicmFyeSBpcyBzZXQgdG8gb2ZmCisgICAgKiBbVEhSSUZULTMxMTldIC0gSmF2YSdzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGhhcyBpbmRpc3Rpbmd1aXNoYWJsZSBsb2cgbWVzc2FnZXMgaW4gcnVuKCkKKyAgICAqIFtUSFJJRlQtMzEyMl0gLSBKYXZhc2NyaXB0IHN0cnVjdCBjb25zdHJ1Y3RvciBzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBzdHJ1Y3QgYW5kIGNvbnRhaW5lciBtZW1iZXJzIGZyb20gcGxhaW4ganMgYXJndW1lbnRzCisgICAgKiBbVEhSSUZULTMxNTFdIC0gRml4IGxpbmtzIHRvIGdpdC13aXAqIC0gc2hvdWxkIGJlIGdpdC5hcGFjaGUub3JnCisgICAgKiBbVEhSSUZULTMxNjddIC0gV2luZG93cyBidWlsZCBmcm9tIHNvdXJjZSBpbnN0cnVjdGlvbnMgbmVlZCB0byBiZSByZXZpc2VkCisgICAgKiBbVEhSSUZULTMxNTVdIC0gbW92ZSBjb250cmliL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIHRvIGJ1aWxkL2NtYWtlLworICAgICogW1RIUklGVC0zMTYwXSAtIE1ha2UgZ2VuZXJhdGVkIGdvIGVudW1zIGltcGxlbWVudCBUZXh0TWFyc2hhbGxlciBhbmQgVGV4dFVubWFyc2hhbGxlciBpbnRlcmZhY2VzCisgICAgKiBbVEhSSUZULTMxNTBdIC0gQWRkIGFuIG9wdGlvbiB0byB0aHJpZnQgZ28gZ2VuZXJhdG9yIHRvIG1ha2UgUmVhZCBhbmQgV3JpdGUgbWV0aG9kcyBwcml2YXRlCisgICAgKiBbVEhSSUZULTMxNDldIC0gTWFrZSBSZWFkRmllbGROIG1ldGhvZHMgaW4gZ2VuZXJhdGVkIEdvIGNvZGUgcHJpdmF0ZQorICAgICogW1RIUklGVC0zMTcyXSAtIEFkZCB0dXRvcmlhbCB0byBUaHJpZnQgd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtMzIxNF0gLSBBZGQgRXJsYW5nIG9wdGlvbiBmb3IgdXNpbmcgbWFwcyBpbnN0ZWFkIG9mIGRpY3RzCisgICAgKiBbVEhSSUZULTMyMDFdIC0gQ2FwdHVyZSBnaXRodWIgdGVzdCBhcnRpZmFjdHMgZm9yIGZhaWxlZCBidWlsZHMKKyAgICAqIFtUSFJJRlQtMzI2Nl0gLSBjX2dsaWI6IE11bHRpcGxlIGNvbXBpbGVyIHdhcm5pbmdzIGJ1aWxkaW5nIHVuaXQgdGVzdHMKKyAgICAqIFtUSFJJRlQtMzI4NV0gLSBjX2dsaWI6IEJ1aWxkIGxpYnJhcnkgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTE5NTRdIC0gQWxsb3cgZm9yIGEgc2VwYXJhdGUgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIAorICAgICogW1RIUklGVC0yMDk4XSAtIEFkZCBzdXBwb3J0IGZvciBRdDUrCisgICAgKiBbVEhSSUZULTIxOTldIC0gUmVtb3ZlIERlbnNlIHByb3RvY29sICh3YXM6IG1vdmUgdG8gQ29udHJpYikKKyAgICAqIFtUSFJJRlQtNDA2XSAtIEMrKyBUZXN0IHN1aXRlIGNsZWFudXAKKyAgICAqIFtUSFJJRlQtOTAyXSAtIHNvY2tldCBhbmQgY29ubmVjdCB0aW1lb3V0IGluIFRTb2NrZXQgc2hvdWxkIGJlIGRpc3Rpbmd1aXNoZWQKKyAgICAqIFtUSFJJRlQtMzg4XSAtIFVzZSBhIHNlcGFyYXRlIHdpcmUgZm9ybWF0IGZvciBhc3luYyBjYWxscworICAgICogW1RIUklGVC03MjddIC0gc3VwcG9ydCBuYXRpdmUgQysrIGxhbmd1YWdlIHNwZWNpZmljIGV4Y2VwdGlvbiBtZXNzYWdlCisgICAgKiBbVEhSSUZULTE3ODRdIC0gcGVwLTMxMTAgY29tcGxpYW5jZSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nIAorICAgICogW1RIUklGVC0xMDI1XSAtIEMrKyBTZXJ2ZXJTb2NrZXQgc2hvdWxkIGluaGVyaXQgZnJvbSBTb2NrZXQgd2l0aCB0aGUgbmVjZXNzYXJ5IEN0b3IgdG8gbGlzdGVuIG9uIGNvbm5lY3Rpb25zIGZyb20gYSBzcGVjaWZpYyBob3N0CisgICAgKiBbVEhSSUZULTIyNjldIC0gQ2FuIGRlcGxveSBsaWJ0aHJpZnQtc291cmNlLmphciB0byBtYXZlbiBjZW50ZXIgcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0yODA0XSAtIFB1bGwgYW4gaW50ZXJmYWNlIG91dCBvZiBUQmFzZUFzeW5jUHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTI4MDZdIC0gbW9yZSB3aGl0ZXNwYWNlIGZpeHVwcworICAgICogW1RIUklGVC0yODExXSAtIE1ha2UgcmVtb3RlIHNvY2tldCBhZGRyZXNzIGFjY2Vzc2libGUKKyAgICAqIFtUSFJJRlQtMjgwOV0gLSAuZ2l0aWdub3JlIHVwZGF0ZSBmb3IgY29tcGlsZXIncyB2aXN1YWwgcHJvamVjdAorICAgICogW1RIUklGVC0yODQ2XSAtIEV4cG9zZSBjaXBoZXJzIHBhcmFtZXRlciBmcm9tIHNzbC53cmFwX3NvY2tldCgpCisgICAgKiBbVEhSSUZULTI4NTldIC0gSlNPTiBnZW5lcmF0b3I6IG91dHB1dCBjb21wbGV0ZSBkZXNjcmlwdG9ycworICAgICogW1RIUklGVC0yODYxXSAtIGFkZCBidWZmZXJlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjg2NV0gLSBUZXN0IGNhc2UgZm9yIEdvOiBTZXFJZCBvdXQgb2Ygc2VxdWVuY2UKKyAgICAqIFtUSFJJRlQtMjg2Nl0gLSBHbyBnZW5lcmF0b3Igc291cmNlIGNvZGUgaXMgaGFyZCB0byByZWFkIGFuZCBtYWludGFpbgorICAgICogW1RIUklGVC0yODgwXSAtIFJlYWQgdGhlIG5ldHdvcmsgYWRkcmVzcyBmcm9tIHRoZSBsaXN0ZW5lciBpZiBhdmFpbGFibGUuCisgICAgKiBbVEhSSUZULTI4NzVdIC0gVHlwbyBpbiBURGVuc2VQcm90b2NvbC5oIGNvbW1lbnQKKyAgICAqIFtUSFJJRlQtMjg3NF0gLSBUQmluYXJ5UHJvdG9jb2wgIG1lbWJlciB2YXJpYWJsZSAic3RyaW5nX2J1Zl8iIGlzIG5ldmVyIHVzZWQuCisgICAgKiBbVEhSSUZULTI4NTVdIC0gTW92ZSBjb250cmlidXRpbmcubWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkKKyAgICAqIFtUSFJJRlQtMjg2Ml0gLSBFbmFibGUgUlRUSSBhbmQvb3IgYnVpbGQgbWFjcm9zIGZvciBnZW5lcmF0ZWQgY29kZQorICAgICogW1RIUklGVC0yODc2XSAtICBBZGQgdGVzdCBmb3IgVEhSSUZULTI1MjYgQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAorICAgICogW1RIUklGVC0yODk3XSAtIEdlbmVyYXRlIC1pc0VxdWFsOiBhbmQgLWhhc2ggbWV0aG9kcworICAgICogW1RIUklGVC0yOTA5XSAtIEltcHJvdmUgdHJhdmlzIGJ1aWxkCisgICAgKiBbVEhSSUZULTI5MjFdIC0gTWFrZSBFcmxhbmcgaW1wbCByZWFkeSBmb3IgT1RQIDE4IHJlbGVhc2UgKGRpY3QvMCBhbmQgc2V0LzAgYXJlIGRlcHJlY2F0ZWQpCisgICAgKiBbVEhSSUZULTI5MjhdIC0gUmVuYW1lIHRoZSBlcmxhbmcgdGVzdF9zZXJ2ZXIgbW9kdWxlCisgICAgKiBbVEhSSUZULTI5NDBdIC0gQWxsb3cgaW5zdGFsbGluZyBUaHJpZnQgZnJvbSBnaXQgYXMgTlBNIG1vZHVsZSBieSBwcm92aWRpbmcgcGFja2FnZS5qc29uIGluIHRvcCBsZXZlbCBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMjkzN10gLSBBbGxvdyBzZXR0aW5nIGEgbWF4aW11bSBmcmFtZSBzaXplIGluIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjk3Nl0gLSBub2RlanM6IHhociBhbmQgd2Vic29ja2V0IHN1cHBvcnQgZm9yIGJyb3dzZXJpZnkKKyAgICAqIFtUSFJJRlQtMjk5Nl0gLSBUZXN0IGZvciBIYXhlIDMuMS4zIG9yIGJldHRlciAKKyAgICAqIFtUSFJJRlQtMjk2OV0gLSBub2RlanM6IERSWSB1cCBsaWJyYXJ5IHRlc3RzCisgICAgKiBbVEhSSUZULTI5NzNdIC0gVXBkYXRlIEhheGUgbGliIHJlYWRtZSByZWdhcmRpbmcgSGF4ZSAzLjEuMworICAgICogW1RIUklGVC0yOTUyXSAtIEltcHJvdmUgaGFuZGxpbmcgb2YgU2VydmVyLlN0b3AoKSAKKyAgICAqIFtUSFJJRlQtMjk2NF0gLSBub2RlanM6IG1vdmUgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGludG8gc2VwYXJhdGUgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjk2M10gLSBub2RlanMgLSBhZGQgdGVzdCBjb3ZlcmFnZQorICAgICogW1RIUklGVC0zMDA2XSAtIEF0dGFjaCAnb21pdGVtcHR5JyBqc29uIHRhZyBmb3Igb3B0aW9uYWwgZmllbGRzIGluIEdvCisgICAgKiBbVEhSSUZULTMwMjddIC0gR28gY29tcGlsZXIgZG9lcyBub3QgZW5zdXJlIGNvbW1vbiBpbml0aWFsaXNtcyBoYXZlIGNvbnNpc3RlbnQgY2FzZQorICAgICogW1RIUklGVC0zMDMwXSAtIFRUaHJlYWRlZFNlcnZlcjogUHJvcGVydHkgZm9yIG51bWJlciBvZiBjbGllbnRUaHJlYWRzCisgICAgKiBbVEhSSUZULTMwMjNdIC0gR28gY29tcGlsZXIgaXMgYSBsaXR0bGUgb3Zlcmx5IGNvbnNlcnZhdGl2ZSB3aXRoIG5hbWVzIG9mIGF0dHJpYnV0ZXMKKyAgICAqIFtUSFJJRlQtMzAxOF0gLSBDb21wYWN0IHByb3RvY29sIGZvciBEZWxwaGkKKyAgICAqIFtUSFJJRlQtMzAyNV0gLSBDaGFuZ2UgcHVyZSBJbnQgY29uc3RhbnRzIGludG8gQGVudW1zICh3aGVyZSBwb3NzaWJsZSkKKyAgICAqIFtUSFJJRlQtMzAzMV0gLSBtaWdyYXRlICJzaG91bGRTdG9wIiBmbGFnIHRvIFRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMzAyMl0gLSBDb21wYWN0IHByb3RvY29sIGZvciBIYXhlCisgICAgKiBbVEhSSUZULTMwNDFdIC0gR2VuZXJhdGUgYXN5bmNocm9ub3VzIGNsaWVudHMgZm9yIENvY29hCisgICAgKiBbVEhSSUZULTMwNTNdIC0gUGVybCBTU0wgU29ja2V0IFN1cHBvcnQgKEVuY3J5cHRpb24pCisgICAgKiBbVEhSSUZULTMyNDddIC0gR2VuZXJhdGUgYSBDKysgdGhyZWFkLXNhZmUgY2xpZW50CisgICAgKiBbVEhSSUZULTMyMTddIC0gUHJvdmlkZSBhIGxpdHRsZSBlbmRpYW4gdmFyaWFudCBvZiB0aGUgYmluYXJ5IHByb3RvY29sIGluIEMrKworICAgICogW1RIUklGVC0zMjIzXSAtIFR5cGVTY3JpcHQ6IEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIEVudW0gTWFwcworICAgICogW1RIUklGVC0zMjIwXSAtIE9wdGlvbiB0byBzdXBwcmVzcyBAR2VuZXJhdGVkIEFubm90YXRpb24gZW50aXJlbHkKKyAgICAqIFtUSFJJRlQtMzMwMF0gLSBSZWltcGxlbWVudCBUWmxpYlRyYW5zcG9ydCBpbiBKYXZhIHVzaW5nIHN0cmVhbXMKKyAgICAqIFtUSFJJRlQtMzI4OF0gLSBjX2dsaWI6IEJ1aWxkIHVuaXQgdGVzdHMgd2l0aCBhbGwgd2FybmluZ3MgZW5hYmxlZCwgbm8gd2FybmluZ3MgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTMzNDddIC0gSW1wcm92ZSBjcm9zcyB0ZXN0IHNlcnZlcnMgYW5kIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtMzM0Ml0gLSBJbXByb3ZlIHJ1YnkgY3Jvc3MgdGVzdCBjbGllbnQgYW5kIHNlcnZlciBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTIyOTZdIC0gQWRkIEMrKyBCYXNlIGNsYXNzIGZvciBzZXJ2aWNlCisgICAgKiBbVEhSSUZULTMzMzddIC0gQWRkIHRlc3RCb29sIG1ldGhvZCB0byBjcm9zcyB0ZXN0cworICAgICogW1RIUklGVC0zMzAzXSAtIERpc2FibGUgY29uY3VycmVudCBjYWJhbCBqb2JzIG9uIFRyYXZpcyB0byBhdm9pZCBHSEMgY3Jhc2gKKyAgICAqIFtUSFJJRlQtMjYyM10gLSBEb2NrZXIgY29udGFpbmVyIGZvciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtMzI5OF0gLSB0aHJpZnQgZW5kaWFuIGNvbnZlcnRlcnMgbWF5IGNvbmZsaWN0IHdpdGggb3RoZXIgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTE1NTldIC0gUHJvdmlkZSBtZW1vcnkgcG9vbCBmb3IgVEJpbmFyeVByb3RvY29sIHRvIGVsaW1pbmF0ZSBtZW1vcnkgZnJhZ21lbnRhdGlvbgorICAgICogW1RIUklGVC00MjRdIC0gU3RlYWwgUHJvdG9jb2xCdWZmZXJzJyBWYXJJbnQgaW1wbGVtZW50YXRpb24gZm9yIEMrKworCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0zMDcwXSAtIEFkZCBhYmlsaXR5IHRvIHNldCB0aGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCisgICAgKiBbVEhSSUZULTE5MDldIC0gSmF2YTogQWRkIGNvbXBpbGVyIGZsYWcgdG8gdXNlIHRoZSAib3B0aW9uIHBhdHRlcm4iIGZvciBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjA5OV0gLSBTdG9wIFRUaHJlYWRQb29sU2VydmVyIHdpdGggYWxpdmUgY29ubmVjdGlvbnMuCisgICAgKiBbVEhSSUZULTEyM10gLSBpbXBsZW1lbnQgVFpsaWJUcmFuc3BvcnQgaW4gSmF2YQorICAgICogW1RIUklGVC0yMzY4XSAtIE5ldyBvcHRpb246IHJldXNlLW9iamVjdHMgZm9yIEphdmEgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTI4MzZdIC0gT3B0aW9uYWxseSBnZW5lcmF0ZSBDKysxMSBNb3ZlQ29uc3RydWN0aWJsZSB0eXBlcworICAgICogW1RIUklGVC0yODI0XSAtIEZsYWcgdG8gZGlzYWJsZSBodG1sIGVzY2FwaW5nIGRvY3RleHQKKyAgICAqIFtUSFJJRlQtMjgxOV0gLSBBZGQgV2Vic1NvY2tldCBjbGllbnQgdG8gbm9kZS5qcworICAgICogW1RIUklGVC0zMDUwXSAtIENsaWVudCBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBmb3Igbm9uLWh0dHAgVExTIGluIEMjCisgICAgKiBbVEhSSUZULTMyOTJdIC0gSW1wbGVtZW50IFRabGliVHJhbnNwb3J0IGluIEdvCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI1ODNdIC0gVGhyaWZ0IG9uIHhQQyB0YXJnZXQgKFNwZWVkR29hdCkKKyAgICAqIFtUSFJJRlQtMjU5Ml0gLSB0aHJpZnQgc2VydmVyIHVzaW5nIGNfZ2xpYgorICAgICogW1RIUklGVC0yODMyXSAtIGNfZ2xpYjogSGFuZGxlIHN0cmluZyBsaXN0cyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMzEzNl0gLSB0aHJpZnQgaW5zdGFsbGF0aW9uIHByb2JsZW0gb24gbWFjCisgICAgKiBbVEhSSUZULTMzNDZdIC0gY19nbGliOiBUdXRvcmlhbHMgZXhhbXBsZSBjcmFzaGVzIHNheWluZyBDYWxjdWxhdG9yLnBpbmcgaW1wbGVtZW50YXRpb24gcmV0dXJuZWQgRkFMU0UgYnV0IGRpZCBub3Qgc2V0IGFuIGVycm9yCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTI1NzhdIC0gTW92aW5nICdtYWtlIGNyb3NzJyBmcm9tIHRlc3Quc2ggdG8gdGVzdC5weQorICAgICogW1RIUklGVC0yNzM0XSAtIEdvIGNvZGluZyBzdGFuZGFyZHMKKyAgICAqIFtUSFJJRlQtMjc0OF0gLSBBZGQgVmFncmFudGZpbGUgZm9yIENlbnRvcyA2LjUKKyAgICAqIFtUSFJJRlQtMjc1M10gLSBNaXNjLiBIYXhlIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yNjQwXSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMzI2Ml0gLSB3YXJuaW5nOiBvdmVyZmxvdyBpbiBpbXBsaWNpdCBjb25zdGFudCBjb252ZXJzaW9uIGluIERlbnNlUHJvdG9UZXN0LmNwcAorICAgICogW1RIUklGVC0zMTk0XSAtIENhbid0IGJ1aWxkIHdpdGggZ28gZW5hYmxlZC4gIGdvbW9jayBTQ0MgcGF0aCBpbmNvcnJlY3QuCisgICAgKiBbVEhSSUZULTMyNzVdIC0gY19nbGliIHR1dG9yaWFsIHdhcm5pbmdzIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTExMjVdIC0gTXVsdGlwbGV4aW5nIHN1cHBvcnQgZm9yIHRoZSBSdWJ5IExpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjgwN10gLSBQSFAgQ29kZSBTdHlsZQorICAgICogW1RIUklGVC0yODQxXSAtIEFkZCBjb21wcmVoZW5zaXZlIGludGVncmF0aW9uIHRlc3RzIGZvciB0aGUgd2hvbGUgR28gc3RhY2sKKyAgICAqIFtUSFJJRlQtMjgxNV0gLSBIYXhlOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0yODg2XSAtIEludGVncmF0ZSBiaW5hcnkgdHlwZSBpbiBzdGFuZGFyZCBUaHJpZnQgY3Jvc3MgdGVzdAorICAgICogW1RIUklGVC0yOTQ2XSAtIEVuaGFuY2UgdXNhYmlsaXR5IG9mIGNyb3NzIHRlc3QgZnJhbWV3b3JrCisgICAgKiBbVEhSSUZULTI5NjddIC0gQWRkIC5lZGl0b3Jjb25maWcgdG8gcm9vdAorICAgICogW1RIUklGVC0zMDMzXSAtIFBlcmw6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTMxNzRdIC0gSW5pdGlhbGlzbSBjb2RlIGluIHRoZSBHbyBjb21waWxlciBkb2Vzbid0IGNoZWNrIGZpcnN0IHdvcmQKKyAgICAqIFtUSFJJRlQtMzE5M10gLSBPcHRpb24gdG8gc3VwcmVzcyBkYXRlIHZhbHVlIGluIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbgorICAgICogW1RIUklGVC0zMzA1XSAtIE1pc3NpbmcgZGlzdCBmaWxlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKyAgICAqIFtUSFJJRlQtMzM0MV0gLSBBZGQgdGVzdEJvb2wgbWV0aG9kcworICAgICogW1RIUklGVC0zMzA4XSAtIEZpeCBicm9rZW4gdGVzdCBjYXNlcyBmb3IgMC45LjMgcmVsZWFzZSBjYW5kaWRhdGUKKworIyMgVGFzaworICAgICogW1RIUklGVC0yODM0XSAtIFJlbW92ZSBzZW1pLWNvbG9ucyBmcm9tIHB5dGhvbiBjb2RlIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0yODUzXSAtIEFkanVzdCBjb21tZW50cyBub3QgYXBwbHlpbmcgYW55bW9yZSBhZnRlciBUSFJJRlQtMjg1MgorCisjIyBUZXN0CisgICAgKiBbVEhSSUZULTMyMTFdIC0gQWRkIG1ha2UgY3Jvc3Mgc3VwcG9ydCBmb3IgcGhwIFRDb21wYWN0UHJvdG9jb2wKKworIyMgV2lzaAorICAgICogW1RIUklGVC0yODM4XSAtIFROb25ibG9ja2luZ1NlcnZlciBjYW4gYmluZCB0byBwb3J0IDAgKGkuZS4sIGdldCBhbiBPUy1hc3NpZ25lZCBwb3J0KSBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGdldCB0aGUgcG9ydCBudW1iZXIKIAogCi1WZXJzaW9uIDAuNy4wCiAKLVRIUklGVC0xMjUyICAgUnVieSAgICAgICAgICAgICAgICAgU2VnZmF1bHQgaW4gUnVieSBkZXNlcmlhbGl6ZXIKLVRIUklGVC05NDAgICAgQnVpbGQgICAgICAgICAgICAgICAgJ21ha2UgY2hlY2snIGZhaWxzIGlmIGJvb3N0IGlzIG5vdCBpbiB0aGUgc3RkIGluY2x1ZGUgYW5kIGxpbmsgcGF0aHMgKENocmlzdGlhbiBMYXZvaWUpCi1USFJJRlQtMTAzOCAgIEphdmEgICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBKYXZhIGNvZGUgZm9yIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaW5hcnkgZmllbGRzIGFyZSBub3Qgc2VyaWFsaXphYmxlIGNvcnJlY3RseQotVEhSSUZULTEwOTggICBQSFAgICAgICAgICAgICAgICAgICBVbmRlZmluZWQgcHJvcGVydGllcyBpbiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5CQkKLVRIUklGVC0xMDc2ICAgRXJsYW5nICAgICAgICAgICAgICAgRXJsYW5nIFRocmlmdCBzb2NrZXQgc2VydmVyIGNhdXNlcyBqYXZhIGZyYW1lZCBjbGllbnQgdG8gdGhyb3cgIiJvdXQgb2Ygc2VxdWVuY2UiIiBleGNlcHRpb24iCQkKLVRIUklGVC0xMTcxICAgUGVybCAgICAgICAgICAgICAgICAgUGVybCB3cml0ZS9yZWFkRG91YmxlIGFzc3VtZXMgbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybQkJCi1USFJJRlQtMTUxICAgIEMgICAgICAgICAgICAgICAgICAgIFRTU0xTZXJ2ZXJTb2NrZXQgYW5kIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24JCQotVEhSSUZULTEwNjggICBQeXRob24gICAgICAgICAgICAgICBQeXRob24gU1NMIFNvY2tldCBTdXBwb3J0CQkKLVRIUklGVC0xMDExICAgQVMzICAgICAgICAgICAgICAgICAgRXJyb3IgZ2VuZXJhdGluZyBwYWNrYWdlIGltcG9ydHMgd2hlbiB1c2luZyBjbGFzc2VzIGZyb20gb3RoZXIgcGFja2FnZXMJCQotVEhSSUZULTEwNjkgICBDb21waWxlciAoR2VuZXJhbCkgICBBZGQgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBwcmV2ZW50IHRocmlmdCBmcm9tIGluc2VydGluZyBnZW4tKiBkaXJlY3RvcmllcwkJCi1USFJJRlQtMTA1NSAgIEMjICAgICAgICAgICAgICAgICAgIGNzaGFycCBUU2VydmVyU29ja2V0IGFuZCBUU29ja2V0IGRvIG5vdCBkaXNhYmxlIE5hZ2xlIHZpYSBTb2NrZXQuTm9EZWxheSA9IHRydWUgbGlrZSBjcHAgYW5kIGphdmEgZG8JCQotVEhSSUZULTYzOCAgICBQSFAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFRyYW5zcG9ydCArIEMgZXh0ZW5zaW9ucyBibG9jayB1bnRpbCByZWN2IHRpbWVvdXQgaXMgcmVhY2hlZCBvbiBsYXN0IGZyZWFkIGNhbGwJCQotVEhSSUZULTg2NyAgICBQSFAgICAgICAgICAgICAgICAgICBQSFAgYWNjZWxlcmF0b3IgbW9kdWxlJ3Mgb3V0cHV0IHRyYW5zcG9ydCBpcyBpbmNvbXBhdGlibGUgd2l0aCBURnJhbWVkVHJhbnNwb3J0CQkKLVRIUklGVC0xMDU0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXQgY2FsbCB0byBQS0dfUFJPR19QS0dfQ09ORklHIGlzIG1pc3NpbmcgYW5kIGZpcnN0IHVzZSBvZiBQS0dfQ0hFQ0tfTU9EVUxFUyBtYXkgbm90IGhhcHBlbgotVEhSSUZULTEyNSAgICBPQ2FtbCAgICAgICAgICAgICAgICBPQ2FtbCBsaWJyYXJpZXMgZG9uJ3QgY29tcGlsZSB3aXRoIDMyLWJpdCBvY2FtbAkJCi1USFJJRlQtMTIwMCAgIEphdmFTY3JpcHQgICAgICAgICAgIEpTIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlIHRoYXQgY2xvYmJlcnMgZXhpc3RpbmcgbmFtZXNwYWNlcwkJCi1USFJJRlQtMTEwMiAgIEJ1aWxkICAgICAgICAgICAgICAgICJ0eXBvIGluIGNvbmZpZ3VyZS5hYzogIiI9PSIiIG9wZXJhdG9yIGluICd0ZXN0JyAoaW5zdGVhZCBvZiIiJz0iIikiCQkKLVRIUklGVC05OTQgICAgQnVpbGQgICAgICAgICAgICAgICAgRG9uJ3QgdHJ5IHRvIGludm9rZSBwaHBpemUgaWYgd2UgZG9uJ3QgaGF2ZSBpdAkJCi1USFJJRlQtODY0ICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIGRlZmF1bHQgdmFsdWUgZmFpbHMgaWYgaWRlbnRpZmllciBpcyBhIHN0cnVjdAkJCi1USFJJRlQtMTAyMSAgIE9DYW1sICAgICAgICAgICAgICAgIEZyYW1lZCB0cmFuc3BvcnQgc3VwcG9ydCBmb3IgT0NhbWwJCQotVEhSSUZULTEwMzIgICAgICAgICAgICAgICAgICAgICAgICBtYWtlIGRpc3QgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCQkKLVRIUklGVC0xMDU3ICAgQysrICAgICAgICAgICAgICAgICAgY2FzdHMgaW4gVEJpbmFyeVByb3RvY29sLnRjYyBjYXVzaW5nIGRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcwotVEhSSUZULTEwNTMgICBKYXZhICAgICAgICAgICAgICAgICBNYWtlIHJlbW90ZSBjbGllbnQncyBJUCBhZGRyZXNzIGF2YWlsYWJsZSBmb3IgYWxsIHNvY2tldCByZWxhdGVkIHRyYW5zcG9ydHMJCQotVEhSSUZULTEwMzYgICBDKysgICAgICAgICAgICAgICAgICAiQXV0by1nZW5lcmF0ZWQgQysrIGNvZGUgZmFpbHMgdG8gY29tcGlsZSB3aXRoICIiLVdlcnJvciAtV2V4dHJhIC1XYWxsIiIgZysrIGNvbXBpbGVyIGZsYWdzIgkJCi1USFJJRlQtMTA2MyAgIFR1dG9yaWFsICAgICAgICAgICAgIEZpeCBFcmxhbmcgVHV0b3JpYWwgRmlsZXMJCQotVEhSSUZULTYyNSAgICBHbyAgICAgICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgJ0dvJwkJCi1USFJJRlQtMTA5MyAgIFB5dGhvbiAgICAgICAgICAgICAgIHNldmVyYWwgYnVncyBpbiBweXRob24gVENvbXBhY3RQcm90b2NvbAkJCi1USFJJRlQtMTEwMSAgIEphdmEgICAgICAgICAgICAgICAgIGJ5dGVidWZmZXIgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIFRCaW5hcnlQcm90b2NvbCB3cml0ZUJpbmFyeQkJCi1USFJJRlQtMTA5NCAgIFB5dGhvbiAgICAgICAgICAgICAgIGJ1ZyBpbiBUQ29tcGFjdFByb3RvIHB5dGhvbiByZWFkTWVzc2FnZUVuZCBtZXRob2QgYW5kIHVwZGF0ZWQgdGVzdCBjYXNlcwkJCi1USFJJRlQtMTEwMCAgIFB5dGhvbiAgICAgICAgICAgICAgIHB5dGhvbiBUU1NMU29ja2V0IGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24JCQotVEhSSUZULTExMDQgICBCdWlsZCAgICAgICAgICAgICAgICBJTlNUQUxMRElSUyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gY29uZmlndXJlIHNjcmlwdAkJCi1USFJJRlQtMTEwMyAgIFB5dGhvbiAgICAgICAgICAgICAgIFRabGliVHJhbnNwb3J0IGZvciBweXRob24sIGEgemxpYiBjb21wcmVzc2VkIHRyYW5zcG9ydAkJCi1USFJJRlQtMTEwNSAgIE9DYW1sICAgICAgICAgICAgICAgIE9DYW1sIGdlbmVyYXRvciBkb2VzIG5vdCBwcmVmaXggbWV0aG9kcyBvZiBpbmNsdWRlZCBzdHJ1Y3RzIHdpdGggdGhlaXIgdHlwZQkJCi1USFJJRlQtMTEwNyAgIFB5dGhvbiAgICAgICAgICAgICAgIGltcHJvdmVtZW50IGZvciBjb21waWxlci1nZW5lcmF0ZWQgcHl0aG9uIGZvciAnTm9uZScgb2JqZWN0IGNvbXBhcmlzb25zCQkKLVRIUklGVC0xMTA5ICAgSmF2YSAgICAgICAgICAgICAgICAgRGVwbG95IGZiMzAzIGFsb25nIHNpZGUgbGlidGhyaWZ0IHRvIG1hdmVuIHJlcG8JCQotVEhSSUZULTExMTEgICBDb21waWxlciAoR2VuZXJhbCkgICBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeSB0eXBlcwkJCi1USFJJRlQtMTA3NCAgIEphdmEgICAgICAgICAgICAgICAgIC5rZXlzdG9yZSBhbmQgLnRydXN0c3RvcmUgYXJlIG1pc3NpbmcgZnJvbSB0aGUgMC42LjAgZGlzdHJpYnV0aW9uCQkKLVRIUklGVC0xMTE5ICAgQyMgICAgICAgICAgICAgICAgICAgVEpTT05Qcm90b2NvbCBmYWlscyB0byBVVEY4IGRlY29kZSBzdHJpbmdzCQkKLVRIUklGVC0xMTIwICAgQyMgLSBDb21waWxlciAgICAgICAgcHJvdG8uV3JpdGVMaXN0RW5kIGJlaW5nIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UJCQotVEhSSUZULTExMjYgICBFcmxhbmcgICAgICAgICAgICAgICBFeHRlbmRpbmcgc3RydWN0X2luZm8gZm9yIGVybGFuZyBiaW5kaW5ncwkJCi1USFJJRlQtMTEzMiAgIEMjICAgICAgICAgICAgICAgICAgIERlc2VyaWFsaXphdGlvbiBlcnJvciBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24gQyMJCQotVEhSSUZULTExMzEgICBDIyAgICAgICAgICAgICAgICAgICBDIyBKU09OIFByb3RvY29sIGlzIHVuYWJsZSB0byBkZWNvZGUgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZwkJCi1USFJJRlQtMTEzMyAgIFR1dG9yaWFsICAgICAgICAgICAgIEphdmEgYW5kIEphdmFTY3JpcHQgdHV0b3JpYWwgaXMgYnJva2VuIHNpbmNlIHdlIGhhdmUgSmF2YSBtYXZlbiBkZXBsb3ltZW50CQkKLVRIUklGVC0xMTQwICAgR2xpYkMgICAgICAgICAgICAgICAgRnJhbWVkIFRyYW5zcG9ydCBDbGllbnQgdXNpbmcgQyAoR2xpYikgTGlicmFyeSBoYW5ncyB3aGVuIGNvbm5lY3RpbmcgdG8gUnVieSBTZXJ2ZXIJCQotVEhSSUZULTM0MiAgICBQSFAgICAgICAgICAgICAgICAgICBQSFA6IGNhbid0IGhhdmUgc2V0cyBvZiBjb21wbGV4IHR5cGVzCQkKLVRIUklGVC0xMTQ5ICAgUnVieSAgICAgICAgICAgICAgICAgTm9uYmxvY2tpbmcgc2VydmVyIGZhaWxzIHdoZW4gY2xpZW50IGNvbm5lY3Rpb24gaXMgcmVzZXQJCQotVEhSSUZULTM2MyAgICBKYXZhICAgICAgICAgICAgICAgICBNYXZlbiBEZXBsb3kJCQotVEhSSUZULTExNTUgICBKYXZhCQkJCSAgIFJlbW92ZSBsb2c0aiBkZXBlbmRlbmN5IGZyb20gamF2YSBjbGllbnQJCQotVEhSSUZULTExNzAgICBKYXZhICAgICAgICAgICAgICAgICBUaHJpZnQgR2VuZXJhdGVkIENvZGUgYW5kIEphdmEgNQkJCi1USFJJRlQtODM1ICAgIEFTMyAgICAgICAgICAgICAgICAgIEJhZCBBUzMgc3ludGF4IGluIGNvbnN0cnVjdG9ycyB0aGF0IHNldCBkZWZhdWx0IHZhbHVlcwkJCi1USFJJRlQtMTE3NCAgIEJ1aWxkICAgICAgICAgICAgICAgIFB1Ymxpc2ggYXMzIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB2aWEgTWF2ZW4gZm9yIHVzZSBieSBmbGV4LW1vam9zIHVzZXJzCQkKLVRIUklGVC0xMTc4ICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YTogVEJhc2Ugc2lnbmF0dXJlIHNob3VsZCBiZSBUIGV4dGVuZHMgVEJhc2U8Pyw/PgkJCi1USFJJRlQtMTA2NyAgIFBIUCAgICAgICAgICAgICAgICAgIFRvbnMgb2YgYnVncyBpbiBwaHAgaW1wbGVtZW50YXRpb24JCQotVEhSSUZULTExODIgICBSdWJ5ICAgICAgICAgICAgICAgICBOYXRpdmUgZGVzZXJpYWxpemVyIHNlZ2ZhdWx0cyBvbiBpbmNvcnJlY3QgbGlzdCBlbGVtZW50IHR5cGUJCQotVEhSSUZULTExOTAgICBKYXZhICAgICAgICAgICAgICAgICByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgaW4gVE5vbmJsb2NraW5nU2VydmVyLmphdmEgc2hvdWxkIGJlIEF0b21pY0xvbmcgdG8gZml4IEZEIGxlYWthZ2UgCi1USFJJRlQtMTE4MyAgIFJ1YnkgICAgICAgICAgICAgICAgIFB1cmUtcnVieSBDb21wYWN0UHJvdG9jb2wgcmFpc2VzIEFyZ3VtZW50RXJyb3Igd2hlbiBkZXNlcmlhbGl6aW5nIHVuZGVyIFJ1YnkgMS45CQkKLVRIUklGVC0xMTkyICAgICAgICAgICAgICAgICAgICAgICAgVHlwbzogVFByb3RvY29sLmggdGVzdHMgZm9yIEhBVkVfU1lTX1BBUkFNX0hfCQkKLVRIUklGVC0xMTk0ICAgSmF2YSAgICAgICAgICAgICAgICAgSmF2YSBsaWIgZG9lcyBub3QgaW5zdGFsbCBhcnRpZmFjdHMgdG8gbG9jYWwgZGlyIGNvcnJlY3RseQkJCi1USFJJRlQtMTIwOCAgIFB5dGhvbiAgICAgICAgICAgICAgIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sLnB5IHdyaXRlQm9vbCBhbmQgcmVhZEJvb2wgbm90IGZvbGxvdyB0aGUgY29tcGFjdC1wcm90by1zcGVjLTIudHh0IHNwZWMgCi1USFJJRlQtMTIxMSAgIEphdmEgICAgICAgICAgICAgICAgIFdoZW4gdXNpbmcgVEh0dHBDbGllbnQsIG5vbiAyMDAgcmVzcG9uc2VzIGxlYXZlIHRoZSBjb25uZWN0aW9uIG9wZW4JCQotVEhSSUZULTYyNyAgICBDKysgICAgICAgICAgICAgICAgICBzaG91bGQgYysrIGhhdmUgc2V0dGVycyBmb3Igb3B0aW9uYWwgZmllbGRzPwkJCi1USFJJRlQtMTIxOCAgIEdMaWJDICAgICAgICAgICAgICAgIGNfZ2xpYiB1c2VzIHdyb25nIG5hbWUgaW4gcGtnLWNvbmZpZwkJCi1USFJJRlQtMTE4OSAgIFJ1YnkgICAgICAgICAgICAgICAgIFJ1YnkgZGVzZXJpYWxpemVyIHNwZWVkIGltcHJvdmVtZW50cwkJCi1USFJJRlQtMTIyNSAgIFBIUCAgICAgICAgICAgICAgICAgIFRDb21wYWN0UHJvdG9jb2wgZm9yIFBIUAkJCi1USFJJRlQtMTIyNyAgIEVybGFuZyAgICAgICAgICAgICAgIEVybGFuZyBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgSlNPTiBwcm90b2NvbAkJCi1USFJJRlQtMTIyOCAgIFBIUCAgICAgICAgICAgICAgICAgIFRoZSBwaHAgYWNjZWxlcmF0b3IgbW9kdWxlIGNhbGxzIGZsdXNoIGluY29ycmVjdGx5CQkKLVRIUklGVC0xMjM0ICAgUHl0aG9uICAgICAgICAgICAgICAgdGhyaWZ0IC0taGVscCBpcyBtaXNzaW5nIGRvYyBvbiBweTp1dGY4c3RyaW5ncwkJCi1USFJJRlQtMTIzNyAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgZmIzMDMgbWlzc2luZyBzb21lIG1ldGhvZHMJCQotVEhSSUZULTEyNDggICBDKysgICAgICAgICAgICAgICAgICBwb2ludGVyIHN1YnRyYWN0aW9uIGluIFRNZW1vcnlCdWZmZXIgcmVsaWVzIG9uIHVuZGVmaW5lZCBiZWhhdmlvcgkJCi1USFJJRlQtMTI1MyAgIEphdmEgICAgICAgICAgICAgICAgIENvZGUgZ2VuZXJhdGVkIGZvciBtYXBzIGlzIG5vdCBjb21waWxpbmcJCQotVEhSSUZULTEyNTUgICBKYXZhICAgICAgICAgICAgICAgICBNaXNtYXRjaCBvZiBtZXRob2QgbmFtZSBiZXR3ZWVuIEphdmFNRSdzIGxpYiBhbmQgZ2VuZXJhdGVkIGNvZGUgKGNvbXBhcmVUby9jb21wYXJlT2JqZWN0cykKLVRIUklGVC0xMjM4ICAgSmF2YVNjcmlwdCAgICAgICAgICAgVGhyaWZ0IEpTIGNsaWVudCBjYW5ub3QgcmVhZCBtYXAgb2Ygc3RydWN0dXJlcwkJCi1USFJJRlQtMTIxMyAgICAgICAgICAgICAgICAgICAgICAgIE1lbWJ1ZmZlciBzaG91bGQgcHJvdmlkZSBhIHdheSB0byBnZXQgYmFjayB0aGUgYnVmZmVyCQkKLVRIUklGVC0xMTE3ICAgSmF2YVNjcmlwdCAgICAgICAgICAgSmF2YVNjcmlwdCBVbml0IFRlc3QgZG9lcyBmYWlsIGR1ZSB0byBsaWJ0aHJpZnQqLmphciB3aGVyZSBtb3ZlZCBieSBNYXZlbiBEZXBsb3ltZW50CQkKLVRIUklGVC0xMTY0ICAgSmF2YVNjcmlwdCAgICAgICAgICAgU2VnbWVudGF0aW9uIGZhdWx0IG9uIE5VTEwgcG9pbnRlciBpbiB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QJCQotVEhSSUZULTc4OCAgICBQSFAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2wuc286IG11bHRpZ2V0L211bHRpZ2V0X3NsaWNlIGRvZXMgbm90IGhhbmRsZSBtb3JlIHRoYW4gMTcga2V5cyBjb3JyZWN0bHkKLVRIUklGVC0xMjIyICAgQysrICAgICAgICAgICAgICAgICAgVW5oYW5kbGVkIGV4Y2VwdGlvbiBmb3IgVEV2aHR0cFNlcnZlciByZXF1ZXN0CQkKLVRIUklGVC0xMjQxICAgUEhQICAgICAgICAgICAgICAgICAgcGhwIG5hbWVzcGFjZSBnZW5lcmF0aW9uCQkKLVRIUklGVC0xMjM2ICAgRXJsYW5nICAgICAgICAgICAgICAgRXJsYW5nIFJlY29ubmVjdGluZyBUaHJpZnQgQ2xpZW50CQkKLVRIUklGVC0xMTUxICAgRXJsYW5nICAgICAgICAgICAgICAgUHJvZHVjZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIG9uIHNlcmlhbGl6YXRpb24KLVRIUklGVC0xMTQ2ICAgSmF2YSAgICAgICAgICAgICAgICAgQW5kcm9pZCBJbmNvbXBhdGliaWxpdHk6IEFuZHJvaWQgPCAyLjMgamF2YS5pby5JT0V4Y2VwdGlvbiBkb2Vzbid0IHN1cHBvcnQgZm9yIFRocm93YWJsZSAKLVRIUklGVC04MjYgICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIFRTb2NrZXQgV3JpdGUgVGltZW91dAkJCi1USFJJRlQtMjcgICAgIEVybGFuZyAgICAgICAgICAgICAgIEdlbmVyYXRlZCBlcmxhbmcgdHlwZXMgZG9uJ3QgY29udGFpbiBkZWZhdWx0IHZhbHVlcyBmb3IgcmVjb3JkcwkJCi1USFJJRlQtMTE1MyAgIEMrKyAgICAgICAgICAgICAgICAgIEh0dHBDbGllbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBjbG9zZSBwYXJhbWV0ZXIJCQotVEhSSUZULTExNTQgICBDb2NvYSAgICAgICAgICAgICAgICBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCQkKLVRIUklGVC0xMDgxICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIHRlc3RzIGJyb2tlbiBhbmQgc29tZXdoYXQgaW5jb21wbGV0ZQkJCi1USFJJRlQtMTA3OCAgIFRlc3QgU3VpdGUgICAgICAgICAgIFRocmlmdFRlc3QudGhyaWZ0IGdlbmVyYXRlcyBpbnZhbGlkIFBIUCBsaWJyYXJ5CQkKLVRIUklGVC00NDcgICAgSmF2YSAgICAgICAgICAgICAgICAgTWFrZSBhbiBhYnN0cmFjdCBiYXNlIENsaWVudCBjbGFzcyBzbyB3ZSBjYW4gZ2VuZXJhdGUgbGVzcyBjb2RlCQkKLVRIUklGVC0xMTgxICAgQVMzICAgICAgICAgICAgICAgICAgQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyBpbmNvcnJlY3QgY29kZSBmb3Igc2V0dGluZyBkZWZhdWx0IHZhbHVlcyBpbiBjb25zdHJ1Y3RvcgkJCi1USFJJRlQtOTk3ICAgIEphdmEgICAgICAgICAgICAgICAgIFVzaW5nIHZhbHVlT2YgZm9yIGJhc2UgdHlwZXMgaW4gZ2V0RmllbGRWYWx1ZQkJCi1USFJJRlQtOTk5ICAgIFBIUCAgICAgICAgICAgICAgICAgIEFkZCBURm9ya2luZ1NlcnZlcgkJCi1USFJJRlQtMTA0MSAgIEphdmEgICAgICAgICAgICAgICAgIFREZXNlcmlhbGl6ZXIgaG9sZHMgb250byBhIHJlZmVyZW5jZSBvZiB0aGUgYXJyYXkgaXQgcmVhZHMgYWZ0ZXIgaXQgaXMgZG9uZSBkZXNlcmlhbGl6aW5nCi1USFJJRlQtMTA2NSAgIEphdmFTY3JpcHQgICAgICAgICAgIFVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBub3QgcHJvcGVyIGhhbmRsZWQgb24gSlMJCQotVEhSSUZULTk5MyAgICBDKysgICAgICAgICAgICAgICAgICBTb21lIGltcHJvdmVtZW50cyBpbiBDKysgc3R1YnMgZm9yIG9uZXdheSBvcGVyYXRpb25zCQkKLVRIUklGVC0xMDgzICAgUHl0aG9uICAgICAgICAgICAgICAgUHJlZm9ya2luZyBweXRob24gcHJvY2VzcyBwb29sIHNlcnZlcgkJCi1USFJJRlQtMTA5MiAgIFB5dGhvbiAgICAgICAgICAgICAgIGdlbmVyYXRlZCB2YWxpZGF0ZSgpIG1ldGhvZCBoYXMgd3JvbmcgaW5kZW50YXRpb24JCQotVEhSSUZULTEwNTAgICBKYXZhICAgICAgICAgICAgICAgICAiRGVjbGFyaW5nIGFuIGFyZ3VtZW50IG5hbWVkICIibWFuYWdlciIiIHRvIGEgc2VydmljZSBtZXRob2QgcHJvZHVjZXMgY29kZSB0aGF0IGZhaWxzIGNvbXBpbGUgCi1USFJJRlQtMTEwNiAgIEMrKyAgICAgICAgICAgICAgICAgIEMrKyBjb2RlIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggJiBUQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBkb250IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMgCi1USFJJRlQtMTA4MCAgIEVybGFuZyAgICAgICAgICAgICAgIGVybGFuZyB0ZXN0J3MgJ21ha2UnIGZhaWxzIG9uIE1hYyBPU1gJCQotVEhSSUZULTczMSAgICBKYXZhICAgICAgICAgICAgICAgICBjb25maWd1cmUgZG9lc24ndCBjaGVjayBmb3IgYW50ID49IDEuNwkJCi1USFJJRlQtMTE4MCAgIEFTMyAgICAgICAgICAgICAgICAgIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgdW5jb21waWxhYmxlIGNvZGUgZm9yIGJpbmFyeSB0eXBlcy4JCQotVEhSSUZULTExODcgICBSdWJ5ICAgICAgICAgICAgICAgICBub25ibG9ja2luZ19zZXJ2ZXIgc2h1dGRvd24gcmFjZSB1bmRlciBSdWJ5IDEuOQkJCi1USFJJRlQtMTE5MyAgIFJ1YnkgICAgICAgICAgICAgICAgIFBvdGVudGlhbCBpbmZpbml0ZSBsb29wIGluIG5vbmJsb2NraW5nX3NlcnZlcgkJCi1USFJJRlQtODkxICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIENvbW1lbnRzIGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZCBpbiBzb21lIGNhc2VzCQkKLVRIUklGVC0xMjE2ICAgSmF2YSAgICAgICAgICAgICAgICAgYnVpbGQgSmF2YSBMaWJyYXJ5IGJlaGluZCBhIHByb3h5CQkKLVRIUklGVC0xMTc3ICAgR28gICAgICAgICAgICAgICAgICAgVXBkYXRlIHRocmlmdCB0byByZWZsZWN0IGNoYW5nZXMgaW4gR28ncyBuZXR3b3JraW5nIGxpYnJhcmllcwkJCi1USFJJRlQtMTIyMCAgIEMrKyAgICAgICAgICAgICAgICAgIFRQcm9jZXNzb3I6OnByb2Nlc3MgbmV2ZXIgcmV0dXJucyBmYWxzZQkJCi1USFJJRlQtMTIzMSAgIEMrKyAgICAgICAgICAgICAgICAgIFJlbW92ZSBib2d1cyBpbmNsdWRlCQkKLVRIUklGVC0xMjE3ICAgQysrICAgICAgICAgICAgICAgICAgVXNlIGV2dXRpbF9zb2NrZXRwYWlyIGluc3RlYWQgb2YgcGlwZSAoV2luZG93cyBwb3J0KQkJCi1USFJJRlQtMTIxNSAgIEphdmFTY3JpcHQgICAgICAgICAgIFVuZGVmaW5lZCBwcm9wZXJ0eSBUaGlyZnQgaW4gbGliL2pzL3RocmlmdC5qcwkJCi1USFJJRlQtNDE4ICAgIFJ1YnkgICAgICAgICAgICAgICAgIERvbid0IGRvIHJ1bnRpbWUgc29ydGluZyBvZiBzdHJ1Y3QgZmllbGRzCQkKLVRIUklGVC0xMjQ0ICAgQysrICAgICAgICAgICAgICAgICAgJ3VzaW5nJyB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBmdW5jdGlvbnMgaW4gZGlmZmVyZW50IGJhc2VzIGRvZXMgbm90IGNvbmZvcm0gdG8gQysrIHN0YW5kYXJkCi1USFJJRlQtODkyICAgIEVybGFuZyAgICAgICAgICAgICAgIFJlZmFjdG9yIGVybGFuZyBidWlsZCBzeXN0ZW0gd2l0aCByZWJhcgkJCi1USFJJRlQtNjkwICAgIENvbXBpbGVyIChHZW5lcmFsKSAgIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMJCQotVEhSSUZULTExOTkgICBKYXZhICAgICAgICAgICAgICAgICBVbmlvbiBzdHJ1Y3RzIHNob3VsZCBoYXZlIGdlbmVyYXRlZCBtZXRob2RzIHRvIHRlc3Qgd2hldGhlciBhIHNwZWNpZmljIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQJCQotVEhSSUZULTExMyAgICBDb21waWxlciAoR2VuZXJhbCkgICB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAkJCi1USFJJRlQtMTA0OSAgIFB5dGhvbiAgICAgICAgICAgICAgIEFsbG93IGZvciBUU2VydmVyU29ja2V0IHB5dGhvbiBsaWJyYXJ5IHRvIGJpbmQgdG8gYSBzcGVjaWZpYyBob3N0CQkKLVRIUklGVC0xMTUyICAgUEhQICAgICAgICAgICAgICAgICAgVEhSSUZULTExNDQgQXR0cmlidXRlcyBmcm9tIHByaXZhdGUgdG8gcHJvdGVjdGVkCQkKLVRIUklGVC0xMjA3ICAgUnVieSAgICAgICAgICAgICAgICAgIlN1cHBvcnQgREVTVERJUiBvbiAiIm1ha2UgaW5zdGFsbCIiIG9mIHJ1YnkgbGlicyIJCQotVEhSSUZULTExMjMgICBDKysgICAgICAgICAgICAgICAgICBQYXRjaCB0byBjb21waWxlIFRocmlmdCBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAJCQotVEhSSUZULTEwMzEgICBDKysgICAgICAgICAgICAgICAgICBQYXRjaCB0byBjb21waWxlIFRocmlmdCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAJCQotVEhSSUZULTEyMjEgICBDKysgICAgICAgICAgICAgICAgICBSZW1vdmUgU2ltcGxlQ2FsbGJhY2suaAkJCi1USFJJRlQtMTIzMyAgIEMrKyAgICAgICAgICAgICAgICAgIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUJCQotVEhSSUZULTEyNDYgICBKYXZhICAgICAgICAgICAgICAgICBJbXByb3ZlIGxvZ2dpbmc6IENoYW5nZSBUTm9uYmxvY2tpbmdTZXJ2ZXIgaW50ZXJuYWxSZWFkIHRvIHRyYWNlIGZyb20gd2FybgkJCi1USFJJRlQtMTI1MSAgIEphdmEgICAgICAgICAgICAgICAgIEdlbmVyYXRlZCBqYXZhIGNvZGUgc2hvdWxkIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbAorVGhyaWZ0IDAuOS4yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTI3OTNdIC0gR28gY29tcGlsZXIgcHJvZHVjZXMgdW5jb21waWxhYmxlIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ4MV0gLSBVbml4IGRvbWFpbiBzb2NrZXRzIGluIEMrKyBkbyBub3Qgc3VwcG9ydCB0aGUgYWJzdHJhY3QgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTE0NTVdIC0gVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJpbmcgY2FzdHMgZnJvbSBzaXplX3QgdG8gdWludDMyX3QsIHdoaWNoIGlzIG5vdCBzYWZlIG9uIDY0LWJpdCBwbGF0Zm9ybXMKKyAgICAqIFtUSFJJRlQtMTU3OV0gLSBQSFAgRXh0ZW50aW9uIC0gZnVuY3Rpb24gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IG5vdCB3b3JraW5nIGZyb20gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplCisgICAgKiBbVEhSSUZULTE1ODRdIC0gRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wgb24gc2luZ2xlLWNvcmUgbWFjaGluZXMKKyAgICAqIFtUSFJJRlQtMTYxNF0gLSBUaHJpZnQgYnVpbGQgZnJvbSBzdm4gcmVwbyBzb3VyY2VzIGZhaWxzIHdpdGggYXV0b21ha2UtMS4xMgorICAgICogW1RIUklGVC0xMDQ3XSAtIHJiX3RocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIHRyZWF0cyBhcmcgYXMgc3RyaW5nIHdpdGhvdXQgY2hlY2ssIHNlZ2ZhdWx0cyBpZiB5b3UgcGFzcyBub24tc3RyaW5nCisgICAgKiBbVEhSSUZULTE2MzldIC0gSmF2YS9QeXRob246IFNlcmlhbGl6YXRpb24vRGVzZXJpYWxpemF0aW9uIG9mIGRvdWJsZSB0eXBlIHVzaW5nIENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0xNjQ3XSAtIE5vZGVKUyBCdWZmZXJlZFRyYW5zcG9ydCBkb2VzIG5vdCB3b3JrIGJleW9uZCB0aGUgaGVsbG8td29ybGQgZXhhbXBsZQorICAgICogW1RIUklGVC0yMTMwXSAtIFRocmlmdCdzIEQgbGlicmFyeS90ZXN0OiBwYXJ0cyBvZiAibWFrZSBjaGVjayIgY29kZSBkbyBub3QgY29tcGlsZSB3aXRoIHJlY2VudCBkbWQtMi4wNjIgdGhyb3VnaCBkbWQtMi4wNjRhbHBoYQorICAgICogW1RIUklGVC0yMTQwXSAtIEVycm9yIGNvbXBpbGluZyBjcHAgdHV0b3JpYWxzCisgICAgKiBbVEhSSUZULTIxMzldIC0gTVNWQyAyMDEyIEVycm9yIC0gQ2Fubm90IGNvbXBpbGUgZHVlIHRvIEJvb3N0VGhyZWFkRmFjdG9yeQorICAgICogW1RIUklGVC0yMTM4XSAtIHBrZ2NvbmZpZyBmaWxlIGNyZWF0ZWQgd2l0aCB3cm9uZyBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMjE2MF0gLSBXYXJuaW5nIGluIHRocmlmdC5oIHdoZW4gY29tcGlsaW5nIHdpdGggLVd1bnVzZWQgYW5kIE5ERUJVRworICAgICogW1RIUklGVC0yMTU4XSAtIENvbXBhY3QsIEpTT04sIGFuZCBTaW1wbGVKU09OIHByb3RvY29scyBhcmUgbm90IHdvcmtpbmcgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTIxNjddIC0gbm9kZWpzIGxpYiB0aHJvd3MgZXJyb3IgaWYgb3B0aW9ucyBhcmd1bWVudCBpc24ndCBwYXNzZWQKKyAgICAqIFtUSFJJRlQtMjI4OF0gLSBHbyBpbXBsIG9mIFRocmlmdCBKU09OIHByb3RvY29sIHdyb25nbHkgd3JpdGVzL2V4cGVjdHMgdHJ1ZS9mYWxzZSBmb3IgYm9vbHMKKyAgICAqIFtUSFJJRlQtMjE0N10gLSBUaHJpZnQgSURMIGdyYW1tYXIgYWxsb3dzIGZvciBkb3R0ZWQgaWRlbnRpZmllciBuYW1lcworICAgICogW1RIUklGVC0yMTQ1XSAtIFJhY2sgYW5kIFRoaW4gYXJlIG5vdCBqdXN0IGRldmVsb3BtZW50IGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC0yMjY3XSAtIFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSBzb2NrZXQgZmFtaWx5IGluIFB5dGhvbiBUU29ja2V0CisgICAgKiBbVEhSSUZULTIyNzZdIC0gamF2YSBwYXRoIGluIHNwZWMgZmlsZSBuZWVkcyB1cGRhdGluZworICAgICogW1RIUklGVC0yMjgxXSAtIEdlbmVyYXRlZCBzZW5kL3JlY3YgY29kZSBpZ25vcmVzIGVycm9ycyByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyBwcm90b2NvbAorICAgICogW1RIUklGVC0yMjgwXSAtIFRKU09OUHJvdG9jb2wuRmx1c2goKSBkb2VzIG5vdCByZWFsbHkgZmx1c2ggdGhlIHRyYW5zcG9ydAorICAgICogW1RIUklGVC0yMjc0XSAtIFROb25ibG9ja2luZ1NlcnZlciBhbmQgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIgZG8gbm90IGNsb3NlIHRoZWlyIGNoYW5uZWwgc2VsZWN0b3JzIG9uIGV4aXQgYW5kIGxlYWsgZmlsZSBkZXNjcmlwdG9ycworICAgICogW1RIUklGVC0yMjY1XSAtIHBocCBsaWJyYXJ5IGRvZXNuJ3QgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjIzMl0gLSBJc1NldCogYnJva2VuIGluIEdvCisgICAgKiBbVEhSSUZULTIyNDZdIC0gVW5zZXQgZW51bSB2YWx1ZSBpcyBwcmludGVkIGJ5IFRvU3RyaW5nKCkKKyAgICAqIFtUSFJJRlQtMjI0MF0gLSB0aHJpZnQudmltIChjb250cmliKSBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlICd1bmlvbicKKyAgICAqIFtUSFJJRlQtMjI0M10gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgaW4gdGhyaWZ0IGNyYXNoZXMgd2hlbiBURnJhbWVkVHJhbnNwb3J0IG9wZW5zCisgICAgKiBbVEhSSUZULTIyMzBdIC0gQ2Fubm90IEJ1aWxkIG9uIFJIRUwvQ2VudG9zL0FtYXpvbiBMaW51eCA2LngKKyAgICAqIFtUSFJJRlQtMjI0N10gLSBHbyBnZW5lcmF0b3IgZG9lc24ndCBkZWFsIHdlbGwgd2l0aCBtYXAga2V5cyBvZiB0eXBlIGJpbmFyeQorICAgICogW1RIUklGVC0yMjUzXSAtIFB5dGhvbiBUb3JuYWRvIFRUb3JuYWRvU2VydmVyIGJhc2UgY2xhc3MgY2hhbmdlCisgICAgKiBbVEhSSUZULTIyNjFdIC0gamF2YTogZXJyb3I6IHVubWFwcGFibGUgY2hhcmFjdGVyIGZvciBlbmNvZGluZyBBU0NJSQorICAgICogW1RIUklGVC0yMjU5XSAtIEMjOiB1bmV4cGVjdGVkIG51bGwgbG9nRGVsZWdhdGUoKSBwb2ludGVyIGNhdXNlcyBBViBpbiBUU2VydmVyLnNlcnZlKCkKKyAgICAqIFtUSFJJRlQtMjIyNV0gLSBTU0xDb250ZXh0IGRlc3Ryb3kgYmVmb3JlIGNsZWFudXBPcGVuU1NMCisgICAgKiBbVEhSSUZULTIyMjRdIC0gVFNTTFNvY2tldC5oIGFuZCBUU1NMU2VydmVyU29ja2V0Lmggc2hvdWxkIHVzZSB0aGUgcGxhdGZyb21zb2NrZXQgdG9vCisgICAgKiBbVEhSSUZULTIyMjldIC0gdGhyaWZ0IGZhaWxlZCB0byBidWlsZCBvbiBPU1ggMTAuOSBHTQorICAgICogW1RIUklGVC0yMjI3XSAtIFRocmlmdCBjb21waWxlciBnZW5lcmF0ZXMgc3B1cmlvdXMgd2FybmluZ3Mgd2l0aCBYbGludAorICAgICogW1RIUklGVC0yMjE5XSAtIFRocmlmdCBnZW0gZmFpbHMgdG8gYnVpbGQgb24gT1MgWCBNYXZlcmlja3Mgd2l0aCAxLjkuMyBydWJpZXMKKyAgICAqIFtUSFJJRlQtMjIyNl0gLSBUU2VydmVyU29ja2V0IC0ga2VlcEFsaXZlIHdyb25nIGluaXRpYWxpemF0aW9uIG9yZGVyCisgICAgKiBbVEhSSUZULTIyODVdIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgSmF2YSBkb2Vzbid0IGFsbG93IGEgc2xhc2ggKC8pIHRvIGJlIGVzY2FwZWQgKFwvKQorICAgICogW1RIUklGVC0yMjE2XSAtIEV4dHJhbmVvdXMgc2VtaWNvbG9uIGluIFRQcm90b2NvbFV0aWwuaCBtYWtlcyBjbGFuZyBtYWQKKyAgICAqIFtUSFJJRlQtMjIxNV0gLSBHZW5lcmF0ZWQgSFRNTC9HcmFwaHZpeiBsaXN0cyByZWZlcmVuY2VkIGVudW0gaWRlbnRpZmllcnMgYXMgVU5LTk9XTi4KKyAgICAqIFtUSFJJRlQtMjIxMV0gLSBFeGNlcHRpb24gY29uc3RydWN0b3IgZG9lcyBub3QgY29udGFpbiBuYW1lc3BhY2UgcHJlZml4LgorICAgICogW1RIUklGVC0yMjEwXSAtIGxpYi9qYXZhIFRTaW1wbGVKU09OUHJvdG9jb2wgY2FuIGVtaXQgaW52YWxpZCBKU09OCisgICAgKiBbVEhSSUZULTIyMDldIC0gUnVieSBnZW5lcmF0b3IgLS0gcGxlYXNlIG5hbWVzcGFjZSBjbGFzc2VzCisgICAgKiBbVEhSSUZULTIyMDJdIC0gRGVscGhpIFRTZXJ2ZXJJbXBsLkRlZmF1bHRMb2dEZWxlZ2F0ZSBtYXkgc3RvcCB0aGUgc2VydmVyIHdpdGggSS9PLUVycm9yIDEwNQorICAgICogW1RIUklGVC0yMjAxXSAtIFRlcm5hcnkgb3BlcmF0b3IgcmV0dXJucyBkaWZmZXJlbnQgdHlwZXMgKGJ1aWxkIGVycm9yIGZvciBzb21lIGNvbXBpbGVycykKKyAgICAqIFtUSFJJRlQtMjIwMF0gLSBuZXN0ZWQgc3RydWN0cyBjYXVzZSBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHRvIHNsb3cgZG93biBhdCBleGNlc3NpdmUgQ1BVIGxvYWQKKyAgICAqIFtUSFJJRlQtMjE5N10gLSBmaXggamFyIG91dHB1dCBkaXJlY3RvcnkgaW4gcnBtIHNwZWMgZmlsZQorICAgICogW1RIUklGVC0yMTk2XSAtIEZpeCBpbnZhbGlkIGRlcGVuZGVuY3kgaW4gTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMjE5NF0gLSBOb2RlOiBOb3QgYWN0dWFsbHkgcHJlcGVuZGluZyByZXNpZHVhbCBkYXRhIGluIFRGcmFtZWRUcmFuc3BvcnQucmVjZWl2ZXIKKyAgICAqIFtUSFJJRlQtMjE5M10gLSBKYXZhIGNvZGUgZ2VuZXJhdG9yIGVtaXRzIHNwdXJpb3VzIHNlbWljb2xvbiB3aGVuIGRlZXAgY29weWluZyBiaW5hcnkgZGF0YQorICAgICogW1RIUklGVC0yMTkxXSAtIEZpeCBjaGFycCBKU09OUHJvdG9jb2wuUmVhZEpTT05Eb3VibGUgKHNwZWNpZnkgSW52YXJpYW50Q3VsdHVyZSkKKyAgICAqIFtUSFJJRlQtMjIxNF0gLSBTeXN0ZW0gaGVhZGVyIHN5cy9wYXJhbS5oIGlzIGluY2x1ZGVkIGluc2lkZSB0aGUgVGhyaWZ0IG5hbWVzcGFjZQorICAgICogW1RIUklGVC0yMTc4XSAtIFRocmlmdCBnZW5lcmF0b3IgcmV0dXJucyBlcnJvciBleGl0IGNvZGUgb24gLS12ZXJzaW9uCisgICAgKiBbVEhSSUZULTIxNzFdIC0gTm9kZUpTIGltcGxlbWVudGF0aW9uIGhhcyBleHRyZW1lbHkgbG93IHRlc3QgY292ZXJhZ2UKKyAgICAqIFtUSFJJRlQtMjE4M10gLSBnZW0gaW5zdGFsbCBmYWlscyBvbiB6c2gKKyAgICAqIFtUSFJJRlQtMjE4Ml0gLSBzZWdmYXVsdCBpbiByZWdyZXNzaW9uIHRlc3RzIChHQyBidWcgaW4gcmJfdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUpCisgICAgKiBbVEhSSUZULTIxODFdIC0gb25ld2F5IGNhbGxzIGRvbid0IHdvcmsgaW4gTm9kZUpTCisgICAgKiBbVEhSSUZULTIxNjldIC0gSmF2YU1FIFRocmlmdCBMaWJyYXJ5IGNhdXNlcyAiamF2YS5pby5JT0V4Y2VwdGlvbjogTm8gUmVzcG9uc2UgRW50cmllcyBBdmFpbGFibGUiIGFmdGVyIHVzaW5nIHRoZSBUaHJpZnQgY2xpZW50IGZvciBzb21lIHRpbWUKKyAgICAqIFtUSFJJRlQtMjE2OF0gLSBOb2RlLmpzIGFwcGVhcnMgYnJva2VuIChhdCBsZWFzdCwgZXhhbXBsZXMgZG9uJ3Qgd29yayBhcyBpbnRlbmRlZCkKKyAgICAqIFtUSFJJRlQtMjI5M10gLSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5jcmVhdGVTU0xDb250ZXh0KCkgbGVhdmVzIGZpbGVzIG9wZW4KKyAgICAqIFtUSFJJRlQtMjI3OV0gLSBUU2VyaWFsaXplciBvbmx5IHJldHVybnMgdGhlIGZpcnN0IDEwMjQgYnl0ZXMgc2VyaWFsaXplZAorICAgICogW1RIUklGVC0yMjc4XSAtIEJ1ZmZlcmVkIHRyYW5zcG9ydCBkb2Vzbid0IHN1cHBvcnQgd3JpdGVzID4gYnVmZmVyIHNpemUKKyAgICAqIFtUSFJJRlQtMjI3NV0gLSBGaXggbWVtb3J5IGxlYWsgaW4gZ29sYW5nIGNvbXBhY3RfcHJvdG9jb2wuCisgICAgKiBbVEhSSUZULTIyODJdIC0gSW5jb3JlY3QgY29kZSBnZW5lcmF0ZWQgZm9yIHNvbWUgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMjAwOV0gLSBHbyByZWRlY2xhcmF0aW9uIGVycm9yCisgICAgKiBbVEhSSUZULTE5NjRdIC0gJ0lzc2V0JyBjYXVzZXMgcHJvYmxlbXMgd2l0aCBDIy8uTkVUIHNlcmlhbGl6ZXJzCisgICAgKiBbVEhSSUZULTIwMjZdIC0gRml4IFRDb21wYWN0UHJvdG9jb2wgNjQgYml0IGJ1aWxkcworICAgICogW1RIUklGVC0yMTA4XSAtIEZpeCBUQXN5bmNDbGllbnRNYW5hZ2VyIHRpbWVvdXQgcmFjZQorICAgICogW1RIUklGVC0yMDY4XSAtIE11bHRpcGxlIGNhbGxzIGZyb20gc2FtZSBjb25uZWN0aW9uIGFyZSBub3QgcHJvY2Vzc2VkIGluIG5vZGUKKyAgICAqIFtUSFJJRlQtMTc1MF0gLSBNYWtlIGNvbXBpbGVyIGJ1aWxkIGNsZWFubHkgdW5kZXIgdmlzdWFsIHN0dWRpbyAxMAorICAgICogW1RIUklGVC0xNzU1XSAtIENvbW1lbnQgcGFyc2luZyBidWcKKyAgICAqIFtUSFJJRlQtMTc3MV0gLSAibWFrZSBjaGVjayIgZmFpbHMgb24geDY0IGZvciBsaWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgICAqIFtUSFJJRlQtMTg0MV0gLSBOb2RlSlMgVGhyaWZ0IGluY29ycmVjdGx5IHBhcnNlcyBub24tVVRGOC1zdHJpbmcgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTkwOF0gLSBVc2luZyBwaHAgdGhyaWZ0X3Byb3RvY29sIGFjY2VsZXJhdGVkIHRyYW5zZmVyIGNhdXNlcyBjb3JlIGR1bXAKKyAgICAqIFtUSFJJRlQtMTg5Ml0gLSBTb2NrZXQgdGltZW91dHMgYXJlIGRlY2xhcmVkIGluIG1pbGxpLXNlY29uZHMsIGJ1dCBhcmUgYWN0dWFsbHkgc2V0IGluIG1pY3JvLXNlY29uZHMKKyAgICAqIFtUSFJJRlQtMjMwM10gLSBUQnVmZmVycmVkVHJhbnNwb3J0IG5vdCBwcm9wZXJseSBjbG9zaW5nIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIzMTNdIC0gbm9kZWpzIHNlcnZlciBjcmFzaCBhZnRlciBwcm9jZXNzaW5nIHRoZSBmaXJzdCByZXF1ZXN0IHdoZW4gdXNpbmcgTXVsdGlwbGV4ZWRQcm9jZXNzb3IvRnJhbWVkQnVmZmVyL0JpbmFyeVByb3RvY29sCisgICAgKiBbVEhSSUZULTIzMTFdIC0gR286IGludmFsaWQgY29kZSBnZW5lcmF0ZWQgd2hlbiBleGNlcHRpb24gbmFtZSBpcyBhIGdvIGtleXdvcmQKKyAgICAqIFtUSFJJRlQtMjMwOF0gLSBub2RlOiBUSlNPTlByb3RvY29sIHBhcnNlIGVycm9yIHdoZW4gcmVhZGluZyBmcm9tIGJ1ZmZlcmVkIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMjMxNl0gLSBjY3A6IFRGaWxlVHJhbnNwb3J0VGVzdAorICAgICogW1RIUklGVC0yMzUyXSAtIG1zdmMgZmFpbGVkIHRvIGNvbXBpbGUgdGhyaWZ0IHRlc3RzCisgICAgKiBbVEhSSUZULTIzMzddIC0gR29sYW5nIGRvZXMgbm90IHJlcG9ydCBUSU1FRF9PVVQgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yMzQwXSAtIEdlbmVyYXRlZCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2VuZCByZXNwb25zZSB0eXBlIEVYQ0VQVElPTiBvbiB0aGUgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuVU5LTk9XTl9NRVRIT0QgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTIzNTRdIC0gQ29ubmVjdGlvbiBlcnJvcnMgY2FuIGxlYWQgdG8gY2FzZV9jbGF1c2UgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0yMzM5XSAtIFVuY2F1Z2h0IGV4Y2VwdGlvbiBpbiB0aHJpZnQgYyMgZHJpdmVyCisgICAgKiBbVEhSSUZULTIzNTZdIC0gYysrIHRocmlmdCBjbGllbnQgbm90IHdvcmtpbmcgd2l0aCBzc2wgKFNTTF9jb25uZWN0IGhhbmdzKQorICAgICogW1RIUklGVC0yMzMxXSAtIE1pc3NpbmcgY2FsbCB0byBSZWFkU3RydWN0QmVnaW4oKSBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZCgpCisgICAgKiBbVEhSSUZULTIzMjNdIC0gVW5jb21waWxlYWJsZSBEZWxwaGkgY29kZSBnZW5lcmF0ZWQgZm9yIHR5cGVkZWYnZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTIzMjJdIC0gQ29ycmVjdGx5IHNob3cgdGhlIG51bWJlciBvZiB0aW1lcyBFeGVjdXRvclNlcnZpY2UgKGphdmEpIGhhcyByZWplY3RlZCB0aGUgY2xpZW50LgorICAgICogW1RIUklGVC0yMzg5XSAtIG5hbWVzcGFjZXMgaGFuZGxlZCB3cm9uZ2x5IGluIGFjcmlvbnNjcmlwdCAzLjAgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjM4OF0gLSBHb0xhbmcgLSBGaXggZGF0YSByYWNlcyBpbiBzaW1wbGVfc2VydmVyIGFuZCBzZXJ2ZXJfc29ja2V0CisgICAgKiBbVEhSSUZULTIzODZdIC0gVGhyaWZ0IHJlZnVzZXMgdG8gbGluayB5eWxleAorICAgICogW1RIUklGVC0yMzc1XSAtIEV4Y2Vzc2l2ZSA8YnI+J3MgaW4gZ2VuZXJhdGVkIEhUTUwKKyAgICAqIFtUSFJJRlQtMjM3M10gLSB3YXJuaW5nIENTMDQxNCBpbiBUSHR0cENsaWVudC5jczogcHJpdmF0ZSBmaWVsZCAnVGhyaWZ0LlRyYW5zcG9ydC5USHR0cENsaWVudC5jb25uZWN0aW9uJyBhc3NpZ25lZCBidXQgbmV2ZXIgdXNlZAorICAgICogW1RIUklGVC0yMzcyXSAtIHRocmlmdC9qc29uX3Byb3RvY29sLmdvOjE2MDogZnVuY3Rpb24gZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAorICAgICogW1RIUklGVC0yMzcxXSAtIHJ1YnkgYnVuZGxlciB2ZXJzaW9uIGZhaWxzIG9uIH4xLjMuMSwgcmVtb3ZlIGFuZCB0YWtlIGxhdGVzdCBhdmFpbAorICAgICogW1RIUklGVC0yMzcwXSAtIENvbXBpbGVyIFNFR0ZBVUxUcyBnZW5lcmF0aW5nIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgY29tcGxleCBzdHJ1Y3JlCisgICAgKiBbVEhSSUZULTIzODRdIC0gQmluYXJ5IG1hcCBrZXlzIHByb2R1Y2UgdW5jb21waWxhYmxlIGNvZGUgaW4gZ28KKyAgICAqIFtUSFJJRlQtMjM4MF0gLSB1bnJlYWNoYWJsZSBjb2RlIChDSUQgMTE3NDU0NiwgQ0lEIDExNzQ2NzkpCisgICAgKiBbVEhSSUZULTIzNzhdIC0gc2VydmljZSBtZXRob2QgYXJndW1lbnRzIG9mIGJpbmFyeSB0eXBlIGxlYWQgdG8gdW5jb21waWxlYWJsZSBHbyBjb2RlCisgICAgKiBbVEhSSUZULTIzNjNdIC0gSXNzdWUgd2l0aCBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgU3VjY2VzcyByZXR1cm5lZCBmcm9tIExvZ2luIHVzaW5nIFRocmlmdCBQcm94eSBhbmQgTm9kZUpTCisgICAgKiBbVEhSSUZULTIzNTldIC0gVEJ1ZmZlcmVkVHJhbnNwb3J0IGRvZXNuJ3QgY2xlYXIgaXQncyBidWZmZXIgb24gYSBmYWlsZWQgZmx1c2ggY2FsbAorICAgICogW1RIUklGVC0yNDI4XSAtIFB5dGhvbiAzIHNldHVwLnB5IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjM2N10gLSBCdWlsZCBmYWlsdXJlOiBzdGRsaWIgYW5kIGJvb3N0IGJvdGggZGVmaW5lIHVpbnQ2NF90CisgICAgKiBbVEhSSUZULTIzNjVdIC0gQyMgZGVjb2RlcyB0b28gbWFueSBiaW5hcnkgYnl0ZXMgZnJvbSBKU09OCisgICAgKiBbVEhSSUZULTI0MDJdIC0gYnl0ZSBjb3VudCBvZiBGcmFtZUJ1ZmZlciBpbiBBV0FJVElOR19DTE9TRSBzdGF0ZSBpcyBub3Qgc3VidHJhY3RlZCBmcm9tIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZAorICAgICogW1RIUklGVC0yMzk2XSAtIEJ1aWxkIEVycm9yIG9uIE1hY09TWAorICAgICogW1RIUklGVC0yMzk1XSAtIHRocmlmdCBSdWJ5IGdlbSByZXF1aXJlcyBkZXZlbG9wbWVudCBkZXBlbmRlbmN5ICd0aGluJyByZWdhcmRsZXNzIG9mIGVudmlyb25tZW50CisgICAgKiBbVEhSSUZULTI0MTRdIC0gY19nbGliIGZpeCBzZXZlcmFsIGJ1Zy4KKyAgICAqIFtUSFJJRlQtMjQyMF0gLSBHbyBhcmd1bWVudCBwYXJzZXIgZm9yIG1ldGhvZHMgd2l0aG91dCBhcmd1bWVudHMgZG9lcyBub3Qgc2tpcCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMjQzOV0gLSBCdWcgaW4gVFByb3RvY29sRGVjb3JhdG9yIENsYXNzIGNhdXNlcyBwYXJzaW5nIGVycm9ycworICAgICogW1RIUklGVC0yNDE5XSAtIGdvbGFuZyAtIEZpeCBmbXQuRXJyb3JmIGluIGdlbmVyYXRlZCBjb2RlCisgICAgKiBbVEhSSUZULTI0MThdIC0gR28gaGFuZGxlciBmdW5jdGlvbiBwYW5pY3Mgb24gaW50ZXJuYWwgZXJyb3IKKyAgICAqIFtUSFJJRlQtMjQwNV0gLSBOb2RlLmpzIE11bHRpcGxleGVyIHRlc3RzIGZhaWwgKHNpbGVudGx5KQorICAgICogW1RIUklGVC0yNTgxXSAtIFRGRFRyYW5zcG9ydCBkZXN0cnVjdG9yIHNob3VsZCBub3QgdGhyb3cKKyAgICAqIFtUSFJJRlQtMjU3NV0gLSBUaHJpZnQgaW5jbHVkZXMgc2lnaW5mb190IHdpdGhpbiBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTI1NzddIC0gVEZpbGVUcmFuc3BvcnQgIG1pc3N1c2Ugb2YgY2xvc2Vzb2NrZXQgb24gd2luZG93cyBwbGF0Zm9ybQorICAgICogW1RIUklGVC0yNTc2XSAtIEltcGxlbWVudCBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLnNraXAgbWV0aG9kIGluIEphdmFTY3JpcHQgbGlicmFyeQorICAgICogW1RIUklGVC0yNTg4XSAtIFRocmlmdCBjb21waWxlciBpcyBub3QgYnVpbGRhYmxlIGluIFZpc3VhbCBTdHVkaW8gMjAxMAorICAgICogW1RIUklGVC0yNTk0XSAtIEpTIENvbXBpbGVyOiBTaW5nbGUgcXVvdGVzIGFyZSBub3QgYmVpbmcgZXNjYXBlZCBpbiBjb25zdGFudHMuCisgICAgKiBbVEhSSUZULTI1OTFdIC0gVEZyYW1lZFRyYW5zcG9ydCBkb2VzIG5vdCBoYW5kbGUgcGF5bG9hZHMgc3BsaXQgYWNyb3NzIHBhY2tldHMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTI1OTldIC0gVW5jb21waWxlYWJsZSBEZWxwaGkgY29kZSBkdWUgdG8gbmFtaW5nIGNvbmZsaWN0cyB3aXRoIElETAorICAgICogW1RIUklGVC0yNTkwXSAtIEMrKyBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGRvZXNuJ3QgaW5jbHVkZSBNdWx0aXBsZXhpbmcgc3VwcG9ydAorICAgICogW1RIUklGVC0yNTk1XSAtIE5vZGUuanM6IEZpeCBnbG9iYWwgbGVha3MgYW5kIGNvcHktcGFzdGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTI1NjVdIC0gYXV0b2NvbmYgZmFpbHMgdG8gZmluZCBtaW5ndy1nKysgY3Jvc3MgY29tcGlsZXIgb24gdHJhdmlzIENJCisgICAgKiBbVEhSSUZULTI1NTVdIC0gZXhjZXNzaXZlICJ1bnVzZWQgZmllbGQiIGNvbW1lbnRzCisgICAgKiBbVEhSSUZULTI1NTRdIC0gZG91YmxlIGluaXRpYWxpemF0aW9uIGluIGdlbmVyYXRlZCBSZWFkKCkgbWV0aG9kCisgICAgKiBbVEhSSUZULTI1NTFdIC0gT3V0T2ZNZW1vcnlFcnJvciAidW5hYmxlIHRvIGNyZWF0ZSBuZXcgbmF0aXZlIHRocmVhZCIga2lsbHMgc2VydmUgdGhyZWFkCisgICAgKiBbVEhSSUZULTI1NDNdIC0gR2VuZXJhdGVkIGVudW0gdHlwZSBpbiBoYXNrZWxsIHNob3VsZCBiZSBxdWFsaWZpZWQKKyAgICAqIFtUSFJJRlQtMjU2MF0gLSBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdG9yIHRyaWVzIHRvIGNvbmNhdCBpbnRzIHdpdGggc3RyaW5ncyB1c2luZyArCisgICAgKiBbVEhSSUZULTI1NTldIC0gQ2VudG9zIDYuNSB1bmFibGUgdG8gIm1ha2UiIHdpdGggVGhyaWZ0IDAuOS4xCisgICAgKiBbVEhSSUZULTI1MjZdIC0gQXNzaWdubWVudCBvcGVyYXRvcnMgYW5kIGNvcHkgY29uc3RydWN0b3JzIGluIGMrKyBkb24ndCBjb3B5IHRoZSBfX2lzc2V0IHN0cnVjdAorICAgICogW1RIUklGVC0yNDU0XSAtIGNfZ2xpYjogVGhlcmUgaXMgbm8gZ2V0aG9zdGJ5bmFtZV9yKCkgaW4gc29tZSBPUy4KKyAgICAqIFtUSFJJRlQtMjQ1MV0gLSBEbyBub3QgdXNlIHBvaW50ZXJzIGZvciBvcHRpb25hbCBmaWVsZHMgd2l0aCBkZWZhdWx0cy4gRG8gbm90IHdyaXRlIHN1Y2ggZmllbGRzIGlmIGl0cyB2YWx1ZSBzZXQgdG8gZGVmYXVsdC4gQWxzbywgZG8gbm90IHVzZSBwb2ludGVycyBmb3IgYW55IG9wdGlvbmFsIGZpZWxkcyBtYXBwZWQgdG8gZ28gbWFwIG9yIHNsaWNlLiBnZW5lcmF0ZSBHZXQgYWNjZXNzb3JzCisgICAgKiBbVEhSSUZULTI0NTBdIC0gaW5jbHVkZSBIb3dUb0NvbnRyaWJ1dGUgaW4gdGhlIHNyYyByZXBvCisgICAgKiBbVEhSSUZULTI0NDhdIC0gdGhyaWZ0L3Rlc3QvdGVzdC5zaCBoYXMgaW5jb3JyZWN0IE5vZGUuanMgdGVzdCBwYXRoCisgICAgKiBbVEhSSUZULTI0NjBdIC0gdW5vcGVuZWQgc29ja2V0IGZkIG11c3QgYmUgbGVzcyB0aGFuIHplcm8uCisgICAgKiBbVEhSSUZULTI0NTldIC0gLS12ZXJzaW9uIHNob3VsZCBub3QgZXhpdCAxCisgICAgKiBbVEhSSUZULTI0NjhdIC0gVGltZXN0YW1wIGhhbmRsaW5nCisgICAgKiBbVEhSSUZULTI0NjddIC0gVW5hYmxlIHRvIGJ1aWxkIGNvbnRyaWIvZmIzMDMgb24gT1NYIDEwLjkuMgorICAgICogW1RIUklGVC0yNDY2XSAtIEltcHJvcGVyIGVycm9yIGhhbmRsaW5nIGZvciBTU0wvVExTIGNvbm5lY3Rpb25zIHRoYXQgZG9uJ3QgY29tcGxldGUgYSBoYW5kc2hha2UKKyAgICAqIFtUSFJJRlQtMjQ2M10gLSB0ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weSBmYWlscyBzb21ldGltZXMKKyAgICAqIFtUSFJJRlQtMjQ1OF0gLSBHZW5lcmF0ZWQgZ29sYW5nIHNlcnZlciBjb2RlIGZvciAib25ld2F5IiBtZXRob2RzIGlzIGluY29ycmVjdAorICAgICogW1RIUklGVC0yNDU2XSAtIFRIdHRwQ2xpZW50IGZhaWxzIHdoZW4gdXNpbmcgYXN5bmMgc3VwcG9ydCBvdXRzaWRlIFNpbHZlcmxpZ2h0CisgICAgKiBbVEhSSUZULTI1MjRdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGlzIG1pc3NpbmcgVFRocmVhZGVkU2VydmVyIGZpbGVzCisgICAgKiBbVEhSSUZULTI1MjNdIC0gVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGlzIG1pc3NpbmcgT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgZmlsZXMKKyAgICAqIFtUSFJJRlQtMjUyMF0gLSBjcHA6Y29iX3N0eWxlIGdlbmVyYXRlcyBpbmNvcnJlY3QgLnRjYyBmaWxlCisgICAgKiBbVEhSSUZULTI1MDhdIC0gVW5jb21waWxlYWJsZSBDIyBjb2RlIGR1ZSB0byBsYW5ndWFnZSBrZXl3b3JkcyBpbiBJREwKKyAgICAqIFtUSFJJRlQtMjUwNl0gLSBVcGRhdGUgVFByb3RvY29sRXhjZXB0aW9uIGVycm9yIGNvZGVzIHRvIGJlIHVzZWQgY29uc2lzdGVudGx5IHRocm91Z2hvdXQgdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjUwNV0gLSBnbzogc3RydWN0IHNob3VsZCBhbHdheXMgYmUgYSBwb2ludGVyIHRvIGF2b2lkIGNvcHlpbmcgb2YgcG90ZW50aWFsbHkgc2l6ZS11bmJvdW5kZWQgc3RydWN0cworICAgICogW1RIUklGVC0yNTE1XSAtIFRMUyBNZXRob2QgZXJyb3IgZHVyaW5nIG1ha2UKKyAgICAqIFtUSFJJRlQtMjUwM10gLSBDKys6IEZpeCBuYW1lIGNvbGxpc2lvbiB3aGVuIGEgc3RydWN0IGhhcyBhIG1lbWJlciBuYW1lZCAidmFsIgorICAgICogW1RIUklGVC0yNDc3XSAtIHRocmlmdCAtLWhlbHAgdGV4dCB3aXRoIG1pc3BsYWNlZCBjb21tYQorICAgICogW1RIUklGVC0yNDkyXSAtIHRlc3QvY3BwIGRvZXMgbm90IGNvbXBpbGUgb24gbWFjCisgICAgKiBbVEhSSUZULTI1MDBdIC0gc2VuZGluZyByYW5kb20gZGF0YSBjcmFzaGVzIHRocmlmdChnb2xhbmcpIHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMjQ3NV0gLSBjX2dsaWI6IGJ1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSBmdW5jdGlvbiByZXR1cm4gYWx3YXlzIFRSVUUuCisgICAgKiBbVEhSSUZULTI0OTVdIC0gSmF2YVNjcmlwdC9Ob2RlIHN0cmluZyBjb25zdGFudHMgbGFjayBwcm9wZXIgZXNjYXBpbmcKKyAgICAqIFtUSFJJRlQtMjQ5MV0gLSB1bmFibGUgdG8gaW1wb3J0IGdlbmVyYXRlZCBUaHJpZnRUZXN0IHNlcnZpY2UKKyAgICAqIFtUSFJJRlQtMjQ5MF0gLSBjX2dsaWI6IGlmIGZhaWwgdG8gcmVhZCBhIGV4Y2VwdGlvbiBmcm9tIHNlcnZlciwgY2xpZW50IG1heSBiZSBvY2N1cnJlZCBkb3VibGUgZnJlZQorICAgICogW1RIUklGVC0yNDcwXSAtIFRIdHRwSGFuZGxlciBzd2FsbG93cyBleGNlcHRpb25zIGZyb20gcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTI1MzNdIC0gQm9vc3QgdmVyc2lvbiBpbiByZXF1aXJlbWVudHMgc2hvdWxkIGJlIHVwZGF0ZWQKKyAgICAqIFtUSFJJRlQtMjUzMl0gLSBKYXZhIHZlcnNpb24gaW4gaW5zdGFsbGF0aW9uIHJlcXVpcmVtZW50cyBzaG91bGQgYmUgdXBkYXRlZAorICAgICogW1RIUklGVC0yNTI5XSAtIFRCdWZmZXJlZFRyYW5zcG9ydCBzcGxpdCAgVGNwIGRhdGEgYnVnIGluIG5vZGVKcworICAgICogW1RIUklGVC0yNTM3XSAtIFBhdGggZm9yICJnbyBnZXQiIGRvZXMgbm90IHdvcmsgKHB1bGwgcmVxdWVzdCAxMTUpCisgICAgKiBbVEhSSUZULTI0NDNdIC0gTm9kZSBmYWlscyBjcm9zcyBsYW5nIHRlc3RzCisgICAgKiBbVEhSSUZULTI0MzddIC0gQXV0aG9yIGZpZWxkcyBpbiBQeXRob24gc2V0dXAucHkgbXVzdCBiZSBzdHJpbmdzIG5vdCBsaXN0cy4KKyAgICAqIFtUSFJJRlQtMjQzNV0gLSBKYXZhIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBzdHJ1Y3QgbWVtYmVyIG5hbWVzIHRoYXQgYXJlIGlkZW50aWNhbCB0byBhbiBleGlzdGluZyBlbnVtIG9yIHN0cnVjdCB0eXBlCisgICAgKiBbVEhSSUZULTI0MzRdIC0gTWlzc2luZyBuYW1lc3BhY2UgaW1wb3J0IGZvciBwaHAgVE11bHRpcGxleGVkUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTI0MzJdIC0gRmxha3kgcGFyYWxsZWwgYnVpbGQKKyAgICAqIFtUSFJJRlQtMjQzMF0gLSBDcmFzaCBkdXJpbmcgVFRocmVhZFBvb2xTZXJ2ZXIgc2h1dGRvd24KKyAgICAqIFtUSFJJRlQtNjY3XSAtIFBlcmlvZCBzaG91bGQgbm90IGJlIGFsbG93ZWQgaW4gaWRlbnRpZmllciBuYW1lcworICAgICogW1RIUklGVC0xMjEyXSAtIE1lbWJlcnMgY2FwaXRhbCBjYXNlIGNvbmZsaWN0CisgICAgKiBbVEhSSUZULTI1ODRdIC0gRXJyb3IgaGFuZGxlciBub3QgbGlzdGVuZWQgb24gamF2YXNjcmlwdCBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjI5NF0gLSBJbmNvcnJlY3QgTWFrZWZpbGUgZ2VuZXJhdGlvbgorICAgICogW1RIUklGVC0yNjAxXSAtIEZpeCB2YWdyYW50IHRvIHdvcmsgYWdhaW4gZm9yIGJ1aWxkcyBhZ2FpbgorICAgICogW1RIUklGVC0yMDkyXSAtIFROb25ibG9ja2luZyBzZXJ2ZXIgc2hvdWxkIHJlbGVhc2UgaGFuZGxlciBhcyBzb29uIGFzIGNvbm5lY3Rpb24gY2xvc2VzCisgICAgKiBbVEhSSUZULTI1NTddIC0gQ1MwNTQyIG1lbWJlciBuYW1lcyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgdGhlaXIgZW5jbG9zaW5nIHR5cGUKKyAgICAqIFtUSFJJRlQtMjYwNV0gLSBUU29ja2V0IHdhcm5pbmcgb24gZ2NjIDQuOC4zCisgICAgKiBbVEhSSUZULTI2MDddIC0gVGhyZWFkTWFuYWdlci5jcHAgd2FybmluZyBvbiBjbGFuZysrIDMuNAorICAgICogW1RIUklGVC0xOTk4XSAtIFRDb21wYWN0UHJvdG9jb2wudGNjIC0gb25lIG1vcmUgd2FybmluZyBvbiBWaXN1YWwgMjAxMAorICAgICogW1RIUklGVC0yNjEwXSAtIE1TVkMgd2FybmluZyBpbiBUU29ja2V0LmNwcAorICAgICogW1RIUklGVC0yNjE0XSAtIFROb25ibG9ja2luZ1NlcnZlci5jcHAgd2FybmluZ3Mgb24gTVNWQworICAgICogW1RIUklGVC0yNjA4XSAtIFROb25ibG9ja2luZ1NlcnZlci5jcHAgd2FybmluZ3Mgb24gY2xhbmcgMy40CisgICAgKiBbVEhSSUZULTI2MDZdIC0gVGhyZWFkTWFuYWdlci5oIHdhcm5pbmcgaW4gY2xhbmcrKyAzLjQKKyAgICAqIFtUSFJJRlQtMjYwOV0gLSBURmlsZVRyYW5zcG9ydC5oIHVudXNlZCBmaWVsZCB3YXJuaW5nIChjbGFuZyAzLjQpCisgICAgKiBbVEhSSUZULTI0MTZdIC0gQ2Fubm90IHVzZSBUQ29tcGFjdFByb3RvY29sIHdpdGggTVNWQworICAgICogW1RIUklGVC0xODAzXSAtIFJ1YnkgVGhyaWZ0IDAuOS4wIHRyaWVzIHRvIGVuY29kZSBVVUlEIHRvIFVURjggYW5kIGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMjM4NV0gLSBQcm9ibGVtIHdpdGggZ2V0aG9zdGJ5bmFtZTIgZHVyaW5nIG1ha2UgY2hlY2sKKyAgICAqIFtUSFJJRlQtMjI2Ml0gLSB0aHJpZnQgc2VydmVyICdNdXRhdGVSb3cnIG9wZXJhdGlvbiBnaXZlcyBubyBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MgLyBmYWlsdXJlCisgICAgKiBbVEhSSUZULTIwNDhdIC0gUHJlZmVyIGJvb2xlYW4gY29udGV4dCB0byBudWxscHRyX3QgY29udmVyc2lvbgorICAgICogW1RIUklGVC0yNTI4XSAtIFRocmlmdCBFcmxhbmcgTGlicmFyeTogTXVsdGlwbGUgdGhyaWZ0IGFwcGxpY2F0aW9ucyBpbiBvbmUgYnVuZGxlCisgICAgKiBbVEhSSUZULTE5OTldIC0gd2FybmluZyBvbiBnY2MgNC43IHdoaWxlIGNvbXBpbGluZyBCb29zdE11dGV4LmNwcAorICAgICogW1RIUklGVC0yMTA0XSAtIFN0cnVjdHMgbG9zZSBiaW5hcnkgZGF0YSB3aGVuIHRyYW5zZmVycmVkIGZyb20gc2VydmVyIHRvIGNsaWVudCBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIxODRdIC0gdW5kZWZpbmVkIG1ldGhvZCByc3BlY192ZXJpZnkgZm9yIFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTIzNTFdIC0gUEhQIFRDb21wYWN0UHJvdG9jb2wgaGFzIGZhaWxzIHRvIGRlY29kZSBtZXNzYWdlcworICAgICogW1RIUklGVC0yMDE2XSAtIFJlc291cmNlIExlYWsgaW4gdGhyaWZ0IHN0cnVjdCB1bmRlciBjb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaAorICAgICogW1RIUklGVC0yMjczXSAtIFBsZWFzZSBkZWxldGUgb2xkIHJlbGVhc2VzIGZyb20gbWlycm9yaW5nIHN5c3RlbQorICAgICogW1RIUklGVC0yMjcwXSAtIEZhdWx0eSBsaWJyYXJ5IHZlcnNpb24gbnVtYmVyaW5nIGF0IGJ1aWxkIG9yIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjIwM10gLSBUZXN0cyBrZWVwaW5nIGZhaWxpbmcgb24gSmVua2lucyBhbmQgVHJhdmlzIENJCisgICAgKiBbVEhSSUZULTIzOTldIC0gdGhyaWZ0LmVsOiByZWNvZ25pemUgIi8vIi1zdHlsZSBjb21tZW50cyBpbiBlbWFjcyB0aHJpZnQtbW9kZQorICAgICogW1RIUklGVC0yNTgyXSAtICJGaWxlVHJhbnNwb3J0IGVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gdHJ5aW5nIHRvIHVzZSBKYXZhJ3MgVEZpbGVUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTY4Ml0gLSBNdWx0aXBsZSB0aHJlYWQgY2FsbGluZyBhIFNlcnZpY2UgZnVuY3Rpb24gdW5zYWZlbHkgY2F1c2VzIG1lc3NhZ2UgY29ycnVwdGlvbiBhbmQgdGVybWluYXRlcyB3aXRoIEJyb2tlbiBQaXBlCisgICAgKiBbVEhSSUZULTIzNTddIC0gcmVjdXJzZSBvcHRpb24gaGFzIG5vIGVmZmVjdCB3aGVuIGdlbmVyYXRpbmcgcGhwCisgICAgKiBbVEhSSUZULTIyNDhdIC0gR28gZ2VuZXJhdG9yIGRvZXNuJ3QgZGVhbCB3ZWxsIHdpdGggbWFwIGtleXMgb2YgdHlwZSBiaW5hcnkKKyAgICAqIFtUSFJJRlQtMjQyNl0gLSBjbGFyaWZ5IElQIHJpZ2h0cyBhbmQgY29udHJpYnV0aW9ucyBmcm9tIGZidGhyaWZ0CisgICAgKiBbVEhSSUZULTIwNDFdIC0gVE5vbmJsb2NraW5nIHNlcnZlciBjb21waWxhdGlvbiBvbiB3aW5kb3dzIChBUklUSE1FVElDX1JJR0hUX1NISUZUKQorICAgICogW1RIUklGVC0yNDAwXSAtIHRocmlmdC5lbDogcmVjb2duaXplICIvLyItc3R5bGUgY29tbWVudHMgaW4gZW1hY3MgdGhyaWZ0LW1vZGUKKyAgICAqIFtUSFJJRlQtMTcxN10gLSBGaXggZGViIGJ1aWxkIGluIGplbmtpbnMKKyAgICAqIFtUSFJJRlQtMjI2Nl0gLSBUaHJlYWRNYW5hZ2VyLmg6MjQ6MTA6IGZhdGFsIGVycm9yOiAndHIxL2Z1bmN0aW9uYWwnIGZpbGUgbm90IGZvdW5kIG9uIE1hYyAxMC45IChNYXZlcmlja3MpCisgICAgKiBbVEhSSUZULTEzMDBdIC0gVGVzdCBmYWlsdXJlcyB3aXRoIHBhcmFsbGVsIGJ1aWxkcyAobWFrZSAtaikKKyAgICAqIFtUSFJJRlQtMjQ4N10gLSBUdXRvcmlhbCByZXF1aXJlcyB0d28gSURMIGZpbGVzIGJ1dCBvbmx5IG9uZSBpcyBsaW5rZWQgZnJvbSB0aGUgVGhyaWZ0IHdlYiBzaXRlCisgICAgKiBbVEhSSUZULTIzMjldIC0gbWlzc2luZyByZWxlYXNlIHRhZ3Mgd2l0aGluIGdpdAorICAgICogW1RIUklGVC0yMzA2XSAtIGNvbmN1cmVudCBjbGllbnQgY2FsbHMgd2l0aCBub2RlanMKKyAgICAqIFtUSFJJRlQtMjIyMl0gLSBydWJ5IGdlbSBjYW5ub3QgYmUgY29tcGlsZWQgb24gT1MgWCBtYXZlcmlja3MKKyAgICAqIFtUSFJJRlQtMjM4MV0gLSBjb2RlIHdoaWNoIGdlbmVyYXRlZCBieSB0aHJpZnQyL2hiYXNlLnRocmlmdCBjb21waWxlIGVycm9yCisgICAgKiBbVEhSSUZULTIzOTBdIC0gbm8gY2xvc2UgZXZlbnQgd2hlbiBjb25uZWN0aW9uIGxvc3QKKyAgICAqIFtUSFJJRlQtMjE0Nl0gLSBVbmFibGUgdG8gcGFzcyBtdWx0aXBsZSAiLS1nZW4iIG9wdGlvbnMgdG8gdGhlIHRocmlmdCBjb21waWxlcgorICAgICogW1RIUklGVC0yNDM4XSAtIFVuZXhwZWN0ZWQgcmVhZEZpZWxkRW5kIGNhbGwgY2F1c2VzIEpTT04gUGFyc2luZyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQ5OF0gLSBFcnJvciBtZXNzYWdlICJJbnZhbGlkIG1ldGhvZCBuYW1lIiB3aGlsZSB0cnlpbmcgdG8gY2FsbCBIQmFzZSBUaHJpZnQgQVBJCisgICAgKiBbVEhSSUZULTg0MV0gLSBCdWlsZCBjcnVmdAorICAgICogW1RIUklGVC0yNTcwXSAtIFdyb25nIFVSTCBnaXZlbiBpbiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZGV2ZWxvcGVycworICAgICogW1RIUklGVC0yNjA0XSAtIEZpeCBkZWJpYW4gcGFja2FnaW5nCisgICAgKiBbVEhSSUZULTI2MThdIC0gVW5pZ25vcmUgL2FjbG9jYWwgZmlsZXMgcmVxdWlyZWQgZm9yIGJ1aWxkCisgICAgKiBbVEhSSUZULTI1NjJdIC0gLi9jb25maWd1cmUgY3JlYXRlIE1ha2VGaWxlIGluIGxpYi9kIHdpdGggZXJyb3JzCisgICAgKiBbVEhSSUZULTI1OTNdIC0gVW5hYmxlIHRvIGJ1aWxkIHRocmlmdCBvbiB1YnVudHUtMTIuMDQgKFByZWNpc2UpCisgICAgKiBbVEhSSUZULTI0NjFdIC0gQ2FuJ3QgaW5zdGFsbCB0aHJpZnQtMC44LjAgb24gT1MgWCAxMC45LjIKKyAgICAqIFtUSFJJRlQtMjYwMl0gLSBGaXggbWlzc2luZyBkaXN0IGZpbGVzCisgICAgKiBbVEhSSUZULTI2MjBdIC0gRml4IHB5dGhvbiBwYWNrYWdpbmcKKyAgICAqIFtUSFJJRlQtMjU0NV0gLSBUZXN0IENQUCBmYWlscyB0byBidWlsZCAocG9zc2libHkgdHlwbykKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yMTU1XSAtIEFkZGluZyBvbmUgbGluZXIgZ3VpZGUgdG8gcmVuYW1lIHRoZSB2ZXJzaW9uLmguaW4gYW5kIHJlbmFtZSB0aHJpZnR5LmNjLmgKKyAgICAqIFtUSFJJRlQtMTk5MV0gLSBBZGQgZXhjZXB0aW9ucyB0byBleGFtcGxlcworICAgICogW1RIUklGVC0yMzM0XSAtIGFkZCBhIHR1dG9yaWFsIGZvciBub2RlIEpTCisgICAgKiBbVEhSSUZULTIzOTJdIC0gQWN0aW9uc2NyaXB0IHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTIzODNdIC0gY29udHJpYjogc2FtcGxlIGZvciBjb25uZWN0aW5nIFRocmlmdCB3aXRoIFJlYnVzCisgICAgKiBbVEhSSUZULTIzODJdIC0gY29udHJpYjogc2FtcGxlIGZvciBjb25uZWN0aW5nIFRocmlmdCB3aXRoIFNUT01QCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE0NTddIC0gQ2FwYWNpdHkgb2YgVGZyYW1lZFRyYW5zcG9ydCB3cml0ZSBidWZmZXIgaXMgbmV2ZXIgcmVzZXQKKyAgICAqIFtUSFJJRlQtMTEzNV0gLSBOb2RlLmpzIHR1dG9yaWFsCisgICAgKiBbVEhSSUZULTEzNzFdIC0gU29ja2V0IHRpbWVvdXRzIChTT19SQ1ZUSU1FTyBhbmQgU09fU05EVElNRU8pIG5vdCBzdXBwb3J0ZWQgb24gU29sYXJpcworICAgICogW1RIUklGVC0yMTQyXSAtIE1pbm9yIHR3ZWFrcyB0byB0aHJpZnQuZWwgZm9yIGJldHRlciBlbWFjcyBwYWNrYWdlIGNvbXBhdGliaWxpdHkKKyAgICAqIFtUSFJJRlQtMjI2OF0gLSBNb2RpZnkgVFNhc2xUcmFuc3BvcnQgdG8gaWdub3JlIFRDUCBoZWFsdGggY2hlY2tzIGZyb20gbG9hZGJhbGFuY2VycworICAgICogW1RIUklGVC0yMjY0XSAtIEdpdEh1YiBwYWdlIGluY29ycmVjdGx5IHN0YXRlcyB0aGF0IFRocmlmdCBpcyBzdGlsbCBpbmN1YmF0aW5nCisgICAgKiBbVEhSSUZULTIyNjNdIC0gQWx3YXlzIGdlbmVyYXRlIGdvb2QgaGFzaENvZGUgZm9yIEphdmEKKyAgICAqIFtUSFJJRlQtMjIzM10gLSBKYXZhIGNvbXBpbGVyIHNob3VsZCBkZWZlbnNpdmVseSBjb3B5IGl0cyBiaW5hcnkgaW5wdXRzCisgICAgKiBbVEhSSUZULTIyMzldIC0gQWRkcmVzcyBGaW5kQnVncyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjI0OV0gLSBBZGQgU01QIEJ1aWxkIG9wdGlvbiB0byB0aHJpZnQuc3BlYyAoYW5kIHRocmVlIGNvbmZpZyBkZWZpbmVzKQorICAgICogW1RIUklGVC0yMjU0XSAtIEV4Y2VwdGlvbnMgZ2VuZXJhdGVkIGJ5IEdvIGNvbXBpbGVyIHNob3VsZCBpbXBsZW1lbnQgZXJyb3IgaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTIyNjBdIC0gVGhyaWZ0IGltcG9zZXMgdW5uZWVkZWQgZGVwZW5kZW5jeSBvbiBjb21tb25zLWxhbmczCisgICAgKiBbVEhSSUZULTIyNThdIC0gQWRkIFRMUyB2MS4xLzEuMiBzdXBwb3J0IHRvIFRTU0xTb2NrZXQuY3BwCisgICAgKiBbVEhSSUZULTIyMDVdIC0gTm9kZS5qcyBUZXN0IFNlcnZlciB0byBzdXBwb3J0IHRlc3QuanMgSmF2YVNjcmlwdCBCcm93c2VyIHRlc3QgYW5kIHN1bmRyeSBmaXhlcworICAgICogW1RIUklGVC0yMjA0XSAtIFNTTCBjbGllbnQgZm9yIHRoZSBjb2NvYSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMjE3Ml0gLSBKYXZhIGNvbXBpbGVyIGFsbG9jYXRlcyBvcHRpb25hbHMgYXJyYXkgZm9yIGV2ZXJ5IHN0cnVjdCB3aXRoIGFuIG9wdGlvbmFsIGZpZWxkCisgICAgKiBbVEhSSUZULTIxODVdIC0gdXNlIGNhYmFsIGluc3RlYWQgb2YgcnVuaGFza2VsbCBpbiBoYXNrZWxsIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMTkyNl0gLSBQSFAgQ29uc3RhbnQgR2VuZXJhdGlvbiBSZWZhY3RvcmluZworICAgICogW1RIUklGVC0yMDI5XSAtIFBvcnQgQysrIHRlc3RzIHRvIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjA1NF0gLSBUU2ltcGxlRmlsZVRyYW5zcG9ydCAtIEphdmEgTGliIGhhcyBubyBzdHJhaWdodCBmb3J3YXJkIFRUcmFuc3BvcnQgYmFzZWQgZmlsZSB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMjA0MF0gLSAidW5pbml0aWFsaXplZCB2YXJpYWJsZSIgd2FybmluZ3Mgb24gTVNWQy93aW5kb3dzCisgICAgKiBbVEhSSUZULTIwMzRdIC0gR2l2ZSBkZXZlbG9wZXJzJyBDKysgY29kZSBkaXJlY3QgYWNjZXNzIHRvIHNvY2tldCBGRHMgb24gc2VydmVyIHNpZGUKKyAgICAqIFtUSFJJRlQtMjA5NV0gLSBVc2UgcHJpbnQgZnVuY3Rpb24gZm9yIFB5dGhvbiAzIGNvbXBhdGlibGl0eQorICAgICogW1RIUklGVC0xODY4XSAtIE1ha2UgdGhlIFRQQyBiYWNrbG9nIGNvbmZpZ3VyYWJsZSBpbiB0aGUgSmF2YSBzZXJ2ZXJzCisgICAgKiBbVEhSSUZULTE4MTNdIC0gQWRkIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbiB0byBnZW5lcmF0ZWQgY2xhc3NlcworICAgICogW1RIUklGVC0xODE1XSAtIENvZGUgZ2VuZXJhdG9ycyBsaW5lIGJ1ZmZlciBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMjMwNV0gLSBURnJhbWVkVHJhbnNwb3J0IGVtcHR5IGNvbnN0cnVjdG9yIHNob3VsZCBwcm9iYWJseSBiZSBwcml2YXRlCisgICAgKiBbVEhSSUZULTIzMDRdIC0gTW92ZSBjbGllbnQgYXNzaWdubWVudHMgZnJvbSBjb25zdHJ1dG9yIGluIG1ldGhvZAorICAgICogW1RIUklGVC0yMzA5XSAtIFJ1YnkgKGdlbSkgJiBQSFAgUlBNIHN1YnBhY2thZ2VzCisgICAgKiBbVEhSSUZULTIzMThdIC0gcGVybDogZGVwZW5kZW5jeSBDbGFzczo6QWNjZXNzb3Igbm90IGNoZWNrZWQKKyAgICAqIFtUSFJJRlQtMjMxN10gLSBleGNsdWRlIHR1dG9yaWFsIGZyb20gYnVpbGQKKyAgICAqIFtUSFJJRlQtMjMyMF0gLSBQcm9ncmFtIGxldmVsIGRvY3RleHQgZG9lcyBub3QgZ2V0IGF0dGFjaGVkIGJ5IHBhcnNlcgorICAgICogW1RIUklGVC0yMzQ5XSAtIEdvbGFuZyAtIGltcHJvdmUgdHV0b3JpYWwKKyAgICAqIFtUSFJJRlQtMjM0OF0gLSBQSFAgR2VuZXJhdG9yOiBhZGQgYXJyYXkgdHlwZWhpbnQgdG8gZnVuY3Rpb25zCisgICAgKiBbVEhSSUZULTIzNDRdIC0gY29uZmlndXJlLmFjOiBjb21waWxlci1vbmx5IG9wdGlvbgorICAgICogW1RIUklGVC0yMzQzXSAtIEdvbGFuZyAtIFJldHVybiBhIHNpbmdsZSBlcnJvciBmb3IgYWxsIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzCisgICAgKiBbVEhSSUZULTIzNDFdIC0gRW5hYmxlIGdlbmVyYXRpb24gb2YgRGVscGhpIFhNTERvYyBjb21tZW50cyAoYS5rLmEuICJIZWxwIEluc2lnaHQiKQorICAgICogW1RIUklGVC0yMzU1XSAtIEFkZCBTU0wgYW5kIFdlYiBTb2NrZXQgU3VwcG9ydCB0byBOb2RlIGFuZCBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTIzNTBdIC0gQWRkIGFzeW5jIGNhbGxzIHRvIG5vcm1hbCBKYXZhU2NyaXB0CisgICAgKiBbVEhSSUZULTIzMzBdIC0gR2VuZXJhdGUgUEhQRG9jIGNvbW1lbnRzCisgICAgKiBbVEhSSUZULTIzMzJdIC0gUlBNQlVJTEQ6IHJ1biBib290c3RyYXAgKGlmIG5lZWRlZCkKKyAgICAqIFtUSFJJRlQtMjM5MV0gLSBzaW1wbGUgc29ja2V0IHRyYW5zcG9ydCBmb3IgYWN0aW9uc2NyaXB0IDMuMAorICAgICogW1RIUklGVC0yMzc2XSAtIG5vZGVqczogYWxsb3cgUHJvbWlzZSBzdHlsZSBjYWxscyBmb3IgY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjM2OV0gLSBBZGQgc3NsIHN1cHBvcnQgZm9yIG5vZGVqcyBpbXBsZW1lbnRhdGlvbgorICAgICogW1RIUklGVC0yNDAxXSAtIEhhc2tlbGwgdHV0b3JpYWwgY29tcGlsZXMKKyAgICAqIFtUSFJJRlQtMjQxN10gLSBDIyBVbmlvbiBjbGFzc2VzIGFyZSBub3QgcGFydGlhbAorICAgICogW1RIUklGVC0yNDE1XSAtIE5hbWVkIHBpcGVzIHNlcnZlciBwZXJmb3JtYW5jZSAmIG1lc3NhZ2UgbW9kZQorICAgICogW1RIUklGVC0yNDA0XSAtIGVtaXQgd2FybmluZyBvbiAodHlwaWNhbGx5IGluZWZmaWNpZW50KSBsaXN0PGJ5dGU+CisgICAgKiBbVEhSSUZULTIzOThdIC0gSW1wcm92ZSBOb2RlIFNlcnZlciBMaWJyYXJ5CisgICAgKiBbVEhSSUZULTIzOTddIC0gQWRkIENPUlMgYW5kIENTUCBzdXBwb3J0IGZvciBKYXZhU2NyaXB0IGFuZCBOb2RlLmpzIGxpYnJhcmllcworICAgICogW1RIUklGVC0yNDA3XSAtIHVzZSBtYXJrZG93biAocmVuYW1lIFJFQURNRSA9PiBSRUFETUUubWQpCisgICAgKiBbVEhSSUZULTIzMDBdIC0gRCBjb25maWd1cmUgaW5mbyBvdXRwdXQgc2hvdWxkIGZvbGxvdyBzYW1lIGZvcm1hdCBhcyBvdGhlciBsYW5ndWFnZXMKKyAgICAqIFtUSFJJRlQtMjU3OV0gLSBXaW5kb3dzIENFIHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMjU3NF0gLSBDb21waWxlciBvcHRpb24gdG8gZ2VuZXJhdGUgbmFtZXNwYWNlIGRpcmVjdG9yaWVzIGZvciBSdWJ5CisgICAgKiBbVEhSSUZULTI1NzFdIC0gU2ltcGxpZnkgY3Jvc3MgY29tcGlsYXRpb24gdXNpbmcgQ01ha2UKKyAgICAqIFtUSFJJRlQtMjU2OV0gLSBJbnRyb2R1Y2UgZmlsZSB0byBzcGVjaWZ5IHRoaXJkIHBhcnR5IGxpYnJhcnkgbG9jYXRpb25zIG9uIFdpbmRvd3MKKyAgICAqIFtUSFJJRlQtMjU2OF0gLSBJbXBsZW1lbnQgb3duIGNlcnRpZmljYXRlIGhhbmRsZXIKKyAgICAqIFtUSFJJRlQtMjU1Ml0gLSBlbGltaW5hdGUgd2FybmluZyBmcm9tIGNvbmZpZ3VyZS5hYworICAgICogW1RIUklGVC0yNTQ5XSAtIEdlbmVyYXRlIGpzb24gdGFnIGZvciBzdHJ1Y3QgbWVtYmVycy4gdXNlIGdvLnRhZyBhbm5vdGF0aW9uIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCB0YWcuCisgICAgKiBbVEhSSUZULTI1NDRdIC0gQWRkIHN1cHBvcnQgZm9yIHNvY2tldCB0cmFuc3BvcnQgZm9yIGMjIGxpYnJhcnkgd2hlbiB1c2luZyBXaW5kb3dzIFBob25lIHByb2plY3RzCisgICAgKiBbVEhSSUZULTI0NTNdIC0gaGFza2VsbCB0dXRvcmlhbDogZml4IHVwIGRpdmlzaW9uIGJ5IDAgZXhhbXBsZQorICAgICogW1RIUklGVC0yNDQ5XSAtIEVuaGFuY2UgdHlwZWRlZiBzdHJ1Y3R1cmUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmb3J3YXJkcyBhbmQgcmVhbCB0eXBlZGVmcworICAgICogW1RIUklGVC0yNDQ2XSAtIFRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUgc2VydmVyIHN0cmVhbSBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMjQ1NV0gLSBBbGxvdyBjbGllbnQgY2VydGlmaWNhdGVzIHRvIGJlIHVzZWQgd2l0aCBUSHR0cENsaWVudAorICAgICogW1RIUklGVC0yNTExXSAtIE5vZGUuanMgbmVlZHMgdGhlIGNvbXBhY3QgcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMjQ5M10gLSBOb2RlLmpzIGxpYiBuZWVkcyBIVFRQIGNsaWVudAorICAgICogW1RIUklGVC0yNTAyXSAtIE9wdGltaXplIGdvIGltcGxlbWVudGF0aW9ucyBvZiBiaW5hcnkgYW5kIGNvbXBhY3QgcHJvdG9jb2xzIGZvciBzcGVlZAorICAgICogW1RIUklGVC0yNDk0XSAtIEFkZCBlbnVtIHRvU3RyaW5nIGhlbHBlciBmdW5jdGlvbiBpbiBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMjQ3MV0gLSBNYWtlIGNwcC5yZWYgYW5ub3RhdGlvbiBsYW5ndWFnZSBhZ25vc3RpYworICAgICogW1RIUklGVC0yNDk3XSAtIHNlcnZlciBhbmQgY2xpZW50IGZvciB0ZXN0L2dvLCBhbHNvIHNldmVyYWwgZml4ZXMgYW5kIGltcHJvdmVtZW50cworICAgICogW1RIUklGVC0yNTM1XSAtIFRKU09OUHJvdG9jb2wgd2hlbiBzZXJpYWxpemVkIHlpZWxkcyBURmllbGQgaWRzIHJhdGhlciB0aGFuIG5hbWVzCisgICAgKiBbVEhSSUZULTIyMjBdIC0gQWRkIGEgbmV3IHN0cnVjdCBzdHJ1Y3R2PworICAgICogW1RIUklGVC0xMzUyXSAtIFRocmlmdCBzZXJ2ZXIKKyAgICAqIFtUSFJJRlQtOTg5XSAtIFB1c2ggYm9vc3QgbTQgbWFjcm9zIHVwc3RyZWFtCisgICAgKiBbVEhSSUZULTEzNDldIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHByaW50IG91dHMKKyAgICAqIFtUSFJJRlQtMjQ5Nl0gLSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgdGVzdC9nbywgYWxzbyBzZXZlcmFsIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMTExNF0gLSBNYXZlbiBwdWJsaXNoIHNob3VsZG4ndCByZXF1aXJlIHBhc3N3b3JkcyBoYXJkY29kZWQgaW4gc2V0dGluZ3MueG1sCisgICAgKiBbVEhSSUZULTIwNDNdIC0gdmlzdWFsIDIwMTAgd2FybmluZ3MgLSB1bnJlYWNoYWJsZSBjb2RlCisgICAgKiBbVEhSSUZULTE2ODNdIC0gSW1wbGVtZW50IGFsdGVybmF0aXZlcyB0byBKYXZhc2NyaXB0IENsaWVudCBzaWRlIFRyYW5zcG9ydCBwcm90b2NvbCwganVzdCBhcyBOUEFQSSBhbmQgV2ViU29ja2V0LgorICAgICogW1RIUklGVC0xNzQ2XSAtIHByb3ZpZGUgYSBTUERYIGZpbGUKKyAgICAqIFtUSFJJRlQtMTc3Ml0gLSBTZXJpYWxpemF0aW9uIGRvZXMgbm90IGNoZWNrIHR5cGVzIG9mIGVtYmVkZGVkIHN0cnVjdHVyZXMuCisgICAgKiBbVEhSSUZULTIzODddIC0gbm9kZWpzOiBleHRlcm5hbCBpbXBvcnRzIHNob3VsZCBiZSBjZW50cmFsaXplZCBpbiBpbmRleC5qcworICAgICogW1RIUklGVC0yMDM3XSAtIE1vcmUgZ2VuZXJhbCBtYWNybyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFCisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEwMTJdIC0gVHJhbnNwb3J0IGZvciBEYXRhSW5wdXQgRGF0YU91dHB1dCBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtMjI1Nl0gLSBVc2luZyBjKysxMS9jKysweCBzdGQgbGlicmFyeSAgcmVwbGFjZSBib29zdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTIyNTBdIC0gSlNPTiBhbmQgTWVtb3J5QnVmZmVyIGZvciBKYXZhTUUKKyAgICAqIFtUSFJJRlQtMjExNF0gLSBQeXRob24gU2VydmljZSBSZW1vdGUgU1NMIE9wdGlvbgorICAgICogW1RIUklGVC0xNzE5XSAtIFNBU0wgY2xpZW50IHN1cHBvcnQgZm9yIFB5dGhvbgorICAgICogW1RIUklGVC0xODk0XSAtIFRocmlmdCBtdWx0aS10aHJlYWRlZCBhc3luYyBKYXZhIFNlcnZlciB1c2luZyBKYXZhIDcgQXN5bmNocm9ub3VzQ2hhbm5lbEdyb3VwCisgICAgKiBbVEhSSUZULTE4OTNdIC0gSFRUUC9KU09OIHNlcnZlci9jbGllbnQgZm9yIG5vZGUganMKKyAgICAqIFtUSFJJRlQtMjM0N10gLSBDIyBUTFMgVHJhbnNwb3J0IGJhc2VkIG9uIFRIUklGVC0xODEKKyAgICAqIFtUSFJJRlQtMjM3N10gLSBBbGxvdyBhZGRpdGlvbiBvZiBjdXN0b20gSFRUUCBIZWFkZXJzIHRvIGFuIEhUVFAgVHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTI0MDhdIC0gTmFtZWQgUGlwZSBUcmFuc3BvcnQgT3B0aW9uIGZvciBDIworICAgICogW1RIUklGVC0yNTcyXSAtIEFkZCBzdHJpbmcvY29sbGVjdGlvbiBsZW5ndGggbGltaXQgY2hlY2tzIChmcm9tIEMrKykgdG8gamF2YSBwcm90b2NvbCByZWFkZXJzCisgICAgKiBbVEhSSUZULTI0NjldIC0gImphdmE6ZnVsbGNhbWVsIiBvcHRpb24gdG8gYXV0b21hdGljYWxseSBjYW1lbC1jYXNlIHVuZGVyc2NvcmVkIGF0dHJpYnV0ZSBuYW1lcworICAgICogW1RIUklGVC03OTVdIC0gSW1wb3J0aW5nIHNlcnZpY2UgZnVuY3Rpb25zIChzaW11bGF0aW9uIG11bHRpcGxlIGluaGVyaXRhbmNlKQorICAgICogW1RIUklGVC0yMTY0XSAtIEFkZCBhIEdldC9Qb3N0IEh0dHAgU2VydmVyIHRvIE5vZGUgYWxvbmcgd2l0aCBleGFtcGxlcworICAgICogW1RIUklGVC0yMjU1XSAtIGFkZCBQYXJlbnQgQ2xhc3MgZm9yIGdlbmVyYXRlZCBTdHJ1Y3QgY2xhc3MKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMjUzOV0gLSBUc29ja2V0LmNwcCBhZGRyaW5mbyBhaV9mbGFncyA9IEFJX0FERFJDT05GSUcKKyAgICAqIFtUSFJJRlQtMjQ0MF0gLSBob3cgdG8gY29ubmVjdCBhczMgdG8gamF2YSBieSB0aHJpZnQgLAorICAgICogW1RIUklGVC0yMzc5XSAtIE1lbW1vcnkgbGVha2luZyB3aGlsZSB1c2luZyBtdWx0aXRocmVhZGluZyBpbiBDKysgc2VydmVyLgorICAgICogW1RIUklGVC0yMjc3XSAtIFRocmlmdDogaW5zdGFsbGluZyBmYjMwMyBlcnJvcgorICAgICogW1RIUklGVC0yNTY3XSAtIENzaGFycCBzbG93ID8KKyAgICAqIFtUSFJJRlQtMjU3M10gLSB0aHJpZnQgMC45LjIgcmVsZWFzZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC05ODFdIC0gY29jb2E6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtMjEzMl0gLSBHbzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMjI5OV0gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBSdWJ5IGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKyAgICAqIFtUSFJJRlQtMjI5OF0gLSBUSnNvblByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciBDIyBkb2VzIG5vdCBhbGxvdyBmb3IgYm90aCBwb3NzaWJsZSBzbGFzaCAoc29saWR1cykgZW5jb2RpbmdzCisgICAgKiBbVEhSSUZULTIyOTddIC0gVEpzb25Qcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgRGVscGhpIGRvZXMgbm90IGFsbG93IGZvciBib3RoIHBvc3NpYmxlIHNsYXNoIChzb2xpZHVzKSBlbmNvZGluZ3MKKyAgICAqIFtUSFJJRlQtMjI3MV0gLSBKYXZhU2NyaXB0OiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjI1MV0gLSBnbyB0ZXN0IGZvciBjb21wYWN0IHByb3RvY29sIGlzIG5vdCBydW5uaW5nCisgICAgKiBbVEhSSUZULTIxOTVdIC0gRGVscGhpOiBBZGQgZXZlbnQgaGFuZGxlcnMgZm9yIHNlcnZlciBhbmQgcHJvY2Vzc2luZyBldmVudHMKKyAgICAqIFtUSFJJRlQtMjE3Nl0gLSBUU2ltcGxlSlNPTlByb3RvY29sLlJlYWRGaWVsZEJlZ2luKCkgZG9lcyBub3QgcmV0dXJuIGZpZWxkIHR5cGUgYW5kIElECisgICAgKiBbVEhSSUZULTIxNzVdIC0gV3JvbmcgZmllbGQgdHlwZSBzZXQgZm9yIGJpbmFyeQorICAgICogW1RIUklGVC0yMTc0XSAtIERlc2VyaWFsaXppbmcgSlNPTiBmYWlscyBpbiBzcGVjaWZpYyBjYXNlcworICAgICogW1RIUklGVC0yMDUzXSAtIE5vZGVKUzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTE5MTRdIC0gUHl0aG9uOiBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgorICAgICogW1RIUklGVC0xODEwXSAtIGFkZCBydWJ5IHRvIHRlc3QvdGVzdC5zaAorICAgICogW1RIUklGVC0yMzEwXSAtIFBIUDogQ2xpZW50LXNpZGUgc3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzCisgICAgKiBbVEhSSUZULTIzNDZdIC0gQyM6IFVURi04IHNlbnQgYnkgUEhQIGFzIEpTT04gaXMgbm90IHVuZGVyc3Rvb2QgYnkgVEpzb25Qcm90b2NvbAorICAgICogW1RIUklGVC0yMzQ1XSAtIERlbHBoaTogVVRGLTggc2VudCBieSBQSFAgYXMgSlNPTiBpcyBub3QgdW5kZXJzdG9vZCBieSBUSnNvblByb3RvY29sCisgICAgKiBbVEhSSUZULTIzMzhdIC0gRmlyc3QgZG9jdGV4dCB3cm9uZ2x5IGludGVycHJldGVkIGFzIHByb2dyYW0gZG9jdGV4dCBpbiBzb21lIGNhc2VzCisgICAgKiBbVEhSSUZULTIzMjVdIC0gU1NMIHRlc3QgY2VydGlmaWNhdGVzCisgICAgKiBbVEhSSUZULTIzNThdIC0gQysrOiBhZGQgY29tcGFjdCBwcm90b2NvbCB0byBjcm9zcyBsYW5ndWFnZSB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTI0MjVdIC0gUEhQOiBTZXJ2ZXItc2lkZSBzdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMKKyAgICAqIFtUSFJJRlQtMjQyMV0gLSBUcmVlL1JlY3Vyc2l2ZSBzdHJ1Y3Qgc3VwcG9ydCBpbiB0aHJpZnQKKyAgICAqIFtUSFJJRlQtMjI5MF0gLSBVcGRhdGUgR28gdHV0b3JpYWwgdG8gYWxpZ24gd2l0aCBUSFJJRlQtMjIzMgorICAgICogW1RIUklGVC0yNTU4XSAtIENTaGFycCBjb21waWxlciBnZW5lcmF0b3IgdHJpZXMgdG8gY29uY2F0IGludHMgd2l0aCBzdHJpbmdzIHVzaW5nICsKKyAgICAqIFtUSFJJRlQtMjUwN10gLSBBZGRpdGlvbmFsIExVQSBUUHJvdG9jb2xFeGNlcHRpb24gZXJyb3IgY29kZSBuZWVkZWQ/CisgICAgKiBbVEhSSUZULTI0OTldIC0gQ29tcGlsZXI6IGFsbG93IGFubm90YXRpb25zIHdpdGhvdXQgIj0gdmFsdWUiCisgICAgKiBbVEhSSUZULTI1MzRdIC0gQ3Jvc3MgbGFuZ3VhZ2UgdGVzdCByZXN1bHRzIHNob3VsZCByZWNvcmRlZCB0byBhIHN0YXR1cy5tZCBvciBzdGF0dXMuaHRtbCBmaWxlIGF1dG9tYXRpY2FsbHkKKyAgICAqIFtUSFJJRlQtNjZdIC0gSmF2YTogQWxsb3cgbXVsdGlwbGV4aW5nIG11bHRpcGxlIHNlcnZpY2VzIG92ZXIgYSBzaW5nbGUgVENQIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMTY4MV0gLSBBZGQgTHVhIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTcyN10gLSBSdWJ5LTEuOTogZGF0YSBsb3NzOiAiYmluYXJ5IiBmaWVsZHMgYXJlIHJlLWVuY29kZWQKKyAgICAqIFtUSFJJRlQtMTcyNl0gLSBSdWJ5LTEuOTogImJpbmFyeSIgZmllbGRzIGFyZSByZXByZXNlbnRlZCBieSBzdHJpbmcgd2hvc2UgZW5jb2RpbmcgaXMgIlVURi04IgorICAgICogW1RIUklGVC05ODhdIC0gcGVybDogYWRkIHZlcnNpb24gSW5mbyB0byB0aGUgbGlicmFyeSB2aWEgY29uZmlndXJlCisgICAgKiBbVEhSSUZULTMzNF0gLSBDb21wYWN0IFByb3RvY29sIGZvciBQSFAKKyAgICAqIFtUSFJJRlQtMjQ0NF0gLSBwdWxsIHJlcXVlc3QgODg6IHRocmlmdDogY2xlYW4gdXAgZW51bSB2YWx1ZSBhc3NpZ25tZW50CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMjIyM10gLSBTcGFtIGxpbmtzIG9uIHdpa2kKKyAgICAqIFtUSFJJRlQtMjU2Nl0gLSBQbGVhc2UgY3JlYXRlIGEgRE9BUCBmaWxlIGZvciB5b3VyIFRMUAorICAgICogW1RIUklGVC0yMjM3XSAtIFVwZGF0ZSBhcmNoaXZlIHRvIGNvbnRhaW4gYWxsIHZlcnNpb25zCisgICAgKiBbVEhSSUZULTk2Ml0gLSBUdXRvcmlhbCBwYWdlIG9uIG91ciB3ZWJzaXRlIGlzIHJlYWxseSB1bmhlbHBmdWwKKworIyMgVGVzdAorICAgICogW1RIUklGVC0yMzI3XSAtIG5vZGVqczogbm9kZWpzIHRlc3Qgc3VpdGUgc2hvdWxkIGJlIGJ1bmRsZWQgd2l0aCB0aGUgbGlicmFyeQorICAgICogW1RIUklGVC0yNDQ1XSAtIFRIUklGVC0yMzg0IChjb2RlIGdlbmVyYXRpb24gZm9yIGdvIG1hcHMgd2l0aCBiaW5hcnkga2V5cykgc2hvdWxkIGJlIHRlc3RlZAorICAgICogW1RIUklGVC0yNTAxXSAtIEMjIFRoZSB0ZXN0IHBhcmFtZXRlcnMgZnJvbSB0aGUgVGVzdFNlcnZlciBhbmQgVGVzdENsaWVudCBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0LworCisjIyBXaXNoCisgICAgKiBbVEhSSUZULTIxOTBdIC0gQWRkIHRoZSBKYXZhU2NyaXB0IHRocmlmdC5qcyBsaWIgdG8gdGhlIEJvd2VyIHJlZ2lzdHJ5CisgICAgKiBbVEhSSUZULTIwNzZdIC0gYm9vc3Q6Om9wdGlvbmFsIGluc3RlYWQgb2YgX19pc3NldAogCiAKLVZlcnNpb24gMC42LjAKIAotVEhSSUZULTk0MCAgICBCdWlsZCAgICAgICAgICAgICAgICAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocyAoQ2hyaXN0aWFuIExhdm9pZSkKLVRIUklGVC0xMDMyICAgQnVpbGQgICAgICAgICAgICAgICAgIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtIChNaWNoYWVsIEx1bSkKLVRIUklGVC0xMDAyICAgQyBnbGliICAgICAgICAgICAgICAgQ29kZVN0eWxlOiB0X2NfZ2xpYl9nZW5lcmF0b3IuY2MgKEFuYXRvbCBQb21vem92KQotVEhSSUZULTk3NSAgICBDIGdsaWIgICAgICAgICAgICAgICBsaWIvY19nbGliL1JFQURNRSBpcyBtaXNzaW5nID0+IGJyZWFrcyBtYWtlIGRpc3QgKE1pY2hhZWwgTHVtKQotVEhSSUZULTEwMDMgICBDIGdsaWIgICAgICAgICAgICAgICBQb2xpc2hpbmcgY19nbGliIGNvZGUgKEFuYXRvbCBQb21vem92KQotVEhSSUZULTU4MiAgICBDIGdsaWIgICAgICAgICAgICAgICBDIGltcGxlbWVudGF0aW9uIG9mIFRocmlmdCAoQW5hdG9sIFBvbW96b3YpCi1USFJJRlQtOTkyICAgIEMjICAgICAgICAgICAgICAgICAgIE5hbWluZyBjb252ZW50aW9uIGluIEMjIGNvbnN0cnVjdG9yIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggb3RoZXIgZmllbGRzIGNhdXNlcyBjb21waWxlIGVycm9ycyAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTc3ICAgIEMrKyAgICAgICAgICAgICAgICAgIEhleCBDb252ZXJzaW9uIEJ1ZyBpbiBDKysgVEpTT05Qcm90b2NvbCAoQXJhdmluZCBOYXJheWFuYW4pCi1USFJJRlQtOTIyICAgIEMrKyAgICAgICAgICAgICAgICAgIFRlbXBsYXRpemVkIFtkZV1zZXJpYWxpemF0aW9uIGNvZGUgZm9yIEMrKyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTIzICAgIEMrKyAgICAgICAgICAgICAgICAgIEV2ZW50LWRyaXZlbiBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IGZvciBDKysgKERhdmlkIFJlaXNzKQotVEhSSUZULTkyNSAgICBDKysgICAgICAgICAgICAgICAgICBQcm92aWRlIG5hbWU8LT52YWx1ZSBtYXAgZm9yIGVudW1zIGluIEMrKyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTI2ICAgIEMrKyAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgQysrIGltcHJvdmVtZW50cyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTI4ICAgIEMrKyAgICAgICAgICAgICAgICAgIE1ha2UgbW9yZSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiBDKysgc2VydmVycyAoRGF2aWQgUmVpc3MpCi1USFJJRlQtOTI5ICAgIEMrKyAgICAgICAgICAgICAgICAgIEltcHJvdmVtZW50cyB0byB0aGUgQysrIHRlc3Qgc3VpdGUgKERhdmlkIFJlaXNzKQotVEhSSUZULTg2OCAgICBDb21waWxlciAoR2VuZXJhbCkgICBSZWZlcmVuY2luZyBjb25zdGFudCB2YWx1ZXMgZG9lc24ndCB3b3JrIHdpdGggd2l0aCB0eXBlZGVmIHR5cGVzIChEYXZpZCBSZWlzcykKLVRIUklGVC0xMDA2ICAgR2VuZXJhbCAgICAgICAgICAgICAgSW1wb3NzaWJsZSB0byBjb3JyZWN0bHkgcXVhbGlmeSBhbiBlbnVtIGNvbnN0YW50IGluIGFuIGV4dGVybmFsIHRocmlmdCBmaWxlIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTkzMiAgICBIYXNrZWxsICAgICAgICAgICAgICBIYXNrZWxsIHRlc3RzIG5lZWQgdG8gYmUgcnVuIHRocm91Z2ggJ21ha2UgY2hlY2snIChhbmQgcHJvYmFibHkgJ2NhYmFsIGNoZWNrJykgdG9vIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTkzMyAgICBIYXNrZWxsICAgICAgICAgICAgICBIYXNrZWxsJ3MgVGhyaWZ0LmNhYmFsIGhhcyB3YXJuaW5ncyAoQ2hyaXN0aWFuIExhdm9pZSkKLVRIUklGVC05NDMgICAgSGFza2VsbCAgICAgICAgICAgICAgU2lsbHkgcmVhZG1lIHR5cG8gZml4LiAoQ2hyaXN0aWFuIExhdm9pZSkKLVRIUklGVC05NDQgICAgSGFza2VsbCAgICAgICAgICAgICAgU3VwcG9ydCBhbGwgdmVyc2lvbi00cyBvZiBiYXNlIChDaHJpc3RpYW4gTGF2b2llKQotVEhSSUZULTk1MCAgICBIYXNrZWxsICAgICAgICAgICAgICBIYXNrZWxsIGJpbmRpbmdzIHRyZWF0ICdieXRlJyBhcyB1bnNpZ25lZCA4LWJpdCBpbnQgKERhdGEuV29yZC5Xb3JkOCksIGphdmEvY3BwIGFzIHNpZ25lZCAoYnl0ZS9pbnQ4X3QpLiAoQ2hyaXN0aWFuIExhdm9pZSkKLVRIUklGVC0xMDA5ICAgSmF2YSAgICAgICAgICAgICAgICAgVFVuaW9uIGRvZXMgbm90IGNvcnJlY3RseSBkZWVwIGNvcHkgYSBCeXRlQnVmZmVyIChUYWthc2hpIFlvbmViYXlhc2hpKQotVEhSSUZULTEwMTMgICBKYXZhICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgamF2YSBjb2RlIG1heSBoYXZlIG5hbWUgY2xhc2hlcyB3aXRoIHRocmlmdCBsaWJyYXJ5IChQZXRlciBTY2h1bGxlcikKLVRIUklGVC0xMDE1ICAgSmF2YSAgICAgICAgICAgICAgICAgVFVuaW9uIGRvZXMgbm90IGhhbmRsZSBCeXRlQnVmZmVyIGluIHRvU3RyaW5nIChUYWthc2hpIFlvbmViYXlhc2hpKQotVEhSSUZULTEwMzggICBKYXZhICAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZSAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC0xMDYgICAgSmF2YSAgICAgICAgICAgICAgICAgVFNTTFNlcnZlclNvY2tldCAoTmlybWFsIFJhbmdhbmF0aGFuKQotVEhSSUZULTM3NyAgICBKYXZhICAgICAgICAgICAgICAgICBURmlsZVRyYW5zcG9ydCBwb3J0IGluIEphdmEgKEpveWRlZXAgU2VuIFNhcm1hKQotVEhSSUZULTc0NSAgICBKYXZhICAgICAgICAgICAgICAgICBNYWtlIGl0IGVhc2llciB0byBpbnN0YW50aWF0ZSBzZXJ2ZXJzIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTg2MiAgICBKYXZhICAgICAgICAgICAgICAgICBBc3luYyBjbGllbnQgaXNzdWVzIC8gaW1wcm92ZW1lbnRzIChOaW5nIExpYW5nKQotVEhSSUZULTkwMyAgICBKYXZhICAgICAgICAgICAgICAgICBjdXN0b20gVGhyZWFkRmFjdG9yeSBpbiBUSHNIYVNlcnZlciAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC05MzkgICAgSmF2YSAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYmluYXJ5IGZpZWxkcyB0aHJvdyBOUEUgb24gZGVmYXVsdCBieXRlW10gZ2V0dGVycyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC05NDcgICAgSmF2YSAgICAgICAgICAgICAgICAgUHJvdmlkZSBhIGhlbHBlciBtZXRob2QgdG8gZGV0ZXJtaW5lIHRoZSBUUHJvdG9jb2wgdXNlZCB0byBzZXJpYWxpemUgc29tZSBkYXRhLiAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC05NTEgICAgSmF2YSAgICAgICAgICAgICAgICAgQWRkIGEgbmV3IGlzU2VydmluZygpIG1ldGhvZCB0byBUU2VydmVyIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTk1NyAgICBKYXZhICAgICAgICAgICAgICAgICBUSHNIYVNlcnZlcjogQ2hhbmdlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgaW52b2tlciBmaWVsZC4gKEJlbmphbWluIENvdmVyc3RvbikKLVRIUklGVC05NTggICAgSmF2YSAgICAgICAgICAgICAgICAgQ2hhbmdlIGFjY2Vzc21vZGlmZXIgb24gdHJhbnNfIGZpZWxkIGluIHRoZSBGcmFtZUJ1ZmZlciBjbGFzcyB0byBwdWJsaWMuIChCZW5qYW1pbiBDb3ZlcnN0b24pCi1USFJJRlQtOTU5ICAgIEphdmEgICAgICAgICAgICAgICAgIFRTb2NrZXQgc2VlbXMgdG8gZG8gaXRzIG93biBidWZmZXJpbmcgaW5lZmZpY2llbnRseSAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC05NzAgICAgSmF2YSAgICAgICAgICAgICAgICAgVW5kZXIgaGVhdnkgbG9hZCwgVEh0dHBDbGllbnQgbWF5IGZhaWwgd2l0aCAidG9vIG1hbnkgb3BlbiBmaWxlcyIgKE1hdGhpYXMgSGVyYmVydHMpCi1USFJJRlQtOTcxICAgIEphdmEgICAgICAgICAgICAgICAgIGphdmEgbW9kdWxlIGNhbid0IGJlIGNvbXBpbGVkIHdpdGhvdXQgaXZ5IGFuZCBuZXR3b3JrIGNvbm5lY3Rpb24gKFJvZ2VyIE1laWVyKQotVEhSSUZULTgwNyAgICBKYXZhU2NyaXB0ICAgICAgICAgICBKYXZhU2NyaXB0OiBJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIHdpdGggMCBpbnN0ZWFkIG9mIG51bGwgKFJvZ2VyIE1laWVyKQotVEhSSUZULTkxMyAgICBKYXZhU2NyaXB0ICAgICAgICAgICBUZXN0IENhc2UgZm9yIFVybCBlbmNvZGVkIHN0cmluZ3MgKyBzaW1wbGUgZW5oYW5jZW1lbnQgdG8gbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaCAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTYxICAgIEphdmFTY3JpcHQgICAgICAgICAgIEphdmFTY3JpcHQgVGVzdFN1aXRlIHVzaW5nIGFudC9pdnkgYW5kIEphdmEncyBTZXJ2ZXJUZXN0QmFzZSBIYW5kbGVyIChSb2dlciBNZWllcikKLVRIUklGVC0xMDA1ICAgSmF2YSAgICAgICAgICAgICAgICAgR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMgKEJyeWFuIER1eGJ1cnkpCi1USFJJRlQtMTAwOCAgIEphdmEgICAgICAgICAgICAgICAgIGJ5dGVbXSBhY2Nlc3NvcnMgdGhyb3cgTlBFIG9uIHVuc2V0IGZpZWxkIChCcnlhbiBEdXhidXJ5KQotVEhSSUZULTUxNyAgICBKYXZhICAgICAgICAgICAgICAgICBURXhjZXB0aW9ucyB0aHJvd24gYnkgc2VydmVyIHJlc3VsdCBpbiBjcnlwdGljIGVycm9yIG1lc3NhZ2Ugb24gY2xpZW50IC0gVHJpZWQgdG8gcmVhZCA0IGJ5dGVzLCBidXQgb25seSBnb3QgMCBieXRlcyAoQnJ5YW4gRHV4YnVyeSkKLVRIUklGVC05NDYgICAgSmF2YSAgICAgICAgICAgICAgICAgQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4gKE1hdGhpYXMgSGVyYmVydHMpCi1USFJJRlQtOTQ5ICAgIEphdmEgICAgICAgICAgICAgICAgIE1vZGlmeSB0aGUgVEVudW0gaW50ZXJmYWNlIHNvIGl0IGRlZmluZXMgYSBtZXRob2Qgc2ltaWxhciB0byBmaW5kQnlWYWx1ZSAoTWF0aGlhcyBIZXJiZXJ0cykKLVRIUklGVC05NjAgICAgSmF2YSAgICAgICAgICAgICAgICAgYWRkIFRlc3RTZXJ2ZXIsIFRlc3ROb25ibG9ja2luZ1NlcnZlciBhbmQgVGVzdENsaWVudCBhZ2FpbiAoUm9nZXIgTWVpZXIpCi1USFJJRlQtOTY5ICAgIEphdmEgICAgICAgICAgICAgICAgIEphdmEgVHV0b3JpYWwgYnJva2VuLCBtb3ZlIENhbGN1bGF0b3JIYW5kbGVyIHRvIGEgc2VwYXJhdGUgZmlsZSAoUm9nZXIgTWVpZXIpCi1USFJJRlQtNzEgICAgIE1pc2MgICAgICAgICAgICAgICAgIERlYmlhbiBwYWNrYWdpbmcgZm9yIHRocmlmdCAoUm9nZXIgTWVpZXIpCi1USFJJRlQtMTAyMCAgIE9DYW1sICAgICAgICAgICAgICAgIE9DYW1sIGNvbXBpbGVyIGdlbmVyYXRlcyBpbnZhbGlkIE9DYW1sIChSaWNoYXJkIExvdykKLVRIUklGVC0zNDcgICAgUEhQICAgICAgICAgICAgICAgICAgUEhQIFRTb2NrZXQgVGltZW91dCBJc3N1ZXMgKFR5bGVyIEhvYmJzKQotVEhSSUZULTkyNCAgICBQSFAgICAgICAgICAgICAgICAgICBGaXggZ2VuZXJhdGVkIHBocCBzdHJ1Y3R1cmUgY29uc3RhbnRzIChEYXZpZCBSZWlzcykKLVRIUklGVC05MjcgICAgUEhQICAgICAgICAgICAgICAgICAgQWRkIG9wdGlvbiB0byBtb2RpZnkgdGhlIFBIUCBpbmNsdWRlIHBhdGggKERhdmlkIFJlaXNzKQotVEhSSUZULTkzNSAgICBQSFAgICAgICAgICAgICAgICAgICBQSFAgRXh0ZW5zaW9uIGFib3J0cyB0aGUgYnVpbGQgaWYgcGhwLWNvbmZpZyBpcyBub3QgaW5zdGFsbGVkIChEYXZpZCBSZWlzcykKLVRIUklGVC05NDEgICAgUEhQICAgICAgICAgICAgICAgICAgTWFrZSBQSFAgQyBFeHRlbnNpb24gdXNlIHRoZSBkZWZpbmVkIFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luIGZ1bmN0aW9uIChDaHJpcyBHb2ZmaW5ldCkKLVRIUklGVC05NTUgICAgUEhQICAgICAgICAgICAgICAgICAgVGhyaWZ0IGNvbXBpbGVyIGZvciBXaW5kb3dzIHVzZXMgbG93ZXJjYXNlIG5hbWVzIGFuZCBkaXJlY3RvcmllcyB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBjb21waWxpbmcgb24gb3RoZXIgcGxhdGZvcm1zIChSb2dlciBNZWllcikKLVRIUklGVC05NzkgICAgUnVieSAgICAgICAgICAgICAgICAgcnVieSBiaW5kaW5ncyB1c2VkIHRvIHdvcmsgb24ganJ1YnkgKEplZmYgSG9kZ2VzKQotVEhSSUZULTU4MSAgICBUZXN0IFN1aXRlICAgICAgICAgICBBZGQgYSB0ZXN0c3VpdGUgZm9yIHR4VGhyaWZ0IChUd2lzdGVkKSAoRXN0ZXZlIEZlcm5hbmRleikKLVRIUklGVC0xMDI0ICAgVHV0b3JpYWwgICAgICAgICAgICAgQWRkIFB5dGhvbiBUd2lzdGVkIGV4YW1wbGUgdG8gdGhlIFR1dG9yaWFsIChSb2dlciBNZWllcikKLVRIUklGVC04OTMgICAgVHV0b3JpYWwgICAgICAgICAgICAgYWRkIEphdmFTY3JpcHQgdG8gdGhlIHR1dG9yaWFsIGV4YW1wbGVzIChSb2dlciBNZWllcikKK1RocmlmdCAwLjkuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDQwXSAtIGRlYmlhbiBwYWNrYWdpbmc6IG1pbm9yLWlzaCBwb2xpY3kgcHJvYmxlbXMKKyAgICAqIFtUSFJJRlQtMTQwMl0gLSBHZW5lcmF0ZWQgWV90eXBlcy5qcyBkb2VzIG5vdCByZXF1aXJlKCkgWF90eXBlcy5qcyB3aGVuIGFuIGluY2x1ZGUgaW4gdGhlIElETCBmaWxlIHdhcyB1c2VkCisgICAgKiBbVEhSSUZULTE1NTFdIC0gMiB0aHJpZnQgZmlsZSBkZWZpbmUgb25seSBzdHJ1Y3QgKG5vIHNlcnZpY2UpLCBvbmUgaW5jbHVkZSBhbm90aGVyLCB0aGUgZ2VuIG5vZGVqcyBmaWxlIGRpZG4ndCBoYXZlICJyZXF1aXJlcyIgYXQgdGhlIHRvcAorICAgICogW1RIUklGVC0xMjY0XSAtIFRTb2NrZXRDbGllbnQgaXMgcXVlcmllZCBieSBydW4gbG9vcCBhZnRlciBkZWFsbG9jYXRpb24gaW4gQ29jb2EKKyAgICAqIFtUSFJJRlQtMTYwMF0gLSBUaHJpZnQgR28gQ29tcGlsZXIgYW5kIExpYnJhcnkgb3V0IG9mIGRhdGUgd2l0aCBHbyAxIFJlbGVhc2UuCisgICAgKiBbVEhSSUZULTE2MDNdIC0gVGhyaWZ0IElETCBhbGxvd3MgZm9yIG11bHRpcGxlIGV4Y2VwdGlvbnMsIGFyZ3Mgb3Igc3RydWN0IG1lbWJlciBuYW1lcyB0byBiZSB0aGUgc2FtZQorICAgICogW1RIUklGVC0xMDYyXSAtIFByb2JsZW1zIHdpdGggcHl0aG9uIHR1dG9yaWFscworICAgICogW1RIUklGVC04NjRdIC0gZGVmYXVsdCB2YWx1ZSBmYWlscyBpZiBpZGVudGlmaWVyIGlzIGEgc3RydWN0CisgICAgKiBbVEhSSUZULTkzMF0gLSBSdWJ5IGFuZCBIYXNrZWxsIGJpbmRpbmdzIGRvbid0IHByb3Blcmx5IHN1cHBvcnQgREVTVERJUiAobWFrZXMgcGFja2FnaW5nIHBhaW5mdWwpCisgICAgKiBbVEhSSUZULTgyMF0gLSBUaGUgcmVhZExlbmd0aCBhdHRyaWJ1dGUgb2YgVEJpbmFyeVByb3RvY29sIGlzIHVzZWQgYXMgYW4gaW5zdGFuY2UgdmFyaWFibGUgYW5kIGlzIGRlY3JlbWVudGVkIG9uIGVhY2ggY2FsbCBvZiBjaGVja1JlYWRMZW5ndGgKKyAgICAqIFtUSFJJRlQtMTY0MF0gLSBOb25lIG9mIHRoZSB0dXRvcmlhbHMgbGlua2VkIG9uIHRoZSB3ZWJzaXRlIGNvbnRhaW4gY29udGVudAorICAgICogW1RIUklGVC0xNjM3XSAtIE5QTSByZWdpc3RyeSBkb2VzIG5vdCBpbmNsdWRlIHZlcnNpb24gMC44CisgICAgKiBbVEhSSUZULTE2NDhdIC0gTm9kZUpTIGNsaWVudHMgYWx3YXlzIHJlY2VpdmUgMCBmb3IgJ2RvdWJsZScgdmFsdWVzLgorICAgICogW1RIUklGVC0xNjYwXSAtIFB5dGhvbiBUaHJpZnQgbGlicmFyeSBjYW4gYmUgaW5zdGFsbGVkIHdpdGggcGlwIGJ1dCBub3QgZWFzeV9pbnN0YWxsCisgICAgKiBbVEhSSUZULTE2NTddIC0gQ2hyb21lIGJyb3dzZXIgc2VuZGluZyBPUFRJT05TIG1ldGhvZCBiZWZvcmUgUE9TVCBpbiB4bWxIdHRwUmVxdWVzdAorICAgICogW1RIUklGVC0yMTE4XSAtIENlcnRpZmljYXRlIGVycm9yIGhhbmRsaW5nIHN0aWxsIGluY29ycmVjdAorICAgICogW1RIUklGVC0yMTM3XSAtIFJ1YnkgdGVzdCBsaWIgZmFpbHMgamVua2lucyBidWlsZCAjODY0CisgICAgKiBbVEhSSUZULTIxMzZdIC0gVmFncmFudCBidWlsZCBub3QgY29tcGlsaW5nIGphdmEsIHJ1YnksIHBocCwgZ28gbGlicyBkdWUgdG8gbWlzc2luZyBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtMjEzNV0gLSBHTyBsaWIgbGVhdmVzIGJlaGluZCB0ZXN0IGZpbGVzIHRoYXQgYXJlIGF1dG8gZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTIxMzRdIC0gbWluZ3ctY3Jvc3MtY29tcGlsZSBzY3JpcHQgZmFpbGluZyB3aXRoIHN0cmlwIGVycm9ycworICAgICogW1RIUklGVC0yMTMzXSAtIGphdmEgVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhIHRlc3QgZmFpbGluZworICAgICogW1RIUklGVC0yMTI2XSAtIGxpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TVEQqIGZpbGVzIG1pc3NpbmcgZnJvbSBESVNUCisgICAgKiBbVEhSSUZULTIxMjVdIC0gZGViaWFuIG1pc3NpbmcgZnJvbSBESVNUCisgICAgKiBbVEhSSUZULTIxMjRdIC0gLm8sIC5zbywgLmxhLCAuZGVwcywgLmxpYnMsIGdlbi0qIGZpbGVzIGxlZnQgdHV0b3JpYWxzLCB0ZXN0IGFuZCBsaWIvY3BwIHdoZW4gbWFraW5nIERJU1QKKyAgICAqIFtUSFJJRlQtMjEyM10gLSBHTyBsaWIgbWlzc2luZyBmaWxlcyBpbiBESVNUIGJ1aWxkCisgICAgKiBbVEhSSUZULTIxMjFdIC0gQ29tcGlsYXRpb24gYnVnIGZvciBOb2RlLmpzCisgICAgKiBbVEhSSUZULTIxMjldIC0gcGhwIGV4dCBtaXNzaW5nIGZyb20gZGlzdAorICAgICogW1RIUklGVC0yMTI4XSAtIGxpYiBHTyB0ZXN0cyBmYWlsIHdpdGggZnVuY3QgZW5kcyB3aXRob3V0IGEgcmV0dXJuIHN0YXRlbWVudAorICAgICogW1RIUklGVC0yMjg2XSAtIEZhaWxlZCB0byBjb21waWxlIFRocmlmdDAuOS4xIHdpdGggYm9vc3QxLjU1IGJ5IFZTMjAxMCBpZiBzZWxlY3QgRGVidWctbXQmeDY0IG1vZGUuCisgICAgKiBbVEhSSUZULTE5NzNdIC0gVENvbXBhY3RQcm90b2NvbCBpbiBDIyBsaWIgZG9lcyBub3Qgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBuZWdhdGl2ZSBpbnQzMiBhbmQgaW50NjQgbnVtYmVyIGNvcnJlY3RseQorICAgICogW1RIUklGVC0xOTkyXSAtIGNhc3RzIGluIFRDb21wYWN0UHJvdG9jb2wudGNjIGNhdXNpbmcgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIgd2FybmluZ3MgZnJvbSBnY2MKKyAgICAqIFtUSFJJRlQtMTkzMF0gLSBDIyBnZW5lcmF0ZXMgdW5zaWduZWQgYnl0ZSBmb3IgVGhyaWZ0ICJieXRlIiB0eXBlCisgICAgKiBbVEhSSUZULTE5MjldIC0gVXBkYXRlIHdlYnNpdGUgdG8gdXNlIE1pcnJvcnMgZm9yIGRvd25sb2FkcworICAgICogW1RIUklGVC0xOTI4XSAtIFJhY2UgbWF5IHN0aWxsIGV4aXN0IGluIFRGaWxlVHJhbnNwb3J0OjpmbHVzaCgpCisgICAgKiBbVEhSSUZULTE5MzRdIC0gVGFicyBpbiBFeGFtcGxlIHNlY3Rpb24gb24gbWFpbiBwYWdlIGFyZSBub3Qgd29ya2luZworICAgICogW1RIUklGVC0xOTMzXSAtIERlbHBoaSBnZW5lcmF0b3IgY3Jhc2hlcyB3aGVuIGEgdHlwZWRlZiByZWZlcmVuY2VzIGFub3RoZXIgdHlwZWRlZiBmcm9tIGFuIGluY2x1ZGVkIGZpbGUKKyAgICAqIFtUSFJJRlQtMTk0Ml0gLSBCaW5hcnkgYWNjZWxlcmF0ZWQgY3BwIGV4dGVuc2lvbiBkb2VzIG5vdCB1c2UgVGhyaWZ0IG5hbWVzcGFjZXMgZm9yIEV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMTk1OV0gLSBDIzogQWRkIFVuaW9uIFRNZW1vcnlCdWZmZXIgc3VwcG9ydAorICAgICogW1RIUklGVC0xOTU4XSAtIEMjOiBVc2Ugc3RhdGljIE9iamVjdC5FcXVhbHMgaW5zdGVhZCBvZiAuRXF1YWxzKCkgY2FsbHMgaW4gZXF1YWxzCisgICAgKiBbVEhSSUZULTE5NTddIC0gTm9kZUpTIFRGcmFtZWRUcmFuc3BvcnQgYW5kIFRCdWZmZXJlZFRyYW5zcG9ydCByZWFkIGJ5dGVzIGFzIHVuc2lnbmVkCisgICAgKiBbVEhSSUZULTE5NTVdIC0gVW5pb24gVHlwZSB3cml0ZXIgZ2VuZXJhdGVkIGluIEMjIGRvZXMgbm90IFdyaXRlU3RydWN0QmVnaW4KKyAgICAqIFtUSFJJRlQtMTk1Ml0gLSBUcmF2aXMgQ0kKKyAgICAqIFtUSFJJRlQtMTk0OV0gLSBXUDcgYnVpbGQgYnJva2VuCisgICAgKiBbVEhSSUZULTE5NDNdIC0gZG9jc3RyaW5ncyBmb3IgZW51bSB2YWx1ZXMgYXJlIGlnbm9yZWQKKyAgICAqIFtUSFJJRlQtMjA3MF0gLSBJbXByb3BlciBgSGV4Q2hhcicgYW5kICdIZXhWYWwnIGltcGxlbWVudGF0aW9uIGluIFRKU09OUHJvdG9jb2wuY3MKKyAgICAqIFtUSFJJRlQtMjAxN10gLSBSZXNvdXJjZSBMZWFrIGluIHRocmlmdCBzdHJ1Y3QgdW5kZXIgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorICAgICogW1RIUklGVC0yMDMyXSAtIEMjIGNsaWVudCBsZWFrcyBzb2NrZXRzL2hhbmRsZXMKKyAgICAqIFtUSFJJRlQtMTk5Nl0gLSBKYXZhTUUgQ29uc3RhbnRzIGdlbmVyYXRpb24gaXMgYnJva2VuIC8gaW5jb25zaXN0ZW50IHdpdGggcmVndWxhciBKYXZhIGdlbmVyYXRpb24KKyAgICAqIFtUSFJJRlQtMjAwMl0gLSBIYXNrZWxsOiBUZXN0IHVzZSBEYXRhLk1heWJlIGluc3RlYWQgb2YgTWF5YmUKKyAgICAqIFtUSFJJRlQtMjA1MV0gLSBWYWdyYW50IGZhaWxzIHRvIGJ1aWxkIGVybGFuZworICAgICogW1RIUklGVC0yMDUwXSAtIFZhZ3JhbnQgQyMgbGliIGNvbXBpbGUgZmFpbHMgd2l0aCBURXhjZXB0aW9uIG1pc3NpbmcKKyAgICAqIFtUSFJJRlQtMTk3OF0gLSBSdWJ5OiBUaHJpZnQgc2hvdWxkIGFsbG93IGZvciB0aGUgU1NMIHZlcmlmeSBtb2RlIHRvIGJlIHNldAorICAgICogW1RIUklGVC0xOTg0XSAtIG5hbWVzcGFjZSBjb2xsaXNpb24gaW4gcHl0aG9uIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTE5ODhdIC0gV2hlbiB0cnlpbmcgdG8gYnVpbGQgYSBkZWJpYW4gcGFja2FnZSBpdCBmYWlscyBhcyB0aGUgZmlsZSBORVdTIGRvZXNuJ3QgZXhpc3QKKyAgICAqIFtUSFJJRlQtMTk3NV0gLSBUQmluYXJ5UHJvdG9jb2wgQ2hlY2tMZW5ndGggY2FuJ3QgYmUgdXNlZCBmb3IgYSBjbGllbnQKKyAgICAqIFtUSFJJRlQtMTk5NV0gLSAnLicgYWxsb3dlZCBhdCBlbmQgb2YgaWRlbnRpZmllciBnZW5lcmF0ZXMgbm9uLWNvbXBpbGFibGUgY29kZQorICAgICogW1RIUklGVC0yMTEyXSAtIEVycm9yIGluIEdvIGdlbmVyYXRvciB3aGVuIHVzaW5nIHR5cGVkZWZzIGluIG1hcCBrZXlzCisgICAgKiBbVEhSSUZULTIwODhdIC0gVHlwb3MgaW4gVGhyaWZ0IGNvbXBpbGVyIGhlbHAgdGV4dAorICAgICogW1RIUklGVC0yMDgwXSAtIEMjIG11bHRpcGxleCBwcm9jZXNzb3IgZG9lcyBub3QgY2F0Y2ggSU9FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMjA4Ml0gLSBFeGVjdXRpbmcgImdtYWtlIGNsZWFuIiBpcyBicm9rZW4KKyAgICAqIFtUSFJJRlQtMjEwMl0gLSBjb25zdGFudHMgYXJlIG5vdCByZWZlcmVuY2luZyB0byBjb3JyZWN0IHR5cGUgd2hlbiBpbmNsdWRlZCBmcm9tIGFub3RoZXIgdGhyaWZ0IGZpbGUKKyAgICAqIFtUSFJJRlQtMjEwMF0gLSB0eXBlZGVmcyBhcmUgbm90IGNvcnJlY3RseSByZWZlcmVuY2VkIHdoZW4gaW5jbHVkaW5nIGZyb20gb3RoZXIgdGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTIwNjZdIC0gJ21ha2UgaW5zdGFsbCcgZG9lcyBub3QgaW5zdGFsbCB0d28gaGVhZGVycyByZXF1aXJlZCBmb3IgQysrIGJpbmRpbmdzCisgICAgKiBbVEhSSUZULTIwNjVdIC0gTm90IHZhbGlkIGNvbnN0YW50cyBmaWxlbmFtZSBpbiBKYXZhCisgICAgKiBbVEhSSUZULTIwNDddIC0gVGhyaWZ0LlByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wsIGludFRvWmlnWmFnIGRhdGEgbG9zdCAoVENvbXBhY3RQcm90b2NvbC5jcykKKyAgICAqIFtUSFJJRlQtMjAzNl0gLSBUaHJpZnQgZ2VtIHdhcm5zIGFib3V0IGNsYXNzIHZhcmlhYmxlIGFjY2VzcyBmcm9tIHRvcCBsZXZlbAorICAgICogW1RIUklGVC0yMDU3XSAtIFZhZ3JhbnQgZmFpbHMgb24gcGhwIHRlc3RzCisgICAgKiBbVEhSSUZULTIxMDVdIC0gR2VuZXJhdGVkIGNvZGUgZm9yIGRlZmF1bHQgdmFsdWVzIG9mIGNvbGxlY3Rpb25zIGlnbm9yZXMgdF9maWVsZDo6VF9SRVFVSVJFRAorICAgICogW1RIUklGVC0yMDkxXSAtIFVubmVjZXNzYXJ5ICdmcmllbmQnIGRlY2xhcmF0aW9uIGNhdXNlcyB3YXJuaW5nIGluIFRXaW5zb2NrU2luZ2xldG9uCisgICAgKiBbVEhSSUZULTIwOTBdIC0gR28gZ2VuZXJhdG9yLCBmaXggaW5jbHVkaW5nIG9mIG90aGVyIHRocmlmdCBmaWxlcworICAgICogW1RIUklGVC0yMTA2XSAtIEZpeCBzdXBwb3J0IGZvciBuYW1lc3BhY2VzIGluIEdPIGdlbmVyYXRvcgorICAgICogW1RIUklGVC0xNzgzXSAtIEMjIGRvZXNuJ3QgaGFuZGxlIHJlcXVpcmVkIGZpZWxkcyBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTc4Ml0gLSBhc3luYyBvbmx5IGRlZmluZWQgaW4gc2lsdmVybGlnaHQKKyAgICAqIFtUSFJJRlQtMTc3OV0gLSBNaXNzaW5nIHByb2Nlc3NfWFhYWCBtZXRob2QgaW4gZ2VuZXJhdGVkIFRQcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gZm9yIGFsbCAnb25ld2F5JyBzZXJ2aWNlIGZ1bmN0aW9ucworICAgICogW1RIUklGVC0xNjkyXSAtIFNPX1JFVVNFQUREUiBhbGxvd3MgZm9yIHNvY2tldCBoaWphY2tpbmcgb24gV2luZG93cworICAgICogW1RIUklGVC0xNzIwXSAtIEpSdWJ5IHRpbWVzIG91dCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24KKyAgICAqIFtUSFJJRlQtMTcxM10gLSBOYW1lZCBhbmQgQW5vbnltb3VzIFBpcGUgdHJhbnNwb3J0IChEZWxwaGkpCisgICAgKiBbVEhSSUZULTE2OTldIC0gTmF0aXZlIFVuaW9uI3JlYWQgaGFzIGV4dHJhIHJlYWRfZmllbGRfZW5kIGNhbGwKKyAgICAqIFtUSFJJRlQtMTc0OV0gLSBQeXRob24gVFNTTFNvY2tldCBlcnJvciBoYW5kbGluZyBvYnNjdXJlcyBhY3R1YWwgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTc0OF0gLSBHdWFyZCBhbmQgUldHdWFyZCBtYWNyb3MgZGVmaW5lZCBpbiBnbG9iYWwgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTE3MzRdIC0gRnJvbnQgd2VicGFnZSBpcyBzdGlsbCBhZHZlcnRpc2luZyB2MC44IGFzIGN1cnJlbnQgcmVsZWFzZQorICAgICogW1RIUklGVC0xNzI5XSAtIEMgZ2xpYiByZWZhY3RvciBsZWZ0IGVtcHR5IGZvbGRlcnMgaW4gc3ZuCisgICAgKiBbVEhSSUZULTE3NjddIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChEZWxwaGkpCisgICAgKiBbVEhSSUZULTE3NjVdIC0gSW5jb3JyZWN0IGVycm9yIG1lc3NhZ2UgcHJpbnRlZCBmb3IgbnVsbCBvciBuZWdhdGl2ZSBrZXlzCisgICAgKiBbVEhSSUZULTE3NzhdIC0gQ29uZmlndXJlIHJlcXVpcmVzIG1hbnVhbCBpbnRlcnZlbnRpb24gZHVlIHRvIHRhciBmYWlsdXJlCisgICAgKiBbVEhSSUZULTE3NzddIC0gVFBpcGVTZXJ2ZXIgaXMgVU5TVE9QUEFCTEUKKyAgICAqIFtUSFJJRlQtMTc1M10gLSBNdWx0aXBsZSBDKysgV2luZG93cywgT1NYLCBhbmQgaU9TIHBvcnRhYmlsaXR5IGlzc3VlcworICAgICogW1RIUklGVC0xNzU2XSAtICdtYWtlIC1qIDgnIGZhaWxzIHdpdGggInVudGVybWluYXRlZCAjaWZkZWYiIGVycm9yCisgICAgKiBbVEhSSUZULTE3NzNdIC0gUHl0aG9uIGxpYnJhcnkgc2hvdWxkIHJ1biBvbiBweXRob24gMi40CisgICAgKiBbVEhSSUZULTE3NjldIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDKyspCisgICAgKiBbVEhSSUZULTE3NjhdIC0gdW5pb25zIGNhbid0IGhhdmUgcmVxdWlyZWQgZmllbGRzIChDb21waWxlcikKKyAgICAqIFtUSFJJRlQtMTY2Nl0gLSBodG9ubGwgdXNhZ2UgaW4gVEJpbmFyeVByb3RvY29sLnRjYyBnZW5lcmF0ZXMgd2FybmluZyB3aXRoIE1TVkMyMDEwCisgICAgKiBbVEhSSUZULTE5MTldIC0gbGlidGhyaWZ0IGRlcGVuZHMgb24gaHR0cGNvcmUtNC4xLjMgKGRpcmVjdGx5KSBhbmQgaHR0cGNvcmUtNC4xLjQgKHRyYW5zaXRpdmVseSkKKyAgICAqIFtUSFJJRlQtMTg2NF0gLSBpbXBsZW1lbnQgZXZlbnQgaGFuZGxlciBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcgorICAgICogW1RIUklGVC0xODU5XSAtIEdlbmVyYXRlZCBlcnJvciBjKysgY29kZSB3aXRoIC1vdXQgYW5kIGluY2x1ZGVfcHJlZml4IHBhcmFtCisgICAgKiBbVEhSSUZULTE4NjldIC0gVFRocmVhZFBvb2xTZXJ2ZXIgKGphdmEpIGRpZXMgd2hlbiB0aHJlYWRwb29sIGlzIGNvbnN1bWVkCisgICAgKiBbVEhSSUZULTE4NDJdIC0gTWVtb3J5IGxlYWsgd2l0aCBQaXBlcworICAgICogW1RIUklGVC0xODM4XSAtIENhbid0IGJ1aWxkIGNvbXBpbGVyIG9uIE9TIFggYmVjYXVzZSBvZiBtaXNzaW5nIHRocmlmdHkuaAorICAgICogW1RIUklGVC0xODQ2XSAtIFJlc3RvcmUgc29ja2V0LmggaGVhZGVyIHRvIHN1cHBvcnQgYnVpbGRzIHdpdGggQW5kcm9pZCBOREsKKyAgICAqIFtUSFJJRlQtMTg1MF0gLSBtYWtlIGNoZWNrIGhhbmdzIG9uIFRTb2NrZXQgdGVzdHMgaW4gVHJhbnNwb3J0VGVzdC5jcHAKKyAgICAqIFtUSFJJRlQtMTg3M10gLSBCaW5hcnkgcHJvdG9jb2wgZmFjdG9yeSBpZ25vcmVzIHN0cnVjdCByZWFkL3dyaXRlIGZsYWdzCisgICAgKiBbVEhSSUZULTE4NzJdIC0gaXNzdWVzIHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0IGJ1ZmZlcgorICAgICogW1RIUklGVC0xOTA0XSAtIEluY29ycmVjdCBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdHlwZWRlZnMgd2hpY2ggdXNlIGluY2x1ZGVkIHR5cGVzCisgICAgKiBbVEhSSUZULTE5MDNdIC0gUEhQIG5hbWVzcGFjZXMgY2F1c2UgYmluYXJ5IHByb3RvY29scyB0byBub3QgYmUgdXNlZAorICAgICogW1RIUklGVC0xODk1XSAtIERlbHBoaTogcmVzZXJ2ZWQgdmFyaWFibGUgbmFtZSAicmVzdWx0IiBub3QgZGV0ZWN0ZWQgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtMTg4MV0gLSBUTm9uYmxvY2tpbmdTZXJ2ZXIgZG9lcyBub3QgcmVsZWFzZSBvcGVuIGNvbm5lY3Rpb25zIG9yIHRocmVhZHMgb24gc2h1dGRvd24KKyAgICAqIFtUSFJJRlQtMTg4OF0gLSBKYXZhIFRocmlmdCBjbGllbnQgY2FuJ3QgY29ubmVjdCB0byBQeXRob24gVGhyaWZ0IHNlcnZlciBvbiBzYW1lIGhvc3QKKyAgICAqIFtUSFJJRlQtMTgzMV0gLSBCdWcgaW4gbGlzdCBkZXNlcmlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTgyNF0gLSBtYW55IGNvbXBpbGUgd2FybmluZywgYmVjYXNlIFRocmVhZC5oIGluY2x1ZGVzIGNvbmZpZy5oCisgICAgKiBbVEhSSUZULTE4MjNdIC0gTWlzc2luZyBwYXJlbnRoZXNpcyBicmVha3MgIklTXy4uLiIgbWFjcm8gaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtMTgwNl0gLSBQeXRob24gZ2VuZXJhdGlvbiBhbHdheXMgdHJ1bmNhdGVzIF9faW5pdF9fLnB5IGZpbGVzCisgICAgKiBbVEhSSUZULTE3OTVdIC0gUmFjZSBjb25kaXRpb24gaW4gVFRocmVhZGVkU2VydmVyUG9vbCBqYXZhIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTE3OTRdIC0gQyMgYXN5bmNjdHAgYnJva2VuCisgICAgKiBbVEhSSUZULTE4MDRdIC0gQmluYXJ5K2NvbXBhY3QgcHJvdG9jb2wgc2luZ2xlIGJ5dGUgZXJyb3IgaW4gUnVieSBsaWJyYXJ5IChBUk0gYXJjaGl0ZWN0dXJlKTogY2F1c2VkIGJ5IGRpZmZlcmVudCBjaGFyIHNpZ25lZG5lc3MKKyAgICAqIFtUSFJJRlQtMTgwMF0gLSBEb2N1bWVudGF0aW9uIHRleHQgbm90IGFsd2F5cyBlc2NhcGVkIGNvcnJlY3RseSB3aGVuIHJlbmRlcmVkIHRvIEhUTUwKKyAgICAqIFtUSFJJRlQtMTc4OF0gLSBDIzogQ29uc3RhbnRzIHN0YXRpYyBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjb21waWxlCisgICAgKiBbVEhSSUZULTE4MTZdIC0gTmVlZCAicmVxdWlyZSIgaW5jbHVkZWQgdGhyaWZ0IGZpbGVzIGluICJ4eHhfdHlwZXMuanMiCisgICAgKiBbVEhSSUZULTE5MDddIC0gQ29tcGlsaW5nIG5hbWVzcGFjZSBhbmQgc3ViLW5hbWVzcGFjZSBkaXJlY3RpdmVzIGZvciB1bnJlY29nbml6ZWQgZ2VuZXJhdG9ycyBzaG91bGQgb25seSBiZSBhIHdhcm5pbmcKKyAgICAqIFtUSFJJRlQtMTkxM10gLSBza2lwcGluZyB1bmtub3duIGZpZWxkcyBpbiBqYXZhIHVuaW9ucworICAgICogW1RIUklGVC0yNTUzXSAtIEMrKyBsaW5rZXIgZXJyb3IgLSB0cmFuc3BvcnQvVFNvY2tldAorICAgICogW1RIUklGVC0yNzRdIC0gVG93YXJkcyBhIHdvcmtpbmcgcmVsZWFzZS92ZXJzaW9uaW5nIHByb2Nlc3MKKworIyMgRG9jdW1lbnRhdGlvbgorICAgICogW1RIUklGVC0xOTcxXSAtIFtHcmFwaHZpel0gQWRkcyB0dXRvcmlhbC9nZW5lcmFsIGRlc2NyaXB0aW9uIGRvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjAwMV0gLSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIEV4YW1wbGUgIkMrKyBTZXJ2ZXIiIHRhYiBpcyBicm9rZW4KKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTU3NF0gLSBBcGFjaGUgcHJvamVjdCBicmFuZGluZyByZXF1aXJlbWVudHM6IERPQVAgZmlsZSBbUEFUQ0hdCisgICAgKiBbVEhSSUZULTEzNDddIC0gVW5pZnkgdGhlIGV4Y2VwdGlvbnMgcmV0dXJuZWQgaW4gZ2VuZXJhdGVkIEdvIGNvZGUKKyAgICAqIFtUSFJJRlQtMTM1M10gLSBTd2l0Y2ggdG8gcGVyZm9ybWFuY2UgYnJhbmNoLCBnZXQgcmlkIG9mIEJpbmFyeVBhcnNlcgorICAgICogW1RIUklGVC0xNjI5XSAtIFJ1YnkgMS45IENvbXBhdGliaWxpdHkgZHVyaW5nIFRocmlmdCBjb25maWd1cmUsIG1ha2UsIGluc3RhbGwKKyAgICAqIFtUSFJJRlQtOTkxXSAtIFJlZmFjdG9yIEhhc2tlbGwgY29kZSBhbmQgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTk5MF0gLSBTYW5pZnkgZ2V0dGltZW9mZGF5IHVzYWdlIGNvZGViYXNlLXdpZGUKKyAgICAqIFtUSFJJRlQtNzkxXSAtIExldCBDKysgVFNpbXBsZVNlcnZlciBiZSBkcml2ZW4gYnkgYW4gZXh0ZXJuYWwgbWFpbiBsb29wCisgICAgKiBbVEhSSUZULTIxMTddIC0gQ29jb2EgVEJpbmFyeVByb3RvY29sIHN0cmljdFdyaXRlIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0CisgICAgKiBbVEhSSUZULTIwMTRdIC0gQ2hhbmdlIEMrKyBsaWIgaW5jbHVkZXMgdG8gdXNlIDxuYW1lc3BhY2UvPiBzdHlsZSB0aHJvdWdob3V0CisgICAgKiBbVEhSSUZULTE5NzJdIC0gQWRkIHN1cHBvcnQgZm9yIGFzeW5jIHByb2Nlc3NvcnMKKyAgICAqIFtUSFJJRlQtMTk3MF0gLSBbR3JhcGh2aXpdIEFkZHMgb3B0aW9uIHRvIHJlbmRlciBleGNlcHRpb25zIHJlbGF0aW9uc2hpcHMKKyAgICAqIFtUSFJJRlQtMTk2Nl0gLSBTdXBwb3J0IGRpZmZlcmVudCBmaWxlcyBmb3IgU1NMIGNlcnRpZmljYXRlcyBhbmQga2V5cworICAgICogW1RIUklGVC0xOTY1XSAtIEFkZHMgR3JhcGh2aXogKGdyYXBoIGRlc2NyaXB0aW9uIGxhbmd1YWdlKSBnZW5lcmF0b3IKKyAgICAqIFtUSFJJRlQtMTk1Nl0gLSBTd2l0Y2ggdG8gQXBhY2hlIENvbW1vbnMgTGFuZyAzCisgICAgKiBbVEhSSUZULTE5NjJdIC0gTXVsdGlwbGV4IHByb2Nlc3NvciBzaG91bGQgc2VuZCBhbnkgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGJhY2sgdG8gY2xpZW50CisgICAgKiBbVEhSSUZULTE5NjBdIC0gbWFpbigpIGRlY2xhcmVzIDIyIHVudXNlZCBnZW4gYm9vbHMKKyAgICAqIFtUSFJJRlQtMTk1MV0gLSBsaWJ0aHJpZnQuamFyIGhhcyBzb3VyY2UgZmlsZXMgaW4gaXQKKyAgICAqIFtUSFJJRlQtMTk5N10gLSBBZGQgYWNjZXB0IGJhY2tsb2cgY29uZmlndXJhdGlvbiBtZXRob2QgdG8gIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMjAwM10gLSBEZXByZWNhdGUgc2VudW0KKyAgICAqIFtUSFJJRlQtMjA1Ml0gLSBWYWdyYW50IG1hY2hpbmUgaW1hZ2UgZGVmYXVsdHMgdG8gb25seSAzODRNQiBvZiBSQU0KKyAgICAqIFtUSFJJRlQtMTk4MF0gLSBNb2Rlcm5pemUgR28gdG9vbGluZywgZml4IGdvIGNsaWVudCBsaWJhcnkuCisgICAgKiBbVEhSSUZULTE5NzddIC0gQyMgY29tcGlsZXIgc2hvdWxkIGdlbmVyYXRlIGNvbnN0YW50IGZpbGVzIHByZWZpeGVkIHdpdGggdGhyaWZ0IGZpbGUgbmFtZQorICAgICogW1RIUklGVC0xOTg1XSAtIGFkZCBhIFZhZ3JhbnRmaWxlIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQgZnVsbHkgcmVwcm9kdWNhYmxlCisgICAgKiBbVEhSSUZULTE5OTRdIC0gRGVwcmVjYXRlIHNsaXN0CisgICAgKiBbVEhSSUZULTE5OTNdIC0gRmFjdG9yeSB0byBjcmVhdGUgaW5zdGFuY2VzIGZyb20ga25vd24gKGdlbmVyYXRlZCkgaW50ZXJmYWNlIHR5cGVzIHdpdGggRGVscGhpCisgICAgKiBbVEhSSUZULTIwODFdIC0gU3BlY2lmaWVkIHRpbWVvdXQgc2hvdWxkIGJlIHVzZWQgaW4gVFNvY2tldC5PcGVuKCkKKyAgICAqIFtUSFJJRlQtMjA4NF0gLSBEZWxwaGk6IEFiaWxpdHkgdG8gY3JlYXRlIGVudGl0eSBUaHJpZnQtZ2VuZXJhdGVkIGluc3RhbmNlcyBiYXNlZCBvbiBUeXBlSW5mbworICAgICogW1RIUklGVC0yMDgzXSAtIEltcHJvdmUgdGhlIGdvIGxpYjogYnVmZmVyZWQgVHJhbnNwb3J0LCBzYXZlIG1lbW9yeSBhbGxvY2F0aW9uLCBoYW5kbGUgY29uY3VycmVudCByZXF1ZXN0CisgICAgKiBbVEhSSUZULTIxMDldIC0gU2VjdXJlIGNvbm5lY3Rpb25zIHNob3VsZCBiZSBzdXBwb3J0ZWQgaW4gR28KKyAgICAqIFtUSFJJRlQtMjEwN10gLSBtaW5vciBHbyBnZW5lcmF0b3IgZml4ZXMKKyAgICAqIFtUSFJJRlQtMTY5NV0gLSBhbGxvdyB3YXJuaW5nLWZyZWUgY29tcGlsYXRpb24gaW4gVlMgMjAxMiBhbmQgR05VIDQuNgorICAgICogW1RIUklGVC0xNzM1XSAtIGludGVncmF0ZSB0dXRvcmlhbCBpbnRvIHJlZ3VsYXIgYnVpbGQKKyAgICAqIFtUSFJJRlQtMTcxNl0gLSBtYXggYWxsb3dlZCBjb25uZWN0aW9ucyBzaG91bGQgYmUgUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTCisgICAgKiBbVEhSSUZULTE3MTVdIC0gQWxsb3cgZXhjbHVkaW5nIHB5dGhvbiBwYXJ0cyB3aGVuIGJ1aWxkaW5nIGNvbnRyaWIvZmIzMDMKKyAgICAqIFtUSFJJRlQtMTczM10gLSBGaXggUlBNIGJ1aWxkIGlzc3VlcyBvbiBSSEVMNi9PTDYgc3lzdGVtcworICAgICogW1RIUklGVC0xNzI4XSAtIFVwZ3JhZGF0aW9uIG9mIGh0dHBjb21wb25lbnRzCisgICAgKiBbVEhSSUZULTE4NzZdIC0gVXNlIGVudW0gbmFtZXMgaW5zdGVhZCBvZiBjYXN0ZWQgaW50ZWdlcnMgaW4gYXNzaWdubWVudHMKKyAgICAqIFtUSFJJRlQtMTg3NF0gLSB0aW1lb3V0IGZvciB0aGUgc2VydmVyLXNpZGUgZW5kIG9mIGEgbmFtZWQgcGlwZQorICAgICogW1RIUklGVC0xODk3XSAtIFN1cHBvcnQgdmFsaWRhdGlvbiBvZiByZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTg5Nl0gLSBBZGQgVEJhc2UgcHJvdG9jb2wgZm9yIENvY29hCisgICAgKiBbVEhSSUZULTE4ODBdIC0gTWFrZSBuYW1lZCBwaXBlcyBzZXJ2ZXIgd29yayBhc3luY2hyb25vdXNseSAob3ZlcmxhcHBlZCkgdG8gYWxsb3cgZm9yIGNsZWFuIHNlcnZlciBzdG9wcworICAgICogW1RIUklGVC0xODc4XSAtIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gc2VuZCBjdXN0b20gaGVhZGVycworICAgICogW1RIUklGVC0xODgyXSAtIFVzZSBzaW5nbGUgaW5jbHVkZQorICAgICogW1RIUklGVC0xNzkzXSAtIEMjOiBVc2Ugc3RhdGljIHJlYWQgaW5zdGVhZCBvZiBpbnN0YW5jZSByZWFkCisgICAgKiBbVEhSSUZULTE3OTldIC0gT3B0aW9uIHRvIGdlbmVyYXRlIEhUTUwgaW4gInN0YW5kYWxvbmUgbW9kZSIKKyAgICAqIFtUSFJJRlQtMTgxNV0gLSBDb2RlIGdlbmVyYXRvcnMgbGluZSBidWZmZXIgb3V0cHV0CisgICAgKiBbVEhSSUZULTE4OTBdIC0gQysrOiBNYWtlIG5hbWVkIHBpcGVzIHNlcnZlciB3b3JrIGFzeW5jaHJvbm91c2x5CisgICAgKiBbVEhSSUZULTQ3NF0gLSBHZW5lcmF0aW5nIFJ1Ynkgb24gUmFpbHMgZnJpZW5kbHkgY29kZQorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC04MDFdIC0gUHJvdmlkZSBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAoaXJiKSB3aGVuIGdlbmVyYXRpbmcgcnVieSBiaW5kaW5ncworICAgICogW1RIUklGVC0yMjkyXSAtIEFuZHJvaWQgTGlicmFyeSBQcm9qZWN0CisgICAgKiBbVEhSSUZULTIwMTJdIC0gTW9kZXJuaXppbmcgR28KKyAgICAqIFtUSFJJRlQtMTk2OV0gLSBDIzogVGVzdHMgbm90IHByb3Blcmx5IGxpbmtlZCBmcm9tIHRoZSBzb2x1dGlvbgorICAgICogW1RIUklGVC0xNzg1XSAtIEMjOiBBZGQgVE1lbW9yeUJ1ZmZlciBzZXJpYWxpemVyL2Rlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xNzgwXSAtIEFkZCBvcHRpb24gdG8gZ2VuZXJhdGUgbnVsbGFibGUgdmFsdWVzCisgICAgKiBbVEhSSUZULTE3ODZdIC0gQyMgVW5pb24gVHlwaW5nCisgICAgKiBbVEhSSUZULTU5MV0gLSBNYWtlIHRoZSBDKysgcnVudGltZSBsaWJyYXJ5IGJlIGNvbXBhdGlibGUgd2l0aCBXaW5kb3dzIGFuZCBWaXN1YWwgU3R1ZGlvCisgICAgKiBbVEhSSUZULTUxNF0gLSBBZGQgb3B0aW9uIHRvIGNvbmZpZ3VyZSBjb21waWxlciBvdXRwdXQgZGlyZWN0b3J5CisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTE3NjRdIC0gaG93IHRvIGdldCB0aGUgY29udGV4dCBvZiBjbGllbnQgd2hlbiBvbiBhIHJwYyBjYWxsIGluIHNlcnZlciBzaWRlPworICAgICogW1RIUklGVC0xNzkxXSAtIHRocmlmdCdzIG5hbWVzcGFjZSBkaXJlY3RpdmUgd2hlbiBnZW5lcmF0aW5nIGhhc2tlbGwgY29kZQorCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNTk0XSAtIEphdmEgdGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIGl0IHN1Y2NlZWRzIG9yIG5vdC4KKyAgICAqIFtUSFJJRlQtMTU5NV0gLSBKYXZhIHRlc3Qgc2VydmVyIHNob3VsZCBmb2xsb3cgdGhlIGRvY3VtZW50ZWQgYmVoYXZpb3IgYXMgb2YgVEhSSUZULTE1OTAKKyAgICAqIFtUSFJJRlQtOTg2XSAtIHN0OiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTk4NV0gLSBwaHA6IGFkZCB2ZXJzaW9uIEluZm8gdG8gdGhlIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtOTg0XSAtIG9jYW1sOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE5MjRdIC0gRGVscGhpOiBJbmNvbnNpc3RlbmN5IGluIHNlcmlhbGl6YXRpb24gb2Ygb3B0aW9uYWwgZmllbGRzCisgICAgKiBbVEhSSUZULTE5MjJdIC0gQyM6IEluY29uc2lzdGVuY3kgaW4gc2VyaWFsaXphdGlvbiBvZiBvcHRpb25hbCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTk2MV0gLSBDIyB0ZXN0cyBzaG91bGQgYmUgaW4gbGliL2NzaGFycC90ZXN0Ly4uLgorICAgICogW1RIUklGVC0xODIyXSAtIFBIUCB1bml0IHRlc3QgZG9lcyBub3Qgd29yaworICAgICogW1RIUklGVC0xOTAyXSAtIEMrKzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTkwMV0gLSBDIzogU3VwcG9ydCBmb3IgTXVsdGlwbGV4aW5nIFNlcnZpY2VzIG9uIGFueSBUcmFuc3BvcnQsIFByb3RvY29sIGFuZCBTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTg5OV0gLSBEZWxwaGk6IFN1cHBvcnQgZm9yIE11bHRpcGxleGluZyBTZXJ2aWNlcyBvbiBhbnkgVHJhbnNwb3J0LCBQcm90b2NvbCBhbmQgU2VydmVyCisgICAgKiBbVEhSSUZULTU2M10gLSBTdXBwb3J0IGZvciBNdWx0aXBsZXhpbmcgU2VydmljZXMgb24gYW55IFRyYW5zcG9ydCwgUHJvdG9jb2wgYW5kIFNlcnZlcgogCiAKLVZlcnNpb24gMC41LjAKIAorVGhyaWZ0IDAuOQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xNDM4XSAtIGxpYi9jcHAvc3JjL3dpbmRvd3MvY29uZmlnLmggc2hvdWxkIHJlYWQgdmVyc2lvbiBmcm9tIGNvbmZpZ3VyZS5hYyByYXRoZXIgdGhhbiBhICNkZWZpbmUKKyAgICAqIFtUSFJJRlQtMTQ0Nl0gLSBDb21waWxlIGVycm9yIHdpdGggRGVscGhpIDIwMDkgaW4gY29uc3RhbnQgaW5pdGlhbGl6ZXIKKyAgICAqIFtUSFJJRlQtMTQ1MF0gLSBQcm9ibGVtcyBidWlsZGluZyB0aHJpZnQgMC44LjAgZm9yIFB5dGhvbiBhbmQgUnVieQorICAgICogW1RIUklGVC0xNDQ5XSAtIFJ1YnkgY2xpZW50IGRvZXMgbm90IHdvcmsgb24gc29sYXJpcyAoPykKKyAgICAqIFtUSFJJRlQtMTQ0N10gLSBOdWxscG9pbnRlckV4Y2VwdGlvbiBpbiBQcm9jZXNzRnVuY3Rpb24uY2xhc3MgOmluICJvbmV3YXkiIG1ldGhvZAorICAgICogW1RIUklGVC0xNDMzXSAtIFRTZXJ2ZXJTb2NrZXQgZml4IGZvciBNU1ZDCisgICAgKiBbVEhSSUZULTE0MjldIC0gVGhlIG5vbmJsb2NraW5nIHNlcnZlcnMgaXMgc3VwcG9zZWQgdG8gdXNlIFRyYW5zcG9ydEZhY3RvcnkgdG8gcmVhZCB0aGUgZGF0YQorICAgICogW1RIUklGVC0xNDI3XSAtIFBIUCBsaWJyYXJ5IHVzZXMgbm9uLW11bHRpYnl0ZSBzYWZlIGZ1bmN0aW9ucyB3aXRoIG1ic3RyaW5nIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCisgICAgKiBbVEhSSUZULTE0MjFdIC0gRGViaWFuIFBhY2thZ2VzIGNhbiBub3QgYmUgYnVpbHQKKyAgICAqIFtUSFJJRlQtMTM5NF0gLSBUcmVhdG1lbnQgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gQysrIGFuZCBKYXZhCisgICAgKiBbVEhSSUZULTE1MTFdIC0gU2VydmVyIHdpdGggb25ld2F5IHN1cHBvcnQgKCBKQVZBICkKKyAgICAqIFtUSFJJRlQtMTQ5Nl0gLSBQSFAgY29tcGlsZXIgbm90IG5hbWVzcGFjaW5nIGVudW1zCisgICAgKiBbVEhSSUZULTE0OTVdIC0gUEhQIFRlc3RDbGllbnQgZmF0YWxzIG9uIG1pc3NpbmcgY2xhc3MKKyAgICAqIFtUSFJJRlQtMTUwOF0gLSBUU2VydmVyU29ja2V0IGRvZXMgbm90IGFsbG93IGZvciB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIHRvIGJpbmQgdG8KKyAgICAqIFtUSFJJRlQtMTUwNF0gLSBDb2NvYSBHZW5lcmF0b3Igc2hvdWxkIHVzZSBsb2NhbCBmaWxlIGltcG9ydHMgZm9yIGJhc2UgVGhyaWZ0IGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtMTUxMl0gLSBUaHJpZnQgc29ja2V0IHN1cHBvcnQgZm9yIFdpbmRvd3MgWFAKKyAgICAqIFtUSFJJRlQtMTUwMl0gLSBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpOiBEbyBub3QgcHJpbnQgb3V0IGVycm9yIG1lc3NhZ2UgaWYgc2VydmVyIHdhcyBzdG9wcGVkLgorICAgICogW1RIUklGVC0xNTAxXSAtIFBIUCBvbGQgbmFtZXNwYWNlcyBub3QgZ2VuZXJhdGVkIGZvciBlbnVtcworICAgICogW1RIUklGVC0xNDgzXSAtIGphdmEgY29tcGlsZXIgZG9lcyBub3QgZ2VuZXJhdGUgdHlwZSBwYXJhbWV0ZXJzIGZvciBzZXJ2aWNlcyBpbiBleHRlbmRlZCBjbGF1c2VzCisgICAgKiBbVEhSSUZULTE0NzldIC0gQ29tcGlsZWQgUEhQIHByb2Nlc3MgZnVuY3Rpb25zIG1pc3Npbmcgd3JpdGVNZXNzYWdlRW5kKCkKKyAgICAqIFtUSFJJRlQtMTQ5Ml0gLSBlbmFibGluZyBjX2dsaWIgcmVuZGVyIHRocmlmdCB1bnVzYWJsZSAoZXZlbiBmb3IgQysrIGNvZGUpCisgICAgKiBbVEhSSUZULTE0OTFdIC0gVW5pbml0aWFsaXplIHByb2Nlc3NvckZhY3RvcnlfIG1lbWJlciBpbiBUU2VydmVyLmgKKyAgICAqIFtUSFJJRlQtMTQ3NV0gLSBJbmNvbXBsZXRlIHJlY29yZHMgZ2VuZXJhdGlvbiBmb3IgRXJsYW5nCisgICAgKiBbVEhSSUZULTE0ODZdIC0gSmF2YXNjcmlwdCBtYW51YWwgdGVzdHNlcnZlciBub3QgcmV0dXJuaW5nIGNvbnRlbnQgdHlwZXMKKyAgICAqIFtUSFJJRlQtMTQ4OF0gLSBzcmMvY29uY3VycmVuY3kvVGhyZWFkLmg6OTE6NTg6IGVycm9yOiBpbnZhbGlkIGNvbnZlcnNpb24gZnJvbSAncHRocmVhZF90IHtha2EgX29wYXF1ZV9wdGhyZWFkX3QqfScgdG8gJ2FwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOjppZF90IHtha2EgbG9uZyBsb25nIHVuc2lnbmVkIGludH0nIFstZnBlcm1pc3NpdmVdCisgICAgKiBbVEhSSUZULTE0OTBdIC0gV2luZG93cy1zcGVjaWZpYyBoZWFkZXIgZmlsZXMgLSBmaXhlcyAmIHR3ZWFrcworICAgICogW1RIUklGVC0xNTI2XSAtIFVuaW9uIFR1cGxlU2NoZW1lRmFjdG9yeSByZXR1cm5zIFN0YW5kYXJkU2NoZW1lcworICAgICogW1RIUklGVC0xNTI3XSAtIEdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0dXBsZVJlYWRTdHJ1Y3QgaW4gdW5pb25zIHJldHVybiBudWxsIHdoZW4gdGhlIHNldGZpZWxkIGlzIHVucmVjb2duaXplZAorICAgICogW1RIUklGVC0xNTI0XSAtIFROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjb21waWxlIGluIFZpc3VhbCBTdHVkaW8gMjAxMAorICAgICogW1RIUklGVC0xNTI5XSAtIFR1cGxlUHJvdG9jb2wgY2FuIHVuaW50ZW50aW9uYWxseSBpbmNsdWRlIGFuIGV4dHJhIGJ5dGUgaW4gYml0IHZlY3RvcnMgd2hlbiBudW1iZXIgb2Ygb3B0aW9uYWwgZmllbGRzIGlzIGFuIGludGVncmFsIG9mIDgKKyAgICAqIFtUSFJJRlQtMTQ3M10gLSBKU09OIGNvbnRleHQgc3RhY2sgbWF5IGJlIGxlZnQgaW4gYW4gaW5jb3JyZWN0IHN0YXRlIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zCisgICAgKiBbVEhSSUZULTE0NTZdIC0gU3lzdGVtLk5ldC5IdHRwV2ViUmVxdWVzdCcgZG9lcyBub3QgY29udGFpbiBhIGRlZmluaXRpb24gZm9yICdQcm94eScKKyAgICAqIFtUSFJJRlQtMTQ2OF0gLSBNZW1vcnkgbGVhayBpbiBUU2FzbFNlcnZlclRyYW5zcG9ydAorICAgICogW1RIUklGVC0xNDYxXSAtIFJlY2VudCBUTm9uYmxvY2tpbmdTZXJ2ZXIgY2hhbmdlcyBicm9rZSAtLWVuYWJsZS1ib29zdHRocmVhZHM9eWVzLCBXaW5kb3dzCisgICAgKiBbVEhSSUZULTE0NjBdIC0gd2h5IG5vdCBhZGQgdW5pY29kZSBzdHJpbmdzIHN1cHBvcnQgdG8gcHl0aG9uIGRpcmVjdGx5PworICAgICogW1RIUklGVC0xNDY0XSAtIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuRnJhbWVCdWZmZXIgVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2Vzc29yIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJpdmF0ZQorICAgICogW1RIUklGVC0xNDY3XSAtIFBvc3NpYmxlIEFWIHdpdGggZW1wdHkgc3RyaW5ncyB3aGVuIHVzaW5nIEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTUyM10gLSBjbGllbnRUaW1lb3V0IG5vdCB3b3JrZWQgYXMgZXhwZWN0ZWQgaW4gVFNlcnZlclNvY2tldCBjcmVhdGVkIGJ5IFRTU0xUcmFuc3BvcnRGYWN0b3J5CisgICAgKiBbVEhSSUZULTE1MzddIC0gVEZyYW1lZFRyYW5zcG9ydCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtMTUxOV0gLSBUaGlyZnQgQnVpbGQgRmFpbHVyZSByZWZlcmVuY2luZyByYl9pbnRlcm4yIHN5bWJvbAorICAgICogW1RIUklGVC0xNTE4XSAtIEdlbmVyYXRlZCBDKysgY29kZSBvbmx5IHNlbmRzIHRoZSBmaXJzdCBvcHRpb25hbCBmaWVsZCBpbiB0aGUgd3JpdGUoKSBmdW5jdGlvbiBmb3IgYSBzdHJ1Y3QuCisgICAgKiBbVEhSSUZULTE1MTVdIC0gTmFtZUVycm9yOiBnbG9iYWwgbmFtZSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyBpcyBub3QgZGVmaW5lZAorICAgICogW1RIUklGVC0xNTU0XSAtIEluaGVyaXRlZCBzZXJ2aWNlIG1ldGhvZHMgYXJlIG5vdCByZXNvbHZlZCBpbiBkZXJpdmVkIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCisgICAgKiBbVEhSSUZULTE1NTNdIC0gdGhyaWZ0IG5vZGVqcyBzZXJ2aWNlIHNpZGUgY2FuJ3QgcmVhZCBtYXAgc3RydWN0dXJlLCBrZXkgYXMgZW51bSwgdmFsdWUgYXMgT2JqZWN0CisgICAgKiBbVEhSSUZULTE1NzVdIC0gVHlwbyBpbiBzZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAorICAgICogW1RIUklGVC0xMzI3XSAtIEZpeCBTcGVjIFN1aXRlIHVuZGVyIFJ1YnktMS44LjcgKHdvcmtzIGZvciBNUkkgUnVieS0xLjkuMikKKyAgICAqIFtUSFJJRlQtMTMyNl0gLSBvbiBzb21lIHBsYXRmb3JtcywgI2luY2x1ZGUgPHN0ZGludC5oPiBpcyBuZWNlc3NhcnkgdG8gYmUgaW5jbHVkZWQgaW4gVGhyaWZ0LmgKKyAgICAqIFtUSFJJRlQtMTE1OV0gLSBUSHR0cENsaWVudC0+Rmx1c2goKSBpc3N1ZSAoY29ubmVjdGlvbiB0aHJ1IHByb3h5KQorICAgICogW1RIUklGVC0xMjc3XSAtIE5vZGUuanMgc2VyaWFsaXplcyBmYWxzZSBib29sZWFucyBhcyBudWxsCisgICAgKiBbVEhSSUZULTEyMjRdIC0gQ2Fubm90IGluc2VydCBVVEYtOCB0ZXh0CisgICAgKiBbVEhSSUZULTEyNjddIC0gTm9kZS5qcyBjYW4ndCB0aHJvdyBleGNlcHRpb25zLgorICAgICogW1RIUklGVC0xMzM4XSAtIERvIG5vdCB1c2UgYW4gdW5wYXRjaGVkIGF1dG9jb25mIDIuNjUgdG8gZ2VuZXJhdGUgcmVsZWFzZSB0YXJiYWxsCisgICAgKiBbVEhSSUZULTExMjhdIC0gTUFDIE9TIFg6IHRocmlmdC5oIGluY29tcGF0aWJpbGl0eSB3aXRoIFRocmlmdC5oCisgICAgKiBbVEhSSUZULTE2MzFdIC0gRml4IEMrKyBzZXJ2ZXIgY29uc3RydWN0b3IgdHlwb3MKKyAgICAqIFtUSFJJRlQtMTYwMl0gLSBQSFAgQyBFeHRlbnNpb24gaXMgbm90IENvbXBhdGlibGUgd2l0aCBQSFAgNS40CisgICAgKiBbVEhSSUZULTE2MTBdIC0gSVdlYlByb3h5IG5vdCBhdmFpbGFibGUgb24gV1A3IHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTE2MDZdIC0gUmFjZSBjb25kaXRpb24gaW4gQm9vc3RUaHJlYWRGYWN0b3J5LmNwcAorICAgICogW1RIUklGVC0xNjA0XSAtIFB5dGhvbiBleGNlcHRpb24gaGFuZGVsaW5nIGZvciBjaGFuZ2VzIGZyb20gUEVQIDMxMTAKKyAgICAqIFtUSFJJRlQtMTYwN10gLSBJbmNvcnJlY3QgZmlsZSBtb2RlcyBmb3Igc2V2ZXJhbCBzb3VyY2UgZmlsZXMKKyAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5CisgICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCisgICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTU5N10gLSBUSlNPTlByb3RvY29sLnBocCBpcyBtaXNzaW5nIGZyb20gTWFrZWZpbGUuYW0KKyAgICAqIFtUSFJJRlQtMTU5MV0gLSBFbmFibGUgVENQX05PREVMQVkgZm9yIHJ1YnkgZ2VtCisgICAgKiBbVEhSSUZULTE2MjRdIC0gSXNzZXQgR2VuZXJhdGVkIGRpZmZlcmVudGx5IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMKKyAgICAqIFtUSFJJRlQtMTYyMl0gLSBJbmNvcnJlY3Qgc2l6ZSByZXR1cm5lZCBvbiByZWFkCisgICAgKiBbVEhSSUZULTE2MjFdIC0gTWVtb3J5IGxlYWtzCisgICAgKiBbVEhSSUZULTE2MTJdIC0gQmFzZTY0IGVuY29kaW5nIGlzIGJyb2tlbgorICAgICogW1RIUklGVC0xNjI3XSAtIGNvbXBpbGVyIGJ1aWx0IHVzaW5nIGNvbXBpbGVycy52Y3hwcm9qIGNhbm5vdCBiZSB1c2VkIHRvIGJ1aWxkIHNvbWUgdGVzdCAudGhyaWZ0IGZpbGVzCisgICAgKiBbVEhSSUZULTE1NzFdIC0gVXBkYXRlIFJ1YnkgSFRUUCB0cmFuc3BvcnQgZm9yIHJlY2VudCBSdWJ5IHZlcnNpb25zCisgICAgKiBbVEhSSUZULTEwMjNdIC0gVGhyaWZ0IGVuY29kaW5nICAoVVRGLTgpIGlzc3VlIHdpdGggUnVieSAxLjkuMgorICAgICogW1RIUklGVC0xMDkwXSAtIERvY3VtZW50IHRoZSBnZW5lcmF0aW9uIG9mIGEgZmlsZSBjYWxsZWQgIkNvbnN0YW50cy5qYXZhIgorICAgICogW1RIUklGVC0xMDgyXSAtIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IHNvbWV0aW1lcyBjYWxscyBjbG9zZSgpIG9uIGFuIHVuZGVmaW5lZCB2YWx1ZQorICAgICogW1RIUklGVC05NTZdIC0gUHl0aG9uIG1vZHVsZSdzIHZlcnNpb24gbWV0YS1kYXRhIHNob3VsZCBiZSB1cGRhdGVkCisgICAgKiBbVEhSSUZULTk3M10gLSBDb2NvYSBsaWJyYXJ5IHdvbid0IGNvbXBpbGUgdXNpbmcgY2xhbmcKKyAgICAqIFtUSFJJRlQtMTYzMl0gLSBydWJ5OiBkYXRhIGNvcnJ1cHRpb24gaW4gdGhyaWZ0X25hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBNZW1vcnlCdWZmZXJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTY2NV0gLSBUQmluYXJ5UHJvdG9jb2w6IGV4Y2VlZGVkIG1lc3NhZ2UgbGVuZ3RoIHJhaXNlcyBnZW5lcmljIFRFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTY2NF0gLSBSZWZlcmVuY2UgdG8gbm9uLWV4aXN0aW5nIHZhcmlhYmxlIGluIGJ1aWxkIHNjcmlwdAorICAgICogW1RIUklGVC0xNjYzXSAtIEphdmEgVGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgZXhjZXB0aW9ucworICAgICogW1RIUklGVC0xNjYyXSAtICJyZW1vdmVPYmplY3Q6IiBzaG91bGQgYmUgInJlbW92ZU9ic2VydmVyOiIgaW4gWy1UU29ja2V0U2VydmVyIGRlYWxsb2NdPworICAgICogW1RIUklGVC0xNjQzXSAtIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjayBpbiBUQmluYXJ5UHJvdG9jb2wucmVhZFN0cmluZworICAgICogW1RIUklGVC0xNjc0XSAtIFVwZGF0ZSBUaHJpZnQgRCBsaWJyYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCAyLjA2MAorICAgICogW1RIUklGVC0xNjczXSAtIFJ1YnkgY29tcGlsZSBmbGFncyBmb3IgZXh0ZW5zaW9uIGZvciBtdWx0aSBhcmNoIGJ1aWxkcyAob3MgeCkKKyAgICAqIFtUSFJJRlQtMTY1NV0gLSBDb25maWd1cmUgc3RpbGwgdHJ5aW5nIHRvIHVzZSB0aHJpZnRfZ2VuZXJhdG9ycyBpbiBvdXRwdXQKKyAgICAqIFtUSFJJRlQtMTY1NF0gLSBjX2dsaWIgdGhyaWZ0X3NvY2tldF9yZWFkKCkgcmV0dXJucyBjb3JydXB0ZWQgZGF0YQorICAgICogW1RIUklGVC0xNjUzXSAtIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGxlYWtzIENMT1NFX1dBSVQgc29ja2V0cworICAgICogW1RIUklGVC0xNjU4XSAtIEphdmEgdGhyaWZ0IHNlcnZlciBpcyBub3QgdGhyb3dpbmcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTE2NTZdIC0gU2V0dGluZyBwcm9wZXIgaGVhZGVycyBpbiBUSHR0cFNlcnZlci5jcHAgc28gdGhhdCAiQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmciIG9uIGpzIGNsaWVudCBjYW4gd29yay4KKyAgICAqIFtUSFJJRlQtMTY1Ml0gLSBUU2FzbFRyYW5zcG9ydCBkb2VzIG5vdCBsb2cgdGhlIGVycm9yIHdoZW4ga2VyYmVyb3MgYXV0aCBmYWlscworICAgICogW1RIUklGVC0yMjcyXSAtIENMT05FIC0gRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrIGluIFRCaW5hcnlQcm90b2NvbC5yZWFkU3RyaW5nCisgICAgKiBbVEhSSUZULTIwODZdIC0gSW52YWxpZCBnZW5lcmF0ZWQgY29kZSBmb3IgTm9kZS5KUyB3aGVuIHVzaW5nIG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMTY4Nl0gLSB0X3BocF9nZW5lcmF0b3IuY2MgdXNlcyAiYW5kIiBpbnN0ZWFkIG9mICImJiIsIGFuZCBjYXVzZXMgY29tcGlsZXIgZXJyb3JzIHdpdGggVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0xNjkzXSAtIGxpYnRocmlmdCBoYXMgZGVwZW5kZW5jeSBvbiB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIGh0dHBjb3JlCisgICAgKiBbVEhSSUZULTE2ODldIC0gZG9uJ3QgZXhpdCgtMSkgaW4gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTE2NzldIC0gTm9kZUpTOiBwcm90b2NvbCByZWFkU3RyaW5nKCkgc2hvdWxkIHRyZWF0IHN0cmluZyBhcyB1dGY4LCBub3QgYmluYXJ5CisgICAgKiBbVEhSSUZULTE3MjFdIC0gRGlzdCBicm9rZW4gZHVlIHRvIDAuOC4wIHRvIDAuOS4wIGNoYW5nZXMKKyAgICAqIFtUSFJJRlQtMTcxMF0gLSBNaW5vciBpc3N1ZXMgaW4gdGVzdCBjYXNlIGNvZGUKKyAgICAqIFtUSFJJRlQtMTcwOV0gLSBXYXJuaW5nICJCaXR3aXNlLW9yIG9wZXJhdG9yIHVzZWQgb24gYSBzaWduLWV4dGVuZGVkIG9wZXJhbmQ7IGNvbnNpZGVyIGNhc3RpbmcgdG8gYSBzbWFsbGVyIHVuc2lnbmVkIHR5cGUgZmlyc3QiIGluIFRCaW5hcnlQcm90b2NvbC5jcyBhdCBSZWFkSW50NjQoKQorICAgICogW1RIUklGVC0xNzA3XSAtIFtydWJ5XSBBZGp1c3Qgc2VydmVyX3NwZWMucmIgZm9yIFJTcGVjIDIuMTEueCBhbmQgUnVieSAxLjkuMworICAgICogW1RIUklGVC0xNjcxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXMgbm90IHB1dCBrZXl3b3JkcyBpbnRvIGdlbmVyYXRlZCBtZXRob2QgY2FsbHMKKyAgICAqIFtUSFJJRlQtMTY3MF0gLSBJbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBhIFRocmlmdCBpbnRlcmZhY2UKKyAgICAqIFtUSFJJRlQtMTY2OV0gLSBOYW1lRXJyb3I6IGdsb2JhbCBuYW1lICdUQXBwbGljYXRpb25FeGNlcHRpb24nIGlzIG5vdCBkZWZpbmVkCisgICAgKiBbVEhSSUZULTE2NjhdIC0gQ29tcGlsZSBlcnJvciBpbiBjb250cmliL2ZiMzAzLCB0aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmg6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAgICAqIFtUSFJJRlQtMTg0NV0gLSBGaXggY29tcGlsZXIgd2FybmluZyBjYXVzZWQgYnkgaW1wbGljaXQgc3RyaW5nIGNvbnZlcnNpb24gd2l0aCBYY29kZSA0LjYKKyAgICAqIFtUSFJJRlQtMzA0XSAtIEJ1aWxkaW5nIHRoZSBQeXRob24gbGlicmFyeSByZXF1aXJlcyBkZXZlbG9wbWVudCBoZWFkZXJzCisgICAgKiBbVEhSSUZULTM2OV0gLSBzZXRzIGFuZCBtYXBzIGJyZWFrIGVxdWFsaXR5CisgICAgKiBbVEhSSUZULTU1Nl0gLSBSdWJ5IGNvbXBpbGVyIGRvZXMgbm90IGNvcnJlY3RseSByZWZlcnJlZCB0byB0b3AtbGV2ZWwgbW9kdWxlcyB3aGVuIGEgc3VibW9kdWxlIG1hc2tzIHRoZSB0b3AtbGV2ZWwgbmFtZQorICAgICogW1RIUklGVC00ODFdIC0gaW5kZW50YXRpb24gb2YgcnVieSBjbGFzc2VzIGlzIG9mZiBieSBhIGZldworCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xNDk4XSAtIEFsbG93IFRUaHJlYWRlZFBvb2xTZXJ2ZXIuQXJncyB0byBwYXNzIGEgRXhlY3V0b3JTZXJ2aWNlCisgICAgKiBbVEhSSUZULTE0NDRdIC0gRnVuY3Rpb25SdW5uZXIgLSBhZGQgc3ludGFjdGljIHN1Z2FyIHRvIGNyZWF0ZSBzaGFyZWRfcHRycworICAgICogW1RIUklGVC0xNDQzXSAtIGRlZmluZSBhIFRQcm9jZXNzb3IgaGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwcm9jZXNzKCkKKyAgICAqIFtUSFJJRlQtMTQ0MV0gLSBHZW5lcmF0ZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgZm9yIGV4Y2VwdGlvbiBjbGFzcyB0byBsZXQgaXQgdXBkYXRlIG1lc3NhZ2UgcHJvcGVydHkgYXV0b21hdGljYWxseS4KKyAgICAqIFtUSFJJRlQtMTUyMF0gLSBFbWJlZCB2ZXJzaW9uIG51bWJlciBpbiBlcmxhbmcgLmFwcCBmaWxlCisgICAgKiBbVEhSSUZULTE0ODBdIC0gcHl0aG9uOiByZW1vdmUgdGFicywgYWRqdXN0IHdoaXRlc3BhY2UgYW5kIGFkZHJlc3MgUEVQOCB3YXJuaW5ncworICAgICogW1RIUklGVC0xNDg1XSAtIFBlcmZvcm1hbmNlOiBwYXNzIGxhcmdlIGFuZC9vciByZWZjb3VudGVkIGFyZ3VtZW50cyBhcyAiY29uc3QiCisgICAgKiBbVEhSSUZULTE0ODRdIC0gSW50cm9kdWNlIHBocHVuaXQgdGVzdCBzdWl0ZQorICAgICogW1RIUklGVC0xNTMyXSAtIFRoZSB0eXBlIHNwZWNpZmljYXRpb25zIGluIHRoZSBnZW5lcmF0ZWQgRXJsYW5nIGNvZGUgc2hvdWxkIGluY2x1ZGUgInVuZGVmaW5lZCIgd2hlcmUgaXQncyB1c2VkIGFzIGEgZGVmYXVsdCB2YWx1ZQorICAgICogW1RIUklGVC0xNTM0XSAtIFJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgRGVscGhpIGNvZGUgZ2VuZXJhdG9yLgorICAgICogW1RIUklGVC0xNDY5XSAtIEphdmEgaXNzZXQgc3BhY2Ugb3B0aW1pemF0aW9uCisgICAgKiBbVEhSSUZULTE0NjVdIC0gVmlzaWJpbGl0eSBvZiBtZXRob2RzIGluIGdlbmVyYXRlZCBqYXZhIGNvZGUKKyAgICAqIFtUSFJJRlQtMTQ1M10gLSBEb24ndCBjaGFuZ2UgdHlwZXMgb2YgYXJndW1lbnRzIHdoZW4gc2VyaWFsaXppbmcgd2l0aCB0aHJpZnQgcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC0xNDUyXSAtIGdlbmVyYXRlIGEgc3dhcCgpIG1ldGhvZCBmb3IgYWxsIGdlbmVyYXRlZCBzdHJ1Y3RzCisgICAgKiBbVEhSSUZULTE0NTFdIC0gRnJhbWVkVHJhbnNwb3J0OiBQcmV2ZW50IGluZmluaXRlIGxvb3Agd2hlbiB3cml0aW5nCisgICAgKiBbVEhSSUZULTE1MjFdIC0gVHdvIHBhdGNoZXMgZm9yIG1vcmUgUGVyZm9ybWFuY2UKKyAgICAqIFtUSFJJRlQtMTU1NV0gLSBEZWxwaGkgdmVyc2lvbiBvZiB0aGUgdHV0b3JpYWwgY29kZQorICAgICogW1RIUklGVC0xNTM1XSAtIFdoeSB0aHJpZnQgZG9uJ3QgdXNlIHdyYXBwZWQgY2xhc3MgZm9yIG9wdGlvbmFsIGZpZWxkcyA/CisgICAgKiBbVEhSSUZULTEyMDRdIC0gUnVieSBhdXRvZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCByZXF1aXJlICd0aHJpZnQnIGdlbQorICAgICogW1RIUklGVC0xMzQ0XSAtIFVzaW5nIHRoZSBodHRwYyBtb2R1bGUgZGlyZWN0bHkgcmF0aGVyIHRoYW4gdGhlIGRlcHJlY2F0ZWQgaHR0cCBsYXllcgorICAgICogW1RIUklGVC0xMzQzXSAtIG5vX2F1dG9faW1wb3J0IG1pbi8yIHRvIGF2b2lkIGNvbXBpbGUgd2FybmluZworICAgICogW1RIUklGVC0xMzQwXSAtIEFkZCBzdXBwb3J0IG9mIEFSQyB0byBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0xNjExXSAtIEltcHJvdmVkIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdHlwZWRlZnMKKyAgICAqIFtUSFJJRlQtMTU5M10gLSBQYXNzIG9uIGVycm9ycyBsaWtlICJjb25uZWN0aW9uIGNsb3NlZCIgdG8gdGhlIGhhbmRsZXIgbW9kdWxlCisgICAgKiBbVEhSSUZULTE2MTVdIC0gUEhQIE5hbWVzcGFjZQorICAgICogW1RIUklGVC0xNTY3XSAtIFRocmlmdC9jcHA6IEFsbG93IGFsdGVybmF0ZSBjbGFzc2VzIHRvIGJlIHVzZWQgZm9yCisgICAgKiBbVEhSSUZULTEwNzJdIC0gTWlzc2luZyAtIChpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3IgaW4gVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAorICAgICogW1RIUklGVC0xNjUwXSAtIFtydWJ5XSBVcGRhdGUgY2xlYW4gaXRlbXMgYW5kIHN2bjppZ25vcmUgZW50cmllcyBmb3IgT1MgWCBhcnRpZmFjdHMKKyAgICAqIFtUSFJJRlQtMTY2MV0gLSBbUEFUQ0hdIEFkZCAtLXdpdGgtcXQ0IGNvbmZpZ3VyZSBvcHRpb24KKyAgICAqIFtUSFJJRlQtMTY3NV0gLSBEbyB3ZSBoYXZlIGFueSBwbGFuIHRvIHN1cHBvcnQgc2NhbGE/CisgICAgKiBbVEhSSUZULTE2NDVdIC0gUmVwbGFjZSBPYmplY3QjdGVlIHdpdGggbW9yZSBjb252ZW50aW9uYWwgT2JqZWN0I3RhcCBpbiBzcGVjcworICAgICogW1RIUklGVC0xNjQ0XSAtIFVwZ3JhZGUgUlNwZWMgdG8gMi4xMC54IGFuZCByZWZhY3RvciBzcGVjcyBhcyBuZWVkZWQKKyAgICAqIFtUSFJJRlQtMTY3Ml0gLSBNb25vVG91Y2ggKGFuZCBNb25vIGZvciBBbmRyb2lkKSBjb21wYXRpYmlsaXR5CisgICAgKiBbVEhSSUZULTE3MDJdIC0gYSB0aHJpZnQgbWFudWFsCisgICAgKiBbVEhSSUZULTE2OTRdIC0gUmUtRW5hYmxlIHNlcmlhbGl6YXRpb24gZm9yIFdQNyBTaWx2ZXJsaWdodAorICAgICogW1RIUklGVC0xNjkxXSAtIFNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIHN1cHBvcnQgZm9yIERlbHBoaQorICAgICogW1RIUklGVC0xNjg4XSAtIFVwZGF0ZSBJREwgcGFnZSBtYXJrdXAKKyAgICAqIFtUSFJJRlQtMTcyNV0gLSBUdXRvcmlhbCB3ZWIgcGFnZXMgZm9yIERlbHBoaSBhbmQgQyMKKyAgICAqIFtUSFJJRlQtMTcxNF0gLSBbcnVieV0gRXhwbGljaXRseSBhZGQgQ1dEIHRvIFJ1YnkgdGVzdF9zdWl0ZXMucmIKKyAgICAqIFtUSFJJRlQtMzE3XSAtIElzc3VlcyB3aXRoIEphdmEgc3RydWN0IHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtMTY0XSAtIEJ1aWxkIHdlYiB0dXRvcmlhbCBvbiBJbmN1YmF0b3Igd2ViIHNpdGUKKyAgICAqIFtUSFJJRlQtNTQxXSAtIENvY29hIGNvZGUgZ2VuZXJhdG9yIGRvZXNuJ3QgcHV0IGtleXdvcmRzIGJlZm9yZSBhbGwgYXJndW1lbnRzLgorICAgICogW1RIUklGVC02ODFdIC0gVGhlIEhUTUwgZ2VuZXJhdG9yIGRvZXMgbm90IGhhbmRsZSBKYXZhRG9jIHN0eWxlIGNvbW1lbnRzIHZlcnkgd2VsbAorCisjIyBOZXcgRmVhdHVyZQorICAgICogW1RIUklGVC0xNTAwXSAtIEQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc3VwcG9ydAorICAgICogW1RIUklGVC0xNTEwXSAtIFRoZXJlIHNob3VsZCBiZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnNvblByb3RvY29sIGZvciBydWJ5CisgICAgKiBbVEhSSUZULTExMTVdIC0gcHl0aG9uIFRCYXNlIGNsYXNzIGZvciBkeW5hbWljIChkZSlzZXJpYWxpemF0aW9uLCBhbmQgX19zbG90c19fIG9wdGlvbiBmb3IgbWVtb3J5IHNhdmluZ3MKKyAgICAqIFtUSFJJRlQtMTk1M10gLSBzdXBwb3J0IGZvciBhc3AubmV0IG12YyAzCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTEyMzVdIC0gSG93IGNvdWxkIEkgdXNlIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSB3aXRoVE5vbkJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTEzNjhdIC0gVE5vbmJsb2NraW5nU2VydmVyIHVzYWdlCisgICAgKiBbVEhSSUZULTEwNjFdIC0gUmVhZCBhbiBpbnZhbGlkIGZyYW1lIHNpemUgb2YgMC4gQXJlIHlvdSB1c2luZyBURnJhbWVkVHJhbnNwb3J0IG9uIHRoZSBjbGllbnQgc2lkZT8KKyAgICAqIFtUSFJJRlQtNDkxXSAtIFJpcHBpbmcgcmF3IHB0aHJlYWRzIG91dCBvZiBURmlsZVRyYW5zcG9ydCBhbmQgYXNzb2NpYXRlZCB0ZXN0IGlzc3VlcworCisjIyBTdWItdGFzaworICAgICogW1RIUklGVC0xNTk2XSAtIERlbHBoaTogVGVzdCBjbGllbnRzIHNob3VsZCBoYXZlIGEgcmV0dXJuIGNvZGVzIHRoYXQgcmVmbGVjdCB3aGV0aGVyIHRoZXkgc3VjY2VlZGVkIG9yIG5vdAorICAgICogW1RIUklGVC05ODJdIC0gamF2YW1lOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTE3MjJdIC0gQyMgV1A3IEFzc2VtYmx5IGFkZGl0aW9uIGJlYWtzIG1vbm8gYnVpbGQKKyAgICAqIFtUSFJJRlQtMzM2XSAtIENvbXBhY3QgUHJvdG9jb2wgaW4gQyMKKworIyMgVGVzdAorICAgICogW1RIUklGVC0xNjEzXSAtIEFkZCBjb2RlIGJhY2sgaW50byBlbXB0eSBzb3VyY2UgZmlsZSBUb1N0cmluZ1Rlc3QuamF2YQorICAgICogW1RIUklGVC0xNzE4XSAtIEluY29ycmVjdCBjaGVjayBpbiBURmlsZVRyYW5zcG9ydFRlc3QKKworIyMgV2lzaAorICAgICogW1RIUklGVC0xNDYzXSAtIERlY291cGxlIFRocmlmdCBJREwgZnJvbSBnZW5lcmF0b3JzCisgICAgKiBbVEhSSUZULTE0NjZdIC0gUHJvcGVyIERvY3VtZW50YXRpb24gZm9yIFRocmlmdCBDIEdsaWIKKyAgICAqIFtUSFJJRlQtMTUzOV0gLSBCdWlsZCBhbmQgZGlzdHJpYnV0ZSB0aGUgZmIzMDMgcHl0aG9uIGxpYnJhcmllcyBhbG9uZyB3aXRoIHRocmlmdAorICAgICogW1RIUklGVC0xNjg1XSAtIFBsZWFzZSBhZGQgImFlcmVvLmNvbSIgdG8gIlBvd2VyZWQgYnkgQXBhY2hlIFRocmlmdCIgbGlzdCBpbiBhYm91dCBwYWdlCisgICAgKiBbVEhSSUZULTMzMF0gLSBUUHJvY2Vzc29yIC0gYWRkaXRpb25hbCBtZXRob2QgdG8gY2FsbGVkIHdoZW4gY29ubmVjdGlvbiBpcyBicm9rZW4KKworCisKK1RocmlmdCAwLjgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTQzNl0gLSBwaXAgaW5zdGFsbCB0aHJpZnQgZmFpbHMgb24gV2luZG93cyB3aXRoICJVbmFibGUgdG8gZmluZCB2Y3ZhcnNhbGwuYmF0IgorICAgICogW1RIUklGVC0xNDMyXSAtIEphdmFzY3JpcHQgc3RydWN0IGNvbnN0YW50cyBkZWNsYXJlZCBpbiB0aGUgc2FtZSBmaWxlIGFzIHRoZWlyIHN0cnVjdCBkZWZpbml0aW9uIHdpbGwgY2F1c2UgYW4gZXJyb3IKKyAgICAqIFtUSFJJRlQtMTQyOF0gLSBzaGFyZWQudGhyZnQgZG9lcyBub3QgaW5jbHVkZSBuYW1lc3BhY2UgZm9yIHBocCwgc28gdGhyaWZ0IGNvbXBpbGVyIGdlbmVyYXRlIGluY29ycmVjdCBuYW1lCisgICAgKiBbVEhSSUZULTE0MjZdIC0gRGlzdCBwYWNrYWdlIG1pc3NpbmcgZmlsZXMgZm9yIHJlbGVhc2UgMC44CisgICAgKiBbVEhSSUZULTE0MjVdIC0gVGhlIE5vZGUgcGFja2FnZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXRlc3Qgbm9kZSAoMC42KSAmIG5wbSAoMS4wLjI3KQorICAgICogW1RIUklGVC0xNDE2XSAtIFB5dGhvbiBVbml0IHRlc3QgaXMgYnJva2VuIG9uIGNpCisgICAgKiBbVEhSSUZULTE0MTldIC0gQWJzdHJhY3ROb25CbG9ja2luZ1NlcnZlciBkb2VzIG5vdCBjYXRjaCBlcnJvcnMgd2hlbiBpbnZva2luZyB0aGUgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTE0MjRdIC0gUnVieSBzcGVjcyBmYWlsIHdoZW4gcnVuIHdpdGggcmFrZQorICAgICogW1RIUklGVC0xNDIwXSAtIE5vbmJsb2NraW5nIGFuZCBIc0hhIHNlcnZlciBzaG91bGQgbWFrZSBzdXJlIHRvIGNsb3NlIGFsbCB0aGVpciBzb2NrZXQgY29ubmVjdGlvbnMgd2hlbiB0aGUgc2VsZWN0b3IgZXhpdHMKKyAgICAqIFtUSFJJRlQtMTQxM10gLSBHZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCByZWFkIE1hcEVuZCAvIExpc3RFbmQgLyBTZXRFbmQKKyAgICAqIFtUSFJJRlQtMTQwOV0gLSBOYW1lIGNvbmZsaWN0IGNoZWNrIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgZm9yIGV4Y2VwdGlvbiBvYmplY3QoRGVscGhpKS4KKyAgICAqIFtUSFJJRlQtMTQwOF0gLSBEZWxwaGkgVGVzdCBTZXJ2ZXI6IEV4Y2VwdGlvbiB0ZXN0IGNhc2UgZmFpbHMgZHVlIHRvIG5hbWluZyBjb25mbGljdCB3aXRoIGUubWVzc2FnZQorICAgICogW1RIUklGVC0xNDA3XSAtIFR5cG8gaW4gUHl0aG9uIHNvY2tldCBzZXJ2ZXIgY2F1c2VzIFRocmlmdCB0byBmYWlsIHdoZW4gd2UgZW5hYmxlIGEgZ2xvYmFsIHNvY2tldCB0aW1vdXQKKyAgICAqIFtUSFJJRlQtMTM5N10gLSBDSSBzZXJ2ZXIgZmFpbHMgZHVyaW5nIGJ1aWxkIGR1ZSB0byB1bnVzZWQgcGFyYW1ldGVycyBpbiBkZWxwaGkgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTE0MDRdIC0gRGVscGhpIGNvbXBpbGVyIGdlbmVyYXRlcyBzdHJ1Y3QgcmVhZGVyIGNvZGUgd2l0aCBwcm9ibGVtLgorICAgICogW1RIUklGVC0xNDAwXSAtIFJ1YnkgbmF0aXZlIGV4dGVuc2lvbiBhYm9ydHMgd2l0aCBfX3N0YWNrX2Noa19mYWlsIGluIE9TWAorICAgICogW1RIUklGVC0xMzk5XSAtIE9uZSBvZiB0aGUgVFNlcnZlckltcGwuQ3JlYXRlIENUT1JzIGxhY2tzIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTEzOTBdIC0gRGViaWFuIHBhY2thZ2VzIGJ1aWxkIGZpeCBmb3IgU3F1ZWV6ZSAoYnVpbGQgZnJvbSB0aGUgb2ZmaWNpYWwgIDAuNy4wIHRhcmJhbGwpCisgICAgKiBbVEhSSUZULTEzOTNdIC0gVFRyYW5zcG9ydEV4Y2VwdGlvbidzIHRocm93biBmcm9tIFRIdHRwQ2xpZW50IGNvbnRhaW4gc3VwZXJmbHVvdXMgc2xhc2hlcyBpbiB0aGUgRXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAqIFtUSFJJRlQtMTM5Ml0gLSBFbmFibGluZyBib3RoIG5hbWVzcGFjZXMgYW5kIGF1dG9sb2FkaW5nIGluIGdlbmVyYXRlZCBQSFAgY29kZSB3b24ndCB3b3JrLgorICAgICogW1RIUklGVC0xNDA2XSAtIEJ1aWxkIGVycm9yIGFmdGVyIGFwcGx5aW5nIFRIUklGVC0xMzk1CisgICAgKiBbVEhSSUZULTE0MDVdIC0gRGVscGhpIGNvbXBpbGVyIGRvZXMgbm90IGdlbmVyYXRlcyBjb250YWluZXIgc2VyaWFsaXplciBwcm9wZXJseS4KKyAgICAqIFtUSFJJRlQtMTQxMV0gLSBqYXZhIGdlbmVyYXRvciBkb2VzIG5vdCBwcm92aWRlIHR5cGUgcGFyYW1ldGVyIGZvciBUQmFzZVByb2Nlc3NvcgorICAgICogW1RIUklGVC0xNDczXSAtIEpTT04gY29udGV4dCBzdGFjayBtYXkgYmUgbGVmdCBpbiBhbiBpbmNvcnJlY3Qgc3RhdGUgd2hlbiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGR1cmluZyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtMTMzMV0gLSBSdWJ5IGxpYnJhcnkgZGVzZXJpYWxpemVzIGFuIGVtcHR5IG1hcCB0byBuaWwKKyAgICAqIFtUSFJJRlQtMTMzMF0gLSBQSFAgTmFtZXNwYWNlcyBubyBsb25nZXIgZ2VuZXJhdGVkCisgICAgKiBbVEhSSUZULTEzMjhdIC0gVEJhc2VIZWxwZXIudG9TdHJpbmcoLi4uKSBhcHBlbmRzIEJ5dGVCdWZmZXIgZGF0YSBvdXRzaWRlIG9mIHZhbGlkIGJ1ZmZlciByYW5nZQorICAgICogW1RIUklGVC0xMzIyXSAtIE9DYW1sIGxpYiBmYWlsIHRvIGNvbXBpbGU6IFRocmlmdC5tbCBsaW5lIDMwNSwgaW50IHZzIGludDMyIG1pc21hdGNoCisgICAgKiBbVEhSSUZULTExNDNdIC0gQnVpbGQgZG9lc24ndCBkZXRlY3QgY29ycmVjdCBhcmNoaXRlY3R1cmUgdHlwZSBvbiA2NGJpdCBvc3gKKyAgICAqIFtUSFJJRlQtMTIwNV0gLSBwb3J0IHNlcnZlciB1bmR1bHkgZnJhZ2lsZSB3aXRoIGFyYml0cmFyeSBpbnB1dAorICAgICogW1RIUklGVC0xMjc5XSAtIHR5cGUgc2V0IGlzIGhhbmRsZWQgaW5jb3JyZWN0bHkgd2hlbiB3cml0aW5nIG9iamVjdAorICAgICogW1RIUklGVC0xMjk4XSAtIFN0YW5kYXJkIHNjaGVtZSBkb2Vzbid0IHJlYWQgb3Igd3JpdGUgbWV0YWRhdGEgYWxvbmcgd2l0aCBmaWVsZCB2YWx1ZXMKKyAgICAqIFtUSFJJRlQtMTI2NV0gLSBDKysgY29udGFpbmVyIGRlc2VyaWFsaXplCisgICAgKiBbVEhSSUZULTEyNjNdIC0gcHVibGlzaCBydWJ5IGNsaWVudCB0byBydWJ5Z2VtcworICAgICogW1RIUklGVC0xMzg0XSAtIEphdmEgaGVscCBtZW51IG1pc3NpbmcgbmV3bGluZSBuZWFyIGphdmFtZSBmbGFnCisgICAgKiBbVEhSSUZULTEzODJdIC0gQnVuZGxlIGluc3RhbGwgZG9lc25vdCB3b3JrIGJlY2F1c2UgdGhyaWZ0IGNyYXNoZXMKKyAgICAqIFtUSFJJRlQtMTM4MV0gLSBUaHJpZnQgQysrIGxpYnMgaGF2ZSBpbmNvcnJlY3RseSB2ZXJzaW9uZWQgbmFtZXMKKyAgICAqIFtUSFJJRlQtMTM1MF0gLSBHbyBsaWJyYXJ5IGNvZGUgZG9lcyBub3QgYnVpbGQgYXMgb2YgcjYwIChtb3N0IHJlY2VudCByZWxlYXNlKQorICAgICogW1RIUklGVC0xMzY1XSAtIFR1cGxlUHJvdG9jb2wjd3JpdGVCaXRTZXQgdW5pbnRlbnRpb25hbGx5IHdyaXRlcyBhIHZhcmlhYmxlIGxlbmd0aCBieXRlIGFycmF5CisgICAgKiBbVEhSSUZULTEzNTldIC0gLS1nZW4tY29iIGNwcDpjb2Jfc3R5bGUgZG9lcyBub3QgY29tcGlsZSBhbnltb3JlCisgICAgKiBbVEhSSUZULTEzMTldIC0gTWlzbWF0Y2ggYmV0d2VlbiBob3cgYSB1bmlvbiByZWFkcyBhbmQgd3JpdGVzIGEgY29udGFpbmVyCisgICAgKiBbVEhSSUZULTEzMDldIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0xMjM4XSAtIFRocmlmdCBKUyBjbGllbnQgY2Fubm90IHJlYWQgbWFwIG9mIHN0cnVjdHVyZXMKKyAgICAqIFtUSFJJRlQtMTI1NF0gLSBDb2RlIGNhbid0IGJlIGNvbXBpbGVkIGFnYWluc3QgYSByZWd1bGFyIEpSRTogT2JqZWN0LmNsb25lKCkgb3ZlcnJpZGUgaGFzIGEgZGlmZmVyZW50IHJldHVybiB0eXBlCisgICAgKiBbVEhSSUZULTEzNjddIC0gTWFjIE9TWCBidWlsZCBmYWlscyB3aXRoICJubyBzdWNoIGZpbGUgdG8gbG9hZCAtLSBzcGVjL3Jha2Uvc3BlY3Rhc2siCisgICAgKiBbVEhSSUZULTEzNTVdIC0gUnVubmluZyBtYWtlIGluIGxpYi9yYiBkb2Vzbid0IGJ1aWxkIHRoZSBuYXRpdmUgZXh0ZW5zaW9ucworICAgICogW1RIUklGVC0xMzcwXSAtIERlYmlhbiBwYWNrYWdpbmcgc2hvdWxkIEJ1aWxkLURlcGVuZCBvbiBsaWJnbGliMi4wLWRldgorICAgICogW1RIUklGVC0xMzQyXSAtIENvbXBpbGF0aW9uIHByb2JsZW0gb24gV2luZG93cyBvZiBmYXN0YmluYXJ5LmMKKyAgICAqIFtUSFJJRlQtMTM0MV0gLSBUUHJvdG9jb2wuaCBlbmRpYW4gZGV0ZWN0aW9uIHdyb25nIHdpdGggYm9vc3QKKyAgICAqIFtUSFJJRlQtMTU4M10gLSBjX2dsaWIgbGVha3MgbWVtb3J5CisgICAgKiBbVEhSSUZULTE1ODJdIC0gQmFkIGluY2x1ZGVzIG9mIG5lc3RlZCB0aHJpZnQgZmlsZXMgaW4gY19nbGliCisgICAgKiBbVEhSSUZULTE1NzhdIC0gQ19HTGliIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNvbXBpbGUKKyAgICAqIFtUSFJJRlQtMTAyN10gLSAnbWFrZSAtaiAxNicgZmFpbHMgd2l0aCAidW50ZXJtaW5hdGVkICNpZmRlZiIgZXJyb3IKKyAgICAqIFtUSFJJRlQtMTEyMV0gLSBKYXZhIHNlcnZlciBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGluIDAuNgorICAgICogW1RIUklGVC04NTddIC0gdGVzdHMgcnVuIGJ5ICJtYWtlIGluc3RhbGwiIGZhaWwgaWYgZ2VuZXJhdG9ycyBhcmUgZGlzYWJsZWQKKyAgICAqIFtUSFJJRlQtMzgwXSAtIFVzZSBzZXR1cHRvb2xzIGZvciBweXRob24gYnVpbGQKKworIyMgRGVwZW5kZW5jeSB1cGdyYWRlCisgICAgKiBbVEhSSUZULTEyNTddIC0gdGhyaWZ0J3MgZGVwZW5kZW5jeSBzY29wZSBvbiBqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpIHNob3VsZCBiZSAncHJvdmlkZWQnCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTE0NDVdIC0gbWlub3IgQysrIGdlbmVyYXRvciB2YXJpYWJsZSBjbGVhbnVwCisgICAgKiBbVEhSSUZULTE0MzVdIC0gbWFrZSBURXhjZXB0aW9uLk1lc3NhZ2UgcHJvcGVydHkgY29uZm9ybWFudCB0byB0aGUgdXN1YWwgZXhwZWN0YXRpb25zCisgICAgKiBbVEhSSUZULTE0MzFdIC0gUmVuYW1lICdzeXMnIG1vZHVsZSB0byAndXRpbCcKKyAgICAqIFtUSFJJRlQtMTM5Nl0gLSBEZXBoaSBnZW5lcmF0b3IgaGFzIGRlcGVuZGFjeSBvbiBib29zdCAxLjQyIGxhdGVyLgorICAgICogW1RIUklGVC0xMzk1XSAtIFBhdGNoIHRvIHByZXZlbnQgd2FybmluZ3MgZm9yIGludGVnZXIgdHlwZXMgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC0xMjc1XSAtICB0aHJpZnQ6IGFsd2F5cyBwcmVmaXggbmFtZXNwYWNlcyB3aXRoICIgOjoiCisgICAgKiBbVEhSSUZULTEyNzRdIC0gIHRocmlmdDogZmFpbCBjb21waWxhdGlvbiBpZiBhbiB1bmV4cGVjdGVkIHRva2VuIGlzCisgICAgKiBbVEhSSUZULTEyNzFdIC0gIHRocmlmdDogZml4IG1pc3NpbmcgbmFtZXNwYWNlIGluIGdlbmVyYXRlZCBsb2NhbAorICAgICogW1RIUklGVC0xMjcwXSAtICB0aHJpZnQ6IGFkZCAtLWFsbG93LW5lZy1rZXlzIGFyZ3VtZW50IHRvIGFsbG93CisgICAgKiBbVEhSSUZULTEzNDVdIC0gQWxsb3cgYnVpbGRpbmcgd2l0aG91dCB0ZXN0cworICAgICogW1RIUklGVC0xMjg2XSAtIE1vZGVybml6ZSB0aGUgVGhyaWZ0IFJ1YnkgTGlicmFyeSBEZXYgRW52aXJvbm1lbnQKKyAgICAqIFtUSFJJRlQtMTI4NF0gLSAgdGhyaWZ0OiBmaXggcHJvY2Vzc29yIGluaGVyaXRhbmNlCisgICAgKiBbVEhSSUZULTEyODNdIC0gIHRocmlmdDogd3JhcCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oKSB0byA4MAorICAgICogW1RIUklGVC0xMjgyXSAtIFVwZ3JhZGUgaHR0cGNsaWVudCB0byA0LjEuMiAoZnJvbSA0LjAuMSkKKyAgICAqIFtUSFJJRlQtMTI4MV0gLSAgYWRkIEBnZW5lcmF0ZWQgdG8gdGhlIGRvY2Jsb2NrCisgICAgKiBbVEhSSUZULTEyODBdIC0gIFRocmlmdDogSW1wcm92ZSBNb25pdG9yIGV4Y2VwdGlvbi1mcmVlIGludGVyZmFjZXMKKyAgICAqIFtUSFJJRlQtMTI3OF0gLSBqYXZhZG9jIHdhcm5pbmdzIC0gY29tcGlsYXRpb24KKyAgICAqIFtUSFJJRlQtMTIyN10gLSBFcmxhbmcgaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IEpTT04gcHJvdG9jb2wKKyAgICAqIFtUSFJJRlQtMTI5NV0gLSBEdXBsaWNhdGUgaW5jbHVkZSBpbiBUU29ja2V0LmNwcAorICAgICogW1RIUklGVC0xMjk0XSAtICB0aHJpZnQ6IGZpeCBsb2cgbWVzc2FnZSB0eXBvcyBpbiBUU2ltcGxlU2VydmVyCisgICAgKiBbVEhSSUZULTEyOTNdIC0gIHRocmlmdDogaW1wcm92ZSBoYW5kbGluZyBvZiBleGNlcHRpb25zIHRocm93biBieQorICAgICogW1RIUklGVC0xMjkyXSAtICB0aHJpZnQ6IHNpbGVuY2UgbG9nIHNwZXcgZnJvbSBUVGhyZWFkZWRTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTI4OF0gLSAgQWxsb3cgdHlwZWRlZmVkIGV4Y2VwdGlvbnMgaW4gdGhyb3dzIGNsYXVzZXMKKyAgICAqIFtUSFJJRlQtMTI5MF0gLSAgdGhyaWZ0OiBUTm9uYmxvY2tpbmdTZXJ2ZXI6IGNsZWFuIHVwIHN0YXRlIGluIHRoZQorICAgICogW1RIUklGVC0xMjg3XSAtICB0aHJpZnQ6IHN0YXJ0IHJlZmFjdG9yaW5nIHNvbWUgb2YgdGhlIEMrKyBwcm9jZXNzb3IKKyAgICAqIFtUSFJJRlQtMTI4OV0gLSAgdGhyaWZ0OiBpbXBsZW1lbnQgVE5vbmJsb2NraW5nU2VydmVyOjpzdG9wKCkKKyAgICAqIFtUSFJJRlQtMTMwNV0gLSAgdGhyaWZ0OiBtYWtlIFRDb25uZWN0aW9uIGEgcHJpdmF0ZSBpbm5lciBjbGFzcyBvZgorICAgICogW1RIUklGVC0xMzA0XSAtICBUTm9uYmxvY2tpbmdTZXJ2ZXI6IHBhc3MgaW4gdGhlIGNvbm5lY3Rpb24gY29udGV4dCB0bworICAgICogW1RIUklGVC0xMzAyXSAtICB0aHJpZnQ6IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBzZW5kKCkgdGltZXMgb3V0IGluCisgICAgKiBbVEhSSUZULTEzMDFdIC0gIHRocmlmdDogY29uc29saWRhdGUgY29tbW9uIGNvZGUgaW4gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTEzNzddIC0gYWJvcnQgUEhQIGRlc2VyaWFsaXphdGlvbiBvbiB1bmtub3duIGZpZWxkIHR5cGUKKyAgICAqIFtUSFJJRlQtMTM3OV0gLSBmaXggdW5pbml0aWFsaXplZCBlbnVtIHZhbHVlcyBpbiB0aHJpZnQgQysrIG9iamVjdHMKKyAgICAqIFtUSFJJRlQtMTM3Nl0gLSBNYWtlIHBvcnQgc3BlY2lmaWNhdGlvbiBvcHRpb24gaW4gdGhyaWZ0IHJlbW90ZQorICAgICogW1RIUklGVC0xMzc1XSAtIGZpeGVkIGEgaGV4IGNoYXIgY29udmVyc2lvbiBidWcgaW4gVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0xMzczXSAtIEZpeCB1c2VyLWRlZmluZWQgZXhjZXB0aW9uIGdlbmVyYXRpb24gaW4gdGhyaWZ0IChweXRob24pCisgICAgKiBbVEhSSUZULTEzNjFdIC0gT3B0aW9uYWwgcmVwbGFjZW1lbnQgb2YgcHRocmVhZCBieSBib29zdDo6dGhyZWFkCisgICAgKiBbVEhSSUZULTEzMjBdIC0gQ29uc2lzdGVuY3kgb2YgY29uZmlndXJlIGdlbmVyYXRlZCBjb25maWcuaAorICAgICogW1RIUklGVC0xMzE3XSAtICBSZW1vdmUgY29weSBjb25zdHJ1Y3RpYmlsaXR5IGZyb20KKyAgICAqIFtUSFJJRlQtMTMxNl0gLSAgdGhyaWZ0OiB1cGRhdGUgc2VydmVyIGNsYXNzZXMgdG8gYWNjZXB0CisgICAgKiBbVEhSSUZULTEzMTVdIC0gIHRocmlmdDogZ2VuZXJhdGUgc2VydmVyIGludGVyZmFjZSBmYWN0b3J5IGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtMTMxNF0gLSAgdGhyaWZ0OiBhZGQgVFByb2Nlc3NvckZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTMzNV0gLSAgQWRkIGFjY2VwdCB0aW1lb3V0IHRvIFRTZXJ2ZXJTb2NrZXQKKyAgICAqIFtUSFJJRlQtMTMzNF0gLSAgQWRkIG1vcmUgaW5mbyB0byBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtMTMzM10gLSAgTWFrZSBSV0d1YXJkIG5vdCBjb3B5YWJsZQorICAgICogW1RIUklGVC0xMzMyXSAtIFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIGNsYXNzIHVzZXMgaGFyZCBjb2RlZCB2YWx1ZSBrZXlNYW5hZ2VyVHlwZTogU3VuWDUwOQorICAgICogW1RIUklGVC0xMjUxXSAtIEdlbmVyYXRlZCBqYXZhIGNvZGUgc2hvdWxkIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcmVxdWlyZWQgYW5kIHdoaWNoIGFyZSBvcHRpb25hbAorICAgICogW1RIUklGVC0xMzg3XSAtIEJ1aWxkIE1TVkMgbGlicmFyaWVzIHdpdGggQm9vc3QgVGhyZWFkcyBpbnN0ZWFkIG9mIFB0aHJlYWRzCisgICAgKiBbVEhSSUZULTEzMzldIC0gRXh0ZW5kIFR1cGxlIFByb3RvY29sIHRvIFRVbmlvbnMKKyAgICAqIFtUSFJJRlQtMTAzMV0gLSBQYXRjaCB0byBjb21waWxlIFRocmlmdCBmb3IgdmMrKyA5LjAgYW5kIDEwLjAKKyAgICAqIFtUSFJJRlQtMTEzMF0gLSBBZGQgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBzeW1ib2xpYyBkZWZhdWx0IHZhbHVlIGZvciBvcHRpb25hbCBib29sZWFuCisgICAgKiBbVEhSSUZULTExMjNdIC0gUGF0Y2ggdG8gY29tcGlsZSBUaHJpZnQgc2VydmVyIGFuZCBjbGllbnQgZm9yIHZjKysgOS4wIGFuZCAxMC4wCisgICAgKiBbVEhSSUZULTM4Nl0gLSBNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBQeXRob24gbGlicmFyeSB3aXRob3V0IHRoZSBleHRlbnNpb24KKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtMTQwMV0gLSBKU09OLXByb3RvY29sIGZvciBEZWxwaGkgWEUgTGlicmFyaWVzCisgICAgKiBbVEhSSUZULTExNjddIC0gSmF2YSBub25ibG9ja2luZyBzZXJ2ZXIgd2l0aCBtb3JlIHRoYW4gb25lIHRocmVhZCBmb3Igc2VsZWN0IGFuZCBoYW5kbGluZyBJTworICAgICogW1RIUklGVC0xMzY2XSAtIERlbHBoaSBnZW5lcmF0b3IsIGxpcmJyYXJ5IGFuZCB1bml0IHRlc3QuCisgICAgKiBbVEhSSUZULTEzNTRdIC0gQWRkIHJha2UgdGFzayB0byBidWlsZCBqdXN0IHRoZSBnZW0gZmlsZQorICAgICogW1RIUklGVC03NjldIC0gUGx1Z2dhYmxlIFNlcmlhbGl6ZXJzCisKKyMjIFN1Yi10YXNrCisgICAgKiBbVEhSSUZULTE0MTVdIC0gZGVscGhpOiBhZGQgdmVyc2lvbiBJbmZvIHRvIHRoZSBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTEzOTFdIC0gSW1wcm92ZWQgRGVscGhpIFhFIHRlc3QgY2FzZXMKKworCisKK1RocmlmdCAwLjcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMTE0MF0gLSBGcmFtZWQgVHJhbnNwb3J0IENsaWVudCB1c2luZyBDIChHbGliKSBMaWJyYXJ5IGhhbmdzIHdoZW4gY29ubmVjdGluZyB0byBSdWJ5IFNlcnZlcgorICAgICogW1RIUklGVC0xMTU0XSAtIEh0dHBDbGllbnQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgY29ubmVjdGlvbiBjbG9zZSBwYXJhbWV0ZXIKKyAgICAqIFtUSFJJRlQtMTE1M10gLSBIdHRwQ2xpZW50IGRvZXMgbm90IHNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gY2xvc2UgcGFyYW1ldGVyCisgICAgKiBbVEhSSUZULTExNDldIC0gTm9uYmxvY2tpbmcgc2VydmVyIGZhaWxzIHdoZW4gY2xpZW50IGNvbm5lY3Rpb24gaXMgcmVzZXQKKyAgICAqIFtUSFJJRlQtMTE0Nl0gLSBBbmRyb2lkIEluY29tcGF0aWJpbGl0eSA6IGluIEFuZHJvaWQgPCAyLjMgamF2YS5pby5JT0V4Y2VwdGlvbiBkb2Vzbid0IHN1cHBvcnQgZm9yIFRocm93YWJsZSBwYXJhbWV0ZXIgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMTEzM10gLSBKYXZhIGFuZCBKYXZhU2NyaXB0IHR1dG9yaWFsIGlzIGJyb2tlbiBzaW5jZSB3ZSBoYXZlIEphdmEgbWF2ZW4gZGVwbG95bWVudAorICAgICogW1RIUklGVC0xMTMyXSAtIERlc2VyaWFsaXphdGlvbiBlcnJvciBpbiBUQXBwbGljYXRpb25FeGNlcHRpb24gQyMKKyAgICAqIFtUSFJJRlQtMTEzMV0gLSBDIyBKU09OIFByb3RvY29sIGlzIHVuYWJsZSB0byBkZWNvZGUgZXNjYXBlZCBjaGFyYWN0ZXJzIGluIHN0cmluZworICAgICogW1RIUklGVC0xMjA4XSAtIHB5dGhvbiBUQ29tcGFjdFByb3RvY29sLnB5IHdyaXRlQm9vbCBhbmQgcmVhZEJvb2wgbm90IGZvbGxvdyB0aGUgY29tcGFjdC1wcm90by1zcGVjLTIudHh0IHNwZWMgZm9yIENPTlRBSU5FUl9XUklURSwgQ09OVEFJTkVSX1JFQUQKKyAgICAqIFtUSFJJRlQtMTIwMF0gLSBKUyBjb21waWxlciBnZW5lcmF0ZXMgY29kZSB0aGF0IGNsb2JiZXJzIGV4aXN0aW5nIG5hbWVzcGFjZXMKKyAgICAqIFtUSFJJRlQtMTE4M10gLSBQdXJlLXJ1YnkgQ29tcGFjdFByb3RvY29sIHJhaXNlcyBBcmd1bWVudEVycm9yIHdoZW4gZGVzZXJpYWxpemluZyB1bmRlciBSdWJ5IDEuOQorICAgICogW1RIUklGVC0xMTgyXSAtIE5hdGl2ZSBkZXNlcmlhbGl6ZXIgc2VnZmF1bHRzIG9uIGluY29ycmVjdCBsaXN0IGVsZW1lbnQgdHlwZQorICAgICogW1RIUklGVC0xMTgxXSAtIEFTMyBjb21waWxlciBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgZm9yIHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gY29uc3RydWN0b3IKKyAgICAqIFtUSFJJRlQtMTIzNF0gLSB0aHJpZnQgLS1oZWxwIGlzIG1pc3NpbmcgZG9jIG9uIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTExODBdIC0gQVMzIGNvbXBpbGVyIGdlbmVyYXRlcyB1bmNvbXBpbGFibGUgY29kZSBmb3IgYmluYXJ5IHR5cGVzLgorICAgICogW1RIUklGVC0xMTk0XSAtIEphdmEgbGliIGRvZXMgbm90IGluc3RhbGwgYXJ0aWZhY3RzIHRvIGxvY2FsIGRpciBjb3JyZWN0bHkKKyAgICAqIFtUSFJJRlQtMTE5M10gLSBQb3RlbnRpYWwgaW5maW5pdGUgbG9vcCBpbiBub25ibG9ja2luZ19zZXJ2ZXIKKyAgICAqIFtUSFJJRlQtMTE5Ml0gLSBUeXBvOiBUUHJvdG9jb2wuaCB0ZXN0cyBmb3IgSEFWRV9TWVNfUEFSQU1fSF8KKyAgICAqIFtUSFJJRlQtMTE5MF0gLSByZWFkQnVmZmVyQnl0ZXNBbGxvY2F0ZWQgaW4gVE5vbmJsb2NraW5nU2VydmVyLmphdmEgc2hvdWxkIGJlIEF0b21pY0xvbmcgdG8gZml4IEZEIGxlYWthZ2UgYW5kIGdlbmVyYWwgc2VydmVyIG1hbGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTExODddIC0gbm9uYmxvY2tpbmdfc2VydmVyIHNodXRkb3duIHJhY2UgdW5kZXIgUnVieSAxLjkKKyAgICAqIFtUSFJJRlQtMTE3OF0gLSBKYXZhOiBUQmFzZSBzaWduYXR1cmUgc2hvdWxkIGJlIFQgZXh0ZW5kcyBUQmFzZTw/LD8+CisgICAgKiBbVEhSSUZULTExNjRdIC0gU2VnbWVudGF0aW9uIGZhdWx0IG9uIE5VTEwgcG9pbnRlciBpbiB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QKKyAgICAqIFtUSFJJRlQtMTE3MV0gLSBQZXJsIHdyaXRlL3JlYWREb3VibGUgYXNzdW1lcyBsaXR0bGUtZW5kaWFuIHBsYXRmb3JtCisgICAgKiBbVEhSSUZULTEyMjJdIC0gVW5oYW5kbGVkIGV4Y2VwdGlvbiBmb3IgVEV2aHR0cFNlcnZlciByZXF1ZXN0CisgICAgKiBbVEhSSUZULTEyMjBdIC0gVFByb2Nlc3Nvcjo6cHJvY2VzcyBuZXZlciByZXR1cm5zIGZhbHNlCisgICAgKiBbVEhSSUZULTEyODVdIC0gU3RhYmxlIDAuNy4wIFdpbmRvd3MgY29tcGlsZXIgZXhlIGF2YWlsYWJsZSBvbiB0aGUgd2Vic2lkZSBpcyBub3QgdGhlIGdvb2Qgb25lCisgICAgKiBbVEhSSUZULTEyMThdIC0gY19nbGliIHVzZXMgd3JvbmcgbmFtZSBpbiBwa2ctY29uZmlnCisgICAgKiBbVEhSSUZULTEyMTVdIC0gVW5kZWZpbmVkIHByb3BlcnR5IFRoaXJmdCBpbiBsaWIvanMvdGhyaWZ0LmpzCisgICAgKiBbVEhSSUZULTEyMTFdIC0gV2hlbiB1c2luZyBUSHR0cENsaWVudCwgbm9uIDIwMCByZXNwb25zZXMgbGVhdmUgdGhlIGNvbm5lY3Rpb24gb3BlbgorICAgICogW1RIUklGVC0xMjI4XSAtIFRoZSBwaHAgYWNjZWxlcmF0b3IgbW9kdWxlIGNhbGxzIGZsdXNoIGluY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTEzMDhdIC0gbGliZmIzMDMtMC43LjAuamFyIG1pc3NpbmcgaW4gbWF2ZW4gcmVwb3NpdG9yeQorICAgICogW1RIUklGVC0xMjU1XSAtIE1pc21hdGNoIG9mIG1ldGhvZCBuYW1lIGJldHdlZW4gSmF2YU1FJ3MgbGliIGFuZCBnZW5lcmF0ZWQgY29kZSAoY29tcGFyZVRvL2NvbXBhcmVPYmplY3RzKQorICAgICogW1RIUklGVC0xMjUzXSAtIENvZGUgZ2VuZXJhdGVkIGZvciBtYXBzIGlzIG5vdCBjb21waWxpbmcKKyAgICAqIFtUSFJJRlQtMTI1Ml0gLSBTZWdmYXVsdCBpbiBSdWJ5IGRlc2VyaWFsaXplcgorICAgICogW1RIUklGVC0xMDk0XSAtIGJ1ZyBpbiBUQ29tcGFjdFByb3RvIHB5dGhvbiByZWFkTWVzc2FnZUVuZCBtZXRob2QgYW5kIHVwZGF0ZWQgdGVzdCBjYXNlcworICAgICogW1RIUklGVC0xMDkzXSAtIHNldmVyYWwgYnVncyBpbiBweXRob24gVENvbXBhY3RQcm90b2NvbAorICAgICogW1RIUklGVC0xMDkyXSAtIGdlbmVyYXRlZCB2YWxpZGF0ZSgpIG1ldGhvZCBoYXMgd3JvbmcgaW5kZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMTAxMV0gLSBFcnJvciBnZW5lcmF0aW5nIHBhY2thZ2UgaW1wb3J0cyB3aGVuIHVzaW5nIGNsYXNzZXMgZnJvbSBvdGhlciBwYWNrYWdlcworICAgICogW1RIUklGVC0xMDUwXSAtIERlY2xhcmluZyBhbiBhcmd1bWVudCBuYW1lZCAibWFuYWdlciIgdG8gYSBzZXJ2aWNlIG1ldGhvZCBwcm9kdWNlcyBjb2RlIHRoYXQgZmFpbHMgY29tcGlsZSBkdWUgdG8gbmFtZSBjb25mbGljdHMgd2l0aCBwcm90ZWN0ZWQgaXZhcnMgaW4gVEFzeW5jQ2xpZW50CisgICAgKiBbVEhSSUZULTEwNzRdIC0gLmtleXN0b3JlIGFuZCAudHJ1c3RzdG9yZSBhcmUgbWlzc2luZyBmcm9tIHRoZSAwLjYuMCBkaXN0cmlidXRpb24KKyAgICAqIFtUSFJJRlQtMTA2N10gLSBUb25zIG9mIGJ1Z3MgaW4gcGhwIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTEwNjVdIC0gVW5leHBlY3RlZCBleGNlcHRpb25zIG5vdCBwcm9wZXIgaGFuZGxlZCBvbiBKUworICAgICogW1RIUklGVC0xMDc2XSAtIEVybGFuZyBUaHJpZnQgc29ja2V0IHNlcnZlciBoYXMgYSBidWcgdGhhdCBjYXVzZXMgamF2YSB0aHJpZnQgY2xpZW50IG9mIGZyYW1lZCBiaW5hcnkgY2xpZW50IHRvIHRocm93ICJvdXQgb2Ygc2VxdWVuY2UiIGV4Y2VwdGlvbgorICAgICogW1RIUklGVC0xMDU3XSAtIGNhc3RzIGluIFRCaW5hcnlQcm90b2NvbC50Y2MgY2F1c2luZyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIiB3YXJuaW5ncyBmcm9tIGdjYworICAgICogW1RIUklGVC0xMDU1XSAtIGNzaGFycCBUU2VydmVyU29ja2V0IGFuZCBUU29ja2V0IGRvIG5vdCBkaXNhYmxlIE5hZ2xlIHZpYSBTb2NrZXQuTm9EZWxheSA9IHRydWUgbGlrZSBjcHAgYW5kIGphdmEgZG8KKyAgICAqIFtUSFJJRlQtMTA1NF0gLSBleHBsaWNpdCBjYWxsIHRvIFBLR19QUk9HX1BLR19DT05GSUcgaXMgbWlzc2luZyBhbmQgZmlyc3QgdXNlIG9mIFBLR19DSEVDS19NT0RVTEVTIG1heSBub3QgaGFwcGVuLCBjYXVzZXMgbW9ubyBkZXRlY3Rpb24gdG8gZmFpbAorICAgICogW1RIUklGVC0xMTE3XSAtIEphdmFTY3JpcHQgVW5pdCBUZXN0IGRvZXMgbm90IHdvcmsgYW55bW9yZSBiZWNhdXNlIGxpYnRocmlmdCouamFyIHdoZXJlIG1vdmVkIGJ5IE1hdmVuIERlcGxveW1lbnQKKyAgICAqIFtUSFJJRlQtMTExMV0gLSBUaGUgSFRNTCBnZW5lcmF0b3IgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeSB0eXBlcworICAgICogW1RIUklGVC0xMDMyXSAtICJtYWtlIGRpc3QiIGZhaWxzIGR1ZSB0byBjX2dsaWIgcHJvYmxlbQorICAgICogW1RIUklGVC0xMDM2XSAtIEF1dG8tZ2VuZXJhdGVkIEMrKyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgd2l0aCAiLVdlcnJvciAtV2V4dHJhIC1XYWxsIiBnKysgY29tcGlsZXIgZmxhZ3MKKyAgICAqIFtUSFJJRlQtMTA0MV0gLSBURGVzZXJpYWxpemVyIGhvbGRzIG9udG8gYSByZWZlcmVuY2Ugb2YgdGhlIGFycmF5IGl0IHJlYWRzIGFmdGVyIGl0IGlzIGRvbmUgZGVzZXJpYWxpemluZworICAgICogW1RIUklGVC0xMTA2XSAtIEMrKyBjb2RlIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmggJiBUQXN5bmNCdWZmZXJQcm9jZXNzb3IuaCBkb250IGhhdmUgdmlydHVhbCBmdW5jdGlvbnMgYnV0IG5vIHZpcnR1YWwgZGVzdHJ1Y3Rvci4gQ2F1c2VzIHdhcm5pbmdzIG9uIC1XYWxsCisgICAgKiBbVEhSSUZULTExMDVdIC0gT0NhbWwgZ2VuZXJhdG9yIGRvZXMgbm90IHByZWZpeCBtZXRob2RzIG9mIGluY2x1ZGVkIHN0cnVjdHMgd2l0aCB0aGVpciB0eXBlCisgICAgKiBbVEhSSUZULTExMDRdIC0gSU5TVEFMTERJUlMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGNvbmZpZ3VyZSBzY3JpcHQKKyAgICAqIFtUSFJJRlQtMTEwMl0gLSB0eXBvIGluIGNvbmZpZ3VyZS5hYzogIj09IiBvcGVyYXRvciBpbiAndGVzdCcgKGluc3RlYWQgb2YiJz0iKQorICAgICogW1RIUklGVC0xMTAxXSAtIGJ5dGVidWZmZXIgbGVuZ3RoIGNhbGN1bGF0aW9uIGluIFRCaW5hcnlQcm90b2NvbCB3cml0ZUJpbmFyeQorICAgICogW1RIUklGVC0xMDk4XSAtIFVuZGVmaW5lZCBwcm9wZXJ0aWVzIGluIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKKyAgICAqIFtUSFJJRlQtMTA4MV0gLSBQSFAgdGVzdHMgYnJva2VuIGFuZCBzb21ld2hhdCBpbmNvbXBsZXRlCisgICAgKiBbVEhSSUZULTEwODBdIC0gZXJsYW5nIHRlc3QncyAnbWFrZScgZmFpbHMgb24gTWFjIE9TWAorICAgICogW1RIUklGVC0xMDc4XSAtIFRocmlmdFRlc3QudGhyaWZ0IGdlbmVyYXRlcyBpbnZhbGlkIFBIUCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTExMjBdIC0gcHJvdG8uV3JpdGVMaXN0RW5kIGJlaW5nIGNhbGxlZCBpbiB0aGUgd3JvbmcgcGxhY2UKKyAgICAqIFtUSFJJRlQtMTExOV0gLSBUSlNPTlByb3RvY29sIGZhaWxzIHRvIFVURjggZGVjb2RlIHN0cmluZ3MKKyAgICAqIFtUSFJJRlQtODY3XSAtIFBIUCBhY2NlbGVyYXRvciBtb2R1bGUncyBvdXRwdXQgdHJhbnNwb3J0IGlzIGluY29tcGF0aWJsZSB3aXRoIFRGcmFtZWRUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtODI2XSAtIFBIUCBUU29ja2V0IFdyaXRlIFRpbWVvdXQKKyAgICAqIFtUSFJJRlQtODM1XSAtIEJhZCBBUzMgc3ludGF4IGluIGNvbnN0cnVjdG9ycyB0aGF0IHNldCBkZWZhdWx0IHZhbHVlcworICAgICogW1RIUklGVC03ODhdIC0gdGhyaWZ0X3Byb3RvY29sLnNvOiBtdWx0aWdldC9tdWx0aWdldF9zbGljZSBkb2VzIG5vdCBoYW5kbGUgbW9yZSB0aGFuIDE3IGtleXMgY29ycmVjdGx5CisgICAgKiBbVEhSSUZULTEyNV0gLSBPQ2FtbCBsaWJyYXJpZXMgZG9uJ3QgY29tcGlsZSB3aXRoIDMyLWJpdCBvY2FtbAorICAgICogW1RIUklGVC0zNDJdIC0gUEhQOiBjYW4ndCBoYXZlIHNldHMgb2YgY29tcGxleCB0eXBlcworICAgICogW1RIUklGVC03MzFdIC0gY29uZmlndXJlIGRvZXNuJ3QgY2hlY2sgZm9yIGFudCA+PSAxLjcKKyAgICAqIFtUSFJJRlQtNjkwXSAtIFVwZGF0ZSBUQXBwbGljYXRpb25FeGNlcHRpb24gY29kZXMKKyAgICAqIFtUSFJJRlQtNjM4XSAtIEJ1ZmZlcmVkVHJhbnNwb3J0ICsgQyBleHRlbnNpb25zIGJsb2NrIHVudGlsIHJlY3YgdGltZW91dCBpcyByZWFjaGVkIG9uIGxhc3QgZnJlYWQgY2FsbAorCisjIyBEZXBlbmRlbmN5IHVwZ3JhZGUKKyAgICAqIFtUSFJJRlQtMTE3N10gLSBVcGRhdGUgdGhyaWZ0IHRvIHJlZmxlY3QgY2hhbmdlcyBpbiBHbydzIG5ldHdvcmtpbmcgbGlicmFyaWVzCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTExNTVdIC0gUmVtb3ZlIGxvZzRqIGRlcGVuZGVuY3kgZnJvbSBqYXZhIGNsaWVudAorICAgICogW1RIUklGVC0xMTUxXSAtIFByb2R1Y2UgbW9yZSBpbmZvcm1hdGl2ZSBydW50aW1lIGVycm9yIGluIGNhc2Ugb2Ygc2NoZW1hIGFuZCBkYXRhIG1pc21hdGNoIGR1cmluZyBzZXJpYWxpemF0aW9uCisgICAgKiBbVEhSSUZULTEyMDddIC0gU3VwcG9ydCBERVNURElSIG9uICJtYWtlIGluc3RhbGwiIG9mIHJ1YnkgbGlicworICAgICogW1RIUklGVC0xMTk5XSAtIFVuaW9uIHN0cnVjdHMgc2hvdWxkIGhhdmUgZ2VuZXJhdGVkIG1ldGhvZHMgdG8gdGVzdCB3aGV0aGVyIGEgc3BlY2lmaWMgZmllbGQgaXMgY3VycmVudGx5IHNldAorICAgICogW1RIUklGVC0xMjMzXSAtIFJlbW92ZSB1bnVzZWQgaW5jbHVkZSBpbiBnZW5lcmF0ZWQgQysrIGNvZGUKKyAgICAqIFtUSFJJRlQtMTE4OV0gLSBSdWJ5IGRlc2VyaWFsaXplciBzcGVlZCBpbXByb3ZlbWVudHMKKyAgICAqIFtUSFJJRlQtMTE3MF0gLSBUaHJpZnQgR2VuZXJhdGVkIENvZGUgYW5kIEphdmEgNQorICAgICogW1RIUklGVC0xMTc0XSAtIFB1Ymxpc2ggYXMzIGNsaWVudCBpbXBsZW1lbnRhdGlvbiB2aWEgTWF2ZW4gZm9yIHVzZSBieSBmbGV4LW1vam9zIHVzZXJzCisgICAgKiBbVEhSSUZULTEyMjVdIC0gVENvbXBhY3RQcm90b2NvbCBmb3IgUEhQCisgICAgKiBbVEhSSUZULTEyMjFdIC0gUmVtb3ZlIFNpbXBsZUNhbGxiYWNrLmgKKyAgICAqIFtUSFJJRlQtMTIxN10gLSBVc2UgZXZ1dGlsX3NvY2tldHBhaXIgaW5zdGVhZCBvZiBwaXBlIChXaW5kb3dzIHBvcnQpCisgICAgKiBbVEhSSUZULTEyMTZdIC0gYnVpbGQgSmF2YSBMaWJyYXJ5IGJlaGluZCBhIHByb3h5CisgICAgKiBbVEhSSUZULTEyMzFdIC0gUmVtb3ZlIGJvZ3VzIGluY2x1ZGUKKyAgICAqIFtUSFJJRlQtMTIxM10gLSBNZW1idWZmZXIgc2hvdWxkIHByb3ZpZGUgYSB3YXkgdG8gZ2V0IGJhY2sgdGhlIGJ1ZmZlcgorICAgICogW1RIUklGVC0xMjM3XSAtIEphdmEgZmIzMDMgbWlzc2luZyBzb21lIG1ldGhvZHMKKyAgICAqIFtUSFJJRlQtMTA2M10gLSBGaXggRXJsYW5nIFR1dG9yaWFsIEZpbGVzCisgICAgKiBbVEhSSUZULTEwNTNdIC0gTWFrZSByZW1vdGUgY2xpZW50J3MgSVAgYWRkcmVzcyBhdmFpbGFibGUgZm9yIGFsbCBzb2NrZXQgcmVsYXRlZCB0cmFuc3BvcnRzCisgICAgKiBbVEhSSUZULTExMDldIC0gRGVwbG95IGZiMzAzIGFsb25nIHNpZGUgbGlidGhyaWZ0IHRvIG1hdmVuIHJlcG8KKyAgICAqIFtUSFJJRlQtMTEwN10gLSBpbXByb3ZlbWVudCBmb3IgY29tcGlsZXItZ2VuZXJhdGVkIHB5dGhvbiBmb3IgJ05vbmUnIG9iamVjdCBjb21wYXJpc29ucworICAgICogW1RIUklGVC0xMDY5XSAtIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHByZXZlbnQgdGhyaWZ0IGZyb20gaW5zZXJ0aW5nIGdlbi0qIGRpcmVjdG9yaWVzCisgICAgKiBbVEhSSUZULTEwNDldIC0gQWxsb3cgZm9yIFRTZXJ2ZXJTb2NrZXQgcHl0aG9uIGxpYnJhcnkgdG8gYmluZCB0byBhIHNwZWNpZmljIGhvc3QKKyAgICAqIFtUSFJJRlQtMTEyNl0gLSBFeHRlbmRpbmcgc3RydWN0X2luZm8gZm9yIGVybGFuZyBiaW5kaW5ncworICAgICogW1RIUklGVC0xMTAwXSAtIHB5dGhvbiBUU1NMU29ja2V0IGltcHJvdmVtZW50cywgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtOTk0XSAtIERvbid0IHRyeSB0byBpbnZva2UgcGhwaXplIGlmIHdlIGRvbid0IGhhdmUgaXQKKyAgICAqIFtUSFJJRlQtOTkzXSAtIFNvbWUgaW1wcm92ZW1lbnRzIGluIEMrKyBzdHVicyBmb3Igb25ld2F5IG9wZXJhdGlvbnMKKyAgICAqIFtUSFJJRlQtOTk3XSAtIFVzaW5nIHZhbHVlT2YgZm9yIGJhc2UgdHlwZXMgaW4gZ2V0RmllbGRWYWx1ZQorICAgICogW1RIUklGVC00MThdIC0gRG9uJ3QgZG8gcnVudGltZSBzb3J0aW5nIG9mIHN0cnVjdCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMTUxXSAtIFRTU0xTZXJ2ZXJTb2NrZXQgYW5kIFRTU0xTb2NrZXQgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMjddIC0gR2VuZXJhdGVkIGVybGFuZyB0eXBlcyBkb24ndCBjb250YWluIGRlZmF1bHQgdmFsdWVzIGZvciByZWNvcmRzCisgICAgKiBbVEhSSUZULTExM10gLSB0by1zdHJpbmcgbWV0aG9kcyBzaG91bGQgb21pdCBvcHRpb25hbCBudWxsIGZpZWxkcyBmcm9tIG91dHB1dAorICAgICogW1RIUklGVC0zNjNdIC0gTWF2ZW4gRGVwbG95CisgICAgKiBbVEhSSUZULTQ0N10gLSBNYWtlIGFuIGFic3RyYWN0IGJhc2UgQ2xpZW50IGNsYXNzIHNvIHdlIGNhbiBnZW5lcmF0ZSBsZXNzIGNvZGUKKyAgICAqIFtUSFJJRlQtNjI3XSAtIHNob3VsZCBjKysgaGF2ZSBzZXR0ZXJzIGZvciBvcHRpb25hbCBmaWVsZHM/CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEyMzZdIC0gRXJsYW5nIFJlY29ubmVjdGluZyBUaHJpZnQgQ2xpZW50CisgICAgKiBbVEhSSUZULTEwMjFdIC0gRnJhbWVkIHRyYW5zcG9ydCBzdXBwb3J0IGZvciBPQ2FtbAorICAgICogW1RIUklGVC0xMDY4XSAtIFB5dGhvbiBTU0wgU29ja2V0IFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMTEwM10gLSBUWmxpYlRyYW5zcG9ydCBmb3IgcHl0aG9uLCBhIHpsaWIgY29tcHJlc3NlZCB0cmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMTA4M10gLSBQcmVmb3JraW5nIHB5dGhvbiBwcm9jZXNzIHBvb2wgc2VydmVyCisgICAgKiBbVEhSSUZULTk5OV0gLSBBZGQgVEZvcmtpbmdTZXJ2ZXIKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTE1Ml0gLSBBdHRyaWJ1dGVzIGZyb20gcHJpdmF0ZSB0byBwcm90ZWN0ZWQKKyAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTg5Ml0gLSBSZWZhY3RvciBlcmxhbmcgYnVpbGQgc3lzdGVtIHdpdGggcmViYXIKKworIyMgV2lzaAorICAgICogW1RIUklGVC02MjVdIC0gQWRkIHN1cHBvcnQgZm9yICdHbycKKworCisKK1RocmlmdCAwLjYuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEJ1ZworICAgICogW1RIUklGVC0xMTMzXSAtIEphdmEgYW5kIEphdmFTY3JpcHQgdHV0b3JpYWwgaXMgYnJva2VuIHNpbmNlIHdlIGhhdmUgSmF2YSBtYXZlbiBkZXBsb3ltZW50CisgICAgKiBbVEhSSUZULTExMzFdIC0gQyMgSlNPTiBQcm90b2NvbCBpcyB1bmFibGUgdG8gZGVjb2RlIGVzY2FwZWQgY2hhcmFjdGVycyBpbiBzdHJpbmcKKyAgICAqIFtUSFJJRlQtMTA3NF0gLSAua2V5c3RvcmUgYW5kIC50cnVzdHN0b3JlIGFyZSBtaXNzaW5nIGZyb20gdGhlIDAuNi4wIGRpc3RyaWJ1dGlvbgorCisjIyBJbXByb3ZlbWVudAorICAgICogW1RIUklGVC0xMTA5XSAtIERlcGxveSBmYjMwMyBhbG9uZyBzaWRlIGxpYnRocmlmdCB0byBtYXZlbiByZXBvCisgICAgKiBbVEhSSUZULTM2M10gLSBNYXZlbiBEZXBsb3kKKworIyMgUXVlc3Rpb24KKyAgICAqIFtUSFJJRlQtMTIwNl0gLSBkaWQgdGhlIFRIUklGVCAwLjYuMSBtZXJnZSBUSFJJRlQtNTYzID8KKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTE2M10gLSBIb3cgY2FuIGkgdXNlIG11bHRpIHNlcnZpY2UgaW4gb25lIHByb2dyYW0/CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMTExMl0gLSBBcHBseSBUSFJJRlQtMzYzIHRvIDAuNiBicmFuY2gKKyAgICAqIFtUSFJJRlQtMTExM10gLSBBcHBseSBUSFJJRlQtMTA3NCB0byAwLjYgYnJhbmNoCisKKworCitUaHJpZnQgMC42CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgQnVnCisgICAgKiBbVEhSSUZULTEwMjBdIC0gT0NhbWwgY29tcGlsZXIgZ2VuZXJhdGVzIGludmFsaWQgT0NhbWwKKyAgICAqIFtUSFJJRlQtMTAxNV0gLSBUVW5pb24gZG9lcyBub3QgaGFuZGxlIEJ5dGVCdWZmZXIgaW4gdG9TdHJpbmcKKyAgICAqIFtUSFJJRlQtMTAxM10gLSBnZW5lcmF0ZWQgamF2YSBjb2RlIG1heSBoYXZlIG5hbWUgY2xhc2hlcyB3aXRoIHRocmlmdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTEwMDldIC0gVFVuaW9uIGRvZXMgbm90IGNvcnJlY3RseSBkZWVwIGNvcHkgYSBCeXRlQnVmZmVyCisgICAgKiBbVEhSSUZULTEwMzJdIC0gIm1ha2UgZGlzdCIgZmFpbHMgZHVlIHRvIGNfZ2xpYiBwcm9ibGVtCisgICAgKiBbVEhSSUZULTg2OF0gLSBSZWZlcmVuY2luZyBjb25zdGFudCB2YWx1ZXMgZG9lc24ndCB3b3JrIHdpdGggd2l0aCB0eXBlZGVmIHR5cGVzCisgICAgKiBbVEhSSUZULTk3MV0gLSBqYXZhIG1vZHVsZSBjYW4ndCBiZSBjb21waWxlZCB3aXRob3V0IGl2eSBhbmQgbmV0d29yayBjb25uZWN0aW9uCisgICAgKiBbVEhSSUZULTk3MF0gLSBVbmRlciBoZWF2eSBsb2FkLCBUSHR0cENsaWVudCBtYXkgZmFpbCB3aXRoICJ0b28gbWFueSBvcGVuIGZpbGVzIgorICAgICogW1RIUklGVC05NjldIC0gSmF2YSBUdXRvcmlhbCBicm9rZW4sIG1vdmUgQ2FsY3VsYXRvckhhbmRsZXIgdG8gYSBzZXBhcmF0ZSBmaWxlCisgICAgKiBbVEhSSUZULTgwN10gLSBKYXZhU2NyaXB0OiBJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIHdpdGggMCBpbnN0ZWFkIG9mIG51bGwKKyAgICAqIFtUSFJJRlQtOTU1XSAtIFRocmlmdCBjb21waWxlciBmb3IgV2luZG93cyB1c2VzIGxvd2VyY2FzZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgd2hpY2ggaXMgaW5jb25zaXN0ZW50IHdpdGggY29tcGlsaW5nIG9uIG90aGVyIHBsYXRmb3JtcworICAgICogW1RIUklGVC05OTJdIC0gTmFtaW5nIGNvbnZlbnRpb24gaW4gQyMgY29uc3RydWN0b3IgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmaWVsZHMgY2F1c2VzIGNvbXBpbGUgZXJyb3JzCisgICAgKiBbVEhSSUZULTEwMDhdIC0gYnl0ZVtdIGFjY2Vzc29ycyB0aHJvdyBOUEUgb24gdW5zZXQgZmllbGQKKyAgICAqIFtUSFJJRlQtMTAwNl0gLSBJbXBvc3NpYmxlIHRvIGNvcnJlY3RseSBxdWFsaWZ5IGFuIGVudW0gY29uc3RhbnQgaW4gYW4gZXh0ZXJuYWwgdGhyaWZ0IGZpbGUKKyAgICAqIFtUSFJJRlQtOTUwXSAtIEhhc2tlbGwgYmluZGluZ3MgdHJlYXQgJ2J5dGUnIGFzIHVuc2lnbmVkIDgtYml0IGludCAoRGF0YS5Xb3JkLldvcmQ4KSwgamF2YS9jcHAgYXMgc2lnbmVkIChieXRlL2ludDhfdCkuCisgICAgKiBbVEhSSUZULTk3NV0gLSBsaWIvY19nbGliL1JFQURNRSBpcyBtaXNzaW5nID0+IGJyZWFrcyBtYWtlIGRpc3QKKyAgICAqIFtUSFJJRlQtOTQ0XSAtIFN1cHBvcnQgYWxsIHZlcnNpb24tNHMgb2YgYmFzZQorICAgICogW1RIUklGVC05MzldIC0gb3B0aW9uYWwgYmluYXJ5IGZpZWxkcyB0aHJvdyBOUEUgb24gZGVmYXVsdCBieXRlW10gZ2V0dGVycworICAgICogW1RIUklGVC05MzVdIC0gUEhQIEV4dGVuc2lvbiBhYm9ydHMgdGhlIGJ1aWxkIGlmIHBocC1jb25maWcgaXMgbm90IGluc3RhbGxlZAorICAgICogW1RIUklGVC05MzNdIC0gSGFza2VsbCdzIFRocmlmdC5jYWJhbCBoYXMgd2FybmluZ3MKKyAgICAqIFtUSFJJRlQtOTMyXSAtIEhhc2tlbGwgdGVzdHMgbmVlZCB0byBiZSBydW4gdGhyb3VnaCAnbWFrZSBjaGVjaycgKGFuZCBwcm9iYWJseSAnY2FiYWwgY2hlY2snKSB0b28KKyAgICAqIFtUSFJJRlQtOTA0XSAtIEMjIFRTb2NrZXQgc2hvdWxkIGRpc2FibGUgbmFnbGUgYW5kIGxpbmdlcgorICAgICogW1RIUklGVC05NDFdIC0gTWFrZSBQSFAgQyBFeHRlbnNpb24gdXNlIHRoZSBkZWZpbmVkIFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTk0MF0gLSAnbWFrZSBjaGVjaycgZmFpbHMgaWYgYm9vc3QgaXMgbm90IGluIHRoZSBzdGQgaW5jbHVkZSBhbmQgbGluayBwYXRocworICAgICogW1RIUklGVC05MjRdIC0gRml4IGdlbmVyYXRlZCBwaHAgc3RydWN0dXJlIGNvbnN0YW50cworICAgICogW1RIUklGVC05NzldIC0gcnVieSBiaW5kaW5ncyB1c2VkIHRvIHdvcmsgb24ganJ1YnkKKyAgICAqIFtUSFJJRlQtOTc3XSAtIEhleCBDb252ZXJzaW9uIEJ1ZyBpbiBDKysgVEpTT05Qcm90b2NvbAorICAgICogW1RIUklGVC0zNDddIC0gUEhQIFRTb2NrZXQgVGltZW91dCBJc3N1ZXMKKyAgICAqIFtUSFJJRlQtNTE3XSAtIFRFeGNlcHRpb25zIHRocm93biBieSBzZXJ2ZXIgcmVzdWx0IGluIGNyeXB0aWMgZXJyb3IgbWVzc2FnZSBvbiBjbGllbnQgLSBUcmllZCB0byByZWFkIDQgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAwIGJ5dGVzCisKKyMjIEltcHJvdmVtZW50CisgICAgKiBbVEhSSUZULTEwMjRdIC0gQWRkIFB5dGhvbiBUd2lzdGVkIGV4YW1wbGUgdG8gdGhlIFR1dG9yaWFsCisgICAgKiBbVEhSSUZULTk1OF0gLSBDaGFuZ2UgYWNjZXNzbW9kaWZlciBvbiB0cmFuc18gZmllbGQgaW4gdGhlIEZyYW1lQnVmZmVyIGNsYXNzIHRvIHB1YmxpYy4KKyAgICAqIFtUSFJJRlQtOTU3XSAtIFRIc0hhU2VydmVyOiBDaGFuZ2UgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBpbnZva2VyIGZpZWxkLgorICAgICogW1RIUklGVC0xMDAyXSAtIENvZGVTdHlsZTogdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCisgICAgKiBbVEhSSUZULTEwMDVdIC0gR2l2ZSB1bmlvbnMgYnl0ZVtdIHNpZ25hdHVyZSBtZXRob2RzIHRvIGdvIGFsb25nIHdpdGggdGhlaXIgQnl0ZUJ1ZmZlciBjb3VudGVycGFydHMKKyAgICAqIFtUSFJJRlQtOTUxXSAtIEFkZCBhIG5ldyBpc1NlcnZpbmcoKSBtZXRob2QgdG8gVFNlcnZlcgorICAgICogW1RIUklGVC05NDNdIC0gU2lsbHkgcmVhZG1lIHR5cG8gZml4LgorICAgICogW1RIUklGVC05NjFdIC0gSmF2YVNjcmlwdCBUZXN0U3VpdGUgdXNpbmcgYW50L2l2eSBhbmQgSmF2YSdzIFNlcnZlclRlc3RCYXNlIEhhbmRsZXIKKyAgICAqIFtUSFJJRlQtOTYwXSAtIGFkZCBUZXN0U2VydmVyLCBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgYW5kIFRlc3RDbGllbnQgYWdhaW4KKyAgICAqIFtUSFJJRlQtOTQ5XSAtIE1vZGlmeSB0aGUgVEVudW0gaW50ZXJmYWNlIHNvIGl0IGRlZmluZXMgYSBtZXRob2Qgc2ltaWxhciB0byBmaW5kQnlWYWx1ZQorICAgICogW1RIUklGVC05NDZdIC0gQXVnbWVudCBGaWVsZFZhbHVlTWV0YURhdGEgc28gaXQgZGlmZmVyZW50aWF0ZXMgJ3N0cmluZycgYW5kICdiaW5hcnknIGZpZWxkcy4KKyAgICAqIFtUSFJJRlQtOTAzXSAtIGN1c3RvbSBUaHJlYWRGYWN0b3J5IGluIFRIc0hhU2VydmVyCisgICAgKiBbVEhSSUZULTkxM10gLSBUZXN0IENhc2UgZm9yIFVybCBlbmNvZGVkIHN0cmluZ3MgKyBzaW1wbGUgZW5oYW5jZW1lbnQgdG8gbGliL2pzL3Rlc3QvUnVuVGVzdFNlcnZlci5zaAorICAgICogW1RIUklGVC05MjZdIC0gTWlzY2VsbGFuZW91cyBDKysgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTkyOV0gLSBJbXByb3ZlbWVudHMgdG8gdGhlIEMrKyB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTg5M10gLSBhZGQgSmF2YVNjcmlwdCB0byB0aGUgdHV0b3JpYWwgZXhhbXBsZXMKKyAgICAqIFtUSFJJRlQtMTAwM10gLSBQb2xpc2hpbmcgY19nbGliIGNvZGUKKyAgICAqIFtUSFJJRlQtNzFdIC0gRGViaWFuIHBhY2thZ2luZyBmb3IgdGhyaWZ0CisKKyMjIE5ldyBGZWF0dXJlCisgICAgKiBbVEhSSUZULTEwMzNdIC0gTm9kZS5qcyBsYW5ndWFnZSB0YXJnZXQKKyAgICAqIFtUSFJJRlQtOTQ3XSAtIFByb3ZpZGUgYSBoZWxwZXIgbWV0aG9kIHRvIGRldGVybWluZSB0aGUgVFByb3RvY29sIHVzZWQgdG8gc2VyaWFsaXplIHNvbWUgZGF0YS4KKyAgICAqIFtUSFJJRlQtOTI4XSAtIE1ha2UgbW9yZSBzdGF0aXN0aWNzIGF2YWlsYWJsZSBpbiBDKysgc2VydmVycworICAgICogW1RIUklGVC05MjJdIC0gVGVtcGxhdGl6ZWQgW2RlXXNlcmlhbGl6YXRpb24gY29kZSBmb3IgQysrCisgICAgKiBbVEhSSUZULTkyM10gLSBFdmVudC1kcml2ZW4gY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgQysrCisgICAgKiBbVEhSSUZULTkyNV0gLSBQcm92aWRlIG5hbWU8LT52YWx1ZSBtYXAgZm9yIGVudW1zIGluIEMrKworICAgICogW1RIUklGVC05MjddIC0gQWRkIG9wdGlvbiB0byBtb2RpZnkgdGhlIFBIUCBpbmNsdWRlIHBhdGgKKyAgICAqIFtUSFJJRlQtMzc3XSAtIFRGaWxlVHJhbnNwb3J0IHBvcnQgaW4gSmF2YQorICAgICogW1RIUklGVC0xMDZdIC0gVFNTTFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC01ODJdIC0gQyBpbXBsZW1lbnRhdGlvbiBvZiBUaHJpZnQKKyAgICAqIFtUSFJJRlQtNzQ1XSAtIE1ha2UgaXQgZWFzaWVyIHRvIGluc3RhbnRpYXRlIHNlcnZlcnMKKworIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMTAzOF0gLSBHZW5lcmF0ZWQgSmF2YSBjb2RlIGZvciBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYmluYXJ5IGZpZWxkcyAob3IgY29sbGVjdGlvbnMgdGhlcmVvZikgYXJlIG5vdCBzZXJpYWxpemFibGUgKGluIHRoZSBKYXZhIHNlbnNlKSBldmVuIHRob3VnaCB0aGV5IGltcGxlbWVudCBqYXZhLmlvLlNlcmlhbGl6YWJsZQorCisjIyBUYXNrCisgICAgKiBbVEhSSUZULTg2Ml0gLSBBc3luYyBjbGllbnQgaXNzdWVzIC8gaW1wcm92ZW1lbnRzCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtNTgxXSAtIEFkZCBhIHRlc3RzdWl0ZSBmb3IgdHhUaHJpZnQgKFR3aXN0ZWQpCisKKworCitUaHJpZnQgMC41LjAgLSBJbmN1YmF0aW5nCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogVEhSSUZULTUwNSAgIEJ1aWxkICAgICAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIGdpdmUgYSBzdW1tYXJ5IG9mIHRoZSBlbmFibGVkIGNvbXBvbmVudHMgKERhdmlkIFJlaXNzKQogVEhSSUZULTUwNiAgIEJ1aWxkICAgICAgICAgICAgICAgIEFsbG93IFRocmlmdCB0byBiZSBidWlsdCB3aXRob3V0IHRoZSBDKysgbGlicmFyeSAoRGF2aWQgUmVpc3MpCiBUSFJJRlQtODQ0ICAgQnVpbGQgICAgICAgICAgICAgICAgQnVpbGQgUmVxdWlyZW1lbnRzIHN0YXRlIGF1dG9jb25mIDIuNTkrIGlzIHJlcXVpcmVkLCBidXQgMi42MCsgaXMgbmVlZGVkIChIYXJsYW4gTGllYmVybWFuLUJlcmcpCkBAIC01NjQsOCArMjgzNSw4IEBACiBUSFJJRlQtNDU2ICAgVGVzdCBTdWl0ZSAgICAgICAgICAgQmFkIElQIGFkZHJlc3Mgc3RyaW5nIGluIHRlc3QvY3BwL3NyYy9tYWluLmNwcCAoUnVzaCBNYW5iZXJ0KQogCiAKLVZlcnNpb24gMC40LjAKLQorVGhyaWZ0IDAuNC4wIC0gSW5jdWJhdGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRIUklGVC02NTAgICBCdWlsZCAgICAgICAgTWFrZSBDaGVjayBmYWlscyBvbiBDZW50b3MvT1NYIHdpdGggMC4yLjAgdGFyYmFsbCAoQW50aG9ueSBNb2xpbmFybykKIFRIUklGVC03NzAgICBCdWlsZCAgICAgICAgR2V0ICdtYWtlIGRpc3QnIHRvIHdvcmsgd2l0aG91dCBmaXJzdCBjb21waWxpbmcgc291cmNlIGNvZGUgKEFudGhvbnkgTW9saW5hcm8pCiBUSFJJRlQtMTYwICAgQyMgICAgICAgICAgIENyZWF0ZWQgVEh0dHBUcmFuc3BvcnQgZm9yIHRoZSBDIyBsaWJyYXJ5IGJhc2VkIG9uIFdlYkh0dHBSZXF1ZXN0IChNaWNoYWVsIEdyZWVuZSkKQEAgLTYxMyw4ICsyODg0LDggQEAKIFRIUklGVC00NTkgICBSdWJ5ICAgICAgICAgUnVieSBpbnN0YWxsYXRpb24gYWx3YXlzIHRyaWVzIHRvIHdyaXRlIHRvIC9MaWJyYXJ5L1J1Ynkvc2l0ZSAoTWF0dGhpZXUgSW1iZXJ0KQogCiAKLVZlcnNpb24gMC4xLjAgUkMxIC8gVW5yZWxlYXNlZAotCitUaHJpZnQgMC4xLjAgLSBJbmN1YmF0aW5nIChub3QgcmVsZWFzZWQpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQ29tcGF0aWJpbGl0eSBCcmVha2luZyBDaGFuZ2VzOgogICBDKys6CiAgICAgKiBJdCdzIHF1aXRlIHBvc3NpYmxlIHRoYXQgcmVnZW5lcmF0aW5nIGNvZGUgYW5kIHJlYnVpbGRpbmcgd2lsbCBiZQpAQCAtNjMxLDggKzI5MDIsNyBAQAogICBFcmxhbmc6CiAgICAgKiBHZW5lcmF0ZWQgY29kZSB3aWxsIGhhdmUgdG8gYmUgcmVnZW5lcmF0ZWQsIGFuZCB0aGUgbmV3IGNvZGUgd2lsbAogICAgICAgaGF2ZSB0byBiZSBkZXBsb3llZCBhdG9taWNhbGx5IHdpdGggdGhlIG5ldyBsaWJyYXJ5IGNvZGUgW1RIUklGVC0xMzZdCi0gIAotICAKKwogTmV3IEZlYXR1cmVzIGFuZCBCdWcgRml4ZXM6CiAgIEMrKzoKICAgICAqIFN1cHBvcnQgZm9yIFRDb21wYWN0UHJvdG9jb2wgW1RIUklGVC0zMzNdCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTdhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDEyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjEpCisKKyMgQ01ha2UgMy4xIHN1cHBvcnRzIEMrKyBzdGFuZGFyZHMgc2VsZWN0aW9uIHdpdGggQ01BS0VfQ1hYX1NUQU5EQVJECisjIElmIHlvdSBuZWVkIENNYWtlIDMuMSsgZm9yIFVidW50dSAxNC4wNCwgdHJ5CisjICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L35nZW9yZ2UtZWRpc29uNTUvK2FyY2hpdmUvdWJ1bnR1L2NtYWtlLTMueAorIyBJZiB5b3UgbmVlZCBDTWFrZSAzLjErIGZvciBkZWJpYW4gImplc3NpZSIsIGdldCBpdCBmcm9tIGplc3NpZS1iYWNrcG9ydHMKKyMgT3RoZXJ3aXNlCisjICAgaHR0cDovL2NtYWtlLm9yZworCitwcm9qZWN0KCJBcGFjaGUgVGhyaWZ0IikKKworc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX01PRFVMRV9QQVRIfSIgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9idWlsZC9jbWFrZSIpCisKKyMgVE9ETzogYWRkIGBnaXQgcmV2LXBhcnNlIC0tc2hvcnQgSEVBRGAKKyMgUmVhZCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBBdXRvY29uZiBmaWxlCitmaWxlIChTVFJJTkdTICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29uZmlndXJlLmFjIiBDT05GSUdVUkVfQUMgUkVHRVggIkFDX0lOSVRcXCguKlxcKSIgKQorCisjIFRoZSBmb2xsb3dpbmcgdmFyaWFibGUgaXMgdXNlZCBpbiB0aGUgdmVyc2lvbi5oLmluIGZpbGUKK3N0cmluZyhSRUdFWCBSRVBMQUNFICJBQ19JTklUXFwoXFxbLipcXF0sIFxcWyhbMC05XStcXC5bMC05XStcXC5bMC05XSsoLWRldik/KVxcXVxcKSIgIlxcMSIgUEFDS0FHRV9WRVJTSU9OICR7Q09ORklHVVJFX0FDfSkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHBhY2thZ2UgdmVyc2lvbjogJHtQQUNLQUdFX1ZFUlNJT059IikKKworIyBUaGVzZSBhcmUgaW50ZXJuYWwgdG8gQ01ha2UKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rXFwuWzAtOV0rXFwuWzAtOV0rKSgtZGV2KT8iICJcXDEiIHRocmlmdF9WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKK3N0cmluZyhSRUdFWCBSRVBMQUNFICIoWzAtOV0rKVxcLlswLTldK1xcLlswLTldKyIgIlxcMSIgdGhyaWZ0X1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTn0pCitzdHJpbmcoUkVHRVggUkVQTEFDRSAiWzAtOV0rXFwuKFswLTldKStcXC5bMC05XSsiICJcXDEiIHRocmlmdF9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT059KQorc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlswLTldK1xcLlswLTldK1xcLihbMC05XSspIiAiXFwxIiB0aHJpZnRfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OfSkKK21lc3NhZ2UoU1RBVFVTICJQYXJzZWQgVGhyaWZ0IHZlcnNpb246ICR7dGhyaWZ0X1ZFUlNJT059ICgke3RocmlmdF9WRVJTSU9OX01BSk9SfS4ke3RocmlmdF9WRVJTSU9OX01JTk9SfS4ke3RocmlmdF9WRVJTSU9OX1BBVENIfSkiKQorCisjIFNvbWUgZGVmYXVsdCBzZXR0aW5ncworaW5jbHVkZShEZWZpbmVDTWFrZURlZmF1bHRzKQorCisjIEJ1aWxkIHRpbWUgb3B0aW9ucyBhcmUgZGVmaW5lZCBoZXJlCitpbmNsdWRlKERlZmluZU9wdGlvbnMpCitpbmNsdWRlKERlZmluZUluc3RhbGxhdGlvblBhdGhzKQorCisjIEJhc2VkIG9uIHRoZSBvcHRpb25zIHNldCBzb21lIHBsYXRmb3JtIHNwZWNpZmljcworaW5jbHVkZShEZWZpbmVQbGF0Zm9ybVNwZWNpZmMpCisKKyMgR2VuZXJhdGUgdGhlIGNvbmZpZy5oIGZpbGUKK2luY2x1ZGUoQ29uZmlndXJlQ2hlY2tzKQorCisjIFBhY2thZ2UgaXQKK2luY2x1ZGUoQ1BhY2tDb25maWcpCisKKworZmluZF9wYWNrYWdlKFRocmVhZHMpCisKK2luY2x1ZGUoQ1Rlc3QpCitpZihCVUlMRF9URVNUSU5HKQorICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aCB1bml0dGVzdHMiKQorCisgIGVuYWJsZV90ZXN0aW5nKCkKKyAgIyBEZWZpbmUgIm1ha2UgY2hlY2siIGFzIGFsaWFzIGZvciAibWFrZSB0ZXN0IgorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjayBDT01NQU5EIGN0ZXN0KQorZWxzZSAoKQorICBtZXNzYWdlKFNUQVRVUyAiQnVpbGRpbmcgd2l0aG91dCB0ZXN0cyIpCitlbmRpZiAoKQorCitpZihCVUlMRF9DT01QSUxFUikKKyAgICBpZihOT1QgRVhJU1RTICR7VEhSSUZUX0NPTVBJTEVSfSkKKyAgICAgICAgc2V0KFRIUklGVF9DT01QSUxFUiAkPFRBUkdFVF9GSUxFOnRocmlmdC1jb21waWxlcj4pCisgICAgZW5kaWYoKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVyL2NwcCkKK2Vsc2VpZihFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1jb21waWxlciBJTVBPUlRFRCkKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIHRocmlmdC1jb21waWxlciBQUk9QRVJUWSBJTVBPUlRFRF9MT0NBVElPTiAke1RIUklGVF9DT01QSUxFUn0pCitlbmRpZigpCisKK2lmKEJVSUxEX0NQUCkKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvY3BwKQorICAgIGlmKEJVSUxEX1RVVE9SSUFMUykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdHV0b3JpYWwvY3BwKQorICAgIGVuZGlmKCkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBpZihXSVRIX0xJQkVWRU5UIEFORCBXSVRIX1pMSUIgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICAgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvY3BwKQorICAgICAgICBlbHNlKCkKKyAgICAgICAgICAgIG1lc3NhZ2UoV0FSTklORyAibGliZXZlbnQgYW5kL29yIFpMSUIgYW5kL29yIE9wZW5TU0wgbm90IGZvdW5kIG9yIGRpc2FibGVkOyB3aWxsIG5vdCBidWlsZCBzb21lIHRlc3RzIikKKyAgICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfQ19HTElCKQorICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2xpYi9jX2dsaWIpCitlbmRpZigpCisKK2lmKEJVSUxEX0pBVkEpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2phdmEpCitlbmRpZigpCisKK2lmKEJVSUxEX1BZVEhPTikKKyAgICBhZGRfc3ViZGlyZWN0b3J5KCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9saWIvcHkpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdC9weSkKKyAgICBlbmRpZigpCitlbmRpZigpCisKK2lmKEJVSUxEX0hBU0tFTEwpCisgICAgYWRkX3N1YmRpcmVjdG9yeSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vbGliL2hzKQorICAgIGlmKEJVSUxEX1RFU1RJTkcpCisgICAgICAgIGFkZF9zdWJkaXJlY3RvcnkoJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvaHMpCisgICAgZW5kaWYoKQorZW5kaWYoKQorCitQUklOVF9DT05GSUdfU1VNTUFSWSgpCmRpZmYgLS1naXQgYS9DT05UUklCVVRJTkcubWQgYi9DT05UUklCVVRJTkcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExZDcxMAotLS0gL2Rldi9udWxsCisrKyBiL0NPTlRSSUJVVElORy5tZApAQCAtMCwwICsxLDExNiBAQAorIyBIb3cgdG8gQ29udHJpYnV0ZSAjCisKK1RoYW5rIHlvdSBmb3IgeW91ciBpbnRlcmVzdCBpbiBjb250cmlidXRpbmcgdG8gdGhlIEFwYWNoZSBUaHJpZnQgcHJvamVjdCEgIEluZm9ybWF0aW9uIG9uIHdoeSBhbmQgaG93IHRvIGNvbnRyaWJ1dGUgaXMgYXZhaWxhYmxlIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB3ZWIgc2l0ZS4gSW4gcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcgdG8gYmVjb21lIGFjcXVhaW50ZWQgd2l0aCBBcGFjaGUgQ29udHJpYnV0aW9uczoKKworICogW0NvbnRyaWJ1dG9ycyBUZWNoIEd1aWRlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L2NvbnRyaWJ1dG9ycykKKyAqIFtHZXQgaW52b2x2ZWQhXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9nZXRpbnZvbHZlZC5odG1sKQorICogW0xlZ2FsIGFzcGVjdHMgb24gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zIChQYXRjaGVzKV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwjY29udHJpYnV0aW9ucykKKworIyMgR2l0SHViIHB1bGwgcmVxdWVzdHMgIyMKKworVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiBzdWJtaXR0aW5nIGNoYW5nZXMuICBXaGVuIHlvdSBzdWJtaXQgYSBwdWxsIHJlcXVlc3QgdGhyb3VnaCBnaXRodWIsCitpdCBhY3RpdmF0ZXMgdGhlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gKENJKSBidWlsZCBzeXN0ZW1zIGF0IEFwcHZleW9yIGFuZCBUcmF2aXMgdG8gYnVpbGQgeW91ciBjaGFuZ2VzeGkKK29uIGEgdmFyaWV0eSBvZiBMaW51eCBhbmQgV2luZG93cyBjb25maWd1cmF0aW9ucyBhbmQgcnVuIGFsbCB0aGUgdGVzdCBzdWl0ZXMuICBGb2xsb3cgdGhlc2UgcmVxdWlyZW1lbnRzIAorZm9yIGEgc3VjY2Vzc2Z1bCBwdWxsIHJlcXVlc3Q6CisKKyAxLiBBbGwgY29kZSBjaGFuZ2VzIHJlcXVpcmUgYW4gW0FwYWNoZSBKaXJhIFRIUklGVCBJc3N1ZV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgdGlja2V0LgorCisgMS4gQWxsIHB1bGwgcmVxdWVzdHMgc2hvdWxkIGNvbnRhaW4gYSBzaW5nbGUgY29tbWl0IHBlciBpc3N1ZSwgb3Igd2Ugd2lsbCBhc2sgeW91IHRvIHNxdWFzaCBpdC4KKyAxLiBUaGUgcHVsbCByZXF1ZXN0IHRpdGxlIG11c3QgYmVnaW4gd2l0aCB0aGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIsIGZvciBleGFtcGxlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBhbiBleGFtcGxlIHB1bGwgcmVxdWVzdCB0aXRsZQorICAgICAgICAKKyAxLiBDb21taXQgbWVzc2FnZXMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuIGZvciBjb2RlIGNoYW5nZXMgKGRldmlhdGlvbnMgd2lsbCBub3QgYmUgbWVyZ2VkKToKKyAgICAgICAgCisgICAgICAgIFRIUklGVC05OTk5OiBbc3VtbWFyeSBvZiBmaXgsIG9uZSBsaW5lIGlmIHBvc3NpYmxlXQorICAgICAgICBDbGllbnQ6IFtsYW5ndWFnZShzKSBhZmZlY3RlZCwgY29tbWEgc2VwYXJhdGVkLCB1c2UgbGliLyBkaXJlY3RvcnkgbmFtZXMgcGxlYXNlXQorCitJbnN0cnVjdGlvbnM6CisKKyAxLiBDcmVhdGUgYSBmb3JrIGluIHlvdXIgR2l0SHViIGFjY291bnQgb2YgaHR0cDovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorIDEuIENsb25lIHRoZSBmb3JrIHRvIHlvdXIgZGV2ZWxvcG1lbnQgc3lzdGVtLgorIDEuIENyZWF0ZSBhIGJyYW5jaCBmb3IgeW91ciBjaGFuZ2VzIChiZXN0IHByYWN0aWNlIGlzIGlzc3VlIGFzIGJyYW5jaCBuYW1lLCBlLmcuIFRIUklGVC05OTk5KS4KKyAxLiBNb2RpZnkgdGhlIHNvdXJjZSB0byBpbmNsdWRlIHRoZSBpbXByb3ZlbWVudC9idWdmaXgsIGFuZDoKKworICAgICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0dGVkIGNoYW5nZXMhCisgICAgKiBVc2UgdGVzdC1kcml2ZW4gZGV2ZWxvcG1lbnQgKFRERCk6IGFkZCBhIHRlc3QgdGhhdCB3aWxsIGlzb2xhdGUgdGhlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyB0aGUgY2hhbmdlIHRoYXQgZml4ZXMgaXQuCisgICAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2RvY3MvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykuCisgICAgKiBbKm9wdGlvbmFsKl0gVmVyaWZ5IHRoYXQgeW91ciBjaGFuZ2Ugd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zIGJ5IGFkZGluZyBhIEdpdEh1YiBzZXJ2aWNlIGhvb2sgdG8gW1RyYXZpcyBDSV0oaHR0cDovL2RvY3MudHJhdmlzLWNpLmNvbS91c2VyL2dldHRpbmctc3RhcnRlZC8jU3RlcC1vbmUlM0EtU2lnbi1pbikgYW5kIFtBcHBWZXlvcl0oaHR0cDovL3d3dy5hcHB2ZXlvci5jb20vZG9jcykuICBZb3UgY2FuIHVzZSB0aGlzIHRlY2huaXF1ZSB0byBydW4gdGhlIFRocmlmdCBDSSBqb2JzIGluIHlvdXIgYWNjb3VudCB0byBjaGVjayB5b3VyIGNoYW5nZXMgYmVmb3JlIHRoZXkgYXJlIG1hZGUgcHVibGljLiAgRXZlcnkgR2l0SHViIHB1bGwgcmVxdWVzdCBpbnRvIFRocmlmdCB3aWxsIHJ1biB0aGUgZnVsbCBDSSBidWlsZCBhbmQgdGVzdCBzdWl0ZSBvbiB5b3VyIGNoYW5nZXMuCisKKyAxLiBTcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdC4gIFRoaXMgbWFpbnRhaW5zIGNsZWFuIGNoYW5nZSBoaXN0b3J5LgorIDEuIENvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIHRvIHlvdXIgYnJhbmNoIChwbGVhc2UgdXNlIGlzc3VlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFzIGNvbW1pdCB0aXRsZSwgZS5nLiAiVEhSSUZULTk5OTk6IG1ha2UgaXQgcGVyZmVjdCIpLCB3aXRoIHRoZSBhZmZlY3RlZCBsYW5ndWFnZXMgb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZGVzY3JpcHRpb24uCisgMS4gVXNlIEdpdEh1YiB0byBjcmVhdGUgYSBwdWxsIHJlcXVlc3QgZ29pbmcgZnJvbSB5b3VyIGJyYW5jaCB0byBhcGFjaGU6bWFzdGVyLiAgRW5zdXJlIHRoYXQgdGhlIEppcmEgdGlja2V0IG51bWJlciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aXRsZSBvZiB5b3VyIHB1bGwgcmVxdWVzdCwgc2FtZSBhcyB0aGUgY29tbWl0IHRpdGxlLgorIDEuIFdhaXQgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIG5ldyBhZGRpdGlvbiwgYW5kIGZvciBhIENJIGJ1aWxkIHRvIGNvbXBsZXRlLgorIDEuIFdhaXQgZm9yIGEgY29tbWl0dGVyIHRvIGNvbW1pdCB5b3VyIHBhdGNoLiAgWW91IGNhbiBudWRnZSB0aGUgY29tbWl0dGVycyBpZiBuZWNlc3NhcnkgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIFtBcGFjaGUgVGhyaWZ0IG1haWxpbmcgbGlzdF0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nKS4KKworIyMgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIHByb2plY3QgbG9jYWxseSAjIworCitGb3IgV2luZG93cyBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0NNYWtlIFJFQURNRV0oL2J1aWxkL2NtYWtlL1JFQURNRS5tZCkuCisKK0ZvciBXaW5kb3dzIE5hdGl2ZSBDKysgYnVpbGRzLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW1dpbkNQUCBSRUFETUVdKC9idWlsZC93aW5jcHAvUkVBRE1FLm1kKS4KKworRm9yIHVuaXggc3lzdGVtcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtEb2NrZXIgUkVBRE1FXSgvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkuCisKKyMjIElmIHlvdSB3YW50IHRvIHJldmlldyBvcGVuIGlzc3Vlcy4uLiAjIworCisgMS4gUmV2aWV3IHRoZSBbR2l0SHViIFB1bGwgUmVxdWVzdCBCYWNrbG9nXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9wdWxscykuICBDb2RlIHJldmlld3MgYXJlIG9wZW4gdG8gYWxsLgorIDIuIFJldmlldyB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkuICBZb3UgY2FuIHNlYXJjaCBmb3IgdGlja2V0cyByZWxhdGluZyB0byBsYW5ndWFnZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9yIGN1cnJlbnRseSB1c2luZyB3aXRoIHRocmlmdCwgZm9yIGV4YW1wbGUgYSBKaXJhIHNlYXJjaCAoSXNzdWVzIC0+IFNlYXJjaCBGb3IgSXNzdWVzKSBxdWVyeSBvZiBgYHByb2plY3QgPSBUSFJJRlQgQU5EIGNvbXBvbmVudCBpbiAoIkVybGFuZyAtIExpYnJhcnkiKSBhbmQgc3RhdHVzIG5vdCBpbiAocmVzb2x2ZWQsIGNsb3NlZClgYCB3aWxsIGxvY2F0ZSBhbGwgdGhlIG9wZW4gRXJsYW5nIExpYnJhcnkgaXNzdWVzLgorCisjIyBJZiB5b3UgZGlzY292ZXJlZCBhIGRlZmVjdC4uLiAjIworCisgMS4gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpc3N1ZSBpcyBhbHJlYWR5IGluIHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4KKyAxLiBJZiBub3QsIGNyZWF0ZSBhIHRpY2tldCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UgeW91J3JlIHByb3Bvc2luZyBpbiB0aGUgSmlyYSBpc3N1ZSB0cmFja2VyLgorIDEuIENvbnRyaWJ1dGUgeW91ciBjb2RlIGNoYW5nZXMgdXNpbmcgdGhlIEdpdEh1YiBwdWxsIHJlcXVlc3QgbWV0aG9kOgorCisjIyBDb250cmlidXRpbmcgdmlhIFBhdGNoICMjCisKK1NvbWUgY2hhbmdlcyBkbyBub3QgcmVxdWlyZSBhIGJ1aWxkLCBmb3IgZXhhbXBsZSBpbiBkb2N1bWVudGF0aW9uLiAgRm9yIGNoYW5nZXMgdGhhdCBhcmUgbm90IGNvZGUgb3IgYnVpbGQgcmVsYXRlZCwgeW91IGNhbiBzdWJtaXQgYSBwYXRjaCBvbiBKaXJhIGZvciByZXZpZXcuICBUbyBjcmVhdGUgYSBwYXRjaCBmcm9tIGNoYW5nZXMgaW4geW91ciBsb2NhbCBkaXJlY3Rvcnk6CisKKyAgICBnaXQgZGlmZiA+IC4uL1RIUklGVC1OTk5OLnBhdGNoCisKK3RoZW4gd2FpdCBmb3IgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgY2hhbmdlcywgYW5kIHRoZW4gZm9yIGEgY29tbWl0dGVyIHRvIGFwcGx5IHlvdXIgcGF0Y2guCisKKyMjIEdpdEh1YiByZWNpcGVzIGZvciBQdWxsIFJlcXVlc3RzICMjCisKK1NvbWV0aW1lcyBjb21tbWl0dGVycyBtYXkgYXNrIHlvdSB0byB0YWtlIGFjdGlvbnMgaW4geW91ciBwdWxsIHJlcXVlc3RzLiAgSGVyZSBhcmUgc29tZSByZWNpcGVzIHRoYXQgd2lsbCBoZWxwIHlvdSBhY2NvbXBsaXNoIHRob3NlIHJlcXVlc3RzLiAgVGhlc2UgZXhhbXBsZXMgYXNzdW1lIHlvdSBhcmUgd29ya2luZyBvbiBKaXJhIGlzc3VlIFRIUklGVC05OTk5LiAgWW91IHNob3VsZCBhbHNvIGJlIGZhbWlsaWFyIHdpdGggdGhlIFt1cHN0cmVhbV0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvc3luY2luZy1hLWZvcmsvKSByZXBvc2l0b3J5IGNvbmNlcHQuCisKKyMjIyBTcXVhc2ggeW91ciBjaGFuZ2VzICMjIworCitJZiB5b3UgaGF2ZSBub3Qgc3VibWl0dGVkIGEgcHVsbCByZXF1ZXN0IHlldCwgb3IgaWYgeW91IGhhdmUgbm90IHlldCByZWJhc2VkIHlvdXIgZXhpc3RpbmcgcHVsbCByZXF1ZXN0LCB5b3UgY2FuIHNxdWFzaCBhbGwgeW91ciBjb21taXRzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWtlcyBsaWZlIGVhc2llciBmb3IgdGhlIGNvbW1pdHRlcnMuICBJZiB5b3VyIHB1bGwgcmVxdWVzdCBvbiBHaXRIdWIgaGFzIG1vcmUgdGhhbiBvbmUgY29tbWl0LCB5b3Ugc2hvdWxkIGRvIHRoaXMuCisKKzEuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCBsb2dgYCB0byBpZGVudGlmeSBob3cgbWFueSBjb21taXRzIHlvdSBtYWRlIHNpbmNlIHlvdSBiZWdhbi4KKzIuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCByZWJhc2UgLWkgSEVBRH5OYGAgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMuCiszLiBMZWF2ZSAicHVsbCIgaW4gdGhlIGZpcnN0IGxpbmUuCis0LiBDaGFuZ2UgYWxsIG90aGVyIGxpbmVzIGZyb20gInB1bGwiIHRvICJmaXh1cCIuCis1LiBBbGwgeW91ciBjaGFuZ2VzIGFyZSBub3cgaW4gYSBzaW5nbGUgY29tbWl0LgorCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVsbCByZXF1ZXN0IG91dHN0YW5kaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIGEgImZvcmNlIHB1c2giIHRvIG92ZXJ3cml0ZSBpdCBzaW5jZSB5b3UgY2hhbmdlZCB5b3VyIGNvbW1pdCBoaXN0b3J5OgorCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworQSBtb3JlIGRldGFpbGVkIHdhbGt0aHJvdWdoIG9mIGEgc3F1YXNoIGNhbiBiZSBmb3VuZCBhdCBbR2l0IFJlYWR5XShodHRwOi8vZ2l0cmVhZHkuY29tL2FkdmFuY2VkLzIwMDkvMDIvMTAvc3F1YXNoaW5nLWNvbW1pdHMtd2l0aC1yZWJhc2UuaHRtbCkuCisKKyMjIyBSZWJhc2UgeW91ciBwdWxsIHJlcXVlc3QgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGhhcyBhIGNvbmZsaWN0IHdpdGggbWFzdGVyLCBpdCBuZWVkcyB0byBiZSByZWJhc2VkOgorCisgICAgZ2l0IGNoZWNrb3V0IFRIUklGVC05OTk5CisgICAgZ2l0IHJlYmFzZSB1cHN0cmVhbSBtYXN0ZXIKKyAgICAgIChyZXNvbHZlIGFueSBjb25mbGljdHMsIG1ha2Ugc3VyZSBpdCBidWlsZHMpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworIyMjIEZpeCBhIGJhZCBtZXJnZSAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgY29udGFpbnMgY29tbWl0cyB0aGF0IGFyZSBub3QgeW91cnMsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyB0ZWNobmlxdWUgdG8gZml4IHRoZSBiYWQgbWVyZ2UgaW4geW91ciBicmFuY2g6CisKKyAgICBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgZ2l0IHB1bGwgdXBzdHJlYW0gbWFzdGVyCisgICAgZ2l0IGNoZWNrb3V0IC1iIFRIUklGVC05OTk5LXRha2UtMgorICAgIGdpdCBjaGVycnktcGljayAuLi4KKyAgICAgICAgKHBpY2sgb25seSB5b3VyIGNvbW1pdHMgZnJvbSB5b3VyIG9yaWdpbmFsIHB1bGwgcmVxdWVzdCBpbiBhc2NlbmRpbmcgY2hyb25vbG9naWNhbCBvcmRlcikKKyAgICBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIChzZWUgYWJvdmUpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5LXRha2UtMjpUSFJJRlQtOTk5OQorCitUaGlzIHByb2NlZHVyZSB3aWxsIGFwcGx5IG9ubHkgeW91ciBjb21taXRzIGluIG9yZGVyIHRvIHRoZSBjdXJyZW50IG1hc3RlciwgdGhlbiB5b3Ugd2lsbCBzcXVhc2ggdGhlbSB0byBhIHNpbmdsZSBjb21taXQsIGFuZCB0aGVuIHlvdSBmb3JjZSBwdXNoIHlvdXIgbG9jYWwgVEhSSUZULTk5OTktdGFrZS0yIGludG8gcmVtb3RlIFRIUklGVC05OTk5IHdoaWNoIHJlcHJlc2VudHMgeW91ciBwdWxsIHJlcXVlc3QsIHJlcGxhY2luZyBhbGwgdGhlIGNvbW1pdHMgd2l0aCB0aGUgbmV3IG9uZS4KKworIApkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUT1JTIGIvQ09OVFJJQlVUT1JTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDk1NGY4Li4wMDAwMDAwCi0tLSBhL0NPTlRSSUJVVE9SUworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLUNoYWQgV2FsdGVycyA8Y2hhZEBwb3dlcnNldC5jb20+Ci0tVEpTT05Qcm90b2NvbCBmb3IgQysrIGFuZCBKYXZhCi0KLU5pdGF5IDxuaXRheWpAZ21haWwuY29tPgotLVN1cHBvcnQgZm9yICJtYWtlIGNoZWNrIgotCi1XaWxsaWFtIE1vcmdhbiA8d0BhZGFwLnR2PgotLU1pc2NlbGxhbmVvdXMgUnVieSBpbXByb3ZlbWVudHMKLQotQmVuIE1hdXJlciA8Ym1hdXJlckBhbmRyZXcuY211LmVkdT4KLS1SZXN0cnVjdHVyaW5nIHRoZSB3YXkgQXV0b2NvbmYgaXMgdXNlZAotCi1QYXRyaWNrIENvbGxpc29uIDxwYXRyaWNrQGNvbGxpc29uLmllPgotLVNtYWxsdGFsayBiaW5kaW5ncwotCi1EYXZlIFNpbXBzb24gPGRhdmVAcG93ZXJzZXQuY29tPgotLUJldHRlciBzdXBwb3J0IGZvciBjb25uZWN0aW9uIHRyYWNraW5nIGluIHRoZSBDKysgc2VydmVyCi0tTWlzY2VsbGFuZW91cyBmaXhlcwotCi1JZ29yIEFmYW5hc3lldiA8YWZhbkBldmVybm90ZS5jb20+Ci0tUGVybCBIdHRwQ2xpZW50IGFuZCBidWdmaXhlcwotCi1Ub2RkIEJlcm1hbiA8dGJlcm1hbkBpbWVlbS5jb20+Ci0tTWluR1cgcG9ydCBvZiB0aGUgY29tcGlsZXIKLS1DIyBiaW5kaW5ncwotLU1TIGJ1aWxkIHRhc2sKLQotLS0tLS0tLS0tLS0tLS0tLQotUmVsZWFzZSAyMDA3MDkxNwotLS0tLS0tLS0tLS0tLS0tLQotCi1EYXZlIEVuZ2JlcmcgPGVuZ2JlcmdAZ21haWwuY29tPgotLUphdmFCZWFuL0phdmFEb2MgZW5oYW5jZW1lbnRzCi0KLUFuZHJldyBNY0dlYWNoaWUgPGdlZWNob3JhbWFAZ21haWwuY29tPgotLUNvY29hL09iamVjdGl2ZS1DIHN1cHBvcnQKLQotQmVuIE1hdXJlciA8Ym1hdXJlckBhbmRyZXcuY211LmVkdT4KLS1QeXRob24gcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnRzLCBmYXN0YmluYXJ5IHN1cHBvcnQKLQotQW5kcmV3IEx1dG9taXJza2kgPGFuZHlAbHV0by51cz4KLS1BZGRlZCBvcHRpb25hbC9yZXF1aXJlZCBrZXl3b3JkcyBmb3IgQysrIG9iamVjdHMKLS1BZGRlZCBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgQysrIHN0cnVjdHMKLQotSm9oYW4gT3NrYXJzc29uIDxqb2hhbkBva3NhcnNzb24ubnU+Ci0tSmF2YSBmaW5kYnVncyBjb21wbGlhbmNlIGZpeGVzCi0KLVBhdWwgU2FhYiA8cHNAcG93ZXJzZXQuY29tPgotLUlQdjYgc3VwcG9ydCBmb3IgVFNvY2tldCBpbiBDKysvUHl0aG9uCi0KLUtldmluIENsYXJrIDxrZXZpbkBwb3dlcnNldC5jb20+Ci0tU2lnbmlmaWNhbnQgb3ZlcmhhdWwgb2YgUnVieSBjb2RlIGdlbmVyYXRpb24gYW5kIHNlcnZlcnMKLQotU2ltb24gRm9ybWFuIDxzZm9ybWFuQGdtYWlsLmNvbT4KLS1UUHJvY2Vzc29yRmFjdG9yeSBhYnN0cmFjdGlvbiBmb3IgSmF2YSBzZXJ2ZXJzCi0KLUpha2UgTHVjaWFuaSA8amFrZXJzQGdtYWlsLmNvbT4KLS1QZXJsIGNvZGUgZ2VuZXJhdGlvbiwgbGlicmFyaWVzLCB0ZXN0IGNvZGUKLQotRGF2aWQgUmVpc3MgPGRyZWlzc0BzdGFuZm9yZC5lZHU+Ci0tc3RyaW5ncy5oIGluY2x1ZGUgZml4IGZvciBiemVybwotLWVuZGlhbm5lc3MgZml4ZXMgb24gVEJpbmFyeVByb3RvY29sIGRvdWJsZSBzZXJpYWxpemF0aW9uCi0taW1wcm92ZWQgbnRvaGxsLGh0b25sbCBpbXBsZW1lbnRhdGlvbgotCi1EYW4gTGkgPGR0b0BkZXYuamF2YS5uZXQ+Ci0tSmF2YSBUZXN0U2VydmVyIGFuZCBUdXRvcmlhbCBGaXhlcwotCi1LZXZpbiBLbyA8a2V2aW4ucy5rb0BnbWFpbC5jb20+Ci0tRml4IGZvciB1bm5lY2Vzc2FyeSBzdGQ6OnN0cmluZyBjb3B5IGNvbnN0cnVjdGlvbiBpbiBQcm90b2NvbC9FeGNlcHRpb24KLQotUGF1bCBRdWVybmEgPHBxdWVybmFAYXBhY2hlLm9yZz4KLS1BdXRvY29uZiBlcnJvciBtZXNzYWdlIGZpeCBmb3IgbGliZXZlbnQgZGV0ZWN0aW9uCi0tY2xvY2tfZ2V0dGltZSBpbXBsZW1lbnRhdGlvbiBmb3IgT1NYCi0KLS0tLS0tLS0tLS0tLS0tLS0KLVJlbGVhc2UgMjAwNzA0MDEKLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RJU0NMQUlNRVIgYi9ESVNDTEFJTUVSCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTdlN2VhLi4wMDAwMDAwCi0tLSBhL0RJU0NMQUlNRVIKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFwYWNoZSBUaHJpZnQgaXMgYW4gZWZmb3J0IHVuZGVyZ29pbmcgaW5jdWJhdGlvbiBhdCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRiksIAotc3BvbnNvcmVkIGJ5IHRoZSBJbmN1YmF0b3IgUE1DLiBJbmN1YmF0aW9uIGlzIHJlcXVpcmVkIG9mIGFsbCBuZXdseSBhY2NlcHRlZCBwcm9qZWN0cyAKLXVudGlsIGEgZnVydGhlciByZXZpZXcgaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgYW5kIGRlY2lzaW9uIAotbWFraW5nIHByb2Nlc3MgaGF2ZSBzdGFiaWxpemVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdWNjZXNzZnVsIEFTRiBwcm9qZWN0cy4KLVdoaWxlIGluY3ViYXRpb24gc3RhdHVzIGlzIG5vdCBuZWNlc3NhcmlseSBhIHJlZmxlY3Rpb24gb2YgdGhlIGNvbXBsZXRlbmVzcyBvciBzdGFiaWxpdHkgCi1vZiB0aGUgY29kZSwgaXQgZG9lcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9qZWN0IGhhcyB5ZXQgdG8gYmUgZnVsbHkgZW5kb3JzZWQgYnkgdGhlIEFTRi4KZGlmZiAtLWdpdCBhL0xBTkdVQUdFUy5tZCBiL0xBTkdVQUdFUy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEzY2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvTEFOR1VBR0VTLm1kCkBAIC0wLDAgKzEsMzU1IEBACisjIEFwYWNoZSBUaHJpZnQgTGFuZ3VhZ2UgU3VwcG9ydCAjCisKK0xhc3QgTW9kaWZpZWQ6IDIwMTgtMTItMTcKKworR3VpZGFuY2UgRm9yOiAwLjEyLjAgb3IgbGF0ZXIKKworVGhyaWZ0IHN1cHBvcnRzIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGFuZCBoYXMgYW4gaW1wcmVzc2l2ZSB0ZXN0IHN1aXRlIHRoYXQgZXhlcmNpc2VzIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcywgcHJvdG9jb2xzLCBhbmQgdHJhbnNwb3J0cyB0aGF0IHJlcHJlc2VudHMgYSBtYXRyaXggb2YgdGhvdXNhbmRzIG9mIHBvc3NpYmxlIGNvbWJpbmF0aW9ucy4gIEVhY2ggbGFuZ3VhZ2UgdHlwaWNhbGx5IGhhcyBhIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBhcyB3ZWxsIGFzIHN1cHBvcnQgbGlicmFyaWVzIC0gc29tZSBtYW5kYXRvcnkgYW5kIHNvbWUgb3B0aW9uYWwuICBBbGwgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBiZWxvdyB0byBoZWxwIHlvdSBhc3Nlc3Mgd2hldGhlciB5b3UgY2FuIHVzZSBBcGFjaGUgVGhyaWZ0IHdpdGggeW91ciBwcm9qZWN0LiAgT2J2aW91c2x5IHRoaXMgaXMgYSBjb21wbGV4IG1hdHJpeCB0byBtYWludGFpbiBhbmQgbWF5IG5vdCBiZSBjb3JyZWN0IGluIGFsbCBjYXNlcyAtIGlmIHlvdSBzcG90IGFuIGVycm9yIHBsZWFzZSBpbmZvcm0gdGhlIGRldmVsb3BlcnMgdXNpbmcgdGhlIG1haWxpbmcgbGlzdC4KKworQXBhY2hlIFRocmlmdCBoYXMgYSBjaG9pY2Ugb2YgdHdvIGJ1aWxkIHN5c3RlbXMuICBUaGUgYGF1dG9jb25mYCBidWlsZCBzeXN0ZW0gaXMgdGhlIG1vc3QgY29tcGxldGUgYnVpbGQgYW5kIGlzIHVzZWQgdG8gYnVpbGQgYWxsIHN1cHBvcnRlZCBsYW5ndWFnZXMuICBUaGUgYGNtYWtlYCBidWlsZCBzeXN0ZW0gaGFzIGJlZW4gZGVzaWduYXRlZCBieSB0aGUgcHJvamVjdCB0byByZXBsYWNlIGBhdXRvY29uZmAgaG93ZXZlciB0aGlzIHRyYW5zaXRpb24gd2lsbCB0YWtlIHF1aXRlIHNvbWUgdGltZSB0byBjb21wbGV0ZS4KKworVGhlIExhbmd1YWdlL0xpYnJhcnkgTGV2ZWxzIGluZGljYXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZlcnNpb25zIHRoYXQgYXJlIHVzZWQgaW4gdGhlIFtjb250aW51b3VzIGludGVncmF0aW9uIGVudmlyb25tZW50c10oYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkgKEFwcHZleW9yLCBUcmF2aXMpIGZvciBBcGFjaGUgVGhyaWZ0LiAgT3RoZXIgbGFuZ3VhZ2UgbGV2ZWxzIG1heSBiZSBzdXBwb3J0ZWQgZm9yIGVhY2ggbGFuZ3VhZ2UsIGhvd2V2ZXIgdGVzdGVkIGxlc3MgdGhvcm91Z2hseTsgY2hlY2sgdGhlIFJFQURNRSBmaWxlIGluc2lkZSBlYWNoIGxpYiBkaXJlY3RvcnkgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4gIE5vdGUgdGhhdCB3aGlsZSBhIGxhbmd1YWdlIG1heSBjb250YWluIHN1cHBvcnQgZm9yIHByb3RvY29scywgdHJhbnNwb3J0cywgYW5kIHNlcnZlcnMsIHRoZSBleHRlbnQgdG8gd2hpY2ggZWFjaCBpcyB0ZXN0ZWQgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbCBidWlsZCBwcm9jZXNzIHZhcmllcy4gIFRoZSBkZWZpbml0aXZlIGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBwcm9qZWN0IGlzIGNhbGxlZCB0aGUgImNyb3NzIiB0ZXN0IHdoaWNoIGV4ZWN1dGVzIGEgdGVzdCBtYXRyaXggd2l0aCBjbGllbnRzIGFuZCBzZXJ2ZXJzIGNvbW11bmljYXRpbmcgYWNyb3NzIGxhbmd1YWdlcy4KKworPHRhYmxlIHN0eWxlPSJmb250LXNpemU6IDYwJTsgcGFkZGluZzogMXB4OyI+Cis8dGhlYWQ+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkJ1aWxkIFN5c3RlbXM8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+TGFuZy9MaWIgTGV2ZWxzIChUZXN0ZWQpPC90aD4KKzx0aCBjb2xzcGFuPTYgYWxpZ249Y2VudGVyPkxvdy1MZXZlbCBUcmFuc3BvcnRzPC90aD4KKzx0aCBjb2xzcGFuPTMgYWxpZ249Y2VudGVyPlRyYW5zcG9ydCBXcmFwcGVyczwvdGg+Cis8dGggY29sc3Bhbj00IGFsaWduPWNlbnRlcj5Qcm90b2NvbHM8L3RoPgorPHRoIGNvbHNwYW49NSBhbGlnbj1jZW50ZXI+U2VydmVyczwvdGg+Cis8dGggcm93c3Bhbj0yPk9wZW4gSXNzdWVzPC90aD4KKzwvdHI+Cis8dHI+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0aD5hdXRvY29uZjwvdGg+PHRoPmNtYWtlPC90aD4KKzwhLS0gTGFuZy9MaWIgTGV2ZWxzIC0tLS0tLS0+PHRoPk1pbjwvdGg+PHRoPk1heDwvdGg+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0aD48YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X2RvbWFpbl9zb2NrZXQiPkRvbWFpbjwvYT48L3RoPjx0aD4mbmJzcDtGaWxlJm5ic3A7PC90aD48dGg+TWVtb3J5PC90aD48dGg+Jm5ic3A7UGlwZSZuYnNwOzwvdGg+PHRoPlNvY2tldDwvdGg+PHRoPiZuYnNwO1RMUyZuYnNwOzwvdGg+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0aD5GcmFtZWQ8L3RoPjx0aD4mbmJzcDtodHRwJm5ic3A7PC90aD48dGg+Jm5ic3A7emxpYiZuYnNwOzwvdGg+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCI+QmluYXJ5PC9hPjwvdGg+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZCI+Q29tcGFjdDwvYT48L3RoPjx0aD4mbmJzcDtKU09OJm5ic3A7PC90aD48dGg+TXVsdGlwbGV4PC90aD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRoPkZvcmtpbmc8L3RoPjx0aD5Ob25ibG9ja2luZzwvdGg+PHRoPlNpbXBsZTwvdGg+PHRoPlRocmVhZGVkPC90aD48dGg+VGhyZWFkUG9vbDwvdGg+Cis8L3RyPgorPC90aGVhZD4KKzx0Ym9keT4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvYXMzL1JFQURNRS5tZCI+QWN0aW9uU2NyaXB0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPkFjdGlvblNjcmlwdCAzPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM3MjIiPkFjdGlvblNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY19nbGliL1JFQURNRS5tZCI+QyAoZ2xpYik8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjQ4LjI8L3RkPjx0ZD4yLjU2LjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzg1NCI+QyAoZ2xpYik8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NwcC9SRUFETUUubWQiPkMrKzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj5DKys5ODwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzEzIj5DKys8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NzaGFycC9SRUFETUUubWQiPkMjPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Lk5FVCZuYnNwOzMuNSAvIG1vbm8mbmJzcDszLjIuOC4wPC90ZD48dGQ+Lk5FVCZuYnNwOzQuNi4xIC8gbW9ubyZuYnNwOzQuNi4yLjc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM2MiI+QyMgKC5ORVQpPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jb2NvYS9SRUFETUUubWQiPkNvY29hPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjM5OCI+Q29jb2E8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NsL1JFQURNRS5tZCI+Q29tbW9uIExpc3A8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+U0JDTCAxLjQuNTwvdGQ+PHRkPlNCQ0wgMS40LjE1PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC04MiI+Q29tbW9uIExpc3A8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2QvUkVBRE1FLm1kIj5EbGFuZzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuMDc1LjE8L3RkPjx0ZD4yLjA4My4yPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTc5MDQiPkQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2RhcnQvUkVBRE1FLm1kIj5EYXJ0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEwLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuMjIuMTwvdGQ+PHRkPjEuMjQuMzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzI4MDA2Ij5EYXJ0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9kZWxwaGkvUkVBRE1FLm1kIj5EZWxwaGk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOC4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yMDEwPC90ZD48dGQ+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE2NjAxIj5EZWxwaGk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25ldGNvcmUvUkVBRE1FLm1kIj4uTkVUIENvcmU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTEuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4xLjQ8L3RkPjx0ZD4yLjIuMTAxPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMzExNzYiPi5ORVQgQ29yZTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZXJsL1JFQURNRS5tZCI+RXJsYW5nPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MTguMzwvdGQ+PHRkPjIwLjAuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzkwIj5Fcmxhbmc8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2dvL1JFQURNRS5tZCI+R288L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjcuNjwvdGQ+PHRkPjEuMTEuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE0MzA3Ij5HbzwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvaHMvUkVBRE1FLm1kIj5IYXNrZWxsPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjUuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Ny4xMC4zPC90ZD48dGQ+OC4wLjI8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjcwNCI+SGFza2VsbDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvaGF4ZS9SRUFETUUubWQiPkhheGU8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4zPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4zLjIuMTwvdGQ+PHRkPjMuNC40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMjQzNDciPkhheGU8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2phdmEvUkVBRE1FLm1kIj5KYXZhIChTRSk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xLjguMF8xNTE8L3RkPjx0ZD4xLjguMF8xOTE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNCI+SmF2YSBTRTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvamF2YW1lL1JFQURNRS5tZCI+SmF2YSAoTUUpPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjUuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzc1OSI+SmF2YSBNRTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvanMvUkVBRE1FLm1kIj5KYXZhc2NyaXB0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjMuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzQxOCI+SmF2YXNjcmlwdDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbHVhL1JFQURNRS5tZCI+THVhPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMjwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+NS4xLjU8L3RkPjx0ZD41LjIuNDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzIyNjU5Ij5MdWE8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL25vZGVqcy9SRUFETUUubWQiPm5vZGUuanM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD42Lng8L3RkPjx0ZD44Lng8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNDMyMCI+bm9kZS5qczwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbm9kZXRzL1JFQURNRS5tZCI+bm9kZS50czwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4zLjEuNjwvdGQ+PHRkPjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2lzc3Vlcy8/anFsPXByb2plY3QlMjAlM0QlMjBUSFJJRlQlMjBBTkQlMjByZXNvbHV0aW9uJTIwJTNEJTIwVW5yZXNvbHZlZCUyMGFuZCUyMENvbXBvbmVudCUyMGluJTIwKCUyMlR5cGVTY3JpcHQlMjAtJTIwTGlicmFyeSUyMiklMjBPUkRFUiUyMEJZJTIwcHJpb3JpdHklMjBERVNDJTJDJTIwdXBkYXRlZCUyMERFU0MiPm5vZGUudHM8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL29jYW1sL1JFQURNRS5tZCI+T0NhbWw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+NC4wNC4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM2NjAiPk9DYW1sPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9wZXJsL1JFQURNRS5tZCI+UGVybDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjUuMjIuMTwvdGQ+PHRkPjUuMjYuMTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzEyIj5QZXJsPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9waHAvUkVBRE1FLm1kIj5QSFA8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD43LjAuMjI8L3RkPjx0ZD43LjIuMTA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjQzMSI+UEhQPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9weS9SRUFETUUubWQiPlB5dGhvbjwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuNy4xMiwgMy41LjI8L3RkPjx0ZD4yLjcuMTVyYzEsIDMuNi43PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTUiPlB5dGhvbjwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcmIvUkVBRE1FLm1kIj5SdWJ5PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4zLjFwMTEyPC90ZD48dGQ+Mi41LjFwNTc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNiI+UnVieTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvcnMvUkVBRE1FLm1kIj5SdXN0PC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjExLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuMTcuMDwvdGQ+PHRkPjEuMzAuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzMxNDIwIj5SdXN0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9zdC9SRUFETUUubWQiPlNtYWxsdGFsazwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTM4NjEiPlNtYWxsdGFsazwvYT48L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8dGZvb3Q+Cis8dHI+Cis8dGggcm93c3Bhbj0yPkxhbmd1YWdlPC90aD4KKzx0aCByb3dzcGFuPTIgYWxpZ249Y2VudGVyPlNpbmNlPC90aD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRoPmF1dG9jb25mPC90aD48dGg+Y21ha2U8L3RoPgorPCEtLSBMYW5nL0xpYiBMZXZlbHMgLS0tLS0tLT48dGg+TWluPC90aD48dGg+TWF4PC90aD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRoPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfZG9tYWluX3NvY2tldCI+RG9tYWluPC9hPjwvdGg+PC90aD48dGg+Jm5ic3A7RmlsZSZuYnNwOzwvdGg+PHRoPk1lbW9yeTwvdGg+PHRoPiZuYnNwO1BpcGUmbmJzcDs8L3RoPjx0aD5Tb2NrZXQ8L3RoPjx0aD4mbmJzcDtUTFMmbmJzcDs8L3RoPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGg+RnJhbWVkPC90aD48dGg+Jm5ic3A7aHR0cCZuYnNwOzwvdGg+PHRoPiZuYnNwO3psaWImbmJzcDs8L3RoPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQiPkJpbmFyeTwvYT48L3RoPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQiPkNvbXBhY3Q8L2E+PC90aD48dGg+Jm5ic3A7SlNPTiZuYnNwOzwvdGg+PHRoPk11bHRpcGxleDwvdGg+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0aD5Gb3JraW5nPC90aD48dGg+Tm9uYmxvY2tpbmc8L3RoPjx0aD5TaW1wbGU8L3RoPjx0aD5UaHJlYWRlZDwvdGg+PHRoPlRocmVhZFBvb2w8L3RoPgorPHRoIHJvd3NwYW49Mj5PcGVuIElzc3VlczwvdGg+Cis8L3RyPgorPHRyPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+QnVpbGQgU3lzdGVtczwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5MYW5nL0xpYiBMZXZlbHMgKFRlc3RlZCk8L3RoPgorPHRoIGNvbHNwYW49NiBhbGlnbj1jZW50ZXI+TG93LUxldmVsIFRyYW5zcG9ydHM8L3RoPgorPHRoIGNvbHNwYW49MyBhbGlnbj1jZW50ZXI+VHJhbnNwb3J0IFdyYXBwZXJzPC90aD4KKzx0aCBjb2xzcGFuPTQgYWxpZ249Y2VudGVyPlByb3RvY29sczwvdGg+Cis8dGggY29sc3Bhbj01IGFsaWduPWNlbnRlcj5TZXJ2ZXJzPC90aD4KKzwvdHI+Cis8L3Rmb290PgorPC90YWJsZT4KZGlmZiAtLWdpdCBhL0xJQ0VOU0UgYi9MSUNFTlNFCmluZGV4IDY5N2ZjOTUuLjNiNmQ3ZDcgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UKKysrIGIvTElDRU5TRQpAQCAtMjE2LDY5ICsyMTYsNiBAQAogCiBQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgogCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgZm9sbG93aW5nIGZpbGVzIGNvbnRhaW4gc29tZSBwb3J0aW9ucyBvZiBjb2RlIGNvbnRyaWJ1dGVkIHVuZGVyCi10aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UgKHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCksIGFuZCByZWxpY2Vuc2VkCi11bmRlciB0aGUgQXBhY2hlIDIuMCBMaWNlbnNlOgotCi0gIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaAotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaAotICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eQotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKLSAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgotICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKLSAgbGliL3JiL2xpYi90aHJpZnQucmIKLSAgbGliL3N0L1JFQURNRQotICBsaWIvc3QvdGhyaWZ0LnN0Ci0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCi0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci0gIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgogCkBAIC0yODksMzYgKzIyNiwxNCBAQAogIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL3RocmlmdC9tZDUuW2NoXSBjb21wb25lbnRzOgorRm9yIHRoZSBsaWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wYXJzZS5qczoKIAogLyoKLSAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAgIGpzb25fcGFyc2UuanMKKyAgICAyMDE1LTA1LTAyCisgICAgUHVibGljIERvbWFpbi4KKyAgICBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCiAKLSAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwotICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgotCi0gIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAotICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAotICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQotICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KLSAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLSAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgotCi0gIEwuIFBldGVyIERldXRzY2gKLSAgZ2hvc3RAYWxhZGRpbi5jb20KLQotICovCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBsaWIvcmIvc2V0dXAucmI6IENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1pbmVybyBBb2tpLAotbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYW5kIGxpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBjb21wb25lbnRzOgotICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDA3ICBNYXJrdXMgTW90dGwKLQotTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMi4xCi0oc2VlIGRvYy9sZ3BsLTIuMS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZSkKKyovCisoQnkgRG91Z2xhcyBDcm9ja2ZvcmQgPGRvdWdsYXNAY3JvY2tmb3JkLmNvbT4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGY0NTQ4ZTAuLjUxMTQ1MmQKLS0tIGEvTWFrZWZpbGUuYW0KKysrIGIvTWFrZWZpbGUuYW0KQEAgLTE5LDI2ICsxOSwxMTcgQEAKIAogQUNMT0NBTF9BTUZMQUdTID0gLUkgLi9hY2xvY2FsCiAKK2lmIFdJVEhfUExVR0lOCisjIFRvIGVuYWJsZSBib290c3RyYXAsIGJ1aWxkIG9yZGVyIGlzIGxpYi9jcHAgLT4gY29tcGlsZXIgLT4gb3RoZXJzCitTVUJESVJTID0gbGliL2NwcCBjb21waWxlci9jcHAgbGliCitpZiBXSVRIX1RFU1RTCitTVUJESVJTICs9IGxpYi9jcHAvdGVzdAorZW5kaWYKK2Vsc2UKIFNVQkRJUlMgPSBjb21waWxlci9jcHAgbGliCitlbmRpZgogCiBpZiBXSVRIX1RFU1RTCiBTVUJESVJTICs9IHRlc3QKIGVuZGlmCiAKK2lmIFdJVEhfVFVUT1JJQUwKK1NVQkRJUlMgKz0gdHV0b3JpYWwKK2VuZGlmCisKIGRpc3QtaG9vazoKLQlmaW5kICQoZGlzdGRpcikgLXR5cGUgZiBcKCAtaW5hbWUgIi5kZXBzIiAtb3IgLWluYW1lICIubGlicyIgLW9yIC1pbmFtZSAiLmdpdGlnbm9yZSIgXAotCQktb3IgLWluYW1lICIuRFNfU3RvcmUiIC1vciAtaW5hbWUgIi5fKiIgXCkgfCB4YXJncyBybSAtcmYKKwlmaW5kICQoZGlzdGRpcikgLXR5cGUgZiBcKCAtaW5hbWUgIi5EU19TdG9yZSIgLW9yIC1pbmFtZSAiLl8qIiAtb3IgLWluYW1lICIuZ2l0aWdub3JlIiBcKSB8IHhhcmdzIHJtIC1yZgorCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiLmRlcHMiIC1vciAtaW5hbWUgIi5saWJzIiBcKSB8IHhhcmdzIHJtIC1yZgogCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiLnN2biIgLW9yIC1pbmFtZSAiLmdpdCIgXCkgfCB4YXJncyBybSAtcmYKIAogcHJpbnQtdmVyc2lvbjoKLQlAZWNobyAkKFZFUlNJT04pCisJQGVjaG8gJChQQUNLQUdFX1ZFUlNJT04pCisKKy5QSE9OWTogcHJlY3Jvc3MgY3Jvc3MKK3ByZWNyb3NzLSU6IGFsbAorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiBhbGwgcHJlY3Jvc3MtdGVzdCBwcmVjcm9zcy1saWIKKworZW1wdHkgOj0KK3NwYWNlIDo9ICQoZW1wdHkpICQoZW1wdHkpCitjb21tYSA6PSAsCisKK0NST1NTX0xBTkdTID0gQE1BWUJFX0NQUEAgQE1BWUJFX0NfR0xJQkAgQE1BWUJFX0NMQCBATUFZQkVfREAgQE1BWUJFX0pBVkFAIEBNQVlCRV9DU0hBUlBAIEBNQVlCRV9QWVRIT05AIEBNQVlCRV9QWTNAIEBNQVlCRV9SVUJZQCBATUFZQkVfSEFTS0VMTEAgQE1BWUJFX1BFUkxAIEBNQVlCRV9QSFBAIEBNQVlCRV9HT0AgQE1BWUJFX05PREVKU0AgQE1BWUJFX0RBUlRAIEBNQVlCRV9FUkxBTkdAIEBNQVlCRV9MVUFAIEBNQVlCRV9SU0AgQE1BWUJFX0RPVE5FVENPUkVAIEBNQVlCRV9OT0RFVFNACitDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQgPSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoQ1JPU1NfTEFOR1MpKQorCitpZiBXSVRIX1BZMworQ1JPU1NfUFk9JChQWVRIT04zKQorZWxzZQorQ1JPU1NfUFk9JChQWVRIT04pCitlbmRpZgorCitpZiBXSVRIX1BZVEhPTgorY3Jvc3NmZWF0dXJlOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1mZWF0dXJlcyAuKiAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpCitlbHNlCisjIGZlYXR1cmUgdGVzdCBuZWVkcyBweXRob24gYnVpbGQKK2Nyb3NzZmVhdHVyZToKK2VuZGlmCisKK2Nyb3NzLSU6IHByZWNyb3NzIGNyb3NzZmVhdHVyZQorCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDUgLS1za2lwLWtub3duLWZhaWx1cmVzIC0tc2VydmVyICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLWNsaWVudCAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1yZWdleCAiJCoiCisKK2Nyb3NzOiBjcm9zcy0uKgorCitUSU1FUyA9IDEgMiAzCitmYWlsOiBwcmVjcm9zcworCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSB8fCB0cnVlCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW92ZXJ3cml0ZQorCSQoZm9yZWFjaCB2YXIsJChUSU1FUyksdGVzdC90ZXN0LnB5IC1zIHx8IHRydWU7dGVzdC90ZXN0LnB5IC0tdXBkYXRlLWV4cGVjdGVkLWZhaWx1cmVzPW1lcmdlOykKKworY29kZXNwZWxsX3NraXBfZmlsZXMgPSBcCisJKi5qYXIgXAorCSouY2xhc3MgXAorCSouc28gXAorCSouYSBcCisJKi5sYSBcCisJKi5vIFwKKwkqLnAxMiBcCisJKk9DYW1sTWFrZWZpbGUgXAorCS5rZXlzdG9yZSBcCisJLnRydXN0c3RvcmUgXAorCUNIQU5HRVMgXAorCWNvbmZpZy5zdWIgXAorCWNvbmZpZ3VyZSBcCisJZGVwY29tcCBcCisJbGlidG9vbC5tNCBcCisJb3V0cHV0LiogXAorCXJlYmFyIFwKKwl0aHJpZnQKKworc2tpcHBlZF9maWxlcyA9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChjb2Rlc3BlbGxfc2tpcF9maWxlcykpCisKK3N0eWxlLWxvY2FsOgorCWNvZGVzcGVsbCAtLXdyaXRlLWNoYW5nZXMgLS1za2lwPSQoc2tpcHBlZF9maWxlcykgLS1kaXNhYmxlLWNvbG9ycwogCiBFWFRSQV9ESVNUID0gXAotIAkJCWRvYyBcCi0JCQl0dXRvcmlhbCBcCi0JCQljb250cmliIFwKLQkJCUNPTlRSSUJVVE9SUyBcCi0JCQlMSUNFTlNFIFwKLQkJCUNIQU5HRVMgXAotCQkJRElTQ0xBSU1FUiBcCi0JCQlOT1RJQ0UKKwkuY2xhbmctZm9ybWF0IFwKKwkuZWRpdG9yY29uZmlnIFwKKwkudHJhdmlzLnltbCBcCisJLnJ1c3RmbXQudG9tbCBcCisJLmRvY2tlcmlnbm9yZSBcCisJYXBwdmV5b3IueW1sIFwKKwlib3dlci5qc29uIFwKKwlidWlsZCBcCisJYm9vdHN0cmFwLnNoIFwKKwljbGVhbnVwLnNoIFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJY29tcG9zZXIuanNvbiBcCisJY29udHJpYiBcCisJQ09OVFJJQlVUSU5HLm1kIFwKKwlkZWJpYW4gXAorCWRvYyBcCisJZG9hcC5yZGYgXAorCXBhY2thZ2UuanNvbiBcCisJc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIFwKKwlMQU5HVUFHRVMubWQgXAorCUxJQ0VOU0UgXAorCUNIQU5HRVMgXAorCU5PVElDRSBcCisJUkVBRE1FLm1kIFwKKwlUaHJpZnQucG9kc3BlYwpkaWZmIC0tZ2l0IGEvTkVXUyBiL05FV1MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDBjNGMuLjAwMDAwMDAKLS0tIGEvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLVJlbGVhc2UgTm90ZXMgZm9yIFRocmlmdCAyMDA4MDQxMQotCi0uZXF1YWxzIGFuZCAuaGFzaENvZGUoKSBmb3IgSmF2YSBzdHJ1Y3RzIChkZXZlbG9wZWQgYnkgZHJlaXNzKS4KLQotSW1wcm92ZW1lbnRzIHRvIHRoZSBDKysgVFNvY2tldFBvb2wgKGRldmVsb3BlZCBieSBha2hpbCkuCi0KLVBIUCAoZGUpc2VyaWFsaXphdGlvbiBleHRlbnNpb24gKGRldmVsb3BlZCBieSBkd2VhdGhlcmZvcmQpLgotCi1BZGQgZmIzMDMgdG8gY29udHJpYiAoZGV2ZWxvcGVkIGJ5IEZhY2Vib29rKS4KLQotVEpTT05Qcm90b2NvbCBmb3IgQysrIGFuZCBKYXZhIChjb250cmlidXRlZCBieSBDaGFkIFdhbHRlcnMgb2YgUG93ZXJzZXQpLgotCi1TdXBwb3J0IGZvciAibWFrZSBjaGVjayIgYW5kIGJldHRlciB0ZXN0cyAoY29udHJpYnV0ZWQgYnkgTml0YXkpLgotCi1TbWFsbHRhbGsgc3VwcG9ydCAoY29udHJpYnV0ZWQgYnkgUGF0cmljayBDb2xsaXNvbikuCi0KLURhdmUgU2ltcHNvbiA8ZGF2ZUBwb3dlcnNldC5jb20+Ci1CZXR0ZXIgc3VwcG9ydCBmb3IgY29ubmVjdGlvbiB0cmFja2luZyBpbiB0aGUgQysrIHNlcnZlciAoY29udHJpYnV0ZWQgYnkKLURhdmUgU2ltcHNvbiBvZiBQb3dlcnNldCkuCi0KLVBlcmwgSHR0cENsaWVudCAoY29udHJpYnV0ZWQgYnkgSWdvciBBZmFuYXN5ZXYgb2YgRXZlcm5vdGUpLgotCi1DIyBzdXBwb3J0IChjb250cmlidXRlZCBieSBUb2RkIEJlcm1hbiBvZiBpbWVlbSkuCi0KLU1pbkdXIHBvcnQgb2YgdGhlIGNvbXBpbGVyIChjb250cmlidXRlZCBieSBUb2RkIEJlcm1hbiBvZiBpbWVlbSkuCi0KLVRvbnMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCi0KLQotUmVsZWFzZSBOb3RlcyBmb3IgVGhyaWZ0IDIwMDcwOTE3Ci0KLVRCaW5hcnlQcm90b2NvbCBub3cgaW5jbHVkZXMgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiBtZXNzYWdlZC4KLVRoaXMgaXMgYSBub24tYmFja3dhcmRzLWNvbXBhdGlibGUgY2hhbmdlLiAgUGxlYXNlIHNlZSB0aGUKLVRCaW5hcnlQcm90b2NvbCBjb25zdHJ1Y3RvciBmb3Igc3RyaWN0UmVhZF8gYW5kIHN0cmljdFdyaXRlXy4KLQotQWRkIGJpbmFyeSB0eXBlIHRvIHN1cHBvcnQgbm9uLXRleHQgInN0cmluZ3MiIGluIEphdmEuCi0KLVRTb2NrZXRQb29sIGZvciBDKysgKGRldmVsb3BlZCBieSBqc29iZWwpLgotCi1TeW50YXggaGlnaGxpZ2h0aW5nIGZvciB2aW0gYW5kIGVtYWNzIChkZXZlbG9wZWQgYnkgaHpoYW8gYW5kIG1hcnRpbikuCi0KLVBlcmwgc3VwcG9ydCAoY29udHJpYnV0ZWQgYnkgSmFrZSBMdWNpYW5pKS4KLQotRXJsYW5nIHN1cHBvcnQgKGRldmVsb3BlZCBieSBjcGlybykuCi0KLVJ1YnkgQVBJIG92ZXJoYXVsIChjb250cmlidXRlZCBieSBLZXZpbiBDbGFyayBvZiBQb3dlcnNldCkuCi0KLUlQdjYgc3VwcG9ydCBpbiBDKysgYW5kIFB5dGhvbiAoY29udHJpYnV0ZWQgYnkgUGF1bCBTYWFiIG9mIFBvd2Vyc2V0KS4KLQotUmVhZC9Xcml0ZSBsb2NrcyAoZGV2ZWxvcGVkIGJ5IGJveikuCi0KLU9DYW1sIHN1cHBvcnQgKGRldmVsb3BlZCBieSBpcHJvY3RvcikuCi0KLUh1bWFuLXJlYWRhYmxlIHN0cmluZ3MgZnJvbSBUaHJpZnQgc3RydWN0dXJlcyBpbiBDKysgKGRldmVsb3BlZCBieSBkcmVpc3MpLgotCi1IYXNrZWxsIHN1cHBvcnQgKGRldmVsb3BlZCBieSBpcHJvY3RvcikuCi0KLVN1cHBvcnQgZm9yIG9wdGlvbmFsIGZpZWxkcyBpbiBDKysgKGNvbnRyaWJ1dGVkIGJ5IEFuZHkgTHV0b21pcnNreSkuCi0KLVN1cHBvcnQgZm9yIG9wZXJhdG9yPT0gZm9yIFRocmlmdCBzdHJ1Y3R1cmVzIChjb250cmlidXRlZCBieSBBbmR5IEx1dG9taXJza3kpLgotCi1QeXRob24vQyBtb2R1bGUgZm9yIGZhc3QgKGRlKXNlcmlhbGl6YXRpb24gKGNvbnRyaWJ1dGVkIGJ5IEJlbiBNYXVyZXIpLgotCi1MaW1pdGVkIHJlZmxlY3Rpb24gZm9yIEMrKyBzZXJ2aWNlcyAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLVB5dGhvbiBsaWJyYXJ5IGluc3RhbGxhdGlvbiBkZWZhdWx0cyB0byAvdXNyLCBvdmVycmlkZSB3aXRoIFBZX1BSRUZJWC4KLQotU3VwcG9ydCBmb3IgSmF2YWJlYW4tc3R5bGUgSmF2YSBjbGFzc2VzIChjb250cmlidXRlZCBieSBEYXZlIEVuZ2JlcmcpLgotCi1URGVuc2VQcm90b2NvbCBmb3IgQysrIChleHBlcmltZW50YWwgd2F5IHRvIHNocmluayBzdHJ1Y3R1cmVzKQotKGRldmVsb3BlZCBieSBkcmVpc3MpLgotCi1Db2NvYS9PYmplY3RpdmUgQyBzdXBwb3J0IChjb250cmlidXRlZCBieSBBbmRyZXcgTWNHZWFjaGllKS4KLQotVGhyaWZ0IG5vdyBidWlsZHMgd2l0aG91dCBsaWJldmVudC4KLQotVFpsaWJUcmFuc3BvcnQgZm9yIEMrKyAoY29tcHJlc3Mgc2VyaWFsaXplZCBzdHJ1Y3R1cmVzKSAoZGV2ZWxvcGVkIGJ5IGRyZWlzcykuCi0KLVRvbnMgb2Ygc21hbGwgaW1wcm92ZW1lbnRzIGFuZCBidWcgZml4ZXMuCmRpZmYgLS1naXQgYS9OT1RJQ0UgYi9OT1RJQ0UKaW5kZXggYzIzOTk1YS4uOTAyZGM4ZCAxMDA2NDQKLS0tIGEvTk9USUNFCisrKyBiL05PVElDRQpAQCAtMSw1ICsxLDUgQEAKIEFwYWNoZSBUaHJpZnQKLUNvcHlyaWdodCAyMDA2LTIwMTAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorQ29weXJpZ2h0IDIwMDYtMjAxNyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAKIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYXQKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0ZjY1ZS4uMDAwMDAwMAotLS0gYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotQXBhY2hlIFRocmlmdAotCi1MYXN0IE1vZGlmaWVkOiAyMDEwLU5vdi0wNAotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1JbnRyb2R1Y3Rpb24KLT09PT09PT09PT09PQotCi1UaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbgotYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIFRocmlmdCBwcm92aWRlcyBjbGVhbgotYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KLWxldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KLWxhbmd1YWdlIGFzIGl0cyBpbnB1dCBhbmQgZ2VuZXJhdGVzIGNvZGUgYWNyb3NzIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0aGF0Ci11c2VzIHRoZSBhYnN0cmFjdGVkIHN0YWNrIHRvIGJ1aWxkIGludGVyb3BlcmFibGUgUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuCi0KLVRocmlmdCBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gc3VwcG9ydCBub24tYXRvbWljIHZlcnNpb24gY2hhbmdlcwotYWNyb3NzIGNsaWVudCBhbmQgc2VydmVyIGNvZGUuCi0KLUZvciBtb3JlIGRldGFpbHMgb24gVGhyaWZ0J3MgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiwgdGFrZSBhIGdhbmRlciBhdAotdGhlIFRocmlmdCB3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIG9yIGF0IHRoZSBSRUFETUUgZmlsZXMKLWluIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCi0KLUhpZXJhcmNoeQotPT09PT09PT09Ci0KLXRocmlmdC8KLQotICBjb21waWxlci8KLSAgICBDb250YWlucyB0aGUgVGhyaWZ0IGNvbXBpbGVyLCBpbXBsZW1lbnRlZCBpbiBDKysuCi0KLSAgbGliLwotICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQotICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgotCi0gICAgY3BwLwotICAgIGphdmEvCi0gICAgcGhwLwotICAgIHB5LwotICAgIHJiLwotCi0gIHRlc3QvCi0KLSAgICBDb250YWlucyBzYW1wbGUgVGhyaWZ0IGZpbGVzIGFuZCB0ZXN0IGNvZGUgYWNyb3NzIHRoZSB0YXJnZXQgcHJvZ3JhbW1pbmcKLSAgICBsYW5ndWFnZXMuCi0KLSAgdHV0b3JpYWwvCi0KLSAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKLSAgICB1c2luZyBUaHJpZnQuCi0KLVJlcXVpcmVtZW50cwotPT09PT09PT09PT09Ci0KLVNlZSBodHRwOi8vd2lraS5hcGFjaGUub3JnL3RocmlmdC9UaHJpZnRSZXF1aXJlbWVudHMgZm9yCi1hbiB1cC10by1kYXRlIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzLgotCi1SZXNvdXJjZXMKLT09PT09PT09PQotCi1Nb3JlIGluZm9ybWF0aW9uIGFib3V0IFRocmlmdCBjYW4gYmUgb2J0YWluZWQgb24gdGhlIFRocmlmdCB3ZWJwYWdlIGF0OgotCi0gICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwotCi1BY2tub3dsZWRnbWVudHMKLT09PT09PT09PT09PT09PQotCi1UaHJpZnQgd2FzIGluc3BpcmVkIGJ5IHBpbGxhciwgYSBsaWdodHdlaWdodCBSUEMgdG9vbCB3cml0dGVuIGJ5IEFkYW0gRCdBbmdlbG8sCi1hbmQgYWxzbyBieSBHb29nbGUncyBwcm90b2NvbCBidWZmZXJzLgotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1JZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gdGhlIGZpcnN0IHRpbWUgb3V0IG9mIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSwgeW91IHdpbGwKLW5lZWQgdG8gZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzLiAgKFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBpZiB5b3UKLWRvd25sb2FkZWQgYSB0YXJiYWxsLikgIEZyb20gdGhlIHRvcCBkaXJlY3RvcnksIGRvOgotCi0JLi9ib290c3RyYXAuc2gKLQotT25jZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgYXJlIGdlbmVyYXRlZCwgdGhyaWZ0IGNhbiBiZSBjb25maWd1cmVkLgotRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86Ci0KLQkuL2NvbmZpZ3VyZQotCi1Zb3UgbWF5IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIGJvb3N0IGZpbGVzIGV4cGxpY2l0bHkuCi1JZiB5b3UgaW5zdGFsbGVkIGJvb3N0IGluIC91c3IvbG9jYWwsIHlvdSB3b3VsZCBydW4gY29uZmlndXJlIGFzIGZvbGxvd3M6Ci0KLQkuL2NvbmZpZ3VyZSAtLXdpdGgtYm9vc3Q9L3Vzci9sb2NhbAotCi1Ob3RlIHRoYXQgYnkgZGVmYXVsdCB0aGUgdGhyaWZ0IEMrKyBsaWJyYXJ5IGlzIHR5cGljYWxseSBidWlsdCB3aXRoIGRlYnVnZ2luZwotc3ltYm9scyBpbmNsdWRlZC4gSWYgeW91IHdhbnQgdG8gY3VzdG9taXplIHRoZXNlIG9wdGlvbnMgeW91IHNob3VsZCB1c2UgdGhlCi1DWFhGTEFHUyBvcHRpb24gaW4gY29uZmlndXJlLCBhcyBzdWNoOgotCi0gICAgICAgIC4vY29uZmlndXJlIENYWEZMQUdTPSctZyAtTzInCi0gICAgICAgIC4vY29uZmlndXJlIENGTEFHUz0nLWcgLU8yJwotICAgICAgICAuL2NvbmZpZ3VyZSBDUFBGTEFHUz0nLURERUJVR19NWV9GRUFUVVJFJwotCi1SdW4gLi9jb25maWd1cmUgLS1oZWxwIHRvIHNlZSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMKLQotUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIFB5dGhvbiBsaWJyYXJ5IHdpbGwgaWdub3JlIHRoZSAtLXByZWZpeCBvcHRpb24KLWFuZCBqdXN0IGluc3RhbGwgd2hlcmV2ZXIgUHl0aG9uJ3MgZGlzdHV0aWxzIHB1dHMgaXQgKHVzdWFsbHkgYWxvbmcKLXRoZSBsaW5lcyBvZiAvdXNyL2xpYi9weXRob25YLlkvc2l0ZS1wYWNrYWdlcy8pLiAgSWYgeW91IG5lZWQgdG8gY29udHJvbAotd2hlcmUgdGhlIFB5dGhvbiBtb2R1bGVzIGFyZSBpbnN0YWxsZWQsIHNldCB0aGUgUFlfUFJFRklYIHZhcmlhYmxlLgotKERFU1RESVIgaXMgcmVzcGVjdGVkIGZvciBQeXRob24gYW5kIEMrKy4pCi0KLU1ha2UgdGhyaWZ0OgotCi0JbWFrZQotCi1Gcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBiZWNvbWUgc3VwZXJ1c2VyIGFuZCBkbzoKLQotCW1ha2UgaW5zdGFsbAotCi1Ob3RlIHRoYXQgc29tZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBtYW51YWxseSB1c2luZyBidWlsZCB0b29scwotYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMgKGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgdGhpcyBhcHBsaWVzCi10byBKYXZhLCBSdWJ5LCBQSFApLgotCi1Mb29rIGZvciB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGxpYi88bGFuZ3VhZ2U+LyBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKLWluc3RhbGxhdGlvbiBvZiBlYWNoIGxhbmd1YWdlIGxpYnJhcnkgcGFja2FnZS4KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDllNmUxCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTkyIEBACitBcGFjaGUgVGhyaWZ0Cis9PT09PT09PT09PT09CisKK0ludHJvZHVjdGlvbgorPT09PT09PT09PT09CisKK1RocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCithc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIHBvaW50LXRvLXBvaW50IFJQQy4gVGhyaWZ0IHByb3ZpZGVzIAorY2xlYW4gYWJzdHJhY3Rpb25zIGZvciBkYXRhIHRyYW5zcG9ydCwgZGF0YSBzZXJpYWxpemF0aW9uLCBhbmQgYXBwbGljYXRpb24KK2xldmVsIHByb2Nlc3NpbmcuIFRoZSBjb2RlIGdlbmVyYXRpb24gc3lzdGVtIHRha2VzIGEgc2ltcGxlIGRlZmluaXRpb24KK2xhbmd1YWdlIGFzIGlucHV0IGFuZCBnZW5lcmF0ZXMgY29kZSBhY3Jvc3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHRoYXQKK3VzZXMgdGhlIGFic3RyYWN0ZWQgc3RhY2sgdG8gYnVpbGQgaW50ZXJvcGVyYWJsZSBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4KKworIVtBcGFjaGUgVGhyaWZ0IExheWVyZWQgQXJjaGl0ZWN0dXJlXShkb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nKQorCitUaHJpZnQgbWFrZXMgaXQgZWFzeSBmb3IgcHJvZ3JhbXMgd3JpdHRlbiBpbiBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlcyB0byBzaGFyZSBkYXRhIGFuZCBjYWxsIHJlbW90ZSBwcm9jZWR1cmVzLiAgV2l0aCBzdXBwb3J0IAorZm9yIFsyNSBwcm9ncmFtbWluZyBsYW5ndWFnZXNdKExBTkdVQUdFUy5tZCksIGNoYW5jZXMgYXJlIFRocmlmdCAKK3N1cHBvcnRzIHRoZSBsYW5ndWFnZXMgdGhhdCB5b3UgY3VycmVudGx5IHVzZS4KKworVGhyaWZ0IGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCB0byBzdXBwb3J0IG5vbi1hdG9taWMgdmVyc2lvbiBjaGFuZ2VzCithY3Jvc3MgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZS4KKworRm9yIG1vcmUgZGV0YWlscyBvbiBUaHJpZnQncyBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uLCBzZWUgdGhlIFRocmlmdAord2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIFJFQURNRS5tZCBmaWxlCitpbiB5b3VyIHBhcnRpY3VsYXIgc3ViZGlyZWN0b3J5IG9mIGludGVyZXN0LgorCitTdGF0dXMKKz09PT09PQorCit8IEJyYW5jaCB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBXZWJzaXRlIHwKK3wgOi0tLS0tIHwgOi0tLS0tIHwgOi0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLSB8IDotLS0tLS0gfAorfCBbYG1hc3RlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdCkgfCBbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2FwYWNoZS90aHJpZnQ/YnJhbmNoPW1hc3RlciZzdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQXBhY2hlU29mdHdhcmVGb3VuZGF0aW9uL3RocmlmdC9oaXN0b3J5KSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzEzNDUvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy90aHJpZnQpIHwgfCBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL29mZmljaWFsLXdlYnNpdGUtYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIHwKKworUmVsZWFzZXMKKz09PT09PT09CisKK1RocmlmdCBkb2VzIG5vdCBtYWludGFpbiBhIHNwZWNpZmljIHJlbGVhc2UgY2FsZW5kYXIgYXQgdGhpcyB0aW1lLiAgCisKK1dlIHN0cml2ZSB0byByZWxlYXNlIHR3aWNlIHllYXJseS4gIERvd25sb2FkIHRoZSBbY3VycmVudCByZWxlYXNlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQpLgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitQcm9qZWN0IEhpZXJhcmNoeQorPT09PT09PT09PT09PT09PT0KKwordGhyaWZ0LworCisgIGNvbXBpbGVyLworCisgICAgQ29udGFpbnMgdGhlIFRocmlmdCBjb21waWxlciwgaW1wbGVtZW50ZWQgaW4gQysrLgorCisgIGxpYi8KKworICAgIENvbnRhaW5zIHRoZSBUaHJpZnQgc29mdHdhcmUgbGlicmFyeSBpbXBsZW1lbnRhdGlvbiwgc3ViZGl2aWRlZCBieQorICAgIGxhbmd1YWdlIG9mIGltcGxlbWVudGF0aW9uLgorCisgICAgY3BwLworICAgIGdvLworICAgIGphdmEvCisgICAgcGhwLworICAgIHB5LworICAgIHJiLworICAgIC4uLgorCisgIHRlc3QvCisKKyAgICBDb250YWlucyBzYW1wbGUgVGhyaWZ0IGZpbGVzIGFuZCB0ZXN0IGNvZGUgYWNyb3NzIHRoZSB0YXJnZXQgcHJvZ3JhbW1pbmcKKyAgICBsYW5ndWFnZXMuCisKKyAgdHV0b3JpYWwvCisKKyAgICBDb250YWlucyBhIGJhc2ljIHR1dG9yaWFsIHRoYXQgd2lsbCB0ZWFjaCB5b3UgaG93IHRvIGRldmVsb3Agc29mdHdhcmUKKyAgICB1c2luZyBUaHJpZnQuCisKK0RldmVsb3BtZW50Cis9PT09PT09PT09PQorCitUbyBidWlsZCB0aGUgc2FtZSB3YXkgVHJhdmlzIENJIGJ1aWxkcyB0aGUgcHJvamVjdCB5b3Ugc2hvdWxkIHVzZSBkb2NrZXIuCitXZSBoYXZlIFtjb21wcmVoZW5zaXZlIGJ1aWxkaW5nIGluc3RydWN0aW9ucyBmb3IgZG9ja2VyXShidWlsZC9kb2NrZXIvUkVBRE1FLm1kKS4KKworUmVxdWlyZW1lbnRzCis9PT09PT09PT09PT0KKworU2VlIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwgZm9yIGEgbGlzdCBvZiBidWlsZCByZXF1aXJlbWVudHMgKG1heSBiZSBzdGFsZSkuICBBbHRlcm5hdGl2ZWx5IHNlZSB0aGUgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50cyBmb3IgYSBsaXN0IG9mIHByZXJlcXVpc2l0ZXMuCisKK1Jlc291cmNlcworPT09PT09PT09CisKK01vcmUgaW5mb3JtYXRpb24gYWJvdXQgVGhyaWZ0IGNhbiBiZSBvYnRhaW5lZCBvbiB0aGUgVGhyaWZ0IHdlYnBhZ2UgYXQ6CisKKyAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK0Fja25vd2xlZGdtZW50cworPT09PT09PT09PT09PT09CisKK1RocmlmdCB3YXMgaW5zcGlyZWQgYnkgcGlsbGFyLCBhIGxpZ2h0d2VpZ2h0IFJQQyB0b29sIHdyaXR0ZW4gYnkgQWRhbSBEJ0FuZ2VsbywKK2FuZCBhbHNvIGJ5IEdvb2dsZSdzIHByb3RvY29sIGJ1ZmZlcnMuCisKK0luc3RhbGxhdGlvbgorPT09PT09PT09PT09CisKK0lmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSB0aGUgZmlyc3QgdGltZSBvdXQgb2YgdGhlIHNvdXJjZSByZXBvc2l0b3J5LCB5b3Ugd2lsbAorbmVlZCB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdHMuICAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdQorZG93bmxvYWRlZCBhIHRhcmJhbGwuKSAgRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKyAgICAuL2Jvb3RzdHJhcC5zaAorCitPbmNlIHRoZSBjb25maWd1cmUgc2NyaXB0cyBhcmUgZ2VuZXJhdGVkLCB0aHJpZnQgY2FuIGJlIGNvbmZpZ3VyZWQuCitGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworICAgIC4vY29uZmlndXJlCisKK1lvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgYm9vc3QgZmlsZXMgZXhwbGljaXRseS4KK0lmIHlvdSBpbnN0YWxsZWQgYm9vc3QgaW4gL3Vzci9sb2NhbCwgeW91IHdvdWxkIHJ1biBjb25maWd1cmUgYXMgZm9sbG93czoKKworICAgIC4vY29uZmlndXJlIC0td2l0aC1ib29zdD0vdXNyL2xvY2FsCisKK05vdGUgdGhhdCBieSBkZWZhdWx0IHRoZSB0aHJpZnQgQysrIGxpYnJhcnkgaXMgdHlwaWNhbGx5IGJ1aWx0IHdpdGggZGVidWdnaW5nCitzeW1ib2xzIGluY2x1ZGVkLiBJZiB5b3Ugd2FudCB0byBjdXN0b21pemUgdGhlc2Ugb3B0aW9ucyB5b3Ugc2hvdWxkIHVzZSB0aGUKK0NYWEZMQUdTIG9wdGlvbiBpbiBjb25maWd1cmUsIGFzIHN1Y2g6CisKKyAgICAuL2NvbmZpZ3VyZSBDWFhGTEFHUz0nLWcgLU8yJworICAgIC4vY29uZmlndXJlIENGTEFHUz0nLWcgLU8yJworICAgIC4vY29uZmlndXJlIENQUEZMQUdTPSctRERFQlVHX01ZX0ZFQVRVUkUnCisKK1RvIGVuYWJsZSBnY292IHJlcXVpcmVkIG9wdGlvbnMgLWZwcm9maWxlLWFyY3MgLWZ0ZXN0LWNvdmVyYWdlIGVuYWJsZSB0aGVtOgorCisgICAgLi9jb25maWd1cmUgIC0tZW5hYmxlLWNvdmVyYWdlCisKK1J1biAuL2NvbmZpZ3VyZSAtLWhlbHAgdG8gc2VlIG90aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworCitQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgUHl0aG9uIGxpYnJhcnkgd2lsbCBpZ25vcmUgdGhlIC0tcHJlZml4IG9wdGlvbgorYW5kIGp1c3QgaW5zdGFsbCB3aGVyZXZlciBQeXRob24ncyBkaXN0dXRpbHMgcHV0cyBpdCAodXN1YWxseSBhbG9uZwordGhlIGxpbmVzIG9mIC91c3IvbGliL3B5dGhvblguWS9zaXRlLXBhY2thZ2VzLykuICBJZiB5b3UgbmVlZCB0byBjb250cm9sCit3aGVyZSB0aGUgUHl0aG9uIG1vZHVsZXMgYXJlIGluc3RhbGxlZCwgc2V0IHRoZSBQWV9QUkVGSVggdmFyaWFibGUuCisoREVTVERJUiBpcyByZXNwZWN0ZWQgZm9yIFB5dGhvbiBhbmQgQysrLikKKworTWFrZSB0aHJpZnQ6CisKKwltYWtlCisKK0Zyb20gdGhlIHRvcCBkaXJlY3RvcnksIGJlY29tZSBzdXBlcnVzZXIgYW5kIGRvOgorCisJbWFrZSBpbnN0YWxsCisKK05vdGUgdGhhdCBzb21lIGxhbmd1YWdlIHBhY2thZ2VzIG11c3QgYmUgaW5zdGFsbGVkIG1hbnVhbGx5IHVzaW5nIGJ1aWxkIHRvb2xzCitiZXR0ZXIgc3VpdGVkIHRvIHRob3NlIGxhbmd1YWdlcyAoYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCB0aGlzIGFwcGxpZXMKK3RvIEphdmEsIFJ1YnksIFBIUCkuCisKK0xvb2sgZm9yIHRoZSBSRUFETUUubWQgZmlsZSBpbiB0aGUgbGliLzxsYW5ndWFnZT4vIGZvbGRlciBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZQoraW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgorCitUZXN0aW5nCis9PT09PT09CisKK1RoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiBjbGllbnQgbGlicmFyeSB0ZXN0cyB0aGF0IGNhbiBhbGwgYmUgcnVuCitmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgorCisgICAgICAgICAgbWFrZSAtayBjaGVjaworCitUaGlzIHdpbGwgbWFrZSBhbGwgb2YgdGhlIGxpYnJhcmllcyAoYXMgbmVjZXNzYXJ5KSwgYW5kIHJ1biB0aHJvdWdoCit0aGUgdW5pdCB0ZXN0cyBkZWZpbmVkIGluIGVhY2ggb2YgdGhlIGNsaWVudCBsaWJyYXJpZXMuIElmIGEgc2luZ2xlCitsYW5ndWFnZSBmYWlscywgdGhlIG1ha2UgY2hlY2sgd2lsbCBjb250aW51ZSBvbiBhbmQgcHJvdmlkZSBhIHN5bm9wc2lzCithdCB0aGUgZW5kLgorCitUbyBydW4gdGhlIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUsIHBsZWFzZSBydW46CisKKyAgICAgICAgICBtYWtlIGNyb3NzCisKK1RoaXMgd2lsbCBydW4gYSBzZXQgb2YgdGVzdHMgdGhhdCB1c2UgZGlmZmVyZW50IGxhbmd1YWdlIGNsaWVudHMgYW5kCitzZXJ2ZXJzLgorCisKZGlmZiAtLWdpdCBhL1RocmlmdC1zd2lmdDMucG9kc3BlYyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZjMDBiCi0tLSAvZGV2L251bGwKKysrIGIvVGhyaWZ0LXN3aWZ0My5wb2RzcGVjCkBAIC0wLDAgKzEsMTYgQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQtc3dpZnQzIgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCisgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgorICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgorICAgICAgICAgICAgICAgICAgICBERVNDCisgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCisgIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAnIH0KKyAgcy5hdXRob3IgICAgICAgID0geyAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiA9PiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiB9CisgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzkuMCcKKyAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuMTAnCisgIHMucmVxdWlyZXNfYXJjICA9IHRydWUKKyAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ2MS4wLjAiIH0KKyAgcy5zb3VyY2VfZmlsZXMgID0gImxpYi9zd2lmdC9Tb3VyY2VzLyouc3dpZnQiCitlbmQKZGlmZiAtLWdpdCBhL1RocmlmdC5wb2RzcGVjIGIvVGhyaWZ0LnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwNmVlYwotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC5wb2RzcGVjCkBAIC0wLDAgKzEsMTggQEAKK1BvZDo6U3BlYy5uZXcgZG8gfHN8CisgIHMubmFtZSAgICAgICAgICA9ICJUaHJpZnQiCisgIHMudmVyc2lvbiAgICAgICA9ICIxLjAuMCIKKyAgcy5zdW1tYXJ5ICAgICAgID0gIkFwYWNoZSBUaHJpZnQgaXMgYSBsaWdodHdlaWdodCwgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgc29mdHdhcmUgc3RhY2sgd2l0aCBhbiBhc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4iCisgIHMuZGVzY3JpcHRpb24gICA9IDw8LURFU0MKK1RoZSBBcGFjaGUgVGhyaWZ0IHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNvZnR3YXJlIGZyYW1ld29yayBmb3IgbmV0d29ya2VkIHNlcnZpY2VzIGRldmVsb3BtZW50IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuCisgICAgICAgICAgICAgICAgICAgIERFU0MKKyAgcy5ob21lcGFnZSAgICAgID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKKyAgcy5saWNlbnNlICAgICAgID0geyA6dHlwZSA9PiAnQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wJywgOnVybCA9PiAnaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcgfQorICBzLmF1dGhvciAgICAgICAgPSB7ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiID0+ICJkZXZAdGhyaWZ0LmFwYWNoZS5vcmciIH0KKyAgcy5yZXF1aXJlc19hcmMgID0gdHJ1ZQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc3LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjgnCisgIHMuaW9zLmZyYW1ld29yayA9ICdDRk5ldHdvcmsnCisgIHMub3N4LmZyYW1ld29yayA9ICdDb3JlU2VydmljZXMnCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICdsaWIvY29jb2Evc3JjLyoqLyoue2gsbSxzd2lmdH0nCitlbmQKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCBiL2FjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDExOThiCi0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9hY19wcm9nX2Jpc29uLm00CkBAIC0wLDAgKzEsNTQgQEAKK2RubAorZG5sIENoZWNrIEJpc29uIHZlcnNpb24KK2RubCBBQ19QUk9HX0JJU09OKFtNSU5fVkVSU0lPTj0yLjRdKQorZG5sCitkbmwgV2lsbCBkZWZpbmUgQklTT05fVVNFX1BBUlNFUl9IX0VYVEVOU0lPTiBpZiBBdXRvbWFrZSBpcyA8IDEuMTEKK2RubCBmb3IgdXNlIHdpdGggLmggaW5jbHVkZXMuCitkbmwKKworQUNfREVGVU4oW0FDX1BST0dfQklTT05dLCBbCitpZiB0ZXN0ICJ4JDEiID0gIngiIDsgdGhlbgorICBiaXNvbl9yZXF1aXJlZF92ZXJzaW9uPSIyLjQiCitlbHNlCisgIGJpc29uX3JlcXVpcmVkX3ZlcnNpb249IiQxIgorZmkKKworQUNfQ0hFQ0tfUFJPRyhoYXZlX3Byb2dfYmlzb24sIFtiaXNvbl0sIFt5ZXNdLFtub10pCisKK0FDX0RFRklORV9VTlFVT1RFRChbQklTT05fVkVSU0lPTl0sIFswLjBdLCBbQmlzb24gdmVyc2lvbiBpZiBiaXNvbiBpcyBub3QgYXZhaWxhYmxlXSkKKworI0RvIG5vdCB1c2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlcywgdXNlIG5ld2VyICouaGgKK2Jpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb249ZmFsc2UKKworaWYgdGVzdCAiJGhhdmVfcHJvZ19iaXNvbiIgPSAieWVzIiA7IHRoZW4KKyAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYmlzb24gdmVyc2lvbiA+PSAkYmlzb25fcmVxdWlyZWRfdmVyc2lvbl0pCisgIGJpc29uX3ZlcnNpb249YGJpc29uIC0tdmVyc2lvbiB8IGhlYWQgLW4gMSB8IGN1dCAnLWQgJyAtZiA0YAorICBBQ19ERUZJTkVfVU5RVU9URUQoW0JJU09OX1ZFUlNJT05dLCBbJGJpc29uX3ZlcnNpb25dLCBbRGVmaW5lcyBiaXNvbiB2ZXJzaW9uXSkKKyAgaWYgdGVzdCAiJGJpc29uX3ZlcnNpb24iIFw8ICIkYmlzb25fcmVxdWlyZWRfdmVyc2lvbiIgOyB0aGVuCisgICAgQklTT049OgorICAgIEFDX01TR19SRVNVTFQoW25vXSkKKyAgICBBQ19NU0dfRVJST1IoW0Jpc29uIHZlcnNpb24gJGJpc29uX3JlcXVpcmVkX3ZlcnNpb24gb3IgaGlnaGVyIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0hXSkKKyAgZWxzZQorICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgQklTT049Ymlzb24KKyAgICBBQ19TVUJTVChCSVNPTikKKworICAgICNWZXJpZnkgYXV0b21ha2UgdmVyc2lvbiAxLjExIGhlYWRlcnMgZm9yIHl5IGZpbGVzIGFyZSAuaCwgPiAxLjEyIHVzZXMgLmhoCisgICAgYXV0b21ha2VfdmVyc2lvbj1gYXV0b21ha2UgLS12ZXJzaW9uIHwgaGVhZCAtbiAxIHwgY3V0ICctZCAnIC1mIDRgCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKFtBVVRPTUFLRV9WRVJTSU9OXSwgWyRhdXRvbWFrZV92ZXJzaW9uXSwgW0RlZmluZXMgYXV0b21ha2UgdmVyc2lvbl0pCisKKyAgICBpZiB0ZXN0ICIkYXV0b21ha2VfdmVyc2lvbiIgXDwgIjEuMTIiIDsgdGhlbgorICAgICAgI1VzZSAqLmggZXh0ZW5zaW9uIGZvciBwYXJzZXIgaGVhZGVyIGZpbGUKKyAgICAgIGJpc29uX3VzZV9wYXJzZXJfaF9leHRlbnNpb249dHJ1ZQorICAgICAgZWNobyAiQXV0b21ha2UgdmVyc2lvbiA8IDEuMTIiCisgICAgICBBQ19ERUZJTkUoW0JJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT05dLCBbMV0sIFtVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlXSkKKyAgICBmaQorICBmaQorZWxzZQorICBCSVNPTj06CisgIEFDX01TR19SRVNVTFQoW05PXSkKK2ZpCisKK0FNX0NPTkRJVElPTkFMKFtCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OXSwgW3Rlc3QgeCRiaXNvbl91c2VfcGFyc2VyX2hfZXh0ZW5zaW9uID0geHRydWVdKQorQUNfU1VCU1QoQklTT04pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGIvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CmluZGV4IDgwNmY5OGIuLmQ1NDAzOTUgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNAorKysgYi9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKQEAgLTEsMTcgKzEsMTkgQEAKLSMjIyMjIGh0dHA6Ly9hdXRvY29uZi1hcmNoaXZlLmNyeXAudG8vYXhfYm9vc3RfYmFzZS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9ib29zdF9iYXNlLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCiAjCi0jICAgQVhfQk9PU1RfQkFTRShbTUlOSU1VTS1WRVJTSU9OXSkKKyMgICBBWF9CT09TVF9CQVNFKFtNSU5JTVVNLVZFUlNJT05dLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQogIwogIyBERVNDUklQVElPTgogIwogIyAgIFRlc3QgZm9yIHRoZSBCb29zdCBDKysgbGlicmFyaWVzIG9mIGEgcGFydGljdWxhciB2ZXJzaW9uIChvciBuZXdlcikKICMKLSMgICBJZiBubyBwYXRoIHRvIHRoZSBpbnN0YWxsZWQgYm9vc3QgbGlicmFyeSBpcyBnaXZlbiB0aGUgbWFjcm8KLSMgICBzZWFyY2hzIHVuZGVyIC91c3IsIC91c3IvbG9jYWwsIC9vcHQgYW5kIC9vcHQvbG9jYWwgYW5kIGV2YWx1YXRlcwotIyAgIHRoZSAkQk9PU1RfUk9PVCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRnVydGhlciBkb2N1bWVudGF0aW9uIGlzCi0jICAgYXZhaWxhYmxlIGF0IDxodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0L2luZGV4Lmh0bWw+LgorIyAgIElmIG5vIHBhdGggdG8gdGhlIGluc3RhbGxlZCBib29zdCBsaWJyYXJ5IGlzIGdpdmVuIHRoZSBtYWNybyBzZWFyY2hzCisjICAgdW5kZXIgL3VzciwgL3Vzci9sb2NhbCwgL29wdCBhbmQgL29wdC9sb2NhbCBhbmQgZXZhbHVhdGVzIHRoZQorIyAgICRCT09TVF9ST09UIGVudmlyb25tZW50IHZhcmlhYmxlLiBGdXJ0aGVyIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0CisjICAgPGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QvaW5kZXguaHRtbD4uCiAjCiAjICAgVGhpcyBtYWNybyBjYWxsczoKICMKQEAgLTIxLDE4NyArMjMsMjc5IEBACiAjCiAjICAgICBIQVZFX0JPT1NUCiAjCi0jIExBU1QgTU9ESUZJQ0FUSU9OCisjIExJQ0VOU0UKICMKLSMgICAyMDA3LTA3LTI4Ci0jICAgTW9kaWZpZWQgZm9yIHVzZSBpbiBUaHJpZnQKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+CisjICAgQ29weXJpZ2h0IChjKSAyMDA5IFBldGVyIEFkb2xwaHMKICMKLSMgQ09QWUxFRlQKLSMKLSMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+Ci0jCi0jICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0Ci0jICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCi0jICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDQ1CisKKyMgZXhhbXBsZSBib29zdCBwcm9ncmFtIChuZWVkIHRvIHBhc3MgdmVyc2lvbikKK200X2RlZmluZShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTV0sCisgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorXV0sW1sKKyh2b2lkKSAoKHZvaWQpc2l6ZW9mKGNoYXJbMSAtIDIqISEoKEJPT1NUX1ZFUlNJT04pIDwgKCQxKSldKSk7CitdXSldKQogCiBBQ19ERUZVTihbQVhfQk9PU1RfQkFTRV0sCiBbCiBBQ19BUkdfV0lUSChbYm9vc3RdLAotCUFTX0hFTFBfU1RSSU5HKFstLXdpdGgtYm9vc3RAPDpAPURJUkA6PkBdLCBbdXNlIGJvb3N0IFtkZWZhdWx0PXllc10uIE9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgcm9vdCBwcmVmaXggZGlyIHdoZXJlIGJvb3N0IGlzIGluc3RhbGxlZF0pLAotCVsKLSAgICBpZiB0ZXN0ICIkd2l0aHZhbCIgPSAibm8iOyB0aGVuCi0JCXdhbnRfYm9vc3Q9Im5vIgotICAgIGVsaWYgdGVzdCAiJHdpdGh2YWwiID0gInllcyI7IHRoZW4KLSAgICAgICAgd2FudF9ib29zdD0ieWVzIgotICAgICAgICBhY19ib29zdF9wYXRoPSIiCi0gICAgZWxzZQotCSAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiR3aXRodmFsIgotCWZpCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0QDw6QD1BUkdAOj5AXSwKKyAgICBbdXNlIEJvb3N0IGxpYnJhcnkgZnJvbSBhIHN0YW5kYXJkIGxvY2F0aW9uIChBUkc9eWVzKSwKKyAgICAgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIChBUkc9PHBhdGg+KSwKKyAgICAgb3IgZGlzYWJsZSBpdCAoQVJHPW5vKQorICAgICBAPDpAQVJHPXllc0A6PkAgXSldLAorICAgIFsKKyAgICAgQVNfQ0FTRShbJHdpdGh2YWxdLAorICAgICAgIFtub10sW3dhbnRfYm9vc3Q9Im5vIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbeWVzXSxbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIkd2l0aHZhbCJdKQogICAgIF0sCiAgICAgW3dhbnRfYm9vc3Q9InllcyJdKQogCi1pZiB0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiOyB0aGVuCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxPWlmZWxzZShbJDFdLCAsMS4yMC4wLCQxKQotCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCi0JYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfbWlub3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLQlib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAotCWlmIHRlc3QgIngkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vciIgPSAieCIgOyB0aGVuCi0JCWJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3I9IjAiCi0gICAgCWZpCi0JV0FOVF9CT09TVF9WRVJTSU9OPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yIFwqIDEwMCBcKyAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcmAKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIGJvb3N0bGliID49ICRib29zdF9saWJfdmVyc2lvbl9yZXEpCi0Jc3VjY2VlZGVkPW5vCiAKLQlkbmwgZmlyc3Qgd2UgY2hlY2sgdGhlIHN5c3RlbSBsb2NhdGlvbiBmb3IgYm9vc3QgbGlicmFyaWVzCi0JZG5sIHRoaXMgbG9jYXRpb24gaXN0IGNob3NlbiBpZiBib29zdCBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCB3aXRoIHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uCi0JZG5sIG9yIGlmIHlvdSBpbnN0YWxsIGJvb3N0IHdpdGggUlBNCi0JaWYgdGVzdCAiJGFjX2Jvb3N0X3BhdGgiICE9ICIiOyB0aGVuCi0JCUJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGgvbGliIgotCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlIgotCQlCT09TVF9ST09UX1BBVEg9IiRhY19ib29zdF9wYXRoIgotCWVsc2UKLQkJZm9yIGFjX2Jvb3N0X3BhdGhfdG1wIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbwotCQkJaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IjsgdGhlbgotCQkJCUJPT1NUX0xERkxBR1M9Ii1MJGFjX2Jvb3N0X3BhdGhfdG1wL2xpYiIKLQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZSIKLQkJCQlCT09TVF9ST09UX1BBVEg9IiRhY19ib29zdF9wYXRoX3RtcCIKLQkJCQlicmVhazsKLQkJCWZpCi0JCWRvbmUKLQlmaQorQUNfQVJHX1dJVEgoW2Jvb3N0LWxpYmRpcl0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0LWxpYmRpcj1MSUJfRElSXSwKKyAgICBbRm9yY2UgZ2l2ZW4gZGlyZWN0b3J5IGZvciBib29zdCBsaWJyYXJpZXMuCisgICAgIE5vdGUgdGhhdCB0aGlzIHdpbGwgb3ZlcnJpZGUgbGlicmFyeSBwYXRoIGRldGVjdGlvbiwKKyAgICAgc28gdXNlIHRoaXMgcGFyYW1ldGVyIG9ubHkgaWYgZGVmYXVsdCBsaWJyYXJ5IGRldGVjdGlvbiBmYWlscworICAgICBhbmQgeW91IGtub3cgZXhhY3RseSB3aGVyZSB5b3VyIGJvb3N0IGxpYnJhcmllcyBhcmUgbG9jYXRlZC5dKV0sCisgIFsKKyAgIEFTX0lGKFt0ZXN0IC1kICIkd2l0aHZhbCJdLAorICAgICAgICAgW19BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoPSIkd2l0aHZhbCJdLAorICAgIFtBQ19NU0dfRVJST1IoWy0td2l0aC1ib29zdC1saWJkaXIgZXhwZWN0ZWQgZGlyZWN0b3J5IG5hbWVdKV0pCisgIF0sCisgIFtfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aD0iIl0pCiAKLQlDUFBGTEFHU19TQVZFRD0iJENQUEZMQUdTIgotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgJEJPT1NUX0NQUEZMQUdTIgotCWV4cG9ydCBDUFBGTEFHUworQk9PU1RfTERGTEFHUz0iIgorQk9PU1RfQ1BQRkxBR1M9IiIKK0FTX0lGKFt0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiXSwKKyAgICAgIFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1QoWyQxXSxbJDJdLFskM10pXSkKK0FDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQorQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKK10pCiAKLQlMREZMQUdTX1NBVkVEPSIkTERGTEFHUyIKLQlMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKLQlleHBvcnQgTERGTEFHUwogCi0JZXhwb3J0IEJPT1NUX1JPT1RfUEFUSAorIyBjb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgaW4gJDIgdG8gbnVtZXJpYyBhbmQgYWZmZWN0IHRvIHBvbHltb3JwaGljIHZhciAkMQorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05dLFsKKyAgQVNfSUYoW3Rlc3QgIngkMiIgPSAieCJdLFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcT0iMS4yMC4wIl0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIkMiJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zaG9ydGVuPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIiA9ICJ4Il0sCisgICAgICAgIFtBQ19NU0dfRVJST1IoW1lvdSBzaG91bGQgYXQgbGVhc3Qgc3BlY2lmeSBsaWJib29zdCBtYWpvciB2ZXJzaW9uXSldKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLlwoW1swLTldXSpcKSdgCisgIEFTX0lGKFt0ZXN0ICJ4JF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIiA9ICJ4Il0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1tbMC05XV0qXC5bWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIlgkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yIiA9ICJYIl0sCisgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3I9IjAiXSkKKyAgX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9SRVQ9YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21ham9yIFwqIDEwMDAwMCBcKyAgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yIFwqIDEwMCBcKyAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfc3ViX21pbm9yYAorICBBU19WQVJfU0VUKCQxLCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVCkKK10pCiAKLQlBQ19MQU5HX1BVU0goQysrKQotICAgICAJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotCUAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLQldXSwgW1sKLQkjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0JLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0JI2Vsc2UKLQkjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLQkjZW5kaWYKLQldXSldLFsKK2RubCBSdW4gdGhlIGRldGVjdGlvbiBvZiBib29zdCBzaG91bGQgYmUgcnVuIG9ubHkgaWYgJHdhbnRfYm9vc3QKK0FDX0RFRlVOKFtfQVhfQk9PU1RfQkFTRV9SVU5ERVRFQ1RdLFsKKyAgICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OKFdBTlRfQk9PU1RfVkVSU0lPTixbJDFdKQorICAgIHN1Y2NlZWRlZD1ubworCisKKyAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCisgICAgZG5sIE9uIDY0LWJpdCBzeXN0ZW1zIGNoZWNrIGZvciBzeXN0ZW0gbGlicmFyaWVzIGluIGJvdGggbGliNjQgYW5kIGxpYi4KKyAgICBkbmwgVGhlIGZvcm1lciBpcyBzcGVjaWZpZWQgYnkgRkhTLCBidXQgZS5nLiBEZWJpYW4gZG9lcyBub3QgYWRoZXJlIHRvCisgICAgZG5sIHRoaXMgKGFzIGl0IHJpc2VzIHByb2JsZW1zIGZvciBnZW5lcmljIG11bHRpLWFyY2ggc3VwcG9ydCkuCisgICAgZG5sIFRoZSBsYXN0IGVudHJ5IGluIHRoZSBsaXN0IGlzIGNob3NlbiBieSBkZWZhdWx0IHdoZW4gbm8gbGlicmFyaWVzCisgICAgZG5sIGFyZSBmb3VuZCwgZS5nLiB3aGVuIG9ubHkgaGVhZGVyLW9ubHkgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQhCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW3g4Nl82NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYngzMiBsaWIgbGliNjQiXSwKKyAgICAgIFtwcGM2NHxwb3dlcnBjNjR8czM5MHh8c3BhcmM2NHxhYXJjaDY0fHBwYzY0bGV8cG93ZXJwYzY0bGV8cmlzY3Y2NF0sW2xpYnN1YmRpcnM9ImxpYjY0IGxpYiBsaWI2NCJdLAorICAgICAgW2xpYnN1YmRpcnM9ImxpYiJdCisgICAgKQorCisgICAgZG5sIGFsbG93IGZvciByZWFsIG11bHRpLWFyY2ggcGF0aHMgZS5nLiAvdXNyL2xpYi94ODZfNjQtbGludXgtZ251LiBHaXZlCisgICAgZG5sIHRoZW0gcHJpb3JpdHkgb3ZlciB0aGUgb3RoZXIgcGF0aHMgc2luY2UsIGlmIGxpYnMgYXJlIGZvdW5kIHRoZXJlLCB0aGV5CisgICAgZG5sIGFyZSBhbG1vc3QgYXNzdXJlZGx5IHRoZSBvbmVzIGRlc2lyZWQuCisgICAgQVNfQ0FTRShbJHtob3N0X2NwdX1dLAorICAgICAgW2k/ODZdLFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9Il0sCisgICAgICBbbXVsdGlhcmNoX2xpYnN1YmRpcj0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30iXQorICAgICkKKworICAgIGRubCBmaXJzdCB3ZSBjaGVjayB0aGUgc3lzdGVtIGxvY2F0aW9uIGZvciBib29zdCBsaWJyYXJpZXMKKyAgICBkbmwgdGhpcyBsb2NhdGlvbiBpc3QgY2hvc2VuIGlmIGJvb3N0IGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHdpdGggdGhlIC0tbGF5b3V0PXN5c3RlbSBvcHRpb24KKyAgICBkbmwgb3IgaWYgeW91IGluc3RhbGwgYm9vc3Qgd2l0aCBSUE0KKyAgICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiAhPSAieCJdLFsKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgYm9vc3RsaWIgPj0gJDEgKCRXQU5UX0JPT1NUX1ZFUlNJT04pIGluY2x1ZGVzIGluICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlIl0pCisgICAgICAgICBBU19JRihbdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSJdLFsKKyAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSIKKyAgICAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIGluICRtdWx0aWFyY2hfbGlic3ViZGlyICRsaWJzdWJkaXJzOyBkbworICAgICAgICAgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKSBsaWIgcGF0aCBpbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIl0pCisgICAgICAgICAgICAgICAgQVNfSUYoW3Rlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIiBdLFsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBdLAorICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKQorICAgICAgICAgICBkb25lXSxbCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICBdLFsKKyAgICAgICAgaWYgdGVzdCBYIiRjcm9zc19jb21waWxpbmciID0gWHllczsgdGhlbgorICAgICAgICAgICAgc2VhcmNoX2xpYnN1YmRpcnM9JG11bHRpYXJjaF9saWJzdWJkaXIKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2VhcmNoX2xpYnN1YmRpcnM9IiRtdWx0aWFyY2hfbGlic3ViZGlyICRsaWJzdWJkaXJzIgorICAgICAgICBmaQorICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAgaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCisgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBsaWJzdWJkaXIgaW4gJHNlYXJjaF9saWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUiCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgXSkKKworICAgIGRubCBvdmVyd3JpdGUgbGQgZmxhZ3MgaWYgd2UgaGF2ZSByZXF1aXJlZCBzcGVjaWFsIGRpcmVjdG9yeSB3aXRoCisgICAgZG5sIC0td2l0aC1ib29zdC1saWJkaXIgcGFyYW1ldGVyCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiICE9ICJ4Il0sCisgICAgICAgICAgW0JPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIl0pCisKKyAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTildKQorICAgIENQUEZMQUdTX1NBVkVEPSIkQ1BQRkxBR1MiCisgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCisgICAgZXhwb3J0IENQUEZMQUdTCisKKyAgICBMREZMQUdTX1NBVkVEPSIkTERGTEFHUyIKKyAgICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKKyAgICBleHBvcnQgTERGTEFHUworCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19DWFhdKQorICAgIEFDX0xBTkdfUFVTSChDKyspCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtfQVhfQk9PU1RfQkFTRV9QUk9HUkFNKCRXQU5UX0JPT1NUX1ZFUlNJT04pXSxbCiAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQotCXN1Y2NlZWRlZD15ZXMKLQlmb3VuZF9zeXN0ZW09eWVzCi0gICAgICAgCV0sWwotICAgICAgIAldKQotCUFDX0xBTkdfUE9QKFtDKytdKQorICAgIHN1Y2NlZWRlZD15ZXMKKyAgICBmb3VuZF9zeXN0ZW09eWVzCisgICAgICAgIF0sWworICAgICAgICBdKQorICAgIEFDX0xBTkdfUE9QKFtDKytdKQogCiAKIAotCWRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKLQlkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCi0JaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIjsgdGhlbgotCQlfdmVyc2lvbj0wCi0JCWlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICAgICAgICAgCQlCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoL2xpYiIKLQkJCWlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoIiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aCI7IHRoZW4KLQkJCQlmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLQkJCQkJX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRhY19ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAotCQkJCQlWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAotCQkJCQlpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQlfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCi0JCQkJCWZpCi0JCQkJCVZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAotCQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCi0JCQkJZG9uZQotCQkJZmkKLQkJZWxzZQotCQkJZm9yIGFjX2Jvb3N0X3BhdGggaW4gL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCA7IGRvCi0JCQkJaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRhY19ib29zdF9wYXRoIjsgdGhlbgotCQkJCQlmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLQkJCQkJCV92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkYWNfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKLQkJCQkJCVZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0JCQkJCQlpZiB0ZXN0ICIkVl9DSEVDSyIgPSAiMSIgOyB0aGVuCi0JCQkJCQkJX3ZlcnNpb249JF92ZXJzaW9uX3RtcAotCSAgICAgICAgICAgICAgIAkJCQkJYmVzdF9wYXRoPSRhY19ib29zdF9wYXRoCi0JCQkJCQlmaQotCQkJCQlkb25lCi0JCQkJZmkKLQkJCWRvbmUKLQotCQkJVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCi0JCQlCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKLQkJCUJPT1NUX0xERkxBR1M9Ii1MJGJlc3RfcGF0aC9saWIiCi0JCQlCT09TVF9ST09UX1BBVEg9IiRiZXN0X3BhdGgiCi0KLQkgICAgCQlpZiB0ZXN0ICJ4JEJPT1NUX1JPT1QiICE9ICJ4IjsgdGhlbgotCQkJCWlmIHRlc3QgLWQgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVCIgJiYgdGVzdCAtZCAiJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVC9zdGFnZS9saWIiOyB0aGVuCi0JCQkJCXZlcnNpb25fZGlyPWBleHByIC8vJEJPT1NUX1JPT1QgOiAnLiovXCguKlwpJ2AKLQkJCQkJc3RhZ2VfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9kaXIgfCBzZWQgJ3MvYm9vc3RfLy8nIHwgc2VkICdzL18vLi9nJ2AKLQkJCSAgICAgICAgCXN0YWdlX3ZlcnNpb25fc2hvcnRlbj1gZXhwciAkc3RhZ2VfdmVyc2lvbiA6ICdcKFtbMC05XV0qXC5bWzAtOV1dKlwpJ2AKLQkJCQkJVl9DSEVDSz1gZXhwciAkc3RhZ2VfdmVyc2lvbl9zaG9ydGVuIFw+XD0gJF92ZXJzaW9uYAotCQkJCSAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgotCQkJCQkJQUNfTVNHX05PVElDRShXZSB3aWxsIHVzZSBhIHN0YWdlZCBib29zdCBsaWJyYXJ5IGZyb20gJEJPT1NUX1JPT1QpCi0JCQkJCQlCT09TVF9DUFBGTEFHUz0iLUkkQk9PU1RfUk9PVCIKLQkJCQkJCUJPT1NUX0xERkxBR1M9Ii1MJEJPT1NUX1JPT1Qvc3RhZ2UvbGliIgotCQkJCQkJQk9PU1RfUk9PVF9QQVRIPSIkQk9PU1RfUk9PVCIKLQkJCQkJZmkKLQkJCQlmaQotCSAgICAJCWZpCi0JCWZpCi0KLQkJQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCi0JCWV4cG9ydCBDUFBGTEFHUwotCQlMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKLQkJZXhwb3J0IExERkxBR1MKLQkJZXhwb3J0IEJPT1NUX1JPT1RfUEFUSAotCi0JCUFDX0xBTkdfUFVTSChDKyspCi0JICAgICAJQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWwotCQlAJTpAaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+Ci0JCV1dLCBbWwotCQkjaWYgQk9PU1RfVkVSU0lPTiA+PSAkV0FOVF9CT09TVF9WRVJTSU9OCi0JCS8vIEV2ZXJ5dGhpbmcgaXMgb2theQotCQkjZWxzZQotCQkjICBlcnJvciBCb29zdCB2ZXJzaW9uIGlzIHRvbyBvbGQKLQkJI2VuZGlmCi0JCV1dKV0sWwotICAgICAgICAJQUNfTVNHX1JFU1VMVCh5ZXMpCi0JCXN1Y2NlZWRlZD15ZXMKLQkJZm91bmRfc3lzdGVtPXllcwotICAgICAgIAkJXSxbCi0JICAgICAgIAldKQotCQlBQ19MQU5HX1BPUChbQysrXSkKLQlmaQotCi0JaWYgdGVzdCAiJHN1Y2NlZWRlZCIgIT0gInllcyIgOyB0aGVuCi0JCWlmIHRlc3QgIiRfdmVyc2lvbiIgPSAiMCIgOyB0aGVuCi0JCQlBQ19NU0dfV0FSTihbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3Nob3J0ZW4gb3IgaGlnaGVyKS4gSWYgeW91IGhhdmUgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSAoc3RpbGwgbm90IGluc3RhbGxlZCkgcGxlYXNlIHNwZWNpZnkgXCRCT09TVF9ST09UIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIGRvIG5vdCBnaXZlIGEgUEFUSCB0byAtLXdpdGgtYm9vc3Qgb3B0aW9uLiAgSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGJvb3N0IGluc3RhbGxlZCwgdGhlbiBjaGVjayB5b3VyIHZlcnNpb24gbnVtYmVyIGxvb2tpbmcgaW4gPGJvb3N0L3ZlcnNpb24uaHBwPi4gU2VlIGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi5dXSkKLQkJZWxzZQotCQkJQUNfTVNHX1dBUk4oW1lvdXIgYm9vc3QgbGlicmFyaWVzIHNlZW1zIHRvIG9sZCAodmVyc2lvbiAkX3ZlcnNpb24pLl0pCi0JCWZpCi0JZWxzZQotCQlBQ19TVUJTVChCT09TVF9DUFBGTEFHUykKLQkJQUNfU1VCU1QoQk9PU1RfTERGTEFHUykKLQkJQUNfU1VCU1QoQk9PU1RfUk9PVF9QQVRIKQotCQlBQ19ERUZJTkUoSEFWRV9CT09TVCwsW2RlZmluZSBpZiB0aGUgQm9vc3QgbGlicmFyeSBpcyBhdmFpbGFibGVdKQotCWZpCi0KKyAgICBkbmwgaWYgd2UgZm91bmQgbm8gYm9vc3Qgd2l0aCBzeXN0ZW0gbGF5b3V0IHdlIHNlYXJjaCBmb3IgYm9vc3QgbGlicmFyaWVzCisgICAgZG5sIGJ1aWx0IGFuZCBpbnN0YWxsZWQgd2l0aG91dCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbiBvciBmb3IgYSBzdGFnZWQobm90IGluc3RhbGxlZCkgdmVyc2lvbgorICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyIgOyB0aGVuCiAgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCi0gICAgICAgCUxERkxBR1M9IiRMREZMQUdTX1NBVkVEIgotZmkKKyAgICAgICAgTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCisgICAgICAgIEJPT1NUX0NQUEZMQUdTPQorICAgICAgICBpZiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0KKyAgICAgICAgZmkKKyAgICAgICAgX3ZlcnNpb249MAorICAgICAgICBpZiB0ZXN0IC1uICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiOyB0aGVuCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCisgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKKyAgICAgICAgICAgICAgICAgICAgVl9DSEVDSz1gZXhwciAkX3ZlcnNpb25fdG1wIFw+ICRfdmVyc2lvbmAKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAorICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgICAgIGRubCBpZiBub3RoaW5nIGZvdW5kIHNlYXJjaCBmb3IgbGF5b3V0IHVzZWQgaW4gV2luZG93cyBkaXN0cmlidXRpb25zCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJEJPT1NUX0NQUEZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvYm9vc3QiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIKKyAgICAgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGRubCBpZiB3ZSBmb3VuZCBzb21ldGhpbmcgYW5kIEJPT1NUX0xERkxBR1Mgd2FzIHVuc2V0IGJlZm9yZQorICAgICAgICAgICAgICAgIGRubCAoYmVjYXVzZSAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA9ICIiKSwgc2V0IGl0IGhlcmUuCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtbiAiJEJPT1NUX0NQUEZMQUdTIiAmJiB0ZXN0IC16ICIkQk9PU1RfTERGTEFHUyI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQorICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvJGxpYnN1YmRpciIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciICE9ICJ4eWVzIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCBpbiAvdXNyIC91c3IvbG9jYWwgL29wdCAvb3B0L2xvY2FsIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWX0NIRUNLPWBleHByICRfdmVyc2lvbl90bXAgXD4gJF92ZXJzaW9uYAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcGF0aD0kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgICAgVkVSU0lPTl9VTkRFUlNDT1JFPWBlY2hvICRfdmVyc2lvbiB8IHNlZCAncy9cLi9fLydgCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJGJlc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCisgICAgICAgICAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBscyAiJGJlc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYmVzdF9wYXRoLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRCT09TVF9ST09UIiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKKyAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJEJPT1NUX1JPT1QiICYmIHRlc3QgLXIgIiRCT09TVF9ST09UIiAmJiB0ZXN0IC1kICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIiAmJiB0ZXN0IC1yICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX2Rpcj1gZXhwciAvLyRCT09TVF9ST09UIDogJy4qL1woLipcKSdgCisgICAgICAgICAgICAgICAgICAgIHN0YWdlX3ZlcnNpb249YGVjaG8gJHZlcnNpb25fZGlyIHwgc2VkICdzL2Jvb3N0Xy8vJyB8IHNlZCAncy9fLy4vZydgCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uX3Nob3J0ZW49YGV4cHIgJHN0YWdlX3ZlcnNpb24gOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCisgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJHN0YWdlX3ZlcnNpb25fc2hvcnRlbiBcPlw9ICRfdmVyc2lvbmAKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgJiYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoV2Ugd2lsbCB1c2UgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSBmcm9tICRCT09TVF9ST09UKQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJEJPT1NUX1JPT1QiCisgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRCT09TVF9ST09UL3N0YWdlLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGZpCisgICAgICAgIGZpCisKKyAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkQk9PU1RfQ1BQRkxBR1MiCisgICAgICAgIGV4cG9ydCBDUFBGTEFHUworICAgICAgICBMREZMQUdTPSIkTERGTEFHUyAkQk9PU1RfTERGTEFHUyIKKyAgICAgICAgZXhwb3J0IExERkxBR1MKKworICAgICAgICBBQ19MQU5HX1BVU0goQysrKQorICAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW19BWF9CT09TVF9CQVNFX1BST0dSQU0oJFdBTlRfQk9PU1RfVkVSU0lPTildLFsKKyAgICAgICAgICAgIEFDX01TR19SRVNVTFQoeWVzKQorICAgICAgICBzdWNjZWVkZWQ9eWVzCisgICAgICAgIGZvdW5kX3N5c3RlbT15ZXMKKyAgICAgICAgICAgIF0sWworICAgICAgICAgICAgXSkKKyAgICAgICAgQUNfTEFOR19QT1AoW0MrK10pCisgICAgZmkKKworICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyIgOyB0aGVuCisgICAgICAgIGlmIHRlc3QgIngkX3ZlcnNpb24iID0gIngwIiA7IHRoZW4KKyAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1tXZSBjb3VsZCBub3QgZGV0ZWN0IHRoZSBib29zdCBsaWJyYXJpZXMgKHZlcnNpb24gJDEgb3IgaGlnaGVyKS4gSWYgeW91IGhhdmUgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSAoc3RpbGwgbm90IGluc3RhbGxlZCkgcGxlYXNlIHNwZWNpZnkgXCRCT09TVF9ST09UIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIGRvIG5vdCBnaXZlIGEgUEFUSCB0byAtLXdpdGgtYm9vc3Qgb3B0aW9uLiAgSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGJvb3N0IGluc3RhbGxlZCwgdGhlbiBjaGVjayB5b3VyIHZlcnNpb24gbnVtYmVyIGxvb2tpbmcgaW4gPGJvb3N0L3ZlcnNpb24uaHBwPi4gU2VlIGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi5dXSkKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX05PVElDRShbWW91ciBib29zdCBsaWJyYXJpZXMgc2VlbXMgdG8gb2xkICh2ZXJzaW9uICRfdmVyc2lvbikuXSkKKyAgICAgICAgZmkKKyAgICAgICAgIyBleGVjdXRlIEFDVElPTi1JRi1OT1QtRk9VTkQgKGlmIHByZXNlbnQpOgorICAgICAgICBpZmVsc2UoWyQzXSwgLCA6LCBbJDNdKQorICAgIGVsc2UKKyAgICAgICAgQUNfREVGSU5FKEhBVkVfQk9PU1QsLFtkZWZpbmUgaWYgdGhlIEJvb3N0IGxpYnJhcnkgaXMgYXZhaWxhYmxlXSkKKyAgICAgICAgIyBleGVjdXRlIEFDVElPTi1JRi1GT1VORCAoaWYgcHJlc2VudCk6CisgICAgICAgIGlmZWxzZShbJDJdLCAsIDosIFskMl0pCisgICAgZmkKKworICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCisgICAgTERGTEFHUz0iJExERkxBR1NfU0FWRUQiCiAKIF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKaW5kZXggYTg3YzVhNi4uMjhlNDhjYiAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CisrKyBiL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKKyMgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDgKKyNzZXJpYWwgMTAKIAogQVVfQUxJQVMoW0NIRUNLX1NTTF0sIFtBWF9DSEVDS19PUEVOU1NMXSkKIEFDX0RFRlVOKFtBWF9DSEVDS19PUEVOU1NMXSwgWwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBdLCBbCiAgICAgICAgICAgICAjIGlmIHBrZy1jb25maWcgaXMgaW5zdGFsbGVkIGFuZCBvcGVuc3NsIGhhcyBpbnN0YWxsZWQgYSAucGMgZmlsZSwKICAgICAgICAgICAgICMgdGhlbiB1c2UgdGhhdCBpbmZvcm1hdGlvbiBhbmQgZG9uJ3Qgc2VhcmNoIHNzbGRpcnMKLSAgICAgICAgICAgIEFDX1BBVEhfUFJPRyhbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKKyAgICAgICAgICAgIEFDX0NIRUNLX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCiAgICAgICAgICAgICBpZiB0ZXN0IHgiJFBLR19DT05GSUciICE9IHgiIjsgdGhlbgogICAgICAgICAgICAgICAgIE9QRU5TU0xfTERGTEFHUz1gJFBLR19DT05GSUcgb3BlbnNzbCAtLWxpYnMtb25seS1MIDI+L2Rldi9udWxsYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgJD8gPSAwOyB0aGVuCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDE3NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NPTVBBUkVfVkVSU0lPTihWRVJTSU9OX0EsIE9QLCBWRVJTSU9OX0IsIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gY29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5ncy4gRHVlIHRvIHRoZSB2YXJpb3VzIG51bWJlciBvZgorIyAgIG1pbm9yLXZlcnNpb24gbnVtYmVycyB0aGF0IGNhbiBleGlzdCwgYW5kIHRoZSBmYWN0IHRoYXQgc3RyaW5nCisjICAgY29tcGFyaXNvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggbnVtZXJpYyBjb21wYXJpc29ucywgdGhpcyBpcyBub3QKKyMgICBuZWNlc3NhcmlseSB0cml2aWFsIHRvIGRvIGluIGEgYXV0b2NvbmYgc2NyaXB0LiBUaGlzIG1hY3JvIG1ha2VzIGRvaW5nCisjICAgdGhlc2UgY29tcGFyaXNvbnMgZWFzeS4KKyMKKyMgICBUaGUgc2l4IGJhc2ljIGNvbXBhcmlzb25zIGFyZSBhdmFpbGFibGUsIGFzIHdlbGwgYXMgY2hlY2tpbmcgZXF1YWxpdHkKKyMgICBsaW1pdGVkIHRvIGEgY2VydGFpbiBudW1iZXIgb2YgbWlub3ItdmVyc2lvbiBsZXZlbHMuCisjCisjICAgVGhlIG9wZXJhdG9yIE9QIGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGNvbXBhcmlzb24gdG8gZG8sIGFuZCBjYW4gYmUgb25lCisjICAgb2Y6CisjCisjICAgIGVxICAtIGVxdWFsICh0ZXN0IEEgPT0gQikKKyMgICAgbmUgIC0gbm90IGVxdWFsICh0ZXN0IEEgIT0gQikKKyMgICAgbGUgIC0gbGVzcyB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPD0gQikKKyMgICAgZ2UgIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPj0gQikKKyMgICAgbHQgIC0gbGVzcyB0aGFuICh0ZXN0IEEgPCBCKQorIyAgICBndCAgLSBncmVhdGVyIHRoYW4gKHRlc3QgQSA+IEIpCisjCisjICAgQWRkaXRpb25hbGx5LCB0aGUgZXEgYW5kIG5lIG9wZXJhdG9yIGNhbiBoYXZlIGEgbnVtYmVyIGFmdGVyIGl0IHRvIGxpbWl0CisjICAgdGhlIHRlc3QgdG8gdGhhdCBudW1iZXIgb2YgbWlub3IgdmVyc2lvbnMuCisjCisjICAgIGVxMCAtIGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBuZTAgLSBub3QgZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCisjICAgIGVxTiAtIGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCisjICAgIG5lTiAtIG5vdCBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIworIyAgIFdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtVFJVRSBhcmUgcnVuLAorIyAgIG90aGVyd2lzZSBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlIGVudmlyb25tZW50CisjICAgdmFyaWFibGUgJ2F4X2NvbXBhcmVfdmVyc2lvbicgaXMgYWx3YXlzIHNldCB0byBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKKyMgICBhcyB3ZWxsLgorIworIyAgIEV4YW1wbGVzOgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtsdF0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtsdF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSB0cnVlLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcV0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtndF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSBmYWxzZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEyXSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdHdvIG1pbm9yIHZlcnNpb25zLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTBdLFszLjE1XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdGhlIGxlc3NlciBudW1iZXIgb2YgbWlub3IKKyMgICB2ZXJzaW9ucyBvZiB0aGUgdHdvIHZhbHVlcy4KKyMKKyMgICBOb3RlOiBUaGUgY2hhcmFjdGVycyB0aGF0IHNlcGFyYXRlIHRoZSB2ZXJzaW9uIG51bWJlcnMgZG8gbm90IG1hdHRlci4gQW4KKyMgICBlbXB0eSBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdmVyc2lvbiAwLiBPUCBpcyBldmFsdWF0ZWQgYnkgYXV0b2NvbmYsIG5vdAorIyAgIGNvbmZpZ3VyZSwgc28gbXVzdCBiZSBhIHN0cmluZywgbm90IGEgdmFyaWFibGUuCisjCisjICAgVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIEd1aWRvIERyYWhlaW0gd2hvc2UgYWR2aWNlIGFib3V0CisjICAgdGhlIG00X2Nhc2UgYW5kIG00X2lmdmFsbiBmdW5jdGlvbnMgbWFrZSB0aGlzIG1hY3JvIG9ubHkgaW5jbHVkZSB0aGUKKyMgICBwb3J0aW9ucyBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0aGUgc3BlY2lmaWMgY29tcGFyaXNvbiBzcGVjaWZpZWQgYnkgdGhlCisjICAgT1AgYXJndW1lbnQgaW4gdGhlIGZpbmFsIGNvbmZpZ3VyZSBzY3JpcHQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggVGltIFRvb2xhbiA8dG9vbGFuQGVsZS51cmkuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMgorCitkbmwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQUNfREVGVU4oW0FYX0NPTVBBUkVfVkVSU0lPTl0sIFsKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKQorCisgICMgVXNlZCB0byBpbmRpY2F0ZSB0cnVlIG9yIGZhbHNlIGNvbmRpdGlvbgorICBheF9jb21wYXJlX3ZlcnNpb249ZmFsc2UKKworICAjIENvbnZlcnQgdGhlIHR3byB2ZXJzaW9uIHN0cmluZ3MgdG8gYmUgY29tcGFyZWQgaW50byBhIGZvcm1hdCB0aGF0CisgICMgYWxsb3dzIGEgc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLiAgVGhlIGVuZCByZXN1bHQgaXMgdGhhdCBhIHZlcnNpb24KKyAgIyBzdHJpbmcgb2YgdGhlIGZvcm0gMS4xMi41LXI2MTcgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZvcm0KKyAgIyAwMDAxMDAxMjAwMDUwNjE3LiAgSW4gb3RoZXIgd29yZHMsIGVhY2ggbnVtYmVyIGlzIHplcm8gcGFkZGVkIHRvIGZvdXIKKyAgIyBkaWdpdHMsIGFuZCBub24gZGlnaXRzIGFyZSByZW1vdmVkLgorICBBU19WQVJfUFVTSERFRihbQV0sW2F4X2NvbXBhcmVfdmVyc2lvbl9BXSkKKyAgQT1gZWNobyAiJDEiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBBU19WQVJfUFVTSERFRihbQl0sW2F4X2NvbXBhcmVfdmVyc2lvbl9CXSkKKyAgQj1gZWNobyAiJDMiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBkbmwgIyBJbiB0aGUgY2FzZSBvZiBsZSwgZ2UsIGx0LCBhbmQgZ3QsIHRoZSBzdHJpbmdzIGFyZSBzb3J0ZWQgYXMgbmVjZXNzYXJ5CisgIGRubCAjIHRoZW4gdGhlIGZpcnN0IGxpbmUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICBkbmwgIyBUaGUgc2VkIHJpZ2h0IGFmdGVyIHRoZSBlY2hvIGlzIHRvIHJlbW92ZSBhbnkgaW5kZW50ZWQgd2hpdGUgc3BhY2UuCisgIG00X2Nhc2UobTRfdG9sb3dlcigkMiksCisgIFtsdF0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAorICBdLAorICBbZ3RdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2xlXSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCisgIF0sCisgIFtnZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLFsKKyAgICBkbmwgU3BsaXQgdGhlIG9wZXJhdG9yIGZyb20gdGhlIHN1YnZlcnNpb24gY291bnQgaWYgcHJlc2VudC4KKyAgICBtNF9ibWF0Y2gobTRfc3Vic3RyKCQyLDIpLAorICAgIFswXSxbCisgICAgICAjIEEgY291bnQgb2YgemVybyBtZWFucyB1c2UgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uLgorICAgICAgIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEEgYW5kIEIuCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0E9YGVjaG8gIiRBIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0I9YGVjaG8gIiRCIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisKKyAgICAgICMgU2V0IEEgdG8gbm8gbW9yZSB0aGFuIEIncyBsZW5ndGggYW5kIEIgdG8gbm8gbW9yZSB0aGFuIEEncyBsZW5ndGguCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BXH1cKS4qL1wxLyJgCisgICAgXSwKKyAgICBbWzAtOV0rXSxbCisgICAgICAjIEEgY291bnQgZ3JlYXRlciB0aGFuIHplcm8gbWVhbnMgdXNlIG9ubHkgdGhhdCBtYW55IHN1YnZlcnNpb25zCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgWy4rXSxbCisgICAgICBBQ19XQVJOSU5HKAorICAgICAgICBbaWxsZWdhbCBPUCBudW1lcmljIHBhcmFtZXRlcjogJDJdKQorICAgIF0sW10pCisKKyAgICAjIFBhZCB6ZXJvcyBhdCBlbmQgb2YgbnVtYmVycyB0byBtYWtlIHNhbWUgbGVuZ3RoLgorICAgIGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQT0iJEFgZWNobyAkQiB8IHNlZCAncy8uLzAvZydgIgorICAgIEI9IiRCYGVjaG8gJEEgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBBPSIkYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BIgorCisgICAgIyBDaGVjayBmb3IgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBhcyBuZWNlc3NhcnkuCisgICAgbTRfY2FzZShtNF90b2xvd2VyKG00X3N1YnN0cigkMiwwLDIpKSwKKyAgICBbZXFdLFsKKyAgICAgIHRlc3QgIngkQSIgPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sCisgICAgW25lXSxbCisgICAgICB0ZXN0ICJ4JEEiICE9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCisgICAgXSxbCisgICAgICBBQ19XQVJOSU5HKFtpbGxlZ2FsIE9QIHBhcmFtZXRlcjogJDJdKQorICAgIF0pCisgIF0pCisKKyAgQVNfVkFSX1BPUERFRihbQV0pZG5sCisgIEFTX1ZBUl9QT1BERUYoW0JdKWRubAorCisgIGRubCAjIEV4ZWN1dGUgQUNUSU9OLUlGLVRSVUUgLyBBQ1RJT04tSUYtRkFMU0UuCisgIGlmIHRlc3QgIiRheF9jb21wYXJlX3ZlcnNpb24iID0gInRydWUiIDsgdGhlbgorICAgIG00X2lmdmFsbihbJDRdLFskNF0sWzpdKWRubAorICAgIG00X2lmdmFsbihbJDVdLFtlbHNlICQ1XSlkbmwKKyAgZmkKK10pIGRubCBBWF9DT01QQVJFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00IGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZWFlZAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00CkBAIC0wLDAgKzEsOTQ4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWChWRVJTSU9OLCBbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIHNwZWNpZmllZAorIyAgIHZlcnNpb24gb2YgdGhlIEMrKyBzdGFuZGFyZC4gIElmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWCBhbmQKKyMgICBDWFhDUFAgdG8gZW5hYmxlIHN1cHBvcnQuICBWRVJTSU9OIG1heSBiZSAnMTEnIChmb3IgdGhlIEMrKzExIHN0YW5kYXJkKQorIyAgIG9yICcxNCcgKGZvciB0aGUgQysrMTQgc3RhbmRhcmQpLgorIworIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCwgaW5kaWNhdGVzIHdoZXRoZXIgeW91IGluc2lzdCBvbiBhbgorIyAgIGV4dGVuZGVkIG1vZGUgKGUuZy4gLXN0ZD1nbnUrKzExKSBvciBhIHN0cmljdCBjb25mb3JtYW5jZSBtb2RlIChlLmcuCisjICAgLXN0ZD1jKysxMSkuICBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwgeW91IGdldCB3aGF0ZXZlciB3b3Jrcywgd2l0aAorIyAgIHByZWZlcmVuY2UgZm9yIGFuIGV4dGVuZGVkIG1vZGUuCisjCisjICAgVGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKKyMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIEMrKyBzdGFuZGFyZCBpcworIyAgIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybyBzaG91bGQgZXJyb3Igb3V0IGlmIG5vIG1vZGUgd2l0aCB0aGF0CisjICAgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZCAnb3B0aW9uYWwnLCB0aGVuIGNvbmZpZ3VyYXRpb24gcHJvY2VlZHMKKyMgICByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZyBIQVZFX0NYWCR7VkVSU0lPTn0gaWYgYW5kIG9ubHkgaWYgYQorIyAgIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSBHb29nbGUgSW5jLjsgY29udHJpYnV0ZWQgYnkgQWxleGV5IFNva29sb3YgPHNva29sb3ZAZ29vZ2xlLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUGF1bCBOb3JtYW4gPHBlbm9ybWFuQG1hYy5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IE1vcml0eiBLbGFtbWxlciA8bW9yaXR6QGtsYW1tbGVyLmV1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBLcnplc2ltaXIgTm93YWsgPHFkbGFjekBnbWFpbC5jb20+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMAorCitkbmwgIFRoaXMgbWFjcm8gaXMgYmFzZWQgb24gdGhlIGNvZGUgZnJvbSB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExIG1hY3JvCitkbmwgIChzZXJpYWwgdmVyc2lvbiBudW1iZXIgMTMpLgorCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSwgW2RubAorICBtNF9pZihbJDFdLCBbMTFdLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxMSAweCJdLAorICAgICAgICBbJDFdLCBbMTRdLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxNCAxeSJdLAorICAgICAgICBbJDFdLCBbMTddLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxNyAxeiJdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgZmlyc3QgYXJndW1lbnQgYCQxJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pZG5sCisgIG00X2lmKFskMl0sIFtdLCBbXSwKKyAgICAgICAgWyQyXSwgW2V4dF0sIFtdLAorICAgICAgICBbJDJdLCBbbm9leHRdLCBbXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSlkbmwKKyAgbTRfaWYoWyQzXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQzXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQzXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPWZhbHNlXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHRoaXJkIGFyZ3VtZW50IGAkMycgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKQorICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCisgIGFjX3N1Y2Nlc3M9bm8KKworICBtNF9pZihbJDJdLCBbbm9leHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGZvciBhbHRlcm5hdGl2ZSBpbiAke2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlc307IGRvCisgICAgICBzd2l0Y2g9Ii1zdGQ9Z251Kyske2FsdGVybmF0aXZlfSIKKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgkMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKyskMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWD0iJENYWCIKKyAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XyQxXSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFg9IiRhY19zYXZlX0NYWCJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgIGlmIHRlc3QgLW4gIiRDWFhDUFAiIDsgdGhlbgorICAgICAgICAgIENYWENQUD0iJENYWENQUCAkc3dpdGNoIgorICAgICAgICBmaQorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKworICBtNF9pZihbJDJdLCBbZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBkbmwgSFAncyBhQ0MgbmVlZHMgK3N0ZD1jKysxMSBhY2NvcmRpbmcgdG86CisgICAgZG5sIGh0dHA6Ly9oMjEwMDcud3d3Mi5ocC5jb20vcG9ydGFsL2Rvd25sb2FkL2ZpbGVzL3VucHJvdC9hQ3h4L1BERl9SZWxlYXNlX05vdGVzLzc2OTE0OS0wMDEucGRmCisgICAgZG5sIENyYXkncyBjcmF5Q0MgbmVlZHMgIi1oIHN0ZD1jKysxMSIKKyAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gJHtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXN9OyBkbworICAgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWMrKyR7YWx0ZXJuYXRpdmV9ICtzdGQ9YysrJHthbHRlcm5hdGl2ZX0gIi1oIHN0ZD1jKyske2FsdGVybmF0aXZlfSI7IGRvCisgICAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgkMV8kc3dpdGNoXSkKKyAgICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKyQxIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICAgIFthY19zYXZlX0NYWD0iJENYWCIKKyAgICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8kMV0pXSwKKyAgICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgICAgQ1hYPSIkYWNfc2F2ZV9DWFgiXSkKKyAgICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkQ1hYQ1BQIiA7IHRoZW4KKyAgICAgICAgICAgIENYWENQUD0iJENYWENQUCAkc3dpdGNoIgorICAgICAgICAgIGZpCisgICAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4eWVzOyB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorICBBQ19MQU5HX1BPUChbQysrXSkKKyAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkID0geHRydWU7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKyQxIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBIQVZFX0NYWCQxPTAKKyAgICBBQ19NU0dfTk9USUNFKFtObyBjb21waWxlciB3aXRoIEMrKyQxIHN1cHBvcnQgd2FzIGZvdW5kXSkKKyAgZWxzZQorICAgIEhBVkVfQ1hYJDE9MQorICAgIEFDX0RFRklORShIQVZFX0NYWCQxLDEsCisgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKyQxIHN5bnRheF0pCisgIGZpCisgIEFDX1NVQlNUKEhBVkVfQ1hYJDEpCitdKQorCisKK2RubCAgVGVzdCBib2R5IGZvciBjaGVja2luZyBDKysxMSBzdXBwb3J0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xMV0sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCispCisKKworZG5sICBUZXN0IGJvZHkgZm9yIGNoZWNraW5nIEMrKzE0IHN1cHBvcnQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzE0XSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTQKKykKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzE3XSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTQKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTcKKykKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzExCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTFdLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxMSwgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzExIGNvbXBpbGVyIgorCisjZWxzZQorCituYW1lc3BhY2UgY3h4MTEKK3sKKworICBuYW1lc3BhY2UgdGVzdF9zdGF0aWNfYXNzZXJ0CisgIHsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjaGVjaworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKFQpLCAibm90IGJpZyBlbm91Z2giKTsKKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9maW5hbF9vdmVycmlkZQorICB7CisKKyAgICBzdHJ1Y3QgQmFzZQorICAgIHsKKyAgICAgIHZpcnR1YWwgdm9pZCBmKCkge30KKyAgICB9OworCisgICAgc3RydWN0IERlcml2ZWQgOiBwdWJsaWMgQmFzZQorICAgIHsKKyAgICAgIHZpcnR1YWwgdm9pZCBmKCkgb3ZlcnJpZGUge30KKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kb3VibGVfcmlnaHRfYW5nbGVfYnJhY2tldHMKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgY2hlY2sge307CisKKyAgICB0eXBlZGVmIGNoZWNrPHZvaWQ+IHNpbmdsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8dm9pZD4+IGRvdWJsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Y2hlY2s8dm9pZD4+PiB0cmlwbGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGNoZWNrPGNoZWNrPHZvaWQ+Pj4+IHF1YWRydXBsZV90eXBlOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kZWNsdHlwZQorICB7CisKKyAgICBpbnQKKyAgICBmKCkKKyAgICB7CisgICAgICBpbnQgYSA9IDE7CisgICAgICBkZWNsdHlwZShhKSBiID0gMjsKKyAgICAgIHJldHVybiBhICsgYjsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3R5cGVfZGVkdWN0aW9uCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGlzX3NhbWU8VCwgVD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBhdXRvCisgICAgYWRkKFQxIGExLCBUMiBhMikgLT4gZGVjbHR5cGUoYTEgKyBhMikKKyAgICB7CisgICAgICByZXR1cm4gYTEgKyBhMjsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0KGNvbnN0IGludCBjLCB2b2xhdGlsZSBpbnQgdikKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZSgwKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGMpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHYpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIGF1dG8gYWMgPSBjOworICAgICAgYXV0byBhdiA9IHY7CisgICAgICBhdXRvIHN1bWkgPSBhYyArIGF2ICsgJ3gnOworICAgICAgYXV0byBzdW1mID0gYWMgKyBhdiArIDEuMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGFjKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGF2KT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHN1bWkpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoc3VtZik+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYWRkKGMsIHYpKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHJldHVybiAoc3VtZiA+IDAuMCkgPyBzdW1pIDogYWRkKGMsIHYpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfbm9leGNlcHQKKyAgeworCisgICAgaW50IGYoKSB7IHJldHVybiAwOyB9CisgICAgaW50IGcoKSBub2V4Y2VwdCB7IHJldHVybiAwOyB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KG5vZXhjZXB0KGYoKSkgPT0gZmFsc2UsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG5vZXhjZXB0KGcoKSkgPT0gdHJ1ZSwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHIKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgdW5zaWduZWQgbG9uZyBjb25zdGV4cHIKKyAgICBzdHJsZW5fY19yKGNvbnN0IENoYXJUICpjb25zdCBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGFjYykgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gKnMgPyBzdHJsZW5fY19yKHMgKyAxLCBhY2MgKyAxKSA6IGFjYzsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICB1bnNpZ25lZCBsb25nIGNvbnN0ZXhwcgorICAgIHN0cmxlbl9jKGNvbnN0IENoYXJUICpjb25zdCBzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiBzdHJsZW5fY19yKHMsIDBVTCk7CisgICAgfQorCisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiIikgPT0gMFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiMSIpID09IDFVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImV4YW1wbGUiKSA9PSA3VUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJhbm90aGVyXDBleGFtcGxlIikgPT0gN1VMLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3J2YWx1ZV9yZWZlcmVuY2VzCisgIHsKKworICAgIHRlbXBsYXRlIDwgaW50IE4gPgorICAgIHN0cnVjdCBhbnN3ZXIKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCB2YWx1ZSA9IE47CisgICAgfTsKKworICAgIGFuc3dlcjwxPiBmKGludCYpICAgICAgIHsgcmV0dXJuIGFuc3dlcjwxPigpOyB9CisgICAgYW5zd2VyPDI+IGYoY29uc3QgaW50JikgeyByZXR1cm4gYW5zd2VyPDI+KCk7IH0KKyAgICBhbnN3ZXI8Mz4gZihpbnQmJikgICAgICB7IHJldHVybiBhbnN3ZXI8Mz4oKTsgfQorCisgICAgdm9pZAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGNvbnN0IGludCBjID0gMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZihpKSk6OnZhbHVlID09IDEsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZihjKSk6OnZhbHVlID09IDIsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZigwKSk6OnZhbHVlID09IDMsICIiKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3VuaWZvcm1faW5pdGlhbGl6YXRpb24KKyAgeworCisgICAgc3RydWN0IHRlc3QKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHplcm8ge307CisgICAgICBzdGF0aWMgY29uc3QgaW50IG9uZSB7MX07CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQodGVzdDo6emVybyA9PSAwLCAiIik7CisgICAgc3RhdGljX2Fzc2VydCh0ZXN0OjpvbmUgPT0gMSwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFzCisgIHsKKworICAgIHZvaWQKKyAgICB0ZXN0MSgpCisgICAgeworICAgICAgYXV0byBsYW1iZGExID0gW10oKXt9OworICAgICAgYXV0byBsYW1iZGEyID0gbGFtYmRhMTsKKyAgICAgIGxhbWJkYTEoKTsKKyAgICAgIGxhbWJkYTIoKTsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0MigpCisgICAgeworICAgICAgYXV0byBhID0gW10oaW50IGksIGludCBqKXsgcmV0dXJuIGkgKyBqOyB9KDEsIDIpOworICAgICAgYXV0byBiID0gW10oKSAtPiBpbnQgeyByZXR1cm4gJzAnOyB9KCk7CisgICAgICBhdXRvIGMgPSBbPV0oKXsgcmV0dXJuIGEgKyBiOyB9KCk7CisgICAgICBhdXRvIGQgPSBbJl0oKXsgcmV0dXJuIGM7IH0oKTsKKyAgICAgIGF1dG8gZSA9IFthLCAmYl0oaW50IHgpIG11dGFibGUgeworICAgICAgICBjb25zdCBhdXRvIGlkZW50aXR5ID0gW10oaW50IHkpeyByZXR1cm4geTsgfTsKKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgYTsgKytpKQorICAgICAgICAgIGEgKz0gYi0tOworICAgICAgICByZXR1cm4geCArIGlkZW50aXR5KGEgKyBiKTsKKyAgICAgIH0oMCk7CisgICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdDMoKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gbnVsbGFyeSA9IFtdKCl7IHJldHVybiAwOyB9OworICAgICAgY29uc3QgYXV0byB1bmFyeSA9IFtdKGludCB4KXsgcmV0dXJuIHg7IH07CisgICAgICB1c2luZyBudWxsYXJ5X3QgPSBkZWNsdHlwZShudWxsYXJ5KTsKKyAgICAgIHVzaW5nIHVuYXJ5X3QgPSBkZWNsdHlwZSh1bmFyeSk7CisgICAgICBjb25zdCBhdXRvIGhpZ2hlcjFzdCA9IFtdKG51bGxhcnlfdCBmKXsgcmV0dXJuIGYoKTsgfTsKKyAgICAgIGNvbnN0IGF1dG8gaGlnaGVyMm5kID0gW3VuYXJ5XShudWxsYXJ5X3QgZjEpeworICAgICAgICByZXR1cm4gW3VuYXJ5LCBmMV0odW5hcnlfdCBmMil7IHJldHVybiBmMih1bmFyeShmMSgpKSk7IH07CisgICAgICB9OworICAgICAgcmV0dXJuIGhpZ2hlcjFzdChudWxsYXJ5KSArIGhpZ2hlcjJuZChudWxsYXJ5KSh1bmFyeSk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF92YXJpYWRpY190ZW1wbGF0ZXMKKyAgeworCisgICAgdGVtcGxhdGUgPGludC4uLj4KKyAgICBzdHJ1Y3Qgc3VtOworCisgICAgdGVtcGxhdGUgPGludCBOMCwgaW50Li4uIE4xdG9OPgorICAgIHN0cnVjdCBzdW08TjAsIE4xdG9OLi4uPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IE4wICsgc3VtPE4xdG9OLi4uPjo6dmFsdWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDw+CisgICAgc3RydWN0IHN1bTw+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gMDsKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydChzdW08Pjo6dmFsdWUgPT0gMCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDE+Ojp2YWx1ZSA9PSAxLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MjM+Ojp2YWx1ZSA9PSAyMywgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDEsIDI+Ojp2YWx1ZSA9PSAzLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08NSwgNSwgMTE+Ojp2YWx1ZSA9PSAyMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDIsIDMsIDUsIDcsIDExLCAxMz46OnZhbHVlID09IDQxLCAiIik7CisKKyAgfQorCisgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTM3MjgxODQvdGVtcGxhdGUtYWxpYXNlcy1hbmQtc2ZpbmFlCisgIC8vIENsYW5nIDMuMSBmYWlscyB3aXRoIGhlYWRlcnMgb2YgbGlic3RkKysgNC44LjMgd2hlbiB1c2luZyBzdGQ6OmZ1bmN0aW9uCisgIC8vIGJlY2F1c2Ugb2YgdGhpcy4KKyAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYWxpYXNfc2ZpbmFlCisgIHsKKworICAgIHN0cnVjdCBmb28ge307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHVzaW5nIG1lbWJlciA9IHR5cGVuYW1lIFQ6Om1lbWJlcl90eXBlOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGZ1bmMoLi4uKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGZ1bmMobWVtYmVyPFQ+Kikge30KKworICAgIHZvaWQgdGVzdCgpOworCisgICAgdm9pZCB0ZXN0KCkgeyBmdW5jPGZvbz4oMCk7IH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxMQorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworXV0pCisKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzE0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTRdLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxNCwgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTQwMkwKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzE0IGNvbXBpbGVyIgorCisjZWxzZQorCituYW1lc3BhY2UgY3h4MTQKK3sKKworICBuYW1lc3BhY2UgdGVzdF9wb2x5bW9ycGhpY19sYW1iZGFzCisgIHsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhID0gW10oYXV0byYmLi4uIGFyZ3MpeworICAgICAgICBjb25zdCBhdXRvIGlzdGlueSA9IFtdKGF1dG8geCl7CisgICAgICAgICAgcmV0dXJuIChzaXplb2YoeCkgPT0gMVVMKSA/IDEgOiAwOworICAgICAgICB9OworICAgICAgICBjb25zdCBpbnQgYXJldGlueVtdID0geyBpc3RpbnkoYXJncykuLi4gfTsKKyAgICAgICAgcmV0dXJuIGFyZXRpbnlbMF07CisgICAgICB9OworICAgICAgcmV0dXJuIGxhbWJkYSgxLCAxTCwgMS4wZiwgJzEnKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2JpbmFyeV9saXRlcmFscworICB7CisKKyAgICBjb25zdGV4cHIgYXV0byBpdmlpID0gMGIwMDAwMDAwMDAwMTAxMDEwOworICAgIHN0YXRpY19hc3NlcnQoaXZpaSA9PSA0MiwgIndyb25nIHZhbHVlIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2dlbmVyYWxpemVkX2NvbnN0ZXhwcgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICBjb25zdGV4cHIgdW5zaWduZWQgbG9uZworICAgIHN0cmxlbl9jKGNvbnN0IENoYXJUICpjb25zdCBzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGF1dG8gbGVuZ3RoID0gMFVMOworICAgICAgZm9yIChhdXRvIHAgPSBzOyAqcDsgKytwKQorICAgICAgICArK2xlbmd0aDsKKyAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiIikgPT0gMFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygieCIpID09IDFVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoInRlc3QiKSA9PSA0VUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJhbm90aGVyXDB0ZXN0IikgPT0gN1VMLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYV9pbml0X2NhcHR1cmUKKyAgeworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgYXV0byB4ID0gMDsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhMSA9IFthID0geF0oaW50IGIpeyByZXR1cm4gYSArIGI7IH07CisgICAgICBjb25zdCBhdXRvIGxhbWJkYTIgPSBbYSA9IGxhbWJkYTEoeCldKCl7IHJldHVybiBhOyB9OworICAgICAgcmV0dXJuIGxhbWJkYTIoKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RpZ2l0X3NlcGFyYXRvcnMKKyAgeworCisgICAgY29uc3RleHByIGF1dG8gdGVuX21pbGxpb24gPSAxMDAnMDAwJzAwMDsKKyAgICBzdGF0aWNfYXNzZXJ0KHRlbl9taWxsaW9uID09IDEwMDAwMDAwMCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9yZXR1cm5fdHlwZV9kZWR1Y3Rpb24KKyAgeworCisgICAgYXV0byBmKGludCYgeCkgeyByZXR1cm4geDsgfQorICAgIGRlY2x0eXBlKGF1dG8pIGcoaW50JiB4KSB7IHJldHVybiB4OyB9CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSBmYWxzZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxULCBUPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IHRydWU7CisgICAgfTsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGF1dG8geCA9IDA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShmKHgpKT46OnZhbHVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50JiwgZGVjbHR5cGUoZyh4KSk+Ojp2YWx1ZSwgIiIpOworICAgICAgcmV0dXJuIHg7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE0CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorCitdXSkKKworCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTcKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xN10sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzE3LCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxNzAzTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTcgY29tcGlsZXIiCisKKyNlbHNlCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjeHgxNworeworCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcl9sYW1iZGFzCisgIHsKKworICAgIGNvbnN0ZXhwciBpbnQgZm9vID0gW10oKXtyZXR1cm4gNDI7fSgpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdDo6bmVzdGVkX25hbWVzcGFjZTo6ZGVmaW5pdGlvbnMKKyAgeworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9mb2xkX2V4cHJlc3Npb24KKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KKyAgICBpbnQgbXVsdGlwbHkoQXJncy4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiAoYXJncyAqIC4uLiAqIDEpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgYm9vbCBhbGwoQXJncy4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiAoYXJncyAmJiAuLi4pOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXh0ZW5kZWRfc3RhdGljX2Fzc2VydAorICB7CisKKyAgICBzdGF0aWNfYXNzZXJ0ICh0cnVlKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfYXV0b19icmFjZV9pbml0X2xpc3QKKyAgeworCisgICAgYXV0byBmb28gPSB7NX07CisgICAgYXV0byBiYXIgezV9OworCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c3RkOjppbml0aWFsaXplcl9saXN0PGludD4sIGRlY2x0eXBlKGZvbyk+Ojp2YWx1ZSk7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8aW50LCBkZWNsdHlwZShiYXIpPjo6dmFsdWUpOworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdHlwZW5hbWVfaW5fdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1ldGVyCisgIHsKKworICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiB0eXBlbmFtZSBYPiBzdHJ1Y3QgRDsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZmFsbHRocm91Z2hfbm9kaXNjYXJkX21heWJlX3VudXNlZF9hdHRyaWJ1dGVzCisgIHsKKworICAgIGludCBmMSgpCisgICAgeworICAgICAgcmV0dXJuIDQyOworICAgIH0KKworICAgIFtbbm9kaXNjYXJkXV0gaW50IGYyKCkKKyAgICB7CisgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gdW51c2VkID0gZjEoKTsKKworICAgICAgc3dpdGNoIChmMSgpKQorICAgICAgeworICAgICAgY2FzZSAxNzoKKyAgICAgICAgZjEoKTsKKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgY2FzZSA0MjoKKyAgICAgICAgZjEoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmMSgpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXh0ZW5kZWRfYWdncmVnYXRlX2luaXRpYWxpemF0aW9uCisgIHsKKworICAgIHN0cnVjdCBiYXNlMQorICAgIHsKKyAgICAgIGludCBiMSwgYjIgPSA0MjsKKyAgICB9OworCisgICAgc3RydWN0IGJhc2UyCisgICAgeworICAgICAgYmFzZTIoKSB7CisgICAgICAgIGIzID0gNDI7CisgICAgICB9CisgICAgICBpbnQgYjM7CisgICAgfTsKKworICAgIHN0cnVjdCBkZXJpdmVkIDogYmFzZTEsIGJhc2UyCisgICAgeworICAgICAgICBpbnQgZDsKKyAgICB9OworCisgICAgZGVyaXZlZCBkMSB7ezEsIDJ9LCB7fSwgNH07ICAvLyBmdWxsIGluaXRpYWxpemF0aW9uCisgICAgZGVyaXZlZCBkMiB7e30sIHt9LCA0fTsgICAgICAvLyB2YWx1ZS1pbml0aWFsaXplZCBiYXNlcworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9nZW5lcmFsX3JhbmdlX2Jhc2VkX2Zvcl9sb29wCisgIHsKKworICAgIHN0cnVjdCBpdGVyCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGludCYgb3BlcmF0b3IqICgpCisgICAgICB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICBjb25zdCBpbnQmIG9wZXJhdG9yKiAoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKworICAgICAgaXRlciYgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgICsraTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3Qgc2VudGluZWwKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICB9OworCisgICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBpdGVyJiBpLCBjb25zdCBzZW50aW5lbCYgcykKKyAgICB7CisgICAgICByZXR1cm4gaS5pID09IHMuaTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGl0ZXImIGksIGNvbnN0IHNlbnRpbmVsJiBzKQorICAgIHsKKyAgICAgIHJldHVybiAhKGkgPT0gcyk7CisgICAgfQorCisgICAgc3RydWN0IHJhbmdlCisgICAgeworICAgICAgaXRlciBiZWdpbigpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiB7MH07CisgICAgICB9CisKKyAgICAgIHNlbnRpbmVsIGVuZCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiB7NX07CisgICAgICB9CisgICAgfTsKKworICAgIHZvaWQgZigpCisgICAgeworICAgICAgcmFuZ2UgciB7fTsKKworICAgICAgZm9yIChhdXRvIGkgOiByKQorICAgICAgeworICAgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gdiA9IGk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFfY2FwdHVyZV9hc3Rlcmlza190aGlzX2J5X3ZhbHVlCisgIHsKKworICAgIHN0cnVjdCB0CisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgZm9vKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIFsqdGhpc10oKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0oKTsKKyAgICAgIH0KKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9lbnVtX2NsYXNzX2NvbnN0cnVjdGlvbgorICB7CisKKyAgICBlbnVtIGNsYXNzIGJ5dGUgOiB1bnNpZ25lZCBjaGFyCisgICAge307CisKKyAgICBieXRlIGZvbyB7NDJ9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHJfaWYKKyAgeworCisgICAgdGVtcGxhdGUgPGJvb2wgY29uZD4KKyAgICBpbnQgZiAoKQorICAgIHsKKyAgICAgIGlmIGNvbnN0ZXhwcihjb25kKQorICAgICAgeworICAgICAgICByZXR1cm4gMTM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiA0MjsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3NlbGVjdGlvbl9zdGF0ZW1lbnRfd2l0aF9pbml0aWFsaXplcgorICB7CisKKyAgICBpbnQgZigpCisgICAgeworICAgICAgcmV0dXJuIDEzOworICAgIH0KKworICAgIGludCBmMigpCisgICAgeworICAgICAgaWYgKGF1dG8gaSA9IGYoKTsgaSA+IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAzOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGF1dG8gaSA9IGYoKTsgaSArIDQpCisgICAgICB7CisgICAgICBjYXNlIDE3OgorICAgICAgICByZXR1cm4gMjsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90ZW1wbGF0ZV9hcmd1bWVudF9kZWR1Y3Rpb25fZm9yX2NsYXNzX3RlbXBsYXRlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBwYWlyCisgICAgeworICAgICAgcGFpciAoVDEgcDEsIFQyIHAyKQorICAgICAgICA6IG0xIHtwMX0sCisgICAgICAgICAgbTIge3AyfQorICAgICAge30KKworICAgICAgVDEgbTE7CisgICAgICBUMiBtMjsKKyAgICB9OworCisgICAgdm9pZCBmKCkKKyAgICB7CisgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gcCA9IHBhaXJ7MTMsIDQydX07CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ub25fdHlwZV9hdXRvX3RlbXBsYXRlX3BhcmFtZXRlcnMKKyAgeworCisgICAgdGVtcGxhdGUgPGF1dG8gbj4KKyAgICBzdHJ1Y3QgQgorICAgIHt9OworCisgICAgQjw1PiBiMTsKKyAgICBCPCdhJz4gYjI7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3N0cnVjdHVyZWRfYmluZGluZ3MKKyAgeworCisgICAgaW50IGFyclsyXSA9IHsgMSwgMiB9OworICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gcHIgPSB7IDEsIDIgfTsKKworICAgIGF1dG8gZjEoKSAtPiBpbnQoJilbMl0KKyAgICB7CisgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIGF1dG8gZjIoKSAtPiBzdGQ6OnBhaXI8aW50LCBpbnQ+JgorICAgIHsKKyAgICAgIHJldHVybiBwcjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgUworICAgIHsKKyAgICAgIGludCB4MSA6IDI7CisgICAgICB2b2xhdGlsZSBkb3VibGUgeTE7CisgICAgfTsKKworICAgIFMgZjMoKQorICAgIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBhdXRvIFsgeDEsIHkxIF0gPSBmMSgpOworICAgIGF1dG8mIFsgeHIxLCB5cjEgXSA9IGYxKCk7CisgICAgYXV0byBbIHgyLCB5MiBdID0gZjIoKTsKKyAgICBhdXRvJiBbIHhyMiwgeXIyIF0gPSBmMigpOworICAgIGNvbnN0IGF1dG8gWyB4MywgeTMgXSA9IGYzKCk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4Y2VwdGlvbl9zcGVjX3R5cGVfc3lzdGVtCisgIHsKKworICAgIHN0cnVjdCBHb29kIHt9OworICAgIHN0cnVjdCBCYWQge307CisKKyAgICB2b2lkIGcxKCkgbm9leGNlcHQ7CisgICAgdm9pZCBnMigpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBCYWQKKyAgICBmKFQqLCBUKik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgR29vZAorICAgIGYoVDEqLCBUMiopOworCisgICAgc3RhdGljX2Fzc2VydCAoc3RkOjppc19zYW1lX3Y8R29vZCwgZGVjbHR5cGUoZihnMSwgZzIpKT4pOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9pbmxpbmVfdmFyaWFibGVzCisgIHsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZihUKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgVCBnKFQpCisgICAgeworICAgICAgcmV0dXJuIFR7fTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTw+IGlubGluZSB2b2lkIGY8PihpbnQpCisgICAge30KKworICAgIHRlbXBsYXRlPD4gaW50IGc8PihpbnQpCisgICAgeworICAgICAgcmV0dXJuIDU7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE3CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPCAyMDE3MDNMCisKK11dKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzMzZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQKQEAgLTAsMCArMSwzOSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLCBbbWFuZGF0b3J5fG9wdGlvbmFsXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgQysrMTEKKyMgICBzdGFuZGFyZDsgaWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYIGFuZCBDWFhDUFAgdG8gZW5hYmxlCisjICAgc3VwcG9ydC4KKyMKKyMgICBUaGlzIG1hY3JvIGlzIGEgY29udmVuaWVuY2UgYWxpYXMgZm9yIGNhbGxpbmcgdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWAorIyAgIG1hY3JvIHdpdGggdGhlIHZlcnNpb24gc2V0IHRvIEMrKzExLiAgVGhlIHR3byBvcHRpb25hbCBhcmd1bWVudHMgYXJlCisjICAgZm9yd2FyZGVkIGxpdGVyYWxseSBhcyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudCByZXNwZWN0aXZlbHkuCisjICAgUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWCBtYWNybyBmb3IKKyMgICBtb3JlIGluZm9ybWF0aW9uLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8sIHlvdSBhbHNvIG5lZWQgdG8KKyMgICBkb3dubG9hZCB0aGUgYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00IGZpbGUuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggQmVuamFtaW4gS29zbmlrIDxia296QHJlZGhhdC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEyIFphY2sgV2VpbmJlcmcgPHphY2t3QHBhbml4LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTMgUm95IFN0b2duZXIgPHJveXN0Z25yQGljZXMudXRleGFzLmVkdT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTUgR29vZ2xlIEluYy47IGNvbnRyaWJ1dGVkIGJ5IEFsZXhleSBTb2tvbG92IDxzb2tvbG92QGdvb2dsZS5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgTm9ybWFuIDxwZW5vcm1hbkBtYWMuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxNSBNb3JpdHogS2xhbW1sZXIgPG1vcml0ekBrbGFtbWxlci5ldT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNzZXJpYWwgMTgKKworQVhfUkVRVUlSRV9ERUZJTkVEKFtBWF9DWFhfQ09NUElMRV9TVERDWFhdKQorQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV0sIFtBWF9DWFhfQ09NUElMRV9TVERDWFgoWzExXSwgWyQxXSwgWyQyXSldKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNCBiL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKaW5kZXggZmRiNGJmMC4uMDIwMzk2MCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNAorKysgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CkBAIC03LDcgKzcsNyBAQAogZG5sIGphdmEgY29tbWFuZCB0ZXN0ZWQuICBPdGhlcndpc2UsIGEgaGFyZC1jb2RlZCBsaXN0IHdpbGwgYmUgdXNlZC4KIGRubCBTaW1pbGFybHkgZm9yICJKQVZBQyIuCiBkbmwKLWRubCBBWF9KQVZBQ19BTkRfSkFWQSBkb2VzIG5vdCBjdXJyZW5seSBzdXBwb3J0IHRlc3RpbmcgZm9yIGEgcGFydGljdWxhcgorZG5sIEFYX0pBVkFDX0FORF9KQVZBIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRlc3RpbmcgZm9yIGEgcGFydGljdWxhcgogZG5sIEphdmEgdmVyc2lvbiwgdGVzdGluZyBmb3Igb25seSBvbmUgb2YgImphdmEiIGFuZCAiamF2YWMiLCBvcgogZG5sIGNvbXBpbGluZyBvciBydW5uaW5nIHVzZXItcHJvdmlkZWQgSmF2YSBjb2RlLgogZG5sCkBAIC01Nyw2ICs1NywxMCBAQAogICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBQyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmphdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAogICAgICAgICAgICAgaWYgJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCiAKKyAgICAgICAgICAgICAgIyBwcmV2ZW50ICRKQVZBIFZNIGlzc3VlcyB3aXRoIFVURi04IHBhdGggbmFtZXMgKFRIUklGVC0zMjcxKQorICAgICAgICAgICAgICBvTENfQUxMPSIkTENfQUxMIgorICAgICAgICAgICAgICBMQ19BTEw9IiIKKwogICAgICAgICAgICAgICBJRlM9IiwiCiAgICAgICAgICAgICAgIGZvciBKQVZBIGluICRKQVZBX1BST0dTIDsgZG8KICAgICAgICAgICAgICAgICBJRlM9IiRvSUZTIgpAQCAtNjksNiArNzMsMTAgQEAKIAogICAgICAgICAgICAgICBkb25lCiAKKyAgICAgICAgICAgICAgIyByZXN0b3JlIExDX0FMTAorICAgICAgICAgICAgICBMQ19BTEw9IiRvTENfQUxMIgorICAgICAgICAgICAgICBvTENfQUxMPSIiCisKICAgICAgICAgICAgIGZpCiAKICAgICAgICAgICBkb25lCkBAIC0xMTAsNyArMTE4LDcgQEAKIEFDX0RFRlVOKFtBWF9DSEVDS19BTlRfVkVSU0lPTl0sCiAgICAgICAgICBbCiAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhbnQgdmVyc2lvbiA+ICQyKQotICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAkKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykgXD49ICQyYAorICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAieCQocHJpbnRmICIkMlxuJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIiB8IHNvcnQgLXQgJy4nIC1rIDEsMSAtayAyLDIgLWsgMywzIC1nIHwgc2VkIC1uIDFwKSIgPSAieCQyImAKICAgICAgICAgICBpZiB0ZXN0ICJ4JEFOVF9WQUxJRCIgPSAieDEiIDsgdGhlbgogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9saWJfZXZlbnQubTQgYi9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNAppbmRleCA3ZDJmOThhLi5kNGRjZGM5IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNAorKysgYi9hY2xvY2FsL2F4X2xpYl9ldmVudC5tNApAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgIEFDX0xBTkdfUFVTSChbQ10pCiAgICAgICAgICAgZG5sIFRoaXMgY2FuIGJlIGNoYW5nZWQgdG8gQUNfTElOS19JRkVMU0UgaWYgeW91IGFyZSBjcm9zcy1jb21waWxpbmcsCiAgICAgICAgICAgZG5sIGJ1dCB0aGVuIHRoZSB2ZXJzaW9uIGNhbm5vdCBiZSBjaGVja2VkLgotICAgICAgICAgIEFDX1JVTl9JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbWworICAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKICAgICAgICAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAgICAgICAgICAgI2luY2x1ZGUgPGV2ZW50Lmg+CiAgICAgICAgICAgXV0sIFtbCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgICAgIGlmIHRlc3QgLW4gIiRheF9saWJldmVudF9wYXRoIjsgdGhlbgogICAgICAgICAgICAgICBBWF9MSUJfRVZFTlRfRE9fQ0hFQ0sKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZm9yIGF4X2xpYmV2ZW50X3BhdGggaW4gIiIgL3VzciAvdXNyL2xvY2FsIC9vcHQgL29wdC9sb2NhbCAvb3B0L2xpYmV2ZW50ICIkTElCRVZFTlRfUk9PVCIgOyBkbworICAgICAgICAgICAgICBmb3IgYXhfbGliZXZlbnRfcGF0aCBpbiAiIiAkbHRfc3lzcm9vdC91c3IgJGx0X3N5c3Jvb3QvdXNyL2xvY2FsICRsdF9zeXNyb290L29wdCAkbHRfc3lzcm9vdC9vcHQvbG9jYWwgJGx0X3N5c3Jvb3Qvb3B0L2xpYmV2ZW50ICIkTElCRVZFTlRfUk9PVCIgOyBkbwogICAgICAgICAgICAgICAgIEFYX0xJQl9FVkVOVF9ET19DSEVDSwogICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRzdWNjZXNzIiA9ICJ5ZXMiOyB0aGVuCiAgICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfbGliX3psaWIubTQgYi9hY2xvY2FsL2F4X2xpYl96bGliLm00CmluZGV4IDhjMTBhYjQuLmJkYjllMTEgMTAwNjQ0Ci0tLSBhL2FjbG9jYWwvYXhfbGliX3psaWIubTQKKysrIGIvYWNsb2NhbC9heF9saWJfemxpYi5tNApAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICAgICMgICAoZGVmaW5lZCBpbiB0aGUgbGlicmFyeSkuCiAgICAgICAgICAgQUNfTEFOR19QVVNIKFtDXSkKICAgICAgICAgICBkbmwgVGhpcyBjYW4gYmUgY2hhbmdlZCB0byBBQ19MSU5LX0lGRUxTRSBpZiB5b3UgYXJlIGNyb3NzLWNvbXBpbGluZy4KLSAgICAgICAgICBBQ19SVU5fSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW1sKKyAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCiAgICAgICAgICAgI2luY2x1ZGUgPHpsaWIuaD4KICAgICAgICAgICAjaWYgWkxJQl9WRVJOVU0gPj0gMHgkV0FOVF9aTElCX1ZFUlNJT04KICAgICAgICAgICAjZWxzZQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9sdWEubTQgYi9hY2xvY2FsL2F4X2x1YS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTIwMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9sdWEubTQKQEAgLTAsMCArMSw2NjQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9sdWEuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QUk9HX0xVQVsoW01JTklNVU0tVkVSU0lPTl0sIFtUT08tQklHLVZFUlNJT05dLCBbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKV0KKyMgICBBWF9MVUFfSEVBREVSU1soW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjICAgQVhfTFVBX0xJQlNbKFtBQ1RJT04tSUYtRk9VTkRdLCBbQUNUSU9OLUlGLU5PVC1GT1VORF0pXQorIyAgIEFYX0xVQV9SRUFETElORVsoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSldCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgRGV0ZWN0IGEgTHVhIGludGVycHJldGVyLCBvcHRpb25hbGx5IHNwZWNpZnlpbmcgYSBtaW5pbXVtIGFuZCBtYXhpbXVtCisjICAgdmVyc2lvbiBudW1iZXIuIFNldCB1cCBpbXBvcnRhbnQgTHVhIHBhdGhzLCBzdWNoIGFzIHRoZSBkaXJlY3RvcmllcyBpbgorIyAgIHdoaWNoIHRvIGluc3RhbGwgc2NyaXB0cyBhbmQgbW9kdWxlcyAoc2hhcmVkIGxpYnJhcmllcykuCisjCisjICAgQWxzbyBkZXRlY3QgTHVhIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gVGhlIEx1YSB2ZXJzaW9uIGNvbnRhaW5lZCBpbiB0aGUKKyMgICBoZWFkZXIgaXMgY2hlY2tlZCB0byBtYXRjaCB0aGUgTHVhIGludGVycHJldGVyIHZlcnNpb24gZXhhY3RseS4gV2hlbgorIyAgIHNlYXJjaGluZyBmb3IgTHVhIGxpYnJhcmllcywgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHVzZWQgYXMgYSBzdWZmaXguCisjICAgVGhpcyBpcyBkb25lIHdpdGggdGhlIGdvYWwgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSBMdWEgaW5zdGFsbHMgKDUuMSwKKyMgICA1LjIsIGFuZCA1LjMgc2lkZS1ieS1zaWRlKS4KKyMKKyMgICBBIG5vdGUgb24gY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb25zOiBUaGlzIGZpbGUgaGFzIGJlZW4KKyMgICBtb3N0bHkgcmV3cml0dGVuIGZvciBzZXJpYWwgMTguIE1vc3QgZGV2ZWxvcGVycyBzaG91bGQgYmUgYWJsZSB0byB1c2UKKyMgICB0aGVzZSBtYWNyb3Mgd2l0aG91dCBuZWVkaW5nIHRvIG1vZGlmeSBjb25maWd1cmUuYWMuIENhcmUgaGFzIGJlZW4gdGFrZW4KKyMgICB0byBwcmVzZXJ2ZSBlYWNoIG1hY3JvJ3MgYmVoYXZpb3IsIGJ1dCB0aGVyZSBhcmUgc29tZSBkaWZmZXJlbmNlczoKKyMKKyMgICAxKSBBWF9XSVRIX0xVQSBpcyBkZXByZWNhdGVkOyBpdCBub3cgZXhwYW5kcyB0byB0aGUgZXhhY3Qgc2FtZSB0aGluZyBhcworIyAgIEFYX1BST0dfTFVBIHdpdGggbm8gYXJndW1lbnRzLgorIworIyAgIDIpIEFYX0xVQV9IRUFERVJTIG5vdyBjaGVja3MgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgZGVmaW5lZCBpbiBsdWEuaAorIyAgIG1hdGNoZXMgdGhlIGludGVycHJldGVyIHZlcnNpb24uIEFYX0xVQV9IRUFERVJTX1ZFUlNJT04gaXMgdGhlcmVmb3JlCisjICAgdW5uZWNlc3NhcnksIHNvIGl0IGlzIGRlcHJlY2F0ZWQgYW5kIGRvZXMgbm90IGV4cGFuZCB0byBhbnl0aGluZy4KKyMKKyMgICAzKSBUaGUgY29uZmlndXJlIGZsYWcgLS13aXRoLWx1YS1zdWZmaXggbm8gbG9uZ2VyIGV4aXN0czsgdGhlIHVzZXIKKyMgICBzaG91bGQgaW5zdGVhZCBzcGVjaWZ5IHRoZSBMVUEgcHJlY2lvdXMgdmFyaWFibGUgb24gdGhlIGNvbW1hbmQgbGluZS4KKyMgICBTZWUgdGhlIEFYX1BST0dfTFVBIGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzLgorIworIyAgIFBsZWFzZSByZWFkIHRoZSBtYWNybyBkZXNjcmlwdGlvbnMgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjCisjICAgVGhpcyBmaWxlIHdhcyBpbnNwaXJlZCBieSBBbmRyZXcgRGFsa2UncyBhbmQgSmFtZXMgSGVuc3RyaWRnZSdzCisjICAgcHl0aG9uLm00IGFuZCBUb20gUGF5bmUncywgTWF0dGhpZXUgTW95J3MsIGFuZCBSZXViZW4gVGhvbWFzJ3MgYXhfbHVhLm00CisjICAgKHNlcmlhbCAxNykuIEJhc2ljYWxseSwgdGhpcyBmaWxlIGlzIGEgbWFzaC11cCBvZiB0aG9zZSB0d28gZmlsZXMuIEkKKyMgICBsaWtlIHRvIHRoaW5rIGl0IGNvbWJpbmVzIHRoZSBiZXN0IG9mIHRoZSB0d28hCisjCisjICAgQVhfUFJPR19MVUE6IFNlYXJjaCBmb3IgdGhlIEx1YSBpbnRlcnByZXRlciwgYW5kIHNldCB1cCBpbXBvcnRhbnQgTHVhCisjICAgcGF0aHMuIEFkZHMgcHJlY2lvdXMgdmFyaWFibGUgTFVBLCB3aGljaCBtYXkgY29udGFpbiB0aGUgcGF0aCBvZiB0aGUgTHVhCisjICAgaW50ZXJwcmV0ZXIuIElmIExVQSBpcyBibGFuaywgdGhlIHVzZXIncyBwYXRoIGlzIHNlYXJjaGVkIGZvciBhbgorIyAgIHN1aXRhYmxlIGludGVycHJldGVyLgorIworIyAgIElmIE1JTklNVU0tVkVSU0lPTiBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IEx1YSBpbnRlcnByZXRlcnMgd2l0aCBhCisjICAgdmVyc2lvbiBudW1iZXIgZ3JlYXRlciBvciBlcXVhbCB0byBNSU5JTVVNLVZFUlNJT04gd2lsbCBiZSBhY2NlcHRlZC4gSWYKKyMgICBUT08tQklHLVZFUlNJT04gaXMgYWxzbyBzdXBwbGllZCwgdGhlbiBvbmx5IEx1YSBpbnRlcnByZXRlcnMgd2l0aCBhCisjICAgdmVyc2lvbiBudW1iZXIgZ3JlYXRlciBvciBlcXVhbCB0byBNSU5JTVVNLVZFUlNJT04gYW5kIGxlc3MgdGhhbgorIyAgIFRPTy1CSUctVkVSU0lPTiB3aWxsIGJlIGFjY2VwdGVkLgorIworIyAgIFRoZSBMdWEgdmVyc2lvbiBudW1iZXIsIExVQV9WRVJTSU9OLCBpcyBmb3VuZCBmcm9tIHRoZSBpbnRlcnByZXRlciwgYW5kCisjICAgc3Vic3RpdHV0ZWQuIExVQV9QTEFURk9STSBpcyBhbHNvIGZvdW5kLCBidXQgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKG5vCisjICAgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24pLgorIworIyAgIEZpbmFsbHksIHRoZSBtYWNybyBmaW5kcyBmb3VyIHBhdGhzOgorIworIyAgICAgbHVhZGlyICAgICAgICAgICAgIERpcmVjdG9yeSB0byBpbnN0YWxsIEx1YSBzY3JpcHRzLgorIyAgICAgcGtnbHVhZGlyICAgICAgICAgICRsdWFkaXIvJFBBQ0tBR0UKKyMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEaXJlY3RvcnkgdG8gaW5zdGFsbCBMdWEgbW9kdWxlcy4KKyMgICAgIHBrZ2x1YWV4ZWNkaXIgICAgICAkbHVhZXhlY2Rpci8kUEFDS0FHRQorIworIyAgIFRoZXNlIHBhdGhzIGFyZSBmb3VuZCBiYXNlZCBvbiAkcHJlZml4LCAkZXhlY19wcmVmaXgsIEx1YSdzCisjICAgcGFja2FnZS5wYXRoLCBhbmQgcGFja2FnZS5jcGF0aC4gVGhlIGZpcnN0IHBhdGggb2YgcGFja2FnZS5wYXRoCisjICAgYmVnaW5uaW5nIHdpdGggJHByZWZpeCBpcyBzZWxlY3RlZCBhcyBsdWFkaXIuIFRoZSBmaXJzdCBwYXRoIG9mCisjICAgcGFja2FnZS5jcGF0aCBiZWdpbm5pbmcgd2l0aCAkZXhlY19wcmVmaXggaXMgdXNlZCBhcyBsdWFleGVjZGlyLiBUaGlzCisjICAgc2hvdWxkIHdvcmsgb24gYWxsIHJlYXNvbmFibGUgTHVhIGluc3RhbGxhdGlvbnMuIElmIGEgcGF0aCBjYW5ub3QgYmUKKyMgICBkZXRlcm1pbmVkLCBhIGRlZmF1bHQgcGF0aCBpcyB1c2VkLiBPZiBjb3Vyc2UsIHRoZSB1c2VyIGNhbiBvdmVycmlkZQorIyAgIHRoZXNlIGxhdGVyIHdoZW4gaW52b2tpbmcgbWFrZS4KKyMKKyMgICAgIGx1YWRpciAgICAgICAgICAgICBEZWZhdWx0OiAkcHJlZml4L3NoYXJlL2x1YS8kTFVBX1ZFUlNJT04KKyMgICAgIGx1YWV4ZWNkaXIgICAgICAgICBEZWZhdWx0OiAkZXhlY19wcmVmaXgvbGliL2x1YS8kTFVBX1ZFUlNJT04KKyMKKyMgICBUaGVzZSBkaXJlY3RvcmllcyBjYW4gYmUgdXNlZCBieSBBdXRvbWFrZSBhcyBpbnN0YWxsIGRlc3RpbmF0aW9ucy4gVGhlCisjICAgdmFyaWFibGUgbmFtZSBtaW51cyAnZGlyJyBuZWVkcyB0byBiZSB1c2VkIGFzIGEgcHJlZml4IHRvIHRoZQorIyAgIGFwcHJvcHJpYXRlIEF1dG9tYWtlIHByaW1hcnksIGUuZy4gbHVhX1NDUklQUyBvciBsdWFleGVjX0xJQlJBUklFUy4KKyMKKyMgICBJZiBhbiBhY2NlcHRhYmxlIEx1YSBpbnRlcnByZXRlciBpcyBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMKKyMgICBwZXJmb3JtZWQsIG90aGVyd2lzZSBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHByZWZvcm1lZC4gSWYgQUNUSU9OLUlGLU5PVC0KKyMgICBGT1VORCBpcyBibGFuaywgdGhlbiBpdCB3aWxsIGRlZmF1bHQgdG8gcHJpbnRpbmcgYW4gZXJyb3IuIFRvIHByZXZlbnQKKyMgICB0aGUgZGVmYXVsdCBiZWhhdmlvciwgZ2l2ZSAnOicgYXMgYW4gYWN0aW9uLgorIworIyAgIEFYX0xVQV9IRUFERVJTOiBTZWFyY2ggZm9yIEx1YSBoZWFkZXJzLiBSZXF1aXJlcyB0aGF0IEFYX1BST0dfTFVBIGJlCisjICAgZXhwYW5kZWQgYmVmb3JlIHRoaXMgbWFjcm8uIEFkZHMgcHJlY2lvdXMgdmFyaWFibGUgTFVBX0lOQ0xVREUsIHdoaWNoCisjICAgbWF5IGNvbnRhaW4gTHVhIHNwZWNpZmljIGluY2x1ZGUgZmxhZ3MsIGUuZy4gLUkvdXNyL2luY2x1ZGUvbHVhNS4xLiBJZgorIyAgIExVQV9JTkNMVURFIGlzIGJsYW5rLCB0aGVuIHRoaXMgbWFjcm8gd2lsbCBhdHRlbXB0IHRvIGZpbmQgc3VpdGFibGUKKyMgICBmbGFncy4KKyMKKyMgICBMVUFfSU5DTFVERSBjYW4gYmUgdXNlZCBieSBBdXRvbWFrZSB0byBjb21waWxlIEx1YSBtb2R1bGVzIG9yCisjICAgZXhlY3V0YWJsZXMgd2l0aCBlbWJlZGRlZCBpbnRlcnByZXRlcnMuIFRoZSAqX0NQUEZMQUdTIHZhcmlhYmxlcyBzaG91bGQKKyMgICBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UsIGUuZy4gbXlwcm9nX0NQUEZMQUdTID0gJChMVUFfSU5DTFVERSkuCisjCisjICAgVGhpcyBtYWNybyBzZWFyY2hlcyBmb3IgdGhlIGhlYWRlciBsdWEuaCAoYW5kIG90aGVycykuIFRoZSBzZWFyY2ggaXMKKyMgICBwZXJmb3JtZWQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIENQUEZMQUdTLCBDUEFUSCwgZXRjLCBhbmQgTFVBX0lOQ0xVREUuCisjICAgSWYgdGhlIHNlYXJjaCBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gc29tZSBjb21tb24gZGlyZWN0b3JpZXMgYXJlIHRyaWVkLgorIyAgIElmIHRoZSBoZWFkZXJzIGFyZSB0aGVuIGZvdW5kLCB0aGVuIExVQV9JTkNMVURFIGlzIHNldCBhY2NvcmRpbmdseS4KKyMKKyMgICBUaGUgcGF0aHMgYXV0b21hdGljYWxseSBzZWFyY2hlZCBhcmU6CisjCisjICAgICAqIC91c3IvaW5jbHVkZS9sdWFYLlkKKyMgICAgICogL3Vzci9pbmNsdWRlL2x1YS9YLlkKKyMgICAgICogL3Vzci9pbmNsdWRlL2x1YVhZCisjICAgICAqIC91c3IvbG9jYWwvaW5jbHVkZS9sdWFYLlkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS1YLlkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS9YLlkKKyMgICAgICogL3Vzci9sb2NhbC9pbmNsdWRlL2x1YVhZCisjCisjICAgKFdoZXJlIFguWSBpcyB0aGUgTHVhIHZlcnNpb24gbnVtYmVyLCBlLmcuIDUuMS4pCisjCisjICAgVGhlIEx1YSB2ZXJzaW9uIG51bWJlciBmb3VuZCBpbiB0aGUgaGVhZGVycyBpcyBhbHdheXMgY2hlY2tlZCB0byBtYXRjaAorIyAgIHRoZSBMdWEgaW50ZXJwcmV0ZXIncyB2ZXJzaW9uIG51bWJlci4gTHVhIGhlYWRlcnMgd2l0aCBtaXNtYXRjaGVkCisjICAgdmVyc2lvbiBudW1iZXJzIGFyZSBub3QgYWNjZXB0ZWQuCisjCisjICAgSWYgaGVhZGVycyBhcmUgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzIHBlcmZvcm1lZCwgb3RoZXJ3aXNlCisjICAgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwZXJmb3JtZWQuIElmIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgYmxhbmssIHRoZW4KKyMgICBpdCB3aWxsIGRlZmF1bHQgdG8gcHJpbnRpbmcgYW4gZXJyb3IuIFRvIHByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsCisjICAgc2V0IHRoZSBhY3Rpb24gdG8gJzonLgorIworIyAgIEFYX0xVQV9MSUJTOiBTZWFyY2ggZm9yIEx1YSBsaWJyYXJpZXMuIFJlcXVpcmVzIHRoYXQgQVhfUFJPR19MVUEgYmUKKyMgICBleHBhbmRlZCBiZWZvcmUgdGhpcyBtYWNyby4gQWRkcyBwcmVjaW91cyB2YXJpYWJsZSBMVUFfTElCLCB3aGljaCBtYXkKKyMgICBjb250YWluIEx1YSBzcGVjaWZpYyBsaW5rZXIgZmxhZ3MsIGUuZy4gLWxsdWE1LjEuIElmIExVQV9MSUIgaXMgYmxhbmssCisjICAgdGhlbiB0aGlzIG1hY3JvIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHN1aXRhYmxlIGZsYWdzLgorIworIyAgIExVQV9MSUIgY2FuIGJlIHVzZWQgYnkgQXV0b21ha2UgdG8gbGluayBMdWEgbW9kdWxlcyBvciBleGVjdXRhYmxlcyB3aXRoCisjICAgZW1iZWRkZWQgaW50ZXJwcmV0ZXJzLiBUaGUgKl9MSUJBREQgYW5kICpfTERBREQgdmFyaWFibGVzIHNob3VsZCBiZSB1c2VkCisjICAgZm9yIHRoaXMgcHVycG9zZSwgZS5nLiBteW1vZF9MSUJBREQgPSAkKExVQV9MSUIpLgorIworIyAgIFRoaXMgbWFjcm8gc2VhcmNoZXMgZm9yIHRoZSBMdWEgbGlicmFyeS4gTW9yZSB0ZWNobmljYWxseSwgaXQgc2VhcmNoZXMKKyMgICBmb3IgYSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGx1YV9sb2FkLiBUaGUgc2VhcmNoIGlzIHBlcmZvcm1lZAorIyAgIHdpdGggYSBjb21iaW5hdGlvbiBvZiBMSUJTLCBMSUJSQVJZX1BBVEgsIGFuZCBMVUFfTElCLgorIworIyAgIElmIHRoZSBzZWFyY2ggZGV0ZXJtaW5lcyB0aGF0IHNvbWUgbGlua2VyIGZsYWdzIGFyZSBtaXNzaW5nLCB0aGVuIHRob3NlCisjICAgZmxhZ3Mgd2lsbCBiZSBhZGRlZCB0byBMVUFfTElCLgorIworIyAgIElmIGxpYnJhcmllcyBhcmUgZm91bmQsIHRoZW4gQUNUSU9OLUlGLUZPVU5EIGlzIHBlcmZvcm1lZCwgb3RoZXJ3aXNlCisjICAgQUNUSU9OLUlGLU5PVC1GT1VORCBpcyBwZXJmb3JtZWQuIElmIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgYmxhbmssIHRoZW4KKyMgICBpdCB3aWxsIGRlZmF1bHQgdG8gcHJpbnRpbmcgYW4gZXJyb3IuIFRvIHByZXZlbnQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsCisjICAgc2V0IHRoZSBhY3Rpb24gdG8gJzonLgorIworIyAgIEFYX0xVQV9SRUFETElORTogU2VhcmNoIGZvciByZWFkbGluZSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuIFJlcXVpcmVzIHRoZQorIyAgIEFYX0xJQl9SRUFETElORSBtYWNybywgd2hpY2ggaXMgcHJvdmlkZWQgYnkgYXhfbGliX3JlYWRsaW5lLm00IGZyb20gdGhlCisjICAgQXV0b2NvbmYgQXJjaGl2ZS4KKyMKKyMgICBJZiBhIHJlYWRsaW5lIGNvbXBhdGlibGUgbGlicmFyeSBpcyBmb3VuZCwgdGhlbiBBQ1RJT04tSUYtRk9VTkQgaXMKKyMgICBwZXJmb3JtZWQsIG90aGVyd2lzZSBBQ1RJT04tSUYtTk9ULUZPVU5EIGlzIHBlcmZvcm1lZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxNSBSZXViZW4gVGhvbWFzIDxycnRAc2MzZC5vcmc+CisjICAgQ29weXJpZ2h0IChjKSAyMDE0IFRpbSBQZXJraW5zIDx0cHJrNzdAZ21haWwuY29tPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisjCisjICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHJlc3BlY3RpdmUgQXV0b2NvbmYgTWFjcm8ncyBjb3B5cmlnaHQgb3duZXIKKyMgICBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhlIGNvbmZpZ3VyZQorIyAgIHNjcmlwdHMgdGhhdCBhcmUgdGhlIG91dHB1dCBvZiBBdXRvY29uZiB3aGVuIHByb2Nlc3NpbmcgdGhlIE1hY3JvLiBZb3UKKyMgICBuZWVkIG5vdCBmb2xsb3cgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB3aGVuIHVzaW5nCisjICAgb3IgZGlzdHJpYnV0aW5nIHN1Y2ggc2NyaXB0cywgZXZlbiB0aG91Z2ggcG9ydGlvbnMgb2YgdGhlIHRleHQgb2YgdGhlCisjICAgTWFjcm8gYXBwZWFyIGluIHRoZW0uIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBkb2VzIGdvdmVybgorIyAgIGFsbCBvdGhlciB1c2Ugb2YgdGhlIG1hdGVyaWFsIHRoYXQgY29uc3RpdHV0ZXMgdGhlIEF1dG9jb25mIE1hY3JvLgorIworIyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCBhcHBsaWVzIHRvIHZlcnNpb25zIG9mIHRoZSBBdXRvY29uZgorIyAgIE1hY3JvIHJlbGVhc2VkIGJ5IHRoZSBBdXRvY29uZiBBcmNoaXZlLiBXaGVuIHlvdSBtYWtlIGFuZCBkaXN0cmlidXRlIGEKKyMgICBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBBdXRvY29uZiBNYWNybywgeW91IG1heSBleHRlbmQgdGhpcyBzcGVjaWFsCisjICAgZXhjZXB0aW9uIHRvIHRoZSBHUEwgdG8gYXBwbHkgdG8geW91ciBtb2RpZmllZCB2ZXJzaW9uIGFzIHdlbGwuCisKKyNzZXJpYWwgNDAKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9QUk9HX0xVQShbTUlOSU1VTS1WRVJTSU9OXSwgW1RPTy1CSUctVkVSU0lPTl0sCitkbmwgICAgICAgICAgICAgW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfUFJPR19MVUFdLAorWworICBkbmwgQ2hlY2sgZm9yIHJlcXVpcmVkIHRvb2xzLgorICBBQ19SRVFVSVJFKFtBQ19QUk9HX0dSRVBdKQorICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCisKKyAgZG5sIE1ha2UgTFVBIGEgcHJlY2lvdXMgdmFyaWFibGUuCisgIEFDX0FSR19WQVIoW0xVQV0sIFtUaGUgTHVhIGludGVycHJldGVyLCBlLmcuIC91c3IvYmluL2x1YTUuMV0pCisKKyAgZG5sIEZpbmQgYSBMdWEgaW50ZXJwcmV0ZXIuCisgIG00X2RlZmluZV9kZWZhdWx0KFtfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1RdLAorICAgIFtsdWEgbHVhNS4zIGx1YTUzIGx1YTUuMiBsdWE1MiBsdWE1LjEgbHVhNTEgbHVhNTBdKQorCisgIG00X2lmKFskMV0sIFtdLAorICBbIGRubCBObyB2ZXJzaW9uIGNoZWNrIGlzIG5lZWRlZC4gRmluZCBhbnkgTHVhIGludGVycHJldGVyLgorICAgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgPSAneCddLAorICAgICAgW0FDX1BBVEhfUFJPR1MoW0xVQV0sIFtfQVhfTFVBX0lOVEVSUFJFVEVSX0xJU1RdLCBbOl0pXSkKKyAgICBheF9kaXNwbGF5X0xVQT0nbHVhJworCisgICAgQVNfSUYoW3Rlc3QgIngkTFVBIiAhPSAneDonXSwKKyAgICAgIFsgZG5sIEF0IGxlYXN0IGNoZWNrIGlmIHRoaXMgaXMgYSBMdWEgaW50ZXJwcmV0ZXIuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbaWYgJExVQSBpcyBhIEx1YSBpbnRlcnByZXRlcl0pCisgICAgICAgIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFskTFVBXSwKKyAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFtub3QgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgICAgIF0pCisgICAgICBdKQorICBdLAorICBbIGRubCBBIHZlcnNpb24gY2hlY2sgaXMgbmVlZGVkLgorICAgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgIT0gJ3gnXSwKKyAgICBbIGRubCBDaGVjayBpZiB0aGlzIGlzIGEgTHVhIGludGVycHJldGVyLgorICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiAkTFVBIGlzIGEgTHVhIGludGVycHJldGVyXSkKKyAgICAgIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFskTFVBXSwKKyAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgQUNfTVNHX0VSUk9SKFtub3QgYSBMdWEgaW50ZXJwcmV0ZXJdKQorICAgICAgICBdKQorICAgICAgZG5sIENoZWNrIHRoZSB2ZXJzaW9uLgorICAgICAgbTRfaWYoWyQyXSwgW10sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0id2hldGhlciAkTFVBIHZlcnNpb24gPj0gJDEiXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJ3aGV0aGVyICRMVUEgdmVyc2lvbiA+PSAkMSwgPCAkMiJdKQorICAgICAgQUNfTVNHX0NIRUNLSU5HKFskX2F4X2NoZWNrX3RleHRdKQorICAgICAgX0FYX0xVQV9DSEtfVkVSKFskTFVBXSwgWyQxXSwgWyQyXSwKKyAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXSwKKyAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgICAgICAgQUNfTVNHX0VSUk9SKFt2ZXJzaW9uIGlzIG91dCBvZiByYW5nZSBmb3Igc3BlY2lmaWVkIExVQV0pXSkKKyAgICAgIGF4X2Rpc3BsYXlfTFVBPSRMVUEKKyAgICBdLAorICAgIFsgZG5sIFRyeSBlYWNoIGludGVycHJldGVyIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgc2F0aXNmaWVzIFZFUlNJT04uCisgICAgICBtNF9pZihbJDJdLCBbXSwKKyAgICAgICAgW19heF9jaGVja190ZXh0PSJmb3IgYSBMdWEgaW50ZXJwcmV0ZXIgd2l0aCB2ZXJzaW9uID49ICQxIl0sCisgICAgICAgIFtfYXhfY2hlY2tfdGV4dD0iZm9yIGEgTHVhIGludGVycHJldGVyIHdpdGggdmVyc2lvbiA+PSAkMSwgPCAkMiJdKQorICAgICAgQUNfQ0FDSEVfQ0hFQ0soWyRfYXhfY2hlY2tfdGV4dF0sCisgICAgICAgIFtheF9jdl9wYXRobGVzc19MVUFdLAorICAgICAgICBbIGZvciBheF9jdl9wYXRobGVzc19MVUEgaW4gX0FYX0xVQV9JTlRFUlBSRVRFUl9MSVNUIG5vbmU7IGRvCisgICAgICAgICAgICB0ZXN0ICJ4JGF4X2N2X3BhdGhsZXNzX0xVQSIgPSAneG5vbmUnICYmIGJyZWFrCisgICAgICAgICAgICBfQVhfTFVBX0NIS19JU19JTlRSUChbJGF4X2N2X3BhdGhsZXNzX0xVQV0sIFtdLCBbY29udGludWVdKQorICAgICAgICAgICAgX0FYX0xVQV9DSEtfVkVSKFskYXhfY3ZfcGF0aGxlc3NfTFVBXSwgWyQxXSwgWyQyXSwgW2JyZWFrXSkKKyAgICAgICAgICBkb25lCisgICAgICAgIF0pCisgICAgICBkbmwgU2V0ICRMVUEgdG8gdGhlIGFic29sdXRlIHBhdGggb2YgJGF4X2N2X3BhdGhsZXNzX0xVQS4KKyAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X3BhdGhsZXNzX0xVQSIgPSAneG5vbmUnXSwKKyAgICAgICAgW0xVQT0nOiddLAorICAgICAgICBbQUNfUEFUSF9QUk9HKFtMVUFdLCBbJGF4X2N2X3BhdGhsZXNzX0xVQV0pXSkKKyAgICAgIGF4X2Rpc3BsYXlfTFVBPSRheF9jdl9wYXRobGVzc19MVUEKKyAgICBdKQorICBdKQorCisgIEFTX0lGKFt0ZXN0ICJ4JExVQSIgPSAneDonXSwKKyAgWyBkbmwgUnVuIGFueSB1c2VyLXNwZWNpZmllZCBhY3Rpb24sIG9yIGFib3J0LgorICAgIG00X2RlZmF1bHQoWyQ0XSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgc3VpdGFibGUgTHVhIGludGVycHJldGVyXSldKQorICBdLAorICBbIGRubCBRdWVyeSBMdWEgZm9yIGl0cyB2ZXJzaW9uIG51bWJlci4KKyAgICBBQ19DQUNIRV9DSEVDSyhbZm9yICRheF9kaXNwbGF5X0xVQSB2ZXJzaW9uXSwKKyAgICAgIFtheF9jdl9sdWFfdmVyc2lvbl0sCisgICAgICBbIGRubCBHZXQgdGhlIGludGVycHJldGVyIHZlcnNpb24gaW4gWC5ZIGZvcm1hdC4gVGhpcyBzaG91bGQgd29yayBmb3IKKyAgICAgICAgZG5sIGludGVycHJldGVycyB2ZXJzaW9uIDUuMCBhbmQgYmV5b25kLgorICAgICAgICBheF9jdl9sdWFfdmVyc2lvbj1bYCRMVUEgLWUgJworICAgICAgICAgIC0tIHJldHVybiBhIHZlcnNpb24gbnVtYmVyIGluIFguWSBmb3JtYXQKKyAgICAgICAgICBsb2NhbCBfLCBfLCB2ZXIgPSBzdHJpbmcuZmluZChfVkVSU0lPTiwgIl5MdWEgKCVkKyUuJWQrKSIpCisgICAgICAgICAgcHJpbnQodmVyKSdgXQorICAgICAgXSkKKyAgICBBU19JRihbdGVzdCAieCRheF9jdl9sdWFfdmVyc2lvbiIgPSAneCddLAorICAgICAgW0FDX01TR19FUlJPUihbaW52YWxpZCBMdWEgdmVyc2lvbiBudW1iZXJdKV0pCisgICAgQUNfU1VCU1QoW0xVQV9WRVJTSU9OXSwgWyRheF9jdl9sdWFfdmVyc2lvbl0pCisgICAgQUNfU1VCU1QoW0xVQV9TSE9SVF9WRVJTSU9OXSwgW2BlY2hvICIkTFVBX1ZFUlNJT04iIHwgJFNFRCAnc3xcLnx8J2BdKQorCisgICAgZG5sIFRoZSBmb2xsb3dpbmcgY2hlY2sgaXMgbm90IHN1cHBvcnRlZDoKKyAgICBkbmwgQXQgdGltZXMgKGxpa2Ugd2hlbiBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzKSB5b3UgbWF5IHdhbnQgdG8ga25vdworICAgIGRubCB3aGljaCBPUyBwbGF0Zm9ybSBMdWEgdGhpbmtzIHRoaXMgaXMuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgcGxhdGZvcm1dLAorICAgICAgW2F4X2N2X2x1YV9wbGF0Zm9ybV0sCisgICAgICBbYXhfY3ZfbHVhX3BsYXRmb3JtPVtgJExVQSAtZSAncHJpbnQoInVua25vd24iKSdgXV0pCisgICAgQUNfU1VCU1QoW0xVQV9QTEFURk9STV0sIFskYXhfY3ZfbHVhX3BsYXRmb3JtXSkKKworICAgIGRubCBVc2UgdGhlIHZhbHVlcyBvZiAkcHJlZml4IGFuZCAkZXhlY19wcmVmaXggZm9yIHRoZSBjb3JyZXNwb25kaW5nCisgICAgZG5sIHZhbHVlcyBvZiBMVUFfUFJFRklYIGFuZCBMVUFfRVhFQ19QUkVGSVguIFRoZXNlIGFyZSBtYWRlIGRpc3RpbmN0CisgICAgZG5sIHZhcmlhYmxlcyBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIGlmIG5lZWQgYmUuIEhvd2V2ZXIsIHRoZSBnZW5lcmFsCisgICAgZG5sIGNvbnNlbnN1cyBpcyB0aGF0IHlvdSBzaG91bGRuJ3QgbmVlZCB0aGlzIGFiaWxpdHkuCisgICAgQUNfU1VCU1QoW0xVQV9QUkVGSVhdLCBbJyR7cHJlZml4fSddKQorICAgIEFDX1NVQlNUKFtMVUFfRVhFQ19QUkVGSVhdLCBbJyR7ZXhlY19wcmVmaXh9J10pCisKKyAgICBkbmwgTHVhIHByb3ZpZGVzIG5vIHdheSB0byBxdWVyeSB0aGUgc2NyaXB0IGRpcmVjdG9yeSwgYW5kIGluc3RlYWQKKyAgICBkbmwgcHJvdmlkZXMgTFVBX1BBVEguIEhvd2V2ZXIsIHdlIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgYSBzYWZlIGVkdWNhdGVkCisgICAgZG5sIGd1ZXNzLiBJZiB0aGUgYnVpbHQtaW4gc2VhcmNoIHBhdGggY29udGFpbnMgYSBkaXJlY3Rvcnkgd2hpY2ggaXMKKyAgICBkbmwgcHJlZml4ZWQgYnkgJHByZWZpeCwgdGhlbiB3ZSBjYW4gc3RvcmUgc2NyaXB0cyB0aGVyZS4gVGhlIGZpcnN0CisgICAgZG5sIG1hdGNoaW5nIHBhdGggd2lsbCBiZSB1c2VkLgorICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgJGF4X2Rpc3BsYXlfTFVBIHNjcmlwdCBkaXJlY3RvcnldLAorICAgICAgW2F4X2N2X2x1YV9sdWFkaXJdLAorICAgICAgWyBBU19JRihbdGVzdCAieCRwcmVmaXgiID0gJ3hOT05FJ10sCisgICAgICAgICAgW2F4X2x1YV9wcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4XSwKKyAgICAgICAgICBbYXhfbHVhX3ByZWZpeD0kcHJlZml4XSkKKworICAgICAgICBkbmwgSW5pdGlhbGl6ZSB0byB0aGUgZGVmYXVsdCBwYXRoLgorICAgICAgICBheF9jdl9sdWFfbHVhZGlyPSIkTFVBX1BSRUZJWC9zaGFyZS9sdWEvJExVQV9WRVJTSU9OIgorCisgICAgICAgIGRubCBUcnkgdG8gZmluZCBhIHBhdGggd2l0aCB0aGUgcHJlZml4LgorICAgICAgICBfQVhfTFVBX0ZORF9QUkZYX1BUSChbJExVQV0sIFskYXhfbHVhX3ByZWZpeF0sIFtzY3JpcHRdKQorICAgICAgICBBU19JRihbdGVzdCAieCRheF9sdWFfcHJlZml4ZWRfcGF0aCIgIT0gJ3gnXSwKKyAgICAgICAgWyBkbmwgRml4IHRoZSBwcmVmaXguCisgICAgICAgICAgX2F4X3N0cmlwX3ByZWZpeD1gZWNobyAiJGF4X2x1YV9wcmVmaXgiIHwgJFNFRCAnc3wufC58ZydgCisgICAgICAgICAgYXhfY3ZfbHVhX2x1YWRpcj1gZWNobyAiJGF4X2x1YV9wcmVmaXhlZF9wYXRoIiB8IFwKKyAgICAgICAgICAgICRTRUQgInN8XiRfYXhfc3RyaXBfcHJlZml4fCRMVUFfUFJFRklYfCJgCisgICAgICAgIF0pCisgICAgICBdKQorICAgIEFDX1NVQlNUKFtsdWFkaXJdLCBbJGF4X2N2X2x1YV9sdWFkaXJdKQorICAgIEFDX1NVQlNUKFtwa2dsdWFkaXJdLCBbXCR7bHVhZGlyfS8kUEFDS0FHRV0pCisKKyAgICBkbmwgTHVhIHByb3ZpZGVzIG5vIHdheSB0byBxdWVyeSB0aGUgbW9kdWxlIGRpcmVjdG9yeSwgYW5kIGluc3RlYWQKKyAgICBkbmwgcHJvdmlkZXMgTFVBX1BBVEguIEhvd2V2ZXIsIHdlIHNob3VsZCBiZSBhYmxlIHRvIG1ha2UgYSBzYWZlIGVkdWNhdGVkCisgICAgZG5sIGd1ZXNzLiBJZiB0aGUgYnVpbHQtaW4gc2VhcmNoIHBhdGggY29udGFpbnMgYSBkaXJlY3Rvcnkgd2hpY2ggaXMKKyAgICBkbmwgcHJlZml4ZWQgYnkgJGV4ZWNfcHJlZml4LCB0aGVuIHdlIGNhbiBzdG9yZSBtb2R1bGVzIHRoZXJlLiBUaGUgZmlyc3QKKyAgICBkbmwgbWF0Y2hpbmcgcGF0aCB3aWxsIGJlIHVzZWQuCisgICAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciAkYXhfZGlzcGxheV9MVUEgbW9kdWxlIGRpcmVjdG9yeV0sCisgICAgICBbYXhfY3ZfbHVhX2x1YWV4ZWNkaXJdLAorICAgICAgWyBBU19JRihbdGVzdCAieCRleGVjX3ByZWZpeCIgPSAneE5PTkUnXSwKKyAgICAgICAgICBbYXhfbHVhX2V4ZWNfcHJlZml4PSRheF9sdWFfcHJlZml4XSwKKyAgICAgICAgICBbYXhfbHVhX2V4ZWNfcHJlZml4PSRleGVjX3ByZWZpeF0pCisKKyAgICAgICAgZG5sIEluaXRpYWxpemUgdG8gdGhlIGRlZmF1bHQgcGF0aC4KKyAgICAgICAgYXhfY3ZfbHVhX2x1YWV4ZWNkaXI9IiRMVUFfRVhFQ19QUkVGSVgvbGliL2x1YS8kTFVBX1ZFUlNJT04iCisKKyAgICAgICAgZG5sIFRyeSB0byBmaW5kIGEgcGF0aCB3aXRoIHRoZSBwcmVmaXguCisgICAgICAgIF9BWF9MVUFfRk5EX1BSRlhfUFRIKFskTFVBXSwKKyAgICAgICAgICBbJGF4X2x1YV9leGVjX3ByZWZpeF0sIFttb2R1bGVdKQorICAgICAgICBBU19JRihbdGVzdCAieCRheF9sdWFfcHJlZml4ZWRfcGF0aCIgIT0gJ3gnXSwKKyAgICAgICAgWyBkbmwgRml4IHRoZSBwcmVmaXguCisgICAgICAgICAgX2F4X3N0cmlwX3ByZWZpeD1gZWNobyAiJGF4X2x1YV9leGVjX3ByZWZpeCIgfCAkU0VEICdzfC58LnxnJ2AKKyAgICAgICAgICBheF9jdl9sdWFfbHVhZXhlY2Rpcj1gZWNobyAiJGF4X2x1YV9wcmVmaXhlZF9wYXRoIiB8IFwKKyAgICAgICAgICAgICRTRUQgInN8XiRfYXhfc3RyaXBfcHJlZml4fCRMVUFfRVhFQ19QUkVGSVh8ImAKKyAgICAgICAgXSkKKyAgICAgIF0pCisgICAgQUNfU1VCU1QoW2x1YWV4ZWNkaXJdLCBbJGF4X2N2X2x1YV9sdWFleGVjZGlyXSkKKyAgICBBQ19TVUJTVChbcGtnbHVhZXhlY2Rpcl0sIFtcJHtsdWFleGVjZGlyfS8kUEFDS0FHRV0pCisKKyAgICBkbmwgUnVuIGFueSB1c2VyIHNwZWNpZmllZCBhY3Rpb24uCisgICAgJDMKKyAgXSkKK10pCisKK2RubCBBWF9XSVRIX0xVQSBpcyBub3cgdGhlIHNhbWUgdGhpbmcgYXMgQVhfUFJPR19MVUEuCitBQ19ERUZVTihbQVhfV0lUSF9MVUFdLAorWworICBBQ19NU0dfV0FSTihbWyQwIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgQVhfUFJPR19MVUEgaW5zdGVhZF1dKQorICBBWF9QUk9HX0xVQQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIF9BWF9MVUFfQ0hLX0lTX0lOVFJQKFBST0csIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtfQVhfTFVBX0NIS19JU19JTlRSUF0sCitbCisgIGRubCBBIG1pbmltYWwgTHVhIGZhY3RvcmlhbCB0byBwcm92ZSB0aGlzIGlzIGFuIGludGVycHJldGVyLiBUaGlzIHNob3VsZCB3b3JrCisgIGRubCBmb3IgTHVhIGludGVycHJldGVycyB2ZXJzaW9uIDUuMCBhbmQgYmV5b25kLgorICBfYXhfbHVhX2ZhY3RvcmlhbD1bYCQxIDI+L2Rldi9udWxsIC1lICcKKyAgICAtLSBhIHNpbXBsZSBmYWN0b3JpYWwKKyAgICBmdW5jdGlvbiBmYWN0IChuKQorICAgICAgaWYgbiA9PSAwIHRoZW4KKyAgICAgICAgcmV0dXJuIDEKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG4gKiBmYWN0KG4tMSkKKyAgICAgIGVuZAorICAgIGVuZAorICAgIHByaW50KCJmYWN0KDUpIGlzICIgLi4gZmFjdCg1KSknYF0KKyAgQVNfSUYoW3Rlc3QgIiRfYXhfbHVhX2ZhY3RvcmlhbCIgPSAnZmFjdCg1KSBpcyAxMjAnXSwKKyAgICBbJDJdLCBbJDNdKQorXSkKKworCitkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZG5sIF9BWF9MVUFfQ0hLX1ZFUihQUk9HLCBNSU5JTVVNLVZFUlNJT04sIFtUT08tQklHLVZFUlNJT05dLAorZG5sICAgICAgICAgICAgICAgICBbQUNUSU9OLUlGLVRSVUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbX0FYX0xVQV9DSEtfVkVSXSwKK1sKKyAgZG5sIENoZWNrIHRoYXQgdGhlIEx1YSB2ZXJzaW9uIGlzIHdpdGhpbiB0aGUgYm91bmRzLiBPbmx5IHRoZSBtYWpvciBhbmQgbWlub3IKKyAgZG5sIHZlcnNpb24gbnVtYmVycyBhcmUgY29uc2lkZXJlZC4gVGhpcyBzaG91bGQgd29yayBmb3IgTHVhIGludGVycHJldGVycworICBkbmwgdmVyc2lvbiA1LjAgYW5kIGJleW9uZC4KKyAgX2F4X2x1YV9nb29kX3ZlcnNpb249W2AkMSAtZSAnCisgICAgLS0gYSBzY3JpcHQgdG8gY29tcGFyZSB2ZXJzaW9ucworICAgIGZ1bmN0aW9uIHZlcnN0cjJudW0odmVyc3RyKQorICAgICAgbG9jYWwgXywgXywgbWFqb3J2ZXIsIG1pbm9ydmVyID0gc3RyaW5nLmZpbmQodmVyc3RyLCAiXiglZCspJS4oJWQrKSIpCisgICAgICBpZiBtYWpvcnZlciBhbmQgbWlub3J2ZXIgdGhlbgorICAgICAgICByZXR1cm4gdG9udW1iZXIobWFqb3J2ZXIpICogMTAwICsgdG9udW1iZXIobWlub3J2ZXIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICBsb2NhbCBtaW52ZXIgPSB2ZXJzdHIybnVtKCIkMiIpCisgICAgbG9jYWwgXywgXywgdHJpbXZlciA9IHN0cmluZy5maW5kKF9WRVJTSU9OLCAiXkx1YSAoLiopIikKKyAgICBsb2NhbCB2ZXIgPSB2ZXJzdHIybnVtKHRyaW12ZXIpCisgICAgbG9jYWwgbWF4dmVyID0gdmVyc3RyMm51bSgiJDMiKSBvciAxZTkKKyAgICBpZiBtaW52ZXIgPD0gdmVyIGFuZCB2ZXIgPCBtYXh2ZXIgdGhlbgorICAgICAgcHJpbnQoInllcyIpCisgICAgZWxzZQorICAgICAgcHJpbnQoIm5vIikKKyAgICBlbmQnYF0KKyAgICBBU19JRihbdGVzdCAieCRfYXhfbHVhX2dvb2RfdmVyc2lvbiIgPSAieHllcyJdLAorICAgICAgWyQ0XSwgWyQ1XSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBfQVhfTFVBX0ZORF9QUkZYX1BUSChQUk9HLCBQUkVGSVgsIFNDUklQVC1PUi1NT0RVTEUtRElSKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtfQVhfTFVBX0ZORF9QUkZYX1BUSF0sCitbCisgIGRubCBHZXQgdGhlIHNjcmlwdCBvciBtb2R1bGUgZGlyZWN0b3J5IGJ5IHF1ZXJ5aW5nIHRoZSBMdWEgaW50ZXJwcmV0ZXIsCisgIGRubCBmaWx0ZXJpbmcgb24gdGhlIGdpdmVuIHByZWZpeCwgYW5kIHNlbGVjdGluZyB0aGUgc2hhbGxvd2VzdCBwYXRoLiBJZiBubworICBkbmwgcGF0aCBpcyBmb3VuZCBtYXRjaGluZyB0aGUgcHJlZml4LCB0aGUgcmVzdWx0IHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLgorICBkbmwgVGhlIHRoaXJkIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHR5cGUgb2Ygc2VhcmNoLCBpdCBjYW4gYmUgJ3NjcmlwdCcgb3IKKyAgZG5sICdtb2R1bGUnLiBTdXBwbHlpbmcgJ3NjcmlwdCcgd2lsbCBwZXJmb3JtIHRoZSBzZWFyY2ggd2l0aCBwYWNrYWdlLnBhdGgKKyAgZG5sIGFuZCBMVUFfUEFUSCwgYW5kIHN1cHBseWluZyAnbW9kdWxlJyB3aWxsIHNlYXJjaCB3aXRoIHBhY2thZ2UuY3BhdGggYW5kCisgIGRubCBMVUFfQ1BBVEguIFRoaXMgaXMgZG9uZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjAuCisKKyAgYXhfbHVhX3ByZWZpeGVkX3BhdGg9W2AkMSAtZSAnCisgICAgLS0gZ2V0IHRoZSBwYXRoIGJhc2VkIG9uIHNlYXJjaCB0eXBlCisgICAgbG9jYWwgc2VhcmNodHlwZSA9ICIkMyIKKyAgICBsb2NhbCBwYXRocyA9ICIiCisgICAgaWYgc2VhcmNodHlwZSA9PSAic2NyaXB0IiB0aGVuCisgICAgICBwYXRocyA9IChwYWNrYWdlIGFuZCBwYWNrYWdlLnBhdGgpIG9yIExVQV9QQVRICisgICAgZWxzZWlmIHNlYXJjaHR5cGUgPT0gIm1vZHVsZSIgdGhlbgorICAgICAgcGF0aHMgPSAocGFja2FnZSBhbmQgcGFja2FnZS5jcGF0aCkgb3IgTFVBX0NQQVRICisgICAgZW5kCisgICAgLS0gc2VhcmNoIGZvciB0aGUgcHJlZml4CisgICAgbG9jYWwgcHJlZml4ID0gIickMiciCisgICAgbG9jYWwgbWlucGF0aCA9ICIiCisgICAgbG9jYWwgbWluZGVwdGggPSAxZTkKKyAgICBzdHJpbmcuZ3N1YihwYXRocywgIihAPDpAXjtAOj5AKykiLAorICAgICAgZnVuY3Rpb24gKHBhdGgpCisgICAgICAgIHBhdGggPSBzdHJpbmcuZ3N1YihwYXRoLCAiJT8uKiQiLCAiIikKKyAgICAgICAgcGF0aCA9IHN0cmluZy5nc3ViKHBhdGgsICIvQDw6QF4vQDo+QCokIiwgIiIpCisgICAgICAgIGlmIHN0cmluZy5maW5kKHBhdGgsIHByZWZpeCkgdGhlbgorICAgICAgICAgIGxvY2FsIGRlcHRoID0gc3RyaW5nLmxlbihzdHJpbmcuZ3N1YihwYXRoLCAiQDw6QF4vQDo+QCIsICIiKSkKKyAgICAgICAgICBpZiBkZXB0aCA8IG1pbmRlcHRoIHRoZW4KKyAgICAgICAgICAgIG1pbnBhdGggPSBwYXRoCisgICAgICAgICAgICBtaW5kZXB0aCA9IGRlcHRoCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kKQorICAgIHByaW50KG1pbnBhdGgpJ2BdCitdKQorCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitkbmwgQVhfTFVBX0hFQURFUlMoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfTFVBX0hFQURFUlNdLAorWworICBkbmwgQ2hlY2sgZm9yIExVQV9WRVJTSU9OLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIExVQV9WRVJTSU9OIGlzIGRlZmluZWRdKQorICBBU19JRihbdGVzdCAieCRMVUFfVkVSU0lPTiIgIT0gJ3gnXSwKKyAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgY2hlY2sgTHVhIGhlYWRlcnMgd2l0aG91dCBrbm93aW5nIExVQV9WRVJTSU9OXSkKKyAgICBdKQorCisgIGRubCBNYWtlIExVQV9JTkNMVURFIGEgcHJlY2lvdXMgdmFyaWFibGUuCisgIEFDX0FSR19WQVIoW0xVQV9JTkNMVURFXSwgW1RoZSBMdWEgaW5jbHVkZXMsIGUuZy4gLUkvdXNyL2luY2x1ZGUvbHVhNS4xXSkKKworICBkbmwgU29tZSBkZWZhdWx0IGRpcmVjdG9yaWVzIHRvIHNlYXJjaC4KKyAgTFVBX1NIT1JUX1ZFUlNJT049YGVjaG8gIiRMVUFfVkVSU0lPTiIgfCAkU0VEICdzfFwufHwnYAorICBtNF9kZWZpbmVfZGVmYXVsdChbX0FYX0xVQV9JTkNMVURFX0xJU1RdLAorICAgIFsgL3Vzci9pbmNsdWRlL2x1YSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2luY2x1ZGUvbHVhLSRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2luY2x1ZGUvbHVhLyRMVUFfVkVSU0lPTiBcCisgICAgICAvdXNyL2luY2x1ZGUvbHVhJExVQV9TSE9SVF9WRVJTSU9OIFwKKyAgICAgIC91c3IvbG9jYWwvaW5jbHVkZS9sdWEkTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS0kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YS8kTFVBX1ZFUlNJT04gXAorICAgICAgL3Vzci9sb2NhbC9pbmNsdWRlL2x1YSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgXSkKKworICBkbmwgVHJ5IHRvIGZpbmQgdGhlIGhlYWRlcnMuCisgIF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3M9JENQUEZMQUdTCisgIENQUEZMQUdTPSIkQ1BQRkxBR1MgJExVQV9JTkNMVURFIgorICBBQ19DSEVDS19IRUFERVJTKFtsdWEuaCBsdWFsaWIuaCBsYXV4bGliLmggbHVhY29uZi5oXSkKKyAgQ1BQRkxBR1M9JF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3MKKworICBkbmwgVHJ5IHNvbWUgb3RoZXIgZGlyZWN0b3JpZXMgaWYgTFVBX0lOQ0xVREUgd2FzIG5vdCBzZXQuCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9JTkNMVURFIiA9ICd4JyAmJgorICAgICAgICAgdGVzdCAieCRhY19jdl9oZWFkZXJfbHVhX2giICE9ICd4eWVzJ10sCisgICAgWyBkbmwgVHJ5IHNvbWUgY29tbW9uIGluY2x1ZGUgcGF0aHMuCisgICAgICBmb3IgX2F4X2luY2x1ZGVfcGF0aCBpbiBfQVhfTFVBX0lOQ0xVREVfTElTVDsgZG8KKyAgICAgICAgdGVzdCAhIC1kICIkX2F4X2luY2x1ZGVfcGF0aCIgJiYgY29udGludWUKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBMdWEgaGVhZGVycyBpbl0pCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRfYXhfaW5jbHVkZV9wYXRoXSkKKworICAgICAgICBBU19VTlNFVChbYWNfY3ZfaGVhZGVyX2x1YV9oXSkKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sdWFsaWJfaF0pCisgICAgICAgIEFTX1VOU0VUKFthY19jdl9oZWFkZXJfbGF1eGxpYl9oXSkKKyAgICAgICAgQVNfVU5TRVQoW2FjX2N2X2hlYWRlcl9sdWFjb25mX2hdKQorCisgICAgICAgIF9heF9sdWFfc2F2ZWRfY3BwZmxhZ3M9JENQUEZMQUdTCisgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLUkkX2F4X2luY2x1ZGVfcGF0aCIKKyAgICAgICAgQUNfQ0hFQ0tfSEVBREVSUyhbbHVhLmggbHVhbGliLmggbGF1eGxpYi5oIGx1YWNvbmYuaF0pCisgICAgICAgIENQUEZMQUdTPSRfYXhfbHVhX3NhdmVkX2NwcGZsYWdzCisKKyAgICAgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3ZfaGVhZGVyX2x1YV9oIiA9ICd4eWVzJ10sCisgICAgICAgICAgWyBMVUFfSU5DTFVERT0iLUkkX2F4X2luY2x1ZGVfcGF0aCIKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgXSkKKyAgICAgIGRvbmUKKyAgICBdKQorCisgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9sdWFfaCIgPSAneHllcyddLAorICAgIFsgZG5sIE1ha2UgYSBwcm9ncmFtIHRvIHByaW50IExVQV9WRVJTSU9OIGRlZmluZWQgaW4gdGhlIGhlYWRlci4KKyAgICAgIGRubCBUT0RPIEl0IHdvdWxkIGJlIHJlYWxseSBuaWNlIGlmIHdlIGNvdWxkIGRvIHRoaXMgd2l0aG91dCBjb21waWxpbmcgYQorICAgICAgZG5sIHByb2dyYW0sIHRoZW4gaXQgd291bGQgd29yayB3aGVuIGNyb3NzIGNvbXBpbGluZy4gQnV0IEknbSBub3Qgc3VyZSBob3cKKyAgICAgIGRubCB0byBkbyB0aGlzIHJlbGlhYmx5LiBGb3Igbm93LCBhc3N1bWUgdmVyc2lvbnMgbWF0Y2ggd2hlbiBjcm9zcyBjb21waWxpbmcuCisKKyAgICAgIEFTX0lGKFt0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gJ3h5ZXMnXSwKKyAgICAgICAgWyBBQ19DQUNIRV9DSEVDSyhbZm9yIEx1YSBoZWFkZXIgdmVyc2lvbl0sCisgICAgICAgICAgICBbYXhfY3ZfbHVhX2hlYWRlcl92ZXJzaW9uXSwKKyAgICAgICAgICAgIFsgX2F4X2x1YV9zYXZlZF9jcHBmbGFncz0kQ1BQRkxBR1MKKyAgICAgICAgICAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkTFVBX0lOQ0xVREUiCisgICAgICAgICAgICAgIEFDX1JVTl9JRkVMU0UoCisgICAgICAgICAgICAgICAgWyBBQ19MQU5HX1NPVVJDRShbWworI2luY2x1ZGUgPGx1YS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICBpZihhcmdjID4gMSkgcHJpbnRmKCIlcyIsIExVQV9WRVJTSU9OKTsKKyAgZXhpdChFWElUX1NVQ0NFU1MpOworfQorXV0pCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBbIGF4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbj1gLi9jb25mdGVzdCRFWEVFWFQgcCB8IFwKKyAgICAgICAgICAgICAgICAgICAgJFNFRCAtbiAic3xeTHVhIFwoQDw6QDAtOUA6PkBcezEsXH1cLkA8OkAwLTlAOj5AXHsxLFx9XCkuXHswLFx9fFwxfHAiYAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgW2F4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbj0ndW5rbm93biddKQorICAgICAgICAgICAgICBDUFBGTEFHUz0kX2F4X2x1YV9zYXZlZF9jcHBmbGFncworICAgICAgICAgICAgXSkKKworICAgICAgICAgIGRubCBDb21wYXJlIHRoaXMgdG8gdGhlIHByZXZpb3VzbHkgZm91bmQgTFVBX1ZFUlNJT04uCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBMdWEgaGVhZGVyIHZlcnNpb24gbWF0Y2hlcyAkTFVBX1ZFUlNJT05dKQorICAgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X2x1YV9oZWFkZXJfdmVyc2lvbiIgPSAieCRMVUFfVkVSU0lPTiJdLAorICAgICAgICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICBheF9oZWFkZXJfdmVyc2lvbl9tYXRjaD0neWVzJworICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgICAgICAgICBheF9oZWFkZXJfdmVyc2lvbl9tYXRjaD0nbm8nCisgICAgICAgICAgICBdKQorICAgICAgICBdLAorICAgICAgICBbIEFDX01TR19XQVJOKFtjcm9zcyBjb21waWxpbmcgc28gYXNzdW1pbmcgaGVhZGVyIHZlcnNpb24gbnVtYmVyIG1hdGNoZXNdKQorICAgICAgICAgIGF4X2hlYWRlcl92ZXJzaW9uX21hdGNoPSd5ZXMnCisgICAgICAgIF0pCisgICAgXSkKKworICBkbmwgV2FzIExVQV9JTkNMVURFIHNwZWNpZmllZD8KKyAgQVNfSUYoW3Rlc3QgIngkYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2giICE9ICd4eWVzJyAmJgorICAgICAgICAgdGVzdCAieCRMVUFfSU5DTFVERSIgIT0gJ3gnXSwKKyAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBoZWFkZXJzIGZvciBzcGVjaWZpZWQgTFVBX0lOQ0xVREVdKV0pCisKKyAgZG5sIFRlc3QgdGhlIGZpbmFsIHJlc3VsdCBhbmQgcnVuIHVzZXIgY29kZS4KKyAgQVNfSUYoW3Rlc3QgIngkYXhfaGVhZGVyX3ZlcnNpb25fbWF0Y2giID0gJ3h5ZXMnXSwgWyQxXSwKKyAgICBbbTRfZGVmYXVsdChbJDJdLCBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBMdWEgaW5jbHVkZXNdKV0pXSkKK10pCisKK2RubCBBWF9MVUFfSEVBREVSU19WRVJTSU9OIG5vIGxvbmdlciBleGlzdHMsIHVzZSBBWF9MVUFfSEVBREVSUy4KK0FDX0RFRlVOKFtBWF9MVUFfSEVBREVSU19WRVJTSU9OXSwKK1sKKyAgQUNfTVNHX1dBUk4oW1skMCBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIEFYX0xVQV9IRUFERVJTIGluc3RlYWRdXSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9MVUFfTElCUyhbQUNUSU9OLUlGLUZPVU5EXSwgW0FDVElPTi1JRi1OT1QtRk9VTkRdKQorZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FDX0RFRlVOKFtBWF9MVUFfTElCU10sCitbCisgIGRubCBUT0RPIFNob3VsZCB0aGlzIG1hY3JvIGFsc28gY2hlY2sgdmFyaW91cyAtTCBmbGFncz8KKworICBkbmwgQ2hlY2sgZm9yIExVQV9WRVJTSU9OLgorICBBQ19NU0dfQ0hFQ0tJTkcoW2lmIExVQV9WRVJTSU9OIGlzIGRlZmluZWRdKQorICBBU19JRihbdGVzdCAieCRMVUFfVkVSU0lPTiIgIT0gJ3gnXSwKKyAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgIFsgQUNfTVNHX1JFU1VMVChbbm9dKQorICAgICAgQUNfTVNHX0VSUk9SKFtjYW5ub3QgY2hlY2sgTHVhIGxpYnMgd2l0aG91dCBrbm93aW5nIExVQV9WRVJTSU9OXSkKKyAgICBdKQorCisgIGRubCBNYWtlIExVQV9MSUIgYSBwcmVjaW91cyB2YXJpYWJsZS4KKyAgQUNfQVJHX1ZBUihbTFVBX0xJQl0sIFtUaGUgTHVhIGxpYnJhcnksIGUuZy4gLWxsdWE1LjFdKQorCisgIEFTX0lGKFt0ZXN0ICJ4JExVQV9MSUIiICE9ICd4J10sCisgIFsgZG5sIENoZWNrIHRoYXQgTFVBX0xJQlMgd29ya3MuCisgICAgX2F4X2x1YV9zYXZlZF9saWJzPSRMSUJTCisgICAgTElCUz0iJExJQlMgJExVQV9MSUIiCisgICAgQUNfU0VBUkNIX0xJQlMoW2x1YV9sb2FkXSwgW10sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSd5ZXMnXSwKKyAgICAgIFtfYXhfZm91bmRfbHVhX2xpYnM9J25vJ10pCisgICAgTElCUz0kX2F4X2x1YV9zYXZlZF9saWJzCisKKyAgICBkbmwgQ2hlY2sgdGhlIHJlc3VsdC4KKyAgICBBU19JRihbdGVzdCAieCRfYXhfZm91bmRfbHVhX2xpYnMiICE9ICd4eWVzJ10sCisgICAgICBbQUNfTVNHX0VSUk9SKFtjYW5ub3QgZmluZCBsaWJzIGZvciBzcGVjaWZpZWQgTFVBX0xJQl0pXSkKKyAgXSwKKyAgWyBkbmwgRmlyc3Qgc2VhcmNoIGZvciBleHRyYSBsaWJzLgorICAgIF9heF9sdWFfZXh0cmFfbGlicz0nJworCisgICAgX2F4X2x1YV9zYXZlZF9saWJzPSRMSUJTCisgICAgTElCUz0iJExJQlMgJExVQV9MSUIiCisgICAgQUNfU0VBUkNIX0xJQlMoW2V4cF0sIFttXSkKKyAgICBBQ19TRUFSQ0hfTElCUyhbZGxvcGVuXSwgW2RsXSkKKyAgICBMSUJTPSRfYXhfbHVhX3NhdmVkX2xpYnMKKworICAgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9leHAiICE9ICd4bm8nICYmCisgICAgICAgICAgIHRlc3QgIngkYWNfY3Zfc2VhcmNoX2V4cCIgIT0gJ3hub25lIHJlcXVpcmVkJ10sCisgICAgICBbX2F4X2x1YV9leHRyYV9saWJzPSIkX2F4X2x1YV9leHRyYV9saWJzICRhY19jdl9zZWFyY2hfZXhwIl0pCisKKyAgICBBU19JRihbdGVzdCAieCRhY19jdl9zZWFyY2hfZGxvcGVuIiAhPSAneG5vJyAmJgorICAgICAgICAgICB0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9kbG9wZW4iICE9ICd4bm9uZSByZXF1aXJlZCddLAorICAgICAgW19heF9sdWFfZXh0cmFfbGlicz0iJF9heF9sdWFfZXh0cmFfbGlicyAkYWNfY3Zfc2VhcmNoX2Rsb3BlbiJdKQorCisgICAgZG5sIFRyeSB0byBmaW5kIHRoZSBMdWEgbGlicy4KKyAgICBfYXhfbHVhX3NhdmVkX2xpYnM9JExJQlMKKyAgICBMSUJTPSIkTElCUyAkTFVBX0xJQiIKKyAgICBBQ19TRUFSQ0hfTElCUyhbbHVhX2xvYWRdLAorICAgICAgWyBsdWEkTFVBX1ZFUlNJT04gXAorICAgICAgICBsdWEkTFVBX1NIT1JUX1ZFUlNJT04gXAorICAgICAgICBsdWEtJExVQV9WRVJTSU9OIFwKKyAgICAgICAgbHVhLSRMVUFfU0hPUlRfVkVSU0lPTiBcCisgICAgICAgIGx1YSBcCisgICAgICBdLAorICAgICAgW19heF9mb3VuZF9sdWFfbGlicz0neWVzJ10sCisgICAgICBbX2F4X2ZvdW5kX2x1YV9saWJzPSdubyddLAorICAgICAgWyRfYXhfbHVhX2V4dHJhX2xpYnNdKQorICAgIExJQlM9JF9heF9sdWFfc2F2ZWRfbGlicworCisgICAgQVNfSUYoW3Rlc3QgIngkYWNfY3Zfc2VhcmNoX2x1YV9sb2FkIiAhPSAneG5vJyAmJgorICAgICAgICAgICB0ZXN0ICJ4JGFjX2N2X3NlYXJjaF9sdWFfbG9hZCIgIT0gJ3hub25lIHJlcXVpcmVkJ10sCisgICAgICBbTFVBX0xJQj0iJGFjX2N2X3NlYXJjaF9sdWFfbG9hZCAkX2F4X2x1YV9leHRyYV9saWJzIl0pCisgIF0pCisKKyAgZG5sIFRlc3QgdGhlIHJlc3VsdCBhbmQgcnVuIHVzZXIgY29kZS4KKyAgQVNfSUYoW3Rlc3QgIngkX2F4X2ZvdW5kX2x1YV9saWJzIiA9ICd4eWVzJ10sIFskMV0sCisgICAgW200X2RlZmF1bHQoWyQyXSwgW0FDX01TR19FUlJPUihbY2Fubm90IGZpbmQgTHVhIGxpYnNdKV0pXSkKK10pCisKKworZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2RubCBBWF9MVUFfUkVBRExJTkUoW0FDVElPTi1JRi1GT1VORF0sIFtBQ1RJT04tSUYtTk9ULUZPVU5EXSkKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBQ19ERUZVTihbQVhfTFVBX1JFQURMSU5FXSwKK1sKKyAgQVhfTElCX1JFQURMSU5FCisgIEFTX0lGKFt0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9yZWFkbGluZV9yZWFkbGluZV9oIiAhPSAneCcgJiYKKyAgICAgICAgIHRlc3QgIngkYWNfY3ZfaGVhZGVyX3JlYWRsaW5lX2hpc3RvcnlfaCIgIT0gJ3gnXSwKKyAgICBbIExVQV9MSUJTX0NGTEFHUz0iLURMVUFfVVNFX1JFQURMSU5FICRMVUFfTElCU19DRkxBR1MiCisgICAgICAkMQorICAgIF0sCisgICAgWyQyXSkKK10pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmM3NDk1Ci0tLSAvZGV2L251bGwKKysrIGIvYWNsb2NhbC9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDYxIEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2RvdG5ldGNvcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTihbVkVSU0lPTl0sW0FDVElPTi1JRi1UUlVFXSxbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBNYWtlcyBzdXJlIHRoYXQgLk5FVCBDb3JlIHN1cHBvcnRzIHRoZSB2ZXJzaW9uIGluZGljYXRlZC4gSWYgdHJ1ZSB0aGUKKyMgICBzaGVsbCBjb21tYW5kcyBpbiBBQ1RJT04tSUYtVFJVRSBhcmUgZXhlY3V0ZWQuIElmIG5vdCB0aGUgc2hlbGwgY29tbWFuZHMKKyMgICBpbiBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlICRkb3RuZXRjb3JlX3ZlcnNpb24gdmFyaWFibGUgd2lsbCBiZQorIyAgIGZpbGxlZCB3aXRoIHRoZSBkZXRlY3RlZCB2ZXJzaW9uLgorIworIyAgIFRoaXMgbWFjcm8gdXNlcyB0aGUgJERPVE5FVENPUkUgdmFyaWFibGUgdG8gcGVyZm9ybSB0aGUgY2hlY2suIElmCisjICAgJERPVE5FVENPUkUgaXMgbm90IHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgbWFjcm8sIHRoZSBtYWNybyB3aWxsIGZhaWwuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX1BBVEhfUFJPRyhbRE9UTkVUQ09SRV0sW2RvdG5ldF0pCisjICAgICBBQ19QUk9HX0RPVE5FVENPUkVfVkVSU0lPTihbMS4wLjJdLFsgLi4uIF0sWyAuLi4gXSkKKyMKKyMgICBTZWFyY2hlcyBmb3IgLk5FVCBDb3JlLCB0aGVuIGNoZWNrcyBpZiBhdCBsZWFzdCB2ZXJzaW9uIDEuMC4yIGlzCisjICAgcHJlc2VudC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAxNiBKZW5zIEdleWVyIDxqZW5zZ0BhcGFjaGUub3JnPgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAyCisKK0FDX0RFRlVOKFtBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTl0sWworICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfU0VEXSkKKworICAgIEFTX0lGKFt0ZXN0IC1uICIkRE9UTkVUQ09SRSJdLFsKKyAgICAgICAgYXhfZG90bmV0Y29yZV92ZXJzaW9uPSIkMSIKKworICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAuTkVUIENvcmUgdmVyc2lvbl0pCisgICAgICAgIGRvdG5ldGNvcmVfdmVyc2lvbj1gJERPVE5FVENPUkUgLS12ZXJzaW9uIDI+JjEgfCAkU0VEIC1lICdzL1woQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwpXCguKlwpL1wxLydgCisgICAgICAgIEFDX01TR19SRVNVTFQoJGRvdG5ldGNvcmVfdmVyc2lvbikKKworCSAgICBBQ19TVUJTVChbRE9UTkVUQ09SRV9WRVJTSU9OXSxbJGRvdG5ldGNvcmVfdmVyc2lvbl0pCisKKyAgICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskYXhfZG90bmV0Y29yZV92ZXJzaW9uXSxbbGVdLFskZG90bmV0Y29yZV92ZXJzaW9uXSxbCisJICAgIDoKKyAgICAgICAgICAgICQyCisgICAgICAgIF0sWworCSAgICA6CisgICAgICAgICAgICAkMworICAgICAgICBdKQorICAgIF0sWworICAgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgLk5FVCBDb3JlXSkKKyAgICAgICAgJDMKKyAgICBdKQorXSkKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYWNjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFJPR19IQVhFX1ZFUlNJT04oW1ZFUlNJT05dLFtBQ1RJT04tSUYtVFJVRV0sW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTWFrZXMgc3VyZSB0aGF0IGhheGUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZSBzaGVsbAorIyAgIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcyBpbgorIyAgIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJEhBWEVfVkVSU0lPTiB2YXJpYWJsZSB3aWxsIGJlIGZpbGxlZCB3aXRoCisjICAgdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkSEFYRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYgJEhBWEUgaXMgbm90CisjICAgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtIQVhFXSxbaGF4ZV0pCisjICAgICBBQ19QUk9HX0hBWEVfVkVSU0lPTihbMy4xLjNdLFsgLi4uIF0sWyAuLi4gXSkKKyMKKyMgICBTZWFyY2hlcyBmb3IgSGF4ZSwgdGhlbiBjaGVja3MgaWYgYXQgbGVhc3QgdmVyc2lvbiAzLjEuMyBpcyBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE1IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfSEFYRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRIQVhFIl0sWworICAgICAgICBheF9oYXhlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGhheGUgdmVyc2lvbl0pCisgICAgICAgIGhheGVfdmVyc2lvbj1gJEhBWEUgLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXi4qIFwoIEA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXC5APDpAMC05QDo+QCpcKSAuKi9cMS8nYAorICAgICAgICBBQ19NU0dfUkVTVUxUKCRoYXhlX3ZlcnNpb24pCisKKwkgICAgQUNfU1VCU1QoW0hBWEVfVkVSU0lPTl0sWyRoYXhlX3ZlcnNpb25dKQorCisgICAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGF4X2hheGVfdmVyc2lvbl0sW2xlXSxbJGhheGVfdmVyc2lvbl0sWworCSAgICA6CisgICAgICAgICAgICAkMgorICAgICAgICBdLFsKKwkgICAgOgorICAgICAgICAgICAgJDMKKyAgICAgICAgXSkKKyAgICBdLFsKKyAgICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5kIEhheGVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNCBiL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKaW5kZXggMTFhMzI2Yy4uNzBiMzIzMCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNAorKysgYi9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX3BlcmxfbW9kdWxlcy5odG1sCisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDcKKyNzZXJpYWwgOAogCiBBVV9BTElBUyhbQUNfUFJPR19QRVJMX01PRFVMRVNdLCBbQVhfUFJPR19QRVJMX01PRFVMRVNdKQogQUNfREVGVU4oW0FYX1BST0dfUEVSTF9NT0RVTEVTXSxbZG5sCmRpZmYgLS1naXQgYS9hcHB2ZXlvci55bWwgYi9hcHB2ZXlvci55bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2FwcHZleW9yLnltbApAQCAtMCwwICsxLDExMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBBcHBWZXlvciAtIGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tCisKK3ZlcnNpb246ICcxLjAuMC57YnVpbGR9JworCitzaGFsbG93X2Nsb25lOiB0cnVlCisKK29zOgorICAtIFZpc3VhbCBTdHVkaW8gMjAxNworCittYXRyaXg6CisgIGFsbG93X2ZhaWx1cmVzOgorICAgICAgLSBQUk9GSUxFOiBDWUdXSU4KKyAgZmFzdF9maW5pc2g6IHRydWUKKworZW52aXJvbm1lbnQ6CisgIG1hdHJpeDoKKyAgIC0gUFJPRklMRTogTVNWQzIwMTcKKyAgICAgUExBVEZPUk06IHg2NAorICAgICBDT05GSUdVUkFUSU9OOiBSZWxlYXNlCisgICAgIEJPT1NUX1ZFUlNJT046IDEuNjUuMQorICAgICBMSUJFVkVOVF9WRVJTSU9OOiAyLjEuOAorICAgICBQWVRIT05fVkVSU0lPTjogMy42CisgICAgIFFUX1ZFUlNJT046IDUuMTAKKyAgICAgWkxJQl9WRVJTSU9OOiAxLjIuMTEKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IE1TVkMyMDEzCisgICAgIFBMQVRGT1JNOiB4ODYKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjU4LjAKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4wLjIyCisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjUKKyAgICAgUVRfVkVSU0lPTjogNS44CisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjgKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNQorCisgICAtIFBST0ZJTEU6IE1JTkdXCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IENZR1dJTgorICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjICAtIFBST0ZJTEU6IENZR1dJTgorIyAgICBQTEFURk9STTogeDY0CisjICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisjICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCitpbnN0YWxsOgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1pbnN0YWxsLmJhdAorICAtIHJlZnJlc2hlbnYKKworYnVpbGRfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci1idWlsZC5iYXQKKwordGVzdF9zY3JpcHQ6CisgIC0gY2QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKyAgLSBjYWxsIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CisKKworIyBhcnRpZmFjdCBjYXB0dXJlIGRpc2FibGVkIGFzIGl0IG1pZ2h0IGluY3JlYXNlIHNlcnZpY2UgY29zdCBmb3IgbGl0dGxlIGdhaW46CisjCisjIGFydGlmYWN0czoKKyMgIC0gcGF0aDogbG9jYWwtdGhyaWZ0LWluc3QKKyMgICAgbmFtZTogY21ha2UgaW5zdGFsbGVkIGNvbnRlbnQKKyMgICAgdHlwZTogemlwCisjCisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1idWlsZFxUZXN0aW5nCisjICAgIG5hbWU6IGN0ZXN0IG91dHB1dAorIyAgICB0eXBlOiB6aXAKKworIyBSRFAgc3VwcG9ydDogdXNlIG9uZSBvciB0aGUgb3RoZXIuLi4KKyMKKyMgZW5hYmxlcyBSRFAgZm9yIGVhY2ggYnVpbGQgam9iIHNvIHlvdSBjYW4gaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgam9iOgorIyBpbml0OgorIyAgLSBwczogaWV4ICgobmV3LW9iamVjdCBuZXQud2ViY2xpZW50KS5Eb3dubG9hZFN0cmluZygnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwcHZleW9yL2NpL21hc3Rlci9zY3JpcHRzL2VuYWJsZS1yZHAucHMxJykpCisjCisjIGVuYWJsZXMgUkRQIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGxvZ2luIGFuZCByZS1ydW4KKyMgY29tbWFuZHMgdG8gc2VlIHdoeSBzb21ldGhpbmcgZmFpbGVkLi4uCisjb25fZmluaXNoOgorIyAgLSBwczogJGJsb2NrUmRwID0gJHRydWU7IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBhbHNvIG5lZWQ6CisjIGVudmlyb25tZW50OgorIyAgIEFQUFZFWU9SX1JEUF9QQVNTV09SRDogdGhyMUZUMjM0NSR4eXpaCmRpZmYgLS1naXQgYS9ib290c3RyYXAuc2ggYi9ib290c3RyYXAuc2gKaW5kZXggMGMyYjg4Ni4uMjQ1MmVlYSAxMDA3NTUKLS0tIGEvYm9vdHN0cmFwLnNoCisrKyBiL2Jvb3RzdHJhcC5zaApAQCAtMzgsOSArMzgsMjQgQEAKICAgZXhpdCAxCiBmaQogCitmb3JtYXRfdmVyc2lvbiAoKSB7CisgICAgcHJpbnRmICIlMDNkJTAzZCUwM2QlMDNkIiAkKGVjaG8gJDEgfCB0ciAnLicgJyAnKTsKK30KKworIyB3ZSByZXF1aXJlIGF1dG9tYWtlIDEuMTMgb3IgbGF0ZXIKKyMgY2hlY2sgbXVzdCBoYXBwZW4gZXh0ZXJuYWxseSBkdWUgdG8gdXNlIG9mIG5ld2VyIG1hY3JvCitBVVRPTUFLRV9WRVJTSU9OPWBhdXRvbWFrZSAtLXZlcnNpb24gfCBncmVwIGF1dG9tYWtlIHwgZWdyZXAgLW8gJyhbMC05XXsxLH1cLikrWzAtOV17MSx9J2AKK2lmICBbICQoZm9ybWF0X3ZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04pIC1sdCAkKGZvcm1hdF92ZXJzaW9uIDEuMTMpIF07IHRoZW4KKyAgZWNobyA+JjIgImF1dG9tYWtlIHZlcnNpb24gJEFVVE9NQUtFX1ZFUlNJT04gaXMgdG9vIG9sZCAobmVlZCAxLjEzIG9yIGxhdGVyKSIKKyAgZXhpdCAxCitmaQorCitzZXQgLWUKIGF1dG9zY2FuCiAkTElCVE9PTElaRSAtLWNvcHkgLS1hdXRvbWFrZQogYWNsb2NhbCAtSSAuL2FjbG9jYWwKIGF1dG9oZWFkZXIKK3NlZCAnL3VuZGVmIFZFUlNJT04vZCcgY29uZmlnLmhpbiA+IGNvbmZpZy5oaW4yCittdiBjb25maWcuaGluMiBjb25maWcuaGluCiBhdXRvY29uZgogYXV0b21ha2UgLS1jb3B5IC0tYWRkLW1pc3NpbmcgLS1mb3JlaWduCmRpZmYgLS1naXQgYS9ib3dlci5qc29uIGIvYm93ZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTNiOGNiCi0tLSAvZGV2L251bGwKKysrIGIvYm93ZXIuanNvbgpAQCAtMCwwICsxLDE1IEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIsCisgICJhdXRob3JzIjogWworICAgICJBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IgorICBdLAorICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCIsCisgICJtYWluIjogImxpYi9qcy9zcmMvdGhyaWZ0LmpzIiwKKyAgImtleXdvcmRzIjogWworICAgICJ0aHJpZnQiCisgIF0sCisgICJsaWNlbnNlIjogIkFwYWNoZSB2MiIsCisgICJpZ25vcmUiOiBbXQorfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI2MjIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfQ1hYX0VYVEVOU0lPTlM9T04gXgorICAtRENNQUtFX0NYWF9GTEFHUz0iLURfR05VX1NPVVJDRSIgXgorICAtRENNQUtFX0NYWF9TVEFOREFSRD0xMSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04gXgorICAtRFdJVEhfU1REVEhSRUFEUz1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwzNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBDWUdXSU4KKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OgorOjogSW5zdGFsbCBhcHQtY3lnIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQKKzo6CisKKyVCQVNIJSAtbGMgIndnZXQgcmF3Z2l0LmNvbS90cmFuc2NvZGUtb3Blbi9hcHQtY3lnL21hc3Rlci9hcHQtY3lnICYmIGluc3RhbGwgYXB0LWN5ZyAvYmluICYmIHJtIC1mIGFwdC1jeWciIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgdXBkYXRlIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIGluc3RhbGwgYmlzb24gY21ha2UgZmxleCBnY2MtZysrIGxpYmJvb3N0LWRldmVsIGxpYmV2ZW50LWRldmVsIG1ha2Ugb3BlbnNzbC1kZXZlbCB6bGliLWRldmVsIgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2N2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3YTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX01BS0VfUFJPR1JBTT0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL21pbmd3MzItbWFrZSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2djYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2crKy5leGUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9L21pbmd3JU5PUk1fUExBVEZPUk0lIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2OWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNSU5HVyBvbiBNU1lTMgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1ib29zdCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1jbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1saWJldmVudCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS16bGliCisKKzo6bWluZ3ctdzY0LSVNSU5HV1BMQVQlLXF0NSA6IFdBWSB0b28gbGFyZ2UgKDFHQiBkb3dubG9hZCEpIC0gdGVzdGVkIGluIGN5Z3dpbiBidWlsZHMgYW55d2F5CisKKzo6IFJlbW92ZSBvbGQgcGFja2FnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgdG8gYXZvaWQgYW4gZXJyb3IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtLXJlbW92ZSBsaWJjYXRnZXRzIGNhdGdldHMgfHwgdHJ1ZSIgfHwgRVhJVCAvQgorCis6OiBVcGdyYWRlIHRoaW5ncworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWMxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitARUNITyBPTgorICBjbWFrZSAiJVNSQ0RJUiUiIF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorCS1EQklTT05fRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0iJUJPT1NUX1JPT1QlIiBeCisgICAgLURCT09TVF9MSUJSQVJZRElSPSIlQk9PU1RfTElCUkFSWURJUiUiIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9IiVDT05GSUdVUkFUSU9OJSIgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorCS1ERkxFWF9FWEVDVVRBQkxFPUM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcbGliXHdpbmZsZXhiaXNvbjNcdG9vbHNcd2luX2ZsZXguZXhlIF4KKyAgICAtRElOVFRZUEVTX1JPT1Q9IiVXSU4zUCVcbXNpbnR0eXBlcyIgXgorICAgIC1ETElCRVZFTlRfUk9PVD0iJVdJTjNQJVxsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSIlT1BFTlNTTF9ST09UJSIgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0iJVdJTjNQJVx6bGliLWluc3RcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIiIF4KKyAgICAtRFpMSUJfUk9PVD0iJVdJTjNQJVx6bGliLWluc3QiIF4KKyAgICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAgIC1EV0lUSF8lVEhSRUFETU9ERUwlVEhSRUFEUz1PTiBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCisKK2NtYWtlIC0tYnVpbGQgLiBeCisgIC0tY29uZmlnICIlQ09ORklHVVJBVElPTiUiIF4KKyAgLS10YXJnZXQgSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3M2QyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw1OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1ZDCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaG9jbyBmZWF0dXJlIGVuYWJsZSAtbiBhbGxvd0dsb2JhbENvbmZpcm1hdGlvbiB8fCBFWElUIC9CCisKKzo6IFRoaW5ncyB0byBpbnN0YWxsIHdoZW4gTk9UIHJ1bm5pbmcgaW4gYXBwdmV5b3I6CitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cCAteSBjaG9jb2xhdGV5ICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IGN1cmwgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IDd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IHB5dGhvbjMgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IG9wZW5zc2wubGlnaHQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitjaW5zdCAteSBqZGs4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjaW5zdCAteSB3aW5mbGV4Ymlzb24zICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHpsaWIgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC16bGliLmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBsaWJldmVudCAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLWxpYmV2ZW50LmJhdCAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHB5dGhvbiBwYWNrYWdlcyAoY29ycmVjdCBwYXRoIHRvIHBpcCBzZXQgaW4gY2xfc2V0ZW52LmJhdCkKK3BpcC5leGUgXgorICAgIGluc3RhbGwgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBeCisgICAgICAgICAgICBpcGFkZHJlc3MgXgorICAgICAgICAgICAgc2l4IF4KKyAgICAgICAgICAgIHRvcm5hZG8gXgorICAgICAgICAgICAgdHdpc3RlZCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaW5zdCAteSBnaGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDMyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPTgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRElSIEM6XGxpYnJhcmllcworRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzU5XzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82MF8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjJfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYzXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82NF8wCisKKzo6IEFkZCBkaXJlY3RvcmllcyB0byB0aGUgcGF0aCB0byBmaW5kIERMTHMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHNvIHRlc3RzIHJ1biBwcm9wZXJseSEKK1NFVCBQQVRIPSVCT09TVF9MSUJSQVJZRElSOi89XCU7JU9QRU5TU0xfUk9PVCVcYmluOyVXSU4zUCVcemxpYi1pbnN0XGJpbjslUEFUSCUKKworY3Rlc3QgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICIoJURJU0FCTEVEX1RFU1RTJSkiIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2gKK1NFVCBDTUFLRT0vYy9tc3lzNjQvbWluZ3c2NC9iaW4vY21ha2UuZXhlCisKK0BFQ0hPIE9OCitTRVQgQ01BS0VBUkdTPS1HXCIlR0VORVJBVE9SJVwiIF4KKyAgLURCb29zdF9ERUJVRz1PTiBeCisgIC1EQm9vc3RfTkFNRVNQQUNFPWxpYmJvb3N0IF4KKyAgLURCT09TVF9JTkNMVURFRElSPSVCT09TVF9JTkNMVURFRElSJSBeCisgIC1EQk9PU1RfTElCUkFSWURJUj0lQk9PU1RfTElCUkFSWURJUiUgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPWdjYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysuZXhlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09bWFrZS5leGUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSX01TWVMlIF4KKyAgLURMSUJFVkVOVF9ST09UPSVMSUJFVkVOVF9ST09UJSBeCisgIC1ET1BFTlNTTF9MSUJSQVJJRVM9JU9QRU5TU0xfTElCUkFSSUVTJSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0lT1BFTlNTTF9ST09UJSBeCisgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T04gXgorICAtRFdJVEhfQk9PU1RfU1RBVElDPU9OIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX0xJQkVWRU5UPU9OIF4KKyAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworJUJBU0glIC1sYyAibWtkaXIgJUJVSUxERElSX01TWVMlICYmIGNkICVCVUlMRERJUl9NU1lTJSAmJiAlQ01BS0UlICVTUkNESVJfTVNZUyUgJUNNQUtFQVJHUyUgJiYgJUNNQUtFJSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOGRmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1lTCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogV2UncmUgZ29pbmcgdG8ga2VlcCBib29zdCBhdCBhIHZlcnNpb24gY21ha2UgdW5kZXJzdGFuZHMKK1NFVCBCT09TVFBLRz1taW5ndy13NjQteDg2XzY0LWJvb3N0LTEuNjQuMC0zLWFueS5wa2cudGFyLnh6CitTRVQgSUdOT1JFPS0taWdub3JlIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtbGliZXZlbnQgXgorICBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXgorICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICB8fCBFWElUIC9CCisKKzo6IEluc3RhbGwgYSBzbGlnaHRseSBvbGRlciBib29zdCAoMS42NC4wKSBhcyBjbWFrZSAzLjEwCis6OiBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIGRlcGVuZGVuY2llcyBmb3IgYm9vc3QgMS42Ni4wIHlldAorOjogLS0gdGhpcyBjdXRzIGRvd24gb24gYnVpbGQgd2FybmluZyBvdXRwdXQgLS0KKyVCQVNIJSAtbGMgIndnZXQgaHR0cDovL3JlcG8ubXN5czIub3JnL21pbmd3L3g4Nl82NC8lQk9PU1RQS0clICYmIHBhY21hbiAtLW5vY29uZmlybSAtLW5lZWRlZCAtVSAlQk9PU1RQS0clICYmIHJtICVCT09TVFBLRyUiIHx8IEVYSVQgL0IKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHJhbmRvbWx5IGZhaWxzIG9uIG1pbmd3OyBzZWUgSmlyYSBUSFJJRlQtNDEwNgorU0VUIERJU0FCTEVEX1RFU1RTPWNvbmN1cnJlbmN5X3Rlc3QKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSX01TWVMlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyglRElTQUJMRURfVEVTVFMlKSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZCBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQXBwdmV5b3IgQnVpbGQKKworQXBwdmV5b3IgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBNU1ZDIDIwMTAgdGhyb3VnaCAyMDE1IGFzIHdlbGwgYXMKK2hhdmluZyB0aGUgbGF0ZXN0IE1TWVMyL01pbkdXIDY0LWJpdCBlbnZpcm9ubWVudC4gIEl0IGhhcyBtYW55IHZlcnNpb25zCitvZiBib29zdCBhbmQgcHl0aG9uIGluc3RhbGxlZCBhcyB3ZWxsLiAgU2VlIHdoYXQgYXBwdmV5b3IgaGFzCitbaW5zdGFsbGVkIG9uIGJ1aWxkIHdvcmtlcnNdKGh0dHBzOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2luc3RhbGxlZC1zb2Z0d2FyZS8pLgorCitXZSBydW4gYSBtYXRyaXggYnVpbGQgb24gQXBwdmV5b3IgYW5kIGJ1aWxkIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgorCisqIE1pbkdXIHg2NCAoZ2NjIDYuMy4wKQorKiBNU1ZDIDIwMTAgeDg2LCBhbiBvbGRlciBib29zdCwgYW4gb2xkZXIgcHl0aG9uCisqIE1TVkMgMjAxNSB4ODYveDY0LCB0aGUgbGF0ZXN0IGJvb3N0LCB0aGUgbGF0ZXN0IHB5dGhvbgorKiBNU1lTMiB4NjQgKGdjYyA2LjMuMCkgLSB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcworCitUaGUgQXBwdmV5b3Igc2NyaXB0IHRha2VzIHRoZSBmaXJzdCBmb3VyIGxldHRlcnMgZnJvbSB0aGUgUFJPRklMRSBzcGVjaWZpZWQgaW4KK3RoZSBlbnZpcm9ubWVudCBzdGFuemEgYW5kIHJ1bnMgdGhlc2Ugc2NyaXB0cyBpbiBvcmRlcjoKKworPz8/Py1hcHB2ZXlvci1pbnN0YWxsLmJhdCB3aWxsIGluc3RhbGwgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50Cis/Pz8/LWFwcHZleW9yLWJ1aWxkLmJhdCB3aWxsIGJ1aWxkIHdpdGggY21ha2UKKz8/Pz8tYXBwdmV5b3ItdGVzdC5iYXQgd2lsbCBydW4gY3Rlc3QKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI2MzViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsMzcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFVSTEZJTEU9bGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS50YXIuZ3oKK1NFVCBVUkw9aHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICB8fCBFWElUIC9CCitDRCAibGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgICAgICAgICAgfHwgRVhJVCAvQgorbm1ha2UgLWYgTWFrZWZpbGUubm1ha2Ugc3RhdGljX2xpYnMgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogaW4gbGliZXZlbnQgMi4wIHRoZXJlIGlzIG5vIG5tYWtlIHN1YmRpcmVjdG9yeSBpbiBXSU4zMi1Db2RlLCBidXQgaW4gMi4xIHRoZXJlIGlzCitta2RpciBsaWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSAqLmxpYiBsaWJcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgICAgICAgICB8fCBtb3ZlIFdJTjMyLUNvZGVcbm1ha2VcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcIHx8IEVYSVQgL0IKK21vdmUgKi5oIGluY2x1ZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDU2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBQQUNLQUdFPXpsaWItJVpMSUJfVkVSU0lPTiUKK1NFVCBCVUlMRERJUj0lV0lOM1AlXHpsaWItYnVpbGQKK1NFVCBJTlNURElSPSVXSU4zUCVcemxpYi1pbnN0CitTRVQgU1JDRElSPSVXSU4zUCVcJVBBQ0tBR0UlCitTRVQgVVJMRklMRT0lUEFDS0FHRSUudGFyLmd6CisKKzo6IFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIHdoZW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhcmNoaXZlZAorU0VUIFVSTD1odHRwOi8vemxpYi5uZXQvJVVSTEZJTEUlCitTRVQgRlVSTD1odHRwOi8vemxpYi5uZXQvZm9zc2lscy8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJUZVUkwlIgorICAgICkKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVGVVJMJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgKQorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEdlbmVyYXRlCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY21ha2UgIiVTUkNESVIlIiBeCisgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiIF4KKyAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEJ1aWxkCitubWFrZSAvZk1ha2VmaWxlIGluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiVCVUlMRERJUiVcemxpYmQucGRiIiAiJUlOU1RESVIlXGJpblwiICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QXBhY2hlJTIwVGhyaWZ0CisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICAgICAgICAgICAgX18gICAgICAgICBfX19fX19fXyAgICAgICBfIF9fX19fCitFQ0hPICAgLyBfIHwgX19fICBfX18gX19fX18vIC8gIF9fXyAgIC9fICBfXy8gLyAgX19fXyhfKSBfLyAvXworRUNITyAgLyBfXyB8LyBfIFwvIF8gYC8gX18vIF8gXC8gLV8pICAgLyAvIC8gXyBcLyBfXy8gLyBfLyBfXy8KK0VDSE8gL18vIHxfLyAuX18vXF8sXy9cX18vXy8vXy9cX18vICAgL18vIC9fLy9fL18vIC9fL18vIFxfXy8KK0VDSE8gICAgICAvXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QnVpbGQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgIF8gX18gICBfXworRUNITyAgIC8gXyApX18gX18oXykgL19fLyAvCitFQ0hPICAvIF8gIC8gLy8gLyAvIC8gXyAgLyAgICAgQEBAIEJVSUxECitFQ0hPIC9fX19fL1xfLF8vXy9fL1xfLF8vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUluc3RhbGwKKworRUNITy8KK0VDSE8gICAgX19fXyAgICAgICAgIF9fICAgICAgIF9fX18KK0VDSE8gICAvICBfL19fICBfX18gLyAvX19fXyBfLyAvIC8KK0VDSE8gIF8vIC8vIF8gXChfLV48LyBfXy8gXyBcLyAvIC8gICAgIEBAQCBJTlNUQUxMCitFQ0hPIC9fX18vXy8vXy9fX18vXF9fL1xfLF8vXy9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1UZXN0CisKK0VDSE8vCitFQ0hPICBfX19fX18gICAgICAgIF9fCitFQ0hPIC9fICBfXy9fXyBfX18gLyAvXworRUNITyAgLyAvIC8gLV9efF8tXjwvIF9fLyAgICAgQEBAIFRFU1QKK0VDSE8gL18vICBcX18vX19fL1xfXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIGdjYyAgID0gTWluR1cgLyBNU1lTMiBhbmQgZ2NjIHRvb2xjaGFpbgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE0MSA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgU0VUIENPTVBJTEVSPWdjYworKSBFTFNFICgKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEwMCkKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzExMCkKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEyMCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQwKQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDEpCispCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzM2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0CkBAIC0wLDAgKzEsMTIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKKworSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEyIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEzIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTIuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE1IiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE3IiAoCisgIENBTEwgOlNFVFVQTkVXRVJNU1ZDICAgIHx8IEVYSVQgL0IKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTUlOR1ciICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIkNZR1dJTiIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSAoCisgIEVDSE8gVW5zdXBwb3J0ZWQgUFJPRklMRT0lUFJPRklMRSUgb3IgUExBVEZPUk09JVBMQVRGT1JNJQorICBFWElUIC9CIDEKKykKKworQ0FMTCBjbF9zZXRjb21waWxlci5iYXQgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGdlbmVyYXRvci5iYXQgIHx8IEVYSVQgL0IKKworU0VUIEFQUFZFWU9SX1NDUklQVFM9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3IKK1NFVCBCVUlMRERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIElOU1RESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBTUkNESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKworOjogUExBVEZPUk0gaXMgeDY0IG9yIHg4NgorOjogTk9STV9QTEFURk9STSBpcyA2NCBvciAzMgorU0VUIE5PUk1fUExBVEZPUk09JVBMQVRGT1JNOn4tMiwyJQorSUYgIiVOT1JNX1BMQVRGT1JNJSIgPT0gIjg2IiAoU0VUIE5PUk1fUExBVEZPUk09MzIpCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKworICA6OiBGaW5kQm9vc3QgbmVlZHMgZm9yd2FyZCBzbGFzaGVzIHNvIGNtYWtlIGRvZXNuJ3Qgc2VlIHNvbWV0aGluZyBhcyBhbiBlc2NhcGVkIGNoYXJhY3RlcgorICBTRVQgQk9PU1RfUk9PVD1DOi9MaWJyYXJpZXMvYm9vc3RfJUJPT1NUX1ZFUlNJT046Lj1fJQorICBTRVQgQk9PU1RfTElCUkFSWURJUj0hQk9PU1RfUk9PVCEvbGliJU5PUk1fUExBVEZPUk0lLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4lQ09NUElMRVI6fi0xLDElCisgIFNFVCBPUEVOU1NMX1JPT1Q9QzpcT3BlblNTTC1XaW4lTk9STV9QTEFURk9STSUKKyAgU0VUIFdJTjNQPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXHRoaXJkcGFydHkKKworICBTRVQgVEhSRUFETU9ERUw9U1RECisKKyAgSUYgIiVQWVRIT05fVkVSU0lPTiUiID09ICIiICgKKyAgICBTRVQgV0lUSF9QWVRIT049T0ZGCisgICkgRUxTRSAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9OCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBQVEVYVD0teDY0CisgICAgU0VUIFBBVEg9QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCFcc2NyaXB0cztDOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUITshUEFUSCEKKyAgKQorICBJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgSUYgTk9UICIlUVRfVkVSU0lPTiUiID09ICIiICgKKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFFURVhUPV82NAorICAgIFNFVCBQQVRIPUM6XFF0XCVRVF9WRVJTSU9OJVwlUFJPRklMRSUhUVRFWFQhXGJpbjshUEFUSCEKKyAgKQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorCisgIDo6IFBMQVRGT1JNID0geDg2IG1lYW5zIE1JTkdXUExBVCBpNjg2CisgIDo6IFBMQVRGT1JNID0geDY0IG1lYW5zIE1JTkdXUExBVCB4ODZfNjQKKyAgU0VUIE1JTkdXUExBVD14ODZfNjQKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4ODYiIChTRVQgTUlOR1dQTEFUPWk2ODYpCisKKyAgU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaC5leGUKKyAgIUJBU0ghIC1sYyAic2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzMyXC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIHNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3c2NFwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBlY2hvICdleHBvcnQgUEFUSD0vbWluZ3clTk9STV9QTEFURk9STSUvYmluOiRQQVRIJyA+PiB+Ly5iYXNoX3Byb2ZpbGUiIHx8IEVYSVQgL0IKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSPS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2MhU1JDRElSOn4yIQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorCisgIFNFVCBDWUdXSU5ST09UPUM6XGN5Z3dpbgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBDWUdXSU5ST09UPSFDWUdXSU5ST09UITY0KQorCisgIFNFVCBCQVNIPSFDWUdXSU5ST09UIVxiaW5cYmFzaC5leGUKKyAgU0VUIFNFVFVQPSFDWUdXSU5ST09UIVxzZXR1cC14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgU0VUVVA9IVNFVFVQIV82NCkKKyAgU0VUIFNFVFVQPSFTRVRVUCEuZXhlCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vY3lnZHJpdmUvYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUl9DWUc9L2N5Z2RyaXZlL2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vY3lnZHJpdmUvYyFTUkNESVI6fjIhCisKKykKKworR09UTyA6RU9GCisKKzpTRVRVUE5FV0VSTVNWQworICBGT1IgL0YgIlVTRUJBQ0tRIFRPS0VOUz0qIiAlJWkgSU4gKGBjYWxsICIlUHJvZ3JhbUZpbGVzKHg4NiklXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXEluc3RhbGxlclx2c3doZXJlLmV4ZSIgLXZlcnNpb24gIlsxNS4wLDE2LjApIiAtcHJvcGVydHkgaW5zdGFsbGF0aW9uUGF0aGApIERPICgKKyAgICBJRiAiJU1TVkNST09UJSIgPT0gIiIgKFNFVCBNU1ZDUk9PVD0lJWkpCisgICkKKyAgU0VUIE1TVkNQTEFUPXg4NgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBNU1ZDUExBVD1hbWQ2NCkKKworICBTRVQgQ1VSUkVOVERJUj0lQ0QlCisgIENBTEwgIiFNU1ZDUk9PVCFcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQiIC1hcmNoPSFNU1ZDUExBVCEgfHwgRVhJVCAvQgorICBDRCAlQ1VSUkVOVERJUiUKKyAgRVhJVCAvQgorCis6RU9GCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI2ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluIGFuZCB0aGVuCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjogIE1pbkdXIE1ha2VmaWxlcyAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNaW5HVworOjogIE1TWVMgTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNU1lTCis6OiAgVW5peCBNYWtlZmlsZXMgICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIENZR1dJTgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKKworSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorICBTRVQgR0VORVJBVE9SPU1pbkdXIE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorICBTRVQgR0VORVJBVE9SPVVuaXggTWFrZWZpbGVzCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1lTIiAoCisgIFNFVCBHRU5FUkFUT1I9TVNZUyBNYWtlZmlsZXMKKykgRUxTRSAoCisgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgR0VOQVJDSD0gV2luNjQKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEyIDIwMTMhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTQgMjAxNSFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNSAyMDE3IUdFTkFSQ0ghCispCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElIiA+IG51bAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBhNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworRUNITy8KK0VDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorRUNITyBWZXJzaW9ucworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIGJvb3N0ICAgICAgICAgICAgICAgICA9ICVCT09TVF9WRVJTSU9OJQorRUNITyBsaWJldmVudCAgICAgICAgICAgICAgPSAlTElCRVZFTlRfVkVSU0lPTiUKK0VDSE8gcHl0aG9uICAgICAgICAgICAgICAgID0gJVBZVEhPTl9WRVJTSU9OJQorRUNITyBxdCAgICAgICAgICAgICAgICAgICAgPSAlUVRfVkVSU0lPTiUKK0VDSE8gemxpYiAgICAgICAgICAgICAgICAgID0gJVpMSUJfVkVSU0lPTiUKK0VDSE8vCispCitFQ0hPIEFwcHZleW9yIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX0JVSUxEX0ZPTERFUiA9ICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitFQ0hPIENPTkZJR1VSQVRJT04gICAgICAgICA9ICVDT05GSUdVUkFUSU9OJQorRUNITyBQTEFURk9STSAgICAgICAgICAgICAgPSAlUExBVEZPUk0lCitFQ0hPIFBST0ZJTEUgICAgICAgICAgICAgICA9ICVQUk9GSUxFJQorRUNITy8KK0VDSE8gT3VyIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX1NDUklQVFMgICAgICA9ICVBUFBWRVlPUl9TQ1JJUFRTJQorRUNITyBCQVNIICAgICAgICAgICAgICAgICAgPSAlQkFTSCUKK0VDSE8gQk9PU1RfUk9PVCAgICAgICAgICAgID0gJUJPT1NUX1JPT1QlCitFQ0hPIEJPT1NUX0lOQ0xVREVESVIgICAgICA9ICVCT09TVF9JTkNMVURFRElSJQorRUNITyBCT09TVF9MSUJSQVJZRElSICAgICAgPSAlQk9PU1RfTElCUkFSWURJUiUKK0VDSE8gQlVJTERESVIgICAgICAgICAgICAgID0gJUJVSUxERElSJQorRUNITyBDT01QSUxFUiAgICAgICAgICAgICAgPSAlQ09NUElMRVIlCitFQ0hPIEdFTkVSQVRPUiAgICAgICAgICAgICA9ICVHRU5FUkFUT1IlCitFQ0hPIElOU1RESVIgICAgICAgICAgICAgICA9ICVJTlNURElSJQorRUNITyBKQVZBX0hPTUUgICAgICAgICAgICAgPSAlSkFWQV9IT01FJQorRUNITyBPUEVOU1NMX1JPT1QgICAgICAgICAgPSAlT1BFTlNTTF9ST09UJQorRUNITyBTRVRVUCAgICAgICAgICAgICAgICAgPSAlU0VUVVAlCitFQ0hPIFNSQ0RJUiAgICAgICAgICAgICAgICA9ICVTUkNESVIlCitFQ0hPIFdJTjNQICAgICAgICAgICAgICAgICA9ICVXSU4zUCUKK0VDSE8gV0lUSF9QWVRIT04gICAgICAgICAgID0gJVdJVEhfUFlUSE9OJQorRUNITyBaTElCX1NUQVRJQ19TVUZGSVggICAgPSAlWkxJQl9TVEFUSUNfU1VGRklYJQorSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgRUNITy8KKyAgRUNITyBVTklYeSBQQVRICisgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAlQkFTSCUgLWxjICJlY2hvICRQQVRIIgorKQorRUNITy8KK0VDSE8gV2luZG93cyBQQVRICitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gJVBBVEglCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3NGY0MAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL3NpbXVsYXRlLWFwcHZleW9yLmJhdApAQCAtMCwwICsxLDM1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogSGVscHMgYnVpbGQgdGhyaWZ0IGJ5IHByZXRlbmRpbmcgdG8gYmUgYXBwdmV5b3IKKzo6IFVzYWdlOgorOjogICBjZCBidWlsZFxhcHB2ZXlvcgorOjogICBzaW11bGF0ZS1hcHB2ZXlvci5iYXQgW0RlYnVnfFJlbGVhc2VdIFt4ODZ8eDY0XSBbQ1lHV0lOfE1JTkdXfE1TVkMyMDE/XQorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBBUFBWRVlPUl9CVUlMRF9GT0xERVI9JX5kcDAuLlwuLgorU0VUIENPTkZJR1VSQVRJT049JTEKK1NFVCBQTEFURk9STT0lMgorU0VUIFBST0ZJTEU9JTMKKworQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0ICAgfHwgRVhJVCAvQgorQ0QgJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKK0NBTEwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItdGVzdC5iYXQKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlIGIvYnVpbGQvY21ha2UvQ1BhY2tDb25maWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0NQYWNrQ29uZmlnLmNtYWtlCkBAIC0wLDAgKzEsNjggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyNUT0RPOiBTaG91bGQgd2UgYnVuZGxlIHN5c3RlbSBsaWJyYXJpZXMgZm9yIERMTHM/CisjaW5jbHVkZShJbnN0YWxsUmVxdWlyZWRTeXN0ZW1MaWJyYXJpZXMpCisKKyMgRm9yIGhlbHAgdGFrZSBhIGxvb2sgYXQ6CisjIGh0dHA6Ly93d3cuY21ha2Uub3JnL1dpa2kvQ01ha2U6Q1BhY2tDb25maWd1cmF0aW9uCisKKyMjIyBnZW5lcmFsIHNldHRpbmdzCitzZXQoQ1BBQ0tfUEFDS0FHRV9OQU1FICJ0aHJpZnQiKQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTiAiJHtQQUNLQUdFX1ZFUlNJT059IikKK3NldChDUEFDS19QQUNLQUdFX0RFU0NSSVBUSU9OX1NVTU1BUlkgIkFwYWNoZSBUaHJpZnQiKQorc2V0KENQQUNLX1BBQ0tBR0VfREVTQ1JJUFRJT05fRklMRSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1JFQURNRS5tZCIpCitzZXQoQ1BBQ0tfUkVTT1VSQ0VfRklMRV9MSUNFTlNFICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vTElDRU5TRSIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRU5ET1IgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIikKK3NldChDUEFDS19QQUNLQUdFX0NPTlRBQ1QgImRldkB0aHJpZnQuYXBhY2hlLm9yZyIpCitzZXQoQ1BBQ0tfUEFDS0FHRV9JTlNUQUxMX0RJUkVDVE9SWSAiJHtDUEFDS19QQUNLQUdFX05BTUV9IikKK3NldChDUEFDS19TWVNURU1fTkFNRSAiJHtDTUFLRV9TWVNURU1fTkFNRX0iKQorCisjIyMgdmVyc2lvbnMKK3NldChDUEFDS19QQUNLQUdFX1ZFUlNJT05fTUFKT1IgJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0pCitzZXQoQ1BBQ0tfUEFDS0FHRV9WRVJTSU9OX01JTk9SICR7dGhyaWZ0X1ZFUlNJT05fTUlOT1J9KQorc2V0KENQQUNLX1BBQ0tBR0VfVkVSU0lPTl9QQVRDSCAke3RocmlmdF9WRVJTSU9OX1BBVENIfSkKKworIyMjIHNvdXJjZSBnZW5lcmF0b3IKK3NldChDUEFDS19TT1VSQ0VfR0VORVJBVE9SICJUR1oiKQorc2V0KENQQUNLX1NPVVJDRV9JR05PUkVfRklMRVMgIn4kO1suXXN3cCQ7L1suXXN2bi87L1suXWdpdC87LmdpdGlnbm9yZTsvYnVpbGQvO3RhZ3M7Y3Njb3BlLioiKQorc2V0KENQQUNLX1NPVVJDRV9QQUNLQUdFX0ZJTEVfTkFNRSAiJHtDUEFDS19QQUNLQUdFX05BTUV9LSR7Q1BBQ0tfUEFDS0FHRV9WRVJTSU9OfSIpCisKKyMjIyB6aXAgZ2VuZXJhdG9yCitzZXQoQ1BBQ0tfR0VORVJBVE9SICJaSVAiKQorc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgInRocmlmdCIpCisKKworaWYoQ01BS0VfU1lTVEVNX05BTUUgU1RSRVFVQUwgIldpbmRvd3MiKQorICAgIHNldChDUEFDS19HRU5FUkFUT1IgIk5TSVMiKQorICAgIHNldChDUEFDS19OU0lTX0hFTFBfTElOSyAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIikKKyAgICBzZXQoQ1BBQ0tfTlNJU19NRU5VX0xJTktTCisgICAgICAgICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciICJBcGFjaGUgVGhyaWZ0IC0gV2ViIFNpdGUiCisgICAgICAgICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIgIkFwYWNoZSBUaHJpZnQgLSBJc3N1ZXMiKQorICAgIHNldChDUEFDS19OU0lTX0NPTlRBQ1QgJHtDUEFDS19QQUNLQUdFX0NPTlRBQ1R9KQorICAgIHNldChDUEFDS19OU0lTX01PRElGWV9QQVRIICJPTiIpCisgICAgc2V0KENQQUNLX1BBQ0tBR0VfSU5TVEFMTF9ESVJFQ1RPUlkgIiR7Q1BBQ0tfUEFDS0FHRV9OQU1FfSIpCitlbHNlKCkKKyAgICBzZXQoQ1BBQ0tfR0VORVJBVE9SICJERUIiICkKKyAgICBzZXQoQ1BBQ0tfREVCSUFOX1BBQ0tBR0VfTUFJTlRBSU5FUiAke0NQQUNLX1BBQ0tBR0VfQ09OVEFDVH0pCitlbmRpZigpCisKKworaW5jbHVkZShDUGFjaykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdiZmUwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCkBAIC0wLDAgKzEsNzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCitpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQoraW5jbHVkZShDaGVja1N5bWJvbEV4aXN0cykKKworaWYgKEludHR5cGVzX0ZPVU5EKQorICAjIFRoaXMgYWxsb3dzIHRoZSBpbnR0eXBlcy5oIGFuZCBzdGRpbnQuaCBjaGVja3MgdG8gc3VjY2VlZCBvbiBwbGF0Zm9ybXMgdGhhdAorICAjIGRvIG5vdCBuYXRpdmVseSBwcm92aWRlIHRoZXJlLgorICBzZXQgKENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKK2VuZGlmICgpCisKK2NoZWNrX2luY2x1ZGVfZmlsZShhcnBhL2luZXQuaCBIQVZFX0FSUEFfSU5FVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGZjbnRsLmggSEFWRV9GQ05UTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKGdldG9wdC5oIEhBVkVfR0VUT1BUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoaW50dHlwZXMuaCBIQVZFX0lOVFRZUEVTX0gpCitjaGVja19pbmNsdWRlX2ZpbGUobmV0ZGIuaCBIQVZFX05FVERCX0gpCitjaGVja19pbmNsdWRlX2ZpbGUobmV0aW5ldC9pbi5oIEhBVkVfTkVUSU5FVF9JTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNpZ25hbC5oIEhBVkVfU0lHTkFMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RkaW50LmggSEFWRV9TVERJTlRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZSh1bmlzdGQuaCBIQVZFX1VOSVNURF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHB0aHJlYWQuaCBIQVZFX1BUSFJFQURfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvaW9jdGwuaCBIQVZFX1NZU19JT0NUTF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9wYXJhbS5oIEhBVkVfU1lTX1BBUkFNX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3Jlc291cmNlLmggSEFWRV9TWVNfUkVTT1VSQ0VfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvc29ja2V0LmggSEFWRV9TWVNfU09DS0VUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3N0YXQuaCBIQVZFX1NZU19TVEFUX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3RpbWUuaCBIQVZFX1NZU19USU1FX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3VuLmggSEFWRV9TWVNfVU5fSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShwb2xsLmggSEFWRV9QT0xMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BvbGwuaCBIQVZFX1NZU19QT0xMX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3NlbGVjdC5oIEhBVkVfU1lTX1NFTEVDVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHNjaGVkLmggSEFWRV9TQ0hFRF9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN0cmluZy5oIEhBVkVfU1RSSU5HX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5ncy5oIEhBVkVfU1RSSU5HU19IKQorCitjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZSBIQVZFX0dFVEhPU1RCWU5BTUUpCitjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdGJ5bmFtZV9yIEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHN0cmVycm9yX3IgSEFWRV9TVFJFUlJPUl9SKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNjaGVkX2dldF9wcmlvcml0eV9tYXggSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUFYKQorY2hlY2tfZnVuY3Rpb25fZXhpc3RzKHNjaGVkX2dldF9wcmlvcml0eV9taW4gSEFWRV9TQ0hFRF9HRVRfUFJJT1JJVFlfTUlOKQorCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQoraW5jbHVkZShDaGVja0NYWFNvdXJjZUNvbXBpbGVzKQorCitjaGVja19jeHhfc291cmNlX2NvbXBpbGVzKAorICAiCisgICNpbmNsdWRlIDxzdHJpbmcuaD4KKyAgaW50IG1haW4oKXtjaGFyIGI7Y2hhciAqYSA9IHN0cmVycm9yX3IoMCwgJmIsIDApOyByZXR1cm4oMCk7fQorICAiCisgIFNUUkVSUk9SX1JfQ0hBUl9QKQorCisKK3NldChQQUNLQUdFICR7UEFDS0FHRV9OQU1FfSkKK3NldChQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX05BTUV9ICR7UEFDS0FHRV9WRVJTSU9OfSIpCitzZXQoVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSkKKworIyBnZW5lcmF0ZSBhIGNvbmZpZy5oIGZpbGUKK2NvbmZpZ3VyZV9maWxlKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UvY29uZmlnLmguaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L2NvbmZpZy5oIikKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjU1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCkBAIC0wLDAgKzEsOTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgQWx3YXlzIGluY2x1ZGUgc3JjZGlyIGFuZCBidWlsZGRpciBpbiBpbmNsdWRlIHBhdGgKKyMgVGhpcyBzYXZlcyB0eXBpbmcgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUll9IGluCisjIGFib3V0IGV2ZXJ5IHN1YmRpcgorIyBzaW5jZSBjbWFrZSAyLjQuMAorc2V0KENNQUtFX0lOQ0xVREVfQ1VSUkVOVF9ESVIgT04pCisKKyMgUHV0IHRoZSBpbmNsdWRlIGRpcnMgd2hpY2ggYXJlIGluIHRoZSBzb3VyY2Ugb3IgYnVpbGQgdHJlZQorIyBiZWZvcmUgYWxsIG90aGVyIGluY2x1ZGUgZGlycywgc28gdGhlIGhlYWRlcnMgaW4gdGhlIHNvdXJjZXMKKyMgYXJlIHByZWZlcnJlZCBvdmVyIHRoZSBhbHJlYWR5IGluc3RhbGxlZCBvbmVzCisjIHNpbmNlIGNtYWtlIDIuNC4xCitzZXQoQ01BS0VfSU5DTFVERV9ESVJFQ1RPUklFU19QUk9KRUNUX0JFRk9SRSBPTikKKworIyBVc2UgY29sb3JlZCBvdXRwdXQKKyMgc2luY2UgY21ha2UgMi40LjAKK3NldChDTUFLRV9DT0xPUl9NQUtFRklMRSBPTikKKworIyBEZWZpbmUgdGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgbGlicmFyaWVzIGhlcmUKK3NldChHRU5FUklDX0xJQl9WRVJTSU9OICIxLjAuMCIpCitzZXQoR0VORVJJQ19MSUJfU09WRVJTSU9OICIwIikKKworIyBTZXQgdGhlIGRlZmF1bHQgYnVpbGQgdHlwZSB0byByZWxlYXNlIHdpdGggZGVidWcgaW5mbworaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICBzZXQoQ01BS0VfQlVJTERfVFlQRSBSZWxXaXRoRGViSW5mbworICAgIENBQ0hFIFNUUklORworICAgICAgIkNob29zZSB0aGUgdHlwZSBvZiBidWlsZCwgb3B0aW9ucyBhcmU6IE5vbmUgRGVidWcgUmVsZWFzZSBSZWxXaXRoRGViSW5mbyBNaW5TaXplUmVsLiIKKyAgKQorZW5kaWYgKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorCisjIENyZWF0ZSB0aGUgY29tcGlsZSBjb21tYW5kIGRhdGFiYXNlIGZvciBjbGFuZyBieSBkZWZhdWx0CitzZXQoQ01BS0VfRVhQT1JUX0NPTVBJTEVfQ09NTUFORFMgT04pCisKKyMgUHV0IHRoZSBsaWJyYXJpZXMgYW5kIGJpbmFyaWVzIHRoYXQgZ2V0IGJ1aWx0IGludG8gZGlyZWN0b3JpZXMgYXQgdGhlCisjIHRvcCBvZiB0aGUgYnVpbGQgdHJlZSByYXRoZXIgdGhhbiBpbiBoYXJkLXRvLWZpbmQgbGVhZgorIyBkaXJlY3Rvcmllcy4gVGhpcyBzaW1wbGlmaWVzIG1hbnVhbCB0ZXN0aW5nIGFuZCB0aGUgdXNlIG9mIHRoZSBidWlsZAorIyB0cmVlIHJhdGhlciB0aGFuIGluc3RhbGxlZCB0aHJpZnQgbGlicmFyaWVzLgorc2V0KENNQUtFX0xJQlJBUllfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0JJTkFSWV9ESVJ9L2xpYikKK3NldChDTUFLRV9BUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9CSU5BUllfRElSfS9saWIpCitzZXQoQ01BS0VfUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQklOQVJZX0RJUn0vYmluKQorCisjCisjICJycGF0aCIgc3VwcG9ydC4KKyMgU2VlIGh0dHA6Ly93d3cuaXRrLm9yZy9XaWtpL2luZGV4LnBocD90aXRsZT1DTWFrZV9SUEFUSF9oYW5kbGluZworIworIyBPbiBNYWNPU1gsIGZvciBzaGFyZWQgbGlicmFyaWVzLCBlbmFibGUgcnBhdGggc3VwcG9ydC4KK3NldChDTUFLRV9NQUNPU1hfUlBBVEggVFJVRSkKKyMKKyMgT24gYW55IE9TLCBmb3IgZXhlY3V0YWJsZXMsIGFsbG93IGxpbmtpbmcgd2l0aCBzaGFyZWQgbGlicmFyaWVzIGluIG5vbi1zeXN0ZW0KKyMgbG9jYXRpb25zIGFuZCBydW5uaW5nIHRoZSBleGVjdXRhYmxlcyB3aXRob3V0IExEX1BSRUxPQUQgb3Igc2ltaWxhci4KKyMgVGhpcyByZXF1aXJlcyB0aGUgbGlicmFyeSB0byBiZSBidWlsdCB3aXRoIHJwYXRoIHN1cHBvcnQuCitzZXQoQ01BS0VfSU5TVEFMTF9SUEFUSF9VU0VfTElOS19QQVRIIFRSVUUpCisKKyMKKyMgQysrIExhbmd1YWdlIExldmVsIERlZmF1bHRzIC0gdGhpcyBkZXBlbmRzIG9uIHRoZSBjb21waWxlciBjYXBhYmlsaXRpZXMKKyMKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfU1RBTkRBUkQpCisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkQgMTEpICMgQysrMTEKKyAgbWVzc2FnZShTVEFUVVMgIlNldHRpbmcgQysrMTEgYXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2UgbGV2ZWwuIikKKyAgbWVzc2FnZShTVEFUVVMgIlRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgQysrIGxhbmd1YWdlIGxldmVsLCBzZXQgQ01BS0VfQ1hYX1NUQU5EQVJEIikKK2VuZGlmKCkKKworaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCA5OCkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAib25seSBDKysxMSBvciBhYm92ZSBDKysgc3RhbmRhcmQgaXMgc3VwcG9ydGVkIikKK2Vsc2VpZiAoQ01BS0VfQ1hYX1NUQU5EQVJEIEVRVUFMIDExKQorICAjIHNob3VsZCBub3QgZmFsbGJhY2sgdG8gQysrOTgKKyAgc2V0KENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCBPTikKK2VuZGlmKCkKKworaWYgKE5PVCBERUZJTkVEIENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzZXQoQ01BS0VfQ1hYX0VYVEVOU0lPTlMgT0ZGKSAgICAgICAgIyB1c2Ugc3RhbmRhcmRzIGNvbXBsaWFudCBsYW5ndWFnZSBsZXZlbCBmb3IgcG9ydGFiaWxpdHkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lSW5zdGFsbGF0aW9uUGF0aHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZjBmNgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZUluc3RhbGxhdGlvblBhdGhzLmNtYWtlCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgRGVmaW5lIHRoZSBkZWZhdWx0IGluc3RhbGwgcGF0aHMKK3NldChCSU5fSU5TVEFMTF9ESVIgImJpbiIgQ0FDSEUgUEFUSCAiVGhlIGJpbmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogYmluKSIpCitzZXQoTElCX0lOU1RBTExfRElSICJsaWIke0xJQl9TVUZGSVh9IiBDQUNIRSBQQVRIICJUaGUgbGlicmFyeSBpbnN0YWxsIGRpciAoZGVmYXVsdDogbGliJHtMSUJfU1VGRklYfSkiKQorc2V0KElOQ0xVREVfSU5TVEFMTF9ESVIgImluY2x1ZGUiIENBQ0hFIFBBVEggIlRoZSBsaWJyYXJ5IGluc3RhbGwgZGlyIChkZWZhdWx0OiBpbmNsdWRlKSIpCitzZXQoQ01BS0VfSU5TVEFMTF9ESVIgImNtYWtlIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgY21ha2UgY29uZmlnIGZpbGVzIChkZWZhdWx0OiBjbWFrZSkiKQorc2V0KERPQ19JTlNUQUxMX0RJUiAic2hhcmUvZG9jIiBDQUNIRSBQQVRIICJUaGUgc3ViZGlyZWN0b3J5IHRvIGluc3RhbGwgZG9jdW1lbnRhdGlvbiBmaWxlcyAoZGVmYXVsdDogc2hhcmUvZG9jKSIpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZmNTNjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDIwNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworaW5jbHVkZShDTWFrZURlcGVuZGVudE9wdGlvbikKKworc2V0KFRIUklGVF9DT01QSUxFUiAiIiBDQUNIRSBGSUxFUEFUSCAiRXh0ZXJuYWwgVGhyaWZ0IGNvbXBpbGVyIHRvIHVzZSBkdXJpbmcgYnVpbGQiKQorCisjIEFkZGl0aW9uYWwgY29tcG9uZW50cworb3B0aW9uKEJVSUxEX0NPTVBJTEVSICJCdWlsZCBUaHJpZnQgY29tcGlsZXIiIE9OKQorCitpZihCVUlMRF9DT01QSUxFUiBPUiBFWElTVFMgJHtUSFJJRlRfQ09NUElMRVJ9KQorICAgIHNldChIQVZFX0NPTVBJTEVSIE9OKQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9URVNUSU5HICJCdWlsZCB3aXRoIHVuaXQgdGVzdHMiIE9OICJIQVZFX0NPTVBJTEVSIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0VYQU1QTEVTICJCdWlsZCBleGFtcGxlcyIgT04gIkhBVkVfQ09NUElMRVIiIE9GRikKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfVFVUT1JJQUxTICJCdWlsZCBUaHJpZnQgdHV0b3JpYWxzIiBPTiAiSEFWRV9DT01QSUxFUiIgT0ZGKQorb3B0aW9uKEJVSUxEX0xJQlJBUklFUyAiQnVpbGQgVGhyaWZ0IGxpYnJhcmllcyIgT04pCisKKyMgTGlicmFyaWVzIHRvIGJ1aWxkCisKKyMgRWFjaCBsYW5ndWFnZSBsaWJyYXJ5IGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHVzaW5nIHRoZSBXSVRIXzxMQU5HPiBmbGFnLgorIyBCeSBkZWZhdWx0IENNYWtlIGNoZWNrcyBpZiB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciBhIGxhbmd1YWdlIGFyZSBwcmVzZW50CisjIGFuZCBlbmFibGVzIHRoZSBsaWJyYXJ5IGlmIGFsbCBhcmUgZm91bmQuIFRoaXMgbWVhbnMgdGhlIGRlZmF1bHQgaXMgdG8gYnVpbGQgYXMKKyMgbXVjaCBhcyBwb3NzaWJsZSBidXQgbGVhdmluZyBvdXQgbGlicmFyaWVzIGlmIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgbm90IG1ldC4KKworb3B0aW9uKFdJVEhfQk9PU1RfU1RBVElDICJCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnkiIE9GRikKK3NldChCb29zdF9VU0VfU1RBVElDX0xJQlMgJHtXSVRIX0JPT1NUX1NUQVRJQ30pCitpZiAoTk9UIFdJVEhfQk9PU1RfU1RBVElDKQorICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX0FMTF9EWU5fTElOSykKKyAgICBhZGRfZGVmaW5pdGlvbnMoLURCT09TVF9URVNUX0RZTl9MSU5LKQorZW5kaWYoKQorCisjIEMrKworb3B0aW9uKFdJVEhfQ1BQICJCdWlsZCBDKysgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoV0lUSF9DUFApCisgICAgZmluZF9wYWNrYWdlKEJvb3N0IDEuNTMgUVVJRVQpCisgICAgIyBOT1RFOiBDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBDKysgc3BlY2lmaWMsCisgICAgIyBidXQgaW4gZnV0dXJlIG90aGVyIGxpYnJhcmllcyBtaWdodCByZXVzZSB0aGVtLgorICAgICMgU28gdGhleSBhcmUgbm90IGRlcGVuZGVudCBvbiBXSVRIX0NQUCBidXQgc2V0dGluZyB0aGVtIHdpdGhvdXQgV0lUSF9DUFAgY3VycmVudGx5CisgICAgIyBoYXMgbm8gZWZmZWN0LgorICAgIGlmKFpMSUJfTElCUkFSWSkKKyAgICAgICAgIyBGaW5kWkxJQi5jbWFrZSBkb2VzIG5vdCBub3JtYWxpemUgcGF0aCBzbyB3ZSBuZWVkIHRvIGRvIGl0IG91cnNlbHZlcy4KKyAgICAgICAgZmlsZShUT19DTUFLRV9QQVRIICR7WkxJQl9MSUJSQVJZfSBaTElCX0xJQlJBUlkpCisgICAgZW5kaWYoKQorICAgIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9aTElCICJCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJaTElCX0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFFVSUVUKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9MSUJFVkVOVCAiQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpYmV2ZW50X0ZPVU5EIiBPRkYpCisgICAgZmluZF9wYWNrYWdlKFF0NCBRVUlFVCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1FUNCAiQnVpbGQgd2l0aCBRdDQgc3VwcG9ydCIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJRVDRfRk9VTkQiIE9GRikKKyAgICBmaW5kX3BhY2thZ2UoUXQ1IFFVSUVUIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQorICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9RVDUgIkJ1aWxkIHdpdGggUXQ1IHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXQ1X0ZPVU5EIiBPRkYpCisgICAgaWYoJHtXSVRIX1FUNH0gQU5EICR7V0lUSF9RVDV9IEFORCAke0NNQUtFX01BSk9SX1ZFUlNJT059IExFU1MgMykKKyAgICAgICMgY21ha2UgPCAzLjAuMCBjYXVzZXMgY29uZmxpY3Qgd2hlbiBidWlsZGluZyBib3RoIFF0NCBhbmQgUXQ1CisgICAgICBzZXQoV0lUSF9RVDQgT0ZGKQorICAgIGVuZGlmKCkKKyAgICBmaW5kX3BhY2thZ2UoT3BlblNTTCBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfT1BFTlNTTCAiQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiT1BFTlNTTF9GT1VORCIgT0ZGKQorICAgIG9wdGlvbihXSVRIX1NURFRIUkVBRFMgIkJ1aWxkIHdpdGggQysrIHN0ZDo6dGhyZWFkIHN1cHBvcnQiIE9OKQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DUFAgIkJ1aWxkIEMrKyBsaWJyYXJ5IiBPTgorICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfQ1BQO0Jvb3N0X0ZPVU5EIiBPRkYpCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUExVR0lOICJCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydCIgT0ZGCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9DT01QSUxFUjtCVUlMRF9DUFAiIE9GRikKKworIyBDIEdMaWIKK29wdGlvbihXSVRIX0NfR0xJQiAiQnVpbGQgQyAoR0xpYikgVGhyaWZ0IGxpYnJhcnkiIE9OKQoraWYoV0lUSF9DX0dMSUIpCisgICAgZmluZF9wYWNrYWdlKEdMSUIgUVVJRVQgQ09NUE9ORU5UUyBnb2JqZWN0KQorZW5kaWYoKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9DX0dMSUIgIkJ1aWxkIEMgKEdMaWIpIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9DX0dMSUI7R0xJQl9GT1VORCIgT0ZGKQorCitpZihCVUlMRF9DUFApCisgICAgc2V0KGJvb3N0X2NvbXBvbmVudHMpCisgICAgaWYoQlVJTERfVEVTVElORykKKyAgICAgICAgbGlzdChBUFBFTkQgYm9vc3RfY29tcG9uZW50cyBzeXN0ZW0gdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBsaXN0KEFQUEVORCBib29zdF9jb21wb25lbnRzIHVuaXRfdGVzdF9mcmFtZXdvcmsgZmlsZXN5c3RlbSBjaHJvbm8gcHJvZ3JhbV9vcHRpb25zKQorICAgIGVuZGlmKCkKKyAgICBpZihib29zdF9jb21wb25lbnRzKQorICAgICAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBSRVFVSVJFRCBDT01QT05FTlRTICR7Ym9vc3RfY29tcG9uZW50c30pCisgICAgZW5kaWYoKQorZWxzZWlmKEJVSUxEX0NfR0xJQiBBTkQgQlVJTERfVEVTVElORykKKyAgICBmaW5kX3BhY2thZ2UoQm9vc3QgMS41MyBSRVFVSVJFRCkKK2VuZGlmKCkKKworIyBKYXZhCitvcHRpb24oV0lUSF9KQVZBICJCdWlsZCBKYXZhIFRocmlmdCBsaWJyYXJ5IiBPTikKK2lmKEFORFJPSUQpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZSBRVUlFVCkKKyAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0dSQURMRV9GT1VORCIgT0ZGKQorZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZXcgUVVJRVQpCisgICAgZmluZF9wYWNrYWdlKEphdmEgUVVJRVQpCisgICAgQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9KQVZBICJCdWlsZCBKYXZhIGxpYnJhcnkiIE9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtKQVZBX0ZPVU5EO0dSQURMRVdfRk9VTkQiIE9GRikKK2VuZGlmKCkKKworIyBQeXRob24KK29wdGlvbihXSVRIX1BZVEhPTiAiQnVpbGQgUHl0aG9uIFRocmlmdCBsaWJyYXJ5IiBPTikKK2ZpbmRfcGFja2FnZShQeXRob25JbnRlcnAgUVVJRVQpICMgZm9yIFB5dGhvbiBleGVjdXRhYmxlCitmaW5kX3BhY2thZ2UoUHl0aG9uTGlicyBRVUlFVCkgIyBmb3IgUHl0aG9uLmgKK0NNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfUFlUSE9OICJCdWlsZCBQeXRob24gbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX1BZVEhPTjtQWVRIT05MSUJTX0ZPVU5EIiBPRkYpCisKKyMgSGFza2VsbAorb3B0aW9uKFdJVEhfSEFTS0VMTCAiQnVpbGQgSGFza2VsbCBUaHJpZnQgbGlicmFyeSIgT04pCitmaW5kX3BhY2thZ2UoR0hDIFFVSUVUKQorZmluZF9wYWNrYWdlKENhYmFsIFFVSUVUKQorQ01BS0VfREVQRU5ERU5UX09QVElPTihCVUlMRF9IQVNLRUxMICJCdWlsZCBHSEMgbGlicmFyeSIgT04KKyAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0hBU0tFTEw7R0hDX0ZPVU5EO0NBQkFMX0ZPVU5EIiBPRkYpCisKKyMgQ29tbW9uIGxpYnJhcnkgb3B0aW9ucworb3B0aW9uKFdJVEhfU0hBUkVEX0xJQiAiQnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgT04pCitvcHRpb24oV0lUSF9TVEFUSUNfTElCICJCdWlsZCBzdGF0aWMgbGlicmFyaWVzIiBPTikKK2lmIChOT1QgV0lUSF9TSEFSRURfTElCIEFORCBOT1QgV0lUSF9TVEFUSUNfTElCKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNhbm5vdCBidWlsZCB3aXRoIGJvdGggc2hhcmVkIGFuZCBzdGF0aWMgb3V0cHV0cyBkaXNhYmxlZCEiKQorZW5kaWYoKQorCisjTk9URTogQysrIGNvbXBpbGVyIG9wdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGxpYi9jcHAvQ01ha2VMaXN0cy50eHQKKworIyBWaXN1YWwgU3R1ZGlvIG9ubHkgb3B0aW9ucworaWYoTVNWQykKK29wdGlvbihXSVRIX01UICJCdWlsZCB1c2luZyBNVCBpbnN0ZWFkIG9mIE1EIChNU1ZDIG9ubHkpIiBPRkYpCitlbmRpZihNU1ZDKQorCittYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCitpZihOT1QgJHtmbGFnfSkKKyAgbWVzc2FnZShTVEFUVVMgIiAgIC0gJHtzdW1tYXJ5fSIpCitlbmRpZigpCitlbmRtYWNybyhNRVNTQUdFX0RFUCBmbGFnIHN1bW1hcnkpCisKK21hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQorbWVzc2FnZShTVEFUVVMgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKQorbWVzc2FnZShTVEFUVVMgIlRocmlmdCB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RocmlmdF9WRVJTSU9OfSAoJHt0aHJpZnRfVkVSU0lPTl9NQUpPUn0uJHt0aHJpZnRfVkVSU0lPTl9NSU5PUn0uJHt0aHJpZnRfVkVSU0lPTl9QQVRDSH0pIikKK21lc3NhZ2UoU1RBVFVTICJUaHJpZnQgcGFja2FnZSB2ZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJHtQQUNLQUdFX1ZFUlNJT059IikKK21lc3NhZ2UoU1RBVFVTICJCdWlsZCBjb25maWd1cmF0aW9uIFN1bW1hcnkiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgVGhyaWZ0IGNvbXBpbGVyOiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NPTVBJTEVSfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydDogICAgICAgICAgICAgICR7V0lUSF9QTFVHSU59IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggdW5pdCB0ZXN0czogICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9URVNUSU5HfSIpCitNRVNTQUdFX0RFUChIQVZFX0NPTVBJTEVSICJEaXNhYmxlZCBiZWNhdXNlIEJVSUxEX1RIUklGVD1PRkYgYW5kIG5vIHZhbGlkIFRIUklGVF9DT01QSUxFUiBpcyBnaXZlbiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBleGFtcGxlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfRVhBTVBMRVN9IikKK01FU1NBR0VfREVQKEhBVkVfQ09NUElMRVIgIkRpc2FibGVkIGJlY2F1c2UgQlVJTERfVEhSSUZUPU9GRiBhbmQgbm8gdmFsaWQgVEhSSUZUX0NPTVBJTEVSIGlzIGdpdmVuIikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIFRocmlmdCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9MSUJSQVJJRVN9IikKK21lc3NhZ2UoU1RBVFVTICIgTGFuZ3VhZ2UgbGlicmFyaWVzOiIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDKysgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ1BQfSIpCitNRVNTQUdFX0RFUChXSVRIX0NQUCAiRGlzYWJsZWQgYnkgV0lUSF9DUFA9T0ZGIikKK01FU1NBR0VfREVQKEJvb3N0X0ZPVU5EICJCb29zdCBoZWFkZXJzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgICBDKysgTGFuZ3VhZ2UgTGV2ZWw6ICAgICAgICAgICAgICAgICAgICAgICAke0NYWF9MQU5HVUFHRV9MRVZFTH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQyAoR0xpYikgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NfR0xJQn0iKQorTUVTU0FHRV9ERVAoV0lUSF9DX0dMSUIgIkRpc2FibGVkIGJ5IFdJVEhfQ19HTElCPU9GRiIpCitNRVNTQUdFX0RFUChHTElCX0ZPVU5EICJHTGliIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSmF2YSBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0pBVkF9IikKK01FU1NBR0VfREVQKFdJVEhfSkFWQSAiRGlzYWJsZWQgYnkgV0lUSF9KQVZBPU9GRiIpCitpZihBTkRST0lEKQorICAgIE1FU1NBR0VfREVQKEdSQURMRV9GT1VORCAiR3JhZGxlIG1pc3NpbmciKQorZWxzZSgpCisgICAgTUVTU0FHRV9ERVAoSkFWQV9GT1VORCAiSmF2YSBSdW50aW1lIG1pc3NpbmciKQorICAgIE1FU1NBR0VfREVQKEdSQURMRVdfRk9VTkQgIkdyYWRsZSBXcmFwcGVyIG1pc3NpbmciKQorZW5kaWYoKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgUHl0aG9uIGxpYnJhcnk6ICAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX1BZVEhPTn0iKQorTUVTU0FHRV9ERVAoV0lUSF9QWVRIT04gIkRpc2FibGVkIGJ5IFdJVEhfUFlUSE9OPU9GRiIpCitNRVNTQUdFX0RFUChQWVRIT05MSUJTX0ZPVU5EICJQeXRob24gbGlicmFyaWVzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgSGFza2VsbCBsaWJyYXJ5OiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0hBU0tFTEx9IikKK01FU1NBR0VfREVQKFdJVEhfSEFTS0VMTCAiRGlzYWJsZWQgYnkgV0lUSF9IQVNLRUxMPU9GRiIpCitNRVNTQUdFX0RFUChHSENfRk9VTkQgIkdIQyBtaXNzaW5nIikKK01FU1NBR0VfREVQKENBQkFMX0ZPVU5EICJDYWJhbCBtaXNzaW5nIikKK21lc3NhZ2UoU1RBVFVTICIgTGlicmFyeSBmZWF0dXJlczoiKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc2hhcmVkIGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke1dJVEhfU0hBUkVEX0xJQn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgc3RhdGljIGxpYnJhcmllczogICAgICAgICAgICAgICAgICAgICAke1dJVEhfU1RBVElDX0xJQn0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBCb29zdCBzdGF0aWMgbGluayBsaWJyYXJ5OiAgICAgICAke1dJVEhfQk9PU1RfU1RBVElDfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0OiAgICAgICAgICR7V0lUSF9TVERUSFJFQURTfSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIGxpYmV2ZW50IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICR7V0lUSF9MSUJFVkVOVH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBPcGVuU1NMIHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAke1dJVEhfT1BFTlNTTH0iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDQgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ0fSIpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFF0NSBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgICR7V0lUSF9RVDV9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1pMSUJ9IikKK21lc3NhZ2UoU1RBVFVTICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikKK2VuZG1hY3JvKFBSSU5UX0NPTkZJR19TVU1NQVJZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTEyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKQEAgLTAsMCArMSwxMTggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFVuY29tbWVudCB0aGlzIHRvIHNob3cgc29tZSBiYXNpYyBjbWFrZSB2YXJpYWJsZXMgYWJvdXQgcGxhdGZvcm1zCisjIGluY2x1ZGUgKE5ld1BsYXRmb3JtRGVidWcpCisKKyMgVmlzdWFsIFN0dWRpbyBzcGVjaWZpYyBvcHRpb25zCitpZihNU1ZDKQorICAgICNGb3IgdmlzdWFsIHN0dWRpbyB0aGUgbGlicmFyeSBuYW1pbmcgaXMgYXMgZm9sbG93aW5nOgorICAgICMgRHluYW1pYyBsaWJyYXJpZXM6CisgICAgIyAgLSB0aHJpZnQuZGxsICBmb3IgcmVsZWFzZSBsaWJyYXJ5CisgICAgIyAgLSB0aHJpZnRkLmRsbCBmb3IgZGVidWcgbGlicmFyeQorICAgICMKKyAgICAjIFN0YXRpYyBsaWJyYXJpZXM6CisgICAgIyAgLSB0aHJpZnRtZC5saWIgZm9yIC9NRCByZWxlYXNlIGJ1aWxkCisgICAgIyAgLSB0aHJpZnRtdC5saWIgZm9yIC9NVCByZWxlYXNlIGJ1aWxkCisgICAgIworICAgICMgIC0gdGhyaWZ0bWRkLmxpYiBmb3IgL01EIGRlYnVnIGJ1aWxkCisgICAgIyAgLSB0aHJpZnRtdGQubGliIGZvciAvTVQgZGVidWcgYnVpbGQKKyAgICAjCisgICAgIyB0aGUgc2FtZSBob2xkcyBmb3Igb3RoZXIgbGlicmFyaWVzIGxpa2UgbGlidGhyaWZ0eiBldGMuCisKKyAgICAjIEZvciBEZWJ1ZyBidWlsZCB0eXBlcywgYXBwZW5kIGEgImQiIHRvIHRoZSBsaWJyYXJ5IG5hbWVzLgorICAgIHNldChDTUFLRV9ERUJVR19QT1NURklYICJkIiBDQUNIRSBTVFJJTkcgIlNldCBkZWJ1ZyBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxFQVNFX1BPU1RGSVggIiIgQ0FDSEUgU1RSSU5HICJTZXQgcmVsZWFzZSBsaWJyYXJ5IHBvc3RmaXgiIEZPUkNFKQorICAgIHNldChDTUFLRV9SRUxXSVRIREVCSU5GT19QT1NURklYICIiIENBQ0hFIFNUUklORyAiU2V0IHJlbGVhc2UgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKworICAgICMgQnVpbGQgdXNpbmcgL01UIG9wdGlvbiBpbnN0ZWFkIG9mIC9NRCBpZiB0aGUgV0lUSF9NVCBvcHRpb25zIGlzIHNldAorICAgIGlmKFdJVEhfTVQpCisgICAgICAgIHNldChDb21waWxlckZsYWdzCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX0RFQlVHCisgICAgICAgICAgICAgICAgQ01BS0VfQ1hYX0ZMQUdTX1JFTEVBU0UKKyAgICAgICAgICAgICAgICBDTUFLRV9DWFhfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgICAgICBDTUFLRV9DX0ZMQUdTCisgICAgICAgICAgICAgICAgQ01BS0VfQ19GTEFHU19ERUJVRworICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMRUFTRQorICAgICAgICAgICAgICAgIENNQUtFX0NfRkxBR1NfUkVMV0lUSERFQklORk8KKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZvcmVhY2goQ29tcGlsZXJGbGFnICR7Q29tcGlsZXJGbGFnc30pCisgICAgICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi9NVCIgJHtDb21waWxlckZsYWd9ICIkeyR7Q29tcGlsZXJGbGFnfX0iKQorICAgICAgICBlbmRmb3JlYWNoKCkKKyAgICAgICAgc2V0KFNUQVRJQ19QT1NURklYICJtdCIgQ0FDSEUgU1RSSU5HICJTZXQgc3RhdGljIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisgICAgZWxzZShXSVRIX01UKQorICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm1kIiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKKyAgICBlbmRpZihXSVRIX01UKQorCisgICAgIyBEaXNhYmxlIGJvb3N0IGF1dG8gbGlua2luZyBwcmFnbWFzIC0gY21ha2UgaW5jbHVkZXMgdGhlIHJpZ2h0IGZpbGVzCisgICAgYWRkX2RlZmluaXRpb25zKCItREJPT1NUX0FMTF9OT19MSUIiKQorCisgICAgIyBXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IGtub3cgaG93IHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSB5ZXQKKyAgICAjIGFzIHRoZXJlIGFyZSBubyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgb3IgZXhwb3J0cyBmaWxlcyBpbiB0aGUgcHJvamVjdC4KKyAgICBpZiAoV0lUSF9TSEFSRURfTElCKQorICAgICAgbWVzc2FnZSAoRkFUQUxfRVJST1IgIldpbmRvd3MgYnVpbGQgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyeSBvdXRwdXQgeWV0LCBwbGVhc2Ugc2V0IC1EV0lUSF9TSEFSRURfTElCPW9mZiIpCisgICAgZW5kaWYoKQorCisgICAgYWRkX2RlZmluaXRpb25zKCIvTVAiKSAjIHBhcmFsbGVsIGJ1aWxkCisgICAgYWRkX2RlZmluaXRpb25zKCIvVzMiKSAjIHdhcm5pbmcgbGV2ZWwgMworCisgICAgIyBWUzIwMTAgZG9lcyBub3QgcHJvdmlkZSBpbnR0eXBlcyB3aGljaCB3ZSBuZWVkIGZvciAiUFJJZDY0IiB1c2VkIGluIG1hbnkgcGxhY2VzCisgICAgZmluZF9wYWNrYWdlKEludHR5cGVzKQorICAgIGlmIChJbnR0eXBlc19GT1VORCkKKyAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtJTlRUWVBFU19JTkNMVURFX0RJUlN9KQorICAgICAgIyBPcGVuU1NMIGNvbmZsaWN0cyB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIFBSSWQ2NCB1bmxlc3MgaXQgaXMgZGVmaW5lZCBmaXJzdAorICAgICAgYWRkX2RlZmluaXRpb25zKCIvRklpbnR0eXBlcy5oIikKKyAgICBlbmRpZiAoKQorZWxzZWlmKFVOSVgpCisgIGZpbmRfcHJvZ3JhbSggTUVNT1JZQ0hFQ0tfQ09NTUFORCB2YWxncmluZCApCisgIHNldCggTUVNT1JZQ0hFQ0tfQ09NTUFORF9PUFRJT05TICItLWdlbi1zdXBwcmVzc2lvbnM9YWxsIC0tbGVhay1jaGVjaz1mdWxsIiApCisgIHNldCggTUVNT1JZQ0hFQ0tfU1VQUFJFU1NJT05TX0ZJTEUgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzIiApCitlbmRpZigpCisKK2FkZF9kZWZpbml0aW9ucygiLURfX1NURENfRk9STUFUX01BQ1JPUyIpCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0xJTUlUX01BQ1JPUyIpCisKKyMgV0lUSF8qVEhSRUFEUyBzZWxlY3RzIHdoaWNoIHRocmVhZGluZyBsaWJyYXJ5IHRvIHVzZQoraWYoV0lUSF9TVERUSFJFQURTKQorICBhZGRfZGVmaW5pdGlvbnMoIi1EVVNFX1NURF9USFJFQUQ9MSIpCitlbmRpZigpCisKKyMgQysrIExhbmd1YWdlIExldmVsCitzZXQoQ1hYX0xBTkdVQUdFX0xFVkVMICJDKyske0NNQUtFX0NYWF9TVEFOREFSRH0iKQoraWYgKENNQUtFX0NYWF9TVEFOREFSRF9SRVFVSVJFRCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbY29tcGlsZXIgbXVzdCBzdXBwb3J0IGl0XSIpCitlbHNlKCkKKyAgc3RyaW5nKENPTkNBVCBDWFhfTEFOR1VBR0VfTEVWRUwgIiR7Q1hYX0xBTkdVQUdFX0xFVkVMfSBbZmFsbGJhY2sgdG8gZWFybGllciBpZiBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGl0XSIpCitlbmRpZigpCitpZiAoQ01BS0VfQ1hYX0VYVEVOU0lPTlMpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW3dpdGggY29tcGlsZXItc3BlY2lmaWMgZXh0ZW5zaW9uc10iKQorZW5kaWYoKQorCitpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkNsYW5nIikKKyAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciIpCitlbmRpZigpCisKKyMgQnVpbGRpbmcgV0lUSF9QTFVHSU4gcmVxdWlyZXMgYm9vc3QgbWVtb3J5IG9wZXJhdGlvbnMsIGZvciBub3csIGFuZCBnY2MgPj0gNC44CitpZiAoV0lUSF9QTFVHSU4pCisgIGlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiR05VIiBBTkQgQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTICI0LjgiKQorICAgIG1lc3NhZ2UoU0VORF9FUlJPUiAiVGhyaWZ0IGNvbXBpbGVyIHBsdWctaW4gc3VwcG9ydCBpcyBub3QgcG9zc2libGUgd2l0aCBvbGRlciBnY2MgKCA8IDQuOCApIGNvbXBpbGVyIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kQW50LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAzNzFkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEFudC5jbWFrZQpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCisjICBBTlRfRk9VTkQgLSBzeXN0ZW0gaGFzIEFudAorIyAgQW50X0VYRUNVVEFCTEUgLSB0aGUgQW50IGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEFOVF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oQW50X0VYRUNVVEFCTEUgTkFNRVMgYW50IFBBVEhTICRFTlZ7QU5UX0hPTUV9L2JpbikKK2ZpbmRfcGFja2FnZV9oYW5kbGVfc3RhbmRhcmRfYXJncyhBbnQgREVGQVVMVF9NU0cgQW50X0VYRUNVVEFCTEUpCittYXJrX2FzX2FkdmFuY2VkKEFudF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZENhYmFsLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDMzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kQ2FiYWwuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgQ2FiYWxfRk9VTkQgLSBzeXN0ZW0gaGFzIENhYmFsCisjICBDYWJhbCAtIHRoZSBDYWJhbCBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDQUJBTF9IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oQ0FCQUwgTkFNRVMgY2FiYWwgUEFUSFMgJEVOVntIT01FfS8uY2FiYWwvYmluICRFTlZ7Q0FCQUxfSE9NRX0vYmluKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKENBQkFMIERFRkFVTFRfTVNHIENBQkFMKQorbWFya19hc19hZHZhbmNlZChDQUJBTCkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHSEMuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzM4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kR0hDLmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdIQ19GT1VORCAtIHN5c3RlbSBoYXMgR0hDCisjICBHSEMgLSB0aGUgR0hDIGV4ZWN1dGFibGUKKyMgIFJVTl9IQVNLRUxMX0ZPVU5EIC0gc3lzdGVtIGhhcyBydW5oYXNrZWxsCisjICBSVU5fSEFTS0VMTCAtIHRoZSBydW5oYXNrZWxsIGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEdIQ19IT01FIGlmIGl0IGlzIHNldAorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oR0hDIE5BTUVTIGdoYyBQQVRIUyAkRU5We0dIQ19IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR0hDIERFRkFVTFRfTVNHIEdIQykKK21hcmtfYXNfYWR2YW5jZWQoR0hDKQorCitmaW5kX3Byb2dyYW0oUlVOX0hBU0tFTEwgTkFNRVMgcnVuaGFza2VsbCBQQVRIUyAkRU5We0dIQ19IT01FfS9iaW4pCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoUlVOX0hBU0tFTEwgREVGQVVMVF9NU0cgUlVOX0hBU0tFTEwpCittYXJrX2FzX2FkdmFuY2VkKFJVTl9IQVNLRUxMKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR0xJQi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JlNDMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdMSUIuY21ha2UKQEAgLTAsMCArMSwxMjIgQEAKKyMgLSBUcnkgdG8gZmluZCBHbGliIGFuZCBpdHMgY29tcG9uZW50cyAoZ2lvLCBnb2JqZWN0IGV0YykKKyMgT25jZSBkb25lLCB0aGlzIHdpbGwgZGVmaW5lCisjCisjICBHTElCX0ZPVU5EIC0gc3lzdGVtIGhhcyBHbGliCisjICBHTElCX0lOQ0xVREVfRElSUyAtIHRoZSBHbGliIGluY2x1ZGUgZGlyZWN0b3JpZXMKKyMgIEdMSUJfTElCUkFSSUVTIC0gbGluayB0aGVzZSB0byB1c2UgR2xpYgorIworIyBPcHRpb25hbGx5LCB0aGUgQ09NUE9ORU5UUyBrZXl3b3JkIGNhbiBiZSBwYXNzZWQgdG8gZmluZF9wYWNrYWdlKCkKKyMgYW5kIEdsaWIgY29tcG9uZW50cyBjYW4gYmUgbG9va2VkIGZvci4gIEN1cnJlbnRseSwgdGhlIGZvbGxvd2luZworIyBjb21wb25lbnRzIGNhbiBiZSB1c2VkLCBhbmQgdGhleSBkZWZpbmUgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgaWYKKyMgZm91bmQ6CisjCisjICBnaW86ICAgICAgICAgICAgIEdMSUJfR0lPX0xJQlJBUklFUworIyAgZ29iamVjdDogICAgICAgICBHTElCX0dPQkpFQ1RfTElCUkFSSUVTCisjICBnbW9kdWxlOiAgICAgICAgIEdMSUJfR01PRFVMRV9MSUJSQVJJRVMKKyMgIGd0aHJlYWQ6ICAgICAgICAgR0xJQl9HVEhSRUFEX0xJQlJBUklFUworIworIyBOb3RlIHRoYXQgdGhlIHJlc3BlY3RpdmUgX0lOQ0xVREVfRElSIHZhcmlhYmxlcyBhcmUgbm90IHNldCwgc2luY2UKKyMgYWxsIGhlYWRlcnMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBHTElCX0lOQ0xVREVfRElSUy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJhcGhhZWwgS3VibyBkYSBDb3N0YSA8cmFrdWNvQHdlYmtpdC5vcmc+CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTCisjIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyMgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSVRTCisjIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorIyBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisjIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworIyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyMgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyMgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorIyBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworZmluZF9wYWNrYWdlKFBrZ0NvbmZpZykKK3BrZ19jaGVja19tb2R1bGVzKFBDX0dMSUIgUVVJRVQgZ2xpYi0yLjApCisKK2ZpbmRfbGlicmFyeShHTElCX0xJQlJBUklFUworICAgIE5BTUVTIGdsaWItMi4wCisgICAgSElOVFMgJHtQQ19HTElCX0xJQkRJUn0KKyAgICAgICAgICAke1BDX0dMSUJfTElCUkFSWV9ESVJTfQorKQorCisjIEZpbGVzIGluIGdsaWIncyBtYWluIGluY2x1ZGUgcGF0aCBtYXkgaW5jbHVkZSBnbGliY29uZmlnLmgsIHdoaWNoLAorIyBmb3Igc29tZSBvZGQgcmVhc29uLCBpcyBub3JtYWxseSBpbiAkTElCRElSL2dsaWItMi4wL2luY2x1ZGUuCitnZXRfZmlsZW5hbWVfY29tcG9uZW50KF9HTElCX0xJQlJBUllfRElSICR7R0xJQl9MSUJSQVJJRVN9IFBBVEgpCitmaW5kX3BhdGgoR0xJQkNPTkZJR19JTkNMVURFX0RJUgorICAgIE5BTUVTIGdsaWJjb25maWcuaAorICAgIEhJTlRTICR7UENfTElCRElSfSAke1BDX0xJQlJBUllfRElSU30gJHtfR0xJQl9MSUJSQVJZX0RJUn0KKyAgICAgICAgICAke1BDX0dMSUJfSU5DTFVERURJUn0gJHtQQ19HTElCX0lOQ0xVREVfRElSU30KKyAgICBQQVRIX1NVRkZJWEVTIGdsaWItMi4wL2luY2x1ZGUKKykKKworZmluZF9wYXRoKEdMSUJfSU5DTFVERV9ESVIKKyAgICBOQU1FUyBnbGliLmgKKyAgICBISU5UUyAke1BDX0dMSUJfSU5DTFVERURJUn0KKyAgICAgICAgICAke1BDX0dMSUJfSU5DTFVERV9ESVJTfQorICAgIFBBVEhfU1VGRklYRVMgZ2xpYi0yLjAKKykKKworc2V0KEdMSUJfSU5DTFVERV9ESVJTICR7R0xJQl9JTkNMVURFX0RJUn0gJHtHTElCQ09ORklHX0lOQ0xVREVfRElSfSkKKworaWYoR0xJQkNPTkZJR19JTkNMVURFX0RJUikKKyAgICAjIFZlcnNpb24gZGV0ZWN0aW9uCisgICAgZmlsZShSRUFEICIke0dMSUJDT05GSUdfSU5DTFVERV9ESVJ9L2dsaWJjb25maWcuaCIgR0xJQkNPTkZJR19IX0NPTlRFTlRTKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiI2RlZmluZSBHTElCX01BSk9SX1ZFUlNJT04gKFswLTldKykiIF9kdW1teSAiJHtHTElCQ09ORklHX0hfQ09OVEVOVFN9IikKKyAgICBzZXQoR0xJQl9WRVJTSU9OX01BSk9SICIke0NNQUtFX01BVENIXzF9IikKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgR0xJQl9NSU5PUl9WRVJTSU9OIChbMC05XSspIiBfZHVtbXkgIiR7R0xJQkNPTkZJR19IX0NPTlRFTlRTfSIpCisgICAgc2V0KEdMSUJfVkVSU0lPTl9NSU5PUiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgICAgc3RyaW5nKFJFR0VYIE1BVENIICIjZGVmaW5lIEdMSUJfTUlDUk9fVkVSU0lPTiAoWzAtOV0rKSIgX2R1bW15ICIke0dMSUJDT05GSUdfSF9DT05URU5UU30iKQorICAgIHNldChHTElCX1ZFUlNJT05fTUlDUk8gIiR7Q01BS0VfTUFUQ0hfMX0iKQorICAgIHNldChHTElCX1ZFUlNJT04gIiR7R0xJQl9WRVJTSU9OX01BSk9SfS4ke0dMSUJfVkVSU0lPTl9NSU5PUn0uJHtHTElCX1ZFUlNJT05fTUlDUk99IikKK2VuZGlmKCkKKworIyBBZGRpdGlvbmFsIEdsaWIgY29tcG9uZW50cy4gIFdlIG9ubHkgbG9vayBmb3IgbGlicmFyaWVzLCBhcyBub3QgYWxsIG9mIHRoZW0KKyMgaGF2ZSBjb3JyZXNwb25kaW5nIGhlYWRlcnMgYW5kIGFsbCBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgYWxvbmdzaWRlIHRoZSBtYWluCisjIGdsaWIgb25lcy4KK2ZvcmVhY2ggKF9jb21wb25lbnQgJHtHTElCX0ZJTkRfQ09NUE9ORU5UU30pCisgICAgaWYgKCR7X2NvbXBvbmVudH0gU1RSRVFVQUwgImdpbyIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dJT19MSUJSQVJJRVMgTkFNRVMgZ2lvLTIuMCBISU5UUyAke19HTElCX0xJQlJBUllfRElSfSkKKyAgICAgICAgc2V0KEFERElUSU9OQUxfUkVRVUlSRURfVkFSUyAke0FERElUSU9OQUxfUkVRVUlSRURfVkFSU30gR0xJQl9HSU9fTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ29iamVjdCIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dPQkpFQ1RfTElCUkFSSUVTIE5BTUVTIGdvYmplY3QtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dPQkpFQ1RfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ21vZHVsZSIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dNT0RVTEVfTElCUkFSSUVTIE5BTUVTIGdtb2R1bGUtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dNT0RVTEVfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ3RocmVhZCIpCisgICAgICAgIGZpbmRfbGlicmFyeShHTElCX0dUSFJFQURfTElCUkFSSUVTIE5BTUVTIGd0aHJlYWQtMi4wIEhJTlRTICR7X0dMSUJfTElCUkFSWV9ESVJ9KQorICAgICAgICBzZXQoQURESVRJT05BTF9SRVFVSVJFRF9WQVJTICR7QURESVRJT05BTF9SRVFVSVJFRF9WQVJTfSBHTElCX0dUSFJFQURfTElCUkFSSUVTKQorICAgIGVsc2VpZiAoJHtfY29tcG9uZW50fSBTVFJFUVVBTCAiZ2lvLXVuaXgiKQorICAgICAgICAjIGdpby11bml4IGlzIGNvbXBpbGVkIGFzIHBhcnQgb2YgdGhlIGdpbyBsaWJyYXJ5LCBidXQgdGhlIGluY2x1ZGUgcGF0aHMKKyAgICAgICAgIyBhcmUgc2VwYXJhdGUgZnJvbSB0aGUgc2hhcmVkIGdsaWIgb25lcy4gU2luY2UgdGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkCisgICAgICAgICMgYnkgV2ViS2l0R1RLKyB3ZSBkb24ndCBnbyB0byBleHRyYW9yZGluYXJ5IG1lYXN1cmVzIGJleW9uZCBwa2ctY29uZmlnLgorICAgICAgICBwa2dfY2hlY2tfbW9kdWxlcyhHSU9fVU5JWCBRVUlFVCBnaW8tdW5peC0yLjApCisgICAgZW5kaWYgKCkKK2VuZGZvcmVhY2ggKCkKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKK0ZJTkRfUEFDS0FHRV9IQU5ETEVfU1RBTkRBUkRfQVJHUyhHTElCIFJFUVVJUkVEX1ZBUlMgR0xJQl9JTkNMVURFX0RJUlMgR0xJQl9MSUJSQVJJRVMgJHtBRERJVElPTkFMX1JFUVVJUkVEX1ZBUlN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTSU9OX1ZBUiAgIEdMSUJfVkVSU0lPTikKKworbWFya19hc19hZHZhbmNlZCgKKyAgICBHTElCQ09ORklHX0lOQ0xVREVfRElSCisgICAgR0xJQl9HSU9fTElCUkFSSUVTCisgICAgR0xJQl9HSU9fVU5JWF9MSUJSQVJJRVMKKyAgICBHTElCX0dNT0RVTEVfTElCUkFSSUVTCisgICAgR0xJQl9HT0JKRUNUX0xJQlJBUklFUworICAgIEdMSUJfR1RIUkVBRF9MSUJSQVJJRVMKKyAgICBHTElCX0lOQ0xVREVfRElSCisgICAgR0xJQl9JTkNMVURFX0RJUlMKKyAgICBHTElCX0xJQlJBUklFUworKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdyYWRsZS5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGUuY21ha2UKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgR1JBRExFX0ZPVU5EIC0gc3lzdGVtIGhhcyBHcmFkbGUKKyMgIEdSQURMRV9FWEVDVVRBQkxFIC0gdGhlIEdyYWRsZSBleGVjdXRhYmxlCisjCisjIEl0IHdpbGwgc2VhcmNoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBBTlRfSE9NRSBpZiBpdCBpcyBzZXQKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdSQURMRV9FWEVDVVRBQkxFIE5BTUVTIGdyYWRsZSBQQVRIUyAkRU5We0dSQURMRV9IT01FfS9iaW4gTk9fQ01BS0VfRklORF9ST09UX1BBVEgpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR3JhZGxlIERFRkFVTFRfTVNHIEdSQURMRV9FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChHUkFETEVfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiYjk5OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRHcmFkbGV3LmNtYWtlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKKyMgIEdSQURMRVdfRk9VTkQgLSBzeXN0ZW0gaGFzIEdyYWRsZXcKKyMgIEdSQURMRVdfRVhFQ1VUQUJMRSAtIHRoZSBHcmFkbGV3IGV4ZWN1dGFibGUKKyMKKyMgSXQgd2lsbCBzZWFyY2ggdGhlIGxvY2F0aW9uIENNQUtFX1NPVVJDRV9ESVIvbGliL2phdmEKKworaW5jbHVkZShGaW5kUGFja2FnZUhhbmRsZVN0YW5kYXJkQXJncykKKworZmluZF9wcm9ncmFtKEdSQURMRVdfRVhFQ1VUQUJMRSBncmFkbGV3IFBBVEhTICR7Q01BS0VfU09VUkNFX0RJUn0vbGliL2phdmEgTk9fREVGQVVMVF9QQVRIIE5PX0NNQUtFX0ZJTkRfUk9PVF9QQVRIKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKEdyYWRsZXcgREVGQVVMVF9NU0cgR1JBRExFV19FWEVDVVRBQkxFKQorbWFya19hc19hZHZhbmNlZChHUkFETEVXX0VYRUNVVEFCTEUpCisKKyMgQnVnZ3kgZmluZF9wcm9ncmFtIGNhbm5vdCBmaW5kIGdyYWRsZXcuYmF0IHdoZW4gZ3JhZGxldyBpcyBhdCB0aGUgc2FtZSBwYXRoCisjIGFuZCBldmVuIGJ1Z2dpZXIgY3Rlc3Qgd2lsbCBub3QgZXhlY3V0ZSBncmFkbGV3LmJhdCB3aGVuIGdyYWRsZXcgaXMgZ2l2ZW4uCitpZihDTUFLRV9IT1NUX1dJTjMyKQorICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoLitncmFkbGV3KSQiICJcXDEuYmF0IiBHUkFETEVXX0VYRUNVVEFCTEUgJHtHUkFETEVXX0VYRUNVVEFCTEV9KQorZW5kaWYoQ01BS0VfSE9TVF9XSU4zMikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRJbnR0eXBlcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYxZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGZpbmQgbXNpbnR0eXBlcyBvbiBjb21waWxlcnMgdGhhdCBkb24ndCBwcm92aWRlIGl0LCBmb3IgZXhhbXBsZQorIyAgIFZTMjAxMAorCisjIFVzYWdlOiAKKyMgUHJvdmlkZSBJTlRUWVBFU19ST09UIGlmIHlvdSBuZWVkIGl0CisjIFJlc3VsdDogSU5UVFlQRVNfSU5DTFVERV9ESVJTLCB3aGVyZSB0byBmaW5kIGludHR5cGVzLmgKKyMgUmVzdWx0OiBJbnR0eXBlc19GT1VORCwgSWYgZmFsc2UsIGludHR5cGVzLmggd2FzIG5vdCBmb3VuZAorCitmaW5kX3BhdGgoSU5UVFlQRVNfSU5DTFVERV9ESVJTIGludHR5cGVzLmggSElOVFMgJHtJTlRUWVBFU19ST09UfSkKK2lmIChJTlRUWVBFU19JTkNMVURFX0RJUlMpCisgIHNldChJbnR0eXBlc19GT1VORCBUUlVFKQorZWxzZSAoKQorICBzZXQoSW50dHlwZXNfRk9VTkQgRkFMU0UpCisgIGlmIChJbnR0eXBlc19GSU5EX1JFUVVJUkVEKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGludHR5cGVzLmgiKQorICBlbmRpZiAoKQorICBtZXNzYWdlKFNUQVRVUyAiaW50dHlwZXMuaCBOT1QgZm91bmQiKQorZW5kaWYgKCkKKworbWFya19hc19hZHZhbmNlZCgKKyAgSU5UVFlQRVNfSU5DTFVERV9ESVJTCispCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2YTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQpAQCAtMCwwICsxLDQ1IEBACisjIGZpbmQgTGliRXZlbnQKKyMgYW4gZXZlbnQgbm90aWZpY2F0aW9uIGxpYnJhcnkgKGh0dHA6Ly9saWJldmVudC5vcmcvKQorIworIyBVc2FnZTogCisjIExJQkVWRU5UX0lOQ0xVREVfRElSUywgd2hlcmUgdG8gZmluZCBMaWJFdmVudCBoZWFkZXJzCisjIExJQkVWRU5UX0xJQlJBUklFUywgTGliRXZlbnQgbGlicmFyaWVzCisjIExpYmV2ZW50X0ZPVU5ELCBJZiBmYWxzZSwgZG8gbm90IHRyeSB0byB1c2UgbGliZXZlbnQKKworc2V0KExJQkVWRU5UX1JPT1QgQ0FDSEUgUEFUSCAiUm9vdCBkaXJlY3Rvcnkgb2YgbGliZXZlbnQgaW5zdGFsbGF0aW9uIikKK3NldChMaWJFdmVudF9FWFRSQV9QUkVGSVhFUyAvdXNyL2xvY2FsIC9vcHQvbG9jYWwgIiRFTlZ7SE9NRX0iICR7TElCRVZFTlRfUk9PVH0pCitmb3JlYWNoKHByZWZpeCAke0xpYkV2ZW50X0VYVFJBX1BSRUZJWEVTfSkKKyAgbGlzdChBUFBFTkQgTGliRXZlbnRfSU5DTFVERV9QQVRIUyAiJHtwcmVmaXh9L2luY2x1ZGUiKQorICBsaXN0KEFQUEVORCBMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFMgIiR7cHJlZml4fS9saWIiKQorZW5kZm9yZWFjaCgpCisKKyMgTG9va2luZyBmb3IgImV2ZW50LmgiIHdpbGwgZmluZCB0aGUgUGxhdGZvcm0gU0RLIGluY2x1ZGUgZGlyIG9uIHdpbmRvd3MKKyMgc28gd2UgYWxzbyBsb29rIGZvciBhIHBlZXIgaGVhZGVyIGxpa2UgZXZodHRwLmggdG8gZ2V0IHRoZSByaWdodCBwYXRoCitmaW5kX3BhdGgoTElCRVZFTlRfSU5DTFVERV9ESVJTIGV2aHR0cC5oIGV2ZW50LmggUEFUSFMgJHtMaWJFdmVudF9JTkNMVURFX1BBVEhTfSkKKworIyAibGliIiBwcmVmaXggaXMgbmVlZGVkIG9uIFdpbmRvd3MgaW4gc29tZSBjYXNlcworIyBuZXdlciB2ZXJzaW9ucyBvZiBsaWJldmVudCB1c2UgdGhyZWUgbGlicmFyaWVzCitmaW5kX2xpYnJhcnkoTElCRVZFTlRfTElCUkFSSUVTIE5BTUVTIGV2ZW50IGV2ZW50X2NvcmUgZXZlbnRfZXh0cmEgbGliZXZlbnQgUEFUSFMgJHtMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFN9KQorCitpZiAoTElCRVZFTlRfTElCUkFSSUVTIEFORCBMSUJFVkVOVF9JTkNMVURFX0RJUlMpCisgIHNldChMaWJldmVudF9GT1VORCBUUlVFKQorICBzZXQoTElCRVZFTlRfTElCUkFSSUVTICR7TElCRVZFTlRfTElCUkFSSUVTfSkKK2Vsc2UgKCkKKyAgc2V0KExpYmV2ZW50X0ZPVU5EIEZBTFNFKQorZW5kaWYgKCkKKworaWYgKExpYmV2ZW50X0ZPVU5EKQorICBpZiAoTk9UIExpYmV2ZW50X0ZJTkRfUVVJRVRMWSkKKyAgICBtZXNzYWdlKFNUQVRVUyAiRm91bmQgbGliZXZlbnQ6ICR7TElCRVZFTlRfTElCUkFSSUVTfSIpCisgIGVuZGlmICgpCitlbHNlICgpCisgIGlmIChMaWJFdmVudF9GSU5EX1JFUVVJUkVEKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkNvdWxkIE5PVCBmaW5kIGxpYmV2ZW50LiIpCisgIGVuZGlmICgpCisgIG1lc3NhZ2UoU1RBVFVTICJsaWJldmVudCBOT1QgZm91bmQuIikKK2VuZGlmICgpCisKK21hcmtfYXNfYWR2YW5jZWQoCisgICAgTElCRVZFTlRfTElCUkFSSUVTCisgICAgTElCRVZFTlRfSU5DTFVERV9ESVJTCisgICkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL05ld1BsYXRmb3JtRGVidWcuY21ha2UgYi9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNGQzMDIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlCkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIEZvciBkZWJ1Z2dpbmcgbmV3IHBsYXRmb3JtcywganVzdCB0byBzZWUgd2hhdCBzb21lIGVudmlyb25tZW50IGZsYWdzIGFyZS4uLgorIworbWFjcm8oU0hPV0ZMQUcgZmxhZykKKyAgbWVzc2FnZShTVEFUVVMgIiR7ZmxhZ30gPSAkeyR7ZmxhZ319IikKK2VuZG1hY3JvKFNIT1dGTEFHKQorCitzZXQoTkVXUExBVEZPUk1ERUJVRyBPTikKKworaWYoTkVXUExBVEZPUk1ERUJVRykKKyAgU0hPV0ZMQUcoIkFQUExFIikKKyAgU0hPV0ZMQUcoIkJPUkxBTkQiKQorICBTSE9XRkxBRygiQ01BS0VfQ19DT01QSUxFUl9JRCIpCisgIFNIT1dGTEFHKCJDTUFLRV9DWFhfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MiKQorICBTSE9XRkxBRygiQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIikKKyAgU0hPV0ZMQUcoIkNZR1dJTiIpCisgIFNIT1dGTEFHKCJNSU5HVyIpCisgIFNIT1dGTEFHKCJNU1ZDIikKKyAgU0hPV0ZMQUcoIk1TVkNfVkVSU0lPTiIpCisgIFNIT1dGTEFHKCJNU1lTIikKKyAgU0hPV0ZMQUcoIlVOSVgiKQorICBTSE9XRkxBRygiV0FUQ09NIikKKyAgU0hPV0ZMQUcoIldJTjMyIikKK2VuZGlmKE5FV1BMQVRGT1JNREVCVUcpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1JFQURNRS1NU1lTMi5tZApAQCAtMCwwICsxLDYzIEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChNaW5HVzY0L01TWVMyKQorCitUaHJpZnQgdXNlcyBjbWFrZSB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCB0aGUgcHJvamVjdCBvbiBtdWx0aXBsZSBwbGF0Zm9ybXMsIGhvd2V2ZXIgdG8gYnVpbGQgYSBmdWxseSBmdW5jdGlvbmFsIGFuZCBwcm9kdWN0aW9uIHJlYWR5IHRocmlmdCBvbiBXaW5kb3dzIHJlcXVpcmVzIGEgbnVtYmVyIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byBiZSBvYnRhaW5lZC4gIE9uY2UgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFyZSByZWFkeSwgdGhlIHJpZ2h0IGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMgbXVzdCBiZSBwYXNzZWQgdG8gY21ha2UgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQuCisKKz4gTm90ZTogbGliZXZlbnQgYW5kIGxpYmV2ZW50LWRldmVsIGRvIG5vdCB3b3JrIHdpdGggdGhpcyB0b29sY2hhaW4gYXMgdGhleSBkbyBub3QgcHJvcGVybHkgZGV0ZWN0IG1pbmd3NjQgYW5kIGV4cGVjdCBzb21lIGhlYWRlcnMgdG8gZXhpc3QgdGhhdCBkbyBub3QsIHNvIHRoZSBub24tYmxvY2tpbmcgc2VydmVyIGlzIG5vdCBjdXJyZW50bHkgYnVpbHQgaW50byB0aGlzIHNvbHV0aW9uLgorCisjIyBNU1lTMgorCitEb3dubG9hZCBhbmQgZnVsbHkgdXBncmFkZSBtc3lzMiBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBhdDoKKworICAgIGh0dHBzOi8vbXN5czIuZ2l0aHViLmlvLworCitJbnN0YWxsIHRoZSBuZWNlc3NhcnkgdG9vbGNoYWluIGl0ZW1zIGZvciBDKys6CisKKyAgICAkIHBhY21hbiAtLW5lZWRlZCAtUyBiaXNvbiBmbGV4IG1ha2UgbWluZ3ctdzY0LXg4Nl82NC1vcGVuc3NsIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LWJvb3N0IG1pbmd3LXc2NC14ODZfNjQtY21ha2UgXAorICAgICAgICAgICAgICAgIG1pbmd3LXc2NC14ODZfNjQtdG9vbGNoYWluIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCitVcGRhdGUgeW91ciBtc3lzMiBiYXNoIHBhdGggdG8gaW5jbHVkZSAvbWluZ3c2NC9iaW4gYnkgYWRkaW5nIGEgbGluZSB0byB5b3VyIH4vLmJhc2hfcHJvZmlsZXMgdXNpbmcgdGhpcyBjb21tYW5kOgorCisgICAgZWNobyAiZXhwb3J0IFBBVEg9L21pbmd3NjQvYmluOlwkUEFUSCIgPj4gfi8uYmFzaF9wcm9maWxlCisKK0FmdGVyIHRoYXQsIGNsb3NlIHlvdXIgc2hlbGwgYW5kIG9wZW4gYSBuZXcgb25lLgorCitVc2UgY21ha2UgdG8gY3JlYXRlIGEgTWluR1cgbWFrZWZpbGUsIG91dCBvZiB0cmVlIChhc3N1bWVzIHlvdSBhcmUgaW4gdGhlIHRvcCBsZXZlbCBvZiB0aGUgdGhyaWZ0IHNvdXJjZSB0cmVlKToKKworICAgIG1rZGlyIC4uL3RocmlmdC1idWlsZAorICAgIGNkIC4uL3RocmlmdC1idWlsZAorICAgIGNtYWtlIC1HIk1pbkdXIE1ha2VmaWxlcyIgLURDTUFLRV9NQUtFX1BST0dSQU09L21pbmd3NjQvYmluL21pbmd3MzItbWFrZSBcCisgICAgICAgLURDTUFLRV9DX0NPTVBJTEVSPXg4Nl82NC13NjQtbWluZ3czMi1nY2MuZXhlIFwKKyAgICAgICAtRENNQUtFX0NYWF9DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZysrLmV4ZSBcCisgICAgICAgLURXSVRIX0xJQkVWRU5UPU9GRiBcCisgICAgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIC1EV0lUSF9TVEFUSUNfTElCPU9OIFwKKyAgICAgICAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX1BZVEhPTj1PRkYgLURXSVRIX1BFUkw9T0ZGIFwKKyAgICAgICAuLi90aHJpZnQKKworQnVpbGQgdGhyaWZ0IChpbnNpZGUgdGhyaWZ0LWJ1aWxkKToKKworICAgIGNtYWtlIC0tYnVpbGQgLgorCitSdW4gdGhlIHRlc3RzIChpbnNpZGUgdGhyaWZ0LWJ1aWxkKToKKworICAgIGN0ZXN0CisKKz4gSWYgeW91IHJ1biBpbnRvIGlzc3VlcywgY2hlY2sgQXBhY2hlIEppcmEgVEhSSUZULTQwNDYgZm9yIHBhdGNoZXMgcmVsYXRpbmcgdG8gTWluR1c2NC9NU1lTMiBidWlsZHMuCisKKyMjIFRlc3RlZCBXaXRoCisKK21zeXMyIDY0LWJpdCAyMDE2LTEwLTI2IGRpc3RyaWJ1dGlvbgpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzEyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUubWQKQEAgLTAsMCArMSw2MCBAQAorIyBBcGFjaGUgVGhyaWZ0IC0gQ01ha2UgYnVpbGQKKworIyMgR29hbAorRXh0ZW5kIEFwYWNoZSBUaHJpZnQncyAqbWFrZSBjcm9zcyogYXBwcm9hY2ggdG8gdGhlIGJ1aWxkIHN5c3RlbS4KKworRHVlIHRvIGdyb3dpbmcgdGhlIGZpZWxkIG9mIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydCwgYSBwcm9wZXIgZXhlY3V0YWJsZQorYW5kIGxpYnJhcnkgZGV0ZWN0aW9uIG1lY2hhbmlzbSBydW5uaW5nIG9uIGFzIG11Y2ggcGxhdGZvcm1zIGFzIHBvc3NpYmxlCitiZWNvbWVzIHJlcXVpcmVkLiBUaGUgb3RoZXIgYXNwZWN0IHRvIHNpbXBsaWZ5IHRoZSByZWxlYXNlIHByb2Nlc3MgYW5kCitwYWNrYWdlIGdlbmVyYXRpb24gcHJvY2Vzcy4KKworQXMgbmljZSBzaWRlIGJlbmVmaXQgb2YgQ01ha2UgaXMgdGhlIGdlbmVyYXRpb24gb2YgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKK3NwZWNpZmljIHNvdWx0aW9uIGZpbGVzLiA9PiBObyBzb2x1dGlvbiBmaWxlcyB3aXRoaW4gc291cmNlIHRyZWUuCisKKworIyMgVXNhZ2UKK2p1c3QgZG8gdGhpczoKKworICAgIG1rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCisgICAgY21ha2UgLi4KKworaWYgeW91IHVzZSBhIHNwZWNpZmljIHRvb2xjaGFpbiBwYXNzIGl0IHRvIGNtYWtlLCB0aGUgc2FtZSBmb3Igb3B0aW9uczoKKworICAgIGNtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLi4KKyAgICBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmctMy41IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWNsYW5nKystMy41IC4uCisgICAgY21ha2UgLURUSFJJRlRfQ09NUElMRVJfSFM9T0ZGIC4uCisgICAgY21ha2UgLURXSVRIX1pMSUI9T04gLi4KKworb3Igb24gV2luZG93cworCisgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIgXAorICAgIC1EQk9PU1RfUk9PVD1DOi8zcmRwYXJ0eS9ib29zdF8xXzU4XzAgXAorICAgIC1EWkxJQl9ST09UPUM6LzNyZHBhcnR5L3psaWIxMjgtZGxsIFwKKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KKworYW5kIG9wZW4gdGhlIGRldmVsb3BtZW50IGVudmlyb25tZW50IHlvdSBsaWtlIHdpdGggdGhlIHNvbHV0aW9uIG9yIGRvIHRoaXM6CisKKyAgICBtYWtlCisgICAgbWFrZSBjaGVjaworICAgIG1ha2UgY3Jvc3MKKyAgICBtYWtlIGRpc3QKKwordG8gZ2VuZXJhdGUgYW4gaW5zdGFsbGVyIGFuZCBkaXN0cmlidXRpb24gcGFja2FnZSBkbyB0aGlzOgorCisgICAgY3BhY2sKKworIyMgVE9ETworKiBnaXQgaGFzaCBvciB0YWcgYmFzZWQgdmVyc2lvbmluZyBkZXBlbmRpbmcgb24gc291cmNlIHN0YXRlCisqIGJ1aWxkIHR1dG9yaWFsCisqIGJ1aWxkIHRlc3QKKyogd2l0aC93aXRob3V0IGxhbmd1YWdlIGxpYi88bGFuZz4vCisqIGVuYWJsZS9kaXNhYmxlCisqIG1ha2UgY3Jvc3MKKyogbWFrZSBkaXN0IChjcmVhdGUgYW4gYWxpYXMgdG8gbWFrZSBwYWNrYWdlX3NvdXJjZSkKKyogbWFrZSBkb2MKKyogY3BhY2sgKEMrKyBhbmQgbWFrZSBkaXN0IG9ubHkgPykKKyAgKiB0aHJpZnQtY29tcGlsZXIKKyAgKiBsaWJ0aHJpZnQKKyAgKiB0dXRvcmlhbAorICAqIHRlc3QKKyogbWVyZ2UgaW50byAvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UgYi9idWlsZC9jbWFrZS9UaHJpZnRNYWNyb3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzN2Y5NAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL1RocmlmdE1hY3Jvcy5jbWFrZQpAQCAtMCwwICsxLDEwNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworc2V0KENNQUtFX0RFQlVHX1BPU1RGSVggImQiIENBQ0hFIFNUUklORyAiU2V0IGRlYnVnIGxpYnJhcnkgcG9zdGZpeCIgRk9SQ0UpCisKKworbWFjcm8oQUREX0xJQlJBUllfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICBhZGRfbGlicmFyeSgke25hbWV9IFNIQVJFRCAke0FSR059KQorICAgIHNldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMKKyAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfQorICAgICAgICBWRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgIFNPVkVSU0lPTiAke3RocmlmdF9WRVJTSU9OfSApCisgICAgI3NldF90YXJnZXRfcHJvcGVydGllcygke25hbWV9IFBST1BFUlRJRVMgUFVCTElDX0hFQURFUiAiJHt0aHJpZnRjcHBfSEVBREVSU30iKQorICAgIGluc3RhbGwoVEFSR0VUUyAke25hbWV9CisgICAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gIiR7QklOX0lOU1RBTExfRElSfSIKKyAgICAgICAgTElCUkFSWSBERVNUSU5BVElPTiAiJHtMSUJfSU5TVEFMTF9ESVJ9IgorICAgICAgICBBUkNISVZFIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIFBVQkxJQ19IRUFERVIgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0iKQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgYWRkX2xpYnJhcnkoJHtuYW1lfV9zdGF0aWMgU1RBVElDICR7QVJHTn0pCisgICAgc2V0X3RhcmdldF9wcm9wZXJ0aWVzKCR7bmFtZX1fc3RhdGljIFBST1BFUlRJRVMKKyAgICAgICAgT1VUUFVUX05BTUUgJHtuYW1lfSR7U1RBVElDX1BPU1RGSVh9CisgICAgICAgIFZFUlNJT04gJHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgU09WRVJTSU9OICR7dGhyaWZ0X1ZFUlNJT059ICkKKyAgICBpbnN0YWxsKFRBUkdFVFMgJHtuYW1lfV9zdGF0aWMKKyAgICAgICAgUlVOVElNRSBERVNUSU5BVElPTiAiJHtCSU5fSU5TVEFMTF9ESVJ9IgorICAgICAgICBMSUJSQVJZIERFU1RJTkFUSU9OICIke0xJQl9JTlNUQUxMX0RJUn0iCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gIiR7TElCX0lOU1RBTExfRElSfSIKKyAgICAgICAgUFVCTElDX0hFQURFUiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIpCitlbmRpZigpCisKK2VuZG1hY3JvKEFERF9MSUJSQVJZX1RIUklGVCkKKworCittYWNybyhUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQgbmFtZSkKKworaWYoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX0gJHtBUkdOfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9JTkNMVURFX0RJUkVDVE9SSUVTX1RIUklGVCkKKworCittYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUIG5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtuYW1lfSAke0FSR059KQorZW5kaWYoKQorCitpZihXSVRIX1NUQVRJQ19MSUIpCisgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKCR7bmFtZX1fc3RhdGljICR7QVJHTn0pCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQpCisKKworbWFjcm8oTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZIHRhcmdldCBsaWJuYW1lKQorCitpZiAoV0lUSF9TSEFSRURfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfSkKK2Vsc2VpZiAoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH0gJHtsaWJuYW1lfV9zdGF0aWMpCitlbHNlKCkKKyAgICBtZXNzYWdlKEZBVEFMICJOb3QgbGlua2luZyB3aXRoIHNoYXJlZCBvciBzdGF0aWMgbGlicmFyaWVzPyIpCitlbmRpZigpCisKK2VuZG1hY3JvKExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKKworCittYWNybyhUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkgdGFyZ2V0IGxpYm5hbWUpCisKK2lmKFdJVEhfU0hBUkVEX0xJQikKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHt0YXJnZXR9ICR7QVJHTn0gJHtsaWJuYW1lfSkKK2VuZGlmKCkKKworaWYoV0lUSF9TVEFUSUNfTElCKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcygke3RhcmdldH1fc3RhdGljICR7QVJHTn0gJHtsaWJuYW1lfV9zdGF0aWMpCitlbmRpZigpCisKK2VuZG1hY3JvKFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlIGIvYnVpbGQvY21ha2UvYW5kcm9pZC10b29sY2hhaW4uY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmM2QwMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2NtYWtlL2FuZHJvaWQtdG9vbGNoYWluLmNtYWtlCkBAIC0wLDAgKzEsMjYgQEAKK3NldChBTkRST0lEX05ESyAiL29wdC9hbmRyb2lkLW5kayIgQ0FDSEUpCitzZXQoQU5EUk9JRF9QTEFURk9STSAiYW5kcm9pZC0xNSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9BUkNIICJhcmNoLWFybSIgQ0FDSEUpCitzZXQoQU5EUk9JRF9UT09MX0FSQ0ggImFuZHJvaWQtYXJtIiBDQUNIRSkKK3NldChBTkRST0lEX0NQVSAiYXJtZWFiaS12N2EiIENBQ0hFKQorc2V0KEFORFJPSURfR0NDX1ZFUlNJT04gNC45IENBQ0hFKQorc2V0KEhPU1RfQVJDSCBsaW51eC14ODZfNjQgQ0FDSEUpCisKK3NldChDTUFLRV9TWVNURU1fTkFNRSBBbmRyb2lkKQorc2V0KEFORFJPSURfU1lTUk9PVCAiJHtBTkRST0lEX05ES30vcGxhdGZvcm1zLyR7QU5EUk9JRF9QTEFURk9STX0vJHtBTkRST0lEX0FSQ0h9IikKK3NldChBTkRST0lEX1RSSVBMRVQgYXJtLWxpbnV4LWFuZHJvaWRlYWJpKQorc2V0KEFORFJPSURfU1RMICIke0FORFJPSURfTkRLfS9zb3VyY2VzL2N4eC1zdGwvZ251LWxpYnN0ZCsrLyR7QU5EUk9JRF9HQ0NfVkVSU0lPTn0iKQorCitzZXQoX0NPTVBJTEVSX1JPT1QgJHtBTkRST0lEX05ES30vcHJlYnVpbHQvJHtBTkRST0lEX1RSSVBMRVR9LSR7QU5EUk9JRF9HQ0NfVkVSU0lPTn0vcHJlYnVpbHQvJHtIT1NUX0FSQ0h9KQorc2V0KENNQUtFX0NfQ09NUElMRVIgJHtfQ09NUElMRVJfUk9PVH0vYmluLyR7QU5EUk9JRF9UUklQTEVUfS1nY2MpCitzZXQoQ01BS0VfQ1hDWF9DT01QSUxFUiAke19DT01QSUxFUl9ST09UfS9iaW4vJHtBTkRST0lEX1RSSVBMRVR9LWcrKykKKworaW5jbHVkZV9kaXJlY3RvcmllcygKKyAgICAke0FORFJPSURfU1RMfS9pbmNsdWRlCisgICAgJHtBTkRST0lEX1NUTH0vbGlicy8ke0FORFJPSURfQ1BVfS9pbmNsdWRlKQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEggJHtBTkRST0lEX1NZU1JPT1R9KQorCitzZXQoQ01BS0VfRklORF9ST09UX1BBVEhfTU9ERV9QUk9HUkFNIE5FVkVSKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfTElCUkFSWSBPTkxZKQorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfSU5DTFVERSBPTkxZKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvY29uZmlnLmguaW4gYi9idWlsZC9jbWFrZS9jb25maWcuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBhZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvY29uZmlnLmguaW4KQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogY29uZmlnLmggZ2VuZXJhdGVkIGJ5IENNYWtlIGZyb20gY29uZmlnLmguaW4gKi8KKworI2lmbmRlZiBDT05GSUdfSAorI2RlZmluZSBDT05GSUdfSAorCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0UgIiR7UEFDS0FHRX0iCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICIke1BBQ0tBR0VfQlVHUkVQT1JUfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJHtQQUNLQUdFX05BTUV9IgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIke1BBQ0tBR0VfVEFSTkFNRX0iCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9VUkwgIiR7UEFDS0FHRV9VUkx9IgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiR7UEFDS0FHRV9WRVJTSU9OfSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX1NUUklOR30iCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBERUZJTkVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSBpZiB0aGUgQUlfQUREUkNPTkZJRyBzeW1ib2wgaXMgdW5hdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBBSV9BRERSQ09ORklHIDAKKworLyogUG9zc2libGUgdmFsdWUgZm9yIFNJR05FRF9SSUdIVF9TSElGVF9JUyAqLworLyogVE9ETzogVGhpcyBpcyBqdXN0IHNldCB0byAxIGZvciB0aGUgbW9tZW50CisgICBwb3J0IHRoZSBtYWNybyBhY2xvY2FsL2F4X3NpZ25lZF9yaWdodF9zaGlmdC5tNCB0byBDTWFrZSB0byBtYWtlIHRoaXMgd29yayAqLworI2RlZmluZSBBUklUSE1FVElDX1JJR0hUX1NISUZUIDEKKworLyogSW5kaWNhdGVzIHRoZSBlZmZlY3Qgb2YgdGhlIHJpZ2h0IHNoaWZ0IG9wZXJhdG9yIG9uIG5lZ2F0aXZlIHNpZ25lZAorICAgaW50ZWdlcnMgKi8KKy8qIFRPRE86IFRoaXMgaXMganVzdCBzZXQgdG8gMSBmb3IgdGhlIG1vbWVudCAqLworI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQorCisvKiBVc2UgKi5oIGV4dGVuc2lvbiBmb3IgcGFyc2VyIGhlYWRlciBmaWxlICovCisvKiBUT0RPOiBUaGlzIG1pZ2h0IG5vdyBiZSBuZWNlc3NhcnkgYW55bW9yZSBhcyBpdCBpcyBzZXQgb25seSBmb3IgYXV0b21ha2UgPCAxLjExCisgICBzZWU6IGFjbG9jYWwvYWNfcHJvZ19iaXNvbi5tNCAqLworI2NtYWtlZGVmaW5lIEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04gMQorCisvKiByZXBsYWNlcyBQT1NJWCBwdGhyZWFkIGJ5IHN0ZDo6dGhyZWFkICovCisjY21ha2VkZWZpbmUgVVNFX1NURF9USFJFQUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBzdHJlcnJvcl9yIHJldHVybnMgY2hhciAqLiAqLworI2NtYWtlZGVmaW5lIFNUUkVSUk9SX1JfQ0hBUl9QIDEKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogSEVBREVSIEZJTEVTICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXJwYS9pbmV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfQVJQQV9JTkVUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfRkNOVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX05FVERCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvaW4uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9ORVRJTkVUX0lOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NJR05BTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JT0NUTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zb2NrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9QT0xMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1BPTExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NlbGVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19TRUxFQ1RfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzY2hlZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBGVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWUnIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfR0VUSE9TVEJZTkFNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0aG9zdGJ5bmFtZV9yJyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dFVEhPU1RCWU5BTUVfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZXJyb3JfcicgZnVuY3Rpb24uICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJFUlJPUl9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4JyBmdW5jdGlvbi4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNjaGVkX2dldF9wcmlvcml0eV9taW4nIGZ1bmN0aW9uLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfR0VUX1BSSU9SSVRZX01JTiAxCisKKworLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KKyNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgYi9idWlsZC9jbWFrZS9taW5ndzMyLXRvb2xjaGFpbi5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRjMGViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UKQEAgLTAsMCArMSwyNCBAQAorIyBDTWFrZSBtaW5ndzMyIGNyb3NzIGNvbXBpbGUgdG9vbGNoYWluIGZpbGUKKworIyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0KK1NFVChDTUFLRV9TWVNURU1fTkFNRSBXaW5kb3dzKQorCisjIHdoaWNoIGNvbXBpbGVycyB0byB1c2UgZm9yIEMgYW5kIEMrKworU0VUKENNQUtFX0NfQ09NUElMRVIgaTU4Ni1taW5ndzMybXN2Yy1nY2MpCitTRVQoQ01BS0VfQ1hYX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtZysrKQorU0VUKENNQUtFX1JDX0NPTVBJTEVSIGk1ODYtbWluZ3czMm1zdmMtd2luZHJlcykKKworIyBoZXJlIGlzIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQgbG9jYXRlZAorU0VUKENNQUtFX0ZJTkRfUk9PVF9QQVRIIC91c3IvaTU4Ni1taW5ndzMybXN2YykKKworIyBhZGp1c3QgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIHRoZSBGSU5EX1hYWCgpIGNvbW1hbmRzOgorIyBzZWFyY2ggaGVhZGVycyBhbmQgbGlicmFyaWVzIGluIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQsIHNlYXJjaAorIyBwcm9ncmFtcyBpbiB0aGUgaG9zdCBlbnZpcm9ubWVudAorc2V0KENNQUtFX0ZJTkRfUk9PVF9QQVRIX01PREVfUFJPR1JBTSBORVZFUikKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0xJQlJBUlkgT05MWSkKK3NldChDTUFLRV9GSU5EX1JPT1RfUEFUSF9NT0RFX0lOQ0xVREUgT05MWSkKKworc2V0KEJVSUxEX1NIQVJFRF9MSUJTIE9GRikKK1NFVChDTUFLRV9FWEVfTElOS0VSX0ZMQUdTICItc3RhdGljIikKK3NldChDTUFLRV9DX0ZMQUdTICR7Q01BS0VfQ19GTEFHU30gIi1zdGF0aWMtbGliZ2NjIikKK3NldChDTUFLRV9DWFhfRkxBR1MgJHtDTUFLRV9DWFhfRkxBR1N9ICItc3RhdGljLWxpYnN0ZGMrKyIpCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvUkVBRE1FLm1kIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZkNjkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL1JFQURNRS5tZApAQCAtMCwwICsxLDE5OCBAQAorIyBEb2NrZXIgSW50ZWdyYXRpb24gIworCitEdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IEFwYWNoZSBUaHJpZnQsCitkb2NrZXIgY29udGFpbmVycyBhcmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCB0aGUgcHJvamVjdCBvbiBhCit2YXJpZXR5IG9mIHBsYXRmb3JtcyB0byBwcm92aWRlIG1heGltdW0gdGVzdCBjb3ZlcmFnZS4KKworIyMgQXBwdmV5b3IgSW50ZWdyYXRpb24gIyMKKworQXQgdGhpcyB0aW1lIHRoZSBBcHB2ZXlvciBzY3JpcHRzIGRvIG5vdCB1c2UgZG9ja2VyIGNvbnRhaW5lcnMuCitPbmNlIE1pY3Jvc29mdCBzdXBwb3J0cyBWaXN1YWwgU3R1ZGlvIEJ1aWxkIFRvb2xzIHJ1bm5pbmcgaW5zaWRlCituYW5vIGNvbnRhaW5lcnMgKGluc3RlYWQgb2YgQ29yZSwgd2hpY2ggaXMgaHVnZSkgdGhlbiB3ZSB3aWxsCitjb25zaWRlciB1c2luZyBjb250YWluZXJzIGZvciB0aGUgV2luZG93cyBidWlsZHMgYXMgd2VsbC4KKworIyMgVHJhdmlzIENJIEludGVncmF0aW9uICMjCisKK1RoZSBUcmF2aXMgQ0kgc2NyaXB0cyB1c2UgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kCitsb2dpYyB0byBkZXRlcm1pbmUgdGhlaXIgYmVoYXZpb3I6CisKKyMjIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgIyMjCisKK3wgVmFyaWFibGUgfCBEZWZhdWx0IHwgVXNhZ2UgfAorfCAtLS0tLS0tLSB8IC0tLS0tIHwgLS0tLS0tLSB8Cit8IGBESVNUUk9gIHwgYHVidW50dS1iaW9uaWNgIHwgU2V0IGJ5IHZhcmlvdXMgYnVpbGQgam9icyBpbiBgLnRyYXZpcy55bWxgIHRvIHJ1biBidWlsZHMgaW4gZGlmZmVyZW50IGNvbnRhaW5lcnMuICBOb3QgaW50ZW5kZWQgdG8gYmUgc2V0IGV4dGVybmFsbHkufAorfCBgRE9DS0VSX1JFUE9gIHwgYHRocmlmdC90aHJpZnQtYnVpbGRgIHwgVGhlIG5hbWUgb2YgdGhlIERvY2tlciBIdWIgcmVwb3NpdG9yeSB0byBvYnRhaW4gYW5kIHN0b3JlIGRvY2tlciBpbWFnZXMuIHwKK3wgYERPQ0tFUl9VU0VSYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBuYW1lIGNvbnRhaW5pbmcgdGhlIHJlcG9zaXRvcnkuIHwKK3wgYERPQ0tFUl9QQVNTYCB8IGA8bm9uZT5gIHwgVGhlIERvY2tlciBIdWIgYWNjb3VudCBwYXNzd29yZCB0byB1c2Ugd2hlbiBwdXNoaW5nIG5ldyB0YWdzLiB8CisKK0ZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBkb2NrZXIgaW1hZ2UgdGhhdCBpcyB1c2VkIGluIGJ1aWxkcyBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3b3VsZCBiZTogYHRocmlmdC90aHJpZnQtYnVpbGQ6dWJ1bnR1LWJpb25pY2AKKworIyMjIEZvcmtzICMjIworCitJZiB5b3UgaGF2ZSBmb3JrZWQgdGhlIEFwYWNoZSBUaHJpZnQgcmVwb3NpdG9yeSBhbmQgeW91IHdvdWxkIGxpa2UKK3RvIHVzZSB5b3VyIG93biBEb2NrZXIgSHViIGFjY291bnQgdG8gc3RvcmUgdGhyaWZ0IGJ1aWxkIGltYWdlcywKK3lvdSBjYW4gdXNlIHRoZSBUcmF2aXMgQ0kgd2ViIGludGVyZmFjZSB0byBzZXQgdGhlIGBET0NLRVJfVVNFUmAsCitgRE9DS0VSX1BBU1NgLCBhbmQgYERPQ0tFUl9SRVBPYCB2YXJpYWJsZXMgaW4gYSBzZWN1cmUgbWFubmVyLgorWW91ciBmb3JrIGJ1aWxkcyB3aWxsIHRoZW4gcHVsbCwgcHVzaCwgYW5kIHRhZyB0aGUgZG9ja2VyIGltYWdlcworaW4geW91ciBhY2NvdW50LgorCisjIyMgTG9naWMgIyMjCisKK1RoZSBUcmF2aXMgQ0kgYnVpbGQgcnVucyBpbiB0d28gcGhhc2VzIC0gZmlyc3QgdGhlIGRvY2tlciBpbWFnZXMgYXJlIHJlYnVpbHQKK2ZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgY29udGFpbmVycyBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgRG9ja2VyZmlsZSB0aGF0Cit3YXMgdXNlZCB0byBidWlsZCB0aGUgbW9zdCByZWNlbnQgdGFnLiAgSWYgYSBgRE9DS0VSX1BBU1NgIGVudmlyb25tZW50Cit2YXJpYWJsZSBpcyBzcGVjaWZpZWQsIHRoZSBkb2NrZXIgc3RhZ2UgYnVpbGRzIHdpbGwgYXR0ZW1wdCB0byBsb2cgaW50bworRG9ja2VyIEh1YiBhbmQgcHVzaCB0aGUgcmVzdWx0aW5nIHRhZ3MuCisKKyMjIFN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZSBUcmF2aXMgQ0kgKGNvbnRpbnVvdXMgaW50ZWdyYXRpb24pIGJ1aWxkcyB1c2UgdGhlIFVidW50dSBCaW9uaWMKKygxOC4wNCBMVFMpIGFuZCBYZW5pYWwgKDE2LjA0IExUUykgaW1hZ2VzIHRvIG1heGltaXplIGxhbmd1YWdlIGxldmVsCitjb3ZlcmFnZS4KKworIyMjIFVidW50dSAjIyMKKworKiBiaW9uaWMgKHN0YWJsZSwgY3VycmVudCkKKyogYXJ0ZnVsIChwcmV2aW91cyBzdGFibGUpCisqIHhlbmlhbCAobGVnYWN5KQorCisjIyBVbnN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZXNlIGNvbnRhaW5lcnMgbWF5IGJlIGluIHZhcmlvdXMgc3RhdGVzLCBhbmQgbWF5IG5vdCBidWlsZCBldmVyeXRoaW5nLgorVGhleSBjYW4gYmUgZm91bmQgaW4gdGhlIGBvbGQvYCBzdWJkaXJlY3RvcnkuCisKKyMjIyBDZW50T1MgIyMjCisqIDcuMworICAqIG1ha2UgY2hlY2sgaW4gbGliL3B5IG1heSBoYW5nIGluIHRlc3Rfc3Nsc29ja2V0IC0gcm9vdCBjYXVzZSB1bmtub3duCisKKyMjIyBEZWJpYW4gIyMjCisKKyogamVzc2llCisqIHN0cmV0Y2gKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9jcHAgZmFpbHMgZHVlIHRvIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CisKKyMjIEJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMsIGxvY2FsbHkgIyMKKworV2UgcmVjb21tZW5kIHlvdSBidWlsZCBsb2NhbGx5IHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgZG9lcywgc28gdGhhdCB3aGVuIHlvdQorc3VibWl0IHlvdXIgcHVsbCByZXF1ZXN0IHlvdSB3aWxsIHJ1biBpbnRvIGZld2VyIHN1cnByaXNlcy4gIFRvIG1ha2UgaXQgYQorbGl0dGxlIGVhc2llciwgcHV0IHRoZSBmb2xsb3dpbmcgaW50byB5b3VyIGB+Ly5iYXNoX2FsaWFzZXNgIGZpbGU6CisKKyAgICAjIEtpbGwgYWxsIHJ1bm5pbmcgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJraWxsYWxsPSdkb2NrZXIga2lsbCAkKGRvY2tlciBwcyAtcSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuYz0ncHJpbnRmICJcbj4+PiBEZWxldGluZyBzdG9wcGVkIGNvbnRhaW5lcnNcblxuIiAmJiBkb2NrZXIgcm0gJChkb2NrZXIgcHMgLWEgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHVudGFnZ2VkIGltYWdlcy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmk9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgdW50YWdnZWQgaW1hZ2VzXG5cbiIgJiYgZG9ja2VyIHJtaSAkKGRvY2tlciBpbWFnZXMgLXEgLWYgZGFuZ2xpbmc9dHJ1ZSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzIGFuZCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW49J2RvY2tlcmNsZWFuYyB8fCB0cnVlICYmIGRvY2tlcmNsZWFuaScKKworICAgICMgQnVpbGQgYSB0aHJpZnQgZG9ja2VyIGltYWdlIChydW4gZnJvbSB0b3AgbGV2ZWwgb2YgZ2l0IHJlcG8pOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJidWlsZAorICAgIHsKKyAgICAgIGRvY2tlciBidWlsZCAtdCAkMSBidWlsZC9kb2NrZXIvJDEKKyAgICB9CisKKyAgICAjIFJ1biBhIHRocmlmdCBkb2NrZXIgaW1hZ2U6IGFyZ3VtZW50ICMxIGlzIGltYWdlIHR5cGUgKHVidW50dSwgY2VudG9zLCBldGMpLgorICAgIGZ1bmN0aW9uIGRvY2tlcnJ1bgorICAgIHsKKyAgICAgIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCAkMSAvYmluL2Jhc2gKKyAgICB9CisKK1RoZW4sIHRvIHB1bGwgZG93biB0aGUgY3VycmVudCBpbWFnZSBiZWluZyB1c2VkIHRvIGJ1aWxkICh0aGUgc2FtZSB3YXkKK1RyYXZpcyBDSSBkb2VzIGl0KSAtIGlmIGl0IGlzIG91dCBvZiBkYXRlIGluIGFueSB3YXkgaXQgd2lsbCBidWlsZCBhCituZXcgb25lIGZvciB5b3U6CisKKyAgICB0aHJpZnQkIERPQ0tFUl9SRVBPPXRocmlmdC90aHJpZnQtYnVpbGQgRElTVFJPPXVidW50dS1iaW9uaWMgYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKKworVG8gcnVuIGFsbCB1bml0IHRlc3RzIChqdXN0IGxpa2UgVHJhdmlzIENJIGRvZXMpOgorCisgICAgdGhyaWZ0JCBkb2NrZXJydW4gdWJ1bnR1LWJpb25pYworICAgIHJvb3RAOGNhZjU2YjBjZTdiOi90aHJpZnQvc3JjIyBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKworVG8gcnVuIHRoZSBjcm9zcyB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaAorCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IHdhbnQgdG8gY2xlYW4gdXAgb2NjYXNpb25hbGx5IHNvIHRoYXQgZG9ja2VyIGlzbid0IHVzaW5nIGxvdHMgb2YgZXh0cmEgZGlzayBzcGFjZToKKworICAgIHRocmlmdCQgZG9ja2VyY2xlYW4KKworWW91IG5lZWQgdG8gcnVuIHRoZSBkb2NrZXIgY29tbWFuZHMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgbG9jYWwgY2xvbmUgb2YgdGhlCit0aHJpZnQgZ2l0IHJlcG9zaXRvcnkgZm9yIHRoZW0gdG8gd29yay4KKworV2hlbiB5b3UgYXJlIGRvbmUgaW4gdGhlIHJvb3QgZG9ja2VyIHNoZWxsIHlvdSBjYW4gYGV4aXRgIHRvIGdvIGJhY2sgdG8KK3lvdXIgdXNlciBob3N0IHNoZWxsLiAgT25jZSB0aGUgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgdGVzdCBwYXNzZXMgbG9jYWxseSwKK3N1Ym1pdCB0aGUgY2hhbmdlcywgYW5kIGlmIGRlc2lyZWQgc3F1YXNoIHRoZSBwdWxsIHJlcXVlc3QgdG8gb25lIGNvbW1pdAordG8gbWFrZSBpdCBlYXNpZXIgdG8gbWVyZ2UgKHRoZSBjb21taXR0ZXJzIGNhbiBzcXVhc2ggYXQgY29tbWl0IHRpbWUgbm93Cit0aGF0IEdpdEh1YiBpcyB0aGUgbWFzdGVyIHJlcG9zaXRvcnkpLiAgTm93IHlvdSBhcmUgYnVpbGRpbmcgbGlrZSBUcmF2aXMgQ0kgZG9lcyEKKworIyMgUmF3IENvbW1hbmRzIGZvciBCdWlsZGluZyB3aXRoIERvY2tlciAjIworCitJZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBzYW1lIHNjcmlwdHMgVHJhdmlzIENJIGRvZXMsIHlvdSBjYW4gZG8gaXQgbWFudWFsbHk6CisKK0J1aWxkIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYworCitPcGVuIGEgY29tbWFuZCBwcm9tcHQgaW4gdGhlIGltYWdlOgorCisgICAgdGhyaWZ0JCBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgdGhyaWZ0IC9iaW4vYmFzaAorCisjIyBDb3JlIFRvb2wgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworTGFzdCB1cGRhdGVkOiBPY3RvYmVyIDEsIDIwMTcKKworfCBUb29sICAgICAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFudCAgICAgICB8IDEuOS42ICAgICAgICAgfCAxLjEwLjMgICAgICAgIHwgICAgICAgfAorfCBhdXRvY29uZiAgfCAyLjY5ICAgICAgICAgIHwgMi42OSAgICAgICAgICB8ICAgICAgIHwKK3wgYXV0b21ha2UgIHwgMS4xNSAgICAgICAgICB8IDEuMTUuMSAgICAgICAgfCAgICAgICB8Cit8IGJpc29uICAgICB8IDMuMC40ICAgICAgICAgfCAzLjAuNCAgICAgICAgIHwgICAgICAgfAorfCBib29zdCAgICAgfCAxLjU4LjAgICAgICAgIHwgMS42NS4xICAgICAgICB8ICAgICAgIHwKK3wgY21ha2UgICAgIHwgMy41LjEgICAgICAgICB8IDMuMTAuMiAgICAgICAgfCAgICAgICB8Cit8IGNwcGNoZWNrICB8IDEuNzIgICAgICAgICAgfCAxLjgyICAgICAgICAgIHwgICAgICAgfAorfCBmbGV4ICAgICAgfCAyLjYuMCAgICAgICAgIHwgMi42LjQgICAgICAgICB8ICAgICAgIHwKK3wgbGliYzYgICAgIHwgMi4yMyAgICAgICAgICB8IDIuMjcgICAgICAgICAgfCBnbGliYyB8Cit8IGxpYmV2ZW50ICB8IDIuMC4yMSAgICAgICAgfCAyLjEuOCAgICAgICAgIHwgICAgICAgfAorfCBsaWJzdGRjKysgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgbWFrZSAgICAgIHwgNC4xICAgICAgICAgICB8IDQuMSAgICAgICAgICAgfCAgICAgICB8Cit8IG9wZW5zc2wgICB8IDEuMC4yZyAgICAgICAgfCAxLjEuMGcgICAgICAgIHwgICAgICAgfAorfCBxdDUgICAgICAgfCA1LjUuMSAgICAgICAgIHwgNS45LjUgICAgICAgICB8ICAgICAgIHwKKworIyMgQ29tcGlsZXIvTGFuZ3VhZ2UgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworfCBMYW5ndWFnZSAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFzIG9mICAgICB8IE1hciAwNiwgMjAxOCAgfCBKYW4gNCwgMjAxOSAgIHwgICAgICAgfAorfCBhczMgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IEMrKyBnY2MgICB8IDUuNC4wICAgICAgICAgfCA3LjMuMCAgICAgICAgIHwgICAgICAgfAorfCBDKysgY2xhbmcgfCAzLjggICAgICAgICAgIHwgNi4wICAgICAgICAgICB8ICAgICAgIHwKK3wgQyMgKG1vbm8pIHwgNC4yLjEuMCAgICAgICB8IDQuNi4yLjcgICAgICAgfCAgICAgICB8Cit8IGNfZ2xpYiAgICB8IDIuNDguMiAgICAgICAgfCAyLjU2LjAgICAgICAgIHwgICAgICAgfAorfCBjbCAoc2JjbCkgfCAgICAgICAgICAgICAgIHwgMS40LjE1ICAgICAgICB8ICAgICAgIHwKK3wgY29jb2EgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBkICAgICAgICAgfCAyLjA3NS4xICAgICAgIHwgMi4wODMuMSAgICAgICB8ICAgICAgIHwKK3wgZGFydCAgICAgIHwgMS4yMi4xICAgICAgICB8IDEuMjQuMyAgICAgICAgfCAgICAgICB8Cit8IGRlbHBoaSAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZG90bmV0ICAgIHwgMi4xLjQgICAgICAgICB8IDIuMi4xMDEgICAgICAgfCAgICAgICB8Cit8IGVybGFuZyAgICB8IDE4LjMgICAgICAgICAgfCAyMC4yLjIgICAgICAgIHwgICAgICAgfAorfCBnbyAgICAgICAgfCAxLjcuNiAgICAgICAgIHwgMS4xMS40ICAgICAgICB8ICAgICAgIHwKK3wgaGFza2VsbCAgIHwgNy4xMC4zICAgICAgICB8IDguMC4yICAgICAgICAgfCAgICAgICB8Cit8IGhheGUgICAgICB8IDMuMi4xICAgICAgICAgfCAzLjQuNCAgICAgICAgIHwgVEhSSUZULTQzNTI6IGF2b2lkIDMuNC4yIHwKK3wgamF2YSAgICAgIHwgMS44LjBfMTUxICAgICB8IDEuOC4wXzE5MSAgICAgfCAgICAgICB8Cit8IGpzICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgVW5zdXJlIGhvdyB0byBsb29rIGZvciB2ZXJzaW9uIGluZm8/IHwKK3wgbHVhICAgICAgIHwgNS4yLjQgICAgICAgICB8IDUuMi40ICAgICAgICAgfCBMdWEgNS4zOiBzZWUgVEhSSUZULTQzODYgfAorfCBub2RlanMgICAgfCA2LjEzLjAgICAgICAgIHwgOC4xNS4wICAgICAgICB8ICAgICAgIHwKK3wgb2NhbWwgICAgIHwgICAgICAgICAgICAgICB8IDQuMDUuMCAgICAgICAgfCBUSFJJRlQtNDUxNzogb2NhbWwgNC4wMi4zIG9uIHhlbmlhbCBhcHBlYXJzIGJyb2tlbiB8Cit8IHBlcmwgICAgICB8IDUuMjIuMSAgICAgICAgfCA1LjI2LjEgICAgICAgIHwgICAgICAgfAorfCBwaHAgICAgICAgfCA3LjAuMjIgICAgICAgIHwgNy4yLjEwICAgICAgICB8ICAgICAgIHwKK3wgcHl0aG9uICAgIHwgMi43LjEyICAgICAgICB8IDIuNy4xNXJjMSAgICAgfCAgICAgICB8Cit8IHB5dGhvbjMgICB8IDMuNS4yICAgICAgICAgfCAzLjYuNyAgICAgICAgIHwgICAgICAgfAorfCBydWJ5ICAgICAgfCAyLjMuMXAxMTIgICAgIHwgMi41LjFwNTcgICAgICB8ICAgICAgIHwKK3wgcnVzdCAgICAgIHwgMS4xNy4wICAgICAgICB8IDEuMzAuMCAgICAgICAgfCAgICAgICB8Cit8IHNtYWxsdGFsayB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgc3dpZnQgICAgIHwgICAgICAgICAgICAgICB8IDQuMi4xICAgICAgICAgfCAgICAgICB8CmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFjNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDU5IEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEJhc2Ugc3lzdGVtIGJvb3RzdHJhcCBzY3JpcHQKKyRib290c3RyYXBfc2NyaXB0ID0gPDxfX0JPT1RTVFJBUF9fCitlY2hvICJQcm92aXNpb25pbmcgZGVmYXVsdHMiCisKK3N1ZG8gYXB0LWdldCB1cGRhdGUgLXkKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIC15CisKKyMgSW5zdGFsbCBkZWZhdWx0IHBhY2thZ2VzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBidWlsZC1lc3NlbnRpYWwgY3VybCBnaXQKKworIyBJbnN0YWxsIGxhdGVzdCBEb2NrZXIgdmVyc2lvbgorc3VkbyBjdXJsIC1zU0wgaHR0cHM6Ly9nZXQuZG9ja2VyLmlvL2dwZyB8IHN1ZG8gYXB0LWtleSBhZGQgLQorc3VkbyBlY2hvICJkZWIgaHR0cDovL2dldC5kb2NrZXIuaW8vdWJ1bnR1IGRvY2tlciBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvY2tlci5saXN0CitzdWRvIGFwdC1nZXQgdXBkYXRlIC15CitzdWRvIGFwdC1nZXQgaW5zdGFsbCAteSBsaW51eC1pbWFnZS1leHRyYS1gdW5hbWUgLXJgIGF1ZnMtdG9vbHMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC15IGx4Yy1kb2NrZXIKKworZWNobyAiRmluaXNoZWQgcHJvdmlzaW9uaW5nIGRlZmF1bHRzIgorX19CT09UU1RSQVBfXworCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgIGNvbmZpZy52bS5ib3ggPSAidHJ1c3R5NjQiCisgIGNvbmZpZy52bS5ib3hfdXJsID0gImh0dHBzOi8vY2xvdWQtaW1hZ2VzLnVidW50dS5jb20vdmFncmFudC90cnVzdHkvY3VycmVudC90cnVzdHktc2VydmVyLWNsb3VkaW1nLWFtZDY0LXZhZ3JhbnQtZGlzazEuYm94IgorICBjb25maWcuc3NoLmZvcndhcmRfYWdlbnQgPSB0cnVlCisKKyAgY29uZmlnLnZtLnByb3ZpZGVyIDp2aXJ0dWFsYm94IGRvIHx2Ym94fAorICAgIHZib3guY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLW1lbW9yeSIsICIxMDI0Il0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1jcHVzIiwgIjIiXQorICBlbmQKKworICAjIFNldHVwIHRoZSBkZWZhdWx0IGJvb3RzdHJhcCBzY3JpcHQgZm9yIG91ciB1YnVudHUgYmFzZSBib3ggaW1hZ2UKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiAic2hlbGwiLCBpbmxpbmU6ICRib290c3RyYXBfc2NyaXB0CisKKyAgIyBTZXR1cCB0aGUgY3VzdG9tIGRvY2tlciBpbWFnZSBmcm9tIG91ciBVYnVudHUgRG9ja2VyZmlsZQorICBjb25maWcudm0ucHJvdmlzaW9uICJkb2NrZXIiIGRvIHxkfAorICAgIGQuYnVpbGRfaW1hZ2UgIi92YWdyYW50L3VidW50dSIsIGFyZ3M6ICItdCB0aHJpZnQiCisgIGVuZAorCisgICMgU2V0dXAgdGhlIGN1c3RvbSBkb2NrZXIgaW1hZ2UgZnJvbSBvdXIgQ2VudG9zIERvY2tlcmZpbGUKKyAgI2NvbmZpZy52bS5wcm92aXNpb24gImRvY2tlciIgZG8gfGR8CisgICMgIGQuYnVpbGRfaW1hZ2UgIi92YWdyYW50L2NlbnRvcyIsIGFyZ3M6ICItdCB0aHJpZnQtY2VudG9zIgorICAjZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2NlbnRvcy03LjMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTZiYmFhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwxOTkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudE9TCisjCisjIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKKyMgIC0gZG90bmV0ICh3aWxsIHVwZGF0ZSB0byAyLjAuMCBzZXBhcmF0ZWx5KQorIyAgLSBoYXhlIChub3QgaW4gY2VudG9zKQorCitGUk9NIGNlbnRvczo3LjMuMTYxMQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK1JVTiB5dW0gaW5zdGFsbCAteSBlcGVsLXJlbGVhc2UKKworIyBHZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGF1dG9jb25mIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJpc29uLWRldmVsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNsYW5nLWFuYWx5emVyIFwKKyAgICAgIGNtYWtlMyBcCisgICAgICBjdXJsIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2NjIFwKKyAgICAgIGdjYy1jKysgXAorICAgICAgZ2RiIFwKKyAgICAgIGdpdCBcCisgICAgICBsaWJ0b29sIFwKKyAgICAgIG00IFwKKyAgICAgIG1ha2UgXAorICAgICAgdGFyIFwKKyAgICAgIHVuemlwIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHdnZXQgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY21ha2UzIC91c3IvYmluL2NtYWtlICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2NwYWNrMyAvdXNyL2Jpbi9jcGFjayAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jdGVzdDMgL3Vzci9iaW4vY3Rlc3QKKworIyBDKysgZGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYm9vc3QtZGV2ZWwtc3RhdGljIFwKKyAgICAgIHpsaWItZGV2ZWwgXAorICAgICAgb3BlbnNzbC1kZXZlbCBcCisgICAgICBsaWJldmVudC1kZXZlbCAmJiBcCisgICAgY2QgL3Vzci9saWI2NCAmJiBcCisgICAgbG4gLXMgbGliYm9vc3RfdGhyZWFkLW10LmEgbGliYm9vc3RfdGhyZWFkLmEKKworIyBDIyBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBtb25vLWNvcmUgXAorICAgICAgbW9uby1kZXZlbCBcCisgICAgICBtb25vLXdlYi1kZXZlbCBcCisgICAgICBtb25vLWV4dHJhcworCisjIEQgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDc2LjAvZG1kLTIuMDc2LjAtMC5mZWRvcmEueDg2XzY0LnJwbSB4ZGctdXRpbHMKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgb3BlbnNzbC1tYXN0ZXIKKworIyBEYXJ0CitSVU4gY2QgL3Vzci9sb2NhbCAmJiBcCisgICAgd2dldCAtcSBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZGFydC1hcmNoaXZlL2NoYW5uZWxzL3N0YWJsZS9yZWxlYXNlLzEuMjQuMi9zZGsvZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAgJiYgXAorICAgIHVuemlwIC1xIGRhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwICYmIFwKKyAgICBybSBkYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcAorRU5WIFBBVEggL3Vzci9sb2NhbC9kYXJ0LXNkay9iaW46JFBBVEgKKworIyBFcmxhbmcgRGVwZW5kZW5jaWVzCitSVU4gY3VybCAtc1NMIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9ycG0vY2VudG9zL2VybGFuZ19zb2x1dGlvbnMucmVwbyAtbyAvZXRjL3l1bS5yZXBvcy5kL2VybGFuZ19zb2x1dGlvbnMucmVwbyAmJiBcCisgICAgeXVtIGluc3RhbGwgLXkgXAorICAgICAgZXJsYW5nLWtlcm5lbCBcCisgICAgICBlcmxhbmctZXJ0cyBcCisgICAgICBlcmxhbmctc3RkbGliIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctcmViYXIgXAorICAgICAgZXJsYW5nLXRvb2xzCisKKyMgR0xpYkMgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKKworIyBHbyBEZXBlbmRlbmNpZXMKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuOS5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6CitFTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAorCisjIEhhc2tlbGwgRGVwZW5kZW5jaWVzCitSVU4geXVtIC15IGluc3RhbGwgaGFza2VsbC1wbGF0Zm9ybQorCisjIEhheGUgRGVwZW5kZW5jaWVzCisjIE5vdCBpbiBkZWJpYW4vc3RyZXRjaAorCisjIEphdmEgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgYW50IFwKKyAgICAgIGp1bml0IFwKKyAgICAgIGFudC1qdW5pdCBcCisgICAgICBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKKworIyBMdWEgRGVwZW5kZW5jaWVzCisjIEx1YSBpbiBlcGVsIGlzIHRvbyBvbGQgKDUuMS40LCBuZWVkIDUuMikgc28gd2UgZ2V0IHRoZSBsYXRlc3QKK1JVTiB5dW0gaW5zdGFsbCAteSByZWFkbGluZS1kZXZlbCAmJiBcCisgICAgd2dldCAtcSBodHRwOi8vd3d3Lmx1YS5vcmcvZnRwL2x1YS01LjMuNC50YXIuZ3ogJiYgXAorICAgIHRhciB4emYgbHVhLTUuMy40LnRhci5neiAmJiBcCisgICAgY2QgbHVhLTUuMy40ICYmIFwKKyAgICBzZWQgLWkgJ3MvQ0ZMQUdTPSAvQ0ZMQUdTPSAtZlBJQyAvZycgc3JjL01ha2VmaWxlICYmIFwKKyAgICBtYWtlIGxpbnV4ICYmIFwKKyAgICBtYWtlIGluc3RhbGwgJiYgXAorICAgIGNkIC4uICYmIFwKKyAgICBybSAtcmYgbHVhLTUqCisKKyMgTWluR1cgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbWluZ3czMi1iaW51dGlscyBcCisgICAgICBtaW5ndzMyLWNydCBcCisgICAgICBtaW5ndzMyLW5zaXMKKworIyBOb2RlLmpzIERlcGVuZGVuY2llcworIyBXb3JrIGFyb3VuZCBlcGVsIGlzc3VlIHdoZXJlIHRoZXkgcmVtb3ZlZCBodHRwLXBhcnNlciB0aGF0IG5vZGVqcyBkZXBlbmRzIG9uIQorUlVOIHl1bSAteSBpbnN0YWxsIGh0dHBzOi8vb3BlbnNvdXJjZS5lbmRhLmV1L3BhY2thZ2VzL2h0dHAtcGFyc2VyLTIuNy4xLTMuZWw3Lng4Nl82NC5ycG0KK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBub2RlanMgXAorICAgICAgbnBtCisKKyMgT2NhbWwgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgb2NhbWwgXAorICAgICAgb2NhbWwtb2NhbWxkb2MgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9vY2FtbC9vcGFtL21hc3Rlci9zaGVsbC9vcGFtX2luc3RhbGxlci5zaCAtTyAtIHwgc2ggLXMgL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzICYmIFwKKyAgICBlY2hvICcuIC9yb290Ly5vcGFtL29wYW0taW5pdC9pbml0LnNoID4gL2Rldi9udWxsIDI+IC9kZXYvbnVsbCB8fCB0cnVlJyA+PiB+Ly5iYXNocmMKKworIyBQZXJsIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHBlcmwgXAorICAgICAgcGVybC12ZXJzaW9uIFwKKyAgICAgIHBlcmwtQml0LVZlY3RvciBcCisgICAgICBwZXJsLUNsYXNzLUFjY2Vzc29yIFwKKyAgICAgIHBlcmwtRXh0VXRpbHMtTWFrZU1ha2VyIFwKKyAgICAgIHBlcmwtVGVzdC1TaW1wbGUgXAorICAgICAgcGVybC1JTy1Tb2NrZXQtU1NMIFwKKyAgICAgIHBlcmwtTmV0LVNTTGVheSBcCisgICAgICBwZXJsLUNyeXB0LVNTTGVheQorCisjIFBIUCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBwaHAgXAorICAgICAgcGhwLWRldmVsIFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwLXBocHVuaXQtUEhQVW5pdCBcCisgICAgICBiemlwMgorCisjIFB5dGhvbiBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBweXRob24gXAorICAgICAgcHl0aG9uLWRldmVsIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMzQgXAorICAgICAgcHl0aG9uMzQtZGV2ZWwgXAorICAgICAgcHl0aG9uMzQtcGlwIFwKKyAgICAgIHB5dGhvbjM0LXNldHVwdG9vbHMKK1JVTiBwaXAyIGluc3RhbGwgLS11cGdyYWRlIHBpcAorUlVOIHBpcDIgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpcGFkZHJlc3Mgc2V0dXB0b29scyBzaXggdG9ybmFkbyB0b3JuYWRvLXRlc3RpbmcgdHdpc3RlZCB2aXJ0dWFsZW52IHpvcGUtaW50ZXJmYWNlCitSVU4gcGlwMyBpbnN0YWxsIC0tdXBncmFkZSBwaXAKK1JVTiBwaXAzIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXBhZGRyZXNzIHNldHVwdG9vbHMgc2l4IHRvcm5hZG8gdG9ybmFkby10ZXN0aW5nIHR3aXN0ZWQgdmlydHVhbGVudiB6b3BlLWludGVyZmFjZQorCisjIFJ1YnkgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldmVsIFwKKyAgICAgIHJ1YnlnZW1zICYmIFwKKyAgICBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBSdXN0CitSVU4gY3VybCBodHRwczovL3NoLnJ1c3R1cC5ycyAtc1NmIHwgc2ggLXMgLS0gLXkgLS1kZWZhdWx0LXRvb2xjaGFpbiAxLjE3LjAKK0VOViBQQVRIIC9yb290Ly5jYXJnby9iaW46JFBBVEgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHl1bSBjbGVhbiBhbGwKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLWplc3NpZS9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzc0ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIwNCBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4KKyMKKyMgS25vd24gbWlzc2luZyBjbGllbnQgbGlicmFyaWVzOgorIyAgLSBkb3RuZXRjb3JlCisjICAtIHJ1c3QKKworRlJPTSBidWlsZHBhY2stZGVwczpqZXNzaWUtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIEFkZCBhcHQgc291cmNlcworIyBqZXNzaWUtYmFja3BvcnRzIGZvciBjbWFrZSBhbmQgc29tZSBydWJ5IGJpdHMKK1JVTiBlY2hvICJkZWIgaHR0cDovL2Z0cC5kZWJpYW4ub3JnL2RlYmlhbiBqZXNzaWUtYmFja3BvcnRzIG1haW4iID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvamVzc2llLWJhY2twb3J0cy5saXN0CisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0ICYmIFwKKyAgICBzZWQgLWkgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAtZSAncy9odHRwczovaHR0cDovZycKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIHBrZy1jb25maWcgJiYgXAorICAgIGFwdC1nZXQgLXQgamVzc2llLWJhY2twb3J0cyBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGNtYWtlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay03LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1waXAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCAtdCBqZXNzaWUtYmFja3BvcnRzIGluc3RhbGwgLXkgcnVieS1idW5kbGVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDUgXAorICAgICAgcGhwNS1kZXYgXAorICAgICAgcGhwNS1jbGkgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBwaHB1bml0IFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5vZGVqcy1kZXYgXAorICAgICAgbm9kZWpzLWxlZ2FjeSBcCisgICAgICBucG0KKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDU2hhcnAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJtb25vLXN5c3RlbS13ZWIyLjAtY2lsIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgeGRnLXV0aWxzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0IFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2IFwKK2AjIE1pbkdXIGRlcGVuZGVuY2llc2AgXAorICAgICAgbWluZ3czMiBcCisgICAgICBtaW5ndzMyLWJpbnV0aWxzIFwKK2AjICAgICAgbWluZ3czMi1ydW50aW1lYCBcCisgICAgICBuc2lzIFwKK2AjIENsZWFuIHVwYCBcCisgICAgJiYgcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworIyBSdWJ5CitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCisjIFB5dGhvbiBvcHRpb25hbCBkZXBlbmRlbmNpZXMKK1JVTiBwaXAyIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworUlVOIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKworIyBHbworUlVOIGN1cmwgLXNTTCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZ29sYW5nL2dvMS40LjMubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXhlCitSVU4gbWtkaXIgLXAgL3Vzci9saWIvaGF4ZSAmJiBcCisgICAgd2dldCAtTyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL3JlbGVhc2VzL2Rvd25sb2FkLzMuMi4xL2hheGUtMy4yLjEtbGludXg2NC50YXIuZ3ogfCBcCisgICAgdGFyIC1DIC91c3IvbGliL2hheGUgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6ICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCisgICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAorICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCisgICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKworIyBECitSVU4gY3VybCAtc1NMIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3MC4wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViIC1vIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAorICAgIGRwa2cgLWkgL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyICYmIFwKKyAgICBlY2hvICdnY2MgLVdsLC0tbm8tYXMtbmVlZGVkICQqJyA+IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGNobW9kIDc1NSAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKKyAgICBlY2hvICdDQz0vdXNyL2xvY2FsL2Jpbi9nY2MtZG1kJyA+PiAvZXRjL2RtZC5jb25mCisKKyMgRGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBPQ2FtbAorUlVOIGVjaG8gJ2RlYiBodHRwOi8vcHBhLmxhdW5jaHBhZC5uZXQvYXZzbS9wcGEvdWJ1bnR1IHRydXN0eSBtYWluJyA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2F2c20tb2ZmaWNpYWwtb2NhbWwubGlzdCAmJiBcCisgICAgZ3BnIC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdiA2MTcwN0IwOSAmJiBcCisgICAgZ3BnIC0tZXhwb3J0IC0tYXJtb3IgNjE3MDdCMDkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IG9jYW1sIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAmJiBcCisgICAgb3BhbSBpbnN0YWxsIG9hc2lzCisKKyMgRm9yY2UgdXRmOCBsb2NhbGUgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIEhhc2tlbGwgdGYtcmFuZG9tCitFTlYgTENfQUxMIEMuVVRGLTgKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1zdHJldGNoL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzZWVjZAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDIzMSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBEZWJpYW4gU3RyZXRjaAorIworIyBLbm93biBpc3N1ZXM6CisjIC0gZDogZGVpbW9zIGZvciBsaWJldmVudCBhbmQgb3BlbnNzbCBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyAtIGRvdG5ldGNvcmUsIGJlY2F1c2UgbmV0Y29yZSBpcyBmb3IgMS4wLjAtcHJldmlldyBhbmQgMi4wLjAgaXMgb3V0CisjIC0gcnVzdDogY2FyZ28gbm90IGluIGRlYmlhbiByZXBvIC0gcGVyaGFwcyBub3QgbmVlZGVkPworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnN0cmV0Y2gtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KKworRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIGFwdCBhcHQtdHJhbnNwb3J0LWh0dHBzIGN1cmwgd2dldCBhcHQtdXRpbHMKKworIyBECitSVU4gd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCBpbnN0YWxsIC0tcmVpbnN0YWxsIGQtYXB0LWtleXJpbmcKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAorICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJworCisjIGRvdG5ldCAoY29yZSkgMi4wLjAgLSBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHlldDoKKyMgUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorIyAgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMgKHRoaXMgc3RlcCBydW5zIGFwdC1nZXQgdXBkYXRlIGludGVybmFsbHkpCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vc2V0dXBfOC54IHwgYmFzaAorCisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorCisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkbWQtYmluIFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHhkZy11dGlscworIyBsaWJldmVudCBkZWltb3MgZGlzYWJsZWQgLSBidWlsZCBlcnJvcnMKKyMgUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyMgICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCisjIG9wZW5zc2wgZGVpbW9zIGRvZXNuJ3Qgd29yayB3aXRoIG9wZW5zc2wtMS4xLjAgLSBkaXNhYmxpbmcgaXQgZm9yIG5vdzoKKyMgUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisjICAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydAorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworIyBwcm9qZWN0IGlzbid0IHJlYWR5IGZvciB0aGlzIHF1aXRlIHlldDoKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBkb3RuZXQtc2RrLTIuMC4wCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGdvbGFuZyAoZ28pIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ29sYW5nLWdvCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldgorUlVOIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgc2FtZSBmb3IgZGViaWFuIHN0cmV0Y2gKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1iYWNrcG9ydHMuc3NsLW1hdGNoLWhvc3RuYW1lIFwKKyAgICAgIHB5dGhvbi1pcGFkZHJlc3MgXAorICAgICAgcHl0aG9uLXBpcCBcCisgICAgICBweXRob24tc2V0dXB0b29scyBcCisgICAgICBweXRob24tc2l4IFwKKyAgICAgIHB5dGhvbi10b3JuYWRvIFwKKyAgICAgIHB5dGhvbi10d2lzdGVkIFwKKyAgICAgIHB5dGhvbi13aGVlbCBcCisgICAgICBweXRob24tem9wZS5pbnRlcmZhY2UgXAorICAgICAgcHl0aG9uMy1hbGwgXAorICAgICAgcHl0aG9uMy1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRldiBcCisgICAgICBweXRob24zLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uMy1zaXggXAorICAgICAgcHl0aG9uMy10b3JuYWRvIFwKKyAgICAgIHB5dGhvbjMtdHdpc3RlZCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCitSVU4gZ2VtIGluc3RhbGwgYnVuZGxlciAtLW5vLXJpIC0tbm8tcmRvYworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydXN0YworCisjIFVwZGF0ZSBhbnl0aGluZyBlbHNlIGxlZnQgaGFuZ2luZworUlVOIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThlNGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvdWJ1bnR1LXRydXN0eS9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjQ0IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBUcnVzdHkKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBUcnVzdHkgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gZDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDIuMDcwLjAKKyMgLSBkYXJ0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMS4yMC4xCisjIC0gZG90bmV0Y29yZSwgZGlzYWJsZWQgYmVjYXVzZSBuZXRjb3JlIGlzIGZvciAxLjAuMC1wcmV2aWV3IGFuZCAyLjAuMCBpcyBvdXQKKyMgLSBoYXhlLCBkaXNhYmxlZCBiZWNhdXNlIHRoZSBkaXN0cm8gY29tZXMgd2l0aCAzLjAuMCBhbmQgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyAtIG5vZGUuanMsIGRpc2FibGVkIGJlY2F1c2UgaXQgaXMgYXQgMC4xMC4wIGluIHRoZSBkaXN0cm8gd2hpY2ggaXMgdG9vIG9sZCAobmVlZCA0KykKKyMgLSBvY2FtbCwgZGlzYWJsZWQgYmVjYXVzZSBpdCBmYWlscyB0byBpbnN0YWxsIHByb3Blcmx5CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6dHJ1c3R5LXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBECitSVU4gYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgRUJDRjk3NUU1QkEyNEQ1RSAmJiBcCisgICAgICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgICAgICB3Z2V0IC1xTyAtIGh0dHBzOi8vZGxhbmcub3JnL2Qta2V5cmluZy5ncGcgfCBhcHQta2V5IGFkZCAtCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICAgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtYWxsLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49Mi4wNzAuMi0wIFwKKyAgICAgIGxpYnBob2JvczItZGV2PTIuMDcwLjItMCBcCisgICAgICBkdWIgXAorICAgICAgZGZtdCBcCisgICAgICBkc2Nhbm5lciBcCisgICAgICB4ZGctdXRpbHMKK1JVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9MS4yMC4xLTEKK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuNy42CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBhZDU4MDhiZjQyYjAxNGMyMmRkNzY0NjQ1OGY2MzEzODUwMDMwNDlkZWQwYmI2YWYyZWZjN2YxZjc5ZmEyOWVhCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNvcmVzIHdoaWxlIGluc3RhbGxpbmcKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIGhheGUgXAorIyAgICAgICBuZWtvIFwKKyMgICAgICAgbmVrby1kZXYgJiYgXAorIyAgICAgaGF4ZWxpYiBzZXR1cCAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyMgICAgIGhheGVsaWIgaW5zdGFsbCBoeGNwcCAzLjIuMTAyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay03LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMSBcCisgICAgICBsdWE1LjEtZGV2CisKKyMgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyB0b28gb2xkCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBub2RlanMgXAorIyAgICAgICBucG0KKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBvY2FtbCBcCisjICAgICAgIG9wYW0gJiYgXAorIyAgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyMgICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNSBcCisgICAgICBwaHA1LWNsaSBcCisgICAgICBwaHA1LWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjICYmIFwKKyAgICAgIHdnZXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvaW5zdGFsbGVyIC1PIC0gLXEgfCBwaHAgLS0gLS1xdWlldCAtLWluc3RhbGwtZGlyPS91c3IvbG9jYWwvYmluLyAtLWZpbGVuYW1lPWNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXdoZWVsIFwKKyAgICAgIHB5dGhvbjMtem9wZS5pbnRlcmZhY2UgJiYgXAorICAgIHBpcCBpbnN0YWxsIC1VIGlwYWRkcmVzcyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8gJiYgXAorICAgIHBpcDMgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KKyMgaW5zdGFsbGluZyB0b3JuYWRvIGJ5IHBpcC9waXAzIGluc3RlYWQgb2YgZGViaWFuIHBhY2thZ2UKKyMgaWYgd2UgaW5zdGFsbCB0aGUgZGViaWFuIHBhY2thZ2UsIHRoZSBidWlsZCBmYWlscyBpbiBweTIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOAorCisjIEluc3RhbGwgQm91bmN5Q2FzdGxlIHByb3ZpZGVyIHRvIGZpeCBKYXZhIGJ1aWxkcyBpc3N1ZXMgd2l0aCBKREsgNworIyBCdWlsZHMgYWNjZXNzaW5nIHJlcG90ZSByZXBvc2l0b3JpZXMgZmFpbCBhcyBzZWVuIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS90cmF2aXMtY2kvdHJhdmlzLWNpL2lzc3Vlcy84NTAzCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEJvdW5jeUNhc3RsZSBKQ0UgUHJvdmlkZXIgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiY3Byb3YtamF2YSAmJiBcCisgICAgbG4gLXMgL3Vzci9zaGFyZS9qYXZhL2JjcHJvdi5qYXIgL3Vzci9saWIvanZtL2phdmEtNy1vcGVuamRrLWFtZDY0L2pyZS9saWIvZXh0L2JjcHJvdi5qYXIgJiYgXAorICAgIGF3ayAtRiAuIC12IE9GUz0uICdCRUdJTntuPTJ9L15zZWN1cml0eVwucHJvdmlkZXIvIHtzcGxpdCgkMywgcG9zQW5kRXF1YWxzLCAiPSIpOyQzPW4rKyI9InBvc0FuZEVxdWFsc1syXTtwcmludDtuZXh0fSAxJyAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkgPiAvdG1wL2phdmEuc2VjdXJpdHkgJiYgXAorICBlY2hvICJzZWN1cml0eS5wcm92aWRlci4xPW9yZy5ib3VuY3ljYXN0bGUuamNlLnByb3ZpZGVyLkJvdW5jeUNhc3RsZVByb3ZpZGVyIiA+PiAvdG1wL2phdmEuc2VjdXJpdHkgJiYgXAorICBtdiAvdG1wL2phdmEuc2VjdXJpdHkgL2V0Yy9qYXZhLTctb3Blbmpkay9zZWN1cml0eS9qYXZhLnNlY3VyaXR5CisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDhjYmM5MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9yZWZyZXNoLnNoCkBAIC0wLDAgKzEsODIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBUaGUgYnVpbGQgaGFzIHR3byBzdGFnZXM6ICJkb2NrZXIiIGFuZCAidGVzdCIKKyMgVGhlICJkb2NrZXIiIHN0YWdlIGlzIG1lYW50IHRvIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZXMKKyMgICBpZiBuZWVkZWQuICBJZiB3ZSBjYW5ub3QgcHVzaCB0aGF0IHJlc3VsdCBob3dldmVyIHRoZW4KKyMgICB0aGVyZSBpcyBubyByZWFzb24gdG8gZG8gYW55dGhpbmcuCisjIFRoZSAidGVzdCIgc3RhZ2UgaXMgYW4gYWN0dWFsIHRlc3Qgam9iLiAgRXZlbiBpZiB0aGUgZG9ja2VyCisjICAgaW1hZ2UgZG9lc24ndCBtYXRjaCB3aGF0J3MgaW4gdGhlIHJlcG8sIHdlIHN0aWxsIGJ1aWxkCisjICAgdGhlIGltYWdlIHNvIHRoZSBidWlsZCBqb2IgY2FuIHJ1biBwcm9wZXJseS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK0RPQ0tFUl9UQUc9JERPQ0tFUl9SRVBPOiRESVNUUk8KKworZnVuY3Rpb24gZG9ja2VyZmlsZV9jaGFuZ2VkIHsKKyAgIyBpbWFnZSBtYXkgbm90IGV4aXN0IHlldCwgc28gd2UgaGF2ZSB0byBsZXQgaXQgZmFpbCBzaWxlbnRseToKKyAgZG9ja2VyIHB1bGwgJERPQ0tFUl9UQUcgfHwgdHJ1ZQorICBkb2NrZXIgcnVuICRET0NLRVJfVEFHIGJhc2ggLWMgJ2NkIC4uICYmIHNoYTUxMnN1bSBEb2NrZXJmaWxlJyA+IC5Eb2NrZXJmaWxlLnNoYTUxMgorICBzaGE1MTJzdW0gLWMgLkRvY2tlcmZpbGUuc2hhNTEyCit9CisKKyMKKyMgSWYgdGhpcyBidWlsZCBoYXMgbm8gRE9DS0VSX1BBU1MgYW5kIGl0IGlzIGluIHRoZSBkb2NrZXIgc3RhZ2UKKyMgdGhlbiB0aGVyZSdzIG5vIHJlYXNvbiB0byBkbyBhbnkgcHJvY2Vzc2luZyBiZWNhdXNlIHdlIGNhbm5vdAorIyBwdXNoIHRoZSByZXN1bHQgaWYgdGhlIERvY2tlcmZpbGUgY2hhbmdlZC4gIAorIworCitpZiBbWyAiJFRSQVZJU19CVUlMRF9TVEFHRSIgPT0gImRvY2tlciIgXV0gJiYgW1sgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4KKyAgZWNobyBEZXRlY3RlZCBkb2NrZXIgc3RhZ2UgYnVpbGQgYW5kIG5vIGRlZmluZWQgRE9DS0VSX1BBU1MsIHRoaXMgYnVpbGQgam9iIHdpbGwgYmUgc2tpcHBlZC4KKyAgZWNobyBTdWJzZXF1ZW50IGpvYnMgaW4gdGhlIHRlc3Qgc3RhZ2UgbWF5IGVhY2ggcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlLgorICBleGl0IDAKK2ZpCisKKworcHVzaGQgJHtTQ1JJUFRfRElSfS8kRElTVFJPCitpZiBkb2NrZXJmaWxlX2NoYW5nZWQ7IHRoZW4KKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBub3QgY2hhbmdlZC4gIE5vIG5lZWQgdG8gcmVidWlsZC4KKyAgZXhpdCAwCitlbHNlCisgIGVjaG8gRG9ja2VyZmlsZSBoYXMgY2hhbmdlZC4KK2ZpCitwb3BkCisKKyMKKyMgRG9ja2VyZmlsZSBoYXMgY2hhbmdlZCAtIHJlYnVpbGQgaXQgZm9yIHRoZSBjdXJyZW50IGJ1aWxkIGpvYi4KKyMgSWYgaXQgaXMgYSAiZG9ja2VyIiBzdGFnZSBidWlsZCB0aGVuIHdlIHdhbnQgdG8gcHVzaCBpdCBiYWNrCisjIHRvIHRoZSBET0NLRVJfUkVQTy4gIElmIGl0IGlzIGEgInRlc3QiIHN0YWdlIGJ1aWxkIHRoZW4gd2UgZG8KKyMgbm90LiAgSWYgbm9ib2R5IGRlZmluZWQgYSBET0NLRVJfUEFTUyB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyLgorIworCitlY2hvIFJlYnVpbGRpbmcgZG9ja2VyIGltYWdlICRESVNUUk8KK2RvY2tlciBidWlsZCAtLXRhZyAkRE9DS0VSX1RBRyBidWlsZC9kb2NrZXIvJERJU1RSTworCitpZiBbWyAiJFRSQVZJU19CVUlMRF9TVEFHRSIgPT0gImRvY2tlciIgXV0gJiYgW1sgISAteiAiJERPQ0tFUl9VU0VSIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1BBU1MiIF1dOyB0aGVuIAorICBlY2hvIFB1c2hpbmcgZG9ja2VyIGltYWdlICRET0NLRVJfVEFHCisgIGRvY2tlciBsb2dpbiAtdSAkRE9DS0VSX1VTRVIgLXAgJERPQ0tFUl9QQVNTCisgIGRvY2tlciBwdXNoICRET0NLRVJfVEFHCitlbHNlCisgIGVjaG8gTm90IHB1c2hpbmcgZG9ja2VyIGltYWdlOiBlaXRoZXIgbm90IGEgZG9ja2VyIHN0YWdlIGJ1aWxkIGpvYiwgb3Igb25lIG9mIERPQ0tFUl9VU0VSIG9yIERPQ0tFUl9QQVNTIGlzIHVuZGVmaW5lZC4KK2ZpCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9ydW4uc2ggYi9idWlsZC9kb2NrZXIvcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmZTE5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvcnVuLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9iYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK0RPQ0tFUl9UQUc9JERPQ0tFUl9SRVBPOiRESVNUUk8KKworcHJpbnRlbnYgfCBzb3J0CisKK2RvY2tlciBydW4gLS1uZXQ9aG9zdCAtZSBCVUlMRF9MSUJTPSIkQlVJTERfTElCUyIgJEJVSUxEX0VOViAtdiAkKHB3ZCk6L3RocmlmdC9zcmMgXAorCS1pdCAkRE9DS0VSX1RBRyBidWlsZC9kb2NrZXIvc2NyaXB0cy8kU0NSSVBUICRCVUlMRF9BUkcKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgzODhmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKQEAgLTAsMCArMSw2IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGNoZWNrIC1qMwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jY2MzMTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY21ha2Uuc2gKQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKK0NNQUtFX0ZMQUdTPSQqCitNQUtFUFJPRz1tYWtlCisKK2lmIG5pbmphIC0tdmVyc2lvbiAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIE1BS0VQUk9HPW5pbmphCisgIENNQUtFX0ZMQUdTPSItR05pbmphICRDTUFLRV9GTEFHUyIKK2ZpCisKK21rZGlyIC1wIGNtYWtlX2J1aWxkICYmIGNkIGNtYWtlX2J1aWxkCitjbWFrZSAkQ01BS0VfRkxBR1MgLi4KK2ZvciBMSUIgaW4gJEJVSUxEX0xJQlM7IGRvCisgIGlmICEgZ3JlcCAiXkJVSUxEXyR7TElCfTpCT09MPU9OJCIgQ01ha2VDYWNoZS50eHQgOyB0aGVuCisgICAgZWNobyAiZmFpbGVkIHRvIGNvbmZpZ3VyZSAkTElCIgorICAgIGV4aXQgMQorICBmaQorZG9uZQorJE1BS0VQUk9HIC1qMworY3BhY2sKK2N0ZXN0IC1WViAtRSAiKHB5dGhvbl90ZXN0KSIKKyMgZGlzYWJsZWQgY21ha2UgcHl0aG9uX3Rlc3QgZm9yIG5vdyBzaW5jZSBpdCBmYWlscyBpbiB0cmF2aXMgdW5kZXIgY2VudG9zCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jb3ZzY2FuLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjNmMjgzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaApAQCAtMCwwICsxLDUwIEBACisjCisjIENvdmVyaXR5IFNjYW4gVHJhdmlzIGJ1aWxkIHNjcmlwdAorIyBUbyBydW4gdGhpcyBpbnRlcmFjdGl2ZWx5LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB5b3Vyc2VsZiwKKyMgYW5kIHJ1biB0aGlzIGluc2lkZSBhIGRvY2tlciBjb250YWluZXIuCisjCisjIENvbW1hbmQtTGluZSBBcmd1bWVudHMKKyMKKyMgLS1za2lwZG93bmxvYWQgICB0byBza2lwIHJlLWRvd25sb2FkaW5nIHRoZSBDb3Zlcml0eSBTY2FuIGJ1aWxkIHBhY2thZ2UgKGxhcmdlKQorIworIyBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKHJlcXVpcmVkKQorIworIyBDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCAgLSBlbWFpbCBhZGRyZXNzIHRvIG5vdGlmeQorIyBDT1ZFUklUWV9TQ0FOX1RPS0VOICAgICAgICAgICAgICAgLSB0aGUgQ292ZXJpdHkgU2NhbiB0b2tlbiAoc2hvdWxkIGJlIHNlY3VyZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChkZWZhdWx0ZWQpCisjCisjIENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORCAgICAgICAtIGRlZmF1bHRzIHRvICJidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2giCisjIENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04gICAgICAgICAtIGRlZmF1bHRzIHRvIFRSQVZJU19CUkFOQ0ggb3IgIm1hc3RlciIgaWYgZW1wdHkKKyMgQ09WRVJJVFlfU0NBTl9QUk9KRUNUICAgICAgICAgICAgIC0gZGVmYXVsdHMgdG8gInRocmlmdCIKKworc2V0IC1leAorCitDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ9JHtDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQ6LWJ1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaH0KK0NPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT049JHtDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OOi0ke1RSQVZJU19CUkFOQ0g6LW1hc3Rlcn19CitDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q9JHtDT1ZFUklUWV9TQ0FOX1BST0pFQ1Q6LXRocmlmdH0KKworIyBkb3dubG9hZCB0aGUgY292ZXJpdHkgc2NhbiBwYWNrYWdlCisKK3B1c2hkIC90bXAKK2lmIFtbICIkMSIgIT0gIi0tc2tpcGRvd25sb2FkIiBdXTsgdGhlbgorICBybSAtcmYgY292ZXJpdHlfdG9vbC50Z3ogY292LWFuYWx5c2lzKgorICB3Z2V0IGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vZG93bmxvYWQvbGludXg2NCAtLXBvc3QtZGF0YSAidG9rZW49JENPVkVSSVRZX1NDQU5fVE9LRU4mcHJvamVjdD0kQ09WRVJJVFlfU0NBTl9QUk9KRUNUIiAtTyBjb3Zlcml0eV90b29sLnRnegorICB0YXIgeHpmIGNvdmVyaXR5X3Rvb2wudGd6CitmaQorQ09WQklOPSQoZWNobyAkKHB3ZCkvY292LWFuYWx5c2lzKi9iaW4pCitleHBvcnQgUEFUSD0kQ09WQklOOiRQQVRICitwb3BkCisKKyMgYnVpbGQgdGhlIHByb2plY3Qgd2l0aCBjb3Zlcml0eSBzY2FuCisKK3JtIC1yZiBjb3YtaW50LworY292LWJ1aWxkIC0tZGlyIGNvdi1pbnQgJENPVkVSSVRZX1NDQU5fQlVJTERfQ09NTUFORAordGFyIGNKZiBjb3YtaW50LnRhci54eiBjb3YtaW50LworY3VybCAtLWZvcm0gdG9rZW49IiRDT1ZFUklUWV9TQ0FOX1RPS0VOIiBcCisgICAgIC0tZm9ybSBlbWFpbD0iJENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMIiBcCisgICAgIC0tZm9ybSBmaWxlPUBjb3YtaW50LnRhci54eiBcCisgICAgIC0tZm9ybSB2ZXJzaW9uPSIkKGdpdCBkZXNjcmliZSAtLXRhZ3MpIiBcCisgICAgIC0tZm9ybSBkZXNjcmlwdGlvbj0iJENPVkVSSVRZX1NDQU5fREVTQ1JJUFRJT04iIFwKKyAgICAgaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9idWlsZHM/cHJvamVjdD0iJENPVkVSSVRZX1NDQU5fUFJPSkVDVCIKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDM1ODFhNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Nyb3NzLXRlc3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL3NoCitzZXQgLWV2CisKKy4vYm9vdHN0cmFwLnNoCisuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworbWFrZSAtajMgcHJlY3Jvc3MKKworc2V0ICtlCittYWtlIGNyb3NzJDEKKworUkVUPSQ/CitpZiBbICRSRVQgLW5lIDAgXTsgdGhlbgorICBjYXQgdGVzdC9sb2cvdW5leHBlY3RlZF9mYWlsdXJlcy5sb2cKK2ZpCisKK2V4aXQgJFJFVApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvZHBrZy5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2JhMGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2Rwa2cuc2gKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworZHBrZy1idWlsZHBhY2thZ2UgLXRjIC11cyAtdWMKK2xzIC1hbCAuLgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvbWFrZS1kaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVhMzY4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9tYWtlLWRpc3Quc2gKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKK3NldCAtZXYKKworLi9ib290c3RyYXAuc2gKKy4vY29uZmlndXJlICQqCittYWtlIGRpc3QKK3RhciB4dmYgdGhyaWZ0LSoudGFyLmd6CitjZCB0aHJpZnQtKgorLi9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaApkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE2ZDU4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy9zY2Euc2gKQEAgLTAsMCArMSw2NiBAQAorIyEvYmluL2Jhc2gKK3NldCAtZXYKKworIworIyBHZW5lcmF0ZSB0aHJpZnQgZmlsZXMgc28gdGhlIHN0YXRpYyBjb2RlIGFuYWx5c2lzIGluY2x1ZGVzIGFuIGFuYWx5c2lzCisjIG9mIHRoZSBmaWxlcyB0aGUgdGhyaWZ0IGNvbXBpbGVyIHNwaXRzIG91dC4gIElmIHJ1bm5pbmcgaW50ZXJhY3RpdmVseQorIyBzZXQgdGhlIE5PQlVJTEQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2tpcCB0aGUgYm9vdC9jb25maWcvbWFrZSBwaGFzZS4KKyMKKworaWYgW1sgLXogIiROT0JVSUxEIiBdXTsgdGhlbgorICAuL2Jvb3RzdHJhcC5zaAorICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS10dXRvcmlhbD1ubworICBtYWtlIC1qMyBwcmVjcm9zcworZmkKKworIworIyBDL0MrKyBzdGF0aWMgY29kZSBhbmFseXNpcyB3aXRoIGNwcGNoZWNrCisjIGFkZCAtLWVycm9yLWV4aXRjb2RlPTEgdG8gLS1lbmFibGU9YWxsIGFzIHNvb24gYXMgZXZlcnl0aGluZyBpcyBmaXhlZAorIworIyBQeXRob24gY29kZSBzdHlsZSBjaGVjayB3aXRoIGZsYWtlOAorIworIyBzZWFyY2ggZm9yIFRPRE8gZXRjIHdpdGhpbiBzb3VyY2UgdHJlZQorIyBzb21lIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGNvZGUgYmFzZQorIyBzb21lIGluZm8gYWJvdXQgdGhlIGJ1aWxkIG1hY2hpbmUKKworIyBDb21waWxlciBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgY29tcGlsZXIvY3BwL3NyYworCisjIEMrKyBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAorCisjIEMgR2xpYiBjcHBjaGVjayAoQWxsKQorY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKKworIyBTaWxlbnQgZXJyb3IgY2hlY2tzCisjIFNlZSBUSFJJRlQtNDM3MSA6IGZsZXggZ2VuZXJhdGVkIGNvZGUgdHJpZ2dlcnMgInBvc3NpYmxlIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSIgaW4geXlfaW5pdF9idWZmZXIKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLXN1cHByZXNzPSIqOnRocmlmdC90aHJpZnRsLmNjIiAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGNvbXBpbGVyL2NwcC9zcmMKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgUHl0aG9uIGNvZGUgc3R5bGUKK2ZsYWtlOCAtLWlnbm9yZT1XNTA0LEU1MDEgbGliL3B5CitmbGFrZTggLS1leGNsdWRlPXR1dG9yaWFsL3B5L2J1aWxkIHR1dG9yaWFsL3B5CisjIFRIUklGVC00MzcxIDogZ2VuZXJhdGVkIGZpbGVzIGFyZSBleGNsdWRlZCBiZWNhdXNlIHRoZXkgaGF2ZW4ndCBiZWVuIHNjcnViYmVkIHlldAorZmxha2U4IC0taWdub3JlPUU1MDEgLS1leGNsdWRlPSIqL2dlbi1weSovKiIsdGVzdC9weS9idWlsZCB0ZXN0L3B5CitmbGFrZTggdGVzdC9weS50d2lzdGVkCitmbGFrZTggdGVzdC9weS50b3JuYWRvCitmbGFrZTggLS1pZ25vcmU9RTUwMSB0ZXN0L3Rlc3QucHkKK2ZsYWtlOCAtLWlnbm9yZT1FNTAxLEU3MjIgdGVzdC9jcm9zc3J1bm5lcgorZmxha2U4IHRlc3QvZmVhdHVyZXMKKworIyBQSFAgY29kZSBzdHlsZQorY29tcG9zZXIgaW5zdGFsbCAtLXF1aWV0CisuL3ZlbmRvci9iaW4vcGhwY3MKKworIyBUT0RPIGV0YworZWNobyBGSVhNRXM6IGBncmVwIC1yIEZJWE1FICogfCB3YyAtbGAKK2VjaG8gIEhBQ0tzOiBgZ3JlcCAtciBIQUNLICogfCB3YyAtbGAKK2VjaG8gIFRPRE9zOiBgZ3JlcCAtciBUT0RPICogfCB3YyAtbGAKKworIyBMb0MKK3Nsb2Njb3VudCAuCisKKyMgU3lzdGVtIEluZm8KK2Rwa2cgLWwKK3VuYW1lIC1hCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3Vic2FuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY1MGRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaApAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKworc2V0IC1lCisKKyMgV3JhcHMgYXV0b3Rvb2xzLnNoLCBidXQgZWFjaCBiaW5hcnkgY3Jhc2hlcyBpZiBpdCBleGhpYml0cyB1bmRlZmluZWQgYmVoYXZpb3IuIAorIyBTZXQgdGhlIHVuZGVmaW5lZCBiZWhhdmlvciBmbGFncy4gVGhpcyBjcmFzaGVzIG9uIGFsbCB1bmRlZmluZWQgYmVoYXZpb3IgZXhjZXB0IGZvcgorIyB1bmRlZmluZWQgY2FzdGluZywgYWthICJ2cHRyIi4KKyMgVE9ETzogZml4IHVuZGVmaW5lZCB2cHRyIGJlaGF2aW9yIGFuZCB0dXJuIHRoaXMgb3B0aW9uIGJhY2sgb24uCisKK2V4cG9ydCBDRkxBR1M9Ii1mc2FuaXRpemU9dW5kZWZpbmVkIC1mbm8tc2FuaXRpemUtcmVjb3Zlcj11bmRlZmluZWQgLU8wIC1nZ2RiMyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciIKK2V4cG9ydCBDWFhGTEFHUz0iJHtDRkxBR1N9IgorZXhwb3J0IExERkxBR1M9Ii1sdWJzYW4iCitleHBvcnQgVUJTQU5fT1BUSU9OUz1wcmludF9zdGFja3RyYWNlPTEKKworIworIyB3b3JrIGFyb3VuZCBodHRwczovL3N2bi5ib29zdC5vcmcvdHJhYzEwL3RpY2tldC8xMTYzMiBpZiBwcmVzZW50CisjCisKK3NlZCAtaSAncy8sIHN0cmVhbV90KHJkYnVmKCkpIC8sIHN0cmVhbV90KHBiYXNlX3R5cGU6Om1lbWJlci5nZXQoKSkvZycgL3Vzci9pbmNsdWRlL2Jvb3N0L2Zvcm1hdC9hbHRfc3N0cmVhbS5ocHAKKworIyBsbHZtLXN5bWJvbGl6ZXIgbXVzdCBiZSBvbiBQQVRIIHRvIGdldCBhIHN0YWNrIHRyYWNlIG9uIGVycm9yCisKK0NMQU5HX1BBVEg9IiQobWt0ZW1wIC1kKSIKK3RyYXAgInJtIC1yZiAke0NMQU5HX1BBVEh9IiBFWElUCitsbiAtcyAiJCh3aGVyZWlzIGxsdm0tc3ltYm9saXplci00LjAgIHwgcmV2IHwgY3V0IC1kICcgJyAtZiAxIHwgcmV2KSIgXAorICAiJHtDTEFOR19QQVRIfS9sbHZtLXN5bWJvbGl6ZXIiCitleHBvcnQgUEFUSD0iJHtDTEFOR19QQVRIfToke1BBVEh9IgorbGx2bS1zeW1ib2xpemVyIC12ZXJzaW9uCisKK2J1aWxkL2RvY2tlci9zY3JpcHRzL2F1dG90b29scy5zaCAkKgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS1hcnRmdWwvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODRkMQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzAgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IEFydGZ1bAorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IEFydGZ1bCBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBjcHA6IHN0b2NrIGJvb3N0IDEuNjIgaW4gYXJ0ZnVsIGhhcyBhIG5hc3R5IGJ1ZyBzbyB3ZSB1c2Ugc3RvY2sgYm9vc3QgMS42MworIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dS4gUGlubmVkIHRvIGxhc3QgMS54IHJlbGVhc2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBoYXhlOiB2ZXJzaW9uIDMuNC4yIHRoYXQgY29tZXMgd2l0aCBVYnVudHUgY29yZXMgaW4gb3VyIENJIGJ1aWxkCisjIC0gZ286IGFydGZ1bCBjb21lcyB3aXRoIDEuOSwgd2Ugd2FudCB0aGUgbGF0ZXN0IChzdXBwb3J0ZWQpCisjIC0gbm9kZWpzOiB3YW50IHY4LCBhcnRmdWwgY29tZXMgd2l0aCB2NgorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOmFydGZ1bC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKSAtIGlmIHdlIGV2ZXIgd2FudCBhIGxhdGVyIHZlcnNpb24KKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKKworIyBkb3RuZXQgKG5ldGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS1hcnRmdWwtcHJvZCBhcnRmdWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIGhheGUgKGh0dHBzOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgvKQorUlVOIGFkZC1hcHQtcmVwb3NpdG9yeSBwcGE6aGF4ZS9yZWxlYXNlcyAteQorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfOC54IGFydGZ1bCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIGJvb3N0LTEuNjIgaGFzIGEgdGVycmlibGUgYnVnIGluIGJvb3N0Ojp0ZXN0LCBzZWUgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTI1MDcKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QxLjYzLWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgU0JDTF9WRVJTSU9OIDEuNC41CitSVU4gXAorYCMgQ29tbW9uIExpc3AgKHNiY2wpIGRlcGVuZGVuY2llc2AgXAorICAgIGN1cmwgLS12ZXJzaW9uICYmIFwKKyAgICBjdXJsIC1PIC1KIC1MIGh0dHBzOi8va2VudC5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zYmNsL3NiY2wvJHtTQkNMX1ZFUlNJT059L3NiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eC1iaW5hcnkudGFyLmJ6MiAmJiBcCisgICAgdGFyIHhqZiBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIGNkIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eCAmJiBcCisgICAgLi9pbnN0YWxsLnNoICYmIFwKKyAgICBzYmNsIC0tdmVyc2lvbiAmJiBcCisgICAgcm0gLXJmIHNiY2wqCisKK0VOViBEX1ZFUlNJT04gICAgIDIuMDgwLjAKK0VOViBETURfREVCICAgICAgIGRtZF8yLjA4MC4wLTBfYW1kNjQuZGViCitSVU4gXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICB3Z2V0IC1xIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8ke0RfVkVSU0lPTn0vJHtETURfREVCfSAmJiBcCisgICAgZHBrZyAtLWluc3RhbGwgJHtETURfREVCfSAmJiBcCisgICAgcm0gLWYgJHtETURfREVCfSAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtbWFzdGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xLjQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS4xMAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYjVhNjQzMzVmMTQ5MDI3N2I1ODU4MzJkMWY2YzdmOGM2YzExMjA2Y2JhNWNkM2Y3NzFkY2I4N2I5OGFkMWEzMworUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyEKKyMgbmVlZCB0byB1cGRhdGUgb3VyIGx1YXNvY2tldCBjb2RlLCBsdWEgZG9lc24ndCBoYXZlIGx1YUxfb3BlbmxpYiBhbnkgbW9yZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1jbGkgXAorICAgICAgcGhwLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uMyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgU3RhdGljIENvZGUgQW5hbHlzaXMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjcHBjaGVjayBcCisgICAgICBzbG9jY291bnQgJiYgXAorICAgIHBpcCBpbnN0YWxsIGZsYWtlOAorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2M5OWE5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3OSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgQmlvbmljCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgQmlvbmljIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGNsOiB3YW50IGxhdGVzdAorIyAtIGQ6IGRtZCBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dS4gUGlubmVkIHRvIGxhc3QgMS54IHJlbGVhc2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBnbzogd2FudCBsYXRlc3QKKyMgLSBub2RlanM6IHdhbnQgdjgsIGJpb25pYyBjb21lcyB3aXRoIHY2CisjCisKK0ZST00gYnVpbGRwYWNrLWRlcHM6YmlvbmljLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBcCisgICAgYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkgJiYgXAorICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBhcHQgXAorICAgICAgYXB0LXRyYW5zcG9ydC1odHRwcyBcCisgICAgICBhcHQtdXRpbHMgXAorICAgICAgY3VybCBcCisgICAgICBkaXJtbmdyIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pIC0gaWYgd2UgZXZlciB3YW50IGEgbGF0ZXIgdmVyc2lvbgorIyBSVU4gZWNobyAiZGViIGh0dHA6Ly9kb3dubG9hZC5tb25vLXByb2plY3QuY29tL3JlcG8vZGViaWFuIHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9tb25vLmxpc3QgJiYgXAorIyAgICAgYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgQTZBMTlCMzhEM0Q4MzFFRgorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjI0LjMtMQorCisjIGRvdG5ldCAobmV0Y29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICB3Z2V0IC1xIC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21pY3Jvc29mdC1wcm9kLmxpc3QgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2NvbmZpZy91YnVudHUvMTguMDQvcHJvZC5saXN0ICYmIFwKKyAgICBjaG93biByb290OnJvb3QgL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBjaG93biByb290OnJvb3QgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbWljcm9zb2Z0LXByb2QubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfOC54IGJpb25pYyBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tNi4wL2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWFsbC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgU0JDTF9WRVJTSU9OIDEuNC4xNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtbyBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgLUogLUwgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvc2JjbC9maWxlcy9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIvZG93bmxvYWQ/dXNlX21pcnJvcj1tYW5hZ2Vkd2F5IyAmJiBcCisgICAgdGFyIHhqZiBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIGNkIHNiY2wtJHtTQkNMX1ZFUlNJT059LXg4Ni02NC1saW51eCAmJiBcCisgICAgLi9pbnN0YWxsLnNoICYmIFwKKyAgICBzYmNsIC0tdmVyc2lvbiAmJiBcCisgICAgY2QgLi4gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4My4xCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODMuMS0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBnaXQgY2xvbmUgLWIgJ3YyLjAuMisyLjAuMTYnIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC5naXQgZGVpbW9zLWxpYmV2ZW50LTIuMCAmJiBcCisgICAgbXYgZGVpbW9zLWxpYmV2ZW50LTIuMC9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBkZWltb3MtbGliZXZlbnQtMi4wL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGRlaW1vcy1saWJldmVudC0yLjAgJiYgXAorICAgIGdpdCBjbG9uZSAtYiAndjIuMC4wKzEuMS4waCcgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wuZ2l0IGRlaW1vcy1vcGVuc3NsLTEuMS4waCAmJiBcCisgICAgbXYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGRlaW1vcy1vcGVuc3NsLTEuMS4waC9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisgICAgICBgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS4xMS40CitFTlYgR09MQU5HX0RPV05MT0FEX1VSTCBodHRwczovL2dvbGFuZy5vcmcvZGwvZ28kR09MQU5HX1ZFUlNJT04ubGludXgtYW1kNjQudGFyLmd6CitFTlYgR09MQU5HX0RPV05MT0FEX1NIQTI1NiBmYjI2YzMwZTZhMDRhZDkzN2JiYzY1N2ExYjViYmE5MmY4MDA5NmFmMWU4ZWU2ZGE2NDMwYzA0NWE4ZGIzYTViCitSVU4gY3VybCAtZnNTTCAiJEdPTEFOR19ET1dOTE9BRF9VUkwiIC1vIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgZWNobyAiJEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgIGdvbGFuZy50YXIuZ3oiIHwgc2hhMjU2c3VtIC1jIC0gJiYgXAorICAgICAgICAgICAgdGFyIC1DIC91c3IvbG9jYWwgLXh6ZiBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgICAgICAgICAgICAgIGxuIC1zIC91c3IvbG9jYWwvZ28vYmluL2dvIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtIGdvbGFuZy50YXIuZ3oKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2ICYmIFwKKyAgICBoYXhlbGliIHNldHVwIC0tYWx3YXlzIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCAtLWFsd2F5cyBoeGNwcCAyPiYxID4gL2Rldi9udWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbiAmJiBcCisgICAgdXBkYXRlLWFsdGVybmF0aXZlcyAtLXNldCBqYXZhIC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NC9qcmUvYmluL2phdmEKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBMdWEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsdWE1LjIgXAorICAgICAgbHVhNS4yLWRldgorIyBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9sdWE1LjMvK2J1Zy8xNzA3MjEyCisjIGx1YTUuMyBkb2VzIG5vdCBpbnN0YWxsIGFsdGVybmF0aXZlcyEKKyMgbmVlZCB0byB1cGRhdGUgb3VyIGx1YXNvY2tldCBjb2RlLCBsdWEgZG9lc24ndCBoYXZlIGx1YUxfb3BlbmxpYiBhbnkgbW9yZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBvY2FtbCBcCisgICAgICBvcGFtICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1jbGkgXAorICAgICAgcGhwLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uMyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXYgXAorICAgICAgcnVieS1idW5kbGVyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNhcmdvIFwKKyAgICAgIHJ1c3RjCisKKyMgU3dpZnQgb24gTGludXggZm9yIGNyb3NzIHRlc3RzCitSVU4gY2QgLyAmJiBcCisgICAgd2dldCAtLXF1aWV0IGh0dHBzOi8vc3dpZnQub3JnL2J1aWxkcy9zd2lmdC00LjIuMS1yZWxlYXNlL3VidW50dTE4MDQvc3dpZnQtNC4yLjEtUkVMRUFTRS9zd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAmJiBcCisgICAgdGFyIHhmIHN3aWZ0LTQuMi4xLVJFTEVBU0UtdWJ1bnR1MTguMDQudGFyLmd6IC0tc3RyaXAtY29tcG9uZW50cz0xICYmIFwKKyAgICBybSBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAmJiBcCisgICAgc3dpZnQgLS12ZXJzaW9uCisKKyMgY3BwY2hlY2stMS44MiBoYXMgYSBuYXN0eSBjcHAgcGFyc2VyIGJ1Zywgc28gd2UncmUgdXNpbmcgc29tZXRoaW5nIG5ld2VyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTggJiYgXAorICAgIHdnZXQgLXEgImh0dHBzOi8vbGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9jcHBjaGVjay8xLjgzLTIvK2J1aWxkLzE0ODc0NzAzLytmaWxlcy9jcHBjaGVja18xLjgzLTJfYW1kNjQuZGViIiAmJiBcCisgICAgZHBrZyAtaSBjcHBjaGVja18xLjgzLTJfYW1kNjQuZGViICYmIFwKKyAgICBybSBjcHBjaGVja18xLjgzLTJfYW1kNjQuZGViCisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUteGVuaWFsL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzJiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBYZW5pYWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBYZW5pYWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gZDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDIuMDc1LjEgZm9yIGNvdmVyYWdlCisjIC0gZGFydDogZG9lcyBub3QgY29tZSB3aXRoIFVidW50dSBzbyB3ZSdyZSBpbnN0YWxsaW5nIDEuMjIuMSBmb3IgY292ZXJhZ2UKKyMgLSBkb3RuZXQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUKKyMgLSBnbzogWGVuaWFsIGNvbWVzIHdpdGggMS42LCBidXQgd2UgbmVlZCAxLjcgb3IgbGF0ZXIKKyMgLSBub2RlanM6IFhlbmlhbCBjb21lcyB3aXRoIDQuMi42IHdoaWNoIGV4aXRzIExUUyBBcHJpbCAyMDE4LCBzbyB3ZSdyZSBpbnN0YWxsaW5nIDYueAorIyAtIG9jYW1sOiBjYXVzZXMgc3RhY2sgb3ZlcmZsb3cgZXJyb3IsIGp1c3Qgc3RhcnRlZCBNYXJjaCAyMDE4IG5vdCBzdXJlIHdoeQorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOnhlbmlhbC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykKKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBECitSVU4gYXB0LWtleSBhZHYgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2LWtleXMgRUJDRjk3NUU1QkEyNEQ1RSAmJiBcCisgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgd2dldCAtcU8gLSBodHRwczovL2RsYW5nLm9yZy9kLWtleXJpbmcuZ3BnIHwgYXB0LWtleSBhZGQgLQorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorRU5WIERBUlRfVkVSU0lPTiAxLjIyLjEtMQorCisjIGRvdG5ldCAoY29yZSkKK1JVTiBjdXJsIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9rZXlzL21pY3Jvc29mdC5hc2MgfCBncGcgLS1kZWFybW9yID4gL2V0Yy9hcHQvdHJ1c3RlZC5ncGcuZC9taWNyb3NvZnQuZ3BnICYmIFwKKyAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LXhlbmlhbC1wcm9kIHhlbmlhbCBtYWluIiA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgbm9kZS5qcworUlVOIGN1cmwgLXNMIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL2dwZ2tleS9ub2Rlc291cmNlLmdwZy5rZXkgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBlY2hvICJkZWIgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vbm9kZV82LnggeGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL25vZGVzb3VyY2UubGlzdAorCisjIyMgaW5zdGFsbCBnZW5lcmFsIGRlcGVuZGVuY2llcworUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAorICAgICAgYmFzaC1jb21wbGV0aW9uIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbWFrZSBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBnZGIgXAorICAgICAgbGx2bSBcCisgICAgICBuaW5qYS1idWlsZCBcCisgICAgICBwa2ctY29uZmlnIFwKKyAgICAgIHZhbGdyaW5kIFwKKyAgICAgIHZpbQorRU5WIFBBVEggL3Vzci9saWIvbGx2bS0zLjgvYmluOiRQQVRICisKKyMjIyBsYW5ndWFnZXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1kZXYgXAorICAgICAgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBcCisgICAgICBsaWJib29zdC1zeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRlc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXRocmVhZC1kZXYgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgcXQ1LWRlZmF1bHQgXAorICAgICAgcXRiYXNlNS1kZXYgXAorICAgICAgcXRiYXNlNS1kZXYtdG9vbHMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBjc2hhcnAgKG1vbm8pIGRlcGVuZGVuY2llc2AgXAorICAgICAgbW9uby1kZXZlbAorCitFTlYgRF9WRVJTSU9OIDIuMDc1LjEtMAorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLWFsbG93LXVuYXV0aGVudGljYXRlZCAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0kRF9WRVJTSU9OIFwKKyAgICAgIGxpYnBob2JvczItZGV2PSREX1ZFUlNJT04gXAorICAgICAgZHViPTEuNi4wLTAgXAorICAgICAgZGZtdCBcCisgICAgICBkc2Nhbm5lciBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICB4ZGctdXRpbHMKK1JVTiBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKK1JVTiBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS92MS4xLjYrMS4wLjFnLnRhci5neiB8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC0xLjEuNi0xLjAuMWcvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC0xLjEuNi0xLjAuMWcvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC0xLjEuNi0xLjAuMWcKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0kREFSVF9WRVJTSU9OCitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGRvdG5ldCBjb3JlIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG90bmV0LXNkay0yLjEuNAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdsaWJDIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliZ2xpYjIuMC1kZXYKKworIyBnb2xhbmcKK0VOViBHT0xBTkdfVkVSU0lPTiAxLjcuNgorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgYWQ1ODA4YmY0MmIwMTRjMjJkZDc2NDY0NThmNjMxMzg1MDAzMDQ5ZGVkMGJiNmFmMmVmYzdmMWY3OWZhMjllYQorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICBybSBnb2xhbmcudGFyLmd6CisKKyMgZHVlIHRvIGEgYnVnIGluIGNhYmFsIGluIHhlbmlhbCAoY2FiYWwtaW5zdGFsbCBwYWNrYWdlKSB3ZSBwdWxsIGluIGFub3RoZXI6CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgJiYgXAorICAgIGNkIC90bXAgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly93d3cuaGFza2VsbC5vcmcvY2FiYWwvcmVsZWFzZS9jYWJhbC1pbnN0YWxsLTEuMjQuMC4yL2NhYmFsLWluc3RhbGwtMS4yNC4wLjIteDg2XzY0LXVua25vd24tbGludXgudGFyLmd6ICYmIFwKKyAgICB0YXIgeHpmIGNhYmFsLWluc3RhbGwtMS4yNC4wLjIteDg2XzY0LXVua25vd24tbGludXgudGFyLmd6ICYmIFwKKyAgICBmaW5kIGRpc3QtbmV3c3R5bGUvIC10eXBlIGYgLW5hbWUgY2FiYWwgLWV4ZWMgbXYge30gL3Vzci9iaW4gXDsgJiYgXAorICAgIHJtIC1yZiAvdG1wL2NhYmFsKiAmJiBcCisgICAgY2FiYWwgLS12ZXJzaW9uCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiBcCisgICAgICBsaWJuZWtvMCAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMy40LjY0IDI+JjEgPiAvZGV2L251bGwKKyMgbm90ZTogaHhjcHAgMy40LjE4NSAobGF0ZXN0KSBubyBsb25nZXIgc2hpcHMgc3RhdGljIGxpYnJhcmllcywgYW5kIGNhdXNlZCBhIGJ1aWxkIGZhaWx1cmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMgc28gc3RpY2sgd2l0aCA1LjIgaGVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworIyBUZXN0IGRlcGVuZGVuY2llcyBmb3IgcnVubmluZyBwdXBwZXRlZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSlMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJ4c3MxIFwKKyAgICAgIGxpYmF0ay1icmlkZ2UyLjAtMCBcCisgICAgICBsaWJndGstMy0wCisKKyMgVEhSSUZULTQ1MTc6IGNhdXNlcyBzdGFjayBvdmVyZmxvd3M7IHZlcnNpb24gdG9vIG9sZDsgc2tpcCBvY2FtbCBpbiB4ZW5pYWwKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorIyAgICAgICBvY2FtbCBcCisjICAgICAgIG9wYW0gJiYgXAorIyAgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyMgICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNy4wIFwKKyAgICAgIHBocDcuMC1jbGkgXAorICAgICAgcGhwNy4wLWRldiBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIGNvbXBvc2VyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUHl0aG9uIGRlcGVuZGVuY2llc2AgXAorICAgICAgcHl0aG9uLWFsbCBcCisgICAgICBweXRob24tYWxsLWRiZyBcCisgICAgICBweXRob24tYWxsLWRldiBcCisgICAgICBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSBcCisgICAgICBweXRob24taXBhZGRyZXNzIFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdG9ybmFkbyBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtdG9ybmFkbyBcCisgICAgICBweXRob24zLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uMy13aGVlbCBcCisgICAgICBweXRob24zLXpvcGUuaW50ZXJmYWNlICYmIFwKKyAgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIERPVE5FVF9DTElfVEVMRU1FVFJZX09QVE9VVCAxCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2ZpeGNoYW5nZXMuc2ggYi9idWlsZC9maXhjaGFuZ2VzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjNTdiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9maXhjaGFuZ2VzLnNoCkBAIC0wLDAgKzEsMzkgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBmaXhjaGFuZ2VzIHdpbGwgdGFrZSBhIGZpbGUgYXMgaW5wdXQgYW5kIGxvb2sgZm9yIHRleHQgbWF0Y2hpbmcKKyMgdGhlIHBhdHRlcm4gW1RIUklGVC1ubm5uXSAodGhlIG51bWJlciBvZiBkaWdpdHMgaXMgbm90IGltcG9ydGFudCkKKyMgd2hpY2ggaXMgbm90IGEgbWFya2Rvd24gbGluaywgYW5kIGNoYW5nZSBpdCB0byBiZSBhIG1hcmtkb3duIGxpbmsuCisjIFRoZSB0b29sIHdyaXRlcyB0byBzdGRvdXQgc28geW91IGNhbiByZWRpcmVjdCBpdCB0byBhIHRlbXBvcmFyeQorIyBmaWxlIGFuZCB0aGVuIGNvbXBhcmUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgZmlsZSBiZWZvcmUgcmVwbGFjaW5nCisjIGl0LgorIworIyBUaGlzIHRvb2wgd2FzIGRldmVsb3BlZCBhZnRlciB0aGUgMC4xMi4wIHJlbGVhc2UgdG8gYXNzaXN0IHdpdGgKKyMgZ2VuZXJhdGlvbiBvZiBDSEFOR0VTLm1kIGNvbnRlbnQuCisjCisKK3doaWxlIElGUz0nJyByZWFkIC1yIGxpbmUgfHwgW1sgLW4gIiRsaW5lIiBdXTsgZG8KKyAgICBpZiBbWyAiJGxpbmUiID1+IF4oLiopXFsoVEhSSUZULVtbOmRpZ2l0Ol1dKylcXVteXChdKC4qKSQgXV07IHRoZW4KKyAgICAgICAgZWNobyAiJHtCQVNIX1JFTUFUQ0hbMV19WyR7QkFTSF9SRU1BVENIWzJdfV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS8ke0JBU0hfUkVNQVRDSFsyXX0pICR7QkFTSF9SRU1BVENIWzNdfSIKKyAgICBlbHNlCisgICAgICAgIGVjaG8gIiRsaW5lIgorICAgIGZpCitkb25lIDwgIiQxIgpkaWZmIC0tZ2l0IGEvYnVpbGQvdmVyYWxpZ24uc2ggYi9idWlsZC92ZXJhbGlnbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTc0NGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvdmVyYWxpZ24uc2gKQEAgLTAsMCArMSwzMTMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSB2ZXJhbGlnbiBzY3JpcHQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbnMgaW4gYWxsIG9mCisjIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGFsbCBvZiB0aGUgc3VwcG9ydGVkCisjIGxhbmd1YWdlcy4gIEl0IGlzIHVzZWQgdG8gcHJlcGFyZSBhIHJlbGVhc2Ugb3IgbW92ZSBtYXN0ZXIKKyMgZm9yd2FyZCB0byB0aGUgbmV4dCBhbnRpY2lwYXRlZCB2ZXJzaW9uLgorIworIyBVU0FHRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPgorIworIyBFWEFNUExFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICQgLi92ZXJhbGlnbi5zaCAwLjEyLjAgMS4wLjAKKyMgJCAuL3ZlcmFsaWduLnNoIDEuMC4wIDEuMS4wCisjCisjIElNUE9SVEFOVCBVU0FHRSBOT1RFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRFJZUlVOIHRvIGhhdmUgdGhlIHNjcmlwdAorIyBwcmludCBvdXQgYWxsIG1hdGNoZXMgdG8gdGhlIG9sZFZlcnNpb24gaGlsaWdodGVkIHNvIHRoYXQKKyMgeW91IGNhbiB2ZXJpZnkgaXQgd2lsbCBjaGFuZ2UgdGhlIHJpZ2h0IHRoaW5ncy4KKyMKKworZGVjbGFyZSAtQSBGSUxFUworCisjIFRoZXNlIGZpbGVzIHJlcXVpcmUgYSBtYW51YWwgdG91Y2g6CitGSUxFU1tDSEFOR0VTLm1kXT1tYW51YWwKK0ZJTEVTW2RlYmlhbi9jaGFuZ2Vsb2ddPW1hbnVhbAorRklMRVNbZG9hcC5yZGZdPW1hbnVhbAorCisjIFRoZXNlIGZpbGVzIGNhbiBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHk6CitGSUxFU1tBcGFjaGVUaHJpZnQubnVzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQtc3dpZnQzLnBvZHNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW1RocmlmdC5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1thcHB2ZXlvci55bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2Jvd2VyLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tidWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tjb25maWd1cmUuYWNdPWNvbmZpZ3VyZVJlcGxhY2UKK0ZJTEVTW2NvbnRyaWIvdGhyaWZ0LnNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmhdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2Qvc3JjL3RocmlmdC9iYXNlLmRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kYXJ0L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaGF4ZS9oYXhlbGliLmpzb25dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ocy90aHJpZnQuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvanMvcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbbGliL2pzL3NyYy90aHJpZnQuanNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9sdWEvVGhyaWZ0Lmx1YV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9wZXJsL2xpYi9UaHJpZnQucG1dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9weS9zZXR1cC5weV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JiL3RocmlmdC5nZW1zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcnMvQ2FyZ28udG9tbF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3N0L3BhY2thZ2UueG1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1twYWNrYWdlLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tzb25hci1wcm9qZWN0LnByb3BlcnRpZXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL29jYW1sL19vYXNpc109c2ltcGxlUmVwbGFjZQorCitpZiBbICEgLWYgIkNIQU5HRVMiIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHJ1biB2ZXJhbGlnbi5zaCB3aGlsZSBpbiB0aGUgdGhyaWZ0IHJvb3QgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorZmkKKworaWYgWyAkIyAtbmUgMiBdOyB0aGVuCisgICAgPiYyIGVjaG8gInVzYWdlOiB2ZXJhbGlnbi5zaCA8b2xkVmVyc2lvbj4gPG5ld1ZlcnNpb24+IgorICAgIGV4aXQgMQorZmkKKworanEgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHRoZSAnanEnIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCIKKyAgICBleGl0IDEKK2ZpCisKKyMKKyMgdmFsaWRhdGVWZXJzaW9uOiBjaGVjayB0aGF0IGEgdmVyc2lvbiBtYXRjaGVzIHRoZSBtYWpvci5taW5vci5wYXRjaAorIyAgIGZvcm1hdCB3aGljaCBpcyB0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBzdXBwb3J0ZWQgYnkgYWxsCisjICAgcHJvamVjdCBzeXN0ZW1zLgorIyBccGFyYW0gJDEgdGhlIHZlcnNpb24KKyMgXHJldHVybnMgMCBpZiB0aGUgdmVyc2lvbiBpcyBjb21wbGlhbnQKKyMKK2Z1bmN0aW9uIHZhbGlkYXRlVmVyc2lvbgoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIHZhbGlkCisgICAgdmFsaWQ9JChlY2hvICIkMSIgfCBzZWQgJy9eW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cKyQvIXtxMjJ9JykKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLWVxIDIyIF07IHRoZW4KKyAgICAgICAgPiYyIGVjaG8gImVycm9yOiB2ZXJzaW9uICckMScgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgcmVxdWlyZWQgbWFqb3IubWlub3IucGF0Y2ggZm9ybWF0IgorICAgICAgICByZXR1cm4gJHtyZXN1bHR9CisgICAgZmkKK30KKworT0xEVkVSU0lPTj0kMQorTkVXVkVSU0lPTj0kMgordmFsaWRhdGVWZXJzaW9uICIke09MRFZFUlNJT059IiB8fCBleGl0ICQ/Cit2YWxpZGF0ZVZlcnNpb24gIiR7TkVXVkVSU0lPTn0iIHx8IGV4aXQgJD8KKworIworIyBlc2NhcGVWZXJzaW9uOiBlc2NhcGUgdGhlIHZlcnNpb24gZm9yIHVzZSBhcyBhIHNlZCBzZWFyY2gKKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uIHRvIGVzY2FwZQorIyBcb3V0cHV0IHRoZSBlc2NhcGVkIHN0cmluZworIyBccmV0dXJucyAwCisjIFxleGFtcGxlIFZFUlNFQVJDSD0kKGVzY2FwZVZlcnNpb24gIlsxLjAuMF0iKTsgZWNobyAkVkVSU0VBUkNIOyA9PiAiXFsxXC4wXC4wXF0iCisjCitmdW5jdGlvbiBlc2NhcGVWZXJzaW9uCit7CisgICAgZWNobyAiJChlY2hvICQxIHwgc2VkICdzL1wuL1xcLi9nJyB8IHNlZCAncy9cWy9cXFxbL2cnIHwgc2VkICdzL1xdL1xcXF0vZycpIgorfQorCisjIFNldCB1cCB2ZXJib3NlIGhpbGlnaHRpbmcgaWYgcnVubmluZyBpbnRlcmFjdGl2ZQoraWYgWyAiJCh0cHV0IGNvbG9ycykiIC1uZSAwIF07IHRoZW4KKyAgICByZXZlcnNlPSQodHB1dCByZXYpCisgICAgcmVkPSQodHB1dCBzZXRhZiAxKQorICAgIGdyZWVuPSQodHB1dCBzZXRhZiAyKQorICAgIHllbGxvdz0kKHRwdXQgc2V0YWYgMykKKyAgICBub3JtYWw9JCh0cHV0IHNncjApCitmaQorCitkZWNsYXJlIC1BIE1BTlVBTAorCisjCisjIG1hbnVhbDogbm90ZSB0aGF0IHVwZGF0ZSBvZiBzYWlkIGZpbGUgaXMgbWFudWFsCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMAorIworZnVuY3Rpb24gbWFudWFsCit7CisgICAgTUFOVUFMWyIkMSJdPSIiCisgICAgcmV0dXJuIDAKK30KKworIworIyBjb25maWd1cmVSZXBsYWNlOiByZXBsYWNlIHRoZSBBQ19JTklUIGZpZWxkIGluIGNvbmZpZ3VyZS5hYworIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworCitmdW5jdGlvbiBjb25maWd1cmVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJbdGhyaWZ0XSwgWyR7T0xEVkVSU0lPTn1dIiAiW3RocmlmdF0sIFske05FV1ZFUlNJT059XSIKK30KKworIworIyBqc29uUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBKU09OIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUganNvbiBzdHJ1Y3R1cmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24ganNvblJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uIiAiJDEiKQorICAgIGVsc2UKKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uID0gXCIke05FV1ZFUlNJT059XCIiICIkMSIgPiB0bXAuJCQuanNvbiAmJiBtdiB0bXAuJCQuanNvbiAiJDEiKQorICAgIGZpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogdmVyc2lvbiB0YWcgbm90IGZvdW5kIiAiJDEiICIkY291bnQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQlXCJ9CisgICAgICAgIG91dHB1dD0ke291dHB1dCNcIn0KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8IE1BVENIRVM6ICAgdmVyc2lvbjogXCIke3JldmVyc2V9JHtncmVlbn0ke291dHB1dH0ke25vcm1hbH1cIiIgIiQxIiAxCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiIDEKKyAgICBlY2hvCisgICAgcmV0dXJuIDAKK30KKworIworIyBwdWJzcGVjUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBZQU1MIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUgeWFtbCBzdHJ1Y3R1cmUKKyMgICBkaWQgbm90IGZpbmQgYSBwYWNrYWdlIHRoYXQgcHJlc2VydmVzIGNvbW1lbnRzIHNvIHRoaXMgaXMKKyMgICBzb21ld2hhdCBicmFpbi1kZWFkLCBidXQgaXQgZ2V0cyB0aGUgam9iIGRvbmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gcHVic3BlY1JlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgInZlcnNpb246ICR7T0xEVkVSU0lPTn0iICJ2ZXJzaW9uOiAke05FV1ZFUlNJT059IgorfQorCisjCisjIHJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2Ygb25lIHN0cmluZyB3aXRoIGFub3RoZXIKKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gdGhlIG9sZCBzdHJpbmcgYXQgbGVhc3Qgb25jZQorIyAgICAgaW4gb3JkZXIgdG8gYmUgc3VjY2Vzc2Z1bC4KKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccGFyYW0gJDIgdGhlICJvbGQiIHN0cmluZyB0byBiZSByZXBsYWNlZAorIyBccGFyYW0gJDMgdGhlICJuZXciIHN0cmlpbmcgdG8gcmVwbGFjZSBpdCB3aXRoCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworZnVuY3Rpb24gcmVwbGFjZQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIG91dHB1dAorICAgIGxvY2FsIG9sZFN0cmluZz0iJDIiCisgICAgbG9jYWwgbmV3U3RyaW5nPSIkMyIKKyAgICBsb2NhbCBvbGRSZWdleD0kKGVzY2FwZVZlcnNpb24gIiR7b2xkU3RyaW5nfSIpCisgICAgbG9jYWwgY291bnQ9JChncmVwIC1FYyAiJHtvbGRSZWdleH0iICIkMSIpCisgICAgbG9jYWwgdmVyYm9zZQorICAgIGlmIFsgJGNvdW50IC1lcSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7cmVkfU5PVCBGT1VORCR7bm9ybWFsfTogJHtvbGRTdHJpbmd9IiAiJDEiIDAKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMQorICAgIGVsaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KKyAgICAgICAgICAgIGVjaG8gIiA+ICQoZWNobyAiJGxpbmUiIHwgc2VkICJzLyR7b2xkUmVnZXh9LyR7cmV2ZXJzZX0ke2dyZWVufSR7b2xkU3RyaW5nfSR7bm9ybWFsfS9nIikiCisgICAgICAgIGRvbmUgPCA8KGdyZXAgLUUgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgb3V0cHV0PSQoc2VkIC1pICJzLyR7b2xkUmVnZXh9LyR7bmV3U3RyaW5nfS9nIiAiJDEiKQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJHJlc3VsdCAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogJXMiICIkMSIgIiRjb3VudCIgIiRvdXRwdXQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiICIkY291bnQiCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgc2ltcGxlUmVwbGFjZTogcmVwbGFjZSBvY2N1cnJlbmNlcyBvZiAke09MRFZFUlNJT059IHdpdGggJHtORVdWRVJTSU9OfQorIyAgICAgdGhlIGZpbGUgc3BlY2lmaWVkIG11c3QgY29udGFpbiBPTERWRVJTSU9OIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHNpbXBsZVJlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgIiR7T0xEVkVSU0lPTn0iICIke05FV1ZFUlNJT059IgorfQorCitlY2hvICIiCitlY2hvICJBcGFjaGUgVGhyaWZ0IFZlcnNpb24gQWxpZ25tZW50IFRvb2wiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICIiCitlY2hvICJQcmV2aW91cyBWZXJzaW9uOiAke09MRFZFUlNJT059IgorZWNobyAiICAgICBOZXcgVmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK2VjaG8gIiIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ291bnQgfCBTdGF0dXMgICAgICAgICAgICAgICAiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworZm9yIGZpbGUgaW4gJChlY2hvICIkeyFGSUxFU1tAXX0iIHwgc29ydCk7IGRvCisgICAgJHtGSUxFU1skZmlsZV19ICRmaWxlIHx8IGV4aXQgJD8KK2RvbmUKKworZWNobworZWNobyAiRmlsZXMgdGhhdCBtdXN0IGJlIG1vZGlmaWVkIG1hbnVhbGx5OiIKK2VjaG8KK2ZvciBtYW51IGluICQoZWNobyAiJHshTUFOVUFMW0BdfSIgfCBzb3J0KTsgZG8KKyAgICBlY2hvICIgPiAke3llbGxvd30ke21hbnV9JHtub3JtYWx9IgorZG9uZQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9SRUFETUUubWQgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzE3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE5IEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChOYXRpdmUpCisKK1RocmlmdCB1c2VzIGNtYWtlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIHRoZSBwcm9qZWN0IG9uIG11bHRpcGxlIHBsYXRmb3JtcywgaG93ZXZlciB0byBidWlsZCBhIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHByb2R1Y3Rpb24gcmVhZHkgdGhyaWZ0IG9uIFdpbmRvd3MgcmVxdWlyZXMgYSBudW1iZXIgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJlIG9idGFpbmVkIG9yIGJ1aWx0LiAgT25jZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYXJlIHJlYWR5LCB0aGUgcmlnaHQgY29tYmluYXRpb24gb2Ygb3B0aW9ucyBtdXN0IGJlIHBhc3NlZCB0byBjbWFrZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBlbnZpcm9ubWVudC4KKworIyMgU3VtbWFyeQorCitUaGVzZSBpbnN0cnVjdGlvbnMgd2lsbCBoZWxwIHlvdSBidWlsZCB0aHJpZnQgZm9yIHdpbmRvd3MgdXNpbmcgVmlzdWFsCitTdHVkaW8gMjAxMCBvciBsYXRlci4gIFRoZSBjb250cmlidXRlZCBiYXRjaCBmaWxlcyB3aWxsIGhlbHAgeW91IGJ1aWxkCit0aGUgdGhpcmQgcGFydHkgbGlicmFyaWVzIG5lZWRlZCBmb3IgY29tcGxldGUgdGhyaWZ0IGZ1bmN0aW9uYWxpdHkgYXMKK3dlbGwgYXMgdGhyaWZ0IGl0c2VsZi4KKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGZvbGxvdyBhIGRpcmVjdG9yeSBsYXlvdXQgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICB3b3Jrc3BhY2VcCisgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSBvdXQtb2YtdHJlZSB0aHJpZnQgY21ha2UgYnVpbGRzIGFyZSBnZW5lcmF0ZWQKKyAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBidWlsZCByZXN1bHRzIGVuZCB1cAorICAgICAgdGhpcmRwYXJ0eVwgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgYmluYXJpZXMgYW5kIGxpYnJhcmllcyBsaXZlCisgICAgICAgIGJ1aWxkXCAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IG91dC1vZi10cmVlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgIChleGNlcHQgZm9yIG9wZW5zc2wsIHdoaWNoIG9ubHkgYnVpbGRzIGluLXRyZWUpCisgICAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGRpc3RyaWJ1dGlvbnMgZW5kIHVwCisgICAgICAgIHNyY1wgICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IHNvdXJjZSBwcm9qZWN0cyBsaXZlCisgICAgICBzY3JpcHRzXCAgICAgLSBiYXRjaCBmaWxlcyB1c2VkIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkcworICAgICAgdGhyaWZ0XCAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgdGhyaWZ0IHNvdXJjZSBwcm9qZWN0IGxpdmVzCisKK0NyZWF0ZSBhICJ3b3Jrc3BhY2UiIGRpcmVjdG9yeSBzb21ld2hlcmUgb24geW91ciBzeXN0ZW0gYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgdGhpcworZGlyZWN0b3J5IHRvIHRoZXJlLCB0aGVuIGNsb25lIG9yIHVucGFjayB0aHJpZnQgaW50byBgd29ya3NwYWNlXHRocmlmdGAuCisKKyMjIFRoaXJkIFBhcnR5IExpYnJhcmllcworCitCYXRjaCBzY3JpcHRzIGFyZSBwcm92aWRlZCB0byBidWlsZCBzb21lIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4gIFlvdSBtdXN0IGRvd25sb2FkIHRoZW0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgZGlyZWN0b3J5IG5vdGVkIGZvciBlYWNoLiAgWW91IGNhbiB1c2UgZGlmZmVyZW50IHZlcnNpb25zIGlmIHlvdSBwcmVmZXI7IHRoZXNlIGluc3RydWN0aW9ucyB3ZXJlIG1hZGUgd2l0aCB0aGUgdmVyc2lvbnMgbGlzdGVkLiAgCisKKz4gVElQOiBUbyBtb2RpZnkgdGhlIHZlcnNpb25zIHVzZWQgaW4gdGhlIGJhdGNoIHNjcmlwdHMsIGxvb2sgaW4gc2NyaXB0c1x0cHZlcnNpb25zLmJhdC4KKworQnVpbGQgdGhlbSBpbiB0aGUgb3JkZXIgbGlzdGVkIHRvIHNhdGlzZnkgdGhlaXIgZGVwZW5kZW5jaWVzLgorCisjIyMgd2luZmxleGJpc29uCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi9maWxlcy93aW5fZmxleF9iaXNvbi1sYXRlc3QuemlwL2Rvd25sb2FkCisgICAgICAgdmVyc2lvbjogImxhdGVzdCIKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvbgorCitUaGlzIHBhY2thZ2UgaXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGNvbXBpbGVyLiAgVGhpcyB0aGlyZCBwYXJ0eSBwYWNrYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgYnVpbHQgYXMgaXQgaXMgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHRoZSAiYmlzb24iIGFuZCAiZmxleCIgdG9vbHMgbm9ybWFsbHkgZm91bmQgb24gVW5peCBib3hlcy4KKworPiBUSVA6IElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGJ1aWxkaW5nIHRoZSBjb21waWxlciwgeW91IGNhbiBza2lwIHRoZSByZW1haW5pbmcgdGhpcmQgcGFydHkgbGlicmFyaWVzLgorCisjIyMgemxpYgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vemxpYi5uZXQvCisgICAgICAgdmVyc2lvbjogMS4yLjkKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxzcmNcemxpYi0xLjIuOQorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtemxpYi5iYXQgc2NyaXB0IGluIHRoaXJkcGFydHlcc3JjLgorIAorIyMjIG9wZW5zc2wKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvCisgICAgICAgdmVyc2lvbjogMS4xLjBjCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXG9wZW5zc2wtMS4xLjBjCisgICAgZGVwZW5kcy1vbjogemxpYgorCitJZiB5b3UgYXJlIHVzaW5nIG9wZW5zc2wtMS4xLjAgb3IgbGF0ZXIsIHRoZXkgY2hhbmdlZCBzdGF0aWMgYnVpbGRzIHRvIHVzZSBNaWNyb3NvZnQgU3RhdGljIFJUTCBmb3IgcmVsZWFzZSBidWlsZHMuICB6bGliIGJ5IGRlZmF1bHQgdXNlcyBhIGR5bmFtaWMgcnVudGltZSwgYXMgZG9lcyBsaWJldmVudC4gIEVkaXQgdGhlIGZpbGUgQ29uZmlndXJhdGlvbnMvMTAtbWFpbi5jb25mIGFuZCByZXBsYWNlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciAiVkMtbm9DRS1jb21tb24iIHdpdGggd2hhdCBhcHBlYXJzIGJlbG93IHRvIG1ha2Ugb3BlbnNzbCBidWlsZCB3aXRoIGR5bmFtaWMgcnVudGltZSBpbnN0ZWFkOgorCisgICAgIlZDLW5vQ0UtY29tbW9uIiA9PiB7CisgICAgICAgIGluaGVyaXRfZnJvbSAgICAgPT4gWyAiVkMtY29tbW9uIiBdLAorICAgICAgICB0ZW1wbGF0ZSAgICAgICAgID0+IDEsCisgICAgICAgIGNmbGFncyAgICAgICAgICAgPT4gYWRkKHBpY2tlcihkZWZhdWx0ID0+ICItRFVOSUNPREUgLURfVU5JQ09ERSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyAgID0+ICIvTURkIC9PZCAtRERFQlVHIC1EX0RFQlVHIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPT4gIi9NRCAvTzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICBiaW5fY2ZsYWdzICAgICAgID0+IGFkZChwaWNrZXIoZGVidWcgICA9PiAiL01EZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2xmbGFncyAgICAgICA9PiBhZGQoIi9zdWJzeXN0ZW06Y29uc29sZSAvb3B0OnJlZiIpLAorICAgICAgICBleF9saWJzICAgICAgICAgID0+IGFkZChzdWIgeworICAgICAgICAgICAgbXkgQGV4X2xpYnMgPSAoKTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICd3czJfMzIubGliJyB1bmxlc3MgJGRpc2FibGVke3NvY2t9OworICAgICAgICAgICAgcHVzaCBAZXhfbGlicywgJ2dkaTMyLmxpYiBhZHZhcGkzMi5saWIgY3J5cHQzMi5saWIgdXNlcjMyLmxpYic7CisgICAgICAgICAgICByZXR1cm4gam9pbigiICIsIEBleF9saWJzKTsKKyAgICAgICAgfSksCisgICAgfSwKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLW9wZW5zc2wuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIGxpYmV2ZW50CisKKyAgICAgICAgc291cmNlOiBnaXQKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vbm1hdGhld3Nvbi9MaWJldmVudC5naXQKKyAgICAgICAgICAgdXNlOiBjb21taXQgMzgyMWNjYTFhNjM3ZjRkYTQwOTljOTM0M2U3MzI2ZGEwMGY2OTgxYyBvciBsYXRlcgorICAgICAgICAgIGRhdGU6IEZyaSBEZWMgMjMgMTY6MTk6MzUgMjAxNiArMDgwMCBvciBsYXRlcgorICAgICAgIHZlcnNpb246IGNvcnJlc3BvbmRzIHRvIDIuMS43cmMgKyBwYXRjaGVzCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXGxpYmV2ZW50LTIuMS43cmMyCisgICAgZGVwZW5kcy1vbjogb3BlbnNzbCwgemxpYgorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtbGliZXZlbnQuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIG1zaW50dHlwZXMKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vYXJjaGl2ZS9wL21zaW50dHlwZXMvZG93bmxvYWRzCisgICAgICAgdmVyc2lvbjogMjYKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XG1zaW50dHlwZXMKKworPiBUSVA6IFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIFZpc3VhbCBTdHVkaW8gMjAxMCwgd2hpY2ggZGlkIG5vdCBpbmNsdWRlIGFuIDxpbnR0eXBlcy5oPiBoZWFkZXIuCisKK1RoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgZGlzdHJpYnV0aW9uIG9mIGhlYWRlciBmaWxlcy4KKworIyMjIGJvb3N0CisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHA6Ly9ib29zdC50ZWVrczk5LmNvbS8KKyAgICAgICB2ZXJzaW9uOiAxXzYyXzAKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XGJvb3N0XzFfNjJfMAorCitUaGUgcHJlLWJ1aWx0IGJpbmFyeSB2ZXJzaW9ucyBvZiBib29zdCBjb21lIGluIHNlbGYtdW5wYWNraW5nIGV4ZWN1dGFibGVzLiAgUnVuIGVhY2ggb2YgdGhlIG9uZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIGFuZCBwb2ludCB0aGVtIGF0IHRoZSBzYW1lIHRoaXJkcGFydHkgZGlzdCBkaXJlY3RvcnkuCisKKyMjIEJ1aWxkaW5nIGEgUHJvZHVjdGlvbiB0aHJpZnQgQ29tcGlsZXIKKworIyMjIFByZXJlcXVpc2l0ZXMKKworKiBDTWFrZS0yLjguMTIuMiBvciBsYXRlcgorKiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIKKyogdGhyaWZ0IHNvdXJjZSBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhyaWZ0CisqIHdpbmZsZXhiaXNvbiBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0CisKKyMjIyBJbnN0cnVjdGlvbnMKKworQnkgZm9sbG93aW5nIHRoZXNlIGluc3RydWN0aW9ucyB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIHJlbGVhc2UgbW9kZSB0aHJpZnQgY29tcGlsZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzdHJpYnV0aW9uIGFzIGl0IGhhcyBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuICAKKworMS4gT3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdGAKKworVGhlIGJhdGNoIGZpbGUgdXNlcyBDTWFrZSB0byBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW4gYHdvcmtzcGFjZVxidWlsZGAgYW5kIHRoZW4gYnVpbGRzIHRoZSBjb21waWxlci4gIFRoZSByZXN1bHRpbmcgYHRocmlmdC5leGVgIHByb2dyYW0gaXMgcGxhY2VkIGludG8gYHdvcmtzcGFjZVxkaXN0YCBpbiBhIHBhdGggdGhhdCBkZXBlbmRzIG9uIHlvdXIgY29tcGlsZXIgdmVyc2lvbiBhbmQgcGxhdGZvcm0uICBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBhIFZpc3VhbCBTdHVkaW8gMjAxMCB4NjQgQ29tbWFuZCBQcm9tcHQsIHRoZSBjb21waWxlciB3aWxsIGJlIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdFx0aHJpZnQtY29tcGlsZXItZGV2XHZjMTAwXHg2NFxSZWxlYXNlXHRocmlmdC5leGVgCisKKyMjIyMgRGV0YWlscworCitUaGlzIHNlY3Rpb24gaXMgZm9yIHRob3NlIHdobyBhcmUgY3VyaW91cyBhYm91dCB0aGUgQ01ha2Ugb3B0aW9ucyB1c2VkIGluIHRoZSBidWlsZCBwcm9jZXNzLgorCitDTWFrZSB0YWtlcyB0aGUgc291cmNlIHRyZWUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB1c2VzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGZvciBjb25maWd1cmF0aW9uLiAgVGhlIGJhdGNoIGZpbGUgYGJ1aWxkLXRocmlmdC1jb21waWxlcmAgZXNzZW50aWFsbHkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBOTUFLRSAvRk1ha2VmaWxlIHRocmlmdC1jb21waWxlcgorCitXSVRIX01UIGNvbnRyb2xzIHRoZSBkeW5hbWljIG9yIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgc2VsZWN0aW9uLiAgVG8gYnVpbGQgYSBwcm9kdWN0aW9uIGNvbXBpbGVyLCB0aGUgdGhyaWZ0IHByb2plY3QgcmVjb21tZW5kcyB1c2luZyB0aGUgc3RhdGljIHJ1bnRpbWUgbGlicmFyeSB0byBtYWtlIHRoZSBleGVjdXRhYmxlIHBvcnRhYmxlLiAgVGhlIGJhdGNoIGZpbGUgc2V0cyB0aGlzLgorCitZb3UgY2FuIGJ1aWxkIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgYnkgZm9sbG93aW5nIHRoZSBleGFtcGxlIGJ1dCBzdWJzdGl0dXRpbmcgYSBkaWZmZXJlbnQgZ2VuZXJhdG9yIGZvciB0aGUgIi1HIiBvcHRpb24uICBSdW4gYGNtYWtlLmV4ZSAtLWhlbHBgIGZvciBhIGxpc3Qgb2YgZ2VuZXJhdG9ycy4gIFR5cGljYWxseSwgdGhpcyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvbiBXaW5kb3dzIChvbWl0ICJXaW42NCIgdG8gYnVpbGQgMzItYml0IGluc3RlYWQpOgorCisqICJWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDExIDIwMTIgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiCisKK0ZvciBleGFtcGxlIHlvdSBjYW4gYnVpbGQgdXNpbmcgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSBieSBkb2luZzoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBNU0JVSUxEICJBcGFjaGUgVGhyaWZ0LnNsbiIgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC9wOlBsYXRmb3JtPXg2NCAvdDp0aHJpZnQtY29tcGlsZXIKKworWW91IGNhbiBhbHNvIGRvdWJsZS1jbGljayBvbiB0aGUgc29sdXRpb24gZmlsZSB0byBicmluZyBpdCB1cCBpbiBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZCBvciBkZWJ1ZyBpbnRlcmFjdGl2ZWx5IGZyb20gdGhlcmUuCisKKyMjIEJ1aWxkaW5nIHRoZSB0aHJpZnQgQysrIFJ1bi1UaW1lIExpYnJhcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBjb21waWxlciBidWlsZCBob3dldmVyIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBvbiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYnVpbGQgYSBmZWF0dXJlLWNvbXBsZXRlIHJ1bnRpbWUuICBUaGUgcmVzdWx0aW5nIHN0YXRpYyBsaW5rIGxpYnJhcnkgZm9yIHRocmlmdCB1c2VzIGEgZHluYW1pYyBNaWNyb3NvZnQgcnVudGltZS4KKworMS4gT3BlbiB0aGUgZGVzaXJlZCBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0LgorMi4gYGNkIHdvcmtzcGFjZWAKKzMuIGBidWlsZC10aHJpZnQuYmF0YAorCitUaHJpZnQgZGVwZW5kcyBvbiBib29zdCwgbGliZXZlbnQsIG9wZW5zc2wsIGFuZCB6bGliIGluIG9yZGVyIHRvIGJ1aWxkIHdpdGggYWxsIHNlcnZlciBhbmQgdHJhbnNwb3J0IHR5cGVzLiAgVG8gdXNlIGxhdGVyIHZlcnNpb25zIG9mIGJvb3N0IGxpa2UgMS42MiB5b3Ugd2lsbCBuZWVkIGEgcmVjZW50IHZlcnNpb24gb2YgY21ha2UgKGF0IGxlYXN0IDMuNykuCisKK1RoZSBidWlsZC10aHJpZnQgc2NyaXB0IGhhcyBvcHRpb25zIHRvIGJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UgYW5kIHRvIG9wdGlvbmFsbHkgZGlzYWJsZSBhbnkgb2YgdGhlIGdlbmVyYXRpb24gKGNtYWtlKSwgYnVpbGQsIG9yIHRlc3QgcGhhc2VzLiAgQnkgZGVmYXVsdCwgdGhlIGJhdGNoIGZpbGUgd2lsbCBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW5zaWRlIGB3b3Jrc3BhY2VcYnVpbGRgLCB0aGVuIHBlcmZvcm0gYSByZWxlYXNlIGJ1aWxkLCB0aGVuIHJ1biB0aGUgdW5pdCB0ZXN0cy4gIFRoZSBiYXRjaCBmaWxlIGFjY2VwdHMgc29tZSBvcHRpb24gZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6CisKKyAgICA6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKyAgICA6OgorICAgIDo6ICAgL0RFQlVHICAgICAgICAgICAgLSBpZiBidWlsZGluZywgcGVyZm9ybSBhIGRlYnVnIGJ1aWxkIGluc3RlYWQKKyAgICA6OiAgIC9OT0dFTkVSQVRFICAgICAgIC0gc2tpcCBjbWFrZSBnZW5lcmF0aW9uIC0gdXNlZnVsIGlmIHlvdQorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorICAgIDo6ICAgL05PQlVJTEQgICAgICAgICAgLSBza2lwIGNtYWtlIGJ1aWxkIC0gdXNlZnVsIGlmIHlvdSBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorICAgIDo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorCitGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB0aGUgY21ha2UgZW52aXJvbm1lbnQgd2l0aG91dCBidWlsZGluZyBvciBydW5uaW5nIHRlc3RzOgorCisgICAgQzpcd29ya3NwYWNlPiBidWlsZC10aHJpZnQuYmF0IC9OT0JVSUxEIC9OT1RFU1QKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC1jb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNDJhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNzkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBQcm9kdWNlcyBhIHByb2R1Y3Rpb24gdGhyaWZ0IGNvbXBpbGVyIHN1aXRhYmxlIGZvciByZWRpc3RyaWJ1dGlvbi4KKzo6IFRoZSBjb21waWxlciBpcyBsaW5rZWQgdG8gcnVudGltZSBzdGF0aWNhbGx5IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LgorOjogQXNzdW1lcyB0aGUgdGhpcmRwYXJ0eSBmaWxlcyBmb3IgIndpbmZsZXhiaXNvbiIgaGF2ZSBiZWVuIHBsYWNlZAorOjogYWNjb3JkaW5nIHRvIHRoZSBSRUFETUUubWQgaW5zdHJ1Y3Rpb25zLgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9dGhyaWZ0CitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj1kZXYKK0lGIE5PVCBERUZJTkVEIFNPVVJDRV9ESVIgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMHRoaXJkcGFydHkKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEdFTkVSQVRPUiBmb3IgQ01ha2UgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Z2VuZXJhdG9yLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEJVSUxEVFlQRSAoCisgIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorKQorCisgIFNFVCBCVUlMRERJUj0lfmRwMGJ1aWxkXCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFICV+ZHAwdGhyaWZ0IF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorICAgIC1EQklTT05fRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZSBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSVCVUlMRFRZUEUlIF4KKyAgICAtREZMRVhfRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlIF4KKyAgICAtRFdJVEhfTVQ9T04gXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiB8fCBFWElUIC9CCisKKyAgQ0QgJUJVSUxERElSJQorCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgdGhyaWZ0LWNvbXBpbGVyIHx8IEVYSVQgL0IKKyAgWENPUFkgL0YgL1kgJUJVSUxERElSJVxiaW5cJUJVSUxEVFlQRSVcdGhyaWZ0LmV4ZSAlT1VURElSJQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY3YWNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKQEAgLTAsMCArMSwxNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBHZW5lcmF0ZXMgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZvciB0aHJpZnQgYW5kIHRoZW4gYnVpbGRzIGl0LgorOjogQXNzdW1lcyB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgaGF2ZSBiZWVuIGJ1aWx0IG9yIHBsYWNlZCBhbHJlYWR5LgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorOjoKKzo6IE5vcm1hbGx5IHRoZSBzY3JpcHQgd2lsbCBydW4gY21ha2UgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbiwgdGhlbgorOjogcGVyZm9ybSBhIGJ1aWxkLCB0aGVuIHJ1biB0ZXN0cyBvbiB0aGUgY29tcGxldGUgdGhyaWZ0IGxpYnJhcnkKKzo6IGluIHJlbGVhc2UgbW9kZS4KKzo6Cis6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKzo6Cis6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gZGVidWcgaW5zdGVhZCBvZiByZWxlYXNlCis6OiAgIC9JREUgICAgICAgICAgICAgIC0gbGF1bmNoIFZpc3VhbCBTdHVkaW8gd2l0aCBhIHBhdGggc2V0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgdXAgY29ycmVjdGx5IHRvIHJ1biB0ZXN0cyBpbnN0ZWFkIG9mCis6OiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWluZyBhbnkgb3RoZXIgYWN0aW9ucywgaS5lLgorOjogICAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgc2V0dGluZyB0aGUgbmV4dCB0aHJlZSBmbGFncworOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKzo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGJ1aWxkCis6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorOjogICAvTk9URVNUICAgICAgICAgICAtIHNraXAgY3Rlc3QgZXhlY3V0aW9uCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCis6OiBEZWZhdWx0cworCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgU0VUIEJVSUxEVFlQRT1SZWxlYXNlCitTRVQgT1BUX0lERT0wCitTRVQgT1BUX0JVSUxEPTEKK1NFVCBPUFRfR0VORVJBVEU9MQorU0VUIE9QVF9URVNUPTEKKworOjogQXBwbHkgRmxhZ3MKKworSUYgL0kgIiUxIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUyIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUzIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUxIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUyIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUzIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUxIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTIiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMyIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUxIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTIiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMyIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUxIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKK0lGIC9JICIlMiIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTMiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorCitJRiAlT1BUX0lERSUgPT0gMSAoCisgIFNFVCBPUFRfR0VORVJBVEU9MAorICBTRVQgT1BUX0JVSUxEPTAKKyAgU0VUIE9QVF9URVNUPTAKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwKKyAgU0VUIE9VVERJUj0lfmRwMGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcCisgIFNFVCBCT09TVF9MSUJESVI9bGliJUFSQ0g6fi0yLDIlLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4wCisgIElGICIlQlVJTERUWVBFJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfU1RBVElDX1NVRkZJWD1kKQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICBDb25maWd1cmF0aW9uOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTolQlVJTERUWVBFJSAiJUdFTkVSQVRPUiUiCitJRiBERUZJTkVEIENPTVBJTEVST05MWSAoCisgIEVDSE8gICAgICAgICAgICAgICAgICAgIENPTVBJTEVSIE9OTFkKKykKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogJUJVSUxERElSJQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAlT1VURElSJQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworSUYgJU9QVF9JREUlID09IDEgKAorCisgIENBTEwgOlNFVFJVTlBBVEggfHwgRVhJVCAvQgorICBDQUxMIERFVkVOViAiIUJVSUxERElSIUFwYWNoZSBUaHJpZnQuc2xuIiB8fCBFWElUIC9CCisgIEVYSVQgL0IKKyAgCispCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKK0lGICVPUFRfR0VORVJBVEUlID09IDEgKAorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiUgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JU9VVERJUiUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURJTlRUWVBFU19ST09UPSVXSU4zUF9ST09UJVxkaXN0XG1zaW50dHlwZXMgXgorICAgIC1ETElCRVZFTlRfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxsaWJldmVudC0lVFBfTElCRVZFTlRfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSUgXgorICAgIC1ET1BFTlNTTF9ST09UX0RJUj0lV0lOM1BfUk9PVCVcZGlzdFxvcGVuc3NsLSVUUF9PUEVOU1NMX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXGR5bmFtaWMgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliJVpMSUJfTElCX1NVRkZJWCUubGliIF4KKyAgICAtRFpMSUJfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAgIC1EV0lUSF9TVEFUSUNfTElCPU9OIHx8IEVYSVQgL0IKKworKQorCitJRiAlT1BUX0JVSUxEJSA9PSAxICgKKworICBDRCAlQlVJTERESVIlCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgSU5TVEFMTCB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9URVNUJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ01BS0UuRVhFIC0tYnVpbGQgLiAtLWNvbmZpZyAlQlVJTERUWVBFJSAtLXRhcmdldCBSVU5fVEVTVFMgfHwgRVhJVCAvQgorICAKKykKKworOlNFVFJVTlBBVEgKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XGJvb3N0XyVUUF9CT09TVF9WRVJTSU9OJVwlQk9PU1RfTElCRElSJQorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljXGJpbgorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxiaW4KKyAgRVhJVCAvQgorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRhcmNoLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKQEAgLTAsMCArMSw0NyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgYXJjaGl0ZWN0dXJlIHdlJ3JlIGJ1aWxkaW5nIGZvci4KKzo6IFNldCB0aGUgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHdpbjMyCis6OiAgIHg2NAorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQVJDSCBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQVJDSCAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBBUkNICisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyB4NjQKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChTRVQgQVJDSD14NjQpIEVMU0UgKFNFVCBBUkNIPXdpbjMyKQorCitJRiBOT1QgREVGSU5FRCBBUkNIICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCB0YXJnZXQgYXJjaGl0ZWN0dXJlICVBUkNIJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IiBmb3IgJTElIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA1ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Y29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNTggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4uCis6OiBTZXQgdGhlIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6ICAgdmMxMDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTAKKzo6ICAgdmMxMTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTIKKzo6ICAgdmMxMjAgPSBWaXN1YWwgU3R1ZGlvIDIwMTMKKzo6ICAgdmMxNDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTUKKzo6ICAgdmMxNTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTcKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBDT01QSUxFUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQ09NUElMRVIKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTAwKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMTApCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEyMCkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTQwKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxNTApCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJS4iID4gbnVsCitFWElUIC9CICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw2OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbiAKKzo6IHNldCB0aGUgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6Cis6OiAgVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTcgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTQgMjAxNSBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE1IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTIgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTAgMjAxMCBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEwIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiSUE2NCIuCis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEdFTkVSQVRPUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6Cis6OiBSZXF1aXJlcyBjbF9zZXRhcmNoLmJhdCB0byBoYXZlIGJlZW4gZXhlY3V0ZWQgb3IgdGhlIEFSQ0ggZW52aXJvbm1lbnQKKzo6IHZhcmlhYmxlIHRvIGJlIHNldC4KKzo6CisKK0lGICIlQVJDSCUiID09ICJ4NjQiIChTRVQgR0VOQVJDSD0gV2luNjQpCisKK0lGIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIEdFTkVSQVRPUgorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgMTYKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxNworSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTEgMjAxMiVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE4CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMDAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOS4xMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyVHRU5BUkNIJSkKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIENNYWtlIGdlbmVyYXRvciB0byB1c2UKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSB1c2luZyBDTWFrZSBnZW5lcmF0b3IgICAgICAgICVHRU5FUkFUT1IlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvdHB2ZXJzaW9ucy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYzg2OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0CkBAIC0wLDAgKzEsMjQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBTZXQgdGhlIHZlcnNpb25zIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byB1c2UuCis6OgorCitJRiBOT1QgREVGSU5FRCBUUF9CT09TVF9WRVJTSU9OICAgIFNFVCBUUF9CT09TVF9WRVJTSU9OPTFfNjJfMAorSUYgTk9UIERFRklORUQgVFBfTElCRVZFTlRfVkVSU0lPTiBTRVQgVFBfTElCRVZFTlRfVkVSU0lPTj0yLjEuN3JjMgorSUYgTk9UIERFRklORUQgVFBfT1BFTlNTTF9WRVJTSU9OICBTRVQgVFBfT1BFTlNTTF9WRVJTSU9OPTEuMS4wYworSUYgTk9UIERFRklORUQgVFBfWkxJQl9WRVJTSU9OICAgICBTRVQgVFBfWkxJQl9WRVJTSU9OPTEuMi45CisKK0VYSVQgL0IgMApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNTA1YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKQEAgLTAsMCArMSw4NiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgbGliZXZlbnQgb24gd2luZG93cworOjogVXNlIGxpYmV2ZW50IG1hc3RlciBmcm9tIGdpdGh1YiB3aGljaCBoYXMgY21ha2UgaW50ZWdyYXRpb24KKzo6IFVzZXMgdGhlIGVudmlyb25tZW50IHNldCB1cCBieSBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgc2hvcnRjdXQKKzo6IHRvIHRhcmdldCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIKKzo6Cis6OiBDcmVhdGVzIGEgc3RhdGljIGxpbmsgbGlicmFyeS4KKzo6IExpbmtzIGFnYWluc3QgT3BlblNTTCBhbmQgemxpYiBzdGF0aWNhbGx5LgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLWxpYmV2ZW50LmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1saWJldmVudAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX0xJQkVWRU5UX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VESVIgICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSEKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKFNFVCBaTElCX0xJQl9TVUZGSVg9ZCkKKworICBTRVQgQ01BS0VfREVGUz1eCisgICAtREVWRU5UX19ESVNBQkxFX1NBTVBMRVM9T04gXgorICAgLURFVkVOVF9fRElTQUJMRV9URVNUUz1PTiBeCisgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIVxkeW5hbWljIF4KKyAgIC1EWkxJQl9MSUJSQVJZPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcbGliXHpsaWIhWkxJQl9MSUJfU1VGRklYIS5saWIgXgorICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSB2JVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IUJVSUxEVFlQRSEgIiVHRU5FUkFUT1IlIgorICBFQ0hPIENNYWtlIERlZmluaXRpb25zOiAhQ01BS0VfREVGUyEKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisgIAorICBNS0RJUiAiIUJVSUxERElSISIKKyAgQ0QgIiFCVUlMRERJUiEiIHx8IEVYSVQgL0IKKworICBDTUFLRS5FWEUgLUciJUdFTkVSQVRPUiUiIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IU9VVERJUiEgLURDTUFLRV9CVUlMRF9UWVBFPSFCVUlMRFRZUEUhICFDTUFLRV9ERUZTISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKykKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI3MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLW9wZW5zc2wuYmF0CkBAIC0wLDAgKzEsMTA2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciBvcGVuc3NsIG9uIHdpbmRvd3MKKzo6IG9wZW5zc2wgdXNlcyBhbiBpbi10cmVlIGJ1aWxkIHNvIHlvdSBoYXZlIHRvIGNsZWFuIGJldHdlZW4gZWFjaCBvbmUKKzo6Cis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogSWYgeW91IHVzZSBMYXZhc29mdCBBZC1Bd2FyZSwgZGlzYWJsZSBpdCBmb3IgdGhpcyBidWlsZC4gIEl0IGJsb2NrcyB0aGUgY3JlYXRpb24KKzo6IG9mIGFueSBmaWxlIG5hbWVkICJjbGllbnRoZWxsb3Rlc3QuZXhlIiBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3aGljaCBicmVha3MgdGhlIGJ1aWxkLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLW9wZW5zc2wuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1vcGVuc3NsCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfT1BFTlNTTF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgIiVBUkNIJSIgPT0gIng2NCIgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU42NEEgVkMtV0lONjRBCispIEVMU0UgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU4zMiBWQy1XSU4zMgorKQorCitGT1IgJSVYIElOICggIVRPRE8hICkgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBGT1IgJSVZIElOICgKKyAgICBudAorICAgIG50ZGxsCisgICkgRE8gKAorICAgIFNFVCBMSUJUWVBFPSUlWQorCisgICAgSUYgIiFCVUlMRFRZUEU6fjAsNiEiID09ICJkZWJ1Zy0iICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9ZGVidWcKKyAgICAgIFNFVCBaTElCTElCU1VGRklYPWQKKyAgICApIEVMU0UgKAorICAgICAgU0VUIE9VVEJVSUxEVFlQRT1yZWxlYXNlCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD0KKyAgICApCisKKyAgICBJRiAiIUxJQlRZUEUhIiA9PSAibnRkbGwiICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9ZHluYW1pYworICAgICAgU0VUIFpMSUJMSUI9emxpYiFaTElCTElCU1VGRklYIQorICAgICAgU0VUIFpMSUJPUFQ9emxpYi1keW5hbWljCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPW5vLXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9c3RhdGljCisgICAgICBTRVQgWkxJQkxJQj16bGlic3RhdGljIVpMSUJMSUJTVUZGSVghLmxpYgorICAgICAgU0VUIFpMSUJPUFQ9emxpYgorICAgICkKKworICAgIFNFVCBMSUI9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcbGliOyFMSUIhCisgICAgU0VUIEJVSUxEX09QVElPTlM9IUJVSUxEX09QVElPTlMhIG5vLWFzbSBuby11bml0LXRlc3QgIVpMSUJPUFQhIC0tb3BlbnNzbGRpcj1zc2wgLS13aXRoLXpsaWItaW5jbHVkZT0lfmRwMC4uXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwhQ09NUElMRVIhXCFBUkNIIVxpbmNsdWRlIC0td2l0aC16bGliLWxpYj0hWkxJQkxJQiEKKyAgICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFPVVRCVUlMRFRZUEUhXCFPVVRMSUJUWVBFIQorCisgICAgRUNITy8KKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohT1VUQlVJTERUWVBFITohT1VUTElCVFlQRSEgWyFCVUlMRFRZUEUhXQorICAgIEVDSE8gQ29uZmlndXJlIE9wdGlvbnM6ICFCVUlMRF9PUFRJT05TIQorICAgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICFPVVRESVIhCisgICAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPLworCisgICAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICAgIElGICFFUlJPUkxFVkVMISBORVEgMSAoRVhJVCAvQiAhRVJST1JMRVZFTCEpCisgICAgKQorCisgICAgQ0QgJVNPVVJDRURJUiUgfHwgRVhJVCAvQgorICAgIHBlcmwgQ29uZmlndXJlICFCVUlMRFRZUEUhIC0tcHJlZml4PSIhT1VURElSISIgIUJVSUxEX09QVElPTlMhIHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGluc3RhbGxfc3cgfHwgRVhJVCAvQgorICAgIE5NQUtFIC9GTWFrZWZpbGUgY2xlYW4gfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDc1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciB6bGliIG9uIHdpbmRvd3MuCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLXpsaWIuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgICAgICAgU0VUIEdFTkVSQVRPUj1OTWFrZSBNYWtlZmlsZXMKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXpsaWIKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9aTElCX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiFCVUlMRERJUiFcemxpYmQucGRiIiAiIU9VVERJUiFcYmluXCIgfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRmNzkwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDIyMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorCitjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfRk9STUFUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCitmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCisKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKworIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKK0JJU09OX1RBUkdFVCh0aHJpZnR5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQorRkxFWF9UQVJHRVQodGhyaWZ0bCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKK0FERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQorCitzZXQocGFyc2VfU09VUkNFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oaAorKQorCithZGRfbGlicmFyeShwYXJzZSBTVEFUSUMgJHtwYXJzZV9TT1VSQ0VTfSkKKworIyBDcmVhdGUgdGhlIHRocmlmdCBjb21waWxlcgorc2V0KGNvbXBpbGVyX2NvcmUKKyAgICBzcmMvdGhyaWZ0L2NvbW1vbi5jYworICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKyAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYworICAgIHNyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaAorKQorCitzZXQodGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCispCisKK3NldCh0aHJpZnRfY29tcGlsZXJfTEFOR1MKKykKKworIyBUaGlzIG1hY3JvIGFkZHMgYW4gb3B0aW9uIFRIUklGVF9DT01QSUxFUl8ke05BTUV9CisjIHRoYXQgYWxsb3dzIGVuYWJsaW5nIG9yIGRpc2FibGluZyBjZXJ0YWluIGxhbmd1YWdlcworbWFjcm8oVEhSSUZUX0FERF9DT01QSUxFUiBuYW1lIGRlc2NyaXB0aW9uIGluaXRpYWwpCisgICAgc3RyaW5nKFRPVVBQRVIgIlRIUklGVF9DT01QSUxFUl8ke25hbWV9IiBlbmFibGVyKQorICAgIHNldChzcmMgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF8ke25hbWV9X2dlbmVyYXRvci5jYyIpCisgICAgb3B0aW9uKCR7ZW5hYmxlcn0gJHtkZXNjcmlwdGlvbn0gJHtpbml0aWFsfSkKKyAgICBpZigke2VuYWJsZXJ9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke3NyY30pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9jb21waWxlcl9MQU5HUyAke25hbWV9KQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGVyIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkCitUSFJJRlRfQUREX0NPTVBJTEVSKGNfZ2xpYiAgIkVuYWJsZSBjb21waWxlciBmb3IgQyB3aXRoIEdsaWIiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjcHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMrKyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmEgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSIgICBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoYXMzICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBBY3Rpb25TY3JpcHQgMyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGRhcnQgICAgIkVuYWJsZSBjb21waWxlciBmb3IgRGFydCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGNzaGFycCAgIkVuYWJsZSBjb21waWxlciBmb3IgQyMiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHB5ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUHl0aG9uIDIuMCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHBlcmwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUGVybCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHBocCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUEhQIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoZXJsICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBFcmxhbmciIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihjb2NvYSAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIE9iamVjdGl2ZS1DIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoc3dpZnQgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBTd2lmdCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIob2NhbWwgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBPQ2FtbCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGhzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGFza2VsbCIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIoaHRtbCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIVE1MIERvY3VtZW50YXRpb24iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqcyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmFTY3JpcHQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqc29uICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEpTT04iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhbWUgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEgTUUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkZWxwaGkgICJFbmFibGUgY29tcGlsZXIgZm9yIERlbHBoaSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihsdWEgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEx1YSIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUih4bWwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFhNTCIgT04pCisKKyMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKKyMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSBzcmMpCisKK2lmKE5PVCBERUZJTkVEIFdJVEhfUExVR0lOIE9SIE5PVCAke1dJVEhfUExVR0lOfSkKKyAgICBsaXN0KEFQUEVORCB0aHJpZnQtY29tcGlsZXJfU09VUkNFUyAke2NvbXBpbGVyX2NvcmV9KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZSh0aHJpZnQtY29tcGlsZXIgJHt0aHJpZnQtY29tcGlsZXJfU09VUkNFU30pCisKK2lmKCR7V0lUSF9QTFVHSU59KQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1ib290c3RyYXAgJHtjb21waWxlcl9jb3JlfQorICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MKKyAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYworICAgICkKKyAgICB0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWJvb3RzdHJhcCBwYXJzZSkKKworICAgIHNldChQTFVHSU5fR0VOX1NPVVJDRVMKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcAorICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmgKKyAgICAgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5jcHAKKyAgICApCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luKQorICAgIGFkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIERFUEVORFMgdGhyaWZ0LWJvb3RzdHJhcCBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgICAgIENPTU1BTkQgdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcAorICAgICAgICAtb3V0ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvcGx1Z2luCisgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CisgICAgKQorCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyguLi8uLi9saWIvY3BwL3NyYykKKworICAgIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQorICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRjCisgICAgICAgICR7Y29tcGlsZXJfY29yZX0KKyAgICAgICAgJHtQTFVHSU5fR0VOX1NPVVJDRVN9CisgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5jYworICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCisgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYworICAgICkKKyAgICBUQVJHRVRfSU5DTFVERV9ESVJFQ1RPUklFU19USFJJRlQodGhyaWZ0YyBQVUJMSUMgJHtCb29zdF9JTkNMVURFX0RJUlN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRjIHRocmlmdCBQVUJMSUMpCisgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnModGhyaWZ0LWNvbXBpbGVyIFBVQkxJQyBUSFJJRlRfRU5BQkxFX1BMVUdJTikKKyAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0LWNvbXBpbGVyIHRocmlmdGMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnQpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtY29tcGlsZXIgcGFyc2UpCisKK2luc3RhbGwoVEFSR0VUUyB0aHJpZnQtY29tcGlsZXIgREVTVElOQVRJT04gYmluKQorCitpZigke1dJVEhfUExVR0lOfSkKKyAgIyBJbnN0YWxsIHRoZSBoZWFkZXJzCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L2NvbW1vbi5oIgorICAgICAgInNyYy90aHJpZnQvZ2xvYmFscy5oIgorICAgICAgInNyYy90aHJpZnQvbG9nZ2luZy5oIgorICAgICAgInNyYy90aHJpZnQvbWFpbi5oIgorICAgICAgInNyYy90aHJpZnQvcGxhdGZvcm0uaCIKKyAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9L2NvbXBpbGVyL2NwcC90aHJpZnQvdmVyc2lvbi5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0IikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L2F1ZGl0IikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyAgICAgICJzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgiCisgICAgICAic3JjL3RocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9nZW5lcmF0ZSIpCisgIGluc3RhbGwoRklMRVMKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2ZpZWxkLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorICAgICAgInNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgiCisgICAgICAic3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorICAgICAgREVTVElOQVRJT04gIiR7SU5DTFVERV9JTlNUQUxMX0RJUn0vdGhyaWZ0L3BhcnNlIikKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorICAgICAgInNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKyAgICAgICJzcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC9wbHVnaW4iKQoraWYoTVNWQykKKyAgaW5zdGFsbChGSUxFUworICAgICAgInNyYy90aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyAgICAgIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9L3RocmlmdC93aW5kb3dzIikKK2VuZGlmKCkKK2VuZGlmKCkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfc3ViZGlyZWN0b3J5KHRlc3QpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KaW5kZXggZjQ3YjE1Zi4uMGI4ZWYyZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCisrKyBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQpAQCAtMjEsODEgKzIxLDE3MCBAQAogIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgogIyBkZXRhaWxzLgogCi1BTV9ZRkxBR1MgPSAtZAotTElCUyA9Ci1CVUlMVF9TT1VSQ0VTID0KK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCisjIE5vdGUgb24gd2h5IHdlIGhhdmUgc3JjL3RocmlmdCBhbmQgc3JjL3RocmlmdC9wbHVnaW4gZGlyZWN0b3JpZXM6CisjIFNpbmNlIEF1dG9tYWtlIHN1cHBvcnRzIG9ubHkgb25lIHNldCBvZiBCVUlMVF9TT1VSQ0VTIHBlciBmaWxlIGFuZCBkb2VzIG5vdCBhbGxvdworIyBTVUJESVJTIGJ1aWx0IGJlZm9yZSBCVUlMVF9TT1VSQ0VTLCB3ZSBlbmQgdXAgc2VwYXJhdGUgTWFrZWZpbGUuYW0gZm9yIGVhY2ggc291cmNlCisjIGNvZGUgZ2VuZXJhdGlvbiwgaS5lLiBsZXgteWFjYyBhbmQgVGhyaWZ0LCB0byBhY2hpZXZlIHN0YWJsZSBwYXJhbGxlbCBtYWtlLgorCitTVUJESVJTID0gc3JjIHNyYy90aHJpZnQvcGx1Z2luIC4KK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKIAogYmluX1BST0dSQU1TID0gdGhyaWZ0CiAKLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJwYXJzZS5hCi0KIHRocmlmdF9PQkpESVIgPSBvYmoKIAotdGhyaWZ0X1NPVVJDRVMgPSBzcmMvbWFpbi5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9tZDUuYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dsb2JhbHMuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9tYWluLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGxhdGZvcm0uaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9tZDUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2RvYy5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfdHlwZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfYmFzZV90eXBlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF90eXBlZGVmLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb250YWluZXIuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2xpc3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X3NldC5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfbWFwLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zdHJ1Y3QuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2ZpZWxkLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9zZXJ2aWNlLmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9mdW5jdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3RfcHJvZ3JhbS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3Rfc2NvcGUuaCBcCi0gICAgICAgICAgICAgICAgIHNyYy9wYXJzZS90X2NvbnN0LmggXAotICAgICAgICAgICAgICAgICBzcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3BhcnNlL3BhcnNlLmNjIFwKLSAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmggXAotICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3dpbmRvd3MvY29uZmlnLmggXAotICAgICAgICAgICAgICAgICBzcmMvd2luZG93cy92ZXJzaW9uLmgKK3BsdWdpbl9nZW4gPSBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX2NvbnN0YW50cy5oIFwKKyAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fY29uc3RhbnRzLmNwcAorCitjb21waWxlcl9jb3JlID0gIHNyYy90aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbW1vbi5jYyBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvbG9nZ2luZy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9tYXAuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3NlcnZpY2UuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggCisKK3RocmlmdF9TT1VSQ0VTID0gc3JjL3RocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MgXAorICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmgKIAogIyBTcGVjaWZpYyBjbGllbnQgZ2VuZXJhdG9yIHNvdXJjZQotdGhyaWZ0X1NPVVJDRVMgKz0gc3JjL2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MgXAotICAgICAgICAgICAgICAgICAgc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIFwKLSAgICAgICAgICAgICAgICAgIHNyYy9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwordGhyaWZ0X1NPVVJDRVMgKz0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjIFwKKyAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwogCiB0aHJpZnRfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS9zcmMKLXRocmlmdF9DWFhGTEFHUyA9IC1XYWxsCi10aHJpZnRfTERBREQgPSBATEVYTElCQCBsaWJwYXJzZS5hCit0aHJpZnRfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtV2Vycm9yCit0aHJpZnRfTERBREQgPSBATEVYTElCQCBzcmMvdGhyaWZ0L2xpYnBhcnNlLmEKIAotbGlicGFyc2VfYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYwotbGlicGFyc2VfYV9DWFhGTEFHUyA9IC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkCitpZiAhV0lUSF9QTFVHSU4KK3RocmlmdF9TT1VSQ0VTICs9ICQoY29tcGlsZXJfY29yZSkKK2Vsc2UKIAotbGlicGFyc2VfYV9TT1VSQ0VTID0gc3JjL3RocmlmdHkueXkgXAotICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdGwubGwKK2xpYl9MVExJQlJBUklFUyA9IGxpYnRocmlmdGMubGEKKwordGhyaWZ0X0NQUEZMQUdTICs9IC1EVEhSSUZUX0VOQUJMRV9QTFVHSU49MQordGhyaWZ0X0xEQUREICs9IGxpYnRocmlmdGMubGEKKworbm9kaXN0X2xpYnRocmlmdGNfbGFfU09VUkNFUyA9ICQocGx1Z2luX2dlbikKK2xpYnRocmlmdGNfbGFfU09VUkNFUyA9ICQoY29tcGlsZXJfY29yZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9sb2dnaW5nLmNjCisKKworbGlidGhyaWZ0Y19sYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYyAtSXNyYyAtSSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL3NyYyAtRFRIUklGVF9FTkFCTEVfUExVR0lOPTEKK2xpYnRocmlmdGNfbGFfQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworbGlidGhyaWZ0Y19sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAoraW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2xvYmFscy5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9tYWluLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGxhdGZvcm0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC92ZXJzaW9uLmgKKworaW5jbHVkZV9hdWRpdGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3dpbmRvd3MKK2luY2x1ZGVfYXVkaXRfSEVBREVSUyA9IHNyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5oCisKK2luY2x1ZGVfZ2VuZXJhdGVkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9nZW5lcmF0ZQoraW5jbHVkZV9nZW5lcmF0ZV9IRUFERVJTID0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIAorCitpbmNsdWRlX3BhcnNlZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcGFyc2UKK2luY2x1ZGVfcGFyc2VfSEVBREVSUyA9IHNyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9jb250YWluZXIuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wYXJzZS90X2VudW0uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvdF9kb2MuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKKworaW5jbHVkZV9wbHVnaW5kaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wbHVnaW4KK2luY2x1ZGVfcGx1Z2luX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaAorCitpbmNsdWRlX3dpbmRvd3NkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS93aW5kb3dzCitpbmNsdWRlX3dpbmRvd3NfSEVBREVSUyA9IHNyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAorZW5kaWYKIAogV0lORE9XU19ESVNUID0gXAogICAgICAgICAgICAgIGNvbXBpbGVyLnNsbiBcCkBAIC0xMDMsOSArMTkyLDE2IEBACiAgICAgICAgICAgICAgY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCiAKIEVYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgdGVzdCBcCiAgICAgICAgICAgICAgJChXSU5ET1dTX0RJU1QpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIHRocmlmdGwuY2MgdGhyaWZ0eS5jYyB0aHJpZnR5LmggdmVyc2lvbi5oIHdpbmRvd3MvdmVyc2lvbi5oCisJJChSTSkgdmVyc2lvbi5oICQocGx1Z2luX2dlbikKIAotc3JjL21haW4uY2M6IHZlcnNpb24uaAorc3JjL3RocmlmdC9tYWluLmNjOiBzcmMvdGhyaWZ0L3ZlcnNpb24uaAorCitzdHlsZS1sb2NhbDoKKyAgJChDUFBTVFlMRV9DTUQpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvUkVBRE1FLm1kIGIvY29tcGlsZXIvY3BwL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVhYzlmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL1JFQURNRS5tZApAQCAtMCwwICsxLDE3NSBAQAorIyBCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlCisKKzwhLS0gVE9DIC0tPgorCistIFtCdWlsZCBUaHJpZnQgSURMIGNvbXBpbGVyIHVzaW5nIENNYWtlXSgjYnVpbGQtdGhyaWZ0LWlkbC1jb21waWxlci11c2luZy1jbWFrZSkKKyAgICAtIFtCdWlsZCBvbiBVbml4LWxpa2UgU3lzdGVtXSgjYnVpbGQtb24tdW5peC1saWtlLXN5c3RlbSkKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIENNYWtlXSgjYnVpbGQtdXNpbmctY21ha2UpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIEVjbGlwc2UgSURFXSgjYnVpbGQtd2l0aC1lY2xpcHNlLWlkZSkKKyAgICAgICAgICAgIC0gW0J1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TXSgjYnVpbGQtd2l0aC14Y29kZS1pZGUtaW4tbWFjb3MpCisgICAgICAgICAgICAtIFtVc2FnZSBvZiBvdGhlciBJREVzXSgjdXNhZ2Utb2Ytb3RoZXItaWRlcykKKyAgICAtIFtCdWlsZCBvbiBXaW5kb3dzXSgjYnVpbGQtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlc10oI3ByZXJlcXVpc2l0ZXMtMSkKKyAgICAgICAgLSBbQnVpbGQgdXNpbmcgR2l0IEJhc2hdKCNidWlsZC11c2luZy1naXQtYmFzaCkKKyAgICAgICAgLSBbVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb25dKCN1c2luZy12aXN1YWwtc3R1ZGlvLWFuZC13aW4tZmxleC1iaXNvbikKKyAgICAgICAgLSBbQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2tdKCNjcm9zcy1jb21waWxlLXVzaW5nLW1pbmd3MzItYW5kLWdlbmVyYXRlLWEtd2luZG93cy1pbnN0YWxsZXItd2l0aC1jcGFjaykKKy0gW090aGVyIGNhc2VzXSgjb3RoZXItY2FzZXMpCisgICAgLSBbQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cyB3aXRob3V0IENNYWtlXSgjYnVpbGRpbmctdGhlLXRocmlmdC1pZGwtY29tcGlsZXItaW4td2luZG93cy13aXRob3V0LWNtYWtlKQorLSBbVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXJdKCN1bml0LXRlc3RzLWZvci1jb21waWxlcikKKyAgICAtIFtVc2luZyBib29zdCB0ZXN0XSgjdXNpbmctYm9vc3QtdGVzdCkKKyAgICAtIFtVc2luZyBDYXRjaCBDKysgdGVzdCBsaWJyYXJ5XSgjdXNpbmctY2F0Y2gtYy10ZXN0LWxpYnJhcnkpCistIFtIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5c10oI2hhdmUtYS1oYXBweS1mcmVlLXRpbWUtYW5kLWhvbGlkYXlzKQorCis8IS0tIC9UT0MgLS0+CisKKyMjIEJ1aWxkIG9uIFVuaXgtbGlrZSBTeXN0ZW0KKworIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZQorLSBJbnN0YWxsIGZsZXggYW5kIGJpc29uCisKKyMjIyBCdWlsZCB1c2luZyBDTWFrZQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAuLgorbWFrZQorYGBgCisKKyMjIyMgQnVpbGQgd2l0aCBFY2xpcHNlIElERQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWVjICYmIGNkIGNtYWtlLWVjCitjbWFrZSAtRyAiRWNsaXBzZSBDRFQ0IC0gVW5peCBNYWtlZmlsZXMiIC4uCittYWtlCitgYGAKKworTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS1lYyB1c2luZyBlY2xpcHNlLgorCisjIyMjIEJ1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TCisKKy0gSW5zdGFsbC91cGRhdGUgZmxleCwgYmlzb24gYW5kIGNtYWtlIHdpdGggYnJldworCitgYGAKK2JyZXcgaW5zdGFsbCBjbWFrZQorYnJldyBpbnN0YWxsIGJpc29uCitgYGAKKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAtRyAiWGNvZGUiIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMjIFVzYWdlIG9mIG90aGVyIElERXMKKworUGxlYXNlIGNoZWNrIGxpc3Qgb2Ygc3VwcG9ydGVkIElERSAKKworYGBgCitjbWFrZSAtLWhlbHAKK2BgYAorCisjIyBCdWlsZCBvbiBXaW5kb3dzCisKKyMjIyBQcmVyZXF1aXNpdGVzCistIEluc3RhbGwgQ01ha2UgLSBodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRob3V0IEdpdCBCYXNoIC0gaW5zdGFsbCB3aW5mbGV4Ymlzb24gLSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vCistIEluIGNhc2UgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBWaXN1YWwgU3R1ZGlvIC0gaW5zdGFsbCBWaXN1YWwgU3R1ZGlvIAorICAtIEJldHRlciB0byB1c2UgdGhlIGxhdGVzdCBzdGFibGUgVmlzdWFsIFN0dWRpbyBDb21tdW5pdHkgRWRpdGlvbiAtIGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvIChlbnN1cmUgdGhhdCB5b3UgaW5zdGFsbGVkIHdvcmtsb2FkICJEZXNrdG9wIERldmVsb3BtZW50IHdpdGggQysrIiBmb3IgVlMyMDE3KSAtIE1pY3Jvc29mdCBhZGRlZCBzb21lIHN1cHBvcnQgZm9yIENNYWtlIGFuZCBpbXByb3ZpbmcgaXQgaW4gVmlzdWFsIFN0dWRpbworCisjIyMgQnVpbGQgdXNpbmcgR2l0IEJhc2gKKworR2l0IEJhc2ggcHJvdmlkZXMgZmxleCBhbmQgYmlzb24KKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMgVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb24KKworLSBHZW5lcmF0ZSBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmb3IgdmVyc2lvbiBvZiBWaXN1YWwgU3R1ZGlvIHdoaWNoIHlvdSBoYXZlICgqKmNtYWtlIC0taGVscCoqIGNhbiBzaG93IGxpc3Qgb2Ygc3VwcG9ydGFibGUgVlMgdmVyc2lvbnMpOgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTciIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitgYGAKKy0gTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS12cyB1c2luZyBWaXN1YWwgU3R1ZGlvLgorCisjIyMgQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2sKKworYGBgCitta2RpciBjbWFrZS1taW5ndzMyICYmIGNkIGNtYWtlLW1pbmd3MzIKK2NtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLURCVUlMRF9DT01QSUxFUj1PTiAtREJVSUxEX0xJQlJBUklFUz1PRkYgLURCVUlMRF9URVNUSU5HPU9GRiAtREJVSUxEX0VYQU1QTEVTPU9GRiAuLgorY3BhY2sKK2BgYAorCisjIE90aGVyIGNhc2VzCisKKyMjIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZQorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgQ01ha2UgeW91IGNhbiB1c2UgdGhlIGFscmVhZHkgYXZhaWxhYmxlIFZpc3VhbCBTdHVkaW8gMjAxMCBzb2x1dGlvbi4KKworVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlIHRocmlmdGwuY2MsIHRocmlmdHkuY2MgYW5kIHRocmlmdHkuaGggZmlsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgY29tcGlsZXIuIAorCitUaGVzZSBkZXBlbmQgb24gYmlzb24sIGZsZXggYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB0byB3b3JrIHByb3Blcmx5LgorCitEb3dubG9hZCBmbGV4ICYgYmlzb24gYXMgZGVzY3JpYmVkIGFib3ZlLiAKKworUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoIGFuZCByZW5hbWUgd2luX2ZsZXguZXhlIGFuZCB3aW5fYmlzb24uZXhlIHRvIGZsZXguZXhlIGFuZCBiaXNvbi5leGUgcmVzcGVjdGl2ZWx5LgorCitJZiB0aGlzIGRvZXNuJ3Qgd29yayBvbiBhIHN5c3RlbSwgdHJ5IHRoZXNlIG1hbnVhbCBwcmUtYnVpbGQgc3RlcHMuCisKK09wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzOiBQcm9wZXJ0aWVzIC0+IEJ1aWxkIEV2ZW50cyAtPiBQcmUtQnVpbGQgRXZlbnRzLgorCitGcm9tIGEgY29tbWFuZCBwcm9tcHQ6CitgYGAKK2NkIHRocmlmdC9jb21waWxlci9jcHAKK2ZsZXggLW8gc3JjXHRocmlmdFx0aHJpZnRsLmNjIHNyY1x0aHJpZnRcdGhyaWZ0bC5sbAorYGBgCitJbiB0aGUgZ2VuZXJhdGVkIHRocmlmdGwuY2MsIGNvbW1lbnQgb3V0ICNpbmNsdWRlIDx1bmlzdGQuaD4KKworUGxhY2UgYSBjb3B5IG9mIGJpc29uLnNpbXBsZSBpbiB0aHJpZnQvY29tcGlsZXIvY3BwCitgYGAKK2Jpc29uIC15IC1vICJzcmMvdGhyaWZ0L3RocmlmdHkuY2MiIC0tZGVmaW5lcyBzcmMvdGhyaWZ0L3RocmlmdHkueXkKK21vdmUgc3JjXHRocmlmdFx0aHJpZnR5LmNjLmhoICBzcmNcdGhyaWZ0XHRocmlmdHkuaGgKK2BgYAorCitCaXNvbiBtaWdodCBnZW5lcmF0ZSB0aGUgeWFjYyBoZWFkZXIgZmlsZSAidGhyaWZ0eS5jYy5oIiB3aXRoIGp1c3Qgb25lIGggIi5oIiBleHRlbnNpb247IGluIHRoaXMgY2FzZSB5b3UnbGwgaGF2ZSB0byByZW5hbWUgdG8gInRocmlmdHkuaCIuCisKK2BgYAorbW92ZSBzcmNcdGhyaWZ0XHZlcnNpb24uaC5pbiBzcmNcdGhyaWZ0XHZlcnNpb24uaAorYGBgCisKK0Rvd25sb2FkIGludHR5cGVzLmggZnJvbSB0aGUgaW50ZXJ3ZWJzIGFuZCBwbGFjZSBpdCBpbiBhbiBpbmNsdWRlIHBhdGgKK2xvY2F0aW9uIChlLmcuIHRocmlmdC9jb21waWxlci9jcHAvc3JjKS4KKworQnVpbGQgdGhlIGNvbXBpbGVyIGluIFZpc3VhbCBTdHVkaW8uCisKKyMgVW5pdCB0ZXN0cyBmb3IgY29tcGlsZXIKKworIyMgVXNpbmcgYm9vc3QgdGVzdAorLSBwbHMgY2hlY2sgKip0ZXN0KiogZm9sZGVyCisKKyMjIFVzaW5nIENhdGNoIEMrKyB0ZXN0IGxpYnJhcnkKKworQWRkZWQgZ2VuZXJpYyB3YXkgdG8gY292ZXIgY29kZSBieSB0ZXN0cyBmb3IgbWFueSBsYW5ndWFnZXMgKHlvdSBqdXN0IG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgaGVhZGVyIGZpbGUgZm9yIGdlbmVyYXRvciBmb3IgeW91ciBsYW5ndWFnZSAtIGV4YW1wbGUgaW4gKipuZXRjb3JlKiogaW1wbGVtZW50YXRpb24pCisKKy0gcGxzIGNoZWNrICoqdGVzdHMqKiBmb2xkZXIKKworIyBIYXZlIGEgSGFwcHkgZnJlZSB0aW1lIGFuZCBob2xpZGF5cyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvUkVBRE1FX1dpbmRvd3MudHh0IGIvY29tcGlsZXIvY3BwL1JFQURNRV9XaW5kb3dzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmY2NlYS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvUkVBRE1FX1dpbmRvd3MudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotQnVpbGRpbmcgdGhlIFRocmlmdCBJREwgY29tcGlsZXIgaW4gV2luZG93cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGNvbnRhaW5zIHByZS1idWlsZCBjb21tYW5kcyB0byBnZW5lcmF0ZSB0aGUgCi10aHJpZnRsLmNjLCB0aHJpZnR5LmNjIGFuZCB0aHJpZnR5LmggZmlsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBidWlsZCAKLXRoZSBjb21waWxlci4gVGhlc2UgZGVwZW5kIG9uIGJpc29uLCBmbGV4IGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdG8KLXdvcmsgcHJvcGVybHkuIElmIHRoaXMgZG9lc24ndCB3b3JrIG9uIGEgc3lzdGVtLCB0cnkgdGhlc2UgbWFudWFsCi1wcmUtYnVpbGQgc3RlcHMuCi0KLU9wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzCi0gUHJvcGVydGllcyAtPiBCdWlsZCBFdmVudHMgLT4gUHJlLUJ1aWxkIEV2ZW50cy4KLQotRG93bmxvYWQgZmxleCAmIGJpc29uIGZyb20gaHR0cDovL2phaXNhbnRvbnlrLndvcmRwcmVzcy5jb20vMjAwOC8wMy8xNi9sZXgtYW5kLXlhY2NiaXNvbi1pbi13aW5kb3dzLwotRG93bmxvYWQgYmlzb24uc2ltcGxlIGluIGFkZGl0aW9uIHRvIGJpc29uLmV4ZSAuIFRoaXMgYnVpbGQgb2YgYmlzb24gaXMgZWFzaWVyIHRvIHVzZQotdGhhbiB0aGUgb25lIG9uIHNvdXJjZWZvcmdlIHdoaWNoIGhhcyBhIG15cmlhZCBvZiBkZXBlbmRlbmNpZXMuCi1QbGFjZSB0aGVzZSBiaW5hcmllcyBzb21ld2hlcmUgaW4gdGhlIHBhdGguCi0KLUZyb20gYSBjb21tYW5kIHByb21wdDoKLT4gY2QgdGhyaWZ0L2NvbXBpbGVyL2NwcAotPiBmbGV4IC1vc3JjXHRocmlmdGwuY2Mgc3JjXHRocmlmdGwubGwKLUluIHRoZSBnZW5lcmF0ZWQgdGhyaWZ0bC5jYywgY29tbWVudCBvdXQgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi1QbGFjZSBhIGNvcHkgb2YgYmlzb24uc2ltcGxlIGluIHRocmlmdC9jb21waWxlci9jcHAKLT4gYmlzb24gLXkgLW8gInNyYy90aHJpZnR5LmNjIiAtLWRlZmluZXMgc3JjL3RocmlmdHkueXkKLT4gbW92ZSBzcmNcdGhyaWZ0eS5jYy5oICBzcmNcdGhyaWZ0eS5oCi0KLURvd25sb2FkIGludHR5cGVzLmggZnJvbSB0aGUgaW50ZXJ3ZWJzIGFuZCBwbGFjZSBpdCBpbiBhbiBpbmNsdWRlIHBhdGggCi1sb2NhdGlvbiAoZS5nLiB0aHJpZnQvY29tcGlsZXIvY3BwL3NyYykuCi0KLUJ1aWxkIHRoZSBjb21waWxlciBpbiBWaXN1YWwgU3R1ZGlvLgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9jb21waWxlci9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTA4OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw0IEBACisjIyBDb21waWxlciBDb2RpbmcgU3RhbmRhcmRzCisKKyAqIFdoZW4gbWFraW5nIHNtYWxsIGNoYW5nZSAvIGJ1Z2ZpeCAtIGZvbGxvdyBzdHlsZSBhcyBzZWVuIGluIG5lYXJieSBjb2RlLgorICogV2hlbiBtYWtpbmcgbWFqb3IgcmVmYWN0b3IgYW5kIC8gb3IgYWRkaW5nIG5ldyBmZWF0dXJlIC0gZm9sbG93IHN0eWxlIGZvciBDKysgbGlicmFyeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKaW5kZXggZjQ2YWFhYi4uMDYyOGI1NCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKQEAgLTE5LDY4ICsxOSw4MCBAQAogICAgIDwvUHJvamVjdENvbmZpZ3VyYXRpb24+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X29vcF9nZW5lcmF0b3IuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2xvYmFscy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXG1haW4uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtZDUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Jhc2VfdHlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfY29uc3QuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2NvbnN0X3ZhbHVlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9jb250YWluZXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2RvYy5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZW51bS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZW51bV92YWx1ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfZmllbGQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Z1bmN0aW9uLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9saXN0LmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9tYXAuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3Byb2dyYW0uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3Njb3BlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXJ2aWNlLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNccGFyc2VcdF9zZXQuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X3N0cnVjdC5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHBsYXRmb3JtLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHdpbmRvd3NcY29uZmlnLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcd2luZG93c1x2ZXJzaW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGF1ZGl0XHRfYXVkaXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29tbW9uLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb29wX2dlbmVyYXRvci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdsb2JhbHMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcbWFpbi5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2Jhc2VfdHlwZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2NvbnN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfY29uc3RfdmFsdWUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9jb250YWluZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9kb2MuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9lbnVtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZW51bV92YWx1ZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X2ZpZWxkLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfZnVuY3Rpb24uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF9saXN0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfbWFwLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfcHJvZ3JhbS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3Njb3BlLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHRfc2VydmljZS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3NldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3N0cnVjdC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGUuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccGFyc2VcdF90eXBlZGVmLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBsYXRmb3JtLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuaGgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHZlcnNpb24uaCIgLz4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY29jb2FfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfY3BwX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZXJsX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfamF2YW1lX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2phdmFfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcGVybF9nZW5lcmF0b3IuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9waHBfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcmJfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeHNkX2dlbmVyYXRvci5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xtYWluLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXG1kNS5jIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHBhcnNlLmNjIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdGwuY2MiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXVkaXRcdF9hdWRpdC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbW1vbi5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NvY29hX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jcHBfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NzaGFycF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfbmV0Y29yZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY19nbGliX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kYXJ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2VybF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2dvX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9ndl9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaGF4ZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfaHNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2h0bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2phdmFtZV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfamF2YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfanNfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2pzb25fZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2x1YV9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfb2NhbWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BlcmxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XG1haW4uY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHBhcnNlXHBhcnNlLmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwYXJzZVx0X3R5cGVkZWYuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdGwuY2MiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkuY2MiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRsLmxsIiAvPgotICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnR5Lnl5IiAvPgorICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcdGhyaWZ0bC5sbCIgLz4KKyAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CiAgICAgPFByb2plY3RHdWlkPns4OTk3NUExQS1GNzk5LTQ1NTYtOThCOC02NEUzMEFCMzlBOTB9PC9Qcm9qZWN0R3VpZD4KQEAgLTE1Nyw3ICsxNjksNyBAQAogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtfREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz5jb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTE2NSw4ICsxNzcsNyBAQAogICAgICAgPEdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj50cnVlPC9HZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+CiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgotICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPgpAQCAtMTc2LDcgKzE4Nyw3IEBACiAgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgogICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgogICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO19ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPmNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CiAgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgpAQCAtMTg0LDggKzE5NSw3IEBACiAgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4KICAgICA8L0xpbms+CiAgICAgPFByZUJ1aWxkRXZlbnQ+Ci0gICAgICA8Q29tbWFuZD5mbGV4IC1vICJzcmNcdGhyaWZ0bC5jYyIgc3JjL3RocmlmdGwubGwKLWJpc29uIC15IC1vICJzcmNcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmMvdGhyaWZ0eS5oIiBzcmMvdGhyaWZ0eS55eTwvQ29tbWFuZD4KKyAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KICAgICA8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvSXRlbURlZmluaXRpb25Hcm91cD4KICAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CkBAIC0xOTcsOCArMjA3LDkgQEAKICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgogICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPmNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CiAgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CkBAIC0yMDcsOCArMjE4LDcgQEAKICAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgogICAgIDwvTGluaz4KICAgICA8UHJlQnVpbGRFdmVudD4KLSAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1x0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CkBAIC0yMjAsOCArMjMwLDkgQEAKICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgogICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO01JTkdXO1lZX05PX1VOSVNURF9IO05ERUJVRztfQ09OU09MRTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPmNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGNvbmZpZy5oPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CiAgICAgICA8Q29tcGlsZUFzPkNvbXBpbGVBc0NwcDwvQ29tcGlsZUFzPgorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5Db25zb2xlPC9TdWJTeXN0ZW0+CkBAIC0yMzAsOCArMjQxLDcgQEAKICAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPgogICAgIDwvTGluaz4KICAgICA8UHJlQnVpbGRFdmVudD4KLSAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1x0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0bC5sbAotYmlzb24gLXkgLW8gInNyY1x0aHJpZnR5LmNjIiAtLWRlZmluZXM9InNyYy90aHJpZnR5LmgiIHNyYy90aHJpZnR5Lnl5PC9Db21tYW5kPgorICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycyBiL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKaW5kZXggNjgzNmYwZC4uYjk2ODY1YiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycworKysgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCkBAIC0xLDYgKzEsNyBAQAog77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KICAgPEl0ZW1Hcm91cD4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xhdWRpdFx0X2F1ZGl0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nZW5lcmF0b3IuaCI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC0xNSw3ICsxNiw2IEBACiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcZ2xvYmFscy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXG1haW4uaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xtZDUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwYXJzZVx0X2Jhc2VfdHlwZS5oIj4KICAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgIDxGaWx0ZXI+cGFyc2U8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1xwbGF0Zm9ybS5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdHkuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnR5LmhoIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHdpbmRvd3NcY29uZmlnLmgiPgogICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC05MSw2ICs5MSw3IEBACiAgICAgPC9GaWx0ZXI+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGF1ZGl0XHRfYXVkaXQuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9hczNfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTEwOSw2ICsxMTAsOSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZF9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGFydF9nZW5lcmF0b3IuY2MiPgorICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZGVscGhpX2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0xMjEsNiArMTI1LDEyIEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9nb19nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfZ3ZfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hheGVfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X2hzX2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0xNTEsMjIgKzE2MSwzOSBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcmJfZ2VuZXJhdG9yLmNjIj4KICAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3JzX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9zdF9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfc3dpZnRfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3hzZF9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfeG1sX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcbWFpbi5jYyIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xtZDUuYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xwYXJzZVxwYXJzZS5jYyI+CiAgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0bC5jYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnR5LmNjIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHBhcnNlXHRfdHlwZWRlZi5jYyI+CisgICAgICA8RmlsdGVyPnBhcnNlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9qc29uX2dlbmVyYXRvci5jYyI+CisgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9sdWFfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdGwubGwiIC8+CiAgICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdHkueXkiIC8+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMmM1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsODcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIworIyBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorIyBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorIyBkZXRhaWxzLgorCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMKKworQU1fWUZMQUdTID0gLWQKKworQlVJTFRfU09VUkNFUyA9IHRocmlmdC90aHJpZnR5LmNjCisKK25vaW5zdF9MSUJSQVJJRVMgPSB0aHJpZnQvbGlicGFyc2UuYQorCit0aHJpZnRfbGlicGFyc2VfYV9DUFBGTEFHUyA9IC1JJChzcmNkaXIpCit0aHJpZnRfbGlicGFyc2VfYV9DWFhGTEFHUyA9IC1XYWxsIC1Xbm8tc2lnbi1jb21wYXJlIC1Xbm8tdW51c2VkCisKK3RocmlmdF9saWJwYXJzZV9hX1NPVVJDRVMgPSB0aHJpZnQvdGhyaWZ0eS55eSBcCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQvdGhyaWZ0bC5sbAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB0aHJpZnQvdGhyaWZ0bC5jYyB0aHJpZnQvdGhyaWZ0eS5jYyB0aHJpZnQvdGhyaWZ0eS5oIHRocmlmdC90aHJpZnR5LmhoCisKK2lmIFdJVEhfUExVR0lOCitub2luc3RfUFJPR1JBTVMgPSB0aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCit0aHJpZnRfdGhyaWZ0X2Jvb3RzdHJhcF9TT1VSQ0VTID0gXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvY29tbW9uLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9hdWRpdC90X2F1ZGl0LmNwcCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dsb2JhbHMuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wbGF0Zm9ybS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2xvZ2dpbmcuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X2RvYy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9saXN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9zZXQuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X21hcC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9maWVsZC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS90X3Njb3BlLmggXAorICAgICAgICAgICAgICAgICB0aHJpZnQvcGFyc2UvdF9jb25zdC5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9wYXJzZS9wYXJzZS5jYyBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC93aW5kb3dzL2NvbmZpZy5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L3ZlcnNpb24uaCBcCisgICAgICAgICAgICAgICAgIHRocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICB0aHJpZnQvbWFpbi5oIFwKKyAgICAgICAgICAgICAgICAgdGhyaWZ0L21haW4uY2MKKworbWFpbi5jYzogdmVyc2lvbi5oCisKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK3RocmlmdF90aHJpZnRfYm9vdHN0cmFwX0xEQUREID0gQExFWExJQkAgdGhyaWZ0L2xpYnBhcnNlLmEKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUxNGYxLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjY5NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogQVMzIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9hczNfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2FzM19nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIAotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiaW5kYWJsZSIpOwotICAgIGJpbmRhYmxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICAKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1hczMiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgLy9yZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwotICB2b2lkIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKLSAgLy9yZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKLSAgCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAKLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICAgdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGFzM19wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgYXMzX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyYgaW1wb3J0cyk7IAotICBzdGQ6OnN0cmluZyBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpOyAKLSAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlLCBib29sIGluX2luaXQ9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLSAgCi0gIGJvb2wgYmluZGFibGVfOwkKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJhczMiKTsKLQotICBzdHJpbmcgZGlyID0gcGFja2FnZV9uYW1lXzsKLSAgc3RyaW5nIHN1YmRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBkaXIuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXIuc3Vic3RyKDAsIGxvYyk7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgIGRpciA9IGRpci5zdWJzdHIobG9jKzEpOwotICB9Ci0gIGlmIChkaXIuc2l6ZSgpID4gMCkgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gIH0KLQotICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLS8qKgotICogUGFja2FnZXMgdGhlIGdlbmVyYXRlZCBmaWxlCi0gKgotICogQHJldHVybiBTdHJpbmcgb2YgdGhlIHBhY2thZ2UsIGkuZS4gInBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnRkZW1vOyIKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3BhY2thZ2UoKSB7Ci0gIGlmICghcGFja2FnZV9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiICI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBBczMgdHlwZXMgdGhhdCBhcmUgdXNlZCBpbiBoZXJlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190eXBlX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNldDtcbiIgKwotICAgICJpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5O1xuIiArCi0gICAgImltcG9ydCBmbGFzaC51dGlscy5EaWN0aW9uYXJ5O1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBhczMgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgdGhyaWZ0Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFzM190aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7XG5cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIGltcG9ydHMgbmVlZGVkIGZvciBhIGdpdmVuIHR5cGUKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGEgZ2l2ZW4gdF9zdHJ1Y3QKLSAqLwotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6YXMzX3RocmlmdF9nZW5faW1wb3J0cyh0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nJiBpbXBvcnRzKSB7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAvL0ZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiYXMzIik7Ci0gICAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgICBpZiAoaW1wb3J0cy5maW5kKHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkpID09IHN0cmluZzo6bnBvcykgewotICAgICAgICAgIGltcG9ydHMuYXBwZW5kKCJpbXBvcnQgIiArIHBhY2thZ2UgKyAiLiIgKyAoKm1faXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgKyAiO1xuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGltcG9ydHM7ICAKLX0KLQotCi0vKioKLSAqIFByaW50cyBpbXBvcnRzIG5lZWRlZCBmb3IgYSBnaXZlbiB0eXBlCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBhIGdpdmVuIHRfc2VydmljZQotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjphczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGltcG9ydHM7Ci0gIGNvbnN0IHZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvL0ZvciBlYWNoIHR5cGUgY2hlY2sgaWYgaXQgaXMgZnJvbSBhIGRpZmZlcm5ldCBuYW1lc3BhY2UKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9wcm9ncmFtKCk7Ci0gICAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgICAgaWYgKCFwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICAgICAgaWYgKGltcG9ydHMuZmluZChwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpKSA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgICBpbXBvcnRzLmFwcGVuZCgiaW1wb3J0ICIgKyBwYWNrYWdlICsgIi4iICsgKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5nZXRfbmFtZSgpICsgIjtcbiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGltcG9ydHMpOwkgICAgCi0gICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cygoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSwgaW1wb3J0cyk7CSAgICAKLQotICB9Ci0gCi0gIHJldHVybiBpbXBvcnRzOwotCi19Ci0KLS8qKgotICogTm90aGluZyBpbiBBczMKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBBczMsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmFzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKLQotICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0Ci0gIGZfZW51bSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgYXMzX3BhY2thZ2UoKSA8PCBlbmRsOwotICAKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLSAgLy8gQWRkIGFzMyBpbXBvcnRzCi0gIGZfZW51bSA8PCBzdHJpbmcoKSArCi0gICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuU2V0OyIgPDwgZW5kbCA8PAotICAiaW1wb3J0IGZsYXNoLnV0aWxzLkRpY3Rpb25hcnk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiAiOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8Ci0gICAgICAicHVibGljIHN0YXRpYyBjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgIjppbnQgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBDcmVhdGUgYSBzdGF0aWMgU2V0IHdpdGggYWxsIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBlbnVtCi0gIGZfZW51bSA8PCBlbmRsOwotICAKLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMSURfVkFMVUVTOlNldCA9IG5ldyBTZXQoIjsKLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3RWYWx1ZSA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gcG9wdWxhdGUgc2V0Ci0gICAgZl9lbnVtIDw8IChmaXJzdFZhbHVlID8gIiIgOiAiLCAiKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZmlyc3RWYWx1ZSA9IGZhbHNlOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfZW51bSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgVkFMVUVTX1RPX05BTUVTOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLQotICBzY29wZV91cChmX2VudW0pOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGluZGVudChmX2VudW0pIDw8ICJWQUxVRVNfVE9fTkFNRVNbIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIl0gPSBcIiIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0gIAotICBzY29wZV9kb3duKGZfZW51bSk7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOyAvLyBlbmQgY2xhc3MKLSAgCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsgLy8gZW5kIHBhY2thZ2UKLSAgCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5hcyI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOwotICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfY29uc3RzKTsKLSAgZl9jb25zdHMgPDwgZW5kbDsKLSAgCi0gIGZfY29uc3RzIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLQotIAotICAKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgCi0gIGluZGVudChvdXQpOwotICBpZiAoIWRlZnZhbCkgewotICAgIG91dCA8PAotICAgIChpbl9zdGF0aWMgPyAidmFyICIgOiAicHVibGljIHN0YXRpYyBjb25zdCAiKTsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWU7Ci0gICAgaWYgKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgbmFtZTsKLSAgICBpZighZGVmdmFsKSB7Ci0gICAgICBvdXQgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgPSAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG91dCA8PCBuYW1lIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCBuYW1lOwotICAgIGlmKCFkZWZ2YWwpewotICAgICAgb3V0IDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSk7Ci0gICAgfQotICAgIG91dCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBmdW5jdGlvbigpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lOwotICAgIGlmKCFkZWZ2YWwpIHsKLSAgICAgIG91dCA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIH0KLSAgICBvdXQgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgZnVuY3Rpb24oKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi4iIDw8ICh0eXBlLT5pc19saXN0KCkgPyAicHVzaCIgOiAiYWRkIikgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotICAKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotICAKLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBkYXRhIG1lbWJlcnMsIHJlYWQoKSwgd3JpdGUoKSwgYW5kIGFuIGlubmVyIElzc2V0IGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2FzM19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogQXMzIHN0cnVjdCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuYXMiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc3RydWN0KTsKLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLSAgCi0gIHN0cmluZyBpbXBvcnRzOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXMzX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgYXMzX3RocmlmdF9pbXBvcnRzKCkgPDwgCi0gICAgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c3RydWN0LCBpbXBvcnRzKSA8PCBlbmRsOwotICAKLSAgaWYgKGJpbmRhYmxlXyAmJiAhIGlzX2V4Y2VwdGlvbikgewotICAgIGZfc3RydWN0IDw8ICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50OyIgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsiIDw8IGVuZGwgPDwKLSAgICAiaW1wb3J0IG14LmV2ZW50cy5Qcm9wZXJ0eUNoYW5nZUV2ZW50OyIgPDwgZW5kbDsKLSAgfQotICAKLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKLSAgCi0gIHNjb3BlX2Rvd24oZl9zdHJ1Y3QpOyAvLyBlbmQgb2YgcGFja2FnZQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi0vKioKLSAqIEFzMyBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIGdlbmVyYXRlX2FzM19kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0gIGJvb2wgYmluZGFibGUgPSAhIGlzX2V4Y2VwdGlvbiAmJiAhIGluX2NsYXNzICYmIGJpbmRhYmxlXzsKLQotICBpbmRlbnQob3V0KSA8PCAoaW5fY2xhc3MgPyAiIiA6ICJwdWJsaWMgIikgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwKLSAgICAgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFcnJvciAiOwotICB9Ci0gIGVsc2UgaWYgKGJpbmRhYmxlKSB7Ci0gICAgb3V0IDw8ICJleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciAiOwotICB9Ci0gIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSAiOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHJpdmF0ZSBzdGF0aWMgY29uc3QgU1RSVUNUX0RFU0M6VFN0cnVjdCA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWFzMywgcHJpdmF0ZSBmb3IgLWFzM2JlYW4KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJwcml2YXRlIHN0YXRpYyBjb25zdCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIl9GSUVMRF9ERVNDOlRGaWVsZCA9IG5ldyBURmllbGQoXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9hczNfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgdmFyIF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgY29uc3QgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjppbnQgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0gIAotICBvdXQgPDwgZW5kbDsKLSAgCi0gIC8vIElubmVyIElzc2V0IGNsYXNzCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCgoKm1faXRlciktPmdldF90eXBlKCkpKXsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgInByaXZhdGUgdmFyIF9faXNzZXRfIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjpCb29sZWFuID0gZmFsc2U7IiA8PCAgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICB9Ci0gIAotICBvdXQgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG91dCwgdHN0cnVjdCk7Ci0gIAotICAvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgdG8gcG9wdWxhdGUgZ2xvYmFsIGNsYXNzIHRvIHN0cnVjdCBtZXRhZGF0YSBtYXAKLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcCgiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCBtZXRhRGF0YU1hcCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwKLSAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkgPDwgIjsiIDw8Ci0gICAgICBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgZ2VuZXJhdGVfYXMzX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0LCBiaW5kYWJsZSk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaWYgKGlzX3Jlc3VsdCkgewotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QsIGJpbmRhYmxlKTsKLSAgZ2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHJlYWQgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGZpZWxkOlRGaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN3aXRjaCAoZmllbGQuaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICpmX2l0ZXIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsgIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBpbiBub24tYmVhbnMgc3R5bGUsIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUKLSAgICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZSwgd2hpY2ggY2FuJ3QgYmUgY2hlY2tlZCBpbiB0aGUgdmFsaWRhdGUgbWV0aG9kIiA8PCBlbmRsOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoIV9faXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICAgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBhczMgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM192YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KXsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7ICAKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IFRQcm90b2NvbEVycm9yKFRQcm90b2NvbEVycm9yLlVOS05PV04sIFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIHdhcyBub3QgcHJlc2VudCEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gYWxhcywgd2UgY2Fubm90IGNoZWNrICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBiZWNhdXNlIGl0J3MgYSBwcmltaXRpdmUgYW5kIHlvdSBjaG9zZSB0aGUgbm9uLWJlYW5zIGdlbmVyYXRvci4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayB0aGF0IGZpZWxkcyBvZiB0eXBlIGVudW0gaGF2ZSB2YWxpZCB2YWx1ZXMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgdF90eXBlKiB0eXBlID0gZmllbGQtPmdldF90eXBlKCk7Ci0gICAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgICBpZiAodHlwZS0+aXNfZW51bSgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiAmJiAhIiA8PCBnZXRfZW51bV9jbGFzc19uYW1lKHR5cGUpIDw8ICIuVkFMSURfVkFMVUVTLmNvbnRhaW5zKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIikpeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFcnJvcihUUHJvdG9jb2xFcnJvci5VTktOT1dOLCBcIlRoZSBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiJyBoYXMgYmVlbiBhc3NpZ25lZCB0aGUgaW52YWxpZCB2YWx1ZSBcIiArICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gCi0gIH0gIAotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LAotICogd2hpY2ggaXMgYSBmdW5jdGlvbiByZXN1bHQuIFRoZXNlIGZpZWxkcyBhcmUgb25seSB3cml0dGVuCi0gKiBpZiB0aGV5IGFyZSBzZXQgaW4gdGhlIElzc2V0IGFycmF5LCBhbmQgb25seSBvbmUgb2YgdGhlbQotICogY2FuIGJlIHNldCBhdCBhIHRpbWUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCk6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOyIgPDwgZW5kbDsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICIgZWxzZSBpZiAiOwotICAgIH0KLQotICAgIG91dCA8PCAiKHRoaXMuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiX0ZJRUxEX0RFU0MpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICAodm9pZCkgdHlwZTsKLSAgKHZvaWQpIGNhcF9uYW1lOwotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IHVwY2FzZV9zdHJpbmcoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gICh2b2lkKSB0eXBlOwotICAodm9pZCkgY2FwX25hbWU7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLQotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZ2V0dGVyX3N0cmVhbTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHNldHRlcl9zdHJlYW07Ci0KLSAgLy8gYnVpbGQgdXAgdGhlIGJvZGllcyBvZiBib3RoIHRoZSBnZXR0ZXIgYW5kIHNldHRlciBhdCBvbmNlCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICpmX2l0ZXI7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHNldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoZ2V0dGVyX3N0cmVhbSwgdHlwZSwgZmllbGRfbmFtZSwgY2FwX25hbWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotCi0gIC8vIGNyZWF0ZSB0aGUgc2V0dGVyCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRWYWx1ZShmaWVsZElEOmludCwgdmFsdWU6Kik6dm9pZCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIG91dCA8PCBzZXR0ZXJfc3RyZWFtLnN0cigpOwotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJGaWVsZCBcIiArIGZpZWxkSUQgKyBcIiBkb2Vzbid0IGV4aXN0IVwiKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGdldHRlcgotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGdldEZpZWxkVmFsdWUoZmllbGRJRDppbnQpOiogeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCkgeyIgPDwgZW5kbDsKLQotICBvdXQgPDwgZ2V0dGVyX3N0cmVhbS5zdHIoKTsKLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiRmllbGQgXCIgKyBmaWVsZElEICsgXCIgZG9lc24ndCBleGlzdCFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gY3JlYXRlIHRoZSBpc1NldCBtZXRob2QKLSAgaW5kZW50KG91dCkgPDwgIi8vIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzU2V0KGZpZWxkSUQ6aW50KTpCb29sZWFuIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElEKSB7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkZpZWxkIFwiICsgZmllbGRJRCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNldCBvZiBBczMgQmVhbiBib2lsZXJwbGF0ZSBmdW5jdGlvbnMgKHNldHRlcnMsIGdldHRlcnMsIGV0Yy4pCi0gKiBmb3IgdGhlIGdpdmVuIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLSAgICAgICAgCi0gICAgLy8gU2ltcGxlIGdldHRlcgotICAgIGdlbmVyYXRlX2FzM19kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXQgIiA8PCBmaWVsZF9uYW1lIDw8ICIoKToiIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy5fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgZ2VuZXJhdGVfYXMzX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBzdGQ6OnN0cmluZyBwcm9wTmFtZSA9IHRtcCgidGhyaWZ0UHJvcGVydHlDaGFuZ2UiKTsKLSAgICBpZiAoYmluZGFibGUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbQmluZGFibGUoZXZlbnQ9XCIiIDw8IHByb3BOYW1lIDw8ICJcIildIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHNldCAiIDw8IGZpZWxkX25hbWUgPDwgIigiIDw8IGZpZWxkX25hbWUKLSAgICAgIDw8ICI6IiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIik6dm9pZCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl8iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwKLSAgICBlbmRsOwotICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsIGZpZWxkKTsKLSAgICAKLSAgICBpZiAoYmluZGFibGUpIHsKLSAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgY3VzdG9tIGV2ZW50IHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LCBiZWNhdXNlIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQsCi0gICAgICAvLyB0aGUgc2V0dGVyIG9ubHkgZ2V0cyBjYWxsZWQgaWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIC0gdGhpcyBtZWFucyBjYWxsaW5nIGZvby5zZXRJbnRWYWx1ZSgwKQotICAgICAgLy8gd2lsbCBub3QgY2F1c2UgZm9vLmlzSW50VmFsdWVTZXQoKSB0byByZXR1cm4gdHJ1ZSBzaW5jZSB0aGUgdmFsdWUgb2YgZm9vLl9pbnRWYWx1ZSB3YXNuJ3QgY2hhbmdlZAotICAgICAgLy8gc28gdGhlIHNldHRlciB3YXMgbmV2ZXIgY2FsbGVkLgotICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiIiA8PCBwcm9wTmFtZSA8PCAiXCIpKTsiIDw8IGVuZGw7Ci0gICAgICAKLSAgICAgIC8vIEhvd2V2ZXIsIGlmIHlvdSBqdXN0IHVzZSBhIGN1c3RvbSBldmVudCwgdGhlbiBjb2xsZWN0aW9ucyB3b24ndCBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGVsZW1lbnRzCi0gICAgICAvLyBpbiB0aGUgY29sbGVjdGlvbnMgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZXkgbGlzdGVkIGZvciBQcm9wZXJ0eUNoYW5nZUV2ZW50cy4gIFNvLCB3ZSBkaXNwYXRjaCBib3RoLgotICAgICAgaW5kZW50KG91dCkgPDwgImRpc3BhdGNoRXZlbnQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudC5QUk9QRVJUWV9DSEFOR0UpKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBVbnNldHRlcgotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTp2b2lkIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICAKLSAgICAvLyBpc1NldCBtZXRob2QKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGNhcF9uYW1lIDw8ICIoKTpCb29sZWFuIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLl9faXNzZXRfIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0b1N0cmluZygpIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSkgewotICAvLyBJZiBpdCdzIGJpbmRhYmxlLCBpdCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciBzbyB0b1N0cmluZyBpcyBhbiBvdmVycmlkZS4KLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCAoYmluZGFibGUgPyAib3ZlcnJpZGUgIiA6ICIiKSA8PCAiZnVuY3Rpb24gdG9TdHJpbmcoKTpTdHJpbmcgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciByZXQ6U3RyaW5nID0gbmV3IFN0cmluZyhcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpcnN0OkJvb2xlYW4gPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgcmV0ICs9ICBcIiwgXCI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIjsiIDw8IGVuZGw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIm51bGxcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldCArPSBcIkJJTkFSWVwiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZTpTdHJpbmcgPSAiIDw8IGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIuVkFMVUVTX1RPX05BTUVTW3RoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07Ijw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIl9uYW1lICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXQgKz0gIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiX25hbWU7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiIChcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXQgKz0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICJfbmFtZSAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiKVwiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0ICs9IHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIAotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXQgKz0gXCIpXCI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiByZXQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdGF0aWMgbWFwIHdpdGggbWV0YSBkYXRhIHRvIHN0b3JlIGluZm9ybWF0aW9uIHN1Y2ggYXMgZmllbGRJRCB0bwotICogZmllbGROYW1lIG1hcHBpbmcKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gU3RhdGljIE1hcCB3aXRoIGZpZWxkSUQgLT4gRmllbGRNZXRhRGF0YSBtYXBwaW5ncwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBjb25zdCBtZXRhRGF0YU1hcDpEaWN0aW9uYXJ5ID0gbmV3IERpY3Rpb25hcnkoKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgLy8gUG9wdWxhdGUgbWFwCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGFEYXRhTWFwWyIgPDwgdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKSA8PCAiXSA9IG5ldyBGaWVsZE1ldGFEYXRhKFwiIiA8PCBmaWVsZF9uYW1lIDw8ICJcIiwgIjsKLQotICAgICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKLSAgICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgb3V0IDw8ICJURmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsICI7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBvdXQgPDwgIlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENyZWF0ZSB2YWx1ZSBtZXRhIGRhdGEgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgICBvdXQgIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci19Ci0KLS8qKiAKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgYXMzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB0aHJpZnQgdHlwZQotICogKGUuZy4gZm9yIHRoZSB0eXBlIHN0cnVjdCBpdCByZXR1cm5zICJUVHlwZS5TVFJVQ1QiKQotICovCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdldF9hczNfdHlwZV9zdHJpbmcoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRCAgIDogcmV0dXJuICAgICAgIlRUeXBlLlZPSUQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HIDogcmV0dXJuICAgICJUVHlwZS5TVFJJTkciOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCAgIDogcmV0dXJuICAgICAgIlRUeXBlLkJPT0wiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURSAgIDogcmV0dXJuICAgICAgIlRUeXBlLkJZVEUiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2ICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JMTYiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JMzIiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0ICAgIDogcmV0dXJuICAgICAgICJUVHlwZS5JNjQiOyBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFIDogcmV0dXJuICAgICJUVHlwZS5ET1VCTEUiOyBicmVhazsKLSAgICAgIGRlZmF1bHQgOiB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOyBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9hczNfZ2VuZXJhdG9yOjpnZXRfYXMzX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gIH0KLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSl7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSl7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBTdHJ1Y3RNZXRhRGF0YShUVHlwZS5TVFJVQ1QsICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKXsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKXsKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTGlzdE1ldGFEYXRhKFRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7ICAgCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IFNldE1ldGFEYXRhKFRUeXBlLlNFVCwgIjsKLSAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7ICAgIAotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgZWxlbV90eXBlKTsgCi0gICAgfSBlbHNleyAvLyBtYXAKLSAgICAgIGluZGVudChvdXQpIDw8ICJuZXcgTWFwTWV0YURhdGEoVFR5cGUuTUFQLCAiOwotICAgICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBrZXlfdHlwZSk7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIHZhbF90eXBlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBGaWVsZFZhbHVlTWV0YURhdGEoIiA8PCBnZXRfYXMzX3R5cGVfc3RyaW5nKHR5cGUpOwotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gTWFrZSBpbnRlcmZhY2UgZmlsZQotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIi5hcyI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwgYXMzX3BhY2thZ2UoKTsKLSAgCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8Ci0gICAgYXMzX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgYXMzX3RocmlmdF9pbXBvcnRzKCkgPDwKLSAgICBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gIAotICAvLyBOb3cgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24vY2xpZW50IGZpbGUKLSAgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iK3NlcnZpY2VfbmFtZV8rIkltcGwuYXMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIAotICBmX3NlcnZpY2VfIDw8Ci0gIGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7Ci0gIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICBhczNfdHlwZV9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9pbXBvcnRzKCkgPDwKLSAgYXMzX3RocmlmdF9nZW5faW1wb3J0cyh0c2VydmljZSkgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgCi0gIGZfc2VydmljZV8gPDwgYXMzX3R5cGVfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfaW1wb3J0cygpOwotICBmX3NlcnZpY2VfIDw8IGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuKjsiIDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICAKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICAKLSAgLy8gTm93IG1ha2UgdGhlIHByb2Nlc3Nvci9zZXJ2ZXIgZmlsZQotICBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiUHJvY2Vzc29yLmFzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICAKLSAgZl9zZXJ2aWNlXyA8PAotICBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwotICAKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgYXMzX3R5cGVfaW1wb3J0cygpIDw8Ci0gIGFzM190aHJpZnRfaW1wb3J0cygpIDw8Ci0gIGFzM190aHJpZnRfZ2VuX2ltcG9ydHModHNlcnZpY2UpIDw8IGVuZGw7Ci0gIAotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIAotICBmX3NlcnZpY2VfIDw8IGFzM190eXBlX2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2ltcG9ydHMoKTsKLSAgZl9zZXJ2aWNlXyA8PCBhczNfdGhyaWZ0X2dlbl9pbXBvcnRzKHRzZXJ2aWNlKSA8PGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4qOyIgPDwgZW5kbDsKLSAgCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIAotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci0gICAgCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiBleHRlbmRzICIgKyBleHRlbmRzOwotICB9Ci0KLSAgZ2VuZXJhdGVfYXMzX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGV4dGVuZHNfaWZhY2UgPDwKLSAgICAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2FzM19kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8Ci0gICAgICBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBleHRlbmRzICsgIkltcGwiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkltcGwiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgaW1wbGVtZW50cyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSW1wbCIgPDwgIihpcHJvdDpUUHJvdG9jb2wsIG9wcm90OlRQcm90b2NvbD1udWxsKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3RfID0gaXByb3Q7IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmIChvcHJvdCA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IGlwcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgdmFyIGlwcm90XzpUUHJvdG9jb2w7IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCB2YXIgb3Byb3RfOlRQcm90b2NvbDsiICA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHZhciBzZXFpZF86aW50OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dFByb3RvY29sKCk6VFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLmlwcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0UHJvdG9jb2woKTpUUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicmV0dXJuIHRoaXMub3Byb3RfOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCk6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIvL2Z1bmN0aW9uIG9uRXJyb3IoRXJyb3IpOnZvaWQ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIi8vZnVuY3Rpb24gb25TdWNjZXNzKCIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIik6dm9pZDsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIAotICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlcWlkXykpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciBhcmdzOiIgPDwgYXJnc25hbWUgPDwgIiA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90Xy53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgCi0gICAgaWYgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdF8uZ2V0VHJhbnNwb3J0KCkuZmx1c2goZnVuY3Rpb24oZXJyb3I6RXJyb3IpOnZvaWQgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGVycm9yICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKG9uRXJyb3IgIT0gbnVsbCkgb25FcnJvcihlcnJvcik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZhciBtc2c6VE1lc3NhZ2UgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0IDoiIDw8IHJlc3VsdG5hbWUgPDwgIiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LnJlYWQoaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCJzdWNjZXNzIikgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvblN1Y2Nlc3MgIT0gbnVsbCkgb25TdWNjZXNzKHJlc3VsdC5zdWNjZXNzKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAob25FcnJvciAhPSBudWxsKSBvbkVycm9yKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm47IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG9uU3VjY2VzcyAhPSBudWxsKSBvblN1Y2Nlc3MoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IobmV3IFRBcHBsaWNhdGlvbkVycm9yKFRBcHBsaWNhdGlvbkVycm9yLk1JU1NJTkdfUkVTVUxULCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKGU6VEVycm9yKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChvbkVycm9yICE9IG51bGwpIG9uRXJyb3IoZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgCi0gICAgICAKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJ9KTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiUHJvY2Vzc29yIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yKGlmYWNlOiIgPDwgc2VydmljZV9uYW1lXyA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN1cGVyKGlmYWNlKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZmFjZV8gPSBpZmFjZTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiUFJPQ0VTU19NQVBbXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdID0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInByaXZhdGUgdmFyIGlmYWNlXzoiICA8PCBzZXJ2aWNlX25hbWVfIDw8ICI7IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGNvbnN0IFBST0NFU1NfTUFQOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIHN0cmluZyBvdmVycmlkZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgb3ZlcnJpZGUgPSAib3ZlcnJpZGUgIjsKLSAgfQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgb3ZlcnJpZGUgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTpCb29sZWFuIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gIGluZGVudCgpIDw8ICJ2YXIgbXNnOlRNZXNzYWdlID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KLSAgLy8gQVMtIElmIGFsbCBtZXRob2QgaXMgb25ld2F5OgotICAvLyBkbyB5b3UgaGF2ZSBhbiBvcHJvdD8KLSAgLy8gZG8geW91IHlvdSBuZWVkIG51bGxjaGVjaz8KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgZm46RnVuY3Rpb24gPSBQUk9DRVNTX01BUFttc2cubmFtZV07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChmbiA9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBUVHlwZS5TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgdmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuVU5LTk9XTl9NRVRIT0QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiK21zZy5uYW1lK1wiJ1wiKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm4uY2FsbCh0aGlzLG1zZy5zZXFpZCwgaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9hczNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgInByaXZhdGUgZnVuY3Rpb24gIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpOkZ1bmN0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInJldHVybiBmdW5jdGlvbihzZXFpZDppbnQsIGlwcm90OlRQcm90b2NvbCwgb3Byb3Q6VFByb3RvY29sKTp2b2lkIgotICAgIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3M6Ijw8IGFyZ3NuYW1lIDw8ICIgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSByZXN1bHQgZm9yIG5vbiBvbmV3YXkgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInZhciByZXN1bHQ6IiA8PCByZXN1bHRuYW1lIDw8ICIgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSl7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfSAKLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgIi8vIHNvcnJ5IHRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBFcnJvcihcIlRoaXMgaXMgbm90IHlldCBzdXBwb3J0ZWRcIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2V0IGlzc2V0IG9uIHN1Y2Nlc3MgZmllbGQKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSAmJiAhdHlwZV9jYW5fYmVfbnVsbCh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKHRoOkVycm9yKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0cmFjZShcIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0aCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIHg6VEFwcGxpY2F0aW9uRXJyb3IgPSBuZXcgVEFwcGxpY2F0aW9uRXJyb3IoVEFwcGxpY2F0aW9uRXJyb3IuSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgIG5hbWUgPDwgIiA9IGlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBBczMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoKTsiOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRNYXAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG9iaiA8PCAiOlRTZXQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBvYmogPDwgIjpUTGlzdCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KQotICAgIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKLSAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQotICAgIDw8ICIoIgotICAgIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKHZhciAiIDw8IGkgPDwgIjppbnQgPSAwOyAiIDw8Ci0gICAgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5zaXplIiA8PCAiOyAiIDw8Ci0gICAgIisrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLnB1c2goIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEFzMyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfa2V5Iik7Ci0gICAgc3RyaW5nIGNvdW50ZXIgPSB0bXAoIl9zaXplQ291bnRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBjb3VudGVyIDw8ICI6aW50ID0gMDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IGNvdW50ZXIgPDwgKyIrKzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgY291bnRlciA8PCAiKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRCZWdpbihuZXcgVFNldCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLnNpemUpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLmxlbmd0aCkpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJlbGVtIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAodmFyICIgPDwgaXRlciA8PCAiOiogaW4gIiA8PCBwcmVmaXggPDwgIikiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIudG9BcnJheSgpKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIGVhY2ggKHZhciAiIDw8IGl0ZXIgPDwgIjoqIGluICIgPDwgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCBtYXAgKyAiWyIgKyBpdGVyICsgIl0iKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgQXMzIHR5cGUgbmFtZQotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyB0aGUgdHlwZSBnb2luZyBpbnNpZGUgYSBjb250YWluZXI/Ci0gKiBAcmV0dXJuIEFzMyB0eXBlIG5hbWUsIGkuZS4gSGFzaE1hcDxLZXksVmFsdWU+Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7Ci0gICh2b2lkKSBpbl9pbml0OwotICAvLyBJbiBBczMgdHlwZWRlZnMgYXJlIGp1c3QgcmVzb2x2ZWQgdG8gdGhlaXIgcmVhbCB0eXBlCi0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIHN0cmluZyBwcmVmaXg7Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJldHVybiBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlLCBpbl9jb250YWluZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJEaWN0aW9uYXJ5IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlNldCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiQXJyYXkiOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImFzMyIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBBUzMgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHBhcmFtIGNvbnRhaW5lciBJcyBpdCBnb2luZyBpbiBhIEFzMyBjb250YWluZXI/Ci0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gICh2b2lkKSBpbl9jb250YWluZXI7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJCeXRlQXJyYXkiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuICJCb29sZWFuIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICB0aHJvdyAiaTY0IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGFzMyI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiTnVtYmVyIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCkgKyAiOiIgKyB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50cyA9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKTsKLSAgaWYgKCEgdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGlmIChhcmd1bWVudHMgIT0gIiIpIHsKLSAgICAgIGFyZ3VtZW50cyArPSAiLCAiOwotICAgIH0KLSAgICBhcmd1bWVudHMgKz0gIm9uRXJyb3I6RnVuY3Rpb24sIG9uU3VjY2VzczpGdW5jdGlvbiI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiZnVuY3Rpb24gIiArIAotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50cyArICIpOnZvaWQiOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICI6IiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotLyoqCi0gKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIi8qKlxuIiwKLSAgICAgICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0Ci0gKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3M7Ci0gICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiXG5AcGFyYW0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiICIgPDwgcC0+Z2V0X2RvYygpOwotICAgICAgfQotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHNzLnN0cigpLAotICAgICAgIiAqL1xuIik7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewotICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2FzM19nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJhczMiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoYXMzLCAiQVMzIiwKLSIgICAgYmluZGFibGU6ICAgICAgICAgIEFkZCBbYmluZGFibGVdIG1ldGFkYXRhIHRvIGFsbCB0aGUgc3RydWN0IGNsYXNzZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZWUxYmYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLXN0cmluZyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX3VwcGVyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotc3RyaW5nIHRvX2xvd2VyX2Nhc2Uoc3RyaW5nIG5hbWUpOwotCi0vKioKLSAqIEMgY29kZSBnZW5lcmF0b3IsIHVzaW5nIGdsaWIgZm9yIEMgdHlwaW5nLgotICovCi1jbGFzcyB0X2NfZ2xpYl9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0KLSAgLyogY29uc3RydWN0b3IgKi8KLSAgdF9jX2dsaWJfZ2VuZXJhdG9yKHRfcHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJnBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZvcHRpb25fc3RyaW5nKSA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIC8qIHNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSAqLwotICAgIHRoaXMtPm91dF9kaXJfYmFzZV8gPSAiZ2VuLWNfZ2xpYiI7Ci0KLSAgICAvKiBzZXQgdGhlIG5hbWVzcGFjZSAqLwotICAgIHRoaXMtPm5zcGFjZSA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKLQotICAgIGlmICh0aGlzLT5uc3BhY2UuZW1wdHkoKSkgewotICAgICAgdGhpcy0+bnNwYWNlID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfdSA9ICIiOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gIiI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSAiIjsKLSAgICB9IGVsc2UgewotICAgICAgLyogcmVwbGFjZSBkb3RzIHdpdGggdW5kZXJzY29yZXMgKi8KLSAgICAgIGNoYXIgKnRtcCA9IHN0cmR1cCh0aGlzLT5uc3BhY2UuY19zdHIoKSk7Ci0gICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHN0cmxlbih0bXApOyBpKyspIHsKLSAgICAgICAgaWYgKHRtcFtpXSA9PSAnLicpIHsKLSAgICAgICAgICB0bXBbaV0gPSAnXyc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRoaXMtPm5zcGFjZSA9IHN0cmluZyh0bXAsIHN0cmxlbih0bXApKTsKLSAgICAgIGZyZWUodG1wKTsKLQotICAgICAgLyogY2xlYW4gdXAgdGhlIG5hbWVzcGFjZSBmb3IgQy4KLSAgICAgICAqIEFuIGlucHV0IG9mICduYW1lc3BhY2UgZm9vJyBzaG91bGQgcmVzdWx0IGluOgotICAgICAgICogIC0gbnNwYWNlID0gZm9vICAgICAgIC0gZm9yIHRocmlmdCBvYmplY3RzIGFuZCB0eXBlZGVmcwotICAgICAgICogIC0gbnNwYWNlX3UgPSBGb28gICAgIC0gZm9yIGludGVybmFsIEdPYmplY3QgcHJlZml4ZXMKLSAgICAgICAqICAtIG5zcGFjZV91YyA9IEZPT18gICAtIGZvciBtYWNybyBwcmVmaXhlcwotICAgICAgICogIC0gbnNwYWNlX2xjID0gZm9vXyAgIC0gZm9yIGZpbGVuYW1lIGFuZCBtZXRob2QgcHJlZml4ZXMKLSAgICAgICAqIFRoZSB1bmRlcnNjb3JlcyBhcmUgdGhlcmUgc2luY2UgdWMgYW5kIGxjIHN0cmluZ3MgYXJlIHVzZWQgYXMgZmlsZSBhbmQKLSAgICAgICAqIHZhcmlhYmxlIHByZWZpeGVzLgotICAgICAgICovCi0gICAgICB0aGlzLT5uc3BhY2VfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0aGlzLT5uc3BhY2UpOwotICAgICAgdGhpcy0+bnNwYWNlX3VjID0gdG9fdXBwZXJfY2FzZSh0aGlzLT5uc3BhY2VfdSkgKyAiXyI7Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPSB0b19sb3dlcl9jYXNlKHRoaXMtPm5zcGFjZV91KSArICJfIjsKLSAgICB9Ci0gIH0KLQotICAvKiBpbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIC8qIGdlbmVyYXRpb24gZnVuY3Rpb25zICovCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYgKnR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSAqdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyh2ZWN0b3I8dF9jb25zdCAqPiBjb25zdHMpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCAqdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCAqdHN0cnVjdCk7Ci0KLSBwcml2YXRlOgotCi0gIC8qIGZpbGUgc3RyZWFtcyAqLwotICBvZnN0cmVhbSBmX3R5cGVzXzsKLSAgb2ZzdHJlYW0gZl90eXBlc19pbXBsXzsKLSAgb2ZzdHJlYW0gZl9oZWFkZXJfOwotICBvZnN0cmVhbSBmX3NlcnZpY2VfOwotCi0gIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KLSAgc3RyaW5nIG5zcGFjZTsKLSAgc3RyaW5nIG5zcGFjZV91OwotICBzdHJpbmcgbnNwYWNlX3VjOwotICBzdHJpbmcgbnNwYWNlX2xjOwotCi0gIC8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLSAgYm9vbCBpc19jb21wbGV4X3R5cGUodF90eXBlICp0dHlwZSk7Ci0gIHN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmPWZhbHNlLCBib29sIGlzX2NvbnN0PWZhbHNlKTsKLSAgc3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlICp0eXBlKTsKLSAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUgKnR5cGUpOwotICBzdHJpbmcgY29uc3RhbnRfdmFsdWUoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpOwotICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24gKnRmdW5jdGlvbik7Ci0gIHN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0ICp0c3RydWN0KTsKLSAgc3RyaW5nIHhjZXB0aW9uX2xpc3QodF9zdHJ1Y3QgKnRzdHJ1Y3QpOwotICBzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkICp0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBwb2ludGVyPWZhbHNlLCBib29sIGNvbnN0YW50PWZhbHNlLCBib29sIHJlZmVyZW5jZT1mYWxzZSk7Ci0gIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdHJpbmcgJmJhc2VfbmFtZSk7Ci0KLSAgLyogZ2VuZXJhdGlvbiBmdW5jdGlvbnMgKi8KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplcihzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlICp0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlICp0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2JqZWN0KHRfc3RydWN0ICp0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtICZvdXQsIHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgdGhpc19uYW1lLCBzdHJpbmcgdGhpc19nZXQ9IiIsIGJvb2wgaXNfZnVuY3Rpb249dHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHRoaXNfbmFtZSwgc3RyaW5nIHRoaXNfZ2V0PSIiLCBib29sIGlzX2Z1bmN0aW9uPXRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsIHRfZmllbGQgKnRmaWVsZCwgc3RyaW5nIHByZWZpeCwgc3RyaW5nIHN1ZmZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LCB0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCB0X3R5cGUgKnR0eXBlLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwgdF9tYXAgKnRtYXAsIHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfc2V0ICp0c2V0LCBzdHJpbmcgZWxlbWVudCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X2xpc3QgKnRsaXN0LCBzdHJpbmcgbGlzdCwgc3RyaW5nIGluZGV4LCBpbnQgZXJyb3JfcmV0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsIHRfZmllbGQgKnRmaWVsZCwgc3RyaW5nIHByZWZpeCwgc3RyaW5nIHN1ZmZpeCwgaW50IGVycm9yX3JldCwgYm9vbCBhbGxvY2F0ZT10cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwgdF9zdHJ1Y3QgKnRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQsIGJvb2wgYWxsb2NhdGU9dHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsIHRfdHlwZSAqdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfbWFwICp0bWFwLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LCB0X3NldCAqdHNldCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsIHRfbGlzdCAqdGxpc3QsIHN0cmluZyBwcmVmaXgsIHN0cmluZyBpbmRleCwgaW50IGVycm9yX3JldCk7Ci0KLSAgc3RyaW5nIGdlbmVyYXRlX25ld19oYXNoX2Zyb21fdHlwZSh0X3R5cGUgKiBrZXksIHRfdHlwZSAqIHZhbHVlKTsKLSAgc3RyaW5nIGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUodF90eXBlICogdHR5cGUpOyAKLQotICBzdHJpbmcgZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0X3R5cGUgKiB0dHlwZSk7Ci0gIHN0cmluZyBnZW5lcmF0ZV9oYXNoX2Z1bmNfZnJvbV90eXBlKHRfdHlwZSAqIHR0eXBlKTsKLSAgc3RyaW5nIGdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSh0X3R5cGUgKiB0dHlwZSk7Ci19OwotCi0vKioKLSAqIFByZXBhcmUgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZQotICogb3V0cHV0IHN0cmVhbXMuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLyogY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgKi8KLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMocHJvZ3JhbV9uYW1lXyk7Ci0gIHN0cmluZyBwcm9ncmFtX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHByb2dyYW1fbmFtZV91KTsKLSAgc3RyaW5nIHByb2dyYW1fbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UocHJvZ3JhbV9uYW1lX3UpOwotCi0gIC8qIGNyZWF0ZSBvdXRwdXQgZmlsZXMgKi8KLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvZ3JhbV9uYW1lX2xjICsgIl90eXBlcy5oIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3R5cGVzX2ltcGxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyB0aGlzLT5uc3BhY2VfbGMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9ncmFtX25hbWVfbGMgKyAiX3R5cGVzLmMiOwotICBmX3R5cGVzX2ltcGxfLm9wZW4oZl90eXBlc19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgLyogYWRkIHRocmlmdCBib2lsZXJwbGF0ZSBoZWFkZXJzICovCi0gIGZfdHlwZXNfIDw8IGF1dG9nZW5fY29tbWVudCgpOwotICBmX3R5cGVzX2ltcGxfIDw8IGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8qIGluY2x1ZGUgaW5jbHVzaW9uIGd1YXJkICovCi0gIGZfdHlwZXNfIDw8IAotICAgICIjaWZuZGVmICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBwcm9ncmFtX25hbWVfdWMgPDwgIl9UWVBFU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvKiBpbmNsdWRlIGJhc2UgdHlwZXMgKi8KLSAgZl90eXBlc18gPDwKLSAgICAiLyogYmFzZSBpbmNsdWRlcyAqLyIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC90aHJpZnRfc3RydWN0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+IiA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgb3RoZXIgdGhyaWZ0IGluY2x1ZGVzICovCi0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0gKj4gJmluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIvKiBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGwgPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8qIGluY2x1ZGUgY3VzdG9tIGhlYWRlcnMgKi8KLSAgY29uc3QgdmVjdG9yPHN0cmluZz4gJmNfaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2NfaW5jbHVkZXMoKTsKLSAgZl90eXBlc18gPDwgIi8qIGN1c3RvbSB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY19pbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIGlmIChjX2luY2x1ZGVzW2ldWzBdID09ICc8JykgewotICAgICAgZl90eXBlc18gPDwKLSAgICAgICAgIiNpbmNsdWRlICIgPDwgY19pbmNsdWRlc1tpXSA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiI2luY2x1ZGUgXCIiIDw8IGNfaW5jbHVkZXNbaV0gPDwgIlwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIGluY2x1ZGUgdGhlIHR5cGVzIGZpbGUKLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfdSA8PCAKLSAgICAgICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgIi8qIGJlZ2luIHR5cGVzICovIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogIEZpbmlzaCB1cCBnZW5lcmF0aW9uIGFuZCBjbG9zZSBhbGwgZmlsZSBzdHJlYW1zLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZSAKLSAgICAoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pKTsKLQotICAvKiBlbmQgdGhlIGhlYWRlciBpbmNsdXNpb24gZ3VhcmQgKi8KLSAgZl90eXBlc18gPDwKLSAgICAiI2VuZGlmIC8qICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHByb2dyYW1fbmFtZV91YyA8PCAiX1RZUEVTX0ggKi8iIDw8IGVuZGw7Ci0KLSAgLyogY2xvc2Ugb3V0cHV0IGZpbGUgKi8KLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl90eXBlc19pbXBsXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFRocmlmdCB0eXBlZGVmIGluIEMgY29kZS4gIEZvciBleGFtcGxlOgotICogCi0gKiBUaHJpZnQ6IAotICogdHlwZWRlZiBtYXA8aTMyLGkzMj4gU29tZU1hcAotICogCi0gKiBDOiAKLSAqIHR5cGVkZWYgR0hhc2hUYWJsZSAqIFRocmlmdFNvbWVNYXA7Ci0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwKLSAgICAgICAgIiAiIDw8IHRoaXMtPm5zcGFjZSA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfSAKLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBDIGVudW1lcmF0aW9uLiAgRm9yIGV4YW1wbGU6Ci0gKgotICogVGhyaWZ0OgotICogZW51bSBNeUVudW0gewotICogICBPTkUgPSAxLAotICogICBUV08KLSAqIH0KLSAqCi0gKiBDOgotICogZW51bSBfVGhyaWZ0TXlFbnVtIHsKLSAqICAgVEhSSUZUX01ZX0VOVU1fT05FID0gMSwKLSAqICAgVEhSSUZUX01ZX0VOVU1fVFdPCi0gKiB9OwotICogdHlwZWRlZiBlbnVtIF9UaHJpZnRNeUVudW0gVGhyaWZ0TXlFbnVtOwotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0gKnRlbnVtKSB7Ci0gIHN0cmluZyBuYW1lID0gdGVudW0tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSkpOwotCi0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUgKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSAqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAvKiBvdXRwdXQgZWFjaCBvZiB0aGUgZW51bWVyYXRpb24gZWxlbWVudHMgKi8KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfdHlwZXNfIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIGVudW0gXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgVGhyaWZ0IGNvbnN0YW50cyBpbiBDIGNvZGUuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMgKHZlY3Rvcjx0X2NvbnN0ICo+IGNvbnN0cykgewotICBmX3R5cGVzXyA8PCAiLyogY29uc3RhbnRzICovIiA8PCBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8ICIvKiBjb25zdGFudHMgKi8iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfY29uc3QgKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZSk7Ci0gICAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWUpOwotICAgIHRfdHlwZSAqdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB0X2NvbnN0X3ZhbHVlICp2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiICIgPDwKLSAgICAgICAgICBjb25zdGFudF92YWx1ZSAobmFtZV9sYywgdHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci0KLSAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAobmFtZV9sYywgdHlwZSwgdmFsdWUpOwotICB9Ci0KLSAgZl90eXBlc18gPDwgZW5kbDsKLSAgZl90eXBlc19pbXBsXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIFRocmlmdCBzdHJ1Y3RzIGluIEMgY29kZSwgYXMgR09iamVjdHMuICBFeGFtcGxlOgotICoKLSAqIFRocmlmdDoKLSAqIHN0cnVjdCBCb25rCi0gKiB7Ci0gKiAgIDE6IHN0cmluZyBtZXNzYWdlLAotICogICAyOiBpMzIgdHlwZQotICogfQotICoKLSAqIEMgR09iamVjdCBpbnN0YW5jZSBoZWFkZXI6Ci0gKiBzdHJ1Y3QgX1RocmlmdEJvbmsKLSAqIHsKLSAqICAgR09iamVjdCBwYXJlbnQ7Ci0gKgotICogICBnY2hhciAqIG1lc3NhZ2U7Ci0gKiAgIGdpbnQzMiB0eXBlOwotICogfTsKLSAqIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRCb25rIFRocmlmdEJvbmsKLSAqIC8vIC4uLiBhZGRpdGlvbmFsIEdPYmplY3QgYm9pbGVycGxhdGUgLi4uCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QgKHRfc3RydWN0ICp0c3RydWN0KSB7Ci0gIGZfdHlwZXNfIDw8ICIvKiBzdHJ1Y3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX29iamVjdCh0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBDIGNvZGUgdG8gcmVwcmVzZW50IFRocmlmdCBzZXJ2aWNlcy4gIENyZWF0ZXMgYSBuZXcgR09iamVjdAotICogd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSAodF9zZXJ2aWNlICp0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKTsKLSAgc3RyaW5nIHN2Y25hbWVfdWMgPSB0aGlzLT5uc3BhY2VfdWMgKyB0b191cHBlcl9jYXNlKHN2Y25hbWVfdSk7Ci0gIHN0cmluZyBmaWxlbmFtZSA9IHRoaXMtPm5zcGFjZV9sYyArIHRvX2xvd2VyX2Nhc2Uoc3ZjbmFtZV91KTsKLQotICAvLyBtYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmaWxlbmFtZSArICIuaCI7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIHByb2dyYW1fbmFtZV91ID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHByb2dyYW1fbmFtZV8pOwotICBzdHJpbmcgcHJvZ3JhbV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShwcm9ncmFtX25hbWVfdSk7Ci0KLSAgLy8gYWRkIGhlYWRlciBmaWxlIGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIGFkZCBhbiBpbmNsdXNpb24gZ3VhcmQKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBzdmNuYW1lX3VjIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgc3ZjbmFtZV91YyA8PCAiX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcwotICBmX2hlYWRlcl8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBwcm9ncmFtX25hbWVfbGMgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgLy8gaWYgd2UgYXJlIGluaGVyaXRpbmcgZnJvbSBhbm90aGVyIHNlcnZpY2UsIGluY2x1ZGUgaXRzIGhlYWRlcgotICB0X3NlcnZpY2UgKmV4dGVuZHNfc2VydmljZSA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zZXJ2aWNlICE9IE5VTEwpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGV4dGVuZHNfc2VydmljZS0+Z2V0X25hbWUoKSkpIDw8ICIuaFwiIiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PCBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbgotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgZmlsZW5hbWUgKyAiLmMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gYWRkIHRoZSBib2lsZXJwbGFjZSBoZWFkZXIKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotCi0gIC8vIGluY2x1ZGUgdGhlIGhlYWRlcnMKLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjaW5jbHVkZSA8c3RyaW5nLmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZmlsZW5hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBjbGllbnQgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAodHNlcnZpY2UpOwotCi0gIC8vIGdlbmVyYXRlIHRoZSBzZXJ2ZXIgb2JqZWN0cwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlciAodHNlcnZpY2UpOwotCi0gIC8vIGVuZCB0aGUgaGVhZGVyIGluY2x1c2lvbiBndWFyZAotICBmX2hlYWRlcl8gPDwKLSAgICAiI2VuZGlmIC8qICIgPDwgc3ZjbmFtZV91YyA8PCAiX0ggKi8iIDw8IGVuZGw7Ci0KLSAgLy8gY2xvc2UgdGhlIGZpbGVzCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9oZWFkZXJfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICoKLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCAqdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX2xjID0gdG9fbG93ZXJfY2FzZShuYW1lX3UpOwotICBzdHJpbmcgbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UobmFtZV91KTsKLQotICBnZW5lcmF0ZV9vYmplY3QodHN0cnVjdCk7Ci0KLSAgZl90eXBlc18gPDwgIi8qIGV4Y2VwdGlvbiAqLyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIGVudW0iIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9FUlJPUl9DT0RFLCIgPDwgZW5kbCA8PAotICAgICJ9ICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkVycm9yOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiR1F1YXJrICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyayAodm9pZCk7IiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PCAiX0VSUk9SICgiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrKCkpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICIvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIGV4Y2VwdGlvbnMgKi8iIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBuYW1lX3VjIDw8ICJfRVJST1JfRE9NQUlOIFwiIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV9sYyA8PCAiX2Vycm9yX3F1YXJrXCIiIDw8IGVuZGwgPDwKLSAgICAiR1F1YXJrIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfbGMgPDwgIl9lcnJvcl9xdWFyayAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgbmFtZV91YyA8PAotICAgICAgICAiX0VSUk9SX0RPTUFJTik7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioKLSAqIEhFTFBFUiBGVU5DVElPTlMgKgotICoqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0dHlwZSBpcyBub3QgYSBwcmltaXRpdmUuCi0gKi8KLWJvb2wgdF9jX2dsaWJfZ2VuZXJhdG9yOjppc19jb21wbGV4X3R5cGUodF90eXBlICp0dHlwZSkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUgKHR0eXBlKTsKLQotICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpCi0gICAgICAgICB8fCB0dHlwZS0+aXNfc3RydWN0KCkKLSAgICAgICAgIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpCi0gICAgICAgICB8fCAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpCi0gICAgICAgICAgICAgJiYgKCgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpCi0gICAgICAgICAgICAgICAgICA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKLX0KLQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgdF90eXBlIHRvIGEgQyB0eXBlLgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjp0eXBlX25hbWUgKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBpc19jb25zdCkgewotICAodm9pZCkgaW5fdHlwZWRlZjsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lICgodF9iYXNlX3R5cGUgKikgdHR5cGUpOwotCi0gICAgaWYgKGlzX2NvbnN0KSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGJuYW1lOwotICAgIH0KLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBzdHJpbmcgY25hbWU7Ci0KLSAgICB0X2NvbnRhaW5lciAqdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciAqKSB0dHlwZTsKLSAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKLSAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGNuYW1lID0gIkdIYXNoVGFibGUgKiI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIC8vIHNpbmNlIGEgc2V0IHJlcXVpcmVzIHVuaXF1ZSBlbGVtZW50cywgdXNlIGEgR0hhc2hUYWJsZSwgYW5kCi0gICAgICAvLyBwb3B1bGF0ZSB0aGUga2V5cyBhbmQgdmFsdWVzIHdpdGggdGhlIHNhbWUgZGF0YSwgdXNpbmcga2V5cyBmb3IKLSAgICAgIC8vIHRoZSBhY3R1YWwgd3JpdGVzIGFuZCByZWFkcy4KLSAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0Ci0gICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlICoiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgLy8gVE9ETzogaW52ZXN0aWdhdGUgb3RoZXIgaW1wbGVtZW50YXRpb25zIGJlc2lkZXMgR1B0ckFycmF5Ci0gICAgICBjbmFtZSA9ICJHUHRyQXJyYXkgKiI7Ci0gICAgICB0X3R5cGUgKmV0eXBlID0gKCh0X2xpc3QgKikgdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIGV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgICAgY25hbWUgPSAiR0FycmF5ICoiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc19jb25zdCkgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjbmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyBjaGVjayBmb3IgYSBuYW1lc3BhY2UKLSAgc3RyaW5nIHBuYW1lID0gdGhpcy0+bnNwYWNlICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKGlzX2NvbXBsZXhfdHlwZSAodHR5cGUpKSB7Ci0gICAgcG5hbWUgKz0gIiAqIjsKLSAgfQotCi0gIGlmIChpc19jb25zdCkgewotICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOwotICB9IGVsc2UgewotICAgIHJldHVybiBwbmFtZTsKLSAgfQotfQotCi0vKioKLSAqIE1hcHMgYSBUaHJpZnQgcHJpbWl0aXZlIHRvIGEgQyBwcmltaXRpdmUuCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlICp0eXBlKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIHJldHVybiAiR0J5dGVBcnJheSAqIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAiZ2NoYXIgKiI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJnYm9vbGVhbiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJnaW50OCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImdpbnQxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImdpbnQzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImdpbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gImdkb3VibGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIG1lbWJlciBvZiB0aGUgVGhyaWZ0VHlwZSBDIGVudW1lcmF0aW9uIGluIHRocmlmdF9wcm90b2NvbC5oCi0gKiBmb3IgYSBUaHJpZnQgdHlwZS4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtICh0X3R5cGUgKnR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUgKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICJUX1NUUklORyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiVF9CT09MIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJUX0JZVEUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJldHVybiAiVF9JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVF9JMzIiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAiVF9JNjQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiVF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVF9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0KLS8qKgotICogUmV0dXJucyBDIGNvZGUgdGhhdCByZXByZXNlbnRzIGEgVGhyaWZ0IGNvbnN0YW50LgotICovCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpjb25zdGFudF92YWx1ZShzdHJpbmcgbmFtZSwgdF90eXBlICp0eXBlLCB0X2NvbnN0X3ZhbHVlICp2YWx1ZSkgewotICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAvKiBwcmltaXRpdmVzICovCi0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlbmRlciA8PCAiZ19zdHJkdXAgKFwiIiArIHZhbHVlLT5nZXRfc3RyaW5nKCkgKyAiXCIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpICE9IDApID8gMSA6IDApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIKLSAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUgKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR5cGUtPmlzX2xpc3QoKQotICAgICAgICAgICAgIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgIHRvX2xvd2VyX2Nhc2UobmFtZSkgPDwgIl9jb25zdGFudCgpKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmVuZGVyIDw8ICJOVUxMIC8qIG5vdCBzdXBwb3J0ZWQgKi8iOwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIHRfc3RydWN0KiB4bGlzdCA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBzdHJpbmcgZm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLQotICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgYm9vbCBoYXNfYXJncyA9IGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID09IDA7Ci0gIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICByZXR1cm4KLSAgICAiZ2Jvb2xlYW4gIiArIHRoaXMtPm5zcGFjZV9sYyArIGZuYW1lICsgIiAoIiArIHRoaXMtPm5zcGFjZQotICAgICsgc2VydmljZV9uYW1lXyArICJJZiAqIGlmYWNlIgotICAgICsgKGhhc19yZXR1cm4gPyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdCAoYXJnbGlzdCkpKSAKLSAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QgKHhsaXN0KSkpCi0gICAgKyAiLCBHRXJyb3IgKiogZXJyb3IpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHJldHVybiBDb21tYSBzZXBlYXJhdGVkIGxpc3Qgb2YgYWxsIGZpZWxkIG5hbWVzIGluIHRoYXQgc3RydWN0Ci0gKi8KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QgKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKwotICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIG11dGFibGUgZXhjZXB0aW9uIGxpc3RzCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6eGNlcHRpb25fbGlzdCAodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiKiAiICsKLSAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCBpbmNsdWRpbmcgYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLSAqLwotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkICp0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnN0YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGlmIChjb25zdGFudCkgewotICAgIHJlc3VsdCArPSAiY29uc3QgIjsKLSAgfQotICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmIChwb2ludGVyKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICBpZiAocmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICIqIjsKLSAgfQotICByZXN1bHQgKz0gIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAoZ2RvdWJsZSkgMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gTlVMTCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIGludGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiCi0gICAgICAgICAgICAgICAgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUgKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAoIiArIHR5cGVfbmFtZSAodHlwZSkgKyAiKSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IE5VTEwiOwotICAgIH0KLSAgfQotCi0gIGlmICghcmVmZXJlbmNlKSB7Ci0gICAgcmVzdWx0ICs9ICI7IjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IGluaXRpYWxpemVzIGNvbXBsZXggY29uc3RhbnRzLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIoc3RyaW5nIG5hbWUsIHRfdHlwZSAqdHlwZSwgdF9jb25zdF92YWx1ZSAqdmFsdWUpIHsKLSAgc3RyaW5nIG5hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhuYW1lKTsKLSAgc3RyaW5nIG5hbWVfbGMgPSB0b19sb3dlcl9jYXNlKG5hbWVfdSk7Ci0gIHN0cmluZyB0eXBlX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXModHlwZS0+Z2V0X25hbWUoKSk7Ci0gIHN0cmluZyB0eXBlX3VjID0gdG9fdXBwZXJfY2FzZSh0eXBlX3UpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9ICgodF9zdHJ1Y3QgKikgdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSAqLCB0X2NvbnN0X3ZhbHVlICo+ICZ2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlICosIHRfY29uc3RfdmFsdWUgKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIC8vIGluaXRpYWxpemUgYW55IGNvbnN0YW50cyB0aGF0IG1heSBiZSByZWZlcmVuY2VkIGJ5IHRoaXMgaW5pdGlhbGl6ZXIKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlICpmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIHN0cmluZyBmaWVsZF9uYW1lID0gIiI7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICAgICAgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBmaWVsZF9uYW1lID0gdG1wIChmaWVsZF9uYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKG5hbWUgKyAiX2NvbnN0YW50XyIgKyBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAiICAgIGNvbnN0YW50LT4iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiID0gIiA8PAotICAgICAgICBjb25zdGFudF92YWx1ZSAobmFtZSArICJfY29uc3RhbnRfIiArIGZpZWxkX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICBjb25zdGFudC0+X19pc3NldF8iIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PAotICAgICAgICAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gaW1wbGVtZW50IHRoZSBpbml0aWFsaXplcgotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0aGlzLT5uc3BhY2UgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljICIgPDwgdGhpcy0+bnNwYWNlIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiICpjb25zdGFudCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICAiICBpZiAoY29uc3RhbnQgPT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgY29uc3RhbnQgPSBnX29iamVjdF9uZXcgKCIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwKLSAgICAgICAgICB0eXBlX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgaW5pdGlhbGl6ZXJzLnN0cigpIDw8IGVuZGwgPDwKLSAgICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICIgIHJldHVybiBjb25zdGFudDsiIDw8IGVuZGwgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBsaXN0X3R5cGUgPSAiR1B0ckFycmF5ICoiOwotICAgIC8vIFRPRE86IFRoaXMgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGNvbnRhaW4gYSBmcmVlIGZ1bmN0aW9uIGZvciBjb250YWluZXIKLSAgICBzdHJpbmcgbGlzdF9pbml0aWFsaXplciA9ICJnX3B0cl9hcnJheV9uZXcoKTsiOwotICAgIHN0cmluZyBsaXN0X2FwcGVuZGVyID0gImdfcHRyX2FycmF5X2FkZCI7Ci0gICAgYm9vbCBsaXN0X3ZhcmlhYmxlID0gZmFsc2U7Ci0KLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwotCi0gICAgbGlzdF9pbml0aWFsaXplciA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUgKGV0eXBlKTsKLSAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSBldHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBsaXN0X3R5cGUgPSAiR0FycmF5ICoiOwotICAgICAgICAgIGxpc3RfYXBwZW5kZXIgPSAiZ19hcnJheV9hcHBlbmRfdmFsIjsKLSAgICAgICAgICBsaXN0X3ZhcmlhYmxlID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGZuYW1lID0gdG1wIChuYW1lKTsKLQotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKGZuYW1lLCBldHlwZSwgKCp2X2l0ZXIpKTsKLSAgICAgIGlmIChsaXN0X3ZhcmlhYmxlKSB7Ci0gICAgICAgIGluaXRpYWxpemVycyA8PAotICAgICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGV0eXBlKSA8PCAiICIgPDwgZm5hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChmbmFtZSwgKHRfdHlwZSAqKSBldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwKLSAgICAgICAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgIiAgICAiIDw8IGxpc3RfYXBwZW5kZXIgPDwgIihjb25zdGFudCwgIiA8PCBmbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgICAiICAgICIgPDwgbGlzdF9hcHBlbmRlciA8PCAiKGNvbnN0YW50LCAiIDw8Ci0gICAgICAgICAgY29uc3RhbnRfdmFsdWUgKGZuYW1lLCAodF90eXBlICopIGV0eXBlLCAoKnZfaXRlcikpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICAic3RhdGljICIgPDwgbGlzdF90eXBlIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljICIgPDwgbGlzdF90eXBlIDw8ICIgY29uc3RhbnQgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgKGNvbnN0YW50ID09IE5VTEwpIiA8PCBlbmRsIDw8Ci0gICAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIGNvbnN0YW50ID0gIiA8PCBsaXN0X2luaXRpYWxpemVyIDw8IGVuZGwgPDwKLSAgICAgIGluaXRpYWxpemVycy5zdHIoKSA8PCBlbmRsIDw8Ci0gICAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAiICByZXR1cm4gY29uc3RhbnQ7IiA8PCBlbmRsIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUgKmV0eXBlID0gKCh0X3NldCAqKSB0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlICo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7Ci0KLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGZuYW1lID0gdG1wIChuYW1lKTsKLSAgICAgIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyIChmbmFtZSwgZXR5cGUsICgqdl9pdGVyKSk7Ci0gICAgICBpbml0aWFsaXplcnMgPDwKLSAgICAgICAgIiAgICAiIDw8IHR5cGVfbmFtZSAoZXR5cGUpIDw8ICIgIiA8PCBmbmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlIChmbmFtZSwgKHRfdHlwZSAqKSBldHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAmIiA8PCBmbmFtZSA8PCAiLCAmIiA8PCBmbmFtZSA8PAotICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgLy8gVE9ETzogVGhpcyBpbml0aWFsaXphdGlvbiBzaG91bGQgY29udGFpbiBhIGZyZWUgZnVuY3Rpb24gZm9yIGVsZW1lbnRzCi0gICAgICAiICAgIGNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOyAKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSAqa3R5cGUgPSAoKHRfbWFwICopIHR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUgKnZ0eXBlID0gKCh0X21hcCAqKSB0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUgKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvc3RyaW5nc3RyZWFtIGluaXRpYWxpemVyczsKLQotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZm5hbWUgPSB0bXAgKG5hbWUpOwotICAgICAgc3RyaW5nIGtuYW1lID0gZm5hbWUgKyAia2V5IjsKLSAgICAgIHN0cmluZyB2bmFtZSA9IGZuYW1lICsgInZhbCI7Ci0gICAgICBnZW5lcmF0ZV9jb25zdF9pbml0aWFsaXplciAoa25hbWUsIGt0eXBlLCAoKnZfaXRlcikpOwotICAgICAgZ2VuZXJhdGVfY29uc3RfaW5pdGlhbGl6ZXIgKHZuYW1lLCB2dHlwZSwgKCp2X2l0ZXIpKTsKLQotICAgICAgaW5pdGlhbGl6ZXJzIDw8Ci0gICAgICAgICIgICAgIiA8PCB0eXBlX25hbWUgKGt0eXBlKSA8PCAiICIgPDwga25hbWUgPDwgIiA9ICIgPDwKLSAgICAgICAgICBjb25zdGFudF92YWx1ZSAoa25hbWUsICh0X3R5cGUgKikga3R5cGUsICgqdl9pdGVyKSkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAgICAiIDw8IHR5cGVfbmFtZSAodnR5cGUpIDw8ICIgIiA8PCB2bmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgIGNvbnN0YW50X3ZhbHVlICh2bmFtZSwgKHRfdHlwZSAqKSB2dHlwZSwgKCp2X2l0ZXIpKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiICAgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGNvbnN0YW50LCAmIiA8PCBmbmFtZSA8PCAiLCAmIiA8PCBmbmFtZSA8PAotICAgICAgICAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgInN0YXRpYyBHSGFzaFRhYmxlICoiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX2xjIDw8ICJfY29uc3RhbnQgKHZvaWQpIiA8PCBlbmRsIDw8Ci0gICAgICAieyIgPDwgZW5kbCA8PAotICAgICAgIiAgc3RhdGljIEdIYXNoVGFibGUgKmNvbnN0YW50ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgICIgIGlmIChjb25zdGFudCA9PSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICAgLy8gVE9ETzogVGhpcyBpbml0aWFsaXphdGlvbiBzaG91bGQgY29udGFpbiBhIGZyZWUgZnVuY3Rpb24gZm9yIGVsZW1lbnRzCi0gICAgICAiICAgIGNvbnN0YW50ID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbml0aWFsaXplcnMuc3RyKCkgPDwgZW5kbCA8PAotICAgICAgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgIiAgcmV0dXJuIGNvbnN0YW50OyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0aGF0IHJlcHJlc2VudHMgYSBUaHJpZnQgc2VydmljZSBjbGllbnQuCi0gKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7Ci0gIC8qIGdldCBzb21lIEMgZnJpZW5kbHkgc2VydmljZSBuYW1lcyAqLwotICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwotICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGllbnQgaW50ZXJmYWNlIGR1bW15IG9iamVjdCBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwKLSAgICAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBpbnRlcmZhY2UgKi8iIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyAiIDw8Ci0gICAgICAgICIgLyogZHVtbXkgb2JqZWN0ICovIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xpZW50IGludGVyZmFjZSBvYmplY3QgaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdUeXBlSW50ZXJmYWNlIHBhcmVudDsiIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvKiB3cml0ZSBvdXQgdGhlIGZ1bmN0aW9ucyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICJnYm9vbGVhbiAoKiIgPDwgZnVubmFtZSA8PCAiKSAiIDw8IHBhcmFtcyA8PCAiOyIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2UgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZJbnRlcmZhY2U7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBnZW5lcmF0ZSBhbGwgdGhlIGludGVyZmFjZSBib2lsZXJwbGF0ZQotICBmX2hlYWRlcl8gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICJfaWZfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYgIiA8PAotICAgICAgICAiKCIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmX2dldF90eXBlKCkpIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0lGLCAiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZikpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYob2JqKSAiIDw8Ci0gICAgICAgICIoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmosICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0lGX0dFVF9JTlRFUkZBQ0UoaW5zdCkgKEdfVFlQRV9JTlNUQU5DRV9HRVRfSU5URVJGQUNFICgoaW5zdCksICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSUYsICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlKSkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHdyaXRlIG91dCBhbGwgdGhlIGludGVyZmFjZSBmdW5jdGlvbiBwcm90b3R5cGVzCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLyogbWFrZSB0aGUgZnVuY3Rpb24gbmFtZSBDIGZyaWVuZGx5ICovCi0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB0X3R5cGUgKnR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfc3RydWN0ICphcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHRfc3RydWN0ICp4bGlzdCA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGJvb2wgaGFzX3JldHVybiA9ICF0dHlwZS0+aXNfdm9pZCgpOwotICAgIGJvb2wgaGFzX2FyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotICAgIGJvb2wgaGFzX3hjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA9PSAwOwotCi0gICAgc3RyaW5nIHBhcmFtcyA9ICIoIiArIHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfbmFtZV8gKyAiSWYgKmlmYWNlIgotICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIiwgIiArIHR5cGVfbmFtZSAodHR5cGUpICsgIiogX3JldHVybiIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX2FyZ3MgPyAiIiA6ICgiLCAiICsgYXJndW1lbnRfbGlzdCAoYXJnbGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArIChoYXNfeGNlcHRpb25zID8gIiIgOiAoIiwgIiArIHhjZXB0aW9uX2xpc3QgKHhsaXN0KSkpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgR0Vycm9yICoqZXJyb3IpIjsKLQotICAgIGZfaGVhZGVyXyA8PCAiZ2Jvb2xlYW4gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICAgICAgICAgICJfaWZfIiA8PCBmdW5uYW1lIDw8ICIgIiA8PCBwYXJhbXMgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9oZWFkZXJfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsaWVudCBvYmplY3QgaW5zdGFuY2UgZGVmaW5pdGlvbiBpbiB0aGUgaGVhZGVyLgotICBmX2hlYWRlcl8gPDwKLSAgICAiLyogIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICIgc2VydmljZSBjbGllbnQgKi8iIDw8IGVuZGwgPDwKLSAgICAic3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdPYmplY3QgcGFyZW50OyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICBUaHJpZnRQcm90b2NvbCAqaW5wdXRfcHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgIiAgVGhyaWZ0UHJvdG9jb2wgKm91dHB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgZl9oZWFkZXJfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIEdPYmplY3RDbGFzcyBwYXJlbnQ7IiA8PCBlbmRsIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8Ci0gICAgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAiIDw8Ci0gICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3M7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBDcmVhdGUgYWxsIHRoZSBHT2JqZWN0IGJvaWxlcnBsYXRlCi0gIGZfaGVhZGVyXyA8PAotICAgICJHVHlwZSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgCi0gICAgICAgICJfY2xpZW50X2dldF90eXBlICh2b2lkKTsiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAiIDw8Ci0gICAgICAgICIoIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF90eXBlKCkpIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5ULCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50KSkiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlRfQ0xBU1MoYykgIiA8PCAKLSAgICAgICAgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQsICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcykpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfSVNfQ0xJRU5UKG9iaikgIiA8PAotICAgICAgICAiKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UKSkiIDw8IGVuZGwgPDwgCi0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfSVNfQ0xJRU5UX0NMQVNTKGMpICIgPDwgIihHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCAiIDw8IAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9DTElFTlQpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9HRVRfQ0xBU1Mob2JqKSAiIDw8ICIoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCwgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50Q2xhc3MpKSIgPDwgZW5kbCA8PCAKLSAgICBlbmRsOwotCi0gIC8qIHdyaXRlIG91dCB0aGUgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlcnZpY2VfZnVuY3Rpb24gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYyArIHN0cmluZyAoIl9jbGllbnRfIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUgKCZzZXJ2aWNlX2Z1bmN0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLQotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbiAoZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWVfbGMgKyBzdHJpbmcgKCJfY2xpZW50X3NlbmRfIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0gICAgaW5kZW50KGZfaGVhZGVyXykgPDwgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VuZF9mdW5jdGlvbikgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAvLyBpbXBsZW1lbnQgcmVjdiBpZiBub3QgYSBvbmV3YXkgc2VydmljZQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzIChwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24gKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9yZWN2XyIpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnJlY3ZfZnVuY3Rpb24pIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfaGVhZGVyXyA8PCBlbmRsOwotICAvLyBlbmQgb2YgaGVhZGVyIGNvZGUKLQotICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8qIG1ha2UgdGhlIGZ1bmN0aW9uIG5hbWUgQyBmcmllbmRseSAqLwotICAgIHN0cmluZyBmdW5uYW1lID0gaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlICp0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCAqYXJnbGlzdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICB0X3N0cnVjdCAqeGxpc3QgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICBib29sIGhhc19yZXR1cm4gPSAhdHR5cGUtPmlzX3ZvaWQoKTsKLSAgICBib29sIGhhc19hcmdzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLSAgICBib29sIGhhc194Y2VwdGlvbnMgPSB4bGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPT0gMDsKLQotICAgIHN0cmluZyBwYXJhbXMgPSAiKCIgKyB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIklmICppZmFjZSIKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3JldHVybiA/ICIsICIgKyB0eXBlX25hbWUgKHR0eXBlKSArICIqIF9yZXR1cm4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICsgKGhhc19hcmdzID8gIiIgOiAoIiwgIiArIGFyZ3VtZW50X2xpc3QgKGFyZ2xpc3QpKSkKLSAgICAgICAgICAgICAgICAgICAgKyAoaGFzX3hjZXB0aW9ucyA/ICIiIDogKCIsICIgKyB4Y2VwdGlvbl9saXN0ICh4bGlzdCkpKQotICAgICAgICAgICAgICAgICAgICArICIsIEdFcnJvciAqKmVycm9yKSI7Ci0KLSAgICBzdHJpbmcgcGFyYW1zX3dpdGhvdXRfdHlwZSA9IHN0cmluZygiaWZhY2UsICIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChoYXNfcmV0dXJuID8gIl9yZXR1cm4sICIgOiAiIik7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgZmllbGRzID0gYXJnbGlzdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyX2ZpZWxkOwotICAgIGZvciAoZl9pdGVyX2ZpZWxkID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlcl9maWVsZCAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyX2ZpZWxkKSB7Ci0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICgqZl9pdGVyX2ZpZWxkKS0+Z2V0X25hbWUoKTsgCi0gICAgICBwYXJhbXNfd2l0aG91dF90eXBlICs9ICIsICI7Ci0gICAgfQotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4mIHhjZXB0aW9ucyA9IHhsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIHBhcmFtc193aXRob3V0X3R5cGUgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSArPSAiLCAiOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJnYm9vbGVhbiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2lmXyIgPDwgZnVubmFtZSA8PCAiICIgPDwKLSAgICAgICAgICBwYXJhbXMgPDwgZW5kbCA8PAotICAgICAgInsiIDw8IGVuZGwgPDwgCi0gICAgICAiICByZXR1cm4gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICAgIl9JRl9HRVRfSU5URVJGQUNFIChpZmFjZSktPiIgPDwgZnVubmFtZSA8PCAiICgiIDw8Ci0gICAgICAgICAgcGFyYW1zX3dpdGhvdXRfdHlwZSA8PCAiZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBpbnRlcmZhY2UgYm9pbGVycGxhdGUKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJHVHlwZSIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9pZl9nZXRfdHlwZSAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICAiICBpZiAodHlwZSA9PSAwKSIgPDwgZW5kbCA8PAotICAgICIgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgIHN0YXRpYyBjb25zdCBHVHlwZUluZm8gdHlwZV9pbmZvID0iIDw8IGVuZGwgPDwKLSAgICAiICAgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZkludGVyZmFjZSksIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsICAvKiBiYXNlX2luaXQgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCAgLyogYmFzZV9maW5hbGl6ZSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgfTsiIDw8IGVuZGwgPDwKLSAgICAiICAgIHR5cGUgPSBnX3R5cGVfcmVnaXN0ZXJfc3RhdGljIChHX1RZUEVfSU5URVJGQUNFLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgICAiSWZcIiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZV9pbmZvLCAwKTsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgIiAgcmV0dXJuIHR5cGU7IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBib2lsZXJwbGF0ZQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgIl9pZl9pbnRlcmZhY2VfaW5pdCAoIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PAotICAgICAgICAiSWZJbnRlcmZhY2UgKmlmYWNlKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIkdfREVGSU5FX1RZUEVfV0lUSF9DT0RFICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8Ci0gICAgICAiQ2xpZW50LCAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnQsIiA8PCBlbmRsIDw8Ci0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICBHX1RZUEVfT0JKRUNULCAiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIEdfSU1QTEVNRU5UX0lOVEVSRkFDRSAoIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBzZXJ2aWNlX25hbWVfdWMgPDwgIl9JRiwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8PAotICAgICAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQpKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBwcm9wZXJ0aWVzCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZW51bSBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50UHJvcGVydGllcyIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgUFJPUF8wLCIgPDwgZW5kbCA8PAotICAgICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICIgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTCIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHByb3BlcnR5IHNldHRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eSAoIiA8PAotICAgICAgICAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgY29uc3QgR1ZhbHVlICp2YWx1ZSwgIiA8PAotICAgICAgICAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwKLSAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICIgICAgICBjbGllbnQtPmlucHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICIgICAgY2FzZSBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PAotICAgICAgICAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0w6IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGNsaWVudC0+b3V0cHV0X3Byb3RvY29sID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICIgIH0iIDw8IGVuZGwgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIHByb3BlcnR5IGdldHRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2dldF9wcm9wZXJ0eSAoIiA8PAotICAgICAgICAiR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwgR1ZhbHVlICp2YWx1ZSwgIiA8PAotICAgICAgICAiR1BhcmFtU3BlYyAqcHNwZWMpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgKmNsaWVudCA9ICIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVCAob2JqZWN0KTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgc3dpdGNoIChwcm9wZXJ0eV9pZCkiIDw8IGVuZGwgPDwKLSAgICAiICB7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MOiIgPDwgZW5kbCA8PAotICAgICIgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBjbGllbnQtPmlucHV0X3Byb3RvY29sKTsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgIiAgICBjYXNlIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgc2VydmljZV9uYW1lX3VjIDw8Ci0gICAgICAgICJfQ0xJRU5UX09VVFBVVF9QUk9UT0NPTDoiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wpOyIgPDwgZW5kbCA8PAotICAgICIgICAgICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAiICB9IiA8PCBlbmRsIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcyBhbmQgZXhjZXB0aW9ucwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRnVuY3Rpb24gZm9yIHNlbmRpbmcKLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24gKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lX2xjICsgc3RyaW5nICgiX2NsaWVudF9zZW5kXyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgLy8gT3BlbiB0aGUgc2VuZCBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlICgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJnaW50MzIgY3NlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRQcm90b2NvbCAqIHByb3RvY29sID0gIiA8PCAKLSAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8IHNlcnZpY2VfbmFtZV91YyA8PCAKLSAgICAgICAgIl9DTElFTlQgKGlmYWNlKS0+b3V0cHV0X3Byb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsIFwiIiA8PAotICAgICAgICBuYW1lIDw8ICJcIiwgVF9DQUxMLCBjc2VxaWQsIGVycm9yKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlciAoZl9zZXJ2aWNlXywgYXJnX3N0cnVjdCwgIiIsICIiLCBmYWxzZSk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIGVycm9yKSA8IDApIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcikpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PAotICAgICAgICAiaWYgKCF0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgZXJyb3IpKSIgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgCi0gICAgICAgICJyZXR1cm4gVFJVRTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHJlY3YgZnVuY3Rpb24gb25seSBpZiBub3QgYW4gYXN5bmMgZnVuY3Rpb24KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyAocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZyAoIl9jbGllbnRfcmVjdl8iKSArIGZ1bm5hbWUsICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBmdW5jdGlvbl9zaWduYXR1cmUgKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZ2ludDMyIHJzZXFpZDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImdjaGFyICogZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRNZXNzYWdlVHlwZSBtdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFByb3RvY29sICogcHJvdG9jb2wgPSAiIDw8IAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPm5zcGFjZV91YyA8PCBzZXJ2aWNlX25hbWVfdWMgPDwKLSAgICAgICAgICAgICAgICAgICAgICAiX0NMSUVOVCAoaWZhY2UpLT5pbnB1dF9wcm90b2NvbDsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gIiA8PCAKLSAgICAgICAgICAgICAgICAgICAgICAiKHByb3RvY29sLCAmZm5hbWUsICZtdHlwZSwgJnJzZXFpZCwgZXJyb3IpIDwgMCkiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSBUX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0KLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksIHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgeGNlcHRpb24tPnR5cGUsIFwiYXBwbGljYXRpb24gZXJyb3I6ICVzXCIsIHhjZXB0aW9uLT5tZXNzYWdlKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIChtdHlwZSAhPSBUX1JFUExZKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlmIChmbmFtZSkgZ19mcmVlIChmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgVF9TVFJVQ1QsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBOVUxMKTsiIDw8IGVuZGwgPDwgCi0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX01FU1NBR0VfVFlQRSwgXCJpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCwgZXhwZWN0ZWQgVF9SRVBMWVwiLCBtdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBGQUxTRTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiAoc3RybmNtcCAoZm5hbWUsIFwiIiA8PCBuYW1lIDw8ICJcIiwgIiA8PCBuYW1lLmxlbmd0aCgpIDw8ICIpICE9IDApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBUX1NUUlVDVCwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChwcm90b2NvbC0+dHJhbnNwb3J0LCBlcnJvcik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9XUk9OR19NRVRIT0RfTkFNRSwgXCJ3cm9uZyBtZXRob2QgbmFtZSAlcywgZXhwZWN0ZWQgIiA8PCBuYW1lIDw8ICJcIiwgZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZm5hbWUpIGdfZnJlZSAoZm5hbWUpOyIgPDwgZW5kbCA8PCAKLSAgICAgICAgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gICAgICB7Ci0gICAgICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICAgIHRfZmllbGQgc3VjY2VzcygoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICIqX3JldHVybiIsIDApOwotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhZGQgcmVhZGVycyBmb3IgZXhjZXB0aW9ucywgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlci4KLSAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgeF9pdGVyKyspIHsKLSAgICAgICAgICB0X2ZpZWxkICp4Y2VwdGlvbiA9IG5ldyB0X2ZpZWxkKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqIiArICgqeF9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X2tleSgpKTsKLSAgICAgICAgICByZXN1bHQuYXBwZW5kICh4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyIChmX3NlcnZpY2VfLCAmcmVzdWx0LCAiIiwgIiIsIGZhbHNlKTsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgZXJyb3IpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoIXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHByb3RvY29sLT50cmFuc3BvcnQsIGVycm9yKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotCi0gICAgICAvLyBjb3B5IG92ZXIgYW55IHRocm93IGV4Y2VwdGlvbnMgYW5kIHJldHVybiBmYWlsdXJlCi0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyB4X2l0ZXIrKykgewotICAgICAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoKiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgZ19zZXRfZXJyb3IgKGVycm9yLCAiIDw8IHRoaXMtPm5zcGFjZV91YyA8PAotICAgICAgICAgICAgICB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpIDw8Ci0gICAgICAgICAgICAgICJfRVJST1IsICIgPDwKLSAgICAgICAgICAgICAgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgICAgICAgICAgIHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSkgPDwKLSAgICAgICAgICAgICAgIl9FUlJPUl9DT0RFLCBcIiIgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8IAotICAgICAgICAgICAgICAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRSVUU7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgdF9mdW5jdGlvbiBzZXJ2aWNlX2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZV9sYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcgKCJfY2xpZW50XyIpICsgZnVubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSAoJnNlcnZpY2VfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAvLyB3cmFwIGVhY2ggZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgICAgICAgICAgICAiX2NsaWVudF9zZW5kXyIgPDwgZnVubmFtZSA8PAotICAgICAgIiAoaWZhY2UiOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiwgZXJyb3IpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIEZBTFNFOyIgPDwgZW5kbDsKLQotICAgIC8vIGlmIG5vdCBvbmV3YXksIGltcGxlbWVudCByZWN2Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdHJpbmcgcmV0ID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuLCAiOwotCi0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgeGNlcHRpb25zID0KLSAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICByZXQgKz0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICByZXQgKz0gIiwgIjsKLSAgICAgIH0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBzZXJ2aWNlX25hbWVfbGMgPDwKLSAgICAgICAgICAiX2NsaWVudF9yZWN2XyIgPDwgZnVubmFtZSA8PAotICAgICAgICAgICIgKGlmYWNlLCAiIDw8IHJldCA8PCAiZXJyb3IpKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIHJldHVybiBUUlVFIHdoaWNoIG1lYW5zIGFsbCBmdW5jdGlvbnMgd2VyZSBjYWxsZWQgT0sKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBUUlVFOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNyZWF0ZSB0aGUgaW50ZXJmYWNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfaWZfaW50ZXJmYWNlX2luaXQgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmSW50ZXJmYWNlICppZmFjZSkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvKiBtYWtlIHRoZSBmdW5jdGlvbiBuYW1lIEMgZnJpZW5kbHkgKi8KLSAgICBzdHJpbmcgZnVubmFtZSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcygoKmZfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIiAgaWZhY2UtPiIgPDwgZnVubmFtZSA8PCAiID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8Ci0gICAgICAgICJfY2xpZW50XyIgPDwgZnVubmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGNyZWF0ZSB0aGUgY2xpZW50IGluc3RhbmNlIGluaXRpYWxpemVyCi0gIGZfc2VydmljZV8gPDwKLSAgICAic3RhdGljIHZvaWQiIDw8IGVuZGwgPDwKLSAgICB0aGlzLT5uc3BhY2VfbGMgPDwgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X2luaXQgKCIgPDwKLSAgICAgICAgdGhpcy0+bnNwYWNlIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCAqY2xpZW50KSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgY2xpZW50LT5pbnB1dF9wcm90b2NvbCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgIiAgY2xpZW50LT5vdXRwdXRfcHJvdG9jb2wgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBjcmVhdGUgdGhlIGNsaWVudCBjbGFzcyBpbml0aWFsaXplcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgInN0YXRpYyB2b2lkIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IHNlcnZpY2VfbmFtZV9sYyA8PCAiX2NsaWVudF9jbGFzc19pbml0ICgiIDw8Ci0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnRDbGFzcyAqY2xzKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsIDw8Ci0gICAgIiAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwKLSAgICAgICAgc2VydmljZV9uYW1lX2xjIDw8ICJfY2xpZW50X3NldF9wcm9wZXJ0eTsiIDw8IGVuZGwgPDwKLSAgICAiICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PAotICAgICAgICBzZXJ2aWNlX25hbWVfbGMgPDwgIl9jbGllbnRfZ2V0X3Byb3BlcnR5OyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoXCJpbnB1dF9wcm90b2NvbFwiLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImlucHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgaW5wdXQgcHJvdG9jb2xcIiwiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsiIDw8IGVuZGwgPDwKLSAgICAiICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwKLSAgICAgICAgc2VydmljZV9uYW1lX3VjIDw8ICJfQ0xJRU5UX0lOUFVUX1BST1RPQ09MLCBwYXJhbV9zcGVjKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKFwib3V0cHV0X3Byb3RvY29sXCIsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3V0cHV0IHByb3RvY29sIChjb25zdHJ1Y3QpXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2V0IHRoZSBjbGllbnQgb3V0cHV0IHByb3RvY29sXCIsIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MLCIgPDwgZW5kbCA8PAotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QXyIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8Ci0gICAgICAgIHNlcnZpY2VfbmFtZV91YyA8PCAiX0NMSUVOVF9PVVRQVVRfUFJPVE9DT0wsIHBhcmFtX3NwZWMpOyIgPDwgZW5kbCA8PAotICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgQyBjb2RlIHRoYXQgcmVwcmVzZW50cyBhIFRocmlmdCBzZXJ2aWNlIHNlcnZlci4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgLyogZ2V0IHNvbWUgQyBmcmllbmRseSBzZXJ2aWNlIG5hbWVzICovCi0gIHN0cmluZyBzZXJ2aWNlX25hbWVfdSA9IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKTsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2Uoc2VydmljZV9uYW1lX3UpOwotCi0gIC8vIHdyaXRlIHRoZSBzZXJ2ZXIgb2JqZWN0IGluc3RhbmNlIGRlZmluaXRpb24gaW4gdGhlIGhlYWRlci4KLSAgLy8gVE9ETzogaW1wbGVtZW50IGFmdGVyIGltcGxlbWVudCBUU2VydmVyIGFuZCBUUHJvY2Vzc29yCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIEMgY29kZSB0byByZXByZXNlbnQgYSBUSHJpZnQgc3RydWN0dXJlIGFzIGEgR09iamVjdC4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX29iamVjdCh0X3N0cnVjdCAqdHN0cnVjdCkgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotCi0gIC8vIHdyaXRlIHRoZSBpbnN0YW5jZSBkZWZpbml0aW9uCi0gIGZfdHlwZXNfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCBlbmRsIDw8Ci0gICAgInsgIiA8PCBlbmRsIDw8Ci0gICAgIiAgVGhyaWZ0U3RydWN0IHBhcmVudDsgIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgIC8qIHB1YmxpYyAqLyIgPDwgZW5kbDsKLQotICAvLyBmb3IgZWFjaCBmaWVsZCwgYWRkIGEgbWVtYmVyIHZhcmlhYmxlCi0gIHZlY3Rvcjx0X2ZpZWxkICo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+ICZtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSAqdCA9IGdldF90cnVlX3R5cGUgKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIgICIgPDwgdHlwZV9uYW1lICh0KSA8PCAiICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiICBnYm9vbGVhbiBfX2lzc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIGNsb3NlIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBhbmQgY3JlYXRlIGEgdHlwZWRlZgotICBmX3R5cGVzXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgICJ0eXBlZGVmIHN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICIgPDwgCi0gICAgICAgIHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gIC8vIHdyaXRlIHRoZSBjbGFzcyBkZWZpbml0aW9uCi0gIGZfdHlwZXNfIDw8Ci0gICAgInN0cnVjdCBfIiA8PCB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiQ2xhc3MiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIFRocmlmdFN0cnVjdENsYXNzIHBhcmVudDsiIDw8IGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICAidHlwZWRlZiBzdHJ1Y3QgXyIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzICIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIkNsYXNzOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gd3JpdGUgdGhlIHN0YW5kYXJkIEdPYmplY3QgYm9pbGVycGxhdGUKLSAgZl90eXBlc18gPDwKLSAgICAiR1R5cGUgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfZ2V0X3R5cGUgKHZvaWQpOyIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiICgiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSgpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIl9UWVBFXyIgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIklTXyIgPDwgbmFtZV91YyA8PCAiKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJJU18iIDw8IG5hbWVfdWMgPDwgIl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwgIlRZUEVfIiA8PCBuYW1lX3VjIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8IG5hbWVfdWMgPDwgIl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksICIgPDwgdGhpcy0+bnNwYWNlX3VjIDw8ICJUWVBFXyIgPDwgbmFtZV91YyA8PCAiLCAiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcykpIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBzdGFydCB3cml0aW5nIHRoZSBvYmplY3QgaW1wbGVtZW50YXRpb24gLmMgZmlsZQotICAvLyBnZW5lcmF0ZSBzdHJ1Y3QgSS9PIG1ldGhvZHMKLSAgc3RyaW5nIHRoaXNfZ2V0ID0gdGhpcy0+bnNwYWNlICsgbmFtZSArICIgKiB0aGlzX29iamVjdCA9ICIgCi0gICAgICAgICAgICAgICAgICAgICsgdGhpcy0+bnNwYWNlX3VjICsgbmFtZV91YyArICIob2JqZWN0KTsiOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyIChmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCAidGhpc19vYmplY3QtPiIsIHRoaXNfZ2V0KTsKLSAgZ2VuZXJhdGVfc3RydWN0X3dyaXRlciAoZl90eXBlc19pbXBsXywgdHN0cnVjdCwgInRoaXNfb2JqZWN0LT4iLCB0aGlzX2dldCk7Ci0KLSAgLy8gZ2VuZXJhdGUgdGhlIGluc3RhbmNlIGluaXQgZnVuY3Rpb24KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJ2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9pbnN0YW5jZV9pbml0ICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICIgKiBvYmplY3QpIiA8PCBlbmRsIDw8Ci0gICAgInsiIDw8IGVuZGw7Ci0KLSAgLy8gc2F0aXNmeSBjb21waWxlcnMgd2l0aCAtV2FsbCB0dXJuZWQgb24KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAiLyogc2F0aXNmeSAtV2FsbCAqLyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChvYmplY3QpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIC8vIG9ubHkgaGF2ZSBpbml0J3MgZm9yIGJhc2UgdHlwZXMKLSAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7Ci0gICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lICh0KSArICIpIjsKLSAgICAgIH0KLSAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgIGR2YWwgKz0gY29uc3RhbnRfdmFsdWUgKCIiLCB0LCBjdik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkdmFsICs9IHQtPmlzX3N0cmluZygpID8gIk5VTEwiIDogIjAiOwotICAgICAgfQotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgdHlwZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZQotICAgICAgICAoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOwotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IHR5cGVfbmFtZV91YyA8PCAiLCBOVUxMKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGluZGVudChmX3R5cGVzX2ltcGxfKSA8PCAib2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgc3RyaW5nIGluaXRfZnVuY3Rpb247Ci0KLSAgICAgIGlmICh0LT5pc19tYXAoKSkgewotICAgICAgICB0X3R5cGUgKmtleSA9ICgodF9tYXAgKikgdCktPmdldF9rZXlfdHlwZSgpOwotICAgICAgICB0X3R5cGUgKnZhbHVlID0gKCh0X21hcCAqKSB0KS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICAgIGluaXRfZnVuY3Rpb24gPSBnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUgKGtleSwgdmFsdWUpOwotICAgICAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgICAgICB0X3R5cGUgKmV0eXBlID0gKCh0X3NldCAqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBpbml0X2Z1bmN0aW9uID0gZ2VuZXJhdGVfbmV3X2hhc2hfZnJvbV90eXBlIChldHlwZSwgTlVMTCk7Ci0gICAgICB9IGVsc2UgaWYgKHQtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUgKmV0eXBlID0gKCh0X2xpc3QgKikgdCktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgICAgaW5pdF9mdW5jdGlvbiA9IGdlbmVyYXRlX25ld19hcnJheV9mcm9tX3R5cGUgKGV0eXBlKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZnVuY3Rpb24gPDwgZW5kbDsKLQotICAgIH0KLQotICAgIC8qIGlmIG5vdCByZXF1aXJlZCwgaW5pdGlhbGl6ZSB0aGUgX19pc3NldCB2YXJpYWJsZSAqLwotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+X19pc3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwgIn0iIDw8IGVuZGwgPDwKLSAgZW5kbDsKLQotICAvKiBjcmVhdGUgdGhlIGRlc3RydWN0b3IgKi8KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJ2b2lkICIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgaW5kZW50KCkgPDwKLSAgICB0aGlzLT5uc3BhY2UgPDwgbmFtZSA8PCAiICp0b2JqZWN0ID0gIiA8PCB0aGlzLT5uc3BhY2VfdWMgPDwKLSAgICBuYW1lX3VjIDw8ICIgKG9iamVjdCk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICIvKiBzYXRpc2Z5IC1XYWxsIGluIGNhc2Ugd2UgZG9uJ3QgdXNlIHRvYmplY3QgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRvYmplY3QpOyIgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodC0+aXNfY29udGFpbmVyKCkpIHsgCi0gICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGlmICh0LT5pc19tYXAoKSB8fCB0LT5pc19zZXQoKSkgewotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0JaW5kZW50X3VwKCk7Ci0JZl90eXBlc19pbXBsXyA8PAotCWluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZGVzdHJveSAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLQlmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotCWluZGVudF9kb3duKCk7Ci0JZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfdHlwZSAqZXR5cGUgPSAoKHRfbGlzdCAqKSB0KS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgICBzdHJpbmcgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX3B0cl9hcnJheV9mcmVlIjsKLQotICAgICAgICBpZiAoZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjogICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgICAgZGVzdHJ1Y3Rvcl9mdW5jdGlvbiA9ICJnX2FycmF5X2ZyZWUiOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGRlc3RydWN0b3JfZnVuY3Rpb24gPDwgIiAodG9iamVjdC0+IiA8PCBuYW1lIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICIsIFRSVUUpOyIgPDwgZW5kbDsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgLy8gVE9ETzogZ19jbGVhcl9vYmplY3QgbmVlZHMgZ2xpYiA+PSAyLjI4Ci0gICAgICAvLyBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJnX2NsZWFyX29iamVjdCAoJih0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIikpOyIgPDwgZW5kbDsKLSAgICAgIC8vIGRvZXMgZ19vYmplY3RfdW5yZWYgdGhlIHRyaWNrPwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiICE9IE5VTEwpIiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl90eXBlc19pbXBsXyA8PAotICAgICAgaW5kZW50KCkgPDwgImdfb2JqZWN0X3VucmVmKHRvYmplY3QtPiIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIiA9IE5VTEw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfdHlwZXNfaW1wbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0LT5pc19zdHJpbmcoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJpZiAodG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19mcmVlICh0b2JqZWN0LT4iIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc19pbXBsXyA8PCBpbmRlbnQoKSA8PCAidG9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3R5cGVzX2ltcGxfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLQotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgInZvaWQgIiA8PCBlbmRsIDw8Ci0gICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX2NsYXNzX2luaXQgKFRocmlmdFN0cnVjdENsYXNzICogY2xzKSIgPDwgZW5kbCA8PAotICAgICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3R5cGVzX2ltcGxfIDw8ICAgCi0gICAgaW5kZW50KCkgPDwgIkdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSAiIDw8IHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9maW5hbGl6ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xzLT5yZWFkID0gIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfcmVhZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xzLT53cml0ZSA9ICIgPDwgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PCAiX3dyaXRlOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgICJHVHlwZSIgPDwgZW5kbCA8PAotICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwgIl9nZXRfdHlwZSAodm9pZCkiIDw8IGVuZGwgPDwKLSAgICAieyIgPDwgZW5kbCA8PAotICAgICIgIHN0YXRpYyBHVHlwZSB0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiAgaWYgKHR5cGUgPT0gMCkgIiA8PCBlbmRsIDw8Ci0gICAgIiAgeyIgPDwgZW5kbCA8PAotICAgICIgICAgc3RhdGljIGNvbnN0IEdUeXBlSW5mbyB0eXBlX2luZm8gPSAiIDw8IGVuZGwgPDwKLSAgICAiICAgIHsiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgc2l6ZW9mICgiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJDbGFzcyksIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIE5VTEwsIC8qIGJhc2VfaW5pdCAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBOVUxMLCAvKiBiYXNlX2ZpbmFsaXplICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIChHQ2xhc3NJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfY2xhc3NfaW5pdCwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogY2xhc3NfZmluYWxpemUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogY2xhc3NfZGF0YSAqLyIgPDwgZW5kbCA8PAotICAgICIgICAgICBzaXplb2YgKCIgPDwgdGhpcy0+bnNwYWNlIDw8IG5hbWUgPDwgIiksIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIDAsIC8qIG5fcHJlYWxsb2NzICovIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgIChHSW5zdGFuY2VJbml0RnVuYykgIiA8PCB0aGlzLT5uc3BhY2VfbGMgPDwgbmFtZV91IDw8ICJfaW5zdGFuY2VfaW5pdCwiIDw8IGVuZGwgPDwKLSAgICAiICAgICAgTlVMTCwgLyogdmFsdWVfdGFibGUgKi8iIDw8IGVuZGwgPDwKLSAgICAiICAgIH07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIgICAgdHlwZSA9IGdfdHlwZV9yZWdpc3Rlcl9zdGF0aWMgKFRIUklGVF9UWVBFX1NUUlVDVCwgIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIiIDw8IHRoaXMtPm5zcGFjZSA8PCBuYW1lIDw8ICJUeXBlXCIsIiA8PCBlbmRsIDw8Ci0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaW5mbywgMCk7IiA8PCBlbmRsIDw8Ci0gICAgIiAgfSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiICByZXR1cm4gdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGZ1bmN0aW9ucyB0byB3cml0ZSBUaHJpZnQgc3RydWN0dXJlcyB0byBhIHN0cmVhbS4KLSAqLwotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkICo+ICZmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3IgPHRfZmllbGQgKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgaW50IGVycm9yX3JldCA9IDA7Ci0KLSAgaWYgKGlzX2Z1bmN0aW9uKSB7Ci0gICAgZXJyb3JfcmV0ID0gLTE7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJnaW50MzIiIDw8IGVuZGwgPDwKLSAgICAgIHRoaXMtPm5zcGFjZV9sYyA8PCBuYW1lX3UgPDwKLSAgICAgICJfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7Ci0gIC8vIHNhdGlzZnkgLVdhbGwgaW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHkgc3RydWN0Ci0gIGlmICghdGhpc19nZXQuZW1wdHkoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAodGhpc19vYmplY3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCBcIiIgPDwgbmFtZSA8PCAiXCIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzX29iamVjdC0+X19pc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IFRSVUUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9IAotCi0gICAgb3V0IDw8Ci0gICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgIHR5cGVfdG9fZW51bSAoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKG91dCwgKmZfaXRlciwgdGhpc19uYW1lLCAiIiwgZXJyb3JfcmV0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgLy8gd3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gcmVhZCBUaHJpZnQgc3RydWN0dXJlcyBmcm9tIGEgc3RyZWFtLgotICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbikgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBuYW1lX3UgPSBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7Ci0gIHN0cmluZyBuYW1lX3VjID0gdG9fdXBwZXJfY2FzZShuYW1lX3UpOwotICBpbnQgZXJyb3JfcmV0ID0gMDsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQgKj4gJmZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3RvciA8dF9maWVsZCAqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChpc19mdW5jdGlvbikgewotICAgIGVycm9yX3JldCA9IC0xOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLyogcmVhZHMgYSAiIDw8IG5hbWVfdSA8PCAiIG9iamVjdCAqLyIgPDwgZW5kbCA8PAotICAgICAgImdpbnQzMiIgPDwgZW5kbCA8PAotICAgICAgdGhpcy0+bnNwYWNlX2xjIDw8IG5hbWVfdSA8PAotICAgICAgICAgICJfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIGRlY2xhcmUgc3RhY2sgdGVtcCB2YXJpYWJsZXMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdpbnQzMiB4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZ2NoYXIgKm5hbWUgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJnaW50MTYgZmlkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJndWludDMyIGxlbiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImdwb2ludGVyIGRhdGEgPSBOVUxMOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHRoaXNfZ2V0IDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImdib29sZWFuIGlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBGQUxTRTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHdlIGRvbid0IHVzZSBzb21lIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogc2F0aXNmeSAtV2FsbCBpbiBjYXNlIHRoZXNlIGFyZW4ndCB1c2VkICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRIUklGVF9VTlVTRURfVkFSIChsZW4pOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJUSFJJRlRfVU5VU0VEX1ZBUiAoZGF0YSk7IiA8PCBlbmRsOwotCi0gIGlmICghdGhpc19nZXQuZW1wdHkoKSkgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHRoaXNfb2JqZWN0KTsiIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgbWFya2VyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIvKiByZWFkIHRoZSBzdHJ1Y3QgYmVnaW4gbWFya2VyICovIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIHN0cnVjdCBmaWVsZHMgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAid2hpbGUgKDEpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIHJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgYmVnaW5uaW5nIG9mIGEgZmllbGQgKi8iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsICZmaWQsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJuYW1lID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIGNoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoZnR5cGUgPT0gVF9TVE9QKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIHN3aXRjaCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUKLSAgaW5kZW50KG91dCkgPDwKLSAgICAic3dpdGNoIChmaWQpIiA8PCBlbmRsOwotCi0gIC8vIHN0YXJ0IHN3aXRjaAotICBzY29wZV91cChvdXQpOwotCi0gIC8vIGdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biB0eXBlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtICgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gZ2VuZXJhdGUgZGVzZXJpYWxpemUgZmllbGQKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAqZl9pdGVyLCB0aGlzX25hbWUsICIiLCBlcnJvcl9yZXQsIGZhbHNlKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgLy8gY3JlYXRlIHRoZSBkZWZhdWx0IGNhc2UKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAvLyBlbmQgc3dpdGNoCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyByZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLQotICAvLyBlbmQgd2hpbGUgbG9vcAotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIHJlYWQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIG1pc3NpbmcsIHRocm93IGFuIGVycm9yCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCFpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICBcIm1pc3NpbmcgZmllbGRcIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAtMTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpZiAoaXNfZnVuY3Rpb24pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInJldHVybiB4ZmVyOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGVuZCB0aGUgZnVuY3Rpb24vc3RydWN0dXJlCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQgKnRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUgKnR5cGUgPSBnZXRfdHJ1ZV90eXBlICh0ZmllbGQtPmdldF90eXBlKCkpOwotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAob3V0LCAodF9zdHJ1Y3QgKikgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlXyI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIKLSAgICAgICAgICAgICAgICArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgImJvb2wgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiaTE2IChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsICIgPDwgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAiIDw8IG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIG91dCA8PCAiZG91YmxlIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIG91dCA8PCAiYmluYXJ5IChwcm90b2NvbCwgKChHQnl0ZUFycmF5ICopICIgPDwgbmFtZSA8PAotICAgICAgICAgICAgICAgICAgICIpLT5kYXRhLCAoKEdCeXRlQXJyYXkgKikgIiA8PCBuYW1lIDw8Ci0gICAgICAgICAgICAgICAgICAgIiktPmxlbiI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgIiA8PCBuYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMgd3JpdGVyIGZvciBiYXNlIHR5cGUgIgotICAgICAgICAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lICh0YmFzZSkgKyBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgImkzMiAocHJvdG9jb2wsIChnaW50MzIpICIgPDwgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgICBuYW1lLmNfc3RyKCksIHR5cGVfbmFtZSAodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0ICp0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRIUklGVF9TVFJVQ1QgKCIgPDwgcHJlZml4IDw8ICIpLCBwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUgKnR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGxlbmd0aCA9ICJnX2hhc2hfdGFibGVfc2l6ZSAoKEdIYXNoVGFibGUgKikgIiArIHByZWZpeCArICIpIjsKLSAgICB0X3R5cGUgKnRrZXkgPSAoKHRfbWFwICopIHR0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlICp0dmFsID0gKCh0X21hcCAqKSB0dHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHN0cmluZyB0a2V5X25hbWUgPSB0eXBlX25hbWUgKHRrZXkpOwotICAgIHN0cmluZyB0dmFsX25hbWUgPSB0eXBlX25hbWUgKHR2YWwpOwotICAgIHN0cmluZyB0a2V5X3B0ciA9IHRrZXktPmlzX3N0cmluZygpIHx8ICF0a2V5LT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotICAgIHN0cmluZyB0dmFsX3B0ciA9IHR2YWwtPmlzX3N0cmluZygpIHx8ICF0dmFsLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gICAgLyoKLSAgICAgKiBTb21lIHVnbGluZXNzIGhlcmUuICBUbyBtYXhpbWl6ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgd2UKLSAgICAgKiBhdm9pZCB1c2luZyBHSGFzaFRhYmxlSXRlciBhbmQgaW5zdGVhZCBnZXQgYSBHTGlzdCBvZiBhbGwga2V5cywKLSAgICAgKiB0aGVuIGNvcHkgaXQgaW50byBhIGFycmF5IG9uIHRoZSBzdGFjaywgYW5kIGZyZWUgaXQuCi0gICAgICogVGhpcyBpcyBiZWNhdXNlIHdlIG1heSBleGl0IGVhcmx5IGJlZm9yZSB3ZSBnZXQgYSBjaGFuY2UgdG8gZnJlZSB0aGUKLSAgICAgKiBHTGlzdC4KLSAgICAgKi8KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgdHlwZV90b19lbnVtICh0a2V5KSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSAodHZhbCkgPDwKLSAgICAgICAgICAgICAgICAgICAiLCAoZ2ludDMyKSAiIDw8IGxlbmd0aCA8PCAiLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIkdMaXN0ICprZXlfbGlzdCA9IE5VTEwsICppdGVyID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PCAiIGtleTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHR2YWxfbmFtZSA8PCB0dmFsX3B0ciA8PCAiIHZhbHVlOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImdfaGFzaF90YWJsZV9mb3JlYWNoICgoR0hhc2hUYWJsZSAqKSAiIDw8IHByZWZpeCA8PCAKLSAgICAgICAgICAgICAgICAgICAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHRrZXlfbmFtZSA8PCB0a2V5X3B0ciA8PAotICAgICAgICAgICAgICAgICAgICIga2V5c1tnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCldOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImludCBpPTAsIGtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgaXRlciA9IGl0ZXItPm5leHQpIiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAga2V5c1tpKytdID0gKCIgPDwgdGtleV9uYW1lIDw8IHRrZXlfcHRyIDw8Ci0gICAgICAgICAgICAgICAgICAgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyArK2kpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJrZXkgPSBrZXlzW2ldOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZhbHVlID0gKCIgPDwgdHZhbF9uYW1lIDw8IHR2YWxfcHRyIDw8Ci0gICAgICAgICAgICAgICAgICAgIikgZ19oYXNoX3RhYmxlX2xvb2t1cCAoKChHSGFzaFRhYmxlICopICIgPDwgcHJlZml4IDw8Ci0gICAgICAgICAgICAgICAgICAgIiksIChncG9pbnRlcikga2V5KTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50IChvdXQsICh0X21hcCAqKSB0dHlwZSwgdGtleV9wdHIgKyAiIGtleSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dmFsX3B0ciArICIgdmFsdWUiLCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgbGVuZ3RoID0gImdfaGFzaF90YWJsZV9zaXplICgoR0hhc2hUYWJsZSAqKSAiICsgcHJlZml4ICsgIikiOwotICAgIHRfdHlwZSAqdGVsZW0gPSAoKHRfc2V0ICopIHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHN0cmluZyB0ZWxlbV9uYW1lID0gdHlwZV9uYW1lICh0ZWxlbSk7Ci0gICAgc3RyaW5nIHRlbGVtX3B0ciA9IHRlbGVtLT5pc19zdHJpbmcoKSB8fCAhdGVsZW0tPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgIiA8PAotICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSAodGVsZW0pIDw8ICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8Ci0gICAgICAgICAgICAgICAgICAgIiwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJHTGlzdCAqa2V5X2xpc3QgPSBOVUxMLCAqaXRlciA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0ZWxlbV9uYW1lIDw8IHRlbGVtX3B0ciA8PCAiIGVsZW07IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3BvaW50ZXIgdmFsdWU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnX2hhc2hfdGFibGVfZm9yZWFjaCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwKLSAgICAgICAgICAgICAgICAgICAiLCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cywgJmtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHRlbGVtX25hbWUgPDwgdGVsZW1fcHRyIDw8ICIga2V5c1tnX2xpc3RfbGVuZ3RoIChrZXlfbGlzdCldOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImludCBpPTAsIGtleV9jb3VudCA9IGdfbGlzdF9sZW5ndGggKGtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGl0ZXIgPSBnX2xpc3RfZmlyc3QgKGtleV9saXN0KTsgaXRlcjsgaXRlciA9IGl0ZXItPm5leHQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAga2V5c1tpKytdID0gKCIgPDwgdGVsZW1fbmFtZSA8PCB0ZWxlbV9wdHIgPDwgIikgaXRlci0+ZGF0YTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19saXN0X2ZyZWUgKGtleV9saXN0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKGk9MDsgaTxrZXlfY291bnQ7ICsraSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImVsZW0gPSBrZXlzW2ldOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInZhbHVlID0gKGdwb2ludGVyKSBnX2hhc2hfdGFibGVfbG9va3VwICgoKEdIYXNoVGFibGUgKikgIiA8PAotICAgICAgICAgICAgICAgICAgIHByZWZpeCA8PCAiKSwgKGdwb2ludGVyKSBlbGVtKTsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50IChvdXQsICh0X3NldCAqKSB0dHlwZSwgdGVsZW1fcHRyICsgImVsZW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBsZW5ndGggPSBwcmVmaXggKyAiLT5sZW4iOwotICAgIHN0cmluZyBpID0gdG1wKCJpIik7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsICIgPDwKLSAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0gKCgodF9saXN0ICopIHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PAotICAgICAgICAgICAgICAgICAgICIsIChnaW50MzIpICIgPDwgbGVuZ3RoIDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yICgiPDwgaSA8PCAiPTA7ICIgPDwgaSA8PCAiPCIgPDwgbGVuZ3RoIDw8ICI7ICIgPDwgaSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICIrKykiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKG91dCwgKHRfbGlzdCAqKSB0dHlwZSwgcHJlZml4LCBpLCBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAgKnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X2ZpZWxkIGtmaWVsZCAodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAma2ZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQgKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWx1ZSk7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAob3V0LCAmdmZpZWxkLCAiIiwgIiIsIGVycm9yX3JldCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQgKnRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KSB7Ci0gIHRfZmllbGQgZWZpZWxkICh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnQpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0ICp0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICB0X3R5cGUgKnR0eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKLQotICAvLyBjYXN0IHRvIG5vbi1jb25zdAotICBzdHJpbmcgY2FzdCA9ICIiOwotICBzdHJpbmcgbmFtZSA9ICJnX3B0cl9hcnJheV9pbmRleCAoKEdQdHJBcnJheSAqKSAiICsgbGlzdCArICIsICIKLSAgICAgICAgICAgICAgICArIGluZGV4ICsgIikiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7IAotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdib29sZWFuLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDgsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdpbnQxNiwgIiArIGluZGV4ICsgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBuYW1lID0gImdfYXJyYXlfaW5kZXggKCIgKyBsaXN0ICsgIiwgZ2ludDMyLCAiICsgaW5kZXggKyAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG5hbWUgPSAiZ19hcnJheV9pbmRleCAoIiArIGxpc3QgKyAiLCBnaW50NjQsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgbmFtZSA9ICJnX2FycmF5X2luZGV4ICgiICsgbGlzdCArICIsIGdkb3VibGUsICIgKyBpbmRleCArICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgY2FzdCA9ICIoZ2NoYXIqKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgIGNhc3QgPSAiKEdIYXNoVGFibGUqKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSAqYmFzZSA9ICgodF9saXN0ICopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgaWYgKGJhc2UtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUgKikgYmFzZSktPmdldF9iYXNlKCkpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IGRldGVybWluZSBhcnJheSB0eXBlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIGNhc3QgPSAiKEdBcnJheSopIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgY2FzdCA9ICIoR1B0ckFycmF5KikiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNhc3QgPSAiKEdQdHJBcnJheSopIjsKLSAgICB9Ci0gIH0KLQotICB0X2ZpZWxkIGVmaWVsZCAodHR5cGUsICIoIiArIGNhc3QgKyBuYW1lICsgIikiKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChvdXQsICZlZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKLX0KLQotLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkICp0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSkgewotICB0X3R5cGUgKnR5cGUgPSBnZXRfdHJ1ZV90eXBlICh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAob3V0LCAodF9zdHJ1Y3QgKikgdHlwZSwgbmFtZSwgZXJyb3JfcmV0LCBhbGxvY2F0ZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKG91dCwgdHlwZSwgbmFtZSwgZXJyb3JfcmV0KTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBuYW1lIDw8ICIgIT0gTlVMTCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfIjsKLQotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSAqKSB0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgInN0cmluZyAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiYm9vbCAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgImJ5dGUgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgImkxNiAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiaTMyIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJpNjQgKHByb3RvY29sLCAmIiA8PCBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgImRvdWJsZSAocHJvdG9jb2wsICYiIDw8IG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIHJlYWRlciBmb3IgYmFzZSB0eXBlICIKLSAgICAgICAgICArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSAodGJhc2UpICsgbmFtZTsKLSAgICB9Ci0gICAgb3V0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0KLSAgICAvLyBsb2FkIHRoZSBieXRlIGFycmF5IHdpdGggdGhlIGRhdGEKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HCi0gICAgICAgICYmICgodF9iYXNlX3R5cGUgKikgdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBnX2J5dGVfYXJyYXlfbmV3KCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImdfYnl0ZV9hcnJheV9hcHBlbmQgKCIgPDwgbmFtZSA8PCAiLCAoZ3VpbnQ4ICopIGRhdGEsIChndWludCkgbGVuKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZ19mcmVlIChkYXRhKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHN0cmluZyB0ID0gdG1wICgiZWNhc3QiKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJnaW50MzIgIiA8PCB0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmIiA8PCB0IDw8ICIsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAoIiA8PCB0eXBlX25hbWUgKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZiAoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUgKHR5cGUpLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKLSAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKLSAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJfX2lzc2V0XyIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8IHN1ZmZpeCA8PCAiID0gVFJVRTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCAmJiBwcmVmaXggIT0gIiIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb2NhdGUpIHsKLSAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0c3RydWN0LT5nZXRfbmFtZSgpKSk7Ci0gIGlmICh0c3RydWN0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogVGhpcyBzdHJ1Y3QgaXMgYW4gZXhjZXB0aW9uICovIiA8PCBlbmRsOwotICAgIGFsbG9jYXRlID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChhbGxvY2F0ZSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICggIiA8PCBwcmVmaXggPDwgIiAhPSBOVUxMKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ19vYmplY3RfdW5yZWYgKCIgPDwgcHJlZml4IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YyA8PCAiVFlQRV8iIDw8IG5hbWVfdWMgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAoIiA8PCBwcmVmaXggPDwgIiksIHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChhbGxvY2F0ZSkgewotICAgIGluZGVudChvdXQpIDw8ICJnX29iamVjdF91bnJlZiAoIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAob2ZzdHJlYW0gJm91dCwgdF90eXBlICp0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludDMyIHNpemU7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVGhyaWZ0VHlwZSBrZXlfdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUaHJpZnRUeXBlIHZhbHVlX3R5cGU7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiLyogcmVhZCB0aGUgbWFwIGJlZ2luIG1hcmtlciAqLyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgLy8gaXRlcmF0ZSBvdmVyIG1hcCBlbGVtZW50cwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIi8qIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBtYXAncyBmaWVsZHMgKi8iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJndWludDMyIGk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAob3V0LCAodF9tYXAgKikgdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIAotICAgIC8vIHJlYWQgbWFwIGVuZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIi8qIHJlYWQgdGhlIG1hcCBlbmQgbWFya2VyICovIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwgJnNpemUsIGVycm9yKSkgPCAwKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgZXJyb3JfcmV0IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIi8qIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2V0IGVsZW1lbnRzICovIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAob3V0LCAodF9zZXQgKikgdHR5cGUsIHByZWZpeCwgZXJyb3JfcmV0KTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyByZWFkIHNldCBlbmQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBzaXplOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlRocmlmdFR5cGUgZWxlbWVudF90eXBlOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVycm9yX3JldCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gcmV0OyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIi8qIGl0ZXJhdGUgdGhyb3VnaCBsaXN0IGVsZW1lbnRzICovIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZ3VpbnQzMiBpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKG91dCwgKHRfbGlzdCAqKSB0dHlwZSwgcHJlZml4LCAiaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9yZXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkiIDw8IGVuZGwgPDwgCi0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBlcnJvcl9yZXQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG9mc3RyZWFtICZvdXQsIHRfdHlwZSAqdHR5cGUsIHN0cmluZyAmbmFtZSkgewotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUgKHR0eXBlKTsKLSAgc3RyaW5nIHB0ciA9IHR0eXBlLT5pc19zdHJpbmcoKSB8fCAhdHR5cGUtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgIGluZGVudCgpIDw8IHRuYW1lIDw8IHB0ciA8PCAiICIgPDwgbmFtZSA8PCAiID0gZ19oYXNoX3RhYmxlX25ldyAoTlVMTCwgTlVMTCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCB0bmFtZSA8PCBwdHIgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8ICIgIiA8PCBuYW1lIDw8IChwdHIgIT0gIiIgPyAiID0gZ19uZXcgKCIgKyB0bmFtZSArICIsIDEpIiA6ICIgPSBOVUxMIikgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCAqdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlICp0a2V5ID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7Ci0gIHRfdHlwZSAqdHZhbCA9IHRtYXAtPmdldF92YWxfdHlwZSgpOwotICBzdHJpbmcgdGtleV9wdHIgPSB0a2V5LT5pc19zdHJpbmcoKSB8fCAhdGtleS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLSAgc3RyaW5nIHR2YWxfcHRyID0gdHZhbC0+aXNfc3RyaW5nKCkgfHwgIXR2YWwtPmlzX2Jhc2VfdHlwZSgpID8gIiIgOiAiKiI7Ci0gIHN0cmluZyBrZXluYW1lID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbG5hbWUgPSB0bXAoInZhbCIpOwotCi0gIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0a2V5LCBrZXluYW1lKTsKLSAgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvdXQsIHR2YWwsIHZhbG5hbWUpOwotCi0gIC8vIGRlc2VyaWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIG1hcCBlbGVtZW50Ci0gIHRfZmllbGQgZmtleSAodGtleSwgdGtleV9wdHIgKyBrZXluYW1lKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKG91dCwgJmZrZXksICIiLCAiIiwgZXJyb3JfcmV0KTsKLSAgdF9maWVsZCBmdmFsICh0dmFsLCB0dmFsX3B0ciArIHZhbG5hbWUpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZnZhbCwgIiIsICIiLCBlcnJvcl9yZXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImdfaGFzaF90YWJsZV9pbnNlcnQgKChHSGFzaFRhYmxlICopIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8IGtleW5hbWUgPDwgIiwgKGdwb2ludGVyKSAiIDw8IHZhbG5hbWUgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCAqdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKLSAgdF90eXBlICp0ZWxlbSA9IHRzZXQtPmdldF9lbGVtX3R5cGUoKTsKLSAgc3RyaW5nIGVsZW0gPSB0bXAgKCJfZWxlbSIpOwotICBzdHJpbmcgdGVsZW1fcHRyID0gdGVsZW0tPmlzX3N0cmluZygpIHx8ICF0ZWxlbS0+aXNfYmFzZV90eXBlKCkgPyAiIiA6ICIqIjsKLQotICBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG91dCwgdGVsZW0sIGVsZW0pOwotCi0gIHRfZmllbGQgZmVsZW0gKHRlbGVtLCB0ZWxlbV9wdHIgKyBlbGVtKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKG91dCwgJmZlbGVtLCAiIiwgIiIsIGVycm9yX3JldCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZ19oYXNoX3RhYmxlX2luc2VydCAoKEdIYXNoVGFibGUgKikgIiA8PCBwcmVmaXggPDwgIiwgKGdwb2ludGVyKSAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtIDw8ICIsIChncG9pbnRlcikgMSk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCAqdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewotICAodm9pZCkgaW5kZXg7Ci0gIHRfdHlwZSAqdHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotICBzdHJpbmcgZWxlbSA9IHRtcCAoIl9lbGVtIik7Ci0gIHN0cmluZyB0ZWxlbV9wdHIgPSB0dHlwZS0+aXNfc3RyaW5nKCkgfHwgIXR0eXBlLT5pc19iYXNlX3R5cGUoKSA/ICIiIDogIioiOwotCi0gIGRlY2xhcmVfbG9jYWxfdmFyaWFibGUob3V0LCB0dHlwZSwgZWxlbSk7Ci0KLSAgdF9maWVsZCBmZWxlbSAodHR5cGUsIHRlbGVtX3B0ciArIGVsZW0pOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAob3V0LCAmZmVsZW0sICIiLCAiIiwgZXJyb3JfcmV0KTsKLQotICBpbmRlbnQob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotICAgICAgICByZXR1cm47Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJnX2FycmF5X2FwcGVuZF92YWwgKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiZ19wdHJfYXJyYXlfYWRkICgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlICh0X3R5cGUgKiB0dHlwZSkgewotICBpZiAodHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gIk5VTEwiOwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgaGFzaCB0eXBlIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJOVUxMIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfZnJlZSI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGhhc2ggdGFibGUgaW5mbyBmb3IgdHlwZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19oYXNoX3RhYmxlX2Rlc3Ryb3kiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiZ19vYmplY3RfdW5yZWYiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUgKmV0eXBlID0gKCh0X2xpc3QgKikgdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgaWYgKGV0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgZXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGFycmF5IHR5cGUiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmV0dXJuICIoR0Rlc3Ryb3lOb3RpZnkpIGdfYXJyYXlfdW5yZWYiOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gYXJyYXkgaW5mbyBmb3IgdHlwZSI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChldHlwZS0+aXNfY29udGFpbmVyKCkgfHwgZXR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICByZXR1cm4gIihHRGVzdHJveU5vdGlmeSkgZ19wdHJfYXJyYXlfdW5yZWYiOzsKLSAgICB9IGVsc2UgaWYgKGV0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJldHVybiAiKEdEZXN0cm95Tm90aWZ5KSBnX2FycmF5X3VucmVmIjsKLSAgICB9Ci0gICAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZCBpbnNpZGUgdGhlIGFycmF5OiAlc1xuIiwgZXR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIGluc2lkZSBhcnJheSIgOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSgoKHRfdHlwZWRlZiAqKSB0dHlwZSktPmdldF90eXBlKCkpOwotICB9Ci0gIHByaW50ZigiVHlwZSBub3QgZXhwZWN0ZWQ6ICVzXG4iLCB0dHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgdGhyb3cgIlR5cGUgbm90IGV4cGVjdGVkIjsKLX0KLQotc3RyaW5nIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZSAodF90eXBlICogdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuICJOVUxMIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJnX2ludF9oYXNoIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gImdfaW50NjRfaGFzaCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJnX2RvdWJsZV9oYXNoIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfc3RyX2hhc2giOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBoYXNoIHRhYmxlIGluZm8gZm9yIHR5cGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgcmV0dXJuICJnX2RpcmVjdF9oYXNoIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRlX2hhc2hfZnVuY19mcm9tX3R5cGUoKCh0X3R5cGVkZWYgKikgdHR5cGUpLT5nZXRfdHlwZSgpKTsKLSAgfQotICBwcmludGYoIlR5cGUgbm90IGV4cGVjdGVkOiAlc1xuIiwgdHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIHRocm93ICJUeXBlIG5vdCBleHBlY3RlZCI7Ci19Ci0KLXN0cmluZyB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2NtcF9mdW5jX2Zyb21fdHlwZSAodF90eXBlICogdHR5cGUpIHsKLSAgaWYgKHR0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuICJOVUxMIjsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUgKikgdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGhhc2ggdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJnX2ludF9lcXVhbCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJnX2ludDY0X2VxdWFsIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImdfZG91YmxlX2VxdWFsIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfc3RyX2VxdWFsIjsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaGFzaCB0YWJsZSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiTlVMTCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIHJldHVybiAiZ19kaXJlY3RfZXF1YWwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gZ2VuZXJhdGVfY21wX2Z1bmNfZnJvbV90eXBlKCgodF90eXBlZGVmICopIHR0eXBlKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcHJpbnRmKCJUeXBlIG5vdCBleHBlY3RlZDogJXNcbiIsIHR0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB0aHJvdyAiVHlwZSBub3QgZXhwZWN0ZWQiOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfaGFzaF9mcm9tX3R5cGUgKHRfdHlwZSAqIGtleSwgdF90eXBlICp2YWx1ZSkgewotICBzdHJpbmcgaGFzaF9mdW5jID0gZ2VuZXJhdGVfaGFzaF9mdW5jX2Zyb21fdHlwZShrZXkpOwotICBzdHJpbmcgY21wX2Z1bmMgPSBnZW5lcmF0ZV9jbXBfZnVuY19mcm9tX3R5cGUoa2V5KTsKLSAgc3RyaW5nIGtleV9mcmVlX2Z1bmMgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKGtleSk7Ci0gIHN0cmluZyB2YWx1ZV9mcmVlX2Z1bmMgPSBnZW5lcmF0ZV9mcmVlX2Z1bmNfZnJvbV90eXBlKHZhbHVlKTsKLQotICByZXR1cm4gImdfaGFzaF90YWJsZV9uZXdfZnVsbCAoIiArIGhhc2hfZnVuYyArICIsICIgKyBjbXBfZnVuYyArICIsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2ZyZWVfZnVuYyArICIsICIgKyB2YWx1ZV9mcmVlX2Z1bmMgKyAiKTsiOwotfQotCi1zdHJpbmcgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXdfYXJyYXlfZnJvbV90eXBlKHRfdHlwZSAqIHR0eXBlKSB7Ci0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBkZXRlcm1pbmUgYXJyYXkgdHlwZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdib29sZWFuKSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50OCkpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnaW50MTYpKTsiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDMyKSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gImdfYXJyYXlfbmV3ICgwLCAxLCBzaXplb2YgKGdpbnQ2NCkpOyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJnX2FycmF5X25ldyAoMCwgMSwgc2l6ZW9mIChnZG91YmxlKSk7IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gImdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19mcmVlKTsiOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBhcnJheSBpbmZvIGZvciB0eXBlIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiZ19hcnJheV9uZXcgKDAsIDEsIHNpemVvZiAoZ2ludDMyKSk7IjsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgZnJlZV9mdW5jID0gZ2VuZXJhdGVfZnJlZV9mdW5jX2Zyb21fdHlwZSh0dHlwZSk7Ci0gICAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKCIgKyBmcmVlX2Z1bmMgKyAiKTsiOwotICB9Ci0KLSAgcmV0dXJuICJnX3B0cl9hcnJheV9uZXcoKTsiOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFVUSUxJVFkgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVXBwZXIgY2FzZSBhIHN0cmluZy4gIFdyYXBzIGJvb3N0J3Mgc3RyaW5nIHV0aWxpdHkuCi0gKi8KLXN0cmluZyB0b191cHBlcl9jYXNlKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBzIChuYW1lKTsKLSAgc3RkOjp0cmFuc2Zvcm0gKHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCA6OnRvdXBwZXIpOwotICByZXR1cm4gczsKLS8vICByZXR1cm4gYm9vc3Q6OnRvX3VwcGVyX2NvcHkgKG5hbWUpOwotfQotCi0vKioKLSAqIExvd2VyIGNhc2UgYSBzdHJpbmcuICBXcmFwcyBib29zdCdzIHN0cmluZyB1dGlsaXR5LgotICovCi1zdHJpbmcgdG9fbG93ZXJfY2FzZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcyAobmFtZSk7Ci0gIHN0ZDo6dHJhbnNmb3JtIChzLmJlZ2luKCksIHMuZW5kKCksIHMuYmVnaW4oKSwgOjp0b2xvd2VyKTsKLSAgcmV0dXJuIHM7Ci0vLyAgcmV0dXJuIGJvb3N0Ojp0b19sb3dlcl9jb3B5IChuYW1lKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIHN0cmluZyBmcmllbmRseSB0byBDIGNvZGUgc3RhbmRhcmRzIGJ5IGxvd2VyY2FzaW5nIGFuZCBhZGRpbmcKLSAqIHVuZGVyc2NvcmVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIEZvciBleGFtcGxlOgotICoKLSAqIElucHV0OiAiWm9tZ0NhbWVsQ2FzZSIKLSAqIE91dHB1dDogInpvbWdfY2FtZWxfY2FzZSIKLSAqLwotc3RyaW5nIGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgcmV0OwotICBjb25zdCBjaGFyICp0bXAgPSBuYW1lLmNfc3RyKCk7Ci0gIGludCBwb3MgPSAwOwotCi0gIC8qIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXNuJ3QgdW5kZXJzY29yZWQgaWYgdXBwZXJjYXNlLCBqdXN0IGxvd2VyY2FzZWQgKi8KLSAgcmV0ICs9IHRvbG93ZXIgKHRtcFtwb3NdKTsKLSAgcG9zKys7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSBwb3M7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICBjaGFyIGxjID0gdG9sb3dlciAodG1wW2ldKTsgCi0gICAgaWYgKGxjICE9IHRtcFtpXSkgewotICAgICAgcmV0ICs9ICdfJzsKLSAgICB9Ci0gICAgcmV0ICs9IGxjOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogcmVnaXN0ZXIgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgbWFpbiBwcm9ncmFtICovCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGNfZ2xpYiwgIkMsIHVzaW5nIEdMaWIiLCAiIikKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY29jb2FfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTI2ZWUyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIE9iamVjdGl2ZS1DIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqIG1vc3RseSBjb3B5L3Bhc3RpbmcvdHdlYWtpbmcgZnJvbSBtY3NsZWUncyB3b3JrLgotICovCi1jbGFzcyB0X2NvY29hX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9jb2NvYV9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIAotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJsb2dfdW5leHBlY3RlZCIpOwotICAgIGxvZ191bmV4cGVjdGVkXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsgICAgCi0gICAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY29jb2EiOwotICB9Ci0KLSAgLyoqCi0gICAqIEluaXQgYW5kIGNsb3NlIG1ldGhvZHMKLSAgICovCi0KLSAgdm9pZCBpbml0X2dlbmVyYXRvcigpOwotICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICh0X3N0cnVjdCogICB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBkZWZ2YWw9ZmFsc2UsIGJvb2wgaXNfcHJvcGVydHk9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBjb250YWluZXJpemVfaXQ9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2wgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZSAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbiAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZT0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaXN0TmFtZSk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeCgpOwotICBzdGQ6OnN0cmluZyBjb2NvYV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIGNvY29hX3RocmlmdF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZj1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZm9ybWF0X3N0cmluZ19mb3JfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBjYWxsX2ZpZWxkX3NldHRlcih0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkTmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGNvbnRhaW5lcml6ZSh0X3R5cGUgKiB0dHlwZSwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjb250YWluZXJpemUodF9maWVsZCAqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHN0ZDo6c3RyaW5nIGNvY29hX3ByZWZpeF87Ci0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50c19kZWNsYXJhdGlvbnNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pbXBsXzsKLQotICBib29sIGxvZ191bmV4cGVjdGVkXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotICBjb2NvYV9wcmVmaXhfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNvY29hIik7Ci0KLSAgLy8gd2UgaGF2ZSBhIC5oIGhlYWRlciBmaWxlLi4uCi0gIHN0cmluZyBmX2hlYWRlcl9uYW1lID0gcHJvZ3JhbV9uYW1lXysiLmgiOwotICBzdHJpbmcgZl9oZWFkZXJfZnVsbG5hbWUgPSBnZXRfb3V0X2RpcigpK2ZfaGVhZGVyX25hbWU7Ci0gIGZfaGVhZGVyXy5vcGVuKGZfaGVhZGVyX2Z1bGxuYW1lLmNfc3RyKCkpOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgZW5kbDsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpOwotCi0gIC8vIC4uLmFuZCBhIC5tIGltcGxlbWVudGF0aW9uIGZpbGUKLSAgc3RyaW5nIGZfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyIubSI7Ci0gIGZfaW1wbF8ub3BlbihmX2ltcGxfbmFtZS5jX3N0cigpKTsKLQotICBmX2ltcGxfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBlbmRsOwotCi0gIGZfaW1wbF8gPDwKLSAgICBjb2NvYV9pbXBvcnRzKCkgPDwKLSAgICBjb2NvYV90aHJpZnRfaW1wb3J0cygpIDw8Ci0gICAgIiNpbXBvcnQgXCIiIDw8IGZfaGVhZGVyX25hbWUgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBDb2NvYSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgZm9yIENvY29hIGxpYnJhcmllcwotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+XG4iICsKLSAgICAiXG4iOwotfQotCi0vKioKLSAqIFByaW50cyB0aHJpZnQgcnVudGltZSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQgcnVudGltZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmNvY29hX3RocmlmdF9pbXBvcnRzKCkgewotICBzdHJpbmcgcmVzdWx0ID0gc3RyaW5nKCkgKwotICAgICIjaW1wb3J0IFwiVFByb3RvY29sLmhcIlxuIiArCi0gICAgIiNpbXBvcnQgXCJUQXBwbGljYXRpb25FeGNlcHRpb24uaFwiXG4iICsKLSAgICAiI2ltcG9ydCBcIlRQcm90b2NvbFV0aWwuaFwiXG4iICsKLSAgICAiI2ltcG9ydCBcIlRQcm9jZXNzb3IuaFwiXG4iICsKLSAgICAiI2ltcG9ydCBcIlRPYmplY3RpdmUtQy5oXCJcbiIgKwotICAgICJcbiI7Ci0KLSAgLy8gSW5jbHVkZSBvdGhlciBUaHJpZnQgaW5jbHVkZXMKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiI2ltcG9ydCBcIiIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICIuaFwiIiArICJcbiI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIEZpbmlzaCB1cCBnZW5lcmF0aW9uLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQotewotICAvLyBzdGljayBvdXIgY29uc3RhbnRzIGRlY2xhcmF0aW9ucyBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZmlsZQotICAvLyBzaW5jZSB0aGV5IHJlZmVyIHRvIHRoaW5ncyB3ZSBhcmUgZGVmaW5pbmcuCi0gIGZfaGVhZGVyXyA8PCBjb25zdGFudHNfZGVjbGFyYXRpb25zXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMganVzdCBhIHNpbXBsZSAxLWxpbmVyIGluIG9iamVjdGl2ZS1jCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICIgPDwgdHlwZV9uYW1lKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgY29jb2FfcHJlZml4XyA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIE9iamVjdGl2ZS1DLCB0aGlzIGlzCi0gKiBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgdGhyaWZ0IGRlZmluaXRpb24gaXRzZWxmLCB1c2luZyB0aGUKLSAqIGVudW0ga2V5d29yZCBpbiBPYmplY3RpdmUtQy4gIEZvciBuYW1lc3BhY2UgcHVycG9zZXMsIHRoZSBuYW1lIG9mCi0gKiB0aGUgZW51bSBwbHVzIGFuIHVuZGVyc2NvcmUgaXMgcHJlZml4ZWQgb250byBlYWNoIGVsZW1lbnQuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuICBQcmltaXRpdmUgdmFsdWVzCi0gKiBjb3VsZCBoYXZlIGJlZW4gcGxhY2VkIG91dHNpZGUgdGhpcyBjbGFzcywgYnV0IEkganVzdCBwdXQKLSAqIGV2ZXJ5dGhpbmcgaW4gZm9yIGNvbnNpc3RlbmN5LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gY29uc3RfaW50ZXJmYWNlOwotICBzdHJpbmcgY29uc3RhbnRzX2NsYXNzX25hbWUgPSBjb2NvYV9wcmVmaXhfICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMiOwotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGludGVyZmFjZSAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8ICIgOiBOU09iamVjdCAiOwotICBzY29wZV91cChjb25zdF9pbnRlcmZhY2UpOwotICBzY29wZV9kb3duKGNvbnN0X2ludGVyZmFjZSk7Ci0KLSAgLy8gZ2V0dGVyIG1ldGhvZCBmb3IgZWFjaCBjb25zdGFudCBkZWZpbmVkLgotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGNvbnN0X2ludGVyZmFjZSA8PAotICAgICAgIisgKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGNvbnN0X2ludGVyZmFjZSA8PCAiQGVuZCI7Ci0KLSAgLy8gdGhpcyBnZXRzIHNwaXQgaW50byB0aGUgaGVhZGVyIGZpbGUgaW4gOjpjbG9zZV9nZW5lcmF0b3IKLSAgY29uc3RhbnRzX2RlY2xhcmF0aW9uc18gPSBjb25zdF9pbnRlcmZhY2Uuc3RyKCk7Ci0KLSAgLy8gc3RhdGljIHZhcmlhYmxlcyBpbiB0aGUgLm0gaG9sZCBhbGwgY29uc3RhbnQgdmFsdWVzCi0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICJzdGF0aWMgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgbmFtZTsKLSAgICBpZiAoIXR5cGUtPmlzX2NvbnRhaW5lcigpICYmICF0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgZl9pbXBsXyA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZl9pbXBsXywgdHlwZSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGZfaW1wbF8gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbXBsXyA8PCBlbmRsOwotCi0gIGZfaW1wbF8gPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvbnN0YW50c19jbGFzc19uYW1lIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZSBjb21wbGV4IGNvbnN0YW50cyB3aGVuIHRoZSBjbGFzcyBpcyBsb2FkZWQKLSAgZl9pbXBsXyA8PCAiKyAodm9pZCkgaW5pdGlhbGl6ZSAiOwotICBzY29wZV91cChmX2ltcGxfKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmdldF90eXBlKCktPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfaW1wbF8sIAotICAgICAgICAgICBjb2NvYV9wcmVmaXhfKygqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpLAotICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgICAgZl9pbXBsXyA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihmX2ltcGxfKTsKLQotICAvLyBnZXR0ZXIgbWV0aG9kIGZvciBlYWNoIGNvbnN0YW50Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfaW1wbF8gPDwKLSAgICAgICIrICgiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKSAiIDw8IG5hbWU7Ci0gICAgc2NvcGVfdXAoZl9pbXBsXyk7Ci0gICAgaW5kZW50KGZfaW1wbF8pIDw8ICJyZXR1cm4gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX2ltcGxfKTsKLSAgfQotCi0gIGZfaW1wbF8gPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBwcm90ZWN0ZWQgZGF0YSBtZW1iZXJzLCByZWFkKCksIHdyaXRlKCksIGFuZCBnZXR0ZXJzIGFuZCBzZXR0ZXJzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gTlNFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHhjZXB0aW9uLCB0cnVlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgaW50ZXJmYWNlIGZvciBhIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJOU0V4Y2VwdGlvbiAiOwotICB9IGVsc2UgewotICAgIG91dCA8PCAiTlNPYmplY3QgIjsKLSAgfQotICBvdXQgPDwgIjxOU0NvZGluZz4gIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIG1lbWJlcnMgYXJlIHByb3RlY3RlZC4gIHRoaXMgaXMgcmVkdW5kYW50LCBidXQgZXhwbGljaXQuCi0gIC8vICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiQHByb3RlY3RlZDoiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgLy8gbWVtYmVyIHZhcmlhbGJlcwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyKSA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIC8vIGlzc2V0IGZpZWxkcwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJCT09MIF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldDsiIDw8ICBlbmRsOwotICAgIH0KLSAgfQotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gcHJvcGVydGllcwotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8ICIjaWYgVEFSR0VUX09TX0lQSE9ORSB8fCAoTUFDX09TX1hfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUpIiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX3Byb3BlcnR5KCptX2l0ZXIpIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBkZWZhdWx0IGluaXRpYWxpemVyCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQpIGluaXQ7IiA8PCBlbmRsOwotCi0gIC8vIGluaXRpYWxpemVyIGZvciBhbGwgZmllbGRzCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICAvLyByZWFkIGFuZCB3cml0ZQotICBvdXQgPDwgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgb3V0UHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCi0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9maWVsZF9hY2Nlc3Nvcl9kZWNsYXJhdGlvbnMob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotCi0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGUgc2lnbmF0dXJlIGZvciBpbml0aWFsaXplciBvZiBzdHJ1Y3Qgd2l0aCBhIHBhcmFtZXRlciBmb3IKLSAqIGVhY2ggZmllbGQuCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGluZGVudChvdXQpIDw8ICItIChpZCkgaW5pdFdpdGgiOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICkgewotICAgIGlmIChtX2l0ZXIgPT0gbWVtYmVycy5iZWdpbigpKSB7Ci0gICAgICBvdXQgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIjogKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PAotICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICsrbV9pdGVyOwotICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgb3V0IDw8ICIgIjsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBnZXR0ZXIgYW5kIHNldHRlciBkZWNsYXJhdGlvbnMgZm9yIGFsbCBmaWVsZHMsIHBsdXMgYW4KLSAqIElzU2V0IGdldHRlci4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2RlY2xhcmF0aW9ucyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgKHZvaWQpIGlzX2V4Y2VwdGlvbjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI2lmICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKCIgPDwgdHlwZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgIiA8PCBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwaXRhbGl6ZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiOiAoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJJc1NldDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGUgdGhlIGluaXRXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAotICogdGhlIE5TQ29kaW5nIHByb3RvY29sCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSAKLXsKLSAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0V2l0aENvZGVyOiAoTlNDb2RlciAqKSBkZWNvZGVyIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgLy8gTlNFeGNlcHRpb25zIGNvbmZvcm0gdG8gTlNDb2RpbmcsIHNvIHdlIGNhbiBjYWxsIHN1cGVyCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3N1cGVyIGluaXRXaXRoQ29kZXI6IGRlY29kZXJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICB9Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFtkZWNvZGVyIGNvbnRhaW5zVmFsdWVGb3JLZXk6IEBcIiI8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwiXCJdKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgCi0gICAgewotICAgICAgb3V0IDw8ICJbW2RlY29kZXIgZGVjb2RlT2JqZWN0Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHQtPmlzX2VudW0oKSkgCi0gICAgewotICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlICopIHQpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlQm9vbEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZUludEZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50Rm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJbZGVjb2RlciBkZWNvZGVJbnQzMkZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIG91dCA8PCAiW2RlY29kZXIgZGVjb2RlSW50NjRGb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOyAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIltkZWNvZGVyIGRlY29kZURvdWJsZUZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7ICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICAgIAotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogZG9uJ3Qga25vdyBob3cgdG8gZGVjb2RlIHRocmlmdCB0eXBlOiAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJfaXNzZXQgPSBZRVM7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSB0aGUgZW5jb2RlV2l0aENvZGVyIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3Qgc28gaXQncyBjb21wYXRpYmxlIHdpdGgKLSAqIHRoZSBOU0NvZGluZyBwcm90b2NvbAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgCi17Ci0gIGluZGVudChvdXQpIDw8ICItICh2b2lkKSBlbmNvZGVXaXRoQ29kZXI6IChOU0NvZGVyICopIGVuY29kZXIiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAvLyBOU0V4Y2VwdGlvbnMgY29uZm9ybSB0byBOU0NvZGluZywgc28gd2UgY2FuIGNhbGwgc3VwZXIKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBlbmNvZGVXaXRoQ29kZXI6IGVuY29kZXJdOyIgPDwgZW5kbDsKLSAgfQotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX18iPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Il9pc3NldCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICAvL291dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgCi0gICAgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVPYmplY3Q6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBlbHNlIGlmICh0LT5pc19lbnVtKCkpIAotICAgIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZWxzZSAKLSAgICB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSAqKSB0KS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUJvb2w6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVJbnQ6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDogX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZvcktleTogQFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW2VuY29kZXIgZW5jb2RlSW50MzI6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltlbmNvZGVyIGVuY29kZUludDY0OiBfXyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZm9yS2V5OiBAXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbZW5jb2RlciBlbmNvZGVEb3VibGU6IF9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBmb3JLZXk6IEBcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl07IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAgICAKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGRvbid0IGtub3cgaG93IHRvIGVuY29kZSB0aHJpZnQgdHlwZTogIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlIHN0cnVjdCBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiQGltcGxlbWVudGF0aW9uICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGVuZGwgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIGV4Y2VwdGlvbnMgbmVlZCB0byBjYWxsIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyIG9uIE5TRXhjZXB0aW9uCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKGlkKSBpbml0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gW3N1cGVyIGluaXRXaXRoTmFtZTogQFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiByZWFzb246IEBcInVua25vd25cIiB1c2VySW5mbzogbmlsXTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vIHN0cnVjdAotCi0gICAgLy8gZGVmYXVsdCBpbml0aWFsaXplcgotICAgIC8vIHNldHVwIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKGlkKSBpbml0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCAiI2lmIFRBUkdFVF9PU19JUEhPTkUgfHwgKE1BQ19PU19YX1ZFUlNJT05fTUFYX0FMTE9XRUQgPj0gTUFDX09TX1hfVkVSU0lPTl8xMF81KSIgPDwgZW5kbDsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAic2VsZi4iKygqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgZmFsc2UsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpbml0aWFsaXplciB3aXRoIGFsbCBmaWVsZHMgYXMgcGFyYW1zCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShvdXQsIHRzdHJ1Y3QpOwotICAgIG91dCA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZWxmID0gW3NlbGYgaW5pdF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX18iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIjsKLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICAgIG91dCA8PCAiWyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl9fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gc2VsZjsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBpbml0V2l0aENvZGVyIGZvciBOU0NvZGluZwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIC8vIGVuY29kZVdpdGhDb2RlciBmb3IgTlNDb2RpbmcKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7ICAKLQotICAvLyBkZWFsbG9jCi0gIGlmICghbWVtYmVycy5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiW19fIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltzdXBlciBkZWFsbG9jX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0KLQotICAvLyB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2Rlc2NyaXB0aW9uKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8ICJAZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgIi0gKHZvaWQpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzCi0gIGluZGVudChvdXQpIDw8ICJOU1N0cmluZyAqIGZpZWxkTmFtZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgZmllbGRUeXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImludCBmaWVsZElEOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIltpblByb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltpblByb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogJmZpZWxkTmFtZSB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6ICZmaWVsZElEXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInN3aXRjaCAoZmllbGRJRCkiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgKGZpZWxkVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgImZpZWxkVmFsdWUiKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgY2FsbF9maWVsZF9zZXR0ZXIoKmZfaXRlciwgImZpZWxkVmFsdWUiKSA8PCBlbmRsOwotICAgICAgICAvLyBpZiB0aGlzIGlzIGFuIGFsbG9jYXRlZCBmaWVsZCwgcmVsZWFzZSBpdCBzaW5jZSB0aGUgc3RydWN0Ci0gICAgICAgIC8vIGlzIG5vdyByZXRhaW5pbmcgaXQKLSAgICAgICAgaWYgKHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICAgIC8vIGRlc2VyaWFsaXplZCBzdHJpbmdzIGFyZSBhdXRvcmVsZWFzZSwgc28gZG9uJ3QgcmVsZWFzZSB0aGVtCi0gICAgICAgICAgaWYgKCEoZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJbZmllbGRWYWx1ZSByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbDsKLSAgICAgICAgaWYgKGxvZ191bmV4cGVjdGVkXykgewotICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogZmllbGQgSUQgJWkgaGFzIHVuZXhwZWN0ZWQgdHlwZSAlaS4gIFNraXBwaW5nLlwiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBmaWVsZElELCBmaWVsZFR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgICBpZiAobG9nX3VuZXhwZWN0ZWRfKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0xvZyhAXCIlczogdW5leHBlY3RlZCBmaWVsZCBJRCAlaSB3aXRoIHR5cGUgJWkuICBTa2lwcGluZy5cIiwgX19QUkVUVFlfRlVOQ1RJT05fXywgZmllbGRJRCwgZmllbGRUeXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGZpZWxkVHlwZSBvblByb3RvY29sOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgYnJlYWs7IiA8PCBlbmRsOwotCi0gICAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltpblByb3RvY29sIHJlYWRGaWVsZEVuZF07IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW2luUHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byB3cml0ZSBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IG5hbWUgPDwgIlwiXTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoX18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX2lzc2V0KSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgd2hpY2gKLSAqIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiBpZiB0aGV5IGFyZQotICogc2V0LCBhbmQgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgc2V0IGF0IGEgdGltZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItICh2b2lkKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogQFwiIiA8PCBuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICAiKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9pc3NldCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKF9fIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBuaWwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU6ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICIgZmllbGRJRDogIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfXyIrKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlRmllbGRFbmRdOyIgPDwgZW5kbDsKLQotICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkU3RvcF07IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZVN0cnVjdEVuZF07IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBwcm9wZXJ0eSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QuCi0gKiBnZXR0ZXIsIHNldHRlciwgaXNzZXQgZ2V0dGVyLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZmllbGRfYWNjZXNzb3JfaW1wbGVtZW50YXRpb25zKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZCkgaXNfZXhjZXB0aW9uOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGZpZWxkX25hbWU7Ci0gICAgY2FwX25hbWVbMF0gPSB0b3VwcGVyKGNhcF9uYW1lWzBdKTsKLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikgIjsKLSAgICBvdXQgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIFtbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZXRhaW5fc3R1Yl0gYXV0b3JlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBTaW1wbGUgc2V0dGVyCi0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHNldCIgPDwgY2FwX25hbWUgPDwgIjogKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8Ci0gICAgICAiKSAiIDw8IGZpZWxkX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICghdHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiIDw8IGZpZWxkX25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBmaWVsZF9uYW1lIDw8ICIgcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldCA9IFlFUzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gSXNTZXQKLSAgICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgIiA8PCBmaWVsZF9uYW1lIDw8ICJJc1NldCB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX18iIDw8IGZpZWxkX25hbWUgPDwgIl9pc3NldDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIgLSBkbyB3ZSBuZWVkIHRoaXM/Ci0gICAgaW5kZW50KG91dCkgPDwgIi0gKHZvaWQpIHVuc2V0IiA8PCBjYXBfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbX18iIDw8IGZpZWxkX25hbWUgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfXyIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmlsOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fIiA8PCBmaWVsZF9uYW1lIDw8ICJfaXNzZXQgPSBOTzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZGVzY3JpcHRpb24gbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICItIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiTlNNdXRhYmxlU3RyaW5nICogbXMgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IEBcIiIgPDwKLSAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoXCJdOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiXTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIsIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJbbXMgYXBwZW5kRm9ybWF0OiBAXCIiIDw8IGZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodHR5cGUpIDw8ICJcIiwgX18iIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJbbXMgYXBwZW5kU3RyaW5nOiBAXCIpXCJdOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IG1zXTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuICBJbiBPYmplY3RpdmUtQyB0aGlzIGNvbnNpc3RzIG9mIGEKLSAqIHByb3RvY29sIGRlZmluaXRpb24sIGEgY2xpZW50IGludGVyZmFjZSBhbmQgYSBjbGllbnQgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woZl9oZWFkZXJfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ludGVyZmFjZShmX2hlYWRlcl8sIHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKGZfaGVhZGVyXywgdHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihmX2ltcGxfLCB0c2VydmljZSk7Ci0gIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzZXJ2aWNlKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBzdHJ1Y3RzIGZvciBhbGwgdGhlIHNlcnZpY2UgcmV0dXJuIHR5cGVzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW50ZXJmYWNlKGZfaW1wbF8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ltcGxlbWVudGF0aW9uKGZfaW1wbF8sIHRzLCBmYWxzZSwgZmFsc2UpOyAgCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuIGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotICB9Ci19Ci0KLQotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBjcmVhdGUgYSByZXN1bHQgc3RydWN0IHdpdGggYSBzdWNjZXNzIGZpZWxkIG9mIHRoZSByZXR1cm4gdHlwZSwKLSAgLy8gYW5kIGEgZmllbGQgZm9yIGVhY2ggdHlwZSBvZiBleGNlcHRpb24gdGhyb3duCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0ZnVuY3Rpb24pKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIC8vIGdlbmVyYXRlIHRoZSByZXN1bHQgc3RydWN0Ci0gIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbnRlcmZhY2UoZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOyAgCi19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHByb3RvY29sIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIG91dCA8PCAiQHByb3RvY29sICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiIDxOU09iamVjdD4iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8ICItICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PAotICAgICAgIiAgLy8gdGhyb3dzICI7Ci0gICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSArICIsICI7Ci0gICAgfQotICAgIG91dCA8PCAiVEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgOiBOU09iamVjdCA8IiA8PAotICAgIGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIjsKLQotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7IiA8PCBlbmRsOwotICBvdXQgPDwgIi0gKGlkKSBpbml0V2l0aEluUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbDsiIDw8IGVuZGw7Ci0gIG91dCA8PCAiQGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgaW50ZXJmYWNlIGRlZmluaXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGUgVFByb2Nlc3MgaW1wbGVtZW50YXRpb24gZm9yIHRoZQotICogc2VydmljZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCA8VFByb2Nlc3Nvcj4gIjsKLSAgCi0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWQgPCIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCI+IG1TZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJOU0RpY3Rpb25hcnkgKiBtTWV0aG9kTWFwOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZDwiPDxjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlOyIgPDwgZW5kbDsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgb3V0IDw8ICJAaW1wbGVtZW50YXRpb24gIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQiIDw8IGVuZGw7Ci0KLSAgLy8gaW5pdGlhbGl6ZXJzCi0gIG91dCA8PCAiLSAoaWQpIGluaXRXaXRoUHJvdG9jb2w6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2wiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIFtzZWxmIGluaXRXaXRoSW5Qcm90b2NvbDogcHJvdG9jb2wgb3V0UHJvdG9jb2w6IHByb3RvY29sXTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGhJblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGFuSW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBhbk91dFByb3RvY29sIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImluUHJvdG9jb2wgPSBbYW5JblByb3RvY29sIHJldGFpbl9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0UHJvdG9jb2wgPSBbYW5PdXRQcm90b2NvbCByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICAvLyBkZWFsbG9jCi0gIG91dCA8PCAiLSAodm9pZCkgZGVhbGxvYyIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiW3N1cGVyIGRlYWxsb2Nfc3R1Yl07IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiLSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IEBcIiIgPDwgZnVubmFtZSA8PCAiXCIiIDw8Ci0gICAgICAiIHR5cGU6IFRNZXNzYWdlVHlwZV9DQUxMIiA8PAotICAgICAgIiBzZXF1ZW5jZUlEOiAwXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGFyZ3NuYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotCi0gICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBmaWVsZE5hbWUgPDwgIiAhPSBuaWwpIjsKLSAgICAgICAgc2NvcGVfdXAob3V0KTsKLSAgICAgIH0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZpZWxkTmFtZSA8PCAiXCIiCi0gICAgICAgICIgdHlwZTogIiA8PCB0eXBlX3RvX2VudW0oKCpmbGRfaXRlciktPmdldF90eXBlKCkpIDw8Ci0gICAgICAgICIgZmllbGRJRDogIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdOyIgPDwgZW5kbDsKLQotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZsZF9pdGVyLCBmaWVsZE5hbWUpOwotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlRmllbGRTdG9wXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiW291dFByb3RvY29sIHdyaXRlU3RydWN0RW5kXTsiIDw8IGVuZGw7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbb3V0UHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kXTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCkpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IE1lc3NhZ2UgdmFsaWRhdGlvbiBoZXJlLCB3YXMgdGhlIHNlcWlkIGV0YyBvaz8KLQotICAgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpbnQgbXNnVHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTogbmlsIHR5cGU6ICZtc2dUeXBlIHNlcXVlbmNlSUQ6IE5VTExdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZ1R5cGUgPT0gVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBAdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgIC8vIEZJWE1FIC0gY291bGQgb3B0aW1pemUgaGVyZSB0byByZWR1Y2UgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IG9iamVjdHMuCi0gICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgY29jb2FfcHJlZml4XyA8PCByZXN1bHRuYW1lIDw8ICIgKiByZXN1bHQgPSBbW1siIDw8IGNvY29hX3ByZWZpeF8gPDwKLSAgICAgICAgcmVzdWx0bmFtZSA8PCAiIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW3Jlc3VsdCByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoW3Jlc3VsdCBzdWNjZXNzSXNTZXRdKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFtyZXN1bHQgc3VjY2Vzc107IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoW3Jlc3VsdCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiSXNTZXRdKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgQHRocm93IFtyZXN1bHQgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIl07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiQHRocm93IFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9NSVNTSU5HX1JFU1VMVCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCJdOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIi0gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW3NlbGYgc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8ICIgIjsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwgIjogIiA8PCBmaWVsZE5hbWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZmllbGROYW1lIDw8ICI6ICIgPDwgZmllbGROYW1lOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwgIl07IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIG91dCA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIltzZWxmIHJlY3ZfIiA8PCBmdW5uYW1lIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGltcGxlbWVudGF0aW9uLiAgSW4gb3RoZXIgd29yZHMgdGhlIGFjdHVhbCBUUHJvY2Vzc29yIGltcGxlbWVudGF0aW9uCi0gKiBmb3IgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBvdXQgPDwgIkBpbXBsZW1lbnRhdGlvbiAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICAvLyBpbml0aWFsaXplcgotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItIChpZCkgaW5pdFdpdGgiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI6IChpZCA8IiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI+KSBzZXJ2aWNlIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInNlbGYgPSBbc3VwZXIgaW5pdF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghc2VsZikgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWw7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAibVNlcnZpY2UgPSBbc2VydmljZSByZXRhaW5fc3R1Yl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIm1NZXRob2RNYXAgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV0gcmV0YWluX3N0dWJdOyIgPDwgZW5kbDsKLSAgCi0gIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlNFTCBzID0gQHNlbGVjdG9yKHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6aW5Qcm90b2NvbDpvdXRQcm90b2NvbDopOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TTWV0aG9kU2lnbmF0dXJlICogc2lnID0gW3NlbGYgbWV0aG9kU2lnbmF0dXJlRm9yU2VsZWN0b3I6IHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIk5TSW52b2NhdGlvbiAqIGludm9jYXRpb24gPSBbTlNJbnZvY2F0aW9uIGludm9jYXRpb25XaXRoTWV0aG9kU2lnbmF0dXJlOiBzaWddOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltpbnZvY2F0aW9uIHNldFNlbGVjdG9yOiBzXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW52b2NhdGlvbiByZXRhaW5Bcmd1bWVudHNdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlttTWV0aG9kTWFwIHNldFZhbHVlOiBpbnZvY2F0aW9uIGZvcktleTogQFwiIiA8PCBmdW5uYW1lIDw8ICJcIl07IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBzZWxmOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICAKLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlICdzZXJ2aWNlJyBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgc2VydmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAvLyBwcm9jZXNzb3IKLSAgb3V0IDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiLSAoaWQ8Ijw8Y29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiPikgc2VydmljZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFtbbVNlcnZpY2UgcmV0YWluX3N0dWJdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAKLSAgLy8gaW1wbGVtZW50YXRpb24gb2YgdGhlIFRQcm9jZXNzIG1ldGhvZCwgd2hpY2ggZGlzcGF0Y2hlcyB0aGUgaW5jb21pbmcgY2FsbCB1c2luZyB0aGUgbWV0aG9kIG1hcAotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIGluUHJvdG9jb2wiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCIgPDxlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGludCBtZXNzYWdlVHlwZTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpbnQgc2VxSUQ7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6ICZtZXNzYWdlTmFtZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAmbWVzc2FnZVR5cGUiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogJnNlcUlEXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBOU0ludm9jYXRpb24gKiBpbnZvY2F0aW9uID0gW21NZXRob2RNYXAgdmFsdWVGb3JLZXk6IG1lc3NhZ2VOYW1lXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiAoaW52b2NhdGlvbiA9PSBuaWwpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBUVHlwZV9TVFJVQ1Qgb25Qcm90b2NvbDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gKiB4ID0gW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb25XaXRoVHlwZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1VOS05PV05fTUVUSE9EIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICclQCdcIiwgbWVzc2FnZU5hbWVdXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIFtvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBtZXNzYWdlTmFtZSIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9FWENFUFRJT04iIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbeCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgW291dFByb3RvY29sIHdyaXRlTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICBbW291dFByb3RvY29sIHRyYW5zcG9ydF0gZmx1c2hdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIFlFUzsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgLy8gTlNJbnZvY2F0aW9uIGRvZXMgbm90IGNvbmZvcm0gdG8gTlNDb3B5aW5nIHByb3RvY29sIiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgTlNJbnZvY2F0aW9uICogaSA9IFtOU0ludm9jYXRpb24gaW52b2NhdGlvbldpdGhNZXRob2RTaWduYXR1cmU6IFtpbnZvY2F0aW9uIG1ldGhvZFNpZ25hdHVyZV1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldFNlbGVjdG9yOiBbaW52b2NhdGlvbiBzZWxlY3Rvcl1dOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmc2VxSUQgYXRJbmRleDogMl07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0QXJndW1lbnQ6ICZpblByb3RvY29sIGF0SW5kZXg6IDNdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIFtpIHNldEFyZ3VtZW50OiAmb3V0UHJvdG9jb2wgYXRJbmRleDogNF07IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgW2kgc2V0VGFyZ2V0OiBzZWxmXTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiICBbaSBpbnZva2VdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBZRVM7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICAvLyBnZW5lcmF0ZSBhIHByb2Nlc3NfWFhYWCBtZXRob2QgZm9yIGVhY2ggc2VydmljZSBmdW5jdGlvbiwgd2hpY2ggcmVhZHMgYXJncywgY2FsbHMgdGhlIHNlcnZpY2UsIGFuZCB3cml0ZXMgcmVzdWx0cwotICBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKHZvaWQpIHByb2Nlc3NfIiA8PCBmdW5uYW1lIDw8ICJfd2l0aFNlcXVlbmNlSUQ6IChpbnQzMl90KSBzZXFJRCBpblByb3RvY29sOiAoaWQ8VFByb3RvY29sPikgaW5Qcm90b2NvbCBvdXRQcm90b2NvbDogKGlkPFRQcm90b2NvbD4pIG91dFByb3RvY29sIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgc3RyaW5nIGFyZ3N0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX2FyZ3NfaGVscGVyX3N0cnVjdF90eXBlKCpmX2l0ZXIpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhcmdzdHlwZSA8PCAiICogYXJncyA9IFtbIiA8PCBhcmdzdHlwZSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbYXJncyByZWFkOiBpblByb3RvY29sXTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJbaW5Qcm90b2NvbCByZWFkTWVzc2FnZUVuZF07IiA8PCBlbmRsOwotICAgIAotICAgIHN0cmluZyByZXN1bHR0eXBlID0gY29jb2FfcHJlZml4XyArIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUoKmZfaXRlcik7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHJlc3VsdHR5cGUgPDwgIiAqIHJlc3VsdCA9IFtbIiA8PCByZXN1bHR0eXBlIDw8ICIgYWxsb2NdIGluaXRdOyIgPDwgZW5kbDsKLQotICAgIC8vIG1ha2UgdGhlIGNhbGwgdG8gdGhlIGFjdHVhbCBzZXJ2aWNlIG9iamVjdAotICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIltyZXN1bHQgc2V0U3VjY2VzczogIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJbbVNlcnZpY2UgIiA8PCBmdW5uYW1lOwotICAgIC8vIHN1cHBseWluZyBhcmd1bWVudHMKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGROYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiICIgPDwgZmllbGROYW1lIDw8ICI6IFthcmdzICIgPDwgZmllbGROYW1lIDw8ICJdIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICJdIjsKLSAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICBvdXQgPDwgIl0iOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgCi0gICAgLy8gd3JpdGUgb3V0IHRoZSByZXN1bHQKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiBAXCIiIDw8IGZ1bm5hbWUgPDwgIlwiIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFRNZXNzYWdlVHlwZV9SRVBMWSIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiBzZXFJRF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCB3cml0ZTogb3V0UHJvdG9jb2xdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltvdXRQcm90b2NvbCB3cml0ZU1lc3NhZ2VFbmRdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltbb3V0UHJvdG9jb2wgdHJhbnNwb3J0XSBmbHVzaF07IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW3Jlc3VsdCByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIlthcmdzIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIAotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICAKLSAgLy8gZGVhbGxvYwotICBvdXQgPDwgZW5kbDsKLSAgb3V0IDw8ICItICh2b2lkKSBkZWFsbG9jIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIlttU2VydmljZSByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbbU1ldGhvZE1hcCByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJbc3VwZXIgZGVhbGxvY19zdHViXTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgIkBlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gZmllbGROYW1lIFRoZSB2YXJpYWJsZSBuYW1lIGZvciB0aGlzIGZpZWxkCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkTmFtZSA8PCAiID0gW2luUHJvdG9jb2wgIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5XTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZ107IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbF07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGVdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNl07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjRdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZV07IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIE9iamVjdGl2ZS1DIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyXTsiOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgYWxsb2NhdGVzIHRoZSBzdHJ1Y3QgYW5kIGludm9rZXMgcmVhZDoKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZmllbGROYW1lIDw8ICIgPSBbWyIgPDwKLSAgICB0eXBlX25hbWUodHN0cnVjdCwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdF07IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgZmllbGROYW1lIDw8ICIgcmVhZDogaW5Qcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8ICJbaW5Qcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiBOVUxMIHZhbHVlVHlwZTogTlVMTCBzaXplOiAmIiA8PAotICAgICAgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIk5TTXV0YWJsZURpY3Rpb25hcnkgKiAiIDw8IGZpZWxkTmFtZSA8PAotICAgICAgIiA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiBOVUxMIHNpemU6ICYiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJOU011dGFibGVTZXQgKiAiIDw8IGZpZWxkTmFtZSA8PAotICAgICAgIiA9IFtbTlNNdXRhYmxlU2V0IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiAiIDw8IHNpemUgPDwgIl07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgIltpblByb3RvY29sIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogTlVMTCBzaXplOiAmIiA8PCBzaXplIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNNdXRhYmxlQXJyYXkgKiAiIDw8IGZpZWxkTmFtZSA8PAotICAgICAgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6ICIgPDwgc2l6ZSA8PCAiXTsiIDw8IGVuZGw7Ci0gIH0KLSAgLy8gRklYTUUgLSB0aGUgY29kZSBhYm92ZSBkb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBvZgotICAvLyB0aGUgY29udGFpbmVycyBiZWluZyByZWFkIG1hdGNoIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZQotICAvLyBjb250YWluZXJzIHdlIGFyZSByZWFkaW5nIGludG8uICBEb2VzIHRoYXQgbWF0dGVyPwotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJpbnQgIiA8PCBpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpIDw8ICIgPSAwOyAiIDw8Ci0gICAgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBmaWVsZE5hbWUpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGZpZWxkTmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgZmllbGROYW1lKTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiW2luUHJvdG9jb2wgcmVhZE1hcEVuZF07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkU2V0RW5kXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJbaW5Qcm90b2NvbCByZWFkTGlzdEVuZF07IiA8PCBlbmRsOwotICB9Ci0KLX0KLQotCi0vKioKLSAqIFRha2UgYSB2YXJpYWJsZSBvZiBhIGdpdmVuIHR5cGUgYW5kIHdyYXAgaXQgaW4gY29kZSB0byBtYWtlIGl0Ci0gKiBzdWl0YWJsZSBmb3IgcHV0dGluZyBpbnRvIGEgY29udGFpbmVyLCBpZiBuZWNlc3NhcnkuICBCYXNpY2FsbHksCi0gKiB3cmFwIHNjYWxlciBwcmltaXRpdmVzIGluIE5TTnVtYmVyIG9iamVjdHMuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y29udGFpbmVyaXplKHRfdHlwZSAqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkKLXsKLSAgLy8gRklYTUUgLSBvcHRpbWl6ZSBoZXJlIHRvIGF2b2lkIGF1dG9yZWxlYXNlIHBvb2w/Ci0gIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0gIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJbTlNOdW1iZXIgbnVtYmVyV2l0aEludDogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiY2FuJ3QgY29udGFpbmVyaXplIHZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhCb29sOiAiICsgZmllbGROYW1lICsgIl0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhVbnNpZ25lZENoYXI6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoU2hvcnQ6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIltOU051bWJlciBudW1iZXJXaXRoTG9uZzogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhMb25nTG9uZzogIiArIGZpZWxkTmFtZSArICJdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiW05TTnVtYmVyIG51bWJlcldpdGhEb3VibGU6ICIgKyBmaWVsZE5hbWUgKyAiXSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIGRvIG5vdGhpbmcKLSAgcmV0dXJuIGZpZWxkTmFtZTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwIGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7Ci0gIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKLSAgdF90eXBlKiBrZXlUeXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7Ci0gIHRfdHlwZSogdmFsVHlwZSA9IHRtYXAtPmdldF92YWxfdHlwZSgpOwotICB0X2ZpZWxkIGZrZXkoa2V5VHlwZSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHZhbFR5cGUsIHZhbCk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwga2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBzZXRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHZhbFR5cGUsIHZhbCkgPDwKLSAgICAiIGZvcktleTogIiA8PCBjb250YWluZXJpemUoa2V5VHlwZSwga2V5KSA8PCAiXTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHR5cGVfY2FuX2JlX251bGwoa2V5VHlwZSkpIHsKLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKGtleVR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUoa2V5VHlwZSwga2V5KSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHZhbFR5cGUpKSB7Ci0gICAgaWYgKCEoZ2V0X3RydWVfdHlwZSh2YWxUeXBlKS0+aXNfc3RyaW5nKCkpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgY29udGFpbmVyaXplKHZhbFR5cGUsIHZhbCkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X3R5cGUqIHR5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7Ci0gIHRfZmllbGQgZmVsZW0odHlwZSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIGFkZE9iamVjdDogIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgLy8gZGVzZXJpYWxpemVkIHN0cmluZ3MgYXJlIGF1dG9yZWxlYXNlLCBzbyBkb24ndCByZWxlYXNlIHRoZW0KLSAgICBpZiAoIShnZXRfdHJ1ZV90eXBlKHR5cGUpLT5pc19zdHJpbmcoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBjb250YWluZXJpemUodHlwZSwgZWxlbSkgPDwgIiByZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X3R5cGUqIHR5cGUgPSB0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpOwotICB0X2ZpZWxkIGZlbGVtKHR5cGUsIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJbIiA8PCBmaWVsZE5hbWUgPDwgIiBhZGRPYmplY3Q6ICIgPDwgY29udGFpbmVyaXplKHR5cGUsIGVsZW0pIDw8ICJdOyIgPDwgZW5kbDsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgIGlmICghKGdldF90cnVlX3R5cGUodHlwZSktPmlzX3N0cmluZygpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IGNvbnRhaW5lcml6ZSh0eXBlLCBlbGVtKSA8PCAiIHJlbGVhc2Vfc3R1Yl07IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogU2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIHRvIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBmaWVsZAotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBmaWVsZE5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5OiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmc6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sOiAiIDw8IGZpZWxkTmFtZSA8PCAiXTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJ5dGU6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTY6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzI6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJNjQ6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGU6ICIgPDwgZmllbGROYW1lIDw8ICJdOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMjogIiA8PCBmaWVsZE5hbWUgPDwgIl07IjsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gZmllbGROYW1lIE5hbWUgb2YgdmFyaWFibGUgaG9sZGluZyBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIlsiIDw8IGZpZWxkTmFtZSA8PCAiIHdyaXRlOiBvdXRQcm90b2NvbF07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgd3JpdGluZyBpdHMgc2l6ZSB0aGVuIHRoZSBlbGVtZW50cy4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgotICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIltvdXRQcm90b2NvbCB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiIHZhbHVlVHlwZTogIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIgc2l6ZTogWyIgPDwKLSAgICAgIGZpZWxkTmFtZSA8PCAiIGNvdW50XV07IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6ICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiBzaXplOiBbIiA8PAotICAgICAgZmllbGROYW1lIDw8ICIgY291bnRdXTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiW291dFByb3RvY29sIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiIHNpemU6IFsiIDw8Ci0gICAgICBmaWVsZE5hbWUgPDwgIiBjb3VudF1dOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBzdHJpbmcga2V5OwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAga2V5ID0gdG1wKCJrZXkiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiTlNFbnVtZXJhdG9yICogIiA8PCBpdGVyIDw8ICIgPSBbIiA8PCBmaWVsZE5hbWUgPDwgIiBrZXlFbnVtZXJhdG9yXTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImlkICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoKCIgPDwga2V5IDw8ICIgPSBbIiA8PCBpdGVyIDw8ICIgbmV4dE9iamVjdF0pKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBrZXkgPSB0bXAoIm9iaiIpOwotICAgIGluZGVudChvdXQpIDw8ICJOU0VudW1lcmF0b3IgKiAiIDw8IGl0ZXIgPDwgIiA9IFsiIDw8IGZpZWxkTmFtZSA8PCAiIG9iamVjdEVudW1lcmF0b3JdOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWQgIiA8PCBrZXkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIndoaWxlICgoIiA8PCBrZXkgPDwgIiA9IFsiIDw8IGl0ZXIgPDwgIiBuZXh0T2JqZWN0XSkpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBrZXkgPSB0bXAoImkiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW50ICIgPDwga2V5IDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICgiIDw8IGtleSA8PCAiID0gMDsgIiA8PCBrZXkgPDwgIiA8IFsiIDw8IGZpZWxkTmFtZSA8PCAiIGNvdW50XTsgIiA8PCBrZXkgPDwgIisrKSIgPDwgZW5kbDsKLSAgfQotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtleSwgZmllbGROYW1lKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwga2V5KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwga2V5LCBmaWVsZE5hbWUpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJbb3V0UHJvdG9jb2wgd3JpdGVNYXBFbmRdOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIltvdXRQcm90b2NvbCB3cml0ZVNldEVuZF07IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIltvdXRQcm90b2NvbCB3cml0ZUxpc3RFbmRdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIEdpdmVuIGEgZmllbGQgdmFyaWFibGUgbmFtZSwgd3JhcCBpdCBpbiBjb2RlIHRoYXQgY29udmVydHMgaXQgdG8gYQotICogcHJpbWl0aXZlIHR5cGUsIGlmIG5lY2Vzc2FyeS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpkZWNvbnRhaW5lcml6ZSh0X2ZpZWxkICogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKQotewotICB0X3R5cGUgKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBpbnRWYWx1ZV0iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjYW4ndCBkZWNvbnRhaW5lcml6ZSB2b2lkIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBib29sVmFsdWVdIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiB1bnNpZ25lZENoYXJWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgc2hvcnRWYWx1ZV0iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJbIiArIGZpZWxkTmFtZSArICIgbG9uZ1ZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBsb25nTG9uZ1ZhbHVlXSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlsiICsgZmllbGROYW1lICsgIiBkb3VibGVWYWx1ZV0iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBkbyBub3RoaW5nCi0gIHJldHVybiBmaWVsZE5hbWU7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXBOYW1lKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCBkZWNvbnRhaW5lcml6ZSgma2ZpZWxkLCBrZXkpKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICJbIiArIG1hcE5hbWUgKyAiIG9iamVjdEZvcktleTogIiArIGtleSArICJdIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsIGRlY29udGFpbmVyaXplKCZ2ZmllbGQsIHZmaWVsZC5nZXRfbmFtZSgpKSk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbWVudE5hbWUpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmZWZpZWxkLCBlbGVtZW50TmFtZSkpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGxpc3ROYW1lKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksICJbIiArIGxpc3ROYW1lICsgIiBvYmplY3RBdEluZGV4OiAiICsgaW5kZXggKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBkZWNvbnRhaW5lcml6ZSgmZWZpZWxkLCBlZmllbGQuZ2V0X25hbWUoKSkpOwotfQotCi0KLS8qKgotICogUmV0dXJucyBhbiBPYmplY3RpdmUtQyBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY2xhc3NfcmVmIERvIHdlIHdhbnQgYSBDbGFzcyByZWZlcmVuY2UgaXN0ZWFkIG9mIGEgdHlwZSByZWZlcmVuY2U/Ci0gKiBAcmV0dXJuIEphdmEgdHlwZSBuYW1lLCBpLmUuIEhhc2hNYXA8S2V5LFZhbHVlPgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGNsYXNzX3JlZikgewotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBjb2NvYV9wcmVmaXhfICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgcmVzdWx0OwotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludCI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmVzdWx0ID0gIk5TTXV0YWJsZURpY3Rpb25hcnkiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJlc3VsdCA9ICJOU011dGFibGVTZXQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXN1bHQgPSAiTlNNdXRhYmxlQXJyYXkiOwotICB9IGVsc2UgewotICAgIC8vIENoZWNrIGZvciBwcmVmaXgKLSAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgICBpZiAocHJvZ3JhbSAhPSBOVUxMKSB7Ci0gICAgICByZXN1bHQgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjb2NvYSIpICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIGlmICghY2xhc3NfcmVmKSB7Ci0gICAgcmVzdWx0ICs9ICIgKiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBPYmplY3RpdmUtQyB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgotICoKLSAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIk5TRGF0YSAqIjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJOU1N0cmluZyAqIjsKLSAgICB9Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJPT0wiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuICJ1aW50OF90IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuImludDE2X3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gImludDMyX3QiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4iaW50NjRfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZG91YmxlIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIG9iamVjdGl2ZS1jIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgfQotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBkZWZ2YWwsIGJvb2wgaXNfcHJvcGVydHkpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaW5kZW50KG91dCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGlmIChkZWZ2YWwpCi0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgICBpZiAoZGVmdmFsIHx8IGlzX3Byb3BlcnR5KQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1siIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIGFsbG9jXSBpbml0XTsiIDw8IGVuZGw7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgc2V0IiA8PCBjYXBfbmFtZSA8PCAiOiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8ICJOU011dGFibGVEaWN0aW9uYXJ5ICoiOwotICAgIGlmIChkZWZ2YWwgfHwgaXNfcHJvcGVydHkpCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkgPDwgIl0gYXV0b3JlbGVhc2Vfc3R1Yl07ICIgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OiIgPDwgdmFsLnNpemUoKSA8PCAiXTsgIiA8PCBlbmRsOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QsIHRydWUpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCwgdHJ1ZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiWyIgPDwgbmFtZSA8PCAiIHNldE9iamVjdDoiIDw8IHZhbCA8PCAiIGZvcktleToiIDw8IGtleSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKGRlZnZhbCkKLSAgICAgIG91dCA8PCAiTlNNdXRhYmxlQXJyYXkgKiI7Ci0gICAgaWYgKGRlZnZhbCB8fCBpc19wcm9wZXJ0eSkKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eToiIDw8IHZhbC5zaXplKCkgPDwiXSBhdXRvcmVsZWFzZV9zdHViXTsiIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8Il07IiA8PCBlbmRsOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZXR5cGUsICp2X2l0ZXIsIHRydWUpOwotICAgICAgaW5kZW50KG91dCkgPDwgIlsiIDw8IG5hbWUgPDwgIiBhZGRPYmplY3Q6IiA8PCB2YWwgPDwgIl07IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBpZiAoZGVmdmFsKQotICAgICAgb3V0IDw8ICJOU011dGFibGVTZXQgKiI7Ci0gICAgaWYgKGRlZnZhbCB8fCBpc19wcm9wZXJ0eSkKLSAgICAgIG91dCA8PCBuYW1lIDw8ICIgPSBbW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8ICJdIGF1dG9yZWxlYXNlX3N0dWJdOyIgPDwgZW5kbDsKLSAgICBlbHNlCi0gICAgICBvdXQgPDwgbmFtZSA8PCAiID0gW1tOU011dGFibGVTZXQgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6IiA8PCB2YWwuc2l6ZSgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCBuYW1lIDw8ICIgYWRkT2JqZWN0OiIgPDwgdmFsIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgY29udGFpbmVyaXplX2l0KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAvLyBXZSBtdXN0IGhhbmRsZSBiaW5hcnkgY29uc3RhbnQgYnV0IHRoZSBzeW50YXggb2YgSURMIGRlZmluZXMgCi0gICAgICAvLyBub3RoaW5nIGFib3V0IGJpbmFyeSBjb25zdGFudC4KLSAgICAgIC8vICAgaWYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKQotICAgICAgLy8gICAgICAvLyBiaW5hcnkgY29kZQotICAgICAgcmVuZGVyIDw8ICJAXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmVuZGVyIDw8ICgodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwKSA/ICJZRVMiIDogIk5PIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIGZhbHNlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIGlmIChjb250YWluZXJpemVfaXQpIHsKLSAgICByZXR1cm4gY29udGFpbmVyaXplKHR5cGUsIHJlbmRlci5zdHIoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotI2lmIDAKLS8qKgotT1JJR0lOQUwKLSAqIFNwaXQgb3V0IGNvZGUgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNwZWNpZmllZCBjb25zdGFudCB2YWx1ZS4KLSAqLwotc3RyaW5nIHRfY29jb2FfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUoc3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbmVyaXplX2l0KSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gIllFUyIgOiAiTk8iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgaWYgKHZhbC5zaXplKCkgPiAwKQotICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKLSAgICBlbHNlCi0gICAgICByZW5kZXIgPDwgIltbIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSkgPDwgIiBhbGxvY10gaW5pdCI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIC8vIEZJWE1FIFRoZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGluaXRXaXRoWFhYIAotICAgICAgLy8gICAgICAgaW5pdGlhbGl6ZXIgYW5kIGNhdXNlcyBjb21waWxlIGVycm9yLgotICAgICAgLy8gICAgICAgVHJ5OiB0ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBhbmQgdGVzdC9TbWFsbFRlc3QudGhyaWZ0Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgcmVuZGVyIDw8IGNhcGl0YWxpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiICIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8ICI6ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgcmVuZGVyIDw8ICJdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJlbmRlciA8PCAiW1tOU0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0c0FuZEtleXM6ICI7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QsIHRydWUpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHRydWUpOwotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHJlbmRlciA8PCB2YWwgPDwgIiwgIiA8PCBrZXk7Ci0gICAgfQotICAgIGlmIChmaXJzdCkKLSAgICAgIHJlbmRlciA8PCAiIG5pbF0iOwotICAgIGVsc2UKLSAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZW5kZXIgPDwgIltbTlNBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiAiOwotICAgIHRfdHlwZSAqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCAiLCAiOwotICAgICAgfQotICAgICAgcmVuZGVyIDw8IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBldHlwZSwgKnZfaXRlciwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChmaXJzdCkKLSAgICAgIHJlbmRlciA8PCAiIG5pbF0iOwotICAgIGVsc2UKLSAgICAgIHJlbmRlciA8PCAiLCBuaWxdIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJlbmRlciA8PCAiW1tOU1NldCBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiAiOwotICAgIHRfdHlwZSAqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVuZGVyIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICByZW5kZXIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG5hbWUsIGV0eXBlLCAqdl9pdGVyLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKGZpcnN0KQotICAgICAgcmVuZGVyIDw8ICIgbmlsXSI7Ci0gICAgZWxzZQotICAgICAgcmVuZGVyIDw8ICIsIG5pbF0iOwotICB9IGVsc2UgewotICAgIHRocm93ICJkb24ndCBrbm93IGhvdyB0byByZW5kZXIgY29uc3RhbnQgZm9yIHR5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKGNvbnRhaW5lcml6ZV9pdCkgewotICAgIHJldHVybiBjb250YWluZXJpemUodHlwZSwgcmVuZGVyLnN0cigpKTsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0jZW5kaWYKLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkKSB7Ci0gIHJldHVybiB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgX18iICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIjsiOwotfQotCi0vKioKLSAqIERlY2xhcmVzIGFuIE9iamVjdGl2ZS1DIDIuMCBwcm9wZXJ0eS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBkZWNsYXJlIGEgcHJvcGVydHkgZm9yCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLSAgcmVuZGVyIDw8ICJAcHJvcGVydHkgKG5vbmF0b21pYywgIjsKLQotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKQotICAgIHJlbmRlciA8PCAicmV0YWluLCAiOwotICAKLSAgcmVuZGVyIDw8ICJnZXR0ZXI9IiA8PCBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSA8PAotICAgICIsIHNldHRlcj1zZXQiIDw8IGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI6KSAiIDw8Ci0gICAgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyI7Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiKSAiICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHR5cGVzIGFuZCBuYW1lcywgc3VpdGFibGUgZm9yIGFuCi0gKiBvYmplY3RpdmUtYyBwYXJhbWV0ZXIgbGlzdAotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGFyZ1ByZWZpeCA9ICIiOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgYXJnUHJlZml4ID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgcmVzdWx0ICs9ICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IGFyZ1ByZWZpeCArICI6ICgiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiKSAiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBPYmplY3RpdmUtQyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKi8KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGVfU1RSSU5HIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlX0JPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGVfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlX0kzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlX0RPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGVfSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZV9TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGVfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIGEgZm9ybWF0IHN0cmluZyBzcGVjaWZpZXIgZm9yIHRoZSBzdXBwbGllZCBwYXJzZSB0eXBlLgotICovCi1zdHJpbmcgdF9jb2NvYV9nZW5lcmF0b3I6OmZvcm1hdF9zdHJpbmdfZm9yX3R5cGUodF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJcXFwiJUBcXFwiIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIiVpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiJWhpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiJWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICIlcWkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIlZiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiJWkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIiVAIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiJUAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIlQCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGZvcm1hdF9zdHJpbmdfZm9yX3R5cGU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY2FsbCB0byBhIGZpZWxkJ3Mgc2V0dGVyLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgRmllbGQgdGhlIHNldHRlciBpcyBiZWluZyBjYWxsZWQgb24KLSAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSB0byBwYXNzIHRvIHNldHRlcgotICovCi0KLXN0cmluZyB0X2NvY29hX2dlbmVyYXRvcjo6Y2FsbF9maWVsZF9zZXR0ZXIodF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7Ci0gIHJldHVybiAiW3NlbGYgc2V0IiArIGNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKSArICI6ICIgKyBmaWVsZE5hbWUgKyAiXTsiOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY29jb2EsICJDb2NvYSIsCi0iICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgotKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk2MGJmLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidF9vb3BfZ2VuZXJhdG9yLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogQysrIGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGlzIGxlZ2l0aW1hY3kgaW5jYXJuYXRlLgotICoKLSAqLwotY2xhc3MgdF9jcHBfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X2NwcF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInB1cmVfZW51bXMiKTsKLSAgICBnZW5fcHVyZV9lbnVtc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZGVuc2UiKTsKLSAgICBnZW5fZGVuc2VfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImluY2x1ZGVfcHJlZml4Iik7Ci0gICAgdXNlX2luY2x1ZGVfcHJlZml4XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJjb2Jfc3R5bGUiKTsKLSAgICBnZW5fY29iX3N0eWxlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub19jbGllbnRfY29tcGxldGlvbiIpOwotICAgIGdlbl9ub19jbGllbnRfY29tcGxldGlvbl8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgidGVtcGxhdGVzIik7Ci0gICAgZ2VuX3RlbXBsYXRlc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBnZW5fdGVtcGxhdGVzX29ubHlfID0KLSAgICAgIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpICYmIGl0ZXItPnNlY29uZCA9PSAib25seSIpOwotCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tY3BwIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgICBnZW5lcmF0ZV9jcHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgICBnZW5lcmF0ZV9jcHBfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIH0KLSAgdm9pZCBnZW5lcmF0ZV9jcHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbiAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb249ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnM9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVhZD10cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlPXRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZGVmaW5pdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3JlYWRlciAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnM9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlciAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycz1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3N3YXAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UsIHN0cmluZyBzdHlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSAodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX251bGwgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX211bHRpZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsIGJvb2wgc3BlY2lhbGl6ZWQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfc2tlbGV0b24gKHRfc2VydmljZSogdHNlcnZpY2UpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4KTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsICAgICAgICAgICAgKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYXJnX3ByZWZpeCk7Ci0gIC8qCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9wcmVmaXgoc3RkOjpzdHJpbmcgbnMpOwotICBzdGQ6OnN0cmluZyBuYW1lc3BhY2Vfb3BlbihzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9jbG9zZShzdGQ6OnN0cmluZyBucyk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX3R5cGVkZWY9ZmFsc2UsIGJvb2wgYXJnPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgcG9pbnRlcj1mYWxzZSwgYm9vbCBjb25zdGFudD1mYWxzZSwgYm9vbCByZWZlcmVuY2U9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBzdHlsZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiLCBib29sIG5hbWVfcGFyYW1zPXRydWUpOwotICBzdGQ6OnN0cmluZyBjb2JfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiLCBib29sIG5hbWVfcGFyYW1zPXRydWUpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIG5hbWVfcGFyYW1zPXRydWUsIGJvb2wgc3RhcnRfY29tbWE9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGxvY2FsX3JlZmxlY3Rpb25fbmFtZShjb25zdCBjaGFyKiwgdF90eXBlKiB0dHlwZSwgYm9vbCBleHRlcm5hbD1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKTsKLQotICAvLyBUaGVzZSBoYW5kbGVzIGNoZWNraW5nIGdlbl9kZW5zZV8gYW5kIGNoZWNraW5nIGZvciBkdXBsaWNhdGVzLgotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBib29sIGlzX2RlZmluaXRpb24pOwotICB2b2lkIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOwotCi0gIGJvb2wgaXNfY29tcGxleF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKLSAgfQotCi0gIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgewotICAgIHVzZV9pbmNsdWRlX3ByZWZpeF8gPSB1c2VfaW5jbHVkZV9wcmVmaXg7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbmNsdWRlIHByZWZpeCB0byB1c2UgZm9yIGEgZmlsZSBnZW5lcmF0ZWQgYnkgcHJvZ3JhbSwgb3IgdGhlCi0gICAqIGVtcHR5IHN0cmluZyBpZiBubyBpbmNsdWRlIHByZWZpeCBzaG91bGQgYmUgdXNlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0OwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBwdXJlIGVudW1zIGZvciBUaHJpZnQgZW51bXMsIGluc3RlYWQgb2Ygd3JhcHBlciBjbGFzc2VzLgotICAgKi8KLSAgYm9vbCBnZW5fcHVyZV9lbnVtc187Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGxvY2FsIHJlZmxlY3Rpb24gbWV0YWRhdGEgZm9yIFREZW5zZVByb3RvY29sLgotICAgKi8KLSAgYm9vbCBnZW5fZGVuc2VfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvY2VzcyBmdW5jdGlvbiBwb2ludGVycyBmb3Igb25seSB0ZW1wbGF0aXplZAotICAgKiByZWFkZXIvd3JpdGVyIG1ldGhvZHMuCi0gICAqLwotICBib29sIGdlbl90ZW1wbGF0ZXNfb25seV87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKLSAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCi0gICAqLwotICBib29sIHVzZV9pbmNsdWRlX3ByZWZpeF87Ci0KLSAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlICJDb250aW51YXRpb24gT0JqZWN0Ii1zdHlsZSBjbGFzc2VzIGFzIHdlbGwuCi0gICAqLwotICBib29sIGdlbl9jb2Jfc3R5bGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBvbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy4KLSAgICovCi0gIGJvb2wgZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXzsKLQotICAvKioKLSAgICogU3RyaW5ncyBmb3IgbmFtZXNwYWNlLCBjb21wdXRlZCBvbmNlIHVwIGZyb250IHRoZW4gdXNlZCBkaXJlY3RseQotICAgKi8KLQotICBzdGQ6OnN0cmluZyBuc19vcGVuXzsKLSAgc3RkOjpzdHJpbmcgbnNfY2xvc2VfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5Ci0gICAqIGZ1bmN0aW9uLgotICAgKi8KLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaW1wbF87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc190Y2NfOwotICBzdGQ6Om9mc3RyZWFtIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV90Y2NfOwotCi0gIC8qKgotICAgKiBXaGVuIGdlbmVyYXRpbmcgbG9jYWwgcmVmbGVjdGlvbnMsIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZW5lcmF0ZSBkdXBsaWNhdGVzLgotICAgKi8KLSAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHJlZmxlY3RlZF9maW5nZXJwcmludHNfOwotCi0gIC8vIFRoZSBQcm9jZXNzb3JHZW5lcmF0b3IgaXMgdXNlZCB0byBnZW5lcmF0ZSBwYXJ0cyBvZiB0aGUgY29kZSwKLSAgLy8gc28gaXQgbmVlZHMgYWNjZXNzIHRvIG1hbnkgb2Ygb3VyIHByb3RlY3RlZCBtZW1iZXJzIGFuZCBtZXRob2RzLgotICAvLwotICAvLyBUT0RPOiBUaGUgY29kZSByZWFsbHkgc2hvdWxkIGJlIGNsZWFuZWQgdXAgc28gdGhhdCBoZWxwZXIgbWV0aG9kcyBmb3IKLSAgLy8gd3JpdGluZyB0byB0aGUgb3V0cHV0IGZpbGVzIGFyZSBzZXBhcmF0ZSBmcm9tIHRoZSBnZW5lcmF0b3IgY2xhc3NlcwotICAvLyB0aGVtc2VsdmVzLgotICBmcmllbmQgY2xhc3MgUHJvY2Vzc29yR2VuZXJhdG9yOwotfTsKLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpK3Byb2dyYW1fbmFtZV8rIl90eXBlcy5oIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfdHlwZXNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuY3BwIjsKLSAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIElmIHdlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgaXQgYXBwZWFycyB0byBqdXN0IGRpc2NhcmQgZGF0YSwKLSAgICAvLyB3aGljaCBpcyBmaW5lLgotICAgIHN0cmluZyBmX3R5cGVzX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMudGNjIjsKLSAgICBmX3R5cGVzX3RjY18ub3BlbihmX3R5cGVzX3RjY19uYW1lLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0KLSAgLy8gU3RhcnQgaWZuZGVmCi0gIGZfdHlwZXNfIDw8Ci0gICAgIiNpZm5kZWYgIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfVFlQRVNfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX1RZUEVTX0giIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX3R5cGVzX3RjY18gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwKLSAgICAiI2RlZmluZSAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9UWVBFU19UQ0MiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEluY2x1ZGUgYmFzZSB0eXBlcwotICBmX3R5cGVzXyA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIG90aGVyIFRocmlmdCBpbmNsdWRlcwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PAotICAgICAgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7Ci0KLSAgICAvLyBYWFgoc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgIC8vIGluY2x1ZGVkIGZpbGVzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICBmX3R5cGVzX3RjY18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCooaW5jbHVkZXNbaV0pKSA8PAotICAgICAgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkgPDwgIl90eXBlcy50Y2NcIiIgPDwgZW5kbDsKLSAgfQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8vIEluY2x1ZGUgY3VzdG9tIGhlYWRlcnMKLSAgY29uc3QgdmVjdG9yPHN0cmluZz4mIGNwcF9pbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfY3BwX2luY2x1ZGVzKCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3BwX2luY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKGNwcF9pbmNsdWRlc1tpXVswXSA9PSAnPCcpIHsKLSAgICAgIGZfdHlwZXNfIDw8Ci0gICAgICAgICIjaW5jbHVkZSAiIDw8IGNwcF9pbmNsdWRlc1tpXSA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiI2luY2x1ZGUgXCIiIDw8IGNwcF9pbmNsdWRlc1tpXSA8PCAiXCIiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfdHlwZXNfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIHRoZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgZl90eXBlc190Y2NfIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwKLSAgICAiX3R5cGVzLmhcIiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gSWYgd2UgYXJlIGdlbmVyYXRpbmcgbG9jYWwgcmVmbGVjdGlvbiBtZXRhZGF0YSwgd2UgbmVlZCB0byBpbmNsdWRlCi0gIC8vIHRoZSBkZWZpbml0aW9uIG9mIFR5cGVTcGVjLgotICBpZiAoZ2VuX2RlbnNlXykgewotICAgIGZfdHlwZXNfaW1wbF8gPDwKLSAgICAgICIjaW5jbHVkZSA8dGhyaWZ0L1RSZWZsZWN0aW9uTG9jYWwuaD4iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICAvLyBUaGUgc3dhcCgpIGNvZGUgbmVlZHMgPGFsZ29yaXRobT4gZm9yIHN0ZDo6c3dhcCgpCi0gIGZfdHlwZXNfaW1wbF8gPDwgIiNpbmNsdWRlIDxhbGdvcml0aG0+IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gT3BlbiBuYW1lc3BhY2UKLSAgbnNfb3Blbl8gPSBuYW1lc3BhY2Vfb3Blbihwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotICBuc19jbG9zZV8gPSBuYW1lc3BhY2VfY2xvc2UocHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLQotICBmX3R5cGVzXyA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzX3RjY18gPDwKLSAgICBuc19vcGVuXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIG91dHB1dCBmaWxlcy4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgbmFtZXNwYWNlCi0gIGZfdHlwZXNfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX3R5cGVzX2ltcGxfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PAotICAgIG5zX2Nsb3NlXyA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBJbmNsdWRlIHRoZSB0eXBlcy50Y2MgZmlsZSBmcm9tIHRoZSB0eXBlcyBoZWFkZXIgZmlsZSwKLSAgLy8gc28gY2xpZW50cyBkb24ndCBoYXZlIHRvIGV4cGxpY2l0bHkgaW5jbHVkZSB0aGUgdGNjIGZpbGUuCi0gIC8vIFRPRE8oc2ltcGtpbnMpOiBNYWtlIHRoaXMgYSBzZXBhcmF0ZSBvcHRpb24uCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGZfdHlwZXNfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICAgIl90eXBlcy50Y2NcIiIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIC8vIENsb3NlIGlmbmRlZgotICBmX3R5cGVzXyA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGZfdHlwZXNfdGNjXyA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2Ugb3V0cHV0IGZpbGUKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl90eXBlc19pbXBsXy5jbG9zZSgpOwotICBmX3R5cGVzX3RjY18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgMS1saW5lciBpbiBDKysKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIGZfdHlwZXNfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGVkZWYgIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCksIHRydWUpIDw8ICIgIiA8PCB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBjb25zdGFudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfdmFsdWVzKSB7Ci0gIGYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmIDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZikKLSAgICAgIDw8IHByZWZpeCA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgc3VmZml4OwotICAgIGlmIChpbmNsdWRlX3ZhbHVlcyAmJiAoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICBmIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfQotICB9Ci0KLSAgZiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZikgPDwgIn07IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuIEluIEMrKywgdGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZQotICogYXMgdGhlIHRocmlmdCBkZWZpbml0aW9uIGl0c2VsZiwgdXNpbmcgdGhlIGVudW0ga2V5d29yZCBpbiBDKysuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotCi0gIHN0ZDo6c3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICBpZiAoIWdlbl9wdXJlX2VudW1zXykgewotICAgIGVudW1fbmFtZSA9ICJ0eXBlIjsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgInN0cnVjdCAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lOwotCi0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzXywgY29uc3RhbnRzLCAiIiwgIiIsIHRydWUpOwotCi0gIGlmICghZ2VuX3B1cmVfZW51bXNfKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3R5cGVzXyA8PCAifTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3R5cGVzXyA8PCBlbmRsOwotCi0gIC8qKgotICAgICBHZW5lcmF0ZSBhIGNoYXJhY3RlciBhcnJheSBvZiBlbnVtIG5hbWVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gICovCi0gIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiOwotICBpZiAoIWdlbl9wdXJlX2VudW1zXykgewotICAgIHByZWZpeCA9IHRlbnVtLT5nZXRfbmFtZSgpICsgIjo6IjsKLSAgfQotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaW50IF9rIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiVmFsdWVzW10gPSI7Ci0gIGdlbmVyYXRlX2VudW1fY29uc3RhbnRfbGlzdChmX3R5cGVzX2ltcGxfLCBjb25zdGFudHMsIHByZWZpeC5jX3N0cigpLCAiIiwgZmFsc2UpOwotCi0gIGZfdHlwZXNfaW1wbF8gPDwKLSAgICBpbmRlbnQoKSA8PCAiY29uc3QgY2hhciogX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lc1tdID0iOwotICBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3QoZl90eXBlc19pbXBsXywgY29uc3RhbnRzLCAiXCIiLCAiXCIiLCBmYWxzZSk7Ci0KLSAgZl90eXBlc18gPDwKLSAgICBpbmRlbnQoKSA8PCAiZXh0ZXJuIGNvbnN0IHN0ZDo6bWFwPGludCwgY29uc3QgY2hhcio+IF8iIDw8Ci0gICAgdGVudW0tPmdldF9uYW1lKCkgPDwgIl9WQUxVRVNfVE9fTkFNRVM7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl90eXBlc19pbXBsXyA8PAotICAgIGluZGVudCgpIDw8ICJjb25zdCBzdGQ6Om1hcDxpbnQsIGNvbnN0IGNoYXIqPiBfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgICJfVkFMVUVTX1RPX05BTUVTKDo6YXBhY2hlOjp0aHJpZnQ6OlRFbnVtSXRlcmF0b3IoIiA8PCBjb25zdGFudHMuc2l6ZSgpIDw8Ci0gICAgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJWYWx1ZXMiIDw8Ci0gICAgIiwgX2siIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJOYW1lcyksICIgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6VEVudW1JdGVyYXRvcigtMSwgTlVMTCwgTlVMTCkpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc18sIHRlbnVtLCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc19pbXBsXywgdGVudW0sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX2NvbnN0YW50cy5oIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfaW1wbF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmNwcCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzX2ltcGw7Ci0gIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfY29uc3RzIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gIGZfY29uc3RzX2ltcGwgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLQotICAvLyBTdGFydCBpZm5kZWYKLSAgZl9jb25zdHMgPDwKLSAgICAiI2lmbmRlZiAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl9DT05TVEFOVFNfSCIgPDwgZW5kbCA8PAotICAgICIjZGVmaW5lICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UU19IIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl90eXBlcy5oXCIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfb3Blbl8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgIl9jb25zdGFudHMuaFwiIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgImNsYXNzICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICAiICAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGZfY29uc3RzIDw8Ci0gICAgICBpbmRlbnQoKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9jb25zdHMgPDwKLSAgICAifTsiIDw8IGVuZGw7Ci0KLSAgZl9jb25zdHNfaW1wbCA8PAotICAgICJjb25zdCAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyBnXyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzOjoiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzX2ltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9jb25zdHNfaW1wbCkgPDwKLSAgICAifSIgPDwgZW5kbDsKLQotICBmX2NvbnN0cyA8PAotICAgIGVuZGwgPDwKLSAgICAiZXh0ZXJuIGNvbnN0ICIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiQ29uc3RhbnRzIGdfIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfY29uc3RhbnRzOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiI2VuZGlmIiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotCi0gIGZfY29uc3RzX2ltcGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3RyaW5nIHYyID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLl9faXNzZXQuIiA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHVzaF9iYWNrKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuaW5zZXJ0KCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBwcmludF9jb25zdF92YWx1ZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotLyoqCi0gKgotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSByZW5kZXI7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTEwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmVuZGVyIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IHQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgYSBjbGFzcwotICogd2l0aCBkYXRhIG1lbWJlcnMgYW5kIGEgcmVhZC93cml0ZSgpIGZ1bmN0aW9uLCBwbHVzIGEgbWlycm9yaW5nIGlzc2V0Ci0gKiBpbm5lciBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgZ2VuZXJhdGVfc3RydWN0X2ZpbmdlcnByaW50KGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QsIHRydWUpOwotICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24oZl90eXBlc19pbXBsXywgdHN0cnVjdCwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb25fcG9pbnRlcihmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKLQotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwotfQotCi0vKioKLSAqIFdyaXRlcyB0aGUgc3RydWN0IGRlZmluaXRpb24gaW50byB0aGUgaGVhZGVyIGZpbGUKLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN3YXApIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGV4dGVuZHMgPSAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24iOwotICB9Ci0KLSAgLy8gR2V0IG1lbWJlcnMKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAvLyBXcml0ZSB0aGUgaXNzZXQgc3RydWN0dXJlIGRlY2xhcmF0aW9uIG91dHNpZGUgdGhlIGNsYXNzLiBUaGlzIG1ha2VzCi0gIC8vIHRoZSBnZW5lcmF0ZWQgY29kZSBhbWVuYWJsZSB0byBwcm9jZXNzaW5nIGJ5IFNXSUcuCi0gIC8vIFdlIG9ubHkgZGVjbGFyZSB0aGUgc3RydWN0IGlmIGl0IGdldHMgdXNlZCBpbiB0aGUgY2xhc3MuCi0KLSAgLy8gSXNzZXQgc3RydWN0IGhhcyBib29sZWFuIGZpZWxkcywgYnV0IG9ubHkgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBoYXNfbm9ucmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKLSAgfQotCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInR5cGVkZWYgc3RydWN0IF8iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIl9faXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldCgpICI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgaXNTZXQgPSAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgIjogIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGlzU2V0IDw8ICIpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgICIsICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBpc1NldCA8PCAiKSI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiIHt9IiA8PCBlbmRsOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiYm9vbCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIn0gXyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiX19pc3NldDsiIDw8IGVuZGw7Ci0gICAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIE9wZW4gc3RydWN0IGRlZgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHV0IHRoZSBmaW5nZXJwcmludCB1cCB0b3AgZm9yIGFsbCB0byBzZWUuCi0gIGdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvdXQsIHRzdHJ1Y3QsIGZhbHNlKTsKLQotICBpZiAoIXBvaW50ZXJzKSB7Ci0gICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSI7Ci0KLSAgICBib29sIGluaXRfY3RvciA9IGZhbHNlOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgewotICAgICAgICBzdHJpbmcgZHZhbDsKLSAgICAgICAgaWYgKHQtPmlzX2VudW0oKSkgewotICAgICAgICAgIGR2YWwgKz0gIigiICsgdHlwZV9uYW1lKHQpICsgIikiOwotICAgICAgICB9Ci0gICAgICAgIGR2YWwgKz0gdC0+aXNfc3RyaW5nKCkgPyAiIiA6ICIwIjsKLSAgICAgICAgdF9jb25zdF92YWx1ZSogY3YgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOwotICAgICAgICBpZiAoY3YgIT0gTlVMTCkgewotICAgICAgICAgIGR2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCAoKm1faXRlciktPmdldF9uYW1lKCksIHQsIGN2KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWluaXRfY3RvcikgewotICAgICAgICAgIGluaXRfY3RvciA9IHRydWU7Ci0gICAgICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgICAgIG91dCA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGR2YWwgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAiLCAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZHZhbCA8PCAiKSI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBUT0RPKGRyZWlzcyk6IFdoZW4gZXZlcnl0aGluZyBlbHNlIGluIFRocmlmdCBpcyBwZXJmZWN0LAotICAgIC8vIGRvIG1vcmUgb2YgdGhlc2UgaW4gdGhlIGluaXRpYWxpemVyIGxpc3QuCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotCi0gICAgICBpZiAoIXQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCptX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgY3YpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHRocm93KCkge30iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUncyByZWZsZWN0aW9uIGxvY2FsIHR5cGVzcGVjLgotICBpZiAoZ2VuX2RlbnNlXykgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAic3RhdGljIDo6YXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyogbG9jYWxfcmVmbGVjdGlvbjsiIDw8Ci0gICAgICBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCBwb2ludGVycyAmJiAhKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpLCAhcmVhZCkgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEFkZCB0aGUgX19pc3NldCBkYXRhIG1lbWJlciBpZiB3ZSBuZWVkIGl0LCB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIGFib3ZlCi0gIGlmIChoYXNfbm9ucmVxdWlyZWRfZmllbGRzICYmICghcG9pbnRlcnMgfHwgcmVhZCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJfIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJfX2lzc2V0IF9faXNzZXQ7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ3JlYXRlIGEgc2V0dGVyIGZ1bmN0aW9uIGZvciBlYWNoIGZpZWxkCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoIiA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgb3V0IDw8ICIgdmFsKSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHZhbDsiIDw8IGVuZGw7Ci0KLSAgICAvLyBhc3N1bWUgYWxsIGZpZWxkcyBhcmUgcmVxdWlyZWQgZXhjZXB0IG9wdGlvbmFsIGZpZWxkcy4KLSAgICAvLyBmb3Igb3B0aW9uYWwgZmllbGRzIGNoYW5nZSBfX2lzc2V0Lm5hbWUgdG8gdHJ1ZQotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJfX2lzc2V0LiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKTw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIGlmICghcG9pbnRlcnMpIHsKLSAgICAvLyBHZW5lcmF0ZSBhbiBlcXVhbGl0eSB0ZXN0aW5nIG9wZXJhdG9yLiAgTWFrZSBpdCBpbmxpbmUgc2luY2UgdGhlIGNvbXBpbGVyCi0gICAgLy8gd2lsbCBkbyBhIGJldHRlciBqb2IgdGhhbiB3ZSB3b3VsZCB3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gaW5saW5lIGl0LgotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICYgIiA8PAotICAgICAgKG1lbWJlcnMuc2l6ZSgpID4gMCA/ICJyaHMiIDogIi8qIHJocyAqLyIpIDw8ICIpIGNvbnN0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIT0gcmhzLl9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImVsc2UgaWYgKF9faXNzZXQuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAmJiAhKCIKLSAgICAgICAgICAgICAgICAgICA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9PSByaHMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yICE9IChjb25zdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmcmhzKSBjb25zdCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gISgqdGhpcyA9PSByaHMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBkZWNsYXJhdGlvbiBvZiBhIGxlc3MtdGhhbiBvcGVyYXRvci4gIFRoaXMgbXVzdCBiZQotICAgIC8vIGltcGxlbWVudGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgaWYgdGhleSB3aXNoIHRvIHVzZSBpdC4gIChUaGV5Ci0gICAgLy8gd2lsbCBnZXQgYSBsaW5rIGVycm9yIGlmIHRoZXkgdHJ5IHRvIHVzZSBpdCB3aXRob3V0IGFuIGltcGxlbWVudGF0aW9uLikKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sIG9wZXJhdG9yIDwgKGNvbnN0ICIKLSAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmICkgY29uc3Q7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAocmVhZCkgewotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZChQcm90b2NvbF8qIGlwcm90KTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgcmVhZCgiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpZiAod3JpdGUpIHsKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHdyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0OyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCB3cml0ZSgiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3Q7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKHN3YXApIHsKLSAgICAvLyBHZW5lcmF0ZSBhIG5hbWVzcGFjZS1zY29wZSBzd2FwKCkgZnVuY3Rpb24KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2b2lkIHN3YXAoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgJmEsICIgPDwKLSAgICAgIHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAmYik7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBmaW5nZXJwcmludCBvZiBhIHN0cnVjdCB0byBlaXRoZXIgdGhlIGhlYWRlciBvciBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9maW5nZXJwcmludChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIHN0cmluZyBzdGF0LCBuc3BhY2UsIGNvbW1lbnQ7Ci0gIGlmIChpc19kZWZpbml0aW9uKSB7Ci0gICAgc3RhdCA9ICIiOwotICAgIG5zcGFjZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiOjoiOwotICAgIGNvbW1lbnQgPSAiICI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RhdCA9ICJzdGF0aWMgIjsKLSAgICBuc3BhY2UgPSAiIjsKLSAgICBjb21tZW50ID0gIjsgLy8gIjsKLSAgfQotCi0gIGlmICh0c3RydWN0LT5oYXNfZmluZ2VycHJpbnQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgc3RhdCA8PCAiY29uc3QgY2hhciogIiA8PCBuc3BhY2UKLSAgICAgICAgPDwgImFzY2lpX2ZpbmdlcnByaW50IiA8PCBjb21tZW50IDw8ICI9IFwiIiA8PAotICAgICAgICB0c3RydWN0LT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSA8PCAiXCI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBzdGF0IDw8ICJjb25zdCB1aW50OF90ICIgPDwgbnNwYWNlIDw8Ci0gICAgICAgICJiaW5hcnlfZmluZ2VycHJpbnRbIiA8PCB0X3R5cGU6OmZpbmdlcnByaW50X2xlbiA8PCAiXSIgPDwgY29tbWVudCA8PCAiPSB7IjsKLSAgICBjb25zdCBjaGFyKiBjb21tYSA9ICIiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdF90eXBlOjpmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgb3V0IDw8IGNvbW1hIDw8ICIweCIgPDwgdF9zdHJ1Y3Q6OmJ5dGVfdG9faGV4KHRzdHJ1Y3QtPmdldF9iaW5hcnlfZmluZ2VycHJpbnQoKVtpXSk7Ci0gICAgICBjb21tYSA9ICIsIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogV3JpdGVzIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZSAoZWl0aGVyIGRlY2xhcmF0aW9uIG9yIGRlZmluaXRpb24pLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19kZWZpbml0aW9uKSB7Ci0gIGlmICghZ2VuX2RlbnNlXykgewotICAgIHJldHVybjsKLSAgfQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBhc3NlcnQodHR5cGUtPmhhc19maW5nZXJwcmludCgpKTsKLSAgc3RyaW5nIGtleSA9IHR0eXBlLT5nZXRfYXNjaWlfZmluZ2VycHJpbnQoKSArIChpc19kZWZpbml0aW9uID8gIi1kZWZuIiA6ICItZGVjbCIpOwotICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSBnZW5lcmF0ZWQgdGhpcyBmaW5nZXJwcmludC4gIElmIHdlIGFscmVhZHkgZGlkLCBiYWlsIG91dC4KLSAgaWYgKCFyZWZsZWN0ZWRfZmluZ2VycHJpbnRzXy5pbnNlcnQoa2V5KS5zZWNvbmQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gTGV0IGVhY2ggcHJvZ3JhbSBoYW5kbGUgaXRzIG93biBzdHJ1Y3R1cmVzLgotICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCAmJiB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIERvIGRlcGVuZGVuY2llcy4KLSAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpLCBpc19kZWZpbml0aW9uKTsKLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgaXNfZGVmaW5pdGlvbik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgLy8gSGFja3kgaGFja3kuICBGb3IgZWZmaWNpZW5jeSBhbmQgY29udmVuaWVuY2UsIHdlIG5lZWQgYSBkdW1teSAiVF9TVE9QIgotICAgIC8vIHR5cGUgYXQgdGhlIGVuZCBvZiBvdXIgdHlwZXNwZWMgYXJyYXkuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubwotICAgIC8vIFRfU1RPUCB0eXBlLCBzbyB3ZSB1c2UgdGhlIGdsb2JhbCB2b2lkIHR5cGUsIGFuZCBzcGVjaWFsIGNhc2UgaXQgd2hlbgotICAgIC8vIGdlbmVyYXRpbmcgaXRzIHR5cGVzcGVjLgotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9ICgodF9zdHJ1Y3QqKXR0eXBlKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2xvY2FsX3JlZmxlY3Rpb24ob3V0LCAoKiptX2l0ZXIpLmdldF90eXBlKCksIGlzX2RlZmluaXRpb24pOwotICAgIH0KLSAgICBnZW5lcmF0ZV9sb2NhbF9yZWZsZWN0aW9uKG91dCwgZ190eXBlX3ZvaWQsIGlzX2RlZmluaXRpb24pOwotCi0gICAgLy8gRm9yIGRlZmluaXRpb25zIG9mIHN0cnVjdHVyZXMsIGRvIHRoZSBhcnJheXMgb2YgbWV0YXMgYW5kIGZpZWxkIHNwZWNzIGFsc28uCi0gICAgaWYgKGlzX2RlZmluaXRpb24pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OkZpZWxkTWV0YSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAieyAiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwKLSAgICAgICAgICAoKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpID8gInRydWUiIDogImZhbHNlIikgPDwKLSAgICAgICAgICAiIH0sIiA8PCBlbmRsOwotICAgICAgfQotICAgICAgLy8gWmVybyBmb3IgdGhlIFRfU1RPUCBtYXJrZXIuCi0gICAgICBpbmRlbnQob3V0KSA8PCAieyAwLCBmYWxzZSB9IiA8PCBlbmRsIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpIDw8IltdID0geyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJiIgPDwKLSAgICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICImIiA8PAotICAgICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgZ190eXBlX3ZvaWQpIDw8ICIsIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiLy8gIiA8PCB0dHlwZS0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IChpc19kZWZpbml0aW9uID8gIiIgOiAiZXh0ZXJuICIpIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjIiA8PCBlbmRsIDw8Ci0gICAgICBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgdHR5cGUpIDw8Ci0gICAgICAoaXNfZGVmaW5pdGlvbiA/ICIoIiA6ICI7IikgPDwgZW5kbDsKLQotICBpZiAoIWlzX2RlZmluaXRpb24pIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QIjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX3RvX2VudW0odHR5cGUpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCAiOjpiaW5hcnlfZmluZ2VycHJpbnQsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoIm1ldGFzIiwgdHR5cGUpIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInNwZWNzIiwgdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk5VTEwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiYiIDw8IGxvY2FsX3JlZmxlY3Rpb25fbmFtZSgidHlwZXNwZWMiLCAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJOVUxMIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgPDwgIiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICImIiA8PCBsb2NhbF9yZWZsZWN0aW9uX25hbWUoInR5cGVzcGVjIiwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSk7Ci0gIH0KLQotICBvdXQgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBXcml0ZXMgdGhlIHN0cnVjdHVyZSdzIHN0YXRpYyBwb2ludGVyIHRvIGl0cyBsb2NhbCByZWZsZWN0aW9uIHR5cGVzcGVjCi0gKiBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbG9jYWxfcmVmbGVjdGlvbl9wb2ludGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSkgewotICBpZiAoIWdlbl9kZW5zZV8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiOjphcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWw6OlR5cGVTcGVjKiAiIDw8Ci0gICAgICB0dHlwZS0+Z2V0X25hbWUoKSA8PCAiOjpsb2NhbF9yZWZsZWN0aW9uID0gIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgJiIgPDwgbG9jYWxfcmVmbGVjdGlvbl9uYW1lKCJ0eXBlc3BlYyIsIHR0eXBlKSA8PCAiOyIgPDwKLSAgICBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogTWFrZXMgYSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2VuIGEgc3RydWN0IHJlYWRlci4KLSAqCi0gKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OnJlYWQoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QpIHsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OnN0cmluZyBmbmFtZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpbnQxNl90IGZpZDsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RCZWdpbihmbmFtZSk7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ1c2luZyA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gUmVxdWlyZWQgdmFyaWFibGVzIGFyZW4ndCBpbiBfX2lzc2V0LCBzbyB3ZSBuZWVkIHRtcCB2YXJzIHRvIGNoZWNrIHRoZW0uCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbCBpc3NldF8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZmFsc2U7IiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IGlwcm90LT5yZWFkRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKGZ0eXBlID09IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUT1ApIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBpZihmaWVsZHMuZW1wdHkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IGlwcm90LT5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7Ci0KLSAgICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICAgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgICBjb25zdCBjaGFyICppc3NldF9wcmVmaXggPQotICAgICAgICAgICAgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpID8gInRoaXMtPl9faXNzZXQuIiA6ICJpc3NldF8iOwotCi0jaWYgMAotICAgICAgICAgIC8vIFRoaXMgY29kZSB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGZpZWxkIGlzIGVuY291bnRlcmVkIHR3aWNlLgotICAgICAgICAgIC8vIFdlJ3ZlIGRlY2lkZWQgdG8gbGVhdmUgaXQgb3V0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotICAgICAgICAgIC8vIFRPRE8oZHJlaXNzKTogR2VuZXJhdGUgdGhpcyBjb2RlIGFuZCAiaWYiIGl0IG91dCB0byBtYWtlIGl0IGVhc2llcgotICAgICAgICAgIC8vIGZvciBwZW9wbGUgcmVjb21waWxpbmcgdGhyaWZ0IHRvIGluY2x1ZGUgaXQuCi0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0jZW5kaWYKLQotICAgICAgICAgIGlmIChwb2ludGVycyAmJiAhKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgaXNzZXRfcHJlZml4IDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAvLyBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBhbiBvcHRpb24gd2hlbiB0aHJpZnQgc3RydWN0cwotICAgICAgICAgICAgLy8gaGF2ZSBhIGNvbW1vbiBiYXNlIGNsYXNzLgotICAgICAgICAgICAgLy8gaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgeGZlciArPSBpcHJvdC0+c2tpcChmdHlwZSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotICAgIH0gLy8hZmllbGRzLmVtcHR5KCkKLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gaXByb3QtPnJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBvdXQgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVGhyb3cgaWYgYW55IHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KLSAgLy8gV2UgZG8gdGhpcyBhZnRlciByZWFkaW5nIHRoZSBzdHJ1Y3QgZW5kIHNvIHRoYXQKLSAgLy8gdGhlcmUgbWlnaHQgcG9zc2libHkgYmUgYSBjaGFuY2Ugb2YgY29udGludWluZy4KLSAgb3V0IDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgJyknIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHdyaXRlIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcnMpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOjp3cml0ZShQcm90b2NvbF8qIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAidWludDMyX3QgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8Ci0gICAgICAiOjp3cml0ZSg6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCkgY29uc3QgeyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNoZWNrX2lmX3NldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKTsKLSAgICBpZiAoY2hlY2tfaWZfc2V0KSB7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPl9faXNzZXQuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMgJiYgISgqZl9pdGVyKS0+Z2V0X3R5cGUoKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgIigqKHRoaXMtPiIsICIpKSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0gICAgfQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICBpZiAoY2hlY2tfaWZfc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgJ30nOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogU3RydWN0IHdyaXRlciBmb3IgcmVzdWx0IG9mIGEgZnVuY3Rpb24sIHdoaWNoIGNhbiBoYXZlIG9ubHkgb25lIG9mIGl0cwotICogZmllbGRzIHNldCBhbmQgZG9lcyBhIGNvbmRpdGlvbmFsIGlmIGVsc2UgbG9vayB1cCBpbnRvIHRoZSBfX2lzc2V0IGZpZWxkCi0gKiBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHJlc3VsdCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVycykgewotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKFByb3RvY29sXyogb3Byb3QpIGNvbnN0IHsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ1aW50MzJfdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwKLSAgICAgICI6OndyaXRlKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy0+X19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBoZWFkZXIKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkQmVnaW4oIiA8PAotICAgICAgIlwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBpZiAocG9pbnRlcnMpIHsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICIoKih0aGlzLT4iLCAiKSkiKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgIH0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBvcHJvdC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4geGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBzd2FwIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0Ci0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8Ci0gICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZiKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBMZXQgYXJndW1lbnQtZGVwZW5kZW50IG5hbWUgbG9va3VwIGZpbmQgdGhlIGNvcnJlY3Qgc3dhcCgpIGZ1bmN0aW9uIHRvCi0gIC8vIHVzZSBiYXNlZCBvbiB0aGUgYXJndW1lbnQgdHlwZXMuICBJZiBub25lIGlzIGZvdW5kIGluIHRoZSBhcmd1bWVudHMnCi0gIC8vIG5hbWVzcGFjZXMsIGZhbGwgYmFjayB0byA6OnN0ZDo6c3dhcCgpLgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAidXNpbmcgOjpzdGQ6OnN3YXA7IiA8PCBlbmRsOwotCi0gIGJvb2wgaGFzX25vbnJlcXVpcmVkX2ZpZWxkcyA9IGZhbHNlOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOwotICAgICAgIGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7Ci0gICAgICAgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkICp0ZmllbGQgPSAqZl9pdGVyOwotCi0gICAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGhhc19ub25yZXF1aXJlZF9maWVsZHMgPSB0cnVlOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInN3YXAoYS4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PAotICAgICAgIiwgYi4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoaGFzX25vbnJlcXVpcmVkX2ZpZWxkcykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInN3YXAoYS5fX2lzc2V0LCBiLl9faXNzZXQpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGhhbmRsZSBlbXB0eSBzdHJ1Y3RzCi0gIGlmIChmaWVsZHMuc2l6ZSgpID09IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgYTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKHZvaWQpIGI7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlcwotICBzdHJpbmcgZl9oZWFkZXJfbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiLmgiOwotICBmX2hlYWRlcl8ub3BlbihmX2hlYWRlcl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlciBmaWxlIGluY2x1ZGVzCi0gIGZfaGVhZGVyXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsIDw8Ci0gICAgIiNkZWZpbmUgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IC8vIFRNZW1vcnlCdWZmZXIKLSAgICAgICIjaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+IiA8PCBlbmRsIDw8Ci0gICAgICAibmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeyIgPDwgZW5kbCA8PAotICAgICAgImNsYXNzIFRBc3luY0NoYW5uZWw7IiA8PCBlbmRsIDw8Ci0gICAgICAifX19IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKLSAgaWYgKGdlbl9jb2Jfc3R5bGVfKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAiI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oPiIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICJfdHlwZXMuaFwiIiA8PCBlbmRsOwotCi0gIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3NlcnZpY2UgIT0gTlVMTCkgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKihleHRlbmRzX3NlcnZpY2UtPmdldF9wcm9ncmFtKCkpKSA8PAotICAgICAgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIuaFwiIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgZW5kbCA8PAotICAgIG5zX29wZW5fIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3N2Y25hbWUrIi5jcHAiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8ICIuaFwiIiA8PCBlbmRsOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiI2luY2x1ZGUgXCJ0aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oXCIiIDw8IGVuZGw7Ci0gIH0KLSAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwKLSAgICAgICIudGNjXCIiIDw8IGVuZGw7Ci0KLSAgICBzdHJpbmcgZl9zZXJ2aWNlX3RjY19uYW1lID0gZ2V0X291dF9kaXIoKStzdmNuYW1lKyIudGNjIjsKLSAgICBmX3NlcnZpY2VfdGNjXy5vcGVuKGZfc2VydmljZV90Y2NfbmFtZS5jX3N0cigpKTsKLSAgICBmX3NlcnZpY2VfdGNjXyA8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCk7Ci0gICAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8Ci0gICAgICAiLmhcIiIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgICAiI2lmbmRlZiAiIDw8IHN2Y25hbWUgPDwgIl9UQ0MiIDw8IGVuZGwgPDwKLSAgICAgICIjZGVmaW5lICIgPDwgc3ZjbmFtZSA8PCAiX1RDQyIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLQotICAgIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgICAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICAgICAgIiNpbmNsdWRlIFwidGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaFwiIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlX3RjY18gPDwKLSAgICBlbmRsIDw8IG5zX29wZW5fIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvbXBvbmVudHMKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0c2VydmljZSwgIiIpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICIiKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NrZWxldG9uKHRzZXJ2aWNlKTsKLQotICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvYiBjb21wb25lbnRzCi0gIGlmIChnZW5fY29iX3N0eWxlXykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iQ2wiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSwgIkNvYlN2Iik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2VfZmFjdG9yeSh0c2VydmljZSwgIkNvYlN2Iik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9udWxsKHRzZXJ2aWNlLCAiQ29iU3YiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSwgIkNvYiIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiQ29iIik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0c2VydmljZSk7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgbmFtZXNwYWNlCi0gIGZfc2VydmljZV8gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgbnNfY2xvc2VfIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBmX2hlYWRlcl8gPDwKLSAgICBuc19jbG9zZV8gPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgLy8gVE9ETyhzaW1wa2lucyk6IE1ha2UgdGhpcyBhIHNlcGFyYXRlIG9wdGlvbgotICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIjaW5jbHVkZSBcIiIgPDwgZ2V0X2luY2x1ZGVfcHJlZml4KCpnZXRfcHJvZ3JhbSgpKSA8PCBzdmNuYW1lIDw8Ci0gICAgICAiLnRjY1wiIiA8PCBlbmRsIDw8Ci0gICAgICAiI2luY2x1ZGUgXCIiIDw8IGdldF9pbmNsdWRlX3ByZWZpeCgqZ2V0X3Byb2dyYW0oKSkgPDwgcHJvZ3JhbV9uYW1lXyA8PAotICAgICAgIl90eXBlcy50Y2NcIiIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfaGVhZGVyXyA8PAotICAgICIjZW5kaWYiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV90Y2NfIDw8Ci0gICAgIiNlbmRpZiIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSB0aGUgZmlsZXMKLSAgZl9zZXJ2aWNlX3RjY18uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotICBmX2hlYWRlcl8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLiBCYXNpY2FsbHksIHRoaXMgZ2VuZXJhdGVzIHR5cGVzCi0gKiBmb3IgYWxsIHRoZSBhcmd1bWVudHMgYW5kIHJlc3VsdHMgdG8gZnVuY3Rpb25zLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIHN0ZDo6b2ZzdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgc3RyaW5nIG5hbWVfb3JpZyA9IHRzLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gVE9ETyhkcmVpc3MpOiBXaHkgaXMgdGhpcyBzdHVmZiBub3QgaW4gZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycz8KLSAgICB0cy0+c2V0X25hbWUodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHMpOwotICAgIHRzLT5zZXRfbmFtZSh0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcGFyZ3MiKTsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX2hlYWRlcl8sIHRzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3V0LCB0cywgdHJ1ZSk7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWVfb3JpZyk7Ci0KLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLQotICBzdHJpbmcgc2VydmljZV9pZl9uYW1lID0gc2VydmljZV9uYW1lXyArIHN0eWxlICsgIklmIjsKLSAgaWYgKHN0eWxlID09ICJDb2JDbCIpIHsKLSAgICAvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGNsaWVudC4KLSAgICBzdHJpbmcgY2xpZW50X25hbWUgPSBzZXJ2aWNlX25hbWVfICsgIkNvYkNsaWVudCI7Ci0gICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBjbGllbnRfbmFtZSArPSAiVCI7Ci0gICAgICBzZXJ2aWNlX2lmX25hbWUgKz0gIlQiOwotICAgICAgaW5kZW50KGZfaGVhZGVyXykgPDwKLSAgICAgICAgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiY2xhc3MgIiA8PCBjbGllbnRfbmFtZSA8PCAiOyIgPDwKLSAgICAgIGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgOiB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArCi0gICAgICBzdHlsZSArICJJZiI7Ci0gICAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICAgIGV4dGVuZHMgKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHN0eWxlID09ICJDb2JDbCIgJiYgZ2VuX3RlbXBsYXRlc18pIHsKLSAgICBmX2hlYWRlcl8gPDwgInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiKCkge30iIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBzdHlsZSkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChzdHlsZSA9PSAiQ29iQ2wiICYmIGdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgLy8gZ2VuZXJhdGUgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB0eXBlZGVmIGZvciBjbGllbnRzIHRoYXQgZG8gbm90Ci0gICAgLy8ga25vdyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICJ0eXBlZGVmICIgPDwgc2VydmljZV9pZl9uYW1lIDw8Ci0gICAgICAiPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiAiIDw8Ci0gICAgICBzZXJ2aWNlX25hbWVfIDw8IHN0eWxlIDw8ICJJZjsiIDw8Ci0gICAgICBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBmYWN0b3J5LgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZmFjdG9yeSBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZV9mYWN0b3J5KHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUpIHsKLSAgc3RyaW5nIHNlcnZpY2VfaWZfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyBzdHlsZSArICJJZiI7Ci0KLSAgLy8gRmlndXJlIG91dCB0aGUgbmFtZSBvZiB0aGUgdXBwZXItbW9zdCBwYXJlbnQgY2xhc3MuCi0gIC8vIEdldHRpbmcgZXZlcnl0aGluZyB0byB3b3JrIG91dCBwcm9wZXJseSB3aXRoIGluaGVyaXRhbmNlIGlzIGFubm95aW5nLgotICAvLyBIZXJlJ3Mgd2hhdCB3ZSdyZSBkb2luZyBmb3Igbm93OgotICAvLwotICAvLyAtIEFsbCBoYW5kbGVycyBpbXBsZW1lbnQgZ2V0SGFuZGxlcigpLCBidXQgc3ViY2xhc3NlcyB1c2UgY292YXJpYW50IHJldHVybgotICAvLyAgIHR5cGVzIHRvIHJldHVybiB0aGVpciBzcGVjaWZpYyBzZXJ2aWNlIGludGVyZmFjZSBjbGFzcyB0eXBlLiAgV2UgaGF2ZSB0bwotICAvLyAgIHVzZSByYXcgcG9pbnRlcnMgYmVjYXVzZSBvZiB0aGlzOyBzaGFyZWRfcHRyPD4gY2FuJ3QgYmUgdXNlZCBmb3IKLSAgLy8gICBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzLgotICAvLwotICAvLyAtIFNpbmNlIHdlJ3JlIG5vdCB1c2luZyBzaGFyZWRfcHRyPD4sIHdlIGFsc28gcHJvdmlkZSBhIHJlbGVhc2VIYW5kbGVyKCkKLSAgLy8gICBmdW5jdGlvbiB0aGF0IG11c3QgYmUgY2FsbGVkIHRvIHJlbGVhc2UgYSBwb2ludGVyIHRvIGEgaGFuZGxlciBvYnRhaW5lZAotICAvLyAgIHZpYSBnZXRIYW5kbGVyKCkuCi0gIC8vCi0gIC8vICAgcmVsZWFzZUhhbmRsZXIoKSBhbHdheXMgYWNjZXB0cyBhIHBvaW50ZXIgdG8gdGhlIHVwcGVyLW1vc3QgcGFyZW50IGNsYXNzCi0gIC8vICAgdHlwZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBwYXJlbnQgdmVyc2lvbnMgb2YgcmVsZWFzZUhhbmRsZXIoKQotICAvLyAgIG1heSBhY2NlcHQgYW55IG9mIHRoZSBwYXJlbnQgdHlwZXMsIG5vdCBqdXN0IHRoZSBtb3N0IHNwZWNpZmljIHN1YmNsYXNzCi0gIC8vICAgdHlwZS4gIEltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGR5bmFtaWNfY2FzdCB0byBjYXN0IHRoZSBwb2ludGVyIHRvIHRoZQotICAvLyAgIHN1YmNsYXNzIHR5cGUgaWYgZGVzaXJlZC4KLSAgdF9zZXJ2aWNlKiBiYXNlX3NlcnZpY2UgPSB0c2VydmljZTsKLSAgd2hpbGUgKGJhc2Vfc2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgYmFzZV9zZXJ2aWNlID0gYmFzZV9zZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICB9Ci0gIHN0cmluZyBiYXNlX2lmX25hbWUgPSB0eXBlX25hbWUoYmFzZV9zZXJ2aWNlKSArIHN0eWxlICsgIklmIjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgYWJzdHJhY3QgZmFjdG9yeSBjbGFzcwotICBzdHJpbmcgZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIkZhY3RvcnkiOwotICBzdHJpbmcgZXh0ZW5kczsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiA6IHZpcnR1YWwgcHVibGljICIgKyB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpICsKLSAgICAgIHN0eWxlICsgIklmRmFjdG9yeSI7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBmYWN0b3J5X25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiAiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiIEhhbmRsZXI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IGZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiIDw8Ci0gICAgICAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOyIgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlcigiIDw8IGJhc2VfaWZfbmFtZSA8PAotICAgICIqIC8qIGhhbmRsZXIgKi8pID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNpbmdsZXRvbiBmYWN0b3J5IGNsYXNzCi0gIHN0cmluZyBzaW5nbGV0b25fZmFjdG9yeV9uYW1lID0gc2VydmljZV9pZl9uYW1lICsgIlNpbmdsZXRvbkZhY3RvcnkiOwotICBmX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBzaW5nbGV0b25fZmFjdG9yeV9uYW1lIDw8Ci0gICAgIiA6IHZpcnR1YWwgcHVibGljICIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIihjb25zdCBib29zdDo6c2hhcmVkX3B0cjwiIDw8Ci0gICAgc2VydmljZV9pZl9uYW1lIDw8ICI+JiBpZmFjZSkgOiBpZmFjZV8oaWZhY2UpIHt9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgIiA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiIDw8Ci0gICAgICAiY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJikgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBpZmFjZV8uZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIHJlbGVhc2VIYW5kbGVyKCIgPDwgYmFzZV9pZl9uYW1lIDw8Ci0gICAgIiogLyogaGFuZGxlciAqLykge30iIDw8IGVuZGw7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgZW5kbCA8PAotICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZSA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX251bGwodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RyaW5nIHN0eWxlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9ICIgLCB2aXJ0dWFsIHB1YmxpYyAiICsgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArIHN0eWxlICsgIk51bGwiOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwgOiB2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIklmIiA8PCBleHRlbmRzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIk51bGwoKSB7fSIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgc3R5bGUsICIiLCBmYWxzZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLQotICAgIGlmIChzdHlsZSA9PSAiIikgewotICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSB8fCBpc19jb21wbGV4X3R5cGUocmV0dXJudHlwZSkpIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgZGVjbGFyZV9maWVsZCgmcmV0dXJuZmllbGQsIHRydWUpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIF9yZXR1cm47IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0gIkNvYlN2IikgewotICAgICAgaWYgKHJldHVybnR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBjb2IoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYihfcmV0dXJuKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgdGFyZ2V0LCBzdHJpbmcgaWZhY2UsIHN0cmluZyBhcmdfcHJlZml4KSB7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICB0X3R5cGUqIHJldF90eXBlID0gZ2V0X3RydWVfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOwotICBvdXQgPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhcmV0X3R5cGUtPmlzX3ZvaWQoKSkgewotICAgIGlmIChpc19jb21wbGV4X3R5cGUocmV0X3R5cGUpKSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgb3V0IDw8IGlmYWNlIDw8ICItPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0YXJnZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCB0YXJnZXQgPDwgIiA9ICIgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgaWZhY2UgPDwgIi0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiwgIjsKLSAgICB9Ci0gICAgb3V0IDw8IGFyZ19wcmVmaXggPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIHN2Y25hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKTsKLQotICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgc3RyaW5nIGZfc2tlbGV0b25fbmFtZSA9IGdldF9vdXRfZGlyKCkrc3ZjbmFtZSsiX2FzeW5jX3NlcnZlci5za2VsZXRvbi5jcHAiOwotCi0gIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLQotICBvZnN0cmVhbSBmX3NrZWxldG9uOwotICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIG9uZSB3YXkgdG8gYWRhcHQgYSBzeW5jaHJvbm91cyIgPDwgZW5kbCA8PAotICAgICIvLyBpbnRlcmZhY2UgaW50byBhbiBhc3luY2hyb25vdXMgaW50ZXJmYWNlLiBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciIgPDwgZW5kbCA8PAotICAgICIvLyBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdCBhbmQgcmV3cml0ZSBhcyBhc3luY2hyb25vdXMgYW55IGZ1bmN0aW9ucyIgPDwgZW5kbCA8PAotICAgICIvLyB0aGF0IHdvdWxkIG90aGVyd2lzZSBpbnRyb2R1Y2UgdW53YW50ZWQgbGF0ZW5jeS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZlbnRTZXJ2ZXIuaD4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsIDw8Ci0gICAgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgaWYgKCFucy5lbXB0eSgpKSB7Ci0gICAgZl9za2VsZXRvbiA8PAotICAgICAgInVzaW5nIG5hbWVzcGFjZSAiIDw8IHN0cmluZyhucywgMCwgbnMuc2l6ZSgpLTIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgICJjbGFzcyAiIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlciA6ICIgPDwKLSAgICAicHVibGljICIgPDwgc3ZjbmFtZSA8PCAiQ29iU3ZJZiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8IHN2Y25hbWUgPDwgIkFzeW5jSGFuZGxlcigpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzeW5jSGFuZGxlcl8gPSBzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PAotICAgICAgICAgICAgICAgICJIYW5kbGVyPihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgInZpcnR1YWwgfiIgPDwgc2VydmljZV9uYW1lXyA8PCAiQXN5bmNIYW5kbGVyKCk7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiQ29iU3YiLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiByZXR1cm50eXBlID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOwotICAgIHRfZmllbGQgcmV0dXJuZmllbGQocmV0dXJudHlwZSwgIl9yZXR1cm4iKTsKLQotICAgIHN0cmluZyB0YXJnZXQgPSByZXR1cm50eXBlLT5pc192b2lkKCkgPyAiIiA6ICJfcmV0dXJuIjsKLSAgICBpZiAoIXJldHVybnR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgZl9za2VsZXRvbiA8PAotICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCwgdHJ1ZSkgPDwgZW5kbDsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25fY2FsbChmX3NrZWxldG9uLCAqZl9pdGVyLCB0YXJnZXQsICJzeW5jSGFuZGxlcl8iLCAiIik7Ci0gICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYigiIDw8IHRhcmdldCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2tlbGV0b24pOwotICB9Ci0gIGZfc2tlbGV0b24gPDwgZW5kbCA8PAotICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzdGQ6OmF1dG9fcHRyPCIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcj4gc3luY0hhbmRsZXJfOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIG11bHRpZmFjZSwgd2hpY2ggaXMgYSBzaW5nbGUgc2VydmVyIHRoYXQganVzdCB0YWtlcyBhIHNldAotICogb2Ygb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBhbmQgY2FsbHMgdGhlbSBhbGwsIHJldHVybmluZyB0aGUKLSAqIHZhbHVlIG9mIHRoZSBsYXN0IG9uZSB0byBiZSBjYWxsZWQuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgbXVsdGlzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9tdWx0aWZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19tdWx0aWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX211bHRpZmFjZSA9ICIsIHB1YmxpYyAiICsgZXh0ZW5kcyArICJNdWx0aWZhY2UiOwotICB9Ci0KLSAgc3RyaW5nIGxpc3RfdHlwZSA9IHN0cmluZygic3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IikgKyBzZXJ2aWNlX25hbWVfICsgIklmPiA+IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIiA8PAotICAgICJ2aXJ0dWFsIHB1YmxpYyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PAotICAgIGV4dGVuZHNfbXVsdGlmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgiIDw8IGxpc3RfdHlwZSA8PCAiJiBpZmFjZXMpIDogaWZhY2VzXyhpZmFjZXMpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjwiICsgc2VydmljZV9uYW1lXyArICJJZj4gPjo6aXRlcmF0b3IgaXRlcjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoKml0ZXIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIH4iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIFByb3RlY3RlZCBkYXRhIG1lbWJlcnMKLSAgZl9oZWFkZXJfIDw8Ci0gICAgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgbGlzdF90eXBlIDw8ICIgaWZhY2VzXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2b2lkIGFkZChib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmPiBpZmFjZSkgeyIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZmFjZXNfLnB1c2hfYmFjayhpZmFjZSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdsaXN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdsaXN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLQotICAgIHN0cmluZyBjYWxsID0gc3RyaW5nKCJpZmFjZXNfW2ldLT4iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICIoIjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgIGNhbGwgKz0gIl9yZXR1cm4iOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYWxsICs9ICIsICI7Ci0gICAgICB9Ci0gICAgICBjYWxsICs9ICgqYV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgY2FsbCArPSAiKSI7Ci0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgInNpemVfdCBzeiA9IGlmYWNlc18uc2l6ZSgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInNpemVfdCBpID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgKDsgaSA8IChzeiAtIDEpOyArK2kpIHsiIDw8IGVuZGw7Ci0JaW5kZW50X3VwKCk7Ci0JZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsOwotCWluZGVudF9kb3duKCk7Ci0JZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBjYWxsIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgY2FsbCA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGNhbGwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9oZWFkZXJfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdHJpbmcgc3R5bGUpIHsKLSAgc3RyaW5nIGlmc3R5bGU7Ci0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGlmc3R5bGUgPSAiQ29iQ2wiOwotICB9Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLSAgc3RyaW5nIHRlbXBsYXRlX2hlYWRlciwgdGVtcGxhdGVfc3VmZml4LCBzaG9ydF9zdWZmaXgsIHByb3RvY29sX3R5cGUsIF90aGlzOwotICBzdHJpbmcgY29uc3QgcHJvdF9mYWN0b3J5X3R5cGUgPQotICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSI7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIHRlbXBsYXRlX2hlYWRlciA9ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPlxuIjsKLSAgICBzaG9ydF9zdWZmaXggPSAiVCI7Ci0gICAgdGVtcGxhdGVfc3VmZml4ID0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgcHJvdG9jb2xfdHlwZSA9ICJQcm90b2NvbF8iOwotICAgIF90aGlzID0gInRoaXMtPiI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJvdG9jb2xfdHlwZSA9ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIjsKLSAgfQotICBzdHJpbmcgcHJvdF9wdHIgPSAiYm9vc3Q6OnNoYXJlZF9wdHI8ICIgKyBwcm90b2NvbF90eXBlICsgIj4iOwotICBzdHJpbmcgY2xpZW50X3N1ZmZpeCA9ICJDbGllbnQiICsgdGVtcGxhdGVfc3VmZml4OwotICBzdHJpbmcgaWZfc3VmZml4ID0gIklmIjsKLSAgaWYgKHN0eWxlID09ICJDb2IiKSB7Ci0gICAgaWZfc3VmZml4ICs9IHRlbXBsYXRlX3N1ZmZpeDsKLSAgfQotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgIC8vIHBhcmVudCBzZXJ2aWNlcyB3ZXJlIGFsc28gZ2VuZXJhdGVkIHdpdGggdGVtcGxhdGVzIGVuYWJsZWQuCi0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyBzdHlsZSArIGNsaWVudF9zdWZmaXg7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9oZWFkZXJfIDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyIDw8Ci0gICAgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIiA6ICIgPDwKLSAgICAidmlydHVhbCBwdWJsaWMgIiA8PCBzZXJ2aWNlX25hbWVfIDw8IGlmc3R5bGUgPDwgaWZfc3VmZml4IDw8Ci0gICAgZXh0ZW5kc19jbGllbnQgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpZiAoc3R5bGUgIT0gIkNvYiIpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8Ci0gICAgICAiKCIgPDwgcHJvdF9wdHIgPDwgIiBwcm90KSA6IiA8PAotICAgICAgZW5kbDsKLSAgICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhwcm90KSwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhwcm90KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90XyA9IHByb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXggPDwKLSAgICAgICAgIihwcm90LCBwcm90KSB7fSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8Ci0gICAgICAiKCIgPDwgcHJvdF9wdHIgPDwgIiBpcHJvdCwgIiA8PCBwcm90X3B0ciA8PCAiIG9wcm90KSA6IiA8PCBlbmRsOwotICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwaXByb3RfKGlwcm90KSwiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90XyhvcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8gPSBpcHJvdC5nZXQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3RfID0gb3Byb3QuZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXggPDwKLSAgICAgICAgIihpcHJvdCwgb3Byb3QpIHt9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIEdlbmVyYXRlIGdldHRlcnMgZm9yIHRoZSBwcm90b2NvbHMuCi0gICAgLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBub3QgY3VycmVudGx5IHRlbXBsYXRlZCBmb3Igc2ltcGxpY2l0eS4KLSAgICAvLyBUT0RPKHNpbXBraW5zKTogc2hvdWxkIHRoZXkgYmUgdGVtcGxhdGVkPwotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRJbnB1dFByb3RvY29sKCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgInBpcHJvdF87IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBnZXRPdXRwdXRQcm90b2NvbCgpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwb3Byb3RfOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIC8qIGlmIChzdHlsZSA9PSAiQ29iIikgKi8gewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PCAiQ2xpZW50IiA8PCBzaG9ydF9zdWZmaXggPDwgIigiIDw8Ci0gICAgICAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsLCAiIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSkgOiIgPDwKLSAgICAgIGVuZGw7Ci0gICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGNoYW5uZWxfKGNoYW5uZWwpLCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpdHJhbnNfKG5ldyA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIoKSksIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIG90cmFuc18obmV3IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcigpKSwiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgLy8gVFByb3RvY29sRmFjdG9yeSBjbGFzc2VzIHJldHVybiBnZW5lcmljIFRQcm90b2NvbCBwb2ludGVycy4KLSAgICAgICAgLy8gV2UgaGF2ZSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIFByb3RvY29sXyB0eXBlIHdlIGFyZSBleHBlY3RpbmcuCi0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHBpcHJvdF8oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIiA8PAotICAgICAgICAgICJwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKGl0cmFuc18pKSksIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcG9wcm90Xyhib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiIDw8Ci0gICAgICAgICAgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wob3RyYW5zXykpKSB7IiA8PCBlbmRsOwotICAgICAgICAvLyBUaHJvdyBhIFRFeGNlcHRpb24gaWYgZWl0aGVyIGR5bmFtaWMgY2FzdCBmYWlsZWQuCi0gICAgICAgIGZfaGVhZGVyXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmICghcGlwcm90XyB8fCAhcG9wcm90XykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgdGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihcIiIgPDwKLSAgICAgICAgICAiVFByb3RvY29sRmFjdG9yeSByZXR1cm5lZCB1bmV4cGVjdGVkIHByb3RvY29sIHR5cGUgaW4gIiA8PAotICAgICAgICAgIHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8Ci0gICAgICAgICAgIiBjb25zdHJ1Y3RvclwiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcGlwcm90Xyhwcm90b2NvbEZhY3RvcnktPmdldFByb3RvY29sKGl0cmFuc18pKSwiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHBvcHJvdF8ocHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkgeyIgPDwKLSAgICAgICAgICBlbmRsOwotICAgICAgfQotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90XyA9IHBpcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIG9wcm90XyA9IHBvcHJvdF8uZ2V0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8IHN0eWxlIDw8IGNsaWVudF9zdWZmaXggPDwKLSAgICAgICAgIihjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkpIHt9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgIGZfaGVhZGVyXyA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJjaGFubmVsXzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGlmICghZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsIHZvaWQgY29tcGxldGVkX18oYm9vbCAvKiBzdWNjZXNzICovKSB7fSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgaWZzdHlsZSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBVc2UgcHJpdmF0ZSBpbmhlcml0YW5jZSB0byBhdm9pZCBnZW5lcmF0aW5nIHRoaXNlIGluIGNvYi1zdHlsZS4KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLSAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgIiIpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChzdHlsZSA9PSAiQ29iIikgewotICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWxfOyIgIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGl0cmFuc187IiAgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb3RyYW5zXzsiICA8PCBlbmRsOwotICAgIH0KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8IHByb3RfcHRyIDw8ICIgcGlwcm90XzsiICA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcm90X3B0ciA8PCAiIHBvcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBpcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJvdG9jb2xfdHlwZSA8PCAiKiBvcHJvdF87IiAgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICAifTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIC8vIE91dHB1dCBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHR5cGVkZWYgdXNpbmcKLSAgICAvLyBUUHJvdG9jb2wgYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlci4KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICJ0eXBlZGVmICIgPDwgc2VydmljZV9uYW1lXyA8PCBzdHlsZSA8PAotICAgICAgIkNsaWVudFQ8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+ICIgPDwKLSAgICAgIHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudDsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgc2NvcGUgPSBzZXJ2aWNlX25hbWVfICsgc3R5bGUgKyBjbGllbnRfc3VmZml4ICsgIjo6IjsKLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgaW5kZW50KG91dCkgPDwgdGVtcGxhdGVfaGVhZGVyOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGlmc3R5bGUsIHNjb3BlKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICAvLyBHZXQgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBjYWxsIHBhcmFtcwotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgLy8gRGVjbGFyZSB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGlmIChpc19jb21wbGV4X3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgICAgICAgICAgb3V0IDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKF9yZXR1cm4pOyIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJyZXR1cm4gcmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImNoYW5uZWxfLT5zZW5kQW5kUmVjdk1lc3NhZ2UoIiA8PAotICAgICAgICAgICJzdGQ6OnRyMTo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpLCAiIDw8Ci0gICAgICAgICAgX3RoaXMgPDwgIml0cmFuc18uZ2V0KCkpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAiY2hhbm5lbF8tPnNlbmRNZXNzYWdlKCIgPDwKLSAgICAgICAgICAic3RkOjp0cjE6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAvL2lmIChzdHlsZSAhPSAiQ29iIikgLy8gVE9ETyhkcmVpc3MpOiBMaWJpZnkgdGhlIGNsaWVudCBhbmQgZG9uJ3QgZ2VuZXJhdGUgdGhpcyBmb3IgY29iLXN0eWxlCi0gICAgaWYgKHRydWUpIHsKLSAgICAgIC8vIEZ1bmN0aW9uIGZvciBzZW5kaW5nCi0gICAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICAgIC8vIE9wZW4gdGhlIHNlbmQgZnVuY3Rpb24KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAgIC8vIEZ1bmN0aW9uIGFyZ3VtZW50cyBhbmQgcmVzdWx0cwotICAgICAgc3RyaW5nIGFyZ3NuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3BhcmdzIjsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3ByZXN1bHQiOwotCi0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW50MzJfdCBjc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQ0FMTCwgY3NlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3M7IiA8PCBlbmRsOwotCi0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAmIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgX3RoaXMgPDwgIm9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgIm9wcm90Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJvcHJvdF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBfdGhpcyA8PCAib3Byb3RfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICAvLyBHZW5lcmF0ZSByZWN2IGZ1bmN0aW9uIG9ubHkgaWYgbm90IGFuIG9uZXdheSBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgLy8gT3BlbiB0aGUgcmVjdiBmdW5jdGlvbgotICAgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCB0ZW1wbGF0ZV9oZWFkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sICIiLCBzY29wZSkgPDwgZW5kbDsKLSAgICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImludDMyX3QgcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic3RkOjpzdHJpbmcgZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGUgbXR5cGU7IiA8PCBlbmRsOwotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJib29sIGNvbXBsZXRlZCA9IGZhbHNlOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiOwotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChtdHlwZSA9PSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geDsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB4LnJlYWQoIiA8PCBfdGhpcyA8PCAiaXByb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBfdGhpcyA8PCAiaXByb3RfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwKLSAgICAgICAgICBlbmRsOwotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAobXR5cGUgIT0gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFkpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnNraXAoIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKGZhbHNlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGZuYW1lLmNvbXBhcmUoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpICE9IDApIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPnNraXAoIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1QpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgX3RoaXMgPDwgImlwcm90Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IF90aGlzIDw8ICJpcHJvdF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PAotICAgICAgICAgIGVuZGw7Ci0gICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKGZhbHNlKTsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSAmJgotICAgICAgICAgICAgIWlzX2NvbXBsZXhfdHlwZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgICAgdF9maWVsZCByZXR1cm5maWVsZCgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksICJfcmV0dXJuIik7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZyZXR1cm5maWVsZCkgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOwotCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICZfcmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IF90aGlzIDw8ICJpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IF90aGlzIDw8ICJpcHJvdF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgX3RoaXMgPDwgImlwcm90Xy0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBlbmRsOwotCi0gICAgICAgIC8vIENhcmVmdWwsIG9ubHkgbG9vayBmb3IgX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgICBpZiAoaXNfY29tcGxleF90eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgLy8gX3JldHVybiBwb2ludGVyIGhhcyBub3cgYmVlbiBmaWxsZWQiIDw8IGVuZGw7Ci0gICAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGlmIChzdHlsZSA9PSAiQ29iIiAmJiAhZ2VuX25vX2NsaWVudF9jb21wbGV0aW9uXykgewotICAgICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gX3JldHVybjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWQgPSB0cnVlOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBjb21wbGV0ZWRfXyh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCAgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGFyZSBhIHZvaWQgZnVuY3Rpb24KLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgaWYgKHN0eWxlID09ICJDb2IiICYmICFnZW5fbm9fY2xpZW50X2NvbXBsZXRpb25fKSB7Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImNvbXBsZXRlZCA9IHRydWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJjb21wbGV0ZWRfXyh0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiY29tcGxldGVkID0gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImNvbXBsZXRlZF9fKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uKDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3R5bGUgPT0gIkNvYiIgJiYgIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0gY2F0Y2ggKC4uLikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgKCFjb21wbGV0ZWQpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgY29tcGxldGVkX18oZmFsc2UpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3c7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICAgIG91dCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1jbGFzcyBQcm9jZXNzb3JHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgUHJvY2Vzc29yR2VuZXJhdG9yKHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yLCB0X3NlcnZpY2UqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0eWxlKTsKLQotICB2b2lkIHJ1bigpIHsKLSAgICBnZW5lcmF0ZV9jbGFzc19kZWZpbml0aW9uKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2hDYWxsKCkgZnVuY3Rpb24KLSAgICBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGZhbHNlKTsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGdlbmVyYXRlX2Rpc3BhdGNoX2NhbGwodHJ1ZSk7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgYWxsIG9mIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7Ci0KLSAgICBnZW5lcmF0ZV9mYWN0b3J5KCk7Ci0gIH0KLQotICB2b2lkIGdlbmVyYXRlX2NsYXNzX2RlZmluaXRpb24oKTsKLSAgdm9pZCBnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25zKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmFjdG9yeSgpOwotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl90eXBlZGVmPWZhbHNlLCBib29sIGFyZz1mYWxzZSkgewotICAgIHJldHVybiBnZW5lcmF0b3JfLT50eXBlX25hbWUodHR5cGUsIGluX3R5cGVkZWYsIGFyZyk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBpbmRlbnQoKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcl8tPmluZGVudCgpOwotICB9Ci0gIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSAmb3MpIHsKLSAgICByZXR1cm4gZ2VuZXJhdG9yXy0+aW5kZW50KG9zKTsKLSAgfQotCi0gIHZvaWQgaW5kZW50X3VwKCkgewotICAgIGdlbmVyYXRvcl8tPmluZGVudF91cCgpOwotICB9Ci0gIHZvaWQgaW5kZW50X2Rvd24oKSB7Ci0gICAgZ2VuZXJhdG9yXy0+aW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIHRfY3BwX2dlbmVyYXRvciogZ2VuZXJhdG9yXzsKLSAgdF9zZXJ2aWNlKiBzZXJ2aWNlXzsKLSAgc3RkOjpvZnN0cmVhbSYgZl9oZWFkZXJfOwotICBzdGQ6Om9mc3RyZWFtJiBmX291dF87Ci0gIHN0cmluZyBzZXJ2aWNlX25hbWVfOwotICBzdHJpbmcgc3R5bGVfOwotICBzdHJpbmcgcHN0eWxlXzsKLSAgc3RyaW5nIGNsYXNzX25hbWVfOwotICBzdHJpbmcgaWZfbmFtZV87Ci0gIHN0cmluZyBmYWN0b3J5X2NsYXNzX25hbWVfOwotICBzdHJpbmcgZmluaXNoX2NvYl87Ci0gIHN0cmluZyBmaW5pc2hfY29iX2RlY2xfOwotICBzdHJpbmcgcmV0X3R5cGVfOwotICBzdHJpbmcgY2FsbF9jb250ZXh0XzsKLSAgc3RyaW5nIGNvYl9hcmdfOwotICBzdHJpbmcgY2FsbF9jb250ZXh0X2FyZ187Ci0gIHN0cmluZyBjYWxsX2NvbnRleHRfZGVjbF87Ci0gIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXJfOwotICBzdHJpbmcgdGVtcGxhdGVfc3VmZml4XzsKLSAgc3RyaW5nIHR5cGVuYW1lX3N0cl87Ci0gIHN0cmluZyBjbGFzc19zdWZmaXhfOwotICBzdHJpbmcgZXh0ZW5kc187Ci19OwotCi1Qcm9jZXNzb3JHZW5lcmF0b3I6OlByb2Nlc3NvckdlbmVyYXRvcih0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc3R5bGUpCi0gIDogZ2VuZXJhdG9yXyhnZW5lcmF0b3IpLAotICAgIHNlcnZpY2VfKHNlcnZpY2UpLAotICAgIGZfaGVhZGVyXyhnZW5lcmF0b3ItPmZfaGVhZGVyXyksCi0gICAgZl9vdXRfKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18gPwotICAgICAgICAgICBnZW5lcmF0b3ItPmZfc2VydmljZV90Y2NfIDogZ2VuZXJhdG9yLT5mX3NlcnZpY2VfKSwKLSAgICBzZXJ2aWNlX25hbWVfKGdlbmVyYXRvci0+c2VydmljZV9uYW1lXyksCi0gICAgc3R5bGVfKHN0eWxlKSB7Ci0gIGlmIChzdHlsZV8gPT0gIkNvYiIpIHsKLSAgICBwc3R5bGVfID0gIkFzeW5jIjsKLSAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyBwc3R5bGVfICsgIlByb2Nlc3NvciI7Ci0gICAgaWZfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgIkNvYlN2SWYiOwotCi0gICAgZmluaXNoX2NvYl8gPSAic3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKLSAgICBmaW5pc2hfY29iX2RlY2xfID0gInN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiwgIjsKLSAgICBjb2JfYXJnXyA9ICJjb2IsICI7Ci0gICAgcmV0X3R5cGVfID0gInZvaWQgIjsKLSAgfSBlbHNlIHsKLSAgICBjbGFzc19uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKLSAgICBpZl9uYW1lXyA9IHNlcnZpY2VfbmFtZV8gKyAiSWYiOwotCi0gICAgcmV0X3R5cGVfID0gImJvb2wgIjsKLSAgICAvLyBUT0RPKGVkaGFsbCkgY2FsbENvbnRleHQgc2hvdWxkIGV2ZW50dWFsbHkgYmUgYWRkZWQgdG8gVEFzeW5jUHJvY2Vzc29yCi0gICAgY2FsbF9jb250ZXh0XyA9ICIsIHZvaWQqIGNhbGxDb250ZXh0IjsKLSAgICBjYWxsX2NvbnRleHRfYXJnXyA9ICIsIGNhbGxDb250ZXh0IjsKLSAgICBjYWxsX2NvbnRleHRfZGVjbF8gPSAiLCB2b2lkKiI7Ci0gIH0KLQotICBmYWN0b3J5X2NsYXNzX25hbWVfID0gY2xhc3NfbmFtZV8gKyAiRmFjdG9yeSI7Ci0KLSAgaWYgKGdlbmVyYXRvci0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICB0ZW1wbGF0ZV9oZWFkZXJfID0gInRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+XG4iOwotICAgIHRlbXBsYXRlX3N1ZmZpeF8gPSAiPFByb3RvY29sXz4iOwotICAgIHR5cGVuYW1lX3N0cl8gPSAidHlwZW5hbWUgIjsKLSAgICBjbGFzc19uYW1lXyArPSAiVCI7Ci0gICAgZmFjdG9yeV9jbGFzc19uYW1lXyArPSAiVCI7Ci0gIH0KLQotICBpZiAoc2VydmljZV8tPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfID0gdHlwZV9uYW1lKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpKSArIHBzdHlsZV8gKyAiUHJvY2Vzc29yIjsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBJZiBnZW5fdGVtcGxhdGVzXyBpcyBlbmFibGVkLCB3ZSBjdXJyZW50bHkgYXNzdW1lIGFsbAotICAgICAgLy8gcGFyZW50IHNlcnZpY2VzIHdlcmUgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0ZW1wbGF0ZXMgZW5hYmxlZC4KLSAgICAgIGV4dGVuZHNfICs9ICJUPFByb3RvY29sXz4iOwotICAgIH0KLSAgfQotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfY2xhc3NfZGVmaW5pdGlvbigpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSBzZXJ2aWNlXy0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHBhcmVudF9jbGFzczsKLSAgaWYgKHNlcnZpY2VfLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBwYXJlbnRfY2xhc3MgPSBleHRlbmRzXzsKLSAgfSBlbHNlIHsKLSAgICBpZiAoc3R5bGVfID09ICJDb2IiKSB7Ci0gICAgICBwYXJlbnRfY2xhc3MgPSAiOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIjsKLSAgICB9IGVsc2UgewotICAgICAgcGFyZW50X2NsYXNzID0gIjo6YXBhY2hlOjp0aHJpZnQ6OlREaXNwYXRjaFByb2Nlc3NvciI7Ci0gICAgfQotCi0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgICBwYXJlbnRfY2xhc3MgKz0gIlQ8UHJvdG9jb2xfPiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgIHRlbXBsYXRlX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBjbGFzc19uYW1lXyA8PCAiIDogcHVibGljICIgPDwgcGFyZW50X2NsYXNzIDw8ICIgeyIgPDwgZW5kbDsKLQotICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCi0gIGZfaGVhZGVyXyA8PAotICAgICIgcHJvdGVjdGVkOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ2aXJ0dWFsICIgPDwgcmV0X3R5cGVfIDw8ICJkaXNwYXRjaENhbGwoIiA8PCBmaW5pc2hfY29iXyA8PAotICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90LCAiIDw8Ci0gICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIgPDwKLSAgICAgICJjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQiIDw8IGNhbGxfY29udGV4dF8gPDwgIik7IiA8PAotICAgICAgZW5kbDsKLSAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCIgPDwKLSAgICAgICAgZmluaXNoX2NvYl8gPDwgIlByb3RvY29sXyogaXByb3QsIFByb3RvY29sXyogb3Byb3QsICIgPDwKLSAgICAgICAgImNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCIgPDwgY2FsbF9jb250ZXh0XyA8PCAiKTsiIDw8Ci0gICAgICAgIGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBQcm9jZXNzIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotICBmX2hlYWRlcl8gPDwKLSAgICAiIHByaXZhdGU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBEZWNsYXJlIHByb2Nlc3NNYXBfCi0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmICB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiIDw8Ci0gICAgICAiUHJvY2Vzc0Z1bmN0aW9uKSgiIDw8IGZpbmlzaF9jb2JfZGVjbF8gPDwgImludDMyX3QsICIgPDwKLSAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiwgIiA8PAotICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PAotICAgICAgZW5kbDsKLSAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHlwZWRlZiB2b2lkICgiIDw8IGNsYXNzX25hbWVfIDw8ICI6OioiIDw8Ci0gICAgICAgICJTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbikoIiA8PCBmaW5pc2hfY29iX2RlY2xfIDw8ICJpbnQzMl90LCAiIDw8Ci0gICAgICAgICJQcm90b2NvbF8qLCBQcm90b2NvbF8qIiA8PCBjYWxsX2NvbnRleHRfZGVjbF8gPDwgIik7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3RydWN0IFByb2Nlc3NGdW5jdGlvbnMgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgUHJvY2Vzc0Z1bmN0aW9uIGdlbmVyaWM7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBTcGVjaWFsaXplZFByb2Nlc3NGdW5jdGlvbiBzcGVjaWFsaXplZDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoUHJvY2Vzc0Z1bmN0aW9uIGcsICIgPDwKLSAgICAgICAgIlNwZWNpYWxpemVkUHJvY2Vzc0Z1bmN0aW9uIHMpIDoiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgZ2VuZXJpYyhnKSwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgc3BlY2lhbGl6ZWQocykge30iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIFByb2Nlc3NGdW5jdGlvbnMoKSA6IGdlbmVyaWMoTlVMTCksIHNwZWNpYWxpemVkKE5VTEwpICIgPDwKLSAgICAgICAgInt9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb25zPiAiIDw8Ci0gICAgICAgICJQcm9jZXNzTWFwOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+ICIgPDwKLSAgICAgICAgIlByb2Nlc3NNYXA7IiA8PCBlbmRsOwotICB9Ci0gIGZfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICJQcm9jZXNzTWFwIHByb2Nlc3NNYXBfOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX2hlYWRlcl8pIDw8Ci0gICAgICAidm9pZCBwcm9jZXNzXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBmaW5pc2hfY29iXyA8PCAiaW50MzJfdCBzZXFpZCwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaXByb3QsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90IiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8Ci0gICAgICAgICJ2b2lkIHByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IGZpbmlzaF9jb2JfIDw8Ci0gICAgICAgICJpbnQzMl90IHNlcWlkLCBQcm90b2NvbF8qIGlwcm90LCBQcm90b2NvbF8qIG9wcm90IiA8PAotICAgICAgICBjYWxsX2NvbnRleHRfIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKHN0eWxlXyA9PSAiQ29iIikgewotICAgICAgLy8gWFhYIEZhY3RvciB0aGlzIG91dCwgZXZlbiBpZiBpdCBpcyBhIHBhaW4uCi0gICAgICBzdHJpbmcgcmV0X2FyZyA9ICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgOiAiLCBjb25zdCAiICsgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgKyAiJiBfcmV0dXJuIik7Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PAotICAgICAgICAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QsICIgPDwKLSAgICAgICAgInZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgcmV0dXJuXyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgICAgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0Ci0gICAgICBmX2hlYWRlcl8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgdm9pZCogY3R4LCAiIDw8Ci0gICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgICAgZl9oZWFkZXJfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgICAiUHJvdG9jb2xfKiBvcHJvdCwgdm9pZCogY3R4LCAiIDw8Ci0gICAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmX2hlYWRlcl8gPDwKLSAgICAiIHB1YmxpYzoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBjbGFzc19uYW1lXyA8PAotICAgICIoYm9vc3Q6OnNoYXJlZF9wdHI8IiA8PCBpZl9uYW1lXyA8PCAiPiBpZmFjZSkgOiIgPDwgZW5kbDsKLSAgaWYgKCFleHRlbmRzXy5lbXB0eSgpKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGV4dGVuZHNfIDw8ICIoaWZhY2UpLCIgPDwgZW5kbDsKLSAgfQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZmFjZV8oaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCJdID0gIjsKLSAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGZfaGVhZGVyXyA8PCAiUHJvY2Vzc0Z1bmN0aW9ucygiIDw8IGVuZGw7Ci0gICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc19vbmx5XykgewotICAgICAgICBpbmRlbnQoZl9oZWFkZXJfKSA8PCAiICBOVUxMLCIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX2hlYWRlcl8pIDw8ICIgICYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX2hlYWRlcl8gPDwgIiYiIDw8IGNsYXNzX25hbWVfIDw8ICI6OnByb2Nlc3NfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfaGVhZGVyXyA8PAotICAgICAgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCBjbGFzc19uYW1lXyA8PCAiKCkge30iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgIC8vIEdlbmVyYXRlIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgdHlwZWRlZiwgZm9yIGNhbGxlcnMgd2hvIGRvbid0IGtub3cKLSAgICAvLyBhYm91dCB0aGUgbmV3IHRlbXBsYXRlLXN0eWxlIGNvZGUuCi0gICAgLy8KLSAgICAvLyBXZSBjYW4ndCB1c2UgVFByb3RvY29sIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHNpbmNlIFByb2Nlc3NvclQKLSAgICAvLyBwcm92aWRlcyBvdmVybG9hZGVkIHZlcnNpb25zIG9mIG1vc3QgbWV0aG9kcywgb25lIG9mIHdoaWNoIGFjY2VwdHMKLSAgICAvLyBUUHJvdG9jb2wgcG9pbnRlcnMsIGFuZCBvbmUgd2hpY2ggYWNjZXB0cyBQcm90b2NvbF8gcG9pbnRlcnMuICBUaGlzCi0gICAgLy8gcmVzdWx0cyBpbiBhIGNvbXBpbGUgZXJyb3IgaWYgaW5zdGFudGlhdGVkIHdpdGggUHJvdG9jb2xfID09IFRQcm90b2NvbC4KLSAgICAvLyBUaGVyZWZvcmUsIHdlIGRlZmluZSBURHVtbXlQcm90b2NvbCBzb2xlbHkgc28gd2UgY2FuIHVzZSBpdCBhcyB0aGUKLSAgICAvLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaGVyZS4KLSAgICBmX2hlYWRlcl8gPDwKLSAgICAgICJ0eXBlZGVmICIgPDwgY2xhc3NfbmFtZV8gPDwKLSAgICAgICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIgPDwKLSAgICAgIHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXyA8PCAiUHJvY2Vzc29yOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgUHJvY2Vzc29yR2VuZXJhdG9yOjpnZW5lcmF0ZV9kaXNwYXRjaF9jYWxsKGJvb2wgdGVtcGxhdGVfcHJvdG9jb2wpIHsKLSAgc3RyaW5nIHByb3RvY29sID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wiOwotICBzdHJpbmcgZnVuY3Rpb25fc3VmZml4OwotICBpZiAodGVtcGxhdGVfcHJvdG9jb2wpIHsKLSAgICBwcm90b2NvbCA9ICJQcm90b2NvbF8iOwotICAgIC8vIFdlIGNhbGwgdGhlIGdlbmVyaWMgdmVyc2lvbiBkaXNwYXRjaENhbGwoKSwgYW5kIHRoZSBzcGVjaWFsaXplZAotICAgIC8vIHZlcnNpb24gZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKCkuICBXZSBjYW4ndCBjYWxsIHRoZW0gYm90aAotICAgIC8vIGRpc3BhdGNoQ2FsbCgpLCBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGlzc3VlIGEgd2FybmluZyBpZgotICAgIC8vIGEgc2VydmljZSB0aGF0IGRvZXNuJ3QgdXNlIHRlbXBsYXRlcyBpbmhlcml0cyBmcm9tIGEgc2VydmljZSB0aGF0IGRvZXMKLSAgICAvLyB1c2UgdGVtcGxhdGVzOiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHRoYXQgdGhlIHN1YmNsYXNzIG9ubHkgaW1wbGVtZW50cwotICAgIC8vIHRoZSBnZW5lcmljIHZlcnNpb24gb2YgZGlzcGF0Y2hDYWxsKCksIGFuZCBoaWRlcyB0aGUgdGVtcGxhdGVkIHZlcnNpb24uCi0gICAgLy8gVXNpbmcgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgotICAgIGZ1bmN0aW9uX3N1ZmZpeCA9ICJUZW1wbGF0ZWQiOwotICB9Ci0KLSAgZl9vdXRfIDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyXyA8PAotICAgIHJldF90eXBlXyA8PCBjbGFzc19uYW1lXyA8PAotICAgIHRlbXBsYXRlX3N1ZmZpeF8gPDwgIjo6ZGlzcGF0Y2hDYWxsIiA8PCBmdW5jdGlvbl9zdWZmaXggPDwgIigiIDw8Ci0gICAgZmluaXNoX2NvYl8gPDwgcHJvdG9jb2wgPDwgIiogaXByb3QsICIgPDwgcHJvdG9jb2wgPDwgIiogb3Byb3QsICIgPDwKLSAgICAiY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkIiA8PCBjYWxsX2NvbnRleHRfIDw8ICIpIHsiIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gSE9UOiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlciBtYXAKLSAgZl9vdXRfIDw8Ci0gICAgaW5kZW50KCkgPDwgdHlwZW5hbWVfc3RyXyA8PCAiUHJvY2Vzc01hcDo6aXRlcmF0b3IgcGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwZm4gPSBwcm9jZXNzTWFwXy5maW5kKGZuYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHBmbiA9PSBwcm9jZXNzTWFwXy5lbmQoKSkgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHNfLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90LT5nZXRUcmFuc3BvcnQoKS0+cmVhZEVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIrZm5hbWUrXCInXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUJlZ2luKGZuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICIgIHJldHVybiBjb2IodHJ1ZSk7IiA6ICIgIHJldHVybiB0cnVlOyIpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIgotICAgICAgICAgICAgICAgPDwgZXh0ZW5kc18gPDwgIjo6ZGlzcGF0Y2hDYWxsKCIKLSAgICAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiY29iLCAiIDogIiIpCi0gICAgICAgICAgICAgICA8PCAiaXByb3QsIG9wcm90LCBmbmFtZSwgc2VxaWQiIDw8IGNhbGxfY29udGV4dF9hcmdfIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgaWYgKHRlbXBsYXRlX3Byb3RvY29sKSB7Ci0gICAgZl9vdXRfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuc3BlY2lhbGl6ZWQpKSI7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfb25seV8pIHsKLSAgICAgIC8vIFRPRE86IFRoaXMgaXMgYSBudWxsIHBvaW50ZXIsIHNvIG5vdGhpbmcgZ29vZCB3aWxsIGNvbWUgZnJvbSBjYWxsaW5nCi0gICAgICAvLyBpdC4gIFRocm93IGFuIGV4Y2VwdGlvbiBpbnN0ZWFkLgotICAgICAgZl9vdXRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZC5nZW5lcmljKSkiOwotICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIGZfb3V0XyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKHRoaXMtPioocGZuLT5zZWNvbmQuZ2VuZXJpYykpIjsKLSAgICB9IGVsc2UgewotICAgICAgZl9vdXRfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodGhpcy0+KihwZm4tPnNlY29uZCkpIjsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICIoIiA8PCBjb2JfYXJnXyA8PCAic2VxaWQsIGlwcm90LCBvcHJvdCIgPDwKLSAgICBjYWxsX2NvbnRleHRfYXJnXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiByZXR1cm4gcGZuIHJldD8KLSAgaWYgKHN0eWxlXyA9PSAiQ29iIikgewotICAgIGZfb3V0XyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9vdXRfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9vdXRfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIFByb2Nlc3NvckdlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbnMoKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gc2VydmljZV8tPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewotICAgICAgZ2VuZXJhdG9yXy0+Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzZXJ2aWNlXywgKmZfaXRlciwgc3R5bGVfLCBmYWxzZSk7Ci0gICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0b3JfLT5nZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHNlcnZpY2VfLCAqZl9pdGVyLCBzdHlsZV8sIGZhbHNlKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBQcm9jZXNzb3JHZW5lcmF0b3I6OmdlbmVyYXRlX2ZhY3RvcnkoKSB7Ci0gIHN0cmluZyBpZl9mYWN0b3J5X25hbWUgPSBpZl9uYW1lXyArICJGYWN0b3J5IjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZmFjdG9yeSBjbGFzcyBkZWZpbml0aW9uCi0gIGZfaGVhZGVyXyA8PAotICAgIHRlbXBsYXRlX2hlYWRlcl8gPDwKLSAgICAiY2xhc3MgIiA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8Ci0gICAgICAiIDogcHVibGljIDo6YXBhY2hlOjp0aHJpZnQ6OiIgPDwKLSAgICAgICAgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yRmFjdG9yeSIgOiAgIlRQcm9jZXNzb3JGYWN0b3J5IikgPDwKLSAgICAgICAgIiB7IiA8PCBlbmRsIDw8Ci0gICAgIiBwdWJsaWM6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX2hlYWRlcl8gPDwKLSAgICBpbmRlbnQoKSA8PCBmYWN0b3J5X2NsYXNzX25hbWVfIDw8ICIoY29uc3QgOjpib29zdDo6c2hhcmVkX3B0cjwgIiA8PAotICAgICAgaWZfZmFjdG9yeV9uYW1lIDw8ICIgPiYgaGFuZGxlckZhY3RvcnkpIDoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIgPDwKLSAgICAgIChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAgIlRQcm9jZXNzb3IiKSA8PCAiID4gIiA8PAotICAgICAgImdldFByb2Nlc3Nvcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKTsiIDw8Ci0gICAgICBlbmRsOwotCi0gIGZfaGVhZGVyXyA8PAotICAgIGVuZGwgPDwKLSAgICAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgIiA8PCBpZl9mYWN0b3J5X25hbWUgPDwKLSAgICAgICIgPiBoYW5kbGVyRmFjdG9yeV87IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaGVhZGVyXyA8PAotICAgICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIElmIHdlIGFyZSBnZW5lcmF0aW5nIHRlbXBsYXRlcywgb3V0cHV0IGEgdHlwZWRlZiBmb3IgdGhlIHBsYWluCi0gIC8vIGZhY3RvcnkgbmFtZS4KLSAgaWYgKGdlbmVyYXRvcl8tPmdlbl90ZW1wbGF0ZXNfKSB7Ci0gICAgZl9oZWFkZXJfIDw8Ci0gICAgICAidHlwZWRlZiAiIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwKLSAgICAgICI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpURHVtbXlQcm90b2NvbCA+ICIgPDwKLSAgICAgIHNlcnZpY2VfbmFtZV8gPDwgcHN0eWxlXyA8PCAiUHJvY2Vzc29yRmFjdG9yeTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBnZXRQcm9jZXNzb3IoKSBtZXRob2QKLSAgZl9vdXRfIDw8Ci0gICAgdGVtcGxhdGVfaGVhZGVyXyA8PAotICAgIGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiIDw8Ci0gICAgICAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogICJUUHJvY2Vzc29yIikgPDwgIiA+ICIgPDwKLSAgICAgIGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpnZXRQcm9jZXNzb3IoIiA8PAotICAgICAgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfb3V0XyA8PAotICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpSZWxlYXNlSGFuZGxlcjwgIiA8PCBpZl9mYWN0b3J5X25hbWUgPDwKLSAgICAgICIgPiBjbGVhbnVwKGhhbmRsZXJGYWN0b3J5Xyk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8ICIgPDwgaWZfbmFtZV8gPDwgIiA+IGhhbmRsZXIoIiA8PAotICAgICAgImhhbmRsZXJGYWN0b3J5Xy0+Z2V0SGFuZGxlcihjb25uSW5mbyksIGNsZWFudXApOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiIDw8Ci0gICAgICAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogICJUUHJvY2Vzc29yIikgPDwgIiA+ICIgPDwKLSAgICAgICJwcm9jZXNzb3IobmV3ICIgPDwgY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PAotICAgICAgIihoYW5kbGVyKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBwcm9jZXNzb3I7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfb3V0XyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgcHJvY2Vzc29yIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvY2Vzc29yIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlKSB7Ci0gIFByb2Nlc3NvckdlbmVyYXRvciBnZW5lcmF0b3IodGhpcywgdHNlcnZpY2UsIHN0eWxlKTsKLSAgZ2VuZXJhdG9yLnJ1bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UpOwotICBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG91dCwgJnJlc3VsdCk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgJnJlc3VsdCk7Ci0KLSAgcmVzdWx0LnNldF9uYW1lKHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9wcmVzdWx0Iik7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfaGVhZGVyXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUsIGdlbl9jb2Jfc3R5bGVfKTsKLSAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsICZyZXN1bHQsIHRydWUpOwotICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgJnJlc3VsdCwgdHJ1ZSk7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNwZWNpYWxpemVkKSB7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBzdHJpbmcgc2VydmljZV9mdW5jX25hbWUgPSAiXCIiICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiLiIgKwotICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJcIiI7Ci0KLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKLQotICBzdHJpbmcgcHJvdF90eXBlID0KLSAgICAoc3BlY2lhbGl6ZWQgPyAiUHJvdG9jb2xfIiA6ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIik7Ci0gIHN0cmluZyBjbGFzc19zdWZmaXg7Ci0gIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgIGNsYXNzX3N1ZmZpeCA9ICJUPFByb3RvY29sXz4iOwotICB9Ci0KLSAgLy8gSSB0cmllZCB0byBkbyB0aGlzIGFzIG9uZSBmdW5jdGlvbi4gIEkgcmVhbGx5IGRpZC4gIEJ1dCBpdCB3YXMgdG9vIGhhcmQuCi0gIGlmIChzdHlsZSAhPSAiQ29iIikgewotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGNvbnN0IGJvb2wgdW5uYW1lZF9vcHJvdF9zZXFpZCA9IHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYKLSAgICAgICEoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKTsKLSAgICBvdXQgPDwKLSAgICAgICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OiIgPDwKLSAgICAgICJwcm9jZXNzXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PAotICAgICAgImludDMyX3QiIDw8ICh1bm5hbWVkX29wcm90X3NlcWlkID8gIiwgIiA6ICIgc2VxaWQsICIpIDw8Ci0gICAgICBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwKLSAgICAgIHByb3RfdHlwZSA8PCAiKiIgPDwgKHVubmFtZWRfb3Byb3Rfc2VxaWQgPyAiLCAiIDogIiBvcHJvdCwgIikgPDwKLSAgICAgICJ2b2lkKiBjYWxsQ29udGV4dCkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICJfYXJncyI7Ci0gICAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgICAiX3Jlc3VsdCI7Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdW5uYW1lZF9vcHJvdF9zZXFpZCkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInZvaWQqIGN0eCA9IE5VTEw7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8Ci0gICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIGNhbGxDb250ZXh0KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiIDw8Ci0gICAgICAgICJ0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpLCBjdHgsICIgPDwgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PAotICAgICAgICBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wcmVSZWFkKGN0eCwgIiA8PAotICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJnczsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gaXByb3QtPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7IiA8PAotICAgICAgICBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICAvLyBEZWNsYXJlIHJlc3VsdAotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQ7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFRyeSBibG9jayBmb3IgZnVuY3Rpb25zIHdpdGggZXhjZXB0aW9ucwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpKSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIG91dCA8PCAiaWZhY2VfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHJlc3VsdC5zdWNjZXNzIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICB9Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuc3VjY2VzcyA9IHRydWU7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLQotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PAotICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0Ll9faXNzZXQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAgICAgIiA9IHRydWU7IiA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXQgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8ICIgY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PAotICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgoZS53aGF0KCkpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmFzeW5jQ29tcGxldGUoY3R4LCAiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQgaW50byBhIHN0cnVjdAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PAotICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiXCIsIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1JFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnl0ZXMgPSBvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPndyaXRlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cG9zdFdyaXRlKGN0eCwgIiA8PAotICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgLy8gQ29iIHN0eWxlLgotICBlbHNlIHsKLSAgICAvLyBQcm9jZXNzb3IgZW50cnkgcG9pbnQuCi0gICAgLy8gVE9ETyhlZGhhbGwpIHVwZGF0ZSBmb3IgY2FsbENvbnRleHQgd2hlbiBURXZlbnRTZXJ2ZXIgaXMgcmVhZHkKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgIjo6cHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICBwcm90X3R5cGUgPDwgIiogaXByb3QsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90KSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gVE9ETyhzaW1wa2lucyk6IHdlIGNvdWxkIHRyeSB0byBjb25zb2xkYXRlIHRoaXMKLSAgICAvLyB3aXRoIHRoZSBub24tY29iIGNvZGUgYWJvdmUKLSAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAvLyBJZiB0aGVzZSBhcmUgaW5zdGFuY2VzIG9mIFByb3RvY29sXywgaW5zdGVhZCBvZiBhbnkgb2xkIFRQcm90b2NvbCwKLSAgICAgIC8vIHVzZSB0aGUgc3BlY2lhbGl6ZWQgcHJvY2VzcyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9pcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihpcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbF8qIF9vcHJvdCA9IGR5bmFtaWNfY2FzdDxQcm90b2NvbF8qPihvcHJvdCk7IiA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoX2lwcm90ICYmIF9vcHJvdCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKGNvYiwgc2VxaWQsIF9pcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBpcHJvdCwgX2lwcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgc2VxaWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIodm9pZCkgb3Byb3Q7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIl9hcmdzIGFyZ3M7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidm9pZCogY3R4ID0gTlVMTDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBjdHggPSB0aGlzLT5ldmVudEhhbmRsZXJfLT5nZXRDb250ZXh0KCIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JDb250ZXh0RnJlZXIgZnJlZXIoIiA8PAotICAgICAgICAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwKLSAgICAgICAgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlUmVhZChjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MucmVhZChpcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgYnl0ZXMgPSBpcHJvdC0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsiIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0UmVhZChjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgLy8gVE9ETyhkcmVpc3MpOiBIYW5kbGUgVEV4Y2VwdGlvbnM/ICBFeHBvc2UgdG8gc2VydmVyPwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXhuKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPmhhbmRsZXJFcnJvcihjdHgsICIgPDwKLSAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gY29iKGZhbHNlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5hc3luY0NvbXBsZXRlKGN0eCwgIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBGaWd1cmUgb3V0IGEgc3RyYXRlZ3kgZm9yIGV4Y2VwdGlvbnMgaW4gYXN5bmMgaGFuZGxlcnMuCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnJlZXIudW5yZWdpc3RlcigpOyIgPDwgZW5kbDsKLSAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgLy8gTm8gcmV0dXJuLiAgSnVzdCBoYW5kIG9mZiBvdXIgY29iLgotICAgICAgLy8gVE9ETyhkcmVpc3MpOiBDYWxsIHRoZSBjb2IgaW1tZWRpYXRlbHk/Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8Ci0gICAgICAgICJzdGQ6OnRyMTo6YmluZChjb2IsIHRydWUpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdHJpbmcgcmV0X2FyZywgcmV0X3BsYWNlaG9sZGVyOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXRfYXJnID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsKLSAgICAgICAgICAiJiBfcmV0dXJuIjsKLSAgICAgICAgcmV0X3BsYWNlaG9sZGVyID0gIiwgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEiOwotICAgICAgfQotCi0gICAgICAvLyBXaGVuIGdlbl90ZW1wbGF0ZXNfIGlzIHRydWUsIHRoZSByZXR1cm5fIGFuZCB0aHJvd18gZnVuY3Rpb25zIGFyZQotICAgICAgLy8gb3ZlcmxvYWRlZC4gIFdlIGhhdmUgdG8gZGVjbGFyZSBwb2ludGVycyB0byB0aGVtIHNvIHRoYXQgdGhlIGNvbXBpbGVyCi0gICAgICAvLyBjYW4gcmVzb2x2ZSB0aGUgY29ycmVjdCBvdmVybG9hZGVkIHZlcnNpb24uCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICBjbGFzc19zdWZmaXggPDwgIjo6KnJldHVybl9mbikoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIgPDwKLSAgICAgICAgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwKLSAgICAgICAgcmV0X2FyZyA8PCAiKSA9IiA8PCBlbmRsOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwKLSAgICAgICAgY2xhc3Nfc3VmZml4IDw8ICI6OnJldHVybl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PAotICAgICAgICAgIGNsYXNzX3N1ZmZpeCA8PCAiOjoqdGhyb3dfZm4pKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiAiIDw8Ci0gICAgICAgICAgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIiA8PAotICAgICAgICAgICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KSA9IiA8PCBlbmRsOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8Ci0gICAgICAgICAgY2xhc3Nfc3VmZml4IDw8ICI6OnRocm93XyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmYWNlXy0+IiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInN0ZDo6dHIxOjpiaW5kKHJldHVybl9mbiwgdGhpcywgY29iLCBzZXFpZCwgb3Byb3QsIGN0eCIgPDwKLSAgICAgICAgcmV0X3BsYWNlaG9sZGVyIDw8ICIpIjsKLSAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0Ci0gICAgICAgICAgPDwgJywnIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAic3RkOjp0cjE6OmJpbmQodGhyb3dfZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCAiIDw8Ci0gICAgICAgICAgImN0eCwgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBYWFggV2hpdGVzcGFjZSBjbGVhbnVwLgotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBvdXQKLSAgICAgICAgICAgICAgICAgPDwgJywnIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIG91dCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsgaW5kZW50X2Rvd24oKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAvLyBOb3JtYWwgcmV0dXJuLgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJldF9hcmdfZGVjbCwgcmV0X2FyZ19uYW1lOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXRfYXJnX2RlY2wgPSAiLCBjb25zdCAiICsgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKwotICAgICAgICAgICImIF9yZXR1cm4iOwotICAgICAgICByZXRfYXJnX25hbWUgPSAiLCBfcmV0dXJuIjsKLSAgICAgIH0KLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgICAiOjpyZXR1cm5fIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiIDw8Ci0gICAgICAgIHByb3RfdHlwZSA8PCAiKiBvcHJvdCwgdm9pZCogY3R4IiA8PCByZXRfYXJnX2RlY2wgPDwgJyknIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICBpZiAoZ2VuX3RlbXBsYXRlc18gJiYgIXNwZWNpYWxpemVkKSB7Ci0gICAgICAgIC8vIElmIG9wcm90IGlzIGEgUHJvdG9jb2xfIGluc3RhbmNlLAotICAgICAgICAvLyB1c2UgdGhlIHNwZWNpYWxpemVkIHJldHVybiBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIihjb2IsIHNlcWlkLCBfb3Byb3QsIGN0eCIgPDwgcmV0X2FyZ19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJfcHJlc3VsdCByZXN1bHQ7IiA8PCBlbmRsOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAvLyBUaGUgY29uc3RfY2FzdCBoZXJlIGlzIHVuZm9ydHVuYXRlLCBidXQgaXQgd291bGQgYmUgYSBwYWluIHRvIGF2b2lkLAotICAgICAgICAvLyBhbmQgd2Ugb25seSBkbyBhIHdyaXRlIHdpdGggdGhpcyBzdHJ1Y3QsIHdoaWNoIGlzIGNvbnN0LXNhZmUuCi0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc3VjY2VzcyA9IGNvbnN0X2Nhc3Q8IiA8PAotICAgICAgICAgICAgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIio+KCZfcmV0dXJuKTsiIDw8Ci0gICAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LnN1Y2Nlc3MgPSB0cnVlOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0IGludG8gYSBzdHJ1Y3QKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGN0eCA9IHRoaXMtPmV2ZW50SGFuZGxlcl8tPmdldENvbnRleHQoIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIsIE5VTEwpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckNvbnRleHRGcmVlciBmcmVlcigiIDw8Ci0gICAgICAgICAgInRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCksIGN0eCwgIiA8PCBzZXJ2aWNlX2Z1bmNfbmFtZSA8PAotICAgICAgICAgICIpOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnByZVdyaXRlKGN0eCwgIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICJcIiwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCBieXRlcyA9IG9wcm90LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHRoaXMtPmV2ZW50SGFuZGxlcl8uZ2V0KCkgIT0gTlVMTCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLT5ldmVudEhhbmRsZXJfLT5wb3N0V3JpdGUoY3R4LCAiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgYnl0ZXMpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGNvYih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBFeGNlcHRpb24gcmV0dXJuLgotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwKLSAgICAgICAgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PAotICAgICAgICAiOjp0aHJvd18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwKLSAgICAgICAgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIgPDwKLSAgICAgICAgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAob3V0KTsKLQotICAgICAgaWYgKGdlbl90ZW1wbGF0ZXNfICYmICFzcGVjaWFsaXplZCkgewotICAgICAgICAvLyBJZiBvcHJvdCBpcyBhIFByb3RvY29sXyBpbnN0YW5jZSwKLSAgICAgICAgLy8gdXNlIHRoZSBzcGVjaWFsaXplZCB0aHJvdyBmdW5jdGlvbiBpbnN0ZWFkLgotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiUHJvdG9jb2xfKiBfb3Byb3QgPSBkeW5hbWljX2Nhc3Q8UHJvdG9jb2xfKj4ob3Byb3QpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChfb3Byb3QpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyb3dfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgICAiKGNvYiwgc2VxaWQsIF9vcHJvdCwgY3R4LCBfdGhyb3cpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlRfR0VORVJJQ19QUk9UT0NPTCh0aGlzLCBvcHJvdCwgX29wcm90KTsiIDw8Ci0gICAgICAgICAgZW5kbCA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBHZXQgdGhlIGV2ZW50IGhhbmRsZXIgY29udGV4dAotICAgICAgb3V0IDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY3R4ID0gdGhpcy0+ZXZlbnRIYW5kbGVyXy0+Z2V0Q29udGV4dCgiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIiwgTlVMTCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yQ29udGV4dEZyZWVyIGZyZWVyKCIgPDwKLSAgICAgICAgICAidGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSwgY3R4LCAiIDw8IHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIC8vIFRocm93IHRoZSBURGVsYXllZEV4Y2VwdGlvbiwgYW5kIGNhdGNoIHRoZSByZXN1bHQKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIl9yZXN1bHQgcmVzdWx0OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJfdGhyb3ctPnRocm93X2l0KCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKGZhbHNlKTsiIDw8IGVuZGw7ICAvLyBJcyB0aGlzIHBvc3NpYmxlPyAgVEJELgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAnfSc7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBvdXQgPDwgIiAgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiAmIiA8PAotICAgICAgICAgICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5fX2lzc2V0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAiID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIH0KLQotICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uIGlzIHRocm93bgotICAgICAgb3V0IDw8ICIgY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+aGFuZGxlckVycm9yKGN0eCwgIiA8PAotICAgICAgICAgIHNlcnZpY2VfZnVuY19uYW1lIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24geChlLndoYXQoKSk7IiA8PAotICAgICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIngud3JpdGUob3Byb3QpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAvLyBXZSBwYXNzIHRydWUgdG8gdGhlIGNvYiBoZXJlLCBzaW5jZSB3ZSBkaWQgc3VjY2Vzc2Z1bGx5IHdyaXRlIGEKLSAgICAgICAgLy8gcmVzcG9uc2UsIGV2ZW4gdGhvdWdoIGl0IGlzIGFuIGV4Y2VwdGlvbiByZXNwb25zZS4KLSAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB0aGUgYXJndW1lbnQgaXMgY3VycmVudGx5IGlnbm9yZWQsIGFueXdheS4KLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBjb2IodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgICAvLyBTZXJpYWxpemUgdGhlIHJlc3VsdCBpbnRvIGEgc3RydWN0Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLT5ldmVudEhhbmRsZXJfLmdldCgpICE9IE5VTEwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy0+ZXZlbnRIYW5kbGVyXy0+cHJlV3JpdGUoY3R4LCAiIDw8Ci0gICAgICAgICAgc2VydmljZV9mdW5jX25hbWUgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIlwiLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInVpbnQzMl90IGJ5dGVzID0gb3Byb3QtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOyIgPDwKLSAgICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAodGhpcy0+ZXZlbnRIYW5kbGVyXy5nZXQoKSAhPSBOVUxMKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMtPmV2ZW50SGFuZGxlcl8tPnBvc3RXcml0ZShjdHgsICIgPDwKLSAgICAgICAgICBzZXJ2aWNlX2Z1bmNfbmFtZSA8PCAiLCBieXRlcyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gY29iKHRydWUpOyIgPDwgZW5kbDsKLSAgICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0gLy8gZm9yIGVhY2ggZnVuY3Rpb24KLSAgfSAvLyBjb2Igc3R5bGUKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBza2VsZXRvbiBmaWxlIG9mIGEgc2VydmVyCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2tlbGV0b24odF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgc3ZjbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOwotCi0gIC8vIFNlcnZpY2UgaW1wbGVtZW50YXRpb24gZmlsZSBpbmNsdWRlcwotICBzdHJpbmcgZl9za2VsZXRvbl9uYW1lID0gZ2V0X291dF9kaXIoKStzdmNuYW1lKyJfc2VydmVyLnNrZWxldG9uLmNwcCI7Ci0KLSAgc3RyaW5nIG5zID0gbmFtZXNwYWNlX3ByZWZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiY3BwIikpOwotCi0gIG9mc3RyZWFtIGZfc2tlbGV0b247Ci0gIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICAiLy8gVGhpcyBhdXRvZ2VuZXJhdGVkIHNrZWxldG9uIGZpbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGJ1aWxkIGEgc2VydmVyLiIgPDwgZW5kbCA8PAotICAgICIvLyBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciBmaWxlbmFtZSB0byBhdm9pZCBvdmVyd3JpdGluZyBpdC4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIFwiIiA8PCBnZXRfaW5jbHVkZV9wcmVmaXgoKmdldF9wcm9ncmFtKCkpIDw8IHN2Y25hbWUgPDwgIi5oXCIiIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4iIDw8IGVuZGwgPDwKLSAgICAiI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPiIgPDwgZW5kbCA8PAotICAgICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+IiA8PCBlbmRsIDw8Ci0gICAgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwgPDwKLSAgICAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbCA8PAotICAgICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAidXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoIW5zLmVtcHR5KCkpIHsKLSAgICBmX3NrZWxldG9uIDw8Ci0gICAgICAidXNpbmcgbmFtZXNwYWNlICIgPDwgc3RyaW5nKG5zLCAwLCBucy5zaXplKCktMikgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gIH0KLQotICBmX3NrZWxldG9uIDw8Ci0gICAgImNsYXNzICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlciA6IHZpcnR1YWwgcHVibGljICIgPDwgc3ZjbmFtZSA8PCAiSWYgeyIgPDwgZW5kbCA8PAotICAgICIgcHVibGljOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2tlbGV0b24gPDwKLSAgICBpbmRlbnQoKSA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIC8vIFlvdXIgaW5pdGlhbGl6YXRpb24gZ29lcyBoZXJlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2tlbGV0b24gPDwKLSAgICAgIGluZGVudCgpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIikgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGltcGxlbWVudGF0aW9uIGdvZXMgaGVyZSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHJpbnRmKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlxcblwiKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9za2VsZXRvbiA8PAotICAgICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9za2VsZXRvbiA8PAotICAgIGluZGVudCgpIDw8ICJpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgaW5kZW50KCkgPDwgImludCBwb3J0ID0gOTA5MDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjwiIDw8IHN2Y25hbWUgPDwgIkhhbmRsZXI+IGhhbmRsZXIobmV3ICIgPDwgc3ZjbmFtZSA8PCAiSGFuZGxlcigpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3ICIgPDwgc3ZjbmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRTaW1wbGVTZXJ2ZXIgc2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NrZWxldG9uIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIENsb3NlIHRoZSBmaWxlcwotICBmX3NrZWxldG9uLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBpcHJvdC0+IjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICJyZWFkQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICJyZWFkSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyByZWFkZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgiZWNhc3QiKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpbnQzMl90ICIgPDwgdCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRJMzIoIiA8PCB0IDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIpIiA8PCB0IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInhmZXIgKz0gIiA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotCi0gIHRfY29udGFpbmVyKiB0Y29udGFpbmVyID0gKHRfY29udGFpbmVyKil0dHlwZTsKLSAgYm9vbCB1c2VfcHVzaCA9IHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuY2xlYXIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidWludDMyX3QgIiA8PCBzaXplIDw8ICI7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlICIgPDwga3R5cGUgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCB2dHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRNYXBCZWdpbigiIDw8Ci0gICAgICAgICAgICAgICAgICAga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSAiIDw8IGV0eXBlIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieGZlciArPSBpcHJvdC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgIiA8PCBldHlwZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInhmZXIgKz0gaXByb3QtPnJlYWRMaXN0QmVnaW4oIiA8PAotICAgICAgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpZiAoIXVzZV9wdXNoKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5yZXNpemUoIiA8PCBzaXplIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ1aW50MzJfdCAiIDw8IGkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICgiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLQotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCwgdXNlX3B1c2gsIGkpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ4ZmVyICs9IGlwcm90LT5yZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSBpcHJvdC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgPSAiIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl07IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotfQotCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5pbnNlcnQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9wdXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgpIHsKLSAgaWYgKHVzZV9wdXNoKSB7Ci0gICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0gICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaF9iYWNrKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBwcmVmaXggKyAiWyIgKyBpbmRleCArICJdIik7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotICB9Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSArIHN1ZmZpeDsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyB3cml0ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoKGludDMyX3QpIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgbmFtZS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PAotICAgICJ4ZmVyICs9ICIgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVNYXBCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzdGF0aWNfY2FzdDx1aW50MzJfdD4oIiA8PCBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInN0YXRpY19jYXN0PHVpbnQzMl90PigiIDw8IHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ4ZmVyICs9IG9wcm90LT53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAic3RhdGljX2Nhc3Q8dWludDMyX3Q+KCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIjo6Y29uc3RfaXRlcmF0b3IgIiA8PCBpdGVyIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZvciAoIiA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCAgPDwgIi5iZWdpbigpOyAiIDw8IGl0ZXIgPDwgIiAhPSAiIDw8IHByZWZpeCA8PCAiLmVuZCgpOyArKyIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInhmZXIgKz0gb3Byb3QtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAieGZlciArPSBvcHJvdC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlciArICItPmZpcnN0Iik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICItPnNlY29uZCIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCAiKCoiICsgaXRlciArICIpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBNYWtlcyBhIDo6IHByZWZpeCBmb3IgYSBuYW1lc3BhY2UKLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9wcmVmaXgoc3RyaW5nIG5zKSB7Ci0gIC8vIEFsd2F5cyBzdGFydCB3aXRoICI6OiIsIHRvIGF2b2lkIHBvc3NpYmxlIG5hbWUgY29sbGlzaW9ucyB3aXRoCi0gIC8vIG90aGVyIG5hbWVzIGluIG9uZSBvZiB0aGUgY3VycmVudCBuYW1lc3BhY2VzLgotICAvLwotICAvLyBXZSBhbHNvIG5lZWQgYSBsZWFkaW5nIHNwYWNlLCBpbiBjYXNlIHRoZSBuYW1lIGlzIHVzZWQgaW5zaWRlIG9mIGEKLSAgLy8gdGVtcGxhdGUgcGFyYW1ldGVyLiAgIk15VGVtcGxhdGU8Ojpmb286OkJhcj4iIGlzIG5vdCB2YWxpZCBDKyssCi0gIC8vIHNpbmNlICI8OiIgaXMgYW4gYWx0ZXJuYXRpdmUgdG9rZW4gZm9yICJbIi4KLSAgc3RyaW5nIHJlc3VsdCA9ICIgOjoiOwotCi0gIGlmIChucy5zaXplKCkgPT0gMCkgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgIHJlc3VsdCArPSAiOjoiOwotICAgIG5zID0gbnMuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIHJlc3VsdCArPSBucyArICI6OiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBPcGVucyBuYW1lc3BhY2UuCi0gKgotICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UsIHcvIHBlcmlvZHMgaW4gaXQKLSAqIEByZXR1cm4gTmFtZXNwYWNlcwotICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpuYW1lc3BhY2Vfb3BlbihzdHJpbmcgbnMpIHsKLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgc3RyaW5nIHNlcGFyYXRvciA9ICIiOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gbnMuZmluZCgiLiIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXN1bHQgKz0gc2VwYXJhdG9yOwotICAgIHJlc3VsdCArPSAibmFtZXNwYWNlICI7Ci0gICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgIHJlc3VsdCArPSAiIHsiOwotICAgIHNlcGFyYXRvciA9ICIgIjsKLSAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gc2VwYXJhdG9yICsgIm5hbWVzcGFjZSAiICsgbnMgKyAiIHsiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ2xvc2VzIG5hbWVzcGFjZS4KLSAqCi0gKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSwgdy8gcGVyaW9kcyBpbiBpdAotICogQHJldHVybiBOYW1lc3BhY2VzCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6Om5hbWVzcGFjZV9jbG9zZShzdHJpbmcgbnMpIHsKLSAgaWYgKG5zLnNpemUoKSA9PSAwKSB7Ci0gICAgcmV0dXJuICIiOwotICB9Ci0gIHN0cmluZyByZXN1bHQgPSAifSI7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJlc3VsdCArPSAifSI7Ci0gICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICB9Ci0gIHJlc3VsdCArPSAiIC8vIG5hbWVzcGFjZSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEMrKyB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSB0eXBlIG5hbWUsIGkuZS4gc3RkOjpzZXQ8dHlwZT4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fdHlwZWRlZiwgYm9vbCBhcmcpIHsKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBibmFtZSA9IGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7Ci0gICAgc3RkOjptYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uZmluZCgiY3BwLnR5cGUiKTsKLSAgICBpZiAoaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSkgewotICAgICAgYm5hbWUgPSBpdC0+c2Vjb25kOwotICAgIH0KLQotICAgIGlmICghYXJnKSB7Ci0gICAgICByZXR1cm4gYm5hbWU7Ci0gICAgfQotCi0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIGJuYW1lICsgIiYiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImNvbnN0ICIgKyBibmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgYSBjdXN0b20gb3ZlcmxvYWRlZCBDKysgbmFtZQotICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgc3RyaW5nIGNuYW1lOwotCi0gICAgdF9jb250YWluZXIqIHRjb250YWluZXIgPSAodF9jb250YWluZXIqKSB0dHlwZTsKLSAgICBpZiAodGNvbnRhaW5lci0+aGFzX2NwcF9uYW1lKCkpIHsKLSAgICAgIGNuYW1lID0gdGNvbnRhaW5lci0+Z2V0X2NwcF9uYW1lKCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgICBjbmFtZSA9ICJzdGQ6Om1hcDwiICsKLSAgICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpbl90eXBlZGVmKSArICIsICIgKwotICAgICAgICB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIGluX3R5cGVkZWYpICsgIj4gIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICAgIGNuYW1lID0gInN0ZDo6c2V0PCIgKyB0eXBlX25hbWUodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgICAgY25hbWUgPSAic3RkOjp2ZWN0b3I8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpbl90eXBlZGVmKSArICI+ICI7Ci0gICAgfQotCi0gICAgaWYgKGFyZykgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgY25hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjbmFtZTsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgY2xhc3NfcHJlZml4OwotICBpZiAoaW5fdHlwZWRlZiAmJiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSkgewotICAgIGNsYXNzX3ByZWZpeCA9ICJjbGFzcyAiOwotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgaXQgbmVlZHMgdG8gYmUgbmFtZXNwYWNlZAotICBzdHJpbmcgcG5hbWU7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwbmFtZSA9Ci0gICAgICBjbGFzc19wcmVmaXggKwotICAgICAgbmFtZXNwYWNlX3ByZWZpeChwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSkgKwotICAgICAgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcG5hbWUgPSBjbGFzc19wcmVmaXggKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfZW51bSgpICYmICFnZW5fcHVyZV9lbnVtc18pIHsKLSAgICBwbmFtZSArPSAiOjp0eXBlIjsKLSAgfQotCi0gIGlmIChhcmcpIHsKLSAgICBpZiAoaXNfY29tcGxleF90eXBlKHR0eXBlKSkgewotICAgICAgcmV0dXJuICJjb25zdCAiICsgcG5hbWUgKyAiJiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAiY29uc3QgIiArIHBuYW1lOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcG5hbWU7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBDKysgdHlwZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJpZnQgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGJhc2UgVGhlIGJhc2UgdHlwZQotICogQHJldHVybiBFeHBsaWNpdCBDKysgdHlwZSwgaS5lLiAiaW50MzJfdCIKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgewotICBzd2l0Y2ggKHRiYXNlKSB7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICByZXR1cm4gInZvaWQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICByZXR1cm4gInN0ZDo6c3RyaW5nIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiYm9vbCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gImludDhfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIHJldHVybiAiaW50MTZfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIHJldHVybiAiaW50MzJfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAiaW50NjRfdCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiZG91YmxlIjsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBiYXNlIHR5cGUgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0dHlwZSBUaGUgdHlwZQotICogQHJldHVybiBGaWVsZCBkZWNsYXJhdGlvbiwgaS5lLiBpbnQgeCA9IDA7Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgcG9pbnRlciwgYm9vbCBjb25zdGFudCwgYm9vbCByZWZlcmVuY2UpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgaWYgKGNvbnN0YW50KSB7Ci0gICAgcmVzdWx0ICs9ICJjb25zdCAiOwotICB9Ci0gIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHBvaW50ZXIpIHsKLSAgICByZXN1bHQgKz0gIioiOwotICB9Ci0gIGlmIChyZWZlcmVuY2UpIHsKLSAgICByZXN1bHQgKz0gIiYiOwotICB9Ci0gIHJlc3VsdCArPSAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHlwZSkgKyAiKTAiOwotICAgIH0KLSAgfQotICBpZiAoIXJlZmVyZW5jZSkgewotICAgIHJlc3VsdCArPSAiOyI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuYW1lX3BhcmFtcykgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICB0X3N0cnVjdCogYXJnbGlzdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgYm9vbCBoYXNfeGNlcHRpb25zID0gIXRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpLmVtcHR5KCk7Ci0KLSAgaWYgKHN0eWxlID09ICIiKSB7Ci0gICAgaWYgKGlzX2NvbXBsZXhfdHlwZSh0dHlwZSkpIHsKLSAgICAgIHJldHVybgotICAgICAgICAidm9pZCAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICAgIigiICsgdHlwZV9uYW1lKHR0eXBlKSArIChuYW1lX3BhcmFtcyA/ICImIF9yZXR1cm4iIDogIiYgLyogX3JldHVybiAqLyIpICsKLSAgICAgICAgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcywgdHJ1ZSkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAgICAgIigiICsgYXJndW1lbnRfbGlzdChhcmdsaXN0LCBuYW1lX3BhcmFtcykgKyAiKSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHN0eWxlLnN1YnN0cigwLDMpID09ICJDb2IiKSB7Ci0gICAgc3RyaW5nIGNvYl90eXBlOwotICAgIHN0cmluZyBleG5fY29iOwotICAgIGlmIChzdHlsZSA9PSAiQ29iQ2wiKSB7Ci0gICAgICBjb2JfdHlwZSA9ICIoIiArIHNlcnZpY2VfbmFtZV8gKyAiQ29iQ2xpZW50IjsKLSAgICAgIGlmIChnZW5fdGVtcGxhdGVzXykgewotICAgICAgICBjb2JfdHlwZSArPSAiVDxQcm90b2NvbF8+IjsKLSAgICAgIH0KLSAgICAgIGNvYl90eXBlICs9ICIqIGNsaWVudCkiOwotICAgIH0gZWxzZSBpZiAoc3R5bGUgPT0iQ29iU3YiKSB7Ci0gICAgICBjb2JfdHlwZSA9ICh0dHlwZS0+aXNfdm9pZCgpCi0gICAgICAgICAgICAgICAgICA/ICIoKSIKLSAgICAgICAgICAgICAgICAgIDogKCIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiIGNvbnN0JiBfcmV0dXJuKSIpKTsKLSAgICAgIGlmIChoYXNfeGNlcHRpb25zKSB7Ci0gICAgICAgIGV4bl9jb2IgPSAiLCBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gLyogZXhuX2NvYiAqLyI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgICB9Ci0KLSAgICByZXR1cm4KLSAgICAgICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICAgIihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCIgKyBjb2JfdHlwZSArICI+IGNvYiIgKyBleG5fY29iICsKLSAgICAgIGFyZ3VtZW50X2xpc3QoYXJnbGlzdCwgbmFtZV9wYXJhbXMsIHRydWUpICsgIikiOwotICB9IGVsc2UgewotICAgIHRocm93ICJVTktOT1dOIFNUWUxFIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIENvbW1hIHNlcGVhcmF0ZWQgbGlzdCBvZiBhbGwgZmllbGQgbmFtZXMgaW4gdGhhdCBzdHJ1Y3QKLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBuYW1lX3BhcmFtcywgYm9vbCBzdGFydF9jb21tYSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gIXN0YXJ0X2NvbW1hOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgdHJ1ZSkgKyAiICIgKwotICAgICAgKG5hbWVfcGFyYW1zID8gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDogIi8qICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiICovIik7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIEMrKyBlbnVtIHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCi0gKgotICogQHBhcmFtIHR5cGUgVGhyaWZ0IFR5cGUKLSAqIEByZXR1cm4gU3RyaW5nIG9mIEMrKyBjb2RlIHRvIGRlZmluaXRpb24gb2YgdGhhdCB0eXBlIGNvbnN0YW50Ci0gKi8KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0xJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIHN5bWJvbCBuYW1lIG9mIHRoZSBsb2NhbCByZWZsZWN0aW9uIG9mIGEgdHlwZS4KLSAqLwotc3RyaW5nIHRfY3BwX2dlbmVyYXRvcjo6bG9jYWxfcmVmbGVjdGlvbl9uYW1lKGNvbnN0IGNoYXIqIHByZWZpeCwgdF90eXBlKiB0dHlwZSwgYm9vbCBleHRlcm5hbCkgewotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gIC8vIFdlIGhhdmUgdG8gdXNlIHRoZSBwcm9ncmFtIG5hbWUgYXMgcGFydCBvZiB0aGUgaWRlbnRpZmllciBiZWNhdXNlCi0gIC8vIGlmIHR3byB0aHJpZnQgInByb2dyYW1zIiBhcmUgY29tcGlsZWQgaW50byBvbmUgYWN0dWFsIHByb2dyYW0KLSAgLy8geW91IHdvdWxkIGdldCBhIHN5bWJvbCBjb2xsaXNpb24gaWYgdGhleSBib3RoIGRlZmluZWQgbGlzdDxpMzI+LgotICAvLyB0cmxvID0gVGhyaWZ0IFJlZmxlY3Rpb24gTE9jYWwuCi0gIHN0cmluZyBwcm9nOwotICBzdHJpbmcgbmFtZTsKLSAgc3RyaW5nIG5zcGFjZTsKLQotICAvLyBUT0RPKGRyZWlzcyk6IFdvdWxkIGl0IGJlIGJldHRlciB0byBwcmVnZW5lcmF0ZSB0aGUgYmFzZSB0eXBlcwotICAvLyAgICAgICAgICAgICAgIGFuZCBwdXQgdGhlbSBpbiBUaHJpZnQue2gsY3BwfSA/Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHByb2cgPSBwcm9ncmFtXy0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBhc3NlcnQodHR5cGUtPmdldF9wcm9ncmFtKCkgIT0gTlVMTCk7Ci0gICAgcHJvZyA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgcHJvZyA9IHByb2dyYW1fLT5nZXRfbmFtZSgpOwotICAgIG5hbWUgPSB0dHlwZS0+Z2V0X2FzY2lpX2ZpbmdlcnByaW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSk7Ci0gICAgYXNzZXJ0KHR0eXBlLT5nZXRfcHJvZ3JhbSgpICE9IE5VTEwpOwotICAgIHByb2cgPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKTsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9hc2NpaV9maW5nZXJwcmludCgpOwotICB9Ci0KLSAgaWYgKGV4dGVybmFsICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBOVUxMICYmCi0gICAgICB0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgIG5zcGFjZSA9IG5hbWVzcGFjZV9wcmVmaXgodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKLSAgfQotCi0gIHJldHVybiBuc3BhY2UgKyAidHJsb18iICsgcHJlZml4ICsgIl8iICsgcHJvZyArICJfIiArIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2NwcF9nZW5lcmF0b3I6OmdldF9pbmNsdWRlX3ByZWZpeChjb25zdCB0X3Byb2dyYW0mIHByb2dyYW0pIGNvbnN0IHsKLSAgc3RyaW5nIGluY2x1ZGVfcHJlZml4ID0gcHJvZ3JhbS5nZXRfaW5jbHVkZV9wcmVmaXgoKTsKLSAgaWYgKCF1c2VfaW5jbHVkZV9wcmVmaXhfIHx8Ci0gICAgICAoaW5jbHVkZV9wcmVmaXguc2l6ZSgpID4gMCAmJiBpbmNsdWRlX3ByZWZpeFswXSA9PSAnLycpKSB7Ci0gICAgLy8gaWYgZmxhZyBpcyB0dXJuZWQgb2ZmIG9yIHRoaXMgaXMgYWJzb2x1dGUgcGF0aCwgcmV0dXJuIGVtcHR5IHByZWZpeAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHN0cmluZzo6c2l6ZV90eXBlIGxhc3Rfc2xhc2ggPSBzdHJpbmc6Om5wb3M7Ci0gIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfcHJlZml4LnJmaW5kKCIvIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHJldHVybiBpbmNsdWRlX3ByZWZpeC5zdWJzdHIoMCwgbGFzdF9zbGFzaCkgKyAiLyIgKyBvdXRfZGlyX2Jhc2VfICsgIi8iOwotICB9Ci0KLSAgcmV0dXJuICIiOwotfQotCi0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3BwLCAiQysrIiwKLSIgICAgY29iX3N0eWxlOiAgICAgICBHZW5lcmF0ZSBcIkNvbnRpbnVhdGlvbiBPQmplY3RcIi1zdHlsZSBjbGFzc2VzLlxuIgotIiAgICBub19jbGllbnRfY29tcGxldGlvbjpcbiIKLSIgICAgICAgICAgICAgICAgICAgICBPbWl0IGNhbGxzIHRvIGNvbXBsZXRpb25fXygpIGluIENvYkNsaWVudCBjbGFzcy5cbiIKLSIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCi0iICAgIHB1cmVfZW51bXM6ICAgICAgR2VuZXJhdGUgcHVyZSBlbnVtcyBpbnN0ZWFkIG9mIHdyYXBwZXIgY2xhc3Nlcy5cbiIKLSIgICAgZGVuc2U6ICAgICAgICAgICBHZW5lcmF0ZSB0eXBlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGVuc2UgcHJvdG9jb2wuXG4iCi0iICAgIGluY2x1ZGVfcHJlZml4OiAgVXNlIGZ1bGwgaW5jbHVkZSBwYXRocyBpbiBnZW5lcmF0ZWQgZmlsZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2U1MzQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KLSAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi1jbGFzcyB0X2NzaGFycF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCi17Ci0gIHB1YmxpYzoKLSAgICB0X2NzaGFycF9nZW5lcmF0b3IoCi0gICAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgICB7Ci0gICAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLQotICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJhc3luYyIpOwotICAgICAgYXN5bmNfY3RwXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNlcmlhbCIpOwotICAgICAgc2VyaWFsaXplXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQkgIGlmIChzZXJpYWxpemVfKSB7Ci0JCSAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7ICAvLyBzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgbmFtZXNwYWNlCi0JICB9Ci0KLQkgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ3Y2YiKTsKLQkgIHdjZl8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0JICBpZiAod2NmXykgewotCQkgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOwotCSAgfQotCi0gICAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1jc2hhcnAiOwotICAgIH0KLSAgICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gICAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqIHR0eXBlZGVmKTsKLSAgICB2b2lkIGdlbmVyYXRlX2VudW0gKHRfZW51bSogdGVudW0pOwotICAgIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbiAodF9zdHJ1Y3QqIHR4Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaW5jbHVkZUlzc2V0PXRydWUsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOwotICAgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlLCBib29sIG5lZWR0eXBlPWZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0gICAgdm9pZCBwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaW5fY2xhc3M9ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIsIHN0ZDo6c3RyaW5nIG1hcCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiAgICBmaWVsZCk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiAgICAgIHRkb2MpOwotICAgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZG9jKTsKLSAgICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY29udGVudHMpOwotCi0gICAgdm9pZCBzdGFydF9jc2hhcnBfbmFtZXNwYWNlIChzdGQ6Om9mc3RyZWFtJiBvdXQpOwotICAgIHZvaWQgZW5kX2NzaGFycF9uYW1lc3BhY2UgKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBjc2hhcnBfdHlwZV91c2luZ3MoKTsKLSAgICBzdGQ6OnN0cmluZyBjc2hhcnBfdGhyaWZ0X3VzaW5ncygpOwotCi0gICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsIGJvb2wgaW5fY291bnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9pbml0PWZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICAgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICAgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19jdHAodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCk7Ci0gICAgc3RkOjpzdHJpbmcgZ2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpOwotCi0gICAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgICB0dHlwZS0+aXNfc3RydWN0KCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgICAgdHR5cGUtPmlzX3N0cmluZygpOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIHN0ZDo6c3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gICAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlX2Rpcl87Ci0gICAgYm9vbCBhc3luY19jdHBfOwotICAgIGJvb2wgc2VyaWFsaXplXzsKLSAgICBib29sIHdjZl87Ci0gICAgc3RkOjpzdHJpbmcgd2NmX25hbWVzcGFjZV87Ci19OwotCi0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgbmFtZXNwYWNlX25hbWVfID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOwotCi0gIHN0cmluZyBkaXIgPSBuYW1lc3BhY2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpLmNfc3RyKCk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MgKyAxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgbmFtZXNwYWNlX2Rpcl8gPSBzdWJkaXI7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG9mc3RyZWFtJiBvdXQpIHsKLSAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgewotICAgIG91dCA8PAotICAgICAgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCAiXG4iOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmVuZF9jc2hhcnBfbmFtZXNwYWNlKG9mc3RyZWFtJiBvdXQpIHsKLSAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdHlwZV91c2luZ3MoKSB7Ci0gIHJldHVybiBzdHJpbmcoKSArCi0gICAgInVzaW5nIFN5c3RlbTtcbiIgKwotICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iICsKLSAgICAidXNpbmcgU3lzdGVtLklPO1xuIiArCi0JKGFzeW5jX2N0cF8gPyAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIgOiAiIikgKwotICAgICJ1c2luZyBUaHJpZnQ7XG4iICsKLSAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArCi0gICAgKHdjZl8gPyAiLy91c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIiA6ICIiKSArCi0gICAgInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpjc2hhcnBfdGhyaWZ0X3VzaW5ncygpIHsKLSAgcmV0dXJuIHN0cmluZygpICsKLSAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29sO1xuIiArCi0gICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnQ7XG4iOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeyB9Ci12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgZl9lbnVtX25hbWUgPSBuYW1lc3BhY2VfZGlyXysiLyIgKyAodGVudW0tPmdldF9uYW1lKCkpKyIuY3MiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfZW51bSA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0KLSAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOwotCi0gIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9lbnVtLCB0ZW51bSk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXG4iOwotICBzY29wZV91cChmX2VudW0pOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLQlnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0KLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9lbnVtKTsKLQotICBlbmRfY3NoYXJwX25hbWVzcGFjZShmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKXsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvQ29uc3RhbnRzLmNzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgY3NoYXJwX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKLQotICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKLQotICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBDb25zdGFudHMiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfY29uc3RzKTsKLQotICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLQlnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfY29uc3RzLCAoKmNfaXRlcikpOwotICAgIGlmIChwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksIGZhbHNlKSkgewotICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikgewotICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKGZfY29uc3RzLCBjb25zdHMpOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX2NvbnN0cyk7Ci0gIGVuZF9jc2hhcnBfbmFtZXNwYWNlKGZfY29uc3RzKTsKLSAgZl9jb25zdHMuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKQotewotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdIiA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5BZGQoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgQ29uc3RhbnRzKCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICB9Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLX0KLQotCi0vL2l0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0IHdvdWxkIGltcGx5Ci1ib29sIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsLCBib29sIG5lZWR0eXBlKSB7Ci0gIGluZGVudChvdXQpOwotICBib29sIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9ICFpbl9zdGF0aWM7Ci0gIGlmICghZGVmdmFsIHx8IG5lZWR0eXBlKSB7Ci0gICAgb3V0IDw8Ci0gICAgICAoaW5fc3RhdGljID8gIiIgOiAicHVibGljIHN0YXRpYyAiKSA8PAotICAgICAgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKLSAgfQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSk7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9ICgiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICI7IiA8PCBlbmRsOwotICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbiA9IGZhbHNlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkgewotICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIHJldHVybiBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb247Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSBuYW1lOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJlbmRlciA8PCAiKCIgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHQgPSB0bXAoInRtcCIpOwotICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgdCwgdHlwZSwgdmFsdWUsIHRydWUsIHRydWUsIHRydWUpOwotICAgIHJlbmRlciA8PCB0OwotICB9Ci0KLSAgcmV0dXJuIHJlbmRlci5zdHIoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLQotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8Ci0gICAgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3N0cnVjdCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKLQotICBmX3N0cnVjdC5jbG9zZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpbl9jbGFzcywgYm9vbCBpc19yZXN1bHQpIHsKLQotICBpZiAoIWluX2NsYXNzKSB7Ci0gICAgc3RhcnRfY3NoYXJwX25hbWVzcGFjZShvdXQpOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIGluZGVudChvdXQpIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW1NlcmlhbGl6YWJsZV0iIDw8IGVuZGw7IAotICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBpZiAoKHNlcmlhbGl6ZV98fHdjZl8pICYmIWlzX2V4Y2VwdGlvbikgewotCSAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsgLy8gZG8gbm90IG1ha2UgZXhjZXB0aW9uIGNsYXNzZXMgZGlyZWN0bHkgV0NGIHNlcmlhbGl6YWJsZSwgd2UgcHJvdmlkZSBhIHNlcGVyYXRlICJmYXVsdCIgZm9yIHRoYXQKLSAgfQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0gCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAic2VhbGVkICIgOiAiIikgPDwgInBhcnRpYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgOiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIkV4Y2VwdGlvbiwgIjsKLSAgfQotICBvdXQgPDwgIlRCYXNlIjsKLQotICBvdXQgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgLy9tYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotCWdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAqbV9pdGVyKTsKLSAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIHRydWUpOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PAotICAgICAgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBJc3NldCBfX2lzc2V0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiNpZiAhU0lMVkVSTElHSFQiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJbU2VyaWFsaXphYmxlXSIgPDwgZW5kbDsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgaWYgKChzZXJpYWxpemVffHx3Y2ZfKSkgewotCSAgaW5kZW50KG91dCkgPDwgIltEYXRhQ29udHJhY3RdIiA8PCBlbmRsOwotICAgICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBzdHJ1Y3QgSXNzZXQgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAicHVibGljIGJvb2wgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgd2hpbGUgKHQtPmlzX3R5cGVkZWYoKSkgewotICAgICAgdCA9ICgodF90eXBlZGVmKil0KS0+Z2V0X3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy5fIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIFdDRiBmYXVsdCB0byB3cmFwIHRoZSBleGNlcHRpb24KLSAgaWYoKHNlcmlhbGl6ZV98fHdjZl8pICYmIGlzX2V4Y2VwdGlvbikgewotCSAgZ2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG91dCwgdHN0cnVjdCk7Ci0gIH0KLQotICBpZiAoIWluX2NsYXNzKQotICB7Ci0gICAgZW5kX2NzaGFycF9uYW1lc3BhY2Uob3V0KTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3djZmZhdWx0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiW0RhdGFDb250cmFjdF0iIDw8IGVuZGw7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiRmF1bHQiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7Ci0gIH0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgZmFsc2UpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyB2b2lkIFJlYWQgKFRQcm90b2NvbCBpcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlRGaWVsZCBmaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJmaWVsZCA9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIHsgIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOwotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlmIChmaWVsZC5UeXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWZhdWx0OiAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlwcm90LlJlYWRGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaXByb3QuUmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLk5hbWUgPSBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiVFN0cnVjdCBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKHN0cnVjKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBlbmRsIDw8IGluZGVudCgpIDw8ICJpZiAiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgIiBlbHNlIGlmICI7Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PAotICAgICAgICAiKHRoaXMuX19pc3NldC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZpZWxkLk5hbWUgPSBcIiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICJcIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiZmllbGQuSUQgPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7IiA8PCBlbmRsOwotCi0gICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKLQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8Ci0gICAgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIlN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZChcIiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIjogXCIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZChcIiwiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI6IFwiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICI9PSBudWxsID8gXCI8bnVsbD5cIiA6ICI8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSAgPDwgIi5Ub1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJzYi5BcHBlbmQoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInNiLkFwcGVuZChcIilcIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4gc2IuVG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLmNzIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGNzaGFycF90eXBlX3VzaW5ncygpIDw8Ci0gICAgY3NoYXJwX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOwotCi0gIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBwYXJ0aWFsIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgZW5kX2NzaGFycF9uYW1lc3BhY2UoZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JZmFjZSI7Ci0gIH0KLQotICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLQotICBpZiAod2NmXykgewotCSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0JCSJbU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCi0gIHsKLQlnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sICpmX2l0ZXIpOwotCi0JLy8gaWYgd2UncmUgdXNpbmcgV0NGLCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcwotCWlmICh3Y2ZfKSB7Ci0JCWluZGVudChmX3NlcnZpY2VfKSA8PAotCQkJIltPcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7Ci0KLQkJY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKTsKLQkJdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCQlmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotCQkgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW0ZhdWx0Q29udHJhY3QodHlwZW9mKCIgKyB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIkZhdWx0KSldIiA8PCBlbmRsOwotCQl9Ci0JfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oKmZfaXRlciwgIkJlZ2luXyIpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCgqZl9pdGVyLCAiRW5kXyIpIDw8ICI7IiA8PCBlbmRsOyAgCi0gICAgaWYoIGFzeW5jX2N0cF8pCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2N0cCgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsgIAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfQotCi0gIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgY2xhc3MgQ2xpZW50IDogIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgQ2xpZW50KFRQcm90b2NvbCBwcm90KSA6IHRoaXMocHJvdCwgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIjsKLSAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICIgOiBiYXNlKGlwcm90LCBvcHJvdCkiOwotICB9Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8gPSBpcHJvdDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8gPSBvcHJvdDsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIGlwcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgVFByb3RvY29sIG9wcm90XzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgSW5wdXRQcm90b2NvbCIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImdldCB7IHJldHVybiBpcHJvdF87IH0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBUUHJvdG9jb2wgT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJnZXQgeyByZXR1cm4gb3Byb3RfOyB9IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotCQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotCS8vIEJlZ2luXwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gIiA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIihjYWxsYmFjaywgc3RhdGUiOwotCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0JICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0JCi0gICAgLy8gRW5kCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2VuZCgqZl9pdGVyLCAiRW5kXyIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAib3Byb3RfLlRyYW5zcG9ydC5FbmRGbHVzaChhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIGFzeW5jIENUUAotCWJvb2wgZmlyc3Q7Ci0gICAgaWYoIGFzeW5jX2N0cF8pCi0JewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgICJwdWJsaWMgYXN5bmMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfY3RwKCpmX2l0ZXIsICIiKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0JCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgIHR5cGVfbmFtZSggKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiIHJldHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR2YWwgPSAiOwotICAgICAgfQotCSAgZWxzZQotCSAgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0JICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJhd2FpdCBUYXNrRXguUnVuKCgpID0+IiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgICBmdW5uYW1lIDw8ICIoIjsKLQkgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgCi0gICAgICAgICJ9KTsiIDw8IGVuZGw7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAKLSAgICAgICAgICAicmV0dXJuIHJldHZhbDsiICA8PCBlbmRsOwotICAgICAgfQotCSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0JCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vICJOb3JtYWwiIFN5bmNocm9ub3VzIGludm9rZQotICAgIGdlbmVyYXRlX2NzaGFycF9kb2MoZl9zZXJ2aWNlXywgKmZfaXRlcik7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgIVNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbHNlIiA8PCBlbmRsOwotCi0gICAgLy8gU2lsdmVybGlnaHQgc3luY2hyb25vdXMgaW52b2tlCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgYXN5bmNSZXN1bHQgPSBCZWdpbl8iIDw8IGZ1bm5hbWUgPDwgIihudWxsLCBudWxsLCAiOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJFbmRfIiA8PCBmdW5uYW1lIDw8ICIoYXN5bmNSZXN1bHQpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gU2VuZAotICAgIHRfZnVuY3Rpb24gc2VuZF9mdW5jdGlvbihnX3R5cGVfdm9pZCwKLSAgICAgICAgc3RyaW5nKCJzZW5kXyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpOwotCi0gICAgc3RyaW5nIGFyZ3NuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmIFNJTFZFUkxJR0hUIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jX2JlZ2luKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgZnVubmFtZSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5DYWxsLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDs7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBvcHJvdF8uVHJhbnNwb3J0LkJlZ2luRmx1c2goY2FsbGJhY2ssIHN0YXRlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9wcm90Xy5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZW5kaWYiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0gICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAmbm9hcmdzLAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAicHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIlRNZXNzYWdlIG1zZyA9IGlwcm90Xy5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAobXNnLlR5cGUgPT0gVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5SZWFkKGlwcm90Xyk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdF8uUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QgKnhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0KLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0LCBcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBjbGFzcyBQcm9jZXNzb3IgOiAiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgUHJvY2Vzc29yKElmYWNlIGlmYWNlKSIgOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiA6IGJhc2UoaWZhY2UpIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmYWNlXyA9IGlmYWNlOyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwX1tcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiX1Byb2Nlc3M7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGRlbGVnYXRlIHZvaWQgUHJvY2Vzc0Z1bmN0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+IHByb2Nlc3NNYXBfID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBQcm9jZXNzRnVuY3Rpb24+KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgYm9vbCBQcm9jZXNzKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgbmV3IGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiUHJvY2Vzc0Z1bmN0aW9uIGZuOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgb3V0IGZuKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24gKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QsIFwiSW52YWxpZCBtZXRob2QgbmFtZTogJ1wiICsgbXNnLk5hbWUgKyBcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdHJ1ZTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjYXRjaCAoSU9FeGNlcHRpb24pIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0gIH0KLQotICB0X3N0cnVjdCAqeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOwotICB9Ci0KLSAgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyB2b2lkICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJfUHJvY2VzcyhpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8IGFyZ3NuYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiYXJncy5SZWFkKGlwcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuU3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJpZmFjZV8uIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgcHJvcF9uYW1lKCp4X2l0ZXIpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpKTsgIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgbmFtZSA8PCAiID0gIjsKLQotICAgIGlmICh0eXBlLT5pc19lbnVtKCkpCi0gICAgewotICAgICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIpIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgImlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiUmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PGVuZGw7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUTWFwICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5SZWFkTWFwQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gaXByb3QuUmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IoIGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBvYmogPDwgIi5Db3VudCIgPDwgIjsgIiA8PCAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QuUmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LlJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0KLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSwgdHJ1ZSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmVsZW0sIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuQWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQpOwotICAKLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIG5hbWU7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCAodF9zdHJ1Y3QqKXR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIAotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotCi0gICAgICBzd2l0Y2godGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKCI7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dCA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAiV3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIldyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQyMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0YmFzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJXcml0ZUkzMigoaW50KSIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZU1hcEJlZ2luKG5ldyBUTWFwKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVMaXN0QmVnaW4obmV3IFRMaXN0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCIgPDwKLSAgICAgIHR5cGVfbmFtZSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiBpbiAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5LZXlzKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIgIiA8PCBpdGVyIDw8Ci0gICAgICAiIGluICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiAiIDw8IGl0ZXIgPDwKLSAgICAgICIgaW4gIiA8PAotICAgICAgcHJlZml4IDw8ICIpIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBpdGVyLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LldyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3QuV3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgaXRlciwgc3RyaW5nIG1hcCkgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7Ci19Ci0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX3Byb3BlcnR5KG91dCwgdGZpZWxkLCBpc1B1YmxpYywgZ2VuZXJhdGVJc3NldCwgIl8iKTsKLX0KLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4KSB7Ci0JaWYoKHNlcmlhbGl6ZV98fHdjZl8pICYmIGlzUHVibGljKSB7Ci0JCWluZGVudChvdXQpIDw8ICJbRGF0YU1lbWJlcl0iIDw8IGVuZGw7Ci0JfQotICAgIGluZGVudChvdXQpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpCi0gICAgICAgICAgICAgICAgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZ2V0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaWYgKGdlbmVyYXRlSXNzZXQpIHsKLQkJaW5kZW50KG91dCkgPDwgIl9faXNzZXQuIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwotCX0KLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkUHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgICBvdXQgPDwgZW5kbDsKLX0KLQotc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkKSB7Ci0gICAgc3RyaW5nIG5hbWUgKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gICAgcmV0dXJuIG5hbWU7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0KSB7Ci0gICh2b2lkKSBpbl9pbml0OwotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCAqdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgIHJldHVybiAiRGljdGlvbmFyeTwiICsgdHlwZV9uYW1lKHRtYXAtPmdldF9rZXlfdHlwZSgpLCB0cnVlKSArCi0gICAgICAiLCAiICsgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopIHR0eXBlOwotICAgIHJldHVybiAiVEhhc2hTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIHJldHVybiAiTGlzdDwiICsgdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOwotICB9Ci0KLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImNzaGFycCIpOwotICAgIGlmICghbnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG5zICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gICh2b2lkKSBpbl9jb250YWluZXI7Ci0gIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkgewotICAgICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJzaG9ydCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImxvbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2UtPmdldF9iYXNlKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RkOjpzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IGZhbHNlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gKGRvdWJsZSkwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIpMCI7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIoKSI7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgcmV0dXJuIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuICJJQXN5bmNSZXN1bHQgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfZW5kKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICByZXR1cm4gdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KSI7Ci19Ci0KLXN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19jdHAodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0cmluZyB0YXNrID0gIlRhc2siOwotICBpZiggISB0dHlwZS0+aXNfdm9pZCgpKQotICAgIHRhc2sgKz0gIjwiICsgdHlwZV9uYW1lKHR0eXBlKSArICI+IjsKLSAgcmV0dXJuIHRhc2sgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiQXN5bmMoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotCi1zdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiICIgKyAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuQm9vbCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuQnl0ZSI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU3RydWN0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGUuTWFwIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGUuU2V0IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkxpc3QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtICZvdXQsIHN0cmluZyBjb250ZW50cykgewotICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gPHN1bW1hcnk+XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vICIsIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbiIpOwotCi0KLX0KLQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob2ZzdHJlYW0gJm91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgY29tYmluZWRfbWVzc2FnZSA9IGZpZWxkLT5nZXRfZG9jKCkgKyAiXG48c2VlYWxzbyBjcmVmPVwiIiArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOwotICAgIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2NzaGFycF9kb2Mob3V0LCAodF9kb2MqKWZpZWxkKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvZnN0cmVhbSAmb3V0LCB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKLSAgfQotfQotCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvZnN0cmVhbSAmb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0Jc3RyaW5nc3RyZWFtIHBzOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgcHMgPDwgIlxuPHBhcmFtIG5hbWU9XCIiIDw8IHAtPmdldF9uYW1lKCkgPDwgIlwiPiI7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0JCXN0ZDo6c3RyaW5nIHN0ciA9IHAtPmdldF9kb2MoKTsKLQkJc3RyLmVyYXNlKHN0ZDo6cmVtb3ZlKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksICdcbicpLCBzdHIuZW5kKCkpOyAvLyByZW1vdmUgdGhlIG5ld2xpbmVzIHRoYXQgYXBwZWFyIGZyb20gdGhlIHBhcnNlcgotCQlwcyA8PCBzdHI7Ci0gICAgICB9Ci0JICBwcyA8PCAiPC9wYXJhbT4iOwotICAgIH0KLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8vLyAiLAotCQkJCQkJCSAgICI8c3VtbWFyeT5cbiIgKyB0ZnVuY3Rpb24tPmdldF9kb2MoKSArICI8L3N1bW1hcnk+IiArIHBzLnN0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKTsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2NzaGFycF9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKSB7Ci0gIHN0cmluZyBwYWNrYWdlID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHBhY2thZ2UgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjc2hhcnAiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoY3NoYXJwLCAiQyMiLAotIiAgICBhc3luYzogICAgICAgICAgIEFkZHMgQXN5bmMgQ1RQIHN1cHBvcnQuXG4iCi0iICAgIHdjZjogICAgICAgICAgICAgQWRkcyBiaW5kaW5ncyBmb3IgV0NGIHRvIGdlbmVyYXRlZCBjbGFzc2VzLlxuIgotIiAgICBzZXJpYWw6ICAgICAgICAgIEFkZCBzZXJpYWxpemF0aW9uIHN1cHBvcnQgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCi0pCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1ZTE3Zi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGNhc3NlcnQ+Ci0KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBEIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqIGdlbmVyYXRlXyooKSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgYmFzZSBjbGFzcyB0byBlbWl0IGNvZGUgZm9yIHRoZQotICogZ2l2ZW4gZW50aXR5LCBwcmludF8qKCkgZnVuY3Rpb25zIHdyaXRlIGEgcGllY2Ugb2YgY29kZSB0byB0aGUgcGFzc2VkCi0gKiBzdHJlYW0sIGFuZCByZW5kZXJfKigpIHJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mCi0gKiB0aGUgcGFzc2VkIGVudGl0eS4KLSAqLwotY2xhc3MgdF9kX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9kX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1kIjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgaW5pdF9nZW5lcmF0b3IoKSB7Ci0gICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAgIHN0cmluZyBkaXIgPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiZCIpOwotICAgIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICAgICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gICAgfQotICAgIGlmICghZGlyLmVtcHR5KCkpIHsKLSAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKLSAgICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICBwYWNrYWdlX2Rpcl8gPSBzdWJkaXIgKyAiLyI7Ci0KLSAgICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHByb2dyYW1fbmFtZV8gKyAiX3R5cGVzLmQiOwotICAgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotCi0gICAgLy8gUHJpbnQgaGVhZGVyCi0gICAgZl90eXBlc18gPDwKLSAgICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfdHlwZXNfKTsKLQotICAgIC8vIEluY2x1ZGUgdHlwZSBtb2R1bGVzIGZyb20gb3RoZXIgaW1wb3J0ZWQgcHJvZ3JhbXMuCi0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihpbmNsdWRlc1tpXSkpIDw8Ci0gICAgICAgIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpIDw8ICJfdHlwZXM7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAoIWluY2x1ZGVzLmVtcHR5KCkpIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCkgewotICAgIC8vIENsb3NlIG91dHB1dCBmaWxlCi0gICAgZl90eXBlc18uY2xvc2UoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICAgIGlmICghY29uc3RzLmVtcHR5KCkpIHsKLSAgICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfK3Byb2dyYW1fbmFtZV8rIl9jb25zdGFudHMuZCI7Ci0gICAgICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAgICAgZl9jb25zdHMgPDwKLSAgICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICAgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCpwcm9ncmFtXykgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX2NvbnN0YW50czsiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbDsKLQotICAgICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfY29uc3RzKTsKLQotICAgICAgZl9jb25zdHMgPDwKLSAgICAgICAgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8ICJfdHlwZXM7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBuYW1lID0gKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgImltbXV0YWJsZSgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikgIiA8PAotICAgICAgICAgIG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfY29uc3RzIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgInN0YXRpYyB0aGlzKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9jb25zdHMgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICB0X3R5cGUqIHR5cGUgPSAoKmNfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiOwotICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKHR5cGUpKSB7Ci0gICAgICAgICAgZl9jb25zdHMgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSkgIjsKLSAgICAgICAgfQotICAgICAgICBmX2NvbnN0cyA8PAotICAgICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQoZl9jb25zdHMpIDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiIDw8Ci0gICAgICB0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLQotICAgIHN0cmluZyBlbnVtX25hbWUgPSB0ZW51bS0+Z2V0X25hbWUoKTsKLSAgICBmX3R5cGVzXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVudW0gIiA8PCBlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3R5cGVzXyA8PCAiLCIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKCgqY19pdGVyKS0+aGFzX3ZhbHVlKCkpIHsKLSAgICAgICAgZl90eXBlc18gPDwgIiA9ICIgPDwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gICAgcHJpbnRfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKLSAgICBzdHJpbmcgZl9zZXJ2aWNlbmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIi5kIjsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZTsKLSAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VuYW1lLmNfc3RyKCkpOwotICAgIGZfc2VydmljZSA8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAgICJtb2R1bGUgIiA8PCByZW5kZXJfcGFja2FnZSgqcHJvZ3JhbV8pIDw8IHN2Y19uYW1lIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotCi0gICAgcHJpbnRfZGVmYXVsdF9pbXBvcnRzKGZfc2VydmljZSk7Ci0KLSAgICBmX3NlcnZpY2UgPDwgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCpnZXRfcHJvZ3JhbSgpKSA8PCBwcm9ncmFtX25hbWVfIDw8Ci0gICAgICAiX3R5cGVzOyIgPDwgZW5kbDsKLQotICAgIHRfc2VydmljZSogZXh0ZW5kc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gICAgaWYgKGV4dGVuZHNfc2VydmljZSAhPSBOVUxMKSB7Ci0gICAgICBmX3NlcnZpY2UgPDwKLSAgICAgICAgImltcG9ydCAiIDw8IHJlbmRlcl9wYWNrYWdlKCooZXh0ZW5kc19zZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSkgPDwKLSAgICAgICAgZXh0ZW5kc19zZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGZfc2VydmljZSA8PCBlbmRsOwotCi0gICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgZXh0ZW5kcyA9ICIgOiAiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaW50ZXJmYWNlICIgPDwgc3ZjX25hbWUgPDwgZXh0ZW5kcyA8PCAiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBDb2xsZWN0IGFsbCB0aGUgZXhjZXB0aW9uIHR5cGVzIHNlcnZpY2UgbWV0aG9kcyBjYW4gdGhyb3cgc28gd2UgY2FuCi0gICAgLy8gZW1pdCB0aGUgbmVjZXNzYXJ5IGFsaWFzZXMgbGF0ZXIuCi0gICAgc2V0PHRfdHlwZSo+IGV4Y2VwdGlvbl90eXBlczsKLQotICAgIC8vIFByaW50IHRoZSBtZXRob2Qgc2lnbmF0dXJlcy4KLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgewotICAgICAgZl9zZXJ2aWNlIDw8IGluZGVudCgpOwotICAgICAgcHJpbnRfZnVuY3Rpb25fc2lnbmF0dXJlKGZfc2VydmljZSwgKmZuX2l0ZXIpOwotICAgICAgZl9zZXJ2aWNlIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0gKCpmbl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZXhfaXRlcjsKLSAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKLSAgICAgICAgZXhjZXB0aW9uX3R5cGVzLmluc2VydCgoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGlhcyB0aGUgZXhjZXB0aW9uIHR5cGVzIGludG8gdGhlIGN1cnJlbnQgc2NvcGUuCi0gICAgaWYgKCFleGNlcHRpb25fdHlwZXMuZW1wdHkoKSkgZl9zZXJ2aWNlIDw8IGVuZGw7Ci0gICAgc2V0PHRfdHlwZSo+Ojpjb25zdF9pdGVyYXRvciBldF9pdGVyOwotICAgIGZvciAoZXRfaXRlciA9IGV4Y2VwdGlvbl90eXBlcy5iZWdpbigpOyBldF9pdGVyICE9IGV4Y2VwdGlvbl90eXBlcy5lbmQoKTsgKytldF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlKSA8PCAiYWxpYXMgIiA8PCByZW5kZXJfcGFja2FnZSgqKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgKCpldF9pdGVyKS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSA8PCAiX3R5cGVzIiA8PCAiLiIgPDwKLSAgICAgICAgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpldF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0aGUgbWV0aG9kIG1ldGFkYXRhLgotICAgIG9zdHJpbmdzdHJlYW0gbWV0YTsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgewotICAgICAgaWYgKCgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJgotICAgICAgICAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSAmJgotICAgICAgICAhKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWV0YSA8PCAiLCI7Ci0gICAgICB9Ci0KLSAgICAgIG1ldGEgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiVE1ldGhvZE1ldGEoYCIgPDwgKCpmbl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiYCwgIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQobWV0YSkgPDwgIlsiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gJnBhcmFtcyA9ICgqZm5faXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgICBmb3IgKHBfaXRlciA9IHBhcmFtcy5iZWdpbigpOyBwX2l0ZXIgIT0gcGFyYW1zLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1ldGEgPDwgIiwgIjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGEgPDwgIlRQYXJhbU1ldGEoYCIgPDwgKCpwX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJgLCAiIDw8ICgqcF9pdGVyKS0+Z2V0X2tleSgpOwotCi0gICAgICAgIHRfY29uc3RfdmFsdWUqIGN2ID0gKCpwX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICAgICAgaWYgKGN2ICE9IE5VTEwpIHsKLSAgICAgICAgICBtZXRhIDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCpwX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICAgIG1ldGEgPDwgIikiOwotICAgICAgfQotCi0gICAgICBtZXRhIDw8ICJdIjsKLQotICAgICAgaWYgKCEoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSB8fAotICAgICAgICAoKmZuX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgICBtZXRhIDw8ICIsIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIlsiOwotCi0gICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25zID0KLSAgICAgICAgICAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGV4X2l0ZXI7Ci0gICAgICAgIGZvciAoZXhfaXRlciA9IGV4Y2VwdGlvbnMuYmVnaW4oKTsgZXhfaXRlciAhPSBleGNlcHRpb25zLmVuZCgpOyArK2V4X2l0ZXIpIHsKLSAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1ldGEgPDwgIiwgIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBtZXRhIDw8ICJURXhjZXB0aW9uTWV0YShgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAiYCwgIiA8PCAoKmV4X2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgYCIgPDwKLSAgICAgICAgICAgICgqZXhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPDwgImApIjsKLSAgICAgICAgfQotCi0gICAgICAgIG1ldGEgPDwgIl0iOwotICAgICAgfQotCi0gICAgICBpZiAoKCpmbl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgbWV0YSA8PCAiLCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJUTWV0aG9kVHlwZS5PTkVXQVkiOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgbWV0YSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIpIjsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIHN0cmluZyBtZXRhX3N0cihtZXRhLnN0cigpKTsKLSAgICBpZiAoIW1ldGFfc3RyLmVtcHR5KCkpIHsKLSAgICAgIGZfc2VydmljZSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbnVtIG1ldGhvZE1ldGEgPSBbIiA8PCBtZXRhX3N0ciA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2UpIDw8ICJ9IiA8PCBlbmRsOwotCi0KLSAgICAvLyBTZXJ2ZXIgc2tlbGV0b24gZ2VuZXJhdGlvbi4KLSAgICBzdHJpbmcgZl9za2VsZXRvbm5hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzdmNfbmFtZSArICJfc2VydmVyLnNrZWxldG9uLmQiOwotICAgIHN0ZDo6b2ZzdHJlYW0gZl9za2VsZXRvbjsKLSAgICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbm5hbWUuY19zdHIoKSk7Ci0gICAgcHJpbnRfc2VydmVyX3NrZWxldG9uKGZfc2tlbGV0b24sIHRzZXJ2aWNlKTsKLSAgICBmX3NrZWxldG9uLmNsb3NlKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgotICAgICAqLwotICAgIHZvaWQgcHJpbnRfc2VydmVyX3NrZWxldG9uKG9zdHJlYW0gJm91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgICAgc3RyaW5nIHN2Y19uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICAiLyoiIDw8IGVuZGwgPDwKLSAgICAgICAgIiAqIFRoaXMgYXV0by1nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIElmIHlvdSIgPDwgZW5kbCA8PAotICAgICAgICAiICogaW50ZW5kIHRvIGN1c3RvbWl6ZSBpdCwgeW91IHNob3VsZCBlZGl0IGEgY29weSB3aXRoIGFub3RoZXIgZmlsZSBuYW1lIHRvICIgPDwgZW5kbCA8PAotICAgICAgICAiICogYXZvaWQgb3ZlcndyaXRpbmcgaXQgd2hlbiBydW5uaW5nIHRoZSBnZW5lcmF0b3IgYWdhaW4uIiA8PCBlbmRsIDw8Ci0gICAgICAgICIgKi8iIDw8IGVuZGwgPDwKLSAgICAgICAgIm1vZHVsZSAiIDw8IHJlbmRlcl9wYWNrYWdlKCp0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc3ZjX25hbWUgPDwgIl9zZXJ2ZXI7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgImltcG9ydCBzdGQuc3RkaW87IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LmNvZGVnZW4ucHJvY2Vzc29yOyIgPDwgZW5kbCA8PAotICAgICAgICAiaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OyIgPDwgZW5kbCA8PAotICAgICAgICAiaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7IiA8PCBlbmRsIDw8Ci0gICAgICAgICJpbXBvcnQgdGhyaWZ0LnV0aWwuaGFzaHNldDsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKnRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzdmNfbmFtZSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAiaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKmdldF9wcm9ncmFtKCkpIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlczsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgICJjbGFzcyAiIDw8IHN2Y19uYW1lIDw8ICJIYW5kbGVyIDogIiA8PCBzdmNfbmFtZSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0aGlzKCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAvLyBZb3VyIGluaXRpYWxpemF0aW9uIGdvZXMgaGVyZS4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICAgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUob3V0LCAqZl9pdGVyKTsKLSAgICAgICAgb3V0IDw8ICIgeyIgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiLy8gWW91ciBpbXBsZW1lbnRhdGlvbiBnb2VzIGhlcmUuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIndyaXRlbG4oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGNhbGxlZFwiKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgdF9iYXNlX3R5cGUqIHJ0ID0gKHRfYmFzZV90eXBlKikoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7Ci0gICAgICAgIGlmIChydC0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0eXBlb2YocmV0dXJuKS5pbml0OyIgPDwgZW5kbDsKLSAgICAgICAgfQotCi0gICAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidm9pZCBtYWluKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhdXRvIHByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ISgpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXV0byBwcm9jZXNzb3IgPSBuZXcgVFNlcnZpY2VQcm9jZXNzb3IhIiA8PCBzdmNfbmFtZSA8PCAiKG5ldyAiIDw8IHN2Y19uYW1lIDw8ICJIYW5kbGVyKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImF1dG8gc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsiIDw8IGVuZGwgPDwKLQotICAgICAgICBpbmRlbnQoKSA8PCAiYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZXJ2ZXIuc2VydmUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3RydWN0IG9yIGFuIGV4Y2VwdGlvbiB0eXBlIHRvIG91dC4KLSAgICovCi0gIHZvaWQgcHJpbnRfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICAgIGlmIChpc19leGNlcHRpb24pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA6IFRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0cnVjdCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIC8vIERlY2xhcmUgYWxsIGZpZWxkcy4KLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX3R5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIm1peGluIFRTdHJ1Y3RIZWxwZXJzISgiOwotCi0gICAgaWYgKCFtZW1iZXJzLmVtcHR5KCkpIHsKLSAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgZmllbGRzLCBjb25zdHJ1Y3QgdGhlIFRGaWVsZE1ldGEgYXJyYXkgdG8gcGFzcyB0bwotICAgICAgLy8gVFN0cnVjdEhlbHBlcnMuIFdlIGNhbid0IGp1c3QgcGFzcyBhbiBlbXB0eSBhcnJheSBpZiBub3QgYmVjYXVzZSBbXQotICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBURmllbGRNZXRhW10gY29uc3RyYWludC4KLSAgICAgIG91dCA8PCAiWyI7Ci0gICAgICBpbmRlbnRfdXAoKTsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PCAiVEZpZWxkTWV0YShgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgImAsICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9rZXkoKTsKLQotICAgICAgICB0X2NvbnN0X3ZhbHVlKiBjdiA9ICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICAgIHRfZmllbGQ6OmVfcmVxIHJlcSA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpOwotICAgICAgICBvdXQgPDwgIiwgIiA8PCByZW5kZXJfcmVxKHJlcSk7Ci0gICAgICAgIGlmIChjdiAhPSBOVUxMKSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIHF7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCBjdikgPDwgIn0iOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiKSI7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiXSI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyB0aGUgRCBmdW5jdGlvbiBzaWduYXR1cmUgKGluY2x1ZGluZyByZXR1cm4gdHlwZSkgZm9yIHRoZSBnaXZlbgotICAgKiBtZXRob2QuCi0gICAqLwotICB2b2lkIHByaW50X2Z1bmN0aW9uX3NpZ25hdHVyZShvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGZuKSB7Ci0gICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoZm4tPmdldF9yZXR1cm50eXBlKCkpIDw8Ci0gICAgICAiICIgPDwgZm4tPmdldF9uYW1lKCkgPDwgIigiOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gZm4tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiLCAiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl90eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKSA8PCAiICIgPDwKLSAgICAgICAgICAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpIjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBEIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlLiBUaGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgdG8gYmUgYQotICAgKiBzaW5nbGUgZXhwcmVzc2lvbjsgZm9yIGNvbXBsZXggdHlwZXMsIGltbWVkaWF0ZWx5IGNhbGxlZCBkZWxlZ2F0ZQotICAgKiBsaXRlcmFscyBhcmUgdXNlZCB0byBhY2hpZXZlIHRoaXMuCi0gICAqLwotICBzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgICAvLyBSZXNvbHZlIGFueSB0eXBlZGVmcy4KLSAgICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICAgIG9zdHJpbmdzdHJlYW0gb3V0OwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAiY2FzdCgiIDw8IHJlbmRlcl90eXBlX25hbWUodHlwZSkgPDwgIikiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiTCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBObyBjb25zdCBvZiBiYXNlIHR5cGUgIiArCi0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJjYXN0KCIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0eXBlKSA8PCAiKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIgdjsiIDw8IGVuZGw7Ci0gICAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidiA9ICIgPDwgKHR5cGUtPmlzX3hjZXB0aW9uKCkgPyAibmV3ICIgOiAiIikgPDwKLSAgICAgICAgICByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICAgICAgdGhyb3cgIlR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArCi0gICAgICAgICAgICAgIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYuc2V0IWAiIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PAotICAgICAgICAgICAgImAoIiA8PCB2YWwgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidlsiOwotICAgICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7Ci0gICAgICAgICAgICBvdXQgPDwgImNhc3QoaW1tdXRhYmxlKCIgPDwgcmVuZGVyX3R5cGVfbmFtZShrdHlwZSkgPDwgIikpIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0IDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYgfj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInYgfj0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93ICJDb21waWxlciBlcnJvcjogSW52YWxpZCB0eXBlIGluIHJlbmRlcl9jb25zdF92YWx1ZTogIiArCi0gICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdjsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSgpIjsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0LnN0cigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEQgcGFja2FnZSB0byB3aGljaCBtb2R1bGVzIGZvciBwcm9ncmFtIGFyZSB3cml0dGVuICh3aXRoIGEKLSAgICogdHJhaWxpbmcgZG90LCBpZiBub3QgZW1wdHkpLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9wYWNrYWdlKGNvbnN0IHRfcHJvZ3JhbSYgcHJvZ3JhbSkgY29uc3QgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS5nZXRfbmFtZXNwYWNlKCJkIik7Ci0gICAgaWYgKHBhY2thZ2Uuc2l6ZSgpID09IDApIHJldHVybiAiIjsKLSAgICByZXR1cm4gcGFja2FnZSArICIuIjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBEIHJlcGVzZW50YXRpb24gb2YgdHR5cGUuCi0gICAqCi0gICAqIElmIGlzQXJnIGlzIHRydWUsIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHdpbGwgYmUgcmV0dXJuZWQgZm9yCi0gICAqIHN0cnVjdHMuCi0gICAqLwotICBzdHJpbmcgcmVuZGVyX3R5cGVfbmFtZShjb25zdCB0X3R5cGUqIHR0eXBlLCBib29sIGlzQXJnID0gZmFsc2UpIGNvbnN0IHsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICByZXR1cm4gInZvaWQiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJib29sIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJieXRlIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gInNob3J0IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICByZXR1cm4gImludCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmV0dXJuICJsb25nIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gImRvdWJsZSI7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiQ29tcGlsZXIgZXJyb3I6IE5vIEQgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArCi0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICB0X2NvbnRhaW5lciogdGNvbnRhaW5lciA9ICh0X2NvbnRhaW5lciopIHR0eXBlOwotICAgICAgaWYgKHRjb250YWluZXItPmhhc19jcHBfbmFtZSgpKSB7Ci0gICAgICAgIHJldHVybiB0Y29udGFpbmVyLT5nZXRfY3BwX25hbWUoKTsKLSAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKikgdHR5cGU7Ci0gICAgICAgIHRfdHlwZSoga3R5cGUgPSB0bWFwLT5nZXRfa2V5X3R5cGUoKTsKLQotICAgICAgICBzdHJpbmcgbmFtZSA9IHJlbmRlcl90eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIlsiOwotICAgICAgICBpZiAoIWlzX2ltbXV0YWJsZV90eXBlKGt0eXBlKSkgewotICAgICAgICAgIG5hbWUgKz0gImltbXV0YWJsZSgiOwotICAgICAgICB9Ci0gICAgICAgIG5hbWUgKz0gcmVuZGVyX3R5cGVfbmFtZShrdHlwZSk7Ci0gICAgICAgIGlmICghaXNfaW1tdXRhYmxlX3R5cGUoa3R5cGUpKSB7Ci0gICAgICAgICAgbmFtZSArPSAiKSI7Ci0gICAgICAgIH0KLSAgICAgICAgbmFtZSArPSAiXSI7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICAgICAgcmV0dXJuICJIYXNoU2V0ISgiICsgcmVuZGVyX3R5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIikiOwotICAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHRfbGlzdCogdGxpc3QgPSAodF9saXN0KikgdHR5cGU7Ci0gICAgICAgIHJldHVybiByZW5kZXJfdHlwZV9uYW1lKHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIltdIjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpICYmIGlzQXJnKSB7Ci0gICAgICByZXR1cm4gInJlZiBjb25zdCgiICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgRCBUUmVxIGVudW0gbWVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gcmVxLgotICAgKi8KLSAgc3RyaW5nIHJlbmRlcl9yZXEodF9maWVsZDo6ZV9yZXEgcmVxKSBjb25zdCB7Ci0gICAgc3dpdGNoIChyZXEpIHsKLSAgICBjYXNlIHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ6Ci0gICAgICByZXR1cm4gIlRSZXEuT1BUX0lOX1JFUV9PVVQiOwotICAgIGNhc2UgdF9maWVsZDo6VF9PUFRJT05BTDoKLSAgICAgIHJldHVybiAiVFJlcS5PUFRJT05BTCI7Ci0gICAgY2FzZSB0X2ZpZWxkOjpUX1JFUVVJUkVEOgotICAgICAgcmV0dXJuICJUUmVxLlJFUVVJUkVEIjsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgIkNvbXBpbGVyIGVycm9yOiBJbnZhbGlkIHJlcXVpcmVtZW50IGxldmVsOiAiICsgcmVxOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGRlZmF1bHQgbGlzdCBvZiBpbXBvcnRzICh3aGljaCBhcmUgd3JpdHRlbiB0byBldmVyeSBnZW5lcmF0ZWQKLSAgICogbW9kdWxlKSB0byBmLgotICAgKi8KLSAgdm9pZCBwcmludF9kZWZhdWx0X2ltcG9ydHMob3N0cmVhbSYgb3V0KSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpbXBvcnQgdGhyaWZ0LmJhc2U7IiA8PCBlbmRsIDw8Ci0gICAgICAiaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmJhc2U7IiA8PCBlbmRsIDw8Ci0gICAgICAiaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0eXBlIGlzIMK7aW50cmluc2ljYWxseSBpbW11dGFibGXCqywgaW4gdGhlIHNlbnNlIHRoYXQKLSAgICogYSB2YWx1ZSBvZiB0aGF0IHR5cGUgaXMgaW1wbGljaXRseSBjYXN0YWJsZSB0byBpbW11dGFibGUodHlwZSksIGFuZCBpdCBpcwotICAgKiBhbGxvd2VkIGZvciBBQSBrZXlzIHdpdGhvdXQgYW4gaW1tdXRhYmxlKCkgcXVhbGlmaWVyLgotICAgKi8KLSAgYm9vbCBpc19pbW11dGFibGVfdHlwZSh0X3R5cGUqIHR5cGUpIGNvbnN0IHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCk7Ci0gIH0KLQotICAvKgotICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5Ci0gICAqIGZ1bmN0aW9uLgotICAgKi8KLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfaGVhZGVyXzsKLQotICBzdHJpbmcgcGFja2FnZV9kaXJfOwotfTsKLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihkLCAiRCIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjliYjgyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjk3OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi1jbGFzcyB0X2RlbHBoaV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yCi17Ci0gIHB1YmxpYzoKLSAgICB0X2RlbHBoaV9nZW5lcmF0b3IoCi0gICAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgICB7Ci0gICAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLQotICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImFuc2lzdHJfYmluYXJ5Iik7Ci0gICAgICBhbnNpc3RyX2JpbmFyeV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWRlbHBoaSI7Ci0gICAgICBlc2NhcGVfLmNsZWFyKCk7Ci0gICAgICBlc2NhcGVfWydcJyddID0gIicnIjsKLSAgICB9Ci0KLQotICAgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgICB2b2lkIGNsb3NlX2dlbmVyYXRvcigpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICAgIHZvaWQgZ2VuZXJhdGVfZW51bSAodF9lbnVtKiB0ZW51bSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogdHhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsICBib29sIGlzX3hjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X3dyaXRlcl8ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3N0cmVhbSYgb3V0LCBib29sIHN0cnVjdF9pc19leGNlcHRpb24sIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXggPSAiIik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsIGJvb2wgaXNfeGNlcHRpb25fY2xhc3MpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzLCBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2ltcGwob3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgsIGJvb2wgaXNfeGNlcHRpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbChvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc194X2ZhY3RvcnkpOwotCi0gICAgdm9pZCBhZGRfZGVscGhpX3VzZXNfbGlzdCggc3RyaW5nIHVuaXRuYW1lKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gICAgdm9pZCBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwgc3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0KLSAgICB2b2lkIHByaW50X2NvbnN0X3Byb3Aoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIHByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLSAgICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlICggc3RkOjpvc3RyZWFtJiB2YXJzLCBzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gICAgdm9pZCBpbml0aWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgdmFycywgc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICAgIHZvaWQgZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIHN0ZDo6c3RyaW5nIGNsc19ubSA9ICIiKTsKLSAgICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycywgc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICAgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKCBzdGQ6Om9zdHJlYW0mIHZhcnMsIHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBzdGQ6OnN0cmluZyBjbHNfbm0gPSAiIik7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbCggb3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UsIGJvb2wgaXNfeF9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgICB2b2lkIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIGZ1bmN0aW9uKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBwcmVmaXgpOwotICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIG5hbWUsIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0KLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50IChzdGQ6Om9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50IChzdGQ6Om9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4LCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotCi0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4LCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAoc3RkOjpvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAoc3RkOjpvc3RyZWFtJiBvdXQsIGJvb2wgaXNfeGNlcHRpb24sIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6OnN0cmluZyBtYXAsIHN0ZDo6b3N0cmVhbSYgbG9jYWxfdmFycyk7Ci0gICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlciwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKTsKLSAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyLCBzdGQ6Om9zdHJlYW0mIGxvY2FsX3ZhcnMpOwotCi0gICAgdm9pZCBkZWxwaGlfdHlwZV91c2luZ3Moc3RkOjpvc3RyZWFtJiBvdXQpOwotICAgIHN0ZDo6c3RyaW5nIGRlbHBoaV90aHJpZnRfdXNpbmdzKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyB0eXBlX25hbWUoIHRfdHlwZSogdHR5cGUsIGJvb2wgYl9jbHM9ZmFsc2UsIGJvb2wgYl9ub19wb3N0Zml4PWZhbHNlLCBib29sIGJfZXhjZXB0aW9uX2ZhY3Rvcnk9ZmFsc2UsIGJvb2wgYl9mdWxsX2V4Y2VwdGlvbl9mYWN0b3J5ID0gZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZV9jbHNubShzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBwcmVmaXgsIGJvb2wgYl9ub19jaGVja19rZXl3b3JkID0gZmFsc2UpOwotICAgIHN0ZDo6c3RyaW5nIGlucHV0X2FyZ19wcmVmaXgoIHRfdHlwZSogdHR5cGUpOwotICAKLSAgICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UpOwotICAgIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcyA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBmdWxsX2Nscz0iIiwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsgIAotICAgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICAgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIGN1cnJlbnRfaW5kZW50KTsKLSAgICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gICAgc3RkOjpzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBwcm9wX25hbWUoc3RkOjpzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKHN0cmluZyBuYW1lKTsKLQotICAgIHZvaWQgd3JpdGVfZW51bShzdGQ6OnN0cmluZyBsaW5lKTsKLSAgICB2b2lkIHdyaXRlX2ZvcndhcmRfZGVjcihzdGQ6OnN0cmluZyBsaW5lKTsKLSAgICB2b2lkIHdyaXRlX2NvbnN0KHN0ZDo6c3RyaW5nIGxpbmUpOwotICAgIHZvaWQgd3JpdGVfc3RydWN0KHN0ZDo6c3RyaW5nIGxpbmUpOwotICAgIHZvaWQgd3JpdGVfc2VydmljZShzdGQ6OnN0cmluZyBsaW5lKTsKLQotICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgICAgcmV0dXJuCi0gICAgICAgIHN0ZDo6c3RyaW5nKCIoKipcbiIpICsKLSAgICAgICAgIiAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgICAgICIgKlxuIiArCi0gICAgICAgICIgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAgICAgIiAqKVxuIjsKLSAgICB9Ci0KLSAgICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8Ci0gICAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfZm9yd2FyZF9kZWNyOwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX2VudW07Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3Q7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfc3RydWN0OwotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3NlcnZpY2U7Ci0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNfY29uc3RfaW1wbDsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zdHJ1Y3RfaW1wbDsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc19zZXJ2aWNlX2ltcGw7Ci0gICAgYm9vbCBoYXNfZW51bTsKLSAgICBib29sIGhhc19jb25zdDsKLSAgICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfa2V5d29yZHM7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gZGVscGhpX3Jlc2VydmVkX21ldGhvZDsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbjsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiB0eXBlc19rbm93bjsKLSAgICBzdGQ6Omxpc3Q8dF90eXBlZGVmKj4gdHlwZWRlZnNfcGVuZGluZzsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdXNlc19saXN0OwotICAgIHZvaWQgY3JlYXRlX2tleXdvcmRzKCk7Ci0gICAgYm9vbCBmaW5kX2tleXdvcmQoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gICAgc3RkOjpzdHJpbmcgbm9ybWFsaXplX25hbWUoIHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgYl9tZXRob2QgPSBmYWxzZSwgYm9vbCBiX2V4Y2VwdGlvbl9tZXRob2QgPSBmYWxzZSk7Ci0gICAgc3RkOjpzdHJpbmcgZW1wdHlfdmFsdWUodF90eXBlKiB0eXBlKTsKLSAgICBib29sIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSggdF90eXBlKiB0dHlwZSk7Ci0gICAgdm9pZCBhZGRfZGVmaW5lZF90eXBlKCB0X3R5cGUqIHR0eXBlKTsKLSAgICB2b2lkIGluaXRfa25vd25fdHlwZXNfbGlzdCgpOwotICAgIGJvb2wgaXNfdm9pZCggdF90eXBlKiB0eXBlICk7Ci0gICAgaW50IGluZGVudF9pbXBsXzsKLSAgICBib29sIGFuc2lzdHJfYmluYXJ5XzsKLSAgICB2b2lkIGluZGVudF91cF9pbXBsKCl7Ci0gICAgICArK2luZGVudF9pbXBsXzsKLSAgICB9OwotICAgIHZvaWQgaW5kZW50X2Rvd25faW1wbCgpIHsKLSAgICAgIC0taW5kZW50X2ltcGxfOwotICAgIH07Ci0gICAgc3RkOjpzdHJpbmcgaW5kZW50X2ltcGwoKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGluZGVudF9pbXBsXzsgKytpKSB7Ci0gICAgICAgIGluZCArPSAiICAiOwotICAgICAgfQotICAgICAgcmV0dXJuIGluZDsKLSAgICB9OwotICAgIHN0ZDo6b3N0cmVhbSYgaW5kZW50X2ltcGwoc3RkOjpvc3RyZWFtICZvcykgewotICAgICAgcmV0dXJuIG9zIDw8IGluZGVudF9pbXBsKCk7Ci0gICAgfTsKLX07Ci0KLWJvb2wgdF9kZWxwaGlfZ2VuZXJhdG9yOjpmaW5kX2tleXdvcmQoIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+JiBrZXl3b3JkX21hcCwgc3RkOjpzdHJpbmcgbmFtZSkgewotICBpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKLQotICBpZiAoIGxlbiA8PSAwICkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBubGFzdCA9IG5hbWUuZmluZF9sYXN0X29mKCdfJyk7Ci0KLSAgaWYgKCBubGFzdCA+PSAxKSB7Ci0gICAgaWYgKG5sYXN0ID09IChsZW4gLSAxKSkgewotICAgICAgc3RyaW5nIG5ld19uYW1lKCBuYW1lLCAwLCBubGFzdCk7Ci0gICAgICByZXR1cm4gZmluZF9rZXl3b3JkKCBrZXl3b3JkX21hcCwgbmV3X25hbWUpOwotICAgIH0KLSAgfQotICByZXR1cm4gKGtleXdvcmRfbWFwW25hbWVdID09IDEpOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6Om5vcm1hbGl6ZV9uYW1lKCBzdGQ6OnN0cmluZyBuYW1lLCBib29sIGJfbWV0aG9kLCBib29sIGJfZXhjZXB0aW9uX21ldGhvZCkgewotICBzdHJpbmcgdG1wKCBuYW1lICk7Ci0gIHN0ZDo6dHJhbnNmb3JtKHRtcC5iZWdpbigpLCB0bXAuZW5kKCksIHRtcC5iZWdpbigpLCBzdGF0aWNfY2FzdDxpbnQgKCopKGludCk+KHN0ZDo6dG9sb3dlcikpOwotCi0gIGJvb2wgYl9mb3VuZCA9IGZhbHNlOwotCi0gIGlmICggZmluZF9rZXl3b3JkKCBkZWxwaGlfa2V5d29yZHMsIHRtcCkgKSB7Ci0gICAgYl9mb3VuZCA9IHRydWU7Ci0gIH0gZWxzZSBpZiAoIGJfbWV0aG9kICYmIGZpbmRfa2V5d29yZCggZGVscGhpX3Jlc2VydmVkX21ldGhvZCwgdG1wKSkgewotICAgIGJfZm91bmQgPSB0cnVlOwotICB9IGVsc2UgaWYgKCBiX2V4Y2VwdGlvbl9tZXRob2QgJiYgZmluZF9rZXl3b3JkKCBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvbiwgdG1wKSkgewotICAgIGJfZm91bmQgPSB0cnVlOwotICB9Ci0KLSAgaWYgKGJfZm91bmQpIHsKLSAgICByZXR1cm4gbmFtZSArICJfIjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Y3JlYXRlX2tleXdvcmRzKCkgewotICBkZWxwaGlfa2V5d29yZHNbImFuZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJlbmQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW50ZXJmYWNlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJhaXNlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInVzZXMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYXJyYXkiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZXhjZXB0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImlzIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInJlY29yZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ2YXIiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYXMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZXhwb3J0cyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJsYWJlbCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJyZXBlYXQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siYXNtIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZpbGUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sibGlicmFyeSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJyZXNvdXJjZXN0cmluZyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ3aXRoIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImJlZ2luIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZpbmFsaXphdGlvbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJtb2QiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sic2V0Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInhvciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJjYXNlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImZpbmFsbHkiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sibmlsIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInNobCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJjbGFzcyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJmb3IiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sibm90Il0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInNociJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJjb25zdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJmdW5jdGlvbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJvYmplY3QiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImNvbnN0cnVjdG9yIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImdvdG8iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sib2YiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidGhlbiJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJkZXN0cnVjdG9yIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImlmIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm9yIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRocmVhZHZhciJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJkaXNwaW50ZXJmYWNlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImltcGxlbWVudGF0aW9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbIm91dCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ0byJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJkaXYiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siaW4iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicGFja2VkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInRyeSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJkbyJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJpbmhlcml0ZWQiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHJvY2VkdXJlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInR5cGUiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1siZG93bnRvIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImluaXRpYWxpemF0aW9uIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByb2dyYW0iXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sidW5pdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJlbHNlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImlubGluZSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwcm9wZXJ0eSJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJ1bnRpbCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwcml2YXRlIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbInByb3RlY3RlZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJwdWJsaWMiXSA9IDE7Ci0gIGRlbHBoaV9rZXl3b3Jkc1sicHVibGlzaGVkIl0gPSAxOwotICBkZWxwaGlfa2V5d29yZHNbImF1dG9tYXRlZCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJhdCJdID0gMTsKLSAgZGVscGhpX2tleXdvcmRzWyJvbiJdID0gMTsKLQotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjcmVhdGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZyZWUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluaXRpbnN0YW5jZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xlYW51cGluc3RhbmNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc3R5cGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzbmFtZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY2xhc3NuYW1laXMiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImNsYXNzcGFyZW50Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJjbGFzc2luZm8iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImluc3RhbmNlc2l6ZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiaW5oZXJpdHNmcm9tIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RhZGRyZXNzIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJtZXRob2RuYW1lIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmaWVsZGFkZHJlc3MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImZpZWxkYWRkcmVzcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJnZXRpbnRlcmZhY2VlbnRyeSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZ2V0aW50ZXJmYWNldGFibGUiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbInVuaXRuYW1lIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJlcXVhbHMiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImdldGhhc2hjb2RlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ0b3N0cmluZyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsic2FmZWNhbGxleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImFmdGVyY29uc3RydWN0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJiZWZvcmVkZXN0cnVjdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZGlzcGF0Y2giXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RbImRlZmF1bHRoYW5kbGVyIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJuZXdpbnN0YW5jZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiZnJlZWluc3RhbmNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJkZXN0cm95Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJyZWFkIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJ3cml0ZSJdID0gMTsKLQotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic2V0aW5uZXJleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJzZXRzdGFja2luZm8iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRzdGFja3RyYWNlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsicmFpc2luZ2V4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWZtdCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlcyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2ZtdCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZWhlbHAiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJjcmVhdGVmbXRoZWxwIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY3JlYXRlcmVzaGVscCJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImNyZWF0ZXJlc2ZtdGhlbHAiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRiYXNlZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiYmFzZWV4Y2VwdGlvbiJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImhlbHBjb250ZXh0Il0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiaW5uZXJleGNlcHRpb24iXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJtZXNzYWdlIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsic3RhY2t0cmFjZSJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bInN0YWNraW5mbyJdID0gMTsKLSAgZGVscGhpX3Jlc2VydmVkX21ldGhvZF9leGNlcHRpb25bImdldGV4Y2VwdGlvbnN0YWNraW5mb3Byb2MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJnZXRzdGFja2luZm9zdHJpbmdwcm9jIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsiY2xlYW51cHN0YWNraW5mb3Byb2MiXSA9IDE7Ci0gIGRlbHBoaV9yZXNlcnZlZF9tZXRob2RfZXhjZXB0aW9uWyJyYWlzZW91dGVyZXhjZXB0aW9uIl0gPSAxOwotICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kX2V4Y2VwdGlvblsidGhyb3dvdXRlcmV4Y2VwdGlvbiJdID0gMTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmFkZF9kZWxwaGlfdXNlc19saXN0KCBzdHJpbmcgdW5pdG5hbWUpewotICB2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7Ci0gIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICBpZiAoKCpzX2l0ZXIpID09IHVuaXRuYW1lICkgewotICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICghIGZvdW5kKSB7Ci0gICAgdXNlc19saXN0LnB1c2hfYmFjayggdW5pdG5hbWUgKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIGluZGVudF9pbXBsXyA9IDA7Ci0gIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJkZWxwaGkiKTsKLSAgaGFzX2VudW0gPSBmYWxzZTsKLSAgaGFzX2NvbnN0ID0gZmFsc2U7Ci0gIGNyZWF0ZV9rZXl3b3JkcygpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiQ2xhc3NlcyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiU3lzVXRpbHMiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIkdlbmVyaWNzLkNvbGxlY3Rpb25zIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOwotICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7Ci0gIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKLSAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKLQotICBpbml0X2tub3duX3R5cGVzX2xpc3QoKTsKLSAgCi0gIHN0cmluZyB1bml0bmFtZSwgbnNuYW1lOwotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgdW5pdG5hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKLSAgICBuc25hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7Ci0gICAgaWYgKCAiIiAhPSBuc25hbWUpIHsKLSAgICAgIHVuaXRuYW1lID0gbnNuYW1lOwotICAgIH0KLSAgICBhZGRfZGVscGhpX3VzZXNfbGlzdCh1bml0bmFtZSk7Ci0gIH0KLQotCi0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7IAotICBzdGQ6OnN0cmluZyB1bml0bmFtZSA9IHByb2dyYW1fbmFtZV87Ci0gIGlmKCAiIiAhPSBuYW1lc3BhY2VfbmFtZV8pIHsKLSAgICB1bml0bmFtZSA9IG5hbWVzcGFjZV9uYW1lXzsKLSAgfQotCi0gIGZvciAoIGludCBpID0gMDsgaSA8IChpbnQpdW5pdG5hbWUuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIHVuaXRuYW1lW2ldID09ICcgJyApIHsKLSAgICAgIHVuaXRuYW1lLnJlcGxhY2UoIGksIDEsICJfIiApOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAiLyIgKyB1bml0bmFtZSArICIucGFzIjsKLSAgc3RkOjpvZnN0cmVhbSBmX2FsbDsKLQotICBmX2FsbC5vcGVuKCBmX25hbWUuY19zdHIoKSApOwotCi0gIGZfYWxsIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfYWxsIDw8ICJ1bml0ICIgPDwgdW5pdG5hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9hbGwgPDwgImludGVyZmFjZSIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2FsbCAgPDwgInVzZXMiICA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHNfaXRlcjsKLSAgZm9yIChzX2l0ZXIgPSB1c2VzX2xpc3QuYmVnaW4oKTsgc19pdGVyICE9IHVzZXNfbGlzdC5lbmQoKTsgKytzX2l0ZXIpIHsKLSAgICBpZiAoc19pdGVyICE9IHVzZXNfbGlzdC5iZWdpbigpKSB7Ci0gICAgICBmX2FsbCA8PCAiLCI7Ci0gICAgICBmX2FsbCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQoZl9hbGwpIDw8ICpzX2l0ZXI7Ci0gIH0KLQotICBmX2FsbCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgc3RyaW5nIHRtcF91bml0KCB1bml0bmFtZSApOwotICBmb3IgKCBpbnQgaSA9IDA7IGkgPCAoaW50KXRtcF91bml0LnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCB0bXBfdW5pdFtpXSA9PSAnLicgKSB7Ci0gICAgICB0bXBfdW5pdC5yZXBsYWNlKCBpLCAxLCAiXyIgKTsKLSAgICB9Ci0gIH0KLQotICBmX2FsbCAgPDwgImNvbnN0IiAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX2FsbCkgIDw8ICJjIiA8PCB0bXBfdW5pdCA8PCAiX09wdGlvbl9BbnNpU3RyX0JpbmFyeSA9ICIgPDwgKCBhbnNpc3RyX2JpbmFyeV8gPyAiVHJ1ZSIgOiAiRmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX2FsbCAgPDwgInR5cGUiICA8PCBlbmRsOwotICBmX2FsbCAgPDwgc19mb3J3YXJkX2RlY3Iuc3RyKCk7Ci0gIGlmIChoYXNfZW51bSkgewotICAgIGluZGVudChmX2FsbCkgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9hbGwpIDw8ICJ7JFNDT1BFREVOVU1TIE9OfSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfYWxsICA8PCBzX2VudW0uc3RyKCk7Ci0gICAgaW5kZW50KGZfYWxsKSA8PCAieyRTQ09QRURFTlVNUyBPRkZ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgZl9hbGwgIDw8IHNfc3RydWN0LnN0cigpOwotICBmX2FsbCAgPDwgc19zZXJ2aWNlLnN0cigpOwotICBmX2FsbCAgPDwgc19jb25zdC5zdHIoKTsKLSAgZl9hbGwgIDw8ICJpbXBsZW1lbnRhdGlvbiIgIDw8IGVuZGwgPDwgZW5kbDsKLSAgZl9hbGwgIDw8IHNfc3RydWN0X2ltcGwuc3RyKCk7Ci0gIGZfYWxsICA8PCBzX3NlcnZpY2VfaW1wbC5zdHIoKTsKLSAgZl9hbGwgIDw8IHNfY29uc3RfaW1wbC5zdHIoKTsKLQotICBpZiAoIGhhc19jb25zdCApIHsKLSAgICBmX2FsbCAgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0iIDw8IGVuZGw7Ci0gICAgZl9hbGwgIDw8ICJpbml0aWFsaXphdGlvbiIgPDwgZW5kbDsKLSAgICBmX2FsbCAgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGZfYWxsICA8PCAiICBUQ29uc3RhbnRzX0luaXRpYWxpemU7IiA8PCBlbmRsOwotICAgIGZfYWxsICA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZl9hbGwgIDw8ICJmaW5hbGl6YXRpb24iIDw8IGVuZGw7Ci0gICAgZl9hbGwgIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBmX2FsbCAgPDwgIiAgVENvbnN0YW50c19GaW5hbGl6ZTsiIDw8IGVuZGw7Ci0gICAgZl9hbGwgIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIGZfYWxsICA8PCAieyRJRkVORH0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBmX2FsbCAgPDwgImVuZC4iIDw8IGVuZGw7Ci0gIGZfYWxsLmNsb3NlKCk7Ci0gIAotICBpZiggISB0eXBlZGVmc19wZW5kaW5nLmVtcHR5KCkpCi0gICAgcHJpbnRmKCJwZW5kaW5nIHR5cGVkZWZzIHdpdGggdW5yZXNvbHZlZCByZWZlcmVuY2VzIGFyZSBsZWZ0XG4iKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmRlbHBoaV90eXBlX3VzaW5ncyggb3N0cmVhbSYgb3V0KSB7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiQ2xhc3NlcywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUaHJpZnQuQ29sbGVjdGlvbnMsIFRocmlmdC5Qcm90b2NvbCwiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJUaHJpZnQuVHJhbnNwb3J0OyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gIHRfdHlwZSogdHlwZSA9IHR0eXBlZGVmLT5nZXRfdHlwZSgpOwotCi0gIC8vIHdyaXRlIG5vdyBvciBzYXZlIGZvciBsYXRlcj8gIAotICBpZiggISBpc19mdWxseV9kZWZpbmVkX3R5cGUoIHR5cGUpKSB7Ci0gICAgdHlwZWRlZnNfcGVuZGluZy5wdXNoX2JhY2soIHR0eXBlZGVmKTsgCi0gICAgcmV0dXJuOwotICB9Ci0gIAotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfc3RydWN0KSA8PCAKLSAgICB0eXBlX25hbWUodHR5cGVkZWYpIDw8ICIgPSAiOwotCi0gIGJvb2wgY29udGFpbmVyID0gdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpOwotCi0gIC8vIGNvbW1lbnRlZCBvdXQ6IHRoZSBiZW5lZml0IGlzIG5vdCBiaWcgZW5vdWdoIHRvIHJpc2sgYnJlYWtpbmcgZXhpc3RpbmcgY29kZQotICAvL2lmKCAhIGNvbnRhaW5lcikKLSAgLy8gIHNfc3RydWN0IDw8ICJ0eXBlICI7ICAvL3RoZSAidHlwZSBBID0gdHlwZSBCIiBzeW50YXggbGVhZHMgdG8gRTI1NzQgd2l0aCBnZW5lcmljcwotCi0gIHNfc3RydWN0IDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgISBjb250YWluZXIpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgCi0gIGFkZF9kZWZpbmVkX3R5cGUoIHR0eXBlZGVmKTsKLX0KLQotYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX2Z1bGx5X2RlZmluZWRfdHlwZSggdF90eXBlKiB0dHlwZSkgewotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiAoMSA9PSB0eXBlc19rbm93blsgdHlwZV9uYW1lKHR0eXBlKV0pOwotICB9Ci0gIAotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuICgxID09IHR5cGVzX2tub3duWyBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKV0pOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsgIC8vIGVudW1zIGFyZSB3cml0dGVuIGZpcnN0LCBiZWZvcmUgYWxsIG90aGVyIHR5cGVzCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF9tYXAgKnRtYXAgPSAodF9tYXAqKSB0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0bWFwLT5nZXRfa2V5X3R5cGUoKSkgJiYKLSAgICAgICAgICAgaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0bWFwLT5nZXRfdmFsX3R5cGUoKSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICByZXR1cm4gaXNfZnVsbHlfZGVmaW5lZF90eXBlKCB0c2V0LT5nZXRfZWxlbV90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIHJldHVybiBpc19mdWxseV9kZWZpbmVkX3R5cGUoIHRsaXN0LT5nZXRfZWxlbV90eXBlKCkpOwotICB9Ci0KLSAgcmV0dXJuICgxID09IHR5cGVzX2tub3duWyB0eXBlX25hbWUodHR5cGUpXSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjphZGRfZGVmaW5lZF90eXBlKCB0X3R5cGUqIHR0eXBlKSB7Ci0gIC8vIG1hcmsgYXMga25vd24gdHlwZQotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKHR0eXBlKV0gPSAxOwotICAKLSAgLy8gY2hlY2sgYWxsIHBlbmRpbmcgdHlwZWRlZnMKLSAgc3RkOjpsaXN0PHRfdHlwZWRlZio+OjppdGVyYXRvciAgaXRlcjsKLSAgYm9vbCBtb3JlID0gdHJ1ZTsKLSAgd2hpbGUoIG1vcmUgJiYgKCEgdHlwZWRlZnNfcGVuZGluZy5lbXB0eSgpKSkKLSAgewotICAgIG1vcmUgPSBmYWxzZTsKLSAgICAKLSAgICBmb3IoIGl0ZXIgPSB0eXBlZGVmc19wZW5kaW5nLmJlZ2luKCk7IHR5cGVkZWZzX3BlbmRpbmcuZW5kKCkgIT0gaXRlcjsgKytpdGVyKQotICAgIHsKLSAgICAgIHRfdHlwZWRlZiogdHR5cGVkZWYgPSAoKml0ZXIpOwotICAgICAgaWYoIGlzX2Z1bGx5X2RlZmluZWRfdHlwZSggdHR5cGVkZWYtPmdldF90eXBlKCkpKQotICAgICAgewotICAgICAgICB0eXBlZGVmc19wZW5kaW5nLmVyYXNlKCBpdGVyKTsKLSAgICAgICAgZ2VuZXJhdGVfdHlwZWRlZiggdHR5cGVkZWYpOwotICAgICAgICBtb3JlID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjppbml0X2tub3duX3R5cGVzX2xpc3QoKSB7Ci0gIC8vIGtub3duIGJhc2UgdHlwZXMKLSAgdHlwZXNfa25vd25bIHR5cGVfbmFtZSggZ190eXBlX3N0cmluZyldID0gMTsKLSAgdHlwZXNfa25vd25bIHR5cGVfbmFtZSggZ190eXBlX2JpbmFyeSldID0gMTsKLSAgdHlwZXNfa25vd25bIHR5cGVfbmFtZSggZ190eXBlX2Jvb2wpXSA9IDE7Ci0gIHR5cGVzX2tub3duWyB0eXBlX25hbWUoIGdfdHlwZV9ieXRlKV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfaTE2KV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfaTMyKV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfaTY0KV0gPSAxOwotICB0eXBlc19rbm93blsgdHlwZV9uYW1lKCBnX3R5cGVfZG91YmxlKV0gPSAxOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGhhc19lbnVtID0gdHJ1ZTsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX2VudW0pIDw8Ci0gICAgdHlwZV9uYW1lKHRlbnVtLHRydWUsdHJ1ZSkgPDwgIiA9ICIgPDwgICIoIiAgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmJlZ2luKCkpIHsKLSAgICAgIHNfZW51bSA8PCAiLCI7Ci0gICAgICBzX2VudW0gPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KHNfZW51bSkgPDwgbm9ybWFsaXplX25hbWUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gIiA8PCB2YWx1ZTsKLSAgfQotICBzX2VudW0gPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfZW51bSkgPDwgIik7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpewotICAgIHJldHVybjsKLSAgfQotCi0gIGhhc19jb25zdCA9IHRydWU7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX2NvbnN0KSA8PAotICAgICJUQ29uc3RhbnRzID0gY2xhc3MiIDw8IGVuZGw7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAicHJpdmF0ZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9wcml2YXRlX2ZpZWxkKHNfY29uc3QsIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBwcmludF9jb25zdF9wcm9wKHNfY29uc3QsIG5vcm1hbGl6ZV9uYW1lKCgqY19pdGVyKS0+Z2V0X25hbWUoKSksIAotICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnQoc19jb25zdCkgPDwgInskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9IiA8PCBlbmRsOwotICBpbmRlbnQoc19jb25zdCkgPDwgImNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChzX2NvbnN0KSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciBEZXN0cm95OyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJ7JElGRU5EfSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfY29uc3QpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtICB2YXJzLCBjb2RlOwotCi0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW5pdGlhbGl6ZV9maWVsZCh2YXJzLCBjb2RlLCAiRiIgKyBwcm9wX25hbWUoICgqY19pdGVyKS0+Z2V0X25hbWUoKSksCi0gICAgICAoKmNfaXRlciktPmdldF90eXBlKCksICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJ7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgY29uc3RydWN0b3IgVENvbnN0YW50cy5DcmVhdGU7IiA8PCBlbmRsOwotCi0gIGlmICggISB2YXJzLnN0cigpLmVtcHR5KCkgKSB7Ci0gICAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwotICAgIHNfY29uc3RfaW1wbCA8PCB2YXJzLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpZiAoICEgY29kZS5zdHIoKS5lbXB0eSgpICkgewotICAgIHNfY29uc3RfaW1wbCA8PCBjb2RlLnN0cigpOwotICB9Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAiY2xhc3MgZGVzdHJ1Y3RvciBUQ29uc3RhbnRzLkRlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsIG5vcm1hbGl6ZV9uYW1lKCAoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskRUxTRX0iIDw8IGVuZGw7Ci0KLSAgdmFycy5zdHIoIiIpOwotICBjb2RlLnN0cigiIik7Ci0KLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbml0aWFsaXplX2ZpZWxkKCB2YXJzLCBjb2RlLCAiVENvbnN0YW50cy5GIiArIHByb3BfbmFtZSggKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICgqY19pdGVyKS0+Z2V0X3R5cGUoKSwgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInByb2NlZHVyZSBUQ29uc3RhbnRzX0luaXRpYWxpemU7IiA8PCBlbmRsOwotICBpZiAoICEgdmFycy5zdHIoKS5lbXB0eSgpICkgewotICAgIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICBzX2NvbnN0X2ltcGwgPDwgdmFycy5zdHIoKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaWYgKCAhIGNvZGUuc3RyKCkuZW1wdHkoKSApIHsKLSAgICBzX2NvbnN0X2ltcGwgPDwgY29kZS5zdHIoKTsKLSAgfQotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoc19jb25zdF9pbXBsKSA8PCAicHJvY2VkdXJlIFRDb25zdGFudHNfRmluYWxpemU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX2NvbnN0X2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBmaW5hbGl6ZV9maWVsZChzX2NvbnN0X2ltcGwsIG5vcm1hbGl6ZV9uYW1lKCAoKmNfaXRlciktPmdldF9uYW1lKCkpLAotICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpLCAiVENvbnN0YW50cyIgKTsKLSAgfQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfY29uc3RfaW1wbCkgPDwgInskSUZFTkR9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9kZWZfdmFsdWUoc3RkOjpvc3RyZWFtJiB2YXJzLCBzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIHN0cmluZyBjbHNfbm0pCi17Ci0KLSAgc3RyaW5nIGNsc19wcmVmaXg7Ci0KLSAgaWYgKGNsc19ubSA9PSAiIikgewotICAgIGNsc19wcmVmaXggPSAiIjsKLSAgfSBlbHNlIHsKLSAgICBjbHNfcHJlZml4ID0gY2xzX25tICsgIi4iOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IGNsc19wcmVmaXggPDwgbm9ybWFsaXplX25hbWUobmFtZSkgPDwgIi4iIDw8IHByb3BfbmFtZSggdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCB0eXBlLT5pc194Y2VwdGlvbigpKSA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCB2YXJzLCBvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgY2xzX3ByZWZpeCA8PCBub3JtYWxpemVfbmFtZShuYW1lKSA8PCAiWyIgPDwga2V5IDw8ICJdIiA8PCAiIDo9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBjbHNfcHJlZml4IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OnByaW50X3ByaXZhdGVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSB2YWx1ZTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzIHZhciBGIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfcHJvcChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIHZhbHVlOwotICBpbmRlbnQob3V0KSA8PCAiY2xhc3MgcHJvcGVydHkgIiA8PCBuYW1lIDw8ICI6ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgcmVhZCBGIiA8PCBuYW1lIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoIHN0ZDo6b3N0cmVhbSYgdmFycywgc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHRfdHlwZSogdHJ1ZXR5cGUgPSB0eXBlOwotICB3aGlsZSAodHJ1ZXR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHRydWV0eXBlID0gKCh0X3R5cGVkZWYqKXRydWV0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0cnVldHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBzdHJpbmcgdjIgPSByZW5kZXJfY29uc3RfdmFsdWUoIHZhcnMsIG91dCwgbmFtZSwgdHlwZSwgdmFsdWUpOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdjIgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHJ1ZXR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIHR5cG5hbWU7Ci0gICAgdHlwbmFtZSA9IHR5cGVfbmFtZSggdHlwZSwgdHJ1ZSwgZmFsc2UsIHR5cGUtPmlzX3hjZXB0aW9uKCksIHR5cGUtPmlzX3hjZXB0aW9uKCkpOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgdHlwbmFtZSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gICAgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKCB2YXJzLCBvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5pdGlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIHZhcnMsIHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBwcmludF9jb25zdF92YWx1ZSggdmFycywgb3V0LCBuYW1lLCB0eXBlLCB2YWx1ZSApOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6ZmluYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlICwgc3RyaW5nIGNsc19ubSkgewotICAodm9pZCkgb3V0OwotICAodm9pZCkgbmFtZTsKLSAgKHZvaWQpIHR5cGU7Ci0gICh2b2lkKSB2YWx1ZTsKLSAgKHZvaWQpIGNsc19ubTsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIHZhcnMsIG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0KLSAgdF90eXBlKiB0cnVldHlwZSA9IHR5cGU7Ci0gIHdoaWxlICh0cnVldHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHJ1ZXR5cGUgPSAoKHRfdHlwZWRlZiopdHJ1ZXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHJ1ZXR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRydWV0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgcmVuZGVyIDw8ICInIiA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICInIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIHJlbmRlciA8PCAiU2hvcnRJbnQoICIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZW5kZXIgPDwgIlNtYWxsSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmVuZGVyIDw8ICJMb25nSW50KCAiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVuZGVyIDw8ICJJbnQ2NCggIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZW5kZXIgPDwgIiI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHRydWV0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZV9uYW1lKCB0eXBlLCBmYWxzZSkgPDwgIigiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgdmFycyA8PCAgIiAgIiA8PCB0IDw8ICIgOiAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBwcmludF9jb25zdF92YWx1ZSggdmFycywgb3V0LCB0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9kZWZpbml0aW9uKHNfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICBpbmRlbnRfZG93bigpOwotICAKLSAgYWRkX2RlZmluZWRfdHlwZSggdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKHNfc3RydWN0X2ltcGwsICIiLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF9pbXBsKCBvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0LCBib29sIGlzX3hfZmFjdG9yeSkgewotCi0gIGlmIChpc19leGNlcHRpb24gJiYgICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2ltcGwoIG91dCwgIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgaXNfcmVzdWx0LCB0cnVlKTsKLSAgfQotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgc3RyaW5nIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWU7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oIHRzdHJ1Y3QtPmdldF9uYW1lKCksICIiLCB0cnVlICkgKyAiRmFjdG9yeSI7Ci0gIH0KLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSwoISBpc194X2ZhY3RvcnkpLGlzX3hfZmFjdG9yeSx0cnVlKTsKLSAgfQotICBlbHNlIHsKLSAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlKTsKLSAgfQotCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB2YXJzLCBjb2RlOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBpbml0aWFsaXplX2ZpZWxkKCB2YXJzLCBjb2RlLCAiRiIgKyBwcm9wX25hbWUoICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgaXNfZXhjZXB0aW9uKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJjb25zdHJ1Y3RvciAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICAiLiIgPDwgIkNyZWF0ZTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCAhIHZhcnMuc3RyKCkuZW1wdHkoKSkgewotICAgIG91dCA8PCAidmFyIiA8PCBlbmRsOwotICAgIG91dCA8PCB2YXJzLnN0cigpOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmIChpc19leGNlcHRpb24gJiYgKCEgaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZCBDcmVhdGUoJycpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOj0gVCIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoICEgY29kZS5zdHIoKS5lbXB0eSgpKSB7Ci0gICAgb3V0IDw8IGNvZGUuc3RyKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImNvbnN0cnVjdG9yICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgICIuIiA8PCAiQ3JlYXRlKCIgPDwgY29uc3RydWN0b3JfYXJndW1lbnRfbGlzdCggdHN0cnVjdCwgaW5kZW50X2ltcGwoKSkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiQ3JlYXRlOyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgcHJvcG5hbWUgPSBwcm9wX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCBpc19leGNlcHRpb24pOwotICAgICAgc3RyaW5nIHBhcmFtX25hbWUgPSBjb25zdHJ1Y3Rvcl9wYXJhbV9uYW1lKCAoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCBwcm9wbmFtZSA8PCAiIDo9ICIgPDwgcGFyYW1fbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZGVzdHJ1Y3RvciAiICA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAgIi4iIDw8ICJEZXN0cm95OyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICB3aGlsZSAodC0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICB0ID0gKCh0X3R5cGVkZWYqKXQpLT5nZXRfdHlwZSgpOwotICAgIH0KLSAgICBmaW5hbGl6ZV9maWVsZCggb3V0LCBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpbmhlcml0ZWQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpIHsKLSAgICAgIHQgPSAoKHRfdHlwZWRlZiopdCktPmdldF90eXBlKCk7Ci0gICAgfQotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbCggb3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHlfd3JpdGVyX2ltcGwoIG91dCwgY2xzX3ByZWZpeCwgY2xzX25tLCB0LCAqbV9pdGVyLCAiRiIsIGlzX2V4Y2VwdGlvbiAsIGlzX3hfZmFjdG9yeSwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9pc3NldF9yZWFkZXJfaW1wbCggb3V0LCBjbHNfcHJlZml4LCBjbHNfbm0sIHQsICptX2l0ZXIsICJGIiwgaXNfZXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoKCEgaXNfZXhjZXB0aW9uKSB8fCBpc194X2ZhY3RvcnkpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKCBvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgaWYgKCBpc19yZXN1bHQgKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbCggb3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3dyaXRlcl9pbXBsKCBvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfdG9zdHJpbmdfaW1wbCggb3V0LCBjbHNfcHJlZml4LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGlzX3hfZmFjdG9yeSk7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKCBvdXQsIGNsc19wcmVmaXgsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpbl9jbGFzcywgYm9vbCBpc19yZXN1bHQsIGJvb2wgaXNfeF9mYWN0b3J5KSB7Ci0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLSAgc3RyaW5nIHN0cnVjdF9pbnRmX25hbWU7Ci0gIHN0cmluZyBzdHJ1Y3RfbmFtZTsKLSAgc3RyaW5nIGlzc2V0X25hbWU7IAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIHN0cmluZyBleGNlcHRpb25fZmFjdG9yeV9uYW1lID0gbm9ybWFsaXplX2Nsc25tKCB0c3RydWN0LT5nZXRfbmFtZSgpLCAiIiwgdHJ1ZSApICsgIkZhY3RvcnkiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBzdHJ1Y3RfaW50Zl9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsZmFsc2UsZmFsc2UsdHJ1ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3RydWN0X2ludGZfbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgfQotCi0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIHN0cnVjdF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsIHRydWUsICghIGlzX3hfZmFjdG9yeSksIGlzX3hfZmFjdG9yeSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgc3RydWN0X25hbWUgPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlKTsKLSAgfQotCi0gIGlmICgoISBpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgewotCi0gICAgaW5kZW50KG91dCkgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiID0gaW50ZXJmYWNlKElCYXNlKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbiggb3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgZ2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9kZWZpbml0aW9uKCBvdXQsICptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKGlzX3hfZmFjdG9yeSkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiLy8gQ3JlYXRlIEV4Y2VwdGlvbiBPYmplY3QiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgaXNfZXhjZXB0aW9uKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgICAgICBnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24oIG91dCwgKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBCb29sZWFuIHJlYWQgR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgc3RydWN0X25hbWUgPDwgIiA9ICI7Ci0gIGlmIChpc19maW5hbCkgewotICAgIG91dCA8PCAic2VhbGVkICI7Ci0gIH0KLSAgb3V0IDw8ICJjbGFzcygiOwotICBpZiAoIGlzX2V4Y2VwdGlvbiAmJiAoISBpc194X2ZhY3RvcnkpKSB7Ci0gICAgb3V0IDw8ICJURXhjZXB0aW9uIjsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwgIlRJbnRlcmZhY2VkT2JqZWN0LCBJQmFzZSwgIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lOwotICB9Ci0gIG91dCA8PCAiKSIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfZGVmaW5pdGlvbiggb3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIGluX2NsYXNzLCBpc19yZXN1bHQsIHRydWUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiIDoiIDw8IHN0cnVjdF9pbnRmX25hbWUgPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiRiIsIGlzX2V4Y2VwdGlvbikgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGlzc2V0X25hbWUgPSAiRl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGluZGVudChvdXQpIDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfZGVmaW5pdGlvbiggb3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgIGdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbiggb3V0LCAqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoKG1lbWJlcnMuc2l6ZSgpID4gMCkgJiYgaXNfZXhjZXB0aW9uICYmICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSgiIDw8IGNvbnN0cnVjdG9yX2FyZ3VtZW50X2xpc3QoIHRzdHJ1Y3QsIGluZGVudCgpKSA8PCAiKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvciBDcmVhdGU7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOwotCi0gIG91dCAgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7IG92ZXJyaWRlOyIgPDwgZW5kbDsKLQotICBpZiAoaXNfZXhjZXB0aW9uICYmICghIGlzX3hfZmFjdG9yeSkpIHsKLSAgICBvdXQgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIEV4Y2VwdGlvbiBGYWN0b3J5IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjogIiA8PCBzdHJ1Y3RfaW50Zl9uYW1lIDw8ICIgcmVhZCBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgd3JpdGUgRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICgoISBpc19leGNlcHRpb24pIHx8IGlzX3hfZmFjdG9yeSkgewotICAgIG91dCAgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gSUJhc2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInByb2NlZHVyZSBXcml0ZSggY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbiAmJiBpc194X2ZhY3RvcnkpIHsKLSAgICBvdXQgIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIi8vIENyZWF0ZSBFeGNlcHRpb24gT2JqZWN0IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBDcmVhdGVFeGNlcHRpb246ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSx0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gUHJvcGVydGllcyIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBnZW5lcmF0ZV9wcm9wZXJ0eShvdXQsICptX2l0ZXIsIHRydWUsIGlzX2V4Y2VwdGlvbik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIG91dCA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgICBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgbm9ybWFsaXplX2Nsc25tKHNlcnZpY2VfbmFtZV8sICJUIikgPDwgIiA9IGNsYXNzIiA8PCBlbmRsOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotCi0gIGluZGVudF91cCgpOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9IGV4dGVuZHMgKyAiLklmYWNlIjsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgIklmYWNlID0gaW50ZXJmYWNlKCIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PAotICAgICAgIklmYWNlID0gaW50ZXJmYWNlIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8Ci0gICAgICBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwgbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOwotICB9Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLlRDbGllbnQiOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8Ci0gICAgICAiVENsaWVudCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiwgSWZhY2UpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8Ci0gICAgICAiVENsaWVudCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSWZhY2UpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggcHJvdDogSVByb3RvY29sKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpIDw8ICIuVENsaWVudC5DcmVhdGUoIHByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJDcmVhdGUoIHByb3QsIHByb3QgKTsiIDw8IGVuZGw7ICAgIAotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTsgb3ZlcmxvYWQ7IiA8PCBlbmRsOwotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAgCi0gICAgImNvbnN0cnVjdG9yICIgPDwgbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpIDw8IAotICAgICIuVENsaWVudC5DcmVhdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaXByb3RfIDo9IGlwcm90OyIgPDwgZW5kbDsgICAgCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfIDo9IG9wcm90OyIgPDwgZW5kbDsgICAgCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm90ZWN0ZWQiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgImlwcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAib3Byb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IEludGVnZXI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBJbnB1dFByb3RvY29sOiBJUHJvdG9jb2wgcmVhZCBpcHJvdF87IiA8PCBlbmRsOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJwcm9wZXJ0eSBPdXRwdXRQcm90b2NvbDogSVByb3RvY29sIHJlYWQgb3Byb3RfOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJwdWJsaWMiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubShzZXJ2aWNlX25hbWVfLCJUIikgKyAiLlRDbGllbnQiOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIGZ1bGxfY2xzKSA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOwotICAgICAgfQotICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgbm9ybWFsaXplX25hbWUoICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PCBpbmRlbnRfaW1wbCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiUmVzdWx0IDo9ICI7Ci0gICAgICB9Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PAotICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICB0X2Z1bmN0aW9uIHNlbmRfZnVuY3Rpb24oZ190eXBlX3ZvaWQsCi0gICAgICAgIHN0cmluZygic2VuZF8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKCBhcmdzbmFtZSwgIlQiKTsKLSAgICBzdHJpbmcgYXJnc19pbnRmbm09IG5vcm1hbGl6ZV9jbHNubSggYXJnc25hbWUsICJJIik7Ci0KLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZnVsbF9jbHMpIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MgOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAibXNnIDogSU1lc3NhZ2U7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwKLSAgICAgICJzZXFpZF8gOj0gc2VxaWRfICsgMTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8Ci0gICAgICAibXNnIDo9IFRNZXNzYWdlSW1wbC5DcmVhdGUoJyIgPDwgZnVubmFtZSA8PCAiJywgVE1lc3NhZ2VUeXBlLkNhbGwsIHNlcWlkXyk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8Ci0gICAgICAib3Byb3RfLldyaXRlTWVzc2FnZUJlZ2luKCBtc2cgKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8Ci0gICAgICAiYXJncyA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PAotICAgICAgICAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgOj0gIiA8PCBub3JtYWxpemVfbmFtZSggKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFyZ3MuV3JpdGUob3Byb3RfKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PAotICAgICAgICAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdF8uV3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIG9yZ19yZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiIDsKLSAgICAgIHN0cmluZyByZXN1bHRfY2xzbm0gPSBub3JtYWxpemVfY2xzbm0oIG9yZ19yZXN1bHRuYW1lLCAiVCIpOwotICAgICAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0oIG9yZ19yZXN1bHRuYW1lLCAiSSIpOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0KLSAgICAgIHRfc3RydWN0ICp4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbiwgZnVsbF9jbHMpIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6IElNZXNzYWdlOyIgPDwgZW5kbDsKLSAgICAgIGlmICggeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJleCA6IEV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOiBUQXBwbGljYXRpb25FeGNlcHRpb247IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQgOiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gaXByb3RfLlJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIChtc2cuVHlwZV8gPSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSB0aGVuIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgeDsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0IDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LlJlYWQoaXByb3RfKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90Xy5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIChyZXQuX19pc3NldF9zdWNjZXNzKSB0aGVuIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSByZXQuU3VjY2VzczsiIDw8IGVuZGw7Ci0gICAgICAgIHRfdHlwZSAqdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXQuU3VjY2VzcyA6PSBuaWw7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIChyZXQuX19pc3NldF8iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiKSB0aGVuIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImV4IDo9IHJldC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiLkNyZWF0ZUV4Y2VwdGlvbjsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmFpc2UgZXg7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgCi0gICAgICAgICAgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3NlcnZpY2UpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotCi0gIHN0cmluZyBmdWxsX2NscyA9IG5vcm1hbGl6ZV9jbHNubSggc2VydmljZV9uYW1lXywgIlQiKSArICIuVFByb2Nlc3NvckltcGwiOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5UUHJvY2Vzc29ySW1wbCI7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwKLSAgICAgICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIiwgSVByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwKLSAgICAgICJUUHJvY2Vzc29ySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImNvbnN0cnVjdG9yIENyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiY29uc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkNyZWF0ZSggaWZhY2VfOiBJZmFjZSApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCi0gIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZCBDcmVhdGUoIGlmYWNlXyk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiaW5oZXJpdGVkIENyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJTZWxmLmlmYWNlXyA6PSBpZmFjZV87IiA8PCBlbmRsOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKLSAgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiQVNTRVJUKCBwcm9jZXNzTWFwXyA8PiBuaWwpOyAgLy8gaW5oZXJpdGVkIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicHJvY2Vzc01hcF8gOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj4uQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IAotICAgICAgInByb2Nlc3NNYXBfLkFkZE9yU2V0VmFsdWUoICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIl9Qcm9jZXNzKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImRlc3RydWN0b3IgIiA8PCBmdWxsX2NscyA8PCAiLkRlc3Ryb3k7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwgInByaXZhdGUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiaWZhY2VfOiBJZmFjZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpCi0gIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJ0eXBlIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUUHJvY2Vzc0Z1bmN0aW9uID0gcmVmZXJlbmNlIHRvIHByb2NlZHVyZSggc2VxaWQ6IEludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgInByb3RlY3RlZCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2Vzc01hcF86IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3NGdW5jdGlvbj47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTogQm9vbGVhbjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgImZ1bmN0aW9uIFByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOiBCb29sZWFuOyByZWludHJvZHVjZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImZ1bmN0aW9uICIgPDwgZnVsbF9jbHMgPDwgIi5Qcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sKTogQm9vbGVhbjsiIDw8IGVuZGw7OwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOiBJTWVzc2FnZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOiBUUHJvY2Vzc0Z1bmN0aW9uOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbiA6PSBuaWw7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIG5vdCBwcm9jZXNzTWFwXy5UcnlHZXRWYWx1ZShtc2cuTmFtZSwgZm4pIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9yIG5vdCBBc3NpZ25lZChmbikgdGhlbiIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZShUQXBwbGljYXRpb25FeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgJ0ludmFsaWQgbWV0aG9kIG5hbWU6ICcnJyArIG1zZy5OYW1lICsgJycnJyk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBUTWVzc2FnZUltcGwuQ3JlYXRlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAieC5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiUmVzdWx0IDo9IFRydWU7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIkV4aXQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCk7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBGYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiRXhpdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlJlc3VsdCA6PSBUcnVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKLSAgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJTdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0ICp4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X2RlZmluaXRpb24oc19zZXJ2aWNlLCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX2RlbHBoaV9zdHJ1Y3RfaW1wbChzX3NlcnZpY2VfaW1wbCwgbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi4iLCAmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIHN0cmluZyBmdW5jbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgc3RyaW5nIGZ1bGxfY2xzID0gbm9ybWFsaXplX2Nsc25tKCBzZXJ2aWNlX25hbWVfLCAiVCIpICsgIi5UUHJvY2Vzc29ySW1wbCI7Ci0KLSAgc3RyaW5nIG9yZ19hcmdzbmFtZSAgPSBmdW5jbmFtZSArICJfYXJncyI7Ci0gIHN0cmluZyBhcmdzX2Nsc25tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIlQiKTsKLSAgc3RyaW5nIGFyZ3NfaW50Zm5tID0gbm9ybWFsaXplX2Nsc25tKG9yZ19hcmdzbmFtZSwgIkkiKTsKLQotICBzdHJpbmcgb3JnX3Jlc3VsdG5hbWUgPSBmdW5jbmFtZSArICJfcmVzdWx0IjsKLSAgc3RyaW5nIHJlc3VsdF9jbHNubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIlQiKTsKLSAgc3RyaW5nIHJlc3VsdF9pbnRmbm0gPSBub3JtYWxpemVfY2xzbm0ob3JnX3Jlc3VsdG5hbWUsICJJIik7Ci0KLSAgaW5kZW50KHNfc2VydmljZSkgPDwKLSAgICAicHJvY2VkdXJlICIgPDwgZnVuY25hbWUgPDwgIl9Qcm9jZXNzKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICIvLyBvbmUgd2F5IHByb2Nlc3NvciIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIi8vIGJvdGggd2F5IHByb2Nlc3NvciIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PAotICAgICJwcm9jZWR1cmUgIiA8PCBmdWxsX2NscyA8PCAiLiIgPDwgZnVuY25hbWUgPDwgIl9Qcm9jZXNzKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogSU1lc3NhZ2U7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0OiAiIDw8IHJlc3VsdF9pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NfY2xzbm0gPDwgIkltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzLlJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0IDo9ICIgPDwgcmVzdWx0X2Nsc25tIDw8ICJJbXBsLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInRyeSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBzX3NlcnZpY2VfaW1wbCA8PCAicmV0LlN1Y2Nlc3MgOj0gIjsKLSAgfQotICBzX3NlcnZpY2VfaW1wbCA8PCAgImlmYWNlXy4iIDw8IG5vcm1hbGl6ZV9uYW1lKCB0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOwotICAgIH0KLSAgICBzX3NlcnZpY2VfaW1wbCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKLSAgfQotICBzX3NlcnZpY2VfaW1wbCA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwKLSAgICAgICJhcmdzLiIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIgOj0gIiA8PCBlbXB0eV92YWx1ZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZXhjZXB0IiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib24gRTogIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLHRydWUsdHJ1ZSkgPDwgIiBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0oKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpLCIiLHRydWUpICsgIkZhY3RvcnkiOwotICAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgCi0gICAgICAgICAgInJldC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiIDo9IEUuIiA8PCBmYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoISB0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSgnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpOyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsgIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAicmV0LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgsIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICB3aGlsZSh0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICB0eXBlID0gKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyBwcm9wX25hbWUodGZpZWxkLGlzX3hjZXB0aW9uKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSwgIiIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgaXNfeGNlcHRpb24sIHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgIG5hbWUgPDwgIiA6PSAiOwotCi0gICAgaWYgKHR5cGUtPmlzX2VudW0oKSkKLSAgICB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlKSA8PCAiKCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJpcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7Ci0gICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRBbnNpU3RyaW5nKCk7IjsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpOyI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbCgpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTE2KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTMyKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJSZWFkRG91YmxlKCk7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKLSAgICAgIG91dCA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBERVNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGVfbmFtZSh0eXBlKS5jX3N0cigpKTsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lLCBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyB0eXBfbmFtZTsKLQotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSxmYWxzZSx0cnVlLHRydWUpOwotICB9IGVsc2UgewotICAgIHR5cF9uYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSxmYWxzZSk7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8IHByZWZpeCA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBfbmFtZSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgcHJlZml4IDw8IG5hbWUgPDwgIi5SZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgbmFtZSwgc3RkOjpvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0KLSAgc3RyaW5nIG9iajsKLSAgc3RyaW5nIGNvdW50ZXI7Ci0gIHN0cmluZyBsb2NhbF92YXI7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG9iaiA9IHRtcCgiX21hcCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgiX3NldCIpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvYmogPSB0bXAoIl9saXN0Iik7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgbG9jYWxfdmFyID0gb2JqICsgIjogSU1hcDsiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElTZXQ7IjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgbG9jYWxfdmFyID0gb2JqICsgIjogSUxpc3Q7IjsKLSAgfQotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7Ci0gIGNvdW50ZXIgPSB0bXAoIl9pIik7Ci0gIGxvY2FsX3ZhciA9IGNvdW50ZXIgKyAiOiBJbnRlZ2VyOyI7Ci0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBsb2NhbF92YXIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgdHJ1ZSkgPDwgIi5DcmVhdGU7IiA8PCBlbmRsOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8IG9iaiA8PCAiIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBpcHJvdC5SZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAKLSAgICAiZm9yICIgPDwgY291bnRlciA8PCAiIDo9IDAgdG8gIiA8PCBvYmogPDwgIi5Db3VudCAtIDEgZG8iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCBpc194Y2VwdGlvbiwgKHRfbGlzdCopdHR5cGUsIG5hbWUsIGxvY2FsX3ZhcnMpOwotICB9Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaXByb3QuUmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpcHJvdC5SZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCwgb3N0cmVhbSYgbG9jYWxfdmFycykgewotCi0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICBzdHJpbmcgbG9jYWxfdmFyOwotCi0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBkZWNsYXJlX2ZpZWxkKCZma2V5KSA8PCBlbmRsOwotICBsb2NhbF92YXJzIDw8ICIgICIgPDwgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmtleSwgIiIsIGxvY2FsX3ZhcnMpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZnZhbCwgIiIsIGxvY2FsX3ZhcnMpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGRPclNldFZhbHVlKCAiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgsIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCwgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLSAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZmVsZW0sICIiLCBsb2NhbF92YXJzKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gICh2b2lkKSBsb2NhbF92YXJzOwotCi0gIHRfdHlwZSogdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uKTsKLSAgCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwgKHRfc3RydWN0Kil0eXBlLCBuYW1lLCBsb2NhbF92YXJzKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCBpc194Y2VwdGlvbiwgdHlwZSwgbmFtZSwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgCi0gICAgaW5kZW50X2ltcGwob3V0KSA8PAotICAgICAgIm9wcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLQotICAgICAgc3dpdGNoKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUFuc2lTdHJpbmcoIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVCaW5hcnkoIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJXcml0ZVN0cmluZygiOwotICAgICAgICAgIH0KLSAgICAgICAgICBvdXQgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJXcml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRiYXNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKEludGVnZXIoIiA8PCBuYW1lIDw8ICIpKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgb3N0cmVhbSYgbG9jYWxfdmFycykgewotICAodm9pZCkgbG9jYWxfdmFyczsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudF9pbXBsKCkgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCBib29sIGlzX3hjZXB0aW9uLCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4LCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHN0cmluZyBvYmo7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvYmogPSB0bXAoIm1hcCIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElNYXA7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVE1hcEltcGwuQ3JlYXRlKCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLkNvdW50KTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG9iaiA9IHRtcCgic2V0XyIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElTZXQ7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVFNldEltcGwuQ3JlYXRlKCIgIDw8IAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5Db3VudCk7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICJvcHJvdC5Xcml0ZVNldEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgibGlzdF8iKTsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgb2JqIDw8ICIgOiBJTGlzdDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBUTGlzdEltcGwuQ3JlYXRlKCIgIDw8IAotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8Ci0gICAgICAib3Byb3QuV3JpdGVMaXN0QmVnaW4oICIgPDwgb2JqIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IGl0ZXIgPDwgIjogIiA8PCB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIuS2V5cyBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBpdGVyIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIiBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBsb2NhbF92YXJzIDw8ICIgICIgPDwgaXRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiIGRvIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgbG9jYWxfdmFycyk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X3NldCopdHR5cGUsIGl0ZXIsIGxvY2FsX3ZhcnMpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgaXNfeGNlcHRpb24sICh0X2xpc3QqKXR0eXBlLCBpdGVyLCBsb2NhbF92YXJzKTsKLSAgfQotCi0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwLCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgaXNfeGNlcHRpb24sICZrZmllbGQsICIiLCBsb2NhbF92YXJzKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBpc194Y2VwdGlvbiwgJnZmaWVsZCwgIiIsIGxvY2FsX3ZhcnMpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyLCBvc3RyZWFtJiBsb2NhbF92YXJzKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgYm9vbCBpc194Y2VwdGlvbiwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIsIG9zdHJlYW0mIGxvY2FsX3ZhcnMpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGlzX3hjZXB0aW9uLCAmZWZpZWxkLCAiIiwgbG9jYWxfdmFycyk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBpc194Y2VwdGlvbikgewotICBnZW5lcmF0ZV9kZWxwaGlfcHJvcGVydHkob3V0LCBpc194Y2VwdGlvbiwgdGZpZWxkLCBpc1B1YmxpYywgIkdldCIpOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgYm9vbCBzdHJ1Y3RfaXNfeGNlcHRpb24sIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgc3RkOjpzdHJpbmcgZmllbGRQcmVmaXgpIHsKLSAgKHZvaWQpIGlzUHVibGljOwotCi0gIHRfdHlwZSogZnR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGJvb2wgaXNfeGNlcHRpb24gPSBmdHlwZS0+aXNfeGNlcHRpb24oKTsKLSAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOiAiIDw8IHR5cGVfbmFtZShmdHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSA8PCAiIHJlYWQgIiA8PCBmaWVsZFByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIHN0cnVjdF9pc194Y2VwdGlvbikKLSAgICA8PCAiIHdyaXRlIFNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgc3RydWN0X2lzX3hjZXB0aW9uKSA8PCAiOyIgPDwgZW5kbDsKLX0KLQotc3RkOjpzdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpwcm9wX25hbWUodF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uKSB7Ci0gIHJldHVybiAgcHJvcF9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSwgaXNfeGNlcHRpb24pOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OnByb3BfbmFtZShzdHJpbmcgbmFtZSwgYm9vbCBpc194Y2VwdGlvbikgewotICBzdHJpbmcgcmV0ID0gbmFtZTsKLSAgcmV0WzBdID0gdG91cHBlcihyZXRbMF0pOwotICByZXR1cm4gbm9ybWFsaXplX25hbWUoIHJldCwgdHJ1ZSwgaXNfeGNlcHRpb24pOwotfQotCi1zdGQ6OnN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmNvbnN0cnVjdG9yX3BhcmFtX25hbWUoc3RyaW5nIG5hbWUpIHsKLSAgc3RyaW5nIHJldCA9IG5hbWU7Ci0gIHJldFswXSA9IHRvdXBwZXIocmV0WzBdKTsKLSAgcmV0ID0gIkEiICsgcmV0OwotICByZXR1cm4gbm9ybWFsaXplX25hbWUoIHJldCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6bm9ybWFsaXplX2Nsc25tKHN0cmluZyBjbHNubSwgc3RyaW5nIHByZWZpeCwgYm9vbCBiX25vX2NoZWNrX2tleXdvcmQpIHsKLSAgaWYgKGNsc25tLnNpemUoKSA+IDApIHsKLSAgICBjbHNubVswXSA9IHRvdXBwZXIoY2xzbm1bMF0pOwotICB9Ci0gIGlmIChiX25vX2NoZWNrX2tleXdvcmQpIHsKLSAgICByZXR1cm4gcHJlZml4ICsgY2xzbm07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKCBwcmVmaXggKyBjbHNubSk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV9uYW1lKCB0X3R5cGUqIHR0eXBlLCBib29sIGJfY2xzLCBib29sIGJfbm9fcG9zdGZpeCwgYm9vbCBiX2V4Y2VwdGlvbl9mYWN0b3J5LCBib29sIGJfZnVsbF9leGNlcHRpb25fZmFjdG9yeSkgewotICAKLSAgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICByZXR1cm4gbm9ybWFsaXplX25hbWUoICJUIisoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfc3ltYm9saWMoKSk7Ci0gIH0KLSAgCi0gIHN0cmluZyB0eXBfbm07Ci0KLSAgc3RyaW5nIHNfZmFjdG9yeTsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBiX2NscyA9IHRydWU7Ci0gICAgYl9ub19wb3N0Zml4ID0gdHJ1ZTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCAqdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgIGlmIChiX2NscykgewotICAgICAgdHlwX25tID0gIlRUaHJpZnREaWN0aW9uYXJ5SW1wbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0RGljdGlvbmFyeSI7Ci0gICAgfQotICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsKLSAgICAgICIsICIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0KikgdHR5cGU7Ci0gICAgaWYgKGJfY2xzKSB7Ci0gICAgICB0eXBfbm0gPSAiVEhhc2hTZXRJbXBsIjsKLSAgICB9IGVsc2UgewotICAgICAgdHlwX25tID0gIklIYXNoU2V0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHR5cF9ubSArICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopIHR0eXBlOwotICAgIGlmIChiX2NscykgewotICAgICAgdHlwX25tID0gIlRUaHJpZnRMaXN0SW1wbCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHR5cF9ubSA9ICJJVGhyaWZ0TGlzdCI7Ci0gICAgfQotICAgIHJldHVybiB0eXBfbm0gKyAiPCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7Ci0gIH0KLQotICBzdHJpbmcgdHlwZV9wcmVmaXg7Ci0KLSAgaWYgKGJfY2xzKSB7Ci0gICAgdHlwZV9wcmVmaXggPSAiVCI7Ci0gIH0gZWxzZSB7Ci0gICAgdHlwZV9wcmVmaXggPSAiSSI7Ci0gIH0KLQotICBzdHJpbmcgbm0gPSBub3JtYWxpemVfY2xzbm0oIHR0eXBlLT5nZXRfbmFtZSgpLCB0eXBlX3ByZWZpeCk7Ci0KLSAgaWYgKGJfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKLSAgICBubSA9IG5tICsgIkZhY3RvcnkiOwotICB9Ci0KLSAgaWYgKGJfY2xzKSB7Ci0gICAgaWYgKCEgYl9ub19wb3N0Zml4KSB7Ci0gICAgICBubSA9IG5tICsgIkltcGwiOwotICAgIH0KLSAgfQotCi0gIGlmICggYl9leGNlcHRpb25fZmFjdG9yeSAmJiBiX2Z1bGxfZXhjZXB0aW9uX2ZhY3RvcnkpIHsKLSAgICByZXR1cm4gdHlwZV9uYW1lKCB0dHlwZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlICkgKyAiLiIgKyBubTsKLSAgfQotCi0gIHJldHVybiBubTsKLX0KLQotLy8gcmV0dXJucyAiY29uc3QgIiBmb3Igc29tZSBhcmd1bWVudCB0eXBlcwotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6aW5wdXRfYXJnX3ByZWZpeCggdF90eXBlKiB0dHlwZSkgewotCi0gIC8vIGJhc2UgdHlwZXMKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpKSB7Ci0gIAotICAgICAgLy8gdGhlc2Ugc2hvdWxkIGJlIGNvbnN0J2VkIGZvciBvcHRpbWFsIHBlcmZvcm1hbWNlCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogIC8vIHJlZmNvdW50ZWQgcG9pbnRlcgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6ICAgLy8gbGFyZ2VyIHRoYW4gMzIgYml0Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRTogICAvLyBsYXJnZXIgdGhhbiAzMiBiaXQKLSAgICAgICAgcmV0dXJuICJjb25zdCAiOwotICAKLSAgICAgIC8vIGFsbCBvdGhlcnMgZG9uJ3QgbmVlZCB0byBiZQotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgcmV0dXJuICIiOwotICAgICAgCi0gICAgICAvLyB3ZSBiZXR0ZXIgYWx3YXlzIHJlcG9ydCBhbnkgdW5rbm93biB0eXBlcwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBpbnB1dF9hcmdfcHJlZml4KCkgZm9yIGJhc2UgdHlwZSAiICsgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSk7Ci0gICAgfQotICAKLSAgLy8gZW51bXMKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICIiOyAgIC8vIHVzdWFsbHkgPD0gMzIgYml0Ci0gIAotICAvLyBjb250YWluZXJzCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJjb25zdCAiOyAgLy8gcmVmY291bnRlZCBwb2ludGVyCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gImNvbnN0ICI7ICAvLyByZWZjb3VudGVkIHBvaW50ZXIKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gImNvbnN0ICI7ICAvLyByZWZjb3VudGVkIHBvaW50ZXIKLQotICB9Ci0gIAotICAvLyBhbnkgb3RoZXIgdHlwZSwgZWl0aGVyIFRTb21ldGhpbmcgb3IgSVNvbWV0aGluZwotICByZXR1cm4gImNvbnN0ICI7ICAvLyBwb3NzaWJseSByZWZjb3VudGVkIHBvaW50ZXIKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlKSB7Ci0gIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAvLyBubyAidm9pZCIgaW4gRGVscGhpIGxhbmd1YWdlCi0gICAgICByZXR1cm4gIiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodGJhc2UtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIGlmICggYW5zaXN0cl9iaW5hcnlfKSB7Ci0gICAgICAgICAgcmV0dXJuICJBbnNpU3RyaW5nIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gIlRCeXRlcyI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAic3RyaW5nIjsKLSAgICAgIH0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIkJvb2xlYW4iOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiU2hvcnRJbnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJTbWFsbEludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIkludGVnZXIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJJbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIkRvdWJsZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdGJhc2UtPmdldF9iYXNlKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgc3RkOjpzdHJpbmcgcHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gICh2b2lkKSBpbml0OwotCi0gIHRfdHlwZSAqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgc3RyaW5nIHJlc3VsdCA9IHByZWZpeCArIHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSArICI6ICIgKyB0eXBlX25hbWUoZnR5cGUsZmFsc2UsdHJ1ZSxpc194Y2VwdGlvbix0cnVlKSArICI7IjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgZnVsbF9jbHMsIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgc3RyaW5nIHByZWZpeDsKLSAgaWYgKGZ1bGxfY2xzID09ICIiKSB7Ci0gICAgcHJlZml4ID0gIiI7Ci0gIH0gZWxzZSB7Ci0gICAgcHJlZml4ID0gZnVsbF9jbHMgKyAiLiI7Ci0gIH0KLSAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7Ci0gICAgcmV0dXJuICJwcm9jZWR1cmUgIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgICsgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogdHQ7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiOyAiOwotICAgIH0KLQotICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICByZXN1bHQgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7ICAvLyBjb25zdD8KLSAgcmVzdWx0ICs9IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiOiAiICsgdHlwZV9uYW1lKCB0dCwgZmFsc2UsIHRydWUsIHR0LT5pc194Y2VwdGlvbigpLCB0cnVlKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9kZWxwaGlfZ2VuZXJhdG9yOjpjb25zdHJ1Y3Rvcl9hcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgY3VycmVudF9pbmRlbnQpIHsKLSAgb3N0cmluZ3N0cmVhbSByZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIHRfdHlwZSogdHQ7Ci0gIHN0cmluZyBsaW5lID0gIiI7Ci0gIHN0cmluZyBuZXdsaW5lX2luZGVudCA9IGN1cnJlbnRfaW5kZW50ICsgIiAgIjsKLQotICBib29sIGZpcnN0bGluZSA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxpbmUgKz0gIjsiOwotICAgIH0KLQotICAgIGlmIChsaW5lLnNpemUoKSA+IDgwKSB7Ci0gICAgICBpZiAoIGZpcnN0bGluZSApIHsKLSAgICAgICAgcmVzdWx0IDw8IGVuZGwgPDwgbmV3bGluZV9pbmRlbnQ7Ci0gICAgICAgIGZpcnN0bGluZSA9IGZhbHNlOwotICAgICAgfQotICAgICAgcmVzdWx0IDw8IGxpbmUgPDwgZW5kbDsKLSAgICAgIGxpbmUgPSBuZXdsaW5lX2luZGVudDsKLSAgICB9IGVsc2UgaWYgKCBsaW5lLnNpemUoKSA+IDApIHsKLSAgICAgIGxpbmUgKz0gIiAiOwotICAgIH0KLQotICAgIHR0ID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGxpbmUgKz0gaW5wdXRfYXJnX3ByZWZpeCh0dCk7ICAvLyBjb25zdD8KLSAgICBsaW5lICs9IGNvbnN0cnVjdG9yX3BhcmFtX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSArICI6ICIgKyB0eXBlX25hbWUoIHR0LCBmYWxzZSwgdHJ1ZSwgdHQtPmlzX3hjZXB0aW9uKCksIHRydWUpOwotICB9Ci0KLSAgaWYgKCBsaW5lLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgPDwgbGluZTsKLSAgfQotCi0gIHN0cmluZyByZXN1bHRfc3RyOwotCi0gIGlmIChmaXJzdGxpbmUpIHsKLSAgICByZXN1bHRfc3RyID0gIiAiICsgcmVzdWx0LnN0cigpOwotICB9IGVsc2UgewotICAgIHJlc3VsdF9zdHIgPSByZXN1bHQuc3RyKCk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0X3N0cjsKLX0KLQotc3RyaW5nIHRfZGVscGhpX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gIlRUeXBlLlN0cmluZ18iOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZXR1cm4gIlRUeXBlLkJvb2xfIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5CeXRlXyI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgcmV0dXJuICJUVHlwZS5JMTYiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIlRUeXBlLkk2NCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgcmV0dXJuICJUVHlwZS5Eb3VibGVfIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlN0cnVjdCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1hcCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNldF8iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUuTGlzdCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmVtcHR5X3ZhbHVlKHRfdHlwZSogdHlwZSkgewotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHJldHVybiAiMCI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgICAgIHJldHVybiAiJyciOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIm5pbCI7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAiJyciOwotICAgICAgICB9Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJldHVybiAiRmFsc2UiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXR1cm4gIjAiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiAiMC4wIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiKDApIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAibmlsIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV93cml0ZXJfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgewotICB0X3R5cGUgKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudChvdXQpIDw8ICJwcm9jZWR1cmUgU2V0IiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiggY29uc3QgVmFsdWU6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLGZhbHNlLHRydWUsaXNfeGNlcHRpb24sdHJ1ZSkgPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3JlYWRlcl9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzX3hjZXB0aW9uX2NsYXNzKSB7Ci0gIHRfdHlwZSAqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwotICBib29sIGlzX3hjZXB0aW9uID0gZnR5cGUtPmlzX3hjZXB0aW9uKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLGZhbHNlLHRydWUsaXNfeGNlcHRpb24sdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldF9faXNzZXRfIiA8PCBwcm9wX25hbWUoIHRmaWVsZCwgaXNfeGNlcHRpb24pIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3Byb3BlcnR5X3dyaXRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uX2NsYXNzLCBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSkgewotICAodm9pZCkgdHlwZTsKLQotICB0X3R5cGUgKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIgPDwgIlNldCIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICIoIGNvbnN0IFZhbHVlOiAiIDw8IHR5cGVfbmFtZShmdHlwZSxmYWxzZSx0cnVlLGlzX3hjZXB0aW9uLHRydWUpIDw8ICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGlmICh0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRl9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBUcnVlOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfaW1wbChvdXQpIDw8IGZpZWxkUHJlZml4IDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKSA8PCAiIDo9IFZhbHVlOyIgPDwgZW5kbDsKLQotICBpZiAoaXNfeGNlcHRpb25fY2xhc3MgJiYgKCEgaXNfeGNlcHRpb25fZmFjdG9yeSkgKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiRiIgPDwgeGNlcHRpb25fZmFjdHJveV9uYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9wcm9wZXJ0eV9yZWFkZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNsc19wcmVmaXgsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCwgYm9vbCBpc194Y2VwdGlvbl9jbGFzcykgewotICAodm9pZCkgdHlwZTsKLQotICB0X3R5cGUgKiBmdHlwZSA9IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgYm9vbCBpc194Y2VwdGlvbiA9IGZ0eXBlLT5pc194Y2VwdGlvbigpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIiA8PCAiR2V0IiA8PCBwcm9wX25hbWUoIHRmaWVsZCwgaXNfeGNlcHRpb25fY2xhc3MpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKGZ0eXBlLGZhbHNlLHRydWUsaXNfeGNlcHRpb24sdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIGZpZWxkUHJlZml4LCBib29sIGlzX3hjZXB0aW9uKSB7Ci0gICh2b2lkKSB0eXBlOwotCi0gIHN0cmluZyBpc3NldF9uYW1lID0gIl9faXNzZXRfIiArIHByb3BfbmFtZSggdGZpZWxkLCBpc194Y2VwdGlvbik7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBuYW1lIDw8ICIuIiA8PCAiR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgaXNzZXRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfY3JlYXRlX2V4Y2VwdGlvbl9pbXBsKG9zdHJlYW0mIG91dCwgc3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICAodm9pZCkgY2xzX3ByZWZpeDsKLQotICBzdHJpbmcgZXhjZXB0aW9uX2Nsc19ubSA9IHR5cGVfbmFtZSh0c3RydWN0LHRydWUsdHJ1ZSk7Ci0gIHN0cmluZyBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlLGlzX2V4Y2VwdGlvbixpc19leGNlcHRpb24pOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX25tIDw8ICIuQ3JlYXRlRXhjZXB0aW9uOiAiIDw8IGV4Y2VwdGlvbl9jbHNfbm0gPDwgIjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQgOj0gIiA8PCBleGNlcHRpb25fY2xzX25tIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgc3RyaW5nIGZhY3RvcnlfbmFtZSA9IG5vcm1hbGl6ZV9jbHNubSh0c3RydWN0LT5nZXRfbmFtZSgpLCIiLHRydWUpICsgIkZhY3RvcnkiOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuIiA8PCBmYWN0b3J5X25hbWUgPDwgIiA6PSBTZWxmOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHByb3BuYW1lOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcHJvcG5hbWUgPSBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICB9Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LiIgPDwgcHJvcG5hbWUgPDwgICIgOj0gIiA8PCBwcm9wbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuVXBkYXRlTWVzc2FnZVByb3BlcnR5OyIgPDwgZW5kbDsKLSAKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwgc3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotCi0gIG9zdHJpbmdzdHJlYW0gbG9jYWxfdmFyczsKLSAgb3N0cmluZ3N0cmVhbSBjb2RlX2Jsb2NrOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotCi0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICAvLyBsb2NhbCBib29scyBmb3IgcmVxdWlyZWQgZmllbGRzCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8IAotICAgICAgICAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOiBCb29sZWFuOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8IAotICAgICAgICAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gRkFMU0U7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyeSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAid2hpbGUgKHRydWUpIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXyA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKGZpZWxkXy5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4iIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIkJyZWFrOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJjYXNlIGZpZWxkXy5JRCBvZiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgfQotCi0gICAgZmlyc3QgPSBmYWxzZTsKLSAgICBpZiAoZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7Ci0gICAgICBjb2RlX2Jsb2NrIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiBiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoZmllbGRfLlR5cGVfID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB0aGVuIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAgKmZfaXRlciwgIiIsIGxvY2FsX3ZhcnMpOwotCi0gICAgLy8gcmVxdWlyZWQgZmllbGQ/Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8IAotICAgICAgICAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOj0gVFJVRTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotCi0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCBlbHNlIiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJiZWdpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkXy5UeXBlXyk7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCI7Ci0KLSAgfQotCi0gIGlmICghIGZpcnN0KSB7Ci0gICAgY29kZV9ibG9jayA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbHNlIGJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZF8uVHlwZV8pOyIgPDwgZW5kbDsKLQotICBpZiAoISBmaXJzdCkgewotICAgIGluZGVudF9kb3duX2ltcGwoKTsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaXByb3QuUmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmluYWxseSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImlwcm90LlJlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotCi0gIC8vIGFsbCByZXF1aXJlZCBmaWVsZHMgaGF2ZSBiZWVuIHJlYWQ/ICAKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgCi0gICAgICAgICJpZiBub3QgX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAKLSAgICAgICAgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJyIgPDwgCi0gICAgICAgIHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICInKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIAotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNsc19ubTsKLQotICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlLGlzX2V4Y2VwdGlvbixpc19leGNlcHRpb24pOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogSVN0cnVjdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCkgPDwgZW5kbDsKLSAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7Ci19Ci0KLXZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfc3RydWN0X3Jlc3VsdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLQotICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7Ci0gIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IFRGaWVsZEltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCEgZmlyc3QpIHsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZCBlbHNlIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlcixpc19leGNlcHRpb24pIDw8ICIpIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PAotICAgICAgICAiZmllbGRfLlR5cGVfICA6PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICIiLCBsb2NhbF92YXJzKTsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIH0KLQotICAgIGlmICghIGZpcnN0KSB7Ci0gICAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsOwotICAgIH0KLQotICB9Ci0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGNsc19ubTsKLQotICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlLGlzX2V4Y2VwdGlvbixpc19leGNlcHRpb24pOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgInByb2NlZHVyZSAiIDw8IGNsc19wcmVmaXggPDwgY2xzX25tIDw8ICIuV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJzdHJ1YyA6IElTdHJ1Y3Q7IiA8PCBlbmRsOwotCi0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIH0KLQotICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKLQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF93cml0ZXJfaW1wbChvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHNfcHJlZml4LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKLQotICBvc3RyaW5nc3RyZWFtIGxvY2FsX3ZhcnM7Ci0gIG9zdHJpbmdzdHJlYW0gY29kZV9ibG9jazsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLQotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IFRGaWVsZEltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgYm9vbCBpc19vcHRpb25hbCAgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA8PiBuaWwpIjsKLSAgICAgIGlmIChpc19vcHRpb25hbCkgewotICAgICAgICBjb2RlX2Jsb2NrIDw8IAotICAgICAgICAgICIgYW5kIF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlcixpc19leGNlcHRpb24pOwotICAgICAgfQotICAgICAgY29kZV9ibG9jayA8PCAKLSAgICAgICAgIiB0aGVuIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGlzX29wdGlvbmFsKSB7Ci0gICAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoX19pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLGlzX2V4Y2VwdGlvbikgPDwgIikgdGhlbiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXBfaW1wbCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIi8vIHJlcXVpcmVkIGZpZWxkIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PAotICAgICAgImZpZWxkXy5OYW1lIDo9ICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICJmaWVsZF8uVHlwZV8gIDo9ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwKLSAgICAgICJmaWVsZF8uSUQgOj0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PAotICAgICAgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoY29kZV9ibG9jaywgaXNfZXhjZXB0aW9uLCAqZl9pdGVyLCAiIiwgbG9jYWxfdmFycyk7Ci0gICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCB8fCBpc19vcHRpb25hbCkgewotICAgICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImVuZDsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBjbHNfbm07Ci0KLSAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSxmYWxzZSxpc19leGNlcHRpb24saXNfZXhjZXB0aW9uKTsKLQotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKLSAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKLSAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogSUZpZWxkOyIgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKLSAgaW5kZW50X2Rvd25faW1wbCgpOwotICBvdXQgPDwgY29kZV9ibG9jay5zdHIoKTsKLQotfQotCi12b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVscGhpX3N0cnVjdF90b3N0cmluZ19pbXBsKG9zdHJlYW0mIG91dCwgc3RyaW5nIGNsc19wcmVmaXgsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpc194X2ZhY3RvcnkpIHsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIGNsc19ubTsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgY2xzX25tID0gdHlwZV9uYW1lKHRzdHJ1Y3QsdHJ1ZSwoISBpc194X2ZhY3RvcnkpLGlzX3hfZmFjdG9yeSx0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBjbHNfbm0gPSB0eXBlX25hbWUodHN0cnVjdCx0cnVlLGZhbHNlKTsKLSAgfQotCi0gIHN0cmluZyB0bXBfc2IgPSAic2IiOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi5Ub1N0cmluZzogc3RyaW5nOyIgPDwgZW5kbDsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAidmFyIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiIDogVFRocmlmdFN0cmluZ0J1aWxkZXI7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICBpbmRlbnRfdXBfaW1wbCgpOwotCi0gIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIgOj0gVFRocmlmdFN0cmluZ0J1aWxkZXIuQ3JlYXRlKCcoJyk7IiA8PCBlbmRsOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ0cnkiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8Ci0gICAgICAgIHRtcF9zYiA8PCAiLkFwcGVuZCgnIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICI6ICcpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PAotICAgICAgICB0bXBfc2IgPDwgIi5BcHBlbmQoJywiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIjogJyk7IiA8PCBlbmRsOwotICAgIH0KLSAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIGlmICh0dHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIiA9IG5pbCkgdGhlbiAiIDw8IHRtcF9zYiA8PCAgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgICIuQXBwZW5kKCI8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pICA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgdG1wX3NiIDw8ICIuQXBwZW5kKEludGVnZXIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAgICAgdG1wX3NiIDw8ICIuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSAgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICB0bXBfc2IgPDwgIi5BcHBlbmQoJyknKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwKLSAgICAiUmVzdWx0IDo9ICIgPDwgdG1wX3NiIDw8ICAiLlRvU3RyaW5nOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7Ci0gIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuRnJlZTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bl9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotYm9vbCB0X2RlbHBoaV9nZW5lcmF0b3I6OmlzX3ZvaWQoIHRfdHlwZSogdHlwZSApIHsKLSAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoZGVscGhpLCAiZGVscGhpIiwKLSIgICAgYW5zaXN0cl9iaW5hcnk6ICBVc2UgQW5zaVN0cmluZyBhcyBiaW5hcnkgcHJvcGVydGllcy5cbiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGIxZGEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogRXJsYW5nIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9lcmxfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfZXJsX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHByb2dyYW1fbmFtZV9bMF0gPSB0b2xvd2VyKHByb2dyYW1fbmFtZV9bMF0pOwotICAgIHNlcnZpY2VfbmFtZV9bMF0gPSB0b2xvd2VyKHNlcnZpY2VfbmFtZV9bMF0pOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWVybCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfbWVtYmVyX3R5cGUoc3RkOjpvc3RyZWFtICYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX21lbWJlcl92YWx1ZShzdGQ6Om9zdHJlYW0gJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfdHlwZSh0X2ZpZWxkICogZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfbWVtYmVyX3ZhbHVlKHRfZmllbGQgKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9tZW1iZXJfcmVxdWlyZWRuZXNzKHRfZmllbGQgKiBmaWVsZCk7Ci0KLS8vICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkICogZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl90eXBlX3Rlcm0odF90eXBlKiB0dHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvID0gZmFsc2UpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkICogdG1lbWJlcik7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXJsX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2luZm8gICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBlcmxfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIGVybF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotCi0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGNhcGl0YWxpemUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvdXBwZXIoaW5bMF0pOwotICAgIHJldHVybiBpbjsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHVuY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0KLSAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbW1lbnQoc3RyaW5nIGluKTsKLQotIHByaXZhdGU6Ci0KLSAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkICopOwotCi0gIC8qKgotICAgKiBhZGQgZnVuY3Rpb24gdG8gZXhwb3J0IGxpc3QKLSAgICovCi0KLSAgdm9pZCBleHBvcnRfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGV4cG9ydF9zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7Ci0KLSAgdm9pZCBleHBvcnRfdHlwZXNfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICB2b2lkIGV4cG9ydF90eXBlc19zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7Ci0KLSAgLyoqCi0gICAqIHdyaXRlIG91dCBoZWFkZXJzIGFuZCBmb290ZXJzIGZvciBocmwgZmlsZXMKLSAgICovCi0KLSAgdm9pZCBocmxfaGVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBocmxfZm9vdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLQotICAvKioKLSAgICogc3R1ZmYgdG8gc3BpdCBvdXQgYXQgdGhlIHRvcCBvZiBnZW5lcmF0ZWQgZmlsZXMKLSAgICovCi0KLSAgYm9vbCBleHBvcnRfbGluZXNfZmlyc3RfOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gZXhwb3J0X2xpbmVzXzsKLQotICBib29sIGV4cG9ydF90eXBlc19saW5lc19maXJzdF87Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBleHBvcnRfdHlwZXNfbGluZXNfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGZfaW5mb187Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fZXh0XzsKLQotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfZmlsZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc19ocmxfZmlsZV87Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfaHJsXzsKLQotfTsKLQotCi0vKioKLSAqIFVJIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIC8vIHNldHVwIGV4cG9ydCBsaW5lcwotICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKLSAgZXhwb3J0X3R5cGVzX2xpbmVzX2ZpcnN0XyA9IHRydWU7Ci0KLSAgLy8gdHlwZXMgZmlsZXMKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkrcHJvZ3JhbV9uYW1lXysiX3R5cGVzLmVybCI7Ci0gIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMuaHJsIjsKLQotICBmX3R5cGVzX2ZpbGVfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBmX3R5cGVzX2hybF9maWxlXy5vcGVuKGZfdHlwZXNfaHJsX25hbWUuY19zdHIoKSk7Ci0KLSAgaHJsX2hlYWRlcihmX3R5cGVzX2hybF9maWxlXywgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMiKTsKLQotICBmX3R5cGVzX2ZpbGVfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcykuIiA8PCBlbmRsIDw8Ci0gICAgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwKLSAgICAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIC8vIGNvbnN0cyBmaWxlCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RhbnRzLmhybCI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9jb25zdHNfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBlcmxfaW1wb3J0cygpIDw8IGVuZGwgPDwKLSAgICAiLWluY2x1ZGUoXCIiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl90eXBlcy5ocmxcIikuIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBCb2lsZXJwbGF0ZSBhdCBiZWdpbm5pbmcgYW5kIGVuZCBvZiBoZWFkZXIgZmlsZXMKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9oZWFkZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgewotICBvdXQgPDwgIi1pZm5kZWYoXyIgPDwgbmFtZSA8PCAiX2luY2x1ZGVkKS4iIDw8IGVuZGwgPDwKLSAgICAiLWRlZmluZShfIiA8PCBuYW1lIDw8ICJfaW5jbHVkZWQsIHllYWgpLiIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmhybF9mb290ZXIob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSkgewotICAodm9pZCkgbmFtZTsKLSAgb3V0IDw8ICItZW5kaWYuIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICByZXN1bHQgKz0gIi1pbmNsdWRlKFwiIiArIHVuY2FwaXRhbGl6ZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLmhybFwiKS5cbiI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OmVybF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIlJVxuIikgKwotICAgICIlJSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICIlJVxuIiArCi0gICAgIiUlIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIlJVxuIjsKLX0KLQotLyoqCi0gKiBDb21tZW50IG91dCB0ZXh0Ci0gKi8KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6Y29tbWVudChzdHJpbmcgaW4pCi17Ci0gIHNpemVfdCBwb3MgPSAwOwotICBpbi5pbnNlcnQocG9zLCAiJSUgIik7Ci0gIHdoaWxlICggKHBvcyA9IGluLmZpbmRfZmlyc3Rfb2YoJ1xuJywgcG9zKSkgIT0gc3RyaW5nOjpucG9zICkKLSAgewotICAgIGluLmluc2VydCgrK3BvcywgIiUlICIpOwotICB9Ci0gIHJldHVybiBpbjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgdGhyaWZ0IGltcG9ydHMKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6ZXJsX2ltcG9ydHMoKSB7Ci0gIHJldHVybiAiIjsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mbyIsIDEpOwotICBleHBvcnRfdHlwZXNfc3RyaW5nKCJzdHJ1Y3RfaW5mb19leHQiLCAxKTsKLSAgZl90eXBlc19maWxlXyA8PCAiLWV4cG9ydChbIiA8PCBleHBvcnRfdHlwZXNfbGluZXNfLnN0cigpIDw8ICJdKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3R5cGVzX2ZpbGVfIDw8IGZfaW5mb18uc3RyKCk7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvKCdpIGFtIGEgZHVtbXkgc3RydWN0JykgLT4gdW5kZWZpbmVkLiIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZfdHlwZXNfZmlsZV8gPDwgZl9pbmZvX2V4dF8uc3RyKCk7Ci0gIGZfdHlwZXNfZmlsZV8gPDwgInN0cnVjdF9pbmZvX2V4dCgnaSBhbSBhIGR1bW15IHN0cnVjdCcpIC0+IHVuZGVmaW5lZC4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBocmxfZm9vdGVyKGZfdHlwZXNfaHJsX2ZpbGVfLCBzdHJpbmcoIkJPR1VTIikpOwotCi0gIGZfdHlwZXNfZmlsZV8uY2xvc2UoKTsKLSAgZl90eXBlc19ocmxfZmlsZV8uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gbm8gb3AKLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7Ci0gICh2b2lkKSB0dHlwZWRlZjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfaHJsX2ZpbGVfKSA8PAotICAgICAgIi1kZWZpbmUoIiA8PCBwcm9ncmFtX25hbWVfIDw8ICJfIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiXyIgPDwgbmFtZSA8PCAiLCAiIDw8IHZhbHVlIDw8ICIpLiI8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc19ocmxfZmlsZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUodGNvbnN0LT5nZXRfbmFtZSgpKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGZfY29uc3RzXyA8PCAiLWRlZmluZSgiIDw8IHByb2dyYW1fbmFtZV8gPDwgIl8iIDw8IG5hbWUgPDwgIiwgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpLiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAiIyIgPDwgdW5jYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICJ7IjsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBvdXQgPDwgIiA9ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIG91dCA8PCAiZGljdDpmcm9tX2xpc3QoWyI7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbWFwKCkuZW5kKCk7Ci0gICAgZm9yIChpID0gdmFsdWUtPmdldF9tYXAoKS5iZWdpbigpOyBpICE9IGVuZDspIHsKLSAgICAgIG91dCA8PCAieyIKLSAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSAgPDwgIiwiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpIDw8ICJ9IjsKLSAgICAgIGlmICggKytpICE9IGVuZCApIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgInNldHM6ZnJvbV9saXN0KFsiOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGksIGVuZCA9IHZhbHVlLT5nZXRfbGlzdCgpLmVuZCgpOwotICAgIGZvciggaSA9IHZhbHVlLT5nZXRfbGlzdCgpLmJlZ2luKCk7IGkgIT0gZW5kOyApIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICppKSA7Ci0gICAgICBpZiAoICsraSAhPSBlbmQgKSB7Ci0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiXSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3Q9ZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgfQotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgewotICB0X3R5cGUgKnR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIiMiICsgdW5jYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpICsgInt9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiZGljdDpuZXcoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInNldHM6bmV3KCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiW10iOwotICB9IGVsc2UgewotICAgIHJldHVybiAidW5kZWZpbmVkIjsKLSAgfQotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3R5cGUodF9maWVsZCAqIGZpZWxkKSB7Ci0gIHRfdHlwZSAqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAic3RyaW5nKCkgfCBiaW5hcnkoKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sZWFuKCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaW50ZWdlcigpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZmxvYXQoKSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImludGVnZXIoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiIyIgKyB1bmNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSkgKyAie30iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJkaWN0KCkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJzZXQoKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJsaXN0KCkiOwotICB9IGVsc2UgewotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotfQotCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyh0X2ZpZWxkICogZmllbGQpIHsKLSAgICBzd2l0Y2goZmllbGQtPmdldF9yZXEoKSkgewotICAgICAgICBjYXNlIHRfZmllbGQ6OlRfUkVRVUlSRUQ6ICAgICAgIHJldHVybiAicmVxdWlyZWQiOwotICAgICAgICBjYXNlIHRfZmllbGQ6OlRfT1BUSU9OQUw6ICAgICAgIHJldHVybiAib3B0aW9uYWwiOwotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidW5kZWZpbmVkIjsKLSAgICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2hybF9maWxlXywgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhmX2luZm9fLCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKGZfaW5mb19leHRfLCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCi17Ci0gIGluZGVudChvdXQpIDw8ICIlJSBzdHJ1Y3QgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIGJ1ZjsKLSAgYnVmIDw8IGluZGVudCgpIDw8ICItcmVjb3JkKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIsIHsiOwotICBzdHJpbmcgZmllbGRfaW5kZW50KGJ1Zi5zdHIoKS5zaXplKCksICcgJyk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGZvciAodmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTspIHsKLSAgICBnZW5lcmF0ZV9lcmxfc3RydWN0X21lbWJlcihidWYsICptX2l0ZXIpOwotICAgIGlmICggKyttX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSApIHsKLSAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7Ci0gICAgfQotICB9Ci0gIGJ1ZiA8PCAifSkuIjsKLQotICBvdXQgPDwgYnVmLnN0cigpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlY29yZCBmaWVsZCBkZWZpbml0aW9uCi0gKi8KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfbWVtYmVyKG9zdHJlYW0gJiBvdXQsIHRfZmllbGQgKiB0bWVtYmVyKQotewotICBvdXQgPDwgdW5jYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOwotICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUodG1lbWJlcikpCi0gICAgb3V0IDw8ICIgPSAiICA8PCByZW5kZXJfbWVtYmVyX3ZhbHVlKHRtZW1iZXIpOwotICBvdXQgPDwgIiA6OiAiIDw8IHJlbmRlcl9tZW1iZXJfdHlwZSh0bWVtYmVyKTsKLX0KLQotYm9vbCB0X2VybF9nZW5lcmF0b3I6Omhhc19kZWZhdWx0X3ZhbHVlKHRfZmllbGQgKiBmaWVsZCkgewotICB0X3R5cGUgKnR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKLSAgICBpZiAoIGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHlwZS0+aXNfbWFwKCkgfHwKLSAgICAgICAgICB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX21lbWJlcl92YWx1ZSh0X2ZpZWxkICogZmllbGQpIHsKLSAgaWYgKCFmaWVsZC0+Z2V0X3ZhbHVlKCkpIHsKLSAgICByZXR1cm4gcmVuZGVyX2RlZmF1bHRfdmFsdWUoZmllbGQpOwotICB9IGVsc2UgewotICAgIHJldHVybiByZW5kZXJfY29uc3RfdmFsdWUoZmllbGQtPmdldF90eXBlKCksIGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gIH0KLX0KLQotCi0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VybF9zdHJ1Y3RfaW5mbyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3RfaW5mbygnIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIicpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXJsX2V4dGVuZGVkX3N0cnVjdF9pbmZvKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdF9pbmZvX2V4dCgnIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIicpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl90eXBlX3Rlcm0odHN0cnVjdCwgdHJ1ZSwgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gc29tZWhvdyB0aGlzIHBvaW50IGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBhbmQgaXQncyBub3QgZG93bmNhc2VkIHlldAotICAvLyAuLi5hd2Vzb21lCi0gIHNlcnZpY2VfbmFtZV9bMF0gPSB0b2xvd2VyKHNlcnZpY2VfbmFtZV9bMF0pOwotCi0gIHN0cmluZyBmX3NlcnZpY2VfaHJsX25hbWUgPSBnZXRfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIl90aHJpZnQuaHJsIjsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyJfdGhyaWZ0LmVybCI7Ci0gIGZfc2VydmljZV9maWxlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotICBmX3NlcnZpY2VfaHJsXy5vcGVuKGZfc2VydmljZV9ocmxfbmFtZS5jX3N0cigpKTsKLQotICAvLyBSZXNldCBzZXJ2aWNlIHRleHQgYWdncmVnYXRpbmcgc3RyZWFtIHN0cmVhbXMKLSAgZl9zZXJ2aWNlXy5zdHIoIiIpOwotICBleHBvcnRfbGluZXNfLnN0cigiIik7Ci0gIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwotCi0gIGhybF9oZWFkZXIoZl9zZXJ2aWNlX2hybF8sIHNlcnZpY2VfbmFtZV8pOwotCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZl9zZXJ2aWNlX2hybF8gPDwgIi1pbmNsdWRlKFwiIiA8PAotICAgICAgdW5jYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKSA8PCAiX3RocmlmdC5ocmxcIikuICUgaW5oZXJpdCAiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfaHJsXyA8PAotICAgICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7IC8vIGNwaXJvOiBOZXcgRXJsYW5nIE9yZGVyCi0KLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotCi0gIC8vIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8Ci0gICAgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICAiLW1vZHVsZSgiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl90aHJpZnQpLiIgPDwgZW5kbCA8PAotICAgICItYmVoYXZpb3VyKHRocmlmdF9zZXJ2aWNlKS4iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgIGVybF9pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8ICJfdGhyaWZ0LmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfZmlsZV8gPDwgIi1leHBvcnQoWyIgPDwgZXhwb3J0X2xpbmVzXy5zdHIoKSA8PCAiXSkuIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2ZpbGVfIDw8IGZfc2VydmljZV8uc3RyKCk7Ci0KLSAgaHJsX2Zvb3RlcihmX3NlcnZpY2VfaHJsXywgZl9zZXJ2aWNlX25hbWUpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfZmlsZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2hybF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAvLyAgIiUgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGV4cG9ydF9zdHJpbmcoInN0cnVjdF9pbmZvIiwgMSk7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotICBmX3NlcnZpY2VfICAgIDw8ICJzdHJ1Y3RfaW5mbygnaSBhbSBhIGR1bW15IHN0cnVjdCcpIC0+IHVuZGVmaW5lZC4iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRmdW5jdGlvbjsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotCi0gIGV4cG9ydF9zdHJpbmcoImZ1bmN0aW9uX2luZm8iLCAyKTsKLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZl9zZXJ2aWNlXyA8PCAiJSUlIGludGVyZmFjZSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICAvLyBJbmhlcml0YW5jZSAtIHBhc3MgdW5rbm93biBmdW5jdGlvbnMgdG8gYmFzZSBjbGFzcwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBJbmZvVHlwZSkgLT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCB1bmNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhGdW5jdGlvbiwgSW5mb1R5cGUpLiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSB7Ci0gICAgICAvLyBVc2UgYSBzcGVjaWFsIHJldHVybiBjb2RlIGZvciBub25leGlzdGVudCBmdW5jdGlvbnMKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25faW5mbyhfRnVuYywgX0luZm8pIC0+IG5vX2Z1bmN0aW9uLiIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb25faW5mbyhGdW5jdGlvbk5hbWUsIHBhcmFtc190eXBlKSBhbmQKLSAqIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb25OYW1lLCByZXBseV90eXBlKQotICovCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faW5mbyh0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgc3RyaW5nIG5hbWVfYXRvbSA9ICInIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICInIjsKLQotCi0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgcGFyYW1zX3R5cGUpIC0+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybShhcmdfc3RydWN0LCB0cnVlKSA8PCAiOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIGZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHJlcGx5X3R5cGUpOgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiZnVuY3Rpb25faW5mbygiIDw8IG5hbWVfYXRvbSA8PCAiLCByZXBseV90eXBlKSAtPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgcmVuZGVyX3R5cGVfdGVybSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLSAgZWxzZSBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm9uZXdheV92b2lkOyIgPDwgZW5kbDsKLSAgZWxzZQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAie3N0cnVjdCwgW119IiA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBleGNlcHRpb25zKToKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImZ1bmN0aW9uX2luZm8oIiA8PCBuYW1lX2F0b20gPDwgIiwgZXhjZXB0aW9ucykgLT4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgcmVuZGVyX3R5cGVfdGVybSh4cywgdHJ1ZSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgcmV0dXJuCi0gICAgcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsKLSAgICAiKFRoaXMiICsgIGNhcGl0YWxpemUoYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpKSArICIpIjsKLX0KLQotLyoqCi0gKiBBZGQgYSBmdW5jdGlvbiB0byB0aGUgZXhwb3J0cyBsaXN0Ci0gKi8KLXZvaWQgdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfc3RyaW5nKHN0cmluZyBuYW1lLCBpbnQgbnVtKSB7Ci0gIGlmIChleHBvcnRfbGluZXNfZmlyc3RfKSB7Ci0gICAgZXhwb3J0X2xpbmVzX2ZpcnN0XyA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIGV4cG9ydF9saW5lc18gPDwgIiwgIjsKLSAgfQotICBleHBvcnRfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgKTsKLX0KLQotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKLSAgaWYgKGV4cG9ydF90eXBlc19saW5lc19maXJzdF8pIHsKLSAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZXhwb3J0X3R5cGVzX2xpbmVzXyA8PCAiLCAiOwotICB9Ci0gIGV4cG9ydF90eXBlc19saW5lc18gPDwgbmFtZSA8PCAiLyIgPDwgbnVtOwotfQotCi12b2lkIHRfZXJsX2dlbmVyYXRvcjo6ZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIGV4cG9ydF9zdHJpbmcocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgIDEgLy8gVGhpcwotICAgICAgICAgICAgICAgICsgKCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpLT5nZXRfbWVtYmVycygpKS5zaXplKCkKLSAgICAgICAgICAgICAgICApOwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsgLy8gaW5pdGlhbCBjb21tYSB0byBjb21wZW5zYXRlIGZvciBpbml0aWFsIFRoaXMKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeCA9ICIiOwotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgIG5hbWUgPSB1bmNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBFcmxhbmcgInR5cGUiIChtYWNybyBmb3IgaW50IGNvbnN0YW50cykKLSAqLwotc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiP3RUeXBlX1NUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI/dFR5cGVfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICI/dFR5cGVfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIj90VHlwZV9JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI/dFR5cGVfSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiP3RUeXBlX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIj90VHlwZV9ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIj90VHlwZV9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiP3RUeXBlX1NFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICI/dFR5cGVfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhbiBFcmxhbmcgdGVybSB3aGljaCByZXByZXNlbnRzIGEgdGhyaWZ0IHR5cGUKLSAqLwotc3RkOjpzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV90ZXJtKHRfdHlwZSogdHlwZSwgYm9vbCBleHBhbmRfc3RydWN0cywgYm9vbCBleHRlbmRlZF9pbmZvKSB7Ci0gICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImJ5dGUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJpMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJpNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJkb3VibGUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmIChleHBhbmRfc3RydWN0cykgewotCi0gICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBidWY7Ci0gICAgICBidWYgPDwgIntzdHJ1Y3QsIFsiOwotICAgICAgc3RyaW5nIGZpZWxkX2luZGVudChidWYuc3RyKCkuc2l6ZSgpLCAnICcpOwotCi0gICAgICB0X3N0cnVjdDo6bWVtYmVyc190eXBlIGNvbnN0JiBmaWVsZHMgPSBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgICAgdF9zdHJ1Y3Q6Om1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gZmllbGRzLmVuZCgpOwotICAgICAgZm9yKCBpID0gZmllbGRzLmJlZ2luKCk7IGkgIT0gZW5kOyApCi0gICAgICB7Ci0gICAgICAgIHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnZhbHVlX3R5cGUgbWVtYmVyID0gKmk7Ci0gICAgICAgIGludDMyX3Qga2V5ICA9IG1lbWJlci0+Z2V0X2tleSgpOwotICAgICAgICBzdHJpbmcgIHR5cGUgPSByZW5kZXJfdHlwZV90ZXJtKG1lbWJlci0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKTsgLy8gcmVjdXJzaXZlIGNhbGwKLQotICAgICAgICBpZiAoICFleHRlbmRlZF9pbmZvICkgewotICAgICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0OiB7c3RydWN0LCBbe0ZpZCwgVHlwZX18Li4uXX0KLSAgICAgICAgICBidWYgPDwgInsiIDw8IGtleSA8PCAiLCAiICA8PCB0eXBlIDw8ICJ9IjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBDb252ZXJ0IHRvIGZvcm1hdDoge3N0cnVjdCwgW3tGaWQsIFJlcSwgVHlwZSwgTmFtZSwgRGVmfXwuLi5dfQotICAgICAgICAgIHN0cmluZyAgbmFtZSAgICAgICAgID0gdW5jYXBpdGFsaXplKG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgICAgICAgc3RyaW5nICB2YWx1ZSAgICAgICAgPSByZW5kZXJfbWVtYmVyX3ZhbHVlKG1lbWJlcik7Ci0gICAgICAgICAgc3RyaW5nICByZXF1aXJlZG5lc3MgPSByZW5kZXJfbWVtYmVyX3JlcXVpcmVkbmVzcyhtZW1iZXIpOwotICAgICAgICAgIGJ1ZiA8PCAieyIgPDwga2V5IDw8ICIsICIgIDw8IHJlcXVpcmVkbmVzcyA8PCAiLCAiICA8PCB0eXBlIDw8ICIsICciIDw8IG5hbWUgPDwgIiciPDwgIiwgIiAgPDwgdmFsdWUgPDwgIn0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCArK2kgIT0gZW5kICkgewotICAgICAgICAgIGJ1ZiA8PCAiLCIgPDwgZW5kbCA8PCBmaWVsZF9pbmRlbnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYnVmIDw8ICJdfSIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBidWYuc3RyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAie3N0cnVjdCwgeyciICsgdHlwZV9tb2R1bGUodHlwZSkgKyAiJywgJyIgKyB0eXBlX25hbWUodHlwZSkgKyAiJ319IjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAvLyB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfQotICAgIHRfdHlwZSAqa2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlICp2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIHJldHVybiAie21hcCwgIiArIHJlbmRlcl90eXBlX3Rlcm0oa2V5X3R5cGUsIGZhbHNlKSArICIsICIgKwotICAgICAgcmVuZGVyX3R5cGVfdGVybSh2YWxfdHlwZSwgZmFsc2UpICsgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUgKmVsZW1fdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICByZXR1cm4gIntzZXQsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlICplbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLQotICAgIHJldHVybiAie2xpc3QsICIgKyByZW5kZXJfdHlwZV90ZXJtKGVsZW1fdHlwZSwgZmFsc2UpICsgIn0iOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1zdGQ6OnN0cmluZyB0X2VybF9nZW5lcmF0b3I6OnR5cGVfbW9kdWxlKHRfdHlwZSogdHR5cGUpIHsKLSAgcmV0dXJuIHVuY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzIjsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihlcmwsICJFcmxhbmciLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YTNlNzguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyoqCi0gKiBUb3AgbGV2ZWwgcHJvZ3JhbSBnZW5lcmF0aW9uIGZ1bmN0aW9uLiBDYWxscyB0aGUgZ2VuZXJhdG9yIHN1YmNsYXNzIG1ldGhvZHMKLSAqIGZvciBwcmVwYXJpbmcgZmlsZSBzdHJlYW1zIGV0Yy4gdGhlbiBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgdGhlCi0gKiBwcm9ncmFtIHRvIHBlcmZvcm0gdGhlIGNvcnJlY3QgYWN0aW9ucy4KLSAqCi0gKiBAcGFyYW0gcHJvZ3JhbSBUaGUgdGhyaWZ0IHByb2dyYW0gdG8gY29tcGlsZSBpbnRvIEMrKyBzb3VyY2UKLSAqLwotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbSgpIHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZ2VuZXJhdG9yCi0gIGluaXRfZ2VuZXJhdG9yKCk7Ci0KLSAgLy8gR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKLSAgdmVjdG9yPHRfdHlwZWRlZio+IHR5cGVkZWZzID0gcHJvZ3JhbV8tPmdldF90eXBlZGVmcygpOwotICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgIGdlbmVyYXRlX3R5cGVkZWYoKnRkX2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgc3RydWN0cywgZXhjZXB0aW9ucywgYW5kIHVuaW9ucyBpbiBkZWNsYXJlZCBvcmRlcgotICB2ZWN0b3I8dF9zdHJ1Y3QqPiBvYmplY3RzID0gcHJvZ3JhbV8tPmdldF9vYmplY3RzKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICBpZiAoKCpvX2l0ZXIpLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfc3RydWN0KCpvX2l0ZXIpOwotICAgIH0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNvbnN0YW50cwotICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gIGdlbmVyYXRlX2NvbnN0cyhjb25zdHMpOwotCi0gIC8vIEdlbmVyYXRlIHNlcnZpY2VzCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgZ2VuZXJhdGVfc2VydmljZSgqc3ZfaXRlcik7Ci0gIH0KLQotICAvLyBDbG9zZSB0aGUgZ2VuZXJhdG9yCi0gIGNsb3NlX2dlbmVyYXRvcigpOwotfQotCi1zdHJpbmcgdF9nZW5lcmF0b3I6OmVzY2FwZV9zdHJpbmcoY29uc3Qgc3RyaW5nICZpbikgY29uc3QgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGZvciAoc3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdCA9IGluLmJlZ2luKCk7IGl0IDwgaW4uZW5kKCk7IGl0KyspIHsKLSAgICBzdGQ6Om1hcDxjaGFyLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHJlcyA9IGVzY2FwZV8uZmluZCgqaXQpOwotICAgIGlmIChyZXMgIT0gZXNjYXBlXy5lbmQoKSkgewotICAgICAgcmVzdWx0LmFwcGVuZChyZXMtPnNlY29uZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdC5wdXNoX2JhY2soKml0KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCB0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9jb25zdCgqY19pdGVyKTsKLSAgfQotfQotCi12b2lkIHRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7Ci0gIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKSBpbmRlbnQob3V0KSA8PCBjb21tZW50X3N0YXJ0OwotICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgaW9zX2Jhc2U6OmluKTsKLSAgd2hpbGUgKCFkb2NzLmVvZigpKSB7Ci0gICAgY2hhciBsaW5lWzEwMjRdOwotICAgIGRvY3MuZ2V0bGluZShsaW5lLCAxMDI0KTsKLQotICAgIC8vIEp1c3QgcHJudCBhIG5ld2xpbmUgd2hlbiB0aGUgbGluZSAmIHByZWZpeCBhcmUgZW1wdHkuCi0gICAgaWYgKHN0cmxlbihsaW5lKSA9PSAwICYmIGxpbmVfcHJlZml4ID09ICIiICYmICFkb2NzLmVvZigpKSB7Ci0gICAgICAgIG91dCA8PCBzdGQ6OmVuZGw7Ci0gICAgfSBlbHNlIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKSB7ICAvLyBza2lwIHRoZSBlbXB0eSBsYXN0IGxpbmUKLSAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IGxpbmUgPDwgc3RkOjplbmRsOwotICAgIH0KLSAgfQotICBpZiAoY29tbWVudF9lbmQgIT0gIiIpIGluZGVudChvdXQpIDw8IGNvbW1lbnRfZW5kOwotfQotCi0KLXZvaWQgdF9nZW5lcmF0b3JfcmVnaXN0cnk6OnJlZ2lzdGVyX2dlbmVyYXRvcih0X2dlbmVyYXRvcl9mYWN0b3J5KiBmYWN0b3J5KSB7Ci0gIGdlbl9tYXBfdCYgdGhlX21hcCA9IGdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIGlmICh0aGVfbWFwLmZpbmQoZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKSkgIT0gdGhlX21hcC5lbmQoKSkgewotICAgIGZhaWx1cmUoIkR1cGxpY2F0ZSBnZW5lcmF0b3JzIGZvciBsYW5ndWFnZSBcIiVzXCIhXG4iLCBmYWN0b3J5LT5nZXRfc2hvcnRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIHRoZV9tYXBbZmFjdG9yeS0+Z2V0X3Nob3J0X25hbWUoKV0gPSBmYWN0b3J5OwotfQotCi10X2dlbmVyYXRvciogdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9ucykgewotICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbiA9IG9wdGlvbnMuZmluZCgnOicpOwotICBzdHJpbmcgbGFuZ3VhZ2UgPSBvcHRpb25zLnN1YnN0cigwLCBjb2xvbik7Ci0KLSAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9uczsKLSAgaWYgKGNvbG9uICE9IHN0cmluZzo6bnBvcykgewotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IGNvbG9uKzE7Ci0gICAgd2hpbGUgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgcG9zIDwgb3B0aW9ucy5zaXplKCkpIHsKLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5leHRfcG9zID0gb3B0aW9ucy5maW5kKCcsJywgcG9zKTsKLSAgICAgIHN0cmluZyBvcHRpb24gPSBvcHRpb25zLnN1YnN0cihwb3MsIG5leHRfcG9zLXBvcyk7Ci0gICAgICBwb3MgPSAoKG5leHRfcG9zID09IHN0cmluZzo6bnBvcykgPyBuZXh0X3BvcyA6IG5leHRfcG9zKzEpOwotCi0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBzZXBhcmF0b3IgPSBvcHRpb24uZmluZCgnPScpOwotICAgICAgc3RyaW5nIGtleSwgdmFsdWU7Ci0gICAgICBpZiAoc2VwYXJhdG9yID09IHN0cmluZzo6bnBvcykgewotICAgICAgICBrZXkgPSBvcHRpb247Ci0gICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBrZXkgPSBvcHRpb24uc3Vic3RyKDAsIHNlcGFyYXRvcik7Ci0gICAgICAgIHZhbHVlID0gb3B0aW9uLnN1YnN0cihzZXBhcmF0b3IrMSk7Ci0gICAgICB9Ci0KLSAgICAgIHBhcnNlZF9vcHRpb25zW2tleV0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBnZW5fbWFwX3QmIHRoZV9tYXAgPSBnZXRfZ2VuZXJhdG9yX21hcCgpOwotICBnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXIgPSB0aGVfbWFwLmZpbmQobGFuZ3VhZ2UpOwotCi0gIGlmIChpdGVyID09IHRoZV9tYXAuZW5kKCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBpdGVyLT5zZWNvbmQtPmdldF9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbnMpOwotfQotCi10X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90JiB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKSB7Ci0gIC8vIGh0dHA6Ly93d3cucGFyYXNoaWZ0LmNvbS9jKystZmFxLWxpdGUvY3RvcnMuaHRtbCNmYXEtMTAuMTIKLSAgc3RhdGljIGdlbl9tYXBfdCogdGhlX21hcCA9IG5ldyBnZW5fbWFwX3QoKTsKLSAgcmV0dXJuICp0aGVfbWFwOwotfQotCi10X2dlbmVyYXRvcl9mYWN0b3J5Ojp0X2dlbmVyYXRvcl9mYWN0b3J5KAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pCi0gIDogc2hvcnRfbmFtZV8oc2hvcnRfbmFtZSkKLSAgLCBsb25nX25hbWVfKGxvbmdfbmFtZSkKLSAgLCBkb2N1bWVudGF0aW9uXyhkb2N1bWVudGF0aW9uKQotewotICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6cmVnaXN0ZXJfZ2VuZXJhdG9yKHRoaXMpOwotfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWI1MzJiLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInBhcnNlL3RfcHJvZ3JhbS5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJ0X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGJhc2ljCi0gKiByb3V0aW5lcyBmb3IgY29kZSBnZW5lcmF0aW9uIGFuZCBjb250YWlucyB0aGUgdG9wIGxldmVsIG1ldGhvZCB0aGF0Ci0gKiBkaXNwYXRjaGVzIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgdmFyaW91cyBjb21wb25lbnRzLgotICoKLSAqLwotY2xhc3MgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSB7Ci0gICAgdG1wXyA9IDA7Ci0gICAgaW5kZW50XyA9IDA7Ci0gICAgcHJvZ3JhbV8gPSBwcm9ncmFtOwotICAgIHByb2dyYW1fbmFtZV8gPSBnZXRfcHJvZ3JhbV9uYW1lKHByb2dyYW0pOwotICAgIGVzY2FwZV9bJ1xuJ10gPSAiXFxuIjsKLSAgICBlc2NhcGVfWydcciddID0gIlxcciI7Ci0gICAgZXNjYXBlX1snXHQnXSA9ICJcXHQiOwotICAgIGVzY2FwZV9bJyInXSAgPSAiXFxcIiI7Ci0gICAgZXNjYXBlX1snXFwnXSA9ICJcXFxcIjsKLSAgfQotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogRnJhbWV3b3JrIGdlbmVyYXRvciBtZXRob2QgdGhhdCBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgcGFydHMgb2YgYSBwcm9ncmFtCi0gICAqIGFuZCBwZXJmb3JtcyBnZW5lcmFsIGFjdGlvbnMuIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIGJhc2UgY2xhc3MgYW5kCi0gICAqIHNob3VsZCBub3Qgbm9ybWFsbHkgYmUgb3ZlcndyaXR0ZW4gaW4gdGhlIHN1YmNsYXNzZXMuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbSgpOwotCi0gIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQotCi0gIHZvaWQgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tZW50X3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaW5lX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbW1lbnRfZW5kKTsKLQotICAvKioKLSAgICogY2hlY2sgd2hldGhlciBzdWItbmFtZXNwYWNlIGRlY2xhcmFjdGlvbiBpcyB1c2VkIGJ5IGdlbmVyYXRvci4KLSAgICogZS5nLiBhbGxvdwotICAgKiBuYW1lc3BhY2UgcHkudHdpc3RlZCBiYXIKLSAgICogdG8gc3BlY2lmeSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gLWdlbiBweTp0d2lzdGVkIGlzIHNwZWNpZmllZC4KLSAgICogV2lsbCBiZSBjYWxsZWQgd2l0aCBzdWJuYW1lc3BhY2UsIGkuZS4gaXNfdmFsaWRfbmFtZXNwYWNlKCJ0d2lzdGVkIikKLSAgICogd2lsbCBiZSBjYWxsZWQgZm9yIHRoZSBhYm92ZSBleGFtcGxlLgotICAgKi8KLSAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgKHZvaWQpIHN1Yl9uYW1lc3BhY2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVzY2FwZSBzdHJpbmcgdG8gdXNlIG9uZSBpbiBnZW5lcmF0ZWQgc291cmNlcy4KLSAgICovCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXNjYXBlX3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmaW4pIGNvbnN0OwotCi0gIHN0ZDo6c3RyaW5nIGdldF9lc2NhcGVkX3N0cmluZyh0X2NvbnN0X3ZhbHVlKiBjb25zdHZhbCkgewotICAgIHJldHVybiBlc2NhcGVfc3RyaW5nKGNvbnN0dmFsLT5nZXRfc3RyaW5nKCkpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0KLSAgLyoqCi0gICAqIE9wdGlvbmFsIG1ldGhvZHMgdGhhdCBtYXkgYmUgaW1sZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHRha2UgbmVjZXNzYXJ5Ci0gICAqIHN0ZXBzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGNvZGUgZ2VuZXJhdGlvbi4KLSAgICovCi0KLSAgdmlydHVhbCB2b2lkIGluaXRfZ2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB2b2lkIGNsb3NlX2dlbmVyYXRvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHVyZSB2aXJ0dWFsIG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhlIGdlbmVyYXRvciBzdWJjbGFzc2VzLgotICAgKi8KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAgKHRfdHlwZWRlZiogIHR0eXBlZGVmKSAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKSAgICAgPSAwOwotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCkgewotICAgICh2b2lkKSB0Y29uc3Q7Ci0gIH0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgICh0X3N0cnVjdCogICB0c3RydWN0KSAgID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSkgID0gMDsKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pIHsKLSAgICAvLyBCeSBkZWZhdWx0IGV4Y2VwdGlvbnMgYXJlIHRoZSBzYW1lIGFzIHN0cnVjdHMKLSAgICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBwcm9ncmFtIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9wcm9ncmFtX25hbWUodF9wcm9ncmFtKiB0cHJvZ3JhbSkgewotICAgIHJldHVybiB0cHJvZ3JhbS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gZ2V0IHRoZSBzZXJ2aWNlIG5hbWUsIG1heSBiZSBvdmVycmlkZGVuCi0gICAqLwotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9zZXJ2aWNlX25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAgIHJldHVybiB0c2VydmljZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGN1cnJlbnQgb3V0cHV0IGRpcmVjdG9yeQotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfb3V0X2RpcigpIGNvbnN0IHsKLSAgICBpZiAocHJvZ3JhbV8tPmlzX291dF9wYXRoX2Fic29sdXRlKCkpIHsKLSAgICAgIHJldHVybiBwcm9ncmFtXy0+Z2V0X291dF9wYXRoKCkgKyAiLyI7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByb2dyYW1fLT5nZXRfb3V0X3BhdGgoKSArIG91dF9kaXJfYmFzZV8gKyAiLyI7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIHVuaXF1ZSB0ZW1wb3JhcnkgdmFyaWFibGUgbmFtZSwgd2hpY2ggaXMganVzdCAibmFtZSIgd2l0aCBhCi0gICAqIG51bWJlciBhcHBlbmRlZCB0byBpdCAoaS5lLiBuYW1lMzUpCi0gICAqLwotICBzdGQ6OnN0cmluZyB0bXAoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgb3V0IDw8IG5hbWUgPDwgdG1wXysrOwotICAgIHJldHVybiBvdXQuc3RyKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gbGV2ZWwgbW9kaWZpZXJzCi0gICAqLwotCi0gIHZvaWQgaW5kZW50X3VwKCl7Ci0gICAgKytpbmRlbnRfOwotICB9Ci0KLSAgdm9pZCBpbmRlbnRfZG93bigpIHsKLSAgICAtLWluZGVudF87Ci0gIH0KLQotICAvKioKLSAgICogSW5kZW50YXRpb24gcHJpbnQgZnVuY3Rpb24KLSAgICovCi0gIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsKLSAgICBzdGQ6OnN0cmluZyBpbmQgPSAiIjsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZW50XzsgKytpKSB7Ci0gICAgICBpbmQgKz0gIiAgIjsKLSAgICB9Ci0gICAgcmV0dXJuIGluZDsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRlbnRhdGlvbiB1dGlsaXR5IHdyYXBwZXIKLSAgICovCi0gIHN0ZDo6b3N0cmVhbSYgaW5kZW50KHN0ZDo6b3N0cmVhbSAmb3MpIHsKLSAgICByZXR1cm4gb3MgPDwgaW5kZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FwaXRhbGl6YXRpb24gaGVscGVycwotICAgKi8KLSAgc3RkOjpzdHJpbmcgY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG91cHBlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIHN0ZDo6c3RyaW5nIGRlY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyBpbikgewotICAgIGluWzBdID0gdG9sb3dlcihpblswXSk7Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIHN0ZDo6c3RyaW5nIGxvd2VyY2FzZShzdGQ6OnN0cmluZyBpbikgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKLSAgICAgIGluW2ldID0gdG9sb3dlcihpbltpXSk7Ci0gICAgfQotICAgIHJldHVybiBpbjsKLSAgfQotICAvKioKLSAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3RyaW5nIHRvIGFuIGVxdWl2YWxlbnQgb25lIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcwotICAgKiBlLmcuIGFNdWx0aVdvcmQgLT4gYV9tdWx0aV93b3JkCi0gICAqICAgICAgc29tZU5hbWUgICAtPiBzb21lX25hbWUKLSAgICogICAgICBDYW1lbENhc2UgIC0+IGNhbWVsX2Nhc2UKLSAgICogICAgICBuYW1lICAgICAgIC0+IG5hbWUKLSAgICogICAgICBOYW1lICAgICAgIC0+IG5hbWUKLSAgICovCi0gIHN0ZDo6c3RyaW5nIHVuZGVyc2NvcmUoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICBpblswXSA9IHRvbG93ZXIoaW5bMF0pOwotICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgaW4uc2l6ZSgpOyArK2kpIHsKLSAgICAgIGlmIChpc3VwcGVyKGluW2ldKSkgewotICAgICAgICBpbltpXSA9IHRvbG93ZXIoaW5baV0pOwotICAgICAgICBpbi5pbnNlcnQoaSwgIl8iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGluOwotICB9Ci0gIC8qKgotICAgICogVHJhbnNmb3JtcyBhIHN0cmluZyB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcyB0byBhIGNhbWVsIGNhc2UgZXF1aXZhbGVudAotICAgICogZS5nLiBhX211bHRpX3dvcmQgLT4gYU11bHRpV29yZAotICAgICogICAgICBzb21lX25hbWUgICAgLT4gIHNvbWVOYW1lCi0gICAgKiAgICAgIG5hbWUgICAgICAgICAtPiAgbmFtZQotICAgICovCi0gIHN0ZDo6c3RyaW5nIGNhbWVsY2FzZShzdGQ6OnN0cmluZyBpbikgewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gICAgYm9vbCB1bmRlcnNjb3JlID0gZmFsc2U7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluLnNpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAoaW5baV0gPT0gJ18nKSB7Ci0gICAgICAgIHVuZGVyc2NvcmUgPSB0cnVlOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICh1bmRlcnNjb3JlKSB7Ci0gICAgICAgIG91dCA8PCAoY2hhcikgdG91cHBlcihpbltpXSk7Ci0gICAgICAgIHVuZGVyc2NvcmUgPSBmYWxzZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5baV07Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dC5zdHIoKTsKLSAgfQotCi0gcHVibGljOgotICAvKioKLSAgICogR2V0IHRoZSB0cnVlIHR5cGUgYmVoaW5kIGEgc2VyaWVzIG9mIHR5cGVkZWZzLgotICAgKi8KLSAgc3RhdGljIHRfdHlwZSogZ2V0X3RydWVfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgICByZXR1cm4gdHlwZS0+Z2V0X3RydWVfdHlwZSgpOwotICB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8qKgotICAgKiBUaGUgcHJvZ3JhbSBiZWluZyBnZW5lcmF0ZWQKLSAgICovCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgcHJvZ3JhbSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZV87Ci0KLSAgLyoqCi0gICAqIFF1aWNrIGFjY2Vzc29yIGZvciBmb3JtYXR0ZWQgc2VydmljZSBuYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAqIGdlbmVyYXRlZC4KLSAgICovCi0gIHN0ZDo6c3RyaW5nIHNlcnZpY2VfbmFtZV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0eXBlLXNwZWNpZmMgZGlyZWN0b3J5IG5hbWUgKCJnZW4tKiIpCi0gICAqLwotICBzdGQ6OnN0cmluZyBvdXRfZGlyX2Jhc2VfOwotCi0gIC8qKgotICAgKiBNYXAgb2YgY2hhcmFjdGVycyB0byBlc2NhcGUgaW4gc3RyaW5nIGxpdGVyYWxzLgotICAgKi8KLSAgc3RkOjptYXA8Y2hhciwgc3RkOjpzdHJpbmc+IGVzY2FwZV87Ci0KLSBwcml2YXRlOgotICAvKioKLSAgICogQ3VycmVudCBjb2RlIGluZGVudGF0aW9uIGxldmVsCi0gICAqLwotICBpbnQgaW5kZW50XzsKLQotICAvKioKLSAgICogVGVtcG9yYXJ5IHZhcmlhYmxlIGNvdW50ZXIsIGZvciBtYWtpbmcgdW5pcXVlIHZhcmlhYmxlIG5hbWVzCi0gICAqLwotICBpbnQgdG1wXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDEwZTk0Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HRU5FUkFUT1JfUkVHSVNUUllfSAotI2RlZmluZSBUX0dFTkVSQVRPUl9SRUdJU1RSWV9ICi0KLWNsYXNzIHRfZ2VuZXJhdG9yOwotCi0vKioKLSAqIEEgZmFjdG9yeSBmb3IgcHJvZHVjaW5nIGdlbmVyYXRvciBjbGFzc2VzIG9mIGEgcGFydGljdWxhciBsYW5ndWFnZS4KLSAqCi0gKiBUaGlzIGNsYXNzIGlzIGFsc28gcmVzcG9uc2libGUgZm9yOgotICogIC0gUmVnaXN0ZXJpbmcgaXRzZWxmIHdpdGggdGhlIGdlbmVyYXRvciByZWdpc3RyeS4KLSAqICAtIFByb3ZpZGluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZ2VuZXJhdG9ycyBpdCBwcm9kdWNlcy4KLSAqLwotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeSB7Ci0gcHVibGljOgotICB0X2dlbmVyYXRvcl9mYWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsb25nX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRvY3VtZW50YXRpb24pOwotCi0gIHZpcnR1YWwgfnRfZ2VuZXJhdG9yX2ZhY3RvcnkoKSB7fQotCi0gIHZpcnR1YWwgdF9nZW5lcmF0b3IqIGdldF9nZW5lcmF0b3IoCi0gICAgICAvLyBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZS4KLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIC8vIE5vdGU6IHBhcnNlZF9vcHRpb25zIHdpbGwgbm90IGV4aXN0IGJleW9uZCB0aGUgY2FsbCB0byBnZXRfZ2VuZXJhdG9yLgotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAvLyBOb3RlOiBvcHRpb25fc3RyaW5nIG1pZ2h0IG5vdCBleGlzdCBiZXlvbmQgdGhlIGNhbGwgdG8gZ2V0X2dlbmVyYXRvci4KLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSA9IDA7Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X3Nob3J0X25hbWUoKSB7IHJldHVybiBzaG9ydF9uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfbG9uZ19uYW1lKCkgeyByZXR1cm4gbG9uZ19uYW1lXzsgfQotICBzdGQ6OnN0cmluZyBnZXRfZG9jdW1lbnRhdGlvbigpIHsgcmV0dXJuIGRvY3VtZW50YXRpb25fOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBzaG9ydF9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgbG9uZ19uYW1lXzsKLSAgc3RkOjpzdHJpbmcgZG9jdW1lbnRhdGlvbl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgZ2VuZXJhdG9yPgotY2xhc3MgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnkgewotIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsKGNvbnN0IHN0ZDo6c3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxvbmdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2N1bWVudGF0aW9uKQotICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeShzaG9ydF9uYW1lLCBsb25nX25hbWUsIGRvY3VtZW50YXRpb24pCi0gIHt9Ci0KLSAgdmlydHVhbCB0X2dlbmVyYXRvciogZ2V0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpIHsKLSAgICByZXR1cm4gbmV3IGdlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7Ci0gIH0KLQotICB2aXJ0dWFsIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKSB7Ci0gICAgcmV0dXJuIGdlbmVyYXRvcjo6aXNfdmFsaWRfbmFtZXNwYWNlKHN1Yl9uYW1lc3BhY2UpOwotICB9Ci19OwotCi1jbGFzcyB0X2dlbmVyYXRvcl9yZWdpc3RyeSB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCByZWdpc3Rlcl9nZW5lcmF0b3IodF9nZW5lcmF0b3JfZmFjdG9yeSogZmFjdG9yeSk7Ci0KLSAgc3RhdGljIHRfZ2VuZXJhdG9yKiBnZXRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKTsKLQotICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2dlbmVyYXRvcl9mYWN0b3J5Kj4gZ2VuX21hcF90OwotICBzdGF0aWMgZ2VuX21hcF90JiBnZXRfZ2VuZXJhdG9yX21hcCgpOwotCi0gcHJpdmF0ZToKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoKTsKLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnkoY29uc3QgdF9nZW5lcmF0b3JfcmVnaXN0cnkmKTsKLX07Ci0KLSNkZWZpbmUgVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihsYW5ndWFnZSwgbG9uZ19uYW1lLCBkb2MpICAgICAgICBcCi0gIGNsYXNzIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwgICAgICAgICAgICAgICAgICAgICAgXAotICAgIDogcHVibGljIHRfZ2VuZXJhdG9yX2ZhY3RvcnlfaW1wbDx0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3I+ICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcl9mYWN0b3J5X2ltcGwoKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogdF9nZW5lcmF0b3JfZmFjdG9yeV9pbXBsPHRfIyNsYW5ndWFnZSMjX2dlbmVyYXRvcj4oICAgICAgICBcCi0gICAgICAgICAgI2xhbmd1YWdlLCBsb25nX25hbWUsIGRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB0XyMjbGFuZ3VhZ2UjI19nZW5lcmF0b3JfZmFjdG9yeV9pbXBsIF9yZWdpc3RlcmVyOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZ29fZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjU0YmE2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEdvIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9nb19nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9nb19nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWdvIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaXNfcmVzdWx0PWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvZXJjZURhdGE9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycj0iZXJyIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycj0iZXJyIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI9ImVyciIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVycj0iZXJyIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZXJyPSJlcnIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYyk7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIGdvX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBnb19wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGdvX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfYXJndW1lbnQodF9maWVsZCogdGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodF9maWVsZCogdGZpZWxkLCBjb25zdCBzdHJpbmcmIG5hbWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwgYm9vbCBhZGRPc0Vycm9yPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19nb190eXBlKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3JlYWxfZ29fbW9kdWxlKGNvbnN0IHRfcHJvZ3JhbSogcHJvZ3JhbSkgewotICAgIHN0ZDo6c3RyaW5nIHJlYWxfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiZ28iKTsKLSAgICBpZiAocmVhbF9tb2R1bGUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHByb2dyYW0tPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIHJldHVybiByZWFsX21vZHVsZTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpzdHJpbmdzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAKLSAgc3RhdGljIHN0ZDo6c3RyaW5nIHB1YmxpY2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBzdGF0aWMgc3RkOjpzdHJpbmcgcHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHN0YXRpYyBzdGQ6OnN0cmluZyB2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgY2FuX2JlX25pbCh0X3R5cGUqIHZhbHVlKTsKLQotfTsKLQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHVibGljaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBpZih2YWx1ZS5zaXplKCkgPD0gMCkgcmV0dXJuIHZhbHVlOwotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOwotICBpZighaXN1cHBlcih2YWx1ZTJbMF0pKQotICAgIHZhbHVlMlswXSA9IHRvdXBwZXIodmFsdWUyWzBdKTsKLSAgLy8gYXMgbG9uZyBhcyB3ZSBhcmUgY2hhbmdpbmcgdGhpbmdzLCBsZXQncyBjaGFuZ2UgXyBmb2xsb3dlZCBieSBsb3dlcmNhc2UgdG8gY2FwaXRhbAotICBmb3Ioc3RyaW5nOjpzaXplX3R5cGUgaT0xOyBpPHZhbHVlMi5zaXplKCktMTsgKytpKSB7Ci0gICAgaWYodmFsdWUyW2ldID09ICdfJyAmJiBpc2FscGhhKHZhbHVlMltpKzFdKSkgewotICAgICAgdmFsdWUyLnJlcGxhY2UoaSwgMiwgMSwgdG91cHBlcih2YWx1ZTJbaSsxXSkpOwotICAgIH0KLSAgfQotICByZXR1cm4gdmFsdWUyOwotfQotCi1zdGQ6OnN0cmluZyB0X2dvX2dlbmVyYXRvcjo6cHJpdmF0aXplKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBpZih2YWx1ZS5zaXplKCkgPD0gMCkgcmV0dXJuIHZhbHVlOwotICBzdGQ6OnN0cmluZyB2YWx1ZTIodmFsdWUpOwotICBpZighaXNsb3dlcih2YWx1ZTJbMF0pKSB7Ci0gICAgdmFsdWUyWzBdID0gdG9sb3dlcih2YWx1ZTJbMF0pOwotICB9Ci0gIC8vIGFzIGxvbmcgYXMgd2UgYXJlIGNoYW5naW5nIHRoaW5ncywgbGV0J3MgY2hhbmdlIF8gZm9sbG93ZWQgYnkgbG93ZXJjYXNlIHRvIGNhcGl0YWwKLSAgZm9yKHN0cmluZzo6c2l6ZV90eXBlIGk9MTsgaTx2YWx1ZTIuc2l6ZSgpLTE7ICsraSkgewotICAgIGlmKHZhbHVlMltpXSA9PSAnXycgJiYgaXNhbHBoYSh2YWx1ZTJbaSsxXSkpIHsKLSAgICAgIHZhbHVlMi5yZXBsYWNlKGksIDIsIDEsIHRvdXBwZXIodmFsdWUyW2krMV0pKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlMjsKLX0KLQotc3RkOjpzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgaWYodmFsdWUuc2l6ZSgpIDw9IDApIHJldHVybiB2YWx1ZTsKLSAgc3RkOjpzdHJpbmcgdmFsdWUyKHZhbHVlKTsKLSAgc3RkOjp0cmFuc2Zvcm0odmFsdWUyLmJlZ2luKCksIHZhbHVlMi5lbmQoKSwgdmFsdWUyLmJlZ2luKCksIDo6dG9sb3dlcik7Ci0gIHN3aXRjaCh2YWx1ZVswXSkgewotICAgIGNhc2UgJ2InOgotICAgIGNhc2UgJ0InOgotICAgICAgaWYodmFsdWUyICE9ICJicmVhayIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgY2FzZSAnQyc6Ci0gICAgICBpZih2YWx1ZTIgIT0gImNhc2UiICYmIHZhbHVlMiAhPSAiY2hhbiIgJiYgdmFsdWUyICE9ICJjb25zdCIgJiYgdmFsdWUyICE9ICJjb250aW51ZSIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBpZih2YWx1ZTIgIT0gImRlZmF1bHQiICYmIHZhbHVlMiAhPSAiZGVmZXIiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgIGNhc2UgJ0UnOgotICAgICAgaWYodmFsdWUyICE9ICJlbHNlIikgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIGlmKHZhbHVlMiAhPSAiZmFsbHRocm91Z2giICYmIHZhbHVlMiAhPSAiZm9yIiAmJiB2YWx1ZTIgIT0gImZ1bmMiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2cnOgotICAgIGNhc2UgJ0cnOgotICAgICAgaWYodmFsdWUyICE9ICJnbyIgJiYgdmFsdWUyICE9ICJnb3RvIikgewotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdpJzoKLSAgICBjYXNlICdJJzoKLSAgICAgIGlmKHZhbHVlMiAhPSAiaWYiICYmIHZhbHVlMiAhPSAiaW1wb3J0IiAmJiB2YWx1ZTIgIT0gImludGVyZmFjZSIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbSc6Ci0gICAgY2FzZSAnTSc6Ci0gICAgICBpZih2YWx1ZTIgIT0gIm1hcCIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpZih2YWx1ZTIgIT0gInBhY2thZ2UiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgaWYodmFsdWUyICE9ICJyYW5nZSIgJiYgdmFsdWUyICE9ICJyZXR1cm4iKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgaWYodmFsdWUyICE9ICJzZWxlY3QiICYmIHZhbHVlMiAhPSAic3RydWN0IiAmJiB2YWx1ZTIgIT0gInN3aXRjaCIpIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndCc6Ci0gICAgY2FzZSAnVCc6Ci0gICAgICBpZih2YWx1ZTIgIT0gInR5cGUiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3YnOgotICAgIGNhc2UgJ1YnOgotICAgICAgaWYodmFsdWUyICE9ICJ2YXIiKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgcmV0dXJuIHZhbHVlMiArICJfYTEiOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgc3RyaW5nIG1vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7Ci0gIHN0cmluZyB0YXJnZXQgPSBtb2R1bGU7Ci0gIHBhY2thZ2VfZGlyXyA9IGdldF9vdXRfZGlyKCk7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gVE9ETzogRG8gYmV0dGVyIGVycm9yIGNoZWNraW5nIGhlcmUuCi0gICAgTUtESVIocGFja2FnZV9kaXJfLmNfc3RyKCkpOwotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgcGFja2FnZV9uYW1lXyA9IG1vZHVsZTsKLSAgICAgIG1vZHVsZS5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gIi8iOwotICAgICAgcGFja2FnZV9kaXJfICs9IG1vZHVsZS5zdWJzdHIoMCwgcG9zKTsKLSAgICAgIG1vZHVsZS5lcmFzZSgwLCBwb3MrMSk7Ci0gICAgfQotICB9Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUoKGxvYyA9IHRhcmdldC5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHRhcmdldC5yZXBsYWNlKGxvYywgMSwgMSwgJy8nKTsKLSAgfQotICAKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfKyIvIisidHR5cGVzLmdvIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0gIGZfY29uc3RzXyA8PCAiZnVuYyBpbml0KCkgeyIgPDwgZW5kbDsKLSAgCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi9NYWtlZmlsZSI7Ci0gIG9mc3RyZWFtIGZfaW5pdDsKLSAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gIGZfaW5pdCAgPDwgCi0gICAgZW5kbCA8PAotICAgICJpbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5pbmMiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJhbGw6IGluc3RhbGwiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJUQVJHPXRocmlmdGxpYi8iIDw8IHRhcmdldCA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAiRElSUz1cXCIgPDwgZW5kbDsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgZl9pbml0IDw8ICIgICIgPDwgKCpzdl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXFwiIDw8IGVuZGw7Ci0gIH0KLSAgZl9pbml0IDw8IGVuZGwgPDwKLSAgICAiR09GSUxFUz1cXCIgPDwgZW5kbCA8PAotICAgICIgIHR0eXBlcy5nb1xcIiA8PCBlbmRsOwotICAvLyAgIiAgIGNvbnN0YW50cy5nb1xcIiA8PCBlbmRsOwotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBmX2luaXQgPDwgIiAgIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIuZ29cXCIgPDwgZW5kbDsKLSAgfQotICBmX2luaXQgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgImluY2x1ZGUgJChHT1JPT1QpL3NyYy9NYWtlLnBrZyIgPDwgZW5kbCA8PCBlbmRsOwotICBmX2luaXQuY2xvc2UoKTsKLQotICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICBzdHJpbmcgc2VydmljZV9kaXIgPSBwYWNrYWdlX2Rpcl8rIi8iKygqc3ZfaXRlciktPmdldF9uYW1lKCk7Ci0jaWZkZWYgTUlOR1cKLSAgICBta2RpcihzZXJ2aWNlX2Rpci5jX3N0cigpKTsKLSNlbHNlCi0gICAgbWtkaXIoc2VydmljZV9kaXIuY19zdHIoKSwgMDc1NSk7Ci0jZW5kaWYKLSAgICBzdHJpbmcgZl9pbml0X25hbWUgPSBzZXJ2aWNlX2RpcisiL01ha2VmaWxlIjsKLSAgICBvZnN0cmVhbSBmX2luaXQ7Ci0gICAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7Ci0gICAgZl9pbml0ICA8PAotICAgICAgZW5kbCA8PAotICAgICAgImluY2x1ZGUgJChHT1JPT1QpL3NyYy9NYWtlLmluYyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAiYWxsOiBpbnN0YWxsIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICJUQVJHPSIgPDwgcHVibGljaXplKCgqc3ZfaXRlciktPmdldF9uYW1lKCkpIDw8ICItcmVtb3RlIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICJESVJTPVxcIiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgICJHT0ZJTEVTPVxcIiA8PCBlbmRsIDw8Ci0gICAgICAiICAiIDw8ICgqc3ZfaXRlciktPmdldF9uYW1lKCkgPDwgIi1yZW1vdGUuZ29cXCIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICAiaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuY21kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgZl9pbml0LmNsb3NlKCk7Ci0gIH0KLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGdvX3BhY2thZ2UoKSA8PCAKLSAgICBnb19pbXBvcnRzKCkgPDwKLSAgICByZW5kZXJfaW5jbHVkZXMoKSA8PAotICAgIHJlbmRlcl9mYXN0YmluYXJ5X2luY2x1ZGVzKCkgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAiaW1wb3J0IFwidGhyaWZ0bGliLyIgKyBnZXRfcmVhbF9nb19tb2R1bGUoaW5jbHVkZXNbaV0pICsgIlwiXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29fYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygpICsKLQkiLyogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iCi0gICAgIiAqXG4iCi0gICAgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIKLSAgICAiICovXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgcGFja2FnZQotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX3BhY2thZ2UoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygicGFja2FnZSAiKSArIHBhY2thZ2VfbmFtZV8gKyAiO1xuXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygiaW1wb3J0IChcbiIKLSAgICAgICAgICAgIiAgICAgICAgXCJ0aHJpZnRcIlxuIgotLy8gICAgICAgICAgICIgICAgICAgIFwic3RyaW5nc1wiXG4iCi0gICAgICAgICAgICIgICAgICAgIFwiZm10XCJcbiIKLSAgICAgICAgICAgIilcblxuIik7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX2NvbnN0c18gPDwgIn0iIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGZfY29uc3RzXy5zdHIoKSA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotICBmX2NvbnN0c18uY2xlYXIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIGdvLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKGZfdHlwZXNfLCB0dHlwZWRlZik7Ci0gIHN0cmluZyBuZXdUeXBlRGVmKHB1YmxpY2l6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpKTsKLSAgc3RyaW5nIGJhc2VUeXBlKHR5cGVfdG9fZ29fdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkpOwotICBpZihiYXNlVHlwZSA9PSBuZXdUeXBlRGVmKQotICAgIHJldHVybjsKLSAgZl90eXBlc18gPDwKLSAgICAidHlwZSAiIDw8IG5ld1R5cGVEZWYgPDwgIiAiIDw8IGJhc2VUeXBlIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHRvX3N0cmluZ19tYXBwaW5nLCBmcm9tX3N0cmluZ19tYXBwaW5nOwotICBzdGQ6OnN0cmluZyB0ZW51bV9uYW1lKHB1YmxpY2l6ZSh0ZW51bS0+Z2V0X25hbWUoKSkpOwotCi0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3R5cGVzXywgdGVudW0pOwotICBmX3R5cGVzXyA8PAotICAgICJ0eXBlICIgPDwgdGVudW1fbmFtZSA8PCAiIGludCIgPDwgZW5kbCA8PAotICAgICJjb25zdCAoIiA8PCBlbmRsOwotICAKLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggcCB7IiA8PCBlbmRsOwotICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgRnJvbSIgPDwgdGVudW1fbmFtZSA8PCAiU3RyaW5nKHMgc3RyaW5nKSAiIDw8IHRlbnVtX25hbWUgPDwgIiB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgc3dpdGNoIHMgeyIgPDwgZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGludCB2YWx1ZSA9IC0xOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGlmICgoKmNfaXRlciktPmhhc192YWx1ZSgpKSB7Ci0gICAgICB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICsrdmFsdWU7Ci0gICAgfQotICAgIHN0cmluZyBpdGVyX3N0ZF9uYW1lKGVzY2FwZV9zdHJpbmcoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gICAgc3RyaW5nIGl0ZXJfbmFtZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGZfdHlwZXNfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IGl0ZXJfbmFtZSA8PCAnICcgPDwgdGVudW1fbmFtZSA8PCAiID0gIiA8PCB2YWx1ZSA8PCBlbmRsOwotICAgIAotICAgIC8vIERpY3Rpb25hcmllcyB0by9mcm9tIHN0cmluZyBuYW1lcyBvZiBlbnVtcwotICAgIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBjYXNlICIgPDwgaXRlcl9uYW1lIDw8ICI6IHJldHVybiBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIiIDw8IGVuZGw7Ci0gICAgaWYoaXRlcl9zdGRfbmFtZSAhPSBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkpIHsKLSAgICAgIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgY2FzZSBcIiIgPDwgaXRlcl9zdGRfbmFtZSA8PCAiXCIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKGl0ZXJfbmFtZSkgPDwgIlwiOiByZXR1cm4gIiA8PCBpdGVyX25hbWUgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZnJvbV9zdHJpbmdfbWFwcGluZyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBjYXNlIFwiIiA8PCBpdGVyX3N0ZF9uYW1lIDw8ICJcIjogcmV0dXJuICIgPDwgaXRlcl9uYW1lIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIHRvX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBcIlwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgdGVudW1fbmFtZSA8PCAiKC0xMDAwMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAiIDw8IHRlbnVtX25hbWUgPDwgIikgVmFsdWUoKSBpbnQgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBpbnQocCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgIiA8PCB0ZW51bV9uYW1lIDw8ICIpIElzRW51bSgpIGJvb2wgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLSAgCi0gIGlmKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChmX3R5cGVzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICIgIiA8PCAiICIgPDwgdHlwZV90b19nb190eXBlKHR5cGUpIDw8IGVuZGw7Ci0gICAgZl9jb25zdHNfIDw8Ci0gICAgICAiICAiIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlLCBuYW1lKSA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgCi0gICAgICAiTmV3IiA8PCBwdWJsaWNpemUodHlwZS0+Z2V0X25hbWUoKSkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgaWYoZmllbGRfdHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgZmllbGRfdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IG5hbWUgPDwgIi4iIDw8IHB1YmxpY2l6ZSh2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCwgbmFtZSkgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmluZyBrKHRtcCgiayIpKTsKLSAgICAgICAgc3RyaW5nIHYodG1wKCJ2IikpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCB2IDw8ICIgOj0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBuYW1lIDw8ICIuIiA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiID0gIiA8PCB2IDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgb3V0IDw8IAotICAgICAgInRocmlmdC5OZXdUTWFwKCIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwgIiA8PCB2YWwuc2l6ZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcgayh0bXAoImsiKSk7Ci0gICAgICBzdHJpbmcgdih0bXAoInYiKSk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgayA8PCAiIDo9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0LCBrKSA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHYgPDwgIiA6PSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiLlNldCgiIDw8IGsgPDwgIiwgIiA8PCB2IDw8ICIpIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIG91dCA8PAotICAgICAgInRocmlmdC5OZXdUTGlzdCgiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwgIiA8PCB2YWwuc2l6ZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2KHRtcCgidiIpKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB2IDw8ICIgOj0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiLlB1c2goIiA8PCB2IDw8ICIpIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICBvdXQgPDwKLSAgICAgICJ0aHJpZnQuTmV3VFNldCgiIDw8IHR5cGVfdG9fZW51bShldHlwZSkgPDwgIiwgIiA8PCB2YWwuc2l6ZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2KHRtcCgidiIpKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCB2IDw8ICIgOj0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIsIHYpIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgbmFtZSA8PCAiLkFkZCgiIDw8IHYgPDwgIikiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZ28gc3RydWN0Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9nb19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2dvX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGdvIHN0cnVjdAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotCi0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHRzdHJ1Y3RfbmFtZShwdWJsaWNpemUodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotICBvdXQgPDwgCi0gICAgaW5kZW50KCkgPDwgInR5cGUgIiA8PCB0c3RydWN0X25hbWUgPDwgIiBzdHJ1Y3QgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHRocmlmdC5UU3RydWN0IiA8PCBlbmRsOwotCi0gIC8qCi0gICAgIEhlcmUgd2UgZ2VuZXJhdGUgdGhlIHN0cnVjdHVyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgZmFzdGJpbmFyeSBjb2RlYy4KLSAgICAgVGhlc2Ugc3BlY2lmaWNhdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAgdGhyaWZ0X3NwZWMgLT4gdHVwbGUgb2YgaXRlbV9zcGVjCi0gICAgIGl0ZW1fc3BlYyAtPiBuaWwgfCAodGFnLCB0eXBlX2VudW0sIG5hbWUsIHNwZWNfYXJncywgZGVmYXVsdCkKLSAgICAgdGFnIC0+IGludGVnZXIKLSAgICAgdHlwZV9lbnVtIC0+IFRUeXBlLkkzMiB8IFRUeXBlLlNUUklORyB8IFRUeXBlLlNUUlVDVCB8IC4uLgotICAgICBuYW1lIC0+IHN0cmluZ19saXRlcmFsCi0gICAgIGRlZmF1bHQgLT4gbmlsICAjIEhhbmRsZWQgYnkgX19pbml0X18KLSAgICAgc3BlY19hcmdzIC0+IG5pbCAgIyBGb3Igc2ltcGxlIHR5cGVzCi0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MpICAjIFZhbHVlIHR5cGUgZm9yIGxpc3Qvc2V0Ci0gICAgICAgICAgICAgICAgfCAodHlwZV9lbnVtLCBzcGVjX2FyZ3MsIHR5cGVfZW51bSwgc3BlY19hcmdzKQotICAgICAgICAgICAgICAgICAgIyBLZXkgYW5kIHZhbHVlIGZvciBtYXAKLSAgICAgICAgICAgICAgICB8IChjbGFzc19uYW1lLCBzcGVjX2FyZ3NfcHRyKSAjIEZvciBzdHJ1Y3QvZXhjZXB0aW9uCi0gICAgIGNsYXNzX25hbWUgLT4gaWRlbnRpZmllciAgIyBCYXNpY2FsbHkgYSBwb2ludGVyIHRvIHRoZSBjbGFzcwotICAgICBzcGVjX2FyZ3NfcHRyIC0+IGV4cHJlc3Npb24gICMganVzdCBjbGFzc19uYW1lLnNwZWNfYXJncwotCi0gICAgIFRPRE8oZHJlaXNzKTogQ29uc2lkZXIgbWFraW5nIHRoaXMgd29yayBmb3Igc3RydWN0cyB3aXRoIG5lZ2F0aXZlIHRhZ3MuCi0gICovCi0KLSAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIG5pbAotICAvLyBmb3Igc3RydWN0dXJlcyB3aXRoIG5vIG1lbWJlcnMuCi0gIC8vIFRPRE8oZHJlaXNzKTogVGVzdCBlbmNvZGluZyBvZiBzdHJ1Y3RzIHdoZXJlIHNvbWUgaW5uZXIgc3RydWN0cwotICAvLyBkb24ndCBoYXZlIHRocmlmdF9zcGVjLgotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKLSAgICBpbnQgc29ydGVkX2tleXNfcG9zID0gMDsKLSAgICBmb3IgKG1faXRlciA9IHNvcnRlZF9tZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBzb3J0ZWRfbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLQotICAgICAgZm9yICg7IHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKTsgc29ydGVkX2tleXNfcG9zKyspIHsKLSAgICAgICAgaWYgKHNvcnRlZF9rZXlzX3BvcyAhPSAwKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIl8gaW50ZXJmYWNle30gXCIiIDw8IGVzY2FwZV9zdHJpbmcoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiXCI7IC8vIG5pbCAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRUeXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgc3RyaW5nIGdvVHlwZSh0eXBlX3RvX2dvX3R5cGUoZmllbGRUeXBlKSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpIDw8ICIgIiAKLSAgICAgICAgICAgICAgICAgIDw8IGdvVHlwZSA8PCAiIFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICJcIjsgLy8gIiA8PCBzb3J0ZWRfa2V5c19wb3MKLSAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0KLSAgICAgIHNvcnRlZF9rZXlzX3BvcyArKzsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAvLyBUaGlzIGZpbGxzIGluIGRlZmF1bHQgdmFsdWVzLCBhcyBvcHBvc2VkIHRvIG51bGxzCi0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG91dHB1dCA6PSAmIiA8PCB0c3RydWN0X25hbWUgPDwgInsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIFRTdHJ1Y3Q6dGhyaWZ0Lk5ld1RTdHJ1Y3QoXCIiIDw8IGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkgPDwgIlwiLCBbXXRocmlmdC5URmllbGR7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyB0aHJpZnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRocmlmdC5OZXdURmllbGQoXCIiIDw8IGVzY2FwZV9zdHJpbmcodGhyaWZ0X25hbWUpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiksIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSksIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAvLyBJbml0aWFsaXplIGZpZWxkcwotICAgIC8vdF90eXBlKiB0eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgIHN0cmluZyBmaWVsZE5hbWUocHVibGljaXplKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIHN0cmluZyBmdWxsRmllbGROYW1lID0gIm91dHB1dC4iICsgZmllbGROYW1lOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBmdWxsRmllbGROYW1lIDw8ICIgPSAiIDw8Ci0gICAgICAgIHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIsIGZ1bGxGaWVsZE5hbWUpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBvdXRwdXQiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3RfbmFtZSwgaXNfcmVzdWx0KTsKLSAgCi0gIC8vIFByaW50aW5nIHV0aWxpdGllcyBzbyB0aGF0IG9uIHRoZSBjb21tYW5kIGxpbmUgdGhyaWZ0Ci0gIC8vIHN0cnVjdHMgbG9vayBwcmV0dHkgbGlrZSBkaWN0aW9uYXJpZXMKLSAgb3V0IDw8IAotICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBUU3RydWN0TmFtZSgpIHN0cmluZyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRzdHJ1Y3RfbmFtZSkgPDwgIlwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgVGhyaWZ0TmFtZSgpIHN0cmluZyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRzdHJ1Y3QtPmdldF9uYW1lKCkpIDw8ICJcIiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZiBwID09IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gXCI8bmlsPlwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmbXQuU3ByaW50ZihcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0X25hbWUpIDw8ICIoJSt2KVwiLCAqcCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG1ldGhvZHMgdGhhdCBjb21wYXJlIGJ5IHZhbHVlCi0gIGlmKG1lbWJlcnMuc2l6ZSgpIDw9IDApIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIG90aGVyID09IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAxLCB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBfLCBvayA6PSBvdGhlci4oKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiAhb2sgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gMCwgZmFsc2UiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiAwLCB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgb3RoZXIgPT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIDEsIHRydWUiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGRhdGEsIG9rIDo9IG90aGVyLigqIiA8PCB0c3RydWN0X25hbWUgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmICFvayB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIHJldHVybiAwLCBmYWxzZSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogb3JpZ190eXBlID0gKCptX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZShvcmlnX3R5cGUpOwotICAgICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpKSk7Ci0gICAgICBpZih0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgaWYodHlwZS0+aXNfYm9vbCgpKSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgY21wIDo9IHRocmlmdC5Db21wYXJlQm9vbChwLiIgPDwgZmllbGRfbmFtZSA8PCAiLCBkYXRhLiIgPDwgZmllbGRfbmFtZSA8PCAiKTsgY21wICE9IDAgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGNtcCwgdHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgcC4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBkYXRhLiIgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIGlmIHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPCBkYXRhLiIgPDwgZmllbGRfbmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIC0xLCB0cnVlIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gMSwgdHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZih0eXBlLT5pc19jb250YWluZXIoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiBjbXAsIG9rIDo9IHAuIiA8PCBmaWVsZF9uYW1lIDw8ICIuQ29tcGFyZVRvKGRhdGEuIiA8PCBmaWVsZF9uYW1lIDw8ICIpOyAhb2sgfHwgY21wICE9IDAgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBjbXAsIG9rIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwgCi0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gMCwgdHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICAKLSAgLy8gRXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgbWV0aG9kcyB0aGF0IGNvbXBhcmUgYnkgdmFsdWUKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEF0dHJpYnV0ZUJ5RmllbGRJZChpZCBpbnQpIGludGVyZmFjZXt9IHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBzd2l0Y2ggaWQgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGRlZmF1bHQ6IHJldHVybiBuaWwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZmllbGRfbmFtZShwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogcmV0dXJuIHAuIiA8PCBmaWVsZF9uYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFRTdHJ1Y3RGaWVsZHMoKSB0aHJpZnQuVEZpZWxkQ29udGFpbmVyIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0Lk5ld1RGaWVsZENvbnRhaW5lcihbXXRocmlmdC5URmllbGR7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyB0aHJpZnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgInRocmlmdC5OZXdURmllbGQoXCIiIDw8IGVzY2FwZV9zdHJpbmcodGhyaWZ0X25hbWUpIDw8ICJcIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiksIiA8PCBlbmRsOwotICB9Ci0gIG91dCA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gICh2b2lkKSBpc19yZXN1bHQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIGVzY2FwZWRfdHN0cnVjdF9uYW1lKGVzY2FwZV9zdHJpbmcodHN0cnVjdC0+Z2V0X25hbWUoKSkpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBSZWFkKGlwcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIl8sIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJmb3IgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJmaWVsZE5hbWUsIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBmaWVsZElkIDwgMCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZmllbGRJZCA9IGludDE2KHAuRmllbGRJZEZyb21GaWVsZE5hbWUoZmllbGROYW1lKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSBlbHNlIGlmIGZpZWxkTmFtZSA9PSBcIlwiIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBmaWVsZE5hbWUgPSBwLkZpZWxkTmFtZUZyb21GaWVsZElkKGludChmaWVsZElkKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuR0VORVJJQyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZmllbGRUeXBlSWQgPSBwLkZpZWxkRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKS5UeXBlSWQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09IHRocmlmdC5TVE9QIHsgYnJlYWs7IH0iIDw8IGVuZGw7Ci0KLSAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCi0gIGludDMyX3QgZmllbGRfaWQgPSAtMTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmaWVsZF9pZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIGluZGVudChvdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlICI7Ci0gICAgfQotICAgIG91dCA8PCAiaWYgZmllbGRJZCA9PSAiIDw8IGZpZWxkX2lkIDw8ICIgfHwgZmllbGROYW1lID09IFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZmllbGRUeXBlSWQgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGVyciA9IHAuUmVhZEZpZWxkIiA8PCBmaWVsZF9pZCA8PCAiKGlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSB0aHJpZnQuVk9JRCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSBwLlJlYWRGaWVsZCIgPDwgZmllbGRfaWQgPDwgIihpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIGlmIChmaXJzdCkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZXJyID0gaXByb3QuUmVhZEZpZWxkRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJlcnIgPSBpcHJvdC5SZWFkU3RydWN0RW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZpZWxkX3R5cGVfbmFtZShwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpKSk7Ci0gICAgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgIGludDMyX3QgZmllbGRfaWQgPSAoKmZfaXRlciktPmdldF9rZXkoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKSBSZWFkRmllbGQiIDw8IGZpZWxkX2lkIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgKGVyciB0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgZmFsc2UsICJwLiIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCB0c3RydWN0X25hbWUgPDwgIikgUmVhZEZpZWxkIiA8PCBmaWVsZF9uYW1lIDw8ICIoaXByb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLlJlYWRGaWVsZCIgPDwgZmllbGRfaWQgPDwgIihpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0KSB7Ci0gIHN0cmluZyBuYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFdyaXRlKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IAotICAgIGluZGVudCgpIDw8ICJlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QoIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAicC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGw7Ci0gIAotICBzdHJpbmcgZmllbGRfbmFtZTsKLSAgc3RyaW5nIGVzY2FwZV9maWVsZF9uYW1lOwotICBpbnQzMl90IGZpZWxkSWQgPSAtMTsKLSAgaWYgKGlzX3Jlc3VsdCAmJiBmaWVsZHMuc2l6ZSgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3dpdGNoIHsiIDw8IGVuZGw7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBmcl9pdGVyOwotICAgIGZvciAoZnJfaXRlciA9IGZpZWxkcy5yYmVnaW4oKTsgZnJfaXRlciAhPSBmaWVsZHMucmVuZCgpOyArK2ZyX2l0ZXIpIHsKLSAgICAgIGZpZWxkX25hbWUgPSAoKmZyX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgZmllbGRJZCA9ICgqZnJfaXRlciktPmdldF9rZXkoKTsKLSAgICAgIGlmKGNhbl9iZV9uaWwoKCpmcl9pdGVyKS0+Z2V0X3R5cGUoKSkgJiYgZmllbGRJZCAhPSAwKSB7Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJjYXNlIHAuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKGZpZWxkX25hbWUpKSA8PCAiICE9IG5pbDoiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgPSBwLldyaXRlRmllbGQiIDw8IGZpZWxkSWQgPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmYXVsdDoiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBlcnIgPSBwLldyaXRlRmllbGQiIDw8IGZpZWxkSWQgPDwgIihvcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBlc2NhcGVfZmllbGRfbmFtZSA9IGVzY2FwZV9zdHJpbmcoZmllbGRfbmFtZSk7Ci0gICAgICBmaWVsZElkID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImVyciA9IHAuV3JpdGVGaWVsZCIgPDwgZmllbGRJZCA8PCAiKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKC0xLCBcIlNUT1BcIiwgcC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICJwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZmllbGRJZCA9ICgqZl9pdGVyKS0+Z2V0X2tleSgpOwotICAgIGZpZWxkX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXNjYXBlX2ZpZWxkX25hbWUgPSBlc2NhcGVfc3RyaW5nKGZpZWxkX25hbWUpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFdyaXRlRmllbGQiIDw8IGZpZWxkSWQgPDwgIihvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoZXJyIHRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGNhbl9iZV9uaWwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBwLiIgPDwgcHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZShmaWVsZF9uYW1lKSkgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oXCIiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX2ZpZWxkX25hbWUgPDwgIlwiLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSWQgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkIDw8ICIsIFwiIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9maWVsZF9uYW1lIDw8ICJcIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwLlRocmlmdE5hbWUoKSwgZXJyKTsgfSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInAuIik7Ci0gICAgCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCA8PCAiLCBcIiIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfZmllbGRfbmFtZSA8PCAiXCIsICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicC5UaHJpZnROYW1lKCksIGVycik7IH0iIDw8IGVuZGw7Ci0KLSAgICBpZiAoY2FuX2JlX25pbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGVyciIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIFdyaXRlRmllbGQiIDw8IHB1YmxpY2l6ZShmaWVsZF9uYW1lKSA8PCAiKG9wcm90IHRocmlmdC5UUHJvdG9jb2wpICh0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5Xcml0ZUZpZWxkIiA8PCBmaWVsZElkIDw8ICIob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmdvIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGdvX3BhY2thZ2UoKSA8PAotICAgIGdvX2ltcG9ydHMoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJpbXBvcnQgXCJ0aHJpZnRsaWIvIiA8PCBnZXRfcmVhbF9nb19tb2R1bGUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpIDw8ICJcIiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgICAiaW1wb3J0ICgiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIm9zXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgYSBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGhlYWRlciBkZWZpbml0aW9uIGZvcgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX2dvX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRydWUgfHwgIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gICAgfQotICAgIGdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgc3RyaW5nIHNlcnZpY2VOYW1lKHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkpOwotICBzdHJpbmcgaW50ZXJmYWNlTmFtZSA9ICJJIiArIHNlcnZpY2VOYW1lOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIHNpemVfdCBpbmRleCA9IGV4dGVuZHMucmZpbmQoIi4iKTsKLSAgICBpZihpbmRleCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyAiICAiICsgZXh0ZW5kcy5zdWJzdHIoMCwgaW5kZXggKyAxKSArICJJIiArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiXG4iICsgaW5kZW50KCkgKyAiSSIgKyBwdWJsaWNpemUoZXh0ZW5kcykgKyAiXG4iOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidHlwZSAiIDw8IGludGVyZmFjZU5hbWUgPDwgIiBpbnRlcmZhY2UgeyIgPDwgZXh0ZW5kc19pZjsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCB0c2VydmljZSk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgaWYgKCFmdW5jdGlvbnMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBmdW5jdGlvbl9zaWduYXR1cmVfaWYoKmZfaXRlciwgIiIsIHRydWUpIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnRfbmV3ID0gIiI7Ci0gIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7Ci0gICAgaWYoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiQ2xpZW50IjsKLSAgICAgIGV4dGVuZHNfY2xpZW50X25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJDbGllbnQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX2NsaWVudCA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJDbGllbnQiOwotICAgICAgZXh0ZW5kc19jbGllbnRfbmV3ID0gIk5ldyIgKyBleHRlbmRzX2NsaWVudDsKLSAgICB9Ci0gIH0KLQotICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50IHN0cnVjdCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYoIWV4dGVuZHNfY2xpZW50LmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8IAotICAgICAgaW5kZW50KCkgPDwgIioiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIlRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJTZXFJZCBpbnQzMiIgPDwgZW5kbCAvKjw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVxcyBtYXBbaW50MzJdRGVmZXJyZWQiIDw8IGVuZGwqLzsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnRGYWN0b3J5KHQgdGhyaWZ0LlRUcmFuc3BvcnQsIGYgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQiOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgCi0gICAgICAieyIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIkZhY3RvcnkodCwgZil9IjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJ7VHJhbnNwb3J0OiB0LCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeTogZiwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sOiBmLkdldFByb3RvY29sKHQpLCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIlNlcUlkOiAwLCIgPDwgZW5kbCAvKjw8Ci0gICAgICBpbmRlbnQoKSA8PCAiUmVxczogbWFrZShtYXBbaW50MzJdRGVmZXJyZWQpIiA8PCBlbmRsKi87Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgCi0gIAotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50UHJvdG9jb2wodCB0aHJpZnQuVFRyYW5zcG9ydCwgaXByb3QgdGhyaWZ0LlRQcm90b2NvbCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCI7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICJ7IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiAiIDw8IGV4dGVuZHNfY2xpZW50X25ldyA8PCAiUHJvdG9jb2wodCwgaXByb3QsIG9wcm90KX0iIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJQcm90b2NvbEZhY3Rvcnk6IG5pbCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sOiBpcHJvdCwiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogb3Byb3QsIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiU2VxSWQ6IDAsIiA8PCBlbmRsIC8qPDwKLSAgICAgIGluZGVudCgpIDw8ICJSZXFzOiBtYWtlKG1hcFtpbnQzMl1pbnRlcmZhY2V7fSkiIDw8IGVuZGwqLzsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoZl9zZXJ2aWNlXywgKCpmX2l0ZXIpKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIC8qCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInAuU2VxSWQgKz0gMSIgPDwgZW5kbDsKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImQgOj0gZGVmZXIuRGVmZXJyZWQoKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicC5SZXFzW3AuU2VxSWRdID0gZCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgKi8KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gcC5TZW5kIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyByZXR1cm4gfSIgPDwgZW5kbDsKLSAgICAKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBwLlJlY3YiIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIFNlbmQiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiKGVyciBvcy5FcnJvcikgeyIgPDwgZW5kbDsKLSAgICAKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAKLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHByaXZhdGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIkFyZ3MiOwotICAgIAotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBzdHJpbmcgYXJncyh0bXAoImFyZ3MiKSk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90IDo9IHAuT3V0cHV0UHJvdG9jb2wiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBvcHJvdCAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3Byb3QgPSBwLlByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChwLlRyYW5zcG9ydCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHAuT3V0cHV0UHJvdG9jb2wgPSBvcHJvdCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwLlNlcUlkKysiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgdGhyaWZ0LkNBTEwsIHAuU2VxSWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzIDw8ICIgOj0gTmV3IiA8PCBwdWJsaWNpemUoYXJnc25hbWUpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCBhcmdzIDw8ICIuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSkgPDwgIiA9ICIgPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgIH0KLSAgICAKLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9ICIgPDwgYXJncyA8PCAiLldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgCi0gICAgaWYgKHRydWUpIHsgLy8hKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSB8fCB0cnVlKSB7fQotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHByaXZhdGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIlJlc3VsdCI7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCkgUmVjdiIgPDwgcHVibGljaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwKLSAgICAgICAgICAgICAgICAgICAgIigpICgiOwotICAgICAgaWYoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAidmFsdWUgIiA8PCB0eXBlX3RvX2dvX3R5cGUoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiLCAiOwotICAgICAgfQotICAgICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIHN0cmluZyBlcnJzID0gYXJndW1lbnRfbGlzdChleGNlcHRpb25zKTsKLSAgICAgIGlmKGVycnMuc2l6ZSgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgZXJycyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgICAgImVyciBvcy5FcnJvcikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0gICAgICAKLSAgICAgIHN0cmluZyByZXN1bHQodG1wKCJyZXN1bHQiKSk7Ci0gICAgICBzdHJpbmcgZXJyb3IodG1wKCJlcnJvciIpKTsKLSAgICAgIHN0cmluZyBlcnJvcjIodG1wKCJlcnJvciIpKTsKLSAgICAgIAotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcC5JbnB1dFByb3RvY29sIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBpcHJvdCA9PSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBwLklucHV0UHJvdG9jb2wgPSBpcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiXywgbVR5cGVJZCwgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIG1UeXBlSWQgPT0gdGhyaWZ0LkVYQ0VQVElPTiB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXJyb3IgPDwgIiA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uRGVmYXVsdCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXJyb3IyIDw8ICIsIGVyciA6PSAiIDw8IGVycm9yIDw8ICIuUmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyID0gIiA8PCBlcnJvcjIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIHAuU2VxSWQgIT0gc2VxSWQgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5CQURfU0VRVUVOQ0VfSUQsIFwicGluZyBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcmVzdWx0IDw8ICIgOj0gTmV3IiA8PCBwdWJsaWNpemUocmVzdWx0bmFtZSkgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlcnIgPSAiIDw8IHJlc3VsdCA8PCAiLlJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSA9ICIgPDwgcmVzdWx0IDw8ICIuU3VjY2VzcyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIAotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IHJlc3VsdCA8PCAiLiIgPDwgcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHJlc3VsdCA8PCAiLiIgPDwgcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4iIDw8IGVuZGw7Ci0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvL2luZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLyIrc2VydmljZV9uYW1lXysiLXJlbW90ZS5nbyI7Ci0gIG9mc3RyZWFtIGZfcmVtb3RlOwotICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBzZXJ2aWNlX21vZHVsZSA9IGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtXyk7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLSAgd2hpbGUoKGxvYyA9IHNlcnZpY2VfbW9kdWxlLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc2VydmljZV9tb2R1bGUucmVwbGFjZShsb2MsIDEsIDEsICcvJyk7Ci0gIH0KLQotICBmX3JlbW90ZSA8PAotICAgIGdvX2F1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgaW5kZW50KCkgPDwgInBhY2thZ2UgbWFpbiIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImltcG9ydCAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbGFnXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcImZtdFwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJodHRwXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcIm5ldFwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJvc1wiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJzdHJjb252XCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgICAgICBcInRocmlmdFwiIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICAgICAgXCJ0aHJpZnRsaWIvIiA8PCBzZXJ2aWNlX21vZHVsZSA8PCAiXCIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBVc2FnZSgpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBmbXQuRnByaW50KG9zLlN0ZGVyciwgXCJVc2FnZSBvZiBcIiwgb3MuQXJnc1swXSwgXCIgWy1oIGhvc3Q6cG9ydF0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXTpcXG5cIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBmbGFnLlByaW50RGVmYXVsdHMoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIkZ1bmN0aW9uczpcXG5cIikiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bmNOYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIGZ1bmNTaWduYXR1cmUoZnVuY3Rpb25fc2lnbmF0dXJlX2lmKCpmX2l0ZXIsICIiLCB0cnVlKSk7Ci0gICAgZl9yZW1vdGUgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIiAgIiA8PCBmdW5jTmFtZSA8PCBmdW5jU2lnbmF0dXJlLnN1YnN0cihmdW5jU2lnbmF0dXJlLmZpbmQoIigiKSkgPDwgIlxcblwiKSIgPDwgZW5kbDsKLSAgfQotICBmX3JlbW90ZSA8PAotICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIlxcblwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyBtYWluKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZfcmVtb3RlIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgaG9zdCBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIHBvcnQgaW50IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciBwcm90b2NvbCBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIHVybFN0cmluZyBzdHJpbmciIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGZyYW1lZCBib29sIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAidmFyIGhlbHAgYm9vbCIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgdXJsIGh0dHAuVVJMIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLlVzYWdlID0gVXNhZ2UiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJmhvc3QsIFwiaFwiLCBcImxvY2FsaG9zdFwiLCBcIlNwZWNpZnkgaG9zdCBhbmQgcG9ydFwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLkludFZhcigmcG9ydCwgXCJwXCIsIDkwOTAsIFwiU3BlY2lmeSBwb3J0XCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuU3RyaW5nVmFyKCZwcm90b2NvbCwgXCJQXCIsIFwiYmluYXJ5XCIsIFwiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbiwganNvbilcIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZmxhZy5TdHJpbmdWYXIoJnVybFN0cmluZywgXCJ1XCIsIFwiXCIsIFwiU3BlY2lmeSB0aGUgdXJsXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuQm9vbFZhcigmZnJhbWVkLCBcImZyYW1lZFwiLCBmYWxzZSwgXCJVc2UgZnJhbWVkIHRyYW5zcG9ydFwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJmhlbHAsIFwiaGVscFwiLCBmYWxzZSwgXCJTZWUgdXNhZ2Ugc3RyaW5nXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZsYWcuUGFyc2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBoZWxwIHx8IGZsYWcuTkFyZygpID09IDAgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBsZW4odXJsU3RyaW5nKSA+IDAgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHVybCwgZXJyIDo9IGh0dHAuUGFyc2VVUkwodXJsU3RyaW5nKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIuU3RyaW5nKCksIFwiXFxuXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHVybC5Ib3N0IiA8PCBlbmRsIDw8Ci0gICAgLy9pbmRlbnQoKSA8PCAiICBpZiBsZW4odXJsLlBvcnQpID09IDAgeyB1cmwuUG9ydCA9IFwiODBcIjsgfSIgPDwgZW5kbCA8PAotICAgIC8vaW5kZW50KCkgPDwgIiAgcG9ydCA9IGludCh1cmwuUG9ydCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB1c2VIdHRwID0gbGVuKHVybC5TY2hlbWUpIDw9IDAgfHwgdXJsLlNjaGVtZSA9PSBcImh0dHBcIiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgdXNlSHR0cCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgXywgZXJyIDo9IGh0dHAuUGFyc2VVUkwoZm10LlNwcmludChcImh0dHA6Ly9cIiwgaG9zdCwgXCI6XCIsIHBvcnQpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIuU3RyaW5nKCksIFwiXFxuXCIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBmbGFnLlVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNtZCA6PSBmbGFnLkFyZygwKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgZXJyIG9zLkVycm9yIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIHVzZUh0dHAgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQodXJsLlJhdykiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKFwidGNwXCIsIGZtdC5TcHJpbnQoaG9zdCwgXCI6XCIsIHBvcnQpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgcmVzb2x2aW5nIGFkZHJlc3NcIiwgZXJyLlN0cmluZygpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgb3MuRXhpdCgxKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB0cmFucywgZXJyID0gdGhyaWZ0Lk5ld1ROb25ibG9ja2luZ1NvY2tldEFkZHIoYWRkcikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBpZiBmcmFtZWQgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgICAgdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiRXJyb3IgY3JlYXRpbmcgdHJhbnNwb3J0XCIsIGVyci5TdHJpbmcoKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZGVmZXIgdHJhbnMuQ2xvc2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN3aXRjaCBwcm90b2NvbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhc2UgXCJjb21wYWN0XCI6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBicmVhayIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjYXNlIFwic2ltcGxlanNvblwiOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgYnJlYWsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiY2FzZSBcImpzb25cIjoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhc2UgXCJiaW5hcnlcIiwgXCJcIjoiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQ6IFwiLCBwcm90b2NvbCwgXCJcXG5cIikiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3MuRXhpdCgxKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNsaWVudCA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1YmxpY2l6ZShzZXJ2aWNlX25hbWVfKSA8PCAiQ2xpZW50RmFjdG9yeSh0cmFucywgcHJvdG9jb2xGYWN0b3J5KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgPSB0cmFucy5PcGVuKCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnQob3MuU3RkZXJyLCBcIkVycm9yIG9wZW5pbmcgc29ja2V0IHRvIFwiLCBob3N0LCBcIjpcIiwgcG9ydCwgXCIgXCIsIGVyci5TdHJpbmcoKSkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInN3aXRjaCBjbWQgeyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGludCBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotICAgIHN0cmluZyBmdW5jTmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBwdWJOYW1lKHB1YmxpY2l6ZShmdW5jTmFtZSkpOwotICAgIAotICAgIGZfcmVtb3RlIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiY2FzZSBcIiIgPDwgZXNjYXBlX3N0cmluZyhmdW5jTmFtZSkgPDwgIlwiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIGZsYWcuTkFyZygpIC0gMSAhPSAiIDw8IG51bV9hcmdzIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHB1Yk5hbWUpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncyA8PCAiIGFyZ3NcXG5cIikiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpbnQgZmxhZ0FyZyA9IGkgKyAxOwotICAgICAgdF90eXBlKiB0aGVfdHlwZShhcmdzW2ldLT5nZXRfdHlwZSgpKTsKLSAgICAgIHRfdHlwZSogdGhlX3R5cGUyKGdldF90cnVlX3R5cGUodGhlX3R5cGUpKTsKLSAgICAgIGlmKHRoZV90eXBlMi0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8IAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgZXJyIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi4iIDw8IHB1YmxpY2l6ZSh0aGVfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIih0bXAiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYodGhlX3R5cGUyLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIGUgPSAoKHRfYmFzZV90eXBlKil0aGVfdHlwZTIpLT5nZXRfYmFzZSgpOwotICAgICAgICBzdHJpbmcgZXJyKHRtcCgiZXJyIikpOwotICAgICAgICBzd2l0Y2goZSkgewotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgZl9yZW1vdGUgPDwgCi0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSA9PSBcInRydWVcIiIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIGZfcmVtb3RlIDw8IAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAidG1wIiA8PCBpIDw8ICIsICIgPDwgZXJyIDw8ICIgOj0gKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSBieXRlKHRtcCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgZl9yZW1vdGUgPDwgCi0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ0bXAiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pKGZsYWcuQXJnKCIgPDwgZmxhZ0FyZyA8PCAiKSkpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGJ5dGUodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCAKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgInRtcCIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gaW50MzIodG1wIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSAoc3RyY29udi5BdG9pNjQoZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IChzdHJjb252LkF0b2Y2NChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdygiSW52YWxpZCBiYXNlIHR5cGUgaW4gZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUiKTsKLSAgICAgICAgfQotICAgICAgICAvL2ZfcmVtb3RlIDw8IHB1YmxpY2l6ZShhcmdzW2ldLT5nZXRfbmFtZSgpKSA8PCAiKHN0cmNvbnYuQXRvaShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpKSI7Ci0gICAgICB9IGVsc2UgaWYodGhlX3R5cGUyLT5pc19zdHJ1Y3QoKSkgewotICAgICAgICBzdHJpbmcgYXJnKHRtcCgiYXJnIikpOwotICAgICAgICBzdHJpbmcgbWJUcmFucyh0bXAoIm1iVHJhbnMiKSk7Ci0gICAgICAgIHN0cmluZyBlcnIxKHRtcCgiZXJyIikpOwotICAgICAgICBzdHJpbmcgZmFjdG9yeSh0bXAoImZhY3RvcnkiKSk7Ci0gICAgICAgIHN0cmluZyBqc1Byb3QodG1wKCJqc1Byb3QiKSk7Ci0gICAgICAgIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOwotICAgICAgICBzdGQ6OnN0cmluZyB0c3RydWN0X25hbWUocHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSk7Ci0gICAgICAgIGZfcmVtb3RlIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgYXJnIDw8ICIgOj0gZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgbWJUcmFucyA8PCAiIDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyTGVuKGxlbigiIDw8IGFyZyA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGVmZXIgIiA8PCBtYlRyYW5zIDw8ICIuQ2xvc2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJfLCAiIDw8IGVycjEgPDwgIiA6PSAiIDw8IG1iVHJhbnMgPDwgIi5Xcml0ZVN0cmluZygiIDw8IGFyZyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjEgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpICA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBqc1Byb3QgPDwgIiA6PSAiIDw8IGZhY3RvcnkgPDwgIi5HZXRQcm90b2NvbCgiIDw8IG1iVHJhbnMgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHRzdHJ1Y3RfbmFtZSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gYXJndmFsdWUiIDw8IGkgPDwgIi5SZWFkKCIgPDwganNQcm90IDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmKHRoZV90eXBlMi0+aXNfY29udGFpbmVyKCkgfHwgdGhlX3R5cGUyLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHN0cmluZyBhcmcodG1wKCJhcmciKSk7Ci0gICAgICAgIHN0cmluZyBtYlRyYW5zKHRtcCgibWJUcmFucyIpKTsKLSAgICAgICAgc3RyaW5nIGVycjEodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0cmluZyBmYWN0b3J5KHRtcCgiZmFjdG9yeSIpKTsKLSAgICAgICAgc3RyaW5nIGpzUHJvdCh0bXAoImpzUHJvdCIpKTsKLSAgICAgICAgc3RyaW5nIGVycjIodG1wKCJlcnIiKSk7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGFyZ05hbWUocHVibGljaXplKGFyZ3NbaV0tPmdldF9uYW1lKCkpKTsKLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBhcmcgPDwgIiA6PSBmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCBtYlRyYW5zIDw8ICIgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXJMZW4obGVuKCIgPDwgYXJnIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWZlciAiIDw8IG1iVHJhbnMgPDwgIi5DbG9zZSgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIl8sICIgPDwgZXJyMSA8PCAiIDo9ICIgPDwgbWJUcmFucyA8PCAiLldyaXRlU3RyaW5nKCIgPDwgYXJnIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7ICIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIiA6PSAiIDw8IHBhY2thZ2VfbmFtZV8gPDwgIi5OZXciIDw8IHB1Yk5hbWUgPDwgIkFyZ3MoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IGVycjIgPDwgIiA6PSBjb250YWluZXJTdHJ1Y3QiIDw8IGkgPDwgIi5SZWFkRmllbGQiIDw8IChpICsgMSkgPDwgIigiIDw8IGpzUHJvdCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIFVzYWdlKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IGNvbnRhaW5lclN0cnVjdCIgPDwgaSA8PCAiLiIgPDwgYXJnTmFtZSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3coIkludmFsaWQgYXJndW1lbnQgdHlwZSBpbiBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSIpOwotICAgICAgICBzdHJpbmcgZXJyMSh0bXAoImVyciIpKTsKLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiYXJndmFsdWUiIDw8IGkgPDwgIiwgIiA8PCBlcnIxIDw8ICIgOj0gZXZhbChmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYodGhlX3R5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgICBmX3JlbW90ZSA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YWx1ZSIgPDwgaSA8PCAiIDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLiIgPDwgcHVibGljaXplKHRoZV90eXBlLT5nZXRfbmFtZSgpKSA8PCAiKGFyZ3ZhbHVlIiA8PCBpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFsdWUiIDw8IGkgPDwgIiA6PSBhcmd2YWx1ZSIgPDwgaSA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PAotICAgICAgaW5kZW50KCkgPDwgImZtdC5QcmludChjbGllbnQuIiA8PCBwdWJOYW1lIDw8ICIoIjsKLSAgICBib29sIGFyZ0ZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChhcmdGaXJzdCkgewotICAgICAgICBhcmdGaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGlmKGFyZ3NbaV0tPmdldF90eXBlKCktPmlzX2VudW0oKSkgewotICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICB9IGVsc2UgaWYoYXJnc1tpXS0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSBlID0gKCh0X2Jhc2VfdHlwZSopKGFyZ3NbaV0tPmdldF90eXBlKCkpKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgc3dpdGNoKGUpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6IGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBmX3JlbW90ZSA8PCAidmFsdWUiIDw8IGk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3coIkludmFsaWQgYmFzZSB0eXBlIGluIGdlbmVyYXRlX3NlcnZpY2VfcmVtb3RlIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy9mX3JlbW90ZSA8PCBwdWJsaWNpemUoYXJnc1tpXS0+Z2V0X25hbWUoKSkgPDwgIihzdHJjb252LkF0b2koZmxhZy5BcmcoIiA8PCBmbGFnQXJnIDw8ICIpKSkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9yZW1vdGUgPDwgInZhbHVlIiA8PCBpOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PAotICAgICAgIikpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm10LlByaW50KFwiXFxuXCIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICBmX3JlbW90ZSA8PAotICAgIGluZGVudCgpIDw8ICJjYXNlIFwiXCI6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGJyZWFrIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZm10LkZwcmludChvcy5TdGRlcnIsIFwiSW52YWxpZCBmdW5jdGlvbiBcIiwgY21kLCBcIlxcblwiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICAKLSAgZl9yZW1vdGUgPDwgCi0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0jaWZuZGVmIF9NU0NfVkVSCi0KLSAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgotICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgU19JUlVTUgotICAgICAgICB8IFNfSVdVU1IKLSAgICAgICAgfCBTX0lYVVNSCi0jaWZuZGVmIE1JTkdXCi0gICAgICAgIHwgU19JUkdSUAotICAgICAgICB8IFNfSVhHUlAKLSAgICAgICAgfCBTX0lST1RICi0gICAgICAgIHwgU19JWE9USAotI2VuZGlmCi0gICk7Ci0KLSNlbmRpZiAvLyBfTVNDX1ZFUgotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIiI7Ci0gIHN0cmluZyBzZXJ2aWNlTmFtZShwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpKTsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBzaXplX3QgaW5kZXggPSBleHRlbmRzLnJmaW5kKCIuIik7Ci0gICAgaWYoaW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyBwdWJsaWNpemUoZXh0ZW5kcy5zdWJzdHIoaW5kZXggKyAxKSkgKyAiUHJvY2Vzc29yIjsKLSAgICAgIGV4dGVuZHNfcHJvY2Vzc29yX25ldyA9IGV4dGVuZHMuc3Vic3RyKDAsIGluZGV4ICsgMSkgKyAiTmV3IiArIHB1YmxpY2l6ZShleHRlbmRzLnN1YnN0cihpbmRleCArIDEpKSArICJQcm9jZXNzb3IiOwotICAgIH0gZWxzZSB7Ci0gICAgICBleHRlbmRzX3Byb2Nlc3NvciA9IHB1YmxpY2l6ZShleHRlbmRzKSArICJQcm9jZXNzb3IiOwotICAgICAgZXh0ZW5kc19wcm9jZXNzb3JfbmV3ID0gIk5ldyIgKyBleHRlbmRzX3Byb2Nlc3NvcjsKLSAgICB9Ci0gIH0KLSAgc3RyaW5nIHBTZXJ2aWNlTmFtZShwcml2YXRpemUoc2VydmljZU5hbWUpKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgc3RyaW5nIHNlbGYodG1wKCJzZWxmIikpOwotICBpZihleHRlbmRzX3Byb2Nlc3Nvci5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIHN0cnVjdCB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBoYW5kbGVyIEkiIDw8IHNlcnZpY2VOYW1lIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHByb2Nlc3Nvck1hcCBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIEhhbmRsZXIoKSBJIiA8PCBzZXJ2aWNlTmFtZSA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLmhhbmRsZXIiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIEFkZFRvUHJvY2Vzc29yTWFwKGtleSBzdHJpbmcsIHByb2Nlc3NvciB0aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwLnByb2Nlc3Nvck1hcFtrZXldID0gcHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBHZXRQcm9jZXNzb3JGdW5jdGlvbihrZXkgc3RyaW5nKSAocHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24sIGV4aXN0cyBib29sKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwcm9jZXNzb3IsIGV4aXN0cyA9IHAucHJvY2Vzc29yTWFwW2tleV0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwcm9jZXNzb3IsIGV4aXN0cyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgUHJvY2Vzc29yTWFwKCkgbWFwW3N0cmluZ110aHJpZnQuVFByb2Nlc3NvckZ1bmN0aW9uIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBwLnByb2Nlc3Nvck1hcCIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIgSSIgPDwgc2VydmljZU5hbWUgPDwgIikgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgc2VsZiA8PCAiIDo9ICYiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3J7aGFuZGxlcjpoYW5kbGVyLCBwcm9jZXNzb3JNYXA6bWFrZShtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pfSIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgc3RyaW5nIGVzY2FwZWRGdW5jTmFtZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAiIDw8IHNlbGYgPDwgIi5wcm9jZXNzb3JNYXBbXCIiIDw8IGVzY2FwZWRGdW5jTmFtZSA8PCAiXCJdID0gJiIgPDwgcFNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IiIDw8IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJ7aGFuZGxlcjpoYW5kbGVyfSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgc3RyaW5nIHgodG1wKCJ4IikpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3MoaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciB0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgbmFtZSwgXywgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcHJvY2VzcywgbmFtZUZvdW5kIDo9IHAuR2V0UHJvY2Vzc29yRnVuY3Rpb24obmFtZSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmICFuYW1lRm91bmQgfHwgcHJvY2VzcyA9PSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBpcHJvdC5Ta2lwKHRocmlmdC5TVFJVQ1QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgIiA8PCB4IDw8ICIgOj0gdGhyaWZ0Lk5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0aHJpZnQuVU5LTk9XTl9NRVRIT0QsIFwiVW5rbm93biBmdW5jdGlvbiBcIiArIG5hbWUpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICAiIDw8IHggPDwgIi5Xcml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICAgb3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gZmFsc2UsICIgPDwgeCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcHJvY2Vzcy5Qcm9jZXNzKHNlcUlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ0eXBlICIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvciBzdHJ1Y3QgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgc3VwZXIgKiIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgSGFuZGxlcigpIEkiIDw8IHNlcnZpY2VOYW1lIDw8ICIgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuc3VwZXIuSGFuZGxlcigpLihJIiA8PCBzZXJ2aWNlTmFtZSA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcikgQWRkVG9Qcm9jZXNzb3JNYXAoa2V5IHN0cmluZywgcHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24pIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHAuc3VwZXIuQWRkVG9Qcm9jZXNzb3JNYXAoa2V5LCBwcm9jZXNzb3IpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBHZXRQcm9jZXNzb3JGdW5jdGlvbihrZXkgc3RyaW5nKSAocHJvY2Vzc29yIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24sIGV4aXN0cyBib29sKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcC5zdXBlci5HZXRQcm9jZXNzb3JGdW5jdGlvbihrZXkpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzb3JNYXAoKSBtYXBbc3RyaW5nXXRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24geyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuc3VwZXIuUHJvY2Vzc29yTWFwKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyIEkiIDw8IHNlcnZpY2VOYW1lIDw8ICIpICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIgOj0gJiIgPDwgc2VydmljZU5hbWUgPDwgIlByb2Nlc3NvcntzdXBlcjogIiA8PCBleHRlbmRzX3Byb2Nlc3Nvcl9uZXcgPDwgIihoYW5kbGVyKX0iIDw8IGVuZGw7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBlc2NhcGVkRnVuY05hbWUoZXNjYXBlX3N0cmluZygoKmZfaXRlciktPmdldF9uYW1lKCkpKTsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBzZWxmIDw8ICIuQWRkVG9Qcm9jZXNzb3JNYXAoXCIiIDw8IGVzY2FwZWRGdW5jTmFtZSA8PCAiXCIsICYiIDw8IHBTZXJ2aWNlTmFtZSA8PCAiUHJvY2Vzc29yIiA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAie2hhbmRsZXI6aGFuZGxlcn0pIiA8PCBlbmRsOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gIiA8PCBzZWxmIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3MoaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChib29sLCB0aHJpZnQuVEV4Y2VwdGlvbikgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHAuc3VwZXIuUHJvY2VzcyhpcHJvdCwgb3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIAotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIHN0cmluZyBwcm9jZXNzb3JOYW1lID0gcHJpdmF0aXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJQcm9jZXNzb3IiICsgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIAotICBzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJBcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJSZXN1bHQiOwotICAKLSAgLy90X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgLy9jb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIAotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBoYW5kbGVyIEkiIDw8IHB1YmxpY2l6ZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIpIFByb2Nlc3Moc2VxSWQgaW50MzIsIGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgdGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzIDo9IE5ldyIgPDwgYXJnc25hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVyciA9IGFyZ3MuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4IDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlBST1RPQ09MX0VSUk9SLCBlcnIuU3RyaW5nKCkpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5UcmFuc3BvcnQoKS5GbHVzaCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QuUmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXN1bHQgOj0gTmV3IiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAiOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpZighdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5TdWNjZXNzLCAiOwotICAgIH0KLSAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGV4Y2VwdGlvbnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuIiA8PCBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpIDw8ICIsICI7Ci0gICAgfQotICB9Ci0gIAotICAKLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZXJyID0gcC5oYW5kbGVyLiIgPDwgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8IHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgeCA6PSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5JTlRFUk5BTF9FUlJPUiwgXCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICI6IFwiICsgZXJyLlN0cmluZygpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCBlc2NhcGVfc3RyaW5nKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlwiLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVycjIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5SRVBMWSwgc2VxSWQpOyBlcnIyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVycjIgOj0gcmVzdWx0LldyaXRlKG9wcm90KTsgZXJyID09IG5pbCAmJiBlcnIyICE9IG5pbCB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmIGVycjIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIyIDo9IG9wcm90LlRyYW5zcG9ydCgpLkZsdXNoKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGVyciA9IGVycjIiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZSwgZXJyIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgLyoKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAiZnVuYyAocCAqIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8ICJDbGllbnQpIFdyaXRlUmVzdWx0c1N1Y2Nlc3MiIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiKHN1Y2Nlc3MgYm9vbCwgcmVzdWx0ICIgPDwgcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIlJlc3VsdCwgc2VxaWQgaW50MzIsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChlcnIgb3MuRXJyb3IpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC5TdWNjZXNzID0gc3VjY2VzcyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICJcIiwgdGhyaWZ0LlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzdWx0LldyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5UcmFuc3BvcnQoKS5GbHVzaCgpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAqLwotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIC8qCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImZ1bmMgKHAgKiIgPDwgcHVibGljaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCAiQ2xpZW50KSBXcml0ZVJlc3VsdHNFeGNlcHRpb24iIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiKGVycm9yICoiIDw8IHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIsIHJlc3VsdCAqLCBzZXFpZCwgb3Byb3QpIChlcnIgb3MuRXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBLaW5kYSBhYnN1cmQKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIHRocmlmdC5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IHJldHVybiBlcnIgfSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImVyciA9IHJlc3VsdC5Xcml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsgcmV0dXJuIGVyciB9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZXJyID0gb3Byb3QuVHJhbnNwb3J0KCkuRmx1c2goKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyByZXR1cm4gZXJyIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgKi8KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhKSB7Ci0gICh2b2lkKSBpbmNsYXNzOwotICAodm9pZCkgY29lcmNlRGF0YTsKLSAgdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUob3JpZ190eXBlKTsKLSAgc3RyaW5nIG5hbWUocHJlZml4ICsgcHVibGljaXplKHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKLSAgfQotICBzdHJpbmcgdiA9IHRtcCgidiIpOwotICBzdHJpbmcgZXJyMiA9IHRtcCgiZXJyIik7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBkZWNsYXJlLCBuYW1lLCBlcnIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICB2IDw8ICIsICIgPDwgZXJyMiA8PCAiIDo9IGlwcm90LiI7Ci0KLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIG91dCA8PCAiUmVhZFN0cmluZygpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiUmVhZEJvb2woKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIlJlYWRCeXRlKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIlJlYWRJMTYoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJSZWFkSTY0KCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIlJlYWREb3VibGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBHbyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiUmVhZEkzMigpIjsKLSAgICB9Ci0gICAgc3RyaW5nIHN0cnVjdE5hbWUoIlwiXCIiKTsKLSAgICBpZighcHJlZml4LnNpemUoKSB8fCBwcmVmaXguZmluZCgiLiIpID09IHN0cmluZzo6bnBvcykgewotICAgICAgc3RydWN0TmFtZSA9ICJcIlwiIjsKLSAgICB9IGVsc2UgewotICAgICAgc3RydWN0TmFtZSA9IHByZWZpeCArICJUaHJpZnROYW1lKCkiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyMiA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmaWVsZC0+Z2V0X2tleSgpICA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodGZpZWxkLT5nZXRfbmFtZSgpKSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiLCAiIDw8IHN0cnVjdE5hbWUgPDwgIiwgIiA8PCBlcnIyIDw8ICIpOyB9IiA8PCBlbmRsOwotICAgIGlmKCFwcmVmaXguc2l6ZSgpIHx8IHByZWZpeC5maW5kKCIuIikgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICBpZih0eXBlLT5pc19lbnVtKCkgfHwgb3JpZ190eXBlLT5pc190eXBlZGVmKCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiIDo9ICIgPDwgcHVibGljaXplKG9yaWdfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIigiPDwgdiA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA6PSAiIDw8IHYgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgcHVibGljaXplKG9yaWdfdHlwZS0+Z2V0X25hbWUoKSkgPDwgIigiPDwgdiA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9ICIgPDwgdiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgJyIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIicgZm9yIGZpZWxkICciICsgdGZpZWxkLT5nZXRfbmFtZSgpICsgIiciOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gICh2b2lkKSBlcnI7Ci0gIHN0cmluZyBlcnIyKHRtcCgiZXJyIikpOwotICBzdHJpbmcgZXEoIiA6PSAiKTsKLSAgaWYoIWRlY2xhcmUpIHsKLSAgICBlcSA9ICIgPSAiOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiTmV3IiA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCAiKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBlcnIyIDw8ICIgOj0gIiA8PCBwcmVmaXggPDwgIi5SZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVycjIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QoXCIiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX3N0cmluZyhwcmVmaXggKyB0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiXCIsICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnIyIDw8ICIpOyB9XG4iOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycikgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotICAKLSAgc3RyaW5nIGVxKCIgPSAiKTsKLSAgaWYoZGVjbGFyZSkKLSAgICBlcSA9ICIgOj0gIjsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwga3R5cGUgPDwgIiwgIiA8PCB2dHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIiwgIiA8PCBlcnIgPDwgIiA6PSBpcHJvdC5SZWFkTWFwQmVnaW4oKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIDw8ICIsIFwiIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlX3N0cmluZyhwcmVmaXgpIDw8ICJcIiwgXCJcIiwgIiA8PCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAidGhyaWZ0Lk5ld1RNYXAoIiA8PCBrdHlwZSA8PCAiLCAiIDw8IHZ0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IGlwcm90LlJlYWRTZXRCZWdpbigpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwiICByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA8PCAiLCBcIiIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZV9zdHJpbmcocHJlZml4KSA8PCAiXCIsIFwiXCIsICIgPDwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPDwgIik7IH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgInRocmlmdC5OZXdUU2V0KCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGV0eXBlIDw8ICIsICIgPDwgc2l6ZSA8PCAiLCAiIDw8IGVyciA8PCAiIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8IiAgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPDwgIiwgXCIiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVfc3RyaW5nKHByZWZpeCkgPDwgIlwiLCBcIlwiLCAiIDw8IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8IGVxIDw8ICJ0aHJpZnQuTmV3VExpc3QoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgJyIgKyB0dHlwZS0+Z2V0X25hbWUoKSArICInIGZvciBwcmVmaXggJyIgKyBwcmVmaXggKyAiJyI7Ci0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiZm9yICIgPDwgaSA8PCAiOj0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IHNpemUgPDwgIjsgIiA8PCBpIDw8ICIrKyB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBkZWNsYXJlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgZGVjbGFyZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGRlY2xhcmUsIHByZWZpeCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gaXByb3QuUmVhZE1hcEVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2NwcF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwibWFwXCIsICIgPDwgZXJyIDw8ICIpOyB9IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSBpcHJvdC5SZWFkU2V0RW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAtMQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcoKCh0X3NldCopdHR5cGUpLT5nZXRfY3BwX25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAiXCJzZXRcIiwgIiA8PCBlcnIgPDwgIik7IH0iIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSBpcHJvdC5SZWFkTGlzdEVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKCgodF9saXN0Kil0dHlwZSktPmdldF9jcHBfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICJcImxpc3RcIiwiIDw8IGVyciA8PCAiKTsgfSIgPDwgZW5kbDsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgKHZvaWQpIGRlY2xhcmU7Ci0gICh2b2lkKSBlcnI7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5LCB0cnVlKTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCwgdHJ1ZSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5TZXQoIiA8PCBrZXkgPDwgIiwgIiA8PCB2YWwgPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBzZXQgZWxlbWVudAotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICBkZWNsYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycikgewotICAodm9pZCkgZGVjbGFyZTsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGVycik7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgZGVjbGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycikgewotICAodm9pZCkgZGVjbGFyZTsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sIHRydWUsICIiLCBlcnIpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuUHVzaCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICBzdHJpbmcgbmFtZShwcmVmaXggKyBwdWJsaWNpemUodmFyaWFibGVfbmFtZV90b19nb19uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBuYW1lOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgZXJyIDw8ICIgPSBvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIldyaXRlU3RyaW5nKHN0cmluZygiIDw8IG5hbWUgPDwgIikpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAiV3JpdGVCb29sKGJvb2woIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIldyaXRlQnl0ZShieXRlKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIldyaXRlSTE2KGludDE2KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIldyaXRlSTY0KGludDY0KCIgPDwgbmFtZSA8PCAiKSkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlKGZsb2F0NjQoIiA8PCBuYW1lIDw8ICIpKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIldyaXRlSTMyKGludDMyKCIgPDwgbmFtZSA8PCAiKSkiOwotICAgIH0KLSAgICBzdHJpbmcgc3RydWN0TmFtZSA9IChwcmVmaXguc2l6ZSgpKSA/IHByZWZpeCArICJUaHJpZnROYW1lKCkiIDogIlwiXCIiOwotICAgIG91dCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmaWVsZC0+Z2V0X2tleSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgZXNjYXBlX3N0cmluZyh0ZmllbGQtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgc3RydWN0TmFtZSA8PCAiLCAiIDw8IGVyciA8PCAiKTsgfVxuIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAnIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgZmllbGQgJyIgKyBuYW1lICsgIiciOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGVycikgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBlcnIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdCgiIAotICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiIgPDwgZXNjYXBlX3N0cmluZyh0c3RydWN0LT5nZXRfbmFtZSgpKSA8PCAiXCIsICIgPDwgZXJyIDw8ICIpOyB9XG4iOwotfQotCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSBvcHJvdC5Xcml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IDw8ICIuTGVuKCkpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgZXNjYXBlX3N0cmluZyh0dHlwZS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAiXCJtYXBcIiwgIiA8PCBlcnIgPDwgIik7IH1cbiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBlcnIgPDwgIiA9IG9wcm90LldyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA8PCAiLkxlbigpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAtMQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodHR5cGUtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwic2V0XCIsICIgPDwgZXJyIDw8ICIpOyB9XG4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gb3Byb3QuV3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPDwgIi5MZW4oKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAiIDw8IGVyciA8PCAiICE9IG5pbCB7IHJldHVybiB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgiIAotICAgICAgICAgICAgICAgICAgICAgICAgPDwgLTEKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIFwiIiA8PCBlc2NhcGVfc3RyaW5nKHR0eXBlLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICJcImxpc3RcIiwgIiA8PCBlcnIgPDwgIik7IH1cbiI7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICciICsgdHR5cGUtPmdldF9uYW1lKCkgKyAiJyBmb3IgcHJlZml4ICciICsgcHJlZml4ICsgIiciOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBtaXRlciA9IHRtcCgiTWl0ZXIiKTsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoIktpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJWaXRlciIpOwotICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgIiA8PCBtaXRlciA8PCAiIDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIuSXRlcigpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwga2l0ZXIgPDwgIiwgIiA8PCB2aXRlciA8PCAiIDo9ICIgPDwgbWl0ZXIgPDwgIi5LZXkoKS4oIiA8PCB0eXBlX3RvX2dvX3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpIDw8ICIpLCAiIDw8IG1pdGVyIDw8ICIuVmFsdWUoKS4oIiA8PCB0eXBlX3RvX2dvX3R5cGUodG1hcC0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHRtYXAsIGtpdGVyLCB2aXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIkl0ZXIiKTsKLSAgICBzdHJpbmcgaXRlcjIgPSB0bXAoIkl0ZXIiKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJmb3IgIiA8PCBpdGVyIDw8ICIgOj0gIiA8PCBwcmVmaXggPDwgIi5Gcm9udCgpOyAiIDw8IGl0ZXIgPDwgIiAhPSBuaWw7ICIgPDwgaXRlciA8PCAiID0gIiA8PCBpdGVyIDw8ICIuTmV4dCgpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgaXRlcjIgPDwgIiA6PSAiIDw8IGl0ZXIgPDwgIi5WYWx1ZS4oIiA8PCB0eXBlX3RvX2dvX3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCB0c2V0LCBpdGVyMik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKXR0eXBlOwotICAgIHN0cmluZyBpdGVyID0gdG1wKCJJdGVyIik7Ci0gICAgc3RyaW5nIGl0ZXIyID0gdG1wKCJJdGVyIik7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZm9yICIgPDwgaXRlciA8PCAiIDo9IHJhbmdlICIgPDwgcHJlZml4IDw8ICIuSXRlcigpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgaXRlcjIgPDwgIiA6PSAiIDw8IGl0ZXIgPDwgIi4oIiA8PCB0eXBlX3RvX2dvX3R5cGUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgIikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsIHRsaXN0LCBpdGVyMik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IGVyciA8PCAiID0gb3Byb3QuV3JpdGVNYXBFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAtMQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodHR5cGUtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwibWFwXCIsICIgPDwgZXJyIDw8ICIpOyB9XG4iOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSBvcHJvdC5Xcml0ZVNldEVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgIiA8PCBlcnIgPDwgIiAhPSBuaWwgeyByZXR1cm4gdGhyaWZ0Lk5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoIiAKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBcIiIgPDwgZXNjYXBlX3N0cmluZyh0dHlwZS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgIiA8PCAiXCJzZXRcIiwgIiA8PCBlcnIgPDwgIik7IH1cbiI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgZXJyIDw8ICIgPSBvcHJvdC5Xcml0ZUxpc3RFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICIgPDwgZXJyIDw8ICIgIT0gbmlsIHsgcmV0dXJuIHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKCIgCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAtMQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgXCIiIDw8IGVzY2FwZV9zdHJpbmcodHR5cGUtPmdldF9uYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsICIgPDwgIlwibGlzdFwiLCAiIDw8IGVyciA8PCAiKTsgfVxuIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXJyKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBraXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBlcnIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCBlcnIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsIGVycik7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlcnIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBlcnIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIHN0cnVjdC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCi0gKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgotICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgIHRkb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKLSAgYm9vbCBoYXNfZG9jID0gZmFsc2U7Ci0gIHN0cmluZ3N0cmVhbSBzczsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIGhhc19kb2MgPSB0cnVlOwotICAgIHNzIDw8IHRkb2MtPmdldF9kb2MoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGlmIChoYXNfZG9jKSB7Ci0gICAgICBzcyA8PCBlbmRsOwotICAgIH0KLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCBzdWJoZWFkZXIgPDwgIjpcbiI7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICIgLSAiIDw8IHB1YmxpY2l6ZSh2YXJpYWJsZV9uYW1lX3RvX2dvX25hbWUocC0+Z2V0X25hbWUoKSkpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGhhc19kb2MpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqICIsIHNzLnN0cigpLAotICAgICAgIiAqL1xuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KLSAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiLyoqXG4iLAotICAgICAgIiAqIiwgdGRvYy0+Z2V0X2RvYygpLAotICAgICAgIiAqL1xuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhbiBhcmd1bWVudCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKLSAgcmVzdWx0IDw8IHB1YmxpY2l6ZSh0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICI9IjsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PAotICAgICAgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA8PCAibmlsIjsKLSAgfQotICByZXR1cm4gcmVzdWx0LnN0cigpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBkZWZhdWx0IHZhbHVlLCByZXR1cm5zIG5pbCBvdGhlcndpc2UuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCksIG5hbWUpOwotICB9IGVsc2UgewotICAgIHJldHVybiAibmlsIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICByZXR1cm4KLSAgICBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArIAotICAgICAgIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9nb19nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGRPc0Vycm9yKSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBwdWJsaWNpemUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIjsKLSAgc2lnbmF0dXJlICs9IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpICgiOwotICB0X3R5cGUqIHJldCA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKLSAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgc3RyaW5nIGVycnMgPSBhcmd1bWVudF9saXN0KGV4Y2VwdGlvbnMpOwotICBzdHJpbmcgcmV0dmFsKHRtcCgicmV0dmFsIikpOwotICBpZighcmV0LT5pc192b2lkKCkpIHsKLSAgICBzaWduYXR1cmUgKz0gcmV0dmFsICsgIiAiICsgdHlwZV90b19nb190eXBlKHJldCk7Ci0gICAgaWYoYWRkT3NFcnJvciB8fCBlcnJzLnNpemUoKT09MCkgewotICAgICAgc2lnbmF0dXJlICs9ICIsICI7Ci0gICAgfQotICB9Ci0gIGlmKGVycnMuc2l6ZSgpPjApIHsKLSAgICBzaWduYXR1cmUgKz0gZXJyczsKLSAgICBpZihhZGRPc0Vycm9yKQotICAgICAgc2lnbmF0dXJlICs9ICIsICI7Ci0gIH0KLSAgaWYoYWRkT3NFcnJvcikgewotICAgIHNpZ25hdHVyZSArPSAiZXJyIG9zLkVycm9yIjsKLSAgfQotICBzaWduYXR1cmUgKz0gIikiOwotICByZXR1cm4gc2lnbmF0dXJlOwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpICsgIiAiICsgdHlwZV90b19nb190eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW0pICsgIi4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcmV0dXJuIGdldF9yZWFsX2dvX21vZHVsZShwcm9ncmFtKSArICIudHR5cGVzLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAidGhyaWZ0LlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJ0aHJpZnQuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJ0aHJpZnQuQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gInRocmlmdC5JMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJ0aHJpZnQuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAidGhyaWZ0Lkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gInRocmlmdC5ET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAidGhyaWZ0LlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBnbyB0eW9lCi0gKi8KLXN0cmluZyB0X2dvX2dlbmVyYXRvcjo6dHlwZV90b19nb190eXBlKHRfdHlwZSogdHlwZSkgewotICAvL3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJzdHJpbmciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiYm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJieXRlIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiaW50MTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJpbnQzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gImludDY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZmxvYXQ2NCI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiBwdWJsaWNpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBzdHJpbmcoIioiKSArIHB1YmxpY2l6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAidGhyaWZ0LlRNYXAiOwotICAgIC8vdF9tYXAqIHQgPSAodF9tYXAqKXR5cGU7Ci0gICAgLy9zdHJpbmcga2V5VHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgLy9zdHJpbmcgdmFsdWVUeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF92YWxfdHlwZSgpKTsKLSAgICAvL3JldHVybiBzdHJpbmcoIm1hcFsiKSArIGtleVR5cGUgKyAiXSIgKyB2YWx1ZVR5cGU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gInRocmlmdC5UU2V0IjsKLSAgICAvL3Rfc2V0KiB0ID0gKHRfc2V0Kil0eXBlOwotICAgIC8vc3RyaW5nIGVsZW1UeXBlID0gdHlwZV90b19nb190eXBlKHQtPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgLy9yZXR1cm4gc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJ0aHJpZnQuVExpc3QiOwotICAgIC8vdF9saXN0KiB0ID0gKHRfbGlzdCopdHlwZTsKLSAgICAvL3N0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOwotICAgIC8vcmV0dXJuIHN0cmluZygiW10iKSArIGVsZW1UeXBlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBwdWJsaWNpemUoKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSk7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZ29fdHlwZTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIGdvIHR5b2UKLSAqLwotYm9vbCB0X2dvX2dlbmVyYXRvcjo6Y2FuX2JlX25pbCh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiSW52YWxpZCBUeXBlIGZvciBjYW5fYmVfbmlsIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gY2FuX2JlX25pbDogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotCi0vKiogU2VlIHRoZSBjb21tZW50IGluc2lkZSBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbiBmb3Igd2hhdCB0aGlzIGlzLiAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjp0eXBlX3RvX3NwZWNfYXJncyh0X3R5cGUqIHR0eXBlKSB7Ci0gIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0dHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJuaWwiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiKCIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLnRocmlmdF9zcGVjKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpICsKLSAgICAgICIpIjsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiKCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKwotICAgICAgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiKCIgKwotICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArCi0gICAgICAiKSI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fc3BlY19hcmdzOiAiICsgdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihnbywgIkdvIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3NTI2MS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyoqCi0gKiBIYXNrZWxsIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9oc19nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfaHNfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWhzIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdCAgICAgICAgICAgICh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24gKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVscGVyID0gZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlciAgICAgKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIgICAgIChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzICAodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0KTsKLQotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXggPSAiIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlICAgICAgICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCA9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4ID0gIiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdHJpbmcgaHNfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0cmluZyBoc19sYW5ndWFnZV9wcmFnbWEoKTsKLSAgc3RyaW5nIGhzX2ltcG9ydHMoKTsKLQotICBzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCA9ICIiKTsKLQotICBzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHRpb25zID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW8gPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtZXRob2QgPSBmYWxzZSk7Ci0KLSAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdHJpbmcgcmVuZGVyX2hzX3R5cGUodF90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wYXJlbnMpOwotCi0gcHJpdmF0ZToKLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfY29uc3RzXzsKLSAgb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgb2ZzdHJlYW0gZl9pZmFjZV87Ci0gIG9mc3RyZWFtIGZfY2xpZW50XzsKLX07Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBwbmFtZSA9IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX1R5cGVzLmhzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcG5hbWUgKyAiX0NvbnN0cy5ocyI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfIDw8ICJtb2R1bGUgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIHdoZXJlIiA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBmX2NvbnN0c18gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCAibW9kdWxlICIgPDwgcG5hbWUgPDwgIl9Db25zdHMgd2hlcmUiIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLSAgZl9jb25zdHNfIDw8ICJpbXBvcnQgIiA8PCBwbmFtZSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmhzX2xhbmd1YWdlX3ByYWdtYSgpIHsKLSAgcmV0dXJuIHN0cmluZygiey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfVxuIgotICAgICAgICAgICAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3NpbmctZmllbGRzICMtfVxuIgotICAgICAgICAgICAgICAgICJ7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLW1pc3Npbmctc2lnbmF0dXJlcyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1uYW1lLXNoYWRvd2luZyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtaW1wb3J0cyAjLX1cbiIKLSAgICAgICAgICAgICAgICAiey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi11bnVzZWQtbWF0Y2hlcyAjLX1cbiIpOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4gc3RyaW5nKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikgKwotICAgICAgICAgICAgICAgICItLSBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIikgICAgICAgICAgICAgICAgICAgICAgLS1cbiIgKwotICAgICAgICAgICAgICAgICItLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLVxuIiArCi0gICAgICAgICAgICAgICAgIi0tIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HIC0tXG4iICsKLSAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6aHNfaW1wb3J0cygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9IHN0cmluZygKLSAgICAgICJpbXBvcnQgUHJlbHVkZSAoIEJvb2woLi4pLCBFbnVtLCBEb3VibGUsIFN0cmluZywgTWF5YmUoLi4pLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgRXEsIFNob3csIE9yZCxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgIHJldHVybiwgbGVuZ3RoLCBJTywgZnJvbUludGVncmFsLCBmcm9tRW51bSwgdG9FbnVtLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgKC4pLCAoJiYpLCAofHwpLCAoPT0pLCAoKyspLCAoJCksICgtKSApXG4iCi0gICAgICAiXG4iCi0gICAgICAiaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uXG4iCi0gICAgICAiaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5XG4iCi0gICAgICAiaW1wb3J0IERhdGEuSGFzaGFibGVcbiIKLSAgICAgICJpbXBvcnQgRGF0YS5JbnRcbiIKLSAgICAgICJpbXBvcnQgRGF0YS5UZXh0LkxhenkgKCBUZXh0IClcbiIKLSAgICAgICJpbXBvcnQgcXVhbGlmaWVkIERhdGEuVGV4dC5MYXp5IGFzIFRMXG4iCi0gICAgICAiaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApXG4iCi0gICAgICAiaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldFxuIgotICAgICAgImltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yXG4iCi0gICAgICAiXG4iCi0gICAgICAiaW1wb3J0IFRocmlmdFxuIgotICAgICAgImltcG9ydCBUaHJpZnQuVHlwZXMgKClcbiIKLSAgICAgICJcbiIpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpCi0gICAgcmVzdWx0ICs9ICJpbXBvcnQgcXVhbGlmaWVkICIgKyBjYXBpdGFsaXplKGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpKSArICJfVHlwZXNcbiI7Ci0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApCi0gICAgcmVzdWx0ICs9ICJcbiI7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBzdHJpbmcgdG5hbWUgPSBjYXBpdGFsaXplKHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKSk7Ci0gIHN0cmluZyB0ZGVmID0gcmVuZGVyX2hzX3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCksIGZhbHNlKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAidHlwZSAiIDw8IHRuYW1lIDw8ICIgPSAiIDw8IHRkZWYgPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLgotICogdGhlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBpbmRlbnQoZl90eXBlc18pIDw8ICJkYXRhICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICI7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgZl90eXBlc18gPDwgKGZpcnN0ID8gIiIgOiAifCIpOwotICAgIGZfdHlwZXNfIDw8IG5hbWU7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJkZXJpdmluZyAoU2hvdyxFcSwgVHlwZWFibGUsIE9yZCkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSk7Ci0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiaW5zdGFuY2UgRW51bSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJmcm9tRW51bSB0ID0gY2FzZSB0IG9mIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgbmFtZSA8PCAiIC0+ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJ0b0VudW0gdCA9IGNhc2UgdCBvZiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvcihjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgdmFsdWUgPDwgIiAtPiAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJfIC0+IHRocm93IFRocmlmdEV4Y2VwdGlvbiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJpbnN0YW5jZSBIYXNoYWJsZSAiIDw8IGVuYW1lIDw8ICIgd2hlcmUiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl90eXBlc18pIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCA9IGhhc2hXaXRoU2FsdCBzYWx0IC4gZnJvbUVudW0iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0Y29uc3QtPmdldF9uYW1lKCkpOwotCi0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCBuYW1lIDw8ICIgOjogIiA8PCByZW5kZXJfaHNfdHlwZSh0eXBlLCBmYWxzZSkgPDwgZW5kbDsKLSAgaW5kZW50KGZfY29uc3RzXykgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0gIG9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0KLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAiKCIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIiA6OiBJbnQ4KSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDE2KSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDMyKSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8ICIoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiIDo6IEludDY0KSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICB0X2VudW0qIHRlbnVtID0gKHRfZW51bSopdHlwZTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaW50IHZhbCA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgICBpZiAodmFsID09IHZhbHVlLT5nZXRfaW50ZWdlcigpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCBjbmFtZSA8PCAieyI7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0KLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotCi0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKQotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotCi0gICAgICBzdHJpbmcgZm5hbWUgPSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICBzdHJpbmcgY29uc3RfdmFsdWUgPSByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotCi0gICAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgb3V0IDw8ICJmXyIgPDwgY25hbWUgPDwgIl8iIDw8IGZuYW1lIDw8ICIgPSBKdXN0ICgiIDw8IGNvbnN0X3ZhbHVlIDw8ICIpIjsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCAiKCIgPDwga2V5IDw8ICIsIiA8PCB2YWwgPDwgIikiOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgb3V0IDw8ICJdKSI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gdHlwZS0+aXNfbGlzdCgpCi0gICAgICAgID8gKCh0X2xpc3QqKSB0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpCi0gICAgICAgIDogKCh0X3NldCopIHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpCi0gICAgICBvdXQgPDwgIihTZXQuZnJvbUxpc3QgWyI7Ci0gICAgZWxzZQotICAgICAgb3V0IDw8ICIoVmVjdG9yLmZyb21MaXN0ICI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIl0pIjsKLQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSAic3RydWN0IgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfaHNfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgSGFza2VsbCBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbixmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgewotICAodm9pZCkgaGVscGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8ICJkYXRhICIgPDwgdG5hbWUgPDwgIiA9ICIgPDwgdG5hbWU7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgInsiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgc3RyaW5nIG1uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgb3V0IDw8IChmaXJzdCA/ICIiIDogIiwiKTsKLSAgICAgIG91dCA8PCAiZl8iIDw8IHRuYW1lIDw8ICJfIiA8PCBtbmFtZSA8PCAiIDo6IE1heWJlICIgPDwgcmVuZGVyX2hzX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCB0cnVlKTsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotICAgIG91dCA8PCAifSI7Ci0gIH0KLQotICBvdXQgPDwgIiBkZXJpdmluZyAoU2hvdyxFcSxUeXBlYWJsZSkiIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikKLSAgICBvdXQgPDwgImluc3RhbmNlIEV4Y2VwdGlvbiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIEhhc2hhYmxlICIgPDwgdG5hbWUgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJoYXNoV2l0aFNhbHQgc2FsdCByZWNvcmQgPSBzYWx0IjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyBtbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiIGBoYXNoV2l0aFNhbHRgICIgPDwgImZfIiA8PCB0bmFtZSA8PCAiXyIgPDwgbW5hbWUgPDwgIiByZWNvcmQiOwotICB9Ci0gIGluZGVudChvdXQpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyB0ID0gdG1wKCJfdCIpOwotICBzdHJpbmcgaWQgPSB0bXAoIl9pZCIpOwotCi0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIl9maWVsZHMgaXByb3QgcmVjb3JkID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiKF8sIiA8PCB0IDw8ICIsIiA8PCBpZCA8PCAiKSA8LSByZWFkRmllbGRCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAiIDw8IHQgPDwgIiA9PSBUX1NUT1AgdGhlbiByZXR1cm4gcmVjb3JkIGVsc2UiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgaWQgPDwgIiBvZiAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGludDMyX3Qga2V5ID0gKCpmX2l0ZXIpLT5nZXRfa2V5KCk7Ci0gICAgc3RyaW5nIGV0eXBlID0gdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICIgLT4gIiA8PCAiaWYgIiA8PCB0IDw8ICIgPT0gIiA8PCBldHlwZSA8PCAiIHRoZW4gZG8iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicyA8LSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcixzdHIpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgc3RyaW5nIGZuYW1lID0gZGVjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCByZWNvcmR7Zl8iIDw8IHNuYW1lIDw8ICJfIiA8PCBmbmFtZSA8PCAiPUp1c3Qgc30iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZWxzZSBkbyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJza2lwIGlwcm90ICIgPDwgdCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiX2ZpZWxkcyBpcHJvdCByZWNvcmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gIGluZGVudChvdXQpIDw8ICJfIC0+IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInNraXAgaXByb3QgIiA8PCB0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkRmllbGRFbmQgaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWFkXyIgPDwgc25hbWUgPDwgIl9maWVsZHMgaXByb3QgcmVjb3JkIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIHJlYWQKLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIGlwcm90ID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiXyA8LSByZWFkU3RydWN0QmVnaW4gaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZWNvcmQgPC0gcmVhZF8iIDw8IHNuYW1lIDw8ICJfZmllbGRzIGlwcm90ICgiIDw8IHNuYW1lIDw8ICJ7IjsKLQotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgIG91dCA8PCAiZl8iIDw8IHNuYW1lIDw8ICJfIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiPU5vdGhpbmciOwotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLQotICBvdXQgPDwgIn0pIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmVhZFN0cnVjdEVuZCBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiByZWNvcmQiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKLSAgc3RyaW5nIGYgPSB0bXAoIl9mIik7Ci0KLSAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgIndyaXRlU3RydWN0QmVnaW4gb3Byb3QgXCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgc3RyaW5nIG1uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJjYXNlIGZfIiA8PCBuYW1lIDw8ICJfIiA8PCBtbmFtZSA8PCAiIHJlY29yZCBvZiB7Tm90aGluZyAtPiByZXR1cm4gKCk7IEp1c3QgX3YgLT4gZG8iIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAid3JpdGVGaWVsZEJlZ2luIG9wcm90IChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwiCi0gICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjb250ZW50cwotICAgIGluZGVudChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJfdiIpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIndyaXRlRmllbGRFbmQgb3Byb3R9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBpbmRlbnQob3V0KSA8PCAid3JpdGVGaWVsZFN0b3Agb3Byb3QiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ3cml0ZVN0cnVjdEVuZCBvcHJvdCIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICIuaHMiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBoc19sYW5ndWFnZV9wcmFnbWEoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8IGhzX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIiB3aGVyZSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCBoc19pbXBvcnRzKCkgPDwgZW5kbDsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJpbXBvcnQgcXVhbGlmaWVkICIgPDwgY2FwaXRhbGl6ZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgImltcG9ydCAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl9UeXBlcyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXyA8PCAiaW1wb3J0IHF1YWxpZmllZCAiIDw8IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgPDwgIl9JZmFjZSBhcyBJZmFjZSIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICItLSBIRUxQRVIgRlVOQ1RJT05TIEFORCBTVFJVQ1RVUkVTIC0tIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfaHNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLQotICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0KLSAgZ2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywmcmVzdWx0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9pZmFjZV9uYW1lID0gZ2V0X291dF9kaXIoKSArIGNhcGl0YWxpemUoc2VydmljZV9uYW1lXykgKyAiX0lmYWNlLmhzIjsKLSAgZl9pZmFjZV8ub3BlbihmX2lmYWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9pZmFjZV8gPDwgaHNfbGFuZ3VhZ2VfcHJhZ21hKCkgPDwgZW5kbDsKLSAgZl9pZmFjZV8gPDwgaHNfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKLQotICBmX2lmYWNlXyA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSA8PCAiX0lmYWNlIHdoZXJlIiA8PCBlbmRsOwotCi0gIGZfaWZhY2VfIDw8IGhzX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCAiaW1wb3J0ICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX1R5cGVzIiA8PCBlbmRsOwotICBmX2lmYWNlXyA8PCBlbmRsOwotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgc3RyaW5nIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotCi0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIiA8PCBlbmRsOwotICAgIGluZGVudChmX2lmYWNlXykgPDwgImNsYXNzICIgPDwgZXh0ZW5kcyA8PCAiX0lmYWNlIGEgPT4gIiA8PCBzbmFtZSA8PCAiX0lmYWNlIGEgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoZl9pZmFjZV8pIDw8ICJjbGFzcyAiIDw8IHNuYW1lIDw8ICJfSWZhY2UgYSB3aGVyZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdCA9IGZ1bmN0aW9uX3R5cGUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgaW5kZW50KGZfaWZhY2VfKSA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDo6IGEgLT4gIiA8PCBmdCAgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfaWZhY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4gTm90ZSB0aGF0IGluIEhhc2tlbGwsIHRoZSBjbGllbnQgZG9lc24ndCBpbXBsZW1lbnQgaWZhY2UuIFRoaXMgaXMgYmVjYXVzZQotICogVGhlIGNsaWVudCBkb2VzIG5vdCAoYW5kIHNob3VsZCBub3QgaGF2ZSB0bykgZGVhbCB3aXRoIGFyZ3VtZW50cyBiZWluZyBOb3RoaW5nLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfY2xpZW50X25hbWUgPSBnZXRfb3V0X2RpcigpICsgY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJfQ2xpZW50LmhzIjsKLSAgZl9jbGllbnRfLm9wZW4oZl9jbGllbnRfbmFtZS5jX3N0cigpKTsKLSAgZl9jbGllbnRfIDw8IGhzX2xhbmd1YWdlX3ByYWdtYSgpIDw8IGVuZGw7Ci0gIGZfY2xpZW50XyA8PCBoc19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHBvcnRzID0gIiI7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZXhwb3J0cyArPSAoZmlyc3QgPyAiIiA6ICIsIik7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgZXhwb3J0cyArPSBkZWNhcGl0YWxpemUoZnVubmFtZSk7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfQotCi0gIHN0cmluZyBzbmFtZSA9IGNhcGl0YWxpemUoc2VydmljZV9uYW1lXyk7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJtb2R1bGUgIiA8PCBzbmFtZSA8PCAiX0NsaWVudCgiIDw8IGV4cG9ydHMgPDwgIikgd2hlcmUiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiaW1wb3J0ICIgPDwgZXh0ZW5kcyA8PCAiX0NsaWVudCIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgRGF0YS5JT1JlZiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfY2xpZW50XykgPDwgaHNfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pIDw8ICJfVHlwZXMiIDw8IGVuZGw7Ci0gIGluZGVudChmX2NsaWVudF8pIDw8ICJpbXBvcnQgIiA8PCBjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pIDw8IGVuZGw7Ci0KLSAgLy8gREFUUyBSSVRFIEEgR0xPQkFMIFZBUgotICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxaWQgPSBuZXdJT1JlZiAwIiA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyBmYXJncyA9ICIiOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKQotICAgICAgZmFyZ3MgKz0gIiBhcmdfIiArIGRlY2FwaXRhbGl6ZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgZGVjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgKGlwLG9wKSIgPDwgIGZhcmdzIDw8ICIgPSBkbyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIgb3AiIDw8IGZhcmdzOwotCi0gICAgZl9jbGllbnRfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIiBpcCIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiBvcCIgPDwgZmFyZ3MgPDwgIiA9IGRvIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KGZfY2xpZW50XykgPDwgInNlcSA8LSBzZXFpZCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAic2VxbiA8LSByZWFkSU9SZWYgc2VxIiA8PCBlbmRsOwotICAgIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcCAoXCIiIDw8IGZuYW1lIDw8ICJcIiwgTV9DQUxMLCBzZXFuKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVfIiA8PCBhcmdzbmFtZSA8PCAiIG9wICgiIDw8IGFyZ3NuYW1lIDw8ICJ7IjsKLQotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgZmllbGRuYW1lID0gKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBmX2NsaWVudF8gPDwgKGZpcnN0ID8gIiIgOiAiLCIpOwotICAgICAgZl9jbGllbnRfIDw8ICJmXyIgPDwgYXJnc25hbWUgPDwgIl8iIDw8IGZpZWxkbmFtZSA8PCAiPUp1c3QgYXJnXyIgPDwgZmllbGRuYW1lOwotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9Ci0gICAgZl9jbGllbnRfIDw8ICJ9KSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVNZXNzYWdlRW5kIG9wIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJ0Rmx1c2ggKGdldFRyYW5zcG9ydCBvcCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotCi0gICAgICBzdHJpbmcgZnVubmFtZSA9IHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksIGZ1bm5hbWUsICZub2FyZ3MpOwotCi0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCBmdW5uYW1lIDw8ICIgaXAgPSBkbyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA8LSByZWFkTWVzc2FnZUJlZ2luIGlwIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgImlmIG10eXBlID09IE1fRVhDRVBUSU9OIHRoZW4gZG8iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICB4IDwtIHJlYWRBcHBFeG4gaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICByZWFkTWVzc2FnZUVuZCBpcCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICIgIHRocm93IHgiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiICBlbHNlIHJldHVybiAoKSIgPDwgZW5kbDsKLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLQotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlcyA8LSByZWFkXyIgPDwgcmVzdWx0bmFtZSA8PCAiIGlwIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJlYWRNZXNzYWdlRW5kIGlwIiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgImNhc2UgZl8iIDw8IHJlc3VsdG5hbWUgPDwgIl9zdWNjZXNzIHJlcyBvZiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIkp1c3QgdiAtPiByZXR1cm4gdiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk5vdGhpbmcgLT4gZG8iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgfQotCi0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBzdHJpbmcgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJjYXNlIGZfIiA8PCByZXN1bHRuYW1lIDw8ICJfIiA8PCB4bmFtZSA8PCAiIHJlcyBvZiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgIk5vdGhpbmcgLT4gcmV0dXJuICgpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiSnVzdCBfdiAtPiB0aHJvdyBfdiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfY2xpZW50XykgPDwgInJldHVybiAoKSIgPDwgZW5kbDsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyaW5nIHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAidGhyb3cgKEFwcEV4biBBRV9NSVNTSU5HX1JFU1VMVCBcIiIgPDwgdG5hbWUgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBmX2NsaWVudF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkgPSBjYXNlIG5hbWUgb2YiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXCIiIDw8IGZuYW1lIDw8ICJcIiAtPiBwcm9jZXNzXyIgPDwgZGVjYXBpdGFsaXplKGZuYW1lKSA8PCAiIChzZXFpZCxpcHJvdCxvcHJvdCxoYW5kbGVyKSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyAtPiAiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSA8PCAiLnByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSAobmFtZSx0eXAsc2VxaWQpIiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZG8iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJza2lwIGlwcm90IFRfU1RSVUNUIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAobmFtZSxNX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZUFwcEV4biBvcHJvdCAoQXBwRXhuIEFFX1VOS05PV05fTUVUSE9EIChcIlVua25vd24gZnVuY3Rpb24gXCIgKysgVEwudW5wYWNrIG5hbWUpKSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlTWVzc2FnZUVuZCBvcHJvdCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKG5hbWUsIHR5cCwgc2VxaWQpIDwtIHJlYWRNZXNzYWdlQmVnaW4gaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY18gaGFuZGxlciAoaXByb3Qsb3Byb3QpIChuYW1lLHR5cCxzZXFpZCkiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIHN0cmluZyBmdW5uYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2Vzc18iIDw8IGZ1bm5hbWUgPDwgIiAoc2VxaWQsIGlwcm90LCBvcHJvdCwgaGFuZGxlcikgPSBkbyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImFyZ3MgPC0gcmVhZF8iIDw8IGFyZ3NuYW1lIDw8ICIgaXByb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmVhZE1lc3NhZ2VFbmQgaXByb3QiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0KLSAgc2l6ZV90IG4gPSB4Y2VwdGlvbnMuc2l6ZSgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQotICAgICAgbisrOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJycyA8LSByZXR1cm4gKCIgPDwgcmVzdWx0bmFtZTsKLQotICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICBmX3NlcnZpY2VfIDw8ICIgTm90aGluZyI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXMgPC0gIjsKLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgeGNlcHRpb25zLnNpemUoKTsgaSsrKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIoQ29udHJvbC5FeGNlcHRpb24uY2F0Y2giIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKTsKLSAgICB9Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8ICIoZG8iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXMgPC0gIjsKLQotICBmX3NlcnZpY2VfIDw8ICJJZmFjZS4iIDw8IGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpIDw8ICIgaGFuZGxlciI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQotICAgIGZfc2VydmljZV8gPDwgICIgKGZfIiA8PCBhcmdzbmFtZSA8PCAgIl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGFyZ3MpIjsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJze2ZfIiA8PCByZXN1bHRuYW1lIDw8ICJfc3VjY2Vzcz0gSnVzdCByZXN9IjsKLQotICB9IGVsc2UgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJzIjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwICYmICF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKFxcZSAgLT4gIiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiByc3tmXyIgPDwgcmVzdWx0bmFtZSA8PCAiXyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPUp1c3QgZX0iOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAoKSI7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikpIiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiAoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfICkgPDwgIndyaXRlTWVzc2FnZUJlZ2luIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgTV9SRVBMWSwgc2VxaWQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8gKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXyApIDw8ICJ3cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfICkgPDwgInRGbHVzaCAoZ2V0VHJhbnNwb3J0IG9wcm90KSIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBpbmRlbnRfZG93bigpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgcHJlZml4OwotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LHR5cGUpOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKQotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFIjsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0KLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3QiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5IiA6ICJyZWFkU3RyaW5nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgInJlYWRCb29sIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIG91dCA8PCAicmVhZEJ5dGUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBvdXQgPDwgInJlYWRJMTYiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBvdXQgPDwgInJlYWRJMzIiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgInJlYWRJNjQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBvdXQgPDwgInJlYWREb3VibGUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gICAgb3V0IDw8ICIgaXByb3QiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGVuYW1lID0gY2FwaXRhbGl6ZSh0eXBlLT5nZXRfbmFtZSgpKTsKLSAgICBvdXQgPDwgIihkbyB7aSA8LSByZWFkSTMyIGlwcm90OyByZXR1cm4gJCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgaX0pIjsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKLSAgb3V0IDw8ICIocmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBzaXplID0gdG1wKCJfc2l6ZSIpOwotICBzdHJpbmcga3R5cGUgPSB0bXAoIl9rdHlwZSIpOwotICBzdHJpbmcgdnR5cGUgPSB0bXAoIl92dHlwZSIpOwotICBzdHJpbmcgZXR5cGUgPSB0bXAoIl9ldHlwZSIpOwotICBzdHJpbmcgY29uID0gdG1wKCJfY29uIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PCAiKGxldCB7ZiAwID0gcmV0dXJuIFtdOyBmIG4gPSBkbyB7ayA8LSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotCi0gICAgb3V0IDw8ICI7IHYgPC0gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLQotICAgIG91dCA8PCAiO3IgPC0gZiAobi0xKTsgcmV0dXJuICQgKGssdik6cn19IGluIGRvIHsoIiA8PCBrdHlwZSA8PCAiLCIgPDwgdnR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPC0gcmVhZE1hcEJlZ2luIGlwcm90OyBsIDwtIGYgIiA8PCBzaXplIDw8ICI7IHJldHVybiAkIE1hcC5mcm9tTGlzdCBsfSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8ICIobGV0IHtmIDAgPSByZXR1cm4gW107IGYgbiA9IGRvIHt2IDwtICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSk7Ci0gICAgb3V0IDw8ICI7ciA8LSBmIChuLTEpOyByZXR1cm4gJCB2OnJ9fSBpbiBkbyB7KCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPC0gcmVhZFNldEJlZ2luIGlwcm90OyBsIDwtIGYgIiA8PCBzaXplIDw8ICI7IHJldHVybiAkIFNldC5mcm9tTGlzdCBsfSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG91dCA8PCAiKGxldCBmIG4gPSBWZWN0b3IucmVwbGljYXRlTSAoZnJvbUludGVncmFsIG4pICgiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIG91dCA8PCAiKSBpbiBkbyB7KCIgPDwgZXR5cGUgPDwgIiwiIDw8IHNpemUgPDwgIikgPC0gcmVhZExpc3RCZWdpbiBpcHJvdDsgZiAiIDw8IHNpemUgPDwgIn0pIjsKLSAgfQotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpCi0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmIChuYW1lLmxlbmd0aCgpID09IDApCi0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsICh0X3N0cnVjdCopdHlwZSwgbmFtZSk7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJ3cml0ZUJpbmFyeSIgOiAid3JpdGVTdHJpbmciKSA8PCAiIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2wgb3Byb3QgIiA8PCBuYW1lOwotICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2IG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0IG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlIG9wcm90ICIgPDwgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gaHMgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyIG9wcm90IChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCwgIndyaXRlXyIpIDw8ICIgb3Byb3QgIiA8PCBwcmVmaXg7Ci19Ci0KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGsgPSB0bXAoIl9raXRlciIpOwotICAgIHN0cmluZyB2ID0gdG1wKCJfdml0ZXIiKTsKLSAgICBvdXQgPDwgIihsZXQge2YgW10gPSByZXR1cm4gKCk7IGYgKCgiIDw8IGsgPDwgIiwiIDw8IHYgPDwgIik6dCkgPSBkbyB7IjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBrLCB2KTsKLSAgICBvdXQgPDwgIjtmIHR9fSBpbiBkbyB7d3JpdGVNYXBCZWdpbiBvcHJvdCAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLGZyb21JbnRlZ3JhbCAkIE1hcC5zaXplICIgPDwgcHJlZml4IDw8ICIpOyBmIChNYXAudG9MaXN0ICIgPDwgcHJlZml4IDw8ICIpO3dyaXRlTWFwRW5kIG9wcm90fSkiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCB7ZiBbXSA9IHJldHVybiAoKTsgZiAoIiA8PCB2IDw8ICI6dCkgPSBkbyB7IjsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCB2KTsKLSAgICBvdXQgPDwgIjtmIHR9fSBpbiBkbyB7d3JpdGVTZXRCZWdpbiBvcHJvdCAoIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsZnJvbUludGVncmFsICQgU2V0LnNpemUgIiA8PCBwcmVmaXggPDwgIik7IGYgKFNldC50b0xpc3QgIiA8PCBwcmVmaXggPDwgIik7d3JpdGVTZXRFbmQgb3Byb3R9KSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIHYgPSB0bXAoIl92aXRlciIpOwotICAgIG91dCA8PCAiKGxldCBmID0gVmVjdG9yLm1hcE1fIChcXCIgPDwgdiA8PCAiIC0+ICI7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCB2KTsKLSAgICBvdXQgPDwgIikgaW4gZG8ge3dyaXRlTGlzdEJlZ2luIG9wcm90ICgiIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsZnJvbUludGVncmFsICQgVmVjdG9yLmxlbmd0aCAiIDw8IHByZWZpeCA8PCAiKTsgZiAiIDw8IHByZWZpeCA8PCAiO3dyaXRlTGlzdEVuZCBvcHJvdH0pIjsKLSAgfQotCi19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgb3V0IDw8ICJkbyB7IjsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0gIG91dCA8PCAiOyI7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci0gIG91dCA8PCAifSI7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi1zdHJpbmcgdF9oc19nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgb3B0aW9ucywgYm9vbCBpbywgYm9vbCBtZXRob2QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKG9wdGlvbnMpIHJlc3VsdCArPSAiTWF5YmUgIjsKLSAgICByZXN1bHQgKz0gcmVuZGVyX2hzX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCBvcHRpb25zKTsKLSAgICByZXN1bHQgKz0gIiAtPiAiOwotICB9Ci0KLSAgaWYgKGZpZWxkcy5lbXB0eSgpICYmICFtZXRob2QpCi0gICAgcmVzdWx0ICs9ICIoKSAtPiAiOwotCi0gIGlmIChpbykKLSAgICByZXN1bHQgKz0gIklPICI7Ci0KLSAgcmVzdWx0ICs9IHJlbmRlcl9oc190eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBpbyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgc3RyaW5nIGZ1bmN0aW9uX3ByZWZpeCkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotCi0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpCi0gICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl9UeXBlcy4iOwotCi0gIHJldHVybiBwcmVmaXggKyBmdW5jdGlvbl9wcmVmaXggKyBjYXBpdGFsaXplKHR0eXBlLT5nZXRfbmFtZSgpKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X2hzX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDogICByZXR1cm4gIlRfVk9JRCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IHJldHVybiAiVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDogICByZXR1cm4gIlRfQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOiAgIHJldHVybiAiVF9CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjogICAgcmV0dXJuICJUX0kxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6ICAgIHJldHVybiAiVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OiAgICByZXR1cm4gIlRfSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRTogcmV0dXJuICJUX0RPVUJMRSI7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUX0kzMiI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUX1NUUlVDVCI7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVF9NQVAiOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRfU0VUIjsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVF9MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhbiBoYXNrZWxsIHR5cGUKLSAqLwotc3RyaW5nIHRfaHNfZ2VuZXJhdG9yOjpyZW5kZXJfaHNfdHlwZSh0X3R5cGUqIHR5cGUsIGJvb2wgbmVlZHNfcGFyZW5zKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdHJpbmcgdHlwZV9yZXByOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOiAgIHJldHVybiAiKCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOiByZXR1cm4gKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJCeXRlU3RyaW5nIiA6ICJUZXh0Iik7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOiAgIHJldHVybiAiQm9vbCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOiAgIHJldHVybiAiSW50OCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6ICAgIHJldHVybiAiSW50MTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOiAgICByZXR1cm4gIkludDMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDogICAgcmV0dXJuICJJbnQ2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6IHJldHVybiAiRG91YmxlIjsKLSAgICB9Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKLQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIHR5cGVfcmVwciA9ICJNYXAuSGFzaE1hcCAiICsgcmVuZGVyX2hzX3R5cGUoa3R5cGUsIHRydWUpICsgIiAiICsgcmVuZGVyX2hzX3R5cGUodnR5cGUsIHRydWUpOwotCi0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB0eXBlX3JlcHIgPSAiU2V0Lkhhc2hTZXQgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKSA7Ci0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgdHlwZV9yZXByID0gIlZlY3Rvci5WZWN0b3IgIiArIHJlbmRlcl9oc190eXBlKGV0eXBlLCB0cnVlKTsKLQotICB9IGVsc2UgewotICAgIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHJldHVybiBuZWVkc19wYXJlbnMgPyAiKCIgKyB0eXBlX3JlcHIgKyAiKSIgOiB0eXBlX3JlcHI7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoaHMsICJIYXNrZWxsIiwgIiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNzJhYjQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAidF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJ0X2h0bWxfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBIVE1MIGNvZGUgZ2VuZXJhdG9yCi0gKgotICogbW9zdGx5IGNvcHkvcGFzdGluZy90d2Vha2luZyBmcm9tIG1jc2xlZSdzIHdvcmsuCi0gKi8KLWNsYXNzIHRfaHRtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9odG1sX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOyAgCi0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4taHRtbCI7Ci0gICAgZXNjYXBlXy5jbGVhcigpOwotICAgIGVzY2FwZV9bJyYnXSAgPSAiJmFtcDsiOwotICAgIGVzY2FwZV9bJzwnXSAgPSAiJmx0OyI7Ci0gICAgZXNjYXBlX1snPiddICA9ICImZ3Q7IjsKLSAgICBlc2NhcGVfWyciJ10gID0gIiZxdW90OyI7Ci0gICAgZXNjYXBlX1snXCcnXSA9ICImYXBvczsiOwotICB9Ci0KLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtKCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3codF9wcm9ncmFtKiB0cHJvZyk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93cyh0X3Byb2dyYW0qIHRwcm9nLAotICAgICAgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGZpbmlzaGVkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pbmRleCgpOwotICB2b2lkIGdlbmVyYXRlX2NzcygpOwotCi0gIC8qKgotICAgKiBQcm9ncmFtLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZiAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICh0X2NvbnN0KiAgICB0Y29uc3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotCi0gIHZvaWQgcHJpbnRfZG9jICAgICAgICAodF9kb2MqIHRkb2MpOwotICBpbnQgIHByaW50X3R5cGUgICAgICAgKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7Ci0gIHZvaWQgcHJpbnRfZm5fYXJnc19kb2ModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICBzdGQ6Om9mc3RyZWFtIGZfb3V0XzsKLX07Ci0KLS8qKgotICogRW1pdHMgdGhlIFRhYmxlIG9mIENvbnRlbnRzIGxpbmtzIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZSdzIHBhZ2UKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvYygpIHsKLSAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPjx0aGVhZD48dGg+TW9kdWxlPC90aD48dGg+U2VydmljZXM8L3RoPiIKLSAgIDw8ICI8dGg+RGF0YSB0eXBlczwvdGg+PHRoPkNvbnN0YW50czwvdGg+PC90aGVhZD4iIDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyhwcm9ncmFtXyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBSZWN1cnNlcyB0aHJvdWdoIGZyb20gdGhlIHByb3ZpZGVkIHByb2dyYW0gYW5kIGdlbmVyYXRlcyBhIFRvQyByb3cKLSAqIGZvciBlYWNoIGRpc2NvdmVyZWQgcHJvZ3JhbSBleGFjdGx5IG9uY2UgYnkgbWFpbnRhaW5pbmcgdGhlIGxpc3Qgb2YKLSAqIGNvbXBsZXRlZCByb3dzIGluICdmaW5pc2hlZCcKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHRfcHJvZ3JhbSogdHByb2csCi0gICAgICAgICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiYgZmluaXNoZWQpIHsKLSAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBmaW5pc2hlZC5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZmluaXNoZWQuZW5kKCk7IGl0ZXIrKykgewotICAgIGlmICh0cHJvZy0+Z2V0X3BhdGgoKSA9PSAoKml0ZXIpLT5nZXRfcGF0aCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGZpbmlzaGVkLnB1c2hfYmFjayh0cHJvZyk7Ci0gIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvdyh0cHJvZyk7Ci0gIHZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlcyA9IHRwcm9nLT5nZXRfaW5jbHVkZXMoKTsKLSAgZm9yICh2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7IGl0ZXIrKykgewotICAgIGdlbmVyYXRlX3Byb2dyYW1fdG9jX3Jvd3MoKml0ZXIsIGZpbmlzaGVkKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIHRoZSBUYWJsZSBvZiBDb250ZW50cyBsaW5rcyBhdCB0aGUgdG9wIG9mIHRoZSBtb2R1bGUncyBwYWdlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV90b2Nfcm93KHRfcHJvZ3JhbSogdHByb2cpIHsKLSAgc3RyaW5nIGZuYW1lID0gdHByb2ctPmdldF9uYW1lKCkgKyAiLmh0bWwiOwotICBmX291dF8gPDwgIjx0cj4iIDw8IGVuZGwgPDwgIjx0ZD4iIDw8IHRwcm9nLT5nZXRfbmFtZSgpIDw8ICI8L3RkPjx0ZD4iOwotICBpZiAoIXRwcm9nLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gdHByb2ctPmdldF9zZXJ2aWNlcygpOwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgICBmb3IgKHN2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyBzdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3N2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjU3ZjXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAgIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBmX291dF8gPDwgIjx1bD4iIDw8IGVuZGw7Ci0gICAgICBtYXA8c3RyaW5nLHN0cmluZz4gZm5faHRtbDsKLSAgICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gKCpzdl9pdGVyKS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKLSAgICAgIGZvciAoZm5faXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmbl9pdGVyKSB7Ci0gICAgICAgIHN0cmluZyBmbl9uYW1lID0gKCpmbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgc3RyaW5nIGh0bWwgPSAiPGxpPjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0ZuXyIgKyBuYW1lICsgIl8iICsKLSAgICAgICAgICBmbl9uYW1lICsgIlwiPiIgKyBmbl9uYW1lICsgIjwvYT48L2xpPiI7Ci0gICAgICAgIGZuX2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4oZm5fbmFtZSwgaHRtbCkpOwotICAgICAgfQotICAgICAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGh0bWxfaXRlciA9IGZuX2h0bWwuYmVnaW4oKTsKLSAgICAgICAgaHRtbF9pdGVyICE9IGZuX2h0bWwuZW5kKCk7IGh0bWxfaXRlcisrKSB7Ci0gICAgICAgIGZfb3V0XyA8PCBodG1sX2l0ZXItPnNlY29uZCA8PCBlbmRsOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICI8L3VsPiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RkPiIgPDwgZW5kbCA8PCAiPHRkPiI7Ci0gIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhX3R5cGVzOwotICBpZiAoIXRwcm9nLT5nZXRfZW51bXMoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gdHByb2ctPmdldF9lbnVtcygpOwotICAgIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgICBmb3IgKGVuX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlbl9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VuX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCplbl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIC8vIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgZm5hbWUgPDwgIiNFbnVtXyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLyA8PCAgIjwvYT48YnIvPiIgPDwgZW5kbDsKLSAgICAgIHN0cmluZyBodG1sID0gIjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0VudW1fIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotICAgICAgICAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCF0cHJvZy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmcyA9IHRwcm9nLT5nZXRfdHlwZWRlZnMoKTsKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj46Oml0ZXJhdG9yIHRkX2l0ZXI7Ci0gICAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbmFtZSA9ICgqdGRfaXRlciktPmdldF9zeW1ib2xpYygpOwotICAgICAgLy8gZl9vdXRfIDw8ICI8YSBocmVmPVwiIiA8PCBmbmFtZSA8PCAiI1R5cGVkZWZfIiA8PCBuYW1lIDw8ICJcIj4iIDw8IG5hbWUKLSAgICAgIC8vIDw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIGZuYW1lICsgIiNUeXBlZGVmXyIgKyBuYW1lICsgIlwiPiIgKyBuYW1lICsKLSAgICAgICAgIjwvYT4iOwotICAgICAgZGF0YV90eXBlcy5pbnNlcnQocGFpcjxzdHJpbmcsc3RyaW5nPihuYW1lLCBodG1sKSk7Ci0gICAgfQotICB9Ci0gIGlmICghdHByb2ctPmdldF9vYmplY3RzKCkuZW1wdHkoKSkgewotICAgIHZlY3Rvcjx0X3N0cnVjdCo+IG9iamVjdHMgPSB0cHJvZy0+Z2V0X29iamVjdHMoKTsKLSAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6aXRlcmF0b3Igb19pdGVyOwotICAgIGZvciAob19pdGVyID0gb2JqZWN0cy5iZWdpbigpOyBvX2l0ZXIgIT0gb2JqZWN0cy5lbmQoKTsgKytvX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpvX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgLy9mX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IGZuYW1lIDw8ICIjU3RydWN0XyIgPDwgbmFtZSA8PCAiXCI+IiA8PCBuYW1lCi0gICAgICAvLzw8ICI8L2E+PGJyLz4iIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgaHRtbCA9ICI8YSBocmVmPVwiIiArIGZuYW1lICsgIiNTdHJ1Y3RfIiArIG5hbWUgKyAiXCI+IiArIG5hbWUgKwotICAgICAgICAiPC9hPiI7Ci0gICAgICBkYXRhX3R5cGVzLmluc2VydChwYWlyPHN0cmluZyxzdHJpbmc+KG5hbWUsIGh0bWwpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChtYXA8c3RyaW5nLHN0cmluZz46Oml0ZXJhdG9yIGR0X2l0ZXIgPSBkYXRhX3R5cGVzLmJlZ2luKCk7Ci0gICAgICAgZHRfaXRlciAhPSBkYXRhX3R5cGVzLmVuZCgpOyBkdF9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgZHRfaXRlci0+c2Vjb25kIDw8ICI8YnIvPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGQ+IiA8PCBlbmRsIDw8ICI8dGQ+IjsKLSAgaWYgKCF0cHJvZy0+Z2V0X2NvbnN0cygpLmVtcHR5KCkpIHsKLSAgICBtYXA8c3RyaW5nLHN0cmluZz4gY29uc3RfaHRtbDsKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHRwcm9nLT5nZXRfY29uc3RzKCk7Ci0gICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY29uX2l0ZXI7Ci0gICAgZm9yIChjb25faXRlciA9IGNvbnN0cy5iZWdpbigpOyBjb25faXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY29uX2l0ZXIpIHsKLSAgICAgIHN0cmluZyBuYW1lID0gKCpjb25faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICBzdHJpbmcgaHRtbCA9Ijxjb2RlPjxhIGhyZWY9XCIiICsgZm5hbWUgKyAiI0NvbnN0XyIgKyBuYW1lICsKLSAgICAgICAgIlwiPiIgKyBuYW1lICsgIjwvYT48L2NvZGU+IjsKLSAgICAgIGNvbnN0X2h0bWwuaW5zZXJ0KHBhaXI8c3RyaW5nLHN0cmluZz4obmFtZSwgaHRtbCkpOwotICAgIH0KLSAgICBmb3IgKG1hcDxzdHJpbmcsc3RyaW5nPjo6aXRlcmF0b3IgY29uX2l0ZXIgPSBjb25zdF9odG1sLmJlZ2luKCk7Ci0gICBjb25faXRlciAhPSBjb25zdF9odG1sLmVuZCgpOyBjb25faXRlcisrKSB7Ci0gICAgICBmX291dF8gPDwgY29uX2l0ZXItPnNlY29uZCA8PCAiPGJyLz4iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+IiA8PCBlbmRsIDw8ICI8L3RyPiI7Ci19Ci0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbS4KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgc3RyaW5nIGZuYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIi5odG1sIjsKLSAgZl9vdXRfLm9wZW4oZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU5cIiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICIgICAgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8aGVhZD4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOFwiIC8+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICI8dGl0bGU+VGhyaWZ0IG1vZHVsZTogIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKQotICAgPDwgIjwvdGl0bGU+PC9oZWFkPjxib2R5PiIgPDwgZW5kbAotICAgPDwgIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4iIDw8IGVuZGwKLSAgIDw8ICI8aDE+VGhyaWZ0IG1vZHVsZTogIgotICAgPDwgcHJvZ3JhbV8tPmdldF9uYW1lKCkgPDwgIjwvaDE+IiA8PCBlbmRsOwotCi0gIHByaW50X2RvYyhwcm9ncmFtXyk7Ci0KLSAgZ2VuZXJhdGVfcHJvZ3JhbV90b2MoKTsKLQotICBpZiAoIXByb2dyYW1fLT5nZXRfY29uc3RzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJDb25zdGFudHNcIj5Db25zdGFudHM8L2gyPiIgPDwgZW5kbDsKLSAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyA9IHByb2dyYW1fLT5nZXRfY29uc3RzKCk7Ci0gICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7Ci0gICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPkNvbnN0YW50PC90aD48dGg+VHlwZTwvdGg+PHRoPlZhbHVlPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9jb25zdHMoY29uc3RzKTsKLSAgICBmX291dF8gPDwgIjwvdGFibGU+IjsKLSAgfQotCi0gIGlmICghcHJvZ3JhbV8tPmdldF9lbnVtcygpLmVtcHR5KCkpIHsKLSAgICBmX291dF8gPDwgIjxoci8+PGgyIGlkPVwiRW51bWVyYXRpb25zXCI+RW51bWVyYXRpb25zPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgZW51bXMKLSAgICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gICAgdmVjdG9yPHRfZW51bSo+OjppdGVyYXRvciBlbl9pdGVyOwotICAgIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkuZW1wdHkoKSkgewotICAgIGZfb3V0XyA8PCAiPGhyLz48aDIgaWQ9XCJUeXBlZGVmc1wiPlR5cGUgZGVjbGFyYXRpb25zPC9oMj4iIDw8IGVuZGw7Ci0gICAgLy8gR2VuZXJhdGUgdHlwZWRlZnMKLSAgICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gICAgdmVjdG9yPHRfdHlwZWRlZio+OjppdGVyYXRvciB0ZF9pdGVyOwotICAgIGZvciAodGRfaXRlciA9IHR5cGVkZWZzLmJlZ2luKCk7IHRkX2l0ZXIgIT0gdHlwZWRlZnMuZW5kKCk7ICsrdGRfaXRlcikgewotICAgICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwcm9ncmFtXy0+Z2V0X29iamVjdHMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlN0cnVjdHNcIj5EYXRhIHN0cnVjdHVyZXM8L2gyPiIgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzIGFuZCBleGNlcHRpb25zIGluIGRlY2xhcmVkIG9yZGVyCi0gICAgdmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0cyA9IHByb2dyYW1fLT5nZXRfb2JqZWN0cygpOwotICAgIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciBvX2l0ZXI7Ci0gICAgZm9yIChvX2l0ZXIgPSBvYmplY3RzLmJlZ2luKCk7IG9faXRlciAhPSBvYmplY3RzLmVuZCgpOyArK29faXRlcikgewotICAgICAgaWYgKCgqb19pdGVyKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICBnZW5lcmF0ZV94Y2VwdGlvbigqb19pdGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdlbmVyYXRlX3N0cnVjdCgqb19pdGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoIXByb2dyYW1fLT5nZXRfc2VydmljZXMoKS5lbXB0eSgpKSB7Ci0gICAgZl9vdXRfIDw8ICI8aHIvPjxoMiBpZD1cIlNlcnZpY2VzXCI+U2VydmljZXM8L2gyPiIgPDwgZW5kbDsKLSAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICAgIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gICAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgICBzZXJ2aWNlX25hbWVfID0gZ2V0X3NlcnZpY2VfbmFtZSgqc3ZfaXRlcik7Ci0gICAgICBnZW5lcmF0ZV9zZXJ2aWNlKCpzdl9pdGVyKTsKLSAgICB9Ci0gIH0KLQotICBmX291dF8gPDwgIjwvZGl2PjwvYm9keT48L2h0bWw+IiA8PCBlbmRsOwotICBmX291dF8uY2xvc2UoKTsKLQotICBnZW5lcmF0ZV9pbmRleCgpOwotICBnZW5lcmF0ZV9jc3MoKTsKLX0KLQotLyoqCi0gKiBFbWl0cyB0aGUgaW5kZXguaHRtbCBmaWxlIGZvciB0aGUgcmVjdXJzaXZlIHNldCBvZiBUaHJpZnQgcHJvZ3JhbXMKLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pbmRleCgpIHsKLSAgc3RyaW5nIGluZGV4X2ZuYW1lID0gZ2V0X291dF9kaXIoKSArICJpbmRleC5odG1sIjsKLSAgZl9vdXRfLm9wZW4oaW5kZXhfZm5hbWUuY19zdHIoKSk7Ci0gIGZfb3V0XyA8PCAiPGh0bWw+PGhlYWQ+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxsaW5rIGhyZWY9XCJzdHlsZS5jc3NcIiByZWw9XCJzdHlsZXNoZWV0XCIgdHlwZT1cInRleHQvY3NzXCIvPiIKLSAgIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPHRpdGxlPkFsbCBUaHJpZnQgZGVjbGFyYXRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+IgotICAgPDwgZW5kbCA8PCAiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiIKLSAgIDw8IGVuZGwgPDwgIjxoMT5BbGwgVGhyaWZ0IGRlY2xhcmF0aW9uczwvaDE+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+PHRoZWFkPjx0aD5Nb2R1bGU8L3RoPjx0aD5TZXJ2aWNlczwvdGg+PHRoPkRhdGEgdHlwZXM8L3RoPiIKLSAgIDw8ICI8dGg+Q29uc3RhbnRzPC90aD48L3RoZWFkPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+IHByb2dyYW1zOwotICBnZW5lcmF0ZV9wcm9ncmFtX3RvY19yb3dzKHByb2dyYW1fLCBwcm9ncmFtcyk7Ci0gIGZfb3V0XyA8PCAiPC90YWJsZT4iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+PC9ib2R5PjwvaHRtbD4iIDw8IGVuZGw7Ci0gIGZfb3V0Xy5jbG9zZSgpOwotfQotCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzcygpIHsKLSAgc3RyaW5nIGNzc19mbmFtZSA9IGdldF9vdXRfZGlyKCkgKyAic3R5bGUuY3NzIjsKLSAgZl9vdXRfLm9wZW4oY3NzX2ZuYW1lLmNfc3RyKCkpOwotICBmX291dF8gPDwgQk9PVFNUUkFQX0NTUygpIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiLyogQXV0by1nZW5lcmF0ZWQgQ1NTIGZvciBnZW5lcmF0ZWQgVGhyaWZ0IGRvY3MgKi8iIDw8IGVuZGw7Ci0gIGZfb3V0XyA8PCAiaDMsIGg0IHsgbWFyZ2luLWJvdHRvbTogNnB4OyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwgImRpdi5kZWZpbml0aW9uIHsgYm9yZGVyOiAxcHggc29saWQgI0NDQzsgbWFyZ2luLWJvdHRvbTogMTBweDsgcGFkZGluZzogMTBweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJkaXYuZXh0ZW5kcyB7IG1hcmdpbjogLTAuNWVtIDAgMWVtIDVlbSB9IiA8PCBlbmRsOwotICBmX291dF8gPDwgInRkIHsgdmVydGljYWwtYWxpZ246IHRvcDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICJ0YWJsZSB7IGVtcHR5LWNlbGxzOiBzaG93OyB9IiA8PCBlbmRsOwotICBmX291dF8gPDwgImNvZGUgeyBsaW5lLWhlaWdodDogMjBweDsgfSIgPDwgZW5kbDsKLSAgZl9vdXRfIDw8ICIudGFibGUtYm9yZGVyZWQgdGgsIC50YWJsZS1ib3JkZXJlZCB0ZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjREREREREOyB9IiA8PCBlbmRsOwotICBmX291dF8uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBJZiB0aGUgcHJvdmlkZWQgZG9jdW1lbnRhYmxlIG9iamVjdCBoYXMgZG9jdW1lbnRhdGlvbiBhdHRhY2hlZCwgdGhpcwotICogd2lsbCBlbWl0IGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIEhUTUwgZm9ybWF0LgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2RvYyh0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgc3RyaW5nIGRvYyA9IHRkb2MtPmdldF9kb2MoKTsKLSAgICBzaXplX3QgaW5kZXg7Ci0gICAgd2hpbGUgKChpbmRleCA9IGRvYy5maW5kX2ZpcnN0X29mKCJcclxuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgaWYgKGluZGV4ID09IDApIHsKLSAgZl9vdXRfIDw8ICI8cC8+IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgZl9vdXRfIDw8IGRvYy5zdWJzdHIoMCwgaW5kZXgpIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoaW5kZXggKyAxIDwgZG9jLnNpemUoKSAmJiBkb2MuYXQoaW5kZXgpICE9IGRvYy5hdChpbmRleCArIDEpICYmCi0gICAgKGRvYy5hdChpbmRleCArIDEpID09ICdccicgfHwgZG9jLmF0KGluZGV4ICsgMSkgPT0gJ1xuJykpIHsKLSAgaW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIGRvYyA9IGRvYy5zdWJzdHIoaW5kZXggKyAxKTsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IGRvYyA8PCAiPGJyLz4iOwotICB9Ci19Ci0KLS8qKgotICogUHJpbnRzIG91dCB0aGUgcHJvdmlkZWQgdHlwZSBpbiBIVE1MCi0gKi8KLWludCB0X2h0bWxfZ2VuZXJhdG9yOjpwcmludF90eXBlKHRfdHlwZSogdHR5cGUpIHsKLSAgaW50IGxlbiA9IDA7Ci0gIGZfb3V0XyA8PCAiPGNvZGU+IjsKLSAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBmX291dF8gPDwgImxpc3QmbHQ7IjsKLSAgICAgIGxlbiA9IDYgKyBwcmludF90eXBlKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiZndDsiOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBmX291dF8gPDwgInNldCZsdDsiOwotICAgICAgbGVuID0gNSArIHByaW50X3R5cGUoKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZl9vdXRfIDw8ICJtYXAmbHQ7IjsKLSAgICAgIGxlbiA9IDUgKyBwcmludF90eXBlKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICBsZW4gKz0gcHJpbnRfdHlwZSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKTsKLSAgICAgIGZfb3V0XyA8PCAiJmd0OyI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGZfb3V0XyA8PCAoKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5pc19iaW5hcnkoKSA/ICJiaW5hcnkiIDogdHR5cGUtPmdldF9uYW1lKCkpOwotICAgIGxlbiA9IHR0eXBlLT5nZXRfbmFtZSgpLnNpemUoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgcHJvZ19uYW1lID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIHR5cGVfbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPGEgaHJlZj1cIiIgPDwgcHJvZ19uYW1lIDw8ICIuaHRtbCMiOwotICAgIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgICBmX291dF8gPDwgIlR5cGVkZWZfIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgZl9vdXRfIDw8ICJTdHJ1Y3RfIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIGZfb3V0XyA8PCAiRW51bV8iOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgZl9vdXRfIDw8ICJTdmNfIjsKLSAgICB9Ci0gICAgZl9vdXRfIDw8IHR5cGVfbmFtZSA8PCAiXCI+IjsKLSAgICBsZW4gPSB0eXBlX25hbWUuc2l6ZSgpOwotICAgIGlmICh0dHlwZS0+Z2V0X3Byb2dyYW0oKSAhPSBwcm9ncmFtXykgewotICAgICAgZl9vdXRfIDw8IHByb2dfbmFtZSA8PCAiLiI7Ci0gICAgICBsZW4gKz0gcHJvZ19uYW1lLnNpemUoKSArIDE7Ci0gICAgfQotICAgIGZfb3V0XyA8PCB0eXBlX25hbWUgPDwgIjwvYT4iOwotICB9Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPiI7Ci0gIHJldHVybiBsZW47Ci19Ci0KLS8qKgotICogUHJpbnRzIG91dCBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm92aWRlZCBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgewotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgc3dpdGNoICh0dmFsdWUtPmdldF90eXBlKCkpIHsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOgotICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgotICAgIGZfb3V0XyA8PCB0dmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICBicmVhazsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkc6Ci0gICAgZl9vdXRfIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodHZhbHVlKSA8PCAnIic7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgotICAgIHsKLSAgICAgIGZfb3V0XyA8PCAieyAiOwotICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbWFwX2l0ZXI7Ci0gICAgICBmb3IgKG1hcF9pdGVyID0gbWFwX2VsZW1zLmJlZ2luKCk7IG1hcF9pdGVyICE9IG1hcF9lbGVtcy5lbmQoKTsgbWFwX2l0ZXIrKykgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgZl9vdXRfIDw8ICIsICI7Ci0gICAgICAgIH0KLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUobWFwX2l0ZXItPmZpcnN0KTsKLSAgICAgICAgZl9vdXRfIDw8ICIgPSAiOwotICAgICAgICBwcmludF9jb25zdF92YWx1ZShtYXBfaXRlci0+c2Vjb25kKTsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiIH0iOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgotICAgIHsKLSAgICAgIGZfb3V0XyA8PCAieyAiOwotICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiBsaXN0X2VsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOzsKLSAgICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIGxpc3RfaXRlcjsKLSAgICAgIGZvciAobGlzdF9pdGVyID0gbGlzdF9lbGVtcy5iZWdpbigpOyBsaXN0X2l0ZXIgIT0gbGlzdF9lbGVtcy5lbmQoKTsgbGlzdF9pdGVyKyspIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKCpsaXN0X2l0ZXIpOwotICAgICAgfQotICAgICAgZl9vdXRfIDw8ICIgfSI7Ci0gICAgfQotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIGZfb3V0XyA8PCAiVU5LTk9XTiI7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotLyoqCi0gKiBQcmludHMgb3V0IGRvY3VtZW50YXRpb24gZm9yIGFyZ3VtZW50cy9leGNlcHRpb25zIG9mIGEgZnVuY3Rpb24sIGlmIGFueSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHN1cHBsaWVkLgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OnByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBib29sIGhhc19kb2NzID0gZmFsc2U7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gIGlmIChhcmdfaXRlciAhPSBhcmdzLmVuZCgpKSB7Ci0gICAgZm9yICggOyBhcmdfaXRlciAhPSBhcmdzLmVuZCgpOyBhcmdfaXRlcisrKSB7Ci0gICAgICBpZiAoKCphcmdfaXRlciktPmhhc19kb2MoKSAmJiAhKCphcmdfaXRlciktPmdldF9kb2MoKS5lbXB0eSgpKQotICAgICAgICBoYXNfZG9jcyA9IHRydWU7Ci0gICAgfQotICAgIGlmIChoYXNfZG9jcykgewotICAgICAgYXJnX2l0ZXIgPSBhcmdzLmJlZ2luKCk7Ci0gICAgICBmX291dF8gPDwgIjxici8+PGg0IGlkPVwiUGFyYW1ldGVyc18iIDw8IHNlcnZpY2VfbmFtZV8gPDwgIl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICA8PCAiXCI+UGFyYW1ldGVyczwvaDQ+IiA8PCBlbmRsOwotICAgICAgZl9vdXRfIDw8ICI8dGFibGUgY2xhc3M9XCJ0YWJsZS1ib3JkZXJlZCB0YWJsZS1zdHJpcGVkIHRhYmxlLWNvbmRlbnNlZFwiPiI7Ci0gICAgICBmX291dF8gPDwgIjx0aGVhZD48dGg+TmFtZTwvdGg+PHRoPkRlc2NyaXB0aW9uPC90aD48L3RoZWFkPiI7Ci0gICAgICBmb3IgKCA7IGFyZ19pdGVyICE9IGFyZ3MuZW5kKCk7IGFyZ19pdGVyKyspIHsKLSAgICAgICAgZl9vdXRfIDw8ICI8dHI+PHRkPiIgPDwgKCphcmdfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICAgICAgZl9vdXRfIDw8ICgqYXJnX2l0ZXIpLT5nZXRfZG9jKCk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOwotICAgIH0KLSAgfQotCi0gIGhhc19kb2NzID0gZmFsc2U7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj4gZXhjZXB0cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7Ci0gICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgaWYgKCgqZXhfaXRlciktPmhhc19kb2MoKSAmJiAhKCpleF9pdGVyKS0+Z2V0X2RvYygpLmVtcHR5KCkpCi0gICAgICAgIGhhc19kb2NzID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGhhc19kb2NzKSB7Ci0gICAgICBleF9pdGVyID0gZXhjZXB0cy5iZWdpbigpOwotICAgICAgZl9vdXRfIDw8ICI8YnIvPjxoNCBpZD1cIkV4Y2VwdGlvbnNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIlwiPkV4Y2VwdGlvbnM8L2g0PiIgPDwgZW5kbDsKLSAgICAgIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICAgICAgZl9vdXRfIDw8ICI8dGhlYWQ+PHRoPlR5cGU8L3RoPjx0aD5EZXNjcmlwdGlvbjwvdGg+PC90aGVhZD4iOwotICAgICAgZm9yICggOyBleF9pdGVyICE9IGV4Y2VwdHMuZW5kKCk7IGV4X2l0ZXIrKykgewotICAgICAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKmV4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpOwotICAgICAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgICAgIGZfb3V0XyA8PCAoKmV4X2l0ZXIpLT5nZXRfZG9jKCk7Ci0gICAgICAgIGZfb3V0XyA8PCAiPC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICAgIGZfb3V0XyA8PCAiPC90YWJsZT4iOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgc3RyaW5nIG5hbWUgPSB0dHlwZWRlZi0+Z2V0X25hbWUoKTsKLSAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZGVmaW5pdGlvblwiPiI7Ci0gIGZfb3V0XyA8PCAiPGgzIGlkPVwiVHlwZWRlZl8iIDw8IG5hbWUgPDwgIlwiPlR5cGVkZWY6ICIgPDwgbmFtZQotICAgPDwgIjwvaDM+IiA8PCBlbmRsOwotICBmX291dF8gPDwgIjxwPjxzdHJvbmc+QmFzZSB0eXBlOjwvc3Ryb25nPiZuYnNwOyI7Ci0gIHByaW50X3R5cGUodHR5cGVkZWYtPmdldF90eXBlKCkpOwotICBmX291dF8gPDwgIjwvcD4iIDw8IGVuZGw7Ci0gIHByaW50X2RvYyh0dHlwZWRlZik7Ci0gIGZfb3V0XyA8PCAiPC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBjb2RlIGZvciBhbiBlbnVtZXJhdGVkIHR5cGUuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICBzdHJpbmcgbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJFbnVtXyIgPDwgbmFtZSA8PCAiXCI+RW51bWVyYXRpb246ICIgPDwgbmFtZQotICAgPDwgIjwvaDM+IiA8PCBlbmRsOwotICBwcmludF9kb2ModGVudW0pOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gdmFsdWVzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciB2YWxfaXRlcjsKLSAgZl9vdXRfIDw8ICI8YnIvPjx0YWJsZSBjbGFzcz1cInRhYmxlLWJvcmRlcmVkIHRhYmxlLXN0cmlwZWQgdGFibGUtY29uZGVuc2VkXCI+IiA8PCBlbmRsOwotICBmb3IgKHZhbF9pdGVyID0gdmFsdWVzLmJlZ2luKCk7IHZhbF9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2YWxfaXRlcikgewotICAgIGZfb3V0XyA8PCAiPHRyPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvY29kZT48L3RkPjx0ZD48Y29kZT4iOwotICAgIGZfb3V0XyA8PCAoKnZhbF9pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl9vdXRfIDw8ICI8L2NvZGU+PC90ZD48L3RyPiIgPDwgZW5kbDsKLSAgfQotICBmX291dF8gPDwgIjwvdGFibGU+PC9kaXY+IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjx0ciBpZD1cIkNvbnN0XyIgPDwgbmFtZSA8PCAiXCI+PHRkPjxjb2RlPiIgPDwgbmFtZQotICAgPDwgIjwvY29kZT48L3RkPjx0ZD4iOwotICBwcmludF90eXBlKHRjb25zdC0+Z2V0X3R5cGUoKSk7Ci0gIGZfb3V0XyA8PCAiPC90ZD48dGQ+PGNvZGU+IjsKLSAgcHJpbnRfY29uc3RfdmFsdWUodGNvbnN0LT5nZXRfdmFsdWUoKSk7Ci0gIGZfb3V0XyA8PCAiPC9jb2RlPjwvdGQ+PC90cj4iOwotICBpZiAodGNvbnN0LT5oYXNfZG9jKCkpIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQgY29sc3Bhbj1cIjNcIj48YmxvY2txdW90ZT4iOwotICAgIHByaW50X2RvYyh0Y29uc3QpOwotICAgIGZfb3V0XyA8PCAiPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4iOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBmX291dF8gPDwgIjxkaXYgY2xhc3M9XCJkZWZpbml0aW9uXCI+IjsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdHJ1Y3RfIiA8PCBuYW1lIDw8ICJcIj4iOwotICBpZiAodHN0cnVjdC0+aXNfeGNlcHRpb24oKSkgewotICAgIGZfb3V0XyA8PCAiRXhjZXB0aW9uOiAiOwotICB9IGVsc2UgewotICAgIGZfb3V0XyA8PCAiU3RydWN0OiAiOwotICB9Ci0gIGZfb3V0XyA8PCBuYW1lIDw8ICI8L2gzPiIgPDwgZW5kbDsKLSAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0gIGZfb3V0XyA8PCAiPHRhYmxlIGNsYXNzPVwidGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1jb25kZW5zZWRcIj4iOwotICBmX291dF8gPDwgIjx0aGVhZD48dGg+S2V5PC90aD48dGg+RmllbGQ8L3RoPjx0aD5UeXBlPC90aD48dGg+RGVzY3JpcHRpb248L3RoPjx0aD5SZXF1aXJlZG5lc3M8L3RoPjx0aD5EZWZhdWx0IHZhbHVlPC90aD48L3RoZWFkPiIKLSAgICA8PCBlbmRsOwotICBmb3IgKCA7IG1lbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1lbV9pdGVyKyspIHsKLSAgICBmX291dF8gPDwgIjx0cj48dGQ+IiA8PCAoKm1lbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICI8L3RkPjx0ZD4iOwotICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICBmX291dF8gPDwgIjwvdGQ+PHRkPiI7Ci0gICAgcHJpbnRfdHlwZSgoKm1lbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgZl9vdXRfIDw8ICI8L3RkPjx0ZD4iOwotICAgIGZfb3V0XyA8PCAoKm1lbV9pdGVyKS0+Z2V0X2RvYygpOwotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICBpZiAoKCptZW1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBmX291dF8gPDwgIm9wdGlvbmFsIjsKLSAgICB9IGVsc2UgaWYgKCgqbWVtX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZl9vdXRfIDw8ICJyZXF1aXJlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PCAiZGVmYXVsdCI7Ci0gICAgfQotICAgIGZfb3V0XyA8PCAiPC90ZD48dGQ+IjsKLSAgICB0X2NvbnN0X3ZhbHVlKiBkZWZhdWx0X3ZhbCA9ICgqbWVtX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpZiAoZGVmYXVsdF92YWwgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUoZGVmYXVsdF92YWwpOwotICAgIH0KLSAgICBmX291dF8gPDwgIjwvdGQ+PC90cj4iIDw8IGVuZGw7Ci0gIH0KLSAgZl9vdXRfIDw8ICI8L3RhYmxlPjxici8+IjsKLSAgcHJpbnRfZG9jKHRzdHJ1Y3QpOwotICBmX291dF8gPDwgIjwvZGl2PiI7Ci19Ci0KLS8qKgotICogRXhjZXB0aW9ucyBhcmUgc3BlY2lhbCBzdHJ1Y3RzCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9odG1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9zdHJ1Y3QodHhjZXB0aW9uKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIEhUTUwgYmxvY2sgZm9yIGEgVGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2h0bWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9vdXRfIDw8ICI8aDMgaWQ9XCJTdmNfIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJcIj5TZXJ2aWNlOiAiCi0gICAgPDwgc2VydmljZV9uYW1lXyA8PCAiPC9oMz4iIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSB7Ci0gICAgZl9vdXRfIDw8ICI8ZGl2IGNsYXNzPVwiZXh0ZW5kc1wiPjxlbT5leHRlbmRzPC9lbT4gIjsKLSAgICBwcmludF90eXBlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBmX291dF8gPDwgIjwvZGl2PlxuIjsKLSAgfQotICBwcmludF9kb2ModHNlcnZpY2UpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsKLSAgZm9yICggOyBmbl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgZm5faXRlcisrKSB7Ci0gICAgc3RyaW5nIGZuX25hbWUgPSAoKmZuX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIGZfb3V0XyA8PCAiPGRpdiBjbGFzcz1cImRlZmluaXRpb25cIj4iOwotICAgIGZfb3V0XyA8PCAiPGg0IGlkPVwiRm5fIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJfIiA8PCBmbl9uYW1lCi0gICAgICA8PCAiXCI+RnVuY3Rpb246ICIgPDwgc2VydmljZV9uYW1lXyA8PCAiLiIgPDwgZm5fbmFtZQotICAgICAgPDwgIjwvaDQ+IiA8PCBlbmRsOwotICAgIGZfb3V0XyA8PCAiPHByZT4iOwotICAgIGludCBvZmZzZXQgPSBwcmludF90eXBlKCgqZm5faXRlciktPmdldF9yZXR1cm50eXBlKCkpOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZfb3V0XyA8PCAiICIgPDwgZm5fbmFtZSA8PCAiKCI7Ci0gICAgb2Zmc2V0ICs9IGZuX25hbWUuc2l6ZSgpICsgMjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+IGFyZ3MgPSAoKmZuX2l0ZXIpLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIGFyZ19pdGVyID0gYXJncy5iZWdpbigpOwotICAgIGZvciAoIDsgYXJnX2l0ZXIgIT0gYXJncy5lbmQoKTsgYXJnX2l0ZXIrKykgewotICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICBmX291dF8gPDwgIiwiIDw8IGVuZGw7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0OyArK2kpIHsKLSAgICAgICAgICBmX291dF8gPDwgIiAiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgcHJpbnRfdHlwZSgoKmFyZ19pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBmX291dF8gPDwgIiAiIDw8ICgqYXJnX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKCgqYXJnX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGZfb3V0XyA8PCAiID0gIjsKLSAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUoKCphcmdfaXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9vdXRfIDw8ICIpIiA8PCBlbmRsOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+IGV4Y2VwdHMgPSAoKmZuX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZXhfaXRlciA9IGV4Y2VwdHMuYmVnaW4oKTsKLSAgICBpZiAoZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpKSB7Ci0gICAgICBmX291dF8gPDwgIiAgICB0aHJvd3MgIjsKLSAgICAgIGZvciAoIDsgZXhfaXRlciAhPSBleGNlcHRzLmVuZCgpOyBleF9pdGVyKyspIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgIGZfb3V0XyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIHByaW50X3R5cGUoKCpleF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBmX291dF8gPDwgZW5kbDsKLSAgICB9Ci0gICAgZl9vdXRfIDw8ICI8L3ByZT4iOwotICAgIHByaW50X2RvYygqZm5faXRlcik7Ci0gICAgcHJpbnRfZm5fYXJnc19kb2MoKmZuX2l0ZXIpOwotICAgIGZfb3V0XyA8PCAiPC9kaXY+IjsKLSAgfQotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGh0bWwsICJIVE1MIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGVkZDMuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotI2RlZmluZSBCT09UU1RSQVBfQ1NTKCkgIi8qIVxuIlwKLSIgKiBCb290c3RyYXAgdjIuMC4zXG4iXAotIiAqXG4iXAotIiAqIENvcHlyaWdodCAyMDEyIFR3aXR0ZXIsIEluY1xuIlwKLSIgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgdjIuMFxuIlwKLSIgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiJcCi0iICpcbiJcCi0iICogRGVzaWduZWQgYW5kIGJ1aWx0IHdpdGggYWxsIHRoZSBsb3ZlIGluIHRoZSB3b3JsZCBAdHdpdHRlciBieSBAbWRvIGFuZCBAZmF0LlxuIlwKLSIgKi9cbiJcCi0iLmNsZWFyZml4eyp6b29tOjE7fS5jbGVhcmZpeDpiZWZvcmUsLmNsZWFyZml4OmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiJcCi0iLmNsZWFyZml4OmFmdGVye2NsZWFyOmJvdGg7fVxuIlwKLSIuaGlkZS10ZXh0e2ZvbnQ6MC8wIGE7Y29sb3I6dHJhbnNwYXJlbnQ7dGV4dC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowO31cbiJcCi0iLmlucHV0LWJsb2NrLWxldmVse2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjI4cHg7LXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1zLWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7fVxuIlwKLSJhcnRpY2xlLGFzaWRlLGRldGFpbHMsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGhlYWRlcixoZ3JvdXAsbmF2LHNlY3Rpb257ZGlzcGxheTpibG9jazt9XG4iXAotImF1ZGlvLGNhbnZhcyx2aWRlb3tkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7Knpvb206MTt9XG4iXAotImF1ZGlvOm5vdChbY29udHJvbHNdKXtkaXNwbGF5Om5vbmU7fVxuIlwKLSJodG1se2ZvbnQtc2l6ZToxMDAlOy13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlOy1tcy10ZXh0LXNpemUtYWRqdXN0OjEwMCU7fVxuIlwKLSJhOmZvY3Vze291dGxpbmU6dGhpbiBkb3R0ZWQgIzMzMztvdXRsaW5lOjVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjtvdXRsaW5lLW9mZnNldDotMnB4O31cbiJcCi0iYTpob3ZlcixhOmFjdGl2ZXtvdXRsaW5lOjA7fVxuIlwKLSJzdWIsc3Vwe3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZTo3NSU7bGluZS1oZWlnaHQ6MDt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt9XG4iXAotInN1cHt0b3A6LTAuNWVtO31cbiJcCi0ic3Vie2JvdHRvbTotMC4yNWVtO31cbiJcCi0iaW1ne21heC13aWR0aDoxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWM7fVxuIlwKLSJidXR0b24saW5wdXQsc2VsZWN0LHRleHRhcmVhe21hcmdpbjowO2ZvbnQtc2l6ZToxMDAlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt9XG4iXAotImJ1dHRvbixpbnB1dHsqb3ZlcmZsb3c6dmlzaWJsZTtsaW5lLWhlaWdodDpub3JtYWw7fVxuIlwKLSJidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXJ7cGFkZGluZzowO2JvcmRlcjowO31cbiJcCi0iYnV0dG9uLGlucHV0W3R5cGU9XCJidXR0b25cIl0saW5wdXRbdHlwZT1cInJlc2V0XCJdLGlucHV0W3R5cGU9XCJzdWJtaXRcIl17Y3Vyc29yOnBvaW50ZXI7LXdlYmtpdC1hcHBlYXJhbmNlOmJ1dHRvbjt9XG4iXAotImlucHV0W3R5cGU9XCJzZWFyY2hcIl17LXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7fVxuIlwKLSJpbnB1dFt0eXBlPVwic2VhcmNoXCJdOjotd2Via2l0LXNlYXJjaC1kZWNvcmF0aW9uLGlucHV0W3R5cGU9XCJzZWFyY2hcIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7fVxuIlwKLSJ0ZXh0YXJlYXtvdmVyZmxvdzphdXRvO3ZlcnRpY2FsLWFsaWduOnRvcDt9XG4iXAotImJvZHl7bWFyZ2luOjA7Zm9udC1mYW1pbHk6XCJIZWx2ZXRpY2EgTmV1ZVwiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjE4cHg7Y29sb3I6IzMzMzMzMztiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7fVxuIlwKLSJhe2NvbG9yOiMwMDg4Y2M7dGV4dC1kZWNvcmF0aW9uOm5vbmU7fVxuIlwKLSJhOmhvdmVye2NvbG9yOiMwMDU1ODA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9XG4iXAotIi5yb3d7bWFyZ2luLWxlZnQ6LTIwcHg7Knpvb206MTt9LnJvdzpiZWZvcmUsLnJvdzphZnRlcntkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9XG4iXAotIi5yb3c6YWZ0ZXJ7Y2xlYXI6Ym90aDt9XG4iXAotIltjbGFzcyo9XCJzcGFuXCJde2Zsb2F0OmxlZnQ7bWFyZ2luLWxlZnQ6MjBweDt9XG4iXAotIi5jb250YWluZXIsLm5hdmJhci1maXhlZC10b3AgLmNvbnRhaW5lciwubmF2YmFyLWZpeGVkLWJvdHRvbSAuY29udGFpbmVye3dpZHRoOjk0MHB4O31cbiJcCi0iLnNwYW4xMnt3aWR0aDo5NDBweDt9XG4iXAotIi5zcGFuMTF7d2lkdGg6ODYwcHg7fVxuIlwKLSIuc3BhbjEwe3dpZHRoOjc4MHB4O31cbiJcCi0iLnNwYW45e3dpZHRoOjcwMHB4O31cbiJcCi0iLnNwYW44e3dpZHRoOjYyMHB4O31cbiJcCi0iLnNwYW43e3dpZHRoOjU0MHB4O31cbiJcCi0iLnNwYW42e3dpZHRoOjQ2MHB4O31cbiJcCi0iLnNwYW41e3dpZHRoOjM4MHB4O31cbiJcCi0iLnNwYW40e3dpZHRoOjMwMHB4O31cbiJcCi0iLnNwYW4ze3dpZHRoOjIyMHB4O31cbiJcCi0iLnNwYW4ye3dpZHRoOjE0MHB4O31cbiJcCi0iLnNwYW4xe3dpZHRoOjYwcHg7fVxuIlwKLSIub2Zmc2V0MTJ7bWFyZ2luLWxlZnQ6OTgwcHg7fVxuIlwKLSIub2Zmc2V0MTF7bWFyZ2luLWxlZnQ6OTAwcHg7fVxuIlwKLSIub2Zmc2V0MTB7bWFyZ2luLWxlZnQ6ODIwcHg7fVxuIlwKLSIub2Zmc2V0OXttYXJnaW4tbGVmdDo3NDBweDt9XG4iXAotIi5vZmZzZXQ4e21hcmdpbi1sZWZ0OjY2MHB4O31cbiJcCi0iLm9mZnNldDd7bWFyZ2luLWxlZnQ6NTgwcHg7fVxuIlwKLSIub2Zmc2V0NnttYXJnaW4tbGVmdDo1MDBweDt9XG4iXAotIi5vZmZzZXQ1e21hcmdpbi1sZWZ0OjQyMHB4O31cbiJcCi0iLm9mZnNldDR7bWFyZ2luLWxlZnQ6MzQwcHg7fVxuIlwKLSIub2Zmc2V0M3ttYXJnaW4tbGVmdDoyNjBweDt9XG4iXAotIi5vZmZzZXQye21hcmdpbi1sZWZ0OjE4MHB4O31cbiJcCi0iLm9mZnNldDF7bWFyZ2luLWxlZnQ6MTAwcHg7fVxuIlwKLSIucm93LWZsdWlke3dpZHRoOjEwMCU7Knpvb206MTt9LnJvdy1mbHVpZDpiZWZvcmUsLnJvdy1mbHVpZDphZnRlcntkaXNwbGF5OnRhYmxlO2NvbnRlbnQ6XCJcIjt9XG4iXAotIi5yb3ctZmx1aWQ6YWZ0ZXJ7Y2xlYXI6Ym90aDt9XG4iXAotIi5yb3ctZmx1aWQgW2NsYXNzKj1cInNwYW5cIl17ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO21pbi1oZWlnaHQ6MjhweDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbXMtYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtmbG9hdDpsZWZ0O21hcmdpbi1sZWZ0OjIuMTI3NjU5NTc0JTsqbWFyZ2luLWxlZnQ6Mi4wNzQ0NjgwODQ2MzgyOTc3JTt9XG4iXAotIi5yb3ctZmx1aWQgW2NsYXNzKj1cInNwYW5cIl06Zmlyc3QtY2hpbGR7bWFyZ2luLWxlZnQ6MDt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xMnt3aWR0aDo5OS45OTk5OTk5ODk5OTk5OSU7KndpZHRoOjk5Ljk0NjgwODUwMDYzODI4JTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xMXt3aWR0aDo5MS40ODkzNjE2OTMlOyp3aWR0aDo5MS40MzYxNzAyMDM2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xMHt3aWR0aDo4Mi45Nzg3MjMzOTU5OTk5OSU7KndpZHRoOjgyLjkyNTUzMTkwNjYzODI4JTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW45e3dpZHRoOjc0LjQ2ODA4NTA5OSU7KndpZHRoOjc0LjQxNDg5MzYwOTYzODMlO31cbiJcCi0iLnJvdy1mbHVpZCAuc3Bhbjh7d2lkdGg6NjUuOTU3NDQ2ODAxOTk5OTklOyp3aWR0aDo2NS45MDQyNTUzMTI2MzgyOCU7fVxuIlwKLSIucm93LWZsdWlkIC5zcGFuN3t3aWR0aDo1Ny40NDY4MDg1MDUlOyp3aWR0aDo1Ny4zOTM2MTcwMTU2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW42e3dpZHRoOjQ4LjkzNjE3MDIwNzk5OTk5JTsqd2lkdGg6NDguODgyOTc4NzE4NjM4MjklO31cbiJcCi0iLnJvdy1mbHVpZCAuc3BhbjV7d2lkdGg6NDAuNDI1NTMxOTExJTsqd2lkdGg6NDAuMzcyMzQwNDIxNjM4MyU7fVxuIlwKLSIucm93LWZsdWlkIC5zcGFuNHt3aWR0aDozMS45MTQ4OTM2MTQlOyp3aWR0aDozMS44NjE3MDIxMjQ2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4ze3dpZHRoOjIzLjQwNDI1NTMxNyU7KndpZHRoOjIzLjM1MTA2MzgyNzYzODMlO31cbiJcCi0iLnJvdy1mbHVpZCAuc3BhbjJ7d2lkdGg6MTQuODkzNjE3MDIlOyp3aWR0aDoxNC44NDA0MjU1MzA2MzgzJTt9XG4iXAotIi5yb3ctZmx1aWQgLnNwYW4xe3dpZHRoOjYuMzgyOTc4NzIzJTsqd2lkdGg6Ni4zMjk3ODcyMzM2MzgyOTglO31cbiJcCi0iLmNvbnRhaW5lcnttYXJnaW4tcmlnaHQ6YXV0bzttYXJnaW4tbGVmdDphdXRvOyp6b29tOjE7fS5jb250YWluZXI6YmVmb3JlLC5jb250YWluZXI6YWZ0ZXJ7ZGlzcGxheTp0YWJsZTtjb250ZW50OlwiXCI7fVxuIlwKLSIuY29udGFpbmVyOmFmdGVye2NsZWFyOmJvdGg7fVxuIlwKLSIuY29udGFpbmVyLWZsdWlke3BhZGRpbmctcmlnaHQ6MjBweDtwYWRkaW5nLWxlZnQ6MjBweDsqem9vbToxO30uY29udGFpbmVyLWZsdWlkOmJlZm9yZSwuY29udGFpbmVyLWZsdWlkOmFmdGVye2Rpc3BsYXk6dGFibGU7Y29udGVudDpcIlwiO31cbiJcCi0iLmNvbnRhaW5lci1mbHVpZDphZnRlcntjbGVhcjpib3RoO31cbiJcCi0icHttYXJnaW46MCAwIDlweDtmb250LWZhbWlseTpcIkhlbHZldGljYSBOZXVlXCIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjEzcHg7bGluZS1oZWlnaHQ6MThweDt9cCBzbWFsbHtmb250LXNpemU6MTFweDtjb2xvcjojOTk5OTk5O31cbiJcCi0iLmxlYWR7bWFyZ2luLWJvdHRvbToxOHB4O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjIwMDtsaW5lLWhlaWdodDoyN3B4O31cbiJcCi0iaDEsaDIsaDMsaDQsaDUsaDZ7bWFyZ2luOjA7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXdlaWdodDpib2xkO2NvbG9yOmluaGVyaXQ7dGV4dC1yZW5kZXJpbmc6b3B0aW1pemVsZWdpYmlsaXR5O31oMSBzbWFsbCxoMiBzbWFsbCxoMyBzbWFsbCxoNCBzbWFsbCxoNSBzbWFsbCxoNiBzbWFsbHtmb250LXdlaWdodDpub3JtYWw7Y29sb3I6Izk5OTk5OTt9XG4iXAotImgxe2ZvbnQtc2l6ZTozMHB4O2xpbmUtaGVpZ2h0OjM2cHg7fWgxIHNtYWxse2ZvbnQtc2l6ZToxOHB4O31cbiJcCi0iaDJ7Zm9udC1zaXplOjI0cHg7bGluZS1oZWlnaHQ6MzZweDt9aDIgc21hbGx7Zm9udC1zaXplOjE4cHg7fVxuIlwKLSJoM3tmb250LXNpemU6MThweDtsaW5lLWhlaWdodDoyN3B4O31oMyBzbWFsbHtmb250LXNpemU6MTRweDt9XG4iXAotImg0LGg1LGg2e2xpbmUtaGVpZ2h0OjE4cHg7fVxuIlwKLSJoNHtmb250LXNpemU6MTRweDt9aDQgc21hbGx7Zm9udC1zaXplOjEycHg7fVxuIlwKLSJoNXtmb250LXNpemU6MTJweDt9XG4iXAotImg2e2ZvbnQtc2l6ZToxMXB4O2NvbG9yOiM5OTk5OTk7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO31cbiJcCi0iLnBhZ2UtaGVhZGVye3BhZGRpbmctYm90dG9tOjE3cHg7bWFyZ2luOjE4cHggMDtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWVlZWVlO31cbiJcCi0iLnBhZ2UtaGVhZGVyIGgxe2xpbmUtaGVpZ2h0OjE7fVxuIlwKLSJ1bCxvbHtwYWRkaW5nOjA7bWFyZ2luOjAgMCA5cHggMjVweDt9XG4iXAotInVsIHVsLHVsIG9sLG9sIG9sLG9sIHVse21hcmdpbi1ib3R0b206MDt9XG4iXAotInVse2xpc3Qtc3R5bGU6ZGlzYzt9XG4iXAotIm9se2xpc3Qtc3R5bGU6ZGVjaW1hbDt9XG4iXAotImxpe2xpbmUtaGVpZ2h0OjE4cHg7fVxuIlwKLSJ1bC51bnN0eWxlZCxvbC51bnN0eWxlZHttYXJnaW4tbGVmdDowO2xpc3Qtc3R5bGU6bm9uZTt9XG4iXAotImRse21hcmdpbi1ib3R0b206MThweDt9XG4iXAotImR0LGRke2xpbmUtaGVpZ2h0OjE4cHg7fVxuIlwKLSJkdHtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE3cHg7fVxuIlwKLSJkZHttYXJnaW4tbGVmdDo5cHg7fVxuIlwKLSIuZGwtaG9yaXpvbnRhbCBkdHtmbG9hdDpsZWZ0O3dpZHRoOjEyMHB4O2NsZWFyOmxlZnQ7dGV4dC1hbGlnbjpyaWdodDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXA7fVxuIlwKLSIuZGwtaG9yaXpvbnRhbCBkZHttYXJnaW4tbGVmdDoxMzBweDt9XG4iXAotImhye21hcmdpbjoxOHB4IDA7Ym9yZGVyOjA7Ym9yZGVyLXRvcDoxcHggc29saWQgI2VlZWVlZTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZmZmZmZmO31cbiJcCi0ic3Ryb25ne2ZvbnQtd2VpZ2h0OmJvbGQ7fVxuIlwKLSJlbXtmb250LXN0eWxlOml0YWxpYzt9XG4iXAotIi5tdXRlZHtjb2xvcjojOTk5OTk5O31cbiJcCi0iYWJiclt0aXRsZV17Y3Vyc29yOmhlbHA7Ym9yZGVyLWJvdHRvbToxcHggZG90dGVkICNkZGQ7fVxuIlwKLSJhYmJyLmluaXRpYWxpc217Zm9udC1zaXplOjkwJTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7fVxuIlwKLSJibG9ja3F1b3Rle3BhZGRpbmc6MCAwIDAgMTVweDttYXJnaW46MCAwIDE4cHg7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkICNlZWVlZWU7fWJsb2NrcXVvdGUgcHttYXJnaW4tYm90dG9tOjA7Zm9udC1zaXplOjE2cHg7Zm9udC13ZWlnaHQ6MzAwO2xpbmUtaGVpZ2h0OjIyLjVweDt9XG4iXAotImJsb2NrcXVvdGUgc21hbGx7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDoxOHB4O2NvbG9yOiM5OTk5OTk7fWJsb2NrcXVvdGUgc21hbGw6YmVmb3Jle2NvbnRlbnQ6J1xcMjAxNCBcXDAwQTAnO31cbiJcCi0iYmxvY2txdW90ZS5wdWxsLXJpZ2h0e2Zsb2F0OnJpZ2h0O3BhZGRpbmctcmlnaHQ6MTVweDtwYWRkaW5nLWxlZnQ6MDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkICNlZWVlZWU7Ym9yZGVyLWxlZnQ6MDt9YmxvY2txdW90ZS5wdWxsLXJpZ2h0IHAsYmxvY2txdW90ZS5wdWxsLXJpZ2h0IHNtYWxse3RleHQtYWxpZ246cmlnaHQ7fVxuIlwKLSJxOmJlZm9yZSxxOmFmdGVyLGJsb2NrcXVvdGU6YmVmb3JlLGJsb2NrcXVvdGU6YWZ0ZXJ7Y29udGVudDpcIlwiO31cbiJcCi0iYWRkcmVzc3tkaXNwbGF5OmJsb2NrO21hcmdpbi1ib3R0b206MThweDtmb250LXN0eWxlOm5vcm1hbDtsaW5lLWhlaWdodDoxOHB4O31cbiJcCi0ic21hbGx7Zm9udC1zaXplOjEwMCU7fVxuIlwKLSJjaXRle2ZvbnQtc3R5bGU6bm9ybWFsO31cbiJcCi0iY29kZSxwcmV7cGFkZGluZzowIDNweCAycHg7Zm9udC1mYW1pbHk6TWVubG8sTW9uYWNvLENvbnNvbGFzLFwiQ291cmllciBOZXdcIixtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7Y29sb3I6IzMzMzMzMzstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7fVxuIlwKLSJjb2Rle3BhZGRpbmc6MnB4IDRweDtjb2xvcjojZDE0O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmOTtib3JkZXI6MXB4IHNvbGlkICNlMWUxZTg7fVxuIlwKLSJwcmV7ZGlzcGxheTpibG9jaztwYWRkaW5nOjguNXB4O21hcmdpbjowIDAgOXB4O2ZvbnQtc2l6ZToxMi4wMjVweDtsaW5lLWhlaWdodDoxOHB4O3dvcmQtYnJlYWs6YnJlYWstYWxsO3dvcmQtd3JhcDpicmVhay13b3JkO3doaXRlLXNwYWNlOnByZTt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7Ym9yZGVyOjFweCBzb2xpZCAjY2NjO2JvcmRlcjoxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjE1KTstd2Via2l0LWJvcmRlci1yYWRpdXM6NHB4Oy1tb3otYm9yZGVyLXJhZGl1czo0cHg7Ym9yZGVyLXJhZGl1czo0cHg7fXByZS5wcmV0dHlwcmludHttYXJnaW4tYm90dG9tOjE4cHg7fVxuIlwKLSJwcmUgY29kZXtwYWRkaW5nOjA7Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjowO31cbiJcCi0iLnByZS1zY3JvbGxhYmxle21heC1oZWlnaHQ6MzQwcHg7b3ZlcmZsb3cteTpzY3JvbGw7fVxuIlwKLSIubGFiZWwsLmJhZGdle2ZvbnQtc2l6ZToxMC45OThweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjE0cHg7Y29sb3I6I2ZmZmZmZjt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1zaGFkb3c6MCAtMXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI1KTtiYWNrZ3JvdW5kLWNvbG9yOiM5OTk5OTk7fVxuIlwKLSIubGFiZWx7cGFkZGluZzoxcHggNHB4IDJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6M3B4Oy1tb3otYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7fVxuIlwKLSIuYmFkZ2V7cGFkZGluZzoxcHggOXB4IDJweDstd2Via2l0LWJvcmRlci1yYWRpdXM6OXB4Oy1tb3otYm9yZGVyLXJhZGl1czo5cHg7Ym9yZGVyLXJhZGl1czo5cHg7fVxuIlwKLSJhLmxhYmVsOmhvdmVyLGEuYmFkZ2U6aG92ZXJ7Y29sb3I6I2ZmZmZmZjt0ZXh0LWRlY29yYXRpb246bm9uZTtjdXJzb3I6cG9pbnRlcjt9XG4iXAotIi5sYWJlbC1pbXBvcnRhbnQsLmJhZGdlLWltcG9ydGFudHtiYWNrZ3JvdW5kLWNvbG9yOiNiOTRhNDg7fVxuIlwKLSIubGFiZWwtaW1wb3J0YW50W2hyZWZdLC5iYWRnZS1pbXBvcnRhbnRbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojOTUzYjM5O31cbiJcCi0iLmxhYmVsLXdhcm5pbmcsLmJhZGdlLXdhcm5pbmd7YmFja2dyb3VuZC1jb2xvcjojZjg5NDA2O31cbiJcCi0iLmxhYmVsLXdhcm5pbmdbaHJlZl0sLmJhZGdlLXdhcm5pbmdbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojYzY3NjA1O31cbiJcCi0iLmxhYmVsLXN1Y2Nlc3MsLmJhZGdlLXN1Y2Nlc3N7YmFja2dyb3VuZC1jb2xvcjojNDY4ODQ3O31cbiJcCi0iLmxhYmVsLXN1Y2Nlc3NbaHJlZl0sLmJhZGdlLXN1Y2Nlc3NbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMzU2NjM1O31cbiJcCi0iLmxhYmVsLWluZm8sLmJhZGdlLWluZm97YmFja2dyb3VuZC1jb2xvcjojM2E4N2FkO31cbiJcCi0iLmxhYmVsLWluZm9baHJlZl0sLmJhZGdlLWluZm9baHJlZl17YmFja2dyb3VuZC1jb2xvcjojMmQ2OTg3O31cbiJcCi0iLmxhYmVsLWludmVyc2UsLmJhZGdlLWludmVyc2V7YmFja2dyb3VuZC1jb2xvcjojMzMzMzMzO31cbiJcCi0iLmxhYmVsLWludmVyc2VbaHJlZl0sLmJhZGdlLWludmVyc2VbaHJlZl17YmFja2dyb3VuZC1jb2xvcjojMWExYTFhO31cbiJcCi0idGFibGV7bWF4LXdpZHRoOjEwMCU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDt9XG4iXAotIi50YWJsZXt3aWR0aDoxMDAlO21hcmdpbi1ib3R0b206MThweDt9LnRhYmxlIHRoLC50YWJsZSB0ZHtwYWRkaW5nOjhweDtsaW5lLWhlaWdodDoxOHB4O3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3A7Ym9yZGVyLXRvcDoxcHggc29saWQgI2RkZGRkZDt9XG4iXAotIi50YWJsZSB0aHtmb250LXdlaWdodDpib2xkO31cbiJcCi0iLnRhYmxlIHRoZWFkIHRoe3ZlcnRpY2FsLWFsaWduOmJvdHRvbTt9XG4iXAotIi50YWJsZSBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZSBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZSBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUgY29sZ3JvdXArdGhlYWQgdHI6Zmlyc3QtY2hpbGQgdGQsLnRhYmxlIHRoZWFkOmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZSB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0ZHtib3JkZXItdG9wOjA7fVxuIlwKLSIudGFibGUgdGJvZHkrdGJvZHl7Ym9yZGVyLXRvcDoycHggc29saWQgI2RkZGRkZDt9XG4iXAotIi50YWJsZS1jb25kZW5zZWQgdGgsLnRhYmxlLWNvbmRlbnNlZCB0ZHtwYWRkaW5nOjRweCA1cHg7fVxuIlwKLSIudGFibGUtYm9yZGVyZWR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkZGRkO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTsqYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlZDtib3JkZXItbGVmdDowOy13ZWJraXQtYm9yZGVyLXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzOjRweDtib3JkZXItcmFkaXVzOjRweDt9LnRhYmxlLWJvcmRlcmVkIHRoLC50YWJsZS1ib3JkZXJlZCB0ZHtib3JkZXItbGVmdDoxcHggc29saWQgI2RkZGRkZDt9XG4iXAotIi50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3RoZWFkIHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRoLC50YWJsZS1ib3JkZXJlZCBjYXB0aW9uK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZS1ib3JkZXJlZCBjb2xncm91cCt0aGVhZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgY29sZ3JvdXArdGJvZHkgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIGNvbGdyb3VwK3Rib2R5IHRyOmZpcnN0LWNoaWxkIHRkLC50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGgsLnRhYmxlLWJvcmRlcmVkIHRib2R5OmZpcnN0LWNoaWxkIHRyOmZpcnN0LWNoaWxkIHRke2JvcmRlci10b3A6MDt9XG4iXAotIi50YWJsZS1ib3JkZXJlZCB0aGVhZDpmaXJzdC1jaGlsZCB0cjpmaXJzdC1jaGlsZCB0aDpmaXJzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGQ6Zmlyc3QtY2hpbGR7LXdlYmtpdC1ib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtdG9wbGVmdDo0cHg7fVxuIlwKLSIudGFibGUtYm9yZGVyZWQgdGhlYWQ6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGg6bGFzdC1jaGlsZCwudGFibGUtYm9yZGVyZWQgdGJvZHk6Zmlyc3QtY2hpbGQgdHI6Zmlyc3QtY2hpbGQgdGQ6bGFzdC1jaGlsZHstd2Via2l0LWJvcmRlci10b3AtcmlnaHQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHg7LW1vei1ib3JkZXItcmFkaXVzLXRvcHJpZ2h0OjRweDt9XG4iXAotIi50YWJsZS1ib3JkZXJlZCB0aGVhZDpsYXN0LWNoaWxkIHRyOmxhc3QtY2hpbGQgdGg6Zmlyc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0ZDpmaXJzdC1jaGlsZHstd2Via2l0LWJvcmRlci1yYWRpdXM6MCAwIDAgNHB4Oy1tb3otYm9yZGVyLXJhZGl1czowIDAgMCA0cHg7Ym9yZGVyLXJhZGl1czowIDAgMCA0cHg7LXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdDo0cHg7fVxuIlwKLSIudGFibGUtYm9yZGVyZWQgdGhlYWQ6bGFzdC1jaGlsZCB0cjpsYXN0LWNoaWxkIHRoOmxhc3QtY2hpbGQsLnRhYmxlLWJvcmRlcmVkIHRib2R5Omxhc3QtY2hpbGQgdHI6bGFzdC1jaGlsZCB0ZDpsYXN0LWNoaWxkey13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweDstbW96LWJvcmRlci1yYWRpdXMtYm90dG9tcmlnaHQ6NHB4O31cbiJcCi0iLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGQsLnRhYmxlLXN0cmlwZWQgdGJvZHkgdHI6bnRoLWNoaWxkKG9kZCkgdGh7YmFja2dyb3VuZC1jb2xvcjojZjlmOWY5O31cbiJcCi0iLnRhYmxlIHRib2R5IHRyOmhvdmVyIHRkLC50YWJsZSB0Ym9keSB0cjpob3ZlciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWY1ZjU7fVxuIlwKLSJ0YWJsZSAuc3BhbjF7ZmxvYXQ6bm9uZTt3aWR0aDo0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3BhbjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW4ze2Zsb2F0Om5vbmU7d2lkdGg6MjA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuNHtmbG9hdDpub25lO3dpZHRoOjI4NHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3BhbjV7ZmxvYXQ6bm9uZTt3aWR0aDozNjRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW42e2Zsb2F0Om5vbmU7d2lkdGg6NDQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuN3tmbG9hdDpub25lO3dpZHRoOjUyNHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3Bhbjh7ZmxvYXQ6bm9uZTt3aWR0aDo2MDRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW45e2Zsb2F0Om5vbmU7d2lkdGg6Njg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTB7ZmxvYXQ6bm9uZTt3aWR0aDo3NjRweDttYXJnaW4tbGVmdDowO31cbiJcCi0idGFibGUgLnNwYW4xMXtmbG9hdDpub25lO3dpZHRoOjg0NHB4O21hcmdpbi1sZWZ0OjA7fVxuIlwKLSJ0YWJsZSAuc3BhbjEye2Zsb2F0Om5vbmU7d2lkdGg6OTI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTN7ZmxvYXQ6bm9uZTt3aWR0aDoxMDA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTR7ZmxvYXQ6bm9uZTt3aWR0aDoxMDg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTV7ZmxvYXQ6bm9uZTt3aWR0aDoxMTY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTZ7ZmxvYXQ6bm9uZTt3aWR0aDoxMjQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTd7ZmxvYXQ6bm9uZTt3aWR0aDoxMzI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTh7ZmxvYXQ6bm9uZTt3aWR0aDoxNDA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMTl7ZmxvYXQ6bm9uZTt3aWR0aDoxNDg0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjB7ZmxvYXQ6bm9uZTt3aWR0aDoxNTY0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjF7ZmxvYXQ6bm9uZTt3aWR0aDoxNjQ0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjJ7ZmxvYXQ6bm9uZTt3aWR0aDoxNzI0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjN7ZmxvYXQ6bm9uZTt3aWR0aDoxODA0cHg7bWFyZ2luLWxlZnQ6MDt9XG4iXAotInRhYmxlIC5zcGFuMjR7ZmxvYXQ6bm9uZTt3aWR0aDoxODg0cHg7bWFyZ2luLWxlZnQ6MDt9IgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTA2MWY3Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxOTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEphdmEgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2phdmFfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci1wdWJsaWM6Ci0gIHRfamF2YV9nZW5lcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJiZWFucyIpOwotICAgIGJlYW5fc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInByaXZhdGUtbWVtYmVycyIpOwotICAgIHByaXZhdGVfbWVtYmVyc18gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgibm9jYW1lbCIpOwotICAgIG5vY2FtZWxfc3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoImhhc2hjb2RlIik7Ci0gICAgZ2VuX2hhc2hfY29kZV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiYW5kcm9pZF9sZWdhY3kiKTsKLSAgICBhbmRyb2lkX2xlZ2FjeV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiamF2YTUiKTsKLSAgICBqYXZhNV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0gICAgaWYgKGphdmE1XykgewotICAgICAgYW5kcm9pZF9sZWdhY3lfID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBvdXRfZGlyX2Jhc2VfID0gKGJlYW5fc3R5bGVfID8gImdlbi1qYXZhYmVhbiIgOiAiZ2VuLWphdmEiKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICB2b2lkIGdlbmVyYXRlX2NvbnN0cyhzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgKHRfdHlwZWRlZiogIHR0eXBlZGVmKTsKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAodF9zdHJ1Y3QqICAgdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLQotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlLCBib29sIGluX2NsYXNzPWZhbHNlLCBib29sIGlzX3Jlc3VsdD1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwotICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fZ2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLCBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKLSAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKLSAgc3RkOjpzdHJpbmcgaXNzZXRfZmllbGRfaWQodF9maWVsZCogZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfYXN5bmNfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2NoZW1lX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgZmllbGQpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2MgICAgICAgICAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgICB0ZG9jKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjb250ZW50cyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDEsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLCBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwgdF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0KLSAgZW51bSBpc3NldF90eXBlIHsgSVNTRVRfTk9ORSwgSVNTRVRfUFJJTUlUSVZFLCBJU1NFVF9CSVRTRVQgfTsKLSAgaXNzZXRfdHlwZSBuZWVkc19pc3NldCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgKm91dFByaW1pdGl2ZVR5cGUgPSBOVUxMKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgamF2YV9wYWNrYWdlKCk7Ci0gIHN0ZDo6c3RyaW5nIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lcj1mYWxzZSwgYm9vbCBpbl9pbml0PWZhbHNlLCBib29sIHNraXBfZ2VuZXJpYz1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0YmFzZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0PWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSBmYWxzZSwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpbmNsdWRlX3R5cGVzID0gdHJ1ZSk7Ci0gIHN0ZDo6c3RyaW5nIGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCB1c2VfYmFzZV9tZXRob2QgPSB0cnVlLCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKLSAgc3RkOjpzdHJpbmcgYXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsIHRfc3RydWN0KiB0c3RydWN0LCB0X3R5cGUqIHR0eXBlLCBib29sIGluY2x1ZGVfdHlwZXM9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewotICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7Ci0KLSAgICByZXR1cm4KLSAgICAgIHR0eXBlLT5pc19jb250YWluZXIoKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cnVjdCgpIHx8Ci0gICAgICB0dHlwZS0+aXNfeGNlcHRpb24oKSB8fAotICAgICAgdHR5cGUtPmlzX3N0cmluZygpIHx8Ci0gICAgICB0dHlwZS0+aXNfZW51bSgpOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgY29uc3RhbnRfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0gIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKLQotICBib29sIGJlYW5fc3R5bGVfOwotICBib29sIHByaXZhdGVfbWVtYmVyc187Ci0gIGJvb2wgbm9jYW1lbF9zdHlsZV87Ci0gIGJvb2wgZ2VuX2hhc2hfY29kZV87Ci0gIGJvb2wgYW5kcm9pZF9sZWdhY3lfOwotICBib29sIGphdmE1XzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0gIHBhY2thZ2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotCi0gIHN0cmluZyBkaXIgPSBwYWNrYWdlX25hbWVfOwotICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwotICB3aGlsZSAoKGxvYyA9IGRpci5maW5kKCIuIikpICE9IHN0cmluZzo6bnBvcykgewotICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpci5zdWJzdHIoMCwgbG9jKTsKLSAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7Ci0gICAgZGlyID0gZGlyLnN1YnN0cihsb2MrMSk7Ci0gIH0KLSAgaWYgKGRpci5zaXplKCkgPiAwKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgfQotCi0gIHBhY2thZ2VfZGlyXyA9IHN1YmRpcjsKLX0KLQotLyoqCi0gKiBQYWNrYWdlcyB0aGUgZ2VuZXJhdGVkIGZpbGUKLSAqCi0gKiBAcmV0dXJuIFN0cmluZyBvZiB0aGUgcGFja2FnZSwgaS5lLiAicGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdGRlbW87IgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV9wYWNrYWdlKCkgewotICBpZiAoIXBhY2thZ2VfbmFtZV8uZW1wdHkoKSkgewotICAgIHJldHVybiBzdHJpbmcoInBhY2thZ2UgIikgKyBwYWNrYWdlX25hbWVfICsgIjtcblxuIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIGphdmEgaW1wb3J0cwotICoKLSAqIEByZXR1cm4gTGlzdCBvZiBpbXBvcnRzIGZvciBKYXZhIHR5cGVzIHRoYXQgYXJlIHVzZWQgaW4gaGVyZQotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7Ci0gIHN0cmluZyBoYXNoX2J1aWxkZXI7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGhhc2hfYnVpbGRlciA9ICJpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXI7XG4iOwotICB9Ci0KLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgIGhhc2hfYnVpbGRlciArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTtcblxuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5MaXN0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5TZXQ7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuRW51bVNldDtcbiIgKwotICAgICJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zO1xuIiArCi0gICAgImltcG9ydCBqYXZhLnV0aWwuQml0U2V0O1xuIiArCi0gICAgImltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyO1xuIgotICAgICJpbXBvcnQgamF2YS51dGlsLkFycmF5cztcbiIgKwotICAgICJpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjtcbiIgKwotICAgICJpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7XG5cbiI7Ci19Ci0KLS8qKgotICogTm90aGluZyBpbiBKYXZhCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpIHsKLSAgKHZvaWQpIHR0eXBlZGVmOwotfQotCi0vKioKLSAqIEVudW1zIGFyZSBhIGNsYXNzIHdpdGggYSBzZXQgb2Ygc3RhdGljIGNvbnN0YW50cy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodGVudW0tPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKLSAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdAotICBmX2VudW0gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8IGVuZGw7Ci0KLSAgLy8gQWRkIGphdmEgaW1wb3J0cwotICBmX2VudW0gPDwgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgamF2YS51dGlsLk1hcDtcbiIgKyAKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URW51bTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0gIjsKLSAgc2NvcGVfdXAoZl9lbnVtKTsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0KLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfZW51bSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sICpjX2l0ZXIpOwotICAgIGluZGVudChmX2VudW0pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdmFsdWUgPDwgIikiOwotICB9Ci0gIGZfZW51bSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEZpZWxkIGZvciB0aHJpZnRDb2RlCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAicHJpdmF0ZSAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIoaW50IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICB0aGlzLnZhbHVlID0gdmFsdWU7IiA8PGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIGludCBnZXRWYWx1ZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHJldHVybiB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogRmluZCBhIHRoZSBlbnVtIHR5cGUgYnkgaXRzIGludGVnZXIgdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAicHVibGljIHN0YXRpYyAiKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZmluZEJ5VmFsdWUoaW50IHZhbHVlKSB7ICIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAic3dpdGNoICh2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICJjYXNlICIgPDwgdmFsdWUgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gbnVsbDsiIDw8IGVuZGw7ICAKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKLSAgaWYgKGNvbnN0cy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8rICcvJyArIHByb2dyYW1fbmFtZV8gKyAiQ29uc3RhbnRzLmphdmEiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX2NvbnN0cyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGZfY29uc3RzIDw8Ci0gICAgInB1YmxpYyBjbGFzcyAiIDw8IHByb2dyYW1fbmFtZV8gPDwgIkNvbnN0YW50cyB7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2NvbnN0cywgKCpjX2l0ZXIpKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShmX2NvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX2NvbnN0cykgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfY29uc3RzLmNsb3NlKCk7Ci19Ci0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAgIChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwga2V5IDw8ICIsICIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuYWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlbmRlciA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICByZW5kZXIgPDwgIihieXRlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIHJlbmRlciA8PCAiKHNob3J0KSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpIDw8ICIuIiA8PCB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgdCA9IHRtcCgidG1wIik7Ci0gICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgcmVuZGVyIDw8IHQ7Ci0gIH0KLQotICByZXR1cm4gcmVuZGVyLnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIAotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV91bmlvbih0c3RydWN0KTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFeGNlcHRpb25zIGFyZSBzdHJ1Y3RzLCBidXQgdGhleSBpbmhlcml0IGZyb20gRXhjZXB0aW9uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvIisodHN0cnVjdC0+Z2V0X25hbWUoKSkrIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7Ci0gIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKLQotICBmX3N0cnVjdCA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpOwotCi0gIGdlbmVyYXRlX2phdmFfZG9jKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KGZfc3RydWN0KSA8PAotICAgICJwdWJsaWMgIiA8PCAoaXNfZmluYWwgPyAiZmluYWwgIiA6ICIiKSA8PCAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgPDwgIiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIuX0ZpZWxkcz4gIjsKLQotICBzY29wZV91cChmX3N0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfc3RydWN0X2Rlc2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZXNjcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9maWVsZF9uYW1lX2NvbnN0YW50cyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKGZfc3RydWN0LCB0c3RydWN0KTsKLQotICBmX3N0cnVjdCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3QoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihzZXRGaWVsZCwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIob3RoZXIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIGdlbmVyYXRlICJjb25zdHJ1Y3RvcnMiIGZvciBlYWNoIGZpZWxkCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKm1faXRlciktPmdldF90eXBlKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHguc2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKEJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJ5dGVbXSBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnJpZ2h0U2l6ZShidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpKSk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgQnl0ZUJ1ZmZlciBiID0gYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYiA9PSBudWxsID8gbnVsbCA6IGIuYXJyYXkoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gKEJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcIkNhbm5vdCBnZXQgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBnZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgfSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIihCeXRlQnVmZmVyLndyYXAodmFsdWUpKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIigiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICIgIHNldEZpZWxkXyA9IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB2YWx1ZV8gPSB2YWx1ZTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGlzIiA8PCBnZXRfY2FwX25hbWUoInNldCIpIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHNldEZpZWxkXyA9PSBfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX2NoZWNrX3R5cGUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgX0ZpZWxkcyBlbnVtRm9ySWQoc2hvcnQgaWQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkT3JUaHJvdyhpZCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiIAotICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFwiVW5rbm93biBmaWVsZCBpZCBcIiArIHNldEZpZWxkKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3Qgc3RhbmRhcmRTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZmllbGQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmIChmaWVsZC50eXBlID09ICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIl9GSUVMRF9ERVNDLnR5cGUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgZmllbGQsICIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJzZXRGaWVsZCB3YXNuJ3QgbnVsbCwgYnV0IGRpZG4ndCBtYXRjaCBhbnkgb2YgdGhlIGNhc2Ugc3RhdGVtZW50cyFcIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7ICAKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBzdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSAKLSAgICAgIDw8ICIgPSAoIiA8PCAgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyBzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF91cCgpOwotICAKLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSUQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgImlmIChzZXRGaWVsZCAhPSBudWxsKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICAKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzIVwiKTsiIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFwiQ291bGRuJ3QgZmluZCBhIGZpZWxkIHdpdGggZmllbGQgaWQgXCIgKyBmaWVsZElEKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHR1cGxlU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIAotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgIDw8ICIgPSAoIiA8PCAgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIil2YWx1ZV87IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotICAKLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCBcIiArIHNldEZpZWxkXyk7IiA8PCBlbmRsOwotICAKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIAotICBpbmRlbnRfZG93bigpOwotICAKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIFNUUlVDVF9ERVNDOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgLy8gZXF1YWxpdHkKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBlcXVhbHMoKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKW90aGVyKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiBnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCBvdGhlci5nZXRTZXRGaWVsZCgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0RmllbGRWYWx1ZSgpLCBvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpZiAoZ2VuX2hhc2hfY29kZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBIYXNoQ29kZUJ1aWxkZXIgaGNiID0gbmV3IEhhc2hDb2RlQnVpbGRlcigpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBoY2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIGhjYi5hcHBlbmQoc2V0RmllbGQuZ2V0VGhyaWZ0RmllbGRJZCgpKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICAgIGhjYi5hcHBlbmQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgICBoY2IuYXBwZW5kKHZhbHVlKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGhjYi50b0hhc2hDb2RlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IjsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgKiBJZiB5b3UnZCBsaWtlIHRoaXMgdG8gcGVyZm9ybSBtb3JlIHJlc3BlY3RhYmx5LCB1c2UgdGhlIGhhc2hjb2RlIGdlbmVyYXRvciBvcHRpb24uIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIDA7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogSmF2YSBzdHJ1Y3QgZGVmaW5pdGlvbi4gVGhpcyBoYXMgdmFyaW91cyBwYXJhbWV0ZXJzLCBhcyBpdCBjb3VsZCBiZQotICogZ2VuZXJhdGVkIHN0YW5kYWxvbmUgb3IgaW5zaWRlIGFub3RoZXIgY2xhc3MgYXMgYSBoZWxwZXIuIElmIGl0Ci0gKiBpcyBhIGhlbHBlciB0aGFuIGl0IGlzIGEgc3RhdGljIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0c3RydWN0ICAgICAgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwotICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCi0gKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwKLSAgICAoaW5fY2xhc3MgPyAic3RhdGljICIgOiAiIikgPDwgImNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICI7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBURXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSI7Ci0KLSAgb3V0IDw8ICIgIjsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gTWVtYmVycyBhcmUgcHVibGljIGZvciAtamF2YSwgcHJpdmF0ZSBmb3IgLWphdmFiZWFuCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9zY2hlbWVfbWFwKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmIChiZWFuX3N0eWxlXyB8fCBwcml2YXRlX21lbWJlcnNfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsICptX2l0ZXIpOwotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiOwotICAgIH0KLSAgICBvdXQgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0KLSAgLy8gaXNzZXQgZGF0YQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiLy8gaXNzZXQgaWQgYXNzaWdubWVudHMiIDw8IGVuZGw7Ci0KLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IG9wdGlvbmFscyA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgb3B0aW9uYWxzKys7Ci0gICAgICB9Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikKLSAgICAgICAgICA8PCAiID0gIiA8PCBpIDw8ICI7IiA8PCAgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIHByaW1pdGl2ZVR5cGU7Ci0gICAgc3dpdGNoKG5lZWRzX2lzc2V0KHRzdHJ1Y3QsICZwcmltaXRpdmVUeXBlKSkgewotICAgIGNhc2UgSVNTRVRfTk9ORToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgIiA8PCBwcmltaXRpdmVUeXBlIDw8ICIgX19pc3NldF9iaXRmaWVsZCA9IDA7IiA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBCaXRTZXQgX19pc3NldF9iaXRfdmVjdG9yID0gbmV3IEJpdFNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbmFscyA+IDApIHsKLSAgICAgIHN0ZDo6c3RyaW5nIG91dHB1dF9zdHJpbmcgPSAicHJpdmF0ZSBfRmllbGRzIG9wdGlvbmFsc1tdID0geyI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgICAgb3V0cHV0X3N0cmluZyA9IG91dHB1dF9zdHJpbmcgKyAiX0ZpZWxkcy4iICsgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpICsgIiwiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCBvdXRwdXRfc3RyaW5nLnN1YnN0cigwLCBvdXRwdXRfc3RyaW5nLmxlbmd0aCgpIC0gMSkgPDwgICJ9OyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAob3V0LCB0c3RydWN0KTsKLQotICBib29sIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gdHJ1ZTsKLQotICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuIiArICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgdCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICBhbGxfb3B0aW9uYWxfbWVtYmVycyA9IGZhbHNlOwotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGlmICghbWVtYmVycy5lbXB0eSgpICYmICFhbGxfb3B0aW9uYWxfbWVtYmVycykgewotICAgIC8vIEZ1bGwgY29uc3RydWN0b3IgZm9yIGFsbCBmaWVsZHMKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aGlzKCk7IiA8PCBlbmRsOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVElPTkFMKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8Ci0gICAgICAgICAgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAoKm1faXRlciksICIiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBjb3B5IGNvbnN0cnVjdG9yCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzd2l0Y2gobmVlZHNfaXNzZXQodHN0cnVjdCkpIHsKLSAgY2FzZSBJU1NFVF9OT05FOgotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX1BSSU1JVElWRToKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7IiA8PCBlbmRsOwotICAgIGJyZWFrOwotICBjYXNlIElTU0VUX0JJVFNFVDoKLSAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdF92ZWN0b3Iub3Iob3RoZXIuX19pc3NldF9iaXRfdmVjdG9yKTsiIDw8IGVuZGw7ICAgIAotICAgIGJyZWFrOwotICB9Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0eXBlKTsKLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChvdGhlci4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgIm90aGVyIiwgZmllbGRfbmFtZSwgIl9fdGhpc19fIiArIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBfX3RoaXNfXyIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCAib3RoZXIuIiArIGZpZWxkX25hbWUsIGZpZWxkX25hbWUsIHR5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY2xvbmUgbWV0aG9kLCBzbyB0aGF0IHlvdSBjYW4gZGVlcCBjb3B5IGFuIG9iamVjdCB3aGVuIHlvdSBkb24ndCBrbm93IGl0cyBjbGFzcy4KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBkZWVwQ29weSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBuZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIodGhpcyk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvdXQsIHRzdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG91dCwgdHN0cnVjdCwgaXNfcmVzdWx0KTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG91dCwgdHN0cnVjdCk7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0IGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMuZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIil0aGF0KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHRoYXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAvLyBNb3N0IGV4aXN0aW5nIFRocmlmdCBjb2RlIGRvZXMgbm90IHVzZSBpc3NldCBvciBvcHRpb25hbC9yZXF1aXJlZCwKLSAgICAvLyBzbyB3ZSB0cmVhdCAiZGVmYXVsdCIgZmllbGRzIGFzIHJlcXVpcmVkLgotICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHQpOwotICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgc3RyaW5nIHRoaXNfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdGhhdF9wcmVzZW50ID0gInRydWUiOwotICAgIHN0cmluZyB1bmVxdWFsOwotCi0gICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICB0aGlzX3ByZXNlbnQgKz0gIiAmJiB0aGlzLiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICAgIHRoYXRfcHJlc2VudCArPSAiICYmIHRoYXQuIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpOwotICAgIH0KLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhpc19wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgPDwgdGhpc19wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYm9vbGVhbiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgPSAiCi0gICAgICA8PCB0aGF0X3ByZXNlbnQgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgPDwgIiB8fCB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCEoIiA8PCAidGhpc19wcmVzZW50XyIgPDwgbmFtZQotICAgICAgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmVxdWFsID0gInRoaXMuIiArIG5hbWUgKyAiICE9IHRoYXQuIiArIG5hbWU7Ci0gICAgfQotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgdW5lcXVhbCA8PCAiKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLSAgfQotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmIChnZW5faGFzaF9jb2RlXykgewotICAgIGluZGVudChvdXQpIDw8ICJIYXNoQ29kZUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBIYXNoQ29kZUJ1aWxkZXIoKTsiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLQotICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgYm9vbCBpc19vcHRpb25hbCA9ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICAgIHN0cmluZyBuYW1lID0gKCptX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgICBzdHJpbmcgcHJlc2VudCA9ICJ0cnVlIjsKLQotICAgICAgaWYgKGlzX29wdGlvbmFsIHx8IGNhbl9iZV9udWxsKSB7Ci0gICAgICAgIHByZXNlbnQgKz0gIiAmJiAoIiArIGdlbmVyYXRlX2lzc2V0X2NoZWNrKCptX2l0ZXIpICsgIikiOwotICAgICAgfQotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiYm9vbGVhbiBwcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIiA8PCBwcmVzZW50IDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImJ1aWxkZXIuYXBwZW5kKHByZXNlbnRfIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAocHJlc2VudF8iIDw8IG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIGJ1aWxkZXIuYXBwZW5kKCIgPDwgbmFtZSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgIGJ1aWxkZXIuYXBwZW5kKCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBidWlsZGVyLnRvSGFzaENvZGUoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAwOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiaW50IGxhc3RDb21wYXJpc29uID0gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHR5cGVkT3RoZXIgPSAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIilvdGhlcjsiIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICptX2l0ZXI7Ci0gICAgaW5kZW50KG91dCkgPDwgImxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKCIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpLmNvbXBhcmVUbyh0eXBlZE90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGxhc3RDb21wYXJpc29uOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgdHlwZWRPdGhlci4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBmdW5jdGlvbiB0byByZWFkIGFsbCB0aGUgZmllbGRzIG9mIHRoZSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsiIDw8IGVuZGw7IAotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PAotICBlbmRsOwkKLX0KLQotLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHBlcmZvcm0gdmFyaW91cyBjaGVja3MKLS8vIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGlmIChiZWFuX3N0eWxlXykgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCEiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKFwiUmVxdWlyZWQgZmllbGQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIGlzIHVuc2V0ISBTdHJ1Y3Q6XCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfSBlbHNlewotICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IHByZXNlbnQhIFN0cnVjdDogXCIgKyB0b1N0cmluZygpKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vIGFsYXMsIHdlIGNhbm5vdCBjaGVjayAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgYmVjYXVzZSBpdCdzIGEgcHJpbWl0aXZlIGFuZCB5b3UgY2hvc2UgdGhlIG5vbi1iZWFucyBnZW5lcmF0b3IuIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eSIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpICYmICEgKCh0X3N0cnVjdCopdHlwZSktPmlzX3VuaW9uKCkpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLnZhbGlkYXRlKCk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAic2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsJCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOyIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGwgPDwgZW5kbDsJCi19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiLnZhbHVlT2YoIiA8PCAoYmFzZV90eXBlLT5pc19ib29sKCkgPyAiaXMiIDogImdldCIpIDw8IGNhcF9uYW1lIDw8ICIoKSk7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiBnZXQiIDw8IGNhcF9uYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAodmFsdWUgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdW5zZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSA8PCAiKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIigoIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLQotICAvLyBjcmVhdGUgdGhlIHNldHRlcgotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLSAgb3V0IDw8IHNldHRlcl9zdHJlYW0uc3RyKCk7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gY3JlYXRlIHRoZSBnZXR0ZXIKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7Ci0gIG91dCA8PCBnZXR0ZXJfc3RyZWFtLnN0cigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8vIENyZWF0ZXMgYSBnZW5lcmljIGlzU2V0IG1ldGhvZCB0aGF0IHRha2VzIHRoZSBmaWVsZCBudW1iZXIgYXMgYXJndW1lbnQKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCl7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBjcmVhdGUgdGhlIGlzU2V0IG1ldGhvZAotICBpbmRlbnQob3V0KSA8PCAiLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZCkgeyIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaXNzZXRfdHlwZSBpc3NldFR5cGUgPSBuZWVkc19pc3NldCh0c3RydWN0KTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKmZfaXRlcjsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgc3RkOjpzdHJpbmcgY2FwX25hbWUgPSBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSk7Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIE1ldGhvZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJzaXplKCkgeyIpIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSA/IDAgOiAiIDw8Ci0gICAgICAgICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLnNpemUoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICB0X3R5cGUqIGVsZW1lbnRfdHlwZTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBlbGVtZW50X3R5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEl0ZXJhdG9yIGdldHRlciBmb3Igc2V0cyBhbmQgbGlzdHMKLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPCIgPDwKLSAgICAgICAgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICAiPiBnZXQiIDw8IGNhcF9uYW1lOwotICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gbnVsbCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuaXRlcmF0b3IoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgLy8gQWRkIHRvIHNldCBvciBsaXN0LCBjcmVhdGUgaWYgdGhlIHNldC9saXN0IGlzIG51bGwKLSAgICAgIGluZGVudChvdXQpOwotICAgICAgb3V0IDw8ICJwdWJsaWMgdm9pZCBhZGQiIDw8IGdldF9jYXBfbmFtZSgidG8iKTsKLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGVsZW1lbnRfdHlwZSkgPDwgIiBlbGVtKSB7IiA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwKLSAgICAgICAgIigpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiLmFkZChlbGVtKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAvLyBQdXQgdG8gbWFwCi0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIHB1dCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOwotICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUpIDw8ICIga2V5LCAiCi0gICAgICAgIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSkgPDwgIiB2YWwpIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwKLSAgICAgICAgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KGtleSwgdmFsKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBTaW1wbGUgZ2V0dGVyCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBieXRlW10gZ2V0IiA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNldCIgPDwgY2FwX25hbWUgPDwgIihvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5yaWdodFNpemUoIiA8PCBmaWVsZF9uYW1lIDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IG51bGwgOiAiIDw8IGZpZWxkX25hbWUgPDwgIi5hcnJheSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIiIDw8IGdldF9jYXBfbmFtZSgiZm9yIikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0eXBlKTsKLSAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0JPT0wpIHsKLSAgICAgICAgb3V0IDw8ICIgaXMiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIgZ2V0IjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgICBpZiAoYmVhbl9zdHlsZV8pIHsKLSAgICAgICAgb3V0IDw8ICJ2b2lkIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoYnl0ZVtdICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgc2V0IiA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyAoQnl0ZUJ1ZmZlciludWxsIDogQnl0ZUJ1ZmZlci53cmFwKCIgPDwgZmllbGRfbmFtZSA8PCAiKSk7IiA8PCBlbmRsOwotICAgICAgaWYgKCFiZWFuX3N0eWxlXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgaWYgKGJlYW5fc3R5bGVfKSB7Ci0gICAgICBvdXQgPDwgInZvaWQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwotICAgIH0KLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCBmaWVsZCwgIiIpOwotICAgIGlmICghYmVhbl9zdHlsZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpczsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZihpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF9iaXRfdmVjdG9yLmNsZWFyKCIgPDwgaXNzZXRfZmllbGRfaWQoZmllbGQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gaXNTZXQgbWV0aG9kCi0gICAgaW5kZW50KG91dCkgPDwgIi8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgIiA8PCBmaWVsZF9uYW1lIDw8ICIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBpcyIgPDwgZ2V0X2NhcF9uYW1lKCJzZXQiKSA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiICE9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZihpc3NldFR5cGUgPT0gSVNTRVRfUFJJTUlUSVZFKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCAiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19pc3NldF9iaXRfdmVjdG9yLmdldCgiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmKGlzc2V0VHlwZSA9PSBJU1NFVF9QUklNSVRJVkUpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIiwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIl9faXNzZXRfYml0X3ZlY3Rvci5zZXQoIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIiwgdmFsdWUpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOyAKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIFN0cmluZyB0b1N0cmluZygpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2xlYW4gZmlyc3QgPSB0cnVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBjb3VsZF9iZV91bnNldCA9ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUw7Ci0gICAgaWYoY291bGRfYmVfdW5zZXQpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotCi0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCFmaXJzdCkgc2IuYXBwZW5kKFwiLCBcIik7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAic2IuYXBwZW5kKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjpcIik7IiA8PCBlbmRsOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoY2FuX2JlX251bGwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzYi5hcHBlbmQoXCJudWxsXCIpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJmaXJzdCA9IGZhbHNlOyIgPDwgZW5kbDsKLQotICAgIGlmKGNvdWxkX2JlX3Vuc2V0KSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIGZpcnN0ID0gZmFsc2U7Ci0gIH0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInNiLmFwcGVuZChcIilcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBzYi50b1N0cmluZygpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0YXRpYyBtYXAgd2l0aCBtZXRhIGRhdGEgdG8gc3RvcmUgaW5mb3JtYXRpb24gc3VjaCBhcyBmaWVsZElEIHRvCi0gKiBmaWVsZE5hbWUgbWFwcGluZwotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIFN0YXRpYyBNYXAgd2l0aCBmaWVsZElEIC0+IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhIG1hcHBpbmdzCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUG9wdWxhdGUgbWFwCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidG1wTWFwLnB1dChfRmllbGRzLiIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoXCIiIDw8IGZpZWxkX25hbWUgPDwgIlwiLCAiOwotCi0gICAgLy8gU2V0IGZpZWxkIHJlcXVpcmVtZW50IHR5cGUgKHJlcXVpcmVkLCBvcHRpb25hbCwgZXRjLikKLSAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgIjsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsICI7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHZhbHVlIG1ldGEgZGF0YQotICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBvdXQgIDw8ICIpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAibWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuY2xhc3MsIG1ldGFEYXRhTWFwKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKiAKLSAqIFJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgamF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gdGhyaWZ0IHR5cGUKLSAqIChlLmcuIGZvciB0aGUgdHlwZSBzdHJ1Y3QgaXQgcmV0dXJucyAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIikKLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkVOVU0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfamF2YV90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuVk9JRCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgOiByZXR1cm4gICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MICAgOiByZXR1cm4gICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQllURSI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOiByZXR1cm4gICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCA6IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgYnJlYWs7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiEKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4hCi0gIH0KLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpewotICAgIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7ICAgCi0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TZXRNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsICI7Ci0gICAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwgdmFsX3R5cGUpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAibmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIi5jbGFzcyI7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKLSAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiKSI7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4gSW4gQysrLCB0aGlzIGNvbXByaXNlcyBhbiBlbnRpcmVseSBzZXBhcmF0ZQotICogaGVhZGVyIGFuZCBzb3VyY2UgZmlsZS4gVGhlIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIG1ldGhvZHMgYW5kIGluY2x1ZGVzCi0gKiB0aGUgZGF0YSB0eXBlcyBkZWZpbmVkIGluIHRoZSBtYWluIGhlYWRlciBmaWxlLCBhbmQgdGhlIGltcGxlbWVudGF0aW9uCi0gKiBmaWxlIGNvbnRhaW5zIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYmFzaWMgcHJpbnRlciBhbmQgZGVmYXVsdCBpbnRlcmZhY2VzLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gcGFja2FnZV9kaXJfKyIvIitzZXJ2aWNlX25hbWVfKyIuamF2YSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PCAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIgLkFzeW5jSWZhY2UiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludGVyZmFjZSBBc3luY0lmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8ICIgeyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmMoKmZfaXRlciwgdHJ1ZSkgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHN0cnVjdHMgZm9yIGFsbCB0aGUgc2VydmljZSBhcmdzIGFuZCByZXR1cm4gdHlwZXMKLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIHRydWUpOwotICAgIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBleHRlbmRzX2NsaWVudCA9ICJvcmcuYXBhY2hlLnRocmlmdC5UU2VydmljZUNsaWVudCI7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50IGV4dGVuZHMgIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UU2VydmljZUNsaWVudEZhY3Rvcnk8Q2xpZW50PiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgRmFjdG9yeSgpIHt9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBDbGllbnQgZ2V0Q2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gbmV3IENsaWVudChwcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50IGdldENsaWVudChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG5ldyBDbGllbnQoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIocHJvdCwgcHJvdCk7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBDbGllbnQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIigiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRCYXNlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgYXJncyk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHJlc3VsdG5hbWUgPDwgIiByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJlY2VpdmVCYXNlKHJlc3VsdCwgXCIiIDw8IGZ1bm5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygic3VjY2VzcyIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9hc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICJvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKSArICIuQXN5bmNDbGllbnQiOwotICB9Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNDbGllbnQgZXh0ZW5kcyAiIDw8IGV4dGVuZHMgPDwgIiBpbXBsZW1lbnRzIEFzeW5jSWZhY2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gRmFjdG9yeSBtZXRob2QKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRGYWN0b3J5PEFzeW5jQ2xpZW50PiB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXI7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcHJpdmF0ZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgRmFjdG9yeShvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgICB0aGlzLmNsaWVudE1hbmFnZXIgPSBjbGllbnRNYW5hZ2VyOyIgPDwgZW5kbDsgCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHRoaXMucHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBwdWJsaWMgQXN5bmNDbGllbnQgZ2V0QXN5bmNDbGllbnQob3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAgIHJldHVybiBuZXcgQXN5bmNDbGllbnQocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIEFzeW5jQ2xpZW50KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRNYW5hZ2VyIGNsaWVudE1hbmFnZXIsIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgc3VwZXIocHJvdG9jb2xGYWN0b3J5LCBjbGllbnRNYW5hZ2VyLCB0cmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgdF90eXBlKiByZXRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgZnVuY2xhc3NuYW1lID0gZnVubmFtZSArICJfY2FsbCI7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBhcmdzX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICAgIHN0cmluZyByZXN1bHRfbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICAgIC8vIE1haW4gbWV0aG9kIGJvZHkgICAKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZl9pdGVyLCBmYWxzZSkgPDwgIiB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBjaGVja1JlYWR5KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICAiIDw8IGZ1bmNsYXNzbmFtZSA8PCAiIG1ldGhvZF9jYWxsID0gbmV3ICIgKyBmdW5jbGFzc25hbWUgKyAiKCIgPDwgYXN5bmNfYXJndW1lbnRfbGlzdCgqZl9pdGVyLCBhcmdfc3RydWN0LCByZXRfdHlwZSkgPDwgIiwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy5fX19jdXJyZW50TWV0aG9kID0gbWV0aG9kX2NhbGw7IiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBfX19tYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBUQXN5bmNNZXRob2Qgb2JqZWN0IGZvciB0aGlzIGZ1bmN0aW9uIGNhbGwKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiArIGZ1bmNsYXNzbmFtZSArICIgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBNZW1iZXIgdmFyaWFibGVzCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSAiICsgdHlwZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gTk9URSBzaW5jZSB3ZSB1c2UgYSBuZXcgQ2xpZW50IGluc3RhbmNlIHRvIGRlc2VyaWFsaXplLCBsZXQncyBrZWVwIHNlcWlkIHRvIDAgZm9yIG5vdwotICAgIC8vIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBpbnQgc2VxaWQ7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICAvLyBDb25zdHJ1Y3RvcgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyBmdW5jbGFzc25hbWUgKyAiKCIgKyBhc3luY19hcmd1bWVudF9saXN0KCpmX2l0ZXIsIGFyZ19zdHJ1Y3QsIHJldF90eXBlLCB0cnVlKSA8PCAiLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQgY2xpZW50LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGNsaWVudCwgcHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnQsIHJlc3VsdEhhbmRsZXIsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBBc3NpZ24gbWVtYmVyIHZhcmlhYmxlcwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgdGhpcy4iICsgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgKyAiID0gIiArICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpICsgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBTZXJpYWxpemUgcmVxdWVzdAotICAgIC8vIE5PVEUgd2UgYXJlIGxlYXZpbmcgc2VxaWQgYXMgMCwgZm9yIG5vdyAoc2VlIGFib3ZlKQotICAgIGZfc2VydmljZV8gPDwgCi0gICAgICBpbmRlbnQoKSA8PCAicHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuQ0FMTCwgMCkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgYXJnc19uYW1lIDw8ICIgYXJncyA9IG5ldyAiIDw8IGFyZ3NfbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCAKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHByb3QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFJldHVybiBtZXRob2QgIAotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgKyB0eXBlX25hbWUocmV0X3R5cGUpICsgIiBnZXRSZXN1bHQoKSB0aHJvd3MgIjsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoZ2V0U3RhdGUoKSAhPSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsLlN0YXRlLlJFU1BPTlNFX1JFQUQpIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oXCJNZXRob2QgY2FsbCBub3QgZmluaXNoZWQhXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QgPSBjbGllbnQuZ2V0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wobWVtb3J5VHJhbnNwb3J0KTsiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXyk7Ci0gICAgICBpZiAoIXJldF90eXBlLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7IAotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAiKG5ldyBDbGllbnQocHJvdCkpLnJlY3ZfIiArIGZ1bm5hbWUgKyAiKCk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBjbGFzcwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBDbG9zZSBBc3luY0NsaWVudAotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIGRpc3BhdGNoIG1ldGhvZHMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRXh0ZW5kcyBzdHVmZgotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpID09IE5VTEwpIHsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZVByb2Nlc3NvcjxJPiI7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Qcm9jZXNzb3I8ST4iOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIFByb2Nlc3NvcjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgUHJvY2Vzc29yKEkgaWZhY2UpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihpZmFjZSwgZ2V0UHJvY2Vzc01hcChuZXcgSGFzaE1hcDxTdHJpbmcsIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PigpKSk7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb3RlY3RlZCBQcm9jZXNzb3IoSSBpZmFjZSwgTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gcHJvY2Vzc01hcCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHN1cGVyKGlmYWNlLCBnZXRQcm9jZXNzTWFwKHByb2Nlc3NNYXApKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJpdmF0ZSBzdGF0aWMgPEkgZXh0ZW5kcyBJZmFjZT4gTWFwPFN0cmluZywgIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPj4gZ2V0UHJvY2Vzc01hcChNYXA8U3RyaW5nLCAgb3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U+PiBwcm9jZXNzTWFwKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInByb2Nlc3NNYXAucHV0KFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIigpKTsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gcHJvY2Vzc01hcDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGFyZ3NuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7Ci0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgcmVzdWx0bmFtZSA9ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSI7Ci0gIH0KLQotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gY2xhc3MKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIjxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksICIgPDwgYXJnc25hbWUgPDwgIj4geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICBzdXBlcihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGFyZ3NuYW1lIDw8ICIgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuICIgPDwgKCh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKT8idHJ1ZSI6ImZhbHNlIikgPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljICIgPDwgcmVzdWx0bmFtZSA8PCAiIGdldFJlc3VsdChJIGlmYWNlLCAiIDw8IGFyZ3NuYW1lIDw8ICIgYXJncykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiaWZhY2UuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBTZXQgaXNzZXQgb24gc3VjY2VzcyBmaWVsZAotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpICYmICF0eXBlX2Nhbl9iZV9udWxsKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJlc3VsdC5zZXQiIDw8IGdldF9jYXBfbmFtZSgic3VjY2VzcyIpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiBjYXRjaCAoIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIn0iOwotICAgICAgfQotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG51bGw7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIHJlc3VsdDsiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IjsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUsIGhhc19tZXRhZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSBpcHJvdC4iOwotCi0KLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAicmVhZEJvb2woKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgb3V0IDw8ICJyZWFkQnl0ZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIG91dCA8PCAicmVhZEk2NCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBKYXZhIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgKyAiLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIEZJRUxEICclcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LCBib29sIGhhc19tZXRhZGF0YSkgewotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIGlmIChoYXNfbWV0YWRhdGEpIHsKLSAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCAiIDw8IG9iaiA8PCAiID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAoIiA8PCAKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8ICJpcHJvdC5yZWFkSTMyKCkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgIiA8PCBvYmogPDwgIiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIgPDwgCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0ICIgPDwgb2JqIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIiA8PCAKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKTsKLSAgLy8gc2l6ZSB0aGUgY29sbGVjdGlvbiBjb3JyZWN0bHkKLSAgb3V0IDw8ICIoIgotICAgIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiICkKLSAgICA8PCBvYmogPDwgIi5zaXplIgotICAgIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgsIGhhc19tZXRhZGF0YSk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLSAgaWYgKGhhc19tZXRhZGF0YSkgewotICAgIC8vIFJlYWQgY29udGFpbmVyIGVuZAotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTWFwRW5kKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSwgIiIsIGhhc19tZXRhZGF0YSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwsICIiLCBoYXNfbWV0YWRhdGEpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgIiIsIGhhc19tZXRhZGF0YSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgbGlzdCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgZGVjbGFyZV9maWVsZCgmZmVsZW0pIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOwotCi0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7ICAKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSmF2YSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoc3RydWN0LiIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgaXRzIHNpemUgdGhlbiB0aGUgZWxlbWVudHMuCi0gKgotICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKLSAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAoaGFzX21ldGFkYXRhKSB7Ci0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAoIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0KCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLnNpemUoKSkpOyIgPDwgZW5kbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlSTMyKCIgPDwgcHJlZml4IDw8ICIuc2l6ZSgpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChNYXAuRW50cnk8IiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICI+ICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiLmVudHJ5U2V0KCkpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoIiA8PAotICAgICAgdHlwZV9uYW1lKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICgiIDw8Ci0gICAgICB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlciA8PAotICAgICAgIiA6ICIgPDwKLSAgICAgIHByZWZpeCA8PCAiKSI7Ci0gIH0KLQotICBvdXQgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCwgaGFzX21ldGFkYXRhKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyLCBoYXNfbWV0YWRhdGEpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIsIGhhc19tZXRhZGF0YSk7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmIChoYXNfbWV0YWRhdGEpIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwgYm9vbCBoYXNfbWV0YWRhdGEpIHsKLSAgKHZvaWQpIG1hcDsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLmdldEtleSgpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZrZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOwotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgaXRlciArICIuZ2V0VmFsdWUoKSIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCBoYXNfbWV0YWRhdGEpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgaGFzX21ldGFkYXRhKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGEgSmF2YSB0eXBlIG5hbWUKLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgdGhlIHR5cGUgZ29pbmcgaW5zaWRlIGEgY29udGFpbmVyPwotICogQHJldHVybiBKYXZhIHR5cGUgbmFtZSwgaS5lLiBIYXNoTWFwPEtleSxWYWx1ZT4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0LCBib29sIHNraXBfZ2VuZXJpYykgewotICAvLyBJbiBKYXZhIHR5cGVkZWZzIGFyZSBqdXN0IHJlc29sdmVkIHRvIHRoZWlyIHJlYWwgdHlwZQotICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoKHRfYmFzZV90eXBlKil0dHlwZSwgaW5fY29udGFpbmVyKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X21hcCogdG1hcCA9ICh0X21hcCopIHR0eXBlOwotICAgIGlmIChpbl9pbml0KSB7Ci0gICAgICBwcmVmaXggPSAiSGFzaE1hcCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJNYXAiOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4ICsgKHNraXBfZ2VuZXJpYyA/ICIiIDogIjwiICsKLSAgICAgICAgICAgICAgICAgICAgIHR5cGVfbmFtZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSkgKyAiLCIgKwotICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKHRtYXAtPmdldF92YWxfdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkhhc2hTZXQiOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmVmaXggPSAiU2V0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF9saXN0KiB0bGlzdCA9ICh0X2xpc3QqKSB0dHlwZTsKLSAgICBpZiAoaW5faW5pdCkgewotICAgICAgcHJlZml4ID0gIkFycmF5TGlzdCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZWZpeCA9ICJMaXN0IjsKLSAgICB9Ci0gICAgcmV0dXJuIHByZWZpeCArIChza2lwX2dlbmVyaWMgPyAiIiA6ICI8IiArIHR5cGVfbmFtZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKSArICI+Iik7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgbmFtZXNwYWNpbmcKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIHN0cmluZyBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpOwotICAgIGlmICghcGFja2FnZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcGFja2FnZSArICIuIiArIHR0eXBlLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBKYXZhIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmJhc2VfdHlwZV9uYW1lKHRfYmFzZV90eXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyKSB7Ci0gIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSB0eXBlLT5nZXRfYmFzZSgpOwotCi0gIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICByZXR1cm4gInZvaWQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgIHJldHVybiAiQnl0ZUJ1ZmZlciI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIlN0cmluZyI7Ci0gICAgICB9Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkJ5dGUiIDogImJ5dGUiKTsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIlNob3J0IiA6ICJzaG9ydCIpOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJMb25nIiA6ICJsb25nIik7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJEb3VibGUiIDogImRvdWJsZSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICB9Ci19Ci0KLS8qKgotICogRGVjbGFyZXMgYSBmaWVsZCwgd2hpY2ggbWF5IGluY2x1ZGUgaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgotICoKLSAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCi0gKiBAcGFyYW0gaW5pdCBXaGV0aGVyIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogZG8gd2UgZXZlciBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkPwotICBzdHJpbmcgcmVzdWx0ID0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7Ci0gICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJlc3VsdCArPSAiOyAvLyAiOwotICBpZiAodGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgIHJlc3VsdCArPSAib3B0aW9uYWwiOwotICB9IGVsc2UgewotICAgIHJlc3VsdCArPSAicmVxdWlyZWQiOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwotICBzdGQ6OnN0cmluZyByZXN1bHQgPQotICAgIHR5cGVfbmFtZSh0dHlwZSkgKyAiICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSB0aHJvd3MgIjsKLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICByZXN1bHQgKz0gdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICIsICI7Ci0gIH0KLSAgcmVzdWx0ICs9ICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd2b2lkIG5hbWUoYXJncywgcmVzdWx0SGFuZGxlciknCi0gKgotICogQHBhcmFtcyB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgYm9vbCB1c2VfYmFzZV9tZXRob2QsIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9IGFzeW5jX2Z1bmN0aW9uX2NhbGxfYXJnbGlzdCh0ZnVuY3Rpb24sIHVzZV9iYXNlX21ldGhvZCwgdHJ1ZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmV0X3R5cGUgPSAiIjsKLSAgaWYgKHVzZV9iYXNlX21ldGhvZCkgewotICAgIHJldF90eXBlICs9ICJBc3luY0NsaWVudC4iOwotICB9Ci0gIHJldF90eXBlICs9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfY2FsbCI7Ci0KLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gcHJlZml4ICsgInZvaWQgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ2xpc3QgKyAiKSI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9jYWxsX2FyZ2xpc3QodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgdXNlX2Jhc2VfbWV0aG9kLCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RkOjpzdHJpbmcgYXJnbGlzdCA9ICIiOwotICBpZiAodGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgewotICAgIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBpbmNsdWRlX3R5cGVzKSArICIsICI7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyByZXRfdHlwZSA9ICIiOwotICBpZiAodXNlX2Jhc2VfbWV0aG9kKSB7Ci0gICAgcmV0X3R5cGUgKz0gIkFzeW5jQ2xpZW50LiI7Ci0gIH0KLSAgcmV0X3R5cGUgKz0gdGZ1bmMtPmdldF9uYW1lKCkgKyAiX2NhbGwiOwotCi0gIGlmIChpbmNsdWRlX3R5cGVzKSB7Ci0gICAgYXJnbGlzdCArPSAib3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazwiICsgcmV0X3R5cGUgKyAiPiAiOwotICB9Ci0gIGFyZ2xpc3QgKz0gInJlc3VsdEhhbmRsZXIiOwotCi0gIHJldHVybiBhcmdsaXN0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6YXN5bmNfYXJndW1lbnRfbGlzdCh0X2Z1bmN0aW9uKiB0ZnVuY3QsIHRfc3RydWN0KiB0c3RydWN0LCB0X3R5cGUqIHR0eXBlLCBib29sIGluY2x1ZGVfdHlwZXMpIHsKLSAgKHZvaWQpIHR0eXBlOwotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSArICIgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAoIWZpcnN0KSB7Ci0gICAgcmVzdWx0ICs9ICIsICI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVfdHlwZXMpIHsKLSAgICByZXN1bHQgKz0gIm9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8IiArIHRmdW5jdC0+Z2V0X25hbWUoKSArICJfY2FsbCIgKyAiPiAiOwotICB9Ci0gIHJlc3VsdCArPSAicmVzdWx0SGFuZGxlciI7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBKYXZhIGVudW0gc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLSAqLwotc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CWVRFIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkxNiI7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIiOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0IjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQXBwbGllcyB0aGUgY29ycmVjdCBzdHlsZSB0byBhIHN0cmluZyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygbm9jYW1lbF9zdHlsZV8KLSAqLwotc3RkOjpzdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpewotICBpZiAobm9jYW1lbF9zdHlsZV8pIHsKLSAgICByZXR1cm4gIl8iICsgbmFtZTsKLSAgfSBlbHNlIHsKLSAgICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotfQotCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6Y29uc3RhbnRfbmFtZShzdHJpbmcgbmFtZSkgewotICBzdHJpbmcgY29uc3RhbnRfbmFtZTsKLQotICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKLSAgYm9vbCB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGZhbHNlOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IG5hbWUuYmVnaW4oKTsgaXRlciAhPSBuYW1lLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzdHJpbmc6OnZhbHVlX3R5cGUgY2hhcmFjdGVyID0gKCppdGVyKTsKLQotICAgIGJvb2wgaXNfdXBwZXIgPSBpc3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpZiAoaXNfdXBwZXIgJiYgIWlzX2ZpcnN0ICYmICF3YXNfcHJldmlvdXNfY2hhcl91cHBlcikgewotICAgICAgY29uc3RhbnRfbmFtZSArPSAnXyc7Ci0gICAgfQotICAgIGNvbnN0YW50X25hbWUgKz0gdG91cHBlcihjaGFyYWN0ZXIpOwotCi0gICAgaXNfZmlyc3QgPSBmYWxzZTsKLSAgICB3YXNfcHJldmlvdXNfY2hhcl91cHBlciA9IGlzX3VwcGVyOwotICB9Ci0KLSAgcmV0dXJuIGNvbnN0YW50X25hbWU7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY29udGVudHMpIHsKLSAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyoqXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICogIiwgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKi9cbiIpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7Ci0gICAgc3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8IHRmdW5jdGlvbi0+Z2V0X2RvYygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7Ci0gICAgZm9yIChwX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgcF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytwX2l0ZXIpIHsKLSAgICAgIHRfZmllbGQqIHAgPSAqcF9pdGVyOwotICAgICAgc3MgPDwgIlxuQHBhcmFtICIgPDwgcC0+Z2V0X25hbWUoKTsKLSAgICAgIGlmIChwLT5oYXNfZG9jKCkpIHsKLSAgICAgICAgc3MgPDwgIiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvKipcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAqICIsIHNzLnN0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKi9cbiIpOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgc291cmNlX25hbWUgPSBzb3VyY2VfbmFtZV9wMTsKLSAgZWxzZQotICAgIHNvdXJjZV9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiLiIgKyBzb3VyY2VfbmFtZV9wMjsKLQotICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKGNvbnRhaW5lciwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0KLSAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOwotICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOwotCi0gIGlmKGNvbnRhaW5lci0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtleV90eXBlID0gKCh0X21hcCopY29udGFpbmVyKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2YWxfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF92YWxfdHlwZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3IgKE1hcC5FbnRyeTwiIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIsICIgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIj4gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIiA6ICIgPDwgc291cmNlX25hbWUgPDwgIi5lbnRyeVNldCgpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICJfa2V5ID0gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIi5nZXRLZXkoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIi5nZXRWYWx1ZSgpOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKGtleV90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsIGtleV90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX2tleSIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX2tleSIsIGtleV90eXBlKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGlmICh2YWxfdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgdmFsX3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodmFsX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlID0gIjsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl92YWx1ZSIsIHJlc3VsdF9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgdmFsX3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQoIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfa2V5LCAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSk7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHRfdHlwZSogZWxlbV90eXBlOwotCi0gICAgaWYgKGNvbnRhaW5lci0+aXNfc2V0KCkpIHsKLSAgICAgIGVsZW1fdHlwZSA9ICgodF9zZXQqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZWxlbV90eXBlID0gKCh0X2xpc3QqKWNvbnRhaW5lciktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgImZvciAoIiA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiAiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiIDogIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAoZWxlbV90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gcmVjdXJzaXZlIGRlZXAgY29weQotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwgIiIsIHJlc3VsdF9lbGVtZW50X25hbWUsIGVsZW1fdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpdGVyYXRpdmUgY29weQotICAgICAgaWYoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiQnl0ZUJ1ZmZlciB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLmFkZCh0ZW1wX2JpbmFyeV9lbGVtZW50KTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2V7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lLCBzdGQ6OnN0cmluZyBkZXN0X25hbWUsIHRfdHlwZSogdHlwZSkgewotICAodm9pZCkgZGVzdF9uYW1lOwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gZXZlcnl0aGluZyBlbHNlIGNhbiBiZSBjb3BpZWQgZGlyZWN0bHkKLSAgICAgIG91dCA8PCBzb3VyY2VfbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgdHJ1ZSkgPDwgIigiIDw8IHNvdXJjZV9uYW1lIDw8ICIpIjsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjppc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gIl9fIiArIHVwY2FzZV9zdHJpbmcoZmllbGQtPmdldF9uYW1lKCkgKyAiX2lzc2V0X2lkIik7Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgcmV0dXJuICJpcyIgKyBnZXRfY2FwX25hbWUoInNldCIpICsgZ2V0X2NhcF9uYW1lKGZpZWxkX25hbWUpICsgIigpIjsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSkgewotICBzdHJpbmcgcGFja2FnZSA9ICIiOwotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgiamF2YSIpICsgIi4iOwotICB9Ci0gIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkICIgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKFwiIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIlwiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAiKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIik7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2NoZW1lX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsiIDw8IGVuZGw7ICAKLSAgaW5kZW50KG91dCkgPDwgIiAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlR1cGxlU2NoZW1lRmFjdG9yeSgpKTsiIDw8IGVuZGw7ICAKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCFmaXJzdCkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKm1faXRlcik7Ci0gICAgaW5kZW50KG91dCkgPDwgY29uc3RhbnRfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIoKHNob3J0KSIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgXCIiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIjsKLSAgfQotCi0gIG91dCA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjogLy8gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gIiA8PCBjb25zdGFudF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKiBpZiBpdCBpcyBub3QgZm91bmQuIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcIkZpZWxkIFwiICsgZmllbGRJZCArIFwiIGRvZXNuJ3QgZXhpc3QhXCIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGZpZWxkczsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfdGhyaWZ0SWQ7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBfZmllbGROYW1lOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdF9qYXZhX2dlbmVyYXRvcjo6aXNzZXRfdHlwZSB0X2phdmFfZ2VuZXJhdG9yOjpuZWVkc19pc3NldCh0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgKm91dFByaW1pdGl2ZVR5cGUpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbnQgY291bnQgPSAwOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICB9Ci0gIGlmKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gSVNTRVRfTk9ORTsKLSAgfSBlbHNlIGlmKGNvdW50IDw9IDY0KSB7Ci0gICAgaWYob3V0UHJpbWl0aXZlVHlwZSAhPSBOVUxMKSB7Ci0gICAgICBpZihjb3VudCA8PSA4KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJieXRlIjsKLSAgICAgIGVsc2UgaWYoY291bnQgPD0gMTYpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gInNob3J0IjsKLSAgICAgIGVsc2UgaWYoY291bnQgPD0gMzIpCi0gICAgICAgICpvdXRQcmltaXRpdmVUeXBlID0gImludCI7Ci0gICAgICBlbHNlIGlmKGNvdW50IDw9IDY0KQotICAgICAgICAqb3V0UHJpbWl0aXZlVHlwZSA9ICJsb25nIjsKLSAgICB9Ci0gICAgcmV0dXJuIElTU0VUX1BSSU1JVElWRTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gSVNTRVRfQklUU0VUOwotICB9Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpZiAoIWphdmE1XykgewotICAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudF91cCgpOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqbV9pdGVyOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotCi0gICAgaWYgKGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBmaWVsZC0+Z2V0X25hbWUoKSwgdCwgZmllbGQtPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHQpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIG11c3QgYmUgYSBiYXNlIHR5cGUKLSAgICAvLyBtZWFucyBpdCBhbHNvIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgdW5zZXQKLSAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGZhbHNlKTsiIDw8IGVuZGw7Ci0gICAgdF9iYXNlX3R5cGUqIGJhc2VfdHlwZSA9ICh0X2Jhc2VfdHlwZSopIHQ7Ci0KLSAgICBzd2l0Y2ggKGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAwOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAidW5zdXBwb3J0ZWQgdHlwZTogIiArIGJhc2VfdHlwZS0+Z2V0X25hbWUoKSArICIgZm9yIGZpZWxkICIgKyBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0cnkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlIiA8PCAoYW5kcm9pZF9sZWdhY3lfPyAiLmdldE1lc3NhZ2UoKSIgOiAiIikgPDwgIik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdHJ5IHsiIDw8IGVuZGw7Ci0gIGlmICghdHN0cnVjdC0+aXNfdW5pb24oKSkgewotICAgIHN3aXRjaChuZWVkc19pc3NldCh0c3RydWN0KSkgewotICAgICAgY2FzZSBJU1NFVF9OT05FOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVNTRVRfUFJJTUlUSVZFOgotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSBzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsiIDw8IGVuZGw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJU1NFVF9CSVRTRVQ6Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuIiA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAiICAgIF9faXNzZXRfYml0X3ZlY3RvciA9IG5ldyBCaXRTZXQoMSk7IiA8PCBlbmRsOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaW5kZW50KG91dCkgPDwgIiAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSIgPDwgKGFuZHJvaWRfbGVnYWN5Xz8gIi5nZXRNZXNzYWdlKCkiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCAiIDw8ICB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gRGVjbGFyZSBzdGFjayB0bXAgdmFyaWFibGVzIGFuZCByZWFkIHN0cnVjdCBoZWFkZXIKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOwotCi0gIC8vIFJlYWQgYmVnaW5uaW5nIGZpZWxkIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAic2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBDaGVjayBmb3IgZmllbGQgU1RPUCBtYXJrZXIgYW5kIGJyZWFrCi0gIGluZGVudChvdXQpIDw8ICJpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7ICIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IC8vICIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpZiAoc2NoZW1lRmllbGQudHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzdHJ1Y3QuIiwgdHJ1ZSk7Ci0gICAgaW5kZW50KG91dCkgPDwgInN0cnVjdC4iIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKHRydWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgotICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIC8vIGluIG5vbi1iZWFucyBzdHlsZSwgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZQotICAvLyAod2hpY2ggY2FuIGJlIGNoZWNrZWQgaGVyZSBidXQgbm90IGluIHRoZSBnZW5lcmFsIHZhbGlkYXRlIG1ldGhvZCkKLSAgaWYgKCFiZWFuX3N0eWxlXyl7Ci0gICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIi8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIHR5cGUsIHdoaWNoIGNhbid0IGJlIGNoZWNrZWQgaW4gdGhlIHZhbGlkYXRlIG1ldGhvZCIgPDwgZW5kbDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgIXR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghc3RydWN0LiIgIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihcIlJlcXVpcmVkIGZpZWxkICciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyB3YXMgbm90IGZvdW5kIGluIHNlcmlhbGl6ZWQgZGF0YSEgU3RydWN0OiBcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLSAgaW5kZW50KG91dCkgPDwgInN0cnVjdC52YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CQotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsICIgPDwgCi0gICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJzdHJ1Y3QudmFsaWRhdGUoKTsiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKHN0cnVjdC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSB8fCAoaXNfcmVzdWx0ICYmICFudWxsX2FsbG93ZWQpOwotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8ICJzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAic3RydWN0LiIsIHRydWUpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90LndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgfQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwgCi0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlRmllbGRTdG9wKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiPiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX3N0YW5kYXJkX3dyaXRlcihvdXQsIHRzdHJ1Y3QsIGlzX3Jlc3VsdCk7Ci0KLSAgb3V0IDw8Ci0gIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gIGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7IiA8PCBlbmRsOwotICBpbnQgb3B0aW9uYWxfY291bnQgPSAwOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgb3B0aW9uYWxfY291bnQrKzsKLSAgICB9Ci0gICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzdHJ1Y3Quc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGlmIChvcHRpb25hbF9jb3VudCA+IDApIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgiIDw8IG9wdGlvbmFsX2NvdW50IDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChpbmNvbWluZy5nZXQoIiA8PCBpIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAic3RydWN0LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsgIAotfQotCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGhhc19vcHRpb25hbCA9IGZhbHNlOwotICBpbnQgb3B0aW9uYWxfY291bnQgPSAwOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgIG9wdGlvbmFsX2NvdW50Kys7Ci0gICAgICBoYXNfb3B0aW9uYWwgPSB0cnVlOwotICAgIH0KLSAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKCpmX2l0ZXIpLCAic3RydWN0LiIsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGhhc19vcHRpb25hbCkgewotICAgIGluZGVudChvdXQpIDw8ICJCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOyIgPDwgZW5kbDsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8ICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImlmIChzdHJ1Y3QuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAib3B0aW9uYWxzLnNldCgiIDw8IGkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsICIgPDwgb3B0aW9uYWxfY291bnQgPDwgIik7IiA8PCBlbmRsOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHN0cnVjdC4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAoKmZfaXRlciksICJzdHJ1Y3QuIiwgZmFsc2UpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgaisrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbmV3ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUoKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTwiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj4geyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3V0LCB0c3RydWN0KTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLVRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoamF2YSwgIkphdmEiLAotIiAgICBiZWFuczogICAgICAgICAgIE1lbWJlcnMgd2lsbCBiZSBwcml2YXRlLCBhbmQgc2V0dGVyIG1ldGhvZHMgd2lsbCByZXR1cm4gdm9pZC5cbiIKLSIgICAgcHJpdmF0ZS1tZW1iZXJzOiBNZW1iZXJzIHdpbGwgYmUgcHJpdmF0ZSwgYnV0IHNldHRlciBtZXRob2RzIHdpbGwgcmV0dXJuICd0aGlzJyBsaWtlIHVzdWFsLlxuIgotIiAgICBub2NhbWVsOiAgICAgICAgIERvIG5vdCB1c2UgQ2FtZWxDYXNlIGZpZWxkIGFjY2Vzc29ycyB3aXRoIGJlYW5zLlxuIgotIiAgICBoYXNoY29kZTogICAgICAgIEdlbmVyYXRlIHF1YWxpdHkgaGFzaENvZGUgbWV0aG9kcy5cbiIKLSIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgYWJvdmUpLlxuIgotIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKLSkKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MDNlMS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzODYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzdGRleGNlcHQ+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIEphdmEgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X2phdmFtZV9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfamF2YW1lX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWphdmFtZSI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAodF9lbnVtKiAgICAgdGVudW0pOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdCAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uICAgKHRfc3RydWN0KiAgIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqICAgdHhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpbl9jbGFzcz1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9qYXZhX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX2dldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgc3RkOjpzdHJpbmcgZ2V0X2NhcF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCk7Ci0gIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHN0ZDo6c3RyaW5nIGZpZWxkKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwotICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfdW5pb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX25hbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIGZpZWxkKTsKLQotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jICAgICAgICAgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqICAgICAgdGRvYyk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyAgICAgICAgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRkb2MpOwotCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29udGVudHMpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMiwgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLCB0X3R5cGUqIHR5cGUpOwotCi0gIGJvb2wgaGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBqYXZhX3BhY2thZ2UoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90eXBlX2ltcG9ydHMoKTsKLSAgc3RkOjpzdHJpbmcgamF2YV90aHJpZnRfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSwgYm9vbCBpbl9jb250YWluZXI9ZmFsc2UsIGJvb2wgaW5faW5pdD1mYWxzZSwgYm9vbCBza2lwX2dlbmVyaWM9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcyA9IHRydWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBib3hfdHlwZSh0X3R5cGUqIHR5cGUsIHN0cmluZyB2YWx1ZSk7Ci0KLSAgYm9vbCB0eXBlX2Nhbl9iZV9udWxsKHRfdHlwZSogdHR5cGUpIHsKLSAgICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOwotCi0gICAgcmV0dXJuCi0gICAgICB0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJ1Y3QoKSB8fAotICAgICAgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwKLSAgICAgIHR0eXBlLT5pc19zdHJpbmcoKSB8fAotICAgICAgdHR5cGUtPmlzX2VudW0oKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLSAgcGFja2FnZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJqYXZhIik7Ci0KLSAgc3RyaW5nIGRpciA9IHBhY2thZ2VfbmFtZV87Ci0gIHN0cmluZyBzdWJkaXIgPSBnZXRfb3V0X2RpcigpOwotICBzdHJpbmc6OnNpemVfdHlwZSBsb2M7Ci0gIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOwotICAgIE1LRElSKHN1YmRpci5jX3N0cigpKTsKLSAgICBkaXIgPSBkaXIuc3Vic3RyKGxvYysxKTsKLSAgfQotICBpZiAoZGlyLnNpemUoKSA+IDApIHsKLSAgICBzdWJkaXIgPSBzdWJkaXIgKyAiLyIgKyBkaXI7Ci0gICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgcGFja2FnZV9kaXJfID0gc3ViZGlyOwotfQotCi0vKioKLSAqIFBhY2thZ2VzIHRoZSBnZW5lcmF0ZWQgZmlsZQotICoKLSAqIEByZXR1cm4gU3RyaW5nIG9mIHRoZSBwYWNrYWdlLCBpLmUuICJwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0ZGVtbzsiCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmphdmFfcGFja2FnZSgpIHsKLSAgaWYgKCFwYWNrYWdlX25hbWVfLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gc3RyaW5nKCJwYWNrYWdlICIpICsgcGFja2FnZV9uYW1lXyArICI7XG5cbiI7Ci0gIH0KLSAgcmV0dXJuICIiOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqCi0gKiBAcmV0dXJuIExpc3Qgb2YgaW1wb3J0cyBmb3IgSmF2YSB0eXBlcyB0aGF0IGFyZSB1c2VkIGluIGhlcmUKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90eXBlX2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygpICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7XG4iICsKLSAgICAiaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjtcblxuIjsKLX0KLQotLyoqCi0gKiBQcmludHMgc3RhbmRhcmQgamF2YSBpbXBvcnRzCi0gKgotICogQHJldHVybiBMaXN0IG9mIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aHJpZnQKLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6amF2YV90aHJpZnRfaW1wb3J0cygpIHsKLSAgcmV0dXJuCi0gICAgc3RyaW5nKCkgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjtcbiIgKwotICAgICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7XG4iICsKLSAgICAiaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qO1xuIiArCi0gICAgImltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qO1xuXG4iOwotfQotCi0vKioKLSAqIE5vdGhpbmcgaW4gSmF2YQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkge30KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEphdmEsIHNpbmNlIGl0IGRvZXMKLSAqIG5vdCBzdXBwb3J0IGFyYml0cmFyeSBuYW1lIHJlcGxhY2VtZW50cywgYW5kIGl0J2QgYmUgYSB3YWNreSB3YXN0ZQotICogb2Ygb3ZlcmhlYWQgdG8gbWFrZSB3cmFwcGVyIGNsYXNzZXMuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogRW51bXMgYXJlIGEgY2xhc3Mgd2l0aCBhIHNldCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRlbnVtLT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX2VudW07Ci0gIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIENvbW1lbnQgYW5kIHBhY2thZ2UgaXQKLSAgZl9lbnVtIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKTsKLQotICBnZW5lcmF0ZV9qYXZhX2RvYyhmX2VudW0sIHRlbnVtKTsKLSAgaW5kZW50KGZfZW51bSkgPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtICI7Ci0gIHNjb3BlX3VwKGZfZW51bSk7Ci0gIGZfZW51bSA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgZmluYWwgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PAotICAgICAgIiAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbmV3ICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwKLSAgICAgICIoIiA8PCB2YWx1ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9lbnVtIDw8IGVuZGw7Ci0KLSAgLy8gRmllbGQgZm9yIHRocmlmdENvZGUKLSAgaW5kZW50KGZfZW51bSkgPDwgInByaXZhdGUgZmluYWwgaW50IHZhbHVlOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJwcml2YXRlICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIihpbnQgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgIHRoaXMudmFsdWUgPSB2YWx1ZTsiIDw8ZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAiICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgaW50IGdldFZhbHVlKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIHZhbHVlOyIgPDxlbmRsOwotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChmX2VudW0pIDw8ICIvKioiIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBGaW5kIGEgdGhlIGVudW0gdHlwZSBieSBpdHMgaW50ZWdlciB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChmX2VudW0pIDw8ICJwdWJsaWMgc3RhdGljICIrIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChmX2VudW0pIDw8ICJzd2l0Y2ggKHZhbHVlKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgImNhc2UgIiA8PCB2YWx1ZSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9lbnVtKSA8PCAiICByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIGluZGVudChmX2VudW0pIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KGZfZW51bSkgPDwgIiAgcmV0dXJuIG51bGw7IiA8PCBlbmRsOyAgCi0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl9lbnVtKSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KGZfZW51bSkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX2VudW0pOwotCi0gIGZfZW51bS5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgaG9sZHMgYWxsIHRoZSBjb25zdGFudHMuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewotICBpZiAoY29uc3RzLmVtcHR5KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiL0NvbnN0YW50cy5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7Ci0gIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHMgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKTsKLQotICBmX2NvbnN0cyA8PAotICAgICJwdWJsaWMgY2xhc3MgQ29uc3RhbnRzIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikgewotICAgIHByaW50X2NvbnN0X3ZhbHVlKGZfY29uc3RzLAotICAgICAgICAgICAgICAgICAgICAgICgqY19pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAoKmNfaXRlciktPmdldF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfY29uc3RzKSA8PAotICAgICJ9IiA8PCBlbmRsOwotICBmX2NvbnN0cy5jbG9zZSgpOwotfQotCi0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpbmRlbnQob3V0KTsKLSAgaWYgKCFkZWZ2YWwpIHsKLSAgICBvdXQgPDwKLSAgICAgIChpbl9zdGF0aWMgPyAiIiA6ICJwdWJsaWMgc3RhdGljIGZpbmFsICIpIDw8Ci0gICAgICB0eXBlX25hbWUodHlwZSkgPDwgIiAiOwotICB9Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB2MiA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIuIjsKLSAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lID0gZ2V0X2NhcF9uYW1lKHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSk7Ci0gICAgICBvdXQgPDwgInNldCIgPDwgY2FwX25hbWUgPDwgIigiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGlmICghaW5fc3RhdGljKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIucHV0KCIgPDwgYm94X3R5cGUoa3R5cGUsIGtleSkgPDwgIiwgIiA8PAotCWJveF90eXBlKHZ0eXBlLCB2YWwpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaWYgKCFpbl9zdGF0aWMpIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiLmFkZEVsZW1lbnQoIiA8PCBib3hfdHlwZShldHlwZSwgdmFsKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCWluZGVudChvdXQpIDw8IG5hbWUgPDwgIi5wdXQoIiA8PAotCSAgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIiwgIiA8PAotCSAgYm94X3R5cGUoZXR5cGUsIHZhbCkgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWluX3N0YXRpYykgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIHR5cGUgIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICh2b2lkKSBuYW1lOwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlbmRlcjsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJlbmRlciA8PCAoKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJlbmRlciA8PCAiKGJ5dGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmVuZGVyIDw8ICIoc2hvcnQpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCkgPDwgIkwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICByZW5kZXIgPDwgIihkb3VibGUpIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZW5kZXIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCBmYWxzZSkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcigpOwotICB9IGVsc2UgewotICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKLSAgICBwcmludF9jb25zdF92YWx1ZShvdXQsIHQsIHR5cGUsIHZhbHVlLCB0cnVlKTsKLSAgICByZW5kZXIgPDwgdDsKLSAgfQotCi0gIHJldHVybiByZW5kZXIuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmJveF90eXBlKHRfdHlwZSogdHlwZSwgc3RyaW5nIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN3aXRjaCAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIm5ldyBCb29sZWFuKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIm5ldyBCeXRlKCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAibmV3IFNob3J0KCIgKyB2YWx1ZSArICIpIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAibmV3IEludGVnZXIoIiArIHZhbHVlICsgIikiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJuZXcgTG9uZygiICsgdmFsdWUgKyAiKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIm5ldyBEb3VibGUoIiArIHZhbHVlICsgIikiOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgd2lsbCBiZSBhIFRCYXNlIAotICogaW1wbGVtZW50b3IuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRzdHJ1Y3QpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGluaGVyaXQgZnJvbSBFeGNlcHRpb24KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKyIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OwotICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zdHJ1Y3QgPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIGphdmFfcGFja2FnZSgpIDw8Ci0gICAgamF2YV90eXBlX2ltcG9ydHMoKSA8PAotICAgIGphdmFfdGhyaWZ0X2ltcG9ydHMoKTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXhjZXB0aW9uKTsKLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBKYXZhIHVuaW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyh0c3RydWN0LT5nZXRfbmFtZSgpKSsiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKLSAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc3RydWN0IDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGJvb2wgaXNfZmluYWwgPSAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLmZpbmQoImZpbmFsIikgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpKTsKLQotICBpbmRlbnQoZl9zdHJ1Y3QpIDw8Ci0gICAgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJmaW5hbCAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLQkgICAgICA8PCAiIGV4dGVuZHMgVFVuaW9uICI7Ci0KLSAgc2NvcGVfdXAoZl9zdHJ1Y3QpOwotCi0gIGdlbmVyYXRlX3N0cnVjdF9kZXNjKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZmllbGRfZGVzY3MoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3IoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhmX3N0cnVjdCwgdHN0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKGZfc3RydWN0LCB0c3RydWN0KTsKLSAgCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUoZl9zdHJ1Y3QsIHRzdHJ1Y3QpOwotCi0gIGZfc3RydWN0IDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3N0cnVjdCk7Ci0KLSAgZl9zdHJ1Y3QuY2xvc2UoKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKCk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIihfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHN1cGVyKHNldEZpZWxkLCB2YWx1ZSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzdXBlcihvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gZ2VuZXJhdGUgImNvbnN0cnVjdG9ycyIgZm9yIGVhY2ggZmllbGQKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgc3RhdGljICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiB4ID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgeC5zZXQiIDw8IGdldF9jYXBfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIodmFsdWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsgCi0gIH0KLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLQotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZ2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgcmV0dXJuICgiIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSkgPDwgIilnZXRGaWVsZFZhbHVlKCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCJDYW5ub3QgZ2V0IGZpZWxkICciIDw8IGZpZWxkLT5nZXRfbmFtZSgpIAotICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIAotICAgIG91dCA8PCBlbmRsOwotCi0gICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKCIgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiIHZhbHVlKSB7IiA8PCBlbmRsOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgc2V0RmllbGRfID0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHZhbHVlXyA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7Ci0gIG91dCA8PCBlbmRsOwotICBnZW5lcmF0ZV93cml0ZV92YWx1ZShvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLSAgZ2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8IGVuZGw7Ci0gIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIGNoZWNrVHlwZShfRmllbGRzIHNldEZpZWxkLCBPYmplY3QgdmFsdWUpIHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24geyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCptX2l0ZXIpOwotICAgIAotICAgIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgIiA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlLCB0cnVlKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgICAgYnJlYWs7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihcIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSAiIAotICAgICAgPDwgdHlwZV9uYW1lKGZpZWxkLT5nZXRfdHlwZSgpLCB0cnVlLCBmYWxzZSkgPDwgIiBmb3IgZmllbGQgJyIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiJywgYnV0IGdvdCBcIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsiIDw8IGVuZGw7Ci0gICAgLy8gZG8gdGhlIHJlYWwgY2hlY2sgaGVyZQotICB9Ci0gIAotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVhZF92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIE9iamVjdCByZWFkVmFsdWUoVFByb3RvY29sIGlwcm90LCBURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoc2V0RmllbGQgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoZmllbGQudHlwZSA9PSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQy50eXBlKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsIGZpZWxkLCAiIik7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBudWxsOyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwgImRlZmF1bHQ6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFwic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhXCIpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJyZXR1cm4gbnVsbDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKHNldEZpZWxkXykgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgIiA8PCBjb25zdGFudF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgZmllbGQtPmdldF9uYW1lKCkgCi0gICAgICA8PCAiID0gKCIgPDwgIHR5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpIDw8ICIpdmFsdWVfOyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCBmaWVsZCwgIiIpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLSAgCi0gIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgXCIgKyBzZXRGaWVsZF8pOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0KLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoc2V0RmllbGQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqbV9pdGVyKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQzsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oXCJVbmtub3duIGZpZWxkIGlkIFwiICsgc2V0RmllbGQpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBUU3RydWN0IGdldFN0cnVjdERlc2MoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gU1RSVUNUX0RFU0M7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIC8vIGVxdWFsaXR5Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZXF1YWxzKCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIilvdGhlcik7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gb3RoZXIgIT0gbnVsbCAmJiBnZXRTZXRGaWVsZCgpID09IG90aGVyLmdldFNldEZpZWxkKCkgJiYgZ2V0RmllbGRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRGaWVsZFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbygiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIG90aGVyKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpbnQgbGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oZ2V0U2V0RmllbGQoKSwgb3RoZXIuZ2V0U2V0RmllbGQoKSk7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICogSWYgeW91J2QgbGlrZSB0aGlzIHRvIHBlcmZvcm0gbW9yZSByZXNwZWN0YWJseSwgdXNlIHRoZSBoYXNoY29kZSBnZW5lcmF0b3Igb3B0aW9uLiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgaGFzaENvZGUoKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gMDsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEphdmEgc3RydWN0IGRlZmluaXRpb24uIFRoaXMgaGFzIHZhcmlvdXMgcGFyYW1ldGVycywgYXMgaXQgY291bGQgYmUKLSAqIGdlbmVyYXRlZCBzdGFuZGFsb25lIG9yIGluc2lkZSBhbm90aGVyIGNsYXNzIGFzIGEgaGVscGVyLiBJZiBpdAotICogaXMgYSBoZWxwZXIgdGhhbiBpdCBpcyBhIHN0YXRpYyBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCAgICAgIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICogQHBhcmFtIGlzX2V4Y2VwdGlvbiBJcyB0aGlzIGFuIGV4Y2VwdGlvbj8KLSAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwotICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKLSAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCB0c3RydWN0KTsKLQotICBib29sIGlzX2ZpbmFsID0gKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gImZpbmFsICIgOiAiIikgPDwKLSAgICAgKGluX2NsYXNzID8gInN0YXRpYyAiIDogIiIpIDw8ICJjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiAiOwotCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgImV4dGVuZHMgRXhjZXB0aW9uICI7Ci0gIH0KLSAgb3V0IDw8ICJpbXBsZW1lbnRzIFRCYXNlICI7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvdXQsIHRzdHJ1Y3QpOwotCi0gIC8vIE1lbWJlcnMgYXJlIHB1YmxpYyBmb3IgLWphdmEsIHByaXZhdGUgZm9yIC1qYXZhYmVhbgotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICI7Ci0gICAgb3V0IDw8IGRlY2xhcmVfZmllbGQoKm1faXRlciwgZmFsc2UpIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBpc3NldCBkYXRhCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIvLyBpc3NldCBpZCBhc3NpZ25tZW50cyIgPDwgZW5kbDsKLQotICAgIGludCBpID0gMDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoIXR5cGVfY2FuX2JlX251bGwoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICIgPDwgaXNzZXRfZmllbGRfaWQoKm1faXRlcikKLSAgICAgICAgICA8PCAiID0gIiA8PCBpIDw8ICI7IiA8PCAgZW5kbDsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID4gMCkgewotICAgICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgYm9vbGVhbltdIF9faXNzZXRfdmVjdG9yID0gbmV3IGJvb2xlYW5bIiA8PCBpIDw8ICJdOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfQotCi0gIGJvb2wgYWxsX29wdGlvbmFsX21lbWJlcnMgPSB0cnVlOwotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwKLSAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCAidGhpcy4iICsgKCptX2l0ZXIpLT5nZXRfbmFtZSgpLCB0LCAoKm1faXRlciktPmdldF92YWx1ZSgpLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgIGFsbF9vcHRpb25hbF9tZW1iZXJzID0gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaWYgKCFtZW1iZXJzLmVtcHR5KCkgJiYgIWFsbF9vcHRpb25hbF9tZW1iZXJzKSB7Ci0gICAgLy8gRnVsbCBjb25zdHJ1Y3RvciBmb3IgYWxsIGZpZWxkcwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgewotICAgICAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAotICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInRoaXMoKTsiIDw8IGVuZGw7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgIGdlbmVyYXRlX2lzc2V0X3NldChvdXQsICgqbV9pdGVyKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgfQotCi0gIC8vIGNvcHkgY29uc3RydWN0b3IKLSAgaW5kZW50KG91dCkgPDwgIi8qKiIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgKi8iIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChoYXNfYml0X3ZlY3Rvcih0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICJTeXN0ZW0uYXJyYXljb3B5KG90aGVyLl9faXNzZXRfdmVjdG9yLCAwLCBfX2lzc2V0X3ZlY3RvciwgMCwgb3RoZXIuX19pc3NldF92ZWN0b3IubGVuZ3RoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKm1faXRlcik7Ci0gICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSA9IGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIHRfdHlwZSogdHlwZSA9IGZpZWxkLT5nZXRfdHlwZSgpOwotICAgIGJvb2wgY2FuX2JlX251bGwgPSB0eXBlX2Nhbl9iZV9udWxsKHR5cGUpOwotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKG90aGVyLiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCAib3RoZXIiLCBmaWVsZF9uYW1lLCAiX190aGlzX18iICsgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IF9fdGhpc19fIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsICJvdGhlci4iICsgZmllbGRfbmFtZSwgZmllbGRfbmFtZSwgdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaWYgKGNhbl9iZV9udWxsKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBjbG9uZSBtZXRob2QsIHNvIHRoYXQgeW91IGNhbiBkZWVwIGNvcHkgYW4gb2JqZWN0IHdoZW4geW91IGRvbid0IGtub3cgaXRzIGNsYXNzLgotICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIGRlZXBDb3B5KCkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIG5ldyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIih0aGlzKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMob3V0LCB0c3RydWN0KTsKLQotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGlmIChpc19yZXN1bHQpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0gZWxzZSB7Ci0gICAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIH0KLSAgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3V0LCB0c3RydWN0KTsKLSAgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgZXF1YWxzIG1ldGhvZHMgYW5kIGEgaGFzaENvZGUgbWV0aG9kIGZvciBhIHN0cnVjdHVyZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAodGhhdCBpbnN0YW5jZW9mICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0aGlzLmVxdWFscygoIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpdGhhdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24ob3V0KTsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscygiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiB0aGF0KSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICh0aGF0ID09IG51bGwpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgLy8gTW9zdCBleGlzdGluZyBUaHJpZnQgY29kZSBkb2VzIG5vdCB1c2UgaXNzZXQgb3Igb3B0aW9uYWwvcmVxdWlyZWQsCi0gICAgLy8gc28gd2UgdHJlYXQgImRlZmF1bHQiIGZpZWxkcyBhcyByZXF1aXJlZC4KLSAgICBib29sIGlzX29wdGlvbmFsID0gKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBib29sIGNhbl9iZV9udWxsID0gdHlwZV9jYW5fYmVfbnVsbCh0KTsKLSAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIHN0cmluZyB0aGlzX3ByZXNlbnQgPSAidHJ1ZSI7Ci0gICAgc3RyaW5nIHRoYXRfcHJlc2VudCA9ICJ0cnVlIjsKLSAgICBzdHJpbmcgdW5lcXVhbDsKLQotICAgIGlmIChpc19vcHRpb25hbCB8fCBjYW5fYmVfbnVsbCkgewotICAgICAgdGhpc19wcmVzZW50ICs9ICIgJiYgdGhpcy4iICsgZ2VuZXJhdGVfaXNzZXRfY2hlY2soKm1faXRlcik7Ci0gICAgICB0aGF0X3ByZXNlbnQgKz0gIiAmJiB0aGF0LiIgKyBnZW5lcmF0ZV9pc3NldF9jaGVjaygqbV9pdGVyKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJib29sZWFuIHRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiA9ICIKLSAgICAgICAgICAgICAgIDw8IHRoaXNfcHJlc2VudCA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgImJvb2xlYW4gdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiID0gIgotICAgICAgICAgICAgICAgPDwgdGhhdF9wcmVzZW50IDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgfHwgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImlmICghKCIgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUKLSAgICAgICAgICAgICAgIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICB1bmVxdWFsID0gIlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgKyBuYW1lICsgIiwgdGhhdC4iICsKLQluYW1lICsgIikgIT0gMCI7Ci0gICAgfSBlbHNlIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgdW5lcXVhbCA9ICIhdGhpcy4iICsgbmFtZSArICIuZXF1YWxzKHRoYXQuIiArIG5hbWUgKyAiKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVuZXF1YWwgPSAidGhpcy4iICsgbmFtZSArICIgIT0gdGhhdC4iICsgbmFtZTsKLSAgICB9Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoIiA8PCB1bmVxdWFsIDw8ICIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0gIG91dCA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOwotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGludCBoYXNoQ29kZSgpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyT2JqZWN0KSB7IiA8PCBlbmRsOwotICAvLyAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgY29tcGFyZVRvKCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyT2JqZWN0LmdldENsYXNzKCkpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIgb3RoZXIgPSAoIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIilvdGhlck9iamVjdDsiOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnQgbGFzdENvbXBhcmlzb24gPSAwOyIgPDwgZW5kbDsKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKm1faXRlcjsKLSAgICBpbmRlbnQob3V0KSA8PCAibGFzdENvbXBhcmlzb24gPSBUQmFzZUhlbHBlci5jb21wYXJlVG8oIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIiwgb3RoZXIuIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjayhmaWVsZCkgPDwgIik7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKGZpZWxkKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfc3RydWN0KCkgfHwgZmllbGQtPmdldF90eXBlKCktPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIGxhc3RDb21wYXJpc29uID0gdGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIuY29tcGFyZVRvKG90aGVyLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBsYXN0Q29tcGFyaXNvbiA9IFRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgb3RoZXIuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgICByZXR1cm4gbGFzdENvbXBhcmlzb247IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIDA7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhbGwgdGhlIGZpZWxkcyBvZiB0aGUgc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICAvLyBEZWNsYXJlIHN0YWNrIHRtcCB2YXJpYWJsZXMgYW5kIHJlYWQgc3RydWN0IGhlYWRlcgotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLSAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RPUCkgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhazsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIn0iIDw8IGVuZGw7Ci0KLSAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkLmlkKSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiAvLyAiIDw8IGNvbnN0YW50X25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiaWYgKGZpZWxkLnR5cGUgPT0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMuIik7Ci0gICAgICBnZW5lcmF0ZV9pc3NldF9zZXQob3V0LCAqZl9pdGVyKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0gZWxzZSB7ICIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIC8vIHBlcmZvcm1zIHZhcmlvdXMgY2hlY2tzIChlLmcuIGNoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0KQotICAgIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCi0vLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpewotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8ICIvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmICgoKmZfaXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygqZl9pdGVyKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oXCJSZXF1aXJlZCBmaWVsZCAnIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicgaXMgdW5zZXQhIFN0cnVjdDpcIiArIHRvU3RyaW5nKCkpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdAotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gIGluZGVudChvdXQpIDw8ICJ2YWxpZGF0ZSgpOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgIH0KLSAgICBib29sIG9wdGlvbmFsID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBnZW5lcmF0ZV9pc3NldF9jaGVjaygoKmZfaXRlcikpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpZiAobnVsbF9hbGxvd2VkKSB7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZUZpZWxkU3RvcCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gd3JpdGUgYWxsIHRoZSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwKLSAqIHdoaWNoIGlzIGEgZnVuY3Rpb24gcmVzdWx0LiBUaGVzZSBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbgotICogaWYgdGhleSBhcmUgc2V0IGluIHRoZSBJc3NldCBhcnJheSwgYW5kIG9ubHkgb25lIG9mIHRoZW0KLSAqIGNhbiBiZSBzZXQgYXQgYSB0aW1lLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7IiA8PCBlbmRsOwotCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIG91dCA8PAotICAgICAgICBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIiBlbHNlIGlmICI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIodGhpcy4iIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICAKLSAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qud3JpdGVGaWVsZEJlZ2luKCIgPDwgY29uc3RhbnRfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICJfRklFTERfREVTQyk7IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNsb3NlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iOwotICB9Ci0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKG9zdHJpbmdzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgZmllbGRfbmFtZSwgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGluZGVudChvdXQpIDw8ICJjYXNlICIgPDwgY29uc3RhbnRfbmFtZShmaWVsZF9uYW1lKSA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0eXBlLT5pc19zdHJpbmcoKSkgewotICAgIHRfYmFzZV90eXBlKiBiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR5cGU7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCBmYWxzZSkgPDwgIigiIDw8IChiYXNlX3R5cGUtPmlzX2Jvb2woKSA/ICJpcyIgOiAiZ2V0IikgPDwgY2FwX25hbWUgPDwgIigpKTsiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGdldCIgPDwgY2FwX25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhvc3RyaW5nc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGZpZWxkX25hbWUsIHN0cmluZyBjYXBfbmFtZSkgewotICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgIHVuc2V0IiA8PCBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgPDwgIigpOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoKCIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiKXZhbHVlKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgKHZvaWQpIG91dDsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzZXR0ZXJfc3RyZWFtOwotCi0gIC8vIGJ1aWxkIHVwIHRoZSBib2RpZXMgb2YgYm90aCB0aGUgZ2V0dGVyIGFuZCBzZXR0ZXIgYXQgb25jZQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzZXR0ZXJfc3RyZWFtLCB0eXBlLCBmaWVsZF9uYW1lLCBjYXBfbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcmVmbGVjdGlvbl9nZXR0ZXJzKGdldHRlcl9zdHJlYW0sIHR5cGUsIGZpZWxkX25hbWUsIGNhcF9uYW1lKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXQgb2YgSmF2YSBCZWFuIGJvaWxlcnBsYXRlIGZ1bmN0aW9ucyAoc2V0dGVycywgZ2V0dGVycywgZXRjLikKLSAqIGZvciB0aGUgZ2l2ZW4gc3RydWN0LgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAqZl9pdGVyOwotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpOwotICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUgPSBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSA9IGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKTsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29sbGVjdGlvbgotICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbnQgZ2V0IiA8PCBjYXBfbmFtZTsKLSAgICAgIG91dCA8PCBnZXRfY2FwX25hbWUoInNpemUoKSB7IikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpID8gMCA6ICIgPDwKLSAgICAgICAgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIuc2l6ZSgpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIGlmICh0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkpIHsKLQotICAgICAgdF90eXBlKiBlbGVtZW50X3R5cGU7Ci0gICAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZWxlbWVudF90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVsZW1lbnRfdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgICAgfQotCi0gICAgICAvLyBJdGVyYXRvciBnZXR0ZXIgZm9yIHNldHMgYW5kIGxpc3RzCi0gICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIEVudW1lcmF0aW9uIGdldCIgPDwgY2FwX25hbWU7Ci0gICAgICBvdXQgPDwgZ2V0X2NhcF9uYW1lKCJFbnVtZXJhdGlvbigpIHsiKSA8PCBlbmRsOwotCi0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgPyBudWxsIDogIiA8PAotICAgICAgICAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5lbGVtZW50cygpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgICAvLyBBZGQgdG8gc2V0IG9yIGxpc3QsIGNyZWF0ZSBpZiB0aGUgc2V0L2xpc3QgaXMgbnVsbAotICAgICAgaW5kZW50KG91dCk7Ci0gICAgICBvdXQgPDwgInB1YmxpYyB2b2lkIGFkZCIgPDwgZ2V0X2NhcF9uYW1lKCJ0byIpOwotICAgICAgb3V0IDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlKSA8PCAiIGVsZW0pIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PAotICAgICAgICAiKCk7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIucHV0KCIgPDwKLQkgIGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiLCAiIDw8Ci0JICBib3hfdHlwZShlbGVtZW50X3R5cGUsICJlbGVtIikgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLQlpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwKLQkgIGJveF90eXBlKGVsZW1lbnRfdHlwZSwgImVsZW0iKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIC8vIFB1dCB0byBtYXAKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotCi0gICAgICBpbmRlbnQob3V0KTsKLSAgICAgIG91dCA8PCAicHVibGljIHZvaWQgcHV0VG8iCi0JICA8PCBjYXBfbmFtZSA8PCAiKCIgPDwgdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSA8PCAiIGtleSwgIgotCSAgPDwgdHlwZV9uYW1lKHZhbF90eXBlLCB0cnVlKSA8PCAiIHZhbCkgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PAotICAgICAgICB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5wdXQoa2V5LCB2YWwpOyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFNpbXBsZSBnZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJgotICAgICAgICAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSB7Ci0gICAgICBvdXQgPDwgIiBpcyI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiIGdldCI7Ci0gICAgfQotICAgIG91dCA8PCBjYXBfbmFtZSA8PCAiKCkgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICI7IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIFNpbXBsZSBzZXR0ZXIKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICI7Ci0gICAgb3V0IDw8ICJ2b2lkIjsKLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiOyIgPDwKLSAgICAgIGVuZGw7Ci0gICAgZ2VuZXJhdGVfaXNzZXRfc2V0KG91dCwgZmllbGQpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgLy8gVW5zZXR0ZXIKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgdW5zZXQiIDw8IGNhcF9uYW1lIDw8ICIoKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiX19pc3NldF92ZWN0b3JbIiA8PCBpc3NldF9maWVsZF9pZChmaWVsZCkgPDwgIl0gPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIC8vIGlzU2V0IG1ldGhvZAotICAgIGluZGVudChvdXQpIDw8ICIvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkICIgPDwgZmllbGRfbmFtZSA8PCAiIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLyIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGJvb2xlYW4gaXMiIDw8IGdldF9jYXBfbmFtZSgic2V0IikgPDwgY2FwX25hbWUgPDwgIigpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiAhPSBudWxsOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiBfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXQiIDw8IGNhcF9uYW1lIDw8IGdldF9jYXBfbmFtZSgiaXNTZXQiKSA8PCAiKGJvb2xlYW4gdmFsdWUpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKHR5cGVfY2FuX2JlX251bGwodHlwZSkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIXZhbHVlKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJfX2lzc2V0X3ZlY3RvclsiIDw8IGlzc2V0X2ZpZWxkX2lkKGZpZWxkKSA8PCAiXSA9IHZhbHVlOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOyAKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRvU3RyaW5nKCkgbWV0aG9kIGZvciB0aGUgZ2l2ZW4gc3RydWN0Ci0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiKTsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiYm9vbGVhbiBmaXJzdCA9IHRydWU7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBib29sIGNvdWxkX2JlX3Vuc2V0ID0gKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGdlbmVyYXRlX2lzc2V0X2NoZWNrKCpmX2l0ZXIpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWZpcnN0KSBzYi5hcHBlbmQoXCIsIFwiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQoXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOlwiKTsiIDw8IGVuZGw7Ci0gICAgYm9vbCBjYW5fYmVfbnVsbCA9IHR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50KG91dCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHNiLmFwcGVuZChcIm51bGxcIik7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgfQotICAgIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICJzYi5hcHBlbmQodGhpcy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIAotICAgIGlmIChjYW5fYmVfbnVsbCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCAiZmlyc3QgPSBmYWxzZTsiIDw8IGVuZGw7Ci0KLSAgICBpZihjb3VsZF9iZV91bnNldCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLSAgICBmaXJzdCA9IGZhbHNlOwotICB9Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJzYi5hcHBlbmQoXCIpXCIpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gc2IudG9TdHJpbmcoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKiogCi0gKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRocmlmdCB0eXBlCi0gKiAoZS5nLiBmb3IgdGhlIHR5cGUgc3RydWN0IGl0IHJldHVybnMgIlRUeXBlLlNUUlVDVCIpCi0gKi8KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19saXN0KCkpewotICAgIHJldHVybiAiVFR5cGUuTElTVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGUuU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLkVOVU0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiBnZXRfamF2YV90eXBlX3N0cmluZygoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEICAgOiByZXR1cm4gICAgICAiVFR5cGUuVk9JRCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgOiByZXR1cm4gICAgIlRUeXBlLlNUUklORyI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MICAgOiByZXR1cm4gICAgICAiVFR5cGUuQk9PTCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFICAgOiByZXR1cm4gICAgICAiVFR5cGUuQllURSI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkxNiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkkzMiI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQgICAgOiByZXR1cm4gICAgICAgIlRUeXBlLkk2NCI7IGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUgOiByZXR1cm4gICAgIlRUeXBlLkRPVUJMRSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCA6IHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiVW5rbm93biB0aHJpZnQgdHlwZSBcIiIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIlwiIHBhc3NlZCB0byB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISIpOyBicmVhazsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKSArICJcIiBwYXNzZWQgdG8gdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZXRfamF2YV90eXBlX3N0cmluZyEiKTsgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQotICB9Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpewotICBvdXQgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudF91cCgpOwotICBpZiAodHlwZS0+aXNfc3RydWN0KCkpewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgU3RydWN0TWV0YURhdGEoVFR5cGUuU1RSVUNULCAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiLmNsYXNzIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSl7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSl7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IExpc3RNZXRhRGF0YShUVHlwZS5MSVNULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsgICAgCi0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCBlbGVtX3R5cGUpOyAgIAotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpewotICAgICAgaW5kZW50KG91dCkgPDwgIm5ldyBTZXRNZXRhRGF0YShUVHlwZS5TRVQsICI7Ci0gICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOyAgICAKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7IAotICAgIH0gZWxzZXsgLy8gbWFwCi0gICAgICBpbmRlbnQob3V0KSA8PCAibmV3IE1hcE1ldGFEYXRhKFRUeXBlLk1BUCwgIjsKLSAgICAgIHRfdHlwZSoga2V5X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgICB0X3R5cGUqIHZhbF90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgICAgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKG91dCwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICIsICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEob3V0LCB2YWxfdHlwZSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRW51bU1ldGFEYXRhKFRUeXBlLkVOVU0sICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIuY2xhc3MiOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJuZXcgRmllbGRWYWx1ZU1ldGFEYXRhKCIgPDwgZ2V0X2phdmFfdHlwZV9zdHJpbmcodHlwZSk7Ci0gICAgaWYgKHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiwgXCIiIDw8ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3N5bWJvbGljKCkgPDwgIlwiIjsKLSAgICB9Ci0gIH0KLSAgb3V0IDw8ICIpIjsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLiBJbiBDKyssIHRoaXMgY29tcHJpc2VzIGFuIGVudGlyZWx5IHNlcGFyYXRlCi0gKiBoZWFkZXIgYW5kIHNvdXJjZSBmaWxlLiBUaGUgaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgbWV0aG9kcyBhbmQgaW5jbHVkZXMKLSAqIHRoZSBkYXRhIHR5cGVzIGRlZmluZWQgaW4gdGhlIG1haW4gaGVhZGVyIGZpbGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24KLSAqIGZpbGUgY29udGFpbnMgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBwcmludGVyIGFuZCBkZWZhdWx0IGludGVyZmFjZXMuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLmphdmEiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgamF2YV9wYWNrYWdlKCkgPDwKLSAgICBqYXZhX3R5cGVfaW1wb3J0cygpIDw8Ci0gICAgamF2YV90aHJpZnRfaW1wb3J0cygpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAicHVibGljIGNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiIHsiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcmltaXRpdmVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIGV4dGVuZHMgIiA8PAotICAgIHNlcnZpY2VfbmFtZV8gPDwgIklmYWNlIHsgfSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0cmluZyBmX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICJJZmFjZS5qYXZhIjsKLSAgc3RkOjpvZnN0cmVhbSBmX2lmYWNlOwotICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHNfaWZhY2UgPSAiIGV4dGVuZHMgIiArIHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgKyAiSWZhY2UiOwotICB9Ci0gIAotICBmX2lmYWNlIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqYXZhX3BhY2thZ2UoKSA8PAotICAgIGphdmFfdHlwZV9pbXBvcnRzKCkgPDwKLSAgICBqYXZhX3RocmlmdF9pbXBvcnRzKCk7Ci0gIGdlbmVyYXRlX2phdmFfZG9jKGZfaWZhY2UsIHRzZXJ2aWNlKTsKLSAgZl9pZmFjZSA8PAotICAgICJwdWJsaWMgaW50ZXJmYWNlICIgPDwgc2VydmljZV9uYW1lXyA8PCAiSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKGZfaWZhY2UsICpmX2l0ZXIpOwotICAgIGZfaWZhY2UgPDwgIiAgcHVibGljICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLSAgZl9pZmFjZSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmYWNlID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19pZmFjZSA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuSWZhY2UiOwotICB9Ci0KLSAgZ2VuZXJhdGVfamF2YV9kb2MoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElmYWNlIiA8PCBleHRlbmRzX2lmYWNlIDw8Ci0gICAgIiB7IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgc3RydWN0cyBmb3IgYWxsIHRoZSBzZXJ2aWNlIGFyZ3MgYW5kIHJldHVybiB0eXBlcwotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZQotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICIgZXh0ZW5kcyAiICsgZXh0ZW5kcyArICIuQ2xpZW50IjsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIiBpbXBsZW1lbnRzIFRTZXJ2aWNlQ2xpZW50LCBJZmFjZSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAidGhpcyhwcm90LCBwcm90KTsiIDw8IGVuZGw7Ci0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIENsaWVudChUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImlwcm90XyA9IGlwcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90XyA9IG9wcm90OyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic3VwZXIoaXByb3QsIG9wcm90KTsiIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIFRQcm90b2NvbCBpcHJvdF87IiAgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCBUUHJvdG9jb2wgb3Byb3RfOyIgIDw8IGVuZGwgPDwKLSAgICAgIGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgaW50IHNlcWlkXzsiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgVFByb3RvY29sIGdldElucHV0UHJvdG9jb2woKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJyZXR1cm4gdGhpcy5pcHJvdF87IiA8PCBlbmRsOwotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIFRQcm90b2NvbCBnZXRPdXRwdXRQcm90b2NvbCgpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInJldHVybiB0aGlzLm9wcm90XzsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgIC8vIEdldCB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIGNhbGwgcGFyYW1zCi0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0KLSAgICAvLyBEZWNsYXJlIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKSk7Ci0KLSAgICBzdHJpbmcgYXJnc25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdAotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkNBTEwsICsrc2VxaWRfKSk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImFyZ3Muc2V0IiA8PCBnZXRfY2FwX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIoIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUob3Byb3RfKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3RfLmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0cmluZyByZXN1bHRuYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKSk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24ucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgeDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkJBRF9TRVFVRU5DRV9JRCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlXCIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZChpcHJvdF8pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAocmVzdWx0LiIgPDwgZ2VuZXJhdGVfaXNzZXRfY2hlY2soInN1Y2Nlc3MiKSA8PCAiKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgdGhyb3cgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHlvdSBnZXQgaGVyZSBpdCdzIGFuIGV4Y2VwdGlvbiwgdW5sZXNzIGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJyZXR1cm47IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIHNlcnZlciBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIC8vIEV4dGVuZHMgc3R1ZmYKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIGV4dGVuZHMgKyAiLlByb2Nlc3NvciI7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc29yIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiIGltcGxlbWVudHMgVFByb2Nlc3NvciB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIFByb2Nlc3NvcihJZmFjZSBpZmFjZSkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJzdXBlcihpZmFjZSk7IiA8PCBlbmRsOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaWZhY2VfID0gaWZhY2U7IiA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLnB1dChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgbmV3ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb247IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJZmFjZSBpZmFjZV87IiA8PCBlbmRsOwotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZpbmFsIEhhc2h0YWJsZSBwcm9jZXNzTWFwXyA9IG5ldyBIYXNodGFibGUoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiVE1lc3NhZ2UgbXNnID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbDsKLQotICAvLyBUT0RPKG1jc2xlZSk6IHZhbGlkYXRlIG1lc3NhZ2UsIHdhcyB0aGUgc2VxaWQgZXRjLiBsZWdpdD8KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbiA9IChQcm9jZXNzRnVuY3Rpb24pcHJvY2Vzc01hcF8uZ2V0KG1zZy5uYW1lKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaWYgKGZuID09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIFRUeXBlLlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELCBcIkludmFsaWQgbWV0aG9kIG5hbWU6ICdcIittc2cubmFtZStcIidcIik7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImZuLnByb2Nlc3MobXNnLnNlcWlkLCBpcHJvdCwgb3Byb3QpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLQotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUsIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHByb2Nlc3MgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbiB0byB3cml0ZSBhIGRpc3BhdGNoZXIgZm9yCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLSAgLy8gT3BlbiBjbGFzcwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAicHJpdmF0ZSBjbGFzcyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIGltcGxlbWVudHMgUHJvY2Vzc0Z1bmN0aW9uIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgInB1YmxpYyB2b2lkIHByb2Nlc3MoaW50IHNlcWlkLCBUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24iIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCBhcmdzbmFtZSA8PCAiIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInRyeSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PCAKLSAgICBpbmRlbnQoKSA8PCAifSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uIGUpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uUFJPVE9DT0xfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCByZXN1bHRuYW1lIDw8ICIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgImlmYWNlXy4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gIC8vIFNldCBpc3NldCBvbiBzdWNjZXNzIGZpZWxkCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgJiYgIXR5cGVfY2FuX2JlX251bGwodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuc2V0IiA8PCBnZXRfY2FwX25hbWUoInN1Y2Nlc3MiKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIih0cnVlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgY2F0Y2ggKCIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSA8PCAiICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJ9IjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiIGNhdGNoIChUaHJvd2FibGUgdGgpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIFwiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ4LndyaXRlKG9wcm90KTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gU2hvcnRjdXQgb3V0IGhlcmUgZm9yIG9uZXdheSBmdW5jdGlvbnMKLSAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgLy8gQ2xvc2UgY2xhc3MKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIHJldHVybjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAvLyBDbG9zZSBmdW5jdGlvbgotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgY2xhc3MKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsKLSAgICAgICAgICBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoISgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCBuYW1lIDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUsIGZhbHNlKSArICIuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5yZWFkKGlwcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgc3RyaW5nIG9iajsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfbWFwIik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb2JqID0gdG1wKCJfc2V0Iik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIG9iaiA9IHRtcCgiX2xpc3QiKTsKLSAgfQotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIlRNYXAgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVFNldCAiIDw8IG9iaiA8PCAiID0gaXByb3QucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiVExpc3QgIiA8PCBvYmogPDwgIiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KQotICAgIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkKLSAgICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQotICAgIDw8ICIoIgotICAgIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiICkKLSAgICA8PCBvYmogPDwgIi5zaXplIgotICAgIDw8ICIpOyIgPDwgZW5kbDsKLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKGludCAiIDw8IGkgPDwgIiA9IDA7ICIgPDwKLSAgICBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLnNpemUiIDw8ICI7ICIgPDwKLSAgICAiKysiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9Ci0KLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwotICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7Ci0gIHRfZmllbGQgZnZhbCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZnZhbCkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5wdXQoIiA8PAotICAgIGJveF90eXBlKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIsICIgPDwKLSAgICBib3hfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdmFsKSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwotICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBwcmVmaXggPDwgIi5wdXQoIiA8PAotICAgIGJveF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIiwgIiA8PAotICAgIGJveF90eXBlKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSkgPDwgIik7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZEVsZW1lbnQoIiA8PAotICAgIGJveF90eXBlKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pIDw8ICIpOyIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZUkzMigiIDw8IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLmdldFZhbHVlKCkpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgewotICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEphdmEgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSB3cml0aW5nIGl0cyBzaXplIHRoZW4gdGhlIGVsZW1lbnRzLgotICoKLSAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCi0gKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4obmV3IFRNYXAoIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEJlZ2luKG5ldyBUU2V0KCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgcHJlZml4IDw8ICIuc2l6ZSgpKSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBUTGlzdCgiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICBwcmVmaXggPDwgIi5zaXplKCkpKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgaXRlciA9IHRtcCgiX2l0ZXIiKTsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKLSAgICBzdHJpbmcga2V5X3R5cGUgPSB0eXBlX25hbWUoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdHJ1ZSwgZmFsc2UpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyIDw8ICIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgIjsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpCi0gICAgICA8PCBrZXlfdHlwZSA8PCAiICIgPDwgaXRlciA8PCAiID0gKCIgPDwga2V5X3R5cGUgPDwgIikiIDw8IGVudW1lciA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKLSAgICBzdHJpbmcgZWxlX3R5cGUgPSB0eXBlX25hbWUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB0cnVlKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIua2V5cygpOyAiIDw8IGVudW1lciA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApICI7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KQotICAgICAgPDwgZWxlX3R5cGUgPDwgIiAiIDw8IGl0ZXIgPDwgIiA9ICgiCi0gICAgICA8PCBlbGVfdHlwZSA8PCAiKSIgPDwgZW51bWVyIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBlbnVtZXIgPSBpdGVyICsgIl9lbnVtIjsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAoRW51bWVyYXRpb24gIiA8PCBlbnVtZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICIuZWxlbWVudHMoKTsgIiA8PCBlbnVtZXIgPDwgIi5oYXNNb3JlRWxlbWVudHMoKTsgKSAiOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgc3RyaW5nIGVsZV90eXBlID0gdHlwZV9uYW1lKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IGVsZV90eXBlIDw8ICIgIiA8PCBpdGVyIDw8ICIgPSAoIgotICAgICAgPDwgZWxlX3R5cGUgPDwgIikiIDw8IGVudW1lciA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGl0ZXIsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qud3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7Ci0gIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotICBzdHJpbmcgdmFsX3R5cGUgPSB0eXBlX25hbWUodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHRydWUsIGZhbHNlKTsKLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksICIoKCIgKyB2YWxfdHlwZSArICIpIiArIG1hcCArICIuZ2V0KCIgKyBpdGVyICsgIikpIik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhIEphdmEgdHlwZSBuYW1lCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKiBAcGFyYW0gY29udGFpbmVyIElzIHRoZSB0eXBlIGdvaW5nIGluc2lkZSBhIGNvbnRhaW5lcj8KLSAqIEByZXR1cm4gSmF2YSB0eXBlIG5hbWUsIGkuZS4gVmVjdG9yCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0LCBib29sIHNraXBfZ2VuZXJpYykgewotICAodm9pZCkgaW5faW5pdDsKLSAgKHZvaWQpIHNraXBfZ2VuZXJpYzsKLSAgLy8gSW4gSmF2YSB0eXBlZGVmcyBhcmUganVzdCByZXNvbHZlZCB0byB0aGVpciByZWFsIHR5cGUKLSAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuIGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUsIGluX2NvbnRhaW5lcik7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJIYXNodGFibGUiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiSGFzaHRhYmxlIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJWZWN0b3IiOwotICB9Ci0KLSAgLy8gQ2hlY2sgZm9yIG5hbWVzcGFjaW5nCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBzdHJpbmcgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKTsKLSAgICBpZiAoIXBhY2thZ2UuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHBhY2thZ2UgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgQysrIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEBwYXJhbSBjb250YWluZXIgSXMgaXQgZ29pbmcgaW4gYSBKYXZhIGNvbnRhaW5lcj8KLSAqLwotc3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXIpIHsKLSAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHR5cGUtPmdldF9iYXNlKCk7Ci0KLSAgc3dpdGNoICh0YmFzZSkgewotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgcmV0dXJuICJ2b2lkIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgaWYgKCF0eXBlLT5pc19iaW5hcnkoKSkgewotICAgICAgcmV0dXJuICJTdHJpbmciOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gImJ5dGVbXSI7Ci0gICAgfQotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQm9vbGVhbiIgOiAiYm9vbGVhbiIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiQnl0ZSIgOiAiYnl0ZSIpOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gKGluX2NvbnRhaW5lciA/ICJTaG9ydCIgOiAic2hvcnQiKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiSW50ZWdlciIgOiAiaW50Iik7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgIHJldHVybiAoaW5fY29udGFpbmVyID8gIkxvbmciIDogImxvbmciKTsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgcmV0dXJuIChpbl9jb250YWluZXIgPyAiRG91YmxlIiA6ICJkb3VibGUiKTsKLSAgZGVmYXVsdDoKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMrKyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQpIHsKLSAgLy8gVE9ETyhtY3NsZWUpOiBkbyB3ZSBldmVyIG5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQ/Ci0gIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKLSAgICAgIHJlc3VsdCArPSAiID0gIiArIHJlbmRlcl9jb25zdF92YWx1ZShkdW1teSwgdGZpZWxkLT5nZXRfbmFtZSgpLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IChkb3VibGUpMCI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjs7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHR5cGUgPSB0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCk7Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdCA9Ci0gICAgdHlwZV9uYW1lKHR0eXBlKSArICIgIiArIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIHRocm93cyAiOwotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgIHJlc3VsdCArPSB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UpICsgIiwgIjsKLSAgfQotICByZXN1bHQgKz0gIlRFeGNlcHRpb24iOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBjb21tYSBzZXBhcmF0ZWQgZmllbGQgbGlzdCwgd2l0aCB0eXBlIG5hbWVzCi0gKi8KLXN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaW5jbHVkZV90eXBlcykgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICBpZiAoaW5jbHVkZV90eXBlcykgewotICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqCi0gKiBBcHBsaWVzIHRoZSBjb3JyZWN0IHN0eWxlIHRvIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBub2NhbWVsX3N0eWxlXwotICovCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OmdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKXsKLSAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpjb25zdGFudF9uYW1lKHN0cmluZyBuYW1lKSB7Ci0gIHN0cmluZyBjb25zdGFudF9uYW1lOwotCi0gIGJvb2wgaXNfZmlyc3QgPSB0cnVlOwotICBib29sIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gZmFsc2U7Ci0gIGZvciAoc3RyaW5nOjppdGVyYXRvciBpdGVyID0gbmFtZS5iZWdpbigpOyBpdGVyICE9IG5hbWUuZW5kKCk7ICsraXRlcikgewotICAgIHN0cmluZzo6dmFsdWVfdHlwZSBjaGFyYWN0ZXIgPSAoKml0ZXIpOwotCi0gICAgYm9vbCBpc191cHBlciA9IGlzdXBwZXIoY2hhcmFjdGVyKTsKLQotICAgIGlmIChpc191cHBlciAmJiAhaXNfZmlyc3QgJiYgIXdhc19wcmV2aW91c19jaGFyX3VwcGVyKSB7Ci0gICAgICBjb25zdGFudF9uYW1lICs9ICdfJzsKLSAgICB9Ci0gICAgY29uc3RhbnRfbmFtZSArPSB0b3VwcGVyKGNoYXJhY3Rlcik7Ci0KLSAgICBpc19maXJzdCA9IGZhbHNlOwotICAgIHdhc19wcmV2aW91c19jaGFyX3VwcGVyID0gaXNfdXBwZXI7Ci0gIH0KLQotICByZXR1cm4gY29uc3RhbnRfbmFtZTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Ci0gIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAiLyoqXG4iLAotICAgICIgKiAiLCBjb250ZW50cywKLSAgICAiICovXG4iKTsKLX0KLQotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7Ci0gICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgKHRfZG9jKilmaWVsZCk7Ci0gIH0KLX0KLQotLyoqCi0gKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKLSAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKSB7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKLSAgfQotfQotCi0vKioKLSAqIEVtaXRzIGEgSmF2YURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAotICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewotICAgIHN0cmluZ3N0cmVhbSBzczsKLSAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgcF9pdGVyOwotICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKLSAgICAgIHNzIDw8ICJcbkBwYXJhbSAiIDw8IHAtPmdldF9uYW1lKCk7Ci0gICAgICBpZiAocC0+aGFzX2RvYygpKSB7Ci0gICAgICAgIHNzIDw8ICIgIiA8PCBwLT5nZXRfZG9jKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwKLSAgICAgICIvKipcbiIsCi0gICAgICAiICogIiwgc3Muc3RyKCksCi0gICAgICAiICovXG4iKTsKLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsIHRfdHlwZSogdHlwZSkgewotCi0gIHRfY29udGFpbmVyKiBjb250YWluZXIgPSAodF9jb250YWluZXIqKXR5cGU7Ci0gIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lOwotICBpZiAoc291cmNlX25hbWVfcDIgPT0gIiIpCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxOwotICBlbHNlCi0gICAgICBzb3VyY2VfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIi4iICsgc291cmNlX25hbWVfcDI7Ci0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOwotCi0gIHN0ZDo6c3RyaW5nIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbGVtZW50IjsKLSAgc3RkOjpzdHJpbmcgZW51bWVyYXRpb25fbmFtZSA9IHNvdXJjZV9uYW1lX3AxICsgIl9lbnVtIjsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0X2VsZW1lbnRfbmFtZSA9IHJlc3VsdF9uYW1lICsgIl9jb3B5IjsKLQotICBpZihjb250YWluZXItPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKWNvbnRhaW5lciktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKiljb250YWluZXIpLT5nZXRfdmFsX3R5cGUoKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUgPDwgIi5rZXlzKCk7ICIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShrZXlfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl9rZXkgPSAoIiA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiKSIgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLm5leHRFbGVtZW50KCk7IiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCBpdGVyYXRvcl9lbGVtZW50X25hbWUgPDwgIl92YWx1ZSA9ICgiCi0JCTw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmdldCgiIDw8IGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSA8PCAiX2tleSk7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpZiAoa2V5X3R5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lICsgIl9rZXkiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoa2V5X3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX2tleSA9ICI7Ci0gICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfa2V5IiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfa2V5Iiwga2V5X3R5cGUpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaWYgKHZhbF90eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X2NvbnRhaW5lcihvdXQsIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCAiIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZSh2YWxfdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfZWxlbWVudF9uYW1lIDw8ICJfdmFsdWUgPSAiOwotICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUgKyAiX3ZhbHVlIiwgcmVzdWx0X2VsZW1lbnRfbmFtZSArICJfdmFsdWUiLCB2YWxfdHlwZSk7Ci0gICAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PCByZXN1bHRfbmFtZSA8PCAiLnB1dCgiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIl9rZXksICIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiX3ZhbHVlKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgdF90eXBlKiBlbGVtX3R5cGU7Ci0KLSAgICBpZiAoY29udGFpbmVyLT5pc19zZXQoKSkgewotICAgICAgZWxlbV90eXBlID0gKCh0X3NldCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbGVtX3R5cGUgPSAoKHRfbGlzdCopY29udGFpbmVyKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLQotICAgIGluZGVudChvdXQpCi0gICAgICA8PCAiZm9yIChFbnVtZXJhdGlvbiAiIDw8IGVudW1lcmF0aW9uX25hbWUgPDwgIiA9ICIgPDwgc291cmNlX25hbWUgPDwgIi5lbGVtZW50cygpOyAiIAotICAgICAgPDwgZW51bWVyYXRpb25fbmFtZSA8PCAiLmhhc01vcmVFbGVtZW50cygpOyApIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkKLSAgICAgIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgaXRlcmF0b3JfZWxlbWVudF9uYW1lIDw8ICIgPSAoIgotICAgICAgPDwgdHlwZV9uYW1lKGVsZW1fdHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIpIiA8PCBlbnVtZXJhdGlvbl9uYW1lIDw8ICIubmV4dEVsZW1lbnQoKTsiIDw8IGVuZGw7Ci0gICAgaWYgKGVsZW1fdHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICAgIC8vIHJlY3Vyc2l2ZSBkZWVwIGNvcHkKLSAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICIiLCByZXN1bHRfZWxlbWVudF9uYW1lLCBlbGVtX3R5cGUpOwotICAgICAgaWYgKGVsZW1fdHlwZS0+aXNfbGlzdCgpKSB7Ci0JaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotCWluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIucHV0KCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiLCAiIDw8IHJlc3VsdF9lbGVtZW50X25hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBpdGVyYXRpdmUgY29weQotICAgICAgaWYoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpewotICAgICAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlLCBmYWxzZSkgPDwgIiB0ZW1wX2JpbmFyeV9lbGVtZW50ID0gIjsKLSAgICAgICAgZ2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob3V0LCBpdGVyYXRvcl9lbGVtZW50X25hbWUsICJ0ZW1wX2JpbmFyeV9lbGVtZW50IiwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotCWlmIChlbGVtX3R5cGUtPmlzX2xpc3QoKSkgewotCSAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KHRlbXBfYmluYXJ5X2VsZW1lbnQpOyIgPDwgZW5kbDsKLQl9IGVsc2UgewotCSAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5wdXQodGVtcF9iaW5hcnlfZWxlbWVudCwgdGVtcF9iaW5hcnlfZWxlbWVudCk7IiA8PCBlbmRsOwotCX0KLSAgICAgIH0gZWxzZXsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgcmVzdWx0X25hbWUgPDwgIi5hZGRFbGVtZW50KCI7Ci0gICAgICAgIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG91dCwgaXRlcmF0b3JfZWxlbWVudF9uYW1lLCByZXN1bHRfbmFtZSwgZWxlbV90eXBlKTsKLSAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgfQotfQotCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgLy8gYmluYXJ5IGZpZWxkcyBuZWVkIHRvIGJlIGNvcGllZCB3aXRoIFN5c3RlbS5hcnJheWNvcHkKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKXsKLSAgICAgIG91dCA8PCAibmV3IGJ5dGVbIiA8PCBzb3VyY2VfbmFtZSA8PCAiLmxlbmd0aF07IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIlN5c3RlbS5hcnJheWNvcHkoIiA8PCBzb3VyY2VfbmFtZSA8PCAiLCAwLCAiIDw8IGRlc3RfbmFtZSA8PCAiLCAwLCAiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7Ci0gICAgfQotICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgY29waWVkIGRpcmVjdGx5Ci0gICAgZWxzZQotICAgICAgb3V0IDw8IHNvdXJjZV9uYW1lOwotICB9IGVsc2UgewotICAgIG91dCA8PCAibmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIHRydWUpIDw8ICIoIiA8PCBzb3VyY2VfbmFtZSA8PCAiKSI7Ci0gIH0KLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayh0X2ZpZWxkKiBmaWVsZCkgewotICByZXR1cm4gZ2VuZXJhdGVfaXNzZXRfY2hlY2soZmllbGQtPmdldF9uYW1lKCkpOwotfQotCi1zdGQ6OnN0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6Omlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKSB7Ci0gIHJldHVybiAiX18iICsgdXBjYXNlX3N0cmluZyhmaWVsZC0+Z2V0X25hbWUoKSArICJfaXNzZXRfaWQiKTsKLX0KLQotc3RkOjpzdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZF9uYW1lKSB7Ci0gIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKLSAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewotICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2V0X2VudW1fY2xhc3NfbmFtZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHBhY2thZ2UgPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHByb2dyYW0gIT0gTlVMTCAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7Ci0gICAgcGFja2FnZSA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoImphdmEiKSArICIuIjsKLSAgfQotICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PAotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCAiIDw8IGNvbnN0YW50X25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PAotICAgICAgIl9GSUVMRF9ERVNDID0gbmV3IFRGaWVsZChcIiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgIihzaG9ydCkiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotfQotCi1ib29sIHRfamF2YW1lX2dlbmVyYXRvcjo6aGFzX2JpdF92ZWN0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBjbGVhcigpIHsiIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0KSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBtdXN0IGJlIGEgYmFzZSB0eXBlCi0gICAgICAgIC8vIG1lYW5zIGl0IGFsc28gbmVlZHMgdG8gYmUgZXhwbGljaXRseSB1bnNldAotICAgICAgICBpbmRlbnQob3V0KSA8PCAic2V0IiA8PCBnZXRfY2FwX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBnZXRfY2FwX25hbWUoImlzU2V0IikgPDwgIihmYWxzZSk7IiA8PCBlbmRsOwotICAgICAgICBzd2l0Y2ggKCgodF9iYXNlX3R5cGUqKXQpLT5nZXRfYmFzZSgpKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gMC4wOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBmYWxzZTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiAgLy8gcHJldmVudCBnY2MgY29tcGlsZXIgd2FybmluZwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGphdmFtZSwgIkphdmEgTUUiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzZjZDQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2pzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3OTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotCi0vKioKLSAqIEpTIGNvZGUgZ2VuZXJhdG9yLgotICovCi1jbGFzcyB0X2pzX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9qc19nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKSA6Ci0gICAgIHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7Ci0gICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgICAKLSAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICAgCi0gICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJub2RlIik7Ci0gICAgIGdlbl9ub2RlXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgICAgCi0gICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJqcXVlcnkiKTsKLSAgICAgZ2VuX2pxdWVyeV8gPSAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSk7Ci0KLSAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5vZGVqcyI7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tanMiOwotICAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfdGhyb3coc3RkOjpzdHJpbmcgdmFyKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX3JlY3ZfcmV0dXJuKHN0ZDo6c3RyaW5nIHZhcik7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0KLSAgLyoqCi0gICAqIFN0cnVjdHMhCi0gICAqLwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UsIGJvb2wgaXNfZXhwb3J0ZWQ9dHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCAgICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcganNfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7Ci0gIHN0ZDo6c3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQ9ZmFsc2UsIGJvb2wgb2JqPWZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiLCBib29sIGluY2x1ZGVfY2FsbGJhY2s9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfY2FsbGJhY2s9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgYXV0b2dlbl9jb21tZW50KCkgewotICAgIHJldHVybgotICAgICAgc3RkOjpzdHJpbmcoIi8vXG4iKSArCi0gICAgICAiLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAgICIvL1xuIiArCi0gICAgICAiLy8gRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiLy9cbiI7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4ganNfbmFtZXNwYWNlX3BpZWNlcyh0X3Byb2dyYW0qIHApIHsKLSAgICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgianMiKTsKLQotICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSAgIGxvYzsKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaWVjZXM7Ci0KLSAgICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgd2hpbGUgKChsb2MgPSBucy5maW5kKCIuIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgIHBpZWNlcy5wdXNoX2JhY2sobnMpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gcGllY2VzOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfdHlwZV9uYW1lc3BhY2UodF9wcm9ncmFtKiBwKSB7Ci0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwICE9IHByb2dyYW1fKSB7Ci0gICAgICAgIHJldHVybiBwLT5nZXRfbmFtZSgpICsgIl90dHlwZXMuIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiAidHR5cGVzLiI7Ci0gICAgfQotICAgIHJldHVybiBqc19uYW1lc3BhY2UocCk7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBqc19leHBvcnRfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIHJldHVybiAiZXhwb3J0cy4iOwotICAgIH0KLSAgICByZXR1cm4ganNfbmFtZXNwYWNlKHApOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcganNfbmFtZXNwYWNlKHRfcHJvZ3JhbSogcCkgewotICAgICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJqcyIpOwotICAgICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICBucyArPSAiLiI7Ci0gICAgICB9Ci0KLQotICAgICAgcmV0dXJuIG5zOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBUcnVlIGlmZiB3ZSBzaG91bGQgZ2VuZXJhdGUgTm9kZUpTLWZyaWVuZGx5IFJQQyBzZXJ2aWNlcy4KLSAgICovCi0gIGJvb2wgZ2VuX25vZGVfOwotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBzZXJ2aWNlcyB0aGF0IHVzZSBqUXVlcnkgYWpheCAoYXN5bmMvc3luYykuCi0gICAqLwotICBib29sIGdlbl9qcXVlcnlfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHN0cmluZyBvdXRkaXIgPSBnZXRfb3V0X2RpcigpOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IG91dGRpcitwcm9ncmFtXy0+Z2V0X25hbWUoKSsiX3R5cGVzLmpzIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBqc19pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgaWYgKGdlbl9ub2RlXykgewotICAgIGZfdHlwZXNfIDw8ICJ2YXIgdHR5cGVzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzdHJpbmcgcG5zOwotCi0gIC8vc2V0dXAgdGhlIG5hbWVzcGFjZQotICAvLyBUT0RPIHNob3VsZCB0aGUgbmFtZXNwYWNlIGp1c3QgYmUgaW4gdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZm9yIG5vZGU/Ci0gIHZlY3RvcjxzdHJpbmc+IG5zX3BpZWNlcyA9IGpzX25hbWVzcGFjZV9waWVjZXMoIHByb2dyYW1fICk7Ci0gIGlmKCBuc19waWVjZXMuc2l6ZSgpID4gMCl7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IG5zX3BpZWNlcy5zaXplKCk7ICsraSkgewotICAgICAgcG5zICs9ICgoaSA9PSAwKSA/ICIiIDogIi4iKSArIG5zX3BpZWNlc1tpXTsKLSAgICAgIGZfdHlwZXNfIDw8ICJpZiAodHlwZW9mICIgPDwgcG5zIDw8ICIgPT09ICd1bmRlZmluZWQnKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzXyA8PCAiICAiIDw8IHBucyA8PCAiID0ge307IiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqcyBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6anNfaW5jbHVkZXMoKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gc3RyaW5nKCJ2YXIgVGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JykuVGhyaWZ0OyIpOwotICB9Ci0gIHN0cmluZyBpbmM7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgcmVzdWx0ICs9ICJ2YXIgIiArIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSArICJfdHlwZXMnKVxuIjsKLSAgICB9Ci0gICAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICAgIHJlc3VsdCArPSAiXG4iOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHN0cmluZyBpbmM7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0KLSAgZl90eXBlc18uY2xvc2UoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0eXBlZGVmLiBUaGlzIGlzIG5vdCBkb25lIGluIEpTLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIEpTLCB3ZSB1c2UgYSBnbG9iYWwgYXJyYXkgZm9yIHRoaXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UodGVudW0tPmdldF9wcm9ncmFtKCkpPDx0ZW51bS0+Z2V0X25hbWUoKTw8IiA9IHsiPDxlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZfdHlwZXNfIDw8ICInIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicgOiAiIDw8IHZhbHVlOwotICAgIGlmIChjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpLTEpIHsKLSAgICAgICAgZl90eXBlc18gPDwgIiwiOwotICAgIH0KLSAgICBmX3R5cGVzXyA8PCBlbmRsOwotICB9Ci0KLSAgZl90eXBlc18gPDwgIn07Ijw8ZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl90eXBlc18gPDwganNfdHlwZV9uYW1lc3BhY2UocHJvZ3JhbV8pICA8PCBuYW1lIDw8ICIgPSAiOwotICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICInIiA8PCB2YWx1ZS0+Z2V0X3N0cmluZygpIDw8ICInIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCi0gICAgICAgIG91dCA8PCAiLCI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgOiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7Ci0gICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotCi0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBvdXQgPDwgInsiOwotCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQotICAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLQotICAgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLQotICAgICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgZW5kbCA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIG91dCA8PCAiWyI7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyICE9IHZhbC5iZWdpbigpKQotICAgICAgICBvdXQgPDwgIiwiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgfQotICAgIG91dCA8PCAiXSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9qc19zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBKUwotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leHBvcnRlZCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIGluZGVudF91cCgpOwotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBpZiAoaXNfZXhwb3J0ZWQpIHsKLSAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PAotICAgICAgICAibW9kdWxlLmV4cG9ydHMuIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihhcmdzKSB7XG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCIgPSBmdW5jdGlvbihhcmdzKSB7XG4iOwotICB9Ci0KLSAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVGhyaWZ0LlRFeGNlcHRpb24uY2FsbCh0aGlzLCBcIiIgPDwKLSAgICAgICAgICBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpIiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLm5hbWUgPSBcIiIgPDwKLSAgICAgICAgICBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8IGVuZGw7Ci0gIH0KLQotICAvL21lbWJlcnMgd2l0aCBhcmd1bWVudHMKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIHN0cmluZyBkdmFsID0gZGVjbGFyZV9maWVsZCgqbV9pdGVyLGZhbHNlLHRydWUpOwotICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICEodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkpIHsKLSAgICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPiBnZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF92YWx1ZSgpKTsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodCwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSkgIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGV4Y2VwdGlvbnMKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgIGlmICh0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAgImlmIChhcmdzIGluc3RhbmNlb2YgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gYXJnczsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAicmV0dXJuOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgICJpZiAoYXJncykgeyIgPDwgZW5kbDsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQpIHsiIDw8IGVuZGwKLSAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBhcmdzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpICA8PCAiOyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICAifSIgPDwgZW5kbDsKLQotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9O1xuIjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLCBUaHJpZnQuVEV4Y2VwdGlvbik7IiA8PCBlbmRsOwotCW91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSk8PHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiLnByb3RvdHlwZS5uYW1lID0gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgLy9pbml0IHByb3RvdHlwZQotICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSk8PHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwiLnByb3RvdHlwZSA9IHt9O1xuIjsKLSAgfQotCi0KLSAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2pzX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgIGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8dHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsiIDw8IGVuZGw7Ci0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZm5hbWUgPSByZXQuZm5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZ0eXBlID0gcmV0LmZ0eXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmaWQgPSByZXQuZmlkOyIgICA8PCBlbmRsOwotCi0KLSAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAiYnJlYWs7IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKLSAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgewotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIChmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLQotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGlucHV0LnNraXAoZnR5cGUpOyIgPDwgZW5kbDsKLQotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7Ci0KLSAgICB9Ci0gICAgaWYgKGZpZWxkcy5zaXplKCkgPT0gMSkgewotICAgICAgLy8gcHNldWRvIGNhc2UgdG8gbWFrZSBqc2xpbnQgaGFwcHkKLSAgICAgIGluZGVudChvdXQpIDw8ICAiY2FzZSAwOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICAiICBpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAgIiAgYnJlYWs7IiA8PCBlbmRsOwotICAgIH0KLSAgICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCi0gICAgaW5kZW50KG91dCkgPDwgICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAgIiAgaW5wdXQuc2tpcChmdHlwZSk7IiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJpbnB1dC5za2lwKGZ0eXBlKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZEZpZWxkRW5kKCk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKTw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpIHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8ICJvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICAiICE9PSBudWxsICYmIHRoaXMuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCIgPDwKLSAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy4iKTsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvdXRwdXQud3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlU3RydWN0RW5kKCk7IiA8PCBlbmRsOwotCi0gIG91dCA8PGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStzZXJ2aWNlX25hbWVfKyIuanMiOwotICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGF1dG9nZW5fY29tbWVudCgpIDw8Ci0gICAgICBqc19pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0KLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgInZhciAiIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIiA9IHJlcXVpcmUoJy4vIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiJykiIDw8IGVuZGwgPDwKLSAgICAgICAgICAidmFyICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCA9ICIgPDwKLSAgICAgICAgICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLkNsaWVudCIgPDwgZW5kbCA8PAotICAgICAgICAgICJ2YXIgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yID0gIiA8PAotICAgICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICIuUHJvY2Vzc29yIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICJ2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0c2VydmljZSk7Ci0gICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLQotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8Ci0gICAgICAgICJleHBvcnRzLlByb2Nlc3NvciA9IGZ1bmN0aW9uKGhhbmRsZXIpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwKLSAgICAgICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgICAgIHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvciwgIiA8PAotICAgICAgICAgICAgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvcikiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICh0aGlzWydwcm9jZXNzXycgKyByLmZuYW1lXSkgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXNbJ3Byb2Nlc3NfJyArIHIuZm5hbWVdLmNhbGwodGhpcywgci5yc2VxaWQsIGlucHV0LCBvdXRwdXQpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5za2lwKFRocmlmdC5UeXBlLlNUUlVDVCk7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgdmFyIHggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJyArIHIuZm5hbWUpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FeGNlcHRpb24sIHIucnNlcWlkKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHgud3JpdGUob3V0cHV0KTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiID0gZnVuY3Rpb24oc2VxaWQsIGlucHV0LCBvdXRwdXQpICI7Ci0KLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgIHN0cmluZyBhcmdzbmFtZSA9ICBqc19uYW1lc3BhY2UocHJvZ3JhbV8pKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLSAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICBqc19uYW1lc3BhY2UocHJvZ3JhbV8pKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaW5wdXQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJhcmdzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIH0KLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICJmdW5jdGlvbiAoZXJyLCByZXN1bHQpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigoZXJyICE9IG51bGwgPyBlcnIgOiB7c3VjY2VzczogcmVzdWx0fSkpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICJcIiwgVGhyaWZ0Lk1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9KSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgIi8vSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgICAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgICAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwotICAgICAgICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgZ2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgICAgICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgICB9Ci0KLSAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIFJFU1QgaW50ZXJmYWNlCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gICh2b2lkKSB0c2VydmljZTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLQotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudCA9ICIgPDwgCi0gICAgICAgICJleHBvcnRzLkNsaWVudCA9IGZ1bmN0aW9uKG91dHB1dCwgcENsYXNzKSB7Ijw8ZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyI8PGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotCi0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMucENsYXNzID0gcENsYXNzOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgdGhpcy5zZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLl9yZXFzID0ge307IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMuaW5wdXQgPSBpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHRoaXMub3V0cHV0ID0gKCFvdXRwdXQpID8gaW5wdXQgOiBvdXRwdXQ7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aGlzLnNlcWlkID0gMDsiIDw8IGVuZGw7Ci0gIH0KLQotCi0gIGluZGVudF9kb3duKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOwotCi0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8Ci0gICAgICAgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwKLSAgICAgICAgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiIDw8Ci0gICAgICAgIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgICAgLy9pbml0IHByb3RvdHlwZQotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpPDxzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlID0ge307Ijw8ZW5kbDsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgc3RyaW5nIGFyZ2xpc3QgPSBhcmd1bWVudF9saXN0KGFyZ19zdHJ1Y3QpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwgIGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSk8PHNlcnZpY2VfbmFtZV88PCJDbGllbnQucHJvdG90eXBlLiIgPDwKLSAgICAgIGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCAiIiwgZ2VuX25vZGVfIHx8IGdlbl9qcXVlcnlfKSA8PCAiIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRoaXMuc2VxaWQgKz0gMTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZF0gPSBjYWxsYmFjazsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmIChnZW5fanF1ZXJ5XykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgIH0KLQotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwKLSAgICAgICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKLQotICAgIGlmICghZ2VuX25vZGVfICYmICEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgInRoaXMucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgcG9zdERhdGEgPSB0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8Ci0gICAgICAgICAgICIoIiA8PCBhcmdsaXN0IDw8IChhcmdsaXN0LmVtcHR5KCkgPyAiIiA6ICIsICIpIDw8ICJ0cnVlKTsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiLmpxUmVxdWVzdCh0aGlzLCBwb3N0RGF0YSwgYXJndW1lbnRzLCB0aGlzLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgICAvLyBTZW5kIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTw8c2VydmljZV9uYW1lXyA8PAotICAgICAgICAiQ2xpZW50LnByb3RvdHlwZS5zZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCBnZW5fanF1ZXJ5XykgPDwgIiB7IiA8PGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIHN0ZDo6c3RyaW5nIG91dHB1dFZhcjsKLSAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgb3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7Ci0gICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9ICBqc19uYW1lc3BhY2UocHJvZ3JhbV8pKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIjsKLQotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBvdXRwdXRWYXIgPDwgIi53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRocmlmdC5NZXNzYWdlVHlwZS5DQUxMLCB0aGlzLnNlcWlkKTsiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOyAKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKCIgPDwgb3V0cHV0VmFyIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgb3V0cHV0VmFyIDw8ICIud3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotCi0gICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKGNhbGxiYWNrKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGw7Ci0KLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgZW5kbCA8PCAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTw8c2VydmljZV9uYW1lXyA8PAotICAgICAgICAgICAgIkNsaWVudC5wcm90b3R5cGUucmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZnVuY3Rpb24oaW5wdXQsbXR5cGUscnNlcWlkKSB7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgZW5kbCA8PCAganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKTw8c2VydmljZV9uYW1lXyA8PAotICAgICAgICAgICAgIkNsaWVudC5wcm90b3R5cGUuIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIHN0ZDo6c3RyaW5nIGlucHV0VmFyOwotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICBpbnB1dFZhciA9ICJpbnB1dCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnB1dFZhciA9ICJ0aGlzLmlucHV0IjsKLSAgICAgIH0KLQotICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBjYWxsYmFjayA9IHRoaXMuX3JlcXNbcnNlcWlkXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1tyc2VxaWRdOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJldCA9IHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgZm5hbWUgPSByZXQuZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciBtdHlwZSA9IHJldC5tdHlwZTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidmFyIHJzZXFpZCA9IHJldC5yc2VxaWQ7IiA8PGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB2YXIgeCA9IG5ldyBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgeC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBpbnB1dFZhciA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl90aHJvdygieCIpIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQucmVhZCgiIDw8IGlucHV0VmFyIDw8ICIpOyIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmIChudWxsICE9PSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coInJlc3VsdC4iICsgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIHJlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKG51bGwgIT09IHJlc3VsdC5zdWNjZXNzKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCByZW5kZXJfcmVjdl9yZXR1cm4oInJlc3VsdC5zdWNjZXNzIikgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIiciICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0JyIpIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiY2FsbGJhY2sobnVsbCkiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCAifTsiPDxlbmRsOwotCi0gICAgfQotICB9Ci0KLX0KLQotc3RkOjpzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnJlbmRlcl9yZWN2X3Rocm93KHN0ZDo6c3RyaW5nIHZhcikgewotICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgcmV0dXJuICJyZXR1cm4gY2FsbGJhY2soIiArIHZhciArICIpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICJ0aHJvdyAiICsgdmFyICsgIjsiOwotICB9Ci19Ci0KLXN0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl9yZXR1cm4oc3RkOjpzdHJpbmcgdmFyKSB7Ci0gIGlmIChnZW5fbm9kZV8pIHsKLSAgICByZXR1cm4gInJldHVybiBjYWxsYmFjayhudWxsLCAiICsgdmFyICsgIik7IjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gInJldHVybiAiICsgdmFyICsgIjsiOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKSBpbmNsYXNzOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4K3RmaWVsZC0+Z2V0X25hbWUoKTsKLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgbmFtZSA8PCAiID0gaW5wdXQuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNigpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZSgpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJyZWFkSTMyKCkiOwotICAgIH0KLQotICAgIGlmICghZ2VuX25vZGVfKSB7Ci0gICAgICAgIG91dCA8PCAiLnZhbHVlIjsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgIGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpPDx0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBydG1wMyA9IHRtcCgiX3J0bXAzIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IHJ0bXAzIDw8ICI7IiA8PCBlbmRsOwotCi0KLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInZhciAiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCB2dHlwZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0KLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGt0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIua3R5cGU7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZ0eXBlIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIudnR5cGU7IiA8PCBlbmRsOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHNpemUgIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZTsiIDw8IGVuZGw7Ci0KLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRTZXRCZWdpbigpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCBldHlwZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLmV0eXBlOyI8PGVuZGw8PAotICAgICAgICBpbmRlbnQoKSA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZTsiPDxlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotCi0gICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ2YXIgIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXR5cGUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5ldHlwZTsiPDxlbmRsPDwKLSAgICAgICAgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7Ijw8ZW5kbDsKLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAodmFyICIgPDwKLSAgICBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAoIWdlbl9ub2RlXykgewotICAgICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgaSA8PCAiID4gMCApIHsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGlmIChpbnB1dC5yc3RhY2subGVuZ3RoID4gaW5wdXQucnBvc1tpbnB1dC5ycG9zLmxlbmd0aCAtMV0gKyAxKSB7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGlucHV0LnJzdGFjay5wb3AoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIHByZWZpeCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaW5wdXQucmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgZmFsc2UsIGZhbHNlKSA8PCAiOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCBmYWxzZSwgZmFsc2UpIDw8ICI7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICAgcHJlZml4IDw8ICJbIiA8PCBrZXkgPDwgIl0gPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICAgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAidmFyICIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgICBwcmVmaXggPDwgIi5wdXNoKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICt0ZmllbGQtPmdldF9uYW1lKCkgKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gICAgaWYoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIGluZGVudChvdXQpIDw8ICJvdXRwdXQuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUJvb2woIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEpTIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgb3V0IDw8ICJ3cml0ZUkzMigiIDw8IG5hbWUgPDwgIikiOwotICAgIH0KLSAgICBvdXQgPDwgIjsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgKHZvaWQpIHRzdHJ1Y3Q7Ci0gIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLndyaXRlKG91dHB1dCk7IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgIlRocmlmdC5vYmplY3RMZW5ndGgoIiA8PCBwcmVmaXggPDwgIikpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZVNldEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICBwcmVmaXggPDwgIi5sZW5ndGgpOyIgPDwgZW5kbDsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJvdXRwdXQud3JpdGVMaXN0QmVnaW4oIiA8PAotICAgICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAgIHByZWZpeCA8PCAiLmxlbmd0aCk7IiA8PCBlbmRsOwotCi0gIH0KLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIjw8a2l0ZXI8PCIgaW4gIjw8cHJlZml4PDwiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIjw8cHJlZml4PDwiLmhhc093blByb3BlcnR5KCI8PGtpdGVyPDwiKSkiIDw8ZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIjw8dml0ZXI8PCIgPSAiPDxwcmVmaXg8PCJbIjw8a2l0ZXI8PCJdOyI8PGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotCi0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICh2YXIgIjw8aXRlcjw8IiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIjw8cHJlZml4PDwiLmhhc093blByb3BlcnR5KCI8PGl0ZXI8PCIpKSIgPDxlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07Ijw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgImZvciAodmFyICI8PGl0ZXI8PCIgaW4gIjw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIjw8cHJlZml4PDwiLmhhc093blByb3BlcnR5KCI8PGl0ZXI8PCIpKSIgPDxlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07Ijw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3V0cHV0LndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3V0cHV0LndyaXRlU2V0RW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm91dHB1dC53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKLX0KLQotLyoqCi0gKiBEZWNsYXJlcyBhIGZpZWxkLCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHR0eXBlIFRoZSB0eXBlCi0gKi8KLXN0cmluZyB0X2pzX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICJ0aGlzLiIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYoIW9iail7Ci0gICAgICByZXN1bHQgPSAidmFyICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5pdCkgewotICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gSlMgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKXsKLSAgICAgIHJlc3VsdCArPSAiID0gbnVsbCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgIGlmIChvYmopIHsKLSAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICtqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgb2YgdGhlIGZvcm0gJ3R5cGUgbmFtZShhcmdzKScKLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb24KLSAqIEByZXR1cm4gU3RyaW5nIG9mIHJlbmRlcmVkIGZ1bmN0aW9uIGRlZmluaXRpb24KLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKLQotICBzdHJpbmcgc3RyOwotCi0gIHN0ciAgPSBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiID0gZnVuY3Rpb24oIjsKLQotICBzdHIgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksIGluY2x1ZGVfY2FsbGJhY2spOwotCi0gIHN0ciArPSAiKSI7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2NhbGxiYWNrKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLQotICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgewotICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gImNhbGxiYWNrIjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9qc19nZW5lcmF0b3IgOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUaHJpZnQuVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVGhyaWZ0LlR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRocmlmdC5UeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUaHJpZnQuVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKGpzLCAiSmF2YXNjcmlwdCIsCi0iICAgIGpxdWVyeTogICAgICAgICAgR2VuZXJhdGUgalF1ZXJ5IGNvbXBhdGlibGUgY29kZS5cbiIKLSIgICAgbm9kZTogICAgICAgICAgICBHZW5lcmF0ZSBub2RlLmpzIGNvbXBhdGlibGUgY29kZS5cbiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWRkYjgyLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODkwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIE9DYW1sIGNvZGUgZ2VuZXJhdG9yLgotICoKLSAqLwotY2xhc3MgdF9vY2FtbF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfb2NhbWxfZ2VuZXJhdG9yKAotICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAotICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKLSAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIHBhcnNlZF9vcHRpb25zOwotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW9jYW1sIjsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9wcm9ncmFtICAoKTsKLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICBib29sIHN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0X2ZpZWxkICp0bWVtYmVyKTsKLSAgYm9vbCBzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRfZmllbGQgKnRtZW1iZXIpOwotICBib29sIHN0cnVjdF9tZW1iZXJfZGVmYXVsdF9jaGVhcGx5X2NvbXBhcmFibGUodF9maWVsZCAqdG1lbWJlcik7Ci0gIHN0ZDo6c3RyaW5nIHN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUgKnR5cGUsIHN0cmluZyB3aGF0KTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb249ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgdG5hbWUsIHRfZmllbGQqIHRtZW1iZXIpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgbWVtYmVycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkICptZW1iZXIpOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXgpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0KTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0KTsKLQotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZSAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU9ICIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpOwotICBzdGQ6OnN0cmluZyBvY2FtbF9pbXBvcnRzKCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fdHlwZSh0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBtZXRob2Q9ZmFsc2UsIGJvb2wgb3B0aW9ucyA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX29jYW1sX3R5cGUodF90eXBlKiB0eXBlKTsKLQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2lfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9pXzsKLQotfTsKLQotCi0vKgotICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSB3YW50IHR5cGVkZWZzIHRvIGFwcGVhciBsYXRlciwKLSAqIGFmdGVyIGFsbCB0aGUgdHlwZXMgaGF2ZSBiZWVuIGRlY2xhcmVkLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtKCkgewotICAvLyBJbml0aWFsaXplIHRoZSBnZW5lcmF0b3IKLSAgaW5pdF9nZW5lcmF0b3IoKTsKLQotICAvLyBHZW5lcmF0ZSBlbnVtcwotICB2ZWN0b3I8dF9lbnVtKj4gZW51bXMgPSBwcm9ncmFtXy0+Z2V0X2VudW1zKCk7Ci0gIHZlY3Rvcjx0X2VudW0qPjo6aXRlcmF0b3IgZW5faXRlcjsKLSAgZm9yIChlbl9pdGVyID0gZW51bXMuYmVnaW4oKTsgZW5faXRlciAhPSBlbnVtcy5lbmQoKTsgKytlbl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZW51bSgqZW5faXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzdHJ1Y3RzCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IHN0cnVjdHMgPSBwcm9ncmFtXy0+Z2V0X3N0cnVjdHMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46Oml0ZXJhdG9yIHN0X2l0ZXI7Ci0gIGZvciAoc3RfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc3RfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3N0X2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9zdHJ1Y3QoKnN0X2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgeGNlcHRpb25zCi0gIHZlY3Rvcjx0X3N0cnVjdCo+IHhjZXB0aW9ucyA9IHByb2dyYW1fLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+OjppdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfeGNlcHRpb24oKnhfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0eXBlZGVmcwotICB2ZWN0b3I8dF90eXBlZGVmKj4gdHlwZWRlZnMgPSBwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCk7Ci0gIHZlY3Rvcjx0X3R5cGVkZWYqPjo6aXRlcmF0b3IgdGRfaXRlcjsKLSAgZm9yICh0ZF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdGRfaXRlciAhPSB0eXBlZGVmcy5lbmQoKTsgKyt0ZF9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfdHlwZWRlZigqdGRfaXRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBzZXJ2aWNlcwotICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7Ci0gIHZlY3Rvcjx0X3NlcnZpY2UqPjo6aXRlcmF0b3Igc3ZfaXRlcjsKLSAgZm9yIChzdl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgc3ZfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzdl9pdGVyKSB7Ci0gICAgc2VydmljZV9uYW1lXyA9IGdldF9zZXJ2aWNlX25hbWUoKnN2X2l0ZXIpOwotICAgIGdlbmVyYXRlX3NlcnZpY2UoKnN2X2l0ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RhbnRzCi0gIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzID0gcHJvZ3JhbV8tPmdldF9jb25zdHMoKTsKLSAgZ2VuZXJhdGVfY29uc3RzKGNvbnN0cyk7Ci0KLSAgLy8gQ2xvc2UgdGhlIGdlbmVyYXRvcgotICBjbG9zZV9nZW5lcmF0b3IoKTsKLX0KLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMubWwiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLSAgc3RyaW5nIGZfdHlwZXNfaV9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfdHlwZXMubWxpIjsKLSAgZl90eXBlc19pXy5vcGVuKGZfdHlwZXNfaV9uYW1lLmNfc3RyKCkpOwotCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtX25hbWVfKyJfY29uc3RzLm1sIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfaV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0gIGZfY29uc3RzXyA8PAotICAgIG9jYW1sX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBvY2FtbF9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKTw8Il90eXBlcyI8PCBlbmRsOwotfQotCi0KLS8qKgotICogQXV0b2dlbidkIGNvbW1lbnQKLSAqLwotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjpvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gIHJldHVybgotICAgIHN0ZDo6c3RyaW5nKCIoKlxuIikgKwotICAgICIgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAiXG4iICsKLSAgICAiIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HXG4iICsKLSAgICAiKilcbiI7Ci19Ci0KLS8qKgotICogUHJpbnRzIHN0YW5kYXJkIHRocmlmdCBpbXBvcnRzCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6b2NhbWxfaW1wb3J0cygpIHsKLSAgcmV0dXJuICJvcGVuIFRocmlmdCI7Ci19Ci0KLS8qKgotICogQ2xvc2VzIHRoZSB0eXBlIGZpbGVzCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICBmX3R5cGVzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIEV6LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBmX3R5cGVzXyA8PAotICAgIGluZGVudCgpIDw8ICJ0eXBlICI8PCBkZWNhcGl0YWxpemUodHR5cGVkZWYtPmdldF9zeW1ib2xpYygpKSA8PCAiID0gIiA8PCByZW5kZXJfb2NhbWxfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzX2lfIDw8Ci0gICAgaW5kZW50KCkgPDwgInR5cGUgIjw8IGRlY2FwaXRhbGl6ZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHR0eXBlZGVmLT5nZXRfdHlwZSgpKSA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4KLSAqIHRoZSB2YWx1ZXMuCi0gKgotICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAibW9kdWxlICIgPDwgY2FwaXRhbGl6ZSh0ZW51bS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIgPDwgZW5kbCA8PCAic3RydWN0IiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGVuZGwgPDwgInNpZyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3R5cGVzXykgPDwgInR5cGUgdCA9ICIgPDwgZW5kbDsKLSAgaW5kZW50KGZfdHlwZXNfaV8pIDw8ICJ0eXBlIHQgPSAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCAiIDw8IG5hbWUgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl90eXBlc19pXykgPDwgInwgIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQoZl90eXBlc18pIDw8ICJsZXQgdG9faSA9IGZ1bmN0aW9uIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgInZhbCB0b19pIDogdCAtPiBJbnQzMi50IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIHN0cmluZyBuYW1lID0gY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgInwgIiA8PCBuYW1lIDw8ICIgLT4gIiA8PCB2YWx1ZSA8PCAibCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudChmX3R5cGVzXykgPDwgImxldCBvZl9pID0gZnVuY3Rpb24iIDw8IGVuZGw7Ci0gIGluZGVudChmX3R5cGVzX2lfKSA8PCAidmFsIG9mX2kgOiBJbnQzMi50IC0+IHQiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8ICJ8ICIgPDwgdmFsdWUgPDwgImwgLT4gIiA8PCBuYW1lIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAifCBfIC0+IHJhaXNlIFRocmlmdF9lcnJvciIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfdHlwZXNfKSA8PCAiZW5kIiA8PCBlbmRsOwotICBpbmRlbnQoZl90eXBlc19pXykgPDwgImVuZCIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZSBhIGNvbnN0YW50IHZhbHVlCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBpbmRlbnQoZl9jb25zdHNfKSA8PCAibGV0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICAvLyBPQ2FtbCByZXF1aXJlcyBhbGwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb250YWluIGEgZGVjaW1hbCBwb2ludAotICBvdXQuc2V0Zihpb3M6OnNob3dwb2ludCk7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJsIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICJMIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIuMCI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR5cGU7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGludCB2YWwgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgaWYgKHZhbCA9PSB2YWx1ZS0+Z2V0X2ludGVnZXIoKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKSA8PCAiLiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHN0cmluZyBjbmFtZSA9IHR5cGVfbmFtZSh0eXBlKTsKLSAgICBzdHJpbmcgY3QgPSB0bXAoIl9jIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBjdCA8PCAiID0gbmV3ICIgPDwgY25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7Ci0gICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgfQotICAgICAgc3RyaW5nIGZuYW1lID0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IGN0IDw8IiNzZXRfIiA8PCBmbmFtZSA8PCAiICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgY3QgPDwgIikiOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIHN0cmluZyBobSA9IHRtcCgiX2htIik7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIihsZXQgIiA8PCBobSA8PCAiID0gSGFzaHRibC5jcmVhdGUgIiA8PCB2YWwuc2l6ZSgpIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgaW5kZW50KG91dCkgPDwgIkhhc2h0YmwuYWRkICIgPDwgaG0gPDwgIiAiIDw8IGtleSA8PCAiICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnQob3V0KSA8PCBobSA8PCAiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiXSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgc3RyaW5nIGhtID0gdG1wKCJfaG0iKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAiIDw8IGhtIDw8ICIgPSBIYXNodGJsLmNyZWF0ZSAiIDw8IHZhbC5zaXplKCkgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5hZGQgIiA8PCBobSA8PCAiICIgPDwgdmFsIDw8ICIgdHJ1ZTsiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8IGhtIDw8ICIpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSAic3RydWN0IgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZXhjZXB0aW9uLiBCYXNpY2FsbHkgdGhlIHNhbWUKLSAqIGFzIGEgc3RydWN0LCBidXQgYWxzbyBoYXMgYW4gZXhjZXB0aW9uIGRlY2xhcmF0aW9uLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIE9DYW1sIHN0cnVjdAotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoZl90eXBlc19pXyx0c3RydWN0LGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCAqPiYgbWVtYmVycykgewotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICAgIC8qIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgb2JqZWN0ICovCi0gICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBjb3B5ID0iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7IGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX25ldyA9IE9vLmNvcHkgc2VsZiBpbiIgPDwgZW5kbDsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKQotICAgICAgICBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvdXQsICptX2l0ZXIpOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiX25ldyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnN0cnVjdF9tZW1iZXJfY29weV9vZih0X3R5cGUgKnR5cGUsIHN0cmluZyB3aGF0KSB7Ci0gICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICAgICAgcmV0dXJuIHdoYXQgKyBzdHJpbmcgKCIjY29weSIpOwotICAgIH0gaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICAgIHN0cmluZyBjb3B5X29mX2sgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X21hcCAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgImsiKTsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2ZfdiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZigoKHRfbWFwICopdHlwZSktPmdldF92YWxfdHlwZSgpLCAidiIpOwotCi0gICAgICAgIGlmKGNvcHlfb2ZfayA9PSAiayIgJiYgY29weV9vZl92ID09ICJ2IikgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoSGFzaHRibC5jb3B5ICIpICsgd2hhdCArIHN0cmluZygiKSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcgKCIoKGZ1biBvaCAtPiBsZXQgbmggPSBIYXNodGJsLmNyZWF0ZSAoSGFzaHRibC5sZW5ndGggb2gpIGluIEhhc2h0YmwuaXRlciAoZnVuIGsgdiAtPiBIYXNodGJsLmFkZCBuaCAiKQotICAgICAgICAgICAgICAgICAgICArIGNvcHlfb2ZfayArIHN0cmluZygiICIpICsgY29weV9vZl92Ci0gICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICAgICAgICAgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgc3RyaW5nIGNvcHlfb2YgPSBzdHJ1Y3RfbWVtYmVyX2NvcHlfb2YoKCh0X3NldCAqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCksICJrIik7Ci0KLSAgICAgICAgaWYoY29weV9vZiA9PSAiayIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nICgiKEhhc2h0YmwuY29weSAiKSArIHdoYXQgKyBzdHJpbmcoIikiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nICgiKChmdW4gb2ggLT4gbGV0IG5oID0gSGFzaHRibC5jcmVhdGUgKEhhc2h0YmwubGVuZ3RoIG9oKSBpbiBIYXNodGJsLml0ZXIgKGZ1biBrIHYgLT4gSGFzaHRibC5hZGQgbmggIikKLSAgICAgICAgICAgICAgICAgICAgKyBjb3B5X29mICsgc3RyaW5nKCIgdHJ1ZSIpCi0gICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKCIpIG9oOyBuaCkgIikKLSAgICAgICAgICAgICAgICAgICAgKyB3aGF0ICsgIikiOwotICAgICAgICB9Ci0gICAgfSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIHN0cmluZyBjb3B5X29mID0gc3RydWN0X21lbWJlcl9jb3B5X29mKCgodF9saXN0ICopdHlwZSktPmdldF9lbGVtX3R5cGUoKSwgIngiKTsKLSAgICAgICAgaWYoY29weV9vZiAhPSAieCIpIHsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcoIihMaXN0Lm1hcCAoZnVuIHggLT4gIikKLSAgICAgICAgICAgICAgICArIGNvcHlfb2YgKyBzdHJpbmcgKCIpICIpCi0gICAgICAgICAgICAgICAgKyB3aGF0ICsgc3RyaW5nKCIpIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gd2hhdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gd2hhdDsKLX0KLQotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLQotICAgIHN0cmluZyBncmFiX2ZpZWxkID0gc3RyaW5nKCJzZWxmI2dyYWJfIikgKyBtbmFtZTsKLSAgICBzdHJpbmcgY29weV9vZiA9IHN0cnVjdF9tZW1iZXJfY29weV9vZih0eXBlLCBncmFiX2ZpZWxkKTsKLSAgICBpZihjb3B5X29mICE9IGdyYWJfZmllbGQpIHsKLSAgICAgICAgaW5kZW50KG91dCk7Ci0gICAgICAgIGlmKCFzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICBvdXQgPDwgImlmIF8iIDw8IG1uYW1lIDw8ICIgPD4gTm9uZSB0aGVuIiA8PCBlbmRsOwotICAgICAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICIgICI7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0IDw8ICJfbmV3I3NldF8iIDw8IG1uYW1lIDw8ICIgIiA8PCBjb3B5X29mIDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgotICoKLSAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICBzdHJpbmcgdG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGluZGVudChvdXQpIDw8ICJjbGFzcyAiIDw8IHRuYW1lIDw8ICIgPSIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob3V0LCB0bmFtZSwgKCptX2l0ZXIpKTsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotICBnZW5lcmF0ZV9vY2FtbF9tZXRob2RfY29weShvdXQsIG1lbWJlcnMpOwotICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJlbmQiIDw8IGVuZGw7Ci0KLSAgaWYoaXNfZXhjZXB0aW9uKXsKLSAgICBpbmRlbnQob3V0KSA8PCAiZXhjZXB0aW9uICIgPDwgY2FwaXRhbGl6ZSh0bmFtZSkgPDwiIG9mICIgPDwgdG5hbWUgPDwgZW5kbDsKLSAgfQotCi0gIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRuYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBzdHJ1Y3R1cmUgZm9yIHRoZSBtZW1iZXIKLSAqIEBwYXJhbSB0bWVtYmVyIE1lbWJlciBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9tZW1iZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0bWVtYmVyKSB7Ci0gIHN0cmluZyB4ID0gdG1wKCJfeCIpOwotICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInZhbCBtdXRhYmxlIF8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHJlbmRlcl9vY2FtbF90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwotICB0X2NvbnN0X3ZhbHVlICp2YWwgPSB0bWVtYmVyLT5nZXRfdmFsdWUoKTsKLSAgaWYodmFsKSB7Ci0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKQotICAgICAgICBvdXQgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHRtZW1iZXItPmdldF90eXBlKCksIHRtZW1iZXItPmdldF92YWx1ZSgpKSA8PCBlbmRsOwotICAgIGVsc2UKLSAgICAgICAgb3V0IDw8ICIgb3B0aW9uID0gU29tZSAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0bWVtYmVyLT5nZXRfdHlwZSgpLCB0bWVtYmVyLT5nZXRfdmFsdWUoKSkgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBhc3NlcnQoIXN0cnVjdF9tZW1iZXJfcGVyc2lzdGVudCh0bWVtYmVyKSkKLSAgICBvdXQgPDwgIiBvcHRpb24gPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLSAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IFNvbWUgXyIgPDwgbW5hbWUgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBncmFiXyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiAiIDw8IHggPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gIiA8PCB4IDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgPSBtYXRjaCBfIjw8bW5hbWU8PCIgd2l0aCBOb25lLT5yYWlzZSAoRmllbGRfZW1wdHkgXCIiPDx0bmFtZTw8Ii4iPDxtbmFtZTw8IlwiKSB8IFNvbWUgIiA8PCB4IDw8IiAtPiAiIDw8IHggPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIm1ldGhvZCBzZXRfIiA8PCBtbmFtZSA8PCAiICIgPDwgeCA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSBTb21lICIgPDwgeCA8PCBlbmRsOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA9IF8iIDw8IG1uYW1lIDw8ICIgPC0gTm9uZSIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgcmVzZXRfIiA8PCBtbmFtZSA8PCAiID0gXyIgPDwgbW5hbWUgPDwgIiA8LSAiOwotICBpZih2YWwpIHsKLSAgICBpZihzdHJ1Y3RfbWVtYmVyX3BlcnNpc3RlbnQodG1lbWJlcikpCi0gICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gICAgZWxzZQotICAgICAgICBvdXQgPDwgIlNvbWUgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8ICJOb25lIiA8PCBlbmRsOwotICB9Ci0KLQotfQotCi0vKioKLSAqIENoZWNrIHdoZXRoZXIgYSBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBjYW4gbm90IGhhdmUgdW5kZWZpbmVkIHZhbHVlCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIHJldHVybiAodmFsID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotLyoqCi0gKiBDaGVjayB3aGV0aGVyIGEgbWVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUgY2FuIGJlIHNraXBwZWQgZHVyaW5nIGVuY29kaW5nCi0gKgotICogQHBhcmFtIHRtZW1iZXIgTWVtYmVyIGRlZmluaXRpb24KLSAqLwotYm9vbCB0X29jYW1sX2dlbmVyYXRvcjo6c3RydWN0X21lbWJlcl9vbWl0YWJsZSh0X2ZpZWxkICp0bWVtYmVyKSB7Ci0gIHJldHVybiAodG1lbWJlci0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpOwotfQotCi0vKioKLSAqIEZpZ3VyZSBvdXQgd2hldGhlciBhIG1lbWJlciBvZiB0aGUgc3RydWN0dXJlIGhhcwotICogYSBjaGVhcGx5IGNvbXBhcmFibGUgZGVmYXVsdCB2YWx1ZS4KLSAqCi0gKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgotICovCi1ib29sIHRfb2NhbWxfZ2VuZXJhdG9yOjpzdHJ1Y3RfbWVtYmVyX2RlZmF1bHRfY2hlYXBseV9jb21wYXJhYmxlKHRfZmllbGQgKnRtZW1iZXIpIHsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0bWVtYmVyLT5nZXRfdHlwZSgpKTsKLSAgdF9jb25zdF92YWx1ZSAqdmFsID0gdG1lbWJlci0+Z2V0X3ZhbHVlKCk7Ci0gIGlmKCF2YWwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZih0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIC8vIEJhc2UgdHlwZXMgYXJlIGdlbmVyYWxseSBjaGVhcGx5IGNvbXBhcmVkIGZvciBzdHJ1Y3R1cmFsIGVxdWl2YWxlbmNlLgotICAgIHN3aXRjaCgoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBpZih2YWwtPmdldF9kb3VibGUoKSA9PSAwLjApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgLy8gRW1wdHkgbGlzdHMgYXJlIGNoZWFwbHkgY29tcGFyZWQgZm9yIHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuCi0gICAgLy8gSXMgZW1wdHkgbGlzdD8KLSAgICBpZih2YWwtPmdldF9saXN0KCkuc2l6ZSgpID09IDApCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgdG5hbWUgPDwgIiA6IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAib2JqZWN0ICgnYSkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgc3RyaW5nIHggPSB0bXAoIl94Iik7Ci0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdHJpbmcgbW5hbWUgPSBkZWNhcGl0YWxpemUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICAgIHN0cmluZyB0eXBlID0gcmVuZGVyX29jYW1sX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIG9wdGlvbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2QgZ3JhYl8iIDw8IG1uYW1lIDw8ICIgOiAiIDw8IHR5cGUgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICJtZXRob2Qgc2V0XyIgPDwgbW5hbWUgPDwgIiA6ICIgPDwgdHlwZSA8PCAiIC0+IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpZighc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KCptX2l0ZXIpKQotICAgICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHVuc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHJlc2V0XyIgPDwgbW5hbWUgPDwgIiA6IHVuaXQiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0gIGluZGVudChvdXQpIDw8ICJtZXRob2QgY29weSA6ICdhIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAibWV0aG9kIHdyaXRlIDogUHJvdG9jb2wudCAtPiB1bml0IiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIGlmKGlzX2V4Y2VwdGlvbil7Ci0gICAgaW5kZW50KG91dCkgPDwgImV4Y2VwdGlvbiAiIDw8IGNhcGl0YWxpemUodG5hbWUpIDw8IiBvZiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAidmFsIHJlYWRfIiA8PCB0bmFtZSA8PCAiIDogUHJvdG9jb2wudCAtPiAiIDw8IHRuYW1lIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKLSAgc3RyaW5nIHN0ciA9IHRtcCgiX3N0ciIpOwotICBzdHJpbmcgdCA9IHRtcCgiX3QiKTsKLSAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAibGV0IHJlYyByZWFkXyIgPDwgc25hbWUgPDwgIiAoaXByb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImxldCAiIDw8IHN0ciA8PCAiID0gbmV3ICIgPDwgc25hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImlnbm9yZShpcHJvdCNyZWFkU3RydWN0QmVnaW4pOyIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiKHRyeSB3aGlsZSB0cnVlIGRvIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImxldCAoXywiIDw8IHQgPDwiLCI8PGlkPDwiKSA9IGlwcm90I3JlYWRGaWVsZEJlZ2luIGluIiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgIiA8PCB0IDw8IiA9IFByb3RvY29sLlRfU1RPUCB0aGVuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAgICJyYWlzZSBCcmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJlbHNlICgpOyIgPDwgZW5kbDsKLQotICAgIGluZGVudChvdXQpIDw8ICIobWF0Y2ggIiA8PCBpZDw8IiB3aXRoICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgInwgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiIC0+ICgiOwotICAgICAgb3V0IDw8ICJpZiAiIDw8IHQgPDwiID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRoZW4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLHN0cik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIGlwcm90I3NraXAgIjw8IHQgPDwgIikiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ8IF8gLT4gIiA8PCAiaXByb3Qjc2tpcCAiPDx0PDwiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICAvLyBSZWFkIGZpZWxkIGVuZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QjcmVhZEZpZWxkRW5kOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyAoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ3aXRoIEJyZWFrIC0+ICgpKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90I3JlYWRTdHJ1Y3RFbmQ7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgc3RyIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBzdHJpbmcgc3RyID0gdG1wKCJfc3RyIik7Ci0gIHN0cmluZyBmID0gdG1wKCJfZiIpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIm1ldGhvZCB3cml0ZSAob3Byb3QgOiBQcm90b2NvbC50KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qjd3JpdGVTdHJ1Y3RCZWdpbiBcIiI8PG5hbWU8PCJcIjsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X2ZpZWxkICp0bWVtYmVyID0gKCpmX2l0ZXIpOwotICAgIHN0cmluZyBtbmFtZSA9ICJfIitkZWNhcGl0YWxpemUodG1lbWJlci0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIF92OwotCi0gICAgaWYoc3RydWN0X21lbWJlcl9wZXJzaXN0ZW50KHRtZW1iZXIpKSB7Ci0KLSAgICAgIGlmKHN0cnVjdF9tZW1iZXJfb21pdGFibGUodG1lbWJlcikKLSAgICAgICAgJiYgc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICBfdiA9ICJfdiI7Ci0gICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiCi0gICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICA8PCAiIC0+ICgpIHwgIiA8PCBfdiA8PCAiIC0+ICIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIF92ID0gbW5hbWU7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLQotICAgICAgaW5kZW50KG91dCkgPDwgIihtYXRjaCAiIDw8IG1uYW1lIDw8ICIgd2l0aCAiOwotCi0gICAgICBpZihzdHJ1Y3RfbWVtYmVyX29taXRhYmxlKHRtZW1iZXIpKSB7Ci0gICAgICAgIG91dCA8PCAiTm9uZSAtPiAoKSI7Ci0KLSAgICAgICAgaWYoc3RydWN0X21lbWJlcl9kZWZhdWx0X2NoZWFwbHlfY29tcGFyYWJsZSh0bWVtYmVyKSkgewotICAgICAgICAgIC8vIEF2b2lkIHJlZHVuZGFudCBlbmNvZGluZyBvZiBtZW1iZXJzIGhhdmluZyBkZWZhdWx0IHZhbHVlcy4KLSAgICAgICAgICBvdXQgPDwgIiB8IFNvbWUgIgotICAgICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodG1lbWJlci0+Z2V0X3R5cGUoKSwgdG1lbWJlci0+Z2V0X3ZhbHVlKCkpCi0gICAgICAgICAgICAgIDw8ICIgLT4gKCkiOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PCAiIHwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgTm9uZSAtPiByYWlzZSAoRmllbGRfZW1wdHkgXCIiCi0gICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLiIgPDwgbW5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgInwgU29tZSBfdiAtPiAiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIF92ID0gIl92IjsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRCZWdpbihcIiI8PCB0bWVtYmVyLT5nZXRfbmFtZSgpPDwiXCIsIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSh0bWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIKLSAgICAgICAgICAgICAgICA8PCB0bWVtYmVyLT5nZXRfa2V5KCk8PCIpOyIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgdG1lbWJlciwgX3YpOwotCi0gICAgLy8gV3JpdGUgZmllbGQgY2xvc2VyCi0gICAgaW5kZW50KG91dCkgPDwgIm9wcm90I3dyaXRlRmllbGRFbmQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFdyaXRlIHRoZSBzdHJ1Y3QgbWFwCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZUZpZWxkU3RvcDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVTdHJ1Y3RFbmQiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWwiOwotICBmX3NlcnZpY2VfLm9wZW4oZl9zZXJ2aWNlX25hbWUuY19zdHIoKSk7Ci0gIHN0cmluZyBmX3NlcnZpY2VfaV9uYW1lID0gZ2V0X291dF9kaXIoKStjYXBpdGFsaXplKHNlcnZpY2VfbmFtZV8pKyIubWxpIjsKLSAgZl9zZXJ2aWNlX2lfLm9wZW4oZl9zZXJ2aWNlX2lfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgb2NhbWxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgIG9jYW1sX2ltcG9ydHMoKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfaV8gPDwKLSAgICBvY2FtbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgb2NhbWxfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgLyogaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIH0KLSAgKi8KLSAgZl9zZXJ2aWNlXyA8PAotICAgICAib3BlbiAiIDw8IGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9zZXJ2aWNlX2lfIDw8Ci0gICAgICJvcGVuICIgPDwgY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotCi0KLSAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCi0gIGZfc2VydmljZV8uY2xvc2UoKTsKLSAgZl9zZXJ2aWNlX2lfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIigqIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMgKikiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOwotICAgIGdlbmVyYXRlX29jYW1sX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgYW5kIGhlbHBlcnMgZm9yIGEgZnVuY3Rpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzcyB2aXJ0dWFsIGlmYWNlIDoiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIHN0cmluZyBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuaWZhY2UiIDw8IGVuZGw7Ci0gIH0KLQotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHJpbmcgZnQgPSBmdW5jdGlvbl90eXBlKCpmX2l0ZXIsdHJ1ZSx0cnVlKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHZpcnR1YWwgIiA8PCBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiIDogIiA8PCBmdCAgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfaV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJtZXRob2QgdmlydHVhbCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ0IDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uIE5vdGUgdGhhdCBpbiBPQ2FtbCwgdGhlIGNsaWVudCBkb2Vzbid0IGltcGxlbWVudCBpZmFjZS4gVGhpcyBpcyBiZWNhdXNlCi0gKiBUaGUgY2xpZW50IGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCBoYXZlIHRvKSBkZWFsIHdpdGggYXJndW1lbnRzIGJlaW5nIE5vbmUuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAiY2xhc3MgY2xpZW50IChpcHJvdCA6IFByb3RvY29sLnQpIChvcHJvdCA6IFByb3RvY29sLnQpID0iIDw8IGVuZGwgPDwgIm9iamVjdCAoc2VsZikiIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8Ci0gICAgImNsYXNzIGNsaWVudCA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiAiIDw8IGVuZGwgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5oZXJpdCAiIDw8IGV4dGVuZHMgPDwgIi5jbGllbnQgaXByb3Qgb3Byb3QgYXMgc3VwZXIiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV9pXykgPDwgImluaGVyaXQgIiA8PCBleHRlbmRzIDw8ICIuY2xpZW50IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFsIG11dGFibGUgc2VxaWQgPSAwIiA8PCBlbmRsOwotCi0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJtZXRob2QgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiA9ICIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICAgIm1ldGhvZCAiIDw8IGRlY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiIDw8IGZ1bmN0aW9uX3R5cGUoKmZfaXRlcix0cnVlLGZhbHNlKSA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbGYjc2VuZF8iIDw8IGZ1bm5hbWU7Ci0KLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIgIiA8PCBkZWNhcGl0YWxpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAic2VsZiNyZWN2XyIgPDwgZnVubmFtZSA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAibWV0aG9kIHByaXZhdGUgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiID0gIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIik7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUJlZ2luIChcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiwgUHJvdG9jb2wuQ0FMTCwgc2VxaWQpOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJsZXQgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIgaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncyNzZXRfIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJhcmdzI3dyaXRlIG9wcm90OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90I3dyaXRlTWVzc2FnZUVuZDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBkZWNhcGl0YWxpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICAgIHRfc3RydWN0IG5vYXJncyhwcm9ncmFtXyk7Ci0KLSAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKCJyZWN2XyIpICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZub2FyZ3MpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibWV0aG9kIHByaXZhdGUgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgPSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImxldCAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiKGlmIG10eXBlID0gUHJvdG9jb2wuRVhDRVBUSU9OIHRoZW4iIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4ucmVhZCBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAoaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAgcmFpc2UgKEFwcGxpY2F0aW9uX0V4bi5FIHgpKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlICgpKTsiIDw8IGVuZGw7Ci0gICAgICBzdHJpbmcgcmVzID0gIl8iOwotCi0gICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKLSAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkgfHwgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgcmVzID0gInJlc3VsdCI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJsZXQgIjw8cmVzPDwiID0gcmVhZF8iIDw8IHJlc3VsdG5hbWUgPDwgIiBpcHJvdCBpbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJtYXRjaCByZXN1bHQjZ2V0X3N1Y2Nlc3Mgd2l0aCBTb21lIHYgLT4gdiB8IE5vbmUgLT4gKCIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICB9Ci0KLQotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIobWF0Y2ggcmVzdWx0I2dldF8iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIHdpdGggTm9uZSAtPiAoKSB8IFNvbWUgX3YgLT4iIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiICByYWlzZSAoIiA8PCBjYXBpdGFsaXplKHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpKSA8PCAiIF92KSk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAiKCkiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJhaXNlIChBcHBsaWNhdGlvbl9FeG4uRSAoQXBwbGljYXRpb25fRXhuLmNyZWF0ZSBBcHBsaWNhdGlvbl9FeG4uTUlTU0lOR19SRVNVTFQgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIikpKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJjbGFzcyBwcm9jZXNzb3IgKGhhbmRsZXIgOiBpZmFjZSkgPSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib2JqZWN0IChzZWxmKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV9pXykgPDwKLSAgICAiY2xhc3MgcHJvY2Vzc29yIDogaWZhY2UgLT4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9iamVjdCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIGZfc2VydmljZV9pXyA8PAotICAgICBpbmRlbnQoKSA8PCAiaW5oZXJpdCBQcm9jZXNzb3IudCIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImluaGVyaXQgIiArIGV4dGVuZHMgKyAiLnByb2Nlc3NvciAoaGFuZGxlciA6PiAiICsgZXh0ZW5kcyArICIuaWZhY2UpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJpbmhlcml0ICIgKyBleHRlbmRzICsgIi5wcm9jZXNzb3IiIDw8IGVuZGw7Ci0gIH0KLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA9IEhhc2h0YmwuY3JlYXRlICIgPDwgZnVuY3Rpb25zLnNpemUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJ2YWwgcHJvY2Vzc01hcCA6IChzdHJpbmcsIGludCAqIFByb3RvY29sLnQgKiBQcm90b2NvbC50IC0+IHVuaXQpIEhhc2h0YmwudCIgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyBpcHJvdCBvcHJvdCA9IiA8PCBlbmRsOwotICBpbmRlbnQoZl9zZXJ2aWNlX2lfKSA8PAotICAgICJtZXRob2QgcHJvY2VzcyA6IFByb3RvY29sLnQgLT4gUHJvdG9jb2wudCAtPiBib29sIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImxldCAobmFtZSwgdHlwLCBzZXFpZCkgID0gaXByb3QjcmVhZE1lc3NhZ2VCZWdpbiBpbiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBIYXNodGJsLm1lbSBwcm9jZXNzTWFwIG5hbWUgdGhlbiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIChIYXNodGJsLmZpbmQgcHJvY2Vzc01hcCBuYW1lKSAoc2VxaWQsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiZWxzZSAoIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3Qjc2tpcChQcm90b2NvbC5UX1NUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgaXByb3QjcmVhZE1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgbGV0IHggPSBBcHBsaWNhdGlvbl9FeG4uY3JlYXRlIEFwcGxpY2F0aW9uX0V4bi5VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uIFwiXm5hbWUpIGluIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBQcm90b2NvbC5FWENFUFRJT04sIHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAgIHgjd3JpdGUgb3Byb3Q7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCN3cml0ZU1lc3NhZ2VFbmQ7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgICBvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ0cnVlIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOwotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaW5pdGlhbGl6ZXIiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJIYXNodGJsLmFkZCBwcm9jZXNzTWFwIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHNlbGYjcHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudChmX3NlcnZpY2VfaV8pIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBwcm9jZXNzIGZ1bmN0aW9uIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgZnVuY3Rpb24gdG8gd3JpdGUgYSBkaXNwYXRjaGVyIGZvcgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAodm9pZCkgdHNlcnZpY2U7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgIm1ldGhvZCBwcml2YXRlIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiIChzZXFpZCwgaXByb3QsIG9wcm90KSA9IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSBkZWNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gZGVjYXBpdGFsaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiX3Jlc3VsdCI7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKLSAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBhcmdzID0gImFyZ3MiOwotICBpZihmaWVsZHMuc2l6ZSgpID09IDApewotICAgIGFyZ3M9Il8iOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJsZXQgIjw8YXJnczw8IiA9IHJlYWRfIiA8PCBhcmdzbmFtZSA8PCAiIGlwcm90IGluIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCNyZWFkTWVzc2FnZUVuZDsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibGV0IHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIiBpbiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIih0cnkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotCi0KLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0I3NldF9zdWNjZXNzICI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIoaGFuZGxlciMiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICAiIGFyZ3MjZ2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0KLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndpdGgiIDw8ZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifCAiIDw8IGNhcGl0YWxpemUodHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkpIDw8ICIgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpewotICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdCNzZXRfIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIoKSI7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgfQotCi0KLQotICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCN3cml0ZU1lc3NhZ2VCZWdpbiAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIsIFByb3RvY29sLlJFUExZLCBzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJlc3VsdCN3cml0ZSBvcHJvdDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qjd3JpdGVNZXNzYWdlRW5kOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCNnZXRUcmFuc3BvcnQjZmx1c2giIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpewotICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7Ci0KLQotICBzdHJpbmcgbmFtZSA9IGRlY2FwaXRhbGl6ZSh0ZmllbGQtPmdldF9uYW1lKCkpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiNzZXRfIjw8bmFtZSA8PCAiICI7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LHR5cGUpOwotICBvdXQgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEUiOwotICB9Ci0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIG91dCA8PCAiaXByb3QjIjsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAicmVhZEJvb2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgb3V0IDw8ICJyZWFkQnl0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIG91dCA8PCAicmVhZEkxNiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIG91dCA8PCAicmVhZEkzMiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIG91dCA8PCAicmVhZEk2NCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIG91dCA8PCAicmVhZERvdWJsZSI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBzdHJpbmcgZW5hbWUgPSBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpOwotICAgIG91dCA8PCAiKCIgPDxlbmFtZSA8PCAiLm9mX2kgaXByb3QjcmVhZEkzMikiOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIERFU0VSSUFMSVpFIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgdHlwZS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgICBwcmVmaXggPSBjYXBpdGFsaXplKHByb2dyYW0tPmdldF9uYW1lKCkpICsgIl90eXBlcy4iOwotICB9Ci0gIHN0cmluZyBuYW1lID0gZGVjYXBpdGFsaXplKHRzdHJ1Y3QtPmdldF9uYW1lKCkpOwotICBvdXQgPDwgIigiIDw8IHByZWZpeCA8PCAicmVhZF8iIDw8IG5hbWUgPDwgIiBpcHJvdCkiOwotCi19Ci0KLS8qKgotICogU2VyaWFsaXplIGEgY29udGFpbmVyIGJ5IHdyaXRpbmcgb3V0IHRoZSBoZWFkZXIgZm9sbG93ZWQgYnkKLSAqIGRhdGEgYW5kIHRoZW4gYSBmb290ZXIuCi0gKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0gIHN0cmluZyBjb24gPSB0bXAoIl9jb24iKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8a3R5cGU8PCIsIjw8dnR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkTWFwQmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSBIYXNodGJsLmNyZWF0ZSAiPDxzaXplPDwiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIjw8c2l6ZTw8IiBkbyIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX2sgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgX3YgPSAiOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIG91dCA8PCAiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiPDxjb248PCAiIF9rIF92IiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZG9uZTsgaXByb3QjcmVhZE1hcEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkU2V0QmVnaW4gaW4iIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgImxldCAiPDxjb248PCIgPSBIYXNodGJsLmNyZWF0ZSAiPDxzaXplPDwiIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgaSA9IDEgdG8gIjw8c2l6ZTw8IiBkbyIgPDxlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLmFkZCAiPDxjb248PCIgIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJkb25lOyBpcHJvdCNyZWFkU2V0RW5kOyAiPDxjb248PCIpIjsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiKGxldCAoIjw8ZXR5cGU8PCIsIjw8c2l6ZTw8IikgPSBpcHJvdCNyZWFkTGlzdEJlZ2luIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJsZXQgIjw8Y29uPDwiID0gKEFycmF5LnRvX2xpc3QgKEFycmF5LmluaXQgIjw8c2l6ZTw8IiAoZnVuIF8gLT4gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIG91dCA8PCAiKSkpIGluIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdCNyZWFkTGlzdEVuZDsgIjw8Y29uPDwiKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYobmFtZS5sZW5ndGgoKSA9PSAwKXsKLSAgICBuYW1lID0gZGVjYXBpdGFsaXplKHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdCMiOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBvY2FtbCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHN0cmluZyBlbmFtZSA9IGNhcGl0YWxpemUodHlwZS0+Z2V0X25hbWUoKSk7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCI8PGVuYW1lPDwiLnRvX2kgIiA8PCBuYW1lIDw8ICIpIjsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci0gIG91dCA8PCAiOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOwotfQotCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJvcHJvdCN3cml0ZU1hcEJlZ2luKCI8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiSGFzaHRibC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwiOwotICAgIG91dCA8PCAiTGlzdC5sZW5ndGggIiA8PCBwcmVmaXggPDwgIik7IiA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgiX2tpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJfdml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiSGFzaHRibC5pdGVyIChmdW4gIjw8a2l0ZXI8PCIgLT4gZnVuICIgPDwgdml0ZXIgPDwgIiAtPiAiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpICIgPDwgcHJlZml4IDw8ICI7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJfaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJIYXNodGJsLml0ZXIgKGZ1biAiPDxpdGVyPDwiIC0+IGZ1biBfIC0+ICI7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSAiIDw8IHByZWZpeCA8PCAiOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgIkxpc3QuaXRlciAoZnVuICI8PGl0ZXI8PCIgLT4gIjsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikgIiA8PCBwcmVmaXggPDwgIjsiIDw8ICBlbmRsOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVNYXBFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAib3Byb3Qjd3JpdGVTZXRFbmQiOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90I3dyaXRlTGlzdEVuZCI7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgotICoKLSAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkKTsKLQotICB0X2ZpZWxkIHZmaWVsZCh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdml0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgotICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICduYW1lIGFyZ3MnCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHJldHVybgotICAgIHByZWZpeCArIGRlY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsKLSAgICAiICIgKyAgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOwotfQotCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3R5cGUodF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgbWV0aG9kLCBib29sIG9wdGlvbnMpewotICBzdHJpbmcgcmVzdWx0PSIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0ICs9IHJlbmRlcl9vY2FtbF90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYob3B0aW9ucykKLSAgICAgIHJlc3VsdCArPSAiIG9wdGlvbiI7Ci0gICAgcmVzdWx0ICs9ICIgLT4gIjsKLSAgfQotICBpZihmaWVsZHMuZW1wdHkoKSAmJiAhbWV0aG9kKXsKLSAgICByZXN1bHQgKz0gInVuaXQgLT4gIjsKLSAgfQotICByZXN1bHQgKz0gcmVuZGVyX29jYW1sX3R5cGUodGZ1bmMtPmdldF9yZXR1cm50eXBlKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfb2NhbWxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOwotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICBpZiAoIXR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICAgIHByZWZpeCA9IGNhcGl0YWxpemUocHJvZ3JhbS0+Z2V0X25hbWUoKSkgKyAiX3R5cGVzLiI7Ci0gICAgfQotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgaWYodHR5cGUtPmlzX3NlcnZpY2UoKSl7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUobmFtZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmFtZSA9IGRlY2FwaXRhbGl6ZShuYW1lKTsKLSAgfQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotLyoqCi0gKiBDb252ZXJ0cyB0aGUgcGFyc2UgdHlwZSB0byBhIFByb3RvY29sLnRfdHlwZSBlbnVtCi0gKi8KLXN0cmluZyB0X29jYW1sX2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9WT0lEIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9CT09MIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiUHJvdG9jb2wuVF9JMzIiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJQcm90b2NvbC5UX0k2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlByb3RvY29sLlRfRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX0kzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiUHJvdG9jb2wuVF9TVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJQcm90b2NvbC5UX01BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlByb3RvY29sLlRfTElTVCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYW4gb2NhbWwgdHlwZQotICovCi1zdHJpbmcgdF9vY2FtbF9nZW5lcmF0b3I6OnJlbmRlcl9vY2FtbF90eXBlKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHJldHVybiAidW5pdCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gInN0cmluZyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJib29sIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gImludCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIkludDMyLnQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgcmV0dXJuICJJbnQ2NC50IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiZmxvYXQiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gY2FwaXRhbGl6ZSgoKHRfZW51bSopdHlwZSktPmdldF9uYW1lKCkpKyIudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiB0eXBlX25hbWUoKHRfc3RydWN0Kil0eXBlKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7Ci0gICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICByZXR1cm4gIigiK3JlbmRlcl9vY2FtbF90eXBlKGt0eXBlKSsiLCIrcmVuZGVyX29jYW1sX3R5cGUodnR5cGUpKyIpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICByZXR1cm4gIigiK3JlbmRlcl9vY2FtbF90eXBlKGV0eXBlKSsiLGJvb2wpIEhhc2h0YmwudCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIHJldHVybiByZW5kZXJfb2NhbWxfdHlwZShldHlwZSkrIiBsaXN0IjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKG9jYW1sLCAiT0NhbWwiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjczYjIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX09PUF9HRU5FUkFUT1JfSAotI2RlZmluZSBUX09PUF9HRU5FUkFUT1JfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSAiZ2xvYmFscy5oIgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0vKioKLSAqIENsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIHNoYXJlZCBhY3Jvc3MgY29tbW9uIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZXMuCi0gKiBTcGVjaWZpY2FsbHksIG1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBmb3IgQysrL0phdmEuCi0gKgotICovCi1jbGFzcyB0X29vcF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9vb3BfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfZ2VuZXJhdG9yKHByb2dyYW0pIHt9Ci0KLSAgLyoqCi0gICAqIFNjb3BpbmcsIHVzaW5nIGN1cmx5IGJyYWNlcyEKLSAgICovCi0KLSAgdm9pZCBzY29wZV91cChzdGQ6Om9zdHJlYW0mIG91dCkgewotICAgIGluZGVudChvdXQpIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICB2b2lkIHNjb3BlX2Rvd24oc3RkOjpvc3RyZWFtJiBvdXQpIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB1cGNhc2Vfc3RyaW5nKHN0ZDo6c3RyaW5nIG9yaWdpbmFsKSB7Ci0gICAgc3RkOjp0cmFuc2Zvcm0ob3JpZ2luYWwuYmVnaW4oKSwgb3JpZ2luYWwuZW5kKCksIG9yaWdpbmFsLmJlZ2luKCksIChpbnQoKikoaW50KSkgdG91cHBlcik7Ci0gICAgcmV0dXJuIG9yaWdpbmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGNvbW1lbnQgYWJvdXQgdGhpcyBjb2RlIGJlaW5nIGF1dG9nZW5lcmF0ZWQsIHVzaW5nIEMrKyBzdHlsZQotICAgKiBjb21tZW50cywgd2hpY2ggYXJlIGFsc28gZmFpciBnYW1lIGluIEphdmEgLyBQSFAsIHlheSEKLSAgICoKLSAgICogQHJldHVybiBDLXN0eWxlIGNvbW1lbnQgbWVudGlvbmluZyB0aGF0IHRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkLgotICAgKi8KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBhdXRvZ2VuX2NvbW1lbnQoKSB7Ci0gICAgcmV0dXJuCi0gICAgICBzdGQ6OnN0cmluZygiLyoqXG4iKSArCi0gICAgICAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAgICIgKlxuIiArCi0gICAgICAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiICogIEBnZW5lcmF0ZWRcbiIgKwotICAgICAgIiAqL1xuIjsKLSAgfQotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkYWQzMy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODE1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogUEVSTCBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfcGVybF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcGVybF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgcGFyc2VkX29wdGlvbnM7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcGVybCI7Ci0gICAgZXNjYXBlX1snJCddID0gIlxcJCI7Ci0gICAgZXNjYXBlX1snQCddID0gIlxcQCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3hjZXB0aW9uPWZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QgICAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uICAodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3M9ZmFsc2UpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0ICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lciAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZCAgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50ICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogICAgIHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlcik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHN0ZDo6c3RyaW5nIHBlcmxfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0ZDo6c3RyaW5nIGF1dG9nZW5fY29tbWVudCgpIHsKLSAgICByZXR1cm4KLSAgICAgIHN0ZDo6c3RyaW5nKCIjXG4iKSArCi0gICAgICAiIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoIiArIFRIUklGVF9WRVJTSU9OICsgIilcbiIgKwotICAgICAgIiNcbiIgKwotICAgICAgIiMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgICAiI1xuIjsKLSAgfQotCi0gIHZvaWQgcGVybF9uYW1lc3BhY2VfZGlycyh0X3Byb2dyYW0qIHAsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGRpcnMpIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgZGlycy5wdXNoX2JhY2sobnMuc3Vic3RyKDAsIGxvYykpOwotICAgICAgICBucyA9IG5zLnN1YnN0cihsb2MrMSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5zLnNpemUoKSA+IDApIHsKLSAgICAgIGRpcnMucHVzaF9iYWNrKG5zKTsKLSAgICB9Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBwZXJsX25hbWVzcGFjZSh0X3Byb2dyYW0qIHApIHsKLSAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBlcmwiKTsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSAiIjsKLSAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxvYzsKLQotICAgIGlmIChucy5zaXplKCkgPiAwKSB7Ci0gICAgICB3aGlsZSAoKGxvYyA9IG5zLmZpbmQoIi4iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgcmVzdWx0ICs9IG5zLnN1YnN0cigwLCBsb2MpOwotICAgICAgICByZXN1bHQgKz0gIjo6IjsKLSAgICAgICAgbnMgPSBucy5zdWJzdHIobG9jKzEpOwotICAgICAgfQotCi0gICAgICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgICAgICByZXN1bHQgKz0gbnMgKyAiOjoiOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlX291dF9kaXIoKSB7Ci0gICAgc3RkOjpzdHJpbmcgb3V0ZGlyID0gZ2V0X291dF9kaXIoKTsKLSAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IGRpcnM7Ci0gICAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IGRpcnMuYmVnaW4oKTsgaXQgIT0gZGlycy5lbmQoKTsgaXQrKykgewotICAgICAgb3V0ZGlyICs9ICppdCArICIvIjsKLSAgICB9Ci0gICAgcmV0dXJuIG91dGRpcjsKLSAgfQotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG91dGRpciA9IGdldF9vdXRfZGlyKCk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gZGlyczsKLSAgcGVybF9uYW1lc3BhY2VfZGlycyhwcm9ncmFtXywgZGlycyk7Ci0gIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIGl0OwotICBmb3IgKGl0ID0gZGlycy5iZWdpbigpOyBpdCAhPSBkaXJzLmVuZCgpOyBpdCsrKSB7Ci0gICAgICBvdXRkaXIgKz0gKml0ICsgIi8iOwotICAgICAgTUtESVIob3V0ZGlyLmNfc3RyKCkpOwotICB9Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gb3V0ZGlyKyJUeXBlcy5wbSI7Ci0gIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lLmNfc3RyKCkpOwotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG91dGRpcisiQ29uc3RhbnRzLnBtIjsKLSAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl90eXBlc18gPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBlcmxfaW5jbHVkZXMoKTsKLQotICAvLyBQcmludCBoZWFkZXIKLSAgZl9jb25zdHNfIDw8Ci0gICAgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICAicGFja2FnZSAiPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IkNvbnN0YW50czsiPDxlbmRsPDwKLSAgICBwZXJsX2luY2x1ZGVzKCkgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBqYXZhIGltcG9ydHMKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7Ci0gIHN0cmluZyBpbmM7Ci0KLSAgaW5jICA9ICJyZXF1aXJlIDUuNi4wO1xuIjsKLSAgaW5jICs9ICJ1c2Ugc3RyaWN0O1xuIjsKLSAgaW5jICs9ICJ1c2Ugd2FybmluZ3M7XG4iOwotICBpbmMgKz0gInVzZSBUaHJpZnQ7XG5cbiI7Ci0KLSAgcmV0dXJuIGluYzsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZl90eXBlc18gPDwgIjE7IiA8PCBlbmRsOwotICBmX3R5cGVzXy5jbG9zZSgpOwotCi0gIGZfY29uc3RzXyA8PCAiMTsiIDw8IGVuZGw7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUEVSTCwgdHlwZXMgYXJlIGFsbCBpbXBsaWNpdC4KLSAqCi0gKiBAcGFyYW0gdHR5cGVkZWYgVGhlIHR5cGUgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBFUkwsIHdlIHVzZSBhIGdsb2JhbCBhcnJheSBmb3IgdGhpcy4KLSAqCi0gKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfIDw8ICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8dGVudW0tPmdldF9uYW1lKCk8PCI7Ijw8ZW5kbDsKLQotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBmX3R5cGVzXyA8PCAidXNlIGNvbnN0YW50ICI8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9PiAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgewotICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7Ci0gIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7Ci0KLSAgZl9jb25zdHNfIDw8ICJ1c2UgY29uc3RhbnQgIiA8PCBuYW1lIDw8ICIgPT4gIjsKLSAgZl9jb25zdHNfIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSk7Ci0gIGZfY29uc3RzXyA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyB0aGUgdmFsdWUgb2YgYSBjb25zdGFudCB3aXRoIHRoZSBnaXZlbiB0eXBlLiBOb3RlIHRoYXQgdHlwZSBjaGVja2luZwotICogaXMgTk9UIHBlcmZvcm1lZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGl0IGlzIGFsd2F5cyBydW4gYmVmb3JlaGFuZCB1c2luZyB0aGUKLSAqIHZhbGlkYXRlX3R5cGVzIG1ldGhvZCBpbiBtYWluLmNjCi0gKi8KLXN0cmluZyB0X3BlcmxfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotCi0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAiMSIgOiAiMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgIm5ldyAiIDw8IHBlcmxfbmFtZXNwYWNlKHR5cGUtPmdldF9wcm9ncmFtKCkpIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIih7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLQotICAgIG91dCA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLQotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBvdXQgPDwgIlsiIDw8IGVuZGw7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICAgIG91dCA8PCAiID0+IDEiOwotICAgICAgfQotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogTWFrZSBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIFN0cnVjdHMgY2FuIGJlIG5vcm1hbCBvciBleGNlcHRpb25zLgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBkYXRhIHR5cGUuIFRoaXMgaXMgbm90aGluZyBpbiBQRVJMCi0gKiB3aGVyZSB0aGUgb2JqZWN0cyBhcmUgYWxsIGp1c3QgYXNzb2NpYXRpdmUgYXJyYXlzICh1bmxlc3Mgb2YgY291cnNlIHdlCi0gKiBkZWNpZGUgdG8gc3RhcnQgdXNpbmcgb2JqZWN0cyBmb3IgdGhlbS4uLikKLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBvdXQgPDwKLSAgICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCI7XG4iOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhUaHJpZnQ6OlRFeGNlcHRpb24pO1xuIjsKLSAgfQotCi0gIC8vQ3JlYXRlIHNpbXBsZSBhY2Vzc29yIG1ldGhvZHMKLSAgb3V0IDw8ICJ1c2UgYmFzZSBxdyhDbGFzczo6QWNjZXNzb3IpO1xuIjsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCItPm1rX2FjY2Vzc29ycyggcXcoICI7Ci0gICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICAgIGlmICghdC0+aXNfeGNlcHRpb24oKSkgewotICAgICAgICAgICAgICBvdXQgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIjsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG91dCA8PCAiKSApO1xuIjsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIG5ldygpCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwKLSAgICAic3ViIG5ldyB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRjbGFzc25hbWUgPSBzaGlmdDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHNlbGYgICAgICA9IHt9OyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkdmFscyAgICAgID0gc2hpZnQgfHwge307IiA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJ1bmRlZiI7Ci0gICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgISh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgZHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZSgoKm1faXRlciktPmdldF90eXBlKCksICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9ID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMICYmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiJHNlbGYtPnsiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKFVOSVZFUlNBTDo6aXNhKCR2YWxzLCdIQVNIJykpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9KSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICRzZWxmLT57IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkdmFscy0+eyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIH0KLQotICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBibGVzcyAoJHNlbGYsICRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9XG5cbiI7Ci0KLSAgb3V0IDw8Ci0gICAgInN1YiBnZXROYW1lIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotCi19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAic3ViIHJlYWQgeyIgPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJHNlbGYsICRpbnB1dCkgPSBAXzsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHhmZXIgID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgICAgIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJGZpZCAgID0gMDsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFxcJGZuYW1lKTsiIDw8IGVuZGw7Ci0KLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSAiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOwotCi0gIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibGFzdDsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotCi0gIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJTV0lUQ0g6IGZvcigkZmlkKSIgPDwgZW5kbDsKLQotICBzY29wZV91cChvdXQpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgaW5kZW50KG91dCkgPDwgIi9eIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiJC8gJiYgZG97IjsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJzZWxmLT4iKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgaW5kZW50KG91dCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKLQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJsYXN0OyB9OyIgPDwgZW5kbDsKLQotICB9Ci0gIC8vIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2Ugc2tpcCB0aGUgZmllbGQKLQotICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotCi0gIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQgPDwgInN1YiB3cml0ZSB7IiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAibXkgKCRzZWxmLCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIm15ICR4ZmVyICAgPSAwOyIgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChkZWZpbmVkICRzZWxmLT57IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0KLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYtPiIpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotICB9Ci0KLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8aW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IGdldF9uYW1lc3BhY2Vfb3V0X2RpcigpK3NlcnZpY2VfbmFtZV8rIi5wbSI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgLy8vICAgICAgInBhY2thZ2UgIjw8c2VydmljZV9uYW1lXzw8IjsiPDxlbmRsPDwKLSAgICBhdXRvZ2VuX2NvbW1lbnQoKSA8PAotICAgIHBlcmxfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiVHlwZXM7IiA8PCBlbmRsOwotCi0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpIDw8IGV4dGVuZHNfcy0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQRVJMKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfIDw8ICIxOyIgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJQcm9jZXNzb3IpOyI7Ci0gIH0KLQotICBpbmRlbnRfdXAoKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlByb2Nlc3NvcjsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PAotICAgIGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJzdWIgbmV3IHsiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGhhbmRsZXIpID0gQF87Ijw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgID0ge307IiAgIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntoYW5kbGVyfSA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MgKCRzZWxmLCAkY2xhc3NuYW1lKTsiPDxlbmRsOwotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBwcm9jZXNzIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkaW5wdXQsICRvdXRwdXQpID0gQF87IiA8PCBlbmRsOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRmbmFtZSAgPSB1bmRlZjsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgJG10eXBlICA9IDA7IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbDsKLQotICAvLyBIT1Q6IGNoZWNrIGZvciBtZXRob2QgaW1wbGVtZW50YXRpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoISRzZWxmLT5jYW4oJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUVHlwZTo6U1RSVUNUKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkcnNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHgtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRzZWxmLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gMTsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDxlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIC8vIE9wZW4gZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJzdWIgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiIHsiPDxlbmRsOwotCi0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAibXkgKCRzZWxmLCAkc2VxaWQsICRpbnB1dCwgJG91dHB1dCkgPSBAXzsiIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIGFyZ3NuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcGVybF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkYXJncy0+cmVhZCgkaW5wdXQpOyIgPDwgZW5kbDsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImV2YWwgeyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiJHJlc3VsdC0+e3N1Y2Nlc3N9ID0gIjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiRzZWxmLT57aGFuZGxlcn0tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIiRhcmdzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpOyIgPDwgZW5kbDsKLQotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ9OyBpZiggVU5JVkVSU0FMOjppc2EoJEAsJyIgPDwKLSAgICAgICAgICBwZXJsX25hbWVzcGFjZSgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9wcm9ncmFtKCkpIDw8Ci0gICAgICAgICAgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIicpICl7ICIgPDwgZW5kbDsKLQotICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudF91cCgpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnsiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAifSA9ICRAOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIHN0cmluZyBuYW1lID0gdHMtPmdldF9uYW1lKCk7Ci0gICAgdHMtPnNldF9uYW1lKHNlcnZpY2VfbmFtZV8gKyAiXyIgKyBuYW1lKTsKLSAgICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICAgIHRzLT5zZXRfbmFtZShuYW1lKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BlcmxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgdF9maWVsZCBzdWNjZXNzKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgfQotCi0gIGdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgaW50ZXJmYWNlIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzX2lmID0gInVzZSBiYXNlIHF3KCIgKyBwZXJsX25hbWVzcGFjZShleHRlbmRzX3MtPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kc19zLT5nZXRfbmFtZSgpICsgIklmKTsiOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJwYWNrYWdlICIgPDwgcGVybF9uYW1lc3BhY2UocHJvZ3JhbV8pIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmOyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgInVzZSBzdHJpY3Q7IiA8PCBlbmRsIDw8Ci0gICAgZXh0ZW5kc19pZiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICBpbmRlbnRfdXAoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PGVuZGw8PCAiICBkaWUgJ2ltcGxlbWVudCBpbnRlcmZhY2UnO1xufSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2lmID0gIiI7Ci0gIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7Ci0gIGlmIChleHRlbmRzX3MgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgICAgPSAgZXh0ZW5kc19zLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAidXNlIGJhc2UgcXcoIiArIHBlcmxfbmFtZXNwYWNlKGV4dGVuZHNfcy0+Z2V0X3Byb2dyYW0oKSkgKyBleHRlbmRzX3MtPmdldF9uYW1lKCkgKyAiUmVzdCk7IjsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgInBhY2thZ2UgIiA8PCBwZXJsX25hbWVzcGFjZShwcm9ncmFtXykgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdDsiIDw8IGVuZGwgPDwgZW5kbCA8PAotICAgICJ1c2Ugc3RyaWN0OyIgPDwgZW5kbCA8PAotICAgIGV4dGVuZHNfaWYgPDwgZW5kbCA8PCBlbmRsOwotCi0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICgkY2xhc3NuYW1lLCAkaW1wbCkgPSBAXzsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgPXsgaW1wbCA9PiAkaW1wbCB9OyIgPDwgZW5kbCA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOyIgPDwgZW5kbDsKLQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gIDw8Ci0gICAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotICB9Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInN1YiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgInsiICAgIDw8ZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICgkc2VsZiwgJHJlcXVlc3QpID0gQF87IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGZvciAoYV9pdGVyID0gYXJncy5iZWdpbigpOyBhX2l0ZXIgIT0gYXJncy5lbmQoKTsgKythX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogYXR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqYV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgICBzdHJpbmcgcmVxID0gIiRyZXF1ZXN0LT57JyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ30iOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAoIiA8PCByZXEgPDwgIikgPyAiIDw8IHJlcSA8PCAiIDogdW5kZWY7IiA8PCBlbmRsOwotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIm15IEAiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gc3BsaXQoLywvLCAkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgICAgIDw8ICIkIjw8KCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IiA9IFxcQCI8PCgqYV9pdGVyKS0+Z2V0X25hbWUoKTw8ZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybiAkc2VsZi0+e2ltcGx9LT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCkpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PGVuZGw7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOwotICB0X3NlcnZpY2UqIGV4dGVuZHNfcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOwotICBpZiAoZXh0ZW5kc19zICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gcGVybF9uYW1lc3BhY2UoZXh0ZW5kc19zLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHNfcy0+Z2V0X25hbWUoKTsKLSAgICBleHRlbmRzX2NsaWVudCA9ICJ1c2UgYmFzZSBxdygiICsgZXh0ZW5kcyArICJDbGllbnQpOyI7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgICAicGFja2FnZSAiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQ7IiA8PCBlbmRsIDw8IGVuZGwgPDwKLSAgICAgIGV4dGVuZHNfY2xpZW50IDw8IGVuZGwgPDwKLSAgICAgICJ1c2UgYmFzZSBxdygiIDw8IHBlcmxfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZik7IiA8PCBlbmRsOwotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8gPDwgInN1YiBuZXcgeyI8PGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJteSAoJGNsYXNzbmFtZSwgJGlucHV0LCAkb3V0cHV0KSA9IEBfOyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkc2VsZiAgICAgID0ge307IiAgIDw8ZW5kbDsKLQotICBpZiAoIWV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57aW5wdXR9ICA9ICRpbnB1dDsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0gPSBkZWZpbmVkICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57c2VxaWR9ICA9IDA7IiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ijw8ZW5kbDsKLQotICBpbmRlbnRfZG93bigpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgZl9zZXJ2aWNlXyA8PCAic3ViICIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBpbmRlbnQoKSA8PAotICAgICAgIiRzZWxmLT5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAiJHNlbGYtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJzdWIgc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBlcmxfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotCi0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkc2VsZi0+e291dHB1dH0tPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpDQUxMLCAkc2VsZi0+e3NlcWlkfSk7IiA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRhcmdzLT53cml0ZSgkc2VsZi0+e291dHB1dH0pOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntvdXRwdXR9LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBmX3NlcnZpY2VfIDw8ICJ9IiA8PCBlbmRsOwotCi0KLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgInN1YiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm15ICRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJGZuYW1lOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBteSAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgJHgtPnJlYWQoJHNlbGYtPntpbnB1dH0pOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICAkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZGllICR4OyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT5yZWFkKCRzZWxmLT57aW5wdXR9KTsiIDw8IGVuZGw7Ci0KLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57c3VjY2Vzc30gKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICRyZXN1bHQtPntzdWNjZXNzfTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoZGVmaW5lZCAkcmVzdWx0LT57IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIn0pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBkaWUgJHJlc3VsdC0+eyIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJ9OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZGllIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCI7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn0iPDxlbmRsOwotCi0gICAgfQotICB9Ci0KLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewotICAodm9pZCkgaW5jbGFzczsKLSAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIERFU0VSSUFMSVpFIENPREUgRk9SIHZvaWQgVFlQRTogIiArCi0gICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAvL0hhY2sgZm9yIHdoZW4gcHJlZml4IGlzIGRlZmluZWQgKGFsd2F5cyBhIGhhc2ggcmVmKQotICBpZiAoIXByZWZpeC5lbXB0eSgpKSB7Ci0gICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbChcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgIG91dCA8PCAicmVhZEJ5dGUoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAicmVhZEkxNihcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKFxcJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICBvdXQgPDwgInJlYWRJNjQoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAicmVhZERvdWJsZShcXCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBFUkwgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgInJlYWRJMzIoXFwkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJteSAkIiA8PCBzaXplIDw8ICIgPSAwOyIgPDwgZW5kbDsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0ge307IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAibXkgJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIiA8PAotICAgICAgIlxcJCIgPDwga3R5cGUgPDwgIiwgXFwkIiA8PCB2dHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICJcXCQiIDw8IGV0eXBlIDw8ICIsIFxcJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm15ICQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigiIDw8Ci0gICAgICAiXFwkIiA8PCBldHlwZSA8PCAiLCBcXCQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotCi0gIH0KLQotICAvLyBGb3IgbG9vcCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCi0gIHN0cmluZyBpID0gdG1wKCJfaSIpOwotICBpbmRlbnQob3V0KSA8PAotICAgICJmb3IgKG15ICQiIDw8Ci0gICAgaSA8PCAiID0gMDsgJCIgPDwgaSA8PCAiIDwgJCIgPDwgc2l6ZSA8PCAiOyArKyQiIDw8IGkgPDwgIikiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBwcmVmaXgpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgKHRfbGlzdCopdHR5cGUsIHByZWZpeCk7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci0KLQotICAvLyBSZWFkIGNvbnRhaW5lciBlbmQKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICBzY29wZV9kb3duKG91dCk7Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKLSAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwotICB0X2ZpZWxkIGZ2YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZhbCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZma2V5LCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgIGRlY2xhcmVfZmllbGQoJmZ2YWwsIHRydWUsIHRydWUpIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmtleSk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwga2V5IDw8ICJ9ID0gJCIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJteSAkIiA8PCBlbGVtIDw8ICIgPSB1bmRlZjsiIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1c2goQHskIiA8PCBwcmVmaXggPDwgIn0sJCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAieyIrdGZpZWxkLT5nZXRfbmFtZSgpKyJ9IiApOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgInsiICsgdGZpZWxkLT5nZXRfbmFtZSgpKyJ9Iik7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7Ci0KLSAgICBzdHJpbmcgbmFtZSA9IHRmaWVsZC0+Z2V0X25hbWUoKTsKLQotICAgIC8vSGFjayBmb3Igd2hlbiBwcmVmaXggaXMgZGVmaW5lZCAoYWx3YXlzIGEgaGFzaCByZWYpCi0gICAgaWYoIXByZWZpeC5lbXB0eSgpKQotICAgICAgbmFtZSA9IHByZWZpeCArICJ7IiArIHRmaWVsZC0+Z2V0X25hbWUoKSArICJ9IjsKLQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+IjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdwotICAgICAgICAgICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgIG91dCA8PCAid3JpdGVEb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEVSTCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgIH0KLSAgICBvdXQgPDwgZW5kbDsKLQotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGVzIG91dCBhIGNvbnRhaW5lcgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgInNjYWxhcihrZXlzICV7JCIgPDwgcHJlZml4IDw8ICJ9KSk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzY2FsYXIoQHskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICJzY2FsYXIoQHskIiA8PCBwcmVmaXggPDwgIn0pKTsiIDw8IGVuZGw7Ci0KLSAgfQotCi0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIHN0cmluZyBraXRlciA9IHRtcCgia2l0ZXIiKTsKLSAgICBzdHJpbmcgdml0ZXIgPSB0bXAoInZpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJ3aGlsZSggbXkgKCQiPDxraXRlcjw8IiwkIjw8dml0ZXI8PCIpID0gZWFjaCAleyQiIDw8IHByZWZpeCA8PCAifSkgIiA8PCBlbmRsOwotCi0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJmb3JlYWNoIG15ICQiPDxpdGVyPDwiIChAeyQiIDw8IHByZWZpeCA8PCAifSkiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0KLQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCBteSAkIjw8aXRlcjw8IiAoQHskIiA8PCBwcmVmaXggPDwgIn0pICIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwRW5kKCk7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCk7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KLSAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCi0gKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKLSAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQpOwotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgb2JqKSB7Ci0gIHN0cmluZyByZXN1bHQgPSAibXkgJCIgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICByZXN1bHQgKz0gIiA9ICcnIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQRVJMIGluaXRpYWxpemVyIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIHJlc3VsdCArPSAiID0gMCI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBpZiAob2JqKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSB1bmRlZiI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXN1bHQgKyAiOyI7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotCi0gIHN0cmluZyBzdHI7Ci0KLSAgc3RyICA9IHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJ7XG4iOwotICBzdHIgKz0gIiAgbXkgJHNlbGYgPSBzaGlmdDtcbiI7Ci0KLSAgLy9OZWVkIHRvIGNyZWF0ZSBwZXJsIGZ1bmN0aW9uIGFyZyBpbnB1dHMKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiAmZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdHIgKz0gIiAgbXkgJCIgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiID0gc2hpZnQ7XG4iOwotICB9Ci0KLSAgcmV0dXJuIHN0cjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLSAgICByZXN1bHQgKz0gIiQiICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9wZXJsX2dlbmVyYXRvciA6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpIHsKLSAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7Ci0KLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGU6OkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGU6OkJZVEUiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6U1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiAiVFR5cGU6Ok1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGU6OkxJU1QiOwotICB9Ci0KLSAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotfQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHBlcmwsICJQZXJsIiwgIiIpCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MjhmYmYuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotI2RlZmluZSBOU0dMT0JBTCAgKG5zZ2xvYmFsXy5zaXplKCkgPyBuc2dsb2JhbF8gOiAiIikKLSNkZWZpbmUgTlNHTE9CQUxfQSAoIlxcIiArIE5TR0xPQkFMICkKLSNkZWZpbmUgTlNHTE9CQUxfQiAoIE5TR0xPQkFMICsgIlxcIikKLSNkZWZpbmUgTlNHTE9CQUxfQUIgKCJcXCIgKyBOU0dMT0JBTCArICJcXCIpCi0KLQotLyoqCi0gKiBQSFAgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3BocF9nZW5lcmF0b3IgOiBwdWJsaWMgdF9vb3BfZ2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIHRfcGhwX2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBvcHRpb25fc3RyaW5nOwotICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiaW5saW5lZCIpOwotICAgIGJpbmFyeV9pbmxpbmVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInJlc3QiKTsKLSAgICByZXN0XyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJzZXJ2ZXIiKTsKLSAgICBwaHBzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJvb3AiKTsKLSAgICBvb3BfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoIm5zZ2xvYmFsIik7Ci0gICAgaWYoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgbnNnbG9iYWxfID0gaXRlci0+c2Vjb25kOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIG5zZ2xvYmFsXyA9ICIiOyAvLyBieSBkZWZhdWx0IGdsb2JhbCBuYW1lc3BhY2UgaXMgZW1wdHkKLSAgICB9Ci0KLSAgICBpZiAob29wXyAmJiBiaW5hcnlfaW5saW5lXykgewotICAgICAgdGhyb3cgIm9vcCBhbmQgaW5saW5lZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiI7Ci0gICAgfQotCi0gICAgb3V0X2Rpcl9iYXNlXyA9IChiaW5hcnlfaW5saW5lXyA/ICJnZW4tcGhwaSIgOiAiZ2VuLXBocCIpOwotICAgIGVzY2FwZV9bJyQnXSA9ICJcXCQiOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgaXNfdmFsaWRfbmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfbmFtZXNwYWNlKTsKLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3RzIQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICB2b2lkIGdlbmVyYXRlX3BocF90eXBlX3NwZWMoc3RkOjpvZnN0cmVhbSAmb3V0LCB0X3R5cGUqIHQpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhzdGQ6Om9mc3RyZWFtICZvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9yZXN0ICAgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3NvciAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbiAgKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkICAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogICAgdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzPWZhbHNlKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdCAgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqICAgdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogICAgIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50ICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50IChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQgICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0ICAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lciAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudCAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqICAgICAgdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudCAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqICAgICB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBwaHBfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdD1mYWxzZSwgYm9vbCBvYmo9ZmFsc2UpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGFkZFN0cnVjdFNpZ25hdHVyZSA9IHRydWUpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2Nhc3QodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBwaHBfbmFtZXNwYWNlX2Jhc2UoY29uc3QgdF9wcm9ncmFtKiBwKSB7Ci0gICAgc3RkOjpzdHJpbmcgbnMgPSBwLT5nZXRfbmFtZXNwYWNlKCJwaHAiKTsKLSAgICBjb25zdCBjaGFyICogZGVsaW1pdGVyID0gIlxcIjsKLSAgICBzaXplX3QgcG9zaXRpb24gPSBucy5maW5kKCcuJyk7Ci0gICAgd2hpbGUgKHBvc2l0aW9uICE9IHN0cmluZzo6bnBvcykgewotICAgICAgbnMucmVwbGFjZShwb3NpdGlvbiwgMSwgZGVsaW1pdGVyKTsKLSAgICAgIHBvc2l0aW9uID0gbnMuZmluZCgnLicsIHBvc2l0aW9uICsgMSk7Ci0gICAgfQotICAgIHJldHVybiBuczsKLSAgfQotCi0gIC8vZ2VuZXJhbCB1c2UgbmFtZXNwYWNlIHByZWZpeGluZzogXG15XG5hbWVzcGFjZVwgb3IgbXlfbmFtZXNwYWNlXwotICBzdHJpbmcgcGhwX25hbWVzcGFjZShjb25zdCB0X3Byb2dyYW0qIHApIHsKLSAgICBzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7Ci0gICAgcmV0dXJuIChuc2dsb2JhbF8uc2l6ZSgpID8gTlNHTE9CQUxfQUIgOiBOU0dMT0JBTF9CKSArIChucy5zaXplKCkgPyAobnMgKyAiXFwiKSA6ICIiKTsKLSAgfQotCi0gIC8vc2V0dGluZyB0aGUgbmFtZXNwYWNlIG9mIGEgZmlsZTogbXlcbmFtZXNwYWNlCi0gIHN0cmluZyBwaHBfbmFtZXNwYWNlX3N1ZmZpeChjb25zdCB0X3Byb2dyYW0qIHApIHsKLSAgICBzdHJpbmcgbnMgPSBwaHBfbmFtZXNwYWNlX2Jhc2UocCk7Ci0KLSAgICByZXR1cm4gKG5zZ2xvYmFsXy5zaXplKCkgPyBOU0dMT0JBTF9CIDogTlNHTE9CQUwpICsgbnM7Ci0gIH0KLQotICAvL2FkZCBhIGRpcmVjdG9yeSB0byBhbGxyZWFkeSBleGlzdGluZyBuYW1lc3BhY2UKLSAgc3RyaW5nIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KHN0cmluZyBkaXJlY3RvcnksIGJvb2wgZW5kID0gdHJ1ZSkgewotICAgIGlmKGVuZCkgewotICAgICAgcmV0dXJuICI7IjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfQotCi0gIC8vd3JpdGluZyBhbiBhdXRsb2FkIGlkZW50aWZpZXIgaW50byBnbG9iYTtsczogbXlcbmFtZXNwYWNlXCBvciBteV9uYW1lc3BhY2VfCi0gIHN0cmluZyBwaHBfbmFtZXNwYWNlX2F1dG9sb2FkKGNvbnN0IHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcGhwX25hbWVzcGFjZV9iYXNlKHApOwotICAgIHJldHVybiAobnNnbG9iYWxfLnNpemUoKSA/IE5TR0xPQkFMX0IgOiBOU0dMT0JBTCkgKyAobnMuc2l6ZSgpID8gKG5zICsgIlxcIikgOiAiIik7Ci0gIH0KLQotICAvL2RlY2xhcmluZyBhIHR5cGU6IHR5cGVuYW1lIG9yIG15X25hbWVzcGFjZV90eXBlbmFtZQotICBzdHJpbmcgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0X3R5cGUqIHQpIHsKLSAgICByZXR1cm4gdC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHBocF9wYXRoKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicGhwLnBhdGgiKTsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIHAtPmdldF9uYW1lKCk7Ci0gICAgfQotCi0gICAgLy8gVHJhbnNmb3JtIHRoZSBqYXZhLXN0eWxlIG5hbWVzcGFjZSBpbnRvIGEgcGF0aC4KLSAgICBmb3IgKHN0ZDo6c3RyaW5nOjppdGVyYXRvciBpdCA9IG5zLmJlZ2luKCk7IGl0ICE9IG5zLmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoKml0ID09ICcuJykgewotICAgICAgICAqaXQgPSAnLyc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5zICsgJy8nOwotICB9Ci0KLSAgLyoqCi0gICAqIFRyYW5zZm9ybSBjbGFzc19tZXRob2QgaW50byBDbGFzc01ldGhvZAotICAgKgotICAgKiBAcGFyYW0gc3RyCi0gICAqIEByZXR1cm4gc3Rpcm5nCi0gICAqLwotICBzdHJpbmcgY2xhc3NpZnkoc3RyaW5nIHN0cikKLSAgewotICAgIHN0cmluZyBjbGFzc2UgPSAiIjsKLQotICAgIHZlY3RvcjxzdHJpbmc+IHggPSBzcGxpdChzdHIsICdfJyk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHguc2l6ZSgpOyArK2kpIHsKLSAgICAgIGNsYXNzZSA9IGNsYXNzZSArIGNhcGl0YWxpemUoeFtpXSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNsYXNzZTsKLSAgfQotCi0gIC8qKgotICAgKiBTcGxpdCBtZXRob2QKLSAgICogQHBhcmFtIHMKLSAgICogQHBhcmFtIGRlbGltCi0gICAqIEBwYXJhbSBlbGVtcwotICAgKiBAcmV0dXJuCi0gICAqLwotICB2ZWN0b3I8c3RyaW5nPiAmc3BsaXQoY29uc3Qgc3RyaW5nICZzLCBjaGFyIGRlbGltLCB2ZWN0b3I8c3RyaW5nPiAmZWxlbXMpIHsKLSAgICBzdHJpbmdzdHJlYW0gc3Mocyk7Ci0gICAgc3RyaW5nIGl0ZW07Ci0KLSAgICB3aGlsZShnZXRsaW5lKHNzLCBpdGVtLCBkZWxpbSkpIHsKLSAgICAgIGVsZW1zLnB1c2hfYmFjayhpdGVtKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZWxlbXM7Ci0gIH0KLQotICB2ZWN0b3I8c3RyaW5nPiBzcGxpdChjb25zdCBzdHJpbmcgJnMsIGNoYXIgZGVsaW0pIHsKLSAgICB2ZWN0b3I8c3RyaW5nPiBlbGVtczsKLQotICAgIHJldHVybiBzcGxpdChzLCBkZWxpbSwgZWxlbXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhcGl0YWxpemUgbWV0aG9kCi0gICAqIEBwYXJhbSBzdHIKLSAgICogQHJldHVybgotICAgKi8KLSAgc3RyaW5nIGNhcGl0YWxpemUoc3RyaW5nIHN0cikKLSAgewotICAgIHN0cmluZzo6aXRlcmF0b3IgaXQoc3RyLmJlZ2luKCkpOwotCi0gICAgaWYgKGl0ICE9IHN0ci5lbmQoKSkKLSAgICAgICAgc3RyWzBdID0gdG91cHBlcigodW5zaWduZWQgY2hhcilzdHJbMF0pOwotCi0vLyAgICB3aGlsZSgrK2l0ICE9IHN0ci5lbmQoKSkKLS8vICAgIHsKLS8vICAgICAgKml0ID0gdG9sb3dlcigodW5zaWduZWQgY2hhcikqaXQpOwotLy8gICAgfQotICAgIHJldHVybiBzdHI7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwotICAvKioKLSAgICogR2VuZXJhdGUgcHJvdG9jb2wtaW5kZXBlbmRlbnQgdGVtcGxhdGU/IE9yIEJpbmFyeSBpbmxpbmUgY29kZT8KLSAgICovCi0gIGJvb2wgYmluYXJ5X2lubGluZV87Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlIGEgUkVTVCBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBib29sIHJlc3RfOwotCi0gIC8qKgotICAgKiBHZW5lcmF0ZSBzdHVicyBmb3IgYSBQSFAgc2VydmVyCi0gICAqLwotICBib29sIHBocHNfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIHVzZSBPT1AgYmFzZSBjbGFzcyBUQmFzZQotICAgKi8KLSAgYm9vbCBvb3BfOwotCi0gIC8qKgotICAgKiBHbG9iYWwgbmFtZXNwYWNlIGZvciBQSFAgNS4zCi0gICAqLwotICBzdGQ6OnN0cmluZyBuc2dsb2JhbF87Ci19OwotCi0KLWJvb2wgdF9waHBfZ2VuZXJhdG9yOjppc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpIHsKLSAgcmV0dXJuIHN1Yl9uYW1lc3BhY2UgPT0gInBhdGgiOwotfQotCi0KLS8qKgotICogUHJlcGFyZXMgZm9yIGZpbGUgZ2VuZXJhdGlvbiBieSBvcGVuaW5nIHVwIHRoZSBuZWNlc3NhcnkgZmlsZSBvdXRwdXQKLSAqIHN0cmVhbXMuCi0gKgotICogQHBhcmFtIHRwcm9ncmFtIFRoZSBwcm9ncmFtIHRvIGdlbmVyYXRlCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gQ3JlYXRlIFJlYWwgZGlyZWN0b3J5IE5hbWVzcGFjZXMKLSAgdmVjdG9yPHN0cmluZz4gTlN4ID0gc3BsaXQocGhwX25hbWVzcGFjZV9zdWZmaXgoZ2V0X3Byb2dyYW0oKSksICdcXCcpOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlN4LnNpemUoKTsgKytpKSB7Ci0JcGFja2FnZV9kaXJfID0gcGFja2FnZV9kaXJfICsgIi8iICsgTlN4W2ldICsgIi8iOwotCU1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgfQotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHBhY2thZ2VfZGlyXysiVHlwZXMucGhwIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgIjw/cGhwIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8ICJuYW1lc3BhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOwotICBmX3R5cGVzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3R5cGVzXyA8PCBlbmRsOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCBwaHAgaW5jbHVkZXMKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6cGhwX2luY2x1ZGVzKCkgewotICBzdHJpbmcgVEJhc2UgPSAidXNlIFRocmlmdFxcQmFzZVxcVEJhc2U7XG4iOwotICBzdHJpbmcgVFR5cGUgPSAidXNlIFRocmlmdFxcVHlwZVxcVFR5cGU7XG4iOwotICBzdHJpbmcgVE1lc3NhZ2VUeXBlID0gInVzZSBUaHJpZnRcXFR5cGVcXFRNZXNzYWdlVHlwZTtcbiI7Ci0gIHN0cmluZyBURXhjZXB0aW9uID0gInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEV4Y2VwdGlvbjtcbiI7Ci0gIHN0cmluZyBUUHJvdG9jb2xFeGNlcHRpb24gPSAidXNlIFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb247XG4iOwotICBzdHJpbmcgVFByb3RvY29sID0gInVzZSBUaHJpZnRcXFByb3RvY29sXFxUUHJvdG9jb2w7XG4iOwotICBzdHJpbmcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gInVzZSBUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uO1xuXG4iOwotCi0gIHJldHVybiBUQmFzZSArIFRUeXBlICsgVE1lc3NhZ2VUeXBlICsgVEV4Y2VwdGlvbiArIFRQcm90b2NvbEV4Y2VwdGlvbiArIFRQcm90b2NvbCArIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLX0KLQotLyoqCi0gKiBDbG9zZSB1cCAob3IgZG93bikgc29tZSBmaWxlei4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgLy8gQ2xvc2UgdHlwZXMgZmlsZQotICAgIGZfdHlwZXNfIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBQSFAsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCi0gKgotICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gU2luY2UgZGVmaW5lIGlzIGV4cGVuc2l2ZSB0byBsb29rdXAKLSAqIGluIFBIUCwgd2UgdXNlIGEgZ2xvYmFsIGFycmF5IGZvciB0aGlzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+OjppdGVyYXRvciBjX2l0ZXI7Ci0KLSAgLy8gV2UncmUgYWxzbyBkb2luZyBpdCB0aGlzIHdheSB0byBzZWUgaG93IGl0IHBlcmZvcm1zLiBJdCdzIG1vcmUgbGVnaWJsZQotICAvLyBjb2RlIGJ1dCB5b3UgY2FuJ3QgZG8gdGhpbmdzIGxpa2UgYW4gJ2V4dHJhY3QnIG9uIGl0LCB3aGljaCBpcyBhIGJpdCBvZgotICAvLyBhIGRvd25lci4KLSAgZl90eXBlc18gPDwKLSAgICAiZmluYWwgY2xhc3MgIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiY29uc3QgIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgInN0YXRpYyBwdWJsaWMgJF9fbmFtZXMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKLSAgICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgICAiICAiIDw8IHZhbHVlIDw8ICIgPT4gJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnQoZl90eXBlc18pIDw8Ci0gICAgIik7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmX3R5cGVzXyA8PCAiJEdMT0JBTFNbJyIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiX0NPTlNUQU5UUyddWyciIDw8IG5hbWUgPDwgIiddID0gIjsKLSAgZl90eXBlc18gPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl90eXBlc18gPDwgIjsiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoYXJyYXkoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwotICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKLSAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgPT4gIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpKSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA9PiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgb3V0IDw8ICJhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKLSAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgICBvdXQgPDwgIiA9PiB0cnVlIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSI7Ci0gIH0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotLyoqCi0gKiBNYWtlIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0gIGluZGVudChvdXQpIDw8ICIndHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0odCkgPDwgIiwiIDw8IGVuZGw7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpIHx8IHQtPmlzX2VudW0oKSkgewotICAgIC8vIE5vb3AsIHR5cGUgaXMgYWxsIHdlIG5lZWQKLSAgfSBlbHNlIGlmICh0LT5pc19zdHJ1Y3QoKSB8fCB0LT5pc194Y2VwdGlvbigpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIidjbGFzcycgPT4gJyIgPDwgcGhwX25hbWVzcGFjZSh0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0LT5nZXRfbmFtZSgpIDw8IicsIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9IGdldF90cnVlX3R5cGUoKCh0X21hcCopdCktPmdldF9rZXlfdHlwZSgpKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbWFwKil0KS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIGluZGVudChvdXQpIDw8ICIna3R5cGUnID0+ICIgPDwgdHlwZV90b19lbnVtKGt0eXBlKSA8PCAiLCIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAiJ3Z0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh2dHlwZSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidrZXknID0+IGFycmF5KCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwga3R5cGUpOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICIndmFsJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIHZ0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkgfHwgdC0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdCktPmdldF9lbGVtX3R5cGUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfc2V0Kil0KS0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICB9Ci0gICAgaW5kZW50KG91dCkgPDwgIidldHlwZScgPT4gIiA8PCB0eXBlX3RvX2VudW0oZXR5cGUpIDw8IiwiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIidlbGVtJyA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvdXQsIGV0eXBlKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiKSwiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIHR5cGUgZm9yIHBocCBzdHJ1Y3Qgc3BlYyBmaWVsZCI7Ci0gIH0KLQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgc3RydWN0IHNwZWNpZmljYXRpb24gc3RydWN0dXJlLCB3aGljaCBmdWxseSBxdWFsaWZpZXMgZW5vdWdoCi0gKiB0eXBlIGluZm9ybWF0aW9uIHRvIGdlbmVyYWxpemUgc2VyaWFsaXphdGlvbiByb3V0aW5lcy4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiaWYgKCFpc3NldChzZWxmOjokX1RTUEVDKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInNlbGY6OiRfVFNQRUMgPSBhcnJheSgiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiA9PiBhcnJheSgiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJ3ZhcicgPT4gJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAiICApOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4gVGhpcyBpcyBub3RoaW5nIGluIFBIUAotICogd2hlcmUgdGhlIG9iamVjdHMgYXJlIGFsbCBqdXN0IGFzc29jaWF0aXZlIGFycmF5cyAodW5sZXNzIG9mIGNvdXJzZSB3ZQotICogZGVjaWRlIHRvIHN0YXJ0IHVzaW5nIG9iamVjdHMgZm9yIHRoZW0uLi4pCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0KLSAgb3V0IDw8Ci0gICAgImNsYXNzICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c3RydWN0KTsKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIiA8PCAiVEV4Y2VwdGlvbiI7Ci0gIH0gZWxzZSBpZiAob29wXykgewotICAgIG91dCA8PCAiIGV4dGVuZHMgIiA8PCAiVEJhc2UiOwotICB9Ci0gIG91dCA8PAotICAgICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAkX1RTUEVDOyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBzdHJpbmcgZHZhbCA9ICJudWxsIjsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCAmJiAhKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICBkdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSwgKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAicHVibGljICQiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCBkdmFsIDw8ICI7IiA8PCBlbmRsOwotICB9Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY29uc3RydWN0b3IgZnJvbSBhcnJheQotICBzdHJpbmcgcGFyYW0gPSAobWVtYmVycy5zaXplKCkgPiAwKSA/ICIkdmFscz1udWxsIiA6ICIiOwotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCIgPDwgcGFyYW0gPDwgIikgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG91dCwgdHN0cnVjdCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID4gMCkgewotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogdCA9IGdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwgJiYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICIkdGhpcy0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCkpIDw8ICI7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJpZiAoaXNfYXJyYXkoJHZhbHMpKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGlmIChvb3BfKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3Qoc2VsZjo6JF9UU1BFQywgJHZhbHMpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKGlzc2V0KCR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ10pKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIH0KLSAgc2NvcGVfZG93bihvdXQpOwotICBvdXQgPDwgZW5kbDsKLQotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKSB7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInB1YmxpYyBmdW5jdGlvbiByZWFkKCRpbnB1dCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0KLSAgaWYgKG9vcF8pIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR0aGlzLT5fcmVhZCgnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInLCBzZWxmOjokX1RTUEVDLCAkaW5wdXQpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiR4ZmVyID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZ0eXBlID0gMDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJGZpZCA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RCZWdpbigkZm5hbWUpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PAotICAgICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7Ci0KLSAgICBzY29wZV91cChvdXQpOwotCi0gICAgLy8gUmVhZCBiZWdpbm5pbmcgZmllbGQgbWFya2VyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICB0X2ZpZWxkIGZmdHlwZShnX3R5cGVfYnl0ZSwgImZ0eXBlIik7Ci0gICAgICB0X2ZpZWxkIGZmaWQoZ190eXBlX2kxNiwgImZpZCIpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmZ0eXBlKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRmdHlwZSA9PSAiIDw8ICJUVHlwZTo6U1RPUCkgeyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBicmVhazsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZmlkKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOyIgPDwgZW5kbDsKLSAgICAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJpZiAoJGZ0eXBlID09ICIgPDwgIlRUeXBlOjpTVE9QKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiYnJlYWs7IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICJ9IiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJzd2l0Y2ggKCRmaWQpIiA8PCBlbmRsOwotCi0gICAgICBzY29wZV91cChvdXQpOwotCi0gICAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKLSAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICAgImNhc2UgIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInRoaXMtPiIpOwotICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gICAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICAiICAkeGZlciArPSAiIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICAgIG91dCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIH0KLQotICAgICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgICAgaW5kZW50KG91dCkgPDwgICJkZWZhdWx0OiIgPDwgZW5kbDsKLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gIiA8PCAiVFByb3RvY29sOjpza2lwQmluYXJ5KCRpbnB1dCwgJGZ0eXBlKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwgICIgIGJyZWFrOyIgPDwgZW5kbDsKLQotICAgICAgc2NvcGVfZG93bihvdXQpOwotCi0gICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0Ci0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkgeyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSB7IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF91cCgpOwotCi0gIGlmIChvb3BfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInJldHVybiAkdGhpcy0+X3dyaXRlKCciIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJHhmZXIgPSAwOyIgPDwgZW5kbDsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKLSAgfQotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiaWYgKCR0aGlzLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKmZfaXRlciktPmdldF90eXBlKCkpOwotICAgIHN0cmluZyBleHBlY3Q7Ci0gICAgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICBleHBlY3QgPSAiYXJyYXkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkpIHsKLSAgICAgIGV4cGVjdCA9ICJvYmplY3QiOwotICAgIH0KLSAgICBpZiAoIWV4cGVjdC5lbXB0eSgpKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICghaXNfIiA8PCBleHBlY3QgPDwgIigkdGhpcy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikpIHsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3ICIgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHR5cGUgaW4gc3RydWN0dXJlLicsICIgPDwgIlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7Ci0gICAgICBzY29wZV9kb3duKG91dCk7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgaGVhZGVyCi0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ24nLCAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAgICInIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZmllbGQgY29udGVudHMKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyLCAidGhpcy0+Iik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAifSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnYycsICIgPDwgIlRUeXBlOjpTVE9QKTsiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHhmZXI7IiA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXytzZXJ2aWNlX25hbWVfKyIucGhwIjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwgIjw/cGhwIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfIDw8ICJuYW1lc3BhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX3N1ZmZpeCh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgIjsiIDw8IGVuZGw7Ci0gIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwKLSAgICBwaHBfaW5jbHVkZXMoKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgdGhyZWUgbWFpbiBwYXJ0cyBvZiB0aGUgc2VydmljZSAod2VsbCwgdHdvIGZvciBub3cgaW4gUEhQKQotICBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0c2VydmljZSk7Ci0gIGlmIChyZXN0XykgewotICAgIGdlbmVyYXRlX3NlcnZpY2VfcmVzdCh0c2VydmljZSk7Ci0gIH0KLSAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotICBpZiAocGhwc18pIHsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0c2VydmljZSk7Ci0gIH0KLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgZXh0ZW5kcyArICJQcm9jZXNzb3IiOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGhlYWRlciBwb3J0aW9uCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJGhhbmRsZXJfID0gbnVsbDsiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikgeyIgPDwgZW5kbDsKLSAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICB0X2ZpZWxkIGZtdHlwZShnX3R5cGVfYnl0ZSwgIm10eXBlIik7Ci0gICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmZm5hbWUsICIiLCB0cnVlKTsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZm10eXBlLCAiIiwgdHJ1ZSk7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlXywgJmZzZXFpZCwgIiIsIHRydWUpOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOyIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIEhPVDogY2hlY2sgZm9yIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwotICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgXFxFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoIiA8PCAiVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicsICIgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCAiIDw8ICJUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgICRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuOyIgPDwgZW5kbDsKLSAgfQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPiRtZXRob2RuYW1lKCRyc2VxaWQsICRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgIn0iIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7Ci0gIH0KLQotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotCi0gIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gVHJ5IGJsb2NrIGZvciBhIGZ1bmN0aW9uIHdpdGggZXhjZXB0aW9ucwotICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGZfc2VydmljZV8gPDwgIiRyZXN1bHQtPnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiJHRoaXMtPmhhbmRsZXJfLT4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgIH0KLSAgICBmX3NlcnZpY2VfIDw8ICIkYXJncy0+IiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAifSBjYXRjaCAoIiA8PCBwaHBfbmFtZXNwYWNlKGdldF90cnVlX3R5cGUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKS0+Z2V0X3Byb2dyYW0oKSkgPDwgKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgJCIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICQiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAifSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJG91dHB1dCBpbnN0YW5jZW9mICIgPDwgIlRQcm90b2NvbDo6JFRCSU5BUllQUk9UT0NPTEFDQ0VMRVJBVEVEKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiIDw8IGVuZGw7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkb3V0cHV0LCAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsICIgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFksICRyZXN1bHQsICRzZXFpZCwgJG91dHB1dC0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7Ci0KLSAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiA9IHBhY2soJ04nLCAoMHg4MDAxMDAwMCB8ICIgPDwgIlRNZXNzYWdlVHlwZTo6UkVQTFkpKTsgIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsIHN0cmxlbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicpKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJGJ1ZmYgLj0gcGFjaygnTicsICRzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJHJlc3VsdC0+d3JpdGUoJGJ1ZmYpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0LT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCAkc2VxaWQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbDsKLSAgfQotCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBzdHJpbmcgbmFtZSA9IHRzLT5nZXRfbmFtZSgpOwotICAgIHRzLT5zZXRfbmFtZShzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSk7Ci0gICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7Ci0gICAgZ2VuZXJhdGVfcGhwX2Z1bmN0aW9uX2hlbHBlcnMoKmZfaXRlcik7Ci0gICAgdHMtPnNldF9uYW1lKG5hbWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiSWYiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiaW50ZXJmYWNlICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c2VydmljZSkgPDwgIklmIiA8PCBleHRlbmRzX2lmIDw8ICIgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfaWYgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgIiB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaW1wbF87IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGltcGwpIHsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW1wbF8gPSAkaW1wbDsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgICAicHVibGljIGZ1bmN0aW9uICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoJHJlcXVlc3QpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgYXJncyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgZm9yIChhX2l0ZXIgPSBhcmdzLmJlZ2luKCk7IGFfaXRlciAhPSBhcmdzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgdF90eXBlKiBhdHlwZSA9IGdldF90cnVlX3R5cGUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICAgIHN0cmluZyBjYXN0ID0gdHlwZV90b19jYXN0KGF0eXBlKTsKLSAgICAgIHN0cmluZyByZXEgPSAiJHJlcXVlc3RbJyIgKyAoKmFfaXRlciktPmdldF9uYW1lKCkgKyAiJ10iOwotICAgICAgaWYgKGF0eXBlLT5pc19ib29sKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgY2FzdCA8PCAiKCFlbXB0eSgiIDw8IHJlcSA8PCAiKSAmJiAoIiA8PCByZXEgPDwgIiAhPT0gJ2ZhbHNlJykpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBpc3NldCgiIDw8IHJlcSA8PCAiKSA/ICIgPDwgY2FzdCA8PCByZXEgPDwgIiA6IG51bGw7IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaWYgKGF0eXBlLT5pc19zdHJpbmcoKSAmJgotICAgICAgICAgICgodF9iYXNlX3R5cGUqKWF0eXBlKS0+aXNfc3RyaW5nX2xpc3QoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gZXhwbG9kZSgnLCcsICQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgaWYgKGF0eXBlLT5pc19tYXAoKSB8fCBhdHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIGlmIChhdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGFycmF5X2ZpbGxfa2V5cyhqc29uX2RlY29kZSgkIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgdHJ1ZSksIDEpOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSBpZiAoYXR5cGUtPmlzX3N0cnVjdCgpIHx8IGF0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBuZXcgIiA8PCBwaHBfbmFtZXNwYWNlKGF0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCBhdHlwZS0+Z2V0X25hbWUoKSA8PCAiKGpzb25fZGVjb2RlKCQiIDw8ICgqYV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCB0cnVlKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gJHRoaXMtPmltcGxfLT4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCIgPDwgYXJndW1lbnRfbGlzdCgoKmZfaXRlciktPmdldF9hcmdsaXN0KCksIGZhbHNlKSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJ9IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICAifSIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiBleHRlbmRzICIgKyBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpKSArIGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgIiA8PCBwaHBfbmFtZXNwYWNlX2RlY2xhcmF0aW9uKHRzZXJ2aWNlKSA8PCAiQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiIGltcGxlbWVudHMgIiA8PCAgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgeyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgLy8gUHJpdmF0ZSBtZW1iZXJzCi0gIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicHJvdGVjdGVkICRpbnB1dF8gPSBudWxsOyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkb3V0cHV0XyA9IG51bGw7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgJHNlcWlkXyA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0PW51bGwpIHsiIDw8IGVuZGw7Ci0gIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgcGFyZW50OjpfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7Ci0gIH0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAiJHRoaXMtPnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKLQotICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8ICIkIiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAiJHRoaXMtPnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICJwdWJsaWMgZnVuY3Rpb24gc2VuZF8iIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJCIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJHRoaXMtPm91dHB1dF8gaW5zdGFuY2VvZiAiIDw8ICJUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Jyk7IiA8PCBlbmRsOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiAoJGJpbl9hY2NlbCkiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKLQotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkdGhpcy0+b3V0cHV0XywgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICJUTWVzc2FnZVR5cGU6OkNBTEwsICRhcmdzLCAkdGhpcy0+c2VxaWRfLCAkdGhpcy0+b3V0cHV0Xy0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7Ci0KLSAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmID0gcGFjaygnTicsICgweDgwMDEwMDAwIHwgIiA8PCAiVE1lc3NhZ2VUeXBlOjpDQUxMKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRidWZmIC49IHBhY2soJ04nLCBzdHJsZW4oJyIgPDwgZnVubmFtZSA8PCAiJykpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSAnIiA8PCBmdW5uYW1lIDw8ICInOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYnVmZiAuPSBwYWNrKCdOJywgJHRoaXMtPnNlcWlkXyk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8ICJUTWVzc2FnZVR5cGU6OkNBTEwsICR0aGlzLT5zZXFpZF8pOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyZ3MtPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPndyaXRlKCRidWZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8tPmZsdXNoKCk7IiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkYXJncy0+d3JpdGUoJHRoaXMtPm91dHB1dF8pOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0Xy0+d3JpdGVNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLQotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkYmluX2FjY2VsID0gKCR0aGlzLT5pbnB1dF8gaW5zdGFuY2VvZiAiIDw8ICJUUHJvdG9jb2w6OiRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCkiCi0gICAgICAgICAgICAgICAgIDw8ICIgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKTsiIDw8IGVuZGw7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSAkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCR0aGlzLT5pbnB1dF8sICciIDw8IHJlc3VsdG5hbWUgPDwgIicsICR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpKTsiIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlIiA8PCBlbmRsOwotICAgICAgc2NvcGVfdXAoZl9zZXJ2aWNlXyk7Ci0KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRyc2VxaWQgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJGZuYW1lID0gbnVsbDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0KLSAgICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgICB0X2ZpZWxkIGZmbmFtZShnX3R5cGVfc3RyaW5nLCAiZm5hbWUiKTsKLSAgICAgICAgdF9maWVsZCBmc2VxaWQoZ190eXBlX2kzMiwgInJzZXFpZCIpOwotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR2ZXIgPSB1bnBhY2soJ04nLCAkdGhpcy0+aW5wdXRfLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZlciA9ICR2ZXJbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRtdHlwZSA9ICR2ZXIgJiAweGZmOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIkdmVyID0gJHZlciAmIDB4ZmZmZjAwMDA7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmVyICE9IDB4ODAwMTAwMDApIHRocm93IG5ldyAiIDw8ICJUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcuJHZlciwgIiA8PCAiVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChmX3NlcnZpY2VfLCAmZmZuYW1lLCAiIiwgdHJ1ZSk7Ci0gICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV8sICZmc2VxaWQsICIiLCB0cnVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gIiA8PCAiVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiIDw8ICJUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkeC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHRocm93ICR4OyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkcmVzdWx0LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbDsKLQotICAgICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT5zdWNjZXNzICE9PSBudWxsKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuICRyZXN1bHQtPnN1Y2Nlc3M7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgIT09IG51bGwpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICB0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgICAicmV0dXJuOyIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFxcRXhjZXB0aW9uKFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpOyIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfSBlbHNlIHsKLQotICAgIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGl0cmFucyA9IChpbmNsYXNzID8gIiR0aGlzLT5pbnB1dF8iIDogIiRpbnB1dCIpOwotCi0gICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKwotICAgICAgICAgICAgICBuYW1lOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRsZW4gPSB1bnBhY2soJ04nLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDQpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRsZW4gPSAkbGVuWzFdOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9ICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoJGxlbik7IiA8PCBlbmRsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSB1bnBhY2soJ2MnLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDEpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IChib29sKSQiIDw8IG5hbWUgPDwgIlsxXTsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IG5hbWUgPDwgIiA9IHVucGFjaygnYycsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoMSkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJCIgPDwgbmFtZSA8PCAiWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCduJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCgyKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmKSB7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICR2YWwgPSAwIC0gKCgkdmFsIC0gMSkgXiAweGZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9IHVucGFjaygnTicsICIgPDwgaXRyYW5zIDw8ICItPnJlYWRBbGwoNCkpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJHZhbCA9ICR2YWxbMV07IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJpZiAoJHZhbCA+IDB4N2ZmZmZmZmYpIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJHZhbCA9IDAgLSAoKCR2YWwgLSAxKSBeIDB4ZmZmZmZmZmYpOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgbmFtZSA8PCAiID0gJHZhbDsiIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnTjInLCAiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkYXJyWzFdICYgMHg4MDAwMDAwMCkgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkYXJyWzFdID0gJGFyclsxXSBeIDB4RkZGRkZGRkY7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhGRkZGRkZGRjsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gMCAtICRhcnJbMV0qNDI5NDk2NzI5NiAtICRhcnJbMl0gLSAxOyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgJCIgPDwgbmFtZSA8PCAiID0gJGFyclsxXSo0Mjk0OTY3Mjk2ICsgJGFyclsyXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiJGFyciA9IHVucGFjaygnZCcsIHN0cnJldigiIDw8IGl0cmFucyA8PCAiLT5yZWFkQWxsKDgpKSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkYXJyWzFdOyIgPDwgZW5kbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSkgKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gdW5wYWNrKCdOJywgIiA8PCBpdHJhbnMgPDwgIi0+cmVhZEFsbCg0KSk7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkdmFsID0gJHZhbFsxXTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgImlmICgkdmFsID4gMHg3ZmZmZmZmZikgeyIgPDwgZW5kbCA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICAkdmFsID0gMCAtICgoJHZhbCAtIDEpIF4gMHhmZmZmZmZmZik7IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBuYW1lIDw8ICIgPSAkdmFsOyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLQotICAgICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAgICIkeGZlciArPSAkaW5wdXQtPiI7Ci0KLSAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgICAgIG5hbWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgICAgICAgIG91dCA8PCAicmVhZEJ5dGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJMTYoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWRJNjQoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICBvdXQgPDwgInJlYWREb3VibGUoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgfQotICAgICAgICBvdXQgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSB2YXJpYWJsZS4gVGhpcyBtYWtlcyB0d28ga2V5IGFzc3VtcHRpb25zLAotICogZmlyc3QgdGhhdCB0aGVyZSBpcyBhIGNvbnN0IGNoYXIqIHZhcmlhYmxlIG5hbWVkIGRhdGEgdGhhdCBwb2ludHMgdG8gdGhlCi0gKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAotICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgb3V0IDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKLQotICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfYnl0ZSwga3R5cGUpOwotICB0X2ZpZWxkIGZ2dHlwZShnX3R5cGVfYnl0ZSwgdnR5cGUpOwotICB0X2ZpZWxkIGZldHlwZShnX3R5cGVfYnl0ZSwgZXR5cGUpOwotCi0gIG91dCA8PAotICAgIGluZGVudCgpIDw8ICIkIiA8PCBwcmVmaXggPDwgIiA9IGFycmF5KCk7IiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiQiIDw8IHNpemUgPDwgIiA9IDA7IiA8PCBlbmRsOwotCi0gIC8vIERlY2xhcmUgdmFyaWFibGVzLCByZWFkIGhlYWRlcgotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwga3R5cGUgPDwgIiA9IDA7IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiJCIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOwotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmt0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2dHlwZSk7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oIiA8PAotICAgICAgICAiJCIgPDwga3R5cGUgPDwgIiwgJCIgPDwgdnR5cGUgPDwgIiwgJCIgPDwgc2l6ZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGlmIChiaW5hcnlfaW5saW5lXykgewotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmV0eXBlKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZXR5cGUpOwotICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZnNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiQiIDw8IGV0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgIiQiIDw8IGV0eXBlIDw8ICIsICQiIDw8IHNpemUgPDwgIik7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKLSAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgImZvciAoJCIgPDwKLSAgICBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIHNjb3BlX3VwKG91dCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIHNjb3BlX2Rvd24ob3V0KTsKLQotICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7IiA8PCBlbmRsOwotICAgIH0KLSAgfQotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKLSAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgZGVjbGFyZV9maWVsZCgmZmtleSwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICBkZWNsYXJlX2ZpZWxkKCZmdmFsLCB0cnVlLCB0cnVlKSA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBrZXkgPDwgIl0gPSAkIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgIiQiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PCAiaWYgKGlzX3NjYWxhcigkIiA8PCBlbGVtIDw8ICIpKSB7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAiICAkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgJCIgPDwgcHJlZml4IDw8ICIgW109ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwotfQotCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICIkIiA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKLQotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJCIgPDwgcHJlZml4IDw8ICIgW109ICQiIDw8IGVsZW0gPDwgIjsiIDw8IGVuZGw7Ci19Ci0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCi0gKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKLQotICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCi0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIFNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKwotICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotICB9Ci0KLSAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0X3N0cnVjdCopdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkgewotCi0gICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7Ci0KLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgIHRocm93Ci0gICAgICAgICAgICAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsIHN0cmxlbigkIiA8PCBuYW1lIDw8ICIpKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49ICQiIDw8IG5hbWUgPDwgIjsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAkIiA8PCBuYW1lIDw8ICIgPyAxIDogMCk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgJCIgPDwgbmFtZSA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICAgIG91dCA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnbicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ04nLCAkIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdOMicsICQiIDw8IG5hbWUgPDwgIiA+PiAzMiwgJCIgPDwgbmFtZSA8PCAiICYgMHhGRkZGRkZGRik7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgICBvdXQgPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHN0cnJldihwYWNrKCdkJywgJCIgPDwgbmFtZSA8PCAiKSk7IiA8PCBlbmRsOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gUEhQIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gcGFjaygnTicsICQiIDw8IG5hbWUgPDwgIik7IiA8PCBlbmRsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0KLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkeGZlciArPSAkb3V0cHV0LT4iOwotCi0gICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgICAgICB0aHJvdwotICAgICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgIG91dCA8PCAid3JpdGVCb29sKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgIG91dCA8PCAid3JpdGVCeXRlKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZUkxNigkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgICAgIG91dCA8PCAid3JpdGVJMzIoJCIgPDwgbmFtZSA8PCAiKTsiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgICBvdXQgPDwgIndyaXRlSTY0KCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZURvdWJsZSgkIiA8PCBuYW1lIDw8ICIpOyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgICBvdXQgPDwgIndyaXRlSTMyKCQiIDw8IG5hbWUgPDwgIik7IjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwcmludGYoIkRPIE5PVCBLTk9XIEhPVyBUTyBTRVJJQUxJWkUgRklFTEQgJyVzJXMnIFRZUEUgJyVzJ1xuIiwKLSAgICAgICAgICAgcHJlZml4LmNfc3RyKCksCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyBhbGwgdGhlIG1lbWJlcnMgb2YgYSBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAodm9pZCkgdHN0cnVjdDsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiJHhmZXIgKz0gJCIgPDwgcHJlZml4IDw8ICItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzY29wZV91cChvdXQpOwotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgPDwgIik7IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIkb3V0cHV0IC49IHBhY2soJ2MnLCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X3ZhbF90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgICAgImNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSk7IiA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIpOyIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBzdHJyZXYocGFjaygnbCcsIGNvdW50KCQiIDw8IHByZWZpeCA8PCAiKSkpOyIgPDwgZW5kbDsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVTZXRCZWdpbigiIDw8Ci0gICAgICAgIHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIG91dCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiKTsiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiRvdXRwdXQgLj0gc3RycmV2KHBhY2soJ2wnLCBjb3VudCgkIiA8PCBwcmVmaXggPDwgIikpKTsiIDw8IGVuZGw7Ci0KLSAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIiRvdXRwdXQtPndyaXRlTGlzdEJlZ2luKCIgPDwKLSAgICAgICAgdHlwZV90b19lbnVtKCgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSkgPDwgIiwgIiA8PAotICAgICAgICAiY291bnQoJCIgPDwgcHJlZml4IDw8ICIpKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfdXAob3V0KTsKLQotICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwotICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICIgPDwKLSAgICAgICIkIiA8PCBraXRlciA8PCAiID0+ICQiIDw8IHZpdGVyIDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKLSAgICBzY29wZV9kb3duKG91dCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBzdHJpbmcgaXRlcl92YWwgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoaXNfc2NhbGFyKCQiIDw8IGl0ZXJfdmFsIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgc2NvcGVfZG93bihvdXQpOwotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotCi0gIGlmICghYmluYXJ5X2lubGluZV8pIHsKLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBpbmRlbnQob3V0KSA8PAotICAgICAgICAiJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZVNldEVuZCgpOyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICIkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7Ci0gICAgfQotICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCi0gKgotICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewotICB0X2ZpZWxkIGtmaWVsZCh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2l0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7Ci0KLSAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIHZpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCi0gKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewotICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwotfQotCi0vKioKLSAqIERlY2xhcmVzIGEgZmllbGQsIHdoaWNoIG1heSBpbmNsdWRlIGluaXRpYWxpemF0aW9uIGFzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gdHR5cGUgVGhlIHR5cGUKLSAqLwotc3RyaW5nIHRfcGhwX2dlbmVyYXRvcjo6ZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaW5pdCwgYm9vbCBvYmopIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIkIiArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgaWYgKGluaXQpIHsKLSAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIHJlc3VsdCArPSAiID0gJyciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBmYWxzZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICByZXN1bHQgKz0gIiA9IDAiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICByZXN1bHQgKz0gIiA9IDAuMCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgaW5pdGlhbGl6ZXIgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgcmVzdWx0ICs9ICIgPSAwIjsKLSAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgICByZXN1bHQgKz0gIiA9IGFycmF5KCkiOwotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgaWYgKG9iaikgewotICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ICs9ICIgPSBudWxsIjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCArICI7IjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3BocF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICByZXR1cm4KLSAgICBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKwotICAgICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGFkZFN0cnVjdFNpZ25hdHVyZSkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiLCAiOwotICAgIH0KLQotICAgIHRfdHlwZSogdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLQotICAgIC8vU2V0IHR5cGUgbmFtZQotICAgIGlmKGFkZFN0cnVjdFNpZ25hdHVyZSAmJiB0eXBlLT5pc19zdHJ1Y3QoKSkKLSAgICB7Ci0gICAgICBzdHJpbmcgY2xhc3NOYW1lID0gcGhwX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHBocF9uYW1lc3BhY2VfZGlyZWN0b3J5KCJEZWZpbml0aW9uIiwgZmFsc2UpICsgY2xhc3NpZnkodHlwZS0+Z2V0X25hbWUoKSk7Ci0KLSAgICAgIHJlc3VsdCArPSBjbGFzc05hbWUgKyAiICI7Ci0gICAgfQotCi0gICAgcmVzdWx0ICs9ICIkIiArICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEdldHMgYSB0eXBlY2FzdCBzdHJpbmcgZm9yIGEgcGFydGljdWxhciB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yOjp0eXBlX3RvX2Nhc3QodF90eXBlKiB0eXBlKSB7Ci0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlKiBidHlwZSA9ICh0X2Jhc2VfdHlwZSopdHlwZTsKLSAgICBzd2l0Y2ggKGJ0eXBlLT5nZXRfYmFzZSgpKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICIoYm9vbCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiKGludCkiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICIoZG91YmxlKSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIihzdHJpbmcpIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIihpbnQpIjsKLSAgfQotICByZXR1cm4gIiI7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBDKysgZW51bSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB0eXBlLgotICovCi1zdHJpbmcgdF9waHBfZ2VuZXJhdG9yIDo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGU6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICJUVHlwZTo6Qk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICJUVHlwZTo6STMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGU6Okk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpJMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTVFJVQ1QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TFNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihwaHAsICJQSFAiLAotIiAgICBpbmxpbmVkOiAgICAgICAgIEdlbmVyYXRlIFBIUCBpbmxpbmVkIGZpbGVzXG4iCi0iICAgIHNlcnZlcjogICAgICAgICAgR2VuZXJhdGUgUEhQIHNlcnZlciBzdHVic1xuIgotIiAgICBvb3A6ICAgICAgICAgICAgIEdlbmVyYXRlIFBIUCB3aXRoIG9iamVjdCBvcmllbnRlZCBzdWJjbGFzc2VzXG4iCi0iICAgIHJlc3Q6ICAgICAgICAgICAgR2VuZXJhdGUgUEhQIFJFU1QgcHJvY2Vzc29yc1xuIgotKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmMmU2OC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUxMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgInRfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLQotLyoqCi0gKiBQeXRob24gY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3B5X2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3B5X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X2dlbmVyYXRvcihwcm9ncmFtKQotICB7Ci0gICAgKHZvaWQpIG9wdGlvbl9zdHJpbmc7Ci0gICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJuZXdfc3R5bGUiKTsKLSAgICBnZW5fbmV3c3R5bGVfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInNsb3RzIik7Ci0gICAgZ2VuX3Nsb3RzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5hbWljIik7Ci0gICAgZ2VuX2R5bmFtaWNfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaWYgKGdlbl9keW5hbWljXykgewotICAgICAgZ2VuX25ld3N0eWxlXyA9IDA7IC8vIGR5bmFtaWMgaXMgbmV3c3R5bGUKLSAgICAgIGdlbl9keW5iYXNlY2xhc3NfID0gIlRCYXNlIjsKLSAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9ICJURXhjZXB0aW9uQmFzZSI7Ci0gICAgICBpbXBvcnRfZHluYmFzZV8gPSAiZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJhc2UgaW1wb3J0IFRCYXNlLCBURXhjZXB0aW9uQmFzZVxuIjsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZHluYmFzZSIpOwotICAgIGlmIChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKSB7Ci0gICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOwotICAgICAgZ2VuX2R5bmJhc2VjbGFzc18gPSAoaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0KLSAgICBpdGVyID0gcGFyc2VkX29wdGlvbnMuZmluZCgiZHluZXhjIik7Ci0gICAgaWYgKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpIHsKLSAgICAgIGdlbl9keW5iYXNlY2xhc3NfZXhjXyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJkeW5pbXBvcnQiKTsKLSAgICBpZiAoaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKSkgewotICAgICAgZ2VuX2R5bmJhc2VfID0gdHJ1ZTsKLSAgICAgIGltcG9ydF9keW5iYXNlXyA9IChpdGVyLT5zZWNvbmQpOwotICAgIH0KLQotICAgIGl0ZXIgPSBwYXJzZWRfb3B0aW9ucy5maW5kKCJ0d2lzdGVkIik7Ci0gICAgZ2VuX3R3aXN0ZWRfID0gKGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCkpOwotCi0gICAgaXRlciA9IHBhcnNlZF9vcHRpb25zLmZpbmQoInV0ZjhzdHJpbmdzIik7Ci0gICAgZ2VuX3V0ZjhzdHJpbmdzXyA9IChpdGVyICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLQotICAgIGNvcHlfb3B0aW9uc18gPSBvcHRpb25fc3RyaW5nOwotICAgIAotICAgIGlmIChnZW5fdHdpc3RlZF8pewotICAgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tcHkudHdpc3RlZCI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLXB5IjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotCi0gIC8qKgotICAgKiBTdHJ1Y3QgZ2VuZXJhdGlvbiBjb2RlCi0gICAqLwotCi0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc194Y2VwdGlvbj1mYWxzZSwgYm9vbCBpc19yZXN1bHQ9ZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgIChzdGQ6Om9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHN0ZDo6b2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAoc3RkOjpvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHZvaWQgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyAgICAgICAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogICAgdGRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcgICAgICAgICAoc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBweV9hdXRvZ2VuX2NvbW1lbnQoKTsKLSAgc3RkOjpzdHJpbmcgcHlfaW1wb3J0cygpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9hcmd1bWVudCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIHR5cGVfdG9fc3BlY19hcmdzKHRfdHlwZSogdHR5cGUpOwotCi0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICAgIHJldHVybiBzdWJfbmFtZXNwYWNlID09ICJ0d2lzdGVkIjsKLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9weV9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtLCBib29sIGdlbl90d2lzdGVkKSB7Ci0gICAgaWYoZ2VuX3R3aXN0ZWQpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHR3aXN0ZWRfbW9kdWxlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgicHkudHdpc3RlZCIpOwotICAgICAgaWYoIXR3aXN0ZWRfbW9kdWxlLmVtcHR5KCkpewotICAgICAgICByZXR1cm4gdHdpc3RlZF9tb2R1bGU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJweSIpOwotICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWxfbW9kdWxlOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8qKgotICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy4KLSAgICovCi0gIGJvb2wgZ2VuX25ld3N0eWxlXzsKLQotICAgLyoqCi0gICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGR5bmFtaWMgc3R5bGUgY2xhc3Nlcy4KLSAgICovCi0gIGJvb2wgZ2VuX2R5bmFtaWNfOwotIAotICBib29sIGdlbl9keW5iYXNlXzsKLSAgc3RkOjpzdHJpbmcgZ2VuX2R5bmJhc2VjbGFzc187Ci0gIHN0ZDo6c3RyaW5nIGdlbl9keW5iYXNlY2xhc3NfZXhjXzsKLSAKLSAgc3RkOjpzdHJpbmcgaW1wb3J0X2R5bmJhc2VfOwotCi0gIGJvb2wgZ2VuX3Nsb3RzXzsKLQotICBzdGQ6OnN0cmluZyBjb3B5X29wdGlvbnNfOwotIAotICAvKioKLSAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgVHdpc3RlZC1mcmllbmRseSBSUEMgc2VydmljZXMuCi0gICAqLwotICBib29sIGdlbl90d2lzdGVkXzsKLQotICAvKioKLSAgICogVHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBlbmNvZGVkIHVzaW5nIHV0Zi04LgotICAgKi8KLSAgYm9vbCBnZW5fdXRmOHN0cmluZ3NfOwotCi0gIC8qKgotICAgKiBGaWxlIHN0cmVhbXMKLSAgICovCi0KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLQotICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBzdHJpbmcgbW9kdWxlID0gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW1fLCBnZW5fdHdpc3RlZF8pOwotICBwYWNrYWdlX2Rpcl8gPSBnZXRfb3V0X2RpcigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIFRPRE86IERvIGJldHRlciBlcnJvciBjaGVja2luZyBoZXJlLgotICAgIE1LRElSKHBhY2thZ2VfZGlyXy5jX3N0cigpKTsKLSAgICBzdGQ6Om9mc3RyZWFtIGluaXRfcHkoKHBhY2thZ2VfZGlyXysiL19faW5pdF9fLnB5IikuY19zdHIoKSk7Ci0gICAgaW5pdF9weS5jbG9zZSgpOwotICAgIGlmIChtb2R1bGUuZW1wdHkoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IG1vZHVsZS5maW5kKCcuJyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlOwotICAgICAgbW9kdWxlLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhY2thZ2VfZGlyXyArPSAiLyI7Ci0gICAgICBwYWNrYWdlX2Rpcl8gKz0gbW9kdWxlLnN1YnN0cigwLCBwb3MpOwotICAgICAgbW9kdWxlLmVyYXNlKDAsIHBvcysxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3R5cGVzX25hbWUgPSBwYWNrYWdlX2Rpcl8rIi8iKyJ0dHlwZXMucHkiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrImNvbnN0YW50cy5weSI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIGZfaW5pdF9uYW1lID0gcGFja2FnZV9kaXJfKyIvX19pbml0X18ucHkiOwotICBvZnN0cmVhbSBmX2luaXQ7Ci0gIGZfaW5pdC5vcGVuKGZfaW5pdF9uYW1lLmNfc3RyKCkpOwotICBmX2luaXQgIDw8Ci0gICAgIl9fYWxsX18gPSBbJ3R0eXBlcycsICdjb25zdGFudHMnIjsKLSAgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gcHJvZ3JhbV8tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46Oml0ZXJhdG9yIHN2X2l0ZXI7Ci0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIGZfaW5pdCA8PCAiLCAnIiA8PCAoKnN2X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIjsKLSAgfQotICBmX2luaXQgPDwgIl0iIDw8IGVuZGw7Ci0gIGZfaW5pdC5jbG9zZSgpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmX3R5cGVzXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGwgPDwKLSAgICByZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIDw8Ci0gICAgZW5kbCA8PCBlbmRsOwotCi0gIGZfY29uc3RzXyA8PAotICAgIHB5X2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwgPDwKLSAgICBweV9pbXBvcnRzKCkgPDwgZW5kbCA8PAotICAgICJmcm9tIHR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLS8qKgotICogUmVuZGVycyBhbGwgdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciBpbmNsdWRpbmcgYW5vdGhlciBUaHJpZnQgcHJvZ3JhbQotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9pbmNsdWRlcygpIHsKLSAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgcmVzdWx0ICs9ICJpbXBvcnQgIiArIGdldF9yZWFsX3B5X21vZHVsZShpbmNsdWRlc1tpXSwgZ2VuX3R3aXN0ZWRfKSArICIudHR5cGVzXG4iOwotICB9Ci0gIGlmIChpbmNsdWRlcy5zaXplKCkgPiAwKSB7Ci0gICAgcmVzdWx0ICs9ICJcbiI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgdG8gdXNlIHRoZSBhY2NlbGVyYXRlZCBUQmluYXJ5UHJvdG9jb2wKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfZmFzdGJpbmFyeV9pbmNsdWRlcygpIHsKLSAgc3RyaW5nIGhkciA9ICIiOwotICBpZiAoZ2VuX2R5bmFtaWNfKSB7Ci0gICAgaGRyICs9IHN0ZDo6c3RyaW5nKGltcG9ydF9keW5iYXNlXyk7Ci0gIH0gZWxzZSB7Ci0gICAgaGRyICs9Ci0gICAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0XG4iCi0gICAgICAiZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVFByb3RvY29sXG4iCi0gICAgICAidHJ5OlxuIgotICAgICAgIiAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IGZhc3RiaW5hcnlcbiIKLSAgICAgICJleGNlcHQ6XG4iCi0gICAgICAiICBmYXN0YmluYXJ5ID0gTm9uZVxuIjsKLSAgfQotICByZXR1cm4gaGRyOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6cHlfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiI1xuIikgKwotICAgICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgIiNcbiIgKwotICAgICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIjXG4iICsKLSAgICAiIyAgb3B0aW9ucyBzdHJpbmc6ICIgKyBjb3B5X29wdGlvbnNfICArICJcbiIgKwotICAgICIjXG4iOwotfQotCi0vKioKLSAqIFByaW50cyBzdGFuZGFyZCB0aHJpZnQgaW1wb3J0cwotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnB5X2ltcG9ydHMoKSB7Ci0gIHJldHVybgotICAgIHN0cmluZygiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZSwgVE1lc3NhZ2VUeXBlLCBURXhjZXB0aW9uLCBUQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gIGZfdHlwZXNfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gUHl0aG9uLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSB0b19zdHJpbmdfbWFwcGluZywgZnJvbV9zdHJpbmdfbWFwcGluZzsKLQotICBmX3R5cGVzXyA8PAotICAgICJjbGFzcyAiIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8Ci0gICAgKGdlbl9uZXdzdHlsZV8gPyAiKG9iamVjdCkiIDogIiIpIDw8Ci0gICAgKGdlbl9keW5hbWljXyA/ICIoIiArIGdlbl9keW5iYXNlY2xhc3NfICsgIikiIDogIiIpIDw8ICAKLSAgICAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl90eXBlc18sIHRlbnVtKTsKLQotICB0b19zdHJpbmdfbWFwcGluZyA8PCBpbmRlbnQoKSA8PCAiX1ZBTFVFU19UT19OQU1FUyA9IHsiIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIl9OQU1FU19UT19WQUxVRVMgPSB7IiA8PCBlbmRsOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX3R5cGVzXykgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0KLSAgICAvLyBEaWN0aW9uYXJpZXMgdG8vZnJvbSBzdHJpbmcgbmFtZXMgb2YgZW51bXMKLSAgICB0b19zdHJpbmdfbWFwcGluZyA8PAotICAgICAgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgdmFsdWUgPDwgIjogXCIiIDw8Ci0gICAgICBlc2NhcGVfc3RyaW5nKCgqY19pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIlwiLCIgPDwgZW5kbDsKLSAgICBmcm9tX3N0cmluZ19tYXBwaW5nIDw8Ci0gICAgICBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAnIicgPDwgZXNjYXBlX3N0cmluZygoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8Ci0gICAgICAiXCI6ICIgPDwgdmFsdWUgPDwgJywnIDw8IGVuZGw7Ci0gIH0KLSAgdG9fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gIGZyb21fc3RyaW5nX21hcHBpbmcgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgZl90eXBlc18gPDwgZW5kbDsKLSAgZl90eXBlc18gPDwgdG9fc3RyaW5nX21hcHBpbmcuc3RyKCkgPDwgZW5kbCA8PCBmcm9tX3N0cmluZ19tYXBwaW5nLnN0cigpIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKLSAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOwotICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKLSAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOwotCi0gIGluZGVudChmX2NvbnN0c18pIDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKTsKLSAgZl9jb25zdHNfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCi0gKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQotICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gIlRydWUiIDogIkZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIigqKnsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBpbmRlbnQoKTsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7Ci0gICAgICBvdXQgPDwgIiA6ICI7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSkiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIG91dCA8PCAieyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKLSAgICAgIG91dCA8PCAiIDogIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAifSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfQotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICJzZXQoIjsKLSAgICB9Ci0gICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOwotICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7Ci0gICAgICBvdXQgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIl0iOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0IDw8ICIpIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHB5dGhvbiBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0KHR4Y2VwdGlvbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHl0aG9uIHN0cnVjdAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGRhdGEgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewotICAodm9pZCkgaXNfcmVzdWx0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgc29ydGVkX21lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotCi0gIG91dCA8PCBzdGQ6OmVuZGwgPDwKLSAgICAiY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOwotICBpZiAoaXNfZXhjZXB0aW9uKSB7Ci0gICAgaWYgKGdlbl9keW5hbWljXykgewotICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzX2V4Y18gPDwgIikiOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgIihURXhjZXB0aW9uKSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fbmV3c3R5bGVfKSB7Ci0gICAgICBvdXQgPDwgIihvYmplY3QpIjsKLSAgICB9IGVsc2UgaWYgKGdlbl9keW5hbWljXykgewotICAgICAgb3V0IDw8ICIoIiA8PCBnZW5fZHluYmFzZWNsYXNzXyA8PCAiKSI7Ci0gICAgfQotICB9Ci0gIG91dCA8PCAiOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICAvKgotICAgICBIZXJlIHdlIGdlbmVyYXRlIHRoZSBzdHJ1Y3R1cmUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGZhc3RiaW5hcnkgY29kZWMuCi0gICAgIFRoZXNlIHNwZWNpZmljYXRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6Ci0gICAgIHRocmlmdF9zcGVjIC0+IHR1cGxlIG9mIGl0ZW1fc3BlYwotICAgICBpdGVtX3NwZWMgLT4gTm9uZSB8ICh0YWcsIHR5cGVfZW51bSwgbmFtZSwgc3BlY19hcmdzLCBkZWZhdWx0KQotICAgICB0YWcgLT4gaW50ZWdlcgotICAgICB0eXBlX2VudW0gLT4gVFR5cGUuSTMyIHwgVFR5cGUuU1RSSU5HIHwgVFR5cGUuU1RSVUNUIHwgLi4uCi0gICAgIG5hbWUgLT4gc3RyaW5nX2xpdGVyYWwKLSAgICAgZGVmYXVsdCAtPiBOb25lICAjIEhhbmRsZWQgYnkgX19pbml0X18KLSAgICAgc3BlY19hcmdzIC0+IE5vbmUgICMgRm9yIHNpbXBsZSB0eXBlcwotICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzKSAgIyBWYWx1ZSB0eXBlIGZvciBsaXN0L3NldAotICAgICAgICAgICAgICAgIHwgKHR5cGVfZW51bSwgc3BlY19hcmdzLCB0eXBlX2VudW0sIHNwZWNfYXJncykKLSAgICAgICAgICAgICAgICAgICMgS2V5IGFuZCB2YWx1ZSBmb3IgbWFwCi0gICAgICAgICAgICAgICAgfCAoY2xhc3NfbmFtZSwgc3BlY19hcmdzX3B0cikgIyBGb3Igc3RydWN0L2V4Y2VwdGlvbgotICAgICBjbGFzc19uYW1lIC0+IGlkZW50aWZpZXIgICMgQmFzaWNhbGx5IGEgcG9pbnRlciB0byB0aGUgY2xhc3MKLSAgICAgc3BlY19hcmdzX3B0ciAtPiBleHByZXNzaW9uICAjIGp1c3QgY2xhc3NfbmFtZS5zcGVjX2FyZ3MKLQotICAgICBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIG1ha2luZyB0aGlzIHdvcmsgZm9yIHN0cnVjdHMgd2l0aCBuZWdhdGl2ZSB0YWdzLgotICAqLwotCi0gIGlmIChnZW5fc2xvdHNfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIl9fc2xvdHNfXyA9IFsgIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaW5kZW50KG91dCkgPDwgICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgIDw8ICInLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiIF0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICB9Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBMb29rIGludG8gZ2VuZXJhdGluZyBhbiBlbXB0eSB0dXBsZSBpbnN0ZWFkIG9mIE5vbmUKLSAgLy8gZm9yIHN0cnVjdHVyZXMgd2l0aCBubyBtZW1iZXJzLgotICAvLyBUT0RPKGRyZWlzcyk6IFRlc3QgZW5jb2Rpbmcgb2Ygc3RydWN0cyB3aGVyZSBzb21lIGlubmVyIHN0cnVjdHMKLSAgLy8gZG9uJ3QgaGF2ZSB0aHJpZnRfc3BlYy4KLSAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7Ci0gICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0KLSAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIGluZGVudChvdXQpIDw8ICIoIiA8PCAoKm1faXRlciktPmdldF9rZXkoKSA8PCAiLCAiCi0gICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCi0gICAgICAgICAgICA8PCAiJyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInIiA8PCAiLCAiCi0gICAgICAgICAgICA8PCB0eXBlX3RvX3NwZWNfYXJncygoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIsICIKLSAgICAgICAgICAgIDw8IHJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKCptX2l0ZXIpIDw8ICIsICIKLSAgICAgICAgICAgIDw8ICIpLCIKLSAgICAgICAgICAgIDw8ICIgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcwotICAgICAgICAgICAgPDwgZW5kbDsKLQotICAgICAgc29ydGVkX2tleXNfcG9zICsrOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAidGhyaWZ0X3NwZWMgPSBOb25lIiA8PCBlbmRsOwotICB9Ci0KLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIjsKLQotICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIC8vIFRoaXMgZmlsbHMgaW4gZGVmYXVsdCB2YWx1ZXMsIGFzIG9wcG9zZWQgdG8gbnVsbHMKLSAgICAgIG91dCA8PCAiICIgPDwgZGVjbGFyZV9hcmd1bWVudCgqbV9pdGVyKSA8PCAiLCI7Ci0gICAgfQotCi0gICAgb3V0IDw8ICIpOiIgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gSW5pdGlhbGl6ZSBmaWVsZHMKLSAgICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICAgIGlmICghdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSAmJiAoKm1faXRlciktPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgICAiaWYgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyAiIDw8ICJzZWxmLnRocmlmdF9zcGVjWyIgPDwKLSAgICAgICAgICAgICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICJdWzRdOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwKLSAgICAgICAgICByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgInNlbGYuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIG91dCA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKCFnZW5fZHluYW1pY18pIHsKLSAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKG91dCwgdHN0cnVjdCk7Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOwotICB9Ci0KLSAgLy8gRm9yIGV4Y2VwdGlvbnMgb25seSwgZ2VuZXJhdGUgYSBfX3N0cl9fIG1ldGhvZC4gVGhpcyBpcwotICAvLyBiZWNhdXNlIHdoZW4gcmFpc2VkIGV4Y2VwdGlvbnMgYXJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUsIF9fcmVwcl9fCi0gIC8vIGlzbid0IHVzZWQuIFNlZSBweXRob24gYnVnICM1ODgyCi0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19zdHJfXyhzZWxmKToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiByZXByKHNlbGYpIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0KLSAgaWYgKCFnZW5fc2xvdHNfKSB7Ci0gICAgLy8gUHJpbnRpbmcgdXRpbGl0aWVzIHNvIHRoYXQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJpZnQKLSAgICAvLyBzdHJ1Y3RzIGxvb2sgcHJldHR5IGxpa2UgZGljdGlvbmFyaWVzCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9fcmVwcl9fKHNlbGYpOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0KLSAgICAvLyBFcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBtZXRob2RzIHRoYXQgY29tcGFyZSBieSB2YWx1ZQotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgImRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCAiCi0gICAgICAgICAgICAgICAgICAic2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotICAgIG91dCA8PCBlbmRsOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfSBlbHNlIGlmICghZ2VuX2R5bmFtaWNfKSB7Ci0gICAgLy8gbm8gYmFzZSBjbGFzcyBhdmFpbGFibGUgdG8gaW1wbGVtZW50IF9fZXFfXyBhbmQgX19yZXByX18gYW5kIF9fbmVfXyBmb3IgdXMKLSAgICAvLyBzbyB3ZSBtdXN0IHByb3ZpZGUgb25lIHRoYXQgdXNlcyBfX3Nsb3RzX18KLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19yZXByX18oc2VsZik6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBMID0gWyclcz0lcicgJSAoa2V5LCBnZXRhdHRyKHNlbGYsIGtleSkpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGZvciBrZXkgaW4gc2VsZi5fX3Nsb3RzX19dIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkiIDw8IGVuZGwgPDwKLSAgICAgIGVuZGw7Ci0gICAgCi0gICAgLy8gRXF1YWxpdHkgbWV0aG9kIHRoYXQgY29tcGFyZXMgZWFjaCBhdHRyaWJ1dGUgYnkgdmFsdWUgYW5kIHR5cGUsIHdhbGtpbmcgX19zbG90c19fCi0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIGZvciBhdHRyIGluIHNlbGYuX19zbG90c19fOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIiAgICBteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgIGlmIG15X3ZhbCAhPSBvdGhlcl92YWw6IiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICAgICAgcmV0dXJuIEZhbHNlIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gVHJ1ZSIgPDwgZW5kbCA8PAotICAgICAgZW5kbDsKLSAgICAKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19uZV9fKHNlbGYsIG90aGVyKToiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpIiA8PCBlbmRsIDw8Ci0gICAgICBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImRlZiByZWFkKHNlbGYsIGlwcm90KToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgIgotICAgICJhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpICIKLSAgICAiYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgIgotICAgICJhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgImZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8Ci0gICAgInJldHVybiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKLQotICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwKLSAgICAid2hpbGUgVHJ1ZToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIihmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpIiA8PCBlbmRsOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJicmVhayIgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgLy8gU3dpdGNoIHN0YXRlbWVudCBvbiB0aGUgZmllbGQgd2UgYXJlIHJlYWRpbmcKLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLQotICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgb3V0IDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImlmICI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZWxpZiAiOwotICAgICAgfQotICAgICAgb3V0IDw8ICJmaWQgPT0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgImlmIGZ0eXBlID09ICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgb3V0IDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5za2lwKGZ0eXBlKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgfQotCi0gICAgLy8gSW4gdGhlIGRlZmF1bHQgY2FzZSB3ZSBza2lwIHRoZSBmaWVsZAotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgICJlbHNlOiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgICIgIGlwcm90LnNraXAoZnR5cGUpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJpcHJvdC5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImlwcm90LnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAiaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCAiCi0gICAgImFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lICIKLSAgICAiYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgICJvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PAotICAgICJyZXR1cm4iIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgaW5kZW50KG91dCkgPDwKLSAgICAib3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignIiA8PCBuYW1lIDw8ICInKSIgPDwgZW5kbDsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIC8vIFdyaXRlIGZpZWxkIGhlYWRlcgotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiaWYgc2VsZi4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRCZWdpbigiIDw8Ci0gICAgICAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCAiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiKSIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIGZpZWxkIGNvbnRlbnRzCi0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlciwgInNlbGYuIik7Ci0KLSAgICAvLyBXcml0ZSBmaWVsZCBjbG9zZXIKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgc3RydWN0IG1hcAotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudF9kb3duKCk7Ci0gIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKLSAgb3V0IDw8Ci0gICAgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBpbmRlbnQob3V0KSA8PCAiZGVmIHZhbGlkYXRlKHNlbGYpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLQotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0gICAgICBpZiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJpZiBzZWxmLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyBOb25lOiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCAiIDw8Ci0gICAgICAgICAgZmllbGQtPmdldF9uYW1lKCkgPDwgIiBpcyB1bnNldCEnKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLnB5IjsKLSAgZl9zZXJ2aWNlXy5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOwotCi0gIGZfc2VydmljZV8gPDwKLSAgICBweV9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8Ci0gICAgcHlfaW1wb3J0cygpIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiaW1wb3J0ICIgPDwgZ2V0X3JlYWxfcHlfbW9kdWxlKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfcHJvZ3JhbSgpLCBnZW5fdHdpc3RlZF8pIDw8Ci0gICAgICAiLiIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiZnJvbSB0dHlwZXMgaW1wb3J0ICoiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yIiA8PCBlbmRsIDw8Ci0gICAgcmVuZGVyX2Zhc3RiaW5hcnlfaW5jbHVkZXMoKSA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRzIiA8PCBlbmRsIDw8Ci0gICAgICAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbCA8PAotICAgICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQiIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UgKHdlbGwsIHR3byBmb3Igbm93IGluIFBIUCkKLSAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7Ci0gIGdlbmVyYXRlX3NlcnZpY2Vfc2VydmVyKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9yZW1vdGUodHNlcnZpY2UpOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3NlcnZpY2VfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIGEgc2VydmljZS4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICIjIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGw7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgdHMsIGZhbHNlKTsKLSAgICBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKCpmX2l0ZXIpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGFuZCBoZWxwZXJzIGZvciBhIGZ1bmN0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X2Z1bmN0aW9uX2hlbHBlcnModF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Ci0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKLSAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwotICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJnN1Y2Nlc3MpOwotICAgIH0KLQotICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKLSAgICB9Ci0gICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl9zZXJ2aWNlXywgJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19pZiA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfaWYgPSAiKCIgKyBleHRlbmRzICsgIi5JZmFjZSkiOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKEludGVyZmFjZSkiOwotICAgIH0gZWxzZSBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pIHsKLSAgICAgIGV4dGVuZHNfaWYgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8gPDwKLSAgICAiY2xhc3MgSWZhY2UiIDw8IGV4dGVuZHNfaWYgPDwgIjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICBpZiAoZnVuY3Rpb25zLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0gICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhmX3NlcnZpY2VfLCAoKmZfaXRlcikpOwotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICB9Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8Ci0gICAgZW5kbDsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBzZXJ2aWNlIGNsaWVudCBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKLSAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7Ci0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKCIgKyBleHRlbmRzICsgIi5DbGllbnQpIjsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSBleHRlbmRzICsgIi5DbGllbnQsICI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8gJiYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSkgewotICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKG9iamVjdCkiOwotICAgIH0KLSAgfQotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiY2xhc3MgQ2xpZW50IiA8PCBleHRlbmRzX2NsaWVudCA8PCAiOiIgPDwgZW5kbCA8PAotICAgICAgIiAgaW1wbGVtZW50cyhJZmFjZSkiIDw8IGVuZGwgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAiY2xhc3MgQ2xpZW50KCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlKToiIDw8IGVuZGw7Ci0gIH0KLSAgaW5kZW50X3VwKCk7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoZl9zZXJ2aWNlXywgdHNlcnZpY2UpOwotCi0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgb3Byb3RfZmFjdG9yeSk6IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgIGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90PU5vbmUpOiIgPDwgZW5kbDsKLSAgfQotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fb3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgc2VsZi5fc2VxaWQgPSAwIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3JlcXMgPSB7fSIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX2lwcm90ID0gc2VsZi5fb3Byb3QgPSBpcHJvdCIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICBpZiBvcHJvdCBpcyBub3QgTm9uZToiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgICBzZWxmLl9vcHJvdCA9IG9wcm90IiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgIHNlbGYuX3NlcWlkID0gMCIgPDwgZW5kbCA8PAotICAgICAgICBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiLkNsaWVudC5fX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIG9wcm90X2ZhY3RvcnkpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzIDw8ICIuQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGlwcm90LCBvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgZW5kbDsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgLy8gT3BlbiBmdW5jdGlvbgotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImRlZiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKGZfc2VydmljZV8sICgqZl9pdGVyKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJzZWxmLl9zZXFpZCArPSAxIiA8PCBlbmRsOwotICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICJkID0gc2VsZi5fcmVxc1tzZWxmLl9zZXFpZF0gPSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgfQotICAgICAgZl9zZXJ2aWNlXyA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKTsKLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7Ci0gICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICJzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiBkZWZlci5zdWNjZWVkKE5vbmUpIiA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICI6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBhcmdzbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyI7Ci0KLSAgICAvLyBTZXJpYWxpemUgdGhlIHJlcXVlc3QgaGVhZGVyCi0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3QgPSBzZWxmLl9vcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHNlbGYuX3RyYW5zcG9ydCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgICAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VsZi5fc2VxaWQpIgotICAgICAgICA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZS5DQUxMLCBzZWxmLl9zZXFpZCkiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICAvLyBXcml0ZSB0byB0aGUgc3RyZWFtCi0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiYXJncy53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJhcmdzLndyaXRlKHNlbGYuX29wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLSAgICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgZW5kbDsKLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWYgcmVjdl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PAotICAgICAgICAgICAgICAiKHNlbGYsIGlwcm90LCBtdHlwZSwgcnNlcWlkKToiIDw8IGVuZGw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwotICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICI6IiA8PCBlbmRsOwotICAgICAgfQotICAgICAgaW5kZW50X3VwKCk7Ci0KLSAgICAgIC8vIFRPRE8obWNzbGVlKTogVmFsaWRhdGUgbWVzc2FnZSByZXBseSBoZXJlLCBzZXEgaWRzIGV0Yy4KLQotICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImQgPSBzZWxmLl9yZXFzLnBvcChyc2VxaWQpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gc2VsZi5faXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOiIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkiIDw8IGVuZGw7Ci0KLSAgICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZChpcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGQuZXJyYmFjayh4KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKGlwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICIgIHgucmVhZChzZWxmLl9pcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9pcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmFpc2UgeCIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIigpIiA8PCBlbmRsIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5yZWFkKHNlbGYuX2lwcm90KSIgPDwgZW5kbCA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9pcHJvdC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5jYWxsYmFjayhyZXN1bHQuc3VjY2VzcykiIDw8IGVuZGw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgICAgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzIiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgIGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiBpcyBub3QgTm9uZToiIDw8IGVuZGw7Ci0gICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbDsKLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICAgIGluZGVudCgpIDw8ICIgIHJhaXNlIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIiA8PCBlbmRsOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCi0gICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICAgInJldHVybiBkLmNhbGxiYWNrKE5vbmUpIiA8PCBlbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAgICAgInJldHVybiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBmYWlsZWQ6IHVua25vd24gcmVzdWx0XCIpKSIgPDwgZW5kbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHRcIik7IiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCi0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwKLSAgICBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIGNvbW1hbmQgbGluZSB0b29sIGZvciBtYWtpbmcgcmVtb3RlIHJlcXVlc3RzCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcmVtb3RlIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZW1vdGUodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXysiLyIrc2VydmljZV9uYW1lXysiLXJlbW90ZSI7Ci0gIG9mc3RyZWFtIGZfcmVtb3RlOwotICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7Ci0KLSAgZl9yZW1vdGUgPDwKLSAgICAiIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIiA8PCBlbmRsIDw8Ci0gICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAotICAgICJpbXBvcnQgc3lzIiA8PCBlbmRsIDw8Ci0gICAgImltcG9ydCBwcHJpbnQiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UiIDw8IGVuZGwgPDwKLSAgICAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldCIgPDwgZW5kbCA8PAotICAgICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIdHRwQ2xpZW50IiA8PCBlbmRsIDw8Ci0gICAgImZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGZfcmVtb3RlIDw8Ci0gICAgImltcG9ydCAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgZW5kbCA8PAotICAgICJmcm9tIHR0eXBlcyBpbXBvcnQgKiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0KLSAgZl9yZW1vdGUgPDwKLSAgICAiaWYgbGVuKHN5cy5hcmd2KSA8PSAxIG9yIHN5cy5hcmd2WzFdID09ICctLWhlbHAnOiIgPDwgZW5kbCA8PAotICAgICIgIHByaW50ICcnIiA8PCBlbmRsIDw8Ci0gICAgIiAgcHJpbnQgJ1VzYWdlOiAnICsgc3lzLmFyZ3ZbMF0gKyAnIFstaCBob3N0Wzpwb3J0XV0gWy11IHVybF0gWy1mW3JhbWVkXV0gZnVuY3Rpb24gW2FyZzEgW2FyZzIuLi5dXSciIDw8IGVuZGwgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHByaW50ICdGdW5jdGlvbnM6JyIgPDwgZW5kbDsKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3JlbW90ZSA8PAotICAgICAgIiAgcHJpbnQgJyAgIiA8PCAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCkgPDwgIiAiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7Ci0gICAgaW50IG51bV9hcmdzID0gYXJncy5zaXplKCk7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICIsICI7Ci0gICAgICB9Ci0gICAgICBmX3JlbW90ZSA8PAotICAgICAgICBhcmdzW2ldLT5nZXRfdHlwZSgpLT5nZXRfbmFtZSgpIDw8ICIgIiA8PCBhcmdzW2ldLT5nZXRfbmFtZSgpOwotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSciIDw8IGVuZGw7Ci0gIH0KLSAgZl9yZW1vdGUgPDwKLSAgICAiICBwcmludCAnJyIgPDwgZW5kbCA8PAotICAgICIgIHN5cy5leGl0KDApIiA8PCBlbmRsIDw8Ci0gICAgZW5kbDsKLQotICBmX3JlbW90ZSA8PAotICAgICJwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKGluZGVudCA9IDIpIiA8PCBlbmRsIDw8Ci0gICAgImhvc3QgPSAnbG9jYWxob3N0JyIgPDwgZW5kbCA8PAotICAgICJwb3J0ID0gOTA5MCIgPDwgZW5kbCA8PAotICAgICJ1cmkgPSAnJyIgPDwgZW5kbCA8PAotICAgICJmcmFtZWQgPSBGYWxzZSIgPDwgZW5kbCA8PAotICAgICJodHRwID0gRmFsc2UiIDw8IGVuZGwgPDwKLSAgICAiYXJnaSA9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctaCc6IiA8PCBlbmRsIDw8Ci0gICAgIiAgcGFydHMgPSBzeXMuYXJndlthcmdpKzFdLnNwbGl0KCc6JykiIDw8IGVuZGwgPDwKLSAgICAiICBob3N0ID0gcGFydHNbMF0iIDw8IGVuZGwgPDwKLSAgICAiICBpZiBsZW4ocGFydHMpID4gMToiIDw8IGVuZGwgPDwKLSAgICAiICAgIHBvcnQgPSBpbnQocGFydHNbMV0pIiA8PCBlbmRsIDw8Ci0gICAgIiAgYXJnaSArPSAyIiA8PCBlbmRsIDw8Ci0gICAgZW5kbCA8PAotICAgICJpZiBzeXMuYXJndlthcmdpXSA9PSAnLXUnOiIgPDwgZW5kbCA8PAotICAgICIgIHVybCA9IHVybHBhcnNlKHN5cy5hcmd2W2FyZ2krMV0pIiA8PCBlbmRsIDw8Ci0gICAgIiAgcGFydHMgPSB1cmxbMV0uc3BsaXQoJzonKSIgPDwgZW5kbCA8PAotICAgICIgIGhvc3QgPSBwYXJ0c1swXSIgPDwgZW5kbCA8PAotICAgICIgIGlmIGxlbihwYXJ0cykgPiAxOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IGludChwYXJ0c1sxXSkiIDw8IGVuZGwgPDwKLSAgICAiICBlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgICAgcG9ydCA9IDgwIiA8PCBlbmRsIDw8Ci0gICAgIiAgdXJpID0gdXJsWzJdIiA8PCBlbmRsIDw8Ci0gICAgIiAgaWYgdXJsWzRdOiIgPDwgZW5kbCA8PAotICAgICIgICAgdXJpICs9ICc/JXMnICUgdXJsWzRdIiA8PCBlbmRsIDw8Ci0gICAgIiAgaHR0cCA9IFRydWUiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDIiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImlmIHN5cy5hcmd2W2FyZ2ldID09ICctZicgb3Igc3lzLmFyZ3ZbYXJnaV0gPT0gJy1mcmFtZWQnOiIgPDwgZW5kbCA8PAotICAgICIgIGZyYW1lZCA9IFRydWUiIDw8IGVuZGwgPDwKLSAgICAiICBhcmdpICs9IDEiIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgImNtZCA9IHN5cy5hcmd2W2FyZ2ldIiA8PCBlbmRsIDw8Ci0gICAgImFyZ3MgPSBzeXMuYXJndlthcmdpKzE6XSIgPDwgZW5kbCA8PAotICAgIGVuZGwgPDwKLSAgICAiaWYgaHR0cDoiIDw8IGVuZGwgPDwKLSAgICAiICB0cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChob3N0LCBwb3J0LCB1cmkpIiA8PCBlbmRsIDw8Ci0gICAgImVsc2U6IiA8PCBlbmRsIDw8Ci0gICAgIiAgc29ja2V0ID0gVFNvY2tldC5UU29ja2V0KGhvc3QsIHBvcnQpIiA8PCBlbmRsIDw8Ci0gICAgIiAgaWYgZnJhbWVkOiIgPDwgZW5kbCA8PAotICAgICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KHNvY2tldCkiIDw8IGVuZGwgPDwKLSAgICAiICBlbHNlOiIgPDwgZW5kbCA8PAotICAgICIgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSIgPDwgZW5kbCA8PAotICAgICJwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSIgPDwgZW5kbCA8PAotICAgICJjbGllbnQgPSAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIi5DbGllbnQocHJvdG9jb2wpIiA8PCBlbmRsIDw8Ci0gICAgInRyYW5zcG9ydC5vcGVuKCkiIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIGJvb2wgZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3JlbW90ZSA8PCAiZWwiOwotICAgIH0KLQotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgYXJncyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgIGludCBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwotCi0gICAgZl9yZW1vdGUgPDwKLSAgICAgICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbCA8PAotICAgICAgIiAgaWYgbGVuKGFyZ3MpICE9ICIgPDwgbnVtX2FyZ3MgPDwgIjoiIDw8IGVuZGwgPDwKLSAgICAgICIgICAgcHJpbnQgJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgcmVxdWlyZXMgIiA8PCBudW1fYXJncyA8PCAiIGFyZ3MnIiA8PCBlbmRsIDw8Ci0gICAgICAiICAgIHN5cy5leGl0KDEpIiA8PCBlbmRsIDw8Ci0gICAgICAiICBwcC5wcHJpbnQoY2xpZW50LiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKLSAgICAgIGlmIChhcmdzW2ldLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgICBmX3JlbW90ZSA8PCAiYXJnc1siIDw8IGkgPDwgIl0sIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfcmVtb3RlIDw8ICJldmFsKGFyZ3NbIiA8PCBpIDw8ICJdKSwiOwotICAgICAgfQotICAgIH0KLSAgICBmX3JlbW90ZSA8PCAiKSkiIDw8IGVuZGw7Ci0KLSAgICBmX3JlbW90ZSA8PCBlbmRsOwotICB9Ci0KLSAgaWYgKGZ1bmN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9yZW1vdGUgPDwgImVsc2U6IiA8PCBlbmRsOwotICAgIGZfcmVtb3RlIDw8ICIgIHByaW50ICdVbnJlY29nbml6ZWQgbWV0aG9kICVzJyAlIGNtZCIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCAiICBzeXMuZXhpdCgxKSIgPDwgZW5kbDsKLSAgICBmX3JlbW90ZSA8PCBlbmRsOwotICB9Ci0KLSAgZl9yZW1vdGUgPDwgInRyYW5zcG9ydC5jbG9zZSgpIiA8PCBlbmRsOwotCi0gIC8vIENsb3NlIHNlcnZpY2UgZmlsZQotICBmX3JlbW90ZS5jbG9zZSgpOwotCi0jaWZuZGVmIF9NU0NfVkVSCi0KLSAgLy8gTWFrZSBmaWxlIGV4ZWN1dGFibGUsIGxvdmUgdGhhdCBiaXR3aXNlIE9SIGFjdGlvbgotICBjaG1vZChmX3JlbW90ZV9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgU19JUlVTUgotICAgICAgICB8IFNfSVdVU1IKLSAgICAgICAgfCBTX0lYVVNSCi0jaWZuZGVmIE1JTkdXCi0gICAgICAgIHwgU19JUkdSUAotICAgICAgICB8IFNfSVhHUlAKLSAgICAgICAgfCBTX0lST1RICi0gICAgICAgIHwgU19JWE9USAotI2VuZGlmCi0gICk7Ci0KLSNlbmRpZiAvLyBfTVNDX1ZFUgotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2Ugc2VydmVyIGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBHZW5lcmF0ZSB0aGUgZGlzcGF0Y2ggbWV0aG9kcwotICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLQotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX3Byb2Nlc3NvciA9IGV4dGVuZHMgKyAiLlByb2Nlc3NvciwgIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJUUHJvY2Vzc29yKToiIDw8IGVuZGwgPDwKLSAgICAgICIgIGltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwotICB9Ci0KLSAgaW5kZW50X3VwKCk7Ci0KLSAgaW5kZW50KGZfc2VydmljZV8pIDw8Ci0gICAgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAic2VsZi5faGFuZGxlciA9IElmYWNlKGhhbmRsZXIpIiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gaGFuZGxlciIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcCA9IHt9IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAic2VsZi5fcHJvY2Vzc01hcFtcIiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIl0gPSBQcm9jZXNzb3IucHJvY2Vzc18iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmVyIGltcGxlbWVudGF0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICIobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwotCi0gIC8vIFRPRE8obWNzbGVlKTogdmFsaWRhdGUgbWVzc2FnZQotCi0gIC8vIEhPVDogZGljdGlvbmFyeSBmdW5jdGlvbiBsb29rdXAKLSAgZl9zZXJ2aWNlXyA8PAotICAgIGluZGVudCgpIDw8ICJpZiBuYW1lIG5vdCBpbiBzZWxmLl9wcm9jZXNzTWFwOiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnNraXAoVFR5cGUuU1RSVUNUKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwgJ1Vua25vd24gZnVuY3Rpb24gJXMnICUgKG5hbWUpKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICIgIHgud3JpdGUob3Byb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgIiAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiICBvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gZGVmZXIuc3VjY2VlZChOb25lKSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gIH0KLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImVsc2U6IiA8PCBlbmRsOwotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICByZXR1cm4gc2VsZi5fcHJvY2Vzc01hcFtuYW1lXShzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiICBzZWxmLl9wcm9jZXNzTWFwW25hbWVdKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgLy8gUmVhZCBlbmQgb2YgYXJncyBmaWVsZCwgdGhlIFRfU1RPUCwgYW5kIHRoZSBzdHJ1Y3QgY2xvc2UKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIFRydWUiIDw8IGVuZGw7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHByb2Nlc3Mgc3ViZnVuY3Rpb25zCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0c2VydmljZSwgKmZfaXRlcik7Ci0gIH0KLQotICBpbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICJkZWYgcHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBzdHJpbmcgYXJnc25hbWUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwotICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IjsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgaW5kZW50KCkgPDwgImFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJhcmdzLnJlYWQoaXByb3QpIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImlwcm90LnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiZCA9IGRlZmVyLm1heWJlRGVmZXJyZWQoc2VsZi5faGFuZGxlci4iIDw8Ci0gICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCAiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwotICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgImQuYWRkQ2FsbGJhY2soc2VsZi53cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PAotICAgICAgICAgIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGw7Ci0KLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwKLSAgICAgICAgICAiZC5hZGRFcnJiYWNrKHNlbGYud3JpdGVfcmVzdWx0c19leGNlcHRpb25fIiA8PAotICAgICAgICAgICAgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKLSAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAicmV0dXJuIGQiIDw8IGVuZGw7Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PAotICAgICAgICAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlbGYsIHN1Y2Nlc3MsIHJlc3VsdCwgc2VxaWQsIG9wcm90KToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gc3VjY2VzcyIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAgICAgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0KLSAgICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCi0gICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmIHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwKLSAgICAgICAgImRlZiB3cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PAotICAgICAgICAiKHNlbGYsIGVycm9yLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotCi0gICAgICAvLyBLaW5kYSBhYnN1cmQKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIiAgZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PAotICAgICAgICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbCA8PAotICAgICAgICBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwKLSAgICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICAgIH0KLSAgfSBlbHNlIHsKLQotICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgICBpZiAoeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInRyeToiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSB0aGUgZnVuY3Rpb24gY2FsbAotICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiAhdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwgInJlc3VsdC5zdWNjZXNzID0gIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgInNlbGYuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgfQotICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAgIGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8Ci0gICAgICAgICAgICBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gICAgaWYgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0KLSAgICAvLyBDbG9zZSBmdW5jdGlvbgotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7Ci0gICh2b2lkKSBpbmNsYXNzOwotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgaWYgKHR5cGUtPmlzX3ZvaWQoKSkgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgREVTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRfc3RydWN0Kil0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpIHsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3V0LCB0eXBlLCBuYW1lKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgbmFtZSA8PCAiID0gaXByb3QuIjsKLQotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgICAgc3dpdGNoICh0YmFzZSkgewotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArCi0gICAgICAgICAgbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSB8fCAhZ2VuX3V0ZjhzdHJpbmdzXykgewotICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpIjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgICAgb3V0IDw8ICJyZWFkQm9vbCgpOyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgInJlYWRCeXRlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTE2KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTMyKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJyZWFkSTY0KCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgICAgb3V0IDw8ICJyZWFkRG91YmxlKCk7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIFBIUCBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAicmVhZEkzMigpOyI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotCi0gIH0gZWxzZSB7Ci0gICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsCi0gICAgICAgICAgIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlLT5nZXRfbmFtZSgpLmNfc3RyKCkpOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwKLSAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKSIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpIiA8PCBlbmRsOwotfQotCi0vKioKLSAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5Ci0gKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7Ci0gIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7Ci0gIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7Ci0gIHN0cmluZyBldHlwZSA9IHRtcCgiX2V0eXBlIik7Ci0KLSAgdF9maWVsZCBmc2l6ZShnX3R5cGVfaTMyLCBzaXplKTsKLSAgdF9maWVsZCBma3R5cGUoZ190eXBlX2J5dGUsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2J5dGUsIHZ0eXBlKTsKLSAgdF9maWVsZCBmZXR5cGUoZ190eXBlX2J5dGUsIGV0eXBlKTsKLQotICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKLSAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewotICAgIG91dCA8PAotICAgICAgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fSIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgIigiIDw8IGt0eXBlIDw8ICIsICIgPDwgdnR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpICIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBvdXQgPDwKLSAgICAgIGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gc2V0KCkiIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICIoIiA8PCBldHlwZSA8PCAiLCAiIDw8IHNpemUgPDwgIikgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgb3V0IDw8Ci0gICAgICBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAiKCIgPDwgZXR5cGUgPDwgIiwgIiA8PCBzaXplIDw8ICIpID0gaXByb3QucmVhZExpc3RCZWdpbigpIiA8PCBlbmRsOwotICB9Ci0KLSAgLy8gRm9yIGxvb3AgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cwotICBzdHJpbmcgaSA9IHRtcCgiX2kiKTsKLSAgaW5kZW50KG91dCkgPDwKLSAgICAiZm9yICIgPDwgaSA8PCAiIGluIHhyYW5nZSgiIDw8IHNpemUgPDwgIik6IiA8PCBlbmRsOwotCi0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG91dCwgKHRfc2V0Kil0dHlwZSwgcHJlZml4KTsKLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBwcmVmaXgpOwotICAgIH0KLQotICAgIGluZGVudF9kb3duKCk7Ci0KLSAgLy8gUmVhZCBjb250YWluZXIgZW5kCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaXByb3QucmVhZE1hcEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU2V0RW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwotICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7Ci0gIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKLSAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXkpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHNldCBlbGVtZW50Ci0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKLSAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwotCi0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKLQotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLmFkZCgiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKLSAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7Ci0gIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7Ci0KLSAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwotCi0gIGluZGVudChvdXQpIDw8Ci0gICAgcHJlZml4IDw8ICIuYXBwZW5kKCIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKLX0KLQotCi0vKioKLSAqIFNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKLSAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0KLSAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwotICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7Ci0gICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsKLSAgICAgIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodF9zdHJ1Y3QqKXR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2NvbnRhaW5lcigpKSB7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKLQotICAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwotCi0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC4iOwotCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6Ci0gICAgICAgIHRocm93Ci0gICAgICAgICAgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpIHx8ICFnZW5fdXRmOHN0cmluZ3NfKSB7Ci0gICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIuZW5jb2RlKCd1dGYtOCcpKSI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICAgIG91dCA8PCAid3JpdGVCb29sKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICBvdXQgPDwgIndyaXRlQnl0ZSgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgICBvdXQgPDwgIndyaXRlSTE2KCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICAgIG91dCA8PCAid3JpdGVJMzIoIiA8PCBuYW1lIDw8ICIpIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgICAgb3V0IDw8ICJ3cml0ZUk2NCgiIDw8IG5hbWUgPDwgIikiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgICBvdXQgPDwgIndyaXRlRG91YmxlKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBQSFAgbmFtZSBmb3IgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgICBvdXQgPDwgIndyaXRlSTMyKCIgPDwgbmFtZSA8PCAiKSI7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIHByaW50ZigiRE8gTk9UIEtOT1cgSE9XIFRPIFNFUklBTElaRSBGSUVMRCAnJXMlcycgVFlQRSAnJXMnXG4iLAotICAgICAgICAgICBwcmVmaXguY19zdHIoKSwKLSAgICAgICAgICAgdGZpZWxkLT5nZXRfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgIHR5cGUtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gIH0KLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIGFsbCB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4KLSAqCi0gKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQotICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gICh2b2lkKSB0c3RydWN0OwotICBpbmRlbnQob3V0KSA8PAotICAgIHByZWZpeCA8PCAiLndyaXRlKG9wcm90KSIgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwQmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIgPDwKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlU2V0QmVnaW4oIiA8PAotICAgICAgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZUxpc3RCZWdpbigiIDw8Ci0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8Ci0gICAgICAibGVuKCIgPDwgcHJlZml4IDw8ICIpKSIgPDwgZW5kbDsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7Ci0gICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICIgPDwga2l0ZXIgPDwgIiwiIDw8IHZpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIi5pdGVtcygpOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3V0LCAodF9tYXAqKXR0eXBlLCBraXRlciwgdml0ZXIpOwotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgImZvciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiOiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAiZm9yICIgPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICI6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3V0LCAodF9saXN0Kil0dHlwZSwgaXRlcik7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTWFwRW5kKCkiIDw8IGVuZGw7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICJvcHJvdC53cml0ZVNldEVuZCgpIiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PAotICAgICAgIm9wcm90LndyaXRlTGlzdEVuZCgpIiA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KLSAqCi0gKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKLSAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGtpdGVyKTsKLSAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmtmaWVsZCwgIiIpOwotCi0gIHRfZmllbGQgdmZpZWxkKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2aXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7Ci0gIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKLX0KLQotLyoqCi0gKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyKSB7Ci0gIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwotICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0c3RydWN0LCB0c3RydWN0LCAiQXR0cmlidXRlcyIpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG91dCwgdGZ1bmN0aW9uLCB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICJQYXJhbWV0ZXJzIik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgc3RydWN0IG9yIGZ1bmN0aW9uLgotICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiAgICB0ZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3ViaGVhZGVyKSB7Ci0gIGJvb2wgaGFzX2RvYyA9IGZhbHNlOwotICBzdHJpbmdzdHJlYW0gc3M7Ci0gIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKLSAgICBoYXNfZG9jID0gdHJ1ZTsKLSAgICBzcyA8PCB0ZG9jLT5nZXRfZG9jKCk7Ci0gIH0KLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpZiAoaGFzX2RvYykgewotICAgICAgc3MgPDwgZW5kbDsKLSAgICB9Ci0gICAgaGFzX2RvYyA9IHRydWU7Ci0gICAgc3MgPDwgc3ViaGVhZGVyIDw8ICI6XG4iOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHBfaXRlcjsKLSAgICBmb3IgKHBfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBwX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK3BfaXRlcikgewotICAgICAgdF9maWVsZCogcCA9ICpwX2l0ZXI7Ci0gICAgICBzcyA8PCAiIC0gIiA8PCBwLT5nZXRfbmFtZSgpOwotICAgICAgaWYgKHAtPmhhc19kb2MoKSkgewotICAgICAgICBzcyA8PCAiOiAiIDw8IHAtPmdldF9kb2MoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNzIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGhhc19kb2MpIHsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiXCJcIlwiXG4iLAotICAgICAgIiIsIHNzLnN0cigpLAotICAgICAgIlwiXCJcIlxuIik7Ci0gIH0KLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBnZW5lcmljIG9iamVjdC4KLSAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYykgewotICBpZiAodGRvYy0+aGFzX2RvYygpKSB7Ci0gICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LAotICAgICAgIlwiXCJcIlxuIiwKLSAgICAgICIiLCB0ZG9jLT5nZXRfZG9jKCksCi0gICAgICAiXCJcIlwiXG4iKTsKLSAgfQotfQotCi0vKioKLSAqIERlY2xhcmVzIGFuIGFyZ3VtZW50LCB3aGljaCBtYXkgaW5jbHVkZSBpbml0aWFsaXphdGlvbiBhcyBuZWNlc3NhcnkuCi0gKgotICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjpkZWNsYXJlX2FyZ3VtZW50KHRfZmllbGQqIHRmaWVsZCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwotICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI9IjsKLSAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgIHJlc3VsdCA8PCAidGhyaWZ0X3NwZWNbIiA8PAotICAgICAgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA8PCAiTm9uZSI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgZGVmYXVsdCB2YWx1ZSwgcmV0dXJucyBOb25lIG90aGVyd2lzZS4KLSAqCi0gKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OnJlbmRlcl9maWVsZF9kZWZhdWx0X3ZhbHVlKHRfZmllbGQqIHRmaWVsZCkgewotICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXR1cm4gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIihzZWxmLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYW4gaW50ZXJmYWNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9weV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9pZih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQotICBzdHJpbmcgc2lnbmF0dXJlID0gcHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIigiOwotICBpZiAoIWdlbl90d2lzdGVkXykgewotICAgIHNpZ25hdHVyZSArPSAic2VsZiwgIjsKLSAgfQotICBzaWduYXR1cmUgKz0gYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIikiOwotICByZXR1cm4gc2lnbmF0dXJlOwotfQotCi0KLS8qKgotICogUmVuZGVycyBhIGZpZWxkIGxpc3QKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjphcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLQotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmaXJzdCkgewotICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0ICs9ICIsICI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAoKmZfaXRlciktPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICB0X3Byb2dyYW0qIHByb2dyYW0gPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKTsKLSAgaWYgKHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXykgKyAiLiIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pIHsKLSAgICByZXR1cm4gZ2V0X3JlYWxfcHlfbW9kdWxlKHByb2dyYW0sIGdlbl90d2lzdGVkXykgKyAiLnR0eXBlcy4iICsgdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLSAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOwotfQotCi0vKioKLSAqIENvbnZlcnRzIHRoZSBwYXJzZSB0eXBlIHRvIGEgUHl0aG9uIHR5b2UKLSAqLwotc3RyaW5nIHRfcHlfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICJUVHlwZS5TVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGUuQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgcmV0dXJuICJUVHlwZS5CWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTE2IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGUuSTMyIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiVFR5cGUuRE9VQkxFIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5JMzIiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLk1BUCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlLlNFVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZS5MSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotLyoqIFNlZSB0aGUgY29tbWVudCBpbnNpZGUgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24gZm9yIHdoYXQgdGhpcyBpcy4gKi8KLXN0cmluZyB0X3B5X2dlbmVyYXRvcjo6dHlwZV90b19zcGVjX2FyZ3ModF90eXBlKiB0dHlwZSkgewotICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHR0eXBlID0gKCh0X3R5cGVkZWYqKXR0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICIoIiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiLCAiICsgdHlwZV9uYW1lKHR0eXBlKSArICIudGhyaWZ0X3NwZWMpIjsKLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIigiICsKLSAgICAgIHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKyAiLCIgKwotICAgICAgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgKwotICAgICAgIikiOwotCi0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsgIiwiICsKLSAgICAgIHR5cGVfdG9fc3BlY19hcmdzKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArCi0gICAgICAiKSI7Ci0KLSAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgcmV0dXJuICIoIiArCi0gICAgICB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIsIiArCi0gICAgICB0eXBlX3RvX3NwZWNfYXJncygoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpICsKLSAgICAgICIpIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19zcGVjX2FyZ3M6ICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi1USFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHB5LCAiUHl0aG9uIiwKLSIgICAgbmV3X3N0eWxlOiAgICAgICBHZW5lcmF0ZSBuZXctc3R5bGUgY2xhc3Nlcy5cbiIgXAotIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIiBcCi0iICAgIHV0ZjhzdHJpbmdzOiAgICAgRW5jb2RlL2RlY29kZSBzdHJpbmdzIHVzaW5nIHV0ZjggaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuIiBcCi0iICAgIHNsb3RzOiAgICAgICAgICAgR2VuZXJhdGUgY29kZSB1c2luZyBzbG90cyBmb3IgaW5zdGFuY2UgbWVtYmVycy5cbiIgXAotIiAgICBkeW5hbWljOiAgICAgICAgIEdlbmVyYXRlIGR5bmFtaWMgY29kZSwgbGVzcyBjb2RlIGdlbmVyYXRlZCBidXQgc2xvd2VyLlxuIiBcCi0iICAgIGR5bmJhc2U9Q0xTICAgICAgRGVyaXZlIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gY2xhc3MgQ0xTIGluc3RlYWQgb2YgVEJhc2UuXG4iIFwKLSIgICAgZHluZXhjPUNMUyAgICAgICBEZXJpdmUgZ2VuZXJhdGVkIGV4Y2VwdGlvbnMgZnJvbSBDTFMgaW5zdGVhZCBvZiBURXhjZXB0aW9uQmFzZS5cbiIgXAotIiAgICBkeW5pbXBvcnQ9J2Zyb20gZm9vLmJhciBpbXBvcnQgQ0xTJ1xuIiBcCi0iICAgICAgICAgICAgICAgICAgICAgQWRkIGFuIGltcG9ydCBsaW5lIHRvIGdlbmVyYXRlZCBjb2RlIHRvIGZpbmQgdGhlIGR5bmJhc2UgY2xhc3MuXG4iKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3JiX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3MTg2MC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCi0gKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgotICogZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0vKioKLSAqIEEgc3ViY2xhc3Mgb2Ygc3RkOjpvZnN0cmVhbSB0aGF0IGluY2x1ZGVzIGluZGVudGluZyBmdW5jdGlvbmFsaXR5LgotICovCi1jbGFzcyB0X3JiX29mc3RyZWFtIDogcHVibGljIHN0ZDo6b2ZzdHJlYW0gewotICBwcml2YXRlOgotICAgIGludCBpbmRlbnRfOwotCi0gIHB1YmxpYzoKLSAgICB0X3JiX29mc3RyZWFtKCkgOiBzdGQ6Om9mc3RyZWFtKCksIGluZGVudF8oMCkgeyB9Ci0gICAgZXhwbGljaXQgdF9yYl9vZnN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW9zX2Jhc2U6Om9wZW5tb2RlIG1vZGUgPSBpb3NfYmFzZTo6b3V0LCBpbnQgaW5kZW50ID0gMCkgOgotICAgICAgc3RkOjpvZnN0cmVhbShmaWxlbmFtZSwgbW9kZSksIGluZGVudF8oaW5kZW50KSB7IH0KLQotICB0X3JiX29mc3RyZWFtJiBpbmRlbnQoKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRfOyArK2kpIHsgKnRoaXMgPDwgIiAgIjsgfQotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIHZvaWQgaW5kZW50X3VwKCkgeyBpbmRlbnRfKys7IH0KLSAgdm9pZCBpbmRlbnRfZG93bigpIHsgaW5kZW50Xy0tOyB9Ci19OwotCi0vKioKLSAqIFJ1YnkgY29kZSBnZW5lcmF0b3IuCi0gKgotICovCi1jbGFzcyB0X3JiX2dlbmVyYXRvciA6IHB1YmxpYyB0X29vcF9nZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgdF9yYl9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pCi0gIHsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1yYiI7Ci0KLSAgICByZXF1aXJlX3J1YnlnZW1zXyA9IChwYXJzZWRfb3B0aW9ucy5maW5kKCJydWJ5Z2VtcyIpICE9IHBhcnNlZF9vcHRpb25zLmVuZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCi0gICAqLwotCi0gIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKLSAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKLQotICAvKioKLSAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7Ci0gIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb24gICAgICAgICh0X3N0cnVjdCogICB0dW5pb24pOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0KLSAgdF9yYl9vZnN0cmVhbSYgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0KLSAgLyoqCi0gICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfdW5pb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfcmJfc2ltcGxlX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzICh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnMgKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2RlZm5zICh0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kYXRhICAodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3R5cGUqIGZpZWxkX3R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWVsZF9uYW1lLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSwgYm9vbCBvcHRpb25hbCk7Ci0KLSAgLyoqCi0gICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMgICAodF9zZXJ2aWNlKiAgdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCAgICAodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIgICAgKHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24gICh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZCAgICAgICAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqICAgIHRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcz1mYWxzZSk7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3QgICAgICAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiAgIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqICAgICB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeD0iIik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudCAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudCAodF9yYl9vZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkICAgICAgICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiAgICB0ZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdCAgICAgICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogICB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4PSIiKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIgICAgICAodF9yYl9vZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiAgICAgdHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50ICAgICh0X3JiX29mc3RyZWFtICZvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogICAgICB0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7Ci0KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQgICAgKHRfcmJfb2ZzdHJlYW0gJm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiAgICAgIHRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQgICAodF9yYl9vZnN0cmVhbSAmb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiAgICAgdGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyKTsKLQotICB2b2lkIGdlbmVyYXRlX3Jkb2MgICAgICAgICAgICAgICAgICAgICAodF9yYl9vZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZG9jKiB0ZG9jKTsKLQotICAvKioKLSAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKLSAgICovCi0KLSAgc3RkOjpzdHJpbmcgcmJfYXV0b2dlbl9jb21tZW50KCk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGZ1bGxfdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXg9IiIpOwotICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0KTsKLSAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotCi0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcnVieV9tb2R1bGVzKHRfcHJvZ3JhbSogcCkgewotICAgIHN0ZDo6c3RyaW5nIG5zID0gcC0+Z2V0X25hbWVzcGFjZSgicmIiKTsKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbW9kdWxlczsKLSAgICBpZiAobnMuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIG1vZHVsZXM7Ci0gICAgfQotCi0gICAgc3RkOjpzdHJpbmc6Oml0ZXJhdG9yIHBvcyA9IG5zLmJlZ2luKCk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN0ZDo6c3RyaW5nOjppdGVyYXRvciBkZWxpbSA9IHN0ZDo6ZmluZChwb3MsIG5zLmVuZCgpLCAnLicpOwotICAgICAgbW9kdWxlcy5wdXNoX2JhY2soY2FwaXRhbGl6ZShzdGQ6OnN0cmluZyhwb3MsIGRlbGltKSkpOwotICAgICAgcG9zID0gZGVsaW07Ci0gICAgICBpZiAocG9zID09IG5zLmVuZCgpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytwb3M7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZHVsZXM7Ci0gIH0KLQotICB2b2lkIGJlZ2luX25hbWVzcGFjZSh0X3JiX29mc3RyZWFtJiwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KTsKLSAgdm9pZCBlbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4pOwotCi0gcHJpdmF0ZToKLQotICAvKioKLSAgICogRmlsZSBzdHJlYW1zCi0gICAqLwotCi0gIHRfcmJfb2ZzdHJlYW0gZl90eXBlc187Ci0gIHRfcmJfb2ZzdHJlYW0gZl9jb25zdHNfOwotICB0X3JiX29mc3RyZWFtIGZfc2VydmljZV87Ci0KLSAgLyoqIElmIHRydWUsIGFkZCBhICJyZXF1aXJlICdydWJ5Z2VtcyciIGxpbmUgdG8gdGhlIHRvcCBvZiBlYWNoIGdlbi1yYiBmaWxlLiAqLwotICBib29sIHJlcXVpcmVfcnVieWdlbXNfOwotfTsKLQotCi0vKioKLSAqIFByZXBhcmVzIGZvciBmaWxlIGdlbmVyYXRpb24gYnkgb3BlbmluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpbGUgb3V0cHV0Ci0gKiBzdHJlYW1zLgotICoKLSAqIEBwYXJhbSB0cHJvZ3JhbSBUaGUgcHJvZ3JhbSB0byBnZW5lcmF0ZQotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKLSAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7Ci0KLSAgLy8gTWFrZSBvdXRwdXQgZmlsZQotICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSt1bmRlcnNjb3JlKHByb2dyYW1fbmFtZV8pKyJfdHlwZXMucmIiOwotICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKLQotICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkrdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSsiX2NvbnN0YW50cy5yYiI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7Ci0KLSAgLy8gUHJpbnQgaGVhZGVyCi0gIGZfdHlwZXNfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKSA8PAotICAgIHJlbmRlcl9pbmNsdWRlcygpIDw8IGVuZGw7Ci0gICAgYmVnaW5fbmFtZXNwYWNlKGZfdHlwZXNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLQotICBmX2NvbnN0c18gPDwKLSAgICByYl9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsIDw8IHJlbmRlcl9yZXF1aXJlX3RocmlmdCgpIDw8Ci0gICAgInJlcXVpcmUgJyIgPDwgdW5kZXJzY29yZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzJyIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci0gICAgYmVnaW5fbmFtZXNwYWNlKGZfY29uc3RzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0KLX0KLQotLyoqCi0gKiBSZW5kZXJzIHRoZSByZXF1aXJlIG9mIHRocmlmdCBpdHNlbGYsIGFuZCBwb3NzaWJseSBvZiB0aGUgcnVieWdlbXMgZGVwZW5kZW5jeS4KLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfcmVxdWlyZV90aHJpZnQoKSB7Ci0gIGlmIChyZXF1aXJlX3J1YnlnZW1zXykgewotICAgIHJldHVybiAicmVxdWlyZSAncnVieWdlbXMnXG5yZXF1aXJlICd0aHJpZnQnXG4iOwotICB9IGVsc2UgewotICAgIHJldHVybiAicmVxdWlyZSAndGhyaWZ0J1xuIjsKLSAgfQotfQotCi0vKioKLSAqIFJlbmRlcnMgYWxsIHRoZSBpbXBvcnRzIG5lY2Vzc2FyeSBmb3IgaW5jbHVkaW5nIGFub3RoZXIgVGhyaWZ0IHByb2dyYW0KLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpyZW5kZXJfaW5jbHVkZXMoKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7Ci0gIHN0cmluZyByZXN1bHQgPSAiIjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgIHJlc3VsdCArPSAicmVxdWlyZSAnIiArIHVuZGVyc2NvcmUoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90eXBlcydcbiI7Ci0gIH0KLSAgaWYgKGluY2x1ZGVzLnNpemUoKSA+IDApIHsKLSAgICByZXN1bHQgKz0gIlxuIjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6cmJfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiI1xuIikgKwotICAgICIjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgiICsgVEhSSUZUX1ZFUlNJT04gKyAiKVxuIiArCi0gICAgIiNcbiIgKwotICAgICIjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkdcbiIgKwotICAgICIjXG4iOwotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgdHlwZSBmaWxlcwotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7Ci0gIC8vIENsb3NlIHR5cGVzIGZpbGUKLSAgZW5kX25hbWVzcGFjZShmX3R5cGVzXywgcnVieV9tb2R1bGVzKHByb2dyYW1fKSk7Ci0gIGVuZF9uYW1lc3BhY2UoZl9jb25zdHNfLCBydWJ5X21vZHVsZXMocHJvZ3JhbV8pKTsKLSAgZl90eXBlc18uY2xvc2UoKTsKLSAgZl9jb25zdHNfLmNsb3NlKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdHlwZWRlZi4gVGhpcyBpcyBub3QgZG9uZSBpbiBSdWJ5LCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIGZfdHlwZXNfLmluZGVudCgpIDw8Ci0gICAgIm1vZHVsZSAiIDw8IGNhcGl0YWxpemUodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7Ci0gIGZfdHlwZXNfLmluZGVudF91cCgpOwotCi0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOwotICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotCi0gICAgLy8gUnVieSBjbGFzcyBjb25zdGFudHMgaGF2ZSB0byBiZSBjYXBpdGFsaXplZC4uLiBvbWcgaSBhbSBzbyBvbiB0aGUgZmVuY2UKLSAgICAvLyBhYm91dCBsYW5ndWFnZXMgc3RyaWN0bHkgZW5mb3JjaW5nIGNhcGl0YWxpemF0aW9uIHdoeSBjYW4ndCB3ZSBqdXN0IGFsbAotICAgIC8vIGFncmVlIGFuZCBwbGF5IG5pY2UuCi0gICAgc3RyaW5nIG5hbWUgPSBjYXBpdGFsaXplKCgqY19pdGVyKS0+Z2V0X25hbWUoKSk7Ci0KLSAgICBnZW5lcmF0ZV9yZG9jKGZfdHlwZXNfLCAqY19pdGVyKTsKLSAgICBmX3R5cGVzXy5pbmRlbnQoKSA8PCBuYW1lIDw8ICIgPSAiIDw8IHZhbHVlIDw8IGVuZGw7Ci0gIH0KLSAgCi0gIC8vIENyZWF0ZSBhIGhhc2ggbWFwcGluZyB2YWx1ZXMgYmFjayB0byB0aGVpciBuYW1lcyAoYXMgc3RyaW5ncykgc2luY2UgcnVieSBoYXMgbm8gbmF0aXZlIGVudW0gdHlwZQotICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMVUVfTUFQID0geyI7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgLy8gUG9wdWxhdGUgdGhlIGhhc2gKLSAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGZpcnN0ID8gZmlyc3QgPSBmYWxzZSA6IGZfdHlwZXNfIDw8ICIsICI7Ci0gICAgZl90eXBlc18gPDwgdmFsdWUgPDwgIiA9PiBcIiIgPDwgY2FwaXRhbGl6ZSgoKmNfaXRlciktPmdldF9uYW1lKCkpIDw8ICJcIiI7Ci0gIH0KLSAgZl90eXBlc18gPDwgIn0iIDw8IGVuZGw7Ci0gIAotICAvLyBDcmVhdGUgYSBzZXQgd2l0aCB2YWxpZCB2YWx1ZXMgZm9yIHRoaXMgZW51bQotICBmX3R5cGVzXy5pbmRlbnQoKSA8PCAiVkFMSURfVkFMVUVTID0gU2V0Lm5ldyhbIjsKLSAgZmlyc3QgPSB0cnVlOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIC8vIFBvcHVsYXRlIHRoZSBzZXQKLSAgICBmaXJzdCA/IGZpcnN0ID0gZmFsc2UgOiBmX3R5cGVzXyA8PCAiLCAiOwotICAgIGZfdHlwZXNfIDw8IGNhcGl0YWxpemUoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgfQotICBmX3R5cGVzXyA8PCAiXSkuZnJlZXplIiA8PCBlbmRsOwotCi0gIGZfdHlwZXNfLmluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfLmluZGVudCgpIDw8Ci0gICAgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBuYW1lWzBdID0gdG91cHBlcihuYW1lWzBdKTsKLQotICBmX2NvbnN0c18uaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKLSAgcmVuZGVyX2NvbnN0X3ZhbHVlKGZfY29uc3RzXywgdHlwZSwgdmFsdWUpIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi10X3JiX29mc3RyZWFtJiB0X3JiX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLSAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIG91dCA8PCAiJXFcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgb3V0LmluZGVudCgpIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICBvdXQgPDwgZnVsbF90eXBlX25hbWUodHlwZSkgPDwgIi5uZXcoeyIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGdfdHlwZV9zdHJpbmcsIHZfaXRlci0+Zmlyc3QpIDw8ICIgPT4gIjsKLSAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJ9KSI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBrdHlwZSwgdl9pdGVyLT5maXJzdCkgPDwgIiA9PiAiOwotICAgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKLSAgICB9Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJ9IjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGV0eXBlOwotICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgICBvdXQgPDwgIlNldC5uZXcoWyIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQuaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBldHlwZSwgKnZfaXRlcikgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgICAgb3V0LmluZGVudCgpIDw8ICJdKSI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiXSI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQ7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7Ci0gICAgZ2VuZXJhdGVfcmJfdW5pb24oZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0ZV9yYl9zdHJ1Y3QoZl90eXBlc18sIHRzdHJ1Y3QsIGZhbHNlKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQotICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KLSAqCi0gKiBAcGFyYW0gdHhjZXB0aW9uIFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7Ci0gIGdlbmVyYXRlX3JiX3N0cnVjdChmX3R5cGVzXywgdHhjZXB0aW9uLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBHZW5lcmF0ZXMgYSBydWJ5IHN0cnVjdAotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3QodF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgewotICBnZW5lcmF0ZV9yZG9jKG91dCwgdHN0cnVjdCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgIiA8PCB0eXBlX25hbWUodHN0cnVjdCk7Ci0gIGlmIChpc19leGNlcHRpb24pIHsKLSAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpFeGNlcHRpb24iOwotICB9Ci0gIG91dCA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfdXAoKTsKLSAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3QsIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7Ci0KLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIGdlbmVyYXRlX3JiX3NpbXBsZV9leGNlcHRpb25fY29uc3RydWN0b3Iob3V0LCB0c3RydWN0KTsKLSAgfQotCi0gIGdlbmVyYXRlX2ZpZWxkX2NvbnN0YW50cyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9maWVsZF9kZWZucyhvdXQsIHRzdHJ1Y3QpOwotICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICI6OlRocmlmdDo6U3RydWN0LmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0KLS8qKgotICogR2VuZXJhdGVzIGEgcnVieSB1bmlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlKSB7Ci0gICh2b2lkKSBpc19leGNlcHRpb247Ci0gIGdlbmVyYXRlX3Jkb2Mob3V0LCB0c3RydWN0KTsKLSAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIDwgOjpUaHJpZnQ6OlVuaW9uIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfdXAoKTsKLSAgb3V0LmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpTdHJ1Y3RfVW5pb24iIDw8IGVuZGw7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RydWN0b3JzKG91dCwgdHN0cnVjdCk7Ci0KLSAgZ2VuZXJhdGVfZmllbGRfY29uc3RhbnRzKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX2ZpZWxkX2RlZm5zKG91dCwgdHN0cnVjdCk7Ci0gIGdlbmVyYXRlX3JiX3VuaW9uX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QpOwotCi0gIG91dC5pbmRlbnQoKSA8PCAiOjpUaHJpZnQ6OlVuaW9uLmdlbmVyYXRlX2FjY2Vzc29ycyBzZWxmIiA8PCBlbmRsOwotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdHJ1Y3RvcnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotCi0gIG91dC5pbmRlbnQoKSA8PCAiY2xhc3MgPDwgc2VsZiIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGlmIChmX2l0ZXIgIT0gZmllbGRzLmJlZ2luKCkpIHsKLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotCi0gICAgb3V0LmluZGVudCgpIDw8ICJkZWYgIiA8PCBmaWVsZF9uYW1lIDw8ICIodmFsKSIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50KCkgPDwgIiAgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIubmV3KDoiIDw8IGZpZWxkX25hbWUgPDwgIiwgdmFsKSIgPDwgZW5kbDsKLSAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotICAKLSAgb3V0LmluZGVudF9kb3duKCk7Ci0gIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gIG91dCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zaW1wbGVfZXhjZXB0aW9uX2NvbnN0cnVjdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0KLSAgaWYgKG1lbWJlcnMuc2l6ZSgpID09IDEpIHsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7Ci0KLSAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5pc19zdHJpbmcoKSkgewotICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7Ci0KLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmIGluaXRpYWxpemUobWVzc2FnZT1uaWwpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF91cCgpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJzdXBlcigpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJzZWxmLiIgPDwgbmFtZSA8PCAiID0gbWVzc2FnZSIgPDwgZW5kbDsKLSAgICAgIG91dC5pbmRlbnRfZG93bigpOwotICAgICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgICAgaWYgKG5hbWUgIT0gIm1lc3NhZ2UiKSB7Ci0gICAgICAgIG91dC5pbmRlbnQoKSA8PCAiZGVmIG1lc3NhZ2U7ICIgPDwgbmFtZSA8PCAiIGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9jb25zdGFudHModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgIHN0ZDo6c3RyaW5nIGNhcF9maWVsZF9uYW1lID0gdXBjYXNlX3N0cmluZyhmaWVsZF9uYW1lKTsKLSAgICAKLSAgICBvdXQuaW5kZW50KCkgPDwgY2FwX2ZpZWxkX25hbWUgPDwgIiA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgZW5kbDsKLSAgfQotICBvdXQgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVmbnModF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgb3V0LmluZGVudCgpIDw8ICJGSUVMRFMgPSB7IiA8PCBlbmRsOwotICBvdXQuaW5kZW50X3VwKCk7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgewotICAgICAgb3V0IDw8ICIsIiA8PCBlbmRsOwotICAgIH0KLQotICAgIC8vIGdlbmVyYXRlIHRoZSBmaWVsZCBkb2NzdHJpbmdzIHdpdGhpbiB0aGUgRklFTERTIGNvbnN0YW50LiBubyByZWFsIGJldHRlciBwbGFjZS4uLgotICAgIGdlbmVyYXRlX3Jkb2Mob3V0LCAqZl9pdGVyKTsKLQotICAgIG91dC5pbmRlbnQoKSA8PCB1cGNhc2Vfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9PiAiOwotCi0gICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpLCAoKmZfaXRlciktPmdldF92YWx1ZSgpLCAKLSAgICAgICgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpOwotICB9Ci0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQgPDwgZW5kbDsKLSAgb3V0LmluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIAotICBvdXQuaW5kZW50KCkgPDwgImRlZiBzdHJ1Y3RfZmllbGRzOyBGSUVMRFM7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAKLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGF0YSh0X3JiX29mc3RyZWFtJiBvdXQsIHRfdHlwZSogZmllbGRfdHlwZSwKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmllbGRfbmFtZSA9ICIiLCB0X2NvbnN0X3ZhbHVlKiBmaWVsZF92YWx1ZSA9IE5VTEwsIGJvb2wgb3B0aW9uYWwgPSBmYWxzZSkgewotICBmaWVsZF90eXBlID0gZ2V0X3RydWVfdHlwZShmaWVsZF90eXBlKTsKLQotICAvLyBCZWdpbiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIns6dHlwZSA9PiAiIDw8IHR5cGVfdG9fZW51bShmaWVsZF90eXBlKTsKLQotICBpZiAoIWZpZWxkX25hbWUuZW1wdHkoKSkgewotICAgIG91dCA8PCAiLCA6bmFtZSA9PiAnIiA8PCBmaWVsZF9uYW1lIDw8ICInIjsKLSAgfQotCi0gIGlmIChmaWVsZF92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgb3V0IDw8ICIsIDpkZWZhdWx0ID0+ICI7Ci0gICAgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgZmllbGRfdHlwZSwgZmllbGRfdmFsdWUpOwotICB9Ci0KLSAgaWYgKCFmaWVsZF90eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIGlmIChmaWVsZF90eXBlLT5pc19zdHJ1Y3QoKSB8fCBmaWVsZF90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmNsYXNzID0+ICIgPDwgZnVsbF90eXBlX25hbWUoKHRfc3RydWN0KilmaWVsZF90eXBlKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkX3R5cGUtPmlzX2xpc3QoKSkgewotICAgICAgb3V0IDw8ICIsIDplbGVtZW50ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X2xpc3QqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIG91dCA8PCAiLCA6a2V5ID0+ICI7Ci0gICAgICBnZW5lcmF0ZV9maWVsZF9kYXRhKG91dCwgKCh0X21hcCopZmllbGRfdHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgIG91dCA8PCAiLCA6dmFsdWUgPT4gIjsKLSAgICAgIGdlbmVyYXRlX2ZpZWxkX2RhdGEob3V0LCAoKHRfbWFwKilmaWVsZF90eXBlKS0+Z2V0X3ZhbF90eXBlKCkpOwotICAgIH0gZWxzZSBpZiAoZmllbGRfdHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiLCA6ZWxlbWVudCA9PiAiOwotICAgICAgZ2VuZXJhdGVfZmllbGRfZGF0YShvdXQsICgodF9zZXQqKWZpZWxkX3R5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZmllbGRfdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICBvdXQgPDwgIiwgOmJpbmFyeSA9PiB0cnVlIjsKLSAgICB9Ci0gIH0KLSAgCi0gIGlmKG9wdGlvbmFsKSB7Ci0gICAgb3V0IDw8ICIsIDpvcHRpb25hbCA9PiB0cnVlIjsKLSAgfQotCi0gIGlmIChmaWVsZF90eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgIiwgOmVudW1fY2xhc3MgPT4gIiA8PCBmdWxsX3R5cGVfbmFtZShmaWVsZF90eXBlKTsKLSAgfQotCi0gIC8vIEVuZCBvZiB0aGlzIGZpZWxkJ3MgZGVmbgotICBvdXQgPDwgIn0iOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpiZWdpbl9uYW1lc3BhY2UodF9yYl9vZnN0cmVhbSYgb3V0LCB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMpIHsKLSAgZm9yICh2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLmJlZ2luKCk7IG1faXRlciAhPSBtb2R1bGVzLmVuZCgpOyArK21faXRlcikgewotICAgIG91dC5pbmRlbnQoKSA8PCAibW9kdWxlICIgPDwgKm1faXRlciA8PCBlbmRsOwotICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgfQotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjplbmRfbmFtZXNwYWNlKHRfcmJfb2ZzdHJlYW0mIG91dCwgdmVjdG9yPHN0ZDo6c3RyaW5nPiBtb2R1bGVzKSB7Ci0gIGZvciAodmVjdG9yPHN0ZDo6c3RyaW5nPjo6cmV2ZXJzZV9pdGVyYXRvciBtX2l0ZXIgPSBtb2R1bGVzLnJiZWdpbigpOyBtX2l0ZXIgIT0gbW9kdWxlcy5yZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgb3V0LmluZGVudF9kb3duKCk7Ci0gICAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gIH0KLX0KLQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHRocmlmdCBzZXJ2aWNlLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBnZXRfb3V0X2RpcigpK3VuZGVyc2NvcmUoc2VydmljZV9uYW1lXykrIi5yYiI7Ci0gIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKLQotICBmX3NlcnZpY2VfIDw8Ci0gICAgcmJfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCByZW5kZXJfcmVxdWlyZV90aHJpZnQoKTsKLQotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGZfc2VydmljZV8gPDwKLSAgICAgICJyZXF1aXJlICciIDw8IHVuZGVyc2NvcmUodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkpIDw8ICInIiA8PCBlbmRsOwotICB9Ci0KLSAgZl9zZXJ2aWNlXyA8PAotICAgICJyZXF1aXJlICciIDw8IHVuZGVyc2NvcmUocHJvZ3JhbV9uYW1lXykgPDwgIl90eXBlcyciIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIGJlZ2luX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJtb2R1bGUgIiA8PCBjYXBpdGFsaXplKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSB0aHJlZSBtYWluIHBhcnRzIG9mIHRoZSBzZXJ2aWNlICh3ZWxsLCB0d28gZm9yIG5vdyBpbiBQSFApCi0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwotCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgZW5kX25hbWVzcGFjZShmX3NlcnZpY2VfLCBydWJ5X21vZHVsZXModHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpKTsKLQotICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKLSAgZl9zZXJ2aWNlXy5jbG9zZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBoZWxwZXIgZnVuY3Rpb25zIGZvciBhIHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgaGVhZGVyIGRlZmluaXRpb24gZm9yCi0gKi8KLXZvaWQgdF9yYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgIiMgSEVMUEVSIEZVTkNUSU9OUyBBTkQgU1RSVUNUVVJFUyIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwotICAgIGdlbmVyYXRlX3JiX3N0cnVjdChmX3NlcnZpY2VfLCB0cyk7Ci0gICAgZ2VuZXJhdGVfcmJfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKLSAgfQotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHN0cnVjdCBhbmQgaGVscGVycyBmb3IgYSBmdW5jdGlvbi4KLSAqCi0gKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBmdW5jdGlvbgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7Ci0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKLSAgfQotCi0gIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7Ci0gIH0KLSAgZ2VuZXJhdGVfcmJfc3RydWN0KGZfc2VydmljZV8sICZyZXN1bHQpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGRlZmluaXRpb24uCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gZnVsbF90eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfY2xpZW50ID0gIiA8ICIgKyBleHRlbmRzICsgIjo6Q2xpZW50ICI7Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7Ci0gIGZfc2VydmljZV8uaW5kZW50X3VwKCk7Ci0KLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiaW5jbHVkZSA6OlRocmlmdDo6Q2xpZW50IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLSAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLQotICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKLSAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PAotICAgICAgICAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOwotCi0gICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgInJldHVybiAiOwotICAgICAgICB9Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpIiA8PCBlbmRsOwotICAgICAgfQotICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwotCi0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PAotICAgICAgImRlZiBzZW5kXyIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICAgICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBjYXBpdGFsaXplKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfYXJncyIpOwotCi0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJzZW5kX21lc3NhZ2UoJyIgPDwgZnVubmFtZSA8PCAiJywgIiA8PCBhcmdzbmFtZTsKLQotICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCA6IiA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0+ICIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7Ci0KLSAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotCi0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIpOwotICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKLQotICAgICAgdF9mdW5jdGlvbiByZWN2X2Z1bmN0aW9uKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vYXJncyk7Ci0gICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJkZWYgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gICAgICAvLyBUT0RPKG1jc2xlZSk6IFZhbGlkYXRlIG1lc3NhZ2UgcmVwbHkgaGVyZSwgc2VxIGlkcyBldGMuCi0KLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgInJlc3VsdCA9IHJlY2VpdmVfbWVzc2FnZSgiIDw8IHJlc3VsdG5hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgICAgIC8vIENhcmVmdWwsIG9ubHkgcmV0dXJuIF9yZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgotICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LnN1Y2Nlc3MgdW5sZXNzIHJlc3VsdC5zdWNjZXNzLm5pbD8iIDw8IGVuZGw7Ci0gICAgICB9Ci0KLSAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOwotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwKLSAgICAgICAgICAicmFpc2UgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8Ci0gICAgICAgICAgICAiIHVubGVzcyByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIi5uaWw/IiA8PCBlbmRsOwotICAgICAgfQotCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8Ci0gICAgICAgICAgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwKLSAgICAgICAgICAicmFpc2UgOjpUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246Ok1JU1NJTkdfUkVTVUxULCAnIiA8PAotICAgICAgICAgICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKSIgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBzZXJ2ZXIgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBkaXNwYXRjaCBtZXRob2RzCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwotICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewotICAgIGV4dGVuZHMgPSBmdWxsX3R5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgZXh0ZW5kc19wcm9jZXNzb3IgPSAiIDwgIiArIGV4dGVuZHMgKyAiOjpQcm9jZXNzb3IgIjsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8Ci0gICAgImNsYXNzIFByb2Nlc3NvciIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgZW5kbDsKLSAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJpbmNsdWRlIDo6VGhyaWZ0OjpQcm9jZXNzb3IiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgcHJvY2VzcyBzdWJmdW5jdGlvbnMKLSAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHRzZXJ2aWNlLCAqZl9pdGVyKTsKLSAgfQotCi0gIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgcHJvY2VzcyBmdW5jdGlvbiBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKLSAqLwotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgKHZvaWQpIHRzZXJ2aWNlOwotICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwKLSAgICAiZGVmIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwKLSAgICAiKHNlcWlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwotICBmX3NlcnZpY2VfLmluZGVudF91cCgpOwotCi0gIHN0cmluZyBhcmdzbmFtZSA9IGNhcGl0YWxpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICJfYXJncyI7Ci0gIHN0cmluZyByZXN1bHRuYW1lID0gY2FwaXRhbGl6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIl9yZXN1bHQiOwotCi0gIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImFyZ3MgPSByZWFkX2FyZ3MoaXByb3QsICIgPDwgYXJnc25hbWUgPDwgIikiIDw8IGVuZGw7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLQotICAvLyBEZWNsYXJlIHJlc3VsdCBmb3Igbm9uIG9uZXdheSBmdW5jdGlvbgotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJyZXN1bHQgPSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5uZXcoKSIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAiYmVnaW4iIDw8IGVuZGw7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCi0gIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmX3NlcnZpY2VfLmluZGVudCgpOwotICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwotICB9Ci0gIGZfc2VydmljZV8gPDwKLSAgICAiQGhhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigiOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICB9Ci0gICAgZl9zZXJ2aWNlXyA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICBmX3NlcnZpY2VfIDw8ICIpIiA8PCBlbmRsOwotCi0gIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzY3VlICIgPDwgZnVsbF90eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiID0+ICIgPDwKLSAgICAgICAgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnRfdXAoKTsKLSAgICAgICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfLmluZGVudF9kb3duKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGZfc2VydmljZV8uaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgfQotCi0gIC8vIFNob3J0Y3V0IG91dCBoZXJlIGZvciBvbmV3YXkgZnVuY3Rpb25zCi0gIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgZl9zZXJ2aWNlXy5pbmRlbnQoKSA8PCAicmV0dXJuIiA8PCBlbmRsOwotICAgIGZfc2VydmljZV8uaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJ3cml0ZV9yZXN1bHQocmVzdWx0LCBvcHJvdCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBzZXFpZCkiIDw8IGVuZGw7Ci0KLSAgLy8gQ2xvc2UgZnVuY3Rpb24KLSAgZl9zZXJ2aWNlXy5pbmRlbnRfZG93bigpOwotICBmX3NlcnZpY2VfLmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZnVuY3Rpb24gc2lnbmF0dXJlIG9mIHRoZSBmb3JtICd0eXBlIG5hbWUoYXJncyknCi0gKgotICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCi0gKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCi0gKi8KLXN0cmluZyB0X3JiX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7Ci0gIC8vIFRPRE8obWNzbGVlKTogTml0cGlja3ksIG5vICcsJyBpZiBhcmd1bWVudF9saXN0IGlzIGVtcHR5Ci0gIHJldHVybgotICAgIHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArCi0gICAgIigiICsgIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKLX0KLQotLyoqCi0gKiBSZW5kZXJzIGEgZmllbGQgbGlzdAotICovCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgc3RyaW5nIHJlc3VsdCA9ICIiOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgaWYgKGZpcnN0KSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgKz0gIiwgIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9yYl9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBuYW1lID0gY2FwaXRhbGl6ZSh0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0KLQotICByZXR1cm4gcHJlZml4ICsgbmFtZTsKLX0KLQotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjpmdWxsX3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiOjoiOwotICB2ZWN0b3I8c3RkOjpzdHJpbmc+IG1vZHVsZXMgPSBydWJ5X21vZHVsZXModHR5cGUtPmdldF9wcm9ncmFtKCkpOwotICBmb3IgKHZlY3RvcjxzdGQ6OnN0cmluZz46Oml0ZXJhdG9yIG1faXRlciA9IG1vZHVsZXMuYmVnaW4oKTsKLSAgICAgICBtX2l0ZXIgIT0gbW9kdWxlcy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICBwcmVmaXggKz0gKm1faXRlciArICI6OiI7Ci0gIH0KLSAgcmV0dXJuIHByZWZpeCArIHR5cGVfbmFtZSh0dHlwZSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgdGhlIHBhcnNlIHR5cGUgdG8gYSBSdWJ5IHR5b2UKLSAqLwotc3RyaW5nIHRfcmJfZ2VuZXJhdG9yOjp0eXBlX3RvX2VudW0odF90eXBlKiB0eXBlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUklORyI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkJPT0wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpCWVRFIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpJMTYiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STY0IjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpET1VCTEUiOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6STMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICI6OlRocmlmdDo6VHlwZXM6OlNUUlVDVCI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gIjo6VGhyaWZ0OjpUeXBlczo6TUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpTRVQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiOjpUaHJpZnQ6OlR5cGVzOjpMSVNUIjsKLSAgfQotCi0gIHRocm93ICJJTlZBTElEIFRZUEUgSU4gdHlwZV90b19lbnVtOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKLX0KLQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZG9jKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKLSAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewotICAgIG91dC5pbmRlbnQoKTsKLSAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsCi0gICAgICAiIiwgIiMgIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7Ci0gIH0KLX0KLQotdm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmJfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcih0X3JiX29mc3RyZWFtJiBvdXQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHRfZmllbGQqIGZpZWxkID0gKCpmX2l0ZXIpOwotICAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKLSAgICAgIG91dC5pbmRlbnQoKSA8PAotICAgICAgICAicmFpc2UgOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyg6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04sICdSZXF1aXJlZCBmaWVsZCAiIDw8Ci0gICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJykiOwotICAgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19ib29sKCkpIHsKLSAgICAgICAgb3V0IDw8ICIgaWYgQCIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIi5uaWw/IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCAiIHVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKTsKLSAgICAgIH0KLSAgICAgIG91dCA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIC8vIGlmIGZpZWxkIGlzIGFuIGVudW0sIGNoZWNrIHRoYXQgaXRzIHZhbHVlIGlzIHZhbGlkCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgdF9maWVsZCogZmllbGQgPSAoKmZfaXRlcik7Ci0KLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSl7ICAgICAgCi0gICAgICBvdXQuaW5kZW50KCkgPDwgInVubGVzcyBAIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLm5pbD8gfHwgIiA8PAotICAgICAgICBmdWxsX3R5cGVfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjo6VkFMSURfVkFMVUVTLmluY2x1ZGU/KEAiIDw8Ci0gICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudF91cCgpOwotICAgICAgb3V0LmluZGVudCgpIDw8Ci0gICAgICAgICJyYWlzZSA6OlRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6VU5LTk9XTiwgJ0ludmFsaWQgdmFsdWUgb2YgZmllbGQgIiA8PAotICAgICAgICBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiIScpIiA8PCBlbmRsOyAgCi0gICAgICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiZW5kIiA8PCBlbmRsOwotICAgIH0KLSAgfQotCi0gIG91dC5pbmRlbnRfZG93bigpOwotICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl91bmlvbl92YWxpZGF0b3IodF9yYl9vZnN0cmVhbSYgb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewotICBvdXQuaW5kZW50KCkgPDwgImRlZiB2YWxpZGF0ZSIgPDwgZW5kbDsKLSAgb3V0LmluZGVudF91cCgpOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBvdXQuaW5kZW50KCkgPDwKLSAgICAicmFpc2UoU3RhbmRhcmRFcnJvciwgJ1VuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4nKSBpZiBnZXRfc2V0X2ZpZWxkLm5pbD8gfHwgZ2V0X3ZhbHVlLm5pbD8iIDw8IGVuZGw7Ci0KLSAgLy8gaWYgZmllbGQgaXMgYW4gZW51bSwgY2hlY2sgdGhhdCBpdHMgdmFsdWUgaXMgdmFsaWQKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBjb25zdCB0X2ZpZWxkKiBmaWVsZCA9ICgqZl9pdGVyKTsKLQotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKXsgICAgICAKLSAgICAgIG91dC5pbmRlbnQoKSA8PCAiaWYgZ2V0X3NldF9maWVsZCA9PSA6IiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgb3V0LmluZGVudCgpIDw8Ci0gICAgICAgICIgIHJhaXNlIDo6VGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbi5uZXcoOjpUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOLCAnSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCAiIDw8Ci0gICAgICAgIGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIhJykgdW5sZXNzICIgPDwgZnVsbF90eXBlX25hbWUoZmllbGQtPmdldF90eXBlKCkpIDw8Ci0gICAgICAgICI6OlZBTElEX1ZBTFVFUy5pbmNsdWRlPyhnZXRfdmFsdWUpIiA8PCBlbmRsOyAgCi0gICAgICBvdXQuaW5kZW50KCkgPDwgImVuZCIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLQotICBvdXQuaW5kZW50X2Rvd24oKTsKLSAgb3V0LmluZGVudCgpIDw8ICJlbmQiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihyYiwgIlJ1YnkiLAotIiAgICBydWJ5Z2VtczogICAgICAgIEFkZCBhIFwicmVxdWlyZSAncnVieWdlbXMnXCIgbGluZSB0byB0aGUgdG9wIG9mIGVhY2ggZ2VuZXJhdGVkIGZpbGUuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZThhM2IuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgotICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKLSAqIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotI2luY2x1ZGUgInRfb29wX2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0vKioKLSAqIFNtYWxsdGFsayBjb2RlIGdlbmVyYXRvci4KLSAqCi0gKi8KLWNsYXNzIHRfc3RfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3N0X2dlbmVyYXRvcigKLSAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi1zdCI7Ci0gIH0KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmICAgICAodF90eXBlZGVmKiAgdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0gICAgICAgICh0X2VudW0qICAgICB0ZW51bSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29uc3QgICAgICAgKHRfY29uc3QqICAgIHRjb25zdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0ICAgICAgKHRfc3RydWN0KiAgIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uICAgICh0X3N0cnVjdCogICB0eGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UgICAgICh0X3NlcnZpY2UqICB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY2xhc3Nfc2lkZV9kZWZpbml0aW9uICgpOwotICB2b2lkIGdlbmVyYXRlX2ZvcmNlX2NvbnN0cyAoKTsKLQotCi0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKLQotICAvKioKLSAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdCAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2FjY2Vzc29ycyAgIChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLQotICAvKioKLSAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwotICAgKi8KLQotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50ICAgICh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLQotICB2b2lkIGdlbmVyYXRlX3NlbmRfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3JlY3ZfbWV0aG9kICh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotCi0gIHN0ZDo6c3RyaW5nIG1hcF9yZWFkZXIgKHRfbWFwICp0bWFwKTsKLSAgc3RkOjpzdHJpbmcgbGlzdF9yZWFkZXIgKHRfbGlzdCAqdGxpc3QpOwotICBzdGQ6OnN0cmluZyBzZXRfcmVhZGVyICh0X3NldCAqdHNldCk7Ci0gIHN0ZDo6c3RyaW5nIHN0cnVjdF9yZWFkZXIgKHRfc3RydWN0ICp0c3RydWN0LCBzdGQ6OnN0cmluZyBjbHNOYW1lKTsKLQotICBzdGQ6OnN0cmluZyBtYXBfd3JpdGVyICh0X21hcCAqdG1hcCwgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIGxpc3Rfd3JpdGVyICh0X2xpc3QgKnRsaXN0LCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgc2V0X3dyaXRlciAodF9zZXQgKnRzZXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICBzdGQ6OnN0cmluZyBzdHJ1Y3Rfd3JpdGVyICh0X3N0cnVjdCAqdHN0cnVjdCwgc3RkOjpzdHJpbmcgZm5hbWUpOwotCi0gIHN0ZDo6c3RyaW5nIHdyaXRlX3ZhbCAodF90eXBlICp0LCBzdGQ6OnN0cmluZyBmbmFtZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlYWRfdmFsICh0X3R5cGUgKnQpOwotCi0gIC8qKgotICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwotICAgKi8KLQotICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKLQotICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKLSAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOwotICB2b2lkIHN0X2dldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKLQotICBzdGQ6OnN0cmluZyBjbGFzc19uYW1lKCk7Ci0gIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7Ci0gIHN0ZDo6c3RyaW5nIGNsaWVudF9jbGFzc19uYW1lKCk7Ci0gIHN0ZDo6c3RyaW5nIHByZWZpeChzdGQ6OnN0cmluZyBuYW1lKTsKLSAgc3RkOjpzdHJpbmcgZGVjbGFyZV9maWVsZCh0X2ZpZWxkKiB0ZmllbGQpOwotICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7Ci0KLSAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICBzdGQ6OnN0cmluZyBmdW5jdGlvbl90eXBlc19jb21tZW50KHRfZnVuY3Rpb24qIGZuKTsKLQotICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7Ci0gIHN0ZDo6c3RyaW5nIGFfdHlwZSh0X3R5cGUqIHR5cGUpOwotICBib29sIGlzX3Zvd2VsKGNoYXIgYyk7Ci0gIHN0ZDo6c3RyaW5nIHRlbXBfbmFtZSgpOwotICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfY2F0ZWdvcnkoKTsKLQotIHByaXZhdGU6Ci0KLSAgLyoqCi0gICAqIEZpbGUgc3RyZWFtcwotICAgKi8KLSAgaW50IHRlbXBvcmFyeV92YXI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl87Ci0KLX07Ci0KLQotLyoqCi0gKiBQcmVwYXJlcyBmb3IgZmlsZSBnZW5lcmF0aW9uIGJ5IG9wZW5pbmcgdXAgdGhlIG5lY2Vzc2FyeSBmaWxlIG91dHB1dAotICogc3RyZWFtcy4KLSAqCi0gKiBAcGFyYW0gdHByb2dyYW0gVGhlIHByb2dyYW0gdG8gZ2VuZXJhdGUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7Ci0gIC8vIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeQotICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOwotCi0gIHRlbXBvcmFyeV92YXIgPSAwOwotCi0gIC8vIE1ha2Ugb3V0cHV0IGZpbGUKLSAgc3RyaW5nIGZfbmFtZSA9IGdldF9vdXRfZGlyKCkrIi8iK3Byb2dyYW1fbmFtZV8rIi5zdCI7Ci0gIGZfLm9wZW4oZl9uYW1lLmNfc3RyKCkpOwotCi0gIC8vIFByaW50IGhlYWRlcgotICBmXyA8PCBzdF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOwotCi0gIHN0X2NsYXNzX2RlZihmXywgcHJvZ3JhbV9uYW1lXyk7Ci0gIGdlbmVyYXRlX2NsYXNzX3NpZGVfZGVmaW5pdGlvbigpOwotCi0gIC8vR2VuZXJhdGUgZW51bXMKLSAgdmVjdG9yPHRfZW51bSo+IGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46Oml0ZXJhdG9yIGVuX2l0ZXI7Ci0gIGZvciAoZW5faXRlciA9IGVudW1zLmJlZ2luKCk7IGVuX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZW5faXRlcikgewotICAgIGdlbmVyYXRlX2VudW0oKmVuX2l0ZXIpOwotICB9Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Y2xhc3NfbmFtZSgpIHsKLSAgcmV0dXJuIGNhcGl0YWxpemUocHJvZ3JhbV9uYW1lXyk7Ci19Ci0KLWJvb2wgdF9zdF9nZW5lcmF0b3I6OmlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSkgewotICByZXR1cm4gc3ViX25hbWVzcGFjZSA9PSAicHJlZml4IiB8fCBzdWJfbmFtZXNwYWNlID09ICJjYXRlZ29yeSI7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6cHJlZml4KHN0cmluZyBjbGFzc19uYW1lKSB7Ci0gIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgic21hbGx0YWxrLnByZWZpeCIpOwotICBzdHJpbmcgbmFtZSA9IGNhcGl0YWxpemUoY2xhc3NfbmFtZSk7Ci0gIG5hbWUgPSBwcmVmaXguZW1wdHkoKSA/IG5hbWUgOiAocHJlZml4ICsgbmFtZSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmNsaWVudF9jbGFzc19uYW1lKCkgewotICByZXR1cm4gY2FwaXRhbGl6ZShzZXJ2aWNlX25hbWVfKSArICJDbGllbnQiOwotfQotCi0vKioKLSAqIEF1dG9nZW4nZCBjb21tZW50Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RfYXV0b2dlbl9jb21tZW50KCkgewotICByZXR1cm4KLSAgICBzdGQ6OnN0cmluZygiJyIpICsKLSAgICAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCIgKyBUSFJJRlRfVkVSU0lPTiArICIpXG4iICsKLSAgICAiXG4iICsKLSAgICAiRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCi0gICAgIichXG4iOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mb3JjZV9jb25zdHMoKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgZW51bXMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8Ci0gICAgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtcyBhdDogayBwdXQ6IHYgdmFsdWVdLiEiIDw8IGVuZGw7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMga2V5c0FuZFZhbHVlc0RvOiBbOmsgOnYgfCAiIDw8Ci0gICAgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBjb25zdGFudHMgYXQ6IGsgcHV0OiB2IHZhbHVlXS4hIiA8PCBlbmRsOwotCi19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmNsb3NlX2dlbmVyYXRvcigpIHsKLSAgZ2VuZXJhdGVfZm9yY2VfY29uc3RzKCk7Ci0gIGZfLmNsb3NlKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVkX2NhdGVnb3J5KCkgewotICBzdHJpbmcgY2F0ID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIpOwotICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBUaHJpZnQgZ3JhbW1hciwgdGhlIGNhdGVnb3J5IG11c3QKLSAgLy8gYmUgcHVuY3R1YXRlZCBieSBkb3RzLiAgUmVwbGFjZXMgdGhlbSB3aXRoIGRhc2hlcyBoZXJlLgotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaXRlciA9IGNhdC5iZWdpbigpOyBpdGVyICE9IGNhdC5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaWYgKCppdGVyID09ICcuJykgewotICAgICAgKml0ZXIgPSAnLSc7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjYXQuc2l6ZSgpID8gY2F0IDogIkdlbmVyYXRlZC0iICsgY2xhc3NfbmFtZSgpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gU21hbGx0YWxrLCB0eXBlcyBhcmUgYWxsIGltcGxpY2l0LgotICoKLSAqIEBwYXJhbSB0dHlwZWRlZiBUaGUgdHlwZSBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICAodm9pZCkgdHR5cGVkZWY7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBuYW1lKSB7Ci0gIG91dCA8PCAiT2JqZWN0IHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgobmFtZSkgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnJyIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgInBvb2xEaWN0aW9uYXJpZXM6ICcnIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgImNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lLCAiYXMgeWV0IHVuY2F0ZWdvcml6ZWQiKTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzICsgIiBjbGFzcyIsIG5hbWUpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7Ci0gIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSwgY2F0ZWdvcnkpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7Ci0gIGNoYXIgdGltZXN0cls1MF07Ci0gIHRpbWVfdCByYXd0aW1lOwotICBzdHJ1Y3QgdG0gKnRpbmZvOwotCi0gIHRpbWUoJnJhd3RpbWUpOwotICB0aW5mbyA9IGxvY2FsdGltZSgmcmF3dGltZSk7Ci0gIHN0cmZ0aW1lKHRpbWVzdHIsIDUwLCAiJW0vJWQvJVkgJUg6JU0iLCB0aW5mbyk7Ci0KLSAgb3V0IDw8ICIhIiA8PCBwcmVmaXgoY2xzKSA8PAotICAgICIgbWV0aG9kc0ZvcjogJyIrY2F0ZWdvcnkrIicgc3RhbXA6ICd0aHJpZnQgIiA8PCB0aW1lc3RyIDw8ICInIVxuIiA8PAotICAgIG5hbWUgPDwgZW5kbDsKLQotICBpbmRlbnRfdXAoKTsKLSAgb3V0IDw8IGluZGVudCgpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvZnN0cmVhbSAmb3V0KSB7Ci0gIG91dCA8PCAiISAhIiA8PCBlbmRsIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9mc3RyZWFtICZvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgdHlwZSA9ICJhbk9iamVjdCIpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIjogIiArIHR5cGUpOwotICBvdXQgPDwgbmFtZSA8PCAiIDo9ICIgKyB0eXBlOwotICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfZ2V0dGVyKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUpIHsKLSAgc3RfbWV0aG9kKG91dCwgY2xzLCBuYW1lICsgIiIpOwotICBvdXQgPDwgIl4gIiA8PCBuYW1lOwotICBzdF9jbG9zZV9tZXRob2Qob3V0KTsKLX0KLQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0gJm91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewotICBzdF9zZXR0ZXIob3V0LCBjbHMsIG5hbWUsIHR5cGUpOwotICBzdF9nZXR0ZXIob3V0LCBjbHMsIG5hbWUpOwotfQotCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbGFzc19zaWRlX2RlZmluaXRpb24oKSB7Ci0gIGZfIDw8IHByZWZpeChjbGFzc19uYW1lKCkpIDw8ICIgY2xhc3MiIDw8IGVuZGwgPDwKLSAgICAiXHRpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICdjb25zdGFudHMgZW51bXMnISIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHN0X2FjY2Vzc29ycyhmXywgY2xhc3NfbmFtZSgpICsgIiBjbGFzcyIsICJlbnVtcyIpOwotICBzdF9hY2Nlc3NvcnMoZl8sIGNsYXNzX25hbWUoKSArICIgY2xhc3MiLCAiY29uc3RhbnRzIik7Ci0KLSAgZl8gPDwgcHJlZml4KGNsYXNzX25hbWUoKSkgPDwgIiBlbnVtczogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOwotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50czogRGljdGlvbmFyeSBuZXchIiA8PCBlbmRsOwotCi0gIGZfIDw8IGVuZGw7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gRG9uZSB1c2luZyBhIGNsYXNzIHRvIHNjb3BlCi0gKiB0aGUgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB0ZW51bSBUaGUgZW51bWVyYXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0cmluZyBjbHNfbmFtZSA9IHByb2dyYW1fbmFtZV8gKyBjYXBpdGFsaXplKHRlbnVtLT5nZXRfbmFtZSgpKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGVudW1zIGF0OiAnIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6IFsiIDw8Ci0gICAgIihEaWN0aW9uYXJ5IG5ldyAiIDw8IGVuZGw7Ci0KLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOwotICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewotICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7Ci0gICAgZl8gPDwgIlx0YXQ6ICciIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyBwdXQ6ICIgPDwgdmFsdWUgPDwgIjsiIDw8IGVuZGw7Ci0gIH0KLQotICBmXyA8PCAiXHR5b3Vyc2VsZildISIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlIGEgY29uc3RhbnQgdmFsdWUKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KSB7Ci0gIHRfdHlwZSogdHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKLSAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQotICBmXyA8PCBwcmVmaXgoY2xhc3NfbmFtZSgpKSA8PCAiIGNvbnN0YW50cyBhdDogJyIgPDwgbmFtZSA8PCAiJyBwdXQ6IFsiIDw8Ci0gICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA8PCAiXSEiIDw8IGVuZGwgPDwgZW5kbDsKLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKLSAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCi0gKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgb3V0IDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JZVEU6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICIoIiA8PCBjYXBpdGFsaXplKHR5cGUtPmdldF9uYW1lKCkpIDw8ICIgbmV3ICIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotCi0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSA8PCAiOiAiIDw8Ci0gICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieW91cnNlbGYpIjsKLQotICAgIGluZGVudF9kb3duKCk7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwotICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpOwotICAgICAgb3V0IDw8ICJhdDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwotICAgICAgb3V0IDw8ICIgcHV0OiAiOwotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogZXR5cGU7Ci0gICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgICAgZXR5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZXR5cGUgPSAoKHRfc2V0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIH0KLSAgICBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICAgIG91dCA8PCAiKFNldCBuZXciIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dCA8PCAiKE9yZGVyZWRDb2xsZWN0aW9uIG5ldyIgPDwgZW5kbDsKLSAgICB9Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7Ci0gICAgICBvdXQgPDwgImFkZDogIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwotICAgIH0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInlvdXJzZWxmKSI7Ci0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBpbmRlbnRfZG93bigpOwotICB9IGVsc2UgewotICAgIHRocm93ICJDQU5OT1QgR0VORVJBVEUgQ09OU1RBTlQgRk9SIFRZUEU6ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwotICB9Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgU21hbGx0YWxrIHN0cnVjdAotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0c3RydWN0LCBmYWxzZSk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc3RydWN0IGRlZmluaXRpb24gZm9yIGEgdGhyaWZ0IGV4Y2VwdGlvbi4gQmFzaWNhbGx5IHRoZSBzYW1lCi0gKiBhcyBhIHN0cnVjdCBidXQgZXh0ZW5kcyB0aGUgRXhjZXB0aW9uIGNsYXNzLgotICoKLSAqIEBwYXJhbSB0eGNlcHRpb24gVGhlIHN0cnVjdCBkZWZpbml0aW9uCi0gKi8KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKLSAgZ2VuZXJhdGVfc3Rfc3RydWN0KGZfLCB0eGNlcHRpb24sIHRydWUpOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNtYWxsdGFsayBjbGFzcyB0byByZXByZXNlbnQgYSBzdHJ1Y3QKLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLQotICBpZiAoaXNfZXhjZXB0aW9uKQotICAgIG91dCA8PCAiRXJyb3IiOwotICBlbHNlCi0gICAgb3V0IDw8ICJPYmplY3QiOwotCi0gIG91dCA8PCAiIHN1YmNsYXNzOiAjIiA8PCBwcmVmaXgodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnIjsKLQotICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7Ci0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgaWYgKG1faXRlciAhPSBtZW1iZXJzLmJlZ2luKCkpIG91dCA8PCAiICI7Ci0gICAgICBvdXQgPDwgY2FtZWxjYXNlKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgb3V0IDw8ICInXG4iIDw8Ci0gICAgIlx0Y2xhc3NWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdHBvb2xEaWN0aW9uYXJpZXM6ICcnXG4iIDw8Ci0gICAgIlx0Y2F0ZWdvcnk6ICciIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInIVxuXG4iOwotCi0gIGdlbmVyYXRlX2FjY2Vzc29ycyhvdXQsIHRzdHJ1Y3QpOwotfQotCi1ib29sIHRfc3RfZ2VuZXJhdG9yOjppc192b3dlbChjaGFyIGMpIHsKLSAgc3dpdGNoKHRvbG93ZXIoYykpIHsKLSAgICBjYXNlICdhJzogY2FzZSAnZSc6IGNhc2UgJ2knOiBjYXNlICdvJzogY2FzZSAndSc6Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmFfdHlwZSh0X3R5cGUqIHR5cGUpIHsKLSAgc3RyaW5nIHByZWZpeDsKLQotICBpZiAoaXNfdm93ZWwodHlwZV9uYW1lKHR5cGUpWzBdKSkKLSAgICBwcmVmaXggPSAiYW4iOwotICBlbHNlCi0gICAgcHJlZml4ID0gImEiOwotCi0gIHJldHVybiBwcmVmaXggKyBjYXBpdGFsaXplKHR5cGVfbmFtZSh0eXBlKSk7Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7Ci0gIHN0cmluZyB0eXBlOwotICBzdHJpbmcgcHJlZml4OwotCi0gIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICBzdF9hY2Nlc3NvcnMob3V0LAotICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUodHlwZV9uYW1lKHRzdHJ1Y3QpKSwKLSAgICAgICAgICAgICAgICAgICBjYW1lbGNhc2UoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICBhX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSk7Ci0gICAgfQotICAgIG91dCA8PCBlbmRsOwotICB9Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgdGhyaWZ0IHNlcnZpY2UuCi0gKgotICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIGRlZmluaXRpb24KLSAqLwotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlKTsKLSAgLy8gZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodHNlcnZpY2UpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnRlbXBfbmFtZSgpIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgb3V0IDw8ICJ0ZW1wIiA8PCB0ZW1wb3JhcnlfdmFyKys7Ci0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6bWFwX3dyaXRlcih0X21hcCAqdG1hcCwgc3RyaW5nIGZuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBrZXkgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW29wcm90IHdyaXRlTWFwQmVnaW46IChUTWFwIG5ldyBrZXlUeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0bWFwLT5nZXRfa2V5X3R5cGUoKSkgPDwKLSAgICAiOyB2YWx1ZVR5cGU6ICIgPDwgdHlwZV90b19lbnVtKHRtYXAtPmdldF92YWxfdHlwZSgpKSA8PCAiOyBzaXplOiAiIDw8IGZuYW1lIDw8ICIgc2l6ZSkuIiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgZm5hbWUgPDwgIiBrZXlzQW5kVmFsdWVzRG86IFs6IiA8PCBrZXkgPDwgIiA6IiA8PCB2YWwgPDwgIiB8IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgd3JpdGVfdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVNYXBFbmRdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Om1hcF9yZWFkZXIodF9tYXAgKnRtYXApIHsKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKLSAgc3RyaW5nIGRlc2MgPSB0ZW1wX25hbWUoKTsKLSAgc3RyaW5nIHZhbCA9IHRlbXBfbmFtZSgpOwotCi0gIG91dCA8PCAiW3wiIDw8IGRlc2MgPDwgIiAiIDw8IHZhbCA8PCAifCAiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZE1hcEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IHZhbCA8PCAiIDo9IERpY3Rpb25hcnkgbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X2tleV90eXBlKCkpIDw8Ci0gICAgIiBwdXQ6ICIgPDwgcmVhZF92YWwodG1hcC0+Z2V0X3ZhbF90eXBlKCkpOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZE1hcEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6Omxpc3Rfd3JpdGVyKHRfbGlzdCAqdGxpc3QsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVMaXN0QmVnaW46IChUTGlzdCBuZXcgZWxlbVR5cGU6ICIgPDwKLSAgICB0eXBlX3RvX2VudW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSkgPDwgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdmFsKSA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIG91dCA8PCAiXS4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVMaXN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpsaXN0X3JlYWRlcih0X2xpc3QgKnRsaXN0KSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyB2YWwgPSB0ZW1wX25hbWUoKTsKLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwgIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZExpc3RCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBPcmRlcmVkQ29sbGVjdGlvbiBuZXcuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHNpemUgdGltZXNSZXBlYXQ6IFsiIDw8IGVuZGw7Ci0KLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiBhZGQ6ICIgPDwgcmVhZF92YWwodGxpc3QtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkTGlzdEVuZC4iIDw8IGVuZGwgPDwKLSAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnNldF93cml0ZXIodF9zZXQgKnRzZXQsIHN0cmluZyBmbmFtZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbb3Byb3Qgd3JpdGVTZXRCZWdpbjogKFRTZXQgbmV3IGVsZW1UeXBlOiAiIDw8IHR5cGVfdG9fZW51bSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpIDw8Ci0gICAgIjsgc2l6ZTogIiA8PCBmbmFtZSA8PCAiIHNpemUpLiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgb3V0IDw8IGluZGVudCgpIDw8IGZuYW1lIDw8ICIgZG86IFs6IiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB3cml0ZV92YWwodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCB2YWwpIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZVNldEVuZF0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c2V0X3JlYWRlcih0X3NldCAqdHNldCkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBzdHJpbmcgZGVzYyA9IHRlbXBfbmFtZSgpOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0KLSAgb3V0IDw8ICJbfCIgPDwgZGVzYyA8PCAiICIgPDwgdmFsIDw8ICJ8ICIgPDwgZGVzYyA8PCAiIDo9IGlwcm90IHJlYWRTZXRCZWdpbi4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSBTZXQgbmV3LiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8IGRlc2MgPDwgIiBzaXplIHRpbWVzUmVwZWF0OiBbIiA8PCBlbmRsOwotCi0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgdmFsIDw8ICIgYWRkOiAiIDw8IHJlYWRfdmFsKHRzZXQtPmdldF9lbGVtX3R5cGUoKSk7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgb3V0IDw8ICJdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJpcHJvdCByZWFkU2V0RW5kLiIgPDwgZW5kbCA8PAotICBpbmRlbnQoKSA8PCB2YWwgPDwgIl0gdmFsdWUiOwotICBpbmRlbnRfZG93bigpOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6c3RydWN0X3dyaXRlcih0X3N0cnVjdCAqdHN0cnVjdCwgc3RyaW5nIHNuYW1lKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBvdXQgPDwgIltvcHJvdCB3cml0ZVN0cnVjdEJlZ2luOiAiIDw8Ci0gICAgIihUU3RydWN0IG5ldyBuYW1lOiAnIiArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyInKS4iIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgYm9vbCBvcHRpb25hbCA9ICgqZmxkX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotICAgIHN0cmluZyBhY2Nlc3NvciA9IHNuYW1lICsgIiAiICsgY2FtZWxjYXNlKGZuYW1lKTsKLQotICAgIGlmIChvcHRpb25hbCkgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGFjY2Vzc29yIDw8ICIgaWZOb3ROaWw6IFsiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICB9Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUgPDwKLSAgICAgICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHdyaXRlX3ZhbCgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSwgYWNjZXNzb3IpIDw8ICIuIiA8PCBlbmRsIDw8Ci0gICAgICBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZEVuZCI7Ci0KLSAgICBpZiAob3B0aW9uYWwpIHsKLSAgICAgIG91dCA8PCAiXSI7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgIH0KLQotICAgIG91dCA8PCAiLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVGaWVsZFN0b3A7IHdyaXRlU3RydWN0RW5kXSB2YWx1ZSI7Ci0gIGluZGVudF9kb3duKCk7Ci0KLSAgcmV0dXJuIG91dC5zdHIoKTsKLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpzdHJ1Y3RfcmVhZGVyKHRfc3RydWN0ICp0c3RydWN0LCBzdHJpbmcgY2xzTmFtZSA9ICIiKSB7Ci0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXQ7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZsZF9pdGVyOwotICBzdHJpbmcgdmFsID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBkZXNjID0gdGVtcF9uYW1lKCk7Ci0gIHN0cmluZyBmb3VuZCA9IHRlbXBfbmFtZSgpOwotCi0gIGlmIChjbHNOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgY2xzTmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7Ci0gIH0KLQotICBvdXQgPDwgIlt8IiA8PCBkZXNjIDw8ICIgIiA8PCB2YWwgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIC8vVGhpcyBpcyBuYXN0eSwgYnV0IHdpdGhvdXQgaXQgd2UnbGwgYnJlYWsgdGhpbmdzIGJ5IHByZWZpeGluZyBUUmVzdWx0LgotICBzdHJpbmcgbmFtZSA9ICgoY2FwaXRhbGl6ZShjbHNOYW1lKSA9PSAiVFJlc3VsdCIpID8gY2FwaXRhbGl6ZShjbHNOYW1lKSA6IHByZWZpeChjbHNOYW1lKSk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCB2YWwgPDwgIiA6PSAiIDw8IG5hbWUgPDwgIiBuZXcuIiA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaXByb3QgcmVhZFN0cnVjdEJlZ2luLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJbIiA8PCBkZXNjIDw8ICIgOj0gaXByb3QgcmVhZEZpZWxkQmVnaW4uIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgZGVzYyA8PCAiIHR5cGUgPSBUVHlwZSBzdG9wXSB3aGlsZUZhbHNlOiBbfCIgPDwgZm91bmQgPDwgInwiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IGRlc2MgPDwgIiBpZCA9ICIgPDwgKCpmbGRfaXRlciktPmdldF9rZXkoKSA8PAotICAgICAgIiBpZlRydWU6IFsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0KLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgZm91bmQgPDwgIiA6PSB0cnVlLiIgPDwgZW5kbCA8PAotICAgICAgaW5kZW50KCkgPDwgdmFsIDw8ICIgIiA8PCBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwKLSAgICAgIHJlYWRfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpKTsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gICAgb3V0IDw8ICJdLiIgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBmb3VuZCA8PCAiIGlmTmlsOiBbaXByb3Qgc2tpcDogIiA8PCBkZXNjIDw8ICIgdHlwZV1dLiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90IHJlYWRTdHJ1Y3RFbmQuIiA8PCBlbmRsIDw8Ci0gICAgaW5kZW50KCkgPDwgdmFsIDw8ICJdIHZhbHVlIjsKLSAgaW5kZW50X2Rvd24oKTsKLQotICByZXR1cm4gb3V0LnN0cigpOwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OndyaXRlX3ZhbCh0X3R5cGUgKnQsIHN0cmluZyBmbmFtZSkgewotICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKLQotICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopIHQpLT5nZXRfYmFzZSgpOwotICAgIHN3aXRjaCh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJpcHJvdCB3cml0ZURvdWJsZTogIiArIGZuYW1lICsgIiBhc0Zsb2F0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIHJldHVybiAiaXByb3Qgd3JpdGUiICsgY2FwaXRhbGl6ZSh0eXBlX25hbWUodCkpICsgIjogIiArIGZuYW1lICsgIiBhc0ludGVnZXIiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gImlwcm90IHdyaXRlIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKSArICI6ICIgKyBmbmFtZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKLSAgICByZXR1cm4gbWFwX3dyaXRlcigodF9tYXAqKSB0LCBmbmFtZSk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiBzdHJ1Y3Rfd3JpdGVyKCh0X3N0cnVjdCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF93cml0ZXIoKHRfbGlzdCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19zZXQoKSkgewotICAgIHJldHVybiBzZXRfd3JpdGVyKCh0X3NldCopIHQsIGZuYW1lKTsKLSAgfSBlbHNlIGlmICh0LT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gImlwcm90IHdyaXRlSTMyOiAiICsgZm5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIHdyaXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7Ci0gIH0KLX0KLQotc3RyaW5nIHRfc3RfZ2VuZXJhdG9yOjpyZWFkX3ZhbCh0X3R5cGUgKnQpIHsKLSAgdCA9IGdldF90cnVlX3R5cGUodCk7Ci0KLSAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkIiArIGNhcGl0YWxpemUodHlwZV9uYW1lKHQpKTsKLSAgfSBlbHNlIGlmICh0LT5pc19tYXAoKSkgewotICAgIHJldHVybiBtYXBfcmVhZGVyKCh0X21hcCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpIHx8IHQtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gc3RydWN0X3JlYWRlcigodF9zdHJ1Y3QqKSB0KTsKLSAgfSBlbHNlIGlmICh0LT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gbGlzdF9yZWFkZXIoKHRfbGlzdCopIHQpOwotICB9IGVsc2UgaWYgKHQtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuIHNldF9yZWFkZXIoKHRfc2V0KikgdCk7Ci0gIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJpcHJvdCByZWFkSTMyIjsKLSAgfSBlbHNlIHsKLSAgICB0aHJvdyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcmVhZCB0aGlzOiAiICsgdHlwZV9uYW1lKHQpOwotICB9Ci19Ci0KLXZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlbmRfbWV0aG9kKHRfZnVuY3Rpb24qIGZ1bmN0aW9uKSB7Ci0gIHN0cmluZyBmdW5uYW1lID0gZnVuY3Rpb24tPmdldF9uYW1lKCk7Ci0gIHN0cmluZyBzaWduYXR1cmUgPSBmdW5jdGlvbl9zaWduYXR1cmUoZnVuY3Rpb24pOwotICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKLQotICBzdF9tZXRob2QoZl8sIGNsaWVudF9jbGFzc19uYW1lKCksICJzZW5kIiArIGNhcGl0YWxpemUoc2lnbmF0dXJlKSk7Ci0gIGZfIDw8ICJvcHJvdCB3cml0ZU1lc3NhZ2VCZWdpbjoiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotCi0gIGZfIDw8IGluZGVudCgpIDw8ICIoVENhbGxNZXNzYWdlIG5ldyIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0KLSAgZl8gPDwgaW5kZW50KCkgPDwgIm5hbWU6ICciIDw8IGZ1bm5hbWUgPDwgIic7ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJzZXFpZDogc2VsZiBuZXh0U2VxaWQpLiIgPDwgZW5kbDsKLSAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50X2Rvd24oKTsKLQotICBmXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qgd3JpdGVTdHJ1Y3RCZWdpbjogIiA8PAotICAgICIoVFN0cnVjdCBuZXcgbmFtZTogJyIgKyBjYXBpdGFsaXplKGNhbWVsY2FzZShmdW5uYW1lKSkgKyAiX2FyZ3MnKS4iIDw8IGVuZGw7Ci0KLSAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICBzdHJpbmcgZm5hbWUgPSBjYW1lbGNhc2UoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgIm9wcm90IHdyaXRlRmllbGRCZWdpbjogKFRGaWVsZCBuZXcgbmFtZTogJyIgPDwgZm5hbWUgPDwKLSAgICAgICInOyB0eXBlOiAiIDw8IHR5cGVfdG9fZW51bSgoKmZsZF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwKLSAgICAgICI7IGlkOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIikuIiA8PCBlbmRsOwotCi0gICAgZl8gPDwgaW5kZW50KCkgPDwgd3JpdGVfdmFsKCgqZmxkX2l0ZXIpLT5nZXRfdHlwZSgpLCBmbmFtZSkgPDwgIi4iIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkRW5kLiIgPDwgZW5kbDsKLSAgfQotCi0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB3cml0ZUZpZWxkU3RvcDsgd3JpdGVTdHJ1Y3RFbmQ7IHdyaXRlTWVzc2FnZUVuZC4iIDw8IGVuZGw7Ci0gIGZfIDw8IGluZGVudCgpIDw8ICJvcHJvdCB0cmFuc3BvcnQgZmx1c2giOwotCi0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLS8vIFdlIG9ubHkgc3VwcG9ydCByZWNlaXZpbmcgVFJlc3VsdCBzdHJ1Y3R1cmVzIChzbyB0aGlzIHdvbid0IHdvcmsgb24gdGhlIHNlcnZlciBzaWRlKQotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcmVjdl9tZXRob2QodF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKLSAgc3RyaW5nIGZ1bm5hbWUgPSBjYW1lbGNhc2UoZnVuY3Rpb24tPmdldF9uYW1lKCkpOwotICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKLQotICB0X3N0cnVjdCByZXN1bHQocHJvZ3JhbV8sICJUUmVzdWx0Iik7Ci0gIHRfZmllbGQgc3VjY2VzcyhmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSwgInN1Y2Nlc3MiLCAwKTsKLSAgcmVzdWx0LmFwcGVuZCgmc3VjY2Vzcyk7Ci0KLSAgdF9zdHJ1Y3QqIHhzID0gZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICAvLyBkdXBsaWNhdGUgdGhlIGZpZWxkLCBidXQgY2FsbCBpdCAiZXhjZXB0aW9uIi4uLiB3ZSBkb24ndCBuZWVkIGEgZHluYW1pYyBuYW1lCi0gICAgdF9maWVsZCAqZXhjZXB0aW9uID0gbmV3IHRfZmllbGQoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLCAiZXhjZXB0aW9uIiwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uKTsKLSAgfQotCi0gIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgInJlY3YiICsgY2FwaXRhbGl6ZShmdW5uYW1lKSk7Ci0gIGZfIDw8ICJ8IGYgbXNnIHJlcyB8ICIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJtc2cgOj0gb3Byb3QgcmVhZE1lc3NhZ2VCZWdpbi4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAic2VsZiB2YWxpZGF0ZVJlbW90ZU1lc3NhZ2U6IG1zZy4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAicmVzIDo9ICIgPDwgc3RydWN0X3JlYWRlcigmcmVzdWx0KSA8PCAiLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJvcHJvdCByZWFkTWVzc2FnZUVuZC4iIDw8IGVuZGwgPDwKLSAgICBpbmRlbnQoKSA8PCAib3Byb3QgdHJhbnNwb3J0IGZsdXNoLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJyZXMgZXhjZXB0aW9uIGlmTm90TmlsOiBbcmVzIGV4Y2VwdGlvbiBzaWduYWxdLiIgPDwgZW5kbCA8PAotICAgIGluZGVudCgpIDw8ICJeIHJlcyI7Ci0gIHN0X2Nsb3NlX21ldGhvZChmXyk7Ci19Ci0KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6ZnVuY3Rpb25fdHlwZXNfY29tbWVudCh0X2Z1bmN0aW9uKiBmbikgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwotICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBmbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIG91dCA8PCAiXCIiOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGNhbWVsY2FzZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgaWYgKChmX2l0ZXIgKyAxKSAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiLCAiOwotICAgIH0KLSAgfQotCi0gIG91dCA8PCAiXCIiOwotCi0gIHJldHVybiBvdXQuc3RyKCk7Ci19Ci0KLS8qKgotICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgZGVmaW5pdGlvbi4KLSAqCi0gKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgotICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0cmluZyBleHRlbmRzID0gIiI7Ci0gIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICJUQ2xpZW50IjsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwotICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiQ2xpZW50IjsKLSAgfQotCi0gIGZfIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChjbGllbnRfY2xhc3NfbmFtZSgpKSA8PCBlbmRsIDw8Ci0gICAgIlx0aW5zdGFuY2VWYXJpYWJsZU5hbWVzOiAnJ1xuIiA8PAotICAgICJcdGNsYXNzVmFyaWFibGVOYW1lczogJydcbiIgPDwKLSAgICAiXHRwb29sRGljdGlvbmFyaWVzOiAnJ1xuIiA8PAotICAgICJcdGNhdGVnb3J5OiAnIiA8PCBnZW5lcmF0ZWRfY2F0ZWdvcnkoKSA8PCAiJyFcblxuIjsKLQotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBmdW5uYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgc3RyaW5nIHNpZ25hdHVyZSA9IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKLQotICAgIHN0X21ldGhvZChmXywgY2xpZW50X2NsYXNzX25hbWUoKSwgc2lnbmF0dXJlKTsKLSAgICBmXyA8PCBmdW5jdGlvbl90eXBlc19jb21tZW50KCpmX2l0ZXIpIDw8IGVuZGwgPDwKLSAgICAgIGluZGVudCgpIDw8ICJzZWxmIHNlbmQiIDw8IGNhcGl0YWxpemUoc2lnbmF0dXJlKSA8PCAiLiIgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZl8gPDwgaW5kZW50KCkgPDwgIl4gc2VsZiByZWN2IiA8PCBjYXBpdGFsaXplKGZ1bm5hbWUpIDw8ICIgc3VjY2VzcyAiIDw8IGVuZGw7Ci0gICAgfQotCi0gICAgc3RfY2xvc2VfbWV0aG9kKGZfKTsKLQotICAgIGdlbmVyYXRlX3NlbmRfbWV0aG9kKCpmX2l0ZXIpOwotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgZ2VuZXJhdGVfcmVjdl9tZXRob2QoKmZfaXRlcik7Ci0gICAgfQotICB9Ci19Ci0KLS8qKgotICogUmVuZGVycyBhIGZ1bmN0aW9uIHNpZ25hdHVyZSBvZiB0aGUgZm9ybSAndHlwZSBuYW1lKGFyZ3MpJwotICoKLSAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgotICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgotICovCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgcmV0dXJuIGNhbWVsY2FzZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgY2FwaXRhbGl6ZShhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkpOwotfQotCi0vKioKLSAqIFJlbmRlcnMgYSBmaWVsZCBsaXN0Ci0gKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKLSAgICBpZiAoZmlyc3QpIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdCArPSAiICI7Ci0gICAgfQotICAgIHN0cmluZyBuYW1lID0gY2FtZWxjYXNlKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSk7Ci0gICAgcmVzdWx0ICs9IG5hbWUgKyAiOiAiICsgbmFtZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgdF9zdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7Ci0gIHN0cmluZyBwcmVmaXggPSAiIjsKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7Ci0gIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewotICAgIGlmICghdHR5cGUtPmlzX3NlcnZpY2UoKSkgewotICAgICAgcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICJfdHlwZXMuIjsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOwotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgbmFtZSA9IGNhcGl0YWxpemUodHR5cGUtPmdldF9uYW1lKCkpOwotICB9Ci0KLSAgcmV0dXJuIHByZWZpeCArIG5hbWU7Ci19Ci0KLS8qIENvbnZlcnQgdF90eXBlIHRvIFNtYWxsdGFsayB0eXBlIGNvZGUgKi8KLXN0cmluZyB0X3N0X2dlbmVyYXRvcjo6dHlwZV90b19lbnVtKHRfdHlwZSogdHlwZSkgewotICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKLQotICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgc3dpdGNoICh0YmFzZSkgewotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKLSAgICAgIHRocm93ICJOTyBUX1ZPSUQgQ09OU1RSVUNUIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAiVFR5cGUgc3RyaW5nIjsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gIlRUeXBlIGJvb2wiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICAgIHJldHVybiAiVFR5cGUgYnl0ZSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gIlRUeXBlIGkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlIGk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gIlRUeXBlIGRvdWJsZSI7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIHJldHVybiAiVFR5cGUgaTMyIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzdHJ1Y3QiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBtYXAiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZSBzZXQiOwotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewotICAgIHJldHVybiAiVFR5cGUgbGlzdCI7Ci0gIH0KLQotICB0aHJvdyAiSU5WQUxJRCBUWVBFIElOIHR5cGVfdG9fZW51bTogIiArIHR5cGUtPmdldF9uYW1lKCk7Ci19Ci0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUihzdCwgIlNtYWxsdGFsayIsICIiKQotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlYzcwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlICJ0X2dlbmVyYXRvci5oIgotI2luY2x1ZGUgInBsYXRmb3JtLmgiCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLS8qKgotICogWFNEIGdlbmVyYXRvciwgY3JlYXRlcyBhbiBYU0QgZm9yIHRoZSBiYXNlIHR5cGVzIGV0Yy4KLSAqCi0gKi8KLWNsYXNzIHRfeHNkX2dlbmVyYXRvciA6IHB1YmxpYyB0X2dlbmVyYXRvciB7Ci0gcHVibGljOgotICB0X3hzZF9nZW5lcmF0b3IoCi0gICAgICB0X3Byb2dyYW0qIHByb2dyYW0sCi0gICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkKLSAgewotICAgICh2b2lkKSBwYXJzZWRfb3B0aW9uczsKLSAgICAodm9pZCkgb3B0aW9uX3N0cmluZzsKLSAgICBvdXRfZGlyX2Jhc2VfID0gImdlbi14c2QiOwotICB9Ci0KLSAgdmlydHVhbCB+dF94c2RfZ2VuZXJhdG9yKCkge30KLQotICAvKioKLSAgICogSW5pdCBhbmQgY2xvc2UgbWV0aG9kcwotICAgKi8KLQotICB2b2lkIGluaXRfZ2VuZXJhdG9yKCk7Ci0gIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7Ci0KLSAgLyoqCi0gICAqIFByb2dyYW0tbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKLSAgICovCi0KLSAgdm9pZCBnZW5lcmF0ZV90eXBlZGVmKHRfdHlwZWRlZiogdHR5cGVkZWYpOwotICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewotICAgICh2b2lkKSB0ZW51bTsKLSAgfQotCi0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotCi0gcHJpdmF0ZToKLQotICB2b2lkIGdlbmVyYXRlX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfc3RydWN0KiBhdHRycz1OVUxMLCBib29sIG9wdGlvbmFsPWZhbHNlLCBib29sIG5pbGxhYmxlPWZhbHNlLCBib29sIGxpc3RfZWxlbWVudD1mYWxzZSk7Ci0KLSAgc3RkOjpzdHJpbmcgbnMoc3RkOjpzdHJpbmcgaW4sIHN0ZDo6c3RyaW5nIG5zKSB7Ci0gICAgcmV0dXJuIG5zICsgIjoiICsgaW47Ci0gIH0KLQotICBzdGQ6OnN0cmluZyB4c2Qoc3RkOjpzdHJpbmcgaW4pIHsKLSAgICByZXR1cm4gbnMoaW4sICJ4c2QiKTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKLSAgc3RkOjpzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSk7Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB4c2QvcGhwIGZpbGUKLSAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl94c2RfOwotICBzdGQ6Om9mc3RyZWFtIGZfcGhwXzsKLQotICAvKioKLSAgICogT3V0cHV0IHN0cmluZyBzdHJlYW0KLSAgICovCi0gIHN0ZDo6b3N0cmluZ3N0cmVhbSBzX3hzZF90eXBlc187Ci0KLX07Ci0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgewotICAvLyBNYWtlIG91dHB1dCBkaXJlY3RvcnkKLSAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKLQotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3BocF9uYW1lID0gZ2V0X291dF9kaXIoKStwcm9ncmFtXy0+Z2V0X25hbWUoKSsiX3hzZC5waHAiOwotICBmX3BocF8ub3BlbihmX3BocF9uYW1lLmNfc3RyKCkpOwotCi0gIGZfcGhwXyA8PAotICAgICI8P3BocCIgPDwgZW5kbDsKLQotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBmX3BocF8gPDwgIj8+IiA8PCBlbmRsOwotICBmX3BocF8uY2xvc2UoKTsKLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgewotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICI8eHNkOnNpbXBsZVR5cGUgbmFtZT1cIiIgPDwgdHR5cGVkZWYtPmdldF9uYW1lKCkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIGlmICh0dHlwZWRlZi0+Z2V0X3R5cGUoKS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5pc19zdHJpbmdfZW51bSgpKSB7Ci0gICAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwKLSAgICAgICI8eHNkOnJlc3RyaWN0aW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdmFsdWVzID0gKCh0X2Jhc2VfdHlwZSopdHR5cGVkZWYtPmdldF90eXBlKCkpLT5nZXRfc3RyaW5nX2VudW1fdmFscygpOwotICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWx1ZXMuYmVnaW4oKTsgdl9pdGVyICE9IHZhbHVlcy5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgICAgICI8eHNkOmVudW1lcmF0aW9uIHZhbHVlPVwiIiA8PCAoKnZfaXRlcikgPDwgIlwiIC8+IiA8PCBlbmRsOwotICAgIH0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgICAiPC94c2Q6cmVzdHJpY3Rpb24+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgICAiPHhzZDpyZXN0cmljdGlvbiBiYXNlPVwiIiA8PCB0eXBlX25hbWUodHR5cGVkZWYtPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PAotICAgICI8L3hzZDpzaW1wbGVUeXBlPiIgPDwgZW5kbCA8PCBlbmRsOwotfQotCi12b2lkIHRfeHNkX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIGJvb2wgeHNkX2FsbCA9IHRzdHJ1Y3QtPmdldF94c2RfYWxsKCk7Ci0KLSAgaW5kZW50KHNfeHNkX3R5cGVzXykgPDwgIjx4c2Q6Y29tcGxleFR5cGUgbmFtZT1cIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCI+IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaWYgKHhzZF9hbGwpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPHhzZDphbGw+IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChzX3hzZF90eXBlc18pIDw8ICI8eHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKLSAgfQotICBpbmRlbnRfdXAoKTsKLQotICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgZ2VuZXJhdGVfZWxlbWVudChzX3hzZF90eXBlc18sICgqbV9pdGVyKS0+Z2V0X25hbWUoKSwgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKm1faXRlciktPmdldF94c2RfYXR0cnMoKSwgKCptX2l0ZXIpLT5nZXRfeHNkX29wdGlvbmFsKCkgfHwgeHNkX2FsbCwgKCptX2l0ZXIpLT5nZXRfeHNkX25pbGxhYmxlKCkpOwotICB9Ci0KLSAgaW5kZW50X2Rvd24oKTsKLSAgaWYgKHhzZF9hbGwpIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6YWxsPiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc194c2RfdHlwZXNfKSA8PCAiPC94c2Q6c2VxdWVuY2U+IiA8PCBlbmRsOwotICB9Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChzX3hzZF90eXBlc18pIDw8Ci0gICAgIjwveHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbCA8PAotICAgIGVuZGw7Ci19Ci0KLXZvaWQgdF94c2RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbGVtZW50KG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiBhdHRycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3B0aW9uYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5pbGxhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsaXN0X2VsZW1lbnQpIHsKLSAgc3RyaW5nIHNtaW5PY2N1cnMgPSAob3B0aW9uYWwgfHwgbGlzdF9lbGVtZW50KSA/ICIgbWluT2NjdXJzPVwiMFwiIiA6ICIiOwotICBzdHJpbmcgc21heE9jY3VycyA9IGxpc3RfZWxlbWVudCA/ICIgbWF4T2NjdXJzPVwidW5ib3VuZGVkXCIiIDogIiI7Ci0gIHN0cmluZyBzb3B0aW9uYWwgPSBzbWluT2NjdXJzICsgc21heE9jY3VyczsKLSAgc3RyaW5nIHNuaWxsYWJsZSA9IG5pbGxhYmxlID8gIiBuaWxsYWJsZT1cInRydWVcIiIgOiAiIjsKLQotICBpZiAodHR5cGUtPmlzX3ZvaWQoKSB8fCB0dHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICI8eHNkOmVsZW1lbnQgbmFtZT1cIiIgPDwgbmFtZSA8PCAiXCIiIDw8IHNvcHRpb25hbCA8PCBzbmlsbGFibGUgPDwgIj4iIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaWYgKGF0dHJzID09IE5VTEwgJiYgdHR5cGUtPmlzX3ZvaWQoKSkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjx4c2Q6Y29tcGxleFR5cGUgLz4iIDw8IGVuZGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICI8eHNkOmNvbXBsZXhUeXBlPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6c2VxdWVuY2UgbWluT2NjdXJzPVwiMFwiIG1heE9jY3Vycz1cInVuYm91bmRlZFwiPiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgIHN0cmluZyBzdWJuYW1lOwotICAgICAgICB0X3R5cGUqIHN1YnR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7Ci0gICAgICAgIGlmIChzdWJ0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCBzdWJ0eXBlLT5pc19jb250YWluZXIoKSkgewotICAgICAgICAgIHN1Ym5hbWUgPSBuYW1lICsgIl9lbHQiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN1Ym5hbWUgPSB0eXBlX25hbWUoc3VidHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZl9waHBfIDw8ICIkR0xPQkFMU1snIiA8PCBwcm9ncmFtXy0+Z2V0X25hbWUoKSA8PCAiX3hzZF9lbHRfIiA8PCBuYW1lIDw8ICInXSA9ICciIDw8IHN1Ym5hbWUgPDwgIic7IiA8PCBlbmRsOwotICAgICAgICBnZW5lcmF0ZV9lbGVtZW50KG91dCwgc3VibmFtZSwgc3VidHlwZSwgTlVMTCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOnNlcXVlbmNlPiIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6YXR0cmlidXRlIG5hbWU9XCJsaXN0XCIgdHlwZT1cInhzZDpib29sZWFuXCIgLz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpZiAoYXR0cnMgIT0gTlVMTCkgewotICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gYXR0cnMtPmdldF9tZW1iZXJzKCk7Ci0gICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKLSAgICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmF0dHJpYnV0ZSBuYW1lPVwiIiA8PCAoKmFfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHR5cGU9XCIiIDw8IHR5cGVfbmFtZSgoKmFfaXRlciktPmdldF90eXBlKCkpIDw8ICJcIiAvPiIgPDwgZW5kbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8Ci0gICAgICAgICI8L3hzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudF9kb3duKCk7Ci0gICAgaW5kZW50KG91dCkgPDwKLSAgICAgICI8L3hzZDplbGVtZW50PiIgPDwgZW5kbDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoYXR0cnMgPT0gTlVMTCkgewotICAgICAgaW5kZW50KG91dCkgPDwKLSAgICAgICAgIjx4c2Q6ZWxlbWVudCBuYW1lPVwiIiA8PCBuYW1lIDw8ICJcIiIgPDwgIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUodHR5cGUpIDw8ICJcIiIgPDwgc29wdGlvbmFsIDw8IHNuaWxsYWJsZSA8PCAiIC8+IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBXb3csIGFsbCB0aGlzIHdvcmsgZm9yIGEgU0lNUExFIFRZUEUgd2l0aCBhdHRyaWJ1dGVzPyE/IT8hCi0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDplbGVtZW50IG5hbWU9XCIiIDw8IG5hbWUgPDwgIlwiIiA8PCBzb3B0aW9uYWwgPDwgc25pbGxhYmxlIDw8ICI+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDpjb21wbGV4VHlwZT4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8eHNkOmNvbXBsZXhDb250ZW50PiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjx4c2Q6ZXh0ZW5zaW9uIGJhc2U9XCIiIDw8IHR5cGVfbmFtZSh0dHlwZSkgPDwgIlwiPiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF91cCgpOwotICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IGF0dHJzLT5nZXRfbWVtYmVycygpOwotICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYV9pdGVyOwotICAgICAgZm9yIChhX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGFfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK2FfaXRlcikgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiPHhzZDphdHRyaWJ1dGUgbmFtZT1cIiIgPDwgKCphX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICJcIiB0eXBlPVwiIiA8PCB0eXBlX25hbWUoKCphX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiXCIgLz4iIDw8IGVuZGw7Ci0gICAgICB9Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmV4dGVuc2lvbj4iIDw8IGVuZGw7Ci0gICAgICBpbmRlbnRfZG93bigpOwotICAgICAgaW5kZW50KG91dCkgPDwgIjwveHNkOmNvbXBsZXhDb250ZW50PiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiPC94c2Q6Y29tcGxleFR5cGU+IiA8PCBlbmRsOwotICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGluZGVudChvdXQpIDw8ICI8L3hzZDplbGVtZW50PiIgPDwgZW5kbDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCB0X3hzZF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkgewotICAvLyBNYWtlIG91dHB1dCBmaWxlCi0gIHN0cmluZyBmX3hzZF9uYW1lID0gZ2V0X291dF9kaXIoKSt0c2VydmljZS0+Z2V0X25hbWUoKSsiLnhzZCI7Ci0gIGZfeHNkXy5vcGVuKGZfeHNkX25hbWUuY19zdHIoKSk7Ci0KLSAgc3RyaW5nIG5zID0gcHJvZ3JhbV8tPmdldF9uYW1lc3BhY2UoInhzZCIpOwotICBpZiAobnMuc2l6ZSgpID4gMCkgewotICAgIG5zID0gIiB0YXJnZXROYW1lc3BhY2U9XCIiICsgbnMgKyAiXCIgeG1sbnM9XCIiICsgbnMgKyAiXCIgIiArCi0gICAgICAiZWxlbWVudEZvcm1EZWZhdWx0PVwicXVhbGlmaWVkXCIiOwotICB9Ci0KLSAgLy8gUHJpbnQgdGhlIFhTRCBoZWFkZXIKLSAgZl94c2RfIDw8Ci0gICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz4iIDw8IGVuZGwgPDwKLSAgICAiPHhzZDpzY2hlbWEgeG1sbnM6eHNkPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWFcIiIgPDwgbnMgPDwgIj4iIDw8IGVuZGwgPDwKLSAgICBlbmRsIDw8Ci0gICAgIjwhLS0gWW8geW8geW8sIHRoaXMgWFNEIHdveiBiZSBnZW5lcmF0ZWQgYnkgVGhyaWZ0LiAtLT4iIDw8IGVuZGwgPDwKLSAgICBlbmRsOwotCi0gIC8vIFByaW50IG91dCB0aGUgdHlwZSBkZWZpbml0aW9ucwotICBpbmRlbnQoZl94c2RfKSA8PCBzX3hzZF90eXBlc18uc3RyKCk7Ci0KLSAgLy8gS2VlcCBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBleGNlcHRpb25zIHRoYXQgbWlnaHQgZ2V0IHRocm93bgotICBtYXA8c3RyaW5nLCB0X3N0cnVjdCo+IGFsbF94Y2VwdGlvbnM7Ci0KLSAgLy8gTGlzdCB0aGUgZWxlbWVudHMgdGhhdCB5b3UgbWlnaHQgYWN0dWFsbHkgZ2V0Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewotICAgIHN0cmluZyBlbGVtbmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSArICJfcmVzcG9uc2UiOwotICAgIHRfdHlwZSogcmV0dXJudHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICBnZW5lcmF0ZV9lbGVtZW50KGZfeHNkXywgZWxlbW5hbWUsIHJldHVybnR5cGUpOwotICAgIGZfeHNkXyA8PCBlbmRsOwotCi0gICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgIGFsbF94Y2VwdGlvbnNbKCp4X2l0ZXIpLT5nZXRfbmFtZSgpXSA9ICh0X3N0cnVjdCopKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgbWFwPHN0cmluZywgdF9zdHJ1Y3QqPjo6aXRlcmF0b3IgYXhfaXRlcjsKLSAgZm9yIChheF9pdGVyID0gYWxsX3hjZXB0aW9ucy5iZWdpbigpOyBheF9pdGVyICE9IGFsbF94Y2VwdGlvbnMuZW5kKCk7ICsrYXhfaXRlcikgewotICAgIGdlbmVyYXRlX2VsZW1lbnQoZl94c2RfLCBheF9pdGVyLT5maXJzdCwgYXhfaXRlci0+c2Vjb25kKTsKLSAgfQotCi0gIC8vIENsb3NlIHRoZSBYU0QgZG9jdW1lbnQKLSAgZl94c2RfIDw8IGVuZGwgPDwgIjwveHNkOnNjaGVtYT4iIDw8IGVuZGw7Ci0gIGZfeHNkXy5jbG9zZSgpOwotfQotCi1zdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgIHJldHVybiB0dHlwZS0+Z2V0X25hbWUoKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKLSAgICByZXR1cm4geHNkKGJhc2VfdHlwZV9uYW1lKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKSkpOwotICB9Ci0KLSAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4geHNkKCJpbnQiKTsKLSAgfQotCi0gIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQotICByZXR1cm4gImNvbnRhaW5lciI7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgWFNEIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgdGhyaWZ0IHR5cGUuCi0gKgotICogQHBhcmFtIHRiYXNlIFRoZSBiYXNlIHR5cGUKLSAqIEByZXR1cm4gRXhwbGljaXQgWFNEIHR5cGUsIGkuZS4geHNkOnN0cmluZwotICovCi1zdHJpbmcgdF94c2RfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlKSB7Ci0gIHN3aXRjaCAodGJhc2UpIHsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgIHJldHVybiAidm9pZCI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgIHJldHVybiAic3RyaW5nIjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgIHJldHVybiAiYm9vbGVhbiI7Ci0gIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQllURToKLSAgICByZXR1cm4gImJ5dGUiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKLSAgICByZXR1cm4gInNob3J0IjsKLSAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgcmV0dXJuICJpbnQiOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gImxvbmciOwotICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKLSAgICByZXR1cm4gImRlY2ltYWwiOwotICBkZWZhdWx0OgotICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gQysrIGJhc2UgdHlwZSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7Ci0gIH0KLX0KLQotVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUih4c2QsICJYU0QiLCAiIikKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxODY1Yi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL2dsb2JhbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9HTE9CQUxTX0gKLSNkZWZpbmUgVF9HTE9CQUxTX0gKLQotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxxdWV1ZT4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0vKioKLSAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2xvYmFsIHZhcmlhYmxlcyAoc2xhcCBvbiB0aGUgd3Jpc3QpIHRoYXQgYXJlCi0gKiBzaGFyZWQgdGhyb3VnaG91dCB0aGUgcHJvZ3JhbS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0byBmYWNpbGl0YXRlIHNpbXBsZQotICogaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgcGFyc2VyIGFuZCB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4gQmVmb3JlIGNhbGxpbmcKLSAqIHl5cGFyc2UoKSwgdGhlIG1haW4uY2MgcHJvZ3JhbSB3aWxsIG1ha2UgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIHRvIHRoZXNlCi0gKiBnbG9iYWwgdmFyaWFibGVzIHN1Y2ggdGhhdCB0aGUgcGFyc2VyIGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGFuZCBwdXRzIGVudHJpZXMKLSAqIGludG8gdGhlIHJpZ2h0IGNvbnRhaW5lcnMsIGV0Yy4KLSAqCi0gKi8KLQotLyoqCi0gKiBIb29yYXkgZm9yIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgdHlwZXMhCi0gKi8KLQotY2xhc3MgdF9wcm9ncmFtOwotY2xhc3MgdF9zY29wZTsKLWNsYXNzIHRfdHlwZTsKLQotLyoqCi0gKiBQYXJzaW5nIG1vZGUsIHR3byBwYXNzZXMgdXAgaW4gdGhpcyBnaW4gcnVtbXkhCi0gKi8KLQotZW51bSBQQVJTRV9NT0RFIHsKLSAgSU5DTFVERVMgPSAxLAotICBQUk9HUkFNID0gMgotfTsKLQotLyoqCi0gKiBTdHJpY3RuZXNzIGxldmVsCi0gKi8KLWV4dGVybiBpbnQgZ19zdHJpY3Q7Ci0KLS8qKgotICogVGhlIG1hc3RlciBwcm9ncmFtIHBhcnNlIHRyZWUuIFRoaXMgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlciBjb2RlCi0gKiB0byBidWlsZCB1cCB0aGUgcHJvZ3JhbSBlbGVtZW50cy4KLSAqLwotZXh0ZXJuIHRfcHJvZ3JhbSogZ19wcm9ncmFtOwotCi0vKioKLSAqIEdsb2JhbCB0eXBlcyBmb3IgdGhlIHBhcnNlciB0byBiZSBhYmxlIHRvIHJlZmVyZW5jZQotICovCi0KLWV4dGVybiB0X3R5cGUqIGdfdHlwZV92b2lkOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX3N0cmluZzsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9iaW5hcnk7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfc2xpc3Q7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfYm9vbDsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9ieXRlOwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2kxNjsKLWV4dGVybiB0X3R5cGUqIGdfdHlwZV9pMzI7Ci1leHRlcm4gdF90eXBlKiBnX3R5cGVfaTY0OwotZXh0ZXJuIHRfdHlwZSogZ190eXBlX2RvdWJsZTsKLQotLyoqCi0gKiBUaGUgc2NvcGUgdGhhdCB3ZSBhcmUgY3VycmVudGx5IHBhcnNpbmcgaW50bwotICovCi1leHRlcm4gdF9zY29wZSogZ19zY29wZTsKLQotLyoqCi0gKiBUaGUgcGFyZW50IHNjb3BlIHRvIGFsc28gbG9hZCBzeW1ib2xzIGludG8KLSAqLwotZXh0ZXJuIHRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOwotCi0vKioKLSAqIFRoZSBwcmVmaXggZm9yIHRoZSBwYXJlbnQgc2NvcGUgZW50cmllcwotICovCi1leHRlcm4gc3RkOjpzdHJpbmcgZ19wYXJlbnRfcHJlZml4OwotCi0vKioKLSAqIFRoZSBwYXJzaW5nIHBhc3MgdGhhdCB3ZSBhcmUgb24uIFdlIGRvIGRpZmZlcmVudCB0aGluZ3Mgb24gZWFjaCBwYXNzLgotICovCi1leHRlcm4gUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7Ci0KLS8qKgotICogR2xvYmFsIHRpbWUgc3RyaW5nLCB1c2VkIGluIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgZXRjLgotICovCi1leHRlcm4gY2hhciogZ190aW1lX3N0cjsKLQotLyoqCi0gKiBUaGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1leHRlcm4gY2hhciogZ19kb2N0ZXh0OwotCi0vKioKLSAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBwYXJzZWQgZG9jdGV4dCBjb21tZW50LgotICovCi1leHRlcm4gaW50IGdfZG9jdGV4dF9saW5lbm87Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCi0gKgotICogV2hlbiBhIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB1c2VyLXNwZWNpZmllZCBrZXksIHRocmlmdCBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25zIGEgbmVnYXRpdmUgdmFsdWUuICBIb3dldmVyLCB0aGlzIGlzIGZyYWdpbGUgc2luY2UgY2hhbmdlcyB0byB0aGUKLSAqIGZpbGUgbWF5IHVuaW50ZW50aW9uYWxseSBjaGFuZ2UgdGhlIGtleSBudW1iZXJpbmcsIHJlc3VsdGluZyBpbiBhIG5ldwotICogcHJvdG9jb2wgdGhhdCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCi0gKgotICogV2hlbiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGlzIGVuYWJsZWQsIHVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKLSAqIG5lZ2F0aXZlIGtleXMuICBUaGlzIHdheSB0aGV5IGNhbiB3cml0ZSBhIC50aHJpZnQgZmlsZSB3aXRoIGV4cGxpY2l0bHkKLSAqIHNwZWNpZmllZCBrZXlzIHRoYXQgaXMgc3RpbGwgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzCi0gKiB0aGF0IGRpZCBub3Qgc3BlY2lmeSBrZXkgdmFsdWVzLgotICovCi1leHRlcm4gaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KLSAqCi0gKiBTb21lIGxhbmd1YWdlcyBkb24ndCBzdXBwb3J0IDY0LWJpdCBjb25zdGFudHMsIGJ1dCBtYW55IGRvLCBzbyB3ZSBjYW4KLSAqIHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3IgcHJvamVjdHMgdGhhdCBkb24ndCB1c2UgYW55IG5vbi02NC1iaXQtc2FmZQotICogbGFuZ3VhZ2VzLgotICovCi1leHRlcm4gaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwODVhZS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiB0aHJpZnQgLSBhIGxpZ2h0d2VpZ2h0IGNyb3NzLWxhbmd1YWdlIHJwYy9zZXJpYWxpemF0aW9uIHRvb2wKLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1haW4gY29tcGlsZXIgZW5naW5lIGZvciBUaHJpZnQsIHdoaWNoIGludm9rZXMgdGhlCi0gKiBzY2FubmVyL3BhcnNlciB0byBidWlsZCB0aGUgdGhyaWZ0IG9iamVjdCB0cmVlLiBUaGUgaW50ZXJmYWNlIGdlbmVyYXRpb24KLSAqIGNvZGUgZm9yIGVhY2ggbGFuZ3VhZ2UgbGl2ZXMgaW4gYSBmaWxlIGJ5IHRoZSBsYW5ndWFnZSBuYW1lIHVuZGVyIHRoZQotICogZ2VuZXJhdGUvIGZvbGRlciwgYW5kIGFsbCBwYXJzZSBzdHJ1Y3R1cmVzIGxpdmUgaW4gcGFyc2UvCi0gKgotICovCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jaWZkZWYgTUlOR1cKLSMgaW5jbHVkZSA8d2luZG93cy5oPiAvKiBmb3IgR2V0RnVsbFBhdGhOYW1lICovCi0jZW5kaWYKLQotLy8gQ2FyZWZ1bDogbXVzdCBpbmNsdWRlIGdsb2JhbHMgZmlyc3QgZm9yIGV4dGVybiBkZWZpbml0aW9ucwotI2luY2x1ZGUgImdsb2JhbHMuaCIKLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0jaW5jbHVkZSAiZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotLyoqCi0gKiBHbG9iYWwgcHJvZ3JhbSB0cmVlCi0gKi8KLXRfcHJvZ3JhbSogZ19wcm9ncmFtOwotCi0vKioKLSAqIEdsb2JhbCB0eXBlcwotICovCi0KLXRfdHlwZSogZ190eXBlX3ZvaWQ7Ci10X3R5cGUqIGdfdHlwZV9zdHJpbmc7Ci10X3R5cGUqIGdfdHlwZV9iaW5hcnk7Ci10X3R5cGUqIGdfdHlwZV9zbGlzdDsKLXRfdHlwZSogZ190eXBlX2Jvb2w7Ci10X3R5cGUqIGdfdHlwZV9ieXRlOwotdF90eXBlKiBnX3R5cGVfaTE2OwotdF90eXBlKiBnX3R5cGVfaTMyOwotdF90eXBlKiBnX3R5cGVfaTY0OwotdF90eXBlKiBnX3R5cGVfZG91YmxlOwotCi0vKioKLSAqIEdsb2JhbCBzY29wZQotICovCi10X3Njb3BlKiBnX3Njb3BlOwotCi0vKioKLSAqIFBhcmVudCBzY29wZSB0byBhbHNvIHBhcnNlIHR5cGVzCi0gKi8KLXRfc2NvcGUqIGdfcGFyZW50X3Njb3BlOwotCi0vKioKLSAqIFByZWZpeCBmb3IgcHV0dGluZyB0eXBlcyBpbiBwYXJlbnQgc2NvcGUKLSAqLwotc3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKLQotLyoqCi0gKiBQYXJzaW5nIHBhc3MKLSAqLwotUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7Ci0KLS8qKgotICogQ3VycmVudCBkaXJlY3Rvcnkgb2YgZmlsZSBiZWluZyBwYXJzZWQKLSAqLwotc3RyaW5nIGdfY3VyZGlyOwotCi0vKioKLSAqIEN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQKLSAqLwotc3RyaW5nIGdfY3VycGF0aDsKLQotLyoqCi0gKiBTZWFyY2ggcGF0aCBmb3IgaW5jbHVzaW9ucwotICovCi12ZWN0b3I8c3RyaW5nPiBnX2luY2xfc2VhcmNocGF0aDsKLQotLyoqCi0gKiBTaG91bGQgQysrIGluY2x1ZGUgc3RhdGVtZW50cyB1c2UgcGF0aCBwcmVmaXhlcyBmb3Igb3RoZXIgdGhyaWZ0LWdlbmVyYXRlZAotICogaGVhZGVyIGZpbGVzCi0gKi8KLWJvb2wgZ19jcHBfdXNlX2luY2x1ZGVfcHJlZml4ID0gZmFsc2U7Ci0KLS8qKgotICogR2xvYmFsIGRlYnVnIHN0YXRlCi0gKi8KLWludCBnX2RlYnVnID0gMDsKLQotLyoqCi0gKiBTdHJpY3RuZXNzIGxldmVsCi0gKi8KLWludCBnX3N0cmljdCA9IDEyNzsKLQotLyoqCi0gKiBXYXJuaW5nIGxldmVsCi0gKi8KLWludCBnX3dhcm4gPSAxOwotCi0vKioKLSAqIFZlcmJvc2Ugb3V0cHV0Ci0gKi8KLWludCBnX3ZlcmJvc2UgPSAwOwotCi0vKioKLSAqIEdsb2JhbCB0aW1lIHN0cmluZwotICovCi1jaGFyKiBnX3RpbWVfc3RyOwotCi0vKioKLSAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCi0gKi8KLWNoYXIqIGdfZG9jdGV4dDsKLQotLyoqCi0gKiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KLSAqLwotaW50IGdfZG9jdGV4dF9saW5lbm87Ci0KLS8qKgotICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCi0gKi8KLWludCBnX2FsbG93X25lZ19maWVsZF9rZXlzOwotCi0vKioKLSAqIFdoZXRoZXIgb3Igbm90IDY0LWJpdCBjb25zdGFudHMgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcuCi0gKi8KLWludCBnX2FsbG93XzY0Yml0X2NvbnN0cyA9IDA7Ci0KLS8qKgotICogRmxhZ3MgdG8gY29udHJvbCBjb2RlIGdlbmVyYXRpb24KLSAqLwotYm9vbCBnZW5fY3BwID0gZmFsc2U7Ci1ib29sIGdlbl9kZW5zZSA9IGZhbHNlOwotYm9vbCBnZW5famF2YSA9IGZhbHNlOwotYm9vbCBnZW5famF2YWJlYW4gPSBmYWxzZTsKLWJvb2wgZ2VuX3JiID0gZmFsc2U7Ci1ib29sIGdlbl9weSA9IGZhbHNlOwotYm9vbCBnZW5fcHlfbmV3c3R5bGUgPSBmYWxzZTsKLWJvb2wgZ2VuX3hzZCA9IGZhbHNlOwotYm9vbCBnZW5fcGhwID0gZmFsc2U7Ci1ib29sIGdlbl9waHBpID0gZmFsc2U7Ci1ib29sIGdlbl9waHBzID0gdHJ1ZTsKLWJvb2wgZ2VuX3BocGEgPSBmYWxzZTsKLWJvb2wgZ2VuX3BocG8gPSBmYWxzZTsKLWJvb2wgZ2VuX3Jlc3QgPSBmYWxzZTsKLWJvb2wgZ2VuX3BlcmwgPSBmYWxzZTsKLWJvb2wgZ2VuX2VybCA9IGZhbHNlOwotYm9vbCBnZW5fb2NhbWwgPSBmYWxzZTsKLWJvb2wgZ2VuX2hzID0gZmFsc2U7Ci1ib29sIGdlbl9jb2NvYSA9IGZhbHNlOwotYm9vbCBnZW5fY3NoYXJwID0gZmFsc2U7Ci1ib29sIGdlbl9kZWxwaGkgPSBmYWxzZTsKLWJvb2wgZ2VuX3N0ID0gZmFsc2U7Ci1ib29sIGdlbl9yZWN1cnNlID0gZmFsc2U7Ci0KLS8qKgotICogTWluR1cgZG9lc24ndCBoYXZlIHJlYWxwYXRoLCBzbyB1c2UgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gdGhhdCBjYXNlLAotICogb3RoZXJ3aXNlIHRoaXMganVzdCBjYWxscyB0aHJvdWdoIHRvIHJlYWxwYXRoCi0gKi8KLWNoYXIgKnNhZmVyZWFscGF0aChjb25zdCBjaGFyICpwYXRoLCBjaGFyICpyZXNvbHZlZF9wYXRoKSB7Ci0jaWZkZWYgTUlOR1cKLSAgY2hhciBidWZbTUFYX1BBVEhdOwotICBjaGFyKiBiYXNlbmFtZTsKLSAgRFdPUkQgbGVuID0gR2V0RnVsbFBhdGhOYW1lKHBhdGgsIE1BWF9QQVRILCBidWYsICZiYXNlbmFtZSk7Ci0gIGlmIChsZW4gPT0gMCB8fCBsZW4gPiBNQVhfUEFUSCAtIDEpewotICAgIHN0cmNweShyZXNvbHZlZF9wYXRoLCBwYXRoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgYnVmKTsKLSAgfQotCi0gIC8vIFJlcGxhY2UgYmFja3NsYXNoZXMgd2l0aCBmb3J3YXJkIHNsYXNoZXMgc28gdGhlCi0gIC8vIHJlc3Qgb2YgdGhlIGNvZGUgYmVoYXZlcyBjb3JyZWN0bHkuCi0gIHNpemVfdCByZXNvbHZlZF9sZW4gPSBzdHJsZW4ocmVzb2x2ZWRfcGF0aCk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZWRfbGVuOyBpKyspIHsKLSAgICBpZiAocmVzb2x2ZWRfcGF0aFtpXSA9PSAnXFwnKSB7Ci0gICAgICByZXNvbHZlZF9wYXRoW2ldID0gJy8nOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzb2x2ZWRfcGF0aDsKLSNlbHNlCi0gIHJldHVybiByZWFscGF0aChwYXRoLCByZXNvbHZlZF9wYXRoKTsKLSNlbmRpZgotfQotCi1ib29sIGNoZWNrX2lzX2RpcmVjdG9yeShjb25zdCBjaGFyICpkaXJfbmFtZSkgewotI2lmZGVmIE1JTkdXCi0gIERXT1JEIGF0dHJpYnV0ZXMgPSA6OkdldEZpbGVBdHRyaWJ1dGVzQShkaXJfbmFtZSk7Ci0gIGlmKGF0dHJpYnV0ZXMgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6IEdldExhc3RFcnJvcigpID0gJWxkXG4iLCBkaXJfbmFtZSwgR2V0TGFzdEVycm9yKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZigoYXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgIT0gRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgc3RydWN0IHN0YXQgc2I7Ci0gIGlmIChzdGF0KGRpcl9uYW1lLCAmc2IpIDwgMCkgewotICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBpcyB1bnVzYWJsZTogJXNcbiIsIGRpcl9uYW1lLCBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoISBTX0lTRElSKHNiLnN0X21vZGUpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotI2VuZGlmCi19Ci0KLS8qKgotICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSB1c2VyLiBUaGlzIGlzIGNhbGxlZCB5eWVycm9yIGZvciBoaXN0b3JpY2FsCi0gKiByZWFzb25zIChsZXggYW5kIHlhY2MgZXhwZWN0IHRoZSBlcnJvciByZXBvcnRpbmcgcm91dGluZSB0byBiZSBjYWxsZWQKLSAqIHRoaXMpLiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IGFueSBlcnJvcnMgdG8gdGhlIHVzZXIuCi0gKiB5eWVycm9yIHRha2VzIHByaW50ZiBzdHlsZSBhcmd1bWVudHMuCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgIltFUlJPUjolczolZF0gKGxhc3QgdG9rZW4gd2FzICclcycpXG4iLAotICAgICAgICAgIGdfY3VycGF0aC5jX3N0cigpLAotICAgICAgICAgIHl5bGluZW5vLAotICAgICAgICAgIHl5dGV4dCk7Ci0KLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIGRlYnVnIG1lc3NhZ2UgZnJvbSB0aGUgcGFyc2VyLgotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX2RlYnVnID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdmFfbGlzdCBhcmdzOwotICBwcmludGYoIltQQVJTRTolZF0gIiwgeXlsaW5lbm8pOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB2cHJpbnRmKGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgcHJpbnRmKCJcbiIpOwotfQotCi0vKioKLSAqIFByaW50cyBhIHZlcmJvc2Ugb3V0cHV0IG1vZGUgbWVzc2FnZQotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdnByaW50ZihmbXQsIGFyZ3MpOwotICB2YV9lbmQoYXJncyk7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgd2FybmluZyBtZXNzYWdlCi0gKgotICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKLSAqLwotdm9pZCBwd2FybmluZyhpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7Ci0gIGlmIChnX3dhcm4gPCBsZXZlbCkgewotICAgIHJldHVybjsKLSAgfQotICB2YV9saXN0IGFyZ3M7Ci0gIHByaW50ZigiW1dBUk5JTkc6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZwcmludGYoZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci19Ci0KLS8qKgotICogUHJpbnRzIGEgZmFpbHVyZSBtZXNzYWdlIGFuZCBleGl0cwotICoKLSAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCi0gKi8KLXZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICB2YV9saXN0IGFyZ3M7Ci0gIGZwcmludGYoc3RkZXJyLCAiW0ZBSUxVUkU6JXM6JWRdICIsIGdfY3VycGF0aC5jX3N0cigpLCB5eWxpbmVubyk7Ci0gIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotICBwcmludGYoIlxuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogQ29udmVydHMgYSBzdHJpbmcgZmlsZW5hbWUgaW50byBhIHRocmlmdCBwcm9ncmFtIG5hbWUKLSAqLwotc3RyaW5nIHByb2dyYW1fbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICBpZiAoc2xhc2ggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoc2xhc2grMSk7Ci0gIH0KLSAgc3RyaW5nOjpzaXplX3R5cGUgZG90ID0gZmlsZW5hbWUucmZpbmQoIi4iKTsKLSAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBkb3QpOwotICB9Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCi0gKi8KLXN0cmluZyBkaXJlY3RvcnlfbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOwotICAvLyBObyBzbGFzaCwganVzdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci0gIGlmIChzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICByZXR1cm4gIi4iOwotICB9Ci0gIHJldHVybiBmaWxlbmFtZS5zdWJzdHIoMCwgc2xhc2gpOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIHBhdGggZm9yIHRoZSBnaXZlbiBmaWxlbmFtZQotICovCi1zdHJpbmcgaW5jbHVkZV9maWxlKHN0cmluZyBmaWxlbmFtZSkgewotICAvLyBBYnNvbHV0ZSBwYXRoPyBKdXN0IHRyeSB0aGF0Ci0gIGlmIChmaWxlbmFtZVswXSA9PSAnLycpIHsKLSAgICAvLyBSZWFscGF0aCEKLSAgICBjaGFyIHJwW1BBVEhfTUFYXTsKLSAgICBpZiAoc2FmZXJlYWxwYXRoKGZpbGVuYW1lLmNfc3RyKCksIHJwKSA9PSBOVUxMKSB7Ci0gICAgICBwd2FybmluZygwLCAiQ2Fubm90IG9wZW4gaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBzdGQ6OnN0cmluZygpOwotICAgIH0KLQotICAgIC8vIFN0YXQgdGhpcyBmaWxlCi0gICAgc3RydWN0IHN0YXQgZmluZm87Ci0gICAgaWYgKHN0YXQocnAsICZmaW5mbykgPT0gMCkgewotICAgICAgcmV0dXJuIHJwOwotICAgIH0KLSAgfSBlbHNlIHsgLy8gcmVsYXRpdmUgcGF0aCwgc3RhcnQgc2VhcmNoaW5nCi0gICAgLy8gbmV3IHNlYXJjaCBwYXRoIHdpdGggY3VycmVudCBkaXIgZ2xvYmFsCi0gICAgdmVjdG9yPHN0cmluZz4gc3AgPSBnX2luY2xfc2VhcmNocGF0aDsKLSAgICBzcC5pbnNlcnQoc3AuYmVnaW4oKSwgZ19jdXJkaXIpOwotCi0gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzCi0gICAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBzcC5iZWdpbigpOyBpdCAhPSBzcC5lbmQoKTsgaXQrKykgewotICAgICAgc3RyaW5nIHNmaWxlbmFtZSA9ICooaXQpICsgIi8iICsgZmlsZW5hbWU7Ci0KLSAgICAgIC8vIFJlYWxwYXRoIQotICAgICAgY2hhciBycFtQQVRIX01BWF07Ci0gICAgICBpZiAoc2FmZXJlYWxwYXRoKHNmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLy8gU3RhdCB0aGlzIGZpbGVzCi0gICAgICBzdHJ1Y3Qgc3RhdCBmaW5mbzsKLSAgICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJwOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFVoIG9oCi0gIHB3YXJuaW5nKDAsICJDb3VsZCBub3QgZmluZCBpbmNsdWRlIGZpbGUgJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOwotICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKLX0KLQotLyoqCi0gKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgotICogQWxzbyBwcmludHMgYSB3YXJuaW5nIGlmIHdlIGFyZSBkaXNjYXJkaW5nIGluZm9ybWF0aW9uLgotICovCi12b2lkIGNsZWFyX2RvY3RleHQoKSB7Ci0gIGlmIChnX2RvY3RleHQgIT0gTlVMTCkgewotICAgIHB3YXJuaW5nKDIsICJVbmNhcHR1cmVkIGRvY3RleHQgYXQgb24gbGluZSAlZC4iLCBnX2RvY3RleHRfbGluZW5vKTsKLSAgfQotICBmcmVlKGdfZG9jdGV4dCk7Ci0gIGdfZG9jdGV4dCA9IE5VTEw7Ci19Ci0KLS8qKgotICogQ2xlYW5zIHVwIHRleHQgY29tbW9ubHkgZm91bmQgaW4gZG94eWdlbi1saWtlIGNvbW1lbnRzCi0gKgotICogV2FybmluZzogaWYgeW91IG1peCB0YWJzIGFuZCBzcGFjZXMgaW4gYSBub24tdW5pZm9ybSB3YXksCi0gKiB5b3Ugd2lsbCBnZXQgd2hhdCB5b3UgZGVzZXJ2ZS4KLSAqLwotY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KSB7Ci0gIC8vIENvbnZlcnQgdG8gQysrIHN0cmluZywgYW5kIHJlbW92ZSBXaW5kb3dzJ3MgY2FycmlhZ2UgcmV0dXJucy4KLSAgc3RyaW5nIGRvY3N0cmluZyA9IGRvY3RleHQ7Ci0gIGRvY3N0cmluZy5lcmFzZSgKLSAgICAgIHJlbW92ZShkb2NzdHJpbmcuYmVnaW4oKSwgZG9jc3RyaW5nLmVuZCgpLCAnXHInKSwKLSAgICAgIGRvY3N0cmluZy5lbmQoKSk7Ci0KLSAgLy8gU2VwYXJhdGUgaW50byBsaW5lcy4KLSAgdmVjdG9yPHN0cmluZz4gbGluZXM7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHN0cmluZzo6bnBvczsKLSAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdDsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBsYXN0ID0gKHBvcyA9PSBzdHJpbmc6Om5wb3MpID8gMCA6IHBvcysxOwotICAgIHBvcyA9IGRvY3N0cmluZy5maW5kKCdcbicsIGxhc3QpOwotICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBGaXJzdCBiaXQgb2YgY2xlYW5pbmcuICBJZiB0aGUgbGFzdCBsaW5lIGlzIG9ubHkgd2hpdGVzcGFjZSwgZHJvcCBpdC4KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIG5vbndoaXRlID0gZG9jc3RyaW5nLmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBsYXN0KTsKLSAgICAgIGlmIChub253aGl0ZSAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgbGluZXMucHVzaF9iYWNrKGRvY3N0cmluZy5zdWJzdHIobGFzdCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QsIHBvcy1sYXN0KSk7Ci0gIH0KLQotICAvLyBBIHZlcnkgcHJvZm91bmQgZG9jc3RyaW5nLgotICBpZiAobGluZXMuZW1wdHkoKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gQ2xlYXIgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpcnN0IGxpbmUuCi0gIHBvcyA9IGxpbmVzLmZyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOwotICBsaW5lcy5mcm9udCgpLmVyYXNlKDAsIHBvcyk7Ci0KLSAgLy8gSWYgZXZlcnkgbm9uYmxhbmsgbGluZSBhZnRlciB0aGUgZmlyc3QgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzcGFjZXMvdGFicywKLSAgLy8gdGhlbiBhIHN0YXIsIHJlbW92ZSB0aGVtLgotICBib29sIGhhdmVfcHJlZml4ID0gdHJ1ZTsKLSAgYm9vbCBmb3VuZF9wcmVmaXggPSBmYWxzZTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgcHJlZml4X2xlbiA9IDA7Ci0gIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBsX2l0ZXI7Ci0gIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgaWYgKGxfaXRlci0+ZW1wdHkoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKCFmb3VuZF9wcmVmaXgpIHsKLSAgICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGlmIChsX2l0ZXItPmF0KHBvcykgPT0gJyonKSB7Ci0gICAgICAgICAgZm91bmRfcHJlZml4ID0gdHJ1ZTsKLSAgICAgICAgICBwcmVmaXhfbGVuID0gcG9zOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGhhdmVfcHJlZml4ID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdoaXRlc3BhY2Utb25seSBsaW5lLiAgVHJ1bmNhdGUgaXQuCi0gICAgICAgIGxfaXRlci0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGxfaXRlci0+c2l6ZSgpID4gcG9zCi0gICAgICAgICYmIGxfaXRlci0+YXQocG9zKSA9PSAnKicKLSAgICAgICAgJiYgcG9zID09IHByZWZpeF9sZW4pIHsKLSAgICAgIC8vIEJ1c2luZXNzIGFzIHVzdWFsLgotICAgIH0gZWxzZSBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBMZXQncyB0cnVuY2F0ZSBpdCBmb3IgdGhlbS4KLSAgICAgIGxfaXRlci0+Y2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhlIHBhdHRlcm4gaGFzIGJlZW4gYnJva2VuLgotICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGlmIChoYXZlX3ByZWZpeCkgewotICAgIC8vIEdldCB0aGUgc3RhciB0b28uCi0gICAgcHJlZml4X2xlbisrOwotICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOwotICAgIH0KLSAgfQotCi0gIC8vIE5vdyBkZWxldGUgdGhlIG1pbmltdW0gYW1vdW50IG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZS4KLSAgcHJlZml4X2xlbiA9IHN0cmluZzo6bnBvczsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpKzE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKLSAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MKLSAgICAgICAgJiYgKHByZWZpeF9sZW4gPT0gc3RyaW5nOjpucG9zIHx8IHBvcyA8IHByZWZpeF9sZW4pKSB7Ci0gICAgICBwcmVmaXhfbGVuID0gcG9zOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCi0gIGlmIChwcmVmaXhfbGVuICE9IHN0cmluZzo6bnBvcykgewotICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSsxOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKDAsIHByZWZpeF9sZW4pOwotICAgIH0KLSAgfQotCi0gIC8vIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZS4KLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgcG9zID0gbF9pdGVyLT5maW5kX2xhc3Rfbm90X29mKCIgXHQiKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcyAmJiBwb3MgIT0gbF9pdGVyLT5sZW5ndGgoKS0xKSB7Ci0gICAgICBsX2l0ZXItPmVyYXNlKHBvcysxKTsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSwgcmVtb3ZlIGl0LgotICAvLyBEb24ndCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZSBhIGxvdCBvZiBzdGVwcyBza2lwIHRoZSBmaXJzdCBsaW5lLgotICBpZiAobGluZXMuZnJvbnQoKS5lbXB0eSgpKSB7Ci0gICAgbGluZXMuZXJhc2UobGluZXMuYmVnaW4oKSk7Ci0gIH0KLQotICAvLyBOb3cgcmVqb2luIHRoZSBsaW5lcyBhbmQgY29weSB0aGVtIGJhY2sgaW50byBkb2N0ZXh0LgotICBkb2NzdHJpbmcuY2xlYXIoKTsKLSAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7Ci0gICAgZG9jc3RyaW5nICs9ICpsX2l0ZXI7Ci0gICAgZG9jc3RyaW5nICs9ICdcbic7Ci0gIH0KLQotICBhc3NlcnQoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSk7Ci0gIHN0cmNweShkb2N0ZXh0LCBkb2NzdHJpbmcuY19zdHIoKSk7Ci0gIHJldHVybiBkb2N0ZXh0OwotfQotCi0vKiogU2V0IHRvIHRydWUgdG8gZGVidWcgZG9jc3RyaW5nIHBhcnNpbmcgKi8KLXN0YXRpYyBib29sIGR1bXBfZG9jcyA9IGZhbHNlOwotCi0vKioKLSAqIER1bXBzIGRvY3N0cmluZ3MgdG8gc3Rkb3V0Ci0gKiBPbmx5IHdvcmtzIGZvciB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYW5kIHRoZSB3aG9sZSBwcm9ncmFtIGRvYwotICogKGkuZS4sIG5vdCBlbnVtIGNvbnN0YW50cywgc3RydWN0IGZpZWxkcywgb3IgZnVuY3Rpb25zLgotICovCi12b2lkIGR1bXBfZG9jc3RyaW5ncyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgc3RyaW5nIHByb2dkb2MgPSBwcm9ncmFtLT5nZXRfZG9jKCk7Ci0gIGlmICghcHJvZ2RvYy5lbXB0eSgpKSB7Ci0gICAgcHJpbnRmKCJXaG9sZSBwcm9ncmFtIGRvYzpcbiVzXG4iLCBwcm9nZG9jLmNfc3RyKCkpOwotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3R5cGVkZWYqPiYgdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKLSAgdmVjdG9yPHRfdHlwZWRlZio+Ojpjb25zdF9pdGVyYXRvciB0X2l0ZXI7Ci0gIGZvciAodF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RfaXRlcikgewotICAgIHRfdHlwZWRlZiogdGQgPSAqdF9pdGVyOwotICAgIGlmICh0ZC0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInR5cGVkZWYgJXM6XG4lc1xuIiwgdGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdGQtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOwotICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKLSAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7Ci0gICAgdF9lbnVtKiBlbiA9ICplX2l0ZXI7Ci0gICAgaWYgKGVuLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigiZW51bSAlczpcbiVzXG4iLCBlbi0+Z2V0X25hbWUoKS5jX3N0cigpLCBlbi0+Z2V0X2RvYygpLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBjb25zdCB2ZWN0b3I8dF9jb25zdCo+JiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7Ci0gIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICB0X2NvbnN0KiBjbyA9ICpjX2l0ZXI7Ci0gICAgaWYgKGNvLT5oYXNfZG9jKCkpIHsKLSAgICAgIHByaW50ZigiY29uc3QgJXM6XG4lc1xuIiwgY28tPmdldF9uYW1lKCkuY19zdHIoKSwgY28tPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKLSAgICBpZiAoc3QtPmhhc19kb2MoKSkgewotICAgICAgcHJpbnRmKCJzdHJ1Y3QgJXM6XG4lc1xuIiwgc3QtPmdldF9uYW1lKCkuY19zdHIoKSwgc3QtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKLSAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICB0X3N0cnVjdCogeG4gPSAqeF9pdGVyOwotICAgIGlmICh4bi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInhjZXB0aW9uICVzOlxuJXNcbiIsIHhuLT5nZXRfbmFtZSgpLmNfc3RyKCksIHhuLT5nZXRfZG9jKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgewotICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOwotICAgIGlmIChzdi0+aGFzX2RvYygpKSB7Ci0gICAgICBwcmludGYoInNlcnZpY2UgJXM6XG4lc1xuIiwgc3YtPmdldF9uYW1lKCkuY19zdHIoKSwgc3YtPmdldF9kb2MoKS5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLX0KLQotLyoqCi0gKiBDYWxsIGdlbmVyYXRlX2ZpbmdlcnByaW50IGZvciBldmVyeSBzdHJ1Y3R1cmUgYW5kIGVudW0uCi0gKi8KLXZvaWQgZ2VuZXJhdGVfYWxsX2ZpbmdlcnByaW50cyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKLSAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOwotICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwotICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKLSAgICBzdC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X3N0cnVjdCo+JiB4Y2VwdGlvbnMgPSBwcm9ncmFtLT5nZXRfeGNlcHRpb25zKCk7Ci0gIHZlY3Rvcjx0X3N0cnVjdCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7Ci0gIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgdF9zdHJ1Y3QqIHN0ID0gKnhfaXRlcjsKLSAgICBzdC0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gIGNvbnN0IHZlY3Rvcjx0X2VudW0qPiYgZW51bXMgPSBwcm9ncmFtLT5nZXRfZW51bXMoKTsKLSAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7Ci0gIGZvciAoZV9pdGVyID0gZW51bXMuYmVnaW4oKTsgZV9pdGVyICE9IGVudW1zLmVuZCgpOyArK2VfaXRlcikgewotICAgIHRfZW51bSogZSA9ICplX2l0ZXI7Ci0gICAgZS0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gIGdfdHlwZV92b2lkLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotCi0gIC8vIElmIHlvdSB3YW50IHRvIGdlbmVyYXRlIGZpbmdlcnByaW50cyBmb3IgaW1wbGljaXQgc3RydWN0dXJlcywgc3RhcnQgaGVyZS4KLSAgLyoKLSAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+JiBzZXJ2aWNlcyA9IHByb2dyYW0tPmdldF9zZXJ2aWNlcygpOwotICB2ZWN0b3I8dF9zZXJ2aWNlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgZm9yICh2X2l0ZXIgPSBzZXJ2aWNlcy5iZWdpbigpOyB2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgdF9zZXJ2aWNlKiBzdiA9ICp2X2l0ZXI7Ci0gIH0KLSAgKi8KLX0KLQotLyoqCi0gKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCi0gKi8KLXZvaWQgdmVyc2lvbigpIHsKLSAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOwotfQotCi0vKioKLSAqIERpc3BsYXkgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUuCi0gKi8KLXZvaWQgdXNhZ2UoKSB7Ci0gIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJVc2UgdGhyaWZ0IC1oZWxwIGZvciBhIGxpc3Qgb2Ygb3B0aW9uc1xuIik7Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogRGlwbGF5cyB0aGUgaGVscCBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KLSAqLwotdm9pZCBoZWxwKCkgewotICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dCBkaXIgICAgU2V0IHRoZSBvdXB1dCBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCIgICAgICAgICAgICAgICAobm8gZ2VuLSogZm9sZGVyIHdpbGwgYmUgY3JlYXRlZClcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgZGlyICAgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtbm93YXJuICAgICBTdXBwcmVzcyBhbGwgY29tcGlsZXIgd2FybmluZ3MgKEJBRCEpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC1zdHJpY3QgICAgIFN0cmljdCBjb21waWxlciB3YXJuaW5ncyBvblxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtdltlcmJvc2VdICBWZXJib3NlIG1vZGVcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLXJbZWN1cnNlXSAgQWxzbyBnZW5lcmF0ZSBpbmNsdWRlZCBmaWxlc1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtZGVidWcgICAgICBQYXJzZSBkZWJ1ZyB0cmFjZSB0byBzdGRvdXRcbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgLS1hbGxvdy1uZWcta2V5cyAgQWxsb3cgbmVnYXRpdmUgZmllbGQga2V5cyAoVXNlZCB0byAiCi0gICAgICAgICAgInByZXNlcnZlIHByb3RvY29sXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMpXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgIC0tYWxsb3ctNjRiaXQtY29uc3RzICBEbyBub3QgcHJpbnQgd2FybmluZ3MgYWJvdXQgdXNpbmcgNjQtYml0IGNvbnN0YW50c1xuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTIsW2tleTM9dmFsM11dXS5cbiIpOwotICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7Ci0gIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgZnByaW50ZihzdGRlcnIsICJBdmFpbGFibGUgZ2VuZXJhdG9ycyAoYW5kIG9wdGlvbnMpOlxuIik7Ci0KLSAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBnZW5fbWFwID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7Ci0gIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGdlbl9tYXAuYmVnaW4oKTsgaXRlciAhPSBnZW5fbWFwLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgJXMgKCVzKTpcbiIsCi0gICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAotICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9sb25nX25hbWUoKS5jX3N0cigpKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgaXRlci0+c2Vjb25kLT5nZXRfZG9jdW1lbnRhdGlvbigpLmNfc3RyKCkpOwotICB9Ci0gIGV4aXQoMSk7Ci19Ci0KLS8qKgotICogWW91IGtub3csIHdoZW4gSSBzdGFydGVkIHdvcmtpbmcgb24gVGhyaWZ0IEkgcmVhbGx5IHRob3VnaHQgaXQgd2Fzbid0IGdvaW5nCi0gKiB0byBiZWNvbWUgYSBwcm9ncmFtbWluZyBsYW5ndWFnZSBiZWNhdXNlIGl0IHdhcyBqdXN0IGEgZ2VuZXJhdG9yIGFuZCBpdAotICogd291bGRuJ3QgbmVlZCBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gYW5kIGFsbCB0aGF0IGphenouIEJ1dCB0aGVuIHdlCi0gKiBkZWNpZGVkIHRvIGFkZCBjb25zdGFudHMsIGFuZCBhbGwgb2YgYSBzdWRkZW4gdGhhdCBtZWFucyBydW50aW1lIHR5cGUKLSAqIHZhbGlkYXRpb24gYW5kIGluZmVyZW5jZSwgZXhjZXB0IHRoZSAicnVudGltZSIgaXMgdGhlIGNvZGUgZ2VuZXJhdG9yCi0gKiBydW50aW1lLgotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3JlYyhzdGQ6OnN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gIGlmICh0eXBlLT5pc192b2lkKCkpIHsKLSAgICB0aHJvdyAidHlwZSBlcnJvcjogY2Fubm90IGRlY2xhcmUgYSB2b2lkIGNvbnN0OiAiICsgbmFtZTsKLSAgfQotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJpbmciOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJvb2wiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGJ5dGUiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTE2IjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGkzMiI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpNjQiOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUiAmJgotICAgICAgICAgIHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRSkgewotICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZG91YmxlIjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKSArIG5hbWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSKSB7Ci0gICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgZW51bSI7Ci0gICAgfQotCi0gICAgLy8gc2VlIGlmIHRoZXJlJ3MgYSBkb3QgaW4gdGhlIGlkZW50aWZpZXIKLSAgICBzdGQ6OnN0cmluZyBuYW1lX3BvcnRpb24gPSB2YWx1ZS0+Z2V0X2lkZW50aWZpZXJfbmFtZSgpOwotCi0gICAgY29uc3QgdmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9ICgodF9lbnVtKil0eXBlKS0+Z2V0X2NvbnN0YW50cygpOwotICAgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lX3BvcnRpb24pIHsKLSAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0ICIgKyBuYW1lICsgIiB3YXMgZGVjbGFyZWQgYXMgdHlwZSAiIAotICAgICAgICArIHR5cGUtPmdldF9uYW1lKCkgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiIAotICAgICAgICArIHZhbHVlLT5nZXRfaWRlbnRpZmllcigpICsgIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtIjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVApIHsKLSAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBzdHJ1Y3QveGNlcHRpb24iOwotICAgIH0KLSAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0KLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICBpZiAodl9pdGVyLT5maXJzdC0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9TVFJJTkcpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyBuYW1lICsgIiBzdHJ1Y3Qga2V5IG11c3QgYmUgc3RyaW5nIjsKLSAgICAgIH0KLSAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0gICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpID09IHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKSkgewotICAgICAgICAgIGZpZWxkX3R5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiLiIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCksIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKLSAgICB0X3R5cGUqIGtfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKLSAgICB0X3R5cGUqIHZfdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8a2V5PiIsIGtfdHlwZSwgdl9pdGVyLT5maXJzdCk7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8dmFsPiIsIHZfdHlwZSwgdl9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKLSAgICB0X3R5cGUqIGVfdHlwZTsKLSAgICBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgICBlX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgZV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKLSAgICB9Ci0gICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICB2YWxpZGF0ZV9jb25zdF9yZWMobmFtZSArICI8ZWxlbT4iLCBlX3R5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgfQotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQotICovCi12b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOwotfQotCi0vKioKLSAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgotICovCi12b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgewotICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Ci19Ci0KLS8qKgotICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgotICovCi1ib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7Ci0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGlmICghdF9nZW5lcmF0b3I6OmdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBQYXJzZXMgYSBwcm9ncmFtCi0gKi8KLXZvaWQgcGFyc2UodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3Byb2dyYW0qIHBhcmVudF9wcm9ncmFtKSB7Ci0gIC8vIEdldCBzY29wZSBmaWxlIHBhdGgKLSAgc3RyaW5nIHBhdGggPSBwcm9ncmFtLT5nZXRfcGF0aCgpOwotCi0gIC8vIFNldCBjdXJyZW50IGRpciBnbG9iYWwsIHdoaWNoIGlzIHVzZWQgaW4gdGhlIGluY2x1ZGVfZmlsZSBmdW5jdGlvbgotICBnX2N1cmRpciA9IGRpcmVjdG9yeV9uYW1lKHBhdGgpOwotICBnX2N1cnBhdGggPSBwYXRoOwotCi0gIC8vIE9wZW4gdGhlIGZpbGUKLSAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkgewotICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7Ci0gIH0KLQotICAvLyBDcmVhdGUgbmV3IHNjb3BlIGFuZCBzY2FuIGZvciBpbmNsdWRlcwotICBwdmVyYm9zZSgiU2Nhbm5pbmcgJXMgZm9yIGluY2x1ZGVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICBnX3BhcnNlX21vZGUgPSBJTkNMVURFUzsKLSAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKLSAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7Ci0gIHRyeSB7Ci0gICAgeXlsaW5lbm8gPSAxOwotICAgIGlmICh5eXBhcnNlKCkgIT0gMCkgewotICAgICAgZmFpbHVyZSgiUGFyc2VyIGVycm9yIGR1cmluZyBpbmNsdWRlIHBhc3MuIik7Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgeCkgewotICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKLSAgfQotICBmY2xvc2UoeXlpbik7Ci0KLSAgLy8gUmVjdXJzaXZlbHkgcGFyc2UgYWxsIHRoZSBpbmNsdWRlIHByb2dyYW1zCi0gIHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtLT5nZXRfaW5jbHVkZXMoKTsKLSAgdmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBpbmNsdWRlcy5iZWdpbigpOyBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBwYXJzZSgqaXRlciwgcHJvZ3JhbSk7Ci0gIH0KLQotICAvLyBQYXJzZSB0aGUgcHJvZ3JhbSBmaWxlCi0gIGdfcGFyc2VfbW9kZSA9IFBST0dSQU07Ci0gIGdfcHJvZ3JhbSA9IHByb2dyYW07Ci0gIGdfc2NvcGUgPSBwcm9ncmFtLT5zY29wZSgpOwotICBnX3BhcmVudF9zY29wZSA9IChwYXJlbnRfcHJvZ3JhbSAhPSBOVUxMKSA/IHBhcmVudF9wcm9ncmFtLT5zY29wZSgpIDogTlVMTDsKLSAgZ19wYXJlbnRfcHJlZml4ID0gcHJvZ3JhbS0+Z2V0X25hbWUoKSArICIuIjsKLSAgZ19jdXJwYXRoID0gcGF0aDsKLSAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkgewotICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7Ci0gIH0KLSAgcHZlcmJvc2UoIlBhcnNpbmcgJXMgZm9yIHR5cGVzXG4iLCBwYXRoLmNfc3RyKCkpOwotICB5eWxpbmVubyA9IDE7Ci0gIHRyeSB7Ci0gICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7Ci0gICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIHR5cGVzIHBhc3MuIik7Ci0gICAgfQotICB9IGNhdGNoIChzdHJpbmcgeCkgewotICAgIGZhaWx1cmUoeC5jX3N0cigpKTsKLSAgfQotICBmY2xvc2UoeXlpbik7Ci19Ci0KLS8qKgotICogR2VuZXJhdGUgY29kZQotICovCi12b2lkIGdlbmVyYXRlKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgdmVjdG9yPHN0cmluZz4mIGdlbmVyYXRvcl9zdHJpbmdzKSB7Ci0gIC8vIE9vb29oaCwgcmVjdXJzaXZlIGNvZGUgZ2VuZXJhdGlvbiwgaG90ISEKLSAgaWYgKGdlbl9yZWN1cnNlKSB7Ci0gICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIC8vIFByb3BvZ2F0ZSBvdXRwdXQgcGF0aCBmcm9tIHBhcmVudCB0byBjaGlsZCBwcm9ncmFtcwotICAgICAgaW5jbHVkZXNbaV0tPnNldF9vdXRfcGF0aChwcm9ncmFtLT5nZXRfb3V0X3BhdGgoKSwgcHJvZ3JhbS0+aXNfb3V0X3BhdGhfYWJzb2x1dGUoKSk7Ci0KLSAgICAgIGdlbmVyYXRlKGluY2x1ZGVzW2ldLCBnZW5lcmF0b3Jfc3RyaW5ncyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY29kZSEKLSAgdHJ5IHsKLSAgICBwdmVyYm9zZSgiUHJvZ3JhbTogJXNcbiIsIHByb2dyYW0tPmdldF9wYXRoKCkuY19zdHIoKSk7Ci0KLSAgICAvLyBDb21wdXRlIGZpbmdlcnByaW50cy4KLSAgICBnZW5lcmF0ZV9hbGxfZmluZ2VycHJpbnRzKHByb2dyYW0pOwotCi0gICAgaWYgKGR1bXBfZG9jcykgewotICAgICAgZHVtcF9kb2NzdHJpbmdzKHByb2dyYW0pOwotICAgIH0KLQotICAgIHZlY3RvcjxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGZvciAoaXRlciA9IGdlbmVyYXRvcl9zdHJpbmdzLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuZXJhdG9yX3N0cmluZ3MuZW5kKCk7ICsraXRlcikgewotICAgICAgdF9nZW5lcmF0b3IqIGdlbmVyYXRvciA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yKHByb2dyYW0sICppdGVyKTsKLQotICAgICAgaWYgKGdlbmVyYXRvciA9PSBOVUxMKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHB2ZXJib3NlKCJHZW5lcmF0aW5nIFwiJXNcIlxuIiwgaXRlci0+Y19zdHIoKSk7Ci0gICAgICAgIGdlbmVyYXRvci0+Z2VuZXJhdGVfcHJvZ3JhbSgpOwotICAgICAgICBkZWxldGUgZ2VuZXJhdG9yOwotICAgICAgfQotICAgIH0KLQotICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgIHByaW50ZigiRXJyb3I6ICVzXG4iLCBzLmNfc3RyKCkpOwotICB9IGNhdGNoIChjb25zdCBjaGFyKiBleGMpIHsKLSAgICBwcmludGYoIkVycm9yOiAlc1xuIiwgZXhjKTsKLSAgfQotCi19Ci0KLS8qKgotICogUGFyc2UgaXQgdXAuLiB0aGVuIHNwaXQgaXQgYmFjayBvdXQsIGluIHByZXR0eSBtdWNoIGV2ZXJ5IGxhbmd1YWdlLiBBbHJpZ2h0Ci0gKiBub3QgdGhhdCBtYW55IGxhbmd1YWdlcywgYnV0IHRoZSBjb29sIG9uZXMgdGhhdCB3ZSBjYXJlIGFib3V0LgotICovCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgaW50IGk7Ci0gIHN0ZDo6c3RyaW5nIG91dF9wYXRoOwotICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlID0gZmFsc2U7Ci0KLSAgLy8gU2V0dXAgdGltZSBzdHJpbmcKLSAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7Ci0gIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKLQotICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKLSAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKLSAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgdXNhZ2UoKTsKLSAgfQotCi0gIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOwotCi0gIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCi0gIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOwotCi0gIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYy0xOyBpKyspIHsKLSAgICBjaGFyKiBhcmc7Ci0KLSAgICBhcmcgPSBzdHJ0b2soYXJndltpXSwgIiAiKTsKLSAgICB3aGlsZSAoYXJnICE9IE5VTEwpIHsKLSAgICAgIC8vIFRyZWF0IGRvdWJsZSBkYXNoZXMgYXMgc2luZ2xlIGRhc2hlcwotICAgICAgaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJykgewotICAgICAgICArK2FyZzsKLSAgICAgIH0KLQotICAgICAgaWYgKHN0cmNtcChhcmcsICItaGVscCIpID09IDApIHsKLSAgICAgICAgaGVscCgpOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXZlcnNpb24iKSA9PSAwKSB7Ci0gICAgICAgIHZlcnNpb24oKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1kZWJ1ZyIpID09IDApIHsKLSAgICAgICAgZ19kZWJ1ZyA9IDE7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItbm93YXJuIikgPT0gMCkgewotICAgICAgICBnX3dhcm4gPSAwOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXN0cmljdCIpID09IDApIHsKLSAgICAgICAgZ19zdHJpY3QgPSAyNTU7Ci0gICAgICAgIGdfd2FybiA9IDI7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdiIpID09IDAgfHwgc3RyY21wKGFyZywgIi12ZXJib3NlIikgPT0gMCApIHsKLSAgICAgICAgZ192ZXJib3NlID0gMTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1yIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXJlY3Vyc2UiKSA9PSAwICkgewotICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctbmVnLWtleXMiKSA9PSAwKSB7Ci0gICAgICAgIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LTY0Yml0LWNvbnN0cyIpID09IDApIHsKLSAgICAgICAgZ19hbGxvd182NGJpdF9jb25zdHMgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWdlbiIpID09IDApIHsKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOwotICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZGVuc2UiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9kZW5zZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItY3BwIikgPT0gMCkgewotICAgICAgICBnZW5fY3BwID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1qYXZhYmVhbiIpID09IDApIHsKLSAgICAgICAgZ2VuX2phdmFiZWFuID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1qYXZhIikgPT0gMCkgewotICAgICAgICBnZW5famF2YSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBpIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwaSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcGhwcyIpID09IDApIHsKLSAgICAgICAgZ2VuX3BocCA9IHRydWU7Ci0gICAgICAgIGdlbl9waHBzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBsIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1waHBhIikgPT0gMCkgewotICAgICAgICBnZW5fcGhwID0gdHJ1ZTsKLSAgICAgICAgZ2VuX3BocHMgPSBmYWxzZTsKLSAgICAgICAgZ2VuX3BocGEgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXBocG8iKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9waHAgPSB0cnVlOwotICAgICAgICBnZW5fcGhwbyA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcmVzdCIpID09IDApIHsKLSAgICAgICAgZ2VuX3Jlc3QgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXB5IikgPT0gMCkgewotICAgICAgICBnZW5fcHkgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLXB5bnMiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9weSA9IHRydWU7Ci0gICAgICAgIGdlbl9weV9uZXdzdHlsZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItcmIiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9yYiA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICIteHNkIikgPT0gMCkgewotICAgICAgICBnZW5feHNkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1wZXJsIikgPT0gMCkgewotICAgICAgICBnZW5fcGVybCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItZXJsIikgPT0gMCkgewotICAgICAgICBnZW5fZXJsID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1vY2FtbCIpID09IDApIHsKLSAgICAgICAgZ2VuX29jYW1sID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ocyIpID09IDApIHsKLSAgICAgICAgZ2VuX2hzID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jb2NvYSIpID09IDApIHsKLSAgICAgICAgZ2VuX2NvY29hID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1zdCIpID09IDApIHsKLSAgICAgICAgZ2VuX3N0ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1jc2hhcnAiKSA9PSAwKSB7Ci0gICAgICAgIGdlbl9jc2hhcnAgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlbHBoaSIpID09IDApIHsKLSAgICAgICAgZ2VuX2RlbHBoaSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItY3BwX3VzZV9pbmNsdWRlX3ByZWZpeCIpID09IDApIHsKLSAgICAgICAgZ19jcHBfdXNlX2luY2x1ZGVfcHJlZml4ID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JIikgPT0gMCkgewotICAgICAgICAvLyBBbiBhcmd1bWVudCBvZiAiLUlcIGFzZGYiIGlzIGludmFsaWQgYW5kIGhhcyB1bmtub3duIHJlc3VsdHMKLSAgICAgICAgYXJnID0gYXJndlsrK2ldOwotCi0gICAgICAgIGlmIChhcmcgPT0gTlVMTCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeVxuIik7Ci0gICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2soYXJnKTsKLSAgICAgIH0gZWxzZSBpZiAoKHN0cmNtcChhcmcsICItbyIpID09IDApIHx8IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApKSB7Ci0gICAgICAgIG91dF9wYXRoX2lzX2Fic29sdXRlID0gKHN0cmNtcChhcmcsICItb3V0IikgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0JCSAgCi0JCWFyZyA9IGFyZ3ZbKytpXTsKLSAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICItbzogbWlzc2luZyBvdXRwdXQgZGlyZWN0b3J5XG4iKTsKLSAgICAgICAgICB1c2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIG91dF9wYXRoID0gYXJnOwotCi0jaWZkZWYgTUlOR1cKLSAgICAgICAgLy9zdHJpcCBvdXQgdHJhaWxpbmcgXCBvbiBXaW5kb3dzCi0gICAgICAgIGludCBsYXN0ID0gb3V0X3BhdGgubGVuZ3RoKCktMTsKLSAgICAgICAgaWYgKG91dF9wYXRoW2xhc3RdID09ICdcXCcpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXRfcGF0aC5lcmFzZShsYXN0KTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmICghY2hlY2tfaXNfZGlyZWN0b3J5KG91dF9wYXRoLmNfc3RyKCkpKQotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIG9wdGlvbjogJXNcbiIsIGFyZyk7Ci0gICAgICAgIHVzYWdlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFRva2VuaXplIG1vcmUKLSAgICAgIGFyZyA9IHN0cnRvayhOVUxMLCAiICIpOwotICAgIH0KLSAgfQotCi0gIC8vIGRpc3BsYXkgaGVscAotICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MtMV0sICItaGVscCIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjLTFdLCAiLS1oZWxwIikgPT0gMCkpIHsKLSAgICBoZWxwKCk7Ci0gIH0KLQotICAvLyBpZiB5b3UncmUgYXNraW5nIGZvciB2ZXJzaW9uLCB5b3UgaGF2ZSBhIHJpZ2h0IG5vdCB0byBwYXNzIGEgZmlsZQotICBpZiAoKHN0cmNtcChhcmd2W2FyZ2MtMV0sICItdmVyc2lvbiIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjLTFdLCAiLS12ZXJzaW9uIikgPT0gMCkpIHsKLSAgICB2ZXJzaW9uKCk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIC8vIFlvdSBnb3R0YSBnZW5lcmF0ZSBzb21ldGhpbmchCi0gIGlmIChnZW5lcmF0b3Jfc3RyaW5ncy5lbXB0eSgpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgbGFuZ3VhZ2Uocykgc3BlY2lmaWVkXG4iKTsKLSAgICB1c2FnZSgpOwotICB9Ci0KLSAgLy8gUmVhbC1wYXRoaWZ5IGl0Ci0gIGNoYXIgcnBbUEFUSF9NQVhdOwotICBpZiAoYXJndltpXSA9PSBOVUxMKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIGZpbGUgbmFtZVxuIik7Ci0gICAgdXNhZ2UoKTsKLSAgfQotICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIHJwKSA9PSBOVUxMKSB7Ci0gICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOwotICB9Ci0gIHN0cmluZyBpbnB1dF9maWxlKHJwKTsKLQotICAvLyBJbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIHBhcnNlIHRyZWUKLSAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShpbnB1dF9maWxlKTsKLSAgaWYgKG91dF9wYXRoLnNpemUoKSkgewotICAgIHByb2dyYW0tPnNldF9vdXRfcGF0aChvdXRfcGF0aCwgb3V0X3BhdGhfaXNfYWJzb2x1dGUpOwotICB9Ci0KLSAgLy8gQ29tcHV0ZSB0aGUgY3BwIGluY2x1ZGUgcHJlZml4LgotICAvLyBpbmZlciB0aGlzIGZyb20gdGhlIGZpbGVuYW1lIHBhc3NlZCBpbgotICBzdHJpbmcgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W2ldOwotICBzdHJpbmcgaW5jbHVkZV9wcmVmaXg7Ci0KLSAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKLSAgaWYgKChsYXN0X3NsYXNoID0gaW5wdXRfZmlsZW5hbWUucmZpbmQoIi8iKSkgIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgaW5jbHVkZV9wcmVmaXggPSBpbnB1dF9maWxlbmFtZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7Ci0gIH0KLQotICBwcm9ncmFtLT5zZXRfaW5jbHVkZV9wcmVmaXgoaW5jbHVkZV9wcmVmaXgpOwotCi0gIC8vIEluaXRpYWxpemUgZ2xvYmFsIHR5cGVzCi0gIGdfdHlwZV92b2lkICAgPSBuZXcgdF9iYXNlX3R5cGUoInZvaWQiLCAgIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpOwotICBnX3R5cGVfc3RyaW5nID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICBnX3R5cGVfYmluYXJ5ID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOwotICAoKHRfYmFzZV90eXBlKilnX3R5cGVfYmluYXJ5KS0+c2V0X2JpbmFyeSh0cnVlKTsKLSAgZ190eXBlX3NsaXN0ICA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgKCh0X2Jhc2VfdHlwZSopZ190eXBlX3NsaXN0KS0+c2V0X3N0cmluZ19saXN0KHRydWUpOwotICBnX3R5cGVfYm9vbCAgID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgICB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKLSAgZ190eXBlX2J5dGUgICA9IG5ldyB0X2Jhc2VfdHlwZSgiYnl0ZSIsICAgdF9iYXNlX3R5cGU6OlRZUEVfQllURSk7Ci0gIGdfdHlwZV9pMTYgICAgPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsICAgIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7Ci0gIGdfdHlwZV9pMzIgICAgPSBuZXcgdF9iYXNlX3R5cGUoImkzMiIsICAgIHRfYmFzZV90eXBlOjpUWVBFX0kzMik7Ci0gIGdfdHlwZV9pNjQgICAgPSBuZXcgdF9iYXNlX3R5cGUoImk2NCIsICAgIHRfYmFzZV90eXBlOjpUWVBFX0k2NCk7Ci0gIGdfdHlwZV9kb3VibGUgPSBuZXcgdF9iYXNlX3R5cGUoImRvdWJsZSIsIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7Ci0KLSAgLy8gUGFyc2UgaXQhCi0gIHBhcnNlKHByb2dyYW0sIE5VTEwpOwotCi0gIC8vIFRoZSBjdXJyZW50IHBhdGggaXMgbm90IHJlYWxseSByZWxldmFudCB3aGVuIHdlIGFyZSBkb2luZyBnZW5lcmF0aW9uLgotICAvLyBSZXNldCB0aGUgdmFyaWFibGUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCi0gIGdfY3VycGF0aCA9ICJnZW5lcmF0aW9uIjsKLSAgLy8gUmVzZXQgeXlsaW5lbm8gZm9yIHRoZSBoZWNrIG9mIGl0LiAgVXNlIDEgaW5zdGVhZCBvZiAwIGJlY2F1c2UKLSAgLy8gVGhhdCBpcyB3aGF0IHNob3dzIHVwIGR1cmluZyBhcmd1bWVudCBwYXJzaW5nLgotICB5eWxpbmVubyA9IDE7Ci0KLSAgLy8gR2VuZXJhdGUgaXQhCi0gIGdlbmVyYXRlKHByb2dyYW0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKLQotICAvLyBDbGVhbiB1cC4gV2hvIGFtIEkga2lkZGluZy4uLiB0aGlzIHByb2dyYW0gcHJvYmFibHkgb3JwaGFucyBoZWFwIG1lbW9yeQotICAvLyBhbGwgb3ZlciB0aGUgcGxhY2UsIGJ1dCB3aG8gY2FyZXMgYmVjYXVzZSBpdCBpcyBhYm91dCB0byBleGl0IGFuZCBpdCBpcwotICAvLyBhbGwgcmVmZXJlbmNlZCBhbmQgdXNlZCBieSB0aGlzIHdhY2t5IHBhcnNlIHRyZWUgdXAgdW50aWwgbm93IGFueXdheXMuCi0KLSAgZGVsZXRlIHByb2dyYW07Ci0gIGRlbGV0ZSBnX3R5cGVfdm9pZDsKLSAgZGVsZXRlIGdfdHlwZV9zdHJpbmc7Ci0gIGRlbGV0ZSBnX3R5cGVfYm9vbDsKLSAgZGVsZXRlIGdfdHlwZV9ieXRlOwotICBkZWxldGUgZ190eXBlX2kxNjsKLSAgZGVsZXRlIGdfdHlwZV9pMzI7Ci0gIGRlbGV0ZSBnX3R5cGVfaTY0OwotICBkZWxldGUgZ190eXBlX2RvdWJsZTsKLQotICAvLyBGaW5pc2hlZAotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWFpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy9tYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliN2Q4MmQuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9tYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTUFJTl9ICi0jZGVmaW5lIFRfTUFJTl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAicGFyc2UvdF9jb25zdC5oIgotI2luY2x1ZGUgInBhcnNlL3RfZmllbGQuaCIKLQotLyoqCi0gKiBEZWZpbmVkIGluIHRoZSBmbGV4IGxpYnJhcnkKLSAqLwotCi1pbnQgeXlsZXgodm9pZCk7Ci0KLWludCB5eXBhcnNlKHZvaWQpOwotCi0vKioKLSAqIEV4cGVjdGVkIHRvIGJlIGRlZmluZWQgYnkgRmxleC9CaXNvbgotICovCi12b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIFBhcnNlIGRlYnVnZ2luZyBvdXRwdXQsIHVzZWQgdG8gcHJpbnQgaGVscGZ1bCBpbmZvCi0gKi8KLXZvaWQgcGRlYnVnKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKLQotLyoqCi0gKiBQYXJzZXIgd2FybmluZwotICovCi12b2lkIHB3YXJuaW5nKGludCBsZXZlbCwgY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0vKioKLSAqIEZhaWx1cmUhCi0gKi8KLXZvaWQgZmFpbHVyZShjb25zdCBjaGFyKiBmbXQsIC4uLik7Ci0KLS8qKgotICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKLSAqLwotdm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpOwotCi0vKioKLSAqIENoZWNrIGNvbnN0YW50IHR5cGVzCi0gKi8KLXZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KTsKLQotLyoqCi0gKiBDaGVjayBtZW1iZXJzIG9mIGEgdGhyb3dzIGJsb2NrCi0gKi8KLWJvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpOwotCi0vKioKLSAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCi0gKi8KLXN0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQotICovCi1zdGQ6OnN0cmluZyBkaXJlY3RvcnlfbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7Ci0KLS8qKgotICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhbiBpbmNsdWRlIGZpbGUKLSAqLwotc3RkOjpzdHJpbmcgaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKLQotLyoqCi0gKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgotICovCi12b2lkIGNsZWFyX2RvY3RleHQoKTsKLQotLyoqCi0gKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKLSAqLwotY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KTsKLQotLyoqCi0gKiBGbGV4IHV0aWxpdGllcwotICovCi0KLWV4dGVybiBpbnQgICB5eWxpbmVubzsKLWV4dGVybiBjaGFyICB5eXRleHRbXTsKLWV4dGVybiBGSUxFKiB5eWluOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMgYi9jb21waWxlci9jcHAvc3JjL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVkOTZjLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvbWQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoKLSAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotLyogJElkOiBtZDUuYyx2IDEuNiAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLwotLyoKLSAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCi0KLSAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKLSAgdGV4dCBpcyBhdmFpbGFibGUgYXQKLQlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAotICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCi0gIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQotICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCi0gIGNvcHlyaWdodGVkLgotCi0gIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuYyBpcyBMLiBQZXRlciBEZXV0c2NoCi0gIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKLSAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgotCi0gIDIwMDItMDQtMTMgbHBkIENsYXJpZmllZCBkZXJpdmF0aW9uIGZyb20gUkZDIDEzMjE7IG5vdyBoYW5kbGVzIGJ5dGUgb3JkZXIKLQllaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseTsgYWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0JaW4gbGlicmFyeS4KLSAgMjAwMi0wMy0xMSBscGQgQ29ycmVjdGVkIGFyZ3VtZW50IGxpc3QgZm9yIG1haW4oKSwgYW5kIGFkZGVkIGludCByZXR1cm4KLQl0eXBlLCBpbiB0ZXN0IHByb2dyYW0gYW5kIFQgdmFsdWUgcHJvZ3JhbS4KLSAgMjAwMi0wMi0yMSBscGQgQWRkZWQgbWlzc2luZyAjaW5jbHVkZSA8c3RkaW8uaD4gaW4gdGVzdCBwcm9ncmFtLgotICAyMDAwLTA3LTAzIGxwZCBQYXRjaGVkIHRvIGVsaW1pbmF0ZSB3YXJuaW5ncyBhYm91dCAiY29uc3RhbnQgaXMKLQl1bnNpZ25lZCBpbiBBTlNJIEMsIHNpZ25lZCBpbiB0cmFkaXRpb25hbCI7IG1hZGUgdGVzdCBwcm9ncmFtCi0Jc2VsZi1jaGVja2luZy4KLSAgMTk5OS0xMS0wNCBscGQgRWRpdGVkIGNvbW1lbnRzIHNsaWdodGx5IGZvciBhdXRvbWF0aWMgVE9DIGV4dHJhY3Rpb24uCi0gIDE5OTktMTAtMTggbHBkIEZpeGVkIHR5cG8gaW4gaGVhZGVyIGNvbW1lbnQgKGFuc2kya25yIHJhdGhlciB0aGFuIG1kNSkuCi0gIDE5OTktMDUtMDMgbHBkIE9yaWdpbmFsIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgIm1kNS5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jdW5kZWYgQllURV9PUkRFUgkvKiAxID0gYmlnLWVuZGlhbiwgLTEgPSBsaXR0bGUtZW5kaWFuLCAwID0gdW5rbm93biAqLwotI2lmZGVmIEFSQ0hfSVNfQklHX0VORElBTgotIyAgZGVmaW5lIEJZVEVfT1JERVIgKEFSQ0hfSVNfQklHX0VORElBTiA/IDEgOiAtMSkKLSNlbHNlCi0jICBkZWZpbmUgQllURV9PUkRFUiAwCi0jZW5kaWYKLQotI2RlZmluZSBUX01BU0sgKChtZDVfd29yZF90KX4wKQotI2RlZmluZSBUMSAvKiAweGQ3NmFhNDc4ICovIChUX01BU0sgXiAweDI4OTU1Yjg3KQotI2RlZmluZSBUMiAvKiAweGU4YzdiNzU2ICovIChUX01BU0sgXiAweDE3Mzg0OGE5KQotI2RlZmluZSBUMyAgICAweDI0MjA3MGRiCi0jZGVmaW5lIFQ0IC8qIDB4YzFiZGNlZWUgKi8gKFRfTUFTSyBeIDB4M2U0MjMxMTEpCi0jZGVmaW5lIFQ1IC8qIDB4ZjU3YzBmYWYgKi8gKFRfTUFTSyBeIDB4MGE4M2YwNTApCi0jZGVmaW5lIFQ2ICAgIDB4NDc4N2M2MmEKLSNkZWZpbmUgVDcgLyogMHhhODMwNDYxMyAqLyAoVF9NQVNLIF4gMHg1N2NmYjllYykKLSNkZWZpbmUgVDggLyogMHhmZDQ2OTUwMSAqLyAoVF9NQVNLIF4gMHgwMmI5NmFmZSkKLSNkZWZpbmUgVDkgICAgMHg2OTgwOThkOAotI2RlZmluZSBUMTAgLyogMHg4YjQ0ZjdhZiAqLyAoVF9NQVNLIF4gMHg3NGJiMDg1MCkKLSNkZWZpbmUgVDExIC8qIDB4ZmZmZjViYjEgKi8gKFRfTUFTSyBeIDB4MDAwMGE0NGUpCi0jZGVmaW5lIFQxMiAvKiAweDg5NWNkN2JlICovIChUX01BU0sgXiAweDc2YTMyODQxKQotI2RlZmluZSBUMTMgICAgMHg2YjkwMTEyMgotI2RlZmluZSBUMTQgLyogMHhmZDk4NzE5MyAqLyAoVF9NQVNLIF4gMHgwMjY3OGU2YykKLSNkZWZpbmUgVDE1IC8qIDB4YTY3OTQzOGUgKi8gKFRfTUFTSyBeIDB4NTk4NmJjNzEpCi0jZGVmaW5lIFQxNiAgICAweDQ5YjQwODIxCi0jZGVmaW5lIFQxNyAvKiAweGY2MWUyNTYyICovIChUX01BU0sgXiAweDA5ZTFkYTlkKQotI2RlZmluZSBUMTggLyogMHhjMDQwYjM0MCAqLyAoVF9NQVNLIF4gMHgzZmJmNGNiZikKLSNkZWZpbmUgVDE5ICAgIDB4MjY1ZTVhNTEKLSNkZWZpbmUgVDIwIC8qIDB4ZTliNmM3YWEgKi8gKFRfTUFTSyBeIDB4MTY0OTM4NTUpCi0jZGVmaW5lIFQyMSAvKiAweGQ2MmYxMDVkICovIChUX01BU0sgXiAweDI5ZDBlZmEyKQotI2RlZmluZSBUMjIgICAgMHgwMjQ0MTQ1MwotI2RlZmluZSBUMjMgLyogMHhkOGExZTY4MSAqLyAoVF9NQVNLIF4gMHgyNzVlMTk3ZSkKLSNkZWZpbmUgVDI0IC8qIDB4ZTdkM2ZiYzggKi8gKFRfTUFTSyBeIDB4MTgyYzA0MzcpCi0jZGVmaW5lIFQyNSAgICAweDIxZTFjZGU2Ci0jZGVmaW5lIFQyNiAvKiAweGMzMzcwN2Q2ICovIChUX01BU0sgXiAweDNjYzhmODI5KQotI2RlZmluZSBUMjcgLyogMHhmNGQ1MGQ4NyAqLyAoVF9NQVNLIF4gMHgwYjJhZjI3OCkKLSNkZWZpbmUgVDI4ICAgIDB4NDU1YTE0ZWQKLSNkZWZpbmUgVDI5IC8qIDB4YTllM2U5MDUgKi8gKFRfTUFTSyBeIDB4NTYxYzE2ZmEpCi0jZGVmaW5lIFQzMCAvKiAweGZjZWZhM2Y4ICovIChUX01BU0sgXiAweDAzMTA1YzA3KQotI2RlZmluZSBUMzEgICAgMHg2NzZmMDJkOQotI2RlZmluZSBUMzIgLyogMHg4ZDJhNGM4YSAqLyAoVF9NQVNLIF4gMHg3MmQ1YjM3NSkKLSNkZWZpbmUgVDMzIC8qIDB4ZmZmYTM5NDIgKi8gKFRfTUFTSyBeIDB4MDAwNWM2YmQpCi0jZGVmaW5lIFQzNCAvKiAweDg3NzFmNjgxICovIChUX01BU0sgXiAweDc4OGUwOTdlKQotI2RlZmluZSBUMzUgICAgMHg2ZDlkNjEyMgotI2RlZmluZSBUMzYgLyogMHhmZGU1MzgwYyAqLyAoVF9NQVNLIF4gMHgwMjFhYzdmMykKLSNkZWZpbmUgVDM3IC8qIDB4YTRiZWVhNDQgKi8gKFRfTUFTSyBeIDB4NWI0MTE1YmIpCi0jZGVmaW5lIFQzOCAgICAweDRiZGVjZmE5Ci0jZGVmaW5lIFQzOSAvKiAweGY2YmI0YjYwICovIChUX01BU0sgXiAweDA5NDRiNDlmKQotI2RlZmluZSBUNDAgLyogMHhiZWJmYmM3MCAqLyAoVF9NQVNLIF4gMHg0MTQwNDM4ZikKLSNkZWZpbmUgVDQxICAgIDB4Mjg5YjdlYzYKLSNkZWZpbmUgVDQyIC8qIDB4ZWFhMTI3ZmEgKi8gKFRfTUFTSyBeIDB4MTU1ZWQ4MDUpCi0jZGVmaW5lIFQ0MyAvKiAweGQ0ZWYzMDg1ICovIChUX01BU0sgXiAweDJiMTBjZjdhKQotI2RlZmluZSBUNDQgICAgMHgwNDg4MWQwNQotI2RlZmluZSBUNDUgLyogMHhkOWQ0ZDAzOSAqLyAoVF9NQVNLIF4gMHgyNjJiMmZjNikKLSNkZWZpbmUgVDQ2IC8qIDB4ZTZkYjk5ZTUgKi8gKFRfTUFTSyBeIDB4MTkyNDY2MWEpCi0jZGVmaW5lIFQ0NyAgICAweDFmYTI3Y2Y4Ci0jZGVmaW5lIFQ0OCAvKiAweGM0YWM1NjY1ICovIChUX01BU0sgXiAweDNiNTNhOTlhKQotI2RlZmluZSBUNDkgLyogMHhmNDI5MjI0NCAqLyAoVF9NQVNLIF4gMHgwYmQ2ZGRiYikKLSNkZWZpbmUgVDUwICAgIDB4NDMyYWZmOTcKLSNkZWZpbmUgVDUxIC8qIDB4YWI5NDIzYTcgKi8gKFRfTUFTSyBeIDB4NTQ2YmRjNTgpCi0jZGVmaW5lIFQ1MiAvKiAweGZjOTNhMDM5ICovIChUX01BU0sgXiAweDAzNmM1ZmM2KQotI2RlZmluZSBUNTMgICAgMHg2NTViNTljMwotI2RlZmluZSBUNTQgLyogMHg4ZjBjY2M5MiAqLyAoVF9NQVNLIF4gMHg3MGYzMzM2ZCkKLSNkZWZpbmUgVDU1IC8qIDB4ZmZlZmY0N2QgKi8gKFRfTUFTSyBeIDB4MDAxMDBiODIpCi0jZGVmaW5lIFQ1NiAvKiAweDg1ODQ1ZGQxICovIChUX01BU0sgXiAweDdhN2JhMjJlKQotI2RlZmluZSBUNTcgICAgMHg2ZmE4N2U0ZgotI2RlZmluZSBUNTggLyogMHhmZTJjZTZlMCAqLyAoVF9NQVNLIF4gMHgwMWQzMTkxZikKLSNkZWZpbmUgVDU5IC8qIDB4YTMwMTQzMTQgKi8gKFRfTUFTSyBeIDB4NWNmZWJjZWIpCi0jZGVmaW5lIFQ2MCAgICAweDRlMDgxMWExCi0jZGVmaW5lIFQ2MSAvKiAweGY3NTM3ZTgyICovIChUX01BU0sgXiAweDA4YWM4MTdkKQotI2RlZmluZSBUNjIgLyogMHhiZDNhZjIzNSAqLyAoVF9NQVNLIF4gMHg0MmM1MGRjYSkKLSNkZWZpbmUgVDYzICAgIDB4MmFkN2QyYmIKLSNkZWZpbmUgVDY0IC8qIDB4ZWI4NmQzOTEgKi8gKFRfTUFTSyBeIDB4MTQ3OTJjNmUpCi0KLQotc3RhdGljIHZvaWQKLW1kNV9wcm9jZXNzKG1kNV9zdGF0ZV90ICpwbXMsIGNvbnN0IG1kNV9ieXRlX3QgKmRhdGEgLypbNjRdKi8pCi17Ci0gICAgbWQ1X3dvcmRfdAotCWEgPSBwbXMtPmFiY2RbMF0sIGIgPSBwbXMtPmFiY2RbMV0sCi0JYyA9IHBtcy0+YWJjZFsyXSwgZCA9IHBtcy0+YWJjZFszXTsKLSAgICBtZDVfd29yZF90IHQ7Ci0jaWYgQllURV9PUkRFUiA+IDAKLSAgICAvKiBEZWZpbmUgc3RvcmFnZSBvbmx5IGZvciBiaWctZW5kaWFuIENQVXMuICovCi0gICAgbWQ1X3dvcmRfdCBYWzE2XTsKLSNlbHNlCi0gICAgLyogRGVmaW5lIHN0b3JhZ2UgZm9yIGxpdHRsZS1lbmRpYW4gb3IgYm90aCB0eXBlcyBvZiBDUFVzLiAqLwotICAgIG1kNV93b3JkX3QgeGJ1ZlsxNl07Ci0gICAgY29uc3QgbWQ1X3dvcmRfdCAqWDsKLSNlbmRpZgotCi0gICAgewotI2lmIEJZVEVfT1JERVIgPT0gMAotCS8qCi0JICogRGV0ZXJtaW5lIGR5bmFtaWNhbGx5IHdoZXRoZXIgdGhpcyBpcyBhIGJpZy1lbmRpYW4gb3IKLQkgKiBsaXR0bGUtZW5kaWFuIG1hY2hpbmUsIHNpbmNlIHdlIGNhbiB1c2UgYSBtb3JlIGVmZmljaWVudAotCSAqIGFsZ29yaXRobSBvbiB0aGUgbGF0dGVyLgotCSAqLwotCXN0YXRpYyBjb25zdCBpbnQgdyA9IDE7Ci0KLQlpZiAoKigoY29uc3QgbWQ1X2J5dGVfdCAqKSZ3KSkgLyogZHluYW1pYyBsaXR0bGUtZW5kaWFuICovCi0jZW5kaWYKLSNpZiBCWVRFX09SREVSIDw9IDAJCS8qIGxpdHRsZS1lbmRpYW4gKi8KLQl7Ci0JICAgIC8qCi0JICAgICAqIE9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHdlIGNhbiBwcm9jZXNzIHByb3Blcmx5IGFsaWduZWQKLQkgICAgICogZGF0YSB3aXRob3V0IGNvcHlpbmcgaXQuCi0JICAgICAqLwotCSAgICBpZiAoISgoZGF0YSAtIChjb25zdCBtZDVfYnl0ZV90ICopMCkgJiAzKSkgewotCQkvKiBkYXRhIGFyZSBwcm9wZXJseSBhbGlnbmVkICovCi0JCVggPSAoY29uc3QgbWQ1X3dvcmRfdCAqKWRhdGE7Ci0JICAgIH0gZWxzZSB7Ci0JCS8qIG5vdCBhbGlnbmVkICovCi0JCW1lbWNweSh4YnVmLCBkYXRhLCA2NCk7Ci0JCVggPSB4YnVmOwotCSAgICB9Ci0JfQotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA9PSAwCi0JZWxzZQkJCS8qIGR5bmFtaWMgYmlnLWVuZGlhbiAqLwotI2VuZGlmCi0jaWYgQllURV9PUkRFUiA+PSAwCQkvKiBiaWctZW5kaWFuICovCi0JewotCSAgICAvKgotCSAgICAgKiBPbiBiaWctZW5kaWFuIG1hY2hpbmVzLCB3ZSBtdXN0IGFycmFuZ2UgdGhlIGJ5dGVzIGluIHRoZQotCSAgICAgKiByaWdodCBvcmRlci4KLQkgICAgICovCi0JICAgIGNvbnN0IG1kNV9ieXRlX3QgKnhwID0gZGF0YTsKLQkgICAgaW50IGk7Ci0KLSMgIGlmIEJZVEVfT1JERVIgPT0gMAotCSAgICBYID0geGJ1ZjsJCS8qIChkeW5hbWljIG9ubHkpICovCi0jICBlbHNlCi0jICAgIGRlZmluZSB4YnVmIFgJCS8qIChzdGF0aWMgb25seSkgKi8KLSMgIGVuZGlmCi0JICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpLCB4cCArPSA0KQotCQl4YnVmW2ldID0geHBbMF0gKyAoeHBbMV0gPDwgOCkgKyAoeHBbMl0gPDwgMTYpICsgKHhwWzNdIDw8IDI0KTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSNkZWZpbmUgUk9UQVRFX0xFRlQoeCwgbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCi0KLSAgICAvKiBSb3VuZCAxLiAqLwotICAgIC8qIExldCBbYWJjZCBrIHMgaV0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICBhID0gYiArICgoYSArIEYoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgRih4LCB5LCB6KSAoKCh4KSAmICh5KSkgfCAofih4KSAmICh6KSkpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgRihiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgMCwgIDcsICBUMSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAxLCAxMiwgIFQyKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDIsIDE3LCAgVDMpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMywgMjIsICBUNCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNywgIFQ1KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDUsIDEyLCAgVDYpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgNiwgMTcsICBUNyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA3LCAyMiwgIFQ4KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDgsICA3LCAgVDkpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgOSwgMTIsIFQxMCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNywgVDExKTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTEsIDIyLCBUMTIpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMiwgIDcsIFQxMyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDEzLCAxMiwgVDE0KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTQsIDE3LCBUMTUpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxNSwgMjIsIFQxNik7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgMi4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyBpXSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgRyhiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiB+KHopKSkKLSNkZWZpbmUgU0VUKGEsIGIsIGMsIGQsIGssIHMsIFRpKVwKLSAgdCA9IGEgKyBHKGIsYyxkKSArIFhba10gKyBUaTtcCi0gIGEgPSBST1RBVEVfTEVGVCh0LCBzKSArIGIKLSAgICAgLyogRG8gdGhlIGZvbGxvd2luZyAxNiBvcGVyYXRpb25zLiAqLwotICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDUsIFQxNyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA2LCAgOSwgVDE4KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgMTEsIDE0LCBUMTkpOwotICAgIFNFVChiLCBjLCBkLCBhLCAgMCwgMjAsIFQyMCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA1LCAgNSwgVDIxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTAsICA5LCBUMjIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNSwgMTQsIFQyMyk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA0LCAyMCwgVDI0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDksICA1LCBUMjUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxNCwgIDksIFQyNik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsICAzLCAxNCwgVDI3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDgsIDIwLCBUMjgpOwotICAgIFNFVChhLCBiLCBjLCBkLCAxMywgIDUsIFQyOSk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICAyLCAgOSwgVDMwKTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE0LCBUMzEpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMiwgMjAsIFQzMik7Ci0jdW5kZWYgU0VUCi0KLSAgICAgLyogUm91bmQgMy4gKi8KLSAgICAgLyogTGV0IFthYmNkIGsgcyB0XSBkZW5vdGUgdGhlIG9wZXJhdGlvbgotICAgICAgICAgIGEgPSBiICsgKChhICsgSChiLGMsZCkgKyBYW2tdICsgVFtpXSkgPDw8IHMpLiAqLwotI2RlZmluZSBIKHgsIHksIHopICgoeCkgXiAoeSkgXiAoeikpCi0jZGVmaW5lIFNFVChhLCBiLCBjLCBkLCBrLCBzLCBUaSlcCi0gIHQgPSBhICsgSChiLGMsZCkgKyBYW2tdICsgVGk7XAotICBhID0gUk9UQVRFX0xFRlQodCwgcykgKyBiCi0gICAgIC8qIERvIHRoZSBmb2xsb3dpbmcgMTYgb3BlcmF0aW9ucy4gKi8KLSAgICBTRVQoYSwgYiwgYywgZCwgIDUsICA0LCBUMzMpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgOCwgMTEsIFQzNCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDExLCAxNiwgVDM1KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgMTQsIDIzLCBUMzYpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgMSwgIDQsIFQzNyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsICA0LCAxMSwgVDM4KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDcsIDE2LCBUMzkpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMCwgMjMsIFQ0MCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsIDEzLCAgNCwgVDQxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDAsIDExLCBUNDIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMywgMTYsIFQ0Myk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA2LCAyMywgVDQ0KTsKLSAgICBTRVQoYSwgYiwgYywgZCwgIDksICA0LCBUNDUpOwotICAgIFNFVChkLCBhLCBiLCBjLCAxMiwgMTEsIFQ0Nik7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDE1LCAxNiwgVDQ3KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDIsIDIzLCBUNDgpOwotI3VuZGVmIFNFVAotCi0gICAgIC8qIFJvdW5kIDQuICovCi0gICAgIC8qIExldCBbYWJjZCBrIHMgdF0gZGVub3RlIHRoZSBvcGVyYXRpb24KLSAgICAgICAgICBhID0gYiArICgoYSArIEkoYixjLGQpICsgWFtrXSArIFRbaV0pIDw8PCBzKS4gKi8KLSNkZWZpbmUgSSh4LCB5LCB6KSAoKHkpIF4gKCh4KSB8IH4oeikpKQotI2RlZmluZSBTRVQoYSwgYiwgYywgZCwgaywgcywgVGkpXAotICB0ID0gYSArIEkoYixjLGQpICsgWFtrXSArIFRpO1wKLSAgYSA9IFJPVEFURV9MRUZUKHQsIHMpICsgYgotICAgICAvKiBEbyB0aGUgZm9sbG93aW5nIDE2IG9wZXJhdGlvbnMuICovCi0gICAgU0VUKGEsIGIsIGMsIGQsICAwLCAgNiwgVDQ5KTsKLSAgICBTRVQoZCwgYSwgYiwgYywgIDcsIDEwLCBUNTApOwotICAgIFNFVChjLCBkLCBhLCBiLCAxNCwgMTUsIFQ1MSk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA1LCAyMSwgVDUyKTsKLSAgICBTRVQoYSwgYiwgYywgZCwgMTIsICA2LCBUNTMpOwotICAgIFNFVChkLCBhLCBiLCBjLCAgMywgMTAsIFQ1NCk7Ci0gICAgU0VUKGMsIGQsIGEsIGIsIDEwLCAxNSwgVDU1KTsKLSAgICBTRVQoYiwgYywgZCwgYSwgIDEsIDIxLCBUNTYpOwotICAgIFNFVChhLCBiLCBjLCBkLCAgOCwgIDYsIFQ1Nyk7Ci0gICAgU0VUKGQsIGEsIGIsIGMsIDE1LCAxMCwgVDU4KTsKLSAgICBTRVQoYywgZCwgYSwgYiwgIDYsIDE1LCBUNTkpOwotICAgIFNFVChiLCBjLCBkLCBhLCAxMywgMjEsIFQ2MCk7Ci0gICAgU0VUKGEsIGIsIGMsIGQsICA0LCAgNiwgVDYxKTsKLSAgICBTRVQoZCwgYSwgYiwgYywgMTEsIDEwLCBUNjIpOwotICAgIFNFVChjLCBkLCBhLCBiLCAgMiwgMTUsIFQ2Myk7Ci0gICAgU0VUKGIsIGMsIGQsIGEsICA5LCAyMSwgVDY0KTsKLSN1bmRlZiBTRVQKLQotICAgICAvKiBUaGVuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBhZGRpdGlvbnMuIChUaGF0IGlzIGluY3JlbWVudCBlYWNoCi0gICAgICAgIG9mIHRoZSBmb3VyIHJlZ2lzdGVycyBieSB0aGUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGJsb2NrCi0gICAgICAgIHdhcyBzdGFydGVkLikgKi8KLSAgICBwbXMtPmFiY2RbMF0gKz0gYTsKLSAgICBwbXMtPmFiY2RbMV0gKz0gYjsKLSAgICBwbXMtPmFiY2RbMl0gKz0gYzsKLSAgICBwbXMtPmFiY2RbM10gKz0gZDsKLX0KLQotdm9pZAotbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcykKLXsKLSAgICBwbXMtPmNvdW50WzBdID0gcG1zLT5jb3VudFsxXSA9IDA7Ci0gICAgcG1zLT5hYmNkWzBdID0gMHg2NzQ1MjMwMTsKLSAgICBwbXMtPmFiY2RbMV0gPSAvKjB4ZWZjZGFiODkqLyBUX01BU0sgXiAweDEwMzI1NDc2OwotICAgIHBtcy0+YWJjZFsyXSA9IC8qMHg5OGJhZGNmZSovIFRfTUFTSyBeIDB4Njc0NTIzMDE7Ci0gICAgcG1zLT5hYmNkWzNdID0gMHgxMDMyNTQ3NjsKLX0KLQotdm9pZAotbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKQotewotICAgIGNvbnN0IG1kNV9ieXRlX3QgKnAgPSBkYXRhOwotICAgIGludCBsZWZ0ID0gbmJ5dGVzOwotICAgIGludCBvZmZzZXQgPSAocG1zLT5jb3VudFswXSA+PiAzKSAmIDYzOwotICAgIG1kNV93b3JkX3QgbmJpdHMgPSAobWQ1X3dvcmRfdCkobmJ5dGVzIDw8IDMpOwotCi0gICAgaWYgKG5ieXRlcyA8PSAwKQotCXJldHVybjsKLQotICAgIC8qIFVwZGF0ZSB0aGUgbWVzc2FnZSBsZW5ndGguICovCi0gICAgcG1zLT5jb3VudFsxXSArPSBuYnl0ZXMgPj4gMjk7Ci0gICAgcG1zLT5jb3VudFswXSArPSBuYml0czsKLSAgICBpZiAocG1zLT5jb3VudFswXSA8IG5iaXRzKQotCXBtcy0+Y291bnRbMV0rKzsKLQotICAgIC8qIFByb2Nlc3MgYW4gaW5pdGlhbCBwYXJ0aWFsIGJsb2NrLiAqLwotICAgIGlmIChvZmZzZXQpIHsKLQlpbnQgY29weSA9IChvZmZzZXQgKyBuYnl0ZXMgPiA2NCA/IDY0IC0gb2Zmc2V0IDogbmJ5dGVzKTsKLQotCW1lbWNweShwbXMtPmJ1ZiArIG9mZnNldCwgcCwgY29weSk7Ci0JaWYgKG9mZnNldCArIGNvcHkgPCA2NCkKLQkgICAgcmV0dXJuOwotCXAgKz0gY29weTsKLQlsZWZ0IC09IGNvcHk7Ci0JbWQ1X3Byb2Nlc3MocG1zLCBwbXMtPmJ1Zik7Ci0gICAgfQotCi0gICAgLyogUHJvY2VzcyBmdWxsIGJsb2Nrcy4gKi8KLSAgICBmb3IgKDsgbGVmdCA+PSA2NDsgcCArPSA2NCwgbGVmdCAtPSA2NCkKLQltZDVfcHJvY2VzcyhwbXMsIHApOwotCi0gICAgLyogUHJvY2VzcyBhIGZpbmFsIHBhcnRpYWwgYmxvY2suICovCi0gICAgaWYgKGxlZnQpCi0JbWVtY3B5KHBtcy0+YnVmLCBwLCBsZWZ0KTsKLX0KLQotdm9pZAotbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pCi17Ci0gICAgc3RhdGljIGNvbnN0IG1kNV9ieXRlX3QgcGFkWzY0XSA9IHsKLQkweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi0gICAgfTsKLSAgICBtZDVfYnl0ZV90IGRhdGFbOF07Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBTYXZlIHRoZSBsZW5ndGggYmVmb3JlIHBhZGRpbmcuICovCi0gICAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkKLQlkYXRhW2ldID0gKG1kNV9ieXRlX3QpKHBtcy0+Y291bnRbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Ci0gICAgLyogUGFkIHRvIDU2IGJ5dGVzIG1vZCA2NC4gKi8KLSAgICBtZDVfYXBwZW5kKHBtcywgcGFkLCAoKDU1IC0gKHBtcy0+Y291bnRbMF0gPj4gMykpICYgNjMpICsgMSk7Ci0gICAgLyogQXBwZW5kIHRoZSBsZW5ndGguICovCi0gICAgbWQ1X2FwcGVuZChwbXMsIGRhdGEsIDgpOwotICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQotCWRpZ2VzdFtpXSA9IChtZDVfYnl0ZV90KShwbXMtPmFiY2RbaSA+PiAyXSA+PiAoKGkgJiAzKSA8PCAzKSk7Ci19CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL21kNS5oIGIvY29tcGlsZXIvY3BwL3NyYy9tZDUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4Yzk5NS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL21kNS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAyIEFsYWRkaW4gRW50ZXJwcmlzZXMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi0gIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLQotICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKLSAgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAotICBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0KLSAgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKLSAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi0gICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCi0gICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLSAgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLQotICBMLiBQZXRlciBEZXV0c2NoCi0gIGdob3N0QGFsYWRkaW4uY29tCi0KLSAqLwotLyogJElkOiBtZDUuaCx2IDEuNCAyMDAyLzA0LzEzIDE5OjIwOjI4IGxwZCBFeHAgJCAqLwotLyoKLSAgSW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gb2YgTUQ1IChSRkMgMTMyMSkuCi0KLSAgVGhpcyBjb2RlIGltcGxlbWVudHMgdGhlIE1ENSBBbGdvcml0aG0gZGVmaW5lZCBpbiBSRkMgMTMyMSwgd2hvc2UKLSAgdGV4dCBpcyBhdmFpbGFibGUgYXQKLQlodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxMzIxLnR4dAotICBUaGUgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIHRleHQgb2YgdGhlIFJGQywgaW5jbHVkaW5nIHRoZSB0ZXN0IHN1aXRlCi0gIChzZWN0aW9uIEEuNSkgYnV0IGV4Y2x1ZGluZyB0aGUgcmVzdCBvZiBBcHBlbmRpeCBBLiAgSXQgZG9lcyBub3QgaW5jbHVkZQotICBhbnkgY29kZSBvciBkb2N1bWVudGF0aW9uIHRoYXQgaXMgaWRlbnRpZmllZCBpbiB0aGUgUkZDIGFzIGJlaW5nCi0gIGNvcHlyaWdodGVkLgotCi0gIFRoZSBvcmlnaW5hbCBhbmQgcHJpbmNpcGFsIGF1dGhvciBvZiBtZDUuaCBpcyBMLiBQZXRlciBEZXV0c2NoCi0gIDxnaG9zdEBhbGFkZGluLmNvbT4uICBPdGhlciBhdXRob3JzIGFyZSBub3RlZCBpbiB0aGUgY2hhbmdlIGhpc3RvcnkKLSAgdGhhdCBmb2xsb3dzIChpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIpOgotCi0gIDIwMDItMDQtMTMgbHBkIFJlbW92ZWQgc3VwcG9ydCBmb3Igbm9uLUFOU0kgY29tcGlsZXJzOyByZW1vdmVkCi0JcmVmZXJlbmNlcyB0byBHaG9zdHNjcmlwdDsgY2xhcmlmaWVkIGRlcml2YXRpb24gZnJvbSBSRkMgMTMyMTsKLQlub3cgaGFuZGxlcyBieXRlIG9yZGVyIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5LgotICAxOTk5LTExLTA0IGxwZCBFZGl0ZWQgY29tbWVudHMgc2xpZ2h0bHkgZm9yIGF1dG9tYXRpYyBUT0MgZXh0cmFjdGlvbi4KLSAgMTk5OS0xMC0xOCBscGQgRml4ZWQgdHlwbyBpbiBoZWFkZXIgY29tbWVudCAoYW5zaTJrbnIgcmF0aGVyIHRoYW4gbWQ1KTsKLQlhZGRlZCBjb25kaXRpb25hbGl6YXRpb24gZm9yIEMrKyBjb21waWxhdGlvbiBmcm9tIE1hcnRpbgotCVB1cnNjaGtlIDxwdXJzY2hrZUBibmwuZ292Pi4KLSAgMTk5OS0wNS0wMyBscGQgT3JpZ2luYWwgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIG1kNV9JTkNMVURFRAotIyAgZGVmaW5lIG1kNV9JTkNMVURFRAotCi0vKgotICogVGhpcyBwYWNrYWdlIHN1cHBvcnRzIGJvdGggY29tcGlsZS10aW1lIGFuZCBydW4tdGltZSBkZXRlcm1pbmF0aW9uIG9mIENQVQotICogYnl0ZSBvcmRlci4gIElmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBkZWZpbmVkIGFzIDAsIHRoZSBjb2RlIHdpbGwgYmUKLSAqIGNvbXBpbGVkIHRvIHJ1biBvbmx5IG9uIGxpdHRsZS1lbmRpYW4gQ1BVczsgaWYgQVJDSF9JU19CSUdfRU5ESUFOIGlzCi0gKiBkZWZpbmVkIGFzIG5vbi16ZXJvLCB0aGUgY29kZSB3aWxsIGJlIGNvbXBpbGVkIHRvIHJ1biBvbmx5IG9uIGJpZy1lbmRpYW4KLSAqIENQVXM7IGlmIEFSQ0hfSVNfQklHX0VORElBTiBpcyBub3QgZGVmaW5lZCwgdGhlIGNvZGUgd2lsbCBiZSBjb21waWxlZCB0bwotICogcnVuIG9uIGVpdGhlciBiaWctIG9yIGxpdHRsZS1lbmRpYW4gQ1BVcywgYnV0IHdpbGwgcnVuIHNsaWdodGx5IGxlc3MKLSAqIGVmZmljaWVudGx5IG9uIGVpdGhlciBvbmUgdGhhbiBpZiBBUkNIX0lTX0JJR19FTkRJQU4gaXMgZGVmaW5lZC4KLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgbWQ1X2J5dGVfdDsgLyogOC1iaXQgYnl0ZSAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgbWQ1X3dvcmRfdDsgLyogMzItYml0IHdvcmQgKi8KLQotLyogRGVmaW5lIHRoZSBzdGF0ZSBvZiB0aGUgTUQ1IEFsZ29yaXRobS4gKi8KLXR5cGVkZWYgc3RydWN0IG1kNV9zdGF0ZV9zIHsKLSAgICBtZDVfd29yZF90IGNvdW50WzJdOwkvKiBtZXNzYWdlIGxlbmd0aCBpbiBiaXRzLCBsc3cgZmlyc3QgKi8KLSAgICBtZDVfd29yZF90IGFiY2RbNF07CQkvKiBkaWdlc3QgYnVmZmVyICovCi0gICAgbWQ1X2J5dGVfdCBidWZbNjRdOwkJLyogYWNjdW11bGF0ZSBibG9jayAqLwotfSBtZDVfc3RhdGVfdDsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIAotewotI2VuZGlmCi0KLS8qIEluaXRpYWxpemUgdGhlIGFsZ29yaXRobS4gKi8KLXZvaWQgbWQ1X2luaXQobWQ1X3N0YXRlX3QgKnBtcyk7Ci0KLS8qIEFwcGVuZCBhIHN0cmluZyB0byB0aGUgbWVzc2FnZS4gKi8KLXZvaWQgbWQ1X2FwcGVuZChtZDVfc3RhdGVfdCAqcG1zLCBjb25zdCBtZDVfYnl0ZV90ICpkYXRhLCBpbnQgbmJ5dGVzKTsKLQotLyogRmluaXNoIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIGRpZ2VzdC4gKi8KLXZvaWQgbWQ1X2ZpbmlzaChtZDVfc3RhdGVfdCAqcG1zLCBtZDVfYnl0ZV90IGRpZ2VzdFsxNl0pOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8qIGVuZCBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIG1kNV9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS9wYXJzZS5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvcGFyc2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTU2NTIuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS9wYXJzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X3R5cGVkZWYuaCIKLQotI2luY2x1ZGUgIm1kNS5oIgotCi12b2lkIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gIHN0ZDo6c3RyaW5nIG1hdGVyaWFsID0gZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCk7Ci0gIG1kNV9zdGF0ZV90IGN0eDsKLSAgbWQ1X2luaXQoJmN0eCk7Ci0gIG1kNV9hcHBlbmQoJmN0eCwgKG1kNV9ieXRlX3QqKShtYXRlcmlhbC5kYXRhKCkpLCAoaW50KW1hdGVyaWFsLnNpemUoKSk7Ci0gIG1kNV9maW5pc2goJmN0eCwgKG1kNV9ieXRlX3QqKWZpbmdlcnByaW50Xyk7Ci19Ci0KLXRfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgewotICB0X3R5cGUqIHR5cGUgPSB0aGlzOwotICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKLSAgfQotICByZXR1cm4gdHlwZTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9iYXNlX3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2NzcyYi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfYmFzZV90eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfQkFTRV9UWVBFX0gKLSNkZWZpbmUgVF9CQVNFX1RZUEVfSAotCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotLyoqCi0gKiBBIHRocmlmdCBiYXNlIHR5cGUsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBkZWZpbmVkIGVudW1lcmF0ZWQgdHlwZXMgaW5zaWRlCi0gKiB0aGlzIGRlZmluaXRpb24uCi0gKgotICovCi1jbGFzcyB0X2Jhc2VfdHlwZSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgLyoqCi0gICAqIEVudW1lcmF0aW9uIG9mIHRocmlmdCBiYXNlIHR5cGVzCi0gICAqLwotICBlbnVtIHRfYmFzZSB7Ci0gICAgVFlQRV9WT0lELAotICAgIFRZUEVfU1RSSU5HLAotICAgIFRZUEVfQk9PTCwKLSAgICBUWVBFX0JZVEUsCi0gICAgVFlQRV9JMTYsCi0gICAgVFlQRV9JMzIsCi0gICAgVFlQRV9JNjQsCi0gICAgVFlQRV9ET1VCTEUKLSAgfTsKLQotICB0X2Jhc2VfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X2Jhc2UgYmFzZSkgOgotICAgIHRfdHlwZShuYW1lKSwKLSAgICBiYXNlXyhiYXNlKSwKLSAgICBzdHJpbmdfbGlzdF8oZmFsc2UpLAotICAgIGJpbmFyeV8oZmFsc2UpLAotICAgIHN0cmluZ19lbnVtXyhmYWxzZSl7fQotCi0gIHRfYmFzZSBnZXRfYmFzZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV87Ci0gIH0KLQotICBib29sIGlzX3ZvaWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJhc2VfID09IFRZUEVfVk9JRDsKLSAgfQotCi0gIGJvb2wgaXNfc3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORzsKLSAgfQotCi0gIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYmFzZV8gPT0gVFlQRV9CT09MOwotICB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nX2xpc3QoYm9vbCB2YWwpIHsKLSAgICBzdHJpbmdfbGlzdF8gPSB2YWw7Ci0gIH0KLQotICBib29sIGlzX3N0cmluZ19saXN0KCkgY29uc3QgewotICAgIHJldHVybiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpICYmIHN0cmluZ19saXN0XzsKLSAgfQotCi0gIHZvaWQgc2V0X2JpbmFyeShib29sIHZhbCkgewotICAgIGJpbmFyeV8gPSB2YWw7Ci0gIH0KLQotICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBiaW5hcnlfOwotICB9Ci0KLSAgdm9pZCBzZXRfc3RyaW5nX2VudW0oYm9vbCB2YWwpIHsKLSAgICBzdHJpbmdfZW51bV8gPSB2YWw7Ci0gIH0KLQotICBib29sIGlzX3N0cmluZ19lbnVtKCkgY29uc3QgewotICAgIHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORyAmJiBzdHJpbmdfZW51bV87Ci0gIH0KLQotICB2b2lkIGFkZF9zdHJpbmdfZW51bV92YWwoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgc3RyaW5nX2VudW1fdmFsc18ucHVzaF9iYWNrKHZhbCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9zdHJpbmdfZW51bV92YWxzKCkgY29uc3QgewotICAgIHJldHVybiBzdHJpbmdfZW51bV92YWxzXzsKLSAgfQotCi0gIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcnYgPSB0X2Jhc2VfbmFtZShiYXNlXyk7Ci0gICAgaWYgKHJ2ID09ICIodW5rbm93bikiKSB7Ci0gICAgICB0aHJvdyAiQlVHOiBDYW4ndCBnZXQgZmluZ2VycHJpbnQgbWF0ZXJpYWwgZm9yIHRoaXMgYmFzZSB0eXBlLiI7Ci0gICAgfQotICAgIHJldHVybiBydjsKLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyB0X2Jhc2VfbmFtZSh0X2Jhc2UgdGJhc2UpIHsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgICBjYXNlIFRZUEVfVk9JRCAgIDogcmV0dXJuICAgICAgInZvaWQiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9TVFJJTkcgOiByZXR1cm4gICAgInN0cmluZyI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0JPT0wgICA6IHJldHVybiAgICAgICJib29sIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfQllURSAgIDogcmV0dXJuICAgICAgImJ5dGUiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9JMTYgICAgOiByZXR1cm4gICAgICAgImkxNiI7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFX0kzMiAgICA6IHJldHVybiAgICAgICAiaTMyIjsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEVfSTY0ICAgIDogcmV0dXJuICAgICAgICJpNjQiOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRV9ET1VCTEUgOiByZXR1cm4gICAgImRvdWJsZSI7IGJyZWFrOwotICAgICAgZGVmYXVsdCAgICAgICAgICA6IHJldHVybiAiKHVua25vd24pIjsgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICB0X2Jhc2UgYmFzZV87Ci0KLSAgYm9vbCBzdHJpbmdfbGlzdF87Ci0gIGJvb2wgYmluYXJ5XzsKLSAgYm9vbCBzdHJpbmdfZW51bV87Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdfZW51bV92YWxzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2NvbnN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkODFiZC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlNUX0gKLSNkZWZpbmUgVF9DT05TVF9ICi0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0KLS8qKgotICogQSBjb25zdCBpcyBhIGNvbnN0YW50IHZhbHVlIGRlZmluZWQgYWNyb3NzIGxhbmd1YWdlcyB0aGF0IGhhcyBhIHR5cGUgYW5kCi0gKiBhIHZhbHVlLiBUaGUgdHJpY2sgaGVyZSBpcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIG1pZ2h0IG5vdCBtYXRjaCB0aGUgdHlwZQotICogb2YgdGhlIHZhbHVlIG9iamVjdCwgc2luY2UgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB1bnRpbCBhZnRlciBwYXJzaW5nIHRoZQotICogd2hvbGUgdGhpbmcgb3V0LgotICoKLSAqLwotY2xhc3MgdF9jb25zdCA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2NvbnN0KHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIDoKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKLX07Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29uc3RfdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQyMmFlLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb25zdF92YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0NPTlNUX1ZBTFVFX0gKLSNkZWZpbmUgVF9DT05TVF9WQUxVRV9ICi0KLSNpbmNsdWRlICJ0X2VudW0uaCIKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotLyoqCi0gKiBBIGNvbnN0IHZhbHVlIGlzIHNvbWV0aGluZyBwYXJzZWQgdGhhdCBjb3VsZCBiZSBhIG1hcCwgc2V0LCBsaXN0LCBzdHJ1Y3QKLSAqIG9yIHdoYXRldmVyLgotICoKLSAqLwotY2xhc3MgdF9jb25zdF92YWx1ZSB7Ci0gcHVibGljOgotCi0gIGVudW0gdF9jb25zdF92YWx1ZV90eXBlIHsKLSAgICBDVl9JTlRFR0VSLAotICAgIENWX0RPVUJMRSwKLSAgICBDVl9TVFJJTkcsCi0gICAgQ1ZfTUFQLAotICAgIENWX0xJU1QsCi0gICAgQ1ZfSURFTlRJRklFUgotICB9OwotCi0gIHRfY29uc3RfdmFsdWUoKSB7fQotCi0gIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIHsKLSAgICBzZXRfaW50ZWdlcih2YWwpOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZShzdGQ6OnN0cmluZyB2YWwpIHsKLSAgICBzZXRfc3RyaW5nKHZhbCk7Ci0gIH0KLQotICB2b2lkIHNldF9zdHJpbmcoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9TVFJJTkc7Ci0gICAgc3RyaW5nVmFsXyA9IHZhbDsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmluZ1ZhbF87Ci0gIH0KLQotICB2b2lkIHNldF9pbnRlZ2VyKGludDY0X3QgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9JTlRFR0VSOwotICAgIGludFZhbF8gPSB2YWw7Ci0gIH0KLQotICBpbnQ2NF90IGdldF9pbnRlZ2VyKCkgY29uc3QgewotICAgIGlmICh2YWxUeXBlXyA9PSBDVl9JREVOVElGSUVSKSB7Ci0gICAgICBpZiAoZW51bV8gPT0gTlVMTCkgewotICAgICAgICB0aHJvdyAiaGF2ZSBpZGVudGlmaWVyIFwiIiArIGdldF9pZGVudGlmaWVyKCkgKyAiXCIsIGJ1dCB1bnNldCBlbnVtIG9uIGxpbmUhIjsKLSAgICAgIH0KLSAgICAgIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXIgPSBnZXRfaWRlbnRpZmllcigpOwotICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBkb3QgPSBpZGVudGlmaWVyLnJmaW5kKCcuJyk7Ci0gICAgICBpZiAoZG90ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyLnN1YnN0cihkb3QrMSk7Ci0gICAgICB9Ci0gICAgICB0X2VudW1fdmFsdWUqIHZhbCA9IGVudW1fLT5nZXRfY29uc3RhbnRfYnlfbmFtZShpZGVudGlmaWVyKTsKLSAgICAgIGlmICh2YWwgPT0gTlVMTCkgewotICAgICAgICB0aHJvdwotICAgICAgICAgICJVbmFibGUgdG8gZmluZCBlbnVtIHZhbHVlIFwiIiArIGlkZW50aWZpZXIgKwotICAgICAgICAgICJcIiBpbiBlbnVtIFwiIiArIGVudW1fLT5nZXRfbmFtZSgpICsgIlwiIjsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWwtPmdldF92YWx1ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gaW50VmFsXzsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHNldF9kb3VibGUoZG91YmxlIHZhbCkgewotICAgIHZhbFR5cGVfID0gQ1ZfRE9VQkxFOwotICAgIGRvdWJsZVZhbF8gPSB2YWw7Ci0gIH0KLQotICBkb3VibGUgZ2V0X2RvdWJsZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZG91YmxlVmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X21hcCgpIHsKLSAgICB2YWxUeXBlXyA9IENWX01BUDsKLSAgfQotCi0gIHZvaWQgYWRkX21hcCh0X2NvbnN0X3ZhbHVlKiBrZXksIHRfY29uc3RfdmFsdWUqIHZhbCkgewotICAgIG1hcFZhbF9ba2V5XSA9IHZhbDsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIGdldF9tYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1hcFZhbF87Ci0gIH0KLQotICB2b2lkIHNldF9saXN0KCkgewotICAgIHZhbFR5cGVfID0gQ1ZfTElTVDsKLSAgfQotCi0gIHZvaWQgYWRkX2xpc3QodF9jb25zdF92YWx1ZSogdmFsKSB7Ci0gICAgbGlzdFZhbF8ucHVzaF9iYWNrKHZhbCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGdldF9saXN0KCkgY29uc3QgewotICAgIHJldHVybiBsaXN0VmFsXzsKLSAgfQotCi0gIHZvaWQgc2V0X2lkZW50aWZpZXIoc3RkOjpzdHJpbmcgdmFsKSB7Ci0gICAgdmFsVHlwZV8gPSBDVl9JREVOVElGSUVSOwotICAgIGlkZW50aWZpZXJWYWxfID0gdmFsOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGlkZW50aWZpZXJWYWxfOwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfbmFtZSgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyByZXQgPSBnZXRfaWRlbnRpZmllcigpOwotICAgIHNpemVfdCBzID0gcmV0LmZpbmQoJy4nKTsKLSAgICBpZiAocyA9PSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgdGhyb3cgImVycm9yOiBpZGVudGlmaWVyICIgKyByZXQgKyAiIGlzIHVucXVhbGlmaWVkISI7Ci0gICAgfQotICAgIHJldCA9IHJldC5zdWJzdHIocysxKTsKLSAgICBzID0gcmV0LmZpbmQoJy4nKTsKLSAgICBpZiAocyAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewotICAgICAgcmV0ID0gcmV0LnN1YnN0cihzKzEpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKLSAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7Ci0gICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOwotICAgIH0KLSAgICBzaXplX3QgczIgPSByZXQuZmluZCgnLicsIHMrMSk7Ci0gICAgaWYgKHMyICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICByZXQgPSByZXQuc3Vic3RyKHMrMSk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICB2b2lkIHNldF9lbnVtKHRfZW51bSogdGVudW0pIHsKLSAgICBlbnVtXyA9IHRlbnVtOwotICB9Ci0KLSAgdF9jb25zdF92YWx1ZV90eXBlIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB2YWxUeXBlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXBWYWxfOwotICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdFZhbF87Ci0gIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbF87Ci0gIGludDY0X3QgaW50VmFsXzsKLSAgZG91YmxlIGRvdWJsZVZhbF87Ci0gIHN0ZDo6c3RyaW5nIGlkZW50aWZpZXJWYWxfOwotICB0X2VudW0qIGVudW1fOwotCi0gIHRfY29uc3RfdmFsdWVfdHlwZSB2YWxUeXBlXzsKLQotfTsKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9jb250YWluZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1MzQ5My4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9DT05UQUlORVJfSAotI2RlZmluZSBUX0NPTlRBSU5FUl9ICi0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLQotY2xhc3MgdF9jb250YWluZXIgOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfY29udGFpbmVyKCkgOgotICAgIGNwcF9uYW1lXygpLAotICAgIGhhc19jcHBfbmFtZV8oZmFsc2UpIHt9Ci0KLSAgdmlydHVhbCB+dF9jb250YWluZXIoKSB7fQotCi0gIHZvaWQgc2V0X2NwcF9uYW1lKHN0ZDo6c3RyaW5nIGNwcF9uYW1lKSB7Ci0gICAgY3BwX25hbWVfID0gY3BwX25hbWU7Ci0gICAgaGFzX2NwcF9uYW1lXyA9IHRydWU7Ci0gIH0KLQotICBib29sIGhhc19jcHBfbmFtZSgpIHsKLSAgICByZXR1cm4gaGFzX2NwcF9uYW1lXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9jcHBfbmFtZSgpIHsKLSAgICByZXR1cm4gY3BwX25hbWVfOwotICB9Ci0KLSAgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c3RyaW5nIGNwcF9uYW1lXzsKLSAgYm9vbCBoYXNfY3BwX25hbWVfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9kb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMDY4Yy4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZG9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9ET0NfSAotI2RlZmluZSBUX0RPQ19ICi0KLS8qKgotICogRG9jdW1lbnRhdGlvbiBzdHVicwotICoKLSAqLwotY2xhc3MgdF9kb2MgewotCi0gcHVibGljOgotICB0X2RvYygpIDogaGFzX2RvY18oZmFsc2UpIHt9Ci0KLSAgdm9pZCBzZXRfZG9jKGNvbnN0IHN0ZDo6c3RyaW5nJiBkb2MpIHsKLSAgICBkb2NfID0gZG9jOwotICAgIGhhc19kb2NfID0gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfZG9jKCkgY29uc3QgewotICAgIHJldHVybiBkb2NfOwotICB9Ci0KLSAgYm9vbCBoYXNfZG9jKCkgewotICAgIHJldHVybiBoYXNfZG9jXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgZG9jXzsKLSAgYm9vbCBoYXNfZG9jXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMTYwNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZW51bS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfRU5VTV9ICi0jZGVmaW5lIFRfRU5VTV9ICi0KLSNpbmNsdWRlICJ0X2VudW1fdmFsdWUuaCIKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLS8qKgotICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCi0gKgotICovCi1jbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKLSBwdWJsaWM6Ci0gIHRfZW51bSh0X3Byb2dyYW0qIHByb2dyYW0pIDoKLSAgICB0X3R5cGUocHJvZ3JhbSkge30KLQotICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdm9pZCBhcHBlbmQodF9lbnVtX3ZhbHVlKiBjb25zdGFudCkgewotICAgIGNvbnN0YW50c18ucHVzaF9iYWNrKGNvbnN0YW50KTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBnZXRfY29uc3RhbnRzKCkgewotICAgIHJldHVybiBjb25zdGFudHNfOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWUpIHsKLSAgICAgICAgcmV0dXJuICpjX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfdmFsdWUoaW50NjRfdCB2YWx1ZSkgewotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKLSAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkgPT0gdmFsdWUpIHsKLSAgICAgICAgcmV0dXJuICpjX2l0ZXI7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgYm9vbCBpc19lbnVtKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuICJlbnVtIjsKLSAgfQotCi0gIHZvaWQgcmVzb2x2ZV92YWx1ZXMoKSB7Ci0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOwotICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgaW50IGxhc3RWYWx1ZSA9IC0xOwotICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgewotICAgICAgaWYgKCEgKCpjX2l0ZXIpLT5oYXNfdmFsdWUoKSkgewotICAgICAgICAoKmNfaXRlciktPnNldF92YWx1ZSgrK2xhc3RWYWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBsYXN0VmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGE5MGEuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2VudW1fdmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0VOVU1fVkFMVUVfSAotI2RlZmluZSBUX0VOVU1fVkFMVUVfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLS8qKgotICogQSBjb25zdGFudC4gVGhlc2UgYXJlIHVzZWQgaW5zaWRlIG9mIGVudW0gZGVmaW5pdGlvbnMuIENvbnN0YW50cyBhcmUganVzdAotICogc3ltYm9sIGlkZW50aWZpZXJzIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBleHBsaWNpdCB2YWx1ZSBhc3NvY2lhdGVkCi0gKiB3aXRoIHRoZW0uCi0gKgotICovCi1jbGFzcyB0X2VudW1fdmFsdWUgOiBwdWJsaWMgdF9kb2MgewotIHB1YmxpYzoKLSAgdF9lbnVtX3ZhbHVlKHN0ZDo6c3RyaW5nIG5hbWUpIDoKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBoYXNfdmFsdWVfKGZhbHNlKSwKLSAgICB2YWx1ZV8oMCkge30KLQotICB0X2VudW1fdmFsdWUoc3RkOjpzdHJpbmcgbmFtZSwgaW50IHZhbHVlKSA6Ci0gICAgbmFtZV8obmFtZSksCi0gICAgaGFzX3ZhbHVlXyh0cnVlKSwKLSAgICB2YWx1ZV8odmFsdWUpIHt9Ci0KLSAgfnRfZW51bV92YWx1ZSgpIHt9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIGJvb2wgaGFzX3ZhbHVlKCkgewotICAgIHJldHVybiBoYXNfdmFsdWVfOwotICB9Ci0KLSAgaW50IGdldF92YWx1ZSgpIHsKLSAgICByZXR1cm4gdmFsdWVfOwotICB9Ci0KLSAgdm9pZCBzZXRfdmFsdWUoaW50IHZhbCkgewotICAgIGhhc192YWx1ZV8gPSB0cnVlOwotICAgIHZhbHVlXyA9IHZhbDsKLSAgfQotCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOwotCi0gcHJpdmF0ZToKLSAgc3RkOjpzdHJpbmcgbmFtZV87Ci0gIGJvb2wgaGFzX3ZhbHVlXzsKLSAgaW50IHZhbHVlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxMGQ1Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9GSUVMRF9ICi0jZGVmaW5lIFRfRklFTERfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycwotY2xhc3MgdF9zdHJ1Y3Q7Ci0KLS8qKgotICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKLSAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgotICoKLSAqLwotY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIHR5cGVfKHR5cGUpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIGtleV8oMCksCi0gICAgdmFsdWVfKE5VTEwpLAotICAgIHhzZF9vcHRpb25hbF8oZmFsc2UpLAotICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAotICAgIHhzZF9hdHRyc18oTlVMTCkge30KLQotICB0X2ZpZWxkKHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgaW50MzJfdCBrZXkpIDoKLSAgICB0eXBlXyh0eXBlKSwKLSAgICBuYW1lXyhuYW1lKSwKLSAgICBrZXlfKGtleSksCi0gICAgcmVxXyhUX09QVF9JTl9SRVFfT1VUKSwKLSAgICB2YWx1ZV8oTlVMTCksCi0gICAgeHNkX29wdGlvbmFsXyhmYWxzZSksCi0gICAgeHNkX25pbGxhYmxlXyhmYWxzZSksCi0gICAgeHNkX2F0dHJzXyhOVUxMKSB7fQotCi0gIH50X2ZpZWxkKCkge30KLQotICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotICBpbnQzMl90IGdldF9rZXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV87Ci0gIH0KLQotICBlbnVtIGVfcmVxIHsKLSAgICBUX1JFUVVJUkVELAotICAgIFRfT1BUSU9OQUwsCi0gICAgVF9PUFRfSU5fUkVRX09VVAotICB9OwotCi0gIHZvaWQgc2V0X3JlcShlX3JlcSByZXEpIHsKLSAgICByZXFfID0gcmVxOwotICB9Ci0KLSAgZV9yZXEgZ2V0X3JlcSgpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVxXzsKLSAgfQotCi0gIHZvaWQgc2V0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7Ci0gICAgdmFsdWVfID0gdmFsdWU7Ci0gIH0KLQotICB0X2NvbnN0X3ZhbHVlKiBnZXRfdmFsdWUoKSB7Ci0gICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9vcHRpb25hbChib29sIHhzZF9vcHRpb25hbCkgewotICAgIHhzZF9vcHRpb25hbF8gPSB4c2Rfb3B0aW9uYWw7Ci0gIH0KLQotICBib29sIGdldF94c2Rfb3B0aW9uYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHhzZF9vcHRpb25hbF87Ci0gIH0KLQotICB2b2lkIHNldF94c2RfbmlsbGFibGUoYm9vbCB4c2RfbmlsbGFibGUpIHsKLSAgICB4c2RfbmlsbGFibGVfID0geHNkX25pbGxhYmxlOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX25pbGxhYmxlKCkgY29uc3QgewotICAgIHJldHVybiB4c2RfbmlsbGFibGVfOwotICB9Ci0KLSAgdm9pZCBzZXRfeHNkX2F0dHJzKHRfc3RydWN0KiB4c2RfYXR0cnMpIHsKLSAgICB4c2RfYXR0cnNfID0geHNkX2F0dHJzOwotICB9Ci0KLSAgdF9zdHJ1Y3QqIGdldF94c2RfYXR0cnMoKSB7Ci0gICAgcmV0dXJuIHhzZF9hdHRyc187Ci0gIH0KLQotICAvLyBUaGlzIGlzIG5vdCB0aGUgc2FtZSBmdW5jdGlvbiBhcyB0X3R5cGU6OmdldF9maW5nZXJwcmludF9tYXRlcmlhbCwKLSAgLy8gYnV0IGl0IGRvZXMgdGhlIHNhbWUgdGhpbmcuCi0gIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0ga2V5c3RtOwotICAgIGtleXN0bSA8PCBrZXlfOwotICAgIHJldHVybiBrZXlzdG0uc3RyKCkgKyAiOiIgKwotICAgICAgKChyZXFfID09IFRfT1BUSU9OQUwpID8gIm9wdC0iIDogIiIpICsKLSAgICAgIHR5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCi0gICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KLSAgICogVGhlIGFyZ3VtZW50cyBhcmUgKGNvbnN0KSByZWZlcmVuY2VzIHRvIGNvbnN0IHBvaW50ZXJzIHRvIGNvbnN0IHRfZmllbGRzLgotICAgKi8KLSAgc3RydWN0IGtleV9jb21wYXJlIHsKLSAgICBib29sIG9wZXJhdG9yKCkodF9maWVsZCBjb25zdCAqIGNvbnN0ICYgYSwgdF9maWVsZCBjb25zdCAqIGNvbnN0ICYgYikgewotICAgICAgcmV0dXJuIGEtPmdldF9rZXkoKSA8IGItPmdldF9rZXkoKTsKLSAgICB9Ci0gIH07Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgaW50MzJfdCBrZXlfOwotICBlX3JlcSByZXFfOwotICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Ci0KLSAgYm9vbCB4c2Rfb3B0aW9uYWxfOwotICBib29sIHhzZF9uaWxsYWJsZV87Ci0gIHRfc3RydWN0KiB4c2RfYXR0cnNfOwotCi19OwotCi0vKioKLSAqIEEgc2ltcGxlIHN0cnVjdCBmb3IgdGhlIHBhcnNlciB0byB1c2UgdG8gc3RvcmUgYSBmaWVsZCBJRCwgYW5kIHdoZXRoZXIgb3IKLSAqIG5vdCBpdCB3YXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIG9yIGF1dG9tYXRpY2FsbHkgY2hvc2VuLgotICovCi1zdHJ1Y3QgdF9maWVsZF9pZCB7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIGJvb2wgYXV0b19hc3NpZ25lZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2Z1bmN0aW9uLmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhMmZkNi4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfZnVuY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX0ZVTkNUSU9OX0gKLSNkZWZpbmUgVF9GVU5DVElPTl9ICi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSAidF90eXBlLmgiCi0jaW5jbHVkZSAidF9zdHJ1Y3QuaCIKLSNpbmNsdWRlICJ0X2RvYy5oIgotCi0vKioKLSAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZnVuY3Rpb24uIEtleSBwYXJ0cyBhcmUgcmV0dXJuIHR5cGUsIGZ1bmN0aW9uIG5hbWUsCi0gKiBvcHRpb25hbCBtb2RpZmllcnMsIGFuZCBhbiBhcmd1bWVudCBsaXN0LCB3aGljaCBpcyBpbXBsZW1lbnRlZCBhcyBhIHRocmlmdAotICogc3RydWN0LgotICoKLSAqLwotY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwKLSAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAotICAgICAgICAgICAgIHRfc3RydWN0KiBhcmdsaXN0LAotICAgICAgICAgICAgIGJvb2wgb25ld2F5PWZhbHNlKSA6Ci0gICAgcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgYXJnbGlzdF8oYXJnbGlzdCksCi0gICAgb25ld2F5XyhvbmV3YXkpIHsKLSAgICB4Y2VwdGlvbnNfID0gbmV3IHRfc3RydWN0KE5VTEwpOwotICB9Ci0KLSAgdF9mdW5jdGlvbih0X3R5cGUqIHJldHVybnR5cGUsCi0gICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICB0X3N0cnVjdCogYXJnbGlzdCwKLSAgICAgICAgICAgICB0X3N0cnVjdCogeGNlcHRpb25zLAotICAgICAgICAgICAgIGJvb2wgb25ld2F5PWZhbHNlKSA6Ci0gICAgcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCi0gICAgbmFtZV8obmFtZSksCi0gICAgYXJnbGlzdF8oYXJnbGlzdCksCi0gICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAotICAgIG9uZXdheV8ob25ld2F5KQotICB7Ci0gICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgewotICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7Ci0gICAgfQotICB9Ci0KLSAgfnRfZnVuY3Rpb24oKSB7fQotCi0gIHRfdHlwZSogZ2V0X3JldHVybnR5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJldHVybnR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgewotICAgIHJldHVybiBuYW1lXzsKLSAgfQotCi0gIHRfc3RydWN0KiBnZXRfYXJnbGlzdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gYXJnbGlzdF87Ci0gIH0KLQotICB0X3N0cnVjdCogZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4geGNlcHRpb25zXzsKLSAgfQotCi0gIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgewotICAgIHJldHVybiBvbmV3YXlfOwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIHJldHVybnR5cGVfOwotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOwotICB0X3N0cnVjdCogeGNlcHRpb25zXzsKLSAgYm9vbCBvbmV3YXlfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhOTYyNS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfTElTVF9ICi0jZGVmaW5lIFRfTElTVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KLSAqCi0gKi8KLWNsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X2xpc3QodF90eXBlKiBlbGVtX3R5cGUpIDoKLSAgICBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGVsZW1fdHlwZV87Ci0gIH0KLQotICBib29sIGlzX2xpc3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gImxpc3Q8IiArIGVsZW1fdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsgIj4iOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCkgewotICAgIHRfdHlwZTo6Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICBlbGVtX3R5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICB9Ci0KLSBwcml2YXRlOgotICB0X3R5cGUqIGVsZW1fdHlwZV87Ci19OwotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGUzNThmLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX01BUF9ICi0jZGVmaW5lIFRfTUFQX0gKLQotI2luY2x1ZGUgInRfY29udGFpbmVyLmgiCi0KLS8qKgotICogQSBtYXAgaXMgYSBsaWdodHdlaWdodCBjb250YWluZXIgdHlwZSB0aGF0IGp1c3Qgd3JhcHMgYW5vdGhlciB0d28gZGF0YQotICogdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X21hcCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7Ci0gcHVibGljOgotICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6Ci0gICAga2V5X3R5cGVfKGtleV90eXBlKSwKLSAgICB2YWxfdHlwZV8odmFsX3R5cGUpIHt9Ci0KLSAgdF90eXBlKiBnZXRfa2V5X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGtleV90eXBlXzsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgewotICAgIHJldHVybiB2YWxfdHlwZV87Ci0gIH0KLQotICBib29sIGlzX21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAibWFwPCIgKyBrZXlfdHlwZV8tPmdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpICsKLSAgICAgICIsIiArIHZhbF90eXBlXy0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgKyAiPiI7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIGtleV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgICB2YWxfdHlwZV8tPmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHRfdHlwZSoga2V5X3R5cGVfOwotICB0X3R5cGUqIHZhbF90eXBlXzsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTQ3ZDAuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9QUk9HUkFNX0gKLSNkZWZpbmUgVF9QUk9HUkFNX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0vLyBGb3IgcHJvZ3JhbV9uYW1lKCkKLSNpbmNsdWRlICJtYWluLmgiCi0KLSNpbmNsdWRlICJ0X2RvYy5oIgotI2luY2x1ZGUgInRfc2NvcGUuaCIKLSNpbmNsdWRlICJ0X2Jhc2VfdHlwZS5oIgotI2luY2x1ZGUgInRfdHlwZWRlZi5oIgotI2luY2x1ZGUgInRfZW51bS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X3N0cnVjdC5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotI2luY2x1ZGUgInRfbWFwLmgiCi0jaW5jbHVkZSAidF9zZXQuaCIKLSNpbmNsdWRlICJnZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgotLy8jaW5jbHVkZSAidF9kb2MuaCIKLQotLyoqCi0gKiBUb3AgbGV2ZWwgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGVudGlyZSB0aHJpZnQgcHJvZ3JhbS4gQSBwcm9ncmFtIGNvbnNpc3RzCi0gKiBmdW5kYW1lbnRhbGx5IG9mIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogICBUeXBlZGVmcwotICogICBFbnVtZXJhdGlvbnMKLSAqICAgQ29uc3RhbnRzCi0gKiAgIFN0cnVjdHMKLSAqICAgRXhjZXB0aW9ucwotICogICBTZXJ2aWNlcwotICoKLSAqIFRoZSBwcm9ncmFtIG1vZHVsZSBhbHNvIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYmFzZSB0eXBlcy4KLSAqCi0gKi8KLWNsYXNzIHRfcHJvZ3JhbSA6IHB1YmxpYyB0X2RvYyB7Ci0gcHVibGljOgotICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgbmFtZSkgOgotICAgIHBhdGhfKHBhdGgpLAotICAgIG5hbWVfKG5hbWUpLAotICAgIG91dF9wYXRoXygiLi8iKSwKLSAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpIHsKLSAgICBzY29wZV8gPSBuZXcgdF9zY29wZSgpOwotICB9Ci0KLSAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDoKLSAgICBwYXRoXyhwYXRoKSwKLSAgICBvdXRfcGF0aF8oIi4vIiksCi0gICAgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7Ci0gICAgbmFtZV8gPSBwcm9ncmFtX25hbWUocGF0aCk7Ci0gICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKLSAgfQotCi0gIC8vIFBhdGggYWNjZXNzb3IKLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9wYXRoKCkgY29uc3QgeyByZXR1cm4gcGF0aF87IH0KLQotICAvLyBPdXRwdXQgcGF0aCBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X291dF9wYXRoKCkgY29uc3QgeyByZXR1cm4gb3V0X3BhdGhfOyB9Ci0KLSAgLy8gQ3JlYXRlIGdlbi0qIGRpciBhY2Nlc3NvcgotICBib29sIGlzX291dF9wYXRoX2Fic29sdXRlKCkgeyByZXR1cm4gb3V0X3BhdGhfaXNfYWJzb2x1dGVfOyB9Ci0KLSAgLy8gTmFtZSBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQotCi0gIC8vIE5hbWVzcGFjZQotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVzcGFjZV87IH0KLQotICAvLyBJbmNsdWRlIHByZWZpeCBhY2Nlc3NvcgotICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X2luY2x1ZGVfcHJlZml4KCkgY29uc3QgeyByZXR1cm4gaW5jbHVkZV9wcmVmaXhfOyB9Ci0KLSAgLy8gQWNjZXNzb3JzIGZvciBwcm9ncmFtIGVsZW1lbnRzCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfdHlwZWRlZio+JiBnZXRfdHlwZWRlZnMoKSAgY29uc3QgeyByZXR1cm4gdHlwZWRlZnNfOyAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgICAgZ2V0X2VudW1zKCkgICAgIGNvbnN0IHsgcmV0dXJuIGVudW1zXzsgICAgIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdCo+JiAgIGdldF9jb25zdHMoKSAgICBjb25zdCB7IHJldHVybiBjb25zdHNfOyAgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4mICBnZXRfc3RydWN0cygpICAgY29uc3QgeyByZXR1cm4gc3RydWN0c187ICAgfQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiAgZ2V0X3hjZXB0aW9ucygpIGNvbnN0IHsgcmV0dXJuIHhjZXB0aW9uc187IH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgIGdldF9vYmplY3RzKCkgICBjb25zdCB7IHJldHVybiBvYmplY3RzXzsgICB9Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBnZXRfc2VydmljZXMoKSAgY29uc3QgeyByZXR1cm4gc2VydmljZXNfOyAgfQotCi0gIC8vIFByb2dyYW0gZWxlbWVudHMKLSAgdm9pZCBhZGRfdHlwZWRlZiAgKHRfdHlwZWRlZiogdGQpIHsgdHlwZWRlZnNfLnB1c2hfYmFjayh0ZCk7ICB9Ci0gIHZvaWQgYWRkX2VudW0gICAgICh0X2VudW0qICAgIHRlKSB7IGVudW1zXy5wdXNoX2JhY2sodGUpOyAgICAgfQotICB2b2lkIGFkZF9jb25zdCAgICAodF9jb25zdCogICB0YykgeyBjb25zdHNfLnB1c2hfYmFjayh0Yyk7ICAgIH0KLSAgdm9pZCBhZGRfc3RydWN0ICAgKHRfc3RydWN0KiAgdHMpIHsgb2JqZWN0c18ucHVzaF9iYWNrKHRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0c18ucHVzaF9iYWNrKHRzKTsgICB9Ci0gIHZvaWQgYWRkX3hjZXB0aW9uICh0X3N0cnVjdCogIHR4KSB7IG9iamVjdHNfLnB1c2hfYmFjayh0eCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjZXB0aW9uc18ucHVzaF9iYWNrKHR4KTsgfQotICB2b2lkIGFkZF9zZXJ2aWNlICAodF9zZXJ2aWNlKiB0cykgeyBzZXJ2aWNlc18ucHVzaF9iYWNrKHRzKTsgIH0KLQotICAvLyBQcm9ncmFtcyB0byBpbmNsdWRlCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlc187IH0KLQotICB2b2lkIHNldF9vdXRfcGF0aChzdGQ6OnN0cmluZyBvdXRfcGF0aCwgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSkgewotICAgIG91dF9wYXRoXyA9IG91dF9wYXRoOwotICAgIG91dF9wYXRoX2lzX2Fic29sdXRlXyA9IG91dF9wYXRoX2lzX2Fic29sdXRlOwotICAgIC8vIEVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBhIHRyYWlsaW5nICcvJyAob3IgJ1wnIGZvciB3aW5kb3dzIG1hY2hpbmVzKQotICAgIGNoYXIgYyA9IG91dF9wYXRoXy5hdChvdXRfcGF0aF8uc2l6ZSgpIC0gMSk7Ci0gICAgaWYgKCEoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSkgewotICAgICAgb3V0X3BhdGhfLnB1c2hfYmFjaygnLycpOwotICAgIH0KLSAgfQotCi0gIC8vIFNjb3BpbmcgYW5kIG5hbWVzcGFjaW5nCi0gIHZvaWQgc2V0X25hbWVzcGFjZShzdGQ6OnN0cmluZyBuYW1lKSB7Ci0gICAgbmFtZXNwYWNlXyA9IG5hbWU7Ci0gIH0KLQotICAvLyBTY29wZSBhY2Nlc3NvcgotICB0X3Njb3BlKiBzY29wZSgpIHsKLSAgICByZXR1cm4gc2NvcGVfOwotICB9Ci0KLSAgLy8gSW5jbHVkZXMKLQotICB2b2lkIGFkZF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgsIHN0ZDo6c3RyaW5nIGluY2x1ZGVfc2l0ZSkgewotICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCk7Ci0KLSAgICAvLyBpbmNsdWRlIHByZWZpeCBmb3IgdGhpcyBwcm9ncmFtIGlzIHRoZSBzaXRlIGF0IHdoaWNoIGl0IHdhcyBpbmNsdWRlZAotICAgIC8vIChtaW51cyB0aGUgZmlsZW5hbWUpCi0gICAgc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXg7Ci0gICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3NsYXNoID0gc3RkOjpzdHJpbmc6Om5wb3M7Ci0gICAgaWYgKChsYXN0X3NsYXNoID0gaW5jbHVkZV9zaXRlLnJmaW5kKCIvIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICBpbmNsdWRlX3ByZWZpeCA9IGluY2x1ZGVfc2l0ZS5zdWJzdHIoMCwgbGFzdF9zbGFzaCk7Ci0gICAgfQotCi0gICAgcHJvZ3JhbS0+c2V0X2luY2x1ZGVfcHJlZml4KGluY2x1ZGVfcHJlZml4KTsKLSAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj4mIGdldF9pbmNsdWRlcygpIHsKLSAgICByZXR1cm4gaW5jbHVkZXNfOwotICB9Ci0KLSAgdm9pZCBzZXRfaW5jbHVkZV9wcmVmaXgoc3RkOjpzdHJpbmcgaW5jbHVkZV9wcmVmaXgpIHsKLSAgICBpbmNsdWRlX3ByZWZpeF8gPSBpbmNsdWRlX3ByZWZpeDsKLQotICAgIC8vIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSBkaXJlY3Rvcnk7IGFkZCBhIHRyYWlsaW5nIHNsYXNoIGlmIG5lY2Vzc2FyeQotICAgIGludCBsZW4gPSBpbmNsdWRlX3ByZWZpeF8uc2l6ZSgpOwotICAgIGlmIChsZW4gPiAwICYmIGluY2x1ZGVfcHJlZml4X1tsZW4gLSAxXSAhPSAnLycpIHsKLSAgICAgIGluY2x1ZGVfcHJlZml4XyArPSAnLyc7Ci0gICAgfQotICB9Ci0KLSAgLy8gTGFuZ3VhZ2UgbmV1dHJhbCBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKLSAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6OnN0cmluZyBuYW1lX3NwYWNlKSB7Ci0gICAgaWYgKGxhbmd1YWdlICE9ICIqIikgewotICAgICAgc2l6ZV90IHN1Yl9pbmRleCA9IGxhbmd1YWdlLmZpbmQoJy4nKTsKLSAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zdWJzdHIoMCwgc3ViX2luZGV4KTsKLSAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2U7Ci0KLSAgICAgIGlmKGJhc2VfbGFuZ3VhZ2UgPT0gInNtYWxsdGFsayIpIHsKLSAgICAgICAgcHdhcm5pbmcoMSwgIk5hbWVzcGFjZSAnc21hbGx0YWxrJyBpcyBkZXByZWNhdGVkLiBVc2UgJ3N0JyBpbnN0ZWFkIik7Ci0gICAgICAgIGJhc2VfbGFuZ3VhZ2UgPSAic3QiOwotICAgICAgfQotCi0gICAgICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90IG15X2NvcHkgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcl9tYXAoKTsKLQotICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdDo6aXRlcmF0b3IgaXQ7Ci0gICAgICBpdD1teV9jb3B5LmZpbmQoYmFzZV9sYW5ndWFnZSk7Ci0KLSAgICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSAiTm8gZ2VuZXJhdG9yIG5hbWVkICciICsgYmFzZV9sYW5ndWFnZSArICInIGNvdWxkIGJlIGZvdW5kISI7Ci0gICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoc3ViX2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZSA9IGxhbmd1YWdlLnN1YnN0cihzdWJfaW5kZXgrMSk7Ci0gICAgICAgICAgaWYgKCAhIGl0LT5zZWNvbmQtPmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKSkgewotICAgICAgICAgICAgdGhyb3cgYmFzZV9sYW5ndWFnZSArICIgZ2VuZXJhdG9yIGRvZXMgbm90IGFjY2VwdCAnIiArIHN1Yl9uYW1lc3BhY2UgKyAiJyBhcyBzdWItbmFtZXNwYWNlISI7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbmFtZXNwYWNlc19bbGFuZ3VhZ2VdID0gbmFtZV9zcGFjZTsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIGdldF9uYW1lc3BhY2Uoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UpIGNvbnN0IHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICAgIGlmICgoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQobGFuZ3VhZ2UpKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSB8fAotICAgICAgICAoaXRlciA9IG5hbWVzcGFjZXNfLmZpbmQoIioiICAgICApKSAhPSBuYW1lc3BhY2VzXy5lbmQoKSkgewotICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Ci0gIH0KLQotICAvLyBMYW5ndWFnZSBzcGVjaWZpYyBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKLQotICB2b2lkIGFkZF9jcHBfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoKSB7Ci0gICAgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGNwcF9pbmNsdWRlc187Ci0gIH0KLQotICB2b2lkIGFkZF9jX2luY2x1ZGUoc3RkOjpzdHJpbmcgcGF0aCkgewotICAgIGNfaW5jbHVkZXNfLnB1c2hfYmFjayhwYXRoKTsKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZ2V0X2NfaW5jbHVkZXMoKSB7Ci0gICAgcmV0dXJuIGNfaW5jbHVkZXNfOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIC8vIEZpbGUgcGF0aAotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICAvLyBOYW1lCi0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkKLSAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOwotCi0gIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQotICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKLQotICAvLyBOYW1lc3BhY2UKLSAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKLQotICAvLyBJbmNsdWRlZCBwcm9ncmFtcwotICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187Ci0KLSAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55Ci0gIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKLQotICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQotICB0X3Njb3BlKiBzY29wZV87Ci0KLSAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgotICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187Ci0gIHN0ZDo6dmVjdG9yPHRfZW51bSo+ICAgIGVudW1zXzsKLSAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+ICAgY29uc3RzXzsKLSAgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiAgb2JqZWN0c187Ci0gIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gIHN0cnVjdHNfOwotICBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+ICB4Y2VwdGlvbnNfOwotICBzdGQ6OnZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlc187Ci0KLSAgLy8gRHluYW1pYyBuYW1lc3BhY2VzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbmFtZXNwYWNlc187Ci0KLSAgLy8gQysrIGV4dHJhIGluY2x1ZGVzCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjcHBfaW5jbHVkZXNfOwotCi0gIC8vIEMgZXh0cmEgaW5jbHVkZXMKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNfaW5jbHVkZXNfOwotCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTdiZjguLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Njb3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0NPUEVfSAotI2RlZmluZSBUX1NDT1BFX0gKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLQotI2luY2x1ZGUgInRfdHlwZS5oIgotI2luY2x1ZGUgInRfc2VydmljZS5oIgotI2luY2x1ZGUgInRfY29uc3QuaCIKLSNpbmNsdWRlICJ0X2NvbnN0X3ZhbHVlLmgiCi0jaW5jbHVkZSAidF9iYXNlX3R5cGUuaCIKLSNpbmNsdWRlICJ0X21hcC5oIgotI2luY2x1ZGUgInRfbGlzdC5oIgotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBhIHZhcmlhYmxlIHNjb3BlIHVzZWQgZm9yIGxvb2tpbmcgdXAgcHJlZGVmaW5lZCB0eXBlcyBhbmQKLSAqIHNlcnZpY2VzLiBUeXBpY2FsbHksIGEgc2NvcGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdF9wcm9ncmFtLiBTY29wZXMgYXJlIG5vdAotICogdXNlZCB0byBkZXRlcm1pbmUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmF0aGVyIHRvIHJlc29sdmUgaWRlbnRpZmllcnMgYXQKLSAqIHBhcnNlIHRpbWUuCi0gKgotICovCi1jbGFzcyB0X3Njb3BlIHsKLSBwdWJsaWM6Ci0gIHRfc2NvcGUoKSB7fQotCi0gIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7Ci0gICAgdHlwZXNfW25hbWVdID0gdHlwZTsKLSAgfQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiB0eXBlc19bbmFtZV07Ci0gIH0KLQotICB2b2lkIGFkZF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUsIHRfc2VydmljZSogc2VydmljZSkgewotICAgIHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gc2VydmljZXNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBhZGRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdCogY29uc3RhbnQpIHsKLSAgICBpZiAoY29uc3RhbnRzXy5maW5kKG5hbWUpICE9IGNvbnN0YW50c18uZW5kKCkpIHsKLSAgICAgIHRocm93ICJFbnVtICIgKyBuYW1lICsgIiBpcyBhbHJlYWR5IGRlZmluZWQhIjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3RhbnRzX1tuYW1lXSA9IGNvbnN0YW50OwotICAgIH0KLQkJICAgCi0gIH0KLQotICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBjb25zdGFudHNfW25hbWVdOwotICB9Ci0KLSAgdm9pZCBwcmludCgpIHsKLSAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj46Oml0ZXJhdG9yIGl0ZXI7Ci0gICAgZm9yIChpdGVyID0gdHlwZXNfLmJlZ2luKCk7IGl0ZXIgIT0gdHlwZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJXMgPT4gJXNcbiIsCi0gICAgICAgICAgICAgaXRlci0+Zmlyc3QuY19zdHIoKSwKLSAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgewotICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOwotICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwotICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKLSAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgewotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7Ci0gICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLSAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKLSAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICB0aHJvdyAiTm8gZmllbGQgbmFtZWQgXCIiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpICsgIlwiIHdhcyBmb3VuZCBpbiBzdHJ1Y3Qgb2YgdHlwZSBcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiIjsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCBmaWVsZC0+Z2V0X3R5cGUoKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25zdF92YWwtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgewotICAgICAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgodF9lbnVtKil0dHlwZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0X2NvbnN0KiBjb25zdGFudCA9IGdldF9jb25zdGFudChjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkpOwotICAgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkgewotICAgICAgICAgIHRocm93ICJObyBlbnVtIHZhbHVlIG9yIGNvbnN0YW50IGZvdW5kIG5hbWVkIFwiIiArIGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSArICJcIiEiOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVzb2x2ZSB0eXBlZGVmcyB0byB0aGUgdW5kZXJseWluZyB0eXBlCi0gICAgICAgIHRfdHlwZSogY29uc3RfdHlwZSA9IGNvbnN0YW50LT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0KLSAgICAgICAgaWYgKGNvbnN0X3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdF90eXBlKS0+Z2V0X2Jhc2UoKSkgewotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CWVRFOgotICAgICAgICAgICAgICBjb25zdF92YWwtPnNldF9pbnRlZ2VyKGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2ludGVnZXIoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X3N0cmluZyhjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2RvdWJsZShjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9kb3VibGUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgICAgICAgICB0aHJvdyAiQ29uc3RhbnRzIGNhbm5vdCBiZSBvZiB0eXBlIFZPSUQiOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19tYXAoKSkgewotICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIG1hcCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X21hcCgpOwotICAgICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X21hcCgpOwotICAgICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7Ci0gICAgICAgICAgICBjb25zdF92YWwtPmFkZF9tYXAodl9pdGVyLT5maXJzdCwgdl9pdGVyLT5zZWNvbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjb25zdF90eXBlLT5pc19saXN0KCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0YW50LT5nZXRfdmFsdWUoKS0+Z2V0X2xpc3QoKTsKLSAgICAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKLQotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2xpc3QoKTsKLSAgICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbGlzdCgqdl9pdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIC8vIGVudW0gY29uc3RhbnQgd2l0aCBub24taWRlbnRpZmllciB2YWx1ZS4gc2V0IHRoZSBlbnVtIGFuZCBmaW5kIHRoZQotICAgICAgLy8gdmFsdWUncyBuYW1lLgotICAgICAgdF9lbnVtKiB0ZW51bSA9ICh0X2VudW0qKXR0eXBlOwotICAgICAgdF9lbnVtX3ZhbHVlKiBlbnVtX3ZhbHVlID0gdGVudW0tPmdldF9jb25zdGFudF9ieV92YWx1ZShjb25zdF92YWwtPmdldF9pbnRlZ2VyKCkpOwotICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgewotICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gdmFsc3RtOwotICAgICAgICB2YWxzdG0gPDwgY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpOwotICAgICAgICB0aHJvdyAiQ291bGRuJ3QgZmluZCBhIG5hbWVkIHZhbHVlIGluIGVudW0gIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmb3IgdmFsdWUgIiArIHZhbHN0bS5zdHIoKTsKLSAgICAgIH0KLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2lkZW50aWZpZXIodGVudW0tPmdldF9uYW1lKCkgKyAiLiIgKyBlbnVtX3ZhbHVlLT5nZXRfbmFtZSgpKTsKLSAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0odGVudW0pOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gdHlwZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+IHR5cGVzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gY29uc3RhbnRzCi0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCB0X2NvbnN0Kj4gY29uc3RhbnRzXzsKLQotICAvLyBNYXAgb2YgbmFtZXMgdG8gc2VydmljZXMKLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfc2VydmljZSo+IHNlcnZpY2VzXzsKLQotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlNjkyNC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRfU0VSVklDRV9ICi0jZGVmaW5lIFRfU0VSVklDRV9ICi0KLSNpbmNsdWRlICJ0X2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSA8dmVjdG9yPgotCi1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzZXJ2aWNlIGNvbnNpc3RzIG9mIGEgc2V0IG9mIGZ1bmN0aW9ucy4KLSAqCi0gKi8KLWNsYXNzIHRfc2VydmljZSA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF9zZXJ2aWNlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSwKLSAgICBleHRlbmRzXyhOVUxMKSB7fQotCi0gIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZvaWQgc2V0X2V4dGVuZHModF9zZXJ2aWNlKiBleHRlbmRzKSB7Ci0gICAgZXh0ZW5kc18gPSBleHRlbmRzOwotICB9Ci0KLSAgdm9pZCBhZGRfZnVuY3Rpb24odF9mdW5jdGlvbiogZnVuYykgewotICAgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgICBmb3IgKGl0ZXIgPSBmdW5jdGlvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZnVuY3Rpb25zXy5lbmQoKTsgaXRlcisrKSB7Ci0gICAgICBpZiAoZnVuYy0+Z2V0X25hbWUoKSA9PSAoKml0ZXIpLT5nZXRfbmFtZSgpKSB7Ci0gICAgICAgIHRocm93ICJGdW5jdGlvbiAiICsgZnVuYy0+Z2V0X25hbWUoKSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnVuY3Rpb25zXy5wdXNoX2JhY2soZnVuYyk7Ci0gIH0KLQotICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4mIGdldF9mdW5jdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZ1bmN0aW9uc187Ci0gIH0KLQotICB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgewotICAgIHJldHVybiBleHRlbmRzXzsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIC8vIFNlcnZpY2VzIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIGZpbmdlcnByaW50cy4KLSAgICB0aHJvdyAiQlVHOiBDYW4ndCBnZXQgZmluZ2VycHJpbnQgbWF0ZXJpYWwgZm9yIHNlcnZpY2UuIjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9uc187Ci0gIHRfc2VydmljZSogZXh0ZW5kc187Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9zZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5ODM1Ny4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgVF9TRVRfSAotI2RlZmluZSBUX1NFVF9ICi0KLSNpbmNsdWRlICJ0X2NvbnRhaW5lci5oIgotCi0vKioKLSAqIEEgc2V0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgotICoKLSAqLwotY2xhc3MgdF9zZXQgOiBwdWJsaWMgdF9jb250YWluZXIgewotIHB1YmxpYzoKLSAgdF9zZXQodF90eXBlKiBlbGVtX3R5cGUpIDoKLSAgICBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KLQotICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGVsZW1fdHlwZV87Ci0gIH0KLQotICBib29sIGlzX3NldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCkgY29uc3QgewotICAgIHJldHVybiAic2V0PCIgKyBlbGVtX3R5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSArICI+IjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgZWxlbV90eXBlXy0+Z2VuZXJhdGVfZmluZ2VycHJpbnQoKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiBlbGVtX3R5cGVfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmggYi9jb21waWxlci9jcHAvc3JjL3BhcnNlL3Rfc3RydWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjkzM2QuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3N0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1NUUlVDVF9ICi0jZGVmaW5lIFRfU1RSVUNUX0gKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0X3R5cGUuaCIKLSNpbmNsdWRlICJ0X2ZpZWxkLmgiCi0KLS8vIEZvcndhcmQgZGVjbGFyZSB0aGF0IHB1cHB5Ci1jbGFzcyB0X3Byb2dyYW07Ci0KLS8qKgotICogQSBzdHJ1Y3QgaXMgYSBjb250YWluZXIgZm9yIGEgc2V0IG9mIG1lbWJlciBmaWVsZHMgdGhhdCBoYXMgYSBuYW1lLiBTdHJ1Y3RzCi0gKiBhcmUgYWxzbyB1c2VkIHRvIGltcGxlbWVudCBleGNlcHRpb24gdHlwZXMuCi0gKgotICovCi1jbGFzcyB0X3N0cnVjdCA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVyc190eXBlOwotCi0gIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHRfdHlwZShwcm9ncmFtKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIGlzX3VuaW9uXyhmYWxzZSksCi0gICAgeHNkX2FsbF8oZmFsc2UpIHt9Ci0KLSAgdF9zdHJ1Y3QodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgOgotICAgIHRfdHlwZShwcm9ncmFtLCBuYW1lKSwKLSAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAotICAgIGlzX3VuaW9uXyhmYWxzZSksCi0gICAgeHNkX2FsbF8oZmFsc2UpIHt9Ci0KLSAgdm9pZCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIG5hbWVfID0gbmFtZTsKLSAgfQotCi0gIHZvaWQgc2V0X3hjZXB0aW9uKGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgICBpc194Y2VwdGlvbl8gPSBpc194Y2VwdGlvbjsKLSAgfQotCi0gIHZvaWQgc2V0X3VuaW9uKGJvb2wgaXNfdW5pb24pIHsKLSAgICBpc191bmlvbl8gPSBpc191bmlvbjsKLSAgfQotCi0gIHZvaWQgc2V0X3hzZF9hbGwoYm9vbCB4c2RfYWxsKSB7Ci0gICAgeHNkX2FsbF8gPSB4c2RfYWxsOwotICB9Ci0KLSAgYm9vbCBnZXRfeHNkX2FsbCgpIGNvbnN0IHsKLSAgICByZXR1cm4geHNkX2FsbF87Ci0gIH0KLQotICBib29sIGFwcGVuZCh0X2ZpZWxkKiBlbGVtKSB7Ci0gICAgbWVtYmVyc18ucHVzaF9iYWNrKGVsZW0pOwotCi0gICAgdHlwZWRlZiBtZW1iZXJzX3R5cGU6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKLSAgICBzdGQ6OnBhaXI8aXRlcl90eXBlLCBpdGVyX3R5cGU+IGJvdW5kcyA9IHN0ZDo6ZXF1YWxfcmFuZ2UoCi0gICAgICAgICAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5iZWdpbigpLCBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKSwgZWxlbSwgdF9maWVsZDo6a2V5X2NvbXBhcmUoKQotICAgICAgICApOwotICAgIGlmIChib3VuZHMuZmlyc3QgIT0gYm91bmRzLnNlY29uZCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5pbnNlcnQoYm91bmRzLnNlY29uZCwgZWxlbSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBtZW1iZXJzX3R5cGUmIGdldF9tZW1iZXJzKCkgewotICAgIHJldHVybiBtZW1iZXJzXzsKLSAgfQotCi0gIGNvbnN0IG1lbWJlcnNfdHlwZSYgZ2V0X3NvcnRlZF9tZW1iZXJzKCkgewotICAgIHJldHVybiBtZW1iZXJzX2luX2lkX29yZGVyXzsKLSAgfQotCi0gIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgewotICAgIHJldHVybiAhaXNfeGNlcHRpb25fOwotICB9Ci0KLSAgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsKLSAgICByZXR1cm4gaXNfeGNlcHRpb25fOwotICB9Ci0gIAotICBib29sIGlzX3VuaW9uKCkgY29uc3QgewotICAgIHJldHVybiBpc191bmlvbl87Ci0gIH0KLQotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0IHsKLSAgICBzdGQ6OnN0cmluZyBydiA9ICJ7IjsKLSAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIHJ2ICs9ICgqbV9pdGVyKS0+Z2V0X2ZpbmdlcnByaW50X21hdGVyaWFsKCk7Ci0gICAgICBydiArPSAiOyI7Ci0gICAgfQotICAgIHJ2ICs9ICJ9IjsKLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfZmluZ2VycHJpbnQoKSB7Ci0gICAgdF90eXBlOjpnZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwotICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgewotICAgICAgKCptX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIH0KLSAgfQotCi0gIHRfZmllbGQqIGdldF9maWVsZF9ieV9uYW1lKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIHsKLSAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICAgIGlmICgoKm1faXRlciktPmdldF9uYW1lKCkgPT0gZmllbGRfbmFtZSkgewotICAgICAgICByZXR1cm4gKm1faXRlcjsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotIHByaXZhdGU6Ci0KLSAgbWVtYmVyc190eXBlIG1lbWJlcnNfOwotICBtZW1iZXJzX3R5cGUgbWVtYmVyc19pbl9pZF9vcmRlcl87Ci0gIGJvb2wgaXNfeGNlcHRpb25fOwotICBib29sIGlzX3VuaW9uXzsKLQotICBib29sIHhzZF9hbGxfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyNDI3OS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3BhcnNlL3RfdHlwZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1RZUEVfSAotI2RlZmluZSBUX1RZUEVfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgInRfZG9jLmgiCi0KLWNsYXNzIHRfcHJvZ3JhbTsKLQotLyoqCi0gKiBHZW5lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlCi0gKiBwYXJzZXIgbW9kdWxlIHRvIGJ1aWxkIHVwIGEgdHJlZSBvZiBvYmplY3QgdGhhdCBhcmUgYWxsIGV4cGxpY2l0bHkgdHlwZWQuCi0gKiBUaGUgZ2VuZXJpYyB0X3R5cGUgY2xhc3MgZXhwb3J0cyBhIHZhcmlldHkgb2YgdXNlZnVsIG1ldGhvZHMgdGhhdCBhcmUKLSAqIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJyYW5jaCBiYXNlZCB1cG9uIGRpZmZlcmVudCBoYW5kbGluZyBmb3IgdGhlCi0gKiB2YXJpb3VzIHR5cGVzLgotICoKLSAqLwotY2xhc3MgdF90eXBlIDogcHVibGljIHRfZG9jIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfnRfdHlwZSgpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgbmFtZV8gPSBuYW1lOwotICB9Ci0KLSAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG5hbWVfOwotICB9Ci0KLSAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfc3RyaW5nKCkgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2Jvb2woKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfZW51bSgpICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfY29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX2xpc3QoKSAgICAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gIHZpcnR1YWwgYm9vbCBpc19zZXQoKSAgICAgICBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgICAgICAgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSAgIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgdF9wcm9ncmFtKiBnZXRfcHJvZ3JhbSgpIHsKLSAgICByZXR1cm4gcHJvZ3JhbV87Ci0gIH0KLQotICB0X3R5cGUqIGdldF90cnVlX3R5cGUoKTsKLQotICAvLyBSZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdHlwZQotICAvLyBmcm9tIGFueSBvdGhlciB0aHJpZnQgdHlwZSBpbiB0aGUgd29ybGQsIGFzIGZhciBhcwotICAvLyBURGVuc2VQcm90b2NvbCBpcyBjb25jZXJuZWQuCi0gIC8vIFdlIGRvbid0IGNhY2hlIHRoaXMsIHdoaWNoIGlzIGEgbGl0dGxlIHNsb3BweSwKLSAgLy8gYnV0IHRoZSBjb21waWxlciBpcyBzbyBmYXN0IHRoYXQgaXQgZG9lc24ndCByZWFsbHkgbWF0dGVyLgotICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldF9maW5nZXJwcmludF9tYXRlcmlhbCgpIGNvbnN0ID0gMDsKLQotICAvLyBGaW5nZXJwcmludCBzaG91bGQgY2hhbmdlIHdoZW5ldmVyIChhbmQgb25seSB3aGVuKQotICAvLyB0aGUgZW5jb2RpbmcgdmlhIFREZW5zZVByb3RvY29sIGNoYW5nZXMuCi0gIHN0YXRpYyBjb25zdCBpbnQgZmluZ2VycHJpbnRfbGVuID0gMTY7Ci0KLSAgLy8gQ2FsbCB0aGlzIGJlZm9yZSB0cnlpbmcgZ2V0XypfZmluZ2VycHJpbnQoKS4KLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0KLSAgYm9vbCBoYXNfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgaWYgKGZpbmdlcnByaW50X1tpXSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCB1aW50OF90KiBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCkgY29uc3QgewotICAgIHJldHVybiBmaW5nZXJwcmludF87Ci0gIH0KLQotICBzdGQ6OnN0cmluZyBnZXRfYXNjaWlfZmluZ2VycHJpbnQoKSBjb25zdCB7Ci0gICAgc3RkOjpzdHJpbmcgcnY7Ci0gICAgY29uc3QgdWludDhfdCogZnAgPSBnZXRfYmluYXJ5X2ZpbmdlcnByaW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaW5nZXJwcmludF9sZW47IGkrKykgewotICAgICAgcnYgKz0gYnl0ZV90b19oZXgoZnBbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcnY7Ci0gIH0KLQotICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCi0gIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgewotICAgIGlmIChudW0gPCAxMCkgewotICAgICAgcmV0dXJuICcwJyArIG51bTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKLSAgICBzdGQ6OnN0cmluZyBydjsKLSAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7Ci0gICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHRfdHlwZSgpIDoKLSAgICBwcm9ncmFtXyhOVUxMKQotICB7Ci0gICAgbWVtc2V0KGZpbmdlcnByaW50XywgMCwgc2l6ZW9mKGZpbmdlcnByaW50XykpOwotICB9Ci0KLSAgdF90eXBlKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOgotICAgIHByb2dyYW1fKHByb2dyYW0pCi0gIHsKLSAgICBtZW1zZXQoZmluZ2VycHJpbnRfLCAwLCBzaXplb2YoZmluZ2VycHJpbnRfKSk7Ci0gIH0KLQotICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8ocHJvZ3JhbSksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6Ci0gICAgcHJvZ3JhbV8oTlVMTCksCi0gICAgbmFtZV8obmFtZSkKLSAgewotICAgIG1lbXNldChmaW5nZXJwcmludF8sIDAsIHNpemVvZihmaW5nZXJwcmludF8pKTsKLSAgfQotCi0gIHRfcHJvZ3JhbSogcHJvZ3JhbV87Ci0gIHN0ZDo6c3RyaW5nIG5hbWVfOwotCi0gIHVpbnQ4X3QgZmluZ2VycHJpbnRfW2ZpbmdlcnByaW50X2xlbl07Ci19OwotCi0KLS8qKgotICogUGxhY2Vob2xkZXIgc3RydWN0IGZvciByZXR1cm5pbmcgdGhlIGtleSBhbmQgdmFsdWUgb2YgYW4gYW5ub3RhdGlvbgotICogZHVyaW5nIHBhcnNpbmcuCi0gKi8KLXN0cnVjdCB0X2Fubm90YXRpb24gewotICBzdGQ6OnN0cmluZyBrZXk7Ci0gIHN0ZDo6c3RyaW5nIHZhbDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaCBiL2NvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF90eXBlZGVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzdkOTcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3R5cGVkZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBUX1RZUEVERUZfSAotI2RlZmluZSBUX1RZUEVERUZfSAotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgInRfdHlwZS5oIgotCi0vKioKLSAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQotICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQotICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCi0gKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KLSAqCi0gKi8KLWNsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgewotIHB1YmxpYzoKLSAgdF90eXBlZGVmKHRfcHJvZ3JhbSogcHJvZ3JhbSwgdF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBzeW1ib2xpYykgOgotICAgIHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCi0gICAgdHlwZV8odHlwZSksCi0gICAgc3ltYm9saWNfKHN5bWJvbGljKSB7fQotCi0gIH50X3R5cGVkZWYoKSB7fQotCi0gIHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9Ci0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9zeW1ib2xpYygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3ltYm9saWNfOwotICB9Ci0KLSAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHR5cGVfLT5nZXRfZmluZ2VycHJpbnRfbWF0ZXJpYWwoKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9maW5nZXJwcmludCgpIHsKLSAgICB0X3R5cGU6OmdlbmVyYXRlX2ZpbmdlcnByaW50KCk7Ci0gICAgaWYgKCF0eXBlXy0+aGFzX2ZpbmdlcnByaW50KCkpIHsKLSAgICAgIHR5cGVfLT5nZW5lcmF0ZV9maW5nZXJwcmludCgpOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgdF90eXBlKiB0eXBlXzsKLSAgc3RkOjpzdHJpbmcgc3ltYm9saWNfOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmggYi9jb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjA0YzcuLjAwMDAwMDAKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIGRlZmluZSBmb3IgbWtkaXIsc2luY2UgdGhlIG1ldGhvZCBzaWduYXR1cmUKLSAqIGlzIGRpZmZlcmVudCBmb3IgdGhlIG5vbi1QT1NJWCBNaW5HVwotICovCi0KLSNpZmRlZiBNSU5HVwotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2luY2x1ZGUgPGlvLmg+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+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuIHhzZCgiaW50Iik7CisgIH0KKworICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgcmV0dXJuIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgcmV0dXJuICJjb250YWluZXIiOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIFhTRCB0eXBlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIHRocmlmdCB0eXBlLgorICoKKyAqIEBwYXJhbSB0YmFzZSBUaGUgYmFzZSB0eXBlCisgKiBAcmV0dXJuIEV4cGxpY2l0IFhTRCB0eXBlLCBpLmUuIHhzZDpzdHJpbmcKKyAqLworc3RyaW5nIHRfeHNkX2dlbmVyYXRvcjo6YmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSkgeworICBzd2l0Y2ggKHRiYXNlKSB7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICByZXR1cm4gInZvaWQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICByZXR1cm4gImJvb2xlYW4iOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIHJldHVybiAic2hvcnQiOworICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICByZXR1cm4gImludCI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgIHJldHVybiAibG9uZyI7CisgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgIHJldHVybiAiZGVjaW1hbCI7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBYU0QgYmFzZSB0eXBlIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgfQorfQorCitUSFJJRlRfUkVHSVNURVJfR0VORVJBVE9SKHhzZCwgIlhTRCIsICIiKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL1JFQURNRSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29tcGlsZXIvY3BwL1JFQURNRQpyZW5hbWUgdG8gY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nbG9iYWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxYzZlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dsb2JhbHMuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfR0xPQkFMU19ICisjZGVmaW5lIFRfR0xPQkFMU19ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RhY2s+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKworLyoqCisgKiBUaGlzIG1vZHVsZSBjb250YWlucyBhbGwgdGhlIGdsb2JhbCB2YXJpYWJsZXMgKHNsYXAgb24gdGhlIHdyaXN0KSB0aGF0IGFyZQorICogc2hhcmVkIHRocm91Z2hvdXQgdGhlIHByb2dyYW0uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBzaW1wbGUKKyAqIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIEJlZm9yZSBjYWxsaW5nCisgKiB5eXBhcnNlKCksIHRoZSBtYWluLmNjIHByb2dyYW0gd2lsbCBtYWtlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyB0byB0aGVzZQorICogZ2xvYmFsIHZhcmlhYmxlcyBzdWNoIHRoYXQgdGhlIHBhcnNlciBkb2VzIHRoZSByaWdodCB0aGluZyBhbmQgcHV0cyBlbnRyaWVzCisgKiBpbnRvIHRoZSByaWdodCBjb250YWluZXJzLCBldGMuCisgKgorICovCisKKy8qKgorICogSG9vcmF5IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHR5cGVzIQorICovCisKK2NsYXNzIHRfcHJvZ3JhbTsKK2NsYXNzIHRfc2NvcGU7CitjbGFzcyB0X3R5cGU7CisKKy8qKgorICogUGFyc2luZyBtb2RlLCB0d28gcGFzc2VzIHVwIGluIHRoaXMgZ2luIHJ1bW15IQorICovCisKK2VudW0gUEFSU0VfTU9ERSB7IElOQ0xVREVTID0gMSwgUFJPR1JBTSA9IDIgfTsKKworLyoqCisgKiBTdHJpY3RuZXNzIGxldmVsCisgKi8KK2V4dGVybiBpbnQgZ19zdHJpY3Q7CisKKy8qKgorICogVGhlIG1hc3RlciBwcm9ncmFtIHBhcnNlIHRyZWUuIFRoaXMgaXMgYWNjZXNzZWQgZnJvbSB3aXRoaW4gdGhlIHBhcnNlciBjb2RlCisgKiB0byBidWlsZCB1cCB0aGUgcHJvZ3JhbSBlbGVtZW50cy4KKyAqLworZXh0ZXJuIHRfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIFRoZSBzY29wZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpbnRvCisgKi8KK2V4dGVybiB0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFRoZSBwYXJlbnQgc2NvcGUgdG8gYWxzbyBsb2FkIHN5bWJvbHMgaW50bworICovCitleHRlcm4gdF9zY29wZSogZ19wYXJlbnRfc2NvcGU7CisKKy8qKgorICogVGhlIHByZWZpeCBmb3IgdGhlIHBhcmVudCBzY29wZSBlbnRyaWVzCisgKi8KK2V4dGVybiBzdGQ6OnN0cmluZyBnX3BhcmVudF9wcmVmaXg7CisKKy8qKgorICogVGhlIHBhcnNpbmcgcGFzcyB0aGF0IHdlIGFyZSBvbi4gV2UgZG8gZGlmZmVyZW50IHRoaW5ncyBvbiBlYWNoIHBhc3MuCisgKi8KK2V4dGVybiBQQVJTRV9NT0RFIGdfcGFyc2VfbW9kZTsKKworLyoqCisgKiBHbG9iYWwgdGltZSBzdHJpbmcsIHVzZWQgaW4gZm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcyBldGMuCisgKi8KK2V4dGVybiBjaGFyKiBnX3RpbWVfc3RyOworCisvKioKKyAqIFRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBjaGFyKiBnX2RvY3RleHQ7CisKKy8qKgorICogVGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0IHBhcnNlZCBkb2N0ZXh0IGNvbW1lbnQuCisgKi8KK2V4dGVybiBpbnQgZ19kb2N0ZXh0X2xpbmVubzsKKworLyoqCisgKiBTdGF0dXMgb2YgcHJvZ3JhbSBsZXZlbCBkb2N0ZXh0IGNhbmRpZGF0ZQorICovCitlbnVtIFBST0dET0NURVhUX1NUQVRVUyB7CisgIElOVkFMSUQgPSAwLAorICBTVElMTF9DQU5ESURBVEUgPSAxLCAgIC8vIHRoZSB0ZXh0IG1heSBvciBtYXkgbm90IGJlIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgQUxSRUFEWV9QUk9DRVNTRUQgPSAyLCAvLyBkb2N0ZXh0IGhhcyBiZWVuIHVzZWQgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgQUJTT0xVVEVMWV9TVVJFID0gMywgICAvLyB0aGlzIGlzIHRoZSBwcm9ncmFtIGRvY3RleHQKKyAgTk9fUFJPR1JBTV9ET0NURVhUID0gNCAvLyB0aGVyZSBpcyBubyBwcm9ncmFtIGRvY3RleHQKK307CisKKy8qKgorICogVGhlIHByb2dyYW0gbGV2ZWwgZG9jdGV4dC4gU3RvcmVkIHNlcGFyYXRlbHkgdG8gbWFrZSBwYXJzaW5nIGVhc2llci4KKyAqLworZXh0ZXJuIGNoYXIqIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZTsKK2V4dGVybiBpbnQgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vOworZXh0ZXJuIFBST0dET0NURVhUX1NUQVRVUyBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgbmVnYXRpdmUgZmllbGQga2V5cyBhcmUgYWNjZXB0ZWQuCisgKgorICogV2hlbiBhIGZpZWxkIGRvZXMgbm90IGhhdmUgYSB1c2VyLXNwZWNpZmllZCBrZXksIHRocmlmdCBhdXRvbWF0aWNhbGx5CisgKiBhc3NpZ25zIGEgbmVnYXRpdmUgdmFsdWUuICBIb3dldmVyLCB0aGlzIGlzIGZyYWdpbGUgc2luY2UgY2hhbmdlcyB0byB0aGUKKyAqIGZpbGUgbWF5IHVuaW50ZW50aW9uYWxseSBjaGFuZ2UgdGhlIGtleSBudW1iZXJpbmcsIHJlc3VsdGluZyBpbiBhIG5ldworICogcHJvdG9jb2wgdGhhdCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCisgKgorICogV2hlbiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGlzIGVuYWJsZWQsIHVzZXJzIGNhbiBleHBsaWNpdGx5IHNwZWNpZnkKKyAqIG5lZ2F0aXZlIGtleXMuICBUaGlzIHdheSB0aGV5IGNhbiB3cml0ZSBhIC50aHJpZnQgZmlsZSB3aXRoIGV4cGxpY2l0bHkKKyAqIHNwZWNpZmllZCBrZXlzIHRoYXQgaXMgc3RpbGwgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBvbGRlciAudGhyaWZ0IGZpbGVzCisgKiB0aGF0IGRpZCBub3Qgc3BlY2lmeSBrZXkgdmFsdWVzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfbmVnX2ZpZWxkX2tleXM7CisKKy8qKgorICogV2hldGhlciBvciBub3QgNjQtYml0IGNvbnN0YW50cyB3aWxsIGdlbmVyYXRlIGEgd2FybmluZy4KKyAqCisgKiBTb21lIGxhbmd1YWdlcyBkb24ndCBzdXBwb3J0IDY0LWJpdCBjb25zdGFudHMsIGJ1dCBtYW55IGRvLCBzbyB3ZSBjYW4KKyAqIHN1cHByZXNzIHRoaXMgd2FybmluZyBmb3IgcHJvamVjdHMgdGhhdCBkb24ndCB1c2UgYW55IG5vbi02NC1iaXQtc2FmZQorICogbGFuZ3VhZ2VzLgorICovCitleHRlcm4gaW50IGdfYWxsb3dfNjRiaXRfY29uc3RzOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2xvZ2dpbmcuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjFmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmNjCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBMb2dnaW5nIGZ1bmN0aW9ucyBjb3BpZWQgZnJvbSBtYWluLmNjIHRvIGF2b2lkIGxpbmsgZXJyb3JzIGZvciBwbHVnaW5zCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dsb2JhbHMuaCIKKyNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxjc3RkbGliPgorCisvLyBUT0RPOiBtYWtlIHBsdWdpbnMgYWNjZXB0IGxvZyBvcHRpb25zIGZyb20gbWFpbiBjb21waWxlcgoraW50IGdfZGVidWcgPSAwOworaW50IGdfd2FybiA9IDE7CitpbnQgZ192ZXJib3NlID0gMDsKKwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfZGVidWcgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIC8vIHByaW50ZigiW1BBUlNFOiVkXSAiLCB5eWxpbmVubyk7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworICBwcmludGYoIlxuIik7Cit9CisKK3ZvaWQgcHZlcmJvc2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgaWYgKGdfdmVyYm9zZSA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICAvLyBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICAvLyBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworICBleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbG9nZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZWZiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9sb2dnaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTE9HR0lOR19ICisjZGVmaW5lIFRfTE9HR0lOR19ICisKK2V4dGVybiBpbnQgZ19kZWJ1ZzsKK2V4dGVybiBpbnQgZ193YXJuOworZXh0ZXJuIGludCBnX3ZlcmJvc2U7CisKKy8qKgorICogUGFyc2UgZGVidWdnaW5nIG91dHB1dCwgdXNlZCB0byBwcmludCBoZWxwZnVsIGluZm8KKyAqLwordm9pZCBwZGVidWcoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIFBhcnNlciB3YXJuaW5nCisgKi8KK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLik7CisKKy8qKgorICogUHJpbnQgdmVyYm9zZSBvdXRwdXQgbWVzc2FnZQorICovCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKTsKKworLyoqCisgKiBGYWlsdXJlIQorICovCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzE3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCkBAIC0wLDAgKzEsMTMwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIHRocmlmdCAtIGEgbGlnaHR3ZWlnaHQgY3Jvc3MtbGFuZ3VhZ2UgcnBjL3NlcmlhbGl6YXRpb24gdG9vbAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBjb21waWxlciBlbmdpbmUgZm9yIFRocmlmdCwgd2hpY2ggaW52b2tlcyB0aGUKKyAqIHNjYW5uZXIvcGFyc2VyIHRvIGJ1aWxkIHRoZSB0aHJpZnQgb2JqZWN0IHRyZWUuIFRoZSBpbnRlcmZhY2UgZ2VuZXJhdGlvbgorICogY29kZSBmb3IgZWFjaCBsYW5ndWFnZSBsaXZlcyBpbiBhIGZpbGUgYnkgdGhlIGxhbmd1YWdlIG5hbWUgdW5kZXIgdGhlCisgKiBnZW5lcmF0ZS8gZm9sZGVyLCBhbmQgYWxsIHBhcnNlIHN0cnVjdHVyZXMgbGl2ZSBpbiBwYXJzZS8KKyAqCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+IC8qIGZvciBHZXRGdWxsUGF0aE5hbWUgKi8KKyNlbmRpZgorCisvLyBDYXJlZnVsOiBtdXN0IGluY2x1ZGUgZ2xvYmFscyBmaXJzdCBmb3IgZXh0ZXJuIGRlZmluaXRpb25zCisjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9nbG9iYWxzLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9hdWRpdC90X2F1ZGl0LmgiCisjaWZkZWYgVEhSSUZUX0VOQUJMRV9QTFVHSU4KKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl9vdXRwdXQuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLyoqCisgKiBHbG9iYWwgcHJvZ3JhbSB0cmVlCisgKi8KK3RfcHJvZ3JhbSogZ19wcm9ncmFtOworCisvKioKKyAqIEdsb2JhbCBzY29wZQorICovCit0X3Njb3BlKiBnX3Njb3BlOworCisvKioKKyAqIFBhcmVudCBzY29wZSB0byBhbHNvIHBhcnNlIHR5cGVzCisgKi8KK3Rfc2NvcGUqIGdfcGFyZW50X3Njb3BlOworCisvKioKKyAqIFByZWZpeCBmb3IgcHV0dGluZyB0eXBlcyBpbiBwYXJlbnQgc2NvcGUKKyAqLworc3RyaW5nIGdfcGFyZW50X3ByZWZpeDsKKworLyoqCisgKiBQYXJzaW5nIHBhc3MKKyAqLworUEFSU0VfTU9ERSBnX3BhcnNlX21vZGU7CisKKy8qKgorICogQ3VycmVudCBkaXJlY3Rvcnkgb2YgZmlsZSBiZWluZyBwYXJzZWQKKyAqLworc3RyaW5nIGdfY3VyZGlyOworCisvKioKKyAqIEN1cnJlbnQgZmlsZSBiZWluZyBwYXJzZWQKKyAqLworc3RyaW5nIGdfY3VycGF0aDsKKworLyoqCisgKiBTZWFyY2ggcGF0aCBmb3IgaW5jbHVzaW9ucworICovCit2ZWN0b3I8c3RyaW5nPiBnX2luY2xfc2VhcmNocGF0aDsKKworLyoqCisgKiBHbG9iYWwgZGVidWcgc3RhdGUKKyAqLworaW50IGdfZGVidWcgPSAwOworCisvKioKKyAqIFN0cmljdG5lc3MgbGV2ZWwKKyAqLworaW50IGdfc3RyaWN0ID0gMTI3OworCisvKioKKyAqIFdhcm5pbmcgbGV2ZWwKKyAqLworaW50IGdfd2FybiA9IDE7CisKKy8qKgorICogVmVyYm9zZSBvdXRwdXQKKyAqLworaW50IGdfdmVyYm9zZSA9IDA7CisKKy8qKgorICogR2xvYmFsIHRpbWUgc3RyaW5nCisgKi8KK2NoYXIqIGdfdGltZV9zdHI7CisKKy8qKgorICogVGhlIGxhc3QgcGFyc2VkIGRvY3RleHQgY29tbWVudC4KKyAqLworY2hhciogZ19kb2N0ZXh0OworCisvKioKKyAqIFRoZSBGaXJzdCBkb2N0ZXh0IGNvbW1lbnQKKyAqLworY2hhciogZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlOworCisvKioKKyAqIFdoZXRoZXIgb3Igbm90IG5lZ2F0aXZlIGZpZWxkIGtleXMgYXJlIGFjY2VwdGVkLgorICovCitpbnQgZ19hbGxvd19uZWdfZmllbGRfa2V5czsKKworLyoqCisgKiBXaGV0aGVyIG9yIG5vdCA2NC1iaXQgY29uc3RhbnRzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nLgorICovCitpbnQgZ19hbGxvd182NGJpdF9jb25zdHMgPSAwOworCisvKioKKyAqIEZsYWdzIHRvIGNvbnRyb2wgY29kZSBnZW5lcmF0aW9uCisgKi8KK2Jvb2wgZ2VuX3JlY3Vyc2UgPSBmYWxzZTsKKworLyoqCisgKiBGbGFncyB0byBjb250cm9sIHRocmlmdCBhdWRpdAorICovCitib29sIGdfYXVkaXQgPSBmYWxzZTsKKworLyoqCisgKiBGbGFnIHRvIGNvbnRyb2wgcmV0dXJuIHN0YXR1cworICovCitib29sIGdfcmV0dXJuX2ZhaWx1cmUgPSBmYWxzZTsKK2Jvb2wgZ19hdWRpdF9mYXRhbCA9IHRydWU7Citib29sIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSBmYWxzZTsKKworLyoqCisgKiBXaW4zMiBkb2Vzbid0IGhhdmUgcmVhbHBhdGgsIHNvIHVzZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBpbiB0aGF0IGNhc2UsCisgKiBvdGhlcndpc2UgdGhpcyBqdXN0IGNhbGxzIHRocm91Z2ggdG8gcmVhbHBhdGgKKyAqLworY2hhciogc2FmZXJlYWxwYXRoKGNvbnN0IGNoYXIqIHBhdGgsIGNoYXIqIHJlc29sdmVkX3BhdGgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgY2hhciBidWZbTUFYX1BBVEhdOworICBjaGFyKiBiYXNlbmFtZTsKKyAgRFdPUkQgbGVuID0gR2V0RnVsbFBhdGhOYW1lKHBhdGgsIE1BWF9QQVRILCBidWYsICZiYXNlbmFtZSk7CisgIGlmIChsZW4gPT0gMCB8fCBsZW4gPiBNQVhfUEFUSCAtIDEpIHsKKyAgICBzdHJjcHkocmVzb2x2ZWRfcGF0aCwgcGF0aCk7CisgIH0gZWxzZSB7CisgICAgc3RyY3B5KHJlc29sdmVkX3BhdGgsIGJ1Zik7CisgIH0KKworICAvLyBSZXBsYWNlIGJhY2tzbGFzaGVzIHdpdGggZm9yd2FyZCBzbGFzaGVzIHNvIHRoZQorICAvLyByZXN0IG9mIHRoZSBjb2RlIGJlaGF2ZXMgY29ycmVjdGx5LgorICBzaXplX3QgcmVzb2x2ZWRfbGVuID0gc3RybGVuKHJlc29sdmVkX3BhdGgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc29sdmVkX2xlbjsgaSsrKSB7CisgICAgaWYgKHJlc29sdmVkX3BhdGhbaV0gPT0gJ1xcJykgeworICAgICAgcmVzb2x2ZWRfcGF0aFtpXSA9ICcvJzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc29sdmVkX3BhdGg7CisjZWxzZQorICByZXR1cm4gcmVhbHBhdGgocGF0aCwgcmVzb2x2ZWRfcGF0aCk7CisjZW5kaWYKK30KKworYm9vbCBjaGVja19pc19kaXJlY3RvcnkoY29uc3QgY2hhciogZGlyX25hbWUpIHsKKyNpZmRlZiBfV0lOMzIKKyAgRFdPUkQgYXR0cmlidXRlcyA9IDo6R2V0RmlsZUF0dHJpYnV0ZXNBKGRpcl9uYW1lKTsKKyAgaWYgKGF0dHJpYnV0ZXMgPT0gSU5WQUxJRF9GSUxFX0FUVFJJQlVURVMpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJPdXRwdXQgZGlyZWN0b3J5ICVzIGlzIHVudXNhYmxlOiBHZXRMYXN0RXJyb3IoKSA9ICVsZFxuIiwKKyAgICAgICAgICAgIGRpcl9uYW1lLAorICAgICAgICAgICAgR2V0TGFzdEVycm9yKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGRpcmVjdG9yeSAlcyBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeVxuIiwgZGlyX25hbWUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgIHN0cnVjdCBzdGF0IHNiOworICBpZiAoc3RhdChkaXJfbmFtZSwgJnNiKSA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBkaXJlY3RvcnkgJXMgaXMgdW51c2FibGU6ICVzXG4iLCBkaXJfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFTX0lTRElSKHNiLnN0X21vZGUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQgZGlyZWN0b3J5ICVzIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5XG4iLCBkaXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKKy8qKgorICogUmVwb3J0IGFuIGVycm9yIHRvIHRoZSB1c2VyLiBUaGlzIGlzIGNhbGxlZCB5eWVycm9yIGZvciBoaXN0b3JpY2FsCisgKiByZWFzb25zIChsZXggYW5kIHlhY2MgZXhwZWN0IHRoZSBlcnJvciByZXBvcnRpbmcgcm91dGluZSB0byBiZSBjYWxsZWQKKyAqIHRoaXMpLiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gcmVwb3J0IGFueSBlcnJvcnMgdG8gdGhlIHVzZXIuCisgKiB5eWVycm9yIHRha2VzIHByaW50ZiBzdHlsZSBhcmd1bWVudHMuCisgKgorICogQHBhcmFtIGZtdCBDIGZvcm1hdCBzdHJpbmcgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAqLwordm9pZCB5eWVycm9yKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgZnByaW50ZihzdGRlcnIsICJbRVJST1I6JXM6JWRdIChsYXN0IHRva2VuIHdhcyAnJXMnKVxuIiwgZ19jdXJwYXRoLmNfc3RyKCksIHl5bGluZW5vLCB5eXRleHQpOworCisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworCisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSBkZWJ1ZyBtZXNzYWdlIGZyb20gdGhlIHBhcnNlci4KKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ19kZWJ1ZyA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIHZhX2xpc3QgYXJnczsKKyAgcHJpbnRmKCJbUEFSU0U6JWRdICIsIHl5bGluZW5vKTsKKyAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgdnByaW50ZihmbXQsIGFyZ3MpOworICB2YV9lbmQoYXJncyk7CisgIHByaW50ZigiXG4iKTsKK30KKworLyoqCisgKiBQcmludHMgYSB2ZXJib3NlIG91dHB1dCBtb2RlIG1lc3NhZ2UKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIHB2ZXJib3NlKGNvbnN0IGNoYXIqIGZtdCwgLi4uKSB7CisgIGlmIChnX3ZlcmJvc2UgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICB2YV9saXN0IGFyZ3M7CisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIHZwcmludGYoZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworfQorCisvKioKKyAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZQorICoKKyAqIEBwYXJhbSBmbXQgQyBmb3JtYXQgc3RyaW5nIGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgYXJndW1lbnRzCisgKi8KK3ZvaWQgcHdhcm5pbmcoaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICBpZiAoZ193YXJuIDwgbGV2ZWwpIHsKKyAgICByZXR1cm47CisgIH0KKyAgdmFfbGlzdCBhcmdzOworICBwcmludGYoIltXQVJOSU5HOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2cHJpbnRmKGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvKioKKyAqIFByaW50cyBhIGZhaWx1cmUgbWVzc2FnZSBhbmQgZXhpdHMKKyAqCisgKiBAcGFyYW0gZm10IEMgZm9ybWF0IHN0cmluZyBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGFyZ3VtZW50cworICovCit2b2lkIGZhaWx1cmUoY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgdmFfbGlzdCBhcmdzOworICBmcHJpbnRmKHN0ZGVyciwgIltGQUlMVVJFOiVzOiVkXSAiLCBnX2N1cnBhdGguY19zdHIoKSwgeXlsaW5lbm8pOworICB2YV9zdGFydChhcmdzLCBmbXQpOworICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcHJpbnRmKCJcbiIpOworICBleGl0KDEpOworfQorCisvKioKKyAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCisgKi8KK3N0cmluZyBwcm9ncmFtX25hbWUoc3RyaW5nIGZpbGVuYW1lKSB7CisgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoID0gZmlsZW5hbWUucmZpbmQoIi8iKTsKKyAgaWYgKHNsYXNoICE9IHN0cmluZzo6bnBvcykgeworICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKHNsYXNoICsgMSk7CisgIH0KKyAgc3RyaW5nOjpzaXplX3R5cGUgZG90ID0gZmlsZW5hbWUucmZpbmQoIi4iKTsKKyAgaWYgKGRvdCAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cigwLCBkb3QpOworICB9CisgIHJldHVybiBmaWxlbmFtZTsKK30KKworLyoqCisgKiBHZXRzIHRoZSBkaXJlY3RvcnkgcGF0aCBvZiBhIGZpbGVuYW1lCisgKi8KK3N0cmluZyBkaXJlY3RvcnlfbmFtZShzdHJpbmcgZmlsZW5hbWUpIHsKKyAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2ggPSBmaWxlbmFtZS5yZmluZCgiLyIpOworICAvLyBObyBzbGFzaCwganVzdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgIGlmIChzbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICByZXR1cm4gIi4iOworICB9CisgIHJldHVybiBmaWxlbmFtZS5zdWJzdHIoMCwgc2xhc2gpOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBhcHByb3ByaWF0ZSBmaWxlIHBhdGggZm9yIHRoZSBnaXZlbiBmaWxlbmFtZQorICovCitzdHJpbmcgaW5jbHVkZV9maWxlKHN0cmluZyBmaWxlbmFtZSkgeworICAvLyBBYnNvbHV0ZSBwYXRoPyBKdXN0IHRyeSB0aGF0CisgIGlmIChmaWxlbmFtZVswXSA9PSAnLycpIHsKKyAgICAvLyBSZWFscGF0aCEKKyAgICBjaGFyIHJwW1RIUklGVF9QQVRIX01BWF07CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChmaWxlbmFtZS5jX3N0cigpLCBycCkgPT0gTlVMTCkgeworICAgICAgcHdhcm5pbmcoMCwgIkNhbm5vdCBvcGVuIGluY2x1ZGUgZmlsZSAlc1xuIiwgZmlsZW5hbWUuY19zdHIoKSk7CisgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICAvLyBTdGF0IHRoaXMgZmlsZQorICAgIHN0cnVjdCBzdGF0IGZpbmZvOworICAgIGlmIChzdGF0KHJwLCAmZmluZm8pID09IDApIHsKKyAgICAgIHJldHVybiBycDsKKyAgICB9CisgIH0gZWxzZSB7IC8vIHJlbGF0aXZlIHBhdGgsIHN0YXJ0IHNlYXJjaGluZworICAgIC8vIG5ldyBzZWFyY2ggcGF0aCB3aXRoIGN1cnJlbnQgZGlyIGdsb2JhbAorICAgIHZlY3RvcjxzdHJpbmc+IHNwID0gZ19pbmNsX3NlYXJjaHBhdGg7CisgICAgc3AuaW5zZXJ0KHNwLmJlZ2luKCksIGdfY3VyZGlyKTsKKworICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBwYXRocworICAgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gc3AuYmVnaW4oKTsgaXQgIT0gc3AuZW5kKCk7IGl0KyspIHsKKyAgICAgIHN0cmluZyBzZmlsZW5hbWUgPSAqKGl0KSArICIvIiArIGZpbGVuYW1lOworCisgICAgICAvLyBSZWFscGF0aCEKKyAgICAgIGNoYXIgcnBbVEhSSUZUX1BBVEhfTUFYXTsKKyAgICAgIC8vIGNwcGNoZWNrLXN1cHByZXNzIHVuaW5pdHZhcgorICAgICAgaWYgKHNhZmVyZWFscGF0aChzZmlsZW5hbWUuY19zdHIoKSwgcnApID09IE5VTEwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIFN0YXQgdGhpcyBmaWxlcworICAgICAgc3RydWN0IHN0YXQgZmluZm87CisgICAgICBpZiAoc3RhdChycCwgJmZpbmZvKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBycDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBVaCBvaAorICBwd2FybmluZygwLCAiQ291bGQgbm90IGZpbmQgaW5jbHVkZSBmaWxlICVzXG4iLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKKy8qKgorICogQ2xlYXJzIGFueSBwcmV2aW91c2x5IHN0b3JlZCBkb2N0ZXh0IHN0cmluZy4KKyAqIEFsc28gcHJpbnRzIGEgd2FybmluZyBpZiB3ZSBhcmUgZGlzY2FyZGluZyBpbmZvcm1hdGlvbi4KKyAqLwordm9pZCBjbGVhcl9kb2N0ZXh0KCkgeworICBpZiAoZ19kb2N0ZXh0ICE9IE5VTEwpIHsKKyAgICBwd2FybmluZygyLCAiVW5jYXB0dXJlZCBkb2N0ZXh0IGF0IG9uIGxpbmUgJWQuIiwgZ19kb2N0ZXh0X2xpbmVubyk7CisgIH0KKyAgZnJlZShnX2RvY3RleHQpOworICBnX2RvY3RleHQgPSBOVUxMOworfQorCisvKioKKyAqIFJlc2V0IHByb2dyYW0gZG9jdGV4dCBpbmZvcm1hdGlvbiBhZnRlciBwcm9jZXNzaW5nIGEgZmlsZQorICovCit2b2lkIHJlc2V0X3Byb2dyYW1fZG9jdGV4dF9pbmZvKCkgeworICBpZiAoZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlICE9IE5VTEwpIHsKKyAgICBmcmVlKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7CisgICAgZ19wcm9ncmFtX2RvY3RleHRfY2FuZGlkYXRlID0gTlVMTDsKKyAgfQorICBnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPSAwOworICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBJTlZBTElEOworICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gSU5WQUxJRCIpOworfQorCisvKioKKyAqIFdlIGFyZSBzdXJlIHRoZSBwcm9ncmFtIGRvY3RleHQgY2FuZGlkYXRlIGlzIHJlYWxseSB0aGUgcHJvZ3JhbSBkb2N0ZXh0LgorICovCit2b2lkIGRlY2xhcmVfdmFsaWRfcHJvZ3JhbV9kb2N0ZXh0KCkgeworICBpZiAoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IFNUSUxMX0NBTkRJREFURSkpIHsKKyAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBQlNPTFVURUxZX1NVUkU7CisgICAgcGRlYnVnKCIlcyIsICJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIEFCU09MVVRFTFlfU1VSRSIpOworICB9IGVsc2UgeworICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IE5PX1BST0dSQU1fRE9DVEVYVDsKKyAgICBwZGVidWcoIiVzIiwgInByb2dyYW0gZG9jdGV4dCBzZXQgdG8gTk9fUFJPR1JBTV9ET0NURVhUIik7CisgIH0KK30KKworLyoqCisgKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKKyAqCisgKiBXYXJuaW5nOiBpZiB5b3UgbWl4IHRhYnMgYW5kIHNwYWNlcyBpbiBhIG5vbi11bmlmb3JtIHdheSwKKyAqIHlvdSB3aWxsIGdldCB3aGF0IHlvdSBkZXNlcnZlLgorICovCitjaGFyKiBjbGVhbl91cF9kb2N0ZXh0KGNoYXIqIGRvY3RleHQpIHsKKyAgLy8gQ29udmVydCB0byBDKysgc3RyaW5nLCBhbmQgcmVtb3ZlIFdpbmRvd3MncyBjYXJyaWFnZSByZXR1cm5zLgorICBzdHJpbmcgZG9jc3RyaW5nID0gZG9jdGV4dDsKKyAgZG9jc3RyaW5nLmVyYXNlKHJlbW92ZShkb2NzdHJpbmcuYmVnaW4oKSwgZG9jc3RyaW5nLmVuZCgpLCAnXHInKSwgZG9jc3RyaW5nLmVuZCgpKTsKKworICAvLyBTZXBhcmF0ZSBpbnRvIGxpbmVzLgorICB2ZWN0b3I8c3RyaW5nPiBsaW5lczsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gc3RyaW5nOjpucG9zOworICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0OworICB3aGlsZSAodHJ1ZSkgeworICAgIGxhc3QgPSAocG9zID09IHN0cmluZzo6bnBvcykgPyAwIDogcG9zICsgMTsKKyAgICBwb3MgPSBkb2NzdHJpbmcuZmluZCgnXG4nLCBsYXN0KTsKKyAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgeworICAgICAgLy8gRmlyc3QgYml0IG9mIGNsZWFuaW5nLiAgSWYgdGhlIGxhc3QgbGluZSBpcyBvbmx5IHdoaXRlc3BhY2UsIGRyb3AgaXQuCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBub253aGl0ZSA9IGRvY3N0cmluZy5maW5kX2ZpcnN0X25vdF9vZigiIFx0IiwgbGFzdCk7CisgICAgICBpZiAobm9ud2hpdGUgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgIGxpbmVzLnB1c2hfYmFjayhkb2NzdHJpbmcuc3Vic3RyKGxhc3QpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBsaW5lcy5wdXNoX2JhY2soZG9jc3RyaW5nLnN1YnN0cihsYXN0LCBwb3MgLSBsYXN0KSk7CisgIH0KKworICAvLyBBIHZlcnkgcHJvZm91bmQgZG9jc3RyaW5nLgorICBpZiAobGluZXMuZW1wdHkoKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gQ2xlYXIgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGZpcnN0IGxpbmUuCisgIHBvcyA9IGxpbmVzLmZyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoIiBcdCIpOworICBsaW5lcy5mcm9udCgpLmVyYXNlKDAsIHBvcyk7CisKKyAgLy8gSWYgZXZlcnkgbm9uYmxhbmsgbGluZSBhZnRlciB0aGUgZmlyc3QgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBzcGFjZXMvdGFicywKKyAgLy8gdGhlbiBhIHN0YXIsIHJlbW92ZSB0aGVtLgorICBib29sIGhhdmVfcHJlZml4ID0gdHJ1ZTsKKyAgYm9vbCBmb3VuZF9wcmVmaXggPSBmYWxzZTsKKyAgc3RyaW5nOjpzaXplX3R5cGUgcHJlZml4X2xlbiA9IDA7CisgIHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBsX2l0ZXI7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiKTsKKyAgICBpZiAoIWZvdW5kX3ByZWZpeCkgeworICAgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKGxfaXRlci0+YXQocG9zKSA9PSAnKicpIHsKKyAgICAgICAgICBmb3VuZF9wcmVmaXggPSB0cnVlOworICAgICAgICAgIHByZWZpeF9sZW4gPSBwb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGF2ZV9wcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hpdGVzcGFjZS1vbmx5IGxpbmUuICBUcnVuY2F0ZSBpdC4KKyAgICAgICAgbF9pdGVyLT5jbGVhcigpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobF9pdGVyLT5zaXplKCkgPiBwb3MgJiYgbF9pdGVyLT5hdChwb3MpID09ICcqJyAmJiBwb3MgPT0gcHJlZml4X2xlbikgeworICAgICAgLy8gQnVzaW5lc3MgYXMgdXN1YWwuCisgICAgfSBlbHNlIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAvLyBXaGl0ZXNwYWNlLW9ubHkgbGluZS4gIExldCdzIHRydW5jYXRlIGl0IGZvciB0aGVtLgorICAgICAgbF9pdGVyLT5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgcGF0dGVybiBoYXMgYmVlbiBicm9rZW4uCisgICAgICBoYXZlX3ByZWZpeCA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gSWYgb3VyIHByZWZpeCBzdXJ2aXZlZCwgZGVsZXRlIGl0IGZyb20gZXZlcnkgbGluZS4KKyAgaWYgKGhhdmVfcHJlZml4KSB7CisgICAgLy8gR2V0IHRoZSBzdGFyIHRvby4KKyAgICBwcmVmaXhfbGVuKys7CisgICAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpICsgMTsgbF9pdGVyICE9IGxpbmVzLmVuZCgpOyArK2xfaXRlcikgeworICAgICAgbF9pdGVyLT5lcmFzZSgwLCBwcmVmaXhfbGVuKTsKKyAgICB9CisgIH0KKworICAvLyBOb3cgZGVsZXRlIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUuCisgIHByZWZpeF9sZW4gPSBzdHJpbmc6Om5wb3M7CisgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBpZiAobF9pdGVyLT5lbXB0eSgpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcG9zID0gbF9pdGVyLT5maW5kX2ZpcnN0X25vdF9vZigiIFx0Iik7CisgICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MgJiYgKHByZWZpeF9sZW4gPT0gc3RyaW5nOjpucG9zIHx8IHBvcyA8IHByZWZpeF9sZW4pKSB7CisgICAgICBwcmVmaXhfbGVuID0gcG9zOworICAgIH0KKyAgfQorCisgIC8vIElmIG91ciBwcmVmaXggc3Vydml2ZWQsIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IGxpbmUuCisgIGlmIChwcmVmaXhfbGVuICE9IHN0cmluZzo6bnBvcykgeworICAgIGZvciAobF9pdGVyID0gbGluZXMuYmVnaW4oKSArIDE7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgIGxfaXRlci0+ZXJhc2UoMCwgcHJlZml4X2xlbik7CisgICAgfQorICB9CisKKyAgLy8gUmVtb3ZlIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lLgorICBmb3IgKGxfaXRlciA9IGxpbmVzLmJlZ2luKCk7IGxfaXRlciAhPSBsaW5lcy5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICBwb3MgPSBsX2l0ZXItPmZpbmRfbGFzdF9ub3Rfb2YoIiBcdCIpOworICAgIGlmIChwb3MgIT0gc3RyaW5nOjpucG9zICYmIHBvcyAhPSBsX2l0ZXItPmxlbmd0aCgpIC0gMSkgeworICAgICAgbF9pdGVyLT5lcmFzZShwb3MgKyAxKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGUgZmlyc3QgbGluZSBpcyBlbXB0eSwgcmVtb3ZlIGl0LgorICAvLyBEb24ndCBkbyB0aGlzIGVhcmxpZXIgYmVjYXVzZSBhIGxvdCBvZiBzdGVwcyBza2lwIHRoZSBmaXJzdCBsaW5lLgorICBpZiAobGluZXMuZnJvbnQoKS5lbXB0eSgpKSB7CisgICAgbGluZXMuZXJhc2UobGluZXMuYmVnaW4oKSk7CisgIH0KKworICAvLyBOb3cgcmVqb2luIHRoZSBsaW5lcyBhbmQgY29weSB0aGVtIGJhY2sgaW50byBkb2N0ZXh0LgorICBkb2NzdHJpbmcuY2xlYXIoKTsKKyAgZm9yIChsX2l0ZXIgPSBsaW5lcy5iZWdpbigpOyBsX2l0ZXIgIT0gbGluZXMuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgZG9jc3RyaW5nICs9ICpsX2l0ZXI7CisgICAgZG9jc3RyaW5nICs9ICdcbic7CisgIH0KKworICAvLyBhc3NlcnQoZG9jc3RyaW5nLmxlbmd0aCgpIDw9IHN0cmxlbihkb2N0ZXh0KSk7ICBtYXkgaGFwcGVuLCBzZWUgVEhSSUZULTE3NTUKKyAgaWYgKGRvY3N0cmluZy5sZW5ndGgoKSA8PSBzdHJsZW4oZG9jdGV4dCkpIHsKKyAgICBzdHJjcHkoZG9jdGV4dCwgZG9jc3RyaW5nLmNfc3RyKCkpOworICB9IGVsc2UgeworICAgIGZyZWUoZG9jdGV4dCk7IC8vIHRvbyBzaG9ydAorICAgIGRvY3RleHQgPSBzdHJkdXAoZG9jc3RyaW5nLmNfc3RyKCkpOworICB9CisgIHJldHVybiBkb2N0ZXh0OworfQorCisvKiogU2V0IHRvIHRydWUgdG8gZGVidWcgZG9jc3RyaW5nIHBhcnNpbmcgKi8KK3N0YXRpYyBib29sIGR1bXBfZG9jcyA9IGZhbHNlOworCisvKioKKyAqIER1bXBzIGRvY3N0cmluZ3MgdG8gc3Rkb3V0CisgKiBPbmx5IHdvcmtzIGZvciB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgYW5kIHRoZSB3aG9sZSBwcm9ncmFtIGRvYworICogKGkuZS4sIG5vdCBlbnVtIGNvbnN0YW50cywgc3RydWN0IGZpZWxkcywgb3IgZnVuY3Rpb25zLgorICovCit2b2lkIGR1bXBfZG9jc3RyaW5ncyh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgc3RyaW5nIHByb2dkb2MgPSBwcm9ncmFtLT5nZXRfZG9jKCk7CisgIGlmICghcHJvZ2RvYy5lbXB0eSgpKSB7CisgICAgcHJpbnRmKCJXaG9sZSBwcm9ncmFtIGRvYzpcbiVzXG4iLCBwcm9nZG9jLmNfc3RyKCkpOworICB9CisgIGNvbnN0IHZlY3Rvcjx0X3R5cGVkZWYqPiYgdHlwZWRlZnMgPSBwcm9ncmFtLT5nZXRfdHlwZWRlZnMoKTsKKyAgdmVjdG9yPHRfdHlwZWRlZio+Ojpjb25zdF9pdGVyYXRvciB0X2l0ZXI7CisgIGZvciAodF9pdGVyID0gdHlwZWRlZnMuYmVnaW4oKTsgdF9pdGVyICE9IHR5cGVkZWZzLmVuZCgpOyArK3RfaXRlcikgeworICAgIHRfdHlwZWRlZiogdGQgPSAqdF9pdGVyOworICAgIGlmICh0ZC0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInR5cGVkZWYgJXM6XG4lc1xuIiwgdGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdGQtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfZW51bSo+JiBlbnVtcyA9IHByb2dyYW0tPmdldF9lbnVtcygpOworICB2ZWN0b3I8dF9lbnVtKj46OmNvbnN0X2l0ZXJhdG9yIGVfaXRlcjsKKyAgZm9yIChlX2l0ZXIgPSBlbnVtcy5iZWdpbigpOyBlX2l0ZXIgIT0gZW51bXMuZW5kKCk7ICsrZV9pdGVyKSB7CisgICAgdF9lbnVtKiBlbiA9ICplX2l0ZXI7CisgICAgaWYgKGVuLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigiZW51bSAlczpcbiVzXG4iLCBlbi0+Z2V0X25hbWUoKS5jX3N0cigpLCBlbi0+Z2V0X2RvYygpLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBjb25zdCB2ZWN0b3I8dF9jb25zdCo+JiBjb25zdHMgPSBwcm9ncmFtLT5nZXRfY29uc3RzKCk7CisgIHZlY3Rvcjx0X2NvbnN0Kj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICB0X2NvbnN0KiBjbyA9ICpjX2l0ZXI7CisgICAgaWYgKGNvLT5oYXNfZG9jKCkpIHsKKyAgICAgIHByaW50ZigiY29uc3QgJXM6XG4lc1xuIiwgY28tPmdldF9uYW1lKCkuY19zdHIoKSwgY28tPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHN0cnVjdHMgPSBwcm9ncmFtLT5nZXRfc3RydWN0cygpOworICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICBmb3IgKHNfaXRlciA9IHN0cnVjdHMuYmVnaW4oKTsgc19pdGVyICE9IHN0cnVjdHMuZW5kKCk7ICsrc19pdGVyKSB7CisgICAgdF9zdHJ1Y3QqIHN0ID0gKnNfaXRlcjsKKyAgICBpZiAoc3QtPmhhc19kb2MoKSkgeworICAgICAgcHJpbnRmKCJzdHJ1Y3QgJXM6XG4lc1xuIiwgc3QtPmdldF9uYW1lKCkuY19zdHIoKSwgc3QtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KKyAgY29uc3QgdmVjdG9yPHRfc3RydWN0Kj4mIHhjZXB0aW9ucyA9IHByb2dyYW0tPmdldF94Y2VwdGlvbnMoKTsKKyAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICB0X3N0cnVjdCogeG4gPSAqeF9pdGVyOworICAgIGlmICh4bi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInhjZXB0aW9uICVzOlxuJXNcbiIsIHhuLT5nZXRfbmFtZSgpLmNfc3RyKCksIHhuLT5nZXRfZG9jKCkuY19zdHIoKSk7CisgICAgfQorICB9CisgIGNvbnN0IHZlY3Rvcjx0X3NlcnZpY2UqPiYgc2VydmljZXMgPSBwcm9ncmFtLT5nZXRfc2VydmljZXMoKTsKKyAgdmVjdG9yPHRfc2VydmljZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgIGZvciAodl9pdGVyID0gc2VydmljZXMuYmVnaW4oKTsgdl9pdGVyICE9IHNlcnZpY2VzLmVuZCgpOyArK3ZfaXRlcikgeworICAgIHRfc2VydmljZSogc3YgPSAqdl9pdGVyOworICAgIGlmIChzdi0+aGFzX2RvYygpKSB7CisgICAgICBwcmludGYoInNlcnZpY2UgJXM6XG4lc1xuIiwgc3YtPmdldF9uYW1lKCkuY19zdHIoKSwgc3YtPmdldF9kb2MoKS5jX3N0cigpKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBFbWl0cyBhIHdhcm5pbmcgb24gbGlzdDxieXRlPiwgYmluYXJ5IHR5cGUgaXMgdHlwaWNhbGx5IGEgbXVjaCBiZXR0ZXIgY2hvaWNlLgorICovCit2b2lkIGNoZWNrX2Zvcl9saXN0X29mX2J5dGVzKHRfdHlwZSogbGlzdF9lbGVtX3R5cGUpIHsKKyAgaWYgKChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgJiYgKGxpc3RfZWxlbV90eXBlICE9IE5VTEwpICYmIGxpc3RfZWxlbV90eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZSA9ICh0X2Jhc2VfdHlwZSopbGlzdF9lbGVtX3R5cGU7CisgICAgaWYgKHRiYXNlLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CisgICAgICBwd2FybmluZygxLCAiQ29uc2lkZXIgdXNpbmcgdGhlIG1vcmUgZWZmaWNpZW50IFwiYmluYXJ5XCIgdHlwZSBpbnN0ZWFkIG9mIFwibGlzdDxieXRlPlwiLiIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgYm9vbCBnX2J5dGVfd2FybmluZ19lbWl0dGVkID0gZmFsc2U7CisKKy8qKgorICogRW1pdHMgYSBvbmUtdGltZSB3YXJuaW5nIG9uIGJ5dGUgdHlwZSwgcHJvbW90aW5nIHRoZSBuZXcgaTggdHlwZSBpbnN0ZWFkCisgKi8KK3ZvaWQgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpIHsKKyAgaWYgKCFnX2J5dGVfd2FybmluZ19lbWl0dGVkKSB7CisgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAiVGhlIFwiYnl0ZVwiIHR5cGUgaXMgYSBjb21wYXRpYmlsaXR5IGFsaWFzIGZvciBcImk4XCIuIFVzZSBcImk4XCIgdG8gZW1waGFzaXplIHRoZSAiCisgICAgICAgICAgICAgInNpZ25lZG5lc3Mgb2YgdGhpcyB0eXBlLlxuIik7CisgICAgZ19ieXRlX3dhcm5pbmdfZW1pdHRlZCA9IHRydWU7CisgIH0KK30KKworLyoqCisgKiBQcmludHMgZGVwcmVjYXRpb24gbm90aWNlIGZvciBvbGQgTlMgZGVjbGFyYXRpb25zIHRoYXQgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQKKyAqIElmIG5ld19mb3JtIGlzIE5VTEwsIG9sZF9mb3JtIGlzIGFzc3VtZWQgdG8gYmUgYSBsYW5ndWFnZSBpZGVudGlmaWVyLCBzdWNoIGFzICJjcHAiCisgKiBJZiBuZXdfZm9ybSBpcyBub3QgTlVMTCwgYm90aCBhcmd1bWVudHMgYXJlIHVzZWQgZXhhY3RseSBhcyBnaXZlbgorICovCit2b2lkIGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKGNvbnN0IGNoYXIqIG9sZF9mb3JtLCBjb25zdCBjaGFyKiBuZXdfZm9ybSkgeworICBjb25zdCBjaGFyKiByZW1haW5kZXIgPSAiIjsKKyAgaWYoIG5ld19mb3JtID09IE5VTEwpIHsKKyAgICBuZXdfZm9ybSA9IG9sZF9mb3JtOworICAgIHJlbWFpbmRlciA9ICJfbmFtZXNwYWNlIjsKKyAgfQorICBmYWlsdXJlKCJVbnN1cHBvcnRlZCBkZWNsYXJhdGlvbiAnJXMlcycuIFVzZSAnbmFtZXNwYWNlICVzJyBpbnN0ZWFkLiIsIG9sZF9mb3JtLCByZW1haW5kZXIsIG5ld19mb3JtKTsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZlcnNpb24gbnVtYmVyCisgKi8KK3ZvaWQgdmVyc2lvbigpIHsKKyAgcHJpbnRmKCJUaHJpZnQgdmVyc2lvbiAlc1xuIiwgVEhSSUZUX1ZFUlNJT04pOworfQorCisvKioKKyAqIERpc3BsYXkgdGhlIHVzYWdlIG1lc3NhZ2UgYW5kIHRoZW4gZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUuCisgKi8KK3ZvaWQgdXNhZ2UoKSB7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHRocmlmdCBbb3B0aW9uc10gZmlsZVxuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJVc2UgdGhyaWZ0IC1oZWxwIGZvciBhIGxpc3Qgb2Ygb3B0aW9uc1xuIik7CisgIGV4aXQoMSk7Cit9CisKKy8qKgorICogRGlwbGF5cyB0aGUgaGVscCBtZXNzYWdlIGFuZCB0aGVuIGV4aXRzIHdpdGggYW4gZXJyb3IgY29kZS4KKyAqLwordm9pZCBoZWxwKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB0aHJpZnQgW29wdGlvbnNdIGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC12ZXJzaW9uICAgIFByaW50IHRoZSBjb21waWxlciB2ZXJzaW9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1vIGRpciAgICAgIFNldCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuLSogcGFja2FnZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgIChkZWZhdWx0OiBjdXJyZW50IGRpcmVjdG9yeSlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW91dCBkaXIgICAgU2V0IHRoZSBvdXB1dCBsb2NhdGlvbiBmb3IgZ2VuZXJhdGVkIGZpbGVzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgKG5vIGdlbi0qIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1JIGRpciAgICAgIEFkZCBhIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJlY3Rvcmllc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgIHNlYXJjaGVkIGZvciBpbmNsdWRlIGRpcmVjdGl2ZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLW5vd2FybiAgICAgU3VwcHJlc3MgYWxsIGNvbXBpbGVyIHdhcm5pbmdzIChCQUQhKVxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtc3RyaWN0ICAgICBTdHJpY3QgY29tcGlsZXIgd2FybmluZ3Mgb25cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXZbZXJib3NlXSAgVmVyYm9zZSBtb2RlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1yW2VjdXJzZV0gIEFsc28gZ2VuZXJhdGUgaW5jbHVkZWQgZmlsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLWRlYnVnICAgICAgUGFyc2UgZGVidWcgdHJhY2UgdG8gc3Rkb3V0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgIiAgLS1hbGxvdy1uZWcta2V5cyAgQWxsb3cgbmVnYXRpdmUgZmllbGQga2V5cyAoVXNlZCB0byAiCisgICAgICAgICAgInByZXNlcnZlIHByb3RvY29sXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIC50aHJpZnQgZmlsZXMpXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC0tYWxsb3ctNjRiaXQtY29uc3RzICBEbyBub3QgcHJpbnQgd2FybmluZ3MgYWJvdXQgdXNpbmcgNjQtYml0IGNvbnN0YW50c1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtLWdlbiBTVFIgICBHZW5lcmF0ZSBjb2RlIHdpdGggYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIGdlbmVyYXRvci5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBTVFIgaGFzIHRoZSBmb3JtIGxhbmd1YWdlWzprZXkxPXZhbDFbLGtleTJbLGtleTM9dmFsM11dXS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBLZXlzIGFuZCB2YWx1ZXMgYXJlIG9wdGlvbnMgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IuXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgTWFueSBvcHRpb25zIHdpbGwgbm90IHJlcXVpcmUgdmFsdWVzLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJPcHRpb25zIHJlbGF0ZWQgdG8gYXVkaXQgb3BlcmF0aW9uXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAtLWF1ZGl0IE9sZEZpbGUgICBPbGQgVGhyaWZ0IGZpbGUgdG8gYmUgYXVkaXRlZCB3aXRoICdmaWxlJ1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSW9sZCBkaXIgICAgQWRkIGEgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgc2VhcmNoZWQgZm9yIGluY2x1ZGUgZGlyZWN0aXZlcyBmb3Igb2xkIHRocmlmdCBmaWxlXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1JbmV3IGRpciAgICBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgICBzZWFyY2hlZCBmb3IgaW5jbHVkZSBkaXJlY3RpdmVzIGZvciBuZXcgdGhyaWZ0IGZpbGVcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiQXZhaWxhYmxlIGdlbmVyYXRvcnMgKGFuZCBvcHRpb25zKTpcbiIpOworCisgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3QgZ2VuX21hcCA9IHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZXRfZ2VuZXJhdG9yX21hcCgpOworICB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2VuX21hcF90OjppdGVyYXRvciBpdGVyOworICBmb3IgKGl0ZXIgPSBnZW5fbWFwLmJlZ2luKCk7IGl0ZXIgIT0gZ2VuX21hcC5lbmQoKTsgKytpdGVyKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiICAlcyAoJXMpOlxuIiwKKyAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+Z2V0X3Nob3J0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5nZXRfbG9uZ19uYW1lKCkuY19zdHIoKSk7CisgICAgZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZXItPnNlY29uZC0+Z2V0X2RvY3VtZW50YXRpb24oKS5jX3N0cigpKTsKKyAgfQorICBleGl0KDEpOworfQorCisvKioKKyAqIFlvdSBrbm93LCB3aGVuIEkgc3RhcnRlZCB3b3JraW5nIG9uIFRocmlmdCBJIHJlYWxseSB0aG91Z2h0IGl0IHdhc24ndCBnb2luZworICogdG8gYmVjb21lIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgYmVjYXVzZSBpdCB3YXMganVzdCBhIGdlbmVyYXRvciBhbmQgaXQKKyAqIHdvdWxkbid0IG5lZWQgcnVudGltZSB0eXBlIGluZm9ybWF0aW9uIGFuZCBhbGwgdGhhdCBqYXp6LiBCdXQgdGhlbiB3ZQorICogZGVjaWRlZCB0byBhZGQgY29uc3RhbnRzLCBhbmQgYWxsIG9mIGEgc3VkZGVuIHRoYXQgbWVhbnMgcnVudGltZSB0eXBlCisgKiB2YWxpZGF0aW9uIGFuZCBpbmZlcmVuY2UsIGV4Y2VwdCB0aGUgInJ1bnRpbWUiIGlzIHRoZSBjb2RlIGdlbmVyYXRvcgorICogcnVudGltZS4KKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF9yZWMoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeworICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CisgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNhbm5vdCBkZWNsYXJlIGEgdm9pZCBjb25zdDogIiArIG5hbWU7CisgIH0KKworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX1NUUklORykgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RyaW5nIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBib29sIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgYnl0ZSI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBpMTYiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgaTMyIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6IGNvbnN0IFwiIiArIG5hbWUgKyAiXCIgd2FzIGRlY2xhcmVkIGFzIGk2NCI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSAhPSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSCisgICAgICAgICAgJiYgdmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBkb3VibGUiOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpICsgbmFtZTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpICE9IHRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVIpIHsKKyAgICAgIHRocm93ICJ0eXBlIGVycm9yOiBjb25zdCBcIiIgKyBuYW1lICsgIlwiIHdhcyBkZWNsYXJlZCBhcyBlbnVtIjsKKyAgICB9CisKKyAgICAvLyBzZWUgaWYgdGhlcmUncyBhIGRvdCBpbiB0aGUgaWRlbnRpZmllcgorICAgIHN0ZDo6c3RyaW5nIG5hbWVfcG9ydGlvbiA9IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gKCh0X2VudW0qKXR5cGUpLT5nZXRfY29uc3RhbnRzKCk7CisgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfbmFtZSgpID09IG5hbWVfcG9ydGlvbikgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgIiArIG5hbWUgKyAiIHdhcyBkZWNsYXJlZCBhcyB0eXBlICIgKyB0eXBlLT5nZXRfbmFtZSgpCisgICAgICAgICAgKyAiIHdoaWNoIGlzIGFuIGVudW0sIGJ1dCAiICsgdmFsdWUtPmdldF9pZGVudGlmaWVyKCkKKyAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfTUFQKSB7CisgICAgICB0aHJvdyAidHlwZSBlcnJvcjogY29uc3QgXCIiICsgbmFtZSArICJcIiB3YXMgZGVjbGFyZWQgYXMgc3RydWN0L3hjZXB0aW9uIjsKKyAgICB9CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7CisgICAgICB9CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIHZhbGlkYXRlX2NvbnN0X3JlYyhuYW1lICsgIi4iICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpLCBmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgfQorICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgdF90eXBlKiBrX3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgdF90eXBlKiB2X3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF90eXBlKiBlX3R5cGU7CisgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgeworICAgICAgZV90eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVfdHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfQorICAgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbGlzdCgpOworICAgIHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGVsZW0+IiwgZV90eXBlLCAqdl9pdGVyKTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBDaGVjayBzaW1wbGUgaWRlbnRpZmllciBuYW1lcworICogSXQncyBlYXNpZXIgdG8gZG8gaXQgdGhpcyB3YXkgaW5zdGVhZCBvZiByZXdyaXRpbmcgdGhlIHdob2xlIGdyYW1tYXIgZXRjLgorICovCit2b2lkIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKGNvbnN0IGNoYXIqIGlkZW50aWZpZXIpIHsKKyAgc3RyaW5nIG5hbWUoaWRlbnRpZmllcik7CisgIGlmIChuYW1lLmZpbmQoIi4iKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICB5eWVycm9yKCJJZGVudGlmaWVyICVzIGNhbid0IGhhdmUgYSBkb3QuIiwgaWRlbnRpZmllcik7CisgICAgZXhpdCgxKTsKKyAgfQorfQorCisvKioKKyAqIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBwYXJzZWQgY29uc3QgaW5mb3JtYXRpb24gYWdhaW5zdCBpdHMgZGVjbGFyZWQgdHlwZQorICovCit2b2lkIHZhbGlkYXRlX2NvbnN0X3R5cGUodF9jb25zdCogYykgeworICB2YWxpZGF0ZV9jb25zdF9yZWMoYy0+Z2V0X25hbWUoKSwgYy0+Z2V0X3R5cGUoKSwgYy0+Z2V0X3ZhbHVlKCkpOworfQorCisvKioKKyAqIENoZWNrIHRoZSB0eXBlIG9mIGEgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBhIGZpZWxkLgorICovCit2b2lkIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKHRfZmllbGQqIGZpZWxkLCB0X2NvbnN0X3ZhbHVlKiBjdikgeworICB2YWxpZGF0ZV9jb25zdF9yZWMoZmllbGQtPmdldF9uYW1lKCksIGZpZWxkLT5nZXRfdHlwZSgpLCBjdik7Cit9CisKKy8qKgorICogQ2hlY2sgdGhhdCBhbGwgdGhlIGVsZW1lbnRzIG9mIGEgdGhyb3dzIGJsb2NrIGFyZSBhY3R1YWxseSBleGNlcHRpb25zLgorICovCitib29sIHZhbGlkYXRlX3Rocm93cyh0X3N0cnVjdCogdGhyb3dzKSB7CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0aHJvd3MtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgIGlmICghdF9nZW5lcmF0b3I6OmdldF90cnVlX3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTa2lwcyBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgKi8KK2Jvb2wgc2tpcF91dGY4X2JvbShGSUxFKiBmKSB7CisKKyAgLy8gcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgYnV0IHdvcmtzCisgIGlmIChmZ2V0YyhmKSA9PSAweEVGKSB7CisgICAgaWYgKGZnZXRjKGYpID09IDB4QkIpIHsKKyAgICAgIGlmIChmZ2V0YyhmKSA9PSAweEJGKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJld2luZChmKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHByb2dyYW0KKyAqLwordm9pZCBwYXJzZSh0X3Byb2dyYW0qIHByb2dyYW0sIHRfcHJvZ3JhbSogcGFyZW50X3Byb2dyYW0pIHsKKyAgLy8gR2V0IHNjb3BlIGZpbGUgcGF0aAorICBzdHJpbmcgcGF0aCA9IHByb2dyYW0tPmdldF9wYXRoKCk7CisKKyAgLy8gU2V0IGN1cnJlbnQgZGlyIGdsb2JhbCwgd2hpY2ggaXMgdXNlZCBpbiB0aGUgaW5jbHVkZV9maWxlIGZ1bmN0aW9uCisgIGdfY3VyZGlyID0gZGlyZWN0b3J5X25hbWUocGF0aCk7CisgIGdfY3VycGF0aCA9IHBhdGg7CisKKyAgLy8gT3BlbiB0aGUgZmlsZQorICAvLyBza2lwIFVURi04IEJPTSBpZiB0aGVyZSBpcyBvbmUKKyAgeXlpbiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInIiKTsKKyAgaWYgKHl5aW4gPT0gMCkgeworICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGU6IFwiJXNcIiIsIHBhdGguY19zdHIoKSk7CisgIH0KKyAgaWYgKHNraXBfdXRmOF9ib20oeXlpbikpCisgICAgcHZlcmJvc2UoIlNraXBwZWQgVVRGLTggQk9NIGF0ICVzXG4iLCBwYXRoLmNfc3RyKCkpOworCisgIC8vIENyZWF0ZSBuZXcgc2NvcGUgYW5kIHNjYW4gZm9yIGluY2x1ZGVzCisgIHB2ZXJib3NlKCJTY2FubmluZyAlcyBmb3IgaW5jbHVkZXNcbiIsIHBhdGguY19zdHIoKSk7CisgIGdfcGFyc2VfbW9kZSA9IElOQ0xVREVTOworICBnX3Byb2dyYW0gPSBwcm9ncmFtOworICBnX3Njb3BlID0gcHJvZ3JhbS0+c2NvcGUoKTsKKyAgdHJ5IHsKKyAgICB5eWxpbmVubyA9IDE7CisgICAgaWYgKHl5cGFyc2UoKSAhPSAwKSB7CisgICAgICBmYWlsdXJlKCJQYXJzZXIgZXJyb3IgZHVyaW5nIGluY2x1ZGUgcGFzcy4iKTsKKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyB4KSB7CisgICAgZmFpbHVyZSh4LmNfc3RyKCkpOworICB9CisgIGZjbG9zZSh5eWluKTsKKworICAvLyBSZWN1cnNpdmVseSBwYXJzZSBhbGwgdGhlIGluY2x1ZGUgcHJvZ3JhbXMKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW0tPmdldF9pbmNsdWRlcygpOworICB2ZWN0b3I8dF9wcm9ncmFtKj46Oml0ZXJhdG9yIGl0ZXI7CisgIGZvciAoaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGl0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraXRlcikgeworICAgIHBhcnNlKCppdGVyLCBwcm9ncmFtKTsKKyAgfQorCisgIC8vIHJlc2V0IHByb2dyYW0gZG9jdGV4dCBzdGF0dXMgYmVmb3JlIHBhcnNpbmcgYSBuZXcgZmlsZQorICByZXNldF9wcm9ncmFtX2RvY3RleHRfaW5mbygpOworCisgIC8vIFBhcnNlIHRoZSBwcm9ncmFtIGZpbGUKKyAgZ19wYXJzZV9tb2RlID0gUFJPR1JBTTsKKyAgZ19wcm9ncmFtID0gcHJvZ3JhbTsKKyAgZ19zY29wZSA9IHByb2dyYW0tPnNjb3BlKCk7CisgIGdfcGFyZW50X3Njb3BlID0gKHBhcmVudF9wcm9ncmFtICE9IE5VTEwpID8gcGFyZW50X3Byb2dyYW0tPnNjb3BlKCkgOiBOVUxMOworICBnX3BhcmVudF9wcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZSgpICsgIi4iOworICBnX2N1cnBhdGggPSBwYXRoOworCisgIC8vIE9wZW4gdGhlIGZpbGUKKyAgLy8gc2tpcCBVVEYtOCBCT00gaWYgdGhlcmUgaXMgb25lCisgIHl5aW4gPSBmb3BlbihwYXRoLmNfc3RyKCksICJyIik7CisgIGlmICh5eWluID09IDApIHsKKyAgICBmYWlsdXJlKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiBcIiVzXCIiLCBwYXRoLmNfc3RyKCkpOworICB9CisgIGlmIChza2lwX3V0ZjhfYm9tKHl5aW4pKQorICAgIHB2ZXJib3NlKCJTa2lwcGVkIFVURi04IEJPTSBhdCAlc1xuIiwgcGF0aC5jX3N0cigpKTsKKworICBwdmVyYm9zZSgiUGFyc2luZyAlcyBmb3IgdHlwZXNcbiIsIHBhdGguY19zdHIoKSk7CisgIHl5bGluZW5vID0gMTsKKyAgdHJ5IHsKKyAgICBpZiAoeXlwYXJzZSgpICE9IDApIHsKKyAgICAgIGZhaWx1cmUoIlBhcnNlciBlcnJvciBkdXJpbmcgdHlwZXMgcGFzcy4iKTsKKyAgICB9CisgIH0gY2F0Y2ggKHN0cmluZyB4KSB7CisgICAgZmFpbHVyZSh4LmNfc3RyKCkpOworICB9CisgIGZjbG9zZSh5eWluKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZSBjb2RlCisgKi8KK3ZvaWQgZ2VuZXJhdGUodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgZ2VuZXJhdG9yX3N0cmluZ3MpIHsKKyAgLy8gT29vb2hoLCByZWN1cnNpdmUgY29kZSBnZW5lcmF0aW9uLCBob3QhIQorICBpZiAoZ2VuX3JlY3Vyc2UpIHsKKyAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbS0+Z2V0X2luY2x1ZGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgLy8gUHJvcGFnYXRlIG91dHB1dCBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIHByb2dyYW1zCisgICAgICBpbmNsdWRlc1tpXS0+c2V0X291dF9wYXRoKHByb2dyYW0tPmdldF9vdXRfcGF0aCgpLCBwcm9ncmFtLT5pc19vdXRfcGF0aF9hYnNvbHV0ZSgpKTsKKworICAgICAgZ2VuZXJhdGUoaW5jbHVkZXNbaV0sIGdlbmVyYXRvcl9zdHJpbmdzKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb2RlIQorICB0cnkgeworICAgIHB2ZXJib3NlKCJQcm9ncmFtOiAlc1xuIiwgcHJvZ3JhbS0+Z2V0X3BhdGgoKS5jX3N0cigpKTsKKworICAgIGlmIChkdW1wX2RvY3MpIHsKKyAgICAgIGR1bXBfZG9jc3RyaW5ncyhwcm9ncmFtKTsKKyAgICB9CisKKyAgICB2ZWN0b3I8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBmb3IgKGl0ZXIgPSBnZW5lcmF0b3Jfc3RyaW5ncy5iZWdpbigpOyBpdGVyICE9IGdlbmVyYXRvcl9zdHJpbmdzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIHRfZ2VuZXJhdG9yKiBnZW5lcmF0b3IgPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAqaXRlcik7CisKKyAgICAgIGlmIChnZW5lcmF0b3IgPT0gTlVMTCkgeworI2lmZGVmIFRIUklGVF9FTkFCTEVfUExVR0lOCisgICAgICAgIHN3aXRjaCAocGx1Z2luX291dHB1dDo6ZGVsZWdhdGVUb1BsdWdpbihwcm9ncmFtLCAqaXRlcikpIHsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9OT1RfRk9VTkQ6CisgICAgICAgICAgICBwd2FybmluZygxLCAiVW5hYmxlIHRvIGdldCBhIGdlbmVyYXRvciBmb3IgXCIlc1wiLlxuIiwgaXRlci0+Y19zdHIoKSk7CisgICAgICAgICAgICBnX2dlbmVyYXRvcl9mYWlsdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgcGx1Z2luX291dHB1dDo6UExVR0lOX0ZBSUxVUkU6CisgICAgICAgICAgICBwd2FybmluZygxLCAiUGx1Z2luIGdlbmVyYXRvciBmb3IgXCIlc1wiIGZhaWxlZC5cbiIsIGl0ZXItPmNfc3RyKCkpOworICAgICAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIHBsdWdpbl9vdXRwdXQ6OlBMVUdJTl9TVUNDRUVTUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHB3YXJuaW5nKDEsICJVbmFibGUgdG8gZ2V0IGEgZ2VuZXJhdG9yIGZvciBcIiVzXCIuXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgZ19nZW5lcmF0b3JfZmFpbHVyZSA9IHRydWU7CisjZW5kaWYKKyAgICAgIH0gZWxzZSBpZiAoZ2VuZXJhdG9yKSB7CisgICAgICAgIGdlbmVyYXRvci0+dmFsaWRhdGVfaW5wdXQoKTsKKyAgICAgICAgcHZlcmJvc2UoIkdlbmVyYXRpbmcgXCIlc1wiXG4iLCBpdGVyLT5jX3N0cigpKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5nZW5lcmF0ZV9wcm9ncmFtKCk7CisgICAgICAgIGRlbGV0ZSBnZW5lcmF0b3I7CisgICAgICB9CisgICAgfQorICB9IGNhdGNoIChzdHJpbmcgcykgeworICAgIGZhaWx1cmUoIkVycm9yOiAlc1xuIiwgcy5jX3N0cigpKTsKKyAgfSBjYXRjaCAoY29uc3QgY2hhciogZXhjKSB7CisgICAgZmFpbHVyZSgiRXJyb3I6ICVzXG4iLCBleGMpOworICB9Cit9CisKK3ZvaWQgYXVkaXQodF9wcm9ncmFtKiBuZXdfcHJvZ3JhbSwKKyAgICAgICAgICAgdF9wcm9ncmFtKiBvbGRfcHJvZ3JhbSwKKyAgICAgICAgICAgc3RyaW5nIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoLAorICAgICAgICAgICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpIHsKKyAgdmVjdG9yPHN0cmluZz4gdGVtcF9pbmNsX3NlYXJjaHBhdGggPSBnX2luY2xfc2VhcmNocGF0aDsKKyAgaWYgKCFvbGRfdGhyaWZ0X2luY2x1ZGVfcGF0aC5lbXB0eSgpKSB7CisgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKG9sZF90aHJpZnRfaW5jbHVkZV9wYXRoKTsKKyAgfQorCisgIHBhcnNlKG9sZF9wcm9ncmFtLCBOVUxMKTsKKworICBnX2luY2xfc2VhcmNocGF0aCA9IHRlbXBfaW5jbF9zZWFyY2hwYXRoOworICBpZiAoIW5ld190aHJpZnRfaW5jbHVkZV9wYXRoLmVtcHR5KCkpIHsKKyAgICBnX2luY2xfc2VhcmNocGF0aC5wdXNoX2JhY2sobmV3X3RocmlmdF9pbmNsdWRlX3BhdGgpOworICB9CisKKyAgcGFyc2UobmV3X3Byb2dyYW0sIE5VTEwpOworCisgIGNvbXBhcmVfbmFtZXNwYWNlKG5ld19wcm9ncmFtLCBvbGRfcHJvZ3JhbSk7CisgIGNvbXBhcmVfc2VydmljZXMobmV3X3Byb2dyYW0tPmdldF9zZXJ2aWNlcygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3NlcnZpY2VzKCkpOworICBjb21wYXJlX2VudW1zKG5ld19wcm9ncmFtLT5nZXRfZW51bXMoKSwgb2xkX3Byb2dyYW0tPmdldF9lbnVtcygpKTsKKyAgY29tcGFyZV9zdHJ1Y3RzKG5ld19wcm9ncmFtLT5nZXRfc3RydWN0cygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3N0cnVjdHMoKSk7CisgIGNvbXBhcmVfc3RydWN0cyhuZXdfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpLCBvbGRfcHJvZ3JhbS0+Z2V0X3hjZXB0aW9ucygpKTsKKyAgY29tcGFyZV9jb25zdHMobmV3X3Byb2dyYW0tPmdldF9jb25zdHMoKSwgb2xkX3Byb2dyYW0tPmdldF9jb25zdHMoKSk7Cit9CisKKy8qKgorICogUGFyc2UgaXQgdXAuLiB0aGVuIHNwaXQgaXQgYmFjayBvdXQsIGluIHByZXR0eSBtdWNoIGV2ZXJ5IGxhbmd1YWdlLiBBbHJpZ2h0CisgKiBub3QgdGhhdCBtYW55IGxhbmd1YWdlcywgYnV0IHRoZSBjb29sIG9uZXMgdGhhdCB3ZSBjYXJlIGFib3V0LgorICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgaW50IGk7CisgIHN0ZDo6c3RyaW5nIG91dF9wYXRoOworICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlID0gZmFsc2U7CisKKyAgLy8gU2V0dXAgdGltZSBzdHJpbmcKKyAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgIGdfdGltZV9zdHIgPSBjdGltZSgmbm93KTsKKworICAvLyBDaGVjayBmb3IgbmVjZXNzYXJ5IGFyZ3VtZW50cywgeW91IGdvdHRhIGhhdmUgYXQgbGVhc3QgYSBmaWxlbmFtZSBhbmQKKyAgLy8gYW4gb3V0cHV0IGxhbmd1YWdlIGZsYWcKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgdXNhZ2UoKTsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IGdlbmVyYXRvcl9zdHJpbmdzOworICBzdHJpbmcgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGg7CisgIHN0cmluZyBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aDsKKyAgc3RyaW5nIG9sZF9pbnB1dF9maWxlOworCisgIC8vIFNldCB0aGUgY3VycmVudCBwYXRoIHRvIGEgZHVtbXkgdmFsdWUgdG8gbWFrZSB3YXJuaW5nIG1lc3NhZ2VzIGNsZWFyZXIuCisgIGdfY3VycGF0aCA9ICJhcmd1bWVudHMiOworCisgIC8vIEhhY2t5IHBhcmFtZXRlciBoYW5kbGluZy4uLiBJIGRpZG4ndCBmZWVsIGxpa2UgdXNpbmcgYSBsaWJyYXJ5IHNvcnJ5IQorICBmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworICAgIGNoYXIqIGFyZzsKKworICAgIGFyZyA9IHN0cnRvayhhcmd2W2ldLCAiICIpOworICAgIHdoaWxlIChhcmcgIT0gTlVMTCkgeworICAgICAgLy8gVHJlYXQgZG91YmxlIGRhc2hlcyBhcyBzaW5nbGUgZGFzaGVzCisgICAgICBpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0gPT0gJy0nKSB7CisgICAgICAgICsrYXJnOworICAgICAgfQorCisgICAgICBpZiAoc3RyY21wKGFyZywgIi1oZWxwIikgPT0gMCkgeworICAgICAgICBoZWxwKCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItdmVyc2lvbiIpID09IDApIHsKKyAgICAgICAgdmVyc2lvbigpOworICAgICAgICBleGl0KDApOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWRlYnVnIikgPT0gMCkgeworICAgICAgICBnX2RlYnVnID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1ub3dhcm4iKSA9PSAwKSB7CisgICAgICAgIGdfd2FybiA9IDA7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItc3RyaWN0IikgPT0gMCkgeworICAgICAgICBnX3N0cmljdCA9IDI1NTsKKyAgICAgICAgZ193YXJuID0gMjsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLXZlcmJvc2UiKSA9PSAwKSB7CisgICAgICAgIGdfdmVyYm9zZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItciIpID09IDAgfHwgc3RyY21wKGFyZywgIi1yZWN1cnNlIikgPT0gMCkgeworICAgICAgICBnZW5fcmVjdXJzZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYWxsb3ctbmVnLWtleXMiKSA9PSAwKSB7CisgICAgICAgIGdfYWxsb3dfbmVnX2ZpZWxkX2tleXMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWFsbG93LTY0Yml0LWNvbnN0cyIpID09IDApIHsKKyAgICAgICAgZ19hbGxvd182NGJpdF9jb25zdHMgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLWdlbiIpID09IDApIHsKKyAgICAgICAgYXJnID0gYXJndlsrK2ldOworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZ2VuZXJhdG9yIHNwZWNpZmljYXRpb25cbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ2VuZXJhdG9yX3N0cmluZ3MucHVzaF9iYWNrKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItSSIpID09IDApIHsKKyAgICAgICAgLy8gQW4gYXJndW1lbnQgb2YgIi1JXCBhc2RmIiBpcyBpbnZhbGlkIGFuZCBoYXMgdW5rbm93biByZXN1bHRzCisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKworICAgICAgICBpZiAoYXJnID09IE5VTEwpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgSW5jbHVkZSBkaXJlY3RvcnlcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgZ19pbmNsX3NlYXJjaHBhdGgucHVzaF9iYWNrKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKChzdHJjbXAoYXJnLCAiLW8iKSA9PSAwKSB8fCAoc3RyY21wKGFyZywgIi1vdXQiKSA9PSAwKSkgeworICAgICAgICBvdXRfcGF0aF9pc19hYnNvbHV0ZSA9IChzdHJjbXAoYXJnLCAiLW91dCIpID09IDApID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLW86IG1pc3Npbmcgb3V0cHV0IGRpcmVjdG9yeVxuIik7CisgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfcGF0aCA9IGFyZzsKKworI2lmZGVmIF9XSU4zMgorICAgICAgICAvLyBzdHJpcCBvdXQgdHJhaWxpbmcgXCBvbiBXaW5kb3dzCisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdCA9IG91dF9wYXRoLmxlbmd0aCgpIC0gMTsKKyAgICAgICAgaWYgKG91dF9wYXRoW2xhc3RdID09ICdcXCcpIHsKKyAgICAgICAgICBvdXRfcGF0aC5lcmFzZShsYXN0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICghY2hlY2tfaXNfZGlyZWN0b3J5KG91dF9wYXRoLmNfc3RyKCkpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1hdWRpdCIpID09IDApIHsKKyAgICAgICAgZ19hdWRpdCA9IHRydWU7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIG9sZCB0aHJpZnQgZmlsZSBuYW1lIGZvciBhdWRpdCBvcGVyYXRpb25cbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBvbGRfdGhyaWZ0X2ZpbGVfcnBbVEhSSUZUX1BBVEhfTUFYXTsKKworICAgICAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICAgICAgaWYgKHNhZmVyZWFscGF0aChhcmcsIG9sZF90aHJpZnRfZmlsZV9ycCkgPT0gTlVMTCkgeworICAgICAgICAgIGZhaWx1cmUoIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgd2l0aCByZWFscGF0aDogJXMiLCBhcmcpOworICAgICAgICB9CisgICAgICAgIG9sZF9pbnB1dF9maWxlID0gc3RyaW5nKG9sZF90aHJpZnRfZmlsZV9ycCk7CisgICAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItYXVkaXQtbm9mYXRhbCIpID09IDApIHsKKyAgICAgICAgZ19hdWRpdF9mYXRhbCA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYXJnLCAiLUlvbGQiKSA9PSAwKSB7CisgICAgICAgIGFyZyA9IGFyZ3ZbKytpXTsKKyAgICAgICAgaWYgKGFyZyA9PSBOVUxMKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIEluY2x1ZGUgZGlyZWN0b3J5IGZvciBvbGQgdGhyaWZ0IGZpbGVcbiIpOworICAgICAgICAgIHVzYWdlKCk7CisgICAgICAgIH0KKyAgICAgICAgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGggPSBzdHJpbmcoYXJnKTsKKyAgICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi1JbmV3IikgPT0gMCkgeworICAgICAgICBhcmcgPSBhcmd2WysraV07CisgICAgICAgIGlmIChhcmcgPT0gTlVMTCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBJbmNsdWRlIGRpcmVjdG9yeSBmb3IgbmV3IHRocmlmdCBmaWxlXG4iKTsKKyAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9CisgICAgICAgIG5ld190aHJpZnRfaW5jbHVkZV9wYXRoID0gc3RyaW5nKGFyZyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBhcmcpOworICAgICAgICB1c2FnZSgpOworICAgICAgfQorCisgICAgICAvLyBUb2tlbml6ZSBtb3JlCisgICAgICBhcmcgPSBzdHJ0b2soTlVMTCwgIiAiKTsKKyAgICB9CisgIH0KKworICAvLyBkaXNwbGF5IGhlbHAKKyAgaWYgKChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItaGVscCIpID09IDApIHx8IChzdHJjbXAoYXJndlthcmdjIC0gMV0sICItLWhlbHAiKSA9PSAwKSkgeworICAgIGhlbHAoKTsKKyAgfQorCisgIC8vIGlmIHlvdSdyZSBhc2tpbmcgZm9yIHZlcnNpb24sIHlvdSBoYXZlIGEgcmlnaHQgbm90IHRvIHBhc3MgYSBmaWxlCisgIGlmICgoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLXZlcnNpb24iKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbYXJnYyAtIDFdLCAiLS12ZXJzaW9uIikgPT0gMCkpIHsKKyAgICB2ZXJzaW9uKCk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgZ2xvYmFsIHR5cGVzCisgIGluaXRHbG9iYWxzKCk7CisKKyAgaWYgKGdfYXVkaXQpIHsKKyAgICAvLyBBdWRpdCBvcGVyYXRpb24KKworICAgIGlmIChvbGRfaW5wdXRfZmlsZS5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsZSBuYW1lIG9mIG9sZCB0aHJpZnQgZmlsZSBmb3IgYXVkaXRcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisKKyAgICBjaGFyIG5ld190aHJpZnRfZmlsZV9ycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWUgb2YgbmV3IHRocmlmdCBmaWxlIGZvciBhdWRpdFxuIik7CisgICAgICB1c2FnZSgpOworICAgIH0KKyAgICAvLyBjcHBjaGVjay1zdXBwcmVzcyB1bmluaXR2YXIKKyAgICBpZiAoc2FmZXJlYWxwYXRoKGFyZ3ZbaV0sIG5ld190aHJpZnRfZmlsZV9ycCkgPT0gTlVMTCkgeworICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOworICAgIH0KKyAgICBzdHJpbmcgbmV3X2lucHV0X2ZpbGUobmV3X3RocmlmdF9maWxlX3JwKTsKKworICAgIHRfcHJvZ3JhbSBuZXdfcHJvZ3JhbShuZXdfaW5wdXRfZmlsZSk7CisgICAgdF9wcm9ncmFtIG9sZF9wcm9ncmFtKG9sZF9pbnB1dF9maWxlKTsKKworICAgIGF1ZGl0KCZuZXdfcHJvZ3JhbSwgJm9sZF9wcm9ncmFtLCBuZXdfdGhyaWZ0X2luY2x1ZGVfcGF0aCwgb2xkX3RocmlmdF9pbmNsdWRlX3BhdGgpOworCisgIH0gZWxzZSB7CisgICAgLy8gR2VuZXJhdGUgb3B0aW9ucworCisgICAgLy8gWW91IGdvdHRhIGdlbmVyYXRlIHNvbWV0aGluZyEKKyAgICBpZiAoZ2VuZXJhdG9yX3N0cmluZ3MuZW1wdHkoKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJObyBvdXRwdXQgbGFuZ3VhZ2Uocykgc3BlY2lmaWVkXG4iKTsKKyAgICAgIHVzYWdlKCk7CisgICAgfQorCisgICAgLy8gUmVhbC1wYXRoaWZ5IGl0CisgICAgY2hhciBycFtUSFJJRlRfUEFUSF9NQVhdOworICAgIGlmIChhcmd2W2ldID09IE5VTEwpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTWlzc2luZyBmaWxlIG5hbWVcbiIpOworICAgICAgdXNhZ2UoKTsKKyAgICB9CisgICAgLy8gY3BwY2hlY2stc3VwcHJlc3MgdW5pbml0dmFyCisgICAgaWYgKHNhZmVyZWFscGF0aChhcmd2W2ldLCBycCkgPT0gTlVMTCkgeworICAgICAgZmFpbHVyZSgiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZSB3aXRoIHJlYWxwYXRoOiAlcyIsIGFyZ3ZbaV0pOworICAgIH0KKyAgICBzdHJpbmcgaW5wdXRfZmlsZShycCk7CisKKyAgICAvLyBJbnN0YW5jZSBvZiB0aGUgZ2xvYmFsIHBhcnNlIHRyZWUKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKGlucHV0X2ZpbGUpOworICAgIGlmIChvdXRfcGF0aC5zaXplKCkpIHsKKyAgICAgIHByb2dyYW0tPnNldF9vdXRfcGF0aChvdXRfcGF0aCwgb3V0X3BhdGhfaXNfYWJzb2x1dGUpOworICAgIH0KKworICAgIC8vIENvbXB1dGUgdGhlIGNwcCBpbmNsdWRlIHByZWZpeC4KKyAgICAvLyBpbmZlciB0aGlzIGZyb20gdGhlIGZpbGVuYW1lIHBhc3NlZCBpbgorICAgIHN0cmluZyBpbnB1dF9maWxlbmFtZSA9IGFyZ3ZbaV07CisgICAgc3RyaW5nIGluY2x1ZGVfcHJlZml4OworCisgICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0cmluZzo6bnBvczsKKyAgICBpZiAoKGxhc3Rfc2xhc2ggPSBpbnB1dF9maWxlbmFtZS5yZmluZCgiLyIpKSAhPSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4ID0gaW5wdXRfZmlsZW5hbWUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOworICAgIH0KKworICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7CisKKyAgICAvLyBQYXJzZSBpdCEKKyAgICBwYXJzZShwcm9ncmFtLCBOVUxMKTsKKworICAgIC8vIFRoZSBjdXJyZW50IHBhdGggaXMgbm90IHJlYWxseSByZWxldmFudCB3aGVuIHdlIGFyZSBkb2luZyBnZW5lcmF0aW9uLgorICAgIC8vIFJlc2V0IHRoZSB2YXJpYWJsZSB0byBtYWtlIHdhcm5pbmcgbWVzc2FnZXMgY2xlYXJlci4KKyAgICBnX2N1cnBhdGggPSAiZ2VuZXJhdGlvbiI7CisgICAgLy8gUmVzZXQgeXlsaW5lbm8gZm9yIHRoZSBoZWNrIG9mIGl0LiAgVXNlIDEgaW5zdGVhZCBvZiAwIGJlY2F1c2UKKyAgICAvLyBUaGF0IGlzIHdoYXQgc2hvd3MgdXAgZHVyaW5nIGFyZ3VtZW50IHBhcnNpbmcuCisgICAgeXlsaW5lbm8gPSAxOworCisgICAgLy8gR2VuZXJhdGUgaXQhCisgICAgZ2VuZXJhdGUocHJvZ3JhbSwgZ2VuZXJhdG9yX3N0cmluZ3MpOworICAgIGRlbGV0ZSBwcm9ncmFtOworICB9CisKKyAgLy8gQ2xlYW4gdXAuIFdobyBhbSBJIGtpZGRpbmcuLi4gdGhpcyBwcm9ncmFtIHByb2JhYmx5IG9ycGhhbnMgaGVhcCBtZW1vcnkKKyAgLy8gYWxsIG92ZXIgdGhlIHBsYWNlLCBidXQgd2hvIGNhcmVzIGJlY2F1c2UgaXQgaXMgYWJvdXQgdG8gZXhpdCBhbmQgaXQgaXMKKyAgLy8gYWxsIHJlZmVyZW5jZWQgYW5kIHVzZWQgYnkgdGhpcyB3YWNreSBwYXJzZSB0cmVlIHVwIHVudGlsIG5vdyBhbnl3YXlzLgorICBjbGVhckdsb2JhbHMoKTsKKworICAvLyBGaW5pc2hlZAorICBpZiAoZ19yZXR1cm5fZmFpbHVyZSAmJiBnX2F1ZGl0X2ZhdGFsKSB7CisgICAgZXhpdCgyKTsKKyAgfQorICBpZiAoZ19nZW5lcmF0b3JfZmFpbHVyZSkgeworICAgIGV4aXQoMyk7CisgIH0KKyAgLy8gRmluaXNoZWQKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhYmIwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfTUFJTl9ICisjZGVmaW5lIFRfTUFJTl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAidGhyaWZ0L2xvZ2dpbmcuaCIKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworLyoqCisgKiBEZWZpbmVkIGluIHRoZSBmbGV4IGxpYnJhcnkKKyAqLworCitleHRlcm4gIkMiIHsgaW50IHl5bGV4KHZvaWQpOyB9CisKK2ludCB5eXBhcnNlKHZvaWQpOworCisvKioKKyAqIEV4cGVjdGVkIHRvIGJlIGRlZmluZWQgYnkgRmxleC9CaXNvbgorICovCit2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciogZm10LCAuLi4pOworCisvKioKKyAqIENoZWNrIHNpbXBsZSBpZGVudGlmaWVyIG5hbWVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoY29uc3QgY2hhciogaWRlbnRpZmllcik7CisKKy8qKgorICogQ2hlY2sgY29uc3RhbnQgdHlwZXMKKyAqLwordm9pZCB2YWxpZGF0ZV9jb25zdF90eXBlKHRfY29uc3QqIGMpOworCisvKioKKyAqIENoZWNrIGNvbnN0YW50IHR5cGVzCisgKi8KK3ZvaWQgdmFsaWRhdGVfZmllbGRfdmFsdWUodF9maWVsZCogZmllbGQsIHRfY29uc3RfdmFsdWUqIGN2KTsKKworLyoqCisgKiBDaGVjayBtZW1iZXJzIG9mIGEgdGhyb3dzIGJsb2NrCisgKi8KK2Jvb2wgdmFsaWRhdGVfdGhyb3dzKHRfc3RydWN0KiB0aHJvd3MpOworCisvKioKKyAqIENvbnZlcnRzIGEgc3RyaW5nIGZpbGVuYW1lIGludG8gYSB0aHJpZnQgcHJvZ3JhbSBuYW1lCisgKi8KK3N0ZDo6c3RyaW5nIHByb2dyYW1fbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogR2V0cyB0aGUgZGlyZWN0b3J5IHBhdGggb2YgYSBmaWxlbmFtZQorICovCitzdGQ6OnN0cmluZyBkaXJlY3RvcnlfbmFtZShzdGQ6OnN0cmluZyBmaWxlbmFtZSk7CisKKy8qKgorICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhbiBpbmNsdWRlIGZpbGUKKyAqLworc3RkOjpzdHJpbmcgaW5jbHVkZV9maWxlKHN0ZDo6c3RyaW5nIGZpbGVuYW1lKTsKKworLyoqCisgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc3RvcmVkIGRvY3RleHQgc3RyaW5nLgorICovCit2b2lkIGNsZWFyX2RvY3RleHQoKTsKKworLyoqCisgKiBDbGVhbnMgdXAgdGV4dCBjb21tb25seSBmb3VuZCBpbiBkb3h5Z2VuLWxpa2UgY29tbWVudHMKKyAqLworY2hhciogY2xlYW5fdXBfZG9jdGV4dChjaGFyKiBkb2N0ZXh0KTsKKworLyoqCisgKiBXZSBhcmUgc3VyZSB0aGUgcHJvZ3JhbSBkb2N0ZXh0IGNhbmRpZGF0ZSBpcyByZWFsbHkgdGhlIHByb2dyYW0gZG9jdGV4dC4KKyAqLwordm9pZCBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworCisvKioKKyAqIEVtaXRzIGEgd2FybmluZyBvbiBsaXN0PGJ5dGU+LCBiaW5hcnkgdHlwZSBpcyB0eXBpY2FsbHkgYSBtdWNoIGJldHRlciBjaG9pY2UuCisgKi8KK3ZvaWQgY2hlY2tfZm9yX2xpc3Rfb2ZfYnl0ZXModF90eXBlKiBsaXN0X2VsZW1fdHlwZSk7CisKKy8qKgorICogRW1pdHMgYSBvbmUtdGltZSB3YXJuaW5nIG9uIGJ5dGUgdHlwZSwgcHJvbW90aW5nIHRoZSBuZXcgaTggdHlwZSBpbnN0ZWFkCisgKi8KK3ZvaWQgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworCisvKioKKyAqIFByaW50cyBkZXByZWNhdGlvbiBub3RpY2UgZm9yIG9sZCBOUyBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZAorICogSWYgbmV3X2Zvcm0gaXMgTlVMTCwgb2xkX2Zvcm0gaXMgYXNzdW1lZCB0byBiZSBhIGxhbmd1YWdlIGlkZW50aWZpZXIsIHN1Y2ggYXMgImNwcCIKKyAqIElmIG5ld19mb3JtIGlzIG5vdCBOVUxMLCBib3RoIGFyZ3VtZW50cyBhcmUgdXNlZCBleGFjdGx5IGFzIGdpdmVuCisgKi8KK3ZvaWQgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woY29uc3QgY2hhciogb2xkX2Zvcm0sIGNvbnN0IGNoYXIqIG5ld19mb3JtID0gTlVMTCk7CisKKy8qKgorICogRmxleCB1dGlsaXRpZXMKKyAqLworCitleHRlcm4gaW50IHl5bGluZW5vOworZXh0ZXJuIGNoYXIgeXl0ZXh0W107CitleHRlcm4gc3RkOjpGSUxFKiB5eWluOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNzYzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3BhcnNlLmNjCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorCit0X3R5cGUqIHRfdHlwZTo6Z2V0X3RydWVfdHlwZSgpIHsKKyAgdF90eXBlKiB0eXBlID0gdGhpczsKKyAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHR5cGUgPSAoKHRfdHlwZWRlZiopdHlwZSktPmdldF90eXBlKCk7CisgIH0KKyAgcmV0dXJuIHR5cGU7Cit9CisKK2NvbnN0IHRfdHlwZSogdF90eXBlOjpnZXRfdHJ1ZV90eXBlKCkgY29uc3QgeworICBjb25zdCB0X3R5cGUqIHR5cGUgPSB0aGlzOworICB3aGlsZSAodHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdHlwZSA9ICgodF90eXBlZGVmKil0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMzk4YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9CQVNFX1RZUEVfSAorI2RlZmluZSBUX0JBU0VfVFlQRV9ICisKKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworLyoqCisgKiBBIHRocmlmdCBiYXNlIHR5cGUsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBkZWZpbmVkIGVudW1lcmF0ZWQgdHlwZXMgaW5zaWRlCisgKiB0aGlzIGRlZmluaXRpb24uCisgKgorICovCitjbGFzcyB0X2Jhc2VfdHlwZSA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICAvKioKKyAgICogRW51bWVyYXRpb24gb2YgdGhyaWZ0IGJhc2UgdHlwZXMKKyAgICovCisgIGVudW0gdF9iYXNlIHsKKyAgICBUWVBFX1ZPSUQsCisgICAgVFlQRV9TVFJJTkcsCisgICAgVFlQRV9CT09MLAorICAgIFRZUEVfSTgsCisgICAgVFlQRV9JMTYsCisgICAgVFlQRV9JMzIsCisgICAgVFlQRV9JNjQsCisgICAgVFlQRV9ET1VCTEUKKyAgfTsKKworICB0X2Jhc2VfdHlwZShzdGQ6OnN0cmluZyBuYW1lLCB0X2Jhc2UgYmFzZSkKKyAgICA6IHRfdHlwZShuYW1lKSwgYmFzZV8oYmFzZSksIHN0cmluZ19saXN0XyhmYWxzZSksIGJpbmFyeV8oZmFsc2UpLCBzdHJpbmdfZW51bV8oZmFsc2UpIHt9CisKKyAgdF9iYXNlIGdldF9iYXNlKCkgY29uc3QgeyByZXR1cm4gYmFzZV87IH0KKworICBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1ZPSUQ7IH0KKworICBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGJhc2VfID09IFRZUEVfU1RSSU5HOyB9CisKKyAgYm9vbCBpc19ib29sKCkgY29uc3QgeyByZXR1cm4gYmFzZV8gPT0gVFlQRV9CT09MOyB9CisKKyAgdm9pZCBzZXRfc3RyaW5nX2xpc3QoYm9vbCB2YWwpIHsgc3RyaW5nX2xpc3RfID0gdmFsOyB9CisKKyAgYm9vbCBpc19zdHJpbmdfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19saXN0XyAmJiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpOyB9CisKKyAgdm9pZCBzZXRfYmluYXJ5KGJvb2wgdmFsKSB7IGJpbmFyeV8gPSB2YWw7IH0KKworICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIGJpbmFyeV8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQorCisgIHZvaWQgc2V0X3N0cmluZ19lbnVtKGJvb2wgdmFsKSB7IHN0cmluZ19lbnVtXyA9IHZhbDsgfQorCisgIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7IHJldHVybiBzdHJpbmdfZW51bV8gJiYgYmFzZV8gPT0gVFlQRV9TVFJJTkc7IH0KKworICB2b2lkIGFkZF9zdHJpbmdfZW51bV92YWwoc3RkOjpzdHJpbmcgdmFsKSB7IHN0cmluZ19lbnVtX3ZhbHNfLnB1c2hfYmFjayh2YWwpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfc3RyaW5nX2VudW1fdmFscygpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19lbnVtX3ZhbHNfOyB9CisKKyAgYm9vbCBpc19iYXNlX3R5cGUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIHRfYmFzZV9uYW1lKHRfYmFzZSB0YmFzZSkgeworICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICBjYXNlIFRZUEVfVk9JRDoKKyAgICAgIHJldHVybiAidm9pZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfU1RSSU5HOgorICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0JPT0w6CisgICAgICByZXR1cm4gImJvb2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0k4OgorICAgICAgcmV0dXJuICJpOCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUWVBFX0kzMjoKKyAgICAgIHJldHVybiAiaTMyIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVFlQRV9JNjQ6CisgICAgICByZXR1cm4gImk2NCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuICJkb3VibGUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAiKHVua25vd24pIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB0X2Jhc2UgYmFzZV87CisKKyAgYm9vbCBzdHJpbmdfbGlzdF87CisgIGJvb2wgYmluYXJ5XzsKKyAgYm9vbCBzdHJpbmdfZW51bV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdfZW51bV92YWxzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDhlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0LmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfQ09OU1RfSAorI2RlZmluZSBUX0NPTlNUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIgorCisvKioKKyAqIEEgY29uc3QgaXMgYSBjb25zdGFudCB2YWx1ZSBkZWZpbmVkIGFjcm9zcyBsYW5ndWFnZXMgdGhhdCBoYXMgYSB0eXBlIGFuZAorICogYSB2YWx1ZS4gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCB0aGUgZGVjbGFyZWQgdHlwZSBtaWdodCBub3QgbWF0Y2ggdGhlIHR5cGUKKyAqIG9mIHRoZSB2YWx1ZSBvYmplY3QsIHNpbmNlIHRoYXQgaXMgbm90IGRldGVybWluZWQgdW50aWwgYWZ0ZXIgcGFyc2luZyB0aGUKKyAqIHdob2xlIHRoaW5nIG91dC4KKyAqCisgKi8KK2NsYXNzIHRfY29uc3QgOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2NvbnN0KHRfdHlwZSogdHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpCisgICAgOiB0eXBlXyh0eXBlKSwgbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworICB0X3R5cGUqIGdldF90eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgdF9jb25zdF92YWx1ZSogZ2V0X3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTExNGNmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9DT05TVF9WQUxVRV9ICisjZGVmaW5lIFRfQ09OU1RfVkFMVUVfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZW51bS5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+Cit2b2lkIGNvbnZlcnQoRnJvbSosIFRvJik7Cit9CisKKy8qKgorICogQSBjb25zdCB2YWx1ZSBpcyBzb21ldGhpbmcgcGFyc2VkIHRoYXQgY291bGQgYmUgYSBtYXAsIHNldCwgbGlzdCwgc3RydWN0CisgKiBvciB3aGF0ZXZlci4KKyAqCisgKi8KK2NsYXNzIHRfY29uc3RfdmFsdWUgeworcHVibGljOgorICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgorICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCisgICAqLworICBzdHJ1Y3QgdmFsdWVfY29tcGFyZSB7CisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yKCkodF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIGxlZnQsIHRfY29uc3RfdmFsdWUgY29uc3QqIGNvbnN0JiByaWdodCkgY29uc3QgeworICAgICAgcmV0dXJuICpsZWZ0IDwgKnJpZ2h0OworICAgIH0KKyAgfTsKKworICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7IENWX0lOVEVHRVIsIENWX0RPVUJMRSwgQ1ZfU1RSSU5HLCBDVl9NQVAsIENWX0xJU1QsIENWX0lERU5USUZJRVIsIENWX1VOS05PV04gfTsKKworICB0X2NvbnN0X3ZhbHVlKCkgOiBpbnRWYWxfKDApLCBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikge30KKworICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSA6IGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9pbnRlZ2VyKHZhbCk7IH0KKworICB0X2NvbnN0X3ZhbHVlKHN0ZDo6c3RyaW5nIHZhbCkgOiBpbnRWYWxfKDApLCBkb3VibGVWYWxfKDAuMGYpLCBlbnVtXygodF9lbnVtKikwKSwgdmFsVHlwZV8oQ1ZfVU5LTk9XTikgeyBzZXRfc3RyaW5nKHZhbCk7IH0KKworICB2b2lkIHNldF9zdHJpbmcoc3RkOjpzdHJpbmcgdmFsKSB7CisgICAgdmFsVHlwZV8gPSBDVl9TVFJJTkc7CisgICAgc3RyaW5nVmFsXyA9IHZhbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9zdHJpbmcoKSBjb25zdCB7IHJldHVybiBzdHJpbmdWYWxfOyB9CisKKyAgdm9pZCBzZXRfaW50ZWdlcihpbnQ2NF90IHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfSU5URUdFUjsKKyAgICBpbnRWYWxfID0gdmFsOworICB9CisKKyAgaW50NjRfdCBnZXRfaW50ZWdlcigpIGNvbnN0IHsKKyAgICBpZiAodmFsVHlwZV8gPT0gQ1ZfSURFTlRJRklFUikgeworICAgICAgaWYgKGVudW1fID09IE5VTEwpIHsKKyAgICAgICAgdGhyb3cgImhhdmUgaWRlbnRpZmllciBcIiIgKyBnZXRfaWRlbnRpZmllcigpICsgIlwiLCBidXQgdW5zZXQgZW51bSBvbiBsaW5lISI7CisgICAgICB9CisgICAgICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZG90ID0gaWRlbnRpZmllci5yZmluZCgnLicpOworICAgICAgaWYgKGRvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllci5zdWJzdHIoZG90ICsgMSk7CisgICAgICB9CisgICAgICB0X2VudW1fdmFsdWUqIHZhbCA9IGVudW1fLT5nZXRfY29uc3RhbnRfYnlfbmFtZShpZGVudGlmaWVyKTsKKyAgICAgIGlmICh2YWwgPT0gTlVMTCkgeworICAgICAgICB0aHJvdyAiVW5hYmxlIHRvIGZpbmQgZW51bSB2YWx1ZSBcIiIgKyBpZGVudGlmaWVyICsgIlwiIGluIGVudW0gXCIiICsgZW51bV8tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICsgIlwiIjsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2YWwtPmdldF92YWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gaW50VmFsXzsKKyAgICB9CisgIH0KKworICB2b2lkIHNldF9kb3VibGUoZG91YmxlIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfRE9VQkxFOworICAgIGRvdWJsZVZhbF8gPSB2YWw7CisgIH0KKworICBkb3VibGUgZ2V0X2RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIGRvdWJsZVZhbF87IH0KKworICB2b2lkIHNldF9tYXAoKSB7IHZhbFR5cGVfID0gQ1ZfTUFQOyB9CisKKyAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7IG1hcFZhbF9ba2V5XSA9IHZhbDsgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGdldF9tYXAoKSBjb25zdCB7IHJldHVybiBtYXBWYWxfOyB9CisKKyAgdm9pZCBzZXRfbGlzdCgpIHsgdmFsVHlwZV8gPSBDVl9MSVNUOyB9CisKKyAgdm9pZCBhZGRfbGlzdCh0X2NvbnN0X3ZhbHVlKiB2YWwpIHsgbGlzdFZhbF8ucHVzaF9iYWNrKHZhbCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGdldF9saXN0KCkgY29uc3QgeyByZXR1cm4gbGlzdFZhbF87IH0KKworICB2b2lkIHNldF9pZGVudGlmaWVyKHN0ZDo6c3RyaW5nIHZhbCkgeworICAgIHZhbFR5cGVfID0gQ1ZfSURFTlRJRklFUjsKKyAgICBpZGVudGlmaWVyVmFsXyA9IHZhbDsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIGdldF9pZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gaWRlbnRpZmllclZhbF87IH0KKworICBzdGQ6OnN0cmluZyBnZXRfaWRlbnRpZmllcl9uYW1lKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIHJldCA9IGdldF9pZGVudGlmaWVyKCk7CisgICAgc2l6ZV90IHMgPSByZXQuZmluZCgnLicpOworICAgIGlmIChzID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICB0aHJvdyAiZXJyb3I6IGlkZW50aWZpZXIgIiArIHJldCArICIgaXMgdW5xdWFsaWZpZWQhIjsKKyAgICB9CisgICAgcmV0ID0gcmV0LnN1YnN0cihzICsgMSk7CisgICAgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2lkZW50aWZpZXJfd2l0aF9wYXJlbnQoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgcmV0ID0gZ2V0X2lkZW50aWZpZXIoKTsKKyAgICBzaXplX3QgcyA9IHJldC5maW5kKCcuJyk7CisgICAgaWYgKHMgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHRocm93ICJlcnJvcjogaWRlbnRpZmllciAiICsgcmV0ICsgIiBpcyB1bnF1YWxpZmllZCEiOworICAgIH0KKyAgICBzaXplX3QgczIgPSByZXQuZmluZCgnLicsIHMgKyAxKTsKKyAgICBpZiAoczIgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgIHJldCA9IHJldC5zdWJzdHIocyArIDEpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgdm9pZCBzZXRfZW51bSh0X2VudW0qIHRlbnVtKSB7IGVudW1fID0gdGVudW07IH0KKworICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7IGlmICh2YWxUeXBlXyA9PSBDVl9VTktOT1dOKSB7IHRocm93IHN0ZDo6c3RyaW5nKCJ1bmtub3duIHRfY29uc3RfdmFsdWUiKTsgfSByZXR1cm4gdmFsVHlwZV87IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IG1hcCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleSBhbmQgdGhlbiB2YWx1ZS4KKyAgICogVGhpcyBpcyB1c2VkIGZvciBtYXAgY29tcGFyaXNvbiBpbiBsZXhpY29ncmFwaGljIG9yZGVyLgorICAgKi8KKyAgc3RydWN0IG1hcF9lbnRyeV9jb21wYXJlIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IENvbnN0UGFpcjsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKShDb25zdFBhaXIgbGVmdCwgQ29uc3RQYWlyIHJpZ2h0KSBjb25zdCB7CisgICAgICBpZiAoKihsZWZ0LmZpcnN0KSA8ICoocmlnaHQuZmlyc3QpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCoocmlnaHQuZmlyc3QpIDwgKihsZWZ0LmZpcnN0KSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gKihsZWZ0LnNlY29uZCkgPCAqKHJpZ2h0LnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgYm9vbCBvcGVyYXRvciA8IChjb25zdCB0X2NvbnN0X3ZhbHVlJiB0aGF0KSBjb25zdCB7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDEgPSBnZXRfdHlwZSgpOworICAgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQyID0gdGhhdC5nZXRfdHlwZSgpOworICAgIGlmICh0MSAhPSB0MikKKyAgICAgIHJldHVybiB0MSA8IHQyOworICAgIHN3aXRjaCAodDEpIHsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICAgIHJldHVybiBpbnRWYWxfIDwgdGhhdC5pbnRWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgICByZXR1cm4gZG91YmxlVmFsXyA8IHRoYXQuZG91YmxlVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgICAgcmV0dXJuIHN0cmluZ1ZhbF8gPCB0aGF0LnN0cmluZ1ZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICByZXR1cm4gaWRlbnRpZmllclZhbF8gPCB0aGF0LmlkZW50aWZpZXJWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBtYXBWYWxfLmJlZ2luKCksIG1hcFZhbF8uZW5kKCksIHRoYXQubWFwVmFsXy5iZWdpbigpLCB0aGF0Lm1hcFZhbF8uZW5kKCksIG1hcF9lbnRyeV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgbGlzdFZhbF8uYmVnaW4oKSwgbGlzdFZhbF8uZW5kKCksIHRoYXQubGlzdFZhbF8uYmVnaW4oKSwgdGhhdC5saXN0VmFsXy5lbmQoKSwgdmFsdWVfY29tcGFyZSgpKTsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVua25vd24gdmFsdWUgdHlwZSI7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdmFsdWVfY29tcGFyZT4gbWFwVmFsXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+IGxpc3RWYWxfOworICBzdGQ6OnN0cmluZyBzdHJpbmdWYWxfOworICBpbnQ2NF90IGludFZhbF87CisgIGRvdWJsZSBkb3VibGVWYWxfOworICBzdGQ6OnN0cmluZyBpZGVudGlmaWVyVmFsXzsKKyAgdF9lbnVtKiBlbnVtXzsKKworICB0X2NvbnN0X3ZhbHVlX3R5cGUgdmFsVHlwZV87CisKKyAgLy8gdG8gcmVhZCBlbnVtXworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgVG8+CisgIGZyaWVuZCB2b2lkIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoRnJvbSosIFRvJik7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29udGFpbmVyLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZGFiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0NPTlRBSU5FUl9ICisjZGVmaW5lIFRfQ09OVEFJTkVSX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKworY2xhc3MgdF9jb250YWluZXIgOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9jb250YWluZXIoKSA6IGNwcF9uYW1lXygpLCBoYXNfY3BwX25hbWVfKGZhbHNlKSB7fQorCisgIHZpcnR1YWwgfnRfY29udGFpbmVyKCkge30KKworICB2b2lkIHNldF9jcHBfbmFtZShzdGQ6OnN0cmluZyBjcHBfbmFtZSkgeworICAgIGNwcF9uYW1lXyA9IGNwcF9uYW1lOworICAgIGhhc19jcHBfbmFtZV8gPSB0cnVlOworICB9CisKKyAgYm9vbCBoYXNfY3BwX25hbWUoKSBjb25zdCB7IHJldHVybiBoYXNfY3BwX25hbWVfOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0X2NwcF9uYW1lKCkgY29uc3QgeyByZXR1cm4gY3BwX25hbWVfOyB9CisKKyAgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGNwcF9uYW1lXzsKKyAgYm9vbCBoYXNfY3BwX25hbWVfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2RvYy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmNiOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9kb2MuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9ET0NfSAorI2RlZmluZSBUX0RPQ19ICisKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCisKKy8qKgorICogRG9jdW1lbnRhdGlvbiBzdHVicworICoKKyAqLworY2xhc3MgdF9kb2MgeworCitwdWJsaWM6CisgIHRfZG9jKCkgOiBoYXNfZG9jXyhmYWxzZSkge30KKyAgdmlydHVhbCB+dF9kb2MoKSB7fQorCisgIHZvaWQgc2V0X2RvYyhjb25zdCBzdGQ6OnN0cmluZyYgZG9jKSB7CisgICAgZG9jXyA9IGRvYzsKKyAgICBoYXNfZG9jXyA9IHRydWU7CisgICAgaWYgKChnX3Byb2dyYW1fZG9jdGV4dF9saW5lbm8gPT0gZ19kb2N0ZXh0X2xpbmVubykKKyAgICAgICAgJiYgKGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9PSBTVElMTF9DQU5ESURBVEUpKSB7CisgICAgICBnX3Byb2dyYW1fZG9jdGV4dF9zdGF0dXMgPSBBTFJFQURZX1BST0NFU1NFRDsKKyAgICAgIHBkZWJ1ZygiJXMiLCAicHJvZ3JhbSBkb2N0ZXh0IHNldCB0byBBTFJFQURZX1BST0NFU1NFRCIpOworICAgIH0KKyAgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfZG9jKCkgY29uc3QgeyByZXR1cm4gZG9jXzsgfQorCisgIGJvb2wgaGFzX2RvYygpIHsgcmV0dXJuIGhhc19kb2NfOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGRvY187CisgIGJvb2wgaGFzX2RvY187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMzc4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9FTlVNX0gKKyNkZWZpbmUgVF9FTlVNX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2VudW1fdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisKKy8qKgorICogQW4gZW51bWVyYXRlZCB0eXBlLiBBIGxpc3Qgb2YgY29uc3RhbnQgb2JqZWN0cyB3aXRoIGEgbmFtZSBmb3IgdGhlIHR5cGUuCisgKgorICovCitjbGFzcyB0X2VudW0gOiBwdWJsaWMgdF90eXBlIHsKK3B1YmxpYzoKKyAgdF9lbnVtKHRfcHJvZ3JhbSogcHJvZ3JhbSkgOiB0X3R5cGUocHJvZ3JhbSkge30KKworICB2b2lkIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IG5hbWVfID0gbmFtZTsgfQorCisgIHZvaWQgYXBwZW5kKHRfZW51bV92YWx1ZSogY29uc3RhbnQpIHsgY29uc3RhbnRzXy5wdXNoX2JhY2soY29uc3RhbnQpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGdldF9jb25zdGFudHMoKSBjb25zdCB7IHJldHVybiBjb25zdGFudHNfOyB9CisKKyAgdF9lbnVtX3ZhbHVlKiBnZXRfY29uc3RhbnRfYnlfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+JiBlbnVtX3ZhbHVlcyA9IGdldF9jb25zdGFudHMoKTsKKyAgICBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgaWYgKCgqY19pdGVyKS0+Z2V0X25hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgIHJldHVybiAqY19pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKGludDY0X3QgdmFsdWUpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICBmb3IgKGNfaXRlciA9IGVudW1fdmFsdWVzLmJlZ2luKCk7IGNfaXRlciAhPSBlbnVtX3ZhbHVlcy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgIGlmICgoKmNfaXRlciktPmdldF92YWx1ZSgpID09IHZhbHVlKSB7CisgICAgICAgIHJldHVybiAqY19pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRfZW51bV92YWx1ZSogZ2V0X21pbl92YWx1ZSgpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW1fdmFsdWUqPiYgZW51bV92YWx1ZXMgPSBnZXRfY29uc3RhbnRzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICB0X2VudW1fdmFsdWUqIG1pbl92YWx1ZTsKKyAgICBpZiAoZW51bV92YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgIG1pbl92YWx1ZSA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBtaW5fdmFsdWVfdmFsdWU7CisgICAgICBtaW5fdmFsdWUgPSBlbnVtX3ZhbHVlcy5mcm9udCgpOworICAgICAgbWluX3ZhbHVlX3ZhbHVlID0gbWluX3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA8IG1pbl92YWx1ZV92YWx1ZSkgeworICAgICAgICAgIG1pbl92YWx1ZSA9ICgqY19pdGVyKTsKKyAgICAgICAgICBtaW5fdmFsdWVfdmFsdWUgPSBtaW5fdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtaW5fdmFsdWU7CisgIH0KKworICB0X2VudW1fdmFsdWUqIGdldF9tYXhfdmFsdWUoKSB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gZ2V0X2NvbnN0YW50cygpOworICAgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7CisgICAgdF9lbnVtX3ZhbHVlKiBtYXhfdmFsdWU7CisgICAgaWYgKGVudW1fdmFsdWVzLnNpemUoKSA9PSAwKSB7CisgICAgICBtYXhfdmFsdWUgPSBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgbWF4X3ZhbHVlX3ZhbHVlOworICAgICAgbWF4X3ZhbHVlID0gZW51bV92YWx1ZXMuYmFjaygpOworICAgICAgbWF4X3ZhbHVlX3ZhbHVlID0gbWF4X3ZhbHVlLT5nZXRfdmFsdWUoKTsKKyAgICAgIGZvciAoY19pdGVyID0gZW51bV92YWx1ZXMuYmVnaW4oKTsgY19pdGVyICE9IGVudW1fdmFsdWVzLmVuZCgpOyArK2NfaXRlcikgeworICAgICAgICBpZiAoKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKSA+IG1heF92YWx1ZV92YWx1ZSkgeworICAgICAgICAgIG1heF92YWx1ZSA9ICgqY19pdGVyKTsKKyAgICAgICAgICBtYXhfdmFsdWVfdmFsdWUgPSBtYXhfdmFsdWUtPmdldF92YWx1ZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtYXhfdmFsdWU7CisgIH0KKworICBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50c187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9lbnVtX3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiZjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZW51bV92YWx1ZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX0VOVU1fVkFMVUVfSAorI2RlZmluZSBUX0VOVU1fVkFMVUVfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBBIGNvbnN0YW50LiBUaGVzZSBhcmUgdXNlZCBpbnNpZGUgb2YgZW51bSBkZWZpbml0aW9ucy4gQ29uc3RhbnRzIGFyZSBqdXN0CisgKiBzeW1ib2wgaWRlbnRpZmllcnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGV4cGxpY2l0IHZhbHVlIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlbS4KKyAqCisgKi8KK2NsYXNzIHRfZW51bV92YWx1ZSA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZW51bV92YWx1ZShzdGQ6OnN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIDogbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworICB+dF9lbnVtX3ZhbHVlKCkge30KKworICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIGludCBnZXRfdmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGFubm90YXRpb25zXzsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgbmFtZV87CisgIGludCB2YWx1ZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWYxZjgwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9maWVsZC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GSUVMRF9ICisjZGVmaW5lIFRfRklFTERfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvLyBGb3J3YXJkIGRlY2xhcmUgZm9yIHhzZF9hdHRycworY2xhc3MgdF9zdHJ1Y3Q7CisKKy8qKgorICogQ2xhc3MgdG8gcmVwcmVzZW50IGEgZmllbGQgaW4gYSB0aHJpZnQgc3RydWN0dXJlLiBBIGZpZWxkIGhhcyBhIGRhdGEgdHlwZSwKKyAqIGEgc3ltYm9saWMgbmFtZSwgYW5kIGEgbnVtZXJpYyBpZGVudGlmaWVyLgorICoKKyAqLworY2xhc3MgdF9maWVsZCA6IHB1YmxpYyB0X2RvYyB7CitwdWJsaWM6CisgIHRfZmllbGQodF90eXBlKiB0eXBlLCBzdGQ6OnN0cmluZyBuYW1lKQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oMCksCisgICAgICB2YWx1ZV8oTlVMTCksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgdF9maWVsZCh0X3R5cGUqIHR5cGUsIHN0ZDo6c3RyaW5nIG5hbWUsIGludDMyX3Qga2V5KQorICAgIDogdHlwZV8odHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGtleV8oa2V5KSwKKyAgICAgIHJlcV8oVF9PUFRfSU5fUkVRX09VVCksCisgICAgICB2YWx1ZV8oTlVMTCksCisgICAgICB4c2Rfb3B0aW9uYWxfKGZhbHNlKSwKKyAgICAgIHhzZF9uaWxsYWJsZV8oZmFsc2UpLAorICAgICAgeHNkX2F0dHJzXyhOVUxMKSwKKyAgICAgIHJlZmVyZW5jZV8oZmFsc2UpIHt9CisKKyAgfnRfZmllbGQoKSB7fQorCisgIHRfdHlwZSogZ2V0X3R5cGUoKSB7IHJldHVybiB0eXBlXzsgfQorCisgIGNvbnN0IHRfdHlwZSogZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgaW50MzJfdCBnZXRfa2V5KCkgY29uc3QgeyByZXR1cm4ga2V5XzsgfQorCisgIGVudW0gZV9yZXEgeyBUX1JFUVVJUkVELCBUX09QVElPTkFMLCBUX09QVF9JTl9SRVFfT1VUIH07CisKKyAgdm9pZCBzZXRfcmVxKGVfcmVxIHJlcSkgeyByZXFfID0gcmVxOyB9CisKKyAgZV9yZXEgZ2V0X3JlcSgpIGNvbnN0IHsgcmV0dXJuIHJlcV87IH0KKworICB2b2lkIHNldF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgeyB2YWx1ZV8gPSB2YWx1ZTsgfQorCisgIHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIGNvbnN0IHRfY29uc3RfdmFsdWUqIGdldF92YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQorCisgIHZvaWQgc2V0X3hzZF9vcHRpb25hbChib29sIHhzZF9vcHRpb25hbCkgeyB4c2Rfb3B0aW9uYWxfID0geHNkX29wdGlvbmFsOyB9CisKKyAgYm9vbCBnZXRfeHNkX29wdGlvbmFsKCkgY29uc3QgeyByZXR1cm4geHNkX29wdGlvbmFsXzsgfQorCisgIHZvaWQgc2V0X3hzZF9uaWxsYWJsZShib29sIHhzZF9uaWxsYWJsZSkgeyB4c2RfbmlsbGFibGVfID0geHNkX25pbGxhYmxlOyB9CisKKyAgYm9vbCBnZXRfeHNkX25pbGxhYmxlKCkgY29uc3QgeyByZXR1cm4geHNkX25pbGxhYmxlXzsgfQorCisgIHZvaWQgc2V0X3hzZF9hdHRycyh0X3N0cnVjdCogeHNkX2F0dHJzKSB7IHhzZF9hdHRyc18gPSB4c2RfYXR0cnM7IH0KKworICB0X3N0cnVjdCogZ2V0X3hzZF9hdHRycygpIHsgcmV0dXJuIHhzZF9hdHRyc187IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IGZpZWxkcyBpbiBhc2NlbmRpbmcgb3JkZXIgYnkga2V5LgorICAgKiBNYWtlIHRoaXMgYSBmdW5jdG9yIGluc3RlYWQgb2YgYSBmdW5jdGlvbiB0byBoZWxwIEdDQyBpbmxpbmUgaXQuCisgICAqIFRoZSBhcmd1bWVudHMgYXJlIChjb25zdCkgcmVmZXJlbmNlcyB0byBjb25zdCBwb2ludGVycyB0byBjb25zdCB0X2ZpZWxkcy4KKyAgICovCisgIHN0cnVjdCBrZXlfY29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvcigpKHRfZmllbGQgY29uc3QqIGNvbnN0JiBhLCB0X2ZpZWxkIGNvbnN0KiBjb25zdCYgYikgeworICAgICAgcmV0dXJuIGEtPmdldF9rZXkoKSA8IGItPmdldF9rZXkoKTsKKyAgICB9CisgIH07CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKKyAgYm9vbCBnZXRfcmVmZXJlbmNlKCkgeyByZXR1cm4gcmVmZXJlbmNlXzsgfQorCisgIHZvaWQgc2V0X3JlZmVyZW5jZShib29sIHJlZmVyZW5jZSkgeyByZWZlcmVuY2VfID0gcmVmZXJlbmNlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogdHlwZV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBpbnQzMl90IGtleV87CisgIGVfcmVxIHJlcV87CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlXzsKKworICBib29sIHhzZF9vcHRpb25hbF87CisgIGJvb2wgeHNkX25pbGxhYmxlXzsKKyAgdF9zdHJ1Y3QqIHhzZF9hdHRyc187CisgIGJvb2wgcmVmZXJlbmNlXzsKK307CisKKy8qKgorICogQSBzaW1wbGUgc3RydWN0IGZvciB0aGUgcGFyc2VyIHRvIHVzZSB0byBzdG9yZSBhIGZpZWxkIElELCBhbmQgd2hldGhlciBvcgorICogbm90IGl0IHdhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgb3IgYXV0b21hdGljYWxseSBjaG9zZW4uCisgKi8KK3N0cnVjdCB0X2ZpZWxkX2lkIHsKKyAgaW50MzJfdCB2YWx1ZTsKKyAgYm9vbCBhdXRvX2Fzc2lnbmVkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkMjYwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaApAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9GVU5DVElPTl9ICisjZGVmaW5lIFRfRlVOQ1RJT05fSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIGZ1bmN0aW9uLiBLZXkgcGFydHMgYXJlIHJldHVybiB0eXBlLCBmdW5jdGlvbiBuYW1lLAorICogb3B0aW9uYWwgbW9kaWZpZXJzLCBhbmQgYW4gYXJndW1lbnQgbGlzdCwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgYXMgYSB0aHJpZnQKKyAqIHN0cnVjdC4KKyAqCisgKi8KK2NsYXNzIHRfZnVuY3Rpb24gOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X2Z1bmN0aW9uKHRfdHlwZSogcmV0dXJudHlwZSwgc3RkOjpzdHJpbmcgbmFtZSwgdF9zdHJ1Y3QqIGFyZ2xpc3QsIGJvb2wgb25ld2F5ID0gZmFsc2UpCisgICAgOiByZXR1cm50eXBlXyhyZXR1cm50eXBlKSwKKyAgICAgIG5hbWVfKG5hbWUpLAorICAgICAgYXJnbGlzdF8oYXJnbGlzdCksCisgICAgICB4Y2VwdGlvbnNfKG5ldyB0X3N0cnVjdChOVUxMKSksCisgICAgICBvd25feGNlcHRpb25zXyh0cnVlKSwKKyAgICAgIG9uZXdheV8ob25ld2F5KSB7CisgICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgeworICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOworICAgIH0KKyAgfQorCisgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLAorICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgdF9zdHJ1Y3QqIGFyZ2xpc3QsCisgICAgICAgICAgICAgdF9zdHJ1Y3QqIHhjZXB0aW9ucywKKyAgICAgICAgICAgICBib29sIG9uZXdheSA9IGZhbHNlKQorICAgIDogcmV0dXJudHlwZV8ocmV0dXJudHlwZSksCisgICAgICBuYW1lXyhuYW1lKSwKKyAgICAgIGFyZ2xpc3RfKGFyZ2xpc3QpLAorICAgICAgeGNlcHRpb25zXyh4Y2VwdGlvbnMpLAorICAgICAgb3duX3hjZXB0aW9uc18oZmFsc2UpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKKyAgICBpZiAob25ld2F5XyAmJiAheGNlcHRpb25zXy0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICB0aHJvdyBzdGQ6OnN0cmluZygiT25ld2F5IG1ldGhvZHMgY2FuJ3QgdGhyb3cgZXhjZXB0aW9ucy4iKTsKKyAgICB9CisgICAgaWYgKG9uZXdheV8gJiYgKCFyZXR1cm50eXBlXy0+aXNfdm9pZCgpKSkgeworICAgICAgcHdhcm5pbmcoMSwgIk9uZXdheSBtZXRob2RzIHNob3VsZCByZXR1cm4gdm9pZC5cbiIpOworICAgIH0KKyAgfQorCisgIH50X2Z1bmN0aW9uKCkgeworICAgIGlmIChvd25feGNlcHRpb25zXykKKyAgICAgIGRlbGV0ZSB4Y2VwdGlvbnNfOworICB9CisKKyAgdF90eXBlKiBnZXRfcmV0dXJudHlwZSgpIGNvbnN0IHsgcmV0dXJuIHJldHVybnR5cGVfOyB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldF9uYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KKworICB0X3N0cnVjdCogZ2V0X2FyZ2xpc3QoKSBjb25zdCB7IHJldHVybiBhcmdsaXN0XzsgfQorCisgIHRfc3RydWN0KiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQorCisgIGJvb2wgaXNfb25ld2F5KCkgY29uc3QgeyByZXR1cm4gb25ld2F5XzsgfQorCisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnNfOworCitwcml2YXRlOgorICB0X3R5cGUqIHJldHVybnR5cGVfOworICBzdGQ6OnN0cmluZyBuYW1lXzsKKyAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOworICB0X3N0cnVjdCogeGNlcHRpb25zXzsKKyAgYm9vbCBvd25feGNlcHRpb25zXzsKKyAgYm9vbCBvbmV3YXlfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjY4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2xpc3QuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVF9MSVNUX0gKKyNkZWZpbmUgVF9MSVNUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgbGlzdCBpcyBhIGxpZ2h0d2VpZ2h0IGNvbnRhaW5lciB0eXBlIHRoYXQganVzdCB3cmFwcyBhbm90aGVyIGRhdGEgdHlwZS4KKyAqCisgKi8KK2NsYXNzIHRfbGlzdCA6IHB1YmxpYyB0X2NvbnRhaW5lciB7CitwdWJsaWM6CisgIHRfbGlzdCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KKworICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9CisKKyAgYm9vbCBpc19saXN0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIGVsZW1fdHlwZV87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfbWFwLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkM2YwODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X21hcC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX01BUF9ICisjZGVmaW5lIFRfTUFQX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgbWFwIGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgdHdvIGRhdGEKKyAqIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF9tYXAgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X21hcCh0X3R5cGUqIGtleV90eXBlLCB0X3R5cGUqIHZhbF90eXBlKSA6IGtleV90eXBlXyhrZXlfdHlwZSksIHZhbF90eXBlXyh2YWxfdHlwZSkge30KKworICB0X3R5cGUqIGdldF9rZXlfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGtleV90eXBlXzsgfQorCisgIHRfdHlwZSogZ2V0X3ZhbF90eXBlKCkgY29uc3QgeyByZXR1cm4gdmFsX3R5cGVfOyB9CisKKyAgYm9vbCBpc19tYXAoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSoga2V5X3R5cGVfOworICB0X3R5cGUqIHZhbF90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RkNDVhCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BST0dSQU1fSAorI2RlZmluZSBUX1BST0dSQU1fSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEZvciBwcm9ncmFtX25hbWUoKQorI2luY2x1ZGUgInRocmlmdC9tYWluLmgiCisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9kb2MuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3R5cGVkZWYuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9lbnVtLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfbGlzdC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X21hcC5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3NldC5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvcl9yZWdpc3RyeS5oIgorLy8jaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKKy8qKgorICogVG9wIGxldmVsIGNsYXNzIHJlcHJlc2VudGluZyBhbiBlbnRpcmUgdGhyaWZ0IHByb2dyYW0uIEEgcHJvZ3JhbSBjb25zaXN0cworICogZnVuZGFtZW50YWxseSBvZiB0aGUgZm9sbG93aW5nOgorICoKKyAqICAgVHlwZWRlZnMKKyAqICAgRW51bWVyYXRpb25zCisgKiAgIENvbnN0YW50cworICogICBTdHJ1Y3RzCisgKiAgIEV4Y2VwdGlvbnMKKyAqICAgU2VydmljZXMKKyAqCisgKiBUaGUgcHJvZ3JhbSBtb2R1bGUgYWxzbyBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGJhc2UgdHlwZXMuCisgKgorICovCitjbGFzcyB0X3Byb2dyYW0gOiBwdWJsaWMgdF9kb2MgeworcHVibGljOgorICB0X3Byb2dyYW0oc3RkOjpzdHJpbmcgcGF0aCwgc3RkOjpzdHJpbmcgbmFtZSkKKyAgICA6IHBhdGhfKHBhdGgpLCBuYW1lXyhuYW1lKSwgb3V0X3BhdGhfKCIuLyIpLCBvdXRfcGF0aF9pc19hYnNvbHV0ZV8oZmFsc2UpLCBzY29wZV8obmV3IHRfc2NvcGUpIHt9CisKKyAgdF9wcm9ncmFtKHN0ZDo6c3RyaW5nIHBhdGgpIDogcGF0aF8ocGF0aCksIG91dF9wYXRoXygiLi8iKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGVfKGZhbHNlKSB7CisgICAgbmFtZV8gPSBwcm9ncmFtX25hbWUocGF0aCk7CisgICAgc2NvcGVfID0gbmV3IHRfc2NvcGUoKTsKKyAgfQorCisgIH50X3Byb2dyYW0oKSB7CisgICAgaWYgKHNjb3BlXykgeworICAgICAgZGVsZXRlIHNjb3BlXzsKKyAgICAgIHNjb3BlXyA9IE5VTEw7CisgICAgfQorICB9CisKKyAgLy8gUGF0aCBhY2Nlc3NvcgorICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X3BhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorCisgIC8vIE91dHB1dCBwYXRoIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfb3V0X3BhdGgoKSBjb25zdCB7IHJldHVybiBvdXRfcGF0aF87IH0KKworICAvLyBDcmVhdGUgZ2VuLSogZGlyIGFjY2Vzc29yCisgIGJvb2wgaXNfb3V0X3BhdGhfYWJzb2x1dGUoKSBjb25zdCB7IHJldHVybiBvdXRfcGF0aF9pc19hYnNvbHV0ZV87IH0KKworICAvLyBOYW1lIGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9CisKKyAgLy8gTmFtZXNwYWNlCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfbmFtZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbmFtZXNwYWNlXzsgfQorCisgIC8vIEluY2x1ZGUgcHJlZml4IGFjY2Vzc29yCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfaW5jbHVkZV9wcmVmaXgoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlX3ByZWZpeF87IH0KKworICAvLyBBY2Nlc3NvcnMgZm9yIHByb2dyYW0gZWxlbWVudHMKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF90eXBlZGVmKj4mIGdldF90eXBlZGVmcygpIGNvbnN0IHsgcmV0dXJuIHR5cGVkZWZzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2VudW0qPiYgZ2V0X2VudW1zKCkgY29uc3QgeyByZXR1cm4gZW51bXNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3QqPiYgZ2V0X2NvbnN0cygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0c187IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9zdHJ1Y3QqPiYgZ2V0X3N0cnVjdHMoKSBjb25zdCB7IHJldHVybiBzdHJ1Y3RzXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfeGNlcHRpb25zKCkgY29uc3QgeyByZXR1cm4geGNlcHRpb25zXzsgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjx0X3N0cnVjdCo+JiBnZXRfb2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIG9iamVjdHNfOyB9CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfc2VydmljZSo+JiBnZXRfc2VydmljZXMoKSBjb25zdCB7IHJldHVybiBzZXJ2aWNlc187IH0KKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X25hbWVzcGFjZXMoKSBjb25zdCB7IHJldHVybiBuYW1lc3BhY2VzXzsgfQorCisgIC8vIFByb2dyYW0gZWxlbWVudHMKKyAgdm9pZCBhZGRfdHlwZWRlZih0X3R5cGVkZWYqIHRkKSB7IHR5cGVkZWZzXy5wdXNoX2JhY2sodGQpOyB9CisgIHZvaWQgYWRkX2VudW0odF9lbnVtKiB0ZSkgeyBlbnVtc18ucHVzaF9iYWNrKHRlKTsgfQorICB2b2lkIGFkZF9jb25zdCh0X2NvbnN0KiB0YykgeyBjb25zdHNfLnB1c2hfYmFjayh0Yyk7IH0KKyAgdm9pZCBhZGRfc3RydWN0KHRfc3RydWN0KiB0cykgeworICAgIG9iamVjdHNfLnB1c2hfYmFjayh0cyk7CisgICAgc3RydWN0c18ucHVzaF9iYWNrKHRzKTsKKyAgfQorICB2b2lkIGFkZF94Y2VwdGlvbih0X3N0cnVjdCogdHgpIHsKKyAgICBvYmplY3RzXy5wdXNoX2JhY2sodHgpOworICAgIHhjZXB0aW9uc18ucHVzaF9iYWNrKHR4KTsKKyAgfQorICB2b2lkIGFkZF9zZXJ2aWNlKHRfc2VydmljZSogdHMpIHsgc2VydmljZXNfLnB1c2hfYmFjayh0cyk7IH0KKworICAvLyBQcm9ncmFtcyB0byBpbmNsdWRlCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSBjb25zdCB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9vdXRfcGF0aChzdGQ6OnN0cmluZyBvdXRfcGF0aCwgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZSkgeworICAgIG91dF9wYXRoXyA9IG91dF9wYXRoOworICAgIG91dF9wYXRoX2lzX2Fic29sdXRlXyA9IG91dF9wYXRoX2lzX2Fic29sdXRlOworICAgIC8vIEVuc3VyZSB0aGF0IGl0IGVuZHMgd2l0aCBhIHRyYWlsaW5nICcvJyAob3IgJ1wnIGZvciB3aW5kb3dzIG1hY2hpbmVzKQorICAgIGNoYXIgYyA9IG91dF9wYXRoXy5hdChvdXRfcGF0aF8uc2l6ZSgpIC0gMSk7CisgICAgaWYgKCEoYyA9PSAnLycgfHwgYyA9PSAnXFwnKSkgeworICAgICAgb3V0X3BhdGhfLnB1c2hfYmFjaygnLycpOworICAgIH0KKyAgfQorCisgIC8vIFR5cGVuYW1lIGNvbGxpc2lvbiBkZXRlY3Rpb24KKyAgLyoqCisgICAqIFNlYXJjaCBmb3IgdHlwZW5hbWUgY29sbGlzaW9ucworICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRydWUgaWYgYSBjZXJ0YWluIGNvbGxpc2lvbiB3YXMgZm91bmQsIG90aGVyd2lzZSBmYWxzZQorICAgKi8KKyAgYm9vbCBpc191bmlxdWVfdHlwZW5hbWUodF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0aGlzLCB0KTsKKyAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+OjppdGVyYXRvciBpdCA9IGluY2x1ZGVzXy5iZWdpbigpOyBpdCAhPSBpbmNsdWRlc18uZW5kKCk7ICsraXQpIHsKKyAgICAgIG9jY3VycmVuY2VzICs9IHByb2dyYW1fdHlwZW5hbWVfY291bnQoKml0LCB0KTsKKyAgICB9CisgICAgcmV0dXJuIDAgPT0gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogU2VhcmNoIGFsbCB0eXBlIGNvbGxlY3Rpb25zIGZvciBkdXBsaWNhdGUgdHlwZW5hbWVzCisgICAqIEBwYXJhbSBwcm9nIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdCAgICB0aGUgdHlwZSB0byB0ZXN0IGZvciBjb2xsaXNpb25zCisgICAqIEByZXR1cm4gICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICBpbnQgcHJvZ3JhbV90eXBlbmFtZV9jb3VudCh0X3Byb2dyYW0qIHByb2csIHRfdHlwZSogdCkgeworICAgIGludCBvY2N1cnJlbmNlcyA9IDA7CisgICAgb2NjdXJyZW5jZXMgKz0gY29sbGVjdGlvbl90eXBlbmFtZV9jb3VudChwcm9nLCBwcm9nLT50eXBlZGVmc18sIHQpOworICAgIG9jY3VycmVuY2VzICs9IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQocHJvZywgcHJvZy0+ZW51bXNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPm9iamVjdHNfLCB0KTsKKyAgICBvY2N1cnJlbmNlcyArPSBjb2xsZWN0aW9uX3R5cGVuYW1lX2NvdW50KHByb2csIHByb2ctPnNlcnZpY2VzXywgdCk7CisgICAgcmV0dXJuIG9jY3VycmVuY2VzOworICB9CisKKyAgLyoqCisgICAqIFNlYXJjaCBhIHR5cGUgY29sbGVjdGlvbiBmb3IgZHVwbGljYXRlIHR5cGVuYW1lcworICAgKiBAcGFyYW0gcHJvZyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHRvIHNlYXJjaAorICAgKiBAcGFyYW0gdHlwZV9jb2xsZWN0aW9uIHRoZSB0eXBlIGNvbGxlY3Rpb24gdG8gc2VhcmNoCisgICAqIEBwYXJhbSB0ICAgICAgICAgICAgICAgdGhlIHR5cGUgdG8gdGVzdCBmb3IgY29sbGlzaW9ucworICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2VydGFpbiB0eXBlbmFtZSBjb2xsaXNpb25zCisgICAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgaW50IGNvbGxlY3Rpb25fdHlwZW5hbWVfY291bnQodF9wcm9ncmFtKiBwcm9nLCBUIHR5cGVfY29sbGVjdGlvbiwgdF90eXBlKiB0KSB7CisgICAgaW50IG9jY3VycmVuY2VzID0gMDsKKyAgICBmb3IgKHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIGl0ID0gdHlwZV9jb2xsZWN0aW9uLmJlZ2luKCk7IGl0ICE9IHR5cGVfY29sbGVjdGlvbi5lbmQoKTsgKytpdCkKKyAgICAgIGlmICh0ICE9ICppdCAmJiAwID09IHQtPmdldF9uYW1lKCkuY29tcGFyZSgoKml0KS0+Z2V0X25hbWUoKSkgJiYgaXNfY29tbW9uX25hbWVzcGFjZShwcm9nLCB0KSkKKyAgICAgICAgKytvY2N1cnJlbmNlczsKKyAgICByZXR1cm4gb2NjdXJyZW5jZXM7CisgIH0KKworICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgaWRlbnRpY2FsIHR5cGVuYW1lcyB3aWxsIGNvbGxpZGUgYmFzZWQgb24gbmFtZXNwYWNlcy4KKyAgICoKKyAgICogQmVjYXVzZSB3ZSBkbyBub3Qga25vdyB3aGljaCBsYW5ndWFnZXMgdGhlIHVzZXIgd2lsbCBnZW5lcmF0ZSBjb2RlIGZvciwKKyAgICogY29sbGlzaW9ucyB3aXRoaW4gcHJvZ3JhbXMgKElETCBmaWxlcykgaGF2aW5nIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgY2FuIGJlCisgICAqIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUuIE9ubHkgZ3VhcmFudGVlZCBjb2xsaXNpb25zIHJldHVybiB0cnVlIChjYXVzZSBhbiBlcnJvcikuCisgICAqIFBvc3NpYmxlIGNvbGxpc2lvbnMgaW52b2x2aW5nIGV4cGxpY2l0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgcHJvZHVjZSBhIHdhcm5pbmcuCisgICAqIE90aGVyIHBvc3NpYmxlIGNvbGxpc2lvbnMgZ28gdW5yZXBvcnRlZC4KKyAgICogQHBhcmFtIHByb2cgdGhlIHByb2dyYW0gY29udGFpbmluZyB0aGUgcHJlZXhpc3RpbmcgdHlwZW5hbWUKKyAgICogQHBhcmFtIHQgICAgdGhlIHR5cGUgY29udGFpbmluZyB0aGUgdHlwZW5hbWUgbWF0Y2gKKyAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBhIGNvbGxpc2lvbiB3aXRoaW4gbmFtZXNwYWNlcyBpcyBmb3VuZCwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBib29sIGlzX2NvbW1vbl9uYW1lc3BhY2UodF9wcm9ncmFtKiBwcm9nLCB0X3R5cGUqIHQpIHsKKyAgICAvLyBDYXNlIDE6IFR5cGVuYW1lcyBhcmUgaW4gdGhlIHNhbWUgcHJvZ3JhbSBbY29sbGlzaW9uXQorICAgIGlmIChwcm9nID09IHQtPmdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAiRHVwbGljYXRlIHR5cGVuYW1lICVzIGZvdW5kIGluICVzIiwKKyAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgIHQtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBDYXNlIDI6IEJvdGggcHJvZ3JhbXMgaGF2ZSBpZGVudGljYWwgbmFtZXNwYWNlIHNjb3BlL25hbWUgZGVjbGFyYXRpb25zIFtjb2xsaXNpb25dCisgICAgYm9vbCBtYXRjaCA9IHRydWU7CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHByb2ctPm5hbWVzcGFjZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBwcm9nLT5uYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZSh0LT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHQtPmdldF9wcm9ncmFtKCktPm5hbWVzcGFjZXNfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB0LT5nZXRfcHJvZ3JhbSgpLT5uYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGlmICgwID09IGl0LT5zZWNvbmQuY29tcGFyZShwcm9nLT5nZXRfbmFtZXNwYWNlKGl0LT5maXJzdCkpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsCisgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgdHlwZW5hbWUgJXMgZm91bmQgaW4gJXMsJXMsJXMgYW5kICVzLCVzLCVzIFtmaWxlLHNjb3BlLG5zXSIsCisgICAgICAgICAgICAgICAgIHQtPmdldF9uYW1lKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBwcm9nLT5nZXRfbmFtZSgpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGl0LT5maXJzdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWF0Y2ggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKDAgPT0gcHJvZy0+bmFtZXNwYWNlc18uc2l6ZSgpICYmIDAgPT0gdC0+Z2V0X3Byb2dyYW0oKS0+bmFtZXNwYWNlc18uc2l6ZSgpKSB7CisgICAgICBwd2FybmluZygxLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0eXBlbmFtZSAlcyBmb3VuZCBpbiAlcyBhbmQgJXMiLAorICAgICAgICAgICAgICAgdC0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgdC0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgcHJvZy0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIG1hdGNoOworICB9CisKKyAgLy8gU2NvcGluZyBhbmQgbmFtZXNwYWNpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgbmFtZXNwYWNlXyA9IG5hbWU7IH0KKworICAvLyBTY29wZSBhY2Nlc3NvcgorICB0X3Njb3BlKiBzY29wZSgpIGNvbnN0IHsgcmV0dXJuIHNjb3BlXzsgfQorCisgIC8vIEluY2x1ZGVzCisKKyAgdm9pZCBhZGRfaW5jbHVkZSh0X3Byb2dyYW0qIHByb2dyYW0pIHsKKyAgICBpbmNsdWRlc18ucHVzaF9iYWNrKHByb2dyYW0pOworICB9CisKKyAgdm9pZCBhZGRfaW5jbHVkZShzdGQ6OnN0cmluZyBwYXRoLCBzdGQ6OnN0cmluZyBpbmNsdWRlX3NpdGUpIHsKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgpOworCisgICAgLy8gaW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSBpcyB0aGUgc2l0ZSBhdCB3aGljaCBpdCB3YXMgaW5jbHVkZWQKKyAgICAvLyAobWludXMgdGhlIGZpbGVuYW1lKQorICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4OworICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIGlmICgobGFzdF9zbGFzaCA9IGluY2x1ZGVfc2l0ZS5yZmluZCgiLyIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgaW5jbHVkZV9wcmVmaXggPSBpbmNsdWRlX3NpdGUuc3Vic3RyKDAsIGxhc3Rfc2xhc2gpOworICAgIH0KKworICAgIHByb2dyYW0tPnNldF9pbmNsdWRlX3ByZWZpeChpbmNsdWRlX3ByZWZpeCk7CisgICAgaW5jbHVkZXNfLnB1c2hfYmFjayhwcm9ncmFtKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBnZXRfaW5jbHVkZXMoKSB7IHJldHVybiBpbmNsdWRlc187IH0KKworICB2b2lkIHNldF9pbmNsdWRlX3ByZWZpeChzdGQ6OnN0cmluZyBpbmNsdWRlX3ByZWZpeCkgeworICAgIGluY2x1ZGVfcHJlZml4XyA9IGluY2x1ZGVfcHJlZml4OworCisgICAgLy8gdGhpcyBpcyBpbnRlbmRlZCB0byBiZSBhIGRpcmVjdG9yeTsgYWRkIGEgdHJhaWxpbmcgc2xhc2ggaWYgbmVjZXNzYXJ5CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBsZW4gPSBpbmNsdWRlX3ByZWZpeF8uc2l6ZSgpOworICAgIGlmIChsZW4gPiAwICYmIGluY2x1ZGVfcHJlZml4X1tsZW4gLSAxXSAhPSAnLycpIHsKKyAgICAgIGluY2x1ZGVfcHJlZml4XyArPSAnLyc7CisgICAgfQorICB9CisKKyAgLy8gTGFuZ3VhZ2UgbmV1dHJhbCBuYW1lc3BhY2UgLyBwYWNrYWdpbmcKKyAgdm9pZCBzZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlLCBzdGQ6OnN0cmluZyBuYW1lX3NwYWNlKSB7CisgICAgaWYgKGxhbmd1YWdlICE9ICIqIikgeworICAgICAgc2l6ZV90IHN1Yl9pbmRleCA9IGxhbmd1YWdlLmZpbmQoJy4nKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGJhc2VfbGFuZ3VhZ2UgPSBsYW5ndWFnZS5zdWJzdHIoMCwgc3ViX2luZGV4KTsKKyAgICAgIHN0ZDo6c3RyaW5nIHN1Yl9uYW1lc3BhY2U7CisKKyAgICAgIGlmIChiYXNlX2xhbmd1YWdlID09ICJzbWFsbHRhbGsiKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJOYW1lc3BhY2UgJ3NtYWxsdGFsaycgaXMgZGVwcmVjYXRlZC4gVXNlICdzdCcgaW5zdGVhZCIpOworICAgICAgICBiYXNlX2xhbmd1YWdlID0gInN0IjsKKyAgICAgIH0KKworICAgICAgdF9nZW5lcmF0b3JfcmVnaXN0cnk6Omdlbl9tYXBfdCBteV9jb3B5ID0gdF9nZW5lcmF0b3JfcmVnaXN0cnk6OmdldF9nZW5lcmF0b3JfbWFwKCk7CisKKyAgICAgIHRfZ2VuZXJhdG9yX3JlZ2lzdHJ5OjpnZW5fbWFwX3Q6Oml0ZXJhdG9yIGl0OworICAgICAgaXQgPSBteV9jb3B5LmZpbmQoYmFzZV9sYW5ndWFnZSk7CisKKyAgICAgIGlmIChpdCA9PSBteV9jb3B5LmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHdhcm5pbmcgPSAiTm8gZ2VuZXJhdG9yIG5hbWVkICciICsgYmFzZV9sYW5ndWFnZSArICInIGNvdWxkIGJlIGZvdW5kISI7CisgICAgICAgIHB3YXJuaW5nKDEsIHdhcm5pbmcuY19zdHIoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3ViX2luZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViX25hbWVzcGFjZSA9IGxhbmd1YWdlLnN1YnN0cihzdWJfaW5kZXggKyAxKTsKKyAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzX3ZhbGlkX25hbWVzcGFjZShzdWJfbmFtZXNwYWNlKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgd2FybmluZyA9IGJhc2VfbGFuZ3VhZ2UgKyAiIGdlbmVyYXRvciBkb2VzIG5vdCBhY2NlcHQgJyIgKyBzdWJfbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhcyBzdWItbmFtZXNwYWNlISI7CisgICAgICAgICAgICBwd2FybmluZygxLCB3YXJuaW5nLmNfc3RyKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG5hbWVzcGFjZXNfW2xhbmd1YWdlXSA9IG5hbWVfc3BhY2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRfbmFtZXNwYWNlKHN0ZDo6c3RyaW5nIGxhbmd1YWdlKSBjb25zdCB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKyAgICBpZiAoKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKGxhbmd1YWdlKSkgIT0gbmFtZXNwYWNlc18uZW5kKCkKKyAgICAgICAgfHwgKGl0ZXIgPSBuYW1lc3BhY2VzXy5maW5kKCIqIikpICE9IG5hbWVzcGFjZXNfLmVuZCgpKSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIGdldF9hbGxfbmFtZXNwYWNlcygpeworICAgICByZXR1cm4gbmFtZXNwYWNlc187CisgIH0KKworICB2b2lkIHNldF9uYW1lc3BhY2VfYW5ub3RhdGlvbnMoc3RkOjpzdHJpbmcgbGFuZ3VhZ2UsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gYW5ub3RhdGlvbnMpIHsKKyAgICBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXSA9IGFubm90YXRpb25zOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgZ2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucyhzdGQ6OnN0cmluZyBsYW5ndWFnZSkgeworICAgIHJldHVybiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfW2xhbmd1YWdlXTsKKyAgfQorCisgIC8vIExhbmd1YWdlIHNwZWNpZmljIG5hbWVzcGFjZSAvIHBhY2thZ2luZworCisgIHZvaWQgYWRkX2NwcF9pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY3BwX2luY2x1ZGVzXy5wdXNoX2JhY2socGF0aCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGdldF9jcHBfaW5jbHVkZXMoKSB7IHJldHVybiBjcHBfaW5jbHVkZXNfOyB9CisKKyAgdm9pZCBhZGRfY19pbmNsdWRlKHN0ZDo6c3RyaW5nIHBhdGgpIHsgY19pbmNsdWRlc18ucHVzaF9iYWNrKHBhdGgpOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBnZXRfY19pbmNsdWRlcygpIHsgcmV0dXJuIGNfaW5jbHVkZXNfOyB9CisKK3ByaXZhdGU6CisgIC8vIEZpbGUgcGF0aAorICBzdGQ6OnN0cmluZyBwYXRoXzsKKworICAvLyBOYW1lCisgIHN0ZDo6c3RyaW5nIG5hbWVfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkKKyAgc3RkOjpzdHJpbmcgb3V0X3BhdGhfOworCisgIC8vIE91dHB1dCBkaXJlY3RvcnkgaXMgYWJzb2x1dGUgbG9jYXRpb24gZm9yIGdlbmVyYXRlZCBzb3VyY2UgKG5vIGdlbi0qKQorICBib29sIG91dF9wYXRoX2lzX2Fic29sdXRlXzsKKworICAvLyBOYW1lc3BhY2UKKyAgc3RkOjpzdHJpbmcgbmFtZXNwYWNlXzsKKworICAvLyBJbmNsdWRlZCBwcm9ncmFtcworICBzdGQ6OnZlY3Rvcjx0X3Byb2dyYW0qPiBpbmNsdWRlc187CisKKyAgLy8gSW5jbHVkZSBwcmVmaXggZm9yIHRoaXMgcHJvZ3JhbSwgaWYgYW55CisgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfcHJlZml4XzsKKworICAvLyBJZGVudGlmaWVyIGxvb2t1cCBzY29wZQorICB0X3Njb3BlKiBzY29wZV87CisKKyAgLy8gQ29tcG9uZW50cyB0byBnZW5lcmF0ZSBjb2RlIGZvcgorICBzdGQ6OnZlY3Rvcjx0X3R5cGVkZWYqPiB0eXBlZGVmc187CisgIHN0ZDo6dmVjdG9yPHRfZW51bSo+IGVudW1zXzsKKyAgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gb2JqZWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4gc3RydWN0c187CisgIHN0ZDo6dmVjdG9yPHRfc3RydWN0Kj4geGNlcHRpb25zXzsKKyAgc3RkOjp2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIER5bmFtaWMgbmFtZXNwYWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG5hbWVzcGFjZXNfOworCisgIC8vIEFubm90YXRpb25zIGZvciBkeW5hbWljIG5hbWVzcGFjZXMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gPiBuYW1lc3BhY2VfYW5ub3RhdGlvbnNfOworCisgIC8vIEMrKyBleHRyYSBpbmNsdWRlcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY3BwX2luY2x1ZGVzXzsKKworICAvLyBDIGV4dHJhIGluY2x1ZGVzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjX2luY2x1ZGVzXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTYwYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NDT1BFX0gKKyNkZWZpbmUgVF9TQ09QRV9ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiwgVG8mKTsKK30KKworLyoqCisgKiBUaGlzIHJlcHJlc2VudHMgYSB2YXJpYWJsZSBzY29wZSB1c2VkIGZvciBsb29raW5nIHVwIHByZWRlZmluZWQgdHlwZXMgYW5kCisgKiBzZXJ2aWNlcy4gVHlwaWNhbGx5LCBhIHNjb3BlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRfcHJvZ3JhbS4gU2NvcGVzIGFyZSBub3QKKyAqIHVzZWQgdG8gZGV0ZXJtaW5lIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJhdGhlciB0byByZXNvbHZlIGlkZW50aWZpZXJzIGF0CisgKiBwYXJzZSB0aW1lLgorICoKKyAqLworY2xhc3MgdF9zY29wZSB7CitwdWJsaWM6CisgIHRfc2NvcGUoKSB7fQorCisgIHZvaWQgYWRkX3R5cGUoc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlKSB7IHR5cGVzX1tuYW1lXSA9IHR5cGU7IH0KKworICB0X3R5cGUqIGdldF90eXBlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHR5cGVzX1tuYW1lXTsgfQorCisgIHZvaWQgYWRkX3NlcnZpY2Uoc3RkOjpzdHJpbmcgbmFtZSwgdF9zZXJ2aWNlKiBzZXJ2aWNlKSB7IHNlcnZpY2VzX1tuYW1lXSA9IHNlcnZpY2U7IH0KKworICB0X3NlcnZpY2UqIGdldF9zZXJ2aWNlKHN0ZDo6c3RyaW5nIG5hbWUpIHsgcmV0dXJuIHNlcnZpY2VzX1tuYW1lXTsgfQorCisgIHZvaWQgYWRkX2NvbnN0YW50KHN0ZDo6c3RyaW5nIG5hbWUsIHRfY29uc3QqIGNvbnN0YW50KSB7CisgICAgaWYgKGNvbnN0YW50c18uZmluZChuYW1lKSAhPSBjb25zdGFudHNfLmVuZCgpKSB7CisgICAgICB0aHJvdyAiRW51bSAiICsgbmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkISI7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0YW50c19bbmFtZV0gPSBjb25zdGFudDsKKyAgICB9CisgIH0KKworICB0X2NvbnN0KiBnZXRfY29uc3RhbnQoc3RkOjpzdHJpbmcgbmFtZSkgeyByZXR1cm4gY29uc3RhbnRzX1tuYW1lXTsgfQorCisgIHZvaWQgcHJpbnQoKSB7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfdHlwZSo+OjppdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IHR5cGVzXy5iZWdpbigpOyBpdGVyICE9IHR5cGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBwcmludGYoIiVzID0+ICVzXG4iLCBpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQtPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNvbHZlX2NvbnN0X3ZhbHVlKHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCwgdF90eXBlKiB0dHlwZSkgeworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gY29uc3RfdmFsLT5nZXRfbGlzdCgpOworICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKCgqdl9pdGVyKSwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpKSB7CisgICAgICB0X3N0cnVjdCogdHN0cnVjdCA9ICh0X3N0cnVjdCopdHR5cGU7CisgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKKyAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgICB0aHJvdyAiTm8gZmllbGQgbmFtZWQgXCIiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpCisgICAgICAgICAgICAgICsgIlwiIHdhcyBmb3VuZCBpbiBzdHJ1Y3Qgb2YgdHlwZSBcIiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpICsgIlwiIjsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlX2NvbnN0X3ZhbHVlKHZfaXRlci0+c2Vjb25kLCBmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb25zdF92YWwtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUikgeworICAgICAgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSgodF9lbnVtKil0dHlwZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0X2NvbnN0KiBjb25zdGFudCA9IGdldF9jb25zdGFudChjb25zdF92YWwtPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgICBpZiAoY29uc3RhbnQgPT0gTlVMTCkgeworICAgICAgICAgIHRocm93ICJObyBlbnVtIHZhbHVlIG9yIGNvbnN0YW50IGZvdW5kIG5hbWVkIFwiIiArIGNvbnN0X3ZhbC0+Z2V0X2lkZW50aWZpZXIoKSArICJcIiEiOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzb2x2ZSB0eXBlZGVmcyB0byB0aGUgdW5kZXJseWluZyB0eXBlCisgICAgICAgIHRfdHlwZSogY29uc3RfdHlwZSA9IGNvbnN0YW50LT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7CisKKyAgICAgICAgaWYgKGNvbnN0X3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICAgICAgc3dpdGNoICgoKHRfYmFzZV90eXBlKiljb25zdF90eXBlKS0+Z2V0X2Jhc2UoKSkgeworICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfaW50ZWdlcihjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9pbnRlZ2VyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9zdHJpbmcoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfc3RyaW5nKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICBjb25zdF92YWwtPnNldF9kb3VibGUoY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfZG91YmxlKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKKyAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9tYXAoKTsKKyAgICAgICAgICBmb3IgKHZfaXRlciA9IG1hcC5iZWdpbigpOyB2X2l0ZXIgIT0gbWFwLmVuZCgpOyArK3ZfaXRlcikgeworICAgICAgICAgICAgY29uc3RfdmFsLT5hZGRfbWFwKHZfaXRlci0+Zmlyc3QsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9saXN0KCk7CisgICAgICAgICAgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisKKyAgICAgICAgICBjb25zdF92YWwtPnNldF9saXN0KCk7CisgICAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgICAgIGNvbnN0X3ZhbC0+YWRkX2xpc3QoKnZfaXRlcik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICAvLyBlbnVtIGNvbnN0YW50IHdpdGggbm9uLWlkZW50aWZpZXIgdmFsdWUuIHNldCB0aGUgZW51bSBhbmQgZmluZCB0aGUKKyAgICAgIC8vIHZhbHVlJ3MgbmFtZS4KKyAgICAgIHRfZW51bSogdGVudW0gPSAodF9lbnVtKil0dHlwZTsKKyAgICAgIHRfZW51bV92YWx1ZSogZW51bV92YWx1ZSA9IHRlbnVtLT5nZXRfY29uc3RhbnRfYnlfdmFsdWUoY29uc3RfdmFsLT5nZXRfaW50ZWdlcigpKTsKKyAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHZhbHN0bTsKKyAgICAgICAgdmFsc3RtIDw8IGNvbnN0X3ZhbC0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgdGhyb3cgIkNvdWxkbid0IGZpbmQgYSBuYW1lZCB2YWx1ZSBpbiBlbnVtICIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIgZm9yIHZhbHVlICIKKyAgICAgICAgICAgICsgdmFsc3RtLnN0cigpOworICAgICAgfQorICAgICAgY29uc3RfdmFsLT5zZXRfaWRlbnRpZmllcih0ZW51bS0+Z2V0X25hbWUoKSArICIuIiArIGVudW1fdmFsdWUtPmdldF9uYW1lKCkpOworICAgICAgY29uc3RfdmFsLT5zZXRfZW51bSh0ZW51bSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIC8vIE1hcCBvZiBuYW1lcyB0byB0eXBlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF90eXBlKj4gdHlwZXNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBjb25zdGFudHMKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHRfY29uc3QqPiBjb25zdGFudHNfOworCisgIC8vIE1hcCBvZiBuYW1lcyB0byBzZXJ2aWNlcworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgdF9zZXJ2aWNlKj4gc2VydmljZXNfOworCisgIC8vIHRvIGxpc3QgbWFwIGVudHJpZXMKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgorICAgIGZyaWVuZCB2b2lkIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQoRnJvbSosIFRvJik7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMDRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NFUlZJQ0VfSAorI2RlZmluZSBUX1NFUlZJQ0VfSAorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBBIHNlcnZpY2UgY29uc2lzdHMgb2YgYSBzZXQgb2YgZnVuY3Rpb25zLgorICoKKyAqLworY2xhc3MgdF9zZXJ2aWNlIDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHRfc2VydmljZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogdF90eXBlKHByb2dyYW0pLCBleHRlbmRzXyhOVUxMKSB7fQorCisgIGJvb2wgaXNfc2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICB2b2lkIHNldF9leHRlbmRzKHRfc2VydmljZSogZXh0ZW5kcykgeyBleHRlbmRzXyA9IGV4dGVuZHM7IH0KKworICB2b2lkIGFkZF9mdW5jdGlvbih0X2Z1bmN0aW9uKiBmdW5jKSB7CisgICAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworICAgIGZvciAoaXRlciA9IGZ1bmN0aW9uc18uYmVnaW4oKTsgaXRlciAhPSBmdW5jdGlvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGlmIChmdW5jLT5nZXRfbmFtZSgpID09ICgqaXRlciktPmdldF9uYW1lKCkpIHsKKyAgICAgICAgdGhyb3cgIkZ1bmN0aW9uICIgKyBmdW5jLT5nZXRfbmFtZSgpICsgIiBpcyBhbHJlYWR5IGRlZmluZWQiOworICAgICAgfQorICAgIH0KKyAgICBmdW5jdGlvbnNfLnB1c2hfYmFjayhmdW5jKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiYgZ2V0X2Z1bmN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIGZ1bmN0aW9uc187IH0KKworICB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgeyByZXR1cm4gZXh0ZW5kc187IH0KKworICBjb25zdCB0X3NlcnZpY2UqIGdldF9leHRlbmRzKCkgY29uc3QgeyByZXR1cm4gZXh0ZW5kc187IH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9uc187CisgIHRfc2VydmljZSogZXh0ZW5kc187Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2V0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTNiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3NldC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NFVF9ICisjZGVmaW5lIFRfU0VUX0gKKworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X2NvbnRhaW5lci5oIgorCisvKioKKyAqIEEgc2V0IGlzIGEgbGlnaHR3ZWlnaHQgY29udGFpbmVyIHR5cGUgdGhhdCBqdXN0IHdyYXBzIGFub3RoZXIgZGF0YSB0eXBlLgorICoKKyAqLworY2xhc3MgdF9zZXQgOiBwdWJsaWMgdF9jb250YWluZXIgeworcHVibGljOgorICB0X3NldCh0X3R5cGUqIGVsZW1fdHlwZSkgOiBlbGVtX3R5cGVfKGVsZW1fdHlwZSkge30KKworICB0X3R5cGUqIGdldF9lbGVtX3R5cGUoKSBjb25zdCB7IHJldHVybiBlbGVtX3R5cGVfOyB9CisKKyAgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKK3ByaXZhdGU6CisgIHRfdHlwZSogZWxlbV90eXBlXzsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zdHJ1Y3QuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMmRhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc3RydWN0LmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1NUUlVDVF9ICisjZGVmaW5lIFRfU1RSVUNUX0gKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF90eXBlLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZmllbGQuaCIKKworLy8gRm9yd2FyZCBkZWNsYXJlIHRoYXQgcHVwcHkKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBBIHN0cnVjdCBpcyBhIGNvbnRhaW5lciBmb3IgYSBzZXQgb2YgbWVtYmVyIGZpZWxkcyB0aGF0IGhhcyBhIG5hbWUuIFN0cnVjdHMKKyAqIGFyZSBhbHNvIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiB0eXBlcy4KKyAqCisgKi8KK2NsYXNzIHRfc3RydWN0IDogcHVibGljIHRfdHlwZSB7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnNfdHlwZTsKKworICB0X3N0cnVjdCh0X3Byb2dyYW0qIHByb2dyYW0pCisgICAgOiB0X3R5cGUocHJvZ3JhbSksCisgICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAorICAgICAgaXNfdW5pb25fKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKKyAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQorCisgIHRfc3RydWN0KHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgOiB0X3R5cGUocHJvZ3JhbSwgbmFtZSksCisgICAgICBpc194Y2VwdGlvbl8oZmFsc2UpLAorICAgICAgaXNfdW5pb25fKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfdmFsaWRhdGVkKGZhbHNlKSwKKyAgICAgIG1lbWJlcnNfd2l0aF92YWx1ZSgwKSwKKyAgICAgIHhzZF9hbGxfKGZhbHNlKSB7fQorCisgIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICBuYW1lXyA9IG5hbWU7CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVycygpOworICB9CisKKyAgdm9pZCBzZXRfeGNlcHRpb24oYm9vbCBpc194Y2VwdGlvbikgeyBpc194Y2VwdGlvbl8gPSBpc194Y2VwdGlvbjsgfQorCisgIHZvaWQgdmFsaWRhdGVfdW5pb25fbWVtYmVyKHRfZmllbGQqIGZpZWxkKSB7CisgICAgaWYgKGlzX3VuaW9uXyAmJiAoIW5hbWVfLmVtcHR5KCkpKSB7CisKKyAgICAgIC8vIDEpIHVuaW9ucyBjYW4ndCBoYXZlIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gMikgdW5pb24gbWVtYmVycyBhcmUgaW1wbGljaXRseSBvcHRpb25hbCwgb3RoZXJ3aXNlIGJ1Z3MgbGlrZSBUSFJJRlQtMzY1MCB3YWl0IHRvIGhhcHBlbgorICAgICAgaWYgKGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9PUFRJT05BTCkgeworICAgICAgICAvLyBubyB3YXJuaW5nIG9uIGRlZmF1bHQgcmVxdWlyZWRuZXNzLCBidXQgZG8gd2FybiBvbiBhbnl0aGluZyBlbHNlIHRoYXQgaXMgZXhwbGljaXRseSBhc2tlZCBmb3IKKyAgICAgICAgaWYoZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwKKyAgICAgICAgICAgICAgICAgICAiVW5pb24gJXMgZmllbGQgJXM6IHVuaW9uIG1lbWJlcnMgbXVzdCBiZSBvcHRpb25hbCwgaWdub3Jpbmcgc3BlY2lmaWVkIHJlcXVpcmVkbmVzcy5cbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICBmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZC0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgICAgIH0KKworICAgICAgLy8gdW5pb25zIG1heSBoYXZlIHVwIHRvIG9uZSBtZW1iZXIgZGVmYXVsdGVkLCBidXQgbm90IG1vcmUKKyAgICAgIGlmIChmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICBpZiAoMSA8ICsrbWVtYmVyc193aXRoX3ZhbHVlKSB7CisgICAgICAgICAgdGhyb3cgIkVycm9yOiBGaWVsZCAiICsgZmllbGQtPmdldF9uYW1lKCkgKyAiIHByb3ZpZGVzIGFub3RoZXIgZGVmYXVsdCB2YWx1ZSBmb3IgdW5pb24gIgorICAgICAgICAgICAgICArIG5hbWVfOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgdm9pZCB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCkgeworICAgIGlmIChpc191bmlvbl8gJiYgKCFuYW1lXy5lbXB0eSgpKSAmJiAoIW1lbWJlcnNfdmFsaWRhdGVkKSkgeworICAgICAgbWVtYmVyc190eXBlOjpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKCptX2l0ZXIpOworICAgICAgfQorICAgICAgbWVtYmVyc192YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0X3VuaW9uKGJvb2wgaXNfdW5pb24pIHsKKyAgICBpc191bmlvbl8gPSBpc191bmlvbjsKKyAgICB2YWxpZGF0ZV91bmlvbl9tZW1iZXJzKCk7CisgIH0KKworICB2b2lkIHNldF94c2RfYWxsKGJvb2wgeHNkX2FsbCkgeyB4c2RfYWxsXyA9IHhzZF9hbGw7IH0KKworICBib29sIGdldF94c2RfYWxsKCkgY29uc3QgeyByZXR1cm4geHNkX2FsbF87IH0KKworICBib29sIGFwcGVuZCh0X2ZpZWxkKiBlbGVtKSB7CisgICAgdHlwZWRlZiBtZW1iZXJzX3R5cGU6Oml0ZXJhdG9yIGl0ZXJfdHlwZTsKKyAgICBzdGQ6OnBhaXI8aXRlcl90eXBlLCBpdGVyX3R5cGU+IGJvdW5kcyA9IHN0ZDo6ZXF1YWxfcmFuZ2UobWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyc19pbl9pZF9vcmRlcl8uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQ6OmtleV9jb21wYXJlKCkpOworICAgIGlmIChib3VuZHMuZmlyc3QgIT0gYm91bmRzLnNlY29uZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyByZXR1cm5zIGZhbHNlIHdoZW4gdGhlcmUgaXMgYSBjb25mbGljdCBvZiBmaWVsZCBuYW1lcworICAgIGlmIChnZXRfZmllbGRfYnlfbmFtZShlbGVtLT5nZXRfbmFtZSgpKSAhPSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWJlcnNfLnB1c2hfYmFjayhlbGVtKTsKKyAgICBtZW1iZXJzX2luX2lkX29yZGVyXy5pbnNlcnQoYm91bmRzLnNlY29uZCwgZWxlbSk7CisgICAgdmFsaWRhdGVfdW5pb25fbWVtYmVyKGVsZW0pOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfbWVtYmVycygpIGNvbnN0IHsgcmV0dXJuIG1lbWJlcnNfOyB9CisKKyAgY29uc3QgbWVtYmVyc190eXBlJiBnZXRfc29ydGVkX21lbWJlcnMoKSB7IHJldHVybiBtZW1iZXJzX2luX2lkX29yZGVyXzsgfQorCisgIGJvb2wgaXNfc3RydWN0KCkgY29uc3QgeyByZXR1cm4gIWlzX3hjZXB0aW9uXzsgfQorCisgIGJvb2wgaXNfeGNlcHRpb24oKSBjb25zdCB7IHJldHVybiBpc194Y2VwdGlvbl87IH0KKworICBib29sIGlzX3VuaW9uKCkgY29uc3QgeyByZXR1cm4gaXNfdW5pb25fOyB9CisKKyAgdF9maWVsZCogZ2V0X2ZpZWxkX2J5X25hbWUoc3RkOjpzdHJpbmcgZmllbGRfbmFtZSkgeworICAgIG1lbWJlcnNfdHlwZTo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworICAgIGZvciAobV9pdGVyID0gbWVtYmVyc19pbl9pZF9vcmRlcl8uYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmVuZCgpOyArK21faXRlcikgeworICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSA9PSBmaWVsZF9uYW1lKSB7CisgICAgICAgIHJldHVybiAqbV9pdGVyOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIGNvbnN0IHRfZmllbGQqIGdldF9maWVsZF9ieV9uYW1lKHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUpIGNvbnN0IHsKKyAgICBtZW1iZXJzX3R5cGU6OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKyAgICBmb3IgKG1faXRlciA9IG1lbWJlcnNfaW5faWRfb3JkZXJfLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzX2luX2lkX29yZGVyXy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIGlmICgoKm1faXRlciktPmdldF9uYW1lKCkgPT0gZmllbGRfbmFtZSkgeworICAgICAgICByZXR1cm4gKm1faXRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworcHJpdmF0ZToKKyAgbWVtYmVyc190eXBlIG1lbWJlcnNfOworICBtZW1iZXJzX3R5cGUgbWVtYmVyc19pbl9pZF9vcmRlcl87CisgIGJvb2wgaXNfeGNlcHRpb25fOworICBib29sIGlzX3VuaW9uXzsKKyAgYm9vbCBtZW1iZXJzX3ZhbGlkYXRlZDsKKyAgaW50IG1lbWJlcnNfd2l0aF92YWx1ZTsKKworICBib29sIHhzZF9hbGxfOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmQxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGUuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfVFlQRV9ICisjZGVmaW5lIFRfVFlQRV9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfZG9jLmgiCisKK2NsYXNzIHRfcHJvZ3JhbTsKKworLyoqCisgKiBHZW5lcmljIHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHR5cGUuIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlCisgKiBwYXJzZXIgbW9kdWxlIHRvIGJ1aWxkIHVwIGEgdHJlZSBvZiBvYmplY3QgdGhhdCBhcmUgYWxsIGV4cGxpY2l0bHkgdHlwZWQuCisgKiBUaGUgZ2VuZXJpYyB0X3R5cGUgY2xhc3MgZXhwb3J0cyBhIHZhcmlldHkgb2YgdXNlZnVsIG1ldGhvZHMgdGhhdCBhcmUKKyAqIHVzZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yIHRvIGJyYW5jaCBiYXNlZCB1cG9uIGRpZmZlcmVudCBoYW5kbGluZyBmb3IgdGhlCisgKiB2YXJpb3VzIHR5cGVzLgorICoKKyAqLworY2xhc3MgdF90eXBlIDogcHVibGljIHRfZG9jIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+dF90eXBlKCkge30KKworICB2aXJ0dWFsIHZvaWQgc2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsgbmFtZV8gPSBuYW1lOyB9CisKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0X25hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorCisgIHZpcnR1YWwgYm9vbCBpc192b2lkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2Jhc2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zdHJpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfYmluYXJ5KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX2Jvb2woKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19lbnVtKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3N0cnVjdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc194Y2VwdGlvbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19jb250YWluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19zZXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB2aXJ0dWFsIGJvb2wgaXNfbWFwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGlzX3NlcnZpY2UoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIGNvbnN0IHRfcHJvZ3JhbSogZ2V0X3Byb2dyYW0oKSBjb25zdCB7IHJldHVybiBwcm9ncmFtXzsgfQorCisgIHRfdHlwZSogZ2V0X3RydWVfdHlwZSgpOworICBjb25zdCB0X3R5cGUqIGdldF90cnVlX3R5cGUoKSBjb25zdDsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYnJlYWsgKG1heWJlIGJhZGx5KSB1bmxlc3MgMCA8PSBudW0gPD0gMTYuCisgIHN0YXRpYyBjaGFyIG55YmJsZV90b194ZGlnaXQoaW50IG51bSkgeworICAgIGlmIChudW0gPCAxMCkgeworICAgICAgcmV0dXJuICcwJyArIG51bTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICdBJyArIG51bSAtIDEwOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBieXRlX3RvX2hleCh1aW50OF90IGJ5dGUpIHsKKyAgICBzdGQ6OnN0cmluZyBydjsKKyAgICBydiArPSBueWJibGVfdG9feGRpZ2l0KGJ5dGUgPj4gNCk7CisgICAgcnYgKz0gbnliYmxlX3RvX3hkaWdpdChieXRlICYgMHgwZik7CisgICAgcmV0dXJuIHJ2OworICB9CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBhbm5vdGF0aW9uc187CisKK3Byb3RlY3RlZDoKKyAgdF90eXBlKCkgOiBwcm9ncmFtXyhOVUxMKSB7IDsgfQorCisgIHRfdHlwZSh0X3Byb2dyYW0qIHByb2dyYW0pIDogcHJvZ3JhbV8ocHJvZ3JhbSkgeyA7IH0KKworICB0X3R5cGUodF9wcm9ncmFtKiBwcm9ncmFtLCBzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKHByb2dyYW0pLCBuYW1lXyhuYW1lKSB7IDsgfQorCisgIHRfdHlwZShzdGQ6OnN0cmluZyBuYW1lKSA6IHByb2dyYW1fKE5VTEwpLCBuYW1lXyhuYW1lKSB7IDsgfQorCisgIHRfcHJvZ3JhbSogcHJvZ3JhbV87CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworfTsKKworLyoqCisgKiBQbGFjZWhvbGRlciBzdHJ1Y3QgZm9yIHJldHVybmluZyB0aGUga2V5IGFuZCB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uCisgKiBkdXJpbmcgcGFyc2luZy4KKyAqLworc3RydWN0IHRfYW5ub3RhdGlvbiB7CisgIHN0ZDo6c3RyaW5nIGtleTsKKyAgc3RkOjpzdHJpbmcgdmFsOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZmRiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Y3N0ZGlvPgorCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKwordF90eXBlKiB0X3R5cGVkZWY6OmdldF90eXBlKCkgY29uc3QgeworICBpZiAodHlwZV8gPT0gTlVMTCkgeworICAgIHRfdHlwZSogdHlwZSA9IGdldF9wcm9ncmFtKCktPnNjb3BlKCktPmdldF90eXBlKHN5bWJvbGljXyk7CisgICAgaWYgKHR5cGUgPT0gTlVMTCkgeworICAgICAgcHJpbnRmKCJUeXBlIFwiJXNcIiBub3QgZGVmaW5lZFxuIiwgc3ltYm9saWNfLmNfc3RyKCkpOworICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIHR5cGU7CisgIH0KKyAgcmV0dXJuIHR5cGVfOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQzYTUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfVFlQRURFRl9ICisjZGVmaW5lIFRfVFlQRURFRl9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfdHlwZS5oIgorCisvKioKKyAqIEEgdHlwZWRlZiBpcyBhIG1hcHBpbmcgZnJvbSBhIHN5bWJvbGljIG5hbWUgdG8gYW5vdGhlciB0eXBlLiBJbiBkeW1hbmljYWxseQorICogdHlwZWQgbGFuZ3VhZ2VzIChpLmUuIHBocC9weXRob24pIHRoZSBjb2RlIGdlbmVyYXRvciBjYW4gYWN0dWFsbHkgdXN1YWxseQorICogaWdub3JlIHR5cGVkZWZzIGFuZCBqdXN0IHVzZSB0aGUgdW5kZXJseWluZyB0eXBlIGRpcmVjdGx5LCB0aG91Z2ggaW4gQysrCisgKiB0aGUgc3ltYm9saWMgbmFtaW5nIGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGNvZGUgY2xhcml0eS4KKyAqCisgKi8KK2NsYXNzIHRfdHlwZWRlZiA6IHB1YmxpYyB0X3R5cGUgeworcHVibGljOgorICB0X3R5cGVkZWYodF9wcm9ncmFtKiBwcm9ncmFtLCB0X3R5cGUqIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYykKKyAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksIHR5cGVfKHR5cGUpLCBzeW1ib2xpY18oc3ltYm9saWMpLCBmb3J3YXJkXyhmYWxzZSkge30KKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIHJlZmVyIHRvIGEgdHlwZSB0aGF0IGlzIGxhemlseQorICAgKiByZXNvbHZlZCBhdCBhIGxhdGVyIHRpbWUsIGxpa2UgZm9yIGZvcndhcmQgZGVjbGFyYXRpb25zIG9yCisgICAqIHJlY3Vyc2l2ZSB0eXBlcy4KKyAgICovCisgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeW1ib2xpYywgYm9vbCBmb3J3YXJkKQorICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwKKyAgICAgIHR5cGVfKE5VTEwpLAorICAgICAgc3ltYm9saWNfKHN5bWJvbGljKSwKKyAgICAgIGZvcndhcmRfKGZvcndhcmQpCisgIHt9CisKKyAgfnRfdHlwZWRlZigpIHt9CisKKyAgdF90eXBlKiBnZXRfdHlwZSgpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRfc3ltYm9saWMoKSBjb25zdCB7IHJldHVybiBzeW1ib2xpY187IH0KKworICBib29sIGlzX2ZvcndhcmRfdHlwZWRlZigpIGNvbnN0IHsgcmV0dXJuIGZvcndhcmRfOyB9CisKKyAgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcml2YXRlOgorICB0X3R5cGUqIHR5cGVfOworICBzdGQ6OnN0cmluZyBzeW1ib2xpY187CisgIGJvb2wgZm9yd2FyZF87Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWFkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBkZWZpbmUgZm9yIG1rZGlyLHNpbmNlIHRoZSBtZXRob2Qgc2lnbmF0dXJlCisgKiBpcyBkaWZmZXJlbnQgZm9yIHRoZSBub24tUE9TSVggTWluR1cKKyAqLworCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlICJ0aHJpZnQvd2luZG93cy9jb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8ZGlyZWN0Lmg+CisjaW5jbHVkZSA8aW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Vycm5vPgorCisvLyBpZ25vcmUgRUVYSVNULCB0aHJvdyBvbiBhbnkgb3RoZXIgZXJyb3IKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgTUtESVIoeCkgeyBpbnQgciA9IF9ta2Rpcih4KTsgaWYgKHIgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7IHRocm93IChzdGQ6OnN0cmluZyh4KSArICI6ICIpICsgc3RyZXJyb3IoZXJybm8pOyB9IH0KKyNlbHNlCisjZGVmaW5lIE1LRElSKHgpIHsgaW50IHIgPSBta2Rpcih4LCBTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQorI2VuZGlmCisKKyNpZmRlZiBQQVRIX01BWAorI2RlZmluZSBUSFJJRlRfUEFUSF9NQVggUEFUSF9NQVgKKyNlbHNlCisjZGVmaW5lIFRIUklGVF9QQVRIX01BWCBNQVhfUEFUSAorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0Y2RiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzCisKK2lmIFdJVEhfUExVR0lOCitwbHVnaW5fZ2VuID0gcGx1Z2luX3R5cGVzLmggXAorICAgICAgICAgICAgIHBsdWdpbl90eXBlcy5jcHAgXAorICAgICAgICAgICAgIHBsdWdpbl9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgcGx1Z2luX2NvbnN0YW50cy5jcHAKKworQlVJTFRfU09VUkNFUyA9ICQocGx1Z2luX2dlbikKK2dlbi5zdGFtcDogcGx1Z2luLnRocmlmdCAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcAorCUAkKFJNKSAtZiBnZW4udG1wCisJQHRvdWNoIGdlbi50bXAKKwkkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWJvb3RzdHJhcCAtZ2VuIGNwcCAtb3V0IC4gJDwKKwlAbXYgLWYgZ2VuLnRtcCAkQAorCiskKHBsdWdpbl9nZW4pOiBnZW4uc3RhbXAKKwlAaWYgdGVzdCAtZiAkQDsgdGhlbiA6OyBlbHNlIFwKKwkkKFJNKSAtZiBnZW4uc3RhbXA7IFwKKwkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBnZW4uc3RhbXA7IFwKKwlmaQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSB2ZXJzaW9uLmggd2luZG93cy92ZXJzaW9uLmggJChwbHVnaW5fZ2VuKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS9mb3JfZWFjaC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogY29udmVydF9mb3J3YXJkPGZyb21fdHlwZT4oY29uc3QgZnJvbV90eXBlJiBmcm9tKQorCisjZGVmaW5lIFRIUklGVF9DT05WRVJUX0NPTVBMRVRFX0RFQ0woZnJvbV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgY29udmVydChjb25zdCBmcm9tX3R5cGUmIGZyb20sIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiB0bykKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9VTkFSWV9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0eXBlbmFtZSBUb1R5cGU8ZnJvbV90eXBlPjo6dHlwZSogY29udmVydDxmcm9tX3R5cGU+KGNvbnN0IGZyb21fdHlwZSYgZnJvbSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTl9ERUNMKGZyb21fdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9VTkFSWV9ERUNMKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSVF9DT01QTEVURShmcm9tX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSU0lPTl9ERUNMKGZyb21fdHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRvVHlwZTxmcm9tX3R5cGU+Ojp0eXBlKiB0byA9IGNvbnZlcnRfZm9yd2FyZChmcm9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnZlcnQoZnJvbSwgdG8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB0bzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURV9ERUNMKGZyb21fdHlwZSkKKworI2RlZmluZSBUSFJJRlRfQ09OVkVSU0lPTihmcm9tX3R5cGUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKGZyb21fdHlwZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICh2b2lkKWZyb207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXcgVG9UeXBlPGZyb21fdHlwZT46OnR5cGUoX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQ09OVkVSVF9DT01QTEVURShmcm9tX3R5cGUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9ET0MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbS5fX2lzc2V0LmRvYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHRvLT5zZXRfZG9jKGZyb20uZG9jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBUSFJJRlRfQVNTSUdOX0RPQygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tLl9faXNzZXQuYW5ub3RhdGlvbnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8tPmFubm90YXRpb25zXyA9IGZyb20uYW5ub3RhdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8tPnNldF9uYW1lKGZyb20ubWV0YWRhdGEubmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20ubWV0YWRhdGEuX19pc3NldC5kb2MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+c2V0X2RvYyhmcm9tLm1ldGFkYXRhLmRvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20ubWV0YWRhdGEuX19pc3NldC5hbm5vdGF0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by0+YW5ub3RhdGlvbnNfID0gZnJvbS5tZXRhZGF0YS5hbm5vdGF0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKzo6dF9wcm9ncmFtKiBnX3Byb2dyYW0gPSAwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUz4KK3N0cnVjdCBUeXBlQ2FjaGUgeworICBDKiBvcGVyYXRvcltdKGNvbnN0IGludDY0X3QmIGspIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBDKj46Oml0ZXJhdG9yIGl0ID0gY2FjaGUuZmluZChrKTsKKyAgICBpZiAoaXQgIT0gY2FjaGUuZW5kKCkpIHsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBTPjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gc291cmNlLT5maW5kKGspOworICAgICAgaWYgKGNpdCA9PSBzb3VyY2UtPmVuZCgpKSB7CisgICAgICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJUeXBlIG5vdCBmb3VuZCIpOworICAgICAgfQorICAgICAgcmV0dXJuIChjYWNoZSlba10gPSBjb252ZXJ0X2ZvcndhcmQoY2l0LT5zZWNvbmQpOworICAgIH0KKyAgfQorCisgIHZvaWQgY29tcGlsZUFsbCgpIHsKKyAgICBib29zdDo6Zm9yX2VhY2goKnNvdXJjZSB8IGJvb3N0OjphZGFwdG9yczo6bWFwX2tleXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmVHlwZUNhY2hlOjpjb21waWxlLCB0aGlzLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgfQorCisgIHN0ZDo6bWFwPGludDY0X3QsIFM+IGNvbnN0KiBzb3VyY2U7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBzb3VyY2UgPSBudWxscHRyIDsKKyAgICBjYWNoZS5jbGVhcigpIDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6bWFwPGludDY0X3QsIEMqPiBjYWNoZTsKKworcHJpdmF0ZToKKyAgdm9pZCBjb21waWxlKGNvbnN0IGludDY0X3QmIGspIHsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCBTPjo6Y29uc3RfaXRlcmF0b3IgY2l0ID0gc291cmNlLT5maW5kKGspOworICAgIGlmIChjaXQgPT0gc291cmNlLT5lbmQoKSkgeworICAgICAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlR5cGUgbm90IGZvdW5kICIpOworICAgIH0KKyAgICBjb252ZXJ0KGNpdC0+c2Vjb25kLCAoKnRoaXMpW2tdKTsKKyAgfQorfTsKK3N0ZDo6bWFwPGludDY0X3QsIDo6dF9wcm9ncmFtKj4gZ19wcm9ncmFtX2NhY2hlOworVHlwZUNhY2hlPCA6OnRfdHlwZSwgdF90eXBlPiBnX3R5cGVfY2FjaGU7CitUeXBlQ2FjaGU8IDo6dF9jb25zdCwgdF9jb25zdD4gZ19jb25zdF9jYWNoZTsKK1R5cGVDYWNoZTwgOjp0X3NlcnZpY2UsIHRfc2VydmljZT4gZ19zZXJ2aWNlX2NhY2hlOworCit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpIHsKKyAgZ190eXBlX2NhY2hlLmNsZWFyKCk7CisgIGdfY29uc3RfY2FjaGUuY2xlYXIoKTsKKyAgZ19zZXJ2aWNlX2NhY2hlLmNsZWFyKCk7Cit9CisKK3ZvaWQgc2V0X2dsb2JhbF9jYWNoZShjb25zdCBUeXBlUmVnaXN0cnkmIGZyb20pIHsKKyAgZ190eXBlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnR5cGVzOworICBnX2NvbnN0X2NhY2hlLnNvdXJjZSA9ICZmcm9tLmNvbnN0YW50czsKKyAgZ19zZXJ2aWNlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnNlcnZpY2VzOworCisgIGdfdHlwZV9jYWNoZS5jb21waWxlQWxsKCk7CisgIGdfY29uc3RfY2FjaGUuY29tcGlsZUFsbCgpOworICBnX3NlcnZpY2VfY2FjaGUuY29tcGlsZUFsbCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QqIHJlc29sdmVfdHlwZShpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGdfdHlwZV9jYWNoZVtuYW1lXSk7Cit9CisKKzo6dF9jb25zdCogcmVzb2x2ZV9jb25zdChpbnQ2NF90IG5hbWUpIHsKKyAgcmV0dXJuIGdfY29uc3RfY2FjaGVbbmFtZV07Cit9CisKKzo6dF9zZXJ2aWNlKiByZXNvbHZlX3NlcnZpY2UoaW50NjRfdCBuYW1lKSB7CisgIHJldHVybiBnX3NlcnZpY2VfY2FjaGVbbmFtZV07Cit9CisKK1RIUklGVF9DT05WRVJUX0ZPUldBUkQodF9iYXNlX3R5cGUpIHsKKyNkZWZpbmUgVF9CQVNFVFlQRV9DQVNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2Jhc2U6OlRZUEVfIyN0eXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV8jI3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworCisgIDo6dF9iYXNlX3R5cGU6OnRfYmFzZSB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOworICBib29sIGlzX2JpbmFyeSA9IGZhbHNlOworICBzd2l0Y2ggKGZyb20udmFsdWUpIHsKKyAgICBUX0JBU0VUWVBFX0NBU0UoVk9JRCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKFNUUklORyk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEJPT0wpOworICAgIFRfQkFTRVRZUEVfQ0FTRShJOCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKEkxNik7CisgICAgVF9CQVNFVFlQRV9DQVNFKEkzMik7CisgICAgVF9CQVNFVFlQRV9DQVNFKEk2NCk7CisgICAgVF9CQVNFVFlQRV9DQVNFKERPVUJMRSk7CisgIGNhc2UgdF9iYXNlOjpUWVBFX0JJTkFSWToKKyAgICB0ID0gOjp0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc7CisgICAgaXNfYmluYXJ5ID0gdHJ1ZTsKKyAgICBicmVhazsKKyAgfQorICA6OnRfYmFzZV90eXBlKiB0byA9IG5ldyA6OnRfYmFzZV90eXBlKGZyb20ubWV0YWRhdGEubmFtZSwgdCk7CisgIHRvLT5zZXRfYmluYXJ5KGlzX2JpbmFyeSk7CisgIHJldHVybiB0bzsKKyN1bmRlZiBUX0JBU0VUWVBFX0NBU0UKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfYmFzZV90eXBlKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKK30KKworVEhSSUZUX0NPTlZFUlRfRk9SV0FSRCh0X3R5cGVkZWYpIHsKKyAgOjp0X3R5cGVkZWYqIHRvOworICBpZiAoZnJvbS5mb3J3YXJkKSB7CisgICAgdG8gPSBuZXcgOjp0X3R5cGVkZWYoZ19wcm9ncmFtX2NhY2hlW2Zyb20ubWV0YWRhdGEucHJvZ3JhbV9pZF0sIGZyb20uc3ltYm9saWMsIHRydWUpOworICB9IGVsc2UgeworICAgIHRvID0gbmV3IDo6dF90eXBlZGVmKGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksIGZyb20uc3ltYm9saWMpOworICB9CisgIHJldHVybiB0bzsKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfdHlwZWRlZikgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW1fdmFsdWUsIGZyb20ubmFtZSwgZnJvbS52YWx1ZSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0FOTk9UQVRJT05TKCk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2VudW0sIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RhbnRzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZChjb252ZXJ0PHRfZW51bV92YWx1ZT4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfZW51bTo6YXBwZW5kLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2xpc3QsIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20uZWxlbV90eXBlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIGlmIChmcm9tLl9faXNzZXQuY3BwX25hbWUpCisgICAgdG8tPnNldF9jcHBfbmFtZShmcm9tLmNwcF9uYW1lKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc2V0LCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmVsZW1fdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X21hcCwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20ua2V5X3R5cGUpLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS52YWxfdHlwZSkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS5fX2lzc2V0LmNwcF9uYW1lKQorICAgIHRvLT5zZXRfY3BwX25hbWUoZnJvbS5jcHBfbmFtZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2NvbnN0X3ZhbHVlLCApIHsKKyNkZWZpbmUgVF9DT05TVF9WQUxVRV9DQVNFKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZyb20uX19pc3NldC50eXBlIyNfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG8tPnNldF8jI3R5cGUoZnJvbS50eXBlIyNfdmFsKQorCisgIGFzc2VydCh0byk7CisgIGlmIChmcm9tLl9faXNzZXQubWFwX3ZhbCkgeworICAgIHRvLT5zZXRfbWFwKCk7CisgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlLCB0X2NvbnN0X3ZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLm1hcF92YWwuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGZyb20ubWFwX3ZhbC5lbmQoKTsgaXQrKykgeworICAgICAgdG8tPmFkZF9tYXAoY29udmVydChpdC0+Zmlyc3QpLCBjb252ZXJ0KGl0LT5zZWNvbmQpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZnJvbS5fX2lzc2V0Lmxpc3RfdmFsKSB7CisgICAgdG8tPnNldF9saXN0KCk7CisgICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20ubGlzdF92YWwgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZjb252ZXJ0PHRfY29uc3RfdmFsdWU+KSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfY29uc3RfdmFsdWU6OmFkZF9saXN0LCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CisgIH0gZWxzZQorICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShzdHJpbmcpOworICBlbHNlIFRfQ09OU1RfVkFMVUVfQ0FTRShpbnRlZ2VyKTsKKyAgZWxzZSBUX0NPTlNUX1ZBTFVFX0NBU0UoZG91YmxlKTsKKyAgZWxzZSBpZiAoZnJvbS5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKSB7CisgICAgdG8tPnNldF9pZGVudGlmaWVyKGZyb20uY29uc3RfaWRlbnRpZmllcl92YWwuaWRlbnRpZmllcl92YWwpIDsKKyAgICB0by0+c2V0X2VudW0ocmVzb2x2ZV90eXBlPCA6OnRfZW51bT4oZnJvbS5jb25zdF9pZGVudGlmaWVyX3ZhbC5lbnVtX3ZhbCkpIDsKKyAgfQorCisjdW5kZWYgVF9DT05TVF9WQUxVRV9DQVNFCit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2ZpZWxkLCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLCBmcm9tLm5hbWUsIGZyb20ua2V5KSB7CisgIGFzc2VydCh0byk7CisgIFRIUklGVF9BU1NJR05fQU5OT1RBVElPTlMoKTsKKyAgdG8tPnNldF9yZWZlcmVuY2UoZnJvbS5yZWZlcmVuY2UpOworICB0by0+c2V0X3JlcShzdGF0aWNfY2FzdDwgOjp0X2ZpZWxkOjplX3JlcT4oZnJvbS5yZXEpKTsKKyAgaWYgKGZyb20uX19pc3NldC52YWx1ZSkgeworICAgIHRvLT5zZXRfdmFsdWUoY29udmVydChmcm9tLnZhbHVlKSk7CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc3RydWN0LCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIHRvLT5zZXRfdW5pb24oZnJvbS5pc191bmlvbik7CisgIHRvLT5zZXRfeGNlcHRpb24oZnJvbS5pc194Y2VwdGlvbik7CisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLm1lbWJlcnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9maWVsZD4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfc3RydWN0OjphcHBlbmQsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3QsCisgICAgICAgICAgICAgICAgICByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLnR5cGUpLAorICAgICAgICAgICAgICAgICAgZnJvbS5uYW1lLAorICAgICAgICAgICAgICAgICAgY29udmVydDx0X2NvbnN0X3ZhbHVlPihmcm9tLnZhbHVlKSkgeworICBhc3NlcnQodG8pOworICBUSFJJRlRfQVNTSUdOX0RPQygpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS5yZXR1cm50eXBlKSwKKyAgICAgICAgICAgICAgICAgIGZyb20ubmFtZSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oZnJvbS5hcmdsaXN0KSwKKyAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3N0cnVjdD4oZnJvbS54Y2VwdGlvbnMpLAorICAgICAgICAgICAgICAgICAgZnJvbS5pc19vbmV3YXkpIHsKKyAgYXNzZXJ0KHRvKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zZXJ2aWNlLCBnX3Byb2dyYW1fY2FjaGVbZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkXSkgeworICBhc3NlcnQodG8pOworICBhc3NlcnQoZnJvbS5tZXRhZGF0YS5wcm9ncmFtX2lkKTsKKyAgYXNzZXJ0KGdfcHJvZ3JhbV9jYWNoZVtmcm9tLm1ldGFkYXRhLnByb2dyYW1faWRdKTsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworCisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmZ1bmN0aW9ucyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2Z1bmN0aW9uPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zZXJ2aWNlOjphZGRfZnVuY3Rpb24sIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKworICBpZiAoZnJvbS5fX2lzc2V0LmV4dGVuZHNfKQorICAgIHRvLT5zZXRfZXh0ZW5kcyhyZXNvbHZlX3NlcnZpY2UoZnJvbS5leHRlbmRzXykpOworfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfdHlwZSkgeworI2RlZmluZSBUX1RZUEVfQ0FTRV9GV19UKGNhc2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZnJvbS5fX2lzc2V0LmNhc2UjI192YWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gY29udmVydF9mb3J3YXJkPHR5cGU+KGZyb20uY2FzZSMjX3ZhbCkKKyNkZWZpbmUgVF9UWVBFX0NBU0VfRlcoY2FzZSkgVF9UWVBFX0NBU0VfRldfVChjYXNlLCB0XyMjY2FzZSkKKworICBUX1RZUEVfQ0FTRV9GVyhiYXNlX3R5cGUpOworICBUX1RZUEVfQ0FTRV9GVyh0eXBlZGVmKTsKKyAgVF9UWVBFX0NBU0VfRlcoZW51bSk7CisgIFRfVFlQRV9DQVNFX0ZXKHN0cnVjdCk7CisgIFRfVFlQRV9DQVNFX0ZXX1QoeGNlcHRpb24sIHRfc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfRlcobGlzdCk7CisgIFRfVFlQRV9DQVNFX0ZXKHNldCk7CisgIFRfVFlQRV9DQVNFX0ZXKG1hcCk7CisgIFRfVFlQRV9DQVNFX0ZXKHNlcnZpY2UpOworICB0aHJvdyBUaHJpZnRQbHVnaW5FcnJvcigiSW52YWxpZCBkYXRhOiBUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZS4iKTsKKyN1bmRlZiBUX1RZUEVfQ0FTRV9GV19UCisjdW5kZWYgVF9UWVBFX0NBU0VfRlcKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfdHlwZSkgeworI2RlZmluZSBUX1RZUEVfQ0FTRV9UKGNhc2UsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBlbHNlIGlmIChmcm9tLl9faXNzZXQuY2FzZSMjX3ZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29udmVydDx0eXBlLCA6OnR5cGU+KGZyb20uY2FzZSMjX3ZhbCwgcmVpbnRlcnByZXRfY2FzdDwgOjp0eXBlKj4odG8pKQorI2RlZmluZSBUX1RZUEVfQ0FTRShjYXNlKSBUX1RZUEVfQ0FTRV9UKGNhc2UsIHRfIyNjYXNlKQorCisgIGlmIChmYWxzZSkgeworICB9CisgIFRfVFlQRV9DQVNFKGJhc2VfdHlwZSk7CisgIFRfVFlQRV9DQVNFKHR5cGVkZWYpOworICBUX1RZUEVfQ0FTRShlbnVtKTsKKyAgVF9UWVBFX0NBU0Uoc3RydWN0KTsKKyAgVF9UWVBFX0NBU0VfVCh4Y2VwdGlvbiwgdF9zdHJ1Y3QpOworICBUX1RZUEVfQ0FTRShsaXN0KTsKKyAgVF9UWVBFX0NBU0Uoc2V0KTsKKyAgVF9UWVBFX0NBU0UobWFwKTsKKyAgVF9UWVBFX0NBU0Uoc2VydmljZSk7CisgIGVsc2UgeworICAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJJbnZhbGlkIGRhdGE6IFR5cGUgdW5pb24gaGFzIG5vIHZhbHVlLiIpOworICB9CisjdW5kZWYgVF9UWVBFX0NBU0VfVAorI3VuZGVmIFRfVFlQRV9DQVNFCit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfc2NvcGUsICkgeworICBhc3NlcnQodG8pOworI2RlZmluZSBUX1NDT1BFX1JFU09MVkUodHlwZSwgbmFtZSwgYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubmFtZSMjcy5iZWdpbigpOyBpdCAhPSBmcm9tLm5hbWUjI3MuZW5kKCk7ICAgXAorICAgICAgIGl0KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6dF8jI3R5cGUqIHQgPSByZXNvbHZlXyMjdHlwZSBhKCppdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvLT5hZGRfIyNuYW1lKHQtPmdldF9uYW1lKCksIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisgIFRfU0NPUEVfUkVTT0xWRSh0eXBlLCB0eXBlLCA8IDo6dF90eXBlPik7CisgIFRfU0NPUEVfUkVTT0xWRShjb25zdCwgY29uc3RhbnQsICk7CisgIFRfU0NPUEVfUkVTT0xWRShzZXJ2aWNlLCBzZXJ2aWNlLCApOworI3VuZGVmIFRfU0NPUEVfUkVTT0xWRQorfQorCitUSFJJRlRfQ09OVkVSVF9GT1JXQVJEKHRfcHJvZ3JhbSkgeworICA6OnRfcHJvZ3JhbSogdG8gPSBuZXcgOjp0X3Byb2dyYW0oZnJvbS5wYXRoLCBmcm9tLm5hbWUpOworICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5pbmNsdWRlcy5iZWdpbigpOyBpdCAhPSBmcm9tLmluY2x1ZGVzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICB0by0+YWRkX2luY2x1ZGUoY29udmVydF9mb3J3YXJkKCppdCkpOworICB9CisgIGdfcHJvZ3JhbV9jYWNoZVtmcm9tLnByb2dyYW1faWRdID0gdG87CisgIHJldHVybiB0bzsKK30KK1RIUklGVF9DT05WRVJUX0NPTVBMRVRFKHRfcHJvZ3JhbSkgeworICBhc3NlcnQodG8pOworICBnX3Byb2dyYW0gPSB0bzsKKyAgY29udmVydDx0X3Njb3BlLCA6OnRfc2NvcGU+KGZyb20uc2NvcGUsIHRvLT5zY29wZSgpKTsKKyAgVEhSSUZUX0FTU0lHTl9ET0MoKTsKKworICB0by0+c2V0X291dF9wYXRoKGZyb20ub3V0X3BhdGgsIGZyb20ub3V0X3BhdGhfaXNfYWJzb2x1dGUpOworCisgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLnR5cGVkZWZzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV90eXBlPCA6OnRfdHlwZWRlZj4pLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX3R5cGVkZWYsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uZW51bXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3R5cGU8IDo6dF9lbnVtPiksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfZW51bSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ub2JqZWN0cy5iZWdpbigpOyBpdCAhPSBmcm9tLm9iamVjdHMuZW5kKCk7CisgICAgICAgaXQrKykgeworICAgIDo6dF9zdHJ1Y3QqIHQyID0gcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0PigqaXQpOworICAgIGlmICh0Mi0+aXNfeGNlcHRpb24oKSkgeworICAgICAgdG8tPmFkZF94Y2VwdGlvbih0Mik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRvLT5hZGRfc3RydWN0KHQyKTsKKyAgICB9CisgIH0KKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV9jb25zdCksCisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY29uc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uc2VydmljZXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3NlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCY6OnRfcHJvZ3JhbTo6YWRkX3NlcnZpY2UsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKworICBmb3IgKHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5pbmNsdWRlcy5iZWdpbigpOyBpdCAhPSBmcm9tLmluY2x1ZGVzLmVuZCgpOworICAgICAgIGl0KyspIHsKKyAgICBjb252ZXJ0KCppdCwgZ19wcm9ncmFtX2NhY2hlW2l0LT5wcm9ncmFtX2lkXSk7CisgIH0KKyAgc3RkOjpmb3JfZWFjaChmcm9tLmNfaW5jbHVkZXMuYmVnaW4oKSwgZnJvbS5jX2luY2x1ZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jX2luY2x1ZGUsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgc3RkOjpmb3JfZWFjaChmcm9tLmNwcF9pbmNsdWRlcy5iZWdpbigpLCBmcm9tLmNwcF9pbmNsdWRlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY3BwX2luY2x1ZGUsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgZm9yIChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ubmFtZXNwYWNlcy5iZWdpbigpOworICAgICAgIGl0ICE9IGZyb20ubmFtZXNwYWNlcy5lbmQoKTsgaXQrKykgeworICAgIHRvLT5zZXRfbmFtZXNwYWNlKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgIH0KKworICB0by0+c2V0X2luY2x1ZGVfcHJlZml4KGZyb20uaW5jbHVkZV9wcmVmaXgpOworICB0by0+c2V0X25hbWVzcGFjZShmcm9tLm5hbWVzcGFjZV8pOworfQorCitpbnQgR2VuZXJhdG9yUGx1Z2luOjpleGVjKGludCwgY2hhciogW10pIHsKKyNpZmRlZiBfV0lOMzIKKyAgX3NldG1vZGUoZmlsZW5vKHN0ZGluKSwgX09fQklOQVJZKTsKKyNlbmRpZgorICBzdGQ6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAorICAgICAgbmV3IFRGcmFtZWRUcmFuc3BvcnQoc3RkOjptYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhzdGRpbikpKSk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90byh0cmFuc3BvcnQpOworICBHZW5lcmF0b3JJbnB1dCBpbnB1dDsKKyAgdHJ5IHsKKyAgICBpbnB1dC5yZWFkKCZwcm90byk7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlcnIpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIHdoaWxlIHJlY2VpdmluZyBwbHVnaW4gZGF0YTogIiA8PCBlcnIud2hhdCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW5pdEdsb2JhbHMoKTsKKyAgOjp0X3Byb2dyYW0qIHAgPSBnX3Byb2dyYW0gPSBjb252ZXJ0X2ZvcndhcmQoaW5wdXQucHJvZ3JhbSk7CisgIHNldF9nbG9iYWxfY2FjaGUoaW5wdXQudHlwZV9yZWdpc3RyeSk7CisgIGNvbnZlcnQoaW5wdXQucHJvZ3JhbSwgcCk7CisKKyAgaW50IHJldCA9IGdlbmVyYXRlKHAsIGlucHV0LnBhcnNlZF9vcHRpb25zKTsKKyAgY2xlYXJHbG9iYWxzKCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgY29uc3RfdmFsdWVfY2FzZShjb25zdCB0X2NvbnN0X3ZhbHVlJiB2KSB7CisgIGlmICh2Ll9faXNzZXQubWFwX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA7CisgIGlmICh2Ll9faXNzZXQubGlzdF92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTElTVDsKKyAgaWYgKHYuX19pc3NldC5zdHJpbmdfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX1NUUklORzsKKyAgaWYgKHYuX19pc3NldC5pbnRlZ2VyX3ZhbCkKKyAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSOworICBpZiAodi5fX2lzc2V0LmRvdWJsZV92YWwpCisgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOworICBpZiAodi5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKQorICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI7CisgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJVbmtub3duIGNvbnN0IHZhbHVlIHR5cGUiKTsKK30KKworYm9vbCB0X2NvbnN0X3ZhbHVlOjpvcGVyYXRvcjwoY29uc3QgdF9jb25zdF92YWx1ZSYgdGhhdCkgY29uc3QgeworICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MSA9IGNvbnN0X3ZhbHVlX2Nhc2UoKnRoaXMpOworICA6OnRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSB0MiA9IGNvbnN0X3ZhbHVlX2Nhc2UodGhhdCk7CisgIGlmICh0MSAhPSB0MikKKyAgICByZXR1cm4gdDEgPCB0MjsKKyAgc3dpdGNoICh0MSkgeworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICByZXR1cm4gaW50ZWdlcl92YWwgPCB0aGF0LmludGVnZXJfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIHJldHVybiBkb3VibGVfdmFsIDwgdGhhdC5kb3VibGVfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIHJldHVybiBzdHJpbmdfdmFsIDwgdGhhdC5zdHJpbmdfdmFsOworICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIGlmICh0aGF0Lm1hcF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChtYXBfdmFsLmVtcHR5KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbWFwX3ZhbC5iZWdpbigpLT5maXJzdCA8IHRoYXQubWFwX3ZhbC5iZWdpbigpLT5maXJzdDsKKyAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgaWYgKHRoYXQubGlzdF92YWwuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlIGlmIChsaXN0X3ZhbC5lbXB0eSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGxpc3RfdmFsLmZyb250KCkgPCB0aGF0Lmxpc3RfdmFsLmZyb250KCk7CisgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgorICAgIHJldHVybiBpbnRlZ2VyX3ZhbCA8IHRoYXQuaW50ZWdlcl92YWw7CisgIH0KKyAgdGhyb3cgVGhyaWZ0UGx1Z2luRXJyb3IoIlVua25vd24gY29uc3QgdmFsdWUgdHlwZSIpOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNWNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1BMVUdJTl9ICisjZGVmaW5lIFRfUExVR0lOX1BMVUdJTl9ICisKKyNpbmNsdWRlICJ0aHJpZnQvVGhyaWZ0LmgiCisKK2NsYXNzIHRfcHJvZ3JhbTsKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwbHVnaW4geworCitzdHJ1Y3QgVGhyaWZ0UGx1Z2luRXJyb3IgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24geworICBUaHJpZnRQbHVnaW5FcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1zZykge30KK307CisKK2NsYXNzIEdlbmVyYXRvclBsdWdpbiB7CitwdWJsaWM6CisgIGludCBleGVjKGludCBhcmdjLCBjaGFyKiBhcmd2W10pOworICB2aXJ0dWFsIGludCBnZW5lcmF0ZSg6OnRfcHJvZ3JhbSosIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mKSA9IDA7Cit9OworfQorfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5OGY5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0CkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBhczMgb3JnLmFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgY3BwIGFwYWNoZS50aHJpZnQucGx1Z2luCituYW1lc3BhY2UgY3NoYXJwIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBkIHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBkZWxwaGkgVGhyaWZ0LlBsdWdpbgorbmFtZXNwYWNlIGVybCB0aHJpZnQucGx1Z2luCituYW1lc3BhY2UgZ28gdGhyaWZ0CituYW1lc3BhY2UgaGF4ZSBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBocyBUaHJpZnQuUGx1Z2luCituYW1lc3BhY2UgamF2YSBvcmcuYXBhY2hlLnRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSBvY2FtbCBUaHJpZnQKK25hbWVzcGFjZSBwZXJsIFRocmlmdC5QbHVnaW4KK25hbWVzcGFjZSBwaHAgdGhyaWZ0LnBsdWdpbgorbmFtZXNwYWNlIHB5IHRocmlmdC5wbHVnaW4KK25hbWVzcGFjZSByYiBUaHJpZnQKKwordHlwZWRlZiBpNjQgdF9wcm9ncmFtX2lkCit0eXBlZGVmIGk2NCB0X3R5cGVfaWQKK3R5cGVkZWYgaTY0IHRfY29uc3RfaWQKK3R5cGVkZWYgaTY0IHRfc2VydmljZV9pZAorCitlbnVtIHRfYmFzZSB7CisgICAgVFlQRV9WT0lECisgICAgVFlQRV9TVFJJTkcKKyAgICBUWVBFX0JPT0wKKyAgICBUWVBFX0k4CisgICAgVFlQRV9JMTYKKyAgICBUWVBFX0kzMgorICAgIFRZUEVfSTY0CisgICAgVFlQRV9ET1VCTEUKKyAgICBUWVBFX0JJTkFSWQorfQorCitzdHJ1Y3QgVHlwZU1ldGFkYXRhIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgdF9wcm9ncmFtX2lkIHByb2dyYW1faWQKKyAgOTk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gYW5ub3RhdGlvbnMKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CisKK3N0cnVjdCB0X2Jhc2VfdHlwZSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCB0X2Jhc2UgdmFsdWUKK30KKworc3RydWN0IHRfbGlzdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiBvcHRpb25hbCBzdHJpbmcgY3BwX25hbWUKKyAgMzogcmVxdWlyZWQgdF90eXBlX2lkIGVsZW1fdHlwZQorfQorCitzdHJ1Y3QgdF9zZXQgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogb3B0aW9uYWwgc3RyaW5nIGNwcF9uYW1lCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBlbGVtX3R5cGUKK30KKworc3RydWN0IHRfbWFwIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IG9wdGlvbmFsIHN0cmluZyBjcHBfbmFtZQorICAzOiByZXF1aXJlZCB0X3R5cGVfaWQga2V5X3R5cGUKKyAgNDogcmVxdWlyZWQgdF90eXBlX2lkIHZhbF90eXBlCit9CisKK3N0cnVjdCB0X3R5cGVkZWYgeworICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIHR5cGUKKyAgMzogcmVxdWlyZWQgc3RyaW5nIHN5bWJvbGljCisgIDQ6IHJlcXVpcmVkIGJvb2wgZm9yd2FyZAorfQorCitzdHJ1Y3QgdF9lbnVtX3ZhbHVlIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKKyAgMjogcmVxdWlyZWQgaTMyIHZhbHVlCisgIDk5OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBzdHJpbmc+IGFubm90YXRpb25zCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorc3RydWN0IHRfZW51bSB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZW51bV92YWx1ZT4gY29uc3RhbnRzCit9CisKK2VudW0gUmVxdWlyZWRuZXNzIHsKKyAgVF9SRVFVSVJFRCA9IDAKKyAgVF9PUFRJT05BTCA9IDEKKyAgVF9PUFRfSU5fUkVRX09VVCA9IDIKK30KKworc3RydWN0IHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBpZGVudGlmaWVyX3ZhbAorICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgZW51bV92YWwKK30KKwordW5pb24gdF9jb25zdF92YWx1ZSB7CisgIDE6IG9wdGlvbmFsIG1hcDx0X2NvbnN0X3ZhbHVlLCB0X2NvbnN0X3ZhbHVlPiBtYXBfdmFsCisgIDI6IG9wdGlvbmFsIGxpc3Q8dF9jb25zdF92YWx1ZT4gbGlzdF92YWwKKyAgMzogb3B0aW9uYWwgc3RyaW5nIHN0cmluZ192YWwKKyAgNDogb3B0aW9uYWwgaTY0IGludGVnZXJfdmFsCisgIDU6IG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsCisgIDg6IG9wdGlvbmFsIHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSBjb25zdF9pZGVudGlmaWVyX3ZhbAorfQorCitzdHJ1Y3QgdF9jb25zdCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIHRfY29uc3RfdmFsdWUgdmFsdWUKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9maWVsZCB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCisgIDM6IHJlcXVpcmVkIGkzMiBrZXkKKyAgNDogcmVxdWlyZWQgUmVxdWlyZWRuZXNzIHJlcQorICA1OiBvcHRpb25hbCB0X2NvbnN0X3ZhbHVlIHZhbHVlCisgIDEwOiByZXF1aXJlZCBib29sIHJlZmVyZW5jZQorICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucworICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKK30KK3N0cnVjdCB0X3N0cnVjdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZmllbGQ+IG1lbWJlcnMKKyAgMzogcmVxdWlyZWQgYm9vbCBpc191bmlvbgorICA0OiByZXF1aXJlZCBib29sIGlzX3hjZXB0aW9uCit9CitzdHJ1Y3QgdF9mdW5jdGlvbiB7CisgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCisgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCByZXR1cm50eXBlCisgIDM6IHJlcXVpcmVkIHRfdHlwZV9pZCBhcmdsaXN0CisgIDQ6IHJlcXVpcmVkIHRfdHlwZV9pZCB4Y2VwdGlvbnMKKyAgNTogcmVxdWlyZWQgYm9vbCBpc19vbmV3YXkKKyAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCit9CitzdHJ1Y3QgdF9zZXJ2aWNlIHsKKyAgMTogcmVxdWlyZWQgVHlwZU1ldGFkYXRhIG1ldGFkYXRhCisgIDI6IHJlcXVpcmVkIGxpc3Q8dF9mdW5jdGlvbj4gZnVuY3Rpb25zCisgIDM6IG9wdGlvbmFsIHRfc2VydmljZV9pZCBleHRlbmRzXworfQordW5pb24gdF90eXBlIHsKKyAgMTogb3B0aW9uYWwgdF9iYXNlX3R5cGUgYmFzZV90eXBlX3ZhbAorICAyOiBvcHRpb25hbCB0X3R5cGVkZWYgdHlwZWRlZl92YWwKKyAgMzogb3B0aW9uYWwgdF9lbnVtIGVudW1fdmFsCisgIDQ6IG9wdGlvbmFsIHRfc3RydWN0IHN0cnVjdF92YWwKKyAgNTogb3B0aW9uYWwgdF9zdHJ1Y3QgeGNlcHRpb25fdmFsCisgIDY6IG9wdGlvbmFsIHRfbGlzdCBsaXN0X3ZhbAorICA3OiBvcHRpb25hbCB0X3NldCBzZXRfdmFsCisgIDg6IG9wdGlvbmFsIHRfbWFwIG1hcF92YWwKKyAgOTogb3B0aW9uYWwgdF9zZXJ2aWNlIHNlcnZpY2VfdmFsCit9CitzdHJ1Y3QgdF9zY29wZSB7CisgIDE6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiB0eXBlcworICAyOiByZXF1aXJlZCBsaXN0PHRfY29uc3RfaWQ+IGNvbnN0YW50cworICAzOiByZXF1aXJlZCBsaXN0PHRfc2VydmljZV9pZD4gc2VydmljZXMKK30KKworc3RydWN0IFR5cGVSZWdpc3RyeSB7CisgIDE6IHJlcXVpcmVkIG1hcDx0X3R5cGVfaWQsIHRfdHlwZT4gdHlwZXMKKyAgMjogcmVxdWlyZWQgbWFwPHRfY29uc3RfaWQsIHRfY29uc3Q+IGNvbnN0YW50cworICAzOiByZXF1aXJlZCBtYXA8dF9zZXJ2aWNlX2lkLCB0X3NlcnZpY2U+IHNlcnZpY2VzCit9CisKK3N0cnVjdCB0X3Byb2dyYW0geworICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQorICAyOiByZXF1aXJlZCB0X3Byb2dyYW1faWQgcHJvZ3JhbV9pZAorICAzOiByZXF1aXJlZCBzdHJpbmcgcGF0aAorICA0OiByZXF1aXJlZCBzdHJpbmcgbmFtZXNwYWNlXworICA1OiByZXF1aXJlZCBzdHJpbmcgb3V0X3BhdGgKKyAgNjogcmVxdWlyZWQgYm9vbCBvdXRfcGF0aF9pc19hYnNvbHV0ZQorICA4OiByZXF1aXJlZCBsaXN0PHRfcHJvZ3JhbT4gaW5jbHVkZXMKKyAgOTogcmVxdWlyZWQgc3RyaW5nIGluY2x1ZGVfcHJlZml4CisgIDEwOiByZXF1aXJlZCB0X3Njb3BlIHNjb3BlCisKKyAgMTE6IHJlcXVpcmVkIGxpc3Q8dF90eXBlX2lkPiB0eXBlZGVmcworICAxMjogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IGVudW1zCisgIDEzOiByZXF1aXJlZCBsaXN0PHRfY29uc3RfaWQ+IGNvbnN0cworICAxNDogcmVxdWlyZWQgbGlzdDx0X3R5cGVfaWQ+IG9iamVjdHMKKyAgMTU6IHJlcXVpcmVkIGxpc3Q8dF9zZXJ2aWNlX2lkPiBzZXJ2aWNlcworCisgIDE2OiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IG5hbWVzcGFjZXMKKyAgMTc6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBjcHBfaW5jbHVkZXMKKyAgMTg6IHJlcXVpcmVkIGxpc3Q8c3RyaW5nPiBjX2luY2x1ZGVzCisgIDEwMDogb3B0aW9uYWwgc3RyaW5nIGRvYworfQorCitzdHJ1Y3QgR2VuZXJhdG9ySW5wdXQgeworICAxOiByZXF1aXJlZCB0X3Byb2dyYW0gcHJvZ3JhbQorICAyOiByZXF1aXJlZCBUeXBlUmVnaXN0cnkgdHlwZV9yZWdpc3RyeQorICAzOiByZXF1aXJlZCBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYwpAQCAtMCwwICsxLDQ1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgVEhSSUZUX1BPUEVOKGNtZCkgX3BvcGVuKGNtZCwgIndiIikKKyNkZWZpbmUgVEhSSUZUX1BDTE9TRSBfcGNsb3NlCisjZWxzZQorI2RlZmluZSBUSFJJRlRfUE9QRU4oY21kKSBwb3BlbihjbWQsICJ3IikKKyNkZWZpbmUgVEhSSUZUX1BDTE9TRSBwY2xvc2UKKyNlbmRpZgorCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmgiCisKKyNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL21hcC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL2NvcHkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS90cmFuc2Zvcm0uaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIgorI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaCIKKworI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+Cit0eXBlbmFtZSBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjpUb1R5cGU8RnJvbT46OnR5cGUgY29udmVydChGcm9tKiBmcm9tKSB7CisgIHR5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSB0bzsKKyAgY29udmVydChmcm9tLCB0byk7CisgIHJldHVybiB0bzsKK30KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZEVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OworCisjZGVmaW5lIFRIUklGVF9DT05WRVJTSU9OX04oZnJvbV90eXBlLCB0b190eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZvaWQgY29udmVydDxmcm9tX3R5cGUsIHRvX3R5cGU+KGZyb21fdHlwZSAqIGZyb20sIHRvX3R5cGUgJiB0bykKKyNkZWZpbmUgVEhSSUZUX0NPTlZFUlNJT04odHlwZSkgVEhSSUZUX0NPTlZFUlNJT05fTig6OnR5cGUsIHBsdWdpbjo6dHlwZSkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX04oZnJvbV9uYW1lLCB0b19uYW1lLCBwcmVmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKHByZWZpeChmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR04obmFtZSkgVEhSSUZUX0FTU0lHTl9OKGdldF8jI25hbWUoKSwgbmFtZSwgKQorI2RlZmluZSBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodHlwZSwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmcm9tICYmIGZyb20tPmZyb21fbmFtZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdG8uX19zZXRfIyN0b19uYW1lKGNvbnZlcnQoZnJvbS0+ZnJvbV9uYW1lKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRIUklGVF9BU1NJR05fT1BUKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20tPmhhc18jI25hbWUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUSFJJRlRfQVNTSUdOKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9MSVNUX04odHlwZSwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+ZnJvbV9uYW1lLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGZyb20tPmZyb21fbmFtZS5iZWdpbigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPmZyb21fbmFtZS5lbmQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by50b19uYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ8IDo6dHlwZT4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCkgY29udmVydChyZWludGVycHJldF9jYXN0PHRfdHlwZSo+KGZyb20pLCB0by5tZXRhZGF0YSkKKworLy8gYSBnZW5lcmF0b3Igb2Ygc2VxdWVudGlhbCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGFkZHJlc3NlcyAtLSBzbworLy8gdGhhdCB0aGUgVHlwZUNhY2hlIGJlbG93IGNhbiB1c2UgdGhvc2UgSURzIGluc3RlYWQgb2YKKy8vIGFkZHJlc3Nlcy4gVGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQncyB2YXJpb3VzCisvLyB0X3twcm9ncmFtLHR5cGUsZXRjfV9pZCB0eXBlcyB0byBiZSBkZW5zZSBjb25zZWN1dGl2ZWx5LW51bWJlcmVkCisvLyBpbnRlZ2VycywgaW5zdGVhZCBvZiBsYXJnZSByYW5kb20tc2VlbWluZyBpbnRlZ2Vycy4KKy8vCisvLyBGdXJ0aGVybW9yZSwgdGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQgdG8gYmUgZGV0ZXJtaW5pc3RpYyAobm8KKy8vIGFkZHJlc3Nlcywgc28gbm8gcHNldWRvLXJhbmRvbW5lc3MpIGFuZCB0aGF0IG1lYW5zIHJlcHJvZHVjaWJpbGl0eQorLy8gb2Ygb3V0cHV0LgorY29uc3QgaW50NjRfdCBPTkVfTUlMTElPTiA9IDEwMDAgKiAxMDAwOworY2xhc3MgaWRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgaWRfZ2VuZXJhdG9yKCkgOiBhZGRyMmlkXygpLCBuZXh0X2lkXyhPTkVfTUlMTElPTikge30KKworICB2b2lkIGNsZWFyKCkgeworICAgIGFkZHIyaWRfLmNsZWFyKCkgOworICAgIG5leHRfaWRfID0gT05FX01JTExJT04gOworICB9CisKKyAgaW50NjRfdCBnZW5zeW0oY29uc3QgaW50NjRfdCBhZGRyKSB7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+OjppdGVyYXRvciBpdCA9IGFkZHIyaWRfLmZpbmQoYWRkcik7CisgICAgaWYgKGl0ICE9IGFkZHIyaWRfLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZCA7CisgICAgaW50NjRfdCBpZCA9IG5leHRfaWRfKysgOworICAgIGFkZHIyaWRfLmluc2VydChzdGQ6Om1ha2VfcGFpcihhZGRyLCBpZCkpIDsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgc3RkOjptYXA8aW50NjRfdCwgaW50NjRfdD4gYWRkcjJpZF8gOworICBpbnQ2NF90IG5leHRfaWRfIDsKK30gOworCisvLyBUbyBhdm9pZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2Ygc2FtZSB0eXBlLCB0X3R5cGUsIHRfY29uc3QgYW5kIHRfc2VydmljZSBhcmUgc3RvcmVkIGluIG9uZSBwbGFjZQorLy8gYW5kIHJlZmVyZW5jZWQgYnkgSUQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBUeXBlQ2FjaGUgeworICB0eXBlZGVmIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHRvX3R5cGU7CisgIGlkX2dlbmVyYXRvciBpZGdlbiA7CisgIHN0ZDo6bWFwPGludDY0X3QsIHRvX3R5cGU+IGNhY2hlOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMj4KKyAgaW50NjRfdCBzdG9yZShUMiogdCkgeworICAgIGludHB0cl90IGFkZHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pih0KTsKKyAgICBpZiAoIWFkZHIpIHJldHVybiAwTCA7CisKKyAgICBpbnQ2NF90IGlkID0gaWRnZW4uZ2Vuc3ltKGFkZHIpIDsKKyAgICBpZiAoY2FjaGUuZW5kKCkgIT0gY2FjaGUuZmluZChpZCkpIHJldHVybiBpZCA7CisKKyAgICAvLyBIQUNLOiBmYWtlIHJlc29sdmUgZm9yIHJlY3Vyc2l2ZSB0eXBlCisgICAgY2FjaGUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGlkLCB0b190eXBlKCkpKTsKKyAgICAvLyBvdmVyd3JpdGUgd2l0aCB0cnVlIHZhbHVlCisgICAgY2FjaGVbaWRdID0gY29udmVydCh0KTsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsgY2FjaGUuY2xlYXIoKSA7IGlkZ2VuLmNsZWFyKCk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW50NjRfdCBzdG9yZV90eXBlKFQqIHQpOworCisjZGVmaW5lIFRfU1RPUkUodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFR5cGVDYWNoZTx0XyMjdHlwZT4gdHlwZSMjX2NhY2hlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBsdWdpbjo6dF8jI3R5cGUjI19pZCBzdG9yZV90eXBlPHRfIyN0eXBlPih0XyMjdHlwZSAqIHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHR5cGUjI19jYWNoZS5zdG9yZTx0XyMjdHlwZT4odCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1RfU1RPUkUodHlwZSkKK1RfU1RPUkUoY29uc3QpCitUX1NUT1JFKHNlcnZpY2UpCisjdW5kZWYgVF9TVE9SRQorLy8gdGhpcyBpZF9nZW5lcmF0b3IgaXMgZm9yIGdlbnN5bW0taW5nIHRfcHJvZ3JhbV9pZAoraWRfZ2VuZXJhdG9yIHByb2dyYW1fY2FjaGUgOworCisjZGVmaW5lIFRIUklGVF9BU1NJR05fSURfTih0LCBmcm9tX25hbWUsIHRvX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZyb20gJiYgZnJvbS0+ZnJvbV9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0by5fX3NldF8jI3RvX25hbWUoc3RvcmVfdHlwZTx0Pihmcm9tLT5mcm9tX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9JRChuYW1lKSBUSFJJRlRfQVNTSUdOX0lEX04odF90eXBlLCBnZXRfIyNuYW1lKCksIG5hbWUpCisKKyNkZWZpbmUgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHQsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZnJvbSAmJiAhZnJvbS0+Z2V0XyMjbmFtZSMjcygpLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0ZDo6dHJhbnNmb3JtKGZyb20tPmdldF8jI25hbWUjI3MoKS5iZWdpbigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPmdldF8jI25hbWUjI3MoKS5lbmQoKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcih0by5uYW1lIyNzKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICZzdG9yZV90eXBlPHQ+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworVEhSSUZUX0NPTlZFUlNJT05fTig6OnRfdHlwZSwgcGx1Z2luOjpUeXBlTWV0YWRhdGEpIHsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdD4oZnJvbS0+Z2V0X3Byb2dyYW0oKSkpOworICBUSFJJRlRfQVNTSUdOX04oYW5ub3RhdGlvbnNfLCBhbm5vdGF0aW9ucywgKTsKKyAgaWYgKGZyb20tPmhhc19kb2MoKSkgeworICAgIHRvLl9fc2V0X2RvYyhmcm9tLT5nZXRfZG9jKCkpOworICB9CisgIFRIUklGVF9BU1NJR04obmFtZSk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfdHlwZWRlZikgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fSUQodHlwZSk7CisgIFRIUklGVF9BU1NJR04oc3ltYm9saWMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfZm9yd2FyZF90eXBlZGVmKCksIGZvcndhcmQsICk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfZW51bV92YWx1ZSkgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKHZhbHVlKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9lbnVtKSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9lbnVtX3ZhbHVlLCBnZXRfY29uc3RhbnRzKCksIGNvbnN0YW50cyk7Cit9CisKK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3RfdmFsdWUpIHsKKyAgc3dpdGNoIChmcm9tLT5nZXRfdHlwZSgpKSB7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICBUSFJJRlRfQVNTSUdOX04oZ2V0X2ludGVnZXIoKSwgaW50ZWdlcl92YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfRE9VQkxFOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfZG91YmxlKCksIGRvdWJsZV92YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgIFRIUklGVF9BU1NJR05fTihnZXRfc3RyaW5nKCksIHN0cmluZ192YWwsICk7CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfSURFTlRJRklFUjoKKyAgICBpZiAoZnJvbSkgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6dF9jb25zdF9pZGVudGlmaWVyX3ZhbHVlIGNpZHZhbCA7CisgICAgICBpZiAoZnJvbS0+ZW51bV8pCisJY2lkdmFsLl9fc2V0X2VudW1fdmFsKHN0b3JlX3R5cGU8dF90eXBlPihmcm9tLT5lbnVtXykpOworICAgICAgY2lkdmFsLl9fc2V0X2lkZW50aWZpZXJfdmFsKGZyb20tPmdldF9pZGVudGlmaWVyKCkpOworICAgICAgdG8uX19zZXRfY29uc3RfaWRlbnRpZmllcl92YWwoY2lkdmFsKSA7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKKyAgICB0by5fX2lzc2V0Lm1hcF92YWwgPSB0cnVlOworICAgIGlmIChmcm9tICYmICFmcm9tLT5nZXRfbWFwKCkuZW1wdHkoKSkgeworICAgICAgZm9yIChzdGQ6Om1hcDwgOjp0X2NvbnN0X3ZhbHVlKiwgOjp0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0CisgICAgICAgICAgID0gZnJvbS0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGZyb20tPmdldF9tYXAoKS5lbmQoKTsKKyAgICAgICAgICAgaXQrKykgeworICAgICAgICB0by5tYXBfdmFsLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb252ZXJ0KGl0LT5maXJzdCksIGNvbnZlcnQoaXQtPnNlY29uZCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTElTVDoKKyAgICB0by5fX2lzc2V0Lmxpc3RfdmFsID0gdHJ1ZTsKKyAgICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2NvbnN0X3ZhbHVlLCBnZXRfbGlzdCgpLCBsaXN0X3ZhbCk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdGhyb3cgcGx1Z2luOjpUaHJpZnRQbHVnaW5FcnJvcigiY29uc3QgdmFsdWUgaGFzIG5vIHZhbHVlIik7CisgIH0KK30KK1RIUklGVF9DT05WRVJTSU9OKHRfY29uc3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoZG9jKTsKKyAgVEhSSUZUX0FTU0lHTihuYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh0eXBlKTsKKyAgVEhSSUZUX0FTU0lHTl9DT05WRVJUKHRfY29uc3RfdmFsdWUsIGdldF92YWx1ZSgpLCB2YWx1ZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X2ZpZWxkKSB7CisgIFRIUklGVF9BU1NJR05fT1BUKGRvYyk7CisgIFRIUklGVF9BU1NJR04obmFtZSk7CisgIFRIUklGVF9BU1NJR04oa2V5KTsKKyAgVEhSSUZUX0FTU0lHTl9OKGdldF9yZXEoKSwgcmVxLCAocGx1Z2luOjpSZXF1aXJlZG5lc3M6OnR5cGUpKTsKKyAgVEhSSUZUX0FTU0lHTihyZWZlcmVuY2UpOworICBUSFJJRlRfQVNTSUdOX0lEKHR5cGUpOworICBUSFJJRlRfQVNTSUdOX0NPTlZFUlQodF9jb25zdF92YWx1ZSwgZ2V0X3ZhbHVlKCksIHZhbHVlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc3RydWN0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX04odF9maWVsZCwgZ2V0X21lbWJlcnMoKSwgbWVtYmVycyk7CisgIFRIUklGVF9BU1NJR05fTihpc191bmlvbigpLCBpc191bmlvbiwgKTsKKyAgVEhSSUZUX0FTU0lHTl9OKGlzX3hjZXB0aW9uKCksIGlzX3hjZXB0aW9uLCApOworfQorVEhSSUZUX0NPTlZFUlNJT04odF9mdW5jdGlvbikgeworICBUSFJJRlRfQVNTSUdOX09QVChkb2MpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKHJldHVybnR5cGUpOworICBUSFJJRlRfQVNTSUdOX04oaXNfb25ld2F5KCksIGlzX29uZXdheSwgKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChhcmdsaXN0KTsKKyAgVEhSSUZUX0FTU0lHTl9JRCh4Y2VwdGlvbnMpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X2xpc3QpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX09QVChjcHBfbmFtZSk7CisgIFRIUklGVF9BU1NJR05fSUQoZWxlbV90eXBlKTsKK30KK1RIUklGVF9DT05WRVJTSU9OKHRfc2V0KSB7CisgIFRIUklGVF9BU1NJR05fTUVUQURBVEEoKTsKKyAgVEhSSUZUX0FTU0lHTl9PUFQoY3BwX25hbWUpOworICBUSFJJRlRfQVNTSUdOX0lEKGVsZW1fdHlwZSk7Cit9CitUSFJJRlRfQ09OVkVSU0lPTih0X21hcCkgeworICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CisgIFRIUklGVF9BU1NJR05fT1BUKGNwcF9uYW1lKTsKKyAgVEhSSUZUX0FTU0lHTl9JRChrZXlfdHlwZSk7CisgIFRIUklGVF9BU1NJR05fSUQodmFsX3R5cGUpOworfQorCitUSFJJRlRfQ09OVkVSU0lPTih0X3NlcnZpY2UpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X2Z1bmN0aW9uLCBnZXRfZnVuY3Rpb25zKCksIGZ1bmN0aW9ucyk7CisgIFRIUklGVF9BU1NJR05fSURfTih0X3NlcnZpY2UsIGdldF9leHRlbmRzKCksIGV4dGVuZHNfKTsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9iYXNlX3R5cGUpIHsKKyAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOworICBpZiAoZnJvbS0+aXNfYmluYXJ5KCkpIHsKKyAgICB0by52YWx1ZSA9IHBsdWdpbjo6dF9iYXNlOjpUWVBFX0JJTkFSWTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGZyb20tPmdldF9iYXNlKCkpIHsKKyNkZWZpbmUgVF9CQVNFVFlQRV9DQVNFKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV8jI25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0by52YWx1ZSA9IHBsdWdpbjo6dF9iYXNlOjpUWVBFXyMjbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhaworICAgICAgVF9CQVNFVFlQRV9DQVNFKFZPSUQpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKFNUUklORyk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoQk9PTCk7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTgpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKEkxNik7CisgICAgICBUX0JBU0VUWVBFX0NBU0UoSTMyKTsKKyAgICAgIFRfQkFTRVRZUEVfQ0FTRShJNjQpOworICAgICAgVF9CQVNFVFlQRV9DQVNFKERPVUJMRSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IHBsdWdpbjo6VGhyaWZ0UGx1Z2luRXJyb3IoIkJhc2UgdHlwZSB1bmlvbiBoYXMgbm8gdmFsdWUiKTsKKyAgICAgIGJyZWFrOworI3VuZGVmIFRfQkFTRVRZUEVfQ0FTRQorICAgIH0KKyAgfQorfQorVEhSSUZUX0NPTlZFUlNJT04odF90eXBlKSB7CisjZGVmaW5lIFRfQ09OVkVSVF9VTklPTl9OKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgaWYgKGZyb20tPmlzXyMjbmFtZSgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG8uX19pc3NldC5uYW1lIyNfdmFsID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29udmVydChyZWludGVycHJldF9jYXN0PCA6OnR5cGUqPihmcm9tKSwgdG8ubmFtZSMjX3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgVF9DT05WRVJUX1VOSU9OKG5hbWUpIFRfQ09OVkVSVF9VTklPTl9OKG5hbWUsIHRfIyNuYW1lKQorICBpZiAoZmFsc2UpIHsKKyAgfQorICBUX0NPTlZFUlRfVU5JT04oYmFzZV90eXBlKQorICBUX0NPTlZFUlRfVU5JT04odHlwZWRlZikKKyAgVF9DT05WRVJUX1VOSU9OKGVudW0pCisgIFRfQ09OVkVSVF9VTklPTihzdHJ1Y3QpCisgIFRfQ09OVkVSVF9VTklPTl9OKHhjZXB0aW9uLCB0X3N0cnVjdCkKKyAgVF9DT05WRVJUX1VOSU9OKGxpc3QpCisgIFRfQ09OVkVSVF9VTklPTihzZXQpCisgIFRfQ09OVkVSVF9VTklPTihtYXApCisgIFRfQ09OVkVSVF9VTklPTihzZXJ2aWNlKQorICBlbHNlIHsKKyAgICB0aHJvdyBwbHVnaW46OlRocmlmdFBsdWdpbkVycm9yKCJUeXBlIHVuaW9uIGhhcyBubyB2YWx1ZSIpOworICB9CisjdW5kZWYgVF9DT05WRVJUX1VOSU9OX04KKyN1bmRlZiBUX0NPTlZFUlRfVU5JT04KK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9zY29wZSkgeworI2RlZmluZSBUX1NDT1BFX0FTU0lHTihuYW1lLCB0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29zdDo6Y29weShmcm9tLT5uYW1lIyNzXyB8IGJvb3N0OjphZGFwdG9yczo6bWFwX3ZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoJnN0b3JlX3R5cGU8dHlwZT4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIodG8ubmFtZSMjcykpCisgIFRfU0NPUEVfQVNTSUdOKHR5cGUsIHRfdHlwZSk7CisgIFRfU0NPUEVfQVNTSUdOKGNvbnN0YW50LCB0X2NvbnN0KTsKKyAgVF9TQ09QRV9BU1NJR04oc2VydmljZSwgdF9zZXJ2aWNlKTsKKyN1bmRlZiBUX1NDT1BFX0FTU0lHTgorfQorCit2b2lkIGdldF9nbG9iYWxfY2FjaGUocGx1Z2luOjpUeXBlUmVnaXN0cnkmIHJlZykgeworICByZWcudHlwZXMgPSB0eXBlX2NhY2hlLmNhY2hlOworICByZWcuY29uc3RhbnRzID0gY29uc3RfY2FjaGUuY2FjaGU7CisgIHJlZy5zZXJ2aWNlcyA9IHNlcnZpY2VfY2FjaGUuY2FjaGU7Cit9CisKK3ZvaWQgY2xlYXJfZ2xvYmFsX2NhY2hlKCkgeworICB0eXBlX2NhY2hlLmNsZWFyKCk7CisgIGNvbnN0X2NhY2hlLmNsZWFyKCk7CisgIHNlcnZpY2VfY2FjaGUuY2xlYXIoKTsKKyAgcHJvZ3JhbV9jYWNoZS5jbGVhcigpIDsKK30KKworVEhSSUZUX0NPTlZFUlNJT04odF9wcm9ncmFtKSB7CisgIFRIUklGVF9BU1NJR05fQ09OVkVSVCh0X3Njb3BlLCBzY29wZSgpLCBzY29wZSk7CisgIFRIUklGVF9BU1NJR04ocGF0aCk7CisgIFRIUklGVF9BU1NJR04ob3V0X3BhdGgpOworICBUSFJJRlRfQVNTSUdOKG5hbWUpOworICBUSFJJRlRfQVNTSUdOKGluY2x1ZGVfcHJlZml4KTsKKyAgVEhSSUZUX0FTU0lHTihjcHBfaW5jbHVkZXMpOworICBUSFJJRlRfQVNTSUdOKGNfaW5jbHVkZXMpOworICBUSFJJRlRfQVNTSUdOKG5hbWVzcGFjZXMpOworICBUSFJJRlRfQVNTSUdOX04oaXNfb3V0X3BhdGhfYWJzb2x1dGUoKSwgb3V0X3BhdGhfaXNfYWJzb2x1dGUsICk7CisgIFRIUklGVF9BU1NJR05fTihnZXRfbmFtZXNwYWNlKCksIG5hbWVzcGFjZV8sICk7CisgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3R5cGUsIHR5cGVkZWYpOworICBUSFJJRlRfQVNTSUdOX0xJU1RfSUQodF90eXBlLCBlbnVtKTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfdHlwZSwgb2JqZWN0KTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfY29uc3QsIGNvbnN0KTsKKyAgVEhSSUZUX0FTU0lHTl9MSVNUX0lEKHRfc2VydmljZSwgc2VydmljZSk7CisgIFRIUklGVF9BU1NJR05fTElTVF9OKHRfcHJvZ3JhbSwgZ2V0X2luY2x1ZGVzKCksIGluY2x1ZGVzKTsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8cGx1Z2luOjp0X3Byb2dyYW1faWQ+KGZyb20pKTsKK30KKworUGx1Z2luRGVsZWdhdGVSZXN1bHQgZGVsZWdhdGVUb1BsdWdpbih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKSB7CisgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHBhcnNlZF9vcHRpb25zOworICB0X2dlbmVyYXRvcjo6cGFyc2Vfb3B0aW9ucyhvcHRpb25zLCBsYW5ndWFnZSwgcGFyc2VkX29wdGlvbnMpOworICBzdGQ6OnN0cmluZyBjbWQgPSAidGhyaWZ0LWdlbi0iOworICBpZiAobGFuZ3VhZ2UuZmluZF9maXJzdF9ub3Rfb2YoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfLTAxMjM0NTY3ODkiKQorICAgICAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgbGFuZ3VhZ2UgbmFtZSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgfQorICBjbWQuYXBwZW5kKGxhbmd1YWdlKTsKKyAgRklMRSogZmQgPSBUSFJJRlRfUE9QRU4oY21kLmNfc3RyKCkpOworICBpZiAoZmQpIHsKKyNpZmRlZiBfV0lOMzIKKyAgICBfc2V0bW9kZShmaWxlbm8oZmQpLCBfT19CSU5BUlkpOworI2VuZGlmCisgICAgc2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiB0cmFuc3BvcnQoCisgICAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0KG1ha2Vfc2hhcmVkPFRGRFRyYW5zcG9ydD4oZmlsZW5vKGZkKSkpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG8odHJhbnNwb3J0KTsKKworICAgIHBsdWdpbjo6R2VuZXJhdG9ySW5wdXQgaW5wdXQ7CisgICAgaW5wdXQuX19zZXRfcGFyc2VkX29wdGlvbnMocGFyc2VkX29wdGlvbnMpOworICAgIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworICAgIGNvbnZlcnQocHJvZ3JhbSwgaW5wdXQucHJvZ3JhbSk7CisgICAgZ2V0X2dsb2JhbF9jYWNoZShpbnB1dC50eXBlX3JlZ2lzdHJ5KTsKKyAgICB0cnkgeworICAgICAgaW5wdXQud3JpdGUoJnByb3RvKTsKKyAgICAgIHRyYW5zcG9ydC0+Zmx1c2goKTsKKyAgICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXJyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIkVycm9yIHdoaWxlIHNlbmRpbmcgZGF0YSB0byBwbHVnaW46ICIgPDwgZXJyLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICBUSFJJRlRfUENMT1NFKGZkKTsKKyAgICAgIHJldHVybiBQTFVHSU5fRkFJTFVSRTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiBiZSBwcmVwYXJlZCBmb3IgaGFuZyBvciBjcmFzaCBvZiBjaGlsZCBwcm9jZXNzCisgICAgaW50IHJldCA9IFRIUklGVF9QQ0xPU0UoZmQpOworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gUExVR0lOX1NVQ0NFRVNTOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OmNlcnIgPDwgInBsdWdpbiBwcm9jZXNzIHJldHVybmVkIG5vbiB6ZXJvIGV4aXQgY29kZTogIiA8PCByZXQgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBMVUdJTl9GQUlMVVJFOworICAgIH0KKyAgfQorICBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcmV0dXJuIFBMVUdJTl9OT1RfRk9VTkQ7Cit9Cit9CisKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjJkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUX1BMVUdJTl9QTFVHSU5fT1VUUFVUX0gKKyNkZWZpbmUgVF9QTFVHSU5fUExVR0lOX09VVFBVVF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIHRfcHJvZ3JhbTsKKworbmFtZXNwYWNlIHBsdWdpbl9vdXRwdXQgeworCitlbnVtIFBsdWdpbkRlbGVnYXRlUmVzdWx0IHsKKyAgUExVR0lOX05PVF9GT1VORCwKKyAgUExVR0lOX0ZBSUxVUkUsCisgIFBMVUdJTl9TVUNDRUVTUywKK307CisKK1BsdWdpbkRlbGVnYXRlUmVzdWx0IGRlbGVnYXRlVG9QbHVnaW4odF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9ucyk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmI1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRfUExVR0lOX1RZUEVfVVRJTF9ICisjZGVmaW5lIFRfUExVR0lOX1RZUEVfVVRJTF9ICisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcGx1Z2luIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+CitzdHJ1Y3QgVG9UeXBlIHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIFRvVHlwZTxGcm9tPjo6dHlwZSogY29udmVydF9mb3J3YXJkKGNvbnN0IEZyb20mKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIFRvPgordm9pZCBjb252ZXJ0KGNvbnN0IEZyb20mLCBUbyopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIFRvVHlwZTxGcm9tPjo6dHlwZSogY29udmVydChjb25zdCBGcm9tJiBmcm9tKTsKKworY2xhc3MgVHlwZVJlZ2lzdHJ5Owordm9pZCBzZXRfZ2xvYmFsX2NhY2hlKGNvbnN0IFR5cGVSZWdpc3RyeSYpOwordm9pZCBjbGVhcl9nbG9iYWxfY2FjaGUoKTsKK30KK30KK30KKworLy8gY29udmVyc2lvbiBmcm9tIHJhdyBjb21waWxlciB0eXBlcyB0byBwbHVnaW4gd2lyZSB0eXBlCituYW1lc3BhY2UgcGx1Z2luX291dHB1dCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KK3ZvaWQgY29udmVydChGcm9tKiBmcm9tLCBUbyYgdG8pOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4KK3R5cGVuYW1lIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46OlRvVHlwZTxGcm9tPjo6dHlwZSBjb252ZXJ0KEZyb20qIGZyb20pOworCit2b2lkIGdldF9nbG9iYWxfY2FjaGUoYXBhY2hlOjp0aHJpZnQ6OnBsdWdpbjo6VHlwZVJlZ2lzdHJ5Jik7Cit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQorCisjZGVmaW5lIFRIUklGVF9UWVBFX01BUFBJTkcoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIFRZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBhcGFjaGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB0aHJpZnQgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBwbHVnaW4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNsYXNzIFRZUEU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBUb1R5cGU8IDo6VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiBUWVBFIHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBUb1R5cGU8VFlQRT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZWRlZiA6OlRZUEUgdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1RIUklGVF9UWVBFX01BUFBJTkcodF9iYXNlX3R5cGUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29uc3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29uc3RfdmFsdWUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfY29udGFpbmVyKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2RvYykKK1RIUklGVF9UWVBFX01BUFBJTkcodF9lbnVtKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X2VudW1fdmFsdWUpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZmllbGQpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfZnVuY3Rpb24pCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfbGlzdCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9tYXApCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfcHJvZ3JhbSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zY29wZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zZXJ2aWNlKQorVEhSSUZUX1RZUEVfTUFQUElORyh0X3NldCkKK1RIUklGVF9UWVBFX01BUFBJTkcodF9zdHJ1Y3QpCitUSFJJRlRfVFlQRV9NQVBQSU5HKHRfdHlwZSkKK1RIUklGVF9UWVBFX01BUFBJTkcodF90eXBlZGVmKQorI3VuZGVmIFRIUklGVF9UWVBFX01BUFBJTkcKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3ODNiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBUaHJpZnQgc2Nhbm5lci4KKyAqCisgKiBUb2tlbml6ZXMgYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgorICovCisKKyV7CisKKy8qIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggc29tZSBvZiB0aGUgZmxhZ3MgaW4gTWFrZWZpbGUuYW0sIGJ1dCBpdCB3b3JrcworICogd2hlbiBwZW9wbGUgb3ZlcnJpZGUgQ1hYRkxBR1Mgd2l0aG91dCBiZWluZyBjYXJlZnVsLiBUaGUgcHJhZ21hcyBhcmUKKyAqIHRoZSAncmlnaHQnIHdheSB0byBkbyBpdCwgYnV0IGRvbid0IHdvcmsgb24gb2xkLWVub3VnaCBHQ0MgKGluIHBhcnRpY3VsYXIKKyAqIHRoZSBHQ0MgdGhhdCBzaGlwIG9uIE1hYyBPUyBYIDEwLjYuNSwgKmNvdW50ZXIqIHRvIHdoYXQgdGhlIEdOVSBkb2NzIHNheSkKKyAqCisgKiBXZSBzaG91bGQgcmV2ZXJ0IHRoZSBNYWtlZmlsZS5hbSBjaGFuZ2VzIG9uY2UgQXBwbGUgc2hpcHMgYSByZWFzb25hYmxlCisgKiBHQ0MuCisgKi8KKyNpZmRlZiBfX0dOVUNfXworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCisjZW5kaWYKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorCisvLyB3YXJuaW5nIEM0MTAyOiAnZmluZF9ydWxlJyA6IHVucmVmZXJlbmNlZCBsYWJlbAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDEwMiApCisKKy8vIHdhcm5pbmcgQzQyNjc6ICdhcmd1bWVudCcgOiBjb252ZXJzaW9uIGZyb20gJ3NpemVfdCcgdG8gJ2ludCcsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDI2NyApCisKKy8vIGF2b2lkIGlzYXR0eSByZWRlZmluaXRpb24KKyNkZWZpbmUgWVlfTkVWRVJfSU5URVJBQ1RJVkUgMQorCisjZGVmaW5lIFlZX05PX1VOSVNURF9IIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKworLyoqCisgKiBNdXN0IGJlIGluY2x1ZGVkIEFGVEVSIHBhcnNlL3RfcHJvZ3JhbS5oLCBidXQgSSBjYW4ndCByZW1lbWJlciB3aHkgYW55bW9yZQorICogYmVjYXVzZSBJIHdyb3RlIHRoaXMgYSB3aGlsZSBhZ28uCisgKi8KKyNpZiBkZWZpbmVkKEJJU09OX1VTRV9QQVJTRVJfSF9FWFRFTlNJT04pCisjaW5jbHVkZSAidGhyaWZ0L3RocmlmdHkuaCIKKyNlbHNlCisjaW5jbHVkZSAidGhyaWZ0L3RocmlmdHkuaGgiCisjZW5kaWYKKwordm9pZCBpbnRlZ2VyX292ZXJmbG93KGNoYXIqIHRleHQpIHsKKyAgeXllcnJvcigiVGhpcyBpbnRlZ2VyIGlzIHRvbyBiaWc6IFwiJXNcIlxuIiwgdGV4dCk7CisgIGV4aXQoMSk7Cit9CisKK3ZvaWQgdW5leHBlY3RlZF90b2tlbihjaGFyKiB0ZXh0KSB7CisgIHl5ZXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gaW4gaW5wdXQ6IFwiJXNcIlxuIiwgdGV4dCk7CisgIGV4aXQoMSk7Cit9CisKKyV9CisKKy8qKgorICogUHJvdmlkZXMgdGhlIHl5bGluZW5vIGdsb2JhbCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3V0cHV0CisgKi8KKyVvcHRpb24gbGV4LWNvbXBhdAorCisvKioKKyAqIE91ciBpbnB1dHMgYXJlIGFsbCBzaW5nbGUgZmlsZXMsIHNvIG5vIG5lZWQgZm9yIHl5d3JhcAorICovCislb3B0aW9uIG5veXl3cmFwCisKKy8qKgorICogV2UgZG9uJ3QgdXNlIGl0LCBhbmQgaXQgZmlyZXMgdXAgd2FybmluZ3MgYXQgLVdhbGwKKyAqLworJW9wdGlvbiBub3VucHV0CisKKy8qKgorICogSGVscGVyIGRlZmluaXRpb25zLCBjb21tZW50cywgY29uc3RhbnRzLCBhbmQgd2hhdG5vdAorICovCisKK2ludGNvbnN0YW50ICAgKFsrLV0/WzAtOV0rKQoraGV4Y29uc3RhbnQgICAoWystXT8iMHgiWzAtOUEtRmEtZl0rKQorZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKK2lkZW50aWZpZXIgICAgKFthLXpBLVpfXShcLlthLXpBLVpfMC05XXxbYS16QS1aXzAtOV0pKikKK3doaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCitzaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCittdWx0aWNtX2JlZ2luICgiLyoiKQorZG9jdGV4dF9iZWdpbiAoIi8qKiIpCitjb21tZW50ICAgICAgICgiLy8iW15cbl0qKQordW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQorc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKK2xpdGVyYWxfYmVnaW4gKFsnXCJdKQorCislJQorCit7d2hpdGVzcGFjZX0gICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KK3tzaWxseWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQorCit7ZG9jdGV4dF9iZWdpbn0geworICBzdGQ6OnN0cmluZyBwYXJzZWQoIi8qKiIpOworICBpbnQgc3RhdGUgPSAwOyAgLy8gMCA9IG5vcm1hbCwgMSA9ICIqIiBzZWVuLCAiKi8iIHNlZW4KKyAgd2hpbGUoc3RhdGUgPCAyKQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHBhcnNlZC5wdXNoX2JhY2soY2gpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGRvYy1jb21tZW50IGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PSAxKSA/IDIgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHBkZWJ1ZygiZG9jdGV4dCA9IFwiJXNcIlxuIixwYXJzZWQuY19zdHIoKSk7CisKKyAvKiBUaGlzIGRvZXMgbm90IHNob3cgdXAgaW4gdGhlIHBhcnNlIHRyZWUuICovCisgLyogUmF0aGVyLCB0aGUgcGFyc2VyIHdpbGwgZ3JhYiBpdCBvdXQgb2YgdGhlIGdsb2JhbC4gKi8KKyAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgY2xlYXJfZG9jdGV4dCgpOworICAgIGdfZG9jdGV4dCA9IHN0cmR1cChwYXJzZWQuY19zdHIoKSArIDMpOworICAgIGFzc2VydChzdHJsZW4oZ19kb2N0ZXh0KSA+PSAyKTsKKyAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAyXSA9ICcgJzsKKyAgICBnX2RvY3RleHRbc3RybGVuKGdfZG9jdGV4dCkgLSAxXSA9ICdcMCc7CisgICAgZ19kb2N0ZXh0ID0gY2xlYW5fdXBfZG9jdGV4dChnX2RvY3RleHQpOworICAgIGdfZG9jdGV4dF9saW5lbm8gPSB5eWxpbmVubzsKKyAgICBpZiggKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9PSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzID09IElOVkFMSUQpKXsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSA9IHN0cmR1cChnX2RvY3RleHQpOworICAgICAgZ19wcm9ncmFtX2RvY3RleHRfbGluZW5vID0gZ19kb2N0ZXh0X2xpbmVubzsKKyAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IFNUSUxMX0NBTkRJREFURTsKKyAgICAgIHBkZWJ1ZygiJXMiLCJwcm9ncmFtIGRvY3RleHQgc2V0IHRvIFNUSUxMX0NBTkRJREFURSIpOworICAgIH0KKyAgfQorfQorCit7bXVsdGljbV9iZWdpbn0gIHsgLyogcGFyc2VkLCBidXQgdGhyb3duIGF3YXkgKi8KKyAgc3RkOjpzdHJpbmcgcGFyc2VkKCIvKiIpOworICBpbnQgc3RhdGUgPSAwOyAgLy8gMCA9IG5vcm1hbCwgMSA9ICIqIiBzZWVuLCAiKi8iIHNlZW4KKyAgd2hpbGUoc3RhdGUgPCAyKQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHBhcnNlZC5wdXNoX2JhY2soY2gpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IGF0ICVkXG4iLCB5eWxpbmVubyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgc3RhdGUgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJy8nOgorICAgICAgICBzdGF0ZSA9IChzdGF0ZSA9PSAxKSA/IDIgOiAwOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHBkZWJ1ZygibXVsdGlfY29tbSA9IFwiJXNcIlxuIixwYXJzZWQuY19zdHIoKSk7Cit9CisKK3tjb21tZW50fSAgICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQore3VuaXhjb21tZW50fSAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9CisKK3tzeW1ib2x9ICAgICAgICAgICAgIHsgcmV0dXJuIHl5dGV4dFswXTsgICAgICAgICAgICAgICAgfQorIioiICAgICAgICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9CisKKyJmYWxzZSIgICAgICAgICAgICAgIHsgeXlsdmFsLmljb25zdD0wOyByZXR1cm4gdG9rX2ludF9jb25zdGFudDsgfQorInRydWUiICAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTE7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9CisKKyJuYW1lc3BhY2UiICAgICAgICAgIHsgcmV0dXJuIHRva19uYW1lc3BhY2U7ICAgICAgICAgICAgfQorImNwcF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY3BwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNwcF9pbmNsdWRlIiAgICAgICAgeyByZXR1cm4gdG9rX2NwcF9pbmNsdWRlOyAgICAgICAgICB9CisiY3BwX3R5cGUiICAgICAgICAgICB7IHJldHVybiB0b2tfY3BwX3R5cGU7ICAgICAgICAgICAgIH0KKyJqYXZhX3BhY2thZ2UiICAgICAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woImphdmFfcGFja2FnZSIsICJqYXZhIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNvY29hX3ByZWZpeCIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY29jb2FfcHJlZml4IiwgImNvY29hIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImNzaGFycF9uYW1lc3BhY2UiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiY3NoYXJwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorImRlbHBoaV9uYW1lc3BhY2UiICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgiZGVscGhpIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInBocF9uYW1lc3BhY2UiICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicGhwIik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInB5X21vZHVsZSIgICAgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicHlfbW9kdWxlIiwgInB5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInBlcmxfcGFja2FnZSIgICAgICAgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgicGVybF9wYWNrYWdlIiwgInBlcmwiKTsgLyogZG8gbm90aGluZyAqLyB9CisicnVieV9uYW1lc3BhY2UiICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJydWJ5Iik7IC8qIGRvIG5vdGhpbmcgKi8gfQorInNtYWxsdGFsa19jYXRlZ29yeSIgeyBlcnJvcl91bnN1cHBvcnRlZF9uYW1lc3BhY2VfZGVjbCgic21hbGx0YWxrX2NhdGVnb3J5IiwgInNtYWxsdGFsay5jYXRlZ29yeSIpOyAvKiBkbyBub3RoaW5nICovIH0KKyJzbWFsbHRhbGtfcHJlZml4IiAgIHsgZXJyb3JfdW5zdXBwb3J0ZWRfbmFtZXNwYWNlX2RlY2woInNtYWxsdGFsa19jYXRlZ29yeSIsICJzbWFsbHRhbGsuY2F0ZWdvcnkiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2FsbCIgICAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2FsbDsgICAgICAgICAgICAgIH0KKyJ4c2Rfb3B0aW9uYWwiICAgICAgIHsgcmV0dXJuIHRva194c2Rfb3B0aW9uYWw7ICAgICAgICAgfQorInhzZF9uaWxsYWJsZSIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9uaWxsYWJsZTsgICAgICAgICB9CisieHNkX25hbWVzcGFjZSIgICAgICB7IGVycm9yX3Vuc3VwcG9ydGVkX25hbWVzcGFjZV9kZWNsKCJ4c2QiKTsgLyogZG8gbm90aGluZyAqLyB9CisieHNkX2F0dHJzIiAgICAgICAgICB7IHJldHVybiB0b2tfeHNkX2F0dHJzOyAgICAgICAgICAgIH0KKyJpbmNsdWRlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19pbmNsdWRlOyAgICAgICAgICAgICAgfQorInZvaWQiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3ZvaWQ7ICAgICAgICAgICAgICAgICB9CisiYm9vbCIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYm9vbDsgICAgICAgICAgICAgICAgIH0KKyJieXRlIiAgICAgICAgICAgICAgIHsKKyAgZW1pdF9ieXRlX3R5cGVfd2FybmluZygpOworICByZXR1cm4gdG9rX2k4OworfQorImk4IiAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k4OyAgICAgICAgICAgICAgICAgICB9CisiaTE2IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTE2OyAgICAgICAgICAgICAgICAgIH0KKyJpMzIiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMzI7ICAgICAgICAgICAgICAgICAgfQorImk2NCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2k2NDsgICAgICAgICAgICAgICAgICB9CisiZG91YmxlIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfZG91YmxlOyAgICAgICAgICAgICAgIH0KKyJzdHJpbmciICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zdHJpbmc7ICAgICAgICAgICAgICAgfQorImJpbmFyeSIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2JpbmFyeTsgICAgICAgICAgICAgICB9Cisic2xpc3QiIHsKKyAgcHdhcm5pbmcoMCwgIlwic2xpc3RcIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2xpc3Q7Cit9Cisic2VudW0iIHsKKyAgcHdhcm5pbmcoMCwgIlwic2VudW1cIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgY29tcGlsZXIgdmVyc2lvbi4gIFRoaXMgdHlwZSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBcInN0cmluZ1wiLlxuIik7CisgIHJldHVybiB0b2tfc2VudW07Cit9CisibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KKyJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQorInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Cisib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KKyJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQorInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9CisidW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KKyJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQorImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9CisidGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KKyJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQorImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9CisiY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KKyJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQorIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9CisiYXN5bmMiIHsKKyAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7CisgIHJldHVybiB0b2tfb25ld2F5OworfQorIiYiICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3JlZmVyZW5jZTsgICAgICAgICAgICB9CisKK3tpbnRjb25zdGFudH0geworICBlcnJubyA9IDA7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCwgTlVMTCwgMTApOworICBpZiAoZXJybm8gPT0gRVJBTkdFKSB7CisgICAgaW50ZWdlcl9vdmVyZmxvdyh5eXRleHQpOworICB9CisgIHJldHVybiB0b2tfaW50X2NvbnN0YW50OworfQorCit7aGV4Y29uc3RhbnR9IHsKKyAgZXJybm8gPSAwOworICBjaGFyIHNpZ24gPSB5eXRleHRbMF07CisgIGludCBzaGlmdCA9IHNpZ24gPT0gJzAnID8gMiA6IDM7CisgIHl5bHZhbC5pY29uc3QgPSBzdHJ0b2xsKHl5dGV4dCtzaGlmdCwgTlVMTCwgMTYpOworICBpZiAoc2lnbiA9PSAnLScpIHsKKyAgICB5eWx2YWwuaWNvbnN0ID0gLXl5bHZhbC5pY29uc3Q7CisgIH0KKyAgaWYgKGVycm5vID09IEVSQU5HRSkgeworICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKKyAgfQorICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKK30KKwore2lkZW50aWZpZXJ9IHsKKyAgeXlsdmFsLmlkID0gc3RyZHVwKHl5dGV4dCk7CisgIHJldHVybiB0b2tfaWRlbnRpZmllcjsKK30KKwore2R1YmNvbnN0YW50fSB7CisgLyogRGVsaWJlcmF0ZWx5IHBsYWNlZCBhZnRlciBpZGVudGlmaWVyLCBzaW5jZSAiZTEwIiBpcyBOT1QgYSBkb3VibGUgbGl0ZXJhbCAoVEhSSUZULTM0NzcpICovCisgIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7CisgIHJldHVybiB0b2tfZHViX2NvbnN0YW50OworfQorCit7bGl0ZXJhbF9iZWdpbn0geworICBjaGFyIG1hcmsgPSB5eXRleHRbMF07CisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgZm9yKDs7KQorICB7CisgICAgaW50IGNoID0geXlpbnB1dCgpOworICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgIGNhc2UgRU9GOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOworICAgICAgICBleGl0KDEpOworICAgICAgY2FzZSAnXG4nOgorICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgY2ggPSB5eWlucHV0KCk7CisgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChjaCA9PSBtYXJrKSB7CisgICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKKyAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7CisgICAgICAgIH0KKyAgICB9CisgIH0KK30KKworCisuIHsKKyAgdW5leHBlY3RlZF90b2tlbih5eXRleHQpOworfQorCislJQorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisvKiB2aW06IGZpbGV0eXBlPWxleAorKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzRhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5CkBAIC0wLDAgKzEsMTIwMSBAQAorJWNvZGUgcmVxdWlyZXMgeworI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKK30KKyV7CisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhyaWZ0IHBhcnNlci4KKyAqCisgKiBUaGlzIHBhcnNlciBpcyB1c2VkIG9uIGEgdGhyaWZ0IGRlZmluaXRpb24gZmlsZS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NURENfTElNSVRfTUFDUk9TCisjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKKyNlbmRpZgorI2lmbmRlZiBfX1NURENfRk9STUFUX01BQ1JPUworI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSAidGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgiCisjZW5kaWYKKyNpbmNsdWRlICJ0aHJpZnQvbWFpbi5oIgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2xvYmFscy5oIgorI2luY2x1ZGUgInRocmlmdC9wYXJzZS90X3Byb2dyYW0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9zY29wZS5oIgorCisjaWZkZWYgX01TQ19WRVIKKy8vd2FybmluZyBDNDA2NTogc3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQwNjUpCisjZW5kaWYKKworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGZpZWxkIGluZGljZXMgZXRjLgorICogd2hlbiBwYXJzaW5nIHRoZSBtZW1iZXJzIG9mIGEgc3RydWN0LiBGaWVsZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkKKyAqIGFzc2lnbmVkIHN0YXJ0aW5nIGZyb20gLTEgYW5kIHdvcmtpbmcgdGhlaXIgd2F5IGRvd24uCisgKi8KK2ludCB5X2ZpZWxkX3ZhbCA9IC0xOworLyoqCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBpcyB1c2VkIGZvciBhdXRvbWF0aWMgbnVtYmVyaW5nIG9mIGVudW0gdmFsdWVzLgorICogeV9lbnVtX3ZhbCBpcyB0aGUgbGFzdCB2YWx1ZSBhc3NpZ25lZDsgdGhlIG5leHQgYXV0by1hc3NpZ25lZCB2YWx1ZSB3aWxsIGJlCisgKiB5X2VudW1fdmFsKzEsIGFuZCB0aGVuIGl0IGNvbnRpbnVlcyB3b3JraW5nIHVwd2FyZHMuICBFeHBsaWNpdGx5IHNwZWNpZmllZAorICogZW51bSB2YWx1ZXMgcmVzZXQgeV9lbnVtX3ZhbCB0byB0aGF0IHZhbHVlLgorICovCitpbnQzMl90IHlfZW51bV92YWwgPSAtMTsKK2ludCBnX2FyZ2xpc3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOworY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7CisKKyV9CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCisgKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgorICovCisldW5pb24geworICBjaGFyKiAgICAgICAgICBpZDsKKyAgaW50NjRfdCAgICAgICAgaWNvbnN0OworICBkb3VibGUgICAgICAgICBkY29uc3Q7CisgIGJvb2wgICAgICAgICAgIHRib29sOworICB0X2RvYyogICAgICAgICB0ZG9jOworICB0X3R5cGUqICAgICAgICB0dHlwZTsKKyAgdF9iYXNlX3R5cGUqICAgdGJhc2U7CisgIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOworICB0X2VudW0qICAgICAgICB0ZW51bTsKKyAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OworICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7CisgIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7CisgIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7CisgIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOworICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247CisgIHRfZmllbGQqICAgICAgIHRmaWVsZDsKKyAgY2hhciogICAgICAgICAgZHRleHQ7CisgIHRfZmllbGQ6OmVfcmVxIGVyZXE7CisgIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKKyAgdF9maWVsZF9pZCAgICAgdGZpZWxkaWQ7Cit9CisKKy8qKgorICogU3RyaW5ncyBpZGVudGlmaWVyCisgKi8KKyV0b2tlbjxpZD4gICAgIHRva19pZGVudGlmaWVyCisldG9rZW48aWQ+ICAgICB0b2tfbGl0ZXJhbAorJXRva2VuPGR0ZXh0PiAgdG9rX2RvY3RleHQKKworLyoqCisgKiBDb25zdGFudCB2YWx1ZXMKKyAqLworJXRva2VuPGljb25zdD4gdG9rX2ludF9jb25zdGFudAorJXRva2VuPGRjb25zdD4gdG9rX2R1Yl9jb25zdGFudAorCisvKioKKyAqIEhlYWRlciBrZXl3b3JkcworICovCisldG9rZW4gdG9rX2luY2x1ZGUKKyV0b2tlbiB0b2tfbmFtZXNwYWNlCisldG9rZW4gdG9rX2NwcF9pbmNsdWRlCisldG9rZW4gdG9rX2NwcF90eXBlCisldG9rZW4gdG9rX3hzZF9hbGwKKyV0b2tlbiB0b2tfeHNkX29wdGlvbmFsCisldG9rZW4gdG9rX3hzZF9uaWxsYWJsZQorJXRva2VuIHRva194c2RfYXR0cnMKKworLyoqCisgKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfdm9pZAorJXRva2VuIHRva19ib29sCisldG9rZW4gdG9rX3N0cmluZworJXRva2VuIHRva19iaW5hcnkKKyV0b2tlbiB0b2tfc2xpc3QKKyV0b2tlbiB0b2tfc2VudW0KKyV0b2tlbiB0b2tfaTgKKyV0b2tlbiB0b2tfaTE2CisldG9rZW4gdG9rX2kzMgorJXRva2VuIHRva19pNjQKKyV0b2tlbiB0b2tfZG91YmxlCisKKy8qKgorICogQ29tcGxleCB0eXBlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfbWFwCisldG9rZW4gdG9rX2xpc3QKKyV0b2tlbiB0b2tfc2V0CisKKy8qKgorICogRnVuY3Rpb24gbW9kaWZpZXJzCisgKi8KKyV0b2tlbiB0b2tfb25ld2F5CisKKy8qKgorICogVGhyaWZ0IGxhbmd1YWdlIGtleXdvcmRzCisgKi8KKyV0b2tlbiB0b2tfdHlwZWRlZgorJXRva2VuIHRva19zdHJ1Y3QKKyV0b2tlbiB0b2tfeGNlcHRpb24KKyV0b2tlbiB0b2tfdGhyb3dzCisldG9rZW4gdG9rX2V4dGVuZHMKKyV0b2tlbiB0b2tfc2VydmljZQorJXRva2VuIHRva19lbnVtCisldG9rZW4gdG9rX2NvbnN0CisldG9rZW4gdG9rX3JlcXVpcmVkCisldG9rZW4gdG9rX29wdGlvbmFsCisldG9rZW4gdG9rX3VuaW9uCisldG9rZW4gdG9rX3JlZmVyZW5jZQorCisvKioKKyAqIEdyYW1tYXIgbm9kZXMKKyAqLworCisldHlwZTx0dHlwZT4gICAgIEJhc2VUeXBlCisldHlwZTx0dHlwZT4gICAgIFNpbXBsZUJhc2VUeXBlCisldHlwZTx0dHlwZT4gICAgIENvbnRhaW5lclR5cGUKKyV0eXBlPHR0eXBlPiAgICAgU2ltcGxlQ29udGFpbmVyVHlwZQorJXR5cGU8dHR5cGU+ICAgICBNYXBUeXBlCisldHlwZTx0dHlwZT4gICAgIFNldFR5cGUKKyV0eXBlPHR0eXBlPiAgICAgTGlzdFR5cGUKKworJXR5cGU8dGRvYz4gICAgICBEZWZpbml0aW9uCisldHlwZTx0dHlwZT4gICAgIFR5cGVEZWZpbml0aW9uCisKKyV0eXBlPHR0eXBlZGVmPiAgVHlwZWRlZgorCisldHlwZTx0dHlwZT4gICAgIFR5cGVBbm5vdGF0aW9ucworJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbkxpc3QKKyV0eXBlPHRhbm5vdD4gICAgVHlwZUFubm90YXRpb24KKyV0eXBlPGlkPiAgICAgICAgVHlwZUFubm90YXRpb25WYWx1ZQorCisldHlwZTx0ZmllbGQ+ICAgIEZpZWxkCisldHlwZTx0ZmllbGRpZD4gIEZpZWxkSWRlbnRpZmllcgorJXR5cGU8ZXJlcT4gICAgICBGaWVsZFJlcXVpcmVkbmVzcworJXR5cGU8dHR5cGU+ICAgICBGaWVsZFR5cGUKKyV0eXBlPHRjb25zdHY+ICAgRmllbGRWYWx1ZQorJXR5cGU8dHN0cnVjdD4gICBGaWVsZExpc3QKKyV0eXBlPHRib29sPiAgICAgRmllbGRSZWZlcmVuY2UKKworJXR5cGU8dGVudW0+ICAgICBFbnVtCisldHlwZTx0ZW51bT4gICAgIEVudW1EZWZMaXN0CisldHlwZTx0ZW51bXY+ICAgIEVudW1EZWYKKyV0eXBlPHRlbnVtdj4gICAgRW51bVZhbHVlCisKKyV0eXBlPHR0eXBlZGVmPiAgU2VudW0KKyV0eXBlPHRiYXNlPiAgICAgU2VudW1EZWZMaXN0CisldHlwZTxpZD4gICAgICAgIFNlbnVtRGVmCisKKyV0eXBlPHRjb25zdD4gICAgQ29uc3QKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RWYWx1ZQorJXR5cGU8dGNvbnN0dj4gICBDb25zdExpc3QKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Q29udGVudHMKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXAKKyV0eXBlPHRjb25zdHY+ICAgQ29uc3RNYXBDb250ZW50cworCisldHlwZTxpY29uc3Q+ICAgIFN0cnVjdEhlYWQKKyV0eXBlPHRzdHJ1Y3Q+ICAgU3RydWN0CisldHlwZTx0c3RydWN0PiAgIFhjZXB0aW9uCisldHlwZTx0c2VydmljZT4gIFNlcnZpY2UKKworJXR5cGU8dGZ1bmN0aW9uPiBGdW5jdGlvbgorJXR5cGU8dHR5cGU+ICAgICBGdW5jdGlvblR5cGUKKyV0eXBlPHRzZXJ2aWNlPiAgRnVuY3Rpb25MaXN0CisKKyV0eXBlPHRzdHJ1Y3Q+ICAgVGhyb3dzCisldHlwZTx0c2VydmljZT4gIEV4dGVuZHMKKyV0eXBlPHRib29sPiAgICAgT25ld2F5CisldHlwZTx0Ym9vbD4gICAgIFhzZEFsbAorJXR5cGU8dGJvb2w+ICAgICBYc2RPcHRpb25hbAorJXR5cGU8dGJvb2w+ICAgICBYc2ROaWxsYWJsZQorJXR5cGU8dHN0cnVjdD4gICBYc2RBdHRyaWJ1dGVzCisldHlwZTxpZD4gICAgICAgIENwcFR5cGUKKworJXR5cGU8ZHRleHQ+ICAgICBDYXB0dXJlRG9jVGV4dAorCislJQorCisvKioKKyAqIFRocmlmdCBHcmFtbWFyIEltcGxlbWVudGF0aW9uLgorICoKKyAqIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgc291cmNlIGZpbGUgd29ya3MgaXRzIHdheSB0b3AgZG93biBmcm9tIHdoYXQgeW91CisgKiBtaWdodCBleHBlY3QgdG8gZmluZCBpbiBhIHR5cGljYWwgLnRocmlmdCBmaWxlLCBpLmUuIHR5cGUgZGVmaW5pdGlvbnMgYW5kCisgKiBuYW1lc3BhY2VzIHVwIHRvcCBmb2xsb3dlZCBieSBzZXJ2aWNlIGRlZmluaXRpb25zIHVzaW5nIHRob3NlIHR5cGVzLgorICovCisKK1Byb2dyYW06CisgIEhlYWRlckxpc3QgRGVmaW5pdGlvbkxpc3QKKyAgICB7CisgICAgICBwZGVidWcoIlByb2dyYW0gLT4gSGVhZGVycyBEZWZpbml0aW9uTGlzdCIpOworICAgICAgaWYoKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSAhPSBOVUxMKSAmJiAoZ19wcm9ncmFtX2RvY3RleHRfc3RhdHVzICE9IEFMUkVBRFlfUFJPQ0VTU0VEKSkKKyAgICAgIHsKKyAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKGdfcHJvZ3JhbV9kb2N0ZXh0X2NhbmRpZGF0ZSk7CisgICAgICAgIGdfcHJvZ3JhbV9kb2N0ZXh0X3N0YXR1cyA9IEFMUkVBRFlfUFJPQ0VTU0VEOworICAgICAgfQorICAgICAgY2xlYXJfZG9jdGV4dCgpOworICAgIH0KKworQ2FwdHVyZURvY1RleHQ6CisgICAgeworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICQkID0gZ19kb2N0ZXh0OworICAgICAgICBnX2RvY3RleHQgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfQorICAgIH0KKworLyogVE9ETyhkcmVpc3MpOiBUcnkgdG8gRGVzdHJveURvY1RleHQgaW4gYWxsIHNvcnRzIG9yIHJhbmRvbSBwbGFjZXMuICovCitEZXN0cm95RG9jVGV4dDoKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgY2xlYXJfZG9jdGV4dCgpOworICAgICAgfQorICAgIH0KKworLyogV2UgaGF2ZSB0byBEZXN0cm95RG9jVGV4dCBoZXJlLCBvdGhlcndpc2UgaXQgY2F0Y2hlcyB0aGUgZG9jdGV4dAorICAgb24gdGhlIGZpcnN0IHJlYWwgZWxlbWVudC4gKi8KK0hlYWRlckxpc3Q6CisgIEhlYWRlckxpc3QgRGVzdHJveURvY1RleHQgSGVhZGVyCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+IEhlYWRlckxpc3QgSGVhZGVyIik7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyTGlzdCAtPiAiKTsKKyAgICB9CisKK0hlYWRlcjoKKyAgSW5jbHVkZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IEluY2x1ZGUiKTsKKyAgICB9Cit8IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllciIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKKyAgICAgIH0KKyAgICAgIGlmICgkNCAhPSBOVUxMKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZV9hbm5vdGF0aW9ucygkMiwgJDQtPmFubm90YXRpb25zXyk7CisgICAgICAgIGRlbGV0ZSAkNDsKKyAgICAgIH0KKyAgICB9Cit8IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCisgICAgeworICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7CisgICAgICBkZWNsYXJlX3ZhbGlkX3Byb2dyYW1fZG9jdGV4dCgpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiKiIsICQzKTsKKyAgICAgIH0KKyAgICB9Cit8IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jcHBfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9jcHBfaW5jbHVkZSgkMik7CisgICAgICB9CisgICAgfQorCitJbmNsdWRlOgorICB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiSW5jbHVkZSAtPiB0b2tfaW5jbHVkZSB0b2tfbGl0ZXJhbCIpOworICAgICAgZGVjbGFyZV92YWxpZF9wcm9ncmFtX2RvY3RleHQoKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZygkMikpOworICAgICAgICBpZiAoIXBhdGguZW1wdHkoKSkgeworICAgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2luY2x1ZGUocGF0aCwgc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworRGVmaW5pdGlvbkxpc3Q6CisgIERlZmluaXRpb25MaXN0IENhcHR1cmVEb2NUZXh0IERlZmluaXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+IERlZmluaXRpb25MaXN0IERlZmluaXRpb24iKTsKKyAgICAgIGlmICgkMiAhPSBOVUxMICYmICQzICE9IE5VTEwpIHsKKyAgICAgICAgJDMtPnNldF9kb2MoJDIpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+ICIpOworICAgIH0KKworRGVmaW5pdGlvbjoKKyAgQ29uc3QKKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gQ29uc3QiKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF9jb25zdCgkMSk7CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgVHlwZURlZmluaXRpb24KKyAgICB7CisgICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gVHlwZURlZmluaXRpb24iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Njb3BlLT5hZGRfdHlwZSgkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgeworICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfdHlwZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOworICAgICAgICB9CisgICAgICAgIGlmICghIGdfcHJvZ3JhbS0+aXNfdW5pcXVlX3R5cGVuYW1lKCQxKSkgeworICAgICAgICAgIHl5ZXJyb3IoIlR5cGUgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZC4iLCAkMS0+Z2V0X25hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICB9CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgU2VydmljZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBTZXJ2aWNlIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19zY29wZS0+YWRkX3NlcnZpY2UoJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKKyAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3NlcnZpY2UoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKKyAgICAgICAgfQorICAgICAgICBnX3Byb2dyYW0tPmFkZF9zZXJ2aWNlKCQxKTsKKyAgICAgICAgaWYgKCEgZ19wcm9ncmFtLT5pc191bmlxdWVfdHlwZW5hbWUoJDEpKSB7CisgICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIsICQxLT5nZXRfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICQkID0gJDE7CisgICAgfQorCitUeXBlRGVmaW5pdGlvbjoKKyAgVHlwZWRlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gVHlwZWRlZiIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOworICAgICAgfQorICAgIH0KK3wgRW51bQorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gRW51bSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2VudW0oJDEpOworICAgICAgfQorICAgIH0KK3wgU2VudW0KKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFNlbnVtIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7CisgICAgICB9CisgICAgfQorfCBTdHJ1Y3QKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFN0cnVjdCIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIGdfcHJvZ3JhbS0+YWRkX3N0cnVjdCgkMSk7CisgICAgICB9CisgICAgfQorfCBYY2VwdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gWGNlcHRpb24iKTsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICBnX3Byb2dyYW0tPmFkZF94Y2VwdGlvbigkMSk7CisgICAgICB9CisgICAgfQorCitDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWw6CisgICcsJworICAgIHt9Cit8ICc7JworICAgIHt9Cit8CisgICAge30KKworVHlwZWRlZjoKKyAgdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVEZWYgLT4gdG9rX3R5cGVkZWYgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDMpOworICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOworICAgICAgJCQgPSB0ZDsKKyAgICAgIGlmICgkNCAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNC0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDQ7CisgICAgICB9CisgICAgfQorCitFbnVtOgorICB0b2tfZW51bSB0b2tfaWRlbnRpZmllciAneycgRW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bSAtPiB0b2tfZW51bSB0b2tfaWRlbnRpZmllciB7IEVudW1EZWZMaXN0IH0iKTsKKyAgICAgICQkID0gJDQ7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisKKyAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKKyAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOworICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOworICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOworICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCitFbnVtRGVmTGlzdDoKKyAgRW51bURlZkxpc3QgRW51bURlZgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hcHBlbmQoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOworICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7CisgICAgICB5X2VudW1fdmFsID0gLTE7CisgICAgfQorCitFbnVtRGVmOgorICBDYXB0dXJlRG9jVGV4dCBFbnVtVmFsdWUgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bURlZiAtPiBFbnVtVmFsdWUiKTsKKyAgICAgICQkID0gJDI7CisgICAgICBpZiAoJDEgIT0gTlVMTCkgeworICAgICAgICAkJC0+c2V0X2RvYygkMSk7CisgICAgICB9CisJICBpZiAoJDMgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDMtPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQzOworICAgICAgfQorICAgIH0KKworRW51bVZhbHVlOgorICB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2ludF9jb25zdGFudCIpOworICAgICAgaWYgKCQzIDwgSU5UMzJfTUlOIHx8ICQzID4gSU5UMzJfTUFYKSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgdXNlZCB0byBiZSBqdXN0IGEgd2FybmluZy4gIEhvd2V2ZXIsIHNpbmNlIHRocmlmdCBhbHdheXMKKyAgICAgICAgLy8gdHJlYXRzIGVudW1zIGFzIGkzMiB2YWx1ZXMsIEknbSBjaGFuZ2luZyBpdCB0byBhIGZhdGFsIGVycm9yLgorICAgICAgICAvLyBJIGRvdWJ0IHRoaXMgd2lsbCBhZmZlY3QgbWFueSBwZW9wbGUsIGJ1dCB1c2VycyB3aG8gcnVuIGludG8gdGhpcworICAgICAgICAvLyB3aWxsIGhhdmUgdG8gdXBkYXRlIHRoZWlyIHRocmlmdCBmaWxlcyB0byBtYW51YWxseSBzcGVjaWZ5IHRoZQorICAgICAgICAvLyB0cnVuY2F0ZWQgaTMyIHZhbHVlIHRoYXQgdGhyaWZ0IGhhcyBhbHdheXMgYmVlbiB1c2luZyBhbnl3YXkuCisgICAgICAgIGZhaWx1cmUoIjY0LWJpdCB2YWx1ZSBzdXBwbGllZCBmb3IgZW51bSAlcyB3aWxsIGJlIHRydW5jYXRlZC4iLCAkMSk7CisgICAgICB9CisgICAgICB5X2VudW1fdmFsID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oJDMpOworICAgICAgJCQgPSBuZXcgdF9lbnVtX3ZhbHVlKCQxLCB5X2VudW1fdmFsKTsKKyAgICB9CisgfAorICB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRW51bVZhbHVlIC0+IHRva19pZGVudGlmaWVyIik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDEpOworICAgICAgaWYgKHlfZW51bV92YWwgPT0gSU5UMzJfTUFYKSB7CisgICAgICAgIGZhaWx1cmUoImVudW0gdmFsdWUgb3ZlcmZsb3cgYXQgZW51bSAlcyIsICQxKTsKKyAgICAgIH0KKyAgICAgICsreV9lbnVtX3ZhbDsKKyAgICAgICQkID0gbmV3IHRfZW51bV92YWx1ZSgkMSwgeV9lbnVtX3ZhbCk7CisgICAgfQorCitTZW51bToKKyAgdG9rX3NlbnVtIHRva19pZGVudGlmaWVyICd7JyBTZW51bURlZkxpc3QgJ30nIFR5cGVBbm5vdGF0aW9ucworICAgIHsKKyAgICAgIHBkZWJ1ZygiU2VudW0gLT4gdG9rX3NlbnVtIHRva19pZGVudGlmaWVyIHsgU2VudW1EZWZMaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkNCwgJDIpOworICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNjsKKyAgICAgIH0KKyAgICB9CisKK1NlbnVtRGVmTGlzdDoKKyAgU2VudW1EZWZMaXN0IFNlbnVtRGVmCisgICAgeworICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gU2VudW1EZWZMaXN0IFNlbnVtRGVmIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9zdHJpbmdfZW51bV92YWwoJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAgICAgJCQtPnNldF9zdHJpbmdfZW51bSh0cnVlKTsKKyAgICB9CisKK1NlbnVtRGVmOgorICB0b2tfbGl0ZXJhbCBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIlNlbnVtRGVmIC0+IHRva19saXRlcmFsIik7CisgICAgICAkJCA9ICQxOworICAgIH0KKworQ29uc3Q6CisgIHRva19jb25zdCBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgJz0nIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdCAtPiB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyID0gQ29uc3RWYWx1ZSIpOworICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMyk7CisgICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDUsICQyKTsKKyAgICAgICAgJCQgPSBuZXcgdF9jb25zdCgkMiwgJDMsICQ1KTsKKyAgICAgICAgdmFsaWRhdGVfY29uc3RfdHlwZSgkJCk7CisKKyAgICAgICAgZ19zY29wZS0+YWRkX2NvbnN0YW50KCQzLCAkJCk7CisgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7CisgICAgICAgICAgZ19wYXJlbnRfc2NvcGUtPmFkZF9jb25zdGFudChnX3BhcmVudF9wcmVmaXggKyAkMywgJCQpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAkJCA9IE5VTEw7CisgICAgICB9CisgICAgfQorCitDb25zdFZhbHVlOgorICB0b2tfaW50X2NvbnN0YW50CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdFZhbHVlID0+IHRva19pbnRfY29uc3RhbnQiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfaW50ZWdlcigkMSk7CisgICAgICBpZiAoIWdfYWxsb3dfNjRiaXRfY29uc3RzICYmICgkMSA8IElOVDMyX01JTiB8fCAkMSA+IElOVDMyX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIjY0LWJpdCBjb25zdGFudCBcIiUiIFBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKKyAgICAgIH0KKyAgICB9Cit8IHRva19kdWJfY29uc3RhbnQKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9kb3VibGUoJDEpOworICAgIH0KK3wgdG9rX2xpdGVyYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOworICAgIH0KK3wgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7CisgICAgfQorfCBDb25zdExpc3QKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgQ29uc3RNYXAKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitDb25zdExpc3Q6CisgICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorCitDb25zdExpc3RDb250ZW50czoKKyAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFkZF9saXN0KCQyKTsKKyAgICB9Cit8CisgICAgeworICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9saXN0KCk7CisgICAgfQorCitDb25zdE1hcDoKKyAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCisgICAgeworICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOworICAgICAgJCQgPSAkMjsKKyAgICB9CisKK0NvbnN0TWFwQ29udGVudHM6CisgIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOworICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgICAgJCQtPnNldF9tYXAoKTsKKyAgICB9CisKK1N0cnVjdEhlYWQ6CisgIHRva19zdHJ1Y3QKKyAgICB7CisgICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7CisgICAgfQorfCB0b2tfdW5pb24KKyAgICB7CisgICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKKyAgICB9CisKK1N0cnVjdDoKKyAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDIpOworICAgICAgJDUtPnNldF94c2RfYWxsKCQzKTsKKyAgICAgICQ1LT5zZXRfdW5pb24oJDEgPT0gc3RydWN0X2lzX3VuaW9uKTsKKyAgICAgICQkID0gJDU7CisgICAgICAkJC0+c2V0X25hbWUoJDIpOworICAgICAgaWYgKCQ3ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ3LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkNzsKKyAgICAgIH0KKyAgICB9CisKK1hzZEFsbDoKKyAgdG9rX3hzZF9hbGwKKyAgICB7CisgICAgICAkJCA9IHRydWU7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gZmFsc2U7CisgICAgfQorCitYc2RPcHRpb25hbDoKKyAgdG9rX3hzZF9vcHRpb25hbAorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1hzZE5pbGxhYmxlOgorICB0b2tfeHNkX25pbGxhYmxlCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IGZhbHNlOworICAgIH0KKworWHNkQXR0cmlidXRlczoKKyAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JworICAgIHsKKyAgICAgICQkID0gJDM7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1hjZXB0aW9uOgorICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJYY2VwdGlvbiAtPiB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOworICAgICAgdmFsaWRhdGVfc2ltcGxlX2lkZW50aWZpZXIoICQyKTsKKyAgICAgICQ0LT5zZXRfbmFtZSgkMik7CisgICAgICAkNC0+c2V0X3hjZXB0aW9uKHRydWUpOworICAgICAgJCQgPSAkNDsKKyAgICAgIGlmICgkNiAhPSBOVUxMKSB7CisgICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDY7CisgICAgICB9CisgICAgfQorCitTZXJ2aWNlOgorICB0b2tfc2VydmljZSB0b2tfaWRlbnRpZmllciBFeHRlbmRzICd7JyBGbGFnQXJncyBGdW5jdGlvbkxpc3QgVW5mbGFnQXJncyAnfScgVHlwZUFubm90YXRpb25zCisgICAgeworICAgICAgcGRlYnVnKCJTZXJ2aWNlIC0+IHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIHsgRnVuY3Rpb25MaXN0IH0iKTsKKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCAkMik7CisgICAgICAkJCA9ICQ2OworICAgICAgJCQtPnNldF9uYW1lKCQyKTsKKyAgICAgICQkLT5zZXRfZXh0ZW5kcygkMyk7CisgICAgICBpZiAoJDkgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDktPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQ5OworICAgICAgfQorICAgIH0KKworRmxhZ0FyZ3M6CisgICAgeworICAgICAgIGdfYXJnbGlzdCA9IDE7CisgICAgfQorCitVbmZsYWdBcmdzOgorICAgIHsKKyAgICAgICBnX2FyZ2xpc3QgPSAwOworICAgIH0KKworRXh0ZW5kczoKKyAgdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIKKyAgICB7CisgICAgICBwZGVidWcoIkV4dGVuZHMgLT4gdG9rX2V4dGVuZHMgdG9rX2lkZW50aWZpZXIiKTsKKyAgICAgICQkID0gTlVMTDsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgeworICAgICAgICAkJCA9IGdfc2NvcGUtPmdldF9zZXJ2aWNlKCQyKTsKKyAgICAgICAgaWYgKCQkID09IE5VTEwpIHsKKyAgICAgICAgICB5eWVycm9yKCJTZXJ2aWNlIFwiJXNcIiBoYXMgbm90IGJlZW4gZGVmaW5lZC4iLCAkMik7CisgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitGdW5jdGlvbkxpc3Q6CisgIEZ1bmN0aW9uTGlzdCBGdW5jdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25MaXN0IC0+IEZ1bmN0aW9uTGlzdCBGdW5jdGlvbiIpOworICAgICAgJCQgPSAkMTsKKyAgICAgICQxLT5hZGRfZnVuY3Rpb24oJDIpOworICAgIH0KK3wKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiAiKTsKKyAgICAgICQkID0gbmV3IHRfc2VydmljZShnX3Byb2dyYW0pOworICAgIH0KKworRnVuY3Rpb246CisgIENhcHR1cmVEb2NUZXh0IE9uZXdheSBGdW5jdGlvblR5cGUgdG9rX2lkZW50aWZpZXIgJygnIEZpZWxkTGlzdCAnKScgVGhyb3dzIFR5cGVBbm5vdGF0aW9ucyBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKKyAgICB7CisgICAgICB2YWxpZGF0ZV9zaW1wbGVfaWRlbnRpZmllciggJDQpOworICAgICAgJDYtPnNldF9uYW1lKHN0ZDo6c3RyaW5nKCQ0KSArICJfYXJncyIpOworICAgICAgJCQgPSBuZXcgdF9mdW5jdGlvbigkMywgJDQsICQ2LCAkOCwgJDIpOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkOTsKKyAgICAgIH0KKyAgICB9CisKK09uZXdheToKKyAgdG9rX29uZXdheQorICAgIHsKKyAgICAgICQkID0gdHJ1ZTsKKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBmYWxzZTsKKyAgICB9CisKK1Rocm93czoKKyAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJworICAgIHsKKyAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOworICAgICAgJCQgPSAkMzsKKyAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgeworICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitGaWVsZExpc3Q6CisgIEZpZWxkTGlzdCBGaWVsZAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7CisgICAgICAkJCA9ICQxOworICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7CisgICAgICAgIHl5ZXJyb3IoIlwiJWQ6ICVzXCIgLSBmaWVsZCBpZGVudGlmaWVyL25hbWUgaGFzIGFscmVhZHkgYmVlbiB1c2VkIiwgJDItPmdldF9rZXkoKSwgJDItPmdldF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgICB9CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+ICIpOworICAgICAgeV9maWVsZF92YWwgPSAtMTsKKyAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7CisgICAgfQorCitGaWVsZDoKKyAgQ2FwdHVyZURvY1RleHQgRmllbGRJZGVudGlmaWVyIEZpZWxkUmVxdWlyZWRuZXNzIEZpZWxkVHlwZSBGaWVsZFJlZmVyZW5jZSB0b2tfaWRlbnRpZmllciBGaWVsZFZhbHVlIFhzZE9wdGlvbmFsIFhzZE5pbGxhYmxlIFhzZEF0dHJpYnV0ZXMgVHlwZUFubm90YXRpb25zIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygidG9rX2ludF9jb25zdGFudCA6IEZpZWxkIC0+IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOworICAgICAgaWYgKCQyLmF1dG9fYXNzaWduZWQpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIk5vIGZpZWxkIGtleSBzcGVjaWZpZWQgZm9yICVzLCByZXN1bHRpbmcgcHJvdG9jb2wgbWF5IGhhdmUgY29uZmxpY3RzIG9yIG5vdCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSFcbiIsICQ2KTsKKyAgICAgICAgaWYgKGdfc3RyaWN0ID49IDE5MikgeworICAgICAgICAgIHl5ZXJyb3IoIkltcGxpY2l0IGZpZWxkIGtleXMgYXJlIGRlcHJlY2F0ZWQgYW5kIG5vdCBhbGxvd2VkIHdpdGggLXN0cmljdCIpOworICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhbGlkYXRlX3NpbXBsZV9pZGVudGlmaWVyKCQ2KTsKKyAgICAgICQkID0gbmV3IHRfZmllbGQoJDQsICQ2LCAkMi52YWx1ZSk7CisgICAgICAkJC0+c2V0X3JlZmVyZW5jZSgkNSk7CisgICAgICAkJC0+c2V0X3JlcSgkMyk7CisgICAgICBpZiAoJDcgIT0gTlVMTCkgeworICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ3LCAkNCk7CisgICAgICAgIHZhbGlkYXRlX2ZpZWxkX3ZhbHVlKCQkLCAkNyk7CisgICAgICAgICQkLT5zZXRfdmFsdWUoJDcpOworICAgICAgfQorICAgICAgJCQtPnNldF94c2Rfb3B0aW9uYWwoJDgpOworICAgICAgJCQtPnNldF94c2RfbmlsbGFibGUoJDkpOworICAgICAgaWYgKCQxICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPnNldF9kb2MoJDEpOworICAgICAgfQorICAgICAgaWYgKCQxMCAhPSBOVUxMKSB7CisgICAgICAgICQkLT5zZXRfeHNkX2F0dHJzKCQxMCk7CisgICAgICB9CisgICAgICBpZiAoJDExICE9IE5VTEwpIHsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQxMS0+YW5ub3RhdGlvbnNfOworICAgICAgICBkZWxldGUgJDExOworICAgICAgfQorICAgIH0KKworRmllbGRJZGVudGlmaWVyOgorICB0b2tfaW50X2NvbnN0YW50ICc6JworICAgIHsKKyAgICAgIGlmICgkMSA8PSAwKSB7CisgICAgICAgIGlmIChnX2FsbG93X25lZ19maWVsZF9rZXlzKSB7CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGV4aXN0cyB0byBhbGxvdyB1c2VycyB0byBhZGQgZXhwbGljaXRseQorICAgICAgICAgICAqIHNwZWNpZmllZCBrZXkgdmFsdWVzIHRvIG9sZCAudGhyaWZ0IGZpbGVzIHdpdGhvdXQgYnJlYWtpbmcKKyAgICAgICAgICAgKiBwcm90b2NvbCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAqLworICAgICAgICAgIGlmICgkMSAhPSB5X2ZpZWxkX3ZhbCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIHdhcm4gaWYgdGhlIHVzZXItc3BlY2lmaWVkIG5lZ2F0aXZlIHZhbHVlIGlzbid0IHdoYXQKKyAgICAgICAgICAgICAqIHRocmlmdCB3b3VsZCBoYXZlIGF1dG8tYXNzaWduZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSBmaWVsZCBrZXkgKCUiIFBSSWk2NCIpIGRpZmZlcnMgZnJvbSB3aGF0IHdvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICJhdXRvLWFzc2lnbmVkIGJ5IHRocmlmdCAoJWQpLlxuIiwgJDEsIHlfZmllbGRfdmFsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyoKKyAgICAgICAgICAgKiBMZWF2ZSAkMSBhcy1pcywgYW5kIHVwZGF0ZSB5X2ZpZWxkX3ZhbCB0byBiZSBvbmUgbGVzcyB0aGFuICQxLgorICAgICAgICAgICAqIFRoZSBGaWVsZExpc3QgcGFyc2luZyB3aWxsIGNhdGNoIGFueSBkdXBsaWNhdGUga2V5IHZhbHVlcy4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICB5X2ZpZWxkX3ZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxIC0gMSk7CisgICAgICAgICAgJCQudmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMl90PigkMSk7CisgICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHB3YXJuaW5nKDEsICJOb25wb3NpdGl2ZSB2YWx1ZSAoJWQpIG5vdCBhbGxvd2VkIGFzIGEgZmllbGQga2V5LlxuIiwKKyAgICAgICAgICAgICAgICAgICAkMSk7CisgICAgICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOworICAgICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAkJC52YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KCQxKTsKKyAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IGZhbHNlOworICAgICAgfQorICAgICAgaWYoIChTSFJUX01JTiA+ICQkLnZhbHVlKSB8fCAoJCQudmFsdWUgPiBTSFJUX01BWCkpIHsKKyAgICAgICAgcHdhcm5pbmcoMSwgIkZpZWxkIGtleSAoJWQpIGV4Y2VlZHMgYWxsb3dlZCByYW5nZSAoJWQuLiVkKS5cbiIsCisgICAgICAgICAgICAgICAgICQkLnZhbHVlLCBTSFJUX01JTiwgU0hSVF9NQVgpOworICAgICAgfQorICAgIH0KK3wKKyAgICB7CisgICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07CisgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gdHJ1ZTsKKyAgICAgIGlmKCAoU0hSVF9NSU4gPiAkJC52YWx1ZSkgfHwgKCQkLnZhbHVlID4gU0hSVF9NQVgpKSB7CisgICAgICAgIHB3YXJuaW5nKDEsICJGaWVsZCBrZXkgKCVkKSBleGNlZWRzIGFsbG93ZWQgcmFuZ2UgKCVkLi4lZCkuXG4iLAorICAgICAgICAgICAgICAgICAkJC52YWx1ZSwgU0hSVF9NSU4sIFNIUlRfTUFYKTsKKyAgICAgIH0KKyAgICB9CisKK0ZpZWxkUmVmZXJlbmNlOgorICB0b2tfcmVmZXJlbmNlCisgICAgeworICAgICAgJCQgPSB0cnVlOworICAgIH0KK3wKKyAgIHsKKyAgICAgJCQgPSBmYWxzZTsKKyAgIH0KKworRmllbGRSZXF1aXJlZG5lc3M6CisgIHRva19yZXF1aXJlZAorICAgIHsKKyAgICAgICQkID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICB9Cit8IHRva19vcHRpb25hbAorICAgIHsKKyAgICAgIGlmIChnX2FyZ2xpc3QpIHsKKyAgICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7CisgICAgICAgICAgcHdhcm5pbmcoMSwgIm9wdGlvbmFsIGtleXdvcmQgaXMgaWdub3JlZCBpbiBhcmd1bWVudCBsaXN0cy5cbiIpOworICAgICAgICB9CisgICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOworICAgIH0KKworRmllbGRWYWx1ZToKKyAgJz0nIENvbnN0VmFsdWUKKyAgICB7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKKyAgICAgICAgJCQgPSAkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gTlVMTDsKKyAgICAgIH0KKyAgICB9Cit8CisgICAgeworICAgICAgJCQgPSBOVUxMOworICAgIH0KKworRnVuY3Rpb25UeXBlOgorICBGaWVsZFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIkZ1bmN0aW9uVHlwZSAtPiBGaWVsZFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCB0b2tfdm9pZAorICAgIHsKKyAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IHRva192b2lkIik7CisgICAgICAkJCA9IGdfdHlwZV92b2lkOworICAgIH0KKworRmllbGRUeXBlOgorICB0b2tfaWRlbnRpZmllcgorICAgIHsKKyAgICAgIHBkZWJ1ZygiRmllbGRUeXBlIC0+IHRva19pZGVudGlmaWVyIik7CisgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IElOQ0xVREVTKSB7CisgICAgICAgIC8vIElnbm9yZSBpZGVudGlmaWVycyBpbiBpbmNsdWRlIG1vZGUKKyAgICAgICAgJCQgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTG9va3VwIHRoZSBpZGVudGlmaWVyIGluIHRoZSBjdXJyZW50IHNjb3BlCisgICAgICAgICQkID0gZ19zY29wZS0+Z2V0X3R5cGUoJDEpOworICAgICAgICBpZiAoJCQgPT0gTlVMTCkgeworICAgICAgICAgIC8qCisgICAgICAgICAgICogRWl0aGVyIHRoaXMgdHlwZSBpc24ndCB5ZXQgZGVjbGFyZWQsIG9yIGl0J3MgbmV2ZXIKKyAgICAgICAgICAgICBkZWNsYXJlZC4gIEVpdGhlciB3YXkgYWxsb3cgaXQgYW5kIHdlJ2xsIGZpZ3VyZSBpdCBvdXQKKyAgICAgICAgICAgICBkdXJpbmcgZ2VuZXJhdGlvbi4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAkJCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9Cit8IEJhc2VUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQmFzZVR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorfCBDb250YWluZXJUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQ29udGFpbmVyVHlwZSIpOworICAgICAgJCQgPSAkMTsKKyAgICB9CisKK0Jhc2VUeXBlOiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoKnN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4oJDEpKTsKKyAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187CisgICAgICAgIGRlbGV0ZSAkMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICQkID0gJDE7CisgICAgICB9CisgICAgfQorCitTaW1wbGVCYXNlVHlwZToKKyAgdG9rX3N0cmluZworICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3N0cmluZyIpOworICAgICAgJCQgPSBnX3R5cGVfc3RyaW5nOworICAgIH0KK3wgdG9rX2JpbmFyeQorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2JpbmFyeSIpOworICAgICAgJCQgPSBnX3R5cGVfYmluYXJ5OworICAgIH0KK3wgdG9rX3NsaXN0CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc2xpc3QiKTsKKyAgICAgICQkID0gZ190eXBlX3NsaXN0OworICAgIH0KK3wgdG9rX2Jvb2wKKyAgICB7CisgICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ib29sIik7CisgICAgICAkJCA9IGdfdHlwZV9ib29sOworICAgIH0KK3wgdG9rX2k4CisgICAgeworICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfaTgiKTsKKyAgICAgICQkID0gZ190eXBlX2k4OworICAgIH0KK3wgdG9rX2kxNgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kxNiIpOworICAgICAgJCQgPSBnX3R5cGVfaTE2OworICAgIH0KK3wgdG9rX2kzMgorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kzMiIpOworICAgICAgJCQgPSBnX3R5cGVfaTMyOworICAgIH0KK3wgdG9rX2k2NAorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k2NCIpOworICAgICAgJCQgPSBnX3R5cGVfaTY0OworICAgIH0KK3wgdG9rX2RvdWJsZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2RvdWJsZSIpOworICAgICAgJCQgPSBnX3R5cGVfZG91YmxlOworICAgIH0KKworQ29udGFpbmVyVHlwZTogU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMKKyAgICB7CisgICAgICBwZGVidWcoIkNvbnRhaW5lclR5cGUgLT4gU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICQkID0gJDE7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKKyAgICAgICAgZGVsZXRlICQyOworICAgICAgfQorICAgIH0KKworU2ltcGxlQ29udGFpbmVyVHlwZToKKyAgTWFwVHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBNYXBUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgU2V0VHlwZQorICAgIHsKKyAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBTZXRUeXBlIik7CisgICAgICAkJCA9ICQxOworICAgIH0KK3wgTGlzdFR5cGUKKyAgICB7CisgICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTGlzdFR5cGUiKTsKKyAgICAgICQkID0gJDE7CisgICAgfQorCitNYXBUeXBlOgorICB0b2tfbWFwIENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JworICAgIHsKKyAgICAgIHBkZWJ1ZygiTWFwVHlwZSAtPiB0b2tfbWFwIDxGaWVsZFR5cGUsIEZpZWxkVHlwZT4iKTsKKyAgICAgICQkID0gbmV3IHRfbWFwKCQ0LCAkNik7CisgICAgICBpZiAoJDIgIT0gTlVMTCkgeworICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOworICAgICAgfQorICAgIH0KKworU2V0VHlwZToKKyAgdG9rX3NldCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJz4nCisgICAgeworICAgICAgcGRlYnVnKCJTZXRUeXBlIC0+IHRva19zZXQ8RmllbGRUeXBlPiIpOworICAgICAgJCQgPSBuZXcgdF9zZXQoJDQpOworICAgICAgaWYgKCQyICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKKyAgICAgIH0KKyAgICB9CisKK0xpc3RUeXBlOgorICB0b2tfbGlzdCAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlCisgICAgeworICAgICAgcGRlYnVnKCJMaXN0VHlwZSAtPiB0b2tfbGlzdDxGaWVsZFR5cGU+Iik7CisgICAgICBjaGVja19mb3JfbGlzdF9vZl9ieXRlcygkMyk7CisgICAgICAkJCA9IG5ldyB0X2xpc3QoJDMpOworICAgICAgaWYgKCQ1ICE9IE5VTEwpIHsKKyAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDUpKTsKKyAgICAgIH0KKyAgICB9CisKK0NwcFR5cGU6CisgIHRva19jcHBfdHlwZSB0b2tfbGl0ZXJhbAorICAgIHsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgICQkID0gTlVMTDsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uczoKKyAgJygnIFR5cGVBbm5vdGF0aW9uTGlzdCAnKScKKyAgICB7CisgICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9ucyAtPiAoIFR5cGVBbm5vdGF0aW9uTGlzdCApIik7CisgICAgICAkJCA9ICQyOworICAgIH0KK3wKKyAgICB7CisgICAgICAkJCA9IE5VTEw7CisgICAgfQorCitUeXBlQW5ub3RhdGlvbkxpc3Q6CisgIFR5cGVBbm5vdGF0aW9uTGlzdCBUeXBlQW5ub3RhdGlvbgorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25MaXN0IC0+IFR5cGVBbm5vdGF0aW9uTGlzdCAsIFR5cGVBbm5vdGF0aW9uIik7CisgICAgICAkJCA9ICQxOworICAgICAgJCQtPmFubm90YXRpb25zX1skMi0+a2V5XSA9ICQyLT52YWw7CisgICAgICBkZWxldGUgJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIC8qIEp1c3QgdXNlIGEgZHVtbXkgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGFubm90YXRpb25zLiAqLworICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKKyAgICB9CisKK1R5cGVBbm5vdGF0aW9uOgorICB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvblZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb24gLT4gVHlwZUFubm90YXRpb25WYWx1ZSIpOworICAgICAgJCQgPSBuZXcgdF9hbm5vdGF0aW9uOworICAgICAgJCQtPmtleSA9ICQxOworICAgICAgJCQtPnZhbCA9ICQyOworICAgIH0KKworVHlwZUFubm90YXRpb25WYWx1ZToKKyAgJz0nIHRva19saXRlcmFsCisgICAgeworICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvblZhbHVlIC0+ID0gdG9rX2xpdGVyYWwiKTsKKyAgICAgICQkID0gJDI7CisgICAgfQorfAorICAgIHsKKyAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25WYWx1ZSAtPiIpOworICAgICAgJCQgPSBzdHJkdXAoIjEiKTsKKyAgICB9CisKKyUlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC92ZXJzaW9uLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmMDc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbgpAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9WRVJTSU9OX0hfCisjZGVmaW5lIF9USFJJRlRfVkVSU0lPTl9IXyAxCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPiAxMjAwKQorI3ByYWdtYSBvbmNlCisjZW5kaWYgLy8gX01TQ19WRVIKKworI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCisKKyNlbmRpZiAvLyBfVEhSSUZUX1ZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMjY5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKKyNwcmFnbWEgb25jZQorI2VuZGlmIC8vIF9NU0NfVkVSCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgorI2VuZGlmCisKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorCisjZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKKworI2lmbmRlZiBQUkl1NjQKKyNkZWZpbmUgUFJJdTY0ICJJNjR1IgorI2VuZGlmCisKKyNpZm5kZWYgUFJJaTY0CisjZGVmaW5lIFBSSWk2NCAiSTY0aSIKKyNlbmRpZgorLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KQorLy8gc3F1ZWxjaCBib29sIGNvbnZlcnNpb24gcGVyZm9ybWFuY2Ugd2FybmluZworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0ODAwKQorCisvLyBNU1ZDMTAgKDIwMTApIG9yIGxhdGVyIGhhcyBzdGRpbnQuaAorI2lmIF9NU0NfVkVSID49IDE2MDAKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKworLy8gTXVzdCBiZSB1c2luZyBWUzIwMTAgb3IgbGF0ZXIsIG9yIGJvb3N0LCBzbyB0aGF0IEM5OSB0eXBlcyBhcmUgZGVmaW5lZCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbHNlCisjaW5jbHVkZSA8Ym9vc3QvY3N0ZGludC5ocHA+CisKK3R5cGVkZWYgYm9vc3Q6OmludDY0X3QgaW50NjRfdDsKK3R5cGVkZWYgYm9vc3Q6OnVpbnQ2NF90IHVpbnQ2NF90OwordHlwZWRlZiBib29zdDo6aW50MzJfdCBpbnQzMl90OwordHlwZWRlZiBib29zdDo6dWludDMyX3QgdWludDMyX3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQxNl90IGludDE2X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MTZfdCB1aW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDhfdCBpbnQ4X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50OF90IHVpbnQ4X3Q7CisjZW5kaWYKKworI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlOTg1MC4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdGwubGwKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRocmlmdCBzY2FubmVyLgotICoKLSAqIFRva2VuaXplcyBhIHRocmlmdCBkZWZpbml0aW9uIGZpbGUuCi0gKi8KLQotJXsKLQotLyogVGhpcyBpcyByZWR1bmRhbnQgd2l0aCBzb21lIG9mIHRoZSBmbGFncyBpbiBNYWtlZmlsZS5hbSwgYnV0IGl0IHdvcmtzCi0gKiB3aGVuIHBlb3BsZSBvdmVycmlkZSBDWFhGTEFHUyB3aXRob3V0IGJlaW5nIGNhcmVmdWwuIFRoZSBwcmFnbWFzIGFyZQotICogdGhlICdyaWdodCcgd2F5IHRvIGRvIGl0LCBidXQgZG9uJ3Qgd29yayBvbiBvbGQtZW5vdWdoIEdDQyAoaW4gcGFydGljdWxhcgotICogdGhlIEdDQyB0aGF0IHNoaXAgb24gTWFjIE9TIFggMTAuNi41LCAqY291bnRlciogdG8gd2hhdCB0aGUgR05VIGRvY3Mgc2F5KQotICoKLSAqIFdlIHNob3VsZCByZXZlcnQgdGhlIE1ha2VmaWxlLmFtIGNoYW5nZXMgb25jZSBBcHBsZSBzaGlwcyBhIHJlYXNvbmFibGUKLSAqIEdDQy4KLSAqLwotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1mdW5jdGlvbiIKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtbGFiZWwiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJnbG9iYWxzLmgiCi0jaW5jbHVkZSAicGFyc2UvdF9wcm9ncmFtLmgiCi0KLS8qKgotICogTXVzdCBiZSBpbmNsdWRlZCBBRlRFUiBwYXJzZS90X3Byb2dyYW0uaCwgYnV0IEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGFueW1vcmUKLSAqIGJlY2F1c2UgSSB3cm90ZSB0aGlzIGEgd2hpbGUgYWdvLgotICovCi0jaW5jbHVkZSAidGhyaWZ0eS5oIgotCi12b2lkIHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKGNoYXIqIGtleXdvcmQpIHsKLSAgeXllcnJvcigiQ2Fubm90IHVzZSByZXNlcnZlZCBsYW5ndWFnZSBrZXl3b3JkOiBcIiVzXCJcbiIsIGtleXdvcmQpOwotICBleGl0KDEpOwotfQotCi12b2lkIGludGVnZXJfb3ZlcmZsb3coY2hhciogdGV4dCkgewotICB5eWVycm9yKCJUaGlzIGludGVnZXIgaXMgdG9vIGJpZzogXCIlc1wiXG4iLCB0ZXh0KTsKLSAgZXhpdCgxKTsKLX0KLQotdm9pZCB1bmV4cGVjdGVkX3Rva2VuKGNoYXIqIHRleHQpIHsKLSAgeXllcnJvcigiVW5leHBlY3RlZCB0b2tlbiBpbiBpbnB1dDogXCIlc1wiXG4iLCB0ZXh0KTsKLSAgZXhpdCgxKTsKLX0KLQotJX0KLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgeXlsaW5lbm8gZ2xvYmFsLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvdXRwdXQKLSAqLwotJW9wdGlvbiBsZXgtY29tcGF0Ci0KLS8qKgotICogT3VyIGlucHV0cyBhcmUgYWxsIHNpbmdsZSBmaWxlcywgc28gbm8gbmVlZCBmb3IgeXl3cmFwCi0gKi8KLSVvcHRpb24gbm95eXdyYXAKLQotLyoqCi0gKiBXZSBkb24ndCB1c2UgaXQsIGFuZCBpdCBmaXJlcyB1cCB3YXJuaW5ncyBhdCAtV2FsbAotICovCi0lb3B0aW9uIG5vdW5wdXQKLQotLyoqCi0gKiBIZWxwZXIgZGVmaW5pdGlvbnMsIGNvbW1lbnRzLCBjb25zdGFudHMsIGFuZCB3aGF0bm90Ci0gKi8KLQotaW50Y29uc3RhbnQgICAoWystXT9bMC05XSspCi1oZXhjb25zdGFudCAgICgiMHgiWzAtOUEtRmEtZl0rKQotZHViY29uc3RhbnQgICAoWystXT9bMC05XSooXC5bMC05XSspPyhbZUVdWystXT9bMC05XSspPykKLWlkZW50aWZpZXIgICAgKFthLXpBLVpfXVtcLmEtekEtWl8wLTldKikKLXdoaXRlc3BhY2UgICAgKFsgXHRcclxuXSopCi1zaWxseWNvbW0gICAgICgiLyoiIioiKiIqLyIpCi1tdWx0aWNvbW0gICAgICgiLyoiW14qXSIvIiooW14qL118W14qXSIvInwiKiJbXi9dKSoiKiIqIiovIikKLWRvY3RleHQgICAgICAgKCIvKioiKFteKi9dfFteKl0iLyJ8IioiW14vXSkqIioiKiIqLyIpCi1jb21tZW50ICAgICAgICgiLy8iW15cbl0qKQotdW5peGNvbW1lbnQgICAoIiMiW15cbl0qKQotc3ltYm9sICAgICAgICAoWzo7XCxce1x9XChcKVw9PD5cW1xdXSkKLXN0X2lkZW50aWZpZXIgKFthLXpBLVotXVtcLmEtekEtWl8wLTktXSopCi1saXRlcmFsX2JlZ2luIChbJ1wiXSkKLQotJSUKLQote3doaXRlc3BhY2V9ICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17c2lsbHljb21tfSAgICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLXttdWx0aWNvbW19ICAgICAgICAgIHsgLyogZG8gbm90aGluZyAqLyAgICAgICAgICAgICAgICAgfQote2NvbW1lbnR9ICAgICAgICAgICAgeyAvKiBkbyBub3RoaW5nICovICAgICAgICAgICAgICAgICB9Ci17dW5peGNvbW1lbnR9ICAgICAgICB7IC8qIGRvIG5vdGhpbmcgKi8gICAgICAgICAgICAgICAgIH0KLQote3N5bWJvbH0gICAgICAgICAgICAgeyByZXR1cm4geXl0ZXh0WzBdOyAgICAgICAgICAgICAgICB9Ci0iKiIgICAgICAgICAgICAgICAgICB7IHJldHVybiB5eXRleHRbMF07ICAgICAgICAgICAgICAgIH0KLQotImZhbHNlIiAgICAgICAgICAgICAgeyB5eWx2YWwuaWNvbnN0PTA7IHJldHVybiB0b2tfaW50X2NvbnN0YW50OyB9Ci0idHJ1ZSIgICAgICAgICAgICAgICB7IHl5bHZhbC5pY29uc3Q9MTsgcmV0dXJuIHRva19pbnRfY29uc3RhbnQ7IH0KLQotIm5hbWVzcGFjZSIgICAgICAgICAgeyByZXR1cm4gdG9rX25hbWVzcGFjZTsgICAgICAgICAgICB9Ci0iY3BwX25hbWVzcGFjZSIgICAgICB7IHJldHVybiB0b2tfY3BwX25hbWVzcGFjZTsgICAgICAgIH0KLSJjcHBfaW5jbHVkZSIgICAgICAgIHsgcmV0dXJuIHRva19jcHBfaW5jbHVkZTsgICAgICAgICAgfQotImNwcF90eXBlIiAgICAgICAgICAgeyByZXR1cm4gdG9rX2NwcF90eXBlOyAgICAgICAgICAgICB9Ci0iamF2YV9wYWNrYWdlIiAgICAgICB7IHJldHVybiB0b2tfamF2YV9wYWNrYWdlOyAgICAgICAgIH0KLSJjb2NvYV9wcmVmaXgiICAgICAgIHsgcmV0dXJuIHRva19jb2NvYV9wcmVmaXg7ICAgICAgICAgfQotImNzaGFycF9uYW1lc3BhY2UiICAgeyByZXR1cm4gdG9rX2NzaGFycF9uYW1lc3BhY2U7ICAgICB9Ci0iZGVscGhpX25hbWVzcGFjZSIgICB7IHJldHVybiB0b2tfZGVscGhpX25hbWVzcGFjZTsgICAgIH0KLSJwaHBfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva19waHBfbmFtZXNwYWNlOyAgICAgICAgfQotInB5X21vZHVsZSIgICAgICAgICAgeyByZXR1cm4gdG9rX3B5X21vZHVsZTsgICAgICAgICAgICB9Ci0icGVybF9wYWNrYWdlIiAgICAgICB7IHJldHVybiB0b2tfcGVybF9wYWNrYWdlOyAgICAgICAgIH0KLSJydWJ5X25hbWVzcGFjZSIgICAgIHsgcmV0dXJuIHRva19ydWJ5X25hbWVzcGFjZTsgICAgICAgfQotInNtYWxsdGFsa19jYXRlZ29yeSIgeyByZXR1cm4gdG9rX3NtYWxsdGFsa19jYXRlZ29yeTsgICB9Ci0ic21hbGx0YWxrX3ByZWZpeCIgICB7IHJldHVybiB0b2tfc21hbGx0YWxrX3ByZWZpeDsgICAgIH0KLSJ4c2RfYWxsIiAgICAgICAgICAgIHsgcmV0dXJuIHRva194c2RfYWxsOyAgICAgICAgICAgICAgfQotInhzZF9vcHRpb25hbCIgICAgICAgeyByZXR1cm4gdG9rX3hzZF9vcHRpb25hbDsgICAgICAgICB9Ci0ieHNkX25pbGxhYmxlIiAgICAgICB7IHJldHVybiB0b2tfeHNkX25pbGxhYmxlOyAgICAgICAgIH0KLSJ4c2RfbmFtZXNwYWNlIiAgICAgIHsgcmV0dXJuIHRva194c2RfbmFtZXNwYWNlOyAgICAgICAgfQotInhzZF9hdHRycyIgICAgICAgICAgeyByZXR1cm4gdG9rX3hzZF9hdHRyczsgICAgICAgICAgICB9Ci0iaW5jbHVkZSIgICAgICAgICAgICB7IHJldHVybiB0b2tfaW5jbHVkZTsgICAgICAgICAgICAgIH0KLSJ2b2lkIiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva192b2lkOyAgICAgICAgICAgICAgICAgfQotImJvb2wiICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2Jvb2w7ICAgICAgICAgICAgICAgICB9Ci0iYnl0ZSIgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfYnl0ZTsgICAgICAgICAgICAgICAgIH0KLSJpMTYiICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19pMTY7ICAgICAgICAgICAgICAgICAgfQotImkzMiIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2kzMjsgICAgICAgICAgICAgICAgICB9Ci0iaTY0IiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfaTY0OyAgICAgICAgICAgICAgICAgIH0KLSJkb3VibGUiICAgICAgICAgICAgIHsgcmV0dXJuIHRva19kb3VibGU7ICAgICAgICAgICAgICAgfQotInN0cmluZyIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cmluZzsgICAgICAgICAgICAgICB9Ci0iYmluYXJ5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfYmluYXJ5OyAgICAgICAgICAgICAgIH0KLSJzbGlzdCIgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19zbGlzdDsgICAgICAgICAgICAgICAgfQotInNlbnVtIiAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NlbnVtOyAgICAgICAgICAgICAgICB9Ci0ibWFwIiAgICAgICAgICAgICAgICB7IHJldHVybiB0b2tfbWFwOyAgICAgICAgICAgICAgICAgIH0KLSJsaXN0IiAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19saXN0OyAgICAgICAgICAgICAgICAgfQotInNldCIgICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3NldDsgICAgICAgICAgICAgICAgICB9Ci0ib25ld2F5IiAgICAgICAgICAgICB7IHJldHVybiB0b2tfb25ld2F5OyAgICAgICAgICAgICAgIH0KLSJ0eXBlZGVmIiAgICAgICAgICAgIHsgcmV0dXJuIHRva190eXBlZGVmOyAgICAgICAgICAgICAgfQotInN0cnVjdCIgICAgICAgICAgICAgeyByZXR1cm4gdG9rX3N0cnVjdDsgICAgICAgICAgICAgICB9Ci0idW5pb24iICAgICAgICAgICAgICB7IHJldHVybiB0b2tfdW5pb247ICAgICAgICAgICAgICAgIH0KLSJleGNlcHRpb24iICAgICAgICAgIHsgcmV0dXJuIHRva194Y2VwdGlvbjsgICAgICAgICAgICAgfQotImV4dGVuZHMiICAgICAgICAgICAgeyByZXR1cm4gdG9rX2V4dGVuZHM7ICAgICAgICAgICAgICB9Ci0idGhyb3dzIiAgICAgICAgICAgICB7IHJldHVybiB0b2tfdGhyb3dzOyAgICAgICAgICAgICAgIH0KLSJzZXJ2aWNlIiAgICAgICAgICAgIHsgcmV0dXJuIHRva19zZXJ2aWNlOyAgICAgICAgICAgICAgfQotImVudW0iICAgICAgICAgICAgICAgeyByZXR1cm4gdG9rX2VudW07ICAgICAgICAgICAgICAgICB9Ci0iY29uc3QiICAgICAgICAgICAgICB7IHJldHVybiB0b2tfY29uc3Q7ICAgICAgICAgICAgICAgIH0KLSJyZXF1aXJlZCIgICAgICAgICAgIHsgcmV0dXJuIHRva19yZXF1aXJlZDsgICAgICAgICAgICAgfQotIm9wdGlvbmFsIiAgICAgICAgICAgeyByZXR1cm4gdG9rX29wdGlvbmFsOyAgICAgICAgICAgICB9Ci0iYXN5bmMiIHsKLSAgcHdhcm5pbmcoMCwgIlwiYXN5bmNcIiBpcyBkZXByZWNhdGVkLiAgSXQgaXMgY2FsbGVkIFwib25ld2F5XCIgbm93LlxuIik7Ci0gIHJldHVybiB0b2tfb25ld2F5OwotfQotCi0KLSJCRUdJTiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIkVORCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19DTEFTU19fIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0RJUl9fIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRklMRV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GVU5DVElPTl9fIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0xJTkVfXyIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTUVUSE9EX18iICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19OQU1FU1BBQ0VfXyIgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhYnN0cmFjdCIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFsaWFzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYW5kIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhcmdzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXNzZXJ0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJiZWdpbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJyZWFrIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2FzZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXRjaCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNsYXNzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xvbmUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjb250aW51ZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlY2xhcmUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVmIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWZhdWx0IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsZXRlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkbyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImR5bmFtaWMiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxpZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2VpZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGRlY2xhcmUiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZm9yIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3JlYWNoIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGlmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kc3dpdGNoIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmR3aGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuc3VyZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZXhjZXB0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGVjIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZpbmFsbHkiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmxvYXQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmb3IiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvcmVhY2giICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZnVuY3Rpb24iICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJnbG9iYWwiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImdvdG8iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaWYiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbXBsZW1lbnRzIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImltcG9ydCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW4iICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbmxpbmUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImluc3RhbmNlb2YiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW50ZXJmYWNlIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpcyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImxhbWJkYSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibW9kdWxlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuYXRpdmUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5ldyIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmV4dCIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuaWwiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5vdCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ib3IiICAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwYXNzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInB1YmxpYyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpbnQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcml2YXRlIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByb3RlY3RlZCIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHVibGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyYWlzZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZG8iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVzY3VlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXRyeSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJlZ2lzdGVyIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmV0dXJuIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzZWxmIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInNpemVvZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3RhdGljIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzdXBlciIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN3aXRjaCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3luY2hyb25pemVkIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aGVuIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRoaXMiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhyb3ciICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0cmFuc2llbnQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyeSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5kZWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmlvbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVubGVzcyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5zaWduZWQiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnRpbCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVzZSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmFyIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2aXJ0dWFsIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZvbGF0aWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aGlsZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndpdGgiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieG9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCi17aW50Y29uc3RhbnR9IHsKLSAgZXJybm8gPSAwOwotICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2hleGNvbnN0YW50fSB7Ci0gIGVycm5vID0gMDsKLSAgeXlsdmFsLmljb25zdCA9IHN0cnRvbGwoeXl0ZXh0KzIsIE5VTEwsIDE2KTsKLSAgaWYgKGVycm5vID09IEVSQU5HRSkgewotICAgIGludGVnZXJfb3ZlcmZsb3coeXl0ZXh0KTsKLSAgfQotICByZXR1cm4gdG9rX2ludF9jb25zdGFudDsKLX0KLQote2R1YmNvbnN0YW50fSB7Ci0gIHl5bHZhbC5kY29uc3QgPSBhdG9mKHl5dGV4dCk7Ci0gIHJldHVybiB0b2tfZHViX2NvbnN0YW50OwotfQotCi17aWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19pZGVudGlmaWVyOwotfQotCi17c3RfaWRlbnRpZmllcn0gewotICB5eWx2YWwuaWQgPSBzdHJkdXAoeXl0ZXh0KTsKLSAgcmV0dXJuIHRva19zdF9pZGVudGlmaWVyOwotfQotCi17bGl0ZXJhbF9iZWdpbn0gewotICBjaGFyIG1hcmsgPSB5eXRleHRbMF07Ci0gIHN0ZDo6c3RyaW5nIHJlc3VsdDsKLSAgZm9yKDs7KQotICB7Ci0gICAgaW50IGNoID0geXlpbnB1dCgpOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgRU9GOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgZmlsZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8pOwotICAgICAgICBleGl0KDEpOwotICAgICAgY2FzZSAnXG4nOgotICAgICAgICB5eWVycm9yKCJFbmQgb2YgbGluZSB3aGlsZSByZWFkIHN0cmluZyBhdCAlZFxuIiwgeXlsaW5lbm8gLSAxKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2ggPSB5eWlucHV0KCk7Ci0gICAgICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xyJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1xuJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1x0Jyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICciJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyInKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoX2JhY2soJ1wnJyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICByZXN1bHQucHVzaF9iYWNrKCdcXCcpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHl5ZXJyb3IoIkJhZCBlc2NhcGUgY2hhcmFjdGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChjaCA9PSBtYXJrKSB7Ci0gICAgICAgICAgeXlsdmFsLmlkID0gc3RyZHVwKHJlc3VsdC5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gdG9rX2xpdGVyYWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhjaCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi17ZG9jdGV4dH0gewotIC8qIFRoaXMgZG9lcyBub3Qgc2hvdyB1cCBpbiB0aGUgcGFyc2UgdHJlZS4gKi8KLSAvKiBSYXRoZXIsIHRoZSBwYXJzZXIgd2lsbCBncmFiIGl0IG91dCBvZiB0aGUgZ2xvYmFsLiAqLwotICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgZ19kb2N0ZXh0ID0gc3RyZHVwKHl5dGV4dCArIDMpOwotICAgIGdfZG9jdGV4dFtzdHJsZW4oZ19kb2N0ZXh0KSAtIDJdID0gJ1wwJzsKLSAgICBnX2RvY3RleHQgPSBjbGVhbl91cF9kb2N0ZXh0KGdfZG9jdGV4dCk7Ci0gICAgZ19kb2N0ZXh0X2xpbmVubyA9IHl5bGluZW5vOwotICB9Ci19Ci0KLS4gewotICB1bmV4cGVjdGVkX3Rva2VuKHl5dGV4dCk7Ci19Ci0KLQotLiB7Ci0gIC8qIENhdGNoLWFsbCB0byBsZXQgdXMgY2F0Y2ggIioiIGluIHRoZSBwYXJzZXIuICovCi0gIHJldHVybiAoaW50KSB5eXRleHRbMF07Ci19Ci0KLSUlCi0KLS8qIHZpbTogZmlsZXR5cGU9bGV4Ci0qLwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnR5Lnl5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTZmZDQ2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjQgKzAsMCBAQAotJXsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBUaHJpZnQgcGFyc2VyLgotICoKLSAqIFRoaXMgcGFyc2VyIGlzIHVzZWQgb24gYSB0aHJpZnQgZGVmaW5pdGlvbiBmaWxlLgotICoKLSAqLwotCi0jZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmbmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgImdsb2JhbHMuaCIKLSNpbmNsdWRlICJwYXJzZS90X3Byb2dyYW0uaCIKLSNpbmNsdWRlICJwYXJzZS90X3Njb3BlLmgiCi0KLS8qKgotICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgdXNlZCBmb3IgYXV0b21hdGljIG51bWJlcmluZyBvZiBmaWVsZCBpbmRpY2VzIGV0Yy4KLSAqIHdoZW4gcGFyc2luZyB0aGUgbWVtYmVycyBvZiBhIHN0cnVjdC4gRmllbGQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5Ci0gKiBhc3NpZ25lZCBzdGFydGluZyBmcm9tIC0xIGFuZCB3b3JraW5nIHRoZWlyIHdheSBkb3duLgotICovCi1pbnQgeV9maWVsZF92YWwgPSAtMTsKLWludCBnX2FyZ2xpc3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc19zdHJ1Y3QgPSAwOwotY29uc3QgaW50IHN0cnVjdF9pc191bmlvbiA9IDE7Ci0KLSV9Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGhvbGQgdGhlIGRhdGEgdHlwZXMgYXNzb2NpYXRlZCB3aXRoCi0gKiB2YXJpb3VzIHBhcnNlIG5vZGVzLgotICovCi0ldW5pb24gewotICBjaGFyKiAgICAgICAgICBpZDsKLSAgaW50NjRfdCAgICAgICAgaWNvbnN0OwotICBkb3VibGUgICAgICAgICBkY29uc3Q7Ci0gIGJvb2wgICAgICAgICAgIHRib29sOwotICB0X2RvYyogICAgICAgICB0ZG9jOwotICB0X3R5cGUqICAgICAgICB0dHlwZTsKLSAgdF9iYXNlX3R5cGUqICAgdGJhc2U7Ci0gIHRfdHlwZWRlZiogICAgIHR0eXBlZGVmOwotICB0X2VudW0qICAgICAgICB0ZW51bTsKLSAgdF9lbnVtX3ZhbHVlKiAgdGVudW12OwotICB0X2NvbnN0KiAgICAgICB0Y29uc3Q7Ci0gIHRfY29uc3RfdmFsdWUqIHRjb25zdHY7Ci0gIHRfc3RydWN0KiAgICAgIHRzdHJ1Y3Q7Ci0gIHRfc2VydmljZSogICAgIHRzZXJ2aWNlOwotICB0X2Z1bmN0aW9uKiAgICB0ZnVuY3Rpb247Ci0gIHRfZmllbGQqICAgICAgIHRmaWVsZDsKLSAgY2hhciogICAgICAgICAgZHRleHQ7Ci0gIHRfZmllbGQ6OmVfcmVxIGVyZXE7Ci0gIHRfYW5ub3RhdGlvbiogIHRhbm5vdDsKLSAgdF9maWVsZF9pZCAgICAgdGZpZWxkaWQ7Ci19Ci0KLS8qKgotICogU3RyaW5ncyBpZGVudGlmaWVyCi0gKi8KLSV0b2tlbjxpZD4gICAgIHRva19pZGVudGlmaWVyCi0ldG9rZW48aWQ+ICAgICB0b2tfbGl0ZXJhbAotJXRva2VuPGR0ZXh0PiAgdG9rX2RvY3RleHQKLSV0b2tlbjxpZD4gICAgIHRva19zdF9pZGVudGlmaWVyCi0KLS8qKgotICogQ29uc3RhbnQgdmFsdWVzCi0gKi8KLSV0b2tlbjxpY29uc3Q+IHRva19pbnRfY29uc3RhbnQKLSV0b2tlbjxkY29uc3Q+IHRva19kdWJfY29uc3RhbnQKLQotLyoqCi0gKiBIZWFkZXIga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19pbmNsdWRlCi0ldG9rZW4gdG9rX25hbWVzcGFjZQotJXRva2VuIHRva19jcHBfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2NwcF9pbmNsdWRlCi0ldG9rZW4gdG9rX2NwcF90eXBlCi0ldG9rZW4gdG9rX3BocF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfcHlfbW9kdWxlCi0ldG9rZW4gdG9rX3BlcmxfcGFja2FnZQotJXRva2VuIHRva19qYXZhX3BhY2thZ2UKLSV0b2tlbiB0b2tfeHNkX2FsbAotJXRva2VuIHRva194c2Rfb3B0aW9uYWwKLSV0b2tlbiB0b2tfeHNkX25pbGxhYmxlCi0ldG9rZW4gdG9rX3hzZF9uYW1lc3BhY2UKLSV0b2tlbiB0b2tfeHNkX2F0dHJzCi0ldG9rZW4gdG9rX3J1YnlfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX3NtYWxsdGFsa19jYXRlZ29yeQotJXRva2VuIHRva19zbWFsbHRhbGtfcHJlZml4Ci0ldG9rZW4gdG9rX2NvY29hX3ByZWZpeAotJXRva2VuIHRva19jc2hhcnBfbmFtZXNwYWNlCi0ldG9rZW4gdG9rX2RlbHBoaV9uYW1lc3BhY2UKLQotLyoqCi0gKiBCYXNlIGRhdGF0eXBlIGtleXdvcmRzCi0gKi8KLSV0b2tlbiB0b2tfdm9pZAotJXRva2VuIHRva19ib29sCi0ldG9rZW4gdG9rX2J5dGUKLSV0b2tlbiB0b2tfc3RyaW5nCi0ldG9rZW4gdG9rX2JpbmFyeQotJXRva2VuIHRva19zbGlzdAotJXRva2VuIHRva19zZW51bQotJXRva2VuIHRva19pMTYKLSV0b2tlbiB0b2tfaTMyCi0ldG9rZW4gdG9rX2k2NAotJXRva2VuIHRva19kb3VibGUKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUga2V5d29yZHMKLSAqLwotJXRva2VuIHRva19tYXAKLSV0b2tlbiB0b2tfbGlzdAotJXRva2VuIHRva19zZXQKLQotLyoqCi0gKiBGdW5jdGlvbiBtb2RpZmllcnMKLSAqLwotJXRva2VuIHRva19vbmV3YXkKLQotLyoqCi0gKiBUaHJpZnQgbGFuZ3VhZ2Uga2V5d29yZHMKLSAqLwotJXRva2VuIHRva190eXBlZGVmCi0ldG9rZW4gdG9rX3N0cnVjdAotJXRva2VuIHRva194Y2VwdGlvbgotJXRva2VuIHRva190aHJvd3MKLSV0b2tlbiB0b2tfZXh0ZW5kcwotJXRva2VuIHRva19zZXJ2aWNlCi0ldG9rZW4gdG9rX2VudW0KLSV0b2tlbiB0b2tfY29uc3QKLSV0b2tlbiB0b2tfcmVxdWlyZWQKLSV0b2tlbiB0b2tfb3B0aW9uYWwKLSV0b2tlbiB0b2tfdW5pb24KLQotLyoqCi0gKiBHcmFtbWFyIG5vZGVzCi0gKi8KLQotJXR5cGU8dHR5cGU+ICAgICBCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTaW1wbGVCYXNlVHlwZQotJXR5cGU8dHR5cGU+ICAgICBDb250YWluZXJUeXBlCi0ldHlwZTx0dHlwZT4gICAgIFNpbXBsZUNvbnRhaW5lclR5cGUKLSV0eXBlPHR0eXBlPiAgICAgTWFwVHlwZQotJXR5cGU8dHR5cGU+ICAgICBTZXRUeXBlCi0ldHlwZTx0dHlwZT4gICAgIExpc3RUeXBlCi0KLSV0eXBlPHRkb2M+ICAgICAgRGVmaW5pdGlvbgotJXR5cGU8dHR5cGU+ICAgICBUeXBlRGVmaW5pdGlvbgotCi0ldHlwZTx0dHlwZWRlZj4gIFR5cGVkZWYKLQotJXR5cGU8dHR5cGU+ICAgICBUeXBlQW5ub3RhdGlvbnMKLSV0eXBlPHR0eXBlPiAgICAgVHlwZUFubm90YXRpb25MaXN0Ci0ldHlwZTx0YW5ub3Q+ICAgIFR5cGVBbm5vdGF0aW9uCi0KLSV0eXBlPHRmaWVsZD4gICAgRmllbGQKLSV0eXBlPHRmaWVsZGlkPiAgRmllbGRJZGVudGlmaWVyCi0ldHlwZTxlcmVxPiAgICAgIEZpZWxkUmVxdWlyZWRuZXNzCi0ldHlwZTx0dHlwZT4gICAgIEZpZWxkVHlwZQotJXR5cGU8dGNvbnN0dj4gICBGaWVsZFZhbHVlCi0ldHlwZTx0c3RydWN0PiAgIEZpZWxkTGlzdAotCi0ldHlwZTx0ZW51bT4gICAgIEVudW0KLSV0eXBlPHRlbnVtPiAgICAgRW51bURlZkxpc3QKLSV0eXBlPHRlbnVtdj4gICAgRW51bURlZgotCi0ldHlwZTx0dHlwZWRlZj4gIFNlbnVtCi0ldHlwZTx0YmFzZT4gICAgIFNlbnVtRGVmTGlzdAotJXR5cGU8aWQ+ICAgICAgICBTZW51bURlZgotCi0ldHlwZTx0Y29uc3Q+ICAgIENvbnN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0VmFsdWUKLSV0eXBlPHRjb25zdHY+ICAgQ29uc3RMaXN0Ci0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TGlzdENvbnRlbnRzCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwCi0ldHlwZTx0Y29uc3R2PiAgIENvbnN0TWFwQ29udGVudHMKLQotJXR5cGU8aWNvbnN0PiAgICBTdHJ1Y3RIZWFkCi0ldHlwZTx0c3RydWN0PiAgIFN0cnVjdAotJXR5cGU8dHN0cnVjdD4gICBYY2VwdGlvbgotJXR5cGU8dHNlcnZpY2U+ICBTZXJ2aWNlCi0KLSV0eXBlPHRmdW5jdGlvbj4gRnVuY3Rpb24KLSV0eXBlPHR0eXBlPiAgICAgRnVuY3Rpb25UeXBlCi0ldHlwZTx0c2VydmljZT4gIEZ1bmN0aW9uTGlzdAotCi0ldHlwZTx0c3RydWN0PiAgIFRocm93cwotJXR5cGU8dHNlcnZpY2U+ICBFeHRlbmRzCi0ldHlwZTx0Ym9vbD4gICAgIE9uZXdheQotJXR5cGU8dGJvb2w+ICAgICBYc2RBbGwKLSV0eXBlPHRib29sPiAgICAgWHNkT3B0aW9uYWwKLSV0eXBlPHRib29sPiAgICAgWHNkTmlsbGFibGUKLSV0eXBlPHRzdHJ1Y3Q+ICAgWHNkQXR0cmlidXRlcwotJXR5cGU8aWQ+ICAgICAgICBDcHBUeXBlCi0KLSV0eXBlPGR0ZXh0PiAgICAgQ2FwdHVyZURvY1RleHQKLQotJSUKLQotLyoqCi0gKiBUaHJpZnQgR3JhbW1hciBJbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBGb3IgdGhlIG1vc3QgcGFydCB0aGlzIHNvdXJjZSBmaWxlIHdvcmtzIGl0cyB3YXkgdG9wIGRvd24gZnJvbSB3aGF0IHlvdQotICogbWlnaHQgZXhwZWN0IHRvIGZpbmQgaW4gYSB0eXBpY2FsIC50aHJpZnQgZmlsZSwgaS5lLiB0eXBlIGRlZmluaXRpb25zIGFuZAotICogbmFtZXNwYWNlcyB1cCB0b3AgZm9sbG93ZWQgYnkgc2VydmljZSBkZWZpbml0aW9ucyB1c2luZyB0aG9zZSB0eXBlcy4KLSAqLwotCi1Qcm9ncmFtOgotICBIZWFkZXJMaXN0IERlZmluaXRpb25MaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJQcm9ncmFtIC0+IEhlYWRlcnMgRGVmaW5pdGlvbkxpc3QiKTsKLSAgICAgIC8qCi0gICAgICBUT0RPKGRyZWlzcyk6IERlY2lkZSB3aGV0aGVyIGZ1bGwtcHJvZ3JhbSBkb2N0ZXh0IGlzIHdvcnRoIHRoZSB0cm91YmxlLgotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgICovCi0gICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgfQotCi1DYXB0dXJlRG9jVGV4dDoKLSAgICB7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX2RvY3RleHQ7Ci0gICAgICAgIGdfZG9jdGV4dCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBUT0RPKGRyZWlzcyk6IFRyeSB0byBEZXN0cm95RG9jVGV4dCBpbiBhbGwgc29ydHMgb3IgcmFuZG9tIHBsYWNlcy4gKi8KLURlc3Ryb3lEb2NUZXh0OgotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBjbGVhcl9kb2N0ZXh0KCk7Ci0gICAgICB9Ci0gICAgfQotCi0vKiBXZSBoYXZlIHRvIERlc3Ryb3lEb2NUZXh0IGhlcmUsIG90aGVyd2lzZSBpdCBjYXRjaGVzIHRoZSBkb2N0ZXh0Ci0gICBvbiB0aGUgZmlyc3QgcmVhbCBlbGVtZW50LiAqLwotSGVhZGVyTGlzdDoKLSAgSGVhZGVyTGlzdCBEZXN0cm95RG9jVGV4dCBIZWFkZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkhlYWRlckxpc3QgLT4gSGVhZGVyTGlzdCBIZWFkZXIiKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXJMaXN0IC0+ICIpOwotICAgIH0KLQotSGVhZGVyOgotICBJbmNsdWRlCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gSW5jbHVkZSIpOwotICAgIH0KLXwgdG9rX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoJDIsICQzKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19uYW1lc3BhY2UgJyonIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX25hbWVzcGFjZSAqIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCIqIiwgJDMpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInY3BwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3BwJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfY3BwX25hbWVzcGFjZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3BwIiwgJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsCi0gICAgewotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2NwcF9pbmNsdWRlIHRva19saXRlcmFsIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfY3BwX2luY2x1ZGUoJDIpOwotICAgICAgfQotICAgIH0KLXwgdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BocF9uYW1lc3BhY2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHBocCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BocF9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInBocCIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIncHlfbW9kdWxlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBweScgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3B5X21vZHVsZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgicHkiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19wZXJsX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3BlcmxfcGFja2FnZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgcGVybCcgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3BlcmxfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJwZXJsIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfcnVieV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3J1YnlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSByYicgaW5zdGVhZCIpOwotICAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX3J1YnlfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJyYiIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19jYXRlZ29yeSB0b2tfc3RfaWRlbnRpZmllcgotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICInc21hbGx0YWxrX2NhdGVnb3J5JyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnknIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfY2F0ZWdvcnkgdG9rX3N0X2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoInNtYWxsdGFsay5jYXRlZ29yeSIsICQyKTsKLSAgICAgIH0KLSAgICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX3NtYWxsdGFsa19wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ3NtYWxsdGFsa19wcmVmaXgnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIHNtYWxsdGFsay5wcmVmaXgnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19zbWFsbHRhbGtfcHJlZml4IHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJzbWFsbHRhbGsucHJlZml4IiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfamF2YV9wYWNrYWdlIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcHdhcm5pbmcoMSwgIidqYXZhX3BhY2thZ2UnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnbmFtZXNwYWNlIGphdmEnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19qYXZhX3BhY2thZ2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImphdmEiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwd2FybmluZygxLCAiJ2NvY29hX3ByZWZpeCcgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY29jb2EnIGluc3RlYWQiKTsKLSAgICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jb2NvYV9wcmVmaXggdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPnNldF9uYW1lc3BhY2UoImNvY29hIiwgJDIpOwotICAgICAgfQotICAgIH0KLS8qIFRPRE8oZHJlaXNzKTogR2V0IHJpZCBvZiB0aGlzIG9uY2UgZXZlcnlvbmUgaXMgdXNpbmcgdGhlIG5ldyBob3RuZXNzLiAqLwotfCB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgIHB3YXJuaW5nKDEsICIneHNkX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgeHNkJyBpbnN0ZWFkIik7Ci0gICAgICBwZGVidWcoIkhlYWRlciAtPiB0b2tfeHNkX25hbWVzcGFjZSB0b2tfbGl0ZXJhbCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY29jb2EiLCAkMik7Ci0gICAgICB9Ci0gICAgfQotLyogVE9ETyhkcmVpc3MpOiBHZXQgcmlkIG9mIHRoaXMgb25jZSBldmVyeW9uZSBpcyB1c2luZyB0aGUgbmV3IGhvdG5lc3MuICovCi18IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyCi0gICB7Ci0gICAgIHB3YXJuaW5nKDEsICInY3NoYXJwX25hbWVzcGFjZScgaXMgZGVwcmVjYXRlZC4gVXNlICduYW1lc3BhY2UgY3NoYXJwJyBpbnN0ZWFkIik7Ci0gICAgIHBkZWJ1ZygiSGVhZGVyIC0+IHRva19jc2hhcnBfbmFtZXNwYWNlIHRva19pZGVudGlmaWVyIik7Ci0gICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgIGdfcHJvZ3JhbS0+c2V0X25hbWVzcGFjZSgiY3NoYXJwIiwgJDIpOwotICAgICB9Ci0gICB9Ci0vKiBUT0RPKGRyZWlzcyk6IEdldCByaWQgb2YgdGhpcyBvbmNlIGV2ZXJ5b25lIGlzIHVzaW5nIHRoZSBuZXcgaG90bmVzcy4gKi8KLXwgdG9rX2RlbHBoaV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIKLSAgIHsKLSAgICAgcHdhcm5pbmcoMSwgIidkZWxwaGlfbmFtZXNwYWNlJyBpcyBkZXByZWNhdGVkLiBVc2UgJ25hbWVzcGFjZSBkZWxwaGknIGluc3RlYWQiKTsKLSAgICAgcGRlYnVnKCJIZWFkZXIgLT4gdG9rX2RlbHBoaV9uYW1lc3BhY2UgdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgZ19wcm9ncmFtLT5zZXRfbmFtZXNwYWNlKCJkZWxwaGkiLCAkMik7Ci0gICAgIH0KLSAgIH0KLQotSW5jbHVkZToKLSAgdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkluY2x1ZGUgLT4gdG9rX2luY2x1ZGUgdG9rX2xpdGVyYWwiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IGluY2x1ZGVfZmlsZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgICBpZiAoIXBhdGguZW1wdHkoKSkgewotICAgICAgICAgIGdfcHJvZ3JhbS0+YWRkX2luY2x1ZGUocGF0aCwgc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotRGVmaW5pdGlvbkxpc3Q6Ci0gIERlZmluaXRpb25MaXN0IENhcHR1cmVEb2NUZXh0IERlZmluaXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+IERlZmluaXRpb25MaXN0IERlZmluaXRpb24iKTsKLSAgICAgIGlmICgkMiAhPSBOVUxMICYmICQzICE9IE5VTEwpIHsKLSAgICAgICAgJDMtPnNldF9kb2MoJDIpOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb25MaXN0IC0+ICIpOwotICAgIH0KLQotRGVmaW5pdGlvbjoKLSAgQ29uc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gQ29uc3QiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF9jb25zdCgkMSk7Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgVHlwZURlZmluaXRpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkRlZmluaXRpb24gLT4gVHlwZURlZmluaXRpb24iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5hZGRfdHlwZSgkMS0+Z2V0X25hbWUoKSwgJDEpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfdHlwZShnX3BhcmVudF9wcmVmaXggKyAkMS0+Z2V0X25hbWUoKSwgJDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgU2VydmljZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRGVmaW5pdGlvbiAtPiBTZXJ2aWNlIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19zY29wZS0+YWRkX3NlcnZpY2UoJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgaWYgKGdfcGFyZW50X3Njb3BlICE9IE5VTEwpIHsKLSAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX3NlcnZpY2UoZ19wYXJlbnRfcHJlZml4ICsgJDEtPmdldF9uYW1lKCksICQxKTsKLSAgICAgICAgfQotICAgICAgICBnX3Byb2dyYW0tPmFkZF9zZXJ2aWNlKCQxKTsKLSAgICAgIH0KLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1UeXBlRGVmaW5pdGlvbjoKLSAgVHlwZWRlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gVHlwZWRlZiIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3R5cGVkZWYoJDEpOwotICAgICAgfQotICAgIH0KLXwgRW51bQotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gRW51bSIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX2VudW0oJDEpOwotICAgICAgfQotICAgIH0KLXwgU2VudW0KLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFNlbnVtIik7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgZ19wcm9ncmFtLT5hZGRfdHlwZWRlZigkMSk7Ci0gICAgICB9Ci0gICAgfQotfCBTdHJ1Y3QKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVEZWZpbml0aW9uIC0+IFN0cnVjdCIpOwotICAgICAgaWYgKGdfcGFyc2VfbW9kZSA9PSBQUk9HUkFNKSB7Ci0gICAgICAgIGdfcHJvZ3JhbS0+YWRkX3N0cnVjdCgkMSk7Ci0gICAgICB9Ci0gICAgfQotfCBYY2VwdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZURlZmluaXRpb24gLT4gWGNlcHRpb24iKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Byb2dyYW0tPmFkZF94Y2VwdGlvbigkMSk7Ci0gICAgICB9Ci0gICAgfQotCi1UeXBlZGVmOgotICB0b2tfdHlwZWRlZiBGaWVsZFR5cGUgdG9rX2lkZW50aWZpZXIgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlRGVmIC0+IHRva190eXBlZGVmIEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciIpOwotICAgICAgdF90eXBlZGVmICp0ZCA9IG5ldyB0X3R5cGVkZWYoZ19wcm9ncmFtLCAkMiwgJDMpOwotICAgICAgJCQgPSB0ZDsKLSAgICAgIGlmICgkNCAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNC0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDQ7Ci0gICAgICB9Ci0gICAgfQotCi1Db21tYU9yU2VtaWNvbG9uT3B0aW9uYWw6Ci0gICcsJwotICAgIHt9Ci18ICc7JwotICAgIHt9Ci18Ci0gICAge30KLQotRW51bToKLSAgdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIEVudW1EZWZMaXN0ICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW0gLT4gdG9rX2VudW0gdG9rX2lkZW50aWZpZXIgeyBFbnVtRGVmTGlzdCB9Iik7Ci0gICAgICAkJCA9ICQ0OwotICAgICAgJCQtPnNldF9uYW1lKCQyKTsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDY7Ci0gICAgICB9Ci0gICAgICAkJC0+cmVzb2x2ZV92YWx1ZXMoKTsKLSAgICAgIC8vIG1ha2UgY29uc3RhbnRzIGZvciBhbGwgdGhlIGVudW0gdmFsdWVzCi0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGVudW1fdmFsdWVzID0gJCQtPmdldF9jb25zdGFudHMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGNfaXRlcjsKLSAgICAgICAgZm9yIChjX2l0ZXIgPSBlbnVtX3ZhbHVlcy5iZWdpbigpOyBjX2l0ZXIgIT0gZW51bV92YWx1ZXMuZW5kKCk7ICsrY19pdGVyKSB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3RfbmFtZSA9ICQkLT5nZXRfbmFtZSgpICsgIi4iICsgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpOwotICAgICAgICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCgqY19pdGVyKS0+Z2V0X3ZhbHVlKCkpOwotICAgICAgICAgIGNvbnN0X3ZhbC0+c2V0X2VudW0oJCQpOwotICAgICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudChjb25zdF9uYW1lLCBuZXcgdF9jb25zdChnX3R5cGVfaTMyLCAoKmNfaXRlciktPmdldF9uYW1lKCksIGNvbnN0X3ZhbCkpOwotICAgICAgICAgIGlmIChnX3BhcmVudF9zY29wZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBnX3BhcmVudF9zY29wZS0+YWRkX2NvbnN0YW50KGdfcGFyZW50X3ByZWZpeCArIGNvbnN0X25hbWUsIG5ldyB0X2NvbnN0KGdfdHlwZV9pMzIsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgY29uc3RfdmFsKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi1FbnVtRGVmTGlzdDoKLSAgRW51bURlZkxpc3QgRW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiRW51bURlZkxpc3QgLT4gRW51bURlZkxpc3QgRW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hcHBlbmQoJDIpOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICBwZGVidWcoIkVudW1EZWZMaXN0IC0+ICIpOwotICAgICAgJCQgPSBuZXcgdF9lbnVtKGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1FbnVtRGVmOgotICBDYXB0dXJlRG9jVGV4dCB0b2tfaWRlbnRpZmllciAnPScgdG9rX2ludF9jb25zdGFudCBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IHRva19pZGVudGlmaWVyID0gdG9rX2ludF9jb25zdGFudCIpOwotICAgICAgaWYgKCQ0IDwgMCkgewotICAgICAgICBwd2FybmluZygxLCAiTmVnYXRpdmUgdmFsdWUgc3VwcGxpZWQgZm9yIGVudW0gJXMuXG4iLCAkMik7Ci0gICAgICB9Ci0gICAgICBpZiAoJDQgPiBJTlRfTUFYKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgdmFsdWUgc3VwcGxpZWQgZm9yIGVudW0gJXMuXG4iLCAkMik7Ci0gICAgICB9Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDIsICQ0KTsKLSAgICAgIGlmICgkMSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5zZXRfZG9jKCQxKTsKLSAgICAgIH0KLSAgICAgIGlmICgkNSAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNS0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDU7Ci0gICAgICB9Ci0gICAgfQotfAotICBDYXB0dXJlRG9jVGV4dCB0b2tfaWRlbnRpZmllciBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJFbnVtRGVmIC0+IHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IG5ldyB0X2VudW1fdmFsdWUoJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgaWYgKCQzICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQzLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMzsKLSAgICAgIH0KLSAgICB9Ci0KLVNlbnVtOgotICB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgJ3snIFNlbnVtRGVmTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bSAtPiB0b2tfc2VudW0gdG9rX2lkZW50aWZpZXIgeyBTZW51bURlZkxpc3QgfSIpOwotICAgICAgJCQgPSBuZXcgdF90eXBlZGVmKGdfcHJvZ3JhbSwgJDQsICQyKTsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgICQkLT5hbm5vdGF0aW9uc18gPSAkNi0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDY7Ci0gICAgICB9Ci0gICAgfQotCi1TZW51bURlZkxpc3Q6Ci0gIFNlbnVtRGVmTGlzdCBTZW51bURlZgotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2VudW1EZWZMaXN0IC0+IFNlbnVtRGVmTGlzdCBTZW51bURlZiIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfc3RyaW5nX2VudW1fdmFsKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X2Jhc2VfdHlwZSgic3RyaW5nIiwgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HKTsKLSAgICAgICQkLT5zZXRfc3RyaW5nX2VudW0odHJ1ZSk7Ci0gICAgfQotCi1TZW51bURlZjoKLSAgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJTZW51bURlZiAtPiB0b2tfbGl0ZXJhbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUNvbnN0OgotICB0b2tfY29uc3QgRmllbGRUeXBlIHRva19pZGVudGlmaWVyICc9JyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3QgLT4gdG9rX2NvbnN0IEZpZWxkVHlwZSB0b2tfaWRlbnRpZmllciA9IENvbnN0VmFsdWUiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICBnX3Njb3BlLT5yZXNvbHZlX2NvbnN0X3ZhbHVlKCQ1LCAkMik7Ci0gICAgICAgICQkID0gbmV3IHRfY29uc3QoJDIsICQzLCAkNSk7Ci0gICAgICAgIHZhbGlkYXRlX2NvbnN0X3R5cGUoJCQpOwotCi0gICAgICAgIGdfc2NvcGUtPmFkZF9jb25zdGFudCgkMywgJCQpOwotICAgICAgICBpZiAoZ19wYXJlbnRfc2NvcGUgIT0gTlVMTCkgewotICAgICAgICAgIGdfcGFyZW50X3Njb3BlLT5hZGRfY29uc3RhbnQoZ19wYXJlbnRfcHJlZml4ICsgJDMsICQkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLQotQ29uc3RWYWx1ZToKLSAgdG9rX2ludF9jb25zdGFudAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RWYWx1ZSA9PiB0b2tfaW50X2NvbnN0YW50Iik7Ci0gICAgICAkJCA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7Ci0gICAgICAkJC0+c2V0X2ludGVnZXIoJDEpOwotICAgICAgaWYgKCFnX2FsbG93XzY0Yml0X2NvbnN0cyAmJiAoJDEgPCBJTlQzMl9NSU4gfHwgJDEgPiBJTlQzMl9NQVgpKSB7Ci0gICAgICAgIHB3YXJuaW5nKDEsICI2NC1iaXQgY29uc3RhbnQgXCIlIlBSSWk2NCJcIiBtYXkgbm90IHdvcmsgaW4gYWxsIGxhbmd1YWdlcy5cbiIsICQxKTsKLSAgICAgIH0KLSAgICB9Ci18IHRva19kdWJfY29uc3RhbnQKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2R1Yl9jb25zdGFudCIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9kb3VibGUoJDEpOwotICAgIH0KLXwgdG9rX2xpdGVyYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2xpdGVyYWwiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoJDEpOwotICAgIH0KLXwgdG9rX2lkZW50aWZpZXIKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgICQkID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKLSAgICAgICQkLT5zZXRfaWRlbnRpZmllcigkMSk7Ci0gICAgfQotfCBDb25zdExpc3QKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RMaXN0Iik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgQ29uc3RNYXAKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0VmFsdWUgPT4gQ29uc3RNYXAiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1Db25zdExpc3Q6Ci0gICdbJyBDb25zdExpc3RDb250ZW50cyAnXScKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdCA9PiBbIENvbnN0TGlzdENvbnRlbnRzIF0iKTsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotCi1Db25zdExpc3RDb250ZW50czoKLSAgQ29uc3RMaXN0Q29udGVudHMgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TGlzdENvbnRlbnRzID0+IENvbnN0TGlzdENvbnRlbnRzIENvbnN0VmFsdWUgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFkZF9saXN0KCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJDb25zdExpc3RDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9saXN0KCk7Ci0gICAgfQotCi1Db25zdE1hcDoKLSAgJ3snIENvbnN0TWFwQ29udGVudHMgJ30nCi0gICAgewotICAgICAgcGRlYnVnKCJDb25zdE1hcCA9PiB7IENvbnN0TWFwQ29udGVudHMgfSIpOwotICAgICAgJCQgPSAkMjsKLSAgICB9Ci0KLUNvbnN0TWFwQ29udGVudHM6Ci0gIENvbnN0TWFwQ29udGVudHMgQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBDb21tYU9yU2VtaWNvbG9uT3B0aW9uYWwKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnN0TWFwQ29udGVudHMgPT4gQ29uc3RNYXBDb250ZW50cyBDb25zdFZhbHVlIENvbW1hT3JTZW1pY29sb25PcHRpb25hbCIpOwotICAgICAgJCQgPSAkMTsKLSAgICAgICQkLT5hZGRfbWFwKCQyLCAkNCk7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQ29uc3RNYXBDb250ZW50cyA9PiIpOwotICAgICAgJCQgPSBuZXcgdF9jb25zdF92YWx1ZSgpOwotICAgICAgJCQtPnNldF9tYXAoKTsKLSAgICB9Ci0KLVN0cnVjdEhlYWQ6Ci0gIHRva19zdHJ1Y3QKLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc19zdHJ1Y3Q7Ci0gICAgfQotfCB0b2tfdW5pb24KLSAgICB7Ci0gICAgICAkJCA9IHN0cnVjdF9pc191bmlvbjsKLSAgICB9Ci0KLVN0cnVjdDoKLSAgU3RydWN0SGVhZCB0b2tfaWRlbnRpZmllciBYc2RBbGwgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJTdHJ1Y3QgLT4gdG9rX3N0cnVjdCB0b2tfaWRlbnRpZmllciB7IEZpZWxkTGlzdCB9Iik7Ci0gICAgICAkNS0+c2V0X3hzZF9hbGwoJDMpOwotICAgICAgJDUtPnNldF91bmlvbigkMSA9PSBzdHJ1Y3RfaXNfdW5pb24pOwotICAgICAgJCQgPSAkNTsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICBpZiAoJDcgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDctPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQ3OwotICAgICAgfQotICAgIH0KLSAgICAKLVhzZEFsbDoKLSAgdG9rX3hzZF9hbGwKLSAgICB7Ci0gICAgICAkJCA9IHRydWU7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gZmFsc2U7Ci0gICAgfQotCi1Yc2RPcHRpb25hbDoKLSAgdG9rX3hzZF9vcHRpb25hbAotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVhzZE5pbGxhYmxlOgotICB0b2tfeHNkX25pbGxhYmxlCi0gICAgewotICAgICAgJCQgPSB0cnVlOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IGZhbHNlOwotICAgIH0KLQotWHNkQXR0cmlidXRlczoKLSAgdG9rX3hzZF9hdHRycyAneycgRmllbGRMaXN0ICd9JwotICAgIHsKLSAgICAgICQkID0gJDM7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVhjZXB0aW9uOgotICB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgJ3snIEZpZWxkTGlzdCAnfScgVHlwZUFubm90YXRpb25zCi0gICAgewotICAgICAgcGRlYnVnKCJYY2VwdGlvbiAtPiB0b2tfeGNlcHRpb24gdG9rX2lkZW50aWZpZXIgeyBGaWVsZExpc3QgfSIpOwotICAgICAgJDQtPnNldF9uYW1lKCQyKTsKLSAgICAgICQ0LT5zZXRfeGNlcHRpb24odHJ1ZSk7Ci0gICAgICAkJCA9ICQ0OwotICAgICAgaWYgKCQ2ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ2LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkNjsKLSAgICAgIH0KLSAgICB9Ci0KLVNlcnZpY2U6Ci0gIHRva19zZXJ2aWNlIHRva19pZGVudGlmaWVyIEV4dGVuZHMgJ3snIEZsYWdBcmdzIEZ1bmN0aW9uTGlzdCBVbmZsYWdBcmdzICd9JyBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIlNlcnZpY2UgLT4gdG9rX3NlcnZpY2UgdG9rX2lkZW50aWZpZXIgeyBGdW5jdGlvbkxpc3QgfSIpOwotICAgICAgJCQgPSAkNjsKLSAgICAgICQkLT5zZXRfbmFtZSgkMik7Ci0gICAgICAkJC0+c2V0X2V4dGVuZHMoJDMpOwotICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkOTsKLSAgICAgIH0KLSAgICB9Ci0KLUZsYWdBcmdzOgotICAgIHsKLSAgICAgICBnX2FyZ2xpc3QgPSAxOwotICAgIH0KLQotVW5mbGFnQXJnczoKLSAgICB7Ci0gICAgICAgZ19hcmdsaXN0ID0gMDsKLSAgICB9Ci0KLUV4dGVuZHM6Ci0gIHRva19leHRlbmRzIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJFeHRlbmRzIC0+IHRva19leHRlbmRzIHRva19pZGVudGlmaWVyIik7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfc2VydmljZSgkMik7Ci0gICAgICAgIGlmICgkJCA9PSBOVUxMKSB7Ci0gICAgICAgICAgeXllcnJvcigiU2VydmljZSBcIiVzXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQuIiwgJDIpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBOVUxMOwotICAgIH0KLQotRnVuY3Rpb25MaXN0OgotICBGdW5jdGlvbkxpc3QgRnVuY3Rpb24KLSAgICB7Ci0gICAgICBwZGVidWcoIkZ1bmN0aW9uTGlzdCAtPiBGdW5jdGlvbkxpc3QgRnVuY3Rpb24iKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICAkMS0+YWRkX2Z1bmN0aW9uKCQyKTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvbkxpc3QgLT4gIik7Ci0gICAgICAkJCA9IG5ldyB0X3NlcnZpY2UoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZ1bmN0aW9uOgotICBDYXB0dXJlRG9jVGV4dCBPbmV3YXkgRnVuY3Rpb25UeXBlIHRva19pZGVudGlmaWVyICcoJyBGaWVsZExpc3QgJyknIFRocm93cyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgJDYtPnNldF9uYW1lKHN0ZDo6c3RyaW5nKCQ0KSArICJfYXJncyIpOwotICAgICAgJCQgPSBuZXcgdF9mdW5jdGlvbigkMywgJDQsICQ2LCAkOCwgJDIpOwotICAgICAgaWYgKCQxICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPnNldF9kb2MoJDEpOwotICAgICAgfQotICAgICAgaWYgKCQ5ICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQ5LT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkOTsKLSAgICAgIH0KLSAgICB9Ci0KLU9uZXdheToKLSAgdG9rX29uZXdheQotICAgIHsKLSAgICAgICQkID0gdHJ1ZTsKLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQgPSBmYWxzZTsKLSAgICB9Ci0KLVRocm93czoKLSAgdG9rX3Rocm93cyAnKCcgRmllbGRMaXN0ICcpJwotICAgIHsKLSAgICAgIHBkZWJ1ZygiVGhyb3dzIC0+IHRva190aHJvd3MgKCBGaWVsZExpc3QgKSIpOwotICAgICAgJCQgPSAkMzsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSAmJiAhdmFsaWRhdGVfdGhyb3dzKCQkKSkgewotICAgICAgICB5eWVycm9yKCJUaHJvd3MgY2xhdXNlIG1heSBub3QgY29udGFpbiBub24tZXhjZXB0aW9uIHR5cGVzIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICB9Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gbmV3IHRfc3RydWN0KGdfcHJvZ3JhbSk7Ci0gICAgfQotCi1GaWVsZExpc3Q6Ci0gIEZpZWxkTGlzdCBGaWVsZAotICAgIHsKLSAgICAgIHBkZWJ1ZygiRmllbGRMaXN0IC0+IEZpZWxkTGlzdCAsIEZpZWxkIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgaWYgKCEoJCQtPmFwcGVuZCgkMikpKSB7Ci0gICAgICAgIHl5ZXJyb3IoIkZpZWxkIGlkZW50aWZpZXIgJWQgZm9yIFwiJXNcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQiLCAkMi0+Z2V0X2tleSgpLCAkMi0+Z2V0X25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZExpc3QgLT4gIik7Ci0gICAgICB5X2ZpZWxkX3ZhbCA9IC0xOwotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLUZpZWxkOgotICBDYXB0dXJlRG9jVGV4dCBGaWVsZElkZW50aWZpZXIgRmllbGRSZXF1aXJlZG5lc3MgRmllbGRUeXBlIHRva19pZGVudGlmaWVyIEZpZWxkVmFsdWUgWHNkT3B0aW9uYWwgWHNkTmlsbGFibGUgWHNkQXR0cmlidXRlcyBUeXBlQW5ub3RhdGlvbnMgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJ0b2tfaW50X2NvbnN0YW50IDogRmllbGQgLT4gRmllbGRUeXBlIHRva19pZGVudGlmaWVyIik7Ci0gICAgICBpZiAoJDIuYXV0b19hc3NpZ25lZCkgewotICAgICAgICBwd2FybmluZygxLCAiTm8gZmllbGQga2V5IHNwZWNpZmllZCBmb3IgJXMsIHJlc3VsdGluZyBwcm90b2NvbCBtYXkgaGF2ZSBjb25mbGljdHMgb3Igbm90IGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIVxuIiwgJDUpOwotICAgICAgICBpZiAoZ19zdHJpY3QgPj0gMTkyKSB7Ci0gICAgICAgICAgeXllcnJvcigiSW1wbGljaXQgZmllbGQga2V5cyBhcmUgZGVwcmVjYXRlZCBhbmQgbm90IGFsbG93ZWQgd2l0aCAtc3RyaWN0Iik7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJCQgPSBuZXcgdF9maWVsZCgkNCwgJDUsICQyLnZhbHVlKTsKLSAgICAgICQkLT5zZXRfcmVxKCQzKTsKLSAgICAgIGlmICgkNiAhPSBOVUxMKSB7Ci0gICAgICAgIGdfc2NvcGUtPnJlc29sdmVfY29uc3RfdmFsdWUoJDYsICQ0KTsKLSAgICAgICAgdmFsaWRhdGVfZmllbGRfdmFsdWUoJCQsICQ2KTsKLSAgICAgICAgJCQtPnNldF92YWx1ZSgkNik7Ci0gICAgICB9Ci0gICAgICAkJC0+c2V0X3hzZF9vcHRpb25hbCgkNyk7Ci0gICAgICAkJC0+c2V0X3hzZF9uaWxsYWJsZSgkOCk7Ci0gICAgICBpZiAoJDEgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X2RvYygkMSk7Ci0gICAgICB9Ci0gICAgICBpZiAoJDkgIT0gTlVMTCkgewotICAgICAgICAkJC0+c2V0X3hzZF9hdHRycygkOSk7Ci0gICAgICB9Ci0gICAgICBpZiAoJDEwICE9IE5VTEwpIHsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQxMC0+YW5ub3RhdGlvbnNfOwotICAgICAgICBkZWxldGUgJDEwOwotICAgICAgfQotICAgIH0KLQotRmllbGRJZGVudGlmaWVyOgotICB0b2tfaW50X2NvbnN0YW50ICc6JwotICAgIHsKLSAgICAgIGlmICgkMSA8PSAwKSB7Ci0gICAgICAgIGlmIChnX2FsbG93X25lZ19maWVsZF9rZXlzKSB7Ci0gICAgICAgICAgLyoKLSAgICAgICAgICAgKiBnX2FsbG93X25lZ19maWVsZF9rZXlzIGV4aXN0cyB0byBhbGxvdyB1c2VycyB0byBhZGQgZXhwbGljaXRseQotICAgICAgICAgICAqIHNwZWNpZmllZCBrZXkgdmFsdWVzIHRvIG9sZCAudGhyaWZ0IGZpbGVzIHdpdGhvdXQgYnJlYWtpbmcKLSAgICAgICAgICAgKiBwcm90b2NvbCBjb21wYXRpYmlsaXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIGlmICgkMSAhPSB5X2ZpZWxkX3ZhbCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIHdhcm4gaWYgdGhlIHVzZXItc3BlY2lmaWVkIG5lZ2F0aXZlIHZhbHVlIGlzbid0IHdoYXQKLSAgICAgICAgICAgICAqIHRocmlmdCB3b3VsZCBoYXZlIGF1dG8tYXNzaWduZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB3YXJuaW5nKDEsICJOZWdhdGl2ZSBmaWVsZCBrZXkgKCVkKSBkaWZmZXJzIGZyb20gd2hhdCB3b3VsZCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAiYXV0by1hc3NpZ25lZCBieSB0aHJpZnQgKCVkKS5cbiIsICQxLCB5X2ZpZWxkX3ZhbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8qCi0gICAgICAgICAgICogTGVhdmUgJDEgYXMtaXMsIGFuZCB1cGRhdGUgeV9maWVsZF92YWwgdG8gYmUgb25lIGxlc3MgdGhhbiAkMS4KLSAgICAgICAgICAgKiBUaGUgRmllbGRMaXN0IHBhcnNpbmcgd2lsbCBjYXRjaCBhbnkgZHVwbGljYXRlIGtleSB2YWx1ZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgeV9maWVsZF92YWwgPSAkMSAtIDE7Ci0gICAgICAgICAgJCQudmFsdWUgPSAkMTsKLSAgICAgICAgICAkJC5hdXRvX2Fzc2lnbmVkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHdhcm5pbmcoMSwgIk5vbnBvc2l0aXZlIHZhbHVlICglZCkgbm90IGFsbG93ZWQgYXMgYSBmaWVsZCBrZXkuXG4iLAotICAgICAgICAgICAgICAgICAgICQxKTsKLSAgICAgICAgICAkJC52YWx1ZSA9IHlfZmllbGRfdmFsLS07Ci0gICAgICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkLnZhbHVlID0gJDE7Ci0gICAgICAgICQkLmF1dG9fYXNzaWduZWQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci18Ci0gICAgewotICAgICAgJCQudmFsdWUgPSB5X2ZpZWxkX3ZhbC0tOwotICAgICAgJCQuYXV0b19hc3NpZ25lZCA9IHRydWU7Ci0gICAgfQotCi1GaWVsZFJlcXVpcmVkbmVzczoKLSAgdG9rX3JlcXVpcmVkCi0gICAgewotICAgICAgJCQgPSB0X2ZpZWxkOjpUX1JFUVVJUkVEOwotICAgIH0KLXwgdG9rX29wdGlvbmFsCi0gICAgewotICAgICAgaWYgKGdfYXJnbGlzdCkgewotICAgICAgICBpZiAoZ19wYXJzZV9tb2RlID09IFBST0dSQU0pIHsKLSAgICAgICAgICBwd2FybmluZygxLCAib3B0aW9uYWwga2V5d29yZCBpcyBpZ25vcmVkIGluIGFyZ3VtZW50IGxpc3RzLlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSB0X2ZpZWxkOjpUX09QVElPTkFMOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Ci0gICAgfQotCi1GaWVsZFZhbHVlOgotICAnPScgQ29uc3RWYWx1ZQotICAgIHsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gUFJPR1JBTSkgewotICAgICAgICAkJCA9ICQyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJCQgPSBOVUxMOwotICAgICAgfQotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1GdW5jdGlvblR5cGU6Ci0gIEZpZWxkVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiRnVuY3Rpb25UeXBlIC0+IEZpZWxkVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci18IHRva192b2lkCi0gICAgewotICAgICAgcGRlYnVnKCJGdW5jdGlvblR5cGUgLT4gdG9rX3ZvaWQiKTsKLSAgICAgICQkID0gZ190eXBlX3ZvaWQ7Ci0gICAgfQotCi1GaWVsZFR5cGU6Ci0gIHRva19pZGVudGlmaWVyCi0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gdG9rX2lkZW50aWZpZXIiKTsKLSAgICAgIGlmIChnX3BhcnNlX21vZGUgPT0gSU5DTFVERVMpIHsKLSAgICAgICAgLy8gSWdub3JlIGlkZW50aWZpZXJzIGluIGluY2x1ZGUgbW9kZQotICAgICAgICAkJCA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBMb29rdXAgdGhlIGlkZW50aWZpZXIgaW4gdGhlIGN1cnJlbnQgc2NvcGUKLSAgICAgICAgJCQgPSBnX3Njb3BlLT5nZXRfdHlwZSgkMSk7Ci0gICAgICAgIGlmICgkJCA9PSBOVUxMKSB7Ci0gICAgICAgICAgeXllcnJvcigiVHlwZSBcIiVzXCIgaGFzIG5vdCBiZWVuIGRlZmluZWQuIiwgJDEpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci18IEJhc2VUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQmFzZVR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotfCBDb250YWluZXJUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJGaWVsZFR5cGUgLT4gQ29udGFpbmVyVHlwZSIpOwotICAgICAgJCQgPSAkMTsKLSAgICB9Ci0KLUJhc2VUeXBlOiBTaW1wbGVCYXNlVHlwZSBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IFNpbXBsZUJhc2VUeXBlIFR5cGVBbm5vdGF0aW9ucyIpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgJCQgPSBuZXcgdF9iYXNlX3R5cGUoKnN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4oJDEpKTsKLSAgICAgICAgJCQtPmFubm90YXRpb25zXyA9ICQyLT5hbm5vdGF0aW9uc187Ci0gICAgICAgIGRlbGV0ZSAkMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICQkID0gJDE7Ci0gICAgICB9Ci0gICAgfQotCi1TaW1wbGVCYXNlVHlwZToKLSAgdG9rX3N0cmluZwotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX3N0cmluZyIpOwotICAgICAgJCQgPSBnX3R5cGVfc3RyaW5nOwotICAgIH0KLXwgdG9rX2JpbmFyeQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2JpbmFyeSIpOwotICAgICAgJCQgPSBnX3R5cGVfYmluYXJ5OwotICAgIH0KLXwgdG9rX3NsaXN0Ci0gICAgewotICAgICAgcGRlYnVnKCJCYXNlVHlwZSAtPiB0b2tfc2xpc3QiKTsKLSAgICAgICQkID0gZ190eXBlX3NsaXN0OwotICAgIH0KLXwgdG9rX2Jvb2wKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ib29sIik7Ci0gICAgICAkJCA9IGdfdHlwZV9ib29sOwotICAgIH0KLXwgdG9rX2J5dGUKLSAgICB7Ci0gICAgICBwZGVidWcoIkJhc2VUeXBlIC0+IHRva19ieXRlIik7Ci0gICAgICAkJCA9IGdfdHlwZV9ieXRlOwotICAgIH0KLXwgdG9rX2kxNgotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kxNiIpOwotICAgICAgJCQgPSBnX3R5cGVfaTE2OwotICAgIH0KLXwgdG9rX2kzMgotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2kzMiIpOwotICAgICAgJCQgPSBnX3R5cGVfaTMyOwotICAgIH0KLXwgdG9rX2k2NAotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2k2NCIpOwotICAgICAgJCQgPSBnX3R5cGVfaTY0OwotICAgIH0KLXwgdG9rX2RvdWJsZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiQmFzZVR5cGUgLT4gdG9rX2RvdWJsZSIpOwotICAgICAgJCQgPSBnX3R5cGVfZG91YmxlOwotICAgIH0KLQotQ29udGFpbmVyVHlwZTogU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMKLSAgICB7Ci0gICAgICBwZGVidWcoIkNvbnRhaW5lclR5cGUgLT4gU2ltcGxlQ29udGFpbmVyVHlwZSBUeXBlQW5ub3RhdGlvbnMiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAkJC0+YW5ub3RhdGlvbnNfID0gJDItPmFubm90YXRpb25zXzsKLSAgICAgICAgZGVsZXRlICQyOwotICAgICAgfQotICAgIH0KLQotU2ltcGxlQ29udGFpbmVyVHlwZToKLSAgTWFwVHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBNYXBUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgU2V0VHlwZQotICAgIHsKLSAgICAgIHBkZWJ1ZygiU2ltcGxlQ29udGFpbmVyVHlwZSAtPiBTZXRUeXBlIik7Ci0gICAgICAkJCA9ICQxOwotICAgIH0KLXwgTGlzdFR5cGUKLSAgICB7Ci0gICAgICBwZGVidWcoIlNpbXBsZUNvbnRhaW5lclR5cGUgLT4gTGlzdFR5cGUiKTsKLSAgICAgICQkID0gJDE7Ci0gICAgfQotCi1NYXBUeXBlOgotICB0b2tfbWFwIENwcFR5cGUgJzwnIEZpZWxkVHlwZSAnLCcgRmllbGRUeXBlICc+JwotICAgIHsKLSAgICAgIHBkZWJ1ZygiTWFwVHlwZSAtPiB0b2tfbWFwIDxGaWVsZFR5cGUsIEZpZWxkVHlwZT4iKTsKLSAgICAgICQkID0gbmV3IHRfbWFwKCQ0LCAkNik7Ci0gICAgICBpZiAoJDIgIT0gTlVMTCkgewotICAgICAgICAoKHRfY29udGFpbmVyKikkJCktPnNldF9jcHBfbmFtZShzdGQ6OnN0cmluZygkMikpOwotICAgICAgfQotICAgIH0KLQotU2V0VHlwZToKLSAgdG9rX3NldCBDcHBUeXBlICc8JyBGaWVsZFR5cGUgJz4nCi0gICAgewotICAgICAgcGRlYnVnKCJTZXRUeXBlIC0+IHRva19zZXQ8RmllbGRUeXBlPiIpOwotICAgICAgJCQgPSBuZXcgdF9zZXQoJDQpOwotICAgICAgaWYgKCQyICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDIpKTsKLSAgICAgIH0KLSAgICB9Ci0KLUxpc3RUeXBlOgotICB0b2tfbGlzdCAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlCi0gICAgewotICAgICAgcGRlYnVnKCJMaXN0VHlwZSAtPiB0b2tfbGlzdDxGaWVsZFR5cGU+Iik7Ci0gICAgICAkJCA9IG5ldyB0X2xpc3QoJDMpOwotICAgICAgaWYgKCQ1ICE9IE5VTEwpIHsKLSAgICAgICAgKCh0X2NvbnRhaW5lciopJCQpLT5zZXRfY3BwX25hbWUoc3RkOjpzdHJpbmcoJDUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLUNwcFR5cGU6Ci0gIHRva19jcHBfdHlwZSB0b2tfbGl0ZXJhbAotICAgIHsKLSAgICAgICQkID0gJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgICQkID0gTlVMTDsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uczoKLSAgJygnIFR5cGVBbm5vdGF0aW9uTGlzdCAnKScKLSAgICB7Ci0gICAgICBwZGVidWcoIlR5cGVBbm5vdGF0aW9ucyAtPiAoIFR5cGVBbm5vdGF0aW9uTGlzdCApIik7Ci0gICAgICAkJCA9ICQyOwotICAgIH0KLXwKLSAgICB7Ci0gICAgICAkJCA9IE5VTEw7Ci0gICAgfQotCi1UeXBlQW5ub3RhdGlvbkxpc3Q6Ci0gIFR5cGVBbm5vdGF0aW9uTGlzdCBUeXBlQW5ub3RhdGlvbgotICAgIHsKLSAgICAgIHBkZWJ1ZygiVHlwZUFubm90YXRpb25MaXN0IC0+IFR5cGVBbm5vdGF0aW9uTGlzdCAsIFR5cGVBbm5vdGF0aW9uIik7Ci0gICAgICAkJCA9ICQxOwotICAgICAgJCQtPmFubm90YXRpb25zX1skMi0+a2V5XSA9ICQyLT52YWw7Ci0gICAgICBkZWxldGUgJDI7Ci0gICAgfQotfAotICAgIHsKLSAgICAgIC8qIEp1c3QgdXNlIGEgZHVtbXkgc3RydWN0dXJlIHRvIGhvbGQgdGhlIGFubm90YXRpb25zLiAqLwotICAgICAgJCQgPSBuZXcgdF9zdHJ1Y3QoZ19wcm9ncmFtKTsKLSAgICB9Ci0KLVR5cGVBbm5vdGF0aW9uOgotICB0b2tfaWRlbnRpZmllciAnPScgdG9rX2xpdGVyYWwgQ29tbWFPclNlbWljb2xvbk9wdGlvbmFsCi0gICAgewotICAgICAgcGRlYnVnKCJUeXBlQW5ub3RhdGlvbiAtPiB0b2tfaWRlbnRpZmllciA9IHRva19saXRlcmFsIik7Ci0gICAgICAkJCA9IG5ldyB0X2Fubm90YXRpb247Ci0gICAgICAkJC0+a2V5ID0gJDE7Ci0gICAgICAkJC0+dmFsID0gJDM7Ci0gICAgfQotCi0lJQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oIGIvY29tcGlsZXIvY3BwL3NyYy93aW5kb3dzL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDc1ZTgwLi4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb2dvcmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb2dvIG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCi0jZGVmaW5lIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8gMQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSNwcmFnbWEgb25jZQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgotI2VuZGlmCi0KLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotCi0jZGVmaW5lIHN0cnRvbGwoYmVnaW5fcHRyLCBlbmRfcHRyLCBsZW5ndGgpIF9zdHJ0b2k2NChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkKLQotI2RlZmluZSBQUkl1NjQgIkk2NGQiCi0jZGVmaW5lIFBSSWk2NCAiSTY0ZCIKLQotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKLQotI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19DT05GSUdfSF8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmguaW4gYi9jb21waWxlci9jcHAvc3JjL3dpbmRvd3MvdmVyc2lvbi5oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGI3YzU2Li4wMDAwMDAwCi0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29nb3JpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29nbyBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX1ZFUlNJT05fSF8KLSNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX1ZFUlNJT05fSF8gMQotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSNwcmFnbWEgb25jZQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgotI2VuZGlmCi0KLSNkZWZpbmUgUEFUSF9NQVggTUFYX1BBVEgKLSNkZWZpbmUgVEhSSUZUX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgotCi0jaWZuZGVmIFNfSVNESVIKLSNkZWZpbmUgU19JU0RJUihtb2RlKSAgKCgobW9kZSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZW5kaWYKLQotI2lmbmRlZiBTX0lTUkVHCi0jZGVmaW5lIFNfSVNSRUcobW9kZSkgICgoKG1vZGUpICYgU19JRk1UKSA9PSBTX0lGUkVHKQotI2VuZGlmCi0KLSNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDlmMjNkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworaWYoJHtXSVRIX1BMVUdJTn0pCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKKyAgICAjIE1ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCisKKyAgICBzZXQocGx1Z2ludGVzdF9TT1VSQ0VTCisgICAgICAgIHBsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKKyAgICApCisgICAgYWRkX2V4ZWN1dGFibGUocGx1Z2ludGVzdCAke3BsdWdpbnRlc3RfU09VUkNFU30pCisgICAgaWYoV0lUSF9TSEFSRURfTElCIEFORCBOT1QgTVNWQykKKyAgICAgICAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHBsdWdpbnRlc3QKKyAgICAgICAgICAgIHRocmlmdGMKKyAgICAgICAgICAgICR7Qm9vc3RfTElCUkFSSUVTfQorICAgICAgICApCisgICAgZWxzZSgpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhwbHVnaW50ZXN0CisgICAgICAgICAgICB0aHJpZnRjX3N0YXRpYworICAgICAgICAgICAgdGhyaWZ0X3N0YXRpYworICAgICAgICAgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICAgICAgICkKKyAgICBlbmRpZigpCisgICAgYWRkX3Rlc3QoTkFNRSBQbHVnaW5Vbml0VGVzdCBDT01NQU5EIHBsdWdpbnRlc3QpCisKKyAgICBzZXQodGhyaWZ0LWdlbi1teWNwcF9TT1VSQ0VTCisgICAgICAgIC4uL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisgICAgICAgIHBsdWdpbi9jcHBfcGx1Z2luLmNjCisgICAgKQorICAgIGFkZF9leGVjdXRhYmxlKHRocmlmdC1nZW4tbXljcHAgJHt0aHJpZnQtZ2VuLW15Y3BwX1NPVVJDRVN9KQorICAgIGlmKFdJVEhfU0hBUkVEX0xJQiBBTkQgTk9UIE1TVkMpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtZ2VuLW15Y3BwIHRocmlmdGMpCisgICAgZWxzZSgpCisgICAgICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtZ2VuLW15Y3BwIHRocmlmdGNfc3RhdGljIHRocmlmdF9zdGF0aWMpCisgICAgZW5kaWYoKQorCisgICAgaWYoQ01BS0VfQlVJTERfVFlQRSBTVFJFUVVBTCAiRGVidWciKQorICAgICAgICBzZXQoQlVJTERUWVBFICJEZWJ1ZyIpCisgICAgZWxzZSgpCisgICAgICAgICMgUmVsV2l0aERlYkluZm8gZ2VuZXJhdGVzIGJpbmFyaWVzIGluICJSZWxlYXNlIiBkaXJlY3RvcnkgdG9vCisgICAgICAgIHNldChCVUlMRFRZUEUgIlJlbGVhc2UiKQorICAgIGVuZGlmKCkKKworICAgIHNldF9kaXJlY3RvcnlfcHJvcGVydGllcyhQUk9QRVJUSUVTCisgICAgICAgIEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFUyBnZW4tY3BwCisgICAgICAgIEFERElUSU9OQUxfTUFLRV9DTEVBTl9GSUxFUyBnZW4tbXljcHApCisKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwKQorICAgIGZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1teWNwcCkKKyAgICBhZGRfdGVzdChOQU1FIFBsdWdpbkludGVncmF0aW9uVGVzdAorICAgICAgICAgICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfQorICAgICAgICAgICAgICAgICAtRFRIUklGVF9DT01QSUxFUj0ke1RIUklGVF9DT01QSUxFUn0KKyAgICAgICAgICAgICAgICAgLURCSU5ESVI9JHtDTUFLRV9SVU5USU1FX09VVFBVVF9ESVJFQ1RPUll9CisgICAgICAgICAgICAgICAgIC1EQlVJTERUWVBFPSR7QlVJTERUWVBFfQorICAgICAgICAgICAgICAgICAtRENVUkRJUj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICAgICAgICAgICAgICAgLURTUkNESVI9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgICAgICAgICAgICAgIC1QICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jcHBfcGx1Z2luX3Rlc3QuY21ha2UpCitlbmRpZigpCisKK2ZpbGUoR0xPQiBLRVlXT1JEX1NBTVBMRVMgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9rZXl3b3JkLXNhbXBsZXMvKi50aHJpZnQiKQorZm9yZWFjaChMQU5HICR7dGhyaWZ0X2NvbXBpbGVyX0xBTkdTfSkKKyAgICBmb3JlYWNoKFNBTVBMRSAke0tFWVdPUkRfU0FNUExFU30pCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRklMRU5BTUUgJHtTQU1QTEV9IE5BTUVfV0UpCisgICAgICAgIGFkZF90ZXN0KE5BTUUgIiR7TEFOR31fJHtGSUxFTkFNRX0iCisgICAgICAgICAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiAke0xBTkd9ICR7U0FNUExFfSkKKyAgICAgICAgc2V0X3Rlc3RzX3Byb3BlcnRpZXMoIiR7TEFOR31fJHtGSUxFTkFNRX0iIFBST1BFUlRJRVMKKyAgICAgICAgICAgIFBBU1NfUkVHVUxBUl9FWFBSRVNTSU9OICJDYW5ub3QgdXNlIHJlc2VydmVkIGxhbmd1YWdlIGtleXdvcmQiKQorICAgIGVuZGZvcmVhY2goKQorZW5kZm9yZWFjaCgpCisKKworZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCBSRVFVSVJFRCkKK2FkZF90ZXN0KE5BTUUgU3RhbGVuZXNzQ2hlY2tUZXN0IENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weSAke1RIUklGVF9DT01QSUxFUn0pCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmM5MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMKKyMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyMgZGV0YWlscy4KKworQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cworCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvc3JjCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQorQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworCitpZiBXSVRIX1BMVUdJTgorY2hlY2tfUFJPR1JBTVMgPSBwbHVnaW50ZXN0CisKK25vaW5zdF9QUk9HUkFNUyA9IHRocmlmdC1nZW4tbXljcHAKKworYWxsLWxvY2FsOiB0aHJpZnQtZ2VuLWJpbmNhdAorCitBTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9zcmMKKworcGx1Z2ludGVzdF9TT1VSQ0VTID0gcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYworcGx1Z2ludGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvbGlidGhyaWZ0Yy5sYQorCit0aHJpZnRfZ2VuX215Y3BwX1NPVVJDRVMgPSBwbHVnaW4vY3BwX3BsdWdpbi5jYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjCit0aHJpZnRfZ2VuX215Y3BwX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcCAtSSQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZQordGhyaWZ0X2dlbl9teWNwcF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvbGlidGhyaWZ0Yy5sYQorCitjcHBfcGx1Z2luX3Rlc3Quc2g6IHRocmlmdC1nZW4tbXljcHAKKwordGhyaWZ0LWdlbi1iaW5jYXQ6CisJY3AgYmluY2F0LnNoICRACisJY2htb2QgNzU1ICRACisKK3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaDogdGhyaWZ0LWdlbi1iaW5jYXQKKworVEVTVFMgPSAkKGNoZWNrX1BST0dSQU1TKSBjcHBfcGx1Z2luX3Rlc3Quc2ggcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yZiBnZW4tY3BwIGdlbi1teWNwcCBnZW4tYmluY2F0IHRocmlmdC1nZW4tYmluY2F0CisKK2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2ggYi9jb21waWxlci9jcHAvdGVzdC9iaW5jYXQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzdmOTA3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9iYXNoCisKK2V4ZWMgL2Jpbi9jYXQKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTg0YWI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0CkBAIC0wLDAgKzEsMTggQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgorCitzdHJ1Y3QgYV9zdHJ1Y3QgeworICAxOiBib29sIGltX3RydWUsCisgIDI6IGJvb2wgaW1fZmFsc2UsCisgIDM6IGk4IGFfYml0ZSwKKyAgNDogaTE2IGludGVnZXIxNiwKKyAgNTogaTMyIGludGVnZXIzMiwKKyAgNjogaTY0IGludGVnZXI2NCwKKyAgNzogZG91YmxlIGRvdWJsZV9wcmVjaXNpb24sCisgIDg6IHN0cmluZyBzb21lX2NoYXJhY3RlcnMsCisgIDk6IHN0cmluZyB6b21nX3VuaWNvZGUsCisgIDEwOiBib29sIHdoYXRfd2hvLAorfQorCitzZXJ2aWNlIEFTZXJ2aWNlIHsKKyAgaTMyIGFfcHJvY2VkdXJlKDE6IGkzMiBhcmcpCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdhZjdiCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkaW5nLnRocmlmdApAQCAtMCwwICsxLDcgQEAKK2luY2x1ZGUgIkluY2x1ZGVkLnRocmlmdCIKKworY29uc3Qgc3RyaW5nIHMgPSAic3RyaW5nIgorCitzdHJ1Y3QgQlN0cnVjdCB7CisgIDE6IEluY2x1ZGVkLmFfc3RydWN0IG9uZV9vZl9lYWNoCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWMzMDFmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvU2luZ2xlLnRocmlmdApAQCAtMCwwICsxIEBACitjb25zdCBzdHJpbmcgZm9vID0gImJhciIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weSBiL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YjExZGZmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5CkBAIC0wLDAgKzEsMTQyIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RTdGFsZW5lc3NDaGVjayh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBDVVJSRU5UX0RJUl9QQVRIID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQorICAgIFRIUklGVF9FWEVDVVRBQkxFX1BBVEggPSBOb25lCisgICAgU0lOR0xFX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIlNpbmdsZS50aHJpZnQiKQorICAgIElOQ0xVRElOR19USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJJbmNsdWRpbmcudGhyaWZ0IikKKyAgICBJTkNMVURFRF9USFJJRlRfRklMRV9QQVRIID0gb3MucGF0aC5qb2luKENVUlJFTlRfRElSX1BBVEgsICJJbmNsdWRlZC50aHJpZnQiKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX3NpbmdsZV90aHJpZnRfZmlsZV93aXRob3V0X2NoYW5nZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFtUZXN0U3RhbGVuZXNzQ2hlY2suU0lOR0xFX1RIUklGVF9GSUxFX1BBVEhdCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHVzZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJTaW5nbGVfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbih1c2VkX2ZpbGVfcGF0aCkpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZSh1c2VkX2ZpbGVfcGF0aCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9tb2RpZmljYXRpb25fdGltZSwgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisKKyAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgZGVmIHRlc3Rfc3RhbGVuZXNzX2NoZWNrX29mX3NpbmdsZV90aHJpZnRfZmlsZV93aXRoX2NoYW5nZWRfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFtUZXN0U3RhbGVuZXNzQ2hlY2suU0lOR0xFX1RIUklGVF9GSUxFX1BBVEhdCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIHVzZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJTaW5nbGVfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbih1c2VkX2ZpbGVfcGF0aCkpCisgICAgICAgIHVzZWRfZmlsZSA9IG9wZW4odXNlZF9maWxlX3BhdGgsICJyIikKKyAgICAgICAgZmlyc3RfY29udGVudHMgPSB1c2VkX2ZpbGUucmVhZCgpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgImEiKQorICAgICAgICB1c2VkX2ZpbGUud3JpdGUoIlxuLyogVGhpcyBpcyBhIGNvbW1lbnQgKi9cbiIpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZSh1c2VkX2ZpbGVfcGF0aCkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBzZWNvbmRfY29udGVudHMgPSB1c2VkX2ZpbGUucmVhZCgpCisgICAgICAgIHVzZWRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHNlY29uZF9tb2RpZmljYXRpb25fdGltZSwgZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfY29udGVudHMsIHNlY29uZF9jb250ZW50cykKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2ZfaW5jbHVkZWRfZmlsZShzZWxmKToKKyAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1UZXN0U3RhbGVuZXNzQ2hlY2suQ1VSUkVOVF9ESVJfUEFUSCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgIkluY2x1ZGVkLnRocmlmdCIpCisgICAgICAgIHRlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgIkluY2x1ZGluZy50aHJpZnQiKQorCisgICAgICAgIHNodXRpbC5jb3B5MihUZXN0U3RhbGVuZXNzQ2hlY2suSU5DTFVERURfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRlZF9maWxlX3BhdGgpCisgICAgICAgIHNodXRpbC5jb3B5MihUZXN0U3RhbGVuZXNzQ2hlY2suSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEgsIHRlbXBfaW5jbHVkaW5nX2ZpbGVfcGF0aCkKKworICAgICAgICBjb21tYW5kID0gW1Rlc3RTdGFsZW5lc3NDaGVjay5USFJJRlRfRVhFQ1VUQUJMRV9QQVRILCAiLWdlbiIsICJjcHAiLCAiLXJlY3Vyc2UiLCAiLW8iLCB0ZW1wX2Rpcl0KKyAgICAgICAgY29tbWFuZCArPSBbdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoXQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJJbmNsdWRlZF9jb25zdGFudHMuY3BwIikKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiZ2VuLWNwcCIsICJJbmNsdWRpbmdfY29uc3RhbnRzLmNwcCIpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlID0gb3Blbih0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCwgImEiKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUud3JpdGUoIlxuY29uc3QgaTMyIGFuX2ludGVnZXIgPSA0MlxuIikKKyAgICAgICAgdGVtcF9pbmNsdWRlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisgICAgICAgIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKKyAgICAgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGluZ19jb25zdGFudHNfY3BwX3NlY29uZF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0U3RhbGVuZXNzQ2hlY2spKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBUaGUgcGF0aCBvZiBUaHJpZnQgY29tcGlsZXIgIGlzICBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHRlc3Qgc2NyaXB0LgorICAgICMgUmVtb3ZlIGl0IHRvIG5vdCBjb25mdXNlIHRoZSB1bml0IHRlc3RpbmcgZnJhbWV3b3JrCisgICAgVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEggPSBzeXMuYXJndlstMV0KKyAgICBkZWwgc3lzLmFyZ3ZbLTFdCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5jbWFrZSBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE4MjgxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvY3BwX3BsdWdpbl90ZXN0LmNtYWtlCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q1VSRElSfS9nZW4tY3BwKQorZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC1yIC1vdXQgJHtDVVJESVJ9L2dlbi1jcHAgLWdlbiBjcHAgJHtTUkNESVJ9Ly4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQpCitpZihFWElUQ09ERSkKKyAgbWVzc2FnZShGQVRBTF9FUlJPUiAiRkFJTEVEOiBcIiR7QVJHVn1cIjogXCIke0VYSVRDT0RFfVwiIikKK2VuZGlmKCkKK2lmKFdJTjMyKQorICAgIHNldChFTlZ7UEFUSH0gIiR7QklORElSfS8ke0JVSUxEVFlQRX07JHtCSU5ESVJ9OyRFTlZ7UEFUSH0iKQorZWxzZSgpCisgICAgc2V0KEVOVntQQVRIfSAiJHtCSU5ESVJ9OiRFTlZ7UEFUSH0iKQorZW5kaWYoKQorCitmaWxlKE1BS0VfRElSRUNUT1JZICR7Q1VSRElSfS9nZW4tbXljcHApCitleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLXIgLW91dCAke0NVUkRJUn0vZ2VuLW15Y3BwIC1nZW4gbXljcHAgJHtTUkNESVJ9Ly4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgUkVTVUxUX1ZBUklBQkxFIEVYSVRDT0RFKQoraWYoRVhJVENPREUpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZBSUxFRDogXCIke0VYSVRDT0RFfVwiIikKK2VuZGlmKCkKKworZmluZF9wcm9ncmFtKERJRkYgZGlmZikKK2lmKERJRkYpCisgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7RElGRn0gLXVyTiBnZW4tY3BwIGdlbi1teWNwcCBSRVNVTFRfVkFSSUFCTEUgRVhJVENPREUpCisgIGlmKEVYSVRDT0RFKQorICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkZBSUxFRDogXCIke0VYSVRDT0RFfVwiIikKKyAgZW5kaWYoKQorZWxzZSgpCisgICAgbWVzc2FnZShXQVJOSU5HICJkaWZmIGV4ZWN1dGFibGUgaXMgbm90IGF2YWlsYWJsZS4gTm90IHZhbGlkYXRpbmcgcGx1Z2luLWdlbmVyYXRlZCBjb2RlLiIpCitlbmRpZigpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3Quc2ggYi9jb21waWxlci9jcHAvdGVzdC9jcHBfcGx1Z2luX3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGRiMmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2NwcF9wbHVnaW5fdGVzdC5zaApAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgbWFrZS4KK3NldCAtZQorbWtkaXIgLXAgZ2VuLWNwcCBnZW4tbXljcHAKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtb3V0IGdlbi1jcHAgLWdlbiBjcHAgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1vdXQgZ2VuLW15Y3BwIC1nZW4gbXljcHAgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdAorZGlmZiAtdXJOIGdlbi1jcHAgZ2VuLW15Y3BwCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1ZTRhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9jb25zdDFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitjb25zdCBib29sIHJldHVybiA9IDAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4MzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMiBAQAorZW51bSByZXR1cm4geworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmNhYThlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitlbnVtIGVudW1fbmFtZSB7CisgIHJldHVybgorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkYjMzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorZXhjZXB0aW9uIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2V4Y2VwdGlvbjJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzYzM1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitleGNlcHRpb24gZXhjZXB0aW9uX25hbWUgeworICAxOiByZXF1aXJlZCBpOCByZXR1cm4KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4NmEzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3NlcnZpY2UgcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNzMzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgYm9vbCBmdW5jdGlvbl9uYW1lKDE6IGkzMiByZXR1cm4pCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlM19yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGQ5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgdm9pZCByZXR1cm4oKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTRfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc4N2RmCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQKQEAgLTAsMCArMSw1IEBACitleGNlcHRpb24gZXhjZXB0aW9uX25hbWUge30KKworc2VydmljZSBzZXJ2aWNlX25hbWUgeworICB2b2lkIGZ1bmN0aW9uX25hbWUoKSB0aHJvd3MgKCAxOiBleGNlcHRpb25fbmFtZSByZXR1cm4pCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0MV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODJiOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitzdHJ1Y3QgcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc3RydWN0Ml9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDcwMGQxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3N0cnVjdCBzdHJ1Y3RfbmFtZSB7CisgIDE6IHJlcXVpcmVkIGJvb2wgcmV0dXJuID0gMQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdHlwZWRlZjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU5YmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAordHlwZWRlZiBib29sIHJldHVybgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OGRmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24xX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAordW5pb24gcmV0dXJuIHt9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxOWQxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjJfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDMgQEAKK3VuaW9uIHVuaW9uX25hbWUgeworICAxOiBvcHRpb25hbCBib29sIHJldHVybj0xCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzhkODEyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oIgorI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgiCisjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxib29zdC9wcmVwcm9jZXNzb3IuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvaW5jbHVkZWQvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3BhcmFtZXRlcml6ZWRfdGVzdC5ocHA+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBib29zdDo6dW5pdF90ZXN0OworCituYW1lc3BhY2UgdGVzdF9kYXRhIHsKKyNkZWZpbmUgVF9URVNUX1RZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZ3JhbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV92YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSkpCisjZGVmaW5lIFRfREVMRVRFX1RFU1REQVRBKHIsIGQsIGVsZW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoc3RkOjp2ZWN0b3I8dF8jI2VsZW0qPjo6cmV2ZXJzZV9pdGVyYXRvciBpdCA9IGVsZW0jI3MucmJlZ2luKCk7IGl0ICE9IGVsZW0jI3MucmVuZCgpOyBpdCsrKSBcCisgICAgZGVsZXRlICppdDsKKyNkZWZpbmUgVF9ERUNMX1RFU1REQVRBKHIsIGQsIGVsZW0pIHN0YXRpYyBzdGQ6OnZlY3RvcjwgOjp0XyMjZWxlbSo+IGVsZW0jI3M7CitCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfREVDTF9URVNUREFUQSwgXywgVF9URVNUX1RZUEVTKQorI3VuZGVmIFRfREVDTF9URVNUREFUQQorCitib29sIGhhc19kYXRhID0gZmFsc2U7Cit2b2lkIGNsZWFudXAoKSB7CisgIGlmIChoYXNfZGF0YSkgeworICAgIGhhc19kYXRhID0gZmFsc2U7CisgICAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUX0RFTEVURV9URVNUREFUQSwgXywgVF9URVNUX1RZUEVTKQorICB9Cit9CisKK3ZvaWQgaW5pdF9wcm9ncmFtcygpIHsKKyAgcHJvZ3JhbXMucHVzaF9iYWNrKG5ldyB0X3Byb2dyYW0oInByb2cgcGF0aCIsICJwcm9nX25hbWUiKSk7Cit9CisKK3ZvaWQgaW5pdF9iYXNlX3R5cGVzKCkgeworICBiYXNlX3R5cGVzLnB1c2hfYmFjayhuZXcgOjp0X2Jhc2VfdHlwZSgibmFtZTAiLCA6OnRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUxIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWUyIiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKSk7CisgIGJhc2VfdHlwZXMucHVzaF9iYWNrKG5ldyA6OnRfYmFzZV90eXBlKCJuYW1lMyIsIDo6dF9iYXNlX3R5cGU6OlRZUEVfSTgpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU0IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JMTYpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU1IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU2IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpKTsKKyAgYmFzZV90eXBlcy5wdXNoX2JhY2sobmV3IDo6dF9iYXNlX3R5cGUoIm5hbWU3IiwgOjp0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpKTsKK30KKwordm9pZCBpbml0X2NvbnN0X3ZhbHVlcygpIHsKKyAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9jb25zdF92YWx1ZSg0MikpOworICBjb25zdF92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2NvbnN0X3ZhbHVlKCJmb28iKSk7CisgIHsKKyAgICB0X2NvbnN0X3ZhbHVlKiB4ID0gbmV3IHRfY29uc3RfdmFsdWU7CisgICAgeC0+c2V0X2RvdWJsZSgzLjE0MTUpOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfaWRlbnRpZmllcigiYmFyIik7CisgICAgeC0+c2V0X2VudW0oZW51bXNbMF0pOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KKyAgeworICAgIHRfY29uc3RfdmFsdWUqIHggPSBuZXcgdF9jb25zdF92YWx1ZTsKKyAgICB4LT5zZXRfbWFwKCk7CisgICAgeC0+YWRkX21hcChjb25zdF92YWx1ZXNbMF0sIGNvbnN0X3ZhbHVlc1sxXSk7CisgICAgeC0+YWRkX21hcChjb25zdF92YWx1ZXNbMV0sIGNvbnN0X3ZhbHVlc1swXSk7CisgICAgY29uc3RfdmFsdWVzLnB1c2hfYmFjayh4KTsKKyAgfQorICB7CisgICAgdF9jb25zdF92YWx1ZSogeCA9IG5ldyB0X2NvbnN0X3ZhbHVlOworICAgIHgtPnNldF9saXN0KCk7CisgICAgeC0+YWRkX2xpc3QoY29uc3RfdmFsdWVzWzBdKTsKKyAgICB4LT5hZGRfbGlzdChjb25zdF92YWx1ZXNbMV0pOworICAgIGNvbnN0X3ZhbHVlcy5wdXNoX2JhY2soeCk7CisgIH0KK30KKwordm9pZCBpbml0X2NvbnN0cygpIHsKKyAgLy8gYmFzZV90eXBlL2VudW0gaW5kZXhlcyBmb3IgdGhpcyBhbmQgb3RoZXIgdGVzdHMgYXJlIGFyYml0cmFyeQorICBjb25zdHMucHVzaF9iYWNrKG5ldyB0X2NvbnN0KGJhc2VfdHlwZXNbMl0sICJhYWEiLCBjb25zdF92YWx1ZXNbMF0pKTsKKyAgY29uc3RzLmJhY2soKS0+c2V0X2RvYygic29lbSBkb2MiKTsKKyAgY29uc3RzLnB1c2hfYmFjayhuZXcgdF9jb25zdChiYXNlX3R5cGVzWzNdLCAiYmJiIiwgY29uc3RfdmFsdWVzWzFdKSk7Cit9CisKK3ZvaWQgaW5pdF9lbnVtX3ZhbHVlcygpIHsKKyAgZW51bV92YWx1ZXMucHVzaF9iYWNrKG5ldyB0X2VudW1fdmFsdWUoIlZBTDEiLCAxMSkpOworICBlbnVtX3ZhbHVlcy5iYWNrKCktPnNldF9kb2MoImVudW0gZG9jIDEiKTsKKyAgZW51bV92YWx1ZXMuYmFjaygpLT5hbm5vdGF0aW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCJhbm5vMSIsICJ2YWwxIikpOworCisgIGVudW1fdmFsdWVzLnB1c2hfYmFjayhuZXcgdF9lbnVtX3ZhbHVlKCJWQUwyIiwgMjIpKTsKK30KKwordm9pZCBpbml0X2VudW1zKCkgeworICBlbnVtcy5wdXNoX2JhY2sobmV3IHRfZW51bShwcm9ncmFtc1swXSkpOworICBlbnVtcy5iYWNrKCktPnNldF9kb2MoImVudW0gZG9jIDEiKTsKKyAgZW51bXMuYmFjaygpLT5hbm5vdGF0aW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCJhbm5vMSIsICJ2YWwxIikpOworICBlbnVtcy5iYWNrKCktPnNldF9uYW1lKCJmb29vIik7CisgIGVudW1zLmJhY2soKS0+YXBwZW5kKGVudW1fdmFsdWVzWzBdKTsKKyAgZW51bXMuYmFjaygpLT5hcHBlbmQoZW51bV92YWx1ZXNbMV0pOworfQorCit2b2lkIGluaXRfbGlzdHMoKSB7CisgIGxpc3RzLnB1c2hfYmFjayhuZXcgdF9saXN0KGVudW1zWzBdKSk7CisgIGxpc3RzLnB1c2hfYmFjayhuZXcgdF9saXN0KGJhc2VfdHlwZXNbNV0pKTsKKyAgbGlzdHMuYmFjaygpLT5zZXRfY3BwX25hbWUoImxpc3RfY3BwX25hbWVfMSIpOworfQordm9pZCBpbml0X3NldHMoKSB7CisgIHNldHMucHVzaF9iYWNrKG5ldyB0X3NldChiYXNlX3R5cGVzWzRdKSk7CisgIHNldHMucHVzaF9iYWNrKG5ldyB0X3NldChlbnVtc1swXSkpOworICBzZXRzLmJhY2soKS0+c2V0X2NwcF9uYW1lKCJzZXRfY3BwX25hbWVfMSIpOworfQordm9pZCBpbml0X21hcHMoKSB7CisgIG1hcHMucHVzaF9iYWNrKG5ldyB0X21hcChiYXNlX3R5cGVzWzRdLCBiYXNlX3R5cGVzWzFdKSk7CisgIG1hcHMucHVzaF9iYWNrKG5ldyB0X21hcChiYXNlX3R5cGVzWzVdLCBlbnVtc1swXSkpOworICBtYXBzLmJhY2soKS0+c2V0X2NwcF9uYW1lKCJtYXBfY3BwX25hbWVfMSIpOworfQorCit2b2lkIGluaXRfdHlwZWRlZnMoKSB7CisgIHR5cGVkZWZzLnB1c2hfYmFjayhuZXcgdF90eXBlZGVmKHByb2dyYW1zWzBdLCBiYXNlX3R5cGVzWzNdLCAiVkFMMSIpKTsKK30KK3ZvaWQgaW5pdF9maWVsZHMoKSB7CisgIGZpZWxkcy5wdXNoX2JhY2sobmV3IHRfZmllbGQoYmFzZV90eXBlc1sxXSwgImYxIikpOworICBmaWVsZHMuYmFjaygpLT5zZXRfcmVmZXJlbmNlKGZhbHNlKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX09QVElPTkFMKTsKKyAgZmllbGRzLnB1c2hfYmFjayhuZXcgdF9maWVsZChiYXNlX3R5cGVzWzJdLCAiZjIiLCA5KSk7CisgIGZpZWxkcy5iYWNrKCktPnNldF9yZWZlcmVuY2UodHJ1ZSk7CisgIGZpZWxkcy5wdXNoX2JhY2sobmV3IHRfZmllbGQoYmFzZV90eXBlc1szXSwgImYzIiwgMTEpKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3JlcSh0X2ZpZWxkOjpUX1JFUVVJUkVEKTsKKyAgZmllbGRzLmJhY2soKS0+c2V0X3ZhbHVlKGNvbnN0X3ZhbHVlc1swXSk7Cit9Cit2b2lkIGluaXRfc3RydWN0cygpIHsKKyAgc3RydWN0cy5wdXNoX2JhY2sobmV3IHRfc3RydWN0KHByb2dyYW1zWzBdLCAic3RydWN0MSIpKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMF0pOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1sxXSk7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgInVuaW9uMSIpKTsKKyAgc3RydWN0cy5iYWNrKCktPmFwcGVuZChmaWVsZHNbMF0pOworICBzdHJ1Y3RzLmJhY2soKS0+YXBwZW5kKGZpZWxkc1sxXSk7CisgIHN0cnVjdHMuYmFjaygpLT5zZXRfdW5pb24odHJ1ZSk7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgInhjZXB0MSIpKTsKKyAgc3RydWN0cy5iYWNrKCktPnNldF94Y2VwdGlvbih0cnVlKTsKK30KK3ZvaWQgaW5pdF9mdW5jdGlvbnMoKSB7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgImVycnMxIikpOworICB0X3N0cnVjdCogZXJyb3JzID0gc3RydWN0cy5iYWNrKCk7CisgIHN0cnVjdHMucHVzaF9iYWNrKG5ldyB0X3N0cnVjdChwcm9ncmFtc1swXSwgImFyZ3MxIikpOworICB0X3N0cnVjdCogYXJnbGlzdCA9IHN0cnVjdHMuYmFjaygpOworICBmdW5jdGlvbnMucHVzaF9iYWNrKG5ldyB0X2Z1bmN0aW9uKGJhc2VfdHlwZXNbMF0sICJmdW5jMSIsIGVycm9ycywgYXJnbGlzdCwgZmFsc2UpKTsKKyAgZnVuY3Rpb25zLnB1c2hfYmFjayhuZXcgdF9mdW5jdGlvbihiYXNlX3R5cGVzWzBdLCAiZnVuYzIiLCBlcnJvcnMsIGFyZ2xpc3QsIHRydWUpKTsKK30KK3ZvaWQgaW5pdF9zZXJ2aWNlcygpIHsKKyAgc2VydmljZXMucHVzaF9iYWNrKG5ldyB0X3NlcnZpY2UocHJvZ3JhbXNbMF0pKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfZG9jKCJzcnYxIGRvYyIpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9uYW1lKCJzcnYxIik7CisgIHNlcnZpY2VzLmJhY2soKS0+YWRkX2Z1bmN0aW9uKGZ1bmN0aW9uc1swXSk7CisgIHNlcnZpY2VzLmJhY2soKS0+YWRkX2Z1bmN0aW9uKGZ1bmN0aW9uc1sxXSk7CisKKyAgc2VydmljZXMucHVzaF9iYWNrKG5ldyB0X3NlcnZpY2UocHJvZ3JhbXNbMF0pKTsKKyAgc2VydmljZXMuYmFjaygpLT5zZXRfbmFtZSgic3J2MiIpOworICBzZXJ2aWNlcy5iYWNrKCktPnNldF9leHRlbmRzKHNlcnZpY2VzWzBdKTsKK30KKworc3RkOjp2ZWN0b3I8dF90eXBlKj4gdHlwZXM7Cit2b2lkIGluaXRfdHlwZXMoKSB7CisjZGVmaW5lIFRfQ09QWV9UWVBFUyh0eXBlKSBzdGQ6OmNvcHkodHlwZSMjcy5iZWdpbigpLCB0eXBlIyNzLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIodHlwZXMpKQorICBUX0NPUFlfVFlQRVMoYmFzZV90eXBlKTsKKyAgVF9DT1BZX1RZUEVTKGVudW0pOworICBUX0NPUFlfVFlQRVModHlwZWRlZik7CisgIFRfQ09QWV9UWVBFUyhzdHJ1Y3QpOworICBUX0NPUFlfVFlQRVMobGlzdCk7CisgIFRfQ09QWV9UWVBFUyhzZXQpOworICBUX0NPUFlfVFlQRVMobWFwKTsKKy8vIFRfQ09QWV9UWVBFUyhzZXJ2aWNlKTsKKyN1bmRlZiBUX0NPUFlfVFlQRVMKK30KKwordm9pZCBpbml0KCkgeworICBpZiAoIWhhc19kYXRhKSB7CisgICAgaGFzX2RhdGEgPSB0cnVlOworI2RlZmluZSBUX0lOSVRfVEVTVERBVEEociwgZCwgZWxlbSkgaW5pdF8jI2VsZW0jI3MoKTsKKyAgICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRfSU5JVF9URVNUREFUQSwgXywgVF9URVNUX1RZUEVTKQorICAgIGluaXRfdHlwZXMoKTsKKyN1bmRlZiBUX0lOSVRfVEVTVERBVEEKKyAgfQorfQorfQorc3RydWN0IEdsb2JhbEZpeHR1cmUgeworICB+R2xvYmFsRml4dHVyZSgpIHsgdGVzdF9kYXRhOjpjbGVhbnVwKCk7IH0KK307CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSkKKyNlbmRpZgorCit2b2lkIG1pZ3JhdGVfZ2xvYmFsX2NhY2hlKCkgeworICBwbHVnaW46OlR5cGVSZWdpc3RyeSByZWc7CisgIHBsdWdpbl9vdXRwdXQ6OmdldF9nbG9iYWxfY2FjaGUocmVnKTsKKyAgcGx1Z2luOjpzZXRfZ2xvYmFsX2NhY2hlKHJlZyk7CisgIHBsdWdpbl9vdXRwdXQ6OmNsZWFyX2dsb2JhbF9jYWNoZSgpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiByb3VuZF90cmlwKFQqIHQpIHsKKyAgdHlwZW5hbWUgcGx1Z2luOjpUb1R5cGU8VD46OnR5cGUgcDsKKyAgcGx1Z2luOjpjbGVhcl9nbG9iYWxfY2FjaGUoKTsKKyAgcGx1Z2luX291dHB1dDo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHBsdWdpbl9vdXRwdXQ6OmNvbnZlcnQodCwgcCk7CisgIG1pZ3JhdGVfZ2xvYmFsX2NhY2hlKCk7CisgIHJldHVybiBwbHVnaW46OmNvbnZlcnQocCk7Cit9CisKK3ZvaWQgdGVzdF9iYXNlX3R5cGUoOjp0X2Jhc2VfdHlwZSogc3V0KSB7CisgIHBsdWdpbjo6dF9iYXNlX3R5cGUgcDsKKyAgcGx1Z2luX291dHB1dDo6Y29udmVydChzdXQsIHApOworICBib29zdDo6c2NvcGVkX3B0cjwgOjp0X2Jhc2VfdHlwZT4gc3V0MihwbHVnaW46OmNvbnZlcnQocCkpOworCisjZGVmaW5lIFRIUklGVF9DSEVDSyhyLCBkYXRhLCBlbGVtKSBCT09TVF9QUF9FWFBBTkQoQk9PU1RfQ0hFQ0tfRVFVQUwoZGF0YSBlbGVtLCBzdXQyLT5lbGVtKSk7CisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc192b2lkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYm9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N0cmluZ19saXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYmluYXJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nX2VudW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19iYXNlX3R5cGUoKSkpKQorfQorCit2b2lkIHRlc3RfY29uc3RfdmFsdWUodF9jb25zdF92YWx1ZSogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfY29uc3RfdmFsdWU+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF90eXBlKCksIHN1dDItPmdldF90eXBlKCkpOworICBzd2l0Y2ggKHN1dC0+Z2V0X3R5cGUoKSkgeworI2RlZmluZSBUX0NPTlNUX1ZBTFVFX0NBU0UodHlwZSwgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIHRfY29uc3RfdmFsdWU6OnR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0XyMjbmFtZSgpLCBzdXQyLT5nZXRfIyNuYW1lKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJyZWFrCisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX0lOVEVHRVIsIGludGVnZXIpOworICAgIFRfQ09OU1RfVkFMVUVfQ0FTRShDVl9ET1VCTEUsIGRvdWJsZSk7CisgICAgVF9DT05TVF9WQUxVRV9DQVNFKENWX1NUUklORywgc3RyaW5nKTsKKyAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoQ1ZfSURFTlRJRklFUiwgaWRlbnRpZmllcik7CisjdW5kZWYgVF9DT05TVF9WQUxVRV9DQVNFCisgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgorICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X21hcCgpLnNpemUoKSwgc3V0Mi0+Z2V0X21hcCgpLnNpemUoKSk7CisgICAgeworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlLCB0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGU+IHN1dF92YWx1ZXM7CisgICAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3V0LT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gc3V0LT5nZXRfbWFwKCkuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgc3V0X3ZhbHVlc1tpdC0+Zmlyc3QtPmdldF90eXBlKCldID0gaXQtPnNlY29uZC0+Z2V0X3R5cGUoKTsKKyAgICAgIH0KKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSwgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlPiBzdXQyX3ZhbHVlczsKKyAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQyLT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gc3V0Mi0+Z2V0X21hcCgpLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHN1dDJfdmFsdWVzW2l0LT5maXJzdC0+Z2V0X3R5cGUoKV0gPSBpdC0+c2Vjb25kLT5nZXRfdHlwZSgpOworICAgICAgfQorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0X3ZhbHVlcy5iZWdpbigpLT5maXJzdCwgc3V0Ml92YWx1ZXMuYmVnaW4oKS0+Zmlyc3QpOworICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0X3ZhbHVlcy5iZWdpbigpLT5zZWNvbmQsIHN1dDJfdmFsdWVzLmJlZ2luKCktPnNlY29uZCk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX0xJU1Q6CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfbGlzdCgpLnNpemUoKSwgc3V0Mi0+Z2V0X2xpc3QoKS5zaXplKCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN1dC0+Z2V0X2xpc3QoKS5mcm9udCgpLT5nZXRfdHlwZSgpLCBzdXQyLT5nZXRfbGlzdCgpLmZyb250KCktPmdldF90eXBlKCkpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIEJPT1NUX0FTU0VSVChmYWxzZSk7CisgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCB0ZXN0X2NvbnN0KHRfY29uc3QqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjwgOjp0X2NvbnN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFsdWUoKS0+Z2V0X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCkpKSkKK30KKwordm9pZCB0ZXN0X2VudW1fdmFsdWUodF9lbnVtX3ZhbHVlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9lbnVtX3ZhbHVlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgzLCAoZ2V0X25hbWUoKSwgZ2V0X3ZhbHVlKCksIGdldF9kb2MoKSkpKQorfQorCit2b2lkIHRlc3RfZW51bSh0X2VudW0qIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjwgOjp0X2VudW0+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbWluX3ZhbHVlKCktPmdldF92YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tYXhfdmFsdWUoKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvbnN0YW50X2J5X3ZhbHVlKDExKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvbnN0YW50X2J5X25hbWUoIlZBTDEiKS0+Z2V0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpKSkpCit9CisKK3ZvaWQgdGVzdF9saXN0KHRfbGlzdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfbGlzdD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfZWxlbV90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2NwcF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+aGFzX2NwcF9uYW1lKCkpCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfY3BwX25hbWUoKSwgc3V0Mi0+Z2V0X2NwcF9uYW1lKCkpOworfQordm9pZCB0ZXN0X3NldCh0X3NldCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc2V0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldF9lbGVtX3R5cGUoKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfY3BwX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5oYXNfY3BwX25hbWUoKSkKKyAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9jcHBfbmFtZSgpLCBzdXQyLT5nZXRfY3BwX25hbWUoKSk7Cit9Cit2b2lkIHRlc3RfbWFwKHRfbWFwKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9tYXA+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2tleV90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZhbF90eXBlKCktPmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2NwcF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCkpKSkKKyAgaWYgKHN1dC0+aGFzX2NwcF9uYW1lKCkpCisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3V0LT5nZXRfY3BwX25hbWUoKSwgc3V0Mi0+Z2V0X2NwcF9uYW1lKCkpOworfQorCit2b2lkIHRlc3RfdHlwZWRlZih0X3R5cGVkZWYqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3R5cGVkZWY+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2RvYygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3N5bWJvbGljKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZm9yd2FyZF90eXBlZGVmKCkpKSkKK30KKwordm9pZCB0ZXN0X3R5cGUodF90eXBlKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF90eXBlPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc192b2lkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYmFzZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfYm9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3R5cGVkZWYoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19lbnVtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3RydWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jb250YWluZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2VydmljZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kb2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZSgpKSkpCit9CisKK3ZvaWQgdGVzdF9maWVsZCh0X2ZpZWxkKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9maWVsZD4gc3V0Mihyb3VuZF90cmlwKHN1dCkpOworCisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVEhSSUZUX0NIRUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1dC0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX1BQX1RVUExFX1RPX0xJU1QoNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXRfcmVxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3JlZmVyZW5jZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9rZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorICBpZiAoc3V0LT5nZXRfdmFsdWUoKSkgeworICAgIFRIUklGVF9DSEVDSygsIHN1dC0+LCBnZXRfdmFsdWUoKS0+Z2V0X3R5cGUoKSk7CisgIH0gZWxzZSB7CisgICAgQk9PU1RfQ0hFQ0soIXN1dDItPmdldF92YWx1ZSgpKTsKKyAgfQorICBpZiAoc3V0LT5nZXRfdHlwZSgpKSB7CisgICAgVEhSSUZUX0NIRUNLKCwgc3V0LT4sIGdldF90eXBlKCktPmdldF9uYW1lKCkpOworICB9IGVsc2UgeworICAgIEJPT1NUX0NIRUNLKCFzdXQyLT5nZXRfdHlwZSgpKTsKKyAgfQorfQordm9pZCB0ZXN0X3N0cnVjdCh0X3N0cnVjdCogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfc3RydWN0PiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgc3V0LT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfUFBfVFVQTEVfVE9fTElTVCg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3VuaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeGNlcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zdHJ1Y3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWUoKSkpKQorfQorCit2b2lkIHRlc3RfZnVuY3Rpb24odF9mdW5jdGlvbiogc3V0KSB7CisgIGJvb3N0OjpzY29wZWRfcHRyPHRfZnVuY3Rpb24+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKAorICAgICAgVEhSSUZUX0NIRUNLLAorICAgICAgc3V0LT4sCisgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDQsIChnZXRfZG9jKCksIGdldF9uYW1lKCksIGdldF9yZXR1cm50eXBlKCktPmdldF9uYW1lKCksIGlzX29uZXdheSgpKSkpCit9Cit2b2lkIHRlc3Rfc2VydmljZSh0X3NlcnZpY2UqIHN1dCkgeworICBib29zdDo6c2NvcGVkX3B0cjx0X3NlcnZpY2U+IHN1dDIocm91bmRfdHJpcChzdXQpKTsKKworICBCT09TVF9QUF9MSVNUX0ZPUl9FQUNIKFRIUklGVF9DSEVDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXQtPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDMsIChnZXRfZG9jKCksIGdldF9uYW1lKCksIGdldF9mdW5jdGlvbnMoKS5zaXplKCkpKSkKKyAgaWYgKHN1dC0+Z2V0X2V4dGVuZHMoKSkgeworICAgIFRIUklGVF9DSEVDSygsIHN1dC0+LCBnZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICBCT09TVF9DSEVDSyghc3V0Mi0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KK30KKwordm9pZCB0ZXN0X3Byb2dyYW0odF9wcm9ncmFtKiBzdXQpIHsKKyAgYm9vc3Q6OnNjb3BlZF9wdHI8dF9wcm9ncmFtPiBzdXQyKHJvdW5kX3RyaXAoc3V0KSk7CisKKyAgQk9PU1RfUFBfTElTVF9GT1JfRUFDSChUSFJJRlRfQ0hFQ0ssIHN1dC0+LCBCT09TVF9QUF9UVVBMRV9UT19MSVNUKDIsIChnZXRfZG9jKCksIGdldF9uYW1lKCkpKSkKK30KK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICB0ZXN0X2RhdGE6OmluaXQoKTsKKyAgdGVzdF9zdWl0ZSogdHMgPSBCT09TVF9URVNUX1NVSVRFKCJQbHVnaW5Db252ZXJzaW9uVGVzdCIpOworCisjZGVmaW5lIFRfVEVTVF9DQVNFKHIsIGQsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRzLT5hZGQoQk9PU1RfUEFSQU1fVEVTVF9DQVNFKHRlc3RfIyN0eXBlLCB0ZXN0X2RhdGE6OnR5cGUjI3MuYmVnaW4oKSwgdGVzdF9kYXRhOjp0eXBlIyNzLmVuZCgpKSk7CisgIEJPT1NUX1BQX0xJU1RfRk9SX0VBQ0goVF9URVNUX0NBU0UsIF8sIFRfVEVTVF9UWVBFUykKKyAgVF9URVNUX0NBU0UoXywgXywgdHlwZSkKKyN1bmRlZiBUX1RFU1RfQ0FTRQorICByZXR1cm4gdHM7Cit9CisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkuYWRkKGRvX2luaXRfdW5pdF90ZXN0X3N1aXRlKCkpOworICByZXR1cm4gdHJ1ZTsKK30KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLCBhcmdjLCBhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIHJldHVybiBkb19pbml0X3VuaXRfdGVzdF9zdWl0ZSgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY3BwX3BsdWdpbi5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jcHBfcGx1Z2luLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYzE5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY3BwX3BsdWdpbi5jYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbi5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHBsdWdpbiB7CisKK2NsYXNzIE15Q3BwR2VuZXJhdG9yIDogcHVibGljIEdlbmVyYXRvclBsdWdpbiB7CisgIHZpcnR1YWwgaW50IGdlbmVyYXRlKDo6dF9wcm9ncmFtKiBwcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucykgeworICAgIHRfZ2VuZXJhdG9yKiBnZW4gPSB0X2dlbmVyYXRvcl9yZWdpc3RyeTo6Z2V0X2dlbmVyYXRvcihwcm9ncmFtLCAiY3BwIiwgcGFyc2VkX29wdGlvbnMsICIiKTsKKyAgICBnZW4tPmdlbmVyYXRlX3Byb2dyYW0oKTsKKyAgICBkZWxldGUgZ2VuOworICAgIHJldHVybiAwOworICB9Cit9OworfQorfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGFwYWNoZTo6dGhyaWZ0OjpwbHVnaW46Ok15Q3BwR2VuZXJhdG9yIHA7CisgIHJldHVybiBwLmV4ZWMoYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2ggYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWI3YzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbl9zdGFiaWxpdHlfdGVzdC5zaApAQCAtMCwwICsxLDMyIEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgYnkgbWFrZS4KKyMKKyMgVGhpcyBmaWxlIHJ1bnMgdGhlIGNvbXBpbGVyIHR3aWNlLCB1c2luZyBhIHBsdWdpbiB0aGF0IGp1c3QgaW52b2tlcworIyAvYmluL2NhdCwgYW5kIGNvbXBhcmVzIHRoZSBvdXRwdXQuICBJZiBHZW5lcmF0b3JJbnB1dCBpcworIyBub25kZXRlcm1pbnNpdGljLCB5b3UnZCBleHBlY3QgdGhlIG91dHB1dCB0byBkaWZmZXIgZnJvbSBydW4tdG8tcnVuLgorIyBTbyB0aGlzIHRlc3RzIHRoYXQgaW4gZmFjdCwgdGhlIG91dHB1dCBpcyBzdGFibGUgZnJvbSBydW4tdG8tcnVuLgorc2V0IC1lCitta2RpciAtcCBnZW4tYmluY2F0CitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLWdlbiBiaW5jYXQgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCA+IGdlbi1iaW5jYXQvMS5zZXIKK1BBVEg9LjoiJFBBVEgiIC4uL3RocmlmdCAtciAtZ2VuIGJpbmNhdCAuLi8uLi8uLi90ZXN0L0luY2x1ZGUudGhyaWZ0ID4gZ2VuLWJpbmNhdC8yLnNlcgorZGlmZiAtLWJpbmFyeSBnZW4tYmluY2F0LzEuc2VyIGdlbi1iaW5jYXQvMi5zZXIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0X3BhcnNlci5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0X3BhcnNlci5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2ZTA5YS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvdGVzdF9wYXJzZXIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIFRlc3RzIHRoZSBwYXJzZXIsIGluZGVwZW5kZW50bHkgb2Ygd2hldGhlciBhbnkgZ2VuZXJhdG9ycwotIyBhcmUgY29ycmVjdCBvciB1c2VmdWwuCi0jIEN1cnJlbnRseSBvbmx5IHRlc3RzIHRoYXQgdmFsaWQgLnRocmlmdCBmaWxlcyBwYXJzZSBjbGVhbmx5LgotIyBEb2Vzbid0IHRlc3QgdGhhdCBjb3JyZWN0IGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBmcm9tIHRoZW0uCi0KLXNob3B0IC1zIGV4dGdsb2IKLQotTVlfRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iICkiICYmIHB3ZCApIgotUk9PVF9ESVI9YGNkICRNWV9ESVIvLi4vLi4vICYmIHB3ZGAKLVRFU1RfVEhSSUZUX0RJUj0ke1JPT1RfRElSfS90ZXN0Ci1USFJJRlRfRklMRVM9YGZpbmQgJHtURVNUX1RIUklGVF9ESVJ9IC10eXBlIGYgLW5hbWUgKi50aHJpZnQgISAtbmFtZSBCcm9rZW5Db25zdGFudHMudGhyaWZ0YAotCi1PVVRQVVRfRElSPWBta3RlbXAgLWQgLXQgdGVzdF90aHJpZnRfcGFyc2VyLlhYWFhYYAotCi1QQVNTPTAKLUZBSUw9MAotZm9yIGYgaW4gJHtUSFJJRlRfRklMRVN9OwotZG8KLSAgZWNobyAiUGFyc2luZyAke2Z9IgotICAke01ZX0RJUn0vdGhyaWZ0IC1vICR7T1VUUFVUX0RJUn0gLW5vd2FybiAtLWFsbG93LTY0Yml0LWNvbnN0cyAtLWdlbiBjcHAgJHtmfQotICBFWElUX0NPREU9JD8KLSAgaWYgWyAke0VYSVRfQ09ERX0gLWVxIDAgXTsgdGhlbgotICAgIGxldCBQQVNTPVBBU1MrMQotICBlbHNlCi0gICAgbGV0IEZBSUw9RkFJTCsxCi0gIGZpCi1kb25lCi1lY2hvCi1lY2hvICIke1BBU1N9IGZpbGVzIHBhcnNlZCBjb3JyZWN0bHkuICR7RkFJTH0gZmlsZXMgZmFpbGVkIHRvIHBhcnNlLiIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dCBiL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmIxMDBjCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMTUzIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjguMTIpCisKK3Byb2plY3QodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorCitzZXQoVEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVIKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4KKykKKworIyBkb24ndCBnZW5lcmF0ZSBaRVJPX0NIRUNLCitzZXQoQ01BS0VfU1VQUFJFU1NfUkVHRU5FUkFUSU9OIHRydWUpCisKK2NvbmZpZ3VyZV9maWxlKCR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdmVyc2lvbi5oLmluICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oKQoraWYoTVNWQykKKyAgICAjIFRoZSB3aW5mbGV4Ymlzb24gZ2VuZXJhdG9yIG91dHB1dHMgc29tZSBtYWNyb3MgdGhhdCBjb25mbGljdCB3aXRoIHRoZSBWaXN1YWwgU3R1ZGlvIDIwMTAgY29weSBvZiBzdGRpbnQuaAorICAgICMgVGhpcyBtaWdodCBiZSBmaXhlZCBpbiBsYXRlciB2ZXJzaW9ucyBvZiBWaXN1YWwgU3R1ZGlvLCBidXQgYW4gZWFzeSBzb2x1dGlvbiBpcyB0byBpbmNsdWRlIHN0ZGludC5oIGZpcnN0CisgICAgaWYoSEFWRV9TVERJTlRfSCkKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKKworZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCitmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCisKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKworIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKK0JJU09OX1RBUkdFVCh0aHJpZnR5ICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0eS55eSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MpCitGTEVYX1RBUkdFVCh0aHJpZnRsICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvdGhyaWZ0bC5sbCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MpCitBRERfRkxFWF9CSVNPTl9ERVBFTkRFTkNZKHRocmlmdGwgdGhyaWZ0eSkKKworc2V0KHBhcnNlX1NPVVJDRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdGwuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuaGgKKykKKworYWRkX2xpYnJhcnkocGFyc2UgU1RBVElDICR7cGFyc2VfU09VUkNFU30pCisKKyMgVGhyaWZ0IGNvbXBpbGVyIHRlc3RzCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzCispCisKKyMgeW91IGNhbiBhZGQgc29tZSBmaWxlcyBtYW51YWxseSB0aGVyZSAKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMKKyAgICAjIHRlc3RzIGZpbGUgdG8gYXZvaWQgbWFpbiBpbiBldmVyeSB0ZXN0IGZpbGUKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdHNfbWFpbi5jYworKQorCisjIHNldCB2YXJpYWJsZSBmb3IgdGVzdHMgc291cmNlcyAtIHdpbGwgYmUgZmlsbGVkIGxhdGVyCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVMKKykKKworc2V0KHRocmlmdF9jb21waWxlcl9TT1VSQ0VTCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9sb2dnaW5nLmNjICMgd2UgdXNlIGxvZ2dpbmcgaW5zdGVhZCBvZiBtYWluIHRvIGF2b2lkIGJyZWFraW5nIGNvbXBpbGxhdGlvbiAoMiBtYWluIHYpCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvY29tbW9uLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmNjCisgICAgJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9wYXJzZS9wYXJzZS5jYworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdmVyc2lvbi5oCispCisKKyMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQorIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKK21hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQorICAgIHN0cmluZyhUT1VQUEVSICJUSFJJRlRfQ09NUElMRVJfJHtuYW1lfSIgZW5hYmxlcikKKyAgICBzZXQoc3JjICIke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfJHtuYW1lfV9nZW5lcmF0b3IuY2MiKQorICAgIG9wdGlvbigke2VuYWJsZXJ9ICR7ZGVzY3JpcHRpb259ICR7aW5pdGlhbH0pCisgICAgaWYoJHtlbmFibGVyfSkKKyAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0X2NvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBmaWxlKEdMT0IgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVMKKyAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtuYW1lfS8qLmMqIgorICAgICAgICAgICAgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8ke25hbWV9LyoudGhyaWZ0IgorICAgICAgICApCisgICAgZW5kaWYoKQorZW5kbWFjcm8oKQorCisjIFRoZSBmb2xsb3dpbmcgY29tcGlsZXIgd2l0aCB1bml0IHRlc3RzIGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkCitUSFJJRlRfQUREX0NPTVBJTEVSKGNfZ2xpYiAgIkVuYWJsZSBjb21waWxlciBmb3IgQyB3aXRoIEdsaWIiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY3BwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDKysiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIiAgIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoYXMzICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBBY3Rpb25TY3JpcHQgMyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkYXJ0ICAgICJFbmFibGUgY29tcGlsZXIgZm9yIERhcnQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaGF4ZSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXhlIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNzaGFycCAgIkVuYWJsZSBjb21waWxlciBmb3IgQyMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIobmV0Y29yZSAiRW5hYmxlIGNvbXBpbGVyIGZvciAuTkVUIENvcmUiIE9OKQorVEhSSUZUX0FERF9DT01QSUxFUihweSAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFB5dGhvbiAyLjAiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocmIgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdWJ5IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHBlcmwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUGVybCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihwaHAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBIUCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihlcmwgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEVybGFuZyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjb2NvYSAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIE9iamVjdGl2ZS1DIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN3aWZ0ICAgIkVuYWJsZSBjb21waWxlciBmb3IgQ29jb2EgU3dpZnQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoc3QgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBTbWFsbHRhbGsiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIob2NhbWwgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBPQ2FtbCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihocyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEhhc2tlbGwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoeHNkICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYU0QiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaHRtbCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIVE1MIERvY3VtZW50YXRpb24iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoanMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhU2NyaXB0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzb24gICAgIkVuYWJsZSBjb21waWxlciBmb3IgSlNPTiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqYXZhbWUgICJFbmFibGUgY29tcGlsZXIgZm9yIEphdmEgTUUiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZGVscGhpICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEZWxwaGkiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZ28gICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHbyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihkICAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEQiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIobHVhICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBMdWEiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZ3YgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBHcmFwaFZpeiIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihycyAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFJ1c3QiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoeG1sICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYTUwiIE9GRikKKworIyBUaHJpZnQgaXMgbG9va2luZyBmb3IgaW5jbHVkZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeQorIyB3ZSBhbHNvIGFkZCB0aGUgY3VycmVudCBiaW5hcnkgZGlyZWN0b3J5IGZvciBnZW5lcmF0ZWQgZmlsZXMKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9ICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY2F0Y2gpCisKK2FkZF9saWJyYXJ5KHRocmlmdF9jb21waWxlciAke3RocmlmdF9jb21waWxlcl9TT1VSQ0VTfSkKKworI2xpbmsgcGFyc2UgbGliIHRvIHRocmlmdF9jb21waWxlciBsaWIKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnRfY29tcGlsZXIgcGFyc2UpCisKKyMgYWRkIHRlc3RzIGV4ZWN1dGFibGUKK2FkZF9leGVjdXRhYmxlKHRocmlmdF9jb21waWxlcl90ZXN0cyAke3RocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFU30gJHt0aHJpZnRfY29tcGlsZXJfdGVzdHNfU09VUkNFU30pCisKKyMgaWYgZ2VuZXJhdGVzIGZvciBWaXN1YWwgU3R1ZGlvIHNldCB0aHJpZnRfY29tcGlsZXJfdGVzdHMgYXMgZGVmYXVsdCBwcm9qZWN0CitpZihNU1ZDKQorICAgIHNldF9wcm9wZXJ0eShUQVJHRVQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRZIFZTX1NUQVJUVVBfUFJPSkVDVCB0aHJpZnRfY29tcGlsZXJfdGVzdHMpCitlbmRpZigpCisKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnRfY29tcGlsZXJfdGVzdHMpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnRfY29tcGlsZXJfdGVzdHMgdGhyaWZ0X2NvbXBpbGVyKQorCitlbmFibGVfdGVzdGluZygpCithZGRfdGVzdChOQU1FIFRocmlmdFRlc3RzIENPTU1BTkQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9SRUFETUUubWQgYi9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmU0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsODggQEAKKyMgQnVpbGQgYW5kIHJ1biBjb21waWxlciB0ZXN0cyB1c2luZyBDTWFrZQorCis8IS0tIFRPQyAtLT4KKworLSBbQnVpbGQgYW5kIHJ1biBjb21waWxlciB0ZXN0cyB1c2luZyBDTWFrZV0oI2J1aWxkLWFuZC1ydW4tY29tcGlsZXItdGVzdHMtdXNpbmctY21ha2UpCisgICAgLSBbR2VuZXJhbCBpbmZvcm1hdGlvbl0oI2dlbmVyYWwtaW5mb3JtYXRpb24pCisgICAgLSBbSG93IHRvIGFkZCB5b3VyIHRlc3RzXSgjaG93LXRvLWFkZC15b3VyLXRlc3RzKQorICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdHMgb24gVW5peC1saWtlIHN5c3RlbXNdKCNidWlsZC1hbmQtcnVuLXRlc3RzLW9uLXVuaXgtbGlrZS1zeXN0ZW1zKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzOl0oI3ByZXJlcXVpc2l0ZXMpCisgICAgICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdCB3aXRoIENNYWtlXSgjYnVpbGQtYW5kLXJ1bi10ZXN0LXdpdGgtY21ha2UpCisgICAgLSBbQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBXaW5kb3dzXSgjYnVpbGQtYW5kLXJ1bi10ZXN0cy1vbi13aW5kb3dzKQorICAgICAgICAtIFtQcmVyZXF1aXNpdGVzOl0oI3ByZXJlcXVpc2l0ZXMtMSkKKyAgICAgICAgLSBbR2VuZXJhdGlvbiBvZiBWUyBwcm9qZWN0IHdpdGggQ01ha2UsIGJ1aWxkIGFuZCBydW4gb24gV2luZG93c10oI2dlbmVyYXRpb24tb2YtdnMtcHJvamVjdC13aXRoLWNtYWtlLWJ1aWxkLWFuZC1ydW4tb24td2luZG93cykKKworPCEtLSAvVE9DIC0tPgorCisjIyBHZW5lcmFsIGluZm9ybWF0aW9uIAorCitBZGRlZCBnZW5lcmljIHdheSB0byBjb3ZlciBjb2RlIGJ5IHRlc3RzIGZvciBtYW55IGxhbmd1YWdlcyAoeW91IGp1c3QgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBoZWFkZXIgZmlsZSBmb3IgZ2VuZXJhdG9yIGZvciB5b3VyIGxhbmd1YWdlIC0gZXhhbXBsZSBpbiAqKm5ldGNvcmUqKiBpbXBsZW1lbnRhdGlvbikKKworQXQgY3VycmVudCBtb21lbnQgdGhlc2UgdGVzdHMgdXNlIGZyZWUgQ2F0Y2ggbGlicmFyeSAoaHR0cHM6Ly9naXRodWIuY29tL2NhdGNob3JnL0NhdGNoMi90cmVlL0NhdGNoMS54KSBmb3IgZWFzeSB0ZXN0IGNyZWF0aW9uIGFuZCB1c2FnZS4KK0RlY2lzaW9uIHRvIHVzZSBpdCB3YXMgYmVjYXVzZSBvZiBzaW1wbGljaXR5LCBlYXN5IHVzYWdlLCBvbmUgaGVhZGVyIGZpbGUgdG8gdXNlLCBzdGFibGUgY29tbXVuaXR5IGFuZCBncm93aW5nIGludGVyZXN0ICAoaHR0cHM6Ly9jcHAubGliaHVudC5jb20vcHJvamVjdC9nb29nbGV0ZXN0LWdvb2dsZS92cy9jYXRjaD9yZWw9Y21wLWNtcCkKKworQWxzbywgbWF5YmUsIGxhdGVyIGl0IHdpbGwgYmUgbWlncmF0ZWQgdG8gQ2F0Y2gyIChodHRwczovL2dpdGh1Yi5jb20vcGhpbHNxdWFyZWQvQ2F0Y2gpIC0gZGVwZW5kcyBvbiBuZWVkIHRvIHN1cHBvcnQgbGVnYWN5IGNvbXBpbGVycyAoYysrOTgpCisKKyMjIEhvdyB0byBhZGQgeW91ciB0ZXN0cworCistIE9wZW4gKipDTWFrZUxpc3RzLnR4dCoqCistIFNldCAqKk9uKiogdG8gY2FsbCBvZiAqKlRIUklGVF9BRERfQ09NUElMRVIqKiBmb3IgeW91ciBsYW5ndWFnZQorCitgYGAgY21ha2UgCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKK2BgYAorCistIENyZWF0ZSBmb2xkZXIgd2l0aCBuYW1lIHNwZWNpZmllZCBpbiBsaXN0IG9mIGxhbmd1YWdlcyBpbiAqKkNNYWtlTGlzdHMudHh0KioKKy0gQ3JlYXRlIHRlc3RzIGluIGZvbGRlciBmb3IgeW91ciBsYW5ndWFnZSAod2l0aCBleHRlbnNpb25zIGxpa2UgKi5jKiAtIGNjLCBjcHAsIGV0YykKKyAgLSBEb24ndCBmb3JnZXQgdG8gYWRkIGluY2x1ZGUgb2YgY2F0Y2guaHBwIGluIHlvdXIgdGVzdCBmaWxlCisgIGBgYCBDCisgICNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisgIGBgYAorCistIElmIHlvdSBuZWVkIC0gYWRkIGZpbGVzIG1hbnVhbGx5IHRvICoqdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTKiogaW4gKipDTWFrZUxpc3RzLnR4dCoqIHNpbWlsYXIgdG8gCisKK2BgYCBjbWFrZQorIyB5b3UgY2FuIGFkZCBzb21lIGZpbGVzIG1hbnVhbGx5IHRoZXJlIAorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUworICAgICMgdGVzdHMgZmlsZSB0byBhdm9pZCBtYWluIGluIGV2ZXJ5IHRlc3QgZmlsZQorICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0c19tYWluLmNjCispCitgYGAKKworLSBSdW4gKipjbWFrZSoqIHdpdGggYXJndW1lbnRzIGZvciB5b3VyIGVudmlyb25tZW50IGFuZCBjb21waWxlciAKKy0gRW5qb3kKKworIyMgQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBVbml4LWxpa2Ugc3lzdGVtcworCisjIyMgUHJlcmVxdWlzaXRlczoKKy0gSW5zdGFsbCBDTWFrZSAtIDxodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8+CistIEluc3RhbGwgd2luZmxleGJpc29uIC0gPGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8+CisKKyMjIyBCdWlsZCBhbmQgcnVuIHRlc3Qgd2l0aCBDTWFrZQorCistIFJ1biBjb21tYW5kcyBpbiBjb21tYW5kIGxpbmUgaW4gY3VycmVudCBkaXJlY3Rvcnk6CisKK2BgYAorbWtkaXIgY21ha2UtdnMgJiYgY2QgY21ha2UtdnMKK2NtYWtlIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2N0ZXN0IC1DIERlYnVnIC1WCitgYGAKKworIyMgQnVpbGQgYW5kIHJ1biB0ZXN0cyBvbiBXaW5kb3dzCisKKyMjIyBQcmVyZXF1aXNpdGVzOgorLSBJbnN0YWxsIENNYWtlIC0gPGh0dHBzOi8vY21ha2Uub3JnL2Rvd25sb2FkLz4KKy0gSW5zdGFsbCB3aW5mbGV4Ymlzb24gLSA8aHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvd2luZmxleGJpc29uLz4KKy0gSW5zdGFsbCBWUzIwMTcgQ29tbXVuaXR5IEVkaXRpb24gLSA8aHR0cHM6Ly93d3cudmlzdWFsc3R1ZGlvLmNvbS92cy93aGF0c25ldy8+IChlbnN1cmUgdGhhdCB5b3UgaW5zdGFsbGVkIHdvcmtsb2FkICJEZXNrdG9wIERldmVsb3BtZW50IHdpdGggQysrIiBmb3IgVlMyMDE3KQorCisjIyMgR2VuZXJhdGlvbiBvZiBWUyBwcm9qZWN0IHdpdGggQ01ha2UsIGJ1aWxkIGFuZCBydW4gb24gV2luZG93cworLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lIGluIGN1cnJlbnQgZGlyZWN0b3J5IChlbnN1cmUgdGhhdCBWUyBpbnN0YWxsZWQpOgorCitgYGAKK21rZGlyIGNtYWtlLXZzCitjZCBjbWFrZS12cworY21ha2UgLi4KK2NtYWtlIC0tYnVpbGQgLgorY3Rlc3QgLUMgRGVidWcgLVYKK2BgYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9jYXRjaC9jYXRjaC5ocHAgYi9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDAzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwCkBAIC0wLDAgKzEsMTE1MDggQEAKKy8qCisgKiAgQ2F0Y2ggdjEuOS40CisgKiAgR2VuZXJhdGVkOiAyMDE3LTA1LTE2IDEzOjUxOjU1LjUwNjUxOQorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIGZpbGUgaGFzIGJlZW4gbWVyZ2VkIGZyb20gbXVsdGlwbGUgaGVhZGVycy4gUGxlYXNlIGRvbid0IGVkaXQgaXQgZGlyZWN0bHkKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgVHdvIEJsdWUgQ3ViZXMgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCisgKiAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgKi8KKyNpZm5kZWYgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorI2RlZmluZSBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgIHByYWdtYSBjbGFuZyBzeXN0ZW1faGVhZGVyCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0Mgc3lzdGVtX2hlYWRlcgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9zdXBwcmVzc193YXJuaW5ncy5oCisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICBpZmRlZiBfX0lDQyAvLyBpY3BjIGRlZmluZXMgdGhlIF9fY2xhbmdfXyBtYWNybworIyAgICAgICBwcmFnbWEgd2FybmluZyhwdXNoKQorIyAgICAgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlOiAxNjEgMTY4MikKKyMgICBlbHNlIC8vIF9fSUNDCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ2xvYmFsLWNvbnN0cnVjdG9ycyIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd2YXJpYWRpYy1tYWNyb3MiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYzk5LWV4dGVuc2lvbnMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzk4LWNvbXBhdCIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKys5OC1jb21wYXQtcGVkYW50aWMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xc3dpdGNoLWVudW0iCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCIKKyMgICAgZW5kaWYKKyNlbGlmIGRlZmluZWQgX19HTlVDX18KKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdmFyaWFkaWMtbWFjcm9zIgorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhcmVudGhlc2VzIgorCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX01BSU4pIHx8IGRlZmluZWQoQ0FUQ0hfQ09ORklHX1JVTk5FUikKKyMgIGRlZmluZSBDQVRDSF9JTVBMCisjZW5kaWYKKworI2lmZGVmIENBVENIX0lNUEwKKyMgIGlmbmRlZiBDTEFSQV9DT05GSUdfTUFJTgorIyAgICBkZWZpbmUgQ0xBUkFfQ09ORklHX01BSU5fTk9UX0RFRklORUQKKyMgICAgZGVmaW5lIENMQVJBX0NPTkZJR19NQUlOCisjICBlbmRpZgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9ub3RpbXBsZW1lbnRlZF9leGNlcHRpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTk9USU1QTEVNRU5URURfRVhDRVBUSU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbW1vbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29tcGlsZXJfY2FwYWJpbGl0aWVzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTVBJTEVSX0NBUEFCSUxJVElFU19IUFBfSU5DTFVERUQKKworLy8gRGV0ZWN0IGEgbnVtYmVyIG9mIGNvbXBpbGVyIGZlYXR1cmVzIC0gbW9zdGx5IEMrKzExLzE0IGNvbmZvcm1hbmNlIC0gYnkgY29tcGlsZXIKKy8vIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGRlZmluZWQ6CisvLworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIgOiBpcyBudWxscHRyIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCA6IGlzIG5vZXhjZXB0IHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUyA6IFRoZSBkZWxldGUgYW5kIGRlZmF1bHQga2V5d29yZHMgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBtZXRob2RzCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSA6IHN0ZDo6aXNfZW51bSBpcyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUgOiBzdGQ6OnR1cGxlIGlzIHN1cHBvcnRlZAorLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORyA6IGlzIGxvbmcgbG9uZyBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUgOiBpcyBvdmVycmlkZSBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUiA6IGlzIHVuaXF1ZV9wdHIgc3VwcG9ydGVkIChvdGhlcndpc2UgdXNlIGF1dG9fcHRyKQorLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1NIVUZGTEUgOiBpcyBzdGQ6OnNodWZmbGUgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTIDogYXJlIHR5cGVfdHJhaXRzIGFuZCBlbmFibGVfaWYgc3VwcG9ydGVkPworCisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfT1JfR1JFQVRFUiA6IElzIEMrKzExIHN1cHBvcnRlZD8KKworLy8gQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUyA6IGFyZSB2YXJpYWRpYyBtYWNyb3Mgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NPVU5URVIgOiBpcyB0aGUgX19DT1VOVEVSX18gbWFjcm8gc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIIDogaXMgV2luZG93cyBTRUggc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMgOiBhcmUgUE9TSVggc2lnbmFscyBzdXBwb3J0ZWQ/CisvLyAqKioqKioqKioqKioqKioqCisvLyBOb3RlIHRvIG1haW50YWluZXJzOiBpZiBuZXcgdG9nZ2xlcyBhcmUgYWRkZWQgcGxlYXNlIGRvY3VtZW50IHRoZW0KKy8vIGluIGNvbmZpZ3VyYXRpb24ubWQsIHRvbworLy8gKioqKioqKioqKioqKioqKgorCisvLyBJbiBnZW5lcmFsIGVhY2ggbWFjcm8gaGFzIGEgX05PXzxmZWF0dXJlIG5hbWU+IGZvcm0KKy8vIChlLmcuIENBVENIX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSB3aGljaCBkaXNhYmxlcyB0aGUgZmVhdHVyZS4KKy8vIE1hbnkgZmVhdHVyZXMsIGF0IHBvaW50IG9mIGRldGVjdGlvbiwgZGVmaW5lIGFuIF9JTlRFUk5BTF8gbWFjcm8sIHNvIHRoZXkKKy8vIGNhbiBiZSBjb21iaW5lZCwgZW4tbWFzcywgd2l0aCB0aGUgX05PXyBmb3JtcyBsYXRlci4KKworLy8gQWxsIHRoZSBDKysxMSBmZWF0dXJlcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCBDQVRDSF9DT05GSUdfTk9fQ1BQMTEKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyMgIGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyMgICAgZGVmaW5lIENBVENIX0NQUDExX09SX0dSRUFURVIKKyMgIGVuZGlmCisKKyMgIGlmIF9fY3BsdXNwbHVzID49IDIwMTQwMkwKKyMgICAgZGVmaW5lIENBVENIX0NQUDE0X09SX0dSRUFURVIKKyMgIGVuZGlmCisKKyNlbmRpZgorCisjaWZkZWYgX19jbGFuZ19fCisKKyMgIGlmIF9faGFzX2ZlYXR1cmUoY3h4X251bGxwdHIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgZW5kaWYKKworIyAgaWYgX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgIGVuZGlmCisKKyMgICBpZiBkZWZpbmVkKENBVENIX0NQUDExX09SX0dSRUFURVIpCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcHVzaCIgKSBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdleGl0LXRpbWUtZGVzdHJ1Y3RvcnNcIiIgKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcG9wIiApCisKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHB1c2giICkgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XcGFyZW50aGVzZXNcIiIgKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwb3AiICkKKyMgICBlbmRpZgorCisjZW5kaWYgLy8gX19jbGFuZ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBXZSBrbm93IHNvbWUgZW52aXJvbm1lbnRzIG5vdCB0byBzdXBwb3J0IGZ1bGwgUE9TSVggc2lnbmFscworI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1FOWF9fKQorCisjICAgaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUworIyAgIGVuZGlmCisKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQ3lnd2luCisjaWZkZWYgX19DWUdXSU5fXworCisvLyBSZXF1aXJlZCBmb3Igc29tZSB2ZXJzaW9ucyBvZiBDeWd3aW4gdG8gZGVjbGFyZSBnZXR0aW1lb2ZkYXkKKy8vIHNlZTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNjkwMTgwMy9nZXR0aW1lb2ZkYXktbm90LWRlY2xhcmVkLWluLXRoaXMtc2NvcGUtY3lnd2luCisjICAgZGVmaW5lIF9CU0RfU09VUkNFCisKKyNlbmRpZiAvLyBfX0NZR1dJTl9fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBCb3JsYW5kCisjaWZkZWYgX19CT1JMQU5EQ19fCisKKyNlbmRpZiAvLyBfX0JPUkxBTkRDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEVERworI2lmZGVmIF9fRURHX1ZFUlNJT05fXworCisjZW5kaWYgLy8gX19FREdfVkVSU0lPTl9fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBEaWdpdGFsIE1hcnMKKyNpZmRlZiBfX0RNQ19fCisKKyNlbmRpZiAvLyBfX0RNQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHQ0MKKyNpZmRlZiBfX0dOVUNfXworCisjICAgaWYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGVuZGlmCisKKy8vIC0gb3RoZXJ3aXNlIG1vcmUgcmVjZW50IHZlcnNpb25zIGRlZmluZSBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisvLyBhbmQgd2lsbCBnZXQgcGlja2VkIHVwIGJlbG93CisKKyNlbmRpZiAvLyBfX0dOVUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVmlzdWFsIEMrKworI2lmZGVmIF9NU0NfVkVSCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1dJTkRPV1NfU0VICisKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisjaWYgKF9NU0NfVkVSID49IDE5MDAgKSAvLyAoVkMrKyAxMyAoVlMyMDE1KSkKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMKKyNlbmRpZgorCisjZW5kaWYgLy8gX01TQ19WRVIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8gVXNlIHZhcmlhZGljIG1hY3JvcyBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgdGhlbQorI2lmICggZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+IDE0MDAgJiYgIWRlZmluZWQgX19FREdFX18pIHx8IFwKKyAgICAoIGRlZmluZWQgX19XQVZFX18gJiYgX19XQVZFX0hBU19WQVJJQURJQ1MgKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID49IDMgKSB8fCBcCisgICAgKCAhZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwgfHwgX19jcGx1c3BsdXMgPj0gMjAxMTAzTCApCisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworCisjZW5kaWYKKworLy8gVXNlIF9fQ09VTlRFUl9fIGlmIHRoZSBjb21waWxlciBzdXBwb3J0cyBpdAorI2lmICggZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxMzAwICkgfHwgXAorICAgICggZGVmaW5lZCBfX0dOVUNfXyAgJiYgX19HTlVDX18gPj0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSAzICkgfHwgXAorICAgICggZGVmaW5lZCBfX2NsYW5nX18gJiYgX19jbGFuZ19tYWpvcl9fID49IDMgKQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DT1VOVEVSCisKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQysrIGxhbmd1YWdlIGZlYXR1cmUgc3VwcG9ydAorCisvLyBjYXRjaCBhbGwgc3VwcG9ydCBmb3IgQysrMTEKKyNpZiBkZWZpbmVkKENBVENIX0NQUDExX09SX0dSRUFURVIpCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0lTX0VOVU0KKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFVQTEUKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjICBlbmRpZgorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgZW5kaWYKKyMgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjICBlbmRpZgorIyBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisjICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjIGVuZGlmCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKy8vIE5vdyBzZXQgdGhlIGFjdHVhbCBkZWZpbmVzIGJhc2VkIG9uIHRoZSBhYm92ZSArIGFueXRoaW5nIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0KKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1ZBUklBRElDX01BQ1JPUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTE9OR19MT05HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTE9OR19MT05HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisvLyBVc2Ugb2YgX19DT1VOVEVSX18gaXMgc3VwcHJlc3NlZCBpZiBfX0pFVEJSQUlOU19JREVfXyBpcyAjZGVmaW5lZCAobWVhbmluZyB3ZSdyZSBiZWluZyBwYXJzZWQgYnkgYSBKZXRCcmFpbnMgSURFIGZvcgorLy8gYW5hbHl0aWNzKSBiZWNhdXNlLCBhdCB0aW1lIG9mIHdyaXRpbmcsIF9fQ09VTlRFUl9fIGlzIG5vdCBwcm9wZXJseSBoYW5kbGVkIGJ5IGl0LgorLy8gVGhpcyBkb2VzIG5vdCBhZmZlY3QgY29tcGlsYXRpb24KKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ09VTlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NPVU5URVIpICYmICFkZWZpbmVkKF9fSkVUQlJBSU5TX0lERV9fKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09VTlRFUgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFCisjZW5kaWYKKyMgaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjIGVuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfV0lORE9XU19TRUgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19XSU5ET1dTX1NFSCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfV0lORE9XU19TRUgKKyNlbmRpZgorLy8gVGhpcyBpcyBzZXQgYnkgZGVmYXVsdCwgYmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB1bml4IGNvbXBpbGVycyBhcmUgcG9zaXgtc2lnbmFsLWNvbXBhdGlibGUgYnkgZGVmYXVsdC4KKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfTk9fUE9TSVhfU0lHTkFMUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1BPU0lYX1NJR05BTFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUykKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUworI2VuZGlmCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKyNlbmRpZgorCisvLyBub2V4Y2VwdCBzdXBwb3J0OgorI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9OT0VYQ0VQVCkKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUX0lTKHgpIG5vZXhjZXB0KHgpCisjZWxzZQorIyAgZGVmaW5lIENBVENIX05PRVhDRVBUIHRocm93KCkKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVF9JUyh4KQorI2VuZGlmCisKKy8vIG51bGxwdHIgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZGVmaW5lIENBVENIX05VTEwgbnVsbHB0cgorI2Vsc2UKKyMgICBkZWZpbmUgQ0FUQ0hfTlVMTCBOVUxMCisjZW5kaWYKKworLy8gb3ZlcnJpZGUgc3VwcG9ydAorI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9PVkVSUklERQorIyAgIGRlZmluZSBDQVRDSF9PVkVSUklERSBvdmVycmlkZQorI2Vsc2UKKyMgICBkZWZpbmUgQ0FUQ0hfT1ZFUlJJREUKKyNlbmRpZgorCisvLyB1bmlxdWVfcHRyIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorIyAgIGRlZmluZSBDQVRDSF9BVVRPX1BUUiggVCApIHN0ZDo6dW5pcXVlX3B0cjxUPgorI2Vsc2UKKyMgICBkZWZpbmUgQ0FUQ0hfQVVUT19QVFIoIFQgKSBzdGQ6OmF1dG9fcHRyPFQ+CisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FMiggbmFtZSwgbGluZSApIG5hbWUjI2xpbmUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgbGluZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUyKCBuYW1lLCBsaW5lICkKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ09VTlRFUgorIyAgZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBuYW1lICkgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORSggbmFtZSwgX19DT1VOVEVSX18gKQorI2Vsc2UKKyMgIGRlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIF9fTElORV9fICkKKyNlbmRpZgorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NUUklOR0lGWTIoIGV4cHIgKSAjZXhwcgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkyKCBleHByICkKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgQ2FzZVNlbnNpdGl2ZSB7IGVudW0gQ2hvaWNlIHsKKyAgICAgICAgWWVzLAorICAgICAgICBObworICAgIH07IH07CisKKyAgICBjbGFzcyBOb25Db3B5YWJsZSB7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWxldGU7CisgICAgICAgIE5vbkNvcHlhYmxlKCBOb25Db3B5YWJsZSAmJiApICAgICAgICAgICAgICAgICAgPSBkZWxldGU7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgY29uc3QmICkgPSBkZWxldGU7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgJiYgKSAgICAgPSBkZWxldGU7CisjZWxzZQorICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgY29uc3QmIGluZm8gKTsKKyAgICAgICAgTm9uQ29weWFibGUmIG9wZXJhdG9yID0gKCBOb25Db3B5YWJsZSBjb25zdCYgKTsKKyNlbmRpZgorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBOb25Db3B5YWJsZSgpIHt9CisgICAgICAgIHZpcnR1YWwgfk5vbkNvcHlhYmxlKCk7CisgICAgfTsKKworICAgIGNsYXNzIFNhZmVCb29sIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgdm9pZCAoU2FmZUJvb2w6Oip0eXBlKSgpIGNvbnN0OworCisgICAgICAgIHN0YXRpYyB0eXBlIG1ha2VTYWZlKCBib29sIHZhbHVlICkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8gJlNhZmVCb29sOjp0cnVlVmFsdWUgOiAwOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCB0cnVlVmFsdWUoKSBjb25zdCB7fQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXJUPgorICAgIGlubGluZSB2b2lkIGRlbGV0ZUFsbCggQ29udGFpbmVyVCYgY29udGFpbmVyICkgeworICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdCA9IGNvbnRhaW5lci5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGNvbnRhaW5lci5lbmQoKTsKKyAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgZGVsZXRlICppdDsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUPgorICAgIGlubGluZSB2b2lkIGRlbGV0ZUFsbFZhbHVlcyggQXNzb2NpYXRpdmVDb250YWluZXJUJiBjb250YWluZXIgKSB7CisgICAgICAgIHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgQXNzb2NpYXRpdmVDb250YWluZXJUOjpjb25zdF9pdGVyYXRvciBpdEVuZCA9IGNvbnRhaW5lci5lbmQoKTsKKyAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApOworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgcHJlZml4ICk7CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdWZmaXggKTsKKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBzdWZmaXggKTsKKyAgICBib29sIGNvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4ICk7CisgICAgdm9pZCB0b0xvd2VySW5QbGFjZSggc3RkOjpzdHJpbmcmIHMgKTsKKyAgICBzdGQ6OnN0cmluZyB0b0xvd2VyKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApOworICAgIHN0ZDo6c3RyaW5nIHRyaW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKTsKKyAgICBib29sIHJlcGxhY2VJblBsYWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwbGFjZVRoaXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApOworCisgICAgc3RydWN0IHBsdXJhbGlzZSB7CisgICAgICAgIHBsdXJhbGlzZSggc3RkOjpzaXplX3QgY291bnQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYWJlbCApOworCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICk7CisKKyAgICAgICAgc3RkOjpzaXplX3QgbV9jb3VudDsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9sYWJlbDsKKyAgICB9OworCisgICAgc3RydWN0IFNvdXJjZUxpbmVJbmZvIHsKKworICAgICAgICBTb3VyY2VMaW5lSW5mbygpOworICAgICAgICBTb3VyY2VMaW5lSW5mbyggY2hhciBjb25zdCogX2ZpbGUsIHN0ZDo6c2l6ZV90IF9saW5lICk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgU291cmNlTGluZUluZm8oU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyKSAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvKCBTb3VyY2VMaW5lSW5mbyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyYgb3BlcmF0b3IgPSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBTb3VyY2VMaW5lSW5mbyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorICAgICAgICBib29sIGVtcHR5KCkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA8ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3Q7CisKKyAgICAgICAgY2hhciBjb25zdCogZmlsZTsKKyAgICAgICAgc3RkOjpzaXplX3QgbGluZTsKKyAgICB9OworCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBpbmZvICk7CisKKyAgICAvLyBUaGlzIGlzIGp1c3QgaGVyZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyB3aXRoIG1hY3JvIGNvbnN0YW50cyBhbmQgYm9vbGVhbiBsaXRlcmFscworICAgIGlubGluZSBib29sIGlzVHJ1ZSggYm9vbCB2YWx1ZSApeyByZXR1cm4gdmFsdWU7IH0KKyAgICBpbmxpbmUgYm9vbCBhbHdheXNUcnVlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGlubGluZSBib29sIGFsd2F5c0ZhbHNlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZvaWQgdGhyb3dMb2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxvY2F0aW9uSW5mbyApOworCisgICAgdm9pZCBzZWVkUm5nKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpOworCisgICAgLy8gVXNlIHRoaXMgaW4gdmFyaWFkaWMgc3RyZWFtaW5nIG1hY3JvcyB0byBhbGxvdworICAgIC8vICAgID4+ICtTdHJlYW1FbmRTdG9wCisgICAgLy8gYXMgd2VsbCBhcworICAgIC8vICAgID4+IHN0dWZmICtTdHJlYW1FbmRTdG9wCisgICAgc3RydWN0IFN0cmVhbUVuZFN0b3AgeworICAgICAgICBzdGQ6OnN0cmluZyBvcGVyYXRvcisoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBUIGNvbnN0JiBvcGVyYXRvciArICggVCBjb25zdCYgdmFsdWUsIFN0cmVhbUVuZFN0b3AgKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gOjpDYXRjaDo6U291cmNlTGluZUluZm8oIF9fRklMRV9fLCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIF9fTElORV9fICkgKQorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9FUlJPUiggbXNnICkgOjpDYXRjaDo6dGhyb3dMb2dpY0Vycm9yKCBtc2csIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKyAgICAgICAgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uIGNvbnN0JiApIHt9CisKKyAgICAgICAgdmlydHVhbCB+Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKSBDQVRDSF9OT0VYQ0VQVCB7fQorCisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IENBVENIX05PRVhDRVBUOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbV93aGF0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyBtX2xpbmVJbmZvOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIENBVENIX05PVF9JTVBMRU1FTlRFRCB0aHJvdyBDYXRjaDo6Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NvbnRleHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OVEVYVF9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2dlbmVyYXRvcnMuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19HRU5FUkFUT1JTX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJR2VuZXJhdG9ySW5mbyB7CisgICAgICAgIHZpcnR1YWwgfklHZW5lcmF0b3JJbmZvKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtb3ZlTmV4dCgpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBnZXRDdXJyZW50SW5kZXgoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJR2VuZXJhdG9yc0ZvclRlc3QgeworICAgICAgICB2aXJ0dWFsIH5JR2VuZXJhdG9yc0ZvclRlc3QoKTsKKworICAgICAgICB2aXJ0dWFsIElHZW5lcmF0b3JJbmZvJiBnZXRHZW5lcmF0b3JJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHN0ZDo6c2l6ZV90IHNpemUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtb3ZlTmV4dCgpID0gMDsKKyAgICB9OworCisgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBjcmVhdGVHZW5lcmF0b3JzRm9yVGVzdCgpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3B0ci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1BUUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gQW4gaW50cnVzaXZlIHJlZmVyZW5jZSBjb3VudGluZyBzbWFydCBwb2ludGVyLgorICAgIC8vIFQgbXVzdCBpbXBsZW1lbnQgYWRkUmVmKCkgYW5kIHJlbGVhc2UoKSBtZXRob2RzCisgICAgLy8gdHlwaWNhbGx5IGltcGxlbWVudGluZyB0aGUgSVNoYXJlZCBpbnRlcmZhY2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIFB0ciB7CisgICAgcHVibGljOgorICAgICAgICBQdHIoKSA6IG1fcCggQ0FUQ0hfTlVMTCApe30KKyAgICAgICAgUHRyKCBUKiBwICkgOiBtX3AoIHAgKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+YWRkUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgUHRyKCBQdHIgY29uc3QmIG90aGVyICkgOiBtX3AoIG90aGVyLm1fcCApeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5hZGRSZWYoKTsKKyAgICAgICAgfQorICAgICAgICB+UHRyKCl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtX3AgPSBDQVRDSF9OVUxMOworICAgICAgICB9CisgICAgICAgIFB0ciYgb3BlcmF0b3IgPSAoIFQqIHAgKXsKKyAgICAgICAgICAgIFB0ciB0ZW1wKCBwICk7CisgICAgICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgUHRyJiBvcGVyYXRvciA9ICggUHRyIGNvbnN0JiBvdGhlciApeworICAgICAgICAgICAgUHRyIHRlbXAoIG90aGVyICk7CisgICAgICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzd2FwKCBQdHImIG90aGVyICkgeyBzdGQ6OnN3YXAoIG1fcCwgb3RoZXIubV9wICk7IH0KKyAgICAgICAgVCogZ2V0KCkgY29uc3R7IHJldHVybiBtX3A7IH0KKyAgICAgICAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm1fcDsgfQorICAgICAgICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gbV9wOyB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgISgpIGNvbnN0IHsgcmV0dXJuIG1fcCA9PSBDQVRDSF9OVUxMOyB9CisgICAgICAgIG9wZXJhdG9yIFNhZmVCb29sOjp0eXBlKCkgY29uc3QgeyByZXR1cm4gU2FmZUJvb2w6Om1ha2VTYWZlKCBtX3AgIT0gQ0FUQ0hfTlVMTCApOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBUKiBtX3A7CisgICAgfTsKKworICAgIHN0cnVjdCBJU2hhcmVkIDogTm9uQ29weWFibGUgeworICAgICAgICB2aXJ0dWFsIH5JU2hhcmVkKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRSZWYoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gSVNoYXJlZD4KKyAgICBzdHJ1Y3QgU2hhcmVkSW1wbCA6IFQgeworCisgICAgICAgIFNoYXJlZEltcGwoKSA6IG1fcmMoIDAgKXt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZFJlZigpIGNvbnN0IHsKKyAgICAgICAgICAgICsrbV9yYzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAtLW1fcmMgPT0gMCApCisgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBtdXRhYmxlIHVuc2lnbmVkIGludCBtX3JjOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIGNsYXNzIFN0cmVhbTsKKyAgICBzdHJ1Y3QgSVJlc3VsdENhcHR1cmU7CisgICAgc3RydWN0IElSdW5uZXI7CisgICAgc3RydWN0IElHZW5lcmF0b3JzRm9yVGVzdDsKKyAgICBzdHJ1Y3QgSUNvbmZpZzsKKworICAgIHN0cnVjdCBJQ29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SUNvbnRleHQoKTsKKworICAgICAgICB2aXJ0dWFsIElSZXN1bHRDYXB0dXJlKiBnZXRSZXN1bHRDYXB0dXJlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIElSdW5uZXIqIGdldFJ1bm5lcigpID0gMDsKKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0R2VuZXJhdG9ySW5kZXgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc2l6ZV90IHRvdGFsU2l6ZSApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgUHRyPElDb25maWcgY29uc3Q+IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElNdXRhYmxlQ29udGV4dCA6IElDb250ZXh0CisgICAgeworICAgICAgICB2aXJ0dWFsIH5JTXV0YWJsZUNvbnRleHQoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJlc3VsdENhcHR1cmUoIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UnVubmVyKCBJUnVubmVyKiBydW5uZXIgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgPSAwOworICAgIH07CisKKyAgICBJQ29udGV4dCYgZ2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworICAgIHZvaWQgY2xlYW5VcENvbnRleHQoKTsKKyAgICBTdHJlYW0gY3JlYXRlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyZWFtTmFtZSApOworCit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF90ZXN0X3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfdGVzdGNhc2UuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19URVNUQ0FTRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlYzsKKworICAgIHN0cnVjdCBJVGVzdENhc2UgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIGludm9rZSAoKSBjb25zdCA9IDA7CisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIH5JVGVzdENhc2UoKTsKKyAgICB9OworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlUmVnaXN0cnkgeworICAgICAgICB2aXJ0dWFsIH5JVGVzdENhc2VSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0c1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBib29sIG1hdGNoVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJUZXN0cyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0Q2FzZXMsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYywgSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApOworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEM+CitjbGFzcyBNZXRob2RUZXN0Q2FzZSA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworCitwdWJsaWM6CisgICAgTWV0aG9kVGVzdENhc2UoIHZvaWQgKEM6OiptZXRob2QpKCkgKSA6IG1fbWV0aG9kKCBtZXRob2QgKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgQyBvYmo7CisgICAgICAgIChvYmouKm1fbWV0aG9kKSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIH5NZXRob2RUZXN0Q2FzZSgpIHt9CisKKyAgICB2b2lkIChDOjoqbV9tZXRob2QpKCk7Cit9OworCit0eXBlZGVmIHZvaWQoKlRlc3RGdW5jdGlvbikoKTsKKworc3RydWN0IE5hbWVBbmREZXNjIHsKKyAgICBOYW1lQW5kRGVzYyggY29uc3QgY2hhciogX25hbWUgPSAiIiwgY29uc3QgY2hhciogX2Rlc2NyaXB0aW9uPSAiIiApCisgICAgOiBuYW1lKCBfbmFtZSApLCBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICkKKyAgICB7fQorCisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbjsKK307CisKK3ZvaWQgcmVnaXN0ZXJUZXN0Q2FzZQorICAgICggICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc05hbWUsCisgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisKK3N0cnVjdCBBdXRvUmVnIHsKKworICAgIEF1dG9SZWcKKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICBBdXRvUmVnCisgICAgICAgICggICB2b2lkIChDOjoqbWV0aG9kKSgpLAorICAgICAgICAgICAgY2hhciBjb25zdCogY2xhc3NOYW1lLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworCisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAgICAgICAgICggICBuZXcgTWV0aG9kVGVzdENhc2U8Qz4oIG1ldGhvZCApLAorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgICAgICBsaW5lSW5mbyApOworICAgIH0KKworICAgIH5BdXRvUmVnKCk7CisKK3ByaXZhdGU6CisgICAgQXV0b1JlZyggQXV0b1JlZyBjb25zdCYgKTsKKyAgICB2b2lkIG9wZXJhdG9yPSAoIEF1dG9SZWcgY29uc3QmICk7Cit9OworCit2b2lkIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbgorICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggVGVzdE5hbWUsIC4uLiApIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZUZXN0TmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBzdGF0aWMgdm9pZCBUZXN0TmFtZSgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggLi4uICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIF9fVkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIFF1YWxpZmllZE1ldGhvZCwgLi4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZRdWFsaWZpZWRNZXRob2QsICImIiAjUXVhbGlmaWVkTWV0aG9kLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIFRlc3ROYW1lLCBDbGFzc05hbWUsIC4uLiApXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IFwKKyAgICAgICAgICAgIHN0cnVjdCBUZXN0TmFtZSA6IENsYXNzTmFtZXsgXAorICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBcCisgICAgICAgICAgICB9OyBcCisgICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApICggJlRlc3ROYW1lOjp0ZXN0LCAjQ2xhc3NOYW1lLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgdm9pZCBUZXN0TmFtZTo6dGVzdCgpCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBDbGFzc05hbWUsIC4uLiApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIENsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCAuLi4gKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIENhdGNoOjpBdXRvUmVnKCBGdW5jdGlvbiwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggX19WQV9BUkdTX18gKSApOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyNlbHNlCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBUZXN0TmFtZSwgTmFtZSwgRGVzYyApIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZUZXN0TmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggTmFtZSwgRGVzYyApICk7IH1cCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIE5hbWUsIERlc2MgKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgTmFtZSwgRGVzYyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBRdWFsaWZpZWRNZXRob2QsIE5hbWUsIERlc2MgKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSggJlF1YWxpZmllZE1ldGhvZCwgIiYiICNRdWFsaWZpZWRNZXRob2QsIENhdGNoOjpOYW1lQW5kRGVzYyggTmFtZSwgRGVzYyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBUZXN0Q2FzZU5hbWUsIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBcCisgICAgICAgICAgICBzdHJ1Y3QgVGVzdENhc2VOYW1lIDogQ2xhc3NOYW1leyBcCisgICAgICAgICAgICAgICAgdm9pZCB0ZXN0KCk7IFwKKyAgICAgICAgICAgIH07IFwKKyAgICAgICAgICAgIENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkgKCAmVGVzdENhc2VOYW1lOjp0ZXN0LCAjQ2xhc3NOYW1lLCBDYXRjaDo6TmFtZUFuZERlc2MoIFRlc3ROYW1lLCBEZXNjICksIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgdm9pZCBUZXN0Q2FzZU5hbWU6OnRlc3QoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIF9fX19DX0FfVF9DX0hfX19fVF9FX1NfVF9fX18gKSwgQ2xhc3NOYW1lLCBUZXN0TmFtZSwgRGVzYyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIE5hbWUsIERlc2MgKSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIENhdGNoOjpBdXRvUmVnKCBGdW5jdGlvbiwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sIENhdGNoOjpOYW1lQW5kRGVzYyggTmFtZSwgRGVzYyApICk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jYXB0dXJlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ0FQVFVSRV9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Jlc3VsdF9idWlsZGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9CVUlMREVSX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Jlc3VsdF90eXBlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9UWVBFX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFJlc3VsdFdhczo6T2ZUeXBlIGVudW0KKyAgICBzdHJ1Y3QgUmVzdWx0V2FzIHsgZW51bSBPZlR5cGUgeworICAgICAgICBVbmtub3duID0gLTEsCisgICAgICAgIE9rID0gMCwKKyAgICAgICAgSW5mbyA9IDEsCisgICAgICAgIFdhcm5pbmcgPSAyLAorCisgICAgICAgIEZhaWx1cmVCaXQgPSAweDEwLAorCisgICAgICAgIEV4cHJlc3Npb25GYWlsZWQgPSBGYWlsdXJlQml0IHwgMSwKKyAgICAgICAgRXhwbGljaXRGYWlsdXJlID0gRmFpbHVyZUJpdCB8IDIsCisKKyAgICAgICAgRXhjZXB0aW9uID0gMHgxMDAgfCBGYWlsdXJlQml0LAorCisgICAgICAgIFRocmV3RXhjZXB0aW9uID0gRXhjZXB0aW9uIHwgMSwKKyAgICAgICAgRGlkbnRUaHJvd0V4Y2VwdGlvbiA9IEV4Y2VwdGlvbiB8IDIsCisKKyAgICAgICAgRmF0YWxFcnJvckNvbmRpdGlvbiA9IDB4MjAwIHwgRmFpbHVyZUJpdAorCisgICAgfTsgfTsKKworICAgIGlubGluZSBib29sIGlzT2soIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKSB7CisgICAgICAgIHJldHVybiAoIHJlc3VsdFR5cGUgJiBSZXN1bHRXYXM6OkZhaWx1cmVCaXQgKSA9PSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc0p1c3RJbmZvKCBpbnQgZmxhZ3MgKSB7CisgICAgICAgIHJldHVybiBmbGFncyA9PSBSZXN1bHRXYXM6OkluZm87CisgICAgfQorCisgICAgLy8gUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIGVudW0KKyAgICBzdHJ1Y3QgUmVzdWx0RGlzcG9zaXRpb24geyBlbnVtIEZsYWdzIHsKKyAgICAgICAgTm9ybWFsID0gMHgwMSwKKworICAgICAgICBDb250aW51ZU9uRmFpbHVyZSA9IDB4MDIsICAgLy8gRmFpbHVyZXMgZmFpbCB0ZXN0LCBidXQgZXhlY3V0aW9uIGNvbnRpbnVlcworICAgICAgICBGYWxzZVRlc3QgPSAweDA0LCAgICAgICAgICAgLy8gUHJlZml4IGV4cHJlc3Npb24gd2l0aCAhCisgICAgICAgIFN1cHByZXNzRmFpbCA9IDB4MDggICAgICAgICAvLyBGYWlsdXJlcyBhcmUgcmVwb3J0ZWQgYnV0IGRvIG5vdCBmYWlsIHRoZSB0ZXN0CisgICAgfTsgfTsKKworICAgIGlubGluZSBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3Mgb3BlcmF0b3IgfCAoIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBsaHMsIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByaHMgKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3M+KCBzdGF0aWNfY2FzdDxpbnQ+KCBsaHMgKSB8IHN0YXRpY19jYXN0PGludD4oIHJocyApICk7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgc2hvdWxkQ29udGludWVPbkZhaWx1cmUoIGludCBmbGFncyApICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgKSAhPSAwOyB9CisgICAgaW5saW5lIGJvb2wgaXNGYWxzZVRlc3QoIGludCBmbGFncyApICAgICAgICAgICAgICAgIHsgcmV0dXJuICggZmxhZ3MgJiBSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0ICkgIT0gMDsgfQorICAgIGlubGluZSBib29sIHNob3VsZFN1cHByZXNzRmFpbHVyZSggaW50IGZsYWdzICkgICAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCApICE9IDA7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9hc3NlcnRpb25yZXN1bHQuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVNTRVJUSU9OUkVTVUxUX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb247CisKKyAgICBzdHJ1Y3QgRGVjb21wb3NlZEV4cHJlc3Npb24KKyAgICB7CisgICAgICAgIHZpcnR1YWwgfkRlY29tcG9zZWRFeHByZXNzaW9uKCkge30KKyAgICAgICAgdmlydHVhbCBib29sIGlzQmluYXJ5RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBPbmx5IHNpbXBsZSBiaW5hcnkgY29tcGFyaXNvbnMgY2FuIGJlIGRlY29tcG9zZWQuCisgICAgICAgIC8vIElmIG1vcmUgY29tcGxleCBjaGVjayBpcyByZXF1aXJlZCB0aGVuIHdyYXAgc3ViLWV4cHJlc3Npb25zIGluIHBhcmVudGhlc2VzLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICsgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIC0gKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICogKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yIC8gKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICUgKCBUIGNvbnN0JiApOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBTVEFUSUNfQVNTRVJUX0V4cHJlc3Npb25fVG9vX0NvbXBsZXhfUGxlYXNlX1Jld3JpdGVfQXNfQmluYXJ5X0NvbXBhcmlzb24mIG9wZXJhdG9yICYmICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciB8fCAoIFQgY29uc3QmICk7CisKKwlwcml2YXRlOgorCQlEZWNvbXBvc2VkRXhwcmVzc2lvbiYgb3BlcmF0b3IgPSAoRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmKTsKKyAgICB9OworCisgICAgc3RydWN0IEFzc2VydGlvbkluZm8KKyAgICB7CisgICAgICAgIEFzc2VydGlvbkluZm8oKSB7fQorICAgICAgICBBc3NlcnRpb25JbmZvKCAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgX3Jlc3VsdERpc3Bvc2l0aW9uICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbWFjcm9OYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb247CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25SZXN1bHREYXRhCisgICAgeworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhKCkgOiBkZWNvbXBvc2VkRXhwcmVzc2lvbiggQ0FUQ0hfTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHJlc3VsdFR5cGUoIFJlc3VsdFdhczo6VW5rbm93biApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG5lZ2F0ZWQoIGZhbHNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcGFyZW50aGVzaXplZCggZmFsc2UgKSB7fQorCisgICAgICAgIHZvaWQgbmVnYXRlKCBib29sIHBhcmVudGhlc2l6ZSApIHsKKyAgICAgICAgICAgIG5lZ2F0ZWQgPSAhbmVnYXRlZDsKKyAgICAgICAgICAgIHBhcmVudGhlc2l6ZWQgPSBwYXJlbnRoZXNpemU7CisgICAgICAgICAgICBpZiggcmVzdWx0VHlwZSA9PSBSZXN1bHRXYXM6Ok9rICkKKyAgICAgICAgICAgICAgICByZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICAgICAgZWxzZSBpZiggcmVzdWx0VHlwZSA9PSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQgKQorICAgICAgICAgICAgICAgIHJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6Ok9rOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHJlY29uc3RydWN0RXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBkZWNvbXBvc2VkRXhwcmVzc2lvbiAhPSBDQVRDSF9OVUxMICkgeworICAgICAgICAgICAgICAgIGRlY29tcG9zZWRFeHByZXNzaW9uLT5yZWNvbnN0cnVjdEV4cHJlc3Npb24oIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgaWYoIHBhcmVudGhlc2l6ZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmluc2VydCggMCwgMSwgJygnICk7CisgICAgICAgICAgICAgICAgICAgIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uLmFwcGVuZCggMSwgJyknICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBuZWdhdGVkICkgeworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5pbnNlcnQoIDAsIDEsICchJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWNvbXBvc2VkRXhwcmVzc2lvbiA9IENBVENIX05VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247CisgICAgICAgIH0KKworICAgICAgICBtdXRhYmxlIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0KiBkZWNvbXBvc2VkRXhwcmVzc2lvbjsKKyAgICAgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZTsKKyAgICAgICAgYm9vbCBuZWdhdGVkOworICAgICAgICBib29sIHBhcmVudGhlc2l6ZWQ7CisgICAgfTsKKworICAgIGNsYXNzIEFzc2VydGlvblJlc3VsdCB7CisgICAgcHVibGljOgorICAgICAgICBBc3NlcnRpb25SZXN1bHQoKTsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25JbmZvIGNvbnN0JiBpbmZvLCBBc3NlcnRpb25SZXN1bHREYXRhIGNvbnN0JiBkYXRhICk7CisgICAgICAgIH5Bc3NlcnRpb25SZXN1bHQoKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0ICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uUmVzdWx0ICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgYm9vbCBpc09rKCkgY29uc3Q7CisgICAgICAgIGJvb2wgc3VjY2VlZGVkKCkgY29uc3Q7CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIGdldFJlc3VsdFR5cGUoKSBjb25zdDsKKyAgICAgICAgYm9vbCBoYXNFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzTWVzc2FnZSgpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cHJlc3Npb25Jbk1hY3JvKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRNZXNzYWdlKCkgY29uc3Q7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGdldFNvdXJjZUluZm8oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0VGVzdE1hY3JvTmFtZSgpIGNvbnN0OworICAgICAgICB2b2lkIGRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICB2b2lkIGV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9pbmZvOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIG1fcmVzdWx0RGF0YTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21hdGNoZXJzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworICAgIG5hbWVzcGFjZSBJbXBsIHsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hBbGxPZjsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoQW55T2Y7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaE5vdE9mOworCisgICAgICAgIGNsYXNzIE1hdGNoZXJVbnR5cGVkQmFzZSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCBtX2NhY2hlZFRvU3RyaW5nLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBtX2NhY2hlZFRvU3RyaW5nID0gZGVzY3JpYmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9jYWNoZWRUb1N0cmluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICB2aXJ0dWFsIH5NYXRjaGVyVW50eXBlZEJhc2UoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7CisgICAgICAgICAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBNYXRjaGVyVW50eXBlZEJhc2UmIG9wZXJhdG9yID0gKCBNYXRjaGVyVW50eXBlZEJhc2UgY29uc3QmICk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VD4KKyAgICAgICAgc3RydWN0IE1hdGNoZXJNZXRob2QgeworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBPYmplY3RUIGNvbnN0JiBhcmcgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFB0clQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kPFB0clQqPiB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIFB0clQqIGFyZyApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVCA9IE9iamVjdFQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyQmFzZSA6IE1hdGNoZXJVbnR5cGVkQmFzZSwgTWF0Y2hlck1ldGhvZDxPYmplY3RUPiB7CisKKyAgICAgICAgICAgIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yICYmICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgICAgICBNYXRjaEFueU9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICAgICAgTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgISAoKSBjb25zdDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hBbGxPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1fbWF0Y2hlcnNbaV0tPm1hdGNoKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKCA0ICsgbV9tYXRjaGVycy5zaXplKCkqMzIgKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiKCAiOworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgYW5kICI7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fbWF0Y2hlcnNbaV0tPnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYXRjaEFsbE9mPEFyZ1Q+JiBvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBtX21hdGNoZXJzLnB1c2hfYmFjayggJm90aGVyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCo+IG1fbWF0Y2hlcnM7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+CisgICAgICAgIHN0cnVjdCBNYXRjaEFueU9mIDogTWF0Y2hlckJhc2U8QXJnVD4geworCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbWF0Y2hlcnNbaV0tPm1hdGNoKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKCA0ICsgbV9tYXRjaGVycy5zaXplKCkqMzIgKTsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiKCAiOworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBtX21hdGNoZXJzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgb3IgIjsKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9tYXRjaGVyc1tpXS0+dG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiApIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1hdGNoQW55T2Y8QXJnVD4mIG9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgICAgIG1fbWF0Y2hlcnMucHVzaF9iYWNrKCAmb3RoZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0Kj4gbV9tYXRjaGVyczsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hOb3RPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKworICAgICAgICAgICAgTWF0Y2hOb3RPZiggTWF0Y2hlckJhc2U8QXJnVD4gY29uc3QmIHVuZGVybHlpbmdNYXRjaGVyICkgOiBtX3VuZGVybHlpbmdNYXRjaGVyKCB1bmRlcmx5aW5nTWF0Y2hlciApIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggQXJnVCBjb25zdCYgYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAhbV91bmRlcmx5aW5nTWF0Y2hlci5tYXRjaCggYXJnICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJub3QgIiArIG1fdW5kZXJseWluZ01hdGNoZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBtX3VuZGVybHlpbmdNYXRjaGVyOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yICYmICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoQWxsT2Y8Q29tcGFyYXRvclQ+KCkgJiYgKnRoaXMgJiYgb3RoZXI7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4oKSB8fCAqdGhpcyB8fCBvdGhlcjsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciAhICgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaE5vdE9mPENvbXBhcmF0b3JUPiggKnRoaXMgKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgSW1wbAorCisgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY3JlYXRlIHRoZSBhY3R1YWwgbWF0Y2hlciBvYmplY3RzLgorICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB0eXBlcyB0byBiZSBpbmZlcnJlZAorICAgIC8vIC0gZGVwcmVjYXRlZDogcHJlZmVyIHx8LCAmJiBhbmQgIQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoTm90T2Y8VD4gTm90KCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgdW5kZXJseWluZ01hdGNoZXIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaE5vdE9mPFQ+KCB1bmRlcmx5aW5nTWF0Y2hlciApOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFsbE9mPFQ+IEFsbE9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQWxsT2Y8VD4oKSAmJiBtMSAmJiBtMjsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbGxPZjxUPiBBbGxPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMyApIHsKKyAgICAgICAgcmV0dXJuIEltcGw6Ok1hdGNoQWxsT2Y8VD4oKSAmJiBtMSAmJiBtMiAmJiBtMzsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbnlPZjxUPiBBbnlPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFueU9mPFQ+KCkgfHwgbTEgfHwgbTI7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQW55T2Y8VD4gQW55T2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTMgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFueU9mPFQ+KCkgfHwgbTEgfHwgbTIgfHwgbTM7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworCit1c2luZyBuYW1lc3BhY2UgTWF0Y2hlcnM7Cit1c2luZyBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U7CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVGVzdEZhaWx1cmVFeGNlcHRpb257fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEV4cHJlc3Npb25MaHM7CisKKyAgICBzdHJ1Y3QgQ29weWFibGVTdHJlYW0geworICAgICAgICBDb3B5YWJsZVN0cmVhbSgpIHt9CisgICAgICAgIENvcHlhYmxlU3RyZWFtKCBDb3B5YWJsZVN0cmVhbSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBvc3MgPDwgb3RoZXIub3NzLnN0cigpOworICAgICAgICB9CisgICAgICAgIENvcHlhYmxlU3RyZWFtJiBvcGVyYXRvcj0oIENvcHlhYmxlU3RyZWFtIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIG9zcy5zdHIoc3RkOjpzdHJpbmcoKSk7CisgICAgICAgICAgICBvc3MgPDwgb3RoZXIub3NzLnN0cigpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgfTsKKworICAgIGNsYXNzIFJlc3VsdEJ1aWxkZXIgOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzdWx0QnVpbGRlciggIGNoYXIgY29uc3QqIG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGNhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIHNlY29uZEFyZyA9ICIiICk7CisgICAgICAgIH5SZXN1bHRCdWlsZGVyKCk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4gb3BlcmF0b3IgPD0gKCBUIGNvbnN0JiBvcGVyYW5kICk7CisgICAgICAgIEV4cHJlc3Npb25MaHM8Ym9vbD4gb3BlcmF0b3IgPD0gKCBib29sIHZhbHVlICk7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgUmVzdWx0QnVpbGRlciYgb3BlcmF0b3IgPDwgKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgICAgIG1fc3RyZWFtLm9zcyA8PCB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFJlc3VsdEJ1aWxkZXImIHNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdCApOworICAgICAgICBSZXN1bHRCdWlsZGVyJiBzZXRSZXN1bHRUeXBlKCBib29sIHJlc3VsdCApOworCisgICAgICAgIHZvaWQgZW5kRXhwcmVzc2lvbiggRGVjb21wb3NlZEV4cHJlc3Npb24gY29uc3QmIGV4cHIgKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFOworCisgICAgICAgIEFzc2VydGlvblJlc3VsdCBidWlsZCgpIGNvbnN0OworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYnVpbGQoIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgY29uc3Q7CisKKyAgICAgICAgdm9pZCB1c2VBY3RpdmVFeGNlcHRpb24oIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiA9IFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cHJlc3Npb24oKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBleHBlY3RlZE1lc3NhZ2UgKTsKKyAgICAgICAgdm9pZCBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4gY29uc3QmIG1hdGNoZXIgKTsKKyAgICAgICAgdm9pZCBoYW5kbGVSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICk7CisgICAgICAgIHZvaWQgcmVhY3QoKTsKKyAgICAgICAgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3Q7CisgICAgICAgIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdDsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KKyAgICAgICAgdm9pZCBjYXB0dXJlTWF0Y2goIEFyZ1QgY29uc3QmIGFyZywgTWF0Y2hlclQgY29uc3QmIG1hdGNoZXIsIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKTsKKworICAgICAgICB2b2lkIHNldEV4Y2VwdGlvbkd1YXJkKCk7CisgICAgICAgIHZvaWQgdW5zZXRFeGNlcHRpb25HdWFyZCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2Fzc2VydGlvbkluZm87CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgbV9kYXRhOworICAgICAgICBDb3B5YWJsZVN0cmVhbSBtX3N0cmVhbTsKKworICAgICAgICBib29sIG1fc2hvdWxkRGVidWdCcmVhazsKKyAgICAgICAgYm9vbCBtX3Nob3VsZFRocm93OworICAgICAgICBib29sIG1fZ3VhcmRFeGNlcHRpb247CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gSW5jbHVkZSBhZnRlciBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeToKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9leHByZXNzaW9uX2xocy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VYUFJFU1NJT05fTEhTX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXZhbHVhdGUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FVkFMVUFURV9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzODkpIC8vICc9PScgOiBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2gKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQzMTIpIC8vIENvbnZlcnRpbmcgaW50IHRvIFQqIHVzaW5nIHJlaW50ZXJwcmV0X2Nhc3QgKGlzc3VlIG9uIHg2NCBwbGF0Zm9ybSkKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBJbnRlcm5hbCB7CisKKyAgICBlbnVtIE9wZXJhdG9yIHsKKyAgICAgICAgSXNFcXVhbFRvLAorICAgICAgICBJc05vdEVxdWFsVG8sCisgICAgICAgIElzTGVzc1RoYW4sCisgICAgICAgIElzR3JlYXRlclRoYW4sCisgICAgICAgIElzTGVzc1RoYW5PckVxdWFsVG8sCisgICAgICAgIElzR3JlYXRlclRoYW5PckVxdWFsVG8KKyAgICB9OworCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IHN0cnVjdCBPcGVyYXRvclRyYWl0cyAgICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiKmVycm9yKiI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0VxdWFsVG8+ICAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI9PSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc05vdEVxdWFsVG8+ICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICIhPSI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0xlc3NUaGFuPiAgICAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI8IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzR3JlYXRlclRoYW4+ICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj4iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNMZXNzVGhhbk9yRXF1YWxUbz4gICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPD0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNHcmVhdGVyVGhhbk9yRXF1YWxUbz57IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPj0iOyB9IH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBUJiBvcENhc3QoVCBjb25zdCYgdCkgeyByZXR1cm4gY29uc3RfY2FzdDxUJj4odCk7IH0KKworLy8gbnVsbHB0cl90IHN1cHBvcnQgYmFzZWQgb24gcHVsbCByZXF1ZXN0ICMxNTQgZnJvbSBLb25zdGFudGluIEJhdW1hbm4KKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorICAgIGlubGluZSBzdGQ6Om51bGxwdHJfdCBvcENhc3Qoc3RkOjpudWxscHRyX3QpIHsgcmV0dXJuIG51bGxwdHI7IH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorCisgICAgLy8gU28gdGhlIGNvbXBhcmUgb3ZlcmxvYWRzIGNhbiBiZSBvcGVyYXRvciBhZ25vc3RpYyB3ZSBjb252ZXkgdGhlIG9wZXJhdG9yIGFzIGEgdGVtcGxhdGUKKyAgICAvLyBlbnVtLCB3aGljaCBpcyB1c2VkIHRvIHNwZWNpYWxpc2UgYW4gRXZhbHVhdG9yIGZvciBkb2luZyB0aGUgY29tcGFyaXNvbi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIE9wZXJhdG9yIE9wPgorICAgIGNsYXNzIEV2YWx1YXRvcnt9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0VxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMpIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID09ICBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNOb3RFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgIT0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTGVzc1RoYW4+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA8IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0dyZWF0ZXJUaGFuPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPiBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNHcmVhdGVyVGhhbk9yRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID49IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0xlc3NUaGFuT3JFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPD0gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgYm9vbCBhcHBseUV2YWx1YXRvciggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUMSwgVDIsIE9wPjo6ZXZhbHVhdGUoIGxocywgcmhzICk7CisgICAgfQorCisgICAgLy8gVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBhbGxvd3MgdXMgdG8gc3BlY2lhbGlzZSBmb3IgaW50ZWdlciB0eXBlcworICAgIC8vIHRvIGF2b2lkIHNpZ25lZC8gdW5zaWduZWQgd2FybmluZ3MKKworICAgIC8vICJiYXNlIiBvdmVybG9hZAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgYm9vbCBjb21wYXJlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQxLCBUMiwgT3A+OjpldmFsdWF0ZSggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBYIHRvIGludAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGludCBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgY2hhciBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBYIHRvIGxvbmcKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBpbnQgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBjaGFyIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gaW50IHRvIHVuc2lnbmVkIFgKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGludCBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBsaHMgKSwgcmhzICk7CisgICAgfQorCisgICAgLy8gbG9uZyB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gbG9uZyAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGludCAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGludCBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworICAgIC8vIGxvbmcgbG9uZyB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIHVuc2lnbmVkIGxvbmcgbG9uZyB0byBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgbG9uZyBsb25nIGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGxvbmcgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGNoYXIgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIHBvaW50ZXIgdG8gbG9uZyBsb25nICh3aGVuIGNvbXBhcmluZyBhZ2FpbnN0IE5VTEwpCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggbG9uZyBsb25nIGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbGhzLCByZWludGVycHJldF9jYXN0PFQqPiggcmhzICkgKTsKKyAgICB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyAgICAvLyBwb2ludGVyIHRvIG51bGxwdHJfdCAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBudWxscHRyKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIHN0ZDo6bnVsbHB0cl90LCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBudWxscHRyLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBzdGQ6Om51bGxwdHJfdCApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgbnVsbHB0ciApOworICAgIH0KKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgSW50ZXJuYWwKK30gLy8gZW5kIG9mIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rvc3RyaW5nLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPU1RSSU5HX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGNzdGRkZWY+CisKKyNpZmRlZiBfX09CSkNfXworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX29iamNfYXJjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfT0JKQ19BUkNfSFBQX0lOQ0xVREVECisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisjaWZkZWYgX19oYXNfZmVhdHVyZQorI2RlZmluZSBDQVRDSF9BUkNfRU5BQkxFRCBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgMAorI2VuZGlmCisKK3ZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKTsKK2lkIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBpZCBvYmosIFNFTCBzZWwgKTsKKworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAoraW5saW5lIHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiBvYmogKSB7CisgICAgW29iaiByZWxlYXNlXTsKK30KK2lubGluZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgeworICAgIGlmKCBbb2JqIHJlc3BvbmRzVG9TZWxlY3Rvcjogc2VsXSApCisgICAgICAgIHJldHVybiBbb2JqIHBlcmZvcm1TZWxlY3Rvcjogc2VsXTsKKyAgICByZXR1cm4gbmlsOworfQorI2RlZmluZSBDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRAorI2RlZmluZSBDQVRDSF9BUkNfU1RST05HCisjZWxzZQoraW5saW5lIHZvaWQgYXJjU2FmZVJlbGVhc2UoIE5TT2JqZWN0KiApe30KK2lubGluZSBpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICkgeworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2FyYy1wZXJmb3JtU2VsZWN0b3ItbGVha3MiCisjZW5kaWYKKyAgICBpZiggW29iaiByZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQorICAgICAgICByZXR1cm4gW29iaiBwZXJmb3JtU2VsZWN0b3I6IHNlbF07CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyAgICByZXR1cm4gbmlsOworfQorI2RlZmluZSBDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRCBfX3Vuc2FmZV91bnJldGFpbmVkCisjZGVmaW5lIENBVENIX0FSQ19TVFJPTkcgX19zdHJvbmcKKyNlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorI2luY2x1ZGUgPHR1cGxlPgorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKy8vIFdoeSB3ZSdyZSBoZXJlLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBUIGNvbnN0JiB2YWx1ZSApOworCisvLyBCdWlsdCBpbiBvdmVybG9hZHMKKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6d3N0cmluZyBjb25zdCYgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBjaGFyKiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3Qgd2NoYXJfdCogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGludCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBpbnQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBkb3VibGUgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBmbG9hdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGJvb2wgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc2lnbmVkIGNoYXIgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBjaGFyIHZhbHVlICk7CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCitzdGQ6OnN0cmluZyB0b1N0cmluZyggbG9uZyBsb25nIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlICk7CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpudWxscHRyX3QgKTsKKyNlbmRpZgorCisjaWZkZWYgX19PQkpDX18KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgY29uc3QgKiBjb25zdCYgbnNzdHJpbmcgKTsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgKiBDQVRDSF9BUkNfU1RST05HIGNvbnN0JiBuc3N0cmluZyApOworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU09iamVjdCogY29uc3QmIG5zT2JqZWN0ICk7CisjZW5kaWYKKworbmFtZXNwYWNlIERldGFpbCB7CisKKyAgICBleHRlcm4gY29uc3Qgc3RkOjpzdHJpbmcgdW5wcmludGFibGVTdHJpbmc7CisKKyAjaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1NUUkVBTV9JTlNFUlRBQkxFX0NIRUNLKQorICAgIHN0cnVjdCBCb3JnVHlwZSB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEJvcmdUeXBlKCBUIGNvbnN0JiApOworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJ1ZVR5cGUgeyBjaGFyIHNpemVyWzFdOyB9OworICAgIHN0cnVjdCBGYWxzZVR5cGUgeyBjaGFyIHNpemVyWzJdOyB9OworCisgICAgVHJ1ZVR5cGUmIHRlc3RTdHJlYW1hYmxlKCBzdGQ6Om9zdHJlYW0mICk7CisgICAgRmFsc2VUeXBlIHRlc3RTdHJlYW1hYmxlKCBGYWxzZVR5cGUgKTsKKworICAgIEZhbHNlVHlwZSBvcGVyYXRvcjw8KCBzdGQ6Om9zdHJlYW0gY29uc3QmLCBCb3JnVHlwZSBjb25zdCYgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IElzU3RyZWFtSW5zZXJ0YWJsZSB7CisgICAgICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0gJnM7CisgICAgICAgIHN0YXRpYyBUICBjb25zdCZ0OworICAgICAgICBlbnVtIHsgdmFsdWUgPSBzaXplb2YoIHRlc3RTdHJlYW1hYmxlKHMgPDwgdCkgKSA9PSBzaXplb2YoIFRydWVUeXBlICkgfTsKKyAgICB9OworI2Vsc2UKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIElzU3RyZWFtSW5zZXJ0YWJsZSB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFNTLCB0eXBlbmFtZSBUVD4KKyAgICAgICAgc3RhdGljIGF1dG8gdGVzdChpbnQpCisgICAgICAgIC0+IGRlY2x0eXBlKCBzdGQ6OmRlY2x2YWw8U1MmPigpIDw8IHN0ZDo6ZGVjbHZhbDxUVD4oKSwgc3RkOjp0cnVlX3R5cGUoKSApOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4KKyAgICAgICAgc3RhdGljIGF1dG8gdGVzdCguLi4pIC0+IHN0ZDo6ZmFsc2VfdHlwZTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBkZWNsdHlwZSh0ZXN0PHN0ZDo6b3N0cmVhbSxjb25zdCBUJj4oMCkpOjp2YWx1ZTsKKyAgICB9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgYm9vbCBJc0VudW0gPSBzdGQ6OmlzX2VudW08VD46OnZhbHVlCisgICAgICAgICAgICAgPgorICAgIHN0cnVjdCBFbnVtU3RyaW5nTWFrZXIKKyAgICB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiApIHsgcmV0dXJuIHVucHJpbnRhYmxlU3RyaW5nOyB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IEVudW1TdHJpbmdNYWtlcjxULHRydWU+CisgICAgeworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA6OkNhdGNoOjp0b1N0cmluZygKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT4odikKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfTsKKyNlbmRpZgorICAgIHRlbXBsYXRlPGJvb2wgQz4KKyAgICBzdHJ1Y3QgU3RyaW5nTWFrZXJCYXNlIHsKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgdiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBFbnVtU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHYgKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmICkgeyByZXR1cm4gdW5wcmludGFibGVTdHJpbmc7IH0KKyNlbmRpZgorICAgIH07CisKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IFN0cmluZ01ha2VyQmFzZTx0cnVlPiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IF92YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IHZvaWQgKm9iamVjdCwgc3RkOjpzaXplX3Qgc2l6ZSApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IFQmIG9iamVjdCApIHsKKyAgICAgIHJldHVybiByYXdNZW1vcnlUb1N0cmluZyggJm9iamVjdCwgc2l6ZW9mKG9iamVjdCkgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBEZXRhaWwKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdHJpbmdNYWtlciA6CisgICAgRGV0YWlsOjpTdHJpbmdNYWtlckJhc2U8RGV0YWlsOjpJc1N0cmVhbUluc2VydGFibGU8VD46OnZhbHVlPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdHJpbmdNYWtlcjxUKj4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFUqIHAgKSB7CisgICAgICAgIGlmKCAhcCApCisgICAgICAgICAgICByZXR1cm4gIk5VTEwiOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gRGV0YWlsOjpyYXdNZW1vcnlUb1N0cmluZyggcCApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEM+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8UiBDOjoqPiB7CisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFIgQzo6KiBwICkgeworICAgICAgICBpZiggIXAgKQorICAgICAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERldGFpbDo6cmF3TWVtb3J5VG9TdHJpbmcoIHAgKTsKKyAgICB9Cit9OworCituYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICAgIHN0ZDo6c3RyaW5nIHJhbmdlVG9TdHJpbmcoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCApOworfQorCisvL3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFsbG9jYXRvcj4KKy8vc3RydWN0IFN0cmluZ01ha2VyPHN0ZDo6dmVjdG9yPFQsIEFsbG9jYXRvcj4gPiB7CisvLyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggc3RkOjp2ZWN0b3I8VCxBbGxvY2F0b3I+IGNvbnN0JiB2ICkgeworLy8gICAgICAgIHJldHVybiBEZXRhaWw6OnJhbmdlVG9TdHJpbmcoIHYuYmVnaW4oKSwgdi5lbmQoKSApOworLy8gICAgfQorLy99OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY2F0b3I+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjp2ZWN0b3I8VCxBbGxvY2F0b3I+IGNvbnN0JiB2ICkgeworICAgIHJldHVybiBEZXRhaWw6OnJhbmdlVG9TdHJpbmcoIHYuYmVnaW4oKSwgdi5lbmQoKSApOworfQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisKKy8vIHRvU3RyaW5nIGZvciB0dXBsZXMKK25hbWVzcGFjZSBUdXBsZURldGFpbCB7CisgIHRlbXBsYXRlPAorICAgICAgdHlwZW5hbWUgVHVwbGUsCisgICAgICBzdGQ6OnNpemVfdCBOID0gMCwKKyAgICAgIGJvb2wgPSAoTiA8IHN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlKQorICAgICAgPgorICBzdHJ1Y3QgRWxlbWVudFByaW50ZXIgeworICAgICAgc3RhdGljIHZvaWQgcHJpbnQoIGNvbnN0IFR1cGxlJiB0dXBsZSwgc3RkOjpvc3RyZWFtJiBvcyApCisgICAgICB7CisgICAgICAgICAgb3MgPDwgKCBOID8gIiwgIiA6ICIgIiApCisgICAgICAgICAgICAgPDwgQ2F0Y2g6OnRvU3RyaW5nKHN0ZDo6Z2V0PE4+KHR1cGxlKSk7CisgICAgICAgICAgRWxlbWVudFByaW50ZXI8VHVwbGUsTisxPjo6cHJpbnQodHVwbGUsb3MpOworICAgICAgfQorICB9OworCisgIHRlbXBsYXRlPAorICAgICAgdHlwZW5hbWUgVHVwbGUsCisgICAgICBzdGQ6OnNpemVfdCBOCisgICAgICA+CisgIHN0cnVjdCBFbGVtZW50UHJpbnRlcjxUdXBsZSxOLGZhbHNlPiB7CisgICAgICBzdGF0aWMgdm9pZCBwcmludCggY29uc3QgVHVwbGUmLCBzdGQ6Om9zdHJlYW0mICkge30KKyAgfTsKKworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5UeXBlcz4KK3N0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnR1cGxlPFR5cGVzLi4uPj4geworCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIGNvbnN0IHN0ZDo6dHVwbGU8VHlwZXMuLi4+JiB0dXBsZSApCisgICAgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICAgIG9zIDw8ICd7JzsKKyAgICAgICAgVHVwbGVEZXRhaWw6OkVsZW1lbnRQcmludGVyPHN0ZDo6dHVwbGU8VHlwZXMuLi4+Pjo6cHJpbnQoIHR1cGxlLCBvcyApOworICAgICAgICBvcyA8PCAiIH0iOworICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorfTsKKyNlbmRpZiAvLyBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKworbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGQ6OnN0cmluZyBtYWtlU3RyaW5nKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2YWx1ZSApOworICAgIH0KK30gLy8gZW5kIG5hbWVzcGFjZSBEZXRhaWwKKworLy8vIFxicmllZiBjb252ZXJ0cyBhbnkgdHlwZSB0byBhIHN0cmluZworLy8vCisvLy8gVGhlIGRlZmF1bHQgdGVtcGxhdGUgZm9yd2FyZHMgb24gdG8gb3N0cmluZ3N0cmVhbSAtIGV4Y2VwdCB3aGVuIGFuCisvLy8gb3N0cmluZ3N0cmVhbSBvdmVybG9hZCBkb2VzIG5vdCBleGlzdCAtIGluIHdoaWNoIGNhc2UgaXQgYXR0ZW1wdHMgdG8gZGV0ZWN0CisvLy8gdGhhdCBhbmQgd3JpdGVzIHs/fS4KKy8vLyBPdmVybG9hZCAobm90IHNwZWNpYWxpc2UpIHRoaXMgdGVtcGxhdGUgZm9yIGN1c3RvbSB0eXBzIHRoYXQgeW91IGRvbid0IHdhbnQKKy8vLyB0byBwcm92aWRlIGFuIG9zdHJlYW0gb3ZlcmxvYWQgZm9yLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBUIGNvbnN0JiB2YWx1ZSApIHsKKyAgICByZXR1cm4gU3RyaW5nTWFrZXI8VD46OmNvbnZlcnQoIHZhbHVlICk7Cit9CisKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0ZXJhdG9yPgorICAgIHN0ZDo6c3RyaW5nIHJhbmdlVG9TdHJpbmcoIElucHV0SXRlcmF0b3IgZmlyc3QsIElucHV0SXRlcmF0b3IgbGFzdCApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8ICJ7ICI7CisgICAgICAgIGlmKCBmaXJzdCAhPSBsYXN0ICkgeworICAgICAgICAgICAgb3NzIDw8IENhdGNoOjp0b1N0cmluZyggKmZpcnN0ICk7CisgICAgICAgICAgICBmb3IoICsrZmlyc3QgOyBmaXJzdCAhPSBsYXN0IDsgKytmaXJzdCApCisgICAgICAgICAgICAgICAgb3NzIDw8ICIsICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKCAqZmlyc3QgKTsKKyAgICAgICAgfQorICAgICAgICBvc3MgPDwgIiB9IjsKKyAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICB9Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNULCBJbnRlcm5hbDo6T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFJoc1Q+CitjbGFzcyBCaW5hcnlFeHByZXNzaW9uOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KK2NsYXNzIE1hdGNoRXhwcmVzc2lvbjsKKworLy8gV3JhcHMgdGhlIExIUyBvZiBhbiBleHByZXNzaW9uIGFuZCBvdmVybG9hZHMgY29tcGFyaXNvbiBvcGVyYXRvcnMKKy8vIGZvciBhbHNvIGNhcHR1cmluZyB0aG9zZSBhbmQgUkhTIChpZiBhbnkpCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgRXhwcmVzc2lvbkxocyA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgRXhwcmVzc2lvbkxocyggUmVzdWx0QnVpbGRlciYgcmIsIFQgbGhzICkgOiBtX3JiKCByYiApLCBtX2xocyggbGhzICksIG1fdHJ1dGh5KGZhbHNlKSB7fQorCisgICAgRXhwcmVzc2lvbkxocyYgb3BlcmF0b3IgPSAoIGNvbnN0IEV4cHJlc3Npb25MaHMmICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzRXF1YWxUbywgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPT0gKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc05vdEVxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yICE9ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTm90RXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNMZXNzVGhhbiwgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPCAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0xlc3NUaGFuPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0dyZWF0ZXJUaGFuLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA+ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzR3JlYXRlclRoYW4+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTGVzc1RoYW5PckVxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yIDw9ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTGVzc1RoYW5PckVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzR3JlYXRlclRoYW5PckVxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID49ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzR3JlYXRlclRoYW5PckVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0VxdWFsVG8sIGJvb2w+IG9wZXJhdG9yID09ICggYm9vbCByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNOb3RFcXVhbFRvLCBib29sPiBvcGVyYXRvciAhPSAoIGJvb2wgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzTm90RXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHZvaWQgZW5kRXhwcmVzc2lvbigpIHsKKyAgICAgICAgbV90cnV0aHkgPSBtX2xocyA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgbV9yYgorICAgICAgICAgICAgLnNldFJlc3VsdFR5cGUoIG1fdHJ1dGh5ICkKKyAgICAgICAgICAgIC5lbmRFeHByZXNzaW9uKCAqdGhpcyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBkZXN0ID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX3RydXRoeSApOworICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTxJbnRlcm5hbDo6T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgUmhzVCY+IGNhcHR1cmVFeHByZXNzaW9uKCBSaHNUJiByaHMgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBCaW5hcnlFeHByZXNzaW9uPFQsIE9wLCBSaHNUJj4oIG1fcmIsIG1fbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTxJbnRlcm5hbDo6T3BlcmF0b3IgT3A+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgYm9vbD4gY2FwdHVyZUV4cHJlc3Npb24oIGJvb2wgcmhzICkgY29uc3QgeworICAgICAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgYm9vbD4oIG1fcmIsIG1fbGhzLCByaHMgKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVzdWx0QnVpbGRlciYgbV9yYjsKKyAgICBUIG1fbGhzOworICAgIGJvb2wgbV90cnV0aHk7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBMaHNULCBJbnRlcm5hbDo6T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFJoc1Q+CitjbGFzcyBCaW5hcnlFeHByZXNzaW9uIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgICBCaW5hcnlFeHByZXNzaW9uKCBSZXN1bHRCdWlsZGVyJiByYiwgTGhzVCBsaHMsIFJoc1QgcmhzICkKKyAgICAgICAgOiBtX3JiKCByYiApLCBtX2xocyggbGhzICksIG1fcmhzKCByaHMgKSB7fQorCisgICAgQmluYXJ5RXhwcmVzc2lvbiYgb3BlcmF0b3IgPSAoIEJpbmFyeUV4cHJlc3Npb24mICk7CisKKyAgICB2b2lkIGVuZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmIKKyAgICAgICAgICAgIC5zZXRSZXN1bHRUeXBlKCBJbnRlcm5hbDo6Y29tcGFyZTxPcD4oIG1fbGhzLCBtX3JocyApICkKKyAgICAgICAgICAgIC5lbmRFeHByZXNzaW9uKCAqdGhpcyApOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBzdGQ6OnN0cmluZyBsaHMgPSBDYXRjaDo6dG9TdHJpbmcoIG1fbGhzICk7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJocyA9IENhdGNoOjp0b1N0cmluZyggbV9yaHMgKTsKKyAgICAgICAgY2hhciBkZWxpbSA9IGxocy5zaXplKCkgKyByaHMuc2l6ZSgpIDwgNDAgJiYKKyAgICAgICAgICAgICAgICAgICAgIGxocy5maW5kKCdcbicpID09IHN0ZDo6c3RyaW5nOjpucG9zICYmCisgICAgICAgICAgICAgICAgICAgICByaHMuZmluZCgnXG4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyA/ICcgJyA6ICdcbic7CisgICAgICAgIGRlc3QucmVzZXJ2ZSggNyArIGxocy5zaXplKCkgKyByaHMuc2l6ZSgpICk7CisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3Igc3BhY2VzIGFyb3VuZCBvcGVyYXRvcgorICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIG9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgLy8gMiBmb3IgcGFyZW50aGVzZXMgKGNvbmRpdGlvbmFsbHkgYWRkZWQgbGF0ZXIpCisgICAgICAgICAgICAgICAgICAgLy8gMSBmb3IgbmVnYXRpb24gKGNvbmRpdGlvbmFsbHkgYWRkZWQgbGF0ZXIpCisgICAgICAgIGRlc3QgPSBsaHM7CisgICAgICAgIGRlc3QgKz0gZGVsaW07CisgICAgICAgIGRlc3QgKz0gSW50ZXJuYWw6Ok9wZXJhdG9yVHJhaXRzPE9wPjo6Z2V0TmFtZSgpOworICAgICAgICBkZXN0ICs9IGRlbGltOworICAgICAgICBkZXN0ICs9IHJoczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgUmVzdWx0QnVpbGRlciYgbV9yYjsKKyAgICBMaHNUIG1fbGhzOworICAgIFJoc1QgbV9yaHM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KK2NsYXNzIE1hdGNoRXhwcmVzc2lvbiA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgTWF0Y2hFeHByZXNzaW9uKCBBcmdUIGFyZywgTWF0Y2hlclQgbWF0Y2hlciwgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApCisgICAgICAgIDogbV9hcmcoIGFyZyApLCBtX21hdGNoZXIoIG1hdGNoZXIgKSwgbV9tYXRjaGVyU3RyaW5nKCBtYXRjaGVyU3RyaW5nICkge30KKworICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCByZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBzdGQ6OnN0cmluZyBtYXRjaGVyQXNTdHJpbmcgPSBtX21hdGNoZXIudG9TdHJpbmcoKTsKKyAgICAgICAgZGVzdCA9IENhdGNoOjp0b1N0cmluZyggbV9hcmcgKTsKKyAgICAgICAgZGVzdCArPSAnICc7CisgICAgICAgIGlmKCBtYXRjaGVyQXNTdHJpbmcgPT0gRGV0YWlsOjp1bnByaW50YWJsZVN0cmluZyApCisgICAgICAgICAgICBkZXN0ICs9IG1fbWF0Y2hlclN0cmluZzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVzdCArPSBtYXRjaGVyQXNTdHJpbmc7CisgICAgfQorCitwcml2YXRlOgorICAgIEFyZ1QgbV9hcmc7CisgICAgTWF0Y2hlclQgbV9tYXRjaGVyOworICAgIGNoYXIgY29uc3QqIG1fbWF0Y2hlclN0cmluZzsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiBSZXN1bHRCdWlsZGVyOjpvcGVyYXRvciA8PSAoIFQgY29uc3QmIG9wZXJhbmQgKSB7CisgICAgICAgIHJldHVybiBFeHByZXNzaW9uTGhzPFQgY29uc3QmPiggKnRoaXMsIG9wZXJhbmQgKTsKKyAgICB9CisKKyAgICBpbmxpbmUgRXhwcmVzc2lvbkxoczxib29sPiBSZXN1bHRCdWlsZGVyOjpvcGVyYXRvciA8PSAoIGJvb2wgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBFeHByZXNzaW9uTGhzPGJvb2w+KCAqdGhpcywgdmFsdWUgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdULCB0eXBlbmFtZSBNYXRjaGVyVD4KKyAgICBpbmxpbmUgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlTWF0Y2goIEFyZ1QgY29uc3QmIGFyZywgTWF0Y2hlclQgY29uc3QmIG1hdGNoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICkgeworICAgICAgICBNYXRjaEV4cHJlc3Npb248QXJnVCBjb25zdCYsIE1hdGNoZXJUIGNvbnN0Jj4gZXhwciggYXJnLCBtYXRjaGVyLCBtYXRjaGVyU3RyaW5nICk7CisgICAgICAgIHNldFJlc3VsdFR5cGUoIG1hdGNoZXIubWF0Y2goIGFyZyApICk7CisgICAgICAgIGVuZEV4cHJlc3Npb24oIGV4cHIgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tZXNzYWdlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01FU1NBR0VfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IE1lc3NhZ2VJbmZvIHsKKyAgICAgICAgTWVzc2FnZUluZm8oICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIF90eXBlICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbWFjcm9OYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgdHlwZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHNlcXVlbmNlOworCisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBNZXNzYWdlSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UgPT0gb3RoZXIuc2VxdWVuY2U7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBvcGVyYXRvciA8ICggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlIDwgb3RoZXIuc2VxdWVuY2U7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0aWMgdW5zaWduZWQgaW50IGdsb2JhbENvdW50OworICAgIH07CisKKyAgICBzdHJ1Y3QgTWVzc2FnZUJ1aWxkZXIgeworICAgICAgICBNZXNzYWdlQnVpbGRlciggc3RkOjpzdHJpbmcgY29uc3QmIG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGUgKQorICAgICAgICA6IG1faW5mbyggbWFjcm9OYW1lLCBsaW5lSW5mbywgdHlwZSApCisgICAgICAgIHt9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgTWVzc2FnZUJ1aWxkZXImIG9wZXJhdG9yIDw8ICggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgICAgICBtX3N0cmVhbSA8PCB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2VJbmZvIG1faW5mbzsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG1fc3RyZWFtOworICAgIH07CisKKyAgICBjbGFzcyBTY29wZWRNZXNzYWdlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VCdWlsZGVyIGNvbnN0JiBidWlsZGVyICk7CisgICAgICAgIFNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UgY29uc3QmIG90aGVyICk7CisgICAgICAgIH5TY29wZWRNZXNzYWdlKCk7CisKKyAgICAgICAgTWVzc2FnZUluZm8gbV9pbmZvOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19jYXB0dXJlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfQ0FQVFVSRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBjbGFzcyBBc3NlcnRpb25SZXN1bHQ7CisgICAgc3RydWN0IEFzc2VydGlvbkluZm87CisgICAgc3RydWN0IFNlY3Rpb25JbmZvOworICAgIHN0cnVjdCBTZWN0aW9uRW5kSW5mbzsKKyAgICBzdHJ1Y3QgTWVzc2FnZUluZm87CisgICAgY2xhc3MgU2NvcGVkTWVzc2FnZUJ1aWxkZXI7CisgICAgc3RydWN0IENvdW50czsKKworICAgIHN0cnVjdCBJUmVzdWx0Q2FwdHVyZSB7CisKKyAgICAgICAgdmlydHVhbCB+SVJlc3VsdENhcHR1cmUoKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2VjdGlvblN0YXJ0ZWQoICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMmIGFzc2VydGlvbnMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkRWFybHkoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVzaFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGVzdE5hbWUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgY29uc3QgQXNzZXJ0aW9uUmVzdWx0KiBnZXRMYXN0UmVzdWx0KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApID0gMDsKKyAgICB9OworCisgICAgSVJlc3VsdENhcHR1cmUmIGdldFJlc3VsdENhcHR1cmUoKTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2RlYnVnZ2VyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFQlVHR0VSX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3BsYXRmb3JtLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1BMQVRGT1JNX0hfSU5DTFVERUQKKworI2lmIGRlZmluZWQoX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCkKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9NQUMKKyNlbGlmICBkZWZpbmVkKF9fSVBIT05FX09TX1ZFUlNJT05fTUlOX1JFUVVJUkVEKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX0lQSE9ORQorI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX2xpbnV4KSB8fCBkZWZpbmVkKF9fbGludXhfXykKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9MSU5VWAorI2VsaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorIyAgZGVmaW5lIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyMgIGlmICFkZWZpbmVkKE5PTUlOTUFYKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fTk9NSU5NQVgpCisjICAgIGRlZmluZSBDQVRDSF9ERUZJTkVTX05PTUlOTUFYCisjICBlbmRpZgorIyAgaWYgIWRlZmluZWQoV0lOMzJfTEVBTl9BTkRfTUVBTikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX1dJTjMyX0xFQU5fQU5EX01FQU4pCisjICAgIGRlZmluZSBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGVuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoeworCisgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCk7CisgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApOworfQorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgc25pcHBldCBiYXNlZCBvbjoKKyAgICAvLyBodHRwOi8vY29jb2F3aXRobG92ZS5jb20vMjAwOC8wMy9icmVhay1pbnRvLWRlYnVnZ2VyLmh0bWwKKyAgICAjaWYgZGVmaW5lZChfX3BwYzY0X18pIHx8IGRlZmluZWQoX19wcGNfXykKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgXAorICAgICAgICAgICAgICAgIF9fYXNtX18oImxpIHIwLCAyMFxuc2Ncbm5vcFxubGkgcjAsIDM3XG5saSByNCwgMlxuc2Ncbm5vcFxuIiBcCisgICAgICAgICAgICAgICAgOiA6IDogIm1lbW9yeSIsInIwIiwicjMiLCJyNCIgKQorICAgICNlbHNlCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIF9fYXNtX18oImludCAkM1xuIiA6IDogKQorICAgICNlbmRpZgorCisjZWxpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX0xJTlVYKQorICAgIC8vIElmIHdlIGNhbiB1c2UgaW5saW5lIGFzc2VtYmxlciwgZG8gaXQgYmVjYXVzZSB0aGlzIGFsbG93cyB1cyB0byBicmVhaworICAgIC8vIGRpcmVjdGx5IGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmFpbGluZyBjaGVjayBpbnN0ZWFkIG9mIGJyZWFraW5nIGluc2lkZQorICAgIC8vIHJhaXNlKCkgY2FsbGVkIGZyb20gaXQsIGkuZS4gb25lIHN0YWNrIGZyYW1lIGJlbG93LgorICAgICNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX194ODZfNjQpKQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBhc20gdm9sYXRpbGUgKCJpbnQgJDMiKQorICAgICNlbHNlIC8vIEZhbGwgYmFjayB0byB0aGUgZ2VuZXJpYyB3YXkuCisgICAgICAgICNpbmNsdWRlIDxzaWduYWwuaD4KKworICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSByYWlzZShTSUdUUkFQKQorICAgICNlbmRpZgorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBfX2RlYnVnYnJlYWsoKQorI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSB2b2lkIF9fc3RkY2FsbCBEZWJ1Z0JyZWFrKCk7CisgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgRGVidWdCcmVhaygpCisjZW5kaWYKKworI2lmZGVmIENBVENIX1RSQVAKKyAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBpZiggQ2F0Y2g6OmlzRGVidWdnZXJBY3RpdmUoKSApIHsgQ0FUQ0hfVFJBUCgpOyB9CisjZWxzZQorICAgICNkZWZpbmUgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpIENhdGNoOjphbHdheXNUcnVlKCk7CisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcnVubmVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUlVOTkVSX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKworICAgIHN0cnVjdCBJUnVubmVyIHsKKyAgICAgICAgdmlydHVhbCB+SVJ1bm5lcigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgYWJvcnRpbmcoKSBjb25zdCA9IDA7CisgICAgfTsKK30KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFdlIGNhbiBzcGVlZHVwIGNvbXBpbGF0aW9uIHNpZ25pZmljYW50bHkgYnkgYnJlYWtpbmcgaW50byBkZWJ1Z2dlciBsb3dlciBpbgorLy8gdGhlIGNhbGxzdGFjaywgYmVjYXVzZSB0aGVuIHdlIGRvbid0IGhhdmUgdG8gZXhwYW5kIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIKKy8vIG1hY3JvIGluIGVhY2ggYXNzZXJ0aW9uCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFQUNUKCByZXN1bHRCdWlsZGVyICkgXAorICAgIHJlc3VsdEJ1aWxkZXIucmVhY3QoKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQW5vdGhlciB3YXkgdG8gc3BlZWQtdXAgY29tcGlsYXRpb24gaXMgdG8gb21pdCBsb2NhbCB0cnktY2F0Y2ggZm9yIFJFUVVJUkUqCisvLyBtYWNyb3MuCisvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBjYXVzZSBmYWxzZSBuZWdhdGl2ZSwgaWYgdGhlIHRlc3QgY29kZSBjYXRjaGVzCisvLyB0aGUgZXhjZXB0aW9uIGJlZm9yZSBpdCBwcm9wYWdhdGVzIGJhY2sgdXAgdG8gdGhlIHJ1bm5lci4KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICggX19jYXRjaFJlc3VsdCA8PSBleHByICkuZW5kRXhwcmVzc2lvbigpOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnVuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6aXNUcnVlKCBmYWxzZSAmJiBzdGF0aWNfY2FzdDxib29sPiggISEoZXhwcikgKSApICkgLy8gZXhwciBoZXJlIGlzIG5ldmVyIGV2YWx1YXRlZCBhdCBydW50aW1lIGJ1dCBpdCBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGdpdmUgaXQgYSBsb29rCisvLyBUaGUgZG91YmxlIG5lZ2F0aW9uIHNpbGVuY2VzIE1TVkMncyBDNDgwMCB3YXJuaW5nLCB0aGUgc3RhdGljX2Nhc3QgZm9yY2VzIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbiBpZiB0aGUgdHlwZSBoYXMgb3ZlcmxvYWRlZCAmJi4KKworI2RlZmluZSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggbWFjcm9OYW1lLCBtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiwgYXJnICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjYXJnICIsICIgI21hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZU1hdGNoKCBhcmcsIG1hdGNoZXIsICNtYXRjaGVyICk7IFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC51bnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisjZWxzZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gSW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZSB3b3JrcyBvdXQgaWYgdGhlIGRlYnVnZ2VyIG5lZWRzIHRvIGJlIGludm9rZWQKKy8vIGFuZC9vciBhbiBleGNlcHRpb24gdGhyb3duIGFuZCB0YWtlcyBhcHByb3ByaWF0ZSBhY3Rpb24uCisvLyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYXMgYSBtYWNybyBzbyB0aGUgZGVidWdnZXIgd2lsbCBzdG9wIGluIHRoZSB1c2VyCisvLyBzb3VyY2UgY29kZSByYXRoZXIgdGhhbiBpbiBDYXRjaCBsaWJyYXJ5IGNvZGUKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIHJlc3VsdEJ1aWxkZXIgKSBcCisgICAgaWYoIHJlc3VsdEJ1aWxkZXIuc2hvdWxkRGVidWdCcmVhaygpICkgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpOyBcCisgICAgcmVzdWx0QnVpbGRlci5yZWFjdCgpOworI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgKCBfX2NhdGNoUmVzdWx0IDw9IGV4cHIgKS5lbmRFeHByZXNzaW9uKCk7IFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICB9IFwKKyAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjppc1RydWUoIGZhbHNlICYmIHN0YXRpY19jYXN0PGJvb2w+KCAhIShleHByKSApICkgKSAvLyBleHByIGhlcmUgaXMgbmV2ZXIgZXZhbHVhdGVkIGF0IHJ1bnRpbWUgYnV0IGl0IGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gZ2l2ZSBpdCBhIGxvb2sKKyAgICAvLyBUaGUgZG91YmxlIG5lZ2F0aW9uIHNpbGVuY2VzIE1TVkMncyBDNDgwMCB3YXJuaW5nLCB0aGUgc3RhdGljX2Nhc3QgZm9yY2VzIHNob3J0LWNpcmN1aXQgZXZhbHVhdGlvbiBpZiB0aGUgdHlwZSBoYXMgb3ZlcmxvYWRlZCAmJi4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9JRiggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICk7IFwKKyAgICBpZiggQ2F0Y2g6OmdldFJlc3VsdENhcHR1cmUoKS5nZXRMYXN0UmVzdWx0KCktPnN1Y2NlZWRlZCgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9FTFNFKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKTsgXAorICAgIGlmKCAhQ2F0Y2g6OmdldFJlc3VsdENhcHR1cmUoKS5nZXRMYXN0UmVzdWx0KCktPnN1Y2NlZWRlZCgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICB9IFwKKyAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIG1hdGNoZXIsIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiwgI21hdGNoZXIgKTsgXAorICAgICAgICBpZiggX19jYXRjaFJlc3VsdC5hbGxvd1Rocm93cygpICkgXAorICAgICAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBtYXRjaGVyICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCBtYWNyb05hbWUsIGV4Y2VwdGlvblR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciAiLCAiICNleGNlcHRpb25UeXBlLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIGlmKCBfX2NhdGNoUmVzdWx0LmFsbG93VGhyb3dzKCkgKSBcCisgICAgICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4oZXhwcik7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb24gKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggZXhjZXB0aW9uVHlwZSApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6T2sgKTsgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NU0coIG1hY3JvTmFtZSwgbWVzc2FnZVR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCAuLi4gKSBcCisgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgIiIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQgPDwgX19WQV9BUkdTX18gKyA6OkNhdGNoOjpTdHJlYW1FbmRTdG9wKCk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggbWVzc2FnZVR5cGUgKTsgXAorICAgICAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKyNlbHNlCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NU0coIG1hY3JvTmFtZSwgbWVzc2FnZVR5cGUsIHJlc3VsdERpc3Bvc2l0aW9uLCBsb2cgKSBcCisgICAgICAgIGRvIHsgXAorICAgICAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgIiIsIHJlc3VsdERpc3Bvc2l0aW9uICk7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQgPDwgbG9nICsgOjpDYXRjaDo6U3RyZWFtRW5kU3RvcCgpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIG1lc3NhZ2VUeXBlICk7IFwKKyAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgICAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9JTkZPKCBtYWNyb05hbWUsIGxvZyApIFwKKyAgICBDYXRjaDo6U2NvcGVkTWVzc2FnZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggc2NvcGVkTWVzc2FnZSApID0gQ2F0Y2g6Ok1lc3NhZ2VCdWlsZGVyKCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6UmVzdWx0V2FzOjpJbmZvICkgPDwgbG9nOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NIRUNLX1RIQVQoIG1hY3JvTmFtZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2FyZyAiLCAiICNtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZU1hdGNoKCBhcmcsIG1hdGNoZXIsICNtYXRjaGVyICk7IFwKKyAgICAgICAgfSBjYXRjaCggLi4uICkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LnVzZUFjdGl2ZUV4Y2VwdGlvbiggcmVzdWx0RGlzcG9zaXRpb24gfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3NlY3Rpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zZWN0aW9uX2luZm8uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU0VDVElPTl9JTkZPX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RvdGFscy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPVEFMU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ291bnRzIHsKKyAgICAgICAgQ291bnRzKCkgOiBwYXNzZWQoIDAgKSwgZmFpbGVkKCAwICksIGZhaWxlZEJ1dE9rKCAwICkge30KKworICAgICAgICBDb3VudHMgb3BlcmF0b3IgLSAoIENvdW50cyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICBDb3VudHMgZGlmZjsKKyAgICAgICAgICAgIGRpZmYucGFzc2VkID0gcGFzc2VkIC0gb3RoZXIucGFzc2VkOworICAgICAgICAgICAgZGlmZi5mYWlsZWQgPSBmYWlsZWQgLSBvdGhlci5mYWlsZWQ7CisgICAgICAgICAgICBkaWZmLmZhaWxlZEJ1dE9rID0gZmFpbGVkQnV0T2sgLSBvdGhlci5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisgICAgICAgIENvdW50cyYgb3BlcmF0b3IgKz0gKCBDb3VudHMgY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgcGFzc2VkICs9IG90aGVyLnBhc3NlZDsKKyAgICAgICAgICAgIGZhaWxlZCArPSBvdGhlci5mYWlsZWQ7CisgICAgICAgICAgICBmYWlsZWRCdXRPayArPSBvdGhlci5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IHRvdGFsKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHBhc3NlZCArIGZhaWxlZCArIGZhaWxlZEJ1dE9rOworICAgICAgICB9CisgICAgICAgIGJvb2wgYWxsUGFzc2VkKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZhaWxlZCA9PSAwICYmIGZhaWxlZEJ1dE9rID09IDA7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBhbGxPaygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWQgPT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IHBhc3NlZDsKKyAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkOworICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRCdXRPazsKKyAgICB9OworCisgICAgc3RydWN0IFRvdGFscyB7CisKKyAgICAgICAgVG90YWxzIG9wZXJhdG9yIC0gKCBUb3RhbHMgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgVG90YWxzIGRpZmY7CisgICAgICAgICAgICBkaWZmLmFzc2VydGlvbnMgPSBhc3NlcnRpb25zIC0gb3RoZXIuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGRpZmYudGVzdENhc2VzID0gdGVzdENhc2VzIC0gb3RoZXIudGVzdENhc2VzOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMgZGVsdGEoIFRvdGFscyBjb25zdCYgcHJldlRvdGFscyApIGNvbnN0IHsKKyAgICAgICAgICAgIFRvdGFscyBkaWZmID0gKnRoaXMgLSBwcmV2VG90YWxzOworICAgICAgICAgICAgaWYoIGRpZmYuYXNzZXJ0aW9ucy5mYWlsZWQgPiAwICkKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLmZhaWxlZDsKKyAgICAgICAgICAgIGVsc2UgaWYoIGRpZmYuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayA+IDAgKQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5wYXNzZWQ7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyYgb3BlcmF0b3IgKz0gKCBUb3RhbHMgY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgYXNzZXJ0aW9ucyArPSBvdGhlci5hc3NlcnRpb25zOworICAgICAgICAgICAgdGVzdENhc2VzICs9IG90aGVyLnRlc3RDYXNlczsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICBDb3VudHMgdGVzdENhc2VzOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2VjdGlvbkluZm8geworICAgICAgICBTZWN0aW9uSW5mbworICAgICAgICAgICAgKCAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24gPSBzdGQ6OnN0cmluZygpICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvbkVuZEluZm8geworICAgICAgICBTZWN0aW9uRW5kSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbywgQ291bnRzIGNvbnN0JiBfcHJldkFzc2VydGlvbnMsIGRvdWJsZSBfZHVyYXRpb25JblNlY29uZHMgKQorICAgICAgICA6IHNlY3Rpb25JbmZvKCBfc2VjdGlvbkluZm8gKSwgcHJldkFzc2VydGlvbnMoIF9wcmV2QXNzZXJ0aW9ucyApLCBkdXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRzICkKKyAgICAgICAge30KKworICAgICAgICBTZWN0aW9uSW5mbyBzZWN0aW9uSW5mbzsKKyAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25zOworICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90aW1lci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9USU1FUl9IX0lOQ0xVREVECisKKyNpZmRlZiBfTVNDX1ZFUgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFVJbnQ2NDsKK30KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHR5cGVkZWYgdWludDY0X3QgVUludDY0OworfQorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgVGltZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGltZXIoKSA6IG1fdGlja3MoIDAgKSB7fQorICAgICAgICB2b2lkIHN0YXJ0KCk7CisgICAgICAgIHVuc2lnbmVkIGludCBnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkgY29uc3Q7CisgICAgICAgIHVuc2lnbmVkIGludCBnZXRFbGFwc2VkTWlsbGlzZWNvbmRzKCkgY29uc3Q7CisgICAgICAgIGRvdWJsZSBnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgVUludDY0IG1fdGlja3M7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFNlY3Rpb24gOiBOb25Db3B5YWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBTZWN0aW9uKCBTZWN0aW9uSW5mbyBjb25zdCYgaW5mbyApOworICAgICAgICB+U2VjdGlvbigpOworCisgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNlY3Rpb24gc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIG5vdAorICAgICAgICBvcGVyYXRvciBib29sKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBTZWN0aW9uSW5mbyBtX2luZm87CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9uYW1lOworICAgICAgICBDb3VudHMgbV9hc3NlcnRpb25zOworICAgICAgICBib29sIG1fc2VjdGlvbkluY2x1ZGVkOworICAgICAgICBUaW1lciBtX3RpbWVyOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggLi4uICkgXAorICAgICAgICBpZiggQ2F0Y2g6OlNlY3Rpb24gY29uc3QmIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9TZWN0aW9uICkgPSBDYXRjaDo6U2VjdGlvbkluZm8oIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBfX1ZBX0FSR1NfXyApICkKKyNlbHNlCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjICkgXAorICAgICAgICBpZiggQ2F0Y2g6OlNlY3Rpb24gY29uc3QmIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9TZWN0aW9uICkgPSBDYXRjaDo6U2VjdGlvbkluZm8oIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBuYW1lLCBkZXNjICkgKQorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9nZW5lcmF0b3JzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfR0VORVJBVE9SU19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSUdlbmVyYXRvciB7CisgICAgdmlydHVhbCB+SUdlbmVyYXRvcigpIHt9CisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0ZDo6c2l6ZV90IHNpemUgKCkgY29uc3QgPSAwOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEJldHdlZW5HZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CitwdWJsaWM6CisgICAgQmV0d2VlbkdlbmVyYXRvciggVCBmcm9tLCBUIHRvICkgOiBtX2Zyb20oIGZyb20gKSwgbV90byggdG8gKXt9CisKKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9mcm9tK3N0YXRpY19jYXN0PGludD4oIGluZGV4ICk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCAxK21fdG8tbV9mcm9tICk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgVCBtX2Zyb207CisgICAgVCBtX3RvOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFZhbHVlc0dlbmVyYXRvciA6IHB1YmxpYyBJR2VuZXJhdG9yPFQ+IHsKK3B1YmxpYzoKKyAgICBWYWx1ZXNHZW5lcmF0b3IoKXt9CisKKyAgICB2b2lkIGFkZCggVCB2YWx1ZSApIHsKKyAgICAgICAgbV92YWx1ZXMucHVzaF9iYWNrKCB2YWx1ZSApOworICAgIH0KKworICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3ZhbHVlc1tpbmRleF07CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV92YWx1ZXMuc2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxUPiBtX3ZhbHVlczsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDb21wb3NpdGVHZW5lcmF0b3IgeworcHVibGljOgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcigpIDogbV90b3RhbFNpemUoIDAgKSB7fQorCisgICAgLy8gKioqIE1vdmUgc2VtYW50aWNzLCBzaW1pbGFyIHRvIGF1dG9fcHRyICoqKgorICAgIENvbXBvc2l0ZUdlbmVyYXRvciggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApCisgICAgOiAgIG1fZmlsZUluZm8oIG90aGVyLm1fZmlsZUluZm8gKSwKKyAgICAgICAgbV90b3RhbFNpemUoIDAgKQorICAgIHsKKyAgICAgICAgbW92ZSggb3RoZXIgKTsKKyAgICB9CisKKyAgICBDb21wb3NpdGVHZW5lcmF0b3ImIHNldEZpbGVJbmZvKCBjb25zdCBjaGFyKiBmaWxlSW5mbyApIHsKKyAgICAgICAgbV9maWxlSW5mbyA9IGZpbGVJbmZvOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgfkNvbXBvc2l0ZUdlbmVyYXRvcigpIHsKKyAgICAgICAgZGVsZXRlQWxsKCBtX2NvbXBvc2VkICk7CisgICAgfQorCisgICAgb3BlcmF0b3IgVCAoKSBjb25zdCB7CisgICAgICAgIHNpemVfdCBvdmVyYWxsSW5kZXggPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldEdlbmVyYXRvckluZGV4KCBtX2ZpbGVJbmZvLCBtX3RvdGFsU2l6ZSApOworCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IElHZW5lcmF0b3I8VD4qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2VkLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IElHZW5lcmF0b3I8VD4qPjo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBtX2NvbXBvc2VkLmVuZCgpOworICAgICAgICBmb3IoIHNpemVfdCBpbmRleCA9IDA7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgSUdlbmVyYXRvcjxUPiogZ2VuZXJhdG9yID0gKml0OworICAgICAgICAgICAgaWYoIG92ZXJhbGxJbmRleCA+PSBpbmRleCAmJiBvdmVyYWxsSW5kZXggPCBpbmRleCArIGdlbmVyYXRvci0+c2l6ZSgpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLT5nZXRWYWx1ZSggb3ZlcmFsbEluZGV4LWluZGV4ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCArPSBnZW5lcmF0b3ItPnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBDQVRDSF9JTlRFUk5BTF9FUlJPUiggIkluZGV4ZWQgcGFzdCBlbmQgb2YgZ2VuZXJhdGVkIHJhbmdlIiApOworICAgICAgICByZXR1cm4gVCgpOyAvLyBTdXBwcmVzcyBzcHVyaW91cyAibm90IGFsbCBjb250cm9sIHBhdGhzIHJldHVybiBhIHZhbHVlIiB3YXJuaW5nIGluIFZpc3VhbCBTdHVkaW8gLSBpZiB5b3Uga25vdyBob3cgdG8gZml4IHRoaXMgcGxlYXNlIGRvIHNvCisgICAgfQorCisgICAgdm9pZCBhZGQoIGNvbnN0IElHZW5lcmF0b3I8VD4qIGdlbmVyYXRvciApIHsKKyAgICAgICAgbV90b3RhbFNpemUgKz0gZ2VuZXJhdG9yLT5zaXplKCk7CisgICAgICAgIG1fY29tcG9zZWQucHVzaF9iYWNrKCBnZW5lcmF0b3IgKTsKKyAgICB9CisKKyAgICBDb21wb3NpdGVHZW5lcmF0b3ImIHRoZW4oIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKSB7CisgICAgICAgIG1vdmUoIG90aGVyICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDb21wb3NpdGVHZW5lcmF0b3ImIHRoZW4oIFQgdmFsdWUgKSB7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsdWUgKTsKKyAgICAgICAgYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHZvaWQgbW92ZSggQ29tcG9zaXRlR2VuZXJhdG9yJiBvdGhlciApIHsKKyAgICAgICAgbV9jb21wb3NlZC5pbnNlcnQoIG1fY29tcG9zZWQuZW5kKCksIG90aGVyLm1fY29tcG9zZWQuYmVnaW4oKSwgb3RoZXIubV9jb21wb3NlZC5lbmQoKSApOworICAgICAgICBtX3RvdGFsU2l6ZSArPSBvdGhlci5tX3RvdGFsU2l6ZTsKKyAgICAgICAgb3RoZXIubV9jb21wb3NlZC5jbGVhcigpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElHZW5lcmF0b3I8VD4qPiBtX2NvbXBvc2VkOworICAgIHN0ZDo6c3RyaW5nIG1fZmlsZUluZm87CisgICAgc2l6ZV90IG1fdG90YWxTaXplOworfTsKKworbmFtZXNwYWNlIEdlbmVyYXRvcnMKK3sKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBiZXR3ZWVuKCBUIGZyb20sIFQgdG8gKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggbmV3IEJldHdlZW5HZW5lcmF0b3I8VD4oIGZyb20sIHRvICkgKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiApIHsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIsIFQgdmFsMyApeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwzICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gdmFsdWVzKCBUIHZhbDEsIFQgdmFsMiwgVCB2YWwzLCBUIHZhbDQgKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDMgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDQgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBHZW5lcmF0b3JzCisKK3VzaW5nIG5hbWVzcGFjZSBHZW5lcmF0b3JzOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSMiggbGluZSApICNsaW5lCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0xJTkVTVFIoIGxpbmUgKSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSMiggbGluZSApCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKSBleHByLnNldEZpbGVJbmZvKCBfX0ZJTEVfXyAiKCIgSU5URVJOQUxfQ0FUQ0hfTElORVNUUiggX19MSU5FX18gKSAiKSIgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfaW50ZXJmYWNlc19leGNlcHRpb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19FWENFUFRJT05fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcmVnaXN0cnlfaHViLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfUkVHSVNUUllfSFVCX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVjdCBJVGVzdENhc2VSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3I7CisgICAgc3RydWN0IElSZXBvcnRlclJlZ2lzdHJ5OworICAgIHN0cnVjdCBJUmVwb3J0ZXJGYWN0b3J5OworICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeTsKKworICAgIHN0cnVjdCBJUmVnaXN0cnlIdWIgeworICAgICAgICB2aXJ0dWFsIH5JUmVnaXN0cnlIdWIoKTsKKworICAgICAgICB2aXJ0dWFsIElSZXBvcnRlclJlZ2lzdHJ5IGNvbnN0JiBnZXRSZXBvcnRlclJlZ2lzdHJ5KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIElUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnN0JiBnZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXRUYWdBbGlhc1JlZ2lzdHJ5KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSYgZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSU11dGFibGVSZWdpc3RyeUh1YiB7CisgICAgICAgIHZpcnR1YWwgfklNdXRhYmxlUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApID0gMDsKKyAgICB9OworCisgICAgSVJlZ2lzdHJ5SHViJiBnZXRSZWdpc3RyeUh1YigpOworICAgIElNdXRhYmxlUmVnaXN0cnlIdWImIGdldE11dGFibGVSZWdpc3RyeUh1YigpOworICAgIHZvaWQgY2xlYW5VcCgpOworICAgIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpOworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nKCpleGNlcHRpb25UcmFuc2xhdGVGdW5jdGlvbikoKTsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKj4gRXhjZXB0aW9uVHJhbnNsYXRvcnM7CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IgeworICAgICAgICB2aXJ0dWFsIH5JRXhjZXB0aW9uVHJhbnNsYXRvcigpOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZSggRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0LCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyIHsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvciA6IHB1YmxpYyBJRXhjZXB0aW9uVHJhbnNsYXRvciB7CisgICAgICAgIHB1YmxpYzoKKworICAgICAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvciggc3RkOjpzdHJpbmcoKnRyYW5zbGF0ZUZ1bmN0aW9uKSggVCYgKSApCisgICAgICAgICAgICA6IG1fdHJhbnNsYXRlRnVuY3Rpb24oIHRyYW5zbGF0ZUZ1bmN0aW9uICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdHJhbnNsYXRlKCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXQsIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdEVuZCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQgPT0gaXRFbmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKml0KS0+dHJhbnNsYXRlKCBpdCsxLCBpdEVuZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCggVCYgZXggKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCBleCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBzdGQ6OnN0cmluZygqbV90cmFuc2xhdGVGdW5jdGlvbikoIFQmICk7CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nKCp0cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRyYW5zbGF0b3IKKyAgICAgICAgICAgICAgICAoIG5ldyBFeGNlcHRpb25UcmFuc2xhdG9yPFQ+KCB0cmFuc2xhdGVGdW5jdGlvbiApICk7CisgICAgICAgIH0KKyAgICB9OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04yKCB0cmFuc2xhdG9yTmFtZSwgc2lnbmF0dXJlICkgXAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0cmFuc2xhdG9yTmFtZSggc2lnbmF0dXJlICk7IFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBjYXRjaF9pbnRlcm5hbF9FeGNlcHRpb25SZWdpc3RyYXIgKSggJnRyYW5zbGF0b3JOYW1lICk7IH1cCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHRyYW5zbGF0b3JOYW1lKCBzaWduYXR1cmUgKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04yKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfRXhjZXB0aW9uVHJhbnNsYXRvciApLCBzaWduYXR1cmUgKQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfYXBwcm94LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQVBQUk9YX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFlQRV9UUkFJVFMpCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgY2xhc3MgQXBwcm94IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEFwcHJveCAoIGRvdWJsZSB2YWx1ZSApCisgICAgICAgIDogICBtX2Vwc2lsb24oIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkqMTAwICksCisgICAgICAgICAgICBtX21hcmdpbiggMC4wICksCisgICAgICAgICAgICBtX3NjYWxlKCAxLjAgKSwKKyAgICAgICAgICAgIG1fdmFsdWUoIHZhbHVlICkKKyAgICAgICAge30KKworICAgICAgICBBcHByb3goIEFwcHJveCBjb25zdCYgb3RoZXIgKQorICAgICAgICA6ICAgbV9lcHNpbG9uKCBvdGhlci5tX2Vwc2lsb24gKSwKKyAgICAgICAgICAgIG1fbWFyZ2luKCBvdGhlci5tX21hcmdpbiApLAorICAgICAgICAgICAgbV9zY2FsZSggb3RoZXIubV9zY2FsZSApLAorICAgICAgICAgICAgbV92YWx1ZSggb3RoZXIubV92YWx1ZSApCisgICAgICAgIHt9CisKKyAgICAgICAgc3RhdGljIEFwcHJveCBjdXN0b20oKSB7CisgICAgICAgICAgICByZXR1cm4gQXBwcm94KCAwICk7CisgICAgICAgIH0KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCBvcGVyYXRvcigpKCBUIHZhbHVlICkgeworICAgICAgICAgICAgQXBwcm94IGFwcHJveCggc3RhdGljX2Nhc3Q8ZG91YmxlPih2YWx1ZSkgKTsKKyAgICAgICAgICAgIGFwcHJveC5lcHNpbG9uKCBtX2Vwc2lsb24gKTsKKyAgICAgICAgICAgIGFwcHJveC5tYXJnaW4oIG1fbWFyZ2luICk7CisgICAgICAgICAgICBhcHByb3guc2NhbGUoIG1fc2NhbGUgKTsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3g7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBleHBsaWNpdCBBcHByb3goIFQgdmFsdWUgKTogQXBwcm94KHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggY29uc3QgVCYgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIC8vIFRoYW5rcyB0byBSaWNoYXJkIEhhcnJpcyBmb3IgaGlzIGhlbHAgcmVmaW5pbmcgdGhpcyBmb3JtdWxhCisgICAgICAgICAgICBhdXRvIGxoc192ID0gZG91YmxlKGxocyk7CisgICAgICAgICAgICBib29sIHJlbGF0aXZlT0sgPSBzdGQ6OmZhYnMobGhzX3YgLSByaHMubV92YWx1ZSkgPCByaHMubV9lcHNpbG9uICogKHJocy5tX3NjYWxlICsgKHN0ZDo6bWF4KShzdGQ6OmZhYnMobGhzX3YpLCBzdGQ6OmZhYnMocmhzLm1fdmFsdWUpKSk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVPSykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmFicyhsaHNfdiAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX21hcmdpbjsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggQXBwcm94IGNvbnN0JiBsaHMsIGNvbnN0IFQmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBUIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGRvdWJsZShsaHMpIDwgcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlIDwgZG91YmxlKHJocykgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGRvdWJsZShsaHMpID4gcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggQXBwcm94IGNvbnN0JiBsaHMsIFQgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGxocy5tX3ZhbHVlID4gZG91YmxlKHJocykgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgZXBzaWxvbiggVCBuZXdFcHNpbG9uICkgeworICAgICAgICAgICAgbV9lcHNpbG9uID0gZG91YmxlKG5ld0Vwc2lsb24pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgQXBwcm94JiBtYXJnaW4oIFQgbmV3TWFyZ2luICkgeworICAgICAgICAgICAgbV9tYXJnaW4gPSBkb3VibGUobmV3TWFyZ2luKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgc2NhbGUoIFQgbmV3U2NhbGUgKSB7CisgICAgICAgICAgICBtX3NjYWxlID0gZG91YmxlKG5ld1NjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisjZWxzZQorCisgICAgICAgIEFwcHJveCBvcGVyYXRvcigpKCBkb3VibGUgdmFsdWUgKSB7CisgICAgICAgICAgICBBcHByb3ggYXBwcm94KCB2YWx1ZSApOworICAgICAgICAgICAgYXBwcm94LmVwc2lsb24oIG1fZXBzaWxvbiApOworICAgICAgICAgICAgYXBwcm94Lm1hcmdpbiggbV9tYXJnaW4gKTsKKyAgICAgICAgICAgIGFwcHJveC5zY2FsZSggbV9zY2FsZSApOworICAgICAgICAgICAgcmV0dXJuIGFwcHJveDsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICAvLyBUaGFua3MgdG8gUmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5nIHRoaXMgZm9ybXVsYQorICAgICAgICAgICAgYm9vbCByZWxhdGl2ZU9LID0gc3RkOjpmYWJzKCBsaHMgLSByaHMubV92YWx1ZSApIDwgcmhzLm1fZXBzaWxvbiAqIChyaHMubV9zY2FsZSArIChzdGQ6Om1heCkoIHN0ZDo6ZmFicyhsaHMpLCBzdGQ6OmZhYnMocmhzLm1fdmFsdWUpICkgKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGl2ZU9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmYWJzKGxocyAtIHJocy5tX3ZhbHVlKSA8IHJocy5tX21hcmdpbjsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID09ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCByaHMsIGxocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMgPCByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPD0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA8IHJocyB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBkb3VibGUgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMgPiByaHMubV92YWx1ZSB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgPj0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA+IHJocyB8fCBsaHMgPT0gcmhzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBlcHNpbG9uKCBkb3VibGUgbmV3RXBzaWxvbiApIHsKKyAgICAgICAgICAgIG1fZXBzaWxvbiA9IG5ld0Vwc2lsb247CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBBcHByb3gmIG1hcmdpbiggZG91YmxlIG5ld01hcmdpbiApIHsKKyAgICAgICAgICAgIG1fbWFyZ2luID0gbmV3TWFyZ2luOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBzY2FsZSggZG91YmxlIG5ld1NjYWxlICkgeworICAgICAgICAgICAgbV9zY2FsZSA9IG5ld1NjYWxlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIkFwcHJveCggIiA8PCBDYXRjaDo6dG9TdHJpbmcoIG1fdmFsdWUgKSA8PCAiICkiOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZG91YmxlIG1fZXBzaWxvbjsKKyAgICAgICAgZG91YmxlIG1fbWFyZ2luOworICAgICAgICBkb3VibGUgbV9zY2FsZTsKKyAgICAgICAgZG91YmxlIG1fdmFsdWU7CisgICAgfTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nPERldGFpbDo6QXBwcm94PiggRGV0YWlsOjpBcHByb3ggY29uc3QmIHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX21hdGNoZXJzX3N0cmluZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19TVFJJTkdfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBTdGRTdHJpbmcgeworCisgICAgICAgIHN0cnVjdCBDYXNlZFN0cmluZworICAgICAgICB7CisgICAgICAgICAgICBDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYWRqdXN0U3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3Q7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKSBjb25zdDsKKworICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIG1fY2FzZVNlbnNpdGl2aXR5OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9zdHI7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IFN0cmluZ01hdGNoZXJCYXNlIDogTWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IHsKKyAgICAgICAgICAgIFN0cmluZ01hdGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0aW9uLCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFOworCisgICAgICAgICAgICBDYXNlZFN0cmluZyBtX2NvbXBhcmF0b3I7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX29wZXJhdGlvbjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgRXF1YWxzTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIEVxdWFsc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IENvbnRhaW5zTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIENvbnRhaW5zTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgU3RhcnRzV2l0aE1hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBTdGFydHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgRW5kc1dpdGhNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgRW5kc1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBTdGRTdHJpbmcKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKworICAgIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciBFcXVhbHMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciBDb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyIEVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpTdGFydHNXaXRoTWF0Y2hlciBTdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbWF0Y2hlcnNfdmVjdG9yLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX1ZFQ1RPUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFZlY3RvciB7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IENvbnRhaW5zRWxlbWVudE1hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxUPiwgVD4geworCisgICAgICAgICAgICBDb250YWluc0VsZW1lbnRNYXRjaGVyKFQgY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZCh2LmJlZ2luKCksIHYuZW5kKCksIG1fY29tcGFyYXRvcikgIT0gdi5lbmQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbnRhaW5zOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVCBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBDb250YWluc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxUPiwgc3RkOjp2ZWN0b3I8VD4gPiB7CisKKyAgICAgICAgICAgIENvbnRhaW5zTWF0Y2hlcihzdGQ6OnZlY3RvcjxUPiBjb25zdCAmY29tcGFyYXRvcikgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgICAgICBib29sIG1hdGNoKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZ2KSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgLy8gIVRCRDogc2VlIG5vdGUgaW4gRXF1YWxzTWF0Y2hlcgorICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3Iuc2l6ZSgpID4gdi5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY29tcGFyYXRvci5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZCh2LmJlZ2luKCksIHYuZW5kKCksIG1fY29tcGFyYXRvcltpXSkgPT0gdi5lbmQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb250YWluczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBNYXRjaGVyQmFzZTxzdGQ6OnZlY3RvcjxUPiwgc3RkOjp2ZWN0b3I8VD4gPiB7CisKKyAgICAgICAgICAgIEVxdWFsc01hdGNoZXIoc3RkOjp2ZWN0b3I8VD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICkge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIC8vICFUQkQ6IFRoaXMgY3VycmVudGx5IHdvcmtzIGlmIGFsbCBlbGVtZW50cyBjYW4gYmUgY29tcGFyZWQgdXNpbmcgIT0KKyAgICAgICAgICAgICAgICAvLyAtIGEgbW9yZSBnZW5lcmFsIGFwcHJvYWNoIHdvdWxkIGJlIHZpYSBhIGNvbXBhcmUgdGVtcGxhdGUgdGhhdCBkZWZhdWx0cworICAgICAgICAgICAgICAgIC8vIHRvIHVzaW5nICE9LiBidXQgY291bGQgYmUgc3BlY2lhbGlzZWQgZm9yLCBlLmcuIHN0ZDo6dmVjdG9yPFQ+IGV0YworICAgICAgICAgICAgICAgIC8vIC0gdGhlbiBqdXN0IGNhbGwgdGhhdCBkaXJlY3RseQorICAgICAgICAgICAgICAgIGlmIChtX2NvbXBhcmF0b3Iuc2l6ZSgpICE9IHYuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yW2ldICE9IHZbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiRXF1YWxzOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX2NvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBtX2NvbXBhcmF0b3I7CisgICAgICAgIH07CisKKyAgICB9IC8vIG5hbWVzcGFjZSBWZWN0b3IKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpDb250YWluc01hdGNoZXI8VD4gQ29udGFpbnMoIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpDb250YWluc01hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6Q29udGFpbnNFbGVtZW50TWF0Y2hlcjxUPiBWZWN0b3JDb250YWlucyggVCBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6Q29udGFpbnNFbGVtZW50TWF0Y2hlcjxUPiggY29tcGFyYXRvciApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQ+IEVxdWFscyggc3RkOjp2ZWN0b3I8VD4gY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkVxdWFsc01hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfaW50ZXJmYWNlc190YWdfYWxpYXNfcmVnaXN0cnkuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19UQUdfQUxJQVNfUkVHSVNUUllfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVGFnQWxpYXMgeworICAgICAgICBUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIF90YWcsIFNvdXJjZUxpbmVJbmZvIF9saW5lSW5mbyApIDogdGFnKCBfdGFnICksIGxpbmVJbmZvKCBfbGluZUluZm8gKSB7fQorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZzsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgfTsKKworICAgIHN0cnVjdCBSZWdpc3RyYXJGb3JUYWdBbGlhc2VzIHsKKyAgICAgICAgUmVnaXN0cmFyRm9yVGFnQWxpYXNlcyggY2hhciBjb25zdCogYWxpYXMsIGNoYXIgY29uc3QqIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEFHX0FMSUFTKCBhbGlhcywgc3BlYyApIG5hbWVzcGFjZXsgQ2F0Y2g6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIEF1dG9SZWdpc3RlclRhZ0FsaWFzICkoIGFsaWFzLCBzcGVjLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfb3B0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfT1BUSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gQW4gb3B0aW9uYWwgdHlwZQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgT3B0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE9wdGlvbigpIDogbnVsbGFibGVWYWx1ZSggQ0FUQ0hfTlVMTCApIHt9CisgICAgICAgIE9wdGlvbiggVCBjb25zdCYgX3ZhbHVlICkKKyAgICAgICAgOiBudWxsYWJsZVZhbHVlKCBuZXcoIHN0b3JhZ2UgKSBUKCBfdmFsdWUgKSApCisgICAgICAgIHt9CisgICAgICAgIE9wdGlvbiggT3B0aW9uIGNvbnN0JiBfb3RoZXIgKQorICAgICAgICA6IG51bGxhYmxlVmFsdWUoIF9vdGhlciA/IG5ldyggc3RvcmFnZSApIFQoICpfb3RoZXIgKSA6IENBVENIX05VTEwgKQorICAgICAgICB7fQorCisgICAgICAgIH5PcHRpb24oKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgT3B0aW9uJiBvcGVyYXRvcj0gKCBPcHRpb24gY29uc3QmIF9vdGhlciApIHsKKyAgICAgICAgICAgIGlmKCAmX290aGVyICE9IHRoaXMgKSB7CisgICAgICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgICAgICBpZiggX290aGVyICkKKyAgICAgICAgICAgICAgICAgICAgbnVsbGFibGVWYWx1ZSA9IG5ldyggc3RvcmFnZSApIFQoICpfb3RoZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBPcHRpb24mIG9wZXJhdG9yID0gKCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgbnVsbGFibGVWYWx1ZSA9IG5ldyggc3RvcmFnZSApIFQoIF92YWx1ZSApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBudWxsYWJsZVZhbHVlICkKKyAgICAgICAgICAgICAgICBudWxsYWJsZVZhbHVlLT5+VCgpOworICAgICAgICAgICAgbnVsbGFibGVWYWx1ZSA9IENBVENIX05VTEw7CisgICAgICAgIH0KKworICAgICAgICBUJiBvcGVyYXRvciooKSB7IHJldHVybiAqbnVsbGFibGVWYWx1ZTsgfQorICAgICAgICBUIGNvbnN0JiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbnVsbGFibGVWYWx1ZTsgfQorICAgICAgICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gbnVsbGFibGVWYWx1ZTsgfQorICAgICAgICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZTsgfQorCisgICAgICAgIFQgdmFsdWVPciggVCBjb25zdCYgZGVmYXVsdFZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG51bGxhYmxlVmFsdWUgPyAqbnVsbGFibGVWYWx1ZSA6IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc29tZSgpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWUgIT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBib29sIG5vbmUoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlID09IENBVENIX05VTEw7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yICEoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlID09IENBVENIX05VTEw7IH0KKyAgICAgICAgb3BlcmF0b3IgU2FmZUJvb2w6OnR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gU2FmZUJvb2w6Om1ha2VTYWZlKCBzb21lKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCAqbnVsbGFibGVWYWx1ZTsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgY2hhciBzdG9yYWdlW3NpemVvZihUKV07CisKKyAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBoZXJlIHRvIGZvcmNlIGFsaWdubWVudCBmb3IgdGhlIHN0b3JhZ2UKKyAgICAgICAgICAgIGxvbmcgZG91YmxlIGR1bW15MTsKKyAgICAgICAgICAgIHZvaWQgKCpkdW1teTIpKCk7CisgICAgICAgICAgICBsb25nIGRvdWJsZSBkdW1teTM7CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworICAgICAgICAgICAgbG9uZyBsb25nIGR1bW15NDsKKyNlbmRpZgorICAgICAgICB9OworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElUYWdBbGlhc1JlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SVRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBPcHRpb248VGFnQWxpYXM+IGZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBleHBhbmRBbGlhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgdW5leHBhbmRlZFRlc3RTcGVjICkgY29uc3QgPSAwOworCisgICAgICAgIHN0YXRpYyBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0KCk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vIFRoZXNlIGZpbGVzIGFyZSBpbmNsdWRlZCBoZXJlIHNvIHRoZSBzaW5nbGVfaW5jbHVkZSBzY3JpcHQgZG9lc24ndCBwdXQgdGhlbQorLy8gaW4gdGhlIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgc2VjdGlvbnMKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF90ZXN0X2Nhc2VfaW5mby5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfSU5GT19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c2V0PgorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlOworCisgICAgc3RydWN0IFRlc3RDYXNlSW5mbyB7CisgICAgICAgIGVudW0gU3BlY2lhbFByb3BlcnRpZXN7CisgICAgICAgICAgICBOb25lID0gMCwKKyAgICAgICAgICAgIElzSGlkZGVuID0gMSA8PCAxLAorICAgICAgICAgICAgU2hvdWxkRmFpbCA9IDEgPDwgMiwKKyAgICAgICAgICAgIE1heUZhaWwgPSAxIDw8IDMsCisgICAgICAgICAgICBUaHJvd3MgPSAxIDw8IDQsCisgICAgICAgICAgICBOb25Qb3J0YWJsZSA9IDEgPDwgNQorICAgICAgICB9OworCisgICAgICAgIFRlc3RDYXNlSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApOworCisgICAgICAgIFRlc3RDYXNlSW5mbyggVGVzdENhc2VJbmZvIGNvbnN0JiBvdGhlciApOworCisgICAgICAgIGZyaWVuZCB2b2lkIHNldFRhZ3MoIFRlc3RDYXNlSW5mbyYgdGVzdENhc2VJbmZvLCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uc3QmIHRhZ3MgKTsKKworICAgICAgICBib29sIGlzSGlkZGVuKCkgY29uc3Q7CisgICAgICAgIGJvb2wgdGhyb3dzKCkgY29uc3Q7CisgICAgICAgIGJvb2wgb2tUb0ZhaWwoKSBjb25zdDsKKyAgICAgICAgYm9vbCBleHBlY3RlZFRvRmFpbCgpIGNvbnN0OworCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNsYXNzTmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0YWdzOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGNhc2VUYWdzOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzQXNTdHJpbmc7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgICAgICBTcGVjaWFsUHJvcGVydGllcyBwcm9wZXJ0aWVzOworICAgIH07CisKKyAgICBjbGFzcyBUZXN0Q2FzZSA6IHB1YmxpYyBUZXN0Q2FzZUluZm8geworICAgIHB1YmxpYzoKKworICAgICAgICBUZXN0Q2FzZSggSVRlc3RDYXNlKiB0ZXN0Q2FzZSwgVGVzdENhc2VJbmZvIGNvbnN0JiBpbmZvICk7CisgICAgICAgIFRlc3RDYXNlKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBUZXN0Q2FzZSB3aXRoTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9uZXdOYW1lICkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBpbnZva2UoKSBjb25zdDsKKworICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc3dhcCggVGVzdENhc2UmIG90aGVyICk7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvciA8ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIFRlc3RDYXNlJiBvcGVyYXRvciA9ICggVGVzdENhc2UgY29uc3QmIG90aGVyICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQdHI8SVRlc3RDYXNlPiB0ZXN0OworICAgIH07CisKKyAgICBUZXN0Q2FzZSBtYWtlVGVzdENhc2UoICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworCisjaWZkZWYgX19PQkpDX18KKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9vYmpjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfT0JKQ19IUFBfSU5DTFVERUQKKworI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIE5CLiBBbnkgZ2VuZXJhbCBjYXRjaCBoZWFkZXJzIGluY2x1ZGVkIGhlcmUgbXVzdCBiZSBpbmNsdWRlZAorLy8gaW4gY2F0Y2guaHBwIGZpcnN0IHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBpbmNsdWRlZCBieSB0aGUgc2luZ2xlCisvLyBoZWFkZXIgZm9yIG5vbiBvYmotdXNhZ2UKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gVGhpcyBwcm90b2NvbCBpcyByZWFsbHkgb25seSBoZXJlIGZvciAoc2VsZikgZG9jdW1lbnRpbmcgcHVycG9zZXMsIHNpbmNlCisvLyBhbGwgaXRzIG1ldGhvZHMgYXJlIG9wdGlvbmFsLgorQHByb3RvY29sIE9jRml4dHVyZQorCitAb3B0aW9uYWwKKworLSh2b2lkKSBzZXRVcDsKKy0odm9pZCkgdGVhckRvd247CisKK0BlbmQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIE9jTWV0aG9kIDogcHVibGljIFNoYXJlZEltcGw8SVRlc3RDYXNlPiB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIE9jTWV0aG9kKCBDbGFzcyBjbHMsIFNFTCBzZWwgKSA6IG1fY2xzKCBjbHMgKSwgbV9zZWwoIHNlbCApIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIGlkIG9iaiA9IFtbbV9jbHMgYWxsb2NdIGluaXRdOworCisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0b3Ioc2V0VXApICApOworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgbV9zZWwgKTsKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIEBzZWxlY3Rvcih0ZWFyRG93bikgICk7CisKKyAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBvYmogKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgfk9jTWV0aG9kKCkge30KKworICAgICAgICBDbGFzcyBtX2NsczsKKyAgICAgICAgU0VMIG1fc2VsOworICAgIH07CisKKyAgICBuYW1lc3BhY2UgRGV0YWlseworCisgICAgICAgIGlubGluZSBzdGQ6OnN0cmluZyBnZXRBbm5vdGF0aW9uKCAgIENsYXNzIGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGFubm90YXRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdENhc2VOYW1lICkgeworICAgICAgICAgICAgTlNTdHJpbmcqIHNlbFN0ciA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRm9ybWF0OkAiQ2F0Y2hfJXNfJXMiLCBhbm5vdGF0aW9uTmFtZS5jX3N0cigpLCB0ZXN0Q2FzZU5hbWUuY19zdHIoKV07CisgICAgICAgICAgICBTRUwgc2VsID0gTlNTZWxlY3RvckZyb21TdHJpbmcoIHNlbFN0ciApOworICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIHNlbFN0ciApOworICAgICAgICAgICAgaWQgdmFsdWUgPSBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggY2xzLCBzZWwgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgcmV0dXJuIFsoTlNTdHJpbmcqKXZhbHVlIFVURjhTdHJpbmddOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIHNpemVfdCByZWdpc3RlclRlc3RNZXRob2RzKCkgeworICAgICAgICBzaXplX3Qgbm9UZXN0TWV0aG9kcyA9IDA7CisgICAgICAgIGludCBub0NsYXNzZXMgPSBvYmpjX2dldENsYXNzTGlzdCggQ0FUQ0hfTlVMTCwgMCApOworCisgICAgICAgIENsYXNzKiBjbGFzc2VzID0gKENBVENIX1VOU0FGRV9VTlJFVEFJTkVEIENsYXNzICopbWFsbG9jKCBzaXplb2YoQ2xhc3MpICogbm9DbGFzc2VzKTsKKyAgICAgICAgb2JqY19nZXRDbGFzc0xpc3QoIGNsYXNzZXMsIG5vQ2xhc3NlcyApOworCisgICAgICAgIGZvciggaW50IGMgPSAwOyBjIDwgbm9DbGFzc2VzOyBjKysgKSB7CisgICAgICAgICAgICBDbGFzcyBjbHMgPSBjbGFzc2VzW2NdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVfaW50IGNvdW50OworICAgICAgICAgICAgICAgIE1ldGhvZCogbWV0aG9kcyA9IGNsYXNzX2NvcHlNZXRob2RMaXN0KCBjbHMsICZjb3VudCApOworICAgICAgICAgICAgICAgIGZvciggdV9pbnQgbSA9IDA7IG0gPCBjb3VudCA7IG0rKyApIHsKKyAgICAgICAgICAgICAgICAgICAgU0VMIHNlbGVjdG9yID0gbWV0aG9kX2dldE5hbWUobWV0aG9kc1ttXSk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZE5hbWUgPSBzZWxfZ2V0TmFtZShzZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCBtZXRob2ROYW1lLCAiQ2F0Y2hfVGVzdENhc2VfIiApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdENhc2VOYW1lID0gbWV0aG9kTmFtZS5zdWJzdHIoIDE1ICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gRGV0YWlsOjpnZXRBbm5vdGF0aW9uKCBjbHMsICJOYW1lIiwgdGVzdENhc2VOYW1lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXNjID0gRGV0YWlsOjpnZXRBbm5vdGF0aW9uKCBjbHMsICJEZXNjcmlwdGlvbiIsIHRlc3RDYXNlTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NOYW1lID0gY2xhc3NfZ2V0TmFtZSggY2xzICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyVGVzdCggbWFrZVRlc3RDYXNlKCBuZXcgT2NNZXRob2QoIGNscywgc2VsZWN0b3IgKSwgY2xhc3NOYW1lLCBuYW1lLmNfc3RyKCksIGRlc2MuY19zdHIoKSwgU291cmNlTGluZUluZm8oKSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICBub1Rlc3RNZXRob2RzKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJlZShtZXRob2RzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9UZXN0TWV0aG9kczsKKyAgICB9CisKKyAgICBuYW1lc3BhY2UgTWF0Y2hlcnMgeworICAgICAgICBuYW1lc3BhY2UgSW1wbCB7CisgICAgICAgIG5hbWVzcGFjZSBOU1N0cmluZ01hdGNoZXJzIHsKKworICAgICAgICAgICAgc3RydWN0IFN0cmluZ0hvbGRlciA6IE1hdGNoZXJCYXNlPE5TU3RyaW5nKj57CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCBOU1N0cmluZyogc3Vic3RyICkgOiBtX3N1YnN0ciggW3N1YnN0ciBjb3B5XSApe30KKyAgICAgICAgICAgICAgICBTdHJpbmdIb2xkZXIoIFN0cmluZ0hvbGRlciBjb25zdCYgb3RoZXIgKSA6IG1fc3Vic3RyKCBbb3RoZXIubV9zdWJzdHIgY29weV0gKXt9CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBOU1N0cmluZyogbV9zdWJzdHI7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgRXF1YWxzIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBFcXVhbHMoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciBpc0VxdWFsVG9TdHJpbmc6bV9zdWJzdHJdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZXF1YWxzIHN0cmluZzogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgQ29udGFpbnMgOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIENvbnRhaW5zKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgcmFuZ2VPZlN0cmluZzptX3N1YnN0cl0ubG9jYXRpb24gIT0gTlNOb3RGb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRhaW5zIHN0cmluZzogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgU3RhcnRzV2l0aCA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgU3RhcnRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uID09IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdGFydHMgd2l0aDogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgc3RydWN0IEVuZHNXaXRoIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBFbmRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uID09IFtzdHIgbGVuZ3RoXSAtIFttX3N1YnN0ciBsZW5ndGhdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZW5kcyB3aXRoOiAiICsgQ2F0Y2g6OnRvU3RyaW5nKCBtX3N1YnN0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgTlNTdHJpbmdNYXRjaGVycworICAgICAgICB9IC8vIG5hbWVzcGFjZSBJbXBsCisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVxdWFscworICAgICAgICAgICAgRXF1YWxzKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVhbHMoIHN1YnN0ciApOyB9CisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5zCisgICAgICAgICAgICBDb250YWlucyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6Q29udGFpbnMoIHN1YnN0ciApOyB9CisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OlN0YXJ0c1dpdGgKKyAgICAgICAgICAgIFN0YXJ0c1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OlN0YXJ0c1dpdGgoIHN1YnN0ciApOyB9CisKKyAgICAgICAgaW5saW5lIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVuZHNXaXRoCisgICAgICAgICAgICBFbmRzV2l0aCggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RW5kc1dpdGgoIHN1YnN0ciApOyB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworCisgICAgdXNpbmcgbmFtZXNwYWNlIE1hdGNoZXJzOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIE9DX1RFU1RfQ0FTRSggbmFtZSwgZGVzYyApXAorKyhOU1N0cmluZyopIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9OYW1lX3Rlc3QgKSBcCit7XAorcmV0dXJuIEAgbmFtZTsgXAorfVwKKysoTlNTdHJpbmcqKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfRGVzY3JpcHRpb25fdGVzdCApIFwKK3sgXAorcmV0dXJuIEAgZGVzYzsgXAorfSBcCistKHZvaWQpIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBDYXRjaF9UZXN0Q2FzZV90ZXN0ICkKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9JTVBMCisKKy8vICFUQkQ6IE1vdmUgdGhlIGxlYWsgZGV0ZWN0b3IgY29kZSBpbnRvIGEgc2VwYXJhdGUgaGVhZGVyCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1dJTkRPV1NfQ1JUREJHCisjaW5jbHVkZSA8Y3J0ZGJnLmg+CitjbGFzcyBMZWFrRGV0ZWN0b3IgeworcHVibGljOgorCUxlYWtEZXRlY3RvcigpIHsKKwkJaW50IGZsYWcgPSBfQ3J0U2V0RGJnRmxhZyhfQ1JUREJHX1JFUE9SVF9GTEFHKTsKKwkJZmxhZyB8PSBfQ1JUREJHX0xFQUtfQ0hFQ0tfREY7CisJCWZsYWcgfD0gX0NSVERCR19BTExPQ19NRU1fREY7CisJCV9DcnRTZXREYmdGbGFnKGZsYWcpOworCQlfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX1dBUk4sIF9DUlREQkdfTU9ERV9GSUxFIHwgX0NSVERCR19NT0RFX0RFQlVHKTsKKwkJX0NydFNldFJlcG9ydEZpbGUoX0NSVF9XQVJOLCBfQ1JUREJHX0ZJTEVfU1RERVJSKTsKKwkJLy8gQ2hhbmdlIHRoaXMgdG8gbGVha2luZyBhbGxvY2F0aW9uJ3MgbnVtYmVyIHRvIGJyZWFrIHRoZXJlCisJCV9DcnRTZXRCcmVha0FsbG9jKC0xKTsKKwl9Cit9OworI2Vsc2UKK2NsYXNzIExlYWtEZXRlY3RvciB7fTsKKyNlbmRpZgorCitMZWFrRGV0ZWN0b3IgbGVha0RldGVjdG9yOworCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lNUExfSFBQX0lOQ0xVREVECisKKy8vIENvbGxlY3QgYWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlcyB0b2dldGhlciBoZXJlCisvLyBUaGVzZSBhcmUgdGhlIGVxdWl2YWxlbnQgb2Ygd2hhdCB3b3VsZCB1c3VhbGx5IGJlIGNwcCBmaWxlcworCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1Xd2Vhay12dGFibGVzIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9jYXRjaF9zZXNzaW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUlVOTkVSX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY29tbWFuZGxpbmUuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NQU5ETElORV9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbmZpZy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTkZJR19IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3Rfc3BlY19wYXJzZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1NQRUNfUEFSU0VSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X3NwZWMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX1NQRUNfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3dpbGRjYXJkX3BhdHRlcm4uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9XSUxEQ0FSRF9QQVRURVJOX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBjbGFzcyBXaWxkY2FyZFBhdHRlcm4geworICAgICAgICBlbnVtIFdpbGRjYXJkUG9zaXRpb24geworICAgICAgICAgICAgTm9XaWxkY2FyZCA9IDAsCisgICAgICAgICAgICBXaWxkY2FyZEF0U3RhcnQgPSAxLAorICAgICAgICAgICAgV2lsZGNhcmRBdEVuZCA9IDIsCisgICAgICAgICAgICBXaWxkY2FyZEF0Qm90aEVuZHMgPSBXaWxkY2FyZEF0U3RhcnQgfCBXaWxkY2FyZEF0RW5kCisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgV2lsZGNhcmRQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgcGF0dGVybiwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApCisgICAgICAgIDogICBtX2Nhc2VTZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCisgICAgICAgICAgICBtX3dpbGRjYXJkKCBOb1dpbGRjYXJkICksCisgICAgICAgICAgICBtX3BhdHRlcm4oIGFkanVzdENhc2UoIHBhdHRlcm4gKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCBtX3BhdHRlcm4sICcqJyApICkgeworICAgICAgICAgICAgICAgIG1fcGF0dGVybiA9IG1fcGF0dGVybi5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICBtX3dpbGRjYXJkID0gV2lsZGNhcmRBdFN0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGVuZHNXaXRoKCBtX3BhdHRlcm4sICcqJyApICkgeworICAgICAgICAgICAgICAgIG1fcGF0dGVybiA9IG1fcGF0dGVybi5zdWJzdHIoIDAsIG1fcGF0dGVybi5zaXplKCktMSApOworICAgICAgICAgICAgICAgIG1fd2lsZGNhcmQgPSBzdGF0aWNfY2FzdDxXaWxkY2FyZFBvc2l0aW9uPiggbV93aWxkY2FyZCB8IFdpbGRjYXJkQXRFbmQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5XaWxkY2FyZFBhdHRlcm4oKTsKKyAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICBzd2l0Y2goIG1fd2lsZGNhcmQgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb1dpbGRjYXJkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV9wYXR0ZXJuID09IGFkanVzdENhc2UoIHN0ciApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdFN0YXJ0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRFbmQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydHNXaXRoKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0Qm90aEVuZHM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWlucyggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW5yZWFjaGFibGUtY29kZSIKKyNlbmRpZgorICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVua25vd24gZW51bSIgKTsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgYWRqdXN0Q2FzZSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObyA/IHRvTG93ZXIoIHN0ciApIDogc3RyOworICAgICAgICB9CisgICAgICAgIENhc2VTZW5zaXRpdmU6OkNob2ljZSBtX2Nhc2VTZW5zaXRpdml0eTsKKyAgICAgICAgV2lsZGNhcmRQb3NpdGlvbiBtX3dpbGRjYXJkOworICAgICAgICBzdGQ6OnN0cmluZyBtX3BhdHRlcm47CisgICAgfTsKK30KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlYyB7CisgICAgICAgIHN0cnVjdCBQYXR0ZXJuIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIHZpcnR1YWwgflBhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgPSAwOworICAgICAgICB9OworICAgICAgICBjbGFzcyBOYW1lUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgTmFtZVBhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkKKyAgICAgICAgICAgIDogbV93aWxkY2FyZFBhdHRlcm4oIHRvTG93ZXIoIG5hbWUgKSwgQ2FzZVNlbnNpdGl2ZTo6Tm8gKQorICAgICAgICAgICAge30KKyAgICAgICAgICAgIHZpcnR1YWwgfk5hbWVQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV93aWxkY2FyZFBhdHRlcm4ubWF0Y2hlcyggdG9Mb3dlciggdGVzdENhc2UubmFtZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBXaWxkY2FyZFBhdHRlcm4gbV93aWxkY2FyZFBhdHRlcm47CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgVGFnUGF0dGVybiA6IHB1YmxpYyBQYXR0ZXJuIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVGFnUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIDogbV90YWcoIHRvTG93ZXIoIHRhZyApICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgflRhZ1BhdHRlcm4oKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0Q2FzZS5sY2FzZVRhZ3MuZmluZCggbV90YWcgKSAhPSB0ZXN0Q2FzZS5sY2FzZVRhZ3MuZW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtX3RhZzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBFeGNsdWRlZFBhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEV4Y2x1ZGVkUGF0dGVybiggUHRyPFBhdHRlcm4+IGNvbnN0JiB1bmRlcmx5aW5nUGF0dGVybiApIDogbV91bmRlcmx5aW5nUGF0dGVybiggdW5kZXJseWluZ1BhdHRlcm4gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+RXhjbHVkZWRQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsgcmV0dXJuICFtX3VuZGVybHlpbmdQYXR0ZXJuLT5tYXRjaGVzKCB0ZXN0Q2FzZSApOyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBQdHI8UGF0dGVybj4gbV91bmRlcmx5aW5nUGF0dGVybjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgRmlsdGVyIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxQYXR0ZXJuPiA+IG1fcGF0dGVybnM7CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAvLyBBbGwgcGF0dGVybnMgaW4gYSBmaWx0ZXIgbXVzdCBtYXRjaCBmb3IgdGhlIGZpbHRlciB0byBiZSBhIG1hdGNoCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxQdHI8UGF0dGVybj4gPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3BhdHRlcm5zLmJlZ2luKCksIGl0RW5kID0gbV9wYXR0ZXJucy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhKCppdCktPm1hdGNoZXMoIHRlc3RDYXNlICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBoYXNGaWx0ZXJzKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICFtX2ZpbHRlcnMuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAvLyBBIFRlc3RTcGVjIG1hdGNoZXMgaWYgYW55IGZpbHRlciBtYXRjaGVzCisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPEZpbHRlcj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9maWx0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9maWx0ZXJzLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgaWYoIGl0LT5tYXRjaGVzKCB0ZXN0Q2FzZSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPEZpbHRlcj4gbV9maWx0ZXJzOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBUZXN0U3BlY1BhcnNlcjsKKyAgICB9OworfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRlc3RTcGVjUGFyc2VyIHsKKyAgICAgICAgZW51bSBNb2RleyBOb25lLCBOYW1lLCBRdW90ZWROYW1lLCBUYWcsIEVzY2FwZWROYW1lIH07CisgICAgICAgIE1vZGUgbV9tb2RlOworICAgICAgICBib29sIG1fZXhjbHVzaW9uOworICAgICAgICBzdGQ6OnNpemVfdCBtX3N0YXJ0LCBtX3BvczsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9hcmc7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBtX2VzY2FwZUNoYXJzOworICAgICAgICBUZXN0U3BlYzo6RmlsdGVyIG1fY3VycmVudEZpbHRlcjsKKyAgICAgICAgVGVzdFNwZWMgbV90ZXN0U3BlYzsKKyAgICAgICAgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QqIG1fdGFnQWxpYXNlczsKKworICAgIHB1YmxpYzoKKyAgICAgICAgVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiB0YWdBbGlhc2VzICkgOiBtX3RhZ0FsaWFzZXMoICZ0YWdBbGlhc2VzICkge30KKworICAgICAgICBUZXN0U3BlY1BhcnNlciYgcGFyc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcgKSB7CisgICAgICAgICAgICBtX21vZGUgPSBOb25lOworICAgICAgICAgICAgbV9leGNsdXNpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIG1fc3RhcnQgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgIG1fYXJnID0gbV90YWdBbGlhc2VzLT5leHBhbmRBbGlhc2VzKCBhcmcgKTsKKyAgICAgICAgICAgIG1fZXNjYXBlQ2hhcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGZvciggbV9wb3MgPSAwOyBtX3BvcyA8IG1fYXJnLnNpemUoKTsgKyttX3BvcyApCisgICAgICAgICAgICAgICAgdmlzaXRDaGFyKCBtX2FyZ1ttX3Bvc10gKTsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTmFtZSApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMoKSB7CisgICAgICAgICAgICBhZGRGaWx0ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBtX3Rlc3RTcGVjOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCB2aXNpdENoYXIoIGNoYXIgYyApIHsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTm9uZSApIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnICc6IHJldHVybjsKKyAgICAgICAgICAgICAgICBjYXNlICd+JzogbV9leGNsdXNpb24gPSB0cnVlOyByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSAnWyc6IHJldHVybiBzdGFydE5ld01vZGUoIFRhZywgKyttX3BvcyApOworICAgICAgICAgICAgICAgIGNhc2UgJyInOiByZXR1cm4gc3RhcnROZXdNb2RlKCBRdW90ZWROYW1lLCArK21fcG9zICk7CisgICAgICAgICAgICAgICAgY2FzZSAnXFwnOiByZXR1cm4gZXNjYXBlKCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogc3RhcnROZXdNb2RlKCBOYW1lLCBtX3BvcyApOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5hbWUgKSB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJywnICkgeworICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRmlsdGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1snICkgeworICAgICAgICAgICAgICAgICAgICBpZiggc3ViU3RyaW5nKCkgPT0gImV4Y2x1ZGU6IiApCisgICAgICAgICAgICAgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgICAgICAgICBzdGFydE5ld01vZGUoIFRhZywgKyttX3BvcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdcXCcgKQorICAgICAgICAgICAgICAgICAgICBlc2NhcGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIG1fbW9kZSA9PSBFc2NhcGVkTmFtZSApCisgICAgICAgICAgICAgICAgbV9tb2RlID0gTmFtZTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fbW9kZSA9PSBRdW90ZWROYW1lICYmIGMgPT0gJyInICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fbW9kZSA9PSBUYWcgJiYgYyA9PSAnXScgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6OlRhZ1BhdHRlcm4+KCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzdGFydE5ld01vZGUoIE1vZGUgbW9kZSwgc3RkOjpzaXplX3Qgc3RhcnQgKSB7CisgICAgICAgICAgICBtX21vZGUgPSBtb2RlOworICAgICAgICAgICAgbV9zdGFydCA9IHN0YXJ0OworICAgICAgICB9CisgICAgICAgIHZvaWQgZXNjYXBlKCkgeworICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOb25lICkKKyAgICAgICAgICAgICAgICBtX3N0YXJ0ID0gbV9wb3M7CisgICAgICAgICAgICBtX21vZGUgPSBFc2NhcGVkTmFtZTsKKyAgICAgICAgICAgIG1fZXNjYXBlQ2hhcnMucHVzaF9iYWNrKCBtX3BvcyApOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHN1YlN0cmluZygpIGNvbnN0IHsgcmV0dXJuIG1fYXJnLnN1YnN0ciggbV9zdGFydCwgbV9wb3MgLSBtX3N0YXJ0ICk7IH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGRQYXR0ZXJuKCkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG9rZW4gPSBzdWJTdHJpbmcoKTsKKyAgICAgICAgICAgIGZvciggc2l6ZV90IGkgPSAwOyBpIDwgbV9lc2NhcGVDaGFycy5zaXplKCk7ICsraSApCisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoIDAsIG1fZXNjYXBlQ2hhcnNbaV0tbV9zdGFydC1pICkgKyB0b2tlbi5zdWJzdHIoIG1fZXNjYXBlQ2hhcnNbaV0tbV9zdGFydC1pKzEgKTsKKyAgICAgICAgICAgIG1fZXNjYXBlQ2hhcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0b2tlbiwgImV4Y2x1ZGU6IiApICkgeworICAgICAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnN1YnN0ciggOCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICF0b2tlbi5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFB0cjxUZXN0U3BlYzo6UGF0dGVybj4gcGF0dGVybiA9IG5ldyBUKCB0b2tlbiApOworICAgICAgICAgICAgICAgIGlmKCBtX2V4Y2x1c2lvbiApCisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBuZXcgVGVzdFNwZWM6OkV4Y2x1ZGVkUGF0dGVybiggcGF0dGVybiApOworICAgICAgICAgICAgICAgIG1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLnB1c2hfYmFjayggcGF0dGVybiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9leGNsdXNpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIG1fbW9kZSA9IE5vbmU7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBhZGRGaWx0ZXIoKSB7CisgICAgICAgICAgICBpZiggIW1fY3VycmVudEZpbHRlci5tX3BhdHRlcm5zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV90ZXN0U3BlYy5tX2ZpbHRlcnMucHVzaF9iYWNrKCBtX2N1cnJlbnRGaWx0ZXIgKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRGaWx0ZXIgPSBUZXN0U3BlYzo6RmlsdGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlubGluZSBUZXN0U3BlYyBwYXJzZVRlc3RTcGVjKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICkgeworICAgICAgICByZXR1cm4gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCBhcmcgKS50ZXN0U3BlYygpOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX2NvbmZpZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0NPTkZJR19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBWZXJib3NpdHkgeyBlbnVtIExldmVsIHsKKyAgICAgICAgTm9PdXRwdXQgPSAwLAorICAgICAgICBRdWlldCwKKyAgICAgICAgTm9ybWFsCisgICAgfTsgfTsKKworICAgIHN0cnVjdCBXYXJuQWJvdXQgeyBlbnVtIFdoYXQgeworICAgICAgICBOb3RoaW5nID0gMHgwMCwKKyAgICAgICAgTm9Bc3NlcnRpb25zID0gMHgwMQorICAgIH07IH07CisKKyAgICBzdHJ1Y3QgU2hvd0R1cmF0aW9ucyB7IGVudW0gT3JOb3QgeworICAgICAgICBEZWZhdWx0Rm9yUmVwb3J0ZXIsCisgICAgICAgIEFsd2F5cywKKyAgICAgICAgTmV2ZXIKKyAgICB9OyB9OworICAgIHN0cnVjdCBSdW5UZXN0cyB7IGVudW0gSW5XaGF0T3JkZXIgeworICAgICAgICBJbkRlY2xhcmF0aW9uT3JkZXIsCisgICAgICAgIEluTGV4aWNvZ3JhcGhpY2FsT3JkZXIsCisgICAgICAgIEluUmFuZG9tT3JkZXIKKyAgICB9OyB9OworICAgIHN0cnVjdCBVc2VDb2xvdXIgeyBlbnVtIFllc09yTm8geworICAgICAgICBBdXRvLAorICAgICAgICBZZXMsCisgICAgICAgIE5vCisgICAgfTsgfTsKKworICAgIGNsYXNzIFRlc3RTcGVjOworCisgICAgc3RydWN0IElDb25maWcgOiBJU2hhcmVkIHsKKworICAgICAgICB2aXJ0dWFsIH5JQ29uZmlnKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGFsbG93VGhyb3dzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgd2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50IGFib3J0QWZ0ZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFRlc3RTcGVjIGNvbnN0JiB0ZXN0U3BlYygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25zdCA9IDA7CisKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTV9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW1idWYuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNQlVGX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmVhbWJ1Zj4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFN0cmVhbUJ1ZkJhc2UgOiBwdWJsaWMgc3RkOjpzdHJlYW1idWYgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+U3RyZWFtQnVmQmFzZSgpIENBVENIX05PRVhDRVBUOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0ZDo6b3N0cmVhbSYgY291dCgpOworICAgIHN0ZDo6b3N0cmVhbSYgY2VycigpOworCisgICAgc3RydWN0IElTdHJlYW0geworICAgICAgICB2aXJ0dWFsIH5JU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzIEZpbGVTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIG11dGFibGUgc3RkOjpvZnN0cmVhbSBtX29mczsKKyAgICBwdWJsaWM6CisgICAgICAgIEZpbGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlbmFtZSApOworICAgICAgICB2aXJ0dWFsIH5GaWxlU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQ7CisgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICB9OworCisgICAgY2xhc3MgQ291dFN0cmVhbSA6IHB1YmxpYyBJU3RyZWFtIHsKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om9zdHJlYW0gbV9vczsKKyAgICBwdWJsaWM6CisgICAgICAgIENvdXRTdHJlYW0oKTsKKyAgICAgICAgdmlydHVhbCB+Q291dFN0cmVhbSgpIENBVENIX05PRVhDRVBUOworCisgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICB9OworCisgICAgY2xhc3MgRGVidWdPdXRTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIENBVENIX0FVVE9fUFRSKCBTdHJlYW1CdWZCYXNlICkgbV9zdHJlYW1CdWY7CisgICAgICAgIG11dGFibGUgc3RkOjpvc3RyZWFtIG1fb3M7CisgICAgcHVibGljOgorICAgICAgICBEZWJ1Z091dFN0cmVhbSgpOworICAgICAgICB2aXJ0dWFsIH5EZWJ1Z091dFN0cmVhbSgpIENBVENIX05PRVhDRVBUOworCisgICAgcHVibGljOiAvLyBJU3RyZWFtCisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICB9OworfQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaWZuZGVmIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIIDgwCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb25maWdEYXRhIHsKKworICAgICAgICBDb25maWdEYXRhKCkKKyAgICAgICAgOiAgIGxpc3RUZXN0cyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RUYWdzKCBmYWxzZSApLAorICAgICAgICAgICAgbGlzdFJlcG9ydGVycyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RUZXN0TmFtZXNPbmx5KCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd1N1Y2Nlc3NmdWxUZXN0cyggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3VsZERlYnVnQnJlYWsoIGZhbHNlICksCisgICAgICAgICAgICBub1Rocm93KCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd0hlbHAoIGZhbHNlICksCisgICAgICAgICAgICBzaG93SW52aXNpYmxlcyggZmFsc2UgKSwKKyAgICAgICAgICAgIGZpbGVuYW1lc0FzVGFncyggZmFsc2UgKSwKKyAgICAgICAgICAgIGFib3J0QWZ0ZXIoIC0xICksCisgICAgICAgICAgICBybmdTZWVkKCAwICksCisgICAgICAgICAgICB2ZXJib3NpdHkoIFZlcmJvc2l0eTo6Tm9ybWFsICksCisgICAgICAgICAgICB3YXJuaW5ncyggV2FybkFib3V0OjpOb3RoaW5nICksCisgICAgICAgICAgICBzaG93RHVyYXRpb25zKCBTaG93RHVyYXRpb25zOjpEZWZhdWx0Rm9yUmVwb3J0ZXIgKSwKKyAgICAgICAgICAgIHJ1bk9yZGVyKCBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyICksCisgICAgICAgICAgICB1c2VDb2xvdXIoIFVzZUNvbG91cjo6QXV0byApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBsaXN0VGVzdHM7CisgICAgICAgIGJvb2wgbGlzdFRhZ3M7CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVyczsKKyAgICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seTsKKworICAgICAgICBib29sIHNob3dTdWNjZXNzZnVsVGVzdHM7CisgICAgICAgIGJvb2wgc2hvdWxkRGVidWdCcmVhazsKKyAgICAgICAgYm9vbCBub1Rocm93OworICAgICAgICBib29sIHNob3dIZWxwOworICAgICAgICBib29sIHNob3dJbnZpc2libGVzOworICAgICAgICBib29sIGZpbGVuYW1lc0FzVGFnczsKKworICAgICAgICBpbnQgYWJvcnRBZnRlcjsKKyAgICAgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQ7CisKKyAgICAgICAgVmVyYm9zaXR5OjpMZXZlbCB2ZXJib3NpdHk7CisgICAgICAgIFdhcm5BYm91dDo6V2hhdCB3YXJuaW5nczsKKyAgICAgICAgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9uczsKKyAgICAgICAgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG91dHB1dEZpbGVuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBwcm9jZXNzTmFtZTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwb3J0ZXJOYW1lczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRlc3RzT3JUYWdzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2VjdGlvbnNUb1J1bjsKKyAgICB9OworCisgICAgY2xhc3MgQ29uZmlnIDogcHVibGljIFNoYXJlZEltcGw8SUNvbmZpZz4geworICAgIHByaXZhdGU6CisgICAgICAgIENvbmZpZyggQ29uZmlnIGNvbnN0JiBvdGhlciApOworICAgICAgICBDb25maWcmIG9wZXJhdG9yID0gKCBDb25maWcgY29uc3QmIG90aGVyICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkdW1teSgpOworICAgIHB1YmxpYzoKKworICAgICAgICBDb25maWcoKQorICAgICAgICB7fQorCisgICAgICAgIENvbmZpZyggQ29uZmlnRGF0YSBjb25zdCYgZGF0YSApCisgICAgICAgIDogICBtX2RhdGEoIGRhdGEgKSwKKyAgICAgICAgICAgIG1fc3RyZWFtKCBvcGVuU3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIWRhdGEudGVzdHNPclRhZ3MuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBUZXN0U3BlY1BhcnNlciBwYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApOworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnRlc3RzT3JUYWdzLnNpemUoKTsgKytpICkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKCBkYXRhLnRlc3RzT3JUYWdzW2ldICk7CisgICAgICAgICAgICAgICAgbV90ZXN0U3BlYyA9IHBhcnNlci50ZXN0U3BlYygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+Q29uZmlnKCkge30KKworICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9kYXRhLm91dHB1dEZpbGVuYW1lIDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbGlzdFRlc3RzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUZXN0czsgfQorICAgICAgICBib29sIGxpc3RUZXN0TmFtZXNPbmx5KCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUZXN0TmFtZXNPbmx5OyB9CisgICAgICAgIGJvb2wgbGlzdFRhZ3MoKSBjb25zdCB7IHJldHVybiBtX2RhdGEubGlzdFRhZ3M7IH0KKyAgICAgICAgYm9vbCBsaXN0UmVwb3J0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RSZXBvcnRlcnM7IH0KKworICAgICAgICBzdGQ6OnN0cmluZyBnZXRQcm9jZXNzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5wcm9jZXNzTmFtZTsgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0UmVwb3J0ZXJOYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5yZXBvcnRlck5hbWVzOyB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZ2V0U2VjdGlvbnNUb1J1bigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zZWN0aW9uc1RvUnVuOyB9CisKKyAgICAgICAgdmlydHVhbCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX3Rlc3RTcGVjOyB9CisKKyAgICAgICAgYm9vbCBzaG93SGVscCgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5zaG93SGVscDsgfQorCisgICAgICAgIC8vIElDb25maWcgaW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgICAgICB7IHJldHVybiAhbV9kYXRhLm5vVGhyb3c7IH0KKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgIHsgcmV0dXJuIG1fc3RyZWFtLT5zdHJlYW0oKTsgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIG5hbWUoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLm5hbWUuZW1wdHkoKSA/IG1fZGF0YS5wcm9jZXNzTmFtZSA6IG1fZGF0YS5uYW1lOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICB7IHJldHVybiBtX2RhdGEuc2hvd1N1Y2Nlc3NmdWxUZXN0czsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgd2FybkFib3V0TWlzc2luZ0Fzc2VydGlvbnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgeyByZXR1cm4gbV9kYXRhLndhcm5pbmdzICYgV2FybkFib3V0OjpOb0Fzc2VydGlvbnM7IH0KKyAgICAgICAgdmlydHVhbCBTaG93RHVyYXRpb25zOjpPck5vdCBzaG93RHVyYXRpb25zKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3dEdXJhdGlvbnM7IH0KKyAgICAgICAgdmlydHVhbCBSdW5UZXN0czo6SW5XaGF0T3JkZXIgcnVuT3JkZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgIHsgcmV0dXJuIG1fZGF0YS5ydW5PcmRlcjsgfQorICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBybmdTZWVkKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgeyByZXR1cm4gbV9kYXRhLnJuZ1NlZWQ7IH0KKyAgICAgICAgdmlydHVhbCBVc2VDb2xvdXI6Olllc09yTm8gdXNlQ29sb3VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgIHsgcmV0dXJuIG1fZGF0YS51c2VDb2xvdXI7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZERlYnVnQnJlYWsoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2hvdWxkRGVidWdCcmVhazsgfQorICAgICAgICB2aXJ0dWFsIGludCBhYm9ydEFmdGVyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLmFib3J0QWZ0ZXI7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHNob3dJbnZpc2libGVzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3dJbnZpc2libGVzOyB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIElTdHJlYW0gY29uc3QqIG9wZW5TdHJlYW0oKSB7CisgICAgICAgICAgICBpZiggbV9kYXRhLm91dHB1dEZpbGVuYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ291dFN0cmVhbSgpOworICAgICAgICAgICAgZWxzZSBpZiggbV9kYXRhLm91dHB1dEZpbGVuYW1lWzBdID09ICclJyApIHsKKyAgICAgICAgICAgICAgICBpZiggbV9kYXRhLm91dHB1dEZpbGVuYW1lID09ICIlZGVidWciICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWJ1Z091dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoICJVbnJlY29nbmlzZWQgc3RyZWFtOiAiICsgbV9kYXRhLm91dHB1dEZpbGVuYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlU3RyZWFtKCBtX2RhdGEub3V0cHV0RmlsZW5hbWUgKTsKKyAgICAgICAgfQorICAgICAgICBDb25maWdEYXRhIG1fZGF0YTsKKworICAgICAgICBDQVRDSF9BVVRPX1BUUiggSVN0cmVhbSBjb25zdCApIG1fc3RyZWFtOworICAgICAgICBUZXN0U3BlYyBtX3Rlc3RTcGVjOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY2xhcmEuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ0xBUkFfSF9JTkNMVURFRAorCisvLyBVc2UgQ2F0Y2gncyB2YWx1ZSBmb3IgY29uc29sZSB3aWR0aCAoc3RvcmUgQ2xhcmEncyBvZmYgdG8gdGhlIHNpZGUsIGlmIHByZXNlbnQpCisjaWZkZWYgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI3VuZGVmIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZW5kaWYKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgKKworLy8gRGVjbGFyZSBDbGFyYSBpbnNpZGUgdGhlIENhdGNoIG5hbWVzcGFjZQorI2RlZmluZSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UgbmFtZXNwYWNlIENhdGNoIHsKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9leHRlcm5hbC9jbGFyYS5oCisKKy8vIFZlcnNpb24gMC4wLjIuNAorCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZiAhZGVmaW5lZChUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRCkgfHwgZGVmaW5lZChTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UpCisKKyNpZm5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVECisjZGVmaW5lIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2RlZmluZSBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisjZWxzZQorI2RlZmluZSBTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFIH0KKyNlbmRpZgorCisjZGVmaW5lIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1BFTl9OQU1FU1BBQ0UgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisKKy8vIC0tLS0tLS0tLS0tICNpbmNsdWRlZCBmcm9tIHRiY190ZXh0X2Zvcm1hdC5oIC0tLS0tLS0tLS0tCisKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmICFkZWZpbmVkKFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVEKSB8fCBkZWZpbmVkKFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFKQorI2lmbmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorI2RlZmluZSBUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCituYW1lc3BhY2UgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgeworI2VuZGlmCisKK25hbWVzcGFjZSBUYmMgeworCisjaWZkZWYgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgc3RydWN0IFRleHRBdHRyaWJ1dGVzIHsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICA6ICAgaW5pdGlhbEluZGVudCggc3RkOjpzdHJpbmc6Om5wb3MgKSwKKyAgICAgICAgICAgIGluZGVudCggMCApLAorICAgICAgICAgICAgd2lkdGgoIGNvbnNvbGVXaWR0aC0xICksCisgICAgICAgICAgICB0YWJDaGFyKCAnXHQnICkKKyAgICAgICAge30KKworICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5pdGlhbEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgIHsgaW5pdGlhbEluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgeyBpbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0V2lkdGgoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgIHsgd2lkdGggPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0VGFiQ2hhciggY2hhciBfdmFsdWUgKSAgICAgICAgICAgICAgIHsgdGFiQ2hhciA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgaW5pdGlhbEluZGVudDsgIC8vIGluZGVudCBvZiBmaXJzdCBsaW5lLCBvciBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IGluZGVudDsgICAgICAgICAvLyBpbmRlbnQgb2Ygc3Vic2VxdWVudCBsaW5lcywgb3IgYWxsIGlmIGluaXRpYWxJbmRlbnQgaXMgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aDsgICAgICAgICAgLy8gbWF4aW11bSB3aWR0aCBvZiB0ZXh0LCBpbmNsdWRpbmcgaW5kZW50LiBMb25nZXIgdGV4dCB3aWxsIHdyYXAKKyAgICAgICAgY2hhciB0YWJDaGFyOyAgICAgICAgICAgICAgIC8vIElmIHRoaXMgY2hhciBpcyBzZWVuIHRoZSBpbmRlbnQgaXMgY2hhbmdlZCB0byBjdXJyZW50IHBvcworICAgIH07CisKKyAgICBjbGFzcyBUZXh0IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRleHQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyLCBUZXh0QXR0cmlidXRlcyBjb25zdCYgX2F0dHIgPSBUZXh0QXR0cmlidXRlcygpICkKKyAgICAgICAgOiBhdHRyKCBfYXR0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUNoYXJzID0gIiBbKHsuLC98XFwtIjsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGluZGVudCA9IF9hdHRyLmluaXRpYWxJbmRlbnQgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgICAgICAgICA/IF9hdHRyLmluaXRpYWxJbmRlbnQKKyAgICAgICAgICAgICAgICA6IF9hdHRyLmluZGVudDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlbWFpbmRlciA9IF9zdHI7CisKKyAgICAgICAgICAgIHdoaWxlKCAhcmVtYWluZGVyLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIGxpbmVzLnNpemUoKSA+PSAxMDAwICkgeworICAgICAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soICIuLi4gbWVzc2FnZSB0cnVuY2F0ZWQgZHVlIHRvIGV4Y2Vzc2l2ZSBzaXplIiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHRhYlBvcyA9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHdpZHRoID0gKHN0ZDo6bWluKSggcmVtYWluZGVyLnNpemUoKSwgX2F0dHIud2lkdGggLSBpbmRlbnQgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBwb3MgPSByZW1haW5kZXIuZmluZF9maXJzdF9vZiggJ1xuJyApOworICAgICAgICAgICAgICAgIGlmKCBwb3MgPD0gd2lkdGggKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwb3MgPSByZW1haW5kZXIuZmluZF9sYXN0X29mKCBfYXR0ci50YWJDaGFyLCB3aWR0aCApOworICAgICAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYlBvcyA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlbWFpbmRlclt3aWR0aF0gPT0gJ1xuJyApCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aC0tOworICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAwLCB0YWJQb3MgKSArIHJlbWFpbmRlci5zdWJzdHIoIHRhYlBvcysxICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHdpZHRoID09IHJlbWFpbmRlci5zaXplKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCB3aWR0aCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCByZW1haW5kZXJbd2lkdGhdID09ICdcbicgKSB7CisgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCB3aWR0aCApOworICAgICAgICAgICAgICAgICAgICBpZiggd2lkdGggPD0gMSB8fCByZW1haW5kZXIuc2l6ZSgpICE9IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMSApOworICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwb3MgPSByZW1haW5kZXIuZmluZF9sYXN0X29mKCB3cmFwcGFibGVDaGFycywgd2lkdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBwb3MgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3BsaWNlTGluZSggaW5kZW50LCByZW1haW5kZXIsIHBvcyApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlbWFpbmRlclswXSA9PSAnICcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCB3aWR0aC0xICk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5iYWNrKCkgKz0gIi0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0YWJQb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICs9IHRhYlBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNwbGljZUxpbmUoIHN0ZDo6c2l6ZV90IF9pbmRlbnQsIHN0ZDo6c3RyaW5nJiBfcmVtYWluZGVyLCBzdGQ6OnNpemVfdCBfcG9zICkgeworICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCBzdGQ6OnN0cmluZyggX2luZGVudCwgJyAnICkgKyBfcmVtYWluZGVyLnN1YnN0ciggMCwgX3BvcyApICk7CisgICAgICAgICAgICBfcmVtYWluZGVyID0gX3JlbWFpbmRlci5zdWJzdHIoIF9wb3MgKTsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJlZ2luKCk7IH0KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbGluZXMuZW5kKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGxhc3QoKSBjb25zdCB7IHJldHVybiBsaW5lcy5iYWNrKCk7IH0KKyAgICAgICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLnNpemUoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0b3JbXSggc3RkOjpzaXplX3QgX2luZGV4ICkgY29uc3QgeyByZXR1cm4gbGluZXNbX2luZGV4XTsgfQorICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBUZXh0IGNvbnN0JiBfdGV4dCApIHsKKyAgICAgICAgICAgIGZvciggVGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfdGV4dC5iZWdpbigpLCBpdEVuZCA9IF90ZXh0LmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBfdGV4dC5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAiXG4iOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMgYXR0cjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBUYmMKKworI2lmZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCit9IC8vIGVuZCBvdXRlciBuYW1lc3BhY2UKKyNlbmRpZgorCisjZW5kaWYgLy8gVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mICNpbmNsdWRlIGZyb20gdGJjX3RleHRfZm9ybWF0LmggLS0tLS0tLS0tLS0KKy8vIC4uLi4uLi4uLi4uIGJhY2sgaW4gY2xhcmEuaAorCisjdW5kZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PUEVOX05BTUVTUEFDRQorCisvLyAtLS0tLS0tLS0tLSAjaW5jbHVkZWQgZnJvbSBjbGFyYV9jb21waWxlcnMuaCAtLS0tLS0tLS0tLQorCisjaWZuZGVmIFRXT0JMVUVDVUJFU19DTEFSQV9DT01QSUxFUlNfSF9JTkNMVURFRAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKworLy8gRGV0ZWN0IGEgbnVtYmVyIG9mIGNvbXBpbGVyIGZlYXR1cmVzIC0gbW9zdGx5IEMrKzExLzE0IGNvbmZvcm1hbmNlIC0gYnkgY29tcGlsZXIKKy8vIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGRlZmluZWQ6CisvLworLy8gQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIgOiBpcyBudWxscHRyIHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCA6IGlzIG5vZXhjZXB0IHN1cHBvcnRlZD8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUyA6IFRoZSBkZWxldGUgYW5kIGRlZmF1bHQga2V5d29yZHMgZm9yIGNvbXBpbGVyIGdlbmVyYXRlZCBtZXRob2RzCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUgOiBpcyBvdmVycmlkZSBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUiA6IGlzIHVuaXF1ZV9wdHIgc3VwcG9ydGVkIChvdGhlcndpc2UgdXNlIGF1dG9fcHRyKQorCisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfT1JfR1JFQVRFUiA6IElzIEMrKzExIHN1cHBvcnRlZD8KKworLy8gQ0xBUkFfQ09ORklHX1ZBUklBRElDX01BQ1JPUyA6IGFyZSB2YXJpYWRpYyBtYWNyb3Mgc3VwcG9ydGVkPworCisvLyBJbiBnZW5lcmFsIGVhY2ggbWFjcm8gaGFzIGEgX05PXzxmZWF0dXJlIG5hbWU+IGZvcm0KKy8vIChlLmcuIENMQVJBX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSB3aGljaCBkaXNhYmxlcyB0aGUgZmVhdHVyZS4KKy8vIE1hbnkgZmVhdHVyZXMsIGF0IHBvaW50IG9mIGRldGVjdGlvbiwgZGVmaW5lIGFuIF9JTlRFUk5BTF8gbWFjcm8sIHNvIHRoZXkKKy8vIGNhbiBiZSBjb21iaW5lZCwgZW4tbWFzcywgd2l0aCB0aGUgX05PXyBmb3JtcyBsYXRlci4KKworLy8gQWxsIHRoZSBDKysxMSBmZWF0dXJlcyBjYW4gYmUgZGlzYWJsZWQgd2l0aCBDTEFSQV9DT05GSUdfTk9fQ1BQMTEKKworI2lmZGVmIF9fY2xhbmdfXworCisjaWYgX19oYXNfZmVhdHVyZShjeHhfbnVsbHB0cikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisjaWYgX19oYXNfZmVhdHVyZShjeHhfbm9leGNlcHQpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisKKyNlbmRpZiAvLyBfX2NsYW5nX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEdDQworI2lmZGVmIF9fR05VQ19fCisKKyNpZiBfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDYgJiYgZGVmaW5lZChfX0dYWF9FWFBFUklNRU5UQUxfQ1hYMFhfXykKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisvLyAtIG90aGVyd2lzZSBtb3JlIHJlY2VudCB2ZXJzaW9ucyBkZWZpbmUgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorLy8gYW5kIHdpbGwgZ2V0IHBpY2tlZCB1cCBiZWxvdworCisjZW5kaWYgLy8gX19HTlVDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc3VhbCBDKysKKyNpZmRlZiBfTVNDX1ZFUgorCisjaWYgKF9NU0NfVkVSID49IDE2MDApCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2lmIChfTVNDX1ZFUiA+PSAxOTAwICkgLy8gKFZDKysgMTMgKFZTMjAxNSkpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorCisjZW5kaWYgLy8gX01TQ19WRVIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEMrKyBsYW5ndWFnZSBmZWF0dXJlIHN1cHBvcnQKKworLy8gY2F0Y2ggYWxsIHN1cHBvcnQgZm9yIEMrKzExCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgJiYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisjZGVmaW5lIENMQVJBX0NQUDExX09SX0dSRUFURVIKKworI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisKKyNpZm5kZWYgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisKKyNpZm5kZWYgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERQorI2VuZGlmCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworLy8gTm93IHNldCB0aGUgYWN0dWFsIGRlZmluZXMgYmFzZWQgb24gdGhlIGFib3ZlICsgYW55dGhpbmcgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9fR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX0NQUDExKQorI2RlZmluZSBDTEFSQV9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKy8vIG5vZXhjZXB0IHN1cHBvcnQ6CisjaWYgZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX05PRVhDRVBUKQorI2RlZmluZSBDTEFSQV9OT0VYQ0VQVCBub2V4Y2VwdAorIyAgZGVmaW5lIENMQVJBX05PRVhDRVBUX0lTKHgpIG5vZXhjZXB0KHgpCisjZWxzZQorI2RlZmluZSBDTEFSQV9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgQ0xBUkFfTk9FWENFUFRfSVMoeCkKKyNlbmRpZgorCisvLyBudWxscHRyIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2RlZmluZSBDTEFSQV9OVUxMIG51bGxwdHIKKyNlbHNlCisjZGVmaW5lIENMQVJBX05VTEwgTlVMTAorI2VuZGlmCisKKy8vIG92ZXJyaWRlIHN1cHBvcnQKKyNpZmRlZiBDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNkZWZpbmUgQ0xBUkFfT1ZFUlJJREUgb3ZlcnJpZGUKKyNlbHNlCisjZGVmaW5lIENMQVJBX09WRVJSSURFCisjZW5kaWYKKworLy8gdW5pcXVlX3B0ciBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgICBkZWZpbmUgQ0xBUkFfQVVUT19QVFIoIFQgKSBzdGQ6OnVuaXF1ZV9wdHI8VD4KKyNlbHNlCisjICAgZGVmaW5lIENMQVJBX0FVVE9fUFRSKCBUICkgc3RkOjphdXRvX3B0cjxUPgorI2VuZGlmCisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKworLy8gLS0tLS0tLS0tLS0gZW5kIG9mICNpbmNsdWRlIGZyb20gY2xhcmFfY29tcGlsZXJzLmggLS0tLS0tLS0tLS0KKy8vIC4uLi4uLi4uLi4uIGJhY2sgaW4gY2xhcmEuaAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX01TQ19WRVIpCisjZGVmaW5lIENMQVJBX1BMQVRGT1JNX1dJTkRPV1MKKyNlbmRpZgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCitTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNlbmRpZgorCituYW1lc3BhY2UgQ2xhcmEgeworCisgICAgc3RydWN0IFVucG9zaXRpb25hbFRhZyB7fTsKKworICAgIGV4dGVybiBVbnBvc2l0aW9uYWxUYWcgXzsKKworI2lmZGVmIENMQVJBX0NPTkZJR19NQUlOCisgICAgVW5wb3NpdGlvbmFsVGFnIF87CisjZW5kaWYKKworICAgIG5hbWVzcGFjZSBEZXRhaWwgeworCisjaWZkZWYgQ0xBUkFfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIFRiYzsKKworICAgICAgICBpbmxpbmUgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcHJlZml4ICkgeworICAgICAgICAgICAgcmV0dXJuIHN0ci5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJiBzdHIuc3Vic3RyKCAwLCBwcmVmaXguc2l6ZSgpICkgPT0gcHJlZml4OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmeyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQmPnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUIGNvbnN0Jj57IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCBjb25zdD57IHR5cGVkZWYgVCB0eXBlOyB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ICAgIHN0cnVjdCBJc0Jvb2wgICAgICAgeyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOyB9OworICAgICAgICB0ZW1wbGF0ZTw+ICAgICAgICAgICAgICBzdHJ1Y3QgSXNCb29sPGJvb2w+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc291cmNlLCBUJiBfZGVzdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgX3NvdXJjZTsKKyAgICAgICAgICAgIHNzID4+IF9kZXN0OworICAgICAgICAgICAgaWYoIHNzLmZhaWwoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVW5hYmxlIHRvIGNvbnZlcnQgIiArIF9zb3VyY2UgKyAiIHRvIGRlc3RpbmF0aW9uIHR5cGUiICk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc291cmNlLCBzdGQ6OnN0cmluZyYgX2Rlc3QgKSB7CisgICAgICAgICAgICBfZGVzdCA9IF9zb3VyY2U7CisgICAgICAgIH0KKyAgICAgICAgY2hhciB0b0xvd2VyQ2goY2hhciBjKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oIHN0ZDo6dG9sb3dlciggYyApICk7CisgICAgICAgIH0KKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydEludG8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc291cmNlLCBib29sJiBfZGVzdCApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxDID0gX3NvdXJjZTsKKyAgICAgICAgICAgIHN0ZDo6dHJhbnNmb3JtKCBzb3VyY2VMQy5iZWdpbigpLCBzb3VyY2VMQy5lbmQoKSwgc291cmNlTEMuYmVnaW4oKSwgdG9Mb3dlckNoICk7CisgICAgICAgICAgICBpZiggc291cmNlTEMgPT0gInkiIHx8IHNvdXJjZUxDID09ICIxIiB8fCBzb3VyY2VMQyA9PSAidHJ1ZSIgfHwgc291cmNlTEMgPT0gInllcyIgfHwgc291cmNlTEMgPT0gIm9uIiApCisgICAgICAgICAgICAgICAgX2Rlc3QgPSB0cnVlOworICAgICAgICAgICAgZWxzZSBpZiggc291cmNlTEMgPT0gIm4iIHx8IHNvdXJjZUxDID09ICIwIiB8fCBzb3VyY2VMQyA9PSAiZmFsc2UiIHx8IHNvdXJjZUxDID09ICJubyIgfHwgc291cmNlTEMgPT0gIm9mZiIgKQorICAgICAgICAgICAgICAgIF9kZXN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiRXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlIGJ1dCBkaWQgbm90IHJlY29nbmlzZTpcbiAgJyIgKyBfc291cmNlICsgIiciICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgICAgICBzdHJ1Y3QgSUFyZ0Z1bmN0aW9uIHsKKyAgICAgICAgICAgIHZpcnR1YWwgfklBcmdGdW5jdGlvbigpIHt9CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgICAgICBJQXJnRnVuY3Rpb24oKSAgICAgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICAgICBJQXJnRnVuY3Rpb24oIElBcmdGdW5jdGlvbiBjb25zdCYgKSA9IGRlZmF1bHQ7CisjZW5kaWYKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIENvbmZpZ1QmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb24qIGNsb25lKCkgY29uc3QgPSAwOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgICAgIGNsYXNzIEJvdW5kQXJnRnVuY3Rpb24geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uKCkgOiBmdW5jdGlvbk9iaiggQ0xBUkFfTlVMTCApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uKCBJQXJnRnVuY3Rpb248Q29uZmlnVD4qIF9mdW5jdGlvbk9iaiApIDogZnVuY3Rpb25PYmooIF9mdW5jdGlvbk9iaiApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uKCBCb3VuZEFyZ0Z1bmN0aW9uIGNvbnN0JiBvdGhlciApIDogZnVuY3Rpb25PYmooIG90aGVyLmZ1bmN0aW9uT2JqID8gb3RoZXIuZnVuY3Rpb25PYmotPmNsb25lKCkgOiBDTEFSQV9OVUxMICkge30KKyAgICAgICAgICAgIEJvdW5kQXJnRnVuY3Rpb24mIG9wZXJhdG9yID0gKCBCb3VuZEFyZ0Z1bmN0aW9uIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBJQXJnRnVuY3Rpb248Q29uZmlnVD4qIG5ld0Z1bmN0aW9uT2JqID0gb3RoZXIuZnVuY3Rpb25PYmogPyBvdGhlci5mdW5jdGlvbk9iai0+Y2xvbmUoKSA6IENMQVJBX05VTEw7CisgICAgICAgICAgICAgICAgZGVsZXRlIGZ1bmN0aW9uT2JqOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uT2JqID0gbmV3RnVuY3Rpb25PYmo7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfkJvdW5kQXJnRnVuY3Rpb24oKSB7IGRlbGV0ZSBmdW5jdGlvbk9iajsgfQorCisgICAgICAgICAgICB2b2lkIHNldCggQ29uZmlnVCYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgZnVuY3Rpb25PYmotPnNldCggY29uZmlnLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuIGZ1bmN0aW9uT2JqLT50YWtlc0FyZygpOyB9CisKKyAgICAgICAgICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uT2JqICE9IENMQVJBX05VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBJQXJnRnVuY3Rpb248Q29uZmlnVD4qIGZ1bmN0aW9uT2JqOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBOdWxsQmluZGVyIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYsIHN0ZDo6c3RyaW5nIGNvbnN0JiApIGNvbnN0IHt9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgTnVsbEJpbmRlciggKnRoaXMgKTsgfQorICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHN0cnVjdCBCb3VuZERhdGFNZW1iZXIgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZERhdGFNZW1iZXIoIE0gQzo6KiBfbWVtYmVyICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgcC4qbWVtYmVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPE0+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kRGF0YU1lbWJlciggKnRoaXMgKTsgfQorICAgICAgICAgICAgTSBDOjoqIG1lbWJlcjsKKyAgICAgICAgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgc3RydWN0IEJvdW5kVW5hcnlNZXRob2QgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZFVuYXJ5TWV0aG9kKCB2b2lkIChDOjoqX21lbWJlcikoIE0gKSApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBSZW1vdmVDb25zdFJlZjxNPjo6dHlwZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgKHAuKm1lbWJlcikoIHZhbHVlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiAhSXNCb29sPE0+Ojp2YWx1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kVW5hcnlNZXRob2QoICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKEM6OiptZW1iZXIpKCBNICk7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgIHN0cnVjdCBCb3VuZE51bGxhcnlNZXRob2QgOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZE51bGxhcnlNZXRob2QoIHZvaWQgKEM6OipfbWVtYmVyKSgpICkgOiBtZW1iZXIoIF9tZW1iZXIgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgcCwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGJvb2wgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSApCisgICAgICAgICAgICAgICAgICAgIChwLiptZW1iZXIpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kTnVsbGFyeU1ldGhvZCggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoQzo6Km1lbWJlcikoKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgQm91bmRVbmFyeUZ1bmN0aW9uIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRVbmFyeUZ1bmN0aW9uKCB2b2lkICgqX2Z1bmN0aW9uKSggQyYgKSApIDogZnVuY3Rpb24oIF9mdW5jdGlvbiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBvYmosIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBib29sIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiggb2JqICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IEJvdW5kVW5hcnlGdW5jdGlvbiggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSggQyYgKTsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQm91bmRCaW5hcnlGdW5jdGlvbiA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kQmluYXJ5RnVuY3Rpb24oIHZvaWQgKCpfZnVuY3Rpb24pKCBDJiwgVCApICkgOiBmdW5jdGlvbiggX2Z1bmN0aW9uICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIG9iaiwgc3RkOjpzdHJpbmcgY29uc3QmIHN0cmluZ1ZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHR5cGVuYW1lIFJlbW92ZUNvbnN0UmVmPFQ+Ojp0eXBlIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiggb2JqLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxUPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZEJpbmFyeUZ1bmN0aW9uKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkICgqZnVuY3Rpb24pKCBDJiwgVCApOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgRGV0YWlsCisKKyAgICBpbmxpbmUgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3NUb1ZlY3RvciggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyggc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBhcmdjICkgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggYXJnYyApOyArK2kgKQorICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3ZbaV07CisKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgY2xhc3MgUGFyc2VyIHsKKyAgICAgICAgZW51bSBNb2RlIHsgTm9uZSwgTWF5YmVTaG9ydE9wdCwgU2xhc2hPcHQsIFNob3J0T3B0LCBMb25nT3B0LCBQb3NpdGlvbmFsIH07CisgICAgICAgIE1vZGUgbW9kZTsKKyAgICAgICAgc3RkOjpzaXplX3QgZnJvbTsKKyAgICAgICAgYm9vbCBpblF1b3RlczsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RydWN0IFRva2VuIHsKKyAgICAgICAgICAgIGVudW0gVHlwZSB7IFBvc2l0aW9uYWwsIFNob3J0T3B0LCBMb25nT3B0IH07CisgICAgICAgICAgICBUb2tlbiggVHlwZSBfdHlwZSwgc3RkOjpzdHJpbmcgY29uc3QmIF9kYXRhICkgOiB0eXBlKCBfdHlwZSApLCBkYXRhKCBfZGF0YSApIHt9CisgICAgICAgICAgICBUeXBlIHR5cGU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYXRhOworICAgICAgICB9OworCisgICAgICAgIFBhcnNlcigpIDogbW9kZSggTm9uZSApLCBmcm9tKCAwICksIGluUXVvdGVzKCBmYWxzZSApe30KKworICAgICAgICB2b2lkIHBhcnNlSW50b1Rva2Vucyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBhcmdzLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGRvdWJsZURhc2ggPSAiLS0iOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMTsgaSA8IGFyZ3Muc2l6ZSgpICYmIGFyZ3NbaV0gIT0gZG91YmxlRGFzaDsgKytpICkKKyAgICAgICAgICAgICAgICBwYXJzZUludG9Ub2tlbnMoIGFyZ3NbaV0sIHRva2Vucyk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHBhcnNlSW50b1Rva2Vucyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgYXJnLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IGFyZ1tpXTsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnIicgKQorICAgICAgICAgICAgICAgICAgICBpblF1b3RlcyA9ICFpblF1b3RlczsKKyAgICAgICAgICAgICAgICBtb2RlID0gaGFuZGxlTW9kZSggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZGUgPSBoYW5kbGVNb2RlKCBhcmcuc2l6ZSgpLCAnXDAnLCBhcmcsIHRva2VucyApOworICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlTW9kZSggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIHN3aXRjaCggbW9kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vbmU6IHJldHVybiBoYW5kbGVOb25lKCBpLCBjICk7CisgICAgICAgICAgICAgICAgY2FzZSBNYXliZVNob3J0T3B0OiByZXR1cm4gaGFuZGxlTWF5YmVTaG9ydE9wdCggaSwgYyApOworICAgICAgICAgICAgICAgIGNhc2UgU2hvcnRPcHQ6CisgICAgICAgICAgICAgICAgY2FzZSBMb25nT3B0OgorICAgICAgICAgICAgICAgIGNhc2UgU2xhc2hPcHQ6IHJldHVybiBoYW5kbGVPcHQoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICAgICAgY2FzZSBQb3NpdGlvbmFsOiByZXR1cm4gaGFuZGxlUG9zaXRpb25hbCggaSwgYywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiVW5rbm93biBtb2RlIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTW9kZSBoYW5kbGVOb25lKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMgKSB7CisgICAgICAgICAgICBpZiggaW5RdW90ZXMgKSB7CisgICAgICAgICAgICAgICAgZnJvbSA9IGk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uYWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6IHJldHVybiBNYXliZVNob3J0T3B0OworI2lmZGVmIENMQVJBX1BMQVRGT1JNX1dJTkRPV1MKKyAgICAgICAgICAgICAgICBjYXNlICcvJzogZnJvbSA9IGkrMTsgcmV0dXJuIFNsYXNoT3B0OworI2VuZGlmCisgICAgICAgICAgICAgICAgZGVmYXVsdDogZnJvbSA9IGk7IHJldHVybiBQb3NpdGlvbmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlTWF5YmVTaG9ydE9wdCggc3RkOjpzaXplX3QgaSwgY2hhciBjICkgeworICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBmcm9tID0gaSsxOyByZXR1cm4gTG9uZ09wdDsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBmcm9tID0gaTsgcmV0dXJuIFNob3J0T3B0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgTW9kZSBoYW5kbGVPcHQoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBpZiggc3RkOjpzdHJpbmcoICI6PVwwIiwgMyApLmZpbmQoIGMgKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9wdE5hbWUgPSBhcmcuc3Vic3RyKCBmcm9tLCBpLWZyb20gKTsKKyAgICAgICAgICAgIGlmKCBtb2RlID09IFNob3J0T3B0ICkKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGogPSAwOyBqIDwgb3B0TmFtZS5zaXplKCk7ICsraiApCisgICAgICAgICAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6U2hvcnRPcHQsIG9wdE5hbWUuc3Vic3RyKCBqLCAxICkgKSApOworICAgICAgICAgICAgZWxzZSBpZiggbW9kZSA9PSBTbGFzaE9wdCAmJiBvcHROYW1lLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlNob3J0T3B0LCBvcHROYW1lICkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OkxvbmdPcHQsIG9wdE5hbWUgKSApOworICAgICAgICAgICAgcmV0dXJuIE5vbmU7CisgICAgICAgIH0KKyAgICAgICAgTW9kZSBoYW5kbGVQb3NpdGlvbmFsKCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgaWYoIGluUXVvdGVzIHx8IHN0ZDo6c3RyaW5nKCAiXDAiLCAxICkuZmluZCggYyApID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kZTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGF0YSA9IGFyZy5zdWJzdHIoIGZyb20sIGktZnJvbSApOworICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpQb3NpdGlvbmFsLCBkYXRhICkgKTsKKyAgICAgICAgICAgIHJldHVybiBOb25lOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgc3RydWN0IENvbW1vbkFyZ1Byb3BlcnRpZXMgeworICAgICAgICBDb21tb25BcmdQcm9wZXJ0aWVzKCkge30KKyAgICAgICAgQ29tbW9uQXJnUHJvcGVydGllcyggRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGNvbnN0JiBfYm91bmRGaWVsZCApIDogYm91bmRGaWVsZCggX2JvdW5kRmllbGQgKSB7fQorCisgICAgICAgIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBib3VuZEZpZWxkOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV0YWlsOworICAgICAgICBzdGQ6OnN0cmluZyBwbGFjZWhvbGRlcjsgLy8gT25seSB2YWx1ZSBpZiBib3VuZEZpZWxkIHRha2VzIGFuIGFyZworCisgICAgICAgIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIXBsYWNlaG9sZGVyLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCB2YWxpZGF0ZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAhYm91bmRGaWVsZC5pc1NldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAib3B0aW9uIG5vdCBib3VuZCIgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RydWN0IE9wdGlvbkFyZ1Byb3BlcnRpZXMgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc2hvcnROYW1lczsKKyAgICAgICAgc3RkOjpzdHJpbmcgbG9uZ05hbWU7CisKKyAgICAgICAgYm9vbCBoYXNTaG9ydE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzaG9ydE5hbWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKCBzaG9ydE5hbWVzLmJlZ2luKCksIHNob3J0TmFtZXMuZW5kKCksIHNob3J0TmFtZSApICE9IHNob3J0TmFtZXMuZW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBoYXNMb25nTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIF9sb25nTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBfbG9uZ05hbWUgPT0gbG9uZ05hbWU7CisgICAgICAgIH0KKyAgICB9OworICAgIHN0cnVjdCBQb3NpdGlvbmFsQXJnUHJvcGVydGllcyB7CisgICAgICAgIFBvc2l0aW9uYWxBcmdQcm9wZXJ0aWVzKCkgOiBwb3NpdGlvbiggLTEgKSB7fQorICAgICAgICBpbnQgcG9zaXRpb247IC8vIC0xIG1lYW5zIG5vbi1wb3NpdGlvbmFsIChmbG9hdGluZykKKworICAgICAgICBib29sIGlzRml4ZWRQb3NpdGlvbmFsKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICE9IC0xOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENvbmZpZ1Q+CisgICAgY2xhc3MgQ29tbWFuZExpbmUgeworCisgICAgICAgIHN0cnVjdCBBcmcgOiBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+LCBPcHRpb25BcmdQcm9wZXJ0aWVzLCBQb3NpdGlvbmFsQXJnUHJvcGVydGllcyB7CisgICAgICAgICAgICBBcmcoKSB7fQorICAgICAgICAgICAgQXJnKCBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gY29uc3QmIF9ib3VuZEZpZWxkICkgOiBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+KCBfYm91bmRGaWVsZCApIHt9CisKKyAgICAgICAgICAgIHVzaW5nIENvbW1vbkFyZ1Byb3BlcnRpZXM8Q29uZmlnVD46OnBsYWNlaG9sZGVyOyAvLyAhVEJECisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRiZ05hbWUoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFsb25nTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItLSIgKyBsb25nTmFtZTsKKyAgICAgICAgICAgICAgICBpZiggIXNob3J0TmFtZXMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLSIgKyBzaG9ydE5hbWVzWzBdOworICAgICAgICAgICAgICAgIHJldHVybiAicG9zaXRpb25hbCBhcmdzIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbW1hbmRzKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNob3J0TmFtZXMuYmVnaW4oKSwgaXRFbmQgPSBzaG9ydE5hbWVzLmVuZCgpOworICAgICAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggZmlyc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIsICI7CisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLSIgPDwgKml0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggIWxvbmdOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhZmlyc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIsICI7CisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLS0iIDw8IGxvbmdOYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggIXBsYWNlaG9sZGVyLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIiA8IiA8PCBwbGFjZWhvbGRlciA8PCAiPiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0eXBlZGVmIENMQVJBX0FVVE9fUFRSKCBBcmcgKSBBcmdBdXRvUHRyOworCisgICAgICAgIGZyaWVuZCB2b2lkIGFkZE9wdE5hbWUoIEFyZyYgYXJnLCBzdGQ6OnN0cmluZyBjb25zdCYgb3B0TmFtZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBvcHROYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmKCBEZXRhaWw6OnN0YXJ0c1dpdGgoIG9wdE5hbWUsICItLSIgKSApIHsKKyAgICAgICAgICAgICAgICBpZiggIWFyZy5sb25nTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk9ubHkgb25lIGxvbmcgb3B0IG1heSBiZSBzcGVjaWZpZWQuICciCisgICAgICAgICAgICAgICAgICAgICAgICArIGFyZy5sb25nTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBhbHJlYWR5IHNwZWNpZmllZCwgbm93IGF0dGVtcHRpbmcgdG8gYWRkICciCisgICAgICAgICAgICAgICAgICAgICAgICArIG9wdE5hbWUgKyAiJyIgKTsKKyAgICAgICAgICAgICAgICBhcmcubG9uZ05hbWUgPSBvcHROYW1lLnN1YnN0ciggMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggRGV0YWlsOjpzdGFydHNXaXRoKCBvcHROYW1lLCAiLSIgKSApCisgICAgICAgICAgICAgICAgYXJnLnNob3J0TmFtZXMucHVzaF9iYWNrKCBvcHROYW1lLnN1YnN0ciggMSApICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm9wdGlvbiBtdXN0IGJlZ2luIHdpdGggLSBvciAtLS4gT3B0aW9uIHdhczogJyIgKyBvcHROYW1lICsgIiciICk7CisgICAgICAgIH0KKyAgICAgICAgZnJpZW5kIHZvaWQgc2V0UG9zaXRpb25hbEFyZyggQXJnJiBhcmcsIGludCBwb3NpdGlvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZy5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQXJnQnVpbGRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFyZ0J1aWxkZXIoIEFyZyogYXJnICkgOiBtX2FyZyggYXJnICkge30KKworICAgICAgICAgICAgLy8gQmluZCBhIG5vbi1ib29sZWFuIGRhdGEgbWVtYmVyIChyZXF1aXJlcyBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICAgICAgdm9pZCBiaW5kKCBNIEM6OiogZmllbGQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwbGFjZWhvbGRlciApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLE0+KCBmaWVsZCApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQmluZCBhIGJvb2xlYW4gZGF0YSBtZW1iZXIgKG5vIHBsYWNlaG9sZGVyIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggYm9vbCBDOjoqIGZpZWxkICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmREYXRhTWVtYmVyPEMsYm9vbD4oIGZpZWxkICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGFraW5nIGEgc2luZ2xlLCBub24tYm9vbGVhbiBhcmd1bWVudCAocmVxdWlyZXMgYSBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIHVuYXJ5TWV0aG9kKSggTSApLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5TWV0aG9kPEMsTT4oIHVuYXJ5TWV0aG9kICk7CisgICAgICAgICAgICAgICAgbV9hcmctPnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBtZXRob2QgdGFraW5nIGEgc2luZ2xlLCBib29sZWFuIGFyZ3VtZW50IChubyBwbGFjZWhvbGRlciBzdHJpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIHVuYXJ5TWV0aG9kKSggYm9vbCApICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLGJvb2w+KCB1bmFyeU1ldGhvZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzICh3aWxsIGJlIGNhbGxlZCBpZiBvcHQgaXMgcHJlc2VudCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKEM6OiogbnVsbGFyeU1ldGhvZCkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kTnVsbGFyeU1ldGhvZDxDPiggbnVsbGFyeU1ldGhvZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgZnJlZSBmdW5jdGlvbiB0YWtpbmcgYSBzaW5nbGUgYXJndW1lbnQgLSB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24gKG5vIHBsYWNlaG9sZGVyIHN0cmluZyByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKCogdW5hcnlGdW5jdGlvbikoIEMmICkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZFVuYXJ5RnVuY3Rpb248Qz4oIHVuYXJ5RnVuY3Rpb24gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIGZyZWUgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIGFyZ3VtZW50IC0gdGhlIG9iamVjdCB0byBvcGVyYXRlIG9uIChyZXF1aXJlcyBhIHBsYWNlaG9sZGVyIHN0cmluZykKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFQ+CisgICAgICAgICAgICB2b2lkIGJpbmQoIHZvaWQgKCogYmluYXJ5RnVuY3Rpb24pKCBDJiwgVCApLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZEJpbmFyeUZ1bmN0aW9uPEMsIFQ+KCBiaW5hcnlGdW5jdGlvbiApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBcmdCdWlsZGVyJiBkZXNjcmliZSggc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFyZ0J1aWxkZXImIGRldGFpbCggc3RkOjpzdHJpbmcgY29uc3QmIGRldGFpbCApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+ZGV0YWlsID0gZGV0YWlsOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICBBcmcqIG1fYXJnOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIE9wdEJ1aWxkZXIgOiBwdWJsaWMgQXJnQnVpbGRlciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIE9wdEJ1aWxkZXIoIEFyZyogYXJnICkgOiBBcmdCdWlsZGVyKCBhcmcgKSB7fQorICAgICAgICAgICAgT3B0QnVpbGRlciggT3B0QnVpbGRlciYgb3RoZXIgKSA6IEFyZ0J1aWxkZXIoIG90aGVyICkge30KKworICAgICAgICAgICAgT3B0QnVpbGRlciYgb3BlcmF0b3JbXSggc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKSB7CisgICAgICAgICAgICAgICAgYWRkT3B0TmFtZSggKkFyZ0J1aWxkZXI6Om1fYXJnLCBvcHROYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIENvbW1hbmRMaW5lKCkKKyAgICAgICAgOiAgIG1fYm91bmRQcm9jZXNzTmFtZSggbmV3IERldGFpbDo6TnVsbEJpbmRlcjxDb25maWdUPigpICksCisgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiggMCApLAorICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBmYWxzZSApCisgICAgICAgIHt9CisgICAgICAgIENvbW1hbmRMaW5lKCBDb21tYW5kTGluZSBjb25zdCYgb3RoZXIgKQorICAgICAgICA6ICAgbV9ib3VuZFByb2Nlc3NOYW1lKCBvdGhlci5tX2JvdW5kUHJvY2Vzc05hbWUgKSwKKyAgICAgICAgICAgIG1fb3B0aW9ucyAoIG90aGVyLm1fb3B0aW9ucyApLAorICAgICAgICAgICAgbV9wb3NpdGlvbmFsQXJncyggb3RoZXIubV9wb3NpdGlvbmFsQXJncyApLAorICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24oIG90aGVyLm1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uICksCisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIG90aGVyLm1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBvdGhlci5tX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICBtX2Zsb2F0aW5nQXJnLnJlc2V0KCBuZXcgQXJnKCAqb3RoZXIubV9mbG9hdGluZ0FyZyApICk7CisgICAgICAgIH0KKworICAgICAgICBDb21tYW5kTGluZSYgc2V0VGhyb3dPblVucmVjb2duaXNlZFRva2VucyggYm9vbCBzaG91bGRUaHJvdyA9IHRydWUgKSB7CisgICAgICAgICAgICBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgPSBzaG91bGRUaHJvdzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIE9wdEJ1aWxkZXIgb3BlcmF0b3JbXSggc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKSB7CisgICAgICAgICAgICBtX29wdGlvbnMucHVzaF9iYWNrKCBBcmcoKSApOworICAgICAgICAgICAgYWRkT3B0TmFtZSggbV9vcHRpb25zLmJhY2soKSwgb3B0TmFtZSApOworICAgICAgICAgICAgT3B0QnVpbGRlciBidWlsZGVyKCAmbV9vcHRpb25zLmJhY2soKSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICBBcmdCdWlsZGVyIG9wZXJhdG9yW10oIGludCBwb3NpdGlvbiApIHsKKyAgICAgICAgICAgIG1fcG9zaXRpb25hbEFyZ3MuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggcG9zaXRpb24sIEFyZygpICkgKTsKKyAgICAgICAgICAgIGlmKCBwb3NpdGlvbiA+IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uICkKKyAgICAgICAgICAgICAgICBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgc2V0UG9zaXRpb25hbEFyZyggbV9wb3NpdGlvbmFsQXJnc1twb3NpdGlvbl0sIHBvc2l0aW9uICk7CisgICAgICAgICAgICBBcmdCdWlsZGVyIGJ1aWxkZXIoICZtX3Bvc2l0aW9uYWxBcmdzW3Bvc2l0aW9uXSApOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgdGhpcyB3aXRoIHRoZSBfIGluc3RhbmNlCisgICAgICAgIEFyZ0J1aWxkZXIgb3BlcmF0b3JbXSggVW5wb3NpdGlvbmFsVGFnICkgeworICAgICAgICAgICAgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJPbmx5IG9uZSB1bnBvc2l0aW9uYWwgYXJndW1lbnQgY2FuIGJlIGFkZGVkIiApOworICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy5yZXNldCggbmV3IEFyZygpICk7CisgICAgICAgICAgICBBcmdCdWlsZGVyIGJ1aWxkZXIoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgdm9pZCBiaW5kUHJvY2Vzc05hbWUoIE0gQzo6KiBmaWVsZCApIHsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZSA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLE0+KCBmaWVsZCApOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHZvaWQgYmluZFByb2Nlc3NOYW1lKCB2b2lkIChDOjoqX3VuYXJ5TWV0aG9kKSggTSApICkgeworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLE0+KCBfdW5hcnlNZXRob2QgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb3B0VXNhZ2UoIHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6c2l6ZV90IGluZGVudCA9IDAsIHN0ZDo6c2l6ZV90IHdpZHRoID0gRGV0YWlsOjpjb25zb2xlV2lkdGggKSBjb25zdCB7CisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciBpdEJlZ2luID0gbV9vcHRpb25zLmJlZ2luKCksIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpLCBpdDsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IG1heFdpZHRoID0gMDsKKyAgICAgICAgICAgIGZvciggaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgbWF4V2lkdGggPSAoc3RkOjptYXgpKCBtYXhXaWR0aCwgaXQtPmNvbW1hbmRzKCkuc2l6ZSgpICk7CisKKyAgICAgICAgICAgIGZvciggaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBEZXRhaWw6OlRleHQgdXNhZ2UoIGl0LT5jb21tYW5kcygpLCBEZXRhaWw6OlRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBtYXhXaWR0aCtpbmRlbnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBpbmRlbnQgKSApOworICAgICAgICAgICAgICAgIERldGFpbDo6VGV4dCBkZXNjKCBpdC0+ZGVzY3JpcHRpb24sIERldGFpbDo6VGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIHdpZHRoIC0gbWF4V2lkdGggLSAzICkgKTsKKworICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCAoc3RkOjptYXgpKCB1c2FnZS5zaXplKCksIGRlc2Muc2l6ZSgpICk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VDb2wgPSBpIDwgdXNhZ2Uuc2l6ZSgpID8gdXNhZ2VbaV0gOiAiIjsKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgdXNhZ2VDb2w7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgPCBkZXNjLnNpemUoKSAmJiAhZGVzY1tpXS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zICA8PCBzdGQ6OnN0cmluZyggaW5kZW50ICsgMiArIG1heFdpZHRoIC0gdXNhZ2VDb2wuc2l6ZSgpLCAnICcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlc2NbaV07CisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIG9wdFVzYWdlKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9wdFVzYWdlKCBvc3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFyZ1N5bm9wc2lzKCBzdGQ6Om9zdHJlYW0mIG9zICkgY29uc3QgeworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDE7IGkgPD0gbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb247ICsraSApIHsKKyAgICAgICAgICAgICAgICBpZiggaSA+IDEgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiICI7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50LCBBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcG9zaXRpb25hbEFyZ3MuZmluZCggaSApOworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBtX3Bvc2l0aW9uYWxBcmdzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIjwiIDw8IGl0LT5zZWNvbmQucGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIG1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiPCIgPDwgbV9mbG9hdGluZ0FyZy0+cGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vbiBjb25zZWN1dGl2ZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB3aXRoIG5vIGZsb2F0aW5nIGFyZ3MiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAhVEJEIE5vIGluZGljYXRpb24gb2YgbWFuZGF0b3J5IGFyZ3MKKyAgICAgICAgICAgIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkgeworICAgICAgICAgICAgICAgIGlmKCBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiA+IDEgKQorICAgICAgICAgICAgICAgICAgICBvcyA8PCAiICI7CisgICAgICAgICAgICAgICAgb3MgPDwgIls8IiA8PCBtX2Zsb2F0aW5nQXJnLT5wbGFjZWhvbGRlciA8PCAiPiAuLi5dIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBhcmdTeW5vcHNpcygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBhcmdTeW5vcHNpcyggb3NzICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1c2FnZSggc3RkOjpvc3RyZWFtJiBvcywgc3RkOjpzdHJpbmcgY29uc3QmIHByb2NOYW1lICkgY29uc3QgeworICAgICAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgICAgIG9zIDw8ICJ1c2FnZTpcbiAgIiA8PCBwcm9jTmFtZSA8PCAiICI7CisgICAgICAgICAgICBhcmdTeW5vcHNpcyggb3MgKTsKKyAgICAgICAgICAgIGlmKCAhbV9vcHRpb25zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgb3MgPDwgIiBbb3B0aW9uc11cblxud2hlcmUgb3B0aW9ucyBhcmU6IFxuIjsKKyAgICAgICAgICAgICAgICBvcHRVc2FnZSggb3MsIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICB1c2FnZSggb3NzLCBwcm9jTmFtZSApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIENvbmZpZ1QgcGFyc2UoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncyApIGNvbnN0IHsKKyAgICAgICAgICAgIENvbmZpZ1QgY29uZmlnOworICAgICAgICAgICAgcGFyc2VJbnRvKCBhcmdzLCBjb25maWcgKTsKKyAgICAgICAgICAgIHJldHVybiBjb25maWc7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwYXJzZUludG8oIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWUgPSBhcmdzLmVtcHR5KCkgPyBzdGQ6OnN0cmluZygpIDogYXJnc1swXTsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGxhc3RTbGFzaCA9IHByb2Nlc3NOYW1lLmZpbmRfbGFzdF9vZiggIi9cXCIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0U2xhc2ggIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHByb2Nlc3NOYW1lID0gcHJvY2Vzc05hbWUuc3Vic3RyKCBsYXN0U2xhc2grMSApOworICAgICAgICAgICAgbV9ib3VuZFByb2Nlc3NOYW1lLnNldCggY29uZmlnLCBwcm9jZXNzTmFtZSApOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdG9rZW5zOworICAgICAgICAgICAgUGFyc2VyIHBhcnNlcjsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZUludG9Ub2tlbnMoIGFyZ3MsIHRva2VucyApOworICAgICAgICAgICAgcmV0dXJuIHBvcHVsYXRlKCB0b2tlbnMsIGNvbmZpZyApOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGUoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZU9wdGlvbnMoIHRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZUZpeGVkQXJncyggdW51c2VkVG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHVudXNlZFRva2VucyA9IHBvcHVsYXRlRmxvYXRpbmdBcmdzKCB1bnVzZWRUb2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlT3B0aW9ucyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGVycm9yczsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX29wdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBtX29wdGlvbnMuZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKDsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIEFyZyBjb25zdCYgYXJnID0gKml0OworCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlNob3J0T3B0ICYmIGFyZy5oYXNTaG9ydE5hbWUoIHRva2VuLmRhdGEgKSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OkxvbmdPcHQgJiYgYXJnLmhhc0xvbmdOYW1lKCB0b2tlbi5kYXRhICkgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYXJnLnRha2VzQXJnKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IHRva2Vucy5zaXplKCktMSB8fCB0b2tlbnNbaSsxXS50eXBlICE9IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggIkV4cGVjdGVkIGFyZ3VtZW50IHRvIG9wdGlvbjogIiArIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2Vuc1srK2ldLmRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5ib3VuZEZpZWxkLnNldCggY29uZmlnLCAidHJ1ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soIHN0ZDo6c3RyaW5nKCBleC53aGF0KCkgKSArICJcbi0gd2hpbGUgcGFyc2luZzogKCIgKyBhcmcuY29tbWFuZHMoKSArICIpIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCB8fCAhbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGVycm9ycy5lbXB0eSgpICYmIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCAidW5yZWNvZ25pc2VkIG9wdGlvbjogIiArIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWVycm9ycy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZXJyb3JzLmJlZ2luKCksIGl0RW5kID0gZXJyb3JzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQgIT0gZXJyb3JzLmJlZ2luKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICJcbiI7CisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAqaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlRml4ZWRBcmdzKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiB1bnVzZWRUb2tlbnM7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSAxOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQsIEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wb3NpdGlvbmFsQXJncy5maW5kKCBwb3NpdGlvbiApOworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBtX3Bvc2l0aW9uYWxBcmdzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgKQorICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZUZsb2F0aW5nQXJncyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgaWYoICFtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5zOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRva2Vucy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBQYXJzZXI6OlRva2VuIGNvbnN0JiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy0+Ym91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHZhbGlkYXRlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1fb3B0aW9ucy5lbXB0eSgpICYmIG1fcG9zaXRpb25hbEFyZ3MuZW1wdHkoKSAmJiAhbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk5vIG9wdGlvbnMgb3IgYXJndW1lbnRzIHNwZWNpZmllZCIgKTsKKworICAgICAgICAgICAgZm9yKCB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxBcmc+Ojpjb25zdF9pdGVyYXRvciAgaXQgPSBtX29wdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgICAgICAgICAgaXQtPnZhbGlkYXRlKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBtX2JvdW5kUHJvY2Vzc05hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPEFyZz4gbV9vcHRpb25zOworICAgICAgICBzdGQ6Om1hcDxpbnQsIEFyZz4gbV9wb3NpdGlvbmFsQXJnczsKKyAgICAgICAgQXJnQXV0b1B0ciBtX2Zsb2F0aW5nQXJnOworICAgICAgICBpbnQgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb247CisgICAgICAgIGJvb2wgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDbGFyYQorCitTVElUQ0hfQ0xBUkFfQ0xPU0VfTkFNRVNQQUNFCisjdW5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjdW5kZWYgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQKKyN1bmRlZiBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKworLy8gUmVzdG9yZSBDbGFyYSdzIHZhbHVlIGZvciBjb25zb2xlIHdpZHRoLCBpZiBwcmVzZW50CisjaWZkZWYgQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSCBDQVRDSF9URU1QX0NMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjdW5kZWYgQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2VuZGlmCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGN0aW1lPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgaW5saW5lIHZvaWQgYWJvcnRBZnRlckZpcnN0KCBDb25maWdEYXRhJiBjb25maWcgKSB7IGNvbmZpZy5hYm9ydEFmdGVyID0gMTsgfQorICAgIGlubGluZSB2b2lkIGFib3J0QWZ0ZXJYKCBDb25maWdEYXRhJiBjb25maWcsIGludCB4ICkgeworICAgICAgICBpZiggeCA8IDEgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVmFsdWUgYWZ0ZXIgLXggb3IgLS1hYm9ydEFmdGVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8iICk7CisgICAgICAgIGNvbmZpZy5hYm9ydEFmdGVyID0geDsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgYWRkVGVzdE9yVGFncyggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3Rlc3RTcGVjICkgeyBjb25maWcudGVzdHNPclRhZ3MucHVzaF9iYWNrKCBfdGVzdFNwZWMgKTsgfQorICAgIGlubGluZSB2b2lkIGFkZFNlY3Rpb25Ub1J1biggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUgKSB7IGNvbmZpZy5zZWN0aW9uc1RvUnVuLnB1c2hfYmFjayggc2VjdGlvbk5hbWUgKTsgfQorICAgIGlubGluZSB2b2lkIGFkZFJlcG9ydGVyTmFtZSggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX3JlcG9ydGVyTmFtZSApIHsgY29uZmlnLnJlcG9ydGVyTmFtZXMucHVzaF9iYWNrKCBfcmVwb3J0ZXJOYW1lICk7IH0KKworICAgIGlubGluZSB2b2lkIGFkZFdhcm5pbmcoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF93YXJuaW5nICkgeworICAgICAgICBpZiggX3dhcm5pbmcgPT0gIk5vQXNzZXJ0aW9ucyIgKQorICAgICAgICAgICAgY29uZmlnLndhcm5pbmdzID0gc3RhdGljX2Nhc3Q8V2FybkFib3V0OjpXaGF0PiggY29uZmlnLndhcm5pbmdzIHwgV2FybkFib3V0OjpOb0Fzc2VydGlvbnMgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVW5yZWNvZ25pc2VkIHdhcm5pbmc6ICciICsgX3dhcm5pbmcgKyAnXCcnICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldE9yZGVyKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcmRlciApIHsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoICJkZWNsYXJlZCIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlcjsKKyAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggImxleGljYWwiLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJbkxleGljb2dyYXBoaWNhbE9yZGVyOworICAgICAgICBlbHNlIGlmKCBzdGFydHNXaXRoKCAicmFuZG9tIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5SYW5kb21PcmRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiVW5yZWNvZ25pc2VkIG9yZGVyaW5nOiAnIiArIG9yZGVyICsgJ1wnJyApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRSbmdTZWVkKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWVkICkgeworICAgICAgICBpZiggc2VlZCA9PSAidGltZSIgKSB7CisgICAgICAgICAgICBjb25maWcucm5nU2VlZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHN0ZDo6dGltZSgwKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgICAgICBzcyA8PCBzZWVkOworICAgICAgICAgICAgc3MgPj4gY29uZmlnLnJuZ1NlZWQ7CisgICAgICAgICAgICBpZiggc3MuZmFpbCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJBcmd1bWVudCB0byAtLXJuZy1zZWVkIHNob3VsZCBiZSB0aGUgd29yZCAndGltZScgb3IgYSBudW1iZXIiICk7CisgICAgICAgIH0KKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0VmVyYm9zaXR5KCBDb25maWdEYXRhJiBjb25maWcsIGludCBsZXZlbCApIHsKKyAgICAgICAgLy8gIVRCRDogYWNjZXB0IHN0cmluZ3M/CisgICAgICAgIGNvbmZpZy52ZXJib3NpdHkgPSBzdGF0aWNfY2FzdDxWZXJib3NpdHk6OkxldmVsPiggbGV2ZWwgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0U2hvd0R1cmF0aW9ucyggQ29uZmlnRGF0YSYgY29uZmlnLCBib29sIF9zaG93RHVyYXRpb25zICkgeworICAgICAgICBjb25maWcuc2hvd0R1cmF0aW9ucyA9IF9zaG93RHVyYXRpb25zCisgICAgICAgICAgICA/IFNob3dEdXJhdGlvbnM6OkFsd2F5cworICAgICAgICAgICAgOiBTaG93RHVyYXRpb25zOjpOZXZlcjsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0VXNlQ29sb3VyKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbW9kZSA9IHRvTG93ZXIoIHZhbHVlICk7CisKKyAgICAgICAgaWYoIG1vZGUgPT0gInllcyIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6WWVzOworICAgICAgICBlbHNlIGlmKCBtb2RlID09ICJubyIgKQorICAgICAgICAgICAgY29uZmlnLnVzZUNvbG91ciA9IFVzZUNvbG91cjo6Tm87CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gImF1dG8iICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggImNvbG91ciBtb2RlIG11c3QgYmUgb25lIG9mOiBhdXRvLCB5ZXMgb3Igbm8iICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGZvcmNlQ29sb3VyKCBDb25maWdEYXRhJiBjb25maWcgKSB7CisgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OlllczsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgbG9hZFRlc3ROYW1lc0Zyb21GaWxlKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZmlsZW5hbWUgKSB7CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZiggX2ZpbGVuYW1lLmNfc3RyKCkgKTsKKyAgICAgICAgaWYoICFmLmlzX29wZW4oKSApCisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggIlVuYWJsZSB0byBsb2FkIGlucHV0IGZpbGU6ICIgKyBfZmlsZW5hbWUgKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSggc3RkOjpnZXRsaW5lKCBmLCBsaW5lICkgKSB7CisgICAgICAgICAgICBsaW5lID0gdHJpbShsaW5lKTsKKyAgICAgICAgICAgIGlmKCAhbGluZS5lbXB0eSgpICYmICFzdGFydHNXaXRoKCBsaW5lLCAnIycgKSApIHsKKyAgICAgICAgICAgICAgICBpZiggIXN0YXJ0c1dpdGgoIGxpbmUsICciJyApICkKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9ICciJyArIGxpbmUgKyAnIic7CisgICAgICAgICAgICAgICAgYWRkVGVzdE9yVGFncyggY29uZmlnLCBsaW5lICsgJywnICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IG1ha2VDb21tYW5kTGluZVBhcnNlcigpIHsKKworICAgICAgICB1c2luZyBuYW1lc3BhY2UgQ2xhcmE7CisgICAgICAgIENvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IGNsaTsKKworICAgICAgICBjbGkuYmluZFByb2Nlc3NOYW1lKCAmQ29uZmlnRGF0YTo6cHJvY2Vzc05hbWUgKTsKKworICAgICAgICBjbGlbIi0/Il1bIi1oIl1bIi0taGVscCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dIZWxwICk7CisKKyAgICAgICAgY2xpWyItbCJdWyItLWxpc3QtdGVzdHMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGVzdCBjYXNlcyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGVzdHMgKTsKKworICAgICAgICBjbGlbIi10Il1bIi0tbGlzdC10YWdzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRhZ3MiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRhZ3MgKTsKKworICAgICAgICBjbGlbIi1zIl1bIi0tc3VjY2VzcyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJpbmNsdWRlIHN1Y2Nlc3NmdWwgdGVzdHMgaW4gb3V0cHV0IiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dTdWNjZXNzZnVsVGVzdHMgKTsKKworICAgICAgICBjbGlbIi1iIl1bIi0tYnJlYWsiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYnJlYWsgaW50byBkZWJ1Z2dlciBvbiBmYWlsdXJlIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3VsZERlYnVnQnJlYWsgKTsKKworICAgICAgICBjbGlbIi1lIl1bIi0tbm90aHJvdyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJza2lwIGV4Y2VwdGlvbiB0ZXN0cyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpub1Rocm93ICk7CisKKyAgICAgICAgY2xpWyItaSJdWyItLWludmlzaWJsZXMiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2hvdyBpbnZpc2libGVzICh0YWJzLCBuZXdsaW5lcykiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6c2hvd0ludmlzaWJsZXMgKTsKKworICAgICAgICBjbGlbIi1vIl1bIi0tb3V0Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggIm91dHB1dCBmaWxlbmFtZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpvdXRwdXRGaWxlbmFtZSwgImZpbGVuYW1lIiApOworCisgICAgICAgIGNsaVsiLXIiXVsiLS1yZXBvcnRlciJdCisvLyAgICAgICAgICAgIC5wbGFjZWhvbGRlciggIm5hbWVbOmZpbGVuYW1lXSIgKQorICAgICAgICAgICAgLmRlc2NyaWJlKCAicmVwb3J0ZXIgdG8gdXNlIChkZWZhdWx0cyB0byBjb25zb2xlKSIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRSZXBvcnRlck5hbWUsICJuYW1lIiApOworCisgICAgICAgIGNsaVsiLW4iXVsiLS1uYW1lIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInN1aXRlIG5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bmFtZSwgIm5hbWUiICk7CisKKyAgICAgICAgY2xpWyItYSJdWyItLWFib3J0Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImFib3J0IGF0IGZpcnN0IGZhaWx1cmUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWJvcnRBZnRlckZpcnN0ICk7CisKKyAgICAgICAgY2xpWyIteCJdWyItLWFib3J0eCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhYm9ydCBhZnRlciB4IGZhaWx1cmVzIiApCisgICAgICAgICAgICAuYmluZCggJmFib3J0QWZ0ZXJYLCAibm8uIGZhaWx1cmVzIiApOworCisgICAgICAgIGNsaVsiLXciXVsiLS13YXJuIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImVuYWJsZSB3YXJuaW5ncyIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRXYXJuaW5nLCAid2FybmluZyBuYW1lIiApOworCisvLyAtIG5lZWRzIHVwZGF0aW5nIGlmIHJlaW5zdGF0ZWQKKy8vICAgICAgICBjbGkuaW50byggJnNldFZlcmJvc2l0eSApCisvLyAgICAgICAgICAgIC5kZXNjcmliZSggImxldmVsIG9mIHZlcmJvc2l0eSAoMD1ubyBvdXRwdXQpIiApCisvLyAgICAgICAgICAgIC5zaG9ydE9wdCggInYiKQorLy8gICAgICAgICAgICAubG9uZ09wdCggInZlcmJvc2l0eSIgKQorLy8gICAgICAgICAgICAucGxhY2Vob2xkZXIoICJsZXZlbCIgKTsKKworICAgICAgICBjbGlbX10KKyAgICAgICAgICAgIC5kZXNjcmliZSggIndoaWNoIHRlc3Qgb3IgdGVzdHMgdG8gdXNlIiApCisgICAgICAgICAgICAuYmluZCggJmFkZFRlc3RPclRhZ3MsICJ0ZXN0IG5hbWUsIHBhdHRlcm4gb3IgdGFncyIgKTsKKworICAgICAgICBjbGlbIi1kIl1bIi0tZHVyYXRpb25zIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3cgdGVzdCBkdXJhdGlvbnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0U2hvd0R1cmF0aW9ucywgInllc3xubyIgKTsKKworICAgICAgICBjbGlbIi1mIl1bIi0taW5wdXQtZmlsZSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsb2FkIHRlc3QgbmFtZXMgdG8gcnVuIGZyb20gYSBmaWxlIiApCisgICAgICAgICAgICAuYmluZCggJmxvYWRUZXN0TmFtZXNGcm9tRmlsZSwgImZpbGVuYW1lIiApOworCisgICAgICAgIGNsaVsiLSMiXVsiLS1maWxlbmFtZXMtYXMtdGFncyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhZGRzIGEgdGFnIGZvciB0aGUgZmlsZW5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6ZmlsZW5hbWVzQXNUYWdzICk7CisKKyAgICAgICAgY2xpWyItYyJdWyItLXNlY3Rpb24iXQorICAgICAgICAgICAgICAgIC5kZXNjcmliZSggInNwZWNpZnkgc2VjdGlvbiB0byBydW4iICkKKyAgICAgICAgICAgICAgICAuYmluZCggJmFkZFNlY3Rpb25Ub1J1biwgInNlY3Rpb24gbmFtZSIgKTsKKworICAgICAgICAvLyBMZXNzIGNvbW1vbiBjb21tYW5kcyB3aGljaCBkb24ndCBoYXZlIGEgc2hvcnQgZm9ybQorICAgICAgICBjbGlbIi0tbGlzdC10ZXN0LW5hbWVzLW9ubHkiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibGlzdCBhbGwvbWF0Y2hpbmcgdGVzdCBjYXNlcyBuYW1lcyBvbmx5IiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUZXN0TmFtZXNPbmx5ICk7CisKKyAgICAgICAgY2xpWyItLWxpc3QtcmVwb3J0ZXJzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsIHJlcG9ydGVycyIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0UmVwb3J0ZXJzICk7CisKKyAgICAgICAgY2xpWyItLW9yZGVyIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInRlc3QgY2FzZSBvcmRlciAoZGVmYXVsdHMgdG8gZGVjbCkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0T3JkZXIsICJkZWNsfGxleHxyYW5kIiApOworCisgICAgICAgIGNsaVsiLS1ybmctc2VlZCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzZXQgYSBzcGVjaWZpYyBzZWVkIGZvciByYW5kb20gbnVtYmVycyIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRSbmdTZWVkLCAiJ3RpbWUnfG51bWJlciIgKTsKKworICAgICAgICBjbGlbIi0tZm9yY2UtY29sb3VyIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImZvcmNlIGNvbG91cmlzZWQgb3V0cHV0IChkZXByZWNhdGVkKSIgKQorICAgICAgICAgICAgLmJpbmQoICZmb3JjZUNvbG91ciApOworCisgICAgICAgIGNsaVsiLS11c2UtY29sb3VyIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3VsZCBvdXRwdXQgYmUgY29sb3VyaXNlZCIgKQorICAgICAgICAgICAgLmJpbmQoICZzZXRVc2VDb2xvdXIsICJ5ZXN8bm8iICk7CisKKyAgICAgICAgcmV0dXJuIGNsaTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbGlzdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xJU1RfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXh0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFWFRfSF9JTkNMVURFRAorCisjZGVmaW5lIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisKKyNkZWZpbmUgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgQ2F0Y2gKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9leHRlcm5hbC90YmNfdGV4dF9mb3JtYXQuaAorLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWZuZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisjIGlmZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjICBpZm5kZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorIyAgIGRlZmluZSBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9BTFJFQURZX0lOQ0xVREVECisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisvLyBVc2Ugb3B0aW9uYWwgb3V0ZXIgbmFtZXNwYWNlCisjaWZkZWYgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKK25hbWVzcGFjZSBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSB7CisjZW5kaWYKKworbmFtZXNwYWNlIFRiYyB7CisKKyNpZmRlZiBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSAorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSDsKKyNlbHNlCisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IDgwOworI2VuZGlmCisKKyAgICBzdHJ1Y3QgVGV4dEF0dHJpYnV0ZXMgeworICAgICAgICBUZXh0QXR0cmlidXRlcygpCisgICAgICAgIDogICBpbml0aWFsSW5kZW50KCBzdGQ6OnN0cmluZzo6bnBvcyApLAorICAgICAgICAgICAgaW5kZW50KCAwICksCisgICAgICAgICAgICB3aWR0aCggY29uc29sZVdpZHRoLTEgKQorICAgICAgICB7fQorCisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbml0aWFsSW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgeyBpbml0aWFsSW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICB7IGluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRXaWR0aCggc3RkOjpzaXplX3QgX3ZhbHVlICkgICAgICAgICAgeyB3aWR0aCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgaW5pdGlhbEluZGVudDsgIC8vIGluZGVudCBvZiBmaXJzdCBsaW5lLCBvciBucG9zCisgICAgICAgIHN0ZDo6c2l6ZV90IGluZGVudDsgICAgICAgICAvLyBpbmRlbnQgb2Ygc3Vic2VxdWVudCBsaW5lcywgb3IgYWxsIGlmIGluaXRpYWxJbmRlbnQgaXMgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aDsgICAgICAgICAgLy8gbWF4aW11bSB3aWR0aCBvZiB0ZXh0LCBpbmNsdWRpbmcgaW5kZW50LiBMb25nZXIgdGV4dCB3aWxsIHdyYXAKKyAgICB9OworCisgICAgY2xhc3MgVGV4dCB7CisgICAgcHVibGljOgorICAgICAgICBUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ciwgVGV4dEF0dHJpYnV0ZXMgY29uc3QmIF9hdHRyID0gVGV4dEF0dHJpYnV0ZXMoKSApCisgICAgICAgIDogYXR0ciggX2F0dHIgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVCZWZvcmVDaGFycyA9ICJbKHs8XHQiOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQWZ0ZXJDaGFycyA9ICJdKX0+LSwuL3xcXCI7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycyA9ICIgXG5cciI7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRlbnQgPSBfYXR0ci5pbml0aWFsSW5kZW50ICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICAgICAgPyBzdGQ6OnN0cmluZyggX2F0dHIuaW5pdGlhbEluZGVudCwgJyAnICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCBfYXR0ci5pbmRlbnQsICcgJyApOworCisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgICAgIGl0ZXJhdG9yIGl0ID0gX3N0ci5iZWdpbigpOworICAgICAgICAgICAgY29uc3QgaXRlcmF0b3Igc3RyRW5kID0gX3N0ci5lbmQoKTsKKworICAgICAgICAgICAgd2hpbGUoIGl0ICE9IHN0ckVuZCApIHsKKworICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPj0gMTAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCAiLi4uIG1lc3NhZ2UgdHJ1bmNhdGVkIGR1ZSB0byBleGNlc3NpdmUgc2l6ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeDsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aCA9IChzdGQ6Om1pbikoIHN0YXRpY19jYXN0PHNpemVfdD4oIHN0ckVuZC1pdCApLCBfYXR0ci53aWR0aC1zdGF0aWNfY2FzdDxzaXplX3Q+KCBpbmRlbnQuc2l6ZSgpICkgKTsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdEVuZCA9IGl0K3dpZHRoOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGl0TmV4dCA9IF9zdHIuZW5kKCk7CisKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdE5ld0xpbmUgPSBzdGQ6OmZpbmQoIGl0LCBpdEVuZCwgJ1xuJyApOworICAgICAgICAgICAgICAgIGlmKCBpdE5ld0xpbmUgIT0gaXRFbmQgKQorICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGl0TmV3TGluZTsKKworICAgICAgICAgICAgICAgIGlmKCBpdEVuZCAhPSBzdHJFbmQgICkgeworICAgICAgICAgICAgICAgICAgICBib29sIGZvdW5kV3JhcFBvaW50ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGZpbmRJdCA9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggd3JhcHBhYmxlQWZ0ZXJDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgZmluZEl0ICE9IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0KzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0KzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZmluZEl0ID4gaXQgJiYgd3JhcHBhYmxlQmVmb3JlQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdyYXBQb2ludCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB3cmFwcGFibGVJbnN0ZWFkT2ZDaGFycy5maW5kKCAqZmluZEl0ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXROZXh0ID0gZmluZEl0KzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZpbmRJdCA9PSBpdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1maW5kSXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFmb3VuZFdyYXBQb2ludCApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCAhZm91bmRXcmFwUG9pbnQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBnb29kIHdyYXAgY2hhciwgc28gd2UnbGwgYnJlYWsgbWlkIHdvcmQgYW5kIGFkZCBhIGh5cGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgLS1pdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIi0iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGl0RW5kID4gaXQgJiYgd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMuZmluZCggKihpdEVuZC0xKSApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWl0RW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggaW5kZW50ICsgc3RkOjpzdHJpbmcoIGl0LCBpdEVuZCApICsgc3VmZml4ICk7CisKKyAgICAgICAgICAgICAgICBpZiggaW5kZW50LnNpemUoKSAhPSBfYXR0ci5pbmRlbnQgKQorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBzdGQ6OnN0cmluZyggX2F0dHIuaW5kZW50LCAnICcgKTsKKyAgICAgICAgICAgICAgICBpdCA9IGl0TmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjb25zdF9pdGVyYXRvcjsKKworICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmJlZ2luKCk7IH0KKyAgICAgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbGluZXMuZW5kKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGxhc3QoKSBjb25zdCB7IHJldHVybiBsaW5lcy5iYWNrKCk7IH0KKyAgICAgICAgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLnNpemUoKTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0b3JbXSggc3RkOjpzaXplX3QgX2luZGV4ICkgY29uc3QgeyByZXR1cm4gbGluZXNbX2luZGV4XTsgfQorICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgKnRoaXM7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBUZXh0IGNvbnN0JiBfdGV4dCApIHsKKyAgICAgICAgICAgIGZvciggVGV4dDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBfdGV4dC5iZWdpbigpLCBpdEVuZCA9IF90ZXh0LmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCBpdCAhPSBfdGV4dC5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbSA8PCAiXG4iOworICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9zdHJlYW07CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMgYXR0cjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpbmVzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBUYmMKKworI2lmZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCit9IC8vIGVuZCBvdXRlciBuYW1lc3BhY2UKKyNlbmRpZgorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorI3VuZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgdXNpbmcgVGJjOjpUZXh0OworICAgIHVzaW5nIFRiYzo6VGV4dEF0dHJpYnV0ZXM7Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25zb2xlX2NvbG91ci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlNPTEVfQ09MT1VSX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbG91ciB7CisgICAgICAgIGVudW0gQ29kZSB7CisgICAgICAgICAgICBOb25lID0gMCwKKworICAgICAgICAgICAgV2hpdGUsCisgICAgICAgICAgICBSZWQsCisgICAgICAgICAgICBHcmVlbiwKKyAgICAgICAgICAgIEJsdWUsCisgICAgICAgICAgICBDeWFuLAorICAgICAgICAgICAgWWVsbG93LAorICAgICAgICAgICAgR3JleSwKKworICAgICAgICAgICAgQnJpZ2h0ID0gMHgxMCwKKworICAgICAgICAgICAgQnJpZ2h0UmVkID0gQnJpZ2h0IHwgUmVkLAorICAgICAgICAgICAgQnJpZ2h0R3JlZW4gPSBCcmlnaHQgfCBHcmVlbiwKKyAgICAgICAgICAgIExpZ2h0R3JleSA9IEJyaWdodCB8IEdyZXksCisgICAgICAgICAgICBCcmlnaHRXaGl0ZSA9IEJyaWdodCB8IFdoaXRlLAorCisgICAgICAgICAgICAvLyBCeSBpbnRlbnRpb24KKyAgICAgICAgICAgIEZpbGVOYW1lID0gTGlnaHRHcmV5LAorICAgICAgICAgICAgV2FybmluZyA9IFllbGxvdywKKyAgICAgICAgICAgIFJlc3VsdEVycm9yID0gQnJpZ2h0UmVkLAorICAgICAgICAgICAgUmVzdWx0U3VjY2VzcyA9IEJyaWdodEdyZWVuLAorICAgICAgICAgICAgUmVzdWx0RXhwZWN0ZWRGYWlsdXJlID0gV2FybmluZywKKworICAgICAgICAgICAgRXJyb3IgPSBCcmlnaHRSZWQsCisgICAgICAgICAgICBTdWNjZXNzID0gR3JlZW4sCisKKyAgICAgICAgICAgIE9yaWdpbmFsRXhwcmVzc2lvbiA9IEN5YW4sCisgICAgICAgICAgICBSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IFllbGxvdywKKworICAgICAgICAgICAgU2Vjb25kYXJ5VGV4dCA9IExpZ2h0R3JleSwKKyAgICAgICAgICAgIEhlYWRlcnMgPSBXaGl0ZQorICAgICAgICB9OworCisgICAgICAgIC8vIFVzZSBjb25zdHJ1Y3RlZCBvYmplY3QgZm9yIFJBSUkgZ3VhcmQKKyAgICAgICAgQ29sb3VyKCBDb2RlIF9jb2xvdXJDb2RlICk7CisgICAgICAgIENvbG91ciggQ29sb3VyIGNvbnN0JiBvdGhlciApOworICAgICAgICB+Q29sb3VyKCk7CisKKyAgICAgICAgLy8gVXNlIHN0YXRpYyBtZXRob2QgZm9yIG9uZS1zaG90IGNoYW5nZXMKKyAgICAgICAgc3RhdGljIHZvaWQgdXNlKCBDb2RlIF9jb2xvdXJDb2RlICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1fbW92ZWQ7CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgQ29sb3VyIGNvbnN0JiApIHsgcmV0dXJuIG9zOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19yZXBvcnRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JFUE9SVEVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgc3RydWN0IFJlcG9ydGVyQ29uZmlnIHsKKyAgICAgICAgZXhwbGljaXQgUmVwb3J0ZXJDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2Z1bGxDb25maWcgKQorICAgICAgICA6ICAgbV9zdHJlYW0oICZfZnVsbENvbmZpZy0+c3RyZWFtKCkgKSwgbV9mdWxsQ29uZmlnKCBfZnVsbENvbmZpZyApIHt9CisKKyAgICAgICAgUmVwb3J0ZXJDb25maWcoIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgX2Z1bGxDb25maWcsIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSApCisgICAgICAgIDogICBtX3N0cmVhbSggJl9zdHJlYW0gKSwgbV9mdWxsQ29uZmlnKCBfZnVsbENvbmZpZyApIHt9CisKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCAgICB7IHJldHVybiAqbV9zdHJlYW07IH0KKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGZ1bGxDb25maWcoKSBjb25zdCB7IHJldHVybiBtX2Z1bGxDb25maWc7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6b3N0cmVhbSogbV9zdHJlYW07CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2Z1bGxDb25maWc7CisgICAgfTsKKworICAgIHN0cnVjdCBSZXBvcnRlclByZWZlcmVuY2VzIHsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcygpCisgICAgICAgIDogc2hvdWxkUmVkaXJlY3RTdGRPdXQoIGZhbHNlICkKKyAgICAgICAge30KKworICAgICAgICBib29sIHNob3VsZFJlZGlyZWN0U3RkT3V0OworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBMYXp5U3RhdCA6IE9wdGlvbjxUPiB7CisgICAgICAgIExhenlTdGF0KCkgOiB1c2VkKCBmYWxzZSApIHt9CisgICAgICAgIExhenlTdGF0JiBvcGVyYXRvcj0oIFQgY29uc3QmIF92YWx1ZSApIHsKKyAgICAgICAgICAgIE9wdGlvbjxUPjo6b3BlcmF0b3I9KCBfdmFsdWUgKTsKKyAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgT3B0aW9uPFQ+OjpyZXNldCgpOworICAgICAgICAgICAgdXNlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgdXNlZDsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RSdW5JbmZvIHsKKyAgICAgICAgVGVzdFJ1bkluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIDogbmFtZSggX25hbWUgKSB7fQorICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIH07CisgICAgc3RydWN0IEdyb3VwSW5mbyB7CisgICAgICAgIEdyb3VwSW5mbyggIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgX2dyb3VwSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ncm91cHNDb3VudCApCisgICAgICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICAgICAgZ3JvdXBJbmRleCggX2dyb3VwSW5kZXggKSwKKyAgICAgICAgICAgIGdyb3Vwc0NvdW50cyggX2dyb3Vwc0NvdW50ICkKKyAgICAgICAge30KKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnNpemVfdCBncm91cEluZGV4OworICAgICAgICBzdGQ6OnNpemVfdCBncm91cHNDb3VudHM7CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25TdGF0cyB7CisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIF9hc3NlcnRpb25SZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gY29uc3QmIF9pbmZvTWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMgKQorICAgICAgICA6ICAgYXNzZXJ0aW9uUmVzdWx0KCBfYXNzZXJ0aW9uUmVzdWx0ICksCisgICAgICAgICAgICBpbmZvTWVzc2FnZXMoIF9pbmZvTWVzc2FnZXMgKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25SZXN1bHQuaGFzTWVzc2FnZSgpICkgeworICAgICAgICAgICAgICAgIC8vIENvcHkgbWVzc2FnZSBpbnRvIG1lc3NhZ2VzIGxpc3QuCisgICAgICAgICAgICAgICAgLy8gIVRCRCBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBlYXJsaWVyLCBzb21ld2hlcmUKKyAgICAgICAgICAgICAgICBNZXNzYWdlQnVpbGRlciBidWlsZGVyKCBhc3NlcnRpb25SZXN1bHQuZ2V0VGVzdE1hY3JvTmFtZSgpLCBhc3NlcnRpb25SZXN1bHQuZ2V0U291cmNlSW5mbygpLCBhc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICk7CisgICAgICAgICAgICAgICAgYnVpbGRlciA8PCBhc3NlcnRpb25SZXN1bHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIubV9pbmZvLm1lc3NhZ2UgPSBidWlsZGVyLm1fc3RyZWFtLnN0cigpOworCisgICAgICAgICAgICAgICAgaW5mb01lc3NhZ2VzLnB1c2hfYmFjayggYnVpbGRlci5tX2luZm8gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5Bc3NlcnRpb25TdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMoIEFzc2VydGlvblN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIEFzc2VydGlvblJlc3VsdCBhc3NlcnRpb25SZXN1bHQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBpbmZvTWVzc2FnZXM7CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgfTsKKworICAgIHN0cnVjdCBTZWN0aW9uU3RhdHMgeworICAgICAgICBTZWN0aW9uU3RhdHMoICAgU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvdW50cyBjb25zdCYgX2Fzc2VydGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX2R1cmF0aW9uSW5TZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfbWlzc2luZ0Fzc2VydGlvbnMgKQorICAgICAgICA6ICAgc2VjdGlvbkluZm8oIF9zZWN0aW9uSW5mbyApLAorICAgICAgICAgICAgYXNzZXJ0aW9ucyggX2Fzc2VydGlvbnMgKSwKKyAgICAgICAgICAgIGR1cmF0aW9uSW5TZWNvbmRzKCBfZHVyYXRpb25JblNlY29uZHMgKSwKKyAgICAgICAgICAgIG1pc3NpbmdBc3NlcnRpb25zKCBfbWlzc2luZ0Fzc2VydGlvbnMgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uU3RhdHMoKTsKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBTZWN0aW9uU3RhdHMoIFNlY3Rpb25TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTZWN0aW9uU3RhdHMoIFNlY3Rpb25TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTZWN0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBTZWN0aW9uU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBTZWN0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBTZWN0aW9uU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBTZWN0aW9uSW5mbyBzZWN0aW9uSW5mbzsKKyAgICAgICAgQ291bnRzIGFzc2VydGlvbnM7CisgICAgICAgIGRvdWJsZSBkdXJhdGlvbkluU2Vjb25kczsKKyAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9uczsKKyAgICB9OworCisgICAgc3RydWN0IFRlc3RDYXNlU3RhdHMgeworICAgICAgICBUZXN0Q2FzZVN0YXRzKCAgVGVzdENhc2VJbmZvIGNvbnN0JiBfdGVzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ZE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RkRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6IHRlc3RJbmZvKCBfdGVzdEluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApLAorICAgICAgICAgICAgc3RkT3V0KCBfc3RkT3V0ICksCisgICAgICAgICAgICBzdGRFcnIoIF9zdGRFcnIgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0Q2FzZVN0YXRzKCk7CisKKyMgIGlmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0Q2FzZVN0YXRzKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMoIFRlc3RDYXNlU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzJiBvcGVyYXRvciA9ICggVGVzdENhc2VTdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbzsKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RkT3V0OworICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0R3JvdXBTdGF0cyB7CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbHMgY29uc3QmIF90b3RhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9hYm9ydGluZyApCisgICAgICAgIDogICBncm91cEluZm8oIF9ncm91cEluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8gY29uc3QmIF9ncm91cEluZm8gKQorICAgICAgICA6ICAgZ3JvdXBJbmZvKCBfZ3JvdXBJbmZvICksCisgICAgICAgICAgICBhYm9ydGluZyggZmFsc2UgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0R3JvdXBTdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0R3JvdXBTdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIEdyb3VwSW5mbyBncm91cEluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0UnVuU3RhdHMgeworICAgICAgICBUZXN0UnVuU3RhdHMoICAgVGVzdFJ1bkluZm8gY29uc3QmIF9ydW5JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6ICAgcnVuSW5mbyggX3J1bkluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX3RvdGFscyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9hYm9ydGluZyApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RSdW5TdGF0cygpOworCisjICBpZm5kZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzIGNvbnN0JiBfb3RoZXIgKQorICAgICAgICA6ICAgcnVuSW5mbyggX290aGVyLnJ1bkluZm8gKSwKKyAgICAgICAgICAgIHRvdGFscyggX290aGVyLnRvdGFscyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIF9vdGhlci5hYm9ydGluZyApCisgICAgICAgIHt9CisjICBlbHNlCisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzIGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyggVGVzdFJ1blN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RSdW5TdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RSdW5TdGF0cyAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIFRlc3RSdW5JbmZvIHJ1bkluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIGJvb2wgYWJvcnRpbmc7CisgICAgfTsKKworICAgIGNsYXNzIE11bHRpcGxlUmVwb3J0ZXJzOworCisgICAgc3RydWN0IElTdHJlYW1pbmdSZXBvcnRlciA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JU3RyZWFtaW5nUmVwb3J0ZXIoKTsKKworICAgICAgICAvLyBJbXBsZW1lbnRpbmcgY2xhc3MgbXVzdCBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBzdGF0aWMgbWV0aG9kOgorICAgICAgICAvLyBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0UnVuSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgYXNzZXJ0aW9uSW5mbyApID0gMDsKKworICAgICAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiB0aGUgbWVzc2FnZXMgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkOgorICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCBNdWx0aXBsZVJlcG9ydGVycyogdHJ5QXNNdWx0aSgpIHsgcmV0dXJuIENBVENIX05VTEw7IH0KKyAgICB9OworCisgICAgc3RydWN0IElSZXBvcnRlckZhY3RvcnkgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyRmFjdG9yeSgpOworICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyUmVnaXN0cnkgeworICAgICAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gPiBGYWN0b3J5TWFwOworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiA+IExpc3RlbmVyczsKKworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXJSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgRmFjdG9yeU1hcCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIExpc3RlbmVycyBjb25zdCYgZ2V0TGlzdGVuZXJzKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRSZXBvcnRlciggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGV4aXN0aW5nUmVwb3J0ZXIsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBhZGRpdGlvbmFsUmVwb3J0ZXIgKTsKKworfQorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGVzdHMoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworCisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCBjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiTWF0Y2hpbmcgdGVzdCBjYXNlczpcbiI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQWxsIGF2YWlsYWJsZSB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgbWF0Y2hlZFRlc3RzID0gMDsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMgbmFtZUF0dHIsIHRhZ3NBdHRyOworICAgICAgICBuYW1lQXR0ci5zZXRJbml0aWFsSW5kZW50KCAyICkuc2V0SW5kZW50KCA0ICk7CisgICAgICAgIHRhZ3NBdHRyLnNldEluZGVudCggNiApOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIG1hdGNoZWRUZXN0cysrOworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyID0gdGVzdENhc2VJbmZvLmlzSGlkZGVuKCkKKyAgICAgICAgICAgICAgICA/IENvbG91cjo6U2Vjb25kYXJ5VGV4dAorICAgICAgICAgICAgICAgIDogQ29sb3VyOjpOb25lOworICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBUZXh0KCB0ZXN0Q2FzZUluZm8ubmFtZSwgbmFtZUF0dHIgKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBpZiggIXRlc3RDYXNlSW5mby50YWdzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgVGV4dCggdGVzdENhc2VJbmZvLnRhZ3NBc1N0cmluZywgdGFnc0F0dHIgKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpZiggIWNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggbWF0Y2hlZFRlc3RzLCAidGVzdCBjYXNlIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggbWF0Y2hlZFRlc3RzLCAibWF0Y2hpbmcgdGVzdCBjYXNlIiApIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOworICAgIH0KKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGVzdHNOYW1lc09ubHkoIENvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggIWNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgc3RkOjpzaXplX3QgbWF0Y2hlZFRlc3RzID0gMDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1hdGNoZWRUZXN0Q2FzZXMgPSBmaWx0ZXJUZXN0cyggZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKSwgdGVzdFNwZWMsIGNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtYXRjaGVkVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gbWF0Y2hlZFRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgbWF0Y2hlZFRlc3RzKys7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0ZXN0Q2FzZUluZm8ubmFtZSwgJyMnICkgKQorICAgICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAnIicgPDwgdGVzdENhc2VJbmZvLm5hbWUgPDwgJyInIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgdGVzdENhc2VJbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXRjaGVkVGVzdHM7CisgICAgfQorCisgICAgc3RydWN0IFRhZ0luZm8geworICAgICAgICBUYWdJbmZvKCkgOiBjb3VudCAoIDAgKSB7fQorICAgICAgICB2b2lkIGFkZCggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWxsaW5nICkgeworICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgIHNwZWxsaW5ncy5pbnNlcnQoIHNwZWxsaW5nICk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgYWxsKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb3V0OworICAgICAgICAgICAgZm9yKCBzdGQ6OnNldDxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3BlbGxpbmdzLmJlZ2luKCksIGl0RW5kID0gc3BlbGxpbmdzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICBvdXQgKz0gIlsiICsgKml0ICsgIl0iOworICAgICAgICAgICAgcmV0dXJuIG91dDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gc3BlbGxpbmdzOworICAgICAgICBzdGQ6OnNpemVfdCBjb3VudDsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RUYWdzKCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoIGNvbmZpZy50ZXN0U3BlYygpLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJUYWdzIGZvciBtYXRjaGluZyB0ZXN0IGNhc2VzOlxuIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJBbGwgYXZhaWxhYmxlIHRhZ3M6XG4iOworICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnSW5mbz4gdGFnQ291bnRzOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciAgdGFnSXQgPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCkudGFncy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdJdEVuZCA9IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS50YWdzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICB0YWdJdCAhPSB0YWdJdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKyt0YWdJdCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB0YWdOYW1lID0gKnRhZ0l0OworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxjYXNlVGFnTmFtZSA9IHRvTG93ZXIoIHRhZ05hbWUgKTsKKyAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnSW5mbz46Oml0ZXJhdG9yIGNvdW50SXQgPSB0YWdDb3VudHMuZmluZCggbGNhc2VUYWdOYW1lICk7CisgICAgICAgICAgICAgICAgaWYoIGNvdW50SXQgPT0gdGFnQ291bnRzLmVuZCgpICkKKyAgICAgICAgICAgICAgICAgICAgY291bnRJdCA9IHRhZ0NvdW50cy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBsY2FzZVRhZ05hbWUsIFRhZ0luZm8oKSApICkuZmlyc3Q7CisgICAgICAgICAgICAgICAgY291bnRJdC0+c2Vjb25kLmFkZCggdGFnTmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGNvdW50SXQgPSB0YWdDb3VudHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50SXRFbmQgPSB0YWdDb3VudHMuZW5kKCk7CisgICAgICAgICAgICAgICAgY291bnRJdCAhPSBjb3VudEl0RW5kOworICAgICAgICAgICAgICAgICsrY291bnRJdCApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgIiAgIiA8PCBzdGQ6OnNldHcoMikgPDwgY291bnRJdC0+c2Vjb25kLmNvdW50IDw8ICIgICI7CisgICAgICAgICAgICBUZXh0IHdyYXBwZXIoIGNvdW50SXQtPnNlY29uZC5hbGwoKSwgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBvc3Muc3RyKCkuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEwICkgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgb3NzLnN0cigpIDw8IHdyYXBwZXIgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHBsdXJhbGlzZSggdGFnQ291bnRzLnNpemUoKSwgInRhZyIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIHRhZ0NvdW50cy5zaXplKCk7CisgICAgfQorCisgICAgaW5saW5lIHN0ZDo6c2l6ZV90IGxpc3RSZXBvcnRlcnMoIENvbmZpZyBjb25zdCYgLypjb25maWcqLyApIHsKKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQXZhaWxhYmxlIHJlcG9ydGVyczpcbiI7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwIGNvbnN0JiBmYWN0b3JpZXMgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRGYWN0b3JpZXMoKTsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6OkZhY3RvcnlNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0QmVnaW4gPSBmYWN0b3JpZXMuYmVnaW4oKSwgaXRFbmQgPSBmYWN0b3JpZXMuZW5kKCksIGl0OworICAgICAgICBzdGQ6OnNpemVfdCBtYXhOYW1lTGVuID0gMDsKKyAgICAgICAgZm9yKGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgbWF4TmFtZUxlbiA9IChzdGQ6Om1heCkoIG1heE5hbWVMZW4sIGl0LT5maXJzdC5zaXplKCkgKTsKKworICAgICAgICBmb3IoaXQgPSBpdEJlZ2luOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgIFRleHQgd3JhcHBlciggaXQtPnNlY29uZC0+Z2V0RGVzY3JpcHRpb24oKSwgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIDcrbWF4TmFtZUxlbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggLSBtYXhOYW1lTGVuLTggKSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiICAiCisgICAgICAgICAgICAgICAgICAgIDw8IGl0LT5maXJzdAorICAgICAgICAgICAgICAgICAgICA8PCAnOicKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpzdHJpbmcoIG1heE5hbWVMZW4gLSBpdC0+Zmlyc3Quc2l6ZSgpICsgMiwgJyAnICkKKyAgICAgICAgICAgICAgICAgICAgPDwgd3JhcHBlciA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gZmFjdG9yaWVzLnNpemUoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0KCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0ZWRDb3VudDsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGVzdHMoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGVzdHMoIGNvbmZpZyApOworICAgICAgICBpZiggY29uZmlnLmxpc3RUZXN0TmFtZXNPbmx5KCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzTmFtZXNPbmx5KCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGFncygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUYWdzKCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0UmVwb3J0ZXJzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFJlcG9ydGVycyggY29uZmlnICk7CisgICAgICAgIHJldHVybiBsaXN0ZWRDb3VudDsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfcnVuX2NvbnRleHQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SVU5ORVJfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV90cmFja2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX1RSQUNLRVJfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisKK0NBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUworCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcgeworCisgICAgc3RydWN0IE5hbWVBbmRMb2NhdGlvbiB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxvY2F0aW9uOworCisgICAgICAgIE5hbWVBbmRMb2NhdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xvY2F0aW9uICkKKyAgICAgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgICAgICBsb2NhdGlvbiggX2xvY2F0aW9uICkKKyAgICAgICAge30KKyAgICB9OworCisgICAgc3RydWN0IElUcmFja2VyIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgdmlydHVhbCB+SVRyYWNrZXIoKTsKKworICAgICAgICAvLyBzdGF0aWMgcXVlcmllcworICAgICAgICB2aXJ0dWFsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uKCkgY29uc3QgPSAwOworCisgICAgICAgIC8vIGR5bmFtaWMgcXVlcmllcworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0ID0gMDsgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBvciBmYWlsZWQKKyAgICAgICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgY29uc3QgPSAwOyAvLyBTdGFydGVkIGJ1dCBub3QgY29tcGxldGUKKyAgICAgICAgdmlydHVhbCBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXImIHBhcmVudCgpID0gMDsKKworICAgICAgICAvLyBhY3Rpb25zCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsgLy8gU3VjY2Vzc2Z1bGx5IGNvbXBsZXRlCisgICAgICAgIHZpcnR1YWwgdm9pZCBmYWlsKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgbWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiBjaGlsZCApID0gMDsKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciogZmluZENoaWxkKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9wZW5DaGlsZCgpID0gMDsKKworICAgICAgICAvLyBEZWJ1Zy8gY2hlY2tpbmcKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgIFRyYWNrZXJDb250ZXh0IHsKKworICAgICAgICBlbnVtIFJ1blN0YXRlIHsKKyAgICAgICAgICAgIE5vdFN0YXJ0ZWQsCisgICAgICAgICAgICBFeGVjdXRpbmcsCisgICAgICAgICAgICBDb21wbGV0ZWRDeWNsZQorICAgICAgICB9OworCisgICAgICAgIFB0cjxJVHJhY2tlcj4gbV9yb290VHJhY2tlcjsKKyAgICAgICAgSVRyYWNrZXIqIG1fY3VycmVudFRyYWNrZXI7CisgICAgICAgIFJ1blN0YXRlIG1fcnVuU3RhdGU7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgc3RhdGljIFRyYWNrZXJDb250ZXh0JiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHN0YXRpYyBUcmFja2VyQ29udGV4dCBzX2luc3RhbmNlOworICAgICAgICAgICAgcmV0dXJuIHNfaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBUcmFja2VyQ29udGV4dCgpCisgICAgICAgIDogICBtX2N1cnJlbnRUcmFja2VyKCBDQVRDSF9OVUxMICksCisgICAgICAgICAgICBtX3J1blN0YXRlKCBOb3RTdGFydGVkICkKKyAgICAgICAge30KKworICAgICAgICBJVHJhY2tlciYgc3RhcnRSdW4oKTsKKworICAgICAgICB2b2lkIGVuZFJ1bigpIHsKKyAgICAgICAgICAgIG1fcm9vdFRyYWNrZXIucmVzZXQoKTsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IE5vdFN0YXJ0ZWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0Q3ljbGUoKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gbV9yb290VHJhY2tlci5nZXQoKTsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjb21wbGV0ZUN5Y2xlKCkgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZEN5Y2xlOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBjb21wbGV0ZWRDeWNsZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZEN5Y2xlOworICAgICAgICB9CisgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAqbV9jdXJyZW50VHJhY2tlcjsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldEN1cnJlbnRUcmFja2VyKCBJVHJhY2tlciogdHJhY2tlciApIHsKKyAgICAgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSB0cmFja2VyOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIFRyYWNrZXJCYXNlIDogcHVibGljIElUcmFja2VyIHsKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0gQ3ljbGVTdGF0ZSB7CisgICAgICAgICAgICBOb3RTdGFydGVkLAorICAgICAgICAgICAgRXhlY3V0aW5nLAorICAgICAgICAgICAgRXhlY3V0aW5nQ2hpbGRyZW4sCisgICAgICAgICAgICBOZWVkc0Fub3RoZXJSdW4sCisgICAgICAgICAgICBDb21wbGV0ZWRTdWNjZXNzZnVsbHksCisgICAgICAgICAgICBGYWlsZWQKKyAgICAgICAgfTsKKyAgICAgICAgY2xhc3MgVHJhY2tlckhhc05hbWUgeworICAgICAgICAgICAgTmFtZUFuZExvY2F0aW9uIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBUcmFja2VySGFzTmFtZSggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSA6IG1fbmFtZUFuZExvY2F0aW9uKCBuYW1lQW5kTG9jYXRpb24gKSB7fQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciAoKSggUHRyPElUcmFja2VyPiBjb25zdCYgdHJhY2tlciApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgdHJhY2tlci0+bmFtZUFuZExvY2F0aW9uKCkubmFtZSA9PSBtX25hbWVBbmRMb2NhdGlvbi5uYW1lICYmCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLmxvY2F0aW9uID09IG1fbmFtZUFuZExvY2F0aW9uLmxvY2F0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxJVHJhY2tlcj4gPiBDaGlsZHJlbjsKKyAgICAgICAgTmFtZUFuZExvY2F0aW9uIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICBUcmFja2VyQ29udGV4dCYgbV9jdHg7CisgICAgICAgIElUcmFja2VyKiBtX3BhcmVudDsKKyAgICAgICAgQ2hpbGRyZW4gbV9jaGlsZHJlbjsKKyAgICAgICAgQ3ljbGVTdGF0ZSBtX3J1blN0YXRlOworICAgIHB1YmxpYzoKKyAgICAgICAgVHJhY2tlckJhc2UoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50ICkKKyAgICAgICAgOiAgIG1fbmFtZUFuZExvY2F0aW9uKCBuYW1lQW5kTG9jYXRpb24gKSwKKyAgICAgICAgICAgIG1fY3R4KCBjdHggKSwKKyAgICAgICAgICAgIG1fcGFyZW50KCBwYXJlbnQgKSwKKyAgICAgICAgICAgIG1fcnVuU3RhdGUoIE5vdFN0YXJ0ZWQgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UcmFja2VyQmFzZSgpOworCisgICAgICAgIHZpcnR1YWwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9uYW1lQW5kTG9jYXRpb247CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRTdWNjZXNzZnVsbHkgfHwgbV9ydW5TdGF0ZSA9PSBGYWlsZWQ7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGlzU3VjY2Vzc2Z1bGx5Q29tcGxldGVkKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSAhPSBOb3RTdGFydGVkICYmICFpc0NvbXBsZXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuICFtX2NoaWxkcmVuLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFB0cjxJVHJhY2tlcj4gY29uc3QmIGNoaWxkICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9jaGlsZHJlbi5wdXNoX2JhY2soIGNoaWxkICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIElUcmFja2VyKiBmaW5kQ2hpbGQoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQ2hpbGRyZW46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3RkOjpmaW5kX2lmKCBtX2NoaWxkcmVuLmJlZ2luKCksIG1fY2hpbGRyZW4uZW5kKCksIFRyYWNrZXJIYXNOYW1lKCBuYW1lQW5kTG9jYXRpb24gKSApOworICAgICAgICAgICAgcmV0dXJuKCBpdCAhPSBtX2NoaWxkcmVuLmVuZCgpICkKKyAgICAgICAgICAgICAgICA/IGl0LT5nZXQoKQorICAgICAgICAgICAgICAgIDogQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIElUcmFja2VyJiBwYXJlbnQoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoIG1fcGFyZW50ICk7IC8vIFNob3VsZCBhbHdheXMgYmUgbm9uLW51bGwgZXhjZXB0IGZvciByb290CisgICAgICAgICAgICByZXR1cm4gKm1fcGFyZW50OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9wZW5DaGlsZCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBtX3J1blN0YXRlICE9IEV4ZWN1dGluZ0NoaWxkcmVuICkgeworICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmdDaGlsZHJlbjsKKyAgICAgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+b3BlbkNoaWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0luZGV4VHJhY2tlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAgICAgdm9pZCBvcGVuKCkgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgICAgIG1vdmVUb1RoaXMoKTsKKyAgICAgICAgICAgIGlmKCBtX3BhcmVudCApCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm9wZW5DaGlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgQ0FUQ0hfT1ZFUlJJREUgeworCisgICAgICAgICAgICAvLyBDbG9zZSBhbnkgc3RpbGwgb3BlbiBjaGlsZHJlbiAoZS5nLiBnZW5lcmF0b3JzKQorICAgICAgICAgICAgd2hpbGUoICZtX2N0eC5jdXJyZW50VHJhY2tlcigpICE9IHRoaXMgKQorICAgICAgICAgICAgICAgIG1fY3R4LmN1cnJlbnRUcmFja2VyKCkuY2xvc2UoKTsKKworICAgICAgICAgICAgc3dpdGNoKCBtX3J1blN0YXRlICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm90U3RhcnRlZDoKKyAgICAgICAgICAgICAgICBjYXNlIENvbXBsZXRlZFN1Y2Nlc3NmdWxseToKKyAgICAgICAgICAgICAgICBjYXNlIEZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIklsbG9naWNhbCBzdGF0ZSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgTmVlZHNBbm90aGVyUnVuOgorICAgICAgICAgICAgICAgICAgICBicmVhazs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEV4ZWN1dGluZzoKKyAgICAgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmdDaGlsZHJlbjoKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1fY2hpbGRyZW4uZW1wdHkoKSB8fCBtX2NoaWxkcmVuLmJhY2soKS0+aXNDb21wbGV0ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVuZXhwZWN0ZWQgc3RhdGUiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb3ZlVG9QYXJlbnQoKTsKKyAgICAgICAgICAgIG1fY3R4LmNvbXBsZXRlQ3ljbGUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgZmFpbCgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBGYWlsZWQ7CisgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpOworICAgICAgICAgICAgbW92ZVRvUGFyZW50KCk7CisgICAgICAgICAgICBtX2N0eC5jb21wbGV0ZUN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIG1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IE5lZWRzQW5vdGhlclJ1bjsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbW92ZVRvUGFyZW50KCkgeworICAgICAgICAgICAgYXNzZXJ0KCBtX3BhcmVudCApOworICAgICAgICAgICAgbV9jdHguc2V0Q3VycmVudFRyYWNrZXIoIG1fcGFyZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBtb3ZlVG9UaGlzKCkgeworICAgICAgICAgICAgbV9jdHguc2V0Q3VycmVudFRyYWNrZXIoIHRoaXMgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBTZWN0aW9uVHJhY2tlciA6IHB1YmxpYyBUcmFja2VyQmFzZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX2ZpbHRlcnM7CisgICAgcHVibGljOgorICAgICAgICBTZWN0aW9uVHJhY2tlciggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQgKQorICAgICAgICA6ICAgVHJhY2tlckJhc2UoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCBwYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcGFyZW50ICkgeworICAgICAgICAgICAgICAgIHdoaWxlKCAhcGFyZW50LT5pc1NlY3Rpb25UcmFja2VyKCkgKQorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSAmcGFyZW50LT5wYXJlbnQoKTsKKworICAgICAgICAgICAgICAgIFNlY3Rpb25UcmFja2VyJiBwYXJlbnRTZWN0aW9uID0gc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXImPiggKnBhcmVudCApOworICAgICAgICAgICAgICAgIGFkZE5leHRGaWx0ZXJzKCBwYXJlbnRTZWN0aW9uLm1fZmlsdGVycyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgflNlY3Rpb25UcmFja2VyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgc3RhdGljIFNlY3Rpb25UcmFja2VyJiBhY3F1aXJlKCBUcmFja2VyQ29udGV4dCYgY3R4LCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIHsKKyAgICAgICAgICAgIFNlY3Rpb25UcmFja2VyKiBzZWN0aW9uID0gQ0FUQ0hfTlVMTDsKKworICAgICAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyID0gY3R4LmN1cnJlbnRUcmFja2VyKCk7CisgICAgICAgICAgICBpZiggSVRyYWNrZXIqIGNoaWxkVHJhY2tlciA9IGN1cnJlbnRUcmFja2VyLmZpbmRDaGlsZCggbmFtZUFuZExvY2F0aW9uICkgKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlci0+aXNTZWN0aW9uVHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgc2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyKj4oIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2VjdGlvbiA9IG5ldyBTZWN0aW9uVHJhY2tlciggbmFtZUFuZExvY2F0aW9uLCBjdHgsICZjdXJyZW50VHJhY2tlciApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja2VyLmFkZENoaWxkKCBzZWN0aW9uICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWN0eC5jb21wbGV0ZWRDeWNsZSgpICkKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT50cnlPcGVuKCk7CisgICAgICAgICAgICByZXR1cm4gKnNlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRyeU9wZW4oKSB7CisgICAgICAgICAgICBpZiggIWlzQ29tcGxldGUoKSAmJiAobV9maWx0ZXJzLmVtcHR5KCkgfHwgbV9maWx0ZXJzWzBdLmVtcHR5KCkgfHwgIG1fZmlsdGVyc1swXSA9PSBtX25hbWVBbmRMb2NhdGlvbi5uYW1lICkgKQorICAgICAgICAgICAgICAgIG9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkSW5pdGlhbEZpbHRlcnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZmlsdGVycyApIHsKKyAgICAgICAgICAgIGlmKCAhZmlsdGVycy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fZmlsdGVycy5wdXNoX2JhY2soIiIpOyAvLyBSb290IC0gc2hvdWxkIG5ldmVyIGJlIGNvbnN1bHRlZAorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5wdXNoX2JhY2soIiIpOyAvLyBUZXN0IENhc2UgLSBub3QgYSBzZWN0aW9uIGZpbHRlcgorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQoKSwgZmlsdGVycy5iZWdpbigpLCBmaWx0ZXJzLmVuZCgpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBhZGROZXh0RmlsdGVycyggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBmaWx0ZXJzICkgeworICAgICAgICAgICAgaWYoIGZpbHRlcnMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgbV9maWx0ZXJzLmluc2VydCggbV9maWx0ZXJzLmVuZCgpLCArK2ZpbHRlcnMuYmVnaW4oKSwgZmlsdGVycy5lbmQoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIGNsYXNzIEluZGV4VHJhY2tlciA6IHB1YmxpYyBUcmFja2VyQmFzZSB7CisgICAgICAgIGludCBtX3NpemU7CisgICAgICAgIGludCBtX2luZGV4OworICAgIHB1YmxpYzoKKyAgICAgICAgSW5kZXhUcmFja2VyKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCwgaW50IHNpemUgKQorICAgICAgICA6ICAgVHJhY2tlckJhc2UoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCBwYXJlbnQgKSwKKyAgICAgICAgICAgIG1fc2l6ZSggc2l6ZSApLAorICAgICAgICAgICAgbV9pbmRleCggLTEgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5JbmRleFRyYWNrZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgc3RhdGljIEluZGV4VHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIGludCBzaXplICkgeworICAgICAgICAgICAgSW5kZXhUcmFja2VyKiB0cmFja2VyID0gQ0FUQ0hfTlVMTDsKKworICAgICAgICAgICAgSVRyYWNrZXImIGN1cnJlbnRUcmFja2VyID0gY3R4LmN1cnJlbnRUcmFja2VyKCk7CisgICAgICAgICAgICBpZiggSVRyYWNrZXIqIGNoaWxkVHJhY2tlciA9IGN1cnJlbnRUcmFja2VyLmZpbmRDaGlsZCggbmFtZUFuZExvY2F0aW9uICkgKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNoaWxkVHJhY2tlci0+aXNJbmRleFRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHRyYWNrZXIgPSBzdGF0aWNfY2FzdDxJbmRleFRyYWNrZXIqPiggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFja2VyID0gbmV3IEluZGV4VHJhY2tlciggbmFtZUFuZExvY2F0aW9uLCBjdHgsICZjdXJyZW50VHJhY2tlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFja2VyLmFkZENoaWxkKCB0cmFja2VyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhY3R4LmNvbXBsZXRlZEN5Y2xlKCkgJiYgIXRyYWNrZXItPmlzQ29tcGxldGUoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggdHJhY2tlci0+bV9ydW5TdGF0ZSAhPSBFeGVjdXRpbmdDaGlsZHJlbiAmJiB0cmFja2VyLT5tX3J1blN0YXRlICE9IE5lZWRzQW5vdGhlclJ1biApCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgdHJhY2tlci0+b3BlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKnRyYWNrZXI7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2luZGV4OyB9CisKKyAgICAgICAgdm9pZCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIG1faW5kZXgrKzsKKyAgICAgICAgICAgIG1fY2hpbGRyZW4uY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFRyYWNrZXJCYXNlOjpjbG9zZSgpOworICAgICAgICAgICAgaWYoIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5ICYmIG1faW5kZXggPCBtX3NpemUtMSApCisgICAgICAgICAgICAgICAgbV9ydW5TdGF0ZSA9IEV4ZWN1dGluZzsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBpbmxpbmUgSVRyYWNrZXImIFRyYWNrZXJDb250ZXh0OjpzdGFydFJ1bigpIHsKKyAgICAgICAgbV9yb290VHJhY2tlciA9IG5ldyBTZWN0aW9uVHJhY2tlciggTmFtZUFuZExvY2F0aW9uKCAie3Jvb3R9IiwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKSwgKnRoaXMsIENBVENIX05VTEwgKTsKKyAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IENBVENIX05VTEw7CisgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIHJldHVybiAqbV9yb290VHJhY2tlcjsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIFRlc3RDYXNlVHJhY2tpbmcKKwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6SVRyYWNrZXI7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpUcmFja2VyQ29udGV4dDsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OlNlY3Rpb25UcmFja2VyOwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6SW5kZXhUcmFja2VyOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCitDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZmF0YWxfY29uZGl0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRkFUQUxfQ09ORElUSU9OX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFJlcG9ydCB0aGUgZXJyb3IgY29uZGl0aW9uCisgICAgaW5saW5lIHZvaWQgcmVwb3J0RmF0YWwoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICBJQ29udGV4dCYgY29udGV4dCA9IENhdGNoOjpnZXRDdXJyZW50Q29udGV4dCgpOworICAgICAgICBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSA9IGNvbnRleHQuZ2V0UmVzdWx0Q2FwdHVyZSgpOworICAgICAgICByZXN1bHRDYXB0dXJlLT5oYW5kbGVGYXRhbEVycm9yQ29uZGl0aW9uKCBtZXNzYWdlICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWYgZGVmaW5lZCAoIENBVENIX1BMQVRGT1JNX1dJTkRPV1MgKSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3dpbmRvd3NfaF9wcm94eS5oCisKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1dJTkRPV1NfSF9QUk9YWV9IX0lOQ0xVREVECisKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX05PTUlOTUFYCisjICBkZWZpbmUgTk9NSU5NQVgKKyNlbmRpZgorI2lmZGVmIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorCisjaWZkZWYgX19BRlhETEwKKyNpbmNsdWRlIDxBZnhXaW4uaD4KKyNlbHNlCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX05PTUlOTUFYCisjICB1bmRlZiBOT01JTk1BWAorI2VuZGlmCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICB1bmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworCisjICBpZiAhZGVmaW5lZCAoIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCApCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisgICAgICAgIHZvaWQgcmVzZXQoKSB7fQorICAgIH07Cit9CisKKyMgIGVsc2UgLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VIIGlzIGRlZmluZWQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBTaWduYWxEZWZzIHsgRFdPUkQgaWQ7IGNvbnN0IGNoYXIqIG5hbWU7IH07CisgICAgZXh0ZXJuIFNpZ25hbERlZnMgc2lnbmFsRGVmc1tdOworICAgIC8vIFRoZXJlIGlzIG5vIDEtMSBtYXBwaW5nIGJldHdlZW4gc2lnbmFscyBhbmQgd2luZG93cyBleGNlcHRpb25zLgorICAgIC8vIFdpbmRvd3MgY2FuIGVhc2lseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIFNPIGFuZCBTaWdTZWdWLAorICAgIC8vIGJ1dCBTaWdJbnQsIFNpZ1Rlcm0sIGV0YyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4KKyAgICBTaWduYWxEZWZzIHNpZ25hbERlZnNbXSA9IHsKKyAgICAgICAgeyBFWENFUFRJT05fSUxMRUdBTF9JTlNUUlVDVElPTiwgICJTSUdJTEwgLSBJbGxlZ2FsIGluc3RydWN0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgeyBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1csICJTSUdTRUdWIC0gU3RhY2sgb3ZlcmZsb3ciIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04sICJTSUdTRUdWIC0gU2VnbWVudGF0aW9uIHZpb2xhdGlvbiBzaWduYWwiIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTywgIkRpdmlkZSBieSB6ZXJvIGVycm9yIiB9LAorICAgIH07CisKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKworICAgICAgICBzdGF0aWMgTE9ORyBDQUxMQkFDSyBoYW5kbGVWZWN0b3JlZEV4Y2VwdGlvbihQRVhDRVBUSU9OX1BPSU5URVJTIEV4Y2VwdGlvbkluZm8pIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpIC8gc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoRXhjZXB0aW9uSW5mby0+RXhjZXB0aW9uUmVjb3JkLT5FeGNlcHRpb25Db2RlID09IHNpZ25hbERlZnNbaV0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwb3J0RmF0YWwoc2lnbmFsRGVmc1tpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBpdHMgbm90IGFuIGV4Y2VwdGlvbiB3ZSBjYXJlIGFib3V0LCBwYXNzIGl0IGFsb25nLgorICAgICAgICAgICAgLy8gVGhpcyBzdG9wcyB1cyBmcm9tIGVhdGluZyBkZWJ1Z2dlciBicmVha3MgZXRjLgorICAgICAgICAgICAgcmV0dXJuIEVYQ0VQVElPTl9DT05USU5VRV9TRUFSQ0g7CisgICAgICAgIH0KKworICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBpc1NldCA9IHRydWU7CisgICAgICAgICAgICAvLyAzMmsgc2VlbXMgZW5vdWdoIGZvciBDYXRjaCB0byBoYW5kbGUgc3RhY2sgb3ZlcmZsb3csCisgICAgICAgICAgICAvLyBidXQgdGhlIHZhbHVlIHdhcyBmb3VuZCBleHBlcmltZW50YWxseSwgc28gdGhlcmUgaXMgbm8gc3Ryb25nIGd1YXJhbnRlZQorICAgICAgICAgICAgZ3VhcmFudGVlU2l6ZSA9IDMyICogMTAyNDsKKyAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgYXMgZmlyc3QgaGFuZGxlciBpbiBjdXJyZW50IGNoYWluCisgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQWRkVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKDEsIGhhbmRsZVZlY3RvcmVkRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIC8vIFBhc3MgaW4gZ3VhcmFudGVlIHNpemUgdG8gYmUgZmlsbGVkCisgICAgICAgICAgICBTZXRUaHJlYWRTdGFja0d1YXJhbnRlZSgmZ3VhcmFudGVlU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmIChpc1NldCkgeworICAgICAgICAgICAgICAgIC8vIFVucmVnaXN0ZXIgaGFuZGxlciBhbmQgcmVzdG9yZSB0aGUgb2xkIGd1YXJhbnRlZQorICAgICAgICAgICAgICAgIFJlbW92ZVZlY3RvcmVkRXhjZXB0aW9uSGFuZGxlcihleGNlcHRpb25IYW5kbGVySGFuZGxlKTsKKyAgICAgICAgICAgICAgICBTZXRUaHJlYWRTdGFja0d1YXJhbnRlZSgmZ3VhcmFudGVlU2l6ZSk7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICAgICAgaXNTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIH5GYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIGJvb2wgaXNTZXQ7CisgICAgICAgIHN0YXRpYyBVTE9ORyBndWFyYW50ZWVTaXplOworICAgICAgICBzdGF0aWMgUFZPSUQgZXhjZXB0aW9uSGFuZGxlckhhbmRsZTsKKyAgICB9OworCisgICAgYm9vbCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmlzU2V0ID0gZmFsc2U7CisgICAgVUxPTkcgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpndWFyYW50ZWVTaXplID0gMDsKKyAgICBQVk9JRCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjICBlbmRpZiAvLyBDQVRDSF9DT05GSUdfV0lORE9XU19TRUgKKworI2Vsc2UgLy8gTm90IFdpbmRvd3MgLSBhc3N1bWVkIHRvIGJlIFBPU0lYIGNvbXBhdGlibGUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMpCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisgICAgICAgIHZvaWQgcmVzZXQoKSB7fQorICAgIH07Cit9CisKKyMgIGVsc2UgLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMgaXMgZGVmaW5lZAorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2lnbmFsRGVmcyB7CisgICAgICAgIGludCBpZDsKKyAgICAgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICB9OworICAgIGV4dGVybiBTaWduYWxEZWZzIHNpZ25hbERlZnNbXTsKKyAgICBTaWduYWxEZWZzIHNpZ25hbERlZnNbXSA9IHsKKyAgICAgICAgICAgIHsgU0lHSU5ULCAgIlNJR0lOVCAtIFRlcm1pbmFsIGludGVycnVwdCBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0lMTCwgICJTSUdJTEwgLSBJbGxlZ2FsIGluc3RydWN0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHRlBFLCAgIlNJR0ZQRSAtIEZsb2F0aW5nIHBvaW50IGVycm9yIHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHU0VHViwgIlNJR1NFR1YgLSBTZWdtZW50YXRpb24gdmlvbGF0aW9uIHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHVEVSTSwgIlNJR1RFUk0gLSBUZXJtaW5hdGlvbiByZXF1ZXN0IHNpZ25hbCIgfSwKKyAgICAgICAgICAgIHsgU0lHQUJSVCwgIlNJR0FCUlQgLSBBYm9ydCAoYWJub3JtYWwgdGVybWluYXRpb24pIHNpZ25hbCIgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgRmF0YWxDb25kaXRpb25IYW5kbGVyIHsKKworICAgICAgICBzdGF0aWMgYm9vbCBpc1NldDsKKyAgICAgICAgc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gb2xkU2lnQWN0aW9ucyBbc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKV07CisgICAgICAgIHN0YXRpYyBzdGFja190IG9sZFNpZ1N0YWNrOworICAgICAgICBzdGF0aWMgY2hhciBhbHRTdGFja01lbVtTSUdTVEtTWl07CisKKyAgICAgICAgc3RhdGljIHZvaWQgaGFuZGxlU2lnbmFsKCBpbnQgc2lnICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9ICI8dW5rbm93biBzaWduYWw+IjsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykgLyBzaXplb2YoU2lnbmFsRGVmcyk7ICsraSkgeworICAgICAgICAgICAgICAgIFNpZ25hbERlZnMgJmRlZiA9IHNpZ25hbERlZnNbaV07CisgICAgICAgICAgICAgICAgaWYgKHNpZyA9PSBkZWYuaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGRlZi5uYW1lOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgcmVwb3J0RmF0YWwobmFtZSk7CisgICAgICAgICAgICByYWlzZSggc2lnICk7CisgICAgICAgIH0KKworICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICBpc1NldCA9IHRydWU7CisgICAgICAgICAgICBzdGFja190IHNpZ1N0YWNrOworICAgICAgICAgICAgc2lnU3RhY2suc3Nfc3AgPSBhbHRTdGFja01lbTsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX3NpemUgPSBTSUdTVEtTWjsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX2ZsYWdzID0gMDsKKyAgICAgICAgICAgIHNpZ2FsdHN0YWNrKCZzaWdTdGFjaywgJm9sZFNpZ1N0YWNrKTsKKyAgICAgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gc2EgPSB7IDAgfTsKKworICAgICAgICAgICAgc2Euc2FfaGFuZGxlciA9IGhhbmRsZVNpZ25hbDsKKyAgICAgICAgICAgIHNhLnNhX2ZsYWdzID0gU0FfT05TVEFDSzsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVmc1tpXS5pZCwgJnNhLCAmb2xkU2lnQWN0aW9uc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB+RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBpc1NldCApIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgc2lnbmFscyBiYWNrIHRvIHByZXZpb3VzIHZhbHVlcyAtLSBob3BlZnVsbHkgbm9ib2R5IG92ZXJ3cm90ZSB0aGVtIGluIHRoZSBtZWFudGltZQorICAgICAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ2FjdGlvbihzaWduYWxEZWZzW2ldLmlkLCAmb2xkU2lnQWN0aW9uc1tpXSwgQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgb2xkIHN0YWNrCisgICAgICAgICAgICAgICAgc2lnYWx0c3RhY2soJm9sZFNpZ1N0YWNrLCBDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgICAgICBpc1NldCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGJvb2wgRmF0YWxDb25kaXRpb25IYW5kbGVyOjppc1NldCA9IGZhbHNlOworICAgIHN0cnVjdCBzaWdhY3Rpb24gRmF0YWxDb25kaXRpb25IYW5kbGVyOjpvbGRTaWdBY3Rpb25zW3NpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyldID0ge307CisgICAgc3RhY2tfdCBGYXRhbENvbmRpdGlvbkhhbmRsZXI6Om9sZFNpZ1N0YWNrID0ge307CisgICAgY2hhciBGYXRhbENvbmRpdGlvbkhhbmRsZXI6OmFsdFN0YWNrTWVtW1NJR1NUS1NaXSA9IHt9OworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjICBlbmRpZiAvLyBDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUworCisjZW5kaWYgLy8gbm90IFdpbmRvd3MKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTdHJlYW1SZWRpcmVjdCB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFN0cmVhbVJlZGlyZWN0KCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSwgc3RkOjpzdHJpbmcmIHRhcmdldFN0cmluZyApCisgICAgICAgIDogICBtX3N0cmVhbSggc3RyZWFtICksCisgICAgICAgICAgICBtX3ByZXZCdWYoIHN0cmVhbS5yZGJ1ZigpICksCisgICAgICAgICAgICBtX3RhcmdldFN0cmluZyggdGFyZ2V0U3RyaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyZWFtLnJkYnVmKCBtX29zcy5yZGJ1ZigpICk7CisgICAgICAgIH0KKworICAgICAgICB+U3RyZWFtUmVkaXJlY3QoKSB7CisgICAgICAgICAgICBtX3RhcmdldFN0cmluZyArPSBtX29zcy5zdHIoKTsKKyAgICAgICAgICAgIG1fc3RyZWFtLnJkYnVmKCBtX3ByZXZCdWYgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBtX3N0cmVhbTsKKyAgICAgICAgc3RkOjpzdHJlYW1idWYqIG1fcHJldkJ1ZjsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG1fb3NzOworICAgICAgICBzdGQ6OnN0cmluZyYgbV90YXJnZXRTdHJpbmc7CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgUnVuQ29udGV4dCA6IHB1YmxpYyBJUmVzdWx0Q2FwdHVyZSwgcHVibGljIElSdW5uZXIgeworCisgICAgICAgIFJ1bkNvbnRleHQoIFJ1bkNvbnRleHQgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3IgPSggUnVuQ29udGV4dCBjb25zdCYgKTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBleHBsaWNpdCBSdW5Db250ZXh0KCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9jb25maWcsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiByZXBvcnRlciApCisgICAgICAgIDogICBtX3J1bkluZm8oIF9jb25maWctPm5hbWUoKSApLAorICAgICAgICAgICAgbV9jb250ZXh0KCBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKSApLAorICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSggQ0FUQ0hfTlVMTCApLAorICAgICAgICAgICAgbV9jb25maWcoIF9jb25maWcgKSwKKyAgICAgICAgICAgIG1fcmVwb3J0ZXIoIHJlcG9ydGVyICksCisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgKCB0cnVlICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9jb250ZXh0LnNldFJ1bm5lciggdGhpcyApOworICAgICAgICAgICAgbV9jb250ZXh0LnNldENvbmZpZyggbV9jb25maWcgKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRSZXN1bHRDYXB0dXJlKCB0aGlzICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuU3RhcnRpbmcoIG1fcnVuSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+UnVuQ29udGV4dCgpIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzKCBtX3J1bkluZm8sIG1fdG90YWxzLCBhYm9ydGluZygpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0U3BlYywgc3RkOjpzaXplX3QgZ3JvdXBJbmRleCwgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnQgKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvKCB0ZXN0U3BlYywgZ3JvdXBJbmRleCwgZ3JvdXBzQ291bnQgKSApOworICAgICAgICB9CisgICAgICAgIHZvaWQgdGVzdEdyb3VwRW5kZWQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0U3BlYywgVG90YWxzIGNvbnN0JiB0b3RhbHMsIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXgsIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50ICkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzKCBHcm91cEluZm8oIHRlc3RTcGVjLCBncm91cEluZGV4LCBncm91cHNDb3VudCApLCB0b3RhbHMsIGFib3J0aW5nKCkgKSApOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzIHJ1blRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApIHsKKyAgICAgICAgICAgIFRvdGFscyBwcmV2VG90YWxzID0gbV90b3RhbHM7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDb3V0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVkaXJlY3RlZENlcnI7CisKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbyA9IHRlc3RDYXNlLmdldFRlc3RDYXNlSW5mbygpOworCisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZVN0YXJ0aW5nKCB0ZXN0SW5mbyApOworCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlID0gJnRlc3RDYXNlOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgSVRyYWNrZXImIHJvb3RUcmFja2VyID0gbV90cmFja2VyQ29udGV4dC5zdGFydFJ1bigpOworICAgICAgICAgICAgICAgIGFzc2VydCggcm9vdFRyYWNrZXIuaXNTZWN0aW9uVHJhY2tlcigpICk7CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8U2VjdGlvblRyYWNrZXImPiggcm9vdFRyYWNrZXIgKS5hZGRJbml0aWFsRmlsdGVycyggbV9jb25maWctPmdldFNlY3Rpb25zVG9SdW4oKSApOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgbV90cmFja2VyQ29udGV4dC5zdGFydEN5Y2xlKCk7CisgICAgICAgICAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyID0gJlNlY3Rpb25UcmFja2VyOjphY3F1aXJlKCBtX3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpOYW1lQW5kTG9jYXRpb24oIHRlc3RJbmZvLm5hbWUsIHRlc3RJbmZvLmxpbmVJbmZvICkgKTsKKyAgICAgICAgICAgICAgICAgICAgcnVuQ3VycmVudFRlc3QoIHJlZGlyZWN0ZWRDb3V0LCByZWRpcmVjdGVkQ2VyciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggIW1fdGVzdENhc2VUcmFja2VyLT5pc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpICYmICFhYm9ydGluZygpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAhVEJEOiBkZXByZWNhdGVkIC0gdGhpcyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGluZGV4ZWQgdHJhY2tlcnMKKyAgICAgICAgICAgIHdoaWxlKCBnZXRDdXJyZW50Q29udGV4dCgpLmFkdmFuY2VHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSAmJiAhYWJvcnRpbmcoKSApOworCisgICAgICAgICAgICBUb3RhbHMgZGVsdGFUb3RhbHMgPSBtX3RvdGFscy5kZWx0YSggcHJldlRvdGFscyApOworICAgICAgICAgICAgaWYoIHRlc3RJbmZvLmV4cGVjdGVkVG9GYWlsKCkgJiYgZGVsdGFUb3RhbHMudGVzdENhc2VzLnBhc3NlZCA+IDAgKSB7CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLS07CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV90b3RhbHMudGVzdENhc2VzICs9IGRlbHRhVG90YWxzLnRlc3RDYXNlczsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMoICAgdGVzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGVkQ291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZENlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0aW5nKCkgKSApOworCisgICAgICAgICAgICBtX2FjdGl2ZVRlc3RDYXNlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKworICAgICAgICAgICAgcmV0dXJuIGRlbHRhVG90YWxzOworICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZzsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZTogLy8gSVJlc3VsdENhcHR1cmUKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkgeworICAgICAgICAgICAgaWYoIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgPT0gUmVzdWx0V2FzOjpPayApIHsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLnBhc3NlZCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UgaGF2ZSBubyB1c2UgZm9yIHRoZSByZXR1cm4gdmFsdWUgKHdoZXRoZXIgbWVzc2FnZXMgc2hvdWxkIGJlIGNsZWFyZWQpLCBiZWNhdXNlIG1lc3NhZ2VzIHdlcmUgbWFkZSBzY29wZWQKKyAgICAgICAgICAgIC8vIGFuZCBzaG91bGQgYmUgbGV0IHRvIGNsZWFyIHRoZW1zZWx2ZXMgb3V0LgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZD4obV9yZXBvcnRlci0+YXNzZXJ0aW9uRW5kZWQoQXNzZXJ0aW9uU3RhdHMocmVzdWx0LCBtX21lc3NhZ2VzLCBtX3RvdGFscykpKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgd29ya2luZyBzdGF0ZQorICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mbyA9IEFzc2VydGlvbkluZm8oIHN0ZDo6c3RyaW5nKCksIG1fbGFzdEFzc2VydGlvbkluZm8ubGluZUluZm8sICJ7VW5rbm93biBleHByZXNzaW9uIGFmdGVyIHRoZSByZXBvcnRlZCBsaW5lfSIgLCBtX2xhc3RBc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgICAgICAgICBtX2xhc3RSZXN1bHQgPSByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2VjdGlvblN0YXJ0ZWQgKAorICAgICAgICAgICAgU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvLAorICAgICAgICAgICAgQ291bnRzJiBhc3NlcnRpb25zCisgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgSVRyYWNrZXImIHNlY3Rpb25UcmFja2VyID0gU2VjdGlvblRyYWNrZXI6OmFjcXVpcmUoIG1fdHJhY2tlckNvbnRleHQsIFRlc3RDYXNlVHJhY2tpbmc6Ok5hbWVBbmRMb2NhdGlvbiggc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvbkluZm8ubGluZUluZm8gKSApOworICAgICAgICAgICAgaWYoICFzZWN0aW9uVHJhY2tlci5pc09wZW4oKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5wdXNoX2JhY2soICZzZWN0aW9uVHJhY2tlciApOworCisgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvID0gc2VjdGlvbkluZm8ubGluZUluZm87CisKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKworICAgICAgICAgICAgYXNzZXJ0aW9ucyA9IG1fdG90YWxzLmFzc2VydGlvbnM7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJvb2wgdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBDb3VudHMmIGFzc2VydGlvbnMgKSB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9ucy50b3RhbCgpICE9IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPndhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmKCBtX3RyYWNrZXJDb250ZXh0LmN1cnJlbnRUcmFja2VyKCkuaGFzQ2hpbGRyZW4oKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQrKzsKKyAgICAgICAgICAgIGFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25FbmRJbmZvIGNvbnN0JiBlbmRJbmZvICkgeworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zIC0gZW5kSW5mby5wcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnMgPSB0ZXN0Rm9yTWlzc2luZ0Fzc2VydGlvbnMoIGFzc2VydGlvbnMgKTsKKworICAgICAgICAgICAgaWYoICFtX2FjdGl2ZVNlY3Rpb25zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyggZW5kSW5mby5zZWN0aW9uSW5mbywgYXNzZXJ0aW9ucywgZW5kSW5mby5kdXJhdGlvbkluU2Vjb25kcywgbWlzc2luZ0Fzc2VydGlvbnMgKSApOworICAgICAgICAgICAgbV9tZXNzYWdlcy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZEVhcmx5KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIHsKKyAgICAgICAgICAgIGlmKCBtX3VuZmluaXNoZWRTZWN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+ZmFpbCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9zZSgpOworICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5wb3BfYmFjaygpOworCisgICAgICAgICAgICBtX3VuZmluaXNoZWRTZWN0aW9ucy5wdXNoX2JhY2soIGVuZEluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwdXNoU2NvcGVkTWVzc2FnZSggTWVzc2FnZUluZm8gY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICBtX21lc3NhZ2VzLnB1c2hfYmFjayggbWVzc2FnZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgbV9tZXNzYWdlcy5lcmFzZSggc3RkOjpyZW1vdmUoIG1fbWVzc2FnZXMuYmVnaW4oKSwgbV9tZXNzYWdlcy5lbmQoKSwgbWVzc2FnZSApLCBtX21lc3NhZ2VzLmVuZCgpICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEN1cnJlbnRUZXN0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2FjdGl2ZVRlc3RDYXNlCisgICAgICAgICAgICAgICAgPyBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lCisgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBjb25zdCBBc3NlcnRpb25SZXN1bHQqIGdldExhc3RSZXN1bHQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gJm1fbGFzdFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBleGNlcHRpb25FYXJseVJlcG9ydGVkKCkgeworICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSB7CisgICAgICAgICAgICAvLyBEb24ndCByZWJ1aWxkIHRoZSByZXN1bHQgLS0gdGhlIHN0cmluZ2lmaWNhdGlvbiBpdHNlbGYgY2FuIGNhdXNlIG1vcmUgZmF0YWwgZXJyb3JzCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCBmYWtlIGEgcmVzdWx0IGRhdGEuCisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIHRlbXBSZXN1bHQ7CisgICAgICAgICAgICB0ZW1wUmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb247CisgICAgICAgICAgICB0ZW1wUmVzdWx0Lm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdChtX2xhc3RBc3NlcnRpb25JbmZvLCB0ZW1wUmVzdWx0KTsKKworICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLmFzc2VydGlvbkVuZGVkKHJlc3VsdCk7CisKKyAgICAgICAgICAgIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpOworCisgICAgICAgICAgICAvLyBSZWNyZWF0ZSBzZWN0aW9uIGZvciB0ZXN0IGNhc2UgKGFzIHdlIHdpbGwgbG9zZSB0aGUgb25lIHRoYXQgd2FzIGluIHNjb3BlKQorICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIHRlc3RDYXNlU2VjdGlvbiggdGVzdENhc2VJbmZvLmxpbmVJbmZvLCB0ZXN0Q2FzZUluZm8ubmFtZSwgdGVzdENhc2VJbmZvLmRlc2NyaXB0aW9uICk7CisKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICAgICAgYXNzZXJ0aW9ucy5mYWlsZWQgPSAxOworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHRlc3RDYXNlU2VjdGlvblN0YXRzKCB0ZXN0Q2FzZVNlY3Rpb24sIGFzc2VydGlvbnMsIDAsIGZhbHNlICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIHRlc3RDYXNlU2VjdGlvblN0YXRzICk7CisKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyB0ZXN0SW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworCisgICAgICAgICAgICBUb3RhbHMgZGVsdGFUb3RhbHM7CisgICAgICAgICAgICBkZWx0YVRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkID0gMTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMoICAgdGVzdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApICk7CisgICAgICAgICAgICBtX3RvdGFscy50ZXN0Q2FzZXMuZmFpbGVkKys7CisgICAgICAgICAgICB0ZXN0R3JvdXBFbmRlZCggc3RkOjpzdHJpbmcoKSwgbV90b3RhbHMsIDEsIDEgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzKCBtX3J1bkluZm8sIG1fdG90YWxzLCBmYWxzZSApICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gIVRCRCBXZSBuZWVkIHRvIGRvIHRoaXMgYW5vdGhlciB3YXkhCisgICAgICAgIGJvb2wgYWJvcnRpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgPT0gc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBtX2NvbmZpZy0+YWJvcnRBZnRlcigpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgdm9pZCBydW5DdXJyZW50VGVzdCggc3RkOjpzdHJpbmcmIHJlZGlyZWN0ZWRDb3V0LCBzdGQ6OnN0cmluZyYgcmVkaXJlY3RlZENlcnIgKSB7CisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyA9IG1fYWN0aXZlVGVzdENhc2UtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgU2VjdGlvbkluZm8gdGVzdENhc2VTZWN0aW9uKCB0ZXN0Q2FzZUluZm8ubGluZUluZm8sIHRlc3RDYXNlSW5mby5uYW1lLCB0ZXN0Q2FzZUluZm8uZGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25TdGFydGluZyggdGVzdENhc2VTZWN0aW9uICk7CisgICAgICAgICAgICBDb3VudHMgcHJldkFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zOworICAgICAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCA9IHRydWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8gPSBBc3NlcnRpb25JbmZvKCAiVEVTVF9DQVNFIiwgdGVzdENhc2VJbmZvLmxpbmVJbmZvLCBzdGQ6OnN0cmluZygpLCBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisKKyAgICAgICAgICAgICAgICBzZWVkUm5nKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIFRpbWVyIHRpbWVyOworICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgaWYoIG1fcmVwb3J0ZXItPmdldFByZWZlcmVuY2VzKCkuc2hvdWxkUmVkaXJlY3RTdGRPdXQgKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVJlZGlyZWN0IGNvdXRSZWRpciggQ2F0Y2g6OmNvdXQoKSwgcmVkaXJlY3RlZENvdXQgKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtUmVkaXJlY3QgY2VyclJlZGlyKCBDYXRjaDo6Y2VycigpLCByZWRpcmVjdGVkQ2VyciApOworICAgICAgICAgICAgICAgICAgICBpbnZva2VBY3RpdmVUZXN0Q2FzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0aW1lci5nZXRFbGFwc2VkU2Vjb25kcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIFRlc3RGYWlsdXJlRXhjZXB0aW9uJiApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGp1c3QgbWVhbnMgdGhlIHRlc3Qgd2FzIGFib3J0ZWQgZHVlIHRvIGZhaWx1cmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKC4uLikgeworICAgICAgICAgICAgICAgIC8vIFVuZGVyIENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUsIHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyB1bmRlciBSRVFVSVJFIGFzc2VydGlvbnMKKyAgICAgICAgICAgICAgICAvLyBhcmUgcmVwb3J0ZWQgd2l0aG91dCB0cmFuc2xhdGlvbiBhdCB0aGUgcG9pbnQgb2Ygb3JpZ2luLgorICAgICAgICAgICAgICAgIGlmIChtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFrZVVuZXhwZWN0ZWRSZXN1bHRCdWlsZGVyKCkudXNlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbV90ZXN0Q2FzZVRyYWNrZXItPmNsb3NlKCk7CisgICAgICAgICAgICBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgQ291bnRzIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zIC0gcHJldkFzc2VydGlvbnM7CisgICAgICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBhc3NlcnRpb25zICk7CisKKyAgICAgICAgICAgIGlmKCB0ZXN0Q2FzZUluZm8ub2tUb0ZhaWwoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN3YXAoIGFzc2VydGlvbnMuZmFpbGVkQnV0T2ssIGFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgLT0gYXNzZXJ0aW9ucy5mYWlsZWRCdXRPazsKKyAgICAgICAgICAgICAgICBtX3RvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICs9IGFzc2VydGlvbnMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyggdGVzdENhc2VTZWN0aW9uLCBhc3NlcnRpb25zLCBkdXJhdGlvbiwgbWlzc2luZ0Fzc2VydGlvbnMgKTsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnNlY3Rpb25FbmRlZCggdGVzdENhc2VTZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW52b2tlQWN0aXZlVGVzdENhc2UoKSB7CisgICAgICAgICAgICBGYXRhbENvbmRpdGlvbkhhbmRsZXIgZmF0YWxDb25kaXRpb25IYW5kbGVyOyAvLyBIYW5kbGUgc2lnbmFscworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZS0+aW52b2tlKCk7CisgICAgICAgICAgICBmYXRhbENvbmRpdGlvbkhhbmRsZXIucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBSZXN1bHRCdWlsZGVyIG1ha2VVbmV4cGVjdGVkUmVzdWx0QnVpbGRlcigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRCdWlsZGVyKCAgIG1fbGFzdEFzc2VydGlvbkluZm8ubWFjcm9OYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb24uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCkgeworICAgICAgICAgICAgLy8gSWYgc2VjdGlvbnMgZW5kZWQgcHJlbWF0dXJlbHkgZHVlIHRvIGFuIGV4Y2VwdGlvbiB3ZSBzdG9yZWQgdGhlaXIKKyAgICAgICAgICAgIC8vIGluZm9zIGhlcmUgc28gd2UgY2FuIHRlYXIgdGhlbSBkb3duIG91dHNpZGUgdGhlIHVud2luZCBwcm9jZXNzLgorICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxTZWN0aW9uRW5kSW5mbz46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgaXQgPSBtX3VuZmluaXNoZWRTZWN0aW9ucy5yYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV91bmZpbmlzaGVkU2VjdGlvbnMucmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgc2VjdGlvbkVuZGVkKCAqaXQgKTsKKyAgICAgICAgICAgIG1fdW5maW5pc2hlZFNlY3Rpb25zLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0UnVuSW5mbyBtX3J1bkluZm87CisgICAgICAgIElNdXRhYmxlQ29udGV4dCYgbV9jb250ZXh0OworICAgICAgICBUZXN0Q2FzZSBjb25zdCogbV9hY3RpdmVUZXN0Q2FzZTsKKyAgICAgICAgSVRyYWNrZXIqIG1fdGVzdENhc2VUcmFja2VyOworICAgICAgICBJVHJhY2tlciogbV9jdXJyZW50U2VjdGlvblRyYWNrZXI7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCBtX2xhc3RSZXN1bHQ7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBUb3RhbHMgbV90b3RhbHM7CisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IG1fcmVwb3J0ZXI7CisgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtX21lc3NhZ2VzOworICAgICAgICBBc3NlcnRpb25JbmZvIG1fbGFzdEFzc2VydGlvbkluZm87CisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb25FbmRJbmZvPiBtX3VuZmluaXNoZWRTZWN0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SVRyYWNrZXIqPiBtX2FjdGl2ZVNlY3Rpb25zOworICAgICAgICBUcmFja2VyQ29udGV4dCBtX3RyYWNrZXJDb250ZXh0OworICAgICAgICBib29sIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZDsKKyAgICB9OworCisgICAgSVJlc3VsdENhcHR1cmUmIGdldFJlc3VsdENhcHR1cmUoKSB7CisgICAgICAgIGlmKCBJUmVzdWx0Q2FwdHVyZSogY2FwdHVyZSA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UmVzdWx0Q2FwdHVyZSgpICkKKyAgICAgICAgICAgIHJldHVybiAqY2FwdHVyZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIk5vIHJlc3VsdCBjYXB0dXJlIGluc3RhbmNlIiApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF92ZXJzaW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1ZFUlNJT05fSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgLy8gVmVyc2lvbmluZyBpbmZvcm1hdGlvbgorICAgIHN0cnVjdCBWZXJzaW9uIHsKKyAgICAgICAgVmVyc2lvbiggICAgdW5zaWduZWQgaW50IF9tYWpvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfbWlub3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX3BhdGNoTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgX2JyYW5jaE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBfYnVpbGROdW1iZXIgKTsKKworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgbWFqb3JWZXJzaW9uOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgbWlub3JWZXJzaW9uOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgcGF0Y2hOdW1iZXI7CisKKyAgICAgICAgLy8gYnVpbGROdW1iZXIgaXMgb25seSB1c2VkIGlmIGJyYW5jaE5hbWUgaXMgbm90IG51bGwKKyAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGJyYW5jaE5hbWU7CisgICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBidWlsZE51bWJlcjsKKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFZlcnNpb24gY29uc3QmIHZlcnNpb24gKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBWZXJzaW9uIGNvbnN0JiApOworICAgIH07CisKKyAgICBpbmxpbmUgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbigpOworfQorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHM+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjcmVhdGVSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIHJlcG9ydGVyTmFtZSwgUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXIgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5jcmVhdGUoIHJlcG9ydGVyTmFtZSwgY29uZmlnLmdldCgpICk7CisgICAgICAgIGlmKCAhcmVwb3J0ZXIgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJObyByZXBvcnRlciByZWdpc3RlcmVkIHdpdGggbmFtZTogJyIgPDwgcmVwb3J0ZXJOYW1lIDw8ICInIjsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwb3J0ZXI7CisgICAgfQorCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gbWFrZVJlcG9ydGVyKCBQdHI8Q29uZmlnPiBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVwb3J0ZXJzID0gY29uZmlnLT5nZXRSZXBvcnRlck5hbWVzKCk7CisgICAgICAgIGlmKCByZXBvcnRlcnMuZW1wdHkoKSApCisgICAgICAgICAgICByZXBvcnRlcnMucHVzaF9iYWNrKCAiY29uc29sZSIgKTsKKworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlcjsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgcmVwb3J0ZXIgPSBhZGRSZXBvcnRlciggcmVwb3J0ZXIsIGNyZWF0ZVJlcG9ydGVyKCAqaXQsIGNvbmZpZyApICk7CisgICAgICAgIHJldHVybiByZXBvcnRlcjsKKyAgICB9CisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkTGlzdGVuZXJzKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZywgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXJzICkgeworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6TGlzdGVuZXJzIGxpc3RlbmVycyA9IGdldFJlZ2lzdHJ5SHViKCkuZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpLmdldExpc3RlbmVycygpOworICAgICAgICBmb3IoIElSZXBvcnRlclJlZ2lzdHJ5OjpMaXN0ZW5lcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGlzdGVuZXJzLmJlZ2luKCksIGl0RW5kID0gbGlzdGVuZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgcmVwb3J0ZXJzID0gYWRkUmVwb3J0ZXIocmVwb3J0ZXJzLCAoKml0KS0+Y3JlYXRlKCBSZXBvcnRlckNvbmZpZyggY29uZmlnICkgKSApOworICAgICAgICByZXR1cm4gcmVwb3J0ZXJzOworICAgIH0KKworICAgIFRvdGFscyBydW5UZXN0cyggUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gaWNvbmZpZyA9IGNvbmZpZy5nZXQoKTsKKworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXBvcnRlciA9IG1ha2VSZXBvcnRlciggY29uZmlnICk7CisgICAgICAgIHJlcG9ydGVyID0gYWRkTGlzdGVuZXJzKCBpY29uZmlnLCByZXBvcnRlciApOworCisgICAgICAgIFJ1bkNvbnRleHQgY29udGV4dCggaWNvbmZpZywgcmVwb3J0ZXIgKTsKKworICAgICAgICBUb3RhbHMgdG90YWxzOworCisgICAgICAgIGNvbnRleHQudGVzdEdyb3VwU3RhcnRpbmcoIGNvbmZpZy0+bmFtZSgpLCAxLCAxICk7CisKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWctPnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCAhdGVzdFNwZWMuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiflsuXSIgKS50ZXN0U3BlYygpOyAvLyBBbGwgbm90IGhpZGRlbiB0ZXN0cworCisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgYWxsVGVzdENhc2VzID0gZ2V0QWxsVGVzdENhc2VzU29ydGVkKCAqaWNvbmZpZyApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhbGxUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBhbGxUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIGlmKCAhY29udGV4dC5hYm9ydGluZygpICYmIG1hdGNoVGVzdCggKml0LCB0ZXN0U3BlYywgKmljb25maWcgKSApCisgICAgICAgICAgICAgICAgdG90YWxzICs9IGNvbnRleHQucnVuVGVzdCggKml0ICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVwb3J0ZXItPnNraXBUZXN0KCAqaXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQudGVzdEdyb3VwRW5kZWQoIGljb25maWctPm5hbWUoKSwgdG90YWxzLCAxLCAxICk7CisgICAgICAgIHJldHVybiB0b3RhbHM7CisgICAgfQorCisgICAgdm9pZCBhcHBseUZpbGVuYW1lc0FzVGFncyggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RzID0gZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBjb25maWcgKTsKKyAgICAgICAgZm9yKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdGVzdHMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBUZXN0Q2FzZSYgdGVzdCA9IGNvbnN0X2Nhc3Q8VGVzdENhc2UmPiggdGVzdHNbaV0gKTsKKyAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0YWdzID0gdGVzdC50YWdzOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IHRlc3QubGluZUluZm8uZmlsZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdFNsYXNoID0gZmlsZW5hbWUuZmluZF9sYXN0X29mKCAiXFwvIiApOworICAgICAgICAgICAgaWYoIGxhc3RTbGFzaCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoIGxhc3RTbGFzaCsxICk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgbGFzdERvdCA9IGZpbGVuYW1lLmZpbmRfbGFzdF9vZiggIi4iICk7CisgICAgICAgICAgICBpZiggbGFzdERvdCAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHIoIDAsIGxhc3REb3QgKTsKKworICAgICAgICAgICAgdGFncy5pbnNlcnQoICIjIiArIGZpbGVuYW1lICk7CisgICAgICAgICAgICBzZXRUYWdzKCB0ZXN0LCB0YWdzICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBTZXNzaW9uIDogTm9uQ29weWFibGUgeworICAgICAgICBzdGF0aWMgYm9vbCBhbHJlYWR5SW5zdGFudGlhdGVkOworCisgICAgcHVibGljOgorCisgICAgICAgIHN0cnVjdCBPblVudXNlZE9wdGlvbnMgeyBlbnVtIERvV2hhdCB7IElnbm9yZSwgRmFpbCB9OyB9OworCisgICAgICAgIFNlc3Npb24oKQorICAgICAgICA6IG1fY2xpKCBtYWtlQ29tbWFuZExpbmVQYXJzZXIoKSApIHsKKyAgICAgICAgICAgIGlmKCBhbHJlYWR5SW5zdGFudGlhdGVkICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1zZyA9ICJPbmx5IG9uZSBpbnN0YW5jZSBvZiBDYXRjaDo6U2Vzc2lvbiBjYW4gZXZlciBiZSB1c2VkIjsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8IG1zZyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggbXNnICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhbHJlYWR5SW5zdGFudGlhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB+U2Vzc2lvbigpIHsKKyAgICAgICAgICAgIENhdGNoOjpjbGVhblVwKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNob3dIZWxwKCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY2Vzc05hbWUgKSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJcbkNhdGNoIHYiIDw8IGxpYnJhcnlWZXJzaW9uKCkgPDwgIlxuIjsKKworICAgICAgICAgICAgbV9jbGkudXNhZ2UoIENhdGNoOjpjb3V0KCksIHByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICJGb3IgbW9yZSBkZXRhaWwgdXNhZ2UgcGxlYXNlIHNlZSB0aGUgcHJvamVjdCBkb2NzXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBhcHBseUNvbW1hbmRMaW5lKCBpbnQgYXJnYywgY2hhciBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YsIE9uVW51c2VkT3B0aW9uczo6RG9XaGF0IHVudXNlZE9wdGlvbkJlaGF2aW91ciA9IE9uVW51c2VkT3B0aW9uczo6RmFpbCApIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbV9jbGkuc2V0VGhyb3dPblVucmVjb2duaXNlZFRva2VucyggdW51c2VkT3B0aW9uQmVoYXZpb3VyID09IE9uVW51c2VkT3B0aW9uczo6RmFpbCApOworICAgICAgICAgICAgICAgIG1fdW51c2VkVG9rZW5zID0gbV9jbGkucGFyc2VJbnRvKCBDbGFyYTo6YXJnc1RvVmVjdG9yKCBhcmdjLCBhcmd2ICksIG1fY29uZmlnRGF0YSApOworICAgICAgICAgICAgICAgIGlmKCBtX2NvbmZpZ0RhdGEuc2hvd0hlbHAgKQorICAgICAgICAgICAgICAgICAgICBzaG93SGVscCggbV9jb25maWdEYXRhLnByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICAgICAgbV9jb25maWcucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6UmVkICk7CisgICAgICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbkVycm9yKHMpIGluIGlucHV0OlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgVGV4dCggZXgud2hhdCgpLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG5cbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fY2xpLnVzYWdlKCBDYXRjaDo6Y291dCgpLCBtX2NvbmZpZ0RhdGEucHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVzZUNvbmZpZ0RhdGEoIENvbmZpZ0RhdGEgY29uc3QmIF9jb25maWdEYXRhICkgeworICAgICAgICAgICAgbV9jb25maWdEYXRhID0gX2NvbmZpZ0RhdGE7CisgICAgICAgICAgICBtX2NvbmZpZy5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJ1biggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworCisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IGFwcGx5Q29tbWFuZExpbmUoIGFyZ2MsIGFyZ3YgKTsKKyAgICAgICAgICAgIGlmKCByZXR1cm5Db2RlID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybkNvZGUgPSBydW4oKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisKKyAgICAjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChVTklDT0RFKQorICAgICAgICBpbnQgcnVuKCBpbnQgYXJnYywgd2NoYXJfdCBjb25zdCogY29uc3QqIGNvbnN0IGFyZ3YgKSB7CisKKyAgICAgICAgICAgIGNoYXIgKip1dGY4QXJndiA9IG5ldyBjaGFyICpbIGFyZ2MgXTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpICkgeworICAgICAgICAgICAgICAgIGludCBidWZTaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfVVRGOCwgMCwgYXJndltpXSwgLTEsIE5VTEwsIDAsIE5VTEwsIE5VTEwgKTsKKworICAgICAgICAgICAgICAgIHV0ZjhBcmd2WyBpIF0gPSBuZXcgY2hhclsgYnVmU2l6ZSBdOworCisgICAgICAgICAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSggQ1BfVVRGOCwgMCwgYXJndltpXSwgLTEsIHV0ZjhBcmd2W2ldLCBidWZTaXplLCBOVUxMLCBOVUxMICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gYXBwbHlDb21tYW5kTGluZSggYXJnYywgdXRmOEFyZ3YgKTsKKyAgICAgICAgICAgIGlmKCByZXR1cm5Db2RlID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybkNvZGUgPSBydW4oKTsKKworICAgICAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgYXJnYzsgKytpICkKKyAgICAgICAgICAgICAgICBkZWxldGUgW10gdXRmOEFyZ3ZbIGkgXTsKKworICAgICAgICAgICAgZGVsZXRlIFtdIHV0ZjhBcmd2OworCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgICNlbmRpZgorCisgICAgICAgIGludCBydW4oKSB7CisgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLnNob3dIZWxwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnKCk7IC8vIEZvcmNlIGNvbmZpZyB0byBiZSBjb25zdHJ1Y3RlZAorCisgICAgICAgICAgICAgICAgc2VlZFJuZyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLmZpbGVuYW1lc0FzVGFncyApCisgICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsZW5hbWVzQXNUYWdzKCAqbV9jb25maWcgKTsKKworICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBsaXN0IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBpZiggT3B0aW9uPHN0ZDo6c2l6ZV90PiBsaXN0ZWQgPSBsaXN0KCBjb25maWcoKSApICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oICpsaXN0ZWQgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCBydW5UZXN0cyggbV9jb25maWcgKS5hc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHN0ZDo6ZXhjZXB0aW9uJiBleCApIHsKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpIDw8IGV4LndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBjb25zdCYgY2xpKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2xpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPENsYXJhOjpQYXJzZXI6OlRva2VuPiBjb25zdCYgdW51c2VkVG9rZW5zKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fdW51c2VkVG9rZW5zOworICAgICAgICB9CisgICAgICAgIENvbmZpZ0RhdGEmIGNvbmZpZ0RhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWdEYXRhOworICAgICAgICB9CisgICAgICAgIENvbmZpZyYgY29uZmlnKCkgeworICAgICAgICAgICAgaWYoICFtX2NvbmZpZyApCisgICAgICAgICAgICAgICAgbV9jb25maWcgPSBuZXcgQ29uZmlnKCBtX2NvbmZpZ0RhdGEgKTsKKyAgICAgICAgICAgIHJldHVybiAqbV9jb25maWc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gbV9jbGk7CisgICAgICAgIHN0ZDo6dmVjdG9yPENsYXJhOjpQYXJzZXI6OlRva2VuPiBtX3VudXNlZFRva2VuczsKKyAgICAgICAgQ29uZmlnRGF0YSBtX2NvbmZpZ0RhdGE7CisgICAgICAgIFB0cjxDb25maWc+IG1fY29uZmlnOworICAgIH07CisKKyAgICBib29sIFNlc3Npb246OmFscmVhZHlJbnN0YW50aWF0ZWQgPSBmYWxzZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZWdpc3RyeV9odWIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRUdJU1RSWV9IVUJfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfcmVnaXN0cnlfaW1wbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9SRUdJU1RSWV9JTVBMX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBSYW5kb21OdW1iZXJHZW5lcmF0b3IgeworICAgICAgICB0eXBlZGVmIHN0ZDo6cHRyZGlmZl90IHJlc3VsdF90eXBlOworCisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoIHJlc3VsdF90eXBlIG4gKSBjb25zdCB7IHJldHVybiBzdGQ6OnJhbmQoKSAlIG47IH0KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gMDsgfQorICAgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1heCgpIHsgcmV0dXJuIDEwMDAwMDA7IH0KKyAgICAgICAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cmFuZCgpICUgbWF4KCk7IH0KKyNlbmRpZgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWPgorICAgICAgICBzdGF0aWMgdm9pZCBzaHVmZmxlKCBWJiB2ZWN0b3IgKSB7CisgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3Igcm5nOworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFCisgICAgICAgICAgICBzdGQ6OnNodWZmbGUoIHZlY3Rvci5iZWdpbigpLCB2ZWN0b3IuZW5kKCksIHJuZyApOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6cmFuZG9tX3NodWZmbGUoIHZlY3Rvci5iZWdpbigpLCB2ZWN0b3IuZW5kKCksIHJuZyApOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBzb3J0VGVzdHMoIElDb25maWcgY29uc3QmIGNvbmZpZywgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB1bnNvcnRlZFRlc3RDYXNlcyApIHsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gc29ydGVkID0gdW5zb3J0ZWRUZXN0Q2FzZXM7CisKKyAgICAgICAgc3dpdGNoKCBjb25maWcucnVuT3JkZXIoKSApIHsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluTGV4aWNvZ3JhcGhpY2FsT3JkZXI6CisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KCBzb3J0ZWQuYmVnaW4oKSwgc29ydGVkLmVuZCgpICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJblJhbmRvbU9yZGVyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VlZFJuZyggY29uZmlnICk7CisgICAgICAgICAgICAgICAgICAgIFJhbmRvbU51bWJlckdlbmVyYXRvcjo6c2h1ZmZsZSggc29ydGVkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyOgorICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgaW4gZGVjbGFyYXRpb24gb3JkZXIKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc29ydGVkOworICAgIH0KKyAgICBib29sIG1hdGNoVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgcmV0dXJuIHRlc3RTcGVjLm1hdGNoZXMoIHRlc3RDYXNlICkgJiYgKCBjb25maWcuYWxsb3dUaHJvd3MoKSB8fCAhdGVzdENhc2UudGhyb3dzKCkgKTsKKyAgICB9CisKKyAgICB2b2lkIGVuZm9yY2VOb0R1cGxpY2F0ZVRlc3RDYXNlcyggc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBmdW5jdGlvbnMgKSB7CisgICAgICAgIHN0ZDo6c2V0PFRlc3RDYXNlPiBzZWVuRnVuY3Rpb25zOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmdW5jdGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBmdW5jdGlvbnMuZW5kKCk7CisgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBzdGQ6OnBhaXI8c3RkOjpzZXQ8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciwgYm9vbD4gcHJldiA9IHNlZW5GdW5jdGlvbnMuaW5zZXJ0KCAqaXQgKTsKKyAgICAgICAgICAgIGlmKCAhcHJldi5zZWNvbmQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworCisgICAgICAgICAgICAgICAgc3MgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IFRFU1RfQ0FTRSggXCIiIDw8IGl0LT5uYW1lIDw8ICJcIiApIGFscmVhZHkgZGVmaW5lZC5cbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlx0Rmlyc3Qgc2VlbiBhdCAiIDw8IHByZXYuZmlyc3QtPmdldFRlc3RDYXNlSW5mbygpLmxpbmVJbmZvIDw8ICdcbicKKyAgICAgICAgICAgICAgICAgICAgPDwgIlx0UmVkZWZpbmVkIGF0ICIgPDwgaXQtPmdldFRlc3RDYXNlSW5mbygpLmxpbmVJbmZvIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzcy5zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyVGVzdHMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdENhc2VzLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlcmVkOworICAgICAgICBmaWx0ZXJlZC5yZXNlcnZlKCB0ZXN0Q2FzZXMuc2l6ZSgpICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IHRlc3RDYXNlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIGlmKCBtYXRjaFRlc3QoICppdCwgdGVzdFNwZWMsIGNvbmZpZyApICkKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5wdXNoX2JhY2soICppdCApOworICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHJldHVybiBnZXRSZWdpc3RyeUh1YigpLmdldFRlc3RDYXNlUmVnaXN0cnkoKS5nZXRBbGxUZXN0c1NvcnRlZCggY29uZmlnICk7CisgICAgfQorCisgICAgY2xhc3MgVGVzdFJlZ2lzdHJ5IDogcHVibGljIElUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRlc3RSZWdpc3RyeSgpCisgICAgICAgIDogICBtX2N1cnJlbnRTb3J0T3JkZXIoIFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXIgKSwKKyAgICAgICAgICAgIG1fdW5uYW1lZENvdW50KCAwICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdFJlZ2lzdHJ5KCk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RDYXNlICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHRlc3RDYXNlLmdldFRlc3RDYXNlSW5mbygpLm5hbWU7CisgICAgICAgICAgICBpZiggbmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgb3NzIDw8ICJBbm9ueW1vdXMgdGVzdCBjYXNlICIgPDwgKyttX3VubmFtZWRDb3VudDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0ZXJUZXN0KCB0ZXN0Q2FzZS53aXRoTmFtZSggb3NzLnN0cigpICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZnVuY3Rpb25zLnB1c2hfYmFjayggdGVzdENhc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiBnZXRBbGxUZXN0cygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Z1bmN0aW9uczsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBlbmZvcmNlTm9EdXBsaWNhdGVUZXN0Q2FzZXMoIG1fZnVuY3Rpb25zICk7CisKKyAgICAgICAgICAgIGlmKCAgbV9jdXJyZW50U29ydE9yZGVyICE9IGNvbmZpZy5ydW5PcmRlcigpIHx8IG1fc29ydGVkRnVuY3Rpb25zLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgbV9zb3J0ZWRGdW5jdGlvbnMgPSBzb3J0VGVzdHMoIGNvbmZpZywgbV9mdW5jdGlvbnMgKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRTb3J0T3JkZXIgPSBjb25maWcucnVuT3JkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtX3NvcnRlZEZ1bmN0aW9uczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1fZnVuY3Rpb25zOworICAgICAgICBtdXRhYmxlIFJ1blRlc3RzOjpJbldoYXRPcmRlciBtX2N1cnJlbnRTb3J0T3JkZXI7CisgICAgICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IG1fc29ydGVkRnVuY3Rpb25zOworICAgICAgICBzaXplX3QgbV91bm5hbWVkQ291bnQ7CisgICAgICAgIHN0ZDo6aW9zX2Jhc2U6OkluaXQgbV9vc3RyZWFtSW5pdDsgLy8gRm9yY2VzIGNvdXQvIGNlcnIgdG8gYmUgaW5pdGlhbGlzZWQKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBGcmVlRnVuY3Rpb25UZXN0Q2FzZSA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworICAgIHB1YmxpYzoKKworICAgICAgICBGcmVlRnVuY3Rpb25UZXN0Q2FzZSggVGVzdEZ1bmN0aW9uIGZ1biApIDogbV9mdW4oIGZ1biApIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGludm9rZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIG1fZnVuKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHZpcnR1YWwgfkZyZWVGdW5jdGlvblRlc3RDYXNlKCk7CisKKyAgICAgICAgVGVzdEZ1bmN0aW9uIG1fZnVuOworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZXh0cmFjdENsYXNzTmFtZSggc3RkOjpzdHJpbmcgY29uc3QmIGNsYXNzT3JRdWFsaWZpZWRNZXRob2ROYW1lICkgeworICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWUgPSBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZTsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIGNsYXNzTmFtZSwgJyYnICkgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBsYXN0Q29sb25zID0gY2xhc3NOYW1lLnJmaW5kKCAiOjoiICk7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBwZW51bHRpbWF0ZUNvbG9ucyA9IGNsYXNzTmFtZS5yZmluZCggIjo6IiwgbGFzdENvbG9ucy0xICk7CisgICAgICAgICAgICBpZiggcGVudWx0aW1hdGVDb2xvbnMgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHBlbnVsdGltYXRlQ29sb25zID0gMTsKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHIoIHBlbnVsdGltYXRlQ29sb25zLCBsYXN0Q29sb25zLXBlbnVsdGltYXRlQ29sb25zICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICB2b2lkIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAgICAgKCAgIElUZXN0Q2FzZSogdGVzdENhc2UsCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRlc3QKKyAgICAgICAgICAgICggbWFrZVRlc3RDYXNlCisgICAgICAgICAgICAgICAgKCAgIHRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICBleHRyYWN0Q2xhc3NOYW1lKCBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSApLAorICAgICAgICAgICAgICAgICAgICBuYW1lQW5kRGVzYy5uYW1lLAorICAgICAgICAgICAgICAgICAgICBuYW1lQW5kRGVzYy5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbGluZUluZm8gKSApOworICAgIH0KKyAgICB2b2lkIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbgorICAgICAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvLAorICAgICAgICAgICAgTmFtZUFuZERlc2MgY29uc3QmIG5hbWVBbmREZXNjICkgeworICAgICAgICByZWdpc3RlclRlc3RDYXNlKCBuZXcgRnJlZUZ1bmN0aW9uVGVzdENhc2UoIGZ1bmN0aW9uICksICIiLCBuYW1lQW5kRGVzYywgbGluZUluZm8gKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEF1dG9SZWc6OkF1dG9SZWcKKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZUZ1bmN0aW9uKCBmdW5jdGlvbiwgbGluZUluZm8sIG5hbWVBbmREZXNjICk7CisgICAgfQorCisgICAgQXV0b1JlZzo6fkF1dG9SZWcoKSB7fQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlcG9ydGVyX3JlZ2lzdHJ5LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBSZXBvcnRlclJlZ2lzdHJ5IDogcHVibGljIElSZXBvcnRlclJlZ2lzdHJ5IHsKKworICAgIHB1YmxpYzoKKworICAgICAgICB2aXJ0dWFsIH5SZXBvcnRlclJlZ2lzdHJ5KCkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBGYWN0b3J5TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9ICBtX2ZhY3Rvcmllcy5maW5kKCBuYW1lICk7CisgICAgICAgICAgICBpZiggaXQgPT0gbV9mYWN0b3JpZXMuZW5kKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBDQVRDSF9OVUxMOworICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQtPmNyZWF0ZSggUmVwb3J0ZXJDb25maWcoIGNvbmZpZyApICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSB7CisgICAgICAgICAgICBtX2ZhY3Rvcmllcy5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBuYW1lLCBmYWN0b3J5ICkgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIHsKKyAgICAgICAgICAgIG1fbGlzdGVuZXJzLnB1c2hfYmFjayggZmFjdG9yeSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBGYWN0b3J5TWFwIGNvbnN0JiBnZXRGYWN0b3JpZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9mYWN0b3JpZXM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBMaXN0ZW5lcnMgY29uc3QmIGdldExpc3RlbmVycygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX2xpc3RlbmVyczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRmFjdG9yeU1hcCBtX2ZhY3RvcmllczsKKyAgICAgICAgTGlzdGVuZXJzIG1fbGlzdGVuZXJzOworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9leGNlcHRpb25fdHJhbnNsYXRvcl9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0VYQ0VQVElPTl9UUkFOU0xBVE9SX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19PQkpDX18KKyNpbXBvcnQgIkZvdW5kYXRpb24vRm91bmRhdGlvbi5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICB+RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsKCBtX3RyYW5zbGF0b3JzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApIHsKKyAgICAgICAgICAgIG1fdHJhbnNsYXRvcnMucHVzaF9iYWNrKCB0cmFuc2xhdG9yICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHRyeSB7CisjaWZkZWYgX19PQkpDX18KKyAgICAgICAgICAgICAgICAvLyBJbiBPYmplY3RpdmUtQyB0cnkgb2JqZWN0aXZlLWMgZXhjZXB0aW9ucyBmaXJzdAorICAgICAgICAgICAgICAgIEB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VHJhbnNsYXRvcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIFtleGNlcHRpb24gZGVzY3JpcHRpb25dICk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ5VHJhbnNsYXRvcnMoKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIFRlc3RGYWlsdXJlRXhjZXB0aW9uJiApIHsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4LndoYXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OnN0cmluZyYgbXNnICkgeworICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggY29uc3QgY2hhciogbXNnICkgeworICAgICAgICAgICAgICAgIHJldHVybiBtc2c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCguLi4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24gZXhjZXB0aW9uIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIHRyeVRyYW5zbGF0b3JzKCkgY29uc3QgeworICAgICAgICAgICAgaWYoIG1fdHJhbnNsYXRvcnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG1fdHJhbnNsYXRvcnNbMF0tPnRyYW5zbGF0ZSggbV90cmFuc2xhdG9ycy5iZWdpbigpKzEsIG1fdHJhbnNsYXRvcnMuZW5kKCkgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqPiBtX3RyYW5zbGF0b3JzOworICAgIH07Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXNfcmVnaXN0cnkuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEFHX0FMSUFTX1JFR0lTVFJZX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIFRhZ0FsaWFzUmVnaXN0cnkgOiBwdWJsaWMgSVRhZ0FsaWFzUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+VGFnQWxpYXNSZWdpc3RyeSgpOworICAgICAgICB2aXJ0dWFsIE9wdGlvbjxUYWdBbGlhcz4gZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0OworICAgICAgICB2b2lkIGFkZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUYWdBbGlhcz4gbV9yZWdpc3RyeTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisKKyAgICAgICAgY2xhc3MgUmVnaXN0cnlIdWIgOiBwdWJsaWMgSVJlZ2lzdHJ5SHViLCBwdWJsaWMgSU11dGFibGVSZWdpc3RyeUh1YiB7CisKKyAgICAgICAgICAgIFJlZ2lzdHJ5SHViKCBSZWdpc3RyeUh1YiBjb25zdCYgKTsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBSZWdpc3RyeUh1YiBjb25zdCYgKTsKKworICAgICAgICBwdWJsaWM6IC8vIElSZWdpc3RyeUh1YgorICAgICAgICAgICAgUmVnaXN0cnlIdWIoKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElSZXBvcnRlclJlZ2lzdHJ5IGNvbnN0JiBnZXRSZXBvcnRlclJlZ2lzdHJ5KCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElUZXN0Q2FzZVJlZ2lzdHJ5IGNvbnN0JiBnZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3Rlc3RDYXNlUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkmIGdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBnZXRUYWdBbGlhc1JlZ2lzdHJ5KCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBtX3RhZ0FsaWFzUmVnaXN0cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHVibGljOiAvLyBJTXV0YWJsZVJlZ2lzdHJ5SHViCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSZXBvcnRlciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3JlcG9ydGVyUmVnaXN0cnkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgZmFjdG9yeSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyTGlzdGVuZXIoIFB0cjxJUmVwb3J0ZXJGYWN0b3J5PiBjb25zdCYgZmFjdG9yeSApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3JlcG9ydGVyUmVnaXN0cnkucmVnaXN0ZXJMaXN0ZW5lciggZmFjdG9yeSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVGVzdCggVGVzdENhc2UgY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIG1fdGVzdENhc2VSZWdpc3RyeS5yZWdpc3RlclRlc3QoIHRlc3RJbmZvICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUcmFuc2xhdG9yKCBjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvciogdHJhbnNsYXRvciApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX2V4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeS5yZWdpc3RlclRyYW5zbGF0b3IoIHRyYW5zbGF0b3IgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRhZ0FsaWFzKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3RhZ0FsaWFzUmVnaXN0cnkuYWRkKCBhbGlhcywgdGFnLCBsaW5lSW5mbyApOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBUZXN0UmVnaXN0cnkgbV90ZXN0Q2FzZVJlZ2lzdHJ5OworICAgICAgICAgICAgUmVwb3J0ZXJSZWdpc3RyeSBtX3JlcG9ydGVyUmVnaXN0cnk7CisgICAgICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgICAgICAgICBUYWdBbGlhc1JlZ2lzdHJ5IG1fdGFnQWxpYXNSZWdpc3RyeTsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBTaW5nbGUsIGdsb2JhbCwgaW5zdGFuY2UKKyAgICAgICAgaW5saW5lIFJlZ2lzdHJ5SHViKiYgZ2V0VGhlUmVnaXN0cnlIdWIoKSB7CisgICAgICAgICAgICBzdGF0aWMgUmVnaXN0cnlIdWIqIHRoZVJlZ2lzdHJ5SHViID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIGlmKCAhdGhlUmVnaXN0cnlIdWIgKQorICAgICAgICAgICAgICAgIHRoZVJlZ2lzdHJ5SHViID0gbmV3IFJlZ2lzdHJ5SHViKCk7CisgICAgICAgICAgICByZXR1cm4gdGhlUmVnaXN0cnlIdWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJUmVnaXN0cnlIdWImIGdldFJlZ2lzdHJ5SHViKCkgeworICAgICAgICByZXR1cm4gKmdldFRoZVJlZ2lzdHJ5SHViKCk7CisgICAgfQorICAgIElNdXRhYmxlUmVnaXN0cnlIdWImIGdldE11dGFibGVSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgcmV0dXJuICpnZXRUaGVSZWdpc3RyeUh1YigpOworICAgIH0KKyAgICB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgIGRlbGV0ZSBnZXRUaGVSZWdpc3RyeUh1YigpOworICAgICAgICBnZXRUaGVSZWdpc3RyeUh1YigpID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgY2xlYW5VcENvbnRleHQoKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKS50cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbm90aW1wbGVtZW50ZWRfZXhjZXB0aW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTk9USU1QTEVNRU5URURfRVhDRVBUSU9OX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uOjpOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkKKyAgICA6ICAgbV9saW5lSW5mbyggbGluZUluZm8gKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCBsaW5lSW5mbyA8PCAiOiBmdW5jdGlvbiAiOworICAgICAgICBvc3MgPDwgIm5vdCBpbXBsZW1lbnRlZCI7CisgICAgICAgIG1fd2hhdCA9IG9zcy5zdHIoKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyKiBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IENBVENIX05PRVhDRVBUIHsKKyAgICAgICAgcmV0dXJuIG1fd2hhdC5jX3N0cigpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb250ZXh0X2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05URVhUX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9zdHJlYW0uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgV3JpdGVyRiwgc2l6ZV90IGJ1ZmZlclNpemU9MjU2PgorICAgIGNsYXNzIFN0cmVhbUJ1ZkltcGwgOiBwdWJsaWMgU3RyZWFtQnVmQmFzZSB7CisgICAgICAgIGNoYXIgZGF0YVtidWZmZXJTaXplXTsKKyAgICAgICAgV3JpdGVyRiBtX3dyaXRlcjsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RyZWFtQnVmSW1wbCgpIHsKKyAgICAgICAgICAgIHNldHAoIGRhdGEsIGRhdGEgKyBzaXplb2YoZGF0YSkgKTsKKyAgICAgICAgfQorCisgICAgICAgIH5TdHJlYW1CdWZJbXBsKCkgQ0FUQ0hfTk9FWENFUFQgeworICAgICAgICAgICAgc3luYygpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgb3ZlcmZsb3coIGludCBjICkgeworICAgICAgICAgICAgc3luYygpOworCisgICAgICAgICAgICBpZiggYyAhPSBFT0YgKSB7CisgICAgICAgICAgICAgICAgaWYoIHBiYXNlKCkgPT0gZXBwdHIoKSApCisgICAgICAgICAgICAgICAgICAgIG1fd3JpdGVyKCBzdGQ6OnN0cmluZyggMSwgc3RhdGljX2Nhc3Q8Y2hhcj4oIGMgKSApICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcHV0Yyggc3RhdGljX2Nhc3Q8Y2hhcj4oIGMgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgc3luYygpIHsKKyAgICAgICAgICAgIGlmKCBwYmFzZSgpICE9IHBwdHIoKSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlciggc3RkOjpzdHJpbmcoIHBiYXNlKCksIHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nOjpzaXplX3R5cGU+KCBwcHRyKCkgLSBwYmFzZSgpICkgKSApOworICAgICAgICAgICAgICAgIHNldHAoIHBiYXNlKCksIGVwcHRyKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgRmlsZVN0cmVhbTo6RmlsZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVuYW1lICkgeworICAgICAgICBtX29mcy5vcGVuKCBmaWxlbmFtZS5jX3N0cigpICk7CisgICAgICAgIGlmKCBtX29mcy5mYWlsKCkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJVbmFibGUgdG8gb3BlbiBmaWxlOiAnIiA8PCBmaWxlbmFtZSA8PCAnXCcnOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpvc3RyZWFtJiBGaWxlU3RyZWFtOjpzdHJlYW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX29mczsKKyAgICB9CisKKyAgICBzdHJ1Y3QgT3V0cHV0RGVidWdXcml0ZXIgeworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKSggc3RkOjpzdHJpbmcgY29uc3Qmc3RyICkgeworICAgICAgICAgICAgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RyICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgRGVidWdPdXRTdHJlYW06OkRlYnVnT3V0U3RyZWFtKCkKKyAgICA6ICAgbV9zdHJlYW1CdWYoIG5ldyBTdHJlYW1CdWZJbXBsPE91dHB1dERlYnVnV3JpdGVyPigpICksCisgICAgICAgIG1fb3MoIG1fc3RyZWFtQnVmLmdldCgpICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBEZWJ1Z091dFN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vczsKKyAgICB9CisKKyAgICAvLyBTdG9yZSB0aGUgc3RyZWFtYnVmIGZyb20gY291dCB1cC1mcm9udCBiZWNhdXNlCisgICAgLy8gY291dCBtYXkgZ2V0IHJlZGlyZWN0ZWQgd2hlbiBydW5uaW5nIHRlc3RzCisgICAgQ291dFN0cmVhbTo6Q291dFN0cmVhbSgpCisgICAgOiAgIG1fb3MoIENhdGNoOjpjb3V0KCkucmRidWYoKSApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgQ291dFN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vczsKKyAgICB9CisKKyNpZm5kZWYgQ0FUQ0hfQ09ORklHX05PU1RET1VUIC8vIElmIHlvdSAjZGVmaW5lIHRoaXMgeW91IG11c3QgaW1wbGVtZW50IHRoZXNlIGZ1bmN0aW9ucworICAgIHN0ZDo6b3N0cmVhbSYgY291dCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y291dDsKKyAgICB9CisgICAgc3RkOjpvc3RyZWFtJiBjZXJyKCkgeworICAgICAgICByZXR1cm4gc3RkOjpjZXJyOworICAgIH0KKyNlbmRpZgorfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgQ29udGV4dCA6IHB1YmxpYyBJTXV0YWJsZUNvbnRleHQgeworCisgICAgICAgIENvbnRleHQoKSA6IG1fY29uZmlnKCBDQVRDSF9OVUxMICksIG1fcnVubmVyKCBDQVRDSF9OVUxMICksIG1fcmVzdWx0Q2FwdHVyZSggQ0FUQ0hfTlVMTCApIHt9CisgICAgICAgIENvbnRleHQoIENvbnRleHQgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBDb250ZXh0IGNvbnN0JiApOworCisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5Db250ZXh0KCkgeworICAgICAgICAgICAgZGVsZXRlQWxsVmFsdWVzKCBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gSUNvbnRleHQKKyAgICAgICAgdmlydHVhbCBJUmVzdWx0Q2FwdHVyZSogZ2V0UmVzdWx0Q2FwdHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtX3Jlc3VsdENhcHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBJUnVubmVyKiBnZXRSdW5uZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5uZXI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzaXplX3QgZ2V0R2VuZXJhdG9ySW5kZXgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc2l6ZV90IHRvdGFsU2l6ZSApIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKQorICAgICAgICAgICAgLmdldEdlbmVyYXRvckluZm8oIGZpbGVJbmZvLCB0b3RhbFNpemUgKQorICAgICAgICAgICAgLmdldEN1cnJlbnRJbmRleCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBhZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBnZW5lcmF0b3JzID0gZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpOworICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnMgJiYgZ2VuZXJhdG9ycy0+bW92ZU5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUHRyPElDb25maWcgY29uc3Q+IGdldENvbmZpZygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NvbmZpZzsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBJTXV0YWJsZUNvbnRleHQKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJlc3VsdENhcHR1cmUoIElSZXN1bHRDYXB0dXJlKiByZXN1bHRDYXB0dXJlICkgeworICAgICAgICAgICAgbV9yZXN1bHRDYXB0dXJlID0gcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UnVubmVyKCBJUnVubmVyKiBydW5uZXIgKSB7CisgICAgICAgICAgICBtX3J1bm5lciA9IHJ1bm5lcjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgICAgIG1fY29uZmlnID0gY29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIElNdXRhYmxlQ29udGV4dCYgZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0ZXN0TmFtZSA9IGdldFJlc3VsdENhcHR1cmUoKS0+Z2V0Q3VycmVudFRlc3ROYW1lKCk7CisKKyAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9yc0ZvclRlc3QqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuZmluZCggdGVzdE5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBpdCAhPSBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmVuZCgpCisgICAgICAgICAgICAgICAgPyBpdC0+c2Vjb25kCisgICAgICAgICAgICAgICAgOiBDQVRDSF9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0JiBnZXRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKSB7CisgICAgICAgICAgICBJR2VuZXJhdG9yc0ZvclRlc3QqIGdlbmVyYXRvcnMgPSBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCk7CisgICAgICAgICAgICBpZiggIWdlbmVyYXRvcnMgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdE5hbWUgPSBnZXRSZXN1bHRDYXB0dXJlKCktPmdldEN1cnJlbnRUZXN0TmFtZSgpOworICAgICAgICAgICAgICAgIGdlbmVyYXRvcnMgPSBjcmVhdGVHZW5lcmF0b3JzRm9yVGVzdCgpOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWUuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggdGVzdE5hbWUsIGdlbmVyYXRvcnMgKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICpnZW5lcmF0b3JzOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIElSdW5uZXIqIG1fcnVubmVyOworICAgICAgICBJUmVzdWx0Q2FwdHVyZSogbV9yZXN1bHRDYXB0dXJlOworICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvcnNGb3JUZXN0Kj4gbV9nZW5lcmF0b3JzQnlUZXN0TmFtZTsKKyAgICB9OworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgQ29udGV4dCogY3VycmVudENvbnRleHQgPSBDQVRDSF9OVUxMOworICAgIH0KKyAgICBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpIHsKKyAgICAgICAgaWYoICFjdXJyZW50Q29udGV4dCApCisgICAgICAgICAgICBjdXJyZW50Q29udGV4dCA9IG5ldyBDb250ZXh0KCk7CisgICAgICAgIHJldHVybiAqY3VycmVudENvbnRleHQ7CisgICAgfQorICAgIElDb250ZXh0JiBnZXRDdXJyZW50Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworICAgIH0KKworICAgIHZvaWQgY2xlYW5VcENvbnRleHQoKSB7CisgICAgICAgIGRlbGV0ZSBjdXJyZW50Q29udGV4dDsKKyAgICAgICAgY3VycmVudENvbnRleHQgPSBDQVRDSF9OVUxMOworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbnNvbGVfY29sb3VyX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05TT0xFX0NPTE9VUl9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXJybm9fZ3VhcmQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FUlJOT19HVUFSRF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNlcnJubz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIEVycm5vR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgRXJybm9HdWFyZCgpOm1fb2xkRXJybm8oZXJybm8pe30KKyAgICAgICAgfkVycm5vR3VhcmQoKSB7IGVycm5vID0gbV9vbGRFcnJubzsgfQorICAgIHByaXZhdGU6CisgICAgICAgIGludCBtX29sZEVycm5vOworICAgIH07CisKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICBuYW1lc3BhY2UgeworCisgICAgICAgIHN0cnVjdCBJQ29sb3VySW1wbCB7CisgICAgICAgICAgICB2aXJ0dWFsIH5JQ29sb3VySW1wbCgpIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IE5vQ29sb3VySW1wbCA6IElDb2xvdXJJbXBsIHsKKyAgICAgICAgICAgIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgKSB7fQorCisgICAgICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGluc3RhbmNlKCkgeworICAgICAgICAgICAgICAgIHN0YXRpYyBOb0NvbG91ckltcGwgc19pbnN0YW5jZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJnNfaW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICB9IC8vIGFub24gbmFtZXNwYWNlCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfTk9ORSApICYmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MgKSAmJiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJICkKKyMgICBpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisjICAgICAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VSX1dJTkRPV1MKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ09MT1VSX0FOU0kKKyMgICBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkICggQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisKKyAgICBjbGFzcyBXaW4zMkNvbG91ckltcGwgOiBwdWJsaWMgSUNvbG91ckltcGwgeworICAgIHB1YmxpYzoKKyAgICAgICAgV2luMzJDb2xvdXJJbXBsKCkgOiBzdGRvdXRIYW5kbGUoIEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjc2JpSW5mbzsKKyAgICAgICAgICAgIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKCBzdGRvdXRIYW5kbGUsICZjc2JpSW5mbyApOworICAgICAgICAgICAgb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlcyA9IGNzYmlJbmZvLndBdHRyaWJ1dGVzICYgfiggQkFDS0dST1VORF9HUkVFTiB8IEJBQ0tHUk9VTkRfUkVEIHwgQkFDS0dST1VORF9CTFVFIHwgQkFDS0dST1VORF9JTlRFTlNJVFkgKTsKKyAgICAgICAgICAgIG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRlcyAmIH4oIEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSB8IEZPUkVHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICBzd2l0Y2goIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpOb25lOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OldoaXRlOiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpSZWQ6ICAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX1JFRCApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmVlbjogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJsdWU6ICAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfQkxVRSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpDeWFuOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlllbGxvdzogICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmV5OiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCAwICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6TGlnaHRHcmV5OiAgICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFJlZDogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfUkVEICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodEdyZWVuOiAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0V2hpdGU6ICAgcmV0dXJuIHNldFRleHRBdHRyaWJ1dGUoIEZPUkVHUk9VTkRfSU5URU5TSVRZIHwgRk9SRUdST1VORF9HUkVFTiB8IEZPUkVHUk9VTkRfUkVEIHwgRk9SRUdST1VORF9CTFVFICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0OiB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAibm90IGEgY29sb3VyIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHNldFRleHRBdHRyaWJ1dGUoIFdPUkQgX3RleHRBdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZSggc3Rkb3V0SGFuZGxlLCBfdGV4dEF0dHJpYnV0ZSB8IG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXMgKTsKKyAgICAgICAgfQorICAgICAgICBIQU5ETEUgc3Rkb3V0SGFuZGxlOworICAgICAgICBXT1JEIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXM7CisgICAgICAgIFdPUkQgb3JpZ2luYWxCYWNrZ3JvdW5kQXR0cmlidXRlczsKKyAgICB9OworCisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7CisgICAgICAgIHN0YXRpYyBXaW4zMkNvbG91ckltcGwgc19pbnN0YW5jZTsKKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gY29uZmlnID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKTsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIGNvbG91ck1vZGUgPSBjb25maWcKKyAgICAgICAgICAgID8gY29uZmlnLT51c2VDb2xvdXIoKQorICAgICAgICAgICAgOiBVc2VDb2xvdXI6OkF1dG87CisgICAgICAgIGlmKCBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6QXV0byApCisgICAgICAgICAgICBjb2xvdXJNb2RlID0gIWlzRGVidWdnZXJBY3RpdmUoKQorICAgICAgICAgICAgICAgID8gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgICAgICA6IFVzZUNvbG91cjo6Tm87CisgICAgICAgIHJldHVybiBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICA/ICZzX2luc3RhbmNlCisgICAgICAgICAgICA6IE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsKKyAgICB9CisKK30gLy8gZW5kIGFub24gbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VsaWYgZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIHsKKworICAgIC8vIHVzZSBQT1NJWC8gQU5TSSBjb25zb2xlIHRlcm1pbmFsIGNvZGVzCisgICAgLy8gVGhhbmtzIHRvIEFkYW0gU3RyemVsZWNraSBmb3Igb3JpZ2luYWwgY29udHJpYnV0aW9uCisgICAgLy8gKGh0dHA6Ly9naXRodWIuY29tL25hbm9hbnQpCisgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL0NhdGNoL3B1bGwvMTMxCisgICAgY2xhc3MgUG9zaXhDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCB1c2UoIENvbG91cjo6Q29kZSBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgIHN3aXRjaCggX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6Ok5vbmU6CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OldoaXRlOiAgICAgcmV0dXJuIHNldENvbG91ciggIlswbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6UmVkOiAgICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzFtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmVlbjogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszMm0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJsdWU6ICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM0bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Q3lhbjogICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzZtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpZZWxsb3c6ICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszM20iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkdyZXk6ICAgICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMwbSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpMaWdodEdyZXk6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzdtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRSZWQ6ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzFtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRHcmVlbjogICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzJtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRXaGl0ZTogICByZXR1cm4gc2V0Q29sb3VyKCAiWzE7MzdtIiApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vdCBhIGNvbG91ciIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGluc3RhbmNlKCkgeworICAgICAgICAgICAgc3RhdGljIFBvc2l4Q29sb3VySW1wbCBzX2luc3RhbmNlOworICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIHNldENvbG91ciggY29uc3QgY2hhciogX2VzY2FwZUNvZGUgKSB7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8ICdcMDMzJyA8PCBfZXNjYXBlQ29kZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsKKyAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0gY29uZmlnCisgICAgICAgICAgICA/IGNvbmZpZy0+dXNlQ29sb3VyKCkKKyAgICAgICAgICAgIDogVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICAgICAgY29sb3VyTW9kZSA9ICghaXNEZWJ1Z2dlckFjdGl2ZSgpICYmIGlzYXR0eShTVERPVVRfRklMRU5PKSApCisgICAgICAgICAgICAgICAgPyBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgICAgIDogVXNlQ29sb3VyOjpObzsKKyAgICAgICAgcmV0dXJuIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgID8gUG9zaXhDb2xvdXJJbXBsOjppbnN0YW5jZSgpCisgICAgICAgICAgICA6IE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsKKyAgICB9CisKK30gLy8gZW5kIGFub24gbmFtZXNwYWNlCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2Vsc2UgIC8vIG5vdCBXaW5kb3dzIG9yIEFOU0kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0YXRpYyBJQ29sb3VySW1wbCogcGxhdGZvcm1Db2xvdXJJbnN0YW5jZSgpIHsgcmV0dXJuIE5vQ29sb3VySW1wbDo6aW5zdGFuY2UoKTsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2VuZGlmIC8vIFdpbmRvd3MvIEFOU0kvIE5vbmUKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIENvbG91cjo6Q29sb3VyKCBDb2RlIF9jb2xvdXJDb2RlICkgOiBtX21vdmVkKCBmYWxzZSApIHsgdXNlKCBfY29sb3VyQ29kZSApOyB9CisgICAgQ29sb3VyOjpDb2xvdXIoIENvbG91ciBjb25zdCYgX290aGVyICkgOiBtX21vdmVkKCBmYWxzZSApIHsgY29uc3RfY2FzdDxDb2xvdXImPiggX290aGVyICkubV9tb3ZlZCA9IHRydWU7IH0KKyAgICBDb2xvdXI6On5Db2xvdXIoKXsgaWYoICFtX21vdmVkICkgdXNlKCBOb25lICk7IH0KKworICAgIHZvaWQgQ29sb3VyOjp1c2UoIENvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgIHN0YXRpYyBJQ29sb3VySW1wbCogaW1wbCA9IHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKTsKKyAgICAgICAgaW1wbC0+dXNlKCBfY29sb3VyQ29kZSApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9nZW5lcmF0b3JzX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9HRU5FUkFUT1JTX0lNUExfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBHZW5lcmF0b3JJbmZvIDogSUdlbmVyYXRvckluZm8geworCisgICAgICAgIEdlbmVyYXRvckluZm8oIHN0ZDo6c2l6ZV90IHNpemUgKQorICAgICAgICA6ICAgbV9zaXplKCBzaXplICksCisgICAgICAgICAgICBtX2N1cnJlbnRJbmRleCggMCApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBtb3ZlTmV4dCgpIHsKKyAgICAgICAgICAgIGlmKCArK21fY3VycmVudEluZGV4ID09IG1fc2l6ZSApIHsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRJbmRleCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBnZXRDdXJyZW50SW5kZXgoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jdXJyZW50SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBtX3NpemU7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1fY3VycmVudEluZGV4OworICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIEdlbmVyYXRvcnNGb3JUZXN0IDogcHVibGljIElHZW5lcmF0b3JzRm9yVGVzdCB7CisKKyAgICBwdWJsaWM6CisgICAgICAgIH5HZW5lcmF0b3JzRm9yVGVzdCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbCggbV9nZW5lcmF0b3JzSW5PcmRlciApOworICAgICAgICB9CisKKyAgICAgICAgSUdlbmVyYXRvckluZm8mIGdldEdlbmVyYXRvckluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlSW5mbywgc3RkOjpzaXplX3Qgc2l6ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZ2VuZXJhdG9yc0J5TmFtZS5maW5kKCBmaWxlSW5mbyApOworICAgICAgICAgICAgaWYoIGl0ID09IG1fZ2VuZXJhdG9yc0J5TmFtZS5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICBJR2VuZXJhdG9ySW5mbyogaW5mbyA9IG5ldyBHZW5lcmF0b3JJbmZvKCBzaXplICk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzQnlOYW1lLmluc2VydCggc3RkOjptYWtlX3BhaXIoIGZpbGVJbmZvLCBpbmZvICkgKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNJbk9yZGVyLnB1c2hfYmFjayggaW5mbyApOworICAgICAgICAgICAgICAgIHJldHVybiAqaW5mbzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqaXQtPnNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZ2VuZXJhdG9yc0luT3JkZXIuYmVnaW4oKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbV9nZW5lcmF0b3JzSW5PcmRlci5lbmQoKTsKKyAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCAoKml0KS0+bW92ZU5leHQoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvckluZm8qPiBtX2dlbmVyYXRvcnNCeU5hbWU7CisgICAgICAgIHN0ZDo6dmVjdG9yPElHZW5lcmF0b3JJbmZvKj4gbV9nZW5lcmF0b3JzSW5PcmRlcjsKKyAgICB9OworCisgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBjcmVhdGVHZW5lcmF0b3JzRm9yVGVzdCgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRvcnNGb3JUZXN0KCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Fzc2VydGlvbnJlc3VsdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FTU0VSVElPTlJFU1VMVF9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIEFzc2VydGlvbkluZm86OkFzc2VydGlvbkluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9tYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgX3Jlc3VsdERpc3Bvc2l0aW9uICkKKyAgICA6ICAgbWFjcm9OYW1lKCBfbWFjcm9OYW1lICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgY2FwdHVyZWRFeHByZXNzaW9uKCBfY2FwdHVyZWRFeHByZXNzaW9uICksCisgICAgICAgIHJlc3VsdERpc3Bvc2l0aW9uKCBfcmVzdWx0RGlzcG9zaXRpb24gKQorICAgIHt9CisKKyAgICBBc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdCgpIHt9CisKKyAgICBBc3NlcnRpb25SZXN1bHQ6OkFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywgQXNzZXJ0aW9uUmVzdWx0RGF0YSBjb25zdCYgZGF0YSApCisgICAgOiAgIG1faW5mbyggaW5mbyApLAorICAgICAgICBtX3Jlc3VsdERhdGEoIGRhdGEgKQorICAgIHt9CisKKyAgICBBc3NlcnRpb25SZXN1bHQ6On5Bc3NlcnRpb25SZXN1bHQoKSB7fQorCisgICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6c3VjY2VlZGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlICk7CisgICAgfQorCisgICAgLy8gUmVzdWx0IHdhcyBhIHN1Y2Nlc3MsIG9yIGZhaWx1cmUgaXMgc3VwcHJlc3NlZAorICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0Ojppc09rKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ2F0Y2g6OmlzT2soIG1fcmVzdWx0RGF0YS5yZXN1bHRUeXBlICkgfHwgc2hvdWxkU3VwcHJlc3NGYWlsdXJlKCBtX2luZm8ucmVzdWx0RGlzcG9zaXRpb24gKTsKKyAgICB9CisKKyAgICBSZXN1bHRXYXM6Ok9mVHlwZSBBc3NlcnRpb25SZXN1bHQ6OmdldFJlc3VsdFR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZTsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uLmVtcHR5KCk7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc01lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbV9yZXN1bHREYXRhLm1lc3NhZ2UuZW1wdHkoKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIGlmKCBpc0ZhbHNlVGVzdCggbV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKQorICAgICAgICAgICAgcmV0dXJuICchJyArIG1faW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cHJlc3Npb25Jbk1hY3JvKCkgY29uc3QgeworICAgICAgICBpZiggbV9pbmZvLm1hY3JvTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgIHJldHVybiBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLm1hY3JvTmFtZSArICIoICIgKyBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uICsgIiApIjsKKyAgICB9CisKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaGFzRXhwcmVzc2lvbigpICYmIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpICE9IGdldEV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcmVzdWx0RGF0YS5yZWNvbnN0cnVjdEV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldE1lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEubWVzc2FnZTsKKyAgICB9CisgICAgU291cmNlTGluZUluZm8gQXNzZXJ0aW9uUmVzdWx0OjpnZXRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9pbmZvLmxpbmVJbmZvOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIEFzc2VydGlvblJlc3VsdDo6Z2V0VGVzdE1hY3JvTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5mby5tYWNyb05hbWU7CisgICAgfQorCisgICAgdm9pZCBBc3NlcnRpb25SZXN1bHQ6OmRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgbV9yZXN1bHREYXRhLmRlY29tcG9zZWRFeHByZXNzaW9uID0gQ0FUQ0hfTlVMTDsKKyAgICB9CisKKyAgICB2b2lkIEFzc2VydGlvblJlc3VsdDo6ZXhwYW5kRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmVzdWx0RGF0YS5yZWNvbnN0cnVjdEV4cHJlc3Npb24oKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX2luZm8uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfSU5GT19IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSBUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzIHBhcnNlU3BlY2lhbFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIHsKKyAgICAgICAgaWYoIHN0YXJ0c1dpdGgoIHRhZywgJy4nICkgfHwKKyAgICAgICAgICAgIHRhZyA9PSAiaGlkZSIgfHwKKyAgICAgICAgICAgIHRhZyA9PSAiIWhpZGUiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OklzSGlkZGVuOworICAgICAgICBlbHNlIGlmKCB0YWcgPT0gIiF0aHJvd3MiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OlRocm93czsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhc2hvdWxkZmFpbCIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6U2hvdWxkRmFpbDsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhbWF5ZmFpbCIgKQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6TWF5RmFpbDsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhbm9ucG9ydGFibGUiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok5vblBvcnRhYmxlOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpOb25lOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBpc1Jlc2VydmVkVGFnKCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnICkgeworICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKSA9PSBUZXN0Q2FzZUluZm86Ok5vbmUgJiYgdGFnLnNpemUoKSA+IDAgJiYgIXN0ZDo6aXNhbG51bSggdGFnWzBdICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIGVuZm9yY2VOb3RSZXNlcnZlZFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApIHsKKyAgICAgICAgaWYoIGlzUmVzZXJ2ZWRUYWcoIHRhZyApICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgQ29sb3VyKENvbG91cjo6UmVkKQorICAgICAgICAgICAgICAgPDwgIlRhZyBuYW1lIFsiIDw8IHRhZyA8PCAiXSBub3QgYWxsb3dlZC5cbiIKKyAgICAgICAgICAgICAgIDw8ICJUYWcgbmFtZXMgc3RhcnRpbmcgd2l0aCBub24gYWxwaGEtbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSByZXNlcnZlZFxuIgorICAgICAgICAgICAgICAgPDwgQ29sb3VyKENvbG91cjo6RmlsZU5hbWUpCisgICAgICAgICAgICAgICA8PCBfbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzcy5zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUZXN0Q2FzZSBtYWtlVGVzdENhc2UoICBJVGVzdENhc2UqIF90ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjT3JUYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIHsKKyAgICAgICAgYm9vbCBpc0hpZGRlbiggc3RhcnRzV2l0aCggX25hbWUsICIuLyIgKSApOyAvLyBMZWdhY3kgc3VwcG9ydAorCisgICAgICAgIC8vIFBhcnNlIG91dCB0YWdzCisgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0YWdzOworICAgICAgICBzdGQ6OnN0cmluZyBkZXNjLCB0YWc7CisgICAgICAgIGJvb2wgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IF9kZXNjT3JUYWdzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgY2hhciBjID0gX2Rlc2NPclRhZ3NbaV07CisgICAgICAgICAgICBpZiggIWluVGFnICkgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICdbJyApCisgICAgICAgICAgICAgICAgICAgIGluVGFnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRlc2MgKz0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICddJyApIHsKKyAgICAgICAgICAgICAgICAgICAgVGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcyBwcm9wID0gcGFyc2VTcGVjaWFsVGFnKCB0YWcgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb3AgPT0gVGVzdENhc2VJbmZvOjpJc0hpZGRlbiApCisgICAgICAgICAgICAgICAgICAgICAgICBpc0hpZGRlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHByb3AgPT0gVGVzdENhc2VJbmZvOjpOb25lICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZm9yY2VOb3RSZXNlcnZlZFRhZyggdGFnLCBfbGluZUluZm8gKTsKKworICAgICAgICAgICAgICAgICAgICB0YWdzLmluc2VydCggdGFnICk7CisgICAgICAgICAgICAgICAgICAgIHRhZy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBpblRhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRhZyArPSBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCBpc0hpZGRlbiApIHsKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiaGlkZSIgKTsKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiLiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RDYXNlSW5mbyBpbmZvKCBfbmFtZSwgX2NsYXNzTmFtZSwgZGVzYywgdGFncywgX2xpbmVJbmZvICk7CisgICAgICAgIHJldHVybiBUZXN0Q2FzZSggX3Rlc3RDYXNlLCBpbmZvICk7CisgICAgfQorCisgICAgdm9pZCBzZXRUYWdzKCBUZXN0Q2FzZUluZm8mIHRlc3RDYXNlSW5mbywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiB0YWdzICkKKyAgICB7CisgICAgICAgIHRlc3RDYXNlSW5mby50YWdzID0gdGFnczsKKyAgICAgICAgdGVzdENhc2VJbmZvLmxjYXNlVGFncy5jbGVhcigpOworCisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHRhZ3MuYmVnaW4oKSwgaXRFbmQgPSB0YWdzLmVuZCgpOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgIG9zcyA8PCAnWycgPDwgKml0IDw8ICddJzsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxjYXNlVGFnID0gdG9Mb3dlciggKml0ICk7CisgICAgICAgICAgICB0ZXN0Q2FzZUluZm8ucHJvcGVydGllcyA9IHN0YXRpY19jYXN0PFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXM+KCB0ZXN0Q2FzZUluZm8ucHJvcGVydGllcyB8IHBhcnNlU3BlY2lhbFRhZyggbGNhc2VUYWcgKSApOworICAgICAgICAgICAgdGVzdENhc2VJbmZvLmxjYXNlVGFncy5pbnNlcnQoIGxjYXNlVGFnICk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdENhc2VJbmZvLnRhZ3NBc1N0cmluZyA9IG9zcy5zdHIoKTsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm86OlRlc3RDYXNlSW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2NsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbyApCisgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgIGNsYXNzTmFtZSggX2NsYXNzTmFtZSApLAorICAgICAgICBkZXNjcmlwdGlvbiggX2Rlc2NyaXB0aW9uICksCisgICAgICAgIGxpbmVJbmZvKCBfbGluZUluZm8gKSwKKyAgICAgICAgcHJvcGVydGllcyggTm9uZSApCisgICAgeworICAgICAgICBzZXRUYWdzKCAqdGhpcywgX3RhZ3MgKTsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm86OlRlc3RDYXNlSW5mbyggVGVzdENhc2VJbmZvIGNvbnN0JiBvdGhlciApCisgICAgOiAgIG5hbWUoIG90aGVyLm5hbWUgKSwKKyAgICAgICAgY2xhc3NOYW1lKCBvdGhlci5jbGFzc05hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIG90aGVyLmRlc2NyaXB0aW9uICksCisgICAgICAgIHRhZ3MoIG90aGVyLnRhZ3MgKSwKKyAgICAgICAgbGNhc2VUYWdzKCBvdGhlci5sY2FzZVRhZ3MgKSwKKyAgICAgICAgdGFnc0FzU3RyaW5nKCBvdGhlci50YWdzQXNTdHJpbmcgKSwKKyAgICAgICAgbGluZUluZm8oIG90aGVyLmxpbmVJbmZvICksCisgICAgICAgIHByb3BlcnRpZXMoIG90aGVyLnByb3BlcnRpZXMgKQorICAgIHt9CisKKyAgICBib29sIFRlc3RDYXNlSW5mbzo6aXNIaWRkZW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiBJc0hpZGRlbiApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjp0aHJvd3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiBUaHJvd3MgKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6b2tUb0ZhaWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiAoU2hvdWxkRmFpbCB8IE1heUZhaWwgKSApICE9IDA7CisgICAgfQorICAgIGJvb2wgVGVzdENhc2VJbmZvOjpleHBlY3RlZFRvRmFpbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICggcHJvcGVydGllcyAmIChTaG91bGRGYWlsICkgKSAhPSAwOworICAgIH0KKworICAgIFRlc3RDYXNlOjpUZXN0Q2FzZSggSVRlc3RDYXNlKiB0ZXN0Q2FzZSwgVGVzdENhc2VJbmZvIGNvbnN0JiBpbmZvICkgOiBUZXN0Q2FzZUluZm8oIGluZm8gKSwgdGVzdCggdGVzdENhc2UgKSB7fQorCisgICAgVGVzdENhc2U6OlRlc3RDYXNlKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKQorICAgIDogICBUZXN0Q2FzZUluZm8oIG90aGVyICksCisgICAgICAgIHRlc3QoIG90aGVyLnRlc3QgKQorICAgIHt9CisKKyAgICBUZXN0Q2FzZSBUZXN0Q2FzZTo6d2l0aE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmV3TmFtZSApIGNvbnN0IHsKKyAgICAgICAgVGVzdENhc2Ugb3RoZXIoICp0aGlzICk7CisgICAgICAgIG90aGVyLm5hbWUgPSBfbmV3TmFtZTsKKyAgICAgICAgcmV0dXJuIG90aGVyOworICAgIH0KKworICAgIHZvaWQgVGVzdENhc2U6OnN3YXAoIFRlc3RDYXNlJiBvdGhlciApIHsKKyAgICAgICAgdGVzdC5zd2FwKCBvdGhlci50ZXN0ICk7CisgICAgICAgIG5hbWUuc3dhcCggb3RoZXIubmFtZSApOworICAgICAgICBjbGFzc05hbWUuc3dhcCggb3RoZXIuY2xhc3NOYW1lICk7CisgICAgICAgIGRlc2NyaXB0aW9uLnN3YXAoIG90aGVyLmRlc2NyaXB0aW9uICk7CisgICAgICAgIHRhZ3Muc3dhcCggb3RoZXIudGFncyApOworICAgICAgICBsY2FzZVRhZ3Muc3dhcCggb3RoZXIubGNhc2VUYWdzICk7CisgICAgICAgIHRhZ3NBc1N0cmluZy5zd2FwKCBvdGhlci50YWdzQXNTdHJpbmcgKTsKKyAgICAgICAgc3RkOjpzd2FwKCBUZXN0Q2FzZUluZm86OnByb3BlcnRpZXMsIHN0YXRpY19jYXN0PFRlc3RDYXNlSW5mbyY+KCBvdGhlciApLnByb3BlcnRpZXMgKTsKKyAgICAgICAgc3RkOjpzd2FwKCBsaW5lSW5mbywgb3RoZXIubGluZUluZm8gKTsKKyAgICB9CisKKyAgICB2b2lkIFRlc3RDYXNlOjppbnZva2UoKSBjb25zdCB7CisgICAgICAgIHRlc3QtPmludm9rZSgpOworICAgIH0KKworICAgIGJvb2wgVGVzdENhc2U6Om9wZXJhdG9yID09ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gIHRlc3QuZ2V0KCkgPT0gb3RoZXIudGVzdC5nZXQoKSAmJgorICAgICAgICAgICAgICAgIG5hbWUgPT0gb3RoZXIubmFtZSAmJgorICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9PSBvdGhlci5jbGFzc05hbWU7CisgICAgfQorCisgICAgYm9vbCBUZXN0Q2FzZTo6b3BlcmF0b3IgPCAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG5hbWUgPCBvdGhlci5uYW1lOworICAgIH0KKyAgICBUZXN0Q2FzZSYgVGVzdENhc2U6Om9wZXJhdG9yID0gKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgIFRlc3RDYXNlIHRlbXAoIG90aGVyICk7CisgICAgICAgIHN3YXAoIHRlbXAgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgVGVzdENhc2U6OmdldFRlc3RDYXNlSW5mbygpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3ZlcnNpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9WRVJTSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgVmVyc2lvbjo6VmVyc2lvbgorICAgICAgICAoICAgdW5zaWduZWQgaW50IF9tYWpvclZlcnNpb24sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBfcGF0Y2hOdW1iZXIsCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgX2JyYW5jaE5hbWUsCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICkKKyAgICA6ICAgbWFqb3JWZXJzaW9uKCBfbWFqb3JWZXJzaW9uICksCisgICAgICAgIG1pbm9yVmVyc2lvbiggX21pbm9yVmVyc2lvbiApLAorICAgICAgICBwYXRjaE51bWJlciggX3BhdGNoTnVtYmVyICksCisgICAgICAgIGJyYW5jaE5hbWUoIF9icmFuY2hOYW1lICksCisgICAgICAgIGJ1aWxkTnVtYmVyKCBfYnVpbGROdW1iZXIgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgVmVyc2lvbiBjb25zdCYgdmVyc2lvbiApIHsKKyAgICAgICAgb3MgIDw8IHZlcnNpb24ubWFqb3JWZXJzaW9uIDw8ICcuJworICAgICAgICAgICAgPDwgdmVyc2lvbi5taW5vclZlcnNpb24gPDwgJy4nCisgICAgICAgICAgICA8PCB2ZXJzaW9uLnBhdGNoTnVtYmVyOworICAgICAgICAvLyBicmFuY2hOYW1lIGlzIG5ldmVyIG51bGwgLT4gMHRoIGNoYXIgaXMgXDAgaWYgaXQgaXMgZW1wdHkKKyAgICAgICAgaWYgKHZlcnNpb24uYnJhbmNoTmFtZVswXSkgeworICAgICAgICAgICAgb3MgPDwgJy0nIDw8IHZlcnNpb24uYnJhbmNoTmFtZQorICAgICAgICAgICAgICAgPDwgJy4nIDw8IHZlcnNpb24uYnVpbGROdW1iZXI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIGlubGluZSBWZXJzaW9uIGxpYnJhcnlWZXJzaW9uKCkgeworICAgICAgICBzdGF0aWMgVmVyc2lvbiB2ZXJzaW9uKCAxLCA5LCA0LCAiIiwgMCApOworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9CisKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX21lc3NhZ2UuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NRVNTQUdFX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgTWVzc2FnZUluZm86Ok1lc3NhZ2VJbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBfdHlwZSApCisgICAgOiAgIG1hY3JvTmFtZSggX21hY3JvTmFtZSApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHR5cGUoIF90eXBlICksCisgICAgICAgIHNlcXVlbmNlKCArK2dsb2JhbENvdW50ICkKKyAgICB7fQorCisgICAgLy8gVGhpcyBtYXkgbmVlZCBwcm90ZWN0aW5nIGlmIHRocmVhZGluZyBzdXBwb3J0IGlzIGFkZGVkCisgICAgdW5zaWduZWQgaW50IE1lc3NhZ2VJbmZvOjpnbG9iYWxDb3VudCA9IDA7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBTY29wZWRNZXNzYWdlOjpTY29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApCisgICAgOiBtX2luZm8oIGJ1aWxkZXIubV9pbmZvICkKKyAgICB7CisgICAgICAgIG1faW5mby5tZXNzYWdlID0gYnVpbGRlci5tX3N0cmVhbS5zdHIoKTsKKyAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnB1c2hTY29wZWRNZXNzYWdlKCBtX2luZm8gKTsKKyAgICB9CisgICAgU2NvcGVkTWVzc2FnZTo6U2NvcGVkTWVzc2FnZSggU2NvcGVkTWVzc2FnZSBjb25zdCYgb3RoZXIgKQorICAgIDogbV9pbmZvKCBvdGhlci5tX2luZm8gKQorICAgIHt9CisKKyAgICBTY29wZWRNZXNzYWdlOjp+U2NvcGVkTWVzc2FnZSgpIHsKKyAgICAgICAgaWYgKCAhc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSApeworICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnBvcFNjb3BlZE1lc3NhZ2UobV9pbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9sZWdhY3lfcmVwb3J0ZXJfYWRhcHRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xFR0FDWV9SRVBPUlRFUl9BREFQVEVSX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbGVnYWN5X3JlcG9ydGVyX2FkYXB0ZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTEVHQUNZX1JFUE9SVEVSX0FEQVBURVJfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICAvLyBEZXByZWNhdGVkCisgICAgc3RydWN0IElSZXBvcnRlciA6IElTaGFyZWQgeworICAgICAgICB2aXJ0dWFsIH5JUmVwb3J0ZXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkUmVkaXJlY3RTdGRvdXQoKSBjb25zdCA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0VGVzdGluZygpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFRlc3RpbmcoIFRvdGFscyBjb25zdCYgdG90YWxzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRHcm91cCggc3RkOjpzdHJpbmcgY29uc3QmIGdyb3VwTmFtZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZEdyb3VwKCBzdGQ6OnN0cmluZyBjb25zdCYgZ3JvdXBOYW1lLCBUb3RhbHMgY29uc3QmIHRvdGFscyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0VGVzdENhc2UoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRUZXN0Q2FzZSggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbywgVG90YWxzIGNvbnN0JiB0b3RhbHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdGRPdXQsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdGRFcnIgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSwgc3RkOjpzdHJpbmcgY29uc3QmIGRlc2NyaXB0aW9uICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kU2VjdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lLCBDb3VudHMgY29uc3QmIGFzc2VydGlvbnMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBOb0Fzc2VydGlvbnNJblNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIE5vQXNzZXJ0aW9uc0luVGVzdENhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXN0TmFtZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEFib3J0ZWQoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBMZWdhY3lSZXBvcnRlckFkYXB0ZXIgOiBwdWJsaWMgU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+CisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCBQdHI8SVJlcG9ydGVyPiBjb25zdCYgbGVnYWN5UmVwb3J0ZXIgKTsKKyAgICAgICAgdmlydHVhbCB+TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKTsKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBQdHI8SVJlcG9ydGVyPiBtX2xlZ2FjeVJlcG9ydGVyOworICAgIH07Cit9CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCBQdHI8SVJlcG9ydGVyPiBjb25zdCYgbGVnYWN5UmVwb3J0ZXIgKQorICAgIDogICBtX2xlZ2FjeVJlcG9ydGVyKCBsZWdhY3lSZXBvcnRlciApCisgICAge30KKyAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6On5MZWdhY3lSZXBvcnRlckFkYXB0ZXIoKSB7fQorCisgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmdldFByZWZlcmVuY2VzKCkgY29uc3QgeworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIHByZWZzOworICAgICAgICBwcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IG1fbGVnYWN5UmVwb3J0ZXItPnNob3VsZFJlZGlyZWN0U3Rkb3V0KCk7CisgICAgICAgIHJldHVybiBwcmVmczsKKyAgICB9CisKKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6bm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICkge30KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0VGVzdGluZygpOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydEdyb3VwKCBncm91cEluZm8ubmFtZSApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRUZXN0Q2FzZSggdGVzdEluZm8gKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFNlY3Rpb24oIHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZvLmRlc2NyaXB0aW9uICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjphc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSB7CisgICAgICAgIC8vIE5vdCBvbiBsZWdhY3kgaW50ZXJmYWNlCisgICAgfQorCisgICAgYm9vbCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OmFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSB7CisgICAgICAgIGlmKCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6T2sgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwgaXRFbmQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgIFJlc3VsdEJ1aWxkZXIgcmIoIGl0LT5tYWNyb05hbWUuY19zdHIoKSwgaXQtPmxpbmVJbmZvLCAiIiwgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworICAgICAgICAgICAgICAgICAgICByYiA8PCBpdC0+bWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgcmIuc2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpJbmZvICk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQgPSByYi5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5SZXN1bHQoIHJlc3VsdCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5SZXN1bHQoIGFzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdCApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSB7CisgICAgICAgIGlmKCBzZWN0aW9uU3RhdHMubWlzc2luZ0Fzc2VydGlvbnMgKQorICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+Tm9Bc3NlcnRpb25zSW5TZWN0aW9uKCBzZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSApOworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRTZWN0aW9uKCBzZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFRlc3RDYXNlCisgICAgICAgICAgICAoICAgdGVzdENhc2VTdGF0cy50ZXN0SW5mbywKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZVN0YXRzLnRvdGFscywKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZVN0YXRzLnN0ZE91dCwKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZVN0YXRzLnN0ZEVyciApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6dGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIHsKKyAgICAgICAgaWYoIHRlc3RHcm91cFN0YXRzLmFib3J0aW5nICkKKyAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkFib3J0ZWQoKTsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kR3JvdXAoIHRlc3RHcm91cFN0YXRzLmdyb3VwSW5mby5uYW1lLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZFRlc3RpbmcoIHRlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgeworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RpbWVyLmhwcAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrMTEtbG9uZy1sb25nIgorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisKKyNlbHNlCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIG5hbWVzcGFjZSB7CisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworICAgICAgICBVSW50NjQgZ2V0Q3VycmVudFRpY2tzKCkgeworICAgICAgICAgICAgc3RhdGljIFVJbnQ2NCBoej0wLCBoem89MDsKKyAgICAgICAgICAgIGlmICghaHopIHsKKyAgICAgICAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCByZWludGVycHJldF9jYXN0PExBUkdFX0lOVEVHRVIqPiggJmh6ICkgKTsKKyAgICAgICAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZoem8gKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVUludDY0IHQ7CisgICAgICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZ0ICkgKTsKKyAgICAgICAgICAgIHJldHVybiAoKHQtaHpvKSoxMDAwMDAwKS9oejsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgVUludDY0IGdldEN1cnJlbnRUaWNrcygpIHsKKyAgICAgICAgICAgIHRpbWV2YWwgdDsKKyAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdCxDQVRDSF9OVUxMKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxVSW50NjQ+KCB0LnR2X3NlYyApICogMTAwMDAwMHVsbCArIHN0YXRpY19jYXN0PFVJbnQ2ND4oIHQudHZfdXNlYyApOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICB2b2lkIFRpbWVyOjpzdGFydCgpIHsKKyAgICAgICAgbV90aWNrcyA9IGdldEN1cnJlbnRUaWNrcygpOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgVGltZXI6OmdldEVsYXBzZWRNaWNyb3NlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGdldEN1cnJlbnRUaWNrcygpIC0gbV90aWNrcyk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBUaW1lcjo6Z2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpLzEwMDApOworICAgIH0KKyAgICBkb3VibGUgVGltZXI6OmdldEVsYXBzZWRTZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpLzEwMDAwMDAuMDsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbW1vbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTU1PTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuc2l6ZSgpID49IHByZWZpeC5zaXplKCkgJiYgc3RkOjplcXVhbChwcmVmaXguYmVnaW4oKSwgcHJlZml4LmVuZCgpLCBzLmJlZ2luKCkpOworICAgIH0KKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHByZWZpeCApIHsKKyAgICAgICAgcmV0dXJuICFzLmVtcHR5KCkgJiYgc1swXSA9PSBwcmVmaXg7CisgICAgfQorICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3VmZml4ICkgeworICAgICAgICByZXR1cm4gcy5zaXplKCkgPj0gc3VmZml4LnNpemUoKSAmJiBzdGQ6OmVxdWFsKHN1ZmZpeC5yYmVnaW4oKSwgc3VmZml4LnJlbmQoKSwgcy5yYmVnaW4oKSk7CisgICAgfQorICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHN1ZmZpeCApIHsKKyAgICAgICAgcmV0dXJuICFzLmVtcHR5KCkgJiYgc1tzLnNpemUoKS0xXSA9PSBzdWZmaXg7CisgICAgfQorICAgIGJvb2wgY29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgaW5maXggKSB7CisgICAgICAgIHJldHVybiBzLmZpbmQoIGluZml4ICkgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgfQorICAgIGNoYXIgdG9Mb3dlckNoKGNoYXIgYykgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhcj4oIHN0ZDo6dG9sb3dlciggYyApICk7CisgICAgfQorICAgIHZvaWQgdG9Mb3dlckluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzICkgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybSggcy5iZWdpbigpLCBzLmVuZCgpLCBzLmJlZ2luKCksIHRvTG93ZXJDaCApOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0b0xvd2VyKCBzdGQ6OnN0cmluZyBjb25zdCYgcyApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGMgPSBzOworICAgICAgICB0b0xvd2VySW5QbGFjZSggbGMgKTsKKyAgICAgICAgcmV0dXJuIGxjOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB0cmltKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgeworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCogd2hpdGVzcGFjZUNoYXJzID0gIlxuXHJcdCAiOworICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHN0YXJ0ID0gc3RyLmZpbmRfZmlyc3Rfbm90X29mKCB3aGl0ZXNwYWNlQ2hhcnMgKTsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBlbmQgPSBzdHIuZmluZF9sYXN0X25vdF9vZiggd2hpdGVzcGFjZUNoYXJzICk7CisKKyAgICAgICAgcmV0dXJuIHN0YXJ0ICE9IHN0ZDo6c3RyaW5nOjpucG9zID8gc3RyLnN1YnN0ciggc3RhcnQsIDErZW5kLXN0YXJ0ICkgOiBzdGQ6OnN0cmluZygpOworICAgIH0KKworICAgIGJvb2wgcmVwbGFjZUluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzdHIsIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBsYWNlVGhpcywgc3RkOjpzdHJpbmcgY29uc3QmIHdpdGhUaGlzICkgeworICAgICAgICBib29sIHJlcGxhY2VkID0gZmFsc2U7CisgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBzdHIuZmluZCggcmVwbGFjZVRoaXMgKTsKKyAgICAgICAgd2hpbGUoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICByZXBsYWNlZCA9IHRydWU7CisgICAgICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKCAwLCBpICkgKyB3aXRoVGhpcyArIHN0ci5zdWJzdHIoIGkrcmVwbGFjZVRoaXMuc2l6ZSgpICk7CisgICAgICAgICAgICBpZiggaSA8IHN0ci5zaXplKCktd2l0aFRoaXMuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICBpID0gc3RyLmZpbmQoIHJlcGxhY2VUaGlzLCBpK3dpdGhUaGlzLnNpemUoKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGkgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbGFjZWQ7CisgICAgfQorCisgICAgcGx1cmFsaXNlOjpwbHVyYWxpc2UoIHN0ZDo6c2l6ZV90IGNvdW50LCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwgKQorICAgIDogICBtX2NvdW50KCBjb3VudCApLAorICAgICAgICBtX2xhYmVsKCBsYWJlbCApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBwbHVyYWxpc2UgY29uc3QmIHBsdXJhbGlzZXIgKSB7CisgICAgICAgIG9zIDw8IHBsdXJhbGlzZXIubV9jb3VudCA8PCAnICcgPDwgcGx1cmFsaXNlci5tX2xhYmVsOworICAgICAgICBpZiggcGx1cmFsaXNlci5tX2NvdW50ICE9IDEgKQorICAgICAgICAgICAgb3MgPDwgJ3MnOworICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgU291cmNlTGluZUluZm86OlNvdXJjZUxpbmVJbmZvKCkgOiBmaWxlKCIiKSwgbGluZSggMCApe30KKyAgICBTb3VyY2VMaW5lSW5mbzo6U291cmNlTGluZUluZm8oIGNoYXIgY29uc3QqIF9maWxlLCBzdGQ6OnNpemVfdCBfbGluZSApCisgICAgOiAgIGZpbGUoIF9maWxlICksCisgICAgICAgIGxpbmUoIF9saW5lICkKKyAgICB7fQorICAgIGJvb2wgU291cmNlTGluZUluZm86OmVtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gZmlsZVswXSA9PSAnXDAnOworICAgIH0KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjpvcGVyYXRvciA9PSAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxpbmUgPT0gb3RoZXIubGluZSAmJiAoZmlsZSA9PSBvdGhlci5maWxlIHx8IHN0ZDo6c3RyY21wKGZpbGUsIG90aGVyLmZpbGUpID09IDApOworICAgIH0KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjpvcGVyYXRvciA8ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICByZXR1cm4gbGluZSA8IG90aGVyLmxpbmUgfHwgKCBsaW5lID09IG90aGVyLmxpbmUgJiYgKHN0ZDo6c3RyY21wKGZpbGUsIG90aGVyLmZpbGUpIDwgMCkpOworICAgIH0KKworICAgIHZvaWQgc2VlZFJuZyggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICBpZiggY29uZmlnLnJuZ1NlZWQoKSAhPSAwICkKKyAgICAgICAgICAgIHN0ZDo6c3JhbmQoIGNvbmZpZy5ybmdTZWVkKCkgKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpLT5ybmdTZWVkKCk7CisgICAgfQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBpbmZvICkgeworI2lmbmRlZiBfX0dOVUdfXworICAgICAgICBvcyA8PCBpbmZvLmZpbGUgPDwgJygnIDw8IGluZm8ubGluZSA8PCAnKSc7CisjZWxzZQorICAgICAgICBvcyA8PCBpbmZvLmZpbGUgPDwgJzonIDw8IGluZm8ubGluZTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gb3M7CisgICAgfQorCisgICAgdm9pZCB0aHJvd0xvZ2ljRXJyb3IoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbG9jYXRpb25JbmZvICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgbG9jYXRpb25JbmZvIDw8ICI6IEludGVybmFsIENhdGNoIGVycm9yOiAnIiA8PCBtZXNzYWdlIDw8ICdcJyc7CisgICAgICAgIGlmKCBhbHdheXNUcnVlKCkgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggb3NzLnN0cigpICk7CisgICAgfQorfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc2VjdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBTZWN0aW9uSW5mbzo6U2VjdGlvbkluZm8KKyAgICAgICAgKCAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uICkKKyAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICkKKyAgICB7fQorCisgICAgU2VjdGlvbjo6U2VjdGlvbiggU2VjdGlvbkluZm8gY29uc3QmIGluZm8gKQorICAgIDogICBtX2luZm8oIGluZm8gKSwKKyAgICAgICAgbV9zZWN0aW9uSW5jbHVkZWQoIGdldFJlc3VsdENhcHR1cmUoKS5zZWN0aW9uU3RhcnRlZCggbV9pbmZvLCBtX2Fzc2VydGlvbnMgKSApCisgICAgeworICAgICAgICBtX3RpbWVyLnN0YXJ0KCk7CisgICAgfQorCisgICAgU2VjdGlvbjo6flNlY3Rpb24oKSB7CisgICAgICAgIGlmKCBtX3NlY3Rpb25JbmNsdWRlZCApIHsKKyAgICAgICAgICAgIFNlY3Rpb25FbmRJbmZvIGVuZEluZm8oIG1faW5mbywgbV9hc3NlcnRpb25zLCBtX3RpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCkgKTsKKyAgICAgICAgICAgIGlmKCBzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpICkKKyAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkRWFybHkoIGVuZEluZm8gKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvbkVuZGVkKCBlbmRJbmZvICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QKKyAgICBTZWN0aW9uOjpvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9zZWN0aW9uSW5jbHVkZWQ7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2RlYnVnZ2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVCVUdHRVJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBDQVRDSF9QTEFURk9STV9NQUMKKworICAgICNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgICAjaW5jbHVkZSA8c3RkYm9vbC5oPgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisgICAgI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KKworICAgIG5hbWVzcGFjZSBDYXRjaHsKKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIHRha2VuIGRpcmVjdGx5IGZyb20gdGhlIGZvbGxvd2luZyB0ZWNobmljYWwgbm90ZToKKyAgICAgICAgLy8gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvI3FhL3FhMjAwNC9xYTEzNjEuaHRtbAorCisgICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIGJlaW5nIGRlYnVnZ2VkIChlaXRoZXIKKyAgICAgICAgLy8gcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgb3IgaGFzIGEgZGVidWdnZXIgYXR0YWNoZWQgcG9zdCBmYWN0bykuCisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpeworCisgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1pYls0XTsKKyAgICAgICAgICAgIHN0cnVjdCBraW5mb19wcm9jICAgaW5mbzsKKyAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgc2l6ZTsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmxhZ3Mgc28gdGhhdCwgaWYgc3lzY3RsIGZhaWxzIGZvciBzb21lIGJpemFycmUKKyAgICAgICAgICAgIC8vIHJlYXNvbiwgd2UgZ2V0IGEgcHJlZGljdGFibGUgcmVzdWx0LgorCisgICAgICAgICAgICBpbmZvLmtwX3Byb2MucF9mbGFnID0gMDsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBtaWIsIHdoaWNoIHRlbGxzIHN5c2N0bCB0aGUgaW5mbyB3ZSB3YW50LCBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIC8vIHdlJ3JlIGxvb2tpbmcgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgcHJvY2VzcyBJRC4KKworICAgICAgICAgICAgbWliWzBdID0gQ1RMX0tFUk47CisgICAgICAgICAgICBtaWJbMV0gPSBLRVJOX1BST0M7CisgICAgICAgICAgICBtaWJbMl0gPSBLRVJOX1BST0NfUElEOworICAgICAgICAgICAgbWliWzNdID0gZ2V0cGlkKCk7CisKKyAgICAgICAgICAgIC8vIENhbGwgc3lzY3RsLgorCisgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGluZm8pOworICAgICAgICAgICAgaWYoIHN5c2N0bChtaWIsIHNpemVvZihtaWIpIC8gc2l6ZW9mKCptaWIpLCAmaW5mbywgJnNpemUsIENBVENIX05VTEwsIDApICE9IDAgKSB7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCAiXG4qKiBDYWxsIHRvIHN5c2N0bCBmYWlsZWQgLSB1bmFibGUgdG8gZGV0ZXJtaW5lIGlmIGRlYnVnZ2VyIGlzIGFjdGl2ZSAqKlxuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSdyZSBiZWluZyBkZWJ1Z2dlZCBpZiB0aGUgUF9UUkFDRUQgZmxhZyBpcyBzZXQuCisKKyAgICAgICAgICAgIHJldHVybiAoIChpbmZvLmtwX3Byb2MucF9mbGFnICYgUF9UUkFDRUQpICE9IDAgKTsKKyAgICAgICAgfQorICAgIH0gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNlbGlmIGRlZmluZWQoQ0FUQ0hfUExBVEZPUk1fTElOVVgpCisgICAgI2luY2x1ZGUgPGZzdHJlYW0+CisgICAgI2luY2x1ZGUgPHN0cmluZz4KKworICAgIG5hbWVzcGFjZSBDYXRjaHsKKyAgICAgICAgLy8gVGhlIHN0YW5kYXJkIFBPU0lYIHdheSBvZiBkZXRlY3RpbmcgYSBkZWJ1Z2dlciBpcyB0byBhdHRlbXB0IHRvCisgICAgICAgIC8vIHB0cmFjZSgpIHRoZSBwcm9jZXNzLCBidXQgdGhpcyBuZWVkcyB0byBiZSBkb25lIGZyb20gYSBjaGlsZCBhbmQgbm90CisgICAgICAgIC8vIHRoaXMgcHJvY2VzcyBpdHNlbGYgdG8gc3RpbGwgYWxsb3cgYXR0YWNoaW5nIHRvIHRoaXMgcHJvY2VzcyBsYXRlcgorICAgICAgICAvLyBpZiB3YW50ZWQsIHNvIGlzIHJhdGhlciBoZWF2eS4gVW5kZXIgTGludXggd2UgaGF2ZSB0aGUgUElEIG9mIHRoZQorICAgICAgICAvLyAiZGVidWdnZXIiICh3aGljaCBkb2Vzbid0IG5lZWQgdG8gYmUgZ2RiLCBvZiBjb3Vyc2UsIGl0IGNvdWxkIGFsc28KKyAgICAgICAgLy8gYmUgc3RyYWNlLCBmb3IgZXhhbXBsZSkgaW4gL3Byb2MvJFBJRC9zdGF0dXMsIHNvIGp1c3QgZ2V0IGl0IGZyb20KKyAgICAgICAgLy8gdGhlcmUgaW5zdGVhZC4KKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCl7CisgICAgICAgICAgICAvLyBMaWJzdGRjKysgaGFzIGEgYnVnLCB3aGVyZSBzdGQ6Omlmc3RyZWFtIHNldHMgZXJybm8gdG8gMAorICAgICAgICAgICAgLy8gVGhpcyB3YXkgb3VyIHVzZXJzIGNhbiBwcm9wZXJseSBhc3NlcnQgb3ZlciBlcnJubyB2YWx1ZXMKKyAgICAgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtIGluKCIvcHJvYy9zZWxmL3N0YXR1cyIpOworICAgICAgICAgICAgZm9yKCBzdGQ6OnN0cmluZyBsaW5lOyBzdGQ6OmdldGxpbmUoaW4sIGxpbmUpOyApIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IFBSRUZJWF9MRU4gPSAxMTsKKyAgICAgICAgICAgICAgICBpZiggbGluZS5jb21wYXJlKDAsIFBSRUZJWF9MRU4sICJUcmFjZXJQaWQ6XHQiKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSB0cmFjZWQgaWYgdGhlIFBJRCBpcyBub3QgMCBhbmQgbm8gb3RoZXIgUElEIHN0YXJ0cworICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIDAgZGlnaXQsIHNvIGl0J3MgZW5vdWdoIHRvIGNoZWNrIGZvciBqdXN0IGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rlci4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoKCkgPiBQUkVGSVhfTEVOICYmIGxpbmVbUFJFRklYX0xFTl0gIT0gJzAnOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgaW50IF9fc3RkY2FsbCBJc0RlYnVnZ2VyUHJlc2VudCgpOworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJc0RlYnVnZ2VyUHJlc2VudCgpICE9IDA7CisgICAgICAgIH0KKyAgICB9CisjZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1Z2dlclByZXNlbnQoKTsKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAhPSAwOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgIGlubGluZSBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIH0KKyNlbmRpZiAvLyBQbGF0Zm9ybQorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIDo6T3V0cHV0RGVidWdTdHJpbmdBKCB0ZXh0LmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgdm9pZCB3cml0ZVRvRGVidWdDb25zb2xlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIC8vICFUQkQ6IE5lZWQgYSB2ZXJzaW9uIGZvciBNYWMvIFhDb2RlIGFuZCBvdGhlciBJREVzCisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHRleHQ7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gUGxhdGZvcm0KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rvc3RyaW5nLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVE9TVFJJTkdfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdW5wcmludGFibGVTdHJpbmcgPSAiez99IjsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIGNvbnN0IGludCBoZXhUaHJlc2hvbGQgPSAyNTU7CisKKyAgICAgICAgc3RydWN0IEVuZGlhbm5lc3MgeworICAgICAgICAgICAgZW51bSBBcmNoIHsgQmlnLCBMaXR0bGUgfTsKKworICAgICAgICAgICAgc3RhdGljIEFyY2ggd2hpY2goKSB7CisgICAgICAgICAgICAgICAgdW5pb24gX3sKKyAgICAgICAgICAgICAgICAgICAgaW50IGFzSW50OworICAgICAgICAgICAgICAgICAgICBjaGFyIGFzQ2hhcltzaXplb2YgKGludCldOworICAgICAgICAgICAgICAgIH0gdTsKKworICAgICAgICAgICAgICAgIHUuYXNJbnQgPSAxOworICAgICAgICAgICAgICAgIHJldHVybiAoIHUuYXNDaGFyW3NpemVvZihpbnQpLTFdID09IDEgKSA/IEJpZyA6IExpdHRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyByYXdNZW1vcnlUb1N0cmluZyggY29uc3Qgdm9pZCAqb2JqZWN0LCBzdGQ6OnNpemVfdCBzaXplICkKKyAgICB7CisgICAgICAgIC8vIFJldmVyc2Ugb3JkZXIgZm9yIGxpdHRsZSBlbmRpYW4gYXJjaGl0ZWN0dXJlcworICAgICAgICBpbnQgaSA9IDAsIGVuZCA9IHN0YXRpY19jYXN0PGludD4oIHNpemUgKSwgaW5jID0gMTsKKyAgICAgICAgaWYoIEVuZGlhbm5lc3M6OndoaWNoKCkgPT0gRW5kaWFubmVzczo6TGl0dGxlICkgeworICAgICAgICAgICAgaSA9IGVuZC0xOworICAgICAgICAgICAgZW5kID0gaW5jID0gLTE7CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBjaGFyIGNvbnN0ICpieXRlcyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIgY29uc3QgKj4ob2JqZWN0KTsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAiMHgiIDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6aGV4OworICAgICAgICBmb3IoIDsgaSAhPSBlbmQ7IGkgKz0gaW5jICkKKyAgICAgICAgICAgICBvcyA8PCBzdGQ6OnNldHcoMikgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGJ5dGVzW2ldKTsKKyAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgfQorfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgeworICAgIHN0ZDo6c3RyaW5nIHMgPSB2YWx1ZTsKKyAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+c2hvd0ludmlzaWJsZXMoKSApIHsKKyAgICAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWJzOworICAgICAgICAgICAgc3dpdGNoKCBzW2ldICkgeworICAgICAgICAgICAgY2FzZSAnXG4nOiBzdWJzID0gIlxcbiI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnXHQnOiBzdWJzID0gIlxcdCI7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIXN1YnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzID0gcy5zdWJzdHIoIDAsIGkgKSArIHN1YnMgKyBzLnN1YnN0ciggaSsxICk7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAnIicgKyBzICsgJyInOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6d3N0cmluZyBjb25zdCYgdmFsdWUgKSB7CisKKyAgICBzdGQ6OnN0cmluZyBzOworICAgIHMucmVzZXJ2ZSggdmFsdWUuc2l6ZSgpICk7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlLnNpemUoKTsgKytpICkKKyAgICAgICAgcyArPSB2YWx1ZVtpXSA8PSAweGZmID8gc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlW2ldICkgOiAnPyc7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggcyApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgY2hhciogY29uc3QgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlID8gQ2F0Y2g6OnRvU3RyaW5nKCBzdGQ6OnN0cmluZyggdmFsdWUgKSApIDogc3RkOjpzdHJpbmcoICJ7bnVsbCBzdHJpbmd9IiApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciogY29uc3QgdmFsdWUgKSB7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KCB2YWx1ZSApICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApCit7CisgICAgcmV0dXJuIHZhbHVlID8gQ2F0Y2g6OnRvU3RyaW5nKCBzdGQ6OndzdHJpbmcodmFsdWUpICkgOiBzdGQ6OnN0cmluZyggIntudWxsIHN0cmluZ30iICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB3Y2hhcl90KiBjb25zdCB2YWx1ZSApCit7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y29uc3Qgd2NoYXJfdCo+KCB2YWx1ZSApICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBpbnQgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBpbnQgdmFsdWUgKSB7CisgICAgcmV0dXJuIENhdGNoOjp0b1N0cmluZyggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHZhbHVlICkgKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIGZwVG9TdHJpbmcoIFQgdmFsdWUsIGludCBwcmVjaXNpb24gKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oIHByZWNpc2lvbiApCisgICAgICAgIDw8IHN0ZDo6Zml4ZWQKKyAgICAgICAgPDwgdmFsdWU7CisgICAgc3RkOjpzdHJpbmcgZCA9IG9zcy5zdHIoKTsKKyAgICBzdGQ6OnNpemVfdCBpID0gZC5maW5kX2xhc3Rfbm90X29mKCAnMCcgKTsKKyAgICBpZiggaSAhPSBzdGQ6OnN0cmluZzo6bnBvcyAmJiBpICE9IGQuc2l6ZSgpLTEgKSB7CisgICAgICAgIGlmKCBkW2ldID09ICcuJyApCisgICAgICAgICAgICBpKys7CisgICAgICAgIGQgPSBkLnN1YnN0ciggMCwgaSsxICk7CisgICAgfQorICAgIHJldHVybiBkOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZG91YmxlIHZhbHVlICkgeworICAgIHJldHVybiBmcFRvU3RyaW5nKCB2YWx1ZSwgMTAgKTsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjb25zdCBmbG9hdCB2YWx1ZSApIHsKKyAgICByZXR1cm4gZnBUb1N0cmluZyggdmFsdWUsIDUgKSArICdmJzsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGJvb2wgdmFsdWUgKSB7CisgICAgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIgdmFsdWUgKSB7CisgICAgaWYgKCB2YWx1ZSA9PSAnXHInICkKKyAgICAgICAgcmV0dXJuICInXFxyJyI7CisgICAgaWYgKCB2YWx1ZSA9PSAnXGYnICkKKyAgICAgICAgcmV0dXJuICInXFxmJyI7CisgICAgaWYgKCB2YWx1ZSA9PSAnXG4nICkKKyAgICAgICAgcmV0dXJuICInXFxuJyI7CisgICAgaWYgKCB2YWx1ZSA9PSAnXHQnICkKKyAgICAgICAgcmV0dXJuICInXFx0JyI7CisgICAgaWYgKCAnXDAnIDw9IHZhbHVlICYmIHZhbHVlIDwgJyAnICkKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCB2YWx1ZSApICk7CisgICAgY2hhciBjaHN0cltdID0gIicgJyI7CisgICAgY2hzdHJbMV0gPSB2YWx1ZTsKKyAgICByZXR1cm4gY2hzdHI7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzaWduZWQgY2hhciB2YWx1ZSApIHsKKyAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZSApICk7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBjaGFyIHZhbHVlICkgeworICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8Y2hhcj4oIHZhbHVlICkgKTsKK30KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBsb25nIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSApIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIG9zcyA8PCB2YWx1ZTsKKyAgICBpZiggdmFsdWUgPiBEZXRhaWw6OmhleFRocmVzaG9sZCApCisgICAgICAgIG9zcyA8PCAiICgweCIgPDwgc3RkOjpoZXggPDwgdmFsdWUgPDwgJyknOworICAgIHJldHVybiBvc3Muc3RyKCk7Cit9CisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc3RkOjpudWxscHRyX3QgKSB7CisgICAgcmV0dXJuICJudWxscHRyIjsKK30KKyNlbmRpZgorCisjaWZkZWYgX19PQkpDX18KKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNTdHJpbmcgY29uc3QgKiBjb25zdCYgbnNzdHJpbmcgKSB7CisgICAgICAgIGlmKCAhbnNzdHJpbmcgKQorICAgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICByZXR1cm4gIkAiICsgdG9TdHJpbmcoW25zc3RyaW5nIFVURjhTdHJpbmddKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nICogQ0FUQ0hfQVJDX1NUUk9ORyBjb25zdCYgbnNzdHJpbmcgKSB7CisgICAgICAgIGlmKCAhbnNzdHJpbmcgKQorICAgICAgICAgICAgcmV0dXJuICJuaWwiOworICAgICAgICByZXR1cm4gIkAiICsgdG9TdHJpbmcoW25zc3RyaW5nIFVURjhTdHJpbmddKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TT2JqZWN0KiBjb25zdCYgbnNPYmplY3QgKSB7CisgICAgICAgIHJldHVybiB0b1N0cmluZyggW25zT2JqZWN0IGRlc2NyaXB0aW9uXSApOworICAgIH0KKyNlbmRpZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Jlc3VsdF9idWlsZGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVTVUxUX0JVSUxERVJfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6OnN0cmluZyBjYXB0dXJlZEV4cHJlc3Npb25XaXRoU2Vjb25kQXJndW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBjYXB0dXJlZEV4cHJlc3Npb24sIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWNvbmRBcmcgKSB7CisgICAgICAgIHJldHVybiBzZWNvbmRBcmcuZW1wdHkoKSB8fCBzZWNvbmRBcmcgPT0gIlwiXCIiCisgICAgICAgICAgICA/IGNhcHR1cmVkRXhwcmVzc2lvbgorICAgICAgICAgICAgOiBjYXB0dXJlZEV4cHJlc3Npb24gKyAiLCAiICsgc2Vjb25kQXJnOworICAgIH0KKyAgICBSZXN1bHRCdWlsZGVyOjpSZXN1bHRCdWlsZGVyKCAgIGNoYXIgY29uc3QqIG1hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIGNhcHR1cmVkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIHNlY29uZEFyZyApCisgICAgOiAgIG1fYXNzZXJ0aW9uSW5mbyggbWFjcm9OYW1lLCBsaW5lSW5mbywgY2FwdHVyZWRFeHByZXNzaW9uV2l0aFNlY29uZEFyZ3VtZW50KCBjYXB0dXJlZEV4cHJlc3Npb24sIHNlY29uZEFyZyApLCByZXN1bHREaXNwb3NpdGlvbiApLAorICAgICAgICBtX3Nob3VsZERlYnVnQnJlYWsoIGZhbHNlICksCisgICAgICAgIG1fc2hvdWxkVGhyb3coIGZhbHNlICksCisgICAgICAgIG1fZ3VhcmRFeGNlcHRpb24oIGZhbHNlICkKKyAgICB7fQorCisgICAgUmVzdWx0QnVpbGRlcjo6flJlc3VsdEJ1aWxkZXIoKSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorICAgICAgICBpZiAoIG1fZ3VhcmRFeGNlcHRpb24gKSB7CisgICAgICAgICAgICBtX3N0cmVhbS5vc3MgPDwgIkV4Y2VwdGlvbiB0cmFuc2xhdGlvbiB3YXMgZGlzYWJsZWQgYnkgQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSI7CisgICAgICAgICAgICBjYXB0dXJlUmVzdWx0KCBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICk7CisgICAgICAgICAgICBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKS0+ZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBSZXN1bHRCdWlsZGVyJiBSZXN1bHRCdWlsZGVyOjpzZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHQgKSB7CisgICAgICAgIG1fZGF0YS5yZXN1bHRUeXBlID0gcmVzdWx0OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIFJlc3VsdEJ1aWxkZXImIFJlc3VsdEJ1aWxkZXI6OnNldFJlc3VsdFR5cGUoIGJvb2wgcmVzdWx0ICkgeworICAgICAgICBtX2RhdGEucmVzdWx0VHlwZSA9IHJlc3VsdCA/IFJlc3VsdFdhczo6T2sgOiBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmVuZEV4cHJlc3Npb24oIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgeworICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gYnVpbGQoIGV4cHIgKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0KCByZXN1bHQgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnVzZUFjdGl2ZUV4Y2VwdGlvbiggUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uICkgeworICAgICAgICBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gPSByZXN1bHREaXNwb3NpdGlvbjsKKyAgICAgICAgbV9zdHJlYW0ub3NzIDw8IENhdGNoOjp0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApIHsKKyAgICAgICAgc2V0UmVzdWx0VHlwZSggcmVzdWx0VHlwZSApOworICAgICAgICBjYXB0dXJlRXhwcmVzc2lvbigpOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgZXhwZWN0ZWRNZXNzYWdlICkgeworICAgICAgICBpZiggZXhwZWN0ZWRNZXNzYWdlLmVtcHR5KCkgKQorICAgICAgICAgICAgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hBbGxPZjxzdGQ6OnN0cmluZz4oKSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpFcXVhbHMoIGV4cGVjdGVkTWVzc2FnZSApICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwZWN0ZWRFeGNlcHRpb24oIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyQmFzZTxzdGQ6OnN0cmluZz4gY29uc3QmIG1hdGNoZXIgKSB7CisKKyAgICAgICAgYXNzZXJ0KCAhaXNGYWxzZVRlc3QoIG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApICk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgZGF0YSA9IG1fZGF0YTsKKyAgICAgICAgZGF0YS5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpPazsKKyAgICAgICAgZGF0YS5yZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IG1fYXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisKKyAgICAgICAgc3RkOjpzdHJpbmcgYWN0dWFsTWVzc2FnZSA9IENhdGNoOjp0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgaWYoICFtYXRjaGVyLm1hdGNoKCBhY3R1YWxNZXNzYWdlICkgKSB7CisgICAgICAgICAgICBkYXRhLnJlc3VsdFR5cGUgPSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ7CisgICAgICAgICAgICBkYXRhLnJlY29uc3RydWN0ZWRFeHByZXNzaW9uID0gYWN0dWFsTWVzc2FnZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0KCBtX2Fzc2VydGlvbkluZm8sIGRhdGEgKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0KCByZXN1bHQgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHByZXNzaW9uKCkgeworICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gYnVpbGQoKTsKKyAgICAgICAgaGFuZGxlUmVzdWx0KCByZXN1bHQgKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmhhbmRsZVJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgKQorICAgIHsKKyAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLmFzc2VydGlvbkVuZGVkKCByZXN1bHQgKTsKKworICAgICAgICBpZiggIXJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICBpZiggZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+c2hvdWxkRGVidWdCcmVhaygpICkKKyAgICAgICAgICAgICAgICBtX3Nob3VsZERlYnVnQnJlYWsgPSB0cnVlOworICAgICAgICAgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0UnVubmVyKCktPmFib3J0aW5nKCkgfHwgKG1fYXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiAmIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwpICkKKyAgICAgICAgICAgICAgICBtX3Nob3VsZFRocm93ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6cmVhY3QoKSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorICAgICAgICBpZiAobV9zaG91bGREZWJ1Z0JyZWFrKSB7CisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAvLyBUbyBpbnNwZWN0IHRoZSBzdGF0ZSBkdXJpbmcgdGVzdCwgeW91IG5lZWQgdG8gZ28gb25lIGxldmVsIHVwIHRoZSBjYWxsc3RhY2sKKyAgICAgICAgICAgIC8vIFRvIGdvIGJhY2sgdG8gdGhlIHRlc3QgYW5kIGNoYW5nZSBleGVjdXRpb24sIGp1bXAgb3ZlciB0aGUgdGhyb3cgc3RhdGVtZW50CisgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiggbV9zaG91bGRUaHJvdyApCisgICAgICAgICAgICB0aHJvdyBDYXRjaDo6VGVzdEZhaWx1cmVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBib29sIFJlc3VsdEJ1aWxkZXI6OnNob3VsZERlYnVnQnJlYWsoKSBjb25zdCB7IHJldHVybiBtX3Nob3VsZERlYnVnQnJlYWs7IH0KKyAgICBib29sIFJlc3VsdEJ1aWxkZXI6OmFsbG93VGhyb3dzKCkgY29uc3QgeyByZXR1cm4gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+YWxsb3dUaHJvd3MoKTsgfQorCisgICAgQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdEJ1aWxkZXI6OmJ1aWxkKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZCggKnRoaXMgKTsKKyAgICB9CisKKyAgICAvLyBDQVZFQVQ6IFRoZSByZXR1cm5lZCBBc3NlcnRpb25SZXN1bHQgc3RvcmVzIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnQgZXhwciwKKyAgICAvLyAgICAgICAgIGEgdGVtcG9yYXJ5IERlY29tcG9zZWRFeHByZXNzaW9uLCB3aGljaCBpbiB0dXJuIGhvbGRzIHJlZmVyZW5jZXMgdG8KKyAgICAvLyAgICAgICAgIG9wZXJhbmRzLCBwb3NzaWJseSB0ZW1wb3JhcnkgYXMgd2VsbC4KKyAgICAvLyAgICAgICAgIEl0IHNob3VsZCBpbW1lZGlhdGVseSBiZSBwYXNzZWQgdG8gaGFuZGxlUmVzdWx0OyBpZiB0aGUgZXhwcmVzc2lvbgorICAgIC8vICAgICAgICAgbmVlZHMgdG8gYmUgcmVwb3J0ZWQsIGl0cyBzdHJpbmcgZXhwYW5zaW9uIG11c3QgYmUgY29tcG9zZWQgYmVmb3JlCisgICAgLy8gICAgICAgICB0aGUgdGVtcG9yYXJpZXMgYXJlIGRlc3Ryb3llZC4KKyAgICBBc3NlcnRpb25SZXN1bHQgUmVzdWx0QnVpbGRlcjo6YnVpbGQoIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICkgY29uc3QKKyAgICB7CisgICAgICAgIGFzc2VydCggbV9kYXRhLnJlc3VsdFR5cGUgIT0gUmVzdWx0V2FzOjpVbmtub3duICk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdERhdGEgZGF0YSA9IG1fZGF0YTsKKworICAgICAgICAvLyBGbGlwIGJvb2wgcmVzdWx0cyBpZiBGYWxzZVRlc3QgZmxhZyBpcyBzZXQKKyAgICAgICAgaWYoIGlzRmFsc2VUZXN0KCBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApIHsKKyAgICAgICAgICAgIGRhdGEubmVnYXRlKCBleHByLmlzQmluYXJ5RXhwcmVzc2lvbigpICk7CisgICAgICAgIH0KKworICAgICAgICBkYXRhLm1lc3NhZ2UgPSBtX3N0cmVhbS5vc3Muc3RyKCk7CisgICAgICAgIGRhdGEuZGVjb21wb3NlZEV4cHJlc3Npb24gPSAmZXhwcjsgLy8gZm9yIGxhenkgcmVjb25zdHJ1Y3Rpb24KKyAgICAgICAgcmV0dXJuIEFzc2VydGlvblJlc3VsdCggbV9hc3NlcnRpb25JbmZvLCBkYXRhICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpyZWNvbnN0cnVjdEV4cHJlc3Npb24oIHN0ZDo6c3RyaW5nJiBkZXN0ICkgY29uc3QgeworICAgICAgICBkZXN0ID0gbV9hc3NlcnRpb25JbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnNldEV4Y2VwdGlvbkd1YXJkKCkgeworICAgICAgICBtX2d1YXJkRXhjZXB0aW9uID0gdHJ1ZTsKKyAgICB9CisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjp1bnNldEV4Y2VwdGlvbkd1YXJkKCkgeworICAgICAgICBtX2d1YXJkRXhjZXB0aW9uID0gZmFsc2U7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhc19yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFRhZ0FsaWFzUmVnaXN0cnk6On5UYWdBbGlhc1JlZ2lzdHJ5KCkge30KKworICAgIE9wdGlvbjxUYWdBbGlhcz4gVGFnQWxpYXNSZWdpc3RyeTo6ZmluZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzICkgY29uc3QgeworICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVnaXN0cnkuZmluZCggYWxpYXMgKTsKKyAgICAgICAgaWYoIGl0ICE9IG1fcmVnaXN0cnkuZW5kKCkgKQorICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBPcHRpb248VGFnQWxpYXM+KCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgVGFnQWxpYXNSZWdpc3RyeTo6ZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0IHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwYW5kZWRUZXN0U3BlYyA9IHVuZXhwYW5kZWRUZXN0U3BlYzsKKyAgICAgICAgZm9yKCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVnaXN0cnkuYmVnaW4oKSwgaXRFbmQgPSBtX3JlZ2lzdHJ5LmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBwb3MgPSBleHBhbmRlZFRlc3RTcGVjLmZpbmQoIGl0LT5maXJzdCApOworICAgICAgICAgICAgaWYoIHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICBleHBhbmRlZFRlc3RTcGVjID0gIGV4cGFuZGVkVGVzdFNwZWMuc3Vic3RyKCAwLCBwb3MgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnRhZyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggcG9zICsgaXQtPmZpcnN0LnNpemUoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleHBhbmRlZFRlc3RTcGVjOworICAgIH0KKworICAgIHZvaWQgVGFnQWxpYXNSZWdpc3RyeTo6YWRkKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICBpZiggIXN0YXJ0c1dpdGgoIGFsaWFzLCAiW0AiICkgfHwgIWVuZHNXaXRoKCBhbGlhcywgJ10nICkgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKQorICAgICAgICAgICAgICAgIDw8ICJlcnJvcjogdGFnIGFsaWFzLCBcIiIgPDwgYWxpYXMgPDwgIlwiIGlzIG5vdCBvZiB0aGUgZm9ybSBbQGFsaWFzIG5hbWVdLlxuIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpGaWxlTmFtZSApCisgICAgICAgICAgICAgICAgPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkuY19zdHIoKSApOworICAgICAgICB9CisgICAgICAgIGlmKCAhbV9yZWdpc3RyeS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBhbGlhcywgVGFnQWxpYXMoIHRhZywgbGluZUluZm8gKSApICkuc2Vjb25kICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IHRhZyBhbGlhcywgXCIiIDw8IGFsaWFzIDw8ICJcIiBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iCisgICAgICAgICAgICAgICAgPDwgIlx0Rmlyc3Qgc2VlbiBhdCAiCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApIDw8IGZpbmQoYWxpYXMpLT5saW5lSW5mbyA8PCAnXG4nCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApIDw8ICJcdFJlZGVmaW5lZCBhdCAiCisgICAgICAgICAgICAgICAgPDwgQ29sb3VyKCBDb2xvdXI6OkZpbGVOYW1lKSA8PCBsaW5lSW5mbyA8PCAnXG4nOworICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoIG9zcy5zdHIoKS5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJVGFnQWxpYXNSZWdpc3RyeTo6fklUYWdBbGlhc1JlZ2lzdHJ5KCkge30KKworICAgIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0JiBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRUYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgfQorCisgICAgUmVnaXN0cmFyRm9yVGFnQWxpYXNlczo6UmVnaXN0cmFyRm9yVGFnQWxpYXNlcyggY2hhciBjb25zdCogYWxpYXMsIGNoYXIgY29uc3QqIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICkgeworICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRhZ0FsaWFzKCBhbGlhcywgdGFnLCBsaW5lSW5mbyApOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tYXRjaGVyc19zdHJpbmcuaHBwCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgTWF0Y2hlcnMgeworCisgICAgbmFtZXNwYWNlIFN0ZFN0cmluZyB7CisKKyAgICAgICAgQ2FzZWRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkKKyAgICAgICAgOiAgIG1fY2FzZVNlbnNpdGl2aXR5KCBjYXNlU2Vuc2l0aXZpdHkgKSwKKyAgICAgICAgICAgIG1fc3RyKCBhZGp1c3RTdHJpbmcoIHN0ciApICkKKyAgICAgICAge30KKyAgICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmFkanVzdFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObworICAgICAgICAgICAgICAgICAgID8gdG9Mb3dlciggc3RyICkKKyAgICAgICAgICAgICAgICAgICA6IHN0cjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBDYXNlZFN0cmluZzo6Y2FzZVNlbnNpdGl2aXR5U3VmZml4KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY2FzZVNlbnNpdGl2aXR5ID09IENhc2VTZW5zaXRpdmU6Ok5vCisgICAgICAgICAgICAgICAgICAgPyAiIChjYXNlIGluc2Vuc2l0aXZlKSIKKyAgICAgICAgICAgICAgICAgICA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdNYXRjaGVyQmFzZTo6U3RyaW5nTWF0Y2hlckJhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcGVyYXRpb24sIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkKKyAgICAgICAgOiBtX2NvbXBhcmF0b3IoIGNvbXBhcmF0b3IgKSwKKyAgICAgICAgICBtX29wZXJhdGlvbiggb3BlcmF0aW9uICkgeworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgU3RyaW5nTWF0Y2hlckJhc2U6OmRlc2NyaWJlKCkgY29uc3QgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICBkZXNjcmlwdGlvbi5yZXNlcnZlKDUgKyBtX29wZXJhdGlvbi5zaXplKCkgKyBtX2NvbXBhcmF0b3IubV9zdHIuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fb3BlcmF0aW9uOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIjogXCIiOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gbV9jb21wYXJhdG9yLm1fc3RyOworICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIlwiIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fY29tcGFyYXRvci5jYXNlU2Vuc2l0aXZpdHlTdWZmaXgoKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEVxdWFsc01hdGNoZXI6OkVxdWFsc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImVxdWFscyIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgRXF1YWxzTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICkgPT0gbV9jb21wYXJhdG9yLm1fc3RyOworICAgICAgICB9CisKKyAgICAgICAgQ29udGFpbnNNYXRjaGVyOjpDb250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImNvbnRhaW5zIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBDb250YWluc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zKCBtX2NvbXBhcmF0b3IuYWRqdXN0U3RyaW5nKCBzb3VyY2UgKSwgbV9jb21wYXJhdG9yLm1fc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBTdGFydHNXaXRoTWF0Y2hlcjo6U3RhcnRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggInN0YXJ0cyB3aXRoIiwgY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgYm9vbCBTdGFydHNXaXRoTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICAgICAgRW5kc1dpdGhNYXRjaGVyOjpFbmRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICkgOiBTdHJpbmdNYXRjaGVyQmFzZSggImVuZHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgRW5kc1dpdGhNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBlbmRzV2l0aCggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICB9IC8vIG5hbWVzcGFjZSBTdGRTdHJpbmcKKworICAgIFN0ZFN0cmluZzo6RXF1YWxzTWF0Y2hlciBFcXVhbHMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciBDb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6Q29udGFpbnNNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIgRW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApIHsKKyAgICAgICAgcmV0dXJuIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKK30gLy8gbmFtZXNwYWNlIENhdGNoCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX211bHRpLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfTVVMVElfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKK2NsYXNzIE11bHRpcGxlUmVwb3J0ZXJzIDogcHVibGljIFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiA+IFJlcG9ydGVyczsKKyAgICBSZXBvcnRlcnMgbV9yZXBvcnRlcnM7CisKK3B1YmxpYzoKKyAgICB2b2lkIGFkZCggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIHJlcG9ydGVyICkgeworICAgICAgICBtX3JlcG9ydGVycy5wdXNoX2JhY2soIHJlcG9ydGVyICk7CisgICAgfQorCitwdWJsaWM6IC8vIElTdHJlYW1pbmdSZXBvcnRlcgorCisgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gbV9yZXBvcnRlcnNbMF0tPmdldFByZWZlcmVuY2VzKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPm5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHNwZWMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdFJ1bkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdFJ1blN0YXJ0aW5nKCB0ZXN0UnVuSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdEdyb3VwU3RhcnRpbmcoIGdyb3VwSW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RDYXNlU3RhcnRpbmcoIHRlc3RJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnNlY3Rpb25TdGFydGluZyggc2VjdGlvbkluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmIGFzc2VydGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+YXNzZXJ0aW9uU3RhcnRpbmcoIGFzc2VydGlvbkluZm8gKTsKKyAgICB9CisKKyAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBpZiB0aGUgbWVzc2FnZXMgYnVmZmVyIHNob3VsZCBiZSBjbGVhcmVkOgorICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBib29sIGNsZWFyQnVmZmVyID0gZmFsc2U7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICBjbGVhckJ1ZmZlciB8PSAoKml0KS0+YXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIHJldHVybiBjbGVhckJ1ZmZlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5zZWN0aW9uRW5kZWQoIHNlY3Rpb25TdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0UnVuRW5kZWQoIHRlc3RSdW5TdGF0cyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5za2lwVGVzdCggdGVzdEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIE11bHRpcGxlUmVwb3J0ZXJzKiB0cnlBc011bHRpKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKK307CisKK1B0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZFJlcG9ydGVyKCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgZXhpc3RpbmdSZXBvcnRlciwgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGFkZGl0aW9uYWxSZXBvcnRlciApIHsKKyAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiByZXN1bHRpbmdSZXBvcnRlcjsKKworICAgIGlmKCBleGlzdGluZ1JlcG9ydGVyICkgeworICAgICAgICBNdWx0aXBsZVJlcG9ydGVycyogbXVsdGkgPSBleGlzdGluZ1JlcG9ydGVyLT50cnlBc011bHRpKCk7CisgICAgICAgIGlmKCAhbXVsdGkgKSB7CisgICAgICAgICAgICBtdWx0aSA9IG5ldyBNdWx0aXBsZVJlcG9ydGVyczsKKyAgICAgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4oIG11bHRpICk7CisgICAgICAgICAgICBpZiggZXhpc3RpbmdSZXBvcnRlciApCisgICAgICAgICAgICAgICAgbXVsdGktPmFkZCggZXhpc3RpbmdSZXBvcnRlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gZXhpc3RpbmdSZXBvcnRlcjsKKyAgICAgICAgbXVsdGktPmFkZCggYWRkaXRpb25hbFJlcG9ydGVyICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0aW5nUmVwb3J0ZXIgPSBhZGRpdGlvbmFsUmVwb3J0ZXI7CisKKyAgICByZXR1cm4gcmVzdWx0aW5nUmVwb3J0ZXI7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX3htbC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1hNTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlcG9ydGVyX2Jhc2VzLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQkFTRVNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICAvLyBCZWNhdXNlIGZvcm1hdHRpbmcgdXNpbmcgYysrIHN0cmVhbXMgaXMgc3RhdGVmdWwsIGRyb3AgZG93biB0byBDIGlzIHJlcXVpcmVkCisgICAgICAgIC8vIEFsdGVybmF0aXZlbHkgd2UgY291bGQgdXNlIHN0cmluZ3N0cmVhbSwgYnV0IGl0cyBwZXJmb3JtYW5jZSBpcy4uLiBub3QgZ29vZC4KKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oIGRvdWJsZSBkdXJhdGlvbiApIHsKKyAgICAgICAgICAgIC8vIE1heCBleHBvbmVudCArIDEgaXMgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSB3aG9sZSBwYXJ0CisgICAgICAgICAgICAvLyArIDEgZm9yIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgICAgIC8vICsgMyBmb3IgdGhlIDMgZGVjaW1hbCBwbGFjZXMKKyAgICAgICAgICAgIC8vICsgMSBmb3IgbnVsbCB0ZXJtaW5hdG9yCisgICAgICAgICAgICBjb25zdCBzaXplX3QgbWF4RG91YmxlU2l6ZSA9IERCTF9NQVhfMTBfRVhQICsgMSArIDEgKyAzICsgMTsKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyW21heERvdWJsZVNpemVdOworCisgICAgICAgICAgICAvLyBTYXZlIHByZXZpb3VzIGVycm5vLCB0byBwcmV2ZW50IHNwcmludGYgZnJvbSBvdmVyd3JpdGluZyBpdAorICAgICAgICAgICAgRXJybm9HdWFyZCBndWFyZDsKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3ByaW50Zl9zKGJ1ZmZlciwgIiUuM2YiLCBkdXJhdGlvbik7CisjZWxzZQorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cnVjdCBTdHJlYW1pbmdSZXBvcnRlckJhc2UgOiBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworCisgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgbV9jb25maWcoIF9jb25maWcuZnVsbENvbmZpZygpICksCisgICAgICAgICAgICBzdHJlYW0oIF9jb25maWcuc3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUHJlZnM7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5TdHJlYW1pbmdSZXBvcnRlckJhc2UoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgX3Rlc3RSdW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvID0gX3Rlc3RSdW5JbmZvOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mbyA9IF9ncm91cEluZm87CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiBfdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvID0gX3Rlc3RJbmZvOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wdXNoX2JhY2soIF9zZWN0aW9uSW5mbyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiAvKiBfc2VjdGlvblN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgLyogX3Rlc3RDYXNlU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgLyogX3Rlc3RHcm91cFN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgLyogX3Rlc3RSdW5TdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0Q2FzZUluZm8ucmVzZXQoKTsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mby5yZXNldCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIGJ5IGRlZmF1bHQuCisgICAgICAgICAgICAvLyBJdCBjYW4gb3B0aW9uYWxseSBiZSBvdmVycmlkZGVuIGluIHRoZSBkZXJpdmVkIGNsYXNzLgorICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKworICAgICAgICBMYXp5U3RhdDxUZXN0UnVuSW5mbz4gY3VycmVudFRlc3RSdW5JbmZvOworICAgICAgICBMYXp5U3RhdDxHcm91cEluZm8+IGN1cnJlbnRHcm91cEluZm87CisgICAgICAgIExhenlTdGF0PFRlc3RDYXNlSW5mbz4gY3VycmVudFRlc3RDYXNlSW5mbzsKKworICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uSW5mbz4gbV9zZWN0aW9uU3RhY2s7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSA6IFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENoaWxkTm9kZVQ+CisgICAgICAgIHN0cnVjdCBOb2RlIDogU2hhcmVkSW1wbDw+IHsKKyAgICAgICAgICAgIGV4cGxpY2l0IE5vZGUoIFQgY29uc3QmIF92YWx1ZSApIDogdmFsdWUoIF92YWx1ZSApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5Ob2RlKCkge30KKworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8Q2hpbGROb2RlVD4gPiBDaGlsZE5vZGVzOworICAgICAgICAgICAgVCB2YWx1ZTsKKyAgICAgICAgICAgIENoaWxkTm9kZXMgY2hpbGRyZW47CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBTZWN0aW9uTm9kZSA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICBleHBsaWNpdCBTZWN0aW9uTm9kZSggU2VjdGlvblN0YXRzIGNvbnN0JiBfc3RhdHMgKSA6IHN0YXRzKCBfc3RhdHMgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+U2VjdGlvbk5vZGUoKTsKKworICAgICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFNlY3Rpb25Ob2RlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm8gPT0gb3RoZXIuc3RhdHMuc2VjdGlvbkluZm8ubGluZUluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yID09ICggUHRyPFNlY3Rpb25Ob2RlPiBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oICpvdGhlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgc3RhdHM7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiBDaGlsZFNlY3Rpb25zOworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxBc3NlcnRpb25TdGF0cz4gQXNzZXJ0aW9uczsKKyAgICAgICAgICAgIENoaWxkU2VjdGlvbnMgY2hpbGRTZWN0aW9uczsKKyAgICAgICAgICAgIEFzc2VydGlvbnMgYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZE91dDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZEVycjsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgQnlTZWN0aW9uSW5mbyB7CisgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBTZWN0aW9uSW5mbyBjb25zdCYgb3RoZXIgKSA6IG1fb3RoZXIoIG90aGVyICkge30KKyAgICAgICAgICAgIEJ5U2VjdGlvbkluZm8oIEJ5U2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkgOiBtX290aGVyKCBvdGhlci5tX290aGVyICkge30KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IoKSAoIFB0cjxTZWN0aW9uTm9kZT4gY29uc3QmIG5vZGUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUtPnN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvID09IG1fb3RoZXIubGluZUluZm87CisgICAgICAgICAgICB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSggQnlTZWN0aW9uSW5mbyBjb25zdCYgKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBtX290aGVyOworICAgICAgICB9OworCisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0Q2FzZVN0YXRzLCBTZWN0aW9uTm9kZT4gVGVzdENhc2VOb2RlOworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdEdyb3VwU3RhdHMsIFRlc3RDYXNlTm9kZT4gVGVzdEdyb3VwTm9kZTsKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RSdW5TdGF0cywgVGVzdEdyb3VwTm9kZT4gVGVzdFJ1bk5vZGU7CisKKyAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgbV9jb25maWcoIF9jb25maWcuZnVsbENvbmZpZygpICksCisgICAgICAgICAgICBzdHJlYW0oIF9jb25maWcuc3RyZWFtKCkgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB+Q3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSgpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3JlcG9ydGVyUHJlZnM7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgaW5jb21wbGV0ZVN0YXRzKCBzZWN0aW9uSW5mbywgQ291bnRzKCksIDAsIGZhbHNlICk7CisgICAgICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG5vZGU7CisgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggIW1fcm9vdFNlY3Rpb24gKQorICAgICAgICAgICAgICAgICAgICBtX3Jvb3RTZWN0aW9uID0gbmV3IFNlY3Rpb25Ob2RlKCBpbmNvbXBsZXRlU3RhdHMgKTsKKyAgICAgICAgICAgICAgICBub2RlID0gbV9yb290U2VjdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBwYXJlbnROb2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZTo6Q2hpbGRTZWN0aW9uczo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmZpbmRfaWYoICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBzZWN0aW9uSW5mbyApICk7CisgICAgICAgICAgICAgICAgaWYoIGl0ID09IHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBTZWN0aW9uTm9kZSggaW5jb21wbGV0ZVN0YXRzICk7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBub2RlID0gKml0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uID0gbm9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUmIHNlY3Rpb25Ob2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgIHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMucHVzaF9iYWNrKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICAgICAgLy8gQXNzZXJ0aW9uUmVzdWx0IGhvbGRzIGEgcG9pbnRlciB0byBhIHRlbXBvcmFyeSBEZWNvbXBvc2VkRXhwcmVzc2lvbiwKKyAgICAgICAgICAgIC8vIHdoaWNoIGdldEV4cGFuZGVkRXhwcmVzc2lvbigpIGNhbGxzIHRvIGJ1aWxkIHRoZSBleHByZXNzaW9uIHN0cmluZy4KKyAgICAgICAgICAgIC8vIE91ciBzZWN0aW9uIHN0YWNrIGNvcHkgb2YgdGhlIGFzc2VydGlvblJlc3VsdCB3aWxsIGxpa2VseSBvdXRsaXZlIHRoZQorICAgICAgICAgICAgLy8gdGVtcG9yYXJ5LCBzbyBpdCBtdXN0IGJlIGV4cGFuZGVkIG9yIGRpc2NhcmRlZCBub3cgdG8gYXZvaWQgY2FsbGluZworICAgICAgICAgICAgLy8gYSBkZXN0cm95ZWQgb2JqZWN0IGxhdGVyLgorICAgICAgICAgICAgcHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbiggc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5iYWNrKCkuYXNzZXJ0aW9uUmVzdWx0ICk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBub2RlID0gKm1fc2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgICAgIG5vZGUuc3RhdHMgPSBzZWN0aW9uU3RhdHM7CisgICAgICAgICAgICBtX3NlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RDYXNlTm9kZT4gbm9kZSA9IG5ldyBUZXN0Q2FzZU5vZGUoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIGFzc2VydCggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID09IDAgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnB1c2hfYmFjayggbV9yb290U2VjdGlvbiApOworICAgICAgICAgICAgbV90ZXN0Q2FzZXMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICBtX3Jvb3RTZWN0aW9uLnJlc2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydCggbV9kZWVwZXN0U2VjdGlvbiApOworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbi0+c3RkT3V0ID0gdGVzdENhc2VTdGF0cy5zdGRPdXQ7CisgICAgICAgICAgICBtX2RlZXBlc3RTZWN0aW9uLT5zdGRFcnIgPSB0ZXN0Q2FzZVN0YXRzLnN0ZEVycjsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0R3JvdXBOb2RlPiBub2RlID0gbmV3IFRlc3RHcm91cE5vZGUoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5zd2FwKCBtX3Rlc3RDYXNlcyApOworICAgICAgICAgICAgbV90ZXN0R3JvdXBzLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgUHRyPFRlc3RSdW5Ob2RlPiBub2RlID0gbmV3IFRlc3RSdW5Ob2RlKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgICAgIG5vZGUtPmNoaWxkcmVuLnN3YXAoIG1fdGVzdEdyb3VwcyApOworICAgICAgICAgICAgbV90ZXN0UnVucy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgICAgIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlRXhwYW5kZWRFeHByZXNzaW9uKCBBc3NlcnRpb25SZXN1bHQmIHJlc3VsdCApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICByZXN1bHQuZGlzY2FyZERlY29tcG9zZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9jb25maWc7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICBzdGQ6OnZlY3RvcjxBc3NlcnRpb25TdGF0cz4gbV9hc3NlcnRpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gPiBtX3NlY3Rpb25zOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdENhc2VOb2RlPiA+IG1fdGVzdENhc2VzOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8VGVzdEdyb3VwTm9kZT4gPiBtX3Rlc3RHcm91cHM7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RSdW5Ob2RlPiA+IG1fdGVzdFJ1bnM7CisKKyAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBtX3Jvb3RTZWN0aW9uOworICAgICAgICBQdHI8U2VjdGlvbk5vZGU+IG1fZGVlcGVzdFNlY3Rpb247CisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxTZWN0aW9uTm9kZT4gPiBtX3NlY3Rpb25TdGFjazsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBtX3JlcG9ydGVyUHJlZnM7CisKKyAgICB9OworCisgICAgdGVtcGxhdGU8Y2hhciBDPgorICAgIGNoYXIgY29uc3QqIGdldExpbmVPZkNoYXJzKCkgeworICAgICAgICBzdGF0aWMgY2hhciBsaW5lW0NBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIXSA9IHswfTsKKyAgICAgICAgaWYoICEqbGluZSApIHsKKyAgICAgICAgICAgIHN0ZDo6bWVtc2V0KCBsaW5lLCBDLCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xICk7CisgICAgICAgICAgICBsaW5lW0NBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTFdID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGluZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgVGVzdEV2ZW50TGlzdGVuZXJCYXNlIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKyAgICAgICAgVGVzdEV2ZW50TGlzdGVuZXJCYXNlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7fQorICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vaW50ZXJuYWwvY2F0Y2hfcmVwb3J0ZXJfcmVnaXN0cmFycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1JFR0lTVFJBUlNfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIExlZ2FjeVJlcG9ydGVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBSZXBvcnRlckZhY3RvcnkgOiBwdWJsaWMgSVJlcG9ydGVyRmFjdG9yeSB7CisgICAgICAgICAgICB2aXJ0dWFsIElTdHJlYW1pbmdSZXBvcnRlciogY3JlYXRlKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCBuZXcgVCggY29uZmlnICkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVDo6Z2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBMZWdhY3lSZXBvcnRlclJlZ2lzdHJhciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBuZXcgUmVwb3J0ZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIFJlcG9ydGVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBSZXBvcnRlckZhY3RvcnkgOiBwdWJsaWMgU2hhcmVkSW1wbDxJUmVwb3J0ZXJGYWN0b3J5PiB7CisKKyAgICAgICAgICAgIC8vICoqKiBQbGVhc2UgTm90ZSAqKio6CisgICAgICAgICAgICAvLyAtIElmIHlvdSBlbmQgdXAgaGVyZSBsb29raW5nIGF0IGEgY29tcGlsZXIgZXJyb3IgYmVjYXVzZSBpdCdzIHRyeWluZyB0byByZWdpc3RlcgorICAgICAgICAgICAgLy8geW91ciBjdXN0b20gcmVwb3J0ZXIgY2xhc3MgYmUgYXdhcmUgdGhhdCB0aGUgbmF0aXZlIHJlcG9ydGVyIGludGVyZmFjZSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgLy8gdG8gSVN0cmVhbWluZ1JlcG9ydGVyLiBUaGUgImxlZ2FjeSIgaW50ZXJmYWNlLCBJUmVwb3J0ZXIsIGlzIHN0aWxsIHN1cHBvcnRlZCB2aWEKKyAgICAgICAgICAgIC8vIGFuIGFkYXB0ZXIuIEp1c3QgdXNlIFJFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgYWRhcHRlci4KKyAgICAgICAgICAgIC8vIEhvd2V2ZXIgcGxlYXNlIGNvbnNpZGVyIHVwZGF0aW5nIHRvIHRoZSBuZXcgaW50ZXJmYWNlIGFzIHRoZSBvbGQgb25lIGlzIG5vdworICAgICAgICAgICAgLy8gZGVwcmVjYXRlZCBhbmQgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIHF1aXRlIHNvb24hCisgICAgICAgICAgICAvLyBQbGVhc2UgY29udGFjdCBtZSB2aWEgZ2l0aHViIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYXQgYWxsIGFib3V0IHRoaXMuCisgICAgICAgICAgICAvLyBJbiBmYWN0LCBpZGVhbGx5LCBwbGVhc2UgY29udGFjdCBtZSBhbnl3YXkgdG8gbGV0IG1lIGtub3cgeW91J3ZlIGhpdCB0aGlzIC0gYXMgSSBoYXZlCisgICAgICAgICAgICAvLyBubyBpZGVhIHdobyBpcyBhY3R1YWxseSB1c2luZyBjdXN0b20gcmVwb3J0ZXJzIGF0IGFsbCAocG9zc2libHkgbm8tb25lISkuCisgICAgICAgICAgICAvLyBUaGUgbmV3IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBtaW5pbWlzZSBleHBvc3VyZSB0byBpbnRlcmZhY2UgY2hhbmdlcyBpbiB0aGUgZnV0dXJlLgorICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFQoIGNvbmZpZyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBUOjpnZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIFJlcG9ydGVyUmVnaXN0cmFyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIG5ldyBSZXBvcnRlckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgTGlzdGVuZXJSZWdpc3RyYXIgeworCisgICAgICAgIGNsYXNzIExpc3RlbmVyRmFjdG9yeSA6IHB1YmxpYyBTaGFyZWRJbXBsPElSZXBvcnRlckZhY3Rvcnk+IHsKKworICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFQoIGNvbmZpZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBMaXN0ZW5lclJlZ2lzdHJhcigpIHsKKyAgICAgICAgICAgIGdldE11dGFibGVSZWdpc3RyeUh1YigpLnJlZ2lzdGVyTGlzdGVuZXIoIG5ldyBMaXN0ZW5lckZhY3RvcnkoKSApOworICAgICAgICB9CisgICAgfTsKK30KKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpMZWdhY3lSZXBvcnRlclJlZ2lzdHJhcjxyZXBvcnRlclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjcmVwb3J0ZXJUeXBlKCBuYW1lICk7IH0KKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6OlJlcG9ydGVyUmVnaXN0cmFyPHJlcG9ydGVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNyZXBvcnRlclR5cGUoIG5hbWUgKTsgfQorCisvLyBEZXByZWNhdGVkIC0gdXNlIHRoZSBmb3JtIHdpdGhvdXQgSU5URVJOQUxfCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xJU1RFTkVSKCBsaXN0ZW5lclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGlzdGVuZXJSZWdpc3RyYXI8bGlzdGVuZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI2xpc3RlbmVyVHlwZTsgfQorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX0xJU1RFTkVSKCBsaXN0ZW5lclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGlzdGVuZXJSZWdpc3RyYXI8bGlzdGVuZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI2xpc3RlbmVyVHlwZTsgfQorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vaW50ZXJuYWwvY2F0Y2hfeG1sd3JpdGVyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfWE1MV1JJVEVSX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGlvbWFuaXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBYbWxFbmNvZGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBGb3JXaGF0IHsgRm9yVGV4dE5vZGVzLCBGb3JBdHRyaWJ1dGVzIH07CisKKyAgICAgICAgWG1sRW5jb2RlKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBGb3JXaGF0IGZvcldoYXQgPSBGb3JUZXh0Tm9kZXMgKQorICAgICAgICA6ICAgbV9zdHIoIHN0ciApLAorICAgICAgICAgICAgbV9mb3JXaGF0KCBmb3JXaGF0ICkKKyAgICAgICAge30KKworICAgICAgICB2b2lkIGVuY29kZVRvKCBzdGQ6Om9zdHJlYW0mIG9zICkgY29uc3QgeworCisgICAgICAgICAgICAvLyBBcG9zdHJvcGhlIGVzY2FwaW5nIG5vdCBuZWNlc3NhcnkgaWYgd2UgYWx3YXlzIHVzZSAiIHRvIHdyaXRlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIC8vIChzZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jc3ludGF4KQorCisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9zdHIuc2l6ZSgpOyArKyBpICkgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IG1fc3RyW2ldOworICAgICAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPCc6ICAgb3MgPDwgIiZsdDsiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnJic6ICAgb3MgPDwgIiZhbXA7IjsgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL3htbC8jc3ludGF4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA+IDIgJiYgbV9zdHJbaS0xXSA9PSAnXScgJiYgbV9zdHJbaS0yXSA9PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICImZ3Q7IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1fZm9yV2hhdCA9PSBGb3JBdHRyaWJ1dGVzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJnF1b3Q7IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBjb250cm9sIGNoYXJzIC0gYmFzZWQgb24gY29udHJpYnV0aW9uIGJ5IEBlc3BlbmFsYiBpbiBQUiAjNDY1IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgQG1ycGkgUFIgIzU4OAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIGMgPj0gMCAmJiBjIDwgJ1x4MDknICkgfHwgKCBjID4gJ1x4MEQnICYmIGMgPCAnXHgyMCcpIHx8IGM9PSdceDdGJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDQxMDcvd2h5LWFyZS1jb250cm9sLWNoYXJhY3RlcnMtaWxsZWdhbC1pbi14bWwtMS0wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIlxceCIgPDwgc3RkOjp1cHBlcmNhc2UgPDwgc3RkOjpoZXggPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PiggYyApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8IGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBYbWxFbmNvZGUgY29uc3QmIHhtbEVuY29kZSApIHsKKyAgICAgICAgICAgIHhtbEVuY29kZS5lbmNvZGVUbyggb3MgKTsKKyAgICAgICAgICAgIHJldHVybiBvczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9zdHI7CisgICAgICAgIEZvcldoYXQgbV9mb3JXaGF0OworICAgIH07CisKKyAgICBjbGFzcyBYbWxXcml0ZXIgeworICAgIHB1YmxpYzoKKworICAgICAgICBjbGFzcyBTY29wZWRFbGVtZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgU2NvcGVkRWxlbWVudCggWG1sV3JpdGVyKiB3cml0ZXIgKQorICAgICAgICAgICAgOiAgIG1fd3JpdGVyKCB3cml0ZXIgKQorICAgICAgICAgICAge30KKworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCggU2NvcGVkRWxlbWVudCBjb25zdCYgb3RoZXIgKQorICAgICAgICAgICAgOiAgIG1fd3JpdGVyKCBvdGhlci5tX3dyaXRlciApeworICAgICAgICAgICAgICAgIG90aGVyLm1fd3JpdGVyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgflNjb3BlZEVsZW1lbnQoKSB7CisgICAgICAgICAgICAgICAgaWYoIG1fd3JpdGVyICkKKyAgICAgICAgICAgICAgICAgICAgbV93cml0ZXItPmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCYgd3JpdGVUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgYm9vbCBpbmRlbnQgPSB0cnVlICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZVRleHQoIHRleHQsIGluZGVudCApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQmIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgVCBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgICAgIG1fd3JpdGVyLT53cml0ZUF0dHJpYnV0ZSggbmFtZSwgYXR0cmlidXRlICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBtdXRhYmxlIFhtbFdyaXRlciogbV93cml0ZXI7CisgICAgICAgIH07CisKKyAgICAgICAgWG1sV3JpdGVyKCkKKyAgICAgICAgOiAgIG1fdGFnSXNPcGVuKCBmYWxzZSApLAorICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUoIGZhbHNlICksCisgICAgICAgICAgICBtX29zKCBDYXRjaDo6Y291dCgpICkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEZWNsYXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyKCBzdGQ6Om9zdHJlYW0mIG9zICkKKyAgICAgICAgOiAgIG1fdGFnSXNPcGVuKCBmYWxzZSApLAorICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUoIGZhbHNlICksCisgICAgICAgICAgICBtX29zKCBvcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIH5YbWxXcml0ZXIoKSB7CisgICAgICAgICAgICB3aGlsZSggIW1fdGFncy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBlbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHN0YXJ0RWxlbWVudCggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG5ld2xpbmVJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAnPCcgPDwgbmFtZTsKKyAgICAgICAgICAgIG1fdGFncy5wdXNoX2JhY2soIG5hbWUgKTsKKyAgICAgICAgICAgIG1faW5kZW50ICs9ICIgICI7CisgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBTY29wZWRFbGVtZW50IHNjb3BlZEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgU2NvcGVkRWxlbWVudCBzY29wZWQoIHRoaXMgKTsKKyAgICAgICAgICAgIHN0YXJ0RWxlbWVudCggbmFtZSApOworICAgICAgICAgICAgcmV0dXJuIHNjb3BlZDsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgZW5kRWxlbWVudCgpIHsKKyAgICAgICAgICAgIG5ld2xpbmVJZk5lY2Vzc2FyeSgpOworICAgICAgICAgICAgbV9pbmRlbnQgPSBtX2luZGVudC5zdWJzdHIoIDAsIG1faW5kZW50LnNpemUoKS0yICk7CisgICAgICAgICAgICBpZiggbV90YWdJc09wZW4gKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCAiLz4iOworICAgICAgICAgICAgICAgIG1fdGFnSXNPcGVuID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICI8LyIgPDwgbV90YWdzLmJhY2soKSA8PCAiPiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX29zIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIG1fdGFncy5wb3BfYmFjaygpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBpZiggIW5hbWUuZW1wdHkoKSAmJiAhYXR0cmlidXRlLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1fb3MgPDwgJyAnIDw8IG5hbWUgPDwgIj1cIiIgPDwgWG1sRW5jb2RlKCBhdHRyaWJ1dGUsIFhtbEVuY29kZTo6Rm9yQXR0cmlidXRlcyApIDw8ICciJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBib29sIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIG1fb3MgPDwgJyAnIDw8IG5hbWUgPDwgIj1cIiIgPDwgKCBhdHRyaWJ1dGUgPyAidHJ1ZSIgOiAiZmFsc2UiICkgPDwgJyInOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFQgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgYXR0cmlidXRlOworICAgICAgICAgICAgcmV0dXJuIHdyaXRlQXR0cmlidXRlKCBuYW1lLCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCwgYm9vbCBpbmRlbnQgPSB0cnVlICkgeworICAgICAgICAgICAgaWYoICF0ZXh0LmVtcHR5KCkgKXsKKyAgICAgICAgICAgICAgICBib29sIHRhZ1dhc09wZW4gPSBtX3RhZ0lzT3BlbjsKKyAgICAgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgICAgICBpZiggdGFnV2FzT3BlbiAmJiBpbmRlbnQgKQorICAgICAgICAgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50OworICAgICAgICAgICAgICAgIG1fb3MgPDwgWG1sRW5jb2RlKCB0ZXh0ICk7CisgICAgICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiB3cml0ZUNvbW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0ZXh0ICkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBtX29zIDw8IG1faW5kZW50IDw8ICI8IS0tIiA8PCB0ZXh0IDw8ICItLT4iOworICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVN0eWxlc2hlZXRSZWYoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1cmwgKSB7CisgICAgICAgICAgICBtX29zIDw8ICI8P3htbC1zdHlsZXNoZWV0IHR5cGU9XCJ0ZXh0L3hzbFwiIGhyZWY9XCIiIDw8IHVybCA8PCAiXCI/PlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVCbGFua0xpbmUoKSB7CisgICAgICAgICAgICBlbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgJ1xuJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5zdXJlVGFnQ2xvc2VkKCkgeworICAgICAgICAgICAgaWYoIG1fdGFnSXNPcGVuICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgIj4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBYbWxXcml0ZXIoIFhtbFdyaXRlciBjb25zdCYgKTsKKyAgICAgICAgdm9pZCBvcGVyYXRvcj0oIFhtbFdyaXRlciBjb25zdCYgKTsKKworICAgICAgICB2b2lkIHdyaXRlRGVjbGFyYXRpb24oKSB7CisgICAgICAgICAgICBtX29zIDw8ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG5ld2xpbmVJZk5lY2Vzc2FyeSgpIHsKKyAgICAgICAgICAgIGlmKCBtX25lZWRzTmV3bGluZSApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBtX25lZWRzTmV3bGluZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBtX3RhZ0lzT3BlbjsKKyAgICAgICAgYm9vbCBtX25lZWRzTmV3bGluZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1fdGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9pbmRlbnQ7CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgbV9vczsKKyAgICB9OworCit9CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVlbmFibGVfd2FybmluZ3MuaAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRUVOQUJMRV9XQVJOSU5HU19IX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyMgICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVzIHRoZSBfX2NsYW5nX18gbWFjcm8KKyMgICAgICAgIHByYWdtYSB3YXJuaW5nKHBvcCkKKyMgICAgZWxzZQorIyAgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjICAgIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgWG1sUmVwb3J0ZXIgOiBwdWJsaWMgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFhtbFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKKyAgICAgICAgICAgIG1feG1sKF9jb25maWcuc3RyZWFtKCkpLAorICAgICAgICAgICAgbV9zZWN0aW9uRGVwdGgoIDAgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+WG1sUmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGFzIGFuIFhNTCBkb2N1bWVudCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFN0eWxlc2hlZXRSZWYoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTb3VyY2VJbmZvKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgc291cmNlSW5mbyApIHsKKyAgICAgICAgICAgIG1feG1sCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmlsZW5hbWUiLCBzb3VyY2VJbmZvLmZpbGUgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImxpbmUiLCBzb3VyY2VJbmZvLmxpbmUgKTsKKyAgICAgICAgfQorCisgICAgcHVibGljOiAvLyBTdHJlYW1pbmdSZXBvcnRlckJhc2UKKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6Om5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1blN0YXJ0aW5nKCB0ZXN0SW5mbyApOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3R5bGVzaGVldFJlZiA9IGdldFN0eWxlc2hlZXRSZWYoKTsKKyAgICAgICAgICAgIGlmKCAhc3R5bGVzaGVldFJlZi5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC53cml0ZVN0eWxlc2hlZXRSZWYoIHN0eWxlc2hlZXRSZWYgKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkNhdGNoIiApOworICAgICAgICAgICAgaWYoICFtX2NvbmZpZy0+bmFtZSgpLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIG1fY29uZmlnLT5uYW1lKCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkdyb3VwIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIGdyb3VwSW5mby5uYW1lICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VTdGFydGluZyh0ZXN0SW5mbyk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJUZXN0Q2FzZSIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCB0cmltKCB0ZXN0SW5mby5uYW1lICkgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImRlc2NyaXB0aW9uIiwgdGVzdEluZm8uZGVzY3JpcHRpb24gKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInRhZ3MiLCB0ZXN0SW5mby50YWdzQXNTdHJpbmcgKTsKKworICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCB0ZXN0SW5mby5saW5lSW5mbyApOworCisgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlVGltZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIG1feG1sLmVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisgICAgICAgICAgICBpZiggbV9zZWN0aW9uRGVwdGgrKyA+IDAgKSB7CisgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiU2VjdGlvbiIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggc2VjdGlvbkluZm8ubmFtZSApICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZGVzY3JpcHRpb24iLCBzZWN0aW9uSW5mby5kZXNjcmlwdGlvbiApOworICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggc2VjdGlvbkluZm8ubGluZUluZm8gKTsKKyAgICAgICAgICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7IH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgaW5jbHVkZVJlc3VsdHMgPSBtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgfHwgIXJlc3VsdC5pc09rKCk7CisKKyAgICAgICAgICAgIGlmKCBpbmNsdWRlUmVzdWx0cyApIHsKKyAgICAgICAgICAgICAgICAvLyBQcmludCBhbnkgaW5mbyBtZXNzYWdlcyBpbiA8SW5mbz4gdGFncy4KKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuYmVnaW4oKSwgaXRFbmQgPSBhc3NlcnRpb25TdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiSW5mbyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCBpdC0+bWVzc2FnZSApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6Oldhcm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiV2FybmluZyIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCBpdC0+bWVzc2FnZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYnV0IHdlJ3JlIG5vdCBwcmludGluZyB0aGVtLgorICAgICAgICAgICAgaWYoICFpbmNsdWRlUmVzdWx0cyAmJiByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIC8vIFByaW50IHRoZSBleHByZXNzaW9uIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4cHJlc3Npb24iICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2VzcyIsIHJlc3VsdC5zdWNjZWVkZWQoKSApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInR5cGUiLCByZXN1bHQuZ2V0VGVzdE1hY3JvTmFtZSgpICk7CisKKyAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKworICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPcmlnaW5hbCIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0RXhwcmVzc2lvbigpICk7CisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkV4cGFuZGVkIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBbmQuLi4gUHJpbnQgYSByZXN1bHQgYXBwbGljYWJsZSB0byBlYWNoIHJlc3VsdCB0eXBlLgorICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiRXhjZXB0aW9uIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkZhdGFsRXJyb3JDb25kaXRpb24iICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgIC8vIFdhcm5pbmcgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkZhaWx1cmUiICk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggcmVzdWx0LmdldFNvdXJjZUluZm8oKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC53cml0ZVRleHQoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKQorICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIHNlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgICAgIGlmKCAtLW1fc2VjdGlvbkRlcHRoID4gMCApIHsKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKTsKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMucGFzc2VkICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMuZmFpbGVkICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCBzZWN0aW9uU3RhdHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworCisgICAgICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJkdXJhdGlvbkluU2Vjb25kcyIsIHNlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcyApOworCisgICAgICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlRW5kZWQoIHRlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0gbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHQiICk7CisgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAic3VjY2VzcyIsIHRlc3RDYXNlU3RhdHMudG90YWxzLmFzc2VydGlvbnMuYWxsT2soKSApOworCisgICAgICAgICAgICBpZiAoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkKKyAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZHVyYXRpb25JblNlY29uZHMiLCBtX3Rlc3RDYXNlVGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKSApOworCisgICAgICAgICAgICBpZiggIXRlc3RDYXNlU3RhdHMuc3RkT3V0LmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJTdGRPdXQiICkud3JpdGVUZXh0KCB0cmltKCB0ZXN0Q2FzZVN0YXRzLnN0ZE91dCApLCBmYWxzZSApOworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZEVyci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiU3RkRXJyIiApLndyaXRlVGV4dCggdHJpbSggdGVzdENhc2VTdGF0cy5zdGRFcnIgKSwgZmFsc2UgKTsKKworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RHcm91cEVuZGVkKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGVzdEdyb3VwU3RhdHMuYWJvcnRpbmcgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0cyIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHRlc3RHcm91cFN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayApOworICAgICAgICAgICAgbV94bWwuZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggdGVzdFJ1blN0YXRzICk7CisgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHRlc3RSdW5TdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImV4cGVjdGVkRmFpbHVyZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVGltZXIgbV90ZXN0Q2FzZVRpbWVyOworICAgICAgICBYbWxXcml0ZXIgbV94bWw7CisgICAgICAgIGludCBtX3NlY3Rpb25EZXB0aDsKKyAgICB9OworCisgICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAieG1sIiwgWG1sUmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9qdW5pdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0pVTklUX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGltZXN0YW1wKCkgeworICAgICAgICAgICAgLy8gQmV3YXJlLCB0aGlzIGlzIG5vdCByZWVudHJhbnQgYmVjYXVzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlzc3VlcworICAgICAgICAgICAgLy8gQWxzbywgVVRDIG9ubHksIGFnYWluIGJlY2F1c2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoJXogaXMgQysrMTEpCisgICAgICAgICAgICB0aW1lX3QgcmF3dGltZTsKKyAgICAgICAgICAgIHN0ZDo6dGltZSgmcmF3dGltZSk7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgdGltZVN0YW1wU2l6ZSA9IHNpemVvZigiMjAxNy0wMS0xNlQxNzowNjo0NVoiKTsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzdGQ6OnRtIHRpbWVJbmZvID0ge307CisgICAgICAgICAgICBnbXRpbWVfcygmdGltZUluZm8sICZyYXd0aW1lKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnRtKiB0aW1lSW5mbzsKKyAgICAgICAgICAgIHRpbWVJbmZvID0gc3RkOjpnbXRpbWUoJnJhd3RpbWUpOworI2VuZGlmCisKKyAgICAgICAgICAgIGNoYXIgdGltZVN0YW1wW3RpbWVTdGFtcFNpemVdOworICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IGZtdCA9ICIlWS0lbS0lZFQlSDolTTolU1oiOworCisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHN0ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXplLCBmbXQsICZ0aW1lSW5mbyk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjpzdHJmdGltZSh0aW1lU3RhbXAsIHRpbWVTdGFtcFNpemUsIGZtdCwgdGltZUluZm8pOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcodGltZVN0YW1wKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgY2xhc3MgSnVuaXRSZXBvcnRlciA6IHB1YmxpYyBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEp1bml0UmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKKyAgICAgICAgICAgIHhtbCggX2NvbmZpZy5zdHJlYW0oKSApLAorICAgICAgICAgICAgbV9va1RvRmFpbCggZmFsc2UgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3JlcG9ydGVyUHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+SnVuaXRSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgaW4gYW4gWE1MIGZvcm1hdCB0aGF0IGxvb2tzIGxpa2UgQW50J3MganVuaXRyZXBvcnQgdGFyZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgLypzcGVjKi8gKSBDQVRDSF9PVkVSUklERSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiBydW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdFJ1blN0YXJ0aW5nKCBydW5JbmZvICk7CisgICAgICAgICAgICB4bWwuc3RhcnRFbGVtZW50KCAidGVzdHN1aXRlcyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdWl0ZVRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBzdGRPdXRGb3JTdWl0ZS5zdHIoIiIpOworICAgICAgICAgICAgc3RkRXJyRm9yU3VpdGUuc3RyKCIiKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb25zID0gMDsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fb2tUb0ZhaWwgPSB0ZXN0Q2FzZUluZm8ub2tUb0ZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gJiYgIW1fb2tUb0ZhaWwgKQorICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRFeGNlcHRpb25zKys7CisgICAgICAgICAgICByZXR1cm4gQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6YXNzZXJ0aW9uRW5kZWQoIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN0ZE91dEZvclN1aXRlIDw8IHRlc3RDYXNlU3RhdHMuc3RkT3V0OworICAgICAgICAgICAgc3RkRXJyRm9yU3VpdGUgPDwgdGVzdENhc2VTdGF0cy5zdGRFcnI7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdWl0ZVRpbWUgPSBzdWl0ZVRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCk7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIHdyaXRlR3JvdXAoICptX3Rlc3RHcm91cHMuYmFjaygpLCBzdWl0ZVRpbWUgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgeG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVHcm91cCggVGVzdEdyb3VwTm9kZSBjb25zdCYgZ3JvdXBOb2RlLCBkb3VibGUgc3VpdGVUaW1lICkgeworICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggInRlc3RzdWl0ZSIgKTsKKyAgICAgICAgICAgIFRlc3RHcm91cFN0YXRzIGNvbnN0JiBzdGF0cyA9IGdyb3VwTm9kZS52YWx1ZTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBzdGF0cy5ncm91cEluZm8ubmFtZSApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiZXJyb3JzIiwgdW5leHBlY3RlZEV4Y2VwdGlvbnMgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgc3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLXVuZXhwZWN0ZWRFeGNlcHRpb25zICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0ZXN0cyIsIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImhvc3RuYW1lIiwgInRiZCIgKTsgLy8gIVRCRAorICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6TmV2ZXIgKQorICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWUiLCAiIiApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWUiLCBzdWl0ZVRpbWUgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWVzdGFtcCIsIGdldEN1cnJlbnRUaW1lc3RhbXAoKSApOworCisgICAgICAgICAgICAvLyBXcml0ZSB0ZXN0IGNhc2VzCisgICAgICAgICAgICBmb3IoIFRlc3RHcm91cE5vZGU6OkNoaWxkTm9kZXM6OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gZ3JvdXBOb2RlLmNoaWxkcmVuLmJlZ2luKCksIGl0RW5kID0gZ3JvdXBOb2RlLmNoaWxkcmVuLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgd3JpdGVUZXN0Q2FzZSggKippdCApOworCisgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1vdXQiICkud3JpdGVUZXh0KCB0cmltKCBzdGRPdXRGb3JTdWl0ZS5zdHIoKSApLCBmYWxzZSApOworICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tZXJyIiApLndyaXRlVGV4dCggdHJpbSggc3RkRXJyRm9yU3VpdGUuc3RyKCkgKSwgZmFsc2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVUZXN0Q2FzZSggVGVzdENhc2VOb2RlIGNvbnN0JiB0ZXN0Q2FzZU5vZGUgKSB7CisgICAgICAgICAgICBUZXN0Q2FzZVN0YXRzIGNvbnN0JiBzdGF0cyA9IHRlc3RDYXNlTm9kZS52YWx1ZTsKKworICAgICAgICAgICAgLy8gQWxsIHRlc3QgY2FzZXMgaGF2ZSBleGFjdGx5IG9uZSBzZWN0aW9uIC0gd2hpY2ggcmVwcmVzZW50cyB0aGUKKyAgICAgICAgICAgIC8vIHRlc3QgY2FzZSBpdHNlbGYuIFRoYXQgc2VjdGlvbiBtYXkgaGF2ZSAwLW4gbmVzdGVkIHNlY3Rpb25zCisgICAgICAgICAgICBhc3NlcnQoIHRlc3RDYXNlTm9kZS5jaGlsZHJlbi5zaXplKCkgPT0gMSApOworICAgICAgICAgICAgU2VjdGlvbk5vZGUgY29uc3QmIHJvb3RTZWN0aW9uID0gKnRlc3RDYXNlTm9kZS5jaGlsZHJlbi5mcm9udCgpOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWUgPSBzdGF0cy50ZXN0SW5mby5jbGFzc05hbWU7CisKKyAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggcm9vdFNlY3Rpb24uY2hpbGRTZWN0aW9ucy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gImdsb2JhbCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZVNlY3Rpb24oIGNsYXNzTmFtZSwgIiIsIHJvb3RTZWN0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU2VjdGlvbiggIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiBzZWN0aW9uTm9kZSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0cmltKCBzZWN0aW9uTm9kZS5zdGF0cy5zZWN0aW9uSW5mby5uYW1lICk7CisgICAgICAgICAgICBpZiggIXJvb3ROYW1lLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIG5hbWUgPSByb290TmFtZSArICcvJyArIG5hbWU7CisKKyAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5lbXB0eSgpIHx8CisgICAgICAgICAgICAgICAgIXNlY3Rpb25Ob2RlLnN0ZE91dC5lbXB0eSgpIHx8CisgICAgICAgICAgICAgICAgIXNlY3Rpb25Ob2RlLnN0ZEVyci5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoICJ0ZXN0Y2FzZSIgKTsKKyAgICAgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibmFtZSIsICJyb290IiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAiY2xhc3NuYW1lIiwgY2xhc3NOYW1lICk7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBuYW1lICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInRpbWUiLCBDYXRjaDo6dG9TdHJpbmcoIHNlY3Rpb25Ob2RlLnN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzICkgKTsKKworICAgICAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9ucyggc2VjdGlvbk5vZGUgKTsKKworICAgICAgICAgICAgICAgIGlmKCAhc2VjdGlvbk5vZGUuc3RkT3V0LmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICB4bWwuc2NvcGVkRWxlbWVudCggInN5c3RlbS1vdXQiICkud3JpdGVUZXh0KCB0cmltKCBzZWN0aW9uTm9kZS5zdGRPdXQgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLnN0ZEVyci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tZXJyIiApLndyaXRlVGV4dCggdHJpbSggc2VjdGlvbk5vZGUuc3RkRXJyICksIGZhbHNlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIFNlY3Rpb25Ob2RlOjpDaGlsZFNlY3Rpb25zOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IHNlY3Rpb25Ob2RlLmNoaWxkU2VjdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBzZWN0aW9uTm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBuYW1lLCAiIiwgKippdCApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsIG5hbWUsICoqaXQgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVBc3NlcnRpb25zKCBTZWN0aW9uTm9kZSBjb25zdCYgc2VjdGlvbk5vZGUgKSB7CisgICAgICAgICAgICBmb3IoIFNlY3Rpb25Ob2RlOjpBc3NlcnRpb25zOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuYmVnaW4oKSwgaXRFbmQgPSBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgd3JpdGVBc3NlcnRpb24oICppdCApOworICAgICAgICB9CisgICAgICAgIHZvaWQgd3JpdGVBc3NlcnRpb24oIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0cyApIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gc3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworICAgICAgICAgICAgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGVsZW1lbnROYW1lOworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImVycm9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIHNlZSB0aGVzZSBoZXJlOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6SW5mbzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpPazoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYWlsdXJlQml0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiaW50ZXJuYWxFcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCBlbGVtZW50TmFtZSApOworCisgICAgICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAibWVzc2FnZSIsIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggInR5cGUiLCByZXN1bHQuZ2V0VGVzdE1hY3JvTmFtZSgpICk7CisKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGlmKCAhcmVzdWx0LmdldE1lc3NhZ2UoKS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8IHJlc3VsdC5nZXRNZXNzYWdlKCkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gc3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IHN0YXRzLmluZm9NZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0LT50eXBlID09IFJlc3VsdFdhczo6SW5mbyApCisgICAgICAgICAgICAgICAgICAgICAgICBvc3MgPDwgaXQtPm1lc3NhZ2UgPDwgJ1xuJzsKKworICAgICAgICAgICAgICAgIG9zcyA8PCAiYXQgIiA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpOworICAgICAgICAgICAgICAgIHhtbC53cml0ZVRleHQoIG9zcy5zdHIoKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciB4bWw7CisgICAgICAgIFRpbWVyIHN1aXRlVGltZXI7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdGRPdXRGb3JTdWl0ZTsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ZEVyckZvclN1aXRlOworICAgICAgICB1bnNpZ25lZCBpbnQgdW5leHBlY3RlZEV4Y2VwdGlvbnM7CisgICAgICAgIGJvb2wgbV9va1RvRmFpbDsKKyAgICB9OworCisgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJqdW5pdCIsIEp1bml0UmVwb3J0ZXIgKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9jb25zb2xlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVQT1JURVJfQ09OU09MRV9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNmbG9hdD4KKyNpbmNsdWRlIDxjc3RkaW8+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29uc29sZVJlcG9ydGVyIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKyAgICAgICAgQ29uc29sZVJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKSwKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCggZmFsc2UgKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgfkNvbnNvbGVSZXBvcnRlcigpIENBVENIX09WRVJSSURFOworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGFzIHBsYWluIGxpbmVzIG9mIHRleHQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0IGNhc2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IF9hc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQ7CisKKyAgICAgICAgICAgIGJvb2wgaW5jbHVkZVJlc3VsdHMgPSBtX2NvbmZpZy0+aW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgfHwgIXJlc3VsdC5pc09rKCk7CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBidXQgd2UncmUgbm90IHByaW50aW5nIHRoZW0uCisgICAgICAgICAgICBpZiggIWluY2x1ZGVSZXN1bHRzICYmIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGxhenlQcmludCgpOworCisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyIHByaW50ZXIoIHN0cmVhbSwgX2Fzc2VydGlvblN0YXRzLCBpbmNsdWRlUmVzdWx0cyApOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgpOworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIF9zZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uU3RhcnRpbmcoIF9zZWN0aW9uSW5mbyApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgX3NlY3Rpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBfc2VjdGlvblN0YXRzLm1pc3NpbmdBc3NlcnRpb25zICkgeworICAgICAgICAgICAgICAgIGxhenlQcmludCgpOworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiXG5ObyBhc3NlcnRpb25zIGluIHNlY3Rpb24iOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJcbk5vIGFzc2VydGlvbnMgaW4gdGVzdCBjYXNlIjsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgIidcbiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRGb3JtYXR0ZWREdXJhdGlvbihfc2VjdGlvblN0YXRzLmR1cmF0aW9uSW5TZWNvbmRzKSA8PCAiIHM6ICIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX2hlYWRlclByaW50ZWQgKSB7CisgICAgICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZCggX3NlY3Rpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIF90ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCBfdGVzdENhc2VTdGF0cyApOworICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgX3Rlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYoIGN1cnJlbnRHcm91cEluZm8udXNlZCApIHsKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlEaXZpZGVyKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJTdW1tYXJ5IGZvciBncm91cCAnIiA8PCBfdGVzdEdyb3VwU3RhdHMuZ3JvdXBJbmZvLm5hbWUgPDwgIic6XG4iOworICAgICAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdEdyb3VwU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggX3Rlc3RHcm91cFN0YXRzICk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiBfdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcHJpbnRUb3RhbHNEaXZpZGVyKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIF90ZXN0UnVuU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBjbGFzcyBBc3NlcnRpb25QcmludGVyIHsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9ICggQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYgKTsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICA6ICAgc3RyZWFtKCBfc3RyZWFtICksCisgICAgICAgICAgICAgICAgc3RhdHMoIF9zdGF0cyApLAorICAgICAgICAgICAgICAgIHJlc3VsdCggX3N0YXRzLmFzc2VydGlvblJlc3VsdCApLAorICAgICAgICAgICAgICAgIGNvbG91ciggQ29sb3VyOjpOb25lICksCisgICAgICAgICAgICAgICAgbWVzc2FnZSggcmVzdWx0LmdldE1lc3NhZ2UoKSApLAorICAgICAgICAgICAgICAgIG1lc3NhZ2VzKCBfc3RhdHMuaW5mb01lc3NhZ2VzICksCisgICAgICAgICAgICAgICAgcHJpbnRJbmZvTWVzc2FnZXMoIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OlN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIlBBU1NFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKCByZXN1bHQuaGFzTWVzc2FnZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6U3VjY2VzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCAtIGJ1dCB3YXMgb2siOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJkdWUgdG8gdW5leHBlY3RlZCBleGNlcHRpb24gd2l0aCAiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsICs9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsICs9ICJtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImR1ZSB0byBhIGZhdGFsIGVycm9yIGNvbmRpdGlvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImJlY2F1c2Ugbm8gZXhjZXB0aW9uIHdhcyB0aHJvd24gd2hlcmUgb25lIHdhcyBleHBlY3RlZCI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiaW5mbyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2FybmluZyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImV4cGxpY2l0bHkgd2l0aCBtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIGFyZSBoZXJlIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYWlsdXJlQml0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICIqKiBpbnRlcm5hbCBlcnJvciAqKiI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50KCkgY29uc3QgeworICAgICAgICAgICAgICAgIHByaW50U291cmNlSW5mbygpOworICAgICAgICAgICAgICAgIGlmKCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZXN1bHRUeXBlKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhcGFzc09yRmFpbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcGFzc09yRmFpbCA8PCAiOlxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6T3JpZ2luYWxFeHByZXNzaW9uICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgIiAgIjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRFeHByZXNzaW9uSW5NYWNybygpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHBhbmRlZEV4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJ3aXRoIGV4cGFuc2lvbjpcbiI7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggcmVzdWx0LmdldEV4cGFuZGVkRXhwcmVzc2lvbigpLCBUZXh0QXR0cmlidXRlcygpLnNldEluZGVudCgyKSApIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludE1lc3NhZ2UoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFtZXNzYWdlTGFiZWwuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBtZXNzYWdlTGFiZWwgPDwgJzonIDw8ICdcbic7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuYmVnaW4oKSwgaXRFbmQgPSBtZXNzYWdlcy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gaXMgYSB3YXJuaW5nIGlnbm9yZSBhbnkgSU5GTyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICBpZiggcHJpbnRJbmZvTWVzc2FnZXMgfHwgaXQtPnR5cGUgIT0gUmVzdWx0V2FzOjpJbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBUZXh0KCBpdC0+bWVzc2FnZSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpIDw8ICI6ICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtOworICAgICAgICAgICAgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIHN0YXRzOworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQ7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGFzc09yRmFpbDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2VMYWJlbDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbWVzc2FnZXM7CisgICAgICAgICAgICBib29sIHByaW50SW5mb01lc3NhZ2VzOworICAgICAgICB9OworCisgICAgICAgIHZvaWQgbGF6eVByaW50KCkgeworCisgICAgICAgICAgICBpZiggIWN1cnJlbnRUZXN0UnVuSW5mby51c2VkICkKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnRSdW5JbmZvKCk7CisgICAgICAgICAgICBpZiggIWN1cnJlbnRHcm91cEluZm8udXNlZCApCisgICAgICAgICAgICAgICAgbGF6eVByaW50R3JvdXBJbmZvKCk7CisKKyAgICAgICAgICAgIGlmKCAhbV9oZWFkZXJQcmludGVkICkgeworICAgICAgICAgICAgICAgIHByaW50VGVzdENhc2VBbmRTZWN0aW9uSGVhZGVyKCk7CisgICAgICAgICAgICAgICAgbV9oZWFkZXJQcmludGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIGxhenlQcmludFJ1bkluZm8oKSB7CisgICAgICAgICAgICBzdHJlYW0gIDw8ICdcbicgPDwgZ2V0TGluZU9mQ2hhcnM8J34nPigpIDw8ICdcbic7CisgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlNlY29uZGFyeVRleHQgKTsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgY3VycmVudFRlc3RSdW5JbmZvLT5uYW1lCisgICAgICAgICAgICAgICAgICAgIDw8ICIgaXMgYSBDYXRjaCB2IiAgPDwgbGlicmFyeVZlcnNpb24oKSA8PCAiIGhvc3QgYXBwbGljYXRpb24uXG4iCisgICAgICAgICAgICAgICAgICAgIDw8ICJSdW4gd2l0aCAtPyBmb3Igb3B0aW9uc1xuXG4iOworCisgICAgICAgICAgICBpZiggbV9jb25maWctPnJuZ1NlZWQoKSAhPSAwICkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlJhbmRvbW5lc3Mgc2VlZGVkIHRvOiAiIDw8IG1fY29uZmlnLT5ybmdTZWVkKCkgPDwgIlxuXG4iOworCisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8udXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBsYXp5UHJpbnRHcm91cEluZm8oKSB7CisgICAgICAgICAgICBpZiggIWN1cnJlbnRHcm91cEluZm8tPm5hbWUuZW1wdHkoKSAmJiBjdXJyZW50R3JvdXBJbmZvLT5ncm91cHNDb3VudHMgPiAxICkgeworICAgICAgICAgICAgICAgIHByaW50Q2xvc2VkSGVhZGVyKCAiR3JvdXA6ICIgKyBjdXJyZW50R3JvdXBJbmZvLT5uYW1lICk7CisgICAgICAgICAgICAgICAgY3VycmVudEdyb3VwSW5mby51c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50VGVzdENhc2VBbmRTZWN0aW9uSGVhZGVyKCkgeworICAgICAgICAgICAgYXNzZXJ0KCAhbV9zZWN0aW9uU3RhY2suZW1wdHkoKSApOworICAgICAgICAgICAgcHJpbnRPcGVuSGVhZGVyKCBjdXJyZW50VGVzdENhc2VJbmZvLT5uYW1lICk7CisKKyAgICAgICAgICAgIGlmKCBtX3NlY3Rpb25TdGFjay5zaXplKCkgPiAxICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpIZWFkZXJzICk7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uSW5mbz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGl0ID0gbV9zZWN0aW9uU3RhY2suYmVnaW4oKSsxLCAvLyBTa2lwIGZpcnN0IHNlY3Rpb24gKHRlc3QgY2FzZSkKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBtX3NlY3Rpb25TdGFjay5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoIDsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgICAgICBwcmludEhlYWRlclN0cmluZyggaXQtPm5hbWUsIDIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm8gPSBtX3NlY3Rpb25TdGFjay5iYWNrKCkubGluZUluZm87CisKKyAgICAgICAgICAgIGlmKCAhbGluZUluZm8uZW1wdHkoKSApeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLic+KCkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50Q2xvc2VkSGVhZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSB7CisgICAgICAgICAgICBwcmludE9wZW5IZWFkZXIoIF9uYW1lICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy4nPigpIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludE9wZW5IZWFkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSApIHsKKyAgICAgICAgICAgIHN0cmVhbSAgPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkhlYWRlcnMgKTsKKyAgICAgICAgICAgICAgICBwcmludEhlYWRlclN0cmluZyggX25hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHN0cmluZyBoYXMgYSA6IGluIGZpcnN0IGxpbmUgd2lsbCBzZXQgaW5kZW50IHRvIGZvbGxvdyBpdCBvbgorICAgICAgICAvLyBzdWJzZXF1ZW50IGxpbmVzCisgICAgICAgIHZvaWQgcHJpbnRIZWFkZXJTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfc3RyaW5nLCBzdGQ6OnNpemVfdCBpbmRlbnQgPSAwICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgaSA9IF9zdHJpbmcuZmluZCggIjogIiApOworICAgICAgICAgICAgaWYoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGkrPTI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggX3N0cmluZywgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRlbnQoIGluZGVudCtpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbml0aWFsSW5kZW50KCBpbmRlbnQgKSApIDw8ICdcbic7CisgICAgICAgIH0KKworICAgICAgICBzdHJ1Y3QgU3VtbWFyeUNvbHVtbiB7CisKKyAgICAgICAgICAgIFN1bW1hcnlDb2x1bW4oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbGFiZWwsIENvbG91cjo6Q29kZSBfY29sb3VyICkKKyAgICAgICAgICAgIDogICBsYWJlbCggX2xhYmVsICksCisgICAgICAgICAgICAgICAgY29sb3VyKCBfY29sb3VyICkKKyAgICAgICAgICAgIHt9CisgICAgICAgICAgICBTdW1tYXJ5Q29sdW1uIGFkZFJvdyggc3RkOjpzaXplX3QgY291bnQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBvc3MgPDwgY291bnQ7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcm93ID0gb3NzLnN0cigpOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdCA9IHJvd3MuYmVnaW4oKTsgaXQgIT0gcm93cy5lbmQoKTsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGl0LT5zaXplKCkgPCByb3cuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICppdCA9ICcgJyArICppdDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGl0LT5zaXplKCkgPiByb3cuc2l6ZSgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9ICcgJyArIHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm93cy5wdXNoX2JhY2soIHJvdyApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbGFiZWw7CisgICAgICAgICAgICBDb2xvdXI6OkNvZGUgY29sb3VyOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJvd3M7CisKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIHByaW50VG90YWxzKCBUb3RhbHMgY29uc3QmIHRvdGFscyApIHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCAiTm8gdGVzdHMgcmFuXG4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgJiYgdG90YWxzLnRlc3RDYXNlcy5hbGxQYXNzZWQoKSApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKSA8PCAiQWxsIHRlc3RzIHBhc3NlZCI7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkLCAiYXNzZXJ0aW9uIiApIDw8ICIgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgInRlc3QgY2FzZSIgKSA8PCAnKScKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+IGNvbHVtbnM7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICIiLCBDb2xvdXI6Ok5vbmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJwYXNzZWQiLCBDb2xvdXI6OlN1Y2Nlc3MgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiZmFpbGVkIiwgQ29sb3VyOjpSZXN1bHRFcnJvciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApICk7CisgICAgICAgICAgICAgICAgY29sdW1ucy5wdXNoX2JhY2soIFN1bW1hcnlDb2x1bW4oICJmYWlsZWQgYXMgZXhwZWN0ZWQiLCBDb2xvdXI6OlJlc3VsdEV4cGVjdGVkRmFpbHVyZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWRCdXRPayApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKSApOworCisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5Um93KCAidGVzdCBjYXNlcyIsIGNvbHVtbnMsIDAgKTsKKyAgICAgICAgICAgICAgICBwcmludFN1bW1hcnlSb3coICJhc3NlcnRpb25zIiwgY29sdW1ucywgMSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRTdW1tYXJ5Um93KCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwsIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+IGNvbnN0JiBjb2xzLCBzdGQ6OnNpemVfdCByb3cgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFN1bW1hcnlDb2x1bW4+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGNvbHMuYmVnaW4oKTsgaXQgIT0gY29scy5lbmQoKTsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGl0LT5yb3dzW3Jvd107CisgICAgICAgICAgICAgICAgaWYoIGl0LT5sYWJlbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbGFiZWwgPDwgIjogIjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHZhbHVlICE9ICIwIiApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8ICItIG5vbmUgLSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHZhbHVlICE9ICIwIiApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtICA8PCBDb2xvdXIoIENvbG91cjo6TGlnaHRHcmV5ICkgPDwgIiB8ICI7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgQ29sb3VyKCBpdC0+Y29sb3VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAnICcgPDwgaXQtPmxhYmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2l6ZV90IG1ha2VSYXRpbyggc3RkOjpzaXplX3QgbnVtYmVyLCBzdGQ6OnNpemVfdCB0b3RhbCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHJhdGlvID0gdG90YWwgPiAwID8gQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEggKiBudW1iZXIvIHRvdGFsIDogMDsKKyAgICAgICAgICAgIHJldHVybiAoIHJhdGlvID09IDAgJiYgbnVtYmVyID4gMCApID8gMSA6IHJhdGlvOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdCYgZmluZE1heCggc3RkOjpzaXplX3QmIGksIHN0ZDo6c2l6ZV90JiBqLCBzdGQ6OnNpemVfdCYgayApIHsKKyAgICAgICAgICAgIGlmKCBpID4gaiAmJiBpID4gayApCisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICBlbHNlIGlmKCBqID4gayApCisgICAgICAgICAgICAgICAgcmV0dXJuIGo7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGs7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50VG90YWxzRGl2aWRlciggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID4gMCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZEJ1dE9rUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkQnV0T2ssIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IHBhc3NlZFJhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCwgdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICk7CisgICAgICAgICAgICAgICAgd2hpbGUoIGZhaWxlZFJhdGlvICsgZmFpbGVkQnV0T2tSYXRpbyArIHBhc3NlZFJhdGlvIDwgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApCisgICAgICAgICAgICAgICAgICAgIGZpbmRNYXgoIGZhaWxlZFJhdGlvLCBmYWlsZWRCdXRPa1JhdGlvLCBwYXNzZWRSYXRpbyApKys7CisgICAgICAgICAgICAgICAgd2hpbGUoIGZhaWxlZFJhdGlvICsgZmFpbGVkQnV0T2tSYXRpbyArIHBhc3NlZFJhdGlvID4gQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApCisgICAgICAgICAgICAgICAgICAgIGZpbmRNYXgoIGZhaWxlZFJhdGlvLCBmYWlsZWRCdXRPa1JhdGlvLCBwYXNzZWRSYXRpbyApLS07CisKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OkVycm9yICkgPDwgc3RkOjpzdHJpbmcoIGZhaWxlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdEV4cGVjdGVkRmFpbHVyZSApIDw8IHN0ZDo6c3RyaW5nKCBmYWlsZWRCdXRPa1JhdGlvLCAnPScgKTsKKyAgICAgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy5hbGxQYXNzZWQoKSApCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApIDw8IHN0ZDo6c3RyaW5nKCBwYXNzZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlN1Y2Nlc3MgKSA8PCBzdGQ6OnN0cmluZyggcGFzc2VkUmF0aW8sICc9JyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgc3RkOjpzdHJpbmcoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEsICc9JyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFN1bW1hcnlEaXZpZGVyKCkgeworICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBib29sIG1faGVhZGVyUHJpbnRlZDsKKyAgICB9OworCisgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJjb25zb2xlIiwgQ29uc29sZVJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfY29tcGFjdC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0NPTVBBQ1RfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29tcGFjdFJlcG9ydGVyIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIHsKKworICAgICAgICBDb21wYWN0UmVwb3J0ZXIoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIF9jb25maWcgKQorICAgICAgICB7fQorCisgICAgICAgIHZpcnR1YWwgfkNvbXBhY3RSZXBvcnRlcigpOworCisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVwb3J0cyB0ZXN0IHJlc3VsdHMgb24gYSBzaW5nbGUgbGluZSwgc3VpdGFibGUgZm9yIElERXMiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgeworICAgICAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBwcmVmczsKKyAgICAgICAgICAgIHByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gcHJlZnM7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHNwZWMgKSB7CisgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3QgY2FzZXMgbWF0Y2hlZCAnIiA8PCBzcGVjIDw8ICdcJycgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiApIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX2Fzc2VydGlvblN0YXRzICkgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBfYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIHByaW50SW5mb01lc3NhZ2VzID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGFuZCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhvc2UKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpICYmIHJlc3VsdC5pc09rKCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgIT0gUmVzdWx0V2FzOjpXYXJuaW5nICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHByaW50SW5mb01lc3NhZ2VzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIgcHJpbnRlciggc3RyZWFtLCBfYXNzZXJ0aW9uU3RhdHMsIHByaW50SW5mb01lc3NhZ2VzICk7CisgICAgICAgICAgICBwcmludGVyLnByaW50KCk7CisKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoU2VjdGlvblN0YXRzIGNvbnN0JiBfc2VjdGlvblN0YXRzKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiAobV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oX3NlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcykgPDwgIiBzOiAiIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIF90ZXN0UnVuU3RhdHMgKSB7CisgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCBfdGVzdFJ1blN0YXRzICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNsYXNzIEFzc2VydGlvblByaW50ZXIgeworICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0gKCBBc3NlcnRpb25QcmludGVyIGNvbnN0JiApOworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyKCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0sIEFzc2VydGlvblN0YXRzIGNvbnN0JiBfc3RhdHMsIGJvb2wgX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIDogc3RyZWFtKCBfc3RyZWFtICkKKyAgICAgICAgICAgICwgc3RhdHMoIF9zdGF0cyApCisgICAgICAgICAgICAsIHJlc3VsdCggX3N0YXRzLmFzc2VydGlvblJlc3VsdCApCisgICAgICAgICAgICAsIG1lc3NhZ2VzKCBfc3RhdHMuaW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgICwgaXRNZXNzYWdlKCBfc3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCkgKQorICAgICAgICAgICAgLCBwcmludEluZm9NZXNzYWdlcyggX3ByaW50SW5mb01lc3NhZ2VzICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnQoKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTb3VyY2VJbmZvKCk7CisKKyAgICAgICAgICAgICAgICBpdE1lc3NhZ2UgPSBtZXNzYWdlcy5iZWdpbigpOworCisgICAgICAgICAgICAgICAgc3dpdGNoKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6UmVzdWx0U3VjY2VzcywgcGFzc2VkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcyggQ29sb3VyOjpOb25lICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5pc09rKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpSZXN1bHRTdWNjZXNzLCBmYWlsZWRTdHJpbmcoKSArIHN0ZDo6c3RyaW5nKCAiIC0gYnV0IHdhcyBvayIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50T3JpZ2luYWxFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggInVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdpdGggbWVzc2FnZToiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImZhdGFsIGVycm9yIGNvbmRpdGlvbiB3aXRoIG1lc3NhZ2U6IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJleHBlY3RlZCBleGNlcHRpb24sIGdvdCBub25lIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Tm9uZSwgImluZm8iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6V2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpOb25lLCAid2FybmluZyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZXhwbGljaXRseSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Tm9uZSApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIGFyZSBoZXJlIHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OlVua25vd246CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYWlsdXJlQml0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCAiKiogaW50ZXJuYWwgZXJyb3IgKioiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIC8vIENvbG91cjo6TGlnaHRHcmV5CisKKyAgICAgICAgICAgIHN0YXRpYyBDb2xvdXI6OkNvZGUgZGltQ29sb3VyKCkgeyByZXR1cm4gQ29sb3VyOjpGaWxlTmFtZTsgfQorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZmFpbGVkU3RyaW5nKCkgeyByZXR1cm4gIkZBSUxFRCI7IH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwYXNzZWRTdHJpbmcoKSB7IHJldHVybiAiUEFTU0VEIjsgfQorI2Vsc2UKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBmYWlsZWRTdHJpbmcoKSB7IHJldHVybiAiZmFpbGVkIjsgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBhc3NlZFN0cmluZygpIHsgcmV0dXJuICJwYXNzZWQiOyB9CisjZW5kaWYKKworICAgICAgICAgICAgdm9pZCBwcmludFNvdXJjZUluZm8oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgPDwgJzonOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpDb2RlIGNvbG91ciwgc3RkOjpzdHJpbmcgY29uc3QmIHBhc3NPckZhaWwgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzT3JGYWlsLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IHBhc3NPckZhaWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICc6JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRJc3N1ZSggc3RkOjpzdHJpbmcgY29uc3QmIGlzc3VlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgaXNzdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRFeHByZXNzaW9uV2FzKCkgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJzsnOworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgZXhwcmVzc2lvbiB3YXM6IjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCByZXN1bHQuZ2V0RXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBmb3I6ICI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRNZXNzYWdlKCkgeworICAgICAgICAgICAgICAgIGlmICggaXRNZXNzYWdlICE9IG1lc3NhZ2VzLmVuZCgpICkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiAnIiA8PCBpdE1lc3NhZ2UtPm1lc3NhZ2UgPDwgJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgKytpdE1lc3NhZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Q29kZSBjb2xvdXIgPSBkaW1Db2xvdXIoKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0TWVzc2FnZSA9PSBtZXNzYWdlcy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIC8vIHVzaW5nIG1lc3NhZ2VzLmVuZCgpIGRpcmVjdGx5IHlpZWxkcyBjb21waWxhdGlvbiBlcnJvcjoKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgTiA9IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90Piggc3RkOjpkaXN0YW5jZSggaXRNZXNzYWdlLCBpdEVuZCApICk7CisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIHdpdGggIiA8PCBwbHVyYWxpc2UoIE4sICJtZXNzYWdlIiApIDw8ICc6JzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoOyBpdE1lc3NhZ2UgIT0gaXRFbmQ7ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGFzc2VydGlvbiBpcyBhIHdhcm5pbmcgaWdub3JlIGFueSBJTkZPIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmludEluZm9NZXNzYWdlcyB8fCBpdE1lc3NhZ2UtPnR5cGUgIT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgaXRNZXNzYWdlLT5tZXNzYWdlIDw8ICdcJyc7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICsraXRNZXNzYWdlICE9IGl0RW5kICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiBhbmQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgICAgIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0czsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0OworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1lc3NhZ2VzOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdE1lc3NhZ2U7CisgICAgICAgICAgICBib29sIHByaW50SW5mb01lc3NhZ2VzOworICAgICAgICB9OworCisgICAgICAgIC8vIENvbG91ciwgbWVzc2FnZSB2YXJpYW50czoKKyAgICAgICAgLy8gLSB3aGl0ZTogTm8gdGVzdHMgcmFuLgorICAgICAgICAvLyAtICAgcmVkOiBGYWlsZWQgW2JvdGgvYWxsXSBOIHRlc3QgY2FzZXMsIGZhaWxlZCBbYm90aC9hbGxdIE0gYXNzZXJ0aW9ucy4KKyAgICAgICAgLy8gLSB3aGl0ZTogUGFzc2VkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2VzIChubyBhc3NlcnRpb25zKS4KKyAgICAgICAgLy8gLSAgIHJlZDogRmFpbGVkIE4gdGVzdHMgY2FzZXMsIGZhaWxlZCBNIGFzc2VydGlvbnMuCisgICAgICAgIC8vIC0gZ3JlZW46IFBhc3NlZCBbYm90aC9hbGxdIE4gdGVzdHMgY2FzZXMgd2l0aCBNIGFzc2VydGlvbnMuCisKKyAgICAgICAgc3RkOjpzdHJpbmcgYm90aE9yQWxsKCBzdGQ6OnNpemVfdCBjb3VudCApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudCA9PSAxID8gc3RkOjpzdHJpbmcoKSA6IGNvdW50ID09IDIgPyAiYm90aCAiIDogImFsbCAiIDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRUb3RhbHMoIGNvbnN0IFRvdGFscyYgdG90YWxzICkgY29uc3QgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdHMgcmFuLiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCA9PSB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHF1YWxpZnlfYXNzZXJ0aW9uc19mYWlsZWQgPQorICAgICAgICAgICAgICAgICAgICB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgPT0gdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBib3RoT3JBbGwoIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZCApIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgInRlc3QgY2FzZSIgICkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkICIgPDwgcXVhbGlmeV9hc3NlcnRpb25zX2ZhaWxlZCA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCksICJ0ZXN0IGNhc2UiICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgKG5vIGFzc2VydGlvbnMpLiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRFcnJvciApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkICIgPDwgcGx1cmFsaXNlKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZCwgInRlc3QgY2FzZSIgICkgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkICIgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJQYXNzZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsICJ0ZXN0IGNhc2UiICApIDw8CisgICAgICAgICAgICAgICAgICAgICIgd2l0aCAiICA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCwgImFzc2VydGlvbiIgKSA8PCAnLic7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoICJjb21wYWN0IiwgQ29tcGFjdFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgLy8gVGhlc2UgYXJlIGFsbCBoZXJlIHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0IG5vdCBoYXZpbmcgYW55IG91dCBvZiBsaW5lCisgICAgLy8gdmlydHVhbCBtZXRob2RzCisgICAgTm9uQ29weWFibGU6On5Ob25Db3B5YWJsZSgpIHt9CisgICAgSVNoYXJlZDo6fklTaGFyZWQoKSB7fQorICAgIElTdHJlYW06On5JU3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBGaWxlU3RyZWFtOjp+RmlsZVN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgQ291dFN0cmVhbTo6fkNvdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIERlYnVnT3V0U3RyZWFtOjp+RGVidWdPdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIFN0cmVhbUJ1ZkJhc2U6On5TdHJlYW1CdWZCYXNlKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBJQ29udGV4dDo6fklDb250ZXh0KCkge30KKyAgICBJUmVzdWx0Q2FwdHVyZTo6fklSZXN1bHRDYXB0dXJlKCkge30KKyAgICBJVGVzdENhc2U6On5JVGVzdENhc2UoKSB7fQorICAgIElUZXN0Q2FzZVJlZ2lzdHJ5Ojp+SVRlc3RDYXNlUmVnaXN0cnkoKSB7fQorICAgIElSZWdpc3RyeUh1Yjo6fklSZWdpc3RyeUh1YigpIHt9CisgICAgSU11dGFibGVSZWdpc3RyeUh1Yjo6fklNdXRhYmxlUmVnaXN0cnlIdWIoKSB7fQorICAgIElFeGNlcHRpb25UcmFuc2xhdG9yOjp+SUV4Y2VwdGlvblRyYW5zbGF0b3IoKSB7fQorICAgIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk6On5JRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkge30KKyAgICBJUmVwb3J0ZXI6On5JUmVwb3J0ZXIoKSB7fQorICAgIElSZXBvcnRlckZhY3Rvcnk6On5JUmVwb3J0ZXJGYWN0b3J5KCkge30KKyAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6fklSZXBvcnRlclJlZ2lzdHJ5KCkge30KKyAgICBJU3RyZWFtaW5nUmVwb3J0ZXI6On5JU3RyZWFtaW5nUmVwb3J0ZXIoKSB7fQorICAgIEFzc2VydGlvblN0YXRzOjp+QXNzZXJ0aW9uU3RhdHMoKSB7fQorICAgIFNlY3Rpb25TdGF0czo6flNlY3Rpb25TdGF0cygpIHt9CisgICAgVGVzdENhc2VTdGF0czo6flRlc3RDYXNlU3RhdHMoKSB7fQorICAgIFRlc3RHcm91cFN0YXRzOjp+VGVzdEdyb3VwU3RhdHMoKSB7fQorICAgIFRlc3RSdW5TdGF0czo6flRlc3RSdW5TdGF0cygpIHt9CisgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6U2VjdGlvbk5vZGU6On5TZWN0aW9uTm9kZSgpIHt9CisgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6fkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKSB7fQorCisgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp+U3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCkge30KKyAgICBDb25zb2xlUmVwb3J0ZXI6On5Db25zb2xlUmVwb3J0ZXIoKSB7fQorICAgIENvbXBhY3RSZXBvcnRlcjo6fkNvbXBhY3RSZXBvcnRlcigpIHt9CisgICAgSVJ1bm5lcjo6fklSdW5uZXIoKSB7fQorICAgIElNdXRhYmxlQ29udGV4dDo6fklNdXRhYmxlQ29udGV4dCgpIHt9CisgICAgSUNvbmZpZzo6fklDb25maWcoKSB7fQorICAgIFhtbFJlcG9ydGVyOjp+WG1sUmVwb3J0ZXIoKSB7fQorICAgIEp1bml0UmVwb3J0ZXI6On5KdW5pdFJlcG9ydGVyKCkge30KKyAgICBUZXN0UmVnaXN0cnk6On5UZXN0UmVnaXN0cnkoKSB7fQorICAgIEZyZWVGdW5jdGlvblRlc3RDYXNlOjp+RnJlZUZ1bmN0aW9uVGVzdENhc2UoKSB7fQorICAgIElHZW5lcmF0b3JJbmZvOjp+SUdlbmVyYXRvckluZm8oKSB7fQorICAgIElHZW5lcmF0b3JzRm9yVGVzdDo6fklHZW5lcmF0b3JzRm9yVGVzdCgpIHt9CisgICAgV2lsZGNhcmRQYXR0ZXJuOjp+V2lsZGNhcmRQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6UGF0dGVybjo6flBhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpOYW1lUGF0dGVybjo6fk5hbWVQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6VGFnUGF0dGVybjo6flRhZ1BhdHRlcm4oKSB7fQorICAgIFRlc3RTcGVjOjpFeGNsdWRlZFBhdHRlcm46On5FeGNsdWRlZFBhdHRlcm4oKSB7fQorICAgIE1hdGNoZXJzOjpJbXBsOjpNYXRjaGVyVW50eXBlZEJhc2U6On5NYXRjaGVyVW50eXBlZEJhc2UoKSB7fQorCisgICAgdm9pZCBDb25maWc6OmR1bW15KCkge30KKworICAgIG5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nIHsKKyAgICAgICAgSVRyYWNrZXI6On5JVHJhY2tlcigpIHt9CisgICAgICAgIFRyYWNrZXJCYXNlOjp+VHJhY2tlckJhc2UoKSB7fQorICAgICAgICBTZWN0aW9uVHJhY2tlcjo6flNlY3Rpb25UcmFja2VyKCkge30KKyAgICAgICAgSW5kZXhUcmFja2VyOjp+SW5kZXhUcmFja2VyKCkge30KKyAgICB9Cit9CisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIENBVENIX0NPTkZJR19NQUlOCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfZGVmYXVsdF9tYWluLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfREVGQVVMVF9NQUlOX0hQUF9JTkNMVURFRAorCisjaWZuZGVmIF9fT0JKQ19fCisKKyNpZiBkZWZpbmVkKFdJTjMyKSAmJiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChET19OT1RfVVNFX1dNQUlOKQorLy8gU3RhbmRhcmQgQy9DKysgV2luMzIgVW5pY29kZSB3bWFpbiBlbnRyeSBwb2ludAorZXh0ZXJuICJDIiBpbnQgd21haW4gKGludCBhcmdjLCB3Y2hhcl90ICogYXJndltdLCB3Y2hhcl90ICogW10pIHsKKyNlbHNlCisvLyBTdGFuZGFyZCBDL0MrKyBtYWluIGVudHJ5IHBvaW50CitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pIHsKKyNlbmRpZgorCisJaW50IHJlc3VsdCA9IENhdGNoOjpTZXNzaW9uKCkucnVuKCBhcmdjLCBhcmd2ICk7CisgICAgcmV0dXJuICggcmVzdWx0IDwgMHhmZiA/IHJlc3VsdCA6IDB4ZmYgKTsKK30KKworI2Vsc2UgLy8gX19PQkpDX18KKworLy8gT2JqZWN0aXZlLUMgZW50cnkgcG9pbnQKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkgeworI2lmICFDQVRDSF9BUkNfRU5BQkxFRAorICAgIE5TQXV0b3JlbGVhc2VQb29sICogcG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOworI2VuZGlmCisKKyAgICBDYXRjaDo6cmVnaXN0ZXJUZXN0TWV0aG9kcygpOworICAgIGludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lvbigpLnJ1biggYXJnYywgKGNoYXIqIGNvbnN0Kilhcmd2ICk7CisKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKKyAgICBbcG9vbCBkcmFpbl07CisjZW5kaWYKKworICAgIHJldHVybiAoIHJlc3VsdCA8IDB4ZmYgPyByZXN1bHQgOiAweGZmICk7Cit9CisKKyNlbmRpZiAvLyBfX09CSkNfXworCisjZW5kaWYKKworI2lmZGVmIENMQVJBX0NPTkZJR19NQUlOX05PVF9ERUZJTkVECisjICB1bmRlZiBDTEFSQV9DT05GSUdfTUFJTgorI2VuZGlmCisKKy8vLy8vLworCisvLyBJZiB0aGlzIGNvbmZpZyBpZGVudGlmaWVyIGlzIGRlZmluZWQgdGhlbiBhbGwgQ0FUQ0ggbWFjcm9zIGFyZSBwcmVmaXhlZCB3aXRoIENBVENIXworI2lmZGVmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIENBVENIX1JFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIkNBVENIX1JFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIkNBVENIX1JFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1JFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9SRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciAgKQorI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USFJPV1MoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9SRVFVSVJFX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCAiIiwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNBVENIX1JFUVVJUkVfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDSyggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDSyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDQVRDSF9DSEVDS19GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLRURfSUYoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9JRiggIkNBVENIX0NIRUNLRURfSUYiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tFRF9FTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfRUxTRSggIkNBVENIX0NIRUNLRURfRUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19OT0ZBSUwoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfTk9GQUlMIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsLCBleHByICkKKworI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1MoIGV4cHIgKSAgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgIiIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDQVRDSF9DSEVDS19USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDQVRDSF9DSEVDS19USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS19OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9DSEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNBVENIX0NIRUNLX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBhcmcgKQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCAiQ0FUQ0hfUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZWxzZQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9SRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9JTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FUQ0hfV0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfV0FSTiIsIENhdGNoOjpSZXN1bHRXYXM6Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZGVmaW5lIENBVENIX1NDT1BFRF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfSU5GTyIsIG1zZyApCisjZGVmaW5lIENBVENIX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9DQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorI2RlZmluZSBDQVRDSF9TQ09QRURfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0NBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0UoIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RFU1RfQ0FTRSggRnVuY3Rpb24sIC4uLiApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfU0VDVElPTiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUxfQ0hFQ0soIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1NVQ0NFRUQoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1NVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2Vsc2UKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfVEVTVF9DQVNFKCBmdW5jdGlvbiwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggZnVuY3Rpb24sIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1zZyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMX0NIRUNLKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorICAgICNkZWZpbmUgQ0FUQ0hfU1VDQ0VFRCggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfU1VDQ0VFRCIsIENhdGNoOjpSZXN1bHRXYXM6Ok9rLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2VuZGlmCisjZGVmaW5lIENBVENIX0FOT05fVEVTVF9DQVNFKCkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoICIiLCAiIiApCisKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKworI2RlZmluZSBDQVRDSF9HRU5FUkFURSggZXhwcikgSU5URVJOQUxfQ0FUQ0hfR0VORVJBVEUoIGV4cHIgKQorCisvLyAiQkRELXN0eWxlIiBjb252ZW5pZW5jZSB3cmFwcGVycworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU8oIC4uLiApIENBVENIX1RFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgQ0FUQ0hfU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCBuYW1lLCB0YWdzICkgQ0FUQ0hfVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZGVmaW5lIENBVENIX1NDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCB0YWdzICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgbmFtZSwgdGFncyApCisjZW5kaWYKKyNkZWZpbmUgQ0FUQ0hfR0lWRU4oIGRlc2MgKSAgICBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIkdpdmVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfV0hFTiggZGVzYyApICAgICBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiBXaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfQU5EX1dIRU4oIGRlc2MgKSBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiAgQW5kOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfVEhFTiggZGVzYyApICAgICBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiBUaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQ0FUQ0hfQU5EX1RIRU4oIGRlc2MgKSBDQVRDSF9TRUNUSU9OKCBzdGQ6OnN0cmluZyggIiAgQW5kOiAiKSArIGRlc2MsICIiICkKKworLy8gSWYgQ0FUQ0hfQ09ORklHX1BSRUZJWF9BTEwgaXMgbm90IGRlZmluZWQgdGhlbiB0aGUgQ0FUQ0hfIHByZWZpeCBpcyBub3QgcmVxdWlyZWQKKyNlbHNlCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIFJFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIlJFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUX05PX1RSWSggIlJFUVVJUkVfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKworI2Vsc2UKKyNkZWZpbmUgUkVRVUlSRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJSRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgICkKKyNkZWZpbmUgUkVRVUlSRV9GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJSRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZW5kaWYKKworI2RlZmluZSBSRVFVSVJFX1RIUk9XUyggZXhwciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIlJFUVVJUkVfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsICIiLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJSRVFVSVJFX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIlJFUVVJUkVfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiUkVRVUlSRV9OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNIRUNLX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6RmFsc2VUZXN0LCBleHByICkKKyNkZWZpbmUgQ0hFQ0tFRF9JRiggZXhwciApIElOVEVSTkFMX0NBVENIX0lGKCAiQ0hFQ0tFRF9JRiIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS0VEX0VMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9FTFNFKCAiQ0hFQ0tFRF9FTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENIRUNLX05PRkFJTCggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDS19OT0ZBSUwiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwsIGV4cHIgKQorCisjZGVmaW5lIENIRUNLX1RIUk9XUyggZXhwciApICBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDSEVDS19USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCAiIiwgZXhwciApCisjZGVmaW5lIENIRUNLX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNIRUNLX1RIUk9XU19BUyIsIGV4Y2VwdGlvblR5cGUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19USFJPV1NfV0lUSCggZXhwciwgbWF0Y2hlciApIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNIRUNLX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbWF0Y2hlciwgZXhwciApCisjZGVmaW5lIENIRUNLX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIkNIRUNLX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKworI2RlZmluZSBDSEVDS19USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0hFQ0tfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGFyZyApCisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisjZGVmaW5lIFJFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoICJSRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbHNlCisjZGVmaW5lIFJFUVVJUkVfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIlJFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2VuZGlmCisKKyNkZWZpbmUgSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIklORk8iLCBtc2cgKQorI2RlZmluZSBXQVJOKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJXQVJOIiwgQ2F0Y2g6OlJlc3VsdFdhczo6V2FybmluZywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNkZWZpbmUgU0NPUEVEX0lORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJJTkZPIiwgbXNnICkKKyNkZWZpbmUgQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisjZGVmaW5lIFNDT1BFRF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNkZWZpbmUgVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggX19WQV9BUkdTX18gKQorI2RlZmluZSBURVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIC4uLiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBNRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIC4uLiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBSRUdJU1RFUl9URVNUX0NBU0UoIEZ1bmN0aW9uLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgU0VDVElPTiggLi4uICkgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggX19WQV9BUkdTX18gKQorI2RlZmluZSBGQUlMKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgX19WQV9BUkdTX18gKQorI2RlZmluZSBGQUlMX0NIRUNLKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNVQ0NFRUQoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIlNVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgVEVTVF9DQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBURVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBNRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBSRUdJU1RFUl9URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBTRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIEZBSUwoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtc2cgKQorICAgICNkZWZpbmUgRkFJTF9DSEVDSyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyAgICAjZGVmaW5lIFNVQ0NFRUQoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIlNVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNlbmRpZgorI2RlZmluZSBBTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAiIiwgIiIgKQorCisjZGVmaW5lIFJFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKyNkZWZpbmUgUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisKKyNkZWZpbmUgR0VORVJBVEUoIGV4cHIpIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkKKworI2VuZGlmCisKKyNkZWZpbmUgQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkgSU5URVJOQUxfQ0FUQ0hfVFJBTlNMQVRFX0VYQ0VQVElPTiggc2lnbmF0dXJlICkKKworLy8gIkJERC1zdHlsZSIgY29udmVuaWVuY2Ugd3JhcHBlcnMKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIFNDRU5BUklPKCAuLi4gKSBURVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBTQ0VOQVJJTyggbmFtZSwgdGFncyApIFRFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2RlZmluZSBTQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgdGFncyApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2VuZGlmCisjZGVmaW5lIEdJVkVOKCBkZXNjICkgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgIEdpdmVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgV0hFTiggZGVzYyApICAgICBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgIFdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBBTkRfV0hFTiggZGVzYyApIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCJBbmQgd2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIFRIRU4oIGRlc2MgKSAgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICBUaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQU5EX1RIRU4oIGRlc2MgKSBTRUNUSU9OKCBzdGQ6OnN0cmluZygiICAgICBBbmQ6ICIpICsgZGVzYywgIiIgKQorCit1c2luZyBDYXRjaDo6RGV0YWlsOjpBcHByb3g7CisKKyNlbmRpZiAvLyBUV09CTFVFQ1VCRVNfU0lOR0xFX0lOQ0xVREVfQ0FUQ0hfSFBQX0lOQ0xVREVECisKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjhjODM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzLmNjCkBAIC0wLDAgKzEsMzM5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgInRfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgiCisKK1RFU1RfQ0FTRSggInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGVudW0iLCAiW2Z1bmN0aW9uYWxdIiApCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2VudW1fZGF0YShwcm9ncmFtKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2VudW0qIHRlc3RfZW51bSA9IHBhaXIuc2Vjb25kOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IHRlc3RfZW51bS0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9lbnVtKG91dCwgdGVzdF9lbnVtKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgdGVzdF9lbnVtOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07CQorfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHZvaWQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX1RIUk9XUyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc3RyaW5nIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBib29sIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc2J5dGUgKGk4KSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pOF9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBzaG9ydCAoaTE2KSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMTZfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgaW50ZWdlciAoaTMyKSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pMzJfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgbG9uZyAoaTY0KSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pNjRfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgZG91YmxlIHdpdGggZXNjYXBpbmcga2V5d29yZCIsICJbZnVuY3Rpb25hbF0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKworICAgIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBwYWlyID0gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2RvdWJsZV9jb25zdF9kYXRhKGdlbik7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9jb25zdCogY29uc3RfID0gcGFpci5zZWNvbmQ7CisgICAgdmVjdG9yPHRfY29uc3QqPiBjb25zdHNfOworICAgIGNvbnN0c18ucHVzaF9iYWNrKGNvbnN0Xyk7CisKKyAgICBzdHJpbmcgZmlsZV9wYXRoID0gY29uc3RfLT5nZXRfbmFtZSgpICsgIi5jcyI7CisgICAgb2ZzdHJlYW0gb3V0OworICAgIG91dC5vcGVuKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmdlbmVyYXRlX2NvbnN0cyhvdXQsIGNvbnN0c18pKTsKKworICAgIG91dC5jbG9zZSgpOworCisgICAgc3RkOjppZnN0cmVhbSBpZnMoZmlsZV9wYXRoKTsKKyAgICBzdHJpbmcgYWN0dWFsX3Jlc3VsdCgoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KGlmcykpLCAoc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPGNoYXI+KCkpKTsKKyAgICBzdGQ6OnJlbW92ZShmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFKGV4cGVjdGVkX3Jlc3VsdCA9PSBhY3R1YWxfcmVzdWx0KTsKKworICAgIGRlbGV0ZSBjb25zdF87CisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjMTcwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjCkBAIC0wLDAgKzEsMjM3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgInRocmlmdC9jb21tb24uaCIKKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgInRfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmgiCisKK2NvbnN0IHN0cmluZyBUZXN0RGF0YUdlbmVyYXRvcjo6REVGQVVMVF9GSUxFX0hFQURFUiA9ICIvKioiICJcbiIKKyAgICAgICAgICAgICIgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoKSIgIlxuIgorICAgICAgICAgICAgIiAqIiAiXG4iCisgICAgICAgICAgICAiICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORyIgIlxuIgorICAgICAgICAgICAgIiAqICBAZ2VuZXJhdGVkIiAiXG4iCisgICAgICAgICAgICAiICovIjsKKworc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2VudW1fZGF0YSh0X3Byb2dyYW0qIHByb2dyYW0pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKworICAgICAgICAiXG4iCisgICAgICAgICJcbiIKKyAgICAgICAgIi8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIi8vLyBUZXN0RG9jXG4iCisgICAgICAgICIvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAicHVibGljIGVudW0gVGVzdE5hbWVcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgTm9uZSA9IDAsXG4iCisgICAgICAgICIgIEZpcnN0ID0gMSxcbiIKKyAgICAgICAgIiAgU2Vjb25kID0gMixcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X2VudW0qIGVudW1fID0gbmV3IHRfZW51bShwcm9ncmFtKTsKKyAgICBlbnVtXy0+c2V0X25hbWUoIlRlc3ROYW1lIik7CisgICAgZW51bV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIk5vbmUiLCAwKSk7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJGaXJzdCIsIDEpKTsKKyAgICBlbnVtXy0+YXBwZW5kKG5ldyB0X2VudW1fdmFsdWUoIlNlY29uZCIsIDIpKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPihleHBlY3RlZF9yZXN1bHQsIGVudW1fKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgidm9pZCIsIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X3N0cmluZygiVm9pZFZhbHVlIik7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInZvaWQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKyAKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHN0cmluZyBAc3RyaW5nID0gXCJTdHJpbmdWYWx1ZVwiO1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoInN0cmluZyIsIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfc3RyaW5nKCJTdHJpbmdWYWx1ZSIpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJzdHJpbmciLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGJvb2wgQGJvb2wgPSB0cnVlO1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImJvb2wiLCB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDEpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJib29sIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k4X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc2J5dGUgQHNieXRlID0gMTI3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoIkk4IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTgpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMTI3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic2J5dGUiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3Qgc2hvcnQgQHNob3J0ID0gMzI3Njc7XG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF90eXBlKiB0eXBlXyA9IG5ldyB0X2Jhc2VfdHlwZSgiaTE2IiwgdF9iYXNlX3R5cGU6OlRZUEVfSTE2KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDMyNzY3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic2hvcnQiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgaW50IEBpbnQgPSAyMTQ3NDgzNjQ3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImkzMiIsIHRfYmFzZV90eXBlOjpUWVBFX0kzMik7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigyMTQ3NDgzNjQ3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiaW50IiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2k2NF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGxvbmcgQGxvbmcgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImk2NCIsIHRfYmFzZV90eXBlOjpUWVBFX0k2NCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcig5MjIzMzcyMDM2ODU0Nzc1ODA3KTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAibG9uZyIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBkb3VibGUgQGRvdWJsZSA9IDkuMjIzMzdlKzE4O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImRvdWJsZSIsIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRSk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfZG91YmxlKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMSk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImRvdWJsZSIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmggYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZWFhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisKK2NsYXNzIFRlc3REYXRhR2VuZXJhdG9yCit7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHN0cmluZyBERUZBVUxUX0ZJTEVfSEVBREVSOworCisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IGdldF90ZXN0X2VudW1fZGF0YSh0X3Byb2dyYW0qIHByb2dyYW0pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfYm9vbF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pOF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pMTZfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2k2NF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworfTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNiZWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9oZWxwZXJzX3Rlc3RzLmNjCkBAIC0wLDAgKzEsMjA5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlIDx0aHJpZnQvZ2VuZXJhdGUvdF9uZXRjb3JlX2dlbmVyYXRvci5oPgorCit1c2luZyBzdGQ6OnZlY3RvcjsKKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgd2l0aG91dCBvcHRpb24gd2NmIHNob3VsZCByZXR1cm4gdmFsaWQgbmFtZXNwYWNlcyIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ1bmlvbiIsICJ1bmlvbiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICBzdHJpbmcgZXhwZWN0ZWRfbmFtZXNwYWNlcyA9ICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsgZW5kbDsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgPT0gZXhwZWN0ZWRfbmFtZXNwYWNlcyk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdHlwZV91c2luZ3MoKSB3aXRoIG9wdGlvbiB3Y2Ygc2hvdWxkIHJldHVybiB2YWxpZCBuYW1lc3BhY2VzIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgc3RyaW5nIGV4cGVjdGVkX25hbWVzcGFjZXNfd2NmID0gInVzaW5nIFN5c3RlbTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRleHQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLklPO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrcztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBUaHJpZnQ7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiIgKyBlbmRsOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSA9PSBleHBlY3RlZF9uYW1lc3BhY2VzX3djZik7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGNvbnRhaW5zIGxhdGVzdCBDIyBrZXl3b3JkcyB0byBub3JtYWxpemUgd2l0aCBAIiwgIltoZWxwZXJzXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworICAgIHZlY3RvcjxzdHJpbmc+IGN1cnJlbnRfa2V5d29yZHMgPSB7CisgICAgICAgIHsgImFic3RyYWN0IiB9LAorICAgICAgICB7ICJhcyIgfSwKKyAgICAgICAgeyAiYmFzZSIgfSwKKyAgICAgICAgeyAiYm9vbCIgfSwKKyAgICAgICAgeyAiYnJlYWsiIH0sCisgICAgICAgIHsgImJ5dGUiIH0sCisgICAgICAgIHsgImNhc2UiIH0sCisgICAgICAgIHsgImNhdGNoIiB9LAorICAgICAgICB7ICJjaGFyIiB9LAorICAgICAgICB7ICJjaGVja2VkIiB9LAorICAgICAgICB7ICJjbGFzcyIgfSwKKyAgICAgICAgeyAiY29uc3QiIH0sCisgICAgICAgIHsgImNvbnRpbnVlIiB9LAorICAgICAgICB7ICJkZWNpbWFsIiB9LAorICAgICAgICB7ICJkZWZhdWx0IiB9LAorICAgICAgICB7ICJkZWxlZ2F0ZSIgfSwKKyAgICAgICAgeyAiZG8iIH0sCisgICAgICAgIHsgImRvdWJsZSIgfSwKKyAgICAgICAgeyAiZWxzZSIgfSwKKyAgICAgICAgeyAiZW51bSIgfSwKKyAgICAgICAgeyAiZXZlbnQiIH0sCisgICAgICAgIHsgImV4cGxpY2l0IiB9LAorICAgICAgICB7ICJleHRlcm4iIH0sCisgICAgICAgIHsgImZhbHNlIiB9LAorICAgICAgICB7ICJmaW5hbGx5IiB9LAorICAgICAgICB7ICJmaXhlZCIgfSwKKyAgICAgICAgeyAiZmxvYXQiIH0sCisgICAgICAgIHsgImZvciIgfSwKKyAgICAgICAgeyAiZm9yZWFjaCIgfSwKKyAgICAgICAgeyAiZ290byIgfSwKKyAgICAgICAgeyAiaWYiIH0sCisgICAgICAgIHsgImltcGxpY2l0IiB9LAorICAgICAgICB7ICJpbiIgfSwKKyAgICAgICAgeyAiaW50IiB9LAorICAgICAgICB7ICJpbnRlcmZhY2UiIH0sCisgICAgICAgIHsgImludGVybmFsIiB9LAorICAgICAgICB7ICJpcyIgfSwKKyAgICAgICAgeyAibG9jayIgfSwKKyAgICAgICAgeyAibG9uZyIgfSwKKyAgICAgICAgeyAibmFtZXNwYWNlIiB9LAorICAgICAgICB7ICJuZXciIH0sCisgICAgICAgIHsgIm51bGwiIH0sCisgICAgICAgIHsgIm9iamVjdCIgfSwKKyAgICAgICAgeyAib3BlcmF0b3IiIH0sCisgICAgICAgIHsgIm91dCIgfSwKKyAgICAgICAgeyAib3ZlcnJpZGUiIH0sCisgICAgICAgIHsgInBhcmFtcyIgfSwKKyAgICAgICAgeyAicHJpdmF0ZSIgfSwKKyAgICAgICAgeyAicHJvdGVjdGVkIiB9LAorICAgICAgICB7ICJwdWJsaWMiIH0sCisgICAgICAgIHsgInJlYWRvbmx5IiB9LAorICAgICAgICB7ICJyZWYiIH0sCisgICAgICAgIHsgInJldHVybiIgfSwKKyAgICAgICAgeyAic2J5dGUiIH0sCisgICAgICAgIHsgInNlYWxlZCIgfSwKKyAgICAgICAgeyAic2hvcnQiIH0sCisgICAgICAgIHsgInNpemVvZiIgfSwKKyAgICAgICAgeyAic3RhY2thbGxvYyIgfSwKKyAgICAgICAgeyAic3RhdGljIiB9LAorICAgICAgICB7ICJzdHJpbmciIH0sCisgICAgICAgIHsgInN0cnVjdCIgfSwKKyAgICAgICAgeyAic3dpdGNoIiB9LAorICAgICAgICB7ICJ0aGlzIiB9LAorICAgICAgICB7ICJ0aHJvdyIgfSwKKyAgICAgICAgeyAidHJ1ZSIgfSwKKyAgICAgICAgeyAidHJ5IiB9LAorICAgICAgICB7ICJ0eXBlb2YiIH0sCisgICAgICAgIHsgInVpbnQiIH0sCisgICAgICAgIHsgInVsb25nIiB9LAorICAgICAgICB7ICJ1bmNoZWNrZWQiIH0sCisgICAgICAgIHsgInVuc2FmZSIgfSwKKyAgICAgICAgeyAidXNob3J0IiB9LAorICAgICAgICB7ICJ1c2luZyIgfSwKKyAgICAgICAgeyAidm9pZCIgfSwKKyAgICAgICAgeyAidm9sYXRpbGUiIH0sCisgICAgICAgIHsgIndoaWxlIiB9LAorICAgICAgICAvLyBDb250ZXh0dWFsIEtleXdvcmRzCisgICAgICAgIHsgImFkZCIgfSwKKyAgICAgICAgeyAiYWxpYXMiIH0sCisgICAgICAgIHsgImFzY2VuZGluZyIgfSwKKyAgICAgICAgeyAiYXN5bmMiIH0sCisgICAgICAgIHsgImF3YWl0IiB9LAorICAgICAgICB7ICJkZXNjZW5kaW5nIiB9LAorICAgICAgICB7ICJkeW5hbWljIiB9LAorICAgICAgICB7ICJmcm9tIiB9LAorICAgICAgICB7ICJnZXQiIH0sCisgICAgICAgIHsgImdsb2JhbCIgfSwKKyAgICAgICAgeyAiZ3JvdXAiIH0sCisgICAgICAgIHsgImludG8iIH0sCisgICAgICAgIHsgImpvaW4iIH0sCisgICAgICAgIHsgImxldCIgfSwKKyAgICAgICAgeyAib3JkZXJieSIgfSwKKyAgICAgICAgeyAicGFydGlhbCIgfSwKKyAgICAgICAgeyAicmVtb3ZlIiB9LAorICAgICAgICB7ICJzZWxlY3QiIH0sCisgICAgICAgIHsgInNldCIgfSwKKyAgICAgICAgeyAidmFsdWUiIH0sCisgICAgICAgIHsgInZhciIgfSwKKyAgICAgICAgeyAid2hlbiIgfSwKKyAgICAgICAgeyAid2hlcmUiIH0sCisgICAgICAgIHsgInlpZWxkIiB9CisgICAgfTsKKworICAgIHN0cmluZyBtaXNzZWRfa2V5d29yZHMgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworICAgIGdlbi0+aW5pdF9nZW5lcmF0b3IoKTsKKyAgICBtYXA8c3RyaW5nLCBpbnQ+IGdlbmVyYXRvcnNfa2V5d29yZHMgPSBnZW4tPmdldF9rZXl3b3Jkc19saXN0KCk7CisKKyAgICBmb3IgKHZlY3RvcjxzdHJpbmc+OjppdGVyYXRvciBpdCA9IGN1cnJlbnRfa2V5d29yZHMuYmVnaW4oKTsgaXQgIT0gY3VycmVudF9rZXl3b3Jkcy5lbmQoKTsgKytpdCkKKyAgICB7CisgICAgICAgIGlmIChnZW5lcmF0b3JzX2tleXdvcmRzLmZpbmQoKml0KSA9PSBnZW5lcmF0b3JzX2tleXdvcmRzLmVuZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBtaXNzZWRfa2V5d29yZHMgPSBtaXNzZWRfa2V5d29yZHMgKyAqaXQgKyAiLCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSRVFVSVJFKG1pc3NlZF9rZXl3b3JkcyA9PSAiIik7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9pbml0aWFsaXphdGlvbl90ZXN0cy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxNzczMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MKQEAgLTAsMCArMSw3NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKworVEVTVF9DQVNFKCAidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgdGhyb3cgZXJyb3Igd2l0aCB1bmtub3duIG9wdGlvbnMiLCAiW2luaXRpYWxpemF0aW9uXSIgKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJrZXlzIiwgImtleXMiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBudWxscHRyOworCisgICAgUkVRVUlSRV9USFJPV1MoZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpKTsJCisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOwkKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBjcmVhdGUgdmFsaWQgaW5zdGFuY2Ugd2l0aCB2YWxpZCBvcHRpb25zIiwgIltpbml0aWFsaXphdGlvbl0iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9LCB7ICJudWxsYWJsZSIsICJudWxsYWJsZSJ9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbnVsbHB0cjsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZykpOworICAgIFJFUVVJUkUoZ2VuICE9IG51bGxwdHIpOworICAgIFJFUVVJUkUoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+aXNfbnVsbGFibGVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfaGFzaGNvZGVfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFX0ZBTFNFKGdlbi0+aXNfc2VyaWFsaXplX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3VuaW9uX2VuYWJsZWQoKSk7CisKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIHBhc3MgaW5pdCBzdWNjZXNmdWxseSIsICJbaW5pdGlhbGl6YXRpb25dIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSx7ICJudWxsYWJsZSIsICJudWxsYWJsZSIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkVfTk9USFJPVyhnZW4tPmluaXRfZ2VuZXJhdG9yKCkpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjIGIvY29tcGlsZXIvY3BwL3Rlc3RzL3Rlc3RzX21haW4uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFkMDliOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjCkBAIC0wLDAgKzEsMTkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNkZWZpbmUgQ0FUQ0hfQ09ORklHX01BSU4KKyNpbmNsdWRlICJjYXRjaC9jYXRjaC5ocHAiCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluIGIvY29tcGlsZXIvY3BwL3ZlcnNpb24uaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3MGVjOS4uMDAwMDAwMAotLS0gYS9jb21waWxlci9jcHAvdmVyc2lvbi5oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2RlZmluZSBUSFJJRlRfVkVSU0lPTiAiQFBBQ0tBR0VfVkVSU0lPTkAiCmRpZmYgLS1naXQgYS9jb21wb3Nlci5qc29uIGIvY29tcG9zZXIuanNvbgppbmRleCBiNjMxOGJjLi4xZDNhNmMwIDEwMDY0NAotLS0gYS9jb21wb3Nlci5qc29uCisrKyBiL2NvbXBvc2VyLmpzb24KQEAgLTEsOSArMSwxMSBAQAogewogICAgICJuYW1lIjogImFwYWNoZS90aHJpZnQiLAogICAgICJkZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAotICAgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIiwKKyAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIiwKICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKLQkibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgICAia2V5d29yZHMiOiBbIlJQQyJdLAorICAgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAgICJyZWFkbWUiOiAiUkVBRE1FLm1kIiwKICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgewogICAgICAgICAgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKQEAgLTE2LDE2ICsxOCwyMiBAQAogICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUIgogICAgIH0sCiAgICAgInJlcXVpcmUiOiB7Ci0gICAgICAgICJwaHAiOiAiPj01LjMuMCIKKyAgICAgICAgInBocCI6ICJeNS41IHx8IF43LjAiCisgICAgfSwKKyAgICAicmVxdWlyZS1kZXYiOiB7CisgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAifjQuOC4zNiIsCisgICAgICAgICJzcXVpemxhYnMvcGhwX2NvZGVzbmlmZmVyIjogIjMuKiIKICAgICB9LAogICAgICJhdXRvbG9hZCI6IHsKLSAgICAgICAgInBzci0wIjogeyJUaHJpZnQiOiAibGliL3BocC9zcmMvIn0KKyAgICAgICAgInBzci00IjogeyJUaHJpZnRcXCI6ICJsaWIvcGhwL2xpYi8ifQogICAgIH0sCi0gICAgInRhcmdldC1kaXIiOiAibGliL3BocCIsCi0gICAgIm1pbmltdW0tc3RhYmlsaXR5IjogImRldiIsCisgICAgImF1dG9sb2FkLWRldiI6IHsKKyAgICAgICAgInBzci00IjogeyJUZXN0XFxUaHJpZnRcXCI6ICJsaWIvcGhwL3Rlc3QvIn0KKyAgICB9LAorICAgICJtaW5pbXVtLXN0YWJpbGl0eSI6ICJzdGFibGUiLAogICAgICJleHRyYSI6IHsKICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKLSAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjAuOS54LWRldiIKKyAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjEuMC54LWRldiIKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCAyNWY0ZTM2Li4yMTc0NjI5IDEwMDc1NQotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0xOCwxMiArMTgsMTMgQEAKICMKIAogQUNfUFJFUkVRKDIuNjUpCitBQ19DT05GSUdfTUFDUk9fRElSKFsuL2FjbG9jYWxdKQogCi1BQ19JTklUKFt0aHJpZnRdLCBbMC45LjBdKQorQUNfSU5JVChbdGhyaWZ0XSwgWzEuMC4wXSkKIAogQUNfQ09ORklHX0FVWF9ESVIoWy5dKQogCi1BTV9JTklUX0FVVE9NQUtFKFsxLjkgdGFyLXVzdGFyXSkKK0FNX0lOSVRfQVVUT01BS0UoWzEuMTMgc3ViZGlyLW9iamVjdHMgdGFyLXVzdGFyXSkKIFBLR19QUk9HX1BLR19DT05GSUcKIAogQUNfQVJHX1ZBUihbUFlfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyBQeXRob24gbW9kdWxlcy4KQEAgLTMzLDEwICszNCwxMCBAQAogQVNfSUYoW3Rlc3QgIngkUFlfUFJFRklYIiA9IHhdLCBbUFlfUFJFRklYPSIvdXNyIl0pCiAKIEFDX0FSR19WQVIoW0pBVkFfUFJFRklYXSwgW1ByZWZpeCBmb3IgaW5zdGFsbGluZyB0aGUgSmF2YSBsaWIgamFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBKYXZhIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEphdmEgaGFzIGRpZmZlcmVudCBjb252ZW50aW9ucy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvbGliIl0pCi1BU19JRihbdGVzdCAieCRKQVZBX1BSRUZJWCIgPSB4XSwgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQorQVNfSUYoW3Rlc3QgIngkSkFWQV9QUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRKQVZBX1BSRUZJWC91c3IvbG9jYWwvbGliIl0sCisgICAgICBbdGVzdCAieCRQUkVGSVgiICE9IHhdLCBbSkFWQV9QUkVGSVg9IiRQUkVGSVgvdXNyL2xvY2FsL2xpYiJdLAorICAgICAgW0pBVkFfUFJFRklYPSIvdXNyL2xvY2FsL2xpYiJdKQogCiBBQ19BUkdfVkFSKFtSVUJZX1BSRUZJWF0sIFtQcmVmaXggZm9yIGluc3RhbGxpbmcgUnVieSBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vcm1hbCAtLXByZWZpeCBpcyBpZ25vcmVkIGZvciBSdWJ5IGJlY2F1c2UKQEAgLTc1LDIwICs3Niw2IEBACiAKIEFDX1NVQlNUKENBQkFMX0NPTkZJR1VSRV9GTEFHUykKIAotQUNfQVJHX1ZBUihbR09ST09UXSwgW1ByZWZpeCBmb3IgdGhlIEdvIHNvdXJjZSBkaXJlY3RvcnkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9ybWFsIC0tcHJlZml4IGlzIGlnbm9yZWQgZm9yIEdvIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvIGhhcyBkaWZmZXJlbnQgY29udmVudGlvbnMuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9ICIvdXNyL2xvY2FsL3NoYXJlL2dvIl0pCi1BU19JRihbdGVzdCAieCRHT1JPT1QiID0geF0sIFtHT1JPT1Q9Ii91c3IvbG9jYWwvc2hhcmUvZ28iXSkKLQotQUNfQVJHX1ZBUihbR09BUkNIXSwgW0FyY2hpdGVjdHVyZSBkZWZhdWx0IGZvciBHby4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPSAiYW1kNjQiXSkKLUFTX0lGKFt0ZXN0ICJ4JEdPQVJDSCIgPSB4XSwgW0dPQVJDSD0iYW1kNjQiXSkKLQotQUNfQVJHX1ZBUihbR09CSU5dLCBbQmluYXJ5IGRpcmVjdG9yeSBmb3IgR28uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0ID0gIi91c3IvbG9jYWwvYmluIl0pCi1BU19JRihbdGVzdCAieCRHT0JJTiIgPSB4XSwgW0dPQklOPSIvdXNyL2xvY2FsL2JpbiJdKQotCiBBQ19BUkdfVkFSKFtEX0lNUE9SVF9QUkVGSVhdLCBbUHJlZml4IGZvciBpbnN0YWxsaW5nIEQgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJTkNMVURFRElSL2QyXV0pCiBBU19JRihbdGVzdCAieCREX0lNUE9SVF9QUkVGSVgiID0geF0sIFtEX0lNUE9SVF9QUkVGSVg9IiR7aW5jbHVkZWRpcn0vZDIiXSkKQEAgLTk2LDEyICs4MywxNiBAQAogQUNfQVJHX1ZBUihbRE1EX0xJQkVWRU5UX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBsaWJldmVudCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQogQUNfQVJHX1ZBUihbRE1EX09QRU5TU0xfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIE9wZW5TU0wgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKIAorQUNfQVJHX1ZBUihbVEhSSUZUXSwgW1BhdGggdG8gdGhlIHRocmlmdCB0b29sIChuZWVkZWQgZm9yIGNyb3NzLWNvbXBpbGF0aW9uKS5dKQorQVNfSUYoW3Rlc3QgIngkVEhSSUZUIiA9IHhdLCBbVEhSSUZUPWBwd2RgL2NvbXBpbGVyL2NwcC90aHJpZnRdKQorCiBBQ19QUk9HX0NDCiBBQ19QUk9HX0NQUAogQUNfUFJPR19DWFgKIEFDX1BST0dfSU5TVEFMTAogQUNfUFJPR19MSUJUT09MCiBBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0JJU09OKDIuNSkKIEFDX1BST0dfWUFDQwogQUNfUFJPR19MRVgKIEFNX1BST0dfTEVYCkBAIC0xMTEsMzUgKzEwMiw5OCBAQAogQUNfUFJPR19SQU5MSUIKIAogQUNfTEFORyhbQysrXSkKK0FYX0NYWF9DT01QSUxFX1NURENYWF8xMShbbm9leHRdLCBbbWFuZGF0b3J5XSkKKworQU1fRVhUUkFfUkVDVVJTSVZFX1RBUkdFVFMoW3N0eWxlXSkKK0FDX1NVQlNUKENQUFNUWUxFX0NNRCwgJ2ZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5oIiAtb3IgLWluYW1lICIqLmNwcCIgLW9yIC1pbmFtZSAiKi5jYyIgLW9yIC1pbmFtZSAiKi50Y2MiIFwpIC1wcmludGYgIlJlZm9ybWF0dGluZzogJWgvJWZcbiIgLWV4ZWMgY2xhbmctZm9ybWF0IC1pIHt9IFw7JykKKyMgJworIyBUaGUgYWJvdmUgY29tbWVudCBpcyB0byBmaXggZWRpdG9yIHN5bnRheCBoaWdobGlnaHRpbmcKKworQUNfQVJHX0VOQUJMRShbbGlic10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJzXSwgW2J1aWxkIHRoZSBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfbGlicz15ZXMKKykKK2hhdmVfbGlicz15ZXMKK2lmIHRlc3QgIiRlbmFibGVfbGlicyIgPSAibm8iOyB0aGVuCisgIGhhdmVfbGlicz0ibm8iCisgIHdpdGhfY3BwPSJubyIKKyAgd2l0aF9jX2dsaWI9Im5vIgorICB3aXRoX2NsPSJubyIKKyAgd2l0aF9qYXZhPSJubyIKKyAgd2l0aF9jc2hhcnA9Im5vIgorICB3aXRoX3B5dGhvbj0ibm8iCisgIHdpdGhfcHkzPSJubyIKKyAgd2l0aF9ydWJ5PSJubyIKKyAgd2l0aF9oYXNrZWxsPSJubyIKKyAgd2l0aF9oYXhlPSJubyIKKyAgd2l0aF9kb3RuZXRjb3JlPSJubyIKKyAgd2l0aF9wZXJsPSJubyIKKyAgd2l0aF9waHA9Im5vIgorICB3aXRoX3BocF9leHRlbnNpb249Im5vIgorICB3aXRoX2RhcnQ9Im5vIgorICB3aXRoX2VybGFuZz0ibm8iCisgIHdpdGhfZ289Im5vIgorICB3aXRoX2Q9Im5vIgorICB3aXRoX25vZGVqcz0ibm8iCisgIHdpdGhfbm9kZXRzPSJubyIKKyAgd2l0aF9sdWE9Im5vIgorICB3aXRoX3JzPSJubyIKKyAgd2l0aF9zd2lmdD0ibm8iCitmaQogCiBBWF9USFJJRlRfTElCKGNwcCwgW0MrK10sIHllcykKIGhhdmVfY3BwPW5vCiBpZiB0ZXN0ICIkd2l0aF9jcHAiID0gInllcyI7ICB0aGVuCi0gIEFYX0JPT1NUX0JBU0UoWzEuNDAuMF0pCisgIEFYX0JPT1NUX0JBU0UoWzEuNTMuMF0pCiAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiA9ICJ4eWVzIiA7IHRoZW4KKyAgICBBQ19TVUJTVChbQk9PU1RfTElCX0RJUl0sIFskKGVjaG8gIiRCT09TVF9MREZMQUdTIiB8IHNlZCAtZSAncy9eXC1MLy8nKV0pCisgICAgQUNfU1VCU1QoW0JPT1NUX0NIUk9OT19MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X2Nocm9uby5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9GSUxFU1lTVEVNX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfZmlsZXN5c3RlbS5hIildKQorICAgIEFDX1NVQlNUKFtCT09TVF9TWVNURU1fTERBRERdLCBbJChlY2hvICIkQk9PU1RfTElCX0RJUi9saWJib29zdF9zeXN0ZW0uYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfVEVTVF9MREFERF0sIFskKGVjaG8gIiRCT09TVF9MSUJfRElSL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYSIpXSkKKyAgICBBQ19TVUJTVChbQk9PU1RfVEhSRUFEX0xEQUREXSwgWyQoZWNobyAiJEJPT1NUX0xJQl9ESVIvbGliYm9vc3RfdGhyZWFkLmEiKV0pCiAgICAgaGF2ZV9jcHA9InllcyIKICAgZmkKIAotICBBWF9MSUJfRVZFTlQoWzEuMF0pCisgIEFYX0xJQl9FVkVOVChbMi4wXSkKICAgaGF2ZV9saWJldmVudD0kc3VjY2VzcwogCiAgIEFYX0xJQl9aTElCKFsxLjIuM10pCiAgIGhhdmVfemxpYj0kc3VjY2VzcwotICAKKwogICBBWF9USFJJRlRfTElCKHF0NCwgW1F0XSwgeWVzKQogICBoYXZlX3F0PW5vCiAgIGlmIHRlc3QgIiR3aXRoX3F0NCIgPSAieWVzIjsgIHRoZW4KICAgICBQS0dfQ0hFQ0tfTU9EVUxFUyhbUVRdLCBbUXRDb3JlID49IDQuMywgUXROZXR3b3JrID49IDQuM10sIGhhdmVfcXQ9eWVzLCBoYXZlX3F0PW5vKQogICBmaQogICBpZiB0ZXN0ICIkaGF2ZV9xdCIgPSAieWVzIjsgdGhlbgotICAgIEFDX1BBVEhfUFJPR1MoW1FUX01PQ10sIFttb2MtcXQ0IG1vY10pCi0gICAgaGF2ZV9xdD0kc3VjY2VzcworICAgIEFDX1BBVEhfUFJPR1MoW1FUX01PQ10sIFttb2MtcXQ0IG1vY10sICJmYWlsIikKKyAgICBpZiB0ZXN0ICIkUVRfTU9DIiA9ICJmYWlsIjsgdGhlbgorICAgICAgaGF2ZV9xdD1ubworICAgIGZpCisgIGZpCisKKyAgQVhfVEhSSUZUX0xJQihxdDUsIFtRdDVdLCB5ZXMpCisgIGhhdmVfcXQ1PW5vCisgIHF0X3JlZHVjZV9yZWxvYz0iIgorICBpZiB0ZXN0ICIkd2l0aF9xdDUiID0gInllcyI7ICB0aGVuCisgICAgUEtHX0NIRUNLX01PRFVMRVMoW1FUNV0sIFtRdDVDb3JlID49IDUuMCwgUXQ1TmV0d29yayA+PSA1LjBdLAorICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3F0NT15ZXM7cXRfcmVkdWNlX3JlbG9jPWAkUEtHX0NPTkZJRyAtLXZhcmlhYmxlPXF0X2NvbmZpZyBRdDVDb3JlIHwgZ3JlcCAicmVkdWNlX3JlbG9jYXRpb25zImBdLAorICAgICAgICAgICAgICAgICAgICAgIFtoYXZlX3F0NT1ub10pCisgIGZpCisgIGlmIHRlc3QgIiRoYXZlX3F0NSIgPSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPR1MoW1FUNV9NT0NdLCBbbW9jLXF0NSBtb2NdLCAiZmFpbCIpCisgICAgaWYgdGVzdCAiJFFUNV9NT0MiID0gImZhaWwiOyB0aGVuCisgICAgICBoYXZlX3F0NT1ubworICAgIGZpCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoW1dJVEhfQ1BQXSwgW3Rlc3QgIiRoYXZlX2NwcCIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfTElCRVZFTlRdLCBbdGVzdCAiJGhhdmVfbGliZXZlbnQiID0gInllcyJdKQogQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1pMSUJdLCBbdGVzdCAiJGhhdmVfemxpYiIgPSAieWVzIl0pCiBBTV9DT05ESVRJT05BTChbQU1YX0hBVkVfUVRdLCBbdGVzdCAiJGhhdmVfcXQiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW0FNWF9IQVZFX1FUNV0sIFt0ZXN0ICIkaGF2ZV9xdDUiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoW1FUNV9SRURVQ0VfUkVMT0NBVElPTlNdLCBbdGVzdCAieCRxdF9yZWR1Y2VfcmVsb2MiICE9ICJ4Il0pCiAKIEFYX1RIUklGVF9MSUIoY19nbGliLCBbQyAoR0xpYildLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9jX2dsaWIiID0gInllcyI7IHRoZW4KQEAgLTE1MSw4ICsyMDUsMjEgQEAKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX0NfR0xJQiwgW3Rlc3QgIiRoYXZlX2dsaWIyIiA9ICJ5ZXMiIC1hICIkaGF2ZV9nb2JqZWN0MiIgPSAieWVzIl0pCiAKK2VjaG8gIk9wZW5TU0wgY2hlY2siCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgLW8gIiRoYXZlX2NfZ2xpYiIgPSAieWVzIjsgIHRoZW4KKyAgZWNobyAiSGF2ZSBjcHAgb3IgYyBzbyB3ZSBjaGVjayBmb3IgT3BlblNTTCIKKyAgQVhfQ0hFQ0tfT1BFTlNTTCgpCitmaQorCiBBWF9USFJJRlRfTElCKGNzaGFycCwgW0MjXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfY3NoYXJwIiA9ICJ5ZXMiOyAgdGhlbgorICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDIuMTEuMCwgbW9ub18yXzExPXllcywgbW9ub18yXzExPW5vKQorICBpZiB0ZXN0ICIkbW9ub18yXzExIiA9PSAieWVzIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPRyhbTUNTXSwgW21jc10pCisgICAgaWYgdGVzdCAieCRNQ1MiICE9ICJ4IjsgdGhlbgorICAgICAgbW9ub19tY3M9InllcyIKKyAgICBmaQorICBmaQogICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDIuMC4wLCBuZXRfM181PXllcywgbmV0XzNfNT1ubykKICAgUEtHX0NIRUNLX01PRFVMRVMoTU9OTywgbW9ubyA+PSAxLjIuNCwgaGF2ZV9tb25vPXllcywgaGF2ZV9tb25vPW5vKQogICBpZiB0ZXN0ICIkaGF2ZV9tb25vIiA9ICJ5ZXMiIDsgdGhlbgpAQCAtMTYxLDYgKzIyOCw3IEBACiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9NT05PLCBbdGVzdCAiJGhhdmVfY3NoYXJwIiA9ICJ5ZXMiXSkKIEFNX0NPTkRJVElPTkFMKE5FVF8yXzAsIFt0ZXN0ICIkbmV0XzNfNSIgPSAibm8iXSkKK0FNX0NPTkRJVElPTkFMKE1PTk9fTUNTLCBbdGVzdCAiJG1vbm9fbWNzIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihqYXZhLCBbSmF2YV0sIHllcykKIGlmIHRlc3QgIiR3aXRoX2phdmEiID0gInllcyI7ICB0aGVuCkBAIC0xNjksNyArMjM3LDggQEAKICAgQVhfQ0hFQ0tfQU5UX1ZFUlNJT04oJEFOVCwgMS43KQogICBBQ19TVUJTVChDTEFTU1BBVEgpCiAgIEFDX1NVQlNUKEFOVF9GTEFHUykKLSAgaWYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgorICBBQ19TVUJTVChHUkFETEVfT1BUUykKKyAgaWYgdGVzdCAieCRKQVZBIiAhPSAieCIgJiYgdGVzdCAieCRKQVZBQyIgIT0gIngiICYmIHRlc3QgIngkQU5UIiAhPSAieCIgOyB0aGVuCiAgICAgaGF2ZV9qYXZhPSJ5ZXMiCiAgIGZpCiBmaQpAQCAtMTc5LDI4ICsyNDgsOTAgQEAKIGlmIHRlc3QgIiR3aXRoX2VybGFuZyIgPSAieWVzIjsgIHRoZW4KICAgQUNfRVJMQU5HX1BBVEhfRVJMCiAgIEFDX0VSTEFOR19QQVRIX0VSTEMKKyAgQUNfUEFUSF9QUk9HKFtSRUJBUl0sIFtyZWJhcl0pCiAgIGlmIHRlc3QgLW4gIiRFUkxDIiA7IHRoZW4KICAgICBBQ19FUkxBTkdfU1VCU1RfTElCX0RJUgogICAgICMgSW5zdGFsbCBpbnRvIHRoZSBkZXRlY3RlZCBFcmxhbmcgZGlyZWN0b3J5IGluc3RlYWQgb2YgJGxpYmRpci9lcmxhbmcvbGliCiAgICAgRVJMQU5HX0lOU1RBTExfTElCX0RJUj0iJEVSTEFOR19MSUJfRElSIgogICAgIEFDX0VSTEFOR19TVUJTVF9JTlNUQUxMX0xJQl9TVUJESVIoQUNfUEFDS0FHRV9OQU1FLCBBQ19QQUNLQUdFX1ZFUlNJT04pCiAgIGZpCi0gIGlmIHRlc3QgLW4gIiRFUkwiIC1hIC1uICIkRVJMQyIgOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRFUkwiIC1hIC1uICIkRVJMQyIgJiYgdGVzdCAieCRSRUJBUiIgIT0gIngiIDsgdGhlbgogICAgIGhhdmVfZXJsYW5nPSJ5ZXMiCisKKyAgICAjIG90cF9yZWxlYXNlIGlzIHNpbXBseSBhIG51bWJlciAobGlrZSAiMTciKSBmb3IgT1RQMTcrIHdoaWxlICJSMTYuLi4iIGZvciBPVFAxNiBvciBsZXNzLgorICAgICMgT1RQIHZlcnNpb24gaXMgY3VycmVudGx5IG9ubHkgdXNlZCBmb3IgcnVubmluZyB0ZXN0cy4KKyAgICBpZiAkRVJMIC1ldmFsICdlcmxhbmc6ZGlzcGxheShlcmxhbmc6c3lzdGVtX2luZm8ob3RwX3JlbGVhc2UpKSxoYWx0KCkuJyAtbm9zaGVsbCB8IGdyZXAgIl5cIlIiID4vZGV2L251bGw7IHRoZW4KKyAgICAgIGVybGFuZ19vdHAxNl9vcl9sZXNzPSJ5ZXMiCisgICAgZmkKICAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX0VSTEFORywgW3Rlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChFUkxBTkdfT1RQMTYsIFt0ZXN0ICIkZXJsYW5nX290cDE2X29yX2xlc3MiID0gInllcyJdKQogCitBWF9USFJJRlRfTElCKG5vZGVqcywgW05vZGVqc10sIHllcykKK2hhdmVfbm9kZWpzPW5vCitpZiB0ZXN0ICIkd2l0aF9ub2RlanMiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HUyhbTk9ERUpTXSwgW25vZGVqcyBub2RlXSkKKyAgQUNfUEFUSF9QUk9HKFtOUE1dLCBbbnBtXSkKKyAgaWYgdGVzdCAieCROT0RFSlMiICE9ICJ4IiAtYSAieCROUE0iICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfbm9kZWpzPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9OT0RFSlMsIFt0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoSEFWRV9OUE0sIFt0ZXN0ICJ4JE5QTSIgIT0gIngiXSkKKworQVhfVEhSSUZUX0xJQihub2RldHMsIFtOb2RldHNdLCB5ZXMpCitoYXZlX25vZGV0cz1ubworaWYgdGVzdCAiJHdpdGhfbm9kZXRzIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPR1MoW05PREVUU10sIFtub2RldHMgbm9kZV0pCisgIEFDX1BBVEhfUFJPRyhbTlBNXSwgW25wbV0pCisgIGlmIHRlc3QgIngkTk9ERVRTIiAhPSAieCIgLWEgIngkTlBNIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX25vZGV0cz0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfTk9ERVRTLCBbdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCisKK0FYX1RIUklGVF9MSUIobHVhLCBbTHVhXSwgeWVzKQoraGF2ZV9sdWE9bm8KK2lmIHRlc3QgIiR3aXRoX2x1YSIgPSAieWVzIjsgdGhlbgorICBBWF9QUk9HX0xVQSg1LjIsLCBoYXZlX2x1YT0ieWVzIiwgaGF2ZV9sdWE9Im5vIikKKyAgaWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiOyB0aGVuCisgICAgQVhfTFVBX0hFQURFUlMoLCBoYXZlX2x1YT0ibm8iKQorICAgIEFYX0xVQV9MSUJTKCwgaGF2ZV9sdWE9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0xVQSwgW3Rlc3QgIiRoYXZlX2x1YSIgPSAieWVzIl0pCisKKyMgRmluZCBweXRob24gcmVnYXJkbGVzcyBvZiB3aXRoX3B5dGhvbiB2YWx1ZSwgYmVjYXVzZSBpdCdzIG5lZWRlZCBieSBtYWtlIGNyb3NzCitBTV9QQVRIX1BZVEhPTigyLjYsLCA6KQogQVhfVEhSSUZUX0xJQihweXRob24sIFtQeXRob25dLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9weXRob24iID0gInllcyI7ICB0aGVuCi0gIEFNX1BBVEhfUFlUSE9OKDIuNCwsIDopCi0gIGlmIHRlc3QgIngkUFlUSE9OIiAhPSAieCIgJiYgdGVzdCAieCRQWVRIT04iICE9ICJ4OiIgOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRQWVRIT04iOyB0aGVuCiAgICAgaGF2ZV9weXRob249InllcyIKICAgZmkKKyAgQUNfUEFUSF9QUk9HKFtUUklBTF0sIFt0cmlhbF0pCisgIGlmIHRlc3QgLW4gIiRUUklBTCI7IHRoZW4KKyAgICBoYXZlX3RyaWFsPSJ5ZXMiCisgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9QWVRIT04sIFt0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyJdKQorQU1fQ09ORElUSU9OQUwoV0lUSF9UV0lTVEVEX1RFU1QsIFt0ZXN0ICIkaGF2ZV90cmlhbCIgPSAieWVzIl0pCiAKLUFDX1BBVEhfUFJPRyhbVFJJQUxdLCBbdHJpYWxdKQorIyBGaW5kICJweXRob24zIiBleGVjdXRhYmxlLgorIyBJdCdzIGRpc3RybyBzcGVjaWZpYyBhbmQgZmFyIGZyb20gaWRlYWwgYnV0IG5lZWRlZCB0byBjcm9zcyB0ZXN0IHB5Mi0zIGF0IG9uY2UuCisjIFRPRE86IGZpbmQgInB5dGhvbjIiIGlmIGl0J3MgMy54CitoYXZlX3B5Mz0ibm8iCitBWF9USFJJRlRfTElCKHB5MywgW1B5M10sIHllcykKK2lmIHRlc3QgIiR3aXRoX3B5MyIgPSAieWVzIjsgdGhlbgorICBpZiAkUFlUSE9OIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtcSAiUHl0aG9uIDIiOyB0aGVuCisgICAgQUNfUEFUSF9QUk9HUyhbUFlUSE9OM10sIFtweXRob24zIHB5dGhvbjMuNyBweXRob24zNyBweXRob24zLjYgcHl0aG9uMzYgcHl0aG9uMy41IHB5dGhvbjM1IHB5dGhvbjMuNCBweXRob24zNF0pCisgICAgaWYgdGVzdCAtbiAiJFBZVEhPTjMiOyB0aGVuCisgICAgICBoYXZlX3B5Mz0ieWVzIgorICAgIGZpCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9QWTMsIFt0ZXN0ICIkaGF2ZV9weTMiID0gInllcyJdKQogCiBBWF9USFJJRlRfTElCKHBlcmwsIFtQZXJsXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGVybCIgPSAieWVzIjsgdGhlbgpAQCAtMjA4LDkgKzMzOSwxMyBAQAogICBpZiB0ZXN0IC1uICIkUEVSTCIgOyB0aGVuCiAgICAgQUNfUFJPR19QRVJMX01PRFVMRVMoW0JpdDo6VmVjdG9yXSwgc3VjY2Vzcz0ieWVzIiwgc3VjY2Vzcz0ibm8iKQogICAgIGhhdmVfcGVybF9iaXRfdmVjdG9yPSIkc3VjY2VzcyIKKyAgICBBQ19QUk9HX1BFUkxfTU9EVUxFUyhbQ2xhc3M6OkFjY2Vzc29yXSwgc3VjY2Vzcz0ieWVzIiwgc3VjY2Vzcz0ibm8iKQorICAgIGhhdmVfcGVybF9jbGFzc19hY2Nlc3Nvcj0iJHN1Y2Nlc3MiCiAgIGZpCiAgIGlmIHRlc3QgLW4gIiRQRVJMIiAtYSAiJGhhdmVfcGVybF9iaXRfdmVjdG9yIiA9ICJ5ZXMiIDsgdGhlbgotICAgIGhhdmVfcGVybD0ieWVzIgorICAgIGlmIHRlc3QgLW4gIiRQRVJMIiAtYSAiJGhhdmVfcGVybF9jbGFzc19hY2Nlc3NvciIgPSAieWVzIiA7IHRoZW4KKyAgICAgIGhhdmVfcGVybD0ieWVzIgorICAgIGZpCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9QRVJMLCBbdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIl0pCkBAIC0yMjYsMjQgKzM2MSwzMiBAQAogCiBBWF9USFJJRlRfTElCKHBocF9leHRlbnNpb24sIFtQSFBfRVhURU5TSU9OXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfcGhwX2V4dGVuc2lvbiIgPSAieWVzIjsgdGhlbgotICBBQ19QQVRIX1BST0coW1BIUF9DT05GSUddLCBbcGhwLWNvbmZpZ10pCi0gIGlmIHRlc3QgLW4gIiRQSFBfQ09ORklHIiA7IHRoZW4KLSAgICBBQ19DT05GSUdfU1VCRElSUyhbbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbF0pCi0gICAgaGF2ZV9waHBfZXh0ZW5zaW9uPSJ5ZXMiCisgIGlmIHRlc3QgLWYgImxpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlIjsgdGhlbgorICAgIEFDX1BBVEhfUFJPRyhbUEhQX0NPTkZJR10sIFtwaHAtY29uZmlnXSkKKyAgICBpZiB0ZXN0IC1uICIkUEhQX0NPTkZJRyIgOyB0aGVuCisgICAgICBBQ19DT05GSUdfU1VCRElSUyhbbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbF0pCisgICAgICBoYXZlX3BocF9leHRlbnNpb249InllcyIKKyAgICBmaQogICBmaQogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfUEhQX0VYVEVOU0lPTiwgW3Rlc3QgIiRoYXZlX3BocF9leHRlbnNpb24iID0gInllcyJdKQogCi1BQ19QQVRIX1BST0coW1BIUFVOSVRdLCBbcGhwdW5pdF0pCi1BTV9DT05ESVRJT05BTChIQVZFX1BIUFVOSVQsIFt0ZXN0ICJ4JFBIUFVOSVQiICE9ICJ4Il0pCitBWF9USFJJRlRfTElCKGRhcnQsIFtEQVJUXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfZGFydCIgPSAieWVzIjsgdGhlbgorICBBQ19QQVRIX1BST0coW0RBUlRdLCBbZGFydF0pCisgIEFDX1BBVEhfUFJPRyhbREFSVFBVQl0sIFtwdWJdKQorICBpZiB0ZXN0ICJ4JERBUlQiICE9ICJ4IiAtYSAieCREQVJUUFVCIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2RhcnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RBUlQsIFt0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihydWJ5LCBbUnVieV0sIHllcykKIGhhdmVfcnVieT1ubwogaWYgdGVzdCAiJHdpdGhfcnVieSIgPSAieWVzIjsgdGhlbgogICBBQ19QQVRIX1BST0coW1JVQlldLCBbcnVieV0pCi0gIEFDX1BBVEhfUFJPRyhbUkFLRV0sIFtyYWtlXSkKICAgQUNfUEFUSF9QUk9HKFtCVU5ETEVSXSwgW2J1bmRsZV0pCi0gIGlmIHRlc3QgIngkUlVCWSIgIT0gIngiIC1hICJ4JFJBS0UiICE9ICJ4IjsgdGhlbgorICBpZiB0ZXN0ICJ4JFJVQlkiICE9ICJ4IiAtYSAieCRCVU5ETEVSIiAhPSAieCI7IHRoZW4KICAgICBoYXZlX3J1Ynk9InllcyIKICAgZmkKIGZpCkBAIC0yNzAsMzMgKzQxMywxMDEgQEAKIAogQVhfVEhSSUZUX0xJQihnbywgW0dvXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfZ28iID0gInllcyI7ICB0aGVuCi0gIGNhc2UgWCIkR09BUkNIIiBpbgotICBYYW1kNjQpCi0gICAgR09BUkNIX05VTT02Ci0gIAk7OwotICBYMzg2KQotICAgIEdPQVJDSF9OVU09OAotICAJOzsKLSAgWGFybSkKLSAgICBHT0FSQ0hfTlVNPTUKLSAgCTs7Ci0gICopCi0gICAgR09BUkNIX05VTT02Ci0gICAgOzsKLSAgZXNhYwotICBHT19DPSR7R09CSU59LyR7R09BUkNIX05VTX1nCi0gIEdPX0w9JHtHT0JJTn0vJHtHT0FSQ0hfTlVNfWwKLSAgR09NQUtFPSR7R09CSU59L2dvbWFrZQotICBHT0lOU1RBTEw9JHtHT0JJTn0vZ29pbnN0YWxsCi0gIEFDX1BBVEhfUFJPRyhbR09fQ10sIFske0dPQVJDSF9OVU19Z10pCi0gIEFDX1BBVEhfUFJPRyhbR09fTF0sIFske0dPQVJDSF9OVU19bF0pCi0gIEFDX1BBVEhfUFJPRyhbR09NQUtFXSwgW2dvbWFrZV0pCi0gIEFDX1BBVEhfUFJPRyhbR09JTlNUQUxMXSwgW2dvaW5zdGFsbF0pCi0gIGlmIFtbIC14ICIkR09fQyIgLWEgLXggIiRHT19MIiAtYSAteCAiJEdPTUFLRSIgLWEgLXggIiRHT0lOU1RBTEwiIF1dIDsgdGhlbgotICAgIGhhdmVfZ289InllcyIKKyAgQUNfUEFUSF9QUk9HKFtHT10sIFtnb10pCisgIGlmIFtbIC14ICIkR08iIF1dIDsgdGhlbgorICAgIEFTX0lGKFt0ZXN0IC1uICIkR08iXSxbCisgICAgICBheF9nb192ZXJzaW9uPSIxLjQiCisgICAgICBheF9nbzE3X3ZlcnNpb249IjEuNyIKKworICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR28gdmVyc2lvbl0pCisgICAgICBnb2xhbmdfdmVyc2lvbj1gJEdPIHZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChnbyBcKVwodmVyc2lvbiBcKVwoZ29cKVwoQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkAuQDw6QDAtOUA6PkBcKVwoQDw6QFwqQDo+QCpcKS4qL1w0LydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRnb2xhbmdfdmVyc2lvbikKKyAgICAgIEFDX1NVQlNUKFtnb2xhbmdfdmVyc2lvbl0sWyRnb2xhbmdfdmVyc2lvbl0pCisgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9nb192ZXJzaW9uXSxbbGVdLFskZ29sYW5nX3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9nbz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGhhdmVfZ289Im5vIgorICAgICAgXSkKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJGdvbGFuZ192ZXJzaW9uXSxbbHRdLFskYXhfZ28xN192ZXJzaW9uXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9InllcyIKKyAgICAgIF0sWworICAgICAgOgorICAgICAgICBnb192ZXJzaW9uX2x0XzE3PSJubyIKKyAgICAgIF0pCisgICAgXSxbCisgICAgICBBQ19NU0dfV0FSTihbY291bGQgbm90IGZpbmQgR28gXSkKKyAgICAgIGhhdmVfZ289Im5vIgorICAgIF0pCiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9HTywgW3Rlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtHT1ZFUlNJT05fTFRfMTddLCBbdGVzdCAiJGdvX3ZlcnNpb25fbHRfMTciID0gInllcyJdKQorCitBWF9USFJJRlRfTElCKHN3aWZ0LCBbU3dpZnRdLCB5ZXMpCitoYXZlX3N3aWZ0PSJubyIKK2lmIHRlc3QgIiR3aXRoX3N3aWZ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU1dJRlRdLCBbc3dpZnRdKQorICBpZiB0ZXN0ICJ4JFNXSUZUIiAhPSAieCIgLWEgIngkU1dJRlQiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfc3dpZnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9TV0lGVF0sIFt0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocnMsIFtSdXN0XSwgeWVzKQoraGF2ZV9ycz0ibm8iCitpZiB0ZXN0ICIkd2l0aF9ycyIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtDQVJHT10sIFtjYXJnb10pCisgIEFDX1BBVEhfUFJPRyhbUlVTVENdLCBbcnVzdGNdKQorICBpZiBbWyAteCAiJENBUkdPIiBdXSAmJiBbWyAteCAiJFJVU1RDIiBdXTsgdGhlbgorICAgICAgbWluX3J1c3RjX3ZlcnNpb249IjEuMTMiCisKKyAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJ1c3RjIHZlcnNpb25dKQorICAgICAgcnVzdGNfdmVyc2lvbj1gJFJVU1RDIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKHJ1c3RjIFwpXChbMC05XVwpXC5cKFswLTldWzAtOV0qXClcLlwoWzAtOV1bMC05XSpcKS4qL1wyLlwzLydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRydXN0Y192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW3J1c3RjX3ZlcnNpb25dLFskcnVzdGNfdmVyc2lvbl0pCisKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJG1pbl9ydXN0Y192ZXJzaW9uXSxbbGVdLFskcnVzdGNfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ibm8iCisgICAgICBdKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUlMsIFt0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoY2wsIFtDb21tb24gTGlzcF0sIHllcykKK2hhdmVfY2w9Im5vIgoraWYgdGVzdCAiJHdpdGhfY2wiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU0JDTF0sIFtzYmNsXSkKKyAgaWYgdGVzdCAieCRTQkNMIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2NsPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9DTCwgW3Rlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihoYXhlLCBbSGF4ZV0sIHllcykKK2lmIHRlc3QgIiR3aXRoX2hheGUiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbSEFYRV0sIFtoYXhlXSkKKyAgaWYgW1sgLXggIiRIQVhFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0hBWEVfVkVSU0lPTiggWzMuMS4zXSwgaGF2ZV9oYXhlPSJ5ZXMiLCBoYXZlX2hheGU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0hBWEUsIFt0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiXSkKKworCitBWF9USFJJRlRfTElCKGRvdG5ldGNvcmUsIFsuTkVUIENvcmVdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kb3RuZXRjb3JlIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLCBbZG90bmV0XSkKKyAgaWYgW1sgLXggIiRET1RORVRDT1JFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTiggWzIuMC4wXSwgaGF2ZV9kb3RuZXRjb3JlPSJ5ZXMiLCBoYXZlX2RvdG5ldGNvcmU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RPVE5FVENPUkUsIFt0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiXSkKIAogCiBBWF9USFJJRlRfTElCKGQsIFtEXSwgeWVzKQpAQCAtMzM5LDcgKzU1MCw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIEFYX0xJQl9FVkVOVChbMi4wXSkKICAgICAgICAgaWYgdGVzdCAiJHN1Y2Nlc3MiID0gInllcyI7IHRoZW4KLSAgICAgICAgICBETURfTElCRVZFTlRfRkxBR1M9JChlY2hvICIkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCisgICAgICAgICAgRE1EX0xJQkVWRU5UX0ZMQUdTPSQoZWNobyAiLWZ1c2UtbGQ9Z29sZCAkTElCRVZFTlRfTERGTEFHUyAkTElCRVZFTlRfTElCUyIgfCBcCiAgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCiAgICAgICAgICAgd2l0aF9kX2V2ZW50X3Rlc3RzPSJ5ZXMiCiAgICAgICAgIGVsc2UKQEAgLTM2Myw3ICs1NzQsNyBAQAogICAgICAgZWxzZQogICAgICAgICBBWF9DSEVDS19PUEVOU1NMKFt3aXRoX2Rfc3NsX3Rlc3RzPSJ5ZXMiXSkKICAgICAgICAgaWYgdGVzdCAiJHdpdGhfZF9zc2xfdGVzdHMiID0gInllcyI7IHRoZW4KLSAgICAgICAgICBETURfT1BFTlNTTF9GTEFHUz0kKGVjaG8gIiRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCisgICAgICAgICAgRE1EX09QRU5TU0xfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRPUEVOU1NMX0xERkxBR1MgJE9QRU5TU0xfTElCUyIgfCBcCiAgICAgICAgICAgICBzZWQgLWUgJ3MvXiAqLy9nO3MvICokLy9nO3MvXlwoLlwpLy1MXDEvZztzLyAgKi8gLUwvZycpCiAgICAgICAgIGVsc2UKICAgICAgICAgICBBQ19NU0dfV0FSTihbRCBPcGVuU1NMIGludGVyZmFjZSBwcmVzZW50LCBidXQgT3BlblNTTCBsaWJyYXJ5IG5vdCBmb3VuZC5dKQpAQCAtMzg1LDEzICs1OTYsNDAgQEAKIEFNX0NPTkRJVElPTkFMKFdJVEhfRF9TU0xfVEVTVFMsIFt0ZXN0ICIkd2l0aF9kX3NzbF90ZXN0cyIgPSAieWVzIl0pCiBBQ19TVUJTVChETURfT1BFTlNTTF9GTEFHUykKIAotCitBQ19BUkdfRU5BQkxFKFt0ZXN0c10sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS10ZXN0c10sIFtidWlsZCB0ZXN0cyBbZGVmYXVsdD15ZXNdXSksCisgIFtdLCBlbmFibGVfdGVzdHM9eWVzCispCiBoYXZlX3Rlc3RzPXllcwotaWYgdGVzdCAiJHdpdGhfdGVzdHMiID0gIm5vIjsgdGhlbgoraWYgdGVzdCAiJGVuYWJsZV90ZXN0cyIgPSAibm8iOyB0aGVuCiAgIGhhdmVfdGVzdHM9Im5vIgogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfVEVTVFMsIFt0ZXN0ICIkaGF2ZV90ZXN0cyIgPSAieWVzIl0pCiAKK0FDX0FSR19FTkFCTEUoW3BsdWdpbl0sCisgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wbHVnaW5dLCBbYnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQgW2RlZmF1bHQ9bm9dXSksCisgIFtdLCBlbmFibGVfcGx1Z2luPW5vCispCitoYXZlX3BsdWdpbj15ZXMKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAibm8iIDsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQoraWYgdGVzdCAiJGVuYWJsZV9wbHVnaW4iID0gIm5vIjsgdGhlbgorICBoYXZlX3BsdWdpbj0ibm8iCitmaQorQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCitBTV9DT05ESVRJT05BTChXSVRIX1BMVUdJTiwgW3Rlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIl0pCisKK0FDX0FSR19FTkFCTEUoW3R1dG9yaWFsXSwKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXR1dG9yaWFsXSwgW2J1aWxkIHR1dG9yaWFsIFtkZWZhdWx0PXllc11dKSwKKyAgW10sIGVuYWJsZV90dXRvcmlhbD15ZXMKKykKK2hhdmVfdHV0b3JpYWw9eWVzCitpZiB0ZXN0ICIkZW5hYmxlX3R1dG9yaWFsIiA9ICJubyI7IHRoZW4KKyAgaGF2ZV90dXRvcmlhbD0ibm8iCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9UVVRPUklBTCwgW3Rlc3QgIiRoYXZlX3R1dG9yaWFsIiA9ICJ5ZXMiXSkKKwogQU1fQ09ORElUSU9OQUwoTUlOR1csIGZhbHNlKQogY2FzZSAiJHtob3N0X29zfSIgaW4KICptaW5ndyopCkBAIC00MjEsMTEgKzY1OSwxNCBAQAogQUNfQ0hFQ0tfSEVBREVSUyhbbmV0ZGIuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtuZXRpbmV0L2luLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbcHRocmVhZC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3NpZ25hbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N0ZGRlZi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N0ZGxpYi5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3N5cy9pb2N0bC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9zb2NrZXQuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzeXMvdGltZS5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy91bi5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3BvbGwuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzeXMvcG9sbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9yZXNvdXJjZS5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3VuaXN0ZC5oXSkKQEAgLTQzNSw2ICs2NzYsNyBAQAogQUNfQ0hFQ0tfSEVBREVSUyhbb3BlbnNzbC9yYW5kLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbb3BlbnNzbC94NTA5djMuaF0pCiBBQ19DSEVDS19IRUFERVJTKFtzY2hlZC5oXSkKK0FDX0NIRUNLX0hFQURFUlMoW3djaGFyLmhdKQogCiBBQ19DSEVDS19MSUIocHRocmVhZCwgcHRocmVhZF9jcmVhdGUpCiBkbmwgTk9URShkcmVpc3MpOiBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIGZpbmQgYW55IHJlYWxseSBzb2xpZCBkb2NzCkBAIC00NDUsMjEgKzY4Nyw2IEBACiBBQ19DSEVDS19MSUIocnQsIGNsb2NrX2dldHRpbWUpCiBBQ19DSEVDS19MSUIoc29ja2V0LCBzZXRzb2Nrb3B0KQogCi1pZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCi0jIG1pbmd3IHRvb2xjaGFpbiB1c2VkIHRvIGJ1aWxkICJUaHJpZnQgQ29tcGlsZXIgZm9yIFdpbmRvd3MiCi0jIGRvZXMgbm90IHN1cHBvcnQgbGliY3J5cHRvLCBzbyB3ZSBqdXN0IGNoZWNrIGlmIHdlIGJ1aWxkaW5nIHRoZSBjcHAgbGlicmFyeQotQUNfQ0hFQ0tfTElCKGNyeXB0bywKLSAgICBCTl9pbml0LAotICAgIFtBQ19DSEVDS19MSUIoc3NsLAotICAgICAgICBTU0xfY3RybCwKLSAgICAgICAgW0xJQlM9Ii1sc3NsIC1sY3J5cHRvICRMSUJTIl0sCi0gICAgICAgIFtBQ19NU0dfRVJST1IoWyJFcnJvcjogbGlic3NsIHJlcXVpcmVkIl0pXSwKLSAgICAgICAgLWxjcnlwdG8KLSAgICApXSwKLSAgICBbQUNfTVNHX0VSUk9SKFsiRXJyb3I6IGxpYmNyeXB0byByZXF1aXJlZC4iXSldCi0pCi1maQotCiBBQ19UWVBFX0lOVDE2X1QKIEFDX1RZUEVfSU5UMzJfVAogQUNfVFlQRV9JTlQ2NF9UCkBAIC00NzIsNyArNjk5LDcgQEAKIEFDX1RZUEVfVUlOVDMyX1QKIEFDX1RZUEVfVUlOVDY0X1QKIEFDX1RZUEVfVUlOVDhfVAotQUNfQ0hFQ0tfVFlQRVMoW3B0cmRpZmZfdF0sIFtdLCBbZXhpdCAxXSkKK0FDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2VjaG8gInB0cmRpZmZfdCBub3QgZm91bmQgb3IgZysrIG5vdCBpbnN0YWxsZWQgLSBjYW5ub3QgY29udGludWUiICYmIGV4aXQgMV0pCiAKIEFDX1NUUlVDVF9UTQogCkBAIC01MDAsMTIgKzcyNywxNCBAQAogQUNfQ0hFQ0tfRlVOQ1MoW2J6ZXJvXSkKIEFDX0NIRUNLX0ZVTkNTKFtmdHJ1bmNhdGVdKQogQUNfQ0hFQ0tfRlVOQ1MoW2dldGhvc3RieW5hbWVdKQorQUNfQ0hFQ0tfRlVOQ1MoW2dldGhvc3RieW5hbWVfcl0pCiBBQ19DSEVDS19GVU5DUyhbZ2V0dGltZW9mZGF5XSkKIEFDX0NIRUNLX0ZVTkNTKFttZW1tb3ZlXSkKIEFDX0NIRUNLX0ZVTkNTKFttZW1zZXRdKQogQUNfQ0hFQ0tfRlVOQ1MoW21rZGlyXSkKIEFDX0NIRUNLX0ZVTkNTKFtyZWFscGF0aF0pCiBBQ19DSEVDS19GVU5DUyhbc2VsZWN0XSkKK0FDX0NIRUNLX0ZVTkNTKFtzZXRsb2NhbGVdKQogQUNfQ0hFQ0tfRlVOQ1MoW3NvY2tldF0pCiBBQ19DSEVDS19GVU5DUyhbc3RyY2hyXSkKIEFDX0NIRUNLX0ZVTkNTKFtzdHJkdXBdKQpAQCAtNTE4LDYgKzc0Nyw4IEBACiBBQ19DSEVDS19GVU5DUyhbY2xvY2tfZ2V0dGltZV0pCiBBQ19DSEVDS19GVU5DUyhbc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl0pCiBBQ19DSEVDS19GVU5DUyhbc2NoZWRfZ2V0X3ByaW9yaXR5X21heF0pCitBQ19DSEVDS19GVU5DUyhbaW5ldF9udG9hXSkKK0FDX0NIRUNLX0ZVTkNTKFtwb3ddKQogCiBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9ICJubyIgOyB0aGVuCiAgIEFYX1NJR05FRF9SSUdIVF9TSElGVApAQCAtNTU0LDE1MCArNzg1LDMxNiBAQAogQUNfU1VCU1QoR0NPVl9DWFhGTEFHUykKIEFDX1NVQlNUKEdDT1ZfTERGTEFHUykKIAotQUNfQVJHX0VOQUJMRShib29zdHRocmVhZHMsCi0gICAgICAgICAgICAgIFsgIC0tZW5hYmxlLWJvb3N0dGhyZWFkcyAgICAgIHVzZSBib29zdCB0aHJlYWRzLCBpbnN0ZWFkIG9mIFBPU0lYIHB0aHJlYWQgKGV4cGVyaW1lbnRhbCkgXSwKLSAgICAgICAgICAgICAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgICAgICAgICAgICAgICB5ZXMpIEVOQUJMRV9CT09TVFRIUkVBRFM9MSA7OwotICAgICAgICAgICAgICAgIG5vKSBFTkFCTEVfQk9PU1RUSFJFQURTPTAgOzsKLSAgICAgICAgICAgICAgICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtY292KSA7OwotICAgICAgICAgICAgICBlc2FjXSwKLSAgICAgICAgICAgICAgW0VOQUJMRV9CT09TVFRIUkVBRFM9Ml0pCi0KLQotaWYgdGVzdCAieFskXUVOQUJMRV9CT09TVFRIUkVBRFMiID0gIngxIjsgdGhlbgotICBBQ19NU0dfV0FSTihlbmFibGUgYm9vc3R0aHJlYWRzKQotICBBQ19ERUZJTkUoW1VTRV9CT09TVF9USFJFQURdLCBbMV0sIFtleHBlcmltZW50YWwgLS1lbmFibGUtYm9vc3R0aHJlYWRzIHRoYXQgcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBib29zdDo6dGhyZWFkXSkKLSAgTElCUz0iLWxib29zdF90aHJlYWQgJExJQlMiCi1maQotCi1BTV9DT05ESVRJT05BTChbV0lUSF9CT09TVFRIUkVBRFNdLCBbdGVzdCAieFskXUVOQUJMRV9CT09TVFRIUkVBRFMiID0gIngxIl0pCi0KIEFDX0NPTkZJR19IRUFERVJTKGNvbmZpZy5oOmNvbmZpZy5oaW4pCitBQ19DT05GSUdfSEVBREVSUyhsaWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmg6Y29uZmlnLmhpbikKK0FDX0NPTkZJR19IRUFERVJTKGxpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQorIyBncnVhcmQgYWdhaW5zdCBwcmUgZGVmaW5lZCBjb25maWcuaAorQUhfVE9QKFsKKyNpZm5kZWYgQ09ORklHX0gKKyNkZWZpbmUgQ09ORklHX0gKK10pCitBSF9CT1RUT00oWworI2VuZGlmCitdKQorCiAKIEFDX0NPTkZJR19GSUxFUyhbCiAgIE1ha2VmaWxlCiAgIGNvbXBpbGVyL2NwcC9NYWtlZmlsZQotICBjb21waWxlci9jcHAvdmVyc2lvbi5oCi0gIGNvbXBpbGVyL2NwcC9zcmMvd2luZG93cy92ZXJzaW9uLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9NYWtlZmlsZQorICBjb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3Rlc3QvTWFrZWZpbGUKKyAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdmVyc2lvbi5oCiAgIGxpYi9NYWtlZmlsZQorICBsaWIvY2wvTWFrZWZpbGUKICAgbGliL2NwcC9NYWtlZmlsZQogICBsaWIvY3BwL3Rlc3QvTWFrZWZpbGUKICAgbGliL2NwcC90aHJpZnQtbmIucGMKICAgbGliL2NwcC90aHJpZnQtei5wYwogICBsaWIvY3BwL3RocmlmdC1xdC5wYworICBsaWIvY3BwL3RocmlmdC1xdDUucGMKICAgbGliL2NwcC90aHJpZnQucGMKICAgbGliL2NfZ2xpYi9NYWtlZmlsZQogICBsaWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMKICAgbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlCiAgIGxpYi9jc2hhcnAvTWFrZWZpbGUKKyAgbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZQogICBsaWIvZC9NYWtlZmlsZQogICBsaWIvZC90ZXN0L01ha2VmaWxlCiAgIGxpYi9lcmwvTWFrZWZpbGUKKyAgbGliL2dvL01ha2VmaWxlCisgIGxpYi9nby90ZXN0L01ha2VmaWxlCisgIGxpYi9oYXhlL3Rlc3QvTWFrZWZpbGUKICAgbGliL2hzL01ha2VmaWxlCiAgIGxpYi9qYXZhL01ha2VmaWxlCisgIGxpYi9qcy9NYWtlZmlsZQogICBsaWIvanMvdGVzdC9NYWtlZmlsZQorICBsaWIvanNvbi9NYWtlZmlsZQorICBsaWIvanNvbi90ZXN0L01ha2VmaWxlCisgIGxpYi9uZXRjb3JlL01ha2VmaWxlCisgIGxpYi9ub2RlanMvTWFrZWZpbGUKKyAgbGliL25vZGV0cy9NYWtlZmlsZQogICBsaWIvcGVybC9NYWtlZmlsZQogICBsaWIvcGVybC90ZXN0L01ha2VmaWxlCiAgIGxpYi9waHAvTWFrZWZpbGUKICAgbGliL3BocC90ZXN0L01ha2VmaWxlCisgIGxpYi9kYXJ0L01ha2VmaWxlCiAgIGxpYi9weS9NYWtlZmlsZQogICBsaWIvcmIvTWFrZWZpbGUKKyAgbGliL3JzL01ha2VmaWxlCisgIGxpYi9ycy90ZXN0L01ha2VmaWxlCisgIGxpYi9sdWEvTWFrZWZpbGUKKyAgbGliL3N3aWZ0L01ha2VmaWxlCisgIGxpYi94bWwvTWFrZWZpbGUKKyAgbGliL3htbC90ZXN0L01ha2VmaWxlCiAgIHRlc3QvTWFrZWZpbGUKKyAgdGVzdC9mZWF0dXJlcy9NYWtlZmlsZQorICB0ZXN0L2NfZ2xpYi9NYWtlZmlsZQorICB0ZXN0L2NsL01ha2VmaWxlCiAgIHRlc3QvY3BwL01ha2VmaWxlCisgIHRlc3QvY3NoYXJwL01ha2VmaWxlCisgIHRlc3QvZXJsL01ha2VmaWxlCisgIHRlc3QvZ28vTWFrZWZpbGUKKyAgdGVzdC9oYXhlL01ha2VmaWxlCiAgIHRlc3QvaHMvTWFrZWZpbGUKLSAgdGVzdC9ub2RlanMvTWFrZWZpbGUKKyAgdGVzdC9sdWEvTWFrZWZpbGUKKyAgdGVzdC9uZXRjb3JlL01ha2VmaWxlCiAgIHRlc3QvcGhwL01ha2VmaWxlCisgIHRlc3QvZGFydC9NYWtlZmlsZQogICB0ZXN0L3BlcmwvTWFrZWZpbGUKICAgdGVzdC9weS9NYWtlZmlsZQogICB0ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUKKyAgdGVzdC9weS50b3JuYWRvL01ha2VmaWxlCiAgIHRlc3QvcmIvTWFrZWZpbGUKKyAgdGVzdC9ycy9NYWtlZmlsZQorICB0dXRvcmlhbC9NYWtlZmlsZQorICB0dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUKKyAgdHV0b3JpYWwvY2wvTWFrZWZpbGUKKyAgdHV0b3JpYWwvY3BwL01ha2VmaWxlCisgIHR1dG9yaWFsL2QvTWFrZWZpbGUKKyAgdHV0b3JpYWwvZ28vTWFrZWZpbGUKKyAgdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZQorICB0dXRvcmlhbC9ocy9NYWtlZmlsZQorICB0dXRvcmlhbC9qYXZhL01ha2VmaWxlCisgIHR1dG9yaWFsL2pzL01ha2VmaWxlCisgIHR1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUKKyAgdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlCisgIHR1dG9yaWFsL2RhcnQvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcHkvTWFrZWZpbGUKKyAgdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZQorICB0dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlCisgIHR1dG9yaWFsL3JiL01ha2VmaWxlCisgIHR1dG9yaWFsL3JzL01ha2VmaWxlCiBdKQogCitpZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuIE1BWUJFX0NQUD0iY3BwIiA7IGVsc2UgTUFZQkVfQ1BQPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DUFBdKQoraWYgdGVzdCAiJGhhdmVfY19nbGliIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DX0dMSUI9ImNfZ2xpYiIgOyBlbHNlIE1BWUJFX0NfR0xJQj0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ19HTElCXSkKK2lmIHRlc3QgIiRoYXZlX2QiID0gInllcyIgLWEgIiRoYXZlX2RlaW1vc19ldmVudDIiID0gInllcyIgLWEgIiRoYXZlX2RlaW1vc19vcGVuc3NsIiA9ICJ5ZXMiOyB0aGVuIE1BWUJFX0Q9ImQiIDsgZWxzZSBNQVlCRV9EPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9EXSkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuIE1BWUJFX0pBVkE9ImphdmEiIDsgZWxzZSBNQVlCRV9KQVZBPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9KQVZBXSkKK2lmIHRlc3QgIiRoYXZlX2NzaGFycCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfQ1NIQVJQPSJjc2hhcnAiIDsgZWxzZSBNQVlCRV9DU0hBUlA9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0NTSEFSUF0pCitpZiB0ZXN0ICIkaGF2ZV9weXRob24iID0gInllcyIgOyB0aGVuIE1BWUJFX1BZVEhPTj0icHkiIDsgZWxzZSBNQVlCRV9QWVRIT049IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1BZVEhPTl0pCitpZiB0ZXN0ICIkaGF2ZV9weTMiID0gInllcyIgOyB0aGVuIE1BWUJFX1BZMz0icHkzIiA7IGVsc2UgTUFZQkVfUFkzPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QWTNdKQoraWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlVCWT0icmIiIDsgZWxzZSBNQVlCRV9SVUJZPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9SVUJZXSkKK2lmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuIE1BWUJFX0hBU0tFTEw9ImhzIiA7IGVsc2UgTUFZQkVfSEFTS0VMTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfSEFTS0VMTF0pCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9QRVJMPSJwZXJsIiA7IGVsc2UgTUFZQkVfUEVSTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfUEVSTF0pCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuIE1BWUJFX1BIUD0icGhwIiA7IGVsc2UgTUFZQkVfUEhQPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9QSFBdKQoraWYgdGVzdCAiJGhhdmVfZGFydCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfREFSVD0iZGFydCIgOyBlbHNlIE1BWUJFX0RBUlQ9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RBUlRdKQoraWYgdGVzdCAiJGhhdmVfZ28iID0gInllcyIgOyB0aGVuIE1BWUJFX0dPPSJnbyIgOyBlbHNlIE1BWUJFX0dPPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9HT10pCitpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVKUz0ibm9kZWpzIiA7IGVsc2UgTUFZQkVfTk9ERUpTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9OT0RFSlNdKQoraWYgdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9OT0RFVFM9Im5vZGV0cyIgOyBlbHNlIE1BWUJFX05PREVUUz0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfTk9ERVRTXSkKK2lmIHRlc3QgIiRoYXZlX2VybGFuZyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRVJMQU5HPSJlcmwiIDsgZWxzZSBNQVlCRV9FUkxBTkc9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0VSTEFOR10pCitpZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyIgOyB0aGVuIE1BWUJFX0xVQT0ibHVhIiA7IGVsc2UgTUFZQkVfTFVBPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9MVUFdKQoraWYgdGVzdCAiJGhhdmVfcnMiID0gInllcyIgOyB0aGVuIE1BWUJFX1JTPSJycyIgOyBlbHNlIE1BWUJFX1JTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9SU10pCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4gTUFZQkVfU1dJRlQ9InN3aWZ0IiA7IGVsc2UgTUFZQkVfU1dJRlQ9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1NXSUZUXSkKK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuIE1BWUJFX0RPVE5FVENPUkU9Im5ldGNvcmUiIDsgZWxzZSBNQVlCRV9ET1RORVRDT1JFPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9ET1RORVRDT1JFXSkKK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DTD0iY2wiIDsgZWxzZSBNQVlCRV9DTD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfQ0xdKQorCiBBQ19PVVRQVVQKIAogCiBlY2hvCiBlY2hvICIkUEFDS0FHRSAkVkVSU0lPTiIKIGVjaG8KLWVjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKIGVjaG8gIkJ1aWxkaW5nIEMgKEdMaWIpIExpYnJhcnkgLi4uLiA6ICRoYXZlX2NfZ2xpYiIKLWVjaG8gIkJ1aWxkaW5nIEphdmEgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2phdmEiCi1lY2hvICJCdWlsZGluZyBDIyBMaWJyYXJ5IC4uLi4uLi4uLi4gOiAkaGF2ZV9jc2hhcnAiCi1lY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCi1lY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgotZWNobyAiQnVpbGRpbmcgSGFza2VsbCBMaWJyYXJ5IC4uLi4uIDogJGhhdmVfaGFza2VsbCIKLWVjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCi1lY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBDIyAoTW9ubykgTGlicmFyeSAuLi4gOiAkaGF2ZV9jc2hhcnAiCitlY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCitlY2hvICJCdWlsZGluZyBDb21tb24gTGlzcCBMaWJyYXJ5Li4gOiAkaGF2ZV9jbCIKK2VjaG8gIkJ1aWxkaW5nIEQgTGlicmFyeSAuLi4uLi4uLi4uLiA6ICRoYXZlX2QiCitlY2hvICJCdWlsZGluZyBEYXJ0IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9kYXJ0IgorZWNobyAiQnVpbGRpbmcgZG90bmV0Y29yZSBMaWJyYXJ5IC4uIDogJGhhdmVfZG90bmV0Y29yZSIKIGVjaG8gIkJ1aWxkaW5nIEVybGFuZyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX2VybGFuZyIKIGVjaG8gIkJ1aWxkaW5nIEdvIExpYnJhcnkgLi4uLi4uLi4uLiA6ICRoYXZlX2dvIgotZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKK2VjaG8gIkJ1aWxkaW5nIEhhc2tlbGwgTGlicmFyeSAuLi4uLiA6ICRoYXZlX2hhc2tlbGwiCitlY2hvICJCdWlsZGluZyBIYXhlIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9oYXhlIgorZWNobyAiQnVpbGRpbmcgSmF2YSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfamF2YSIKK2VjaG8gIkJ1aWxkaW5nIEx1YSBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2x1YSIKK2VjaG8gIkJ1aWxkaW5nIE5vZGVKUyBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX25vZGVqcyIKK2VjaG8gIkJ1aWxkaW5nIFBlcmwgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3BlcmwiCitlY2hvICJCdWlsZGluZyBQSFAgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9waHAiCitlY2hvICJCdWlsZGluZyBQbHVnaW4gU3VwcG9ydCAuLi4uLi4gOiAkaGF2ZV9wbHVnaW4iCitlY2hvICJCdWlsZGluZyBQeXRob24gTGlicmFyeSAuLi4uLi4gOiAkaGF2ZV9weXRob24iCitlY2hvICJCdWlsZGluZyBQeTMgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9weTMiCitlY2hvICJCdWlsZGluZyBSdWJ5IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ydWJ5IgorZWNobyAiQnVpbGRpbmcgUnVzdCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnMiCitlY2hvICJCdWlsZGluZyBTd2lmdCBMaWJyYXJ5IC4uLi4uLi4gOiAkaGF2ZV9zd2lmdCIKIAotaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkMrKyBMaWJyYXJ5OiIKLSAgZWNobyAiICAgQnVpbGQgVFpsaWJUcmFuc3BvcnQgLi4uLi4uIDogJGhhdmVfemxpYiIKLSAgZWNobyAiICAgQnVpbGQgVE5vbmJsb2NraW5nU2VydmVyIC4uIDogJGhhdmVfbGliZXZlbnQiCi0gIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdCkgLi4uLiA6ICRoYXZlX3F0IgotZmkKLWlmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgamF2YWMgLi4uLi4uLi4uLi4uLi4uIDogJEpBVkFDIgotICBlY2hvICIgICBVc2luZyBqYXZhIC4uLi4uLi4uLi4uLi4uLi4gOiAkSkFWQSIKLSAgZWNobyAiICAgVXNpbmcgYW50IC4uLi4uLi4uLi4uLi4uLi4uIDogJEFOVCIKLWZpCiBpZiB0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KICAgZWNobyAiQyMgTGlicmFyeToiCiAgIGVjaG8gIiAgIFVzaW5nIC5ORVQgMy41IC4uLi4uLi4uLi4uLiA6ICRuZXRfM181IgorICBlY2hvICIgICBVc2luZyBtb25vIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRNQ1MgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlB5dGhvbiBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgUHl0aG9uIC4uLi4uLi4uLi4uLi4uIDogJFBZVEhPTiIKKyAgZWNobyAiQysrIExpYnJhcnk6IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgLi4uLi4uLi4uLi4uLi4gOiAkQ1hYIgorICBlY2hvICIgICBCdWlsZCBUWmxpYlRyYW5zcG9ydCAuLi4uLi4gOiAkaGF2ZV96bGliIgorICBlY2hvICIgICBCdWlsZCBUTm9uYmxvY2tpbmdTZXJ2ZXIgLi4gOiAkaGF2ZV9saWJldmVudCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NCkgLi4uIDogJGhhdmVfcXQiCisgIGVjaG8gIiAgIEJ1aWxkIFRRVGNwU2VydmVyIChRdDUpIC4uLiA6ICRoYXZlX3F0NSIKKyAgZWNobyAiICAgQysrIGNvbXBpbGVyIHZlcnNpb24gLi4uLi4uIDogJCgkQ1hYIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlBIUCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgcGhwLWNvbmZpZyAuLi4uLi4uLi4uIDogJFBIUF9DT05GSUciCisgIGVjaG8gIkNvbW1vbiBMaXNwIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDb21tb24gTGlzcCAuLi4uLi4uLi4gOiAkU0JDTCIKKyAgZWNobyAiICAgVXNpbmcgQ29tbW9uIExpc3AgdmVyc2lvbiAuIDogJCgkU0JDTCAtLXZlcnNpb24pIgogZmkKLWlmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9kIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlJ1YnkgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgorICBlY2hvICJEIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBEIENvbXBpbGVyIC4uLi4uLi4uLi4gOiAkRE1EIgorICBlY2hvICIgICBCdWlsZGluZyBEIGxpYmV2ZW50IHRlc3RzIC4gOiAkd2l0aF9kX2V2ZW50X3Rlc3RzIgorICBlY2hvICIgICBCdWlsZGluZyBEIFNTTCB0ZXN0cyAuLi4uLi4gOiAkd2l0aF9kX3NzbF90ZXN0cyIKKyAgZWNobyAiICAgVXNpbmcgRCB2ZXJzaW9uIC4uLi4uLi4uLi4uIDogJCgkRE1EIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKLWlmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgLi4uLi4uLi4uLi4uLiA6ICRSVU5IQVNLRUxMIgotICBlY2hvICIgICBVc2luZyBDYWJhbCAuLi4uLi4uLi4uLi4uLi4gOiAkQ0FCQUwiCisgIGVjaG8gIkRhcnQgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIERhcnQgLi4uLi4uLi4uLi4uLi4uLiA6ICREQVJUIgorICBlY2hvICIgICBVc2luZyBQdWIgLi4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVFBVQiIKKyAgZWNobyAiICAgVXNpbmcgRGFydCB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkREFSVCAtLXZlcnNpb24gMj4mMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcGVybCIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2RvdG5ldGNvcmUiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiUGVybCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgUGVybCAuLi4uLi4uLi4uLi4uLi4uIDogJFBFUkwiCisgIGVjaG8gIi5ORVQgQ29yZSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIC4uLi4uLi4uLi4uIDogJERPVE5FVENPUkUiCisgIGVjaG8gIiAgIFVzaW5nIC5ORVQgQ29yZSB2ZXJzaW9uIC4uLiA6ICRET1RORVRDT1JFX1ZFUlNJT04iCiBmaQogaWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCiAgIGVjaG8gIkVybGFuZyBMaWJyYXJ5OiIKICAgZWNobyAiICAgVXNpbmcgZXJsYyAuLi4uLi4uLi4uLi4uLi4uIDogJEVSTEMiCisgIGVjaG8gIiAgIFVzaW5nIHJlYmFyIC4uLi4uLi4uLi4uLi4uLiA6ICRSRUJBUiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkRVJMIC1ldmFsICdlcmxhbmc6ZGlzcGxheShlcmxhbmc6c3lzdGVtX2luZm8ob3RwX3JlbGVhc2UpKSwgaGFsdCgpLicgLW5vc2hlbGwgfCB0ciAtZCAnXCInKSIKIGZpCiBpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4KICAgZWNobwogICBlY2hvICJHbyBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgR09ST09ULi4uLi4uLi4uLi4uLi4uIDogJEdPUk9PVCIKLSAgZWNobyAiICAgVXNpbmcgR09CSU4uLi4uLi4uLi4uLi4uLi4uIDogJEdPQklOIgotICBlY2hvICIgICBVc2luZyBHT0FSQ0guLi4uLi4uLi4uLi4uLi4gOiAkR09BUkNIIgotICBlY2hvICIgICBVc2luZyBHTyBDb21waWxlci4uLi4uLi4uLi4gOiAkR09fQyIKLSAgZWNobyAiICAgVXNpbmcgR08gTGlua2VyLi4uLi4uLi4uLi4uIDogJEdPX0wiCisgIGVjaG8gIiAgIFVzaW5nIEdvLi4uLi4uLi4uLi4uLi4uLi4uLiA6ICRHTyIKKyAgZWNobyAiICAgVXNpbmcgR28gdmVyc2lvbi4uLi4uLi4uLi4uIDogJCgkR08gdmVyc2lvbikiCiBmaQotaWYgdGVzdCAiJGhhdmVfZCIgPSAieWVzIiA7IHRoZW4KK2lmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiVXNpbmcgRCBDb21waWxlciAuLi4uLi4uLi4uLi4uIDogJERNRCIKLSAgZWNobyAiQnVpbGRpbmcgRCBsaWJldmVudCB0ZXN0cyAuLi4uIDogJHdpdGhfZF9ldmVudF90ZXN0cyIKLSAgZWNobyAiQnVpbGRpbmcgRCBTU0wgdGVzdHMgLi4uLi4uLi4uIDogJHdpdGhfZF9zc2xfdGVzdHMiCisgIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgdmVyc2lvbiAuLi4uLiA6ICQoJFJVTkhBU0tFTEwgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhheGUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgLi4uLi4uLi4uLi4uLi4uLiA6ICRIQVhFIgorICBlY2hvICIgICBVc2luZyBIYXhlIHZlcnNpb24gLi4uLi4uLi4gOiAkSEFYRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZ3JhZGxldyAuLi4uLi4uLi4uLi4uIDogbGliL2phdmEvZ3JhZGxldyIKKyAgZWNobyAiICAgVXNpbmcgamF2YSAuLi4uLi4uLi4uLi4uLi4uIDogJEpBVkEiCisgIGVjaG8gIiAgIFVzaW5nIGphdmFjIC4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBQyIKKyAgZWNobyAiICAgVXNpbmcgR3JhZGxlIHZlcnNpb24gLi4uLi4uIDogJChsaWIvamF2YS9ncmFkbGV3IC0tdmVyc2lvbiAtLXF1aWV0IHwgZ3JlcCBHcmFkbGUgMj4mMSkiCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEpBVkEgLXZlcnNpb24gMj4mMSB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkx1YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgTHVhIC4uLi4uLi4uLi4uLi4uLi4uIDogJExVQSIKKyAgZWNobyAiICAgVXNpbmcgTHVhIHZlcnNpb24uLi4uLi4uLi4uIDogJCgkTFVBIC12KSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiTm9kZUpTIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgLi4uLi4uLi4uLi4uLi4gOiAkTk9ERUpTIgorICBlY2hvICIgICBVc2luZyBOb2RlSlMgdmVyc2lvbi4uLi4uLi4gOiAkKCROT0RFSlMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlBlcmwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFBlcmwgLi4uLi4uLi4uLi4uLi4uLiA6ICRQRVJMIgorICBlY2hvICIgICBVc2luZyBQZXJsIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRQRVJMIC12IHwgZ3JlcCAndmVyc2lvbiAnKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9waHAiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUEhQIExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKKyAgZWNobyAiICAgVXNpbmcgcGhwIHZlcnNpb24gLi4uLi4uLi4uIDogJCgkUEhQIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX3B5dGhvbiIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQeXRob24gTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiAuLi4uLi4uLi4uLi4uLiA6ICRQWVRIT04iCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbiB2ZXJzaW9uIC4uLi4uLiA6ICQoJFBZVEhPTiAtLXZlcnNpb24gMj4mMSkiCisgIGlmIHRlc3QgIiRoYXZlX3B5MyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uMyAuLi4uLi4uLi4uLi4uIDogJFBZVEhPTjMiCisgIGVjaG8gIiAgIFVzaW5nIFB5dGhvbjMgdmVyc2lvbiAuLi4uLiA6ICQoJFBZVEhPTjMgLS12ZXJzaW9uKSIKKyAgZmkKKyAgaWYgdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyI7IHRoZW4KKyAgZWNobyAiICAgVXNpbmcgdHJpYWwgLi4uLi4uLi4uLi4uLi4uIDogJFRSSUFMIgorICBmaQorZmkKK2lmIHRlc3QgIiRoYXZlX3J1YnkiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiUnVieSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUnVieSAuLi4uLi4uLi4uLi4uLi4uIDogJFJVQlkiCisgIGVjaG8gIiAgIFVzaW5nIFJ1YnkgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJFJVQlkgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJSdXN0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBDYXJnby4uLi4uLi4uLi4uLi4uLi4gOiAkQ0FSR08iCisgIGVjaG8gIiAgIFVzaW5nIHJ1c3RjLi4uLi4uLi4uLi4uLi4uLiA6ICRSVVNUQyIKKyAgZWNobyAiICAgVXNpbmcgUnVzdCB2ZXJzaW9uLi4uLi4uLi4uIDogJCgkUlVTVEMgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJTd2lmdCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgU3dpZnQgLi4uLi4uLi4uLi4uLi4uIDogJFNXSUZUIgorICBlY2hvICIgICBVc2luZyBTd2lmdCB2ZXJzaW9uIC4uLi4uLi4gOiAkKCRTV0lGVCAtLXZlcnNpb24gfCBoZWFkIC0xKSIKIGZpCiBlY2hvCiBlY2hvICJJZiBzb21ldGhpbmcgaXMgbWlzc2luZyB0aGF0IHlvdSB0aGluayBzaG91bGQgYmUgcHJlc2VudCwiCiBlY2hvICJwbGVhc2Ugc2tpbSB0aGUgb3V0cHV0IG9mIGNvbmZpZ3VyZSB0byBmaW5kIHRoZSBtaXNzaW5nIgogZWNobyAiY29tcG9uZW50LiAgRGV0YWlscyBhcmUgcHJlc2VudCBpbiBjb25maWcubG9nLiIKK2VjaG8KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZyBiL2NvbnRyaWIvUmVidXMvQXBwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA4YWY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9BcHAuY29uZmlnCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKyAgCisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbiBuYW1lPSJyZWJ1cyIgdHlwZT0iUmVidXMuQ29uZmlndXJhdGlvbi5SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uLCBSZWJ1cyIvPgorICA8L2NvbmZpZ1NlY3Rpb25zPgorCisgIDxyZWJ1cyBpbnB1dFF1ZXVlPSJNeVJlc3BvbnNlcyIgZXJyb3JRdWV1ZT0iTXlFcnJvcnMiIHdvcmtlcnM9IjEiPgorICAgIDxlbmRwb2ludHM+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVxdWVzdENhbGwsIFJlYnVzU2FtcGxlIiBlbmRwb2ludD0iTWF0aFJlcXVlc3RzIi8+CisgICAgICA8YWRkIG1lc3NhZ2VzPSJSZWJ1c1NhbXBsZS5NYXRoUmVzcG9uc2VDYWxsLCBSZWJ1c1NhbXBsZSIgZW5kcG9pbnQ9Ik1hdGhSZXNwb25zZXMiLz4KKyAgICA8L2VuZHBvaW50cz4KKyAgPC9yZWJ1cz4KKworICA8c3RhcnR1cD48c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC4wIi8+PC9zdGFydHVwPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcyBiL2NvbnRyaWIvUmVidXMvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNjNjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsODEgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBSZWJ1c1NhbXBsZS5DbGllbnQ7Cit1c2luZyBSZWJ1c1NhbXBsZS5TZXJ2ZXI7CisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBTdGFydFJlcXVlc3RTZXJ2ZXIoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2xpZW50IFJlYnVzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIHZhciBhZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChhZGFwdGVyKQorICAgICAgICAgICAgICAgIC5UcmFuc3BvcnQodCA9PiB0LlVzZVJhYmJpdE1xKCJhbXFwOi8vIiArIHNlcnZlciwgIk1hdGhSZXF1ZXN0cyIsICJNYXRoUmVxdWVzdEVycm9ycyIpKQorICAgICAgICAgICAgICAgIC5NZXNzYWdlT3duZXJzaGlwKG8gPT4gby5Gcm9tUmVidXNDb25maWd1cmF0aW9uU2VjdGlvbigpKQorICAgICAgICAgICAgICAgIC5DcmVhdGVCdXMoKS5TdGFydCgpOworCisgICAgICAgICAgICAvLyByZWdpc3RlciBhbGwgcmVsZXZhbnQgbWVzc2FnZSBoYW5kbGVycyAKKyAgICAgICAgICAgIGFkYXB0ZXIuUmVnaXN0ZXIodHlwZW9mKE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBhZGFwdGVyOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIgU3RhcnRSZXNwb25zZVNlcnZlcihzdHJpbmcgc2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjbGllbnQgUmVidXMgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgdmFyIGFkYXB0ZXIgPSBuZXcgQnVpbHRpbkNvbnRhaW5lckFkYXB0ZXIoKTsKKyAgICAgICAgICAgIENvbmZpZ3VyZS5XaXRoKGFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXEoImFtcXA6Ly8iICsgc2VydmVyLCAiTWF0aFJlc3BvbnNlcyIsICJNYXRoUmVzcG9uc2VFcnJvcnMiKSkKKyAgICAgICAgICAgICAgICAuTWVzc2FnZU93bmVyc2hpcChvID0+IG8uRnJvbVJlYnVzQ29uZmlndXJhdGlvblNlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAuQ3JlYXRlQnVzKCkuU3RhcnQoKTsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHJlbGV2YW50IG1lc3NhZ2UgaGFuZGxlcnMgCisgICAgICAgICAgICBhZGFwdGVyLlJlZ2lzdGVyKHR5cGVvZihNYXRoUmVzcG9uc2VDYWxsSGFuZGxlcikpOworICAgICAgICAgICAgcmV0dXJuIGFkYXB0ZXI7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBzZXJ2ZXIgPSAibG9jYWxob3N0IjsKKworICAgICAgICAgICAgLy8gc3RhcnQgYWxsIHNlcnZlcnMKKyAgICAgICAgICAgIHZhciByZXEgPSBTdGFydFJlcXVlc3RTZXJ2ZXIoc2VydmVyKTsKKyAgICAgICAgICAgIHZhciByc3AgPSBTdGFydFJlc3BvbnNlU2VydmVyKHNlcnZlcik7CisKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXF1ZXN0Q2xpZW50KHNlcnZlcik7CisgICAgICAgICAgICBjbGllbnQuRG9UaGVNYXRoKHJhbmRvbS5OZXh0KCksIHJhbmRvbS5OZXh0KCkpOworCisgICAgICAgICAgICAvLyBub3cgd2hhdD8KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIkhpdCA8RU5URVI+IHRvIHN0b3AgLi4uICIpOworICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3NmVhYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSwzOCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlJlYnVzU2FtcGxlIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCitbYXNzZW1ibHk6IEd1aWQoIjBhZjEwOTg0LTQwZDMtNDUzZC1iMWU1LTQyMTUyOWU4YzdlMiIpXQorCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1JFQURNRS5tZCBiL2NvbnRyaWIvUmVidXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYjljNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1JFQURNRS5tZApAQCAtMCwwICsxLDIxIEBACitTYW1wbGUgY29kZSBmb3IgdGhlIGNvbWJpbmF0aW9uIG9mIFRocmlmdCB3aXRoIFJlYnVzLgorCitSZWJ1cyBpcyBhIC5ORVQgc2VydmljZSBidXMsIHNpbWlsYXIgdG8gTlNlcnZpY2VCdXMsIGJ1dCBtb3JlIGxpZ2h0d2VpZ2h0LiAKK0l0IGloYXMgYmVlbiBtYWlubHkgd3JpdHRlbiBieSBNb2dlbnMgSGVsbGVyIEdyYWJlIGFuZCBpcyBjdXJyZW50bHkgaG9zdGVkIAorb24gR2l0SHViIChodHRwczovL2dpdGh1Yi5jb20vcmVidXMtb3JnL1JlYnVzKQorCitBcyB3aXRoIGFsbCBTZXJ2aWNlQnVzIG9yIE1RIHNjZW5hcmlvcywgZHVlIHRvIHRoZSBoaWdobHkgYXN5bmNocm9ub3VzIAorb3BlcmF0aW9ucyBpdCBpcyByZWNvbW1lbmRlZCB0byBkbyBhbGwgY2FsbHMgYXMgIm9uZXdheSB2b2lkIiBjYWxscy4KKworVGhlIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRvbmUgdmlhIEFwcC5Db25maWcsIHZpYSBjb2RlIG9yIGV2ZW4gbWl4ZWQgZnJvbSAKK2JvdGggbG9jYXRpb25zLiBSZWZlciB0byB0aGUgUmVidXMgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiBGb3IgCit0aGlzIGV4YW1wbGUsIHNpbmNlIHdlIGFyZSBlZmZlY3RpdmVseSBpbXBsZW1lbnRpbmcgdHdvIHF1ZXVlIGxpc3RlbmVycyBpbiAKK29ubHkgb25lIHNpbmdsZSBwcm9jZXNzLCB3ZSBkbyBjb25maWd1cmF0aW9uIG9mIGluY29taW5nIGFuZCBlcnJvciBxdWV1ZXMgCitpbiB0aGUgY29kZS4KKworSWYgeW91IHdhbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBub24tTkVUIGxhbmd1YWdlcywgeW91IG1heSBuZWVkIGEgY3VzdG9taXplZCAKK3NlcmlhbGl6ZXIgYXMgd2VsbCwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgUmVidXMnIGRlZmF1bHQgd2lyZSBmb3JtYXQuIFBsZWFzZSAKK3JlZmVyIHRvIHRoZSBSZWJ1cyBkb2NzIG9uIGhvdyB0byBkbyB0aGF0IChpdCdzIG5vdCB0aGF0IGhhcmQsIHJlYWxseSkuCisKK0FkZGl0aW9uYWwgcmVxdWlyZW1lbnRzOgorLSBSYWJiaXRNUSAuTkVUIGNsaWVudCAoc2VlIG51Z2V0KQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2ogYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU4YTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5jc3Byb2oKQEAgLTAsMCArMSwxMDIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPnsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlJlYnVzU2FtcGxlPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+UmVidXNTYW1wbGU8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+QW55Q1BVPC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJhYmJpdE1RLkNsaWVudCI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XHJhYmJpdG1xLWRvdG5ldC1jbGllbnQtMy4yLjEtZG90bmV0LTMuMFxiaW5cUmFiYml0TVEuQ2xpZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJSZWJ1cyI+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cLi5cLi5cVG9vbGJveFxTZXJ2aWNlQnVzXDNyZHBhcnR5XFJlYnVzLW1hc3RlclxkZXBsb3lcTkVUNDBcUmVidXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlJlYnVzLlJhYmJpdE1RIj4KKyAgICAgIDxIaW50UGF0aD4uLlwuLlwuLlwuLlwuLlxUb29sYm94XFNlcnZpY2VCdXNcM3JkcGFydHlcUmVidXMtbWFzdGVyXGRlcGxveVxORVQ0MFxSZWJ1cy5SYWJiaXRNUS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Imdlbi1jc2hhcnBcQmFzaWNNYXRoU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZpY2VJbXBsXEJvdGguY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmljZUltcGxcU2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Tm9uZSBJbmNsdWRlPSJBcHAuY29uZmlnIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cCAvPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OWViNjNjLWQ3NGMtNDdlOC1hZTQ4LWEyZmM5NDUzOGU5ZH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFByZUJ1aWxkRXZlbnQ+Y2QgJChQcm9qZWN0RGlyKQoraWYgbm90IGV4aXN0IGdlbi1jc2hhcnBcKi5jcyAgIHRocmlmdCAgLWdlbiBjc2hhcnAgc2FtcGxlLnRocmlmdAorPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4gYi9jb250cmliL1JlYnVzL1JlYnVzU2FtcGxlLnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRlZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9SZWJ1cy9SZWJ1c1NhbXBsZS5zbG4KQEAgLTAsMCArMSwyOCBAQAor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTMKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMi4wLjMwMTEwLjAKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlJlYnVzU2FtcGxlIiwgIlJlYnVzU2FtcGxlLmNzcHJvaiIsICJ7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyNjRFMjEyNi1FREUwLTRCNDctODlDMS1CMzk3QjI1QkIxM0R9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezI2NEUyMTI2LUVERTAtNEI0Ny04OUMxLUIzOTdCMjVCQjEzRH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjY0RTIxMjYtRURFMC00QjQ3LTg5QzEtQjM5N0IyNUJCMTNEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9Cb3RoLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTY3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL0JvdGguY3MKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZQoreworICAgIC8vIGdlbmVyaWMgZGF0YSBjb250YWluZXIgZm9yIHNlcmlhbGl6ZWQgVGhyaWZ0IGNhbGxzCisgICAgcHVibGljIGNsYXNzIEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbAorICAgIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSByYXdCeXRlczsKKyAgICB9CisKKyAgICAvLyBzcGVjaWZpYyBjb250YWluZXJzIChvbmUgcGVyIFRocmlmdCBzZXJ2aWNlKSB0byBsZXZlcmFnZSBSZWJ1cycgaGFuZGxlciByb3V0aW5nCisgICAgcHVibGljIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKyAgICBwdWJsaWMgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbCA6IEdlbmVyaWNUaHJpZnRTZXJ2aWNlQ2FsbCB7IH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzIGIvY29udHJpYi9SZWJ1cy9TZXJ2aWNlSW1wbC9DbGllbnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwODA0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvQ2xpZW50LmNzCkBAIC0wLDAgKzEsMTU3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBSZWJ1czsKK3VzaW5nIFJlYnVzLkNvbmZpZ3VyYXRpb247Cit1c2luZyBSZWJ1cy5NZXNzYWdlczsKK3VzaW5nIFJlYnVzLlJhYmJpdE1ROwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCisvKgorICogVGhlIGNsaWVudCBlbWl0cyBjYWxscyB0byBCYXNpY01hdGhTZXJ2ZXJzCisgKiAKKyAqIFRoZSBjbGllbnQgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UuIAorICogSWYgdGhlIHNlcnZlciBoYXMgcHJvY2Vzc2VkIG91ciByZXF1ZXN0LCB3ZSBnZXQgdGhlIHJlc3VsdHMgYmFjayB0aHJvdWdoIHRoaXMgc2VydmljZQorICovCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5DbGllbnQKK3sKKworICAgIC8vIGhhbmRsZXIgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIFJlYnVzCisgICAgY2xhc3MgTWF0aFJlc3BvbnNlQ2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlc3BvbnNlQ2FsbD4KKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEhhbmRsZShNYXRoUmVzcG9uc2VDYWxsIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRocmlmdCBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKG1lc3NhZ2UucmF3Qnl0ZXMpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBwcm9jZXNzb3IgYW5kIGxldCBoaW0gaGFuZGxlIHRoZSBjYWxsCisgICAgICAgICAgICB2YXIgaG5kbCA9IG5ldyBNYXRoUmVzcG9uc2VzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoQ2xpZW50LlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0gICAgICAKKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyByZXNwb25zZXMgd2l0aCBjYWxjdWxhdGlvbiByZXN1bHRzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlc0hhbmRsZXIgOiBCYXNpY01hdGhDbGllbnQuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIEZvdXJSZXN1bHRzKGludCBhZGRlZCwgaW50IG11bHRpcGxpZWQsIGludCBzdWJ0cmFjdGVkLCBpbnQgZGl2aWRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImFkZGVkID0gezB9IiwgYWRkZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIm11bHRpcGxpZWQ9IHswfSIsIG11bHRpcGxpZWQpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInN1YnRyYWN0ZWQgPSB7MH0iLCBzdWJ0cmFjdGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkaXZpZGVkID0gezB9IiwgZGl2aWRlZCk7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBUaHJlZVJlc3VsdHMoaW50IGFkZGVkLCBpbnQgbXVsdGlwbGllZCwgaW50IHN1YnRyYWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGRlZCA9IHswfSIsIGFkZGVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJtdWx0aXBsaWVkPSB7MH0iLCBtdWx0aXBsaWVkKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJzdWJ0cmFjdGVkID0gezB9Iiwgc3VidHJhY3RlZCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRElWLzAgZXJyb3IgZHVyaW5nIGRpdmlzaW9uIik7CisKKyAgICAgICAgICAgIFBpbmdBbmREb0Fub3RoZXJDYWxjdWxhdGlvbigpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsYXRlbmN5ID0gRGF0ZVRpbWUuTm93LlRpY2tzIC0gdmFsdWU7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiUGluZyB0b29rIHswfSBtcyIsIG5ldyBEYXRlVGltZShsYXRlbmN5KS5NaWxsaXNlY29uZCk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBQaW5nQW5kRG9Bbm90aGVyQ2FsY3VsYXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVxdWVzdENsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBjbGllbnQuUGluZyhEYXRlVGltZS5Ob3cuVGlja3MpOworICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChyYW5kb20uTmV4dCgpLCByYW5kb20uTmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVxdWVzdHMKKyAgICBpbnRlcm5hbCBjbGFzcyBNYXRoUmVxdWVzdENsaWVudCA6IEJhc2ljTWF0aFNlcnZlci5JZmFjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBCdWlsdGluQ29udGFpbmVyQWRhcHRlciBNUUFkYXB0ZXI7CisKKworICAgICAgICBwdWJsaWMgTWF0aFJlcXVlc3RDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aFNlcnZlci5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aFNlcnZlci5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiggYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVxdWVzdENhbGwoKSB7IHJhd0J5dGVzID0gc3RtLlRvQXJyYXkoKSB9OworICAgICAgICAgICAgTVFBZGFwdGVyLkJ1cy5TZW5kKG1zZyk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuUGluZyh2YWx1ZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgRG9UaGVNYXRoKCBpbnQgYXJnMSwgaW50IGFyZzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkRvVGhlTWF0aChhcmcxLCBhcmcyKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcyBiL2NvbnRyaWIvUmVidXMvU2VydmljZUltcGwvU2VydmVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1JlYnVzL1NlcnZpY2VJbXBsL1NlcnZlci5jcwpAQCAtMCwwICsxLDE0MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgUmVidXM7Cit1c2luZyBSZWJ1cy5Db25maWd1cmF0aW9uOwordXNpbmcgUmVidXMuTWVzc2FnZXM7Cit1c2luZyBSZWJ1cy5SYWJiaXRNUTsKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworLyoKKyAqIFRoZSBzZXJ2ZXIgaW1wbGVtZW50cyB0aGUgQmFzaWNNYXRoU2VydmVyIHNlcnZpY2UgLgorICogQWxsIHJlc3VsdHMgYXJlIHNlbnQgYmFjayB0byB0aGUgY2xpZW50IHZpYSB0aGUgQmFzaWNNYXRoQ2xpZW50IHNlcnZpY2UKKyAqLworCisKK25hbWVzcGFjZSBSZWJ1c1NhbXBsZS5TZXJ2ZXIKK3sKKyAgICAvLyBoYW5kbGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBSZWJ1cworICAgIGNsYXNzIE1hdGhSZXF1ZXN0Q2FsbEhhbmRsZXIgOiBJSGFuZGxlTWVzc2FnZXM8TWF0aFJlcXVlc3RDYWxsPgorICAgIHsKKyAgICAgICAgcHVibGljIHZvaWQgSGFuZGxlKE1hdGhSZXF1ZXN0Q2FsbCBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbShtZXNzYWdlLnJhd0J5dGVzKTsKKyAgICAgICAgICAgIHZhciB0cm5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cm5zKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgcHJvY2Vzc29yIGFuZCBsZXQgaGltIGhhbmRsZSB0aGUgY2FsbAorICAgICAgICAgICAgdmFyIGhuZGwgPSBuZXcgTWF0aFJlcXVlc3RzSGFuZGxlcigpOworICAgICAgICAgICAgdmFyIHByb2MgPSBuZXcgQmFzaWNNYXRoU2VydmVyLlByb2Nlc3NvcihobmRsKTsKKyAgICAgICAgICAgIHByb2MuUHJvY2Vzcyhwcm90LCBudWxsKTsgIC8vIG9uZXdheSBvbmx5CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHNlcnZlcyBpbmNvbWluZyBjYWxjdWxhdGlvbiByZXF1ZXN0cworICAgIGludGVybmFsIGNsYXNzIE1hdGhSZXF1ZXN0c0hhbmRsZXIgOiBCYXNpY01hdGhTZXJ2ZXIuSWZhY2UKKyAgICB7CisgICAgICAgIHB1YmxpYyB2b2lkIFBpbmcobG9uZyB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBNYXRoUmVzcG9uc2VDbGllbnQoImxvY2FsaG9zdCIpOworICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBEb1RoZU1hdGgoaW50IGFyZzEsIGludCBhcmcyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IE1hdGhSZXNwb25zZUNsaWVudCgibG9jYWxob3N0Iik7CisgICAgICAgICAgICBpZiggYXJnMiAhPSAwKQorICAgICAgICAgICAgICAgIGNsaWVudC5Gb3VyUmVzdWx0cyggYXJnMSthcmcyLCBhcmcxKmFyZzIsIGFyZzEtYXJnMiwgYXJnMS9hcmcyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKCBhcmcxK2FyZzIsIGFyZzEqYXJnMiwgYXJnMS1hcmcyKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gcHJvdmlkZXMgdGhlIGNsaWVudC1zaWRlIGludGVyZmFjZSBmb3IgY2FsY3VsYXRpb24gcmVzcG9uc2VzCisgICAgaW50ZXJuYWwgY2xhc3MgTWF0aFJlc3BvbnNlQ2xpZW50IDogQmFzaWNNYXRoQ2xpZW50LklmYWNlCisgICAgeworICAgICAgICBwcml2YXRlIEJ1aWx0aW5Db250YWluZXJBZGFwdGVyIE1RQWRhcHRlcjsKKworCisgICAgICAgIHB1YmxpYyBNYXRoUmVzcG9uc2VDbGllbnQoc3RyaW5nIHNlcnZlcikKKyAgICAgICAgeworICAgICAgICAgICAgTVFBZGFwdGVyID0gbmV3IEJ1aWx0aW5Db250YWluZXJBZGFwdGVyKCk7CisgICAgICAgICAgICBDb25maWd1cmUuV2l0aChNUUFkYXB0ZXIpCisgICAgICAgICAgICAgICAgLlRyYW5zcG9ydCh0ID0+IHQuVXNlUmFiYml0TXFJbk9uZVdheU1vZGUoImFtcXA6Ly8iICsgc2VydmVyKSkgIC8vIHdlIG5lZWQgc2VuZCBvbmx5CisgICAgICAgICAgICAgICAgLk1lc3NhZ2VPd25lcnNoaXAobyA9PiBvLkZyb21SZWJ1c0NvbmZpZ3VyYXRpb25TZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgLkNyZWF0ZUJ1cygpLlN0YXJ0KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFNlcmlhbGl6ZVRocmlmdENhbGwoQWN0aW9uPEJhc2ljTWF0aENsaWVudC5JZmFjZT4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaHJpZnQgcHJvdG9jb2wvdHJhbnNwb3J0IHN0YWNrCisgICAgICAgICAgICB2YXIgc3RtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdmFyIHRybnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChudWxsLCBzdG0pOworICAgICAgICAgICAgdmFyIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRybnMpOworCisgICAgICAgICAgICAvLyBzZXJpYWxpemUgdGhlIGNhbGwgaW50byBhIGJ1bmNoIG9mIGJ5dGVzCisgICAgICAgICAgICB2YXIgY2xpZW50ID0gbmV3IEJhc2ljTWF0aENsaWVudC5DbGllbnQocHJvdCk7CisgICAgICAgICAgICBpZiAoYWN0aW9uICE9IG51bGwpCisgICAgICAgICAgICAgICAgYWN0aW9uKGNsaWVudCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIHRvIHRoZSBNZW1vcnlTdHJlYW0KKyAgICAgICAgICAgIHRybnMuRmx1c2goKTsKKworICAgICAgICAgICAgLy8gc2VuZCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgdmFyIG1zZyA9IG5ldyBNYXRoUmVzcG9uc2VDYWxsKCkgeyByYXdCeXRlcyA9IHN0bS5Ub0FycmF5KCkgfTsKKyAgICAgICAgICAgIE1RQWRhcHRlci5CdXMuU2VuZChtc2cpOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBQb25nKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LlBvbmcodmFsdWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyB2b2lkIFRocmVlUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgU2VyaWFsaXplVGhyaWZ0Q2FsbChjbGllbnQgPT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbGllbnQuVGhyZWVSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKworICAgICAgICBwdWJsaWMgdm9pZCBGb3VyUmVzdWx0cyhpbnQgYWRkZWQsIGludCBtdWx0aXBsaWVkLCBpbnQgc3VjdHJhY3RlZCwgaW50IGRpdmlkZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcmlhbGl6ZVRocmlmdENhbGwoY2xpZW50ID0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkZvdXJSZXN1bHRzKGFkZGVkLCBtdWx0aXBsaWVkLCBzdWN0cmFjdGVkLCBkaXZpZGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQgYi9jb250cmliL1JlYnVzL3NhbXBsZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZTJkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvUmVidXMvc2FtcGxlLnRocmlmdApAQCAtMCwwICsxLDMwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK3NlcnZpY2UgQmFzaWNNYXRoU2VydmVyIHsKKyAgICBvbmV3YXkgdm9pZCBEb1RoZU1hdGgoIDE6IGkzMiBhcmcxLCAgMjogaTMyIGFyZzIpCisgICAgb25ld2F5IHZvaWQgUGluZygxOiBpNjQgdmFsdWUpCit9CisKK3NlcnZpY2UgQmFzaWNNYXRoQ2xpZW50IHsKKyAgICBvbmV3YXkgdm9pZCBUaHJlZVJlc3VsdHMoIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkKTsKKyAgICBvbmV3YXkgdm9pZCBGb3VyUmVzdWx0cyggIDEgOiBpMzIgYWRkZWQsIDIgOiBpMzIgbXVsdGlwbGllZCwgMyA6IGkzMiBzdWJ0cmFjdGVkLCA0IDogaTMyIGRpdmlkZWQpOworICAgIG9uZXdheSB2b2lkIFBvbmcoMTogaTY0IHZhbHVlKQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi9TdG9tcC9SRUFETUUubWQgYi9jb250cmliL1N0b21wL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTVmMjFjCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9TdG9tcC9SRUFETUUubWQKQEAgLTAsMCArMSwxOCBAQAorU2FtcGxlIGNvZGUgZm9yIFNUT01QLWJhc2VkIFRocmlmdCBjbGllbnRzIGFuZC9vciBzZXJ2ZXJzLgorCitBbHRob3VnaCB0aGUgc2FtcGxlIFRocmlmdCBTVE9NUCBUcmFuc3BvcnQgaXMgd3JpdHRlbiBpbiAKK0RlbHBoaS9QYXNjYWwsIGl0IGNhbiBlYXNpbHkgc2VydmUgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgCitzaW1pbGFyIGltcGxlbWVudGF0aW9ucyBpbiBvdGhlciBsYW5ndWFnZXMuCisKK1NUT01QIGlzIGEgcHJvdG9jb2wgd2lkZWx5IHN1cHBvcnRlZCBieSBtYW55IG1lc3NhZ2luZyBzeXN0ZW1zLAorc3VjaCBhcyBBcGFjaGUgQWN0aXZlTVEsIFJhYmJpdE1RIGFuZCBtYW55IG90aGVycy4gSW4gcGFydGljdWxhciwKK2l0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggU2VydmljZS1CdXMgcHJvZHVjdHMgbGlrZSBSZWJ1cworb3IgTlNlcnZpY2VCdXMsIHdoZW4gcnVubmluZyBhZ2FpbnN0IGEgU1RPTVAtY2FwYWJsZSBNUSBzeXN0ZW0uCisKK0EgcHJlcmVxdWlzaXRlIGZvciB0aGlzIHNhbXBsZSBpcyB0aGUgRGVscGhpIFNUT01QIEFkYXB0ZXIgd3JpdHRlbgorYnkgRGFuaWVsZSBUZXRpIChodHRwOi8vd3d3LmRhbmllbGV0ZXRpLml0L3N0b21wLWNsaWVudCksIGN1cnJlbnRseQoraG9zdGVkIGF0IEdvb2dsZSBDb2RlIChodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZGVscGhpc3RvbXBjbGllbnQpLgorCitBdCB0aGUgdGltZSBvZiB3cml0aW5nLCB0aGUgU1RPTVAgYWRhcHRlciBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IAorYmluYXJ5IGRhdGEuIFBsZWFzZSBjaGVjayB3aGV0aGVyIHRoaXMgaGFzIGJlZW4gZml4ZWQsIG90aGVyd2lzZSAKK3lvdSBoYXZlIHRvIHVzZSB0aGUgSlNPTiBwcm90b2NvbCAob3IgdG8gZml4IGl0IG9uIHlvdXIgb3duKS4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvU3RvbXAvVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUC5wYXMgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmIzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1N0b21wL1RocmlmdC5UcmFuc3BvcnQuU1RPTVAucGFzCkBAIC0wLDAgKzEsMjAwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydC5TVE9NUDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcyxXaW5kb3dzLCBTeXNVdGlscywKKyAgVGhyaWZ0LAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5TdHJlYW0sCisgIFN0b21wQ2xpZW50LAorICBTdG9tcFR5cGVzOworCit0eXBlCisgIFRTdG9tcFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHN0cmljdCBwcml2YXRlCisgICAgRkRhdGEgICAgIDogVFN0cmluZ1N0cmVhbTsKKyAgICBGU2VydmVyICAgOiBzdHJpbmc7CisgICAgRk91dFF1ZXVlIDogc3RyaW5nOworICAgIEZTdG9tcENsaSA6IElTdG9tcENsaWVudDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7ICBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgIG92ZXJyaWRlOworICBlbmQ7CisKKworICBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTZXJ2ZXIgIDogc3RyaW5nOworICAgIEZJblF1ZXVlIDogc3RyaW5nOworICAgIEZDbGllbnQgIDogSVN0b21wQ2xpZW50OworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNlcnZlckFuZFBvcnQsIGFJblF1ZXVlIDogc3RyaW5nKTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgZW5kOworCisKK2NvbnN0CisgIFFVRVVFX1BSRUZJWCAgICA9ICcvcXVldWUvJzsKKyAgVE9QSUNfUFJFRklYICAgID0gJy90b3BpYy8nOworICBFWENIQU5HRV9QUkVGSVggPSAnL2V4Y2hhbmdlLyc7CisKKworaW1wbGVtZW50YXRpb24KKworCisKK2NvbnN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYU91dFF1ZXVlIDogc3RyaW5nKTsKK3ZhciBhZGFwdGVyIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZEYXRhICAgICA6PSBUU3RyaW5nU3RyZWFtLkNyZWF0ZTsKKyAgRlNlcnZlciAgIDo9IGFTZXJ2ZXJBbmRQb3J0OworICBGT3V0UXVldWUgOj0gYU91dFF1ZXVlOworCisgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBGRGF0YSwgRkFMU0UpOworICBpbmhlcml0ZWQgQ3JlYXRlKCBuaWwsIGFkYXB0ZXIpOyAgLy8gb3V0cHV0IG9ubHkKK2VuZDsKKworCitkZXN0cnVjdG9yIFRTdG9tcFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIGluaGVyaXRlZCBEZXN0cm95OworICBGcmVlQW5kTmlsKCBGRGF0YSk7CisgIEZTdG9tcENsaSA6PSBuaWw7CitlbmQ7CisKKworZnVuY3Rpb24gVFN0b21wVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZTdG9tcENsaSA8PiBuaWwpOworZW5kOworCisKK2Z1bmN0aW9uIFRTdG9tcFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGQUxTRTsgIC8vIG91dHB1dCBvbmx5CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIEZTdG9tcENsaSA8PiBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgJ2FscmVhZHkgb3BlbicpCisgIGVsc2UgRlN0b21wQ2xpIDo9IFN0b21wVXRpbHMuTmV3U3RvbXAoIEZTZXJ2ZXIpOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlN0b21wQ2xpIDo9IG5pbDsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTdG9tcFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGU3RvbXBDbGkgPSBuaWwKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnbm90IG9wZW4nKTsKKworICBGU3RvbXBDbGkuU2VuZCggRk91dFF1ZXVlLCBGRGF0YS5EYXRhU3RyaW5nKTsKKyAgRkRhdGEuQ2xlYXI7CitlbmQ7CisKKworLy8tLS0gVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NvbnN0cnVjdG9yIFRTdG9tcFNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBhU2VydmVyQW5kUG9ydCwgYUluUXVldWUgOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlNlcnZlciAgOj0gYVNlcnZlckFuZFBvcnQ7CisgIEZJblF1ZXVlIDo9IGFJblF1ZXVlOworZW5kOworCisKK2Rlc3RydWN0b3IgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgQ2xvc2U7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkxpc3RlbjsKK2JlZ2luCisgIEZDbGllbnQgOj0gU3RvbXBVdGlscy5OZXdTdG9tcChGU2VydmVyKTsKKyAgRkNsaWVudC5TdWJzY3JpYmUoIEZJblF1ZXVlKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFN0b21wU2VydmVyVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGlmIEZDbGllbnQgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGQ2xpZW50LlVuc3Vic2NyaWJlKCBGSW5RdWV1ZSk7CisgICAgRkNsaWVudCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUU3RvbXBTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhciBmcmFtZSAgIDogSVN0b21wRnJhbWU7CisgICAgYWRhcHRlciA6IElUaHJpZnRTdHJlYW07CisgICAgc3RyZWFtICA6IFRTdHJpbmdTdHJlYW07CitiZWdpbgorICBpZiBGQ2xpZW50ID0gbmlsCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vdCBjb25uZWN0ZWQuJyk7CisKKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICB0cnkKKyAgICBmcmFtZSA6PSBGQ2xpZW50LlJlY2VpdmUoTUFYSU5UKTsKKyAgICBpZiBmcmFtZSA9IG5pbCB0aGVuIEV4aXQobmlsKTsKKworICAgIHN0cmVhbSAgOj0gVFN0cmluZ1N0cmVhbS5DcmVhdGUoIGZyYW1lLkdldEJvZHkpOworICAgIGFkYXB0ZXIgOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdHJlYW0sIFRSVUUpOworICAgIHJlc3VsdCAgOj0gVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBhZGFwdGVyLCBuaWwpOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgIGRvIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBFLlRvU3RyaW5nICk7CisgIGVuZDsKK2VuZDsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvVmFncmFudGZpbGUgYi9jb250cmliL1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNTMzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC0wLDAgKzEsMTMzIEBACisjIC0qLSBtb2RlOiBydWJ5IC0qLQorIyB2aTogc2V0IGZ0PXJ1YnkgOgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworJGJ1aWxkX2FuZF90ZXN0ID0gPDxTQ1JJUFQKK2VjaG8gIlByb3Zpc2lvbmluZyBzeXN0ZW0gdG8gY29tcGlsZSBhbmQgdGVzdCBBcGFjaGUgVGhyaWZ0LiIKKworIyBDcmVhdGUgc3dhcCBzcGFjZQorc3VkbyBmYWxsb2NhdGUgLWwgMkcgL3N3YXBmaWxlCitzdWRvIGNobW9kIDYwMCAvc3dhcGZpbGUKK3N1ZG8gbWtzd2FwIC9zd2FwZmlsZQorc3VkbyBzd2Fwb24gL3N3YXBmaWxlCitzdWRvIHN3YXBvbiAtcworCisjIFVwZGF0ZSB0aGUgc3lzdGVtCitzdWRvIERFQklBTl9GUk9OVEVORD1ub25pbnRlcmFjdGl2ZSBhcHQtZ2V0IHVwZGF0ZSAtcXEgLXkKK3N1ZG8gREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgdXBncmFkZSAtcXEgLXkKKworIyBJbnN0YWxsIERlcGVuZGVuY2llcworIyAtLS0KKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhdXRvbWFrZSBsaWJ0b29sIGZsZXggYmlzb24gcGtnLWNvbmZpZyBnKysgbGlic3NsLWRldiBtYWtlIGxpYnF0NC1kZXYgZ2l0IGRlYmhlbHBlcgorCisjIEMrKyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1maWxlc3lzdGVtLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmV2ZW50LWRldiAKKworIyBKYXZhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCisKKyMgUHl0aG9uIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXNpeCBweXRob24zLXNpeAorCisjIFJ1YnkgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcnVieSBydWJ5LWRldgorc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKKworIyBQZXJsIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsCisKKyMgUGhwIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHBocDUgcGhwNS1kZXYgcGhwNS1jbGkgcGhwLXBlYXIgcmUyYworCisjIEdsaWJDIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmdsaWIyLjAtZGV2CisKKyMgRXJsYW5nIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IGVybGFuZy10b29scworCisjIEdPIGRlcGVuZGVuY2llcworZWNobyAiZ29sYW5nLWdvIGdvbGFuZy1nby9kYXNoYm9hcmQgYm9vbGVhbiBmYWxzZSIgfCBkZWJjb25mLXNldC1zZWxlY3Rpb25zCitzdWRvIGFwdC1nZXQgLXkgaW5zdGFsbCAtcXEgZ29sYW5nIGdvbGFuZy1nbworCisjIEhhc2tlbGwgZGVwZW5kZW5jaWVzCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZ2hjIGNhYmFsLWluc3RhbGwgbGliZ2hjLWJpbmFyeS1kZXYgbGliZ2hjLW5ldHdvcmstZGV2IGxpYmdoYy1odHRwLWRldiBsaWJnaGMtaGFzaGFibGUtZGV2IGxpYmdoYy11bm9yZGVyZWQtY29udGFpbmVycy1kZXYgbGliZ2hjLXZlY3Rvci1kZXYKK3N1ZG8gY2FiYWwgdXBkYXRlCisKKyMgTHVhIGRlcGVuZGVuY2llcworc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGx1YTUuMiBsdWE1LjItZGV2CisKKyMgTm9kZS5qcyBkZXBlbmRlbmNpZXMKK3N1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBub2RlanMgbm9kZWpzLWRldiBub2RlanMtbGVnYWN5IG5wbQorCisjIENTaGFycAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1vbm8tZ21jcyBtb25vLWRldmVsIG1vbm8teGJ1aWxkIG1vbm8tY29tcGxldGUgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbAorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1pbmd3MzIgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbnNpcworCisjIEQgZGVwZW5kZW5jaWVzCitzdWRvIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QKK3N1ZG8gYXB0LWdldCB1cGRhdGUgJiYgc3VkbyBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZyAmJiBzdWRvIGFwdC1nZXQgdXBkYXRlCitzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgeGRnLXV0aWxzIGRtZC1iaW4KKworIyBDdXN0b21pemUgdGhlIHN5c3RlbQorIyAtLS0KKyMgRGVmYXVsdCBqYXZhIHRvIGxhdGVzdCAxLjggdmVyc2lvbgordXBkYXRlLWphdmEtYWx0ZXJuYXRpdmVzIC1zIGphdmEtMS44LjAtb3Blbmpkay1hbWQ2NCAKKworIyBQSFBVbml0IHBhY2thZ2UgYnJva2VuIGluIHVidW50dS4gc2VlIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3BocHVuaXQvK2J1Zy83MDE1NDQKK3N1ZG8gYXB0LWdldCB1cGdyYWRlIHBlYXIKK3N1ZG8gcGVhciBjaGFubmVsLWRpc2NvdmVyIHBlYXIucGhwdW5pdC5kZQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgcGVhci5zeW1mb255LmNvbQorc3VkbyBwZWFyIGNoYW5uZWwtZGlzY292ZXIgY29tcG9uZW50cy5lei5ubworc3VkbyBwZWFyIHVwZGF0ZS1jaGFubmVscworc3VkbyBwZWFyIHVwZ3JhZGUtYWxsCitzdWRvIHBlYXIgaW5zdGFsbCAtLWFsbGRlcHMgcGhwdW5pdC9QSFBVbml0CisKK2RhdGUgPiAvZXRjL3ZhZ3JhbnQucHJvdmlzaW9uZWQKKworIyBTdGFydCB0aGUgc291cmNlIGJ1aWxkCisjIC0tLQorZWNobyAiU3RhcnRpbmcgQXBhY2hlIFRocmlmdCBidWlsZC4uLiIKK2NkIC90aHJpZnQKK3NoIGJvb3RzdHJhcC5zaAorc2ggY29uZmlndXJlCittYWtlCittYWtlIGNoZWNrCitlY2hvICJGaW5pc2hlZCBidWlsZGluZyBBcGFjaGUgVGhyaWZ0LiIKKworU0NSSVBUCisKK1ZhZ3JhbnQuY29uZmlndXJlKCIyIikgZG8gfGNvbmZpZ3wKKyAgIyBVYnVudHUgMTQuMDQgTFRTIChUcnVzdHkgVGFocikKKyAgY29uZmlnLnZtLmJveCA9ICJ0cnVzdHk2NCIKKyAgY29uZmlnLnZtLmJveF91cmwgPSAiaHR0cHM6Ly9jbG91ZC1pbWFnZXMudWJ1bnR1LmNvbS92YWdyYW50L3RydXN0eS9jdXJyZW50L3RydXN0eS1zZXJ2ZXItY2xvdWRpbWctYW1kNjQtdmFncmFudC1kaXNrMS5ib3giCisKKyAgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uLyIsICIvdGhyaWZ0IgorCisgIGNvbmZpZy52bS5wcm92aWRlciA6dmlydHVhbGJveCBkbyB8dmJveHwKKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMTAyNCJdCisgICAgdmJveC5jdXN0b21pemUgWyJtb2RpZnl2bSIsIDppZCwgIi0tY3B1cyIsICIyIl0KKyAgICB2Ym94LmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1ydGN1c2V1dGMiLCAib24iXQorICBlbmQKKworICAjIFJ1biB0aGUgYnVpbGQgc2NyaXB0IHRvIGNvbmZpZ3VyZSB0aGUgc3lzdGVtCisgIGNvbmZpZy52bS5wcm92aXNpb24gOnNoZWxsLCA6aW5saW5lID0+ICRidWlsZF9hbmRfdGVzdAorZW5kCmRpZmYgLS1naXQgYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5IGIvY29udHJpYi9hc3luYy10ZXN0L3Rlc3QtbGVhZi5weQppbmRleCA4YjdjM2UzLi40ZWE0YTliIDEwMDc1NQotLS0gYS9jb250cmliL2FzeW5jLXRlc3QvdGVzdC1sZWFmLnB5CisrKyBiL2NvbnRyaWIvYXN5bmMtdGVzdC90ZXN0LWxlYWYucHkKQEAgLTcsMTYgKzcsMTcgQEAKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVEh0dHBTZXJ2ZXIKIGZyb20gYWdnciBpbXBvcnQgQWdncgogCisKIGNsYXNzIEFnZ3JIYW5kbGVyKEFnZ3IuSWZhY2UpOgotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgc2VsZi52YWx1ZXMgPSBbXQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQogCi0gIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6Ci0gICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgIGRlZiBhZGRWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZCh2YWx1ZSkKIAotICBkZWYgZ2V0VmFsdWVzKHNlbGYsICk6Ci0gICAgdGltZS5zbGVlcCgxKQotICAgIHJldHVybiBzZWxmLnZhbHVlcworICAgIGRlZiBnZXRWYWx1ZXMoc2VsZiwgKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZXMKIAogcHJvY2Vzc29yID0gQWdnci5Qcm9jZXNzb3IoQWdnckhhbmRsZXIoKSkKIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9jcmVhdGUtZGViaWFuLXBhY2thZ2VzLnNoIGIvY29udHJpYi9jcmVhdGUtZGViaWFuLXBhY2thZ2VzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODkwNmYxLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvY3JlYXRlLWRlYmlhbi1wYWNrYWdlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMhL2Jpbi9zaAotc2V0IC1lCi0KLWxuIC1zIGNvbnRyaWIvZGViaWFuIGRlYmlhbgotCi1kcGtnLWJ1aWxkcGFja2FnZSAtcmZha2Vyb290IC10YwotCi0jIHJlc3VsdHMKLWxzIC4uLyouZGViIC4uLyouZHNjIC4uLyoudGFyLmd6IC4uLyouY2hhbmdlcwotCi0jIGNsZWFudXAKLXJtIGRlYmlhbgotCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jaGFuZ2Vsb2cgYi9jb250cmliL2RlYmlhbi9jaGFuZ2Vsb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ODlmYzIuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vY2hhbmdlbG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotdGhyaWZ0ICgwLjkuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogdXBkYXRlIHRvIDAuOS4wCi0KLSAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDEwIE9jdCAyMDEyIDEyOjAwOjAwIC0wNTAwCi0KLXRocmlmdCAoMC43LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKLQotICAqIHVwZGF0ZSB0byAwLjcuMAotCi0gLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgVHVlLCAxMCBBdWcgMjAxMSAxNzowMTo1MyAtMDUwMAotCi10aHJpZnQgKDAuNy4wLWRldjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKLSAgKiBhZGRlZCBnbGliCi0gICogZml4IGxvY2F0aW9uIG9mIGxpYnRocmlmdC5qYXIKLQotIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgVHVlLCAxMiBBcHIgMjAxMSAyMTo0MToxOCArMDIwMAotCi10aHJpZnQgKDAuNi4wLWRldjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKLQotICAqIHVwZGF0ZSB2ZXJzaW9uIGZpZWxkCi0gICogYWRkZWQgZGViaWFuIGZvbGRlciB0byB0aHJpZnQvY29udHJpYgotICAqIGNoYW5nZWQgYSBmZXcgZGV0YWlscyBpbiBjb250cm9sIGZpbGUKLSAgKiB1cGRhdGUgY29weXJpZ2h0IGZpbGUKLQotIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgVHVlLCAxNCBEZWMgMjAxMCAxMjoxMjozMyAtMDgwMAotCi10aHJpZnQgKDAuNS4wK25tdTIpIHN0YWJsZTsgdXJnZW5jeT1sb3cKLQotICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KLSAgKiBNZXJnZWQgVEhSSUZULTcxX3Y5LnBhdGNoIHRvIHNraXAgLi9ib290c3RyYXAuc2ggaWYgbm90IGV4aXN0cy4KLSAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL2F0dGFjaG1lbnQvMTI0NjUzNjAvVEhSSUZULTcxX3Y5LnBhdGNoCi0KLSAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAxNTowMDo1NSArMDkwMAotCi10aHJpZnQgKDAuNS4wK25tdTEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKLQotICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KLSAgKiBJbXBvcnRlZCBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciBwaHA1LXRocmlmdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1wbGVnZW8vdGhyaWZ0LgotCi0gLS0gWWFtYXNoaXRhIFl1dSA8eWFtYXNoaXRhQGdlaXNoYXRva3lvLmNvbT4gIFR1ZSwgMDcgRGVjIDIwMTAgMDE6MDA6MTcgKzA5MDAKLQotdGhyaWZ0ICgwLjUuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogdXBkYXRlIHRvIDAuNS4wCi0KLSAtLSBSb2dlciBNZWllciA8cm9nZXJAYXBhY2hlLm9yZz4gIEZyaSwgMDggT2N0IDIwMTAgMTE6MjM6NTMgKzAyMDAKLQotdGhyaWZ0ICgwLjQuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdwotCi0gICogdXBkYXRlIHRvIDAuNC4wCi0KLSAtLSBSb2dlciBNZWllciA8cm9nZXJAYnVmZmVyb3ZlcmZsb3cuY2g+ICBTdW4sIDIyIEF1ZyAyMDEwIDIxOjI2OjAwICswMTAwCi0KLXRocmlmdCAoMC4yMDA4LjEyLjMwfjguMDQpIGhhcmR5OyB1cmdlbmN5PWxvdwotCi0gICogSW5pdGlhbCByZWxlYXNlLgotCi0gLS0gRXN0ZXZlIEZlcm5hbmRleiA8ZXN0ZXZlQGZsdWlkaW5mby5jb20+ICBUaHUsIDE1IEphbiAyMDA5IDExOjM0OjI0ICswMTAwCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jb21wYXQgYi9jb250cmliL2RlYmlhbi9jb21wYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDZmZjguLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vY29tcGF0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotNQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vY29udHJvbCBiL2NvbnRyaWIvZGViaWFuL2NvbnRyb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjNmYmEuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vY29udHJvbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi1Tb3VyY2U6IHRocmlmdAotU2VjdGlvbjogZGV2ZWwKLVByaW9yaXR5OiBleHRyYQotQnVpbGQtRGVwZW5kczogZGViaGVscGVyICg+PSA1KSwgYnVpbGQtZXNzZW50aWFsLCBtb25vLWdtY3MsIHB5dGhvbi1kZXYsIGFudCwKLSAgICBtb25vLWRldmVsLCAgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCwgZXJsYW5nLWJhc2UsIHJ1YnkxLjgtZGV2LCBtb25ncmVsLCBhdXRvY29uZiwgcHl0aG9uLXN1cHBvcnQsCi0gICAgYXV0b21ha2UsIHBrZy1jb25maWcsIGxpYnRvb2wsIGJpc29uLCBmbGV4LCBsaWJib29zdC1kZXYgfCBsaWJib29zdDEuNDAtZGV2LCBweXRob24tYWxsLAotICAgIHB5dGhvbi1hbGwtZGV2LCBweXRob24tYWxsLWRiZywgb3Blbmpkay02LWpkayB8IGphdmEtc2RrLCBsaWJjb21tb25zLWxhbmctamF2YSwKLSAgICBsaWJib29zdC10ZXN0LWRldiB8IGxpYmJvb3N0LXRlc3QxLjQwLWRldiwgbGliZXZlbnQtZGV2LCBwZXJsICg+PSA1LjguMC03KSwKLSAgICBwaHA1LCBwaHA1LWRldiwgbGliZ2xpYjIuMC1kZXYKLU1haW50YWluZXI6IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgotSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8KLVZjcy1Tdm46IGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdAotVmNzLUJyb3dzZXI6IGh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3dmMvdGhyaWZ0Ci1TdGFuZGFyZHMtVmVyc2lvbjogMy43LjIKLVhTLVB5dGhvbi1WZXJzaW9uOiA+PSAyLjQKLQotUGFja2FnZTogdGhyaWZ0LWNvbXBpbGVyCi1BcmNoaXRlY3R1cmU6IGFueQotRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotRGVzY3JpcHRpb246IENvbXBpbGVyIGZvciBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlcwotIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKLSBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwotIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KLSAuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIgdGhhdCBpcyB1c2VkIGZvciB0cmFuc2xhdGluZwotIGZyb20gLnRocmlmdCBmaWxlcyAoY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMpIHRvIHRoZSBsYW5ndWFnZSBiaW5kaW5nCi0gZm9yIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLgotCi1QYWNrYWdlOiBweXRob24tdGhyaWZ0Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogcHl0aG9uCi1EZXBlbmRzOiAke3B5dGhvbjpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQotUmVjb21tZW5kczogcHl0aG9uLXR3aXN0ZWQtY29yZQotUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQotRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIC4KLSBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFB5dGhvbgotIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKLSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCi0KLVBhY2thZ2U6IHB5dGhvbi10aHJpZnQtZGJnCi1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogcHl0aG9uCi1EZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24tdGhyaWZ0ICg9ICR7YmluYXJ5OlZlcnNpb259KSwgcHl0aG9uLWFsbC1kYmcKLVByb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KLURlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoZGVidWcgdmVyc2lvbikKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gLgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scy4KLSBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIKLSBkZWZpbml0aW9uIHRvIFB5dGhvbiBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdwotIHlvdSB0byB1c2UgdGhvc2UgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBydWJ5LXRocmlmdAotQXJjaGl0ZWN0dXJlOiBhbGwKLVNlY3Rpb246IGxpYnMKLURlcGVuZHM6IHJ1YnkgfCBydWJ5LWludGVycHJldGVyLCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci1Qcm92aWRlczogbGlidGhyaWZ0LXJ1YnkKLVJlcGxhY2VzOiBsaWJ0aHJpZnQtcnVieQotQnJlYWtzOiBsaWJ0aHJpZnQtcnVieQotRGVzY3JpcHRpb246IFJ1YnkgYmluZGluZ3MgZm9yIFRocmlmdAotIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKLSBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwotIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KLSAuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBSdWJ5IGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAotIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUnVieQotIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKLSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCi0KLVBhY2thZ2U6IGxpYnRocmlmdC1qYXZhCi1BcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogamF2YS1nY2otY29tcGF0IHwgamF2YTEtcnVudGltZSB8IGphdmEyLXJ1bnRpbWUsICR7bWlzYzpEZXBlbmRzfQotUmVjb21tZW5kczogbGliY29tbW9ucy1sYW5nLWphdmEKLURlc2NyaXB0aW9uOiBKYXZhIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gLgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEphdmEKLSBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCi0gY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtY2lsCi1BcmNoaXRlY3R1cmU6IGFsbAotU2VjdGlvbjogbGlicwotRGVwZW5kczogY2xpLWNvbW1vbiwgbGlibW9uby1jb3JsaWIxLjAtY2lsICg+PSAxLjApLCBsaWJtb25vLXN5c3RlbTEuMC1jaWwgKD49IDEuMCksIAotICAgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwsICR7bWlzYzpEZXBlbmRzfQotRGVzY3JpcHRpb246IENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIC4KLSBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIENMSSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKLSB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEMjCi0gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQotIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KLQotUGFja2FnZTogbGlidGhyaWZ0LXBlcmwKLUFyY2hpdGVjdHVyZTogYWxsCi1TZWN0aW9uOiBwZXJsCi1EZXBlbmRzOiBwZXJsICg+PSA1LjguMC03KSwgJHttaXNjOkRlcGVuZHN9Ci1EZXNjcmlwdGlvbjogUGVybCBiaW5kaW5ncyBmb3IgVGhyaWZ0Ci0gVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcwotIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCi0gYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgotIC4KLSBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFBlcmwgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0Ci0gdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBQZXJsCi0gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQotIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KLQotUGFja2FnZTogbGlidGhyaWZ0MAotQXJjaGl0ZWN0dXJlOiBhbnkKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KLURlc2NyaXB0aW9uOiBUaHJpZnQgQysrIGxpYnJhcnkKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gLgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgcnVudGltZSBsaWJyYXJpZXMgbmVlZGVkIGZvciBDKysgYXBwbGljYXRpb25zCi0gdXNpbmcgVGhyaWZ0LgotCi1QYWNrYWdlOiBsaWJ0aHJpZnQtZGV2Ci1BcmNoaXRlY3R1cmU6IGFueQotU2VjdGlvbjogbGliZGV2ZWwKLURlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAsIGxpYmdsaWIyLjAtZGV2Ci1EZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IChkZXZlbG9wbWVudCBoZWFkZXJzKQotIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKLSBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bwotIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KLSAuCi0gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZXZlbG9wbWVudCBsaWJyYXJpZXMgcmVxdWlyZWQgZm9yIHdyaXRpbmcgQysrCi0gYXBwbGljYXRpb25zIHVzaW5nIFRocmlmdC4KLQotUGFja2FnZTogcGhwNS10aHJpZnQKLUFyY2hpdGVjdHVyZTogYW55Ci1TZWN0aW9uOiBwaHAKLURlcGVuZHM6ICR7cGhwOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9Ci1Qcm92aWRlczogJHtwaHA6UHJvdmlkZXN9Ci1EZXNjcmlwdGlvbjogUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQKLSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCi0gZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KLSBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCi0gLgotIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQuCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQgYi9jb250cmliL2RlYmlhbi9jb3B5cmlnaHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTQ2YjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vY29weXJpZ2h0CisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLVRoaXMgcGFja2FnZSB3YXMgZGViaWFuaXplZCBieSBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4uCi0KLQotVGhpcyBwYWNrYWdlIGFuZCB0aGUgRGViaWFuIHBhY2thZ2luZyBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsCi1zZWUgYC91c3Ivc2hhcmUvY29tbW9uLWxpY2Vuc2VzL0FwYWNoZS0yLjAnLgotCi1UaGUgZm9sbG93aW5nIGluZm9ybWF0aW9ucyB3YXMgY29waWVkIGZyb20gQXBhY2hlIFRocmlmdCBMSUNFTlNFIGZpbGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TT0ZUV0FSRSBESVNUUklCVVRFRCBXSVRIIFRIUklGVDoKLQotVGhlIEFwYWNoZSBUaHJpZnQgc29mdHdhcmUgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3ViY29tcG9uZW50cyB3aXRoCi1zZXBhcmF0ZSBjb3B5cmlnaHQgbm90aWNlcyBhbmQgbGljZW5zZSB0ZXJtcy4gWW91ciB1c2Ugb2YgdGhlIHNvdXJjZQotY29kZSBmb3IgdGhlIHRoZXNlIHN1YmNvbXBvbmVudHMgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCi1jb25kaXRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Qb3J0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGZpbGVzIGFyZSBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2U6Ci0KLSAgbGliL2VybC9zcmMvTWFrZWZpbGUuYW0KLQotUGxlYXNlIHNlZSBkb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZS4KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhlIGZvbGxvd2luZyBmaWxlcyBjb250YWluIHNvbWUgcG9ydGlvbnMgb2YgY29kZSBjb250cmlidXRlZCB1bmRlcgotdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlIChzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQpLCBhbmQgcmVsaWNlbnNlZAotdW5kZXIgdGhlIEFwYWNoZSAyLjAgTGljZW5zZToKLQotICBjb21waWxlci9jcHAvTWFrZWZpbGUuYW0KLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfaHNfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3Rfb2NhbWxfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjCi0gIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwotICBjb21waWxlci9jcHAvc3JjL21haW4uY2MKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X2ZpZWxkLmgKLSAgY29tcGlsZXIvY3BwL3NyYy9wYXJzZS90X3Byb2dyYW0uaAotICBjb21waWxlci9jcHAvc3JjL3BsYXRmb3JtLmgKLSAgY29tcGlsZXIvY3BwL3NyYy90aHJpZnRsLmxsCi0gIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0eS55eQotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RMaXN0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKLSAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcwotICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwotICBsaWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKLSAgbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKLSAgbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgotICBsaWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCi0gIGxpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwotICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCi0gIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKLSAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKLSAgbGliL3JiL2xpYi90aHJpZnQucmIKLSAgbGliL3N0L1JFQURNRQotICBsaWIvc3QvdGhyaWZ0LnN0Ci0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCi0gIHRlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci0gIHRlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUZvciB0aGUgYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGFuZCBjb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBjb21wb25lbnRzOgotCi0jICAgQ29weXJpZ2h0IChjKSAyMDA3IFRob21hcyBQb3JzY2hiZXJnIDx0aG9tYXNAcmFuZHNwcmluZ2VyLmRlPgotIwotIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dAotIyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZAotIyAgIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRm9yIHRoZSBjb21waWxlci9jcHAvc3JjL21kNS5bY2hdIGNvbXBvbmVudHM6Ci0KLS8qCi0gIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiBBbGFkZGluIEVudGVycHJpc2VzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgTC4gUGV0ZXIgRGV1dHNjaAotICBnaG9zdEBhbGFkZGluLmNvbQotCi0gKi8KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Gb3IgdGhlIGxpYi9yYi9zZXR1cC5yYjogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgTWluZXJvIEFva2ksCi1saWIvb2NhbWwvT0NhbWxNYWtlZmlsZSBhbmQgbGliL29jYW1sL1JFQURNRS1PQ2FtbE1ha2VmaWxlIGNvbXBvbmVudHM6Ci0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDcgIE1hcmt1cyBNb3R0bAotCi1MaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAyLjEKLShzZWUgZG9jL2xncGwtMi4xLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlKQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZGViaWFuIGIvY29udHJpYi9kZWJpYW4vZGViaWFuCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwYzJhMjVjLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL2RlYmlhbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNvbnRyaWIvZGViaWFuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vZG9jcyBiL2NvbnRyaWIvZGViaWFuL2RvY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYmQ4MjQuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vZG9jcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTkVXUwotUkVBRE1FCmRpZmYgLS1naXQgYS9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwgYi9jb250cmliL2RlYmlhbi9saWJ0aHJpZnQwLmluc3RhbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWE4Y2QuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdXNyL2xpYi9saWJ0aHJpZnQqLnNvLioKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL3J1bGVzIGIvY29udHJpYi9kZWJpYW4vcnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg5OTVmOWMuLjAwMDAwMDAKLS0tIGEvY29udHJpYi9kZWJpYW4vcnVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotIyEvdXNyL2Jpbi9tYWtlIC1mCi0jIC0qLSBtYWtlZmlsZSAtKi0KLSMgU2FtcGxlIGRlYmlhbi9ydWxlcyB0aGF0IHVzZXMgZGViaGVscGVyLgotIwotIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBKb2V5IEhlc3MgYW5kIENyYWlnIFNtYWxsLgotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgZGgtbWFrZSBpbnRvIGEKLSMgZGgtbWFrZSBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgotIyBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSBDcmFpZyBTbWFsbCBpbiB2ZXJzaW9uIDAuMzcgb2YgZGgtbWFrZS4KLSMKLSMgTW9kaWZpZWQgdG8gbWFrZSBhIHRlbXBsYXRlIGZpbGUgZm9yIGEgbXVsdGktYmluYXJ5IHBhY2thZ2Ugd2l0aCBzZXBhcmF0ZWQKLSMgYnVpbGQtYXJjaCBhbmQgYnVpbGQtaW5kZXAgdGFyZ2V0cyAgYnkgQmlsbCBBbGxvbWJlcnQgMjAwMQotCi0jIFVuY29tbWVudCB0aGlzIHRvIHR1cm4gb24gdmVyYm9zZSBtb2RlLgotI2V4cG9ydCBESF9WRVJCT1NFPTEKLQotIyBUaGlzIGhhcyB0byBiZSBleHBvcnRlZCB0byBtYWtlIHNvbWUgbWFnaWMgYmVsb3cgd29yay4KLWV4cG9ydCBESF9PUFRJT05TCi0KLVBZVkVSUyA6PSAkKHNoZWxsIHB5dmVyc2lvbnMgLXIpCi0KLWNvbmZpZ3VyZTogY29uZmlndXJlLXN0YW1wCi1jb25maWd1cmUtc3RhbXA6Ci0JZGhfdGVzdGRpcgotCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlLgotCWlmIFsgLWYgYm9vdHN0cmFwLnNoIF07IHRoZW4gJChDVVJESVIpL2Jvb3RzdHJhcC5zaDsgZmkKLQkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IgLS13aXRoLWNfZ2xpYiAtLXdpdGhvdXQtZXJsYW5nCi0KLQl0b3VjaCBjb25maWd1cmUtc3RhbXAKLQotCi0jQXJjaGl0ZWN0dXJlCi1idWlsZDogYnVpbGQtYXJjaCBidWlsZC1pbmRlcAotCSMgVGVzdHMgZGlzYWJsZWQKLQkjICQoTUFLRSkgLUMgdGVzdCBjaGVjawotCi1idWlsZC1hcmNoOiBidWlsZC1hcmNoLXN0YW1wCi1idWlsZC1hcmNoLXN0YW1wOiBjb25maWd1cmUtc3RhbXAKLQotCSMgQ29tcGlsZSBjb21waWxlcgotCSQoTUFLRSkgLUMgJChDVVJESVIpL2NvbXBpbGVyL2NwcAotCi0JIyBDb21waWxlIEMrKyBsaWJyYXJ5Ci0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NwcAotCi0JIyBDb21waWxlIEMgKGdsaWIpIGxpYnJhcnkKLQkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY19nbGliCi0KLQkjIFB5dGhvbiBsaWJyYXJ5Ci0JY2QgJChDVVJESVIpL2xpYi9weSAmJiBcCi0gICAgZm9yIHB5IGluICQoUFlWRVJTKTsgZG8gIFwKLSAgICAgICAgJCRweSBzZXR1cC5weSBidWlsZDsgXAotICAgICAgICAkJHB5LWRiZyBzZXR1cC5weSBidWlsZDsgXAotICAgIGRvbmUKLQotCSMgUEhQCi0JY2QgJChDVVJESVIpL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgXAotCQlwaHBpemUgJiYgXAotCQkuL2NvbmZpZ3VyZSAmJiBtYWtlCi0KLQl0b3VjaCAkQAotCi1idWlsZC1pbmRlcDogYnVpbGQtaW5kZXAtc3RhbXAKLWJ1aWxkLWluZGVwLXN0YW1wOiBjb25maWd1cmUtc3RhbXAKLQotCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29tcGlsZSB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZS4KLQkjJChNQUtFKSBkb2MKLQotCSMgSmF2YQotCWNkICQoQ1VSRElSKS9saWIvamF2YSAmJiBcCi0JCWFudAotCi0JIyBDIwotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jc2hhcnAKLQotCSMgUnVieQotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9yYgotCi0JIyBQZXJsCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgSU5TVEFMTERJUlM9dmVuZG9yCi0KLQl0b3VjaCAkQAotCi1jbGVhbjoKLQlkaF90ZXN0ZGlyCi0JZGhfdGVzdHJvb3QKLQlybSAtZiBidWlsZC1hcmNoLXN0YW1wIGJ1aWxkLWluZGVwLXN0YW1wIGNvbmZpZ3VyZS1zdGFtcAotCi0JIyBBZGQgaGVyZSBjb21tYW5kcyB0byBjbGVhbiB1cCBhZnRlciB0aGUgYnVpbGQgcHJvY2Vzcy4KLQktJChNQUtFKSBjbGVhbgotCi0JZGhfY2xlYW4KLQotaW5zdGFsbDogaW5zdGFsbC1pbmRlcCBpbnN0YWxsLWFyY2gKLWluc3RhbGwtaW5kZXA6Ci0JZGhfdGVzdGRpcgotCWRoX3Rlc3Ryb290Ci0JZGhfY2xlYW4gLWsgLWkKLQlkaF9pbnN0YWxsZGlycyAtaQotCi0JIyBBZGQgaGVyZSBjb21tYW5kcyB0byBpbnN0YWxsIHRoZSBpbmRlcCBwYXJ0IG9mIHRoZSBwYWNrYWdlIGludG8KLQkjIGRlYmlhbi88cGFja2FnZT4tZG9jLgotCSNJTlNUQUxMRE9DIwotCi0gICAgICAgICMgSmF2YQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvICYmIFwKLQljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlidGhyaWZ0Ki5qYXIgXAotCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1qYXZhL3Vzci9zaGFyZS9qYXZhLwotCi0gICAgICAgICMgUnVieQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOCAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0LnJiIFwKLQkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS44Ci0JY3AgLXIgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0IFwKLQkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS44Ci0JbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEgJiYgXAotCWNwICQoQ1VSRElSKS9saWIvcmIvbGliL3RocmlmdC5yYiBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOS4xCi0JY3AgLXIgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0IFwKLQkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEKLQotCSMgQyMKLQlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1jaWwvdXNyL2xpYi9jbGkvdGhyaWZ0LyAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9jc2hhcnAvVGhyaWZ0LmRsbCBcCi0JCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvVGhyaWZ0LmRsbAotCi0JIyBQZXJsCi0JJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyCi0KLQlkaF9pbnN0YWxsIC1pCi0KLWluc3RhbGwtYXJjaDoKLQlkaF90ZXN0ZGlyCi0JZGhfdGVzdHJvb3QKLQlkaF9jbGVhbiAtayAtcwotCWRoX2luc3RhbGxkaXJzIC1zCi0KLQkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGluc3RhbGwgdGhlIGFyY2ggcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCi0JIyBkZWJpYW4vdG1wLgotCSMkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90aHJpZnQgaW5zdGFsbAotCi0JIyBDb21waWxlcgotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vdGhyaWZ0LWNvbXBpbGVyL3Vzci9iaW4gJiYgXAotCWNwICQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0IFwKLQkJJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2Jpbi90aHJpZnQgJiYgXAotCXJtZGlyICQoQ1VSRElSKS9kZWJpYW4vdGhyaWZ0LWNvbXBpbGVyL3Vzci9zYmluCi0KLQkjIFB5dGhvbgotCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgXAotCWZvciBweSBpbiAkKFBZVkVSUyk7IGRvIFwKLQkJJCRweSBzZXR1cC5weSBpbnN0YWxsIC0tbm8tY29tcGlsZSAtLXJvb3Q9JChDVVJESVIpL2RlYmlhbi9weXRob24tdGhyaWZ0OyBcCi0JCSQkcHktZGJnIHNldHVwLnB5IGluc3RhbGwgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnOyBcCi0JZG9uZQotCi0JZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5YyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCi0JZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKLQlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIiouZWdnLWluZm8iIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKLQlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7Ci0KLQkjIFBIUAotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcGhwNS10aHJpZnQKLQljZCAkKENVUkRJUikvbGliL3BocCAmJiBcCi0JCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3BocDUtdGhyaWZ0IGluc3RhbGwKLQotCSMgQysrIGFuZCBDIChnbGliKQotCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vdG1wOyBcCi0JY2QgJChDVVJESVIpL2xpYi9jcHAgJiYgXAotCQltYWtlIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAotCWNkICQoQ1VSRElSKS9saWIvY19nbGliICYmIFwKLQkJbWFrZSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKLQotCWRoX2luc3RhbGwgLS1zb3VyY2VkaXI9ZGViaWFuL3RtcCAtcwotCi0KLSMgTXVzdCBub3QgZGVwZW5kIG9uIGFueXRoaW5nLiBUaGlzIGlzIHRvIGJlIGNhbGxlZCBieQotIyBiaW5hcnktYXJjaC9iaW5hcnktaW5kZXAKLSMgaW4gYW5vdGhlciAnbWFrZScgdGhyZWFkLgotYmluYXJ5LWNvbW1vbjoKLQlkaF90ZXN0ZGlyCi0JZGhfdGVzdHJvb3QKLQlkaF9pbnN0YWxsY2hhbmdlbG9ncwotCWRoX2luc3RhbGxkb2NzCi0JZGhfaW5zdGFsbGV4YW1wbGVzCi0JZGhfaW5zdGFsbG1hbgotCWRoX2xpbmsKLQlkaF9zdHJpcCAtTnB5dGhvbi10aHJpZnQtZGJnIC1OdGhyaWZ0LWNvbXBpbGVyIC1ObGlidGhyaWZ0MCAtLWRiZz1weXRob24tdGhyaWZ0LWRiZwotCWRoX3N0cmlwIC1OcHl0aG9uLXRocmlmdC1kYmcKLQlkaF9jb21wcmVzcwotCWRoX2ZpeHBlcm1zCi0JZGhfcHlzdXBwb3J0Ci0JZGhfbWFrZXNobGlicwotCWRoX2luc3RhbGxkZWIKLQlkaF9wZXJsCi0JZGhfc2hsaWJkZXBzCi0JZGhfZ2VuY29udHJvbAotCWRoX21kNXN1bXMKLQlkaF9idWlsZGRlYgotIyBCdWlsZCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRhbnQgcGFja2FnZXMgdXNpbmcgdGhlIGNvbW1vbiB0YXJnZXQuCi1iaW5hcnktaW5kZXA6IGJ1aWxkLWluZGVwIGluc3RhbGwtaW5kZXAKLQkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1pIGJpbmFyeS1jb21tb24KLQotIyBCdWlsZCBhcmNoaXRlY3R1cmUgZGVwZW5kYW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgotYmluYXJ5LWFyY2g6IGJ1aWxkLWFyY2ggaW5zdGFsbC1hcmNoCi0JZWNobyAicGhwOkRlcGVuZHM9cGhwYXBpLSQocGhwLWNvbmZpZzUgLS1waHBhcGkpIiA+IGRlYmlhbi9zdWJzdHZhcnMKLQkkKE1BS0UpIC1mIGRlYmlhbi9ydWxlcyBESF9PUFRJT05TPS1zIGJpbmFyeS1jb21tb24KLQotYmluYXJ5OiBiaW5hcnktYXJjaCBiaW5hcnktaW5kZXAKLS5QSE9OWTogYnVpbGQgY2xlYW4gYmluYXJ5LWluZGVwIGJpbmFyeS1hcmNoIGJpbmFyeSBpbnN0YWxsIGluc3RhbGwtaW5kZXAgaW5zdGFsbC1hcmNoIGNvbmZpZ3VyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vc3Vic3R2YXJzIGIvY29udHJpYi9kZWJpYW4vc3Vic3R2YXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRmNTcyLi4wMDAwMDAwCi0tLSBhL2NvbnRyaWIvZGViaWFuL3N1YnN0dmFycworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXBocDpEZXBlbmRzPXBocGFwaS0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0gYi9jb250cmliL2ZiMzAzL01ha2VmaWxlLmFtCmluZGV4IGRlN2ZiYjYuLmU3NzNlNTIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvTWFrZWZpbGUuYW0KKysrIGIvY29udHJpYi9mYjMwMy9NYWtlZmlsZS5hbQpAQCAtMjEsMTEgKzIxLDI2IEBACiAKIEBQUk9EVUNUX01LQAogCi1TVUJESVJTID0gLiBjcHAgcHkKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfQ1BQCitTVUJESVJTICs9IGNwcAorZW5kaWYKKworaWYgV0lUSF9KQVZBCitTVUJESVJTICs9IGphdmEKK2VuZGlmCisKK2lmIFdJVEhfUEhQCitTVUJESVJTICs9IHBocAorZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK1NVQkRJUlMgKz0gcHkKK2VuZGlmCiAKIEJVSUxUX1NPVVJDRVMgPQogCi0KIGNsZWFuLWxvY2FsOiBjbGVhbi1jb21tb24KIAogQEdMT0JBTF9GT09URVJfTUtACmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1JFQURNRSBiL2NvbnRyaWIvZmIzMDMvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2ZiMzAzL1JFQURNRQpyZW5hbWUgdG8gY29udHJpYi9mYjMwMy9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uY3BwIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKaW5kZXggNTk1OWZiMS4uMWZjNjYxMiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5jcHAKQEAgLTE1NCw5ICsxNTQsOCBAQAogICAgIH0KIAogICAgIHRpbWVzcGVjIHN0YXJ0OwotICAgIGRvdWJsZSBzZWNzID0gMC4wOwogICAgIGluZm8tPmdldFRpbWUoJnN0YXJ0KTsKLSAgICBzZWNzID0gKGRvdWJsZSkobm93LnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgKyAobm93LnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSowLjAwMDAwMDAwMTsKKyAgICBkb3VibGUgc2VjcyA9IChkb3VibGUpKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpICsgKG5vdy50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykqMC4wMDAwMDAwMDE7CiAKICAgICBjaGFyIGJ1ZlsyNTZdOwogICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgIiVkICVzICVzICUuM2YgJWxsdSIsIGksIGFkZHJTdHIsIGNhbGxTdHIsIHNlY3MsCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmggYi9jb250cmliL2ZiMzAzL1RDbGllbnRJbmZvLmgKaW5kZXggZDBhOTc3MC4uNjY2OGMxOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9UQ2xpZW50SW5mby5oCisrKyBiL2NvbnRyaWIvZmIzMDMvVENsaWVudEluZm8uaApAQCAtMTkyLDcgKzE5Miw3IEBACiAKICAgLyoqCiAgICAqIFJldHVybiBhcyBzdHJpbmcgdGhlIHRocmlmdCBjYWxsIGVpdGhlciBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkIG9yCi0gICAqIG1vc3QgcmVjZW50bHkgcHJvY2Vzc2VkIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4gZm9yIGFkZGl0b25hbAorICAgKiBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZCBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBvcGVuIGZvciBhZGRpdGlvbmFsCiAgICAqIGNhbGxzLiAgUmV0dXJucyBOVUxMIGlmIGEgY2FsbCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciBwcm9jZXNzaW5nCiAgICAqIGhhcyBlbmRlZC4KICAgICovCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGM5MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApAQCAtMCwwICsxLDEzNCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEuaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLFttYW5kYXRvcnl8b3B0aW9uYWxdKQorIworIyBERVNDUklQVElPTgorIworIyAgIENoZWNrIGZvciBiYXNlbGluZSBsYW5ndWFnZSBjb3ZlcmFnZSBpbiB0aGUgY29tcGlsZXIgZm9yIHRoZSBDKysxMQorIyAgIHN0YW5kYXJkOyBpZiBuZWNlc3NhcnksIGFkZCBzd2l0Y2hlcyB0byBDWFhGTEFHUyB0byBlbmFibGUgc3VwcG9ydC4KKyMKKyMgICBUaGUgZmlyc3QgYXJndW1lbnQsIGlmIHNwZWNpZmllZCwgaW5kaWNhdGVzIHdoZXRoZXIgeW91IGluc2lzdCBvbiBhbgorIyAgIGV4dGVuZGVkIG1vZGUgKGUuZy4gLXN0ZD1nbnUrKzExKSBvciBhIHN0cmljdCBjb25mb3JtYW5jZSBtb2RlIChlLmcuCisjICAgLXN0ZD1jKysxMSkuICBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwgeW91IGdldCB3aGF0ZXZlciB3b3Jrcywgd2l0aAorIyAgIHByZWZlcmVuY2UgZm9yIGFuIGV4dGVuZGVkIG1vZGUuCisjCisjICAgVGhlIHNlY29uZCBhcmd1bWVudCwgaWYgc3BlY2lmaWVkICdtYW5kYXRvcnknIG9yIGlmIGxlZnQgdW5zcGVjaWZpZWQsCisjICAgaW5kaWNhdGVzIHRoYXQgYmFzZWxpbmUgQysrMTEgc3VwcG9ydCBpcyByZXF1aXJlZCBhbmQgdGhhdCB0aGUgbWFjcm8KKyMgICBzaG91bGQgZXJyb3Igb3V0IGlmIG5vIG1vZGUgd2l0aCB0aGF0IHN1cHBvcnQgaXMgZm91bmQuICBJZiBzcGVjaWZpZWQKKyMgICAnb3B0aW9uYWwnLCB0aGVuIGNvbmZpZ3VyYXRpb24gcHJvY2VlZHMgcmVnYXJkbGVzcywgYWZ0ZXIgZGVmaW5pbmcKKyMgICBIQVZFX0NYWDExIGlmIGFuZCBvbmx5IGlmIGEgc3VwcG9ydGluZyBtb2RlIGlzIGZvdW5kLgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEJlbmphbWluIEtvc25payA8YmtvekByZWRoYXQuY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMiBaYWNrIFdlaW5iZXJnIDx6YWNrd0BwYW5peC5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDEzIFJveSBTdG9nbmVyIDxyb3lzdGduckBpY2VzLnV0ZXhhcy5lZHU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDMKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSwgWworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgY2hlY2sKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7CisgICAgfTsKKworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Ym9vbD4+IHJpZ2h0X2FuZ2xlX2JyYWNrZXRzOworCisgICAgaW50IGE7CisgICAgZGVjbHR5cGUoYSkgYjsKKworICAgIHR5cGVkZWYgY2hlY2s8aW50PiBjaGVja190eXBlOworICAgIGNoZWNrX3R5cGUgYzsKKyAgICBjaGVja190eXBlJiYgY3IgPSBzdGF0aWNfY2FzdDxjaGVja190eXBlJiY+KGMpOworCisgICAgYXV0byBkID0gYTsKK10pCisKK0FDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbZG5sCisgIG00X2lmKFskMV0sIFtdLCBbXSwKKyAgICAgICAgWyQxXSwgW2V4dF0sIFtdLAorICAgICAgICBbJDFdLCBbbm9leHRdLCBbXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAorICBtNF9pZihbJDJdLCBbXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDJdLCBbbWFuZGF0b3J5XSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAorICAgICAgICBbJDJdLCBbb3B0aW9uYWxdLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9ZmFsc2VdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgc2Vjb25kIGFyZ3VtZW50IGAkMicgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAorICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCisgIGFjX3N1Y2Nlc3M9bm8KKyAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIGJ5IGRlZmF1bHQsCisgIGF4X2N2X2N4eF9jb21waWxlX2N4eDExLAorICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAorICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT15ZXNdLAorICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT1ub10pXSkKKyAgaWYgdGVzdCB4JGF4X2N2X2N4eF9jb21waWxlX2N4eDExID0geHllczsgdGhlbgorICAgIGFjX3N1Y2Nlc3M9eWVzCisgIGZpCisKKyAgbTRfaWYoWyQxXSwgW25vZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3Igc3dpdGNoIGluIC1zdGQ9Z251KysxMTsgZG8KKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKysxMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWEZMQUdTPSIkQ1hYRkxBR1MiCisgICAgICAgICBDWFhGTEFHUz0iJENYWEZMQUdTICRzd2l0Y2giCisgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldKV0sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPXllc10sCisgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKworICBtNF9pZihbJDFdLCBbZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBmb3Igc3dpdGNoIGluIC1zdGQ9YysrMTE7IGRvCisgICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCisgICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAorICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgorICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKKyAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCisgICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKKyAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgYnJlYWsKKyAgICAgIGZpCisgICAgZG9uZQorICBmaV0pCisgIEFDX0xBTkdfUE9QKFtDKytdKQorICBpZiB0ZXN0IHgkYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQgPSB4dHJ1ZTsgdGhlbgorICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCisgICAgICBBQ19NU0dfRVJST1IoWyoqKiBBIGNvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgQysrMTEgbGFuZ3VhZ2UgZmVhdHVyZXMgaXMgcmVxdWlyZWQuXSkKKyAgICBmaQorICBlbHNlCisgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICAgIEhBVkVfQ1hYMTE9MAorICAgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKysxMSBzdXBwb3J0IHdhcyBmb3VuZF0pCisgICAgZWxzZQorICAgICAgSEFWRV9DWFgxMT0xCisgICAgICBBQ19ERUZJTkUoSEFWRV9DWFgxMSwxLAorICAgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKzExIHN5bnRheF0pCisgICAgZmkKKworICAgIEFDX1NVQlNUKEhBVkVfQ1hYMTEpCisgIGZpCitdKQorCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQgYi9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxYjQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNApAQCAtMCwwICsxLDEyMSBAQAorZG5sIEBzeW5vcHNpcyBBWF9KQVZBQ19BTkRfSkFWQQorZG5sIEBzeW5vcHNpcyBBWF9DSEVDS19KQVZBX0NMQVNTKENMQVNTTkFNRSkKK2RubAorZG5sIFRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIEpESywgYW5kIChvcHRpb25hbGx5KSBzcGVjaWZpYyBjbGFzc2VzLgorZG5sCitkbmwgSWYgIkpBVkEiIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGF0IHdpbGwgYmUgdGhlIG9ubHkKK2RubCBqYXZhIGNvbW1hbmQgdGVzdGVkLiAgT3RoZXJ3aXNlLCBhIGhhcmQtY29kZWQgbGlzdCB3aWxsIGJlIHVzZWQuCitkbmwgU2ltaWxhcmx5IGZvciAiSkFWQUMiLgorZG5sCitkbmwgQVhfSkFWQUNfQU5EX0pBVkEgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgdGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyCitkbmwgSmF2YSB2ZXJzaW9uLCB0ZXN0aW5nIGZvciBvbmx5IG9uZSBvZiAiamF2YSIgYW5kICJqYXZhYyIsIG9yCitkbmwgY29tcGlsaW5nIG9yIHJ1bm5pbmcgdXNlci1wcm92aWRlZCBKYXZhIGNvZGUuCitkbmwKK2RubCBBZnRlciBBWF9KQVZBQ19BTkRfSkFWQSBydW5zLCB0aGUgc2hlbGwgdmFyaWFibGVzICJzdWNjZXNzIiBhbmQKK2RubCAiYXhfamF2YWNfYW5kX2phdmEiIGFyZSBzZXQgdG8gInllcyIgb3IgIm5vIiwgYW5kICJKQVZBQyIgYW5kCitkbmwgIkpBVkEiIGFyZSBzZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbW1hbmRzLgorZG5sCitkbmwgQVhfQ0hFQ0tfSkFWQV9DTEFTUyBtdXN0IGJlIHJ1biBhZnRlciBBWF9KQVZBQ19BTkRfSkFWQS4KK2RubCBJdCB0ZXN0cyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgY2xhc3MgYmFzZWQgb24gYSBmdWxseS1xdWFsaWZpZWQgbmFtZS4KK2RubCBJdCBzZXRzIHRoZSBzaGVsbCB2YXJpYWJsZSAic3VjY2VzcyIgdG8gInllcyIgb3IgIm5vIi4KK2RubAorZG5sIEBjYXRlZ29yeSBKYXZhCitkbmwgQHZlcnNpb24gMjAwOS0wMi0wOQorZG5sIEBsaWNlbnNlIEFsbFBlcm1pc3NpdmUKK2RubAorZG5sIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBSZWlzcworZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCisKK0FDX0RFRlVOKFtBWF9KQVZBQ19BTkRfSkFWQV0sCisgICAgICAgICBbCisKKyAgICAgICAgICBkbmwgSGFyZC1jb2RlZCBkZWZhdWx0IGNvbW1hbmRzIHRvIHRlc3QuCisgICAgICAgICAgSkFWQUNfUFJPR1M9ImphdmFjLGppa2VzLGdjaiAtQyIKKyAgICAgICAgICBKQVZBX1BST0dTPSJqYXZhLGthZmZlIgorCisgICAgICAgICAgZG5sIEFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUuCisgICAgICAgICAgaWYgdGVzdCAtbiAiJEpBVkFDIiA7IHRoZW4KKyAgICAgICAgICAgIEpBVkFDX1BST0dTPSIkSkFWQUMiCisgICAgICAgICAgZmkKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkSkFWQSIgOyB0aGVuCisgICAgICAgICAgICBKQVZBX1BST0dTPSIkSkFWQSIKKyAgICAgICAgICBmaQorCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBqYXZhYyBhbmQgamF2YSkKKworICAgICAgICAgIGVjaG8gInB1YmxpYyBjbGFzcyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhIHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NAPDpAQDo+QCkgeyB9IH0iID4gY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhCisgICAgICAgICAgc3VjY2Vzcz1ubworICAgICAgICAgIG9JRlM9IiRJRlMiCisKKyAgICAgICAgICBJRlM9IiwiCisgICAgICAgICAgZm9yIEpBVkFDIGluICRKQVZBQ19QUk9HUyA7IGRvCisgICAgICAgICAgICBJRlM9IiRvSUZTIgorCisgICAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgICBpZiAkSkFWQUMgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhID4mQVNfTUVTU0FHRV9MT0dfRkQgMj4mMSA7IHRoZW4KKworICAgICAgICAgICAgICBJRlM9IiwiCisgICAgICAgICAgICAgIGZvciBKQVZBIGluICRKQVZBX1BST0dTIDsgZG8KKyAgICAgICAgICAgICAgICBJRlM9IiRvSUZTIgorCisgICAgICAgICAgICAgICAgZWNobyAiUnVubmluZyBcIiRKQVZBIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmFcIiIgPiZBU19NRVNTQUdFX0xPR19GRAorICAgICAgICAgICAgICAgIGlmICRKQVZBIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEgPiZBU19NRVNTQUdFX0xPR19GRCAyPiYxIDsgdGhlbgorICAgICAgICAgICAgICAgICAgc3VjY2Vzcz15ZXMKKyAgICAgICAgICAgICAgICAgIGJyZWFrIDIKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgZmkKKworICAgICAgICAgIGRvbmUKKworICAgICAgICAgIHJtIC1mIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhLmNsYXNzCisKKyAgICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgIT0gInllcyIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgSkFWQUM9IiIKKyAgICAgICAgICAgIEpBVkE9IiIKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBmaQorCisgICAgICAgICAgYXhfamF2YWNfYW5kX2phdmE9IiRzdWNjZXNzIgorCisgICAgICAgICAgXSkKKworCitBQ19ERUZVTihbQVhfQ0hFQ0tfSkFWQV9DTEFTU10sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBKYXZhIGNsYXNzIFskMV0pCisKKyAgICAgICAgICBlY2hvICJpbXBvcnQgJDE7IHB1YmxpYyBjbGFzcyBjb25maWd0ZXN0X2F4X2phdmFjX2FuZF9qYXZhIHsgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NAPDpAQDo+QCkgeyB9IH0iID4gY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhCisKKyAgICAgICAgICBlY2hvICJSdW5uaW5nIFwiJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YVwiIiA+JkFTX01FU1NBR0VfTE9HX0ZECisgICAgICAgICAgaWYgJEpBVkFDIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuamF2YSA+JkFTX01FU1NBR0VfTE9HX0ZEIDI+JjEgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICAgIHN1Y2Nlc3M9eWVzCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykKKyAgICAgICAgICAgIHN1Y2Nlc3M9bm8KKyAgICAgICAgICBmaQorCisgICAgICAgICAgcm0gLWYgY29uZmlndGVzdF9heF9qYXZhY19hbmRfamF2YS5qYXZhIGNvbmZpZ3Rlc3RfYXhfamF2YWNfYW5kX2phdmEuY2xhc3MKKyAgICAgICAgICBdKQorCisKK0FDX0RFRlVOKFtBWF9DSEVDS19BTlRfVkVSU0lPTl0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhbnQgdmVyc2lvbiA+ICQyKQorICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAkKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykgXD49ICQyYAorICAgICAgICAgIGlmIHRlc3QgIngkQU5UX1ZBTElEIiA9ICJ4MSIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQorICAgICAgICAgICAgQU5UPSIiCisgICAgICAgICAgZmkKKyAgICAgICAgICBdKQorCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2FjbG9jYWwvYXhfdGhyaWZ0X2ludGVybmFsLm00IGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBlM2NiCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X3RocmlmdF9pbnRlcm5hbC5tNApAQCAtMCwwICsxLDI4IEBACitkbmwgQHN5bm9wc2lzIEFYX1RIUklGVF9HRU4oU0hPUlRfTEFOR1VBR0UsIExPTkdfTEFOR1VBR0UsIERFRkFVTFQpCitkbmwgQHN5bm9wc2lzIEFYX1RIUklGVF9MSUIoU0hPUlRfTEFOR1VBR0UsIExPTkdfTEFOR1VBR0UsIERFRkFVTFQpCitkbmwKK2RubCBBbGxvdyBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgZ2VuZXJhdG9yIHRvIGJlIGRpc2FibGVkLgorZG5sIEFsbG93IGEgcGFydGljdWxhciBsYW5ndWFnZSBsaWJyYXJ5IHRvIGJlIGRpc2FibGVkLgorZG5sCitkbmwgVGhlc2UgbWFjcm9zIGhhdmUgcG9vciBlcnJvciBoYW5kbGluZyBhbmQgYXJlIHBvb3JseSBkb2N1bWVudGVkLgorZG5sIFRoZXkgYXJlIGludGVuZGVkIG9ubHkgZm9yIGludGVybmFsIHVzZSBieSB0aGUgVGhyaWZ0IGNvbXBpbGVyLgorZG5sCitkbmwgQHZlcnNpb24gMjAwOC0wMi0yMAorZG5sIEBsaWNlbnNlIEFsbFBlcm1pc3NpdmUKK2RubAorZG5sIENvcHlyaWdodCAoQykgMjAwOSBEYXZpZCBSZWlzcworZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCitkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0Citkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorCitBQ19ERUZVTihbQVhfVEhSSUZUX0xJQl0sCisgICAgICAgICBbCisgICAgICAgICAgQUNfQVJHX1dJVEgoJDEsCisgICAgICAgICAgICAgICAgICAgICAgQUNfSEVMUF9TVFJJTkcoWy0td2l0aC0kMV0sIFtidWlsZCB0aGUgJDIgbGlicmFyeSBAPDpAZGVmYXVsdD0kM0A6PkBdKSwKKyAgICAgICAgICAgICAgICAgICAgICBbd2l0aF8kMT0iJHdpdGh2YWwiXSwKKyAgICAgICAgICAgICAgICAgICAgICBbd2l0aF8kMT0kM10KKyAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgaGF2ZV8kMT1ubworICAgICAgICAgIGRubCBXaGF0IHdlIGRvIGhlcmUgaXMgZ29pbmcgdG8gdmFyeSBmcm9tIGxpYnJhcnkgdG8gbGlicmFyeSwKKyAgICAgICAgICBkbmwgc28gd2UgY2FuJ3QgcmVhbGx5IGdlbmVyYWxpemUgKHlldCEpLgorICAgICAgICAgXSkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY29uZmlndXJlLmFjIGIvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMKaW5kZXggYzk0ZTI1Mi4uNzNiMzViYSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMKKysrIGIvY29udHJpYi9mYjMwMy9jb25maWd1cmUuYWMKQEAgLTcxLDggKzcxLDQ4IEBACiAjIEV4YW1wbGU6IHNldHMgJCh0aHJpZnRfaG9tZSkgdmFyaWFibGUgd2l0aCBkZWZhdWx0IHBhdGggc2V0IHRvIC91c3IvbG9jYWwuCiBGQl9XSVRIX1BBVEgoW3RocmlmdF9ob21lXSwgW3RocmlmdHBhdGhdLCBbL3Vzci9sb2NhbF0pCiAKLSMgUmVxdWlyZSBib29zdCAxLjMzLjEgb3IgbGF0ZXIKLUFYX0JPT1NUX0JBU0UoWzEuMzMuMV0pCitBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSkKK0FYX1RIUklGVF9MSUIoY3BwLCBbQysrXSwgeWVzKQoraGF2ZV9jcHA9bm8KK2lmIHRlc3QgIiR3aXRoX2NwcCIgPSAieWVzIjsgdGhlbgorICAjIFJlcXVpcmUgYm9vc3QgMS40MC4wIG9yIGxhdGVyCisgIEFYX0JPT1NUX0JBU0UoWzEuNDAuMF0pCisgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiA9ICJ4eWVzIjsgdGhlbgorICAgIGhhdmVfY3BwPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoW1dJVEhfQ1BQXSwgW3Rlc3QgIiRoYXZlX2NwcCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoamF2YSwgW0phdmFdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9qYXZhIiA9ICJ5ZXMiOyB0aGVuCisgIEFYX0pBVkFDX0FORF9KQVZBCisgIEFDX1BBVEhfUFJPRyhbQU5UXSwgW2FudF0pCisgIEFYX0NIRUNLX0FOVF9WRVJTSU9OKCRBTlQsIDEuNykKKyAgQUNfU1VCU1QoQ0xBU1NQQVRIKQorICBBQ19TVUJTVChBTlRfRkxBR1MpCisgIGlmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEpBVkFDIiAhPSAieCIgJiYgdGVzdCAieCRBTlQiICE9ICJ4IiA7IHRoZW4KKyAgICBoYXZlX2phdmE9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0pBVkEsIFt0ZXN0ICIkaGF2ZV9qYXZhIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihwaHAsIFtQSFBdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9waHAiID0gInllcyI7IHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtQSFBdLCBbcGhwXSkKKyAgaWYgdGVzdCAieCRQSFAiICE9ICJ4IiAmJiB0ZXN0ICJ4JFBIUCIgIT0gIng6IiA7IHRoZW4KKyAgICBoYXZlX3BocD0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUEhQLCBbdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiXSkKKworQVhfVEhSSUZUX0xJQihweXRob24sIFtQeXRob25dLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9weXRob24iID0gInllcyI7IHRoZW4KKyAgQU1fUEFUSF9QWVRIT04oMi40LCwgOikKKyAgaWYgdGVzdCAieCRQWVRIT04iICE9ICJ4IiAmJiB0ZXN0ICJ4JFBZVEhPTiIgIT0gIng6IiA7IHRoZW4KKyAgICBoYXZlX3B5dGhvbj0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUFlUSE9OLCBbdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiXSkKIAogIyBHZW5lcmF0ZXMgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5hbS4gTW9kaWZ5IHdoZW4gbmV3IHN1YmRpcnMgYXJlIGFkZGVkLgogIyBDaGFuZ2UgTWFrZWZpbGUuYW0gYWxzbyB0byBhZGQgc3ViZGlyZWN0bHkuCkBAIC05Miw2ICsxMzIsMTEgQEAKICMjIyMjIyMjIyBGSU5JU0ggIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGVjaG8gIkVYVEVSTkFMX1BBVEggJEVYVEVSTkFMX1BBVEgiCitlY2hvCitlY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCitlY2hvICJCdWlsZGluZyBKYXZhIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9qYXZhIgorZWNobyAiQnVpbGRpbmcgUHl0aG9uIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfcHl0aG9uIgorZWNobyAiQnVpbGRpbmcgUEhQIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfcGhwIgogCiAKICMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuY3BwCmluZGV4IDgwMDMzNDAuLjNjNTY5NzUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmNwcApAQCAtOTgsNyArOTgsNyBAQAogICAvLyB3YW50IG91ciByZWFkL3dyaXRlIHN0cnVjdHVyZSB0byBnbyBvdmVyIHRoZSB3aXJlCiAgIGNvdW50ZXJzXy5hY3F1aXJlUmVhZCgpOwogICBmb3IoUmVhZFdyaXRlQ291bnRlck1hcDo6aXRlcmF0b3IgaXQgPSBjb3VudGVyc18uYmVnaW4oKTsKLSAgICAgIGl0ICE9IGNvdW50ZXJzXy5lbmQoKTsgaXQrKykKKyAgICAgIGl0ICE9IGNvdW50ZXJzXy5lbmQoKTsgKytpdCkKICAgewogICAgIF9yZXR1cm5baXQtPmZpcnN0XSA9IGl0LT5zZWNvbmQudmFsdWU7CiAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL0ZhY2Vib29rQmFzZS5oIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKaW5kZXggMjE1OWM5NS4uZGFhNTI0NiAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgIkZhY2Vib29rU2VydmljZS5oIgogCisjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcCBiL2NvbnRyaWIvZmIzMDMvY3BwL1NlcnZpY2VUcmFja2VyLmNwcAppbmRleCAyOTE0ZmY2Li43YTYxYjIxIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9TZXJ2aWNlVHJhY2tlci5jcHAKKysrIGIvY29udHJpYi9mYjMwMy9jcHAvU2VydmljZVRyYWNrZXIuY3BwCkBAIC0yNTEsNyArMjUxLDcgQEAKICAgdWludDY0X3QgY291bnQ7CiAgIGZvciAoaXRlciA9IGNoZWNrcG9pbnRTZXJ2aWNlRHVyYXRpb25fLmJlZ2luKCk7CiAgICAgICAgaXRlciAhPSBjaGVja3BvaW50U2VydmljZUR1cmF0aW9uXy5lbmQoKTsKLSAgICAgICBpdGVyKyspIHsKKyAgICAgICArK2l0ZXIpIHsKICAgICBjb3VudCA9IGl0ZXItPnNlY29uZC5maXJzdDsKICAgICBoYW5kbGVyXy0+c2V0Q291bnRlcihzdHJpbmcoImNoZWNrcG9pbnRfY291bnRfIikgKyBpdGVyLT5maXJzdCwgY291bnQpOwogICAgIGlmIChjb3VudCA9PSAwKSB7CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdCBiL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CmluZGV4IDY2YzgzMTUuLjg5YmQ2ZWIgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CisrKyBiL2NvbnRyaWIvZmIzMDMvaWYvZmIzMDMudGhyaWZ0CkBAIC0yNCw2ICsyNCw3IEBACiBuYW1lc3BhY2UgamF2YSBjb20uZmFjZWJvb2suZmIzMDMKIG5hbWVzcGFjZSBjcHAgZmFjZWJvb2suZmIzMDMKIG5hbWVzcGFjZSBwZXJsIEZhY2Vib29rLkZCMzAzCituYW1lc3BhY2UgbmV0Y29yZSBGYWNlYm9vay5GQjMwMy5UZXN0CiAKIC8qKgogICogQ29tbW9uIHN0YXR1cyByZXBvcnRpbmcgbWVjaGFuaXNtIGFjcm9zcyBhbGwgc2VydmljZXMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sIGIvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGM5NmU0YmUuLjdhMWI4ZjEKLS0tIGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCisKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKKwogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQpAQCAtMjYsMjAgKzI2LDIwIEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcmZhY2UuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9pZiIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImZiMzAzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2ZiMzAzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmxpYnRocmlmdCIgdmFsdWU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJ0aHJpZnQtJHt2ZXJzaW9ufS5qYXIiLz4KIAogICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KICAgPHByb3BlcnR5IG5hbWU9ImdlbiIgdmFsdWU9IiR7YmFzZWRpcn0vZ2VuLWphdmEiLz4KQEAgLTc0LDggKzc0LDEyIEBACiAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiLz4KICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEubGlidGhyaWZ0fSIvPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhL2J1aWxkL2xpYiI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CiAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KICAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9jbGFzc3BhdGg+CkBAIC0xMjAsMjEgKzEyNCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7ZmIzMDMuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCiAgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKICAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCiAgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKKyAgICAgIHBhY2thZ2luZz0iamFyIgogICAgID4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CiAgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iIAotICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iCi0gICAgICB1cmw9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS90aHJpZnQiCisgICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICB1cmw9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0IgogICAgIC8+CiAgICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgogICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KQEAgLTE1Myw2ICsxNTcsOCBAQAogICAgICAgPGRldmVsb3BlciBpZD0ibW9saW5hcm8iIG5hbWU9IkFudGhvbnkgTW9saW5hcm8iLz4KICAgICAgIDxkZXZlbG9wZXIgaWQ9InJvZ2VyIiBuYW1lPSJSb2dlciBNZWllciIvPgogICAgICAgPGRldmVsb3BlciBpZD0iamZhcnJlbGwiIG5hbWU9Ikpha2UgRmFycmVsbCIvPgorICAgICAgPGRldmVsb3BlciBpZD0iamVuc2ciIG5hbWU9IkplbnMgR2V5ZXIiLz4KKyAgICAgIDxkZXZlbG9wZXIgaWQ9ImNhcmwiIG5hbWU9IkNhcmwgWWVrc2lnaWFuIi8+CiAKICAgICAgIDwhLS0gVGhyaWZ0IGRlcGVuZGVuY2llcyBsaXN0IC0tPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS50aHJpZnQiIGFydGlmYWN0SWQ9ImxpYnRocmlmdCIgdmVyc2lvbj0iJHt2ZXJzaW9ufSIvPgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9weS9mYjMwMy9GYWNlYm9va0Jhc2UucHkgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL0ZhY2Vib29rQmFzZS5weQppbmRleCA2ODVmZjIwLi4wN2RiMTBjIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL0ZhY2Vib29rQmFzZS5weQorKysgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzL0ZhY2Vib29rQmFzZS5weQpAQCAtMjQsNTkgKzI0LDYwIEBACiBpbXBvcnQgdGhyaWZ0LnJlZmxlY3Rpb24ubGltaXRlZAogZnJvbSB0dHlwZXMgaW1wb3J0IGZiX3N0YXR1cwogCisKIGNsYXNzIEZhY2Vib29rQmFzZShGYWNlYm9va1NlcnZpY2UuSWZhY2UpOgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKLSAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgc2VsZi5hbGl2ZSA9IGludCh0aW1lLnRpbWUoKSkKLSAgICBzZWxmLmNvdW50ZXJzID0ge30KKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5hbGl2ZSA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgc2VsZi5jb3VudGVycyA9IHt9CiAKLSAgZGVmIGdldE5hbWUoc2VsZiwgKToKLSAgICByZXR1cm4gc2VsZi5uYW1lCisgICAgZGVmIGdldE5hbWUoc2VsZiwgKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQogCi0gIGRlZiBnZXRWZXJzaW9uKHNlbGYsICk6Ci0gICAgcmV0dXJuICcnCisgICAgZGVmIGdldFZlcnNpb24oc2VsZiwgKToKKyAgICAgICAgcmV0dXJuICcnCiAKLSAgZGVmIGdldFN0YXR1cyhzZWxmLCApOgotICAgIHJldHVybiBmYl9zdGF0dXMuQUxJVkUKKyAgICBkZWYgZ2V0U3RhdHVzKHNlbGYsICk6CisgICAgICAgIHJldHVybiBmYl9zdGF0dXMuQUxJVkUKIAotICBkZWYgZ2V0Q291bnRlcnMoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuY291bnRlcnMKKyAgICBkZWYgZ2V0Q291bnRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvdW50ZXJzCiAKLSAgZGVmIHJlc2V0Q291bnRlcihzZWxmLCBrZXkpOgotICAgIHNlbGYuY291bnRlcnNba2V5XSA9IDAKKyAgICBkZWYgcmVzZXRDb3VudGVyKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuY291bnRlcnNba2V5XSA9IDAKIAotICBkZWYgZ2V0Q291bnRlcihzZWxmLCBrZXkpOgotICAgIGlmIHNlbGYuY291bnRlcnMuaGFzX2tleShrZXkpOgotICAgICAgcmV0dXJuIHNlbGYuY291bnRlcnNba2V5XQotICAgIHJldHVybiAwCisgICAgZGVmIGdldENvdW50ZXIoc2VsZiwga2V5KToKKyAgICAgICAgaWYgc2VsZi5jb3VudGVycy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb3VudGVyc1trZXldCisgICAgICAgIHJldHVybiAwCiAKLSAgZGVmIGluY3JlbWVudENvdW50ZXIoc2VsZiwga2V5KToKLSAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSBzZWxmLmdldENvdW50ZXIoa2V5KSArIDEKKyAgICBkZWYgaW5jcmVtZW50Q291bnRlcihzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLmNvdW50ZXJzW2tleV0gPSBzZWxmLmdldENvdW50ZXIoa2V5KSArIDEKIAotICBkZWYgc2V0T3B0aW9uKHNlbGYsIGtleSwgdmFsdWUpOgotICAgIHBhc3MKKyAgICBkZWYgc2V0T3B0aW9uKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGdldE9wdGlvbihzZWxmLCBrZXkpOgotICAgIHJldHVybiAiIgorICAgIGRlZiBnZXRPcHRpb24oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuICIiCiAKLSAgZGVmIGdldE9wdGlvbnMoc2VsZik6Ci0gICAgcmV0dXJuIHt9CisgICAgZGVmIGdldE9wdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiB7fQogCi0gIGRlZiBnZXRPcHRpb25zKHNlbGYpOgotICAgIHJldHVybiB7fQorICAgIGRlZiBnZXRPcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4ge30KIAotICBkZWYgYWxpdmVTaW5jZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5hbGl2ZQorICAgIGRlZiBhbGl2ZVNpbmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hbGl2ZQogCi0gIGRlZiBnZXRDcHVQcm9maWxlKHNlbGYsIGR1cmF0aW9uKToKLSAgICByZXR1cm4gIiIKKyAgICBkZWYgZ2V0Q3B1UHJvZmlsZShzZWxmLCBkdXJhdGlvbik6CisgICAgICAgIHJldHVybiAiIgogCi0gIGRlZiBnZXRMaW1pdGVkUmVmbGVjdGlvbihzZWxmKToKLSAgICByZXR1cm4gdGhyaWZ0LnJlZmxlY3Rpb24ubGltaXRlZC5TZXJ2aWNlKCkKKyAgICBkZWYgZ2V0TGltaXRlZFJlZmxlY3Rpb24oc2VsZik6CisgICAgICAgIHJldHVybiB0aHJpZnQucmVmbGVjdGlvbi5saW1pdGVkLlNlcnZpY2UoKQogCi0gIGRlZiByZWluaXRpYWxpemUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWluaXRpYWxpemUoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgc2h1dGRvd24oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5IGIvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CmluZGV4IDRmOGNlOTkuLjVjOGY0MDkgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQorKysgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL2VudiBweXRob24KKyMhL3Vzci9iaW4vZW52IHB5dGhvbiAKIAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0xOSw3ICsxOSw5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBvcworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IHN5cworaW1wb3J0IG9zCiBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKIAogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCAqCkBAIC0zMSwxMSArMzMsMTIgQEAKIGZyb20gZmIzMDMgaW1wb3J0ICoKIGZyb20gZmIzMDMudHR5cGVzIGltcG9ydCAqCiAKKwogZGVmIHNlcnZpY2VfY3RybCgKLSAgICAgICAgICAgICAgICAgY29tbWFuZCwKLSAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgdHJhbnNfZmFjdG9yeSA9IE5vbmUsCi0gICAgICAgICAgICAgICAgIHByb3RfZmFjdG9yeSA9IE5vbmUpOgorICAgICAgICBjb21tYW5kLAorICAgICAgICBwb3J0LAorICAgICAgICB0cmFuc19mYWN0b3J5PU5vbmUsCisgICAgICAgIHByb3RfZmFjdG9yeT1Ob25lKToKICAgICAiIiIKICAgICBzZXJ2aWNlX2N0cmwgaXMgYSBnZW5lcmljIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgc3RhbmRhcmQgZmIzMDMgZnVuY3Rpb25zCiAKQEAgLTU1LDY2ICs1OCw1OSBAQAogICAgICAgICAgICAgbXNnID0gZmJfc3RhdHVzX3N0cmluZyhzdGF0dXMpCiAgICAgICAgICAgICBpZiAobGVuKHN0YXR1c19kZXRhaWxzKSk6CiAgICAgICAgICAgICAgICAgbXNnICs9ICIgLSAlcyIgJSBzdGF0dXNfZGV0YWlscwotICAgICAgICAgICAgcHJpbnQgbXNnCi0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gZmJfc3RhdHVzLkFMSVZFKToKLSAgICAgICAgICAgICAgICByZXR1cm4gMgotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gMworICAgICAgICAgICAgcHJpbnQobXNnKQorICAgICAgICAgICAgcmV0dXJuIDIgaWYgc3RhdHVzID09IGZiX3N0YXR1cy5BTElWRSBlbHNlIDMKICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcHJpbnQgIkZhaWxlZCB0byBnZXQgc3RhdHVzIgorICAgICAgICAgICAgcHJpbnQoIkZhaWxlZCB0byBnZXQgc3RhdHVzIikKICAgICAgICAgICAgIHJldHVybiAzCiAKICAgICAjIHNjYWxhciBjb21tYW5kcwotICAgIGlmIGNvbW1hbmQgaW4gWyJ2ZXJzaW9uIiwiYWxpdmUiLCJuYW1lIl06CisgICAgaWYgY29tbWFuZCBpbiBbInZlcnNpb24iLCAiYWxpdmUiLCAibmFtZSJdOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXN1bHQgPSBmYjMwM193cmFwcGVyKGNvbW1hbmQsICBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCi0gICAgICAgICAgICBwcmludCByZXN1bHQKKyAgICAgICAgICAgIHJlc3VsdCA9IGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgcHJpbnQocmVzdWx0KQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcHJpbnQgImZhaWxlZCB0byBnZXQgIixjb21tYW5kCisgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIGdldCAiLCBjb21tYW5kKQogICAgICAgICAgICAgcmV0dXJuIDMKIAogICAgICMgY291bnRlcnMKICAgICBpZiBjb21tYW5kIGluIFsiY291bnRlcnMiXToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgY291bnRlcnMgPSBmYjMwM193cmFwcGVyKCdjb3VudGVycycsICBwb3J0LCB0cmFuc19mYWN0b3J5LCBwcm90X2ZhY3RvcnkpCisgICAgICAgICAgICBjb3VudGVycyA9IGZiMzAzX3dyYXBwZXIoJ2NvdW50ZXJzJywgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQogICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4gY291bnRlcnM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIiVzOiAlZCIgJSAoY291bnRlciwgY291bnRlcnNbY291bnRlcl0pCisgICAgICAgICAgICAgICAgcHJpbnQoIiVzOiAlZCIgJSAoY291bnRlci5lbmNvZGUoJ3V0Zi04JyksIGNvdW50ZXJzW2NvdW50ZXJdKSkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gZ2V0IGNvdW50ZXJzIgorICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byBnZXQgY291bnRlcnMiKQogICAgICAgICAgICAgcmV0dXJuIDMKIAotCiAgICAgIyBPbmx5IHJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMKICAgICBpZiBvcy5nZXR1aWQoKSA9PSAwOgogICAgICAgICAjIGFzeW5jIGNvbW1hbmRzCi0gICAgICAgIGlmIGNvbW1hbmQgaW4gWyJzdG9wIiwicmVsb2FkIl0gOgorICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsICJyZWxvYWQiXToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gdGVsbCB0aGUgc2VydmljZSB0byAiLCBjb21tYW5kCisgICAgICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byB0ZWxsIHRoZSBzZXJ2aWNlIHRvICIsIGNvbW1hbmQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDMKICAgICBlbHNlOgotICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsInJlbG9hZCJdOgotICAgICAgICAgICAgcHJpbnQgInJvb3QgcHJpdmlsZWdlcyBhcmUgcmVxdWlyZWQgdG8gc3RvcCBvciByZWxvYWQgdGhlIHNlcnZpY2UuIgorICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsICJyZWxvYWQiXToKKyAgICAgICAgICAgIHByaW50KCJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIpCiAgICAgICAgICAgICByZXR1cm4gNAogCi0gICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToiCi0gICAgZm9yIGNvbW1hbmQgaW4gWyJjb3VudGVycyIsIm5hbWUiLCJ2ZXJzaW9uIiwiYWxpdmUiLCJzdGF0dXMiXToKLSAgICAgICAgcHJpbnQgIlx0JXMiICUgY29tbWFuZAotICAgIHByaW50ICJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZXJzIHdpdGggcm9vdCBwcml2aWxlZ2VzOiIKLSAgICBmb3IgY29tbWFuZCBpbiBbInN0b3AiLCJyZWxvYWQiXToKLSAgICAgICAgcHJpbnQgIlx0JXMiICUgY29tbWFuZAorICAgIHByaW50KCJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGU6IikKKyAgICBmb3IgY29tbWFuZCBpbiBbImNvdW50ZXJzIiwgIm5hbWUiLCAidmVyc2lvbiIsICJhbGl2ZSIsICJzdGF0dXMiXToKKyAgICAgICAgcHJpbnQoIlx0JXMiICUgY29tbWFuZCkKKyAgICBwcmludCgiVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2VycyB3aXRoIHJvb3QgcHJpdmlsZWdlczoiKQorICAgIGZvciBjb21tYW5kIGluIFsic3RvcCIsICJyZWxvYWQiXToKKyAgICAgICAgcHJpbnQoIlx0JXMiICUgY29tbWFuZCkKKworICAgIHJldHVybiAwCiAKIAotCi0gICAgcmV0dXJuIDA7Ci0KLQotZGVmIGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeSA9IE5vbmUsIHByb3RfZmFjdG9yeSA9IE5vbmUpOgorZGVmIGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeT1Ob25lLCBwcm90X2ZhY3Rvcnk9Tm9uZSk6CiAgICAgc29jayA9IFRTb2NrZXQuVFNvY2tldCgnbG9jYWxob3N0JywgcG9ydCkKIAogICAgICMgdXNlIGlucHV0IHRyYW5zcG9ydCBmYWN0b3J5IGlmIHByb3ZpZGVkCkBAIC0xNzksMTEgKzE3NSwxMSBAQAogCiAgICAgIyBwYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucwogICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCi0gICAgY29tbWFuZHM9WyJzdG9wIiwiY291bnRlcnMiLCJzdGF0dXMiLCJyZWxvYWQiLCJ2ZXJzaW9uIiwibmFtZSIsImFsaXZlIl0KKyAgICBjb21tYW5kcyA9IFsic3RvcCIsICJjb3VudGVycyIsICJzdGF0dXMiLCAicmVsb2FkIiwgInZlcnNpb24iLCAibmFtZSIsICJhbGl2ZSJdCiAKICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWMiLCAiLS1jb21tYW5kIiwgZGVzdD0iY29tbWFuZCIsIGhlbHA9ImV4ZWN1dGUgdGhpcyBBUEkiLAogICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9Y29tbWFuZHMsIGRlZmF1bHQ9InN0YXR1cyIpCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwiLS1wb3J0IixkZXN0PSJwb3J0IixoZWxwPSJ0aGUgc2VydmljZSdzIHBvcnQiLAorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItcCIsICItLXBvcnQiLCBkZXN0PSJwb3J0IiwgaGVscD0idGhlIHNlcnZpY2UncyBwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTkwODIpCiAKICAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5IGIvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQppbmRleCA4MmIxNGQ5Li5kMjdjMjk2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKQEAgLTI0LDI2ICsyNCwyNSBAQAogICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgogZXhjZXB0OgogICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24sIENvbW1hbmQKLSAgICAgICAgCi1zZXR1cChuYW1lID0gJ3RocmlmdCcsCi0gICAgdmVyc2lvbiA9ICcwLjkuMCcsCi0gICAgZGVzY3JpcHRpb24gPSAnUHl0aG9uIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBGQjMwMycsCi0gICAgYXV0aG9yID0gWydUaHJpZnQgRGV2ZWxvcGVycyddLAotICAgIGF1dGhvcl9lbWFpbCA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10sCi0gICAgdXJsID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCi0gICAgbGljZW5zZSA9ICdBcGFjaGUgTGljZW5zZSAyLjAnLAotICAgIHBhY2thZ2VzID0gWwotICAgICAgICAnZmIzMDMnLAotICAgICAgICAnZmIzMDNfc2NyaXB0cycsCi0gICAgXSwKLSAgICBjbGFzc2lmaWVycyA9IFsKLSAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAotICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCi0gICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKLSAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCi0gICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCi0gICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAotICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCi0gICAgXSwKLSkKIAorc2V0dXAobmFtZT0ndGhyaWZ0X2ZiMzAzJywKKyAgICAgIHZlcnNpb249JzEuMC4wJywKKyAgICAgIGRlc2NyaXB0aW9uPSdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IEZCMzAzJywKKyAgICAgIGF1dGhvcj1bJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyddLAorICAgICAgYXV0aG9yX2VtYWlsPVsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10sCisgICAgICB1cmw9J2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICBsaWNlbnNlPSdBcGFjaGUgTGljZW5zZSAyLjAnLAorICAgICAgcGFja2FnZXM9WworICAgICAgICAgICdmYjMwMycsCisgICAgICAgICAgJ2ZiMzAzX3NjcmlwdHMnLAorICAgICAgXSwKKyAgICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDcgLSBJbmFjdGl2ZScsCisgICAgICAgICAgJ0Vudmlyb25tZW50IDo6IENvbnNvbGUnLAorICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKKyAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKKyAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDInLAorICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAorICAgICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKKyAgICAgIF0sCisgICAgICApCmRpZmYgLS1naXQgYS9jb250cmliL21pbmd3LWNyb3NzLWNvbXBpbGUuc2ggYi9jb250cmliL21pbmd3LWNyb3NzLWNvbXBpbGUuc2gKaW5kZXggODBjMGUyOS4uN2VkNWQ0NyAxMDA3NTUKLS0tIGEvY29udHJpYi9taW5ndy1jcm9zcy1jb21waWxlLnNoCisrKyBiL2NvbnRyaWIvbWluZ3ctY3Jvc3MtY29tcGlsZS5zaApAQCAtMiwyNyArMiwxOCBAQAogc2V0IC1lCiAKIC4vY29uZmlndXJlIFwKLSAgLS13aXRob3V0LWNwcCBcCi0gIC0td2l0aG91dC1jX2dsaWIgXAotICAtLXdpdGhvdXQtamF2YSBcCi0gIC0td2l0aG91dC1jc2hhcnAgXAotICAtLXdpdGhvdXQtcHl0aG9uIFwKLSAgLS13aXRob3V0LXJ1YnkgXAotICAtLXdpdGhvdXQtaGFza2VsbCBcCi0gIC0td2l0aG91dC1wZXJsIFwKLSAgLS13aXRob3V0LXBocCBcCi0gIC0td2l0aG91dC1lcmxhbmcgXAorICAtLWRpc2FibGUtbGlicyBcCiAgIC0tYnVpbGQ9aTY4Ni1wYy1saW51eC1nbnUgXAogICAtLWhvc3Q9aTU4Ni1taW5ndzMybXN2YyBcCi0gIENQUEZMQUdTPSctRE1JTkdXJworICBDQz1pNTg2LW1pbmd3MzJtc3ZjLWdjYyBDWFg9aTU4Ni1taW5ndzMybXN2Yy1nKysKIAogbWFrZQogCiAjIENoZWNrIHR3byBsb2NhdGlvbnMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGxpYnRvb2wgMS41LjI2IG9yIDIuMi42Yi4KLWlmIHRlc3QgLWYgY29tcGlsZXIvY3BwLy5saWJzL3RocmlmdC5leGUKLSAgdGhlbiBjcCBjb21waWxlci9jcHAvLmxpYnMvdGhyaWZ0LmV4ZSAuL3RocmlmdC5leGUKLSAgZWxzZSBjcCBjb21waWxlci9jcHAvdGhyaWZ0LmV4ZSAuL3RocmlmdC5leGUKK2lmIHRlc3QgLWYgY29tcGlsZXIvY3BwLy5saWJzL3RocmlmdC5leGUgOyB0aGVuCisgIGk1ODYtbWluZ3czMm1zdmMtc3RyaXAgY29tcGlsZXIvY3BwLy5saWJzL3RocmlmdC5leGUgLW8gLi90aHJpZnQuZXhlCitlbHNlIAorICBpNTg2LW1pbmd3MzJtc3ZjLXN0cmlwIGNvbXBpbGVyL2NwcC90aHJpZnQuZXhlIC1vIC4vdGhyaWZ0LmV4ZQogZmkKLWk1ODYtbWluZ3czMm1zdmMtc3RyaXAgLi90aHJpZnQuZXhlCi1lY2hvCitlY2hvICJGaW5pc2hlZCBjb21waWxpbmcgd2l0aCByZXN1bHRpbmcgZXhlIgogbHMgLWwgLi90aHJpZnQuZXhlCmRpZmYgLS1naXQgYS9jb250cmliL3BhcnNlX3Byb2ZpbGluZy5weSBiL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CmluZGV4IDUyZDIyMTEuLjBiZTVmMjkgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CisrKyBiL2NvbnRyaWIvcGFyc2VfcHJvZmlsaW5nLnB5CkBAIC00MiwxMCArNDIsMTIgQEAKICAgICAgICAgc2VsZi5hZGRyZXNzID0gYWRkcmVzcwogICAgICAgICBzZWxmLnNvdXJjZUZpbGUgPSBOb25lCiAgICAgICAgIHNlbGYuc291cmNlTGluZSA9IE5vbmUKLSAgICAgICAgc2VsZi5mdW50aW9uID0gTm9uZQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gTm9uZQogCiAKIGdfYWRkcnNfYnlfZmlsZW5hbWUgPSB7fQorCisKIGRlZiBnZXRfYWRkcmVzcyhmaWxlbmFtZSwgYWRkcmVzcyk6CiAgICAgIiIiCiAgICAgUmV0cmlldmUgYW4gQWRkcmVzc0luZm8gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBmaWxlIGFuZCBhZGRyZXNzLgpAQCAtMTAzLDEyICsxMDUsMTIgQEAKICAgICAgICAgaWR4ID0gZmlsZV9hbmRfbGluZS5yZmluZCgnOicpCiAgICAgICAgIGlmIGlkeCA8IDA6CiAgICAgICAgICAgICBtc2cgPSAnZXhwZWN0ZWQgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSBhZGRyMmxpbmU7IGdvdCAlcicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChmaWxlX2FuZF9saW5lLCkKKyAgICAgICAgICAgICAgICAoZmlsZV9hbmRfbGluZSwpCiAgICAgICAgICAgICBtc2cgKz0gJ1xuZmlsZT0lciwgYWRkcmVzcz0lcicgJSAoZmlsZW5hbWUsIGFkZHJlc3MuYWRkcmVzcykKICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihtc2cpCiAKICAgICAgICAgYWRkcmVzcy5zb3VyY2VGaWxlID0gZmlsZV9hbmRfbGluZVs6aWR4XQotICAgICAgICBhZGRyZXNzLnNvdXJjZUxpbmUgPSBmaWxlX2FuZF9saW5lW2lkeCsxOl0KKyAgICAgICAgYWRkcmVzcy5zb3VyY2VMaW5lID0gZmlsZV9hbmRfbGluZVtpZHggKyAxOl0KIAogICAgIChyZW1haW5pbmdfb3V0LCBjbWRfZXJyKSA9IHByb2MuY29tbXVuaWNhdGUoKQogICAgIHJldGNvZGUgPSBwcm9jLndhaXQoKQpAQCAtMTgwLDcgKzE4Miw3IEBACiAKICAgICB2aXJ0X2NhbGxfcmVnZXggPSByZS5jb21waWxlKHInXlxzKlRfVklSVFVBTF9DQUxMOiAoXGQrKSBjYWxscyBvbiAoLiopOiQnKQogICAgIGdlbl9wcm90X3JlZ2V4ID0gcmUuY29tcGlsZSgKLSAgICAgICAgICAgIHInXlxzKlRfR0VORVJJQ19QUk9UT0NPTDogKFxkKykgY2FsbHMgdG8gKC4qKSB3aXRoIGEgKC4qKTokJykKKyAgICAgICAgcideXHMqVF9HRU5FUklDX1BST1RPQ09MOiAoXGQrKSBjYWxscyB0byAoLiopIHdpdGggYSAoLiopOiQnKQogICAgIGJ0X3JlZ2V4ID0gcmUuY29tcGlsZShyJ15ccyojKFxkKylccyooLiopIFxbKDB4WzAtOUEtWmEtel0rKVxdJCcpCiAKICAgICAjIFBhcnNlIGFsbCBvZiB0aGUgaW5wdXQsIGFuZCBzdG9yZSBpdCBhcyBFbnRyeSBvYmplY3RzCkBAIC0yMDksNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICAjICJfWiIgdG8gdGhlIHR5cGUgbmFtZSB0byBtYWtlIGl0IGxvb2sgbGlrZSBhbiBleHRlcm5hbCBuYW1lLgogICAgICAgICAgICAgICAgIHR5cGVfbmFtZSA9ICdfWicgKyB0eXBlX25hbWUKICAgICAgICAgICAgIGhlYWRlciA9ICdUX1ZJUlRVQUxfQ0FMTDogJWQgY2FsbHMgb24gIiVzIicgJSBcCi0gICAgICAgICAgICAgICAgICAgIChudW1fY2FsbHMsIHR5cGVfbmFtZSkKKyAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUpCiAgICAgICAgICAgICBpZiBjdXJyZW50X2VudHJ5IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIGVudHJpZXMuYXBwZW5kKGN1cnJlbnRfZW50cnkpCiAgICAgICAgICAgICBjdXJyZW50X2VudHJ5ID0gRW50cnkoaGVhZGVyKQpAQCAtMjI0LDcgKzIyNiw3IEBACiAgICAgICAgICAgICAgICAgdHlwZV9uYW1lMSA9ICdfWicgKyB0eXBlX25hbWUxCiAgICAgICAgICAgICAgICAgdHlwZV9uYW1lMiA9ICdfWicgKyB0eXBlX25hbWUyCiAgICAgICAgICAgICBoZWFkZXIgPSAnVF9HRU5FUklDX1BST1RPQ09MOiAlZCBjYWxscyB0byAiJXMiIHdpdGggYSAiJXMiJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgKG51bV9jYWxscywgdHlwZV9uYW1lMSwgdHlwZV9uYW1lMikKKyAgICAgICAgICAgICAgICAobnVtX2NhbGxzLCB0eXBlX25hbWUxLCB0eXBlX25hbWUyKQogICAgICAgICAgICAgaWYgY3VycmVudF9lbnRyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChjdXJyZW50X2VudHJ5KQogICAgICAgICAgICAgY3VycmVudF9lbnRyeSA9IEVudHJ5KGhlYWRlcikKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2NmJjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9wb20ueG1sCkBAIC0wLDAgKzEsOTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+Cis8cHJvamVjdCAKKyAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50aHJpZnQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPnRocmlmdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CisgIDxuYW1lPnRocmlmdC1tYXZlbi1wbHVnaW48L25hbWU+CisgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjE0LjE8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgIDx0aHJpZnRFeGVjdXRhYmxlPiR7dGhyaWZ0LmNvbXBpbGVyfTwvdGhyaWZ0RXhlY3V0YWJsZT4KKyAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjExPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My4xLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjIuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xNC4wLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuMC4xNDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xMC4xOTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxwcm9wZXJ0aWVzPgorICAgIDx0aHJpZnQucm9vdD4ke2Jhc2VkaXJ9Ly4uLy4uPC90aHJpZnQucm9vdD4KKyAgICA8dGhyaWZ0LmNvbXBpbGVyPiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQ8L3RocmlmdC5jb21waWxlcj4KKyAgICA8dGhyaWZ0LnRlc3QuaG9tZT4ke3RocmlmdC5yb290fS90ZXN0PC90aHJpZnQudGVzdC5ob21lPgorICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL0Fic3RyYWN0VGhyaWZ0TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OWJlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQpAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEhlbHBlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRMaW5lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5pby5SYXdJbnB1dFN0cmVhbUZhY2FkZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5uZXdIYXNoU2V0OworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5saXN0OworaW1wb3J0IHN0YXRpYyBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzLmNsZWFuRGlyZWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzLmNvcHlTdHJlYW1Ub0ZpbGU7CitpbXBvcnQgc3RhdGljIG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHMuZ2V0RmlsZXM7CisKKy8qKgorICogQWJzdHJhY3QgTW9qbyBpbXBsZW1lbnRhdGlvbi4KKyAqIDxwLz4KKyAqIFRoaXMgY2xhc3MgaXMgZXh0ZW5kZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUudGhyaWZ0Lm1hdmVuLlRocmlmdENvbXBpbGVNb2pvfSBhbmQKKyAqIHtAbGluayBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbi5UaHJpZnRUZXN0Q29tcGlsZU1vam99IGluIG9yZGVyIHRvIG92ZXJyaWRlIHRoZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvcgorICogY29tcGlsaW5nIHRoZSBtYWluIG9yIHRlc3QgY2xhc3NlcyByZXNwZWN0aXZlbHkuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0VGhyaWZ0TW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSSUZUX0ZJTEVfU1VGRklYID0gIi50aHJpZnQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5DTFVERVMgPSAiKiovKiIgKyBUSFJJRlRfRklMRV9TVUZGSVg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBNYXZlbiBwcm9qZWN0LgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3R9IgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXF1aXJlZAorICAgICAqLworICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgcHJvamVjdDsKKworICAgIC8qKgorICAgICAqIEEgaGVscGVyIHVzZWQgdG8gYWRkIHJlc291cmNlcyB0byB0aGUgcHJvamVjdC4KKyAgICAgKgorICAgICAqIEBjb21wb25lbnQKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBwYXRoIHRvIHRoZSB7QGNvZGUgdGhyaWZ0fSBleGVjdXRhYmxlLiBCeSBkZWZhdWx0IGl0IHdpbGwgc2VhcmNoIHRoZSB7QGNvZGUgJFBBVEh9LgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJ0aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGhyaWZ0RXhlY3V0YWJsZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgc3RyaW5nIGlzIHBhc3NlZCB0byB0aGUge0Bjb2RlIC0tZ2VufSBvcHRpb24gb2YgdGhlIHtAY29kZSB0aHJpZnR9IHBhcmFtZXRlci4gQnkgZGVmYXVsdAorICAgICAqIGl0IHdpbGwgZ2VuZXJhdGUgSmF2YSBvdXRwdXQuIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBvcHRpb24gaXMgdG8gYmUgYWJsZSB0byBhZGQgb3B0aW9ucworICAgICAqIHRvIHRoZSBKYXZhIGdlbmVyYXRvciAtIGlmIHlvdSBnZW5lcmF0ZSBzb21ldGhpbmcgZWxzZSwgeW91J3JlIG9uIHlvdXIgb3duLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSJqYXZhIgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRvcjsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGVbXSBhZGRpdGlvbmFsVGhyaWZ0UGF0aEVsZW1lbnRzID0gbmV3IEZpbGVbXXt9OworCisgICAgLyoqCisgICAgICogU2luY2Uge0Bjb2RlIHRocmlmdH0gY2Fubm90IGFjY2VzcyBqYXJzLCB0aHJpZnQgZmlsZXMgaW4gZGVwZW5kZW5jaWVzIGFyZSBleHRyYWN0ZWQgdG8gdGhpcyBsb2NhdGlvbgorICAgICAqIGFuZCBkZWxldGVkIG9uIGV4aXQuIFRoaXMgZGlyZWN0b3J5IGlzIGFsd2F5cyBjbGVhbmVkIGR1cmluZyBleGVjdXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RocmlmdC1kZXBlbmRlbmNpZXMiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBwYXRoIHRvIHRoZSBsb2NhbCBtYXZlbiB7QGNvZGUgcmVwb3NpdG9yeX0uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7bG9jYWxSZXBvc2l0b3J5fSIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwb3NpdG9yeTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGlzIHRvIHtAY29kZSBmYWxzZX0gdG8gZGlzYWJsZSBoYXNoaW5nIG9mIGRlcGVuZGVudCBqYXIgcGF0aHMuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgcGx1Z2luIGV4cGFuZHMgamFycyBvbiB0aGUgY2xhc3NwYXRoIGxvb2tpbmcgZm9yIGVtYmVkZGVkIC50aHJpZnQgZmlsZXMuCisgICAgICogTm9ybWFsbHkgdGhlc2UgcGF0aHMgYXJlIGhhc2hlZCAoTUQ1KSB0byBhdm9pZCBpc3N1ZXMgd2l0aCBsb25nIGZpbGUgbmFtZXMgb24gd2luZG93cy4KKyAgICAgKiBIb3dldmVyIGlmIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHtAY29kZSBmYWxzZX0gbG9uZ2VyIHBhdGhzIHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNoRGVwZW5kZW50UGF0aHM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBpbmNsdWRlcyA9IEltbXV0YWJsZVNldC5vZihERUZBVUxUX0lOQ0xVREVTKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGV4Y2x1ZGVzID0gSW1tdXRhYmxlU2V0Lm9mKCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHN0YWxlTWlsbGlzID0gMDsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tTdGFsZW5lc3MgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBtb2pvLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24geworICAgICAgICBjaGVja1BhcmFtZXRlcnMoKTsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRTb3VyY2VSb290ID0gZ2V0VGhyaWZ0U291cmNlUm9vdCgpOworICAgICAgICBpZiAodGhyaWZ0U291cmNlUm9vdC5leGlzdHMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQ8RmlsZT4gdGhyaWZ0RmlsZXMgPSBmaW5kVGhyaWZ0RmlsZXNJbkRpcmVjdG9yeSh0aHJpZnRTb3VyY2VSb290KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIG91dHB1dERpcmVjdG9yeSA9IGdldE91dHB1dERpcmVjdG9yeSgpOworICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldDxGaWxlPiBvdXRwdXRGaWxlcyA9IGZpbmRHZW5lcmF0ZWRGaWxlc0luRGlyZWN0b3J5KGdldE91dHB1dERpcmVjdG9yeSgpKTsKKworICAgICAgICAgICAgICAgIGlmICh0aHJpZnRGaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiTm8gdGhyaWZ0IGZpbGVzIHRvIGNvbXBpbGUuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja1N0YWxlbmVzcyAmJiAoKGxhc3RNb2RpZmllZCh0aHJpZnRGaWxlcykgKyBzdGFsZU1pbGxpcykgPCBsYXN0TW9kaWZpZWQob3V0cHV0RmlsZXMpKSkgeworICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJTa2lwcGluZyBjb21waWxhdGlvbiBiZWNhdXNlIHRhcmdldCBkaXJlY3RvcnkgbmV3ZXIgdGhhbiBzb3VyY2VzLiIpOworICAgICAgICAgICAgICAgICAgICBhdHRhY2hGaWxlcygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldDxGaWxlPiBkZXJpdmVkVGhyaWZ0UGF0aEVsZW1lbnRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlVGhyaWZ0UGF0aEZyb21KYXJzKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIGdldERlcGVuZGVuY3lBcnRpZmFjdEZpbGVzKCkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkubWtkaXJzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUXVpY2sgZml4IHRvIGZpeCBpc3N1ZXMgd2l0aCB0d28gbXZuIGluc3RhbGxzIGluIGEgcm93IChpZSBubyBjbGVhbikKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5EaXJlY3Rvcnkob3V0cHV0RGlyZWN0b3J5KTsKKworICAgICAgICAgICAgICAgICAgICBUaHJpZnQgdGhyaWZ0ID0gbmV3IFRocmlmdC5CdWlsZGVyKHRocmlmdEV4ZWN1dGFibGUsIG91dHB1dERpcmVjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0R2VuZXJhdG9yKGdlbmVyYXRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGhyaWZ0UGF0aEVsZW1lbnQodGhyaWZ0U291cmNlUm9vdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkVGhyaWZ0UGF0aEVsZW1lbnRzKGRlcml2ZWRUaHJpZnRQYXRoRWxlbWVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRocmlmdFBhdGhFbGVtZW50cyhhc0xpc3QoYWRkaXRpb25hbFRocmlmdFBhdGhFbGVtZW50cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFRocmlmdEZpbGVzKHRocmlmdEZpbGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXhpdFN0YXR1cyA9IHRocmlmdC5jb21waWxlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChleGl0U3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvZygpLmVycm9yKCJ0aHJpZnQgZmFpbGVkIG91dHB1dDogIiArIHRocmlmdC5nZXRPdXRwdXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvcigidGhyaWZ0IGZhaWxlZCBlcnJvcjogIiArIHRocmlmdC5nZXRFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmlmdCBkaWQgbm90IGV4aXQgY2xlYW5seS4gUmV2aWV3IG91dHB1dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdHRhY2hGaWxlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiQW4gSU8gZXJyb3Igb2NjdXJyZWQiLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKCJ0aHJpZnQgZmFpbGVkIHRvIGV4ZWN1dGUgYmVjYXVzZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENvbW1hbmRMaW5lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW52b2tpbmcgdGhyaWZ0LiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbyhmb3JtYXQoIiVzIGRvZXMgbm90IGV4aXN0LiBSZXZpZXcgdGhlIGNvbmZpZ3VyYXRpb24gb3IgY29uc2lkZXIgZGlzYWJsaW5nIHRoZSBwbHVnaW4uIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyaWZ0U291cmNlUm9vdCkpOworICAgICAgICB9CisgICAgfQorCisgICAgSW1tdXRhYmxlU2V0PEZpbGU+IGZpbmRHZW5lcmF0ZWRGaWxlc0luRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGlyZWN0b3J5ID09IG51bGwgfHwgIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZigpOworCisgICAgICAgIExpc3Q8RmlsZT4gamF2YUZpbGVzSW5EaXJlY3RvcnkgPSBnZXRGaWxlcyhkaXJlY3RvcnksICIqKi8qLmphdmEiLCBudWxsKTsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoamF2YUZpbGVzSW5EaXJlY3RvcnkpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQoSW1tdXRhYmxlU2V0PEZpbGU+IGZpbGVzKSB7CisgICAgICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgaWYgKGZpbGUubGFzdE1vZGlmaWVkKCkgPiByZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1BhcmFtZXRlcnMoKSB7CisgICAgICAgIGNoZWNrTm90TnVsbChwcm9qZWN0LCAicHJvamVjdCIpOworICAgICAgICBjaGVja05vdE51bGwocHJvamVjdEhlbHBlciwgInByb2plY3RIZWxwZXIiKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdEV4ZWN1dGFibGUsICJ0aHJpZnRFeGVjdXRhYmxlIik7CisgICAgICAgIGNoZWNrTm90TnVsbChnZW5lcmF0b3IsICJnZW5lcmF0b3IiKTsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRTb3VyY2VSb290ID0gZ2V0VGhyaWZ0U291cmNlUm9vdCgpOworICAgICAgICBjaGVja05vdE51bGwodGhyaWZ0U291cmNlUm9vdCk7CisgICAgICAgIGNoZWNrQXJndW1lbnQoIXRocmlmdFNvdXJjZVJvb3QuaXNGaWxlKCksICJ0aHJpZnRTb3VyY2VSb290IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CisgICAgICAgIGNoZWNrTm90TnVsbCh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCAidGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSIpOworICAgICAgICBjaGVja1N0YXRlKCF0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LmlzRmlsZSgpLCAidGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeSIpOworICAgICAgICBmaW5hbCBGaWxlIG91dHB1dERpcmVjdG9yeSA9IGdldE91dHB1dERpcmVjdG9yeSgpOworICAgICAgICBjaGVja05vdE51bGwob3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgY2hlY2tTdGF0ZSghb3V0cHV0RGlyZWN0b3J5LmlzRmlsZSgpLCAidGhlIG91dHB1dERpcmVjdG9yeSBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeSIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGaWxlIGdldFRocmlmdFNvdXJjZVJvb3QoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PEFydGlmYWN0PiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGF0dGFjaEZpbGVzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRmlsZX0gZm9yIGVhY2ggZGVwZW5kZW5jeSBhcnRpZmFjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBzZXQgb2YgYWxsIGRlcGVuZGVuY3kgYXJ0aWZhY3RzLgorICAgICAqLworICAgIHByaXZhdGUgSW1tdXRhYmxlU2V0PEZpbGU+IGdldERlcGVuZGVuY3lBcnRpZmFjdEZpbGVzKCkgeworICAgICAgICBTZXQ8RmlsZT4gZGVwZW5kZW5jeUFydGlmYWN0RmlsZXMgPSBuZXdIYXNoU2V0KCk7CisgICAgICAgIGZvciAoQXJ0aWZhY3QgYXJ0aWZhY3QgOiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCkpIHsKKyAgICAgICAgICAgIGRlcGVuZGVuY3lBcnRpZmFjdEZpbGVzLmFkZChhcnRpZmFjdC5nZXRGaWxlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKGRlcGVuZGVuY3lBcnRpZmFjdEZpbGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgSW1tdXRhYmxlU2V0PEZpbGU+IG1ha2VUaHJpZnRQYXRoRnJvbUphcnMoRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCBJdGVyYWJsZTxGaWxlPiBjbGFzc3BhdGhFbGVtZW50RmlsZXMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBjaGVja05vdE51bGwoY2xhc3NwYXRoRWxlbWVudEZpbGVzLCAiY2xhc3NwYXRoRWxlbWVudEZpbGVzIik7CisgICAgICAgIC8vIGNsZWFuIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRvIGVuc3VyZSB0aGF0IHN0YWxlIGZpbGVzIGFyZW4ndCB1c2VkCisgICAgICAgIGlmICh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LmV4aXN0cygpKSB7CisgICAgICAgICAgICBjbGVhbkRpcmVjdG9yeSh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5KTsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxGaWxlPiB0aHJpZnREaXJlY3RvcmllcyA9IG5ld0hhc2hTZXQoKTsKKworICAgICAgICBmb3IgKEZpbGUgY2xhc3NwYXRoRWxlbWVudEZpbGUgOiBjbGFzc3BhdGhFbGVtZW50RmlsZXMpIHsKKyAgICAgICAgICAgIC8vIGZvciBzb21lIHJlYXNvbiB1bmRlciBJQU0sIHdlIHJlY2VpdmUgcG9tcyBhcyBkZXBlbmRlbnQgZmlsZXMKKyAgICAgICAgICAgIC8vIEkgYW0gZXhjbHVkaW5nIC54bWwgcmF0aGVyIHRoYW4gaW5jbHVkaW5nIC5qYXIgYXMgdGhlcmUgbWF5IGJlIG90aGVyIGV4dGVuc2lvbnMgaW4gdXNlIChzYXIsIGhhciwgemlwKQorICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEVsZW1lbnRGaWxlLmlzRmlsZSgpICYmIGNsYXNzcGF0aEVsZW1lbnRGaWxlLmNhblJlYWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAhY2xhc3NwYXRoRWxlbWVudEZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueG1sIikpIHsKKworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgamFyIGZpbGUuIHRoZSBjb25zdHJ1Y3RvciB2YWxpZGF0ZXMuCisgICAgICAgICAgICAgICAgSmFyRmlsZSBjbGFzc3BhdGhKYXI7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoSmFyID0gbmV3IEphckZpbGUoY2xhc3NwYXRoRWxlbWVudEZpbGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHdhcyBub3QgYSByZWFkYWJsZSBhcnRpZmFjdCIsIGNsYXNzcGF0aEVsZW1lbnRGaWxlKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ29weSBlYWNoIC50aHJpZnQgZmlsZSBmb3VuZCBpbiB0aGUgSkFSIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBwcmVzZXJ2aW5nIHRoZQorICAgICAgICAgICAgICAgICAqIGRpcmVjdG9yeSBwYXRoIGl0IGhhZCByZWxhdGl2ZSB0byBpdHMgY29udGFpbmluZyBKQVIuIEFkZCB0aGUgcmVzdWx0aW5nIHJvb3QgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICogKHVuaXF1ZSBmb3IgZWFjaCBKQVIgcHJvY2Vzc2VkKSB0byB0aGUgc2V0IG9mIHRocmlmdCBpbmNsdWRlIGRpcmVjdG9yaWVzIHRvIHVzZSB3aGVuCisgICAgICAgICAgICAgICAgICogY29tcGlsaW5nLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZvciAoSmFyRW50cnkgamFyRW50cnkgOiBsaXN0KGNsYXNzcGF0aEphci5lbnRyaWVzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBqYXJFbnRyeU5hbWUgPSBqYXJFbnRyeS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoVEhSSUZUX0ZJTEVfU1VGRklYKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRydW5jYXRlZEphclBhdGggPSB0cnVuY2F0ZVBhdGgoY2xhc3NwYXRoSmFyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFJvb3REaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCB0cnVuY2F0ZWRKYXJQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdW5jb21wcmVzc2VkQ29weSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHRocmlmdFJvb3REaXJlY3RvcnksIGphckVudHJ5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWRDb3B5LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlTdHJlYW1Ub0ZpbGUobmV3IFJhd0lucHV0U3RyZWFtRmFjYWRlKGNsYXNzcGF0aEphcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW5wdXRTdHJlYW0oamFyRW50cnkpKSwgdW5jb21wcmVzc2VkQ29weSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnREaXJlY3Rvcmllcy5hZGQodGhyaWZ0Um9vdERpcmVjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NwYXRoRWxlbWVudEZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIEZpbGVbXSB0aHJpZnRGaWxlcyA9IGNsYXNzcGF0aEVsZW1lbnRGaWxlLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKFRIUklGVF9GSUxFX1NVRkZJWCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmICh0aHJpZnRGaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZChjbGFzc3BhdGhFbGVtZW50RmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIEltbXV0YWJsZVNldDxGaWxlPiBmaW5kVGhyaWZ0RmlsZXNJbkRpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGRpcmVjdG9yeSk7CisgICAgICAgIGNoZWNrQXJndW1lbnQoZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCksICIlcyBpcyBub3QgYSBkaXJlY3RvcnkiLCBkaXJlY3RvcnkpOworICAgICAgICBMaXN0PEZpbGU+IHRocmlmdEZpbGVzSW5EaXJlY3RvcnkgPSBnZXRGaWxlcyhkaXJlY3RvcnksIAorICAgICAgICAJCUpvaW5lci5vbigiLCIpLmpvaW4oaW5jbHVkZXMpLAorICAgICAgICAJCUpvaW5lci5vbigiLCIpLmpvaW4oZXhjbHVkZXMpKTsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RmlsZXNJbkRpcmVjdG9yeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJ1bmNhdGVzIHRoZSBwYXRoIG9mIGphciBmaWxlcyBzbyB0aGF0IHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGphclBhdGggdGhlIGZ1bGwgcGF0aCBvZiBhIGphciBmaWxlLgorICAgICAqIEByZXR1cm4gdGhlIHRydW5jYXRlZCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCByZXBvc2l0b3J5IG9yIHJvb3Qgb2YgdGhlIGRyaXZlLgorICAgICAqLworICAgIFN0cmluZyB0cnVuY2F0ZVBhdGgoZmluYWwgU3RyaW5nIGphclBhdGgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoaGFzaERlcGVuZGVudFBhdGhzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0b0hleFN0cmluZyhNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKS5kaWdlc3QoamFyUGF0aC5nZXRCeXRlcygpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gZXhwYW5kIGRlcGVuZGVudCBqYXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXBvc2l0b3J5ID0gbG9jYWxSZXBvc2l0b3J5LmdldEJhc2VkaXIoKS5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIGlmICghcmVwb3NpdG9yeS5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICByZXBvc2l0b3J5ICs9ICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwYXRoID0gamFyUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7CisgICAgICAgIGludCByZXBvc2l0b3J5SW5kZXggPSBwYXRoLmluZGV4T2YocmVwb3NpdG9yeSk7CisgICAgICAgIGlmIChyZXBvc2l0b3J5SW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhyZXBvc2l0b3J5SW5kZXggKyByZXBvc2l0b3J5Lmxlbmd0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJ5IG5vdyB0aGUgcGF0aCBzaG91bGQgYmUgZ29vZCwgYnV0IGRvIGEgZmluYWwgY2hlY2sgdG8gZml4IHdpbmRvd3MgbWFjaGluZXMuCisgICAgICAgIGludCBjb2xvbkluZGV4ID0gcGF0aC5pbmRleE9mKCc6Jyk7CisgICAgICAgIGlmIChjb2xvbkluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAvLyAyID0gOlwgaW4gQzpcCisgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoY29sb25JbmRleCArIDIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9DSEFSUyA9ICIwMTIzNDU2Nzg5YWJjZGVmIi50b0NoYXJBcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVBcnJheSkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGhleFN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKDIgKiBieXRlQXJyYXkubGVuZ3RoKTsKKyAgICAgICAgZm9yIChmaW5hbCBieXRlIGIgOiBieXRlQXJyYXkpIHsKKyAgICAgICAgICAgIGhleFN0cmluZy5hcHBlbmQoSEVYX0NIQVJTWyhiICYgMHhGMCkgPj4gNF0pLmFwcGVuZChIRVhfQ0hBUlNbYiAmIDB4MEZdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGV4U3RyaW5nLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0LmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWVhOTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0LmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRMaW5lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5jbGkuQ29tbWFuZExpbmVVdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuY2xpLkNvbW1hbmRsaW5lOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHMubmV3TGlua2VkTGlzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzLm5ld0hhc2hTZXQ7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGludm9rYWJsZSBjb25maWd1cmF0aW9uIG9mIHRoZSB7QGNvZGUgdGhyaWZ0fQorICogY29tcGlsZXIuIFRoZSBhY3R1YWwgZXhlY3V0YWJsZSBpcyBpbnZva2VkIHVzaW5nIHRoZSBwbGV4dXMKKyAqIHtAbGluayBDb21tYW5kbGluZX0uCisgKiA8cC8+CisgKiBUaGlzIGNsYXNzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIGdlbmVyYXRpbmcgamF2YSBzb3VyY2UgZmlsZXMuCisgKi8KK2ZpbmFsIGNsYXNzIFRocmlmdCB7CisKKyAgICBmaW5hbCBzdGF0aWMgU3RyaW5nIEdFTkVSQVRFRF9KQVZBID0gImdlbi1qYXZhIjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4ZWN1dGFibGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ2VuZXJhdG9yOworICAgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdFBhdGhFbGVtZW50czsKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZVNldDxGaWxlPiB0aHJpZnRGaWxlczsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgamF2YU91dHB1dERpcmVjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRMaW5lVXRpbHMuU3RyaW5nU3RyZWFtQ29uc3VtZXIgb3V0cHV0OworICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZExpbmVVdGlscy5TdHJpbmdTdHJlYW1Db25zdW1lciBlcnJvcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUge0BsaW5rIEJ1aWxkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dGFibGUgICAgICAgICAgVGhlIHBhdGggdG8gdGhlIHtAY29kZSB0aHJpZnR9IGV4ZWN1dGFibGUuCisgICAgICogQHBhcmFtIGdlbmVyYXRvciAgICAgICAgICAgVGhlIHZhbHVlIGZvciB0aGUge0Bjb2RlIC0tZ2VufSBvcHRpb24uCisgICAgICogQHBhcmFtIHRocmlmdFBhdGggICAgICAgICAgVGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgaW1wb3J0cy4KKyAgICAgKiBAcGFyYW0gdGhyaWZ0RmlsZXMgICAgICAgICBUaGUgdGhyaWZ0IHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorICAgICAqIEBwYXJhbSBqYXZhT3V0cHV0RGlyZWN0b3J5IFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgamF2YSBzb3VyY2UgZmlsZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRocmlmdChTdHJpbmcgZXhlY3V0YWJsZSwgU3RyaW5nIGdlbmVyYXRvciwgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdFBhdGgsCisgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0PEZpbGU+IHRocmlmdEZpbGVzLCBGaWxlIGphdmFPdXRwdXREaXJlY3RvcnkpIHsKKyAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gY2hlY2tOb3ROdWxsKGV4ZWN1dGFibGUsICJleGVjdXRhYmxlIik7CisgICAgICAgIHRoaXMuZ2VuZXJhdG9yID0gY2hlY2tOb3ROdWxsKGdlbmVyYXRvciwgImdlbmVyYXRvciIpOworICAgICAgICB0aGlzLnRocmlmdFBhdGhFbGVtZW50cyA9IGNoZWNrTm90TnVsbCh0aHJpZnRQYXRoLCAidGhyaWZ0UGF0aCIpOworICAgICAgICB0aGlzLnRocmlmdEZpbGVzID0gY2hlY2tOb3ROdWxsKHRocmlmdEZpbGVzLCAidGhyaWZ0RmlsZXMiKTsKKyAgICAgICAgdGhpcy5qYXZhT3V0cHV0RGlyZWN0b3J5ID0gY2hlY2tOb3ROdWxsKGphdmFPdXRwdXREaXJlY3RvcnksICJqYXZhT3V0cHV0RGlyZWN0b3J5Iik7CisgICAgICAgIHRoaXMuZXJyb3IgPSBuZXcgQ29tbWFuZExpbmVVdGlscy5TdHJpbmdTdHJlYW1Db25zdW1lcigpOworICAgICAgICB0aGlzLm91dHB1dCA9IG5ldyBDb21tYW5kTGluZVV0aWxzLlN0cmluZ1N0cmVhbUNvbnN1bWVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlcyB0aGUge0Bjb2RlIHRocmlmdH0gY29tcGlsZXIgdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWVkIGF0CisgICAgICogY29uc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZXhpdCBzdGF0dXMgb2Yge0Bjb2RlIHRocmlmdH0uCisgICAgICogQHRocm93cyBDb21tYW5kTGluZUV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBpbnQgY29tcGlsZSgpIHRocm93cyBDb21tYW5kTGluZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgZm9yIChGaWxlIHRocmlmdEZpbGUgOiB0aHJpZnRGaWxlcykgeworICAgICAgICAgICAgQ29tbWFuZGxpbmUgY2wgPSBuZXcgQ29tbWFuZGxpbmUoKTsKKyAgICAgICAgICAgIGNsLnNldEV4ZWN1dGFibGUoZXhlY3V0YWJsZSk7CisgICAgICAgICAgICBjbC5hZGRBcmd1bWVudHMoYnVpbGRUaHJpZnRDb21tYW5kKHRocmlmdEZpbGUpLnRvQXJyYXkobmV3IFN0cmluZ1tde30pKTsKKyAgICAgICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBDb21tYW5kTGluZVV0aWxzLmV4ZWN1dGVDb21tYW5kTGluZShjbCwgbnVsbCwgb3V0cHV0LCBlcnJvcik7CisKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZXN1bHQgd2lsbCBhbHdheXMgYmUgMCBoZXJlLgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgYmVlbiBtYWRlIHZpc2libGUgZm9yIHRlc3Rpbmcgb25seS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJpZnRGaWxlCisgICAgICogQHJldHVybiBBIGxpc3QgY29uc2lzdGluZyBvZiB0aGUgZXhlY3V0YWJsZSBmb2xsb3dlZCBieSBhbnkgYXJndW1lbnRzLgorICAgICAqLworICAgIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBidWlsZFRocmlmdENvbW1hbmQoZmluYWwgRmlsZSB0aHJpZnRGaWxlKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjb21tYW5kID0gbmV3TGlua2VkTGlzdCgpOworICAgICAgICAvLyBhZGQgdGhlIGV4ZWN1dGFibGUKKyAgICAgICAgZm9yIChGaWxlIHRocmlmdFBhdGhFbGVtZW50IDogdGhyaWZ0UGF0aEVsZW1lbnRzKSB7CisgICAgICAgICAgICBjb21tYW5kLmFkZCgiLUkiKTsKKyAgICAgICAgICAgIGNvbW1hbmQuYWRkKHRocmlmdFBhdGhFbGVtZW50LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGNvbW1hbmQuYWRkKCItb3V0Iik7CisgICAgICAgIGNvbW1hbmQuYWRkKGphdmFPdXRwdXREaXJlY3RvcnkudG9TdHJpbmcoKSk7CisgICAgICAgIGNvbW1hbmQuYWRkKCItLWdlbiIpOworICAgICAgICBjb21tYW5kLmFkZChnZW5lcmF0b3IpOworICAgICAgICBjb21tYW5kLmFkZCh0aHJpZnRGaWxlLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5jb3B5T2YoY29tbWFuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiBvdXRwdXQuZ2V0T3V0cHV0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZXJyb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgeworICAgICAgICByZXR1cm4gZXJyb3IuZ2V0T3V0cHV0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyBidWlsZHMge0BsaW5rIFRocmlmdH0gaW5zdGFuY2VzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhlY3V0YWJsZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGphdmFPdXRwdXREaXJlY3Rvcnk7CisgICAgICAgIHByaXZhdGUgU2V0PEZpbGU+IHRocmlmdFBhdGhFbGVtZW50czsKKyAgICAgICAgcHJpdmF0ZSBTZXQ8RmlsZT4gdGhyaWZ0RmlsZXM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyYXRvcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBidWlsZGVyLiBUaGUgdHdvIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQgYXMgdGhleSBhcmUKKyAgICAgICAgICogcmVxdWlyZWQgZm9yIGFsbCB7QGxpbmsgVGhyaWZ0fSBpbnN0YW5jZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBleGVjdXRhYmxlICAgICAgICAgIFRoZSBwYXRoIHRvIHRoZSB7QGNvZGUgdGhyaWZ0fSBleGVjdXRhYmxlLgorICAgICAgICAgKiBAcGFyYW0gamF2YU91dHB1dERpcmVjdG9yeSBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGphdmEgc291cmNlIGZpbGVzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICBJZiBlaXRoZXIgb2YgdGhlIGFyZ3VtZW50cyBhcmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUge0Bjb2RlIGphdmFPdXRwdXREaXJlY3Rvcnl9IGlzCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIGRpcmVjdG9yeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBleGVjdXRhYmxlLCBGaWxlIGphdmFPdXRwdXREaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIHRoaXMuZXhlY3V0YWJsZSA9IGNoZWNrTm90TnVsbChleGVjdXRhYmxlLCAiZXhlY3V0YWJsZSIpOworICAgICAgICAgICAgdGhpcy5qYXZhT3V0cHV0RGlyZWN0b3J5ID0gY2hlY2tOb3ROdWxsKGphdmFPdXRwdXREaXJlY3RvcnkpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudChqYXZhT3V0cHV0RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpOworICAgICAgICAgICAgdGhpcy50aHJpZnRGaWxlcyA9IG5ld0hhc2hTZXQoKTsKKyAgICAgICAgICAgIHRoaXMudGhyaWZ0UGF0aEVsZW1lbnRzID0gbmV3SGFzaFNldCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSB0aHJpZnQgZmlsZSB0byBiZSBjb21waWxlZC4gVGhyaWZ0IGZpbGVzIG11c3QgYmUgb24gdGhlIHRocmlmdHBhdGgKKyAgICAgICAgICogYW5kIHRoaXMgbWV0aG9kIHdpbGwgZmFpbCBpZiBhIHRocmlmdCBmaWxlIGlzIGFkZGVkIHdpdGhvdXQgZmlyc3QgYWRkaW5nIGEKKyAgICAgICAgICogcGFyZW50IGRpcmVjdG9yeSB0byB0aGUgdGhyaWZ0cGF0aC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRocmlmdEZpbGUKKyAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlci4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgYSB0aHJpZnQgZmlsZSBpcyBhZGRlZCB3aXRob3V0IGZpcnN0CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGluZyBhIHBhcmVudCBkaXJlY3RvcnkgdG8gdGhlIHRocmlmdHBhdGguCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gIElmIHtAY29kZSB0aHJpZnRGaWxlfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRUaHJpZnRGaWxlKEZpbGUgdGhyaWZ0RmlsZSkgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdEZpbGUpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudCh0aHJpZnRGaWxlLmlzRmlsZSgpKTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQodGhyaWZ0RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi50aHJpZnQiKSk7CisgICAgICAgICAgICBjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aCh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIHRocmlmdEZpbGVzLmFkZCh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGhlIG9wdGlvbiBzdHJpbmcgZm9yIHRoZSBUaHJpZnQgZXhlY3V0YWJsZSdzIHtAY29kZSAtLWdlbn0gcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZ2VuZXJhdG9yCisgICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIKKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBJZiB7QGNvZGUgZ2VuZXJhdG9yfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRHZW5lcmF0b3IoU3RyaW5nIGdlbmVyYXRvcikgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGdlbmVyYXRvcik7CisgICAgICAgICAgICB0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoKEZpbGUgdGhyaWZ0RmlsZSkgeworICAgICAgICAgICAgYXNzZXJ0IHRocmlmdEZpbGUuaXNGaWxlKCk7CisgICAgICAgICAgICBjaGVja1N0YXRlKGNoZWNrVGhyaWZ0RmlsZUlzSW5UaHJpZnRQYXRoSGVscGVyKHRocmlmdEZpbGUuZ2V0UGFyZW50RmlsZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tUaHJpZnRGaWxlSXNJblRocmlmdFBhdGhIZWxwZXIoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgICAgICAgIGFzc2VydCBkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIGlmICh0aHJpZnRQYXRoRWxlbWVudHMuY29udGFpbnMoZGlyZWN0b3J5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHBhcmVudERpcmVjdG9yeSA9IGRpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChwYXJlbnREaXJlY3RvcnkgPT0gbnVsbCkgPyBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgOiBjaGVja1RocmlmdEZpbGVJc0luVGhyaWZ0UGF0aEhlbHBlcihwYXJlbnREaXJlY3RvcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgI2FkZFRocmlmdEZpbGUoRmlsZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFRocmlmdEZpbGVzKEl0ZXJhYmxlPEZpbGU+IHRocmlmdEZpbGVzKSB7CisgICAgICAgICAgICBmb3IgKEZpbGUgdGhyaWZ0RmlsZSA6IHRocmlmdEZpbGVzKSB7CisgICAgICAgICAgICAgICAgYWRkVGhyaWZ0RmlsZSh0aHJpZnRGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGhlIHtAY29kZSB0aHJpZnRQYXRoRWxlbWVudH0gdG8gdGhlIHRocmlmdFBhdGguCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aHJpZnRQYXRoRWxlbWVudCBBIGRpcmVjdG9yeSB0byBiZSBzZWFyY2hlZCBmb3IgaW1wb3J0ZWQgdGhyaWZ0IG1lc3NhZ2UKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBkZWZpbml0aW9ucy4KKyAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlci4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgSWYge0Bjb2RlIHRocmlmdFBhdGhFbGVtZW50fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHtAY29kZSB0aHJpZnRQYXRoRWxlbWVudH0gaXMgbm90IGEKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkVGhyaWZ0UGF0aEVsZW1lbnQoRmlsZSB0aHJpZnRQYXRoRWxlbWVudCkgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQodGhyaWZ0UGF0aEVsZW1lbnQuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgICAgICB0aHJpZnRQYXRoRWxlbWVudHMuYWRkKHRocmlmdFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBzZWUgI2FkZFRocmlmdFBhdGhFbGVtZW50KEZpbGUpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRUaHJpZnRQYXRoRWxlbWVudHMoSXRlcmFibGU8RmlsZT4gdGhyaWZ0UGF0aEVsZW1lbnRzKSB7CisgICAgICAgICAgICBmb3IgKEZpbGUgdGhyaWZ0UGF0aEVsZW1lbnQgOiB0aHJpZnRQYXRoRWxlbWVudHMpIHsKKyAgICAgICAgICAgICAgICBhZGRUaHJpZnRQYXRoRWxlbWVudCh0aHJpZnRQYXRoRWxlbWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIEEgY29uZmlndXJlZCB7QGxpbmsgVGhyaWZ0fSBpbnN0YW5jZS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgbm8gdGhyaWZ0IGZpbGVzIGhhdmUgYmVlbiBhZGRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBUaHJpZnQgYnVpbGQoKSB7CisgICAgICAgICAgICBjaGVja1N0YXRlKCF0aHJpZnRGaWxlcy5pc0VtcHR5KCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJpZnQoZXhlY3V0YWJsZSwgZ2VuZXJhdG9yLCBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdFBhdGhFbGVtZW50cyksCisgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RmlsZXMpLCBqYXZhT3V0cHV0RGlyZWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdENvbXBpbGVNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRDb21waWxlTW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Zjc1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRDb21waWxlTW9qby5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworLyoqCisgKiBUaGlzIG1vam8gZXhlY3V0ZXMgdGhlIHtAY29kZSB0aHJpZnR9IGNvbXBpbGVyIGZvciBnZW5lcmF0aW5nIGphdmEgc291cmNlcworICogZnJvbSB0aHJpZnQgZGVmaW5pdGlvbnMuIEl0IGFsc28gc2VhcmNoZXMgZGVwZW5kZW5jeSBhcnRpZmFjdHMgZm9yCisgKiB0aHJpZnQgZmlsZXMgYW5kIGluY2x1ZGVzIHRoZW0gaW4gdGhlIHRocmlmdFBhdGggc28gdGhhdCB0aGV5IGNhbiBiZQorICogcmVmZXJlbmNlZC4gRmluYWxseSwgaXQgYWRkcyB0aGUgdGhyaWZ0IGZpbGVzIHRvIHRoZSBwcm9qZWN0IGFzIHJlc291cmNlcyBzbworICogdGhhdCB0aGV5IGFyZSBpbmNsdWRlZCBpbiB0aGUgZmluYWwgYXJ0aWZhY3QuCisgKgorICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKKyAqIEBnb2FsIGNvbXBpbGUKKyAqIEByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uIGNvbXBpbGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRocmlmdENvbXBpbGVNb2pvIGV4dGVuZHMgQWJzdHJhY3RUaHJpZnRNb2pvIHsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgc291cmNlcyB0byBiZSBjb21waWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtiYXNlZGlyfS9zcmMvbWFpbi90aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHRocmlmdFNvdXJjZVJvb3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUge0Bjb2RlIC5qYXZhfSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL3RocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8QXJ0aWZhY3Q+IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKSB7CisgICAgICAgIExpc3Q8QXJ0aWZhY3Q+IGNvbXBpbGVBcnRpZmFjdHMgPSBwcm9qZWN0LmdldENvbXBpbGVBcnRpZmFjdHMoKTsKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVBcnRpZmFjdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGaWxlIGdldFRocmlmdFNvdXJjZVJvb3QoKSB7CisgICAgICAgIHJldHVybiB0aHJpZnRTb3VyY2VSb290OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaEZpbGVzKCkgeworICAgICAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KG91dHB1dERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHByb2plY3RIZWxwZXIuYWRkUmVzb3VyY2UocHJvamVjdCwgdGhyaWZ0U291cmNlUm9vdC5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgCQlJbW11dGFibGVMaXN0Lm9mKCIqKi8qLnRocmlmdCIpLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YSBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1RocmlmdFRlc3RDb21waWxlTW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWQ5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKKworLyoqCisgKiBAcGhhc2UgZ2VuZXJhdGUtdGVzdC1zb3VyY2VzCisgKiBAZ29hbCB0ZXN0Q29tcGlsZQorICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gdGVzdAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhyaWZ0VGVzdENvbXBpbGVNb2pvIGV4dGVuZHMgQWJzdHJhY3RUaHJpZnRNb2pvIHsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3VyY2UgZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgc291cmNlcyB0byBiZSBjb21waWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0iJHtiYXNlZGlyfS9zcmMvdGVzdC90aHJpZnQiCisgICAgICogQHJlcXVpcmVkCisgICAgICovCisgICAgcHJpdmF0ZSBGaWxlIHRocmlmdFRlc3RTb3VyY2VSb290OworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHtAY29kZSAuamF2YX0gd2lsbCBiZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtdGVzdC1zb3VyY2VzL3RocmlmdCIKKyAgICAgKiBAcmVxdWlyZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoRmlsZXMoKSB7CisgICAgICAgIHByb2plY3QuYWRkVGVzdENvbXBpbGVTb3VyY2VSb290KG91dHB1dERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIHByb2plY3RIZWxwZXIuYWRkVGVzdFJlc291cmNlKHByb2plY3QsIHRocmlmdFRlc3RTb3VyY2VSb290LmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAJCUltbXV0YWJsZUxpc3Qub2YoIioqLyoudGhyaWZ0IiksIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMaXN0PEFydGlmYWN0PiBnZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCkgeworICAgICAgICAvLyBUT0RPKGdhayk6IG1hdmVuLXByb2plY3QgbmVlZHMgZ2VuZXJpY3MKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIExpc3Q8QXJ0aWZhY3Q+IHRlc3RBcnRpZmFjdHMgPSBwcm9qZWN0LmdldFRlc3RBcnRpZmFjdHMoKTsKKyAgICAgICAgcmV0dXJuIHRlc3RBcnRpZmFjdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGaWxlIGdldFRocmlmdFNvdXJjZVJvb3QoKSB7CisgICAgICAgIHJldHVybiB0aHJpZnRUZXN0U291cmNlUm9vdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2FsIG1hdmVuIEFydGlmYWN0UmVwb3NpdG9yeS4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxSZXBvc2l0b3J5IGxvY2FsIEFydGlmYWN0UmVwb3NpdG9yeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsTWF2ZW5SZXBvc2l0b3J5KGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkpIHsKKyAgICAgICAgdGhpcy5sb2NhbFJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvcHRpb24gdG8gaGFzaCBkZXBlbmRlbnQgSkFSIHBhdGhzLiBFeHBvc2VkIG9ubHkgdG8gYWxsb3cgdGVzdGluZyBvdXRzaWRlIG9mIE1hdmVuIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYXNoRGVwZW5kZW50UGF0aHMgd2hldGhlciBvciBub3QgdG8gaGFzaCBwYXRocyB0byBkZXBlbmRlbnQgSkFScworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhhc2hEZXBlbmRlbnRQYXRocyhmaW5hbCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRocykgeworICAgICAgICB0aGlzLmhhc2hEZXBlbmRlbnRQYXRocyA9IGhhc2hEZXBlbmRlbnRQYXRoczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExNzY3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RBYnN0cmFjdFRocmlmdE1vam8uamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworCitwdWJsaWMgY2xhc3MgVGVzdEFic3RyYWN0VGhyaWZ0TW9qbyB7CisKKyAgICBwcml2YXRlIFRocmlmdFRlc3RDb21waWxlTW9qbyBtb2pvOworICAgIHByaXZhdGUgRmlsZSB0ZXN0Um9vdERpcjsKKyAgICBwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeSBtYXZlblJlcG9zaXRvcnk7CisKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CisgICAgICAgIHRlc3RSb290RGlyID0gbmV3IEZpbGUodG1wRGlyLCAidGhyaWZ0LXRlc3QiKTsKKworICAgICAgICAvLyB0aGUgdHJ1bmNhdGVQYXRoIG1ldGhvZCBhc3N1bWVzIGEgbWF2ZW4gcmVwb3NpdG9yeSwgYnV0IGl0IG9ubHkgY2FyZXMgYWJvdXQgdGhlIGJhc2UgZGlyCisgICAgICAgIG1hdmVuUmVwb3NpdG9yeSA9IE1vY2tpdG8ubW9jayhBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpOworICAgICAgICBNb2NraXRvLndoZW4obWF2ZW5SZXBvc2l0b3J5LmdldEJhc2VkaXIoKSkudGhlblJldHVybigiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyIik7CisKKyAgICAgICAgbW9qbyA9IG5ldyBUaHJpZnRUZXN0Q29tcGlsZU1vam8oKTsKKyAgICAgICAgbW9qby5zZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShtYXZlblJlcG9zaXRvcnkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ha2VUaHJpZnRQYXRoRnJvbUphcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgRmlsZSB0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5ID0gdGVzdFJvb3REaXI7CisKKyAgICAgICAgLy8gVGhlIFNoYXJlZElkbC5qYXIgZmlsZSBjb250YWlucyB0aGUgc2FtZSBpZGwvc2hhcmVkLnRocmlmdCBhbmQgaWRsL3R1dG9yaWFsLnRocmlmdCBoaWVyYXJjaHkKKyAgICAgICAgLy8gdXNlZCBieSBvdGhlciB0ZXN0cy4gSXQncyB1c2VkIGhlcmUgdG8gcmVwcmVzZW50IGEgZGVwZW5kZW5jeSBvZiB0aGUgcHJvamVjdCBtYXZlbiBpcyBidWlsZGluZywKKyAgICAgICAgLy8gb25lIHRoYXQgaXMgY29udHJpYnV0aW5nIC50aHJpZnQgSURMIGZpbGVzIGFzIHdlbGwgYXMgYW55IG90aGVyIGFydGlmYWN0cy4KKyAgICAgICAgZmluYWwgSXRlcmFibGU8RmlsZT4gY2xhc3NwYXRoRWxlbWVudEZpbGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gdGhyaWZ0RGlyZWN0b3JpZXMgPSBtb2pvLm1ha2VUaHJpZnRQYXRoRnJvbUphcnModGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSwgY2xhc3NwYXRoRWxlbWVudEZpbGVzKTsKKworICAgICAgICAvLyBUaGUgcmVzdWx0cyBzaG91bGQgYmUgYSBwYXRoIHRvIGEgZGlyZWN0b3J5IG5hbWVkIGFmdGVyIHRoZSBKQVIgaXRzZWxmIChhc3N1bWluZyBubyBwYXRoIGhhc2hpbmcsCisgICAgICAgIC8vIGJ1dCBzZWUgYmVsb3cgZm9yIGEgc2VwYXJhdGUgdGVzdCBvZiB0aGF0KSByZXByZXNlbnRpbmcgdGhlIHJvb3Qgb2YgYSBoaWVyYXJjaHkgY29udGFpbmluZyB0aHJpZnQKKyAgICAgICAgLy8gZmlsZXMsIHN1aXRhYmxlIGZvciBwcm92aWRpbmcgdG8gdGhlIHRocmlmdCBjb21waWxlciBhcyBhbiBpbmNsdWRlIGRpcmVjdG9yeS4gSW4gdGhpcyBjYXNlLCB0aGF0CisgICAgICAgIC8vIG1lYW5zIGl0IHBvaW50cyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlICJpZGwiIGhpZXJhcmNoeSByYXRoZXIgdGhhbiB0byB0aGUgaWRsIGRpcmVjdG9yeQorICAgICAgICAvLyBpdHNlbGYuCisgICAgICAgIGZpbmFsIFNldDxGaWxlPiBleHBlY3RlZCA9IFNldHMubmV3SGFzaFNldCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInNyYy90ZXN0L3Jlc291cmNlcy9kZXBlbmRlbmN5LWphci10ZXN0L1NoYXJlZElkbC5qYXIiKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygibWFrZVRocmlmdFBhdGhGcm9tSmFycyBzaG91bGQgcmV0dXJuIHRocmlmdCBJREwgYmFzZSBwYXRoIGZyb20gd2l0aGluIEpBUiIsIGV4cGVjdGVkLCB0aHJpZnREaXJlY3Rvcmllcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVQYXRoKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIC8vIEpBUiBwYXRoIGlzIHVucmVsYXRlZCB0byBtYXZlbiByZXBvLCBhbmQgc2hvdWxkIGJlIHVuY2hhbmdlZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworCisgICAgICAgIC8vIEpBUiBwYXRoIGlzIHdpdGhpbiBtYXZlbiByZXBvLCBhbmQgc2hvdWxkIGJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIHJlcG8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworCisgICAgICAgIC8vIEpBUiBwYXRoIGNvbnRhaW5zIGZvcndhcmQgc2xhc2hlcyB0aGF0IHNob3VsZCBiZSBub3JtYWxpemVkCisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vc29tZWphci5qYXIiLCBtb2pvLnRydW5jYXRlUGF0aCgiXFxwYXRoXFx0b1xcc29tZWphci5qYXIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVQYXRoV2l0aERlcGVuZGVudFBhdGhIYXNoaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIG1vam8uc2V0SGFzaERlcGVuZGVudFBhdGhzKHRydWUpOworCisgICAgICAgIC8vIGhhc2hEZXBlbmRlbnRQYXRocyBzZXQgdG8gdHJ1ZSwgdGhlIEpBUiBwYXRoIGlzIGltbWVkaWF0ZWx5IGhhc2hlZCAoTUQ1KSBhbmQgY29udmVydGVkIHRvIGEgaGV4IHN0cmluZworCisgICAgICAgIGFzc2VydEVxdWFscygiMWM4NTk1MDk4N2IyMzQ5MzQ2MmNmM2MyNjFkOTUxMGEiLCBtb2pvLnRydW5jYXRlUGF0aCgiL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMzlmYzJiNGMzNGNiNmNiMGRhMzhiZWQ1ZDhiNWZjNjciLCBtb2pvLnRydW5jYXRlUGF0aCgiL3Rlc3QvbWF2ZW4vcmVwby9iYXNlZGlyL3BhdGgvdG8vc29tZWphci5qYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMjViNjkyNGY1YjBlMTk0ODZkMGZmODg0NDhlOTk5ZDUiLCBtb2pvLnRydW5jYXRlUGF0aCgiXFxwYXRoXFx0b1xcc29tZWphci5qYXIiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0VGhyaWZ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ODkxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvdGhyaWZ0L21hdmVuL1Rlc3RUaHJpZnQuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tYXZlbjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmNsaS5Db21tYW5kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBUZXN0VGhyaWZ0IHsKKworICAgIHByaXZhdGUgRmlsZSB0ZXN0Um9vdERpcjsKKyAgICBwcml2YXRlIEZpbGUgaWRsRGlyOworICAgIHByaXZhdGUgRmlsZSBnZW5KYXZhRGlyOworICAgIHByaXZhdGUgVGhyaWZ0LkJ1aWxkZXIgYnVpbGRlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CisgICAgICAgIHRlc3RSb290RGlyID0gbmV3IEZpbGUodG1wRGlyLCAidGhyaWZ0LXRlc3QiKTsKKworICAgICAgICBpZiAodGVzdFJvb3REaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeSh0ZXN0Um9vdERpcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRlc3Q6ICIgKyB0ZXN0Um9vdERpci5nZXRQYXRoKCksIHRlc3RSb290RGlyLm1rZGlyKCkpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSB0ZXN0UmVzb3VyY2VEaXIgPSBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzIik7CisgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBmaW5kIHRlc3QgcmVzb3VyY2VzIiwgdGVzdFJvb3REaXIuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyB0aHJpZnRFeGVjdXRhYmxlID0gU3lzdGVtLmdldFByb3BlcnR5KCJ0aHJpZnRFeGVjdXRhYmxlIiwgInRocmlmdCIpOworICAgICAgICBpZiAoIShuZXcgRmlsZSh0aHJpZnRFeGVjdXRhYmxlKS5leGlzdHMoKSkpIHsKKyAgICAgICAgICAgIHRocmlmdEV4ZWN1dGFibGUgPSAidGhyaWZ0IjsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRocmlmdCBjb21waWxlcjogIiArIHRocmlmdEV4ZWN1dGFibGUpOworCisgICAgICAgIGlkbERpciA9IG5ldyBGaWxlKHRlc3RSZXNvdXJjZURpciwgImlkbCIpOworICAgICAgICBnZW5KYXZhRGlyID0gbmV3IEZpbGUodGVzdFJvb3REaXIsIFRocmlmdC5HRU5FUkFURURfSkFWQSk7CisgICAgICAgIGJ1aWxkZXIgPSBuZXcgVGhyaWZ0LkJ1aWxkZXIodGhyaWZ0RXhlY3V0YWJsZSwgdGVzdFJvb3REaXIpOworICAgICAgICBidWlsZGVyCisgICAgICAgICAgICAuc2V0R2VuZXJhdG9yKCJqYXZhIikKKyAgICAgICAgICAgIC5hZGRUaHJpZnRQYXRoRWxlbWVudChpZGxEaXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmlmdENvbXBpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVRocmlmdENvbXBpbGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJpZnRDb21waWxlV2l0aEdlbmVyYXRvck9wdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBidWlsZGVyLnNldEdlbmVyYXRvcigiamF2YTpwcml2YXRlLW1lbWJlcnMiKTsKKyAgICAgICAgZXhlY3V0ZVRocmlmdENvbXBpbGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmlmdENvbXBpbGUoKSB0aHJvd3MgQ29tbWFuZExpbmVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRocmlmdEZpbGUgPSBuZXcgRmlsZShpZGxEaXIsICJzaGFyZWQudGhyaWZ0Iik7CisKKyAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHRocmlmdEZpbGUpOworCisgICAgICAgIGZpbmFsIFRocmlmdCB0aHJpZnQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBub3QgZm91bmQ6IHNoYXJlZC50aHJpZnQiLCB0aHJpZnRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSBzaG91bGQgbm90IGV4aXN0IiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY29tcGlsZQorICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gdGhyaWZ0LmNvbXBpbGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoImdlbi1qYXZhIGRpcmVjdG9yeSB3YXMgbm90IHJlbW92ZWQiLCBnZW5KYXZhRGlyLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZ2VuZXJhdGVkIGphdmEgY29kZSBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgICAgIG5ldyBGaWxlKHRlc3RSb290RGlyLCAic2hhcmVkL1NoYXJlZFNlcnZpY2UuamF2YSIpLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJpZnRNdWx0aXBsZUZpbGVDb21waWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgc2hhcmVkVGhyaWZ0ID0gbmV3IEZpbGUoaWRsRGlyLCAic2hhcmVkLnRocmlmdCIpOworICAgICAgICBmaW5hbCBGaWxlIHR1dG9yaWFsVGhyaWZ0ID0gbmV3IEZpbGUoaWRsRGlyLCAidHV0b3JpYWwudGhyaWZ0Iik7CisKKyAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHNoYXJlZFRocmlmdCk7CisgICAgICAgIGJ1aWxkZXIuYWRkVGhyaWZ0RmlsZSh0dXRvcmlhbFRocmlmdCk7CisKKyAgICAgICAgZmluYWwgVGhyaWZ0IHRocmlmdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIG5vdCBmb3VuZDogc2hhcmVkLnRocmlmdCIsIHNoYXJlZFRocmlmdC5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBleGlzdCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNvbXBpbGUKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHRocmlmdC5jb21waWxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgd2FzIG5vdCByZW1vdmVkIiwgZ2VuSmF2YURpci5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImdlbmVyYXRlZCBqYXZhIGNvZGUgZG9lc24ndCBleGlzdCIsCisgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInNoYXJlZC9TaGFyZWRTZXJ2aWNlLmphdmEiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUoImdlbmVyYXRlZCBqYXZhIGNvZGUgZG9lc24ndCBleGlzdCIsCisgICAgICAgICAgICBuZXcgRmlsZSh0ZXN0Um9vdERpciwgInR1dG9yaWFsL0ludmFsaWRPcGVyYXRpb24uamF2YSIpLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRDb21waWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0RmlsZSA9IG5ldyBGaWxlKHRlc3RSb290RGlyLCAibWlzc2luZy50aHJpZnQiKTsKKyAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRQYXRoRWxlbWVudCh0ZXN0Um9vdERpcik7CisKKyAgICAgICAgLy8gSGFja2luZyBhcm91bmQgY2hlY2tzIGluIGFkZFRocmlmdCBmaWxlLgorICAgICAgICBhc3NlcnRUcnVlKHRocmlmdEZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgYnVpbGRlci5hZGRUaHJpZnRGaWxlKHRocmlmdEZpbGUpOworICAgICAgICBhc3NlcnRUcnVlKHRocmlmdEZpbGUuZGVsZXRlKCkpOworCisgICAgICAgIGZpbmFsIFRocmlmdCB0aHJpZnQgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSghdGhyaWZ0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJnZW4tamF2YSBkaXJlY3Rvcnkgc2hvdWxkIG5vdCBleGlzdCIsIGdlbkphdmFEaXIuZXhpc3RzKCkpOworCisgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNvbXBpbGUKKyAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHRocmlmdC5jb21waWxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVJblBhdGhQcmVDb25kaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0aHJpZnRGaWxlID0gbmV3IEZpbGUodGVzdFJvb3REaXIsICJtaXNzaW5nLnRocmlmdCIpOworCisgICAgICAgIC8vIEhhY2tpbmcgYXJvdW5kIGNoZWNrcyBpbiBhZGRUaHJpZnQgZmlsZS4KKyAgICAgICAgYXNzZXJ0VHJ1ZSh0aHJpZnRGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLmFkZFRocmlmdEZpbGUodGhyaWZ0RmlsZSk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRlc3RSb290RGlyLmV4aXN0cygpKSB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xlYW5EaXJlY3RvcnkodGVzdFJvb3REaXIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmFpbGVkIHRvIGRlbGV0ZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0ZXN0OiAiICsgdGVzdFJvb3REaXIuZ2V0UGF0aCgpLCB0ZXN0Um9vdERpci5kZWxldGUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC9zaGFyZWQudGhyaWZ0IGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvc2hhcmVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzVlN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9pZGwvc2hhcmVkLnRocmlmdApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogVGhpcyBUaHJpZnQgZmlsZSBjYW4gYmUgaW5jbHVkZWQgYnkgb3RoZXIgVGhyaWZ0IGZpbGVzIHRoYXQgd2FudCB0byBzaGFyZQorICogdGhlc2UgZGVmaW5pdGlvbnMuCisgKi8KKworbmFtZXNwYWNlIGNwcCBzaGFyZWQKK25hbWVzcGFjZSBqYXZhIHNoYXJlZAorbmFtZXNwYWNlIHBlcmwgc2hhcmVkCisKK3N0cnVjdCBTaGFyZWRTdHJ1Y3QgeworICAxOiBpMzIga2V5CisgIDI6IHN0cmluZyB2YWx1ZQorfQorCitzZXJ2aWNlIFNoYXJlZFNlcnZpY2UgeworICBTaGFyZWRTdHJ1Y3QgZ2V0U3RydWN0KDE6IGkzMiBrZXkpCit9CmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC90dXRvcmlhbC50aHJpZnQgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2lkbC90dXRvcmlhbC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlNDMzZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhyaWZ0LW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvaWRsL3R1dG9yaWFsLnRocmlmdApAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjIFRocmlmdCBUdXRvcmlhbAorIyBNYXJrIFNsZWUgKG1jc2xlZUBmYWNlYm9vay5jb20pCisjCisjIFRoaXMgZmlsZSBhaW1zIHRvIHRlYWNoIHlvdSBob3cgdG8gdXNlIFRocmlmdCwgaW4gYSAudGhyaWZ0IGZpbGUuIE5lYXRvLiBUaGUKKyMgZmlyc3QgdGhpbmcgdG8gbm90aWNlIGlzIHRoYXQgLnRocmlmdCBmaWxlcyBzdXBwb3J0IHN0YW5kYXJkIHNoZWxsIGNvbW1lbnRzLgorIyBUaGlzIGxldHMgeW91IG1ha2UgeW91ciB0aHJpZnQgZmlsZSBleGVjdXRhYmxlIGFuZCBpbmNsdWRlIHlvdXIgVGhyaWZ0IGJ1aWxkCisjIHN0ZXAgb24gdGhlIHRvcCBsaW5lLiBBbmQgeW91IGNhbiBwbGFjZSBjb21tZW50cyBsaWtlIHRoaXMgYW55d2hlcmUgeW91IGxpa2UuCisjCisjIEJlZm9yZSBydW5uaW5nIHRoaXMgZmlsZSwgeW91IHdpbGwgbmVlZCB0byBoYXZlIGluc3RhbGxlZCB0aGUgdGhyaWZ0IGNvbXBpbGVyCisjIGludG8gL3Vzci9sb2NhbC9iaW4uCisKKy8qKgorICogVGhlIGZpcnN0IHRoaW5nIHRvIGtub3cgYWJvdXQgYXJlIHR5cGVzLiBUaGUgYXZhaWxhYmxlIHR5cGVzIGluIFRocmlmdCBhcmU6CisgKgorICogIGJvb2wgICAgICAgIEJvb2xlYW4sIG9uZSBieXRlCisgKiAgYnl0ZSAgICAgICAgU2lnbmVkIGJ5dGUKKyAqICBpMTYgICAgICAgICBTaWduZWQgMTYtYml0IGludGVnZXIKKyAqICBpMzIgICAgICAgICBTaWduZWQgMzItYml0IGludGVnZXIKKyAqICBpNjQgICAgICAgICBTaWduZWQgNjQtYml0IGludGVnZXIKKyAqICBkb3VibGUgICAgICA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAqICBzdHJpbmcgICAgICBTdHJpbmcKKyAqICBiaW5hcnkgICAgICBCbG9iIChieXRlIGFycmF5KQorICogIG1hcDx0MSx0Mj4gIE1hcCBmcm9tIG9uZSB0eXBlIHRvIGFub3RoZXIKKyAqICBsaXN0PHQxPiAgICBPcmRlcmVkIGxpc3Qgb2Ygb25lIHR5cGUKKyAqICBzZXQ8dDE+ICAgICBTZXQgb2YgdW5pcXVlIGVsZW1lbnRzIG9mIG9uZSB0eXBlCisgKgorICogRGlkIHlvdSBhbHNvIG5vdGljZSB0aGF0IFRocmlmdCBzdXBwb3J0cyBDIHN0eWxlIGNvbW1lbnRzPworICovCisKKy8vIEp1c3QgaW4gY2FzZSB5b3Ugd2VyZSB3b25kZXJpbmcuLi4geWVzLiBXZSBzdXBwb3J0IHNpbXBsZSBDIGNvbW1lbnRzIHRvby4KKworLyoqCisgKiBUaHJpZnQgZmlsZXMgY2FuIHJlZmVyZW5jZSBvdGhlciBUaHJpZnQgZmlsZXMgdG8gaW5jbHVkZSBjb21tb24gc3RydWN0CisgKiBhbmQgc2VydmljZSBkZWZpbml0aW9ucy4gVGhlc2UgYXJlIGZvdW5kIHVzaW5nIHRoZSBjdXJyZW50IHBhdGgsIG9yIGJ5CisgKiBzZWFyY2hpbmcgcmVsYXRpdmUgdG8gYW55IHBhdGhzIHNwZWNpZmllZCB3aXRoIHRoZSAtSSBjb21waWxlciBmbGFnLgorICoKKyAqIEluY2x1ZGVkIG9iamVjdHMgYXJlIGFjY2Vzc2VkIHVzaW5nIHRoZSBuYW1lIG9mIHRoZSAudGhyaWZ0IGZpbGUgYXMgYQorICogcHJlZml4LiBpLmUuIHNoYXJlZC5TaGFyZWRPYmplY3QKKyAqLworaW5jbHVkZSAic2hhcmVkLnRocmlmdCIKKworLyoqCisgKiBUaHJpZnQgZmlsZXMgY2FuIG5hbWVzcGFjZSwgcGFja2FnZSwgb3IgcHJlZml4IHRoZWlyIG91dHB1dCBpbiB2YXJpb3VzCisgKiB0YXJnZXQgbGFuZ3VhZ2VzLgorICovCituYW1lc3BhY2UgY3BwIHR1dG9yaWFsCituYW1lc3BhY2UgamF2YSB0dXRvcmlhbAorbmFtZXNwYWNlIHBocCB0dXRvcmlhbAorbmFtZXNwYWNlIHBlcmwgdHV0b3JpYWwKK25hbWVzcGFjZSBzbWFsbHRhbGsuY2F0ZWdvcnkgVGhyaWZ0LlR1dG9yaWFsCisKKy8qKgorICogVGhyaWZ0IGxldHMgeW91IGRvIHR5cGVkZWZzIHRvIGdldCBwcmV0dHkgbmFtZXMgZm9yIHlvdXIgdHlwZXMuIFN0YW5kYXJkCisgKiBDIHN0eWxlIGhlcmUuCisgKi8KK3R5cGVkZWYgaTMyIE15SW50ZWdlcgorCisvKioKKyAqIFRocmlmdCBhbHNvIGxldHMgeW91IGRlZmluZSBjb25zdGFudHMgZm9yIHVzZSBhY3Jvc3MgbGFuZ3VhZ2VzLiBDb21wbGV4CisgKiB0eXBlcyBhbmQgc3RydWN0cyBhcmUgc3BlY2lmaWVkIHVzaW5nIEpTT04gbm90YXRpb24uCisgKi8KK2NvbnN0IGkzMiBJTlQzMkNPTlNUQU5UID0gOTg1MworY29uc3QgbWFwPHN0cmluZyxzdHJpbmc+IE1BUENPTlNUQU5UID0geydoZWxsbyc6J3dvcmxkJywgJ2dvb2RuaWdodCc6J21vb24nfQorCisvKioKKyAqIFlvdSBjYW4gZGVmaW5lIGVudW1zLCB3aGljaCBhcmUganVzdCAzMiBiaXQgaW50ZWdlcnMuIFZhbHVlcyBhcmUgb3B0aW9uYWwKKyAqIGFuZCBzdGFydCBhdCAxIGlmIG5vdCBzdXBwbGllZCwgQyBzdHlsZSBhZ2Fpbi4KKyAqLworZW51bSBPcGVyYXRpb24geworICBBREQgPSAxLAorICBTVUJUUkFDVCA9IDIsCisgIE1VTFRJUExZID0gMywKKyAgRElWSURFID0gNAorfQorCisvKioKKyAqIFN0cnVjdHMgYXJlIHRoZSBiYXNpYyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcy4gVGhleSBhcmUgY29tcHJpc2VkIG9mIGZpZWxkcworICogd2hpY2ggZWFjaCBoYXZlIGFuIGludGVnZXIgaWRlbnRpZmllciwgYSB0eXBlLCBhIHN5bWJvbGljIG5hbWUsIGFuZCBhbgorICogb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZS4KKyAqCisgKiBGaWVsZHMgY2FuIGJlIGRlY2xhcmVkICJvcHRpb25hbCIsIHdoaWNoIGVuc3VyZXMgdGhleSB3aWxsIG5vdCBiZSBpbmNsdWRlZAorICogaW4gdGhlIHNlcmlhbGl6ZWQgb3V0cHV0IGlmIHRoZXkgYXJlbid0IHNldC4gIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIHNvbWUKKyAqIG1hbnVhbCBtYW5hZ2VtZW50IGluIHNvbWUgbGFuZ3VhZ2VzLgorICovCitzdHJ1Y3QgV29yayB7CisgIDE6IGkzMiBudW0xID0gMCwKKyAgMjogaTMyIG51bTIsCisgIDM6IE9wZXJhdGlvbiBvcCwKKyAgNDogb3B0aW9uYWwgc3RyaW5nIGNvbW1lbnQsCit9CisKKy8qKgorICogU3RydWN0cyBjYW4gYWxzbyBiZSBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBuYXN0eS4KKyAqLworZXhjZXB0aW9uIEludmFsaWRPcGVyYXRpb24geworICAxOiBpMzIgd2hhdCwKKyAgMjogc3RyaW5nIHdoeQorfQorCisvKioKKyAqIEFoaCwgbm93IG9udG8gdGhlIGNvb2wgcGFydCwgZGVmaW5pbmcgYSBzZXJ2aWNlLiBTZXJ2aWNlcyBqdXN0IG5lZWQgYSBuYW1lCisgKiBhbmQgY2FuIG9wdGlvbmFsbHkgaW5oZXJpdCBmcm9tIGFub3RoZXIgc2VydmljZSB1c2luZyB0aGUgZXh0ZW5kcyBrZXl3b3JkLgorICovCitzZXJ2aWNlIENhbGN1bGF0b3IgZXh0ZW5kcyBzaGFyZWQuU2hhcmVkU2VydmljZSB7CisKKyAgLyoqCisgICAqIEEgbWV0aG9kIGRlZmluaXRpb24gbG9va3MgbGlrZSBDIGNvZGUuIEl0IGhhcyBhIHJldHVybiB0eXBlLCBhcmd1bWVudHMsCisgICAqIGFuZCBvcHRpb25hbGx5IGEgbGlzdCBvZiBleGNlcHRpb25zIHRoYXQgaXQgbWF5IHRocm93LiBOb3RlIHRoYXQgYXJndW1lbnQKKyAgICogbGlzdHMgYW5kIGV4Y2VwdGlvbiBsaXN0cyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBleGFjdCBzYW1lIHN5bnRheCBhcworICAgKiBmaWVsZCBsaXN0cyBpbiBzdHJ1Y3Qgb3IgZXhjZXB0aW9uIGRlZmluaXRpb25zLgorICAgKi8KKworICAgdm9pZCBwaW5nKCksCisKKyAgIGkzMiBhZGQoMTppMzIgbnVtMSwgMjppMzIgbnVtMiksCisKKyAgIGkzMiBjYWxjdWxhdGUoMTppMzIgbG9naWQsIDI6V29yayB3KSB0aHJvd3MgKDE6SW52YWxpZE9wZXJhdGlvbiBvdWNoKSwKKworICAgLyoqCisgICAgKiBUaGlzIG1ldGhvZCBoYXMgYSBvbmV3YXkgbW9kaWZpZXIuIFRoYXQgbWVhbnMgdGhlIGNsaWVudCBvbmx5IG1ha2VzCisgICAgKiBhIHJlcXVlc3QgYW5kIGRvZXMgbm90IGxpc3RlbiBmb3IgYW55IHJlc3BvbnNlIGF0IGFsbC4gT25ld2F5IG1ldGhvZHMKKyAgICAqIG11c3QgYmUgdm9pZC4KKyAgICAqLworICAgb25ld2F5IHZvaWQgemlwKCkKKworfQorCisvKioKKyAqIFRoYXQganVzdCBhYm91dCBjb3ZlcnMgdGhlIGJhc2ljcy4gVGFrZSBhIGxvb2sgaW4gdGhlIHRlc3QvIGZvbGRlciBmb3IgbW9yZQorICogZGV0YWlsZWQgZXhhbXBsZXMuIEFmdGVyIHlvdSBydW4gdGhpcyBmaWxlLCB5b3VyIGdlbmVyYXRlZCBjb2RlIHNob3dzIHVwCisgKiBpbiBmb2xkZXJzIHdpdGggbmFtZXMgZ2VuLTxsYW5ndWFnZT4uIFRoZSBnZW5lcmF0ZWQgY29kZSBpc24ndCB0b28gc2NhcnkKKyAqIHRvIGxvb2sgYXQuIEl0IGV2ZW4gaGFzIHByZXR0eSBpbmRlbnRhdGlvbi4KKyAqLwpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQuZWwgYi9jb250cmliL3RocmlmdC5lbAppbmRleCBjZDNlMGU4Li45NDFhOTlmIDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC5lbAorKysgYi9jb250cmliL3RocmlmdC5lbApAQCAtMSw0ICsxLDcgQEAKLTs7Cis7OzsgdGhyaWZ0LmVsIC0tLSBNYWpvciBtb2RlIGZvciBBcGFjaGUgVGhyaWZ0IGZpbGVzCisKKzs7IEtleXdvcmRzOiBmaWxlcworCiA7OyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiA7OyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogOzsgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE3LDkgKzIwLDE2IEBACiA7OyB1bmRlciB0aGUgTGljZW5zZS4KIDs7CiAKKzs7OyBDb21tZW50YXJ5OgorCis7OworCis7OzsgQ29kZToKKwogKHJlcXVpcmUgJ2ZvbnQtbG9jaykKIAogKGRlZnZhciB0aHJpZnQtbW9kZS1ob29rIG5pbCkKKzs7OyMjI2F1dG9sb2FkCiAoYWRkLXRvLWxpc3QgJ2F1dG8tbW9kZS1hbGlzdCAnKCJcXC50aHJpZnRcXCciIC4gdGhyaWZ0LW1vZGUpKQogCiAoZGVmdmFyIHRocmlmdC1pbmRlbnQtbGV2ZWwgMgpAQCAtMjgsMTMgKzM4LDEyIEBACiA7OyBzeW50YXggY29sb3JpbmcKIChkZWZjb25zdCB0aHJpZnQtZm9udC1sb2NrLWtleXdvcmRzCiAgIChsaXN0Ci0gICAnKCIjLiokIiAuIGZvbnQtbG9jay1jb21tZW50LWZhY2UpICA7OyBwZXJsIHN0eWxlIGNvbW1lbnRzCiAgICAnKCJcXDxcXChpbmNsdWRlXFx8c3RydWN0XFx8ZXhjZXB0aW9uXFx8dHlwZWRlZlxcfGNvbnN0XFx8ZW51bVxcfHNlcnZpY2VcXHxleHRlbmRzXFx8dm9pZFxcfG9uZXdheVxcfHRocm93c1xcfG9wdGlvbmFsXFx8cmVxdWlyZWRcXClcXD4iIC4gZm9udC1sb2NrLWtleXdvcmQtZmFjZSkgIDs7IGtleXdvcmRzCiAgICAnKCJcXDxcXChib29sXFx8Ynl0ZVxcfGkxNlxcfGkzMlxcfGk2NFxcfGRvdWJsZVxcfHN0cmluZ1xcfGJpbmFyeVxcfG1hcFxcfGxpc3RcXHxzZXRcXClcXD4iIC4gZm9udC1sb2NrLXR5cGUtZmFjZSkgIDs7IGJ1aWx0LWluIHR5cGVzCiAgICAnKCJcXDxcXChbMC05XStcXClcXD4iIC4gZm9udC1sb2NrLXZhcmlhYmxlLW5hbWUtZmFjZSkgICA7OyBvcmRpbmFscwogICAgJygiXFw8XFwoXFx3K1xcKVxccy0qKCIgKDEgZm9udC1sb2NrLWZ1bmN0aW9uLW5hbWUtZmFjZSkpICA7OyBmdW5jdGlvbnMKICAgICkKLSAgIlRocmlmdCBLZXl3b3JkcyIpCisgICJUaHJpZnQgS2V5d29yZHMuIikKIAogOzsgaW5kZW50YXRpb24KIChkZWZ1biB0aHJpZnQtaW5kZW50LWxpbmUgKCkKQEAgLTEwMiwxOCArMTExLDIwIEBACiAgICAgICAgICAgKGluZGVudC1saW5lLXRvIGN1ci1pbmRlbnQpCiAgICAgICAgIChpbmRlbnQtbGluZS10byAwKSkpKSkKIAotOzsgQy9DKysgY29tbWVudHM7IGFsc28gYWxsb3dpbmcgdW5kZXJzY29yZSBpbiB3b3JkcworOzsgQy9DKystIGFuZCBzaC1zdHlsZSBjb21tZW50czsgYWxzbyBhbGxvd2luZyB1bmRlcnNjb3JlIGluIHdvcmRzCiAoZGVmdmFyIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZQogICAobGV0ICgodGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlIChtYWtlLXN5bnRheC10YWJsZSkpKQogICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID9fICJ3IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCi0gICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPy8gIi4gMTQ1NiIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQotICAgIChtb2RpZnktc3ludGF4LWVudHJ5ID8qICIuIDIzIiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCi0gICAgKG1vZGlmeS1zeW50YXgtZW50cnkgP1xuICI+IGIiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKKyAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/IyAiPCIgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKSA7IHNoLXN0eWxlIGNvbW1lbnRzCisgICAgKG1vZGlmeS1zeW50YXgtZW50cnkgPy8gIi4gMTI0IiB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpIDsgYy9jKystc3R5bGUgY29tbWVudHMKKyAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/KiAiLiAyM2IiIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKKyAgICAobW9kaWZ5LXN5bnRheC1lbnRyeSA/XG4gIj4iIHRocmlmdC1tb2RlLXN5bnRheC10YWJsZSkKICAgICB0aHJpZnQtbW9kZS1zeW50YXgtdGFibGUpCiAgICJTeW50YXggdGFibGUgZm9yIHRocmlmdC1tb2RlIikKIAorOzs7IyMjYXV0b2xvYWQKIChkZWZ1biB0aHJpZnQtbW9kZSAoKQotICAiTW9kZSBmb3IgZWRpdGluZyBUaHJpZnQgZmlsZXMiCisgICJNb2RlIGZvciBlZGl0aW5nIFRocmlmdCBmaWxlcy4iCiAgIChpbnRlcmFjdGl2ZSkKICAgKGtpbGwtYWxsLWxvY2FsLXZhcmlhYmxlcykKICAgKHNldC1zeW50YXgtdGFibGUgdGhyaWZ0LW1vZGUtc3ludGF4LXRhYmxlKQpAQCAtMTIzLDQgKzEzNCw3IEBACiAgIChydW4taG9va3MgJ3RocmlmdC1tb2RlLWhvb2spCiAgIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ2luZGVudC1saW5lLWZ1bmN0aW9uKSAndGhyaWZ0LWluZGVudC1saW5lKQogICApCi0ocHJvdmlkZSAndGhyaWZ0LW1vZGUpCisKKyhwcm92aWRlICd0aHJpZnQpCis7OzsgdGhyaWZ0LmVsIGVuZHMgaGVyZQorCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC5zcGVjIGIvY29udHJpYi90aHJpZnQuc3BlYwppbmRleCBlY2VlNjMxLi5iZTUyNmUyIDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC5zcGVjCisrKyBiL2NvbnRyaWIvdGhyaWZ0LnNwZWMKQEAgLTE3LDM4ICsxNywzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBUT0RPKGRyZWlzcyk6IEhhdmUgYSBQeXRob24gYnVpbGQgd2l0aCBhbmQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uLgorJWRlZmluZSB3aXRob3V0X2phdmEgMQorJWRlZmluZSB3aXRob3V0X3B5dGhvbiAxCislZGVmaW5lIHdpdGhvdXRfdGVzdHMgMQorCiAleyE/cHl0aG9uX3NpdGVsaWI6ICVkZWZpbmUgcHl0aG9uX3NpdGVsaWIgJSgle19fcHl0aG9ufSAtYyAiZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX2xpYjsgcHJpbnQgZ2V0X3B5dGhvbl9saWIoKSIpfQogJXshP3B5dGhvbl9zaXRlYXJjaDogJWRlZmluZSBweXRob25fc2l0ZWFyY2ggJSgle19fcHl0aG9ufSAtYyAiZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX2xpYjsgcHJpbnQgZ2V0X3B5dGhvbl9saWIoMSkiKX0KLSMgVE9ETyhkcmVpc3MpOiBXaGVyZSBpcyB0aGlzIHN1cHBvc2VkIHRvIGdvPwotJXshP3RocmlmdF9lcmxhbmdfcm9vdDogJWRlZmluZSB0aHJpZnRfZXJsYW5nX3Jvb3QgL29wdC90aHJpZnQtZXJsfQogCiBOYW1lOiAgICAgICAgICAgdGhyaWZ0CiBMaWNlbnNlOiAgICAgICAgQXBhY2hlIExpY2Vuc2UgdjIuMAogR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50CiBTdW1tYXJ5OiAgICAgICAgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yawotVmVyc2lvbjogICAgICAgIDIwMDgwNTI5c3ZuCi1FcG9jaDogICAgICAgICAgMQotUmVsZWFzZTogICAgICAgIDEKLVVSTDogICAgICAgICAgICBodHRwOi8vZGV2ZWxvcGVycy5mYWNlYm9vay5jb20vdGhyaWZ0Ci1QYWNrYWdlcjogICAgICAgRGF2aWQgUmVpc3MgPGRyZWlzc0BmYWNlYm9vay5jb20+CitWZXJzaW9uOiAgICAgICAgMS4wLjAKK1JlbGVhc2U6ICAgICAgICAwCitVUkw6ICAgICAgICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitQYWNrYWdlcjogICAgICAgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KIFNvdXJjZTA6ICAgICAgICAle25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CiAKIEJ1aWxkUmVxdWlyZXM6ICBnY2MgPj0gMy40LjYKIEJ1aWxkUmVxdWlyZXM6ICBnY2MtYysrCiAKLSMgVE9ETyhkcmVpc3MpOiBDYW4gdGhlc2UgYmUgbW92ZWQgaW50byB0aGUgaW5kaXZpZHVhbCBwYWNrYWdlcz8KLSVpZiAleyE/d2l0aG91dF9qYXZhOiAxfQorJWlmIDAleyE/d2l0aG91dF9qYXZhOjF9CiBCdWlsZFJlcXVpcmVzOiAgamF2YS1kZXZlbCA+PSAwOjEuNS4wCiBCdWlsZFJlcXVpcmVzOiAgYW50ID49IDA6MS42LjUKICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfcHl0aG9uOiAxfQorJWlmIDAleyE/d2l0aG91dF9weXRob246MX0KIEJ1aWxkUmVxdWlyZXM6ICBweXRob24tZGV2ZWwKICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfZXJsYW5nOiAxfQotQnVpbGRSZXF1aXJlczogIGVybGFuZworJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CislZGVmaW5lIGdlbV9uYW1lICV7bmFtZX0KK0J1aWxkUmVxdWlyZXM6ICBydWJ5LWRldmVsCitCdWlsZFJlcXVpcmVzOiAgcnVieWdlbXMtZGV2ZWwKICVlbmRpZgogCiBCdWlsZFJvb3Q6ICAgICAgJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LSV7cmVsZWFzZX0tcm9vdC0lKCV7X19pZF91fSAtbikKQEAgLTc1LDYgKzc2LDcgQEAKICVmaWxlcyBsaWItY3BwCiAlZGVmYXR0cigtLHJvb3Qscm9vdCkKICV7X2xpYmRpcn0vbGlidGhyaWZ0Ki5zby4qCisle19saWJkaXJ9L2xpYnRocmlmdCouc28KIAogCiAlcGFja2FnZSBsaWItY3BwLWRldmVsCkBAIC04MiwxMCArODQsMTAgQEAKIEdyb3VwOiAgICAgTGlicmFyaWVzCiBSZXF1aXJlczogICV7bmFtZX0gPSAle3ZlcnNpb259LSV7cmVsZWFzZX0KIFJlcXVpcmVzOiAgYm9vc3QtZGV2ZWwKLSVpZiAleyE/d2l0aG91dF9saWJldmVudDogMX0KKyVpZiAwJXshP3dpdGhvdXRfbGliZXZlbnQ6MX0KIFJlcXVpcmVzOiAgbGliZXZlbnQtZGV2ZWwgPj0gMS4yCiAlZW5kaWYKLSVpZiAleyE/d2l0aG91dF96bGliOiAxfQorJWlmIDAleyE/d2l0aG91dF96bGliOjF9CiBSZXF1aXJlczogIHpsaWItZGV2ZWwKICVlbmRpZgogCkBAIC05NiwxMSArOTgsMTAgQEAKICVkZWZhdHRyKC0scm9vdCxyb290KQogJXtfaW5jbHVkZWRpcn0vdGhyaWZ0LwogJXtfbGliZGlyfS9saWJ0aHJpZnQqLiphCi0le19saWJkaXJ9L2xpYnRocmlmdCouc28KICV7X2xpYmRpcn0vcGtnY29uZmlnL3RocmlmdCoucGMKIAogCi0laWYgJXshP3dpdGhvdXRfamF2YTogMX0KKyVpZiAwJXshP3dpdGhvdXRfamF2YToxfQogJXBhY2thZ2UgbGliLWphdmEKIFN1bW1hcnk6ICAgVGhyaWZ0IEphdmEgbGlicmFyeQogR3JvdXA6ICAgICBMaWJyYXJpZXMKQEAgLTExNSw3ICsxMTYsNyBAQAogJWVuZGlmCiAKIAotJWlmICV7IT93aXRob3V0X3B5dGhvbjogMX0KKyVpZiAwJXshP3dpdGhvdXRfcHl0aG9uOjF9CiAlcGFja2FnZSBsaWItcHl0aG9uCiBTdW1tYXJ5OiBUaHJpZnQgUHl0aG9uIGxpYnJhcnkKIEdyb3VwOiAgIExpYnJhcmllcwpAQCAtMTI5LDE4ICsxMzAsMzIgQEAKICVlbmRpZgogCiAKLSVpZiAleyE/d2l0aG91dF9lcmxhbmc6IDF9Ci0lcGFja2FnZSBsaWItZXJsYW5nCi1TdW1tYXJ5OiAgVGhyaWZ0IFB5dGhvbiBsaWJyYXJ5Ci1Hcm91cDogICAgTGlicmFyaWVzCi1SZXF1aXJlczogZXJsYW5nCislaWYgMCV7IT93aXRob3V0X3J1Ynk6MX0KKyVwYWNrYWdlIC1uIHJ1YnlnZW0tJXtnZW1fbmFtZX0KK1N1bW1hcnk6IFRocmlmdCBSdWJ5IGxpYnJhcnkKK0dyb3VwOiAgIExpYnJhcmllcworT2Jzb2xldGVzOiAle25hbWV9LWxpYi1ydWJ5CiAKLSVkZXNjcmlwdGlvbiBsaWItZXJsYW5nCi1FcmxhbmcgbGlicmFyaWVzIGZvciBUaHJpZnQuCislZGVzY3JpcHRpb24gLW4gcnVieWdlbS0le2dlbV9uYW1lfQorUnVieSBsaWJyYXJpZXMgZm9yIFRocmlmdC4KIAotJWZpbGVzIGxpYi1lcmxhbmcKKyVmaWxlcyAtbiBydWJ5Z2VtLSV7Z2VtX25hbWV9CiAlZGVmYXR0cigtLHJvb3Qscm9vdCkKLSV7dGhyaWZ0X2VybGFuZ19yb290fQorJXtnZW1fZGlyfS8qCislZW5kaWYKKworCislaWYgMCV7IT93aXRob3V0X3BocDoxfQorJXBhY2thZ2UgbGliLXBocAorU3VtbWFyeTogVGhyaWZ0IFBIUCBsaWJyYXJ5CitHcm91cDogICBMaWJyYXJpZXMKKworJWRlc2NyaXB0aW9uIGxpYi1waHAKK1BIUCBsaWJyYXJpZXMgZm9yIFRocmlmdC4KKworJWZpbGVzIGxpYi1waHAKKyVkZWZhdHRyKC0scm9vdCxyb290KQorL3Vzci9saWIvcGhwLyoKICVlbmRpZgogCiAKQEAgLTE0OCw1OSArMTYzLDg5IEBACiAlc2V0dXAgLXEKIAogJWJ1aWxkCi0jIFRPRE8oZHJlaXNzKTogSW1wbGVtZW50IGEgc2luZ2xlIC0td2l0aG91dC1idWlsZC1rbHVkZ2VzLgorW1sgLWUgTWFrZWZpbGUuaW4gXV0gfHwgLi9ib290c3RyYXAuc2gKK2V4cG9ydCBHRU1fSE9NRT0ke1BXRH0vLmdlbS1ob21lCitleHBvcnQgUlVCWUxJQj0ke1BXRH0vbGliL3JiL2xpYgogJWNvbmZpZ3VyZSBcCiAgICV7P3dpdGhvdXRfbGliZXZlbnQ6IC0td2l0aG91dC1saWJldmVudCB9IFwKICAgJXs/d2l0aG91dF96bGliOiAgICAgLS13aXRob3V0LXpsaWIgICAgIH0gXAotICAtLXdpdGhvdXQtamF2YSBcCisgICV7P3dpdGhvdXRfdGVzdHM6ICAgIC0td2l0aG91dC10ZXN0cyAgICB9IFwKKyAgJXs/d2l0aG91dF9qYXZhOiAgICAgLS13aXRob3V0LWphdmEgICAgIH0gXAorICAlez93aXRob3V0X3B5dGhvbjogICAtLXdpdGhvdXQtcHl0aG9uICAgfSBcCisgICV7P3dpdGhvdXRfcnVieTogICAgIC0td2l0aG91dC1ydWJ5ICAgICB9IFwKKyAgJXs/d2l0aG91dF9waHA6ICAgICAgLS13aXRob3V0LXBocCAgICAgIH0gXAorICAleyE/d2l0aG91dF9waHA6ICAgICBQSFBfUFJFRklYPSR7UlBNX0JVSUxEX1JPT1R9L3Vzci9saWIvcGhwIH0gXAogICAtLXdpdGhvdXQtY3NoYXJwIFwKLSAgLS13aXRob3V0LXB5IFwKICAgLS13aXRob3V0LWVybGFuZyBcCiAKLW1ha2UKKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorZXZhbCAkKGdyZXAgIl5XSVRIX1JVQllfVFJVRSIgY29uZmlnLmxvZykKK2lmIFtbICIke1dJVEhfUlVCWV9UUlVFfSIgIT0gIiIgXV07IHRoZW4KKyAgc2V0ICt4CisgIGVjaG8gIiIKKyAgZWNobyAiY29uZmlndXJlIGRldGVybWluZWQgdGhhdCBydWJ5IHJlcXVpcmVtZW50cyBhcmUgbWlzc2luZyAoYnVuZGxlciBnZW0/KSwgZWl0aGVyIGluc3RhbGwgbWlzc2luZyBjb21wb25lbnRzIiA+JjIKKyAgZWNobyAib3IgZGlzYWJsZSB0aGUgcnVieSBzdWItcGFja2FnZXMgYXMgZm9sbG93czoiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+JjIKKyAgZWNobyAiICAgICBycG1idWlsZCAtRCcld2l0aG91dF9ydWJ5IDEnIC4uLiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+JjIKKyAgZWNobyAiIgorICBleGl0IDEKK2ZpCislZW5kaWYKIAotJWlmICV7IT93aXRob3V0X2phdmE6IDF9CittYWtlICV7P19zbXBfbWZsYWdzfQorCislaWYgMCV7IT93aXRob3V0X2phdmE6MX0KIGNkIGxpYi9qYXZhCiAlYW50CiBjZCAuLi8uLgogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9weXRob246IDF9CislaWYgMCV7IT93aXRob3V0X3B5dGhvbjoxfQogY2QgbGliL3B5CiBDRkxBR1M9IiV7b3B0ZmxhZ3N9IiAle19fcHl0aG9ufSBzZXR1cC5weSBidWlsZAogY2QgLi4vLi4KICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfZXJsYW5nOiAxfQotY2QgbGliL2VybAotbWFrZQotY2QgLi4vLi4KKyVpZiAwJXshP3dpdGhvdXRfcnVieToxfQorJWdlbV9pbnN0YWxsIC1uIGxpYi9yYi90aHJpZnQqLmdlbQogJWVuZGlmCiAKICVpbnN0YWxsCitleHBvcnQgR0VNX0hPTUU9JHtQV0R9Ly5nZW0taG9tZQorZXhwb3J0IFJVQllMSUI9JHtQV0R9L2xpYi9yYi9saWIKICVtYWtlaW5zdGFsbAorbG4gLXMgbGlidGhyaWZ0LSV7dmVyc2lvbn0uc28gJHtSUE1fQlVJTERfUk9PVH0le19saWJkaXJ9L2xpYnRocmlmdC5zby4wCitsbiAtcyBsaWJ0aHJpZnRuYi0le3ZlcnNpb259LnNvICR7UlBNX0JVSUxEX1JPT1R9JXtfbGliZGlyfS9saWJ0aHJpZnRuYi5zby4wCitsbiAtcyBsaWJ0aHJpZnR6LSV7dmVyc2lvbn0uc28gJHtSUE1fQlVJTERfUk9PVH0le19saWJkaXJ9L2xpYnRocmlmdHouc28uMAogCi0laWYgJXshP3dpdGhvdXRfamF2YTogMX0KKyVpZiAwJXshP3dpdGhvdXRfamF2YToxfQogbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UJXtfamF2YWRpcn0KLWNwIC1wIGxpYi9qYXZhLyouamFyICRSUE1fQlVJTERfUk9PVCV7X2phdmFkaXJ9CitjcCAtcCBsaWIvamF2YS9idWlsZC8qLmphciAkUlBNX0JVSUxEX1JPT1Qle19qYXZhZGlyfQogJWVuZGlmCiAKLSVpZiAleyE/d2l0aG91dF9weXRob246IDF9CislaWYgMCV7IT93aXRob3V0X3B5dGhvbjoxfQogY2QgbGliL3B5CiAle19fcHl0aG9ufSBzZXR1cC5weSBpbnN0YWxsIC1PMSAtLXNraXAtYnVpbGQgLS1yb290ICRSUE1fQlVJTERfUk9PVAogY2QgLi4vLi4KICVlbmRpZgogCi0laWYgJXshP3dpdGhvdXRfZXJsYW5nOiAxfQotbWtkaXIgLXAgJHtSUE1fQlVJTERfUk9PVH0le3RocmlmdF9lcmxhbmdfcm9vdH0KLWNwIC1yIGxpYi9lcmwvZWJpbiAke1JQTV9CVUlMRF9ST09UfSV7dGhyaWZ0X2VybGFuZ19yb290fQorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9Citta2RpciAtcCAle2J1aWxkcm9vdH0le2dlbV9kaXJ9CitjcCAtYSAuLyV7Z2VtX2Rpcn0vKiAle2J1aWxkcm9vdH0le2dlbV9kaXJ9LwogJWVuZGlmCiAKLQogJWNsZWFuCiBybSAtcmYgJHtSUE1fQlVJTERfUk9PVH0KIAogCislcG9zdAordW1hc2sgMDA3Cisvc2Jpbi9sZGNvbmZpZyA+IC9kZXYvbnVsbCAyPiYxCisKKworJXBvc3R1bgordW1hc2sgMDA3Cisvc2Jpbi9sZGNvbmZpZyA+IC9kZXYvbnVsbCAyPiYxCisKICVjaGFuZ2Vsb2cKLSogV2VkIE1heSAyOCAyMDA4IERhdmlkIFJlaXNzIDxkcmVpc3NAZmFjZWJvb2suY29tPiAtIDIwMDgwNTI5c3ZuCi0tIEluaXRpYWwgYnVpbGQsIGJhc2VkIG9uIHRoZSB3b3JrIG9mIEtldmluIFNtaXRoIGFuZCBCZW4gTWF1cmVyLgorKiBXZWQgT2N0IDEwIDIwMTIgVGhyaWZ0IERldiA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiAKKy0gVGhyaWZ0IDAuOS4wIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9jb250cmliL3RocmlmdC52aW0gYi9jb250cmliL3RocmlmdC52aW0KaW5kZXggNzljZTU0Ny4uNjIzMTk1NSAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQudmltCisrKyBiL2NvbnRyaWIvdGhyaWZ0LnZpbQpAQCAtNTEsOCArNTEsOCBAQAogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCBuYW1lc3BhY2UKIHN5biBrZXl3b3JkIHRocmlmdEtleXdvcmQgeHNkX2FsbCB4c2Rfb3B0aW9uYWwgeHNkX25pbGxhYmxlIHhzZF9hdHRycwogc3luIGtleXdvcmQgdGhyaWZ0S2V5d29yZCBpbmNsdWRlIGNwcF9pbmNsdWRlIGNwcF90eXBlIGNvbnN0IG9wdGlvbmFsIHJlcXVpcmVkCi1zeW4ga2V5d29yZCB0aHJpZnRCYXNpY1R5cGVzIHZvaWQgYm9vbCBieXRlIGkxNiBpMzIgaTY0IGRvdWJsZSBzdHJpbmcgYmluYXJ5Ci1zeW4ga2V5d29yZCB0aHJpZnRTdHJ1Y3R1cmUgbWFwIGxpc3Qgc2V0IHN0cnVjdCB0eXBlZGVmIGV4Y2VwdGlvbiBlbnVtIHRocm93cworc3luIGtleXdvcmQgdGhyaWZ0QmFzaWNUeXBlcyB2b2lkIGJvb2wgYnl0ZSBpOCBpMTYgaTMyIGk2NCBkb3VibGUgc3RyaW5nIGJpbmFyeQorc3luIGtleXdvcmQgdGhyaWZ0U3RydWN0dXJlIG1hcCBsaXN0IHNldCBzdHJ1Y3QgdHlwZWRlZiBleGNlcHRpb24gZW51bSB0aHJvd3MgdW5pb24KIAogIiBTcGVjaWFsCiBzeW4gbWF0Y2ggdGhyaWZ0U3BlY2lhbCAiXGRcKzoiCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvUkVBRE1FLnR4dCBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9SRUFETUUudHh0CnJlbmFtZSB0byBjb250cmliL3RyYW5zcG9ydC1zYW1wbGUvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKaW5kZXggZDI0ZDFhNy4uZTE2ZDg3ZCAxMDA2NDQKLS0tIGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaApAQCAtMTYsOCArMTYsNiBAQAogLy8KIAogI2lmZGVmIF9XSU4zMiAvL3RocmlmdCBpcyBjcmFzaGluZyB3aGVuIHVzaW5nIGJvb3N0IHRocmVhZHMgb24gTWFjIE9TWAotIyAgZGVmaW5lIFVTRV9CT09TVF9USFJFQUQgMQotIyAgaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KICNlbHNlCiAjICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ODNmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZApAQCAtMCwwICsxLDYxIEBACitBcGFjaGUgVGhyaWZ0IENlbnRvcyA2LjUgVmFncmFudCBTdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGRpcmVjdG9yeSBpcyB0aGUgVmFncmFudCBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgQXBhY2hlIFRocmlmdCBydW5uaW5nIG9uIENlbnRvcyA2LjUuIFRoZSBWYWdyYW50ZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBjb25maWd1cmVzIGEgVmFncmFudCBwcm92aXNpb25lZCBWTSBsYXVuY2hlZCB1bmRlciBWaXJ0dWFsQm94LiBUbyB1c2UgdGhpcyBwcm9qZWN0IHlvdSBtdXN0IGhhdmUgYSByZWNlbnQgdmVyc2lvbiBvZiBWaXJ0dWFsQm94IGFuZCBWYWdyYW50IGluc3RhbGxlZCAoaW4gdGhhdCBvcmRlcikuIFRvIHJ1biB0aGUgVk0sIG9wZW4gYSBzaGVsbCwgY2xvbmUgQXBhY2hlIFRocmlmdCwgY2hhbmdlIHRvIHRoaXMgZGlyZWN0b3J5IGFuZCBlbnRlciB0aGUgVmFncmFudCB1cCBjb21tYW5kLgorCisgICAkIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorICAgJCBjZCB0aHJpZnQvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUKKyAgICQgdmFncmFudCB1cAorCitUaGlzIHdpbGwgZG93bmxvYWQgYW5kIGxhdW5jaCB0aGUgYmFzZSBib3ggVk0gdW5kZXIgVmlydHVhbEJveCBhbmQgcnVuIHRoZSBBcGFjaGUgVGhyaWZ0IHByb3Zpc2lvbmluZyBzY3JpcHQuIFRoaXMgd2lsbCB0YWtlIHVwIHRvIGFuIGhvdXIgZGVwZW5kaW5nIG9uIHlvdXIgaGFyZHdhcmUgYW5kIG5ldHdvcmsuIE9uY2UgY29tcGxldGUgeW91IGNhbiBsb2dpbiB0byB0aGUgYm94IHdpdGggVmFncmFudCBzc2guIFRoZSB0aHJpZnQgc291cmNlIHRyZWUgZnJvbSB5b3VyIGhvc3Qgb3MgaXMgbW91bnRlZCBhdCAvdGhyaWZ0LgorCisgICAkIHZhZ3JhbnQgc3NoCisgICBbdmFncmFudEB0aHJpZnQgfl0kIGNkIC90aHJpZnQKKyAgIFt2YWdyYW50QHRocmlmdCB0aHJpZnRdJCBjb21waWxlci9jcHAvdGhyaWZ0IC0tdmVyc2lvbgorICAgVGhyaWZ0IHZlcnNpb24gPHZlcnNpb24+CisKK1RoZSBwcm92aXNpb25pbmcgc2NyaXB0IChpbnNpZGUgdGhlIFZhZ3JhbnRmaWxlKSBydW5zIC4vYm9vdHN0cmFwLnNoLCAuL2NvbmZpZ3VyZSwgbWFrZSBhbmQgbWFrZSBjaGVjaywgYnV0IGRvZXMgbm90IGluc3RhbGwgdGhyaWZ0LiBUbyBpbnN0YWxsIHRocmlmdCBydW4gIm1ha2UgaW5zdGFsbCIuCisKK1RoZSBWYWdyYW50IGJhc2UgYm94IHVzZWQgaGVyZSBpcyBhIG1pbmltYWwgQ2VudG9zIDYuNSBWaXJ0dWFsQm94IHdpdGggMkdCIFJBTSBhbmQgMiBDUFVzLiBGb3IgbW9yZSBWYWdyYW50IGluZm9ybWF0aW9uOiBodHRwczovL3d3dy52YWdyYW50dXAuY29tLiBBIHN1bW1hcnkgb2YgdGhlIGJhc2UgYm94IHByZXBhcmF0aW9uIGZvbGxvd3M6CisKK3Jvb3QgcGFzc3dvcmQ6IHZhZ3JhbnQKKworI0NyZWF0ZSB0aGUgdmFncmFudCB1c2VyIGFuZCBnaXZlIGl0IHN1ZG8gcGVybWlzc2lvbgorYWRkdXNlciB2YWdyYW50CitwYXNzd2QgdmFncmFudAordmlzdWRvICA6ICB2YWdyYW50IEFMTD0oQUxMKSBOT1BBU1NXRDogQUxMCisgICAgICAgICAgICNEZWZhdWx0cyByZXF1aXJldHR5CisKKyNTaHV0IGRvd24gdGhlIGZpcmV3YWxsIGFuZCBkaXNhYmxlIGl0CitzZXJ2aWNlIGlwdGFibGVzIHN0b3AKK2Noa2NvbmZpZyBpcHRhYmxlcyBvZmYKKworI1NldHVwIHRoZSB2YWdyYW50IHNzaCBwdWJsaWMga2V5IHRvIGFsbG93IHZhZ3JhbnQgdG8gc3NoCitta2RpciAvaG9tZS92YWdyYW50Ly5zc2gKK2NobW9kIDcwMCAvaG9tZS92YWdyYW50Ly5zc2gKK2NkIC9ob21lL3ZhZ3JhbnQvLnNzaAord2dldCAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICdodHRwczovL3Jhdy5naXRodWIuY29tL21pdGNoZWxsaC92YWdyYW50L21hc3Rlci9rZXlzL3ZhZ3JhbnQucHViJyAtTyBhdXRob3JpemVkX2tleXMKK2NobW9kIDYwMCAvaG9tZS92YWdyYW50Ly5zc2gvYXV0aG9yaXplZF9rZXlzCitjaG93biAtUiB2YWdyYW50IC9ob21lL3ZhZ3JhbnQvLnNzaAorCisjSW5zdGFsbCBFUEVMIChFeHRyYSBQYWNrYWdlcyBmb3IgRW50ZXJwcmlzZSBMaW51eCkgYnV0IHByb3RlY3QgdGhlIGJhc2UKKyNyZXBvc2l0b3JpZXMgc28gdGhhdCBFUEVMIGRvZXMgbm90IG1hc2sgYmFzZSBwYWNrYWdlcworeXVtIC15IGluc3RhbGwgeXVtLXBsdWdpbi1wcm90ZWN0YmFzZQorcnBtIC1VdmggaHR0cDovL2Rvd25sb2FkLmZlZG9yYXByb2plY3Qub3JnL3B1Yi9lcGVsLzYvaTM4Ni9lcGVsLXJlbGVhc2UtNi04Lm5vYXJjaC5ycG0KKworI0luc3RhbGwgcGVybCwgZHluYW1pYyBrZXJuZWwgbW9kdWxlcywgZGV2IHRvb2xzIGFuZCBrZXJuZWwgaGVhZGVycyB0byBzdXBwb3J0CisjVmlydHVhbCBib3ggYWRkaXRpb25zCit5dW0gLXkgaW5zdGFsbCBwZXJsCit5dW0gLXkgLS1lbmFibGVyZXBvIGVwZWwgaW5zdGFsbCBka21zCit5dW0gLXkgZ3JvdXBpbnN0YWxsICJEZXZlbG9wbWVudCBUb29scyIKK3l1bSAteSBpbnN0YWxsIGtlcm5lbC1kZXZlbAorCisjVXBkYXRlIGV2ZXJ5dGhpbmcgYW5kIHJlYm9vdAoreXVtIHVwZGF0ZQorcmVib290CisKKyNJbnN0YWxsIHRoZSBWaXJ0dWFsQm94IEd1ZXN0IGFkZGl0aW9ucyAodXNpbmcgVmlydHVhbEJveCBpc28pCittb3VudCAvZGV2L2Nkcm9tIC9tbnQKKy9tbnQvVkJveExpbnV4QWRkaXRpb25zLnJ1bgordW1vdW50IC9tbnQKKworU2VlIHRoZSBWYWdyYW50ZmlsZSBmb3IgZnVydGhlciBkZXRhaWxzCmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTIyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9WYWdyYW50ZmlsZQpAQCAtMCwwICsxLDI3NCBAQAorIyAtKi0gbW9kZTogcnVieSAtKi0KKyMgdmk6IHNldCBmdD1ydWJ5IDoKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQVBBQ0hFIFRIUklGVCBQUk9WSVNJT05JTkcgU0NSSVBUCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgYmFzZSBDZW50b3MgNi41CisjIFZhZ3JhbnQgYm94IGZvciBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGFuZCBsaWIgYnVpbGRzLgorIyBUaGUgYmFzZSBib3ggaXMgQ2VudG9zIDYuNSB3aXRoIG5vIGFkZGl0aW9uYWwgcGFja2FnZXMKKyMgZXhjZXB0IHRob3NlIHJlcXVpcmVkIHRvIHN1cHBvcnQgVmlydHVhbEJveCBHdWVzdCB0b29sczoKKyMgcGVybCwgZGttcywga2VybmVsLWRldmVsIGFuZCB0aGUgIkRldmVsb3BtZW50IFRvb2xzIiBncm91cC4KKyMgVGhlIGVwZWwgcmVwbyB3YXMgYWxzbyBhZGRlZCBhbG9uZyB3aXRoIHRoZQorIyB5dW0tcGx1Z2luLXByb3RlY3RiYXNlIHBhY2thZ2UgdG8gcHJlZmVyIGJhc2UgcmVwbyBwYWNrYWdlcy4KKyMgVGhlIHNjcmlwdCBiZWxvdyBwcm92aXNpb25zIEFMTCBsYW5ndWFnZXMuIFRoaXMgd2lsbCB0YWtlCisjIHRpbWUuIFlvdSBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIGJ1aWxkIHRpbWUgYnkgY29tbWVudGluZworIyBvdXQgdGhlIExJQiBwcm92aXNpb25pbmcgZm9yIHVuZWVkZWQgbGFuZ3VhZ2UgbGlicmFyaWVzLgorIyBFeHBlY3QgZnVsbCBwcm92aXNpb25pbmcgdG8gdGFrZSAzMCBtaW51dGVzIG9uIGEgZmFzdAorIyBtYWNoaW5lIHdpdGggYW4gZXhjZWxsZW50IEludGVybmV0IGNvbm5lY3Rpb24gKGFuZCBhbm90aGVyCisjIDE1IG1pbnV0ZXMgZm9yIHRoZSBidWlsZCkuCisjCisjIE1hY2hpbmUgYWNjb3VudHM6CisjIC0gVXNlcjogdmFncmFudC92YWdyYW50CisjIC0gQWRtaW46IHJvb3QvdmFncmFudAorIyBWYWdyYW50IHB1YmxpYyBzc2gga2V5IGFsc28gaW5zdGFsbGVkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskYnVpbGRfYW5kX3Rlc3QgPSA8PFNDUklQVAorZWNobyAiUHJvdmlzaW9uaW5nIHN5c3RlbSB0byBjb21waWxlIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQuIgorZGF0ZSA+IC9ldGMvdmFncmFudC5wcm92aXNpb25fYmVnaW4KKworIyBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGRlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjaW5zdGFsbCBhbiB1cGRhdGVkIGF1dG9jb25mCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b2NvbmYvYXV0b2NvbmYtMi42OS50YXIuZ3oKK3RhciB4dmYgYXV0b2NvbmYtMi42OS50YXIuZ3oKK2NkIGF1dG9jb25mLTIuNjkKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjaW5zdGFsbCBhbiB1cGRhdGVkIGF1dG9tYWtlCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYXV0b21ha2UvYXV0b21ha2UtMS4xNC50YXIuZ3oKK3RhciB4dmYgYXV0b21ha2UtMS4xNC50YXIuZ3oKK2NkIGF1dG9tYWtlLTEuMTQKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjaW5zdGFsbCBhbiB1cGRhdGVkIGJpc29uCit3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vYmlzb24tMi41LjEudGFyLmd6Cit0YXIgeHZmIGJpc29uLTIuNS4xLnRhci5negorY2QgYmlzb24tMi41LjEKKy4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKK21ha2UKK3N1ZG8gbWFrZSBpbnN0YWxsCitjZCAuLgorCisjIEMrKzk4IExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIC15IGluc3RhbGwgbGliZXZlbnQtZGV2ZWwgemxpYi1kZXZlbCBvcGVuc3NsLWRldmVsCisKKyNJbnN0YWxsIGFuIHVwZGF0ZWQgQm9vc3QgbGlicmFyeQord2dldCBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Jvb3N0L2ZpbGVzL2Jvb3N0LzEuNTUuMC9ib29zdF8xXzU1XzAudGFyLmd6Cit0YXIgeHZmIGJvb3N0XzFfNTVfMC50YXIuZ3oKK2NkIGJvb3N0XzFfNTVfMAorLi9ib290c3RyYXAuc2gKK3N1ZG8gLi9iMiBpbnN0YWxsCisKKyMgSmF2YSBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGFudCBqdW5pdCBhbnQtbm9kZXBzIGFudC1qdW5pdCBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKKworIyBQeXRob24gTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBweXRob24tZGV2ZWwgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXR3aXN0ZWQKKworIyBSdWJ5IExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcnVieSBydWJ5LWRldmVsIHJ1YnlnZW1zCitzdWRvIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQorCisjIE5vZGUuanMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBub2RlanMgbm9kZWpzLWRldmVsIG5wbQorCisjIFBlcmwgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBwZXJsLUJpdC1WZWN0b3IgcGVybC1DbGFzcy1BY2Nlc3NvciBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBwZXJsLVRlc3QtU2ltcGxlCisKKyMgUEhQIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgcGhwIHBocC1kZXZlbCBwaHAtcGVhciByZTJjCisKKyMgR0xpYkMgTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBnbGliMi1kZXZlbAorCisjIEVybGFuZyBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWRvIHl1bSBpbnN0YWxsIC15IGVybGFuZy1rZXJuZWwgZXJsYW5nLWVydHMgZXJsYW5nLXN0ZGxpYiBlcmxhbmctZXVuaXQgZXJsYW5nLXJlYmFyCisKKyMgTHVhIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbHVhLWRldmVsCisKKyMgR28gTElCIERlcGVuZGVuY2llcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3VkbyB5dW0gaW5zdGFsbCAteSBnb2xhbmcgZ29sYW5nLXBrZy1saW51eC1hbWQ2NAorCisjIEMjIExJQiBEZXBlbmRlbmNpZXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1ZG8geXVtIGluc3RhbGwgLXkgbW9uby1jb3JlIG1vbm8tZGV2ZWwgbW9uby13ZWItZGV2ZWwgbW9uby1leHRyYXMgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbWluZ3czMi1uc2lzCisKKyMgSGFza2VsbCBMSUIgRGVwZW5kZW5jaWVzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit3Z2V0IGh0dHA6Ly9zaGVya2luLmp1c3RodWIub3JnL2VsNi9SUE1TL3g4Nl82NC9qdXN0aHViLXJlbGVhc2UtMi4wLTQuMC5lbDYueDg2XzY0LnJwbQorc3VkbyBycG0gLWl2aCBqdXN0aHViLXJlbGVhc2UtMi4wLTQuMC5lbDYueDg2XzY0LnJwbQorc3VkbyB5dW0gLXkgaW5zdGFsbCBoYXNrZWxsCitzdWRvIGNhYmFsIHVwZGF0ZQorc3VkbyBjYWJhbCBpbnN0YWxsIGNhYmFsLWluc3RhbGwKKworIyBCdWlsZCBhbmQgVGVzdCBBcGFjaGUgVGhyaWZ0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitkYXRlID4gL2V0Yy92YWdyYW50LnByb3Zpc2lvbl9lbmQKK2VjaG8gIlN0YXJ0aW5nIEFwYWNoZSBUaHJpZnQgYnVpbGQuLi4iCitjZCAvdGhyaWZ0CitzaCBib290c3RyYXAuc2gKKworIyBBdCB0aGUgdGltZSBvZiB0aGlzIGZpbGUncyBjcmVhdGlvbiBSdWJ5LCBQeXRob24sIEdvIGFuZCBMdWEgZmFpbAorIyB0aGVpciB1bml0IHRlc3RzIGluIHRoaXMgZW52aXJvbm1lbnQuIFRvIGJ1aWxkIGFuZCB0ZXN0IGFueSBvZiB0aGVzZQorIyBsaWJyYXJpZXMgdW5jb21tZW50IHRoZSBhcHByb3ByaWF0ZSAtLXdpdGhvdXQgc3dpdGNoZXMgYmVsb3cuCisKK3NoIGNvbmZpZ3VyZSAtLXdpdGhvdXQtcnVieSAtLXdpdGhvdXQtZ28gLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtcHl0aG9uCittYWtlCitlY2hvICJTdGFydGluZyBBcGFjaGUgVGhyaWZ0IHRlc3RzLi4uIgorbWFrZSBjaGVjaworZWNobyAiRmluaXNoZWQgYnVpbGRpbmcgYW5kIHRlc3RpbmcgQXBhY2hlIFRocmlmdC4iCitlY2hvICdVc2UgIm1ha2UgaW5zdGFsbCIgdG8gaW5zdGFsbCB0aGUgY29tcGlsZXIgYW5kIGxpYnJhcmllcy4nCitkYXRlID4gL2V0Yy92YWdyYW50Lm1ha2VfZW5kCisKK1NDUklQVAorCitWYWdyYW50LmNvbmZpZ3VyZSgiMiIpIGRvIHxjb25maWd8CisgICMgRXZlcnkgVmFncmFudCB2aXJ0dWFsIGVudmlyb25tZW50IHJlcXVpcmVzIGEgYm94IHRvIGJ1aWxkIG9mZiBvZi4KKyAgIyMjIyMgQ2VudG9zIDYuNSBtaW5pbWFsIHN5c3RlbSB3aXRoIFZpcnR1YWxCb3ggR3Vlc3QgQWRkaXRpb25zCisgICMjIyMjIEJveCBtYWludGFpbmVkIGJ5IHJhQGFwYWNoZS5vcmcsIHNlZSBSRUFETUUubWQgZm9yIGJveCBjb25maWcKKyAgY29uZmlnLnZtLmJveCA9ICJSYW5keUFiZXJuZXRoeS90aHJpZnQtY2VudG9zLTYuNS02NCIKKworICAjIERpc2FibGUgYXV0b21hdGljIGJveCB1cGRhdGUgY2hlY2tpbmcuIElmIHlvdSBkaXNhYmxlIHRoaXMsIHRoZW4KKyAgIyBib3hlcyB3aWxsIG9ubHkgYmUgY2hlY2tlZCBmb3IgdXBkYXRlcyB3aGVuIHRoZSB1c2VyIHJ1bnMKKyAgIyBgdmFncmFudCBib3ggb3V0ZGF0ZWRgLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZC4KKyAgIyMjIyMgVGhpcyBib3ggd2lsbCBuZXZlciBjaGFuZ2UKKyAgY29uZmlnLnZtLmJveF9jaGVja191cGRhdGUgPSBmYWxzZQorCisgICMgQ3JlYXRlIGEgZm9yd2FyZGVkIHBvcnQgbWFwcGluZyB3aGljaCBhbGxvd3MgYWNjZXNzIHRvIGEgc3BlY2lmaWMgcG9ydAorICAjIHdpdGhpbiB0aGUgbWFjaGluZSBmcm9tIGEgcG9ydCBvbiB0aGUgaG9zdCBtYWNoaW5lLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywKKyAgIyBhY2Nlc3NpbmcgImxvY2FsaG9zdDo4MDgwIiB3aWxsIGFjY2VzcyBwb3J0IDgwIG9uIHRoZSBndWVzdCBtYWNoaW5lLgorICAjIGNvbmZpZy52bS5uZXR3b3JrICJmb3J3YXJkZWRfcG9ydCIsIGd1ZXN0OiA4MCwgaG9zdDogODA4MAorCisgICMgQ3JlYXRlIGEgcHJpdmF0ZSBuZXR3b3JrLCB3aGljaCBhbGxvd3MgaG9zdC1vbmx5IGFjY2VzcyB0byB0aGUgbWFjaGluZQorICAjIHVzaW5nIGEgc3BlY2lmaWMgSVAuCisgICMgY29uZmlnLnZtLm5ldHdvcmsgInByaXZhdGVfbmV0d29yayIsIGlwOiAiMTkyLjE2OC4zMy4xMCIKKworICAjIENyZWF0ZSBhIHB1YmxpYyBuZXR3b3JrLCB3aGljaCBnZW5lcmFsbHkgbWF0Y2hlZCB0byBicmlkZ2VkIG5ldHdvcmsuCisgICMgQnJpZGdlZCBuZXR3b3JrcyBtYWtlIHRoZSBtYWNoaW5lIGFwcGVhciBhcyBhbm90aGVyIHBoeXNpY2FsIGRldmljZSBvbgorICAjIHlvdXIgbmV0d29yay4KKyAgIyBjb25maWcudm0ubmV0d29yayAicHVibGljX25ldHdvcmsiCisKKyAgIyBJZiB0cnVlLCB0aGVuIGFueSBTU0ggY29ubmVjdGlvbnMgbWFkZSB3aWxsIGVuYWJsZSBhZ2VudCBmb3J3YXJkaW5nLgorICAjIERlZmF1bHQgdmFsdWU6IGZhbHNlCisgICMgY29uZmlnLnNzaC5mb3J3YXJkX2FnZW50ID0gdHJ1ZQorCisgICMgU2hhcmUgYW4gYWRkaXRpb25hbCBmb2xkZXIgdG8gdGhlIGd1ZXN0IFZNLiBUaGUgZmlyc3QgYXJndW1lbnQgaXMKKyAgIyB0aGUgcGF0aCBvbiB0aGUgaG9zdCB0byB0aGUgYWN0dWFsIGZvbGRlci4gVGhlIHNlY29uZCBhcmd1bWVudCBpcworICAjIHRoZSBwYXRoIG9uIHRoZSBndWVzdCB0byBtb3VudCB0aGUgZm9sZGVyLiBBbmQgdGhlIG9wdGlvbmFsIHRoaXJkCisgICMgYXJndW1lbnQgaXMgYSBzZXQgb2Ygbm9uLXJlcXVpcmVkIG9wdGlvbnMuCisgICMgY29uZmlnLnZtLnN5bmNlZF9mb2xkZXIgIi4uL2RhdGEiLCAiL3ZhZ3JhbnRfZGF0YSIKKyAgIyMjIyMgQnkgY29udmVudGlvbiB0aGUgdGhyaWZ0IHNvdXJjZSB0cmVlIGlzIG1hcHBlZCB0byAvdGhyaWZ0CisgIGNvbmZpZy52bS5zeW5jZWRfZm9sZGVyICIuLi8uLi8uLi8iLCAiL3RocmlmdCIKKworICAjIFByb3ZpZGVyLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc28geW91IGNhbiBmaW5lLXR1bmUgdmFyaW91cworICAjIGJhY2tpbmcgcHJvdmlkZXJzIGZvciBWYWdyYW50LiBUaGVzZSBleHBvc2UgcHJvdmlkZXItc3BlY2lmaWMgb3B0aW9ucy4KKyAgIyMjIyMgVGhlIG1hY2hpbmUgbmVlZHMgMiBDUFVzIGFuZCAyR0IgUkFNIGZvciByZWFzb25hYmxlIHBlcmZvcm1hbmNlCisgIGNvbmZpZy52bS5wcm92aWRlciAidmlydHVhbGJveCIgZG8gfHZifAorICAgIHZiLmN1c3RvbWl6ZSBbIm1vZGlmeXZtIiwgOmlkLCAiLS1tZW1vcnkiLCAiMjA0OCJdCisgICAgdmIuY3VzdG9taXplIFsibW9kaWZ5dm0iLCA6aWQsICItLWNwdXMiLCAiMiJdCisgIGVuZAorCisgICMgRW5hYmxlIHByb3Zpc2lvbmluZyB3aXRoIENGRW5naW5lLiBDRkVuZ2luZSBDb21tdW5pdHkgcGFja2FnZXMgYXJlCisgICMgYXV0b21hdGljYWxseSBpbnN0YWxsZWQuIEZvciBleGFtcGxlLCBjb25maWd1cmUgdGhlIGhvc3QgYXMgYQorICAjIHBvbGljeSBzZXJ2ZXIgYW5kIG9wdGlvbmFsbHkgYSBwb2xpY3kgZmlsZSB0byBydW46CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjZmVuZ2luZSIgZG8gfGNmfAorICAjICAgY2YuYW1fcG9saWN5X2h1YiA9IHRydWUKKyAgIyAgICMgY2YucnVuX2ZpbGUgPSAibW90ZC5jZiIKKyAgIyBlbmQKKyAgIworICAjIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgYW5kIGJvb3RzdHJhcCBhIGNsaWVudCB0byBhbiBleGlzdGluZworICAjIHBvbGljeSBzZXJ2ZXI6CisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJjZmVuZ2luZSIgZG8gfGNmfAorICAjICAgY2YucG9saWN5X3NlcnZlcl9hZGRyZXNzID0gIjEwLjAuMi4xNSIKKyAgIyBlbmQKKworICAjIEVuYWJsZSBwcm92aXNpb25pbmcgd2l0aCBQdXBwZXQgc3RhbmQgYWxvbmUuICBQdXBwZXQgbWFuaWZlc3RzCisgICMgYXJlIGNvbnRhaW5lZCBpbiBhIGRpcmVjdG9yeSBwYXRoIHJlbGF0aXZlIHRvIHRoaXMgVmFncmFudGZpbGUuCisgICMgWW91IHdpbGwgbmVlZCB0byBjcmVhdGUgdGhlIG1hbmlmZXN0cyBkaXJlY3RvcnkgYW5kIGEgbWFuaWZlc3QgaW4KKyAgIyB0aGUgZmlsZSBkZWZhdWx0LnBwIGluIHRoZSBtYW5pZmVzdHNfcGF0aCBkaXJlY3RvcnkuCisgICMKKyAgIyBjb25maWcudm0ucHJvdmlzaW9uICJwdXBwZXQiIGRvIHxwdXBwZXR8CisgICMgICBwdXBwZXQubWFuaWZlc3RzX3BhdGggPSAibWFuaWZlc3RzIgorICAjICAgcHVwcGV0Lm1hbmlmZXN0X2ZpbGUgID0gImRlZmF1bHQucHAiCisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzb2xvLCBzcGVjaWZ5aW5nIGEgY29va2Jvb2tzIHBhdGgsIHJvbGVzCisgICMgcGF0aCwgYW5kIGRhdGFfYmFncyBwYXRoIChhbGwgcmVsYXRpdmUgdG8gdGhpcyBWYWdyYW50ZmlsZSksIGFuZCBhZGRpbmcKKyAgIyBzb21lIHJlY2lwZXMgYW5kL29yIHJvbGVzLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9zb2xvIiBkbyB8Y2hlZnwKKyAgIyAgIGNoZWYuY29va2Jvb2tzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9jb29rYm9va3MiCisgICMgICBjaGVmLnJvbGVzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9yb2xlcyIKKyAgIyAgIGNoZWYuZGF0YV9iYWdzX3BhdGggPSAiLi4vbXktcmVjaXBlcy9kYXRhX2JhZ3MiCisgICMgICBjaGVmLmFkZF9yZWNpcGUgIm15c3FsIgorICAjICAgY2hlZi5hZGRfcm9sZSAid2ViIgorICAjCisgICMgICAjIFlvdSBtYXkgYWxzbyBzcGVjaWZ5IGN1c3RvbSBKU09OIGF0dHJpYnV0ZXM6CisgICMgICBjaGVmLmpzb24gPSB7IG15c3FsX3Bhc3N3b3JkOiAiZm9vIiB9CisgICMgZW5kCisKKyAgIyBFbmFibGUgcHJvdmlzaW9uaW5nIHdpdGggY2hlZiBzZXJ2ZXIsIHNwZWNpZnlpbmcgdGhlIGNoZWYgc2VydmVyIFVSTCwKKyAgIyBhbmQgdGhlIHBhdGggdG8gdGhlIHZhbGlkYXRpb24ga2V5IChyZWxhdGl2ZSB0byB0aGlzIFZhZ3JhbnRmaWxlKS4KKyAgIworICAjIFRoZSBPcHNjb2RlIFBsYXRmb3JtIHVzZXMgSFRUUFMuIFN1YnN0aXR1dGUgeW91ciBvcmdhbml6YXRpb24gZm9yCisgICMgT1JHTkFNRSBpbiB0aGUgVVJMIGFuZCB2YWxpZGF0aW9uIGtleS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB1c2UgdGhlIGFwcHJvcHJpYXRlIFVSTCwgd2hpY2ggbWF5IGJlCisgICMgSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIGRlcGVuZGluZyBvbiB5b3VyIGNvbmZpZ3VyYXRpb24uIEFsc28gY2hhbmdlIHRoZQorICAjIHZhbGlkYXRpb24ga2V5IHRvIHZhbGlkYXRpb24ucGVtLgorICAjCisgICMgY29uZmlnLnZtLnByb3Zpc2lvbiAiY2hlZl9jbGllbnQiIGRvIHxjaGVmfAorICAjICAgY2hlZi5jaGVmX3NlcnZlcl91cmwgPSAiaHR0cHM6Ly9hcGkub3BzY29kZS5jb20vb3JnYW5pemF0aW9ucy9PUkdOQU1FIgorICAjICAgY2hlZi52YWxpZGF0aW9uX2tleV9wYXRoID0gIk9SR05BTUUtdmFsaWRhdG9yLnBlbSIKKyAgIyBlbmQKKyAgIworICAjIElmIHlvdSdyZSB1c2luZyB0aGUgT3BzY29kZSBwbGF0Zm9ybSwgeW91ciB2YWxpZGF0b3IgY2xpZW50IGlzCisgICMgT1JHTkFNRS12YWxpZGF0b3IsIHJlcGxhY2luZyBPUkdOQU1FIHdpdGggeW91ciBvcmdhbml6YXRpb24gbmFtZS4KKyAgIworICAjIElmIHlvdSBoYXZlIHlvdXIgb3duIENoZWYgU2VydmVyLCB0aGUgZGVmYXVsdCB2YWxpZGF0aW9uIGNsaWVudCBuYW1lIGlzCisgICMgY2hlZi12YWxpZGF0b3IsIHVubGVzcyB5b3UgY2hhbmdlZCB0aGUgY29uZmlndXJhdGlvbi4KKyAgIworICAjICAgY2hlZi52YWxpZGF0aW9uX2NsaWVudF9uYW1lID0gIk9SR05BTUUtdmFsaWRhdG9yIgorCisgICMjIyMjIFJ1biB0aGUgQXBhY2hlIFRocmlmdCBwcm92aXNpb25pbmcgc2NyaXB0IChkZWNsYXJlZCBhYm92ZSkKKyAgY29uZmlnLnZtLnByb3Zpc2lvbiA6c2hlbGwsIDppbmxpbmUgPT4gJGJ1aWxkX2FuZF90ZXN0CitlbmQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKaW5kZXggYTFkNzE1Ni4uZWUzOThlMiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKKysrIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKQEAgLTEsNiArMSw0IEBACiBUSFJJRlQgPSB0aHJpZnQKLUNYWEZMQUdTID0gYHBrZy1jb25maWcgLS1jZmxhZ3MgbGliem1xIHRocmlmdGAKLUxETElCUyA9IGBwa2ctY29uZmlnIC0tbGlicyBsaWJ6bXEgdGhyaWZ0YAogCiBDWFhGTEFHUyArPSAtZzMgLU8wCiAKQEAgLTE2LDE1ICsxNCwxOSBAQAogYWxsOiAkKFBZTElCUykgJChQUk9HUykKIAogdGVzdC1jbGllbnQ6IHRlc3QtY2xpZW50Lm8gVFptcUNsaWVudC5vICQoR0VOT0JKUykKKwkkKENYWCkgJF4gLW8gJEAgLWx6bXEgLWx0aHJpZnQKIHRlc3Qtc2VydmVyOiB0ZXN0LXNlcnZlci5vIFRabXFTZXJ2ZXIubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0CiB0ZXN0LXNlbmRlcjogdGVzdC1zZW5kZXIubyBUWm1xQ2xpZW50Lm8gJChHRU5PQkpTKQorCSQoQ1hYKSAkXiAtbyAkQCAtbHptcSAtbHRocmlmdAogdGVzdC1yZWNlaXZlcjogdGVzdC1yZWNlaXZlci5vIFRabXFTZXJ2ZXIubyAkKEdFTk9CSlMpCisJJChDWFgpICReIC1vICRAIC1sem1xIC1sdGhyaWZ0CiAKIHRlc3QtY2xpZW50Lm8gdGVzdC1zZXJ2ZXIubyB0ZXN0LXNlbmRlci5vIHRlc3QtcmVjZWl2ZXIubzogJChHRU5TUkNTKQogCiBzdG9yYWdlL19faW5pdF9fLnB5OiBzdG9yYWdlLnRocmlmdAogCSQoUk0pICQoZGlyICRAKQotCSQoVEhSSUZUKSAtLWdlbiBweTpuZXdzdHlsZSAkPAorCSQoVEhSSUZUKSAtLWdlbiBweSAkPAogCW12IGdlbi1weS8kKGRpciAkQCkgLgogCiAkKEdFTlNSQ1MpOiBzdG9yYWdlLnRocmlmdApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvUkVBRE1FIGIvY29udHJpYi96ZXJvbXEvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL3plcm9tcS9SRUFETUUKcmVuYW1lIHRvIGNvbnRyaWIvemVyb21xL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5jcHAgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcAppbmRleCAxMzMyMDRlLi41NjI3OGYzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcAorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmNwcApAQCAtMjIsNyArMjIsNyBAQAogCiBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11aW50MzJfdCBUWm1xQ2xpZW50OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Cit1aW50MzJfdCBUWm1xQ2xpZW50OjpyZWFkX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgaWYgKHJidWZfLmF2YWlsYWJsZV9yZWFkKCkgPT0gMCkgewogICAgICh2b2lkKXNvY2tfLnJlY3YoJm1zZ18pOwogICAgIHJidWZfLnJlc2V0QnVmZmVyKCh1aW50OF90Kiltc2dfLmRhdGEoKSwgbXNnXy5zaXplKCkpOwpAQCAtMzAsMTEgKzMwLDExIEBACiAgIHJldHVybiByYnVmXy5yZWFkKGJ1ZiwgbGVuKTsKIH0KIAotdm9pZCBUWm1xQ2xpZW50Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewordm9pZCBUWm1xQ2xpZW50Ojp3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHJldHVybiB3YnVmXy53cml0ZShidWYsIGxlbik7CiB9CiAKLXZvaWQgVFptcUNsaWVudDo6d3JpdGVFbmQoKSB7Cit1aW50MzJfdCBUWm1xQ2xpZW50Ojp3cml0ZUVuZCgpIHsKICAgdWludDhfdCogYnVmOwogICB1aW50MzJfdCBzaXplOwogICB3YnVmXy5nZXRCdWZmZXIoJmJ1ZiwgJnNpemUpOwpAQCAtNDIsNiArNDIsNyBAQAogICBzdGQ6Om1lbWNweShtc2cuZGF0YSgpLCBidWYsIHNpemUpOwogICAodm9pZClzb2NrXy5zZW5kKG1zZyk7CiAgIHdidWZfLnJlc2V0QnVmZmVyKHRydWUpOworICByZXR1cm4gc2l6ZTsKIH0KIAogfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaCBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQuaAppbmRleCA5ZmNmYzA2Li5kZjE2ZTAzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LmgKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5oCkBAIC00NSwxNSArNDUsMTUgQEAKICAgICB9CiAgIH0KIAotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotICB2b2lkIHdyaXRlRW5kKCk7CisgIHVpbnQzMl90IHdyaXRlRW5kKCk7CiAKICBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6c3RyaW5nIGVuZHBvaW50XzsKICAgem1xOjpzb2NrZXRfdCBzb2NrXzsKKyAgc3RkOjpzdHJpbmcgZW5kcG9pbnRfOwogICBUTWVtb3J5QnVmZmVyIHdidWZfOwogICBUTWVtb3J5QnVmZmVyIHJidWZfOwogICB6bXE6Om1lc3NhZ2VfdCBtc2dfOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weSBiL2NvbnRyaWIvemVyb21xL1RabXFDbGllbnQucHkKaW5kZXggZDU2MDY5Ny4uMWJkNjBhMSAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcUNsaWVudC5weQorKysgYi9jb250cmliL3plcm9tcS9UWm1xQ2xpZW50LnB5CkBAIC0yMCw0NCArMjAsNDUgQEAKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQKIAorCiBjbGFzcyBUWm1xQ2xpZW50KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICBkZWYgX19pbml0X18oc2VsZiwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKLSAgICBzZWxmLl9zb2NrID0gY3R4LnNvY2tldChzb2NrX3R5cGUpCi0gICAgc2VsZi5fZW5kcG9pbnQgPSBlbmRwb2ludAotICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3R4LCBlbmRwb2ludCwgc29ja190eXBlKToKKyAgICAgICAgc2VsZi5fc29jayA9IGN0eC5zb2NrZXQoc29ja190eXBlKQorICAgICAgICBzZWxmLl9lbmRwb2ludCA9IGVuZHBvaW50CisgICAgICAgIHNlbGYuX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgc2VsZi5fc29jay5jb25uZWN0KHNlbGYuX2VuZHBvaW50KQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLl9zb2NrLmNvbm5lY3Qoc2VsZi5fZW5kcG9pbnQpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6Ci0gICAgcmV0ID0gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCi0gICAgaWYgbGVuKHJldCkgIT0gMDoKLSAgICAgIHJldHVybiByZXQKLSAgICBzZWxmLl9yZWFkX21lc3NhZ2UoKQotICAgIHJldHVybiBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0ID0gc2VsZi5fcmJ1Zi5yZWFkKHNpemUpCisgICAgICAgIGlmIGxlbihyZXQpICE9IDA6CisgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgIHNlbGYuX3JlYWRfbWVzc2FnZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmLnJlYWQoc2l6ZSkKIAotICBkZWYgX3JlYWRfbWVzc2FnZShzZWxmKToKLSAgICBtc2cgPSBzZWxmLl9zb2NrLnJlY3YoKQotICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhtc2cpCisgICAgZGVmIF9yZWFkX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX3NvY2sucmVjdigpCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTyhtc2cpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBtc2cgPSBzZWxmLl93YnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl93YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX3NvY2suc2VuZChtc2cpCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl93YnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fc29jay5zZW5kKG1zZykKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9yYnVmCisgICAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yYnVmCiAKLSAgIyBOT1RFOiBUaGlzIHdpbGwgcHJvYmFibHkgbm90IGFjdHVhbGx5IHdvcmsuCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKLSAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKLSAgICAgIHNlbGYucmVhZF9tZXNzYWdlKCkKLSAgICAgIHByZWZpeCArPSBzZWxmLl9yYnVmLmdldHZhbHVlKCkKLSAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8ocHJlZml4KQotICAgIHJldHVybiBzZWxmLl9yYnVmCisgICAgIyBOT1RFOiBUaGlzIHdpbGwgcHJvYmFibHkgbm90IGFjdHVhbGx5IHdvcmsuCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYucmVhZF9tZXNzYWdlKCkKKyAgICAgICAgICAgIHByZWZpeCArPSBzZWxmLl9yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKHByZWZpeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JidWYKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKaW5kZXggZjI1NWE2Ni4uODg2NjBhMyAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKQEAgLTIxLDEzICsyMSwxMiBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogCiBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgewogCi0KIGJvb2wgVFptcVNlcnZlcjo6c2VydmVPbmUoaW50IHJlY3ZfZmxhZ3MpIHsKICAgem1xOjptZXNzYWdlX3QgbXNnOwogICBib29sIHJlY2VpdmVkID0gc29ja18ucmVjdigmbXNnLCByZWN2X2ZsYWdzKTsKQEAgLTQwLDggKzM5LDkgQEAKICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpKTsKICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sKAogICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdHJhbnNwb3J0KG5ldyBUTWVtb3J5QnVmZmVyKTsKIAotICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgTlVMTCk7CiAKICAgaWYgKHptcV90eXBlXyA9PSBaTVFfUkVQKSB7CiAgICAgdWludDhfdCogYnVmOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCmluZGV4IGY5MWM2ZTguLmVjZDEzYjQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UWk1RU0VSVkVSX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx6bXEuaHBwPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgogCkBAIC0yOCw5ICsyOSwxMCBAQAogY2xhc3MgVFptcVNlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKICBwdWJsaWM6CiAgIFRabXFTZXJ2ZXIoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAogICAgICAgem1xOjpjb250ZXh0X3QmIGN0eCwgY29uc3Qgc3RkOjpzdHJpbmcmIGVuZHBvaW50LCBpbnQgdHlwZSkKICAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKQorICAgICwgcHJvY2Vzc29yXyhwcm9jZXNzb3IpCiAgICAgLCB6bXFfdHlwZV8odHlwZSkKICAgICAsIHNvY2tfKGN0eCwgdHlwZSkKICAgewpAQCAtNTUsNiArNTcsNyBAQAogICB9CiAKICBwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKICAgaW50IHptcV90eXBlXzsKICAgem1xOjpzb2NrZXRfdCBzb2NrXzsKIH07CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5IGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5weQppbmRleCBjODNjYzhkLi4xNWMxNTQzIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLnB5CisrKyBiL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIucHkKQEAgLTIxLDU4ICsyMSw1OSBAQAogaW1wb3J0IHRocmlmdC5zZXJ2ZXIuVFNlcnZlcgogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydAogCisKIGNsYXNzIFRabXFTZXJ2ZXIodGhyaWZ0LnNlcnZlci5UU2VydmVyLlRTZXJ2ZXIpOgotICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBjdHgsIGVuZHBvaW50LCBzb2NrX3R5cGUpOgotICAgIHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSkKLSAgICBzZWxmLnptcV90eXBlID0gc29ja190eXBlCi0gICAgc2VsZi5zb2NrZXQgPSBjdHguc29ja2V0KHNvY2tfdHlwZSkKLSAgICBzZWxmLnNvY2tldC5iaW5kKGVuZHBvaW50KQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGN0eCwgZW5kcG9pbnQsIHNvY2tfdHlwZSk6CisgICAgICAgIHRocmlmdC5zZXJ2ZXIuVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSkKKyAgICAgICAgc2VsZi56bXFfdHlwZSA9IHNvY2tfdHlwZQorICAgICAgICBzZWxmLnNvY2tldCA9IGN0eC5zb2NrZXQoc29ja190eXBlKQorICAgICAgICBzZWxmLnNvY2tldC5iaW5kKGVuZHBvaW50KQogCi0gIGRlZiBzZXJ2ZU9uZShzZWxmKToKLSAgICBtc2cgPSBzZWxmLnNvY2tldC5yZWN2KCkKLSAgICBpdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cpCi0gICAgb3RyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisgICAgZGVmIHNlcnZlT25lKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLnNvY2tldC5yZWN2KCkKKyAgICAgICAgaXRyYW5zID0gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnKQorICAgICAgICBvdHJhbnMgPSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKLSAgICAgICMgRmFsbCB0aHJvdWdoIGFuZCBzZW5kIGJhY2sgYSByZXNwb25zZSwgZXZlbiBpZiBlbXB0eSBvciBpbmNvbXBsZXRlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKKyAgICAgICAgICAgICMgRmFsbCB0aHJvdWdoIGFuZCBzZW5kIGJhY2sgYSByZXNwb25zZSwgZXZlbiBpZiBlbXB0eSBvciBpbmNvbXBsZXRlLgogCi0gICAgaWYgc2VsZi56bXFfdHlwZSA9PSB6bXEuUkVQOgotICAgICAgbXNnID0gb3RyYW5zLmdldHZhbHVlKCkKLSAgICAgIHNlbGYuc29ja2V0LnNlbmQobXNnKQorICAgICAgICBpZiBzZWxmLnptcV90eXBlID09IHptcS5SRVA6CisgICAgICAgICAgICBtc2cgPSBvdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHdoaWxlIFRydWU6Ci0gICAgICBzZWxmLnNlcnZlT25lKCkKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLnNlcnZlT25lKCkKIAogCiBjbGFzcyBUWm1xTXVsdGlTZXJ2ZXIob2JqZWN0KToKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYuc2VydmVycyA9IFtdCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlcnMgPSBbXQogCi0gIGRlZiBzZXJ2ZU9uZShzZWxmLCB0aW1lb3V0ID0gLTEpOgotICAgIHNlbGYuX3NlcnZlQWN0aXZlKHNlbGYuX3NldHVwUG9sbCgpLCB0aW1lb3V0KQorICAgIGRlZiBzZXJ2ZU9uZShzZWxmLCB0aW1lb3V0PS0xKToKKyAgICAgICAgc2VsZi5fc2VydmVBY3RpdmUoc2VsZi5fc2V0dXBQb2xsKCksIHRpbWVvdXQpCiAKLSAgZGVmIHNlcnZlRm9yZXZlcihzZWxmKToKLSAgICBwb2xsX2luZm8gPSBzZWxmLl9zZXR1cFBvbGwoKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShwb2xsX2luZm8sIC0xKQorICAgIGRlZiBzZXJ2ZUZvcmV2ZXIoc2VsZik6CisgICAgICAgIHBvbGxfaW5mbyA9IHNlbGYuX3NldHVwUG9sbCgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzZWxmLl9zZXJ2ZUFjdGl2ZShwb2xsX2luZm8sIC0xKQogCi0gIGRlZiBfc2V0dXBQb2xsKHNlbGYpOgotICAgIHNlcnZlcl9tYXAgPSB7fQotICAgIHBvbGxlciA9IHptcS5Qb2xsZXIoKQotICAgIGZvciBzZXJ2ZXIgaW4gc2VsZi5zZXJ2ZXJzOgotICAgICAgc2VydmVyX21hcFtzZXJ2ZXIuc29ja2V0XSA9IHNlcnZlcgotICAgICAgcG9sbGVyLnJlZ2lzdGVyKHNlcnZlci5zb2NrZXQsIHptcS5QT0xMSU4pCi0gICAgcmV0dXJuIChzZXJ2ZXJfbWFwLCBwb2xsZXIpCisgICAgZGVmIF9zZXR1cFBvbGwoc2VsZik6CisgICAgICAgIHNlcnZlcl9tYXAgPSB7fQorICAgICAgICBwb2xsZXIgPSB6bXEuUG9sbGVyKCkKKyAgICAgICAgZm9yIHNlcnZlciBpbiBzZWxmLnNlcnZlcnM6CisgICAgICAgICAgICBzZXJ2ZXJfbWFwW3NlcnZlci5zb2NrZXRdID0gc2VydmVyCisgICAgICAgICAgICBwb2xsZXIucmVnaXN0ZXIoc2VydmVyLnNvY2tldCwgem1xLlBPTExJTikKKyAgICAgICAgcmV0dXJuIChzZXJ2ZXJfbWFwLCBwb2xsZXIpCiAKLSAgZGVmIF9zZXJ2ZUFjdGl2ZShzZWxmLCBwb2xsX2luZm8sIHRpbWVvdXQpOgotICAgIChzZXJ2ZXJfbWFwLCBwb2xsZXIpID0gcG9sbF9pbmZvCi0gICAgcmVhZHkgPSBkaWN0KHBvbGxlci5wb2xsKCkpCi0gICAgZm9yIHNvY2ssIHN0YXRlIGluIHJlYWR5Lml0ZW1zKCk6Ci0gICAgICBhc3NlcnQgKHN0YXRlICYgem1xLlBPTExJTikgIT0gMAotICAgICAgc2VydmVyX21hcFtzb2NrXS5zZXJ2ZU9uZSgpCisgICAgZGVmIF9zZXJ2ZUFjdGl2ZShzZWxmLCBwb2xsX2luZm8sIHRpbWVvdXQpOgorICAgICAgICAoc2VydmVyX21hcCwgcG9sbGVyKSA9IHBvbGxfaW5mbworICAgICAgICByZWFkeSA9IGRpY3QocG9sbGVyLnBvbGwoKSkKKyAgICAgICAgZm9yIHNvY2ssIHN0YXRlIGluIHJlYWR5Lml0ZW1zKCk6CisgICAgICAgICAgICBhc3NlcnQgKHN0YXRlICYgem1xLlBPTExJTikgIT0gMAorICAgICAgICAgICAgc2VydmVyX21hcFtzb2NrXS5zZXJ2ZU9uZSgpCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzIGIvY29udHJpYi96ZXJvbXEvY3NoYXJwL0Fzc2VtYmx5SW5mby5jcwppbmRleCA5YWQ0OGM2Li4xMmNkNDM0IDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS9jc2hhcnAvQXNzZW1ibHlJbmZvLmNzCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9Bc3NlbWJseUluZm8uY3MKQEAgLTE0LDIwICsxNCwyMCBAQAogICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQorICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAogdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247CiB1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwogCi0vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFzc2VtYmx5IGlzIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzLiAKKy8vIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXNzZW1ibHkgaXMgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMuCiAvLyBDaGFuZ2UgdGhlbSB0byB0aGUgdmFsdWVzIHNwZWNpZmljIHRvIHlvdXIgcHJvamVjdC4KIAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJabXFTZXJ2ZXIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiWm1xIEV4YW1wbGVzIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIiIpXQ0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCkBAIC0zOCw3ICszOCw3IEBACiAKIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQogCi0vLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2lnbmluZyBrZXkgZm9yIHRoZSBhc3NlbWJseSwgCisvLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc2lnbmluZyBrZXkgZm9yIHRoZSBhc3NlbWJseSwKIC8vIGlmIGRlc2lyZWQuIFNlZSB0aGUgTW9ubyBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNpZ25pbmcuCiAKIC8vW2Fzc2VtYmx5OiBBc3NlbWJseURlbGF5U2lnbihmYWxzZSldCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS9jc2hhcnAvVFptcUNsaWVudC5jcyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzCmluZGV4IGM3OTI4ODIuLmU5YWI1MTYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzCisrKyBiL2NvbnRyaWIvemVyb21xL2NzaGFycC9UWm1xQ2xpZW50LmNzCkBAIC00Nyw3ICs0Nyw3IEBACiAJCQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uICgpOwogCiAJCQlpZiAoX3JidWYuTGVuZ3RoID09IDApIHsKLQkJCQkvL0ZpbGwgdGhlIEJ1ZmZlciB3aXRoIHRoZSBjb21wbGV0ZSBaTVEgTWVzc2FnZSB3aGljaCBuZWVkcyB0byBiZSg/ISkgdGhlIGNvbXBsZXRlIFRocmlmdCByZXBvbnNlCisJCQkJLy9GaWxsIHRoZSBCdWZmZXIgd2l0aCB0aGUgY29tcGxldGUgWk1RIE1lc3NhZ2Ugd2hpY2ggbmVlZHMgdG8gYmUoPyEpIHRoZSBjb21wbGV0ZSBUaHJpZnQgcmVzcG9uc2UKIAkJCQlkZWJ1ZyAoIkNsaWVudF9SZWFkIEZpbGxpbmcgYnVmZmVyLi4iKTsKIAkJCQlieXRlW10gdG1wQnVmID0gX3NvY2suUmVjdiAoKTsKIAkJCQlkZWJ1ZyAoc3RyaW5nLkZvcm1hdCgiQ2xpZW50X1JlYWQgZmlsbGVkIHdpdGggezB9YiIsdG1wQnVmLkxlbmd0aCkpOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2ogYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagppbmRleCAxZDVmMTNjLi44MGFkMWRiIDEwMDc1NQotLS0gYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagpAQCAtMSw5MSArMSw5MSBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08UHJvamVjdCBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIFRvb2xzVmVyc2lvbj0iNC4wIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj54ODY8L1BsYXRmb3JtPg0KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4NCi0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KLSAgICA8UHJvamVjdEd1aWQ+ezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX08L1Byb2plY3RHdWlkPg0KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+DQotICAgIDxSb290TmFtZXNwYWNlPlptcVNlcnZlcjwvUm9vdE5hbWVzcGFjZT4NCi0gICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRaTVE8L0Fzc2VtYmx5TmFtZT4NCi0gICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCi0gICAgPEZpbGVVcGdyYWRlRmxhZ3M+DQotICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4NCi0gICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCi0gICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPg0KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4NCi0gICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCi0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPg0KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4NCi0gICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4NCi0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPg0KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPg0KLSAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+DQotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+DQotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4NCi0gICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4NCi0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4NCi0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4NCi0gICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+DQotICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfHg4NicgIj4NCi0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWc8L091dHB1dFBhdGg+DQotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc8L0RlZmluZUNvbnN0YW50cz4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4NCi0gICAgPEV4dGVybmFsY29uc29sZT50cnVlPC9FeHRlcm5hbGNvbnNvbGU+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8eDg2JyAiPg0KLSAgICA8RGVidWdUeXBlPm5vbmU8L0RlYnVnVHlwZT4NCi0gICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCi0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2U8L091dHB1dFBhdGg+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+DQotICAgIDxFeHRlcm5hbGNvbnNvbGU+dHJ1ZTwvRXh0ZXJuYWxjb25zb2xlPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJjbHJ6bXEsIFZlcnNpb249Mi4xLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9eDg2Ij4NCi0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQotICAgICAgPEhpbnRQYXRoPi5cY2xyem1xLmRsbDwvSGludFBhdGg+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnQsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsIj4NCi0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQotICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcVGhyaWZ0LmRsbDwvSGludFBhdGg+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJNYWluLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJBc3NlbWJseUluZm8uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlRabXFTZXJ2ZXIuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlRabXFDbGllbnQuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU3RvcmFnZS5jcyIgLz4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+DQotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+DQotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDE8L1Byb2R1Y3ROYW1lPg0KLSAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+DQotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQotICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+DQotICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCi0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCi08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPng4NjwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxSb290TmFtZXNwYWNlPlptcVNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdFpNUTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8eDg2JyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RXh0ZXJuYWxjb25zb2xlPnRydWU8L0V4dGVybmFsY29uc29sZT4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXx4ODYnICI+CisgICAgPERlYnVnVHlwZT5ub25lPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZTwvT3V0cHV0UGF0aD4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8UGxhdGZvcm1UYXJnZXQ+eDg2PC9QbGF0Zm9ybVRhcmdldD4KKyAgICA8RXh0ZXJuYWxjb25zb2xlPnRydWU8L0V4dGVybmFsY29uc29sZT4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJjbHJ6bXEsIFZlcnNpb249Mi4xLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9eDg2Ij4KKyAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4KKyAgICAgIDxIaW50UGF0aD4uXGNscnptcS5kbGw8L0hpbnRQYXRoPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iVGhyaWZ0LCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbCI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+Li5cLi5cLi5cbGliXGNzaGFycFxUaHJpZnQuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTWFpbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFptcVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUWm1xQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcU3RvcmFnZS5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5zbG4gYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLnNsbgppbmRleCA0MDRhNzQ3Li42YWY1N2I2IDEwMDc1NQotLS0gYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLnNsbgorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLnNsbgpAQCAtMSw0MiArMSw0MiBAQAot77u/DQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAxMA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0Wk1RIiwgIlRocmlmdFpNUS5jc3Byb2oiLCAiezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0iDQotRW5kUHJvamVjdA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUNCi0JCURlYnVnfE1peGVkIFBsYXRmb3JtcyA9IERlYnVnfE1peGVkIFBsYXRmb3Jtcw0KLQkJRGVidWd8eDg2ID0gRGVidWd8eDg2DQotCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCi0JCVJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zID0gUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMNCi0JCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYNCi0JCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYNCi0JCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfHg4Ng0KLQkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4Ng0KLQkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IFJlbGVhc2V8eDg2DQotCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4Ng0KLQkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8eDg2DQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxNaXhlZCBQbGF0Zm9ybXMuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbg0KLQkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQotCUVuZEdsb2JhbFNlY3Rpb24NCi1FbmRHbG9iYWwNCivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDExLjAwCisjIFZpc3VhbCBTdHVkaW8gMjAxMAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRaTVEiLCAiVGhyaWZ0Wk1RLmNzcHJvaiIsICJ7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMgPSBEZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCQlSZWxlYXNlfE1peGVkIFBsYXRmb3JtcyA9IFJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zCisJCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3x4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uRGVidWd8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3xNaXhlZCBQbGF0Zm9ybXMuQnVpbGQuMCA9IERlYnVnfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8eDg2CisJCXsxN0M2M0I5MC1ERkQ3LTQyQUMtQTdCMC03NDlFNjg3NkMwQTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBSZWxlYXNlfHg4NgorCQl7MTdDNjNCOTAtREZENy00MkFDLUE3QjAtNzQ5RTY4NzZDMEExfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXx4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4ODYKKwkJezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8eDg2CisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8TWl4ZWQgUGxhdGZvcm1zLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfE1peGVkIFBsYXRmb3Jtcy5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcAppbmRleCBkMmZjNTZjLi4xNTljMjUwIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgIlRabXFDbGllbnQuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRabXFDbGllbnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKIApAQCAtMTcsNyArMTcsNyBAQAogICBpZiAoYXJnYyA+IDEpIHsKICAgICBpbmNyID0gYXRvaShhcmd2WzFdKTsKICAgICBpZiAoaW5jcikgewotICAgICAgc29ja3R5cGUgPSBaTVFfRE9XTlNUUkVBTTsKKyAgICAgIHNvY2t0eXBlID0gWk1RX1BVU0g7CiAgICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSI7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weSBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CmluZGV4IDE4ODZkOWMuLmQ1MTIxNmUgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LnB5CkBAIC05LDI4ICs5LDI4IEBACiAKIAogZGVmIG1haW4oYXJncyk6Ci0gIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkwIgotICBzb2NrdHlwZSA9IHptcS5SRVEKLSAgaW5jciA9IDAKLSAgaWYgbGVuKGFyZ3MpID4gMToKLSAgICBpbmNyID0gaW50KGFyZ3NbMV0pCisgICAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTAiCisgICAgc29ja3R5cGUgPSB6bXEuUkVRCisgICAgaW5jciA9IDAKKyAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICBpbmNyID0gaW50KGFyZ3NbMV0pCisgICAgICAgIGlmIGluY3I6CisgICAgICAgICAgICBzb2NrdHlwZSA9IHptcS5QVVNICisgICAgICAgICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSIKKworICAgIGN0eCA9IHptcS5Db250ZXh0KCkKKyAgICB0cmFuc3BvcnQgPSBUWm1xQ2xpZW50LlRabXFDbGllbnQoY3R4LCBlbmRwb2ludCwgc29ja3R5cGUpCisgICAgcHJvdG9jb2wgPSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zcG9ydCkKKyAgICBjbGllbnQgPSBzdG9yYWdlLlN0b3JhZ2UuQ2xpZW50KHByb3RvY29sKQorICAgIHRyYW5zcG9ydC5vcGVuKCkKKwogICAgIGlmIGluY3I6Ci0gICAgICBzb2NrdHlwZSA9IHptcS5ET1dOU1RSRUFNCi0gICAgICBlbmRwb2ludCA9ICJ0Y3A6Ly8xMjcuMC4wLjE6OTA5MSIKLQotICBjdHggPSB6bXEuQ29udGV4dCgpCi0gIHRyYW5zcG9ydCA9IFRabXFDbGllbnQuVFptcUNsaWVudChjdHgsIGVuZHBvaW50LCBzb2NrdHlwZSkKLSAgcHJvdG9jb2wgPSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKHRyYW5zcG9ydCkKLSAgY2xpZW50ID0gc3RvcmFnZS5TdG9yYWdlLkNsaWVudChwcm90b2NvbCkKLSAgdHJhbnNwb3J0Lm9wZW4oKQotCi0gIGlmIGluY3I6Ci0gICAgY2xpZW50LmluY3IoaW5jcikKLSAgICB0aW1lLnNsZWVwKDAuMDUpCi0gIGVsc2U6Ci0gICAgdmFsdWUgPSBjbGllbnQuZ2V0KCkKLSAgICBwcmludCB2YWx1ZQorICAgICAgICBjbGllbnQuaW5jcihpbmNyKQorICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCisgICAgZWxzZToKKyAgICAgICAgdmFsdWUgPSBjbGllbnQuZ2V0KCkKKyAgICAgICAgcHJpbnQodmFsdWUpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgbWFpbihzeXMuYXJndikKKyAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcAppbmRleCA4ZmU2OWRhLi5kNDY1YmZmIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXJlY2VpdmVyLmNwcApAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJUWm1xU2VydmVyLmgiCiAjaW5jbHVkZSAiU3RvcmFnZS5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFTZXJ2ZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xTXVsdGlTZXJ2ZXI7CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKaW5kZXggNmIwZWVmMS4uNWMwODZhMSAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcApAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlICJUWm1xQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFnZS5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUWm1xQ2xpZW50OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcCBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcAppbmRleCBjNjI0YjBkLi5lNmYxYjIwIDEwMDY0NAotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCkBAIC0yLDcgKzIsNyBAQAogI2luY2x1ZGUgIlRabXFTZXJ2ZXIuaCIKICNpbmNsdWRlICJTdG9yYWdlLmgiCiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFNdWx0aVNlcnZlcjsKQEAgLTMzLDcgKzMzLDcgQEAKIAogICB6bXE6OmNvbnRleHRfdCBjdHgoMSk7CiAgIFRabXFTZXJ2ZXIgcmVxcmVwX3NlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MCIsIFpNUV9SRVApOwotICBUWm1xU2VydmVyIG9uZXdheV9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCBaTVFfVVBTVFJFQU0pOworICBUWm1xU2VydmVyIG9uZXdheV9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCBaTVFfUFVMTCk7CiAgIFRabXFNdWx0aVNlcnZlciBtdWx0aXNlcnZlcjsKICAgbXVsdGlzZXJ2ZXIuc2VydmVycygpLnB1c2hfYmFjaygmcmVxcmVwX3NlcnZlcik7CiAgIG11bHRpc2VydmVyLnNlcnZlcnMoKS5wdXNoX2JhY2soJm9uZXdheV9zZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIucHkgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQppbmRleCA1NzY3YjcxLi5kODliMzdiIDEwMDc1NQotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5weQpAQCAtNiwyOCArNiwyOCBAQAogCiAKIGNsYXNzIFN0b3JhZ2VIYW5kbGVyKHN0b3JhZ2UuU3RvcmFnZS5JZmFjZSk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLnZhbHVlID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IDAKIAotICBkZWYgaW5jcihzZWxmLCBhbW91bnQpOgotICAgIHNlbGYudmFsdWUgKz0gYW1vdW50CisgICAgZGVmIGluY3Ioc2VsZiwgYW1vdW50KToKKyAgICAgICAgc2VsZi52YWx1ZSArPSBhbW91bnQKIAotICBkZWYgZ2V0KHNlbGYpOgotICAgIHJldHVybiBzZWxmLnZhbHVlCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKIAogCiBkZWYgbWFpbigpOgotICBoYW5kbGVyID0gU3RvcmFnZUhhbmRsZXIoKQotICBwcm9jZXNzb3IgPSBzdG9yYWdlLlN0b3JhZ2UuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgaGFuZGxlciA9IFN0b3JhZ2VIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBzdG9yYWdlLlN0b3JhZ2UuUHJvY2Vzc29yKGhhbmRsZXIpCiAKLSAgY3R4ID0gem1xLkNvbnRleHQoKQotICByZXFyZXBfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgem1xLlJFUCkKLSAgb25ld2F5X3NlcnZlciA9IFRabXFTZXJ2ZXIuVFptcVNlcnZlcihwcm9jZXNzb3IsIGN0eCwgInRjcDovLzAuMC4wLjA6OTA5MSIsIHptcS5VUFNUUkVBTSkKLSAgbXVsdGlzZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFNdWx0aVNlcnZlcigpCi0gIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKHJlcXJlcF9zZXJ2ZXIpCi0gIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKG9uZXdheV9zZXJ2ZXIpCi0gIG11bHRpc2VydmVyLnNlcnZlRm9yZXZlcigpCisgICAgY3R4ID0gem1xLkNvbnRleHQoKQorICAgIHJlcXJlcF9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCB6bXEuUkVQKQorICAgIG9uZXdheV9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCB6bXEuUFVMTCkKKyAgICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKKyAgICBtdWx0aXNlcnZlci5zZXJ2ZXJzLmFwcGVuZChyZXFyZXBfc2VydmVyKQorICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKG9uZXdheV9zZXJ2ZXIpCisgICAgbXVsdGlzZXJ2ZXIuc2VydmVGb3JldmVyKCkKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICBtYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2RlYmlhbi9SRUFETUUubWQgYi9kZWJpYW4vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmZlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDEgQEAKKyMjIFNvbWUgdGlwcyBvbiBEZWJpYW4gUGFja2FnaW5nCisKKy0gRGViaWFuIE5ldyBNYWludGFpbmVycycgR3VpZGUgW2h0dHA6Ly93d3cuZGViaWFuLm9yZy9kb2MvZGViaWFuLXBvbGljeS9dCistIERlYmlhbiBQb2xpY3kgTWFudWFsIFtodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jL21hbnVhbHMvbWFpbnQtZ3VpZGUvXQorLSBNYWNoaW5lLXJlYWRhYmxlIGRlYmlhbi9jb3B5cmlnaHQgZmlsZSBbaHR0cDovL2RlcC5kZWJpYW4ubmV0L2RlcHMvZGVwNS9dCistIERlYlNyYyAzLjAgZ3VpZGVsaW5lcyBbaHR0cHM6Ly93aWtpLmRlYmlhbi5vcmcvUHJvamVjdHMvRGViU3JjMy4wXQorCisKKyMjIEJ1aWxkIHVzaW5nIGRwa2ctYnVpbGRwYWNrYWdlOgorCitgYGBiYXNoCiskIGRwa2ctYnVpbGRwYWNrYWdlIC1kIC10YworICAtZCAgICMgZG8gbm90IGNoZWNrIGJ1aWxkIGRlcGVuZGVuY2llcyBhbmQgY29uZmxpY3RzLgorICAtdGMgICMgY2xlYW4gc291cmNlIHRyZWUgd2hlbiBmaW5pc2hlZC4KK2BgYAorCisKKyMjIFVwZGF0ZSBjaGFuZ2Vsb2c6CisKK2BgYGJhc2gKKyQgZGF0ZSAtUgorYGBgCisKK09uZSBjYW4gYWxzbyBpbnN0YWxsIGBkZXZzY3JpcHRzYCBwYWNrYWdlIGFuZCBydW46CisKK2BgYGJhc2gKKyQgZGNoIC1pCitgYGAKKworCisjIyBDaGVjayBwYWNrYWdlczoKKworYGBgYmFzaAorJCBkcGtnIC1jICouZGViCiskIGxpbnRpYW4gKi5kZWIKK2BgYAorCisKKyMjIFRPRE8KKworTWFrZSBpdCBwZXJmZWN0IQpkaWZmIC0tZ2l0IGEvZGViaWFuL2NoYW5nZWxvZyBiL2RlYmlhbi9jaGFuZ2Vsb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliNWYyMAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTAsMCArMSw4MyBAQAordGhyaWZ0ICgwLjEyLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjEyLjAKKworIC0tIEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiAgV2VkLCAyOCBEZWMgMjAxOCAxMjowMDowMCAtMDUwMAorCit0aHJpZnQgKDAuMTEuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTEuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAwNyBEZWMgMjAxNyAyMDowNzowMCAtMDUwMAorCit0aHJpZnQgKDAuMTAuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTAuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAwMyBKYW4gMjAxNyAxNjo1MjowMCAtMDUwMAorCit0aHJpZnQgKDAuOS4zKSBzdGFibGU7IHVyZ2VuY3k9bG93CisKKyAgKiB1cGRhdGUgdG8gMC45LjMKKworIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMTEgT2N0IDIwMTUgMTc6MjI6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjkuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuOS4wCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDEwIE9jdCAyMDEyIDEyOjAwOjAwIC0wNTAwCisKK3RocmlmdCAoMC43LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjcuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgVHVlLCAxMCBBdWcgMjAxMSAxNzowMTo1MyAtMDUwMAorCit0aHJpZnQgKDAuNy4wLWRldjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKyAgKiBhZGRlZCBnbGliCisgICogZml4IGxvY2F0aW9uIG9mIGxpYnRocmlmdC5qYXIKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgVHVlLCAxMiBBcHIgMjAxMSAyMTo0MToxOCArMDIwMAorCit0aHJpZnQgKDAuNi4wLWRldjEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB2ZXJzaW9uIGZpZWxkCisgICogYWRkZWQgZGViaWFuIGZvbGRlciB0byB0aHJpZnQvY29udHJpYgorICAqIGNoYW5nZWQgYSBmZXcgZGV0YWlscyBpbiBjb250cm9sIGZpbGUKKyAgKiB1cGRhdGUgY29weXJpZ2h0IGZpbGUKKworIC0tIFJvZ2VyIE1laWVyIDxyb2dlckBhcGFjaGUub3JnPiAgVHVlLCAxNCBEZWMgMjAxMCAxMjoxMjozMyAtMDgwMAorCit0aHJpZnQgKDAuNS4wK25tdTIpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KKyAgKiBNZXJnZWQgVEhSSUZULTcxX3Y5LnBhdGNoIHRvIHNraXAgLi9ib290c3RyYXAuc2ggaWYgbm90IGV4aXN0cy4KKyAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL2F0dGFjaG1lbnQvMTI0NjUzNjAvVEhSSUZULTcxX3Y5LnBhdGNoCisKKyAtLSBZYW1hc2hpdGEgWXV1IDx5YW1hc2hpdGFAZ2Vpc2hhdG9reW8uY29tPiAgVHVlLCAwNyBEZWMgMjAxMCAxNTowMDo1NSArMDkwMAorCit0aHJpZnQgKDAuNS4wK25tdTEpIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIE5vbi1tYWludGFpbmVyIHVwbG9hZC4KKyAgKiBJbXBvcnRlZCBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciBwaHA1LXRocmlmdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW1wbGVnZW8vdGhyaWZ0LgorCisgLS0gWWFtYXNoaXRhIFl1dSA8eWFtYXNoaXRhQGdlaXNoYXRva3lvLmNvbT4gIFR1ZSwgMDcgRGVjIDIwMTAgMDE6MDA6MTcgKzA5MDAKKwordGhyaWZ0ICgwLjUuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuNS4wCisKKyAtLSBSb2dlciBNZWllciA8cm9nZXJAYXBhY2hlLm9yZz4gIEZyaSwgMDggT2N0IDIwMTAgMTE6MjM6NTMgKzAyMDAKKwordGhyaWZ0ICgwLjQuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuNC4wCisKKyAtLSBSb2dlciBNZWllciA8cm9nZXJAYnVmZmVyb3ZlcmZsb3cuY2g+ICBTdW4sIDIyIEF1ZyAyMDEwIDIxOjI2OjAwICswMTAwCisKK3RocmlmdCAoMC4yMDA4LjEyLjMwfjguMDQpIGhhcmR5OyB1cmdlbmN5PWxvdworCisgICogSW5pdGlhbCByZWxlYXNlLgorCisgLS0gRXN0ZXZlIEZlcm5hbmRleiA8ZXN0ZXZlQGZsdWlkaW5mby5jb20+ICBUaHUsIDE1IEphbiAyMDA5IDExOjM0OjI0ICswMTAwCmRpZmYgLS1naXQgYS9kZWJpYW4vY29tcGF0IGIvZGViaWFuL2NvbXBhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzYzNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NvbXBhdApAQCAtMCwwICsxIEBACis5CmRpZmYgLS1naXQgYS9kZWJpYW4vY29udHJvbCBiL2RlYmlhbi9jb250cm9sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MThhMzcKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vY29udHJvbApAQCAtMCwwICsxLDIwMiBAQAorU291cmNlOiB0aHJpZnQKK1NlY3Rpb246IGRldmVsCitQcmlvcml0eTogZXh0cmEKK0J1aWxkLURlcGVuZHM6IGRlYmhlbHBlciAoPj0gOSksIGJ1aWxkLWVzc2VudGlhbCwgbW9uby1tY3MsIHB5dGhvbi1kZXYsIGFudCwKKyAgICBtb25vLWRldmVsLCAgbGlibW9uby1zeXN0ZW0td2ViNC4wLWNpbCwgZXJsYW5nLWJhc2UsIHJ1YnktZGV2IHwgcnVieTEuOS4xLWRldiwgcnVieS1idW5kbGVyICxhdXRvY29uZiwgYXV0b21ha2UsCisgICAgcGtnLWNvbmZpZywgbGlidG9vbCwgYmlzb24sIGZsZXgsIGxpYmJvb3N0LWRldiB8IGxpYmJvb3N0MS41My1kZXYgfCBsaWJib29zdDEuNjMtYWxsLWRldiwKKyAgICBweXRob24tYWxsLCBweXRob24tc2V0dXB0b29scywgcHl0aG9uLWFsbC1kZXYsIHB5dGhvbi1hbGwtZGJnLAorICAgIHB5dGhvbjMtYWxsLCBweXRob24zLXNldHVwdG9vbHMsIHB5dGhvbjMtYWxsLWRldiwgcHl0aG9uMy1hbGwtZGJnLAorICAgIG9wZW5qZGstNy1qZGsgfCBvcGVuamRrLTgtamRrIHwgZGVmYXVsdC1qZGssCisgICAgbGliYm9vc3QtdGVzdC1kZXYgfCBsaWJib29zdC10ZXN0MS41My1kZXYgfCBsaWJib29zdC10ZXN0MS42My1kZXYsIGxpYmV2ZW50LWRldiwgbGlic3NsLWRldiwgcGVybCAoPj0gNS44LjAtNyksCisgICAgcGhwICg+PSA1KSwgcGhwLWRldiAoPj0gNSksIGxpYmdsaWIyLjAtZGV2LCBxdGNob29zZXIsIHF0YmFzZTUtZGV2LXRvb2xzCitNYWludGFpbmVyOiBUaHJpZnQgRGV2ZWxvcGVyJ3MgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvCitWY3MtR2l0OiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKK1Zjcy1Ccm93c2VyOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorU3RhbmRhcmRzLVZlcnNpb246IDMuOS43CitYLVB5dGhvbi1WZXJzaW9uOiA+PSAyLjYKK1gtUHl0aG9uMy1WZXJzaW9uOiA+PSAzLjMKKworUGFja2FnZTogdGhyaWZ0LWNvbXBpbGVyCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IENvbXBpbGVyIGZvciBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlcworIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBUaHJpZnQgY29tcGlsZXIgdGhhdCBpcyB1c2VkIGZvciB0cmFuc2xhdGluZworIGZyb20gLnRocmlmdCBmaWxlcyAoY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbnMpIHRvIHRoZSBsYW5ndWFnZSBiaW5kaW5nCisgZm9yIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLgorCitQYWNrYWdlOiBweXRob24tdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogcHl0aG9uCitEZXBlbmRzOiAke3B5dGhvbjpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uLXNpeAorUmVjb21tZW5kczogcHl0aG9uLXR3aXN0ZWQtd2ViLCBweXRob24tYmFja3BvcnRzLnNzbC1tYXRjaC1ob3N0bmFtZSwgcHl0aG9uLWlwYWRkcmVzcworUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChQeXRob24gMikKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gUHl0aG9uCisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKyAuCisgVGhpcyBwYWNrYWdlIGluc3RhbGxzIHRoZSBsaWJyYXJ5IGZvciBQeXRob24gMi4KKworUGFja2FnZTogcHl0aG9uLXRocmlmdC1kYmcKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBkZWJ1ZworRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uLXRocmlmdCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIHB5dGhvbi1hbGwtZGJnCitQcm92aWRlczogJHtweXRob246UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUHl0aG9uIGJpbmRpbmdzIGZvciBUaHJpZnQgKGRlYnVnIHZlcnNpb24pCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IHdpdGggZGVidWdnaW5nIHN5bWJvbHMuCisgWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0IHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyCisgZGVmaW5pdGlvbiB0byBQeXRob24gY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cKKyB5b3UgdG8gdXNlIHRob3NlIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogcHl0aG9uMy10aHJpZnQKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBweXRob24KK0RlcGVuZHM6ICR7cHl0aG9uMzpEZXBlbmRzfSwgJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgcHl0aG9uMy1zaXgKK1JlY29tbWVuZHM6IHB5dGhvbjMtdHdpc3RlZC13ZWIKK1Byb3ZpZGVzOiAke3B5dGhvbjpQcm92aWRlc30KK0Rlc2NyaXB0aW9uOiBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCAoUHl0aG9uIDMpCisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFB5dGhvbgorIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhvc2UKKyBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisgLgorIFRoaXMgcGFja2FnZSBpbnN0YWxscyB0aGUgbGlicmFyeSBmb3IgUHl0aG9uIDMuCisKK1BhY2thZ2U6IHB5dGhvbjMtdGhyaWZ0LWRiZworQXJjaGl0ZWN0dXJlOiBhbnkKK1NlY3Rpb246IGRlYnVnCitEZXBlbmRzOiAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9LCBweXRob24zLXRocmlmdCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIHB5dGhvbjMtYWxsLWRiZworUHJvdmlkZXM6ICR7cHl0aG9uOlByb3ZpZGVzfQorRGVzY3JpcHRpb246IFB5dGhvbiBiaW5kaW5ncyBmb3IgVGhyaWZ0IChkZWJ1ZyB2ZXJzaW9uKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBQeXRob24gYmluZGluZ3MgZm9yIFRocmlmdCB3aXRoIGRlYnVnZ2luZyBzeW1ib2xzLgorIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdCB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91cgorIGRlZmluaXRpb24gdG8gUHl0aG9uIGNsYXNzZXMsIGFuZCB0aGVuIHRoZSBtb2R1bGVzIGluIHRoaXMgcGFja2FnZSB3aWxsIGFsbG93CisgeW91IHRvIHVzZSB0aG9zZSBjbGFzc2VzIGluIHlvdXIgcHJvZ3JhbXMuCisKK1BhY2thZ2U6IHJ1YnktdGhyaWZ0CitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogbGlicworRGVwZW5kczogcnVieSB8IHJ1YnktaW50ZXJwcmV0ZXIsICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30KK1Byb3ZpZGVzOiBsaWJ0aHJpZnQtcnVieQorUmVwbGFjZXM6IGxpYnRocmlmdC1ydWJ5CitCcmVha3M6IGxpYnRocmlmdC1ydWJ5CitEZXNjcmlwdGlvbjogUnVieSBiaW5kaW5ncyBmb3IgVGhyaWZ0CisgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcworIGRldmVsb3BtZW50LiBJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvCisgYnVpbGQgc2VydmljZXMgdGhhdCB3b3JrIGVmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5LgorIC4KKyBUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIFJ1YnkgYmluZGluZ3MgZm9yIFRocmlmdC4gWW91IHdpbGwgbmVlZCB0aGUgdGhyaWZ0CisgdG9vbCAoaW4gdGhlIHRocmlmdC1jb21waWxlciBwYWNrYWdlKSB0byBjb21waWxlIHlvdXIgZGVmaW5pdGlvbiB0byBSdWJ5CisgY2xhc3NlcywgYW5kIHRoZW4gdGhlIG1vZHVsZXMgaW4gdGhpcyBwYWNrYWdlIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aG9zZQorIGNsYXNzZXMgaW4geW91ciBwcm9ncmFtcy4KKworUGFja2FnZTogbGlidGhyaWZ0LWphdmEKK0FyY2hpdGVjdHVyZTogYWxsCitTZWN0aW9uOiBqYXZhCitEZXBlbmRzOiAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBKYXZhIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgSmF2YSBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIEphdmEKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtY2lsCitBcmNoaXRlY3R1cmU6IGFsbAorU2VjdGlvbjogY2xpLW1vbm8KK0RlcGVuZHM6IGNsaS1jb21tb24sIGxpYm1vbm8tY29ybGliNC4wLWNpbCAoPj0gMi4xMCkgfCBsaWJtb25vLWNvcmxpYjQuNS1jaWwgKD49My4yKSwgbGlibW9uby1zeXN0ZW00LjAtY2lsICg+PSAyLjEwKSwKKyAgICBsaWJtb25vLXN5c3RlbS13ZWI0LjAtY2lsICg+PSAyLjEwKSwgJHttaXNjOkRlcGVuZHN9CitEZXNjcmlwdGlvbjogQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgQ0xJIGJpbmRpbmdzIGZvciBUaHJpZnQuIFlvdSB3aWxsIG5lZWQgdGhlIHRocmlmdAorIHRvb2wgKGluIHRoZSB0aHJpZnQtY29tcGlsZXIgcGFja2FnZSkgdG8gY29tcGlsZSB5b3VyIGRlZmluaXRpb24gdG8gQyMKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQtcGVybAorQXJjaGl0ZWN0dXJlOiBhbGwKK1NlY3Rpb246IHBlcmwKK0RlcGVuZHM6IHBlcmwgKD49IDUuOC4wLTcpLCAke21pc2M6RGVwZW5kc30KK0Rlc2NyaXB0aW9uOiBQZXJsIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUGVybCBiaW5kaW5ncyBmb3IgVGhyaWZ0LiBZb3Ugd2lsbCBuZWVkIHRoZSB0aHJpZnQKKyB0b29sIChpbiB0aGUgdGhyaWZ0LWNvbXBpbGVyIHBhY2thZ2UpIHRvIGNvbXBpbGUgeW91ciBkZWZpbml0aW9uIHRvIFBlcmwKKyBjbGFzc2VzLCBhbmQgdGhlbiB0aGUgbW9kdWxlcyBpbiB0aGlzIHBhY2thZ2Ugd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRob3NlCisgY2xhc3NlcyBpbiB5b3VyIHByb2dyYW1zLgorCitQYWNrYWdlOiBsaWJ0aHJpZnQwCitBcmNoaXRlY3R1cmU6IGFueQorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfQorRGVzY3JpcHRpb246IFRocmlmdCBDKysgbGlicmFyeQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBydW50aW1lIGxpYnJhcmllcyBuZWVkZWQgZm9yIEMrKyBhcHBsaWNhdGlvbnMKKyB1c2luZyBUaHJpZnQuCisKK1BhY2thZ2U6IGxpYnRocmlmdDAtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IGRlYnVnIHN5bWJvbHMKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGVidWcgc3ltYm9scyBmb3IgdGhlIFRocmlmdCBDKysgcnVudGltZSBsaWJyYXJpZXMuCisKK1BhY2thZ2U6IGxpYnRocmlmdC1kZXYKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBsaWJkZXZlbAorRGVwZW5kczogJHtzaGxpYnM6RGVwZW5kc30sICR7bWlzYzpEZXBlbmRzfSwgbGlidGhyaWZ0MCAoPSAke2JpbmFyeTpWZXJzaW9ufSksIGxpYmdsaWIyLjAtZGV2CitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IChkZXZlbG9wbWVudCBoZWFkZXJzKQorIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMKKyBkZXZlbG9wbWVudC4gSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0bworIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseS4KKyAuCisgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZXZlbG9wbWVudCBsaWJyYXJpZXMgcmVxdWlyZWQgZm9yIHdyaXRpbmcgQysrCisgYXBwbGljYXRpb25zIHVzaW5nIFRocmlmdC4KKworUGFja2FnZTogcGhwNS10aHJpZnQKK0FyY2hpdGVjdHVyZTogYW55CitTZWN0aW9uOiBwaHAKK0RlcGVuZHM6ICR7cGhwOkRlcGVuZHN9LCAke3NobGliczpEZXBlbmRzfSwgJHttaXNjOkRlcGVuZHN9CitQcm92aWRlczogJHtwaHA6UHJvdmlkZXN9CitEZXNjcmlwdGlvbjogUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgUEhQIGJpbmRpbmdzIGZvciBUaHJpZnQuCmRpZmYgLS1naXQgYS9kZWJpYW4vY29weXJpZ2h0IGIvZGViaWFuL2NvcHlyaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTA2NDNjCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2NvcHlyaWdodApAQCAtMCwwICsxLDEyOSBAQAorVGhpcyBwYWNrYWdlIHdhcyBkZWJpYW5pemVkIGJ5IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPi4KKworCitUaGlzIHBhY2thZ2UgYW5kIHRoZSBEZWJpYW4gcGFja2FnaW5nIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwKK3NlZSBgL3Vzci9zaGFyZS9jb21tb24tbGljZW5zZXMvQXBhY2hlLTIuMCcuCisKK1RoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gd2FzIGNvcGllZCBmcm9tIEFwYWNoZSBUaHJpZnQgTElDRU5TRSBmaWxlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU09GVFdBUkUgRElTVFJJQlVURUQgV0lUSCBUSFJJRlQ6CisKK1RoZSBBcGFjaGUgVGhyaWZ0IHNvZnR3YXJlIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN1YmNvbXBvbmVudHMgd2l0aAorc2VwYXJhdGUgY29weXJpZ2h0IG5vdGljZXMgYW5kIGxpY2Vuc2UgdGVybXMuIFlvdXIgdXNlIG9mIHRoZSBzb3VyY2UKK2NvZGUgZm9yIHRoZSB0aGVzZSBzdWJjb21wb25lbnRzIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2VzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUG9ydGlvbnMgb2YgdGhlIGZvbGxvd2luZyBmaWxlcyBhcmUgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlOgorCisgIGxpYi9lcmwvc3JjL01ha2VmaWxlLmFtCisKK1BsZWFzZSBzZWUgZG9jL290cC1iYXNlLWxpY2Vuc2UudHh0IGZvciB0aGUgZnVsbCB0ZXJtcyBvZiB0aGlzIGxpY2Vuc2UuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBmb2xsb3dpbmcgZmlsZXMgY29udGFpbiBzb21lIHBvcnRpb25zIG9mIGNvZGUgY29udHJpYnV0ZWQgdW5kZXIKK3RoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZSAoc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0KSwgYW5kIHJlbGljZW5zZWQKK3VuZGVyIHRoZSBBcGFjaGUgMi4wIExpY2Vuc2U6CisKKyAgY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYworICBjb21waWxlci9jcHAvc3JjL2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKKyAgY29tcGlsZXIvY3BwL3NyYy9tYWluLmNjCisgIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9maWVsZC5oCisgIGNvbXBpbGVyL2NwcC9zcmMvcGFyc2UvdF9wcm9ncmFtLmgKKyAgY29tcGlsZXIvY3BwL3NyYy9wbGF0Zm9ybS5oCisgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0bC5sbAorICBjb21waWxlci9jcHAvc3JjL3RocmlmdHkueXkKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcworICBsaWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCisgIGxpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKKyAgbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MKKyAgbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKKyAgbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKKyAgbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCisgIGxpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcworICBsaWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisgIGxpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKyAgbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworICBsaWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKKyAgbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworICBsaWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCisgIGxpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qCisgIGxpYi9yYi9saWIvdGhyaWZ0LnJiCisgIGxpYi9zdC9SRUFETUUKKyAgbGliL3N0L3RocmlmdC5zdAorICB0ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAorICB0ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorICB0ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGFjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBhbmQgY29udHJpYi9mYjMwMy9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgY29tcG9uZW50czoKKworIyAgIENvcHlyaWdodCAoYykgMjAwNyBUaG9tYXMgUG9yc2NoYmVyZyA8dGhvbWFzQHJhbmRzcHJpbmdlci5kZT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQKKyMgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQKKyMgICB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0ZvciB0aGUgY29tcGlsZXIvY3BwL3NyYy9tZDUuW2NoXSBjb21wb25lbnRzOgorCisvKgorICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgQWxhZGRpbiBFbnRlcnByaXNlcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorCisgIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisgIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKworICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorICAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyAgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisgIEwuIFBldGVyIERldXRzY2gKKyAgZ2hvc3RAYWxhZGRpbi5jb20KKworICovCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBsaWIvcmIvc2V0dXAucmI6IENvcHlyaWdodCAoYykgMjAwMC0yMDA1IE1pbmVybyBBb2tpLAorbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYW5kIGxpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBjb21wb25lbnRzOgorICAgICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDA3ICBNYXJrdXMgTW90dGwKKworTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMi4xCisoc2VlIGRvYy9sZ3BsLTIuMS50eHQgZm9yIHRoZSBmdWxsIHRlcm1zIG9mIHRoaXMgbGljZW5zZSkKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL2RpcnMgYi9kZWJpYW4vZGlycwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi9kZWJpYW4vZGlycwpyZW5hbWUgdG8gZGViaWFuL2RpcnMKZGlmZiAtLWdpdCBhL2RlYmlhbi9kb2NzIGIvZGViaWFuL2RvY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzYmY4NgotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbi9kb2NzCkBAIC0wLDAgKzEgQEAKK1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsIGIvZGViaWFuL2xpYnRocmlmdC1kZXYuaW5zdGFsbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi9kZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsCnJlbmFtZSB0byBkZWJpYW4vbGlidGhyaWZ0LWRldi5pbnN0YWxsCmRpZmYgLS1naXQgYS9kZWJpYW4vbGlidGhyaWZ0MC5pbnN0YWxsIGIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzc0ZWZjCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL2xpYnRocmlmdDAuaW5zdGFsbApAQCAtMCwwICsxLDUgQEAKK3Vzci9saWIvbGlidGhyaWZ0LnNvKgordXNyL2xpYi9saWJ0aHJpZnQtKi5zbyoKK3Vzci9saWIvbGlidGhyaWZ0bmIqLnNvKgordXNyL2xpYi9saWJ0aHJpZnRxdCouc28qCit1c3IvbGliL2xpYnRocmlmdHoqLnNvKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vcGhwNS10aHJpZnQuZGlycyBiL2RlYmlhbi9waHA1LXRocmlmdC5kaXJzCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb250cmliL2RlYmlhbi9waHA1LXRocmlmdC5kaXJzCnJlbmFtZSB0byBkZWJpYW4vcGhwNS10aHJpZnQuZGlycwpkaWZmIC0tZ2l0IGEvZGViaWFuL3J1bGVzIGIvZGViaWFuL3J1bGVzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliNDM2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW4vcnVsZXMKQEAgLTAsMCArMSwyMjggQEAKKyMhL3Vzci9iaW4vbWFrZSAtZgorIyAtKi0gbWFrZWZpbGUgLSotCisjIFNhbXBsZSBkZWJpYW4vcnVsZXMgdGhhdCB1c2VzIGRlYmhlbHBlci4KKyMKKyMgVGhpcyBmaWxlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgSm9leSBIZXNzIGFuZCBDcmFpZyBTbWFsbC4KKyMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IGRoLW1ha2UgaW50byBhCisjIGRoLW1ha2Ugb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKyMgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgQ3JhaWcgU21hbGwgaW4gdmVyc2lvbiAwLjM3IG9mIGRoLW1ha2UuCisjCisjIE1vZGlmaWVkIHRvIG1ha2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciBhIG11bHRpLWJpbmFyeSBwYWNrYWdlIHdpdGggc2VwYXJhdGVkCisjIGJ1aWxkLWFyY2ggYW5kIGJ1aWxkLWluZGVwIHRhcmdldHMgIGJ5IEJpbGwgQWxsb21iZXJ0IDIwMDEKKworIyBVbmNvbW1lbnQgdGhpcyB0byB0dXJuIG9uIHZlcmJvc2UgbW9kZS4KKyNleHBvcnQgREhfVkVSQk9TRT0xCisKKyMgVGhpcyBoYXMgdG8gYmUgZXhwb3J0ZWQgdG8gbWFrZSBzb21lIG1hZ2ljIGJlbG93IHdvcmsuCitleHBvcnQgREhfT1BUSU9OUworCitQWVZFUlMgOj0gJChzaGVsbCBweXZlcnNpb25zIC1yKQorCitleHBvcnQgQ1BQRkxBR1M6PSQoc2hlbGwgZHBrZy1idWlsZGZsYWdzIC0tZ2V0IENQUEZMQUdTKQorZXhwb3J0IENGTEFHUzo9JChzaGVsbCBkcGtnLWJ1aWxkZmxhZ3MgLS1nZXQgQ0ZMQUdTKQorZXhwb3J0IENYWEZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBDWFhGTEFHUykKK2V4cG9ydCBMREZMQUdTOj0kKHNoZWxsIGRwa2ctYnVpbGRmbGFncyAtLWdldCBMREZMQUdTKQorCitjb25maWd1cmU6IGNvbmZpZ3VyZS1zdGFtcAorY29uZmlndXJlLXN0YW1wOgorCWRoX3Rlc3RkaXIKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlLgorCWlmIFsgLWYgYm9vdHN0cmFwLnNoIF07IHRoZW4gJChDVVJESVIpL2Jvb3RzdHJhcC5zaDsgZmkKKwkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IgLS1lbmFibGUtcGx1Z2luPW5vCisKKwl0b3VjaCBjb25maWd1cmUtc3RhbXAKKworCisjQXJjaGl0ZWN0dXJlCitidWlsZDogYnVpbGQtYXJjaCBidWlsZC1pbmRlcAorCSMgVGVzdHMgZGlzYWJsZWQKKwkjICQoTUFLRSkgLUMgdGVzdCBjaGVjaworCitidWlsZC1hcmNoOiBidWlsZC1hcmNoLXN0YW1wCiskKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdCBidWlsZC1hcmNoLXN0YW1wOiBjb25maWd1cmUtc3RhbXAKKworCSMgQ29tcGlsZSBjb21waWxlcgorCSQoTUFLRSkgLUMgJChDVVJESVIpL2NvbXBpbGVyL2NwcAorCisJIyBDb21waWxlIEMrKyBsaWJyYXJ5CisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NwcAorCisJIyBDb21waWxlIEMgKGdsaWIpIGxpYnJhcnkKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY19nbGliCisKKwkjIFB5dGhvbiBsaWJyYXJ5CisJY2QgJChDVVJESVIpL2xpYi9weSAmJiBcCisgICAgZm9yIHB5IGluICQoUFlWRVJTKTsgZG8gIFwKKyAgICAgICAgJCRweSBzZXR1cC5weSBidWlsZDsgXAorICAgICAgICAkJHB5LWRiZyBzZXR1cC5weSBidWlsZDsgXAorICAgIGRvbmUKKworCSMgUEhQCisJY2QgJChDVVJESVIpL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wgJiYgXAorCQlwaHBpemUgJiYgXAorCQkuL2NvbmZpZ3VyZSAmJiAkKE1BS0UpCisKKwl0b3VjaCAkQAorCitidWlsZC1pbmRlcDogYnVpbGQtaW5kZXAtc3RhbXAKK2J1aWxkLWluZGVwLXN0YW1wOiBjb25maWd1cmUtc3RhbXAgJChDVVJESVIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29tcGlsZSB0aGUgaW5kZXAgcGFydCBvZiB0aGUgcGFja2FnZS4KKwkjJChNQUtFKSBkb2MKKworCSMgSmF2YQorCWNkICQoQ1VSRElSKS9saWIvamF2YSAmJiBcCisJCS4vZ3JhZGxldyAtLW5vLWRhZW1vbiAtUHJlbGVhc2U9dHJ1ZSBqYXIKKworCSMgQyMKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY3NoYXJwCisKKwkjIFJ1YnkKKwkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvcmIKKworCSMgUGVybAorCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9wZXJsIElOU1RBTExESVJTPXZlbmRvcgorCisJdG91Y2ggJEAKKworY2xlYW46CisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJcm0gLWYgYnVpbGQtYXJjaC1zdGFtcCBidWlsZC1pbmRlcC1zdGFtcCBjb25maWd1cmUtc3RhbXAKKworCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgcHl0aG9uIHNldHVwLnB5IGNsZWFuIC0tYWxsCisKKwkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGNsZWFuIHVwIGFmdGVyIHRoZSBidWlsZCBwcm9jZXNzLgorCS0kKE1BS0UpIGNsZWFuCisKKwkkKENVUkRJUikvY2xlYW51cC5zaAorCisJZGhfY2xlYW4KKworaW5zdGFsbDogaW5zdGFsbC1pbmRlcCBpbnN0YWxsLWFyY2gKK2luc3RhbGwtaW5kZXA6CisJZGhfdGVzdGRpcgorCWRoX3Rlc3Ryb290CisJZGhfcHJlcCAtaQorCWRoX2luc3RhbGxkaXJzIC1pCisKKwkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGluc3RhbGwgdGhlIGluZGVwIHBhcnQgb2YgdGhlIHBhY2thZ2UgaW50bworCSMgZGViaWFuLzxwYWNrYWdlPi1kb2MuCisJI0lOU1RBTExET0MjCisKKwkjIEphdmEKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1qYXZhL3Vzci9zaGFyZS9qYXZhLyAmJiBcCisJY3AgJChDVVJESVIpL2xpYi9qYXZhL2J1aWxkL2xpYnMvbGlidGhyaWZ0Ki5qYXIgXAorCQkkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1qYXZhL3Vzci9zaGFyZS9qYXZhLworCisJIyBSdWJ5CisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEgJiYgXAorCWNwICQoQ1VSRElSKS9saWIvcmIvbGliL3RocmlmdC5yYiBcCisJCSQoQ1VSRElSKS9kZWJpYW4vcnVieS10aHJpZnQvdXNyL2xpYi9ydWJ5LzEuOS4xCisJY3AgLXIgJChDVVJESVIpL2xpYi9yYi9saWIvdGhyaWZ0IFwKKwkJJChDVVJESVIpL2RlYmlhbi9ydWJ5LXRocmlmdC91c3IvbGliL3J1YnkvMS45LjEKKworCSMgQyMKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1jaWwvdXNyL2xpYi9jbGkvdGhyaWZ0LyAmJiBcCisJY3AgJChDVVJESVIpL2xpYi9jc2hhcnAvVGhyaWZ0LmRsbCBcCisJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWNpbC91c3IvbGliL2NsaS90aHJpZnQvVGhyaWZ0LmRsbAorCisJIyBQZXJsCisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwKKwlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9zaGFyZQorCW12ICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL2xvY2FsL2xpYi9wZXJsNSAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9zaGFyZQorCXJtZGlyICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL2xvY2FsL2xpYgorCXJtZGlyICQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwvdXNyL2xvY2FsCisKKwlkaF9pbnN0YWxsIC1pCisKK2luc3RhbGwtYXJjaDoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9jbGVhbiAtayAtcworCWRoX2luc3RhbGxkaXJzIC1zCisKKwkjIEFkZCBoZXJlIGNvbW1hbmRzIHRvIGluc3RhbGwgdGhlIGFyY2ggcGFydCBvZiB0aGUgcGFja2FnZSBpbnRvCisJIyBkZWJpYW4vdG1wLgorCSMkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90aHJpZnQgaW5zdGFsbAorCisJIyBDb21waWxlcgorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vdGhyaWZ0LWNvbXBpbGVyL3Vzci9iaW4gJiYgXAorCWNwICQoQ1VSRElSKS9jb21waWxlci9jcHAvdGhyaWZ0IFwKKwkJJChDVVJESVIpL2RlYmlhbi90aHJpZnQtY29tcGlsZXIvdXNyL2Jpbi90aHJpZnQgJiYgXAorCXJtZGlyICQoQ1VSRElSKS9kZWJpYW4vdGhyaWZ0LWNvbXBpbGVyL3Vzci9zYmluCisKKwkjIFB5dGhvbgorCWNkICQoQ1VSRElSKS9saWIvcHkgJiYgXAorCXB5dGhvbjIgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAmJiBcCisJcHl0aG9uMi1kYmcgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgJiYgXAorCXB5dGhvbjMgc2V0dXAucHkgaW5zdGFsbCAtLWluc3RhbGwtbGF5b3V0PWRlYiAtLW5vLWNvbXBpbGUgLS1yb290PSQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQgJiYgXAorCXB5dGhvbjMtZGJnIHNldHVwLnB5IGluc3RhbGwgLS1pbnN0YWxsLWxheW91dD1kZWIgLS1uby1jb21waWxlIC0tcm9vdD0kKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZworCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdCAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbi10aHJpZnQtZGJnIC1uYW1lICIqLnB5IiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLW5hbWUgIiouZWdnLWluZm8iIC1wcmludDAgfCB4YXJncyAtMCBybSAtcmYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7CisKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQgLW5hbWUgIioucHlbY29dIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQgLW5hbWUgIl9fcHljYWNoZV9fIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWZyCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiX19weWNhY2hlX18iIC1wcmludDAgfCB4YXJncyAtMCBybSAtZnIKKwlmaW5kICQoQ1VSRElSKS9kZWJpYW4vcHl0aG9uMy10aHJpZnQtZGJnIC1uYW1lICIqLnB5W2NvXSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiKi5weSIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisJZmluZCAkKENVUkRJUikvZGViaWFuL3B5dGhvbjMtdGhyaWZ0LWRiZyAtbmFtZSAiKi5lZ2ctaW5mbyIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZgorCWZpbmQgJChDVVJESVIpL2RlYmlhbi9weXRob24zLXRocmlmdC1kYmcgLWRlcHRoIC10eXBlIGQgLWVtcHR5IC1leGVjIHJtZGlyIHt9IFw7CisKKwkjIFBIUAorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vcGhwNS10aHJpZnQKKwljZCAkKENVUkRJUikvbGliL3BocCAmJiBcCisJCSQoTUFLRSkgREVTVERJUj0kKENVUkRJUikvZGViaWFuL3BocDUtdGhyaWZ0IGluc3RhbGwKKworCSMgQysrIGFuZCBDIChnbGliKQorCW1rZGlyIC1wICQoQ1VSRElSKS9kZWJpYW4vdG1wOyBcCisJY2QgJChDVVJESVIpL2xpYi9jcHAgJiYgXAorCQkkKE1BS0UpIERFU1RESVI9JChDVVJESVIpL2RlYmlhbi90bXAgaW5zdGFsbAorCWNkICQoQ1VSRElSKS9saWIvY19nbGliICYmIFwKKwkJJChNQUtFKSBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vdG1wIGluc3RhbGwKKworCWRoX2luc3RhbGwgLS1zb3VyY2VkaXI9ZGViaWFuL3RtcCAtcworCisKKyMgTXVzdCBub3QgZGVwZW5kIG9uIGFueXRoaW5nLiBUaGlzIGlzIHRvIGJlIGNhbGxlZCBieQorIyBiaW5hcnktYXJjaC9iaW5hcnktaW5kZXAKKyMgaW4gYW5vdGhlciAnbWFrZScgdGhyZWFkLgorYmluYXJ5LWNvbW1vbjoKKwlkaF90ZXN0ZGlyCisJZGhfdGVzdHJvb3QKKwlkaF9pbnN0YWxsY2hhbmdlbG9ncworCWRoX2luc3RhbGxkb2NzCisJZGhfaW5zdGFsbGV4YW1wbGVzCisJZGhfaW5zdGFsbG1hbgorCWRoX2xpbmsKKwlkaF9zdHJpcCAtcGxpYnRocmlmdDAgLS1kYmctcGFja2FnZT1saWJ0aHJpZnQwLWRiZworCWRoX3N0cmlwIC1wcHl0aG9uLXRocmlmdCAtLWRiZy1wYWNrYWdlPXB5dGhvbi10aHJpZnQtZGJnCisJZGhfc3RyaXAgLXBweXRob24zLXRocmlmdCAtLWRiZy1wYWNrYWdlPXB5dGhvbjMtdGhyaWZ0LWRiZworCWRoX3N0cmlwIC1wdGhyaWZ0LWNvbXBpbGVyCisJZGhfY29tcHJlc3MKKwlkaF9maXhwZXJtcworCWRoX21ha2VzaGxpYnMKKwlkaF9pbnN0YWxsZGViCisJZGhfcGVybAorCWRoX3NobGliZGVwcworCWRoX2dlbmNvbnRyb2wKKwlkaF9tZDVzdW1zCisJZGhfYnVpbGRkZWIKKyMgQnVpbGQgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IHBhY2thZ2VzIHVzaW5nIHRoZSBjb21tb24gdGFyZ2V0LgorYmluYXJ5LWluZGVwOiBidWlsZC1pbmRlcCBpbnN0YWxsLWluZGVwCisJJChNQUtFKSAtZiBkZWJpYW4vcnVsZXMgREhfT1BUSU9OUz0taSBiaW5hcnktY29tbW9uCisKKyMgQnVpbGQgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBwYWNrYWdlcyB1c2luZyB0aGUgY29tbW9uIHRhcmdldC4KK2JpbmFyeS1hcmNoOiBidWlsZC1hcmNoIGluc3RhbGwtYXJjaAorCWVjaG8gInBocDpEZXBlbmRzPXBocGFwaS0kKHNoZWxsIHBocC1jb25maWc1IC0tcGhwYXBpKSIgPiAkKENVUkRJUikvZGViaWFuL3N1YnN0dmFycworCSQoTUFLRSkgLWYgZGViaWFuL3J1bGVzIERIX09QVElPTlM9LXMgYmluYXJ5LWNvbW1vbgorCitiaW5hcnk6IGJpbmFyeS1hcmNoIGJpbmFyeS1pbmRlcAorLlBIT05ZOiBidWlsZCBjbGVhbiBiaW5hcnktaW5kZXAgYmluYXJ5LWFyY2ggYmluYXJ5IGluc3RhbGwgaW5zdGFsbC1pbmRlcCBpbnN0YWxsLWFyY2ggY29uZmlndXJlCmRpZmYgLS1naXQgYS9kZWJpYW4vc3Vic3R2YXJzIGIvZGViaWFuL3N1YnN0dmFycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQxZjJkCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFuL3N1YnN0dmFycwpAQCAtMCwwICsxIEBACitwaHA6RGVwZW5kcz1waHBhcGktMjAxMjEyMTIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZGViaWFuL3RocmlmdC1kb2MuZG9jcyBiL2RlYmlhbi90aHJpZnQtZG9jLmRvY3MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbnRyaWIvZGViaWFuL3RocmlmdC1kb2MuZG9jcwpyZW5hbWUgdG8gZGViaWFuL3RocmlmdC1kb2MuZG9jcwpkaWZmIC0tZ2l0IGEvY29udHJpYi9kZWJpYW4vdGhyaWZ0LWRvYy5pbnN0YWxsIGIvZGViaWFuL3RocmlmdC1kb2MuaW5zdGFsbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29udHJpYi9kZWJpYW4vdGhyaWZ0LWRvYy5pbnN0YWxsCnJlbmFtZSB0byBkZWJpYW4vdGhyaWZ0LWRvYy5pbnN0YWxsCmRpZmYgLS1naXQgYS9kb2FwLnJkZiBiL2RvYXAucmRmCmluZGV4IGVmZTNjZDQuLmNiNzZmYWMgMTAwNzU1Ci0tLSBhL2RvYXAucmRmCisrKyBiL2RvYXAucmRmCkBAIC0zOCwyMyArMzgsNjEgQEAKICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+QysrPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+Q29jb2E8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGFydDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkRlbHBoaTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkVybGFuZzwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkdvPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGFza2VsbDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkhheGU8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SmF2YVNjcmlwdDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPm5vZGUuanM8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgotICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5PY2FtbDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPk9DYW1sPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+UGVybDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlBIUDwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlB5dGhvbjwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CisgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlJ1c3Q8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5TbWFsbFRhbGs8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L2h0dHAiIC8+CiAgICAgPGNhdGVnb3J5IHJkZjpyZXNvdXJjZT0iaHR0cDovL3Byb2plY3RzLmFwYWNoZS5vcmcvY2F0ZWdvcnkvbGlicmFyeSIgLz4KICAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9uZXR3b3JrLWNsaWVudCIgLz4KICAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9uZXR3b3JrLXNlcnZlciIgLz4KLSAgICA8cmVsZWFzZT4KKyAgICA8cmVsZWFzZSByZGY6cGFyc2VUeXBlPSJDb2xsZWN0aW9uIj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE4LTEyLTI4PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMi4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTExLTMwPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMS4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE3LTAzLTAxPC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4xMC4wPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDE1LTA5LTI1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjM8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTQtMTEtMDU8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjkuMjwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIFRocmlmdDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAxMy0wOC0yMjwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuOS4xPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgVGhyaWZ0PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDEyLTEwLTE1PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC45LjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgogICAgICAgPFZlcnNpb24+CiAgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CiAgICAgICAgIDxjcmVhdGVkPjIwMTEtMTEtMjk8L2NyZWF0ZWQ+CkBAIC05NywxMCArMTM1LDEwIEBACiAgICAgICA8L1ZlcnNpb24+CiAgICAgPC9yZWxlYXNlPgogICAgIDxyZXBvc2l0b3J5PgotICAgICAgPFNWTlJlcG9zaXRvcnk+Ci0gICAgICAgIDxsb2NhdGlvbiByZGY6cmVzb3VyY2U9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0Ii8+Ci0gICAgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL3RocmlmdCIvPgotICAgICAgPC9TVk5SZXBvc2l0b3J5PgorICAgICAgPEdpdFJlcG9zaXRvcnk+CisgICAgICAgIDxsb2NhdGlvbiByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIvPgorICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiLz4KKyAgICAgIDwvR2l0UmVwb3NpdG9yeT4KICAgICA8L3JlcG9zaXRvcnk+CiAgICAgPG1haW50YWluZXI+CiAgICAgICA8Zm9hZjpQZXJzb24+CmRpZmYgLS1naXQgYS9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODEwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDQ4IEBACisjIFRocmlmdCBDb2RpbmcgU3RhbmRhcmRzCisKKyAgIEFueSBmb29sIGNhbiB3cml0ZSBjb2RlIHRoYXQgYSBjb21wdXRlciBjYW4gdW5kZXJzdGFuZC4KKyAgIEdvb2QgcHJvZ3JhbW1lcnMgd3JpdGUgY29kZSB0aGF0IGh1bWFucyBjYW4gdW5kZXJzdGFuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBNYXJ0aW4gRm93bGVyLCAxOTk5CisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gbWFrZSBldmVyeW9uZSdzIGxpZmUgZWFzaWVyLgorCitJdCdzIGVhc2llciB3aGVuIHlvdSByZWFkIGdvb2QsIHdlbGwgZm9ybWF0dGVkLCB3aXRoIGNsZWFybHkgZGVmaW5lZCBwdXJwb3NlLCBjb2RlLgorQnV0IHRoZSBvbmx5IHdheSB0byByZWFkIGNsZWFuIGNvZGUgaXMgdG8gd3JpdGUgc3VjaC4KKworVGhpcyBkb2N1bWVudCBjYW4gaGVscCBhY2hpZXZlIHRoYXQsIGJ1dCBrZWVwIGluIG1pbmQgdGhhdAordGhvc2UgYXJlIG5vdCBzaWx2ZXItYnVsbGV0LCBmaXgtYWxsLWF0LW9uY2UgcnVsZXMuIEp1c3QgdGhpbmsgYWJvdXQgcmVhZGFiaWxpdHkgd2hpbGUgd3JpdGluZyBjb2RlLgorV3JpdGUgY29kZSBsaWtlIHlvdSB3b3VsZCBoYXZlIHRvIHJlYWQgaXQgaW4gdGVuIHllYXJzIGZyb20gbm93LgorCisjIyBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHMKKworVGhyaWZ0IGhhcyBzb21lIGhpc3RvcnkuIE5vdCBhbGwgZXhpc3RpbmcgY29kZSBmb2xsb3dzIHRob3NlIHJ1bGVzLgorQnV0IHdlIHdhbnQgdG8gaW1wcm92ZSBvdmVyIHRpbWUuCitXaGVuIG1ha2luZyBzbWFsbCBjaGFuZ2UgLyBidWdmaXggLSBsaWtlIHNpbmdsZSBsaW5lIGZpeCAtIGRvICpub3QqIHJlZmFjdG9yIHdob2xlIGZ1bmN0aW9uLgorVGhhdCBkaXN0dXJicyBjb2RlIHJlcG9zaXRvcnkgaGlzdG9yeS4KK1doZW5ldmVyIGFkZGluZyBzb21ldGhpbmcgbmV3IGFuZCAvIG9yIG1ha2luZyBiaWdnZXIgcmVmYWN0b3JpbmcKKyAtIGZvbGxvdyB0aG9zZSBydWxlcyBhcyBzdHJpY3RseSBhcyB5b3UgY2FuLgorCitXaGVuIGluIGRvdWJ0IC0gY29udGFjdCBvdGhlciBkZXZlbG9wZXJzICh1c2luZyBkZXZAIG1haWxpbmcgbGlzdCBvciBJUkMpLgorQ29kZSByZXZpZXcgaXMgdGhlIGJlc3Qgd2F5IHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCisKKyMjIyBCYXNpY3MKKyAqIFVzZSBzcGFjZXMgbm90IHRhYnMKKyAqIFVzZSBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgaW4gZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzCisgKiBDb21taXQgdG8gcmVwb3NpdG9yeSB1c2luZyBVbml4LXN0eWxlIGxpbmUgZW5kaW5ncyAoTEYpCisgICAgIE9uIFdpbmRvd3M6CisgICAgICAgZ2l0IGNvbmZpZyBjb3JlLmF1dG9jcmxmIHRydWUKKyAqIE1heGltdW0gbGluZSB3aWR0aCAtIDEwMCBjaGFyYWN0ZXJzCisgKiBJZiBub3Qgc3BlY2lmaWVkIG90aGVyd2lzZSBpbiBsYW5ndWFnZSBzcGVjaWZpYyBzdGFuZGFyZCAtIHVzZSAyIHNwYWNlcyBhcyBpbmRlbnQvdGFiCisKKyMjIyBDb21tZW50cworICogRWFjaCBmaWxlIGhhcyB0byBzdGFydCB3aXRoIGNvbW1lbnQgY29udGFpbmluZyBbQXBhY2hlIExpY2Vuc2VdKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCkKKyAqIFB1YmxpYyBBUEkgb2YgbGlicmFyeSBzaG91bGQgYmUgZG9jdW1lbnRlZCwgcHJlZmVyYWJseSB1c2luZyBmb3JtYXQgbmF0aXZlIGZvciBsYW5ndWFnZSBzcGVjaWZpYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gdG9vbHMgKEphdmFkb2MsIERveHlnZW4gZXRjLikKKyAqIE90aGVyIGNvbW1lbnRzIGFyZSBkaXNjb3VyYWdlZCAtIGNvbW1lbnRzIGFyZSBsaWVzLiBXaGVuIG9uZSBoYXMgdG8gbWFrZSBjb21tZW50IGl0IG1lYW5zIG9uZSBmYWlsZWQgdG8gd3JpdGUgcmVhZGFibGUgY29kZS4gSW5zdGVhZCBvZiAiSSBzaG91bGQgd3JpdGUgYSBjb21tZW50IGhlcmUiIHRoaW5rICJJIHNob3VsZCBjbGVhbiBpdCB1cCIKKyAqIERvIG5vdCBsZWF2ZSAiVE9ETy9GSVhNRSIgY29tbWVudHMgLSBmaWxlIFtKaXJhXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKSBpc3N1ZSBpbnN0ZWFkCisKKyMjIyBOYW1pbmcKKyBGaW5kaW5nIHByb3BlciBuYW1lcyBpcyB0aGUgbW9zdCBpbXBvcnRhbnQgYW5kIG1vc3QgZGlmZmljdWx0IHRhc2sgaW4gc29mdHdhcmUgZGV2ZWxvcG1lbnQuCisKKyMjIExhbmd1YWdlIFNwZWNpZmljIENvZGluZyBTdGFuZGFyZHMKKworRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZSBgbGliL0xBTkcvY29kaW5nX3N0YW5kYXJkcy5tZGAKZGlmZiAtLWdpdCBhL2RvYy9jb21taXR0ZXJzLm1kIGIvZG9jL2NvbW1pdHRlcnMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkZDdiNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9jb21taXR0ZXJzLm1kCkBAIC0wLDAgKzEsNTQgQEAKKyMjIFByb2Nlc3MgdXNlZCBieSBjb21taXR0ZXJzIHRvIHJldmlldyBhbmQgc3VibWl0IHBhdGNoZXMKKworMS4gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYW4gaXNzdWUgZm9yIHRoZSBwYXRjaChzKSB5b3UgYXJlIGFib3V0IHRvIGNvbW1pdCBpbiBvdXIgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkKKworMS4gQ2hlY2sgb3V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUKKworICAqIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgdGhyaWZ0CisKKzEuIEFwcGx5IHRoZSBwYXRjaAorCisgICogY3VybCBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvLi4uIHxnaXQgYXBwbHkgLS1pZ25vcmUtc3BhY2UtY2hhbmdlCisKKyAgb3IKKworICAqIGN1cmwgaHR0cHM6Ly9naXRodWIuY29tLzxHaXRIdWIgVXNlcj4vdGhyaWZ0L2NvbW1pdC88Q29tbWl0IElEPi5wYXRjaCB8Z2l0IGFwcGx5IC0taWdub3JlLXNwYWNlLWNoYW5nZQorCisKKzEuIEluc3BlY3QgdGhlIGFwcGxpZWQgcGF0Y2ggdG8gZW5zdXJlIHRoYXQgYWxsIFtMZWdhbCBhc3BlY3RzIG9uIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucyAoUGF0Y2hlcyldKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sI2NvbnRyaWJ1dGlvbnMpIGFyZSBtZXQKKworMS4gUnVuIHRoZSBuZWNlc3NhcnkgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlIHBhdGNoCisKKzEuIENvbW1pdCB0aGUgcGF0Y2gKKworICAgICAgICBnaXQgLS1jb25maWcgdXNlci5uYW1lICJZb3VyIE5hbWUiCisgICAgICAgIGdpdCAtLWNvbmZpZyB1c2VyLmVtYWlsICJZb3VyQXBhY2hlSURAYXBhY2hlLm9yZyIKKyAgICAgICAgZ2l0IGFkZCAtQQorICAgICAgICBnaXQgY29tbWl0CisKKzEuIFRoZSBjb21taXQgbWVzc2FnZSBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdDoKKworICAgICAgIFRIUklGVC0jIyM6PEppcmEgZGVzY3JpcHRpb24+CisgICAgICAgQ2xpZW50OiA8Y29tcG9uZW50PgorICAgICAgIFBhdGNoOiA8TmFtZSBvZiBwZXJzb24gY29udHJpYnV0aW5nIHRoZSBwYXRjaD4KKworICAgICAgIERlc2NyaXB0aW9uIG9mIHdoYXQgd2FzIGZpeGVkIG9yIGFkZHJlc3NlZC4KKworICAgICAgIDwlCisgICAgICAgICAgIGlmIHRoaXMgaXMgYSBnaXRodWIgcHVsbCByZXF1ZXN0IHRoZW4gYWRkIGJlbG93IGNvbW1lbnQKKyAgICAgICAgICAgIHRvIGF1dG9tYXRpY2FseSBjbG9zZSBHaXRIdWIgcmVxdWVzdC4KKyAgICAgICAlPgorICAgICAgIFRoaXMgY2xvc2VzICNYWAorCisKKzEuIERvdWJsZSBjaGVjayB0aGUgcGF0Y2ggY29tbWl0dGVkIGFuZCB0aGF0IG5vdGhpbmcgd2FzIG1pc3NlZCB0aGVuIHB1c2ggdGhlIHBhdGNoCisKKyAgICAgICBnaXQgc3RhdHVzCisgICAgICAgZ2l0IHNob3cgSEVBRAorICAgICAgIGdpdCBwdXNoIG9yaWdpbiBtYXN0ZXIKKworCisxLiBSZXNvbHZlIHRoZSBqaXJhIGlzc3VlIGFuZCBzZXQgdGhlIGZvbGxvd2luZyBmb3IgdGhlIGNoYW5nZWxvZworCisgICogQ29tcG9uZW50IHRoZSBwYXRjaCBpcyBmb3IKKyAgKiBmaXhWZXJzaW9uIHRvIHRoZSBjdXJyZW50IHZlcnNpb24gb24gbWFzdGVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2Nncm4ucG5nIGIvZG9jL2ltYWdlcy9jZ3JuLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA5NjRlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jZ3JuLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2NyZWQucG5nIGIvZG9jL2ltYWdlcy9jcmVkLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODZhNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jcmVkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZyBiL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjY0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2NyZWRmdWxsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL2N5ZWwucG5nIGIvZG9jL2ltYWdlcy9jeWVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFkZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy9jeWVsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nIGIvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFjY2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL2ltYWdlcy90aHJpZnQtbGF5ZXJzLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9SRUFETUUubWQgYi9kb2MvaW5zdGFsbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyMzFjZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL1JFQURNRS5tZApAQCAtMCwwICsxLDQzIEBACisKKyMjIEJhc2ljIHJlcXVpcmVtZW50cworKiBBIHJlbGF0aXZlbHkgUE9TSVgtY29tcGxpYW50ICpOSVggc3lzdGVtCisgICAgKiBDeWd3aW4gb3IgTWluR1cgY2FuIGJlIHVzZWQgb24gV2luZG93cyAoYnV0IHRoZXJlIGFyZSBiZXR0ZXIgb3B0aW9ucywgc2VlIGJlbG93KQorKiBnKysgNC4yCisqIGJvb3N0IDEuNTMuMAorKiBSdW50aW1lIGxpYnJhcmllcyBmb3IgbGV4IGFuZCB5YWNjIG1pZ2h0IGJlIG5lZWRlZCBmb3IgdGhlIGNvbXBpbGVyLgorCisjIyBSZXF1aXJlbWVudHMgZm9yIGJ1aWxkaW5nIGZyb20gc291cmNlCisqIEdOVSBidWlsZCB0b29sczogCisgICAgKiBhdXRvY29uZiAyLjY1CisgICAgKiBhdXRvbWFrZSAxLjEzCisgICAgKiBsaWJ0b29sIDEuNS4yNAorKiBwa2ctY29uZmlnIGF1dG9jb25mIG1hY3JvcyAocGtnLm00KQorKiBsZXggYW5kIHlhY2MgKGRldmVsb3BlZCBwcmltYXJpbHkgd2l0aCBmbGV4IGFuZCBiaXNvbikKKyogbGlic3NsLWRldgorCisjIyBSZXF1aXJlbWVudHMgZm9yIGJ1aWxkaW5nIHRoZSBjb21waWxlciBmcm9tIHNvdXJjZSBvbiBXaW5kb3dzCisqIFZpc3VhbCBTdHVkaW8gQysrCisqIEZsZXggYW5kIEJpc29uIChlLmcuIHRoZSBXaW5GbGV4Qmlzb24gcGFja2FnZSkKKworIyMgTGFuZ3VhZ2UgcmVxdWlyZW1lbnRzCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIHRoZSBsaWJyYXJpZXMgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZQorCisqIEMrKworICAgICogQm9vc3QgMS41My4wCisgICAgKiBsaWJldmVudCAob3B0aW9uYWwsIHRvIGJ1aWxkIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIpCisgICAgKiB6bGliIChvcHRpb25hbCkKKyogSmF2YQorICAgICogSmF2YSAxLjgKKyAgICAqIEFwYWNoZSBBbnQKKyogQyM6IE1vbm8gMS4yLjQgKGFuZCBwa2ctY29uZmlnIHRvIGRldGVjdCBpdCkgb3IgVmlzdWFsIFN0dWRpbyAyMDA1KworKiBQeXRob24gMi42IChpbmNsdWRpbmcgaGVhZGVyIGZpbGVzIGZvciBleHRlbnNpb24gbW9kdWxlcykKKyogUEhQIDUuMCAob3B0aW9uYWxseSBpbmNsdWRpbmcgaGVhZGVyIGZpbGVzIGZvciBleHRlbnNpb24gbW9kdWxlcykKKyogUnVieSAxLjgKKyAgICAqIGJ1bmRsZXIgZ2VtCisqIEVybGFuZyBSMTIgKFIxMSB3b3JrcyBidXQgbm90IHJlY29tbWVuZGVkKQorKiBQZXJsIDUKKyAgICAqIEJpdDo6VmVjdG9yCisgICAgKiBDbGFzczo6QWNjZXNzb3IKKyogSGF4ZSAzLjEuMworKiBHbyAxLjQKKyogRGVscGhpIDIwMTAKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2NlbnRvcy5tZCBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDkzMmMyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2luc3RhbGwvY2VudG9zLm1kCkBAIC0wLDAgKzEsNzUgQEAKKyMgQnVpbGRpbmcgQXBhY2hlIFRocmlmdCBvbiBDZW50T1MgNi41CisKK1N0YXJ0aW5nIHdpdGggYSBtaW5pbWFsIGluc3RhbGxhdGlvbiwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgcmVxdWlyZWQgdG8gYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBDZW50b3MgNi41LiBUaGlzIGV4YW1wbGUgYnVpbGRzIGZyb20gc291cmNlLCB1c2luZyB0aGUgY3VycmVudCBkZXZlbG9wbWVudCBtYXN0ZXIgYnJhbmNoLiBUaGVzZSBpbnN0cnVjdGlvbnMgc2hvdWxkIGFsc28gd29yayB3aXRoIEFwYWNoZSBUaHJpZnQgcmVsZWFzZXMgYmVnaW5uaW5nIHdpdGggMC45LjIuCisKKyMjIFVwZGF0ZSB0aGUgU3lzdGVtCisKKwlzdWRvIHl1bSAteSB1cGRhdGUKKworIyMgSW5zdGFsbCB0aGUgUGxhdGZvcm0gRGV2ZWxvcG1lbnQgVG9vbHMKKworCXN1ZG8geXVtIC15IGdyb3VwaW5zdGFsbCAiRGV2ZWxvcG1lbnQgVG9vbHMiCisKKyMjIFVwZ3JhZGUgYXV0b2NvbmYvYXV0b21ha2UvYmlzb24KKworCXN1ZG8geXVtIGluc3RhbGwgLXkgd2dldAorCisjIyMgVXBncmFkZSBhdXRvY29uZgorCisJd2dldCBodHRwOi8vZnRwLmdudS5vcmcvZ251L2F1dG9jb25mL2F1dG9jb25mLTIuNjkudGFyLmd6CisJdGFyIHh2ZiBhdXRvY29uZi0yLjY5LnRhci5negorCWNkIGF1dG9jb25mLTIuNjkKKwkuL2NvbmZpZ3VyZSAtLXByZWZpeD0vdXNyCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisJY2QgLi4KKworIyMjIFVwZ3JhZGUgYXV0b21ha2UKKworCXdnZXQgaHR0cDovL2Z0cC5nbnUub3JnL2dudS9hdXRvbWFrZS9hdXRvbWFrZS0xLjE0LnRhci5negorCXRhciB4dmYgYXV0b21ha2UtMS4xNC50YXIuZ3oKKwljZCBhdXRvbWFrZS0xLjE0CisJLi9jb25maWd1cmUgLS1wcmVmaXg9L3VzcgorCW1ha2UKKwlzdWRvIG1ha2UgaW5zdGFsbAorCWNkIC4uCisKKyMjIyBVcGdyYWRlIGJpc29uCisKKwl3Z2V0IGh0dHA6Ly9mdHAuZ251Lm9yZy9nbnUvYmlzb24vYmlzb24tMi41LjEudGFyLmd6CisJdGFyIHh2ZiBiaXNvbi0yLjUuMS50YXIuZ3oKKwljZCBiaXNvbi0yLjUuMQorCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKKwltYWtlCisJc3VkbyBtYWtlIGluc3RhbGwKKwljZCAuLgorCisjIyBBZGQgT3B0aW9uYWwgQysrIExhbmd1YWdlIExpYnJhcnkgRGVwZW5kZW5jaWVzCisKK0FsbCBsYW5ndWFnZXMgcmVxdWlyZSB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIgYW5kIGF0IHRoaXMgcG9pbnQgZXZlcnl0aGluZyBuZWVkZWQgdG8gbWFrZSB0aGUgSURMIENvbXBpbGVyIGlzIGluc3RhbGxlZCAoaWYgeW91IG9ubHkgbmVlZCB0aGUgY29tcGlsZXIgeW91IGNhbiBza2lwIHRvIHRoZSBCdWlsZCBzdGVwKS4gCisKK0lmIHlvdSB3aWxsIGJlIGRldmVsb3BpbmcgQXBhY2hlIFRocmlmdCBjbGllbnRzL3NlcnZlcnMgaW4gQysrIHlvdSB3aWxsIGFsc28gbmVlZCBhZGRpdGlvbmFsIHBhY2thZ2VzIHRvIHN1cHBvcnQgdGhlIEMrKyBzaGFyZWQgbGlicmFyeSBidWlsZC4KKworIyMjIEluc3RhbGwgQysrIExpYiBEZXBlbmRlbmNpZXMKKworCXN1ZG8geXVtIC15IGluc3RhbGwgbGliZXZlbnQtZGV2ZWwgemxpYi1kZXZlbCBvcGVuc3NsLWRldmVsCisKKyMjIyBVcGdyYWRlIEJvb3N0ID49IDEuNTMKKworCXdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjUzLjAvYm9vc3RfMV81M18wLnRhci5negorCXRhciB4dmYgYm9vc3RfMV81M18wLnRhci5negorCWNkIGJvb3N0XzFfNTNfMAorCS4vYm9vdHN0cmFwLnNoCisJc3VkbyAuL2IyIGluc3RhbGwKKworIyMgQnVpbGQgYW5kIEluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgSURMIENvbXBpbGVyCisKKwlnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CisJY2QgdGhyaWZ0CisJLi9ib290c3RyYXAuc2gKKwkuL2NvbmZpZ3VyZSAtLXdpdGgtbHVhPW5vCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisKK1RoaXMgd2lsbCBidWlsZCB0aGUgY29tcGlsZXIgKHRocmlmdC9jb21waWxlci9jcHAvdGhyaWZ0IC0tdmVyc2lvbikgYW5kIGFueSBsYW5ndWFnZSBsaWJyYXJpZXMgc3VwcG9ydGVkLiBUaGUgbWFrZSBpbnN0YWxsIHN0ZXAgaW5zdGFsbHMgdGhlIGNvbXBpbGVyIG9uIHRoZSBwYXRoOiAvdXNyL2xvY2FsL2Jpbi90aHJpZnQKK1lvdSBjYW4gdXNlIHRoZSAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1saWJzPW5vIHN3aXRjaCB0byBidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIgb25seSB3aXRob3V0IGxpYiBidWlsZHMuIFRvIHJ1biB0ZXN0cyB1c2UgIm1ha2UgY2hlY2siLgpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvZGViaWFuLm1kIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjY5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKQEAgLTAsMCArMSw2MiBAQAorIyMgRGViaWFuL1VidW50dSBpbnN0YWxsCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBpbnN0YWxsIHRvb2xzIGFuZCBsaWJyYXJpZXMgcmVxdWlyZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgYW5kIEMrKyBsaWJyYXJpZXMgb24gYSBEZWJpYW4vVWJ1bnR1IExpbnV4IGJhc2VkIHN5c3RlbS4KKworCXN1ZG8gYXB0LWdldCBpbnN0YWxsIGF1dG9tYWtlIGJpc29uIGZsZXggZysrIGdpdCBsaWJib29zdC1hbGwtZGV2IGxpYmV2ZW50LWRldiBsaWJzc2wtZGV2IGxpYnRvb2wgbWFrZSBwa2ctY29uZmlnCisKK0RlYmlhbiA3L1VidW50dSAxMiB1c2VycyBuZWVkIHRvIG1hbnVhbGx5IGluc3RhbGwgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIGF1dG9tYWtlIGFuZCAoZm9yIEMrKyBsaWJyYXJ5IGFuZCB0ZXN0IHN1cHBvcnQpIGJvb3N0OgorCisgICAgd2dldCBodHRwOi8vZnRwLmRlYmlhbi5vcmcvZGViaWFuL3Bvb2wvbWFpbi9hL2F1dG9tYWtlLTEuMTUvYXV0b21ha2VfMS4xNS0zX2FsbC5kZWIKKyAgICBzdWRvIGRwa2cgLWkgYXV0b21ha2VfMS4xNS0zX2FsbC5kZWIKKworICAgIHdnZXQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib29zdC9maWxlcy9ib29zdC8xLjYwLjAvYm9vc3RfMV82MF8wLnRhci5neiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXIgeHZmIGJvb3N0XzFfNjBfMC50YXIuZ3oKKyAgICBjZCBib29zdF8xXzYwXzAKKyAgICAuL2Jvb3RzdHJhcC5zaAorICAgIHN1ZG8gLi9iMiBpbnN0YWxsCisKKyMjIE9wdGlvbmFsIHBhY2thZ2VzCisKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIEFwYWNoZSBUaHJpZnQgbGlicmFyaWVzIGZvciBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMgeW91IG1heSBuZWVkIHRvIGluc3RhbGwgYWRkaXRpb25hbCBwYWNrYWdlcy4gVGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgcmVxdWlyZSB0aGUgc3BlY2lmaWVkIGFkZGl0aW9uYWwgcGFja2FnZXM6CisKKyAqIEphdmEKKwkqIHBhY2thZ2VzOiBhbnQgIAorCSogWW91IHdpbGwgYWxzbyBuZWVkIEphdmEgSkRLIHYxLjggb3IgaGlnaGVyLiBUeXBlICoqamF2YWMqKiB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrYWdlcywgcGljayB0aGUgb25lIHlvdSBwcmVmZXIgYW5kICoqYXB0LWdldCBpbnN0YWxsKiogaXQgKGUuZy4gZGVmYXVsdC1qZGspLgorICogUnVieQorCSogcnVieS1mdWxsIHJ1YnktZGV2IHJ1YnktcnNwZWMgcmFrZSBydWJ5Z2VtcyBidW5kbGVyCisgKiBQeXRob24KKwkqIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcKKyAqIFBlcmwKKwkqIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsCisgKiBQaHAsIGluc3RhbGwKKwkqIHBocDUtZGV2IHBocDUtY2xpIHBocHVuaXQKKyAqIENfZ2xpYgorCSogbGliZ2xpYjIuMC1kZXYKKyAqIEVybGFuZworCSogZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYgcmViYXIKKyAqIENzaGFycAorCSogbW9uby1nbWNzIG1vbm8tZGV2ZWwgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBudW5pdCBudW5pdC1jb25zb2xlCisgKiBIYXNrZWxsCisJKiBnaGMgY2FiYWwtaW5zdGFsbCBsaWJnaGMtYmluYXJ5LWRldiBsaWJnaGMtbmV0d29yay1kZXYgbGliZ2hjLWh0dHAtZGV2CisgKiBUaHJpZnQgQ29tcGlsZXIgZm9yIFdpbmRvd3MKKwkqIG1pbmd3LXc2NCBtaW5ndy13NjQteDg2LTY0LWRldiBuc2lzCisgKiBSdXN0CisJKiBydXN0YyBjYXJnbworICogSGF4ZQorCSogaGF4ZQorICogTHVhCisgICAgKiBsdWE1LjMgbGlibHVhNS4zLWRldgorICogTm9kZUpzCisgICAgKiBub2RlanMgbnBtCisgKiBkb3RuZXRjb3JlCisgICAgKiBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9sZWFybi9nZXQtc3RhcnRlZC9saW51eHVidW50dQorICogZC1sYW5nCisgICAgKiBjdXJsIC1mc1MgaHR0cHM6Ly9kbGFuZy5vcmcvaW5zdGFsbC5zaCB8IGJhc2ggLXMgZG1kCisgKiBkYXJ0ICYgcHViCisgICAgKiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvaW5zdGFsbC9saW51eAorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL3B1Yi9pbnN0YWxsaW5nCisJCisKKyMjIEFkZGl0aW9uYWwgcmVhZGluZworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVxdWlyZW1lbnRzIHNlZTogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBUaHJpZnQgc2VlOiBbQnVpbGRpbmcgZnJvbSBzb3VyY2VdKC9kb2NzL0J1aWxkaW5nRnJvbVNvdXJjZSkKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL29zX3gubWQgYi9kb2MvaW5zdGFsbC9vc194Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTllZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW5zdGFsbC9vc194Lm1kCkBAIC0wLDAgKzEsMjcgQEAKKyMjIE9TIFggU2V0dXAKK1RoZSBmb2xsb3dpbmcgY29tbWFuZCBpbnN0YWxsIGFsbCB0aGUgcmVxdWlyZWQgdG9vbHMgYW5kIGxpYnJhcmllcyB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBjb21waWxlciBvbiBhIE9TIFggYmFzZWQgc3lzdGVtLiAKKworIyMjIEluc3RhbGwgQm9vc3QKK0Rvd25sb2FkIHRoZSBib29zdCBsaWJyYXJ5IGZyb20gW2Jvb3N0Lm9yZ10oaHR0cDovL3d3dy5ib29zdC5vcmcpIHVudGFyIGNvbXBpbGUgd2l0aAorCisJLi9ib290c3RyYXAuc2gKKwlzdWRvIC4vYjIgdGhyZWFkaW5nPW11bHRpIGFkZHJlc3MtbW9kZWw9NjQgdmFyaWFudD1yZWxlYXNlIHN0YWdlIGluc3RhbGwKKworIyMjIEluc3RhbGwgbGliZXZlbnQKK0Rvd25sb2FkIFtsaWJldmVudF0oaHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudCksIHVudGFyIGFuZCBjb21waWxlIHdpdGgKKworCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IvbG9jYWwgCisJbWFrZQorCXN1ZG8gbWFrZSBpbnN0YWxsCisKKyMjIyBCdWlsZGluZyBBcGFjaGUgVGhyaWZ0CitEb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgW0FwYWNoZSBUaHJpZnRdKC9kb3dubG9hZCksIHVudGFyIGFuZCBjb21waWxlIHdpdGgKKworCS4vY29uZmlndXJlIC0tcHJlZml4PS91c3IvbG9jYWwvIC0td2l0aC1ib29zdD0vdXNyL2xvY2FsIC0td2l0aC1saWJldmVudD0vdXNyL2xvY2FsCisKKyMjIEFkZGl0aW9uYWwgcmVhZGluZworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVxdWlyZW1lbnRzIHNlZTogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBUaHJpZnQgc2VlOiBbQnVpbGRpbmcgZnJvbSBzb3VyY2VdKC9kb2NzL0J1aWxkaW5nRnJvbVNvdXJjZSkKKwpkaWZmIC0tZ2l0IGEvZG9jL2luc3RhbGwvd2luZG93cy5tZCBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxODkzNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKQEAgLTAsMCArMSwxODYgQEAKKyMjIFdpbmRvd3MgU2V0dXAKKworVGhlIFRocmlmdCBlbnZpcm9ubWVudCBjb25zaXN0cyBvZiB0d28gbWFpbiBwYXJ0czogVGhlIFRocmlmdCBjb21waWxlciBFWEUgYW5kIHRoZSBsYW5ndWFnZS1kZXBlbmRlbnQgbGlicmFyaWVzLiBNb3N0IG9mIHRoZXNlIGxpYnJhcmllcyB3aWxsIHJlcXVpcmUgc29tZSBraW5kIG9mIGJ1aWxkIGFuZC9vciBpbnN0YWxsYXRpb24uIEJ1dCByZWdhcmRpbmcgdGhlIFRocmlmdCBjb21waWxlciB1dGlsaXR5IHRoZXJlIGFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzLiAKKworVGhlIGZpcnN0IG9uZSBvZiB0aGVzZSBhbHRlcm5hdGl2ZXMgaXMgdG8gZG93bmxvYWQgdGhlICoqcHJlLWJ1aWx0IFRocmlmdCBDb21waWxlciBFWEUqKiBhbmQgb25seSBidWlsZCB0aGUgbGlicmFyaWVzIG5lZWRlZCBmcm9tIHNvdXJjZSwgZm9sbG93aW5nIG9uZSBvZiB0aGUgIlNldHVwIGZyb20gc291cmNlIiBtZXRob2RzIG91dGxpbmVkIGJlbG93LgorCitUaGUgb3RoZXIgdHdvIG9wdGlvbnMgYXJlIHRvIGJ1aWxkIHRoZSBUaHJpZnQgY29tcGlsZXIgZnJvbSBzb3VyY2UuIFRoZSBtb3N0IHJlY29tbWVuZGVkIHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbWVhbnMgb2YgdGhlICoqVmlzdWFsIFN0dWRpbyBDKysgYnVpbGQgcHJvamVjdCoqLiBBbHRlcm5hdGl2ZWx5LCB0aGUgVGhyaWZ0IGNvbXBpbGVyIGNhbiBhbHNvIGJlIGJ1aWx0IHZpYSAqKkN5Z3dpbioqIG9yICoqTWluR1cqKiBidWlsZCBlbnZpcm9ubWVudHMsIGhvd2V2ZXIgdGhpcyBtZXRob2QgaXMgbm90IG9ubHkgbGVzcyBjb21mb3J0YWJsZSwgYnV0IG1vcmUgdGltZS1jb25zdW1pbmcgYW5kIHJlcXVpcmVzIG11Y2ggbW9yZSBtYW51YWwgZWZmb3J0LiAKKworCisjIyBQcmVidWlsdCBUaHJpZnQgY29tcGlsZXIKKworVGhlIHdpbmRvd3MgVGhyaWZ0IGNvbXBpbGVyIGlzIGF2YWlsYWJsZSBhcyBhIHByZWJ1aWx0IGV4ZSBhdmFpbGFibGUgW2hlcmVdKC9kb3dubG9hZCkuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBpbnN0YWxsYXRpb24gdG9vbCwgcmF0aGVyIHRoaXMgRVhFIGZpbGUgKmlzKiBhbHJlYWR5IHRoZSBUaHJpZnQgY29tcGlsZXIgdXRpbGl0eS4gRG93bmxvYWQgdGhlIGZpbGUgYW5kIHB1dCBpdCBpbnRvIHNvbWUgc3VpdGFibGUgbG9jYXRpb24gb2YgeW91ciBjaG9pY2UuCisKK05vdyBwaWNrIG9uZSBvZiB0aGUgIkJ1aWxkIGFuZCBpbnN0YWxsIHRhcmdldCBsaWJyYXJpZXMiIGJlbG93IHRvIGNvbnRpbnVlLgorCisgCisjIyBTZXR1cCBmcm9tIHNvdXJjZSB2aWEgVmlzdWFsIFN0dWRpbyBDKysgKHJlY29tbWVuZGVkKQorCisjIyMgUmVxdWlyZW1lbnRzCisKK1RocmlmdCdzIGNvbXBpbGVyIGlzIHdyaXR0ZW4gaW4gQysrIGFuZCBkZXNpZ25lZCB0byBiZSBwb3J0YWJsZSwgYnV0IHRoZXJlIGFyZSBzb21lIHN5c3RlbSByZXF1aXJlbWVudHMuIFRocmlmdCdzIHJ1bnRpbWUgbGlicmFyaWVzIGFyZSB3cml0dGVuIGluIHZhcmlvdXMgbGFuZ3VhZ2VzLCB3aGljaCBhcmUgYWxzbyByZXF1aXJlZCBmb3IgdGhlIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgaW50ZXJmYWNlLgorCisgKiBWaXN1YWwgU3R1ZGlvIEMrKywgYW55IHJlY2VudCB2ZXJzaW9uIHNob3VsZCBkbworICogRmxleCBhbmQgQmlzb24sIGUuZy4gdGhlIFdpbkZsZXhCaXNvbiBwYWNrYWdlCisgKiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKKyMjIyBCdWlsZCBhbmQgaW5zdGFsbCB0aGUgY29tcGlsZXIKKyAKK0FmdGVyIGFsbCByZXF1aXJlbWVudHMgYXJlIGluIHBsYWNlLCB1c2UgdGhlIGBjb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvamAgYnVpbGQgcHJvamVjdCB0byBidWlsZCB0aGUgVGhyaWZ0IGNvbXBpbGVyLiBDb3B5IHRoZSByZXN1bHRpbmcgRVhFIGZpbGUgdG8gYSBsb2NhdGlvbiBvZiB5b3VyIGNob2ljZS4gCisKKyMjIyBCdWlsZCBhbmQgaW5zdGFsbCB0YXJnZXQgbGlicmFyaWVzCisKK0EgZmV3IG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgbGlicmFyaWVzIGFsc28gZG8gcHJvdmlkZSBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMsIHN1Y2ggYXMgQysrIGFuZCBDIy4gVGhlc2UgYXJlIGxvY2F0ZWQgaW4gdGhlIGBsaWIvPGxhbmd1YWdlPi9gIGZvbGRlcnMuIAorCitNb3N0IG9mIHRoZSBsYW5ndWFnZSBwYWNrYWdlcyBtdXN0IGJlIGJ1aWx0IGFuZCBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgYnVpbGQgdG9vbHMgYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMuIFR5cGljYWwgZXhhbXBsZXMgYXJlIEphdmEsIFJ1YnksIERlbHBoaSwgb3IgUEhQLiBMb29rIGZvciB0aGUgYFJFQURNRS5tZGAgZmlsZSBpbiB0aGUgYGxpYi88bGFuZ3VhZ2U+L2AgZm9sZGVyIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGVhY2ggbGFuZ3VhZ2UncyBsaWJyYXJ5IHBhY2thZ2UuCisgCisKKyMjIFNldHVwIGZyb20gc291cmNlIHZpYSBDeWd3aW4KKworIyMjIFJlcXVpcmVtZW50cworCitUaHJpZnQncyBjb21waWxlciBpcyB3cml0dGVuIGluIEMrKyBhbmQgZGVzaWduZWQgdG8gYmUgcG9ydGFibGUsIGJ1dCB0aGVyZSBhcmUgc29tZSBzeXN0ZW0gcmVxdWlyZW1lbnRzLiBUaHJpZnQncyBydW50aW1lIGxpYnJhcmllcyBhcmUgd3JpdHRlbiBpbiB2YXJpb3VzIGxhbmd1YWdlcywgd2hpY2ggYXJlIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBwYXJ0aWN1bGFyIGxhbmd1YWdlIGludGVyZmFjZS4KKworICogQ3lnd2luIG9yIE1pbkdXIAorICogW0FwYWNoZSBUaHJpZnQgUmVxdWlyZW1lbnRzXSgvZG9jcy9pbnN0YWxsKQorCisjIyMgSW5zdGFsbGluZyBmcm9tIHNvdXJjZQorCitJZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gdGhlIGZpcnN0IHRpbWUgb3V0IG9mIHRoZSBzb3VyY2UgcmVwb3NpdG9yeSwgeW91IHdpbGwgbmVlZCB0byBnZW5lcmF0ZSB0aGUgY29uZmlndXJlIHNjcmlwdHMuICAoVGhpcyBpcyBub3QgbmVjZXNzYXJ5IGlmIHlvdSBkb3dubG9hZGVkIGEgdGFyYmFsbC4pICBGcm9tIHRoZSB0b3AgZGlyZWN0b3J5LCBkbzoKKworCS4vYm9vdHN0cmFwLnNoCisKK09uY2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGFyZSBnZW5lcmF0ZWQsIHRocmlmdCBjYW4gYmUgY29uZmlndXJlZC4gRnJvbSB0aGUgdG9wIGRpcmVjdG9yeSwgZG86CisKKwlleHBvcnQgQ1hYRkxBR1M9Ii1EIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QPVBUSFJFQURfTVVURVhfUkVDVVJTSVZFIgorCS4vY29uZmlndXJlCisKK1NldHRpbmcgdGhlIENYWEZMQUdTIGVudmlyb25tZW50YWwgdmFyaWFibGUgd29ya3MgYXJvdW5kIGNvbXBpbGUgZXJyb3JzIHdpdGggUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAgYmVpbmcgdW5kZWNsYXJlZCwgYnkgcmVwbGFjaW5nIGl0IHdpdGggdGhlIG5ld2VyLCBwb3J0YWJsZSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRS4gKFRlc3RlZCBvbiBjeWd3aW4gMjAxMDAzMjAsIFRocmlmdCByNzYwMTg0LCBsYXRlc3QgcHRocmVhZC4pCisKKyoqT3B0aW9uYWw6KiogWW91ICoqbWF5IG5vdCoqIGJlIGFibGUgdG8gbWFrZSBmcm9tIHRoZSByb290ICBUaHJpZnQgZGlyZWN0b3J5IGR1ZSB0byBlcnJvcnMgKHNlZSBiZWxvdyB0byByZXNvbHZlKS4gVG8gbWFrZSB0aGUgY29tcGlsZXIgb25seSwgY2hhbmdlIHRvIHRoZSBjb21waWxlciBkaXJlY3RvcnkgYmVmb3JlIHJ1bm5pbmcgbWFrZToKKworCWNkIGNvbXBpbGVyL2NwcAorCitOb3cgbWFrZSB0aGUgdGhyaWZ0IGNvbXBpbGVyICgmIHJ1bnRpbWUgbGlicmFyaWVzIGlmIG1ha2UgaXMgcnVuIGZyb20gdGhlIHRocmlmdCByb290IGRpcmVjdG9yeSk6CisKKwltYWtlCisJbWFrZSBpbnN0YWxsCisKKyMjIyBCdWlsZCBhbmQgaW5zdGFsbCB0YXJnZXQgbGlicmFyaWVzCisKK1NvbWUgbGFuZ3VhZ2UgcGFja2FnZXMgbXVzdCBiZSBpbnN0YWxsZWQgbWFudWFsbHkgdXNpbmcgYnVpbGQgdG9vbHMgYmV0dGVyIHN1aXRlZCB0byB0aG9zZSBsYW5ndWFnZXMuIFR5cGljYWwgZXhhbXBsZXMgYXJlIEphdmEsIFJ1YnksIG9yIFBIUC4gTG9vayBmb3IgdGhlIFJFQURNRSBmaWxlIGluIHRoZSBgbGliLzxsYW5ndWFnZT4vYCBmb2xkZXIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5zdGFsbGF0aW9uIG9mIGVhY2ggbGFuZ3VhZ2UgbGlicmFyeSBwYWNrYWdlLgorCisjIyMgUG9zc2libGUgaXNzdWVzIHdpdGggQ3lnd2luIGluc3RhbGwKKworU2VlIGFsc28gUG9zc2libGUgaXNzdWVzIHdpdGggTWluR1cgaW5zdGFsbC4KKworIyMjIyBTeW50YXggZXJyb3IgaW4gLi9jb25maWd1cmUKKworVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnMgZm9yIHNvbWUgdXNlcnMgd2hlbiBydW5uaW5nIC4vY29uZmlndXJlOgorCisJLi9jb25maWd1cmU6IGxpbmUgMjExODM6IHN5bnRheCBlcnJvciBuZWFyIHVuZXhwZWN0ZWQgdG9rZW4gYE1PTk8sJworCS4vY29uZmlndXJlOiBsaW5lIDIxMTgzOiBgICBQS0dfQ0hFQ0tfTU9EVUxFUyhNT05PLCBtb25vID49IDEuMi42LCBoYXZlX21vbm89eWVzLCBoYXZlX21vbm89bm8pJworCitUbyByZXNvbHZlIHRoaXMsIHlvdSdsbCBuZWVkIHRvIGZpbmQgeW91ciBwa2cubTQgKGluc3RhbGxlZCBieSB0aGUgcGtnLWNvbmZpZyBwYWNrYWdlKSBmaWxlIGFuZCBjb3B5IGl0IHRvIHRoZSB0aHJpZnQvYWNsb2NhbCBkaXJlY3RvcnkuICBGcm9tIHRoZSB0b3AtbGV2ZWwgdGhyaWZ0IGRpcmVjdG9yeSwgeW91IGNhbiBjb3B5IHRoZSBmaWxlIGJ5IHJ1bm5pbmcKKworCWNwIC91c3Ivc2hhcmUvYWNsb2NhbC9wa2cubTQgYWNsb2NhbAorCitGaW5hbGx5LCByZS1ydW4gLi9ib290c3RyYXAuc2ggYW5kIC4vY29uZmlndXJlLiAgKE5vdGUgdGhhdCBwa2cubTQgaXMgY3JlYXRlZCBieSB0aGUgcGtnLWNvbmZpZyB0b29sLiAgSWYgeW91ciAvdXNyL3NoYXJlL2FjbG9jYWwgZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0aGUgcGtnLm00IGZpbGUsIHlvdSBtYXkgbm90IGhhdmUgcGtnLWNvbmZpZyBpbnN0YWxsZWQuKQorCisjIyMjIEluc3RhbGxpbmcgcGVybCBydW50aW1lIGxpYnJhcmllcworCitTb21ldGltZXMsIHRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgZHVyaW5nIHRoZSBpbnN0YWxsIG9mIHRoZSBwZXJsIGxpYnJhcmllcyB3aXRoIGNobW9kLgorCitBIHdvcmthcm91bmQgaXMgdG8gYXZvaWQgaW5zdGFsbGluZyB0aGUgcGVybCBsaWJyYXJpZXMgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4KKworSWYgeW91IGRvbid0IG5lZWQgcGVybCwgcnVuIGNvbmZpZ3VyZSB3aXRoIC0td2l0aG91dC1wZXJsLgorCitJZiB5b3UgbmVlZCBwZXJsLCBhbmQgYXJlIGhhcHB5IHRvIG1hbnVhbGx5IGluc3RhbGwgaXQsIHJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRocmlmdC9saWIvcGVybC9NYWtlZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcsIGFmdGVyIGJ1aWxkaW5nIHRocmlmdDoKKwkKKwlUT0RPCisKKyMjIyMgTGlua2luZyB0byBpbnN0YWxsZWQgQysrIHJ1bnRpbWUgbGlicmFyaWVzCisKK1NvbWV0aW1lcywgdGhlIGluc3RhbGxlZCBsaWJ0aHJpZnQuYSB3aWxsIG5vdCBsaW5rIHVzaW5nIGcrKywgd2l0aCBsaW5rZXIgZXJyb3JzIGFib3V0IG1pc3NpbmcgdnRhYmxlcyBhbmQgZXhjZXB0aW9ucyBmb3IgVGhyaWZ0IGNsYXNzZXMuCisKK0Egd29ya2Fyb3VuZCBpcyB0byBsaW5rIHRoZSBjb21waWxlZCBvYmplY3QgZmlsZXMgZGlyZWN0bHkgZnJvbSB5b3VyIFRocmlmdCBidWlsZCwgY29ycmVzcG9uZGluZyB0byB0aGUgbWlzc2luZyBjbGFzc2VzLgorCitUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBhIE1ha2VmaWxlIHVzaW5nIHRoZSBmb2xsb3dpbmcgbGluZXM6CisKKwlUSFJJRlRfTz08cGF0aCB0bz4vdGhyaWZ0L2xpYi9jcHAKKwlMVEhSSUZUPSQoVEhSSUZUX08pL1RocmlmdC5vICQoVEhSSUZUX08pL1RTb2NrZXQubyAkKFRIUklGVF9PKS9UQmluYXJ5UHJvdG9jb2wubyAkKFRIUklGVF9PKS9UQnVmZmVyVHJhbnNwb3J0cy5vCisKK1RoZW4gbGlua2luZyB1c2luZyAkKExUSFJJRlQpIGluc3RlYWQgb2YgLWx0aHJpZnQuCisKKwlUT0RPIC0gZGlhZ25vc2UgaXNzdWUgZnVydGhlcgorCisjIyMjIEMrKyBydW50aW1lIHNlZ2ZhdWx0IHdpdGggY3lnd2luIDEuNy41LTEsIGcrKy00LjMuNCwgZm9yaygpIGFuZCB0aHJvdworCitJZiB5b3VyIHRocmlmdCBDKysgcHJvZ3JhbXMgc2VnZmF1bHQgb24gdGhyb3cgYWZ0ZXIgZm9yaygpaW5nLCBjb21waWxlIHRoZW0gd2l0aCBnKystMy4KKworVGhlIGlzc3VlIGFuZCBwYXRjaCBhcmUgZGVzY3JpYmVkIG9uIHRoZSBDeWd3aW4gbWFpbGluZyBsaXN0IGF0IGh0dHA6Ly9jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDEwLTA1L21zZzAwMjAzLmh0bWwKKworVGhpcyBpc3N1ZSBzaG91bGQgYmUgZml4ZWQgaW4gQ3lnd2luIHZlcnNpb25zIGFmdGVyIDEuNy41LTEsIG9yIGcrKyA0LjUuMC4KKworIyMgU2V0dXAgZnJvbSBzb3VyY2UgdmlhIE1pbkdXCisKKyMjIyBSZXF1aXJlbWVudHMKKworVG8gY29tcGlsZSB0aGUgVGhyaWZ0IGdlbmVyYXRvciAmIHJ1bnRpbWUgbGlicmFyaWVzICh1bnRlc3RlZCkgd2l0aG91dCB0aGUgY3lnd2luLmRsbCBkZXBlbmRlbmN5IHlvdSBuZWVkIHRvIGluc3RhbGwgTWluR1cgKHd3dy5taW5ndy5vcmcpLiAKKworICogTWluR1cgCisgKiBbQXBhY2hlIFRocmlmdCBSZXF1aXJlbWVudHNdKC9kb2NzL2luc3RhbGwpCisKK0luIGFkZGl0aW9uIHlvdSBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGVudHJ5IHRvIHlvdXIgd2luZG93cyBQQVRIIHZhcmlhYmxlLgorCisJQzpcTUlOR1dcQklOCisJCitOZXh0LCBvcGVuIGNvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSB0byB0aHJpZnRfQ1hYRkxBR1MKKworCS1ETUlOR1cgLW1uby1jeWd3aW4gLWxmbAorCQorUnVuIGJvb3RzdHJhcC5zaDoKKworCS4vYm9vdHN0cmFwLnNoCisKK01ha2Ugc3VyZSB5b3UgaGF2ZSBqYXZhIGluIHlvdXIgJFBBVEggdmFyaWFibGUsIGlmIG5vdCBkbyhhZGp1c3QgcGF0aCBpZiBuZWNlc3NhcnkpOgorCisJZXhwb3J0IFBBVEg9JFBBVEg6Ii9jeWdkcml2ZS9jL3Byb2dyYW0gZmlsZXMvamF2YS9qcmUxLjguMF8xOTEvYmluIgorCitSdW4gY29uZmlndXJlIC0gdXNpbmcgQ1hYRkxBR1MgdG8gd29yayBhcm91bmQgYW4gaXNzdWUgd2l0aCBhbiBvbGQgcHRocmVhZHMgZGVmaW5lICh1bnRlc3RlZCBvbiBNaW5HVyAtIHdvcmtzIG9uIEN5Z3dpbik6CisKKwlleHBvcnQgQ1hYRkxBR1M9Ii1EIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QPVBUSFJFQURfTVVURVhfUkVDVVJTSVZFIgorCS4vY29uZmlndXJlCisKKycnT3B0aW9uYWw6JycgVG8gbWFrZSB0aGUgY29tcGlsZXIgb25seSwgY2hhbmdlIHRvIHRoZSBjb21waWxlciAgZGlyZWN0b3J5IGJlZm9yZSBydW5uaW5nIG1ha2U6CisKKwljZCBjb21waWxlci9jcHAKKwkKK1J1biBtYWtlOgorCisJbWluZ3czMi1tYWtlLmV4ZQorCisjIyMgUG9zc2libGUgaXNzdWVzIHdpdGggTWluR1cgaW5zdGFsbAorCitTZWUgYWxzbyBQb3NzaWJsZSBpc3N1ZXMgd2l0aCBDeWd3aW4gaW5zdGFsbCwgaW5jbHVkaW5nIHRoZSBkaXNjdXNzaW9uIGFib3V0IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QLgorCisjIyMjIHl5d3JhcCBpcyBub3QgZm91bmQKKworTWFrZSBzdXJlIHlvdSBhZGQgLWxmbCBpbiB5b3VyIGN4eGZsYWdzIGluIE1ha2VmaWxlLCBhbHNvIHRyeSBhZGRpbmcgLUxjOi9jeWd3aW4vbGlicworCisjIyMjIGJvb3N0IGlzIG5vdCBmb3VuZAorCitUcnkgYW5kIGNoYW5nZSB0aGUgaW5jbHVkZSBkaXIgdG8gdXNlIHRoZSB3aW5kb3dzIHBhdGggZnJvbSBjIGxpa2UgdGhpczogRWRpdCBjb21waWxlci9jcHAvTWFrZWZpbGUsIGxvb2sgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBCT09TVF9DUFBGTEFHUywgY2hhbmdlIHRoYXQgbGluZSBmb3IKKworCUJPT1NUX0NQUEZMQUdTID0gLUljOi9jeWd3aW4vdXNyL2luY2x1ZGUvYm9vc3QtMV81M18wCisJCisjIyMjIHJlYWxwYXRoIGlzIG5vdCBmb3VuZAorCithZGQgLURNSU5HVyAtbW5vLWN5Z3dpbiB0byB0aGUgQ1hYREVGUyB2YXJpYWJsZSBpbiBNYWtlZmlsZQorCisjIyBBZGRpdGlvbmFsIHJlYWRpbmcKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlcXVpcmVtZW50cyBzZWU6IFtBcGFjaGUgVGhyaWZ0IFJlcXVpcmVtZW50c10oL2RvY3MvaW5zdGFsbCkKKworRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgVGhyaWZ0IHNlZTogW0J1aWxkaW5nIGZyb20gc291cmNlXSgvZG9jcy9CdWlsZGluZ0Zyb21Tb3VyY2UpCisKZGlmZiAtLWdpdCBhL2RvYy9sZ3BsLTIuMS50eHQgYi9kb2MvbGljZW5zZXMvbGdwbC0yLjEudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbGdwbC0yLjEudHh0CnJlbmFtZSB0byBkb2MvbGljZW5zZXMvbGdwbC0yLjEudHh0CmRpZmYgLS1naXQgYS9kb2Mvb3RwLWJhc2UtbGljZW5zZS50eHQgYi9kb2MvbGljZW5zZXMvb3RwLWJhc2UtbGljZW5zZS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dApyZW5hbWUgdG8gZG9jL2xpY2Vuc2VzL290cC1iYXNlLWxpY2Vuc2UudHh0CmRpZmYgLS1naXQgYS9kb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBiL2RvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAxYTdkLi4wMDAwMDAwCi0tLSBhL2RvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UKLUNvcHlyaWdodCAoYykgMjAwNi0gRmFjZWJvb2ssIEluYy4KLQotUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uCi1vYnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBzb2Z0d2FyZSBhbmQgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gY292ZXJlZCBieQotdGhpcyBsaWNlbnNlICh0aGUgIlNvZnR3YXJlIikgdG8gdXNlLCByZXByb2R1Y2UsIGRpc3BsYXksIGRpc3RyaWJ1dGUsCi1leGVjdXRlLCBhbmQgdHJhbnNtaXQgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZQotU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgdGhpcmQtcGFydGllcyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8KLWRvIHNvLCBhbGwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nOgotCi1UaGUgY29weXJpZ2h0IG5vdGljZXMgaW4gdGhlIFNvZnR3YXJlIGFuZCB0aGlzIGVudGlyZSBzdGF0ZW1lbnQsIGluY2x1ZGluZwotdGhlIGFib3ZlIGxpY2Vuc2UgZ3JhbnQsIHRoaXMgcmVzdHJpY3Rpb24gYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLW11c3QgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGluIHdob2xlIG9yIGluIHBhcnQsIGFuZAotYWxsIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNvZnR3YXJlLCB1bmxlc3Mgc3VjaCBjb3BpZXMgb3IgZGVyaXZhdGl2ZQotd29ya3MgYXJlIHNvbGVseSBpbiB0aGUgZm9ybSBvZiBtYWNoaW5lLWV4ZWN1dGFibGUgb2JqZWN0IGNvZGUgZ2VuZXJhdGVkIGJ5Ci1hIHNvdXJjZSBsYW5ndWFnZSBwcm9jZXNzb3IuCi0KLVRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi1JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBUSVRMRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQKLVNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBBTllPTkUgRElTVFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSBCRSBMSUFCTEUKLUZPUiBBTlkgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCi1ERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVjN2FlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZApAQCAtMCwwICsxLDgyIEBACis8bGluayBocmVmPSJodHRwOi8va2V2aW5idXJrZS5iaXRidWNrZXQub3JnL21hcmtkb3duY3NzL21hcmtkb3duLmNzcyIgcmVsPSJzdHlsZXNoZWV0Ij48L2xpbms+CisKK0hlYWRlciBmb3JtYXQgZm9yIHRoZSBUSGVhZGVyLmgKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAwIDEgMiAzIDQgNSA2IDcgOCA5IGEgYiBjIGQgZSBmCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICAgICAgICAgICAgICAgICAgICAgTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgICBIRUFERVIgTUFHSUMgICAgICAgICAgfCAgICAgICAgICAgIEZMQUdTICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBTRVFVRU5DRSBOVU1CRVIgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAwfCAgICAgSGVhZGVyIFNpemUoLzMyKSAgICAgICAgfCAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgICAgICAgICBIZWFkZXIgaXMgb2YgdmFyaWFibGUgc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzdGFydHMgYXQgb2Zmc2V0IDE0KQorCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgICAgIFBST1RPQ09MIElEICAodmFyaW50KSAgfCAgIE5VTSBUUkFOU0ZPUk1TICh2YXJpbnQpICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCAgICAgIFRSQU5TRk9STSAwIElEICh2YXJpbnQpICAgfCAgICAgICAgVFJBTlNGT1JNIDAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICBJTkZPIDAgSUQgKHZhcmludCkgICAgICB8ICAgICAgIElORk8gMCAgREFUQSAuLi4KKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFZTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworVGhlIGBMRU5HVEhgIGZpZWxkIGlzIDMyIGJpdHMsIGFuZCBjb3VudHMgdGhlIHJlbWFpbmluZyBieXRlcyBpbiB0aGUKK3BhY2tldCwgTk9UIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkLiAgVGhlIGhlYWRlciBzaXplIGZpZWxkIGlzIDE2CitiaXRzLCBhbmQgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyIHJlbWFpbmluZyBOT1QgaW5jbHVkaW5nIHRoZQorYEhFQURFUiBNQUdJQ2AsIGBGTEFHU2AsIGBTRVFVRU5DRSBOVU1CRVJgIGFuZCBoZWFkZXIgc2l6ZSBmaWVsZHMuICBUaGUKK0hlYWRlciBzaXplIGZpZWxkIGlzIGluIGJ5dGVzLzQuCisKK1RoZSB0cmFuc2Zvcm0gSUQncyBhcmUgdmFyaW50cy4gIFRoZSBkYXRhIGZvciBlYWNoIHRyYW5zZm9ybSBpcworZGVmaW5lZCBieSB0aGUgdHJhbnNmb3JtIElEIGluIHRoZSBjb2RlIC0gbm8gc2l6ZSBpcyBnaXZlbiBpbiB0aGUKK2hlYWRlci4gIElmIGEgdHJhbnNmb3JtIElEIGlzIHNwZWNpZmllZCBmcm9tIGEgY2xpZW50IGFuZCB0aGUgc2VydmVyCitkb2Vzbid0IGtub3cgYWJvdXQgdGhlIHRyYW5zZm9ybSBJRCwgYW4gZXJyb3IgTVVTVCBiZSByZXR1cm5lZCBhcyB3ZQorZG9uJ3Qga25vdyBob3cgdG8gdHJhbnNmb3JtIHRoZSBkYXRhLgorCitDb252ZXJzZWx5LCBkYXRhIGluIHRoZSBpbmZvIGhlYWRlcnMgaXMgaWdub3JhYmxlLiAgVGhpcyBzaG91bGQgb25seQorYmUgdGhpbmdzIGxpa2UgdGltZXN0YW1wcywgZGVidWdpbmcgdHJhY2luZywgZXRjLiAgVXNpbmcgdGhlIGhlYWRlcgorc2l6ZSB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc2tpcCB0aGlzIGRhdGEgYW5kIHJlYWQgdGhlIHBheWxvYWQgc2FmZWx5CitpZiB5b3UgZG9uJ3Qga25vdyB0aGUgaW5mbyBJRC4KKworSW5mbydzIHNob3VsZCBiZSBvbGRlc3Qgc3VwcG9ydGVkIHRvIG5ld2VzdCBzdXBwb3J0ZWQgb3JkZXIsIHNvIHRoYXQKK2lmIHdlIHJlYWQgYW4gaW5mbyBJRCB3ZSBkb24ndCBzdXBwb3J0LCBub25lIG9mIHRoZSByZW1haW5pbmcgaW5mbworSUQncyB3aWxsIGJlIHN1cHBvcnRlZCBlaXRoZXIsIGFuZCB3ZSBjYW4gc2FmZWx5IHNraXAgdG8gdGhlIHBheWxvYWQuCisKK0luZm8gSUQncyBhbmQgdHJhbnNmb3JtIElEJ3Mgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIElEIHNwYWNlLgorCisjIyMgUEFERElORzoKKworSGVhZGVyIHdpbGwgYmUgcGFkZGVkIG91dCB0byBuZXh0IDQtYnl0ZSBib3VuZGFyeSB3aXRoIGAweDAwYC4KKworTWF4IGZyYW1lIHNpemUgaXMgYDB4M0ZGRkZGRkZgLCB3aGljaCBpcyBzbGlnaHRseSBsZXNzIHRoYW4gYEhUVFBfTUFHSUNgLgorVGhpcyBhbGxvd3MgdXMgdG8gZGlzdGluZ3VzaCBiZXR3ZWVuIGRpZmZlcmVudCAob2xkZXIpIHRyYW5zcG9ydHMuCisKKyMjIyBUcmFuc2Zvcm0gSURzOgorCisgICAgWkxJQl9UUkFOU0ZPUk0gMHgwMSAtIE5vIGRhdGEgZm9yIHRoaXMuICBVc2UgemxpYiB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKyAgICBITUFDX1RSQU5TRk9STSAweDAyIC0gVmFyaWFibGUgYW1vdW50IG9mIG1hYyBkYXRhLiAgT25lIGJ5dGUgdG8gc3BlY2lmeQorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLiBNYWMgZGF0YSBpcyBhcHBlbmRlZCBhdCB0aGUgZW5kIG9mIHRoZSBwYWNrZXQuCisgICAgU05BUFBZX1RSQU5TRk9STSAgMHgwMyAgLSBObyBkYXRhIGZvciB0aGlzLiAgVXNlIHNuYXBweSB0byAoZGUpY29tcHJlc3MgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuCisKKworIyMjSW5mbyBJRHM6CisKKyAgICBJTkZPX0tFWVZBTFVFIDB4MDEgLSB2YXJpbnQzMiBudW1iZXIgb2YgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgLSBrZXkvdmFsdWUgcGFpcnMgb2YgdmFyc3RyaW5ncyAodmFyaW50MTYgbGVuZ3RoIHBsdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBuby10cmFpbGluZy1udWxsIHN0cmluZykuCisKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy9pZGwubWQgYi9kb2Mvc3BlY3MvaWRsLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMjJmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3BlY3MvaWRsLm1kCkBAIC0wLDAgKzEsMjcyIEBACisjIyBUaHJpZnQgaW50ZXJmYWNlIGRlc2NyaXB0aW9uIGxhbmd1YWdlCitUaGUgVGhyaWZ0IGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlIChJREwpIGFsbG93cyBmb3IgdGhlIGRlZmluaXRpb24gb2YgW1RocmlmdCBUeXBlc10oL2RvY3MvdHlwZXMpLiBBIFRocmlmdCBJREwgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGhlIFRocmlmdCBjb2RlIGdlbmVyYXRvciB0byBwcm9kdWNlIGNvZGUgZm9yIHRoZSB2YXJpb3VzIHRhcmdldCBsYW5ndWFnZXMgdG8gc3VwcG9ydCB0aGUgZGVmaW5lZCBzdHJ1Y3RzIGFuZCBzZXJ2aWNlcyBpbiB0aGUgSURMIGZpbGUuCisKKyMjIERlc2NyaXB0aW9uCisKKypVbmRlciBjb25zdHJ1Y3Rpb24qCisKK0hlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgVGhyaWZ0IElETC4KKworIyMgRG9jdW1lbnQKKworRXZlcnkgVGhyaWZ0IGRvY3VtZW50IGNvbnRhaW5zIDAgb3IgbW9yZSBoZWFkZXJzIGZvbGxvd2VkIGJ5IDAgb3IgbW9yZSBkZWZpbml0aW9ucy4KKworICAgIFsxXSAgRG9jdW1lbnQgICAgICAgIDo6PSAgSGVhZGVyKiBEZWZpbml0aW9uKgorCisjIyBIZWFkZXIKKworQSBoZWFkZXIgaXMgZWl0aGVyIGEgVGhyaWZ0IGluY2x1ZGUsIGEgQysrIGluY2x1ZGUsIG9yIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgorCisgICAgWzJdICBIZWFkZXIgICAgICAgICAgOjo9ICBJbmNsdWRlIHwgQ3BwSW5jbHVkZSB8IE5hbWVzcGFjZQorCisjIyMgVGhyaWZ0IEluY2x1ZGUKKworQW4gaW5jbHVkZSBtYWtlcyBhbGwgdGhlIHN5bWJvbHMgZnJvbSBhbm90aGVyIGZpbGUgdmlzaWJsZSAod2l0aCBhIHByZWZpeCkgYW5kIGFkZHMgY29ycmVzcG9uZGluZyBpbmNsdWRlIHN0YXRlbWVudHMgaW50byB0aGUgY29kZSBnZW5lcmF0ZWQgZm9yIHRoaXMgVGhyaWZ0IGRvY3VtZW50LgorCisgICAgWzNdICBJbmNsdWRlICAgICAgICAgOjo9ICAnaW5jbHVkZScgTGl0ZXJhbAorCisjIyMgQysrIEluY2x1ZGUKKworQSBDKysgaW5jbHVkZSBhZGRzIGEgY3VzdG9tIEMrKyBpbmNsdWRlIHRvIHRoZSBvdXRwdXQgb2YgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciBmb3IgdGhpcyBUaHJpZnQgZG9jdW1lbnQuIAorCisgICAgWzRdICBDcHBJbmNsdWRlICAgICAgOjo9ICAnY3BwX2luY2x1ZGUnIExpdGVyYWwKKworIyMjIE5hbWVzcGFjZQorCitBIG5hbWVzcGFjZSBkZWNsYXJlcyB3aGljaCBuYW1lc3BhY2VzL3BhY2thZ2UvbW9kdWxlL2V0Yy4gdGhlIHR5cGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIHdpbGwgYmUgZGVjbGFyZWQgaW4gZm9yIHRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiBUaGUgbmFtZXNwYWNlIHNjb3BlIGluZGljYXRlcyB3aGljaCBsYW5ndWFnZSB0aGUgbmFtZXNwYWNlIGFwcGxpZXMgdG87IGEgc2NvcGUgb2YgJyonIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lc3BhY2UgYXBwbGllcyB0byBhbGwgdGFyZ2V0IGxhbmd1YWdlcy4KKworICAgIFs1XSAgTmFtZXNwYWNlICAgICAgIDo6PSAgKCAnbmFtZXNwYWNlJyAoIE5hbWVzcGFjZVNjb3BlIElkZW50aWZpZXIgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggJ3NtYWxsdGFsay5jYXRlZ29yeScgU1RJZGVudGlmaWVyICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdzbWFsbHRhbGsucHJlZml4JyBJZGVudGlmaWVyICkgKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICdwaHBfbmFtZXNwYWNlJyBMaXRlcmFsICkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAneHNkX25hbWVzcGFjZScgTGl0ZXJhbCApCisKKyAgICBbNl0gIE5hbWVzcGFjZVNjb3BlICA6Oj0gICcqJyB8ICdjcHAnIHwgJ2phdmEnIHwgJ3B5JyB8ICdwZXJsJyB8ICdyYicgfCAnY29jb2EnIHwgJ2NzaGFycCcKKworTi5CLjogU21hbGx0YWxrIGhhcyB0d28gZGlzdGluY3QgdHlwZXMgb2YgbmFtZXNwYWNlIGNvbW1hbmRzOgorCistIHNtYWxsdGFsay5wcmVmaXg6IFByZXBlbmRlZCB0byBnZW5lcmF0ZWQgY2xhc3NuYW1lcy4KKyAgLSBTbWFsbHRhbGsgZG9lcyBub3QgaGF2ZSBuYW1lc3BhY2VzIGZvciBjbGFzc2VzLCBzbyBwcmVmaXhlcworICAgIGFyZSB1c2VkIHRvIGF2b2lkIGNsYXNzLW5hbWUgY29sbGlzaW9ucy4KKyAgICBPZnRlbiwgdGhlIHByZWZpeCBpcyB0aGUgYXV0aG9yJ3MgaW5pdGlhbHMsIGxpa2UgIktCIiBvciAiSldTIiwKKyAgICBvciBhbiBhYmJyZXZpYXRpb24gb2YgdGhlIHBhY2thZ2UgbmFtZSwgbGlrZSAiTUMiIGZvciAiTW9udGljZWxsbyIuCistIHNtYWxsdGFsay5jYXRlZ29yeTogRGV0ZXJtaW5lcyB0aGUgY2F0ZWdvcnkgZm9yIGdlbmVyYXRlZCBjbGFzc2VzLgorICBBbnkgZG90cyBpbiB0aGUgaWRlbnRpZmllciB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaHlwaGVucyB3aGVuIGdlbmVyYXRpbmcKKyAgdGhlIGNhdGVnb3J5IG5hbWUuCisgIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gIkdlbmVyYXRlZC0iICsgdGhlIHByb2dyYW0gbmFtZS4KKyAgTWV0aG9kcyB3aWxsIG5vdCBiZSBjYXRlZ29yaXplZCBiZXlvbmQgImFzIHlldCB1bmNhdGVnb3JpemVkIi4KKyAgLSBTbWFsbHRhbGsgYWxsb3dzIGZpbGluZyBib3RoIGNsYXNzZXMgYW5kIG1ldGhvZHMgd2l0aGluIGNsYXNzZXMgaW50byBuYW1lZAorICAgIGdyb3Vwcy4gVGhlc2UgbmFtZWQgZ3JvdXBzIG9mIG1ldGhvZHMgYXJlIGNhbGxlZCBjYXRlZ29yaWVzLgorCitOLkIuOiBUaGUgYHBocF9uYW1lc3BhY2VgIGRpcmVjdGl2ZSB3aWxsIGJlIGRlcHJlY2F0ZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIGluIGZhdm9yIG9mIHRoZSBzY29wZWQgc3ludGF4LCBidXQgdGhlIHNjb3BlZCBzeW50YXggaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIFBIUC4KKworTi5CLjogVGhlIGB4c2RfbmFtZXNwYWNlYCBkaXJlY3RpdmUgaGFzIHNvbWUgcHVycG9zZSBpbnRlcm5hbCB0byBGYWNlYm9vayBidXQgc2VydmVzIG5vIHB1cnBvc2UgaW4gVGhyaWZ0IGl0c2VsZi4gVXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZAorCisjIyBEZWZpbml0aW9uCisKKyAgICBbN10gIERlZmluaXRpb24gICAgICA6Oj0gIENvbnN0IHwgVHlwZWRlZiB8IEVudW0gfCBTZW51bSB8IFN0cnVjdCB8IFVuaW9uIHwgRXhjZXB0aW9uIHwgU2VydmljZQorCisjIyMgQ29uc3QKKworICAgIFs4XSAgQ29uc3QgICAgICAgICAgIDo6PSAgJ2NvbnN0JyBGaWVsZFR5cGUgSWRlbnRpZmllciAnPScgQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPworCisjIyMgVHlwZWRlZgorCitBIHR5cGVkZWYgY3JlYXRlcyBhbiBhbHRlcm5hdGUgbmFtZSBmb3IgYSB0eXBlLgorCisgICAgWzldICBUeXBlZGVmICAgICAgICAgOjo9ICAndHlwZWRlZicgRGVmaW5pdGlvblR5cGUgSWRlbnRpZmllcgorCisjIyMgRW51bQorCitBbiBlbnVtIGNyZWF0ZXMgYW4gZW51bWVyYXRlZCB0eXBlLCB3aXRoIG5hbWVkIHZhbHVlcy4gSWYgbm8gY29uc3RhbnQgdmFsdWUgaXMgc3VwcGxpZWQsIHRoZSB2YWx1ZSBpcyBlaXRoZXIgMCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQsIG9yIG9uZSBncmVhdGVyIHRoYW4gdGhlIHByZWNlZGluZyB2YWx1ZSBmb3IgYW55IHN1YnNlcXVlbnQgZWxlbWVudC4gQW55IGNvbnN0YW50IHZhbHVlIHRoYXQgaXMgc3VwcGxpZWQgbXVzdCBiZSBub24tbmVnYXRpdmUuCisKKyAgICBbMTBdIEVudW0gICAgICAgICAgICA6Oj0gICdlbnVtJyBJZGVudGlmaWVyICd7JyAoSWRlbnRpZmllciAoJz0nIEludENvbnN0YW50KT8gTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMjIFNlbnVtCisKK1NlbnVtIChhbmQgU2xpc3QpIGFyZSBub3cgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJvdGggYmUgcmVwbGFjZWQgd2l0aCBTdHJpbmcuCisKKyAgICBbMTFdIFNlbnVtICAgICAgICAgICA6Oj0gICdzZW51bScgSWRlbnRpZmllciAneycgKExpdGVyYWwgTGlzdFNlcGFyYXRvcj8pKiAnfScKKworIyMjIFN0cnVjdAorCitTdHJ1Y3RzIGFyZSB0aGUgZnVuZGFtZW50YWwgY29tcG9zaXRpb25hbCB0eXBlIGluIFRocmlmdC4gVGhlIG5hbWUgb2YgZWFjaCBmaWVsZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIHN0cnVjdC4KKworICAgIFsxMl0gU3RydWN0ICAgICAgICAgIDo6PSAgJ3N0cnVjdCcgSWRlbnRpZmllciAneHNkX2FsbCc/ICd7JyBGaWVsZCogJ30nCisKK04uQi46IFRoZSBgeHNkX2FsbGAga2V5d29yZCBoYXMgc29tZSBwdXJwb3NlIGludGVybmFsIHRvIEZhY2Vib29rIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBpbiBUaHJpZnQgaXRzZWxmLiBVc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkCisKKyMjIyBVbmlvbgorCitVbmlvbnMgYXJlIHNpbWlsYXIgdG8gc3RydWN0cywgZXhjZXB0IHRoYXQgdGhleSBwcm92aWRlIGEgbWVhbnMgdG8gdHJhbnNwb3J0IGV4YWN0bHkgb25lIGZpZWxkIG9mIGEgcG9zc2libGUgc2V0IG9mIGZpZWxkcywganVzdCBsaWtlIHVuaW9uIHt9IGluIEMrKy4gQ29uc2VxdWVudGx5LCB1bmlvbiBtZW1iZXJzIGFyZSBpbXBsaWNpdGx5IGNvbnNpZGVyZWQgb3B0aW9uYWwgKHNlZSByZXF1aXJlZG5lc3MpLgorCisgICAgWzEzXSBVbmlvbiAgICAgICAgICA6Oj0gICd1bmlvbicgSWRlbnRpZmllciAneHNkX2FsbCc/ICd7JyBGaWVsZCogJ30nCisKK04uQi46IFRoZSBgeHNkX2FsbGAga2V5d29yZCBoYXMgc29tZSBwdXJwb3NlIGludGVybmFsIHRvIEZhY2Vib29rIGJ1dCBzZXJ2ZXMgbm8gcHVycG9zZSBpbiBUaHJpZnQgaXRzZWxmLiBVc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkCisKKyMjIyBFeGNlcHRpb24KKworRXhjZXB0aW9ucyBhcmUgc2ltaWxhciB0byBzdHJ1Y3RzIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGludGVuZGVkIHRvIGludGVncmF0ZSB3aXRoIHRoZSBuYXRpdmUgZXhjZXB0aW9uIGhhbmRsaW5nIG1lY2hhbmlzbXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZXMuIFRoZSBuYW1lIG9mIGVhY2ggZmllbGQgbXVzdCBiZSB1bmlxdWUgd2l0aGluIHRoZSBleGNlcHRpb24uCisKKyAgICBbMTRdIEV4Y2VwdGlvbiAgICAgICA6Oj0gICdleGNlcHRpb24nIElkZW50aWZpZXIgJ3snIEZpZWxkKiAnfScKKworIyMjIFNlcnZpY2UKKworQSBzZXJ2aWNlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIGEgc2V0IG9mIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgYSBUaHJpZnQgc2VydmVyLiBUaGUgaW50ZXJmYWNlIGlzIHNpbXBseSBhIGxpc3Qgb2YgZnVuY3Rpb25zLiBBIHNlcnZpY2UgY2FuIGV4dGVuZCBhbm90aGVyIHNlcnZpY2UsIHdoaWNoIHNpbXBseSBtZWFucyB0aGF0IGl0IHByb3ZpZGVzIHRoZSBmdW5jdGlvbnMgb2YgdGhlIGV4dGVuZGVkIHNlcnZpY2UgaW4gYWRkaXRpb24gdG8gaXRzIG93bi4KKworICAgIFsxNV0gU2VydmljZSAgICAgICAgIDo6PSAgJ3NlcnZpY2UnIElkZW50aWZpZXIgKCAnZXh0ZW5kcycgSWRlbnRpZmllciApPyAneycgRnVuY3Rpb24qICd9JworCisjIyBGaWVsZAorCisgICAgWzE2XSBGaWVsZCAgICAgICAgICAgOjo9ICBGaWVsZElEPyBGaWVsZFJlcT8gRmllbGRUeXBlIElkZW50aWZpZXIgKCc9IENvbnN0VmFsdWUpPyBYc2RGaWVsZE9wdGlvbnMgTGlzdFNlcGFyYXRvcj8KKworIyMjIEZpZWxkIElECisKKyAgICBbMTddIEZpZWxkSUQgICAgICAgICA6Oj0gIEludENvbnN0YW50ICc6JworCisjIyMgRmllbGQgUmVxdWlyZWRuZXNzCisKK1RoZXJlIGFyZSB0d28gZXhwbGljaXQgcmVxdWlyZWRuZXNzIHZhbHVlcywgYW5kIGEgdGhpcmQgb25lIHRoYXQgaXMgYXBwbGllZCBpbXBsaWNpdHkgaWYgbmVpdGhlciAgKnJlcXVpcmVkKiBub3IgKm9wdGlvbmFsKiBhcmUgZ2l2ZW46ICpkZWZhdWx0KiByZXF1aXJlZG5lc3MuCisKKyAgICBbMThdIEZpZWxkUmVxICAgICAgICA6Oj0gICdyZXF1aXJlZCcgfCAnb3B0aW9uYWwnIAorCitUaGUgZ2VuZXJhbCBydWxlcyBmb3IgcmVxdWlyZWRuZXNzIGFyZSBhcyBmb2xsb3dzOgorCisjIyMjIHJlcXVpcmVkCisKKy0gV3JpdGU6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4gYW5kIGFyZSBleHBlY3RlZCB0byBiZSBzZXQuCistIFJlYWQ6IFJlcXVpcmVkIGZpZWxkcyBhcmUgYWx3YXlzIHJlYWQgYW5kIGFyZSBleHBlY3RlZCB0byBiZSBjb250YWluZWQgaW4gdGhlIGlucHV0IHN0cmVhbS4KKy0gRGVmYXVsdHMgdmFsdWVzOiBhcmUgYWx3YXlzIHdyaXR0ZW4KKworSWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGR1cmluZyByZWFkLCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyIGlzIHRvIGluZGljYXRlIGFuIHVuc3VjY2Vzc2Z1bCByZWFkIG9wZXJhdGlvbiB0byB0aGUgY2FsbGVyLCBlLmcuIGJ5IHRocm93aW5nIGFuIGV4Y2VwdGlvbiBvciByZXR1cm5pbmcgYW4gZXJyb3IuIAorCitCZWNhdXNlIG9mIHRoaXMgYmVoYXZpb3VyLCByZXF1aXJlZCBmaWVsZHMgZHJhc3RpY2FsbHkgbGltaXQgdGhlIG9wdGlvbnMgd2l0aCByZWdhcmQgdG8gc29mdCB2ZXJzaW9uaW5nLiBCZWNhdXNlIHRoZXkgbXVzdCBiZSBwcmVzZW50IG9uIHJlYWQsIHRoZSBmaWVsZHMgY2Fubm90IGJlIGRlcHJlY2F0ZWQuIElmIGEgcmVxdWlyZWQgZmllbGQgd291bGQgYmUgcmVtb3ZlZCAob3IgY2hhbmdlZCB0byBvcHRpb25hbCksIHRoZSBkYXRhIGFyZSBubyBsb25nZXIgY29tcGF0aWJsZSBiZXR3ZWVuIHZlcnNpb25zLgorCQorIyMjIyBvcHRpb25hbAorCistIFdyaXRlOiBPcHRpb25hbCBmaWVsZHMgYXJlIG9ubHkgd3JpdHRlbiB3aGVuIHRoZXkgYXJlIHNldAorLSBSZWFkOiBPcHRpb25hbCBmaWVsZHMgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCistIERlZmF1bHQgdmFsdWVzOiBhcmUgd3JpdHRlbiB3aGVuIHRoZSBpc3NldCBmbGFnIGlzIHNldAorCitNb3N0IGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucyB1c2UgdGhlIHJlY29tbWVuZGVkIHByYXRpY2Ugb2Ygc28tY2FsbGVkICJpc3NldCIgZmxhZ3MgdG8gaW5kaWNhdGUgd2hldGhlciBhIHBhcnRpY3VsYXIgb3B0aW9uYWwgZmllbGQgaXMgc2V0IG9yIG5vdC4gT25seSBmaWVsZHMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSB3cml0dGVuLCBhbmQgY29udmVyc2VseSB0aGUgZmxhZyBpcyBvbmx5IHNldCB3aGVuIGEgZmllbGQgdmFsdWUgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIAorCQorIyMjIyBkZWZhdWx0IHJlcXVpcmVkbmVzcyAoaW1wbGljaXQpCisKKy0gV3JpdGU6IEluIHRoZW9yeSwgdGhlIGZpZWxkcyBhcmUgYWx3YXlzIHdyaXR0ZW4uIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhhdCBydWxlLCBzZWUgYmVsb3cuCistIFJlYWQ6IExpa2Ugb3B0aW9uYWwsIHRoZSBmaWVsZCBtYXksIG9yIG1heSBub3QgYmUgcGFydCBvZiB0aGUgaW5wdXQgc3RyZWFtLiAKKy0gRGVmYXVsdCB2YWx1ZXM6IG1heSBub3QgYmUgd3JpdHRlbiAoc2VlIG5leHQgc2VjdGlvbikKKworRGVmYXVsdCByZXF1aXJlZG5lc3MgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZGVzaXJlZCBiZWhhdmlvdXIgaXMgYSBtaXggb2Ygb3B0aW9uYWwgYW5kIHJlcXVpcmVkLCBoZW5jZSB0aGUgaW50ZXJuYWwgbmFtZSAib3B0LWluLCByZXEtb3V0Ii4gQWx0aG91Z2ggaW4gdGhlb3J5IHRoZXNlIGZpZWxkcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiAoInJlcS1vdXQiKSwgaW4gcmVhbGl0eSB1bnNldCBmaWVsZHMgYXJlIG5vdCBhbHdheXMgd3JpdHRlbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlLCB3aGVuIHRoZSBmaWVsZCBjb250YWlucyBhIDxudWxsPiB2YWx1ZSwgd2hpY2ggYnkgZGVmaW5pdGlvbiBjYW5ub3QgYmUgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aHJpZnQuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbm90IHdyaXRpbmcgdGhhdCBmaWVsZCBhdCBhbGwsIGFuZCB0aGF0J3Mgd2hhdCBtb3N0IGxhbmd1YWdlcyBkby4KKwkKKyMjIyMgU2VtYW50aWNzIG9mIERlZmF1bHQgVmFsdWVzCisKK1RoZXJlIGFyZSBvbmdvaW5nIGRpc2N1c3Npb25zIGFib3V0IHRoYXQgdG9waWMsIHNlZSBKSVJBIGZvciBkZXRhaWxzLiBOb3QgYWxsIGltcGxlbWVudGF0aW9ucyB0cmVhdCBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgdmVyeSBzYW1lIHdheSwgYnV0IHRoZSBjdXJyZW50IHN0YXR1cyBxdW8gaXMgbW9yZSBvciBsZXNzIHRoYXQgZGVmYXVsdCBmaWVsZHMgYXJlIHR5cGljYWxseSBzZXQgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4gVGhlcmVmb3JlLCBhIHZhbHVlIHRoYXQgZXF1YWxzIHRoZSBkZWZhdWx0IG1heSBub3QgYmUgd3JpdHRlbiwgYmVjYXVzZSB0aGUgcmVhZCBlbmQgd2lsbCBzZXQgdGhlIHZhbHVlIGltcGxpY2l0bHkuIE9uIHRoZSBvdGhlciBoYW5kLCBhbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIHdyaXRlIHRoZSBkZWZhdWx0IHZhbHVlIGFueXdheXMsIGFzIHRoZXJlIGlzIG5vIGhhcmQgcmVzdHJpY3Rpb24gdGhhdCBwcmV2ZW50cyB0aGlzLiAKKworVGhlIG1ham9yIHBvaW50IHRvIGtlZXAgaW4gbWluZCBoZXJlIGlzIHRoZSBmYWN0LCB0aGF0IGFueSB1bndyaXR0ZW4gZGVmYXVsdCB2YWx1ZSBpbXBsaWNpdGx5IGJlY29tZXMgcGFydCBvZiB0aGUgaW50ZXJmYWNlIHZlcnNpb24uIElmIHRoYXQgZGVmYXVsdCBpcyBjaGFuZ2VkLCB0aGUgaW50ZXJmYWNlIGNoYW5nZXMuIElmLCBpbiBjb250cmFzdCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgd3JpdHRlbiBpbnRvIHRoZSBvdXRwdXQgZGF0YSwgdGhlIGRlZmF1bHQgaW4gdGhlIElETCBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIHdpdGhvdXQgYWZmZWN0aW5nIHNlcmlhbGl6ZWQgZGF0YS4KKworIyMjIFhTRCBPcHRpb25zCisKK04uQi46IFRoZXNlIGhhdmUgIHNvbWUgaW50ZXJuYWwgcHVycG9zZSBhdCBGYWNlYm9vayBidXQgc2VydmUgbm8gY3VycmVudCBwdXJwb3NlIGluIFRocmlmdC4gVXNlIG9mIHRoZXNlIG9wdGlvbnMgaXMgc3Ryb25nbHkgZGlzY291cmFnZWQuCisKKyAgICBbMTldIFhzZEZpZWxkT3B0aW9ucyA6Oj0gICd4c2Rfb3B0aW9uYWwnPyAneHNkX25pbGxhYmxlJz8gWHNkQXR0cnM/CisKKyAgICBbMjBdIFhzZEF0dHJzICAgICAgICA6Oj0gICd4c2RfYXR0cnMnICd7JyBGaWVsZCogJ30nCisKKyMjIEZ1bmN0aW9ucworCisgICAgWzIxXSBGdW5jdGlvbiAgICAgICAgOjo9ICAnb25ld2F5Jz8gRnVuY3Rpb25UeXBlIElkZW50aWZpZXIgJygnIEZpZWxkKiAnKScgVGhyb3dzPyBMaXN0U2VwYXJhdG9yPworCisgICAgWzIyXSBGdW5jdGlvblR5cGUgICAgOjo9ICBGaWVsZFR5cGUgfCAndm9pZCcKKworICAgIFsyM10gVGhyb3dzICAgICAgICAgIDo6PSAgJ3Rocm93cycgJygnIEZpZWxkKiAnKScKKworIyMgVHlwZXMKKworICAgIFsyNF0gRmllbGRUeXBlICAgICAgIDo6PSAgSWRlbnRpZmllciB8IEJhc2VUeXBlIHwgQ29udGFpbmVyVHlwZQorCisgICAgWzI1XSBEZWZpbml0aW9uVHlwZSAgOjo9ICBCYXNlVHlwZSB8IENvbnRhaW5lclR5cGUKKworICAgIFsyNl0gQmFzZVR5cGUgICAgICAgIDo6PSAgJ2Jvb2wnIHwgJ2J5dGUnIHwgJ2k4JyB8ICdpMTYnIHwgJ2kzMicgfCAnaTY0JyB8ICdkb3VibGUnIHwgJ3N0cmluZycgfCAnYmluYXJ5JyB8ICdzbGlzdCcKKworICAgIFsyN10gQ29udGFpbmVyVHlwZSAgIDo6PSAgTWFwVHlwZSB8IFNldFR5cGUgfCBMaXN0VHlwZQorCisgICAgWzI4XSBNYXBUeXBlICAgICAgICAgOjo9ICAnbWFwJyBDcHBUeXBlPyAnPCcgRmllbGRUeXBlICcsJyBGaWVsZFR5cGUgJz4nCisKKyAgICBbMjldIFNldFR5cGUgICAgICAgICA6Oj0gICdzZXQnIENwcFR5cGU/ICc8JyBGaWVsZFR5cGUgJz4nCisKKyAgICBbMzBdIExpc3RUeXBlICAgICAgICA6Oj0gICdsaXN0JyAnPCcgRmllbGRUeXBlICc+JyBDcHBUeXBlPworCisgICAgWzMxXSBDcHBUeXBlICAgICAgICAgOjo9ICAnY3BwX3R5cGUnIExpdGVyYWwKKworIyMgQ29uc3RhbnQgVmFsdWVzCisKKyAgICBbMzJdIENvbnN0VmFsdWUgICAgICA6Oj0gIEludENvbnN0YW50IHwgRG91YmxlQ29uc3RhbnQgfCBMaXRlcmFsIHwgSWRlbnRpZmllciB8IENvbnN0TGlzdCB8IENvbnN0TWFwCisKKyAgICBbMzNdIEludENvbnN0YW50ICAgICA6Oj0gICgnKycgfCAnLScpPyBEaWdpdCsKKworICAgIFszNF0gRG91YmxlQ29uc3RhbnQgIDo6PSAgKCcrJyB8ICctJyk/IERpZ2l0KiAoJy4nIERpZ2l0Kyk/ICggKCdFJyB8ICdlJykgSW50Q29uc3RhbnQgKT8KKworICAgIFszNV0gQ29uc3RMaXN0ICAgICAgIDo6PSAgJ1snIChDb25zdFZhbHVlIExpc3RTZXBhcmF0b3I/KSogJ10nCisKKyAgICBbMzZdIENvbnN0TWFwICAgICAgICA6Oj0gICd7JyAoQ29uc3RWYWx1ZSAnOicgQ29uc3RWYWx1ZSBMaXN0U2VwYXJhdG9yPykqICd9JworCisjIyBCYXNpYyBEZWZpbml0aW9ucworCisjIyMgTGl0ZXJhbAorCisgICAgWzM3XSBMaXRlcmFsICAgICAgICAgOjo9ICAoJyInIFteIl0qICciJykgfCAoIiciIFteJ10qICInIikKKworIyMjIElkZW50aWZpZXIKKworICAgIFszOF0gSWRlbnRpZmllciAgICAgIDo6PSAgKCBMZXR0ZXIgfCAnXycgKSAoIExldHRlciB8IERpZ2l0IHwgJy4nIHwgJ18nICkqCisKKyAgICBbMzldIFNUSWRlbnRpZmllciAgICA6Oj0gICggTGV0dGVyIHwgJ18nICkgKCBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICdfJyB8ICctJyApKgorCisjIyMgTGlzdCBTZXBhcmF0b3IKKworICAgIFs0MF0gTGlzdFNlcGFyYXRvciAgIDo6PSAgJywnIHwgJzsnCisKKyMjIyBMZXR0ZXJzIGFuZCBEaWdpdHMKKworICAgIFs0MV0gTGV0dGVyICAgICAgICAgIDo6PSAgWydBJy0nWiddIHwgWydhJy0neiddCisKKyAgICBbNDJdIERpZ2l0ICAgICAgICAgICA6Oj0gIFsnMCctJzknXQorCisjIyBFeGFtcGxlcworCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIFRocmlmdCBkZWZpbml0aW9ucywgdXNpbmcgdGhlIFRocmlmdCBJREw6CisKKyAqIFtUaHJpZnRUZXN0LnRocmlmdF1bXSB1c2VkIGJ5IHRoZSBUaHJpZnQgVGVzdEZyYW1ld29yaworICogVGhyaWZ0IFt0dXRvcmlhbF1bXQorICogRmFjZWJvb2sncyBbZmIzMDMudGhyaWZ0XVtdCisgKiBbQXBhY2hlIENhc3NhbmRyYSdzXVtdIFRocmlmdCBJREw6IFtjYXNzYW5kcmEudGhyaWZ0XVtdCisgKiBbRXZlcm5vdGUgQVBJXVtdCisKKyBbVGhyaWZ0VGVzdC50aHJpZnRdOiAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2FwYWNoZS90aHJpZnQvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyBbdHV0b3JpYWxdOiAgICAgICAgICAgL3R1dG9yaWFsLworIFtmYjMwMy50aHJpZnRdOiAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKKyBbQXBhY2hlIENhc3NhbmRyYSdzXTogaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnLworIFtjYXNzYW5kcmEudGhyaWZ0XTogICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2Nhc3NhbmRyYS90cnVuay9pbnRlcmZhY2UvY2Fzc2FuZHJhLnRocmlmdD92aWV3PWNvCisgW0V2ZXJub3RlIEFQSV06ICAgICAgIGh0dHA6Ly93d3cuZXZlcm5vdGUuY29tL2Fib3V0L2RldmVsb3Blci9hcGkvCisKKyMjIFRvIERvL1F1ZXN0aW9ucworCitJbml0aWFsaXphdGlvbiBvZiBCYXNlIFR5cGVzIGZvciBhbGwgTGFuZ3VhZ2VzPworCisgKiBEbyBhbGwgTGFuZ3VhZ2VzIGluaXRpYWxpemUgdGhlbSB0byAwLCBib29sPWZhbHNlIGFuZCBzdHJpbmc9IiI/IG9yIG51bGwsIHVuZGVmaW5lZD8KKworV2h5IGRvZXMgcG9zaXRpb24gb2YgYENwcFR5cGVgIHZhcnkgYmV0d2VlbiBgU2V0VHlwZWAgYW5kIGBMaXN0VHlwZWA/CisKKyAqIHN0ZDo6c2V0IGRvZXMgc29ydCB0aGUgZWxlbWVudHMgYXV0b21hdGljYWxseSwgdGhhdCdzIHRoZSBkZXNpZ24uIHNlZSBbVGhyaWZ0IFR5cGVzXSgvZG9jcy90eXBlcykgb3IgdGhlIFtDKysgc3RkOnNldCByZWZlcmVuY2VdW10gZm9yIGZ1cnRoZXIgZGV0YWlscworICogVGhlIHF1ZXN0aW9uIGlzLCBob3cgb3RoZXIgbGFuZ3VhZ2VzIGFyZSBkb2luZyB0aGF0PyBXaGF0IGFib3V0IGN1c3RvbSBvYmplY3RzLCBkbyB0aGV5IGhhdmUgYSBDb21wYXJlIGZ1bmN0aW9uIHRoZSBzZXQgdGhlIG9yZGVyIGNvcnJlY3RseT8KKworIFtDKysgc3RkOnNldCByZWZlcmVuY2VdOiBodHRwOi8vd3d3LmNwbHVzcGx1cy5jb20vcmVmZXJlbmNlL3N0bC9zZXQvCisKK1doeSBjYW4ndCBgRGVmaW5pdGlvblR5cGVgIGJlIHRoZSBzYW1lIGFzIGBGaWVsZFR5cGVgIChpLmUuIGluY2x1ZGUgYElkZW50aWZpZXJgKT8KKworRXhhbWluZSB0aGUgYHNtYWxsdGFsay5wcmVmaXhgIGFuZCBgc21hbGx0YWxrLmNhdGVnb3J5YCBzdGF0dXMgKGVzcCBgc21hbGx0YWxrLmNhdGVnb3J5YCwgd2hpY2ggdGFrZXMgYFNUSWRlbnRpZmllcmAgYXMgaXRzIGFyZ3VtZW50KS4uLgorCitXaGF0IHRvIGRvIGFib3V0IGBMaXN0U2VwYXJhdG9yYD8gRG8gd2UgcmVhbGx5IHdhbnQgdG8gYmUgYXMgbGF4IGFzIHdlIGN1cnJlbnRseSBhcmU/CisKK1Nob3VsZCBgRmllbGQqYCByZWFsbHkgYmUgYEZpZWxkK2AgaW4gYFN0cnVjdGAsIGBFbnVtYCwgZXRjLj8KKwpkaWZmIC0tZ2l0IGEvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODUyNjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1iaW5hcnktcHJvdG9jb2wubWQKQEAgLTAsMCArMSwyNTQgQEAKK1RocmlmdCBCaW5hcnkgcHJvdG9jb2wgZW5jb2RpbmcgCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnRzIGRlc2NyaWJlcyB0aGUgd2lyZSBlbmNvZGluZyBmb3IgUlBDIHVzaW5nIHRoZSBvbGRlciBUaHJpZnQgKmJpbmFyeSBwcm90b2NvbCouCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEgYW5kCiswLjkuMykuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsIHNob3VsZCBiZWhhdmUgdGhlIHNhbWUuCisKK0ZvciBiYWNrZ3JvdW5kIG9uIFRocmlmdCBzZWUgdGhlIFtUaHJpZnQgd2hpdGVwYXBlciAocGRmKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9zdGF0aWMvZmlsZXMvdGhyaWZ0LTIwMDcwNDAxLnBkZikuCisKKyMgQ29udGVudHMKKworKiBCaW5hcnkgcHJvdG9jb2wKKyAgKiBCYXNlIHR5cGVzCisgICogTWVzc2FnZQorICAqIFN0cnVjdAorICAqIExpc3QgYW5kIFNldAorICAqIE1hcAorKiBCTkYgbm90YXRpb24gdXNlZCBpbiB0aGlzIGRvY3VtZW50CisKKyMgQmluYXJ5IHByb3RvY29sCisKKyMjIEJhc2UgdHlwZXMKKworIyMjIEludGVnZXIgZW5jb2RpbmcKKworSW4gdGhlIF9iaW5hcnkgcHJvdG9jb2xfIGludGVnZXJzIGFyZSBlbmNvZGVkIHdpdGggdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAoYmlnIGVuZGlhbiBieXRlIG9yZGVyLCBha2EgbmV0d29yaworb3JkZXIpLiBBbiBgaW50OGAgbmVlZHMgMSBieXRlLCBhbiBgaW50MTZgIDIsIGFuIGBpbnQzMmAgNCBhbmQgYW4gYGludDY0YCBuZWVkcyA4IGJ5dGVzLgorCitUaGUgQ1BQIHZlcnNpb24gaGFzIHRoZSBvcHRpb24gdG8gdXNlIHRoZSBiaW5hcnkgcHJvdG9jb2wgd2l0aCBsaXR0bGUgZW5kaWFuIG9yZGVyLiBMaXR0bGUgZW5kaWFuIGdpdmVzIGEgc21hbGwgYnV0Citub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGJvb3N0IGJlY2F1c2UgY29udGVtcG9yYXJ5IENQVXMgdXNlIGxpdHRsZSBlbmRpYW4gd2hlbiBzdG9yaW5nIGludGVnZXJzIHRvIFJBTS4KKworIyMjIEVudW0gZW5jb2RpbmcKKworVGhlIGdlbmVyYXRlZCBjb2RlIGVuY29kZXMgYEVudW1gcyBieSB0YWtpbmcgdGhlIG9yZGluYWwgdmFsdWUgYW5kIHRoZW4gZW5jb2RpbmcgdGhhdCBhcyBhbiBpbnQzMi4KKworIyMjIEJpbmFyeSBlbmNvZGluZworCitCaW5hcnkgaXMgc2VudCBhcyBmb2xsb3dzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCwgYmluYXJ5IGRhdGEsIDQrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgYnl0ZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgYnl0ZXMgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgYnl0ZSBsZW5ndGhgIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYXJyYXksIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgaW4gbmV0d29yayAoYmlnIGVuZGlhbikgb3JkZXIgKG11c3QgYmUgPj0gMCkuCisqIGBieXRlc2AgYXJlIHRoZSBieXRlcyBvZiB0aGUgYnl0ZSBhcnJheS4KKworIyMjIFN0cmluZyBlbmNvZGluZworCisqU3RyaW5nKnMgYXJlIGZpcnN0IGVuY29kZWQgdG8gVVRGLTgsIGFuZCB0aGVuIHNlbmQgYXMgYmluYXJ5LgorCisjIyMgRG91YmxlIGVuY29kaW5nCisKK1ZhbHVlcyBvZiB0eXBlIGBkb3VibGVgIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50NjQgYWNjb3JkaW5nIHRvIHRoZSBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCAiZG91YmxlIGZvcm1hdCIgYml0CitsYXlvdXQuIE1vc3QgcnVuLXRpbWVzIHByb3ZpZGUgYSBsaWJyYXJ5IHRvIG1ha2UgdGhpcyBjb252ZXJzaW9uLiBCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYXMgdGhlIGNvbXBhY3QgcHJvdG9jb2wgdGhlbgorZW5jb2RlIHRoZSBpbnQ2NCBpbiA4IGJ5dGVzIGluIGJpZyBlbmRpYW4gb3JkZXIuCisKKyMjIyBCb29sZWFuIGVuY29kaW5nCisKK1ZhbHVlcyBvZiBgYm9vbGAgdHlwZSBhcmUgZmlyc3QgY29udmVydGVkIHRvIGFuIGludDguIFRydWUgaXMgY29udmVydGVkIHRvIGAxYCwgZmFsc2UgdG8gYDBgLgorCisjIyBNZXNzYWdlCisKK0EgYE1lc3NhZ2VgIGNhbiBiZSBlbmNvZGVkIGluIHR3byBkaWZmZXJlbnQgd2F5czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wgTWVzc2FnZSwgc3RyaWN0IGVuY29kaW5nLCAxMisgYnl0ZXM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworfDF2dnZ2dnZ2fHZ2dnZ2dnZ2fHVudXNlZCAgfDAwMDAwbW1tfCBuYW1lIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lICAgICAgICAgICAgICAgIHwgc2VxIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHZ2dnZ2dnZ2dnZ2dnZ2dmAgaXMgdGhlIHZlcnNpb24sIGFuIHVuc2lnbmVkIDE1IGJpdCBudW1iZXIgZml4ZWQgdG8gYDFgIChpbiBiaW5hcnk6IGAwMDAgMDAwMCAwMDAwIDAwMDFgKS4KKyAgVGhlIGxlYWRpbmcgYml0IGlzIGAxYC4KKyogYHVudXNlZGAgaXMgYW4gaWdub3JlZCBieXRlLgorKiBgbW1tYCBpcyB0aGUgbWVzc2FnZSB0eXBlLCBhbiB1bnNpZ25lZCAzIGJpdCBpbnRlZ2VyLiBUaGUgNSBsZWFkaW5nIGJpdHMgbXVzdCBiZSBgMGAgYXMgc29tZSBjbGllbnRzIChjaGVja2VkIGZvcgorICBqYXZhIGluIDAuOS4xKSB0YWtlIHRoZSB3aG9sZSBieXRlLgorKiBgbmFtZSBsZW5ndGhgIGlzIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgbmFtZSBmaWVsZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlciAobXVzdCBiZSA+PSAwKS4KKyogYG5hbWVgIGlzIHRoZSBtZXRob2QgbmFtZSwgYSBVVEYtOCBlbmNvZGVkIHN0cmluZy4KKyogYHNlcSBpZGAgaXMgdGhlIHNlcXVlbmNlIGlkLCBhIHNpZ25lZCAzMiBiaXQgaW50ZWdlciBlbmNvZGVkIGluIG5ldHdvcmsgKGJpZyBlbmRpYW4pIG9yZGVyLgorCitUaGUgc2Vjb25kLCBvbGRlciBlbmNvZGluZyAoYWthIG5vbi1zdHJpY3QpIGlzOgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBNZXNzYWdlLCBvbGQgZW5jb2RpbmcsIDkrIGJ5dGVzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsKK3wgbmFtZSBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8MDAwMDBtbW18IHNlcSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKworYGBgCisKK1doZXJlIGBuYW1lIGxlbmd0aGAsIGBuYW1lYCwgYG1tbWAsIGBzZXEgaWRgIGFyZSBhcyBhYm92ZS4KKworQmVjYXVzZSBgbmFtZSBsZW5ndGhgIG11c3QgYmUgcG9zaXRpdmUgKHRoZXJlZm9yZSB0aGUgZmlyc3QgYml0IGlzIGFsd2F5cyBgMGApLCB0aGUgZmlyc3QgYml0IGFsbG93cyB0aGUgcmVjZWl2ZXIgdG8gc2VlCit3aGV0aGVyIHRoZSBzdHJpY3QgZm9ybWF0IG9yIHRoZSBvbGQgZm9ybWF0IGlzIHVzZWQuIFRoZXJlZm9yZSBhIHNlcnZlciBhbmQgY2xpZW50IHVzaW5nIHRoZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhlCitiaW5hcnkgcHJvdG9jb2wgY2FuIHRyYW5zcGFyZW50bHkgdGFsayB3aXRoIGVhY2ggb3RoZXIuIEhvd2V2ZXIsIHdoZW4gc3RyaWN0IG1vZGUgaXMgZW5mb3JjZWQsIHRoZSBvbGQgZm9ybWF0IGlzCityZWplY3RlZC4KKworTWVzc2FnZSB0eXBlcyBhcmUgZW5jb2RlZCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCisqIF9DYWxsXzogMQorKiBfUmVwbHlfOiAyCisqIF9FeGNlcHRpb25fOiAzCisqIF9PbmV3YXlfOiA0CisKKyMjIFN0cnVjdAorCitBICpTdHJ1Y3QqIGlzIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGZpZWxkcywgZm9sbG93ZWQgYnkgYSBzdG9wIGZpZWxkLiBFYWNoIGZpZWxkIHN0YXJ0cyB3aXRoIGEgZmllbGQgaGVhZGVyIGFuZAoraXMgZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuIFRoZSBlbmNvZGluZyBjYW4gYmUgc3VtbWFyaXplZCBieSB0aGUgZm9sbG93aW5nIEJORjoKKworYGBgCitzdHJ1Y3QgICAgICAgIDo6PSAoIGZpZWxkLWhlYWRlciBmaWVsZC12YWx1ZSApKiBzdG9wLWZpZWxkCitmaWVsZC1oZWFkZXIgIDo6PSBmaWVsZC10eXBlIGZpZWxkLWlkCitgYGAKKworQmVjYXVzZSBlYWNoIGZpZWxkIGhlYWRlciBjb250YWlucyB0aGUgZmllbGQtaWQgKGFzIGRlZmluZWQgYnkgdGhlIFRocmlmdCBJREwgZmlsZSksIHRoZSBmaWVsZHMgY2FuIGJlIGVuY29kZWQgaW4gYW55CitvcmRlci4gVGhyaWZ0J3MgdHlwZSBzeXN0ZW0gaXMgbm90IGV4dGVuc2libGU7IHlvdSBjYW4gb25seSBlbmNvZGUgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RydWN0cy4gVGhlcmVmb3JlIGlzIGFsc28KK3Bvc3NpYmxlIHRvIGhhbmRsZSB1bmtub3duIGZpZWxkcyB3aGlsZSBkZWNvZGluZzsgdGhlc2UgYXJlIHNpbXBseSBpZ25vcmVkLiBXaGlsZSBkZWNvZGluZyB0aGUgZmllbGQgdHlwZSBjYW4gYmUgdXNlZCB0bworZGV0ZXJtaW5lIGhvdyB0byBkZWNvZGUgdGhlIGZpZWxkIHZhbHVlLgorCitOb3RlIHRoYXQgdGhlIGZpZWxkIG5hbWUgaXMgbm90IGVuY29kZWQgc28gZmllbGQgcmVuYW1lcyBpbiB0aGUgSURMIGRvIG5vdCBhZmZlY3QgZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworVGhlIGRlZmF1bHQgSmF2YSBpbXBsZW1lbnRhdGlvbiAoQXBhY2hlIFRocmlmdCAwLjkuMSkgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciB3aGVuIGl0IHRyaWVzIHRvIGRlY29kZSBhIGZpZWxkIHRoYXQgaGFzCithbm90aGVyIGZpZWxkLXR5cGUgdGhlbiB3aGF0IGlzIGV4cGVjdGVkLiBUaGVvcmV0aWNhbGx5IHRoaXMgY291bGQgYmUgZGV0ZWN0ZWQgYXQgdGhlIGNvc3Qgb2Ygc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nLgorT3RoZXIgaW1wbGVtZW50YXRpb24gbWF5IHBlcmZvcm0gdGhpcyBjaGVjayBhbmQgdGhlbiBlaXRoZXIgaWdub3JlIHRoZSBmaWVsZCwgb3IgcmV0dXJuIGEgcHJvdG9jb2wgZXhjZXB0aW9uLgorCitBICpVbmlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0IHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBhdCBtb3N0IDEgZmllbGQgbWF5IGJlIGVuY29kZWQuCisKK0FuICpFeGNlcHRpb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdC4KKworIyMjIFN0cnVjdCBlbmNvZGluZworCitJbiB0aGUgYmluYXJ5IHByb3RvY29sIGZpZWxkIGhlYWRlcnMgYW5kIHRoZSBzdG9wIGZpZWxkIGFyZSBlbmNvZGVkIGFzIGZvbGxvd3M6CisKK2BgYAorQmluYXJ5IHByb3RvY29sIGZpZWxkIGhlYWRlciBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfHR0dHR0dHR0fCBmaWVsZCBpZCAgICAgICAgfCBmaWVsZCB2YWx1ZSAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0JpbmFyeSBwcm90b2NvbCBzdG9wIGZpZWxkOgorKy0tLS0tLS0tKworfDAwMDAwMDAwfAorKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB0dHR0dHR0dGAgdGhlIGZpZWxkLXR5cGUsIGEgc2lnbmVkIDggYml0IGludGVnZXIuCisqIGBmaWVsZCBpZGAgdGhlIGZpZWxkLWlkLCBhIHNpZ25lZCAxNiBiaXQgaW50ZWdlciBpbiBiaWcgZW5kaWFuIG9yZGVyLgorKiBgZmllbGQtdmFsdWVgIHRoZSBlbmNvZGVkIGZpZWxkIHZhbHVlLgorCitUaGUgZm9sbG93aW5nIGZpZWxkLXR5cGVzIGFyZSB1c2VkOgorCisqIGBCT09MYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgNGAKKyogYEkxNmAsIGVuY29kZWQgYXMgYDZgCisqIGBJMzJgLCBlbmNvZGVkIGFzIGA4YAorKiBgSTY0YCwgZW5jb2RlZCBhcyBgMTBgCisqIGBTVFJJTkdgLCB1c2VkIGZvciBiaW5hcnkgYW5kIHN0cmluZyBmaWVsZHMsIGVuY29kZWQgYXMgYDExYAorKiBgU1RSVUNUYCwgdXNlZCBmb3Igc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKyogYE1BUGAsIGVuY29kZWQgYXMgYDEzYAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTRgCisqIGBMSVNUYCwgZW5jb2RlZCBhcyBgMTVgCisKKyMjIExpc3QgYW5kIFNldAorCitMaXN0IGFuZCBzZXRzIGFyZSBlbmNvZGVkIHRoZSBzYW1lOiBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlCitlbmNvZGVkIGVsZW1lbnRzLgorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBsaXN0ICg1KyBieXRlcykgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3x0dHR0dHR0dHwgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGB0dHR0dHR0dGAgaXMgdGhlIGVsZW1lbnQtdHlwZSwgZW5jb2RlZCBhcyBhbiBpbnQ4CisqIGBzaXplYCBpcyB0aGUgc2l6ZSwgZW5jb2RlZCBhcyBhbiBpbnQzMiwgcG9zaXRpdmUgdmFsdWVzIG9ubHkKKyogYGVsZW1lbnRzYCB0aGUgZWxlbWVudCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZSB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIGZpZWxkLXR5cGVzLiBUaGUgZnVsbCBsaXN0IGlzIGluY2x1ZGVkIGluIHRoZSBzdHJ1Y3Qgc2VjdGlvbiBhYm92ZS4KKworVGhlIG1heGltdW0gbGlzdC9zZXQgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMjIE1hcAorCitNYXBzIGFyZSBlbmNvZGVkIHdpdGggYSBoZWFkZXIgaW5kaWNhdGluZyB0aGUgc2l6ZSwgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUga2V5cyBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsCitmb2xsb3dlZCBieSB0aGUgZW5jb2RlZCBlbGVtZW50cy4gVGhlIGVuY29kaW5nIGZvbGxvd3MgdGhpcyBCTkY6CisKK2BgYAorbWFwICA6Oj0gIGtleS1lbGVtZW50LXR5cGUgdmFsdWUtZWxlbWVudC10eXBlIHNpemUgKCBrZXkgdmFsdWUgKSoKK2BgYAorCitgYGAKK0JpbmFyeSBwcm90b2NvbCBtYXAgKDYrIGJ5dGVzKSBhbmQga2V5IHZhbHVlIHBhaXJzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xra2tra2tra3x2dnZ2dnZ2dnwgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2V5IHZhbHVlIHBhaXJzICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworYGBgCisKK1doZXJlOgorCisqIGBra2tra2tra2AgaXMgdGhlIGtleSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgdnZ2dnZ2dnZgIGlzIHRoZSB2YWx1ZSBlbGVtZW50LXR5cGUsIGVuY29kZWQgYXMgYW4gaW50OAorKiBgc2l6ZWAgaXMgdGhlIHNpemUgb2YgdGhlIG1hcCwgZW5jb2RlZCBhcyBhbiBpbnQzMiwgcG9zaXRpdmUgdmFsdWVzIG9ubHkKKyogYGtleSB2YWx1ZSBwYWlyc2AgYXJlIHRoZSBlbmNvZGVkIGtleXMgYW5kIHZhbHVlcworCitUaGUgZWxlbWVudC10eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZmllbGQtdHlwZXMuIFRoZSBmdWxsIGxpc3QgaXMgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBzZWN0aW9uIGFib3ZlLgorCitUaGUgbWF4aW11bSBtYXAgc2l6ZSBpcyBjb25maWd1cmFibGUuIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gbGltaXQgKG1lYW5pbmcgdGhlIGxpbWl0IGlzIHRoZSBtYXhpbXVtIGludDMyIHZhbHVlOgorMjE0NzQ4MzY0NykuCisKKyMgQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCitUaGUgZm9sbG93aW5nIEJORiBub3RhdGlvbiBpcyB1c2VkOgorCisqIGEgcGx1cyBgK2AgYXBwZW5kZWQgdG8gYW4gaXRlbSByZXByZXNlbnRzIHJlcGV0aXRpb247IHRoZSBpdGVtIGlzIHJlcGVhdGVkIDEgb3IgbW9yZSB0aW1lcworKiBhIHN0YXIgYCpgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyBvcHRpb25hbCByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAwIG9yIG1vcmUgdGltZXMKKyogYSBwaXBlIGB8YCBiZXR3ZWVuIGl0ZW1zIHJlcHJlc2VudHMgY2hvaWNlLCB0aGUgZmlyc3QgbWF0Y2hpbmcgaXRlbSBpcyBzZWxlY3RlZAorKiBwYXJlbnRoZXNpcyBgKGAgYW5kIGApYCBhcmUgdXNlZCBmb3IgZ3JvdXBpbmcgbXVsdGlwbGUgaXRlbXMKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZCBiL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQ2N2RkCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kCkBAIC0wLDAgKzEsMjk0IEBACitUaHJpZnQgQ29tcGFjdCBwcm90b2NvbCBlbmNvZGluZyAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnRzIGRlc2NyaWJlcyB0aGUgd2lyZSBlbmNvZGluZyBmb3IgUlBDIHVzaW5nIHRoZSBUaHJpZnQgKmNvbXBhY3QgcHJvdG9jb2wqLgorCitUaGUgaW5mb3JtYXRpb24gaGVyZSBpcyBfbW9zdGx5XyBiYXNlZCBvbiB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgQXBhY2hlIHRocmlmdCBsaWJyYXJ5ICh2ZXJzaW9uIDAuOS4xKSBhbmQKK1tUSFJJRlQtMTEwIEEgbW9yZSBjb21wYWN0IGZvcm1hdF0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTEwKS4gT3RoZXIgaW1wbGVtZW50YXRpb24gaG93ZXZlciwKK3Nob3VsZCBiZWhhdmUgdGhlIHNhbWUuCisKK0ZvciBiYWNrZ3JvdW5kIG9uIFRocmlmdCBzZWUgdGhlIFtUaHJpZnQgd2hpdGVwYXBlciAocGRmKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9zdGF0aWMvZmlsZXMvdGhyaWZ0LTIwMDcwNDAxLnBkZikuCisKKyMgQ29udGVudHMKKworKiBDb21wYWN0IHByb3RvY29sCisgICogQmFzZSB0eXBlcworICAqIE1lc3NhZ2UKKyAgKiBTdHJ1Y3QKKyAgKiBMaXN0IGFuZCBTZXQKKyAgKiBNYXAKKyogQk5GIG5vdGF0aW9uIHVzZWQgaW4gdGhpcyBkb2N1bWVudAorCisjIENvbXBhY3QgcHJvdG9jb2wKKworIyMgQmFzZSB0eXBlcworCisjIyMgSW50ZWdlciBlbmNvZGluZworCitUaGUgX2NvbXBhY3QgcHJvdG9jb2xfIHVzZXMgbXVsdGlwbGUgZW5jb2RpbmdzIGZvciBpbnRzOiB0aGUgX3ppZ3phZyBpbnRfLCBhbmQgdGhlIF92YXIgaW50Xy4KKworVmFsdWVzIG9mIHR5cGUgYGludDMyYCBhbmQgYGludDY0YCBhcmUgZmlyc3QgdHJhbnNmb3JtZWQgdG8gYSAqemlnemFnIGludCouIEEgemlnemFnIGludCBmb2xkcyBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUKK251bWJlcnMgaW50byB0aGUgcG9zaXRpdmUgbnVtYmVyIHNwYWNlLiBXaGVuIHdlIHJlYWQgMCwgMSwgMiwgMywgNCBvciA1IGZyb20gdGhlIHdpcmUsIHRoaXMgaXMgdHJhbnNsYXRlZCB0byAwLCAtMSwgMSwKKy0yIG9yIDIgcmVzcGVjdGl2ZWx5LiBIZXJlIGFyZSB0aGUgKFNjYWxhKSBmb3JtdWxhcyB0byBjb252ZXJ0IGZyb20gaW50MzIvaW50NjQgdG8gYSB6aWd6YWcgaW50IGFuZCBiYWNrOgorCitgYGBzY2FsYQorZGVmIGludFRvWmlnWmFnKG46IEludCk6IEludCA9IChuIDw8IDEpIF4gKG4gPj4gMzEpCitkZWYgemlnemFnVG9JbnQobjogSW50KTogSW50ID0gKG4gPj4+IDEpIF4gLSAobiAmIDEpCitkZWYgbG9uZ1RvWmlnWmFnKG46IExvbmcpOiBMb25nID0gKG4gPDwgMSkgXiAobiA+PiA2MykKK2RlZiB6aWd6YWdUb0xvbmcobjogTG9uZyk6IExvbmcgPSAobiA+Pj4gMSkgXiAtIChuICYgMSkKK2BgYAorCitUaGUgemlnemFnIGludCBpcyB0aGVuIGVuY29kZWQgYXMgYSAqdmFyIGludCouIFZhciBpbnRzIHRha2UgMSB0byA1IGJ5dGVzIChpbnQzMikgb3IgMSB0byAxMCBieXRlcyAoaW50NjQpLiBUaGUgbW9zdAorc2lnbmlmaWNhbnQgYml0IG9mIGVhY2ggYnl0ZSBpbmRpY2F0ZXMgaWYgbW9yZSBieXRlcyBmb2xsb3cuIFRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCA3IGJpdHMgZnJvbSBlYWNoCitieXRlIGZvcm0gdGhlIG51bWJlciwgd2hlcmUgdGhlIGZpcnN0IGJ5dGUgaGFzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgKHNvIHRoZXkgYXJlIGluIGJpZyBlbmRpYW4gb3IgbmV0d29yayBvcmRlcikuCisKK1ZhciBpbnRzIGFyZSBzb21ldGltZXMgdXNlZCBkaXJlY3RseSBpbnNpZGUgdGhlIGNvbXBhY3QgcHJvdG9jb2wgdG8gcmVwcmVzZW50IHBvc2l0aXZlIG51bWJlcnMuCisKK1RvIGVuY29kZSBhbiBgaW50MTZgIGFzIHppZ3phZyBpbnQsIGl0IGlzIGZpcnN0IGNvbnZlcnRlZCB0byBhbiBgaW50MzJgIGFuZCB0aGVuIGVuY29kZWQgYXMgc3VjaC4gVGhlIHR5cGUgYGludDhgIHNpbXBseQordXNlcyBhIHNpbmdsZSBieXRlIGFzIGluIHRoZSBiaW5hcnkgcHJvdG9jb2wuCisKKyMjIyBFbnVtIGVuY29kaW5nCisKK1RoZSBnZW5lcmF0ZWQgY29kZSBlbmNvZGVzIGBFbnVtYHMgYnkgdGFraW5nIHRoZSBvcmRpbmFsIHZhbHVlIGFuZCB0aGVuIGVuY29kaW5nIHRoYXQgYXMgYW4gaW50MzIuCisKKyMjIyBCaW5hcnkgZW5jb2RpbmcKKworQmluYXJ5IGlzIHNlbnQgYXMgZm9sbG93czoKKworYGBgCitCaW5hcnkgcHJvdG9jb2wsIGJpbmFyeSBkYXRhLCAxKyBieXRlczoKKystLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfCBieXRlIGxlbmd0aCAgICAgICAgIHwgYnl0ZXMgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK2BgYAorCitXaGVyZToKKworKiBgYnl0ZSBsZW5ndGhgIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ5dGUgYXJyYXksIHVzaW5nIHZhciBpbnQgZW5jb2RpbmcgKG11c3QgYmUgPj0gMCkuCisqIGBieXRlc2AgYXJlIHRoZSBieXRlcyBvZiB0aGUgYnl0ZSBhcnJheS4KKworIyMjIFN0cmluZyBlbmNvZGluZworCisqU3RyaW5nKnMgYXJlIGZpcnN0IGVuY29kZWQgdG8gVVRGLTgsIGFuZCB0aGVuIHNlbmQgYXMgYmluYXJ5LgorCisjIyMgRG91YmxlIGVuY29kaW5nCisKK1ZhbHVlcyBvZiB0eXBlIGBkb3VibGVgIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYW4gaW50NjQgYWNjb3JkaW5nIHRvIHRoZSBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCAiZG91YmxlIGZvcm1hdCIgYml0CitsYXlvdXQuIE1vc3QgcnVuLXRpbWVzIHByb3ZpZGUgYSBsaWJyYXJ5IHRvIG1ha2UgdGhpcyBjb252ZXJzaW9uLiBCb3RoIHRoZSBiaW5hcnkgcHJvdG9jb2wgYXMgdGhlIGNvbXBhY3QgcHJvdG9jb2wgdGhlbgorZW5jb2RlIHRoZSBpbnQ2NCBpbiA4IGJ5dGVzIGluIGJpZyBlbmRpYW4gb3JkZXIuCisKKyMjIyBCb29sZWFuIGVuY29kaW5nCisKK0Jvb2xlYW5zIGFyZSBlbmNvZGVkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgZmllbGQgdmFsdWUgKGluIGEgc3RydWN0KSBvciBhbiBlbGVtZW50IHZhbHVlIChpbiBhIHNldCwKK2xpc3Qgb3IgbWFwKS4gRmllbGQgdmFsdWVzIGFyZSBlbmNvZGVkIGRpcmVjdGx5IGluIHRoZSBmaWVsZCBoZWFkZXIuIEVsZW1lbnQgdmFsdWVzIG9mIHR5cGUgYGJvb2xgIGFyZSBzZW50IGFzIGFuIGludDg7Cit0cnVlIGFzIGAxYCBhbmQgZmFsc2UgYXMgYDBgLgorCisjIyBNZXNzYWdlCisKK0EgYE1lc3NhZ2VgIG9uIHRoZSB3aXJlIGxvb2tzIGFzIGZvbGxvd3M6CisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBNZXNzYWdlICg0KyBieXRlcyk6CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8cHBwcHBwcHB8bW1tdnZ2dnZ8IHNlcSBpZCAgICAgICAgICAgICAgfCBuYW1lIGxlbmd0aCAgICAgICAgIHwgbmFtZSAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHBwcHBwcHBwYCBpcyB0aGUgcHJvdG9jb2wgaWQsIGZpeGVkIHRvIGAxMDAwIDAwMTBgLCAweDgyLgorKiBgbW1tYCBpcyB0aGUgbWVzc2FnZSB0eXBlLCBhbiB1bnNpZ25lZCAzIGJpdCBpbnRlZ2VyLgorKiBgdnZ2dnZgIGlzIHRoZSB2ZXJzaW9uLCBhbiB1bnNpZ25lZCA1IGJpdCBpbnRlZ2VyLCBmaXhlZCB0byBgMDAwMDFgLgorKiBgc2VxIGlkYCBpcyB0aGUgc2VxdWVuY2UgaWQsIGEgc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgYSB2YXIgaW50LgorKiBgbmFtZSBsZW5ndGhgIGlzIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgbmFtZSBmaWVsZCwgYSBzaWduZWQgMzIgYml0IGludGVnZXIgZW5jb2RlZCBhcyBhIHZhciBpbnQgKG11c3QgYmUgPj0gMCkuCisqIGBuYW1lYCBpcyB0aGUgbWV0aG9kIG5hbWUgdG8gaW52b2tlLCBhIFVURi04IGVuY29kZWQgc3RyaW5nLgorCitNZXNzYWdlIHR5cGVzIGFyZSBlbmNvZGVkIHdpdGggdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKyogX0NhbGxfOiAxCisqIF9SZXBseV86IDIKKyogX0V4Y2VwdGlvbl86IDMKKyogX09uZXdheV86IDQKKworIyMjIFN0cnVjdAorCitBICpTdHJ1Y3QqIGlzIGEgc2VxdWVuY2Ugb2YgemVybyBvciBtb3JlIGZpZWxkcywgZm9sbG93ZWQgYnkgYSBzdG9wIGZpZWxkLiBFYWNoIGZpZWxkIHN0YXJ0cyB3aXRoIGEgZmllbGQgaGVhZGVyIGFuZAoraXMgZm9sbG93ZWQgYnkgdGhlIGVuY29kZWQgZmllbGQgdmFsdWUuIFRoZSBlbmNvZGluZyBjYW4gYmUgc3VtbWFyaXplZCBieSB0aGUgZm9sbG93aW5nIEJORjoKKworYGBgCitzdHJ1Y3QgICAgICAgIDo6PSAoIGZpZWxkLWhlYWRlciBmaWVsZC12YWx1ZSApKiBzdG9wLWZpZWxkCitmaWVsZC1oZWFkZXIgIDo6PSBmaWVsZC10eXBlIGZpZWxkLWlkCitgYGAKKworQmVjYXVzZSBlYWNoIGZpZWxkIGhlYWRlciBjb250YWlucyB0aGUgZmllbGQtaWQgKGFzIGRlZmluZWQgYnkgdGhlIFRocmlmdCBJREwgZmlsZSksIHRoZSBmaWVsZHMgY2FuIGJlIGVuY29kZWQgaW4gYW55CitvcmRlci4gVGhyaWZ0J3MgdHlwZSBzeXN0ZW0gaXMgbm90IGV4dGVuc2libGU7IHlvdSBjYW4gb25seSBlbmNvZGUgdGhlIHByaW1pdGl2ZSB0eXBlcyBhbmQgc3RydWN0cy4gVGhlcmVmb3JlIGlzIGFsc28KK3Bvc3NpYmxlIHRvIGhhbmRsZSB1bmtub3duIGZpZWxkcyB3aGlsZSBkZWNvZGluZzsgdGhlc2UgYXJlIHNpbXBseSBpZ25vcmVkLiBXaGlsZSBkZWNvZGluZyB0aGUgZmllbGQgdHlwZSBjYW4gYmUgdXNlZCB0bworZGV0ZXJtaW5lIGhvdyB0byBkZWNvZGUgdGhlIGZpZWxkIHZhbHVlLgorCitOb3RlIHRoYXQgdGhlIGZpZWxkIG5hbWUgaXMgbm90IGVuY29kZWQgc28gZmllbGQgcmVuYW1lcyBpbiB0aGUgSURMIGRvIG5vdCBhZmZlY3QgZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworVGhlIGRlZmF1bHQgSmF2YSBpbXBsZW1lbnRhdGlvbiAoQXBhY2hlIFRocmlmdCAwLjkuMSkgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciB3aGVuIGl0IHRyaWVzIHRvIGRlY29kZSBhIGZpZWxkIHRoYXQgaGFzCithbm90aGVyIGZpZWxkLXR5cGUgdGhhbiB3aGF0IGlzIGV4cGVjdGVkLiBUaGVvcmV0aWNhbGx5IHRoaXMgY291bGQgYmUgZGV0ZWN0ZWQgYXQgdGhlIGNvc3Qgb2Ygc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nLgorT3RoZXIgaW1wbGVtZW50YXRpb24gbWF5IHBlcmZvcm0gdGhpcyBjaGVjayBhbmQgdGhlbiBlaXRoZXIgaWdub3JlIHRoZSBmaWVsZCwgb3IgcmV0dXJuIGEgcHJvdG9jb2wgZXhjZXB0aW9uLgorCitBICpVbmlvbiogaXMgZW5jb2RlZCBleGFjdGx5IHRoZSBzYW1lIGFzIGEgc3RydWN0IHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBhdCBtb3N0IDEgZmllbGQgbWF5IGJlIGVuY29kZWQuCisKK0FuICpFeGNlcHRpb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdC4KKworIyMjIFN0cnVjdCBlbmNvZGluZworCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgZmllbGQgaGVhZGVyIChzaG9ydCBmb3JtKSBhbmQgZmllbGQgdmFsdWU6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworfGRkZGR0dHR0fCBmaWVsZCB2YWx1ZSAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgZmllbGQgaGVhZGVyICgxIHRvIDMgYnl0ZXMsIGxvbmcgZm9ybSkgYW5kIGZpZWxkIHZhbHVlOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCit8MDAwMHR0dHR8IGZpZWxkIGlkICAgICAgICAgICAgfCBmaWVsZCB2YWx1ZSAgICAgICAgIHwKKystLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIHN0b3AgZmllbGQ6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYGRkZGRgIGlzIHRoZSBmaWVsZCBpZCBkZWx0YSwgYW4gdW5zaWduZWQgNCBiaXRzIGludGVnZXIsIHN0cmljdGx5IHBvc2l0aXZlLgorKiBgdHR0dGAgaXMgZmllbGQtdHlwZSBpZCwgYW4gdW5zaWduZWQgNCBiaXQgaW50ZWdlci4KKyogYGZpZWxkIGlkYCB0aGUgZmllbGQgaWQsIGEgc2lnbmVkIDE2IGJpdCBpbnRlZ2VyIGVuY29kZWQgYXMgemlnemFnIGludC4KKyogYGZpZWxkLXZhbHVlYCB0aGUgZW5jb2RlZCBmaWVsZCB2YWx1ZS4KKworVGhlIGZpZWxkIGlkIGRlbHRhIGNhbiBiZSBjb21wdXRlZCBieSBgY3VycmVudC1maWVsZC1pZCAtIHByZXZpb3VzLWZpZWxkLWlkYCwgb3IganVzdCBgY3VycmVudC1maWVsZC1pZGAgaWYgdGhpcyBpcyB0aGUKK2ZpcnN0IG9mIHRoZSBzdHJ1Y3QuIFRoZSBzaG9ydCBmb3JtIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGZpZWxkIGlkIGRlbHRhIGlzIGluIHRoZSByYW5nZSAxIC0gMTUgKGluY2x1c2l2ZSkuCisKK1RoZSBmb2xsb3dpbmcgZmllbGQtdHlwZXMgY2FuIGJlIGVuY29kZWQ6CisKKyogYEJPT0xFQU5fVFJVRWAsIGVuY29kZWQgYXMgYDFgCisqIGBCT09MRUFOX0ZBTFNFYCwgZW5jb2RlZCBhcyBgMmAKKyogYEJZVEVgLCBlbmNvZGVkIGFzIGAzYAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNGAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDVgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGA2YAorKiBgRE9VQkxFYCwgZW5jb2RlZCBhcyBgN2AKKyogYEJJTkFSWWAsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgOGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGA5YAorKiBgU0VUYCwgZW5jb2RlZCBhcyBgMTBgCisqIGBNQVBgLCBlbmNvZGVkIGFzIGAxMWAKKyogYFNUUlVDVGAsIHVzZWQgZm9yIGJvdGggc3RydWN0cyBhbmQgdW5pb24gZmllbGRzLCBlbmNvZGVkIGFzIGAxMmAKKworTm90ZSB0aGF0IGJlY2F1c2UgdGhlcmUgYXJlIDIgc3BlY2lmaWMgZmllbGQgdHlwZXMgZm9yIHRoZSBib29sZWFuIHZhbHVlcywgdGhlIGVuY29kaW5nIG9mIGEgYm9vbGVhbiBmaWVsZCB2YWx1ZSBoYXMgbm8KK2xlbmd0aCAoMCBieXRlcykuCisKKyMjIExpc3QgYW5kIFNldAorCitMaXN0IGFuZCBzZXRzIGFyZSBlbmNvZGVkIHRoZSBzYW1lOiBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplIGFuZCB0aGUgZWxlbWVudC10eXBlIG9mIHRoZSBlbGVtZW50cywgZm9sbG93ZWQgYnkgdGhlCitlbmNvZGVkIGVsZW1lbnRzLgorCitgYGAKK0NvbXBhY3QgcHJvdG9jb2wgbGlzdCBoZWFkZXIgKDEgYnl0ZSwgc2hvcnQgZm9ybSkgYW5kIGVsZW1lbnRzOgorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3xzc3NzdHR0dHwgZWxlbWVudHMgICAgICAgICAgICB8CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKworCitDb21wYWN0IHByb3RvY29sIGxpc3QgaGVhZGVyICgyKyBieXRlcywgbG9uZyBmb3JtKSBhbmQgZWxlbWVudHM6CisrLS0tLS0tLS0rLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wxMTExdHR0dHwgc2l6ZSAgICAgICAgICAgICAgICB8IGVsZW1lbnRzICAgICAgICAgICAgfAorKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHNzc3NgIGlzIHRoZSBzaXplLCA0IGJpdCB1bnNpZ25lZCBpbnQsIHZhbHVlcyBgMGAgLSBgMTRgCisqIGB0dHR0YCBpcyB0aGUgZWxlbWVudC10eXBlLCBhIDQgYml0IHVuc2lnbmVkIGludAorKiBgc2l6ZWAgaXMgdGhlIHNpemUsIGEgdmFyIGludCAoaW50MzIpLCBwb3NpdGl2ZSB2YWx1ZXMgYDE1YCBvciBoaWdoZXIKKyogYGVsZW1lbnRzYCBhcmUgdGhlIGVuY29kZWQgZWxlbWVudHMKKworVGhlIHNob3J0IGZvcm0gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgbGVuZ3RoIGlzIGluIHRoZSByYW5nZSAwIC0gMTQgKGluY2x1c2l2ZSkuCisKK1RoZSBmb2xsb3dpbmcgZWxlbWVudC10eXBlcyBhcmUgdXNlZCAobm90ZSB0aGF0IHRoZXNlIGFyZSBfZGlmZmVyZW50XyBmcm9tIHRoZSBmaWVsZC10eXBlcyk6CisKKyogYEJPT0xgLCBlbmNvZGVkIGFzIGAyYAorKiBgQllURWAsIGVuY29kZWQgYXMgYDNgCisqIGBET1VCTEVgLCBlbmNvZGVkIGFzIGA0YAorKiBgSTE2YCwgZW5jb2RlZCBhcyBgNmAKKyogYEkzMmAsIGVuY29kZWQgYXMgYDhgCisqIGBJNjRgLCBlbmNvZGVkIGFzIGAxMGAKKyogYFNUUklOR2AsIHVzZWQgZm9yIGJpbmFyeSBhbmQgc3RyaW5nIGZpZWxkcywgZW5jb2RlZCBhcyBgMTFgCisqIGBTVFJVQ1RgLCB1c2VkIGZvciBzdHJ1Y3RzIGFuZCB1bmlvbiBmaWVsZHMsIGVuY29kZWQgYXMgYDEyYAorKiBgTUFQYCwgZW5jb2RlZCBhcyBgMTNgCisqIGBTRVRgLCBlbmNvZGVkIGFzIGAxNGAKKyogYExJU1RgLCBlbmNvZGVkIGFzIGAxNWAKKworCitUaGUgbWF4aW11bSBsaXN0L3NldCBzaXplIGlzIGNvbmZpZ3VyYWJsZS4gQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBsaW1pdCAobWVhbmluZyB0aGUgbGltaXQgaXMgdGhlIG1heGltdW0gaW50MzIgdmFsdWU6CisyMTQ3NDgzNjQ3KS4KKworIyMgTWFwCisKK01hcHMgYXJlIGVuY29kZWQgd2l0aCBhIGhlYWRlciBpbmRpY2F0aW5nIHRoZSBzaXplLCB0aGUgdHlwZSBvZiB0aGUga2V5cyBhbmQgdGhlIGVsZW1lbnQtdHlwZSBvZiB0aGUgZWxlbWVudHMsIGZvbGxvd2VkCitieSB0aGUgZW5jb2RlZCBlbGVtZW50cy4gVGhlIGVuY29kaW5nIGZvbGxvd3MgdGhpcyBCTkY6CisKK2BgYAorbWFwICAgICAgICAgICA6Oj0gZW1wdHktbWFwIHwgbm9uLWVtcHR5LW1hcAorZW1wdHktbWFwICAgICA6Oj0gYDBgCitub24tZW1wdHktbWFwIDo6PSBzaXplIGtleS1lbGVtZW50LXR5cGUgdmFsdWUtZWxlbWVudC10eXBlIChrZXkgdmFsdWUpKworYGBgCisKK2BgYAorQ29tcGFjdCBwcm90b2NvbCBtYXAgaGVhZGVyICgxIGJ5dGUsIGVtcHR5IG1hcCk6CisrLS0tLS0tLS0rCit8MDAwMDAwMDB8CisrLS0tLS0tLS0rCisKK0NvbXBhY3QgcHJvdG9jb2wgbWFwIGhlYWRlciAoMisgYnl0ZXMsIG5vbiBlbXB0eSBtYXApIGFuZCBrZXkgdmFsdWUgcGFpcnM6CisrLS0tLS0tLS0rLi4uKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy4uListLS0tLS0tLSsKK3wgc2l6ZSAgICAgICAgICAgICAgICB8a2tra3Z2dnZ8IGtleSB2YWx1ZSBwYWlycyAgICAgfAorKy0tLS0tLS0tKy4uListLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsuLi4rLS0tLS0tLS0rCitgYGAKKworV2hlcmU6CisKKyogYHNpemVgIGlzIHRoZSBzaXplLCBhIHZhciBpbnQgKGludDMyKSwgc3RyaWN0bHkgcG9zaXRpdmUgdmFsdWVzCisqIGBra2trYCBpcyB0aGUga2V5IGVsZW1lbnQtdHlwZSwgYSA0IGJpdCB1bnNpZ25lZCBpbnQKKyogYHZ2dnZgIGlzIHRoZSB2YWx1ZSBlbGVtZW50LXR5cGUsIGEgNCBiaXQgdW5zaWduZWQgaW50CisqIGBrZXkgdmFsdWUgcGFpcnNgIGFyZSB0aGUgZW5jb2RlZCBrZXlzIGFuZCB2YWx1ZXMKKworVGhlIGVsZW1lbnQtdHlwZXMgYXJlIHRoZSBzYW1lIGFzIGZvciBsaXN0cy4gVGhlIGZ1bGwgbGlzdCBpcyBpbmNsdWRlZCBpbiB0aGUgJ0xpc3QgYW5kIHNldCcgc2VjdGlvbi4KKworVGhlIG1heGltdW0gbWFwIHNpemUgaXMgY29uZmlndXJhYmxlLiBCeSBkZWZhdWx0IHRoZXJlIGlzIG5vIGxpbWl0IChtZWFuaW5nIHRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBpbnQzMiB2YWx1ZToKKzIxNDc0ODM2NDcpLgorCisjIEJORiBub3RhdGlvbiB1c2VkIGluIHRoaXMgZG9jdW1lbnQKKworVGhlIGZvbGxvd2luZyBCTkYgbm90YXRpb24gaXMgdXNlZDoKKworKiBhIHBsdXMgYCtgIGFwcGVuZGVkIHRvIGFuIGl0ZW0gcmVwcmVzZW50cyByZXBldGl0aW9uOyB0aGUgaXRlbSBpcyByZXBlYXRlZCAxIG9yIG1vcmUgdGltZXMKKyogYSBzdGFyIGAqYCBhcHBlbmRlZCB0byBhbiBpdGVtIHJlcHJlc2VudHMgb3B0aW9uYWwgcmVwZXRpdGlvbjsgdGhlIGl0ZW0gaXMgcmVwZWF0ZWQgMCBvciBtb3JlIHRpbWVzCisqIGEgcGlwZSBgfGAgYmV0d2VlbiBpdGVtcyByZXByZXNlbnRzIGNob2ljZSwgdGhlIGZpcnN0IG1hdGNoaW5nIGl0ZW0gaXMgc2VsZWN0ZWQKKyogcGFyZW50aGVzaXMgYChgIGFuZCBgKWAgYXJlIHVzZWQgZm9yIGdyb3VwaW5nIG11bHRpcGxlIGl0ZW1zCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LXByb3RvY29sLXNwZWMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxYTYxYwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtcHJvdG9jb2wtc3BlYy5tZApAQCAtMCwwICsxLDEwMSBAQAorVGhyaWZ0IFByb3RvY29sIFN0cnVjdHVyZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGFzdCBNb2RpZmllZDogMjAwNy1KdW4tMjkKKworPCEtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLT4KKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgVGhyaWZ0IHByb3RvY29sCit3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nLiBUaHVzLCB0aGUgb3JkZXIgb2YgZWxlbWVudHMKK2NvdWxkIGluIHNvbWUgY2FzZXMgYmUgcmVhcnJhbmdlZCBkZXBlbmRpbmcgdXBvbiB0aGUgVFByb3RvY29sCitpbXBsZW1lbnRhdGlvbiwgYnV0IHRoaXMgZG9jdW1lbnQgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIHJlcXVpcmVkCitzdHJ1Y3R1cmUuIFRoZXJlIGFyZSBzb21lICJkdW1iIiB0ZXJtaW5hbHMgbGlrZSBTVFJJTkcgYW5kIElOVAordGhhdCB0YWtlIHRoZSBwbGFjZSBvZiBhbiBhY3R1YWwgZW5jb2Rpbmcgc3BlY2lmaWNhdGlvbi4KKworVGhleSBrZXkgcG9pbnQgdG8gbm90aWNlIGlzIHRoYXQgQUxMIG1lc3NhZ2VzIGFyZSBqdXN0IG9uZSB3cmFwcGVkCitgPHN0cnVjdD5gLiBEZXBlbmRpbmcgdXBvbiB0aGUgbWVzc2FnZSB0eXBlLCB0aGUgYDxzdHJ1Y3Q+YCBjYW4gYmUKK2ludGVycHJldGVkIGFzIHRoZSBhcmd1bWVudCBsaXN0IHRvIGEgZnVuY3Rpb24sIHRoZSByZXR1cm4gdmFsdWUKK29mIGEgZnVuY3Rpb24sIG9yIGFuIGV4Y2VwdGlvbi4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBgCisgICAgICAgPG1lc3NhZ2U+IDo6PSA8bWVzc2FnZS1iZWdpbj4gPHN0cnVjdD4gPG1lc3NhZ2UtZW5kPgorCisgPG1lc3NhZ2UtYmVnaW4+IDo6PSA8bWV0aG9kLW5hbWU+IDxtZXNzYWdlLXR5cGU+IDxtZXNzYWdlLXNlcWlkPgorCisgICA8bWV0aG9kLW5hbWU+IDo6PSBTVFJJTkcKKworICA8bWVzc2FnZS10eXBlPiA6Oj0gVF9DQUxMIHwgVF9SRVBMWSB8IFRfRVhDRVBUSU9OIHwgVF9PTkVXQVkKKworIDxtZXNzYWdlLXNlcWlkPiA6Oj0gSTMyCisKKyAgICAgICAgPHN0cnVjdD4gOjo9IDxzdHJ1Y3QtYmVnaW4+IDxmaWVsZD4qIDxmaWVsZC1zdG9wPiA8c3RydWN0LWVuZD4KKworICA8c3RydWN0LWJlZ2luPiA6Oj0gPHN0cnVjdC1uYW1lPgorCisgICA8c3RydWN0LW5hbWU+IDo6PSBTVFJJTkcKKworICAgIDxmaWVsZC1zdG9wPiA6Oj0gVF9TVE9QCisKKyAgICAgICAgIDxmaWVsZD4gOjo9IDxmaWVsZC1iZWdpbj4gPGZpZWxkLWRhdGE+IDxmaWVsZC1lbmQ+CisKKyAgIDxmaWVsZC1iZWdpbj4gOjo9IDxmaWVsZC1uYW1lPiA8ZmllbGQtdHlwZT4gPGZpZWxkLWlkPgorCisgICAgPGZpZWxkLW5hbWU+IDo6PSBTVFJJTkcKKworICAgIDxmaWVsZC10eXBlPiA6Oj0gVF9CT09MIHwgVF9CWVRFIHwgVF9JOCB8IFRfSTE2IHwgVF9JMzIgfCBUX0k2NCB8IFRfRE9VQkxFCisgICAgICAgICAgICAgICAgICAgICB8IFRfU1RSSU5HIHwgVF9CSU5BUlkgfCBUX1NUUlVDVCB8IFRfTUFQIHwgVF9TRVQgfCBUX0xJU1QKKworICAgICAgPGZpZWxkLWlkPiA6Oj0gSTE2CisKKyAgICA8ZmllbGQtZGF0YT4gOjo9IEk4IHwgSTE2IHwgSTMyIHwgSTY0IHwgRE9VQkxFIHwgU1RSSU5HIHwgQklOQVJZCisgICAgICAgICAgICAgICAgICAgICA8c3RydWN0PiB8IDxtYXA+IHwgPGxpc3Q+IHwgPHNldD4KKworICAgICAgICAgICA8bWFwPiA6Oj0gPG1hcC1iZWdpbj4gPGZpZWxkLWRhdHVtPiogPG1hcC1lbmQ+CisKKyAgICAgPG1hcC1iZWdpbj4gOjo9IDxtYXAta2V5LXR5cGU+IDxtYXAtdmFsdWUtdHlwZT4gPG1hcC1zaXplPgorCisgIDxtYXAta2V5LXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KKworPG1hcC12YWx1ZS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKyAgICAgIDxtYXAtc2l6ZT4gOjo9IEkzMgorCisgICAgICAgICAgPGxpc3Q+IDo6PSA8bGlzdC1iZWdpbj4gPGZpZWxkLWRhdGE+KiA8bGlzdC1lbmQ+CisKKyAgICA8bGlzdC1iZWdpbj4gOjo9IDxsaXN0LWVsZW0tdHlwZT4gPGxpc3Qtc2l6ZT4KKworPGxpc3QtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+CisKKyAgICAgPGxpc3Qtc2l6ZT4gOjo9IEkzMgorCisgICAgICAgICAgIDxzZXQ+IDo6PSA8c2V0LWJlZ2luPiA8ZmllbGQtZGF0YT4qIDxzZXQtZW5kPgorCisgICAgIDxzZXQtYmVnaW4+IDo6PSA8c2V0LWVsZW0tdHlwZT4gPHNldC1zaXplPgorCisgPHNldC1lbGVtLXR5cGU+IDo6PSA8ZmllbGQtdHlwZT4KKworICAgICAgPHNldC1zaXplPiA6Oj0gSTMyCitgYGAKZGlmZiAtLWdpdCBhL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kIGIvZG9jL3NwZWNzL3RocmlmdC1ycGMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1YzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtcnBjLm1kCkBAIC0wLDAgKzEsMTc4IEBACitUaHJpZnQgUmVtb3RlIFByb2NlZHVyZSBDYWxsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKzwhLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0+CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBoaWdoIGxldmVsIG1lc3NhZ2UgZXhjaGFuZ2UgYmV0d2VlbiB0aGUgVGhyaWZ0IFJQQyBjbGllbnQgYW5kIHNlcnZlci4KK1NlZSBbdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZF0gYW5kIFt0aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZF0gZm9yIGEgZGVzY3JpcHRpb24gb2YgaG93IHRoZSBleGNoYW5nZXMgYXJlIGVuY29kZWQgb24KK3RoZSB3aXJlLgorCitJbiBhZGRpdGlvbiwgdGhpcyBkb2N1bWVudCBjb21wYXJlcyB0aGUgYmluYXJ5IHByb3RvY29sIHdpdGggdGhlIGNvbXBhY3QgcHJvdG9jb2wuIEZpbmFsbHkgaXQgZGVzY3JpYmVzIHRoZSBmcmFtZWQgdnMuCit1bmZyYW1lZCB0cmFuc3BvcnQuCisKK1RoZSBpbmZvcm1hdGlvbiBoZXJlIGlzIF9tb3N0bHlfIGJhc2VkIG9uIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uIGluIHRoZSBBcGFjaGUgdGhyaWZ0IGxpYnJhcnkgKHZlcnNpb24gMC45LjEgYW5kCiswLjkuMykuIE90aGVyIGltcGxlbWVudGF0aW9uIGhvd2V2ZXIsIHNob3VsZCBiZWhhdmUgdGhlIHNhbWUuCisKK0ZvciBiYWNrZ3JvdW5kIG9uIFRocmlmdCBzZWUgdGhlIFtUaHJpZnQgd2hpdGVwYXBlciAocGRmKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9zdGF0aWMvZmlsZXMvdGhyaWZ0LTIwMDcwNDAxLnBkZikuCisKKyMgQ29udGVudHMKKworKiBUaHJpZnQgTWVzc2FnZSBleGNoYW5nZSBmb3IgUmVtb3RlIFByb2NlZHVyZSBDYWxsCisgICogTWVzc2FnZQorICAqIFJlcXVlc3Qgc3RydWN0CisgICogUmVzcG9uc2Ugc3RydWN0CisqIFByb3RvY29sIGNvbnNpZGVyYXRpb25zCisgICogQ29tcGFyaW5nIGJpbmFyeSBhbmQgY29tcGFjdCBwcm90b2NvbAorICAqIENvbXBhdGliaWxpdHkKKyAgKiBGcmFtZWQgdnMgdW5mcmFtZWQgdHJhbnNwb3J0CisKKyMgVGhyaWZ0IFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBNZXNzYWdlIGV4Y2hhbmdlCisKK0JvdGggdGhlIGJpbmFyeSBwcm90b2NvbCBhbmQgdGhlIGNvbXBhY3QgcHJvdG9jb2wgYXNzdW1lIGEgdHJhbnNwb3J0IGxheWVyIHRoYXQgZXhwb3NlcyBhIGJpLWRpcmVjdGlvbmFsIGJ5dGUgc3RyZWFtLAorZm9yIGV4YW1wbGUgYSBUQ1Agc29ja2V0LiBCb3RoIHVzZSB0aGUgZm9sbG93aW5nIGV4Y2hhbmdlOgorCisxLiBDbGllbnQgc2VuZHMgYSBgTWVzc2FnZWAgKHR5cGUgYENhbGxgIG9yIGBPbmV3YXlgKS4gVGhlIFRNZXNzYWdlIGNvbnRhaW5zIHNvbWUgbWV0YWRhdGEgYW5kIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgIHRvIGludm9rZS4KKzIuIENsaWVudCBzZW5kcyBtZXRob2QgYXJndW1lbnRzIChhIHN0cnVjdCBkZWZpbmVkIGJ5IHRoZSBnZW5lcmF0ZSBjb2RlKS4KKzMuIFNlcnZlciBzZW5kcyBhIGBNZXNzYWdlYCAodHlwZSBgUmVwbHlgIG9yIGBFeGNlcHRpb25gKSB0byBzdGFydCB0aGUgcmVzcG9uc2UuCis0LiBTZXJ2ZXIgc2VuZHMgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbWV0aG9kIHJlc3VsdCBvciBleGNlcHRpb24uCisKK1RoZSBwYXR0ZXJuIGlzIGEgc2ltcGxlIGhhbGYgZHVwbGV4IHByb3RvY29sIHdoZXJlIHRoZSBwYXJ0aWVzIGFsdGVybmF0ZSBpbiBzZW5kaW5nIGEgYE1lc3NhZ2VgIGZvbGxvd2VkIGJ5IGEgc3RydWN0LgorV2hhdCB0aGVzZSBhcmUgaXMgZGVzY3JpYmVkIGJlbG93LgorCitBbHRob3VnaCB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdCBKYXZhIGNsaWVudHMgZG8gbm90IHN1cHBvcnQgcGlwZWxpbmluZyAoc2VuZGluZyBtdWx0aXBsZSByZXF1ZXN0cyB3aXRob3V0IHdhaXRpbmcKK2ZvciBhbiByZXNwb25zZSksIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0IEphdmEgc2VydmVycyBkbyBzdXBwb3J0IGl0LgorCisjIyBNZXNzYWdlCisKK0EgKk1lc3NhZ2UqIGNvbnRhaW5zOgorCisqIF9OYW1lXywgYSBzdHJpbmcgKGNhbiBiZSBlbXB0eSkuCisqIF9NZXNzYWdlIHR5cGVfLCBhIG1lc3NhZ2UgdHlwZXMsIG9uZSBvZiBgQ2FsbGAsIGBSZXBseWAsIGBFeGNlcHRpb25gIGFuZCBgT25ld2F5YC4KKyogX1NlcXVlbmNlIGlkXywgYSBzaWduZWQgaW50MzIgaW50ZWdlci4KKworVGhlICpzZXF1ZW5jZSBpZCogaXMgYSBzaW1wbGUgbWVzc2FnZSBpZCBhc3NpZ25lZCBieSB0aGUgY2xpZW50LiBUaGUgc2VydmVyIHdpbGwgdXNlIHRoZSBzYW1lIHNlcXVlbmNlIGlkIGluIHRoZQorbWVzc2FnZSBvZiB0aGUgcmVzcG9uc2UuIFRoZSBjbGllbnQgdXNlcyB0aGlzIG51bWJlciB0byBkZXRlY3Qgb3V0IG9mIG9yZGVyIHJlc3BvbnNlcy4gRWFjaCBjbGllbnQgaGFzIGFuIGludDMyIGZpZWxkCit3aGljaCBpcyBpbmNyZWFzZWQgZm9yIGVhY2ggbWVzc2FnZS4gVGhlIHNlcXVlbmNlIGlkIHNpbXBseSB3cmFwcyBhcm91bmQgd2hlbiBpdCBvdmVyZmxvd3MuCisKK1RoZSAqbmFtZSogaW5kaWNhdGVzIHRoZSBzZXJ2aWNlIG1ldGhvZCBuYW1lIHRvIGludm9rZS4gVGhlIHNlcnZlciBjb3BpZXMgdGhlIG5hbWUgaW4gdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCisKK1doZW4gdGhlICptdWx0aXBsZXhlZCBwcm90b2NvbCogaXMgdXNlZCwgdGhlIG5hbWUgY29udGFpbnMgdGhlIHNlcnZpY2UgbmFtZSwgYSBjb2xvbiBgOmAgYW5kIHRoZSBtZXRob2QgbmFtZS4gVGhlCittdWx0aXBsZXhlZCBwcm90b2NvbCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVyIHByb3RvY29scy4KKworVGhlICptZXNzYWdlIHR5cGUqIGluZGljYXRlcyB3aGF0IGtpbmQgb2YgbWVzc2FnZSBpcyBzZW50LiBDbGllbnRzIHNlbmQgcmVxdWVzdHMgd2l0aCBUTWVzc2FnZXMgb2YgdHlwZSBgQ2FsbGAgb3IKK2BPbmV3YXlgIChzdGVwIDEgaW4gdGhlIHByb3RvY29sIGV4Y2hhbmdlKS4gU2VydmVycyBzZW5kIHJlc3BvbnNlcyB3aXRoIG1lc3NhZ2VzIG9mIHR5cGUgYEV4Y2VwdGlvbmAgb3IgYFJlcGx5YCAoc3RlcAorMykuCisKK1R5cGUgYFJlcGx5YCBpcyB1c2VkIHdoZW4gdGhlIHNlcnZpY2UgbWV0aG9kIGNvbXBsZXRlcyBub3JtYWxseS4gVGhhdCBpcywgaXQgcmV0dXJucyBhIHZhbHVlIG9yIGl0IHRocm93cyBvbmUgb2YgdGhlCitleGNlcHRpb25zIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwgZmlsZS4KKworVHlwZSBgRXhjZXB0aW9uYCBpcyB1c2VkIGZvciBvdGhlciBleGNlcHRpb25zLiBUaGF0IGlzOiB3aGVuIHRoZSBzZXJ2aWNlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIHRoYXQgaXMgbm90IGRlY2xhcmVkCitpbiB0aGUgVGhyaWZ0IElETCBmaWxlLCBvciBzb21lIG90aGVyIHBhcnQgb2YgdGhlIFRocmlmdCBzdGFjayB0aHJvd3MgYW4gZXhjZXB0aW9uLiBGb3IgZXhhbXBsZSB3aGVuIHRoZSBzZXJ2ZXIgY291bGQKK25vdCBlbmNvZGUgb3IgZGVjb2RlIGEgbWVzc2FnZSBvciBzdHJ1Y3QuCisKK0luIHRoZSBKYXZhIGltcGxlbWVudGF0aW9uICgwLjkuMykgdGhlcmUgaXMgZGlmZmVyZW50IGJlaGF2aW9yIGZvciB0aGUgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBzZXJ2ZXIuIEluIHRoZSBhc3luYworc2VydmVyIGFsbCBleGNlcHRpb25zIGFyZSBzZW5kIGFzIGEgYFRBcHBsaWNhdGlvbkV4Y2VwdGlvbmAgKHNlZSAnUmVzcG9uc2Ugc3RydWN0JyBiZWxvdykuIEluIHRoZSBzeW5jaHJvbm91cyBKYXZhCitpbXBsZW1lbnRhdGlvbiBvbmx5ICh1bmRlY2xhcmVkKSBleGNlcHRpb25zIHRoYXQgZXh0ZW5kIGBURXhjZXB0aW9uYCBhcmUgc2VuZCBhcyBhIGBUQXBwbGljYXRpb25FeGNlcHRpb25gLiBVbmNoZWNrZWQKK2V4Y2VwdGlvbnMgbGVhZCB0byBhbiBpbW1lZGlhdGUgY2xvc2Ugb2YgdGhlIGNvbm5lY3Rpb24uCisKK1R5cGUgYE9uZXdheWAgaXMgb25seSB1c2VkIHN0YXJ0aW5nIGZyb20gQXBhY2hlIFRocmlmdCAwLjkuMy4gRWFybGllciB2ZXJzaW9ucyBkbyBfbm90XyBzZW5kIFRNZXNzYWdlcyBvZiB0eXBlIGBPbmV3YXlgLAorZXZlbiBmb3Igc2VydmljZSBtZXRob2RzIGRlZmluZWQgd2l0aCB0aGUgYG9uZXdheWAgbW9kaWZpZXIuCisKK1doZW4gY2xpZW50IHNlbmRzIGEgcmVxdWVzdCB3aXRoIHR5cGUgYE9uZXdheWAsIHRoZSBzZXJ2ZXIgbXVzdCBfbm90XyBzZW5kIGEgcmVzcG9uc2UgKHN0ZXBzIDMgYW5kIDQgYXJlIHNraXBwZWQpLiBOb3RlCit0aGF0IHRoZSBUaHJpZnQgSURMIGVuZm9yY2VzIGEgcmV0dXJuIHR5cGUgb2YgYHZvaWRgIGFuZCBkb2VzIG5vdCBhbGxvdyBleGNlcHRpb25zIGZvciBvbmV3YXkgc2VydmljZXMuCisKKyMjIFJlcXVlc3Qgc3RydWN0CisKK1RoZSBzdHJ1Y3QgdGhhdCBmb2xsb3dzIHRoZSBtZXNzYWdlIG9mIHR5cGUgYENhbGxgIG9yIGBPbmV3YXlgIGNvbnRhaW5zIHRoZSBhcmd1bWVudHMgb2YgdGhlIHNlcnZpY2UgbWV0aG9kLiBUaGUKK2FyZ3VtZW50IGlkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZCBpZHMuIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgaXMgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoIGBfYXJnc2AgYXBwZW5kZWQuCitGb3IgbWV0aG9kcyB3aXRob3V0IGFyZ3VtZW50cyBhbiBzdHJ1Y3QgaXMgc2VudCB3aXRob3V0IGZpZWxkcy4KKworIyMgUmVzcG9uc2Ugc3RydWN0CisKK1RoZSBzdHJ1Y3QgdGhhdCBmb2xsb3dzIHRoZSBtZXNzYWdlIG9mIHR5cGUgYFJlcGx5YCBhcmUgc3RydWN0cyBpbiB3aGljaCBleGFjdGx5IDEgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgaXMgZW5jb2RlZDoKKworKiBBIGZpZWxkIHdpdGggbmFtZSBgc3VjY2Vzc2AgYW5kIGlkIGAwYCwgdXNlZCBpbiBjYXNlIHRoZSBtZXRob2QgY29tcGxldGVkIG5vcm1hbGx5LgorKiBBbiBleGNlcHRpb24gZmllbGQsIG5hbWUgYW5kIGlkIGFyZSBhcyBkZWZpbmVkIGluIHRoZSBgdGhyb3dzYCBjbGF1c2UgaW4gdGhlIFRocmlmdCBJREwncyBzZXJ2aWNlIG1ldGhvZCBkZWZpbml0aW9uLgorCitXaGVuIHRoZSBtZXNzYWdlIGlzIG9mIHR5cGUgYEV4Y2VwdGlvbmAgdGhlIHN0cnVjdCBpcyBlbmNvZGVkIGFzIGlmIGl0IHdhcyBkZWNsYXJlZCBieSB0aGUgZm9sbG93aW5nIElETDoKKworYGBgCitleGNlcHRpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgMTogc3RyaW5nIG1lc3NhZ2UsCisgIDI6IGkzMiB0eXBlCit9CitgYGAKKworVGhlIGZvbGxvd2luZyBleGNlcHRpb24gdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGphdmEgaW1wbGVtZW50YXRpb24gKDAuOS4zKToKKworKiBfdW5rbm93bl86IDAsIHVzZWQgaW4gY2FzZSB0aGUgdHlwZSBmcm9tIHRoZSBwZWVyIGlzIHVua25vd24uCisqIF91bmtub3duIG1ldGhvZF86IDEsIHVzZWQgaW4gY2FzZSB0aGUgbWV0aG9kIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50IGlzIHVua25vd24gYnkgdGhlIHNlcnZlci4KKyogX2ludmFsaWQgbWVzc2FnZSB0eXBlXzogMiwgbm8gdXNhZ2Ugd2FzIGZvdW5kLgorKiBfd3JvbmcgbWV0aG9kIG5hbWVfOiAzLCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF9iYWQgc2VxdWVuY2UgaWRfOiA0LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNsaWVudCB0byBpbmRpY2F0ZSBhIHdyb25nIHNlcXVlbmNlIGlkIGluIHRoZSByZXNwb25zZS4KKyogX21pc3NpbmcgcmVzdWx0XzogNSwgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjbGllbnQgdG8gaW5kaWNhdGUgYSByZXNwb25zZSB3aXRob3V0IGFueSBmaWVsZCAocmVzdWx0IG5vciBleGNlcHRpb24pLgorKiBfaW50ZXJuYWwgZXJyb3JfOiA2LCB1c2VkIHdoZW4gdGhlIHNlcnZlciB0aHJvd3MgYW4gZXhjZXB0aW9uIHRoYXQgaXMgbm90IGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMIGZpbGUuIAorKiBfcHJvdG9jb2wgZXJyb3JfOiA3LCB1c2VkIHdoZW4gc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGRlY29kaW5nLiBGb3IgZXhhbXBsZSB3aGVuIGEgbGlzdCBpcyB0b28gbG9uZyBvciBhIHJlcXVpcmVkCisgZmllbGQgaXMgbWlzc2luZy4gCisqIF9pbnZhbGlkIHRyYW5zZm9ybV86IDgsIG5vIHVzYWdlIHdhcyBmb3VuZC4KKyogX2ludmFsaWQgcHJvdG9jb2xfOiA5LCBubyB1c2FnZSB3YXMgZm91bmQuCisqIF91bnN1cHBvcnRlZCBjbGllbnQgdHlwZV86IDEwLCBubyB1c2FnZSB3YXMgZm91bmQuCisKKyMgUHJvdG9jb2wgY29uc2lkZXJhdGlvbnMKKworIyMgQ29tcGFyaW5nIGJpbmFyeSBhbmQgY29tcGFjdCBwcm90b2NvbAorCitUaGUgYmluYXJ5IHByb3RvY29sIGlzIGZhaXJseSBzaW1wbGUgYW5kIHRoZXJlZm9yZSBlYXN5IHRvIHByb2Nlc3MuIFRoZSBjb21wYWN0IHByb3RvY29sIG5lZWRzIGxlc3MgYnl0ZXMgdG8gc2VuZCB0aGUKK3NhbWUgZGF0YSBhdCB0aGUgY29zdCBvZiBhZGRpdGlvbmFsIHByb2Nlc3NpbmcuIEFzIGJhbmR3aWR0aCBpcyB1c3VhbGx5IHRoZSBib3R0bGVuZWNrLCB0aGUgY29tcGFjdCBwcm90b2NvbCBpcyBhbG1vc3QKK2Fsd2F5cyBzbGlnaHRseSBmYXN0ZXIuCisKKyMjIENvbXBhdGliaWxpdHkKKworQSBzZXJ2ZXIgY291bGQgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgd2hldGhlciBhIGNsaWVudCB0YWxrcyB0aGUgYmluYXJ5IHByb3RvY29sIG9yIHRoZSBjb21wYWN0IHByb3RvY29sIGJ5CitpbnZlc3RpZ2F0aW5nIHRoZSBmaXJzdCBieXRlLiBJZiB0aGUgdmFsdWUgaXMgYDEwMDAgMDAwMWAgb3IgYDAwMDAgMDAwMGAgKGFzc3VtaW5nIGEgbmFtZSBzaG9ydGVyIHRoZW4gwrExNiBNQikgaXQgaXMgdGhlCitiaW5hcnkgcHJvdG9jb2wuIFdoZW4gdGhlIHZhbHVlIGlzIGAxMDAwIDAwMTBgIGl0IGlzIHRhbGtpbmcgdGhlIGNvbXBhY3QgcHJvdG9jb2wuCisKKyMjIEZyYW1lZCB2cy4gdW5mcmFtZWQgdHJhbnNwb3J0CisKK1RoZSBmaXJzdCB0aHJpZnQgYmluYXJ5IHdpcmUgZm9ybWF0IHdhcyB1bmZyYW1lZC4gVGhpcyBtZWFucyB0aGF0IGluZm9ybWF0aW9uIGlzIHNlbnQgb3V0IGluIGEgc2luZ2xlIHN0cmVhbSBvZiBieXRlcy4KK1dpdGggdW5mcmFtZWQgdHJhbnNwb3J0IHRoZSAoZ2VuZXJhdGVkKSBwcm9jZXNzb3JzIHdpbGwgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBzb2NrZXQgKHRob3VnaCBBcGFjaGUgVGhyaWZ0IGRvZXMgdHJ5IHRvCitncmFiIGFsbCBhdmFpbGFibGUgYnl0ZXMgZnJvbSB0aGUgc29ja2V0IGluIGEgYnVmZmVyIHdoZW4gaXQgY2FuKS4KKworTGF0ZXIsIFRocmlmdCBpbnRyb2R1Y2VkIHRoZSBmcmFtZWQgdHJhbnNwb3J0LgorCitXaXRoIGZyYW1lZCB0cmFuc3BvcnQgdGhlIGZ1bGwgcmVxdWVzdCBhbmQgcmVzcG9uc2UgKHRoZSBUTWVzc2FnZSBhbmQgdGhlIGZvbGxvd2luZyBzdHJ1Y3QpIGFyZSBmaXJzdCB3cml0dGVuIHRvIGEKK2J1ZmZlci4gVGhlbiB3aGVuIHRoZSBzdHJ1Y3QgaXMgY29tcGxldGUgKHRyYW5zcG9ydCBtZXRob2QgYGZsdXNoYCBpcyBoaWphY2tlZCBmb3IgdGhpcyksIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcword3JpdHRlbiB0byB0aGUgc29ja2V0IGZpcnN0LCBmb2xsb3dlZCBieSB0aGUgYnVmZmVyZWQgYnl0ZXMuIFRoZSBjb21iaW5hdGlvbiBpcyBjYWxsZWQgYSBfZnJhbWVfLiBPbiB0aGUgcmVjZWl2ZXIgc2lkZQordGhlIGNvbXBsZXRlIGZyYW1lIGlzIGZpcnN0IHJlYWQgaW4gYSBidWZmZXIgYmVmb3JlIHRoZSBtZXNzYWdlIGlzIHBhc3NlZCB0byBhIHByb2Nlc3Nvci4KKworVGhlIGxlbmd0aCBwcmVmaXggaXMgYSA0IGJ5dGUgc2lnbmVkIGludCwgc2VuZCBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBvcmRlci4KK1RoZSBmb2xsb3dpbmcgbXVzdCBiZSB0cnVlOiBgMGAgPD0gbGVuZ3RoIDw9IGAxNjM4NDAwMGAgKDE2TSkuCisKK0ZyYW1lZCB0cmFuc3BvcnQgd2FzIGludHJvZHVjZWQgdG8gZWFzZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgYXN5bmMgcHJvY2Vzc29ycy4gQW4gYXN5bmMgcHJvY2Vzc29yIGlzIG9ubHkgaW52b2tlZCB3aGVuCithbGwgZGF0YSBpcyByZWNlaXZlZC4gVW5mb3J0dW5hdGVseSwgZnJhbWVkIHRyYW5zcG9ydCBpcyBub3QgaWRlYWwgZm9yIGxhcmdlIG1lc3NhZ2VzIGFzIHRoZSBlbnRpcmUgZnJhbWUgc3RheXMgaW4KK21lbW9yeSB1bnRpbCB0aGUgbWVzc2FnZSBoYXMgYmVlbiBwcm9jZXNzZWQuIEluIGFkZGl0aW9uLCB0aGUgamF2YSBpbXBsZW1lbnRhdGlvbiBtZXJnZXMgdGhlIGluY29taW5nIGRhdGEgdG8gYSBzaW5nbGUsCitncm93aW5nIGJ5dGUgYXJyYXkuIEV2ZXJ5IHRpbWUgdGhlIGJ5dGUgYXJyYXkgaXMgZnVsbCBpdCBuZWVkcyB0byBiZSBjb3BpZWQgdG8gYSBuZXcgbGFyZ2VyIGJ5dGUgYXJyYXkuCisKK0ZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyLgpkaWZmIC0tZ2l0IGEvZG9jL3RocmlmdC1zYXNsLXNwZWMudHh0IGIvZG9jL3NwZWNzL3RocmlmdC1zYXNsLXNwZWMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvdGhyaWZ0LXNhc2wtc3BlYy50eHQKcmVuYW1lIHRvIGRvYy9zcGVjcy90aHJpZnQtc2FzbC1zcGVjLnR4dApkaWZmIC0tZ2l0IGEvZG9jL3RocmlmdC50ZXggYi9kb2Mvc3BlY3MvdGhyaWZ0LnRleApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL3RocmlmdC50ZXgKcmVuYW1lIHRvIGRvYy9zcGVjcy90aHJpZnQudGV4CmRpZmYgLS1naXQgYS9kb2MvdGhyaWZ0LmJuZiBiL2RvYy90aHJpZnQuYm5mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQ4M2Y2Li4wMDAwMDAwCi0tLSBhL2RvYy90aHJpZnQuYm5mCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotVGhyaWZ0IFByb3RvY29sIFN0cnVjdHVyZQotCi1MYXN0IE1vZGlmaWVkOiAyMDA3LUp1bi0yOQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgVGhyaWZ0IHByb3RvY29sCi13aXRob3V0IHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nLiBUaHVzLCB0aGUgb3JkZXIgb2YgZWxlbWVudHMKLWNvdWxkIGluIHNvbWUgY2FzZXMgYmUgcmVhcnJhbmdlZCBkZXBlbmRpbmcgdXBvbiB0aGUgVFByb3RvY29sCi1pbXBsZW1lbnRhdGlvbiwgYnV0IHRoaXMgZG9jdW1lbnQgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIHJlcXVpcmVkCi1zdHJ1Y3R1cmUuIFRoZXJlIGFyZSBzb21lICJkdW1iIiB0ZXJtaW5hbHMgbGlrZSBTVFJJTkcgYW5kIElOVAotdGhhdCB0YWtlIHRoZSBwbGFjZSBvZiBhbiBhY3R1YWwgZW5jb2Rpbmcgc3BlY2lmaWNhdGlvbi4KLQotVGhleSBrZXkgcG9pbnQgdG8gbm90aWNlIGlzIHRoYXQgQUxMIG1lc3NhZ2VzIGFyZSBqdXN0IG9uZSB3cmFwcGVkCi08c3RydWN0Pi4gRGVwZW5kaW5nIHVwb24gdGhlIG1lc3NhZ2UgdHlwZSwgdGhlIDxzdHJ1Y3Q+IGNhbiBiZQotaW50ZXJwcmV0ZWQgYXMgdGhlIGFyZ3VtZW50IGxpc3QgdG8gYSBmdW5jdGlvbiwgdGhlIHJldHVybiB2YWx1ZQotb2YgYSBmdW5jdGlvbiwgb3IgYW4gZXhjZXB0aW9uLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgPG1lc3NhZ2U+IDo6PSA8bWVzc2FnZS1iZWdpbj4gPHN0cnVjdD4gPG1lc3NhZ2UtZW5kPgotCi0gPG1lc3NhZ2UtYmVnaW4+IDo6PSA8bWV0aG9kLW5hbWU+IDxtZXNzYWdlLXR5cGU+IDxtZXNzYWdlLXNlcWlkPgotCi0gICA8bWV0aG9kLW5hbWU+IDo6PSBTVFJJTkcKLQotICA8bWVzc2FnZS10eXBlPiA6Oj0gVF9DQUxMIHwgVF9SRVBMWSB8IFRfRVhDRVBUSU9OCi0KLSA8bWVzc2FnZS1zZXFpZD4gOjo9IEkzMgotCi0gICAgICAgIDxzdHJ1Y3Q+IDo6PSA8c3RydWN0LWJlZ2luPiA8ZmllbGQ+KiA8ZmllbGQtc3RvcD4gPHN0cnVjdC1lbmQ+Ci0KLSAgPHN0cnVjdC1iZWdpbj4gOjo9IDxzdHJ1Y3QtbmFtZT4KLQotICAgPHN0cnVjdC1uYW1lPiA6Oj0gU1RSSU5HCi0KLSAgICA8ZmllbGQtc3RvcD4gOjo9IFRfU1RPUAotCi0gICAgICAgICA8ZmllbGQ+IDo6PSA8ZmllbGQtYmVnaW4+IDxmaWVsZC1kYXRhPiA8ZmllbGQtZW5kPgotCi0gICA8ZmllbGQtYmVnaW4+IDo6PSA8ZmllbGQtbmFtZT4gPGZpZWxkLXR5cGU+IDxmaWVsZC1pZD4KLQotICAgIDxmaWVsZC1uYW1lPiA6Oj0gU1RSSU5HCi0KLSAgICA8ZmllbGQtdHlwZT4gOjo9IFRfQk9PTCB8IFRfQllURSB8IFRfSTggfCBUX0kxNiB8IFRfSTMyIHwgVF9JNjQgfCBUX0RPVUJMRQotICAgICAgICAgICAgICAgICAgICAgfCBUX1NUUklORyB8IFRfQklOQVJZIHwgVF9TVFJVQ1QgfCBUX01BUCB8IFRfU0VUIHwgVF9MSVNUCi0KLSAgICAgIDxmaWVsZC1pZD4gOjo9IEkxNgotCi0gICAgPGZpZWxkLWRhdGE+IDo6PSBJOCB8IEkxNiB8IEkzMiB8IEk2NCB8IERPVUJMRSB8IFNUUklORyB8IEJJTkFSWQotICAgICAgICAgICAgICAgICAgICAgPHN0cnVjdD4gfCA8bWFwPiB8IDxsaXN0PiB8IDxzZXQ+Ci0KLSAgICAgICAgICAgPG1hcD4gOjo9IDxtYXAtYmVnaW4+IDxmaWVsZC1kYXR1bT4qIDxtYXAtZW5kPgotCi0gICAgIDxtYXAtYmVnaW4+IDo6PSA8bWFwLWtleS10eXBlPiA8bWFwLXZhbHVlLXR5cGU+IDxtYXAtc2l6ZT4KLQotICA8bWFwLWtleS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+Ci0KLTxtYXAtdmFsdWUtdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi0gICAgICA8bWFwLXNpemU+IDo6PSBJMzIKLQotICAgICAgICAgIDxsaXN0PiA6Oj0gPGxpc3QtYmVnaW4+IDxmaWVsZC1kYXRhPiogPGxpc3QtZW5kPgotCi0gICAgPGxpc3QtYmVnaW4+IDo6PSA8bGlzdC1lbGVtLXR5cGU+IDxsaXN0LXNpemU+Ci0KLTxsaXN0LWVsZW0tdHlwZT4gOjo9IDxmaWVsZC10eXBlPgotCi0gICAgIDxsaXN0LXNpemU+IDo6PSBJMzIKLQotICAgICAgICAgICA8c2V0PiA6Oj0gPHNldC1iZWdpbj4gPGZpZWxkLWRhdGE+KiA8c2V0LWVuZD4KLQotICAgICA8c2V0LWJlZ2luPiA6Oj0gPHNldC1lbGVtLXR5cGU+IDxzZXQtc2l6ZT4KLQotIDxzZXQtZWxlbS10eXBlPiA6Oj0gPGZpZWxkLXR5cGU+Ci0KLSAgICAgIDxzZXQtc2l6ZT4gOjo9IEkzMgpkaWZmIC0tZ2l0IGEvZHViLmpzb24gYi9kdWIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc2YWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHViLmpzb24KQEAgLTAsMCArMSwyOCBAQAoreworICAibmFtZSI6ICJhcGFjaGUtdGhyaWZ0IiwKKyAgImRlc2NyaXB0aW9uIjogIkFwYWNoZSBUaHJpZnQgRCBsaWJyYXJ5IiwKKyAgImF1dGhvcnMiOiBbCisgICAgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIKKyAgXSwKKyAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCisgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJsaWJldmVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIn4+Mi4wLjIiCisgICAgfSwKKyAgICAib3BlbnNzbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIj49MS4xLjYiCisgICAgfQorICB9LAorICAic3lzdGVtRGVwZW5kZW5jaWVzIjogIk9uIHN5c3RlbXMgd2l0aCBuYXRpdmUgb3BlbnNzbCAxLjAueCB1c2UgZHViIHBhY2thZ2Ugb3BlbnNzbH4+MS4xLCBvbiBzeXN0ZW1zIHdpdGggbmF0aXZlIG9wZW5zc2wgMS4xLnggdXNlIGR1YiBwYWNrYWdlIG9wZW5zc2x+PjIuMCIsCisgICJ0YXJnZXRUeXBlIjogImxpYnJhcnkiLAorICAic291cmNlUGF0aHMiOiBbCisgICAgImxpYi9kL3NyYyIgCisgIF0sCisgICJpbXBvcnRQYXRocyI6IFsKKyAgICAibGliL2Qvc3JjIgorICBdLAorICAiZXhjbHVkZWRTb3VyY2VGaWxlcyI6IFsKKyAgICAibGliL2Qvc3JjL3RocmlmdC9pbmRleC5kIgorICBdCit9CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuYW0gYi9saWIvTWFrZWZpbGUuYW0KaW5kZXggZDI2NzUyYi4uYjZjZTIwZSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9NYWtlZmlsZS5hbQpAQCAtMTcsMTEgKzE3LDE1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0KK1NVQkRJUlMgPSBqc29uIHhtbAorUFJFQ1JPU1NfVEFSR0VUID0KIAogaWYgV0lUSF9DUFAKKyMgY3BwIGRpciBpcyBwaWNrZWQgZGlyZWN0bHkgYnkgcGx1Z2luIGJ1aWxkCitpZiAhV0lUSF9QTFVHSU4KIFNVQkRJUlMgKz0gY3BwCiBlbmRpZgorZW5kaWYKIAogaWYgV0lUSF9DX0dMSUIKIFNVQkRJUlMgKz0gY19nbGliCkBAIC0zMyw5ICszNywxMCBAQAogCiBpZiBXSVRIX0pBVkEKIFNVQkRJUlMgKz0gamF2YQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWphdmEKICMgSmF2YVNjcmlwdCB1bml0IHRlc3QgZGVwZW5kcyBvbiBqYXZhCiAjIHNvIHRlc3Qgb25seSBpZiBqYXZhLCBhbnQgJiBjbyBpcyBhdmFpbGFibGUKLVNVQkRJUlMgKz0ganMvdGVzdAorU1VCRElSUyArPSBqcwogZW5kaWYKIAogaWYgV0lUSF9QWVRIT04KQEAgLTYyLDIwICs2Nyw2MCBAQAogU1VCRElSUyArPSBwaHAKIGVuZGlmCiAKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX0RPVE5FVENPUkUKK1NVQkRJUlMgKz0gbmV0Y29yZQorZW5kaWYKKworaWYgV0lUSF9HTworU1VCRElSUyArPSBnbworZW5kaWYKKwogaWYgV0lUSF9ECiBTVUJESVJTICs9IGQKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1kCitlbmRpZgorCitpZiBXSVRIX05PREVKUworU1VCRElSUyArPSBub2RlanMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ub2RlanMKK1NVQkRJUlMgKz0gbm9kZXRzCitlbmRpZgorCitpZiBXSVRIX0xVQQorU1VCRElSUyArPSBsdWEKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK2VuZGlmCisKK2lmIFdJVEhfU1dJRlQKK1NVQkRJUlMgKz0gc3dpZnQKIGVuZGlmCiAKICMgQWxsIG9mIHRoZSBsaWJzIHRoYXQgZG9uJ3QgdXNlIEF1dG9tYWtlIG5lZWQgdG8gZ28gaW4gaGVyZQogIyBzbyB0aGV5IHdpbGwgZW5kIHVwIGluIG91ciByZWxlYXNlIHRhcmJhbGxzLgogRVhUUkFfRElTVCA9IFwKLQkJCWFzMyBcCi0JCQljb2NvYSBcCi0JCQlkIFwKLQkJCWRlbHBoaSBcCi0JCQlnbyBcCi0JCQlqYXZhbWUgXAotCQkJanMgXAotCQkJbm9kZWpzIFwKLQkJCW9jYW1sIFwKLQkJCXN0CisJYXMzIFwKKwljb2NvYSBcCisJZCBcCisJZGFydCBcCisJZGVscGhpIFwKKwloYXhlIFwKKwlqYXZhbWUgXAorCWpzIFwKKwlvY2FtbCBcCisJc3QgXAorCXRzCisKK3ByZWNyb3NzLSU6CisJJChNQUtFKSAtQyAkKiBwcmVjcm9zcworcHJlY3Jvc3M6ICQoUFJFQ1JPU1NfVEFSR0VUKQpkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2xpYi9hczMvYnVpbGQueG1sIGIvbGliL2FzMy9idWlsZC54bWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhYTUyM2YwLi5iMGM0Yzg1Ci0tLSBhL2xpYi9hczMvYnVpbGQueG1sCisrKyBiL2xpYi9hczMvYnVpbGQueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCisKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKKwogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQpAQCAtMTksMjMgKzE5LDI0IEBACiAgLS0+CiA8cHJvamVjdCBuYW1lPSJsaWJ0aHJpZnQtYXMzIiBkZWZhdWx0PSJjb21waWxlIiBiYXNlZGlyPSIuIgogICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KLQkKKwogICA8cHJvcGVydHkgbmFtZT0iYXMzLmFydGlmYWN0aWQiIHZhbHVlPSIke2FudC5wcm9qZWN0Lm5hbWV9Ii8+Ci0JCisKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5yb290IiBsb2NhdGlvbj0iJHtiYXNlZGlyfS8uLi8uLi8iLz4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+IAorICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0X2NvbXBpbGVyIiB2YWx1ZT0iJHt0aHJpZnQucm9vdH0vY29tcGlsZXIvY3BwL3RocmlmdCIvPgorICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIi8+CiAKICAgPCEtLSBpbmhlcml0IGZyb20gdGhlIGphdmEgYnVpbGQgZmlsZSBmb3IgdmVyc2lvbiBhbmQgb3RoZXIgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgogCiAgIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+CiAKICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KICAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KICAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4KKyAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1TTkFQU0hPVCIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJhczMuZmluYWwubmFtZSIgdmFsdWU9IiR7YXMzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KIApAQCAtNTIsMTIgKzUzLDEzIEBACiAgIDx0YXJnZXQgbmFtZT0ic2V0dXAuaW5pdCI+CiAgICAgPHRzdGFtcC8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iZmxleC5jaGVjayIgdW5sZXNzPSJGTEVYX0hPTUUiPgogICAgIDxmYWlsIG1lc3NhZ2U9J1lvdSBtdXN0IHNldCB0aGUgRkxFWF9IT01FIHByb3BlcnR5IHBvaW50aW5nIHRvIHlvdXIgZmxleCBTREssIGVnLiBhbnQgLURGTEVYX0hPTUU9Ii9BcHBsaWNhdGlvbnMvQWRvYmUgRmxleCBCdWlsZGVyIDMvc2Rrcy8zLjIuMCInLz4KICAgPC90YXJnZXQ+Ci0JCisKICAgPHRhcmdldCBuYW1lPSJmbGV4LmluaXQiIGRlcGVuZHM9ImZsZXguY2hlY2siIHVubGVzcz0iZmxleC5maW5pc2hlZCI+CiAgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImZsZXhUYXNrcy50YXNrcyIgY2xhc3NwYXRoPSIke0ZMRVhfSE9NRX0vYW50L2xpYi9mbGV4VGFza3MuamFyIiAvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJmbGV4LmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgpAQCAtNjksMTAgKzcxLDEwIEBACiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouYXMiLz4KICAgICAgIDwvZmlsZXNldD4KICAgICA8L3BhdGg+Ci0gICAgPHBhdGhjb252ZXJ0IAotICAgICAgcHJvcGVydHk9ImFzLnNyYy5jbGFzc2VzIiAKLSAgICAgIHBhdGhzZXA9IiAiIAotICAgICAgZGlyc2VwPSIuIiAKKyAgICA8cGF0aGNvbnZlcnQKKyAgICAgIHByb3BlcnR5PSJhcy5zcmMuY2xhc3NlcyIKKyAgICAgIHBhdGhzZXA9IiAiCisgICAgICBkaXJzZXA9Ii4iCiAgICAgICByZWZpZD0iYXMuc3JjLmZpbGVzIgogICAgID4KICAgICAgIDxtYXAgZnJvbT0iJHtzcmN9LyIgdG89IiIvPgpAQCAtMTA4LDIxICsxMTAsMjEgQEAKICAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+CiAKICAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgotICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIgCi0gICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIgCisgICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIgorICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iCiAgICAgICBhcnRpZmFjdElkPSIke2FzMy5hcnRpZmFjdGlkfSIKLSAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iIAorICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKICAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgogICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKICAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKLSAgICAgIHBhY2thZ2luZz0icG9tIgorICAgICAgcGFja2FnaW5nPSJzd2MiCiAgICAgPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KICAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0L3RydW5rLyIgCi0gICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIgotICAgICAgICB1cmw9Imh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS90aHJpZnQiCisgICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICB1cmw9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0IgogICAgICAgLz4KICAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+CiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgpAQCAtMTQxLDYgKzE0Myw4IEBACiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgogICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+CiAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+CisgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZW5zZyIgbmFtZT0iSmVucyBHZXllciIvPgorICAgICAgPGRldmVsb3BlciBpZD0iY2FybCIgbmFtZT0iQ2FybCBZZWtzaWdpYW4iLz4KICAgICA8L2FydGlmYWN0OnBvbT4KIAogICAgIDwhLS0gR2VuZXJhdGUgdGhlIHBvbSBmaWxlIC0tPgpAQCAtMTc0LDUgKzE3OCw1IEBACiAgICAgPCEtLSBydW4gd2l0aDogYW50IC1EcmVsZWFzZT10cnVlIHB1Ymxpc2ggLS0+CiAgICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHthczMucG9tLnhtbH0iIHBhY2thZ2luZz0icG9tIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHthczMucG9tLnhtbH0iLz4KICAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5zd2MuZmlsZX0iIHBhY2thZ2luZz0ic3djIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHthczMucG9tLnhtbH0iLz4KLSAgPC90YXJnZXQ+CQorICA8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9hczMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2FzMy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXJyb3IuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcwppbmRleCBhYTMyNzhkLi4zNDQ4ZmNlIDEwMDY0NAotLS0gYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FcnJvci5hcwpAQCAtNDIsMTEgKzQyLDE0IEBACiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBNSVNTSU5HX1JFU1VMVDppbnQgPSA1OwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5URVJOQUxfRVJST1I6aW50ID0gNjsKICAgICBwdWJsaWMgc3RhdGljIGNvbnN0IFBST1RPQ09MX0VSUk9SOmludCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBJTlZBTElEX1RSQU5TRk9STTppbnQgPSA4OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgSU5WQUxJRF9QUk9UT0NPTDppbnQgPSA5OworICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6aW50ID0gMTA7CiAKICAgICBwdWJsaWMgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXJyb3IodHlwZTppbnQgPSBVTktOT1dOLCBtZXNzYWdlOlN0cmluZyA9ICIiKSB7CiAgICAgICBzdXBlcihtZXNzYWdlLCB0eXBlKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKTpUQXBwbGljYXRpb25FcnJvciB7CiAgICAgICB2YXIgZmllbGQ6VEZpZWxkOwogICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuYXMKaW5kZXggNDQxMjQ3OS4uYjJmZjlkOCAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5hcwpAQCAtMzgsOSArMzgsNiBAQAogICAgIHByb3RlY3RlZCB2YXIgc3RyaWN0UmVhZF86Qm9vbGVhbiA9IGZhbHNlOwogICAgIHByb3RlY3RlZCB2YXIgc3RyaWN0V3JpdGVfOkJvb2xlYW4gPSB0cnVlOwogICAgIAotICAgIHByb3RlY3RlZCB2YXIgcmVhZExlbmd0aF86aW50OwotICAgIHByb3RlY3RlZCB2YXIgY2hlY2tSZWFkTGVuZ3RoXzpCb29sZWFuID0gZmFsc2U7Ci0KICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCkBAIC0yOTgsNyArMjk1LDYgQEAKICAgCiAgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKTpCeXRlQXJyYXkgewogICAgICAgICB2YXIgc2l6ZTppbnQgPSByZWFkSTMyKCk7Ci0gICAgICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKICAgICAgICAgdmFyIGJ1ZjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CiAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICAgIHJldHVybiBidWY7CkBAIC0zMDcsMjUgKzMwMywxMCBAQAogICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEFsbChsZW46aW50KTp2b2lkIHsKICAgICAgIHJlc2V0KGJ5dGVzKTsKICAgICAgIAotICAgICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVzLCAwLCBsZW4pOwogICAgICAgICAKICAgICAgICAgYnl0ZXMucG9zaXRpb24gPSAwOwogICAgICAgfQotICAKLSAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVhZExlbmd0aChyZWFkTGVuZ3RoOmludCk6dm9pZCB7Ci0gICAgICByZWFkTGVuZ3RoXyA9IHJlYWRMZW5ndGg7Ci0gICAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgICB9Ci0gIAotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1JlYWRMZW5ndGgobGVuZ3RoOmludCk6dm9pZCB7Ci0gICAgICAgIGlmIChjaGVja1JlYWRMZW5ndGhfKSB7Ci0gICAgICAgICAgICByZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0gICAgICAgICAgICBpZiAocmVhZExlbmd0aF8gPCAwKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBURXJyb3IoIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlc2V0KGFycjpCeXRlQXJyYXkpOnZvaWQgewogICAgICAgYXJyLmxlbmd0aCA9IDA7CmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFcnJvci5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCmluZGV4IGM1Nzg4ZGIuLjlmZmY3MzAgMTAwNjQ0Ci0tLSBhL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCisrKyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmFzCkBAIC0yOSw2ICsyOSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBTSVpFX0xJTUlUOmludCA9IDM7CiAgICAgcHVibGljIHN0YXRpYyBjb25zdCBCQURfVkVSU0lPTjppbnQgPSA0OwogICAgIHB1YmxpYyBzdGF0aWMgY29uc3QgTk9UX0lNUExFTUVOVEVEOmludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBjb25zdCBERVBUSF9MSU1JVDppbnQgPSA2OwogICAKICAgICBwdWJsaWMgZnVuY3Rpb24gVFByb3RvY29sRXJyb3IoZXJyb3I6aW50ID0gVU5LTk9XTiwgbWVzc2FnZTpTdHJpbmcgPSAiIikgewogICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnVsbER1cGxleEh0dHBDbGllbnQuYXMKaW5kZXggMzM3NDk4Ni4uODYzYzU5YiAxMDA2NDQKLS0tIGEvbGliL2FzMy9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5hcworKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50LmFzCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSB0aGlzLnNvY2tldDsKICAgICAgICAgICAgIHRoaXMuaW5wdXQgPSB0aGlzLnNvY2tldDsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIgKyAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iICsgIlVzZXItQWdlbnQ6IEJhdHRsZU5ldFxyXG4iICsgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcbiIgKyAiY29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iICsgIkFjY2VwdDogKi8qXHJcblxyXG4iKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlVVRGKCJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIgKyAiSG9zdDogIiArIGhvc3QgKyAiOiIgKyBwb3J0ICsgIlxyXG4iICsgIlVzZXItQWdlbnQ6IFRocmlmdC9BUzNcclxuIiArICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4iICsgImNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC10aHJpZnRcclxuIiArICJBY2NlcHQ6ICovKlxyXG5cclxuIik7CiAgICAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcyBiL2xpYi9hczMvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGQ3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5hcwpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKgkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Cit7CisKKyAgaW1wb3J0IGZsYXNoLmV2ZW50cy5FdmVudERpc3BhdGNoZXI7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuSU9FcnJvckV2ZW50OworICBpbXBvcnQgZmxhc2guZXZlbnRzLlByb2dyZXNzRXZlbnQ7CisgIGltcG9ydCBmbGFzaC5ldmVudHMuU2VjdXJpdHlFcnJvckV2ZW50OworICBpbXBvcnQgZmxhc2guZXJyb3JzLkVPRkVycm9yOworICBpbXBvcnQgZmxhc2guZXJyb3JzLklPRXJyb3I7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMTG9hZGVyOworICBpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CisgIGltcG9ydCBmbGFzaC5uZXQuVVJMUmVxdWVzdDsKKyAgaW1wb3J0IGZsYXNoLm5ldC5VUkxSZXF1ZXN0TWV0aG9kOworICBpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFJbnB1dDsKKyAgaW1wb3J0IGZsYXNoLnV0aWxzLklEYXRhT3V0cHV0OworICBpbXBvcnQgZmxhc2gudXRpbHMuQnl0ZUFycmF5OworICBpbXBvcnQgZmxhc2gubmV0LlNvY2tldDsKKworCisgIC8qKgorICAgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgKiBUaHJpZnQgU29ja2V0IFNlcnZlciBiYXNlZCBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworCisgIHB1YmxpYyBjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAorICB7CisgICAgcHJpdmF0ZSB2YXIgc29ja2V0OlNvY2tldCA9IG51bGw7CisKKyAgICBwcml2YXRlIHZhciBob3N0OlN0cmluZzsKKworICAgIHByaXZhdGUgdmFyIHBvcnQ6aW50OworCisgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlcjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CisKKyAgICBwcml2YXRlIHZhciBpbnB1dDpJRGF0YUlucHV0OworCisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0OklEYXRhT3V0cHV0OworCisgICAgcHJpdmF0ZSB2YXIgaW9DYWxsYmFjazpGdW5jdGlvbiA9IG51bGw7CisKKyAgICBwcml2YXRlIHZhciBldmVudERpc3BhdGNoZXI6RXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIFRTb2NrZXQoaG9zdDpTdHJpbmcsIHBvcnQ6aW50KTp2b2lkCisgICAgeworICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaW5wdXQgPSBudWxsOworICAgICAgdGhpcy5vdXRwdXQgPSBudWxsOworICAgICAgc29ja2V0LmNsb3NlKCkKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcGVlaygpOkJvb2xlYW4KKyAgICB7CisgICAgICBpZihzb2NrZXQuY29ubmVjdGVkKQorICAgICAgeworICAgICAgICB0cmFjZSgiQnl0ZXMgcmVtYWluZWQ6IiArIHNvY2tldC5ieXRlc0F2YWlsYWJsZSk7CisgICAgICAgIHJldHVybiBzb2NrZXQuYnl0ZXNBdmFpbGFibGU+MDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWY6Qnl0ZUFycmF5LCBvZmY6aW50LCBsZW46aW50KTppbnQKKyAgICB7CisgICAgICB2YXIgbjE6aW50ID0gMCwgbjI6aW50ID0gMCwgbjM6aW50ID0gMCwgbjQ6aW50ID0gMCwgY2lkeDppbnQgPSAyOworICAgICAgdmFyIGNodW5rU2l6ZTpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7CisKKyAgICAgIHRyeQorICAgICAgeworICAgICAgICBpbnB1dC5yZWFkQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgICB9CisgICAgICBjYXRjaCAoZTpFT0ZFcnJvcikKKyAgICAgIHsKKyAgICAgICAgdHJhY2UoZSk7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOklPRXJyb3IpCisgICAgICB7CisgICAgICAgIHRyYWNlKGUpOworICAgICAgICBpZihpc09wZW4oKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoVFRyYW5zcG9ydEVycm9yLlVOS05PV04sICJJTyBlcnJvciB3aGlsZSByZWFkaW5nOiAiICsgZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuTk9UX09QRU4sICJTb2NrZXQgc2VlbSBub3QgdG8gYmUgb3BlbmVkOiAiICsgZSk7CisgICAgCX0KKyAgICAgIH0KKyAgICAgIGNhdGNoIChlOkVycm9yKQorICAgICAgeworICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIkJhZCBJTyBlcnJvcjogIiArIGUpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZjpCeXRlQXJyYXksIG9mZjppbnQsIGxlbjppbnQpOnZvaWQKKyAgICB7CisgICAgICBvYnVmZmVyLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpTdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uLCB1c2VDYXB0dXJlOkJvb2xlYW4gPSBmYWxzZSwgcHJpb3JpdHk6aW50ID0gMCwgdXNlV2Vha1JlZmVyZW5jZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlLCBwcmlvcml0eSwgdXNlV2Vha1JlZmVyZW5jZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6U3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiwgdXNlQ2FwdHVyZTpCb29sZWFuID0gZmFsc2UpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpOnZvaWQKKyAgICB7CisgICAgICB0aGlzLnNvY2tldCA9IG5ldyBTb2NrZXQoKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuQ09OTkVDVCwgc29ja2V0Q29ubmVjdGVkKTsKKyAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SLCBzb2NrZXRFcnJvcik7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFNlY3VyaXR5RXJyb3JFdmVudC5TRUNVUklUWV9FUlJPUiwgc29ja2V0U2VjdXJpdHlFcnJvcik7CisgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFByb2dyZXNzRXZlbnQuU09DS0VUX0RBVEEsIHNvY2tldERhdGFIYW5kbGVyKTsKKyAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldENvbm5lY3RlZChldmVudDpFdmVudCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMub3V0cHV0ID0gdGhpcy5zb2NrZXQ7CisgICAgICB0aGlzLmlucHV0ID0gdGhpcy5zb2NrZXQ7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RXJyb3IoZXZlbnQ6SU9FcnJvckV2ZW50KTp2b2lkCisgICAgeworICAgICAgdHJhY2UoIkVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgIGlmIChpb0NhbGxiYWNrID09IG51bGwpCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFcnJvcihUVHJhbnNwb3J0RXJyb3IuVU5LTk9XTiwgIklPRXJyb3I6ICIgKyBldmVudC50ZXh0KSk7CisgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0U2VjdXJpdHlFcnJvcihldmVudDpTZWN1cml0eUVycm9yRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICB0cmFjZSgiU2VjdXJpdHkgRXJyb3IgQ29ubmVjdGluZzoiICsgZXZlbnQpOworICAgICAgdGhpcy5jbG9zZSgpOworICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldERhdGFIYW5kbGVyKGV2ZW50OlByb2dyZXNzRXZlbnQpOnZvaWQKKyAgICB7CisgICAgICBpZiAoaW9DYWxsYmFjayAhPSBudWxsKQorICAgICAgeworICAgICAgICBpb0NhbGxiYWNrKG51bGwpOworICAgICAgfQorICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkZ1bmN0aW9uID0gbnVsbCk6dm9pZAorICAgIHsKKyAgICAgIHRoaXMuaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgdGhpcy5vdXRwdXQud3JpdGVCeXRlcyh0aGlzLm9idWZmZXIpOworICAgICAgdGhpcy5zb2NrZXQuZmx1c2goKTsKKyAgICAgIHRoaXMub2J1ZmZlci5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKTpCb29sZWFuCisgICAgeworICAgICAgcmV0dXJuICh0aGlzLnNvY2tldCA9PSBudWxsID8gZmFsc2UgOiB0aGlzLnNvY2tldC5jb25uZWN0ZWQpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0M2E2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw4NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgRmluZCByZXF1aXJlZCBwYWNrYWdlcworZmluZF9wYWNrYWdlKEdMSUIgUkVRVUlSRUQgQ09NUE9ORU5UUyBnb2JqZWN0KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0dMSUJfSU5DTFVERV9ESVJTfSkKKworaW5jbHVkZV9kaXJlY3RvcmllcyhzcmMpCisKKyMgU1lTTElCUyBjb250YWlucyBsaWJyYXJpZXMgdGhhdCBuZWVkIHRvIGJlIGxpbmtlZCB0byBhbGwgbGliIHRhcmdldHMKK3NldChTWVNMSUJTICR7R0xJQl9MSUJSQVJJRVN9ICR7R0xJQl9HT0JKRUNUX0xJQlJBUklFU30pCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQyBnbGliIGxpYnJhcnkKK3NldCh0aHJpZnRfY19nbGliX1NPVVJDRVMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYworICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYworICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKKyAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworKQorCisjIElmIE9wZW5TU0wgaXMgbm90IGZvdW5kIGp1c3QgaWdub3JlIHRoZSBPcGVuU1NMIHN0dWZmCitmaW5kX3BhY2thZ2UoT3BlblNTTCkKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgICBsaXN0KCBBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKwkgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKKyAgICApCisgICAgaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorICAgIGxpc3QoQVBQRU5EIFNZU0xJQlMgIiR7T1BFTlNTTF9MSUJSQVJJRVN9IikKK2VuZGlmKCkKKworCisjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgQUREX0xJQlJBUllfVEhSSUZUIGFuZCBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdF9jX2dsaWIgJHt0aHJpZnRfY19nbGliX1NPVVJDRVN9KQorVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRfY19nbGliICR7U1lTTElCU30pCisKKyMgSW5zdGFsbCB0aGUgaGVhZGVycworaW5zdGFsbChESVJFQ1RPUlkgInNyYy90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisjIENvcHkgY29uZmlnLmggZmlsZQoraW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQklOQVJZX0RJUn0vdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiKQorCitpZihCVUlMRF9URVNUSU5HKQorICAgIGFkZF9zdWJkaXJlY3RvcnkodGVzdCkKK2VuZGlmKCkKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZDg5YjIyYy4uNDliNWIyMwotLS0gYS9saWIvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTE2LDcgKzE2LDcgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQorQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cwogU1VCRElSUyA9IC4gdGVzdAogCiBwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCkBAIC0yNCw2OCArMjQsOTIgQEAKIGxpYl9MVExJQlJBUklFUyA9IGxpYnRocmlmdF9jX2dsaWIubGEKIHBrZ2NvbmZpZ19EQVRBID0gdGhyaWZ0X2NfZ2xpYi5wYwogCi1jb21tb25fY2ZsYWdzID0gLWcgLVdhbGwgLVcgLVdlcnJvciAtSXNyYyAtSSBzcmMvdGhyaWZ0ICQoR0xJQl9DRkxBR1MpCi1jb21tb25fbGRmbGFncyA9IC1nIC1XYWxsIC1XICQoR0xJQl9MREZMQUdTKSBAR0NPVl9MREZMQUdTQAotCi0jIHRoaXMgcmVtb3ZlcyBvcHRpbWl6YXRpb25zIGFuZCBhZGRzIGNvdmVyYWdlIGZsYWdzCi1DRkxBR1MgPSBAR0NPVl9DRkxBR1NACitBTV9DUFBGTEFHUyA9IC1Jc3JjIC1JIHNyYy90aHJpZnQvY19nbGliCitBTV9DRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKLWxpYnRocmlmdF9jX2dsaWJfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvdGhyaWZ0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90aHJpZnRfc3RydWN0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci90aHJpZnRfc2VydmVyLmMgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYworbGlidGhyaWZ0X2NfZ2xpYl9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwogCi1saWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoY29tbW9uX2NmbGFncykKK2xpYnRocmlmdF9jX2dsaWJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykKK2xpYnRocmlmdF9jX2dsaWJfbGFfTERGTEFHUyA9ICQoQU1fTERGTEFHUykgJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSAKIAogaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdC9jX2dsaWIKIGluY2x1ZGVfdGhyaWZ0X0hFQURFUlMgPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RocmlmdC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90aHJpZnRfc3RydWN0LmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmgKIAogaW5jbHVkZV9wcm90b2NvbGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3Byb3RvY29sCi1pbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCitpbmNsdWRlX3Byb3RvY29sX0hFQURFUlMgPSBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiBpbmNsdWRlX3RyYW5zcG9ydGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3RyYW5zcG9ydAotaW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IHNyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCitpbmNsdWRlX3RyYW5zcG9ydF9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaAogCiBpbmNsdWRlX3NlcnZlcmRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3NlcnZlcgotaW5jbHVkZV9zZXJ2ZXJfSEVBREVSUyA9IHNyYy90aHJpZnQvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaAoraW5jbHVkZV9zZXJ2ZXJfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oCiAKIGluY2x1ZGVfcHJvY2Vzc29yZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvY2Vzc29yCi1pbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gc3JjL3RocmlmdC9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCitpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAogCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgUkVBRE1FIFwKKyAgICAgICAgICAgICBDTWFrZUxpc3RzLnR4dCBcCisgICAgICAgICAgICAgY29kaW5nX3N0YW5kYXJkcy5tZCBcCisgICAgICAgICAgICAgUkVBRE1FLm1kIFwKICAgICAgICAgICAgICB0ZXN0L2dsaWIuc3VwcHJlc3MgXAogICAgICAgICAgICAgIHRocmlmdF9jX2dsaWIucGMuaW4KIApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9SRUFETUUgYi9saWIvY19nbGliL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3MGQwOC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLVRocmlmdCBDIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggQwotPT09PT09PT09PT09PT09PT09PQotCi1UaGUgVGhyaWZ0IEMgbGlicmFyaWVzIGFyZSBidWlsdCB1c2luZyB0aGUgR05VIHRvb2xzLiAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKLWluIHRoZSB0b3AtbGV2ZWwgUkVBRE1FIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBNYWtlZmlsZXMuCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLUdMaWIKLWh0dHA6Ly93d3cuZ3RrLm9yZy8KLQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9SRUFETUUubWQgYi9saWIvY19nbGliL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDg0ZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9SRUFETUUubWQKQEAgLTAsMCArMSw0OSBAQAorVGhyaWZ0IEMgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitVc2luZyBUaHJpZnQgd2l0aCBDCis9PT09PT09PT09PT09PT09PT09CisKK1RoZSBUaHJpZnQgQyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuICBGb2xsb3cgdGhlIGluc3RydWN0aW9ucworaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIE1ha2VmaWxlcy4KKworRGVwZW5kZW5jaWVzCis9PT09PT09PT09PT0KKworR0xpYgoraHR0cDovL3d3dy5ndGsub3JnLworCitCcmVha2luZyBDaGFuZ2VzCis9PT09PT09PT09PT09PT09CisKKzAuMTIuMAorLS0tLS0tCisKK1RoZSBjb21waWxlcidzIGhhbmRsaW5nIG9mIG5hbWVzcGFjZXMgd2hlbiBnZW5lcmF0aW5nIHRoZSBuYW1lIG9mIHR5cGVzLAorZnVuY3Rpb25zIGFuZCBoZWFkZXIgZmlsZXMgaGFzIGJlZW4gaW1wcm92ZWQuIFRoaXMgbWVhbnMgY29kZSB3cml0dGVuIHRvIHVzZQorY2xhc3NlcyBnZW5lcmF0ZWQgYnkgcHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIGNvbXBpbGVyIG1heSBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8KK3JlZmxlY3QgdGhlIHByb3BlciBjb252ZW50aW9uIGZvciBjbGFzcyBuYW1lcywgd2hpY2ggaXMKKworLSBBIGxvd2VyY2FzZSwgW3NuYWtlLWNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NuYWtlX2Nhc2UpCisgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcycgbmFtZXNwYWNlLCBmb2xsb3dlZCBieQorLSBBbiB1bmRlcnNjb3JlIGFuZAorLSBBIGxvd2VyY2FzZSwgc25ha2UtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWUuCmRpZmYgLS1naXQgYS9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY19nbGliL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiM2EwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDUgQEAKKyMjIEMgR2xpYiBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW0dOT01FIEMgQ29kaW5nIFN0eWxlXShodHRwczovL2hlbHAuZ25vbWUub3JnL3VzZXJzL3Byb2dyYW1taW5nLWd1aWRlbGluZXMvc3RhYmxlL2MtY29kaW5nLXN0eWxlLmh0bWwuZW4pCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkNjIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuYwpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST0NFU1NPUikKKworZ2Jvb2xlYW4KK3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdjaGFyICpmbmFtZTsKKyAgVGhyaWZ0TWVzc2FnZVR5cGUgbXR5cGU7CisgIGdpbnQzMiBzZXFpZDsKKyAgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKmRpc3BhdGNoX3Byb2Nlc3NvciA9CisgICAgVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUiAocHJvY2Vzc29yKTsKKworICAvKiBSZWFkIHRoZSBzdGFydCBvZiB0aGUgbWVzc2FnZSwgd2hpY2ggd2UgZXhwZWN0IHRvIGJlIGEgbWV0aG9kIGNhbGwgKi8KKyAgaWYgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpIDwgMCkgeworICAgIGdfd2FybmluZyAoImVycm9yIHJlYWRpbmcgc3RhcnQgb2YgbWVzc2FnZTogJXMiLAorICAgICAgICAgICAgICAgKGVycm9yICE9IE5VTEwpID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGVsc2UgaWYgKG10eXBlICE9IFRfQ0FMTCAmJiBtdHlwZSAhPSBUX09ORVdBWSkgeworICAgIGdfd2FybmluZyAoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIERpc3BhdGNoIHRoZSBtZXRob2QgY2FsbCAqLworICByZXR1cm4gVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9HRVRfQ0xBU1MgKGRpc3BhdGNoX3Byb2Nlc3NvcikKKyAgICAtPmRpc3BhdGNoX2NhbGwgKGRpc3BhdGNoX3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGluLAorICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3JlYWxfZGlzcGF0Y2hfY2FsbCAoVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3IgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisgIGdpbnQzMiByZXN1bHQ7CisgIGdib29sZWFuIGRpc3BhdGNoX3Jlc3VsdCA9IEZBTFNFOworCisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKKworICAvKiBCeSBkZWZhdWx0LCByZXR1cm4gYW4gYXBwbGljYXRpb24gZXhjZXB0aW9uIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUKKyAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisKKyAgaWYgKCh0aHJpZnRfcHJvdG9jb2xfc2tpcCAoaW4sIFRfU1RSVUNULCBlcnJvcikgPCAwKSB8fAorICAgICAgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChpbiwgZXJyb3IpIDwgMCkpCisgICAgcmV0dXJuIEZBTFNFOworCisgIGdfb2JqZWN0X2dldCAoaW4sICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgcmVzdWx0ID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcik7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICBpZiAocmVzdWx0IDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgaWYgKHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpIDwgMCkKKyAgICByZXR1cm4gRkFMU0U7CisgIG1lc3NhZ2UgPSBnX3N0cmNvbmNhdCAoIkludmFsaWQgbWV0aG9kIG5hbWU6ICciLCBmbmFtZSwgIiciLCBOVUxMKTsKKyAgZ19mcmVlIChmbmFtZSk7CisgIHhjZXB0aW9uID0KKyAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2ZyZWUgKG1lc3NhZ2UpOworICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOworICBpZiAoKHJlc3VsdCA8IDApIHx8CisgICAgICAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChvdXQsIGVycm9yKSA8IDApKQorICAgIHJldHVybiBGQUxTRTsKKworICBnX29iamVjdF9nZXQgKG91dCwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICBkaXNwYXRjaF9yZXN1bHQgPQorICAgICgodGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgZXJyb3IpID49IDApICYmCisgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIHJldHVybiBkaXNwYXRjaF9yZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2luaXQgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm9jZXNzb3JDbGFzcyAqcHJvY2Vzc29yX2NsYXNzID0KKyAgICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTIChrbGFzcyk7CisKKyAgLyogSW1wbGVtZW50IFRocmlmdFByb2Nlc3NvcidzIHByb2Nlc3MgbWV0aG9kICovCisgIHByb2Nlc3Nvcl9jbGFzcy0+cHJvY2VzcyA9IHRocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3JfcHJvY2VzczsKKworICAvKiBQcm92aWRlIGEgZGVmYXVsdCBpbXBsZW1lbnQgZm9yIGRpc3BhdGNoX2NhbGwsIHdoaWNoIHJldHVybnMgYW4gZXhjZXB0aW9uCisgICAgIHRvIHRoZSBjbGllbnQgaW5kaWNhdGluZyB0aGUgbWV0aG9kIG5hbWUgd2FzIG5vdCByZWNvZ25pemVkICovCisgIGtsYXNzLT5kaXNwYXRjaF9jYWxsID0gdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvcl9yZWFsX2Rpc3BhdGNoX2NhbGw7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmYjg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9ESVNQQVRDSF9QUk9DRVNTT1JfSAorI2RlZmluZSBfVEhSSUZUX0RJU1BBVENIX1BST0NFU1NPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmgKKyAqICBcYnJpZWYgUGFyc2VzIGEgbWV0aG9kLWNhbGwgbWVzc2FnZSBoZWFkZXIgYW5kIGludm9rZXMgYSBmdW5jdGlvbgorICogICAgICAgICB0byBkaXNwYXRjaCB0aGUgY2FsbCBieSBmdW5jdGlvbiBuYW1lLgorICoKKyAqIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yIGlzIGFuIGFic3RyYWN0IGhlbHBlciBjbGFzcyB0aGF0IHBhcnNlcyB0aGUKKyAqIGhlYWRlciBvZiBhIG1ldGhvZC1jYWxsIG1lc3NhZ2UgYW5kIGludm9rZXMgYSBtZW1iZXIgZnVuY3Rpb24sCisgKiBkaXNwYXRjaF9jYWxsLCB3aXRoIHRoZSBtZXRob2QncyBuYW1lLgorICoKKyAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgZGlzcGF0Y2hfY2FsbCB0byBkaXNwYXRjaCB0aGUgbWV0aG9kIGNhbGwKKyAqIHRvIHRoZSBpbXBsZW1lbnRpbmcgZnVuY3Rpb24uCisgKi8KKworLyogVHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SICh0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SLCBUaHJpZnREaXNwYXRjaFByb2Nlc3NvcikpCisjZGVmaW5lIFRIUklGVF9JU19ESVNQQVRDSF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IsIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRElTUEFUQ0hfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9ESVNQQVRDSF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SLCBUaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzKSkKKworLyohCisgKiBUaHJpZnQgRGlzcGF0Y2ggUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdERpc3BhdGNoUHJvY2Vzc29yIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yOworCisvKiEKKyAqIFRocmlmdCBEaXNwYXRjaCBQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICAvKiBwdWJsaWMgKi8KKyAgZ2Jvb2xlYW4gKCpwcm9jZXNzKSAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisgIC8qIHByb3RlY3RlZCAqLworICBnYm9vbGVhbiAoKmRpc3BhdGNoX2NhbGwpIChUaHJpZnREaXNwYXRjaFByb2Nlc3NvciAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnREaXNwYXRjaFByb2Nlc3NvckNsYXNzIFRocmlmdERpc3BhdGNoUHJvY2Vzc29yQ2xhc3M7CisKKy8qIFVzZWQgYnkgVEhSSUZUX1RZUEVfRElTUEFUQ0hfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgYSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0RGlzcGF0Y2hQcm9jZXNzb3JDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfRElTUEFUQ0hfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGEwZjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmg+CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IsIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IsIFRIUklGVF9UWVBFX1BST0NFU1NPUikKKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FTkQKK307CisKK3N0YXRpYyBHUGFyYW1TcGVjICp0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FTkRdID0geyBOVUxMLCB9OworCisKK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3JfaW1wbChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihwcm9jZXNzb3IpOworICBnX2hhc2hfdGFibGVfcmVwbGFjZShzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcywKKwkJICAgICAgIGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKSwKKwkJICAgICAgIGdfb2JqZWN0X3JlZiAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yKSk7CisKKyAgLyogTWFrZSBmaXJzdCByZWdpc3RlcmVkIGJlY29tZSBkZWZhdWx0ICovCisgIGlmKCFzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUgPSBnX3N0cmR1cChtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbCAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKKwkJCQkJICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBnYm9vbGVhbiB0b2tlbl9lcnJvciA9IEZBTFNFOworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb247CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGU7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihwcm9jZXNzb3IpOworICBUaHJpZnRQcm9jZXNzb3IgKm11bHRpcGxleGVkX3Byb2Nlc3NvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OworICBjaGFyICp0b2tlbj1OVUxMOworICBpbnQgdG9rZW5faW5kZXg9MDsKKyAgY2hhciAqc3RhdGU9TlVMTDsKKyAgZ2NoYXIgKmZuYW1lPU5VTEw7CisgIGdpbnQzMiBzZXFpZCwgcmVzdWx0OworCisgIC8qIEZJWE1FIEl0IHNlZW1zIHRoYXQgcHJldmlvdXMgcHJvY2Vzc29yIGlzIG5vdCBtYW5hZ2luZyBlcnJvciBjb3JyZWN0bHkgKi8KKyAgaWYoKmVycm9yIT1OVUxMKSB7CisgICAgICBnX2RlYnVnICgidGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvcjogbGFzdCBlcnJvciBub3QgcmVtb3ZlZDogJXMiLAorICAgICAgCQkgICAqZXJyb3IgIT0gTlVMTCA/ICgqZXJyb3IpLT5tZXNzYWdlIDogIihudWxsKSIpOworICAgICAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICB9CisKKworICBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTKGluKS0+cmVhZF9tZXNzYWdlX2JlZ2luKGluLCAmZm5hbWUsICZtZXNzYWdlX3R5cGUsICZzZXFpZCwgZXJyb3IpOworCisgIGlmKCEobWVzc2FnZV90eXBlID09IFRfQ0FMTCB8fCBtZXNzYWdlX3R5cGUgPT0gVF9PTkVXQVkpKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9UWVBFLAorCQkgICAibWVzc2FnZSB0eXBlIGludmFsaWQgZm9yIHRoaXMgcHJvY2Vzc29yIik7CisgIH1lbHNleworICAgICAgLyogU3BsaXQgYnkgdGhlIHRva2VuICovCisgICAgICBmb3IgKHRva2VuID0gc3RydG9rX3IoZm5hbWUsIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiwgJnN0YXRlKSwKKwkgIHRva2VuX2luZGV4PTA7CisJICB0b2tlbiAhPSBOVUxMICYmICF0b2tlbl9lcnJvcjsKKwkgIHRva2VuID0gc3RydG9rX3IoTlVMTCwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgICAgIHRva2VuX2luZGV4KyspCisJeworCSAgc3dpdGNoKHRva2VuX2luZGV4KXsKKwkgICAgY2FzZSAwOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gZ19oYXNoX3RhYmxlX2xvb2t1cChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcywgdG9rZW4pOworCSAgICAgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJCSAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICB9CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgMToKKwkgICAgICAvKiBJdCBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKwkgICAgICBzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsCisJCQkJCQkgICAgICAicHJvdG9jb2wiLCBpbiwKKwkJCQkJCSAgICAgICJuYW1lIiwgdG9rZW4sCisJCQkJCQkgICAgICAidHlwZSIsIG1lc3NhZ2VfdHlwZSwKKwkJCQkJCSAgICAgICJzZXFpZCIsIHNlcWlkLAorCQkJCQkJICAgICAgTlVMTCk7CisJICAgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorCQkJICAgInRoZSBtZXNzYWdlIGhhcyBtb3JlIHRva2VucyB0aGFuIGV4cGVjdGVkISIpOworCSAgICAgIHRva2VuX2Vycm9yPVRSVUU7CisJICAgICAgYnJlYWs7CisJICB9CisJfQorICAgICAgLyogU2V0IGRlZmF1bHQgKi8KKyAgICAgIGlmKCFzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCAmJgorCSAgIW11bHRpcGxleGVkX3Byb2Nlc3NvciAmJgorCSAgdG9rZW5faW5kZXg9PTEgJiYgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSl7CisJICAvKiBJdCBzaG91bGQgYmUgdGhlIHNlcnZpY2UgbmFtZSAqLworCSAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gZ19oYXNoX3RhYmxlX2xvb2t1cChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcywgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICBpZihtdWx0aXBsZXhlZF9wcm9jZXNzb3I9PU5VTEwpeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCQkgICAic2VydmljZSAlcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgcHJvY2Vzc29yIiwKKwkJCSAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworCSAgfWVsc2V7CisJICAgICAgLyogU2V0IHRoZSBtZXNzYWdlIG5hbWUgdG8gdGhlIG9yaWdpbmFsIG5hbWUgKi8KKwkgICAgICBzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsCisJCQkJCQkgICAgICAicHJvdG9jb2wiLCBpbiwKKwkJCQkJCSAgICAgICJuYW1lIiwgZm5hbWUsCisJCQkJCQkgICAgICAidHlwZSIsIG1lc3NhZ2VfdHlwZSwKKwkJCQkJCSAgICAgICJzZXFpZCIsIHNlcWlkLAorCQkJCQkJICAgICAgTlVMTCk7CisJICB9CisKKyAgICAgIH0KKworICAgICAgaWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2whPU5VTEwgJiYgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yIT1OVUxMKXsKKwkgIHJldHZhbCA9IFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpLT5wcm9jZXNzIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIChUaHJpZnRQcm90b2NvbCAqKSBzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCwgb3V0LCBlcnJvcikgOworICAgICAgfWVsc2V7CisJICBpZighZXJyb3IpCisJICBnX3NldF9lcnJvciAoZXJyb3IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkgICAgICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRVJWSUNFX1VOQVZBSUxBQkxFLAorCQkgICAgICAgInNlcnZpY2UgJXMgaXMgbm90IG11bHRpcGxleGVkIGluIHRoaXMgcHJvY2Vzc29yIiwKKwkJICAgICAgIGZuYW1lKTsKKyAgICAgIH0KKworCisgIH0KKworICBpZighcmV0dmFsKXsKKyAgICAgIC8qIEJ5IGRlZmF1bHQsIHJldHVybiBhbiBhcHBsaWNhdGlvbiBleGNlcHRpb24gdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZQorICAgICAgICAgIG1ldGhvZCBuYW1lIGlzIG5vdCByZWNvZ25pemVkLiAqLworICAgICAgLyogQ29waWVkIGZyb20gZGlzcGFjaCBwcm9jZXNzb3IgKi8KKworICAgICAgaWYgKCh0aHJpZnRfcHJvdG9jb2xfc2tpcCAoaW4sIFRfU1RSVUNULCBlcnJvcikgPCAwKSB8fAorCSAgKHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChpbiwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChpbiwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgcmVzdWx0ID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAodHJhbnNwb3J0LCBlcnJvcik7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisJICByZXR1cm4gcmV0dmFsOworICAgICAgfQorCisgICAgICBpZiAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKG91dCwKKwkJCQkJICAgICAgIGZuYW1lLAorCQkJCQkgICAgICAgVF9FWENFUFRJT04sCisJCQkJCSAgICAgICBzZXFpZCwKKwkJCQkJICAgICAgIGVycm9yKSA8IDApeworCSAgLyogV2UgbXVzdCBmcmVlIGZuYW1lICovCisJICBnX2ZyZWUoZm5hbWUpOworCisJICByZXR1cm4gcmV0dmFsOworICAgICAgfQorCisKKyAgICAgIHhjZXB0aW9uID0KKwkgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLAorCQkJInR5cGUiLCAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELAorCQkJIm1lc3NhZ2UiLCAoKmVycm9yKS0+bWVzc2FnZSwKKwkJCU5VTEwpOworICAgICAgcmVzdWx0ID0gdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAoeGNlcHRpb24pLAorCQkJCSAgICBvdXQsCisJCQkJICAgIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7CisgICAgICBpZiAoKHJlc3VsdCA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChvdXQsIGVycm9yKSA8IDApKQorCXJldHVybiByZXR2YWw7CisKKyAgICAgIGdfb2JqZWN0X2dldCAob3V0LCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXR2YWwgPQorCSAgKCh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkgJiYKKwkgICAgICAodGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBlcnJvcikgPj0gMCkpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisgIH1lbHNleworICAgICAgLyogVGhlIHByb3RvY29sIG5vdyBoYXMgYSBjb3B5IHdlIGNhbiBmcmVlIGl0ICovCisgICAgICBnX2ZyZWUoZm5hbWUpOworCisgIH0KKworICAvKgorICBGSVhNRSBUaGlzIG1ha2VzIGV2ZXJ5dGhpbmcgZmFpbCwgSSBkb24ndCBrbm93IHdoeS4KKyAgaWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2whPU5VTEwpeworCSAgLy8gQWZ0ZXIgaXRzIHVzZSB3ZSBtdXN0IGZyZWUgaXQKKwkgIGdfb2JqZWN0X3VucmVmKHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sKTsKKyAgfQorICAqLworICByZXR1cm4gcmV0dmFsOworfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCB0cmFuc3BvcnRzICovCitHUXVhcmsKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9ET01BSU4pOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FOgorICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FOgorICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqZWN0KTsKKworICAvKiBGcmVlIG91ciBtdWx0aXBsZXhlZCBoYXNoIHRhYmxlICovCisgIGdfaGFzaF90YWJsZV91bnJlZiAoc2VsZi0+bXVsdGlwbGV4ZWRfc2VydmljZXMpOworICBzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyA9IE5VTEw7CisKKyAgaWYoc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSl7CisgICAgICBnX2ZyZWUoc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgICBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lPU5VTEw7CisgIH0KKworICAvKiBDaGFpbiB1cCB0byBwYXJlbnQgKi8KKyAgaWYgKEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKQorICAgICgqR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpIChvYmplY3QpOworfQorCisvKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MgKmNscykKK3sKKyAgLyogT3ZlcnJpZGUgKi8KKyAgVEhSSUZUX1BST0NFU1NPUl9DTEFTUyhjbHMpLT5wcm9jZXNzID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wcm9jZXNzX2ltcGw7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworCisgIC8qIE9iamVjdCBtZXRob2RzICovCisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplOworCisgIC8qIENsYXNzIG1ldGhvZHMgKi8KKyAgY2xzLT5yZWdpc3Rlcl9wcm9jZXNzb3IgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsOworCisKKyAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUVdID0KKyAgICAgIGdfcGFyYW1fc3BlY19zdHJpbmcgKCJkZWZhdWx0IiwKKyAgICAgICAgICAiRGVmYXVsdCBzZXJ2aWNlIG5hbWUgdGhlIHByb3RvY29sIHBvaW50cyB0byB3aGVyZSBubyBtdWx0aXBsZXhlZCBjbGllbnQgdXNlZCIsCisgICAgICAgICAgIlNldCB0aGUgZGVmYXVsdCBzZXJ2aWNlIG5hbWUiLAorICAgICAgICAgIE5VTEwsCisgICAgICAgICAgKEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChnb2JqZWN0X2NsYXNzLAorCQkJCSAgICAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORCwKKyAgICAgIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXMpOworCit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2luaXQgKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmKQoreworCisgIC8qIENyZWF0ZSBvdXIgbXVsdGlwbGV4ZWQgc2VydmljZXMgaGFzaCB0YWJsZSAqLworICBzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyA9IGdfaGFzaF90YWJsZV9uZXdfZnVsbCAoCisgICAgICBnX3N0cl9oYXNoLAorICAgICAgZ19zdHJfZXF1YWwsCisgICAgICBnX2ZyZWUsCisgICAgICBnX29iamVjdF91bnJlZik7CisgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUgPSBOVUxMOworfQorCisKK2dib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0dFVF9DTEFTUyhwcm9jZXNzb3IpLT5yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLCBlcnJvcik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDY2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKKyAqCisgKiAgQ3JlYXRlZCBvbjogMTQgc2VwdC4gMjAxNworICogICAgICBBdXRob3I6IGdhZ3VpbGFyCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXworI2RlZmluZSBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXworCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICogIFxicmllZiBUaGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGZvciBjX2dsaWIuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLCBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcikpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SLCBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzKSkKKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTiAidGhyaWZ0LW11bHRpcGxleGVkLXByb2Nlc3Nvci1lcnJvci1xdWFyayIKKworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZFByb2Nlc3NvciBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcgoreworICBUaHJpZnRQcm9jZXNzb3IgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ2NoYXIgKiBkZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lOworICBHSGFzaFRhYmxlICptdWx0aXBsZXhlZF9zZXJ2aWNlczsKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcworeworICBUaHJpZnRQcm9jZXNzb3JDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCogcmVnaXN0ZXJfcHJvY2Vzc29yKSAoVGhyaWZ0UHJvY2Vzc29yICpzZWxmLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcik7CisKK307Cit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzOworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiAqLworR1R5cGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFByb3RvY29sICppbiwgVGhyaWZ0UHJvdG9jb2wgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIFB1YmxpYyBBUEkgKi8KKworLyoqCisgKiBAYnJpZWYgUmVnaXN0ZXJzIGEgcHJvY2Vzc29yIGluIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgdW5kZXIgaXRzIG5hbWUuIEl0CisgKiB3aWxsIHRha2UgYSByZWZlcmVuY2UgdG8gdGhlIHByb2Nlc3NvciBzbyByZWZjb3VudCB3aWxsIGJlIGluY3JlbWVudGVkLgorICogSXQgd2lsbCBhbHNvIGJlIGRlY3JlbWVudGVkIG9uIG9iamVjdCBkZXN0cnVjdGlvbi4KKyAqCisgKiBUaGUgZmlyc3QgcmVnaXN0ZXJlZCBwcm9jZXNzb3IgYmVjb21lcyBkZWZhdWx0LiBCdXQgeW91IGNhbiBvdmVycmlkZSBpdCB3aXRoCisgKiAiZGVmYXVsdCIgcHJvcGVydHkuCisgKgorICogSXQgcmV0dXJucyBhIGNvbXBsaWFudCBlcnJvciBpZiBpdCBjYW5ub3QgYmUgcmVnaXN0ZXJlZC4KKyAqCisgKiBAcGFyYW0gcHJvY2Vzc29yIFBvaW50ZXIgdG8gdGhlIG11bHRpcGxleGVkIHByb2Nlc3Nvci4KKyAqIEBwYXJhbSBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSBOYW1lIG9mIHRoZSBwcm9jZXNzb3IgeW91IHdhbnQgdG8gcmVnaXN0ZXIKKyAqIEBwYXJhbSBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgUG9pbnRlciB0byBpbXBsZW1lbnRlZCBwcm9jZXNzb3IgeW91IHdhbnQgbXVsdGlwbGV4LgorICogQHBhcmFtIGVycm9yIEVycm9yIG9iamVjdCB3aGVyZSB3ZSBzaG91bGQgc3RvcmUgZXJyb3JzLgorICoKKyAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ25vbWUub3JnL2dsaWIvc3RhYmxlL2dsaWItRXJyb3ItUmVwb3J0aW5nLmh0bWwjZy1zZXQtZXJyb3IKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9UWVBFLAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX01FU1NBR0VfV1JPTkdMWV9NVUxUSVBMRVhFRCwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9TRU5ELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1JFQ0VJVkUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfQ0xPU0UKK30gVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JFcnJvcjsKKworCitHUXVhcmsgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZXJyb3JfcXVhcmsgKCkpCisKKworR19FTkRfREVDTFMKKworCisjZW5kaWYgLyogX1RIUklGVF9NVUxUSVBMRVhFRF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQyYzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFByb2Nlc3NvciwgdGhyaWZ0X3Byb2Nlc3NvciwgR19UWVBFX09CSkVDVCkKKworZ2Jvb2xlYW4KK3RocmlmdF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybgorICAgIFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChwcm9jZXNzb3IpLT5wcm9jZXNzIChwcm9jZXNzb3IsIGluLCBvdXQsIGVycm9yKTsKK30KKworLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvY2Vzc29yQ2xhc3MgKmNscykKK3sKKyAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCisgIGNscy0+cHJvY2VzcyA9IHRocmlmdF9wcm9jZXNzb3JfcHJvY2VzczsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm9jZXNzb3IpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmQyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPQ0VTU09SX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm9jZXNzb3IuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb2Nlc3NvcnMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPQ0VTU09SICh0aHJpZnRfcHJvY2Vzc29yX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3IpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPQ0VTU09SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKSkKKyNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsIFRocmlmdFByb2Nlc3NvckNsYXNzKSkKKworLyohCisgKiBUaHJpZnQgUHJvY2Vzc29yb2JqZWN0CisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yCit7CisgIEdPYmplY3QgcGFyZW50OworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm9jZXNzb3IgVGhyaWZ0UHJvY2Vzc29yOworCisvKiEKKyAqIFRocmlmdCBQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRQcm9jZXNzb3JDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKnByb2Nlc3MpIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcik7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvckNsYXNzIFRocmlmdFByb2Nlc3NvckNsYXNzOworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST0NFU1NPUiAqLworR1R5cGUgdGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmQwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDkxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbCwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCisKK3N0YXRpYyBndWludDY0Cit0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGdkb3VibGUgdikKK3sKKyAgdW5pb24geworICAgIGdkb3VibGUgZnJvbTsKKyAgICBndWludDY0IHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitzdGF0aWMgZ2RvdWJsZQordGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChndWludDY0IHYpCit7CisgIHVuaW9uIHsKKyAgICBndWludDY0IGZyb207CisgICAgZ2RvdWJsZSB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiB2ZXJzaW9uID0gKFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xKQorICAgICAgICAgICAgICAgICAgIHwgKChnaW50MzIpIG1lc3NhZ2VfdHlwZSk7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBUX1NUT1AsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgKGdpbnQzMikgc2l6ZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDggdG1wOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICB0bXAgPSB2YWx1ZSA/IDEgOiAwOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCB0bXAsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgICAKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZ2YWx1ZSwgMSwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MTYgbmV0OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBuZXQgPSBnX2h0b25zICh2YWx1ZSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCAyLCBlcnJvcikpCisgIHsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiBuZXQ7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIG5ldCA9IGdfaHRvbmwgKHZhbHVlKTsKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDQsIGVycm9yKSkKKyAgeworICAgIHJldHVybiA0OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDY0IG5ldDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgbmV0ID0gR1VJTlQ2NF9UT19CRSAodmFsdWUpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgOCwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZG91YmxlIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ2NCBiaXRzOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBiaXRzID0gR1VJTlQ2NF9GUk9NX0JFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7CisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKQorICB7CisgICAgcmV0dXJuIDg7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQzMiBsZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGxlbiA9IHN0ciAhPSBOVUxMID8gc3RybGVuIChzdHIpIDogMDsKKyAgLyogd3JpdGUgdGhlIHN0cmluZyBsZW5ndGggKyAxIHdoaWNoIGluY2x1ZGVzIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCAoY29uc3QgZ3BvaW50ZXIpIHN0ciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgbGVuLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAobGVuID4gMCkKKyAgeworICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IGxlbjsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDMyIHN6OworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzeiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHN6IDwgMCkKKyAgeworICAgIC8qIGNoZWNrIGZvciB2ZXJzaW9uICovCisgICAgZ3VpbnQzMiB2ZXJzaW9uID0gc3ogJiBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKKyAgICB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZlcnNpb24gJWQsIGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEsIHZlcnNpb24pOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgICptZXNzYWdlX3R5cGUgPSAoVGhyaWZ0TWVzc2FnZVR5cGUpIChzeiAmIDB4MDAwMDAwZmYpOworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICAqbmFtZSA9IE5VTEw7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQ4IHR5cGU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChuYW1lKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdHlwZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICpmaWVsZF90eXBlID0gKFRocmlmdFR5cGUpIHR5cGU7CisgIGlmICgqZmllbGRfdHlwZSA9PSBUX1NUT1ApCisgIHsKKyAgICAqZmllbGRfaWQgPSAwOworICAgIHJldHVybiB4ZmVyOworICB9CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgZmllbGRfaWQsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlciA9IDA7CisgIGdpbnQ4IGssIHY7CisgIGdpbnQzMiBzaXplaTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmssIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworICAqa2V5X3R5cGUgPSAoVGhyaWZ0VHlwZSkgazsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgICp2YWx1ZV90eXBlID0gKFRocmlmdFR5cGUpIHY7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmc2l6ZWksIGVycm9yKSkgPDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHNpemVpIDwgMCkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgc2l6ZWkpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICpzaXplID0gKGd1aW50MzIpIHNpemVpOworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnaW50OCBlOworICBnaW50MzIgc2l6ZWk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZlLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKyAgKmVsZW1lbnRfdHlwZSA9IChUaHJpZnRUeXBlKSBlOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnNpemVpLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZWkgPCAwKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBzaXplaSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgKnNpemUgPSAoZ3VpbnQzMikgc2l6ZWk7CisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsIGVsZW1lbnRfdHlwZSwgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPSAKKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9ICooZ2ludDggKikgYiAhPSAwOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gKihnaW50OCAqKSBiOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVsyXTsKKyAgICBnaW50MTYgaW50MTY7CisgIH0gYjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5ieXRlX2FycmF5LCAyLCBlcnJvcikpIDwgMCkKKyAgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqdmFsdWUgPSBnX250b2hzIChiLmludDE2KTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24KKyAgeworICAgIGdpbnQ4IGJ5dGVfYXJyYXlbNF07CisgICAgZ2ludDMyIGludDMyOworICB9IGI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIuYnl0ZV9hcnJheSwgNCwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKnZhbHVlID0gZ19udG9obCAoYi5pbnQzMik7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIHVuaW9uCisgIHsKKyAgICBnaW50OCBieXRlX2FycmF5WzhdOworICAgIGdpbnQ2NCBpbnQ2NDsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDgsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IEdVSU5UNjRfRlJPTV9CRSAoYi5pbnQ2NCk7CisgIHJldHVybiByZXQ7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICB1bmlvbgorICB7CisgICAgZ2ludDggYnl0ZV9hcnJheVs4XTsKKyAgICBndWludDY0IHVpbnQ2NDsKKyAgfSBiOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLmJ5dGVfYXJyYXksIDgsIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9IHRocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAoR1VJTlQ2NF9GUk9NX0JFIChiLnVpbnQ2NCkpOworICByZXR1cm4gcmV0OworfQorCitnaW50MzIKK3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQzMiBsZW47CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDMyIHJlYWRfbGVuID0gMDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgLyogcmVhZCB0aGUgbGVuZ3RoIGludG8gcmVhZF9sZW4gKi8KKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgKi8KKyAgbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuICsgMTsgLyogc3BhY2UgZm9yIG51bGwgdGVybWluYXRvciAqLworICAqc3RyID0gZ19uZXcwIChnY2hhciwgbGVuKTsKKyAgaWYgKHJlYWRfbGVuID4gMCkgeworICAgIGlmICgocmV0ID0KKyAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgZ19mcmVlICgqc3RyKTsKKyAgICAgICpzdHIgPSBOVUxMOworICAgICAgbGVuID0gMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgKipzdHIgPSAwOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyID0gMDsKKyAgZ2ludDMyIHJlYWRfbGVuID0gMDsKKyAKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQorICB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmIChyZWFkX2xlbiA+IDApCisgIHsKKyAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWYsICpsZW4sIGVycm9yKSkgPCAwKQorICAgIHsKKyAgICAgIGdfZnJlZSAoKmJ1Zik7CisgICAgICAqYnVmID0gTlVMTDsKKyAgICAgICpsZW4gPSAwOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuOworICAgICpidWYgPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMzBiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wuaAorICogIFxicmllZiBCaW5hcnkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzKSkKKworLyogdmVyc2lvbiBudW1iZXJzICovCisjZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfVkVSU0lPTl8xIDB4ODAwMTAwMDAKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OX01BU0sgMHhmZmZmMDAwMAorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2wgVGhyaWZ0QmluYXJ5UHJvdG9jb2w7CisKKy8qIQorICogVGhyaWZ0IEJpbmFyeSBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBCaW5hcnkgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGU5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnksIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MICh0Yik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKnByb3RvY29sX2ZhY3RvcnlfY2xhc3MgPSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyAoY2xzKTsKKworICBwcm90b2NvbF9mYWN0b3J5X2NsYXNzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkYzA3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSAorI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3Rvcnk7CisKK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Cit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAqLworR1R5cGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNjA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KKworLyoKKyAqICpfdG9femlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAorICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCisgKiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gd2lsbCBub3Qgd29yay4KKyAqLworI2lmICFkZWZpbmVkKFNJR05FRF9SSUdIVF9TSElGVF9JUykgfHwgIWRlZmluZWQoQVJJVEhNRVRJQ19SSUdIVF9TSElGVCkKKyMgZXJyb3IgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGJlaGF2aW9yIG9mIGEgc2lnbmVkIHJpZ2h0IHNoaWZ0IgorI2VuZGlmCisjaWYgU0lHTkVEX1JJR0hUX1NISUZUX0lTICE9IEFSSVRITUVUSUNfUklHSFRfU0hJRlQKKyMgZXJyb3IgInRocmlmdF9jb21wYWN0X3Byb3RvY29sIG9ubHkgd29ya3MgaWYgc2lnbmVkIHJpZ2h0IHNoaWZ0IGlzIGFyaXRobWV0aWMiCisjZW5kaWYKKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdENvbXBhY3RQcm90b2NvbFByb3BlcnRpZXMKK3sKKyAgICBQUk9QXzAsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQsCisgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdENvbXBhY3RQcm90b2NvbCwgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wsCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworc3RhdGljIGNvbnN0IGdpbnQ4IFBST1RPQ09MX0lEID0gKGdpbnQ4KTB4ODJ1Oworc3RhdGljIGNvbnN0IGdpbnQ4IFZFUlNJT05fTiA9IDE7CitzdGF0aWMgY29uc3QgZ2ludDggVkVSU0lPTl9NQVNLID0gMHgxZjsgICAgICAgLyogMDAwMSAxMTExICovCitzdGF0aWMgY29uc3QgZ2ludDggVFlQRV9NQVNLID0gKGdpbnQ4KTB4ZTB1OyAgLyogMTExMCAwMDAwICovCitzdGF0aWMgY29uc3QgZ2ludDggVFlQRV9CSVRTID0gMHgwNzsgICAgICAgICAgLyogMDAwMCAwMTExICovCitzdGF0aWMgY29uc3QgZ2ludDMyIFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworZW51bSBUeXBlcyB7CisgIENUX1NUT1AgICAgICAgICAgID0gMHgwMCwKKyAgQ1RfQk9PTEVBTl9UUlVFICAgPSAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFICA9IDB4MDIsCisgIENUX0JZVEUgICAgICAgICAgID0gMHgwMywKKyAgQ1RfSTE2ICAgICAgICAgICAgPSAweDA0LAorICBDVF9JMzIgICAgICAgICAgICA9IDB4MDUsCisgIENUX0k2NCAgICAgICAgICAgID0gMHgwNiwKKyAgQ1RfRE9VQkxFICAgICAgICAgPSAweDA3LAorICBDVF9CSU5BUlkgICAgICAgICA9IDB4MDgsCisgIENUX0xJU1QgICAgICAgICAgID0gMHgwOSwKKyAgQ1RfU0VUICAgICAgICAgICAgPSAweDBBLAorICBDVF9NQVAgICAgICAgICAgICA9IDB4MEIsCisgIENUX1NUUlVDVCAgICAgICAgID0gMHgwQworfTsKKworc3RhdGljIGNvbnN0IGdpbnQ4IFRUeXBlVG9DVHlwZVsxNl0gPSB7CisgIENUX1NUT1AsIC8qIFRfU1RPUCAqLworICAwLCAvKiB1bnVzZWQgKi8KKyAgQ1RfQk9PTEVBTl9UUlVFLCAvKiBUX0JPT0wgKi8KKyAgQ1RfQllURSwgLyogVF9CWVRFICovCisgIENUX0RPVUJMRSwgLyogVF9ET1VCTEUgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0kxNiwgLyogVF9JMTYgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0kzMiwgLyogVF9JMzIgKi8KKyAgMCwgLyogdW51c2VkICovCisgIENUX0k2NCwgLyogVF9JNjQgKi8KKyAgQ1RfQklOQVJZLCAvKiBUX1NUUklORyAqLworICBDVF9TVFJVQ1QsIC8qIFRfU1RSVUNUICovCisgIENUX01BUCwgLyogVF9NQVAgKi8KKyAgQ1RfU0VULCAvKiBUX1NFVCAqLworICBDVF9MSVNULCAvKiBUX0xJU1QgKi8KK307CisKK3N0YXRpYyBndWludDY0Cit0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGNvbnN0IGdkb3VibGUgdikKK3sKKyAgdW5pb24geworICAgIGdkb3VibGUgZnJvbTsKKyAgICBndWludDY0IHRvOworICB9IHU7CisgIHUuZnJvbSA9IHY7CisgIHJldHVybiB1LnRvOworfQorCitzdGF0aWMgZ2RvdWJsZQordGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChjb25zdCBndWludDY0IHYpCit7CisgIHVuaW9uIHsKKyAgICBndWludDY0IGZyb207CisgICAgZ2RvdWJsZSB0bzsKKyAgfSB1OworICB1LmZyb20gPSB2OworICByZXR1cm4gdS50bzsKK30KKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBndWludDY0CitpNjRfdG9femlnemFnIChjb25zdCBnaW50NjQgbCkKK3sKKyAgcmV0dXJuICgoKGd1aW50NjQpbCkgPDwgMSkgXiAobCA+PiA2Myk7Cit9CisKKy8qKgorICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK3N0YXRpYyBndWludDMyCitpMzJfdG9femlnemFnIChjb25zdCBnaW50MzIgbikKK3sKKyAgcmV0dXJuICgoKGd1aW50MzIpbikgPDwgMSkgXiAobiA+PiAzMSk7Cit9CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICovCitzdGF0aWMgZ2ludDMyCit6aWd6YWdfdG9faTMyIChndWludDMyIG4pCit7CisgIHJldHVybiAobiA+PiAxKSBeIChndWludDMyKSAoLShnaW50MzIpIChuICYgMSkpOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICovCitzdGF0aWMgZ2ludDY0Cit6aWd6YWdfdG9faTY0IChndWludDY0IG4pCit7CisgIHJldHVybiAobiA+PiAxKSBeIChndWludDY0KSAoLShnaW50NjQpIChuICYgMSkpOworfQorCitUaHJpZnRUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90dHlwZSAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50OCB0eXBlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICAgIHJldHVybiBUX1NUT1A7CisgICAgY2FzZSBDVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgQ1RfQk9PTEVBTl9UUlVFOgorICAgICAgcmV0dXJuIFRfQk9PTDsKKyAgICBjYXNlIENUX0JZVEU6CisgICAgICByZXR1cm4gVF9CWVRFOworICAgIGNhc2UgQ1RfSTE2OgorICAgICAgcmV0dXJuIFRfSTE2OworICAgIGNhc2UgQ1RfSTMyOgorICAgICAgcmV0dXJuIFRfSTMyOworICAgIGNhc2UgQ1RfSTY0OgorICAgICAgcmV0dXJuIFRfSTY0OworICAgIGNhc2UgQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFRfRE9VQkxFOworICAgIGNhc2UgQ1RfQklOQVJZOgorICAgICAgcmV0dXJuIFRfU1RSSU5HOworICAgIGNhc2UgQ1RfTElTVDoKKyAgICAgIHJldHVybiBUX0xJU1Q7CisgICAgY2FzZSBDVF9TRVQ6CisgICAgICByZXR1cm4gVF9TRVQ7CisgICAgY2FzZSBDVF9NQVA6CisgICAgICByZXR1cm4gVF9NQVA7CisgICAgY2FzZSBDVF9TVFJVQ1Q6CisgICAgICByZXR1cm4gVF9TVFJVQ1Q7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCB0eXBlIik7CisgICAgICByZXR1cm4gLTE7CisgIH0KK30KKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IGJ1Zls1XTsKKyAgZ2ludDMyIHhmZXI7CisgIGd1aW50MzIgbTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHhmZXIgPSAwOworICBtID0gbjsKKworICB3aGlsZSAoVFJVRSkgeworICAgIGlmICgobSAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbeGZlcisrXSA9IChnaW50OCltOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KSgobSAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBtID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKS0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIHhmZXIsIGVycm9yKSkgeworICAgIHJldHVybiB4ZmVyOworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDY0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50NjQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQ4IGJ1ZlsxMF07CisgIGdpbnQzMiB4ZmVyOworICBndWludDY0IG07CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICB4ZmVyID0gMDsKKyAgbSA9IG47CisKKyAgd2hpbGUgKFRSVUUpIHsKKyAgICBpZiAoKG0gJiB+MHg3RkwpID09IDApIHsKKyAgICAgIGJ1Zlt4ZmVyKytdID0gKGdpbnQ4KW07CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3hmZXIrK10gPSAoZ2ludDgpKChtICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG0gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRIUklGVF9QUk9UT0NPTCAocHJvdG9jb2wpLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgeGZlciwgZXJyb3IpKSB7CisgICAgcmV0dXJuIHhmZXI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDY0ICppNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnRwOworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKyAgZ3VpbnQ2NCB2YWw7CisgIGdpbnQgc2hpZnQ7CisgIGd1aW50OCBieXRlOworCisgIHRwID0gVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCk7CisgIHhmZXIgPSAwOworICB2YWwgPSAwOworICBzaGlmdCA9IDA7CisgIGJ5dGUgPSAwOworCisgIHdoaWxlIChUUlVFKSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsICh0cC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSAmYnl0ZSwgMSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKyt4ZmVyOworICAgIHZhbCB8PSAoZ3VpbnQ2NCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTY0ID0gKGdpbnQ2NCkgdmFsOworICAgICAgcmV0dXJuIHhmZXI7CisgICAgfQorICAgIGlmIChHX1VOTElLRUxZICh4ZmVyID09IDEwKSkgeyAvKiA3ICogOSA8IDY0IDwgNyAqIDEwICovCisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZS1sZW5ndGggaW50IG92ZXIgMTAgYnl0ZXMiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KK30KKworLyoqCisgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gNSBieXRlcy4KKyAqLworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICppMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDY0IHZhbDsKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDY0IChwcm90b2NvbCwgJnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqaTMyID0gKGdpbnQzMil2YWw7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW5faW50ZXJuYWwgKFRocmlmdENvbXBhY3RQcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDggdHlwZV9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisgIGdpbnQ4IHR5cGVfdG9fd3JpdGU7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworCisgIHhmZXIgPSAwOworCisgIC8qIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4gKi8KKyAgdHlwZV90b193cml0ZQorICAgID0gKHR5cGVfb3ZlcnJpZGUgPT0gLTEgPyBUVHlwZVRvQ1R5cGVbZmllbGRfdHlwZV0gOiB0eXBlX292ZXJyaWRlKTsKKworICAvKiBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQgKi8KKyAgaWYgKGZpZWxkX2lkID4gcHJvdG9jb2wtPl9sYXN0X2ZpZWxkX2lkCisgICAgICAmJiBmaWVsZF9pZCAtIHByb3RvY29sLT5fbGFzdF9maWVsZF9pZCA8PSAxNSkgeworICAgIC8qIHdyaXRlIHRoZW0gdG9nZXRoZXIgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpICgoZmllbGRfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgNCB8IHR5cGVfdG9fd3JpdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICB9IGVsc2UgeworICAgIC8qIHdyaXRlIHRoZW0gc2VwYXJhdGUgKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChUSFJJRlRfUFJPVE9DT0wgKHByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3RvX3dyaXRlLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBwcm90b2NvbC0+X2xhc3RfZmllbGRfaWQgPSBmaWVsZF9pZDsKKyAgcmV0dXJuIHhmZXI7Cit9CisKKy8qKgorICogTWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICovCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIHhmZXIgPSAwOworCisgIGlmIChzaXplIDw9IDE0KSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoc2l6ZSA8PCA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUVHlwZVRvQ1R5cGVbZWxlbV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVEhSSUZUX1BST1RPQ09MIChwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAoMHhmMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFR5cGVUb0NUeXBlW2VsZW1fdHlwZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworCisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aW50MzIpIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworLyoKKyAqIHB1YmxpYyBtZXRob2RzCisgKi8KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQ4IHZlcnNpb247CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgdmVyc2lvbiA9IChWRVJTSU9OX04gJiBWRVJTSU9OX01BU0spCisgICAgICAgICAgICB8ICgoKGdpbnQzMikgbWVzc2FnZV90eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSyk7CisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBQUk9UT0NPTF9JRCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZlcnNpb24sIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpbnQzMikgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKyAgR1F1ZXVlICpxOworCisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGdfcXVldWVfcHVzaF90YWlsIChxLCBHSU5UX1RPX1BPSU5URVIgKChnaW50KSBjcC0+X2xhc3RfZmllbGRfaWQpKTsKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gMDsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKGdpbnQxNikgR1BPSU5URVJfVE9fSU5UIChnX3F1ZXVlX3BvcF90YWlsIChxKSk7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBpZiAoZmllbGRfdHlwZSA9PSBUX0JPT0wpIHsKKyAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSA9IG5hbWU7CisgICAgY3AtPl9ib29sX2ZpZWxkX3R5cGUgPSBmaWVsZF90eXBlOworICAgIGNwLT5fYm9vbF9maWVsZF9pZCA9IGZpZWxkX2lkOworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoY3AsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIFRfU1RPUCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsIChndWludDMyKSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAoc2l6ZSA+IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2ludDgpIChUVHlwZVRvQ1R5cGVba2V5X3R5cGVdIDw8IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFRUeXBlVG9DVHlwZVt2YWx1ZV90eXBlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfY29sbGVjdGlvbl9iZWdpbiAoY3AsIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2NvbGxlY3Rpb25fYmVnaW4gKGNwLCBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmIChjcC0+X2Jvb2xfZmllbGRfbmFtZSAhPSBOVUxMKSB7CisgICAgLyogd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0ICovCisgICAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbl9pbnRlcm5hbCAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+X2Jvb2xfZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5fYm9vbF9maWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPl9ib29sX2ZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSAodmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKworICAgIGNwLT5fYm9vbF9maWVsZF9uYW1lID0gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICAvKiB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZSAqLworICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkgKHZhbHVlID8gQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDVF9CT09MRUFOX0ZBTFNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfQorICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZ2YWx1ZSwgMSwgZXJyb3IpKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOworICB9Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQxNiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdG9femlnemFnICgoZ2ludDMyKSB2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHJldHVybiB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgaTMyX3RvX3ppZ3phZyAodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICByZXR1cm4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50NjQgKGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90b196aWd6YWcgKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBndWludDY0IGJpdHM7CisKKyAgZ19hc3NlcnQgKHNpemVvZiAoZ2RvdWJsZSkgPT0gc2l6ZW9mIChndWludDY0KSk7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBiaXRzID0gR1VJTlQ2NF9UT19MRSAodGhyaWZ0X2JpdHdpc2VfY2FzdF9ndWludDY0ICh2YWx1ZSkpOworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJmJpdHMsIDgsIGVycm9yKSkgeworICAgIHJldHVybiA4OworICB9IGVsc2UgeworICAgIHJldHVybiAtMTsKKyAgfQorfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc2l6ZV90IGxlbjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGxlbiA9IHN0ciAhPSBOVUxMID8gc3RybGVuIChzdHIpIDogMDsKKyAgaWYgKGxlbiA+IEdfTUFYSU5UMzIpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1NJWkVfTElNSVQsCisgICAgICAgICAgICAgICAgICJzdHJpbmcgc2l6ZSAoZ3Vlc3M6ICVsdSkgaXMgdG9vIGxhcmdlIiwgKHVuc2lnbmVkIGxvbmcpIGxlbik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogd3JpdGUgdGhlIHN0cmluZyBsZW5ndGggKyAxIHdoaWNoIGluY2x1ZGVzIHRoZSBudWxsIHRlcm1pbmF0b3IgKi8KKyAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCAoY29uc3QgZ3BvaW50ZXIpIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBndWludDMyKSBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAoY3AsIGxlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGxlbiA+IDApIHsKKyAgICAvKiBjaGVja2luZyBsZW4gKyB4ZmVyID4gdWludF9tYXgsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIG92ZXJmbG93IHdoaWxlCisgICAgICogY2hlY2tpbmcgZm9yIG92ZXJmbG93cy4gdHJhbnNmb3JtaW5nIHRvIGxlbiA+IHVpbnRfbWF4IC0geGZlci4KKyAgICAgKi8KKyAgICBpZiAobGVuID4gKGd1aW50MzIpIChHX01BWElOVDMyIC0geGZlcikpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICJzaXplICVkICsgJWQgaXMgdG9vIGxhcmdlIiwgbGVuLCB4ZmVyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSBidWYsIGxlbiwgZXJyb3IpID09IEZBTFNFKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gbGVuOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0TWVzc2FnZVR5cGUgKm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ2ludDggcHJvdG9jb2xfaWQsIHZlcnNpb25fYW5kX3R5cGUsIHZlcnNpb247CisKKyAgeGZlciA9IDA7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnByb3RvY29sX2lkLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICBpZiAocHJvdG9jb2xfaWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAiYmFkIHByb3RvY29sIGlkIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZlcnNpb25fYW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgdmVyc2lvbiA9IChnaW50OCkodmVyc2lvbl9hbmRfdHlwZSAmIFZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fTikgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICJiYWQgdmVyc2lvbiBhbmQvb3IgdHlwZSIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICptZXNzYWdlX3R5cGUKKyAgICA9IChUaHJpZnRNZXNzYWdlVHlwZSkoKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKGNwLCBzZXFpZCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisgIEdRdWV1ZSAqcTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworICBxID0gJihjcC0+X2xhc3RfZmllbGQpOworCisgICpuYW1lID0gTlVMTDsKKworICBnX3F1ZXVlX3B1c2hfdGFpbCAocSwgR0lOVF9UT19QT0lOVEVSICgoZ2ludCkgY3AtPl9sYXN0X2ZpZWxkX2lkKSk7CisgIGNwLT5fbGFzdF9maWVsZF9pZCA9IDA7CisKKyAgcmV0dXJuIDA7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworICBHUXVldWUgKnE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgcSA9ICYoY3AtPl9sYXN0X2ZpZWxkKTsKKworICBjcC0+X2xhc3RfZmllbGRfaWQgPSAoZ2ludDE2KSBHUE9JTlRFUl9UT19JTlQgKGdfcXVldWVfcG9wX3RhaWwgKHEpKTsKKworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB4ZmVyOworCisgIGdpbnQxNiBtb2RpZmllcjsKKyAgZ2ludDggYnl0ZTsKKyAgZ2ludDggdHlwZTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJmJ5dGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIHR5cGUgPSAoYnl0ZSAmIDB4MGYpOworCisgIC8qIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4gKi8KKyAgaWYgKHR5cGUgPT0gVF9TVE9QKSB7CisgICAgKmZpZWxkX3R5cGUgPSBUX1NUT1A7CisgICAgKmZpZWxkX2lkID0gMDsKKyAgICByZXR1cm4geGZlcjsKKyAgfQorCisgIC8qIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuCisgICAqIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICovCisgIG1vZGlmaWVyID0gKGdpbnQxNikoKChndWludDgpYnl0ZSAmIDB4ZjApID4+IDQpOworICBpZiAobW9kaWZpZXIgPT0gMCkgeworICAgIC8qIG5vdCBhIGRlbHRhLCBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4gKi8KKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqZmllbGRfaWQgPSAoZ2ludDE2KShjcC0+X2xhc3RfZmllbGRfaWQgKyBtb2RpZmllcik7CisgIH0KKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHR5cGUgKGNwLCB0eXBlLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICAqZmllbGRfdHlwZSA9IHJldDsKKworICAvKiBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZSAqLworICBpZiAodHlwZSA9PSBDVF9CT09MRUFOX1RSVUUgfHwgdHlwZSA9PSBDVF9CT09MRUFOX0ZBTFNFKSB7CisgICAgLyogc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuICovCisgICAgY3AtPl9oYXNfYm9vbF92YWx1ZSA9IFRSVUU7CisgICAgY3AtPl9ib29sX3ZhbHVlID0KKyAgICAgICh0eXBlID09IENUX0JPT0xFQU5fVFJVRSA/IFRSVUUgOiBGQUxTRSk7CisgIH0KKworICAvKiBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4gKi8KKyAgY3AtPl9sYXN0X2ZpZWxkX2lkID0gKmZpZWxkX2lkOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBrdl90eXBlOworICBnaW50MzIgbXNpemU7CisKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGt2X3R5cGUgPSAwOworICBtc2l6ZSA9IDA7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZtc2l6ZSwgZXJyb3IpKSA8MCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAvKiBzdGlsbCByZWFkIHRoZSBrdiBieXRlIGlmIG5lZ2F0aXZlIHNpemUgKi8KKyAgaWYgKG1zaXplICE9IDApIHsKKyAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAma3ZfdHlwZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAoY3AtPmNvbnRhaW5lcl9saW1pdCA+IDAgJiYgbXNpemUgPiBjcC0+Y29udGFpbmVyX2xpbWl0KSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAiZ290IHNpemUgb3ZlciBsaW1pdCAoJWQgPiAlZCkiLCBtc2l6ZSwgY3AtPmNvbnRhaW5lcl9saW1pdCk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKG1zaXplID4gMCkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSgoZ3VpbnQ4KWt2X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmtleV90eXBlID0gcmV0OworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdpbnQ4KSgoZ3VpbnQ4KWt2X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIDB4ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgICp2YWx1ZV90eXBlID0gcmV0OworICAgICpzaXplID0gKGd1aW50MzIpIG1zaXplOworICB9IGVsc2UgaWYgKG1zaXplID09IDApIHsKKyAgICAqa2V5X3R5cGUgPSAwOworICAgICp2YWx1ZV90eXBlID0gMDsKKyAgICAqc2l6ZSA9IDA7CisgIH0gZWxzZSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBtc2l6ZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCBzaXplX2FuZF90eXBlOworICBnaW50MzIgbHNpemU7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgc2l6ZV9hbmRfdHlwZSA9IDA7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnNpemVfYW5kX3R5cGUsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgIGxzaXplID0gKChndWludDgpc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7CisgIGlmIChsc2l6ZSA9PSAxNSkgeworICAgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZsc2l6ZSwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCBsc2l6ZSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgaWYgKGNwLT5jb250YWluZXJfbGltaXQgPiAwICYmIGxzaXplID4gY3AtPmNvbnRhaW5lcl9saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgbHNpemUsIGNwLT5jb250YWluZXJfbGltaXQpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3R0eXBlIChjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnaW50OCkoc2l6ZV9hbmRfdHlwZSAmIDB4MGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgKmVsZW1lbnRfdHlwZSA9IHJldDsKKyAgKnNpemUgPSAoZ3VpbnQzMikgbHNpemU7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiAwOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLCBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gMDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50OCB2YWw7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKGNwLT5faGFzX2Jvb2xfdmFsdWUgPT0gVFJVRSkgeworICAgICp2YWx1ZSA9IGNwLT5fYm9vbF92YWx1ZTsKKyAgICBjcC0+X2hhc19ib29sX3ZhbHVlID0gRkFMU0U7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgICAqdmFsdWUgPSAodmFsID09IENUX0JPT0xFQU5fVFJVRSk7CisgICAgcmV0dXJuIHhmZXI7CisgIH0KK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ3BvaW50ZXIgYlsxXTsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGlmICgocmV0ID0KKyAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChwcm90b2NvbC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgICp2YWx1ZSA9ICooZ2ludDggKikgYjsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKmNwOworCisgIGdpbnQzMiByZXQ7CisgIGdpbnQzMiB2YWw7CisgIGdpbnQzMiB4ZmVyOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgY3AgPSBUSFJJRlRfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpOworCisgIHhmZXIgPSAwOworCisgIGlmICgocmV0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZ2YWwsIGVycm9yKSkgPCAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHhmZXIgKz0gcmV0OworCisgICp2YWx1ZSA9IChnaW50MTYpIHppZ3phZ190b19pMzIgKChndWludDMyKSB2YWwpOworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqY3A7CisKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHZhbDsKKyAgZ2ludDMyIHhmZXI7CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisKKyAgaWYgKChyZXQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3ZhcmludDMyIChjcCwgJnZhbCwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgKnZhbHVlID0gemlnemFnX3RvX2kzMiAoKGd1aW50MzIpIHZhbCk7CisKKyAgcmV0dXJuIHhmZXI7Cit9CisKK2dpbnQzMgordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50NjQgdmFsOworICBnaW50MzIgeGZlcjsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIGNwID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKHByb3RvY29sKTsKKworICB4ZmVyID0gMDsKKworICBpZiAoKHJldCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50NjQgKGNwLCAmdmFsLCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB4ZmVyICs9IHJldDsKKworICAqdmFsdWUgPSB6aWd6YWdfdG9faTY0ICgoZ3VpbnQ2NCkgdmFsKTsKKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgdW5pb24geworICAgIGd1aW50NjQgYml0czsKKyAgICBndWludDggYls4XTsKKyAgfSB1OworCisgIGdfYXNzZXJ0IChzaXplb2YgKGdkb3VibGUpID09IHNpemVvZiAoZ3VpbnQ2NCkpOworCisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisKKyAgaWYgKChyZXQgPQorICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS5iLCA4LCBlcnJvcikpIDwgMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorICB1LmJpdHMgPSBHVUlOVDY0X0ZST01fTEUgKHUuYml0cyk7CisgICp2YWx1ZSA9IHRocmlmdF9iaXR3aXNlX2Nhc3RfZ2RvdWJsZSAodS5iaXRzKTsKKyAgcmV0dXJuIHJldDsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MzIgcmVhZF9sZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisgIHJlYWRfbGVuID0gMDsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGNwLT5zdHJpbmdfbGltaXQgPiAwICYmIHJlYWRfbGVuID4gY3AtPnN0cmluZ19saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgcmVhZF9sZW4sIGNwLT5zdHJpbmdfbGltaXQpOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChyZWFkX2xlbiA8IDApIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHJlYWRfbGVuKTsKKyAgICAqc3RyID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICpzdHIgPSBnX25ldzAgKGdjaGFyLCByZWFkX2xlbiArIDEpOworICBpZiAocmVhZF9sZW4gPiAwKSB7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkgeworICAgICAgZ19mcmVlICgqc3RyKTsKKyAgICAgICpzdHIgPSBOVUxMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB4ZmVyICs9IHJldDsKKyAgfSBlbHNlIHsKKyAgICAqKnN0ciA9IDA7CisgIH0KKworICByZXR1cm4geGZlcjsKK30KKworZ2ludDMyCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyICpidWYsIGd1aW50MzIgKmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICpjcDsKKworICBnaW50MzIgcmV0OworICBnaW50MzIgeGZlcjsKKworICBnaW50MzIgcmVhZF9sZW47CisKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKKworICBjcCA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgeGZlciA9IDA7CisgIHJlYWRfbGVuID0gMDsKKworICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLworICBpZiAoKHJldCA9CisgICAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF92YXJpbnQzMiAoY3AsICZyZWFkX2xlbiwgZXJyb3IpKSA8IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisKKyAgaWYgKGNwLT5zdHJpbmdfbGltaXQgPiAwICYmIHJlYWRfbGVuID4gY3AtPnN0cmluZ19saW1pdCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgImdvdCBzaXplIG92ZXIgbGltaXQgKCVkID4gJWQpIiwgcmVhZF9sZW4sIGNwLT5zdHJpbmdfbGltaXQpOworICAgICpidWYgPSBOVUxMOworICAgICpsZW4gPSAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChyZWFkX2xlbiA+IDApIHsKKyAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gZ19uZXcgKGd1Y2hhciwgKmxlbik7CisgICAgaWYgKChyZXQgPQorICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWYsICpsZW4sIGVycm9yKSkgPCAwKSB7CisgICAgICBnX2ZyZWUgKCpidWYpOworICAgICAgKmJ1ZiA9IE5VTEw7CisgICAgICAqbGVuID0gMDsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgeGZlciArPSByZXQ7CisKKyAgfSBlbHNlIGlmIChyZWFkX2xlbiA9PSAwKSB7CisgICAgKmxlbiA9IChndWludDMyKSByZWFkX2xlbjsKKyAgICAqYnVmID0gTlVMTDsKKworICB9IGVsc2UgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpidWYgPSBOVUxMOworICAgICpsZW4gPSAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiB4ZmVyOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YzsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9TVFJJTkdfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Yy0+c3RyaW5nX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQ6CisgICAgICBnX3ZhbHVlX3NldF9pbnQgKHZhbHVlLCB0Yy0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICB0YyA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlUOgorICAgICAgdGMtPnN0cmluZ19saW1pdCA9IGdfdmFsdWVfZ2V0X2ludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIHRjLT5jb250YWluZXJfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKKyAgZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIHBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJzdHJpbmdfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIHN0cmluZyBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBzdHJpbmcgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfU1RSSU5HX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2ludCAoImNvbnRhaW5lcl9saW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4IGFsbG93ZWQgY29udGFpbmVyIHNpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgbWF4IGNvbnRhaW5lciBsaW1pdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYSU5UMzIsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9DT05UQUlORVJfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOworICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlOworICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0OworICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0Q29tcGFjdFByb3RvY29sICpzZWxmKQoreworICBnX3F1ZXVlX2luaXQgKCYoc2VsZi0+X2xhc3RfZmllbGQpKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZjYWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5oCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sLmgKKyAqICBcYnJpZWYgQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0wob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbCkpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9DTEFTUyhjKSBcCisgIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MKSkKKyNkZWZpbmUgVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsIFwKKyAgIFRocmlmdENvbXBhY3RQcm90b2NvbENsYXNzKSkKKworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sIFRocmlmdENvbXBhY3RQcm90b2NvbDsKKworLyohCisgKiBUaHJpZnQgQ29tcGFjdCBQcm90b2NvbCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2wKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50MzIgc3RyaW5nX2xpbWl0OworICBnaW50MzIgY29udGFpbmVyX2xpbWl0OworCisgIC8qIHByaXZhdGUgKi8KKworICAvKioKKyAgICogKFdyaXRpbmcpIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlCisgICAqIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAqLworICBjb25zdCBnY2hhciogX2Jvb2xfZmllbGRfbmFtZTsKKyAgVGhyaWZ0VHlwZSBfYm9vbF9maWVsZF90eXBlOworICBnaW50MTYgX2Jvb2xfZmllbGRfaWQ7CisKKyAgLyoqCisgICAqIChSZWFkaW5nKSBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUKKyAgICogdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRfYm9vbCBjYW4gdXNlIGl0LgorICAgKi8KKyAgZ2Jvb2xlYW4gX2hhc19ib29sX3ZhbHVlOworICBnYm9vbGVhbiBfYm9vbF92YWx1ZTsKKworICAvKioKKyAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICovCisKKyAgR1F1ZXVlIF9sYXN0X2ZpZWxkOworICBnaW50MTYgX2xhc3RfZmllbGRfaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MgVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IENvbXBhY3QgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wgKi8KK0dUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjVlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5UHJvcGVydGllcworeworICAgIFBST1BfMCwKKyAgICBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlULAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQKK307CisKK0dfREVGSU5FX1RZUEUgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnksIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQorCitUaHJpZnRQcm90b2NvbCAqCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICp0Y2Y7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGM7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAoZmFjdG9yeSk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgInN0cmluZ19saW1pdCIsIHRjZi0+c3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5lcl9saW1pdCIsIHRjZi0+Y29udGFpbmVyX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTCAodGMpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKnRjZjsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHRjZiA9IFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX1NUUklOR19MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjZi0+c3RyaW5nX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRjZi0+Y29udGFpbmVyX2xpbWl0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3Rvcnlfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwc3BlYykKK3sKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSAqdGNmOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgdGNmID0gVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKSB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfU1RSSU5HX0xJTUlUOgorICAgICAgdGNmLT5zdHJpbmdfbGltaXQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NPTlRBSU5FUl9MSU1JVDoKKyAgICAgIHRjZi0+Y29udGFpbmVyX2xpbWl0ID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzICpjbHM7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzczsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMgPSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworICBnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJzdHJpbmdfbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heCBhbGxvd2VkIHN0cmluZyBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIG1heCBzdHJpbmcgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWElOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9TVFJJTkdfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgiY29udGFpbmVyX2xpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXggYWxsb3dlZCBjb250YWluZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBtYXggY29udGFpbmVyIGxpbWl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19NQVhJTlQzMiwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgIFBST1BfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9DT05UQUlORVJfTElNSVQsIHBhcmFtX3NwZWMpOworCisgIGNscy0+Z2V0X3Byb3RvY29sID0gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmOTUzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWV9ICisjZGVmaW5lIF9USFJJRlRfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZIFwKKyAgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZLCBcCisgICBUaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0xfRkFDVE9SWSwgXAorICAgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnkgVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeTsKKworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Cit7CisgIFRocmlmdFByb3RvY29sRmFjdG9yeSBwYXJlbnQ7CisKKyAgLyogcHJvdGVjdGVkICovCisgIGdpbnQzMiBzdHJpbmdfbGltaXQ7CisgIGdpbnQzMiBjb250YWluZXJfbGltaXQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0Q29tcGFjdFByb3RvY29sRmFjdG9yeUNsYXNzCisgIFRocmlmdENvbXBhY3RQcm90b2NvbEZhY3RvcnlDbGFzczsKKworc3RydWN0IF9UaHJpZnRDb21wYWN0UHJvdG9jb2xGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9DT01QQUNUX1BST1RPQ09MX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZjRhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sLAorICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICptdWx0aXBsZXhDbGFzcyA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Moc2VsZik7CisKKyAgaWYoIChtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkgJiYgc2VsZi0+c2VydmljZV9uYW1lICE9IE5VTEwpIHsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzJXMlcyIsIHNlbGYtPnNlcnZpY2VfbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCBuYW1lKTsKKyAgfWVsc2V7CisgICAgc2VydmljZV9uYW1lID0gZ19zdHJkdXAobmFtZSk7CisgIH0KKworICAvKiByZWxheSB0byB0aGUgcHJvdG9jb2xfZGVjb3JhdG9yICovCisgIHJldCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbihwcm90b2NvbCwgc2VydmljZV9uYW1lLCBtZXNzYWdlX3R5cGUsIHNlcWlkLCBlcnJvcik7CisKKyAgZ19mcmVlKHNlcnZpY2VfbmFtZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRToKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPnNlcnZpY2VfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPnNlcnZpY2VfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5zZXJ2aWNlX25hbWUpIHsKKyAgICBnX2ZyZWUoc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmljZS1uYW1lIiwKKyAgICAgICAgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorICAgICAgICAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9FTkQsCisgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMDhmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sOworCisKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk2YThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRVJST1JfRE9NQUlOICJ0aHJpZnQtcHJvdG9jb2wtZXJyb3ItcXVhcmsiCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRQcm90b2NvbFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQKK307CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvdG9jb2wsIHRocmlmdF9wcm90b2NvbCwgR19UWVBFX09CSkVDVCkKKwordm9pZAordGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBwcm90b2NvbC0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9iZWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RvY29sLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYm9vbCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2J5dGUgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2kxNiAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pMzIgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTY0IChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX3N0cmluZyAocHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZmllbGRfZW5kIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2VuZCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbGlzdF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc2V0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3NldF9lbmQgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2Jvb2wgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9ieXRlIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pMTYgKHByb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTMyIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2k2NCAocHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfZG91YmxlIChwcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJpbmcgKHByb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc3dpdGNoICh0eXBlKQorICB7CisgICAgY2FzZSBUX0JPT0w6CisgICAgICB7CisgICAgICAgIGdib29sZWFuIGJvb2x2OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsICZib29sdiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9CWVRFOgorICAgICAgeworICAgICAgICBnaW50OCBieXRldjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZXYsIGVycm9yKTsKKyAgICAgIH0KKworICAgIGNhc2UgVF9JMTY6CisgICAgICB7CisgICAgICAgIGdpbnQxNiBpMTY7CisgICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmaTE2LCBlcnJvcik7CisgICAgICB9CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIHsKKyAgICAgICAgZ2ludDMyIGkzMjsKKyAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZpMzIsIGVycm9yKTsKKyAgICAgIH0KKyAgICBjYXNlIFRfSTY0OgorICAgICAgeworICAgICAgICBnaW50NjQgaTY0OworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJmk2NCwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6CisgICAgICB7CisgICAgICAgIGdkb3VibGUgZHViOworICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwgJmR1YiwgZXJyb3IpOworICAgICAgfQorICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICB7CisgICAgICAgIGdwb2ludGVyIGRhdGE7CisgICAgICAgIGd1aW50MzIgbGVuOworICAgICAgICBnaW50MzIgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmRhdGEsICZsZW4sIGVycm9yKTsKKyAgICAgICAgZ19mcmVlIChkYXRhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICBjYXNlIFRfU1RSVUNUOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2NoYXIgKm5hbWU7CisgICAgICAgIGdpbnQxNiBmaWQ7CisgICAgICAgIFRocmlmdFR5cGUgZnR5cGU7CisgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpOworCisgICAgICAgIHdoaWxlICgxKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWQsIGVycm9yKTsKKyAgICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyAgCisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApCisgICAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcik7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNlIFRfU0VUOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CisgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICBjYXNlIFRfTUFQOgorICAgICAgeworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CisgICAgICAgIFRocmlmdFR5cGUga2V5X3R5cGU7CisgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJmVsZW1fdHlwZSwgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGtleV90eXBlLCBlcnJvcik7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKHByb3RvY29sLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgY2FzZSBUX0xJU1Q6CisgICAgICB7CisgICAgICAgIGdpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKKyAgICAgICAgZ3VpbnQzMiBpLCBzaXplOworICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCBwcm90b2NvbHMgKi8KK0dRdWFyawordGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4pOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTCAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnRyYW5zcG9ydCk7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbENsYXNzICpjbHMpCit7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfcHJvdG9jb2xfZGlzcG9zZTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfUFJPVE9DT0xfVFJBTlNQT1JULAorICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJUcmFuc3BvcnQiLCAiVGhyaWZ0IFRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZDsKKyAgY2xzLT53cml0ZV9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbjsKKyAgY2xzLT53cml0ZV9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luOworICBjbHMtPndyaXRlX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQ7CisgIGNscy0+d3JpdGVfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sOworICBjbHMtPndyaXRlX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzI7CisgIGNscy0+d3JpdGVfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmc7CisgIGNscy0+d3JpdGVfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZDsKKyAgY2xzLT5yZWFkX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbjsKKyAgY2xzLT5yZWFkX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kOworICBjbHMtPnJlYWRfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ib29sOworICBjbHMtPnJlYWRfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzI7CisgIGNscy0+cmVhZF9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmc7CisgIGNscy0+cmVhZF9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZlNWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaApAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbC5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wgc3VwcG9ydHMuCisgKiBUYWtlIHNwZWNpYWwgbm90ZSBvZiB0aGUgVF9FTkQgdHlwZSB3aGljaCBpcyB1c2VkIHNwZWNpZmljYWxseSB0byBtYXJrCisgKiB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgZmllbGRzLgorICovCit0eXBlZGVmIGVudW0geworICBUX1NUT1AgICA9IDAsCisgIFRfVk9JRCAgID0gMSwKKyAgVF9CT09MICAgPSAyLAorICBUX0JZVEUgICA9IDMsCisgIFRfSTA4ICAgID0gMywKKyAgVF9JMTYgICAgPSA2LAorICBUX0kzMiAgICA9IDgsCisgIFRfVTY0ICAgID0gOSwKKyAgVF9JNjQgICAgPSAxMCwKKyAgVF9ET1VCTEUgPSA0LAorICBUX1NUUklORyA9IDExLAorICBUX1VURjcgICA9IDExLAorICBUX1NUUlVDVCA9IDEyLAorICBUX01BUCAgICA9IDEzLAorICBUX1NFVCAgICA9IDE0LAorICBUX0xJU1QgICA9IDE1LAorICBUX1VURjggICA9IDE2LAorICBUX1VURjE2ICA9IDE3Cit9IFRocmlmdFR5cGU7CisKKy8qKgorICogRW51bWVyYXRlZCBkZWZpbml0aW9uIG9mIHRoZSBtZXNzYWdlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbAorICogc3VwcG9ydHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisgIFRfQ0FMTCAgICAgID0gMSwKKyAgVF9SRVBMWSAgICAgPSAyLAorICBUX0VYQ0VQVElPTiA9IDMsCisgIFRfT05FV0FZICAgID0gNAorfSBUaHJpZnRNZXNzYWdlVHlwZTsKKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfUFJPVE9DT0wgKHRocmlmdF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wsIFRocmlmdFByb3RvY29sKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sIFRocmlmdFByb3RvY29sOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBvYmplY3QKKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbAoreworICBHT2JqZWN0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xDbGFzcyBUaHJpZnRQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sQ2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICBnaW50MzIgKCp3cml0ZV9tZXNzYWdlX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9tZXNzYWdlX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zdHJ1Y3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX3N0cnVjdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZmllbGRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfZmllbGRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2ZpZWxkX3N0b3ApIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfbWFwX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9tYXBfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2xpc3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9saXN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zZXRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfc2V0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9ib29sKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnYm9vbGVhbiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfYnl0ZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDggdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2kxNikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2kzMikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2k2NCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKndyaXRlX2RvdWJsZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2RvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZV9zdHJpbmcpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqd3JpdGVfYmluYXJ5KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKKyAgZ2ludDMyICgqcmVhZF9tZXNzYWdlX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbCwgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbWVzc2FnZV9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zdHJ1Y3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc3RydWN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2ZpZWxkX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICpmaWVsZF90eXBlLCBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2ZpZWxkX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX21hcF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfbWFwX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2xpc3RfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX2xpc3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfc2V0X2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCpyZWFkX3NldF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9ib29sKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9ieXRlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9pMTYpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9pMzIpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9pNjQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9kb3VibGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdkb3VibGUgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9zdHJpbmcpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcik7CisgIGdpbnQzMiAoKnJlYWRfYmluYXJ5KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpOworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTCAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpOworCitnaW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfcHJvdG9jb2xfc2tpcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKKworLyogZGVmaW5lIGVycm9yIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCisgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKKyAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTk9UX0lNUExFTUVOVEVELAorICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfREVQVEhfTElNSVQKK30gVGhyaWZ0UHJvdG9jb2xFcnJvcjsKKworLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLworR1F1YXJrIHRocmlmdF9wcm90b2NvbF9lcnJvcl9xdWFyayAodm9pZCk7CisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9FUlJPUiAodGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICgpKQorCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjk0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwpAQCAtMCwwICsxLDYyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRQcm90b2NvbERlY29yYXRvciwgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvciwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCisKKworZW51bQoreworICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTCA9IDEsCisgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5EXSA9IHsgTlVMTCwgfTsKKworCisKKworCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworCisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworICBUaHJpZnRQcm90b2NvbENsYXNzICpwcm90byA9IFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICBnX2RlYnVnKCJDb25jcmV0ZSBwcm90b2NvbCAlcCB8ICVwIiwgKHZvaWQgKilzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgKHZvaWQgKilwcm90byk7CisKKyAgcmV0dXJuIHByb3RvLT53cml0ZV9tZXNzYWdlX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbWVzc2FnZV9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cnVjdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDE2IGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9pZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX3N0b3AgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX3N0b3AgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tYXBfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2xpc3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2xpc3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc2V0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2Jvb2wgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYnl0ZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDE2IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2kxNiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTMyIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pNjQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9kb3VibGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdjaGFyICpzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zdHJpbmcgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYmluYXJ5IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJ1Y3RfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9maWVsZF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9maWVsZF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqa2V5X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKnZhbHVlX3R5cGUsIGd1aW50MzIgKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21hcF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbGlzdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3NldF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc2V0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2Jvb2wgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2J5dGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDggKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYnl0ZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2kxNiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTMyIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pNjQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9kb3VibGUgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zdHJpbmcgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBncG9pbnRlciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2JpbmFyeSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0w6CisgICAgc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisgICAgR1ZhbHVlICAgICAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0w6CisgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCisKK1RocmlmdFByb3RvY29sICoKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X2NvbmNyZXRlX3Byb3RvY29sKFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpwcm90b2NvbCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnJldHZhbCA9IE5VTEw7CisgIGlmKCFUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SKHByb3RvY29sKSl7CisgICAgZ193YXJuaW5nKCJUaGUgdHlwZSBpcyBub3QgcHJvdG9jb2wgZGVjb3JhdG9yIik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SKHByb3RvY29sKTsKKyAgZ19kZWJ1ZygiR2V0dGluZyBjb25jcmV0ZSBwcm90b2NvbCBmcm9tICVwIC0+ICVwIiwgKHZvaWQgKilzZWxmLCAodm9pZCAqKXNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2luaXQgKFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPmNvbmNyZXRlX3Byb3RvY29sID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChnb2JqZWN0KTsKKworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9wYXJlbnRfY2xhc3MpLT5kaXNwb3NlKGdvYmplY3QpOworfQorCisvKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyAqa2xhc3MpCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKmNscyA9IFRIUklGVF9QUk9UT0NPTF9DTEFTUyAoa2xhc3MpOworICBHT2JqZWN0Q2xhc3MgKm9iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChrbGFzcyk7CisgIG9iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZGlzcG9zZTsKKworICB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MXSA9CisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgicHJvdG9jb2wiLAorICAgICAgICAgICJQcm90b2NvbCIsCisgICAgICAgICAgIlNldCB0aGUgcHJvdG9jb2wgdG8gYmUgaW1wbGVtZW50ZWQiLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkQsCisgICAgICB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX29ial9wcm9wZXJ0aWVzKTsKKworICBnX2RlYnVnKCJDdXJyZW50IGRlY29yYXRvciB3cml0ZV9tZXNzYWdlX2JlZ2luIGFkZHIgJXAsIG5ldyAlcCIsIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiwgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW47CisgIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfZW5kOworICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2JlZ2luOworICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX2JlZ2luOworICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfZW5kOworICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2ZpZWxkX3N0b3A7CisgIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfYmVnaW47CisgIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWFwX2VuZDsKKyAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2JlZ2luOworICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2VuZDsKKyAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9iZWdpbjsKKyAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfZW5kOworICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2Jvb2w7CisgIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYnl0ZTsKKyAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kxNjsKKyAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kzMjsKKyAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2k2NDsKKyAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2RvdWJsZTsKKyAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cmluZzsKKyAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2JpbmFyeTsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfZW5kOworICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9iZWdpbjsKKyAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2VuZDsKKyAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2JlZ2luOworICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2ZpZWxkX2VuZDsKKyAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tYXBfYmVnaW47CisgIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9lbmQ7CisgIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfYmVnaW47CisgIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2VuZDsKKyAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zZXRfYmVnaW47CisgIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9lbmQ7CisgIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2Jvb2w7CisgIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2J5dGU7CisgIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTE2OworICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kzMjsKKyAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pNjQ7CisgIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZG91YmxlOworICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cmluZzsKKyAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9iaW5hcnk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjZhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSAorI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaAorICogIFxicmllZiBNdWx0aXBsZXhlZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IsIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3I7CisKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRGVjb3JhdG9yIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRGVjb3JhdG9yCit7CisgIFRocmlmdFByb3RvY29sIHBhcmVudDsKKworICBUaHJpZnRQcm90b2NvbCAqY29uY3JldGVfcHJvdG9jb2w7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzOworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcworeworICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKKworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1IgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjQwODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5LCB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeSwgR19UWVBFX09CSkVDVCkKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoZmFjdG9yeSktPmdldF9wcm90b2NvbCAoZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9mYWN0b3J5X2luaXQgKFRocmlmdFByb3RvY29sRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MgKmNscykKK3sKKyAgY2xzLT5nZXRfcHJvdG9jb2wgPSB0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNDZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGZhY3RvcnkgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkgKHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksIFRocmlmdFByb3RvY29sRmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnkgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5OworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBGYWN0b3J5IG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeQoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzczsKKworLyohCisgKiBUaHJpZnQgUHJvdG9jb2wgRmFjdG9yeSBjbGFzcworICovCitzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgVGhyaWZ0UHJvdG9jb2wgKigqZ2V0X3Byb3RvY29sKSAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ1NjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFLAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRCwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JULCAvKiBUT0RPIHVnbHkgaGFjayAqLworICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sLCB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorCQkJCQkgICBnY2hhciAqKm5hbWUsCisJCQkJCSAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisJCQkJCSAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0ID0gMDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgLyogV2UgcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWVzIG9uIGNvbnN0cnVjdGlvbiAqLworICAqbmFtZSA9IHNlbGYtPm5hbWU7CisgICptZXNzYWdlX3R5cGUgPSBzZWxmLT5tdHlwZTsKKyAgKnNlcWlkID0gc2VsZi0+c2VxaWQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisJCQkJCSAgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKwkJCQkJICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorCQkJCQkgICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUU6CisgICAgICBzZWxmLT5uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRToKKyAgICAgIHNlbGYtPm10eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lEOgorICAgICAgc2VsZi0+c2VxaWQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisJCQkJCSAgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisJCQkJCSAgICAgR1ZhbHVlICAgICAqdmFsdWUsCisJCQkJCSAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAob2JqZWN0KTsKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKmRlY29yYXRvciA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0PU5VTEw7CisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICAvKiBGSVhNRSBTaW5jZSB3ZSBkb24ndCBvdmVycmlkZSBwcm9wZXJ0aWVzIGluIHRoZSBkZWNvcmF0b3IgYXMgaXQgc2hvdWxkCisgICAgICAgICB3ZSBqdXN0IG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2Uga25vdyBhcmUgdXNlZCAqLworICAgICAgZ19vYmplY3RfZ2V0KGRlY29yYXRvci0+Y29uY3JldGVfcHJvdG9jb2wscHNwZWMtPm5hbWUsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIHRyYW5zcG9ydCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPm5hbWUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5uYW1lKSB7CisgICAgICBnX2ZyZWUoc2VsZi0+bmFtZSk7CisgICAgICBzZWxmLT5uYW1lID0gTlVMTDsKKyAgfQorCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyBhcyB3aXRoIGRpc3Bvc2UoKSwgZmluYWxpemUoKQorICAgKiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IG9uIHRoZSBwYXJlbnQncyBjbGFzcyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKGdvYmplY3QpOworfQorCisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZmluYWxpemU7CisKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm5hbWUiLAorCQkJICAgIlNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIiwKKwkJCSAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisJCQkgICBOVUxMLAorCQkJICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFXSA9CisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsCisJCQkiTWVzc2FnZSB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCSJTZXQgdGhlIG1lc3NhZ2UgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQlUX0NBTEwsIFRfT05FV0FZLAorCQkJVF9DQUxMLAorCQkJKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSURdID0KKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzZXFpZCIsCisJCQkiU2VxdWVuY2UgaWQgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQkiU2V0IHRoZSBTZXF1ZW5jZSBpZCBpbiB0aGUgd2lyZSIsCisJCQkwLCBHX01BWElOVCwKKwkJCTAsCisJCQkoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgLyogVE9ETyBVZ2x5IGhhY2ssIGluIHRoZW9yeSB3ZSBtdXN0IG92ZXJyaWRlIGFsbCBwcm9wZXJ0aWVzIGZyb20gdW5kZXJsYXlpbmcKKyAgICAgcHJvdG9jb2wgKi8KKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVF0gPQorICAgICAgZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJ0cmFuc3BvcnQiLAorCQkJIlRyYW5zcG9ydCBvbiB0aGUgdW5kZXJsYXlpbmcgaW1wbGVtZW50YXRpb24iLAorCQkJIlRyYW5zcG9ydCBvZiBkZWNvcmF0ZWQgcHJvdG9jb2wiLAorCQkJR19QQVJBTV9SRUFEQUJMRSk7CisKKworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorCQkJCSAgICAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5ELAorCQkJCSAgICAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzgyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCisgKiAgXGJyaWVmIFN0b3JlZE1lc3NhZ2UgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBwcmUtc3RvcmVkIG1lc3NhZ2UgaGVhZGVyCisgKiAgb24gVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MICh0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcykpCisKKy8qIGNvbnN0YW50ICovCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiAiOiIKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2w7CisKKworCisvKiEKKyAqIFRocmlmdCBTdG9yZWRNZXNzYWdlIFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKm5hbWU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG10eXBlOworICBnaW50MzIgc2VxaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmOTE1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlICJ0aHJpZnRfc2VydmVyLmgiCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTZXJ2ZXJQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCisgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWQorfTsKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXIsIHRocmlmdF9zZXJ2ZXIsIEdfVFlQRV9PQkpFQ1QpCisKK3ZvaWQKK3RocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5wcm9jZXNzb3IpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgorICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6CisgICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKKyAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKKyAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlk6CisgICAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKHNlcnZlciktPnNlcnZlIChzZXJ2ZXIsIGVycm9yKTsKK30KKwordm9pZAordGhyaWZ0X3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKHNlcnZlciktPnN0b3AgKHNlcnZlcik7Cit9CisKKy8qIGluc3RhbmNlIGluaXRpYWxpemVyIGZvciBUaHJpZnQgU2VydmVyICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9pbml0IChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKK3sKKyAgc2VydmVyLT5wcm9jZXNzb3IgPSBOVUxMOworICBzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gTlVMTDsKKyAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBOVUxMOworICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOworICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0U2VydmVyICpzZWxmID0gVEhSSUZUX1NFUlZFUiAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnNlcnZlcl90cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+cHJvY2Vzc29yKTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zZXJ2ZXJfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworLyoKKyAqIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRTZXJ2ZXIKKyAqIFRPRE86IGltcGxlbWVudCBTZXJ2ZXJFdmVudEhhbmRsZXIgYXMgYSBHQ2xvc3VyZQorICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9jbGFzc19pbml0IChUaHJpZnRTZXJ2ZXJDbGFzcyAqY2xzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmRpc3Bvc2UgPSB0aHJpZnRfc2VydmVyX2Rpc3Bvc2U7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1IsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgicHJvY2Vzc29yIiwgIlByb2Nlc3NvciIsICJUaHJpZnQgUHJvY2Vzc29yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST0NFU1NPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgic2VydmVyX3RyYW5zcG9ydCIsICJTZXJ2ZXIgVHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIFRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgiaW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCAiSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgib3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJpbnB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIklucHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgSW5wdXQgUHJvdG9jb2wgRmFjdG9yeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlksCisgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgib3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkiLCAiT3V0cHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCBTZXJ2ZXIgT3V0cHV0IFByb3RvY29sIEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOworCisgIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLworICBjbHMtPnNlcnZlID0gdGhyaWZ0X3NlcnZlcl9zZXJ2ZTsKKyAgY2xzLT5zdG9wID0gdGhyaWZ0X3NlcnZlcl9zdG9wOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmVkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX0gKKyNkZWZpbmUgX1RIUklGVF9TRVJWRVJfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NlcnZlci5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgc2VydmVycy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVIgKHRocmlmdF9zZXJ2ZXJfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlcikpCisjZGVmaW5lIFRIUklGVF9JU19TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUiwgVGhyaWZ0U2VydmVyQ2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyIFRocmlmdFNlcnZlcjsKKworLyohCisgKiBUaHJpZnQgU2VydmVyIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlcgoreworICBHT2JqZWN0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3I7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqaW5wdXRfdHJhbnNwb3J0X2ZhY3Rvcnk7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeTsKKyAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICppbnB1dF9wcm90b2NvbF9mYWN0b3J5OworICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKm91dHB1dF9wcm90b2NvbF9mYWN0b3J5OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlckNsYXNzIFRocmlmdFNlcnZlckNsYXNzOworCisvKiEKKyAqIFRocmlmdCBTZXJ2ZXIgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXJDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKnNlcnZlKSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKTsKKyAgdm9pZCAoKnN0b3ApIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NFUlZFUiAqLworR1R5cGUgdGhyaWZ0X3NlcnZlcl9nZXRfdHlwZSAodm9pZCk7CisKKy8qIQorICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyQ2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBTdG9wIGhhbmRsaW5nIHJlcXVlc3RzLgorICovCit2b2lkIHRocmlmdF9zZXJ2ZXJfc3RvcCAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfSCAqLworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE5NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRTaW1wbGVTZXJ2ZXIsIHRocmlmdF9zaW1wbGVfc2VydmVyLCBUSFJJRlRfVFlQRV9TRVJWRVIpCisKK2dib29sZWFuCit0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnQgKnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmlucHV0X3RyYW5zcG9ydCA9IE5VTEwsICpvdXRwdXRfdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKmlucHV0X3Byb3RvY29sID0gTlVMTCwgKm91dHB1dF9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdFNpbXBsZVNlcnZlciAqdHNzID0gVEhSSUZUX1NJTVBMRV9TRVJWRVIoc2VydmVyKTsKKyAgR0Vycm9yICpwcm9jZXNzX2Vycm9yID0gTlVMTDsKKworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIgKHNlcnZlciksIEZBTFNFKTsKKworICBpZiAodGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIGVycm9yKSkgeworICAgIHRzcy0+cnVubmluZyA9IFRSVUU7CisgICAgd2hpbGUgKHRzcy0+cnVubmluZyA9PSBUUlVFKQorICAgIHsKKyAgICAgIHQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKyAgICAgIGlmICh0ICE9IE5VTEwgJiYgdHNzLT5ydW5uaW5nKSB7CisgICAgICAgIGlucHV0X3RyYW5zcG9ydCA9CisgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSkKKyAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnksIHQpOworICAgICAgICBvdXRwdXRfdHJhbnNwb3J0ID0KKyAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSkKKyAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5LCB0KTsKKyAgICAgICAgaW5wdXRfcHJvdG9jb2wgPQorICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3Byb3RvY29sIChzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnksIGlucHV0X3RyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dF9wcm90b2NvbCA9CisgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgIC0+Z2V0X3Byb3RvY29sIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5LCBvdXRwdXRfdHJhbnNwb3J0KTsKKworICAgICAgICB3aGlsZSAoVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKHNlcnZlci0+cHJvY2Vzc29yKQorICAgICAgICAgICAgICAgLT5wcm9jZXNzIChzZXJ2ZXItPnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2Nlc3NfZXJyb3IpICYmCisgICAgICAgICAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGlucHV0X3RyYW5zcG9ydCwgJnByb2Nlc3NfZXJyb3IpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvY2Vzc19lcnJvciAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgZ19tZXNzYWdlICgidGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmU6ICVzIiwgcHJvY2Vzc19lcnJvci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19jbGVhcl9lcnJvciAoJnByb2Nlc3NfZXJyb3IpOworCisgICAgICAgICAgLyogTm90ZSB3ZSBkbyBub3QgcHJvcGFnYXRlIHByb2Nlc3NpbmcgZXJyb3JzIHRvIHRoZSBjYWxsZXIgYXMgdGhleQorICAgICAgICAgICAqIG5vcm1hbGx5IGFyZSB0cmFuc2llbnQgYW5kIG5vdCBmYXRhbCB0byB0aGUgc2VydmVyICovCisgICAgICAgIH0KKworICAgICAgICAvKiBUT0RPOiBoYW5kbGUgZXhjZXB0aW9ucyAqLworICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAoaW5wdXRfdHJhbnNwb3J0KS0+Y2xvc2UgKGlucHV0X3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKG91dHB1dF90cmFuc3BvcnQpLT5jbG9zZSAob3V0cHV0X3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICB9CisgICAgfQorCisgICAgLyogYXR0ZW1wdCB0byBzaHV0ZG93biAqLworICAgIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0dFVF9DTEFTUyAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0KQorICAgICAgLT5jbG9zZSAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBOVUxMKTsKKyAgfQorCisgIC8qIFNpbmNlIHRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHJ1biBmb3JldmVyLCBpdCBjYW4gb25seSBldmVyIHJldHVybiBvbgorICAgKiBlcnJvciAqLworICByZXR1cm4gRkFMU0U7Cit9CisKK3ZvaWQKK3RocmlmdF9zaW1wbGVfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKQoreworICBnX3JldHVybl9pZl9mYWlsIChUSFJJRlRfSVNfU0lNUExFX1NFUlZFUiAoc2VydmVyKSk7CisgIChUSFJJRlRfU0lNUExFX1NFUlZFUiAoc2VydmVyKSktPnJ1bm5pbmcgPSBGQUxTRTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zaW1wbGVfc2VydmVyX2luaXQgKFRocmlmdFNpbXBsZVNlcnZlciAqdHNzKQoreworICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIodHNzKTsKKworICB0c3MtPnJ1bm5pbmcgPSBGQUxTRTsKKworICBpZiAoc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5pbnB1dF90cmFuc3BvcnRfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIE5VTEwpOworICB9CisgIGlmIChzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPQorICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBOVUxMKTsKKyAgfQorICBpZiAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID09IE5VTEwpCisgIHsKKyAgICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPQorICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBOVUxMKTsKKyAgfQorICBpZiAoc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9PSBOVUxMKQorICB7CisgICAgc2VydmVyLT5vdXRwdXRfcHJvdG9jb2xfZmFjdG9yeSA9CisgICAgICAgIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlksIE5VTEwpOworICB9Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfY2xhc3NfaW5pdCAoVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MgKmNsYXNzKQoreworICBUaHJpZnRTZXJ2ZXJDbGFzcyAqY2xzID0gVEhSSUZUX1NFUlZFUl9DTEFTUyhjbGFzcyk7CisKKyAgY2xzLT5zZXJ2ZSA9IHRocmlmdF9zaW1wbGVfc2VydmVyX3NlcnZlOworICBjbHMtPnN0b3AgPSB0aHJpZnRfc2ltcGxlX3NlcnZlcl9zdG9wOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiNTM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0lNUExFX1NFUlZFUl9ICisjZGVmaW5lIF9USFJJRlRfU0lNUExFX1NFUlZFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2ltcGxlX3NlcnZlci5oCisgKiAgXGJyaWVmIEEgc2ltcGxlIFRocmlmdCBzZXJ2ZXIsIHNpbmdsZS10aHJlYWRlZC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSICh0aHJpZnRfc2ltcGxlX3NlcnZlcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXIpKQorI2RlZmluZSBUSFJJRlRfSVNfU0lNUExFX1NFUlZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIpKQorI2RlZmluZSBUSFJJRlRfU0lNUExFX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TSU1QTEVfU0VSVkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSKSkKKyNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSLCBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXIgVGhyaWZ0U2ltcGxlU2VydmVyOworCisvKioKKyAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlcgoreworICBUaHJpZnRTZXJ2ZXIgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgdm9sYXRpbGUgZ2Jvb2xlYW4gcnVubmluZzsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcyBUaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzczsKKworLyoqCisgKiBUaHJpZnQgU2ltcGxlIFNlcnZlciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcworeworICBUaHJpZnRTZXJ2ZXJDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIgKi8KK0dUeXBlIHRocmlmdF9zaW1wbGVfc2VydmVyX2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfU0lNUExFX1NFUlZFUl9IICovCisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTg2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorCisvKioKKyAqIEdIYXNoVGFibGUgY2FsbGJhY2sgdG8gYWRkIGtleXMgdG8gYSBHTGlzdC4KKyAqLwordm9pZAordGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKyAgR0xpc3QgKipsaXN0ID0gKEdMaXN0ICoqKSB1c2VyX2RhdGE7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHZhbHVlKTsKKworICAqbGlzdCA9IGdfbGlzdF9hcHBlbmQgKCpsaXN0LCBrZXkpOworfQordm9pZCB0aHJpZnRfc2FmZV9oYXNoX3RhYmxlX2Rlc3Ryb3koR0hhc2hUYWJsZSogaGFzaF90YWJsZSkKK3sKKyAgaWYgKGhhc2hfdGFibGUpCisgIHsKKyAgICBnX2hhc2hfdGFibGVfZGVzdHJveShoYXNoX3RhYmxlKTsKKyAgfQorfQorCitndWludCB0aHJpZnRfYm9vbGVhbl9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2Jvb2xlYW4qIHAgPSB2OworICByZXR1cm4gcCAmJiAqcCA/IDEgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2Jvb2xlYW5fZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2Jvb2xlYW4qIHBhID0gYTsKKyAgY29uc3QgZ2Jvb2xlYW4qIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK2d1aW50IHRocmlmdF9pbnQ4X2hhc2goZ2NvbnN0cG9pbnRlciB2KQoreworICBjb25zdCBnaW50OCogcCA9IHY7CisgIHJldHVybiBwID8gKnAgOiAwOworfQorZ2Jvb2xlYW4gdGhyaWZ0X2ludDhfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2ludDgqIHBhID0gYTsKKyAgY29uc3QgZ2ludDgqIHBiID0gYjsKKyAgcmV0dXJuICpwYSA9PSAqcGI7Cit9CisKK2d1aW50IHRocmlmdF9pbnQxNl9oYXNoKGdjb25zdHBvaW50ZXIgdikKK3sKKyAgY29uc3QgZ2ludDE2KiBwID0gdjsKKyAgcmV0dXJuIHAgPyAqcCA6IDA7Cit9CitnYm9vbGVhbiB0aHJpZnRfaW50MTZfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpCit7CisgIGlmIChhID09IGIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZiAoIWEgfHwgIWIpIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgY29uc3QgZ2ludDE2KiBwYSA9IGE7CisgIGNvbnN0IGdpbnQxNiogcGIgPSBiOworICByZXR1cm4gKnBhID09ICpwYjsKK30KKwordm9pZAordGhyaWZ0X3N0cmluZ19mcmVlIChncG9pbnRlciBzdHIpCit7CisJR0J5dGVBcnJheSogcHRyID0gc3RyOworCWdfYnl0ZV9hcnJheV91bnJlZihwdHIpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhNjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0LmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfSAorI2RlZmluZSBfVEhSSUZUX0gKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Z2xpYi5oPgorCisvKiB0aGlzIG1hY3JvIGlzIGNhbGxlZCB0byBzYXRpc2Z5IC1XYWxsIGhhcmRjb3JlIGNvbXBpbGF0aW9uICovCisjaWZuZGVmIFRIUklGVF9VTlVTRURfVkFSCisjIGRlZmluZSBUSFJJRlRfVU5VU0VEX1ZBUih4KSAoKHZvaWQpIHgpCisjZW5kaWYKKwordm9pZCB0aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cyAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwb2ludGVyIHVzZXJfZGF0YSk7Cit2b2lkIHRocmlmdF9zYWZlX2hhc2hfdGFibGVfZGVzdHJveShHSGFzaFRhYmxlKiBoYXNoX3RhYmxlKTsKKworZ3VpbnQgdGhyaWZ0X2Jvb2xlYW5faGFzaChnY29uc3Rwb2ludGVyIHYpOworZ2Jvb2xlYW4gdGhyaWZ0X2Jvb2xlYW5fZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpOworCitndWludCB0aHJpZnRfaW50OF9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfaW50OF9lcXVhbChnY29uc3Rwb2ludGVyIGEsIGdjb25zdHBvaW50ZXIgYik7CisKK2d1aW50IHRocmlmdF9pbnQxNl9oYXNoKGdjb25zdHBvaW50ZXIgdik7CitnYm9vbGVhbiB0aHJpZnRfaW50MTZfZXF1YWwoZ2NvbnN0cG9pbnRlciBhLCBnY29uc3Rwb2ludGVyIGIpOworCit2b2lkIHRocmlmdF9zdHJpbmdfZnJlZSAoZ3BvaW50ZXIgc3RyKTsKKworI2VuZGlmIC8qICNpZm5kZWYgX1RIUklGVF9USFJJRlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjM0Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCIKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25Qcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEUsCisgIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uLCB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLCBUSFJJRlRfVFlQRV9TVFJVQ1QpCisKK2dpbnQzMgordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworICBnY2hhciAqbmFtZTsKKyAgVGhyaWZ0VHlwZSBmdHlwZTsKKyAgZ2ludDE2IGZpZDsKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRoaXMgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIC8qIHJlYWQgdGhlIHN0cnVjdCBiZWdpbiBtYXJrZXIgKi8KKyAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgZXJyb3IpKSA8IDApCisgIHsKKyAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgeGZlciArPSByZXQ7CisgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworCisgIHdoaWxlICgxKQorICB7CisgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZCwgZXJyb3IpKSA8IDApCisgICAgeworICAgICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHhmZXIgKz0gcmV0OworICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOworCisgICAgLyogYnJlYWsgaWYgd2UgZ2V0IGEgU1RPUCBmaWVsZCAqLworICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApCisgICAgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChmaWQpCisgICAgeworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoZnR5cGUgPT0gVF9TVFJJTkcpCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZ0aGlzLT5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgICB0aGlzLT5fX2lzc2V0X21lc3NhZ2UgPSBUUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgeGZlciArPSByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGlmIChmdHlwZSA9PSBUX0kzMikKKyAgICAgICAgeworICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnRoaXMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHhmZXIgKz0gcmV0OworICAgICAgICAgIHRoaXMtPl9faXNzZXRfdHlwZSA9IFRSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBmdHlwZSwgZXJyb3IpKSA8IDApCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB4ZmVyICs9IHJldDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgICByZXR1cm4gLTE7CisgICAgeGZlciArPSByZXQ7CisgIH0KKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworCisgIHJldHVybiB4ZmVyOworfQorCitnaW50MzIKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2ludDMyIHhmZXIgPSAwOworCisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0aGlzID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgIm1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9TVFJJTkcsIDEsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIHRoaXMtPm1lc3NhZ2UsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9JMzIsIDIsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIHRoaXMtPnR5cGUsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQorICAgIHJldHVybiAtMTsKKyAgeGZlciArPSByZXQ7CisgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3AgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKKyAgICByZXR1cm4gLTE7CisgIHhmZXIgKz0gcmV0OworICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCisgICAgcmV0dXJuIC0xOworICB4ZmVyICs9IHJldDsKKworICByZXR1cm4geGZlcjsKK30KKworCisvKiBHRXJyb3IgZG9tYWluICovCisjZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfRE9NQUlOICJ0aHJpZnQtYXBwbGljYXRpb24tZXhjZXB0aW9uLWVycm9yLXF1YXJrIgorCitHUXVhcmsKK3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKHZvaWQpCit7CisgIHJldHVybiBnX3F1YXJrX2Zyb21fc3RhdGljX3N0cmluZyAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9ET01BSU4pOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGFlID0gVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fVFlQRToKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHRhZS0+dHlwZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgdGFlLT5tZXNzYWdlKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0YWUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9UWVBFOgorICAgICAgdGFlLT50eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICB0YWUtPl9faXNzZXRfdHlwZSA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9NRVNTQUdFOgorICAgICAgaWYgKHRhZS0+bWVzc2FnZSAhPSBOVUxMKQorICAgICAgICBnX2ZyZWUgKHRhZS0+bWVzc2FnZSk7CisKKyAgICAgIHRhZS0+bWVzc2FnZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgICAgdGFlLT5fX2lzc2V0X21lc3NhZ2UgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZAordGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9pbml0IChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqb2JqZWN0KQoreworICBvYmplY3QtPnR5cGUgPSAwOworICBvYmplY3QtPl9faXNzZXRfdHlwZSA9IEZBTFNFOworICBvYmplY3QtPm1lc3NhZ2UgPSBOVUxMOworICBvYmplY3QtPl9faXNzZXRfbWVzc2FnZSA9IEZBTFNFOworfQorCit2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp0YWUgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOworCisgIGlmICh0YWUtPl9faXNzZXRfbWVzc2FnZSkgeworCQlnX2ZyZWUodGFlLT5tZXNzYWdlKTsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2NsYXNzX2luaXQgKFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MgKmNsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyhjbGFzcyk7CisgIFRocmlmdFN0cnVjdENsYXNzICpjbHMgPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNsYXNzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYzsKKworICBjbHMtPnJlYWQgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQ7CisgIGNscy0+d3JpdGUgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3dyaXRlOworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9maW5hbGl6ZTsKKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24sIG9uZSBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBkZWZpbmVkIGJ5IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25FcnJvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bWVyYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX04gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfc3RyaW5nICgibWVzc2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG1lc3NhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGV4Y2VwdGlvbiB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvY2N1cnJlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNmNzkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0gKKyNkZWZpbmUgX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaAorICogIFxicmllZiBDIEltcGxlbWVudGF0aW9uIG9mIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiAodGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24pKQorI2RlZmluZSBUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OKSkKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OKSkKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKworc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbgoreworICBUaHJpZnRTdHJ1Y3QgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ2ludDMyIHR5cGU7CisgIGdib29sZWFuIF9faXNzZXRfdHlwZTsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisgIGdib29sZWFuIF9faXNzZXRfbWVzc2FnZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3M7CisKK3N0cnVjdCBfVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcworeworICBUaHJpZnRTdHJ1Y3RDbGFzcyBwYXJlbnQ7Cit9OworCitHVHlwZSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2dldF90eXBlICh2b2lkKTsKKworLyogZ2Vycm9yIGNvZGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9ELAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0JBRF9TRVFVRU5DRV9JRCwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9NSVNTSU5HX1JFU1VMVCwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlRFUk5BTF9FUlJPUiwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9QUk9UT0NPTF9FUlJPUiwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1RSQU5TRk9STSwKKyAgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1BST1RPQ09MLAorICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFLAorCisgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTgorfSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkVycm9yOworCisvKiBkZWZpbmUgZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgKi8KK0dRdWFyayB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUiAodGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAoKSkKKworR19FTkRfREVDTFMKKworI2VuZGlmIC8qIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0ZjJhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSAidGhyaWZ0X3N0cnVjdC5oIgorCitHX0RFRklORV9BQlNUUkFDVF9UWVBFKFRocmlmdFN0cnVjdCwgdGhyaWZ0X3N0cnVjdCwgR19UWVBFX09CSkVDVCkKKworZ2ludDMyCit0aHJpZnRfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX1NUUlVDVCAob2JqZWN0KSwgLTEpOworICByZXR1cm4gVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1MgKG9iamVjdCktPnJlYWQgKG9iamVjdCwgcHJvdG9jb2wsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RSVUNUIChvYmplY3QpLCAtMSk7CisgIHJldHVybiBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyAob2JqZWN0KS0+d3JpdGUgKG9iamVjdCwgcHJvdG9jb2wsIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdHJ1Y3RfY2xhc3NfaW5pdCAoVGhyaWZ0U3RydWN0Q2xhc3MgKmNscykKK3sKKyAgY2xzLT5yZWFkID0gdGhyaWZ0X3N0cnVjdF9yZWFkOworICBjbHMtPndyaXRlID0gdGhyaWZ0X3N0cnVjdF93cml0ZTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zdHJ1Y3RfaW5pdCAoVGhyaWZ0U3RydWN0ICpzdHJ1Y3R1cmUpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzdHJ1Y3R1cmUpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNmY2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9TVFJVQ1RfSAorI2RlZmluZSBUSFJJRlRfU1RSVUNUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgVEhSSUZUX1RZUEVfU1RSVUNUICh0aHJpZnRfc3RydWN0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNULCBUaHJpZnRTdHJ1Y3QpKQorI2RlZmluZSBUSFJJRlRfU1RSVUNUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCkpCisjZGVmaW5lIFRIUklGVF9JU19TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCkpCisjZGVmaW5lIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0cnVjdCBUaHJpZnRTdHJ1Y3Q7CisKKy8qIHN0cnVjdCAqLworc3RydWN0IF9UaHJpZnRTdHJ1Y3QKK3sKKyAgR09iamVjdCBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0cnVjdENsYXNzIFRocmlmdFN0cnVjdENsYXNzOworCitzdHJ1Y3QgX1RocmlmdFN0cnVjdENsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogcHVibGljICovCisgIGdpbnQzMiAoKnJlYWQpIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworICBnaW50MzIgKCp3cml0ZSkgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworfTsKKworR1R5cGUgdGhyaWZ0X3N0cnVjdF9nZXRfdHlwZSAodm9pZCk7CisKK2dpbnQzMiB0aHJpZnRfc3RydWN0X3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKK2dpbnQzMiB0aHJpZnRfc3RydWN0X3dyaXRlIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjNlOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKQEAgLTAsMCArMSwzOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQsIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+aXNfb3BlbiAodC0+dHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiAodC0+cl9idWYtPmxlbiA+IDApIHx8IHRocmlmdF90cmFuc3BvcnRfcGVlayAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5vcGVuICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Y2xvc2UgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiB0aGUgYWN0dWFsIHJlYWQgaXMgInNsb3ciIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0ICovCitnaW50MzIKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBnaW50IHJldCA9IDA7CisgIGd1aW50MzIgd2FudCA9IGxlbjsKKyAgZ3VpbnQzMiBnb3QgPSAwOworICBndWNoYXIgKnRtcGRhdGEgPSBnX2FsbG9jYSAobGVuKTsKKyAgZ3VpbnQzMiBoYXZlID0gdC0+cl9idWYtPmxlbjsKKworICAvKiB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkICovCisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisKKyAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlci4gKi8KKyAgaWYgKGhhdmUgPiAwKQorICB7CisgICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLCB0LT5yX2J1Zi0+bGVuKTsKKyAgICB3YW50IC09IHQtPnJfYnVmLT5sZW47CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgdC0+cl9idWYtPmxlbik7CisgIH0KKworICAvKiBpZiB0aGUgYnVmZmVyIGlzIHN0aWxsIHNtYWxsZXIgdGhhbiB3aGF0IHdlIHdhbnQgdG8gcmVhZCwgdGhlbiBqdXN0CisgICAqIHJlYWQgaXQgZGlyZWN0bHkuICBvdGhlcndpc2UsIGZpbGwgdGhlIGJ1ZmZlciBhbmQgdGhlbiBnaXZlIG91dAorICAgKiBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgcmVhZC4gKi8KKyAgaWYgKHQtPnJfYnVmX3NpemUgPCB3YW50KQorICB7CisgICAgaWYgKChyZXQgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+cmVhZCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgZ290ICs9IHJldDsKKworICAgIC8qIGNvcHkgdGhlIGRhdGEgc3RhcnRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZiAqLworICAgIG1lbWNweSAoKGd1aW50OCAqKWJ1ZiArIGhhdmUsIHRtcGRhdGEsIGdvdCk7CisgICAgcmV0dXJuIGdvdCArIGhhdmU7IAorICB9IGVsc2UgeworICAgIGd1aW50MzIgZ2l2ZTsKKworICAgIGlmICgocmV0ID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApIHsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGdvdCArPSByZXQ7CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgZ290KTsKKyAgICAKKyAgICAvKiBoYW5kIG92ZXIgd2hhdCB3ZSBoYXZlIHVwIHRvIHdoYXQgdGhlIGNhbGxlciB3YW50cyAqLworICAgIGdpdmUgPSB3YW50IDwgdC0+cl9idWYtPmxlbiA/IHdhbnQgOiB0LT5yX2J1Zi0+bGVuOworCisKKyAgICBtZW1jcHkgKChndWludDggKilidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgZ2l2ZSk7CisgICAgd2FudCAtPSBnaXZlOworCisgICAgcmV0dXJuIChsZW4gLSB3YW50KTsKKyAgfQorfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIGlmIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlciBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIGp1c3QgdXNlCisgICAqIGEgbWVtY3B5ICovCisgIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKKyAgeworICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKKyAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgaGF2ZV9ieXRlcyA9IHQtPndfYnVmLT5sZW47CisgIGd1aW50MzIgc3BhY2UgPSB0LT53X2J1Zl9zaXplIC0gdC0+d19idWYtPmxlbjsKKworICAvKiB3ZSBuZWVkIHR3byBzeXNjYWxscyBiZWNhdXNlIHRoZSBidWZmZXJlZCBkYXRhIHBsdXMgdGhlIGJ1ZmZlciBpdHNlbGYKKyAgICogaXMgdG9vIGJpZy4gKi8KKyAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqdC0+d19idWZfc2l6ZSkgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpCisgIHsKKyAgICBpZiAoaGF2ZV9ieXRlcyA+IDApCisgICAgeworICAgICAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgICAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCBoYXZlX2J5dGVzKTsKKyAgICB9CisgICAgaWYgKCFUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBsZW4sIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1Ziwgc3BhY2UpOworICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7CisgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIChndWludDggKilidWYgKyBzcGFjZSwgbGVuLXNwYWNlKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLworICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQorICB7CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOworICAgIHJldHVybiBsZW47CisgIH0KKworICByZXR1cm4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICBpZiAodC0+d19idWYgIT0gTlVMTCAmJiB0LT53X2J1Zi0+bGVuID4gMCkKKyAgeworICAgIC8qIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQgKi8KKyAgICBpZiAoIVRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT53X2J1Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSB7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOworICB9CisgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5mbHVzaCAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IE5VTEw7CisgIHRyYW5zcG9ydC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICB0cmFuc3BvcnQtPndfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgaWYgKHRyYW5zcG9ydC0+cl9idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPnJfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPnJfYnVmID0gTlVMTDsKKworICBpZiAodHJhbnNwb3J0LT53X2J1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+d19idWYsIFRSVUUpOworICB9CisgIHRyYW5zcG9ydC0+d19idWYgPSBOVUxMOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT5yX2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+d19idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgorICAgICAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6CisgICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfb2JqZWN0ICgidHJhbnNwb3J0IiwgInRyYW5zcG9ydCAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IHRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJyX2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcmVhZCBidWZmZXIgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODU3NiwgLyogbWF4LCAxMDI0KjEwMjQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1dSSVRFX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuOworICB0dGMtPnBlZWsgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzdmNDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgYnVmZmVyZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcworICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0OworCisvKiEKKyAqIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKworICAvKiBwcml2YXRlICovCisgIEdCeXRlQXJyYXkgKnJfYnVmOworICBHQnl0ZUFycmF5ICp3X2J1ZjsKKyAgZ3VpbnQzMiByX2J1Zl9zaXplOworICBndWludDMyIHdfYnVmX3NpemU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwNTBiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFIChUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkKKworLyogV3JhcHMgYSB0cmFuc3BvcnQgd2l0aCBhIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0LiAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5ICpzZWxmKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoc2VsZik7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmtsYXNzKQoreworICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgKmJhc2VfY2xhc3MgPQorICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyAoa2xhc3MpOworCisgIGJhc2VfY2xhc3MtPmdldF90cmFuc3BvcnQgPQorICAgIGtsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZjRlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaAorICogIFxicmllZiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkgICAgICAgICAgXAorICAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWShvYmopICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkpKQorI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlRfRkFDVE9SWSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworCisvKiBUaHJpZnQgQnVmZmVyZWQtVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Cit7CisgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzOworCisvKiBUaHJpZnQgQnVmZmVyZWQtVHJhbnNwb3J0IEZhY3RvcnkgY2xhc3MgKi8KK3N0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUX0ZBQ1RPUlkgKi8KK0dUeXBlIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KK1RocmlmdFRyYW5zcG9ydCAqCit0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGFiZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdEZEVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRAorfTsKKworR19ERUZJTkVfVFlQRSAoVGhyaWZ0RkRUcmFuc3BvcnQsIHRocmlmdF9mZF90cmFuc3BvcnQsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIHJldHVybiB0LT5mZCA+PSAwICYmICEgKGZjbnRsICh0LT5mZCwgRl9HRVRGTCkgPT0gLTEgJiYgZXJybm8gPT0gRUJBREYpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfZmRfdHJhbnNwb3J0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICB0ID0gVEhSSUZUX0ZEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworI2lmIEdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApCisgIHJldHVybiBnX2Nsb3NlICh0LT5mZCwgZXJyb3IpOworI2Vsc2UKKyAgaWYgKGNsb3NlICh0LT5mZCkgPT0gMCkgeworICAgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorI2VuZGlmCit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9mZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBuID0gcmVhZCAodC0+ZmQsIChndWludDggKikgYnVmLCBsZW4pOworICBpZiAobiA9PSAtMSkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAorICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlYWQgZnJvbSBmZDogJXMiLAorICAgICAgICAgICAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZEVHJhbnNwb3J0ICp0OworICBndWludDggKl9idWY7CisgIGd1aW50MzIgX2xlbjsKKyAgc3NpemVfdCBuOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBfYnVmID0gKGd1aW50OCAqKSBidWY7CisgIF9sZW4gPSBsZW47CisgIHdoaWxlIChfbGVuID4gMCkgeworICAgIG4gPSB3cml0ZSAodC0+ZmQsIF9idWYsIF9sZW4pOworICAgIGlmIChuID09IC0xKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byB3cml0ZSBmcm9tIGZkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgIF9idWYgKz0gbjsKKyAgICAgIF9sZW4gLT0gbjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICovCitnYm9vbGVhbgordGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKyAgdCA9IFRIUklGVF9GRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGlmIChmc3luYyAodC0+ZmQpID09IC0xKSB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1VOS05PV04sCisgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZmx1c2ggZmQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgeworICAgIHJldHVybiBUUlVFOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0RkRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT5mZCA9IC0xOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X2ZkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIGdfdmFsdWVfc2V0X2ludCAodmFsdWUsIHQtPmZkKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9mZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRGRFRyYW5zcG9ydCAqdDsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHQgPSBUSFJJRlRfRkRfVFJBTlNQT1JUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRDoKKyAgICAgIHQtPmZkID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZmRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YzsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIGdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19pbnQgKCJmZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBkZXNjcmlwdG9yIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUlOLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9NQVgsIC8qIG1heCwgMTAyNCoxMDI0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0ZEX1RSQU5TUE9SVF9GRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2ZpbmFsaXplOworICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZmRfdHJhbnNwb3J0X2lzX29wZW47CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9mZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9mZF90cmFuc3BvcnRfY2xvc2U7CisgIHR0Yy0+cmVhZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfZmRfdHJhbnNwb3J0X3dyaXRlOworICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mZF90cmFuc3BvcnRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X2ZkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mZF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZkNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfRkRfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlICJ0aHJpZnRfdHJhbnNwb3J0LmgiCisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mZF90cmFuc3BvcnQuaAorICogIFxicmllZiBDbGFzcyBmb3IgVGhyaWZ0IGZpbGUgZGVzY3JpcHRvciB0cmFuc3BvcnRzLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAodGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZEX1RSQU5TUE9SVChvYmopIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUKG9iaikgXAorICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9GRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZEVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRkRfVFJBTlNQT1JUX0NMQVNTKGMpIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9GRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgXAorICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydCBUaHJpZnRGRFRyYW5zcG9ydDsKKworc3RydWN0IF9UaHJpZnRGRFRyYW5zcG9ydAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByb3RlY3RlZCAqLworICBnaW50IGZkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZEVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0RkRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0RkRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X2ZkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX0ZEX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTQ4MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfVFJBTlNQT1JULAorICBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCisgIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0LCB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcGVlayAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuICh0LT5yX2J1Zi0+bGVuID4gMCkgfHwgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICh0LT50cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPm9wZW4gKHQtPnRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5jbG9zZSAodC0+dHJhbnNwb3J0LCBlcnJvcik7Cit9CisKKy8qIHJlYWRzIGEgZnJhbWUgYW5kIHB1dHMgaXQgaW50byB0aGUgYnVmZmVyICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9mcmFtZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgc3o7CisgIGdpbnQzMiBieXRlczsKKyAgZ2Jvb2xlYW4gcmVzdWx0ID0gRkFMU0U7CisKKyAgLyogcmVhZCB0aGUgc2l6ZSAqLworICBpZiAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzeiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSA9PSBzaXplb2YgKHN6KSkKKyAgeworICAgIGd1Y2hhciAqdG1wZGF0YTsKKworICAgIHN6ID0gbnRvaGwgKHN6KTsKKworICAgIC8qIGNyZWF0ZSBhIGJ1ZmZlciB0byBob2xkIHRoZSBkYXRhIGFuZCByZWFkIHRoYXQgbXVjaCBkYXRhICovCisgICAgdG1wZGF0YSA9IGdfYWxsb2NhIChzeik7CisgICAgYnl0ZXMgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHQtPnRyYW5zcG9ydCwgdG1wZGF0YSwgc3osIGVycm9yKTsKKworICAgIGlmIChieXRlcyA+IDAgJiYgKGVycm9yID09IE5VTEwgfHwgKmVycm9yID09IE5VTEwpKQorICAgIHsKKyAgICAgIC8qIGFkZCB0aGUgZGF0YSB0byB0aGUgYnVmZmVyICovCisgICAgICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgYnl0ZXMpOworCisgICAgICByZXN1bHQgPSBUUlVFOworICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIHRoZSBhY3R1YWwgcmVhZCBpcyAic2xvdyIgYmVjYXVzZSBpdCBjYWxscyB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgKi8KK2dpbnQzMgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworICBndWludDMyIHdhbnQgPSBsZW47CisgIGd1aW50MzIgaGF2ZSA9IHQtPnJfYnVmLT5sZW47CisgIGdpbnQzMiByZXN1bHQgPSAtMTsKKworICAvKiB3ZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBidWZmZXIgZG9lc24ndCBoYXZlIGVub3VnaCB0byByZWFkICovCisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisKKyAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCAqLworICBpZiAoaGF2ZSA+IDApCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOworICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKKyAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKKyAgfQorCisgIC8qIHJlYWQgYSBmcmFtZSBvZiBpbnB1dCBhbmQgYnVmZmVyIGl0ICovCisgIGlmICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2ZyYW1lICh0cmFuc3BvcnQsIGVycm9yKSA9PSBUUlVFKQorICB7CisgICAgLyogaGFuZCBvdmVyIHdoYXQgd2UgaGF2ZSB1cCB0byB3aGF0IHRoZSBjYWxsZXIgd2FudHMgKi8KKyAgICBndWludDMyIGdpdmUgPSB3YW50IDwgdC0+cl9idWYtPmxlbiA/IHdhbnQgOiB0LT5yX2J1Zi0+bGVuOworCisgICAgLyogY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICBtZW1jcHkgKChndWludDggKilidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7CisgICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgZ2l2ZSk7CisgICAgd2FudCAtPSBnaXZlOworCisgICAgcmVzdWx0ID0gbGVuIC0gd2FudDsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCitnaW50MzIKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOworCisgIC8qIGlmIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlciBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIGp1c3QgdXNlCisgICAqIGEgbWVtY3B5IGZyb20gdGhlIGJ1ZmZlciAqLworICBpZiAobGVuIDw9IHQtPnJfYnVmLT5sZW4pCisgIHsKKyAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYtPmRhdGEsIGxlbik7CisgICAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGxlbik7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIHJldHVybiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICAvKiBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgd2UncmUgZG9uZSAqLworICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKworICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLworICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQorICB7CisgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOworICAgIHJldHVybiBUUlVFOworICB9CisKKyAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKKyAgZ2ludDMyIHN6X2hibywgc3pfbmJvOworICBndWNoYXIgKnRtcGRhdGE7CisKKyAgLyogZ2V0IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBpbiBob3N0IGFuZCBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKyAgc3pfaGJvID0gdC0+d19idWYtPmxlbiArIHNpemVvZihzel9uYm8pOworICBzel9uYm8gPSAoZ2ludDMyKSBodG9ubCAoKGd1aW50MzIpIHQtPndfYnVmLT5sZW4pOworCisgIC8qIGNvcHkgdGhlIHNpemUgb2YgdGhlIGZyYW1lIGFuZCB0aGVuIHRoZSBmcmFtZSBpdHNlbGYgKi8KKyAgdG1wZGF0YSA9IGdfYWxsb2NhIChzel9oYm8pOworICBtZW1jcHkgKHRtcGRhdGEsIChndWludDggKikgJnN6X25ibywgc2l6ZW9mIChzel9uYm8pKTsKKworICBpZiAodC0+d19idWYtPmxlbiA+IDApCisgIHsKKyAgICBtZW1jcHkgKHRtcGRhdGEgKyBzaXplb2YgKHN6X25ibyksIHQtPndfYnVmLT5kYXRhLCB0LT53X2J1Zi0+bGVuKTsKKyAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKKyAgfQorICAgIAorICAvKiB3cml0ZSB0aGUgYnVmZmVyIGFuZCB0aGVuIGVtcHR5IGl0ICovCisgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcGRhdGEsIHN6X2hibywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisKKyAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmZsdXNoICh0LT50cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBOVUxMOworICB0cmFuc3BvcnQtPnJfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgdHJhbnNwb3J0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUIChvYmplY3QpOworCisgIGlmICh0cmFuc3BvcnQtPnJfYnVmICE9IE5VTEwpCisgIHsKKyAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT5yX2J1ZiwgVFJVRSk7CisgIH0KKyAgdHJhbnNwb3J0LT5yX2J1ZiA9IE5VTEw7CisKKyAgaWYgKHRyYW5zcG9ydC0+d19idWYgIT0gTlVMTCkKKyAgeworICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPndfYnVmLCBUUlVFKTsKKyAgfQorICB0cmFuc3BvcnQtPndfYnVmID0gTlVMTDsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIHByb3BlcnR5IG11dGF0b3IgKi8KK3ZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKKyAgICAgIHRyYW5zcG9ydC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKKyAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2NsYXNzX2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJ0cmFuc3BvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCB0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaDsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzAxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAorI2RlZmluZSBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmgKKyAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgZnJhbWVkIHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMKKyAqICAgICAgICAgdGhlIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnQgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0OworCisvKiEKKyAqIFRocmlmdEZyYW1lZFRyYW5zcG9ydCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnQKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKKworICAvKiBwcm90ZWN0ZWQgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBHQnl0ZUFycmF5ICpyX2J1ZjsKKyAgR0J5dGVBcnJheSAqd19idWY7CisgIGd1aW50MzIgcl9idWZfc2l6ZTsKKyAgZ3VpbnQzMiB3X2J1Zl9zaXplOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdEZyYW1lZFRyYW5zcG9ydCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQgKi8KK0dUeXBlIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF90eXBlICh2b2lkKTsKKworR19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY4ZmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFIChUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKQorCisvKiBXcmFwcyBhIHRyYW5zcG9ydCB3aXRoIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0LiAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVCAoZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkgKnNlbGYpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzZWxmKTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzICpiYXNlX2NsYXNzID0KKyAgICBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfQ0xBU1MgKGtsYXNzKTsKKworICBiYXNlX2NsYXNzLT5nZXRfdHJhbnNwb3J0ID0KKyAgICBrbGFzcy0+Z2V0X3RyYW5zcG9ydCA9CisgICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZTk0OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5LmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5oCisgKiAgXGJyaWVmIFdyYXBzIGEgdHJhbnNwb3J0IHdpdGggYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZICAgIFwKKyAgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUlksICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OworCisvKiBUaHJpZnQgRnJhbWVkLVRyYW5zcG9ydCBGYWN0b3J5IGluc3RhbmNlICovCitzdHJ1Y3QgX1RocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBwYXJlbnQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeUNsYXNzIFRocmlmdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlDbGFzczsKKworLyogVGhyaWZ0IEZyYW1lZC1UcmFuc3BvcnQgRmFjdG9yeSBjbGFzcyAqLworc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgVGhyaWZ0VHJhbnNwb3J0ICooKmdldF90cmFuc3BvcnQpIChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKKworLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3RyYW5zcG9ydCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX0ZBQ1RPUllfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4MThlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmg+CisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRNZW1vcnlCdWZmZXJQcm9wZXJ0aWVzCit7CisgIFBST1BfMCwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRSwKKyAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVIsCisgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVIKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0TWVtb3J5QnVmZmVyLCB0aHJpZnRfbWVtb3J5X2J1ZmZlciwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKHRyYW5zcG9ydCk7CisgIGd1aW50MzIgZ2l2ZSA9IGxlbjsgCisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICAvKiBpZiB0aGUgcmVxdWVzdGVkIGJ5dGVzIGFyZSBtb3JlIHRoYW4gd2hhdCB3ZSBoYXZlIGF2YWlsYWJsZSwKKyAgICoganVzdCBnaXZlIGFsbCB0aGF0IHdlIGhhdmUgdGhlIGJ1ZmZlciAqLworICBpZiAodC0+YnVmLT5sZW4gPCBsZW4pCisgIHsKKyAgICBnaXZlID0gdC0+YnVmLT5sZW47CisgIH0KKworICBtZW1jcHkgKGJ1ZiwgdC0+YnVmLT5kYXRhLCBnaXZlKTsKKyAgZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+YnVmLCAwLCBnaXZlKTsKKworICByZXR1cm4gZ2l2ZTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiByZWFkIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAodHJhbnNwb3J0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIC8qIHJldHVybiBhbiBleGNlcHRpb24gaWYgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlLiAqLworICBpZiAobGVuID4gdC0+YnVmX3NpemUgLSB0LT5idWYtPmxlbikKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHdyaXRlICVkIGJ5dGVzIHRvIGJ1ZmZlciBvZiBsZW5ndGggJWQiLAorICAgICAgICAgICAgICAgICBsZW4sIHQtPmJ1Zl9zaXplKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0gZWxzZSB7CisgICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+YnVmLCBidWYsIGxlbik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KK2dib29sZWFuCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW5pdGlhbGl6ZXMgY2xhc3MgYmVmb3JlIGNvbnN0cnVjdG9yIHByb3BlcnRpZXMgYXJlIHNldCAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tZW1vcnlfYnVmZmVyX2luaXQgKFRocmlmdE1lbW9yeUJ1ZmZlciAqdCkKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHQpOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgaWYgKHQtPm93bmVyICYmIHQtPmJ1ZiAhPSBOVUxMKQorICB7CisgICAgZ19ieXRlX2FycmF5X3VucmVmICh0LT5idWYpOworICB9CisgIHQtPmJ1ZiA9IE5VTEw7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdC0+YnVmX3NpemUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUjoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCAoZ3BvaW50ZXIpICh0LT5idWYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4gKHZhbHVlLCB0LT5vd25lcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfbWVtb3J5X2J1ZmZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRNZW1vcnlCdWZmZXIgKnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkU6CisgICAgICB0LT5idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVI6CisgICAgICB0LT5idWYgPSAoR0J5dGVBcnJheSopIGdfdmFsdWVfZ2V0X3BvaW50ZXIgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9PV05FUjoKKyAgICAgIHQtPm93bmVyID0gZ192YWx1ZV9nZXRfYm9vbGVhbiAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgY2xhc3MgYWZ0ZXIgY29uc3RydWN0b3IgcHJvcGVydGllcyBhcmUgc2V0ICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKG9iamVjdCk7CisKKyAgaWYgKHQtPmJ1ZiA9PSBOVUxMKSB7CisgICAgdC0+YnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgfQorCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9wYXJlbnRfY2xhc3MpLT5jb25zdHJ1Y3RlZCAob2JqZWN0KTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X21lbW9yeV9idWZmZXJfY2xhc3NfaW5pdCAoVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJ1Zl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQvd3JpdGUgYnVmZmVyIHNpemUgbGltaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfTUFYVUlOVDMyLCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX01BWFVJTlQzMiwgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfTUVNT1JZX0JVRkZFUl9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19wb2ludGVyICgiYnVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIChHQnl0ZUFycmF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIChHQnl0ZUFycmF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19ib29sZWFuICgib3duZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBidWZmZXIgbWVtb3J5IG1hbmFnZW1lbnQgcG9saWN5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHdoZXRoZXIgaW50ZXJuYWwgYnVmZmVyIHNob3VsZCBiZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdW5yZWZlcmVuY2VkIHdoZW4gdGhyaWZ0X21lbW9yeV9idWZmZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlzIGZpbmFsaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfT1dORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIGdvYmplY3RfY2xhc3MtPmNvbnN0cnVjdGVkID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfY29uc3RydWN0ZWQ7CisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW47CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ0N2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9NRU1PUllfQlVGRkVSX0gKKyNkZWZpbmUgX1RIUklGVF9NRU1PUllfQlVGRkVSX0gKKworI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfbWVtb3J5X2J1ZmZlci5oCisgKiAgXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IG1lbW9yeSBidWZmZXIgdHJhbnNwb3J0LgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlcikpCisjZGVmaW5lIFRIUklGVF9JU19NRU1PUllfQlVGRkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUikpCisjZGVmaW5lIFRIUklGVF9NRU1PUllfQlVGRkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NRU1PUllfQlVGRkVSX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSKQorI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlciBUaHJpZnRNZW1vcnlCdWZmZXI7CisKKy8qIQorICogVGhyaWZ0TWVtb3J5QnVmZmVyIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlcgoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgR0J5dGVBcnJheSAqYnVmOworICBndWludDMyIGJ1Zl9zaXplOworICBnYm9vbGVhbiBvd25lcjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcyBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzczsKKworLyohCisgKiBUaHJpZnRNZW1vcnlCdWZmZXIgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OworfTsKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSICovCitHVHlwZSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3BsYXRmb3JtX3NvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTYwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyogY2xhbmctZm9ybWF0IG9mZiAqLworCisjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworIyAgZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXworCisjaWZkZWYgX1dJTjMyCisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgV1NBRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OIFdTQUVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCBXU0FFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19FWENMVVNJVkVBRERSVVNFCisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUIElOVkFMSURfU09DS0VUCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgdGhyaWZ0X3NvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgdGhyaWZ0X2ZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgMQorIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIDAKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCAxCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSB0aHJpZnRfZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3Nlc29ja2V0CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIF9jbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIF9vcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBfY2hzaXplX3MKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgX2NvbW1pdAorIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBfbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgX3dyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgX3JlYWQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgX2ZzdGF0CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgX3N0YXQKKyMgIGlmZGVmIF9XSU4zMl9XQ0UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IoLi4uKSB0aHJpZnRfd3N0cjJzdHIoZ2FpX3N0cmVycm9yVyhfX1ZBX0FSR1NfXykpCisjICBlbHNlCisjICAgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvckEKKyMgIGVuZGlmCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBwdHJkaWZmX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgX3NucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyB0aHJpZnRfc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB0aHJpZnRfdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRocmlmdF90aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIHRocmlmdF9jdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgdGhyaWZ0X3BvbGwKKyMgIGlmIFdJTlZFUiA8PSAweDA1MDIgLyogWFAsIFNlcnZlcjIwMDMgKi8KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHRocmlmdF9wb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIDB4MDMwMAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgMHgwMDEwCisjICBlbHNlIC8qIFZpc3RhLCBXaW43Li4uICovCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZW5kaWYgLyogV0lOVkVSICovCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTRF9CT1RICisjZWxzZSAvKiBub3QgX1dJTjMyICovCisjICBpbmNsdWRlIDxlcnJuby5oPgorIyAgZGVmaW5lIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PIGVycm5vCisjICBkZWZpbmUgVEhSSUZUX0VJTlRSICAgICAgIEVJTlRSCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIEVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VDT05OUkVTRVQgIEVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gICAgRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUICAgRVRJTUVET1VUCisjICBkZWZpbmUgVEhSSUZUX0VXT1VMREJMT0NLIEVXT1VMREJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiAgICAgIEVBR0FJTgorIyAgZGVmaW5lIFRIUklGVF9FUElQRSAgICAgICBFUElQRQorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19SRVVTRUFERFIKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgKC0xKQorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVRQQUlSIHNvY2tldHBhaXIKKyMgIGRlZmluZSBUSFJJRlRfRkNOVEwgZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyBPX05PTkJMT0NLCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgRl9HRVRGTAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIEZfU0VURkwKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIGdldHRpbWVvZmRheQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRVNPQ0tFVCBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9DTE9TRSBjbG9zZQorIyAgZGVmaW5lIFRIUklGVF9PUEVOIG9wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIGZ0cnVuY2F0ZQorIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBmc3luYworIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBsc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSB3cml0ZQorIyAgZGVmaW5lIFRIUklGVF9SRUFEIHJlYWQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBzdGF0CisjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIGZzdGF0CisjICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3IKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHNzaXplX3QKKyMgIGRlZmluZSBUSFJJRlRfU05QUklOVEYgc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1VTRUMgdXNsZWVwCisjICBkZWZpbmUgVEhSSUZUX1RJTUVTUEVDIHRpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgY3RpbWVfcgorIyAgZGVmaW5lIFRIUklGVF9QT0xMIHBvbGwKKyMgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgIGRlZmluZSBUSFJJRlRfUE9MTElOICBQT0xMSU4KKyMgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBkZWZpbmUgVEhSSUZUX1NIVVRfUkRXUiBTSFVUX1JEV1IKKyNlbmRpZgorCisjZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE4OTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwpAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U2VydmVyU29ja2V0UHJvcGVydGllcworeworICBQUk9QXzAsCisgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVCwKKyAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HCit9OworCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXNlcnZlci1zb2NrZXQtZXJyb3ItcXVhcmsiCisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U2VydmVyU29ja2V0LCB0aHJpZnRfc2VydmVyX3NvY2tldCwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkKKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2xpc3RlbiAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBpbnQgZW5hYmxlZCA9IDE7IC8qIGZvciBzZXRzb2Nrb3B0KCkgKi8KKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgLyogY3JlYXRlIGEgYWRkcmVzcyBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zKHRzb2NrZXQtPnBvcnQpOworCisgIC8qIGNyZWF0ZSBhIHNvY2tldCAqLworICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU09DS0VULAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yIChlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmIChzZXRzb2Nrb3B0KHRzb2NrZXQtPnNkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZlbmFibGVkLAorICAgICAgICAgICAgICAgICBzaXplb2YoZW5hYmxlZCkpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU0VUU09DS09QVCwKKyAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBzZXQgU09fUkVVU0VBRERSIC0gJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGJpbmQgdG8gdGhlIHNvY2tldCAqLworICBpZiAoYmluZCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9CSU5ELAorICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGJpbmQgdG8gcG9ydCAlZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBpZiAobGlzdGVuKHRzb2NrZXQtPnNkLCB0c29ja2V0LT5iYWNrbG9nKSA9PSAtMSkKKyAgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCisgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBsaXN0ZW4gdG8gcG9ydCAlZCAtICVzIiwKKyAgICAgICAgICAgICAgICAgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBpbnQgc2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGd1aW50IGFkZHJsZW4gPSAwOworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcmVzczsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBOVUxMOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmICgoc2QgPSBhY2NlcHQodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHJlc3MsICZhZGRybGVuKSkgPT0gLTEpCisgIHsKKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gYWNjZXB0IGNvbm5lY3Rpb24gLSAlcyIsCisgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsIE5VTEwpOworICBzb2NrZXQtPnNkID0gc2Q7CisKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlQoc29ja2V0KTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2Nsb3NlIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmIChjbG9zZSAodHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQ0xPU0UsCisgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICB0c29ja2V0LT5zZCA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKworICByZXR1cm4gVFJVRTsKK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciB0aGlzIGltcGxlbWVudGF0aW9uICovCitHUXVhcmsKK3RocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcoVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOKTsKK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQpCit7CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOworCisgIGlmIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKKyAgeworICAgIGNsb3NlIChzb2NrZXQtPnNkKTsKKyAgfQorICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQ6CisgICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+YmFja2xvZyk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKKyAgICAgIHNvY2tldC0+cG9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgorICAgICAgc29ja2V0LT5iYWNrbG9nID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKnRzdGMgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgdG8gbGlzdGVuIHRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJhY2tsb2ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrbG9nIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBhY2NlcHQgYmFja2xvZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWF4ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzQsIC8qIG1heCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfQkFDS0xPRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9maW5hbGl6ZTsKKworICB0c3RjLT5saXN0ZW4gPSB0aHJpZnRfc2VydmVyX3NvY2tldF9saXN0ZW47CisgIHRzdGMtPmFjY2VwdCA9IHRocmlmdF9zZXJ2ZXJfc29ja2V0X2FjY2VwdDsKKyAgdHN0Yy0+Y2xvc2UgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9jbG9zZTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwNDk1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCIKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAorICogIFxicmllZiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydC4gIEltcGxlbWVudHMgdGhlCisgKiAgICAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUICh0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXQpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0IFRocmlmdFNlcnZlclNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU2VydmVyU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldAoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ3VpbnQgcG9ydDsKKyAgZ3Nob3J0IGJhY2tsb2c7CisgIGludCBzZDsKKyAgZ3VpbnQ4ICpidWY7CisgIGd1aW50MzIgYnVmX3NpemU7CisgIGd1aW50MzIgYnVmX2xlbjsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzczsKKworLyohCisgKiBUaHJpZnQgU2VydmVyU29ja2V0IGNsYXNzLgorICovCitzdHJ1Y3QgX1RocmlmdFNlcnZlclNvY2tldENsYXNzCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzIHBhcmVudDsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBkZWZpbmUgZXJyb3IvZXhjZXB0aW9uIHR5cGVzICovCit0eXBlZGVmIGVudW0KK3sKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfU09DS0VULAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TRVRTT0NLT1BULAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9CSU5ELAorICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9MSVNURU4sCisgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCwKKyAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQ0xPU0UKK30gVGhyaWZ0U2VydmVyU29ja2V0RXJyb3I7CisKKy8qIGRlZmluZSBhIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLworR1F1YXJrIHRocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IgKHRocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICgpKQorCitHX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNWQxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisKK0dfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U2VydmVyVHJhbnNwb3J0LCB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKKworLyogYmFzZSBpbml0aWFsaXplciBmb3IgdGhlIHNlcnZlciB0cmFuc3BvcnQgaW50ZXJmYWNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKmMpCit7CisgIGMtPmxpc3RlbiA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbjsKKyAgYy0+YWNjZXB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0OworICBjLT5jbG9zZSA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmxpc3RlbiAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5hY2NlcHQgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhOTE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCisgKiAgXGJyaWVmIEFic3RyYWN0IGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAodGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwgVGhyaWZ0U2VydmVyVHJhbnNwb3J0KSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9UUkFOU1BPUlQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NFUlZFUl9UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpKQorI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQ7CisKK3N0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Cit7CisgIEdPYmplY3QgcGFyZW50OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzIFRocmlmdFNlcnZlclRyYW5zcG9ydENsYXNzOworCisvKiEKKyAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworeworICBHT2JqZWN0Q2xhc3MgcGFyZW50OworCisgIC8qIHZ0YWJsZSAqLworICBnYm9vbGVhbiAoKmxpc3RlbikgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIFRocmlmdFRyYW5zcG9ydCAqKCphY2NlcHQpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKK307CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiEKKyAqIExpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIEFjY2VwdCBhIGNvbm5lY3Rpb24uCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworICovCitUaHJpZnRUcmFuc3BvcnQgKnRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdAorICAgIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcworICovCitnYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQwZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKworLyogb2JqZWN0IHByb3BlcnRpZXMgKi8KK2VudW0gX1RocmlmdFNvY2tldFByb3BlcnRpZXMKK3sKKyAgUFJPUF8wLAorICBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUUsCisgIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUCit9OworCitHX0RFRklORV9UWVBFKFRocmlmdFNvY2tldCwgdGhyaWZ0X3NvY2tldCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgcmV0dXJuIHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBvdmVycmlkZXMgdGhyaWZ0X3RyYW5zcG9ydF9wZWVrICovCitnYm9vbGVhbgordGhyaWZ0X3NvY2tldF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJlc3VsdCA9IEZBTFNFOworICBndWludDggYnVmOworICBpbnQgcjsKKyAgaW50IGVycm5vX2NvcHk7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpCisgIHsKKyAgICByID0gcmVjdiAoc29ja2V0LT5zZCwgJmJ1ZiwgMSwgTVNHX1BFRUspOworICAgIGlmIChyID09IC0xKQorICAgIHsKKyAgICAgIGVycm5vX2NvcHkgPSBlcnJubzsKKworICAgICAgI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXworICAgICAgLyogRnJlZUJTRCByZXR1cm5zIC0xIGFuZCBFQ09OTlJFU0VUIGlmIHRoZSBzb2NrZXQgd2FzIGNsb3NlZCBieSB0aGUgb3RoZXIKKyAgICAgICAgIHNpZGUgKi8KKyAgICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpCisgICAgICB7CisgICAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgZXJyb3IpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgI2VuZGlmCisKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU09DS0VULAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcGVlayBhdCBzb2NrZXQgLSAlcyIsCisgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IgKGVycm5vX2NvcHkpKTsKKworICAgICAgI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX01BQ0hfXworICAgICAgfQorICAgICAgI2VuZGlmCisgICAgfQorICAgIGVsc2UgaWYgKHIgPiAwKQorICAgIHsKKyAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoY2xvc2UgKHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKKyAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKKyAgaW50IGVycjsKKyNpZiBkZWZpbmVkKEhBVkVfR0VUSE9TVEJZTkFNRV9SKQorICBzdHJ1Y3QgaG9zdGVudCBoZTsKKyAgY2hhciBidWZbMTAyNF07CisjZW5kaWYKKworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodHNvY2tldC0+c2QgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VULCBGQUxTRSk7CisKKyAgLyogbG9va3VwIHRoZSBkZXN0aW5hdGlvbiBob3N0ICovCisjaWYgZGVmaW5lZChIQVZFX0dFVEhPU1RCWU5BTUVfUikKKyAgaWYgKGdldGhvc3RieW5hbWVfciAodHNvY2tldC0+aG9zdG5hbWUsICZoZSwgYnVmLCAxMDI0LCAmaHAsICZlcnIpICE9IDAgfHwgaHAgPT0gTlVMTCkKKyNlbHNlCisgIGlmICgoaHAgPSBnZXRob3N0YnluYW1lICh0c29ja2V0LT5ob3N0bmFtZSkpID09IE5VTEwgJiYgKGVyciA9IGhfZXJybm8pKQorI2VuZGlmCisgIHsKKyAgICAvKiBob3N0IGxvb2t1cCBmYWlsZWQsIGJhaWwgb3V0IHdpdGggYW4gZXJyb3IgKi8KKyAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfSE9TVCwKKyAgICAgICAgICAgICAgICAgImhvc3QgbG9va3VwIGZhaWxlZCBmb3IgJXM6JWQgLSAlcyIsCisgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LAorICAgICAgICAgICAgICAgICBoc3RyZXJyb3IgKGVycikpOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIC8qIGNyZWF0ZSBhIHNvY2tldCBzdHJ1Y3R1cmUgKi8KKyAgbWVtc2V0ICgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHJfbGlzdFswXSkpLT5zX2FkZHI7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsKKworICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IGZvciBob3N0ICVzOiVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiAqLworICBpZiAoY29ubmVjdCAodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQorICB7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlKHRzb2NrZXQsIE5VTEwpOworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NPTk5FQ1QsCisgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY29ubmVjdCB0byBob3N0ICVzOiVkIC0gJXMiLAorICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfc29ja2V0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludCByZXQgPSAwOworICBndWludCBnb3QgPSAwOworCisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICB3aGlsZSAoZ290IDwgbGVuKQorICB7CisgICAgcmV0ID0gcmVjdiAoc29ja2V0LT5zZCwgKGd1aW50OCAqKWJ1ZiArIGdvdCwgbGVuLWdvdCwgMCk7CisgICAgaWYgKHJldCA8PSAwKQorICAgIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1JFQ0VJVkUsCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byByZWFkICVkIGJ5dGVzIC0gJXMiLCBsZW4sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGdvdCArPSByZXQ7CisgIH0KKworICByZXR1cm4gZ290OworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQsIEZBTFNFKTsKKworICB3aGlsZSAoc2VudCA8IGxlbikKKyAgeworICAgIHJldCA9IHNlbmQgKHNvY2tldC0+c2QsIChndWludDggKilidWYgKyBzZW50LCBsZW4gLSBzZW50LCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2VuZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBzZW50ICs9IHJldDsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCisgKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIC8qIHNhdGlzZnkgLVdhbGwgKi8KKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X2luaXQgKFRocmlmdFNvY2tldCAqc29ja2V0KQoreworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9maW5hbGl6ZSAoR09iamVjdCAqb2JqZWN0KQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKG9iamVjdCk7CisKKyAgaWYgKHNvY2tldC0+aG9zdG5hbWUgIT0gTlVMTCkKKyAgeworICAgIGdfZnJlZSAoc29ja2V0LT5ob3N0bmFtZSk7CisgIH0KKyAgc29ja2V0LT5ob3N0bmFtZSA9IE5VTEw7CisKKyAgaWYgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKQorICB7CisgICAgY2xvc2UgKHNvY2tldC0+c2QpOworICB9CisgIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Cit9CisKKy8qIHByb3BlcnR5IGFjY2Vzc29yICovCit2b2lkCit0aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FOgorICAgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc29ja2V0LT5ob3N0bmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUOgorICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+cG9ydCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FOgorICAgICAgaWYgKHNvY2tldC0+aG9zdG5hbWUpIHsKKyAgICAgICAgZ19mcmVlKHNvY2tldC0+aG9zdG5hbWUpOworICAgICAgfQorICAgICAgc29ja2V0LT5ob3N0bmFtZSA9IGdfc3RyZHVwIChnX3ZhbHVlX2dldF9zdHJpbmcgKHZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JUOgorICAgICAgc29ja2V0LT5wb3J0ID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9jbGFzc19pbml0IChUaHJpZnRTb2NrZXRDbGFzcyAqY2xzKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisgIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOworCisgIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KKyAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5OworCisgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfc3RyaW5nICgiaG9zdG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChjb25zdHJ1Y3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIGhvc3RuYW1lIG9mIHRoZSByZW1vdGUgaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxob3N0IiwgLyogZGVmYXVsdCB2YWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7CisKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgb2YgdGhlIHJlbW90ZSBob3N0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzV1LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NPQ0tFVF9QT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9zb2NrZXRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9zb2NrZXRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X3NvY2tldF9wZWVrOworICB0dGMtPm9wZW4gPSB0aHJpZnRfc29ja2V0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc29ja2V0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfc29ja2V0X3JlYWQ7CisgIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfc29ja2V0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X3NvY2tldF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc29ja2V0X3dyaXRlX2VuZDsKKyAgdHRjLT5mbHVzaCA9IHRocmlmdF9zb2NrZXRfZmx1c2g7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2ZjY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TT0NLRVRfSAorI2RlZmluZSBfVEhSSUZUX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfc29ja2V0LmgKKyAqICBcYnJpZWYgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCisgKiAgICAgICAgIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TT0NLRVQgKHRocmlmdF9zb2NrZXRfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U29ja2V0IFRocmlmdFNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNvY2tldAoreworICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgZ2NoYXIgKmhvc3RuYW1lOworICBndWludCBwb3J0OworICBpbnQgc2Q7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U29ja2V0Q2xhc3MgVGhyaWZ0U29ja2V0Q2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcworeworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1NTQwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMKQEAgLTAsMCArMSw4MDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaD4KKworCisjaWYgZGVmaW5lZChXSU4zMikKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIEhBTkRMRQorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgKHgpID0gQ3JlYXRlTXV0ZXgoTlVMTCwgRkFMU0UsIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBDbG9zZUhhbmRsZSh4KQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCgoeCksIElORklOSVRFKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgUmVsZWFzZU11dGV4KHgpCisjZWxzZQorI2RlZmluZSBNVVRFWF9UWVBFICAgICAgICAgICAgcHRocmVhZF9tdXRleF90CisjZGVmaW5lIE1VVEVYX1NFVFVQKHgpICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJih4KSwgTlVMTCkKKyNkZWZpbmUgTVVURVhfQ0xFQU5VUCh4KSAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKHgpKQorI2RlZmluZSBNVVRFWF9MT0NLKHgpICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCYoeCkpCisjZGVmaW5lIE1VVEVYX1VOTE9DSyh4KSAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmKHgpKQorI2VuZGlmCisKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCAweDEwMDAwMDAwTAorCisKKy8qIG9iamVjdCBwcm9wZXJ0aWVzICovCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm9wZXJ0aWVzCit7CisgIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCA9IDMsCisgIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRAorfTsKKworLyogVG8gaG9sZCBhIGdsb2JhbCBzdGF0ZSBtYW5hZ2VtZW50IG9mIG9wZW5zc2wgZm9yIGFsbCBpbnN0YW5jZXMgKi8KK3N0YXRpYyBnYm9vbGVhbiB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPUZBTFNFOworLyogVGhpcyBhcnJheSB3aWxsIHN0b3JlIGFsbCBvZiB0aGUgbXV0ZXhlcyBhdmFpbGFibGUgdG8gT3BlblNTTC4gKi8KK3N0YXRpYyBNVVRFWF9UWVBFICp0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmPU5VTEw7CisKKworLyoqCisgKiBPcGVuU1NMIHVuaXEgaWQgZnVuY3Rpb24uCisgKgorICogQHJldHVybiAgICB0aHJlYWQgaWQKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKHZvaWQpCit7CisjaWYgZGVmaW5lZChXSU4zMikKKyAgcmV0dXJuIEdldEN1cnJlbnRUaHJlYWRJZCgpOworI2Vsc2UKKyAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgcHRocmVhZF9zZWxmKCkpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKyAgICBNVVRFWF9MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworICBlbHNlCisgICAgTVVURVhfVU5MT0NLKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbbl0pOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAodm9pZCkKK3sKKyAgaW50IGk7CisKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IG1hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoTVVURVhfVFlQRSkpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfU0VUVVAodGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZltpXSk7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX2lkX2Z1bmN0aW9uKTsKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19sb2NraW5nX2NhbGxiYWNrKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKHZvaWQpCit7CisgIGludCBpOworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpCisgICAgcmV0dXJuIDA7CisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgZm9yIChpID0gMDsgIGkgPCBDUllQVE9fbnVtX2xvY2tzKCAgKTsgIGkrKykKKyAgICBNVVRFWF9DTEVBTlVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBmcmVlKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYpOworICB0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmID0gTlVMTDsKKyAgcmV0dXJuIDE7Cit9CisKKy8qCitzdGF0aWMgdm9pZCogdGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnQoIldlIHNob3VsZCBjcmVhdGUgYSBsb2NrXG4iKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKGludCBtb2RlLCB2b2lkKiBsb2NrLCBjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBpZiAobG9jayAhPSBOVUxMKSB7CisgICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgICAgZ19wcmludGYoIldlIHNob3VsZCBsb2NrIHRocmVhZCAlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgdW5sb2NrIHRocmVhZCAlZFxuIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgZ19wcmludGYoIldlIG11c3QgZGVzdHJveSB0aGUgbG9ja1xuIik7Cit9CisgKi8KKworCitHX0RFRklORV9UWVBFKFRocmlmdFNTTFNvY2tldCwgdGhyaWZ0X3NzbF9zb2NrZXQsIFRIUklGVF9UWVBFX1NPQ0tFVCkKKworCisKKy8qKgorICogV2hlbiB0aGVyZSdzIGEgdGhyZWFkIGNvbnRleHQgYXR0YWNoZWQsIHdlIHBhc3MgdGhlIFNTTCBzb2NrZXQgY29udGV4dCBzbyBpdAorICogY2FuIGNoZWNrIGlmIHRoZSBlcnJvciBpcyBvdXRzaWRlIFNTTCwgb24gSS9PIGZvciBleGFtcGxlCisgKiBAcGFyYW0gc29ja2V0CisgKiBAcGFyYW0gZXJyb3JfbXNnCisgKiBAcGFyYW0gdGhyaWZ0X2Vycm9yX25vCisgKiBAcGFyYW0gc3NsX2Vycm9yCisgKiBAcGFyYW0gZXJyb3IKKyAqLworc3RhdGljCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3IoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQsIGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIGludCBzc2xfZXJyb3IsIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIGNoYXIgYnVmZmVyWzEwMjRdOworICBpbnQgYnVmZmVyX3NpemU9MTAyNDsKKyAgZ2Jvb2xlYW4gZmlyc3RfZXJyb3IgPSBUUlVFOworICBpbnQgc3NsX2Vycm9yX3R5cGUgPSBTU0xfZ2V0X2Vycm9yKHNvY2tldC0+c3NsLCBzc2xfZXJyb3IpOworICBpZihzc2xfZXJyb3JfdHlwZT4wKXsKKyAgICAgIHN3aXRjaChzc2xfZXJyb3JfdHlwZSl7CisJY2FzZSBTU0xfRVJST1JfU1NMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJTU0wgJXM6ICIsIGVycm9yX21zZyk7CisJICB3aGlsZSAoKGVycm9yX2NvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDAgJiYgYnVmZmVyX3NpemU+MSkgeworCSAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbiA9IEVSUl9yZWFzb25fZXJyb3Jfc3RyaW5nKGVycm9yX2NvZGUpOworCSAgICAgIGlmKHJlYXNvbiE9TlVMTCl7CisJCSAgaWYoIWZpcnN0X2Vycm9yKSB7CisJCSAgICAgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIlxuXHQiKTsKKwkJICAgICAgZmlyc3RfZXJyb3I9RkFMU0U7CisJCSAgfQorCQkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCglcykgLT4gJXMiLCBlcnJvcl9jb2RlLCByZWFzb24sIFNTTF9zdGF0ZV9zdHJpbmcoc29ja2V0LT5zc2wpKTsKKwkgICAgICB9CisJICB9CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCSAgYnVmZmVyX3NpemUtPXNucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICIlczogIiwgZXJyb3JfbXNnKTsKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIrKDEwMjQtYnVmZmVyX3NpemUpLCBidWZmZXJfc2l6ZSwgIiVsWCAtPiAlcyIsIHNzbF9lcnJvcl90eXBlLCAiRXJyb3Igd2hpbGUgd3JpdHRpbmcgdG8gdW5kZXJsYXlpbmcgbGF5ZXIiKTsKKwkgIGJyZWFrOworCisgICAgICB9CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIHRocmlmdF9lcnJvcl9ubywgIiVzIiwgYnVmZmVyKTsKKyAgfQorfQorCisvKioKKyAqIEZvciBnbG9iYWwgU1NMIGVycm9ycworICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoY29uc3QgZ3VjaGFyICplcnJvcl9tc2csIGd1aW50IHRocmlmdF9lcnJvcl9ubywgR0Vycm9yICoqZXJyb3IpCit7CisgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKyAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKyAgICAgIGlmIChyZWFzb24gPT0gTlVMTCkgeworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFg6ICVzIiwgZXJyb3JfY29kZSwgZXJyb3JfbXNnKTsKKyAgICAgIH1lbHNleworCSAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICAgICAgdGhyaWZ0X2Vycm9yX25vLAorCQkgICAgICAgIlNTTCBlcnJvciAlbFggJXM6ICVzIiwgZXJyb3JfY29kZSxyZWFzb24sIGVycm9yX21zZyk7CisgICAgICB9CisgIH0KK30KKworCisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2lzX29wZW4odHJhbnNwb3J0KTsKK30KKworLyogb3ZlcnJpZGVzIHRocmlmdF90cmFuc3BvcnRfcGVlayAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBpZiAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSkKKyAgICB7CisgICAgICBpbnQgcmM7CisgICAgICBnY2hhciBieXRlOworICAgICAgcmMgPSBTU0xfcGVlayhzc2xfc29ja2V0LT5zc2wsICZieXRlLCAxKTsKKyAgICAgIGlmIChyYyA8IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkNoZWNrIHNvY2tldCBkYXRhIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJjLCBlcnJvcik7CisgICAgICB9CisgICAgICBpZiAocmMgPT0gMCkgeworCSAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICB9CisgICAgICByZXR2YWwgPSAocmMgPiAwKTsKKyAgICB9CisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBFUlJfY2xlYXJfZXJyb3IoKTsKKworICBpZiAoIXRocmlmdF9zb2NrZXRfb3Blbih0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgcmV0dXJuIEZBTFNFOworICB9CisKKyAgaWYgKCFUSFJJRlRfU1NMX1NPQ0tFVF9HRVRfQ0xBU1ModHJhbnNwb3J0KS0+aGFuZGxlX2hhbmRzaGFrZSh0cmFuc3BvcnQsIGVycm9yKSkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBnYm9vbGVhbiByZXR2YWwgPSBGQUxTRTsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQodHJhbnNwb3J0KTsKKyAgaWYoc3NsX3NvY2tldCE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2wpIHsKKyAgICAgIGludCByYyA9IFNTTF9zaHV0ZG93bihzc2xfc29ja2V0LT5zc2wpOworLyogICAgICBpZiAocmMgPCAwKSB7CisJICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTDsKKyAgICAgIH0qLworICAgICAgU1NMX2ZyZWUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIHNzbF9zb2NrZXQtPnNzbCA9IE5VTEw7CisgICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICB9CisgIHJldHVybiB0aHJpZnRfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLworZ2ludDMyCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorCQkJZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBndWludCBtYXhSZWN2UmV0cmllc18gPSAxMDsKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGd1aW50IGJ5dGVzID0gMDsKKyAgZ3VpbnQgcmV0cmllcyA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIGZvciAocmV0cmllcz0wOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspIHsKKyAgICAgIGJ5dGVzID0gU1NMX3JlYWQoc3NsX3NvY2tldC0+c3NsLCBidWYsIGxlbik7CisgICAgICBpZiAoYnl0ZXMgPj0gMCkKKwlicmVhazsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpZiAoU1NMX2dldF9lcnJvcihzc2xfc29ja2V0LT5zc2wsIGJ5dGVzKSA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworCSAgaWYgKEVSUl9nZXRfZXJyb3IoKSA9PSAwICYmIGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSKSB7CisJICAgICAgY29udGludWU7CisJICB9CisgICAgICB9ZWxzZXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlJlY2VpdmUgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgYnl0ZXMsIGVycm9yKTsKKworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiBieXRlczsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisJCQkgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgd2hpbGUgKHNlbnQgPCBsZW4pCisgICAgeworICAgICAgcmV0ID0gU1NMX3dyaXRlIChzc2xfc29ja2V0LT5zc2wsIChndWludDggKilidWYgKyBzZW50LCBsZW4gLSBzZW50KTsKKyAgICAgIGlmIChyZXQgPCAwKQorCXsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIlNlbmQgZXJyb3IiLAorCQkJCQkgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTCwgcmV0LCBlcnJvcik7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgc2VudCArPSByZXQ7CisgICAgfQorCisgIHJldHVybiBzZW50PT1sZW47Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKKyAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICAvKiBzYXRpc2Z5IC1XYWxsICovCisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCisgKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ2ludCByZXQgPSAwOworICBndWludCBzZW50ID0gMDsKKworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBCSU8qIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfc29ja2V0LT5zc2wpOworICBpZiAoYmlvID09IE5VTEwpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoLCB3YmlvIHJldHVybmVkIG51bGwiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgeworICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisJCSAgICJmYWlsZWQgdG8gZmx1c2ggaXQgcmV0dXJuZWQgZXJyb3IiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpLCBGQUxTRSk7CisKKyAgaWYoVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpLT5jcmVhdGVfc3NsX2NvbnRleHQodHJhbnNwb3J0LCBlcnJvcikpeworICAgICAgLypDb250ZXh0IGNyZWF0ZWQqLworICAgICAgU1NMX3NldF9mZChzc2xfc29ja2V0LT5zc2wsIHNvY2tldC0+c2QpOworICAgICAgaW50IHJjOworICAgICAgaWYoc3NsX3NvY2tldC0+c2VydmVyKXsKKwkgIHJjID0gU1NMX2FjY2VwdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfWVsc2V7CisJICByYyA9IFNTTF9jb25uZWN0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICB9CisgICAgICBpZiAocmMgPD0gMCkgeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3NzbF9lcnJvcihzc2xfc29ja2V0LCAiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kIiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELCByYywgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9ZWxzZQorICAgIHJldHVybiBGQUxTRTsKKworICByZXR1cm4gdGhyaWZ0X3NzbF9zb2NrZXRfYXV0aG9yaXplKHRyYW5zcG9ydCwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0KFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisKKyAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworICAgICAgaWYoc29ja2V0LT5zc2whPU5VTEwpIHsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBzb2NrZXQtPnNzbCA9IFNTTF9uZXcoc29ja2V0LT5jdHgpOworICAgICAgaWYgKHNvY2tldC0+c3NsID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVCwKKwkJICAgICAgICJVbmFibGUgdG8gY3JlYXRlIGRlZmF1bHQgU1NMIGNvbnRleHQiKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfQorCisgIHJldHVybiBUUlVFOworfQorCisKK2dib29sZWFuIHRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSkKK3sKKyAgY2hhciBlcnJvcl9idWZmZXJbMjU1XTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKSB7CisgICAgICBnX2Vycm9yKCJPcGVuU1NMIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpbnQgcmMgPSBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzc2xfc29ja2V0LT5jdHgsIGZpbGVfbmFtZSwgTlVMTCk7CisgIGlmIChyYyAhPSAxKSB7IC8qdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdCovCisgICAgICBFUlJfZXJyb3Jfc3RyaW5nX24oRVJSX2dldF9lcnJvcigpLCBlcnJvcl9idWZmZXIsIDI1NCk7CisgICAgICBnX3dhcm5pbmcoIkxvYWQgb2YgY2VydGlmaWNhdGVzIGZhaWxlZDogJXMhIiwgZXJyb3JfYnVmZmVyKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSkKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIC8qIExvYWQgY2hhaW4gb2YgY2VydHMqLworICBYNTA5ICpjYWNlcnQ9TlVMTDsKKyAgQklPICptZW0gPSBCSU9fbmV3X21lbV9idWYoY2hhaW5fY2VydHMsc3RybGVuKGNoYWluX2NlcnRzKSk7CisgIFg1MDlfU1RPUkUgKmNlcnRfc3RvcmUgPSBTU0xfQ1RYX2dldF9jZXJ0X3N0b3JlKHNzbF9zb2NrZXQtPmN0eCk7CisKKyAgaWYoY2VydF9zdG9yZSE9TlVMTCl7CisgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgd2hpbGUgKChjYWNlcnQgPSBQRU1fcmVhZF9iaW9fWDUwOShtZW0sIE5VTEwsIDAsIE5VTEwpKSE9TlVMTCkgeworCSAgaWYoY2FjZXJ0KSB7CisJICAgICAgWDUwOV9TVE9SRV9hZGRfY2VydChjZXJ0X3N0b3JlLCBjYWNlcnQpOworCSAgICAgIFg1MDlfZnJlZShjYWNlcnQpOworCSAgICAgIGNhY2VydD1OVUxMOworCSAgfSAvKiBGcmVlIGltbWVkaWF0ZWx5ICovCisJICBpbmRleCsrOworICAgICAgfQorICAgICAgcmV0dmFsPVRSVUU7CisgIH0KKyAgQklPX2ZyZWUobWVtKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZShUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXRDbGFzcyAqY2xzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHNzbF9zb2NrZXQpOworICBnYm9vbGVhbiBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IEZBTFNFOworCisgIGlmKGNscyE9TlVMTCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwpeworICAgICAgaW50IHJjID0gU1NMX2dldF92ZXJpZnlfcmVzdWx0KHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBpZiAocmMgIT0gWDUwOV9WX09LKSB7IC8qIHZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQgKi8KKwkgIGlmIChyYyA9PSBYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVCAmJiBzc2xfc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkKSB7CisJICAgICAgZ19kZWJ1ZygiVGhlIGNlcnRpZmljYXRlIGlzIGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgYW5kIGNvbmZpZ3VyYXRpb24gYWxsb3dzIGl0Iik7CisJICB9IGVsc2UgeworCSAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCQkgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRCwKKwkJCSAgICJUaGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWxlZDogJXMgKCVkKSIsIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSwgcmMpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKyAgICAgIH0KKworICAgICAgWDUwOSogY2VydCA9IFNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKGNlcnQgPT0gTlVMTCkgeworCSAgaWYgKFNTTF9nZXRfdmVyaWZ5X21vZGUoc3NsX3NvY2tldC0+c3NsKSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiTm8gY2VydGlmaWNhdGUgcHJlc2VudC4gQXJlIHlvdSBjb25uZWN0aW5nIFNTTCBzZXJ2ZXI/Iik7CisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgfQorCSAgZ19kZWJ1ZygiTm8gY2VydGlmaWNhdGUgcmVxdWlyZWQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICAvKiBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50LCBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFjY2VzcyBtYW5hZ2VyIHdlIGFyZSBkb25lICovCisgICAgICBpZiAoY2xzLT5hdXRob3JpemVfcGVlciA9PSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisJICBnX2RlYnVnKCJDZXJ0aWZpY2F0ZSBwcmVzZW50ZWQgYnV0IHdlJ3JlIG5vdCBjaGVja2luZyBpdCIpOworCSAgcmV0dXJuIFRSVUU7CisgICAgICB9IGVsc2UgeworCSAgLyogYm90aCBjZXJ0aWZpY2F0ZSBhbmQgYWNjZXNzIG1hbmFnZXIgYXJlIHByZXNlbnQgKi8KKwkgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworCSAgc29ja2xlbl90IHNhTGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwkgIGlmIChnZXRwZWVybmFtZShzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyKikmc2EsICZzYUxlbmd0aCkgIT0gMCkgeworCSAgICAgIHNhLnNzX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwkgIH0KKwkgIGF1dGhvcml6YXRpb25fcmVzdWx0ID0gY2xzLT5hdXRob3JpemVfcGVlcih0cmFuc3BvcnQsIGNlcnQsICZzYSwgZXJyb3IpOworICAgICAgfQorICAgICAgaWYoY2VydCAhPSBOVUxMKSB7CisJICBYNTA5X2ZyZWUoY2VydCk7CisgICAgICB9CisgIH0KKworICByZXR1cm4gYXV0aG9yaXphdGlvbl9yZXN1bHQ7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfaW5pdCAoVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQpCit7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBzb2NrZXQtPnNzbCA9IE5VTEw7CisgIHNvY2tldC0+Y3R4ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFNTTFRMUywgJmVycm9yKTsKKyAgaWYoc29ja2V0LT5jdHggPT0gTlVMTCkgeworICAgICAgZ19pbmZvKCJUaGUgU1NMIGNvbnRleHQgd2FzIG5vdCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkIHdpdGggcHJvdG9jb2wgJWQiLCBTU0xUTFMpOworICAgICAgaWYoZXJyb3IhPU5VTEwpeworCSAgZ19pbmZvKCJSZXBvcnRlZCByZWFzb24gJXMiLCBlcnJvci0+bWVzc2FnZSk7CisJICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgIH0KKyAgfQorICBzb2NrZXQtPnNlcnZlciA9IEZBTFNFOworICBzb2NrZXQtPmFsbG93X3NlbGZzaWduZWQgPSBGQUxTRTsKKworfQorCisvKiBkZXN0cnVjdG9yICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgR0Vycm9yICplcnJvcj1OVUxMOworICBpZihzb2NrZXQhPU5VTEwpeworICAgICAgZ19kZWJ1ZygiSW5zdGFuY2UgJXAgZGVzdHJveWVkIiwgKHZvaWQgKilzb2NrZXQpOworICAgICAgaWYoc29ja2V0LT5zc2wgIT0gTlVMTCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZShUSFJJRlRfVFJBTlNQT1JUKG9iamVjdCksICZlcnJvcik7CisJICBzb2NrZXQtPnNzbD1OVUxMOworCX0KKworICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBmb3IgdGhlIGluc3RhbmNlIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworCSAgc29ja2V0LT5jdHg9TlVMTDsKKyAgICAgIH0KKyAgfQorCisgIGlmIChHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3NzbF9zb2NrZXRfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpIChvYmplY3QpOworfQorCisvKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCUdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGdfdmFsdWVfc2V0X3BvaW50ZXIgKHZhbHVlLCBzb2NrZXQtPmN0eCk7CisgICAgICBicmVhazsKKyAgfQorfQorCisvKiBwcm9wZXJ0eSBtdXRhdG9yICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCisJCQkJY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhUOgorICAgICAgaWYoc29ja2V0LT5jdHghPU5VTEwpeworCSAgZ19kZWJ1ZygiRnJlZWluZyB0aGUgY29udGV4dCBzaW5jZSB3ZSBhcmUgc2V0dGluZyBhIG5ldyBvbmUiKTsKKwkgIFNTTF9DVFhfZnJlZShzb2NrZXQtPmN0eCk7CisgICAgICB9CisgICAgICBzb2NrZXQtPmN0eCA9IGdfdmFsdWVfZ2V0X3BvaW50ZXIodmFsdWUpOyAvKiBXZSBjb3B5IHRoZSBjb250ZXh0ICovCisgICAgICBicmVhazsKKworICAgIGNhc2UgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVEOgorICAgICAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gZ192YWx1ZV9nZXRfYm9vbGVhbih2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZ193YXJuaW5nKCJUcnlpbmcgdG8gc2V0IHByb3BlcnR5ICVpIHRoYXQgZG9lc24ndCBleGlzdHMhIiwgcHJvcGVydHlfaWQpOworICAgICAgLyogICAgdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eV9pZCwgdmFsdWUsIHBzcGVjKTsgKi8KKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZih0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkKXsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkPVRSVUU7CisgIFNTTF9saWJyYXJ5X2luaXQoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKyAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworICBFUlJfbG9hZF9CSU9fc3RyaW5ncygpOworCisgIC8qIFNldHVwIGxvY2tpbmcgKi8KKyAgZ19kZWJ1ZygiV2Ugc2V0dXAgJWQgdGhyZWFkcyBsb2NrcyIsIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfc2V0dXAoKSk7CisKKyAgLyogZHluYW1pYyBsb2NraW5nCisgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY3JlYXRlX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfY2FsbGJhY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKTsKKyAgICovCit9CisKKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpCit7CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICB9CisgIHRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKKworICBnX2RlYnVnKCJXZSBjbGVhcmVkICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX2NsZWFudXAoKSk7CisgIC8qIE5vdCBzdXBwb3J0ZWQKKyAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7CisgICAqLworICBFUlJfZnJlZV9zdHJpbmdzKCk7CisgIEVWUF9jbGVhbnVwKCk7CisgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgIEVSUl9yZW1vdmVfc3RhdGUoMCk7Cit9CisKKworLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscykKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7CisgIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOworICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKKworICBnX2RlYnVnKCJJbml0aWFsaXphdGlvbiBvZiBUaHJpZnRTU0xTb2NrZXRDbGFzcyIpOworICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eTsKKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5OworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJzc2xfY29udGV4dCIsCisJCQkJICAgICAiU1NMQ29udGV4dCIsCisJCQkJICAgICAiU2V0IHRoZSBTU0wgY29udGV4dCBmb3IgaGFuZHNoYWtlIHdpdGggdGhlIHJlbW90ZSBob3N0IiwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NPQ0tFVF9DT05URVhULAorCQkJCSAgIHBhcmFtX3NwZWMpOworICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX2Jvb2xlYW4gKCJzc2xfYWNjZXB0X3NlbGZzaWduZWQiLAorCQkJCSAgICAgIkFjY2VwdCBTZWxmIFNpZ25lZCIsCisJCQkJICAgICAiV2hldGhlciBvciBub3QgYWNjZXB0IHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIiwKKwkJCQkgICAgIEZBTFNFLAorCQkJCSAgICAgR19QQVJBTV9SRUFEV1JJVEUpOworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQsCisJCQkJICAgcGFyYW1fc3BlYyk7CisgIC8qIENsYXNzIG1ldGhvZHMgKi8KKyAgY2xzLT5oYW5kbGVfaGFuZHNoYWtlID0gdGhyaWZ0X3NzbF9zb2NrZXRfaGFuZGxlX2hhbmRzaGFrZTsKKyAgY2xzLT5jcmVhdGVfc3NsX2NvbnRleHQgPSB0aHJpZnRfc3NsX3NvY2tldF9jcmVhdGVfc3NsX2NvbnRleHQ7CisKKyAgLyogT3ZlcnJpZGUgKi8KKyAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZTsKKyAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbjsKKyAgdHRjLT5wZWVrID0gdGhyaWZ0X3NzbF9zb2NrZXRfcGVlazsKKyAgdHRjLT5vcGVuID0gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbjsKKyAgdHRjLT5jbG9zZSA9IHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlOworICB0dGMtPnJlYWQgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkOworICB0dGMtPnJlYWRfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQ7CisgIHR0Yy0+d3JpdGUgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZTsKKyAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQ7CisgIHR0Yy0+Zmx1c2ggPSB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaDsKK30KKworCisvKgorICogUHVibGljIEFQSQorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0aHJpZnRTU0xTb2NrZXQgPSBOVUxMOworICBTU0xfQ1RYICpzc2xfY29udGV4dCA9IE5VTEw7CisgIC8qIENyZWF0ZSB0aGUgY29udGV4dCAqLworICBpZigoc3NsX2NvbnRleHQ9dGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKHNzbF9wcm90b2NvbCwgZXJyb3IpKT09TlVMTCl7CisgICAgICBnX3dhcm5pbmcoIldlIGNhbm5vdCBpbml0aWFsaXplIGNvbnRleHQgZm9yIHByb3RvY29sICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKworICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgLyogRklYTUUgRG8gZXJyb3IgY29udHJvbCAqLworICAgICAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKKyAgfQorICAvKiBGSVhNRSBpZiB0aGUgcHJvdG9jb2wgaXMgZGlmZmVyZW50PyAqLworICB0aHJpZnRTU0xTb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsICJzc2xfY29udGV4dCIsIHNzbF9jb250ZXh0LCAiaG9zdG5hbWUiLCBob3N0bmFtZSwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgcmV0dXJuIHRocmlmdFNTTFNvY2tldDsKK30KKwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjaykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKnNzbFNvY2tldENsYXNzID0gVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTIChzc2xfc29ja2V0KTsKKyAgaWYoc3NsU29ja2V0Q2xhc3MpeworICAgICAgc3NsU29ja2V0Q2xhc3MtPmF1dGhvcml6ZV9wZWVyID0gY2FsbGJhY2s7CisgIH0KK30KKworCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFNTTF9DVFgqIGNvbnRleHQgPSBOVUxMOworICBzd2l0Y2goc3NsX3Byb3RvY29sKXsKKyAgICBjYXNlIFNTTFRMUzoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworICAgIGNhc2UgU1NMdjM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjNfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBjYXNlIFRMU3YxXzA6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8xOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzFfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUTFN2MV8yOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxXzJfbWV0aG9kKCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsCisJCSAgICJUaGUgU1NMIHByb3RvY29sIGlzIHVua25vd24gZm9yICVkIiwgc3NsX3Byb3RvY29sKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoY29udGV4dCA9PSBOVUxMKSB7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfZXJyb3IoIk5vIGNpcGhlciBvdmVybGF5IiwgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ0lQSEVSX05PVF9BVkFJTEFCTEUsIGVycm9yKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisgIFNTTF9DVFhfc2V0X21vZGUoY29udGV4dCwgU1NMX01PREVfQVVUT19SRVRSWSk7CisKKyAgLyogRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMgcHJvdG9jb2xzIGJ1dCBhbGxvdyBhIGhhbmRzaGFrZQorICAgICB3aXRoIG9sZGVyIGNsaWVudHMgc28gdGhleSBnZXQgYSBncmFjZWZ1bCBkZW5pYWwuICovCisgIGlmIChzc2xfcHJvdG9jb2wgPT0gU1NMVExTKSB7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Mik7CisgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGNvbnRleHQsIFNTTF9PUF9OT19TU0x2Myk7ICAgLyogVEhSSUZULTMxNjQgKi8KKyAgfQorCisgIHJldHVybiBjb250ZXh0OworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E0NjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisjZGVmaW5lIF9USFJJRlRfU1NMX1NPQ0tFVF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3NzbF9zb2NrZXQuaAorICogIFxicmllZiBTU0wgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCisgKiAgICAgICAgIFRocmlmdFNvY2tldCBjbGFzcy4gQmFzZWQgb24gcGxhaW4gb3BlbnNzbC4KKyAqICAgICAgICAgSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgdGFrZSBhIGxvb2sgdG8gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtMTAxNgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQgKHRocmlmdF9zc2xfc29ja2V0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIFRocmlmdFNTTFNvY2tldCkpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19TU0xfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VUKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXRDbGFzcykpCisKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1RSQU5TUE9SVD03LAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DT05ORUNUX0JJTkQsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsCisgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVECit9IFRocmlmdFNTTFNvY2tldEVycm9yOworCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQgVGhyaWZ0U1NMU29ja2V0OworCisvKiEKKyAqIFRocmlmdCBTU0wgU29ja2V0IGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldAoreworICBUaHJpZnRTb2NrZXQgcGFyZW50OworCisgIC8qIHByaXZhdGUgKi8KKyAgU1NMICpzc2w7CisgIFNTTF9DVFgqIGN0eDsKKyAgZ2Jvb2xlYW4gc2VydmVyOworICBnYm9vbGVhbiBhbGxvd19zZWxmc2lnbmVkOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNTTFNvY2tldENsYXNzIFRocmlmdFNTTFNvY2tldENsYXNzOwordHlwZWRlZiBnYm9vbGVhbiAoKiBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0spIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcworeworICBUaHJpZnRTb2NrZXRDbGFzcyBwYXJlbnQ7CisKKyAgZ2Jvb2xlYW4gKCogaGFuZGxlX2hhbmRzaGFrZSkgKFRocmlmdFRyYW5zcG9ydCAqIHRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKiBjcmVhdGVfc3NsX2NvbnRleHQpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogYXV0aG9yaXplX3BlZXIpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcik7CisKKyAgLyogUGFkZGluZyB0byBhbGxvdyBhZGRpbmcgdXAgdG8gMTIgbmV3IHZpcnR1YWwgZnVuY3Rpb25zIHdpdGhvdXQKKyAgICogYnJlYWtpbmcgQUJJLiAqLworICBncG9pbnRlciBwYWRkaW5nWzEyXTsKK307CisKK2VudW0gX1RocmlmdFNTTFNvY2tldFByb3RvY29sIHsKKyAgU1NMVExTICA9IDAsICAvKiBTdXBwb3J0cyBTU0x2MiBhbmQgU1NMdjMgaGFuZHNoYWtlIGJ1dCBvbmx5IG5lZ290aWF0ZXMgYXQgVExTdjFfMCBvciBsYXRlci4gKi8KKy8qU1NMdjIgICA9IDEsICAgSE9SUklCTFkgSU5TRUNVUkUhICovCisgIFNTTHYzICAgPSAyLCAgLyogU3VwcG9ydHMgU1NMdjMgb25seSAtIGFsc28gaG9ycmlibHkgaW5zZWN1cmUhICovCisgIFRMU3YxXzAgPSAzLCAgLyogU3VwcG9ydHMgVExTdjFfMCBvciBsYXRlci4gKi8KKyAgVExTdjFfMSA9IDQsICAvKiBTdXBwb3J0cyBUTFN2MV8xIG9yIGxhdGVyLiAqLworICBUTFN2MV8yID0gNSwgIC8qIFN1cHBvcnRzIFRMU3YxXzIgb3IgbGF0ZXIuICovCisgIExBVEVTVCAgPSBUTFN2MV8yCit9OwordHlwZWRlZiBlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBUaHJpZnRTU0xTb2NrZXRQcm90b2NvbDsKKworCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KK1NTTF9DVFgqCit0aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKworLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICovCitHVHlwZSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIFB1YmxpYyBBUEkgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0IGEgcGlubmluZyBtYW5hZ2VyIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLgorICoKKyAqIFRoZSBwaW5uaW5nIG1hbmFnZXIgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgU1NMIGhhbmRzaGFrZSB0byBjaGVjayBjZXJ0aWZpY2F0ZQorICogYW5kIHBpbm5pbmcgcGFyYW1ldGVycy4KKyAqCisgKiBAcGFyYW0gc3NsX3NvY2tldCBTU0wgU29ja2V0IHRvIG9wZXJhdGUgb24uCisgKiBAcGFyYW0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIHRha2UgdGhlIGNvbnRyb2wgd2hpbGUgdmFsaWRhdGluZyBwaW5uaW5nCisgKgorICovCit2b2lkIHRocmlmdF9zc2xfc29ja2V0X3NldF9tYW5hZ2VyKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLIGNhbGxiYWNrKTsKKworLyogVGhpcyBpcyB0aGUgU1NMIEFQSSAqLworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU1NMIGNvbnRleHQgd2l0aCB0aGUgcHJvdG9jb2wgc3BlY2lmaWVkCisgKiBhbmQgYXNzaWduIHRoaXMgbmV3IGNvbnRleHQgdG8gdGhlIGNyZWF0ZWQgVGhyaWZ0U1NMU29ja2V0IHdpdGggc3BlY2lmaWVkIGhvc3Q6cG9ydC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBob3N0bmFtZQorICogQHBhcmFtIHBvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXdfd2l0aF9ob3N0KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgZ2NoYXIgKmhvc3RuYW1lLCBndWludCBwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldC4KKyAqIEBwYXJhbSBzc2xfcHJvdG9jb2wKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybgorICovCitUaHJpZnRTU0xTb2NrZXQqCit0aHJpZnRfc3NsX3NvY2tldF9uZXcoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBHRXJyb3IgKiplcnJvcik7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gYSBQRU0gZmlsZS4KKyAqIEBwYXJhbSBzc2xfc29ja2V0IFRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gZmlsZV9uYW1lIFRoZSBmaWxlIG5hbWUgb2YgdGhlIFBFTSBjZXJ0aWZpY2F0ZSBjaGFpbgorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCwgY29uc3QgY2hhciAqZmlsZV9uYW1lKTsKKworLyoqCisgKiBMb2FkIGEgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBtZW1vcnkKKyAqIEBwYXJhbSBzc2xfc29ja2V0IHRoZSBzc2wgc29ja2V0CisgKiBAcGFyYW0gY2hhaW5fY2VydHMgdGhlIGJ1ZmZlciB0byBsb2FkIFBFTSBmcm9tCisgKiBAcmV0dXJuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2J1ZmZlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgY2hhaW5fY2VydHNbXSk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHNzbCBzb2NrZXQgaXMgb3BlbiBhbmQgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHJldHVybiB0cnVlIGlmIG9wZW4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKKworCisvKioKKyAqIE9wZW4gY29ubmVjdGlvbiBpZiByZXF1aXJlZCBhbmQgc2V0IHRoZSBzb2NrZXQgdG8gYmUgcmVhZHkgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogQHBhcmFtIHRyYW5zcG9ydAorICogQHBhcmFtIGVycm9yCisgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHdhcyBjb3JyZWN0CisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qKgorICogQGJyaWVmIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCisgKgorICogSXQgd2lsbCBpbml0aWFsaXplIE9wZW5TU0wgZnVuY3Rpb24uIFRoaXMgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBkb25lIGFwcAorICogd2lkZS4gU28gaWYgeW91IHdhbnQgdG8gaW5pdGlhbGl6ZSBpdCBieSB5b3Vyc2VsZiB5b3Ugc2hvdWxkIG5vdCBjYWxsIGl0LgorICogQnV0IGl0IG1lYW5zIHlvdSBtdXN0IGhhbmRsZSBPcGVuU1NMIGluaXRpYWxpemF0aW9uIGFuZCBoYW5kbGUgbG9ja2luZy4KKyAqCisgKiBJdCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCh2b2lkKTsKKy8qKgorICogQGJyaWVmIEZpbmFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IGNsZWFycyBhbGwgcmVzb3VyY2VzIGluaXRpYWxpemVkIGluIGluaXRpYWxpemUgZnVuY3Rpb24uCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbnl0aGluZyBlbHNlLgorICoKKyAqCisgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2wodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQyNjcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLworI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0RPTUFJTiAidGhyaWZ0LXRyYW5zcG9ydC1lcnJvci1xdWFyayIKKworR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRUcmFuc3BvcnQsIHRocmlmdF90cmFuc3BvcnQsIEdfVFlQRV9PQkpFQ1QpCisKK2dib29sZWFuIAordGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5pc19vcGVuICh0cmFuc3BvcnQpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cGVlayAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5vcGVuICh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZCAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dib29sZWFuCit0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+cmVhZF9lbmQgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT53cml0ZSAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCitnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT53cml0ZV9lbmQgKHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF90cmFuc3BvcnRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5mbHVzaCAodHJhbnNwb3J0LCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2FsbCAodHJhbnNwb3J0LCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOworfQorCisvKiBieSBkZWZhdWx0LCBwZWVrIHJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4gKi8KK3N0YXRpYyBnYm9vbGVhbgordGhyaWZ0X3RyYW5zcG9ydF9yZWFsX3BlZWsgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKworICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmlzX29wZW4gKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyBnaW50MzIKK3RocmlmdF90cmFuc3BvcnRfcmVhbF9yZWFkX2FsbCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjOworICBndWludDMyIGhhdmU7CisgIGdpbnQzMiByZXQ7CisgIGdpbnQ4ICpieXRlczsKKworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOworCisgIHR0YyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOworICBoYXZlID0gMDsKKyAgcmV0ID0gMDsKKyAgYnl0ZXMgPSAoZ2ludDgqKSBidWY7CisKKyAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKKyAgICBpZiAoKHJldCA9IHR0Yy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIChieXRlcyArIGhhdmUpLCBsZW4gLSBoYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkgeworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaGF2ZSArPSByZXQ7CisgIH0KKworICByZXR1cm4gaGF2ZTsKK30KKworLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLworR1F1YXJrCit0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKQoreworICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOKTsKK30KKworLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFRyYW5zcG9ydCAqLworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmNscykKK3sKKyAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCisgIGNscy0+aXNfb3BlbiA9IHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbjsKKyAgY2xzLT5vcGVuID0gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuOworICBjbHMtPmNsb3NlID0gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZTsKKyAgY2xzLT5yZWFkID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkOworICBjbHMtPnJlYWRfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZDsKKyAgY2xzLT53cml0ZSA9IHRocmlmdF90cmFuc3BvcnRfd3JpdGU7CisgIGNscy0+d3JpdGVfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQ7CisgIGNscy0+Zmx1c2ggPSB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoOworCisgIC8qIHByb3ZpZGUgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgcGVlayBhbmQgcmVhZF9hbGwgbWV0aG9kcyAqLworICBjbHMtPnBlZWsgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWxfcGVlazsKKyAgY2xzLT5yZWFkX2FsbCA9IHRocmlmdF90cmFuc3BvcnRfcmVhbF9yZWFkX2FsbDsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCit7CisgIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmI2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9ICisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnQuaAorICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMuCisgKgorICogQW4gYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCBpbnN0ZWFkIG9mIGFuIGludGVyZmFjZSBiZWNhdXNlOgorICogIC0gaW50ZXJmYWNlcyBjYW4ndCBzZWVtIHRvIGJlIHVzZWQgYXMgcHJvcGVydGllcy4gIFRocmlmdFByb3RvY29sIGhhcworICogICAgYSBUaHJpZnRUcmFuc3BvcnQgYXMgYW4gb2JqZWN0IHByb3BlcnR5LgorICogIC0gaWYgYSBtZXRob2QgbmVlZHMgdG8gYmUgYWRkZWQgdGhhdCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlLCBhIGNsYXNzCisgKiAgICBpcyBuZWNlc3NhcnkuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICh0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnQpKQorI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnRDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydENsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydCBUaHJpZnRUcmFuc3BvcnQ7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydAoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcyBUaHJpZnRUcmFuc3BvcnRDbGFzczsKKworLyohCisgKiBUaHJpZnQgVHJhbnNwb3J0IGNsYXNzCisgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Q2xhc3MKK3sKKyAgR09iamVjdENsYXNzIHBhcmVudDsKKworICAvKiB2dGFibGUgKi8KKyAgZ2Jvb2xlYW4gKCppc19vcGVuKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworICBnYm9vbGVhbiAoKnBlZWspIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKm9wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKnJlYWRfZW5kKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp3cml0ZSkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCp3cml0ZV9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworICBnYm9vbGVhbiAoKmZsdXNoKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2ludDMyICgqcmVhZF9hbGwpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1RSQU5TUE9SVCAqLworR1R5cGUgdGhyaWZ0X3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7CisKKy8qIHZpcnR1YWwgcHVibGljIG1ldGhvZHMgKi8KKworLyohCisgKiBDaGVja3MgaWYgdGhpcyB0cmFuc3BvcnQgaXMgb3BlbmVkLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOworCisvKiEKKyAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogVGVzdHMgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gcmVhZCBvciBpZiB0aGUgcmVtb3RlIHNpZGUgaXMgc3RpbGwKKyAqIG9wZW4uIEJ5IGRlZmF1bHQgdGhpcyBpcyB0cnVlIHdoZW5ldmVyIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgYnV0CisgKiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGFkZCBsb2dpYyB0byB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiB3aGVyZSBwb3NzaWJsZQorICogKGkuZS4gb24gYSBzb2NrZXQpLgorICoKKyAqIFRoaXMgaXMgdXNlZCBieSBhIHNlcnZlciB0byBjaGVjayBpZiBpdCBzaG91bGQgbGlzdGVuIGZvciBhbm90aGVyIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBidWZmZXIgYnVmLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dpbnQzMiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisKKy8qIQorICogV3JpdGVzIGRhdGEgZnJvbSBhIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LgorICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCisgKi8KK2dib29sZWFuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KKyAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQorICovCitnYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiAgVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAorICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworLyohCisgKiBSZWFkIGxlbiBieXRlcyBvZiBkYXRhIGludG8gdGhlIGJ1ZmZlciBidWYuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKKyAqLworZ2ludDMyIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKKworLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwordHlwZWRlZiBlbnVtCit7CisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAorICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCisgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRQorfSBUaHJpZnRUcmFuc3BvcnRFcnJvcjsKKworLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLworR1F1YXJrIHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpOworI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SICh0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICgpKQorCisvKiBkZWZpbmUgbWFjcm8gZm9yIGludmFsaWQgc29ja2V0ICovCisjZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDI1Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFRyYW5zcG9ydEZhY3RvcnksIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeSwgR19UWVBFX09CSkVDVCkKKworLyogYnVpbGRzIGEgdHJhbnNwb3J0IGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0LiAqLworVGhyaWZ0VHJhbnNwb3J0ICoKK3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7CisgIHJldHVybiB0cmFuc3BvcnQ7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzICpjbHMpCit7CisgIGNscy0+Z2V0X3RyYW5zcG9ydCA9IHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2luaXQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnkpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzZGEzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0gKKyNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSAidGhyaWZ0X3RyYW5zcG9ydC5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qISBcZmlsZSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaAorICogIFxicmllZiBCYXNlIGNsYXNzIGZvciBUaHJpZnQgVHJhbnNwb3J0IEZhY3Rvcmllcy4gIFVzZWQgYnkgVGhyaWZ0IFNlcnZlcnMKKyAqICAgICAgICAgdG8gb2J0YWluIGEgY2xpZW50IHRyYW5zcG9ydCBmcm9tIGFuIGV4aXN0aW5nIHRyYW5zcG9ydC4gIFRoZSBkZWZhdWx0CisgKiAgICAgICAgIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbG9uZXMgdGhlIHByb3ZpZGVkIHRyYW5zcG9ydC4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSAodGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2dldF90eXBlICgpKQorI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSkpCisjZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZKSkKKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1RSQU5TUE9SVF9GQUNUT1JZX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkpCisjZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MpKQorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5OworCisvKiBUaHJpZnQgVHJhbnNwb3J0IEZhY3RvcnkgaW5zdGFuY2UgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeQoreworICBHT2JqZWN0IHBhcmVudDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzOworCisvKiBUaHJpZnQgVHJhbnNwb3J0IEZhY3RvcnkgY2xhc3MgKi8KK3N0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzCit7CisgIEdPYmplY3RDbGFzcyBwYXJlbnQ7CisKKyAgLyogdnRhYmxlICovCisgIFRocmlmdFRyYW5zcG9ydCAqKCpnZXRfdHJhbnNwb3J0KSAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZICovCitHVHlwZSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOworCisvKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCitUaHJpZnRUcmFuc3BvcnQgKnRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LCBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OTNhNjIuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+Ci0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvY2Vzc29yLCB0aHJpZnRfcHJvY2Vzc29yLCBHX1RZUEVfT0JKRUNUKQotCi1nYm9vbGVhbgotdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0KQotewotICByZXR1cm4gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKHByb2Nlc3NvciktPnByb2Nlc3MgKHByb2Nlc3NvciwgaW4sIG91dCk7Ci19Ci0KLS8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRQcm9jZXNzb3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvY2Vzc29yX2NsYXNzX2luaXQgKFRocmlmdFByb2Nlc3NvckNsYXNzICpjbHMpCi17Ci0gIC8qIHNldCB0aGVzZSBhcyB2aXJ0dWFsIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcyAqLwotICBjbHMtPnByb2Nlc3MgPSB0aHJpZnRfcHJvY2Vzc29yX3Byb2Nlc3M7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvY2Vzc29yX2luaXQgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvY2Vzc29yKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYWY3ZTkuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9DRVNTT1JfSAotI2RlZmluZSBfVEhSSUZUX1BST0NFU1NPUl9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfcHJvY2Vzc29yLmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm9jZXNzb3JzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1BST0NFU1NPUiAodGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST0NFU1NPUikpCi0jZGVmaW5lIFRIUklGVF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1BST0NFU1NPUiwgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPQ0VTU09SX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9QUk9DRVNTT1IpKQotI2RlZmluZSBUSFJJRlRfUFJPQ0VTU09SX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SLCBUaHJpZnRQcm9jZXNzb3JDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFByb2Nlc3Nvcm9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFByb2Nlc3NvcgotewotICBHT2JqZWN0IHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yIFRocmlmdFByb2Nlc3NvcjsKLQotLyohCi0gKiBUaHJpZnQgUHJvY2Vzc29yIGNsYXNzCi0gKi8KLXN0cnVjdCBfVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKLXsKLSAgR09iamVjdENsYXNzIHBhcmVudDsKLQotICAvKiB2dGFibGUgKi8KLSAgZ2Jvb2xlYW4gKCpwcm9jZXNzKSAoVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3IsIFRocmlmdFByb3RvY29sICppbiwKLSAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb2Nlc3NvckNsYXNzIFRocmlmdFByb2Nlc3NvckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST0NFU1NPUiAqLwotR1R5cGUgdGhyaWZ0X3Byb2Nlc3Nvcl9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIQotICogUHJvY2Vzc2VzIHRoZSByZXF1ZXN0LgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0UHJvY2Vzc29yQ2xhc3MKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3Byb2Nlc3Nvcl9wcm9jZXNzIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0KTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNlZTFlLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KLQotR19ERUZJTkVfVFlQRShUaHJpZnRCaW5hcnlQcm90b2NvbCwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpCi0KLXN0YXRpYyBndWludDY0Ci10aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKGdkb3VibGUgdikKLXsKLSAgdW5pb24gewotICAgIGdkb3VibGUgZnJvbTsKLSAgICBndWludDY0IHRvOwotICB9IHU7Ci0gIHUuZnJvbSA9IHY7Ci0gIHJldHVybiB1LnRvOwotfQotCi1zdGF0aWMgZ2RvdWJsZQotdGhyaWZ0X2JpdHdpc2VfY2FzdF9nZG91YmxlIChndWludDY0IHYpCi17Ci0gIHVuaW9uIHsKLSAgICBndWludDY0IGZyb207Ci0gICAgZ2RvdWJsZSB0bzsKLSAgfSB1OwotICB1LmZyb20gPSB2OwotICByZXR1cm4gdS50bzsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICBjb25zdCBnY2hhciAqbmFtZSwgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgdmVyc2lvbiA9IChUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKLSAgICAgICAgICAgICAgICAgICB8ICgoZ2ludDMyKSBtZXNzYWdlX3R5cGUpOwotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdmVyc2lvbiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsIG5hbWUsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKG5hbWUpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBmaWVsZF9pZCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgVF9TVE9QLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgKGdpbnQzMikgc2l6ZSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOyAKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAoZ2ludDMyKSBzaXplLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnYm9vbGVhbiB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ3VpbnQ4IHRtcCA9IHZhbHVlID8gMSA6IDA7Ci0gIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIHRtcCwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgIAotICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJnZhbHVlLCAxLCBlcnJvcikpCi0gIHsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MTYgbmV0ID0gZ19odG9ucyAodmFsdWUpOwotICBpZiAodGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBncG9pbnRlcikgJm5ldCwgMiwgZXJyb3IpKQotICB7Ci0gICAgcmV0dXJuIDI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ2ludDMyIG5ldCA9IGdfaHRvbmwgKHZhbHVlKTsKLSAgaWYgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpICZuZXQsIDQsIGVycm9yKSkKLSAgewotICAgIHJldHVybiA0OwotICB9IGVsc2UgewotICAgIHJldHVybiAtMTsKLSAgfQotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQ2NCBuZXQgPSBHVUlOVDY0X1RPX0JFICh2YWx1ZSk7Ci0gIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmbmV0LCA4LCBlcnJvcikpCi0gIHsKLSAgICByZXR1cm4gODsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgZ3VpbnQ2NCBiaXRzID0gR1VJTlQ2NF9GUk9NX0JFICh0aHJpZnRfYml0d2lzZV9jYXN0X2d1aW50NjQgKHZhbHVlKSk7Ci0gIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGdwb2ludGVyKSAmYml0cywgOCwgZXJyb3IpKQotICB7Ci0gICAgcmV0dXJuIDg7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGd1aW50MzIgbGVuID0gc3RyICE9IE5VTEwgPyBzdHJsZW4gKHN0cikgOiAwOwotICAvKiB3cml0ZSB0aGUgc3RyaW5nIGxlbmd0aCArIDEgd2hpY2ggaW5jbHVkZXMgdGhlIG51bGwgdGVybWluYXRvciAqLwotICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIChjb25zdCBncG9pbnRlcikgc3RyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgbGVuLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAobGVuID4gMCkKLSAgewotICAgIGlmICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZ3BvaW50ZXIpIGJ1ZiwgbGVuLCBlcnJvcikgPT0gRkFMU0UpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB4ZmVyICs9IGxlbjsKLSAgfQotCi0gIHJldHVybiB4ZmVyOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQzMiBzejsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzeiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0KLSAgaWYgKHN6IDwgMCkKLSAgewotICAgIC8qIGNoZWNrIGZvciB2ZXJzaW9uICovCi0gICAgZ3VpbnQzMiB2ZXJzaW9uID0gc3ogJiBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSzsKLSAgICBpZiAodmVyc2lvbiAhPSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMSkKLSAgICB7Ci0gICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfQkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZlcnNpb24gJWQsIGdvdCAlZCIsCi0gICAgICAgICAgICAgICAgICAgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEsIHZlcnNpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgICptZXNzYWdlX3R5cGUgPSAoVGhyaWZ0TWVzc2FnZVR5cGUpIChzeiAmIDB4MDAwMDAwZmYpOwotCi0gICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCBuYW1lLCBlcnJvcikpIDwgMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotCi0gICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCBzZXFpZCwgZXJyb3IpKSA8IDApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB4ZmVyICs9IHJldDsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICAqbmFtZSA9IE5VTEw7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQxNiAqZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAobmFtZSk7Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQ4IHR5cGU7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnR5cGUsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICAqZmllbGRfdHlwZSA9IChUaHJpZnRUeXBlKSB0eXBlOwotICBpZiAoKmZpZWxkX3R5cGUgPT0gVF9TVE9QKQotICB7Ci0gICAgKmZpZWxkX2lkID0gMDsKLSAgICByZXR1cm4geGZlcjsKLSAgfQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsIGZpZWxkX2lkLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotCi0gIGdpbnQzMiByZXQ7Ci0gIGdpbnQzMiB4ZmVyID0gMDsKLSAgZ2ludDggaywgdjsKLSAgZ2ludDMyIHNpemVpOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZrLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgKmtleV90eXBlID0gKFRocmlmdFR5cGUpIGs7Ci0KLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnYsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotICAqdmFsdWVfdHlwZSA9IChUaHJpZnRUeXBlKSB2OwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnNpemVpLCBlcnJvcikpIDwwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmIChzaXplaSA8IDApCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9QUk9UT0NPTF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX05FR0FUSVZFX1NJWkUsCi0gICAgICAgICAgICAgICAgICJnb3QgbmVnYXRpdmUgc2l6ZSBvZiAlZCIsIHNpemVpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAqc2l6ZSA9IChndWludDMyKSBzaXplaTsKLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLQotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdpbnQ4IGU7Ci0gIGdpbnQzMiBzaXplaTsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmZSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0gICplbGVtZW50X3R5cGUgPSAoVGhyaWZ0VHlwZSkgZTsKLQotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZzaXplaSwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgeGZlciArPSByZXQ7Ci0KLSAgaWYgKHNpemVpIDwgMCkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKLSAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgc2l6ZWkpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gICpzaXplID0gKGd1aW50MzIpIHNpemVpOwotICByZXR1cm4geGZlcjsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiAwOwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0KLSAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCBlbGVtZW50X3R5cGUsIHNpemUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHJvdG9jb2wpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gMDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYlsxXTsKLQotICBpZiAoKHJldCA9IAotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDEsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gICp2YWx1ZSA9ICooZ2ludDggKikgYiAhPSAwOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzFdOwotCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCAxLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICAqdmFsdWUgPSAqKGdpbnQ4ICopIGI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MTYgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYlsyXTsKLQotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgMiwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgKnZhbHVlID0gKihnaW50MTYgKikgYjsKLSAgKnZhbHVlID0gZ19udG9ocyAoKnZhbHVlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQzMiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBnaW50MzIgcmV0OwotICBncG9pbnRlciBiWzRdOwotCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKHByb3RvY29sLT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLCA0LCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICAqdmFsdWUgPSAqKGdpbnQzMiAqKSBiOwotICAqdmFsdWUgPSBnX250b2hsICgqdmFsdWUpOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICBnX3JldHVybl92YWxfaWZfZmFpbCAoVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7Ci0gIGdpbnQzMiByZXQ7Ci0gIGdwb2ludGVyIGJbOF07Ci0KLSAgaWYgKChyZXQgPQotICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIsIDgsIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gICp2YWx1ZSA9ICooZ2ludDY0ICopIGI7Ci0gICp2YWx1ZSA9IEdVSU5UNjRfRlJPTV9CRSAoKnZhbHVlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotZ2ludDMyCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ3BvaW50ZXIgYls4XTsKLQotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChwcm90b2NvbC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiwgOCwgZXJyb3IpKSA8IDApCi0gIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgZ3VpbnQ2NCBiaXRzID0gKihndWludDY0ICopIGI7Ci0gIGJpdHMgPSBHVUlOVDY0X0ZST01fQkUgKGJpdHMpOwotICAqdmFsdWUgPSB0aHJpZnRfYml0d2lzZV9jYXN0X2dkb3VibGUgKGJpdHMpOwotICByZXR1cm4gcmV0OwotfQotCi1naW50MzIKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqc3RyLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOwotICBndWludDMyIGxlbjsKLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotICBnaW50MzIgcmVhZF9sZW4gPSAwOwotCi0gIC8qIHJlYWQgdGhlIGxlbmd0aCBpbnRvIHJlYWRfbGVuICovCi0gIGlmICgocmV0ID0KLSAgICAgICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmcmVhZF9sZW4sIGVycm9yKSkgPCAwKQotICB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHhmZXIgKz0gcmV0OwotCi0gIGlmIChyZWFkX2xlbiA+IDApCi0gIHsKLSAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciB0aGUgc3RyaW5nICovCi0gICAgbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuICsgMTsgLy8gc3BhY2UgZm9yIG51bGwgdGVybWluYXRvcgotICAgICpzdHIgPSBnX25ldzAgKGdjaGFyLCBsZW4pOwotICAgIGlmICgocmV0ID0KLSAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciwgcmVhZF9sZW4sIGVycm9yKSkgPCAwKQotICAgIHsKLSAgICAgIGdfZnJlZSAoKnN0cik7Ci0gICAgICAqc3RyID0gTlVMTDsKLSAgICAgIGxlbiA9IDA7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotICB9IGVsc2UgewotICAgICpzdHIgPSBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BvaW50ZXIgKmJ1ZiwgZ3VpbnQzMiAqbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfQklOQVJZX1BST1RPQ09MIChwcm90b2NvbCksIC0xKTsKLSAgZ2ludDMyIHJldDsKLSAgZ2ludDMyIHhmZXIgPSAwOwotICBnaW50MzIgcmVhZF9sZW4gPSAwOwotIAotICAvKiByZWFkIHRoZSBsZW5ndGggaW50byByZWFkX2xlbiAqLwotICBpZiAoKHJldCA9Ci0gICAgICAgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnJlYWRfbGVuLCBlcnJvcikpIDwgMCkKLSAgewotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLQotICBpZiAocmVhZF9sZW4gPiAwKQotICB7Ci0gICAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBhcyBhbiBhcnJheSBvZiB1bnNpZ25lZCBjaGFyIGZvciBiaW5hcnkgZGF0YSAqLwotICAgICpsZW4gPSAoZ3VpbnQzMikgcmVhZF9sZW47Ci0gICAgKmJ1ZiA9IGdfbmV3IChndWNoYXIsICpsZW4pOwotICAgIGlmICgocmV0ID0KLSAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZiwgKmxlbiwgZXJyb3IpKSA8IDApCi0gICAgewotICAgICAgZ19mcmVlICgqYnVmKTsKLSAgICAgICpidWYgPSBOVUxMOwotICAgICAgKmxlbiA9IDA7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHhmZXIgKz0gcmV0OwotICB9IGVsc2UgewotICAgICpidWYgPSBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sICpwcm90b2NvbCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKLX0KLQotLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MgKmtsYXNzKQotewotICBUaHJpZnRQcm90b2NvbENsYXNzICpjbHMgPSBUSFJJRlRfUFJPVE9DT0xfQ0xBU1MgKGtsYXNzKTsKLQotICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47Ci0gIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kOwotICBjbHMtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luOwotICBjbHMtPndyaXRlX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luOwotICBjbHMtPndyaXRlX2ZpZWxkX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kOwotICBjbHMtPndyaXRlX2ZpZWxkX3N0b3AgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7Ci0gIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW47Ci0gIGNscy0+d3JpdGVfbWFwX2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZDsKLSAgY2xzLT53cml0ZV9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOwotICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZDsKLSAgY2xzLT53cml0ZV9zZXRfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbjsKLSAgY2xzLT53cml0ZV9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kOwotICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2Jvb2w7Ci0gIGNscy0+d3JpdGVfYnl0ZSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZTsKLSAgY2xzLT53cml0ZV9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNjsKLSAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMjsKLSAgY2xzLT53cml0ZV9pNjQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NDsKLSAgY2xzLT53cml0ZV9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKLSAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZzsKLSAgY2xzLT53cml0ZV9iaW5hcnkgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeTsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kOwotICBjbHMtPnJlYWRfc3RydWN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbjsKLSAgY2xzLT5yZWFkX3N0cnVjdF9lbmQgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKLSAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luOwotICBjbHMtPnJlYWRfZmllbGRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZDsKLSAgY2xzLT5yZWFkX21hcF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47Ci0gIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9lbmQ7Ci0gIGNscy0+cmVhZF9saXN0X2JlZ2luID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW47Ci0gIGNscy0+cmVhZF9saXN0X2VuZCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2VuZDsKLSAgY2xzLT5yZWFkX3NldF9iZWdpbiA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW47Ci0gIGNscy0+cmVhZF9zZXRfZW5kID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3NldF9lbmQ7Ci0gIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2w7Ci0gIGNscy0+cmVhZF9ieXRlID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGU7Ci0gIGNscy0+cmVhZF9pMTYgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2OwotICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMjsKLSAgY2xzLT5yZWFkX2k2NCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQ7Ci0gIGNscy0+cmVhZF9kb3VibGUgPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlOwotICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZzsKLSAgY2xzLT5yZWFkX2JpbmFyeSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyZDQ2OS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0gKLSNkZWZpbmUgX1RIUklGVF9CSU5BUllfUFJPVE9DT0xfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oCi0gKiAgXGJyaWVmIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBwcm90b2NvbC4gIEltcGxlbWVudHMgdGhlCi0gKiAgICAgICAgIFRocmlmdFByb3RvY29sIGludGVyZmFjZS4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCkpCi0jZGVmaW5lIFRIUklGVF9CSU5BUllfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIFRocmlmdEJpbmFyeVByb3RvY29sQ2xhc3MpKQotCi0vKiB2ZXJzaW9uIG51bWJlcnMgKi8KLSNkZWZpbmUgVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEgMHg4MDAxMDAwMAotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fTUFTSyAweGZmZmYwMDAwCi0KLS8qIQotICogVGhyaWZ0IEJpbmFyeSBQcm90b2NvbCBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbAotewotICBUaHJpZnRQcm90b2NvbCBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sIFRocmlmdEJpbmFyeVByb3RvY29sOwotCi0vKiEKLSAqIFRocmlmdCBCaW5hcnkgUHJvdG9jb2wgY2xhc3MuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcwotewotICBUaHJpZnRQcm90b2NvbENsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xDbGFzcyBUaHJpZnRCaW5hcnlQcm90b2NvbENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCAqLwotR1R5cGUgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzZiMzcuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgotCi1HX0RFRklORV9UWVBFKFRocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeSwgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZKQotCi1UaHJpZnRQcm90b2NvbCAqCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfZ2V0X3Byb3RvY29sIChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGZhY3RvcnkpOwotCi0gIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsIE5VTEwpOwotCi0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQotewotICBUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqcHJvdG9jb2xfZmFjdG9yeV9jbGFzcyA9IFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0NMQVNTIChjbHMpOwotCi0gIHByb3RvY29sX2ZhY3RvcnlfY2xhc3MtPmdldF9wcm90b2NvbCA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2w7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTQ4ZjkuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfSAotI2RlZmluZSBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KLQotR19CRUdJTl9ERUNMUwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnlDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19CSU5BUllfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQotCi1zdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeQotewotICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCaW5hcnlQcm90b2NvbEZhY3RvcnkgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5OwotCi1zdHJ1Y3QgX1RocmlmdEJpbmFyeVByb3RvY29sRmFjdG9yeUNsYXNzCi17Ci0gIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3MgVGhyaWZ0QmluYXJ5UHJvdG9jb2xGYWN0b3J5Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MX0ZBQ1RPUlkgKi8KLUdUeXBlIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyMmZlZi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIHN0cmluZyAqLwotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRVJST1JfRE9NQUlOICJ0aHJpZnQtcHJvdG9jb2wtZXJyb3ItcXVhcmsiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRQcm90b2NvbFByb3BlcnRpZXMKLXsKLSAgUFJPUF8wLAotICBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQKLX07Ci0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0UHJvdG9jb2wsIHRocmlmdF9wcm90b2NvbCwgR19UWVBFX09CSkVDVCkKLQotdm9pZAotdGhyaWZ0X3Byb3RvY29sX2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7Ci0KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6Ci0gICAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBwcm90b2NvbC0+dHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQKLXRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLQotICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKG9iamVjdCk7Ci0KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6Ci0gICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MzIgc2VxaWQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2JlZ2luCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvdG9jb2wsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBzZXFpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9tYXBfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9zZXRfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Jvb2xlYW4gdmFsdWUsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9ib29sIChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYnl0ZSAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfaTE2IChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF93cml0ZV9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2kzMiAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT53cml0ZV9pNjQgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPndyaXRlX2RvdWJsZSAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfc3RyaW5nIChwcm90b2NvbCwgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+d3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDMyICpzZXFpZCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMiAKLXRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7IAotfQotCi1naW50MzIgCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX21hcF9lbmQgKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyIAotdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9saXN0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfc2V0X2VuZCAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYm9vbCAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2J5dGUgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX2kxNiAocHJvdG9jb2wsIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9pMzIgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfaTY0IChwcm90b2NvbCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkb3VibGUgKnZhbHVlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHByb3RvY29sKS0+cmVhZF9kb3VibGUgKHByb3RvY29sLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAocHJvdG9jb2wpLT5yZWFkX3N0cmluZyAocHJvdG9jb2wsIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ3BvaW50ZXIgKmJ1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3NraXAgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSB0eXBlLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgc3dpdGNoICh0eXBlKQotICB7Ci0gICAgY2FzZSBUX0JPT0w6Ci0gICAgICB7Ci0gICAgICAgIGdib29sZWFuIGJvb2x2OwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsICZib29sdiwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9CWVRFOgotICAgICAgewotICAgICAgICBnaW50OCBieXRldjsKLSAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmYnl0ZXYsIGVycm9yKTsKLSAgICAgIH0KLQotICAgIGNhc2UgVF9JMTY6Ci0gICAgICB7Ci0gICAgICAgIGdpbnQxNiBpMTY7Ci0gICAgICAgIHJldHVybiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLCAmaTE2LCBlcnJvcik7Ci0gICAgICB9Ci0gICAgY2FzZSBUX0kzMjoKLSAgICAgIHsKLSAgICAgICAgZ2ludDMyIGkzMjsKLSAgICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZpMzIsIGVycm9yKTsKLSAgICAgIH0KLSAgICBjYXNlIFRfSTY0OgotICAgICAgewotICAgICAgICBnaW50NjQgaTY0OwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJmk2NCwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9ET1VCTEU6Ci0gICAgICB7Ci0gICAgICAgIGdkb3VibGUgZHViOwotICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwgJmR1YiwgZXJyb3IpOwotICAgICAgfQotICAgIGNhc2UgVF9TVFJJTkc6Ci0gICAgICB7Ci0gICAgICAgIGdwb2ludGVyIGRhdGE7Ci0gICAgICAgIGd1aW50MzIgbGVuOwotICAgICAgICBnaW50MzIgcmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmRhdGEsICZsZW4sIGVycm9yKTsKLSAgICAgICAgZ19mcmVlIChkYXRhKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgIH0KLSAgICBjYXNlIFRfU1RSVUNUOgotICAgICAgewotICAgICAgICBndWludDMyIHJlc3VsdCA9IDA7Ci0gICAgICAgIGdjaGFyICpuYW1lOwotICAgICAgICBnaW50MTYgZmlkOwotICAgICAgICBUaHJpZnRUeXBlIGZ0eXBlOwotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgJm5hbWUsIGVycm9yKTsKLQotICAgICAgICB3aGlsZSAoMSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCAmZnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcik7Ci0gICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKTsKLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVF9NQVA6Ci0gICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKLSAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7Ci0gICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKLSAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3NraXAgKHByb3RvY29sLCBlbGVtX3R5cGUsIGVycm9yKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2VuZCAocHJvdG9jb2wsIGVycm9yKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRfTElTVDoKLSAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOwotICAgICAgICBUaHJpZnRUeXBlIGVsZW1fdHlwZTsKLSAgICAgICAgZ3VpbnQzMiBpLCBzaXplOwotICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtX3R5cGUsICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZWxlbV90eXBlLCBlcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgZXJyb3IpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi0vKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gZm9yIFRocmlmdCBwcm90b2NvbHMgKi8KLUdRdWFyawotdGhyaWZ0X3Byb3RvY29sX2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ET01BSU4pOwotfQotCi0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sKQotewotICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXRocmlmdF9wcm90b2NvbF9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbENsYXNzICpjbHMpCi17Ci0gIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9wcm90b2NvbF9zZXRfcHJvcGVydHk7Ci0KLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVCwKLSAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAiVHJhbnNwb3J0IiwgIlRocmlmdCBUcmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0KLSAgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW47Ci0gIGNscy0+d3JpdGVfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQ7Ci0gIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbjsKLSAgY2xzLT53cml0ZV9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQ7Ci0gIGNscy0+d3JpdGVfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW47Ci0gIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZDsKLSAgY2xzLT53cml0ZV9maWVsZF9zdG9wID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX3N0b3A7Ci0gIGNscy0+d3JpdGVfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbjsKLSAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQ7Ci0gIGNscy0+d3JpdGVfbGlzdF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luOwotICBjbHMtPndyaXRlX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kOwotICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW47Ci0gIGNscy0+d3JpdGVfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kOwotICBjbHMtPndyaXRlX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYm9vbDsKLSAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2J5dGU7Ci0gIGNscy0+d3JpdGVfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNjsKLSAgY2xzLT53cml0ZV9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyOwotICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9pNjQ7Ci0gIGNscy0+d3JpdGVfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZTsKLSAgY2xzLT53cml0ZV9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nOwotICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnk7Ci0gIGNscy0+cmVhZF9tZXNzYWdlX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbjsKLSAgY2xzLT5yZWFkX21lc3NhZ2VfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQ7Ci0gIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfYmVnaW47Ci0gIGNscy0+cmVhZF9zdHJ1Y3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZDsKLSAgY2xzLT5yZWFkX2ZpZWxkX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW47Ci0gIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQ7Ci0gIGNscy0+cmVhZF9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW47Ci0gIGNscy0+cmVhZF9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2VuZDsKLSAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luOwotICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc2V0X2JlZ2luOwotICBjbHMtPnJlYWRfc2V0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQ7Ci0gIGNscy0+cmVhZF9ib29sID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbDsKLSAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9ieXRlOwotICBjbHMtPnJlYWRfaTE2ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2OwotICBjbHMtPnJlYWRfaTMyID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTMyOwotICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTY0OwotICBjbHMtPnJlYWRfZG91YmxlID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlOwotICBjbHMtPnJlYWRfc3RyaW5nID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nOwotICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5OwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGQ1NjJkLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9ICi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfcHJvdG9jb2wuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9ucy4KLSAqLwotCi0vKioKLSAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZXMgdGhhdCB0aGUgVGhyaWZ0IHByb3RvY29sIHN1cHBvcnRzLgotICogVGFrZSBzcGVjaWFsIG5vdGUgb2YgdGhlIFRfRU5EIHR5cGUgd2hpY2ggaXMgdXNlZCBzcGVjaWZpY2FsbHkgdG8gbWFyawotICogdGhlIGVuZCBvZiBhIHNlcXVlbmNlIG9mIGZpZWxkcy4KLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgVF9TVE9QICAgPSAwLAotICBUX1ZPSUQgICA9IDEsCi0gIFRfQk9PTCAgID0gMiwKLSAgVF9CWVRFICAgPSAzLAotICBUX0kwOCAgICA9IDMsCi0gIFRfSTE2ICAgID0gNiwKLSAgVF9JMzIgICAgPSA4LAotICBUX1U2NCAgICA9IDksCi0gIFRfSTY0ICAgID0gMTAsCi0gIFRfRE9VQkxFID0gNCwKLSAgVF9TVFJJTkcgPSAxMSwKLSAgVF9VVEY3ICAgPSAxMSwKLSAgVF9TVFJVQ1QgPSAxMiwKLSAgVF9NQVAgICAgPSAxMywKLSAgVF9TRVQgICAgPSAxNCwKLSAgVF9MSVNUICAgPSAxNSwKLSAgVF9VVEY4ICAgPSAxNiwKLSAgVF9VVEYxNiAgPSAxNwotfSBUaHJpZnRUeXBlOwotCi0vKioKLSAqIEVudW1lcmF0ZWQgZGVmaW5pdGlvbiBvZiB0aGUgbWVzc2FnZSB0eXBlcyB0aGF0IHRoZSBUaHJpZnQgcHJvdG9jb2wKLSAqIHN1cHBvcnRzLgotICovCi10eXBlZGVmIGVudW0gewotICBUX0NBTEwgICAgICA9IDEsCi0gIFRfUkVQTFkgICAgID0gMiwKLSAgVF9FWENFUFRJT04gPSAzLAotICBUX09ORVdBWSAgICA9IDQKLX0gVGhyaWZ0TWVzc2FnZVR5cGU7Ci0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MICh0aHJpZnRfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MLCBUaHJpZnRQcm90b2NvbCkpCi0jZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MKSkKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2xDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0wpKQotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCwgVGhyaWZ0UHJvdG9jb2xDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFByb3RvY29sIG9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFByb3RvY29sCi17Ci0gIEdPYmplY3QgcGFyZW50OwotCi0gIC8qIHByb3RlY3RlZCAqLwotICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2wgVGhyaWZ0UHJvdG9jb2w7Ci0KLS8qIQotICogVGhyaWZ0IFByb3RvY29sIGNsYXNzCi0gKi8KLXN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIGdpbnQzMiAoKndyaXRlX21lc3NhZ2VfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX21lc3NhZ2VfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX3N0cnVjdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfc3RydWN0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9maWVsZF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9maWVsZF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfZmllbGRfc3RvcCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9tYXBfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUga2V5X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX21hcF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfbGlzdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2xpc3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX3NldF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9zZXRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX2Jvb2wpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdib29sZWFuIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9ieXRlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfaTE2KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfaTMyKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfaTY0KSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGVfZG91YmxlKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKndyaXRlX3N0cmluZykgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCp3cml0ZV9iaW5hcnkpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKTsKLQotICBnaW50MzIgKCpyZWFkX21lc3NhZ2VfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sLCBnY2hhciAqKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9tZXNzYWdlX2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX3N0cnVjdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9zdHJ1Y3RfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfZmllbGRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmZpZWxkX3R5cGUsIGdpbnQxNiAqZmllbGRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfZmllbGRfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfbWFwX2JlZ2luKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlICprZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9tYXBfZW5kKSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfbGlzdF9iZWdpbikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgVGhyaWZ0VHlwZSAqZWxlbWVudF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfbGlzdF9lbmQpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9zZXRfYmVnaW4pIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdpbnQzMiAoKnJlYWRfc2V0X2VuZCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2Jvb2wpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdib29sZWFuICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2J5dGUpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ4ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2kxNikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2kzMikgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2k2NCkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDY0ICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX2RvdWJsZSkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2RvdWJsZSAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkX3N0cmluZykgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqcmVhZF9iaW5hcnkpIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqbGVuLCBHRXJyb3IgKiplcnJvcik7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sQ2xhc3MgVGhyaWZ0UHJvdG9jb2xDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9QUk9UT0NPTCAqLwotR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2dldF90eXBlICh2b2lkKTsKLQotLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLwotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCi0gICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQxNiBmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIHZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIHNpemUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9ib29sIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50OCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdkb3VibGUgdmFsdWUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqc3RyLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqdGhyaWZ0X3Byb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRNZXNzYWdlVHlwZSAqbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2ludDE2ICpmaWVsZF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX3NldF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnYm9vbGVhbiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfaTE2IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQxNiAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDMyICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotZ2ludDMyIHRocmlmdF9wcm90b2NvbF9yZWFkX2k2NCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50NjQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfZG91YmxlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZG91YmxlICp2YWx1ZSwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKnN0ciwgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciAqYnVmLCBndWludDMyICpsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci0KLWdpbnQzMiB0aHJpZnRfcHJvdG9jb2xfc2tpcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBUaHJpZnRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLQotLyogZGVmaW5lIGVycm9yIHR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX1VOS05PV04sCi0gIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9JTlZBTElEX0RBVEEsCi0gIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAotICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfU0laRV9MSU1JVCwKLSAgVEhSSUZUX1BST1RPQ09MX0VSUk9SX0JBRF9WRVJTSU9OLAotICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTk9UX0lNUExFTUVOVEVECi19IFRocmlmdFByb3RvY29sRXJyb3I7Ci0KLS8qIGRlZmluZSBhbiBlcnJvciBkb21haW4gZm9yIEdFcnJvciB0byB1c2UgKi8KLUdRdWFyayB0aHJpZnRfcHJvdG9jb2xfZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRVJST1IgKHRocmlmdF9wcm90b2NvbF9lcnJvcl9xdWFyayAoKSkKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjN2MxMi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRQcm90b2NvbEZhY3RvcnksIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LCBHX1RZUEVfT0JKRUNUKQotCi1UaHJpZnRQcm90b2NvbCAqCi10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChmYWN0b3J5KS0+Z2V0X3Byb3RvY29sIChmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQpOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnlfaW5pdCAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbEZhY3RvcnlDbGFzcyAqY2xzKQotewotICBjbHMtPmdldF9wcm90b2NvbCA9IHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzVlMzEuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKLSNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+Ci0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5LmgKLSAqICBcYnJpZWYgQWJzdHJhY3QgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBmYWN0b3J5IGltcGxlbWVudGF0aW9ucy4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZICh0aHJpZnRfcHJvdG9jb2xfZmFjdG9yeV9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9QUk9UT0NPTF9GQUNUT1JZLCBUaHJpZnRQcm90b2NvbEZhY3RvcnkpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfRkFDVE9SWShvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSkpCi0jZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5Q2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdCBQcm90b2NvbCBGYWN0b3J5IG9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeQotewotICBHT2JqZWN0IHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0UHJvdG9jb2xGYWN0b3J5IFRocmlmdFByb3RvY29sRmFjdG9yeTsKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgRmFjdG9yeSBjbGFzcwotICovCi1zdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzCi17Ci0gIEdPYmplY3RDbGFzcyBwYXJlbnQ7Ci0KLSAgVGhyaWZ0UHJvdG9jb2wgKigqZ2V0X3Byb3RvY29sKSAoVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzIFRocmlmdFByb3RvY29sRmFjdG9yeUNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlkgKi8KLUdUeXBlIHRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF90eXBlICh2b2lkKTsKLQotLyogdmlydHVhbCBwdWJsaWMgbWV0aG9kcyAqLwotVGhyaWZ0UHJvdG9jb2wgKnRocmlmdF9wcm90b2NvbF9mYWN0b3J5X2dldF9wcm90b2NvbChUaHJpZnRQcm90b2NvbEZhY3RvcnkgKmZhY3RvcnksIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfUFJPVE9DT0xfRkFDVE9SWV9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWY1YTAxLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlICJ0aHJpZnRfc2VydmVyLmgiCi0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRTZXJ2ZXJQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX1BST0NFU1NPUiwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQsCi0gIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9UUkFOU1BPUlRfRkFDVE9SWSwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCi0gIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWQotfTsKLQotR19ERUZJTkVfQUJTVFJBQ1RfVFlQRShUaHJpZnRTZXJ2ZXIsIHRocmlmdF9zZXJ2ZXIsIEdfVFlQRV9PQkpFQ1QpCi0KLXZvaWQKLXRocmlmdF9zZXJ2ZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRTZXJ2ZXIgKnNlcnZlciA9IFRIUklGVF9TRVJWRVIgKG9iamVjdCk7Ci0KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5wcm9jZXNzb3IpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9JTlBVVF9UUkFOU1BPUlRfRkFDVE9SWToKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZAotdGhyaWZ0X3NlcnZlcl9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRocmlmdFNlcnZlciAqc2VydmVyID0gVEhSSUZUX1NFUlZFUiAob2JqZWN0KTsKLQotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6Ci0gICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU0VSVkVSX1RSQU5TUE9SVDoKLSAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfUFJPVE9DT0xfRkFDVE9SWToKLSAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkCi10aHJpZnRfc2VydmVyX3NlcnZlIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKLXsKLSAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKHNlcnZlciktPnNlcnZlIChzZXJ2ZXIpOwotfQotCi12b2lkCi10aHJpZnRfc2VydmVyX3N0b3AgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoc2VydmVyKS0+c3RvcCAoc2VydmVyKTsKLX0KLQotLyogaW5zdGFuY2UgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdCBTZXJ2ZXIgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2VydmVyX2luaXQgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBzZXJ2ZXItPnByb2Nlc3NvciA9IE5VTEw7Ci0gIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7Ci0gIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBOVUxMOwotICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IE5VTEw7Ci0gIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IE5VTEw7Ci0gIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBOVUxMOwotfQotCi0vKiBjbGFzcyBpbml0aWFsaXplciBmb3IgVGhyaWZ0U2VydmVyCi0gKiBUT0RPOiBpbXBsZW1lbnQgU2VydmVyRXZlbnRIYW5kbGVyIGFzIGEgR0Nsb3N1cmUKLSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zZXJ2ZXJfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyQ2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc2V0X3Byb3BlcnR5OwotCi0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInByb2Nlc3NvciIsICJQcm9jZXNzb3IiLCAiVGhyaWZ0IFByb2Nlc3NvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9QUk9DRVNTT1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgIFBST1BfVEhSSUZUX1NFUlZFUl9TRVJWRVJfVFJBTlNQT1JULAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoInNlcnZlcl90cmFuc3BvcnQiLCAiU2VydmVyIFRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhyaWZ0IFNlcnZlciBUcmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoImlucHV0X3RyYW5zcG9ydF9mYWN0b3J5IiwgIklucHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIElucHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1RSQU5TUE9SVF9GQUNUT1JZLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoIm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0cHV0IFRyYW5zcG9ydCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIE91dHB1dCBUcmFuc3BvcnQgRmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlksCi0gICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0ICgiaW5wdXRfcHJvdG9jb2xfZmFjdG9yeSIsICJJbnB1dCBQcm90b2NvbCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIElucHV0IFByb3RvY29sIEZhY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfUFJPVE9DT0xfRkFDVE9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSkpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgUFJPUF9USFJJRlRfU0VSVkVSX09VVFBVVF9QUk9UT0NPTF9GQUNUT1JZLAotICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCAoIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIk91dHB1dCBQcm90b2NvbCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgU2VydmVyIE91dHB1dCBQcm90b2NvbCBGYWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1BST1RPQ09MX0ZBQ1RPUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSB8IEdfUEFSQU1fQ09OU1RSVUNUX09OTFkpKTsKLQotICAvKiBzZXQgdGhlc2UgYXMgdmlydHVhbCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MgKi8KLSAgY2xzLT5zZXJ2ZSA9IHRocmlmdF9zZXJ2ZXJfc2VydmU7Ci0gIGNscy0+c3RvcCA9IHRocmlmdF9zZXJ2ZXJfc3RvcDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3NlcnZlci90aHJpZnRfc2VydmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTFhMjAuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3NlcnZlci90aHJpZnRfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfSAotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9ICi0KLSNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+Ci0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF9zZXJ2ZXIuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlcnMuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfU0VSVkVSICh0aHJpZnRfc2VydmVyX2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXIpKQotI2RlZmluZSBUSFJJRlRfSVNfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU0VSVkVSLCBUaHJpZnRTZXJ2ZXJDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1NFUlZFUikpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVIsIFRocmlmdFNlcnZlckNsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgU2VydmVyIG9iamVjdAotICovCi1zdHJ1Y3QgX1RocmlmdFNlcnZlcgotewotICBHT2JqZWN0IHBhcmVudDsKLQotICAvKiBwcm90ZWN0ZWQgKi8KLSAgVGhyaWZ0UHJvY2Vzc29yICpwcm9jZXNzb3I7Ci0gIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKLSAgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeSAqaW5wdXRfdHJhbnNwb3J0X2ZhY3Rvcnk7Ci0gIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeTsKLSAgVGhyaWZ0UHJvdG9jb2xGYWN0b3J5ICppbnB1dF9wcm90b2NvbF9mYWN0b3J5OwotICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKm91dHB1dF9wcm90b2NvbF9mYWN0b3J5OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXIgVGhyaWZ0U2VydmVyOwotCi0vKiEKLSAqIFRocmlmdCBTZXJ2ZXIgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXJDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICB2b2lkICgqc2VydmUpIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7Ci0gIHZvaWQgKCpzdG9wKSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJDbGFzcyBUaHJpZnRTZXJ2ZXJDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVIgKi8KLUdUeXBlIHRocmlmdF9zZXJ2ZXJfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiEKLSAqIFByb2Nlc3NlcyB0aGUgcmVxdWVzdC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFNlcnZlckNsYXNzCi0gKi8KLXZvaWQgdGhyaWZ0X3NlcnZlcl9zZXJ2ZSAoVGhyaWZ0U2VydmVyICpzZXJ2ZXIpOwotCi0vKiEKLSAqIFN0b3AgaGFuZGxpbmcgcmVxdWVzdHMuCi0gKi8KLXZvaWQgdGhyaWZ0X3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcik7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX1NFUlZFUl9IICovCi0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5YTU4ZC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgotCi1HX0RFRklORV9UWVBFKFRocmlmdFNpbXBsZVNlcnZlciwgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIsIFRIUklGVF9UWVBFX1NFUlZFUikKLQotdm9pZAotdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc2VydmUgKFRocmlmdFNlcnZlciAqc2VydmVyKQotewotICBnX3JldHVybl9pZl9mYWlsIChUSFJJRlRfSVNfU0lNUExFX1NFUlZFUiAoc2VydmVyKSk7Ci0KLSAgVGhyaWZ0VHJhbnNwb3J0ICp0ID0gTlVMTDsKLSAgVGhyaWZ0VHJhbnNwb3J0ICppbnB1dF90cmFuc3BvcnQgPSBOVUxMLCAqb3V0cHV0X3RyYW5zcG9ydCA9IE5VTEw7Ci0gIFRocmlmdFByb3RvY29sICppbnB1dF9wcm90b2NvbCA9IE5VTEwsICpvdXRwdXRfcHJvdG9jb2wgPSBOVUxMOwotICBUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcyA9IFRIUklGVF9TSU1QTEVfU0VSVkVSKHNlcnZlcik7Ci0KLSAgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTIChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQpCi0gICAgICAtPmxpc3RlbiAoc2VydmVyLT5zZXJ2ZXJfdHJhbnNwb3J0LCBOVUxMKTsKLQotICB0c3MtPnJ1bm5pbmcgPSBUUlVFOwotICB3aGlsZSAodHNzLT5ydW5uaW5nID09IFRSVUUpCi0gIHsKLSAgICB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQsIE5VTEwpOwotICAgIGlucHV0X3RyYW5zcG9ydCA9Ci0gICAgICAgIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9HRVRfQ0xBU1MgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkpCi0gICAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnksIHQpOwotICAgIG91dHB1dF90cmFuc3BvcnQgPSAKLSAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkpCi0gICAgICAgICAgICAtPmdldF90cmFuc3BvcnQgKHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5LCB0KTsKLSAgICBpbnB1dF9wcm90b2NvbCA9Ci0gICAgICAgIFRIUklGVF9QUk9UT0NPTF9GQUNUT1JZX0dFVF9DTEFTUyAoc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5KQotICAgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSwgdCk7Ci0gICAgb3V0cHV0X3Byb3RvY29sID0KLSAgICAgICAgVEhSSUZUX1BST1RPQ09MX0ZBQ1RPUllfR0VUX0NMQVNTIChzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KQotICAgICAgICAgICAgLT5nZXRfcHJvdG9jb2wgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnksIHQpOwotCi0gICAgd2hpbGUgKFRIUklGVF9QUk9DRVNTT1JfR0VUX0NMQVNTIChzZXJ2ZXItPnByb2Nlc3NvcikKLSAgICAgICAgICAgICAgIC0+cHJvY2VzcyAoc2VydmVyLT5wcm9jZXNzb3IsIGlucHV0X3Byb3RvY29sLCBvdXRwdXRfcHJvdG9jb2wpKQotICAgIHsKLSAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0cmFuc3BvcnQgcGVlayAoKQotICAgIH0KLQotICAgIC8vIFRPRE86IGhhbmRsZSBleGNlcHRpb25zCi0gICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKGlucHV0X3RyYW5zcG9ydCktPmNsb3NlIChpbnB1dF90cmFuc3BvcnQsIE5VTEwpOwotICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTIChvdXRwdXRfdHJhbnNwb3J0KS0+Y2xvc2UgKG91dHB1dF90cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIH0gCi0KLSAgLy8gYXR0ZW1wdCB0byBzaHV0ZG93bgotICBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCkKLSAgICAgIC0+Y2xvc2UgKHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCwgTlVMTCk7IAotfQotCi12b2lkCi10aHJpZnRfc2ltcGxlX3NlcnZlcl9zdG9wIChUaHJpZnRTZXJ2ZXIgKnNlcnZlcikKLXsKLSAgZ19yZXR1cm5faWZfZmFpbCAoVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpOwotICAoVEhSSUZUX1NJTVBMRV9TRVJWRVIgKHNlcnZlcikpLT5ydW5uaW5nID0gRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfc2ltcGxlX3NlcnZlcl9pbml0IChUaHJpZnRTaW1wbGVTZXJ2ZXIgKnRzcykKLXsKLSAgdHNzLT5ydW5uaW5nID0gRkFMU0U7Ci0KLSAgVGhyaWZ0U2VydmVyICpzZXJ2ZXIgPSBUSFJJRlRfU0VSVkVSKHRzcyk7Ci0KLSAgaWYgKHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+aW5wdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPQotICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZLCBOVUxMKTsKLSAgfQotICBpZiAoc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0KLSAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgTlVMTCk7Ci0gIH0KLSAgaWYgKHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9PSBOVUxMKQotICB7Ci0gICAgc2VydmVyLT5pbnB1dF9wcm90b2NvbF9mYWN0b3J5ID0KLSAgICAgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwgTlVMTCk7Ci0gIH0KLSAgaWYgKHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPT0gTlVMTCkKLSAgewotICAgIHNlcnZlci0+b3V0cHV0X3Byb3RvY29sX2ZhY3RvcnkgPQotICAgICAgICBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTF9GQUNUT1JZLCBOVUxMKTsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zaW1wbGVfc2VydmVyX2NsYXNzX2luaXQgKFRocmlmdFNpbXBsZVNlcnZlckNsYXNzICpjbGFzcykKLXsKLSAgVGhyaWZ0U2VydmVyQ2xhc3MgKmNscyA9IFRIUklGVF9TRVJWRVJfQ0xBU1MoY2xhc3MpOwotCi0gIGNscy0+c2VydmUgPSB0aHJpZnRfc2ltcGxlX3NlcnZlcl9zZXJ2ZTsKLSAgY2xzLT5zdG9wID0gdGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfc3RvcDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0Nzk4Mi4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKLSNkZWZpbmUgX1RIUklGVF9TSU1QTEVfU0VSVkVSX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL3RocmlmdF9zZXJ2ZXIuaD4KLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaAotICogIFxicmllZiBBIHNpbXBsZSBUaHJpZnQgc2VydmVyLCBzaW5nbGUtdGhyZWFkZWQuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiAodGhyaWZ0X3NpbXBsZV9zZXJ2ZXJfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NJTVBMRV9TRVJWRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TSU1QTEVfU0VSVkVSKSkKLSNkZWZpbmUgVEhSSUZUX1NJTVBMRV9TRVJWRVJfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYykgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfU0lNUExFX1NFUlZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUikpCi0jZGVmaW5lIFRIUklGVF9TSU1QTEVfU0VSVkVSX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwgVGhyaWZ0U2ltcGxlU2VydmVyQ2xhc3MpKQotCi0vKioKLSAqIFRocmlmdCBTaW1wbGUgU2VydmVyIGluc3RhbmNlLgotICovCi1zdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlcgotewotICBUaHJpZnRTZXJ2ZXIgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLSAgdm9sYXRpbGUgZ2Jvb2xlYW4gcnVubmluZzsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2ltcGxlU2VydmVyIFRocmlmdFNpbXBsZVNlcnZlcjsKLQotLyoqCi0gKiBUaHJpZnQgU2ltcGxlIFNlcnZlciBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRTaW1wbGVTZXJ2ZXJDbGFzcwotewotICBUaHJpZnRTZXJ2ZXJDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNpbXBsZVNlcnZlckNsYXNzIFRocmlmdFNpbXBsZVNlcnZlckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NJTVBMRV9TRVJWRVIgKi8KLUdUeXBlIHRocmlmdF9zaW1wbGVfc2VydmVyX2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmIC8qIF9USFJJRlRfU0lNUExFX1NFUlZFUl9IICovCi0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90aHJpZnQuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90aHJpZnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjYWRkNC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvdGhyaWZ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+Ci0KLS8qKgotICogR0hhc2hUYWJsZSBjYWxsYmFjayB0byBhZGQga2V5cyB0byBhIEdMaXN0LgotICovCi12b2lkCi10aHJpZnRfaGFzaF90YWJsZV9nZXRfa2V5cyAoZ3BvaW50ZXIga2V5LCBncG9pbnRlciB2YWx1ZSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAodmFsdWUpOwotICBHTGlzdCAqKmxpc3QgPSAoR0xpc3QgKiopIHVzZXJfZGF0YTsKLSAgKmxpc3QgPSBnX2xpc3RfYXBwZW5kICgqbGlzdCwga2V5KTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjM2YTJmLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90aHJpZnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0gKLSNkZWZpbmUgX1RIUklGVF9ICi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGdsaWIuaD4KLQotLyogdGhpcyBtYWNybyBpcyBjYWxsZWQgdG8gc2F0aXNmeSAtV2FsbCBoYXJkY29yZSBjb21waWxhdGlvbiAqLwotI2lmbmRlZiBUSFJJRlRfVU5VU0VEX1ZBUgotIyBkZWZpbmUgVEhSSUZUX1VOVVNFRF9WQVIoeCkgKCh2b2lkKSB4KQotI2VuZGlmCi0KLXZvaWQgdGhyaWZ0X2hhc2hfdGFibGVfZ2V0X2tleXMgKGdwb2ludGVyIGtleSwgZ3BvaW50ZXIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciB1c2VyX2RhdGEpOwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RIUklGVF9ICmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwYTk1ZS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCIKLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+Ci0KLUdfREVGSU5FX1RZUEUoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24sIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24sIFRIUklGVF9UWVBFX1NUUlVDVCkKLQotZ2ludDMyCi10aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQgKFRocmlmdFN0cnVjdCAqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0gIGdjaGFyICpuYW1lOwotICBUaHJpZnRUeXBlIGZ0eXBlOwotICBnaW50MTYgZmlkOwotICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqdGhpcyA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04gKG9iamVjdCk7Ci0KLSAgLyogcmVhZCB0aGUgc3RydWN0IGJlZ2luIG1hcmtlciAqLwotICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZuYW1lLCBlcnJvcikpIDwgMCkKLSAgewotICAgIGlmIChuYW1lKSBnX2ZyZWUgKG5hbWUpOwotICAgIHJldHVybiAtMTsKLSAgfQotICB4ZmVyICs9IHJldDsKLSAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7Ci0KLSAgd2hpbGUgKDEpCi0gIHsKLSAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJm5hbWUsICZmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlkLCBlcnJvcikpIDwgMCkKLSAgICB7Ci0gICAgICBpZiAobmFtZSkgZ19mcmVlIChuYW1lKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgeGZlciArPSByZXQ7Ci0gICAgaWYgKG5hbWUpIGdfZnJlZSAobmFtZSk7Ci0KLSAgICAvKiBicmVhayBpZiB3ZSBnZXQgYSBTVE9QIGZpZWxkICovCi0gICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGZpZCkKLSAgICB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmIChmdHlwZSA9PSBUX1NUUklORykKLSAgICAgICAgewotICAgICAgICAgIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnRoaXMtPm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICAgIHRoaXMtPl9faXNzZXRfbWVzc2FnZSA9IFRSVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB4ZmVyICs9IHJldDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZ0eXBlID09IFRfSTMyKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdGhpcy0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgeGZlciArPSByZXQ7Ci0gICAgICAgICAgdGhpcy0+X19pc3NldF90eXBlID0gVFJVRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoKHJldCA9IHRocmlmdF9wcm90b2NvbF9za2lwIChwcm90b2NvbCwgZnR5cGUsIGVycm9yKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfc2tpcCAocHJvdG9jb2wsIGZ0eXBlLCBlcnJvcikpIDwgMCkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHhmZXIgKz0gcmV0OwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKLSAgICAgIHJldHVybiAtMTsKLSAgICB4ZmVyICs9IHJldDsKLSAgfQotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgeGZlciArPSByZXQ7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLWdpbnQzMgotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQotewotICBnaW50MzIgcmV0OwotICBnaW50MzIgeGZlciA9IDA7Ci0KLSAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnRoaXMgPSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpOwotCi0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAibWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX1NUUklORywgMSwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgdGhpcy0+bWVzc2FnZSwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0kzMiwgMiwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgdGhpcy0+dHlwZSwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgZXJyb3IpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICB4ZmVyICs9IHJldDsKLSAgaWYgKChyZXQgPSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIGVycm9yKSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgeGZlciArPSByZXQ7Ci0gIGlmICgocmV0ID0gdGhyaWZ0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBlcnJvcikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHhmZXIgKz0gcmV0OwotCi0gIHJldHVybiB4ZmVyOwotfQotCi0KLS8qIEdFcnJvciBkb21haW4gKi8KLSNkZWZpbmUgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9ET01BSU4gInRocmlmdC1hcHBsaWNhdGlvbi1leGNlcHRpb24tZXJyb3ItcXVhcmsiCi0KLUdRdWFyawotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9lcnJvcl9xdWFyayAodm9pZCkKLXsKLSAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0RPTUFJTik7Ci19Ci0KLXZvaWQKLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25faW5pdCAoVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKm9iamVjdCkKLXsKLSAgb2JqZWN0LT50eXBlID0gMDsKLSAgb2JqZWN0LT5fX2lzc2V0X3R5cGUgPSBGQUxTRTsKLSAgb2JqZWN0LT5tZXNzYWdlID0gTlVMTDsKLSAgb2JqZWN0LT5fX2lzc2V0X21lc3NhZ2UgPSBGQUxTRTsKLX0KLQotdm9pZAotdGhyaWZ0X2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9jbGFzc19pbml0IChUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzICpjbGFzcykKLXsKLSAgVGhyaWZ0U3RydWN0Q2xhc3MgKmNscyA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xhc3MpOwotICBjbHMtPnJlYWQgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3JlYWQ7Ci0gIGNscy0+d3JpdGUgPSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX3dyaXRlOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWE4YzAuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9ICi0jZGVmaW5lIF9USFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0jaW5jbHVkZSAidGhyaWZ0X3N0cnVjdC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmgKLSAqICBcYnJpZWYgQyBJbXBsZW1lbnRhdGlvbiBvZiBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04gKHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT04ob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0FQUExJQ0FUSU9OX0VYQ0VQVElPTihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikpCi0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb25DbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19BUFBMSUNBVElPTl9FWENFUFRJT05fQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX0FQUExJQ0FUSU9OX0VYQ0VQVElPTikpCi0jZGVmaW5lIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MpKQotCi1zdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uCi17Ci0gIFRocmlmdFN0cnVjdCBwYXJlbnQ7Ci0KLSAgLyogcHVibGljICovCi0gIGdpbnQzMiB0eXBlOwotICBnYm9vbGVhbiBfX2lzc2V0X3R5cGU7Ci0gIGdjaGFyICptZXNzYWdlOwotICBnYm9vbGVhbiBfX2lzc2V0X21lc3NhZ2U7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotCi1zdHJ1Y3QgX1RocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3MKLXsKLSAgVGhyaWZ0U3RydWN0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbkNsYXNzIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uQ2xhc3M7Ci0KLUdUeXBlIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiBnZXJyb3IgY29kZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04sCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5WQUxJRF9NRVNTQUdFX1RZUEUsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfV1JPTkdfTUVUSE9EX05BTUUsCi0gIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfQkFEX1NFUVVFTkNFX0lELAotICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX01JU1NJTkdfUkVTVUxULAotICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVEVSTkFMX0VSUk9SLAotICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1BST1RPQ09MX0VSUk9SCi19IFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uRXJyb3I7Ci0KLS8qIGRlZmluZSBlcnJvciBkb21haW4gZm9yIEdFcnJvciAqLwotR1F1YXJrIHRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb25fZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SICh0aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2Vycm9yX3F1YXJrICgpKQotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdF9zdHJ1Y3QuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90aHJpZnRfc3RydWN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzM2Q2MjIuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdF9zdHJ1Y3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlICJ0aHJpZnRfc3RydWN0LmgiCi0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U3RydWN0LCB0aHJpZnRfc3RydWN0LCBHX1RZUEVfT0JKRUNUKQotCi1naW50MzIKLXRocmlmdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfU1RSVUNUIChvYmplY3QpLCAtMSk7Ci0gIHJldHVybiBUSFJJRlRfU1RSVUNUX0dFVF9DTEFTUyAob2JqZWN0KS0+cmVhZCAob2JqZWN0LCBwcm90b2NvbCwgZXJyb3IpOwotfQotCi1naW50MzIKLXRocmlmdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKLXsKLSAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVFJVQ1QgKG9iamVjdCksIC0xKTsKLSAgcmV0dXJuIFRIUklGVF9TVFJVQ1RfR0VUX0NMQVNTIChvYmplY3QpLT53cml0ZSAob2JqZWN0LCBwcm90b2NvbCwgZXJyb3IpOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3N0cnVjdF9jbGFzc19pbml0IChUaHJpZnRTdHJ1Y3RDbGFzcyAqY2xzKQotewotICBjbHMtPnJlYWQgPSB0aHJpZnRfc3RydWN0X3JlYWQ7Ci0gIGNscy0+d3JpdGUgPSB0aHJpZnRfc3RydWN0X3dyaXRlOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3N0cnVjdF9pbml0IChUaHJpZnRTdHJ1Y3QgKnN0cnVjdHVyZSkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHN0cnVjdHVyZSk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvdGhyaWZ0X3N0cnVjdC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RocmlmdF9zdHJ1Y3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0MmMwNS4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvdGhyaWZ0X3N0cnVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIFRIUklGVF9TVFJVQ1RfSAotI2RlZmluZSBUSFJJRlRfU1RSVUNUX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+Ci0KLUdfQkVHSU5fREVDTFMKLQotI2RlZmluZSBUSFJJRlRfVFlQRV9TVFJVQ1QgKHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TVFJVQ1Qob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TVFJVQ1QsIFRocmlmdFN0cnVjdCkpCi0jZGVmaW5lIFRIUklGVF9TVFJVQ1RfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfU1RSVUNUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NUUlVDVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1RSVUNUKSkKLSNkZWZpbmUgVEhSSUZUX1NUUlVDVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUUlVDVCwgVGhyaWZ0U3RydWN0Q2xhc3MpKQotCi0vKiBzdHJ1Y3QgKi8KLXN0cnVjdCBfVGhyaWZ0U3RydWN0Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0IFRocmlmdFN0cnVjdDsKLQotc3RydWN0IF9UaHJpZnRTdHJ1Y3RDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHB1YmxpYyAqLwotICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLSAgZ2ludDMyICgqd3JpdGUpIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RydWN0Q2xhc3MgVGhyaWZ0U3RydWN0Q2xhc3M7Ci0KLUdUeXBlIHRocmlmdF9zdHJ1Y3RfZ2V0X3R5cGUgKHZvaWQpOwotCi1naW50MzIgdGhyaWZ0X3N0cnVjdF9yZWFkIChUaHJpZnRTdHJ1Y3QgKm9iamVjdCwgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1naW50MzIgdGhyaWZ0X3N0cnVjdF93cml0ZSAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7Ci1HX0VORF9ERUNMUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDdjMjEuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oPgotCi0vKiBvYmplY3QgcHJvcGVydGllcyAqLwotZW51bSBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1RSQU5TUE9SVCwKLSAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCi0gIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQotfTsKLQotR19ERUZJTkVfVFlQRShUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCwgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5pc19vcGVuICh0LT50cmFuc3BvcnQpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+b3BlbiAodC0+dHJhbnNwb3J0LCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmNsb3NlICh0LT50cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogdGhlIGFjdHVhbCByZWFkIGlzICJzbG93IiBiZWNhdXNlIGl0IGNhbGxzIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCAqLwotZ2ludDMyCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ3VpbnQzMiB3YW50ID0gbGVuOwotICBndWludDMyIGdvdCA9IDA7Ci0gIGd1Y2hhciB0bXBkYXRhW3QtPnJfYnVmX3NpemVdOwotICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOwotCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7Ci0KLSAgLy8gZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlci4KLSAgaWYgKGhhdmUgPiAwKQotICB7Ci0gICAgbWVtY3B5IChidWYsIHQtPnJfYnVmLCB0LT5yX2J1Zi0+bGVuKTsKLSAgICB3YW50IC09IHQtPnJfYnVmLT5sZW47Ci0gICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgdC0+cl9idWYtPmxlbik7Ci0gIH0KLQotICAvLyBpZiB0aGUgYnVmZmVyIGlzIHN0aWxsIHNtYWxsZXIgdGhhbiB3aGF0IHdlIHdhbnQgdG8gcmVhZCwgdGhlbiBqdXN0Ci0gIC8vIHJlYWQgaXQgZGlyZWN0bHkuICBvdGhlcndpc2UsIGZpbGwgdGhlIGJ1ZmZlciBhbmQgdGhlbiBnaXZlIG91dAotICAvLyBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgcmVhZC4KLSAgaWYgKHQtPnJfYnVmX3NpemUgPCB3YW50KQotICB7Ci0gICAgZ290ICs9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICAgIC8vIGNvcHkgdGhlIGRhdGEgc3RhcnRpbmcgZnJvbSB3aGVyZSB3ZSBsZWZ0IG9mZgotICAgIG1lbWNweSAoYnVmICsgaGF2ZSwgdG1wZGF0YSwgZ290KTsKLSAgICByZXR1cm4gZ290ICsgaGF2ZTsgCi0gIH0gZWxzZSB7Ci0gICAgZ290ICs9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5yZWFkICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+cl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPnJfYnVmLCB0bXBkYXRhLCBnb3QpOwotICAgIAotICAgIC8vIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzCi0gICAgZ3VpbnQzMiBnaXZlID0gd2FudCA8IHQtPnJfYnVmLT5sZW4gPyB3YW50IDogdC0+cl9idWYtPmxlbjsKLQotCi0gICAgbWVtY3B5IChidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7Ci0gICAgdC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgZ2l2ZSk7Ci0gICAgd2FudCAtPSBnaXZlOwotCi0gICAgcmV0dXJuIChsZW4gLSB3YW50KTsKLSAgfQotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLwotZ2ludDMyCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotCi0gIC8qIGlmIHdlIGhhdmUgZW5vdWdoIGJ1ZmZlciBkYXRhIHRvIGZ1bGZpbGwgdGhlIHJlYWQsIGp1c3QgdXNlCi0gICAqIGEgbWVtY3B5ICovCi0gIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKLSAgewotICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKLSAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIGd1aW50MzIgaGF2ZV9ieXRlcyA9IHQtPndfYnVmLT5sZW47Ci0gIGd1aW50MzIgc3BhY2UgPSB0LT53X2J1Zl9zaXplIC0gdC0+d19idWYtPmxlbjsKLQotICAvLyB3ZSBuZWVkIHR3byBzeXNjYWxscyBiZWNhdXNlIHRoZSBidWZmZXJlZCBkYXRhIHBsdXMgdGhlIGJ1ZmZlciBpdHNlbGYKLSAgLy8gaXMgdG9vIGJpZy4KLSAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIqdC0+d19idWYtPmxlbikgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpCi0gIHsKLSAgICBpZiAoaGF2ZV9ieXRlcyA+IDApCi0gICAgewotICAgICAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gICAgfQotICAgIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT53cml0ZSAodC0+dHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBsZW4sIGVycm9yKTsKLSAgICBpZiAodC0+d19idWYtPmxlbiA+IDApCi0gICAgewotICAgICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci0gIH0KLQotICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9hcHBlbmQgKHQtPndfYnVmLCBidWYsIHNwYWNlKTsKLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT53X2J1ZiwgMCwgdC0+d19idWYtPmxlbik7Ci0gIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X2FwcGVuZCAodC0+d19idWYsIGJ1ZitzcGFjZSwgbGVuLXNwYWNlKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCi1nYm9vbGVhbgotdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLwotICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQotICB7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotICAgIHJldHVybiBsZW47Ci0gIH0KLQotICByZXR1cm4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9zbG93ICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQKLSAqIGNhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlLiAgbm90aGluZyB0byBkbyBvbiBvdXIgZW5kLiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KLWdib29sZWFuCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICBpZiAodC0+d19idWYgIT0gTlVMTCAmJiB0LT53X2J1Zi0+bGVuID4gMCkKLSAgewotICAgIC8vIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQKLSAgICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+d3JpdGUgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPndfYnVmLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+d19idWYtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICB0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPndfYnVmLCAwLCB0LT53X2J1Zi0+bGVuKTsKLSAgfQotICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBOVUxMOwotICB0cmFuc3BvcnQtPnJfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKLSAgdHJhbnNwb3J0LT53X2J1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Ci19Ci0KLS8qIGRlc3RydWN0b3IgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCi17Ci0gIFRocmlmdEJ1ZmZlcmVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUIChvYmplY3QpOwotCi0gIGlmICh0cmFuc3BvcnQtPnJfYnVmICE9IE5VTEwpCi0gIHsKLSAgICBnX2J5dGVfYXJyYXlfZnJlZSAodHJhbnNwb3J0LT5yX2J1ZiwgVFJVRSk7Ci0gIH0KLSAgdHJhbnNwb3J0LT5yX2J1ZiA9IE5VTEw7Ci0KLSAgaWYgKHRyYW5zcG9ydC0+d19idWYgIT0gTlVMTCkKLSAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPndfYnVmLCBUUlVFKTsKLSAgfQotICB0cmFuc3BvcnQtPndfYnVmID0gTlVMTDsKLX0KLQotLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KLXZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgotICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0ICh2YWx1ZSwgdHJhbnNwb3J0LT50cmFuc3BvcnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRToKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCB0cmFuc3BvcnQtPnJfYnVmX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAocHNwZWMpOwotICBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfVFJBTlNQT1JUOgotICAgICAgdHJhbnNwb3J0LT50cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRToKLSAgICAgIHRyYW5zcG9ydC0+d19idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9zZXRfcHJvcGVydHk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19vYmplY3QgKCJ0cmFuc3BvcnQiLCAidHJhbnNwb3J0IChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaHJpZnQgdHJhbnNwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9UWVBFX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFIHwgR19QQVJBTV9DT05TVFJVQ1RfT05MWSk7Ci0gIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1BfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoIndfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgd3JpdGUgYnVmZmVyIHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0KLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKnR0YyA9IFRIUklGVF9UUkFOU1BPUlRfQ0xBU1MgKGNscyk7Ci0KLSAgZ29iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZpbmFsaXplOwotICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW47Ci0gIHR0Yy0+b3BlbiA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbjsKLSAgdHRjLT5jbG9zZSA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2U7Ci0gIHR0Yy0+cmVhZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZDsKLSAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZF9lbmQ7Ci0gIHR0Yy0+d3JpdGUgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlOwotICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kOwotICB0dGMtPmZsdXNoID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaDsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODJjZWEuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9CVUZGRVJFRF9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9ICi0KLSNpbmNsdWRlIDxnbGliLmg+Ci0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmgKLSAqICBcYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgYnVmZmVyZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcwotICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQpKQotI2RlZmluZSBUSFJJRlRfSVNfQlVGRkVSRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX0JVRkZFUkVEX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JUKQotI2RlZmluZSBUSFJJRlRfQlVGRkVSRURfVFJBTlNQT1JUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCAgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnQKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcm90ZWN0ZWQgKi8KLSAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0KLSAgLyogcHJpdmF0ZSAqLwotICBHQnl0ZUFycmF5ICpyX2J1ZjsKLSAgR0J5dGVBcnJheSAqd19idWY7Ci0gIGd1aW50MzIgcl9idWZfc2l6ZTsKLSAgZ3VpbnQzMiB3X2J1Zl9zaXplOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydDsKLQotLyohCi0gKiBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydCBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzCi17Ci0gIFRocmlmdFRyYW5zcG9ydENsYXNzIHBhcmVudDsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0QnVmZmVyZWRUcmFuc3BvcnRDbGFzcyBUaHJpZnRCdWZmZXJlZFRyYW5zcG9ydENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCAqLwotR1R5cGUgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDRjMmViLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lmg+Ci0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfUkVBRF9CVUZGRVJfU0laRSwKLSAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRQotfTsKLQotR19ERUZJTkVfVFlQRShUaHJpZnRGcmFtZWRUcmFuc3BvcnQsIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0LCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQpCi0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPmlzX29wZW4gKHQtPnRyYW5zcG9ydCk7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0LT50cmFuc3BvcnQpLT5vcGVuICh0LT50cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Y2xvc2UgKHQtPnRyYW5zcG9ydCwgZXJyb3IpOwotfQotCi0vKiByZWFkcyBhIGZyYW1lIGFuZCBwdXRzIGl0IGludG8gdGhlIGJ1ZmZlciAqLwotZ2Jvb2xlYW4KLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdCA9IFRIUklGVF9GUkFNRURfVFJBTlNQT1JUICh0cmFuc3BvcnQpOwotICBnaW50MzIgc3osIGJ5dGVzOwotCi0gIC8qIHJlYWQgdGhlIHNpemUgKi8KLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWludDMyICopICZzeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3opLCBlcnJvcik7Ci0gIHN6ID0gbnRvaGwgKHN6KTsKLQotICAvKiBjcmVhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSBhbmQgcmVhZCB0aGF0IG11Y2ggZGF0YSAqLwotICBndWNoYXIgdG1wZGF0YVtzel07Ci0gIGJ5dGVzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPnJlYWQgKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICAvKiBhZGQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciAqLwotICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5yX2J1ZiwgdG1wZGF0YSwgYnl0ZXMpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiB0aGUgYWN0dWFsIHJlYWQgaXMgInNsb3ciIGJlY2F1c2UgaXQgY2FsbHMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0ICovCi1naW50MzIKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ3VpbnQzMiB3YW50ID0gbGVuOwotICBndWludDMyIGhhdmUgPSB0LT5yX2J1Zi0+bGVuOwotCi0gIC8vIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQKLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7Ci0KLSAgLy8gZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdAotICBpZiAoaGF2ZSA+IDApCi0gIHsKLSAgICBtZW1jcHkgKGJ1ZiwgdC0+cl9idWYsIHQtPnJfYnVmLT5sZW4pOwotICAgIHdhbnQgLT0gdC0+cl9idWYtPmxlbjsKLSAgICB0LT5yX2J1ZiA9IGdfYnl0ZV9hcnJheV9yZW1vdmVfcmFuZ2UgKHQtPnJfYnVmLCAwLCB0LT5yX2J1Zi0+bGVuKTsKLSAgfQotCi0gIC8vIHJlYWQgYSBmcmFtZSBvZiBpbnB1dCBhbmQgYnVmZmVyIGl0Ci0gIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfZnJhbWUgKHRyYW5zcG9ydCwgZXJyb3IpOwotCi0gIC8vIGhhbmQgb3ZlciB3aGF0IHdlIGhhdmUgdXAgdG8gd2hhdCB0aGUgY2FsbGVyIHdhbnRzCi0gIGd1aW50MzIgZ2l2ZSA9IHdhbnQgPCB0LT5yX2J1Zi0+bGVuID8gd2FudCA6IHQtPnJfYnVmLT5sZW47Ci0KLSAgLy8gY29weSB0aGUgZGF0YSBpbnRvIHRoZSBidWZmZXIKLSAgbWVtY3B5IChidWYgKyBsZW4gLSB3YW50LCB0LT5yX2J1Zi0+ZGF0YSwgZ2l2ZSk7Ci0gIHQtPnJfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+cl9idWYsIDAsIGdpdmUpOwotICB3YW50IC09IGdpdmU7Ci0KLSAgcmV0dXJuIChsZW4gLSB3YW50KTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKHRyYW5zcG9ydCk7Ci0KLSAgLyogaWYgd2UgaGF2ZSBlbm91Z2ggYnVmZmVyIGRhdGEgdG8gZnVsZmlsbCB0aGUgcmVhZCwganVzdCB1c2UKLSAgICogYSBtZW1jcHkgZnJvbSB0aGUgYnVmZmVyICovCi0gIGlmIChsZW4gPD0gdC0+cl9idWYtPmxlbikKLSAgewotICAgIG1lbWNweSAoYnVmLCB0LT5yX2J1Zi0+ZGF0YSwgbGVuKTsKLSAgICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5yX2J1ZiwgMCwgbGVuKTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWRfc2xvdyAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKLSAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9zbG93IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvLyBhcHBlbmQgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlciBhbmQgd2UncmUgZG9uZQotICBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLQotICAvKiB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYmVpbmcgcmVhZCAqLwotICBpZiAodC0+d19idWYtPmxlbiArIGxlbiA8PSB0LT53X2J1Zl9zaXplKQotICB7Ci0gICAgdC0+d19idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT53X2J1ZiwgYnVmLCBsZW4pOwotICAgIHJldHVybiBUUlVFOwotICB9Ci0KLSAgcmV0dXJuIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX3Nsb3cgKHRyYW5zcG9ydCwgYnVmLCBsZW4sIGVycm9yKTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZAotICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKi8KLWdib29sZWFuCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAodHJhbnNwb3J0KTsKLSAgZ2ludDMyIHN6X2hibywgc3pfbmJvOwotCi0gIC8vIGdldCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gaG9zdCBhbmQgbmV0d29yayBieXRlIG9yZGVyCi0gIHN6X2hibyA9IHQtPndfYnVmLT5sZW4gKyBzaXplb2Yoc3pfbmJvKTsKLSAgc3pfbmJvID0gKGdpbnQzMikgaHRvbmwgKChndWludDMyKSB0LT53X2J1Zi0+bGVuKTsKLQotICAvLyBjb3B5IHRoZSBzaXplIG9mIHRoZSBmcmFtZSBhbmQgdGhlbiB0aGUgZnJhbWUgaXRzZWxmCi0gIGd1Y2hhciB0bXBkYXRhW3N6X2hib107Ci0gIG1lbWNweSAodG1wZGF0YSwgKGd1aW50OCAqKSAmc3pfbmJvLCBzaXplb2YgKHN6X25ibykpOwotCi0gIGlmICh0LT53X2J1Zi0+bGVuID4gMCkKLSAgewotICAgIG1lbWNweSAodG1wZGF0YSArIHNpemVvZiAoc3pfbmJvKSwgdC0+d19idWYtPmRhdGEsIHQtPndfYnVmLT5sZW4pOwotICAgIHQtPndfYnVmID0gZ19ieXRlX2FycmF5X3JlbW92ZV9yYW5nZSAodC0+d19idWYsIDAsIHQtPndfYnVmLT5sZW4pOwotICB9Ci0gICAgCi0gIC8vIHdyaXRlIHRoZSBidWZmZXIgYW5kIHRoZW4gZW1wdHkgaXQKLSAgVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHQtPnRyYW5zcG9ydCktPndyaXRlICh0LT50cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wZGF0YSwgc3pfaGJvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLQotICBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodC0+dHJhbnNwb3J0KS0+Zmx1c2ggKHQtPnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2luaXQgKFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IE5VTEw7Ci0gIHRyYW5zcG9ydC0+cl9idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOwotICB0cmFuc3BvcnQtPndfYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKLX0KLQotLyogZGVzdHJ1Y3RvciAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCi17Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7Ci0KLSAgaWYgKHRyYW5zcG9ydC0+cl9idWYgIT0gTlVMTCkKLSAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPnJfYnVmLCBUUlVFKTsKLSAgfQotICB0cmFuc3BvcnQtPnJfYnVmID0gTlVMTDsKLQotICBpZiAodHJhbnNwb3J0LT53X2J1ZiAhPSBOVUxMKQotICB7Ci0gICAgZ19ieXRlX2FycmF5X2ZyZWUgKHRyYW5zcG9ydC0+d19idWYsIFRSVUUpOwotICB9Ci0gIHRyYW5zcG9ydC0+d19idWYgPSBOVUxMOwotfQotCi0vKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwotdm9pZAotdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1RSQU5TUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X29iamVjdCAodmFsdWUsIHRyYW5zcG9ydC0+dHJhbnNwb3J0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFOgotICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+cl9idWZfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgdHJhbnNwb3J0LT53X2J1Zl9zaXplKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIHByb3BlcnR5IG11dGF0b3IgKi8KLXZvaWQKLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlQgKG9iamVjdCk7Ci0KLSAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKLSAgewotICAgIGNhc2UgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQ6Ci0gICAgICB0cmFuc3BvcnQtPnRyYW5zcG9ydCA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9GUkFNRURfVFJBTlNQT1JUX1JFQURfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPnJfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBST1BfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfV1JJVEVfQlVGRkVSX1NJWkU6Ci0gICAgICB0cmFuc3BvcnQtPndfYnVmX3NpemUgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbGFzc19pbml0IChUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcyAqY2xzKQotewotICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKLSAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7Ci0KLSAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLwotICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfcHJvcGVydHk7Ci0gIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3NldF9wcm9wZXJ0eTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX29iamVjdCAoInRyYW5zcG9ydCIsICJ0cmFuc3BvcnQgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmlmdCB0cmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1RZUEVfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUgfCBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInJfYnVmX3NpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIGJ1ZmZlciBzaXplIChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSByZWFkIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9SRUFEX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJ3X2J1Zl9zaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGUgYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHdyaXRlIGJ1ZmZlciBzaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2LCAvKiBtYXgsIDEwMjQqMTAyNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9USFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9XUklURV9CVUZGRVJfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1fc3BlYyk7Ci0KLQotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLQotICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZpbmFsaXplOwotICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuOwotICB0dGMtPm9wZW4gPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuOwotICB0dGMtPmNsb3NlID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2U7Ci0gIHR0Yy0+cmVhZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQ7Ci0gIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkX2VuZDsKLSAgdHRjLT53cml0ZSA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlOwotICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZDsKLSAgdHRjLT5mbHVzaCA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTJlNDJlLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX0ZSQU1FRF9UUkFOU1BPUlRfSAotCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaAotICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBmcmFtZWQgdHJhbnNwb3J0LiAgU3ViY2xhc3NlcwotICogICAgICAgICB0aGUgVGhyaWZ0VHJhbnNwb3J0IGNsYXNzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydCkpCi0jZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCkpCi0jZGVmaW5lIFRIUklGVF9GUkFNRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19GUkFNRURfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUKQotI2RlZmluZSBUSFJJRlRfRlJBTUVEX1RSQU5TUE9SVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIFRocmlmdEZyYW1lZFRyYW5zcG9ydENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Ci17Ci0gIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7Ci0KLSAgLyogcHJvdGVjdGVkICovCi0gIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0OwotCi0gIC8qIHByaXZhdGUgKi8KLSAgR0J5dGVBcnJheSAqcl9idWY7Ci0gIEdCeXRlQXJyYXkgKndfYnVmOwotICBndWludDMyIHJfYnVmX3NpemU7Ci0gIGd1aW50MzIgd19idWZfc2l6ZTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0IFRocmlmdEZyYW1lZFRyYW5zcG9ydDsKLQotLyohCi0gKiBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgY2xhc3MuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0RnJhbWVkVHJhbnNwb3J0Q2xhc3MKLXsKLSAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzcyBUaHJpZnRGcmFtZWRUcmFuc3BvcnRDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JUICovCi1HVHlwZSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzJkNGE1Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgotCi0vKiBvYmplY3QgcHJvcGVydGllcyAqLwotZW51bSBfVGhyaWZ0TWVtb3J5QnVmZmVyUHJvcGVydGllcwotewotICBQUk9QXzAsCi0gIFBST1BfVEhSSUZUX01FTU9SWV9CVUZGRVJfQlVGRkVSX1NJWkUsCi19OwotCi1HX0RFRklORV9UWVBFKFRocmlmdE1lbW9yeUJ1ZmZlciwgdGhyaWZ0X21lbW9yeV9idWZmZXIsIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkKLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICovCi1naW50MzIKLXRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIFRocmlmdE1lbW9yeUJ1ZmZlciAqdCA9IFRIUklGVF9NRU1PUllfQlVGRkVSICh0cmFuc3BvcnQpOwotICBndWludDMyIGdpdmUgPSBsZW47IAotCi0gIC8qIGlmIHRoZSByZXF1ZXN0ZWQgYnl0ZXMgYXJlIG1vcmUgdGhhbiB3aGF0IHdlIGhhdmUgYXZhaWxhYmxlLAotICAgKiBqdXN0IGdpdmUgYWxsIHRoYXQgd2UgaGF2ZSB0aGUgYnVmZmVyICovCi0gIGlmICh0LT5idWYtPmxlbiA8IGxlbikKLSAgewotICAgIGdpdmUgPSB0LT5idWYtPmxlbjsKLSAgfQotCi0gIG1lbWNweSAoYnVmLCB0LT5idWYtPmRhdGEsIGdpdmUpOwotICBnX2J5dGVfYXJyYXlfcmVtb3ZlX3JhbmdlICh0LT5idWYsIDAsIGdpdmUpOwotCi0gIHJldHVybiBnaXZlOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQKLSAqIGNhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCi1nYm9vbGVhbgotdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncG9pbnRlciBidWYsICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0KLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0ID0gVEhSSUZUX01FTU9SWV9CVUZGRVIgKHRyYW5zcG9ydCk7Ci0KLSAgLyogcmV0dXJuIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggc3BhY2UuICovCi0gIGlmIChsZW4gPiB0LT5idWZfc2l6ZSAtIHQtPmJ1Zi0+bGVuKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gd3JpdGUgJWQgYnl0ZXMgdG8gYnVmZmVyIG9mIGxlbmd0aCAlZCIsCi0gICAgICAgICAgICAgICAgIGxlbiwgdC0+YnVmX3NpemUpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfSBlbHNlIHsKLSAgICB0LT5idWYgPSBnX2J5dGVfYXJyYXlfYXBwZW5kICh0LT5idWYsIGJ1ZiwgbGVuKTsKLSAgICByZXR1cm4gVFJVRTsKLSAgfQotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCi0gKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgLyogc2F0aXNmeSAtV2FsbCAqLwotICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAqLwotZ2Jvb2xlYW4KLXRocmlmdF9tZW1vcnlfYnVmZmVyX2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfbWVtb3J5X2J1ZmZlcl9pbml0IChUaHJpZnRNZW1vcnlCdWZmZXIgKnRyYW5zcG9ydCkKLXsKLSAgdHJhbnNwb3J0LT5idWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOwotfQotCi0vKiBkZXN0cnVjdG9yICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKLXsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKLQotICBpZiAodHJhbnNwb3J0LT5idWYgIT0gTlVMTCkKLSAgewotICAgIGdfYnl0ZV9hcnJheV9mcmVlICh0cmFuc3BvcnQtPmJ1ZiwgVFJVRSk7Ci0gIH0KLSAgdHJhbnNwb3J0LT5idWYgPSBOVUxMOwotfQotCi0vKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwotdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFOgotICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHRyYW5zcG9ydC0+YnVmX3NpemUpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogcHJvcGVydHkgbXV0YXRvciAqLwotdm9pZAotdGhyaWZ0X21lbW9yeV9idWZmZXJfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0cmFuc3BvcnQgPSBUSFJJRlRfTUVNT1JZX0JVRkZFUiAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFOgotICAgICAgdHJhbnNwb3J0LT5idWZfc2l6ZSA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9tZW1vcnlfYnVmZmVyX2NsYXNzX2luaXQgKFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzICpjbHMpCi17Ci0gIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwotICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKLQotICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCi0gIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF9wcm9wZXJ0eTsKLSAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfc2V0X3Byb3BlcnR5OwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJ1Zl9zaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHNpemUgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHJlYWQgYnVmZmVyIHNpemUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYsIC8qIG1heCwgMTAyNCoxMDI0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyLCAvKiBkZWZhdWx0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9NRU1PUllfQlVGRkVSX0JVRkZFUl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyAqdHRjID0gVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLQotICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2ZpbmFsaXplOwotICB0dGMtPmlzX29wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9pc19vcGVuOwotICB0dGMtPm9wZW4gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuOwotICB0dGMtPmNsb3NlID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2U7Ci0gIHR0Yy0+cmVhZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQ7Ci0gIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcl9yZWFkX2VuZDsKLSAgdHRjLT53cml0ZSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlOwotICB0dGMtPndyaXRlX2VuZCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlX2VuZDsKLSAgdHRjLT5mbHVzaCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX2ZsdXNoOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU2OTdlLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX01FTU9SWV9CVUZGRVJfSAotI2RlZmluZSBfVEhSSUZUX01FTU9SWV9CVUZGRVJfSAotCi0jaW5jbHVkZSA8Z2xpYi5oPgotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X21lbW9yeV9idWZmZXIuaAotICogIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBtZW1vcnkgYnVmZmVyIHRyYW5zcG9ydC4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVIob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXIpKQotI2RlZmluZSBUSFJJRlRfSVNfTUVNT1JZX0JVRkZFUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIpKQotI2RlZmluZSBUSFJJRlRfTUVNT1JZX0JVRkZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgVGhyaWZ0TWVtb3J5QnVmZmVyQ2xhc3MpKQotI2RlZmluZSBUSFJJRlRfSVNfTUVNT1JZX0JVRkZFUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUikKLSNkZWZpbmUgVEhSSUZUX01FTU9SWV9CVUZGRVJfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBUaHJpZnRNZW1vcnlCdWZmZXJDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0TWVtb3J5QnVmZmVyIGluc3RhbmNlLgotICovCi1zdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlcgotewotICBUaHJpZnRUcmFuc3BvcnQgcGFyZW50OwotCi0gIC8qIHByaXZhdGUgKi8KLSAgR0J5dGVBcnJheSAqYnVmOwotICBndWludDMyIGJ1Zl9zaXplOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXIgVGhyaWZ0TWVtb3J5QnVmZmVyOwotCi0vKiEKLSAqIFRocmlmdE1lbW9yeUJ1ZmZlciBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRNZW1vcnlCdWZmZXJDbGFzcwotewotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdE1lbW9yeUJ1ZmZlckNsYXNzIFRocmlmdE1lbW9yeUJ1ZmZlckNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIgKi8KLUdUeXBlIHRocmlmdF9tZW1vcnlfYnVmZmVyX2dldF90eXBlICh2b2lkKTsKLQotR19FTkRfREVDTFMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzY2NjQuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+Ci0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRTZXJ2ZXJTb2NrZXRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9QT1JULAotICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0cKLX07Ci0KLS8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOICJ0aHJpZnQtc2VydmVyLXNvY2tldC1lcnJvci1xdWFyayIKLQotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCi1HX0RFRklORV9UWVBFKFRocmlmdFNlcnZlclNvY2tldCwgdGhyaWZ0X3NlcnZlcl9zb2NrZXQsIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQpCi0KLWdib29sZWFuCi10aHJpZnRfc2VydmVyX3NvY2tldF9saXN0ZW4gKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgaW50IGVuYWJsZWQgPSAxOyAvKiBmb3Igc2V0c29ja29wdCgpICovCi0gIHN0cnVjdCBzb2NrYWRkcl9pbiBwaW47Ci0gIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIC8qIGNyZWF0ZSBhIGFkZHJlc3Mgc3RydWN0dXJlICovCi0gIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOwotICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHBpbi5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwotICBwaW4uc2luX3BvcnQgPSBodG9ucyh0c29ja2V0LT5wb3J0KTsKLQotICAvKiBjcmVhdGUgYSBzb2NrZXQgKi8KLSAgaWYgKCh0c29ja2V0LT5zZCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgc29ja2V0IC0gJXMiLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBpZiAoc2V0c29ja29wdCh0c29ja2V0LT5zZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuYWJsZWQpKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gc2V0IFNPX1JFVVNFQUREUiAtICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBiaW5kIHRvIHRoZSBzb2NrZXQgKi8KLSAgaWYgKGJpbmQodHNvY2tldC0+c2QsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnBpbiwgc2l6ZW9mKHBpbikpID09IC0xKQotICB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQklORCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBiaW5kIHRvIHBvcnQgJWQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKGxpc3Rlbih0c29ja2V0LT5zZCwgdHNvY2tldC0+YmFja2xvZykgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9MSVNURU4sCi0gICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gbGlzdGVuIHRvIHBvcnQgJWQgLSAlcyIsCi0gICAgICAgICAgICAgICAgIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLVRocmlmdFRyYW5zcG9ydCAqCi10aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgaW50IHNkID0gMDsKLSAgZ3VpbnQgYWRkcmxlbiA9IDA7Ci0gIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyZXNzOwotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IE5VTEw7Ci0KLSAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKChzZCA9IGFjY2VwdCh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgJmFkZHJsZW4pKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0FDQ0VQVCwKLSAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbiAtICVzIiwKLSAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICBzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7Ci0gIHNvY2tldC0+c2QgPSBzZDsKLQotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVChzb2NrZXQpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2UgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gVEhSSUZUX1NFUlZFUl9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgaWYgKGNsb3NlICh0c29ja2V0LT5zZCkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAotICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRSwKLSAgICAgICAgICAgICAgICAgInVuYWJsZSB0byBjbG9zZSBzb2NrZXQgLSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0gIHRzb2NrZXQtPnNkID0gMDsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciB0aGlzIGltcGxlbWVudGF0aW9uICovCi1HUXVhcmsKLXRocmlmdF9zZXJ2ZXJfc29ja2V0X2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcoVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfRE9NQUlOKTsKLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQpCi17Ci0gIHNvY2tldC0+c2QgPSAwOwotfQotCi0vKiBkZXN0cnVjdG9yICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKLXsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKLQotICBpZiAoc29ja2V0LT5zZCAhPSAwKQotICB7Ci0gICAgY2xvc2UgKHNvY2tldC0+c2QpOwotICB9Ci0gIHNvY2tldC0+c2QgPSAwOwotfQotCi0vKiBwcm9wZXJ0eSBhY2Nlc3NvciAqLwotdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVGhyaWZ0U2VydmVyU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU0VSVkVSX1NPQ0tFVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQ6Ci0gICAgICBnX3ZhbHVlX3NldF91aW50ICh2YWx1ZSwgc29ja2V0LT5wb3J0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgotICAgICAgZ192YWx1ZV9zZXRfdWludCAodmFsdWUsIHNvY2tldC0+YmFja2xvZyk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBwcm9wZXJ0eSBtdXRhdG9yICovCi12b2lkCi10aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQotewotICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TRVJWRVJfU09DS0VUIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9TT0NLRVRfUE9SVDoKLSAgICAgIHNvY2tldC0+cG9ydCA9IGdfdmFsdWVfZ2V0X3VpbnQgKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NPQ0tFVF9CQUNLTE9HOgotICAgICAgc29ja2V0LT5iYWNrbG9nID0gZ192YWx1ZV9nZXRfdWludCAodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogaW5pdGlhbGl6ZXMgdGhlIGNsYXNzICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MgKmNscykKLXsKLSAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7Ci0gIEdQYXJhbVNwZWMgKnBhcmFtX3NwZWMgPSBOVUxMOwotCi0gIC8qIHNldHVwIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgKi8KLSAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZ2V0X3Byb3BlcnR5OwotICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9zZXRfcHJvcGVydHk7Ci0KLSAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY191aW50ICgicG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQgKGNvbnN0cnVjdCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdGhlIHBvcnQgdG8gbGlzdGVuIHRvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNCwgLyogbWF4ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9zcGVjKTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJiYWNrbG9nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja2xvZyAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgYWNjZXB0IGJhY2tsb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1heCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0LCAvKiBkZWZhdWx0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX0JBQ0tMT0csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZmluYWxpemU7Ci0KLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKnRzdGMgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9DTEFTUyAoY2xzKTsKLSAgdHN0Yy0+bGlzdGVuID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfbGlzdGVuOwotICB0c3RjLT5hY2NlcHQgPSB0aHJpZnRfc2VydmVyX3NvY2tldF9hY2NlcHQ7Ci0gIHRzdGMtPmNsb3NlID0gdGhyaWZ0X3NlcnZlcl9zb2NrZXRfY2xvc2U7Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNjAxNy4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKLSNkZWZpbmUgX1RIUklGVF9TRVJWRVJfU09DS0VUX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLSNpbmNsdWRlICJ0aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc2VydmVyX3NvY2tldC5oCi0gKiAgXGJyaWVmIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIgdHJhbnNwb3J0LiAgSW1wbGVtZW50cyB0aGUKLSAqICAgICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IGNsYXNzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQgKHRocmlmdF9zZXJ2ZXJfc29ja2V0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsIFRocmlmdFNlcnZlclNvY2tldCkpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9TT0NLRVRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcykpCi0KLS8qIQotICogVGhyaWZ0IFNlcnZlclNvY2tldCBpbnN0YW5jZS4KLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQKLXsKLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0IHBhcmVudDsKLQotICAvKiBwcml2YXRlICovCi0gIGdzaG9ydCBwb3J0OwotICBnc2hvcnQgYmFja2xvZzsKLSAgaW50IHNkOwotICBndWludDggKmJ1ZjsKLSAgZ3VpbnQzMiBidWZfc2l6ZTsKLSAgZ3VpbnQzMiBidWZfbGVuOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXQgVGhyaWZ0U2VydmVyU29ja2V0OwotCi0vKiEKLSAqIFRocmlmdCBTZXJ2ZXJTb2NrZXQgY2xhc3MuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0U2VydmVyU29ja2V0Q2xhc3MKLXsKLSAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzcyBUaHJpZnRTZXJ2ZXJTb2NrZXRDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VUICovCi1HVHlwZSB0aHJpZnRfc2VydmVyX3NvY2tldF9nZXRfdHlwZSAodm9pZCk7Ci0KLS8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9TT0NLRVQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX1NFVFNPQ0tPUFQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0JJTkQsCi0gIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SX0xJU1RFTiwKLSAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBULAotICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9DTE9TRQotfSBUaHJpZnRTZXJ2ZXJTb2NrZXRFcnJvcjsKLQotLyogZGVmaW5lIGEgZXJyb3IgZG9tYWluIGZvciBHRXJyb3IgdG8gdXNlICovCi1HUXVhcmsgdGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUiAodGhyaWZ0X3NlcnZlcl9zb2NrZXRfZXJyb3JfcXVhcmsgKCkpCi0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGE0NmMzLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+Ci0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0U2VydmVyVHJhbnNwb3J0LCB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydCwgR19UWVBFX09CSkVDVCkKLQotLyogYmFzZSBpbml0aWFsaXplciBmb3IgdGhlIHNlcnZlciB0cmFuc3BvcnQgaW50ZXJmYWNlICovCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgKmMpCi17Ci0gIGMtPmxpc3RlbiA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbjsKLSAgYy0+YWNjZXB0ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0OwotICBjLT5jbG9zZSA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2Nsb3NlOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfaW5pdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCi17Ci0gIHJldHVybiBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmxpc3RlbiAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLX0KLQotVGhyaWZ0VHJhbnNwb3J0ICoKLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5hY2NlcHQgKHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5jbG9zZSAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDk0MzI1Li4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSAotI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLgotICovCi0KLS8qIHR5cGUgbWFjcm9zICovCi0jZGVmaW5lIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQgKHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NFUlZFUl9UUkFOU1BPUlQsIFRocmlmdFNlcnZlclRyYW5zcG9ydCkpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCkpCi0jZGVmaW5lIFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19TRVJWRVJfVFJBTlNQT1JUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9TRVJWRVJfVFJBTlNQT1JULCBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcykpCi0KLXN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgVGhyaWZ0U2VydmVyVHJhbnNwb3J0OwotCi0vKiEKLSAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICBnYm9vbGVhbiAoKmxpc3RlbikgKFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIFRocmlmdFRyYW5zcG9ydCAqKCphY2NlcHQpIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKmNsb3NlKSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLX07Ci10eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3M7Ci0KLS8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU0VSVkVSX1RSQU5TUE9SVCAqLwotR1R5cGUgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiEKLSAqIExpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0U2VydmVyVHJhbnNwb3J0Q2xhc3MKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIEFjY2VwdCBhIGNvbm5lY3Rpb24uCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotICovCi1UaHJpZnRUcmFuc3BvcnQgKnRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdAotICAgIChUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnRDbGFzcwotICovCi1nYm9vbGVhbiB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9TRVJWRVJfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MTZiYWEuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+Ci0KLS8qIG9iamVjdCBwcm9wZXJ0aWVzICovCi1lbnVtIF9UaHJpZnRTb2NrZXRQcm9wZXJ0aWVzCi17Ci0gIFBST1BfMCwKLSAgUFJPUF9USFJJRlRfU09DS0VUX0hPU1ROQU1FLAotICBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVAotfTsKLQotLyogZm9yIGVycm9ycyBjb21pbmcgZnJvbSBzb2NrZXQoKSBhbmQgY29ubmVjdCgpICovCi1leHRlcm4gaW50IGVycm5vOwotCi1HX0RFRklORV9UWVBFKFRocmlmdFNvY2tldCwgdGhyaWZ0X3NvY2tldCwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLwotZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKLSAgcmV0dXJuIHNvY2tldC0+c2QgIT0gMDsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKLSAgc3RydWN0IHNvY2thZGRyX2luIHBpbjsKLQotICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAodHNvY2tldC0+c2QgPT0gMCwgRkFMU0UpOwotCi0gIC8qIGxvb2t1cCB0aGUgZGVzdGluYXRpb24gaG9zdCAqLwotICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZSAodHNvY2tldC0+aG9zdG5hbWUpKSA9PSBOVUxMKQotICB7Ci0gICAgLyogaG9zdCBsb29rdXAgZmFpbGVkLCBiYWlsIG91dCB3aXRoIGFuIGVycm9yICovCi0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0hPU1QsCi0gICAgICAgICAgICAgICAgICJob3N0IGxvb2t1cCBmYWlsZWQgZm9yICVzOiVkIC0gJXMiLAotICAgICAgICAgICAgICAgICB0c29ja2V0LT5ob3N0bmFtZSwgdHNvY2tldC0+cG9ydCwKLSAgICAgICAgICAgICAgICAgaHN0cmVycm9yIChoX2Vycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLwotICBtZW1zZXQgKCZwaW4sIDAsIHNpemVvZihwaW4pKTsKLSAgcGluLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICBwaW4uc2luX2FkZHIuc19hZGRyID0gKChzdHJ1Y3QgaW5fYWRkciAqKSAoaHAtPmhfYWRkcikpLT5zX2FkZHI7Ci0gIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsgCi0KLSAgLyogY3JlYXRlIHRoZSBzb2NrZXQgKi8KLSAgaWYgKCh0c29ja2V0LT5zZCA9IHNvY2tldCAoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gY3JlYXRlIHNvY2tldCBmb3IgaG9zdCAlczolZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsCi0gICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KLSAgaWYgKGNvbm5lY3QgKHRzb2NrZXQtPnNkLCAoc3RydWN0IHNvY2thZGRyICopICZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkKLSAgewotICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAotICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNvbm5lY3QgdG8gaG9zdCAlczolZCAtICVzIiwKLSAgICAgICAgICAgICAgICAgdHNvY2tldC0+aG9zdG5hbWUsIHRzb2NrZXQtPnBvcnQsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHNvY2tldC0+c2QgPSAwOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KLWdpbnQzMgotdGhyaWZ0X3NvY2tldF9yZWFkIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdpbnQgcmV0ID0gMDsKLSAgZ3VpbnQgZ290ID0gMDsKLQotICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7Ci0KLSAgd2hpbGUgKGdvdCA8IGxlbikKLSAgewotICAgIHJldCA9IHJlY3YgKHNvY2tldC0+c2QsIGJ1ZiwgbGVuLCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICB7Ci0gICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9SRUNFSVZFLAotICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVhZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBnb3QgKz0gcmV0OwotICB9Ci0KLSAgcmV0dXJuIGdvdDsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kCi0gKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X3JlYWRfZW5kIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLCAgICAgCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIGdpbnQgcmV0ID0gMDsKLSAgZ3VpbnQgc2VudCA9IDA7Ci0KLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSAwLCBGQUxTRSk7Ci0KLSAgd2hpbGUgKHNlbnQgPCBsZW4pCi0gIHsKLSAgICByZXQgPSBzZW5kIChzb2NrZXQtPnNkLCBidWYgKyBzZW50LCBsZW4gLSBzZW50LCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICB7Ci0gICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAotICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2VuZCAlZCBieXRlcyAtICVzIiwgbGVuLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBzZW50ICs9IHJldDsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCi0gKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICAvKiBzYXRpc2Z5IC1XYWxsICovCi0gIFRIUklGVF9VTlVTRURfVkFSICh0cmFuc3BvcnQpOwotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZXJyb3IpOwotICByZXR1cm4gVFJVRTsKLX0KLQotLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoCi0gKiBmbHVzaCBwZW5kaW5nIGRhdGEuICBzaW5jZSB3ZSBhcmUgbm90IGJ1ZmZlcmVkLCB0aGlzIGlzIGEgbm8tb3AgKi8KLWdib29sZWFuCi10aHJpZnRfc29ja2V0X2ZsdXNoIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCi17Ci0gIC8qIHNhdGlzZnkgLVdhbGwgKi8KLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7Ci0gIHJldHVybiBUUlVFOwotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc29ja2V0X2luaXQgKFRocmlmdFNvY2tldCAqc29ja2V0KQotewotICBzb2NrZXQtPnNkID0gMDsKLX0KLQotLyogZGVzdHJ1Y3RvciAqLwotc3RhdGljIHZvaWQKLXRocmlmdF9zb2NrZXRfZmluYWxpemUgKEdPYmplY3QgKm9iamVjdCkKLXsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOwotCi0gIGlmIChzb2NrZXQtPmhvc3RuYW1lICE9IE5VTEwpCi0gIHsKLSAgICBnX2ZyZWUgKHNvY2tldC0+aG9zdG5hbWUpOwotICB9Ci0gIHNvY2tldC0+aG9zdG5hbWUgPSBOVUxMOwotCi0gIGlmIChzb2NrZXQtPnNkICE9IDApCi0gIHsKLSAgICBjbG9zZSAoc29ja2V0LT5zZCk7Ci0gIH0KLSAgc29ja2V0LT5zZCA9IDA7Ci19Ci0KLS8qIHByb3BlcnR5IGFjY2Vzc29yICovCi12b2lkCi10aHJpZnRfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUIChvYmplY3QpOwotCi0gIHN3aXRjaCAocHJvcGVydHlfaWQpCi0gIHsKLSAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKLSAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNvY2tldC0+aG9zdG5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKLSAgICAgIGdfdmFsdWVfc2V0X3VpbnQgKHZhbHVlLCBzb2NrZXQtPnBvcnQpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLyogcHJvcGVydHkgbXV0YXRvciAqLwotdm9pZAotdGhyaWZ0X3NvY2tldF9zZXRfcHJvcGVydHkgKEdPYmplY3QgKm9iamVjdCwgZ3VpbnQgcHJvcGVydHlfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZhbHVlICp2YWx1ZSwgR1BhcmFtU3BlYyAqcHNwZWMpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7Ci0gIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAob2JqZWN0KTsKLQotICBzd2l0Y2ggKHByb3BlcnR5X2lkKQotICB7Ci0gICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUU6Ci0gICAgICBzb2NrZXQtPmhvc3RuYW1lID0gZ19zdHJkdXAgKGdfdmFsdWVfZ2V0X3N0cmluZyAodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQ6Ci0gICAgICBzb2NrZXQtPnBvcnQgPSBnX3ZhbHVlX2dldF91aW50ICh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBpbml0aWFsaXplcyB0aGUgY2xhc3MgKi8KLXN0YXRpYyB2b2lkCi10aHJpZnRfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNvY2tldENsYXNzICpjbHMpCi17Ci0gIEdPYmplY3RDbGFzcyAqZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTIChjbHMpOwotICBHUGFyYW1TcGVjICpwYXJhbV9zcGVjID0gTlVMTDsKLQotICAvKiBzZXR1cCBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzICovCi0gIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zb2NrZXRfZ2V0X3Byb3BlcnR5OwotICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc29ja2V0X3NldF9wcm9wZXJ0eTsKLQotICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3N0cmluZyAoImhvc3RuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAoY29uc3RydWN0KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBob3N0bmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsaG9zdCIsIC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwotICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLCBQUk9QX1RIUklGVF9TT0NLRVRfSE9TVE5BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoInBvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IChjb25zdHJ1Y3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2V0IHRoZSBwb3J0IG9mIHRoZSByZW1vdGUgaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogbWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzQsIC8qIG1heCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwOTAsIC8qIGRlZmF1bHQgYnkgY29udmVudGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKLSAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU09DS0VUX1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwotCi0gIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOwotCi0gIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NvY2tldF9maW5hbGl6ZTsKLSAgdHRjLT5pc19vcGVuID0gdGhyaWZ0X3NvY2tldF9pc19vcGVuOwotICB0dGMtPm9wZW4gPSB0aHJpZnRfc29ja2V0X29wZW47Ci0gIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc29ja2V0X2Nsb3NlOwotICB0dGMtPnJlYWQgPSB0aHJpZnRfc29ja2V0X3JlYWQ7Ci0gIHR0Yy0+cmVhZF9lbmQgPSB0aHJpZnRfc29ja2V0X3JlYWRfZW5kOwotICB0dGMtPndyaXRlID0gdGhyaWZ0X3NvY2tldF93cml0ZTsKLSAgdHRjLT53cml0ZV9lbmQgPSB0aHJpZnRfc29ja2V0X3dyaXRlX2VuZDsKLSAgdHRjLT5mbHVzaCA9IHRocmlmdF9zb2NrZXRfZmx1c2g7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGUyNjljLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfU09DS0VUX0gKLSNkZWZpbmUgX1RIUklGVF9TT0NLRVRfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotCi1HX0JFR0lOX0RFQ0xTCi0KLS8qISBcZmlsZSB0aHJpZnRfc29ja2V0LmgKLSAqICBcYnJpZWYgU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHRyYW5zcG9ydC4gIFN1YmNsYXNzZXMgdGhlCi0gKiAgICAgICAgIFRocmlmdFRyYW5zcG9ydCBjbGFzcy4KLSAqLwotCi0vKiB0eXBlIG1hY3JvcyAqLwotI2RlZmluZSBUSFJJRlRfVFlQRV9TT0NLRVQgKHRocmlmdF9zb2NrZXRfZ2V0X3R5cGUgKCkpCi0jZGVmaW5lIFRIUklGVF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldCkpCi0jZGVmaW5lIFRIUklGVF9JU19TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TT0NLRVQpKQotI2RlZmluZSBUSFJJRlRfU09DS0VUX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfQ0FTVCAoKGMpLCBUSFJJRlRfVFlQRV9TT0NLRVQsIFRocmlmdFNvY2tldENsYXNzKSkKLSNkZWZpbmUgVEhSSUZUX0lTX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU09DS0VUKSkKLSNkZWZpbmUgVEhSSUZUX1NPQ0tFVF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NPQ0tFVCwgVGhyaWZ0U29ja2V0Q2xhc3MpKQotCi0vKiEKLSAqIFRocmlmdCBTb2NrZXQgaW5zdGFuY2UuCi0gKi8KLXN0cnVjdCBfVGhyaWZ0U29ja2V0Ci17Ci0gIFRocmlmdFRyYW5zcG9ydCBwYXJlbnQ7Ci0KLSAgLyogcHJpdmF0ZSAqLwotICBnY2hhciAqaG9zdG5hbWU7Ci0gIGdzaG9ydCBwb3J0OwotICBpbnQgc2Q7Ci0gIGd1aW50OCAqYnVmOwotICBndWludDMyIGJ1Zl9zaXplOwotICBndWludDMyIGJ1Zl9sZW47Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldCBUaHJpZnRTb2NrZXQ7Ci0KLS8qIQotICogVGhyaWZ0IFNvY2tldCBjbGFzcy4KLSAqLwotc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcwotewotICBUaHJpZnRUcmFuc3BvcnRDbGFzcyBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFNvY2tldENsYXNzIFRocmlmdFNvY2tldENsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NPQ0tFVCAqLwotR1R5cGUgdGhyaWZ0X3NvY2tldF9nZXRfdHlwZSAodm9pZCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwYmNhZC4uMDAwMDAwMAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+Ci0KLS8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBzdHJpbmcgKi8KLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9ET01BSU4gInRocmlmdC10cmFuc3BvcnQtZXJyb3ItcXVhcmsiCi0KLUdfREVGSU5FX0FCU1RSQUNUX1RZUEUoVGhyaWZ0VHJhbnNwb3J0LCB0aHJpZnRfdHJhbnNwb3J0LCBHX1RZUEVfT0JKRUNUKQotCi1nYm9vbGVhbiAKLXRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpCi17Ci0gIHJldHVybiBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KS0+aXNfb3BlbiAodHJhbnNwb3J0KTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF90cmFuc3BvcnRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPm9wZW4gKHRyYW5zcG9ydCwgZXJyb3IpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmNsb3NlICh0cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotZ2ludDMyCi10aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkICh0cmFuc3BvcnQsIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIGVycm9yKTsKLX0KLQotZ2Jvb2xlYW4KLXRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgcmV0dXJuIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpLT5yZWFkX2VuZCAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlICh0cmFuc3BvcnQsIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Ci19Ci0KLWdib29sZWFuCi10aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPndyaXRlX2VuZCAodHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwotfQotCi1nYm9vbGVhbgotdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQotewotICByZXR1cm4gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCktPmZsdXNoICh0cmFuc3BvcnQsIGVycm9yKTsKLX0KLQotLyogZGVmaW5lIHRoZSBHRXJyb3IgZG9tYWluIGZvciBUaHJpZnQgdHJhbnNwb3J0cyAqLwotR1F1YXJrCi10aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICh2b2lkKQotewotICByZXR1cm4gZ19xdWFya19mcm9tX3N0YXRpY19zdHJpbmcgKFRIUklGVF9UUkFOU1BPUlRfRVJST1JfRE9NQUlOKTsKLX0KLQotLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFRyYW5zcG9ydCAqLwotc3RhdGljIHZvaWQKLXRocmlmdF90cmFuc3BvcnRfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmNscykKLXsKLSAgLyogc2V0IHRoZXNlIGFzIHZpcnR1YWwgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzICovCi0gIGNscy0+aXNfb3BlbiA9IHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbjsKLSAgY2xzLT5vcGVuID0gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuOwotICBjbHMtPmNsb3NlID0gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZTsKLSAgY2xzLT5yZWFkID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkOwotICBjbHMtPnJlYWRfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZDsKLSAgY2xzLT53cml0ZSA9IHRocmlmdF90cmFuc3BvcnRfd3JpdGU7Ci0gIGNscy0+d3JpdGVfZW5kID0gdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQ7Ci0gIGNscy0+Zmx1c2ggPSB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoOwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3RyYW5zcG9ydF9pbml0IChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCkKLXsKLSAgVEhSSUZUX1VOVVNFRF9WQVIgKHRyYW5zcG9ydCk7Ci19CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzk3NDczLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9ICi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX0gKLQotI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+Ci0KLUdfQkVHSU5fREVDTFMKLQotLyohIFxmaWxlIHRocmlmdF90cmFuc3BvcnQuaAotICogIFxicmllZiBBYnN0cmFjdCBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMuCi0gKgotICogQW4gYWJzdHJhY3QgY2xhc3MgaXMgdXNlZCBpbnN0ZWFkIG9mIGFuIGludGVyZmFjZSBiZWNhdXNlOgotICogIC0gaW50ZXJmYWNlcyBjYW4ndCBzZWVtIHRvIGJlIHVzZWQgYXMgcHJvcGVydGllcy4gIFRocmlmdFByb3RvY29sIGhhcwotICogICAgYSBUaHJpZnRUcmFuc3BvcnQgYXMgYW4gb2JqZWN0IHByb3BlcnR5LgotICogIC0gaWYgYSBtZXRob2QgbmVlZHMgdG8gYmUgYWRkZWQgdGhhdCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlLCBhIGNsYXNzCi0gKiAgICBpcyBuZWNlc3NhcnkuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfVFJBTlNQT1JUICh0aHJpZnRfdHJhbnNwb3J0X2dldF90eXBlICgpKQotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnQpKQotI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUKSkKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JULCBUaHJpZnRUcmFuc3BvcnRDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX1RSQU5TUE9SVCkpCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlQsIFRocmlmdFRyYW5zcG9ydENsYXNzKSkKLQotLyohCi0gKiBUaHJpZnQgUHJvdG9jb2wgb2JqZWN0Ci0gKi8KLXN0cnVjdCBfVGhyaWZ0VHJhbnNwb3J0Ci17Ci0gIEdPYmplY3QgcGFyZW50OwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnQgVGhyaWZ0VHJhbnNwb3J0OwotCi0vKiEKLSAqIFRocmlmdCBUcmFuc3BvcnQgY2xhc3MKLSAqLwotc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICBnYm9vbGVhbiAoKmlzX29wZW4pIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci0gIGdib29sZWFuICgqb3BlbikgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqY2xvc2UpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnaW50MzIgKCpyZWFkKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqcmVhZF9lbmQpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKndyaXRlKSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotICBnYm9vbGVhbiAoKndyaXRlX2VuZCkgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0gIGdib29sZWFuICgqZmx1c2gpIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRDbGFzcyBUaHJpZnRUcmFuc3BvcnRDbGFzczsKLQotLyogdXNlZCBieSBUSFJJRlRfVFlQRV9UUkFOU1BPUlQgKi8KLUdUeXBlIHRocmlmdF90cmFuc3BvcnRfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCi0KLS8qIQotICogQ2hlY2tzIGlmIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW5lZC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1nYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KTsKLQotLyohCi0gKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLQotLyohCi0gKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBidWZmZXIgYnVmLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdpbnQzMiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENhbGxlZCB3aGVuIHJlYWQgaXMgY29tcGxldGVkLgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7Ci0KLS8qIQotICogV3JpdGVzIGRhdGEgZnJvbSBhIGJ1ZmZlciB0byB0aGUgdHJhbnNwb3J0LgotICogXHB1YmxpYyBcbWVtYmVyb2YgVGhyaWZ0VHJhbnNwb3J0SW50ZXJmYWNlCi0gKi8KLWdib29sZWFuIHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIENhbGxlZCB3aGVuIHdyaXRlIGlzIGNvbXBsZXRlZC4KLSAqIFxwdWJsaWMgXG1lbWJlcm9mIFRocmlmdFRyYW5zcG9ydEludGVyZmFjZQotICovCi1nYm9vbGVhbiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpOwotCi0vKiEKLSAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSB0byBiZSB3cml0dGVuLiAgVHlwaWNhbGx5IHVzZWQgd2l0aCBidWZmZXJlZAotICogdHJhbnNwb3J0IG1lY2hhbmlzbXMuCi0gKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRUcmFuc3BvcnRJbnRlcmZhY2UKLSAqLwotZ2Jvb2xlYW4gdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKLQotLyogZGVmaW5lIGVycm9yL2V4Y2VwdGlvbiB0eXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfVU5LTk9XTiwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9IT1NULAotICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NPQ0tFVCwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DT05ORUNULAotICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX1NFTkQsCi0gIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfUkVDRUlWRSwKLSAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9DTE9TRQotfSBUaHJpZnRUcmFuc3BvcnRFcnJvcjsKLQotLyogZGVmaW5lIGFuIGVycm9yIGRvbWFpbiBmb3IgR0Vycm9yIHRvIHVzZSAqLwotR1F1YXJrIHRocmlmdF90cmFuc3BvcnRfZXJyb3JfcXVhcmsgKHZvaWQpOwotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SICh0aHJpZnRfdHJhbnNwb3J0X2Vycm9yX3F1YXJrICgpKQotCi1HX0VORF9ERUNMUwotCi0jZW5kaWYgLyogX1RIUklGVF9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMTI1YTMuLjAwMDAwMDAKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgotCi1HX0RFRklORV9UWVBFKFRocmlmdFRyYW5zcG9ydEZhY3RvcnksIHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeSwgR19UWVBFX09CSkVDVCkKLQotLyogYnVpbGRzIGEgdHJhbnNwb3J0IGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0LiAqLwotVGhyaWZ0VHJhbnNwb3J0ICoKLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQotewotICBUSFJJRlRfVU5VU0VEX1ZBUiAoZmFjdG9yeSk7Ci0gIHJldHVybiB0cmFuc3BvcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfY2xhc3NfaW5pdCAoVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzICpjbHMpCi17Ci0gIGNscy0+Z2V0X3RyYW5zcG9ydCA9IHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0OwotfQotCi1zdGF0aWMgdm9pZAotdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5X2luaXQgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnkpCi17Ci0gIFRIUklGVF9VTlVTRURfVkFSIChmYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQxOThiLi4wMDAwMDAwCi0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9ICi0jZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfSAotCi0jaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KLQotI2luY2x1ZGUgInRocmlmdF90cmFuc3BvcnQuaCIKLQotR19CRUdJTl9ERUNMUwotCi0vKiEgXGZpbGUgdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5LmgKLSAqICBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IFRyYW5zcG9ydCBGYWN0b3JpZXMuICBVc2VkIGJ5IFRocmlmdCBTZXJ2ZXJzCi0gKiAgICAgICAgIHRvIG9idGFpbiBhIGNsaWVudCB0cmFuc3BvcnQgZnJvbSBhbiBleGlzdGluZyB0cmFuc3BvcnQuICBUaGUgZGVmYXVsdAotICogICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xvbmVzIHRoZSBwcm92aWRlZCB0cmFuc3BvcnQuCi0gKi8KLQotLyogdHlwZSBtYWNyb3MgKi8KLSNkZWZpbmUgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkgKHRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHlwZSAoKSkKLSNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkpKQotI2RlZmluZSBUSFJJRlRfSVNfVFJBTlNQT1JUX0ZBQ1RPUlkob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSkpCi0jZGVmaW5lIFRIUklGVF9UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlksIFRocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcykpCi0jZGVmaW5lIFRIUklGVF9JU19UUkFOU1BPUlRfRkFDVE9SWV9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfVFJBTlNQT1JUX0ZBQ1RPUlkpKQotI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX0ZBQ1RPUllfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9UUkFOU1BPUlRfRkFDVE9SWSwgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzKSkKLQotLyogVGhyaWZ0IFRyYW5zcG9ydCBGYWN0b3J5IGluc3RhbmNlICovCi1zdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnkKLXsKLSAgR09iamVjdCBwYXJlbnQ7Ci19OwotdHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnkgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeTsKLQotLyogVGhyaWZ0IFRyYW5zcG9ydCBGYWN0b3J5IGNsYXNzICovCi1zdHJ1Y3QgX1RocmlmdFRyYW5zcG9ydEZhY3RvcnlDbGFzcwotewotICBHT2JqZWN0Q2xhc3MgcGFyZW50OwotCi0gIC8qIHZ0YWJsZSAqLwotICBUaHJpZnRUcmFuc3BvcnQgKigqZ2V0X3RyYW5zcG9ydCkgKFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKmZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQpOwotfTsKLXR5cGVkZWYgc3RydWN0IF9UaHJpZnRUcmFuc3BvcnRGYWN0b3J5Q2xhc3MgVGhyaWZ0VHJhbnNwb3J0RmFjdG9yeUNsYXNzOwotCi0vKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1RSQU5TUE9SVF9GQUNUT1JZICovCi1HVHlwZSB0aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnlfZ2V0X3R5cGUgKHZvaWQpOwotCi0vKiB2aXJ0dWFsIHB1YmxpYyBtZXRob2RzICovCi1UaHJpZnRUcmFuc3BvcnQgKnRocmlmdF90cmFuc3BvcnRfZmFjdG9yeV9nZXRfdHJhbnNwb3J0IChUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICpmYWN0b3J5LCBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7Ci0KLUdfRU5EX0RFQ0xTCi0KLSNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9GQUNUT1JZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNlNDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjAyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworCitzZXQoVEVTVF9QUkVGSVggImNfZ2xpYiIpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7Qm9vc3RfSU5DTFVERV9ESVJTfSkKKworI01ha2Ugc3VyZSBnZW4tY3BwIGFuZCBnZW4tY19nbGliIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDIHRlc3QgbGlicmFyeQorc2V0KHRlc3RnZW5jX1NPVVJDRVMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaAorKQorCithZGRfbGlicmFyeSh0ZXN0Z2VuYyBTVEFUSUMgJHt0ZXN0Z2VuY19TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Z2VuYyB0aHJpZnRfY19nbGliKQorCisKK2FkZF9leGVjdXRhYmxlKHRlc3RzZXJpYWxpemF0aW9uIHRlc3RzZXJpYWxpemF0aW9uLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHNlcmlhbGl6YXRpb24gdGVzdGdlbmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdHNlcmlhbGl6YXRpb24gdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHNlcmlhbGl6YXRpb24gQ09NTUFORCB0ZXN0c2VyaWFsaXphdGlvbikKKworYWRkX2V4ZWN1dGFibGUodGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbiB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gQ09NTUFORCB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24pCisKK2FkZF9leGVjdXRhYmxlKHRlc3R0cmFuc3BvcnRzb2NrZXQgdGVzdHRyYW5zcG9ydHNvY2tldC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3R0cmFuc3BvcnRzb2NrZXQgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHRyYW5zcG9ydHNvY2tldCBDT01NQU5EIHRlc3R0cmFuc3BvcnRzb2NrZXQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RiaW5hcnlwcm90b2NvbCB0ZXN0YmluYXJ5cHJvdG9jb2wuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0YmluYXJ5cHJvdG9jb2wgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdGJpbmFyeXByb3RvY29sIENPTU1BTkQgdGVzdGJpbmFyeXByb3RvY29sKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0Y29tcGFjdHByb3RvY29sIHRlc3Rjb21wYWN0cHJvdG9jb2wuYykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Y29tcGFjdHByb3RvY29sIHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3Rjb21wYWN0cHJvdG9jb2wgQ09NTUFORCB0ZXN0Y29tcGFjdHByb3RvY29sKQorCithZGRfZXhlY3V0YWJsZSh0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGJ1ZmZlcmVkdHJhbnNwb3J0IHRocmlmdF9jX2dsaWIpCithZGRfdGVzdChOQU1FIHRlc3RidWZmZXJlZHRyYW5zcG9ydCBDT01NQU5EIHRlc3RidWZmZXJlZHRyYW5zcG9ydCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGZyYW1lZHRyYW5zcG9ydCB0ZXN0ZnJhbWVkdHJhbnNwb3J0LmMpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGVzdGZyYW1lZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZnJhbWVkdHJhbnNwb3J0IENPTU1BTkQgdGVzdGZyYW1lZHRyYW5zcG9ydCkKKworYWRkX2V4ZWN1dGFibGUodGVzdGZkdHJhbnNwb3J0IHRlc3RmZHRyYW5zcG9ydC5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RmZHRyYW5zcG9ydCB0aHJpZnRfY19nbGliKQorYWRkX3Rlc3QoTkFNRSB0ZXN0ZmR0cmFuc3BvcnQgQ09NTUFORCB0ZXN0ZmR0cmFuc3BvcnQpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RtZW1vcnlidWZmZXIgdGVzdG1lbW9yeWJ1ZmZlci5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RtZW1vcnlidWZmZXIgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdG1lbW9yeWJ1ZmZlciBDT01NQU5EIHRlc3RtZW1vcnlidWZmZXIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RzaW1wbGVzZXJ2ZXIgdGVzdHNpbXBsZXNlcnZlci5jKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRlc3RzaW1wbGVzZXJ2ZXIgdGhyaWZ0X2NfZ2xpYikKK2FkZF90ZXN0KE5BTUUgdGVzdHNpbXBsZXNlcnZlciBDT01NQU5EIHRlc3RzaW1wbGVzZXJ2ZXIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3RkZWJ1Z3Byb3RvIHRlc3RkZWJ1Z3Byb3RvLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdGRlYnVncHJvdG8gdGVzdGdlbmMpCithZGRfdGVzdChOQU1FIHRlc3RkZWJ1Z3Byb3RvIENPTU1BTkQgdGVzdGRlYnVncHJvdG8pCisKK2FkZF9leGVjdXRhYmxlKHRlc3RvcHRpb25hbHJlcXVpcmVkIHRlc3RvcHRpb25hbHJlcXVpcmVkLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXModGVzdG9wdGlvbmFscmVxdWlyZWQgdGVzdGdlbmMpCithZGRfdGVzdChOQU1FIHRlc3RvcHRpb25hbHJlcXVpcmVkIENPTU1BTkQgdGVzdG9wdGlvbmFscmVxdWlyZWQpCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMiICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNfZ2xpYiIpCisKK2FkZF9leGVjdXRhYmxlKHRlc3R0aHJpZnR0ZXN0IHRlc3R0aHJpZnR0ZXN0LmMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0dGhyaWZ0dGVzdCB0ZXN0Z2VuYykKK2FkZF90ZXN0KE5BTUUgdGVzdHRocmlmdHRlc3QgQ09NTUFORCB0ZXN0dGhyaWZ0dGVzdCkKKworCitpZihCVUlMRF9DUFApCisKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQorCisgICAgIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgdGVzdCBsaWJyYXJ5CisgICAgc2V0KHRlc3RnZW5jX2NwcF9TT1VSQ0VTCisgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3QuaAorICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmgKKyAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKKyAgICApCisKKyAgICBhZGRfbGlicmFyeSh0ZXN0Z2VuY19jcHAgU1RBVElDICR7dGVzdGdlbmNfY3BwX1NPVVJDRVN9KQorICAgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0ZXN0Z2VuY19jcHAgdGhyaWZ0KQorCisgICAgI0hBQ0s6IHRlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcCBpbmNsdWRlcyBUaHJpZnRUZXN0Lmggd2l0aG91dCBnZW4tKi8gcHJlZml4ZXMKKyAgICAjIHNvIHdlIGluY2x1ZGUgaXQgaGVyZQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4tY3BwIiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jX2dsaWIiKQorCisgICAgYWRkX2V4ZWN1dGFibGUodGVzdHRocmlmdHRlc3RjbGllbnQgdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0ZXN0dGhyaWZ0dGVzdGNsaWVudCB0ZXN0Z2VuYyB0ZXN0Z2VuY19jcHAgJHtaTElCX0xJQlJBUklFU30pCisgICAgYWRkX3Rlc3QoTkFNRSB0ZXN0dGhyaWZ0dGVzdGNsaWVudCBDT01NQU5EIHRlc3R0aHJpZnR0ZXN0Y2xpZW50KQorCitlbmRpZihCVUlMRF9DUFApCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF9zcnYuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0VudW1UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYworICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmMKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5jCisgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaAorICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgKKyAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY19nbGliICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQKKyAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmgKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCisjIFRPRE86IEFkZCBtZW1vcnkgY2hlY2tzIHVzaW5nIGN0ZXN0X21lbWNoZWNrIG9yIHNpbWlsYXIKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9Db250YWluZXJUZXN0LnRocmlmdCBiL2xpYi9jX2dsaWIvdGVzdC9Db250YWluZXJUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTJhOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L0NvbnRhaW5lclRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAorCit0eXBlZGVmIGxpc3Q8c3RyaW5nPiBTdHJpbmdMaXN0Cit0eXBlZGVmIGxpc3Q8U3RyaW5nTGlzdD4gTGlzdFN0cmluZ0xpc3QKKworc3RydWN0IENvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyB7CisgIDE6IGxpc3Q8c3RyaW5nPiBTdHJpbmdMaXN0ID0gWyAiQXBhY2hlIiwgIlRocmlmdCIgXTsKK30KKworc2VydmljZSBDb250YWluZXJTZXJ2aWNlIHsKKyAgdm9pZCByZWNlaXZlU3RyaW5nTGlzdCgxOiBsaXN0PHN0cmluZz4gc3RyaW5nTGlzdCk7CisgIGxpc3Q8c3RyaW5nPiByZXR1cm5TdHJpbmdMaXN0KCk7CisKKyAgbGlzdDxsaXN0PHN0cmluZz4+IHJldHVybkxpc3RTdHJpbmdMaXN0KCk7CisgIExpc3RTdHJpbmdMaXN0IHJldHVyblR5cGVkZWZkTGlzdFN0cmluZ0xpc3QoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDdmMmYzZTMuLjVlOWQyZWEKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTYsMjAgKzE2LDQzIEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCiAKIFNVQkRJUlMgPQogCi1BTV9DUFBGTEFHUyA9IC1nIC1XYWxsIC1JLi4vc3JjICQoR0xJQl9DRkxBR1MpCi1BTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSBAR0NPVl9MREZMQUdTQAorQlVJTFRfU09VUkNFUyA9IFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKIAotQ0ZMQUdTID0gQEdDT1ZfQ0ZMQUdTQAotQ1hYRkxBR1MgPSAtZworQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYgorQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBcCisJQEdDT1ZfQ0ZMQUdTQAorQU1fQ1hYRkxBR1MgPSAkKEFNX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAogCiBjaGVja19QUk9HUkFNUyA9IFwKKyAgdGVzdHNlcmlhbGl6YXRpb24gXAorICB0ZXN0YXBwbGljYXRpb25leGNlcHRpb24gXAorICB0ZXN0Y29udGFpbmVydGVzdCBcCiAgIHRlc3R0cmFuc3BvcnRzb2NrZXQgXAorICB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0IFwKICAgdGVzdGJpbmFyeXByb3RvY29sIFwKKyAgdGVzdGNvbXBhY3Rwcm90b2NvbCBcCiAgIHRlc3RidWZmZXJlZHRyYW5zcG9ydCBcCiAgIHRlc3RmcmFtZWR0cmFuc3BvcnQgXAorICB0ZXN0ZmR0cmFuc3BvcnQgXAogICB0ZXN0bWVtb3J5YnVmZmVyIFwKICAgdGVzdHN0cnVjdCBcCiAgIHRlc3RzaW1wbGVzZXJ2ZXIgXApAQCAtMzgsNzEgKzYxLDEyOSBAQAogICB0ZXN0dGhyaWZ0dGVzdAogCiBpZiBXSVRIX0NQUAorICBCVUlMVF9TT1VSQ0VTICs9IGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKICAgY2hlY2tfUFJPR1JBTVMgKz0gdGVzdHRocmlmdHRlc3RjbGllbnQKIGVuZGlmCiAKK3Rlc3RzZXJpYWxpemF0aW9uX1NPVVJDRVMgPSB0ZXN0c2VyaWFsaXphdGlvbi5jCit0ZXN0c2VyaWFsaXphdGlvbl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgIGxpYnRlc3RnZW5jLmxhCisKK3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9TT1VSQ0VTID0gdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uLmMKK3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbl9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24ubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc3RydWN0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworCit0ZXN0Y29udGFpbmVydGVzdF9TT1VSQ0VTID0gdGVzdGNvbnRhaW5lcnRlc3QuYwordGVzdGNvbnRhaW5lcnRlc3RfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc3RydWN0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm9jZXNzb3IubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyLm8gXAorCSAgbGlidGVzdGdlbmMubGEKKwogdGVzdHRyYW5zcG9ydHNvY2tldF9TT1VSQ0VTID0gdGVzdHRyYW5zcG9ydHNvY2tldC5jCiB0ZXN0dHJhbnNwb3J0c29ja2V0X0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKKwordGVzdHRyYW5zcG9ydHNzbHNvY2tldF9TT1VSQ0VTID0gdGVzdHRyYW5zcG9ydHNzbHNvY2tldC5jCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwogCiB0ZXN0YmluYXJ5cHJvdG9jb2xfU09VUkNFUyA9IHRlc3RiaW5hcnlwcm90b2NvbC5jCiB0ZXN0YmluYXJ5cHJvdG9jb2xfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisKK3Rlc3Rjb21wYWN0cHJvdG9jb2xfU09VUkNFUyA9IHRlc3Rjb21wYWN0cHJvdG9jb2wuYwordGVzdGNvbXBhY3Rwcm90b2NvbF9MREFERCA9IFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zb2NrZXQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubwogCiB0ZXN0YnVmZmVyZWR0cmFuc3BvcnRfU09VUkNFUyA9IHRlc3RidWZmZXJlZHRyYW5zcG9ydC5jCiB0ZXN0YnVmZmVyZWR0cmFuc3BvcnRfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCiAKIHRlc3RmcmFtZWR0cmFuc3BvcnRfU09VUkNFUyA9IHRlc3RmcmFtZWR0cmFuc3BvcnQuYwogdGVzdGZyYW1lZHRyYW5zcG9ydF9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KKwordGVzdGZkdHJhbnNwb3J0X1NPVVJDRVMgPSB0ZXN0ZmR0cmFuc3BvcnQuYwordGVzdGZkdHJhbnNwb3J0X0xEQUREID0gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X2ZkX3RyYW5zcG9ydC5vCiAKIHRlc3RtZW1vcnlidWZmZXJfU09VUkNFUyA9IHRlc3RtZW1vcnlidWZmZXIuYwogdGVzdG1lbW9yeWJ1ZmZlcl9MREFERCA9IFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubwogCiB0ZXN0c3RydWN0X1NPVVJDRVMgPSB0ZXN0c3RydWN0LmMKIHRlc3RzdHJ1Y3RfTERBREQgPSBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8KIAogdGVzdHNpbXBsZXNlcnZlcl9TT1VSQ0VTID0gdGVzdHNpbXBsZXNlcnZlci5jCiB0ZXN0c2ltcGxlc2VydmVyX0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm9jZXNzb3IubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2wubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCi0gICAgLi4vbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vIFwKLSAgICAuLi9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXIubworICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydF9mYWN0b3J5Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm9jZXNzb3IubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfcHJvdG9jb2xfZmFjdG9yeS5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9iaW5hcnlfcHJvdG9jb2wubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyX3NvY2tldC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc2VydmVyLm8KIAogdGVzdGRlYnVncHJvdG9fU09VUkNFUyA9IHRlc3RkZWJ1Z3Byb3RvLmMKIHRlc3RkZWJ1Z3Byb3RvX0xEQUREID0gbGlidGVzdGdlbmMubGEKIAogdGVzdG9wdGlvbmFscmVxdWlyZWRfU09VUkNFUyA9IHRlc3RvcHRpb25hbHJlcXVpcmVkLmMKIHRlc3RvcHRpb25hbHJlcXVpcmVkX0xEQUREID0gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3Byb3RvY29sLm8gXAotICAgIC4uL2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfdHJhbnNwb3J0Lm8gXAogICAgIGxpYnRlc3RnZW5jLmxhCiAKIHRlc3R0aHJpZnR0ZXN0X1NPVVJDRVMgPSB0ZXN0dGhyaWZ0dGVzdC5jCi10ZXN0dGhyaWZ0dGVzdF9MREFERCA9IGxpYnRlc3RnZW5jLmxhCit0ZXN0dGhyaWZ0dGVzdF9MREFERCA9IGxpYnRlc3RnZW5jLmxhIFwKKyAgICAkKHRvcF9idWlsZGRpcikvdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIubwordGVzdHRocmlmdHRlc3RfQ0ZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL3Rlc3QvY19nbGliL3NyYyAtSS4vZ2VuLWNfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQogCiB0ZXN0dGhyaWZ0dGVzdGNsaWVudF9TT1VSQ0VTID0gdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCiB0ZXN0dGhyaWZ0dGVzdGNsaWVudF9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcCAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYiAkKEdMSUJfQ0ZMQUdTKQpAQCAtMTE2LDcgKzE5NywxMCBAQAogZW5kaWYKIAogbm9kaXN0X2xpYnRlc3RnZW5jX2xhX1NPVVJDRVMgPSBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYyBcCisgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyBcCkBAIC0xMjQsOSArMjA4LDEzIEBACiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3NlY29uZF9zZXJ2aWNlLmMgXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW51bV90ZXN0X3R5cGVzLmggXAorICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmggXApAQCAtMTM0LDkgKzIyMiwxMSBAQAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIFwKICAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3Nydi5oIFwKKyAgICAgICAgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuaCBcCiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmggXAogICAgICAgICBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oCiBsaWJ0ZXN0Z2VuY19sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9saWJ0aHJpZnRfY19nbGliLmxhCitsaWJ0ZXN0Z2VuY19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpIC1Xbm8tdW51c2VkLWZ1bmN0aW9uCiAKIG5vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCiAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXApAQCAtMTQ3LDE4ICsyMzcsMjIgQEAKICAgICAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgKIGxpYnRlc3RnZW5jcHBfbGFfQ1BQRkxBR1MgPSAtSS4uLy4uL2NwcC9zcmMgJChCT09TVF9DUFBGTEFHUykgLUkuL2dlbi1jcHAKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotZ2VuLWNfZ2xpYi90X3Rlc3RfZGVidWdfcHJvdG9fdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbXB0eV9zZXJ2aWNlLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5jIGdlbi1jX2dsaWIvdF90ZXN0X2luaGVyaXRlZC5oIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X3JldmVyc2Vfb3JkZXJfc2VydmljZS5oIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2VydmljZV9mb3JfZXhjZXB0aW9uX3dpdGhfYV9tYXAuaCBnZW4tY19nbGliL3RfdGVzdF9zcnYuYyBnZW4tY19nbGliL3RfdGVzdF9zcnYuaDogLi4vLi4vLi4vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlLmg6IENvbnRhaW5lclRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKIAotZ2VuLWNfZ2xpYi90X3Rlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuaDogLi4vLi4vLi4vdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfZW1wdHlfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2VtcHR5X3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuYyBnZW4tY19nbGliL3RfdGVzdF9pbmhlcml0ZWQuaCBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9yZXZlcnNlX29yZGVyX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF9zZXJ2aWNlX2Zvcl9leGNlcHRpb25fd2l0aF9hX21hcC5jIGdlbi1jX2dsaWIvdF90ZXN0X3NlcnZpY2VfZm9yX2V4Y2VwdGlvbl93aXRoX2FfbWFwLmggZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2Lmg6IC4uLy4uLy4uL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKIAotZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC0uaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCBnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3Rfc2VydmljZS5jIGdlbi1jX2dsaWIvdF90ZXN0X2VudW1fdGVzdF9zZXJ2aWNlLmggOiAuLi8uLi8uLi90ZXN0L0VudW1UZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0Lmg6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2dlbi1jX2dsaWIvdF90ZXN0X29wdGlvbmFsX3JlcXVpcmVkX3Rlc3RfdHlwZXMuYyBnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgJDwKKworZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5jIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmMgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCBnZW4tY19nbGliL3RfdGVzdF90aHJpZnRfdGVzdC5oIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmg6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIGNfZ2xpYiAkPAorCitnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHA6IC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgJChUSFJJRlQpCiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBURVNUUyA9IFwKQEAgLTIxNCw3ICszMDgsNyBAQAogCSAgICAkeyQ8X1ZBTEdSSU5EX0xFQUtfT1BUU30gIC4vJDwKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNfZ2xpYiBnZW4tY3BwCisJJChSTSkgZ2VuLWNfZ2xpYi8qIGdlbi1jcHAvKgogCiBDTEVBTkZJTEVTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICouYmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyMywzICszMTcsOCBAQAogICAgICouZ2NubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAqLmdjZGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKi5nY292CisKK0VYVFJBX0RJU1QgPSBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIENvbnRhaW5lclRlc3QudGhyaWZ0CisKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YXBwbGljYXRpb25leGNlcHRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWUzOWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOworCisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUSFJJRlRfSVNfQVBQTElDQVRJT05fRVhDRVBUSU9OIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9pbml0aWFsaXplICh2b2lkKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBnaW50MzIgdHlwZSA9IFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfSU5URVJOQUxfRVJST1I7CisgIGdjaGFyICptZXNzYWdlID0gIkV4Y2VwdGlvbiBtZXNzYWdlIjsKKyAgZ2ludDMyIHJldHJpZXZlZF90eXBlID0gMDsKKyAgZ2NoYXIgKnJldHJpZXZlZF9tZXNzYWdlID0gTlVMTDsKKworICAvKiBBIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uIGhhcyAidHlwZSIgYW5kICJtZXNzYWdlIiBwcm9wZXJ0aWVzIHRoYXQgY2FuCisgICAgIGJlIGluaXRpYWxpemVkIGF0IG9iamVjdCBjcmVhdGlvbiAqLworICB4Y2VwdGlvbiA9CisgICAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAidHlwZSIsICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoeGNlcHRpb24gIT0gTlVMTCk7CisKKyAgLyogQSBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbidzIHByb3BlcnRpZXMgY2FuIGJlIHJldHJpZXZlZCAqLworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLAorICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgJnJldHJpZXZlZF90eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJnJldHJpZXZlZF9tZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChyZXRyaWV2ZWRfdHlwZSA9PSB0eXBlKTsKKyAgZ19hc3NlcnQgKHJldHJpZXZlZF9tZXNzYWdlICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBzdHIgKHJldHJpZXZlZF9tZXNzYWdlLCA9PSwgbWVzc2FnZSk7CisKKyAgZ19mcmVlIChyZXRyaWV2ZWRfbWVzc2FnZSk7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3Byb3BlcnRpZXNfdGVzdCAodm9pZCkKK3sKKyAgVGhyaWZ0QXBwbGljYXRpb25FeGNlcHRpb24gKnhjZXB0aW9uID0gTlVMTDsKKyAgZ2ludDMyIHJldHJpZXZlZF90eXBlOworCisgIHhjZXB0aW9uID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sIE5VTEwpOworCisjZGVmaW5lIFRFU1RfVFlQRV9WQUxVRShfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXRyaWV2ZWRfdHlwZSA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgInR5cGUiLCBfdHlwZSwgTlVMTCk7ICAgICAgICAgICAgICAgICBcCisgIGdfb2JqZWN0X2dldCAoeGNlcHRpb24sICJ0eXBlIiwgJnJldHJpZXZlZF90eXBlLCBOVUxMKTsgICAgICAgXAorICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLCA9PSwgX3R5cGUpOworCisgIC8qIFRoZSAidHlwZSIgcHJvcGVydHkgY2FuIGJlIHNldCB0byBhbnkgdmFsaWQgVGhyaWZ0IGV4Y2VwdGlvbiB0eXBlICovCisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9VTktOT1dOKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV05fTUVUSE9EKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0lOVkFMSURfTUVTU0FHRV9UWVBFKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1dST05HX01FVEhPRF9OQU1FKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX0JBRF9TRVFVRU5DRV9JRCk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9NSVNTSU5HX1JFU1VMVCk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlRFUk5BTF9FUlJPUik7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9QUk9UT0NPTF9FUlJPUik7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1RSQU5TRk9STSk7CisgIFRFU1RfVFlQRV9WQUxVRSAoVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9JTlZBTElEX1BST1RPQ09MKTsKKyAgVEVTVF9UWVBFX1ZBTFVFIChUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOU1VQUE9SVEVEX0NMSUVOVF9UWVBFKTsKKworLyogImdfdGVzdF9leHBlY3RfbWVzc2FnZSIgaXMgcmVxdWlyZWQgZm9yIHRoZSBwcm9wZXJ0eSByYW5nZSB0ZXN0cyBiZWxvdyBidXQgaXMKKyAgIG5vdCBwcmVzZW50IGluIEdMaWIgYmVmb3JlIHZlcnNpb24gMi4zNCAqLworI2lmIChHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM0LCAwKSkKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAidHlwZSIsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBUaGUgInR5cGUiIHByb3BlcnR5IGNhbm5vdCBiZSBzZXQgdG8gYSB2YWx1ZSB0b28gbG93IChsZXNzIHRoYW4gemVybykgKi8KKyAgZ190ZXN0X2V4cGVjdF9tZXNzYWdlICgiR0xpYi1HT2JqZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHX0xPR19MRVZFTF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZSpvdXQgb2YgcmFuZ2UqdHlwZSoiKTsKKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAtMSwgTlVMTCk7CisgIGdfdGVzdF9hc3NlcnRfZXhwZWN0ZWRfbWVzc2FnZXMgKCk7CisKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAmcmV0cmlldmVkX3R5cGUsIE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLCAhPSwgLTEpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLAorICAgICAgICAgICAgICAgICAgID09LAorICAgICAgICAgICAgICAgICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTik7CisKKyAgLyogVGhlICJ0eXBlIiBwcm9wZXJ0eSBjYW5ub3QgYmUgc2V0IHRvIGEgdmFsdWUgdG9vIGhpZ2ggKGdyZWF0ZXIgdGhhbiB0aGUKKyAgICAgaGlnaGVzdCBkZWZpbmVkIGV4Y2VwdGlvbi10eXBlIHZhbHVlKSAqLworICBnX3Rlc3RfZXhwZWN0X21lc3NhZ2UgKCJHTGliLUdPYmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdfTE9HX0xFVkVMX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlKm91dCBvZiByYW5nZSp0eXBlKiIpOworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAidHlwZSIsIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfTiwgTlVMTCk7CisgIGdfdGVzdF9hc3NlcnRfZXhwZWN0ZWRfbWVzc2FnZXMgKCk7CisKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgInR5cGUiLCAmcmV0cmlldmVkX3R5cGUsIE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKHJldHJpZXZlZF90eXBlLCAhPSwgVEhSSUZUX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl9FUlJPUl9OKTsKKyAgZ19hc3NlcnRfY21waW50IChyZXRyaWV2ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICA9PSwKKyAgICAgICAgICAgICAgICAgICBUSFJJRlRfQVBQTElDQVRJT05fRVhDRVBUSU9OX0VSUk9SX1VOS05PV04pOworI2VuZGlmCisKKyAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcHJvcGVydGllc19tZXNzYWdlICh2b2lkKQoreworICBUaHJpZnRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqeGNlcHRpb24gPSBOVUxMOworICBnY2hhciAqbWVzc2FnZSA9ICJFeGNlcHRpb24gbWVzc2FnZSI7CisgIGdjaGFyICpyZXRyaWV2ZWRfbWVzc2FnZTsKKworICB4Y2VwdGlvbiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQVBQTElDQVRJT05fRVhDRVBUSU9OLCBOVUxMKTsKKworICAvKiBUaGUgIm1lc3NhZ2UiIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gTlVMTCAqLworICBnX29iamVjdF9zZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKHhjZXB0aW9uLCAibWVzc2FnZSIsICZyZXRyaWV2ZWRfbWVzc2FnZSwgTlVMTCk7CisgIGdfYXNzZXJ0IChyZXRyaWV2ZWRfbWVzc2FnZSA9PSBOVUxMKTsKKworICAvKiBUaGUgIm1lc3NhZ2UiIHByb3BlcnR5IGNhbiBiZSBzZXQgdG8gYSB2YWxpZCBzdHJpbmcgKi8KKyAgZ19vYmplY3Rfc2V0ICh4Y2VwdGlvbiwgIm1lc3NhZ2UiLCBtZXNzYWdlLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0ICh4Y2VwdGlvbiwgIm1lc3NhZ2UiLCAmcmV0cmlldmVkX21lc3NhZ2UsIE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKHN0cmNtcCAocmV0cmlldmVkX21lc3NhZ2UsIG1lc3NhZ2UpLCA9PSwgMCk7CisKKyAgZ19mcmVlIChyZXRyaWV2ZWRfbWVzc2FnZSk7CisgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKKyAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9DcmVhdGVBbmREZXN0cm95IiwKKyAgICB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YXBwbGljYXRpb25leGNlcHRpb24vSW5pdGlhbGl6ZSIsCisgICAgdGVzdF9pbml0aWFsaXplKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9Qcm9wZXJ0aWVzL3Rlc3QiLAorICAgIHRlc3RfcHJvcGVydGllc190ZXN0KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RhcHBsaWNhdGlvbmV4Y2VwdGlvbi9Qcm9wZXJ0aWVzL21lc3NhZ2UiLAorICAgIHRlc3RfcHJvcGVydGllc19tZXNzYWdlKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGEwNzExOGYuLjE0ZjRmYjAKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYwpAQCAtMTcsMjIgKzE3LDMxIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvKiBEaXNhYmxlIHN0cmluZy1mdW5jdGlvbiBvcHRpbWl6YXRpb25zIHdoZW4gZ2xpYmMgaXMgdXNlZCwgYXMgdGhlc2UgcHJvZHVjZQorICAgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgc3RyaW5nIGxlbmd0aCB3aGVuIGEgc3RyaW5nIGZ1bmN0aW9uIGlzIHVzZWQgaW5zaWRlCisgICBhIGNhbGwgdG8gZ19hc3NlcnQgKCkgKi8KKyNpZmRlZiBfX0dMSUJDX18KKyNpbmNsdWRlIDxmZWF0dXJlcy5oPgorI2RlZmluZSBfX05PX1NUUklOR19JTkxJTkVTIDEKKyNlbmRpZgorCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KIAogI2RlZmluZSBURVNUX0JPT0wgVFJVRQogI2RlZmluZSBURVNUX0JZVEUgMTIzCiAjZGVmaW5lIFRFU1RfSTE2IDEyMzQ1CiAjZGVmaW5lIFRFU1RfSTMyIDEyMzQ1Njc4OTAKLSNkZWZpbmUgVEVTVF9JNjQgMTIzNDU2Nzg5MDEyMzQ1TEwKKyNkZWZpbmUgVEVTVF9JNjQgR19HSU5UNjRfQ09OU1RBTlQgKDEyMzQ1Njc4OTAxMjM0NSkKICNkZWZpbmUgVEVTVF9ET1VCTEUgMTIzNDU2Nzg5MC4xMjMKICNkZWZpbmUgVEVTVF9TVFJJTkcgInRoaXMgaXMgYSB0ZXN0IHN0cmluZyAxMjM0NTY3ODkwIUAjJCVeJiooKSIKICNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CkBAIC00MSwxNCArNTAsMTQgQEAKIHN0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogZ2ludDMyCi1teV90aHJpZnRfdHJhbnNwb3J0X3JlYWQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK215X3RocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIGlmICh0cmFuc3BvcnRfcmVhZF9jb3VudCAhPSB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdAogICAgICAgJiYgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPT0gMCkKICAgewogICAgIHRyYW5zcG9ydF9yZWFkX2NvdW50Kys7Ci0gICAgcmV0dXJuIHRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIGxlbiwgZXJyb3IpOworICAgIHJldHVybiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7CiAgIH0KICAgcmV0dXJuIC0xOwogfQpAQCAtNjksMTQgKzc4LDE1IEBACiAgIHJldHVybiBGQUxTRTsKIH0KIAotI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkCisjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAogI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIG15X3RocmlmdF90cmFuc3BvcnRfd3JpdGUKLSNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYyIKLSN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3JlYWQKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMiCisjdW5kZWYgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAogI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfd3JpdGUKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9wcmltaXRpdmVzIChjb25zdCBpbnQgcG9ydCk7CiBzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKGNvbnN0IGludCBwb3J0KTsKIAogc3RhdGljIHZvaWQKIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCkBAIC04NSw3ICs5NSw3IEBACiAKICAgLyogY3JlYXRlIGFuIG9iamVjdCBhbmQgdGhlbiBkZXN0cm95IGl0ICovCiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC05OSwxMSArMTA5LDExIEBACiAgIC8qIGNyZWF0ZSBhIFRocmlmdFRyYW5zcG9ydCAqLwogICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsKLSAgYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5UHJvdG9jb2wgdXNpbmcgdGhlIFRyYW5zcG9ydCAqLwogICBwcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwotICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAgIC8qIGZldGNoIHRoZSBwcm9wZXJ0aWVzICovCiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QocHJvdG9jb2wpLCAidHJhbnNwb3J0IiwgJnRlbXAsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAodGVtcCk7CkBAIC0xMjgsNyArMTM4LDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTE0NCw0NyArMTU0LDQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCiAgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlIGVycm9ycyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTE5Miw4ICsyMDMsOCBAQAogICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtMjEwLDcgKzIyMSw3IEBACiAKICAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC0yMjYsMzMgKzIzNywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAogICAgIC8qIGNyZWF0ZSBhIFRocmlmdEJpbmFyeVRyYW5zcG9ydCAqLwogICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKICAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGIpOwotICAgIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogCiAgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCB3cml0ZSBlcnJvciAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsIAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC0yNjAsMTIgKzI3MSwxMiBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlX2ZpZWxkX3N0b3AgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CiAKICAgICAvKiB3cml0ZSBhIG1hcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKQEAgLTI3NiwyMSArMjg3LDIxIEBACiAKICAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9WT0lELCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICAvKiB0ZXN0IDNyZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAyOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTMwMCw5ICszMTEsOSBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEwLCBOVUxMKTsKIAogICAgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbGlzdCAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfVk9JRCwgTlVMTCk7CkBAIC0zMTMsMjcgKzMyNCwyNyBAQAogCiAgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3Igb24gYSBsaXN0ICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogaW52YWxpZCB2ZXJzaW9uICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0xLCBOVUxMKSA+IDApOwogCiAgICAgLyogc3ogPiAwIGZvciBhIG1lc3NhZ2UgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKSA+IDApOwogCiAgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDB4ODAwMTAwMDAsIE5VTEwpOwpAQCAtMzQ4LDI2ICszNTksMjYgQEAKICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICJ0ZXN0IiwgTlVMTCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPiAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBzZW5kIGJyb2tlbiB3cml0ZXMgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDM7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTM3NSw4ICszODYsOTUgQEAKICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKICAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICpmdCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YiA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdwb2ludGVyIGJpbmFyeSA9IChncG9pbnRlciAqKSBURVNUX1NUUklORzsKKyAgY29uc3QgZ3VpbnQzMiBsZW4gPSBzdHJsZW4gKFRFU1RfU1RSSU5HKTsKKyAgaW50IHBvcnQgPSBURVNUX1BPUlQ7CisKKyAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgIHsKKyAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgdGhyaWZ0X3NlcnZlcl9tYW55X2ZyYW1lcyAocG9ydCk7CisgICAgZXhpdCAoMCk7CisgIH0gZWxzZSB7CisgICAgLyogcGFyZW50LiAgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkLiAqLworICAgIHNsZWVwICgxKTsKKworICAgIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLworICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKworICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgICAgZ19hc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGZ0KTsKKworICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICAgIC8qIGNyZWF0ZSBhIGJpbmFyeSBwcm90b2NvbCAqLworICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfRE9VQkxFLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAvKiBjbGVhbiB1cCAqLworICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19vYmplY3RfdW5yZWYgKGZ0KTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRiKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKQEAgLTM5NSw2ICs0OTMsNyBAQAogICBnaW50NjQgdmFsdWVfNjQgPSAwOwogICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKICAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKICAgZ3VpbnQzMiBsZW4gPSAwOwogICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CkBAIC00MDQsNjEgKzUwMyw2OCBAQAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CiAKLSAgYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7Ci0gIGFzc2VydCAodmFsdWVfYnl0ZSA9IFRFU1RfQllURSk7Ci0gIGFzc2VydCAodmFsdWVfMTYgPSBURVNUX0kxNik7Ci0gIGFzc2VydCAodmFsdWVfMzIgPSBURVNUX0kzMik7Ci0gIGFzc2VydCAodmFsdWVfNjQgPSBURVNUX0k2NCk7Ci0gIGFzc2VydCAodmFsdWVfZG91YmxlID0gVEVTVF9ET1VCTEUpOwotICBhc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7Ci0gIGFzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKIAogICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKICAgZ19mcmVlIChiaW5hcnkpOwogCi0gIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LCAmbGVuLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV8xNiwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIApAQCAtNDk2LDcgKzYwMiw3IEBACiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwpAQCAtNTExLDcgKzYxNyw3IEBACiAKICAgLyogdGVzdCBmaXJzdCByZWFkIGVycm9yIG9uIGEgZmllbGQgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKQEAgLTUyMiw3ICs2MjgsNyBAQAogICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTM4LDcgKzY0NCw3IEBACiAgIC8qIHRlc3QgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNTQ2LDcgKzY1Miw3IEBACiAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTU1NCw3ICs2NjAsNyBAQAogICAvKiB0ZXN0IDNyZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDI7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC01NjcsNyArNjczLDcgQEAKICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOwogCiAgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKIApAQCAtNTc3LDcgKzY4Myw3IEBACiAKICAgLyogdGVzdCByZWFkIGZhaWx1cmUgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC01OTksMjMgKzcwNSwyMyBAQAogCiAgIC8qIGJyb2tlbiByZWFkICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKICAgLyogaW52YWxpZCBwcm90b2NvbCB2ZXJzaW9uICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKIAogICAvKiBzeiA+IDAgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKIAogICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CkBAIC02MjMsNyArNzI5LDcgQEAKICAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNjMxLDE5ICs3MzcsMTkgQEAKICAgLyogYnJva2VuIDNyZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsgLyogcmVhZF9zdHJpbmcgZG9lcyB0d28gcmVhZHMgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKIAotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLwogICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZlcnNpb24sIE5VTEwpOwpAQCAtNjUzLDIwICs3NTksMTAxIEBACiAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLCBOVUxMKTsKIAogICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKLSAgLy8gVE9ETzogaW52ZXN0aWdhdGUgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIC8qIFRPRE86IGludmVzdGlnYXRlIGdfb2JqZWN0X3VucmVmICh0YnApOyAqLworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdEJpbmFyeVByb3RvY29sICp0YnAgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBnYm9vbGVhbiB2YWx1ZV9ib29sZWFuID0gRkFMU0U7CisgIGdpbnQ4IHZhbHVlX2J5dGUgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwgInBvcnQiLCBwb3J0LCBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CisKKyAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRicCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJpbmFyeXByb3RvY29sL0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvSW5pdGlhbGl6ZSIsIHRlc3RfaW5pdGlhbGl6ZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlUHJpbWl0aXZlcyIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YmluYXJ5cHJvdG9jb2wvUmVhZEFuZFdyaXRlQ29tcGxleFR5cGVzIiwgdGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RiaW5hcnlwcm90b2NvbC9SZWFkQW5kV3JpdGVNYW55RnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGQwNDM0M2UuLmQwMTgwNmQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYwpAQCAtMTcsMjIgKzE3LDIxIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KIAogI2RlZmluZSBURVNUX0RBVEEgeyAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicgfQogCi0jaW5jbHVkZSAiLi4vc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIgotCi1zdGF0aWMgY29uc3QgY2hhciBURVNUX0FERFJFU1NbXSA9ICJsb2NhbGhvc3QiOwotc3RhdGljIGNvbnN0IHNob3J0IFRFU1RfUE9SVCA9IDY0NDQ0OworI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMiCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC00NCwxMCArNDMsMTAgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUIChvYmplY3QpLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOworCQkicl9idWZfc2l6ZSIsICZyX2J1Zl9zaXplLAorCQkid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTU3LDM1ICs1Niw1MiBAQAogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CiAgIEdFcnJvciAqZXJyID0gTlVMTDsKKyAgcGlkX3QgcGlkOworICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogCi0gIC8qIGNyZWF0ZSBhIFRocmlmdFNvY2tldCAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsgCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAotICAvKiBjcmVhdGUgYSBCdWZmZXJlZFRyYW5zcG9ydCB3cmFwcGVyIG9mIHRoZSBTb2NrZXQgKi8KLSAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwxKTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisJLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKIAotICAvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCS8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05OSw2MCArMTE1LDgxIEBACiAgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLwogCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAoIHBpZCA+PSAwICk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAogICBpZiAoIHBpZCA9PSAwICkKLSAgewotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIHdyaXRlIDEwIGJ5dGVzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxIGJ5dGUgYXQgYSB0aW1lICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJLyogd3JpdGUgMSBieXRlIGF0IGEgdGltZSAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwogCi0gICAgLyogb3ZlcmZsb3cgdGhlIGJ1ZmZlciAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAyLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwkvKiBvdmVyZmxvdyB0aGUgYnVmZmVyICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDIsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMSBieXRlIGFuZCBmbHVzaCAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIHdyaXRlIDEgYnl0ZSBhbmQgZmx1c2ggKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGFuZCBvdmVyZmxvdyBidWZmZXIgd2l0aCAyIHN5c3RlbSBjYWxscyAqLwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMywgTlVMTCk7CisJLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciB3aXRoIDIgc3lzdGVtIGNhbGxzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAzLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEwIGJ5dGVzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwkvKiB3cml0ZSAxMCBieXRlcyAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZm9yKGk9MDtpPHRpbWVzO2krKyl7CisgICAgICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICAgICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwogICB9CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NSwyMSArMjAyLDIxIEBACiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAKICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKwkJCSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KIAogICAvKiByZWFkIDEgYnl0ZSAqLwogICBieXRlcyA9IHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEsIE5VTEwpOwpAQCAtMTk0LDE1ICsyMzEsOTQgQEAKICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCitzdGF0aWMgdm9pZAordGVzdF93cml0ZV9mYWlsKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk4OworICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KKworICAvKiBTSUdQSVBFIHdoZW4gc2VuZCB0byBkaXNjb25uZWN0ZWQgc29ja2V0ICovCisgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworCisgICAgICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCQkgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgICAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IGluIGEgQnVmZmVyZWRUcmFuc3BvcnQgKi8KKyAgICAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKKwkJCSAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorCQkJICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKworICAgICAgLyoganVzdCBjbG9zZSBzb2NrZXQgKi8KKyAgICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOworCisKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisJLyogcmVjb2duaXplIGRpc2Nvbm5lY3Rpb24gKi8KKwlzbGVlcCgxKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOworCisJLyogd3JpdGUgMSBhbmQgZmx1c2ggKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpID09IEZBTFNFKTsKKworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0YnVmZmVyZWR0cmFuc3BvcnQvV3JpdGVGYWlsIiwgdGVzdF93cml0ZV9mYWlsKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1YWQ0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jCkBAIC0wLDAgKzEsMTI5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBEaXNhYmxlIHN0cmluZy1mdW5jdGlvbiBvcHRpbWl6YXRpb25zIHdoZW4gZ2xpYmMgaXMgdXNlZCwgYXMgdGhlc2UgcHJvZHVjZQorICAgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgc3RyaW5nIGxlbmd0aCB3aGVuIGEgc3RyaW5nIGZ1bmN0aW9uIGlzIHVzZWQgaW5zaWRlCisgICBhIGNhbGwgdG8gZ19hc3NlcnQgKCkgKi8KKyNpZiAhZGVmaW5lZChfX0FQUExFX18pICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBcCisgICAgIWRlZmluZWQoX19PcGVuQlNEX18pICYmICFkZWZpbmVkKF9fTmV0QlNEX18pCisjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgX19HTElCQ19fCisjZGVmaW5lIF9fTk9fU1RSSU5HX0lOTElORVMgMQorI2VuZGlmCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKworI2RlZmluZSBURVNUX0JPT0wgVFJVRQorI2RlZmluZSBURVNUX0JZVEUgMTIzCisjZGVmaW5lIFRFU1RfSTE2IDEyMzQ1CisjZGVmaW5lIFRFU1RfSTMyIDEyMzQ1Njc4OTAKKyNkZWZpbmUgVEVTVF9JNjQgMTIzNDU2Nzg5MDEyMzQ1CisjZGVmaW5lIFRFU1RfTkkxNiAoLTEyMzQ1KQorI2RlZmluZSBURVNUX05JMzIgKC0xMjM0NTY3ODkwKQorI2RlZmluZSBURVNUX05JNjQgKC0xMjM0NTY3ODkwMTIzNDUpCisjZGVmaW5lIFRFU1RfRE9VQkxFIDEyMzQ1Njc4OTAuMTIzCisjZGVmaW5lIFRFU1RfU1RSSU5HICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgMTIzNDU2Nzg5MCFAIyQlXiYqKCkiCisjZGVmaW5lIFRFU1RfUE9SVCA1MTE5OQorCitzdGF0aWMgaW50IHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKK3N0YXRpYyBpbnQgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworc3RhdGljIGludCB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworZ2ludDMyCitteV90aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBpZiAodHJhbnNwb3J0X3JlYWRfY291bnQgIT0gdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQKKyAgICAgICYmIHRyYW5zcG9ydF9yZWFkX2Vycm9yID09IDApCisgIHsKKyAgICB0cmFuc3BvcnRfcmVhZF9jb3VudCsrOworICAgIHJldHVybiB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfYWxsICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CitzdGF0aWMgaW50IHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworZ2Jvb2xlYW4KK215X3RocmlmdF90cmFuc3BvcnRfd3JpdGUgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBjb25zdCBncG9pbnRlciBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBndWludDMyIGxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIGlmICh0cmFuc3BvcnRfd3JpdGVfY291bnQgIT0gdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0CisgICAgICAmJiB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPT0gMCkKKyAgeworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCsrOworICAgIHJldHVybiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgbGVuLCBlcnJvcik7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCisjZGVmaW5lIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgbXlfdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbAorI2RlZmluZSB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIG15X3RocmlmdF90cmFuc3BvcnRfd3JpdGUKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jIgorI3VuZGVmIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwKKyN1bmRlZiB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXJfcHJpbWl0aXZlcyAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlcl9jb21wbGV4X3R5cGVzIChjb25zdCBpbnQgcG9ydCk7CitzdGF0aWMgdm9pZCB0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCk7CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBjcmVhdGUgYW4gb2JqZWN0IGFuZCB0aGVuIGRlc3Ryb3kgaXQgKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2luaXRpYWxpemUgKHZvaWQpCit7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBUaHJpZnRTb2NrZXQgKnRlbXAgPSBOVUxMOworCisgIC8qIGNyZWF0ZSBhIFRocmlmdFRyYW5zcG9ydCAqLworICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIDUxMTg4LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RQcm90b2NvbCB1c2luZyB0aGUgVHJhbnNwb3J0ICovCisgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOworICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgIC8qIGZldGNoIHRoZSBwcm9wZXJ0aWVzICovCisgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHByb3RvY29sKSwgInRyYW5zcG9ydCIsICZ0ZW1wLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRlbXApOworCisgIC8qIGNsZWFuIHVwIG1lbW9yeSAqLworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX3ByaW1pdGl2ZXMgKHZvaWQpCit7CisgIGludCBzdGF0dXM7CisgIHBpZF90IHBpZDsKKyAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gKGdwb2ludGVyICopIFRFU1RfU1RSSU5HOworICBndWludDMyIGxlbiA9IHN0cmxlbiAoVEVTVF9TVFJJTkcpOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0Q29tcGFjdFRyYW5zcG9ydCAqLworICAgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlIGVycm9ycyAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgYmluYXJ5IHBhcnRpYWwgZmFpbHVyZSAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3Rlc3RfcmVhZF9hbmRfd3JpdGVfY29tcGxleF90eXBlcyAodm9pZCkKK3sKKyAgaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBpbnQgcG9ydCA9IFRFU1RfUE9SVDsKKworICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgeworICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICB0aHJpZnRfc2VydmVyX2NvbXBsZXhfdHlwZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCisgICAgLyogY3JlYXRlIGEgVGhyaWZ0Q29tcGFjdFRyYW5zcG9ydCAqLworICAgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CisgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisKKyAgICAvKiB0ZXN0IHN0cnVjdHVyZXMgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gZGVsdGFzICovCisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsIDEsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDYsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3LCBOVUxMKSA9PSAxKTsKKworICAgIC8qIHRlc3QgZmllbGRzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gc3RydWN0cyAqLworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID09IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGJvb2xzICovCisKKyAgICAvKiBkZWx0YXMgKi8KKyAgICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA9PSAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTksIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCwgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworCisgICAgLyogbm8gZGVsdGFzICovCisgICAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKworICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3IgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBmaWVsZCAqLworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CisKKyAgICAvKiB0ZXN0IHdyaXRlX2ZpZWxkX3N0b3AgKi8KKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CisKKyAgICAvKiB3cml0ZSBhIG1hcCAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBtYXAtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBzaWRlICovCisKKyAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOworCisgICAgLyogdGVzdCAxc3Qgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CisKKyAgICAvKiB0ZXN0IDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIC0xMCwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRfRE9VQkxFLCBOVUxMKTsKKworICAgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gYSBzbWFsbCBsaXN0LS0tbm90aGluZyB0byBkbyBvbiBvdXIgZW5kICovCisKKyAgICAvKiB0ZXN0IDFzdCByZWFkIGZhaWx1cmUgb24gYSBiaWcgbGlzdC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgYmlnIGxpc3QgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweGYwLCBOVUxMKTsKKworICAgIC8qIHRlc3QgbmVnYXRpdmUgbGlzdCBzaXplICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHhmMCwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAtMTAsIE5VTEwpOworCisgICAgLyogdGVzdCBmaXJzdCB3cml0ZSBlcnJvciBvbiBhIHNtYWxsIGxpc3QgKi8KKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0LCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBiaWcgbGlzdCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOworCisgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3Igb24gYSBiaWcgbGlzdCAqLworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgLyogdGVzdCBzZXQgb3BlcmF0aW9uIHMqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisKKyAgICAvKiBpbnZhbGlkIHByb3RvY29sICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAwLCBOVUxMKSA+IDApOworCisgICAgLyogaW52YWxpZCB2ZXJzaW9uICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDAsIE5VTEwpID4gMCk7CisKKyAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAweDAxdSwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIDEsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICJ0ZXN0IiwgTlVMTCk7CisKKyAgICAvKiBicm9rZW4gMm5kIHJlYWQgKi8KKyAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgYnJva2VuIDNyZCByZWFkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAweDAxdSwgTlVMTCk7CisKKyAgICAvKiBzZW5kIGEgYnJva2VuIDR0aCByZWFkICovCisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsIE5VTEwpOworICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAweDAxdSwgTlVMTCk7CisgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfdmFyaW50MzIgKHRjLCAxLCBOVUxMKTsKKworICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPiAwKTsKKworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworCisgICAgLyogc2VuZCBicm9rZW4gd3JpdGVzICovCisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKKworICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CisgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CisKKyAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOworICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOworCisgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAzOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKKyAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKKworICAgIC8qIGNsZWFuIHVwICovCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX21hbnlfZnJhbWVzICh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICpmdCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGMgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSAoZ3BvaW50ZXIgKikgVEVTVF9TVFJJTkc7CisgIGNvbnN0IGd1aW50MzIgbGVuID0gc3RybGVuIChURVNUX1NUUklORyk7CisgIGludCBwb3J0ID0gVEVTVF9QT1JUOworCisgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCisgIHBpZCA9IGZvcmsgKCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CisKKyAgaWYgKHBpZCA9PSAwKQorICB7CisgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgIHRocmlmdF9zZXJ2ZXJfbWFueV9mcmFtZXMgKHBvcnQpOworICAgIGV4aXQgKDApOworICB9IGVsc2UgeworICAgIC8qIHBhcmVudC4gIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBzbGVlcCAoMSk7CisKKyAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKyAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisKKyAgICAvKiB3cmFwIGluIGEgZnJhbWVkIHRyYW5zcG9ydCAqLworICAgIGZ0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsIDEsIE5VTEwpOworICAgIGdfYXNzZXJ0IChmdCAhPSBOVUxMKTsKKyAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChmdCk7CisKKyAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisKKyAgICAvKiBjcmVhdGUgYSBjb21wYWN0IHByb3RvY29sICovCisgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIE5VTEwpOworICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworCisgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOworICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfb2JqZWN0X3VucmVmIChmdCk7CisgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICAgIGdfb2JqZWN0X3VucmVmICh0Yyk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX3ByaW1pdGl2ZXMgKGNvbnN0IGludCBwb3J0KQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgVGhyaWZ0Q29tcGFjdFByb3RvY29sICp0YyA9IE5VTEw7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbCA9IE5VTEw7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSBGQUxTRTsKKyAgZ2ludDggdmFsdWVfYnl0ZSA9IDAsCisgICAgemlnemFnX3AxNiA9IDAsIHppZ3phZ19wMzIgPSAwLCB6aWd6YWdfcDY0ID0gMCwKKyAgICB6aWd6YWdfbjE2ID0gMCwgemlnemFnX24zMiA9IDAsIHppZ3phZ19uNjQgPSAwOworICBnaW50MTYgdmFsdWVfMTYgPSAwOworICBnaW50MzIgdmFsdWVfMzIgPSAwOworICBnaW50NjQgdmFsdWVfNjQgPSAwOworICBnaW50MTYgdmFsdWVfbjE2ID0gMDsKKyAgZ2ludDMyIHZhbHVlX24zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV9uNjQgPSAwOworICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CisgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKKyAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKKyAgZ3VpbnQzMiBsZW4gPSAwOworICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CisgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV9uMTYsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV9uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AxNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjMyLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworCisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7CisgIGdfYXNzZXJ0ICh2YWx1ZV8xNiA9PSBURVNUX0kxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMTYgPT0gVEVTVF9OSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24zMiA9PSBURVNUX05JMzIpOworICBnX2Fzc2VydCAodmFsdWVfbjY0ID09IFRFU1RfTkk2NCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDE2ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3AzMiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wNjQgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjE2ID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX24zMiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uNjQgPT0gMyk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9kb3VibGUgPT0gVEVTVF9ET1VCTEUpOworICBnX2Fzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoIiIsIGVtcHR5X3N0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKworICBnX2ZyZWUgKHN0cmluZyk7CisgIGdfZnJlZSAoZW1wdHlfc3RyaW5nKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYnl0ZSwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV8xNiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX24xNiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV9uNjQsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiB0ZXN0IHBhcnRpYWwgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRjKTsKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfY29tcGxleF90eXBlcyAoY29uc3QgaW50IHBvcnQpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBUaHJpZnRDb21wYWN0UHJvdG9jb2wgKnRjID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgZ2NoYXIgKnN0cnVjdF9uYW1lID0gTlVMTDsKKyAgZ2NoYXIgKmZpZWxkX25hbWUgPSBOVUxMOworICBnY2hhciAqbWVzc2FnZV9uYW1lID0gTlVMTDsKKyAgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsIGtleV90eXBlLCB2YWx1ZV90eXBlLCBmaWVsZF90eXBlOworICBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGU7CisgIGdib29sZWFuIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgZ2ludDggdmFsdWUgPSAwOworICBnaW50MTYgZmllbGRfaWQgPSAwOworICBndWludDMyIHNpemUgPSAwOworICBnaW50MzIgc2VxaWQgPSAwOworICBnaW50OCB2ZXJzaW9uX2FuZF90eXBlID0gMDsKKyAgZ2ludDggcHJvdG9jb2xfaWQgPSAwOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOworCisgIC8qIHRlc3Qgc3RydWN0IG9wZXJhdGlvbnMgKi8KKworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsICZzdHJ1Y3RfbmFtZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGRlbHRhcyAqLworCisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMSk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTYpOworICBmaWVsZF9pZCA9IDA7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE1KTsKKyAgZmllbGRfaWQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAzMCk7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nik7CisgIGZpZWxkX2lkID0gMDsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gNDcpOworICBmaWVsZF9pZCA9IDA7CisKKyAgLyogdGVzdCBmaWVsZCBvcGVyYXRpb25zICovCisKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIHN0cnVjdHMgKi8KKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDEpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE2KTsKKyAgZmllbGRfaWQgPSAwOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfbmFtZSwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9uYW1lLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxOCk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTkpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxOCk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMjUpOworICBmaWVsZF9pZCA9IDA7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGZpZWxkX2lkID0gMDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKworICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBib29scyAqLworCisgIC8qIGRlbHRhcyAqLworICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOworICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKworICAvKiBubyBkZWx0YXMgKi8KKyAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKKworICAvKiB0ZXN0IGZpcnN0IHJlYWQgZXJyb3Igb24gYSBmaWVsZCAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOworCisgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IGZpZWxkIHN0b3AgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpOworCisgIC8qIHRlc3QgbWFwIG9wZXJhdGlvbnMgKi8KKworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAwOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gbWFwLS0tbm90aGluZyB0byBkbyBvbiBvdXIgc2lkZSAqLworCisgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgKi8KKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKKworICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworCisgIC8qIHRlc3QgbGlzdCBvcGVyYXRpb25zICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogdGVzdCBzbWFsbCBsaXN0IDFzdCByZWFkIGZhaWx1cmUgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOworCisgIC8qIHRlc3QgYmlnIGxpc3QgMXN0IHJlYWQgZmFpbHVyZSAqLworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CisKKyAgLyogdGVzdCBiaWcgbGlzdCAybmQgcmVhZCBmYWlsdXJlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLCAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiB0ZXN0IG5lZ2F0aXZlIGxpc3Qgc2l6ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIHRlc3Qgc21hbGwgbGlzdCAxc3Qgd3JpdGUgZmFpbHVyZS0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZCAqLworCisgIC8qIHRlc3QgYmlnIGxpc3QgMXN0IHdyaXRlIGZhaWx1cmUtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KKworICAvKiB0ZXN0IGJpZyBsaXN0IDJuZCB3cml0ZSBmYWlsdXJlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZSwgTlVMTCk7CisKKyAgLyogdGVzdCBzZXQgb3BlcmF0aW9ucyAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3NldF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsICZzaXplLCBOVUxMKTsKKyAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCk7CisKKyAgLyogYnJva2VuIHJlYWQgKi8KKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKKworICAvKiBpbnZhbGlkIHByb3RvY29sICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKworICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworCisgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfZnJlZSAobWVzc2FnZV9uYW1lKTsKKworICAvKiBicm9rZW4gMm5kIHJlYWQgb24gYSBtZXNzYWdlICovCisgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CisKKyAgLyogYnJva2VuIDNyZCByZWFkIG9uIGEgbWVzc2FnZSAqLworICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CisgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMjsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOworCisgIC8qIGJyb2tlbiA0dGggcmVhZCBvbiBhIG1lc3NhZ2UgKi8KKyAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOworICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDM7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKKyAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKKworICAvKiByZWFkIGEgdmFsaWQgbWVzc2FnZSAqLworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKworICAvKiBoYW5kbGUgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtZXNzYWdlICovCisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZwcm90b2NvbF9pZCwgTlVMTCk7CisKKyAgLyogaGFuZGxlIDNyZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmVyc2lvbl9hbmRfdHlwZSwgTlVMTCk7CisKKyAgLyogaGFuZGxlIDR0aCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIE5VTEwpOworICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmVyc2lvbl9hbmRfdHlwZSwgTlVMTCk7CisgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfdmFyaW50MzIgKHRjLCAmc2VxaWQsIE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc2VydmVyX21hbnlfZnJhbWVzIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIFRocmlmdENvbXBhY3RQcm90b2NvbCAqdGNwID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gTlVMTDsKKyAgZ2Jvb2xlYW4gdmFsdWVfYm9vbGVhbiA9IEZBTFNFOworICBnaW50OCB2YWx1ZV9ieXRlID0gMCwKKyAgICB6aWd6YWdfcDE2ID0gMCwgemlnemFnX3AzMiA9IDAsIHppZ3phZ19wNjQgPSAwLAorICAgIHppZ3phZ19uMTYgPSAwLCB6aWd6YWdfbjMyID0gMCwgemlnemFnX242NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV8xNiA9IDA7CisgIGdpbnQzMiB2YWx1ZV8zMiA9IDA7CisgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CisgIGdpbnQxNiB2YWx1ZV9uMTYgPSAwOworICBnaW50MzIgdmFsdWVfbjMyID0gMDsKKyAgZ2ludDY0IHZhbHVlX242NCA9IDA7CisgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKKyAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOworICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOworICBndWludDMyIGxlbiA9IDA7CisgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKKworICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULCAicG9ydCIsIHBvcnQsIE5VTEwpOworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKworICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCisgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgMSwgTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisKKyAgdGNwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOworICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGNwKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmZW1wdHlfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX24xNiA9PSBURVNUX05JMTYpOworICBnX2Fzc2VydCAodmFsdWVfbjMyID09IFRFU1RfTkkzMik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uNjQgPT0gVEVTVF9OSTY0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMTYgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDMyID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX3A2NCA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMTYgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjMyID09IDMpOworICBnX2Fzc2VydCAoemlnemFnX242NCA9PSAzKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworCisgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKGJpbmFyeSA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGxlbiA9PSAwKTsKKyAgZ19mcmVlIChiaW5hcnkpOworCisgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudCwgTlVMTCk7CisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHRjcCk7CisgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOworICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvSW5pdGlhbGl6ZSIsIHRlc3RfaW5pdGlhbGl6ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL1JlYWRBbmRXcml0ZVByaW1pdGl2ZXMiLAorICAgICAgICAgICAgICAgICAgIHRlc3RfcmVhZF9hbmRfd3JpdGVfcHJpbWl0aXZlcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0Y29tcGFjdHByb3RvY29sL1JlYWRBbmRXcml0ZUNvbXBsZXhUeXBlcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9jb21wbGV4X3R5cGVzKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3Rjb21wYWN0cHJvdG9jb2wvUmVhZEFuZFdyaXRlTWFueUZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgdGVzdF9yZWFkX2FuZF93cml0ZV9tYW55X2ZyYW1lcyk7CisKKyAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzUxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGNvbnRhaW5lcnRlc3QuYwpAQCAtMCwwICsxLDUyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oIgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2RlZmluZSBURVNUX1NFUlZFUl9IT1NUTkFNRSAibG9jYWxob3N0IgorI2RlZmluZSBURVNUX1NFUlZFUl9QT1JUICAgICA5MDkwCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICBUaGUgQ29udGFpbmVyU2VydmljZSBoYW5kbGVyIHdlJ2xsIHVzZSBmb3IgdGVzdGluZyAqLworCitHX0JFR0lOX0RFQ0xTCisKK0dUeXBlIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAodm9pZCk7CisKKyNkZWZpbmUgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgXAorICAodGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICgpKQorCisjZGVmaW5lIFRFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyKSkKKyNkZWZpbmUgVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSX0NMQVNTKGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1RFU1RfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIpKQorI2RlZmluZSBJU19URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgICAgXAorICAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSKSkKKyNkZWZpbmUgVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSX0dFVF9DTEFTUyhvYmopICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKworc3RydWN0IF9UZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgeworICBUVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyIHBhcmVudF9pbnN0YW5jZTsKKworICAvKiBwcml2YXRlICovCisgIEdQdHJBcnJheSAqc3RyaW5nX2xpc3Q7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX1Rlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXI7CisKK3N0cnVjdCBfVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MgeworICBUVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MgcGFyZW50X2NsYXNzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzcworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXJDbGFzczsKKworR19FTkRfREVDTFMKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworR19ERUZJTkVfVFlQRSAoVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyLAorICAgICAgICAgICAgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyLAorICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfQ09OVEFJTkVSX1NFUlZJQ0VfSEFORExFUikKKworLyogQSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBhcHBlbmQgY29waWVzIG9mIHN0cmluZ3MgdG8gYSBzdHJpbmcgbGlzdCAqLworc3RhdGljIHZvaWQgYXBwZW5kX3N0cmluZ190b19wdHJfYXJyYXkgKGdwb2ludGVyIGVsZW1lbnQsIGdwb2ludGVyIHB0cl9hcnJheSkKK3sKKyAgZ19wdHJfYXJyYXlfYWRkICgoR1B0ckFycmF5ICopcHRyX2FycmF5LCBnX3N0cmR1cCAoKGdjaGFyICopZWxlbWVudCkpOworfQorCisvKiBBY2NlcHQgYSBzdHJpbmcgbGlzdCBmcm9tIHRoZSBjbGllbnQgYW5kIGFwcGVuZCBpdHMgY29udGVudHMgdG8gb3VyIGludGVybmFsCisgICBsaXN0ICovCitzdGF0aWMgZ2Jvb2xlYW4KK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZWNlaXZlX3N0cmluZ19saXN0IChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1B0ckFycmF5ICpzdHJpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKGlmYWNlKTsKKworICAvKiBBcHBlbmQgdGhlIGNsaWVudCdzIHN0cmluZ3MgdG8gb3VyIG93biBpbnRlcm5hbCBzdHJpbmcgbGlzdCAqLworICBnX3B0cl9hcnJheV9mb3JlYWNoICgoR1B0ckFycmF5ICopc3RyaW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3N0cmluZ190b19wdHJfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnN0cmluZ19saXN0KTsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCisvKiBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIG91ciBpbnRlcm5hbCBzdHJpbmcgbGlzdCB0byB0aGUgY2xpZW50ICovCitzdGF0aWMgZ2Jvb2xlYW4KK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fc3RyaW5nX2xpc3QgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQdHJBcnJheSAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChpZmFjZSk7CisKKyAgLyogUmV0dXJuIChjb3BpZXMgb2YpIHRoZSBzdHJpbmdzIGNvbnRhaW5lZCBpbiBvdXIgbGlzdCAqLworICBnX3B0cl9hcnJheV9mb3JlYWNoIChzZWxmLT5zdHJpbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3N0cmluZ190b19wdHJfYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICpfcmV0dXJuKTsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgZ2Jvb2xlYW4KK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdCAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUHRyQXJyYXkgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChpZmFjZSk7CisgIEdQdHJBcnJheSAqbmVzdGVkX2xpc3Q7CisKKyAgLyogUmV0dXJuIGEgbGlzdCBjb250YWluaW5nIG91ciBsaXN0IG9mIHN0cmluZ3MgKi8KKyAgbmVzdGVkX2xpc3QKKyAgICA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KWdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChuZXN0ZWRfbGlzdCwgc2VsZi0+c3RyaW5nX2xpc3QpOworICBnX3B0cl9hcnJheV9yZWYgKHNlbGYtPnN0cmluZ19saXN0KTsKKworICBnX3B0cl9hcnJheV9hZGQgKCpfcmV0dXJuLCBuZXN0ZWRfbGlzdCk7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGdib29sZWFuCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3QgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICppZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRlc3RMaXN0U3RyaW5nTGlzdCAqKl9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUZXN0Q29udGFpbmVyU2VydmljZUhhbmRsZXIgKnNlbGYgPSBURVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVIgKGlmYWNlKTsKKyAgVFRlc3RTdHJpbmdMaXN0ICpuZXN0ZWRfbGlzdDsKKworICAvKiBSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgb3VyIGxpc3Qgb2Ygc3RyaW5ncyAqLworICBuZXN0ZWRfbGlzdAorICAgID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgoR0Rlc3Ryb3lOb3RpZnkpZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKG5lc3RlZF9saXN0LCBzZWxmLT5zdHJpbmdfbGlzdCk7CisgIGdfcHRyX2FycmF5X3JlZiAoc2VsZi0+c3RyaW5nX2xpc3QpOworCisgIGdfcHRyX2FycmF5X2FkZCAoKl9yZXR1cm4sIG5lc3RlZF9saXN0KTsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpIHsKKyAgVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmID0gVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSIChvYmplY3QpOworCisgIC8qIERlc3Ryb3kgb3VyIGludGVybmFsIGNvbnRhaW5lcnMgKi8KKyAgZ19wdHJfYXJyYXlfdW5yZWYgKHNlbGYtPnN0cmluZ19saXN0KTsKKyAgc2VsZi0+c3RyaW5nX2xpc3QgPSBOVUxMOworCisgIEdfT0JKRUNUX0NMQVNTICh0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcGFyZW50X2NsYXNzKS0+CisgICAgZmluYWxpemUgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfaW5pdCAoVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyICpzZWxmKQoreworICAvKiBDcmVhdGUgb3VyIGludGVybmFsIGNvbnRhaW5lcnMgKi8KKyAgc2VsZi0+c3RyaW5nX2xpc3QgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKGdfZnJlZSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfY2xhc3NfaW5pdCAoVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MgKmtsYXNzKQoreworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoa2xhc3MpOworICBUVGVzdENvbnRhaW5lclNlcnZpY2VIYW5kbGVyQ2xhc3MgKnBhcmVudF9jbGFzcyA9CisgICAgVF9URVNUX0NPTlRBSU5FUl9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MgKGtsYXNzKTsKKworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9maW5hbGl6ZTsKKworICBwYXJlbnRfY2xhc3MtPnJlY2VpdmVfc3RyaW5nX2xpc3QgPQorICAgIHRlc3RfY29udGFpbmVyX3NlcnZpY2VfaGFuZGxlcl9yZWNlaXZlX3N0cmluZ19saXN0OworICBwYXJlbnRfY2xhc3MtPnJldHVybl9zdHJpbmdfbGlzdCA9CisgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl9zdHJpbmdfbGlzdDsKKyAgcGFyZW50X2NsYXNzLT5yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdCA9CisgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9oYW5kbGVyX3JldHVybl9saXN0X3N0cmluZ19saXN0OworICBwYXJlbnRfY2xhc3MtPnJldHVybl90eXBlZGVmZF9saXN0X3N0cmluZ19saXN0ID0KKyAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2hhbmRsZXJfcmV0dXJuX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3Q7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE91ciB0ZXN0IHNlcnZlciwgZGVjbGFyZWQgZ2xvYmFsbHkgc28gd2UgY2FuIGFjY2VzcyBpdCB3aXRoaW4gYSBzaWduYWwKKyAgIGhhbmRsZXIgKi8KK1RocmlmdFNlcnZlciAqc2VydmVyID0gTlVMTDsKKworLyogQSBzaWduYWwgaGFuZGxlciB1c2VkIHRvIGRldGVjdCB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzICh0aGUgdGVzdCBzdWl0ZSkgaGFzCisgICBleGl0ZWQgc28gd2Uga25vdyB0byBzaHV0IGRvd24gdGhlIHNlcnZlciBhbmQgdGVybWluYXRlIG91cnNlbHZlcyAqLworc3RhdGljIHZvaWQKK3NpZ2NobGRfaGFuZGxlciAoaW50IHNpZ25hbF9udW1iZXIpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChzaWduYWxfbnVtYmVyKTsKKworICAvKiBUaGUgY2hpbGQgcHJvY2VzcyAodGhlIHRlc3RzKSBoYXMgZXhpdGVkIG9yIGJlZW4gdGVybWluYXRlZDsgc2h1dCBkb3duIHRoZQorICAgICBzZXJ2ZXIgZ3JhY2VmdWxseSAqLworICBpZiAoc2VydmVyICE9IE5VTEwpCisgICAgdGhyaWZ0X3NlcnZlcl9zdG9wIChzZXJ2ZXIpOworfQorCisvKiBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIGEgdGVzdCBjYXNlIGFnYWluc3QgYSBuZXdseSBjb25zdHJ1Y3RlZAorICAgc2VydmljZSBjbGllbnQgKi8KK3N0YXRpYyB2b2lkCitleGVjdXRlX3dpdGhfc2VydmljZV9jbGllbnQgKHZvaWQgKCp0ZXN0X2Nhc2UpKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKikpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0OworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sOworCisgIFRUZXN0Q29udGFpbmVyU2VydmljZUlmICpjbGllbnQ7CisKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgLyogQ3JlYXRlIGEgY2xpZW50IHdpdGggd2hpY2ggdG8gYWNjZXNzIHRoZSBzZXJ2ZXIgKi8KKyAgc29ja2V0ICAgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgVEVTVF9TRVJWRVJfSE9TVE5BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgVEVTVF9TRVJWRVJfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgcHJvdG9jb2wgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycm9yKTsKKyAgZ19hc3NlcnRfbm9fZXJyb3IgKGVycm9yKTsKKworICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0NPTlRBSU5FUl9TRVJWSUNFX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIC8qIEV4ZWN1dGUgdGhlIHRlc3QgYWdhaW5zdCB0aGlzIGNsaWVudCAqLworICAoKnRlc3RfY2FzZSkoY2xpZW50LCAmZXJyb3IpOworICBnX2Fzc2VydF9ub19lcnJvciAoZXJyb3IpOworCisgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCisgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgIGdfb2JqZWN0X3VucmVmIChwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICBnX29iamVjdF91bnJlZiAoc29ja2V0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyc193aXRoX2RlZmF1bHRfdmFsdWVzICh2b2lkKQoreworICBUVGVzdENvbnRhaW5lcnNXaXRoRGVmYXVsdFZhbHVlcyAqZGVmYXVsdF92YWx1ZXM7CisgIEdQdHJBcnJheSAqc3RyaW5nX2xpc3Q7CisKKyAgLyogRmV0Y2ggYSBuZXcgQ29udGFpbmVyc1dpdGhEZWZhdWx0VmFsdWVzIHN0cnVjdCBhbmQgaXRzIFN0cmluZ0xpc3QgbWVtYmVyICovCisgIGRlZmF1bHRfdmFsdWVzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9DT05UQUlORVJTX1dJVEhfREVGQVVMVF9WQUxVRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChkZWZhdWx0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAiU3RyaW5nTGlzdCIsICZzdHJpbmdfbGlzdCwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIGxpc3QgaGFzIGJlZW4gcG9wdWxhdGVkIHdpdGggaXRzIGRlZmF1bHQgdmFsdWVzICovCisgIGdfYXNzZXJ0X2NtcGludCAoc3RyaW5nX2xpc3QtPmxlbiwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBzdHIgKCgoZ2NoYXIgKiopc3RyaW5nX2xpc3QtPnBkYXRhKVswXSwgPT0sICJBcGFjaGUiKTsKKyAgZ19hc3NlcnRfY21wc3RyICgoKGdjaGFyICoqKXN0cmluZ19saXN0LT5wZGF0YSlbMV0sID09LCAiVGhyaWZ0Iik7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKHN0cmluZ19saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKGRlZmF1bHRfdmFsdWVzKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3RfaW5uZXIgKFRUZXN0Q29udGFpbmVyU2VydmljZUlmICpjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2NoYXIgKnRlc3RfZGF0YVtdID0geyAib25lIiwgInR3byIsICJ0aHJlZSIgfTsKKworICBHUHRyQXJyYXkgKm91dGdvaW5nX3N0cmluZ19saXN0OworICBHUHRyQXJyYXkgKmluY29taW5nX3N0cmluZ19saXN0OworICBndWludCBpbmRleDsKKworICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisKKyAgLyogUHJlcGFyZSBvdXIgdGVzdCBkYXRhIChvdXIgc3RyaW5nIGxpc3QgdG8gc2VuZCkgKi8KKyAgb3V0Z29pbmdfc3RyaW5nX2xpc3QgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDM7IGluZGV4ICs9IDEpCisgICAgZ19wdHJfYXJyYXlfYWRkIChvdXRnb2luZ19zdHJpbmdfbGlzdCwgJnRlc3RfZGF0YVtpbmRleF0pOworCisgIC8qIFNlbmQgb3VyIGRhdGEgdG8gdGhlIHNlcnZlciBhbmQgbWFrZSBzdXJlIHdlIGdldCB0aGUgc2FtZSBkYXRhIGJhY2sgb24KKyAgICAgcmV0cmlldmUgKi8KKyAgZ19hc3NlcnQKKyAgICAodF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2NsaWVudF9yZWNlaXZlX3N0cmluZ19saXN0IChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Z29pbmdfc3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpICYmCisgICAgICplcnJvciA9PSBOVUxMKTsKKworICBpbmNvbWluZ19zdHJpbmdfbGlzdCA9IGdfcHRyX2FycmF5X25ldyAoKTsKKyAgZ19hc3NlcnQKKyAgICAodF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2NsaWVudF9yZXR1cm5fc3RyaW5nX2xpc3QgKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNvbWluZ19zdHJpbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKSAmJgorICAgICAqZXJyb3IgPT0gTlVMTCk7CisKKyAgLyogTWFrZSBzdXJlIHRoZSB0d28gbGlzdHMgYXJlIGVxdWl2YWxlbnQgKi8KKyAgZ19hc3NlcnRfY21waW50IChpbmNvbWluZ19zdHJpbmdfbGlzdC0+bGVuLCA9PSwgb3V0Z29pbmdfc3RyaW5nX2xpc3QtPmxlbik7CisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGluY29taW5nX3N0cmluZ19saXN0LT5sZW47IGluZGV4ICs9IDEpCisgICAgZ19hc3NlcnRfY21wc3RyICgoKGdjaGFyICoqKWluY29taW5nX3N0cmluZ19saXN0LT5wZGF0YSlbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgPT0sCisgICAgICAgICAgICAgICAgICAgICAoKGdjaGFyICoqKW91dGdvaW5nX3N0cmluZ19saXN0LT5wZGF0YSlbaW5kZXhdKTsKKworICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworICBnX3B0cl9hcnJheV91bnJlZiAoaW5jb21pbmdfc3RyaW5nX2xpc3QpOworICBnX3B0cl9hcnJheV91bnJlZiAob3V0Z29pbmdfc3RyaW5nX2xpc3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9zdHJpbmdfbGlzdCAodm9pZCkKK3sKKyAgICBleGVjdXRlX3dpdGhfc2VydmljZV9jbGllbnQgKHRlc3RfY29udGFpbmVyX3NlcnZpY2Vfc3RyaW5nX2xpc3RfaW5uZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jb250YWluZXJfc2VydmljZV9saXN0X3N0cmluZ19saXN0X2lubmVyIChUVGVzdENvbnRhaW5lclNlcnZpY2VJZiAqY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgR1B0ckFycmF5ICppbmNvbWluZ19saXN0OworICBHUHRyQXJyYXkgKm5lc3RlZF9saXN0OworCisgIGdfY2xlYXJfZXJyb3IgKGVycm9yKTsKKworICAvKiBSZWNlaXZlIGEgbGlzdCBvZiBzdHJpbmcgbGlzdHMgZnJvbSB0aGUgc2VydmVyICovCisgIGluY29taW5nX2xpc3QgPQorICAgIGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoKEdEZXN0cm95Tm90aWZ5KWdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19hc3NlcnQKKyAgICAodF90ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2NsaWVudF9yZXR1cm5fbGlzdF9zdHJpbmdfbGlzdCAoY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5jb21pbmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpICYmCisgICAgICplcnJvciA9PSBOVUxMKTsKKworICAvKiBNYWtlIHN1cmUgdGhlIGxpc3QgYW5kIGl0cyBjb250ZW50cyBhcmUgdmFsaWQgKi8KKyAgZ19hc3NlcnRfY21waW50IChpbmNvbWluZ19saXN0LT5sZW4sID4sIDApOworCisgIG5lc3RlZF9saXN0ID0gKEdQdHJBcnJheSAqKWdfcHRyX2FycmF5X2luZGV4IChpbmNvbWluZ19saXN0LCAwKTsKKyAgZ19hc3NlcnQgKG5lc3RlZF9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKG5lc3RlZF9saXN0LT5sZW4sID49LCAwKTsKKworICAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworICBnX3B0cl9hcnJheV91bnJlZiAoaW5jb21pbmdfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX2xpc3Rfc3RyaW5nX2xpc3QgKHZvaWQpCit7CisgIGV4ZWN1dGVfd2l0aF9zZXJ2aWNlX2NsaWVudCAodGVzdF9jb250YWluZXJfc2VydmljZV9saXN0X3N0cmluZ19saXN0X2lubmVyKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdF9pbm5lciAoVFRlc3RDb250YWluZXJTZXJ2aWNlSWYgKmNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRUZXN0TGlzdFN0cmluZ0xpc3QgKmluY29taW5nX2xpc3Q7CisgIFRUZXN0U3RyaW5nTGlzdCAqbmVzdGVkX2xpc3Q7CisKKyAgZ19jbGVhcl9lcnJvciAoZXJyb3IpOworCisgIC8qIFJlY2VpdmUgYSBsaXN0IG9mIHN0cmluZyBsaXN0cyBmcm9tIHRoZSBzZXJ2ZXIgKi8KKyAgaW5jb21pbmdfbGlzdCA9CisgICAgZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jICgoR0Rlc3Ryb3lOb3RpZnkpZ19wdHJfYXJyYXlfdW5yZWYpOworICBnX2Fzc2VydAorICAgICh0X3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfY2xpZW50X3JldHVybl9saXN0X3N0cmluZ19saXN0IChjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmNvbWluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcikgJiYKKyAgICAgKmVycm9yID09IE5VTEwpOworCisgIC8qIE1ha2Ugc3VyZSB0aGUgbGlzdCBhbmQgaXRzIGNvbnRlbnRzIGFyZSB2YWxpZCAqLworICBnX2Fzc2VydF9jbXBpbnQgKGluY29taW5nX2xpc3QtPmxlbiwgPiwgMCk7CisKKyAgbmVzdGVkX2xpc3QgPSAoVFRlc3RTdHJpbmdMaXN0ICopZ19wdHJfYXJyYXlfaW5kZXggKGluY29taW5nX2xpc3QsIDApOworICBnX2Fzc2VydCAobmVzdGVkX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAobmVzdGVkX2xpc3QtPmxlbiwgPj0sIDApOworCisgIC8qIENsZWFuIHVwIGFuZCBleGl0ICovCisgIGdfcHRyX2FycmF5X3VucmVmIChpbmNvbWluZ19saXN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfY29udGFpbmVyX3NlcnZpY2VfdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdCAodm9pZCkKK3sKKyAgZXhlY3V0ZV93aXRoX3NlcnZpY2VfY2xpZW50CisgICAgKHRlc3RfY29udGFpbmVyX3NlcnZpY2VfdHlwZWRlZmRfbGlzdF9zdHJpbmdfbGlzdF9pbm5lcik7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBwaWRfdCBwaWQ7CisgIGludCBzdGF0dXM7CisKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIC8qIEZvcmsgdG8gcnVuIG91ciB0ZXN0IHN1aXRlIGluIGEgY2hpbGQgcHJvY2VzcyAqLworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydF9jbXBpbnQgKHBpZCwgPj0sIDApOworCisgIGlmIChwaWQgPT0gMCkgeyAgICAvKiBUaGUgY2hpbGQgcHJvY2VzcyAqLworICAgIC8qIFdhaXQgYSBtb21lbnQgZm9yIHRoZSBzZXJ2ZXIgdG8gZmluaXNoIHN0YXJ0aW5nICovCisgICAgc2xlZXAgKDEpOworCisgICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CisKKyAgICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAgICgiL3Rlc3Rjb250YWluZXJ0ZXN0L0NvbnRhaW5lclRlc3QvU3RydWN0cy9Db250YWluZXJzV2l0aERlZmF1bHRWYWx1ZXMiLAorICAgICAgIHRlc3RfY29udGFpbmVyc193aXRoX2RlZmF1bHRfdmFsdWVzKTsKKyAgICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAgICgiL3Rlc3Rjb250YWluZXJ0ZXN0L0NvbnRhaW5lclRlc3QvU2VydmljZXMvQ29udGFpbmVyU2VydmljZS9TdHJpbmdMaXN0IiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3N0cmluZ19saXN0KTsKKyAgICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAgICgiL3Rlc3Rjb250YWluZXJ0ZXN0L0NvbnRhaW5lclRlc3QvU2VydmljZXMvQ29udGFpbmVyU2VydmljZS9MaXN0U3RyaW5nTGlzdCIsCisgICAgICAgdGVzdF9jb250YWluZXJfc2VydmljZV9saXN0X3N0cmluZ19saXN0KTsKKyAgICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAgICgiL3Rlc3Rjb250YWluZXJ0ZXN0L0NvbnRhaW5lclRlc3QvU2VydmljZXMvQ29udGFpbmVyU2VydmljZS9UeXBlZGVmZExpc3RTdHJpbmdMaXN0IiwKKyAgICAgICB0ZXN0X2NvbnRhaW5lcl9zZXJ2aWNlX3R5cGVkZWZkX2xpc3Rfc3RyaW5nX2xpc3QpOworCisgICAgLyogUnVuIHRoZSB0ZXN0cyBhbmQgbWFrZSB0aGUgcmVzdWx0IGF2YWlsYWJsZSB0byBvdXIgcGFyZW50IHByb2Nlc3MgKi8KKyAgICBfZXhpdCAoZ190ZXN0X3J1biAoKSk7CisgIH0KKyAgZWxzZSB7CisgICAgVFRlc3RDb250YWluZXJTZXJ2aWNlSGFuZGxlciAqaGFuZGxlcjsKKyAgICBUVGVzdENvbnRhaW5lclNlcnZpY2VQcm9jZXNzb3IgKnByb2Nlc3NvcjsKKworICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydDsKKyAgICBUaHJpZnRUcmFuc3BvcnRGYWN0b3J5ICp0cmFuc3BvcnRfZmFjdG9yeTsKKyAgICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgKnByb3RvY29sX2ZhY3Rvcnk7CisKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2NobGRfYWN0aW9uOworCisgICAgR0Vycm9yICplcnJvciA9IE5VTEw7CisgICAgaW50IGV4aXRfc3RhdHVzID0gMTsKKworICAgIC8qIFRyYXAgdGhlIGV2ZW50IG9mIHRoZSBjaGlsZCBwcm9jZXNzIHRlcm1pbmF0aW5nIHNvIHdlIGtub3cgdG8gc3RvcCB0aGUKKyAgICAgICBzZXJ2ZXIgYW5kIGV4aXQgKi8KKyAgICBtZW1zZXQgKCZzaWdjaGxkX2FjdGlvbiwgMCwgc2l6ZW9mIChzaWdjaGxkX2FjdGlvbikpOworICAgIHNpZ2NobGRfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWdjaGxkX2hhbmRsZXI7CisgICAgc2lnY2hsZF9hY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7CisgICAgc2lnYWN0aW9uIChTSUdDSExELCAmc2lnY2hsZF9hY3Rpb24sIE5VTEwpOworCisgICAgLyogQ3JlYXRlIG91ciB0ZXN0IHNlcnZlciAqLworICAgIGhhbmRsZXIgPSBnX29iamVjdF9uZXcgKFRZUEVfVEVTVF9DT05UQUlORVJfU0VSVklDRV9IQU5ETEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIHByb2Nlc3NvciA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQ09OVEFJTkVSX1NFUlZJQ0VfUFJPQ0VTU09SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIFRFU1RfU0VSVkVSX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVF9GQUNUT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBwcm90b2NvbF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIHNlcnZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0lNUExFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzb3IiLCAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3RyYW5zcG9ydCIsICAgICAgICAgc2VydmVyX3RyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF90cmFuc3BvcnRfZmFjdG9yeSIsICB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkiLCB0cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbF9mYWN0b3J5IiwgICBwcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbF9mYWN0b3J5IiwgIHByb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIC8qIFN0YXJ0IHRoZSBzZXJ2ZXIgKi8KKyAgICB0aHJpZnRfc2VydmVyX3NlcnZlIChzZXJ2ZXIsICZlcnJvcik7CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlIHNlcnZlciBzdG9wcGVkIG9ubHkgYmVjYXVzZSBpdCB3YXMgaW50ZXJydXB0ZWQgKGJ5IHRoZQorICAgICAgIGNoaWxkIHByb2Nlc3MgdGVybWluYXRpbmcpICovCisgICAgZ19hc3NlcnQoIWVycm9yIHx8IGdfZXJyb3JfbWF0Y2hlcyhlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TRVJWRVJfU09DS0VUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX1NFUlZFUl9TT0NLRVRfRVJST1JfQUNDRVBUKSk7CisKKyAgICAvKiBGcmVlIG91ciByZXNvdXJjZXMgKi8KKyAgICBnX2NsZWFyX29iamVjdCAoJnNlcnZlcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZwcm90b2NvbF9mYWN0b3J5KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnRyYW5zcG9ydF9mYWN0b3J5KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNlcnZlcl90cmFuc3BvcnQpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmcHJvY2Vzc29yKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJmhhbmRsZXIpOworCisgICAgLyogV2FpdCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gY29tcGxldGUgYW5kIHJldHVybiBpdHMgZXhpdCBzdGF0dXMgKi8KKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBpZiAoV0lGRVhJVEVEIChzdGF0dXMpKQorICAgICAgZXhpdF9zdGF0dXMgPSBXRVhJVFNUQVRVUyAoc3RhdHVzKTsKKworICAgIHJldHVybiBleGl0X3N0YXR1czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwppbmRleCA2ODllMDAxLi4xMDlhNDhiIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwpAQCAtMTgsNzYgKzE4LDkyNCBAQAogICovCiAKICNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KIAogI2lmbmRlZiBNX1BJCiAjZGVmaW5lIE1fUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg1CiAjZW5kaWYKIAorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisKICNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9kZWJ1Z19wcm90b190ZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3Rfc3J2LmgiCisjaW5jbHVkZSAiZ2VuLWNfZ2xpYi90X3Rlc3RfaW5oZXJpdGVkLmgiCiAKIHN0YXRpYyB2b2lkCi10ZXN0X2RlYnVnX3Byb3RvKHZvaWQpCit0ZXN0X3N0cnVjdHNfZG91Ymxlc19jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCiB7Ci0gIFRUZXN0T25lT2ZFYWNoICpvb2UgPSBOVUxMOwotICBUVGVzdE5lc3RpbmcgKm4gPSBOVUxMOwotICBUVGVzdEhvbHlNb2xleSAqaG0gPSBOVUxMOwotICBnY2hhciAqcmFuZG9tID0gZ19zdHJkdXAoInJhbmRvbSBzdHJpbmciKTsKLSAgZ2NoYXIgKm5vdGhpbmcgPSBnX3N0cmR1cCgibm90aGluZyIpOworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogCi0gIG9vZSA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsIE5VTEwpOwotICBvb2UtPmltX3RydWUgPSBUUlVFOwotICBvb2UtPmltX2ZhbHNlID0gRkFMU0U7Ci0gIG9vZS0+YV9iaXRlID0gMHhkNjsKLSAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKLSAgb29lLT5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLT5pbnRlZ2VyNjQgPSAoZ3VpbnQ2NCkgNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UtPmRvdWJsZV9wcmVjaXNpb24gPSBNX1BJOwotICBvb2UtPnNvbWVfY2hhcmFjdGVycyA9IGdfc3RyZHVwKCJEZWJ1ZyBUSElTISIpOwotICBvb2UtPnpvbWdfdW5pY29kZSA9IGdfc3RyZHVwKCJceGQ3XG5cYVx0Iik7CisgIC8qIEEgRG91YmxlcyBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ET1VCTEVTLCBOVUxMKTsKIAotICBuID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKLSAgaWYgKG4tPm15X29vZSAhPSBOVUxMKQotICAgIGdfb2JqZWN0X3VucmVmKG4tPm15X29vZSk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfRE9VQkxFUyAob2JqZWN0KSk7CiAKLSAgbi0+bXlfb29lID0gb29lOwotICBuLT5teV9vb2UtPmludGVnZXIxNiA9IDE2OwotICBuLT5teV9vb2UtPmludGVnZXIzMiA9IDMyOwotICBuLT5teV9vb2UtPmludGVnZXI2NCA9IDY0OwotICBuLT5teV9vb2UtPmRvdWJsZV9wcmVjaXNpb24gPSAoc3FydCg1LjApICsgMSkgLyAyOwotICBuLT5teV9vb2UtPnNvbWVfY2hhcmFjdGVycyA9IGdfc3RyZHVwKCI6UiAobWUgZ29pbmcgXCJycnJyXCIpIik7Ci0gIG4tPm15X29vZS0+em9tZ191bmljb2RlID0gZ19zdHJkdXAoIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIik7Ci0gIG4tPm15X2JvbmstPnR5cGUgPSAzMTMzNzsKLSAgbi0+bXlfYm9uay0+bWVzc2FnZSA9IGdfc3RyZHVwKCJJIGFtIGEgYm9uay4uLiB4b3IhIik7CisgIC8qIC4uLmFuZCBkZXN0cm95ZWQgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CiAKLSAgaG0gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOwotICBnX3B0cl9hcnJheV9hZGQgKGhtLT5iaWcsIG9vZSk7Ci0gIGdfcHRyX2FycmF5X2FkZCAoaG0tPmJpZywgZ19vYmplY3RfcmVmKG4tPm15X29vZSkpOwotICAoKFRUZXN0T25lT2ZFYWNoICopIGdfcHRyX2FycmF5X2luZGV4IChobS0+YmlnLCAwKSktPmFfYml0ZSA9IDB4MjI7Ci0gICgoVFRlc3RPbmVPZkVhY2ggKikgZ19wdHJfYXJyYXlfaW5kZXggKGhtLT5iaWcsIDEpKS0+YV9iaXRlID0gMHgzMzsKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfZG91Ymxlc19pbml0aWFsaXplICh2b2lkKQoreworICBUVGVzdERvdWJsZXMgKmRvdWJsZXMgPSBOVUxMOworICBnZG91YmxlIG5hbjsKKyAgZ2RvdWJsZSBpbmY7CisgIGdkb3VibGUgbmVnaW5mOworICBnZG91YmxlIHJlcGVhdGluZzsKKyAgZ2RvdWJsZSBiaWc7CisgIGdkb3VibGUgdGlueTsKKyAgZ2RvdWJsZSB6ZXJvOworICBnZG91YmxlIG5lZ3plcm87CiAKLSAgZ19oYXNoX3RhYmxlX2luc2VydCAoaG0tPmNvbnRhaW4sIHJhbmRvbSwgcmFuZG9tKTsKKyAgLyogTm90ZSB0aGVyZSBzZWVtcyB0byBiZSBubyB3YXkgdG8gZ2V0IG5vdC1hLW51bWJlciAoIk5BTiIpIHZhbHVlcyBwYXN0CisgICAgIEdPYmplY3QncyByYW5nZS1jaGVja2luZywgc28gdGhhdCBwb3J0aW9uIG9mIHRoZSB0ZXN0IGhhcyBiZWVuIGNvbW1lbnRlZAorICAgICBvdXQgYmVsb3cuICovCiAKKyAgLyogQSBEb3VibGVzIHN0cnVjdHVyZSdzIG1lbWJlcnMgYXJlIGF2YWlsYWJsZSBhcyBHT2JqZWN0IHByb3BlcnRpZXMKKyAgICAgdGhhdCBjYW4gYmUgaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uLi4uICovCisgIGRvdWJsZXMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0RPVUJMRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICJuYW4iLCAgICAgIDAgKiBJTkZJTklUWSwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluZiIsICAgICAgICAgIElORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmVnaW5mIiwgICAgICAtSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRpbmciLCAgICAgMS4wIC8gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJpZyIsICAgICAgIEdfTUFYRE9VQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGlueSIsICAgICAgICAgIDEwRS0xMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ6ZXJvIiwgICAgICAgICAgMS4wICogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ3plcm8iLCAgICAgIC0xLjAgKiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydCAoZG91YmxlcyAhPSBOVUxMKTsKKworICAvKiAuLi5hbmQgbGF0ZXIgcmV0cmlldmVkICovCisgIGdfb2JqZWN0X2dldCAoZG91YmxlcywKKyAgICAgICAgICAgICAgICAibmFuIiwgICAgICAgJm5hbiwKKyAgICAgICAgICAgICAgICAiaW5mIiwgICAgICAgJmluZiwKKyAgICAgICAgICAgICAgICAibmVnaW5mIiwgICAgJm5lZ2luZiwKKyAgICAgICAgICAgICAgICAicmVwZWF0aW5nIiwgJnJlcGVhdGluZywKKyAgICAgICAgICAgICAgICAiYmlnIiwgICAgICAgJmJpZywKKyAgICAgICAgICAgICAgICAidGlueSIsICAgICAgJnRpbnksCisgICAgICAgICAgICAgICAgInplcm8iLCAgICAgICZ6ZXJvLAorICAgICAgICAgICAgICAgICJuZWd6ZXJvIiwgICAmbmVnemVybywKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBnX2Fzc2VydF9jbXBpbnQgKGlzbmFuIChuYW4pLCAgICAhPSwgIDApOyAqLworICBnX2Fzc2VydF9jbXBpbnQgKGlzaW5mIChpbmYpLCAgICA9PSwgIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGlzaW5mIChuZWdpbmYpLCA9PSwgLTEpOworCisgIGdfYXNzZXJ0X2NtcGZsb2F0IChyZXBlYXRpbmcsID09LCAgICAgMS4wIC8gMyk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0IChiaWcsICAgICAgID09LCBHX01BWERPVUJMRSk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0ICh0aW55LCAgICAgID09LCAgICAgMTBFLTEwMSk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0ICh6ZXJvLCAgICAgID09LCAgICAgMS4wICogMCk7CisgIGdfYXNzZXJ0X2NtcGZsb2F0IChuZWd6ZXJvLCAgID09LCAgICAtMS4wICogMCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGRvdWJsZXMpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIE9uZU9mRWFjaCBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19PTkVfT0ZfRUFDSCAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAqLworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9pbml0aWFsaXplX2RlZmF1bHRfdmFsdWVzICh2b2lkKQoreworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2ggPSBOVUxMOworICBnaW50ICAgYV9iaXRlOworICBnaW50ICAgaW50ZWdlcjE2OworICBnaW50NjQgaW50ZWdlcjY0OworICBHQXJyYXkgKmJ5dGVfbGlzdDsKKyAgR0FycmF5ICppMTZfbGlzdDsKKyAgR0FycmF5ICppNjRfbGlzdDsKKworICAvKiBBIE9uZU9mRWFjaCBzdHJ1Y3R1cmUgY3JlYXRlZCB3aXRoIG5vIGV4cGxpY2l0IHByb3BlcnR5IHZhbHVlcworICAgICB3aWxsIGhvbGQgdGhlIGRlZmF1bHQgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgLnRocmlmdCBmaWxlICovCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjY0IiwgJmludGVnZXI2NCwKKyAgICAgICAgICAgICAgICAiYnl0ZV9saXN0IiwgJmJ5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgJmkxNl9saXN0LAorICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAmaTY0X2xpc3QsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChhX2JpdGUsICAgID09LCAweDdmKTsKKyAgZ19hc3NlcnRfY21waW50IChpbnRlZ2VyMTYsID09LCAweDdmZmYpOworICBnX2Fzc2VydF9jbXBpbnQgKGludGVnZXI2NCwgPT0sIEdfR0lOVDY0X0NPTlNUQU5UICgxMDAwMDAwMDAwMCkpOworCisgIGdfYXNzZXJ0IChieXRlX2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoYnl0ZV9saXN0LT5sZW4sID09LCAzKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChieXRlX2xpc3QsIGdpbnQ4LCAwKSwgPT0sIDEpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGJ5dGVfbGlzdCwgZ2ludDgsIDEpLCA9PSwgMik7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoYnl0ZV9saXN0LCBnaW50OCwgMiksID09LCAzKTsKKworICBnX2Fzc2VydCAoaTE2X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoaTE2X2xpc3QtPmxlbiwgPT0sIDMpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGkxNl9saXN0LCBnaW50MTYsIDApLCA9PSwgMSk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTE2X2xpc3QsIGdpbnQxNiwgMSksID09LCAyKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpMTZfbGlzdCwgZ2ludDE2LCAyKSwgPT0sIDMpOworCisgIGdfYXNzZXJ0IChpNjRfbGlzdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChpNjRfbGlzdC0+bGVuLCA9PSwgMyk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9pbmRleCAoaTY0X2xpc3QsIGdpbnQ2NCwgMCksID09LCAxKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2FycmF5X2luZGV4IChpNjRfbGlzdCwgZ2ludDY0LCAxKSwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfaW5kZXggKGk2NF9saXN0LCBnaW50NjQsIDIpLCA9PSwgMyk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBnX2FycmF5X3VucmVmIChpMTZfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGJ5dGVfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfaW5pdGlhbGl6ZV9zcGVjaWZpZWRfdmFsdWVzICh2b2lkKQoreworICBzdGF0aWMgY29uc3QgZ2ludDggaW5pdGlhbF9ieXRlX2xpc3RbNV0gPSB7IDEzLCAyMSwgMzQsIDU1LCA4OSB9OworICBzdGF0aWMgY29uc3QgZ2ludDE2IGluaXRpYWxfaTE2X2xpc3RbNV0gPSB7IDQxODEsIDY3NjUsIDEwOTQ2LCAxNzcxMSwgMjg2NTcgfTsKKyAgc3RhdGljIGNvbnN0IGdpbnQ2NCBpbml0aWFsX2k2NF9saXN0WzVdID0KKyAgICB7CisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTEwMDA4Nzc3ODM2NjEwMTkzMSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMTc3OTk3OTQxNjAwNDcxNDE4OSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoMjg4MDA2NzE5NDM3MDgxNjEyMCksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNDY2MDA0NjYxMDM3NTUzMDMwOSksCisgICAgICBHX0dJTlQ2NF9DT05TVEFOVCAoNzU0MDExMzgwNDc0NjM0NjQyOSkKKyAgICB9OworICBzdGF0aWMgY29uc3QgZ3VpbnQ4IGluaXRpYWxfYmFzZTY0WzhdID0KKyAgICB7CisgICAgICAweDU2LCAweDQ3LCAweDY4LCAweDc5LCAweDYxLCAweDU3LCAweDVhLCAweDMwCisgICAgfTsKKworICBUVGVzdE9uZU9mRWFjaCAqb25lX29mX2VhY2g7CisgIGdib29sZWFuIGltX3RydWU7CisgIGdib29sZWFuIGltX2ZhbHNlOworICBnaW50IGFfYml0ZTsKKyAgZ2ludCBpbnRlZ2VyMTY7CisgIGdpbnQgaW50ZWdlcjMyOworICBnaW50NjQgaW50ZWdlcjY0OworICBkb3VibGUgZG91YmxlX3ByZWNpc2lvbjsKKyAgZ2NoYXIgKnNvbWVfY2hhcmFjdGVyczsKKyAgZ2NoYXIgKnpvbWdfdW5pY29kZTsKKyAgZ2Jvb2xlYW4gd2hhdF93aG87CisgIEdCeXRlQXJyYXkgKmJhc2U2NDsKKyAgR0FycmF5ICpieXRlX2xpc3Q7CisgIEdBcnJheSAqaTE2X2xpc3Q7CisgIEdBcnJheSAqaTY0X2xpc3Q7CisKKyAgYmFzZTY0ID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19ieXRlX2FycmF5X2FwcGVuZCAoYmFzZTY0LCBpbml0aWFsX2Jhc2U2NCwgOCk7CisKKyAgYnl0ZV9saXN0ID0gZ19hcnJheV9uZXcgKEZBTFNFLCBGQUxTRSwgc2l6ZW9mIChnaW50OCkpOworICBnX2FycmF5X2FwcGVuZF92YWxzIChieXRlX2xpc3QsIGluaXRpYWxfYnl0ZV9saXN0LCA1KTsKKworICBpMTZfbGlzdCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoZ2ludDE2KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGkxNl9saXN0LCBpbml0aWFsX2kxNl9saXN0LCA1KTsKKworICBpNjRfbGlzdCA9IGdfYXJyYXlfbmV3IChGQUxTRSwgRkFMU0UsIHNpemVvZiAoZ2ludDY0KSk7CisgIGdfYXJyYXlfYXBwZW5kX3ZhbHMgKGk2NF9saXN0LCBpbml0aWFsX2k2NF9saXN0LCA1KTsKKworICAvKiBBbGwgb2YgT25lT2ZFYWNoJ3MgcHJvcGVydGllcyBjYW4gYmUgc2V0IGF0IGNvbnN0cnVjdGlvbi4uLiAqLworICBvbmVfb2ZfZWFjaCA9CisgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJpbV9mYWxzZSIsICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgICAgICAgIDB4NTAsCisgICAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgICAgICAgIDB4N2U1NywKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMzIiLCAgICAgICAgMHhkZWFkYmVlZiwKKyAgICAgICAgICAgICAgICAgICJpbnRlZ2VyNjQiLCAgICAgICAgR19HSU5UNjRfQ09OU1RBTlQgKDB4ZmExNWVmYWNhZGUxNWJhZCksCisgICAgICAgICAgICAgICAgICAiZG91YmxlX3ByZWNpc2lvbiIsIE1fUEksCisgICAgICAgICAgICAgICAgICAic29tZV9jaGFyYWN0ZXJzIiwgICJEZWJ1ZyBUSElTISIsCisgICAgICAgICAgICAgICAgICAiem9tZ191bmljb2RlIiwgICAgICJceGQ3XG5cYVx0IiwKKyAgICAgICAgICAgICAgICAgICJ3aGF0X3dobyIsICAgICAgICAgVFJVRSwKKyAgICAgICAgICAgICAgICAgICJiYXNlNjQiLCAgICAgICAgICAgYmFzZTY0LAorICAgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICBieXRlX2xpc3QsCisgICAgICAgICAgICAgICAgICAiaTE2X2xpc3QiLCAgICAgICAgIGkxNl9saXN0LAorICAgICAgICAgICAgICAgICAgImk2NF9saXN0IiwgICAgICAgICBpNjRfbGlzdCwKKyAgICAgICAgICAgICAgICAgIE5VTEwpOworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisKKyAgZ19hcnJheV91bnJlZiAoaTY0X2xpc3QpOworICBpNjRfbGlzdCA9IE5VTEw7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgaTE2X2xpc3QgPSBOVUxMOworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBieXRlX2xpc3QgPSBOVUxMOworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJhc2U2NCk7CisgIGJhc2U2NCA9IE5VTEw7CisKKyAgLyogLi4uYW5kIGxhdGVyIHJldHJpZXZlZCAqLworICBnX29iamVjdF9nZXQgKG9uZV9vZl9lYWNoLAorICAgICAgICAgICAgICAgICJpbV90cnVlIiwgICAgICAgICAgJmltX3RydWUsCisgICAgICAgICAgICAgICAgImltX2ZhbHNlIiwgICAgICAgICAmaW1fZmFsc2UsCisgICAgICAgICAgICAgICAgImFfYml0ZSIsICAgICAgICAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAgICAgICAgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjMyIiwgICAgICAgICZpbnRlZ2VyMzIsCisgICAgICAgICAgICAgICAgImludGVnZXI2NCIsICAgICAgICAmaW50ZWdlcjY0LAorICAgICAgICAgICAgICAgICJkb3VibGVfcHJlY2lzaW9uIiwgJmRvdWJsZV9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgInNvbWVfY2hhcmFjdGVycyIsICAmc29tZV9jaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICJ6b21nX3VuaWNvZGUiLCAgICAgJnpvbWdfdW5pY29kZSwKKyAgICAgICAgICAgICAgICAid2hhdF93aG8iLCAgICAgICAgICZ3aGF0X3dobywKKyAgICAgICAgICAgICAgICAiYmFzZTY0IiwgICAgICAgICAgICZiYXNlNjQsCisgICAgICAgICAgICAgICAgImJ5dGVfbGlzdCIsICAgICAgICAmYnl0ZV9saXN0LAorICAgICAgICAgICAgICAgICJpMTZfbGlzdCIsICAgICAgICAgJmkxNl9saXN0LAorICAgICAgICAgICAgICAgICJpNjRfbGlzdCIsICAgICAgICAgJmk2NF9saXN0LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0IChpbV90cnVlICA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGltX2ZhbHNlID09IEZBTFNFKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4N2U1Nyk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjMyLCA9PSwgKGdpbnQzMikweGRlYWRiZWVmKTsKKyAgZ19hc3NlcnRfY21waGV4IChpbnRlZ2VyNjQsID09LCBHX0dJTlQ2NF9DT05TVEFOVCAoMHhmYTE1ZWZhY2FkZTE1YmFkKSk7CisKKyAgZ19hc3NlcnRfY21wZmxvYXQgKGRvdWJsZV9wcmVjaXNpb24sID09LCBNX1BJKTsKKworICBnX2Fzc2VydF9jbXBzdHIgKHNvbWVfY2hhcmFjdGVycywgPT0sICJEZWJ1ZyBUSElTISIpOworICBnX2Fzc2VydF9jbXBzdHIgKHpvbWdfdW5pY29kZSwgICAgPT0sICJceGQ3XG5cYVx0Iik7CisKKyAgZ19hc3NlcnQgKHdoYXRfd2hvID09IFRSVUUpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYmFzZTY0LT5sZW4sID09LCA4KTsKKyAgZ19hc3NlcnRfY21waW50IChtZW1jbXAgKGJhc2U2NC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfYmFzZTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIHNpemVvZiAoZ3VpbnQ4KSksID09LCAwKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGJ5dGVfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChieXRlX2xpc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2J5dGVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgKiBzaXplb2YgKGdpbnQ4KSksICA9PSwgMCk7CisKKyAgZ19hc3NlcnRfY21waW50IChpMTZfbGlzdC0+bGVuLCA9PSwgNSk7CisgIGdfYXNzZXJ0X2NtcGludCAobWVtY21wIChpMTZfbGlzdC0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaTE2X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICogc2l6ZW9mIChnaW50MTYpKSwgPT0sIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoaTY0X2xpc3QtPmxlbiwgPT0sIDUpOworICBnX2Fzc2VydF9jbXBpbnQgKG1lbWNtcCAoaTY0X2xpc3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2k2NF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAqIHNpemVvZiAoZ2ludDY0KSksID09LCAwKTsKKworICBnX2FycmF5X3VucmVmIChpNjRfbGlzdCk7CisgIGdfYXJyYXlfdW5yZWYgKGkxNl9saXN0KTsKKyAgZ19hcnJheV91bnJlZiAoYnl0ZV9saXN0KTsKKyAgZ19ieXRlX2FycmF5X3VucmVmIChiYXNlNjQpOworCisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19ieXRlX2xpc3QgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgR0FycmF5ICpieXRlX2xpc3QgPSBOVUxMOworCisgIG9uZV9vZl9lYWNoID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwgTlVMTCk7CisKKyAgLyogT25lT2ZFYWNoJ3MgImJ5dGVfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIGVpZ2h0LWJpdC13aWRlIGludGVnZXIKKyAgICAgdmFsdWVzICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsICJieXRlX2xpc3QiLCAmYnl0ZV9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoYnl0ZV9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfZ2V0X2VsZW1lbnRfc2l6ZSAoYnl0ZV9saXN0KSwgPT0sIHNpemVvZiAoZ2ludDgpKTsKKworICBnX2FycmF5X3VucmVmIChieXRlX2xpc3QpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX3Byb3BlcnRpZXNfaTE2X2xpc3QgKHZvaWQpCit7CisgIFRUZXN0T25lT2ZFYWNoICpvbmVfb2ZfZWFjaDsKKyAgR0FycmF5ICppMTZfbGlzdCA9IE5VTEw7CisKKyAgb25lX29mX2VhY2ggPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX09ORV9PRl9FQUNILCBOVUxMKTsKKworICAvKiBPbmVPZkVhY2gncyAiaTE2X2xpc3QiIG1lbWJlciBpcyBhIGxpc3QgdGhhdCBob2xkcyBzaXh0ZWVuLWJpdC13aWRlIGludGVnZXIKKyAgICAgdmFsdWVzICovCisgIGdfb2JqZWN0X2dldCAob25lX29mX2VhY2gsICJpMTZfbGlzdCIsICZpMTZfbGlzdCwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGkxNl9saXN0ICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfYXJyYXlfZ2V0X2VsZW1lbnRfc2l6ZSAoaTE2X2xpc3QpLCA9PSwgc2l6ZW9mIChnaW50MTYpKTsKKworICBnX2FycmF5X3VucmVmIChpMTZfbGlzdCk7CisgIGdfb2JqZWN0X3VucmVmIChvbmVfb2ZfZWFjaCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pNjRfbGlzdCAodm9pZCkKK3sKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoOworICBHQXJyYXkgKmk2NF9saXN0ID0gTlVMTDsKKworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsIE5VTEwpOworCisgIC8qIE9uZU9mRWFjaCdzICJpNjRfbGlzdCIgbWVtYmVyIGlzIGEgbGlzdCB0aGF0IGhvbGRzIHNpeHR5LWZvdXItYml0LXdpZGUKKyAgICAgaW50ZWdlciB2YWx1ZXMgKi8KKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwgImk2NF9saXN0IiwgJmk2NF9saXN0LCBOVUxMKTsKKworICBnX2Fzc2VydCAoaTY0X2xpc3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0X2NtcGludCAoZ19hcnJheV9nZXRfZWxlbWVudF9zaXplIChpNjRfbGlzdCksID09LCBzaXplb2YgKGdpbnQ2NCkpOworCisgIGdfYXJyYXlfdW5yZWYgKGk2NF9saXN0KTsKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3RydWN0c19uZXN0aW5nX2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworICAvKiBBIE5lc3Rpbmcgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfTkVTVElORywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19ORVNUSU5HIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9ib25rICh2b2lkKQoreworICBUVGVzdE5lc3RpbmcgKm5lc3Rpbmc7CiAgIFRUZXN0Qm9uayAqYm9uayA9IE5VTEw7Ci0gIGJvbmsgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JPTkssIE5VTEwpOwotICBHUHRyQXJyYXkgKmJvbmtzID0gZ19wdHJfYXJyYXlfbmV3X3dpdGhfZnJlZV9mdW5jIChnX29iamVjdF91bnJlZik7Ci0gIGdfcHRyX2FycmF5X2FkZCAoYm9ua3MsIGJvbmspOwotICBnX2hhc2hfdGFibGVfaW5zZXJ0IChobS0+Ym9ua3MsIG5vdGhpbmcsIGJvbmtzKTsKKyAgZ2ludCB0eXBlOworICBnY2hhciAqbWVzc2FnZTsKIAotICBnX29iamVjdF91bnJlZiAoaG0pOworICBuZXN0aW5nID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9ORVNUSU5HLCBOVUxMKTsKIAotICByZXR1cm4gMDsKKyAgLyogTmVzdGluZydzICJteV9ib25rIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldywgZGVmYXVsdCBCb25rIG9iamVjdAorICAgICBkdXJpbmcgY29uc3RydWN0aW9uICovCisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfQk9OSyAoYm9uaykpOworCisgIGdfb2JqZWN0X2dldCAoYm9uaywKKyAgICAgICAgICAgICAgICAidHlwZSIsICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50ICh0eXBlLCA9PSwgMCk7CisgIGdfYXNzZXJ0IChtZXNzYWdlID09IE5VTEwpOworCisgIGdfb2JqZWN0X3VucmVmIChib25rKTsKKyAgYm9uayA9IE5VTEw7CisKKyAgLyogSXQgY2FuIGJlIHJlcGxhY2VkLi4uICovCisgIGJvbmsgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0JPTkssCisgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiwgICAgMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSIsICJSZXBsYWNlbWVudCBCb25rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X2JvbmsiLCBib25rLCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJvbmspOworICBib25rID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9ib25rIiwgJmJvbmssIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rICE9IE5VTEwpOworICBnX2Fzc2VydCAoVF9URVNUX0lTX0JPTksgKGJvbmspKTsKKworICBnX29iamVjdF9nZXQgKGJvbmssCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmdHlwZSwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSIsICZtZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAodHlwZSwgPT0sIDEwMCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAobWVzc2FnZSwgPT0sICJSZXBsYWNlbWVudCBCb25rIik7CisKKyAgZ19mcmVlIChtZXNzYWdlKTsKKyAgZ19vYmplY3RfdW5yZWYgKGJvbmspOworICBib25rID0gTlVMTDsKKworICAvKiAuLi5vciBzZXQgdG8gbnVsbCAqLworICBnX29iamVjdF9zZXQgKG5lc3RpbmcsICJteV9ib25rIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAobmVzdGluZywgIm15X2JvbmsiLCAmYm9uaywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmsgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG5lc3RpbmcpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9vb2UgKHZvaWQpCit7CisgIFRUZXN0TmVzdGluZyAqbmVzdGluZzsKKyAgVFRlc3RPbmVPZkVhY2ggKm9uZV9vZl9lYWNoID0gTlVMTDsKKyAgZ2ludCBhX2JpdGU7CisgIGdpbnQgaW50ZWdlcjE2OworCisgIG5lc3RpbmcgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX05FU1RJTkcsIE5VTEwpOworCisgIC8qIE5lc3RpbmcncyAibXlfb29lIiBtZW1iZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIG5ldywgZGVmYXVsdCBPbmVPZkVhY2gKKyAgICAgb2JqZWN0IGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfb29lIiwgJm9uZV9vZl9lYWNoLCBOVUxMKTsKKworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfT05FX09GX0VBQ0ggKG9uZV9vZl9lYWNoKSk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4N2YpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4N2ZmZik7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKKyAgb25lX29mX2VhY2ggPSBOVUxMOworCisgIC8qIEl0IGNhbiBiZSByZXBsYWNlZC4uLiAqLworICBvbmVfb2ZfZWFjaCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAweDUwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0IChuZXN0aW5nLCAibXlfb29lIiwgb25lX29mX2VhY2gsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAob25lX29mX2VhY2gpOworICBvbmVfb2ZfZWFjaCA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChuZXN0aW5nLCAibXlfb29lIiwgJm9uZV9vZl9lYWNoLCBOVUxMKTsKKworICBnX2Fzc2VydCAob25lX29mX2VhY2ggIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChUX1RFU1RfSVNfT05FX09GX0VBQ0ggKG9uZV9vZl9lYWNoKSk7CisKKyAgZ19vYmplY3RfZ2V0IChvbmVfb2ZfZWFjaCwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NTApOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4NTA1MCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKG9uZV9vZl9lYWNoKTsKKyAgb25lX29mX2VhY2ggPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBudWxsICovCisgIGdfb2JqZWN0X3NldCAobmVzdGluZywgIm15X29vZSIsIE5VTEwsIE5VTEwpOworICBnX29iamVjdF9nZXQgKG5lc3RpbmcsICJteV9vb2UiLCAmb25lX29mX2VhY2gsIE5VTEwpOworCisgIGdfYXNzZXJ0IChvbmVfb2ZfZWFjaCA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAobmVzdGluZyk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9jcmVhdGVfYW5kX2Rlc3Ryb3kgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisKKyAgLyogQSBIb2x5TW9sZXkgc3RydWN0dXJlIGNhbiBiZSBjcmVhdGVkLi4uICovCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSE9MWV9NT0xFWSwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19IT0xZX01PTEVZIChvYmplY3QpKTsKKworICAvKiAuLi5hbmQgZGVzdHJveWVkICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19iaWcgKHZvaWQpCit7CisgIFRUZXN0SG9seU1vbGV5ICpob2x5X21vbGV5OworICBHUHRyQXJyYXkgKmJpZyA9IE5VTEw7CisgIGdpbnQgYV9iaXRlID0gMDsKKyAgZ2ludCBpbnRlZ2VyMTYgPSAwOworCisgIGhvbHlfbW9sZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIC8qIEEgSG9seU1vbGV5J3MgImJpZyIgbWVtYmVyIGlzIGlzIGluaXRpYWxpemVkIG9uIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJiaWciLCAmYmlnLCBOVUxMKTsKKworICBnX2Fzc2VydCAoYmlnICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGJpZy0+bGVuLCA9PSwgMCk7CisKKyAgLyogSXQgY2FuIGJlIG1vZGlmaWVkLi4uICovCisgIGdfcHRyX2FycmF5X2FkZCAoYmlnLAorICAgICAgICAgICAgICAgICAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfT05FX09GX0VBQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgMHg1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAweDUwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYmlnIiwgJmJpZywgTlVMTCk7CisKKyAgZ19hc3NlcnRfY21waW50IChiaWctPmxlbiwgPT0sIDEpOworICBnX29iamVjdF9nZXQgKGdfcHRyX2FycmF5X2luZGV4IChiaWcsIDApLAorICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAmYV9iaXRlLAorICAgICAgICAgICAgICAgICJpbnRlZ2VyMTYiLCAmaW50ZWdlcjE2LAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGhleCAoYV9iaXRlLCAgICA9PSwgMHg1MCk7CisgIGdfYXNzZXJ0X2NtcGhleCAoaW50ZWdlcjE2LCA9PSwgMHg1MDUwKTsKKworICBnX3B0cl9hcnJheV91bnJlZiAoYmlnKTsKKyAgYmlnID0gTlVMTDsKKworICAvKiAuLi5yZXBsYWNlZC4uLiAqLworICBiaWcgPSBnX3B0cl9hcnJheV9uZXdfd2l0aF9mcmVlX2Z1bmMgKGdfb2JqZWN0X3VucmVmKTsKKyAgZ19wdHJfYXJyYXlfYWRkIChiaWcsCisgICAgICAgICAgICAgICAgICAgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9PTkVfT0ZfRUFDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX2JpdGUiLCAgICAweDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVnZXIxNiIsIDB4MTU0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKworICBnX29iamVjdF9zZXQgKGhvbHlfbW9sZXksICJiaWciLCBiaWcsIE5VTEwpOworCisgIGdfcHRyX2FycmF5X3VucmVmIChiaWcpOworICBiaWcgPSBOVUxMOworCisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoYmlnLT5sZW4sID09LCAxKTsKKyAgZ19vYmplY3RfZ2V0IChnX3B0cl9hcnJheV9pbmRleCAoYmlnLCAwKSwKKyAgICAgICAgICAgICAgICAiYV9iaXRlIiwgICAgJmFfYml0ZSwKKyAgICAgICAgICAgICAgICAiaW50ZWdlcjE2IiwgJmludGVnZXIxNiwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBoZXggKGFfYml0ZSwgICAgPT0sIDB4NjQpOworICBnX2Fzc2VydF9jbXBoZXggKGludGVnZXIxNiwgPT0sIDB4MTU0MSk7CisKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKGJpZyk7CisgIGJpZyA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYmlnIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAoaG9seV9tb2xleSwgImJpZyIsICZiaWcsIE5VTEwpOworCisgIGdfYXNzZXJ0IChiaWcgPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGhvbHlfbW9sZXkpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfcHJvcGVydGllc19jb250YWluICh2b2lkKQoreworICBzdGF0aWMgZ2NoYXIgKnN0cmluZ3NbMl0gPSB7ICJBcGFjaGUiLCAiVGhyaWZ0IiB9OworCisgIFRUZXN0SG9seU1vbGV5ICpob2x5X21vbGV5OworICBHSGFzaFRhYmxlICpjb250YWluID0gTlVMTDsKKyAgR1B0ckFycmF5ICpzdHJpbmdfbGlzdDsKKyAgR0xpc3QgKmtleV9saXN0OworCisgIGhvbHlfbW9sZXkgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0hPTFlfTU9MRVksIE5VTEwpOworCisgIC8qIEEgSG9seU1vbGV5J3MgImNvbnRhaW4iIG1lbWJlciBpcyBpbml0aWFsaXplZCBvbiBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydCAoY29udGFpbiAhPSBOVUxMKTsKKyAgZ19hc3NlcnRfY21waW50IChnX2hhc2hfdGFibGVfc2l6ZSAoY29udGFpbiksID09LCAwKTsKKworICAvKiBJdCBjYW4gYmUgbW9kaWZpZWQuLi4gKi8KKyAgc3RyaW5nX2xpc3QgPSBnX3B0cl9hcnJheV9uZXcgKCk7CisgIGdfcHRyX2FycmF5X2FkZCAoc3RyaW5nX2xpc3QsIHN0cmluZ3NbMF0pOworICBnX3B0cl9hcnJheV9hZGQgKHN0cmluZ19saXN0LCBzdHJpbmdzWzFdKTsKKworICBnX2hhc2hfdGFibGVfaW5zZXJ0IChjb250YWluLCBzdHJpbmdfbGlzdCwgTlVMTCk7CisgIHN0cmluZ19saXN0ID0gTlVMTDsKKworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJjb250YWluIiwgJmNvbnRhaW4sIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGNvbnRhaW4pLCA9PSwgMSk7CisKKyAga2V5X2xpc3QgPSBnX2hhc2hfdGFibGVfZ2V0X2tleXMgKGNvbnRhaW4pOworICBzdHJpbmdfbGlzdCA9IGdfbGlzdF9udGhfZGF0YSAoa2V5X2xpc3QsIDApOworCisgIGdfYXNzZXJ0X2NtcGludCAoc3RyaW5nX2xpc3QtPmxlbiwgPT0sIDIpOworICBnX2Fzc2VydF9jbXBzdHIgKGdfcHRyX2FycmF5X2luZGV4IChzdHJpbmdfbGlzdCwgMCksID09LCAiQXBhY2hlIik7CisgIGdfYXNzZXJ0X2NtcHN0ciAoZ19wdHJfYXJyYXlfaW5kZXggKHN0cmluZ19saXN0LCAxKSwgPT0sICJUaHJpZnQiKTsKKworICBnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGNvbnRhaW4pOworICBjb250YWluID0gTlVMTDsKKworICAvKiAuLi5yZXBsYWNlZC4uLiAqLworICBjb250YWluID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX2RpcmVjdF9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2RpcmVjdF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdEZXN0cm95Tm90aWZ5KSBnX3B0cl9hcnJheV91bnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCBjb250YWluLCBOVUxMKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmIChjb250YWluKTsKKyAgY29udGFpbiA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChjb250YWluKSwgPT0sIDApOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoY29udGFpbik7CisgIGNvbnRhaW4gPSBOVUxMOworCisgIC8qIC4uLm9yIHNldCB0byBOVUxMICovCisgIGdfb2JqZWN0X3NldCAoaG9seV9tb2xleSwgImNvbnRhaW4iLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiY29udGFpbiIsICZjb250YWluLCBOVUxMKTsKKworICBnX2Fzc2VydCAoY29udGFpbiA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoaG9seV9tb2xleSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JvbmtzICh2b2lkKQoreworICBUVGVzdEhvbHlNb2xleSAqaG9seV9tb2xleTsKKyAgR0hhc2hUYWJsZSAqYm9ua3MgPSBOVUxMOworICBHUHRyQXJyYXkgKmJvbmtfbGlzdCA9IE5VTEw7CisgIFRUZXN0Qm9uayAqYm9uayA9IE5VTEw7CisgIGdpbnQgdHlwZTsKKyAgZ2NoYXIgKm1lc3NhZ2U7CisgIEdMaXN0ICprZXlfbGlzdDsKKworICBob2x5X21vbGV5ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9IT0xZX01PTEVZLCBOVUxMKTsKKworICAvKiBBIEhvbHlNb2xleSdzICJib25rcyIgbWVtYmVyIGlzIGluaXRpYWxpemVkIG9uIGNvbnN0cnVjdGlvbiAqLworICBnX29iamVjdF9nZXQgKGhvbHlfbW9sZXksICJib25rcyIsICZib25rcywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGJvbmtzICE9IE5VTEwpOworICBnX2Fzc2VydF9jbXBpbnQgKGdfaGFzaF90YWJsZV9zaXplIChib25rcyksID09LCAwKTsKKworICAvKiBJdCBjYW4gYmUgbW9kaWZpZWQuLi4gKi8KKyAgYm9uayA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfQk9OSywKKyAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiLCAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIiwgIlNhbXBsZSBCb25rIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGJvbmtfbGlzdCA9IGdfcHRyX2FycmF5X25ld193aXRoX2ZyZWVfZnVuYyAoZ19vYmplY3RfdW5yZWYpOworICBnX3B0cl9hcnJheV9hZGQgKGJvbmtfbGlzdCwgYm9uayk7CisgIGJvbmsgPSBOVUxMOworCisgIGdfaGFzaF90YWJsZV9pbnNlcnQgKGJvbmtzLCBnX3N0cmR1cCAoIlNhbXBsZSBCb25rcyIpLCBib25rX2xpc3QpOworICBib25rX2xpc3QgPSBOVUxMOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGJvbmtzKSwgPT0sIDEpOworCisgIGtleV9saXN0ID0gZ19oYXNoX3RhYmxlX2dldF9rZXlzIChib25rcyk7CisgIGJvbmtfbGlzdCA9IGdfaGFzaF90YWJsZV9sb29rdXAgKGJvbmtzLCBnX2xpc3RfbnRoX2RhdGEgKGtleV9saXN0LCAwKSk7CisKKyAgZ19hc3NlcnRfY21waW50IChib25rX2xpc3QtPmxlbiwgPT0sIDEpOworCisgIGJvbmsgPSAoZ19wdHJfYXJyYXlfaW5kZXggKGJvbmtfbGlzdCwgMCkpOworICBnX29iamVjdF9nZXQgKGJvbmssCisgICAgICAgICAgICAgICAgInR5cGUiLCAgICAmdHlwZSwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSIsICZtZXNzYWdlLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAodHlwZSwgPT0sIDEwMCk7CisgIGdfYXNzZXJ0X2NtcHN0ciAobWVzc2FnZSwgPT0sICJTYW1wbGUgQm9uayIpOworCisgIGJvbmsgPSBOVUxMOworICBnX2ZyZWUgKG1lc3NhZ2UpOworICBnX2xpc3RfZnJlZSAoa2V5X2xpc3QpOworICBnX2hhc2hfdGFibGVfdW5yZWYgKGJvbmtzKTsKKyAgYm9ua3MgPSBOVUxMOworCisgIC8qIC4uLnJlcGxhY2VkLi4uICovCisgIGJvbmtzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsIChnX3N0cl9oYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19zdHJfZXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpIGdfcHRyX2FycmF5X3VucmVmKTsKKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCBib25rcywgTlVMTCk7CisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0X2NtcGludCAoZ19oYXNoX3RhYmxlX3NpemUgKGJvbmtzKSwgPT0sIDApOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoYm9ua3MpOworICBib25rcyA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCBOVUxMLCBOVUxMKTsKKyAgZ19vYmplY3RfZ2V0IChob2x5X21vbGV5LCAiYm9ua3MiLCAmYm9ua3MsIE5VTEwpOworCisgIGdfYXNzZXJ0IChib25rcyA9PSBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoaG9seV9tb2xleSk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfZW1wdHkgKHZvaWQpCit7CisgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CisgIEdQYXJhbVNwZWMgKipwcm9wZXJ0aWVzOworICBndWludCBwcm9wZXJ0eV9jb3VudDsKKworICAvKiBBbiBFbXB0eSBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQgKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9FTVBUWSwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAob2JqZWN0KSk7CisKKyAgLyogQW4gRW1wdHkgc3RydWN0dXJlIGhhcyBubyBtZW1iZXJzIGFuZCB0aHVzIG5vIHByb3BlcnRpZXMgKi8KKyAgcHJvcGVydGllcyA9IGdfb2JqZWN0X2NsYXNzX2xpc3RfcHJvcGVydGllcyAoR19PQkpFQ1RfR0VUX0NMQVNTIChvYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfY291bnQpOworICBnX2Fzc2VydF9jbXBpbnQgKHByb3BlcnR5X2NvdW50LCA9PSwgMCk7CisgIGdfZnJlZSAocHJvcGVydGllcyk7CisKKyAgLyogQW4gRW1wdHkgc3RydWN0dXJlIGNhbiBiZSBkZXN0cm95ZWQgICovCisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zdHJ1Y3RzX3dyYXBwZXJfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworCisgIC8qIEEgV3JhcHBlciBzdHJ1Y3R1cmUgY2FuIGJlIGNyZWF0ZWQuLi4gKi8KKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9FTVBUWSwgTlVMTCk7CisKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAob2JqZWN0KSk7CisKKyAgLyogLi4uYW5kIGRlc3Ryb3llZCAgKi8KKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3N0cnVjdHNfd3JhcHBlcl9wcm9wZXJ0aWVzX2ZvbyAodm9pZCkgeworICBUVGVzdFdyYXBwZXIgKndyYXBwZXI7CisgIFRUZXN0RW1wdHkgKmZvbzsKKworICB3cmFwcGVyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9XUkFQUEVSLCBOVUxMKTsKKworICAvKiBBIFdyYXBwZXIgc3RydWN0dXJlIGhhcyBvbmUgbWVtYmVyLCAiZm9vIiwgd2hpY2ggaXMgYW4gRW1wdHkKKyAgICAgc3RydWN0dXJlIGluaXRpYWxpemVkIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KKyAgZ19vYmplY3RfZ2V0ICh3cmFwcGVyLCAiZm9vIiwgJmZvbywgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGZvbyAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAoZm9vKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGZvbyk7CisgIGZvbyA9IE5VTEw7CisKKyAgLyogQSBXcmFwcGVyJ3MgZm9vIHByb3BlcnR5IGNhbiBiZSByZXBsYWNlZC4uLiAqLworICBmb28gPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX0VNUFRZLCBOVUxMKTsKKyAgZ19vYmplY3Rfc2V0ICh3cmFwcGVyLCAiZm9vIiwgZm9vLCBOVUxMKTsKKworICBnX29iamVjdF91bnJlZiAoZm9vKTsKKyAgZm9vID0gTlVMTDsKKworICBnX29iamVjdF9nZXQgKHdyYXBwZXIsICJmb28iLCAmZm9vLCBOVUxMKTsKKyAgZ19hc3NlcnQgKGZvbyAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKFRfVEVTVF9JU19FTVBUWSAoZm9vKSk7CisKKyAgZ19vYmplY3RfdW5yZWYgKGZvbyk7CisgIGZvbyA9IE5VTEw7CisKKyAgLyogLi4ub3Igc2V0IHRvIE5VTEwgKi8KKyAgZ19vYmplY3Rfc2V0ICh3cmFwcGVyLCAiZm9vIiwgTlVMTCwgTlVMTCk7CisgIGdfb2JqZWN0X2dldCAod3JhcHBlciwgImZvbyIsICZmb28sIE5VTEwpOworCisgIGdfYXNzZXJ0IChmb28gPT0gTlVMTCk7CisKKyAgZ19vYmplY3RfdW5yZWYgKHdyYXBwZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zZXJ2aWNlc19pbmhlcml0ZWQgKHZvaWQpCit7CisgIFRocmlmdFByb3RvY29sICpwcm90b2NvbDsKKyAgVFRlc3RJbmhlcml0ZWRDbGllbnQgKmluaGVyaXRlZF9jbGllbnQ7CisgIEdPYmplY3QgKmlucHV0X3Byb3RvY29sLCAqb3V0cHV0X3Byb3RvY29sOworCisgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsIE5VTEwpOworICBpbmhlcml0ZWRfY2xpZW50ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCBpbmhlcml0cyBmcm9tIFRUZXN0U3J2Q2xpZW50ICovCisgIGdfYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfU1JWX0NMSUVOVCkpOworCisgIC8qIFRUZXN0SW5oZXJpdGVkQ2xpZW50IGltcGxlbWVudHMgVFRlc3RTcnZDbGllbnQncyBpbnRlcmZhY2UgKi8KKyAgZ19hc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICAgICAgICAgICAgICAgICAgICAgICBUX1RFU1RfVFlQRV9TUlZfSUYpKTsKKworICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCdzIGluaGVyaXRlZCBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgYW5kIHJldHJpZXZlZCAqLworICBnX29iamVjdF9zZXQgKGluaGVyaXRlZF9jbGllbnQsCisgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sLAorICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGdfb2JqZWN0X2dldCAoaW5oZXJpdGVkX2NsaWVudCwKKyAgICAgICAgICAgICAgICAiaW5wdXRfcHJvdG9jb2wiLCAmaW5wdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsICZvdXRwdXRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgZ19hc3NlcnQgKGlucHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CisgIGdfYXNzZXJ0IChvdXRwdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKworICBnX29iamVjdF91bnJlZiAob3V0cHV0X3Byb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKGlucHV0X3Byb3RvY29sKTsKKyAgZ19vYmplY3RfdW5yZWYgKGluaGVyaXRlZF9jbGllbnQpOworICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwogfQogCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKLSAgZ190eXBlX2luaXQoKTsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCi0gIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvIiwgdGVzdF9kZWJ1Z19wcm90byk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9Eb3VibGVzL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfZG91Ymxlc19jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvRG91Ymxlcy9Jbml0aWFsaXplIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2RvdWJsZXNfaW5pdGlhbGl6ZSk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL09uZU9mRWFjaC9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2NyZWF0ZV9hbmRfZGVzdHJveSk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvSW5pdGlhbGl6ZS9EZWZhdWx0VmFsdWVzIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2luaXRpYWxpemVfZGVmYXVsdF92YWx1ZXMpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL0luaXRpYWxpemUvU3BlY2lmaWVkVmFsdWVzIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX29uZV9vZl9lYWNoX2luaXRpYWxpemVfc3BlY2lmaWVkX3ZhbHVlcyk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvUHJvcGVydGllcy9ieXRlX2xpc3QiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19ieXRlX2xpc3QpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvT25lT2ZFYWNoL1Byb3BlcnRpZXMvaTE2X2xpc3QiLAorICAgICB0ZXN0X3N0cnVjdHNfb25lX29mX2VhY2hfcHJvcGVydGllc19pMTZfbGlzdCk7CisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9PbmVPZkVhY2gvUHJvcGVydGllcy9pNjRfbGlzdCIsCisgICAgIHRlc3Rfc3RydWN0c19vbmVfb2ZfZWFjaF9wcm9wZXJ0aWVzX2k2NF9saXN0KTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvTmVzdGluZy9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX25lc3RpbmdfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL05lc3RpbmcvUHJvcGVydGllcy9teV9ib25rIiwKKyAgICAgdGVzdF9zdHJ1Y3RzX25lc3RpbmdfcHJvcGVydGllc19teV9ib25rKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL05lc3RpbmcvUHJvcGVydGllcy9teV9vb2UiLAorICAgICB0ZXN0X3N0cnVjdHNfbmVzdGluZ19wcm9wZXJ0aWVzX215X29vZSk7CisKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9DcmVhdGVBbmREZXN0cm95IiwKKyAgICAgdGVzdF9zdHJ1Y3RzX2hvbHlfbW9sZXlfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9Qcm9wZXJ0aWVzL2JpZyIsCisgICAgIHRlc3Rfc3RydWN0c19ob2x5X21vbGV5X3Byb3BlcnRpZXNfYmlnKTsKKyAgZ190ZXN0X2FkZF9mdW5jCisgICAgKCIvdGVzdGRlYnVncHJvdG8vRGVidWdQcm90by9TdHJ1Y3RzL0hvbHlNb2xleS9Qcm9wZXJ0aWVzL2NvbnRhaW4iLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2NvbnRhaW4pOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvSG9seU1vbGV5L1Byb3BlcnRpZXMvYm9ua3MiLAorICAgICB0ZXN0X3N0cnVjdHNfaG9seV9tb2xleV9wcm9wZXJ0aWVzX2JvbmtzKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvRW1wdHkiLAorICAgICB0ZXN0X3N0cnVjdHNfZW1wdHkpOworCisgIGdfdGVzdF9hZGRfZnVuYworICAgICgiL3Rlc3RkZWJ1Z3Byb3RvL0RlYnVnUHJvdG8vU3RydWN0cy9XcmFwcGVyL0NyZWF0ZUFuZERlc3Ryb3kiLAorICAgICB0ZXN0X3N0cnVjdHNfd3JhcHBlcl9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1N0cnVjdHMvV3JhcHBlci9Qcm9wZXJ0aWVzL2ZvbyIsCisgICAgIHRlc3Rfc3RydWN0c193cmFwcGVyX3Byb3BlcnRpZXNfZm9vKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMKKyAgICAoIi90ZXN0ZGVidWdwcm90by9EZWJ1Z1Byb3RvL1NlcnZpY2VzL0luaGVyaXRlZCIsCisgICAgIHRlc3Rfc2VydmljZXNfaW5oZXJpdGVkKTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KLQotCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWVhODliZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi9nc3RkaW8uaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZmRfdHJhbnNwb3J0Lmg+CisKK3N0YXRpYyBjb25zdCBnY2hhciBURVNUX0RBVEFbMTJdID0gImFiY2RlMDEyMzQhIjsKKworc3RhdGljIHZvaWQKK3Rlc3RfY3JlYXRlX2FuZF9kZXN0cm95ICh2b2lkKQoreworICBHT2JqZWN0ICpvYmplY3Q7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCAiZmQiLCAtMSwgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9vcGVuX2FuZF9jbG9zZSAodm9pZCkKK3sKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICprbGFzczsKKyAgR0Vycm9yICplcnJvcjsKKyAgZ2ludCBmZDsKKyAgZ2NoYXIgKmZpbGVuYW1lOworCisgIGVycm9yID0gTlVMTDsKKyAgZmlsZW5hbWUgPSBOVUxMOworCisgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CisKKyAgLyogb3BlbiBpcyBuby1vcCAqLworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworCisgIGdfYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworCisgIC8qIGFscmVhZHkgY2xvc2VkICovCisgIGdfYXNzZXJ0IChjbG9zZSAoZmQpICE9IDApOworICBnX2Fzc2VydCAoZXJybm8gPT0gRUJBREYpOworCisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIGdfcmVtb3ZlIChmaWxlbmFtZSk7CisgIGdfZnJlZSAoZmlsZW5hbWUpOworCisgIC8qIHRlc3QgYmFkIGZkICovCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKworICBnX2Fzc2VydCAoISBrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGVycm9yID0gTlVMTDsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGVycm9yID0gTlVMTDsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGVycm9yID0gTlVMTDsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworCisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZSAodm9pZCkKK3sKKyAgZ2NoYXIgb3V0X2J1Zls4XTsKKyAgZ2NoYXIgKmI7CisgIGdpbnQgd2FudCwgZ290OworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydDsKKyAgVGhyaWZ0VHJhbnNwb3J0Q2xhc3MgKmtsYXNzOworICBHRXJyb3IgKmVycm9yOworICBnaW50IGZkOworICBnY2hhciAqZmlsZW5hbWU7CisKKyAgZXJyb3IgPSBOVUxMOworICBmaWxlbmFtZSA9IE5VTEw7CisKKyAgZmQgPSBnX2ZpbGVfb3Blbl90bXAgKE5VTEwsICZmaWxlbmFtZSwgJmVycm9yKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOworCisgIC8qIHdyaXRlICovCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT53cml0ZSAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTEsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmZsdXNoICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKworICAvKiByZWFkICovCisgIGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFksIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsKKyAga2xhc3MgPSBUSFJJRlRfVFJBTlNQT1JUX0dFVF9DTEFTUyAodHJhbnNwb3J0KTsKKworICBtZW1zZXQob3V0X2J1ZiwgMCwgOCk7CisgIGIgPSBvdXRfYnVmOworICB3YW50ID0gNzsKKyAgd2hpbGUgKHdhbnQgPiAwKSB7CisgICAgZ290ID0ga2xhc3MtPnJlYWQgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBiICs9IGdvdDsKKyAgICB3YW50IC09IGdvdDsKKyAgfQorICBnX2Fzc2VydCAobWVtY21wIChvdXRfYnVmLCBURVNUX0RBVEEsIDcpID09IDApOworCisgIG1lbXNldChvdXRfYnVmLCAwLCA4KTsKKyAgYiA9IG91dF9idWY7CisgIHdhbnQgPSA0OworICB3aGlsZSAod2FudCA+IDApIHsKKyAgICBnb3QgPSBrbGFzcy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7CisgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSArIDcsIDQpID09IDApOworCisgIGdfYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCisgIC8qIGNsZWFuIHVwICovCisKKyAgZ19yZW1vdmUgKGZpbGVuYW1lKTsKKyAgZ19mcmVlIChmaWxlbmFtZSk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQorICBnX3R5cGVfaW5pdCAoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZmR0cmFuc3BvcnQvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmZHRyYW5zcG9ydC9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmZHRyYW5zcG9ydC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKworICByZXR1cm4gZ190ZXN0X3J1biAoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZGNhYWJkYS4uMDA4ZTYxZQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKQEAgLTE3LDIyICsxNywyMCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KIAotI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMiCi0KLXN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7Ci1zdGF0aWMgY29uc3Qgc2hvcnQgVEVTVF9QT1JUID0gNjQ0NDQ7CisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMiCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC00NCwxMCArNDIsMTAgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAob2JqZWN0KSwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKKwkJInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKKwkJIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC01NywzNSArNTUsNTMgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKIAotICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAorICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKwkvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKIAotICAvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKwkvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05OSw0OSArMTE1LDE1NiBAQAogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7Ci0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkJCQkgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKLSAgICAvKiB3cml0ZSAxMCBieXRlcyAqLwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KK30KKworLyogdGVzdCByZWFkaW5nIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgdW5leHBlY3RlZGx5CisgICBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gKi8KK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYWZ0ZXJfcGVlcl9jbG9zZSh2b2lkKQoreworICBpbnQgc3RhdHVzOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIEdFcnJvciAqZXJyID0gTlVMTDsKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAocGlkID49IDApOworCisgIGlmIChwaWQgPT0gMCkKKyAgICB7CisgICAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnRfdHJhbnNwb3J0ID0gTlVMTDsKKworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkgICAgICAgInBvcnQiLCBwb3J0LAorCQkJCSAgICAgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChzZXJ2ZXJfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpOworICAgICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKworICAgICAgLyogd3JhcCB0aGUgY2xpZW50IHRyYW5zcG9ydCBpbiBhIFRocmlmdEZyYW1lZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCisJICAgInRyYW5zcG9ydCIsICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50X3RyYW5zcG9ydCAhPSBOVUxMKTsKKworICAgICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNsaWVudCBjb25uZWN0cyAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgTlVMTCk7CisKKyAgICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnRfdHJhbnNwb3J0KTsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKKworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwlUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOworCVRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKwlndWNoYXIgYnVmWzEwXTsgLyogYSBidWZmZXIgKi8KKworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOworCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorCQkJCSJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgICAgIHBvcnQsCisJCQkJTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsICBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgMCwKKwkJCQkgIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworCS8qIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIGNsb3NlZAorICAgICAgIHRoZSBjb25uZWN0aW9uIGZhaWxzIGdyYWNlZnVsbHkgd2l0aG91dCBnZW5lcmF0aW5nIGEgY3JpdGljYWwKKyAgICAgICB3YXJuaW5nIG9yIHNlZ21lbnRhdGlvbiBmYXVsdCAqLworCXRocmlmdF90cmFuc3BvcnRfcmVhZCAodHJhbnNwb3J0LCBidWYsIDEwLCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyICE9IE5VTEwpOworCisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwl0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKwl0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwlnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKwlnX2Fzc2VydCAoc3RhdHVzID09IDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKICAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNTQsMjEgKzI3NywyMSBAQAogICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOwogCiAgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogCiAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCiAgIGNsaWVudCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOwotICBhc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KLSAgYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KIAogICBieXRlcyA9IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCA2LCBOVUxMKTsKICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgNSwgTlVMTCk7CkBAIC0xODUsMTIgKzMwOCwxNiBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0ZnJhbWVkdHJhbnNwb3J0L09wZW5BbmRDbG9zZSIsIHRlc3Rfb3Blbl9hbmRfY2xvc2UpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdGZyYW1lZHRyYW5zcG9ydC9SZWFkQW5kV3JpdGUiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RmcmFtZWR0cmFuc3BvcnQvUmVhZEFmdGVyUGVlckNsb3NlIiwgdGVzdF9yZWFkX2FmdGVyX3BlZXJfY2xvc2UpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA5Njk4MTg1Li45ZmI2OGI5Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYwpAQCAtMTcsNzkgKzE3LDIwNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgogCi0jZGVmaW5lIFRFU1RfREFUQSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyB9CitzdGF0aWMgY29uc3QgZ2NoYXIgVEVTVF9EQVRBWzExXSA9ICJhYmNkZWZnaGlqIjsKIAotI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMiCisjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMiCiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKLXRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KHZvaWQpCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSAodm9pZCkKIHsKICAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKLSAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmX3NpemUiLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKIHN0YXRpYyB2b2lkCi10ZXN0X29wZW5fYW5kX2Nsb3NlKHZvaWQpCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9sYXJnZSAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwICogMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV9leHRlcm5hbCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR0J5dGVBcnJheSAqYnVmID0gZ19ieXRlX2FycmF5X25ldyAoKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICJidWYiLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfdW5vd25lZCAodm9pZCkKK3sKKyAgR09iamVjdCAqb2JqZWN0ID0gTlVMTDsKKyAgR1ZhbHVlIHZhbCA9IEdfVkFMVUVfSU5JVDsKKyAgR0J5dGVBcnJheSAqYnVmOworCisgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3duZXIiLCBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKworICBnX3ZhbHVlX2luaXQgKCZ2YWwsIEdfVFlQRV9QT0lOVEVSKTsKKyAgZ19vYmplY3RfZ2V0X3Byb3BlcnR5IChvYmplY3QsICJidWYiLCAmdmFsKTsKKyAgYnVmID0gKEdCeXRlQXJyYXkqKSBnX3ZhbHVlX2dldF9wb2ludGVyICgmdmFsKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKworICBnX2J5dGVfYXJyYXlfdW5yZWYgKGJ1Zik7CisgIGdfdmFsdWVfdW5zZXQgKCZ2YWwpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfb3Blbl9hbmRfY2xvc2UgKHZvaWQpCiB7CiAgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CiAKICAgLyogY3JlYXRlIGEgVGhyaWZ0TWVtb3J5QnVmZmVyICovCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOwogCi0gIC8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9vcGVuIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2Nsb3NlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwgTlVMTCkgPT0gVFJVRSk7CisgIC8qIG5vLW9wcyAqLworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKKwogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CiAKIHN0YXRpYyB2b2lkCi10ZXN0X3JlYWRfYW5kX3dyaXRlKHZvaWQpCit0ZXN0X3JlYWRfYW5kX3dyaXRlICh2b2lkKQogewogICBUaHJpZnRNZW1vcnlCdWZmZXIgKnRidWZmZXIgPSBOVUxMOwotICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsKLSAgZ3VjaGFyIHJlYWRbMTBdOworICBnaW50IGdvdCwgd2FudDsKKyAgZ2NoYXIgcmVhZFsxMF07CisgIGdjaGFyICpiOwogICBHRXJyb3IgKmVycm9yID0gTlVMTDsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYnVmLAorICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICZlcnJvcikgPT0gRkFMU0UpOwotICBhc3NlcnQgKGVycm9yICE9IE5VTEwpOworICBnX2Fzc2VydCAoZXJyb3IgIT0gTlVMTCk7CiAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICBlcnJvciA9IE5VTEw7CiAgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAxNSwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGJ1ZiwgMTAsICZlcnJvcikgPT0gVFJVRSk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWQsIDEwLCAmZXJyb3IpID4gMCk7Ci0gIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIG1lbXNldChyZWFkLCAwLCAxMCk7CisgIGIgPSByZWFkOworICB3YW50ID0gMTA7CisgIHdoaWxlICh3YW50ID4gMCkgeworICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgIGIgKz0gZ290OworICAgIHdhbnQgLT0gZ290OworICB9CisgIGdfYXNzZXJ0IChtZW1jbXAgKHJlYWQsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQgKHZvaWQpCit7CisgIFRocmlmdE1lbW9yeUJ1ZmZlciAqdGJ1ZmZlciA9IE5VTEw7CisgIGdpbnQgZ290LCB3YW50LCBpOworICBnY2hhciByZWFkWzEwXTsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICBtZW1zZXQocmVhZCwgMCwgMTApOworICAgIGIgPSByZWFkOworICAgIHdhbnQgPSAxMDsKKyAgICB3aGlsZSAod2FudCA+IDApIHsKKyAgICAgIGdvdCA9IHRocmlmdF9tZW1vcnlfYnVmZmVyX3JlYWQgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgYiArPSBnb3Q7CisgICAgICB3YW50IC09IGdvdDsKKyAgICB9CisgICAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9yZWFkX2FuZF93cml0ZV9leHRlcm5hbCAodm9pZCkKK3sKKyAgVGhyaWZ0TWVtb3J5QnVmZmVyICp0YnVmZmVyID0gTlVMTDsKKyAgZ2NoYXIgKmI7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOworCisgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWYiLCBidWYsIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTAsICZlcnJvcikgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICBnX2Fzc2VydCAobWVtY21wIChidWYtPmRhdGEsIFRFU1RfREFUQSwgMTApID09IDApOworICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotICBnX3R5cGVfaW5pdCgpOworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveSIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95KTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveUxhcmdlIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfbGFyZ2UpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9DcmVhdGVBbmREZXN0cm95VW5saW1pdGVkIiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3lfZGVmYXVsdCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL0NyZWF0ZUFuZERlc3Ryb3lFeHRlcm5hbCIsIHRlc3RfY3JlYXRlX2FuZF9kZXN0cm95X2V4dGVybmFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvQ3JlYXRlQW5kRGVzdHJveVVub3duZWQiLCB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveV91bm93bmVkKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RtZW1vcnlidWZmZXIvT3BlbkFuZENsb3NlIiwgdGVzdF9vcGVuX2FuZF9jbG9zZSk7CiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0bWVtb3J5YnVmZmVyL1JlYWRBbmRXcml0ZSIsIHRlc3RfcmVhZF9hbmRfd3JpdGUpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVVbmxpbWl0ZWQiLCB0ZXN0X3JlYWRfYW5kX3dyaXRlX2RlZmF1bHQpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG1lbW9yeWJ1ZmZlci9SZWFkQW5kV3JpdGVFeHRlcm5hbCIsIHRlc3RfcmVhZF9hbmRfd3JpdGVfZXh0ZXJuYWwpOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDRmNmZlMTUuLjYzNmMzNmQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMKQEAgLTE3LDEzICsxNywxMiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWIuaD4KIAotI2luY2x1ZGUgPHRocmlmdC90aHJpZnRfc3RydWN0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuaD4KICNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmgiCiAKICNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9vcHRpb25hbF9yZXF1aXJlZF90ZXN0X3R5cGVzLmMiCkBAIC03NCwyMCArNzMsMjAgQEAKICAgczIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NJTVBMRSwgTlVMTCk7CiAgIHMzID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9TSU1QTEUsIE5VTEwpOwogCi0gIC8vIHdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMKKyAgLyogd3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcyAqLwogICBzMS0+aW1fb3B0aW9uYWwgPSAxMDsKLSAgYXNzZXJ0IChzMS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKLSAgYXNzZXJ0IChzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7ICAKKyAgZ19hc3NlcnQgKHMxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOyAgCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczIpLCBOVUxMLCBOVUxMKTsKLSAgYXNzZXJ0IChzMi0+X19pc3NldF9pbV9kZWZhdWx0ID0gVFJVRSk7Ci0gIGFzc2VydCAoczItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOwotICBhc3NlcnQgKHMyLT5pbV9vcHRpb25hbCA9PSAwKTsKKyAgZ19hc3NlcnQgKHMyLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0IChzMi0+aW1fb3B0aW9uYWwgPT0gMCk7CiAKICAgczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPSBUUlVFOwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUIChzMSksIFRIUklGVF9TVFJVQ1QgKHMzKSwgTlVMTCwgTlVMTCk7Ci0gIGFzc2VydCAoczMtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKLSAgYXNzZXJ0IChzMy0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKLSAgYXNzZXJ0IChzMy0+aW1fb3B0aW9uYWwgPT0gMTApOworICBnX2Fzc2VydCAoczMtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMzLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IFRSVUUpOworICBnX2Fzc2VydCAoczMtPmltX29wdGlvbmFsID09IDEwKTsKIAogICBnX29iamVjdF91bnJlZiAoczEpOwogICBnX29iamVjdF91bnJlZiAoczIpOwpAQCAtMTA5LDEwICsxMDgsMTAgQEAKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MSksIE5VTEwsIE5VTEwpOwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKLSAgYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSB0Mi0+aW1fb3B0aW9uYWwpOwotICBhc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IDApOworICBnX2Fzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHQxLT5pbV9kZWZhdWx0ID09IHQyLT5pbV9vcHRpb25hbCk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSAwKTsKIAogICBnX29iamVjdF91bnJlZiAodDEpOwogICBnX29iamVjdF91bnJlZiAodDIpOwpAQCAtMTMzLDcgKzEzMiw3IEBACiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQxKSwgVEhSSUZUX1NUUlVDVCAodDMpLCBOVUxMLCBOVUxMKTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDMpLCBUSFJJRlRfU1RSVUNUICh0MSksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQxKTsKICAgZ19vYmplY3RfdW5yZWYgKHQzKTsKQEAgLTE3NCwyMyArMTczLDQ2IEBACiAgIHQyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9UUklDS1kyLCBOVUxMKTsKICAgdDMgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RSSUNLWTMsIE5VTEwpOwogCi0gIC8vIHRocm93cyBwcm90b2NvbCBleGNlcHRpb24KKyAgLyogdGhyb3dzIHByb3RvY29sIGV4Y2VwdGlvbiAqLwogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MiksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgJnJlYWRfZXJyb3IpOwotICBhc3NlcnQgKHJlYWRfZXJyb3IgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChyZWFkX2Vycm9yICE9IE5VTEwpOwogICBnX2Vycm9yX2ZyZWUgKHJlYWRfZXJyb3IpOwogCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDIpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsKTsKKyAgZ19hc3NlcnQgKHQyLT5fX2lzc2V0X2ltX29wdGlvbmFsKTsKIAogICBnX29iamVjdF91bnJlZiAodDIpOwogICBnX29iamVjdF91bnJlZiAodDMpOwogfQogCitzdGF0aWMgdm9pZAordGVzdF9ub25fc2V0X2JpbmFyeSAodm9pZCkKK3sKKyAgVFRlc3RCaW5hcmllcyAqYjEgPSBOVUxMOworICBUVGVzdEJpbmFyaWVzICpiMiA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3IgPSBOVUxMOworCisgIGIxID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CSU5BUklFUywgTlVMTCk7CisgIGIyID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9CSU5BUklFUywgTlVMTCk7CisKKyAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoYjEpLCBUSFJJRlRfU1RSVUNUIChiMiksIE5VTEwsICZlcnJvcik7CisgIGdfYXNzZXJ0KCFlcnJvcik7CisgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKGIyKSwgVEhSSUZUX1NUUlVDVCAoYjEpLCBOVUxMLCAmZXJyb3IpOworICBnX2Fzc2VydCghZXJyb3IpOworICAvKiBPSy4gTm8gc2VnZmF1bHQgKi8KKworICBnX29iamVjdF91bnJlZiAoYjEpOworICBnX29iamVjdF91bnJlZiAoYjIpOworfQorCiBpbnQKIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTiAoMiwgMzYsIDApKQogICBnX3R5cGVfaW5pdCgpOworI2VuZGlmCisKICAgZ190ZXN0X2luaXQgKCZhcmdjLCAmYXJndiwgTlVMTCk7CiAKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL09sZFNjaG9vbCIsIHRlc3Rfb2xkX3NjaG9vbDEpOwpAQCAtMTk5LDYgKzIyMSw3IEBACiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9Ucmlja3kyIiwgdGVzdF90cmlja3kyKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3RvcHRpb25hbHJlcXVpcmVkL1RyaWNreTMiLCB0ZXN0X3RyaWNreTMpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdG9wdGlvbmFscmVxdWlyZWQvVHJpY2t5NCIsIHRlc3RfdHJpY2t5NCk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0b3B0aW9uYWxyZXF1aXJlZC9CaW5hcnkiLCB0ZXN0X25vbl9zZXRfYmluYXJ5KTsKIAogICByZXR1cm4gZ190ZXN0X3J1biAoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzZXJpYWxpemF0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNDExZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2VyaWFsaXphdGlvbi5jCkBAIC0wLDAgKzEsOTUgQEAKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgImdlbi1jX2dsaWIvdF90ZXN0X2RlYnVnX3Byb3RvX3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJnZW4tY19nbGliL3RfdGVzdF9lbnVtX3Rlc3RfdHlwZXMuaCIKKworc3RhdGljIHZvaWQgZW51bV9jb25zdGFudHNfcmVhZF93cml0ZSgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDEwMjQsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3QqIHNyYyA9IFRfVEVTVF9FTlVNX1RFU1Q7CisgIFRUZXN0RW51bVRlc3RTdHJ1Y3QqIGRzdCA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9FTlVNX1RFU1RfU1RSVUNULCBOVUxMKTsKKyAgVFRlc3RFbnVtVGVzdFN0cnVjdENsYXNzKiBjbHMgPSBUX1RFU1RfRU5VTV9URVNUX1NUUlVDVF9HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnVjdF9jb25zdGFudHNfcmVhZF93cml0ZSgpIHsKKyAgR0Vycm9yKiBlcnJvciA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCogdHJhbnNwb3J0CisgICAgICA9IFRIUklGVF9UUkFOU1BPUlQoZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDQwOTYsIE5VTEwpKTsKKyAgVGhyaWZ0UHJvdG9jb2wqIHByb3RvY29sCisgICAgICA9IFRIUklGVF9QUk9UT0NPTChnX29iamVjdF9uZXcoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LCBOVUxMKSk7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdCogc3JjID0gVF9URVNUX0NPTVBBQ1RfVEVTVDsKKyAgVFRlc3RDb21wYWN0UHJvdG9UZXN0U3RydWN0KiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQ09NUEFDVF9QUk9UT19URVNUX1NUUlVDVCwgTlVMTCk7CisgIFRUZXN0Q29tcGFjdFByb3RvVGVzdFN0cnVjdENsYXNzKiBjbHMgPSBUX1RFU1RfQ09NUEFDVF9QUk9UT19URVNUX1NUUlVDVF9HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnVjdF9yZWFkX3dyaXRlX2xlbmd0aF9zaG91bGRfZXF1YWwoKSB7CisgIEdFcnJvciogZXJyb3IgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQqIHRyYW5zcG9ydAorICAgICAgPSBUSFJJRlRfVFJBTlNQT1JUKGdfb2JqZWN0X25ldyhUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCAyMDQ4LCBOVUxMKSk7CisgIFRocmlmdFByb3RvY29sKiBwcm90b2NvbAorICAgICAgPSBUSFJJRlRfUFJPVE9DT0woZ19vYmplY3RfbmV3KFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwgTlVMTCkpOworICBUVGVzdEJvbmsqIHNyYyA9IGdfb2JqZWN0X25ldyhUX1RFU1RfVFlQRV9CT05LLCBOVUxMKTsKKyAgVFRlc3RCb25rKiBkc3QgPSBnX29iamVjdF9uZXcoVF9URVNUX1RZUEVfQk9OSywgTlVMTCk7CisgIFRUZXN0Qm9ua0NsYXNzKiBjbHMgPSBUX1RFU1RfQk9OS19HRVRfQ0xBU1Moc3JjKTsKKyAgaW50IHdyaXRlX2xlbjsKKyAgaW50IHJlYWRfbGVuOworCisgIHdyaXRlX2xlbiA9IFRIUklGVF9TVFJVQ1RfQ0xBU1MoY2xzKS0+d3JpdGUoVEhSSUZUX1NUUlVDVChzcmMpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnQod3JpdGVfbGVuID4gMCk7CisKKyAgcmVhZF9sZW4gPSBUSFJJRlRfU1RSVUNUX0NMQVNTKGNscyktPnJlYWQoVEhSSUZUX1NUUlVDVChkc3QpLCBwcm90b2NvbCwgJmVycm9yKTsKKyAgZ19hc3NlcnQoIWVycm9yKTsKKyAgZ19hc3NlcnRfY21waW50KHdyaXRlX2xlbiwgPT0sIHJlYWRfbGVuKTsKKworICBnX29iamVjdF91bnJlZihkc3QpOworICBnX29iamVjdF91bnJlZihzcmMpOworICBnX29iamVjdF91bnJlZihwcm90b2NvbCk7CisgIGdfb2JqZWN0X3VucmVmKHRyYW5zcG9ydCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZiAoIUdMSUJfQ0hFQ0tfVkVSU0lPTigyLCAzNiwgMCkpCisgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKyAgZ190ZXN0X2luaXQoJmFyZ2MsICZhcmd2LCBOVUxMKTsKKworICBnX3Rlc3RfYWRkX2Z1bmMoIi90ZXN0c2VyaWFsaXphdGlvbi9TdHJ1Y3RSZWFkV3JpdGVMZW5ndGhTaG91bGRFcXVhbCIsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3RfcmVhZF93cml0ZV9sZW5ndGhfc2hvdWxkX2VxdWFsKTsKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vU3RydWN0Q29uc3RhbnRzIiwgc3RydWN0X2NvbnN0YW50c19yZWFkX3dyaXRlKTsKKyAgZ190ZXN0X2FkZF9mdW5jKCIvdGVzdHNlcmlhbGl6YXRpb24vRW51bUNvbnN0YW50cyIsIGVudW1fY29uc3RhbnRzX3JlYWRfd3JpdGUpOworICByZXR1cm4gZ190ZXN0X3J1bigpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA2ZjdkM2E0Li4zYzZmMmU4Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpAQCAtMTcsMjAgKzE3LDE5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Z2xpYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKICNkZWZpbmUgVEVTVF9QT1JUIDUxMTk5CiAKLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL3RocmlmdF9zaW1wbGVfc2VydmVyLmM+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NpbXBsZV9zZXJ2ZXIuYz4KIAogLyogY3JlYXRlIGEgcnVkaW1lbnRhcnkgcHJvY2Vzc29yICovCiAjZGVmaW5lIFRFU1RfUFJPQ0VTU09SX1RZUEUgKHRlc3RfcHJvY2Vzc29yX2dldF90eXBlICgpKQpAQCAtNTEsOCArNTAsMTMgQEAKIAogZ2Jvb2xlYW4KIHRlc3RfcHJvY2Vzc29yX3Byb2Nlc3MgKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBUaHJpZnRQcm90b2NvbCAqaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRQcm90b2NvbCAqb3V0KQorICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKm91dCwgR0Vycm9yICoqZXJyb3IpCiB7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm9jZXNzb3IpOworICBUSFJJRlRfVU5VU0VEX1ZBUiAoaW4pOworICBUSFJJRlRfVU5VU0VEX1ZBUiAob3V0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICByZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTg0LDExICs4OCwxMiBAQAogCiAgIC8qIHJ1biB0aGUgc2VydmVyIGluIGEgY2hpbGQgcHJvY2VzcyAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKLSAgICBUSFJJRlRfU0VSVkVSX0dFVF9DTEFTUyAoVEhSSUZUX1NFUlZFUiAoc3MpKS0+c2VydmUgKFRIUklGVF9TRVJWRVIgKHNzKSk7CisgICAgVEhSSUZUX1NFUlZFUl9HRVRfQ0xBU1MgKFRIUklGVF9TRVJWRVIgKHNzKSktPnNlcnZlIChUSFJJRlRfU0VSVkVSIChzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICBleGl0ICgwKTsKICAgfSBlbHNlIHsKICAgICBzbGVlcCAoNSk7CkBAIC05NywxNSArMTAyLDE4IEBACiAgICAgZ19vYmplY3RfdW5yZWYgKHNzKTsKICAgICBnX29iamVjdF91bnJlZiAodHNzKTsKICAgICBnX29iamVjdF91bnJlZiAocCk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IFNJR0lOVCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSBTSUdJTlQpOwogICB9CiB9CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHNpbXBsZXNlcnZlci9TaW1wbGVTZXJ2ZXIiLCB0ZXN0X3NlcnZlcik7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDUwYjEwZGMuLmQxMjBjYmMKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCkBAIC0xNywxMCArMTcsOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CiAKLSNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L3RocmlmdF9zdHJ1Y3QuYyIKKyNpbmNsdWRlICIuLi9zcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfc3RydWN0LmMiCiAKIC8qIHRlc3RzIHRvIGVuc3VyZSB3ZSBjYW4gZXh0ZW5kIGEgVGhyaWZ0U3RydWN0ICovCiAKQEAgLTUxLDYgKzUwLDEwIEBACiB0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZCAoVGhyaWZ0U3RydWN0ICpvYmplY3QsIFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChwcm90b2NvbCk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTU4LDYgKzYxLDEwIEBACiB0aHJpZnRfdGVzdF9zdHJ1Y3Rfd3JpdGUgKFRocmlmdFN0cnVjdCAqb2JqZWN0LCBUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogeworICBUSFJJRlRfVU5VU0VEX1ZBUiAob2JqZWN0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKwogICByZXR1cm4gMDsKIH0KIApAQCAtODEsNyArODgsNyBAQAogICBUaHJpZnRUZXN0U3RydWN0ICp0ID0gTlVMTDsKIAogICB0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9URVNUX1NUUlVDVCwgTlVMTCk7Ci0gIGFzc2VydCAoIFRIUklGVF9JU19TVFJVQ1QgKHQpKTsKKyAgZ19hc3NlcnQgKCBUSFJJRlRfSVNfU1RSVUNUICh0KSk7CiAgIHRocmlmdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwogICB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CiAgIHRocmlmdF90ZXN0X3N0cnVjdF9yZWFkIChUSFJJRlRfU1RSVUNUICh0KSwgTlVMTCwgTlVMTCk7CkBAIC05Miw3ICs5OSwxMCBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCiAgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOwogCiAgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0c3RydWN0L0luaXRpYWxpemVPYmplY3QiLCB0ZXN0X2luaXRpYWxpemVfb2JqZWN0KTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA4MDYxNjZlLi4yM2E5MzRkCi0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdC5jCkBAIC0xLDE0ICsxLDE3IEBACi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KIAotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisKKyNpbmNsdWRlICJ0X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaCIKKyNpbmNsdWRlICJ0aHJpZnRfdGVzdF9oYW5kbGVyLmgiCiAKIHN0YXRpYyBjb25zdCBjaGFyIFRFU1RfQUREUkVTU1tdID0gImxvY2FsaG9zdCI7CiBzdGF0aWMgY29uc3QgaW50IFRFU1RfUE9SVCA9IDY0NDQ0OwogCiBzdGF0aWMgdm9pZAotdGVzdF90aHJpZnRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3Rlc3RfdGhyaWZ0X3NlcnZlciAodm9pZCkKIHsKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9QT1JULCBOVUxMKTsKQEAgLTE2LDEzICsxOSw5NCBAQAogICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiB9CiAKK3N0YXRpYyB2b2lkCitzZXRfaW5kaWNhdG9yIChncG9pbnRlciBkYXRhLCBHT2JqZWN0ICp3aGVyZV90aGVfb2JqZWN0X3dhcykgeworICBUSFJJRlRfVU5VU0VEX1ZBUih3aGVyZV90aGVfb2JqZWN0X3dhcyk7CisKKyAgKihnYm9vbGVhbiAqKSBkYXRhID0gVFJVRTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3RfdGhyaWZ0X2hhbmRsZXIgKHZvaWQpCit7CisgIEdFcnJvciAqZXJyb3I7CisgIEdIYXNoVGFibGUgKl9yZXR1cm47CisgIFRUZXN0SW5zYW5pdHkgKmFyZ3VtZW50OworICBnYm9vbGVhbiBpbmRpY2F0b3I7CisKKyAgVFRlc3RYdHJ1Y3QgICp4dHJ1Y3QsICAqeHRydWN0MjsKKyAgVFRlc3ROdW1iZXJ6IG51bWJlcno7CisgIFRUZXN0TnVtYmVyeiBudW1iZXJ6MjsKKyAgVFRlc3RVc2VySWQgdXNlcl9pZCwgKnVzZXJfaWRfcHRyLCAqdXNlcl9pZF9wdHIyOworICBHSGFzaFRhYmxlICp1c2VyX21hcDsKKyAgR1B0ckFycmF5ICp4dHJ1Y3RzOworCisgIGVycm9yID0gTlVMTDsKKyAgaW5kaWNhdG9yID0gRkFMU0U7CisKKyAgdXNlcl9tYXAgPSBOVUxMOworICB4dHJ1Y3RzID0gTlVMTDsKKworICBhcmd1bWVudCA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfSU5TQU5JVFksIE5VTEwpOworICBnX29iamVjdF9nZXQgKGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICJ1c2VyTWFwIiwgJnVzZXJfbWFwLAorICAgICAgICAgICAgICAgICJ4dHJ1Y3RzIiwgJnh0cnVjdHMsCisgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgbnVtYmVyeiA9IFRfVEVTVF9OVU1CRVJaX0ZJVkU7CisgIG51bWJlcnoyID0gVF9URVNUX05VTUJFUlpfRUlHSFQ7CisgIHVzZXJfaWRfcHRyID0gZ19tYWxsb2MgKHNpemVvZiAqdXNlcl9pZF9wdHIpOworICAqdXNlcl9pZF9wdHIgPSA1OworICB1c2VyX2lkX3B0cjIgPSBnX21hbGxvYyAoc2l6ZW9mICp1c2VyX2lkX3B0cik7CisgICp1c2VyX2lkX3B0cjIgPSA4OworICBnX2hhc2hfdGFibGVfaW5zZXJ0ICh1c2VyX21hcCwgKGdwb2ludGVyKW51bWJlcnosIHVzZXJfaWRfcHRyKTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAodXNlcl9tYXAsIChncG9pbnRlciludW1iZXJ6MiwgdXNlcl9pZF9wdHIyKTsKKyAgZ19oYXNoX3RhYmxlX3VucmVmICh1c2VyX21hcCk7CisKKyAgeHRydWN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJIZWxsbzIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpMzJfdGhpbmciLCAgICAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpNjRfdGhpbmciLCAgICAyTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIHh0cnVjdDIgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1hUUlVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ190aGluZyIsICJHb29kYnllNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlX3RoaW5nIiwgICA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyX3RoaW5nIiwgICAgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NF90aGluZyIsICAgIDRMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0Mik7CisgIGdfcHRyX2FycmF5X2FkZCAoeHRydWN0cywgeHRydWN0KTsKKyAgZ19wdHJfYXJyYXlfdW5yZWYgKHh0cnVjdHMpOworCisgIF9yZXR1cm4gPSBnX2hhc2hfdGFibGVfbmV3X2Z1bGwgKGdfaW50NjRfaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19pbnQ2NF9lcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19mcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR0Rlc3Ryb3lOb3RpZnkpZ19oYXNoX3RhYmxlX3VucmVmKTsKKworICBnX29iamVjdF93ZWFrX3JlZiAoR19PQkpFQ1QgKGFyZ3VtZW50KSwgc2V0X2luZGljYXRvciwgKGdwb2ludGVyKSAmaW5kaWNhdG9yKTsKKworICBnX2Fzc2VydCAodGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5IChOVUxMLCAmX3JldHVybiwgYXJndW1lbnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBpbmRpY2F0b3IpOworCisgIGdfaGFzaF90YWJsZV91bnJlZiAoX3JldHVybik7CisgIGdfYXNzZXJ0ICghIGluZGljYXRvcik7CisKKyAgZ19vYmplY3RfdW5yZWYgKGFyZ3VtZW50KTsKKyAgZ19hc3NlcnQgKGluZGljYXRvcik7Cit9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRocmlmdC9TZXJ2ZXIiLCB0ZXN0X3RocmlmdF9zZXJ2ZXIpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRocmlmdC9IYW5kbGVyIiwgdGVzdF90aHJpZnRfaGFuZGxlcik7CiAKICAgcmV0dXJuIGdfdGVzdF9ydW4gKCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDVkNDAzMzEuLjE5MTBjOGEKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcAorKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgKi8KKy8qIHRlc3QgYSBDIGNsaWVudCB3aXRoIGEgQysrIHNlcnZlciAgKHRoYXQgbWFrZXMgc2Vuc2UuLi4pICovCiAKICNpbmNsdWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTI1LDIzICsyNSwzNCBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogI2luY2x1ZGUgIlRocmlmdFRlc3RfdHlwZXMuaCIKIAogI2luY2x1ZGUgPGlvc3RyZWFtPgotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7CiAKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6Zml4ZWQ7Cit1c2luZyBzdGQ6Om1ha2VfcGFpcjsKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpzZXQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCiAjZGVmaW5lIFRFU1RfUE9SVCA5OTgwCiAKIC8vIEV4dHJhIGZ1bmN0aW9ucyByZXF1aXJlZCBmb3IgVGhyaWZ0VGVzdF90eXBlcyB0byB3b3JrCkBAIC01OSwxMTkgKzcwLDEzMCBAQAogICBUZXN0SGFuZGxlcigpIHt9CiAKICAgdm9pZCB0ZXN0Vm9pZCgpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFZvaWQoKVxuIik7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Vm9pZCgpIiA8PCBlbmRsOwogICB9CiAKICAgdm9pZCB0ZXN0U3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0U3RyaW5nKFwiIiA8PCB0aGluZyA8PCAiXCIpIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKKyAgYm9vbCB0ZXN0Qm9vbChjb25zdCBib29sIHRoaW5nKSB7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Qm9vbCgiIDw8ICh0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSIpIDw8ICIpIiA8PCBlbmRsOworICAgIHJldHVybiB0aGluZzsKKyAgfQogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RCeXRlKCVkKVxuIiwgKGludCl0aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0Qnl0ZSgiIDw8IChpbnQpdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAgIGludDMyX3QgdGVzdEkzMihjb25zdCBpbnQzMl90IHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RJMzIoJWQpXG4iLCB0aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0STMyKCIgPDwgdGhpbmcgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKICAgaW50NjRfdCB0ZXN0STY0KGNvbnN0IGludDY0X3QgdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEk2NCglbGxkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEk2NCgiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCiAgIGRvdWJsZSB0ZXN0RG91YmxlKGNvbnN0IGRvdWJsZSB0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0RG91YmxlKCVsZilcbiIsIHRoaW5nKTsKKyAgICBjb3V0LnByZWNpc2lvbig2KTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3REb3VibGUoIiA8PCBmaXhlZCA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAorICB2b2lkIHRlc3RCaW5hcnkoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmdGhpbmcpIHsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RCaW5hcnkoXCIiIDw8IHRoaW5nIDw8ICJcIikiIDw8IGVuZGw7CisgICAgb3V0ID0gdGhpbmc7CisgIH0KKwogICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdFN0cnVjdCh7XCIlc1wiLCAlZCwgJWQsICVsbGR9KVxuIiwgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdFN0cnVjdCh7XCIiIDw8IHRoaW5nLnN0cmluZ190aGluZyA8PCAiXCIsICIgPDwgKGludCl0aGluZy5ieXRlX3RoaW5nIDw8ICIsICIgPDwgdGhpbmcuaTMyX3RoaW5nIDw8ICIsICIgPDwgdGhpbmcuaTY0X3RoaW5nIDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIHZvaWQgdGVzdE5lc3QoWHRydWN0MiYgb3V0LCBjb25zdCBYdHJ1Y3QyJiBuZXN0KSB7CiAgICAgY29uc3QgWHRydWN0ICZ0aGluZyA9IG5lc3Quc3RydWN0X3RoaW5nOwotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJWxsZH0sICVkfSlcbiIsIChpbnQpbmVzdC5ieXRlX3RoaW5nLCB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl0aGluZy5ieXRlX3RoaW5nLCB0aGluZy5pMzJfdGhpbmcsIHRoaW5nLmk2NF90aGluZywgbmVzdC5pMzJfdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE5lc3QoeyIgPDwgKGludCluZXN0LmJ5dGVfdGhpbmcgPDwgIiwge1wiIiA8PCB0aGluZy5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpdGhpbmcuYnl0ZV90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmkzMl90aGluZyA8PCAiLCAiIDw8IHRoaW5nLmk2NF90aGluZyA8PCAifSwgIiA8PCBuZXN0LmkzMl90aGluZyA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gbmVzdDsKICAgfQogCiAgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4gJm91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+ICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TWFwKHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNYXAoeyI7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBtX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKICAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZvdXQsIGNvbnN0IG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0U3RyaW5nTWFwKHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTdHJpbmdNYXAoeyI7CiAgICAgbWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKG1faXRlciA9IHRoaW5nLmJlZ2luKCk7IG1faXRlciAhPSB0aGluZy5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaXJzdCkgewogICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIsICIpOworICAgICAgICBjb3V0IDw8ICIsICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIlwiJXNcIiA9PiBcIiVzXCIiLCAobV9pdGVyLT5maXJzdCkuY19zdHIoKSwgKG1faXRlci0+c2Vjb25kKS5jX3N0cigpKTsKKyAgICAgIGNvdXQgPDwgIlwiIiA8PCBtX2l0ZXItPmZpcnN0IDw8ICJcIiA9PiBcIiIgPDwgbV9pdGVyLT5zZWNvbmQgPDwgIlwiIjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KVxuIik7CisgICAgY291dCA8PCAifSkiIDw8IGVuZGw7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogCiAgIHZvaWQgdGVzdFNldChzZXQ8aW50MzJfdD4gJm91dCwgY29uc3Qgc2V0PGludDMyX3Q+ICZ0aGluZykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0U2V0KHsiKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RTZXQoeyI7CiAgICAgc2V0PGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChzX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBzX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCAiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCIsICpzX2l0ZXIpOworICAgICAgY291dCA8PCAqc19pdGVyOwogICAgIH0KLSAgICBwcmludGYoIn0pXG4iKTsKKyAgICBjb3V0IDw8ICJ9KSIgPDwgZW5kbDsKICAgICBvdXQgPSB0aGluZzsKICAgfQogCiAgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+ICZvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiAmdGhpbmcpIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdExpc3QoeyIpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdExpc3QoeyI7CiAgICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChsX2l0ZXIgPSB0aGluZy5iZWdpbigpOyBsX2l0ZXIgIT0gdGhpbmcuZW5kKCk7ICsrbF9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7ICAgICAgICBwcmludGYoIiwgIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb3V0IDw8ICIsICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKmxfaXRlcik7CisgICAgICBjb3V0IDw8ICpsX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifSlcbiIpOworICAgIGNvdXQgPDwgIn0pIiA8PCBlbmRsOwogICAgIG91dCA9IHRoaW5nOwogICB9CiAKICAgTnVtYmVyejo6dHlwZSB0ZXN0RW51bShjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RFbnVtKCVkKVxuIiwgdGhpbmcpOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdEVudW0oIiA8PCB0aGluZyA8PCAiKSIgPDwgZW5kbDsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAogICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RUeXBlZGVmKCVsbGQpXG4iLCB0aGluZyk7CisgICAgY291dCA8PCAiW0MgLT4gQysrXSB0ZXN0VHlwZWRlZigiIDw8IHRoaW5nIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldHVybiB0aGluZzsgIH0KIAogICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgewotICAgIHByaW50ZigiW0MgLT4gQysrXSB0ZXN0TWFwTWFwKCVkKVxuIiwgaGVsbG8pOworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE1hcE1hcCgiIDw8IGhlbGxvIDw8ICIpIiA8PCBlbmRsOwogCiAgICAgbWFwPGludDMyX3QsaW50MzJfdD4gcG9zOwogICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG5lZzsKQEAgLTE4Niw3ICsyMDgsOSBAQAogICB9CiAKICAgdm9pZCB0ZXN0SW5zYW5pdHkobWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID4gJmluc2FuZSwgY29uc3QgSW5zYW5pdHkgJmFyZ3VtZW50KSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RJbnNhbml0eSgpXG4iKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmd1bWVudCk7CisKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RJbnNhbml0eSgpIiA8PCBlbmRsOwogCiAgICAgWHRydWN0IGhlbGxvOwogICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwpAQCAtMjE5LDQzICsyNDMsNDYgQEAKICAgICBpbnNhbmUuaW5zZXJ0KG1ha2VfcGFpcigxLCBmaXJzdF9tYXApKTsKICAgICBpbnNhbmUuaW5zZXJ0KG1ha2VfcGFpcigyLCBzZWNvbmRfbWFwKSk7CiAKLSAgICBwcmludGYoInJldHVybiIpOwotICAgIHByaW50ZigiID0geyIpOworICAgIGNvdXQgPDwgInJldHVybiA9IHsiOwogICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CiAgICAgZm9yIChpX2l0ZXIgPSBpbnNhbmUuYmVnaW4oKTsgaV9pdGVyICE9IGluc2FuZS5lbmQoKTsgKytpX2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJWxsZCA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CisgICAgICBjb3V0IDw8IGlfaXRlci0+Zmlyc3QgPDwgIiA9PiB7IjsKICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKICAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7CiAgICAgICAgICAgIGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7CiAgICAgICAgICAgICsraTJfaXRlcikgewotICAgICAgICBwcmludGYoIiVkID0+IHsiLCBpMl9pdGVyLT5maXJzdCk7CisgICAgICAgIGNvdXQgPDwgaTJfaXRlci0+Zmlyc3QgPDwgIiA9PiB7IjsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwogICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07Ci0gICAgICAgIHByaW50ZigieyIpOworICAgICAgICBjb3V0IDw8ICJ7IjsKICAgICAgICAgZm9yICh1bSA9IHVzZXJNYXAuYmVnaW4oKTsgdW0gIT0gdXNlck1hcC5lbmQoKTsgKyt1bSkgewotICAgICAgICAgIHByaW50ZigiJWQgPT4gJWxsZCwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKKyAgICAgICAgICBjb3V0IDw8IHVtLT5maXJzdCA8PCAiID0+ICIgPDwgdW0tPnNlY29uZCA8PCAiLCAiOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSwgIik7CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAKICAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwogICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKLSAgICAgICAgcHJpbnRmKCJ7Iik7CisgICAgICAgIGNvdXQgPDwgInsiOwogICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7Ci0gICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICVsbGR9LCAiLCB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl4LT5ieXRlX3RoaW5nLCB4LT5pMzJfdGhpbmcsIHgtPmk2NF90aGluZyk7CisgICAgICAgICAgY291dCA8PCAie1wiIiA8PCB4LT5zdHJpbmdfdGhpbmcgPDwgIlwiLCAiIDw8IChpbnQpeC0+Ynl0ZV90aGluZyA8PCAiLCAiIDw8IHgtPmkzMl90aGluZyA8PCAiLCAiIDw8IHgtPmk2NF90aGluZyA8PCAifSwgIjsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIn0iKTsKKyAgICAgICAgY291dCA8PCAifSI7CiAKLSAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgY291dCA8PCAifSwgIjsKICAgICAgIH0KLSAgICAgIHByaW50ZigifSwgIik7CisgICAgICBjb3V0IDw8ICJ9LCAiOwogICAgIH0KLSAgICBwcmludGYoIn1cbiIpOworICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7CiAKIAogICB9CiAKICAgdm9pZCB0ZXN0TXVsdGkoWHRydWN0ICZoZWxsbywgY29uc3QgaW50OF90IGFyZzAsIGNvbnN0IGludDMyX3QgYXJnMSwgY29uc3QgaW50NjRfdCBhcmcyLCBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4gICZhcmczLCBjb25zdCBOdW1iZXJ6Ojp0eXBlIGFyZzQsIGNvbnN0IFVzZXJJZCBhcmc1KSB7Ci0gICAgcHJpbnRmKCJbQyAtPiBDKytdIHRlc3RNdWx0aSgpXG4iKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmczKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmc0KTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChhcmc1KTsKKworICAgIGNvdXQgPDwgIltDIC0+IEMrK10gdGVzdE11bHRpKCkiIDw8IGVuZGw7CiAKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKQEAgLTI2Niw3ICsyOTMsNyBAQAogICB2b2lkIHRlc3RFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmFyZykKICAgICB0aHJvdyhYY2VwdGlvbiwgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24pCiAgIHsKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdEV4Y2VwdGlvbiglcylcbiIsIGFyZy5jX3N0cigpKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RFeGNlcHRpb24oIiA8PCBhcmcgPDwgIikiIDw8IGVuZGw7CiAgICAgaWYgKGFyZy5jb21wYXJlKCJYY2VwdGlvbiIpID09IDApIHsKICAgICAgIFhjZXB0aW9uIGU7CiAgICAgICBlLmVycm9yQ29kZSA9IDEwMDE7CkBAIC0yODQsNyArMzExLDcgQEAKIAogICB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihYdHJ1Y3QgJnJlc3VsdCwgY29uc3Qgc3RkOjpzdHJpbmcgJmFyZzAsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcxKSB0aHJvdyhYY2VwdGlvbiwgWGNlcHRpb24yKSB7CiAKLSAgICBwcmludGYoIltDIC0+IEMrK10gdGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsIGFyZzAuY19zdHIoKSwgYXJnMS5jX3N0cigpKTsKKyAgICBjb3V0IDw8ICJbQyAtPiBDKytdIHRlc3RNdWx0aUV4Y2VwdGlvbigiIDw8IGFyZzAgPDwgIiwgIiA8PCBhcmcxIDw8ICIpIiA8PCBlbmRsOwogCiAgICAgaWYgKGFyZzAuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwpAQCAtMzAzLDIwICszMzAsMjIgQEAKICAgfQogCiAgIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2xlZXBGb3IpOworICAgIGNvdXQgPDwgInRlc3RPbmV3YXkoIiA8PCBzbGVlcEZvciA8PCAiKTogU2xlZXBpbmcuLi4iIDw8IGVuZGw7CiAgICAgc2xlZXAoc2xlZXBGb3IpOwotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzbGVlcEZvcik7CisgICAgY291dCA8PCAidGVzdE9uZXdheSgiIDw8IHNsZWVwRm9yIDw8ICIpOiBkb25lIHNsZWVwaW5nISIgPDwgZW5kbDsKICAgfQogfTsKIAogLy8gQyBDTElFTlQKIGV4dGVybiAiQyIgewogCisjdW5kZWYgVEhSSUZUX1NPQ0tFVCAvKiBmcm9tIGxpYi9jcHAgKi8KKwogI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdC5oIgogI2luY2x1ZGUgInRfdGVzdF90aHJpZnRfdGVzdF90eXBlcy5oIgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgogCiBzdGF0aWMgdm9pZAogdGVzdF90aHJpZnRfY2xpZW50ICh2b2lkKQpAQCAtMzI5LDcgKzM1OCw3IEBACiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOwogICBnaW50OCBieXRlID0gMDsKICAgZ2ludDE2IGkxNiA9IDA7Ci0gIGdpbnQzMiBpMzIgPSAwLCBhbm90aGVyX2kzMiA9IDU2Nzg5OyAKKyAgZ2ludDMyIGkzMiA9IDAsIGFub3RoZXJfaTMyID0gNTY3ODk7CiAgIGdpbnQ2NCBpNjQgPSAwOwogICBkb3VibGUgZGJsID0gMC4wOwogICBUVGVzdFh0cnVjdCAqeHRydWN0X2luLCAqeHRydWN0X291dDsKQEAgLTMzOCw3ICszNjcsNyBAQAogICBHSGFzaFRhYmxlICpzZXRfaW4gPSBOVUxMLCAqc2V0X291dCA9IE5VTEw7CiAgIEdBcnJheSAqbGlzdF9pbiA9IE5VTEwsICpsaXN0X291dCA9IE5VTEw7CiAgIFRUZXN0TnVtYmVyeiBlbnVtX2luLCBlbnVtX291dDsKLSAgVFRlc3RVc2VySWQgdXNlcl9pZF9pbiwgdXNlcl9pZF9vdXQ7IAorICBUVGVzdFVzZXJJZCB1c2VyX2lkX2luLCB1c2VyX2lkX291dDsKICAgR0hhc2hUYWJsZSAqaW5zYW5pdHlfaW4gPSBOVUxMOwogICBUVGVzdFh0cnVjdCAqeHRydWN0MSwgKnh0cnVjdDI7CiAgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCA9IE5VTEw7CkBAIC0zNDcsMTEgKzM3NiwxMyBAQAogICBUVGVzdFhjZXB0aW9uICp4Y2VwdGlvbiA9IE5VTEw7CiAgIFRUZXN0WGNlcHRpb24yICp4Y2VwdGlvbjIgPSBOVUxMOwogCisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKICAgLy8gaW5pdGlhbGl6ZSBnb2JqZWN0CiAgIGdfdHlwZV9pbml0ICgpOworI2VuZGlmCiAKICAgLy8gY3JlYXRlIGEgQyBjbGllbnQKLSAgdHNvY2tldCA9IChUaHJpZnRTb2NrZXQgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsIAorICB0c29ja2V0ID0gKFRocmlmdFNvY2tldCAqKSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgVEVTVF9QT1JULCBOVUxMKTsKICAgcHJvdG9jb2wgPSAoVGhyaWZ0QmluYXJ5UHJvdG9jb2wgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsCkBAIC00NzEsNyArNTAyLDcgQEAKICAgLy8gaW5zYW5pdHkKICAgaW5zYW5pdHlfb3V0ID0gKFRUZXN0SW5zYW5pdHkgKikgZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9JTlNBTklUWSwgTlVMTCk7CiAgIGluc2FuaXR5X291dC0+dXNlck1hcCA9IGdfaGFzaF90YWJsZV9uZXcgKE5VTEwsIE5VTEwpOwotICBnX2hhc2hfdGFibGVfaW5zZXJ0IChpbnNhbml0eV9vdXQtPnVzZXJNYXAsICZlbnVtX291dCwgJnVzZXJfaWRfb3V0KTsKKyAgZ19oYXNoX3RhYmxlX2luc2VydCAoaW5zYW5pdHlfb3V0LT51c2VyTWFwLCBHSU5UX1RPX1BPSU5URVIgKGVudW1fb3V0KSwgJnVzZXJfaWRfb3V0KTsKIAogICB4dHJ1Y3QxID0gKFRUZXN0WHRydWN0ICopIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfWFRSVUNULCBOVUxMKTsKICAgeHRydWN0MS0+Ynl0ZV90aGluZyA9IDE7CkBAIC01MjEsOCArNTUyLDcgQEAKICAgYXNzZXJ0ICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfY2xpZW50X3Rlc3RfZXhjZXB0aW9uIChpZmFjZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IEZBTFNFKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgIGVycm9yID0gTlVMTDsKLSAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgeGNlcHRpb24gPSBOVUxMOworICBhc3NlcnQgKHhjZXB0aW9uID09IE5VTEwpOwogCiAgIGFzc2VydCAodF90ZXN0X3RocmlmdF90ZXN0X2NsaWVudF90ZXN0X2V4Y2VwdGlvbiAoaWZhY2UsICJUZXN0IiwgJnhjZXB0aW9uLCAmZXJyb3IpID09IFRSVUUpOwogICBhc3NlcnQgKGVycm9yID09IE5VTEwpOwpAQCAtNTc0LDExICs2MDQsMTMgQEAKIHN0YXRpYyB2b2lkCiBiYWlsb3V0IChpbnQgc2lnbnVtKQogeworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFIChzaWdudW0pOworCiAgIGV4aXQgKDEpOwogfQogCiBpbnQKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK21haW4gKHZvaWQpCiB7CiAgIGludCBzdGF0dXM7CiAgIGludCBwaWQgPSBmb3JrICgpOwpAQCAtNTg2LDExICs2MTgsMTEgQEAKIAogICBpZiAocGlkID09IDApIC8qIGNoaWxkICovCiAgIHsKLSAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgICBzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7Ci0gICAgc2hhcmVkX3B0cjxUaHJpZnRUZXN0UHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7Ci0gICAgc2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQoVEVTVF9QT1JUKSk7Ci0gICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJpZnRUZXN0UHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChURVNUX1BPUlQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CiAgICAgVFNpbXBsZVNlcnZlciBzaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwogICAgIHNpZ25hbCAoU0lHQUxSTSwgYmFpbG91dCk7CiAgICAgYWxhcm0gKDYwKTsKQEAgLTU5OSw3ICs2MzEsNyBAQAogICAgIHNsZWVwICgxKTsKICAgICB0ZXN0X3RocmlmdF9jbGllbnQgKCk7CiAgICAga2lsbCAocGlkLCBTSUdJTlQpOwotICAgIHdhaXQgKCZzdGF0dXMpID09IHBpZDsKKyAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CiAgIH0KIAogICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggNDFlMGVhNC4uODljNjFiOQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKQEAgLTE3LDEyICsxNywxMyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0Lmg+CiAKICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0KIApAQCAtMzIsOSArMzMsOSBAQAogbXlfc29ja2V0KGludCBkb21haW4sIGludCB0eXBlLCBpbnQgcHJvdG9jb2wpCiB7CiAgIGlmIChzb2NrZXRfZXJyb3IgPT0gMCkKLSAgewotICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKQEAgLTQzLDkgKzQ0LDkgQEAKIG15X3JlY3YoaW50IHNvY2tldCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCiB7CiAgIGlmIChyZWN2X2Vycm9yID09IDApCi0gIHsKLSAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOwotICB9CisgICAgeworICAgICAgcmV0dXJuIHJlY3YgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNTQsMjUgKzU1LDIyIEBACiBteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogICBpZiAoc2VuZF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgc29ja2V0IG15X3NvY2tldAogI2RlZmluZSByZWN2IG15X3JlY3YKICNkZWZpbmUgc2VuZCBteV9zZW5kCi0jaW5jbHVkZSAiLi4vc3JjL3RocmlmdC90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jIgorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMiCiAjdW5kZWYgc29ja2V0CiAjdW5kZWYgcmVjdgogI3VuZGVmIHNlbmQKIAotc3RhdGljIGNvbnN0IGNoYXIgVEVTVF9BRERSRVNTW10gPSAibG9jYWxob3N0IjsKLXN0YXRpYyBjb25zdCBzaG9ydCBURVNUX1BPUlQgPSA2NDQ0NDsKLQogc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKLQorc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCiB0ZXN0X2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQpAQCAtODIsNyArODAsNyBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1Qob2JqZWN0KSwgImhvc3RuYW1lIiwgJmhvc3RuYW1lLCAicG9ydCIsICZwb3J0LCBOVUxMKTsKICAgZ19mcmVlIChob3N0bmFtZSk7CiAKQEAgLTk1LDg1ICs5MywyMjMgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIGludCBwb3J0ID0gNTExOTk7CisgIHBpZF90IHBpZDsKKyAgaW50IHN0YXR1czsKIAotICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgdGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKLSAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogdGVzdCBjbG9zZSBmYWlsdXJlICovCi0gIHRzb2NrZXQtPnNkID0gLTE7Ci0gIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAocG9ydCwgMSk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gIC8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CiAKLSAgLyogdHJ5IGFuIGVycm9yIGNhbGwgdG8gc29ja2V0KCkgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7Ci0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICBzb2NrZXRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIHNvY2tldF9lcnJvciA9IDA7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOworCS8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworCXRzb2NrZXQtPnNkID0gLTE7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisKKwkvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdC5icm9rZW4iLAorCQkJCU5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKKworCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwgTlVMTCk7CisJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CisJc29ja2V0X2Vycm9yID0gMTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlzb2NrZXRfZXJyb3IgPSAwOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZAogdGVzdF9yZWFkX2FuZF93cml0ZSh2b2lkKQogewotICBpbnQgc3RhdHVzOwotICBwaWRfdCBwaWQ7CiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgcGlkX3QgcGlkOwogICBpbnQgcG9ydCA9IDUxMTk5OworICBpbnQgc3RhdHVzOwogICBndWNoYXIgYnVmWzEwXSA9IFRFU1RfREFUQTsgLyogYSBidWZmZXIgKi8KIAogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKCBwaWQgPj0gMCApOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKICAgaWYgKCBwaWQgPT0gMCApCi0gIHsKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwotICAgIHRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIGZhaWwgKi8KLSAgICBzZW5kX2Vycm9yID0gMTsKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgc2VuZF9lcnJvciA9IDA7CisJLyogd3JpdGUgZmFpbCAqLworCXNlbmRfZXJyb3IgPSAxOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwlzZW5kX2Vycm9yID0gMDsKIAotICAgIHRocmlmdF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJdGhyaWZ0X3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQorfQorCisvKiB0ZXN0IFRocmlmdFNvY2tldCdzIHBlZWsoKSBpbXBsZW1lbnRhdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3RfcGVlayh2b2lkKQoreworICBnaW50IHN0YXR1czsKKyAgcGlkX3QgcGlkOworICBndWludCBwb3J0ID0gNTExOTk7CisgIGdjaGFyIGRhdGEgPSAnQSc7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydDsKKyAgR0Vycm9yICplcnJvciA9IE5VTEw7CisKKyAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorCQkJCSAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSAgICJwb3J0IiwgICAgIHBvcnQsCisJCQkJICAgTlVMTCk7CisKKyAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCAqLworICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBGQUxTRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKKworICBpZiAocGlkID09IDApCisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworCisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCSAgICAgICAicG9ydCIsIHBvcnQsCisJCQkJICAgICAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CisKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKworICAgICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldworCSAgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKKwkgICAidHJhbnNwb3J0IiwgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKSwKKwkgICAicl9idWZfc2l6ZSIsIDAsCisJICAgIndfYnVmX3NpemUiLCBzaXplb2YgZGF0YSwKKwkgICBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnRfdHJhbnNwb3J0ICE9IE5VTEwpOworCisgICAgICAvKiB3cml0ZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgdG8gdGhlIGNsaWVudCAqLworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSZkYXRhLAorCQkJCQlzaXplb2YgZGF0YSwKKwkJCQkJJmVycm9yKSA9PSBUUlVFKTsKKworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworCisgICAgICBleGl0ICgwKTsKKyAgICB9CisgIGVsc2UgeworICAgICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKyAgICAgIHNsZWVwICgxKTsKKworICAgICAgLyogY29ubmVjdCB0byB0aGUgY2hpbGQgKi8KKyAgICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IFRSVUUpOworCisgICAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBUUlVFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGFuZCB0aGVyZSBpcworICAgICAgIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gVFJVRSk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIC8qIHJlYWQgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHNlcnZlciAqLworICAgICAgZ19hc3NlcnRfY21waW50ICh0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSAgICAgICZkYXRhLAorCQkJCQkgICAgICBzaXplb2YgZGF0YSwKKwkJCQkJICAgICAgJmVycm9yKSwgPT0sIHNpemVvZiBkYXRhKTsKKworICAgICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYnV0IHRoZXJlIGlzCisgICAgICAgbm8gKG1vcmUpIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlYWQgKi8KKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IFRSVUUpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7CisgICAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOworCisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisKKyAgICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCiBzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKKworc3RhdGljIHZvaWQKIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKIHsKICAgaW50IGJ5dGVzID0gMDsKQEAgLTE4MywxNyArMzE5LDE3IEBACiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKLSAgYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCi0gIGFzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIC8qIGZhaWxlZCByZWFkICovCiAgIHJlY3ZfZXJyb3IgPSAxOwpAQCAtMjA5LDEyICszNDUsMTYgQEAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogeworI2lmICghR0xJQl9DSEVDS19WRVJTSU9OICgyLCAzNiwgMCkpCiAgIGdfdHlwZV9pbml0KCk7CisjZW5kaWYKKwogICBnX3Rlc3RfaW5pdCAoJmFyZ2MsICZhcmd2LCBOVUxMKTsKIAogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNvY2tldC9DcmVhdGVBbmREZXN0cm95IiwgdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOwogICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNvY2tldC9PcGVuQW5kQ2xvc2UiLCB0ZXN0X29wZW5fYW5kX2Nsb3NlKTsKICAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzb2NrZXQvUmVhZEFuZFdyaXRlIiwgdGVzdF9yZWFkX2FuZF93cml0ZSk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c29ja2V0L1BlZWsiLCB0ZXN0X3BlZWspOwogCiAgIHJldHVybiBnX3Rlc3RfcnVuICgpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyNjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIwMDExMkwgLyogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzc1NDE5ODUvc3RvcmFnZS1zaXplLW9mLWFkZHJpbmZvLWlzbnQta25vd24gKi8KKworCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisKKy8qICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0gKi8KKyNkZWZpbmUgVEVTVF9EQVRBIHsgIkdFVCAvIEhUVFAvMS4xXG5cbiIgfQorCisKKy8qIHN1YnN0aXR1dGVkIGZ1bmN0aW9ucyB0byB0ZXN0IGZhaWx1cmVzIG9mIHN5c3RlbSBhbmQgbGlicmFyeSBjYWxscyAqLworc3RhdGljIGludCBzb2NrZXRfZXJyb3IgPSAwOworaW50CitteV9zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKK3sKKyAgaWYgKHNvY2tldF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlY3ZfZXJyb3IgPSAwOworc3NpemVfdAorbXlfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKyAgaWYgKHJlY3ZfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNlbmRfZXJyb3IgPSAwOworc3NpemVfdAorbXlfc2VuZChpbnQgc29ja2V0LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKyAgaWYgKHNlbmRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc2VuZCAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIHNvY2tldCBteV9zb2NrZXQKKyNkZWZpbmUgcmVjdiBteV9yZWN2CisjZGVmaW5lIHNlbmQgbXlfc2VuZAorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jIgorI3VuZGVmIHNvY2tldAorI3VuZGVmIHJlY3YKKyN1bmRlZiBzZW5kCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CisKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgTlVMTCk7CisgIGdfZnJlZSAoaG9zdG5hbWUpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2NyZWF0ZV9hbmRfc2V0X3Byb3BlcnRpZXModm9pZCkKK3sKKyAgZ2NoYXIgKmhvc3RuYW1lID0gTlVMTDsKKyAgZ3VpbnQgcG9ydCA9IDA7CisgIFNTTF9DVFgqIHNzbF9jdHg9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXcoU1NMVExTLCAmZXJyb3IpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgInNzbF9jb250ZXh0IiwgJnNzbF9jdHgsIE5VTEwpOworICBnX2Fzc2VydCAoc3NsX2N0eCE9TlVMTCk7CisKKyAgZ19mcmVlIChob3N0bmFtZSk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfb3Blbl9hbmRfY2xvc2Vfbm9uX3NzbF9zZXJ2ZXIodm9pZCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMU29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IG5vbl9zc2xfcG9ydCA9IDUxMTk4OworICBjaGFyIGVycm9ybXNnWzI1NV07CisKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgLyogVGhpcyBpcyBhIG5vbiBTU0wgc2VydmVyICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAobm9uX3NzbF9wb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwkvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKwl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBub25fc3NsX3BvcnQsICZlcnJvcik7CisKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwlnX2Fzc2VydF9jbXBzdHIoZXJyb3ItPm1lc3NhZ2UsID09ICwiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kOiA2OCAtPiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKKwlnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKwl0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKwkvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKwlUSFJJRlRfU09DS0VUKHRTU0xTb2NrZXQpLT5zZCA9IC0xOworCXRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKworCS8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCisJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0LmJyb2tlbiIsIG5vbl9zc2xfcG9ydCwgJmVycm9yKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwlzbnByaW50ZihlcnJvcm1zZywgMjU1LCAiaG9zdCBsb29rdXAgZmFpbGVkIGZvciBsb2NhbGhvc3QuYnJva2VuOiVkIC0gVW5rbm93biBob3N0Iiwgbm9uX3NzbF9wb3J0KTsKKwlnX2Fzc2VydF9jbXBzdHIoZXJyb3ItPm1lc3NhZ2UsID09LCBlcnJvcm1zZyk7CisJZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKwlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisJZXJyb3IgPSBOVUxMOworCisJCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJLyoKKwkJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgcG9ydCwgJmVycm9yKTsKKwkJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJCXNvY2tldF9lcnJvciA9IDE7CisJCWFzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwkJc29ja2V0X2Vycm9yID0gMDsKKwkJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCQlnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKwkgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF93cml0ZV9pbnZhbGlkX3NvY2tldCh2b2lkKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xTb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgY2hhciBidWZmZXJbXSA9ICJ0aGlzIG11c3Qgbm90IGJyZWFrIjsKKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKyAgdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgNTExODgrMSwgJmVycm9yKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKyAgLyogRklYTUUgVGhpcyBtdXN0IGJlIHRlc3RlZCBidXQgc2luY2UgdGhlIGFzc2VydGlvbiBpbnNpZGUgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgYnJlYWtzIHRoZSB0ZXN0IHVuaXQKKyAgIGl0J3MgZGlzYWJsZWQuIFRoZXkgaWRlYSBpcyB0byBkaXNhYmxlIHRyYXAvY29yZWR1bXAgZHVyaW5nIHRoaXMgdGVzdAorICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUodHJhbnNwb3J0LCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZXJyb3IpID09IEZBTFNFKTsKKyAgZ19tZXNzYWdlICgid3JpdGVfZmFpbGVkX3dpdGhfZXJyb3I6ICVzIiwKKwkgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICJObyIpOworICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAqLworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisgIC8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworICBUSFJJRlRfU09DS0VUKHRTU0xTb2NrZXQpLT5zZCA9IC0xOworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworfQorCisKKworLyoqCisgKiBQcmludCB0aGUgY29tbW9uIG5hbWUgb2YgY2VydGlmaWNhdGUKKyAqLwordW5zaWduZWQgY2hhciAqIGdldF9jbl9uYW1lKFg1MDlfTkFNRSogY29uc3QgbmFtZSkKK3sKKyAgaW50IGlkeCA9IC0xOworICB1bnNpZ25lZCBjaGFyICp1dGY4ID0gTlVMTDsKKworICBkbworICAgIHsKKyAgICAgIGlmKCFuYW1lKSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIGlkeCA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5hbWUsIE5JRF9jb21tb25OYW1lLCAtMSk7CisgICAgICBpZighKGlkeCA+IC0xKSkgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgaWR4KTsKKyAgICAgIGlmKCFlbnRyeSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBBU04xX1NUUklORyogZGF0YSA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShlbnRyeSk7CisgICAgICBpZighZGF0YSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBpbnQgbGVuZ3RoID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgZGF0YSk7CisgICAgICBpZighdXRmOCB8fCAhKGxlbmd0aCA+IDApKSAgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgfSB3aGlsZSAoMCk7CisgIHJldHVybiB1dGY4OworfQorCisvKgorICogSGFuZGxlIElQVjQgYW5kIElQVjYgYWRkcgorICovCit2b2lkICpnZXRfaW5fYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorICAgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luKilzYSktPnNpbl9hZGRyKTsKKyAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilzYSktPnNpbjZfYWRkcik7Cit9CisKK2ludCB2ZXJpZnlfaXAoY2hhciAqIGhvc3RuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikKK3sKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyX2luZm8sKnA7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgaW50IHJlczsKKyAgaW50IHJldHZhbCA9IDA7CisKKworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YgKHN0cnVjdCBhZGRyaW5mbykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7IC8qIHVzZSBBRl9JTkVUNiB0byBmb3JjZSBJUHY2ICovCisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKworICBpZiAoIChyZXMgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgJmhpbnRzLCAmYWRkcl9pbmZvKSApICE9IDApCisgICAgeworICAgICAgLyogZ2V0IHRoZSBob3N0IGluZm8gKi8KKyAgICAgIGdfZXJyb3IoIkNhbm5vdCBnZXQgdGhlIGhvc3QgYWRkcmVzcyIpOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIC8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHJlc3VsdHMgYW5kIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlIGNhbiAqLworICBjaGFyIGRuc2hvc3RbSU5FVDZfQUREUlNUUkxFTl07IC8qIGJpZ2dlciBhZGRyIHN1cHBvcnRlZCBJUFY2ICovCisgIGNoYXIgc29ja2V0X2lwW0lORVQ2X0FERFJTVFJMRU5dOworICBpZihpbmV0X250b3AoYWRkci0+c3NfZmFtaWx5LCBnZXRfaW5fYWRkcihhZGRyKSwgc29ja2V0X2lwLCBJTkVUNl9BRERSU1RSTEVOKT09c29ja2V0X2lwKXsKKyAgICAgIGdfZGVidWcoIldlIGFyZSBjb25uZWN0ZWQgdG8gaG9zdCAlcyBjaGVja2luZyBhZ2FpbnN0IGNlcnRpZmljYXRlLi4uIiwgc29ja2V0X2lwKTsKKyAgICAgIGludCBzaXplaXAgPSBzb2NrZXRfaXAhPU5VTEwgPyBzdHJsZW4oc29ja2V0X2lwKSA6IDA7CisgICAgICBmb3IocCA9IGFkZHJfaW5mbzsgcCAhPSBOVUxMOyBwID0gcC0+YWlfbmV4dCkgeworCSAgaWYoaW5ldF9udG9wKHAtPmFpX2ZhbWlseSwgZ2V0X2luX2FkZHIoKHN0cnVjdCBzb2NrYWRkciAqKXAtPmFpX2FkZHIpLCBkbnNob3N0LCBJTkVUNl9BRERSU1RSTEVOKT09ZG5zaG9zdCl7CisJICAgICAgaWYoZG5zaG9zdCE9TlVMTCl7CisJCSAgZ19pbmZvKCJETlMgYWRkcmVzcyBbJWkgLT4gJXNdIiwgcC0+YWlfYWRkciwgZG5zaG9zdCk7CisJCSAgaWYoIXN0cm5jbXAoZG5zaG9zdCwgc29ja2V0X2lwLCBzaXplaXApKXsKKwkJICAgICAgcmV0dmFsPTE7CisJCSAgICAgIGJyZWFrOyAvKiBpZiB3ZSBnZXQgaGVyZSwgd2UgbXVzdCBoYXZlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkgKi8KKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgfQorICB9CisKKyAgaWYoYWRkcl9pbmZvKQorICAgIGZyZWVhZGRyaW5mbyhhZGRyX2luZm8pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2Zyb21fZmlsZShjaGFyICpidWZmZXIsIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICBjaGFyIGNoOworICBsb25nIGluZGV4PTA7CisgIEZJTEUgKmZwOworCisgIGZwID0gZm9wZW4oZmlsZV9uYW1lLCJyIik7IC8qIHJlYWQgbW9kZSAqLworCisgIGlmKCBmcCA9PSBOVUxMICkKKyAgICB7CisgICAgICBwZXJyb3IoIkVycm9yIHdoaWxlIG9wZW5pbmcgdGhlIGZpbGUuXG4iKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgcHJpbnRmKCJUaGUgY29udGVudHMgb2YgJXMgZmlsZSBhcmUgOlxuIiwgZmlsZV9uYW1lKTsKKworICB3aGlsZShpbmRleDxzaXplICYmICggY2ggPSBmZ2V0YyhmcCkgKSAhPSBFT0YgKXsKKyAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGNoOworICB9CisKKyAgZmNsb3NlKGZwKTsKK30KKworI2RlZmluZSBJU1NVRVJfQ05fUElOTklORyAiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgorI2RlZmluZSBTVUJKRUNUX0NOX1BJTk5JTkcgImxvY2FsaG9zdCIKKyNkZWZpbmUgQ0VSVF9TRVJJQUxfTlVNQkVSICIxIgorCitnYm9vbGVhbiB2ZXJpZnlfY2VydGlmaWNhdGVfc24oWDUwOSAqY2VydCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2VyaWFsX251bWJlcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisKKyAgQVNOMV9JTlRFR0VSICpzZXJpYWwgPSBYNTA5X2dldF9zZXJpYWxOdW1iZXIoY2VydCk7CisKKyAgQklHTlVNICpibiA9IEFTTjFfSU5URUdFUl90b19CTihzZXJpYWwsIE5VTEwpOworICBpZiAoIWJuKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBjb252ZXJ0IEFTTjFJTlRFR0VSIHRvIEJOXG4iKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgY2hhciAqdG1wID0gQk5fYm4yZGVjKGJuKTsKKyAgaWYgKCF0bXApIHsKKyAgICAgIGdfd2FybmluZyhzdGRlcnIsICJ1bmFibGUgdG8gY29udmVydCBCTiB0byBkZWNpbWFsIHN0cmluZy5cbiIpOworICAgICAgQk5fZnJlZShibik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIC8qCisgICAgaWYgKHN0cmxlbih0bXApID49IGxlbikgeworICAgICAgZ193YXJuKHN0ZGVyciwgImJ1ZmZlciBsZW5ndGggc2hvcnRlciB0aGFuIHNlcmlhbCBudW1iZXJcbiIpOworICAgICAgQk5fZnJlZShibik7CisgICAgICBPUEVOU1NMX2ZyZWUodG1wKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAqLworICBpZighc3RybmNtcChzZXJpYWxfbnVtYmVyLCB0bXAsIHN0cmxlbihzZXJpYWxfbnVtYmVyKSkpeworICAgICAgcmV0dmFsPVRSVUU7CisgIH1lbHNleworICAgICAgZ193YXJuaW5nKCJTZXJpYWwgbnVtYmVyIGlzIG5vdCB2YWxpZCIpOworICB9CisKKyAgQk5fZnJlZShibik7CisgIE9QRU5TU0xfZnJlZSh0bXApOworICByZXR1cm4gcmV0dmFsOworfQorCitnYm9vbGVhbiBteV9hY2Nlc3NfbWFuYWdlcihUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xTb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBnX2luZm8oIlByb2Nlc3NpbmcgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIiKTsKKyAgWDUwOV9OQU1FKiBpbmFtZSA9IGNlcnQgPyBYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSA6IE5VTEw7CisgIFg1MDlfTkFNRSogc25hbWUgPSBjZXJ0ID8gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpIDogTlVMTDsKKworICAvKiBJc3N1ZXIgaXMgdGhlIGF1dGhvcml0eSB3ZSB0cnVzdCB0aGF0IHdhcnJhbnRzIG5vdGhpbmcgdXNlZnVsICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBpc3N1ZXIgPSBnZXRfY25fbmFtZShpbmFtZSk7CisgIGlmKGlzc3Vlcil7CisgICAgICBnYm9vbGVhbiB2YWxpZCA9IFRSVUU7CisgICAgICBnX2luZm8oIklzc3VlciAoY24pICVzIiwgaXNzdWVyKTsKKworICAgICAgLyogSXNzdWVyIHBpbm5pbmcgKi8KKyAgICAgIGlmKHN0cm5jbXAoSVNTVUVSX0NOX1BJTk5JTkcsIGlzc3Vlciwgc3RybGVuKElTU1VFUl9DTl9QSU5OSU5HKSkpeworCSAgZ193YXJuaW5nKCJUaGUgSXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKGlzc3Vlcik7CisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworICB9CisKKworICAvKiBTdWJqZWN0IGlzIHdobyB0aGUgY2VydGlmaWNhdGUgaXMgaXNzdWVkIHRvIGJ5IHRoZSBhdXRob3JpdHkgICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzdWJqZWN0ID0gZ2V0X2NuX25hbWUoc25hbWUpOworICBpZihzdWJqZWN0KXsKKyAgICAgIGdfaW5mbygiU3ViamVjdCAoY24pICVzIiwgc3ViamVjdCk7CisgICAgICBnYm9vbGVhbiB2YWxpZCA9IFRSVUU7CisKKyAgICAgIC8qIFN1YmplY3QgcGlubmluZyAqLworICAgICAgaWYoc3RybmNtcChTVUJKRUNUX0NOX1BJTk5JTkcsIHN1YmplY3QsIHN0cmxlbihTVUJKRUNUX0NOX1BJTk5JTkcpKSl7CisJICBnX3dhcm5pbmcoIlRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorCisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworCisgICAgICAvKiBIb3N0IHBpbm5pbmcgICAgICAgKi8KKyAgICAgIGlmKHZlcmlmeV9pcChzdWJqZWN0LCBhZGRyKSl7CisJICBnX2luZm8oIlZlcmlmaWVkIHN1YmplY3QiKTsKKyAgICAgIH1lbHNleworCSAgZ19pbmZvKCJDYW5ub3QgdmVyaWZ5IHN1YmplY3QiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKHN1YmplY3QpOworCisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworICB9CisKKyAgaWYoIXZlcmlmeV9jZXJ0aWZpY2F0ZV9zbihjZXJ0LCBDRVJUX1NFUklBTF9OVU1CRVIpKXsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfWVsc2V7CisgICAgICBnX2luZm8oIlZlcmlmaWVkIHNlcmlhbCBudW1iZXIiKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCit9CisKKworCisKKyNpZmRlZiBCVUlMRF9TRVJWRVIKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9hdXRob3JpemF0aW9uX21hbmFnZXIodm9pZCkKK3sKKyAgaW50IHN0YXR1cz0wOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgLyogIGludCBwb3J0ID0gNTExOTk7ICovCisgIGludCBwb3J0ID0gNDQzOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisKKyAgZ3VjaGFyIGJ1ZlsxN10gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCisKKy8qCisgIHBpZCA9IGZvcmsgKCk7CisgICAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgICAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJKi8KKyAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKyAgc2xlZXAgKDEpOworCisgIC8qIFRlc3QgYWdhaW5zdCBsZXZlbDIgb3duY2xvdWQgY2VydGlmaWNhdGUgKi8KKyAgdFNTTHNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgcG9ydCwgJmVycm9yKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIodFNTTHNvY2tldCwgbXlfYWNjZXNzX21hbmFnZXIpOyAgICAgICAgICAgLyogSW5zdGFsbCBwaW5uaW5nIG1hbmFnZXIgKi8KKyAgLyogdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKHRTU0xzb2NrZXQsICIuL293bmNsb3VkLmxldmVsMmNybS5wZW0iKTsgKi8KKyAgdW5zaWduZWQgY2hhciBjZXJ0X2J1ZmZlcls2NTUzNF07CisgIHJlYWRfZnJvbV9maWxlKGNlcnRfYnVmZmVyLCA2NTUzNCwgIi4uLy4uL2tleXMvY2xpZW50LnBlbSIpOworICBpZighdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIodFNTTHNvY2tldCwgY2VydF9idWZmZXIpKXsKKyAgICAgIGdfd2FybmluZygiQ2VydGlmaWNhdGVzIGNhbm5vdCBiZSBsb2FkZWQhIik7CisgIH0KKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMc29ja2V0KTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDE3LCBOVUxMKTsKKworICAvKiB3cml0ZSBmYWlsICovCisgIHNlbmRfZXJyb3IgPSAxOworICAvKgorICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKyAgICAgc2VuZF9lcnJvciA9IDA7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgICovCisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodFNTTHNvY2tldCk7CisKKyAgLyogICAgZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsgKi8KKyAgZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAvKiAgfSAqLworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgaW50IGJ5dGVzID0gMDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworCisgIC8qIGZhaWxlZCByZWFkICovCisgIHJlY3ZfZXJyb3IgPSAxOworICB0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CisgIHJlY3ZfZXJyb3IgPSAwOworCisgIHRocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZXR2YWw7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCgpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X3NzbF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9DcmVhdGVBbmRTZXRQcm9wZXJ0aWVzIiwgdGVzdF9zc2xfY3JlYXRlX2FuZF9zZXRfcHJvcGVydGllcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L09wZW5BbmRDbG9zZU5vblNTTFNlcnZlciIsIHRlc3Rfc3NsX29wZW5fYW5kX2Nsb3NlX25vbl9zc2xfc2VydmVyKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvT3BlbkFuZFdyaXRlSW52YWxpZFNvY2tldCIsIHRlc3Rfc3NsX3dyaXRlX2ludmFsaWRfc29ja2V0KTsKKworCisKKworICByZXR2YWwgPSBnX3Rlc3RfcnVuICgpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2woKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4gYi9saWIvY19nbGliL3RocmlmdF9jX2dsaWIucGMuaW4KaW5kZXggMTM3NzIwMy4uNTY4YzdhMiAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90aHJpZnRfY19nbGliLnBjLmluCisrKyBiL2xpYi9jX2dsaWIvdGhyaWZ0X2NfZ2xpYi5wYy5pbgpAQCAtMjcsNCArMjcsNCBAQAogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczogZ2xpYi0yLjAgZ29iamVjdC0yLjAKIExpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0X2NfZ2xpYgotQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vdGhyaWZ0CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NsL01ha2VmaWxlLmFtIGIvbGliL2NsL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YjM4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2FsbC1sb2NhbDoKKwliYXNoIGVuc3VyZS1leHRlcm5hbHMuc2gKKworcnVuLXRlc3RzOiB0ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKKworY2hlY2stbG9jYWw6IHJ1bi10ZXN0cworCS4vcnVuLXRlc3RzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIHJ1bi10ZXN0cyBxdWlja2xpc3AubGlzcCBiYWNrcG9ydC11cGRhdGUuemlwCisJJChSTSkgLXJmIGxpYiBleHRlcm5hbHMgcXVpY2tsaXNwCisKK0VYVFJBX0RJU1QgPSBcCisJUkVBRE1FLm1kIFwKKwlSRUFETUVTIFwKKwlsb2FkLWxvY2FsbHkubGlzcCBcCisJdGVzdCBcCisJZW5zdXJlLWV4dGVybmFscy5zaApkaWZmIC0tZ2l0IGEvbGliL2NsL1JFQURNRS5tZCBiL2xpYi9jbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2ZWFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9SRUFETUUubWQKQEAgLTAsMCArMSwyNTMgQEAKK1RocmlmdCBDb21tb24gTGlzcCBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworCitVc2luZyBUaHJpZnQgd2l0aCBDb21tb24gTGlzcAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgVGhyaWZ0IGlzIGEgcHJvdG9jb2wgYW5kIGxpYnJhcnkgZm9yIGxhbmd1YWdlLWluZGVwZW5kZW50IGNvbW11bmljYXRpb24gYmV0d2VlbiBjb29wZXJhdGluZworIHByb2Nlc3Nlcy4gVGhlIGNvbW11bmljYXRpb24gdGFrZXMgdGhlIGZvcm0gb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMsIG9mIHdoaWNoIHRoZSBmb3JtcworIGFyZSBzcGVjaWZpZWQgaW4gYWR2YW5jZSB0aHJvdWZoIGEgc2hhcmVkIGludGVyZmFjZSBkZWZpbml0aW9uLiBBIFRocmlmdCBkZWZpbml0aW9uIGZpbGUgaXMgdHJhbnNsYXRlZAorIGludG8gTGlzcCBzb3VyY2UgZmlsZXMsIHdoaWNoIGNvbXByaXNlIHNldmVyYWwgZGVmaW5pdGlvbnM6CisKKyAgKiBUaHJlZSBwYWNrYWdlcywgb25lIGZvciB0aGUgbmFtZXNwYWNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvcGVyYXRvcnMsIGFuZCBvbmUgZWFjaCBmb3IgcmVxdWVzdCBhbmQKKyAgcmVzcG9uc2Ugb3BlcmF0b3JzLgorICAqIFZhcmlvdXMgdHlwZSBkZWZpbml0aW9ucyBhcyBpbXBsZW1lbnRhdGlvbnMgZm9yIFRocmlmdCB0eXBlZGVmIGFuZCBlbnVtIGRlZmluaXRpb25zLgorICAqIERFRi1TVFJVQ1QgYW5kIERFRi1FWENFUFRJT04gZm9ybXMgZm9yIFRocmlmdCBzdHJ1Y3QgYW5kIGV4Y2VwdGlvbiBkZWZpbml0aW9ucy4KKyAgKiBERUYtU0VSVklDRSBmb3JtcyBmb3IgdGhyaWZ0IHNlcnZpY2UgZGVmaW5pdGlvbnMuCisKKyBFYWNoIHNlcnZpY2UgZGVmaW5pdGlvbiBleHBhbmRzIGluIGEgY29sbGVjdGlvbiBvZiBnZW5lcmljIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBGb3IgZWFjaCBgb3BgCisgaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbiwgdHdvIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZAorCisgICogYG9wYC1yZXF1ZXN0IGlzIGRlZmluZWQgZm9yIHVzZSBieSBhIGNsaWVudC4gSXQgYWNjZXB0cyBhbiBhZGRpdGlvbmFsIGluaXRpYWwgYHByb3RvY29sYCBhcmd1bWVudCwKKyAgICB0byBhY3QgYXMgdGhlIGNsaWVudCBwcm94eSBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgbWVkaWF0ZSB0aGUgaW50ZXJhY3Rpb24gd2l0aCBhIHJlbW90ZSBwcm9jZXNzCisgICAgdGhyb3VnaCBhIFRocmlmdC1lbmNvZGVkIHRyYW5zcG9ydCBzdHJlYW0uCisgICogYG9wYC1yZXNwb25zZSBpcyBkZWZpbmVkIGZvciB1c2UgYnkgYSBzZXJ2ZXIuIEl0IGFjY2VwdHMgYSBzaW5nbGUgYHByb3RvY29sYCBhcmd1bWVudC4gQSBzZXJ2ZXIKKyAgICB1c2VzIGl0IHRvIGRlY29kZSB0aGUgcmVxdWVzdCBtZXNzYWdlLCBpbnZva2UgdGhlIGJhc2UgYG9wYCBmdW5jdGlvbiB3aXRoIHRoZSBtZXNzYWdlIGFyZ3VtZW50cywKKyAgICBlbmNvZGUgYW5kIHNlbmQgdGhlIHRoZSByZXN1bHQgYXMgYSByZXNwb25zZSwgYW5kIGhhbmRsZXMgZXhjZXB0aW9ucy4KKworIFRoZSBjbGllbnQgaW50ZXJmYWNlIGlzIG9uZSBvcGVyYXRvcgorCisgICogYHdpdGgtY2xpZW50ICh2YXJpYWJsZSBsb2NhdGlvbikgLiBib2R5YCA6IGNyZWF0ZXMgYSBjb25uZWN0aW9uIGluIGEgZHluYW1pYyBjb250ZXh0IGFuZCBjbG9zZXMgaXQKKyAgICB1cG9uIGV4aXQuIFRoZSB2YXJpYWJsZSBpcyBib3VuZCB0byBhIGNsaWVudCBwcm94eSBzdHJlYW0vcHJvdG9jb2wgaW5zdGFuY2UsIHdoaWNoIHdyYXBzIHRoZQorICAgIGJhc2UgaS9vIHN0cmVhbSAtIHNvY2tldCwgZmlsZSwgZXRjLCB3aXRoIGFuIG9wZXJhdG9ycyB3aGljaCBpbXBsZW1lbnQgdGhlIFRocmlmdCBwcm90b2NvbAorICAgIGFuZCB0cmFuc3BvcnQgbWVjaGFuaXNtcy4KKworIFRoZSBzZXJ2ZXIgaW50ZXJmYWNlIGNvbWJpbmVzIHNlcnZlciBhbmQgc2VydmljZSBvYmplY3RzCisKKyAgKiBgc2VydmUgKGxvY2F0aW9uIHNlcnZpY2UpYCA6IGFjY2VwdHMgY29ubmVjdGlvbnMgb24gdGhlIGRlc2lnbmF0ZWQgcG9ydCBhbmQgcmVzcG9uZHMgdG8KKyAgICByZXF1ZXN0cyBvZiB0aGUgc2VydmljZSdzIG9wZXJhdGlvbnMuCisKKworQnVpbGRpbmcgCistLS0tLS0tLQorCitUaGUgVGhyaWZ0IENvbW1vbiBMaXNwIGxpYnJhcnkgaXMgcGFja2FnZWQgYXMgdGhlIEFTREZbWzFdXSBzeXN0ZW0gYHRocmlmdGAuCitJdCBkZXBlbmRzIG9uIHRoZSBzeXN0ZW1zCisKKyogcHVyaVtbMl1dIDogZm9yIHRoZSB0aHJpZnQgdXJpIGNsYXNzCisqIGNsb3Nlci1tb3BbWzNdXSA6IGZvciBjbGFzcyBtZXRhZGF0YQorKiB0cml2aWFsLXV0Zi04W1s0XV0gOiBmb3Igc3RyaW5nIGNvZGVjcworKiB1c29ja2V0W1s1XV0gOiBmb3IgdGhlIHNvY2tldCB0cmFuc3BvcnQKKyogaWVlZS1mbG9hdHNbWzZdXSA6IGZvciBjb252ZXJzaW9uIGJldHdlZW4gaW50cyBhbmQgZmxvYXRzCisqIHRyaXZpYWwtZ3JheS1zdHJlYW1zW1s3XV0gOiBhbiBhYnN0cmFjdGlvbiBsYXllciBmb3IgZ3JheSBzdHJlYW1zCisqIGFsZXhhbmRyaWFbWzhdXSA6IGhhbmR5IHV0aWxpdGllcworCitUaGUgZGVwZW5kZW5jaWVzIGFyZSBidW5kbGVkIGZvciBsb2NhbCBidWlsZHMgb2YgdGVzdHMgYW5kIHR1dG9yaWFsIGJpbmFyaWVzIC0gCitpdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhvc2UgYnVuZGxlcyB0byBsb2FkIHRoZSBsaWJyYXJ5LCB0b28uCisKK0luIG9yZGVyIHRvIGJ1aWxkIGl0LCByZWdpc3RlciB0aG9zZSBzeXN0ZW1zIHdpdGggQVNERiBhbmQgZXZhbHVhdGU6CisKKyAgICAoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0KQorCitUaGlzIHdpbGwgY29tcGlsZSBhbmQgbG9hZCB0aGUgTGlzcCBjb21waWxlciBmb3IgVGhyaWZ0IGRlZmluaXRpb24gZmlsZXMsIHRoZQordHJhbnNwb3J0IGFuZCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMsIGFuZCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgaW50ZXJmYWNlCitmdW5jdGlvbnMuIEluIG9yZGVyIHRvIHVzZSBUaHJpZnQgaW4gYW4gYXBwbGljYXRpb24sIG9uZSBtdXN0IGFsc28gYXV0aG9yIGFuZC9vcgorbG9hZCB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb25zIGZvciB0aGUgcmVtb3RlIHNlcnZpY2UuW1s5XV0gSWYgb25lIGlzIGltcGxlbWVudGluZyBhIHNlcnZpY2UsCitvbmUgbXVzdCBhbHNvIGRlZmluZSB0aGUgYWN0dWFsIGZ1bmN0aW9ucyB0byB3aGljaCBUaHJpZnQgaXMgdG8gYWN0IGFzIHRoZSBwcm94eQoraW50ZXJmYWNlLiBUaGUgcmVtYWluZGVyIG9mIHRoaXMgZG9jdW1lbnQgZm9sbG93cyB0aGUgVGhyaWZ0IHR1dG9yaWFsIHRvIGlsbHVzdHJhdGUgaG93Cit0byBwZXJmb3JtIHRoZSBzdGVwcworCisgICogaW1wbGVtZW50IHRoZSBzZXJ2aWNlCisgICogdHJhbnNsYXRlIHRoZSBUaHJpZnQgSURMCisgICogbG9hZCB0aGUgTGlzcCBzZXJ2aWNlIGludGVyZmFjZXMKKyAgKiBydW4gYSBzZXJ2ZXIgZm9yIHRoZSBzZXJ2aWNlCisgICogdXNlIGEgY2xpZW50IHRvIGFjY2VzcyB0aGUgc2VydmljZSByZW1vdGVseQorCitOb3RlIHRoYXQsIGlmIG9uZSBpcyB0byBpbXBsZW1lbnQgYSBuZXcgc2VydmljZSwgb25lIHdpbGwgYWxzbyBuZWVkIHRvIGF1dGhvciB0aGUKK0lETCBmaWxlcywgYXMgdGhlcmUgaXMgbm8gZmFjaWxpdHkgdG8gZ2VuZXJhdGUgdGhlbSBmcm9tIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKworCitJbXBsZW1lbnQgdGhlIFNlcnZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdHV0b3JpYWwgY29tcHJpc2VzIHNlcnZlcmFsIGZ1bmN0aW9uczogYGFkZGAsIGBwaW5nYCwgYHppcGAsIGFuZCBgY2FsY3VsYXRlYC4KK0VhY2ggdHJhbnNsYXRlZCBJREwgZmlsZSBnZW5lcmF0ZXMgdGhyZWUgcGFja2FnZXMgZm9yIGV2ZXJ5IHNlcnZpY2UuIEluIHRoZSBjYXNlIG9mCit0aGUgdHV0b3JpYWwgZmlsZSwgdGhlIHJlbGV2YW50IHBhY2thZ2VzIGFyZToKKworICAqIHR1dG9yaWFsLmNhbGN1bGF0b3IKKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uCisgICogdHV0b3JpYWwuY2FsY3VsYXRvci1yZXNwb25zZQorICAKK1RoaXMgaXMgdG8gc2VwYXJhdGUgdGhlIHJlcXVlc3QgKGdlbmVyYXRlZCksIHJlc3BvbnNlIChnZW5lcmF0ZWQpIGFuZCBpbXBsZW1lbnRhdGlvbgorKG1lYW50IHRvIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBwcm9ncmFtbWVyKSBmdW5jdGlvbnMgZm9yIGRlZmluZWQgVGhyaWZ0IG1ldGhvZHMuCisKK0l0IGlzIHN1Z2dlc3RlZCB0byB3b3JrIGluIHRoZSBgdHV0b3JpYWwtaW1wbGVtZW50YXRpb25gIHBhY2thZ2Ugd2hpbGUgaW1wbGVtZW50aW5nCit0aGUgc2VydmljZXMgLSBpdCBpbXBvcnRzIHRoZSBgY29tbW9uLWxpc3BgIHBhY2thZ2UsIHdoaWxlIHRoZSBzZXJ2aWNlLXNwZWNpZmljIG9uZXMKK2Rvbid0ICh0byBhdm9pZCBjb25mbGljdHMgYmV0d2VlbiBUaHJpZnQgbWV0aG9kIG5hbWVzIGFuZCBmdW5jdGlvbiBuYW1lcyBpbiBgY29tbW9uLWxpc3BgKS4KKworICAgIDs7IGRlZmluZSB0aGUgYmFzZSBvcGVyYXRpb25zCisgICAgCisgICAgKGluLXBhY2thZ2UgOnR1dG9yaWFsLWltcGxlbWVudGF0aW9uKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOmFkZCAobnVtMSBudW0yKQorICAgICAgKGZvcm1hdCB0ICJ+JkFza2VkIHRvIGFkZCB+QSBhbmQgfkEuIiBudW0xIG51bTIpCisgICAgICAoKyBudW0xIG51bTIpKQorICAgIAorICAgIChkZWZ1biB0dXRvcmlhbC5jYWxjdWxhdG9yLWltcGxlbWVudGF0aW9uOnBpbmcgKCkKKyAgICAgIChwcmludCA6cGluZykpCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246emlwICgpCisgICAgICAocHJpbnQgOnppcCkpCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246Y2FsY3VsYXRlIChsb2dpZCB0YXNrKQorICAgICAgKGNhbGN1bGF0ZS1vcCAod29yay1vcCB0YXNrKSAod29yay1udW0xIHRhc2spICh3b3JrLW51bTIgdGFzaykpKQorICAgIAorICAgIChkZWZnZW5lcmljIGNhbGN1bGF0ZS1vcCAob3AgYXJnMSBhcmcyKQorICAgICAgKDptZXRob2QgOmFyb3VuZCAob3AgYXJnMSBhcmcyKQorICAgICAgICAobGV0ICgocmVzdWx0IChjYWxsLW5leHQtbWV0aG9kKSkpCisgICAgICAgICAgKGZvcm1hdCB0ICJ+JkFza2VkIHRvIGNhbGN1bGF0ZTogfmQgb24gIH5BIGFuZCB+QSA9IH5kLiIgb3AgYXJnMSBhcmcyIHJlc3VsdCkKKyAgICAgICAgICByZXN1bHQpKQorICAgIAorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5hZGQpKSBhcmcxIGFyZzIpCisgICAgICAgICgrIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLnN1YnRyYWN0KSkgYXJnMSBhcmcyKQorICAgICAgICAoLSBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5tdWx0aXBseSkpIGFyZzEgYXJnMikKKyAgICAgICAgKCogYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uZGl2aWRlKSkgYXJnMSBhcmcyKQorICAgICAgICAoLyBhcmcxIGFyZzIpKSkKKyAgICAKKyAgICAoZGVmdW4gemlwICgpIChwcmludCAnemlwKSkKKworCitUcmFuc2xhdGUgdGhlIFRocmlmdCBJREwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJREwgZmlsZXMgZW1wbG95IHRoZSBmaWxlIGV4dGVuc2lvbiBgdGhyaWZ0YC4gSW4gdGhpcyBjYXNlLCB0aGVyZSBhcmUgdHdvIGZpbGVzIHRvIHRyYW5zbGF0ZQorICAqIGB0dXRvcmlhbC50aHJpZnRgCisgICogYHNoYXJlZC50aHJpZnRgCitBcyB0aGUgZm9ybWVyIGluY2x1ZGVzIHRoZSBsYXR0ZXIsIG9uZSB1c2VzIGl0IHRvIGdlbmVyYXRlIHRoZSBpbnRlcmZhY2VzOgorCisgICAgJFRIUklGVC9iaW4vdGhyaWZ0IC1yIC0tZ2VuIGNsICRUSFJJRlQvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisgICAgCitgLXJgIHN0YW5kcyBmb3IgcmVjdXJzaW9uLCB3aGlsZSBgLS1nZW5gIGxldHMgb25lIGNob29zZSB0aGUgbGFuZ3VhZ2UgdG8gdHJhbnNsYXRlIHRvLgorCisKK0xvYWQgdGhlIExpc3AgdHJhbnNsYXRlZCBzZXJ2aWNlIGludGVyZmFjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHRyYW5zbGF0b3IgZ2VuZXJhdGVzIHRocmVlIGZpbGVzIGZvciBlYWNoIElETCBmaWxlLiBGb3IgZXhhbXBsZSBgdHV0b3JpYWwtdHlwZXMubGlzcGAsCitgdHV0b3JpYWwtdmFycy5saXNwYCBhbmQgYW4gYC5hc2RgIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2FkIHRoZW0gYm90aCBhbmQgcHVsbCBpbgorb3RoZXIgaW5jbHVkZXMgKGxpa2UgYHNoYXJlZGAgd2l0aGluIHRoZSB0dXRvcmlhbCkgYXMgZGVwZW5kZW5jaWVzLgorCisKK1J1biBhIFNlcnZlciBmb3IgdGhlIFNlcnZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGFjdHVhbCBzZXJ2aWNlIG5hbWUsIGFzIHNwZWNpZmllZCBpbiB0aGUgYGRlZi1zZXJ2aWNlYCBmb3JtIGluIGB0dXRvcmlhbC5saXNwYCwgaXMgYGNhbGN1bGF0b3JgLiAKK0VhY2ggc2VydmljZSBkZWZpbml0aW9uIGRlZmluZXMgYSBnbG9iYWwgdmFyaWFibGUgd2l0aCB0aGUgc2VydmljZSBuYW1lIGFuZCBiaW5kcyBpdCB0byBhCitzZXJ2aWNlIGluc3RhbmNlIHdoY2ggZGVzY3JpYmVzIHRoZSBvcGVyYXRpb25zLgorCitJbiBvcmRlciB0byBzdGFydCBhIHNlcnZpY2UsIHNwZWNpZnkgYSBsb2NhdGlvbiBhbmQgdGhlIHNlcnZpY2UgaW5zdGFuY2UuIAorCisgICAgKGluLXBhY2thZ2UgOnR1dG9yaWFsKQorICAgIChzZXJ2ZSAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MSIgY2FsY3VsYXRvcikKKworCitVc2UgYSBDbGllbnQgdG8gQWNjZXNzIHRoZSBTZXJ2aWNlIFJlbW90ZWx5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworW2luIHNvbWUgb3RoZXIgcHJvY2Vzc10gcnVuIHRoZSBjbGllbnQKKworICAgIChpbi1wYWNrYWdlIDpjbC11c2VyKQorCisgICAgKG1hY3JvbGV0ICgoc2hvdyAoZm9ybSkKKyAgICAgICAgICAgICAgICAgYChmb3JtYXQgKnRyYWNlLW91dHB1dCogIn4lfnMgPT5+eyB+c359IgorICAgICAgICAgICAgICAgICAgICAgICAgICAnLGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG11bHRpcGxlLXZhbHVlLWxpc3QgKGlnbm9yZS1lcnJvcnMgLGZvcm0pKSkpKQorICAgICAgKHdpdGgtY2xpZW50IChwcm90b2NvbCAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTA5MSIpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOnBpbmcgcHJvdG9jb2wpKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdG9jb2wgMSAyKSkKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6YWRkIHByb3RvY29sIDEgNCkpCisgICAgCisgICAgICAgIChsZXQgKCh0YXNrIChtYWtlLWluc3RhbmNlICd0dXRvcmlhbDp3b3JrCisgICAgICAgICAgICAgICAgICAgICAgOm9wIG9wZXJhdGlvbi5zdWJ0cmFjdCA6bnVtMSAxNSA6bnVtMiAxMCkpKQorICAgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90b2NvbCAxIHRhc2spKQorICAgICAgICAKKyAgICAgICAgICAoc2V0ZiAodHV0b3JpYWw6d29yay1vcCB0YXNrKSBvcGVyYXRpb24uZGl2aWRlCisgICAgICAgICAgICAgICAgKHR1dG9yaWFsOndvcmstbnVtMSB0YXNrKSAxCisgICAgICAgICAgICAgICAgKHR1dG9yaWFsOndvcmstbnVtMiB0YXNrKSAwKQorICAgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmNhbGN1bGF0ZSBwcm90b2NvbCAxIHRhc2spKSkKKyAgICAgICAgCisgICAgICAgIChzaG93IChzaGFyZWQuc2hhcmVkLXNlcnZpY2U6Z2V0LXN0cnVjdCBwcm90b2NvbCAxKSkKKyAgICAKKyAgICAgICAgKHNob3cgKHppcCBwcm90b2NvbCkpKSkKKworSXNzdWVzCistLS0tLS0KKworIyMjIG9wdGlvbmFsIGZpZWxkcyAKKyBXaGVyZSB0aGUgSURMIGRlY2xhcmVzIGEgZmllbGQgb3B0aW9ucywgdGhlIGRlZi1zdHJ1Y3QgZm9ybSBpbmNsdWRlcyBubworIGluaXRmb3JtIGZvciB0aGUgc2xvdCBhbmQgdGhlIGVuY29kaW5nIG9wZXJhdG9yIHNraXBzIGFuIHVuYm91bmQgc2xvdC4gVGhpcyBsZWF2ZSBzb21lIGFtYmlndWl0eQorIHdpdGggYm9vbCBmaWVsZHMuCisKKyMjIyBpbnN0YW50aWF0aW9uIHByb3RvY29sIDoKKyBzdHJ1Y3QgY2xhc3NlcyBhcmUgc3RhbmRhcmQgY2xhc3NlcyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMgYXJlCisgd2hhdGV2ZXIgdGhlIGltcGxlbWVudGF0aW9uIHByZXNjcmliZXMuIGRlY29kZXJzIGFwcGx5IG1ha2Utc3RydWN0IHRvIGFuIGluaXRhcmdzIGxpc3QuCisgcGFydGljdWxhcmx5IGF0IHRoZSBzZXJ2aWNlIGVuZCwgdGhlcmUgYXJlIGFkdmFudGFnZXMgdG8gcmVzb3VyY2luZyBzdHJ1Y3RzIGFuZCBkZWNvZGluZworIHdpdGggZGlyZWN0IHNpZGUtZWZmZWN0cyBvbiBzbG90LXZhbHVlcworCisjIyMgbWFwczoKKyBNYXBzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgaGFzaCB0YWJsZXMuIEFzIGRhdGEgdGhyb3VnaCB0aGUgY2FsbC9yZXBseSBpbnRlcmZhY2UgaXMgYWxsIHN0YXRpY2FsbHkKKyB0eXBlZCwgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdGhlIG9iamVjdHMgdG8gdGhlbXNlbHZlcyBpbmRpY2F0ZSB0aGUgY29kaW5nIGZvcm0uIEFzc29jaWF0aW9uIGxpc3RzCisgd291bGQgYmUgc3VmZmljaWVudC4gQXMgdGhlIGtleSB0eXBlIGlzIGFyYml0cmFyeSwgcHJvcGVydHkgbGlzdHMgb2ZmZXIgbm8gYWRkaXRpb25hbCBjb252ZW5pZW5jZToKKyBhcyBgZ2V0ZmAgb3BlcmF0ZXMgd2l0aCBgZXFgIGEgbmV3IGFjY2VzcyBpbnRlcmZhY2Ugd291bGQgYmUgbmVjZXNzYXJ5IGFuZCB0aGV5IHdvdWxkIG5vdCBiZQorIGF2YWlsYWJsZSBmb3IgZnVuY3Rpb24gYXBwbGljYXRpb24uCisKKworIFsxXTogd3d3LmNvbW1vbi1saXNwLm5ldC9hc2RmCisgWzJdOiBodHRwOi8vZ2l0aHViLmNvbS9saXNwL2NvbS5iOS5wdXJpLnBwY3JlCisgWzNdOiB3d3cuY29tbW9uLWxpc3AubmV0L2Nsb3Nlci1tb3AKKyBbNF06IHRyaXZpYWwtdXRmLTgKKyBbNV06IGh0dHBzOi8vZ2l0aHViLmNvbS91c29ja2V0L3Vzb2NrZXQKKyBbNl06IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2llZWUtZmxvYXRzCisgWzddOiBodHRwczovL2dpdGh1Yi5jb20vdHJpdmlhbC1ncmF5LXN0cmVhbXMvdHJpdmlhbC1ncmF5LXN0cmVhbXMKKyBbOF06IGh0dHBzOi8vZ2l0bGFiLmNvbW1vbi1saXNwLm5ldC9hbGV4YW5kcmlhL2FsZXhhbmRyaWEKKyBbOV06IGh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvdGhyaWZ0L1RocmlmdEdlbmVyYXRpb24KKworKiB1c29ja2V0W1s1XV0gOiBmb3IgdGhlIHNvY2tldCB0cmFuc3BvcnQKKyogaWVlZS1mbG9hdHNbWzZdXSA6IGZvciBjb252ZXJzaW9uIGJldHdlZW4gaW50cyBhbmQgZmxvYXRzCisqIHRyaXZpYWwtZ3JheS1zdHJlYW1zW1s3XV0gOiBhbiBhYnN0cmFjdGlvbiBsYXllciBmb3IgZ3JheSBzdHJlYW1zCisqIGFsZXhhbmRyaWFbWzhdXSA6IGhhbmR5IHV0aWxpdGllcwpkaWZmIC0tZ2l0IGEvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwIGIvbGliL2NsL1JFQURNRVMvcmVhZG1lLWNhc3NhbmRyYS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNzQ0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvUkVBRE1FUy9yZWFkbWUtY2Fzc2FuZHJhLmxpc3AKQEAgLTAsMCArMSw2NCBAQAorKGluLXBhY2thZ2UgOmNsLXVzZXIpCisKKyMrKG9yIGNjbCBzYmNsKSAvZGV2ZWxvcG1lbnQvc291cmNlL2xpYnJhcnkvCisobG9hZCAiYnVpbGQtaW5pdC5saXNwIikKKworOzs7ICEgZmlyc3QsIHNlbGVjdCB0aGUgYXBpIHZlcnNpb24gaW4gdGhlIGNhc3NhbmRyYSBzeXN0ZW0gZGVmaW5pdGlvbgorOzs7IGFzIG9ubHkgb25lIHNob3VsZCBiZSBsb2FkZWQgYXQgYSB0aW1lLgorKGFzZGY6bG9hZC1zeXN0ZW0gOmRlLnNldGYuY2Fzc2FuZHJhKQorCisoaW4tcGFja2FnZSA6ZGUuc2V0Zi5jYXNzYW5kcmEpCisKKyhkZWZwYXJhbWV0ZXIgKmMtbG9jYXRpb24qCisgIDs7IHJlbW90ZQorICA7OyAjdSJ0aHJpZnQ6Ly9lYzItMTc0LTEyOS02Ni0xNDguY29tcHV0ZS0xLmFtYXpvbmF3cy5jb206OTE2MCIKKyAgOzsgbG9jYWwKKyAgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkxNjAiCisgICJBIGNhc3NhbmRyYSBzZXJ2aWNlIGxvY2F0aW9uIC0gZWl0aGVyIHRoZSBsb2NhbCBvbmUgb3IgYSByZW1vdGUgc2VydmljZSAKKyAtIGFsd2F5cyBhICd0aHJpZnQnIHVyaS4iKQorCisoZGVmcGFyYW1ldGVyICpjKiAodGhyaWZ0OmNsaWVudCAqYy1sb2NhdGlvbiopKQorCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzICpjKikKKzs7ID0+ICgiS2V5c3BhY2UxIiAic3lzdGVtIikKKworKGNhc3NhbmRyYTpkZXNjcmliZS1jbHVzdGVyLW5hbWUgKmMqKQorOzsgPT4iVGVzdCBDbHVzdGVyIgorCisoY2Fzc2FuZHJhOmRlc2NyaWJlLXZlcnNpb24gKmMqKQorOzsgPT4gIjIuMS4wIgorCisobG9vcCBmb3Igc3BhY2UgaW4gKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgKmMqKQorICAgICAgY29sbGVjdCAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZSAqYyogc3BhY2UpCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleSBvZiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIChoYXNoLXZhbHVlIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5IHZhbHVlKSkpKSkKKworCisoY2xvc2UgKmMqKQorCisoZGVmdW4gZGVzY3JpYmUtY2Fzc2FuZHJhIChsb2NhdGlvbiAmb3B0aW9uYWwgKHN0cmVhbSAqc3RhbmRhcmQtb3V0cHV0KikpCisgICJQcmludCB0aGUgZmlyc3Qtb3JkZXIgc3RvcmUgbWV0YWRhdGEgZm9yIGEgY2Fzc2FuZHJhIExPQ0FUSU9OLiIKKworICAodGhyaWZ0OndpdGgtY2xpZW50IChjYXNzYW5kcmEgbG9jYXRpb24pCisgICAgKGxldCogKChrZXlzcGFjZS1uYW1lcyAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyBjYXNzYW5kcmEpKQorICAgICAgICAgICAoY2x1c3RlciAoY2Fzc2FuZHJhOmRlc2NyaWJlLWNsdXN0ZXItbmFtZSBjYXNzYW5kcmEpKQorICAgICAgICAgICAodmVyc2lvbiAoY2Fzc2FuZHJhOmRlc2NyaWJlLXZlcnNpb24gY2Fzc2FuZHJhKSkKKyAgICAgICAgICAgKGtleXNwYWNlLWRlc2NyaXB0aW9ucyAobG9vcCBmb3Igc3BhY2UgaW4ga2V5c3BhY2UtbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2UgY2Fzc2FuZHJhIHNwYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0IChjb25zIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9vcCBmb3Iga2V5IGJlaW5nIGVhY2ggaGFzaC1rZXkgb2YgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5IHZhbHVlKSkpKSkpKSkKKyAgICAgIChmb3JtYXQgc3RyZWFtICJ+JmNvbm5lY3Rpb24gdG8gOiB+YSIgY2Fzc2FuZHJhKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4mdmVyc2lvbiA6IH5hIiB2ZXJzaW9uKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4mY2x1c3RlciA6IH5hIiBjbHVzdGVyKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4ma2V5c3BhY2Vzfnt+e34lfiVzcGFjZTogfmF+QHt+JSAgfnt+YSA6fkB7fjIwdH46d35efiV+fX59fn1+fX59IiBrZXlzcGFjZS1kZXNjcmlwdGlvbnMpKSkpCisKKzs7OyAoZGVzY3JpYmUtY2Fzc2FuZHJhICpjLWxvY2F0aW9uKikKZGlmZiAtLWdpdCBhL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoIGIvbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDQ5NWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9iYXNoCisKK3NldCAtZQorCitpZiBbWyAhIC1lIHF1aWNrbGlzcC5saXNwIF1dOyB0aGVuIGN1cmwgLU8gaHR0cHM6Ly9iZXRhLnF1aWNrbGlzcC5vcmcvcXVpY2tsaXNwLmxpc3A7IGZpCitzYmNsIC0tbG9hZCBxdWlja2xpc3AubGlzcCBcCisgICAgIC0tZXZhbCAiKGlnbm9yZS1lcnJvcnMgKHF1aWNrbGlzcC1xdWlja3N0YXJ0Omluc3RhbGwgOnBhdGggXCJxdWlja2xpc3AvXCIpKSIgXAorICAgICAtLWV2YWwgIihsb2FkIFwicXVpY2tsaXNwL3NldHVwLmxpc3BcIikiIFwKKyAgICAgLS1ldmFsICIocXVpY2tsaXNwOmJ1bmRsZS1zeXN0ZW1zICcoIzpwdXJpICM6dXNvY2tldCAjOmNsb3Nlci1tb3AgIzp0cml2aWFsLXV0Zi04ICM6aWVlZS1mbG9hdHMgIzp0cml2aWFsLWdyYXktc3RyZWFtcyAjOmFsZXhhbmRyaWEgIzpib3JkZWF1eC10aHJlYWRzICM6Y2wtcHBjcmUgIzpmaWFzY28gIzpuZXQuZGlkaWVydmVybmEuY2xvbikgOnRvIFwiZXh0ZXJuYWxzL1wiKSIgXAorICAgICAtLWV2YWwgIihxdWl0KSIgXAorICAgICAtLW5vLXVzZXJpbml0CitpZiBbWyAhIC1lIGJhY2twb3J0LXVwZGF0ZS56aXAgXV07IHRoZW4KKyAgICBjdXJsIC1PIC1MIGh0dHBzOi8vZ2l0aHViLmNvbS9UdXJ0bGVXYXJlUEwvZGUuc2V0Zi50aHJpZnQvYXJjaGl2ZS9iYWNrcG9ydC11cGRhdGUuemlwOworZmkKK21rZGlyIC1wIGxpYgordW56aXAgLXUgYmFja3BvcnQtdXBkYXRlLnppcCAtZCBsaWIKZGlmZiAtLWdpdCBhL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcCBiL2xpYi9jbC9sb2FkLWxvY2FsbHkubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJjNzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL2xvYWQtbG9jYWxseS5saXNwCkBAIC0wLDAgKzEsMjMgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IEp1c3QgYSBzY3JpcHQgZm9yIGxvYWRpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCB1c2luZyBidW5kbGVkIGRlcGVuZGVuY2llcy4KKzs7OzsgVGhpcyBpcyBoZXJlIGZvciB3aGVuIHdlIHdhbnQgdG8gYnVpbGQgdGhlIHNlbGYtdGVzdCBhbmQgY3Jvc3MtdGVzdAorOzs7OyBiaW5hcmllcy4KKworKHJlcXVpcmUgImFzZGYiKQorCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJleHRlcm5hbHMvYnVuZGxlLmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJsaWIvZGUuc2V0Zi50aHJpZnQtYmFja3BvcnQtdXBkYXRlL3RocmlmdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0KQpkaWZmIC0tZ2l0IGEvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwIGIvbGliL2NsL3Rlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2E1OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKQEAgLTAsMCArMSwzMSBAQAorOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IFRoaXMgZmlsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBiaW5hcnkgdGhhdCBydW5zIGFsbCBzZWxmLXRlc3RzLiBUaGUKKzs7OzsgYmluYXJ5IGlzIHRoZW4gbWVhbnQgdG8gYmUgaG9va2VkIHVwIHRvIFRocmlmdCdzIGBtYWtlIGNoZWNrYCBmYWNpbGl0eSwKKzs7OzsgYnV0IGNhbiBlYXNpbHkgYmUgcnVuIG9uIGl0cyBvd24gYXMgd2VsbC4KKworKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi9sb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgIi4uL2xpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGVzdC90aHJpZnQtdGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LXRlc3QpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAobGV0ICgocmVzdWx0IChpZiAoZmlhc2NvOnJ1bi10ZXN0cyAndGhyaWZ0LXRlc3QpIDAgLTEpKSkKKyAgICAoY2xvbjpleGl0IHJlc3VsdCkpKQorCisoY2xvbjpkdW1wICJydW4tdGVzdHMiIG1haW4pCmRpZmYgLS1naXQgYS9saWIvY29jb2EvUkVBRE1FIGIvbGliL2NvY29hL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL2NvY29hL1JFQURNRQpyZW5hbWUgdG8gbGliL2NvY29hL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvY29jb2EvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLmggYi9saWIvY29jb2Evc3JjL1RBcHBsaWNhdGlvbkVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5ODgxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitleHRlcm4gTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yRG9tYWluOworCit0eXBlZGVmIE5TX0VOVU0gKGludCwgVEFwcGxpY2F0aW9uRXJyb3IpIHsKKyAgVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duICAgICAgICAgICAgICAgID0gMCwKKyAgVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duTWV0aG9kICAgICAgICAgID0gMSwKKyAgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkTWVzc2FnZVR5cGUgICAgID0gMiwKKyAgVEFwcGxpY2F0aW9uRXJyb3JXcm9uZ01ldGhvZE5hbWUgICAgICAgID0gMywKKyAgVEFwcGxpY2F0aW9uRXJyb3JCYWRTZXF1ZW5jZUlkICAgICAgICAgID0gNCwKKyAgVEFwcGxpY2F0aW9uRXJyb3JNaXNzaW5nUmVzdWx0ICAgICAgICAgID0gNSwKKyAgVEFwcGxpY2F0aW9uRXJyb3JJbnRlcm5hbEVycm9yICAgICAgICAgID0gNiwKKyAgVEFwcGxpY2F0aW9uRXJyb3JQcm90b2NvbEVycm9yICAgICAgICAgID0gNywKKyAgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkVHJhbnNmb3JtICAgICAgID0gOCwKKyAgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkUHJvdG9jb2wgICAgICAgID0gOSwKKyAgVEFwcGxpY2F0aW9uRXJyb3JVbnN1cHBvcnRlZENsaWVudFR5cGUgID0gMTAsCit9OworCisKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUQXBwbGljYXRpb25FcnJvclJlYXNvbktleTsKK2V4dGVybiBOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXk7CisKKworQGludGVyZmFjZSBOU0Vycm9yIChUQXBwbGljYXRpb25FcnJvcikKKworQHByb3BlcnR5IChyZWFkb25seSwgY29weSkgTlNTdHJpbmcgKm5hbWU7CitAcHJvcGVydHkgKHJlYWRvbmx5LCBjb3B5KSBOU1N0cmluZyAqcmVhc29uOworCisrKGluc3RhbmNldHlwZSkgZXJyb3JXaXRoVHlwZTooVEFwcGxpY2F0aW9uRXJyb3IpdHlwZSByZWFzb246KE5TU3RyaW5nICopcmVhc29uOworCisrKGluc3RhbmNldHlwZSkgcmVhZDooaWQ8VFByb3RvY29sPilwcm90b2NvbDsKKworLShCT09MKSB3cml0ZTooaWQ8VFByb3RvY29sPilvdXRQcm90b2NvbCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXJyb3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBiYzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FcnJvci5tCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisjaW1wb3J0ICJUUHJvdG9jb2xVdGlsLmgiCisKKworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yRG9tYWluID0gQCJUQXBwbGljYXRpb25FcnJvckRvbWFpbiI7CisKKworTlNTdHJpbmcgKlRBcHBsaWNhdGlvbkVycm9yTmFtZUtleSA9IEAibmFtZSI7CitOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JSZWFzb25LZXkgPSBAInJlYXNvbiI7CitOU1N0cmluZyAqVEFwcGxpY2F0aW9uRXJyb3JNZXRob2RLZXkgPSBAIm1ldGhvZCI7CisKKworQGltcGxlbWVudGF0aW9uIE5TRXJyb3IgKFRBcHBsaWNhdGlvbkVycm9yKQorCistKE5TU3RyaW5nICopIHJlYXNvbgoreworICByZXR1cm4gc2VsZi51c2VySW5mb1tUQXBwbGljYXRpb25FcnJvclJlYXNvbktleV07Cit9CisKKy0oTlNTdHJpbmcgKikgbmFtZQoreworICByZXR1cm4gc2VsZi51c2VySW5mb1tUQXBwbGljYXRpb25FcnJvck5hbWVLZXldOworfQorCisrKGluc3RhbmNldHlwZSkgZXJyb3JXaXRoVHlwZTooVEFwcGxpY2F0aW9uRXJyb3IpdHlwZSByZWFzb246KE5TU3RyaW5nICopcmVhc29uCit7CisgIE5TU3RyaW5nICpuYW1lOworICBzd2l0Y2ggKHR5cGUpIHsKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvclVua25vd25NZXRob2Q6CisgICAgbmFtZSA9IEAiVW5rbm93biBNZXRob2QiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkTWVzc2FnZVR5cGU6CisgICAgbmFtZSA9IEAiSW52YWxpZCBNZXNzYWdlIFR5cGUiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JXcm9uZ01ldGhvZE5hbWU6CisgICAgbmFtZSA9IEAiV3JvbmcgTWV0aG9kIE5hbWUiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JCYWRTZXF1ZW5jZUlkOgorICAgIG5hbWUgPSBAIkJhZCBTZXF1ZW5jZSBJRCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvck1pc3NpbmdSZXN1bHQ6CisgICAgbmFtZSA9IEAiTWlzc2luZyBSZXN1bHQiOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnRlcm5hbEVycm9yOgorICAgIG5hbWUgPSBAIkludGVybmFsIEVycm9yIjsKKyAgICBicmVhazsKKworICBjYXNlIFRBcHBsaWNhdGlvbkVycm9yUHJvdG9jb2xFcnJvcjoKKyAgICBuYW1lID0gQCJQcm90b2NvbCBFcnJvciI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvckludmFsaWRUcmFuc2Zvcm06CisgICAgbmFtZSA9IEAiSW52YWxpZCBUcmFuc2Zvcm0iOworICAgIGJyZWFrOworCisgIGNhc2UgVEFwcGxpY2F0aW9uRXJyb3JJbnZhbGlkUHJvdG9jb2w6CisgICAgbmFtZSA9IEAiSW52YWxpZCBQcm90b2NvbCI7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUQXBwbGljYXRpb25FcnJvclVuc3VwcG9ydGVkQ2xpZW50VHlwZToKKyAgICBuYW1lID0gQCJVbnN1cHBvcnRlZCBDbGllbnQgVHlwZSI7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBuYW1lID0gQCJVbmtub3duIjsKKyAgICBicmVhazsKKyAgfQorCisgIE5TRGljdGlvbmFyeSAqdXNlckluZm87CisgIGlmIChyZWFzb24pIHsKKyAgICB1c2VySW5mbyA9IEB7VEFwcGxpY2F0aW9uRXJyb3JOYW1lS2V5Om5hbWUsCisgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkVycm9yUmVhc29uS2V5OnJlYXNvbn07CisgIH0KKyAgZWxzZSB7CisgICAgdXNlckluZm8gPSBAe1RBcHBsaWNhdGlvbkVycm9yTmFtZUtleTpuYW1lfTsKKyAgfQorCisgIHJldHVybiBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VEFwcGxpY2F0aW9uRXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTp0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86dXNlckluZm9dOworfQorCisKKysoaW5zdGFuY2V0eXBlKSByZWFkOihpZDxUUHJvdG9jb2w+KXByb3RvY29sCit7CisgIE5TU3RyaW5nICpyZWFzb24gPSBuaWw7CisgIFNJbnQzMiB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3JVbmtub3duOworICBTSW50MzIgZmllbGRUeXBlOworICBTSW50MzIgZmllbGRJRDsKKworICBOU0Vycm9yICplcnJvcjsKKyAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMIGVycm9yOiZlcnJvcl0pIHsKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOk5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6JmZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDomZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjomZXJyb3JdKQorICAgIHsKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlU1RPUCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZElEKSB7CisgICAgY2FzZSAxOgorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUUklORykgeworICAgICAgICBpZiAoIVtwcm90b2NvbCByZWFkU3RyaW5nOiZyZWFzb24gZXJyb3I6JmVycm9yXSkgeworICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6CisgICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlSTMyKSB7CisgICAgICAgIGlmICghW3Byb3RvY29sIHJlYWRJMzI6JnR5cGUgZXJyb3I6JmVycm9yXSkgeworICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6ZmllbGRUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6JmVycm9yXSkgeworICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKCFbVFByb3RvY29sVXRpbCBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjomZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRFbmQ6JmVycm9yXSkgeworICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZDomZXJyb3JdKSB7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgcmV0dXJuIFtOU0Vycm9yIGVycm9yV2l0aFR5cGU6dHlwZSByZWFzb246cmVhc29uXTsKK30KKworCistKEJPT0wpIHdyaXRlOihpZDxUUHJvdG9jb2w+KXByb3RvY29sIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtwcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6QCJUQXBwbGljYXRpb25FeGNlcHRpb24iIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChzZWxmLmxvY2FsaXplZERlc2NyaXB0aW9uICE9IG5pbCkgeworICAgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOkAibWVzc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpUVHlwZVNUUklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOjEgZXJyb3I6ZXJyb3JdKQorICAgIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtwcm90b2NvbCB3cml0ZVN0cmluZzpzZWxmLmxvY2FsaXplZERlc2NyaXB0aW9uIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6QCJ0eXBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTpUVHlwZUkzMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXSkKKyAgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlSTMyOihTSW50MzIpc2VsZi5jb2RlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3Byb3RvY29sIHdyaXRlRmllbGRFbmQ6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVGaWVsZFN0b3A6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmQ6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZDBiOWEuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVFByb3RvY29sLmgiCi0KLWVudW0gewotICBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTiA9IDAsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTktOT1dOX01FVEhPRCA9IDEsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX01FU1NBR0VfVFlQRSA9IDIsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9XUk9OR19NRVRIT0RfTkFNRSA9IDMsCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9CQURfU0VRVUVOQ0VfSUQgPSA0LAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQgPSA1LAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fSU5URVJOQUxfRVJST1IgPSA2LAotICBUQXBwbGljYXRpb25FeGNlcHRpb25fUFJPVE9DT0xfRVJST1IgPSA3Ci19OwotCi0vLyBGSVhNRQotQGludGVyZmFjZSBUQXBwbGljYXRpb25FeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKLSAgaW50IG1UeXBlOwotfQotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbDsKLQotLSAodm9pZCkgd3JpdGU6IChpZCA8VFByb3RvY29sPikgcHJvdG9jb2w7Ci0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoVHlwZTogKGludCkgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgbWVzc2FnZTsKLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YzJmMmIuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24ubQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVFByb3RvY29sVXRpbC5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24KLQotLSAoaWQpIGluaXRXaXRoVHlwZTogKGludCkgdHlwZQotICAgICAgICAgICAgIHJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICBtVHlwZSA9IHR5cGU7Ci0KLSAgTlNTdHJpbmcgKiBuYW1lOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTl9NRVRIT0Q6Ci0gICAgbmFtZSA9IEAiVW5rbm93biBtZXRob2QiOwotICAgIGJyZWFrOwotICBjYXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9JTlZBTElEX01FU1NBR0VfVFlQRToKLSAgICBuYW1lID0gQCJJbnZhbGlkIG1lc3NhZ2UgdHlwZSI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX1dST05HX01FVEhPRF9OQU1FOgotICAgIG5hbWUgPSBAIldyb25nIG1ldGhvZCBuYW1lIjsKLSAgICBicmVhazsKLSAgY2FzZSBUQXBwbGljYXRpb25FeGNlcHRpb25fQkFEX1NFUVVFTkNFX0lEOgotICAgIG5hbWUgPSBAIkJhZCBzZXF1ZW5jZSBJRCI7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uX01JU1NJTkdfUkVTVUxUOgotICAgIG5hbWUgPSBAIk1pc3NpbmcgcmVzdWx0IjsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBuYW1lID0gQCJVbmtub3duIjsKLSAgICBicmVhazsKLSAgfQotCi0gIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhOYW1lOiBuYW1lIHJlYXNvbjogcmVhc29uIHVzZXJJbmZvOiBuaWxdOwotICByZXR1cm4gc2VsZjsKLX0KLQotCi0rIChUQXBwbGljYXRpb25FeGNlcHRpb24gKikgcmVhZDogKGlkIDxUUHJvdG9jb2w+KSBwcm90b2NvbAotewotICBOU1N0cmluZyAqIHJlYXNvbiA9IG5pbDsKLSAgaW50IHR5cGUgPSBUQXBwbGljYXRpb25FeGNlcHRpb25fVU5LTk9XTjsKLSAgaW50IGZpZWxkVHlwZTsKLSAgaW50IGZpZWxkSUQ7Ci0KLSAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgW3Byb3RvY29sIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTogTlVMTAotICAgICAgICAgICAgICB0eXBlOiAmZmllbGRUeXBlCi0gICAgICAgICAgICAgIGZpZWxkSUQ6ICZmaWVsZElEXTsKLSAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGZpZWxkSUQpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUUklORykgewotICAgICAgICByZWFzb24gPSBbcHJvdG9jb2wgcmVhZFN0cmluZ107Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVfSTMyKSB7Ci0gICAgICAgIHR5cGUgPSBbcHJvdG9jb2wgcmVhZEkzMl07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBbcHJvdG9jb2wgcmVhZEZpZWxkRW5kXTsKLSAgfQotICBbcHJvdG9jb2wgcmVhZFN0cnVjdEVuZF07Ci0KLSAgcmV0dXJuIFtUQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uV2l0aFR5cGU6IHR5cGUgcmVhc29uOiByZWFzb25dOwotfQotCi0KLS0gKHZvaWQpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCi17Ci0gIFtwcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6IEAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIl07Ci0KLSAgaWYgKFtzZWxmIHJlYXNvbl0gIT0gbmlsKSB7Ci0gICAgW3Byb3RvY29sIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiBAIm1lc3NhZ2UiCi0gICAgICAgICAgICAgICAgIHR5cGU6IFRUeXBlX1NUUklORwotICAgICAgICAgICAgICAgICBmaWVsZElEOiAxXTsKLSAgICBbcHJvdG9jb2wgd3JpdGVTdHJpbmc6IFtzZWxmIHJlYXNvbl1dOwotICAgIFtwcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsKLSAgfQotCi0gIFtwcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogQCJ0eXBlIgotICAgICAgICAgICAgICAgdHlwZTogVFR5cGVfSTMyCi0gICAgICAgICAgICAgICBmaWVsZElEOiAyXTsKLSAgW3Byb3RvY29sIHdyaXRlSTMyOiBtVHlwZV07Ci0gIFtwcm90b2NvbCB3cml0ZUZpZWxkRW5kXTsKLQotICBbcHJvdG9jb2wgd3JpdGVGaWVsZFN0b3BdOwotICBbcHJvdG9jb2wgd3JpdGVTdHJ1Y3RFbmRdOwotfQotCi0KLSsgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAqKSBleGNlcHRpb25XaXRoVHlwZTogKGludCkgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLXsKLSAgcmV0dXJuIFtbW1RBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhbGxvY10gaW5pdFdpdGhUeXBlOiB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXSBhdXRvcmVsZWFzZV9zdHViXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzNhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCYXNlQ2xpZW50LmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2wuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKK0BpbnRlcmZhY2UgVEJhc2VDbGllbnQgOiBOU09iamVjdAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubSBiL2xpYi9jb2NvYS9zcmMvVEJhc2VDbGllbnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDljYWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UQmFzZUNsaWVudC5tCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEJhc2VDbGllbnQuaCIKKyNpbXBvcnQgIlRBcHBsaWNhdGlvbkVycm9yLmgiCisKKworQGludGVyZmFjZSBUQmFzZUNsaWVudCAoKQorQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUQmFzZUNsaWVudAorCistKE5TRXJyb3IgKikgY2hlY2tJbmNvbWluZ01lc3NhZ2VFeGNlcHRpb246KGlkPFRQcm90b2NvbD4paW5Qcm90b2NvbAoreworICBOU0Vycm9yICp0aHJpZnRFcnJvcjsKKworICBTSW50MzIgbXNnVHlwZSA9IDA7CisgIGlmICghW2luUHJvdG9jb2wgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6bmlsIHR5cGU6Jm1zZ1R5cGUgc2VxdWVuY2VJRDpOVUxMIGVycm9yOiZ0aHJpZnRFcnJvcl0pIHsKKyAgICByZXR1cm4gdGhyaWZ0RXJyb3I7CisgIH0KKworICBpZiAobXNnVHlwZSA9PSBUTWVzc2FnZVR5cGVFWENFUFRJT04pIHsKKworICAgIHRocmlmdEVycm9yID0gW05TRXJyb3IgcmVhZDppblByb3RvY29sXTsKKworICAgIFtpblByb3RvY29sIHJlYWRNZXNzYWdlRW5kOk5VTExdOworCisgICAgcmV0dXJuIHRocmlmdEVycm9yOworICB9CisKKyAgcmV0dXJuIG5pbDsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTM2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RCaW5hcnkuc3dpZnQKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgc3RydWN0IFRCaW5hcnkgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuU1RSSU5HIH0KKyAgCisgIHByaXZhdGUgdmFyIHN0b3JhZ2UgOiBOU0RhdGEKKyAgCisgIHB1YmxpYyBpbml0KCkgeworICAgIHNlbGYuc3RvcmFnZSA9IE5TRGF0YSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGNvbnRlbnRzT2ZGaWxlIGZpbGU6IFN0cmluZywgb3B0aW9uczogTlNEYXRhUmVhZGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSB0cnkgTlNEYXRhKGNvbnRlbnRzT2ZGaWxlOiBmaWxlLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgaW5pdChjb250ZW50c09mVVJMIFVSTDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVJlYWRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgc2VsZi5zdG9yYWdlID0gdHJ5IE5TRGF0YShjb250ZW50c09mVVJMOiBVUkwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PyhiYXNlNjRFbmNvZGVkRGF0YSBiYXNlNjREYXRhOiBOU0RhdGEsIG9wdGlvbnM6IE5TRGF0YUJhc2U2NERlY29kaW5nT3B0aW9ucyA9IFtdKSB7CisgICAgZ3VhcmQgbGV0IHN0b3JhZ2UgPSBOU0RhdGEoYmFzZTY0RW5jb2RlZERhdGE6IGJhc2U2NERhdGEsIG9wdGlvbnM6IG9wdGlvbnMpIGVsc2UgeworICAgICAgcmV0dXJuIG5pbAorICAgIH0KKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGRhdGE6IE5TRGF0YSkgeworICAgIHNlbGYuc3RvcmFnZSA9IGRhdGEKKyAgfQorICAKKyAgcHVibGljIHZhciBsZW5ndGggOiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmxlbmd0aAorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaGFzaFZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgYnl0ZXMgOiBVbnNhZmVQb2ludGVyPFZvaWQ+IHsKKyAgICByZXR1cm4gc3RvcmFnZS5ieXRlcworICB9CisgIAorICBwdWJsaWMgZnVuYyBnZXRCeXRlcyhidWZmZXI6IFVuc2FmZU11dGFibGVQb2ludGVyPFZvaWQ+LCBsZW5ndGg6IEludCkgeworICAgIHN0b3JhZ2UuZ2V0Qnl0ZXMoYnVmZmVyLCBsZW5ndGg6IGxlbmd0aCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZ2V0Qnl0ZXMoYnVmZmVyOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxWb2lkPiwgcmFuZ2U6IFJhbmdlPEludD4pIHsKKyAgICBzdG9yYWdlLmdldEJ5dGVzKGJ1ZmZlciwgcmFuZ2U6IE5TUmFuZ2UocmFuZ2UpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBzdWJCaW5hcnlXaXRoUmFuZ2UocmFuZ2U6IFJhbmdlPEludD4pIC0+IFRCaW5hcnkgeworICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IHN0b3JhZ2Uuc3ViZGF0YVdpdGhSYW5nZShOU1JhbmdlKHJhbmdlKSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlVG9GaWxlKHBhdGg6IFN0cmluZywgb3B0aW9uczogTlNEYXRhV3JpdGluZ09wdGlvbnMgPSBbXSkgdGhyb3dzIHsKKyAgICB0cnkgc3RvcmFnZS53cml0ZVRvRmlsZShwYXRoLCBvcHRpb25zOiBvcHRpb25zKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVRvVVJMKHVybDogTlNVUkwsIG9wdGlvbnM6IE5TRGF0YVdyaXRpbmdPcHRpb25zID0gW10pIHRocm93cyB7CisgICAgdHJ5IHN0b3JhZ2Uud3JpdGVUb1VSTCh1cmwsIG9wdGlvbnM6IG9wdGlvbnMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJhbmdlT2ZEYXRhKGRhdGFUb0ZpbmQgZGF0YTogTlNEYXRhLCBvcHRpb25zOiBOU0RhdGFTZWFyY2hPcHRpb25zLCByYW5nZTogUmFuZ2U8SW50PikgLT4gUmFuZ2U8SW50Pj8geworICAgIHJldHVybiBzdG9yYWdlLnJhbmdlT2ZEYXRhKGRhdGEsIG9wdGlvbnM6IG9wdGlvbnMsIHJhbmdlOiBOU1JhbmdlKHJhbmdlKSkudG9SYW5nZSgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGVudW1lcmF0ZUJ5dGVSYW5nZXNVc2luZ0Jsb2NrKGJsb2NrOiAoVW5zYWZlUG9pbnRlcjxWb2lkPiwgUmFuZ2U8SW50PiwgaW5vdXQgQm9vbCkgLT4gVm9pZCkgeworICAgIHN0b3JhZ2UuZW51bWVyYXRlQnl0ZVJhbmdlc1VzaW5nQmxvY2sgeyBieXRlcywgcmFuZ2UsIHN0b3AgaW4KKyAgICAgIHZhciBzdG9wVG1wID0gQm9vbChzdG9wLm1lbW9yeSkKKyAgICAgIGJsb2NrKGJ5dGVzLCByYW5nZS50b1JhbmdlKCkhLCAmc3RvcFRtcCkKKyAgICAgIHN0b3AubWVtb3J5ID0gT2JqQ0Jvb2woc3RvcFRtcCkKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRCaW5hcnkgeworICAgIHZhciBkYXRhIDogTlNEYXRhPworICAgIHRyeSBwcm90by5yZWFkQmluYXJ5KCZkYXRhKQorICAgIHJldHVybiBUQmluYXJ5KGRhdGE6IGRhdGEhKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVEJpbmFyeSwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJpbmFyeSh2YWx1ZS5zdG9yYWdlKQorICB9CisgIAorfQorCitleHRlbnNpb24gVEJpbmFyeSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PShsaHM6IFRCaW5hcnksIHJoczogVEJpbmFyeSkgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URW51bS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyYTUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVudW0uc3dpZnQKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBURW51bSA6IFRTZXJpYWxpemFibGUgeworICAKK30KKworcHVibGljIGV4dGVuc2lvbiBURW51bSB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuSTMyIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RFcnJvci5oIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI3MmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9URXJyb3IuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorCisKK2V4dGVybiBOU1N0cmluZyAqVEVycm9yRG9tYWluOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXJyb3IubSBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3ZjkyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVEVycm9yLm0KQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURXJyb3IuaCIKKworCitOU1N0cmluZyAqVEVycm9yRG9tYWluID0gQCJURXJyb3JEb21haW4iOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLmggYi9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2ZjRmYS4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL1RFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLUBpbnRlcmZhY2UgVEV4Y2VwdGlvbiA6IE5TRXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uOwotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3I7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVEV4Y2VwdGlvbi5tIGIvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNjBlM2IuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy9URXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi17Ci0gIHJldHVybiBbc2VsZiBleGNlcHRpb25XaXRoTmFtZTogbmFtZSByZWFzb246IEAidW5rbm93biIgZXJyb3I6IG5pbF07Ci19Ci0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgcmVhc29uOiAoTlNTdHJpbmcgKikgcmVhc29uCi17Ci0gIHJldHVybiBbc2VsZiBleGNlcHRpb25XaXRoTmFtZTogbmFtZSByZWFzb246IHJlYXNvbiBlcnJvcjogbmlsXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICByZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICBlcnJvcjogKE5TRXJyb3IgKikgZXJyb3IKLXsKLSAgTlNEaWN0aW9uYXJ5ICogdXNlckluZm8gPSBuaWw7Ci0gIGlmIChlcnJvciAhPSBuaWwpIHsKLSAgICB1c2VySW5mbyA9IFtOU0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6IGVycm9yIGZvcktleTogQCJlcnJvciJdOwotICB9Ci0KLSAgcmV0dXJuIFtzdXBlciBleGNlcHRpb25XaXRoTmFtZTogbmFtZQotICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0tIChOU1N0cmluZyAqKSBkZXNjcmlwdGlvbgotewotICBOU011dGFibGVTdHJpbmcgKiByZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhTdHJpbmc6IFtzZWxmIG5hbWVdXTsKLSAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6IEAiOiAlQCIsIFtzZWxmIHJlYXNvbl1dOwotICBpZiAoW3NlbGYgdXNlckluZm9dICE9IG5pbCkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OiBAIlxuICB1c2VySW5mbyA9ICVAIiwgW3NlbGYgdXNlckluZm9dXTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UTGlzdC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVExpc3Quc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1YmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVExpc3Quc3dpZnQKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCisKK3B1YmxpYyBzdHJ1Y3QgVExpc3Q8RWxlbWVudCA6IFRTZXJpYWxpemFibGU+IDogTXV0YWJsZUNvbGxlY3Rpb25UeXBlLCBIYXNoYWJsZSwgQXJyYXlMaXRlcmFsQ29udmVydGlibGUsIFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5MSVNUIH0KKyAgCisgIHR5cGVhbGlhcyBTdG9yYWdlID0gQXJyYXk8RWxlbWVudD4KKworICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICAKKyAgcHJpdmF0ZSB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAKKyAgcHVibGljIHZhciBzdGFydEluZGV4IDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICAKKyAgcHVibGljIHZhciBlbmRJbmRleCA6IEluZGV4IHsKKyAgICByZXR1cm4gc3RvcmFnZS5lbmRJbmRleAorICB9CisKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IEluZGV4KSAtPiBFbGVtZW50IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAgIHNldCB7CisgICAgICBzdG9yYWdlW3Bvc2l0aW9uXSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciBlbGVtZW50IGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2Uoc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIGluaXQoKSB7CisgICAgc2VsZi5zdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGFwcGVuZChuZXdFbGVtZW50OiBFbGVtZW50KSB7CisgICAgc2VsZi5zdG9yYWdlLmFwcGVuZChuZXdFbGVtZW50KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBhcHBlbmRDb250ZW50c09mPEMgOiBDb2xsZWN0aW9uVHlwZSB3aGVyZSBDLkdlbmVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQ+KG5ld3N0b3JhZ2U6IEMpIHsKKyAgICBzZWxmLnN0b3JhZ2UuYXBwZW5kQ29udGVudHNPZihuZXdzdG9yYWdlKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnNlcnQobmV3RWxlbWVudDogRWxlbWVudCwgYXRJbmRleCBpbmRleDogSW50KSB7CisgICAgc2VsZi5zdG9yYWdlLmluc2VydChuZXdFbGVtZW50LCBhdEluZGV4OiBpbmRleCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgaW5zZXJ0Q29udGVudHNPZjxDIDogQ29sbGVjdGlvblR5cGUgd2hlcmUgQy5HZW5lcmF0b3IuRWxlbWVudCA9PSBFbGVtZW50PihuZXdFbGVtZW50czogQywgYXQgaW5kZXg6IEludCkgeworICAgIHNlbGYuc3RvcmFnZS5pbnNlcnRDb250ZW50c09mKG5ld0VsZW1lbnRzLCBhdDogaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUFsbChrZWVwQ2FwYWNpdHkga2VlcENhcGFjaXR5OiBCb29sID0gdHJ1ZSkgeworICAgIHNlbGYuc3RvcmFnZS5yZW1vdmVBbGwoa2VlcENhcGFjaXR5OiBrZWVwQ2FwYWNpdHkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUF0SW5kZXgoaW5kZXg6IEluZGV4KSB7CisgICAgc2VsZi5zdG9yYWdlLnJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZUZpcnN0KG46IEludCA9IDApIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlRmlyc3QobikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlTGFzdCgpIC0+IEVsZW1lbnQgeworICAgIHJldHVybiBzZWxmLnN0b3JhZ2UucmVtb3ZlTGFzdCgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZVJhbmdlKHN1YlJhbmdlOiBSYW5nZTxJbmRleD4pIHsKKyAgICBzZWxmLnN0b3JhZ2UucmVtb3ZlUmFuZ2Uoc3ViUmFuZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlc2VydmVDYXBhY2l0eShtaW5pbXVtQ2FwYWNpdHk6IEludCkgeworICAgIHNlbGYuc3RvcmFnZS5yZXNlcnZlQ2FwYWNpdHkobWluaW11bUNhcGFjaXR5KQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTGlzdCB7CisgICAgbGV0IChlbGVtZW50VHlwZSwgc2l6ZSkgPSB0cnkgcHJvdG8ucmVhZExpc3RCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IFRQcm90b2NvbEV4dGVuZGVkRXJyb3IuVW5leHBlY3RlZFR5cGUucmF3VmFsdWUpXSkKKyAgICB9CisgICAgdmFyIGxpc3QgPSBUTGlzdCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGVsZW1lbnQgPSB0cnkgRWxlbWVudC5yZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG8pCisgICAgICBsaXN0LnN0b3JhZ2UuYXBwZW5kKGVsZW1lbnQpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTGlzdEVuZCgpCisgICAgcmV0dXJuIGxpc3QKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IFRMaXN0LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlKEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogdmFsdWUuY291bnQpCisgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZVZhbHVlKGVsZW1lbnQsIHRvUHJvdG9jb2w6IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0RW5kKCkKKyAgfQorfQorCitleHRlbnNpb24gVExpc3QgOiBDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSwgQ3VzdG9tRGVidWdTdHJpbmdDb252ZXJ0aWJsZSB7CisgIAorICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZXNjcmlwdGlvbgorICB9CisgIAorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUTGlzdDxFbGVtZW50PiwgcmhzOiBUTGlzdDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UTWFwLnN3aWZ0IGIvbGliL2NvY29hL3NyYy9UTWFwLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmU3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL1RNYXAuc3dpZnQKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgc3RydWN0IFRNYXA8S2V5IDogVFNlcmlhbGl6YWJsZSwgVmFsdWUgOiBUU2VyaWFsaXphYmxlPiA6IENvbGxlY3Rpb25UeXBlLCBEaWN0aW9uYXJ5TGl0ZXJhbENvbnZlcnRpYmxlLCBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IHJldHVybiAuTUFQIH0KKworICB0eXBlYWxpYXMgU3RvcmFnZSA9IERpY3Rpb25hcnk8S2V5LCBWYWx1ZT4KKworICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorCisgIHB1YmxpYyB0eXBlYWxpYXMgRWxlbWVudCA9IFN0b3JhZ2UuRWxlbWVudAorICAKKyAgcHJpdmF0ZSB2YXIgc3RvcmFnZSA6IFN0b3JhZ2UKKworICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXggOiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleAorICB9CisgIAorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorCisgIHB1YmxpYyB2YXIga2V5czogTGF6eU1hcENvbGxlY3Rpb248W0tleSA6IFZhbHVlXSwgS2V5PiB7CisgICAgcmV0dXJuIHN0b3JhZ2Uua2V5cworICB9CisgIAorICBwdWJsaWMgdmFyIHZhbHVlczogTGF6eU1hcENvbGxlY3Rpb248W0tleSA6IFZhbHVlXSwgVmFsdWU+IHsKKyAgICByZXR1cm4gc3RvcmFnZS52YWx1ZXMKKyAgfQorICAKKyAgcHVibGljIGluaXQoKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgaW5pdChkaWN0aW9uYXJ5TGl0ZXJhbCBlbGVtZW50czogKEtleSwgVmFsdWUpLi4uKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gZWxlbWVudHMgeworICAgICAgc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBpbml0KG1pbmltdW1DYXBhY2l0eTogSW50KSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UobWluaW11bUNhcGFjaXR5OiBtaW5pbXVtQ2FwYWNpdHkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXhGb3JLZXkoa2V5OiBLZXkpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXhGb3JLZXkoa2V5KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0IChrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIHN0b3JhZ2Vba2V5XQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3RvcmFnZVtrZXldID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyB1cGRhdGVWYWx1ZSh2YWx1ZTogVmFsdWUsIGZvcktleSBrZXk6IEtleSkgLT4gVmFsdWU/IHsKKyAgICByZXR1cm4gdXBkYXRlVmFsdWUodmFsdWUsIGZvcktleToga2V5KQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyByZW1vdmVBdEluZGV4KGluZGV4OiBEaWN0aW9uYXJ5SW5kZXg8S2V5LCBWYWx1ZT4pIC0+IChLZXksIFZhbHVlKSB7CisgICAgcmV0dXJuIHJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZVZhbHVlRm9yS2V5KGtleTogS2V5KSAtPiBWYWx1ZT8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZVZhbHVlRm9yS2V5KGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQWxsKGtlZXBDYXBhY2l0eSBrZWVwQ2FwYWNpdHk6IEJvb2wgPSBmYWxzZSkgeworICAgIHN0b3JhZ2UucmVtb3ZlQWxsKGtlZXBDYXBhY2l0eToga2VlcENhcGFjaXR5KQorICB9CisKKyAgcHVibGljIHZhciBoYXNoVmFsdWUgOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBrZXkuaGFzaFZhbHVlCisgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHZhbHVlLmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRNYXAgeworICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTWFwQmVnaW4oKQorICAgIGlmIGtleVR5cGUgIT0gS2V5LnRocmlmdFR5cGUgfHwgdmFsdWVUeXBlICE9IFZhbHVlLnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLkludmFsaWREYXRhLnJhd1ZhbHVlKSwKKyAgICAgICAgdXNlckluZm86IFtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IE5TTnVtYmVyKGludDogVFByb3RvY29sRXh0ZW5kZWRFcnJvci5VbmV4cGVjdGVkVHlwZS5yYXdWYWx1ZSldKQorICAgIH0KKyAgICB2YXIgbWFwID0gVE1hcCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGtleSA9IHRyeSBLZXkucmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvKQorICAgICAgbGV0IHZhbHVlID0gdHJ5IFZhbHVlLnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIG1hcC5zdG9yYWdlW2tleV0gPSB2YWx1ZQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZE1hcEVuZCgpCisgICAgcmV0dXJuIG1hcAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVE1hcCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZU1hcEJlZ2luV2l0aEtleVR5cGUoS2V5LnRocmlmdFR5cGUsIHZhbHVlVHlwZTogVmFsdWUudGhyaWZ0VHlwZSwgc2l6ZTogdmFsdWUuY291bnQpCisgICAgZm9yIChrZXksIHZhbHVlKSBpbiB2YWx1ZS5zdG9yYWdlIHsKKyAgICAgIHRyeSBLZXkud3JpdGVWYWx1ZShrZXksIHRvUHJvdG9jb2w6IHByb3RvKQorICAgICAgdHJ5IFZhbHVlLndyaXRlVmFsdWUodmFsdWUsIHRvUHJvdG9jb2w6IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVNYXBFbmQoKQorICB9CisgIAorfQorCisKK2V4dGVuc2lvbiBUTWFwIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKK3B1YmxpYyBmdW5jID09PEtleSwgVmFsdWU+KGxoczogVE1hcDxLZXksVmFsdWU+LCByaHM6IFRNYXA8S2V5LCBWYWx1ZT4pIC0+IEJvb2wgeworICBpZiBsaHMuY291bnQgIT0gcmhzLmNvdW50IHsKKyAgICByZXR1cm4gZmFsc2UKKyAgfQorICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVE9iamVjdGl2ZS1DLmggYi9saWIvY29jb2Evc3JjL1RPYmplY3RpdmUtQy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA4MzFkLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvVE9iamVjdGl2ZS1DLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBUT2JqZWN0aXZlLUMuaCBpcyBmb3Igc3VwcG9ydGluZyBjb2V4aXN0ZW5jZSBvZiBib3RoIHRoZSBBUkMgKEF1dG9tYXRpYyAKLSAqIFJlZmVyZW5jZSBDb3VudGluZykgbW9kZSBhbmQgdGhlIE5vbi1BUkMgbW9kZSBvZiBPYmplY3RpdmUtQyAKLSAqIGluIHRoZSBzYW1lIHNvdXJjZSBjb2RlLgotICoKLSAqICAgICAgICAgICAgICAgICAgMjAxMS8xMS8xNCAgSElSQU5PIFNhdG9zaGkgKEFJU1QsIEphcGFuKQotICoKLSAqIEJlZm9yZToKLSAqCi0gKiAgICB2YXIgPSBbYU9iamVjdCByZXRhaW5dOwotICogICAgW2FPYmplY3QgcmVsZWFzZV07Ci0gKiAgICBbYU9iamVjdCBhdXRvcmVsZWFzZV07Ci0gKiAgICBbc3VwZXIgZGVhbGxvY107Ci0gKiAgICBDRkZ1bmN0aW9uKG9iaik7Ci0gKgotICogQVJDIGFuZCBOb24tQVJDIGNvbXBhdGlibGU6Ci0gKgotICogICAgI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0gKiAgICB2YXIgPSBbYU9iamVjdCByZXRhaW5fc3R1Yl07Ci0gKiAgICBbYU9iamVjdCByZWxlYXNlX3N0dWJdOwotICogICAgW2FPYmplY3QgYXV0b3JlbGVhc2Vfc3R1Yl07Ci0gKiAgICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLSAqICAgIENGRnVuY3Rpb24oYnJpZGdlX3N0dWIgb2JqKTsKLSAqCi0gKiAgICBEb24ndCB1c2UgcmV0YWluX3N0dWIgZm9yIEBwcm9wZXJ0eShyZXRhaW4pLgotICogICAgVXNlIE5TQXV0b3JlbGVhc2VQb29sIGxpa2UgdGhpczoKLSAqICAgICAgICAjaWYgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKLSAqICAgICAgICAgIEBhdXRvcmVsZWFzZXBvb2wgewotICogICAgICAgICAgICAgIC8vIGNvZGUgCi0gKiAgICAgICAgICB9Ci0gKiAgICAgICAgI2Vsc2UKLSAqICAgICAgICAgIE5TQXV0b1JlbGVhc2VQb29sICpwb29sID0gW1tOU0F1dG9SZWxlYXNlUG9vbCBhbGxvY10gaW5pdC4uLgotICogICAgICAgICAgLy8gY29kZQotICogICAgICAgICAgW3Bvb2wgcmVsZWFzZV07Ci0gKiAgICAgICAgI2VuZGlmCi0gKi8KLQotCi0jaWYgIWRlZmluZWQocmV0YWluX3N0dWIpCi0jaWYgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKLSNkZWZpbmUgcmV0YWluX3N0dWIgc2VsZgotI2RlZmluZSBhdXRvcmVsZWFzZV9zdHViIHNlbGYKLSNkZWZpbmUgcmVsZWFzZV9zdHViIHNlbGYKLSNkZWZpbmUgZGVhbGxvY19zdHViIHNlbGYKLSNkZWZpbmUgYnJpZGdlX3N0dWIgX19icmlkZ2UKLSNlbHNlCi0jZGVmaW5lIHJldGFpbl9zdHViIHJldGFpbgotI2RlZmluZSBhdXRvcmVsZWFzZV9zdHViIGF1dG9yZWxlYXNlCi0jZGVmaW5lIHJlbGVhc2Vfc3R1YiByZWxlYXNlCi0jZGVmaW5lIGRlYWxsb2Nfc3R1YiBkZWFsbG9jCi0jZGVmaW5lIGJyaWRnZV9zdHViCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yLmggYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaAppbmRleCA5ODBiZTk0Li4yMGM3MmUyIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaAorKysgYi9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3IuaApAQCAtMjAsMTAgKzIwLDE2IEBACiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQgIlRQcm90b2NvbC5oIgogCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCiAKIEBwcm90b2NvbCBUUHJvY2Vzc29yIDxOU09iamVjdD4KIAotLSAoQk9PTCkgcHJvY2Vzc09uSW5wdXRQcm90b2NvbDogKGlkIDxUUHJvdG9jb2w+KSBpblByb3RvY29sCi0gICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sOworLShCT09MKSBwcm9jZXNzT25JbnB1dFByb3RvY29sOihpZCA8VFByb3RvY29sPilpblByb3RvY29sCisgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KW91dFByb3RvY29sCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaCBiL2xpYi9jb2NvYS9zcmMvVFByb2Nlc3NvckZhY3RvcnkuaAppbmRleCAyOWQxMmIzLi44NTAyMGE1IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL1RQcm9jZXNzb3JGYWN0b3J5LmgKKysrIGIvbGliL2NvY29hL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5oCkBAIC0yMCw4ICsyMCwxNCBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUUHJvY2Vzc29yLmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKwogQHByb3RvY29sIFRQcm9jZXNzb3JGYWN0b3J5IDxOU09iamVjdD4KIAotLSAoaWQ8VFByb2Nlc3Nvcj4pIHByb2Nlc3NvckZvclRyYW5zcG9ydDogKGlkPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UUHJvdG9jb2wuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc1ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgZXh0ZW5zaW9uIFRQcm90b2NvbCB7CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50KSB7CisgICAgCisgICAgdmFyIG5hbWUgOiBOU1N0cmluZz8KKyAgICB2YXIgdHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2VxdWVuY2VJRCA6IEludDMyID0gLTEKKyAgICAKKyAgICB0cnkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWUoJm5hbWUsIHR5cGU6ICZ0eXBlLCBzZXF1ZW5jZUlEOiAmc2VxdWVuY2VJRCkKKyAgICAKKyAgICByZXR1cm4gKG5hbWUgYXMgU3RyaW5nISwgVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiB0eXBlKSEsIEludChzZXF1ZW5jZUlEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShuYW1lOiBTdHJpbmcsIHR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKG5hbWUsIHR5cGU6IHR5cGUucmF3VmFsdWUsIHNlcXVlbmNlSUQ6IEludDMyKHNlcXVlbmNlSUQpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZz8pIHsKKyAgICAKKyAgICB2YXIgbmFtZSA6IE5TU3RyaW5nPyA9IG5pbAorICAgIAorICAgIHRyeSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lKCZuYW1lKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmc/KQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nPywgVFR5cGUsIEludCkgeworICAgIAorICAgIHZhciBuYW1lIDogTlNTdHJpbmc/ID0gbmlsCisgICAgdmFyIHR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIGZpZWxkSUQgOiBJbnQzMiA9IC0xCisgICAgCisgICAgdHJ5IHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZSgmbmFtZSwgdHlwZTogJnR5cGUsIGZpZWxkSUQ6ICZmaWVsZElEKQorICAgIAorICAgIHJldHVybiAobmFtZSBhcyBTdHJpbmc/LCBUVHlwZShyYXdWYWx1ZTogdHlwZSkhLCBJbnQoZmllbGRJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lKG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgZmllbGRJRDogSW50MzIoZmllbGRJRCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIHZhciBrZXlUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciB2YWx1ZVR5cGUgOiBJbnQzMiA9IC0xCisgICAgdmFyIHNpemUgOiBJbnQzMiA9IDAKKyAgICAKKyAgICB0cnkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZSgma2V5VHlwZSwgdmFsdWVUeXBlOiAmdmFsdWVUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBrZXlUeXBlKSEsIFRUeXBlKHJhd1ZhbHVlOiB2YWx1ZVR5cGUpISwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZShrZXlUeXBlLnJhd1ZhbHVlLCB2YWx1ZVR5cGU6IHZhbHVlVHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgdmFyIGVsZW1lbnRUeXBlIDogSW50MzIgPSAtMQorICAgIHZhciBzaXplIDogSW50MzIgPSAwCisgICAgCisgICAgdHJ5IHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlKCZlbGVtZW50VHlwZSwgc2l6ZTogJnNpemUpCisgICAgCisgICAgcmV0dXJuIChUVHlwZShyYXdWYWx1ZTogZWxlbWVudFR5cGUpISwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZS5yYXdWYWx1ZSwgc2l6ZTogSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIAorICAgIHZhciBlbGVtZW50VHlwZSA6IEludDMyID0gLTEKKyAgICB2YXIgc2l6ZSA6IEludDMyID0gMAorICAgIAorICAgIHRyeSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGUoJmVsZW1lbnRUeXBlLCBzaXplOiAmc2l6ZSkKKyAgICAKKyAgICByZXR1cm4gKFRUeXBlKHJhd1ZhbHVlOiBlbGVtZW50VHlwZSkhLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZShlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludCkgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGUoZWxlbWVudFR5cGUucmF3VmFsdWUsIHNpemU6IEludDMyKHNpemUpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4odmFsdWU6IFQsIG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGlkOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogdHlwZS5yYXdWYWx1ZSwgZmllbGRJRDogaWQpCisgICAgdHJ5IHdyaXRlVmFsdWUodmFsdWUpCisgICAgdHJ5IHdyaXRlRmllbGRFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkVmFsdWU8VDogVFNlcmlhbGl6YWJsZT4oKSB0aHJvd3MgLT4gVCB7CisgICAgcmV0dXJuIHRyeSBULnJlYWRWYWx1ZUZyb21Qcm90b2NvbChzZWxmKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVZhbHVlPFQ6IFRTZXJpYWxpemFibGU+KHZhbHVlOiBUKSB0aHJvd3MgeworICAgIHRyeSBULndyaXRlVmFsdWUodmFsdWUsIHRvUHJvdG9jb2w6IHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgeworICAgIAorICAgIGxldCAoXywgdHlwZSwgXykgPSB0cnkgcmVhZE1lc3NhZ2VCZWdpbigpOworICAgIAorICAgIGlmIHR5cGUgPT0gLkVYQ0VQVElPTiB7CisgICAgICBsZXQgeCA9IHRyeSByZWFkRXhjZXB0aW9uKCkKKyAgICAgIHRocm93IHgKKyAgICB9CisgICAgCisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHZhbGlkYXRlVmFsdWUodmFsdWU6IEFueT8sIG5hbWVkIG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICAKKyAgICBpZiB2YWx1ZSA9PSBuaWwgeworICAgICAgdGhyb3cgTlNFcnJvcigKKyAgICAgICAgZG9tYWluOiBUUHJvdG9jb2xFcnJvckRvbWFpbiwKKyAgICAgICAgY29kZTogSW50KFRQcm90b2NvbEVycm9yLlVua25vd24ucmF3VmFsdWUpLAorICAgICAgICB1c2VySW5mbzogW1RQcm90b2NvbEVycm9yRmllbGROYW1lS2V5OiBuYW1lXSkKKyAgICB9CisgICAgCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRFeGNlcHRpb24oKSB0aHJvd3MgLT4gRXJyb3JUeXBlIHsKKyAgICAKKyAgICB2YXIgcmVhc29uIDogU3RyaW5nPworICAgIHZhciB0eXBlID0gVEFwcGxpY2F0aW9uRXJyb3IuVW5rbm93bgorICAgIAorICAgIHRyeSByZWFkU3RydWN0QmVnaW4oKQorICAgIAorICAgIGZpZWxkczogd2hpbGUgKHRydWUpIHsKKyAgICAgIAorICAgICAgbGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IHJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIAorICAgICAgc3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIHsKKyAgICAgIGNhc2UgKF8sIC5TVE9QKToKKyAgICAgICAgYnJlYWsgZmllbGRzCisgICAgICAgIAorICAgICAgY2FzZSAoMSwgLlNUUklORyk6CisgICAgICAgIHJlYXNvbiA9IHRyeSByZWFkVmFsdWUoKSBhcyBTdHJpbmcKKyAgICAgICAgCisgICAgICBjYXNlICgyLCAuSTMyKToKKyAgICAgICAgbGV0IHR5cGVWYWwgPSB0cnkgcmVhZFZhbHVlKCkgYXMgSW50MzIKKyAgICAgICAgaWYgbGV0IHRtcCA9IFRBcHBsaWNhdGlvbkVycm9yKHJhd1ZhbHVlOiB0eXBlVmFsKSB7CisgICAgICAgICAgdHlwZSA9IHRtcAorICAgICAgICB9CisgICAgICAgIAorICAgICAgY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToKKyAgICAgICAgdHJ5IHNraXBUeXBlKHVua25vd25UeXBlKQorICAgICAgfQorICAgICAgCisgICAgICB0cnkgcmVhZEZpZWxkRW5kKCkKKyAgICB9CisgICAgCisgICAgdHJ5IHJlYWRTdHJ1Y3RFbmQoKQorICAgIAorICAgIHJldHVybiBOU0Vycm9yKHR5cGU6dHlwZSwgcmVhc29uOnJlYXNvbiA/PyAiIikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShuYW1lOiBTdHJpbmcsIHNlcXVlbmNlSUQ6IEludCwgZXg6IE5TRXJyb3IpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUobmFtZSwgdHlwZTogLkVYQ0VQVElPTiwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB0cnkgZXgud3JpdGUoc2VsZikKKyAgICB0cnkgd3JpdGVNZXNzYWdlRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc2tpcFR5cGUodHlwZTogVFR5cGUpIHRocm93cyB7CisgICAgdHJ5IFRQcm90b2NvbFV0aWwuc2tpcFR5cGUodHlwZS5yYXdWYWx1ZSwgb25Qcm90b2NvbDogc2VsZikKKyAgfQorICAKK30KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFNlcmlhbGl6YWJsZS5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFNlcmlhbGl6YWJsZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmRmZDQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU2VyaWFsaXphYmxlLnN3aWZ0CkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKworcHVibGljIHByb3RvY29sIFRTZXJpYWxpemFibGUgOiBIYXNoYWJsZSB7CisgIAorICBzdGF0aWMgdmFyIHRocmlmdFR5cGUgOiBUVHlwZSB7IGdldCB9CisgIAorICBpbml0KCkKKyAgCisgIHN0YXRpYyBmdW5jIHJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gU2VsZgorICAKKyAgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogU2VsZiwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MKKyAgCit9CisKKworCitpbmZpeCBvcGVyYXRvciA/PT0ge30KKworcHVibGljIGZ1bmMgPz09PFQ6IFRTZXJpYWxpemFibGU+KGxoczogVD8sIHJoczogVD8pIC0+IEJvb2wgeworICBpZiBsZXQgbCA9IGxocywgciA9IHJocyB7CisgICAgcmV0dXJuIGwgPT0gcgorICB9CisgIHJldHVybiBsaHMgPT0gcmhzCit9CisKK3B1YmxpYyBmdW5jID89PTxUOiBUU2VyaWFsaXphYmxlPihsaHM6IFQsIHJoczogVCkgLT4gQm9vbCB7CisgIHJldHVybiBsaHMgPT0gcmhzCit9CisKKworCitleHRlbnNpb24gQm9vbCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkJPT0wKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHZhciB2YWx1ZSA6IE9iakNCb29sID0gZmFsc2UKKyAgICB0cnkgcHJvdG8ucmVhZEJvb2woJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZS5ib29sVmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEJvb2wsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVCb29sKHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50OCA6IFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdGhyaWZ0VHlwZSA9IFRUeXBlLkJZVEUKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDggeworICAgIHZhciB2YWx1ZSA9IFVJbnQ4KCkKKyAgICB0cnkgcHJvdG8ucmVhZEJ5dGUoJnZhbHVlKQorICAgIHJldHVybiBJbnQ4KHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50OCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUJ5dGUoVUludDgodmFsdWUpKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50MTYgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMTYKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQxNigpCisgICAgdHJ5IHByb3RvLnJlYWRJMTYoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50MTYsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJMTYodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBJbnQgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JMzIKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludCB7CisgICAgdmFyIHZhbHVlID0gSW50MzIoKQorICAgIHRyeSBwcm90by5yZWFkSTMyKCZ2YWx1ZSkKKyAgICByZXR1cm4gSW50KHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50LCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlSTMyKEludDMyKHZhbHVlKSkKKyAgfQorICAKK30KKworZXh0ZW5zaW9uIEludDMyIDogVFNlcmlhbGl6YWJsZSB7CisgIAorICBwdWJsaWMgc3RhdGljIGxldCB0aHJpZnRUeXBlID0gVFR5cGUuSTMyCisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQzMiB7CisgICAgdmFyIHZhbHVlID0gSW50MzIoKQorICAgIHRyeSBwcm90by5yZWFkSTMyKCZ2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKyAgfQorICAKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUodmFsdWU6IEludDMyLCB0b1Byb3RvY29sIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlSTMyKHZhbHVlKQorICB9CisgIAorfQorCitleHRlbnNpb24gSW50NjQgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5JNjQKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICB2YXIgdmFsdWUgPSBJbnQ2NCgpCisgICAgdHJ5IHByb3RvLnJlYWRJNjQoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogSW50NjQsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVJNjQodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBEb3VibGUgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5ET1VCTEUKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgdmFyIHZhbHVlID0gRG91YmxlKCkKKyAgICB0cnkgcHJvdG8ucmVhZERvdWJsZSgmdmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBEb3VibGUsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVEb3VibGUodmFsdWUpCisgIH0KKyAgCit9CisKK2V4dGVuc2lvbiBTdHJpbmcgOiBUU2VyaWFsaXphYmxlIHsKKyAgCisgIHB1YmxpYyBzdGF0aWMgbGV0IHRocmlmdFR5cGUgPSBUVHlwZS5TVFJJTkcKKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgdmFyIHZhbHVlIDogTlNTdHJpbmc/CisgICAgdHJ5IHByb3RvLnJlYWRTdHJpbmcoJnZhbHVlKQorICAgIHJldHVybiB2YWx1ZSBhcyEgU3RyaW5nCisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKHZhbHVlOiBTdHJpbmcsIHRvUHJvdG9jb2wgcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGVTdHJpbmcodmFsdWUpCisgIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RTZXQuc3dpZnQgYi9saWIvY29jb2Evc3JjL1RTZXQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4MzNlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvVFNldC5zd2lmdApAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBzdHJ1Y3QgVFNldDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBDb2xsZWN0aW9uVHlwZSwgQXJyYXlMaXRlcmFsQ29udmVydGlibGUsIFRTZXJpYWxpemFibGUgeworICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5TRVQgfQorICAKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHR5cGVhbGlhcyBTdG9yYWdlID0gU2V0PEVsZW1lbnQ+CisgIAorICBwcml2YXRlIHZhciBzdG9yYWdlIDogU3RvcmFnZQorICAKKyAgcHVibGljIGluaXQoKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICB9CisgIAorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShlbGVtZW50cykKKyAgfQorICAKKyAgcHVibGljIGluaXQ8UyA6IFNlcXVlbmNlVHlwZSB3aGVyZSBTLkdlbmVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQ+KF8gc2VxdWVuY2U6IFMpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZShzZXF1ZW5jZSkgICAgCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleCA6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIAorICBwdWJsaWMgdmFyIGVuZEluZGV4IDogSW5kZXggeyByZXR1cm4gc3RvcmFnZS5lbmRJbmRleCB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnNlcnQobWVtYmVyOiBFbGVtZW50KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5zZXJ0KG1lbWJlcikKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlKGVsZW1lbnQ6IEVsZW1lbnQpIC0+IEVsZW1lbnQ/IHsKKyAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmUoZWxlbWVudCkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQWxsKGtlZXBDYXBhY2l0eSBrZWVwQ2FwYWNpdHk6IEJvb2wgPSBmYWxzZSkgeworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZUFsbChrZWVwQ2FwYWNpdHk6IGtlZXBDYXBhY2l0eSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChpbmRleDogU2V0SW5kZXg8RWxlbWVudD4pIC0+IEVsZW1lbnQgeworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQgKHBvc2l0aW9uOiBTZXRJbmRleDxFbGVtZW50PikgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHVuaW9uKG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLnVuaW9uKG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW50ZXJzZWN0KG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLmludGVyc2VjdChvdGhlcikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGV4Y2x1c2l2ZU9yKG90aGVyOiBUU2V0KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlLmV4Y2x1c2l2ZU9yKG90aGVyKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3VidHJhY3Qob3RoZXI6IFRTZXQpIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2Uuc3VidHJhY3Qob3RoZXIpKQorICB9CisgIAorICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBpbnRlcnNlY3RJblBsYWNlKG90aGVyOiBUU2V0KSB7CisgICAgc3RvcmFnZS5pbnRlcnNlY3RJblBsYWNlKG90aGVyKQorICB9CisKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZXhjbHVzaXZlT3JJblBsYWNlKG90aGVyOiBUU2V0KSB7CisgICAgc3RvcmFnZS5leGNsdXNpdmVPckluUGxhY2Uob3RoZXIpCisgIH0KKworICBwdWJsaWMgbXV0YXRpbmcgZnVuYyBzdWJ0cmFjdEluUGxhY2Uob3RoZXI6IFRTZXQpIHsKKyAgICBzdG9yYWdlLnN1YnRyYWN0SW5QbGFjZShvdGhlcikKKyAgfSAgCisKKyAgcHVibGljIGZ1bmMgaXNTdWJzZXRPZihvdGhlcjogVFNldCkgLT4gQm9vbCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaXNTdWJzZXRPZihvdGhlcikKKyAgfQorCisgIHB1YmxpYyBmdW5jIGlzRGlzam9pbnRXaXRoKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc0Rpc2pvaW50V2l0aChvdGhlcikKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaXNTdXBlcnNldE9mKG90aGVyOiBUU2V0KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pc1N1cGVyc2V0T2Yob3RoZXIpCisgIH0KKworICBwdWJsaWMgdmFyIGlzRW1wdHk6IEJvb2wgeyByZXR1cm4gc3RvcmFnZS5pc0VtcHR5IH0KKworICBwdWJsaWMgdmFyIGhhc2hWYWx1ZSA6IEludCB7CisgICAgbGV0IHByaW1lID0gMzEKKyAgICB2YXIgcmVzdWx0ID0gMQorICAgIGZvciBlbGVtZW50IGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBlbGVtZW50Lmhhc2hWYWx1ZQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkVmFsdWVGcm9tUHJvdG9jb2wocHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRTZXQgeworICAgIGxldCAoZWxlbWVudFR5cGUsIHNpemUpID0gdHJ5IHByb3RvLnJlYWRTZXRCZWdpbigpCisgICAgaWYgZWxlbWVudFR5cGUgIT0gRWxlbWVudC50aHJpZnRUeXBlIHsKKyAgICAgIHRocm93IE5TRXJyb3IoCisgICAgICAgIGRvbWFpbjogVFByb3RvY29sRXJyb3JEb21haW4sCisgICAgICAgIGNvZGU6IEludChUUHJvdG9jb2xFcnJvci5JbnZhbGlkRGF0YS5yYXdWYWx1ZSksCisgICAgICAgIHVzZXJJbmZvOiBbVFByb3RvY29sRXJyb3JFeHRlbmRlZEVycm9yS2V5OiBOU051bWJlcihpbnQ6IGVsZW1lbnRUeXBlLnJhd1ZhbHVlKV0pCisgICAgfQorICAgIHZhciBzZXQgPSBUU2V0KCkKKyAgICBmb3IgXyBpbiAwLi48c2l6ZSB7CisgICAgICBsZXQgZWxlbWVudCA9IHRyeSBFbGVtZW50LnJlYWRWYWx1ZUZyb21Qcm90b2NvbChwcm90bykKKyAgICAgIHNldC5zdG9yYWdlLmluc2VydChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFNldEVuZCgpCisgICAgcmV0dXJuIHNldAorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZSh2YWx1ZTogVFNldCwgdG9Qcm90b2NvbCBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlKEVsZW1lbnQudGhyaWZ0VHlwZSwgc2l6ZTogdmFsdWUuY291bnQpCisgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWUuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZVZhbHVlKGVsZW1lbnQsIHRvUHJvdG9jb2w6IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVTZXRFbmQoKQorICB9CisgIAorfQorCitleHRlbnNpb24gVFNldCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRTZXQ8RWxlbWVudD4sIHJoczogVFNldDxFbGVtZW50PikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuc3RvcmFnZSA9PSByaHMuc3RvcmFnZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5oCmluZGV4IGNmNGE0NjIuLmM3NWZhZDEgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkuaAorKysgYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgKQEAgLTIwLDggKzIwLDkgQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFByb2Nlc3NvckZhY3RvcnkuaCIKIAotQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yRmFjdG9yeT4gewotICBpZDxUUHJvY2Vzc29yPiBtU2hhcmVkUHJvY2Vzc29yOwotfQotLSAoaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOiAoaWQ8VFByb2Nlc3Nvcj4pIHNoYXJlZFByb2Nlc3NvcjsKKworQGludGVyZmFjZSBUU2hhcmVkUHJvY2Vzc29yRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvY2Vzc29yRmFjdG9yeT4KKworLShpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6KGlkPFRQcm9jZXNzb3I+KXNoYXJlZFByb2Nlc3NvcjsKKwogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tIGIvbGliL2NvY29hL3NyYy9UU2hhcmVkUHJvY2Vzc29yRmFjdG9yeS5tCmluZGV4IGEwMDA3YzAuLjNkNTVmNDcgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVFNoYXJlZFByb2Nlc3NvckZhY3RvcnkubQorKysgYi9saWIvY29jb2Evc3JjL1RTaGFyZWRQcm9jZXNzb3JGYWN0b3J5Lm0KQEAgLTE5LDM0ICsxOSwzMSBAQAogCiAKICNpbXBvcnQgIlRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5LmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKKworCitAaW50ZXJmYWNlIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb2Nlc3Nvcj4gc2hhcmVkUHJvY2Vzc29yOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFRTaGFyZWRQcm9jZXNzb3JGYWN0b3J5CiAKIAotLSAoaWQpIGluaXRXaXRoU2hhcmVkUHJvY2Vzc29yOiAoaWQ8VFByb2Nlc3Nvcj4pIHNoYXJlZFByb2Nlc3NvcgorLShpZCkgaW5pdFdpdGhTaGFyZWRQcm9jZXNzb3I6KGlkPFRQcm9jZXNzb3I+KXNoYXJlZFByb2Nlc3NvcgogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoIXNlbGYpIHsKLSAgICByZXR1cm4gbmlsOworICBpZiAoc2VsZikgeworICAgIF9zaGFyZWRQcm9jZXNzb3IgPSBzaGFyZWRQcm9jZXNzb3I7CiAgIH0KLSAgCi0gIG1TaGFyZWRQcm9jZXNzb3IgPSBbc2hhcmVkUHJvY2Vzc29yIHJldGFpbl9zdHViXTsKKwogICByZXR1cm4gc2VsZjsKIH0KIAotCi0tICh2b2lkKSBkZWFsbG9jCistKGlkPFRQcm9jZXNzb3I+KSBwcm9jZXNzb3JGb3JUcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydAogewotICBbbVNoYXJlZFByb2Nlc3NvciByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi0tIChpZDxUUHJvY2Vzc29yPikgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiAoaWQ8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotewotICByZXR1cm4gW1ttU2hhcmVkUHJvY2Vzc29yIHJldGFpbl9zdHViXSBhdXRvcmVsZWFzZV9zdHViXTsKKyAgcmV0dXJuIF9zaGFyZWRQcm9jZXNzb3I7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdCBiL2xpYi9jb2NvYS9zcmMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWE3MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UU3RydWN0LnN3aWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworfQorCisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIAorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gVFR5cGUuU1RSVUNUIH0KKyAgCit9CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL1RocmlmdC5oIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE4MjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgVGhyaWZ0VmVyc2lvbiBAIjEuMC4wIgpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzVkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisKK0Bwcm90b2NvbCBUQmFzZSA8TlNPYmplY3Q+CisKKy8qKgorICogRGUtc2VyaWFsaXplIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAorICoKKyAqIEBwYXJhbSBpblByb3RvY29sIHByb3RvY29sIHVzZWQgZm9yIHJlYWRpbmcKKyAqLworLShCT09MKSByZWFkOihpZCA8VFByb3RvY29sPilpblByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisvKioKKyAqIFNlcmlhbGl6ZSBvYmplY3QgdG8gdGhlIGdpdmVuIHByb3RvY29sCisgKgorICogQHBhcmFtIG91dFByb3RvY29sIG91dHB1dCBwcm90b2NvbCB1c2VkIGZvciB3cml0aW5nCisgKi8KKy0oQk9PTCkgd3JpdGU6KGlkIDxUUHJvdG9jb2w+KW91dFByb3RvY29sIGVycm9yOihOU0Vycm9yICoqKWVycm9yOworCisKKy8qKgorICogVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzCisgKi8KKy0oQk9PTCkgdmFsaWRhdGU6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3I7CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IDUyY2YyNjYuLmJiOTBmYWQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaApAQCAtMjEsMzEgKzIxLDI5IEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4gewotICBpZCA8VFRyYW5zcG9ydD4gbVRyYW5zcG9ydDsKLSAgQk9PTCBtU3RyaWN0UmVhZDsKLSAgQk9PTCBtU3RyaWN0V3JpdGU7Ci0gIGludDMyX3QgbU1lc3NhZ2VTaXplTGltaXQ7Ci19CiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworQGludGVyZmFjZSBUQmluYXJ5UHJvdG9jb2wgOiBOU09iamVjdCA8VFByb3RvY29sPgogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGU7CitAcHJvcGVydHkgKGFzc2lnbiwgbm9uYXRvbWljKSBVSW50MzIgbWVzc2FnZVNpemVMaW1pdDsKIAotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdDsKLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQ7CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQKKyAgICAgICAgICAgICBzdHJpY3RSZWFkOihCT09MKXN0cmljdFJlYWQKKyAgICAgICAgICAgIHN0cmljdFdyaXRlOihCT09MKXN0cmljdFdyaXRlOwogCiBAZW5kOwogCiAKLUBpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PiB7Ci19CitAaW50ZXJmYWNlIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgOiBOU09iamVjdCA8VFByb3RvY29sRmFjdG9yeT4KIAotKyAoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5OworKyhUQmluYXJ5UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CiAKLS0gKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQ7CistKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OwogCiBAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubSBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLm0KaW5kZXggZjI2OWFhYS4uMWY5ZTU3YSAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wubQorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5tCkBAIC0xOCwxOCArMTgsMjAgQEAKICAqLwogCiAjaW1wb3J0ICJUQmluYXJ5UHJvdG9jb2wuaCIKLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLWludDMyX3QgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKLWludDMyX3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyNpbXBvcnQgIlRQcm90b2NvbEVycm9yLmgiCiAKIAotc3RhdGljIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgKiBnU2hhcmVkRmFjdG9yeSA9IG5pbDsKK3N0YXRpYyBTSW50MzIgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKK3N0YXRpYyBTSW50MzIgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKworCitzdGF0aWMgVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqZ1NoYXJlZEZhY3RvcnkgPSBuaWw7CisKIAogQGltcGxlbWVudGF0aW9uIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKIAotKyAoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5IHsKKysoVEJpbmFyeVByb3RvY29sRmFjdG9yeSAqKSBzaGFyZWRGYWN0b3J5Cit7CiAgIGlmIChnU2hhcmVkRmFjdG9yeSA9PSBuaWwpIHsKICAgICBnU2hhcmVkRmFjdG9yeSA9IFtbVEJpbmFyeVByb3RvY29sRmFjdG9yeSBhbGxvY10gaW5pdF07CiAgIH0KQEAgLTM3LDM1OCArMzksNTUzIEBACiAgIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKIH0KIAotLSAoVEJpbmFyeVByb3RvY29sICopIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydCB7Ci0gIHJldHVybiBbW1RCaW5hcnlQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6IHRyYW5zcG9ydF07CistKE5TU3RyaW5nICopIHByb3RvY29sTmFtZQoreworICByZXR1cm4gQCJiaW5hcnkiOworfQorCistKFRCaW5hcnlQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RCaW5hcnlQcm90b2NvbCBhbGxvY10gaW5pdFdpdGhUcmFuc3BvcnQ6dHJhbnNwb3J0XTsKIH0KIAogQGVuZAogCiAKK0BpbnRlcmZhY2UgVEJpbmFyeVByb3RvY29sICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQgPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBCT09MIHN0cmljdFJlYWQ7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIEJPT0wgc3RyaWN0V3JpdGU7CisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmN1cnJlbnRNZXNzYWdlTmFtZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmN1cnJlbnRGaWVsZE5hbWU7CisKK0BlbmQKKwogCiBAaW1wbGVtZW50YXRpb24gVEJpbmFyeVByb3RvY29sCiAKLS0gKGlkKSBpbml0V2l0aFRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0CistKGlkKSBpbml0V2l0aFRyYW5zcG9ydDooaWQgPFRUcmFuc3BvcnQ+KWFUcmFuc3BvcnQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJhbnNwb3J0OiB0cmFuc3BvcnQgc3RyaWN0UmVhZDogTk8gc3RyaWN0V3JpdGU6IE5PXTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVHJhbnNwb3J0OmFUcmFuc3BvcnQgc3RyaWN0UmVhZDpOTyBzdHJpY3RXcml0ZTpZRVNdOwogfQogCi0tIChpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6IChpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAotICAgICAgICAgICAgICBzdHJpY3RSZWFkOiAoQk9PTCkgc3RyaWN0UmVhZAotICAgICAgICAgICAgIHN0cmljdFdyaXRlOiAoQk9PTCkgc3RyaWN0V3JpdGUKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0CisgICAgICAgICAgICAgc3RyaWN0UmVhZDooQk9PTClzdHJpY3RSZWFkCisgICAgICAgICAgICBzdHJpY3RXcml0ZTooQk9PTClzdHJpY3RXcml0ZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBtVHJhbnNwb3J0ID0gW3RyYW5zcG9ydCByZXRhaW5fc3R1Yl07Ci0gIG1TdHJpY3RSZWFkID0gc3RyaWN0UmVhZDsKLSAgbVN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIGlmIChzZWxmKSB7CisgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICBfc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgX3N0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKLQotLSAoaW50MzJfdCkgbWVzc2FnZVNpemVMaW1pdAorLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAogewotICByZXR1cm4gbU1lc3NhZ2VTaXplTGltaXQ7CisgIHJldHVybiBfdHJhbnNwb3J0OwogfQogCi0KLS0gKHZvaWQpIHNldE1lc3NhZ2VTaXplTGltaXQ6IChpbnQzMl90KSBzaXplTGltaXQKKy0oTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6KGludClzaXplIGVycm9yOihOU0Vycm9yICoqKWVycm9yCiB7Ci0gIG1NZXNzYWdlU2l6ZUxpbWl0ID0gc2l6ZUxpbWl0OwotfQotCi0KLS0gKHZvaWQpIGRlYWxsb2MKLXsKLSAgW21UcmFuc3BvcnQgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAoaWQgPFRUcmFuc3BvcnQ+KSB0cmFuc3BvcnQKLXsKLSAgcmV0dXJuIG1UcmFuc3BvcnQ7Ci19Ci0KLQotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZ0JvZHk6IChpbnQpIHNpemUKLXsKLSAgY2hhciAqIGJ1ZmZlciA9IG1hbGxvYyhzaXplKzEpOwotICBpZiAoIWJ1ZmZlcikgewotICAgIEB0aHJvdyBbVFByb3RvY29sRXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhOYW1lOiBAIlRQcm90b2NvbEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiAlcywgc2l6ZTogJWkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19QUkVUVFlfRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVdXTs7CisgIE5TTXV0YWJsZURhdGEgKmRhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKyAgaWYgKCFkYXRhKSB7CisgICAgUFJPVE9DT0xfRVJST1IobmlsLCBVbmtub3duLCBAIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyIsIHNpemUpOwogICB9Ci0gIFttVHJhbnNwb3J0IHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZmZlciBvZmZzZXQ6IDAgbGVuZ3RoOiBzaXplXTsKLSAgYnVmZmVyW3NpemVdID0gMDsKLSAgTlNTdHJpbmcgKiByZXN1bHQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6IGJ1ZmZlcl07Ci0gIGZyZWUoYnVmZmVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKKworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6ZGF0YS5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKG5pbCwgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEgZW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwogfQogCiAKLS0gKHZvaWQpIHJlYWRNZXNzYWdlQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOiAoaW50ICopIHNlcXVlbmNlSUQKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGludDMyX3Qgc2l6ZSA9IFtzZWxmIHJlYWRJMzJdOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICA7CisKICAgaWYgKHNpemUgPCAwKSB7CiAgICAgaW50IHZlcnNpb24gPSBzaXplICYgVkVSU0lPTl9NQVNLOwogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkJhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW4iXTsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBCYWRWZXJzaW9uLCBAIkJhZCBtZXNzYWdlIHZlcnNpb24iKTsKICAgICB9CiAgICAgaWYgKHR5cGUgIT0gTlVMTCkgewotICAgICAgKnR5cGUgPSB2ZXJzaW9uICYgMHgwMEZGOworICAgICAgKnR5cGUgPSBzaXplICYgMHgwMEZGOwogICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ107CisgICAgTlNTdHJpbmcgKm1lc3NhZ2VOYW1lOworICAgIGlmICghW3NlbGYgcmVhZFN0cmluZzombWVzc2FnZU5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmIChuYW1lICE9IG5pbCkgeworICAgICAgKm5hbWUgPSBtZXNzYWdlTmFtZTsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisKKyAgICBpZiAoX3N0cmljdFJlYWQpIHsKKyAgICAgIFBST1RPQ09MX0VSUk9SKE5PLCBJbnZhbGlkRGF0YSwgQCJNaXNzaW5nIG1lc3NhZ2UgdmVyc2lvbiwgb2xkIGNsaWVudD8iKTsKKyAgICB9CisKKyAgICBpZiAoX21lc3NhZ2VTaXplTGltaXQgPiAwICYmIHNpemUgPiBfbWVzc2FnZVNpemVMaW1pdCkgeworICAgICAgUFJPVE9DT0xfRVJST1IoTk8sIFNpemVMaW1pdCwgQCJNZXNzYWdlIGV4Y2VlZWRzIHNpemUgbGltaXQgb2YgJWQiLCAoaW50KXNpemUpOworICAgIH0KKworICAgIE5TU3RyaW5nICptZXNzYWdlTmFtZSA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICAgIGlmICghbWVzc2FnZU5hbWUpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKICAgICBpZiAobmFtZSAhPSBOVUxMKSB7CiAgICAgICAqbmFtZSA9IG1lc3NhZ2VOYW1lOwogICAgIH0KLSAgICBpbnQgc2VxSUQgPSBbc2VsZiByZWFkSTMyXTsKLSAgICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7Ci0gICAgICAqc2VxdWVuY2VJRCA9IHNlcUlEOworCisgICAgVUludDggbWVzc2FnZVR5cGU7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZTombWVzc2FnZVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICB9IGVsc2UgewotICAgIGlmIChtU3RyaWN0UmVhZCkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyJdOwotICAgIH0KLSAgICBpZiAoW3NlbGYgbWVzc2FnZVNpemVMaW1pdF0gPiAwICYmIHNpemUgPiBbc2VsZiBtZXNzYWdlU2l6ZUxpbWl0XSkgewotICAgICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFByb3RvY29sRXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIk1lc3NhZ2UgdG9vIGJpZy4gIFNpemUgbGltaXQgaXM6ICVkIE1lc3NhZ2Ugc2l6ZSBpczogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVzc2FnZVNpemVMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOwotICAgIH0KLSAgICBOU1N0cmluZyAqIG1lc3NhZ2VOYW1lID0gW3NlbGYgcmVhZFN0cmluZ0JvZHk6IHNpemVdOwotICAgIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAgICpuYW1lID0gbWVzc2FnZU5hbWU7Ci0gICAgfQotICAgIGludCBtZXNzYWdlVHlwZSA9IFtzZWxmIHJlYWRCeXRlXTsKKwogICAgIGlmICh0eXBlICE9IE5VTEwpIHsKICAgICAgICp0eXBlID0gbWVzc2FnZVR5cGU7CiAgICAgfQotICAgIGludCBzZXFJRCA9IFtzZWxmIHJlYWRJMzJdOwotICAgIGlmIChzZXF1ZW5jZUlEICE9IE5VTEwpIHsKLSAgICAgICpzZXF1ZW5jZUlEID0gc2VxSUQ7Ci0gICAgfQogICB9CisKKyAgU0ludDMyIHNlcUlEOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNlcUlEIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnNlcXVlbmNlSUQgPSBzZXFJRDsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VFbmQge30KLQotCi0tICh2b2lkKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICAqbmFtZSA9IG5pbDsKLSAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RFbmQge30KLQotCi0tICh2b2lkKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50ICopIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50ICopIGZpZWxkSUQKKy0oQk9PTCkgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fYXV0b3JlbGVhc2luZyAqKW5hbWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX2F1dG9yZWxlYXNpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChuYW1lICE9IG5pbCkgewogICAgICpuYW1lID0gbmlsOwogICB9Ci0gIGludCBmdCA9IFtzZWxmIHJlYWRCeXRlXTsKKworICBVSW50OCBmdDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CiAgIGlmIChmaWVsZFR5cGUgIT0gTlVMTCkgewogICAgICpmaWVsZFR5cGUgPSBmdDsKICAgfQotICBpZiAoZnQgIT0gVFR5cGVfU1RPUCkgewotICAgIGludCBmaWQgPSBbc2VsZiByZWFkSTE2XTsKKyAgaWYgKGZ0ICE9IFRUeXBlU1RPUCkgeworICAgIFNJbnQxNiBmaWQ7CisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICAgIGlmIChmaWVsZElEICE9IE5VTEwpIHsKICAgICAgICpmaWVsZElEID0gZmlkOwogICAgIH0KICAgfQorICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHJlYWRGaWVsZEVuZCB7fQotCi0KLS0gKGludDMyX3QpIHJlYWRJMzIKKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGkzMnJkWzRdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpMzJyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLSAgcmV0dXJuCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFNJbnQzMiBzaXplOworICBpZiAoIVtzZWxmIHJlYWRJMzI6JnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnN0cmluZyA9IFtzZWxmIHJlYWRTdHJpbmdCb2R5OnNpemUgZXJyb3I6ZXJyb3JdOworICBpZiAoIXN0cmluZykgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgICp2YWx1ZSA9IHN0cmluZzsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnl0ZTsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomYnl0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICAqdmFsdWUgPSBieXRlID09IDE7CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzFdOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0gYnVmZlswXTsKKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZEkxNjooU0ludDE2ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IGJ1ZmZbMl07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDpidWZmIG9mZnNldDowIGxlbmd0aDoyIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPQorICAgICgoU0ludDE2KShidWZmWzBdICYgMHhmZikgPDwgOCkgfAorICAgICgoU0ludDE2KShidWZmWzFdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSByZWFkSTMyOihTSW50MzIgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMycmRbNF07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDppMzJyZCBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpOworICB9CisKKyAgKnZhbHVlID0KICAgICAoKGkzMnJkWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAoKGkzMnJkWzFdICYgMHhmZikgPDwgMTYpIHwKICAgICAoKGkzMnJkWzJdICYgMHhmZikgPDwgIDgpIHwKICAgICAoKGkzMnJkWzNdICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoTlNTdHJpbmcgKikgcmVhZFN0cmluZworLShCT09MKSByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IHNpemUgPSBbc2VsZiByZWFkSTMyXTsKLSAgcmV0dXJuIFtzZWxmIHJlYWRTdHJpbmdCb2R5OiBzaXplXTsKKyAgVUludDggYnVmZls4XTsKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgICp2YWx1ZSA9CisgICAgKChTSW50NjQpKGJ1ZmZbMF0gJiAweGZmKSA8PCA1NikgfAorICAgICgoU0ludDY0KShidWZmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZlsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgKChTSW50NjQpKGJ1ZmZbM10gJiAweGZmKSA8PCAzMikgfAorICAgICgoU0ludDY0KShidWZmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAoKFNJbnQ2NCkoYnVmZls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgKChTSW50NjQpKGJ1ZmZbNl0gJiAweGZmKSA8PCAgOCkgfAorICAgICgoU0ludDY0KShidWZmWzddICYgMHhmZikpOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAoQk9PTCkgcmVhZEJvb2wKLXsKLSAgcmV0dXJuIFtzZWxmIHJlYWRCeXRlXSA9PSAxOwotfQotCi0tICh1aW50OF90KSByZWFkQnl0ZQotewotICB1aW50OF90IG15Qnl0ZTsKLSAgW21UcmFuc3BvcnQgcmVhZEFsbDogJm15Qnl0ZSBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKLSAgcmV0dXJuIG15Qnl0ZTsKLX0KLQotLSAoc2hvcnQpIHJlYWRJMTYKLXsKLSAgdWludDhfdCBidWZmWzJdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IDJdOwotICByZXR1cm4gKHNob3J0KQotICAgICgoKGJ1ZmZbMF0gJiAweGZmKSA8PCA4KSB8Ci0gICAgICgoYnVmZlsxXSAmIDB4ZmYpKSk7Ci0gIHJldHVybiAwOwotfQotCi0tIChpbnQ2NF90KSByZWFkSTY0OwotewotICB1aW50OF90IGk2NHJkWzhdOwotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBpNjRyZCBvZmZzZXQ6IDAgbGVuZ3RoOiA4XTsKLSAgcmV0dXJuCi0gICAgKChpbnQ2NF90KShpNjRyZFswXSAmIDB4ZmYpIDw8IDU2KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFsxXSAmIDB4ZmYpIDw8IDQ4KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFsyXSAmIDB4ZmYpIDw8IDQwKSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFszXSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs0XSAmIDB4ZmYpIDw8IDI0KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs1XSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs2XSAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgKChpbnQ2NF90KShpNjRyZFs3XSAmIDB4ZmYpKTsKLX0KLQotLSAoZG91YmxlKSByZWFkRG91YmxlOworLShCT09MKSByZWFkRG91YmxlOihkb3VibGUgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgLy8gRklYTUUgLSB3aWxsIHRoaXMgZ2V0IHVzIGludG8gdHJvdWJsZSBvbiBQb3dlclBDPwotICBpbnQ2NF90IGllZWU3NTQgPSBbc2VsZiByZWFkSTY0XTsKLSAgcmV0dXJuICooKGRvdWJsZSAqKSAmaWVlZTc1NCk7CisgIHJldHVybiBbc2VsZiByZWFkSTY0OihTSW50NjQgKil2YWx1ZSBlcnJvcjplcnJvcl07CiB9CiAKIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnkKKy0oQk9PTCkgcmVhZEJpbmFyeTooTlNEYXRhICpfX2F1dG9yZWxlYXNpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50MzJfdCBzaXplID0gW3NlbGYgcmVhZEkzMl07Ci0gIHVpbnQ4X3QgKiBidWZmID0gbWFsbG9jKHNpemUpOwotICBpZiAoYnVmZiA9PSBOVUxMKSB7Ci0gICAgQHRocm93IFtUUHJvdG9jb2xFeGNlcHRpb24KLSAgICAgICAgICAgICBleGNlcHRpb25XaXRoTmFtZTogQCJUUHJvdG9jb2xFeGNlcHRpb24iCi0gICAgICAgICAgICAgcmVhc29uOiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDogQCJPdXQgb2YgbWVtb3J5LiAgVW5hYmxlIHRvIGFsbG9jYXRlICVkIGJ5dGVzIHRyeWluZyB0byByZWFkIGJpbmFyeSBkYXRhLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV1dOworICBTSW50MzIgc2l6ZTsKKyAgaWYgKCFbc2VsZiByZWFkSTMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKICAgfQotICBbbVRyYW5zcG9ydCByZWFkQWxsOiBidWZmIG9mZnNldDogMCBsZW5ndGg6IHNpemVdOwotICByZXR1cm4gW05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OiBidWZmIGxlbmd0aDogc2l6ZV07CisKKyAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNpemVdOworICBpZiAoIWRhdGEpIHsKKyAgICBQUk9UT0NPTF9FUlJPUihOTywgVW5rbm93biwgQCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMiLCAoaW50KXNpemUpOworICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmRhdGEubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpzaXplIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgIH0KKworICAqdmFsdWUgPSBkYXRhOworCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTogKGludCAqKSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiAoaW50ICopIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCAqKSBzaXplCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyICopdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGt0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgdnQgPSBbc2VsZiByZWFkQnl0ZV07Ci0gIGludCBzID0gW3NlbGYgcmVhZEkzMl07CisgIFVJbnQ4IGt0OworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZrdCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCB2dDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomdnQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoa2V5VHlwZSAhPSBOVUxMKSB7CiAgICAgKmtleVR5cGUgPSBrdDsKICAgfQorCiAgIGlmICh2YWx1ZVR5cGUgIT0gTlVMTCkgewogICAgICp2YWx1ZVR5cGUgPSB2dDsKICAgfQorCiAgIGlmIChzaXplICE9IE5VTEwpIHsKICAgICAqc2l6ZSA9IHM7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSByZWFkTWFwRW5kIHt9CiAKLQotLSAodm9pZCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6IChpbnQgKikgZWxlbWVudFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZE1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGV0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBldDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZXQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICplbGVtZW50VHlwZSA9IGV0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZFNldEVuZCB7fQotCi0KLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemUKKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGV0ID0gW3NlbGYgcmVhZEJ5dGVdOwotICBpbnQgcyA9IFtzZWxmIHJlYWRJMzJdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBldDsKKyAgaWYgKCFbc2VsZiByZWFkQnl0ZTomZXQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHM7CisgIGlmICghW3NlbGYgcmVhZEkzMjomcyBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKwogICBpZiAoZWxlbWVudFR5cGUgIT0gTlVMTCkgewogICAgICplbGVtZW50VHlwZSA9IGV0OwogICB9CisKICAgaWYgKHNpemUgIT0gTlVMTCkgewogICAgICpzaXplID0gczsKICAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgcmVhZExpc3RFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZUJ5dGU6ICh1aW50OF90KSB2YWx1ZQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgW21UcmFuc3BvcnQgd3JpdGU6ICZ2YWx1ZSBvZmZzZXQ6IDAgbGVuZ3RoOiAxXTsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCkgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQpIHNlcXVlbmNlSUQKKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIGlmIChtU3RyaWN0V3JpdGUpIHsKKyAgaWYgKF9zdHJpY3RXcml0ZSkgeworCiAgICAgaW50IHZlcnNpb24gPSBWRVJTSU9OXzEgfCBtZXNzYWdlVHlwZTsKLSAgICBbc2VsZiB3cml0ZUkzMjogdmVyc2lvbl07Ci0gICAgW3NlbGYgd3JpdGVTdHJpbmc6IG5hbWVdOwotICAgIFtzZWxmIHdyaXRlSTMyOiBzZXF1ZW5jZUlEXTsKLSAgfSBlbHNlIHsKLSAgICBbc2VsZiB3cml0ZVN0cmluZzogbmFtZV07Ci0gICAgW3NlbGYgd3JpdGVCeXRlOiBtZXNzYWdlVHlwZV07Ci0gICAgW3NlbGYgd3JpdGVJMzI6IHNlcXVlbmNlSURdOworCisgICAgaWYgKCFbc2VsZiB3cml0ZUkzMjp2ZXJzaW9uIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQogICB9CisgIGVsc2UgeworCisgICAgaWYgKCFbc2VsZiB3cml0ZVN0cmluZzpuYW1lIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlOm1lc3NhZ2VUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6c2VxdWVuY2VJRCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUge30KLQotCi0tICh2b2lkKSB3cml0ZVN0cnVjdEVuZCB7fQotCi0KLS0gKHZvaWQpIHdyaXRlRmllbGRCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQpIGZpZWxkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6IChpbnQpIGZpZWxkSUQKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGZpZWxkVHlwZV07Ci0gIFtzZWxmIHdyaXRlSTE2OiBmaWVsZElEXTsKKyAgX2N1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbDsKKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tICh2b2lkKSB3cml0ZUkzMjogKGludDMyX3QpIHZhbHVlCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgdWludDhfdCBidWZmWzRdOworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZmllbGRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmICghW3NlbGYgd3JpdGVJMTY6ZmllbGRJRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlOih2YWx1ZSA/IDEgOiAwKSBlcnJvcjplcnJvcl07Cit9CisKKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOiZ2YWx1ZSBvZmZzZXQ6MCBsZW5ndGg6MSBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVJMTY6KHNob3J0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBidWZmWzJdOworICBidWZmWzBdID0gMHhmZiAmICh2YWx1ZSA+PiA4KTsKKyAgYnVmZlsxXSA9IDB4ZmYgJiB2YWx1ZTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmJ1ZmYgb2Zmc2V0OjAgbGVuZ3RoOjIgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVJMzI6KFNJbnQzMil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggYnVmZls0XTsKICAgYnVmZlswXSA9IDB4RkYgJiAodmFsdWUgPj4gMjQpOwogICBidWZmWzFdID0gMHhGRiAmICh2YWx1ZSA+PiAxNik7CiAgIGJ1ZmZbMl0gPSAweEZGICYgKHZhbHVlID4+IDgpOwogICBidWZmWzNdID0gMHhGRiAmIHZhbHVlOwotICBbbVRyYW5zcG9ydCB3cml0ZTogYnVmZiBvZmZzZXQ6IDAgbGVuZ3RoOiA0XTsKLX0KIAotLSAodm9pZCkgd3JpdGVJMTY6IChzaG9ydCkgdmFsdWUKLXsKLSAgdWludDhfdCBidWZmWzJdOwotICBidWZmWzBdID0gMHhmZiAmICh2YWx1ZSA+PiA4KTsKLSAgYnVmZlsxXSA9IDB4ZmYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogMl07CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6YnVmZiBvZmZzZXQ6MCBsZW5ndGg6NCBlcnJvcjplcnJvcl0pIHsKKyAgICBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IoTk8sIGVycm9yLCBAIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKTsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVJNjQ6IChpbnQ2NF90KSB2YWx1ZQorLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICB1aW50OF90IGJ1ZmZbOF07CisgIFVJbnQ4IGJ1ZmZbOF07CiAgIGJ1ZmZbMF0gPSAweEZGICYgKHZhbHVlID4+IDU2KTsKICAgYnVmZlsxXSA9IDB4RkYgJiAodmFsdWUgPj4gNDgpOwogICBidWZmWzJdID0gMHhGRiAmICh2YWx1ZSA+PiA0MCk7CkBAIC0zOTcsODIgKzU5NCwxNDcgQEAKICAgYnVmZls1XSA9IDB4RkYgJiAodmFsdWUgPj4gMTYpOwogICBidWZmWzZdID0gMHhGRiAmICh2YWx1ZSA+PiA4KTsKICAgYnVmZls3XSA9IDB4RkYgJiB2YWx1ZTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IGJ1ZmYgb2Zmc2V0OiAwIGxlbmd0aDogOF07CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpidWZmIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVEb3VibGU6IChkb3VibGUpIHZhbHVlCisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgLy8gc3BpdCBvdXQgSUVFRSA3NTQgYml0cyAtIEZJWE1FIC0gd2lsbCB0aGlzIGdldCB1cyBpbiB0cm91YmxlIG9uCi0gIC8vIFBvd2VyUEM/Ci0gIFtzZWxmIHdyaXRlSTY0OiAqKChpbnQ2NF90ICopICZ2YWx1ZSldOworICAvLyBGSVhNRSAtIHdpbGwgdGhpcyBnZXQgdXMgaW4gdHJvdWJsZSBvbiBQb3dlclBDPworICBpZiAoIVtzZWxmIHdyaXRlSTY0OiooU0ludDY0ICopJnZhbHVlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7CiB9CiAKIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZQorLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKICAgaWYgKHZhbHVlICE9IG5pbCkgewotICAgIGNvbnN0IGNoYXIgKiB1dGY4Qnl0ZXMgPSBbdmFsdWUgVVRGOFN0cmluZ107Ci0gICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbih1dGY4Qnl0ZXMpOwotICAgIFtzZWxmIHdyaXRlSTMyOiBsZW5ndGhdOwotICAgIFttVHJhbnNwb3J0IHdyaXRlOiAodWludDhfdCAqKSB1dGY4Qnl0ZXMgb2Zmc2V0OiAwIGxlbmd0aDogbGVuZ3RoXTsKLSAgfSBlbHNlIHsKKworICAgIGNvbnN0IGNoYXIgKnV0ZjhCeXRlcyA9IFt2YWx1ZSBVVEY4U3RyaW5nXTsKKworICAgIFNJbnQzMiBsZW5ndGggPSAoU0ludDMyKXN0cmxlbih1dGY4Qnl0ZXMpOworICAgIGlmICghW3NlbGYgd3JpdGVJMzI6bGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopdXRmOEJ5dGVzIG9mZnNldDowIGxlbmd0aDooaW50KWxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICAgIH0KKworICB9CisgIGVsc2UgeworCiAgICAgLy8gaW5zdGVhZCBvZiBjcmFzaGluZyB3aGVuIHdlIGdldCBudWxsLCBsZXQncyB3cml0ZSBvdXQgYSB6ZXJvCiAgICAgLy8gbGVuZ3RoIHN0cmluZwotICAgIFtzZWxmIHdyaXRlSTMyOiAwXTsKKyAgICBpZiAoIVtzZWxmIHdyaXRlSTMyOjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlQmluYXJ5OiAoTlNEYXRhICopIGRhdGEKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlSTMyOiBbZGF0YSBsZW5ndGhdXTsKLSAgW21UcmFuc3BvcnQgd3JpdGU6IFtkYXRhIGJ5dGVzXSBvZmZzZXQ6IDAgbGVuZ3RoOiBbZGF0YSBsZW5ndGhdXTsKLX0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooU0ludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQogCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcAotewotICBbc2VsZiB3cml0ZUJ5dGU6IFRUeXBlX1NUT1BdOworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOmRhdGEuYnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOihVSW50MzIpZGF0YS5sZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIHdyaXRlRmllbGRFbmQge30KLQotCi0tICh2b2lkKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6IChpbnQpIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogKGludCkgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZToga2V5VHlwZV07Ci0gIFtzZWxmIHdyaXRlQnl0ZTogdmFsdWVUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICBpZiAoIVtzZWxmIHdyaXRlQnl0ZTpUVHlwZVNUT1AgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZCkgd3JpdGVNYXBFbmQge30KIAotCi0tICh2b2lkKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogKGludCkgc2l6ZQorLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6IGVsZW1lbnRUeXBlXTsKLSAgW3NlbGYgd3JpdGVJMzI6IHNpemVdOworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSB3cml0ZVNldEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemUKKy0oQk9PTCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOihTSW50MzIpa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIFtzZWxmIHdyaXRlQnl0ZTogZWxlbWVudFR5cGVdOwotICBbc2VsZiB3cml0ZUkzMjogc2l6ZV07CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmtleVR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOnZhbHVlVHlwZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUkzMjooaW50KXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpIHdyaXRlTGlzdEVuZCB7fQogCi0KLS0gKHZvaWQpIHdyaXRlQm9vbDogKEJPT0wpIHZhbHVlCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBbc2VsZiB3cml0ZUJ5dGU6ICh2YWx1ZSA/IDEgOiAwKV07CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZVNldEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGU6ZWxlbWVudFR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVJMzI6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCisKKy0oQk9PTCkgd3JpdGVMaXN0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW3NlbGYgd3JpdGVCeXRlOmVsZW1lbnRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoIVtzZWxmIHdyaXRlSTMyOnNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIHJldHVybiBZRVM7Cit9CisKKworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YWNjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFByb3RvY29sLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUUHJvdG9jb2xGYWN0b3J5LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sIDogTlNPYmplY3QgPFRQcm90b2NvbD4KKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0Pil0cmFuc3BvcnQ7CisKK0BlbmQKKworQGludGVyZmFjZSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSA6IE5TT2JqZWN0IDxUUHJvdG9jb2xGYWN0b3J5PgorCisrKFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5ICopIHNoYXJlZEZhY3Rvcnk7CisKKy0oVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBlYmIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLm0KQEAgLTAsMCArMSw5ODMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVENvbXBhY3RQcm90b2NvbC5oIgorI2ltcG9ydCAiVFByb3RvY29sRXJyb3IuaCIKKworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfUFJPVE9DT0xfSUQgPSAweDgyOworc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVkVSU0lPTiA9IDE7CitzdGF0aWMgY29uc3QgVUludDggQ09NUEFDVF9WRVJTSU9OX01BU0sgPSAweDFGOyAvLyAwMDAxIDExMTEKK3N0YXRpYyBjb25zdCBVSW50OCBDT01QQUNUX1RZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorc3RhdGljIGNvbnN0IFVJbnQ4IENPTVBBQ1RfVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCitzdGF0aWMgY29uc3QgaW50IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQgPSA1OworCitlbnVtIHsKKyAgVENUeXBlX1NUT1AgPSAweDAwLAorICBUQ1R5cGVfQk9PTEVBTl9UUlVFID0gMHgwMSwKKyAgVENUeXBlX0JPT0xFQU5fRkFMU0UgPSAweDAyLAorICBUQ1R5cGVfQllURSA9IDB4MDMsCisgIFRDVHlwZV9JMTYgPSAweDA0LAorICBUQ1R5cGVfSTMyID0gMHgwNSwKKyAgVENUeXBlX0k2NCA9IDB4MDYsCisgIFRDVHlwZV9ET1VCTEUgPSAweDA3LAorICBUQ1R5cGVfQklOQVJZID0gMHgwOCwKKyAgVENUeXBlX0xJU1QgPSAweDA5LAorICBUQ1R5cGVfU0VUID0gMHgwQSwKKyAgVENUeXBlX01BUCA9IDB4MEIsCisgIFRDVHlwZV9TVFJVQ1QgPSAweDBDLAorfTsKKworQGltcGxlbWVudGF0aW9uIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5CisKKysoVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKikgc2hhcmVkRmFjdG9yeQoreworICBzdGF0aWMgVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgKmdTaGFyZWRGYWN0b3J5ID0gbmlsOworICBpZiAoZ1NoYXJlZEZhY3RvcnkgPT0gbmlsKSB7CisgICAgZ1NoYXJlZEZhY3RvcnkgPSBbW1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGFsbG9jXSBpbml0XTsKKyAgfQorCisgIHJldHVybiBnU2hhcmVkRmFjdG9yeTsKK30KKworLShOU1N0cmluZyAqKSBwcm90b2NvbE5hbWUKK3sKKyAgcmV0dXJuIEAiY29tcGFjdCI7Cit9CisKKy0oVENvbXBhY3RQcm90b2NvbCAqKSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0Cit7CisgIHJldHVybiBbW1RDb21wYWN0UHJvdG9jb2wgYWxsb2NdIGluaXRXaXRoVHJhbnNwb3J0OnRyYW5zcG9ydF07Cit9CisKK0BlbmQKKworCitAaW50ZXJmYWNlIFRDb21wYWN0UHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZCA8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZUFycmF5ICpsYXN0RmllbGQ7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIHNob3J0IGxhc3RGaWVsZElkOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpib29sRmllbGROYW1lOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbEZpZWxkVHlwZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNOdW1iZXIgKmJvb2xGaWVsZElkOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU051bWJlciAqYm9vbGVhblZhbHVlOworCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpjdXJyZW50TWVzc2FnZU5hbWU7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVENvbXBhY3RQcm90b2NvbAorCistKGlkKSBpbml0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisKKyAgaWYgKHNlbGYgIT0gbmlsKSB7CisgICAgX2xhc3RGaWVsZCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOworICB9CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pYVRyYW5zcG9ydAoreworICBzZWxmID0gW3NlbGYgaW5pdF07CisKKyAgaWYgKHNlbGYgIT0gbmlsKSB7CisgICAgX3RyYW5zcG9ydCA9IGFUcmFuc3BvcnQ7CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydAoreworICByZXR1cm4gX3RyYW5zcG9ydDsKK30KKworLShCT09MKSB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6KFVJbnQ4ICopJm4gb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVZhcmludDMyOihVSW50MzIpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggaTMyYnVmWzVdID0gezB9OworICBVSW50MzIgaWR4ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBpMzJidWZbaWR4KytdID0gKFVJbnQ4KSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICBuID4+PSA3OworICAgIH0KKyAgfQorCisgIGlmICghW190cmFuc3BvcnQgd3JpdGU6aTMyYnVmIG9mZnNldDowIGxlbmd0aDppZHggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIik7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpbWVzc2FnZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6Q09NUEFDVF9QUk9UT0NPTF9JRCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KFVJbnQ4KSgoQ09NUEFDVF9WRVJTSU9OICYgQ09NUEFDVF9WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgoVUludDMyKW1lc3NhZ2VUeXBlKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSkgZXJyb3I6ZXJyb3JdKQorICB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIGlmICghW3NlbGYgd3JpdGVTdHJpbmc6bmFtZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZTsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlU3RydWN0QmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2xhc3RGaWVsZCBhZGRPYmplY3Q6QChfbGFzdEZpZWxkSWQpXTsKKyAgX2xhc3RGaWVsZElkID0gMDsKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cnVjdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgX2xhc3RGaWVsZElkID0gW19sYXN0RmllbGQubGFzdE9iamVjdCBzaG9ydFZhbHVlXTsKKyAgW19sYXN0RmllbGQgcmVtb3ZlTGFzdE9iamVjdF07CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKWZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmIChmaWVsZFR5cGUgPT0gVFR5cGVCT09MKSB7CisgICAgX2Jvb2xGaWVsZE5hbWUgPSBbbmFtZSBjb3B5XTsKKyAgICBfYm9vbEZpZWxkVHlwZSA9IEAoZmllbGRUeXBlKTsKKyAgICBfYm9vbEZpZWxkSWQgPSBAKGZpZWxkSUQpOworICAgIHJldHVybiBZRVM7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFtzZWxmIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOmZpZWxkVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZToweEZGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworICB9Cit9CisKKy0oQk9PTCkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxXaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMilmaWVsZFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyKWZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVPdmVycmlkZTooVUludDgpdHlwZU92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmZpZWxkVHlwZV0gOiB0eXBlT3ZlcnJpZGU7CisKKyAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElEID4gX2xhc3RGaWVsZElkICYmIGZpZWxkSUQgLSBfbGFzdEZpZWxkSWQgPD0gMTUpIHsKKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6KGZpZWxkSUQgLSBfbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnR5cGVUb1dyaXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpZiAoIVtzZWxmIHdyaXRlSTE2OmZpZWxkSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisKKyAgX2xhc3RGaWVsZElkID0gZmllbGRJRDsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OlRDVHlwZV9TVE9QIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1hcEJlZ2luV2l0aEtleVR5cGU6KFNJbnQzMilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZTooU0ludDMyKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgaWYgKHNpemUgPT0gMCkgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OjAgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGVsc2UgeworICAgIGlmICghW3NlbGYgd3JpdGVWYXJpbnQzMjooVUludDMyKXNpemUgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OltzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6a2V5VHlwZV0gPDwgNCB8IFtzZWxmIGNvbXBhY3RUeXBlRm9yVFR5cGU6dmFsdWVUeXBlXSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOmVsZW1lbnRUeXBlIHNpemU6c2l6ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZUNvbGxlY3Rpb25CZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCliIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBCT09MIHJlc3VsdDsKKyAgaWYgKF9ib29sRmllbGRJZCAhPSBuaWwgJiYgX2Jvb2xGaWVsZE5hbWUgIT0gbmlsICYmIF9ib29sRmllbGRUeXBlICE9IG5pbCkgeworICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgIHJlc3VsdCA9IFtzZWxmIHdyaXRlRmllbGRCZWdpbkludGVybmFsV2l0aE5hbWU6X2Jvb2xGaWVsZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOl9ib29sRmllbGRUeXBlLmludFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDpfYm9vbEZpZWxkSWQuaW50VmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOmIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKKyAgICBfYm9vbEZpZWxkSWQgPSBuaWw7CisgICAgX2Jvb2xGaWVsZE5hbWUgPSBuaWw7CisgICAgX2Jvb2xGaWVsZFR5cGUgPSBuaWw7CisgIH0KKyAgZWxzZSB7CisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgcmVzdWx0ID0gW3NlbGYgd3JpdGVCeXRlRGlyZWN0OmIgPyBUQ1R5cGVfQk9PTEVBTl9UUlVFIDogVENUeXBlX0JPT0xFQU5fRkFMU0UgZXJyb3I6ZXJyb3JdOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy0oQk9PTCkgd3JpdGVCeXRlOihVSW50OCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQnl0ZURpcmVjdDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVJMTY6KFNJbnQxNil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlVmFyaW50MzI6W3NlbGYgaTMyVG9aaWdaYWc6dmFsdWVdIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgd3JpdGVWYXJpbnQzMjpbc2VsZiBpMzJUb1ppZ1phZzp2YWx1ZV0gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlSTY0OihTSW50NjQpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbc2VsZiB3cml0ZVZhcmludDY0OltzZWxmIGk2NFRvWmlnWmFnOnZhbHVlXSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVEb3VibGU6KGRvdWJsZSl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgLy8gU2FmZSBiaXQtY2FzdGluZyBkb3VibGUtPnVpbnQ2NAorCisgIFVJbnQ2NCBiaXRzID0gMDsKKyAgbWVtY3B5KCZiaXRzLCAmdmFsdWUsIDgpOworCisgIGJpdHMgPSBPU1N3YXBIb3N0VG9MaXR0bGVJbnQ2NChiaXRzKTsKKworICBpZiAoIVtfdHJhbnNwb3J0IHdyaXRlOihVSW50OCAqKSZiaXRzIG9mZnNldDowIGxlbmd0aDo4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVN0cmluZzooTlNTdHJpbmcgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtzZWxmIHdyaXRlQmluYXJ5Olt2YWx1ZSBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ10gZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtzZWxmIHdyaXRlVmFyaW50MzI6KFVJbnQzMilkYXRhLmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpkYXRhLmJ5dGVzIG9mZnNldDowIGxlbmd0aDooVUludDMyKWRhdGEubGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBfY3VycmVudE1lc3NhZ2VOYW1lID0gbmlsOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHdyaXRlQ29sbGVjdGlvbkJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBjdHlwZUVsZW1lbnQgPSBbc2VsZiBjb21wYWN0VHlwZUZvclRUeXBlOmVsZW1lbnRUeXBlXTsKKworICBpZiAoc2l6ZSA8PSAxNCkgeworICAgIGlmICghW3NlbGYgd3JpdGVCeXRlRGlyZWN0OnNpemUgPDwgNCB8IGN0eXBlRWxlbWVudCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgaWYgKCFbc2VsZiB3cml0ZUJ5dGVEaXJlY3Q6MHhmMCB8IGN0eXBlRWxlbWVudCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgICAgaWYgKCFbc2VsZiB3cml0ZVZhcmludDMyOihVSW50MzIpc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZVZhcmludDY0OihVSW50NjQpbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggdmFyaW50NjRvdXRbMTBdID0gezB9OworICBpbnQgaWR4ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGTCkgPT0gMCkgeworICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKFVJbnQ4KW47CisgICAgICBicmVhazsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoVUludDgpKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPj49IDc7CisgICAgfQorICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTp2YXJpbnQ2NG91dCBvZmZzZXQ6MCBsZW5ndGg6aWR4IGVycm9yOmVycm9yXSkgeworICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShVSW50MzIpIGkzMlRvWmlnWmFnOihTSW50MzIpbgoreworICAvKgorICAgICBaaWdaYWcgZW5jb2RpbmcgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQgaW50ZWdlcnMgc28gdGhhdAorICAgICBudW1iZXJzIHdpdGggYSBzbWFsbCBhYnNvbHV0ZSB2YWx1ZSAoZm9yIGluc3RhbmNlLCAtMSkgaGF2ZQorICAgICBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgICAgInppZy16YWdzIiBiYWNrIGFuZCBmb3J0aCB0aHJvdWdoIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW50ZWdlcnMsCisgICAgIHNvIHRoYXQgLTEgaXMgZW5jb2RlZCBhcyAxLCAxIGlzIGVuY29kZWQgYXMgMiwgLTIgaXMgZW5jb2RlZCBhcyAzLCBhbmQgc28KKyAgICAgICAgIG9uCisgICAqLworICByZXR1cm4gKFVJbnQzMikobiA8PCAxKSBeIChVSW50MzIpKG4gPj4gMzEpOworfQorCistKFVJbnQ2NCkgaTY0VG9aaWdaYWc6KFNJbnQ2NCluCit7CisgIHJldHVybiAoVUludDY0KShuIDw8IDEpIF4gKFVJbnQ2NCkobiA+PiA2Myk7Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKXBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilwdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopcHNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ4IHByb3RvY29sSWQ7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnByb3RvY29sSWQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHByb3RvY29sSWQgIT0gQ09NUEFDVF9QUk9UT0NPTF9JRCkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXk6IEAoVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc21hdGNoZWRQcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvckV4cGVjdGVkSWRLZXk6IEAoQ09NUEFDVF9QUk9UT0NPTF9JRCl9XTsKKyAgICB9CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmVyc2lvbkFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnZlcnNpb25BbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHZlcnNpb24gPSB2ZXJzaW9uQW5kVHlwZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLOworICBpZiAodmVyc2lvbiAhPSBDT01QQUNUX1ZFUlNJT04pIHsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUUHJvdG9jb2xFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRQcm90b2NvbEVycm9yQmFkVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXk6IEAoQ09NUEFDVF9WRVJTSU9OKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBpbnQgdHlwZSA9ICh2ZXJzaW9uQW5kVHlwZSA+PiBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9CSVRTOworICBVSW50MzIgc2VxdWVuY2VJRDsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnNlcXVlbmNlSUQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisgIE5TU3RyaW5nICpuYW1lOworICBpZiAoIVtzZWxmIHJlYWRTdHJpbmc6Jm5hbWUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHB0eXBlICE9IE5VTEwpIHsKKyAgICAqcHR5cGUgPSB0eXBlOworICB9CisgIGlmIChwc2VxdWVuY2VJRCAhPSBOVUxMKSB7CisgICAgKnBzZXF1ZW5jZUlEID0gc2VxdWVuY2VJRDsKKyAgfQorICBpZiAocG5hbWUgIT0gTlVMTCkgeworICAgICpwbmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKilwbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19sYXN0RmllbGQgYWRkT2JqZWN0OkAoX2xhc3RGaWVsZElkKV07CisgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBAIiI7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIF9sYXN0RmllbGRJZCA9IFtfbGFzdEZpZWxkLmxhc3RPYmplY3Qgc2hvcnRWYWx1ZV07CisgIFtfbGFzdEZpZWxkIHJlbW92ZUxhc3RPYmplY3RdOworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRGaWVsZEJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopcG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIgKilwZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopcGZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50OCBieXRlOworICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQ4IHR5cGUgPSBieXRlICYgMHgwZjsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmICh0eXBlID09IFRDVHlwZV9TVE9QKSB7CisgICAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAgICpwbmFtZSA9IEAiIjsKKyAgICB9CisgICAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgeworICAgICAgKnBmaWVsZFR5cGUgPSBUVHlwZVNUT1A7CisgICAgfQorICAgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CisgICAgICAqcGZpZWxkSUQgPSAwOworICAgIH0KKyAgICByZXR1cm4gWUVTOworICB9CisKKyAgc2hvcnQgZmllbGRJZCA9IDA7CisKKyAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICBzaG9ydCBtb2RpZmllciA9IChieXRlICYgMHhmMCkgPj4gNDsKKyAgaWYgKG1vZGlmaWVyID09IDApIHsKKyAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgaWYgKCFbc2VsZiByZWFkSTE2OiZmaWVsZElkIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBlbHNlIHsKKyAgICAvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgIGZpZWxkSWQgPSBfbGFzdEZpZWxkSWQgKyBtb2RpZmllcjsKKyAgfQorCisgIFVJbnQ4IGZpZWxkVHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZmllbGRUeXBlIGZvckNvbXBhY3RUeXBlOnR5cGUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHBuYW1lICE9IE5VTEwpIHsKKyAgICAqcG5hbWUgPSBAIiI7CisgIH0KKyAgaWYgKHBmaWVsZFR5cGUgIT0gTlVMTCkgeworICAgICpwZmllbGRUeXBlID0gZmllbGRUeXBlOworICB9CisgIGlmIChwZmllbGRJRCAhPSBOVUxMKSB7CisgICAgKnBmaWVsZElEID0gZmllbGRJZDsKKyAgfQorCisgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDVHlwZV9CT09MRUFOX1RSVUUgfHwKKyAgICAgIHR5cGUgPT0gVENUeXBlX0JPT0xFQU5fRkFMU0UpCisgIHsKKyAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICBfYm9vbGVhblZhbHVlID0gW05TTnVtYmVyIG51bWJlcldpdGhCb29sOnR5cGUgPT0gVENUeXBlX0JPT0xFQU5fVFJVRV07CisgIH0KKworICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgX2xhc3RGaWVsZElkID0gZmllbGRJZDsKKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6KFNJbnQzMiAqKXBrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KFNJbnQzMiAqKXB2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopcHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDgga2V5QW5kVmFsdWVUeXBlID0gMDsKKyAgVUludDMyIHNpemU7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgaWYgKCFbc2VsZiByZWFkQnl0ZToma2V5QW5kVmFsdWVUeXBlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorCisgIFVJbnQ4IGtleVR5cGU7CisgIGlmICghW3NlbGYgdHR5cGU6JmtleVR5cGUgZm9yQ29tcGFjdFR5cGU6a2V5QW5kVmFsdWVUeXBlID4+IDQgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgVUludDggdmFsdWVUeXBlOworICBpZiAoIVtzZWxmIHR0eXBlOiZ2YWx1ZVR5cGUgZm9yQ29tcGFjdFR5cGU6a2V5QW5kVmFsdWVUeXBlICYgMHhmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwa2V5VHlwZSAhPSBOVUxMKSB7CisgICAgKnBrZXlUeXBlID0ga2V5VHlwZTsKKyAgfQorICBpZiAocHZhbHVlVHlwZSAhPSBOVUxMKSB7CisgICAgKnB2YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisgIH0KKyAgaWYgKHBzaXplICE9IE5VTEwpIHsKKyAgICAqcHNpemUgPSBzaXplOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6KFNJbnQzMiAqKXBlbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDggc2l6ZUFuZFR5cGU7CisgIGlmICghW3NlbGYgcmVhZEJ5dGU6JnNpemVBbmRUeXBlIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFVJbnQzMiBzaXplID0gKHNpemVBbmRUeXBlID4+IDQpICYgMHgwZjsKKyAgaWYgKHNpemUgPT0gMTUpIHsKKyAgICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKworICBVSW50OCBlbGVtZW50VHlwZTsKKyAgaWYgKCFbc2VsZiB0dHlwZTomZWxlbWVudFR5cGUgZm9yQ29tcGFjdFR5cGU6c2l6ZUFuZFR5cGUgJiAweDBmIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIGlmIChwZWxlbWVudFR5cGUgIT0gTlVMTCkgeworICAgICpwZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgfQorICBpZiAocHNpemUgIT0gTlVMTCkgeworICAgICpwc2l6ZSA9IHNpemU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihTSW50MzIgKilwZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW3NlbGYgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOnBlbGVtZW50VHlwZSBzaXplOnBzaXplIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSByZWFkQm9vbDooQk9PTCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoX2Jvb2xlYW5WYWx1ZSAhPSBuaWwpIHsKKworICAgIEJPT0wgcmVzdWx0ID0gX2Jvb2xlYW5WYWx1ZS5ib29sVmFsdWU7CisgICAgX2Jvb2xlYW5WYWx1ZSA9IG5pbDsKKworICAgICp2YWx1ZSA9IHJlc3VsdDsKKyAgfQorICBlbHNlIHsKKworICAgIFVJbnQ4IHJlc3VsdDsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZyZXN1bHQgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorCisgICAgKnZhbHVlID0gcmVzdWx0ID09IFRDVHlwZV9CT09MRUFOX1RSVUU7CisgIH0KKworICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRCeXRlOihVSW50OCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6dmFsdWUgb2Zmc2V0OjAgbGVuZ3RoOjEgZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gWUVTOworfQorCistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgdjsKKyAgaWYgKCFbc2VsZiByZWFkVmFyaW50MzI6JnYgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gKFNJbnQxNilbc2VsZiB6aWdaYWdUb2kzMjp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEkzMjooU0ludDMyICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSBbc2VsZiB6aWdaYWdUb2kzMjp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ2NCB2OworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQ2NDomdiBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBpZiAodmFsdWUpIHsKKyAgICAqdmFsdWUgPSBbc2VsZiB6aWdaYWdUb2k2NDp2XTsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgcmVhZERvdWJsZTooZG91YmxlICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQ2NCBiaXRzOworICBpZiAoIVtfdHJhbnNwb3J0IHJlYWRBbGw6KFVJbnQ4ICopJmJpdHMgb2Zmc2V0OjAgbGVuZ3RoOjggZXJyb3I6ZXJyb3JdKSB7CisgICAgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SKE5PLCBlcnJvciwgQCJUcmFuc3BvcnQgcmVhZCBmYWlsZWQiKTsKKyAgfQorCisgIGJpdHMgPSBPU1N3YXBMaXR0bGVUb0hvc3RJbnQ2NChiaXRzKTsKKworICBpZiAodmFsdWUpIHsKKyAgICBtZW1jcHkodmFsdWUsICZiaXRzLCBzaXplb2YoYml0cykpOworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBsZW5ndGg7CisgIGlmICghW3NlbGYgcmVhZFZhcmludDMyOiZsZW5ndGggZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgTlNTdHJpbmcgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TRGF0YSAqZGF0YTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCaW5hcnlPZkxlbmd0aDpsZW5ndGggZGF0YTomZGF0YSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICByZXN1bHQgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107CisgIH0KKyAgZWxzZSB7CisgICAgcmVzdWx0ID0gQCIiOworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkQmluYXJ5OihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgbGVuZ3RoOworICBpZiAoIVtzZWxmIHJlYWRWYXJpbnQzMjombGVuZ3RoIGVycm9yOmVycm9yXSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBbc2VsZiByZWFkQmluYXJ5T2ZMZW5ndGg6bGVuZ3RoIGRhdGE6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCaW5hcnlPZkxlbmd0aDooVUludDMyKWxlbmd0aCBkYXRhOihOU0RhdGEgKl9fYXV0b3JlbGVhc2luZyAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBOU0RhdGEgKnJlc3VsdDsKKworICBpZiAobGVuZ3RoICE9IDApIHsKKworICAgIE5TTXV0YWJsZURhdGEgKmJ1ZiA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOmxlbmd0aF07CisgICAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOmJ1Zi5tdXRhYmxlQnl0ZXMgb2Zmc2V0OjAgbGVuZ3RoOmxlbmd0aCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIFBST1RPQ09MX1RSQU5TUE9SVF9FUlJPUihOTywgZXJyb3IsIEAiVHJhbnNwb3J0IHJlYWQgZmFpbGVkIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gYnVmOworICB9CisgIGVsc2UgeworCisgICAgcmVzdWx0ID0gW05TRGF0YSBkYXRhXTsKKworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZEZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gWUVTOworfQorLShCT09MKSByZWFkTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKy0oQk9PTCkgcmVhZFNldEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50MzI6KFVJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgcmVzdWx0ID0gMDsKKyAgaW50IHNoaWZ0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDMyKShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGlmdCArPSA3OworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkVmFyaW50NjQ6KFVJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBpbnQgc2hpZnQgPSAwOworICBVSW50NjQgcmVzdWx0ID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworCisgICAgVUludDggYnl0ZTsKKyAgICBpZiAoIVtzZWxmIHJlYWRCeXRlOiZieXRlIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIHJlc3VsdCB8PSAoVUludDY0KShieXRlICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzaGlmdCArPSA3OworICB9CisKKyAgaWYgKHZhbHVlKSB7CisgICAgKnZhbHVlID0gcmVzdWx0OworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShTSW50MzIpIHppZ1phZ1RvaTMyOihVSW50MzIpbgoreworICByZXR1cm4gKFNJbnQzMikobiA+PiAxKSBeICgtKFNJbnQzMikobiAmIDEpKTsKK30KKworLShTSW50NjQpIHppZ1phZ1RvaTY0OihVSW50NjQpbgoreworICByZXR1cm4gKFNJbnQ2NCkobiA+PiAxKSBeICgtKFNJbnQ2NCkobiAmIDEpKTsKK30KKworLShCT09MKSB0dHlwZTooVUludDggKil0dHlwZSBmb3JDb21wYWN0VHlwZTooVUludDgpY3R5cGUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHN3aXRjaCAoY3R5cGUgJiAweDBmKSB7CisgIGNhc2UgVENUeXBlX1NUT1A6CisgICAgKnR0eXBlID0gVFR5cGVTVE9QOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9GQUxTRToKKyAgY2FzZSBUQ1R5cGVfQk9PTEVBTl9UUlVFOgorICAgICp0dHlwZSA9IFRUeXBlQk9PTDsKKyAgICByZXR1cm4gWUVTOworCisgIGNhc2UgVENUeXBlX0JZVEU6CisgICAgKnR0eXBlID0gVFR5cGVCWVRFOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTE2OgorICAgICp0dHlwZSA9IFRUeXBlSTE2OworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTMyOgorICAgICp0dHlwZSA9IFRUeXBlSTMyOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfSTY0OgorICAgICp0dHlwZSA9IFRUeXBlSTY0OworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfRE9VQkxFOgorICAgICp0dHlwZSA9IFRUeXBlRE9VQkxFOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfQklOQVJZOgorICAgICp0dHlwZSA9IFRUeXBlU1RSSU5HOworICAgIHJldHVybiBZRVM7CisKKyAgY2FzZSBUQ1R5cGVfTElTVDoKKyAgICAqdHR5cGUgPSBUVHlwZUxJU1Q7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9TRVQ6CisgICAgKnR0eXBlID0gVFR5cGVTRVQ7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9NQVA6CisgICAgKnR0eXBlID0gVFR5cGVNQVA7CisgICAgcmV0dXJuIFlFUzsKKworICBjYXNlIFRDVHlwZV9TVFJVQ1Q6CisgICAgKnR0eXBlID0gVFR5cGVTVFJVQ1Q7CisgICAgcmV0dXJuIFlFUzsKKworICBkZWZhdWx0OgorICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUUHJvdG9jb2xFcnJvclR5cGVLZXk6IEAoKFVJbnQ4KShjdHlwZSAmIDB4MEYpKX1dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KK30KKworLShVSW50OCkgY29tcGFjdFR5cGVGb3JUVHlwZTooVUludDgpdHR5cGUKK3sKKyAgc3RhdGljIFVJbnQ4IHR0eXBlVG9Db21wYWN0VHlwZVtdID0geworICAgIFtUVHlwZVNUT1BdID0gVENUeXBlX1NUT1AsCisgICAgW1RUeXBlQk9PTF0gPSBUQ1R5cGVfQk9PTEVBTl9GQUxTRSwKKyAgICBbVFR5cGVCWVRFXSA9IFRDVHlwZV9CWVRFLAorICAgIFtUVHlwZURPVUJMRV0gPSBUQ1R5cGVfRE9VQkxFLAorICAgIFtUVHlwZUkxNl0gPSBUQ1R5cGVfSTE2LAorICAgIFtUVHlwZUkzMl0gPSBUQ1R5cGVfSTMyLAorICAgIFtUVHlwZUk2NF0gPSBUQ1R5cGVfSTY0LAorICAgIFtUVHlwZVNUUklOR10gPSBUQ1R5cGVfQklOQVJZLAorICAgIFtUVHlwZVNUUlVDVF0gPSBUQ1R5cGVfU1RSVUNULAorICAgIFtUVHlwZU1BUF0gPSBUQ1R5cGVfTUFQLAorICAgIFtUVHlwZVNFVF0gPSBUQ1R5cGVfU0VULAorICAgIFtUVHlwZUxJU1RdID0gVENUeXBlX0xJU1QKKyAgfTsKKworICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlW3R0eXBlXTsKK30KKworQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Y2UzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2ltcG9ydCAiVFByb3RvY29sRGVjb3JhdG9yLmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworZXh0ZXJuIE5TU3RyaW5nICpUTXVsdGlwbGV4ZWRQcm90b2NvbFNlcGVyYXRvcjsKKworCitAaW50ZXJmYWNlIFRNdWx0aXBsZXhlZFByb3RvY29sIDogVFByb3RvY29sRGVjb3JhdG9yCisKKy0oaWQpIGluaXRXaXRoUHJvdG9jb2w6KGlkIDxUUHJvdG9jb2w+KXByb3RvY29sCisgICAgICAgICAgIHNlcnZpY2VOYW1lOihOU1N0cmluZyAqKW5hbWU7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzOGM1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wubQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRNdWx0aXBsZXhlZFByb3RvY29sLmgiCisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitOU1N0cmluZyAqVE11bHRpcGxleGVkUHJvdG9jb2xTZXBlcmF0b3IgPSBAIjoiOworCisKK0BpbnRlcmZhY2UgVE11bHRpcGxleGVkUHJvdG9jb2wgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc2VydmljZU5hbWU7CisKK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVE11bHRpcGxleGVkUHJvdG9jb2wKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKKyAgICAgICAgICAgc2VydmljZU5hbWU6KE5TU3RyaW5nICopbmFtZQoreworICBzZWxmID0gW3N1cGVyIGluaXRXaXRoUHJvdG9jb2w6cHJvdG9jb2xdOworICBpZiAoc2VsZikgeworICAgIF9zZXJ2aWNlTmFtZSA9IG5hbWU7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBzd2l0Y2ggKG1lc3NhZ2VUeXBlKSB7CisgIGNhc2UgVE1lc3NhZ2VUeXBlQ0FMTDoKKyAgY2FzZSBUTWVzc2FnZVR5cGVPTkVXQVk6IHsKKyAgICBOU011dGFibGVTdHJpbmcgKnNlcnZpY2VGdW5jdGlvbiA9IFtbTlNNdXRhYmxlU3RyaW5nIGFsbG9jXSBpbml0V2l0aFN0cmluZzpfc2VydmljZU5hbWVdOworICAgIFtzZXJ2aWNlRnVuY3Rpb24gYXBwZW5kU3RyaW5nOlRNdWx0aXBsZXhlZFByb3RvY29sU2VwZXJhdG9yXTsKKyAgICBbc2VydmljZUZ1bmN0aW9uIGFwcGVuZFN0cmluZzpuYW1lXTsKKyAgICByZXR1cm4gW3N1cGVyIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6c2VydmljZUZ1bmN0aW9uIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXTsKKyAgfQorICBicmVhazsKKworICBkZWZhdWx0OgorICAgIHJldHVybiBbc3VwZXIgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lIHR5cGU6bWVzc2FnZVR5cGUgc2VxdWVuY2VJRDpzZXF1ZW5jZUlEIGVycm9yOmVycm9yXTsKKyAgfQorfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2wuaAppbmRleCAyODEyMzlkLi44NDEwNTlmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLmgKQEAgLTIyLDEyNyArMjIsMTQzIEBACiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKIAotZW51bSB7Ci0gIFRNZXNzYWdlVHlwZV9DQUxMID0gMSwKLSAgVE1lc3NhZ2VUeXBlX1JFUExZID0gMiwKLSAgVE1lc3NhZ2VUeXBlX0VYQ0VQVElPTiA9IDMsCi0gIFRNZXNzYWdlVHlwZV9PTkVXQVkgPSA0CitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUTWVzc2FnZVR5cGUpIHsKKyAgVE1lc3NhZ2VUeXBlQ0FMTCA9IDEsCisgIFRNZXNzYWdlVHlwZVJFUExZID0gMiwKKyAgVE1lc3NhZ2VUeXBlRVhDRVBUSU9OID0gMywKKyAgVE1lc3NhZ2VUeXBlT05FV0FZID0gNAogfTsKIAotZW51bSB7Ci0gIFRUeXBlX1NUT1AgICA9IDAsCi0gIFRUeXBlX1ZPSUQgICA9IDEsCi0gIFRUeXBlX0JPT0wgICA9IDIsCi0gIFRUeXBlX0JZVEUgICA9IDMsCi0gIFRUeXBlX0RPVUJMRSA9IDQsCi0gIFRUeXBlX0kxNiAgICA9IDYsCi0gIFRUeXBlX0kzMiAgICA9IDgsCi0gIFRUeXBlX0k2NCAgICA9IDEwLAotICBUVHlwZV9TVFJJTkcgPSAxMSwKLSAgVFR5cGVfU1RSVUNUID0gMTIsCi0gIFRUeXBlX01BUCAgICA9IDEzLAotICBUVHlwZV9TRVQgICAgPSAxNCwKLSAgVFR5cGVfTElTVCAgID0gMTUKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUVHlwZSkgeworICBUVHlwZVNUT1AgICA9IDAsCisgIFRUeXBlVk9JRCAgID0gMSwKKyAgVFR5cGVCT09MICAgPSAyLAorICBUVHlwZUJZVEUgICA9IDMsCisgIFRUeXBlRE9VQkxFID0gNCwKKyAgVFR5cGVJMTYgICAgPSA2LAorICBUVHlwZUkzMiAgICA9IDgsCisgIFRUeXBlSTY0ICAgID0gMTAsCisgIFRUeXBlU1RSSU5HID0gMTEsCisgIFRUeXBlU1RSVUNUID0gMTIsCisgIFRUeXBlTUFQICAgID0gMTMsCisgIFRUeXBlU0VUICAgID0gMTQsCisgIFRUeXBlTElTVCAgID0gMTUKIH07CiAKIAogQHByb3RvY29sIFRQcm90b2NvbCA8TlNPYmplY3Q+CiAKLS0gKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworLShpZCA8VFRyYW5zcG9ydD4pIHRyYW5zcG9ydDsKIAotLSAodm9pZCkgcmVhZE1lc3NhZ2VCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IChpbnQgKikgdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IChpbnQgKikgc2VxdWVuY2VJRDsKLS0gKHZvaWQpIHJlYWRNZXNzYWdlRW5kOworLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKl9fbnVsbGFibGUgX19hdXRvcmVsZWFzaW5nICpfX251bGxhYmxlKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KG51bGxhYmxlIFNJbnQzMiAqKXNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTWVzc2FnZUVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IChOU1N0cmluZyAqKikgbmFtZTsKLS0gKHZvaWQpIHJlYWRTdHJ1Y3RFbmQ7CistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX251bGxhYmxlIF9fYXV0b3JlbGVhc2luZyAqX19udWxsYWJsZSluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOiAoTlNTdHJpbmcgKiopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogKGludCAqKSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogKGludCAqKSBmaWVsZElEOwotLSAodm9pZCkgcmVhZEZpZWxkRW5kOworLShCT09MKSByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICpfX251bGxhYmxlIF9fYXV0b3JlbGVhc2luZyAqX19udWxsYWJsZSluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDoobnVsbGFibGUgU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChOU1N0cmluZyAqKSByZWFkU3RyaW5nOworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19ub25udWxsIF9fYXV0b3JlbGVhc2luZyAqX19ub25udWxsKXZhbHVlIGVycm9yOihOU0Vycm9yICoqKWVycm9yOwogCi0tIChCT09MKSByZWFkQm9vbDsKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHVuc2lnbmVkIGNoYXIpIHJlYWRCeXRlOworLShCT09MKSByZWFkQnl0ZTooVUludDggKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHNob3J0KSByZWFkSTE2OworLShCT09MKSByZWFkSTE2OihTSW50MTYgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKGludDMyX3QpIHJlYWRJMzI7CistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoaW50NjRfdCkgcmVhZEk2NDsKKy0oQk9PTCkgcmVhZEk2NDooU0ludDY0ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tIChkb3VibGUpIHJlYWREb3VibGU7CistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAoTlNEYXRhICopIHJlYWRCaW5hcnk7CistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19ub25udWxsIF9fYXV0b3JlbGVhc2luZyAqX19ub25udWxsKXZhbHVlIGVycm9yOihOU0Vycm9yICoqKWVycm9yOwogCi0tICh2b2lkKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAoaW50ICopIGtleVR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQgKikgdmFsdWVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemU7Ci0tICh2b2lkKSByZWFkTWFwRW5kOworLShCT09MKSByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOihudWxsYWJsZSBTSW50MzIgKilrZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6KG51bGxhYmxlIFNJbnQzMiAqKXZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOworLShCT09MKSByZWFkTWFwRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAogCi0tICh2b2lkKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQgKikgc2l6ZTsKLS0gKHZvaWQpIHJlYWRTZXRFbmQ7CistKEJPT0wpIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihudWxsYWJsZSBTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CistKEJPT0wpIHJlYWRTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTogKGludCAqKSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50ICopIHNpemU7Ci0tICh2b2lkKSByZWFkTGlzdEVuZDsKKy0oQk9PTCkgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOihudWxsYWJsZSBTSW50MzIgKillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgcmVhZExpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWU6IChOU1N0cmluZyAqKSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBtZXNzYWdlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogKGludCkgc2VxdWVuY2VJRDsKLS0gKHZvaWQpIHdyaXRlTWVzc2FnZUVuZDsKKy0oQk9PTCkgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6KFNJbnQzMiltZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOihTSW50MzIpc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgd3JpdGVNZXNzYWdlRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lOiAoTlNTdHJpbmcgKikgbmFtZTsKLS0gKHZvaWQpIHdyaXRlU3RydWN0RW5kOworLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKy0oQk9PTCkgd3JpdGVTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTogKE5TU3RyaW5nICopIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAoaW50KSBmaWVsZFR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOiAoaW50KSBmaWVsZElEOworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlSTMyOiAoaW50MzJfdCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTMyOihTSW50MzIpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUk2NDogKGludDY0X3QpIHZhbHVlOworLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVJMTY6IChzaG9ydCkgdmFsdWU7CistKEJPT0wpIHdyaXRlSTE2OihzaG9ydCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CiAKLS0gKHZvaWQpIHdyaXRlQnl0ZTogKHVpbnQ4X3QpIHZhbHVlOworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVTdHJpbmc6IChOU1N0cmluZyAqKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZURvdWJsZTogKGRvdWJsZSkgdmFsdWU7CistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUJvb2w6IChCT09MKSB2YWx1ZTsKKy0oQk9PTCkgd3JpdGVCb29sOihCT09MKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVCaW5hcnk6IChOU0RhdGEgKikgZGF0YTsKKy0oQk9PTCkgd3JpdGVCaW5hcnk6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUZpZWxkU3RvcDsKKy0oQk9PTCkgd3JpdGVGaWVsZFN0b3A6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZUZpZWxkRW5kOworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVNYXBCZWdpbldpdGhLZXlUeXBlOiAoaW50KSBrZXlUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6IChpbnQpIHZhbHVlVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplOwotLSAodm9pZCkgd3JpdGVNYXBFbmQ7CistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgd3JpdGVNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6IChpbnQpIGVsZW1lbnRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiAoaW50KSBzaXplOwotLSAodm9pZCkgd3JpdGVTZXRFbmQ7CistKEJPT0wpIHdyaXRlU2V0QmVnaW5XaXRoRWxlbWVudFR5cGU6KFNJbnQzMillbGVtZW50VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKy0oQk9PTCkgd3JpdGVTZXRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKLS0gKHZvaWQpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOiAoaW50KSBlbGVtZW50VHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IChpbnQpIHNpemU7CistKEJPT0wpIHdyaXRlTGlzdEJlZ2luV2l0aEVsZW1lbnRUeXBlOihTSW50MzIpZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKIAotLSAodm9pZCkgd3JpdGVMaXN0RW5kOworLShCT09MKSB3cml0ZUxpc3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCiAKIEBlbmQKIAorCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OWI2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisKKyNpbXBvcnQgIlRQcm90b2NvbC5oIgorCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKK0BpbnRlcmZhY2UgVFByb3RvY29sRGVjb3JhdG9yIDogTlNPYmplY3QgPFRQcm90b2NvbD4KKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2w7CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5tIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMThmOTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IubQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJUUHJvdG9jb2xEZWNvcmF0b3IuaCIKKworCitAaW50ZXJmYWNlIFRQcm90b2NvbERlY29yYXRvciAoKQorCitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIGlkPFRQcm90b2NvbD4gY29uY3JldGVQcm90b2NvbDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IKKworLShpZCkgaW5pdFdpdGhQcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfY29uY3JldGVQcm90b2NvbCA9IHByb3RvY29sOworICB9CisgIHJldHVybiBzZWxmOworfQorCistKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0Cit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgdHJhbnNwb3J0XTsKK30KKworLShCT09MKSByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTooTlNTdHJpbmcgKiopbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDooU0ludDMyICopc2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTWVzc2FnZUJlZ2luUmV0dXJuaW5nTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6dHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZUlEOnNlcXVlbmNlSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZE1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1lc3NhZ2VFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6KE5TU3RyaW5nICoqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkU3RydWN0QmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRTdHJ1Y3RFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cnVjdEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOihOU1N0cmluZyAqKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyICopZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDooU0ludDMyICopZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEZpZWxkQmVnaW5SZXR1cm5pbmdOYW1lOm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOmZpZWxkSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSByZWFkRmllbGRFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEZpZWxkRW5kOmVycm9yXTsKK30KKworLShCT09MKSByZWFkU3RyaW5nOihOU1N0cmluZyAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFN0cmluZzp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJvb2w6KEJPT0wgKil2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkQm9vbDp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZEJ5dGU6KFVJbnQ4ICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJ5dGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRJMTY6KFNJbnQxNiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJMTY6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRJMzI6KFNJbnQzMiAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJMzI6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRJNjQ6KFNJbnQ2NCAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRJNjQ6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWREb3VibGU6KGRvdWJsZSAqKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWREb3VibGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRCaW5hcnk6KE5TRGF0YSAqX19hdXRvcmVsZWFzaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZEJpbmFyeTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgcmVhZE1hcEJlZ2luUmV0dXJuaW5nS2V5VHlwZTooU0ludDMyICopa2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIgKil2YWx1ZVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyICopc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6a2V5VHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR5cGU6dmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRNYXBFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZE1hcEVuZDplcnJvcl07Cit9CisKKworLShCT09MKSByZWFkU2V0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMiAqKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgcmVhZFNldEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSByZWFkU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRTZXRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHJlYWRMaXN0QmVnaW5SZXR1cm5pbmdFbGVtZW50VHlwZTooU0ludDMyICopZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIgKilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ZWxlbWVudFR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6c2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHJlYWRMaXN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHJlYWRMaXN0RW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lOihOU1N0cmluZyAqKW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTooU0ludDMyKW1lc3NhZ2VUeXBlCisgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6KFNJbnQzMilzZXF1ZW5jZUlECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTptZXNzYWdlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6c2VxdWVuY2VJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6ZXJyb3JdOworfQorLShCT09MKSB3cml0ZU1lc3NhZ2VFbmQ6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVNZXNzYWdlRW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWU6bmFtZSBlcnJvcjplcnJvcl07Cit9CistKEJPT0wpIHdyaXRlU3RydWN0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU3RydWN0RW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOihTSW50MzIpZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElEOihTSW50MzIpZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUZpZWxkQmVnaW5XaXRoTmFtZTpuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ZmllbGRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkSUQ6ZmllbGRJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkzMjooU0ludDMyKXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlSTMyOnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUk2NDooU0ludDY0KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlSTY0OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUkxNjooU0ludDE2KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlSTE2OnZhbHVlIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUJ5dGU6KFVJbnQ4KXZhbHVlIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlQnl0ZTp2YWx1ZSBlcnJvcjplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTdHJpbmc6KE5TU3RyaW5nICopdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTdHJpbmc6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRG91YmxlOihkb3VibGUpdmFsdWUgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVEb3VibGU6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQm9vbDooQk9PTCl2YWx1ZSBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUJvb2w6dmFsdWUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlQmluYXJ5OihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlQmluYXJ5OmRhdGEgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlRmllbGRTdG9wOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRTdG9wOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUZpZWxkRW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlRmllbGRFbmQ6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTooU0ludDMyKWtleVR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOihTSW50MzIpdmFsdWVUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTooU0ludDMyKXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlTWFwQmVnaW5XaXRoS2V5VHlwZTprZXlUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOnZhbHVlVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTpzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZU1hcEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZU1hcEVuZDplcnJvcl07Cit9CisKKy0oQk9PTCkgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6KFNJbnQzMilzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIHJldHVybiBbX2NvbmNyZXRlUHJvdG9jb2wgd3JpdGVTZXRCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlU2V0RW5kOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICByZXR1cm4gW19jb25jcmV0ZVByb3RvY29sIHdyaXRlU2V0RW5kOmVycm9yXTsKK30KKworLShCT09MKSB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTooU0ludDMyKWVsZW1lbnRUeXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOihTSW50MzIpc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUxpc3RCZWdpbldpdGhFbGVtZW50VHlwZTplbGVtZW50VHlwZSBzaXplOnNpemUgZXJyb3I6ZXJyb3JdOworfQorCistKEJPT0wpIHdyaXRlTGlzdEVuZDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFtfY29uY3JldGVQcm90b2NvbCB3cml0ZUxpc3RFbmQ6ZXJyb3JdOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwYmM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRFcnJvci5oIgorCisKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JEb21haW47CisKK3R5cGVkZWYgTlNfRU5VTSAoaW50LCBUUHJvdG9jb2xFcnJvcikgeworICBUUHJvdG9jb2xFcnJvclVua25vd24gICAgICAgICAgICAgICAgICAgPSAwLAorICBUUHJvdG9jb2xFcnJvckludmFsaWREYXRhICAgICAgICAgICAgICAgPSAxLAorICBUUHJvdG9jb2xFcnJvck5lZ2F0aXZlU2l6ZSAgICAgICAgICAgICAgPSAyLAorICBUUHJvdG9jb2xFcnJvclNpemVMaW1pdCAgICAgICAgICAgICAgICAgPSAzLAorICBUUHJvdG9jb2xFcnJvckJhZFZlcnNpb24gICAgICAgICAgICAgICAgPSA0LAorICBUUHJvdG9jb2xFcnJvck5vdEltcGxlbWVudGVkICAgICAgICAgICAgPSA1LAorICBUUHJvdG9jb2xFcnJvckRlcHRoTGltaXQgICAgICAgICAgICAgICAgPSA2LAorfTsKKworCit0eXBlZGVmIE5TX0VOVU0oaW50LCBUUHJvdG9jb2xFeHRlbmRlZEVycm9yKSB7CisgIFRQcm90b2NvbEV4dGVuZGVkRXJyb3JNaXNzaW5nUmVxdWlyZWRGaWVsZCAgPSAxMDAxLAorICBUUHJvdG9jb2xFeHRlbmRlZEVycm9yVW5leHBlY3RlZFR5cGUgICAgICAgID0gMTAwMiwKKyAgVFByb3RvY29sRXh0ZW5kZWRFcnJvck1pc21hdGNoZWRQcm90b2NvbCAgICA9IDEwMDMsCit9OworCitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXh0ZW5kZWRFcnJvcktleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JGaWVsZE5hbWVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRXhwZWN0ZWRJZEtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZFZlcnNpb25LZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yVHlwZUtleTsKK2V4dGVybiBOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VMaW5lS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZUZpbGVLZXk7CitleHRlcm4gTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTWV0aG9kS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUUHJvdG9jb2xFcnJvck1lc3NhZ2VOYW1lS2V5OworCisKKyNkZWZpbmUgUFJPVE9DT0xfRVJST1IocmV0LCBlcnIsIC4uLikgXAorICBpZiAoZXJyb3IpIHsgIFwKKyAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFByb3RvY29sRXJyb3JEb21haW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUUHJvdG9jb2xFcnJvciAjIyBlcnIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe05TTG9jYWxpemVkRGVzY3JpcHRpb25LZXk6IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0Ol9fVkFfQVJHU19fXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiU291cmNlRmlsZSI6IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpfX0ZJTEVfX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlNvdXJjZUxpbmUiOiBAKF9fTElORV9fKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAiU291cmNlRnVuY3Rpb24iOiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19QUkVUVFlfRlVOQ1RJT05fX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIk1lc3NhZ2UiOiBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA/IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lIDogQCIifV07IFwKKyAgfSBcCisgIHJldHVybiByZXQKKworI2RlZmluZSBQUk9UT0NPTF9UUkFOU1BPUlRfRVJST1IocmV0LCBlcnJvclB0ciwgLi4uKSBcCisgIGlmIChlcnJvclB0cikgeyBcCisgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRQcm90b2NvbEVycm9yRG9tYWluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFByb3RvY29sRXJyb3JVbmtub3duIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtOU0xvY2FsaXplZERlc2NyaXB0aW9uS2V5OiBbW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6X19WQV9BUkdTX19dIHN0cmluZ0J5QXBwZW5kaW5nRm9ybWF0OkAiOiAlQCIsIFsoKmVycm9yUHRyKSBsb2NhbGl6ZWREZXNjcmlwdGlvbl1dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19GSUxFX19dLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXJyb3JTb3VyY2VMaW5lS2V5OiBAKF9fTElORV9fKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEVycm9yU291cmNlTWV0aG9kS2V5OiBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6X19QUkVUVFlfRlVOQ1RJT05fX10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFcnJvck1lc3NhZ2VOYW1lS2V5OiBzZWxmLmN1cnJlbnRNZXNzYWdlTmFtZSA/IHNlbGYuY3VycmVudE1lc3NhZ2VOYW1lIDogQCIiLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNVbmRlcmx5aW5nRXJyb3JLZXk6ICplcnJvclB0cn1dOyBcCisgIH0gXAorICByZXR1cm4gcmV0CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzNjczYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXJyb3IubQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRQcm90b2NvbEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRG9tYWluID0gQCJUUHJvdG9jb2xFcnJvckRvbWFpbiI7CisKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4dGVuZGVkRXJyb3JLZXkgPSBAImV4dGVuZGVkRXJyb3IiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yRmllbGROYW1lS2V5ID0gQCJmaWVsZCI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JFeHBlY3RlZElkS2V5ID0gQCJleHBlY3RlZElkIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvckV4cGVjdGVkVmVyc2lvbktleSA9IEAiZXhwZWN0ZWRWZXJzaW9uIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclR5cGVLZXkgPSBAInR5cGUiOworTlNTdHJpbmcgKlRQcm90b2NvbEVycm9yU291cmNlTGluZUtleSA9IEAic291cmNlTGluZSI7CitOU1N0cmluZyAqVFByb3RvY29sRXJyb3JTb3VyY2VGaWxlS2V5ID0gQCJzb3VyY2VGaWxlIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvclNvdXJjZU1ldGhvZEtleSA9IEAic291cmNlTWV0aG9kIjsKK05TU3RyaW5nICpUUHJvdG9jb2xFcnJvck1lc3NhZ2VOYW1lS2V5ID0gQCJtZXNzYWdlTmFtZSI7CmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNTRmYy4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJURXhjZXB0aW9uLmgiCi0KLUBpbnRlcmZhY2UgVFByb3RvY29sRXhjZXB0aW9uIDogVEV4Y2VwdGlvbiB7Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE0ODdhLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRQcm90b2NvbEV4Y2VwdGlvbi5oIgotCi1AaW1wbGVtZW50YXRpb24gVFByb3RvY29sRXhjZXB0aW9uCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuaCBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oCmluZGV4IGYyMDBhNmQuLmEwMjJhN2YgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oCkBAIC0yMSw5ICsyMSwxNiBAQAogI2ltcG9ydCAiVFByb3RvY29sLmgiCiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKIAogQHByb3RvY29sIFRQcm90b2NvbEZhY3RvcnkgPE5TT2JqZWN0PgogCi0tIChpZCA8VFByb3RvY29sPikgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogKGlkIDxUVHJhbnNwb3J0PikgdHJhbnNwb3J0OworQHByb3BlcnR5IChyZWFkb25seSwgbm9uYXRvbWljKSBOU1N0cmluZyAqcHJvdG9jb2xOYW1lOworCistKGlkPFRQcm90b2NvbD4pIG5ld1Byb3RvY29sT25UcmFuc3BvcnQ6KGlkPFRUcmFuc3BvcnQ+KXRyYW5zcG9ydDsKIAogQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaAppbmRleCBjMmQyNTIxLi44MjUxMGNmIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaAorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaApAQCAtMjAsMTAgKzIwLDE0IEBACiAjaW1wb3J0ICJUUHJvdG9jb2wuaCIKICNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKIAotQGludGVyZmFjZSBUUHJvdG9jb2xVdGlsIDogTlNPYmplY3QgeworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotfQogCi0rICh2b2lkKSBza2lwVHlwZTogKGludCkgdHlwZSBvblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sOworQGludGVyZmFjZSBUUHJvdG9jb2xVdGlsIDogTlNPYmplY3QKKworKyhCT09MKSBza2lwVHlwZTooaW50KXR5cGUgb25Qcm90b2NvbDooaWQgPFRQcm90b2NvbD4pcHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKIEBlbmQ7CisKKworTlNfQVNTVU1FX05PTk5VTExfRU5EClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLm0gYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQppbmRleCAxM2Q3MDk1Li5jMGQ2NWFjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQorKysgYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RQcm90b2NvbFV0aWwubQpAQCAtMjEsODQgKzIxLDE1MSBAQAogCiBAaW1wbGVtZW50YXRpb24gVFByb3RvY29sVXRpbAogCi0rICh2b2lkKSBza2lwVHlwZTogKGludCkgdHlwZSBvblByb3RvY29sOiAoaWQgPFRQcm90b2NvbD4pIHByb3RvY29sCisrKEJPT0wpIHNraXBUeXBlOihpbnQpdHlwZSBvblByb3RvY29sOihpZCA8VFByb3RvY29sPilwcm90b2NvbCBlcnJvcjooTlNFcnJvciAqKillcnJvcgogewogICBzd2l0Y2ggKHR5cGUpIHsKLSAgY2FzZSBUVHlwZV9CT09MOgotICAgIFtwcm90b2NvbCByZWFkQm9vbF07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfQllURToKLSAgICBbcHJvdG9jb2wgcmVhZEJ5dGVdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0kxNjoKLSAgICBbcHJvdG9jb2wgcmVhZEkxNl07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfSTMyOgotICAgIFtwcm90b2NvbCByZWFkSTMyXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9JNjQ6Ci0gICAgW3Byb3RvY29sIHJlYWRJNjRdOwotICAgIGJyZWFrOwotICBjYXNlIFRUeXBlX0RPVUJMRToKLSAgICBbcHJvdG9jb2wgcmVhZERvdWJsZV07Ci0gICAgYnJlYWs7Ci0gIGNhc2UgVFR5cGVfU1RSSU5HOgotICAgIFtwcm90b2NvbCByZWFkU3RyaW5nXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9TVFJVQ1Q6Ci0gICAgW3Byb3RvY29sIHJlYWRTdHJ1Y3RCZWdpblJldHVybmluZ05hbWU6IE5VTExdOworICBjYXNlIFRUeXBlQk9PTDogeworICAgIEJPT0wgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRCb29sOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVCWVRFOiB7CisgICAgVUludDggdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRCeXRlOiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVJMTY6IHsKKyAgICBTSW50MTYgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWRJMTY6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUkzMjogeworICAgIFNJbnQzMiB2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEkzMjomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlSTY0OiB7CisgICAgU0ludDY0IHZhbDsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkSTY0OiZ2YWwgZXJyb3I6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVET1VCTEU6IHsKKyAgICBkb3VibGUgdmFsOworICAgIGlmICghW3Byb3RvY29sIHJlYWREb3VibGU6JnZhbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZVNUUklORzogeworICAgIE5TU3RyaW5nICp2YWw7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cmluZzomdmFsIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlU1RSVUNUOiB7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFN0cnVjdEJlZ2luUmV0dXJuaW5nTmFtZTpOVUxMIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaW50IGZpZWxkVHlwZTsKLSAgICAgIFtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6IG5pbCB0eXBlOiAmZmllbGRUeXBlIGZpZWxkSUQ6IG5pbF07Ci0gICAgICBpZiAoZmllbGRUeXBlID09IFRUeXBlX1NUT1ApIHsKKyAgICAgIFNJbnQzMiBmaWVsZFR5cGU7CisgICAgICBpZiAoIVtwcm90b2NvbCByZWFkRmllbGRCZWdpblJldHVybmluZ05hbWU6bmlsIHR5cGU6JmZpZWxkVHlwZSBmaWVsZElEOm5pbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgICAgaWYgKGZpZWxkVHlwZSA9PSBUVHlwZVNUT1ApIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBbVFByb3RvY29sVXRpbCBza2lwVHlwZTogZmllbGRUeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKLSAgICAgIFtwcm90b2NvbCByZWFkRmllbGRFbmRdOworICAgICAgaWYgKCFbc2VsZiBza2lwVHlwZTpmaWVsZFR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POworICAgICAgfQorICAgICAgaWYgKCFbcHJvdG9jb2wgcmVhZEZpZWxkRW5kOmVycm9yXSkgeworICAgICAgICByZXR1cm4gTk87CisgICAgICB9CiAgICAgfQotICAgIFtwcm90b2NvbCByZWFkU3RydWN0RW5kXTsKLSAgICBicmVhazsKLSAgY2FzZSBUVHlwZV9NQVA6Ci0gIHsKLSAgICBpbnQga2V5VHlwZTsKLSAgICBpbnQgdmFsdWVUeXBlOwotICAgIGludCBzaXplOwotICAgIFtwcm90b2NvbCByZWFkTWFwQmVnaW5SZXR1cm5pbmdLZXlUeXBlOiAma2V5VHlwZSB2YWx1ZVR5cGU6ICZ2YWx1ZVR5cGUgc2l6ZTogJnNpemVdOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTdHJ1Y3RFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIGNhc2UgVFR5cGVNQVA6IHsKKyAgICBTSW50MzIga2V5VHlwZTsKKyAgICBTSW50MzIgdmFsdWVUeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRNYXBCZWdpblJldHVybmluZ0tleVR5cGU6JmtleVR5cGUgdmFsdWVUeXBlOiZ2YWx1ZVR5cGUgc2l6ZTomc2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGtleVR5cGUgb25Qcm90b2NvbDogcHJvdG9jb2xdOwotICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IHZhbHVlVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07Ci0gICAgfQotICAgIFtwcm90b2NvbCByZWFkTWFwRW5kXTsKLSAgfQotICAgIGJyZWFrOwotICAgIGNhc2UgVFR5cGVfU0VUOgotICAgIHsKLSAgICAgIGludCBlbGVtVHlwZTsKLSAgICAgIGludCBzaXplOwotICAgICAgW3Byb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiAmZWxlbVR5cGUgc2l6ZTogJnNpemVdOwotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOiBlbGVtVHlwZSBvblByb3RvY29sOiBwcm90b2NvbF07CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmtleVR5cGUgb25Qcm90b2NvbDpwcm90b2NvbCBlcnJvcjplcnJvcl0pIHsKKyAgICAgICAgcmV0dXJuIE5POwogICAgICAgfQotICAgICAgW3Byb3RvY29sIHJlYWRTZXRFbmRdOwotICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFR5cGVfTElTVDoKLSAgICB7Ci0gICAgICBpbnQgZWxlbVR5cGU7Ci0gICAgICBpbnQgc2l6ZTsKLSAgICAgIFtwcm90b2NvbCByZWFkTGlzdEJlZ2luUmV0dXJuaW5nRWxlbWVudFR5cGU6ICZlbGVtVHlwZSBzaXplOiAmc2l6ZV07Ci0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6IGVsZW1UeXBlIG9uUHJvdG9jb2w6IHByb3RvY29sXTsKKyAgICAgIGlmICghW1RQcm90b2NvbFV0aWwgc2tpcFR5cGU6dmFsdWVUeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKICAgICAgIH0KLSAgICAgIFtwcm90b2NvbCByZWFkTGlzdEVuZF07CiAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKKyAgICBpZiAoIVtwcm90b2NvbCByZWFkTWFwRW5kOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KICAgfQorICBicmVhazsKKworICBjYXNlIFRUeXBlU0VUOiB7CisgICAgU0ludDMyIGVsZW1UeXBlOworICAgIFNJbnQzMiBzaXplOworICAgIGlmICghW3Byb3RvY29sIHJlYWRTZXRCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiZlbGVtVHlwZSBzaXplOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmVsZW1UeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZFNldEVuZDplcnJvcl0pIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBUVHlwZUxJU1Q6IHsKKyAgICBTSW50MzIgZWxlbVR5cGU7CisgICAgU0ludDMyIHNpemU7CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZExpc3RCZWdpblJldHVybmluZ0VsZW1lbnRUeXBlOiZlbGVtVHlwZSBzaXplOiZzaXplIGVycm9yOmVycm9yXSkgeworICAgICAgcmV0dXJuIE5POworICAgIH0KKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICBpZiAoIVtUUHJvdG9jb2xVdGlsIHNraXBUeXBlOmVsZW1UeXBlIG9uUHJvdG9jb2w6cHJvdG9jb2wgZXJyb3I6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiBOTzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFbcHJvdG9jb2wgcmVhZExpc3RFbmQ6ZXJyb3JdKSB7CisgICAgICByZXR1cm4gTk87CisgICAgfQorICB9CisgIGJyZWFrOworCisgIH0KKworICByZXR1cm4gWUVTOwogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmggYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKaW5kZXggYzhmZjlmMC4uOTViMGQzYyAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCisrKyBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaApAQCAtMjcsMjMgKzI3LDI1IEBACiAjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CiAjZW5kaWYKIAotZXh0ZXJuIE5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uOwotZXh0ZXJuIE5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5OwotZXh0ZXJuIE5TU3RyaW5nICogY29uc3Qga1RTb2NrZXJTZXJ2ZXJfVHJhbnNwb3J0S2V5OworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAogCi1AaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgOiBOU09iamVjdCB7Ci0gIE5TRmlsZUhhbmRsZSAqIG1Tb2NrZXRGaWxlSGFuZGxlOwotICBpZCA8VFByb3RvY29sRmFjdG9yeT4gbUlucHV0UHJvdG9jb2xGYWN0b3J5OwotICBpZCA8VFByb3RvY29sRmFjdG9yeT4gbU91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgaWQgPFRQcm9jZXNzb3JGYWN0b3J5PiBtUHJvY2Vzc29yRmFjdG9yeTsKLX0KK2V4dGVybiBOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZDsKK2V4dGVybiBOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlclByb2Nlc3NvcktleTsKK2V4dGVybiBOU1N0cmluZyAqY29uc3QgVFNvY2tlclNlcnZlclRyYW5zcG9ydEtleTsKIAotLSAoaWQpIGluaXRXaXRoUG9ydDogKGludCkgcG9ydAotICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5Ci0gICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKKworQGludGVyZmFjZSBUU29ja2V0U2VydmVyIDogTlNPYmplY3QKKworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoUG9ydDooaW50KXBvcnQKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6KGlkIDxUUHJvdG9jb2xGYWN0b3J5Pilwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6KGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pcHJvY2Vzc29yRmFjdG9yeTsKKworLSAoaW5zdGFuY2V0eXBlKSBpbml0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCisgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5CisgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3Rvcnk7CiAKIEBlbmQKIAogCi0KK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCmluZGV4IDQ5NDE0NDUuLjA5YjYwM2MgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQorKysgYi9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KQEAgLTIxLDM2ICsyMSw5MiBAQAogI2ltcG9ydCAiVFNvY2tldFNlcnZlci5oIgogI2ltcG9ydCAiVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oIgogI2ltcG9ydCAiVFByb3RvY29sLmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCiAjaW1wb3J0IDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy91bi5oPgogCiAKK05TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gQCJUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkIjsKK05TU3RyaW5nICpjb25zdCBUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyUHJvY2Vzc29yIjsKK05TU3RyaW5nICpjb25zdCBUU29ja2VyU2VydmVyVHJhbnNwb3J0S2V5ID0gQCJUU29ja2VyU2VydmVyVHJhbnNwb3J0IjsKIAotTlNTdHJpbmcgKiBjb25zdCBrVFNvY2tldFNlcnZlcl9DbGllbnRDb25uZWN0aW9uRmluaXNoZWRGb3JQcm9jZXNzb3JOb3RpZmljYXRpb24gPSBAIlRTb2NrZXRTZXJ2ZXJfQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkRm9yUHJvY2Vzc29yTm90aWZpY2F0aW9uIjsKLU5TU3RyaW5nICogY29uc3Qga1RTb2NrZXRTZXJ2ZXJfUHJvY2Vzc29yS2V5ID0gQCJUU29ja2V0U2VydmVyX1Byb2Nlc3NvciI7Ci1OU1N0cmluZyAqIGNvbnN0IGtUU29ja2VyU2VydmVyX1RyYW5zcG9ydEtleSA9IEAiVFNvY2tlclNlcnZlcl9UcmFuc3BvcnQiOworCitAaW50ZXJmYWNlIFRTb2NrZXRTZXJ2ZXIgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBpZDxUUHJvY2Vzc29yRmFjdG9yeT4gcHJvY2Vzc29yRmFjdG9yeTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpzb2NrZXRGaWxlSGFuZGxlOworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBkaXNwYXRjaF9xdWV1ZV90IHByb2Nlc3NpbmdRdWV1ZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNTdHJpbmcgKmRvbWFpblNvY2tldFBhdGg7CisKK0BlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVFNvY2tldFNlcnZlcgogCi0tIChpZCkgaW5pdFdpdGhQb3J0OiAoaW50KSBwb3J0Ci0gICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKLSAgIHByb2Nlc3NvckZhY3Rvcnk6IChpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KSBwcm9jZXNzb3JGYWN0b3J5OworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoU29ja2V0OihDRlNvY2tldFJlZilzb2NrZXQKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3Rvcnk6KGlkIDxUUHJvdG9jb2xGYWN0b3J5Pilwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgIHByb2Nlc3NvckZhY3Rvcnk6KGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pcHJvY2Vzc29yRmFjdG9yeTsKIHsKICAgc2VsZiA9IFtzdXBlciBpbml0XTsKIAotICBtSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBbcHJvdG9jb2xGYWN0b3J5IHJldGFpbl9zdHViXTsKLSAgbU91dHB1dFByb3RvY29sRmFjdG9yeSA9IFtwcm90b2NvbEZhY3RvcnkgcmV0YWluX3N0dWJdOwotICBtUHJvY2Vzc29yRmFjdG9yeSA9IFtwcm9jZXNzb3JGYWN0b3J5IHJldGFpbl9zdHViXTsKKyAgX2lucHV0UHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICBfb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5OworICBfcHJvY2Vzc29yRmFjdG9yeSA9IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgZGlzcGF0Y2hfcXVldWVfYXR0cl90IHByb2Nlc3NpbmdRdWV1ZUF0dHIgPQorICAgIGRpc3BhdGNoX3F1ZXVlX2F0dHJfbWFrZV93aXRoX3Fvc19jbGFzcyhESVNQQVRDSF9RVUVVRV9DT05DVVJSRU5ULCBRT1NfQ0xBU1NfQkFDS0dST1VORCwgMCk7CisKKyAgX3Byb2Nlc3NpbmdRdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwgcHJvY2Vzc2luZ1F1ZXVlQXR0cik7CiAKICAgLy8gY3JlYXRlIGEgc29ja2V0LgotICBpbnQgZmQgPSAtMTsKKyAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKworICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgIF9zb2NrZXRGaWxlSGFuZGxlID0gW1tOU0ZpbGVIYW5kbGUgYWxsb2NdIGluaXRXaXRoRmlsZURlc2NyaXB0b3I6ZmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU9uRGVhbGxvYzpZRVNdOworCisgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKKyAgQ0ZSZWxlYXNlKHNvY2tldCk7CisKKyAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjpzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6QHNlbGVjdG9yKGNvbm5lY3Rpb25BY2NlcHRlZDopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6TlNGaWxlSGFuZGxlQ29ubmVjdGlvbkFjY2VwdGVkTm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6X3NvY2tldEZpbGVIYW5kbGVdOworCisgIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgorICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07CisKKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVTb2NrZXRXaXRoUG9ydDpwb3J0XTsKKyAgaWYgKHNvY2tldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChzZWxmID0gW3NlbGYgaW5pdFdpdGhTb2NrZXQ6c29ja2V0IHByb3RvY29sRmFjdG9yeTpwcm90b2NvbEZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTpwcm9jZXNzb3JGYWN0b3J5XSkgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIFRDUCBwb3J0ICVkIiwgcG9ydCk7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKworKyhDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBvcnQ6KGludClwb3J0Cit7CiAgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgMCwgTlVMTCwgTlVMTCk7CiAgIGlmIChzb2NrZXQpIHsKICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKLSAgICBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisgICAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKICAgICBpbnQgeWVzID0gMTsKICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopJnllcywgc2l6ZW9mKHllcykpOwogCkBAIC02MSwxMzQgKzExNywxMjMgQEAKICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CiAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfQU5ZKTsKICAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07Ci0gICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChicmlkZ2Vfc3R1YiBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoX19icmlkZ2UgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKICAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwogICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gICAgICBOU0xvZyhAIioqKiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7Ci0gICAgICByZXR1cm4gbmlsOworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTlNMb2coQCIqKiogTm8gc2VydmVyIHNvY2tldCIpOworCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfQorICBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAorICAgIHByb3RvY29sRmFjdG9yeTogKGlkIDxUUHJvdG9jb2xGYWN0b3J5PikgcHJvdG9jb2xGYWN0b3J5CisgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeQoreworICBfZG9tYWluU29ja2V0UGF0aCA9IHBhdGg7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IFtbc2VsZiBjbGFzc10gY3JlYXRlU29ja2V0V2l0aFBhdGg6cGF0aF07CisgIGlmIChzb2NrZXQgPT0gTlVMTCkgewogICAgIHJldHVybiBuaWw7CiAgIH0KLSAgCi0gIC8vIHdyYXAgaXQgaW4gYSBmaWxlIGhhbmRsZSBzbyB3ZSBjYW4gZ2V0IG1lc3NhZ2VzIGZyb20gaXQKLSAgbVNvY2tldEZpbGVIYW5kbGUgPSBbW05TRmlsZUhhbmRsZSBhbGxvY10gaW5pdFdpdGhGaWxlRGVzY3JpcHRvcjogZmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU9uRGVhbGxvYzogWUVTXTsKLSAgCi0gIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAotICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKLSAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gIAotICAgIC8vIHJlZ2lzdGVyIGZvciBub3RpZmljYXRpb25zIG9mIGFjY2VwdGVkIGluY29taW5nIGNvbm5lY3Rpb25zCi0gIFtbTlNOb3RpZmljYXRpb25DZW50ZXIgZGVmYXVsdENlbnRlcl0gYWRkT2JzZXJ2ZXI6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogQHNlbGVjdG9yKGNvbm5lY3Rpb25BY2NlcHRlZDopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IE5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZE5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBtU29ja2V0RmlsZUhhbmRsZV07Ci0gIAotICAvLyB0ZWxsIHNvY2tldCB0byBsaXN0ZW4KLSAgW21Tb2NrZXRGaWxlSGFuZGxlIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOwotICAKLSAgTlNMb2coQCJMaXN0ZW5pbmcgb24gVENQIHBvcnQgJWQiLCBwb3J0KTsKLSAgCisKKyAgaWYgKHNlbGYgPSBbc2VsZiBpbml0V2l0aFNvY2tldDpzb2NrZXQgcHJvdG9jb2xGYWN0b3J5OnByb3RvY29sRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OnByb2Nlc3NvckZhY3RvcnldKSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gcGF0aCAlQCIsIHBhdGgpOworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0KLS0gKHZvaWQpIGRlYWxsb2MgewotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9ic2VydmVyOnNlbGZdOwotICBbbUlucHV0UHJvdG9jb2xGYWN0b3J5IHJlbGVhc2Vfc3R1Yl07Ci0gIFttT3V0cHV0UHJvdG9jb2xGYWN0b3J5IHJlbGVhc2Vfc3R1Yl07Ci0gIFttUHJvY2Vzc29yRmFjdG9yeSByZWxlYXNlX3N0dWJdOwotICBbbVNvY2tldEZpbGVIYW5kbGUgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07Ci19Ci0KLQotLSAodm9pZCkgY29ubmVjdGlvbkFjY2VwdGVkOiAoTlNOb3RpZmljYXRpb24gKikgYU5vdGlmaWNhdGlvbgorKyAoQ0ZTb2NrZXRSZWYpIGNyZWF0ZVNvY2tldFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAogewotICBOU0ZpbGVIYW5kbGUgKiBzb2NrZXQgPSBbW2FOb3RpZmljYXRpb24gdXNlckluZm9dIG9iamVjdEZvcktleTogTlNGaWxlSGFuZGxlTm90aWZpY2F0aW9uRmlsZUhhbmRsZUl0ZW1dOworICBDRlNvY2tldFJlZiBzb2NrZXQgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9MT0NBTCwgU09DS19TVFJFQU0sIElQUFJPVE9fSVAsIDAsIE5VTEwsIE5VTEwpOworICBpZiAoc29ja2V0KSB7CisgICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrZXQsICBDRlNvY2tldEdldFNvY2tldEZsYWdzKHNvY2tldCkgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpOworICAgIGludCBmZCA9IENGU29ja2V0R2V0TmF0aXZlKHNvY2tldCk7CisgICAgaW50IHllcyA9IDE7CisgICAgc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAodm9pZCAqKSZ5ZXMsIHNpemVvZih5ZXMpKTsKIAotICAvLyBub3cgdGhhdCB3ZSBoYXZlIGEgY2xpZW50IGNvbm5lY3RlZCwgc3BpbiBvZmYgYSB0aHJlYWQgdG8gaGFuZGxlIGFjdGl2aXR5Ci0gIFtOU1RocmVhZCBkZXRhY2hOZXdUaHJlYWRTZWxlY3RvcjogQHNlbGVjdG9yKGhhbmRsZUNsaWVudENvbm5lY3Rpb246KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9UYXJnZXQ6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoT2JqZWN0OiBzb2NrZXRdOwotCi0gIFtbYU5vdGlmaWNhdGlvbiBvYmplY3RdIGFjY2VwdENvbm5lY3Rpb25JbkJhY2tncm91bmRBbmROb3RpZnldOwotfQotCi0KLS0gKHZvaWQpIGhhbmRsZUNsaWVudENvbm5lY3Rpb246IChOU0ZpbGVIYW5kbGUgKikgY2xpZW50U29ja2V0Ci17Ci0jaWYgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKLSAgICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAgICAgICAgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCAqIHRyYW5zcG9ydCA9IFtbVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGaWxlSGFuZGxlOiBjbGllbnRTb2NrZXRdOwotICAgICAgICBpZDxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBbbVByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRm9yVHJhbnNwb3J0OiB0cmFuc3BvcnRdOwotICAgICAgICAKLSAgICAgICAgaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbCA9IFttSW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgICAgICAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbbU91dHB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiB0cmFuc3BvcnRdOwotICAgICAgICAKLSAgICAgICAgQHRyeSB7Ci0gICAgICAgICAgICBCT09MIHJlc3VsdCA9IE5POwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIEBhdXRvcmVsZWFzZXBvb2wgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbcHJvY2Vzc29yIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6IGluUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2w6IG91dFByb3RvY29sXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IHdoaWxlIChyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIEBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAqIHRlKSB7Ci0gICAgICAgICAgICAvL05TTG9nKEAiQ2F1Z2h0IHRyYW5zcG9ydCBleGNlcHRpb24sIGFiYW5kb25pbmcgY2xpZW50IGNvbm5lY3Rpb246ICVAIiwgdGUpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBOU05vdGlmaWNhdGlvbiAqIG4gPSBbTlNOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uV2l0aE5hbWU6IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbF1dOwotICAgICAgICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDogQHNlbGVjdG9yKHBvc3ROb3RpZmljYXRpb246KSB3aXRoT2JqZWN0OiBuIHdhaXRVbnRpbERvbmU6IFlFU107Ci0gICAgICAgIAorICAgIHNpemVfdCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGggPSBwYXRoLmxlbmd0aCArIDE7CisgICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHI7CisgICAgaWYgKG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aD4gc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKSB7CisgICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IFVuYWJsZSB0byBjcmVhdGUgc29ja2V0IGF0IHBhdGggJUAuIFBhdGggaXMgdG9vIGxvbmcuIiwgcGF0aCk7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0jZWxzZQotICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLSAgCi0gIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKiB0cmFuc3BvcnQgPSBbW1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgYWxsb2NdIGluaXRXaXRoRmlsZUhhbmRsZTogY2xpZW50U29ja2V0XTsKLSAgaWQ8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gW21Qcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZvclRyYW5zcG9ydDogdHJhbnNwb3J0XTsKLSAgCi0gIGlkIDxUUHJvdG9jb2w+IGluUHJvdG9jb2wgPSBbW21JbnB1dFByb3RvY29sRmFjdG9yeSBuZXdQcm90b2NvbE9uVHJhbnNwb3J0OiB0cmFuc3BvcnRdIGF1dG9yZWxlYXNlXTsKLSAgaWQgPFRQcm90b2NvbD4gb3V0UHJvdG9jb2wgPSBbW21PdXRwdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDogdHJhbnNwb3J0XSBhdXRvcmVsZWFzZV07CiAKLSAgQHRyeSB7Ci0gICAgQk9PTCByZXN1bHQgPSBOTzsKLSAgICBkbyB7Ci0gICAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIG15UG9vbCA9IFtbTlNBdXRvcmVsZWFzZVBvb2wgYWxsb2NdIGluaXRdOwotICAgICAgcmVzdWx0ID0gW3Byb2Nlc3NvciBwcm9jZXNzT25JbnB1dFByb3RvY29sOiBpblByb3RvY29sIG91dHB1dFByb3RvY29sOiBvdXRQcm90b2NvbF07Ci0gICAgICBbbXlQb29sIHJlbGVhc2VdOwotICAgIH0gd2hpbGUgKHJlc3VsdCk7Ci0gIH0KLSAgQGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICogdGUpIHsKLSAgICAvL05TTG9nKEAiQ2F1Z2h0IHRyYW5zcG9ydCBleGNlcHRpb24sIGFiYW5kb25pbmcgY2xpZW50IGNvbm5lY3Rpb246ICVAIiwgdGUpOwotICB9CisgICAgYWRkci5zdW5fZmFtaWx5ID0gQUZfTE9DQUw7CisgICAgbWVtY3B5KGFkZHIuc3VuX3BhdGgsIHBhdGguVVRGOFN0cmluZywgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoKTsKKyAgICBhZGRyLnN1bl9sZW4gPSBTVU5fTEVOKCZhZGRyKTsKIAotICBOU05vdGlmaWNhdGlvbiAqIG4gPSBbTlNOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uV2l0aE5hbWU6IGtUU29ja2V0U2VydmVyX0NsaWVudENvbm5lY3Rpb25GaW5pc2hlZEZvclByb2Nlc3Nvck5vdGlmaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6IHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOiBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0c0FuZEtleXM6IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUU29ja2V0U2VydmVyX1Byb2Nlc3NvcktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVFNvY2tlclNlcnZlcl9UcmFuc3BvcnRLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbF1dOwotICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHBlcmZvcm1TZWxlY3Rvck9uTWFpblRocmVhZDogQHNlbGVjdG9yKHBvc3ROb3RpZmljYXRpb246KSB3aXRoT2JqZWN0OiBuIHdhaXRVbnRpbERvbmU6IFlFU107Ci0gIAotICBbcG9vbCByZWxlYXNlXTsKLSNlbmRpZgorICAgIE5TRGF0YSAqYWRkcmVzcyA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlczomYWRkciBsZW5ndGg6c2l6ZW9mKGFkZHIpXTsKKyAgICBpZiAoQ0ZTb2NrZXRTZXRBZGRyZXNzKHNvY2tldCwgKF9fYnJpZGdlIENGRGF0YVJlZilhZGRyZXNzKSAhPSBrQ0ZTb2NrZXRTdWNjZXNzKSB7CisgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29ja2V0KTsKKyAgICAgIENGUmVsZWFzZShzb2NrZXQpOworICAgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBDb3VsZCBub3QgYmluZCB0byBhZGRyZXNzIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc29ja2V0OworICB9IGVsc2UgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKKy0odm9pZCkgZGVhbGxvYworeworICBbW05TTm90aWZpY2F0aW9uQ2VudGVyIGRlZmF1bHRDZW50ZXJdIHJlbW92ZU9ic2VydmVyOnNlbGZdOworCisgIGlmIChfZG9tYWluU29ja2V0UGF0aCAhPSBuaWwpIHsKKyAgICB1bmxpbmsoX2RvbWFpblNvY2tldFBhdGguVVRGOFN0cmluZyk7CisgIH0KIH0KIAogCistKHZvaWQpIGNvbm5lY3Rpb25BY2NlcHRlZDooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb24KK3sKKyAgTlNGaWxlSGFuZGxlICpzb2NrZXQgPSBbbm90aWZpY2F0aW9uLnVzZXJJbmZvIG9iamVjdEZvcktleTpOU0ZpbGVIYW5kbGVOb3RpZmljYXRpb25GaWxlSGFuZGxlSXRlbV07CisKKyAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBjb25uZWN0ZWQsIGhhbmRsZSByZXF1ZXN0IG9uIHF1ZXVlCisgIGRpc3BhdGNoX2FzeW5jKF9wcm9jZXNzaW5nUXVldWUsIF57CisKKyAgICBbc2VsZiBoYW5kbGVDbGllbnRDb25uZWN0aW9uOnNvY2tldF07CisKKyAgfSk7CisKKyAgLy8gQ29udGludWUgYWNjZXB0aW5nIGNvbm5lY3Rpb25zCisgIFtfc29ja2V0RmlsZUhhbmRsZSBhY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5XTsKK30KKworCistKHZvaWQpIGhhbmRsZUNsaWVudENvbm5lY3Rpb246KE5TRmlsZUhhbmRsZSAqKWNsaWVudFNvY2tldAoreworICBAYXV0b3JlbGVhc2Vwb29sIHsKKworICAgIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IFtbVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCBhbGxvY10gaW5pdFdpdGhGaWxlSGFuZGxlOmNsaWVudFNvY2tldF07CisgICAgaWQ8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gW19wcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZvclRyYW5zcG9ydDp0cmFuc3BvcnRdOworCisgICAgaWQgPFRQcm90b2NvbD4gaW5Qcm90b2NvbCA9IFtfaW5wdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOworICAgIGlkIDxUUHJvdG9jb2w+IG91dFByb3RvY29sID0gW19vdXRwdXRQcm90b2NvbEZhY3RvcnkgbmV3UHJvdG9jb2xPblRyYW5zcG9ydDp0cmFuc3BvcnRdOworCisgICAgTlNFcnJvciAqZXJyb3I7CisgICAgaWYgKCFbcHJvY2Vzc29yIHByb2Nlc3NPbklucHV0UHJvdG9jb2w6aW5Qcm90b2NvbCBvdXRwdXRQcm90b2NvbDpvdXRQcm90b2NvbCBlcnJvcjomZXJyb3JdKSB7CisgICAgICAvLyBIYW5kbGUgZXJyb3IKKyAgICAgIE5TTG9nKEAiRXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiAlQCIsIGVycm9yKTsKKyAgICB9CisKKyAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBeeworCisgICAgICBbTlNOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdENlbnRlciBwb3N0Tm90aWZpY2F0aW9uTmFtZTpUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDpzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe1RTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXk6IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNvY2tlclNlcnZlclRyYW5zcG9ydEtleTogdHJhbnNwb3J0fV07CisgICAgfSk7CisKKyAgfQorfQogCiBAZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RBc3luY1RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjRmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UQXN5bmNUcmFuc3BvcnQuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0OworCisKK0Bwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IDxOU09iamVjdD4KKworLShpZDxUQXN5bmNUcmFuc3BvcnQ+KSBuZXdUcmFuc3BvcnQ7CisKK0BlbmQKKworCit0eXBlZGVmIHZvaWQgKF5UQXN5bmNDb21wbGV0aW9uQmxvY2spKCk7Cit0eXBlZGVmIHZvaWQgKF5UQXN5bmNGYWlsdXJlQmxvY2spKE5TRXJyb3IgKiBfX25vbm51bGwpOworCisKK0Bwcm90b2NvbCBUQXN5bmNUcmFuc3BvcnQgPFRUcmFuc3BvcnQ+CisKKy0odm9pZCkgZmx1c2hXaXRoQ29tcGxldGlvbjooVEFzeW5jQ29tcGxldGlvbkJsb2NrKWNvbXBsZXRlZCBmYWlsdXJlOihUQXN5bmNGYWlsdXJlQmxvY2spZmFpbHVyZTsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTY4YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBURnJhbWVkVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+CisKKy0oaWQpIGluaXRXaXRoVHJhbnNwb3J0OihpZCA8VFRyYW5zcG9ydD4pdHJhbnNwb3J0OworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNjVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW1wb3J0ICJURnJhbWVkVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworI2RlZmluZSBIRUFERVJfU0laRSA0CisjZGVmaW5lIElOSVRfRlJBTUVfU0laRSAxMDI0CisKKworQGludGVyZmFjZSBURnJhbWVkVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICp3cml0ZUJ1ZmZlcjsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqcmVhZEJ1ZmZlcjsKK0Bwcm9wZXJ0eShhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZWFkT2Zmc2V0OworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRGcmFtZWRUcmFuc3BvcnQKKworLShpZCkgaW5pdFdpdGhUcmFuc3BvcnQ6KGlkIDxUVHJhbnNwb3J0PilhVHJhbnNwb3J0Cit7CisgIGlmICgoc2VsZiA9IFtzZWxmIGluaXRdKSkgeworICAgIF90cmFuc3BvcnQgPSBhVHJhbnNwb3J0OworICAgIF9yZWFkQnVmZmVyID0gbmlsOworICAgIF9yZWFkT2Zmc2V0ID0gMDsKKyAgICBfd3JpdGVCdWZmZXIgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpIRUFERVJfU0laRV07CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKiopZXJyb3IKK3sKKyAgaW50IGxlbiA9IChpbnQpW193cml0ZUJ1ZmZlciBsZW5ndGhdOworICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBIRUFERVJfU0laRTsKKyAgaWYgKGRhdGFfbGVuIDwgMCkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgIH0KKyAgICByZXR1cm4gTk87CisgIH0KKworICBVSW50OCBpMzJyZFtIRUFERVJfU0laRV07CisgIGkzMnJkWzBdID0gKFVJbnQ4KSgweGZmICYgKGRhdGFfbGVuID4+IDI0KSk7CisgIGkzMnJkWzFdID0gKFVJbnQ4KSgweGZmICYgKGRhdGFfbGVuID4+IDE2KSk7CisgIGkzMnJkWzJdID0gKFVJbnQ4KSgweGZmICYgKGRhdGFfbGVuID4+IDgpKTsKKyAgaTMycmRbM10gPSAoVUludDgpKDB4ZmYgJiAoZGF0YV9sZW4pKTsKKworICAvLyBzaG91bGQgd2UgbWFrZSBhIGNvcHkgb2YgdGhlIHdyaXRlQnVmZmVyIGluc3RlYWQ/IEJldHRlciBmb3IgdGhyZWFkZWQKKyAgLy8gIG9wZXJhdGlvbnMhCisgIFtfd3JpdGVCdWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBIRUFERVJfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aEJ5dGVzOmkzMnJkIGxlbmd0aDpIRUFERVJfU0laRV07CisKKyAgaWYgKCFbX3RyYW5zcG9ydCB3cml0ZTpfd3JpdGVCdWZmZXIubXV0YWJsZUJ5dGVzIG9mZnNldDowIGxlbmd0aDpsZW4gZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgaWYgKCFbX3RyYW5zcG9ydCBmbHVzaDplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICBfd3JpdGVCdWZmZXIubGVuZ3RoID0gSEVBREVSX1NJWkU7CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfd3JpdGVCdWZmZXIgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSByZWFkQWxsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gW3NlbGYgcmVhZEF2YWlsOm91dEJ1ZmZlciBvZmZzZXQ6b3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDpsZW5ndGggZXJyb3I6ZXJyb3JdOworICBpZiAoZ290ICE9IGxlbmd0aCkgeworCisgICAgLy8gUmVwb3J0IHVuZGVyZmxvdyBvbmx5IGlmIHJlYWRBdmFpbCBkaWRuJ3QgcmVwb3J0IGVycm9yIGFscmVhZHkKKyAgICBpZiAoZXJyb3IgJiYgISplcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorCisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IDA7CisgIHdoaWxlIChnb3QgPCBsZW5ndGgpIHsKKworICAgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVhZEJ1ZmZlci5sZW5ndGggLSBfcmVhZE9mZnNldDsKKyAgICBpZiAoYXZhaWwgPT0gMCkgeworICAgICAgaWYgKCFbc2VsZiByZWFkRnJhbWU6ZXJyb3JdKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgYXZhaWwgPSBfcmVhZEJ1ZmZlci5sZW5ndGg7CisgICAgfQorCisgICAgTlNSYW5nZSByYW5nZTsKKyAgICByYW5nZS5sb2NhdGlvbiA9IF9yZWFkT2Zmc2V0OworICAgIHJhbmdlLmxlbmd0aCA9IE1JTihsZW5ndGggLSBnb3QsIGF2YWlsKTsKKworICAgIFtfcmVhZEJ1ZmZlciBnZXRCeXRlczpvdXRCdWZmZXIrb3V0QnVmZmVyT2Zmc2V0K2dvdCByYW5nZTpyYW5nZV07CisgICAgX3JlYWRPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworICAgIGdvdCArPSByYW5nZS5sZW5ndGg7CisgIH0KKworICByZXR1cm4gZ290OworfQorCistKEJPT0wpIHJlYWRGcmFtZTooTlNFcnJvciAqKillcnJvcgoreworICBVSW50OCBpMzJyZFtIRUFERVJfU0laRV07CisgIGlmICghW190cmFuc3BvcnQgcmVhZEFsbDppMzJyZCBvZmZzZXQ6MCBsZW5ndGg6SEVBREVSX1NJWkUgZXJyb3I6ZXJyb3JdKSB7CisgICAgcmV0dXJuIE5POworICB9CisKKyAgU0ludDMyIHNpemUgPQorICAgICgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAorICAgICgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAorICAgICgoaTMycmRbM10gJiAweGZmKSk7CisKKyAgaWYgKF9yZWFkQnVmZmVyID09IG5pbCkgeworCisgICAgX3JlYWRCdWZmZXIgPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aExlbmd0aDpzaXplXTsKKworICB9CisgIGVsc2UgeworCisgICAgU0ludDMyIGxlbiA9IChTSW50MzIpX3JlYWRCdWZmZXIubGVuZ3RoOworICAgIGlmIChsZW4gPj0gc2l6ZSkgeworCisgICAgICBfcmVhZEJ1ZmZlci5sZW5ndGggPSBzaXplOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICAvLyBpbmNyZWFzZSBsZW5ndGggb2YgZGF0YSBidWZmZXIKKyAgICAgIFtfcmVhZEJ1ZmZlciBpbmNyZWFzZUxlbmd0aEJ5OnNpemUtbGVuXTsKKworICAgIH0KKworICB9CisKKyAgLy8gY29weSBpbnRvIGludGVybmFsIG1lbW9yeSBidWZmZXIKKyAgaWYgKCFbX3RyYW5zcG9ydCByZWFkQWxsOl9yZWFkQnVmZmVyLm11dGFibGVCeXRlcyBvZmZzZXQ6MCBsZW5ndGg6c2l6ZSBlcnJvcjplcnJvcl0pIHsKKyAgICByZXR1cm4gTk87CisgIH0KKworICByZXR1cm4gWUVTOworfQorCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1Nzg0MC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgIlRUcmFuc3BvcnQuaCIKLQotQGludGVyZmFjZSBUSFRUUENsaWVudCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PiB7Ci0gIE5TVVJMICogbVVSTDsKLSAgTlNNdXRhYmxlVVJMUmVxdWVzdCAqIG1SZXF1ZXN0OwotICBOU011dGFibGVEYXRhICogbVJlcXVlc3REYXRhOwotICBOU0RhdGEgKiBtUmVzcG9uc2VEYXRhOwotICBpbnQgbVJlc3BvbnNlRGF0YU9mZnNldDsKLSAgTlNTdHJpbmcgKiBtVXNlckFnZW50OwotICBpbnQgbVRpbWVvdXQ7Ci19Ci0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkw7Ci0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLSAgICAgICAgIHVzZXJBZ2VudDogKE5TU3RyaW5nICopIHVzZXJBZ2VudAotICAgICAgICAgICB0aW1lb3V0OiAoaW50KSB0aW1lb3V0OwotCi0tICh2b2lkKSBzZXRVUkw6IChOU1VSTCAqKSBhVVJMOwotCi1AZW5kCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUENsaWVudC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE3ZDQ1Li4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQQ2xpZW50Lm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW1wb3J0ICJUSFRUUENsaWVudC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLUBpbXBsZW1lbnRhdGlvbiBUSFRUUENsaWVudAotCi0KLS0gKHZvaWQpIHNldHVwUmVxdWVzdAotewotICBpZiAobVJlcXVlc3QgIT0gbmlsKSB7Ci0gICAgW21SZXF1ZXN0IHJlbGVhc2Vfc3R1Yl07Ci0gIH0KLQotICAvLyBzZXQgdXAgb3VyIHJlcXVlc3Qgb2JqZWN0IHRoYXQgd2UnbGwgdXNlIGZvciBlYWNoIHJlcXVlc3QKLSAgbVJlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOiBtVVJMXTsKLSAgW21SZXF1ZXN0IHNldEhUVFBNZXRob2Q6IEAiUE9TVCJdOwotICBbbVJlcXVlc3Qgc2V0VmFsdWU6IEAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDogQCJDb250ZW50LVR5cGUiXTsKLSAgW21SZXF1ZXN0IHNldFZhbHVlOiBAImFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBmb3JIVFRQSGVhZGVyRmllbGQ6IEAiQWNjZXB0Il07Ci0KLSAgTlNTdHJpbmcgKiB1c2VyQWdlbnQgPSBtVXNlckFnZW50OwotICBpZiAoIXVzZXJBZ2VudCkgewotICAgIHVzZXJBZ2VudCA9IEAiQ29jb2EvVEhUVFBDbGllbnQiOwotICB9Ci0gIFttUmVxdWVzdCBzZXRWYWx1ZTogdXNlckFnZW50IGZvckhUVFBIZWFkZXJGaWVsZDogQCJVc2VyLUFnZW50Il07Ci0KLSAgW21SZXF1ZXN0IHNldENhY2hlUG9saWN5OiBOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YV07Ci0gIGlmIChtVGltZW91dCkgewotICAgIFttUmVxdWVzdCBzZXRUaW1lb3V0SW50ZXJ2YWw6IG1UaW1lb3V0XTsKLSAgfQotfQotCi0KLS0gKGlkKSBpbml0V2l0aFVSTDogKE5TVVJMICopIGFVUkwKLXsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVVJMOiBhVVJMCi0gICAgICAgICAgICAgICAgIHVzZXJBZ2VudDogbmlsCi0gICAgICAgICAgICAgICAgICAgdGltZW91dDogMF07Ci19Ci0KLQotLSAoaWQpIGluaXRXaXRoVVJMOiAoTlNVUkwgKikgYVVSTAotICAgICAgICAgdXNlckFnZW50OiAoTlNTdHJpbmcgKikgdXNlckFnZW50Ci0gICAgICAgICAgIHRpbWVvdXQ6IChpbnQpIHRpbWVvdXQKLXsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKCFzZWxmKSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotCi0gIG1UaW1lb3V0ID0gdGltZW91dDsKLSAgaWYgKHVzZXJBZ2VudCkgewotICAgIG1Vc2VyQWdlbnQgPSBbdXNlckFnZW50IHJldGFpbl9zdHViXTsKLSAgfQotICBtVVJMID0gW2FVUkwgcmV0YWluX3N0dWJdOwotCi0gIFtzZWxmIHNldHVwUmVxdWVzdF07Ci0KLSAgLy8gY3JlYXRlIG91ciByZXF1ZXN0IGRhdGEgYnVmZmVyCi0gIG1SZXF1ZXN0RGF0YSA9IFtbTlNNdXRhYmxlRGF0YSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTogMTAyNF07Ci0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLQotLSAodm9pZCkgc2V0VVJMOiAoTlNVUkwgKikgYVVSTAotewotICBbYVVSTCByZXRhaW5fc3R1Yl07Ci0gIFttVVJMIHJlbGVhc2Vfc3R1Yl07Ci0gIG1VUkwgPSBhVVJMOwotCi0gIFtzZWxmIHNldHVwUmVxdWVzdF07Ci19Ci0KLQotLSAodm9pZCkgZGVhbGxvYwotewotICBbbVVSTCByZWxlYXNlX3N0dWJdOwotICBbbVVzZXJBZ2VudCByZWxlYXNlX3N0dWJdOwotICBbbVJlcXVlc3QgcmVsZWFzZV9zdHViXTsKLSAgW21SZXF1ZXN0RGF0YSByZWxlYXNlX3N0dWJdOwotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlX3N0dWJdOwotICBbc3VwZXIgZGVhbGxvY19zdHViXTsKLX0KLQotCi0tIChpbnQpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChpbnQpIG9mZiBsZW5ndGg6IChpbnQpIGxlbgotewotICBOU1JhbmdlIHI7Ci0gIHIubG9jYXRpb24gPSBtUmVzcG9uc2VEYXRhT2Zmc2V0OwotICByLmxlbmd0aCA9IGxlbjsKLQotICBbbVJlc3BvbnNlRGF0YSBnZXRCeXRlczogYnVmK29mZiByYW5nZTogcl07Ci0gIG1SZXNwb25zZURhdGFPZmZzZXQgKz0gbGVuOwotCi0gIHJldHVybiBsZW47Ci19Ci0KLQotLSAodm9pZCkgd3JpdGU6IChjb25zdCB1aW50OF90ICopIGRhdGEgb2Zmc2V0OiAodW5zaWduZWQgaW50KSBvZmZzZXQgbGVuZ3RoOiAodW5zaWduZWQgaW50KSBsZW5ndGgKLXsKLSAgW21SZXF1ZXN0RGF0YSBhcHBlbmRCeXRlczogZGF0YStvZmZzZXQgbGVuZ3RoOiBsZW5ndGhdOwotfQotCi0KLS0gKHZvaWQpIGZsdXNoCi17Ci0gIFttUmVxdWVzdCBzZXRIVFRQQm9keTogbVJlcXVlc3REYXRhXTsgLy8gbm90IHN1cmUgaWYgaXQgY29waWVzIHRoZSBkYXRhCi0KLSAgLy8gbWFrZSB0aGUgSFRUUCByZXF1ZXN0Ci0gIE5TVVJMUmVzcG9uc2UgKiByZXNwb25zZTsKLSAgTlNFcnJvciAqIGVycm9yOwotICBOU0RhdGEgKiByZXNwb25zZURhdGEgPQotICAgIFtOU1VSTENvbm5lY3Rpb24gc2VuZFN5bmNocm9ub3VzUmVxdWVzdDogbVJlcXVlc3QgcmV0dXJuaW5nUmVzcG9uc2U6ICZyZXNwb25zZSBlcnJvcjogJmVycm9yXTsKLQotICBbbVJlcXVlc3REYXRhIHNldExlbmd0aDogMF07Ci0KLSAgaWYgKHJlc3BvbnNlRGF0YSA9PSBuaWwpIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBAIkNvdWxkIG5vdCBtYWtlIEhUVFAgcmVxdWVzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yXTsKLSAgfQotICBpZiAoIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOiBbTlNIVFRQVVJMUmVzcG9uc2UgY2xhc3NdXSkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiVW5leHBlY3RlZCBOU1VSTFJlc3BvbnNlIHR5cGU6ICVAIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1N0cmluZ0Zyb21DbGFzcyhbcmVzcG9uc2UgY2xhc3NdKV1dOwotICB9Ci0KLSAgTlNIVFRQVVJMUmVzcG9uc2UgKiBodHRwUmVzcG9uc2UgPSAoTlNIVFRQVVJMUmVzcG9uc2UgKikgcmVzcG9uc2U7Ci0gIGlmIChbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdICE9IDIwMCkgewotICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6IEAiQmFkIHJlc3BvbnNlIGZyb20gSFRUUCBzZXJ2ZXI6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaHR0cFJlc3BvbnNlIHN0YXR1c0NvZGVdXV07Ci0gIH0KLQotICAvLyBwaGV3IQotICBbbVJlc3BvbnNlRGF0YSByZWxlYXNlX3N0dWJdOwotICBtUmVzcG9uc2VEYXRhID0gW3Jlc3BvbnNlRGF0YSByZXRhaW5fc3R1Yl07Ci0gIG1SZXNwb25zZURhdGFPZmZzZXQgPSAwOwotfQotCi0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzNDk5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUQXN5bmNUcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCit0eXBlZGVmIE5TRXJyb3IgKl9fbnVsbGFibGUgKF5USFRUUFNlc3Npb25UcmFuc3BvcnRSZXNwb25zZVZhbGlkYXRlQmxvY2spIChOU0hUVFBVUkxSZXNwb25zZSAqcmVzcG9uc2UsIE5TRGF0YSAqcmVzcG9uc2VEYXRhKTsKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgOiBOU09iamVjdDxUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PgorCitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBUSFRUUFNlc3Npb25UcmFuc3BvcnRSZXNwb25zZVZhbGlkYXRlQmxvY2sgcmVzcG9uc2VWYWxpZGF0ZTsKKworKyh2b2lkKSBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb246KE5TVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24gKiljb25maWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoUHJvdG9jb2xOYW1lOihOU1N0cmluZyAqKXByb3RvY29sTmFtZTsKKworLShpZCkgaW5pdFdpdGhTZXNzaW9uOihOU1VSTFNlc3Npb24gKilzZXNzaW9uCisgICAgICAgICAgICAgICAgICBVUkw6KE5TVVJMICopYVVSTDsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgVEhUVFBTZXNzaW9uVHJhbnNwb3J0IDogTlNPYmplY3QgPFRBc3luY1RyYW5zcG9ydD4KKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFNlc3Npb25UcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTBiN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBTZXNzaW9uVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEhUVFBTZXNzaW9uVHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKCkKKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkxTZXNzaW9uICpzZXNzaW9uOworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkwgKnVybDsKKworQGVuZAorCisKK0BpbnRlcmZhY2UgVEhUVFBTZXNzaW9uVHJhbnNwb3J0ICgpCisKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKmZhY3Rvcnk7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZXF1ZXN0RGF0YTsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TRGF0YSAqcmVzcG9uc2VEYXRhOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZXNwb25zZURhdGFPZmZzZXQ7CisKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aEZhY3Rvcnk6KFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkgKilmYWN0b3J5OworCitAZW5kCisKKworQGltcGxlbWVudGF0aW9uIFRIVFRQU2Vzc2lvblRyYW5zcG9ydEZhY3RvcnkKKworKyh2b2lkKSBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb246KE5TVVJMU2Vzc2lvbkNvbmZpZ3VyYXRpb24gKiljb25maWcgd2l0aFByb3RvY29sTmFtZTooTlNTdHJpbmcgKilwcm90b2NvbE5hbWUKK3sKKyAgTlNTdHJpbmcgKnRocmlmdENvbnRlbnRUeXBlID0gQCJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgIGlmIChwcm90b2NvbE5hbWUubGVuZ3RoKSB7CisgICAgdGhyaWZ0Q29udGVudFR5cGUgPSBbdGhyaWZ0Q29udGVudFR5cGUgc3RyaW5nQnlBcHBlbmRpbmdGb3JtYXQ6QCI7IHA9JUAiLCBwcm90b2NvbE5hbWVdOworICB9CisKKyAgY29uZmlnLnJlcXVlc3RDYWNoZVBvbGljeSA9IE5TVVJMUmVxdWVzdFJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhOworICBjb25maWcuSFRUUFNob3VsZFVzZVBpcGVsaW5pbmcgPSBZRVM7CisgIGNvbmZpZy5IVFRQU2hvdWxkU2V0Q29va2llcyA9IE5POworICBjb25maWcuVVJMQ2FjaGUgPSBuaWw7CisgIGNvbmZpZy5IVFRQQWRkaXRpb25hbEhlYWRlcnMgPSBAe0AiQ29udGVudC1UeXBlIjp0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJBY2NlcHQiOnRocmlmdENvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIlVzZXItQWdlbnQiOkAiVGhyaWZ0L0NvY29hIChTZXNzaW9uKSJ9OworfQorCisKKy0oaWQpIGluaXRXaXRoU2Vzc2lvbjooTlNVUkxTZXNzaW9uICopc2Vzc2lvbiBVUkw6KE5TVVJMICopdXJsCit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmIChzZWxmKSB7CisgICAgX3Nlc3Npb24gPSBzZXNzaW9uOworICAgIF91cmwgPSB1cmw7CisgIH0KKworICByZXR1cm4gc2VsZjsKK30KKworLShpZDxUQXN5bmNUcmFuc3BvcnQ+KSBuZXdUcmFuc3BvcnQKK3sKKyAgcmV0dXJuIFtbVEhUVFBTZXNzaW9uVHJhbnNwb3J0IGFsbG9jXSBpbml0V2l0aEZhY3Rvcnk6c2VsZl07Cit9CisKKy0oTlNVUkxTZXNzaW9uRGF0YVRhc2sgKikgdGFza1dpdGhSZXF1ZXN0OihOU1VSTFJlcXVlc3QgKilyZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcjoodm9pZCAoXikoTlNEYXRhICpkYXRhLCBOU1VSTFJlc3BvbnNlICpyZXNwb25zZSwgTlNFcnJvciAqZXJyb3IpKWNvbXBsZXRpb25IYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgTlNVUkxTZXNzaW9uRGF0YVRhc2sgKm5ld1Rhc2sgPSBbX3Nlc3Npb24gZGF0YVRhc2tXaXRoUmVxdWVzdDpyZXF1ZXN0IGNvbXBsZXRpb25IYW5kbGVyOmNvbXBsZXRpb25IYW5kbGVyXTsKKyAgaWYgKCFuZXdUYXNrKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7TlNMb2NhbGl6ZWREZXNjcmlwdGlvbktleTpAIkZhaWxlZCB0byBjcmVhdGUgc2Vzc2lvbiBkYXRhIHRhc2sifV07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gbmV3VGFzazsKK30KKworLShOU0Vycm9yICopIHZhbGlkYXRlUmVzcG9uc2U6KE5TSFRUUFVSTFJlc3BvbnNlICopcmVzcG9uc2UgZGF0YTooTlNEYXRhICopZGF0YQoreworICBpZiAoX3Jlc3BvbnNlVmFsaWRhdGUpIHsKKyAgICByZXR1cm4gX3Jlc3BvbnNlVmFsaWRhdGUocmVzcG9uc2UsIGRhdGEpOworICB9CisgIHJldHVybiBuaWw7Cit9CisKK0BlbmQKKworCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFNlc3Npb25UcmFuc3BvcnQKKworLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoRmFjdG9yeTooVEhUVFBTZXNzaW9uVHJhbnNwb3J0RmFjdG9yeSAqKWZhY3RvcnkKK3sKKyAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfZmFjdG9yeSA9IGZhY3Rvcnk7CisgIH0KKyAgcmV0dXJuIHNlbGY7Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVzcG9uc2VEYXRhLmxlbmd0aCAtIF9yZXNwb25zZURhdGFPZmZzZXQ7CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19yZXNwb25zZURhdGEgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9yZXNwb25zZURhdGFPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGlmICghX3JlcXVlc3REYXRhKSB7CisgICAgX3JlcXVlc3REYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhDYXBhY2l0eToyNTZdOworICB9CisKKyAgW19yZXF1ZXN0RGF0YSBhcHBlbmRCeXRlczpkYXRhK29mZnNldCBsZW5ndGg6bGVuZ3RoXTsKKworICByZXR1cm4gWUVTOworfQorCistKHZvaWQpIGZsdXNoV2l0aENvbXBsZXRpb246KFRBc3luY0NvbXBsZXRpb25CbG9jayljb21wbGV0ZWQgZmFpbHVyZTooVEFzeW5jRmFpbHVyZUJsb2NrKWZhaWx1cmUKK3sKKyAgTlNFcnJvciAqZXJyb3I7CisKKyAgTlNNdXRhYmxlVVJMUmVxdWVzdCAqcmVxdWVzdCA9IFtbTlNNdXRhYmxlVVJMUmVxdWVzdCBhbGxvY10gaW5pdFdpdGhVUkw6X2ZhY3RvcnkudXJsXTsKKyAgcmVxdWVzdC5IVFRQTWV0aG9kID0gQCJQT1NUIjsKKyAgcmVxdWVzdC5IVFRQQm9keSA9IF9yZXF1ZXN0RGF0YTsKKworICBfcmVxdWVzdERhdGEgPSBuaWw7CisKKyAgTlNVUkxTZXNzaW9uRGF0YVRhc2sgKnRhc2sgPSBbX2ZhY3RvcnkgdGFza1dpdGhSZXF1ZXN0OnJlcXVlc3QgY29tcGxldGlvbkhhbmRsZXI6XihOU0RhdGEgKmRhdGEsIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlLCBOU0Vycm9yICplcnJvcikgeworCisgICAgLy8gQ2hlY2sgcmVzcG9uc2UgdHlwZQorICAgIGlmICghZXJyb3IgJiYgIVtyZXNwb25zZSBpc0tpbmRPZkNsYXNzOk5TSFRUUFVSTFJlc3BvbnNlLmNsYXNzXSkgeworCisgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk6IEAoVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRSZXNwb25zZSl9XTsKKworICAgIH0KKworICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlCisgICAgTlNIVFRQVVJMUmVzcG9uc2UgKmh0dHBSZXNwb25zZSA9IChpZClyZXNwb25zZTsKKyAgICBpZiAoIWVycm9yICYmIGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCkgeworCisgICAgICBUSHR0cFRyYW5zcG9ydEVycm9yIGNvZGU7CisgICAgICBpZiAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxKSB7CisgICAgICAgIGNvZGUgPSBUSHR0cFRyYW5zcG9ydEVycm9yQXV0aGVudGljYXRpb247CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzOworICAgICAgfQorCisgICAgICBlcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvclVua25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInN0YXR1c0NvZGUiOkAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpfV07CisgICAgfQorCisgICAgLy8gQWxsb3cgZmFjdG9yeSB0byBjaGVjaworICAgIGlmICghZXJyb3IpIHsKKyAgICAgIGVycm9yID0gW19mYWN0b3J5IHZhbGlkYXRlUmVzcG9uc2U6aHR0cFJlc3BvbnNlIGRhdGE6ZGF0YV07CisgICAgfQorCisgICAgX3Jlc3BvbnNlRGF0YU9mZnNldCA9IDA7CisKKyAgICBpZiAoZXJyb3IpIHsKKworICAgICAgX3Jlc3BvbnNlRGF0YSA9IG5pbDsKKworICAgICAgZmFpbHVyZShlcnJvcik7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgIGlmIChkYXRhID09IG5pbCkgeworICAgICAgICBkYXRhID0gW05TRGF0YSBkYXRhXTsKKyAgICAgIH0KKworICAgICAgX3Jlc3BvbnNlRGF0YSA9IGRhdGE7CisKKyAgICAgIGNvbXBsZXRlZChzZWxmKTsKKyAgICB9CisKKyAgfSBlcnJvcjomZXJyb3JdOworCisgIGlmICghdGFzaykgeworICAgIGZhaWx1cmUoZXJyb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIFt0YXNrIHJlc3VtZV07Cit9CisKKy0oQk9PTCkgZmx1c2g6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIGRpc3BhdGNoX3NlbWFwaG9yZV90IGNvbXBsZXRlZCA9IGRpc3BhdGNoX3NlbWFwaG9yZV9jcmVhdGUoMCk7CisKKyAgX19ibG9jayBCT09MIHJlc3VsdDsKKyAgX19ibG9jayBOU0Vycm9yICppbnRlcm5hbEVycm9yOworCisgIFtzZWxmIGZsdXNoV2l0aENvbXBsZXRpb246XihpZCA8IFRBc3luY1RyYW5zcG9ydCA+IHRyYW5zcG9ydCkgeworCisgICAgcmVzdWx0ID0gWUVTOworCisgICAgZGlzcGF0Y2hfc2VtYXBob3JlX3NpZ25hbChjb21wbGV0ZWQpOworCisgIH0gZmFpbHVyZTpeKE5TRXJyb3IgKmVycm9yKSB7CisKKyAgICBpbnRlcm5hbEVycm9yID0gZXJyb3I7CisKKyAgICByZXN1bHQgPSBOTzsKKworICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoY29tcGxldGVkKTsKKworICB9XTsKKworICBkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdChjb21wbGV0ZWQsIERJU1BBVENIX1RJTUVfRk9SRVZFUik7CisKKyAgaWYgKGVycm9yKSB7CisgICAgKmVycm9yID0gaW50ZXJuYWxFcnJvcjsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMzVkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9USFRUUFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUSFRUUFRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgorCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMOworCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMCisgICAgICAgIHVzZXJBZ2VudDoobnVsbGFibGUgTlNTdHJpbmcgKil1c2VyQWdlbnQKKyAgICAgICAgICB0aW1lb3V0OihpbnQpdGltZW91dDsKKworLSh2b2lkKSBzZXRVUkw6KE5TVVJMICopYVVSTDsKKworQGVuZAorCisKK05TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVEhUVFBUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNDZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RIVFRQVHJhbnNwb3J0Lm0KQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEhUVFBUcmFuc3BvcnQuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVEhUVFBUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNVUkwgKnVybDsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TTXV0YWJsZVVSTFJlcXVlc3QgKnJlcXVlc3Q7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU011dGFibGVEYXRhICpyZXF1ZXN0RGF0YTsKK0Bwcm9wZXJ0eSAoc3Ryb25nLCBub25hdG9taWMpIE5TRGF0YSAqcmVzcG9uc2VEYXRhOworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNVSW50ZWdlciByZXNwb25zZURhdGFPZmZzZXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqdXNlckFnZW50OworQHByb3BlcnR5IChhc3NpZ24sIG5vbmF0b21pYykgTlNUaW1lSW50ZXJ2YWwgdGltZW91dDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUSFRUUFRyYW5zcG9ydAorCistKHZvaWQpIHNldHVwUmVxdWVzdAoreworICAvLyBzZXQgdXAgb3VyIHJlcXVlc3Qgb2JqZWN0IHRoYXQgd2UnbGwgdXNlIGZvciBlYWNoIHJlcXVlc3QKKyAgX3JlcXVlc3QgPSBbW05TTXV0YWJsZVVSTFJlcXVlc3QgYWxsb2NdIGluaXRXaXRoVVJMOl91cmxdOworICBbX3JlcXVlc3Qgc2V0SFRUUE1ldGhvZDpAIlBPU1QiXTsKKyAgW19yZXF1ZXN0IHNldFZhbHVlOkAiYXBwbGljYXRpb24veC10aHJpZnQiIGZvckhUVFBIZWFkZXJGaWVsZDpAIkNvbnRlbnQtVHlwZSJdOworICBbX3JlcXVlc3Qgc2V0VmFsdWU6QCJhcHBsaWNhdGlvbi94LXRocmlmdCIgZm9ySFRUUEhlYWRlckZpZWxkOkAiQWNjZXB0Il07CisKKyAgTlNTdHJpbmcgKnVzZXJBZ2VudCA9IF91c2VyQWdlbnQ7CisgIGlmICghdXNlckFnZW50KSB7CisgICAgdXNlckFnZW50ID0gQCJUaHJpZnQvQ29jb2EiOworICB9CisgIFtfcmVxdWVzdCBzZXRWYWx1ZTp1c2VyQWdlbnQgZm9ySFRUUEhlYWRlckZpZWxkOkAiVXNlci1BZ2VudCJdOworCisgIFtfcmVxdWVzdCBzZXRDYWNoZVBvbGljeTpOU1VSTFJlcXVlc3RSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YV07CisgIGlmIChfdGltZW91dCkgeworICAgIFtfcmVxdWVzdCBzZXRUaW1lb3V0SW50ZXJ2YWw6X3RpbWVvdXRdOworICB9Cit9CisKKworLShpZCkgaW5pdFdpdGhVUkw6KE5TVVJMICopYVVSTAoreworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhVUkw6YVVSTAorICAgICAgICAgICAgICAgICB1c2VyQWdlbnQ6bmlsCisgICAgICAgICAgICAgICAgICAgdGltZW91dDowXTsKK30KKworCistKGlkKSBpbml0V2l0aFVSTDooTlNVUkwgKilhVVJMCisgICAgICAgIHVzZXJBZ2VudDooTlNTdHJpbmcgKilhVXNlckFnZW50CisgICAgICAgICAgdGltZW91dDooaW50KWFUaW1lb3V0Cit7CisgIHNlbGYgPSBbc3VwZXIgaW5pdF07CisgIGlmICghc2VsZikgeworICAgIHJldHVybiBuaWw7CisgIH0KKworICBfdGltZW91dCA9IGFUaW1lb3V0OworICBfdXNlckFnZW50ID0gYVVzZXJBZ2VudDsKKyAgX3VybCA9IGFVUkw7CisKKyAgW3NlbGYgc2V0dXBSZXF1ZXN0XTsKKworICAvLyBjcmVhdGUgb3VyIHJlcXVlc3QgZGF0YSBidWZmZXIKKyAgX3JlcXVlc3REYXRhID0gW1tOU011dGFibGVEYXRhIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OjEwMjRdOworCisgIHJldHVybiBzZWxmOworfQorCistKHZvaWQpIHNldFVSTDooTlNVUkwgKilhVVJMCit7CisgIF91cmwgPSBhVVJMOworCisgIFtzZWxmIHNldHVwUmVxdWVzdF07Cit9CisKKy0oQk9PTCkgcmVhZEFsbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGdvdCA9IFtzZWxmIHJlYWRBdmFpbDpvdXRCdWZmZXIgb2Zmc2V0Om91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6bGVuZ3RoIGVycm9yOmVycm9yXTsKKyAgaWYgKGdvdCAhPSBsZW5ndGgpIHsKKworICAgIC8vIFJlcG9ydCB1bmRlcmZsb3cgb25seSBpZiByZWFkQXZhaWwgZGlkbid0IHJlcG9ydCBlcnJvciBhbHJlYWR5CisgICAgaWYgKGVycm9yICYmICEqZXJyb3IpIHsKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JFbmRPZkZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgIH0KKworICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopb3V0QnVmZmVyIG9mZnNldDooVUludDMyKW91dEJ1ZmZlck9mZnNldCBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIE5TVUludGVnZXIgYXZhaWwgPSBfcmVzcG9uc2VEYXRhLmxlbmd0aCAtIF9yZXNwb25zZURhdGFPZmZzZXQ7CisKKyAgTlNSYW5nZSByYW5nZTsKKyAgcmFuZ2UubG9jYXRpb24gPSBfcmVzcG9uc2VEYXRhT2Zmc2V0OworICByYW5nZS5sZW5ndGggPSBNSU4obWF4TGVuZ3RoLCBhdmFpbCk7CisKKyAgW19yZXNwb25zZURhdGEgZ2V0Qnl0ZXM6b3V0QnVmZmVyK291dEJ1ZmZlck9mZnNldCByYW5nZTpyYW5nZV07CisgIF9yZXNwb25zZURhdGFPZmZzZXQgKz0gcmFuZ2UubGVuZ3RoOworCisgIHJldHVybiAoVUludDMyKXJhbmdlLmxlbmd0aDsKK30KKworLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFtfcmVxdWVzdERhdGEgYXBwZW5kQnl0ZXM6ZGF0YStvZmZzZXQgbGVuZ3RoOmxlbmd0aF07CisKKyAgcmV0dXJuIFlFUzsKK30KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgW19yZXF1ZXN0IHNldEhUVFBCb2R5Ol9yZXF1ZXN0RGF0YV07CisKKyAgX3Jlc3BvbnNlRGF0YU9mZnNldCA9IDA7CisKKyAgLy8gbWFrZSB0aGUgSFRUUCByZXF1ZXN0CisgIE5TVVJMUmVzcG9uc2UgKnJlc3BvbnNlOworICBfcmVzcG9uc2VEYXRhID0gW05TVVJMQ29ubmVjdGlvbiBzZW5kU3luY2hyb25vdXNSZXF1ZXN0Ol9yZXF1ZXN0IHJldHVybmluZ1Jlc3BvbnNlOiZyZXNwb25zZSBlcnJvcjplcnJvcl07CisgIGlmICghX3Jlc3BvbnNlRGF0YSkgeworICAgIHJldHVybiBOTzsKKyAgfQorCisgIFtfcmVxdWVzdERhdGEgc2V0TGVuZ3RoOjBdOworCisgIGlmICghW3Jlc3BvbnNlIGlzS2luZE9mQ2xhc3M6TlNIVFRQVVJMUmVzcG9uc2UuY2xhc3NdKSB7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yVW5rbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7VFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5OiBAKFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkUmVzcG9uc2UpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIE5TSFRUUFVSTFJlc3BvbnNlICpodHRwUmVzcG9uc2UgPSAoTlNIVFRQVVJMUmVzcG9uc2UgKilyZXNwb25zZTsKKyAgaWYgKFtodHRwUmVzcG9uc2Ugc3RhdHVzQ29kZV0gIT0gMjAwKSB7CisgICAgaWYgKGVycm9yKSB7CisKKyAgICAgIFRIdHRwVHJhbnNwb3J0RXJyb3IgY29kZTsKKyAgICAgIGlmIChodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSA9PSA0MDEpIHsKKyAgICAgICAgY29kZSA9IFRIdHRwVHJhbnNwb3J0RXJyb3JBdXRoZW50aWNhdGlvbjsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBjb2RlID0gVEh0dHBUcmFuc3BvcnRFcnJvckludmFsaWRTdGF0dXM7CisgICAgICB9CisKKyAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUVHJhbnNwb3J0RXJyb3JVbmtub3duCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHtUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk6IEAoY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAInN0YXR1c0NvZGUiOkAoaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpfV07CisgICAgfQorICAgIHJldHVybiBOTzsKKyAgfQorCisgIHJldHVybiBZRVM7Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuaAppbmRleCBmYTRkMzcxLi42MjQ5ZDMyIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5oCkBAIC0yMCwxMCArMjAsMTggQEAKICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCAiVFRyYW5zcG9ydC5oIgogCi1AaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4gewotCU5TTXV0YWJsZURhdGEgKm1CdWZmZXI7Ci0JTlNVSW50ZWdlciBtT2Zmc2V0OwotfQotLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhOwotLSAoTlNEYXRhICopZ2V0QnVmZmVyOworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRNZW1vcnlCdWZmZXIgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KKworLShOU0RhdGEgKikgYnVmZmVyOworCistKGlkKSBpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGE7CisKKy0oaWQpIGluaXRXaXRoRGF0YU5vQ29weTooTlNNdXRhYmxlRGF0YSAqKWRhdGE7CisKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIubQppbmRleCBjMzgwMWM3Li5lYzE5Y2M4IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5tCkBAIC0xOCw1NSArMTgsMTA0IEBACiAgKi8KIAogI2ltcG9ydCAiVE1lbW9yeUJ1ZmZlci5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKwogCiAjZGVmaW5lIEdBUkJBR0VfQlVGRkVSX1NJWkUgNDA5NiAvLyA0S2lCCiAKKworQGludGVyZmFjZSBUTWVtb3J5QnVmZmVyICgpCisKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNNdXRhYmxlRGF0YSAqYnVmZmVyOworQHByb3BlcnR5KGFzc2lnbiwgbm9uYXRvbWljKSBVSW50MzIgYnVmZmVyT2Zmc2V0OworCitAZW5kCisKKwogQGltcGxlbWVudGF0aW9uIFRNZW1vcnlCdWZmZXIKLS0gKGlkKWluaXQgewotCWlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7Ci0JCW1CdWZmZXIgPSBbW05TTXV0YWJsZURhdGEgYWxsb2NdIGluaXRdOwotCQltT2Zmc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIHNlbGY7CisKKy0oaWQpIGluaXQKK3sKKyAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgeworICAgIF9idWZmZXIgPSBbTlNNdXRhYmxlRGF0YSBuZXddOworICAgIF9idWZmZXJPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBzZWxmOwogfQogCi0tIChpZClpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEgewotCWlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7Ci0JCW1CdWZmZXIgPSBbZGF0YSBtdXRhYmxlQ29weV07Ci0JCW1PZmZzZXQgPSAwOwotCX0KLQlyZXR1cm4gc2VsZjsKKy0oaWQpIGluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YQoreworICBpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgeworICAgIF9idWZmZXIgPSBbZGF0YSBtdXRhYmxlQ29weV07CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKGludClyZWFkQWxsOih1aW50OF90ICopYnVmIG9mZnNldDooaW50KW9mZiBsZW5ndGg6KGludClsZW4gewotCWlmIChbbUJ1ZmZlciBsZW5ndGhdIC0gbU9mZnNldCA8IGxlbikgewotCQlAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjpAIk5vdCBlbm91Z2ggYnl0ZXMgcmVtYWluIGluIGJ1ZmZlciJdOwotCX0KLQlbbUJ1ZmZlciBnZXRCeXRlczpidWYgcmFuZ2U6TlNNYWtlUmFuZ2UobU9mZnNldCwgbGVuKV07Ci0JbU9mZnNldCArPSBsZW47Ci0JaWYgKG1PZmZzZXQgPj0gR0FSQkFHRV9CVUZGRVJfU0laRSkgewotCQlbbUJ1ZmZlciByZXBsYWNlQnl0ZXNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIG1PZmZzZXQpIHdpdGhCeXRlczpOVUxMIGxlbmd0aDowXTsKLQkJbU9mZnNldCA9IDA7Ci0JfQotCXJldHVybiBsZW47CistKGlkKSBpbml0V2l0aERhdGFOb0NvcHk6KE5TTXV0YWJsZURhdGEgKilkYXRhCit7CisgIGlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7CisgICAgX2J1ZmZlciA9IGRhdGE7CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKyAgcmV0dXJuIHNlbGY7CiB9CiAKLS0gKHZvaWQpd3JpdGU6KGNvbnN0IHVpbnQ4X3QgKilkYXRhIG9mZnNldDoodW5zaWduZWQgaW50KW9mZnNldCBsZW5ndGg6KHVuc2lnbmVkIGludClsZW5ndGggewotCVttQnVmZmVyIGFwcGVuZEJ5dGVzOmRhdGErb2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworLShCT09MKSByZWFkQWxsOihVSW50OCAqKW91dEJ1ZmZlciBvZmZzZXQ6KFVJbnQzMilvdXRCdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gW3NlbGYgcmVhZEF2YWlsOm91dEJ1ZmZlciBvZmZzZXQ6b3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDpsZW5ndGggZXJyb3I6ZXJyb3JdOworICBpZiAoZ290ICE9IGxlbmd0aCkgeworCisgICAgLy8gUmVwb3J0IHVuZGVyZmxvdyBvbmx5IGlmIHJlYWRBdmFpbCBkaWRuJ3QgcmVwb3J0IGVycm9yIGFscmVhZHkKKyAgICBpZiAoZXJyb3IgJiYgISplcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorCisgICAgcmV0dXJuIE5POworICB9CisKKyAgcmV0dXJuIFlFUzsKIH0KIAotLSAodm9pZClmbHVzaCB7Ci0JLy8gbm9vcAorLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilvdXRCdWZmZXIgb2Zmc2V0OihVSW50MzIpb3V0QnVmZmVyT2Zmc2V0IG1heExlbmd0aDooVUludDMyKW1heExlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgVUludDMyIGF2YWlsID0gKFVJbnQzMilfYnVmZmVyLmxlbmd0aCAtIF9idWZmZXJPZmZzZXQ7CisgIGlmIChhdmFpbCA9PSAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBOU1JhbmdlIHJhbmdlOworICByYW5nZS5sb2NhdGlvbiA9IF9idWZmZXJPZmZzZXQ7CisgIHJhbmdlLmxlbmd0aCA9IE1JTihtYXhMZW5ndGgsIGF2YWlsKTsKKworICBbX2J1ZmZlciBnZXRCeXRlczpvdXRCdWZmZXIgKyBvdXRCdWZmZXJPZmZzZXQgcmFuZ2U6cmFuZ2VdOworICBfYnVmZmVyT2Zmc2V0ICs9IHJhbmdlLmxlbmd0aDsKKworICBpZiAoX2J1ZmZlck9mZnNldCA+PSBHQVJCQUdFX0JVRkZFUl9TSVpFKSB7CisgICAgW19idWZmZXIgcmVwbGFjZUJ5dGVzSW5SYW5nZTpOU01ha2VSYW5nZSgwLCBfYnVmZmVyT2Zmc2V0KSB3aXRoQnl0ZXM6TlVMTCBsZW5ndGg6MF07CisgICAgX2J1ZmZlck9mZnNldCA9IDA7CisgIH0KKworICByZXR1cm4gKFVJbnQzMilyYW5nZS5sZW5ndGg7CiB9CiAKLS0gKE5TRGF0YSAqKWdldEJ1ZmZlciB7Ci0JcmV0dXJuIFtbbUJ1ZmZlciBjb3B5XSBhdXRvcmVsZWFzZV9zdHViXTsKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopaW5CdWZmZXIgb2Zmc2V0OihVSW50MzIpaW5CdWZmZXJPZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBbX2J1ZmZlciBhcHBlbmRCeXRlczppbkJ1ZmZlciArIGluQnVmZmVyT2Zmc2V0IGxlbmd0aDpsZW5ndGhdOworCisgIHJldHVybiBZRVM7CiB9CiAKLS0gKHZvaWQpZGVhbGxvYyB7Ci0JW21CdWZmZXIgcmVsZWFzZV9zdHViXTsKLQlbc3VwZXIgZGVhbGxvY19zdHViXTsKKy0oTlNEYXRhICopIGJ1ZmZlcgoreworICByZXR1cm4gX2J1ZmZlcjsKIH0KKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKK3sKKyAgcmV0dXJuIFlFUzsKK30KKwogQGVuZApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oCmluZGV4IGJhMmEyMDkuLmRiNmVkZjMgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQuaAorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0LmgKQEAgLTIxLDE1ICsyMSwxOCBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PiB7Ci0gIE5TRmlsZUhhbmRsZSAqIG1JbnB1dEZpbGVIYW5kbGU7Ci0gIE5TRmlsZUhhbmRsZSAqIG1PdXRwdXRGaWxlSGFuZGxlOwotfQorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotLSAoaWQpIGluaXRXaXRoRmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBmaWxlSGFuZGxlOwogCi0tIChpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgaW5wdXRGaWxlSGFuZGxlCi0gICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgb3V0cHV0RmlsZUhhbmRsZTsKK0BpbnRlcmZhY2UgVE5TRmlsZUhhbmRsZVRyYW5zcG9ydCA6IE5TT2JqZWN0IDxUVHJhbnNwb3J0PgorCistKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWZpbGVIYW5kbGU7CisKKy0oaWQpIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilpbnB1dEZpbGVIYW5kbGUKKyAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilvdXRwdXRGaWxlSGFuZGxlOwogCiAKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU0ZpbGVIYW5kbGVUcmFuc3BvcnQubQppbmRleCAwZmYyMDBiLi5jOTA3Zjg3IDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNGaWxlSGFuZGxlVHJhbnNwb3J0Lm0KKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5tCkBAIC0xOSw3NSArMTksMTAwIEBACiAKIAogI2ltcG9ydCAiVE5TRmlsZUhhbmRsZVRyYW5zcG9ydC5oIgotI2ltcG9ydCAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCisjaW1wb3J0ICJUVHJhbnNwb3J0RXJyb3IuaCIKKworCitAaW50ZXJmYWNlIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU0ZpbGVIYW5kbGUgKmlucHV0RmlsZUhhbmRsZTsKK0Bwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgTlNGaWxlSGFuZGxlICpvdXRwdXRGaWxlSGFuZGxlOworCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU0ZpbGVIYW5kbGVUcmFuc3BvcnQKIAotLSAoaWQpIGluaXRXaXRoRmlsZUhhbmRsZTogKE5TRmlsZUhhbmRsZSAqKSBmaWxlSGFuZGxlCistKGlkKSBpbml0V2l0aEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWZpbGVIYW5kbGUKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRGaWxlSGFuZGxlOiBmaWxlSGFuZGxlCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZV07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZUhhbmRsZTpmaWxlSGFuZGxlXTsKIH0KIAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgaW5wdXRGaWxlSGFuZGxlCi0gICAgICAgICAgICAgIG91dHB1dEZpbGVIYW5kbGU6IChOU0ZpbGVIYW5kbGUgKikgb3V0cHV0RmlsZUhhbmRsZQorLShpZCkgaW5pdFdpdGhJbnB1dEZpbGVIYW5kbGU6KE5TRmlsZUhhbmRsZSAqKWFJbnB1dEZpbGVIYW5kbGUKKyAgICAgICAgICAgICBvdXRwdXRGaWxlSGFuZGxlOihOU0ZpbGVIYW5kbGUgKilhT3V0cHV0RmlsZUhhbmRsZQogewogICBzZWxmID0gW3N1cGVyIGluaXRdOwotCi0gIG1JbnB1dEZpbGVIYW5kbGUgPSBbaW5wdXRGaWxlSGFuZGxlIHJldGFpbl9zdHViXTsKLSAgbU91dHB1dEZpbGVIYW5kbGUgPSBbb3V0cHV0RmlsZUhhbmRsZSByZXRhaW5fc3R1Yl07Ci0KKyAgaWYgKHNlbGYpIHsKKyAgICBfaW5wdXRGaWxlSGFuZGxlID0gYUlucHV0RmlsZUhhbmRsZTsKKyAgICBfb3V0cHV0RmlsZUhhbmRsZSA9IGFPdXRwdXRGaWxlSGFuZGxlOworICB9CiAgIHJldHVybiBzZWxmOwogfQogCiAKLS0gKHZvaWQpIGRlYWxsb2MgewotICBbbUlucHV0RmlsZUhhbmRsZSByZWxlYXNlX3N0dWJdOwotICBbbU91dHB1dEZpbGVIYW5kbGUgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBsZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCit7CisgIFVJbnQzMiBnb3QgPSAwOworICB3aGlsZSAoZ290IDwgbGVuKSB7CisKKyAgICBOU0RhdGEgKmQgPSBbX2lucHV0RmlsZUhhbmRsZSByZWFkRGF0YU9mTGVuZ3RoOmxlbi1nb3RdOworICAgIGlmIChkLmxlbmd0aCA9PSAwKSB7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yRW5kT2ZGaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpuaWxdOworICAgICAgfQorICAgICAgcmV0dXJuIE5POworICAgIH0KKworICAgIFtkIGdldEJ5dGVzOmJ1Zitnb3QgbGVuZ3RoOmQubGVuZ3RoXTsKKyAgICBnb3QgKz0gZC5sZW5ndGg7CisgIH0KKyAgcmV0dXJuIFlFUzsKIH0KIAogCi0tIChpbnQpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChpbnQpIG9mZiBsZW5ndGg6IChpbnQpIGxlbgorLShVSW50MzIpIHJlYWRBdmFpbDooVUludDggKilidWYgb2Zmc2V0OihVSW50MzIpb2ZmIG1heExlbmd0aDooVUludDMyKWxlbiBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7CisgIFVJbnQzMiBnb3QgPSAwOwogICB3aGlsZSAoZ290IDwgbGVuKSB7Ci0gICAgTlNEYXRhICogZCA9IFttSW5wdXRGaWxlSGFuZGxlIHJlYWREYXRhT2ZMZW5ndGg6IGxlbi1nb3RdOwotICAgIGlmIChbZCBsZW5ndGhdID09IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoTmFtZTogQCJUVHJhbnNwb3J0RXhjZXB0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogQCJDYW5ub3QgcmVhZC4gTm8gbW9yZSBkYXRhLiJdOworCisgICAgTlNEYXRhICpkID0gW19pbnB1dEZpbGVIYW5kbGUgcmVhZERhdGFPZkxlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAoZC5sZW5ndGggPT0gMCkgeworICAgICAgYnJlYWs7CiAgICAgfQotICAgIFtkIGdldEJ5dGVzOiBidWYrZ290XTsKLSAgICBnb3QgKz0gW2QgbGVuZ3RoXTsKKworICAgIFtkIGdldEJ5dGVzOmJ1Zitnb3QgbGVuZ3RoOmQubGVuZ3RoXTsKKyAgICBnb3QgKz0gZC5sZW5ndGg7CiAgIH0KICAgcmV0dXJuIGdvdDsKIH0KIAogCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aAorLShCT09MKSB3cml0ZTooY29uc3QgVUludDggKilkYXRhIG9mZnNldDooVUludDMyKW9mZnNldCBsZW5ndGg6KFVJbnQzMilsZW5ndGggZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yCiB7Ci0gIHZvaWQgKnBvcyA9ICh2b2lkICopIGRhdGEgKyBvZmZzZXQ7Ci0gIE5TRGF0YSAqIGRhdGFPYmplY3QgPSBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhCeXRlc05vQ29weTogcG9zIC8vIGRhdGErb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVXaGVuRG9uZTogTk9dOworICB2b2lkICpwb3MgPSAodm9pZCAqKWRhdGEgKyBvZmZzZXQ7CiAKICAgQHRyeSB7Ci0gICAgW21PdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTogZGF0YU9iamVjdF07Ci0gIH0gQGNhdGNoIChOU0V4Y2VwdGlvbiAqIGUpIHsKLSAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OiBAIiVzOiBVbmFibGUgdG8gd3JpdGUgZGF0YTogJUAiLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBlXV07CisgICAgW19vdXRwdXRGaWxlSGFuZGxlIHdyaXRlRGF0YTpbTlNEYXRhIGRhdGFXaXRoQnl0ZXNOb0NvcHk6cG9zIGxlbmd0aDpsZW5ndGggZnJlZVdoZW5Eb25lOk5PXV07CisgIH0KKyAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZSkgeworICAgIGlmIChlcnJvcikgeworICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzpAe31dOworICAgIH0KKyAgICByZXR1cm4gTk87CiAgIH0KIAotICBbZGF0YU9iamVjdCByZWxlYXNlX3N0dWJdOworICByZXR1cm4gWUVTOwogfQogCiAKLS0gKHZvaWQpIGZsdXNoCistKEJPT0wpIGZsdXNoOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotCisgIHJldHVybiBZRVM7CiB9CiAKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmgKaW5kZXggZDdiZTQwYi4uNTRjNDg4NCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0LmgKQEAgLTIwLDE5ICsyMCwyNCBAQAogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1wb3J0ICJUVHJhbnNwb3J0LmgiCiAKLUBpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0IDogTlNPYmplY3QgPFRUcmFuc3BvcnQ+IHsKLSAgTlNJbnB1dFN0cmVhbSAqIG1JbnB1dDsKLSAgTlNPdXRwdXRTdHJlYW0gKiBtT3V0cHV0OwotfQorTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KIAotLSAoaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06IChOU0lucHV0U3RyZWFtICopIGlucHV0Ci0gICAgICAgICAgICAgIG91dHB1dFN0cmVhbTogKE5TT3V0cHV0U3RyZWFtICopIG91dHB1dDsKIAotLSAoaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06IChOU0lucHV0U3RyZWFtICopIGlucHV0OworQGludGVyZmFjZSBUTlNTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCA8VFRyYW5zcG9ydD4KIAotLSAoaWQpIGluaXRXaXRoT3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0OworQHByb3BlcnR5IChzdHJvbmcsIG5vbmF0b21pYykgTlNJbnB1dFN0cmVhbSAqaW5wdXQ7CitAcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBOU091dHB1dFN0cmVhbSAqb3V0cHV0OworCistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihudWxsYWJsZSBOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KG51bGxhYmxlIE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OworCistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQ7CisKKy0oaWQpIGluaXRXaXRoT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dDsKKworLSh2b2lkKSBjbG9zZTsKIAogQGVuZAogCiAKLQorTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tCmluZGV4IDI2NWUwYmEuLjE4YzQxZDMgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1ROU1N0cmVhbVRyYW5zcG9ydC5tCkBAIC0xOCw3MyArMTgsMTM2IEBACiAgKi8KIAogI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0jaW1wb3J0ICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW1wb3J0ICJUT2JqZWN0aXZlLUMuaCIKKyNpbXBvcnQgIlRUcmFuc3BvcnRFcnJvci5oIgorCisKK0BpbnRlcmZhY2UgVE5TU3RyZWFtVHJhbnNwb3J0ICgpCitAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFROU1N0cmVhbVRyYW5zcG9ydAogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKLSAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aElucHV0U3RyZWFtOihOU0lucHV0U3RyZWFtICopaW5wdXQKKyAgICAgICAgICAgICBvdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0CiB7CiAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIG1JbnB1dCA9IFtpbnB1dCByZXRhaW5fc3R1Yl07Ci0gIG1PdXRwdXQgPSBbb3V0cHV0IHJldGFpbl9zdHViXTsKKyAgaWYgKHNlbGYpIHsKKyAgICBfaW5wdXQgPSBpbnB1dDsKKyAgICBfb3V0cHV0ID0gb3V0cHV0OworICB9CiAgIHJldHVybiBzZWxmOwogfQogCi0tIChpZCkgaW5pdFdpdGhJbnB1dFN0cmVhbTogKE5TSW5wdXRTdHJlYW0gKikgaW5wdXQKKy0oaWQpIGluaXRXaXRoSW5wdXRTdHJlYW06KE5TSW5wdXRTdHJlYW0gKilpbnB1dAogewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXQgb3V0cHV0U3RyZWFtOiBuaWxdOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dCBvdXRwdXRTdHJlYW06bmlsXTsKIH0KIAotLSAoaWQpIGluaXRXaXRoT3V0cHV0U3RyZWFtOiAoTlNPdXRwdXRTdHJlYW0gKikgb3V0cHV0CistKGlkKSBpbml0V2l0aE91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQKIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoSW5wdXRTdHJlYW06IG5pbCBvdXRwdXRTdHJlYW06IG91dHB1dF07CisgIHJldHVybiBbc2VsZiBpbml0V2l0aElucHV0U3RyZWFtOm5pbCBvdXRwdXRTdHJlYW06b3V0cHV0XTsKIH0KIAotLSAodm9pZCkgZGVhbGxvYworLSh2b2lkKSBkZWFsbG9jCiB7Ci0gIFttSW5wdXQgcmVsZWFzZV9zdHViXTsKLSAgW21PdXRwdXQgcmVsZWFzZV9zdHViXTsKLSAgW3N1cGVyIGRlYWxsb2Nfc3R1Yl07CisgIFtzZWxmIGNsb3NlXTsKIH0KIAotCi0tIChpbnQpIHJlYWRBbGw6ICh1aW50OF90ICopIGJ1ZiBvZmZzZXQ6IChpbnQpIG9mZiBsZW5ndGg6IChpbnQpIGxlbgorLShCT09MKSByZWFkQWxsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgogewotICBpbnQgZ290ID0gMDsKLSAgaW50IHJldCA9IDA7CisgIFVJbnQzMiBnb3QgPSAwOwogICB3aGlsZSAoZ290IDwgbGVuKSB7Ci0gICAgcmV0ID0gW21JbnB1dCByZWFkOiBidWYrb2ZmK2dvdCBtYXhMZW5ndGg6IGxlbi1nb3RdOwotICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgQHRocm93IFtUVHJhbnNwb3J0RXhjZXB0aW9uIGV4Y2VwdGlvbldpdGhSZWFzb246IEAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIl07CisKKyAgICBVSW50MzIgcmVhZCA9IChVSW50MzIpW19pbnB1dCByZWFkOmJ1ZitvZmYrZ290IG1heExlbmd0aDpsZW4tZ290XTsKKyAgICBpZiAocmVhZCA8PSAwKSB7CisgICAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFRyYW5zcG9ydEVycm9yTm90T3BlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKICAgICB9Ci0gICAgZ290ICs9IHJldDsKKworICAgIGdvdCArPSByZWFkOwogICB9CisKKyAgcmV0dXJuIFlFUzsKK30KKworCistKFVJbnQzMikgcmVhZEF2YWlsOihVSW50OCAqKWJ1ZiBvZmZzZXQ6KFVJbnQzMilvZmYgbWF4TGVuZ3RoOihVSW50MzIpbGVuIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcgoreworICBVSW50MzIgZ290ID0gMDsKKyAgd2hpbGUgKGdvdCA8IGxlbikgeworCisgICAgVUludDMyIHJlYWQgPSAoVUludDMyKVtfaW5wdXQgcmVhZDpidWYrb2ZmK2dvdCBtYXhMZW5ndGg6bGVuLWdvdF07CisgICAgaWYgKHJlYWQgPD0gMCkgeworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ290ICs9IHJlYWQ7CisgIH0KKwogICByZXR1cm4gZ290OwogfQogCiAKLS0gKHZvaWQpIHdyaXRlOiAoY29uc3QgdWludDhfdCAqKSBkYXRhIG9mZnNldDogKHVuc2lnbmVkIGludCkgb2Zmc2V0IGxlbmd0aDogKHVuc2lnbmVkIGludCkgbGVuZ3RoCistKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7Ci0gIGludCByZXN1bHQgPSAwOworICBVSW50MzIgZ290ID0gMDsKKyAgTlNJbnRlZ2VyIHRvdGFsID0gMDsKICAgd2hpbGUgKGdvdCA8IGxlbmd0aCkgewotICAgIHJlc3VsdCA9IFttT3V0cHV0IHdyaXRlOiBkYXRhK29mZnNldCtnb3QgbWF4TGVuZ3RoOiBsZW5ndGgtZ290XTsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICBAdGhyb3cgW1RUcmFuc3BvcnRFeGNlcHRpb24gZXhjZXB0aW9uV2l0aFJlYXNvbjogQCJFcnJvciB3cml0aW5nIHRvIHRyYW5zcG9ydCBvdXRwdXQgc3RyZWFtLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBbbU91dHB1dCBzdHJlYW1FcnJvcl1dOwotICAgIH0gZWxzZSBpZiAocmVzdWx0ID09IDApIHsKLSAgICAgIEB0aHJvdyBbVFRyYW5zcG9ydEV4Y2VwdGlvbiBleGNlcHRpb25XaXRoUmVhc29uOiBAIkVuZCBvZiBvdXRwdXQgc3RyZWFtLiJdOworCisgICAgdG90YWwgPSBbX291dHB1dCB3cml0ZTpkYXRhK29mZnNldCtnb3QgbWF4TGVuZ3RoOmxlbmd0aC1nb3RdOworICAgIGlmICh0b3RhbCA9PSAtMSkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvck5vdE9wZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOkB7fV07CisgICAgICB9CisgICAgICByZXR1cm4gTk87CiAgICAgfQotICAgIGdvdCArPSByZXN1bHQ7CisgICAgZWxzZSBpZiAodG90YWwgPT0gMCkgeworICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICplcnJvciA9IFtOU0Vycm9yIGVycm9yV2l0aERvbWFpbjpUVHJhbnNwb3J0RXJyb3JEb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOlRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86QHt9XTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgICBnb3QgKz0gdG90YWw7CiAgIH0KKworICByZXR1cm4gWUVTOwogfQogCi0tICh2b2lkKSBmbHVzaAorLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgLy8gbm8gZmx1c2ggZm9yIHlvdSEKKyAgcmV0dXJuIFlFUzsKK30KKworLSh2b2lkKSBjbG9zZQoreworICBOU0lucHV0U3RyZWFtICppbnB1dCA9IHNlbGYuaW5wdXQ7CisgIGlmIChpbnB1dCkgeworICAgIC8vIENsb3NlIGFuZCByZXNldCBpbnB1dHN0cmVhbQorICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChfX2JyaWRnZSBDRlJlYWRTdHJlYW1SZWYpKGlucHV0KSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIFtpbnB1dCBzZXREZWxlZ2F0ZTpuaWxdOworICAgIFtpbnB1dCBjbG9zZV07CisgICAgW2lucHV0IHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIGlucHV0ID0gbmlsOworICB9CisKKyAgTlNPdXRwdXRTdHJlYW0gKm91dHB1dCA9IHNlbGYub3V0cHV0OworICBpZiAob3V0cHV0KSB7CisgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IG91dHB1dHN0cmVhbQorICAgIENGV3JpdGVTdHJlYW1TZXRQcm9wZXJ0eSgoX19icmlkZ2UgQ0ZXcml0ZVN0cmVhbVJlZikob3V0cHV0KSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOworICAgIFtvdXRwdXQgc2V0RGVsZWdhdGU6bmlsXTsKKyAgICBbb3V0cHV0IGNsb3NlXTsKKyAgICBbb3V0cHV0IHJlbW92ZUZyb21SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIG91dHB1dCA9IG5pbDsKKyAgfQogfQogCiBAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0VHJhbnNwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNmM0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgorI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCisKK05TX0FTU1VNRV9OT05OVUxMX0JFR0lOCisKKworQGludGVyZmFjZSBUU1NMU29ja2V0VHJhbnNwb3J0IDogVE5TU3RyZWFtVHJhbnNwb3J0IDxOU1N0cmVhbURlbGVnYXRlPgorCistKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCisgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvcjsKKworLShCT09MKSBpc09wZW47CisKK0BlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnQubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjEyMTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydC5tCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKyNpbXBvcnQgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUU1NMU29ja2V0VHJhbnNwb3J0LmgiCisjaW1wb3J0ICJUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IuaCIKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2Vsc2UKKyNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KKyNlbmRpZgorCitAaW50ZXJmYWNlIFRTU0xTb2NrZXRUcmFuc3BvcnQgKCkKKworQHByb3BlcnR5KHN0cm9uZywgbm9uYXRvbWljKSBOU1N0cmluZyAqc3NsSG9zdG5hbWU7CitAcHJvcGVydHkoYXNzaWduLCBub25hdG9taWMpIGludCBzZDsKKworQGVuZAorCisKK0BpbXBsZW1lbnRhdGlvbiBUU1NMU29ja2V0VHJhbnNwb3J0CisKKy0oaWQpIGluaXRXaXRoSG9zdG5hbWU6KE5TU3RyaW5nICopaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgIHBvcnQ6KGludClwb3J0CisgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yCit7CisgIF9zc2xIb3N0bmFtZSA9IGhvc3RuYW1lOworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworCisKKyAgLyogY3JlYXRlIGEgc29ja2V0IHN0cnVjdHVyZSAqLworICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcGluOworICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKworCisKKyAgICBpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShbaG9zdG5hbWUgVVRGOFN0cmluZ10pKSA9PSBOVUxMKSB7CisgICAgICBOU0xvZyhAImZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lICVAIiwgaG9zdG5hbWUpOworICAgICAgaGVycm9yKCJyZXNvbHYiKTsKKyAgICAgIGlmIChpID09IDkpIHsKKyAgICAgICAgaWYgKGVycm9yKSB7CisgICAgICAgICAgKmVycm9yID0gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JIb3N0YW5hbWVSZXNvbHV0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICAgIH0KKyAgICAgIFtOU1RocmVhZCBzbGVlcEZvclRpbWVJbnRlcnZhbDowLjJdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIG1lbXNldCgmcGluLCAwLCBzaXplb2YocGluKSk7CisgIHBpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgbWVtY3B5KCZwaW4uc2luX2FkZHIsIGhwLT5oX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworICBwaW4uc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICBpZiAoKF9zZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApKSA9PSAtMSkgeworICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQgZm9yIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yU29ja2V0Q3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86bmlsXTsKKyAgICB9CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCisgIGlmIChjb25uZWN0KF9zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZwaW4sIHNpemVvZihwaW4pKSA9PSAtMSkgeworICAgIE5TTG9nKEAiZmFpbGVkIHRvIGNyZWF0ZSBjb25lbmN0IHRvIGhvc3QgJUA6JWQiLCBob3N0bmFtZSwgcG9ydCk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAqZXJyb3IgPSBbTlNFcnJvciBlcnJvcldpdGhEb21haW46VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6VFNTTFNvY2tldFRyYW5zcG9ydEVycm9yQ29ubmVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbmZvOm5pbF07CisgICAgfQorICAgIHJldHVybiBuaWw7CisgIH0KKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBfc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworCisgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtLCBrQ0ZTdHJlYW1Qcm9wZXJ0eVNob3VsZENsb3NlTmF0aXZlU29ja2V0LCBrQ0ZCb29sZWFuVHJ1ZSk7CisKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXRTdHJlYW07CisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW07CisKKyAgaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyZWFtUHJvcGVydHlTb2NrZXRTZWN1cml0eUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmVhbVNvY2tldFNlY3VyaXR5TGV2ZWxUTFN2MSk7CisKKyAgICBOU0RpY3Rpb25hcnkgKnNldHRpbmdzID0gQHsoX19icmlkZ2UgTlNTdHJpbmcgKilrQ0ZTdHJlYW1TU0xWYWxpZGF0ZXNDZXJ0aWZpY2F0ZUNoYWluOiBAWUVTfTsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KChDRlJlYWRTdHJlYW1SZWYpcmVhZFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRlR5cGVSZWYpc2V0dGluZ3MpOworCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KChDRldyaXRlU3RyZWFtUmVmKXdyaXRlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZUeXBlUmVmKXNldHRpbmdzKTsKKworICAgIGlucHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOworICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbaW5wdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6W05TUnVuTG9vcCBjdXJyZW50UnVuTG9vcF0gZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW2lucHV0U3RyZWFtIG9wZW5dOworCisgICAgb3V0cHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07CisgICAgW291dHB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtvdXRwdXRTdHJlYW0gb3Blbl07CisKKyAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7CisgICAgQ0ZSZWxlYXNlKHdyaXRlU3RyZWFtKTsKKyAgfQorCisgIHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKKworICByZXR1cm4gc2VsZjsKK30KKworLSh2b2lkKSBkZWFsbG9jCit7CisgIFtzZWxmIGNsb3NlXTsKK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBOU1N0cmVhbURlbGVnYXRlCisKKy0odm9pZCkgc3RyZWFtOihOU1N0cmVhbSAqKWFTdHJlYW0KKyAgIGhhbmRsZUV2ZW50OihOU1N0cmVhbUV2ZW50KWV2ZW50Q29kZQoreworICBzd2l0Y2ggKGV2ZW50Q29kZSkgeworICBjYXNlIE5TU3RyZWFtRXZlbnROb25lOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlOgorICAgIGJyZWFrOworCisgIGNhc2UgTlNTdHJlYW1FdmVudE9wZW5Db21wbGV0ZWQ6CisgICAgYnJlYWs7CisKKyAgY2FzZSBOU1N0cmVhbUV2ZW50SGFzU3BhY2VBdmFpbGFibGU6IHsKKworICAgIEJPT0wgcHJvY2VlZCA9IE5POworICAgIFNlY1RydXN0UmVzdWx0VHlwZSB0cnVzdFJlc3VsdCA9IGtTZWNUcnVzdFJlc3VsdEludmFsaWQ7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgbmV3UG9saWNpZXMgPSBOVUxMOworCisgICAgZG8geworCisgICAgICBTZWNUcnVzdFJlZiB0cnVzdCA9IChfX2JyaWRnZSBTZWNUcnVzdFJlZilbYVN0cmVhbSBwcm9wZXJ0eUZvcktleTooTlNTdHJpbmcgKilrQ0ZTdHJlYW1Qcm9wZXJ0eVNTTFBlZXJUcnVzdF07CisKKyAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgU2VjUG9saWN5UmVmIHBvbGljeSA9IFNlY1BvbGljeUNyZWF0ZVNTTChOTywgKF9fYnJpZGdlIENGU3RyaW5nUmVmKShfc3NsSG9zdG5hbWUpKTsKKyAgICAgIGlmICghcG9saWN5KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBDRkFycmF5UmVmIHBvbGljaWVzOworICAgICAgaWYgKFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCAmcG9saWNpZXMpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHBvbGljeSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShOVUxMLCAwLCBwb2xpY2llcyk7CisgICAgICBDRkFycmF5QXBwZW5kVmFsdWUobmV3UG9saWNpZXMsIHBvbGljeSk7CisKKyAgICAgIENGUmVsZWFzZShwb2xpY2llcyk7CisgICAgICBDRlJlbGVhc2UocG9saWN5KTsKKworICAgICAgLy8gVXBkYXRlIHRydXN0IHBvbGljaWVzCisgICAgICBpZiAoU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIEV2YWx1YXRlIHRoZSB0cnVzdCBjaGFpbgorICAgICAgaWYgKFNlY1RydXN0RXZhbHVhdGUodHJ1c3QsICZ0cnVzdFJlc3VsdCkgIT0gZXJyU2VjU3VjY2VzcykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgc3dpdGNoICh0cnVzdFJlc3VsdCkgeworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRQcm9jZWVkOgorICAgICAgICAvLyBOU0xvZyhAIlRydXN0ZWQgYnkgVVNFUiIpOworICAgICAgICBwcm9jZWVkID0gWUVTOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRVbnNwZWNpZmllZDoKKyAgICAgICAgLy8gTlNMb2coQCJUcnVzdGVkIGJ5IE9TIik7CisgICAgICAgIHByb2NlZWQgPSBZRVM7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdFJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICBwcm9jZWVkID0gcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUodHJ1c3QsIHRydXN0UmVzdWx0KTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2Uga1NlY1RydXN0UmVzdWx0RGVueToKKyAgICAgICAgLy8gTlNMb2coQCJEZW55Iik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdEZhdGFsVHJ1c3RGYWlsdXJlOgorICAgICAgICAvLyBOU0xvZyhAIkZhdGFsVHJ1c3RGYWlsdXJlIik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIGtTZWNUcnVzdFJlc3VsdE90aGVyRXJyb3I6CisgICAgICAgIC8vIE5TTG9nKEAiT3RoZXJFcnJvciIpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkOgorICAgICAgICAvLyBOU0xvZyhAIkludmFsaWQiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIE5TTG9nKEAiRGVmYXVsdCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIH0KKyAgICB3aGlsZSAoTk8pOworCisgICAgaWYgKCFwcm9jZWVkKSB7CisgICAgICBOU0xvZyhAIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gUmVzdWx0OiAldSIsIHRydXN0UmVzdWx0KTsKKyAgICAgIFthU3RyZWFtIGNsb3NlXTsKKyAgICB9CisKKyAgICBpZiAobmV3UG9saWNpZXMpIHsKKyAgICAgIENGUmVsZWFzZShuZXdQb2xpY2llcyk7CisgICAgfQorCisgIH0KKyAgYnJlYWs7CisKKyAgY2FzZSBOU1N0cmVhbUV2ZW50RXJyb3JPY2N1cnJlZDogeworICAgIE5TTG9nKEAiVFNTTFNvY2tldFRyYW5zcG9ydDogRXJyb3Igb2NjdXJyZWQgb3BlbmluZyBzdHJlYW06ICVAIiwgW2FTdHJlYW0gc3RyZWFtRXJyb3JdKTsKKyAgICBicmVhazsKKyAgfQorCisgIGNhc2UgTlNTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgIGJyZWFrOworICB9Cit9CisKK0JPT0wgcmVjb3ZlckZyb21UcnVzdEZhaWx1cmUoU2VjVHJ1c3RSZWYgbXlUcnVzdCwgU2VjVHJ1c3RSZXN1bHRUeXBlIGxhc3RUcnVzdFJlc3VsdCkKK3sKKyAgQ0ZBYnNvbHV0ZVRpbWUgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpOworICBDRkFic29sdXRlVGltZSBjdXJyZW50VGltZSA9IENGQWJzb2x1dGVUaW1lR2V0Q3VycmVudCgpOworCisgIENGQWJzb2x1dGVUaW1lIHRpbWVJbmNyZW1lbnQgPSAzMTUzNjAwMDsKKyAgQ0ZBYnNvbHV0ZVRpbWUgbmV3VGltZSA9IGN1cnJlbnRUaW1lIC0gdGltZUluY3JlbWVudDsKKworICBpZiAodHJ1c3RUaW1lIC0gbmV3VGltZSkgeworCisgICAgQ0ZEYXRlUmVmIG5ld0RhdGUgPSBDRkRhdGVDcmVhdGUoTlVMTCwgbmV3VGltZSk7CisgICAgU2VjVHJ1c3RTZXRWZXJpZnlEYXRlKG15VHJ1c3QsIG5ld0RhdGUpOworICAgIENGUmVsZWFzZShuZXdEYXRlKTsKKworICAgIGlmIChTZWNUcnVzdEV2YWx1YXRlKG15VHJ1c3QsICZsYXN0VHJ1c3RSZXN1bHQpICE9IGVyclNlY1N1Y2Nlc3MpIHsKKyAgICAgIHJldHVybiBOTzsKKyAgICB9CisKKyAgfQorCisgIGlmIChsYXN0VHJ1c3RSZXN1bHQgPT0ga1NlY1RydXN0UmVzdWx0UHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0ga1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQpIHsKKyAgICByZXR1cm4gWUVTOworICB9CisKKyAgTlNMb2coQCJUU1NMU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gcmVjb3ZlciBjZXJ0aWZpY2F0ZSB0cnVzdCBmYWlsdXJlIik7CisgIHJldHVybiBZRVM7Cit9CisKKy0oQk9PTCkgaXNPcGVuCit7CisgIGlmIChfc2QgPiAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK0BlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3ZjM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JEb21haW47CisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcikgeworICBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3JIb3N0YW5hbWVSZXNvbHV0aW9uICA9IC0xMDAwMCwKKyAgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yU29ja2V0Q3JlYXRlICAgICAgICAgPSAtMTAwMDEsCisgIFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckNvbm5lY3QgICAgICAgICAgICAgID0gLTEwMDAyLAorfTsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmOTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXRUcmFuc3BvcnRFcnJvci5tCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvckRvbWFpbiA9IEAiVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yRG9tYWluIjsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyODUwZi4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCAiVE5TU3RyZWFtVHJhbnNwb3J0LmgiCi0KLUBpbnRlcmZhY2UgVFNvY2tldENsaWVudCA6IFROU1N0cmVhbVRyYW5zcG9ydCAKLSNpZiBUQVJHRVRfT1NfSVBIT05FIHx8IChNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNikKLTxOU1N0cmVhbURlbGVnYXRlPgotI2VuZGlmCi17Ci19Ci0KLS0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0OwotCi1AZW5kCi0KLQotCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0Q2xpZW50Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NmVjZjMuLjAwMDAwMDAKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldENsaWVudC5tCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotI2ltcG9ydCAiVFNvY2tldENsaWVudC5oIgotI2ltcG9ydCAiVE9iamVjdGl2ZS1DLmgiCi0KLSNpZiAhVEFSR0VUX09TX0lQSE9ORQotI2ltcG9ydCA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2Vsc2UKLSNpbXBvcnQgPENGTmV0d29yay9DRk5ldHdvcmsuaD4KLSNlbmRpZgotCi1AaW1wbGVtZW50YXRpb24gVFNvY2tldENsaWVudAotCi0tIChpZCkgaW5pdFdpdGhIb3N0bmFtZTogKE5TU3RyaW5nICopIGhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICAgcG9ydDogKGludCkgcG9ydAotewotCU5TSW5wdXRTdHJlYW0gKiBpbnB1dFN0cmVhbSA9IE5VTEw7Ci0JTlNPdXRwdXRTdHJlYW0gKiBvdXRwdXRTdHJlYW0gPSBOVUxMOwotCUNGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKLQlDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKLQlDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0VG9Ib3N0KGtDRkFsbG9jYXRvckRlZmF1bHQsIChicmlkZ2Vfc3R1YiBDRlN0cmluZ1JlZilob3N0bmFtZSwgcG9ydCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7Ci0JaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKLQkJQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbSwga0NGU3RyZWFtUHJvcGVydHlTaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpOwotCQlDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKLQkJCi0JCWlucHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOwotCQlbaW5wdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbaW5wdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07Ci0JCVtpbnB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpbTlNSdW5Mb29wIGN1cnJlbnRSdW5Mb29wXSBmb3JNb2RlOk5TRGVmYXVsdFJ1bkxvb3BNb2RlXTsKLQkJW2lucHV0U3RyZWFtIG9wZW5dOwotCQkKLQkJb3V0cHV0U3RyZWFtID0gKGJyaWRnZV9zdHViIE5TT3V0cHV0U3RyZWFtICopd3JpdGVTdHJlYW07Ci0JCVtvdXRwdXRTdHJlYW0gcmV0YWluX3N0dWJdOwotCQlbb3V0cHV0U3RyZWFtIHNldERlbGVnYXRlOnNlbGZdOwotCQlbb3V0cHV0U3RyZWFtIHNjaGVkdWxlSW5SdW5Mb29wOltOU1J1bkxvb3AgY3VycmVudFJ1bkxvb3BdIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOwotCQlbb3V0cHV0U3RyZWFtIG9wZW5dOwotICAgICAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7Ci0gICAgICAgIENGUmVsZWFzZSh3cml0ZVN0cmVhbSk7Ci0JfQotCQotCXNlbGYgPSBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTogaW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW1dOwotCQotCXJldHVybiBzZWxmOwotfQotCi0KLUBlbmQKLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I5MWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CisjaW1wb3J0ICJUTlNTdHJlYW1UcmFuc3BvcnQuaCIKKworTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KKworCitAaW50ZXJmYWNlIFRTb2NrZXRUcmFuc3BvcnQgOiBUTlNTdHJlYW1UcmFuc3BvcnQKKworLShpZCkgaW5pdFdpdGhIb3N0bmFtZTooTlNTdHJpbmcgKilob3N0bmFtZQorICAgICAgICAgICAgICAgICAgcG9ydDooaW50KXBvcnQ7CisKKy0oaWQpIGluaXRXaXRoUGF0aDooTlNTdHJpbmcgKilwYXRoOworCitAZW5kCisKKworTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1OGFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2ltcG9ydCAiVFNvY2tldFRyYW5zcG9ydC5oIgorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyNpbXBvcnQgPENvcmVTZXJ2aWNlcy9Db3JlU2VydmljZXMuaD4KKyNlbHNlCisjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKK0BpbnRlcmZhY2UgVFNvY2tldFRyYW5zcG9ydCAoKSA8TlNTdHJlYW1EZWxlZ2F0ZT4KK0BlbmQKKworCitAaW1wbGVtZW50YXRpb24gVFNvY2tldFRyYW5zcG9ydAorCistIChpZCkgaW5pdFdpdGhSZWFkU3RyZWFtOiAoQ0ZSZWFkU3RyZWFtUmVmKSByZWFkU3RyZWFtIHdyaXRlU3RyZWFtOiAoQ0ZXcml0ZVN0cmVhbVJlZikgd3JpdGVTdHJlYW0KK3sKKyAgTlNJbnB1dFN0cmVhbSAqaW5wdXRTdHJlYW0gPSBuaWw7CisgIE5TT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBuaWw7CisKKyAgaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKKworICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKyAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKKworICAgIGlucHV0U3RyZWFtID0gKF9fYnJpZGdlIE5TSW5wdXRTdHJlYW0gKilyZWFkU3RyZWFtOworICAgIFtpbnB1dFN0cmVhbSBzZXREZWxlZ2F0ZTpzZWxmXTsKKyAgICBbaW5wdXRTdHJlYW0gc2NoZWR1bGVJblJ1bkxvb3A6TlNSdW5Mb29wLmN1cnJlbnRSdW5Mb29wIGZvck1vZGU6TlNEZWZhdWx0UnVuTG9vcE1vZGVdOworICAgIFtpbnB1dFN0cmVhbSBvcGVuXTsKKworICAgIG91dHB1dFN0cmVhbSA9IChfX2JyaWRnZSBOU091dHB1dFN0cmVhbSAqKXdyaXRlU3RyZWFtOworICAgIFtvdXRwdXRTdHJlYW0gc2V0RGVsZWdhdGU6c2VsZl07CisgICAgW291dHB1dFN0cmVhbSBzY2hlZHVsZUluUnVuTG9vcDpOU1J1bkxvb3AuY3VycmVudFJ1bkxvb3AgZm9yTW9kZTpOU0RlZmF1bHRSdW5Mb29wTW9kZV07CisgICAgW291dHB1dFN0cmVhbSBvcGVuXTsKKyAgfQorICBlbHNlIHsKKworICAgIGlmIChyZWFkU3RyZWFtKSB7CisgICAgICBDRlJlbGVhc2UocmVhZFN0cmVhbSk7CisgICAgfQorCisgICAgaWYgKHdyaXRlU3RyZWFtKSB7CisgICAgICBDRlJlbGVhc2Uod3JpdGVTdHJlYW0pOworICAgIH0KKworICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gW3N1cGVyIGluaXRXaXRoSW5wdXRTdHJlYW06aW5wdXRTdHJlYW0gb3V0cHV0U3RyZWFtOm91dHB1dFN0cmVhbV07Cit9CisKKy0gKGlkKSBpbml0V2l0aEhvc3RuYW1lOiAoTlNTdHJpbmcgKikgaG9zdG5hbWUKKyAgICAgICAgICAgICAgICAgICBwb3J0OiAoaW50KSBwb3J0Cit7CisgIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKKyAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKF9fYnJpZGdlIENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoUmVhZFN0cmVhbTpyZWFkU3RyZWFtIHdyaXRlU3RyZWFtOndyaXRlU3RyZWFtXTsKK30KKworLSAoaWQpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKK3sKKyAgQ0ZTb2NrZXROYXRpdmVIYW5kbGUgc29ja2ZkID0gc29ja2V0KEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIGludCB5ZXMgPSAxOworICBpZiAoc2V0c29ja29wdChzb2NrZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgc2l6ZW9mKHllcykpIDwgMCkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIHNldCBSRVVTRUFERFIgcHJvcGVydHkgb2Ygc29ja2V0LiIpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBOU0RhdGEgKnNlcnZlckFkZHJlc3MgPSBbW3NlbGYgY2xhc3NdIGNyZWF0ZUFkZHJlc3NXaXRoUGF0aDpwYXRoXTsKKworICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IE5VTEw7CisgIENGV3JpdGVTdHJlYW1SZWYgd3JpdGVTdHJlYW0gPSBOVUxMOworICBDRlN0cmVhbUNyZWF0ZVBhaXJXaXRoU29ja2V0KGtDRkFsbG9jYXRvckRlZmF1bHQsIHNvY2tmZCwgJnJlYWRTdHJlYW0sICZ3cml0ZVN0cmVhbSk7CisgIGlmICghcmVhZFN0cmVhbSB8fCAhd3JpdGVTdHJlYW0pCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byBjcmVhdGUgcmVhZC93cml0ZSBzdHJlYW0gcGFpciBmb3Igc29ja2V0LiIpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBpZiAoY29ubmVjdChzb2NrZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilzZXJ2ZXJBZGRyZXNzLmJ5dGVzLCAoc29ja2xlbl90KSBzZXJ2ZXJBZGRyZXNzLmxlbmd0aCkgPCAwKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBDb25uZWN0IGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgcmV0dXJuIFtzZWxmIGluaXRXaXRoUmVhZFN0cmVhbTpyZWFkU3RyZWFtIHdyaXRlU3RyZWFtOndyaXRlU3RyZWFtXTsKK30KKworKyAoTlNEYXRhICopIGNyZWF0ZUFkZHJlc3NXaXRoUGF0aDogKE5TU3RyaW5nICopcGF0aAoreworICBzdHJ1Y3Qgc29ja2FkZHJfdW4gc2VydmFkZHI7CisKKyAgc2l6ZV90IG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoICsgMTsKKyAgaWYgKG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aD4gc2l6ZW9mKHNlcnZhZGRyLnN1bl9wYXRoKSkgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQgYXQgcGF0aCAlQC4gUGF0aCBpcyB0b28gbG9uZy4iLCBwYXRoKTsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgYnplcm8oJnNlcnZhZGRyLHNpemVvZihzZXJ2YWRkcikpOworICBzZXJ2YWRkci5zdW5fZmFtaWx5ID0gQUZfTE9DQUw7CisgIG1lbWNweShzZXJ2YWRkci5zdW5fcGF0aCwgcGF0aC5VVEY4U3RyaW5nLCBudWxsVGVybWluYXRlZFBhdGhMZW5ndGgpOworICBzZXJ2YWRkci5zdW5fbGVuID0gU1VOX0xFTigmc2VydmFkZHIpOworCisgIHJldHVybiBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JnNlcnZhZGRyIGxlbmd0aDpzaXplb2Yoc2VydmFkZHIpXTsKK30KKworCitAZW5kCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmggYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKaW5kZXggNjFlYmJkMi4uNTU4Y2Y2MCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaApAQCAtMTcsMjAgKzE3LDMyIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworCitOU19BU1NVTUVfTk9OTlVMTF9CRUdJTgorCisKIEBwcm90b2NvbCBUVHJhbnNwb3J0IDxOU09iamVjdD4KIAotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IGFsbCBvZiBsZW4gYnl0ZXMgYXJlIHJlYWQKLSAgICoKLSAgICogQHBhcmFtIGJ1ZiBCdWZmZXIgdG8gcmVhZCBpbnRvCi0gICAqIEBwYXJhbSBvZmYgSW5kZXggaW4gYnVmZmVyIHRvIHN0YXJ0IHN0b3JpbmcgYnl0ZXMgYXQKLSAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQotICAgKi8KLS0gKGludCkgcmVhZEFsbDogKHVpbnQ4X3QgKikgYnVmIG9mZnNldDogKGludCkgb2ZmIGxlbmd0aDogKGludCkgbGVuOworLyoqCisgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgcmVhZAorICoKKyAqIEBwYXJhbSBidWYgQnVmZmVyIHRvIHJlYWQgaW50bworICogQHBhcmFtIG9mZiBJbmRleCBpbiBidWZmZXIgdG8gc3RhcnQgc3RvcmluZyBieXRlcyBhdAorICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBAcmV0dXJuIFlFUyBpZiBzdWNjZWVkZWQsIE5PIGlmIGZhaWxlZAorICogQHRocm93cyBUVHJhbnNwb3J0RXJyb3IgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQorICovCistKEJPT0wpIHJlYWRBbGw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBsZW5ndGg6KFVJbnQzMilsZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSB3cml0ZTogKGNvbnN0IHVpbnQ4X3QgKikgZGF0YSBvZmZzZXQ6ICh1bnNpZ25lZCBpbnQpIG9mZnNldCBsZW5ndGg6ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKKy0oVUludDMyKSByZWFkQXZhaWw6KFVJbnQ4ICopYnVmIG9mZnNldDooVUludDMyKW9mZiBtYXhMZW5ndGg6KFVJbnQzMiltYXhMZW4gZXJyb3I6KE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKWVycm9yOwogCi0tICh2b2lkKSBmbHVzaDsKKy0oQk9PTCkgd3JpdGU6KGNvbnN0IFVJbnQ4ICopZGF0YSBvZmZzZXQ6KFVJbnQzMilvZmZzZXQgbGVuZ3RoOihVSW50MzIpbGVuZ3RoIGVycm9yOihOU0Vycm9yICpfX2F1dG9yZWxlYXNpbmcgKillcnJvcjsKKworLShCT09MKSBmbHVzaDooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3I7CisKIEBlbmQKKworCitOU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjOWYwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVEVycm9yLmgiCisKKworZXh0ZXJuIE5TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JEb21haW47CisKKwordHlwZWRlZiBOU19FTlVNIChpbnQsIFRUcmFuc3BvcnRFcnJvcikgeworICBUVHJhbnNwb3J0RXJyb3JVbmtub3duICAgICAgICA9IDAsCisgIFRUcmFuc3BvcnRFcnJvck5vdE9wZW4gICAgICAgID0gMSwKKyAgVFRyYW5zcG9ydEVycm9yQWxyZWFkeU9wZW4gICAgPSAyLAorICBUVHJhbnNwb3J0RXJyb3JUaW1lZE91dCAgICAgICA9IDMsCisgIFRUcmFuc3BvcnRFcnJvckVuZE9mRmlsZSAgICAgID0gNCwKK307CisKKworZXh0ZXJuIE5TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JFeHRlbmRlZEVycm9yS2V5OworZXh0ZXJuIE5TU3RyaW5nICpUVHJhbnNwb3J0RXJyb3JIdHRwRXJyb3JLZXk7CisKKwordHlwZWRlZiBOU19FTlVNKGludCwgVEh0dHBUcmFuc3BvcnRFcnJvcikgeworICBUSHR0cFRyYW5zcG9ydEVycm9ySW52YWxpZFJlc3BvbnNlICA9IDEwMDEsCisgIFRIdHRwVHJhbnNwb3J0RXJyb3JJbnZhbGlkU3RhdHVzICAgID0gMTAwMiwKKyAgVEh0dHBUcmFuc3BvcnRFcnJvckF1dGhlbnRpY2F0aW9uICAgPSAxMDAzLAorfTsKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5tIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEVycm9yLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhZjA3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFcnJvci5tCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2ltcG9ydCAiVFRyYW5zcG9ydEVycm9yLmgiCisKKworTlNTdHJpbmcgKlRUcmFuc3BvcnRFcnJvckRvbWFpbiA9IEAiVFRyYW5zcG9ydEVycm9yRG9tYWluIjsKKworCitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9yRXh0ZW5kZWRFcnJvcktleSA9IEAiZXh0ZW5kZWRFcnJvciI7CitOU1N0cmluZyAqVFRyYW5zcG9ydEVycm9ySHR0cEVycm9yS2V5ID0gQCJodHRwRXJyb3IiOwpkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQ5ZmUyLi4wMDAwMDAwCi0tLSBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2ltcG9ydCAiVEV4Y2VwdGlvbi5oIgotCi1AaW50ZXJmYWNlIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uIHsKLX0KLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb24KLSAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoTlNFcnJvciAqKSBlcnJvcjsKLQotKyAoaWQpIGV4Y2VwdGlvbldpdGhSZWFzb246IChOU1N0cmluZyAqKSByZWFzb247Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubSBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24ubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGZiZC4uMDAwMDAwMAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLm0KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbXBvcnQgIlRUcmFuc3BvcnRFeGNlcHRpb24uaCIKLSNpbXBvcnQgIlRPYmplY3RpdmUtQy5oIgotCi1AaW1wbGVtZW50YXRpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbgotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChOU0Vycm9yICopIGVycm9yCi17Ci0gIE5TRGljdGlvbmFyeSAqIHVzZXJJbmZvID0gbmlsOwotICBpZiAoZXJyb3IgIT0gbmlsKSB7Ci0gICAgdXNlckluZm8gPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OiBlcnJvciBmb3JLZXk6IEAiZXJyb3IiXTsKLSAgfQotCi0gIHJldHVybiBbc3VwZXIgZXhjZXB0aW9uV2l0aE5hbWU6IEAiVFRyYW5zcG9ydEV4Y2VwdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbjogcmVhc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlckluZm86IHVzZXJJbmZvXTsKLX0KLQotCi0rIChpZCkgZXhjZXB0aW9uV2l0aFJlYXNvbjogKE5TU3RyaW5nICopIHJlYXNvbgotewotICByZXR1cm4gW3NlbGYgZXhjZXB0aW9uV2l0aFJlYXNvbjogcmVhc29uIGVycm9yOiBuaWxdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9saWIvY3BwLzNyZHBhcnR5LnByb3BzIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhkNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC8zcmRwYXJ0eS5wcm9wcwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiAvPgorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iVXNlck1hY3JvcyI+CisgICAgPEJPT1NUX1JPT1Q+JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wPC9CT09TVF9ST09UPgorICAgIDxPUEVOU1NMX1JPT1RfRElSPiQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMjwvT1BFTlNTTF9ST09UX0RJUj4KKyAgICA8TElCRVZFTlRfUk9PVD4kKFRISVJEX1BBUlRZKVxsaWJldmVudC0yLjAuMjEtc3RhYmxlPC9MSUJFVkVOVF9ST09UPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIC8+CisgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIC8+CisgIDxJdGVtR3JvdXA+CisgICAgPEJ1aWxkTWFjcm8gSW5jbHVkZT0iQk9PU1RfUk9PVCI+CisgICAgICA8VmFsdWU+JChCT09TVF9ST09UKTwvVmFsdWU+CisgICAgICA8RW52aXJvbm1lbnRWYXJpYWJsZT50cnVlPC9FbnZpcm9ubWVudFZhcmlhYmxlPgorICAgIDwvQnVpbGRNYWNybz4KKyAgICA8QnVpbGRNYWNybyBJbmNsdWRlPSJPUEVOU1NMX1JPT1RfRElSIj4KKyAgICAgIDxWYWx1ZT4kKE9QRU5TU0xfUk9PVF9ESVIpPC9WYWx1ZT4KKyAgICAgIDxFbnZpcm9ubWVudFZhcmlhYmxlPnRydWU8L0Vudmlyb25tZW50VmFyaWFibGU+CisgICAgPC9CdWlsZE1hY3JvPgorICAgIDxCdWlsZE1hY3JvIEluY2x1ZGU9IkxJQkVWRU5UX1JPT1QiPgorICAgICAgPFZhbHVlPiQoTElCRVZFTlRfUk9PVCk8L1ZhbHVlPgorICAgICAgPEVudmlyb25tZW50VmFyaWFibGU+dHJ1ZTwvRW52aXJvbm1lbnRWYXJpYWJsZT4KKyAgICA8L0J1aWxkTWFjcm8+CisgIDwvSXRlbUdyb3VwPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjllYTgyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMjEyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKHNyYykKKworIyBTWVNMSUJTIGNvbnRhaW5zIGxpYnJhcmllcyB0aGF0IG5lZWQgdG8gYmUgbGlua2VkIHRvIGFsbCBsaWIgdGFyZ2V0cworc2V0KFNZU0xJQlMgIiIpCisKKyMgQ3JlYXRlIHRoZSB0aHJpZnQgQysrIGxpYnJhcnkKK3NldCggdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKyAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCisgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAKKyAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKKyAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5jcHAKKyAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcAorICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAKKyAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuY3BwCisgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAorICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcAorICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKyAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKKykKKworIyBUaGVzZSBmaWxlcyBkb24ndCB3b3JrIG9uIFdpbmRvd3MgQ0UgYXMgdGhlcmUgaXMgbm8gcGlwZSBzdXBwb3J0CisjIFRPRE86IFRoZXNlIGZpbGVzIHdvbid0IHdvcmsgd2l0aCBVTklDT0RFIHN1cHBvcnQgb24gd2luZG93cy4gSWYgZml4ZWQgdGhpcyBjYW4gYmUgcmUtYWRkZWQuCitpZiAoTk9UIFdJTkNFKQorICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwCisgICAgKQorZW5kaWYoKQorCisKK2lmIChXSU4zMikKKyAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCisgICAgICAgIHNyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCisgICAgKQorICAgIGlmKE5PVCBXSU5DRSkKKyAgICAgICAgIyBUaGlzIGZpbGUgdXNlcyBwaXBlcyBzbyBpdCBjdXJyZW50bHkgd29uJ3Qgd29yayBvbiBXaW5kb3dzIENFCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgICAgICBzcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwCisgICAgICAgICkKKyAgICBlbmRpZigpCitlbHNlKCkKKyAgICAjIFRoZXNlIGZpbGVzIGV2YWx1YXRlIHRvIG5vdGhpbmcgb24gV2luZG93cywgc28gb21pdCB0aGVtIGZyb20gdGhlCisgICAgIyBXaW5kb3dzIGJ1aWxkCisgICAgbGlzdChBUFBFTkQgdGhyaWZ0Y3BwX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcAorICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBJZiBPcGVuU1NMIGlzIG5vdCBmb3VuZCBqdXN0IGlnbm9yZSB0aGUgT3BlblNTTCBzdHVmZgorZmluZF9wYWNrYWdlKE9wZW5TU0wpCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCisgICAgbGlzdCggQVBQRU5EIHRocmlmdGNwcF9TT1VSQ0VTCisgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAorICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKK2lmKFVOSVggQU5EIE5PVCBXSVRIX1NURFRIUkVBRFMpCisgICAgaWYoQU5EUk9JRCkKKyAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICBlbHNlKCkKKyAgICAgICAgbGlzdChBUFBFTkQgU1lTTElCUyBwdGhyZWFkKQorICAgIGVuZGlmKCkKKyAgICBzZXQoIHRocmlmdGNwcF90aHJlYWRzX1NPVVJDRVMKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKKyAgICApCitlbHNlKCkKKyAgICBpZihVTklYKQorICAgICAgICBpZihBTkRST0lEKQorICAgICAgICAgICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1wdGhyZWFkIikKKyAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBsaXN0KEFQUEVORCBTWVNMSUJTIHB0aHJlYWQpCisgICAgICAgIGVuZGlmKCkKKyAgICBlbmRpZigpCisgICAgc2V0KCB0aHJpZnRjcHBfdGhyZWFkc19TT1VSQ0VTCisgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKKyAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcAorICAgICkKK2VuZGlmKCkKKworIyBUaHJpZnQgbm9uIGJsb2NraW5nIHNlcnZlcgorc2V0KCB0aHJpZnRjcHBuYl9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCisgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAorICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCispCisKKyMgVGhyaWZ0IHpsaWIgc2VydmVyCitzZXQoIHRocmlmdGNwcHpfU09VUkNFUworICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCisgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKKykKKworIyBUaHJpZnQgUXQ0IHNlcnZlcgorc2V0KCB0aHJpZnRjcHBxdF9TT1VSQ0VTCisgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCispCisKKyMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKK2luY2x1ZGUoVGhyaWZ0TWFjcm9zKQorCitBRERfTElCUkFSWV9USFJJRlQodGhyaWZ0ICR7dGhyaWZ0Y3BwX1NPVVJDRVN9ICR7dGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFU30pCitpZihXSU4zMikKKyAgICBUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUKHRocmlmdCAke1NZU0xJQlN9IHdzMl8zMikKK2Vsc2UoKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0ICR7U1lTTElCU30pCitlbmRpZigpCisKK2lmKFdJVEhfTElCRVZFTlQpCisgICAgZmluZF9wYWNrYWdlKExpYmV2ZW50IFJFUVVJUkVEKSAgIyBMaWJldmVudCBjb21lcyB3aXRoIENNYWtlIHN1cHBvcnQgZm9ybSB1cHN0cmVhbQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7TElCRVZFTlRfSU5DTFVERV9ESVJTfSkKKworICAgIEFERF9MSUJSQVJZX1RIUklGVCh0aHJpZnRuYiAke3RocmlmdGNwcG5iX1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0bmIgJHtTWVNMSUJTfSAke0xJQkVWRU5UX0xJQlJBUklFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVF9BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHRocmlmdG5iIHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9aTElCKQorICAgIGZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQorICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICR7WkxJQl9JTkNMVURFX0RJUlN9KQorCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHogJHt0aHJpZnRjcHB6X1NPVVJDRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0eiAke1NZU0xJQlN9ICR7WkxJQl9MSUJSQVJJRVN9KQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnR6IHRocmlmdCkKK2VuZGlmKCkKKworaWYoV0lUSF9RVDQpCisgICAgc2V0KENNQUtFX0FVVE9NT0MgT04pCisgICAgZmluZF9wYWNrYWdlKFF0NCBSRVFVSVJFRCBDT01QT05FTlRTIFF0Q29yZSBRdE5ldHdvcmspCisgICAgQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0ICR7dGhyaWZ0Y3BwcXRfU09VUkNFU30pCisgICAgVEFSR0VUX0xJTktfTElCUkFSSUVTX1RIUklGVCh0aHJpZnRxdCAke1NZU0xJQlN9IFF0NDo6UXRDb3JlIFF0NDo6UXROZXR3b3JrKQorICAgIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlRfQUdBSU5TVF9USFJJRlRfTElCUkFSWSh0aHJpZnRxdCB0aHJpZnQpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorICAgICMgUXQ1IGhhcyBpdHMgb3duIGRpcmVjdG9yeSB0byBhdm9pZCBjb25mbGljdCB3aXRoIFF0NCBjYXVzZWQgYnkgQ01BS0VfQVVUT01PQworICAgIGFkZF9zdWJkaXJlY3Rvcnkoc3JjL3RocmlmdC9xdCkKK2VuZGlmKCkKKworaWYoTVNWQykKKyAgICBhZGRfZGVmaW5pdGlvbnMoIi1EVU5JQ09ERSAtRF9VTklDT0RFIikKK2VuZGlmKCkKKworYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCisjIEluc3RhbGwgdGhlIGhlYWRlcnMKK2luc3RhbGwoRElSRUNUT1JZICJzcmMvdGhyaWZ0IiBERVNUSU5BVElPTiAiJHtJTkNMVURFX0lOU1RBTExfRElSfSIKKyAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiIFBBVFRFUk4gIioudGNjIikKKyMgQ29weSBjb25maWcuaCBmaWxlCitpbnN0YWxsKERJUkVDVE9SWSAiJHtDTUFLRV9CSU5BUllfRElSfS90aHJpZnQiIERFU1RJTkFUSU9OICIke0lOQ0xVREVfSU5TVEFMTF9ESVJ9IgorICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouaCIpCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgYWRkX3N1YmRpcmVjdG9yeSh0ZXN0KQorZW5kaWYoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvTWFrZWZpbGUuYW0KaW5kZXggNGE3ZWY4My4uODViYjlhYiAxMDA3NTUKLS0tIGEvbGliL2NwcC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3BwL01ha2VmaWxlLmFtCkBAIC0xNywyMCArMTcsMzAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cworCiBtb2NfJS5jcHA6ICUuaAogCSQoUVRfTU9DKSAkKFFUX0NGTEFHUykgJDwgLW8gJEAKIAorbW9jX18lLmNwcDogJS5oCisJJChRVDVfTU9DKSAkKFFUNV9DRkxBR1MpICQ8IC1vICRACisKIFNVQkRJUlMgPSAuCiAKIGlmIFdJVEhfVEVTVFMKKyMgVGhpcyBmaWxlIGlzIG5lZWRlZCBieSBjb21waWxlciB3aXRoIHBsdWdpbiwgd2hpbGUgdGVzdC9NYWtlZmlsZS5hbSBuZWVkcyBjb21waWxlcgorIyBTbyB0ZXN0IGRpcmVjdG9yeSBpcyBkaXJlY3RseSBwaWNrZWQgYnkgdG9wIGxldmVsIE1ha2VmaWxlLmFtIGZvciBwbHVnaW4gYnVpbGQKK2lmICFXSVRIX1BMVUdJTgogU1VCRElSUyArPSB0ZXN0CiBlbmRpZgorZW5kaWYKIAogcGtnY29uZmlnZGlyID0gJChsaWJkaXIpL3BrZ2NvbmZpZwogCiBsaWJfTFRMSUJSQVJJRVMgPSBsaWJ0aHJpZnQubGEKIHBrZ2NvbmZpZ19EQVRBID0gdGhyaWZ0LnBjCi1saWJ0aHJpZnRfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKQorbGlidGhyaWZ0X2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pCitsaWJ0aHJpZnRfbGFfTElCQUREID0gJChCT09TVF9MREZMQUdTKSAkKE9QRU5TU0xfTERGTEFHUykgJChPUEVOU1NMX0xJQlMpCiAKICMjIFdlIG9ubHkgYnVpbGQgdGhlIGV4dHJhIGxpYnJhcmllcyBpZiB3ZSBoYXZlIHRoZSBkZXBlbmRlbmNpZXMsCiAjIyBidXQgd2UgaW5zdGFsbCBhbGwgb2YgdGhlIGhlYWRlcnMgdW5jb25kaXRpb25hbGx5LgpAQCAtNDYsMjMgKzU2LDMxIEBACiBsaWJfTFRMSUJSQVJJRVMgKz0gbGlidGhyaWZ0cXQubGEKIHBrZ2NvbmZpZ19EQVRBICs9IHRocmlmdC1xdC5wYwogZW5kaWYKK2lmIEFNWF9IQVZFX1FUNQorbGliX0xUTElCUkFSSUVTICs9IGxpYnRocmlmdHF0NS5sYQorcGtnY29uZmlnX0RBVEEgKz0gdGhyaWZ0LXF0NS5wYworZW5kaWYKIAotQU1fQ1hYRkxBR1MgPSAtV2FsbAotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQoc3JjZGlyKS9zcmMgLUkkKHNyY2Rpcikvc3JjL3RocmlmdAotQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSAtSSQoc3JjZGlyKS9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MKIAogIyBEZWZpbmUgdGhlIHNvdXJjZSBmaWxlcyBmb3IgdGhlIG1vZHVsZQogCi1saWJ0aHJpZnRfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvVGhyaWZ0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCitsaWJ0aHJpZnRfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVE91dHB1dC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIFwKQEAgLTc3LDY3ICs5NSw4MyBAQAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKIAotaWYgV0lUSF9CT09TVFRIUkVBRFMKLWxpYnRocmlmdF9sYV9TT1VSQ0VTICs9IHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TW9uaXRvci5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE11dGV4LmNwcAotZWxzZQogbGlidGhyaWZ0X2xhX1NPVVJDRVMgKz0gc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5jcHAKLWVuZGlmCiAKIGxpYnRocmlmdG5iX2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAgCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKIAotbGlidGhyaWZ0el9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCitsaWJ0aHJpZnR6X2xhX1NPVVJDRVMgPSBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuY3BwCisKIAogbGlidGhyaWZ0cXRfbGFfTU9DID0gc3JjL3RocmlmdC9xdC9tb2NfVFFUY3BTZXJ2ZXIuY3BwCi1saWJ0aHJpZnRxdF9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdF9sYV9NT0MpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwIFwKK25vZGlzdF9saWJ0aHJpZnRxdF9sYV9TT1VSQ0VTID0gJChsaWJ0aHJpZnRxdF9sYV9NT0MpCitsaWJ0aHJpZnRxdF9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKIENMRUFORklMRVMgPSAkKGxpYnRocmlmdHF0X2xhX01PQykKIAorbGlidGhyaWZ0cXQ1X2xhX01PQyA9IHNyYy90aHJpZnQvcXQvbW9jX19UUVRjcFNlcnZlci5jcHAKK25vZGlzdF9saWJ0aHJpZnRxdDVfbGFfU09VUkNFUyA9ICQobGlidGhyaWZ0cXQ1X2xhX01PQykKK2xpYnRocmlmdHF0NV9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCitDTEVBTkZJTEVTICs9ICQobGlidGhyaWZ0cXQ1X2xhX01PQykKKwogIyBGbGFncyBmb3IgdGhlIHZhcmlvdXMgbGlicmFyaWVzCiBsaWJ0aHJpZnRuYl9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoTElCRVZFTlRfQ1BQRkxBR1MpCiBsaWJ0aHJpZnR6X2xhX0NQUEZMQUdTICA9ICQoQU1fQ1BQRkxBR1MpICQoWkxJQl9DUFBGTEFHUykKIGxpYnRocmlmdHF0X2xhX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykgJChRVF9DRkxBR1MpCitsaWJ0aHJpZnRxdDVfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFFUNV9DRkxBR1MpCitpZiBRVDVfUkVEVUNFX1JFTE9DQVRJT05TCitsaWJ0aHJpZnRxdDVfbGFfQ1BQRkxBR1MgKz0gLWZQSUMKK2VuZGlmCiBsaWJ0aHJpZnRuYl9sYV9DWFhGTEFHUyA9ICQoQU1fQ1hYRkxBR1MpCiBsaWJ0aHJpZnR6X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCiBsaWJ0aHJpZnRxdF9sYV9DWFhGTEFHUyAgPSAkKEFNX0NYWEZMQUdTKQorbGlidGhyaWZ0cXQ1X2xhX0NYWEZMQUdTICA9ICQoQU1fQ1hYRkxBR1MpCiBsaWJ0aHJpZnRuYl9sYV9MREZMQUdTICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKQotbGlidGhyaWZ0el9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykKK2xpYnRocmlmdHpfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoWkxJQl9MSUJTKQogbGlidGhyaWZ0cXRfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVRfTElCUykKK2xpYnRocmlmdHF0NV9sYV9MREZMQUdTICAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykgJChRVDVfTElCUykKIAogaW5jbHVkZV90aHJpZnRkaXIgPSAkKGluY2x1ZGVkaXIpL3RocmlmdAogaW5jbHVkZV90aHJpZnRfSEVBREVSUyA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvY29uZmlnLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RocmlmdC5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RSZWZsZWN0aW9uTG9jYWwuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFByb2Nlc3Nvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RMb2dnaW5nLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L1RMb2dnaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFRvU3RyaW5nLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEJhc2UuaAogCiBpbmNsdWRlX2NvbmN1cnJlbmN5ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvY29uY3VycmVuY3kKIGluY2x1ZGVfY29uY3VycmVuY3lfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE1vbml0b3IuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIFwKQEAgLTE1MCwyMyArMTg0LDMxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVHlwZXMuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKIAogaW5jbHVkZV90cmFuc3BvcnRkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS90cmFuc3BvcnQKIGluY2x1ZGVfdHJhbnNwb3J0X0hFQURFUlMgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBcCkBAIC0xODUsNyArMjI3LDkgQEAKIAogaW5jbHVkZV9zZXJ2ZXJkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9zZXJ2ZXIKIGluY2x1ZGVfc2VydmVyX0hFQURFUlMgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBcCkBAIC0xOTQsNyArMjM4LDggQEAKIGluY2x1ZGVfcHJvY2Vzc29yZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvY2Vzc29yCiBpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCiAKIGluY2x1ZGVfYXN5bmNkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9hc3luYwogaW5jbHVkZV9hc3luY19IRUFERVJTID0gXApAQCAtMjAzLDYgKzI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIFwKICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggXAogICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIFwKKyAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIFwKICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBcCiAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaAogCkBAIC0yMTEsMjIgKzI1NywyNiBAQAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIFdJTkRPV1NfRElTVCA9IFwKLSAgICAgICAgICAgICBSRUFETUVfV0lORE9XUyBcCiAgICAgICAgICAgICAgc3JjL3RocmlmdC93aW5kb3dzIFwKICAgICAgICAgICAgICB0aHJpZnQuc2xuIFwKICAgICAgICAgICAgICBsaWJ0aHJpZnQudmN4cHJvaiBcCiAgICAgICAgICAgICAgbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycyBcCiAgICAgICAgICAgICAgbGlidGhyaWZ0bmIudmN4cHJvaiBcCi0gICAgICAgICAgICAgbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCisgICAgICAgICAgICAgbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzIFwKKyAgICAgICAgICAgICAzcmRwYXJ0eS5wcm9wcwogCiBFWFRSQV9ESVNUID0gXAotICAgICAgICAgICAgIFJFQURNRSBcCi0gICAgICAgICAgICAgUkVBRE1FLlNTTCBcCisgICAgICAgICAgICAgQ01ha2VMaXN0cy50eHQgXAorICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICAgICAgICAgICAgIFJFQURNRS5tZCBcCiAgICAgICAgICAgICAgdGhyaWZ0LW5iLnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQucGMuaW4gXAogICAgICAgICAgICAgIHRocmlmdC16LnBjLmluIFwKICAgICAgICAgICAgICB0aHJpZnQtcXQucGMuaW4gXAorICAgICAgICAgICAgIHRocmlmdC1xdDUucGMuaW4gXAorICAgICAgICAgICAgIHNyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQgXAogICAgICAgICAgICAgICQoV0lORE9XU19ESVNUKQorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvUkVBRE1FIGIvbGliL2NwcC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmQwMTcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1UaHJpZnQgQysrIFNvZnR3YXJlIExpYnJhcnkKLQotTGljZW5zZQotPT09PT09PQotCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLQotVXNpbmcgVGhyaWZ0IHdpdGggQysrCi09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIFRocmlmdCBDKysgbGlicmFyaWVzIGFyZSBidWlsdCB1c2luZyB0aGUgR05VIHRvb2xzLiBGb2xsb3cgdGhlIGluc3RydWN0aW9ucwotaW4gdGhlIHRvcC1sZXZlbCBSRUFETUUsIG9yIHJ1biBib290c3RyYXAuc2ggaW4gdGhpcyBmb2xkZXIgdG8gZ2VuZXJhdGUgdGhlCi1NYWtlZmlsZXMuCi0KLUluIGNhc2UgeW91IGRvIG5vdCB3YW50IHRvIG9wZW4gYW5vdGhlciBSRUFETUUgZmlsZSwgZG8gdGhpczoKLSAgLi9ib290c3RyYXAuc2gKLSAgLi9jb25maWd1cmUgKC0td2l0aC1ib29zdD0vdXNyL2xvY2FsKQotICBtYWtlCi0gIHN1ZG8gbWFrZSBpbnN0YWxsCi0KLVRocmlmdCBpcyBkaXZpZGVkIGludG8gdHdvIGxpYnJhcmllcy4KLQotbGlidGhyaWZ0Ci0gIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKLSAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgotCi1saWJ0aHJpZnRuYgotICBUaGlzIGxpYnJhcnkgY29udGFpbnMgdGhlIFRocmlmdCBub25ibG9ja2luZyBzZXJ2ZXIsIHdoaWNoIHVzZXMgbGliZXZlbnQuCi0gIFRvIGxpbmsgdGhpcyBsaWJyYXJ5IHlvdSB3aWxsIGFsc28gbmVlZCB0byBsaW5rIGxpYmV2ZW50LgotCi1MaW5raW5nIEFnYWluc3QgVGhyaWZ0Ci09PT09PT09PT09PT09PT09PT09PT09Ci0KLUFmdGVyIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBUaHJpZnQgdGhlIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHRvCi0vdXNyL2xvY2FsL2xpYiBieSBkZWZhdWx0LiBNYWtlIHN1cmUgdGhpcyBpcyBpbiB5b3VyIExEUEFUSC4KLQotT24gTGludXgsIHRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0IC91c3IvbG9jYWwvbGliIGlzIGluCi15b3VyIC9ldGMvbGQuc28uY29uZiBhbmQgdGhlbiBydW4gL3NiaW4vbGRjb25maWcuCi0KLURlcGVuZGluZyB1cG9uIHdoZXRoZXIgeW91IGFyZSBsaW5raW5nIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHkgYW5kIGhvdwoteW91ciBidWlsZCBlbnZpcm9ubWVudCBpdCBzZXQgdXAsIHlvdSBtYXkgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwKLWxpYnJhcmllcyB3aGVuIGxpbmtpbmcgYWdhaW5zdCB0aHJpZnQsIHN1Y2ggYXMgbGlicnQgYW5kL29yIGxpYnB0aHJlYWQuIElmCi15b3UgYXJlIHVzaW5nIGxpYnRocmlmdG5iIHlvdSB3aWxsIGFsc28gbmVlZCBsaWJldmVudC4KLQotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KLQotYm9vc3Qgc2hhcmVkIHBvaW50ZXJzCi1odHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3NtYXJ0X3B0ci9zbWFydF9wdHIuaHRtCi0KLWxpYmV2ZW50IChmb3IgbGlidGhyaWZ0bmIgb25seSkKLWh0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQvCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRS5TU0wgYi9saWIvY3BwL1JFQURNRS5TU0wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjgwNTcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9SRUFETUUuU1NMCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLU5vdGVzIG9uIFRocmlmdC9TU0wKLQotQXV0aG9yOiBQaW5nIExpIDxwaW5nbGlAZmFjZWJvb2suY29tPgotCi0xLiBTY29wZQotCi0gICBUaGlzIFNTTCBvbmx5IHN1cHBvcnRzIGJsb2NraW5nIG1vZGUgc29ja2V0IEkvTy4gSXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoCi0gICBUU2ltcGxlU2VydmVyLCBUVGhyZWFkZWRTZXJ2ZXIsIGFuZCBUVGhyZWFkUG9vbFNlcnZlci4KLQotMi4gSW1wbGVtZW50YXRpb24KLQotICAgVGhlcmUncmUgdHdvIG1haW4gY2xhc3NlcyBUU1NMU29ja2V0RmFjdG9yeSBhbmQgVFNTTFNvY2tldC4gSW5zdGFuY2VzIG9mCi0gICBUU1NMU29ja2V0IGFyZSBhbHdheXMgY3JlYXRlZCBmcm9tIFRTU0xTb2NrZXRGYWN0b3J5LgotCi0gICBQb3NpeFNTTFRocmVhZEZhY3RvcnkgY3JlYXRlcyBQb3NpeFNTTFRocmVhZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIHRoZQotICAgUHRocmVhZFRocmVhZCB0eXBlIGlzIHRoYXQgaXQgY2xlYW51cHMgT3BlblNTTCBlcnJvciBxdWV1ZSB1cG9uIGV4aXRpbmcKLSAgIHRoZSB0aHJlYWQuIElkZWFsbHksIE9wZW5TU0wgQVBJcyBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSBQb3NpeFNTTFRocmVhZC4KLQotMy4gSG93IHRvIHVzZSBTU0wgQVBJcwotCi0gICAvLyBUaGlzIGlzIGZvciBkZW1vLiBJbiByZWFsIGNvZGUsIHR5cGljYWxseSBvbmx5IG9uZSBUU1NMU29ja2V0RmFjdG9yeQotICAgLy8gaW5zdGFuY2UgaXMgbmVlZGVkLgotICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZ2V0U1NMU29ja2V0RmFjdG9yeSgpIHsKLSAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeShuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7Ci0gICAgIC8vIGNsaWVudDogbG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcwotICAgICBmYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygibXktdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZXMucGVtIik7Ci0gICAgIC8vIGNsaWVudDogb3B0aW9uYWxseSBzZXQgeW91ciBvd24gYWNjZXNzIG1hbmFnZXIsIG90aGVyd2lzZSwKLSAgICAgLy8gICAgICAgICB0aGUgZGVmYXVsdCBjbGllbnQgYWNjZXNzIG1hbmFnZXIgd2lsbCBiZSBsb2FkZWQuCi0KLSAgICAgZmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKCJteS1jZXJ0aWZpY2F0ZS1zaWduZWQtYnktY2EucGVtIik7Ci0gICAgIGZhY3RvcnktPmxvYWRQcml2YXRlS2V5KCJteS1wcml2YXRlLWtleS5wZW0iKTsKLSAgICAgLy8gc2VydmVyOiBvcHRpb25hbGx5IHNldHVwIGFjY2VzcyBtYW5hZ2VyCi0gICAgIC8vIHNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzTWFuYWdlcihuZXcgTXlBY2Nlc3NNYW5hZ2VyKTsKLSAgICAgLy8gZmFjdG9yeS0+YWNjZXNzKGFjY2Vzc01hbmFnZXIpOwotICAgICAuLi4KLSAgIH0KLQotICAgLy8gY2xpZW50IGNvZGUgc2FtcGxlCi0gICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5ID0gZ2V0U1NMU29ja2V0RmFjdG9yeSgpOwotICAgc2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQgPSBmYWN0b3J5LmNyZWF0ZVNvY2tldChob3N0LCBwb3J0KTsKLSAgIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiB0cmFuc3BvcnQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgIC4uLgotCi0gICAvLyBzZXJ2ZXIgY29kZSBzYW1wbGUKLSAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkgPSBnZXRTU0xTb2NrZXRGYWN0b3J5KCk7Ci0gICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBmYWN0b3J5KSk7Ci0gICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSk7Ci0gICAuLi4KLQotNC4gQWNjZXNzTWFuYWdlcgotCi0gICBBY2Nlc3NNYW5hZ2VyIGRlZmluZXMgYSBjYWxsYmFjayBpbnRlcmZhY2UuIEl0IGhhcyB0aHJlZSBjYWxsYmFjayBtZXRob2RzOgotCi0gICAoYSkgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKTsKLSAgIChiKSBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSk7Ci0gICAoYykgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgIEFmdGVyIFNTTCBoYW5kc2hha2UgY29tcGxldGVzLCBhZGRpdGlvbmFsIGNoZWNrcyBhcmUgY29uZHVjdGVkLiBBcHBsaWNhdGlvbgotICAgaXMgZ2l2ZW4gdGhlIGNoYW5jZSB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gY29udGludWUgdGhlIGNvbnZlcnNhdGlvbgotICAgd2l0aCB0aGUgcmVtb3RlLiBBcHBsaWNhdGlvbiBpcyBxdWVyaWVkIHRocm91Z2ggdGhlIGFib3ZlIHRocmVlICJ2ZXJpZnkiCi0gICBtZXRob2QuIFRoZXkgYXJlIGNhbGxlZCBhdCBkaWZmZXJlbnQgcG9pbnRzIG9mIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KLQotICAgRGVjaXNpb25zIGNhbiBiZSBvbmUgb2YgQUxMT1csIERFTlksIGFuZCBTS0lQLiBBTExPVyBhbmQgREVOWSBtZWFucyB0aGUKLSAgIGNvbnZlcnNhdGlvbiBzaG91bGQgYmUgY29udGludWVkIG9yIGRpc2Nvbm5lY3RlZCwgcmVzcGVjdGl2ZWx5LiBBTExPVyBhbmQKLSAgIERFTlkgZGVjaXNpb24gc3RvcHMgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBTS0lQIG1lYW5zIHRoZXJlJ3Mgbm8gZGVjaXNpb24KLSAgIGJhc2VkIG9uIHRoZSBnaXZlbiBpbnB1dCwgY29udGludWUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLgotCi0gICBGaXJzdCwgKGEpIGlzIGNhbGxlZCB3aXRoIHRoZSByZW1vdGUgSVAuIEl0IGlzIGNhbGxlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcuCi0gICAic2EiIGlzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgcGVlci4KLQotICAgVGhlbiwgdGhlIGNlcnRpZmljYXRlIG9mIHJlbW90ZSBwZWVyIGlzIGxvYWRlZC4gU3ViamVjdEFsdE5hbWUgZXh0ZW5zaW9ucwotICAgYXJlIGV4dHJhY3RlZCBhbmQgc2VudCB0byBhcHBsaWNhdGlvbiBmb3IgdmVyaWZpY2F0aW9uLiBXaGVuIGEgRE5TCi0gICBzdWJqZWN0QWx0TmFtZSBmaWVsZCBpcyBleHRyYWN0ZWQsIChiKSBpcyBjYWxsZWQuIFdoZW4gYW4gSVAgc3ViamVjdEFsdE5hbWUKLSAgIGZpZWxkIGlzIGV4dHJhY3RlZCwgKGMpIGlzIGNhbGxlZC4KLQotICAgVGhlICJob3N0IiBpbiAoYikgaXMgdGhlIHZhbHVlIGZyb20gVFNvY2tldDo6Z2V0SG9zdCgpIGlmIHRoaXMgaXMgYSBjbGllbnQKLSAgIHNpZGUgc29ja2V0LCBvciBUU29ja2V0OjpnZXRQZWVySG9zdCgpIGlmIHRoaXMgaXMgYSBzZXJ2ZXIgc2lkZSBzb2NrZXQuIFRoZQotICAgcmVhc29uIGlzIGNsaWVudCBzaWRlIHNvY2tldCBpbml0aWF0ZXMgdGhlIGNvbm5lY3Rpb24uIFRTb2NrZXQ6OmdldEhvc3QoKQotICAgaXMgdGhlIHJlbW90ZSBob3N0IG5hbWUuIE9uIHNlcnZlciBzaWRlLCB0aGUgcmVtb3RlIGhvc3QgbmFtZSBpcyB1bmtub3duCi0gICB1bmxlc3MgaXQncyByZXRyaWV2ZWQgdGhyb3VnaCBUU29ja2V0OjpnZXRQZWVySG9zdCgpLiBFaXRoZXIgd2F5LCAiaG9zdCIKLSAgIHNob3VsZCBiZSB0aGUgcmVtb3RlIGhvc3QgbmFtZS4gS2VlcCBpbiBtaW5kLCBpZiBUU29ja2V0OjpnZXRQZWVySG9zdCgpCi0gICBmYWlsZWQsIGl0IHdvdWxkIHJldHVybiB0aGUgcmVtb3RlIGhvc3QgbmFtZSBpbiBudW1lcmljIGZvcm1hdC4KLQotICAgSWYgYWxsIHN1YmplY3RBbHROYW1lIGV4dGVuc2lvbnMgd2VyZSAic2tpcHBlZCIsIHRoZSBjb21tb24gbmFtZSBmaWVsZCB3b3VsZAotICAgYmUgY2hlY2tlZC4gSXQgaXMgc2VudCB0byBhcHBsaWNhdGlvbiB0aHJvdWdoIChjKSwgd2hlcmUgInNhIiBpcyB0aGUgcmVtb3RlCi0gICBJUCBhZGRyZXNzLiAiZGF0YSIgaXMgdGhlIElQIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gc3ViamVjdEFsdE5hbWUgSVAKLSAgIGV4dGVuc2lvbiwgYW5kICJzaXplIiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBleHRlbnNpb24gZGF0YS4KLQotICAgSWYgYW55IG9mIHRoZSBhYm92ZSAidmVyaWZ5IiBtZXRob2RzIHJldHVybmVkIGEgZGVjaXNpb24gQUxMT1cgb3IgREVOWSwgdGhlCi0gICB2ZXJpZmljYXRpb24gcHJvY2VzcyB3b3VsZCBiZSBzdG9wcGVkLgotCi0gICBJZiBhbnkgb2YgdGhlIGFib3ZlICJ2ZXJpZnkiIG1ldGhvZHMgcmV0dXJuZWQgU0tJUCwgdGhhdCBkZWNpc2lvbiB3b3VsZCBiZQotICAgaWdub3JlZCBhbmQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIHdvdWxkIG1vdmUgb24gdGlsbCB0aGUgbGFzdCBpdGVtIGlzCi0gICBleGFtaW5lZC4gQXQgdGhhdCBwb2ludCwgaWYgdGhlcmUncyBzdGlsbCBubyBkZWNpc2lvbiwgdGhlIGNvbm5lY3Rpb24gaXMKLSAgIHRlcm1pbmF0ZWQuCi0KLSAgIFRocmVhZCBzYWZldHksIGFuIGFjY2VzcyBtYW5hZ2VyIHNob3VsZCBub3Qgc3RvcmUgc3RhdGUgaW5mb3JtYXRpb24gaWYgaXQncwotICAgdG8gYmUgdXNlZCBieSBtYW55IFNTTCBzb2NrZXRzLgotCi01LiBTSUdQSVBFIHNpZ25hbAotCi0gICBBcHBsaWNhdGlvbnMgcnVubmluZyBPcGVuU1NMIG92ZXIgbmV0d29yayBjb25uZWN0aW9ucyBtYXkgY3Jhc2ggaWYgU0lHUElQRQotICAgaXMgbm90IGlnbm9yZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZXkgcmVjZWl2ZSBhIGNvbm5lY3Rpb24gcmVzZXQgYnkgcmVtb3RlCi0gICBwZWVyIGV4Y2VwdGlvbiwgd2hpY2ggc29tZWhvdyB0cmlnZ2VycyBhIFNJR1BJUEUgc2lnbmFsLiBJZiBub3QgaGFuZGxlZCwKLSAgIHRoaXMgc2lnbmFsIHdvdWxkIGtpbGwgdGhlIGFwcGxpY2F0aW9uLgotCi02LiBIb3cgdG8gcnVuIHRlc3QgY2xpZW50L3NlcnZlciBpbiBTU0wgbW9kZQotCi0gICBUaGUgc2VydmVyIGV4cGVjdHMgdGhlIGZvbGxvd2luZ3MgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKLSAgIC0gInNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0iCi0gICAtICJzZXJ2ZXItcHJpdmF0ZS1rZXkucGVtIgotCi0gICBUaGUgY2xpZW50IGxvYWRzICJ0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSIgZnJvbSBjdXJyZW50IGRpcmVjdG9yeS4KLQotICAgVGhlIGZpbGUgbmFtZXMgYXJlIGhhcmQgY29kZWQgaW4gdGhlIHNvdXJjZSBjb2RlLiBZb3UgbmVlZCB0byBjcmVhdGUgdGhlc2UKLSAgIGNlcnRpZmljYXRlcyBiZWZvcmUgeW91IGNhbiBydW4gdGhlIHRlc3QgY29kZSBpbiBTU0wgbW9kZS4gTWFrZSBzdXJlIGF0IGxlYXN0Ci0gICBvbmUgb2YgdGhlIGZvbGxvd2luZ3MgaXMgaW5jbHVkZWQgaW4gInNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0iLAotICAgLSBzdWJqZWN0QWx0TmFtZSwgRE5TIGxvY2FsaG9zdAotICAgLSBzdWJqZWN0QWx0TmFtZSwgSVAgIDEyNy4wLjAuMQotICAgLSBjb21tb24gbmFtZSwgICAgbG9jYWxob3N0Ci0KLSAgIFJ1biwKLSAgIC0gIi4vdGVzdF9zZXJ2ZXIgLS1zc2wiIHRvIHN0YXJ0IHNlcnZlcgotICAgLSAiLi90ZXN0X2NsaWVudCAtLXNzbCIgdG8gcnVuIGNsaWVudAotCi0gICBJZiAiLWggPGhvc3Q+IiBpcyB1c2VkIHRvIHJ1biBjbGllbnQsIHRoZSBhYm92ZSAibG9jYWxob3N0IiBpbiB0aGUgYWJvdmUKLSAgIHNlcnZlci1jZXJ0aWZpY2F0ZS5wZW0gaGFzIHRvIGJlIHJlcGxhY2VkIHdpdGggdGhhdCBob3N0IG5hbWUuCi0KLTcuIFRTU0xTb2NrZXRGYWN0b3J5OjpyYW5kb21pemUoKQotCi0gICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBPcGVuU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkgc2ltcGx5IGNhbGxzCi0gICBPcGVuU1NMJ3MgUkFORF9wb2xsKCkgd2hlbiBPcGVuU1NMIGxpYnJhcnkgaXMgZmlyc3QgaW5pdGlhbGl6ZWQuCi0KLSAgIFRoZSBQUk5HIHNlZWQgaXMga2V5IHRvIHRoZSBhcHBsaWNhdGlvbiBzZWN1cml0eS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0gICBvdmVycmlkZGVuIGlmIGl0J3Mgbm90IHN0cm9uZyBlbm91Z2ggZm9yIHlvdS4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvUkVBRE1FLm1kIGIvbGliL2NwcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc0NGE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjk2IEBACitUaHJpZnQgQysrIFNvZnR3YXJlIExpYnJhcnkKKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIEMrKworCitUaGUgVGhyaWZ0IEMrKyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCitpbiB0aGUgdG9wLWxldmVsIFJFQURNRS5tZAorCitJbiBjYXNlIHlvdSBkbyBub3Qgd2FudCB0byBvcGVuIGFub3RoZXIgUkVBRE1FLm1kIGZpbGUsIGRvIHRoaXMgdGhyaWZ0IHNyYzoKKworICAgIC4vYm9vdHN0cmFwLnNoCisgICAgLi9jb25maWd1cmUgKC0td2l0aC1ib29zdD0vdXNyL2xvY2FsKQorICAgIG1ha2UKKyAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitUaHJpZnQgaXMgZGl2aWRlZCBpbnRvIHR3byBsaWJyYXJpZXMuCisKKyogbGlidGhyaWZ0IC0gVGhlIGNvcmUgVGhyaWZ0IGxpYnJhcnkgY29udGFpbnMgYWxsIHRoZSBjb3JlIFRocmlmdCBjb2RlLiBJdCByZXF1aXJlcworICBib29zdCBzaGFyZWQgcG9pbnRlcnMsIHB0aHJlYWRzLCBhbmQgbGlicnQuCisKKyogbGlidGhyaWZ0bmIgLSBUaGlzIGxpYnJhcnkgY29udGFpbnMgdGhlIFRocmlmdCBub25ibG9ja2luZyBzZXJ2ZXIsIHdoaWNoIHVzZXMgbGliZXZlbnQuCisgIFRvIGxpbmsgdGhpcyBsaWJyYXJ5IHlvdSB3aWxsIGFsc28gbmVlZCB0byBsaW5rIGxpYmV2ZW50LgorCisjIyBMaW5raW5nIEFnYWluc3QgVGhyaWZ0CisKK0FmdGVyIHlvdSBidWlsZCBhbmQgaW5zdGFsbCBUaHJpZnQgdGhlIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIHRvCisvdXNyL2xvY2FsL2xpYiBieSBkZWZhdWx0LiBNYWtlIHN1cmUgdGhpcyBpcyBpbiB5b3VyIExEUEFUSC4KKworT24gTGludXgsIHRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGVuc3VyZSB0aGF0IC91c3IvbG9jYWwvbGliIGlzIGluCit5b3VyIC9ldGMvbGQuc28uY29uZiBhbmQgdGhlbiBydW4gL3NiaW4vbGRjb25maWcuCisKK0RlcGVuZGluZyB1cG9uIHdoZXRoZXIgeW91IGFyZSBsaW5raW5nIGR5bmFtaWNhbGx5IG9yIHN0YXRpY2FsbHkgYW5kIGhvdworeW91ciBidWlsZCBlbnZpcm9ubWVudCBpdCBzZXQgdXAsIHlvdSBtYXkgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwKK2xpYnJhcmllcyB3aGVuIGxpbmtpbmcgYWdhaW5zdCB0aHJpZnQsIHN1Y2ggYXMgbGlicnQgYW5kL29yIGxpYnB0aHJlYWQuIElmCit5b3UgYXJlIHVzaW5nIGxpYnRocmlmdG5iIHlvdSB3aWxsIGFsc28gbmVlZCBsaWJldmVudC4KKworIyMgRGVwZW5kZW5jaWVzCisKK0lmIHlvdXIgQysrIGVudmlyb25tZW50IGltcGxlbWVudHMgQysrMTEgb3IgbGF0ZXIsIHRocmlmdCB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlCitzdGQ6OnNoYXJlZF9wdHIuICBPdGhlcndpc2UgeW91IHdpbGwgbmVlZCB0aGUgYm9vc3QgbGlicmFyeSB0byBwcm92aWRlIGEgc2hhcmVkX3B0cgoraW1wbGVtZW50YXRpb24gZm9yIEMrKyBlbnZpcm9ubWVudHMgcHJlLUMrKzExLiAgSWYgeW91IGFyZSBsaW5raW5nIGFnYWluc3QgY29kZQordGhhdCBleHBlY3RzIHRvIGJlIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyLCB5b3UgY2FuIGRlZmluZSB0aGUgcHJlcHJvY2Vzc29yCit2YXJpYWJsZSBGT1JDRV9CT09TVF9TTUFSVF9QVFIgZm9yIHlvdXIgYnVpbGQgb2YgdGhyaWZ0IHRvIG1ha2UgaXQgdXNlIGJvb3N0IGluc3RlYWQKK29mIHN0ZCBmb3IgYSBudW1iZXIgb2YgbWVtb3J5IHJlbGF0ZWQgY2xhc3Nlcy4gIFNlZSB0aHJpZnQvc3RkY3h4LmggZm9yIG1vcmUuCisKK2xpYmV2ZW50IChmb3IgbGlidGhyaWZ0bmIgb25seSkKK2h0dHA6Ly9tb25rZXkub3JnL35wcm92b3MvbGliZXZlbnQvCisKKyMgVXNpbmcgVGhyaWZ0IHdpdGggQysrIG9uIFdpbmRvd3MKKworQm90aCB0aGUgYXV0b2NvbmYgYW5kIGNtYWtlIGJ1aWxkIHN5c3RlbXMgYXJlIGFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgbWFueQorc3lzdGVtIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3BlY2lmeSBsaWJyYXJ5IGxvY2F0aW9ucywgaG93ZXZlciBpZgoreW91IHJ1biBpbnRvIHByb2JsZW1zIG9yIHdhbnQgdG8gcmVkaXJlY3QgdGhyaWZ0IHRvIGJ1aWxkIGFuZCBsaW5rIGFnYWluc3QgeW91cgorb3duIHByb3ZpZGVkIHRoaXJkIHBhcnR5IGxpYnJhcmllczoKKworQk9PU1RfUk9PVCA6IEZvciBib29zdCwgZS5nLiBEOlxib29zdF8xXzU1XzAKK09QRU5TU0xfUk9PVF9ESVIgOiBGb3IgT3BlblNTTCwgZS5nLiBEOlxPcGVuU1NMLVdpbjMyCisKK29ubHkgcmVxdWlyZWQgYnkgbGlidGhyaWZ0bmI6CisKK0xJQkVWRU5UX1JPT1RfRElSIDogRm9yIExpYmV2ZW50IGUuZy4gRDpcbGliZXZlbnQtMi4wLjIxLXN0YWJsZQorCitTZWUgLzNyZHBhcnR5LnVzZXIgZm9yIG1vcmUgZGV0YWlscy4KKworVGhlIHNhbWUgbGlua2luZyBndWlkZWxpbmVzIGRlc2NyaWJlZCBhYm92ZSBmb3IgbGlidGhyaWZ0bmIgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgorCisjIyBMaW5raW5nIEFnYWluc3QgVGhyaWZ0CisKK1lvdSBuZWVkIHRvIGxpbmsgeW91ciBwcm9qZWN0IHRoYXQgdXNlcyB0aHJpZnQgYWdhaW5zdCBhbGwgdGhlIHRocmlmdAorZGVwZW5kZW5jaWVzOyBpbiB0aGUgY2FzZSBvZiBsaWJ0aHJpZnQsIGJvb3N0IGFuZCBmb3IKK2xpYnRocmlmdG5iLCBsaWJldmVudC4KKworSW4gdGhlIHByb2plY3QgcHJvcGVydGllcyB5b3UgbXVzdCBhbHNvIHNldCBIQVZFX0NPTkZJR19IIGFzIGZvcmNlIGluY2x1ZGUKK3RoZSBjb25maWcgaGVhZGVyOiAid2luZG93cy9jb25mZy5oIgorCisjIyBEZXBlbmRlbmNpZXMKKworVGhlIHNhbWUgZGVwZW5kZW5jaWVzIGZvciBzaGFyZWRfcHRyIGFzIGRlc2NyaWJlZCBhYm92ZSBhcHBseSB0byB3aW5kb3dzIGFzIHdlbGwuCisKK2Jvb3N0IHRocmVhZAoraHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvcmVsZWFzZS9kb2MvaHRtbC90aHJlYWQuaHRtbAorCitsaWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCitodHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LworCisjIyBOb3RlcyBvbiBib29zdCB0aHJlYWQgKHN0YXRpYyB2cyBzaGFyZWQpOgorCitCeSBkZWZhdWx0IGxpYi9jcHAvd2luZG93cy9mb3JjZV9pbmMuaCBkZWZpbmVzOgorCisgICAgI2RlZmluZSBCT09TVF9BTExfTk9fTElCIDEKKyAgICAjZGVmaW5lIEJPT1NUX1RIUkVBRF9OT19MSUIgMQorCitUaGlzIGhhcyBmb3IgZWZmZWN0IHRvIGhhdmUgdGhlIGhvc3QgYXBwbGljYXRpb24gbGlua2luZyBhZ2FpbnN0IFRocmlmdAordG8gaGF2ZSB0byBsaW5rIHdpdGggYm9vc3QgdGhyZWFkIGFzIGEgc3RhdGljIGxpYnJhcnkuCisKK0lmIHlvdSB3YW50ZWQgaW5zdGVhZCB0byBsaW5rIHdpdGggYm9vc3QgdGhyZWFkIGFzIGEgc2hhcmVkIGxpYnJhcnksCit5b3UnbGwgbmVlZCB0byB1bmNvbW1lbnQgdGhvc2UgdHdvIGxpbmVzLCBhbmQgcmVjb21waWxlLgorCisjIyBXaW5kb3dzIHZlcnNpb24gY29tcGF0aWJpbGl0eQorCitUaGUgVGhyaWZ0IGxpYnJhcnkgdGFyZ2V0cyBXaW5kb3dzIFhQIGZvciBicm9hZGVzdCBjb21wYXRiaWxpdHkuIEEgbm90YWJsZQorZGlmZmVyZW5jZSBpcyBpbiB0aGUgV2luZG93cy1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc29ja2V0IHBvbGwKK2Z1bmN0aW9uLiBUbyB0YXJnZXQgVmlzdGEsIFdpbjcgb3Igb3RoZXIgdmVyc2lvbnMsIGNvbW1lbnQgb3V0IHRoZSBsaW5lCisKKyAgICAjZGVmaW5lIFRBUkdFVF9XSU5fWFAuCisKKyMjIE5hbWVkIFBpcGVzCisKK05hbWVkIFBpcGUgdHJhbnNwb3J0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBUUGlwZSBhbmQgVFBpcGVTZXJ2ZXIgY2xhc3Nlcy4gVGhpcworaXMgY3VycmVudGx5IFdpbmRvd3Mtb25seS4gTmFtZWQgcGlwZSB0cmFuc3BvcnQgZm9yICpOSVggaGFzIG5vdCBiZWVuCitpbXBsZW1lbnRlZC4gRG9tYWluIHNvY2tldHMgYXJlIGEgYmV0dGVyIGNob2ljZSBmb3IgbG9jYWwgSVBDIHVuZGVyIG5vbi1XaW5kb3dzCitPUydzLiAqTklYIG5hbWVkIHBpcGVzIG9ubHkgc3VwcG9ydCAxOjEgY2xpZW50LXNlcnZlciBjb25uZWN0aW9uLgorCisjIFRocmlmdC9TU0wKKworIyMgU2NvcGUKKworVGhpcyBTU0wgb25seSBzdXBwb3J0cyBibG9ja2luZyBtb2RlIHNvY2tldCBJL08uIEl0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aAorVFNpbXBsZVNlcnZlciwgVFRocmVhZGVkU2VydmVyLCBhbmQgVFRocmVhZFBvb2xTZXJ2ZXIuCisKKyMjIEltcGxlbWVudGF0aW9uCisKK1RoZXJlJ3JlIHR3byBtYWluIGNsYXNzZXMgVFNTTFNvY2tldEZhY3RvcnkgYW5kIFRTU0xTb2NrZXQuIEluc3RhbmNlcyBvZgorVFNTTFNvY2tldCBhcmUgYWx3YXlzIGNyZWF0ZWQgZnJvbSBUU1NMU29ja2V0RmFjdG9yeS4KKworUG9zaXhTU0xUaHJlYWRGYWN0b3J5IGNyZWF0ZXMgUG9zaXhTU0xUaHJlYWQuIFRoZSBvbmx5IGRpZmZlcmVuY2UgZnJvbSB0aGUKK1B0aHJlYWRUaHJlYWQgdHlwZSBpcyB0aGF0IGl0IGNsZWFudXBzIE9wZW5TU0wgZXJyb3IgcXVldWUgdXBvbiBleGl0aW5nCit0aGUgdGhyZWFkLiBJZGVhbGx5LCBPcGVuU1NMIEFQSXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gUG9zaXhTU0xUaHJlYWQuCisKKyMjIEhvdyB0byB1c2UgU1NMIEFQSXMKKworVGhpcyBpcyBmb3IgZGVtby4gSW4gcmVhbCBjb2RlLCB0eXBpY2FsbHkgb25seSBvbmUgVFNTTFNvY2tldEZhY3RvcnkKK2luc3RhbmNlIGlzIG5lZWRlZC4KKworICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGdldFNTTFNvY2tldEZhY3RvcnkoKSB7CisgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgICAgIC8vIGNsaWVudDogbG9hZCB0cnVzdGVkIGNlcnRpZmljYXRlcworICAgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIm15LXRydXN0ZWQtY2EtY2VydGlmaWNhdGVzLnBlbSIpOworICAgICAgLy8gY2xpZW50OiBvcHRpb25hbGx5IHNldCB5b3VyIG93biBhY2Nlc3MgbWFuYWdlciwgb3RoZXJ3aXNlLAorICAgICAgLy8gICAgICAgICB0aGUgZGVmYXVsdCBjbGllbnQgYWNjZXNzIG1hbmFnZXIgd2lsbCBiZSBsb2FkZWQuCisKKyAgICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZSgibXktY2VydGlmaWNhdGUtc2lnbmVkLWJ5LWNhLnBlbSIpOworICAgICAgZmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoIm15LXByaXZhdGUta2V5LnBlbSIpOworICAgICAgLy8gc2VydmVyOiBvcHRpb25hbGx5IHNldHVwIGFjY2VzcyBtYW5hZ2VyCisgICAgICAvLyBzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc01hbmFnZXIobmV3IE15QWNjZXNzTWFuYWdlcik7CisgICAgICAvLyBmYWN0b3J5LT5hY2Nlc3MoYWNjZXNzTWFuYWdlcik7CisgICAgICAuLi4KKyAgICB9CisKKworY2xpZW50IGNvZGUgc2FtcGxlCisKKyAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5ID0gZ2V0U1NMU29ja2V0RmFjdG9yeSgpOworICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0ID0gZmFjdG9yeS5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgc2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICAgIC4uLgorCisKK3NlcnZlciBjb2RlIHNhbXBsZQorCisgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSA9IGdldFNTTFNvY2tldEZhY3RvcnkoKTsKKyAgICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBmYWN0b3J5KSk7CisgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkpOworICAgIC4uLgorCisjIyBBY2Nlc3NNYW5hZ2VyCisKK0FjY2Vzc01hbmFnZXIgZGVmaW5lcyBhIGNhbGxiYWNrIGludGVyZmFjZS4gSXQgaGFzIHRocmVlIGNhbGxiYWNrIG1ldGhvZHM6CisKKyhhKSBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpOworCisoYikgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpOworCisoYykgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSk7CisKK0FmdGVyIFNTTCBoYW5kc2hha2UgY29tcGxldGVzLCBhZGRpdGlvbmFsIGNoZWNrcyBhcmUgY29uZHVjdGVkLiBBcHBsaWNhdGlvbgoraXMgZ2l2ZW4gdGhlIGNoYW5jZSB0byBkZWNpZGUgd2hldGhlciBvciBub3QgdG8gY29udGludWUgdGhlIGNvbnZlcnNhdGlvbgord2l0aCB0aGUgcmVtb3RlLiBBcHBsaWNhdGlvbiBpcyBxdWVyaWVkIHRocm91Z2ggdGhlIGFib3ZlIHRocmVlICJ2ZXJpZnkiCittZXRob2QuIFRoZXkgYXJlIGNhbGxlZCBhdCBkaWZmZXJlbnQgcG9pbnRzIG9mIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KKworRGVjaXNpb25zIGNhbiBiZSBvbmUgb2YgQUxMT1csIERFTlksIGFuZCBTS0lQLiBBTExPVyBhbmQgREVOWSBtZWFucyB0aGUKK2NvbnZlcnNhdGlvbiBzaG91bGQgYmUgY29udGludWVkIG9yIGRpc2Nvbm5lY3RlZCwgcmVzcGVjdGl2ZWx5LiBBTExPVyBhbmQKK0RFTlkgZGVjaXNpb24gc3RvcHMgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBTS0lQIG1lYW5zIHRoZXJlJ3Mgbm8gZGVjaXNpb24KK2Jhc2VkIG9uIHRoZSBnaXZlbiBpbnB1dCwgY29udGludWUgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLgorCitGaXJzdCwgKGEpIGlzIGNhbGxlZCB3aXRoIHRoZSByZW1vdGUgSVAuIEl0IGlzIGNhbGxlZCBvbmNlIGF0IHRoZSBiZWdpbm5pbmcuCisic2EiIGlzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgcGVlci4KKworVGhlbiwgdGhlIGNlcnRpZmljYXRlIG9mIHJlbW90ZSBwZWVyIGlzIGxvYWRlZC4gU3ViamVjdEFsdE5hbWUgZXh0ZW5zaW9ucworYXJlIGV4dHJhY3RlZCBhbmQgc2VudCB0byBhcHBsaWNhdGlvbiBmb3IgdmVyaWZpY2F0aW9uLiBXaGVuIGEgRE5TCitzdWJqZWN0QWx0TmFtZSBmaWVsZCBpcyBleHRyYWN0ZWQsIChiKSBpcyBjYWxsZWQuIFdoZW4gYW4gSVAgc3ViamVjdEFsdE5hbWUKK2ZpZWxkIGlzIGV4dHJhY3RlZCwgKGMpIGlzIGNhbGxlZC4KKworVGhlICJob3N0IiBpbiAoYikgaXMgdGhlIHZhbHVlIGZyb20gVFNvY2tldDo6Z2V0SG9zdCgpIGlmIHRoaXMgaXMgYSBjbGllbnQKK3NpZGUgc29ja2V0LCBvciBUU29ja2V0OjpnZXRQZWVySG9zdCgpIGlmIHRoaXMgaXMgYSBzZXJ2ZXIgc2lkZSBzb2NrZXQuIFRoZQorcmVhc29uIGlzIGNsaWVudCBzaWRlIHNvY2tldCBpbml0aWF0ZXMgdGhlIGNvbm5lY3Rpb24uIFRTb2NrZXQ6OmdldEhvc3QoKQoraXMgdGhlIHJlbW90ZSBob3N0IG5hbWUuIE9uIHNlcnZlciBzaWRlLCB0aGUgcmVtb3RlIGhvc3QgbmFtZSBpcyB1bmtub3duCit1bmxlc3MgaXQncyByZXRyaWV2ZWQgdGhyb3VnaCBUU29ja2V0OjpnZXRQZWVySG9zdCgpLiBFaXRoZXIgd2F5LCAiaG9zdCIKK3Nob3VsZCBiZSB0aGUgcmVtb3RlIGhvc3QgbmFtZS4gS2VlcCBpbiBtaW5kLCBpZiBUU29ja2V0OjpnZXRQZWVySG9zdCgpCitmYWlsZWQsIGl0IHdvdWxkIHJldHVybiB0aGUgcmVtb3RlIGhvc3QgbmFtZSBpbiBudW1lcmljIGZvcm1hdC4KKworSWYgYWxsIHN1YmplY3RBbHROYW1lIGV4dGVuc2lvbnMgd2VyZSAic2tpcHBlZCIsIHRoZSBjb21tb24gbmFtZSBmaWVsZCB3b3VsZAorYmUgY2hlY2tlZC4gSXQgaXMgc2VudCB0byBhcHBsaWNhdGlvbiB0aHJvdWdoIChjKSwgd2hlcmUgInNhIiBpcyB0aGUgcmVtb3RlCitJUCBhZGRyZXNzLiAiZGF0YSIgaXMgdGhlIElQIGFkZHJlc3MgZXh0cmFjdGVkIGZyb20gc3ViamVjdEFsdE5hbWUgSVAKK2V4dGVuc2lvbiwgYW5kICJzaXplIiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBleHRlbnNpb24gZGF0YS4KKworSWYgYW55IG9mIHRoZSBhYm92ZSAidmVyaWZ5IiBtZXRob2RzIHJldHVybmVkIGEgZGVjaXNpb24gQUxMT1cgb3IgREVOWSwgdGhlCit2ZXJpZmljYXRpb24gcHJvY2VzcyB3b3VsZCBiZSBzdG9wcGVkLgorCitJZiBhbnkgb2YgdGhlIGFib3ZlICJ2ZXJpZnkiIG1ldGhvZHMgcmV0dXJuZWQgU0tJUCwgdGhhdCBkZWNpc2lvbiB3b3VsZCBiZQoraWdub3JlZCBhbmQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIHdvdWxkIG1vdmUgb24gdGlsbCB0aGUgbGFzdCBpdGVtIGlzCitleGFtaW5lZC4gQXQgdGhhdCBwb2ludCwgaWYgdGhlcmUncyBzdGlsbCBubyBkZWNpc2lvbiwgdGhlIGNvbm5lY3Rpb24gaXMKK3Rlcm1pbmF0ZWQuCisKK1RocmVhZCBzYWZldHksIGFuIGFjY2VzcyBtYW5hZ2VyIHNob3VsZCBub3Qgc3RvcmUgc3RhdGUgaW5mb3JtYXRpb24gaWYgaXQncwordG8gYmUgdXNlZCBieSBtYW55IFNTTCBzb2NrZXRzLgorCisjIyBTSUdQSVBFIHNpZ25hbAorCitBcHBsaWNhdGlvbnMgcnVubmluZyBPcGVuU1NMIG92ZXIgbmV0d29yayBjb25uZWN0aW9ucyBtYXkgY3Jhc2ggaWYgU0lHUElQRQoraXMgbm90IGlnbm9yZWQuIFRoaXMgaGFwcGVucyB3aGVuIHRoZXkgcmVjZWl2ZSBhIGNvbm5lY3Rpb24gcmVzZXQgYnkgcmVtb3RlCitwZWVyIGV4Y2VwdGlvbiwgd2hpY2ggc29tZWhvdyB0cmlnZ2VycyBhIFNJR1BJUEUgc2lnbmFsLiBJZiBub3QgaGFuZGxlZCwKK3RoaXMgc2lnbmFsIHdvdWxkIGtpbGwgdGhlIGFwcGxpY2F0aW9uLgorCisjIyBIb3cgdG8gcnVuIHRlc3QgY2xpZW50L3NlcnZlciBpbiBTU0wgbW9kZQorCitUaGUgc2VydmVyIGFuZCBjbGllbnQgZXhwZWN0cyB0aGUgZm9sbG93aW5ncyBmcm9tIHRoZSBkaXJlY3RvcnkgL3Rlc3QvCisKKy0ga2V5cy9zZXJ2ZXIuY3J0CistIGtleXMvc2VydmVyLmtleQorLSBrZXlzL0NBLnBlbQorCitUaGUgZmlsZSBuYW1lcyBhcmUgaGFyZCBjb2RlZCBpbiB0aGUgc291cmNlIGNvZGUuIFlvdSBuZWVkIHRvIGNyZWF0ZSB0aGVzZQorY2VydGlmaWNhdGVzIGJlZm9yZSB5b3UgY2FuIHJ1biB0aGUgdGVzdCBjb2RlIGluIFNTTCBtb2RlLiBNYWtlIHN1cmUgYXQgbGVhc3QKK29uZSBvZiB0aGUgZm9sbG93aW5ncyBpcyBpbmNsdWRlZCBpbiAia2V5cy9zZXJ2ZXIuY3J0IiwKKworLSBzdWJqZWN0QWx0TmFtZSwgRE5TIGxvY2FsaG9zdAorLSBzdWJqZWN0QWx0TmFtZSwgSVAgIDEyNy4wLjAuMQorLSBjb21tb24gbmFtZSwgICAgbG9jYWxob3N0CisKK1J1biB3aXRoaW4gL3Rlc3QvIGZvbGRlciwKKworICAgICAgICAgLi9jcHAvVGVzdFNlcnZlciAtLXNzbCAmCisgICAgICAgICAuL2NwcC9UZXN0Q2xpZW50IC0tc3NsCisKK0lmICItaCA8aG9zdD4iIGlzIHVzZWQgdG8gcnVuIGNsaWVudCwgdGhlIGFib3ZlICJsb2NhbGhvc3QiIGluIHRoZSBhYm92ZQora2V5cy9zZXJ2ZXIuY3J0IGhhcyB0byBiZSByZXBsYWNlZCB3aXRoIHRoYXQgaG9zdCBuYW1lLgorCisjIyBUU1NMU29ja2V0RmFjdG9yeTo6cmFuZG9taXplKCkKKworVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgT3BlblNTTFNvY2tldEZhY3Rvcnk6OnJhbmRvbWl6ZSgpIHNpbXBseSBjYWxscworT3BlblNTTCdzIFJBTkRfcG9sbCgpIHdoZW4gT3BlblNTTCBsaWJyYXJ5IGlzIGZpcnN0IGluaXRpYWxpemVkLgorCitUaGUgUFJORyBzZWVkIGlzIGtleSB0byB0aGUgYXBwbGljYXRpb24gc2VjdXJpdHkuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQorb3ZlcnJpZGRlbiBpZiBpdCdzIG5vdCBzdHJvbmcgZW5vdWdoIGZvciB5b3UuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjExLjAKKworT2xkZXIgdmVyc2lvbnMgb2YgdGhyaWZ0IGRlcGVuZGVkIG9uIHRoZSA8Ym9vc3Qvc21hcnRfcHRyLmhwcD4gY2xhc3NlcyB3aGljaAord2VyZSB1c2VkIGluIHRocmlmdCBoZWFkZXJzIHRvIGRlZmluZSBpbnRlcmZhY2VzLiAgVGhyaWZ0IG5vdyBkZXRlY3RzIEMrKzExCithdCBidWlsZCB0aW1lIGFuZCB3aWxsIHByZWZlciB0byB1c2UgPG1lbW9yeT4gY2xhc3NlcyBmcm9tIEMrKzExIGluc3RlYWQuCitZb3UgY2FuIGZvcmNlIHRoZSBsaWJyYXJ5IHRvIGJ1aWxkIHdpdGggYm9vc3QgbWVtb3J5IGNsYXNzZXMgYnkgZGVmaW5pbmcgdGhlCitwcmVwcm9jZXNzb3IgbWFjcm8gYEZPUkNFX0JPT1NUX1NNQVJUX1BUUmAuICAoVEhSSUZULTIyMjEpCisKK0luIHRoZSBwdGhyZWFkIG11dGV4IGltcGxlbWVudGF0aW9uLCB0aGUgY29udGVudGlvbiBwcm9maWxpbmcgY29kZSB3YXMgZW5hYmxlZAorYnkgZGVmYXVsdCBpbiBhbGwgYnVpbGRzLiAgVGhpcyBjaGFuZ2VkIHRvIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuICAoVEhSSUZULTQxNTEpCisKK0luIG9sZGVyIHJlbGVhc2VzLCBpZiBhIFRTU0xTb2NrZXRGYWN0b3J5J3MgbGlmZXRpbWUgd2FzIG5vdCBhdCBsZWFzdCBhcyBsb25nCithcyB0aGUgVFNTTFNvY2tldHMgaXQgY3JlYXRlZCwgd2Ugc2lsZW50bHkgcmV2ZXJ0ZWQgb3BlbnNzbCB0byB1bnNhZmUgbXVsdGl0aHJlYWQgYmVoYXZpb3IKK2FuZCBzbyB0aGUgcmVzdWx0cyB3ZXJlIHVuZGVmaW5lZC4gIENoYW5nZXMgd2VyZSBtYWRlIGluIDAuMTEuMCB0aGF0IGNhdXNlIGVpdGhlciBhbgorYXNzZXJ0aW9uIG9yIGEgY29yZSBpbnN0ZWFkIG9mIHVuZGVmaW5lZCBiZWhhdmlvci4gIFRoZSBsaWZldGltZSBvZiBhIFRTU0xTb2NrZXRGYWN0b3J5CisqbXVzdCogYmUgbG9uZ2VyIHRoYW4gYW55IFRTU0xTb2NrZXQgdGhhdCBpdCBjcmVhdGVzLCBvdGhlcndpc2Ugb3BlbnNzbCB3aWxsIGJlIGNsZWFuZWQKK3VwIHRvbyBlYXJseS4gIElmIHRoZSBzdGF0aWMgYm9vbGVhbiBpcyBzZXQgdG8gZGlzYWJsZSBvcGVuc3NsIGluaXRpYWxpemF0aW9uIGFuZAorY2xlYW51cCBhbmQgbGVhdmUgaXQgdXAgdG8gdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiwgdGhpcyByZXF1aXJlbWVudCBpcyBub3QgbmVlZGVkLgorKFRIUklGVC00MTY0KQorCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRV9XSU5ET1dTIGIvbGliL2NwcC9SRUFETUVfV0lORE9XUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjODg3Yy4uMDAwMDAwMAotLS0gYS9saWIvY3BwL1JFQURNRV9XSU5ET1dTCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLVRocmlmdCBDKysgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBDKysKLT09PT09PT09PT09PT09PT09PT09PQotCi1Zb3UgbmVlZCB0byBkZWZpbmUgYW4gZW52aXJvbWVudCB2YXJpYWJsZSBjYWxsZWQgVEhJUkRfUEFSVFkuIFRoZSBwcm9qZWN0Ci1hc3N1bWVzIHRoYXQgeW91IGhhdmUgZXh0cmFjdGVkIHRoZSBkZXBlbmRhbmNpZXMgaW50byB0aGVpciBkZWZhdWx0IHN0cnVjdHVyZQotaW50byB0aGUgcGF0aCBkZWZpbmVkIGJ5IFRISVJEX1BBUlRZLgotCi1lLmcuICQoVEhJUkRfUEFSVFkpL2Jvb3N0L2Jvb3N0XzFfNDdfMC8KLQotVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgotCi1saWJ0aHJpZnQKLSAgVGhlIGNvcmUgVGhyaWZ0IGxpYnJhcnkgY29udGFpbnMgYWxsIHRoZSBjb3JlIFRocmlmdCBjb2RlLiBJdCByZXF1aXJlcwotICBib29zdCBzaGFyZWQgcG9pbnRlcnMgYW5kIGJvb3N0IHRocmVhZC4KLQotbGlidGhyaWZ0bmIKLSAgVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgotICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KLQotTGlua2luZyBBZ2FpbnN0IFRocmlmdAotPT09PT09PT09PT09PT09PT09PT09PQotCi1Zb3UgbmVlZCB0byBsaW5rIHlvdXIgcHJvamVjdCB0aGF0IHVzZXMgdGhyaWZ0IGFnYWluc3QgYWxsIHRoZSB0aHJpZnQKLWRlcGVuZGFuY2llczsgaW4gdGhlIGNhc2Ugb2YgbGlidGhyaWZ0LCBib29zdCBhbmQgZm9yCi1saWJ0aHJpZnRuYiwgbGliZXZlbnQuCi0KLUluIHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgeW91IG11c3QgYWxzbyBzZXQgSEFWRV9DT05GSUdfSCBhcyBmb3JjZSBpbmNsdWRlCi10aGUgY29uZmlnIGhlYWRlcjogIndpbmRvd3MvY29uZmcuaCIKLQotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KLQotYm9vc3Qgc2hhcmVkIHBvaW50ZXJzCi1odHRwOi8vd3d3LmJvb3N0Lm9yZy9saWJzL3NtYXJ0X3B0ci9zbWFydF9wdHIuaHRtCi0KLWJvb3N0IHRocmVhZAotaHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvcmVsZWFzZS9kb2MvaHRtbC90aHJlYWQuaHRtbAotCi1saWJldmVudCAoZm9yIGxpYnRocmlmdG5iIG9ubHkpCi1odHRwOi8vbW9ua2V5Lm9yZy9+cHJvdm9zL2xpYmV2ZW50LwotCi1Ob3RlcyBvbiBib29zdCB0aHJlYWQgKHN0YXRpYyB2cyBzaGFyZWQpOgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQnkgZGVmYXVsdCBsaWIvY3BwL3dpbmRvd3MvZm9yY2VfaW5jLmggZGVmaW5lczoKLQotI2RlZmluZSBCT09TVF9BTExfTk9fTElCIDEKLSNkZWZpbmUgQk9PU1RfVEhSRUFEX05PX0xJQiAxCi0KLVRoaXMgaGFzIGZvciBlZmZlY3QgdG8gaGF2ZSB0aGUgaG9zdCBhcHBsaWNhdGlvbiBsaW5raW5nIGFnYWluc3QgVGhyaWZ0Ci10byBoYXZlIHRvIGxpbmsgd2l0aCBib29zdCB0aHJlYWQgYXMgYSBzdGF0aWMgbGlicmFyeS4KLQotSWYgeW91IHdhbnRlZCBpbnN0ZWFkIHRvIGxpbmsgd2l0aCBib29zdCB0aHJlYWQgYXMgYSBzaGFyZWQgbGlicmFyeSwKLXlvdSdsbCBuZWVkIHRvIHVuY29tbWVudCB0aG9zZSB0d28gbGluZXMsIGFuZCByZWNvbXBpbGUuCi0KLVdpbmRvd3MgdmVyc2lvbiBjb21wYXRpYmlsaXR5Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotVGhlIFRocmlmdCBsaWJyYXJ5IHRhcmdldHMgV2luZG93cyBYUCBmb3IgYnJvYWRlc3QgY29tcGF0YmlsaXR5LiBBIG5vdGFibGUKLWRpZmZlcmVuY2UgaXMgaW4gdGhlIFdpbmRvd3Mtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvY2tldCBwb2xsCi1mdW5jdGlvbi4gVG8gdGFyZ2V0IFZpc3RhLCBXaW43IG9yIG90aGVyIHZlcnNpb25zLCBjb21tZW50IG91dCB0aGUgbGluZQotI2RlZmluZSBUQVJHRVRfV0lOX1hQLgotCi1OYW1lZCBQaXBlcwotPT09PT09PT09PT0KLS0gTmFtZWQgUGlwZSB0cmFuc3BvcnQgaGFzIGJlZW4gYWRkZWQgaW4gdGhlIFRQaXBlIGFuZCBUUGlwZVNlcnZlciBjbGFzc2VzLgotICBUaGlzIGlzIGN1cnJlbnRseSBXaW5kb3dzLW9ubHkgKHNlZSBiZWxvdykuCi0KLUtub3duIGlzc3VlcwotPT09PT09PT09PT09Ci0KLS0gTmFtZWQgcGlwZSB0cmFuc3BvcnQgZm9yICpOSVggaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLiBEb21haW4gc29ja2V0cyBhcmUKLSAgYSBiZXR0ZXIgY2hvaWNlIGZvciBsb2NhbCBJUEMgdW5kZXIgbm9uLVdpbmRvd3MgT1Mncy4gKk5JWCBuYW1lZCBwaXBlcyAKLSAgb25seSBzdXBwb3J0IDE6MSBjbGllbnQtc2VydmVyIGNvbm5lY3Rpb24uCi0KLVRPRE8KLT09PT0KLQotLSBQb3J0IHJlbWFpbmluZyBjbGFzc2VzIGluIGxpYnRocmlmdDoKLSAgICAtIFRTU0xTb2NrZXQKLQotLSBQb3J0IHRlc3QgY2FzZXMuIChOb3QgZXZlbiBzdGFydGVkIHRoaXMuIFJ1biB0ZXN0IGNhc2VzIGluIHJlbGVhc2UgbW9kZT8pCi0KLS0gQXV0b2xpbmsgbGlicmFyaWVzIGRlcGVuZGluZyBvbiBkZWJ1Z1xyZWxlYXNlIGJ1aWxkLgotCi0tIEF1dG8gdmVyc2lvbmluZy4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9jcHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDE4Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNCBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisKKyAqIHNlZSAuY2xhbmctZm9ybWF0IGluIHJvb3QgZGlyIGZvciBzZXR0aW5ncyBvZiBhY2NlcHRlZCBmb3JtYXQKKyAqIGNsYW5nLWZvcm1hdCAoMy41IG9yIG5ld2VyKSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbHkgcmVmb3JtYXQgY29kZSAoJ21ha2Ugc3R5bGUnIGNvbW1hbmQpCmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagppbmRleCBkODNhOWNlLi5kMTA5N2VjIDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKQEAgLTEsNCArMSw0IEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KIDxQcm9qZWN0IERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgVG9vbHNWZXJzaW9uPSI0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8SXRlbUdyb3VwIExhYmVsPSJQcm9qZWN0Q29uZmlndXJhdGlvbnMiPgogICAgIDxQcm9qZWN0Q29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1Zy1tdHxXaW4zMiI+CkBAIC0zNSwyNDQgKzM1LDcxIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TW9uaXRvci5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0TXV0ZXguY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuY3BwIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxUaHJlYWRNYW5hZ2VyLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxUaW1lck1hbmFnZXIuY3BwIj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFV0aWwuY3BwIj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGhyZWFkTWFuYWdlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29uY3VycmVuY3lcVGltZXJNYW5hZ2VyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxVdGlsLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm9jZXNzb3JcUGVla1Byb2Nlc3Nvci5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJhc2U2NFV0aWxzLmNwcCIgLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuY3BwIj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZW5zZVByb3RvY29sLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUSlNPTlByb3RvY29sLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRCdWZmZXJUcmFuc3BvcnRzLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFByb3RvY29sLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRDb25uZWN0ZWRDbGllbnQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2VydmVyRnJhbWV3b3JrLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5jcHAiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURmlsZVRyYW5zcG9ydC5jcHAiPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KLSAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+Ci0gICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cENsaWVudC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFNlcnZlci5jcHAiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUSHR0cFRyYW5zcG9ydC5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRIdHRwVHJhbnNwb3J0LmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGUuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFBpcGVTZXJ2ZXIuY3BwIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAiIC8+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU29ja2V0LmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNTTFNvY2tldC5jcHAiPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KLSAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+Ci0gICAgICA8RXhjbHVkZWRGcm9tQnVpbGQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KLSAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHxXaW4zMiciPnRydWU8L0V4Y2x1ZGVkRnJvbUJ1aWxkPgotICAgICAgPEV4Y2x1ZGVkRnJvbUJ1aWxkIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj50cnVlPC9FeGNsdWRlZEZyb21CdWlsZD4KLSAgICAgIDxFeGNsdWRlZEZyb21CdWlsZCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+dHJ1ZTwvRXhjbHVkZWRGcm9tQnVpbGQ+Ci0gICAgPC9DbENvbXBpbGU+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZpbGVUcmFuc3BvcnQuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFNvY2tldC5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRTU0xTb2NrZXQuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFRyYW5zcG9ydFV0aWxzLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXEdldFRpbWVPZkRheS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuY3BwIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFN0ZEFmeC5jcHAiPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICAgIDxQcmVjb21waWxlZEhlYWRlciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgotICAgICAgPFByZWNvbXBpbGVkSGVhZGVyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+Ci0gICAgICA8UHJlY29tcGlsZWRIZWFkZXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KLSAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUV2luc29ja1NpbmdsZXRvbi5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuY3BwIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jQ2hhbm5lbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEV4Y2VwdGlvbi5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxQbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlbnNlUHJvdG9jb2wuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUUHJvdG9jb2wuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFZpcnR1YWxQcm90b2NvbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNpbXBsZVNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUQXBwbGljYXRpb25FeGNlcHRpb24uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRPdXRwdXQuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcVFByb2Nlc3Nvci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRGRFRyYW5zcG9ydC5oIiAvPgpAQCAtMjkxLDE4ICsxMTgsMTUgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFRUcmFuc3BvcnRVdGlscy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVFZpcnR1YWxUcmFuc3BvcnQuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xHZXRUaW1lT2ZEYXkuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPcGVyYXRvcnMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXFNvY2tldFBhaXIuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUYXJnZXRWZXJzaW9uLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVFdpbnNvY2tTaW5nbGV0b24uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xXaW5GY250bC5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRCaW5hcnlQcm90b2NvbC50Y2MiIC8+Ci0gICAgPE5vbmUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXHRyMVxmdW5jdGlvbmFsIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPFByb3BlcnR5R3JvdXAgTGFiZWw9Ikdsb2JhbHMiPgogICAgIDxQcm9qZWN0R3VpZD57REQyNkY1N0UtNjBGMi00RjM3LUE2MTYtRDIxOUE5QkYzMzhGfTwvUHJvamVjdEd1aWQ+CkBAIC0zNjAsNjAgKzE4NCw2NyBAQAogICA8L0ltcG9ydEdyb3VwPgogICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CiAgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CiAgIDwvSW1wb3J0R3JvdXA+CiAgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CiAgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CiAgIDwvSW1wb3J0R3JvdXA+CiAgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgogICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgogICA8L0ltcG9ydEdyb3VwPgogICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CiAgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CiAgIDwvSW1wb3J0R3JvdXA+CiAgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMlxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMlxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+Ci0gICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXGluY2x1ZGU7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXDskKFRISVJEX1BBUlRZKVxvcGVuc3NsXE9wZW5TU0wtV2luMzJcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgotICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoVEhJUkRfUEFSVFkpXGJvb3N0XGJvb3N0XzFfNDdfMFxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGJvb3N0XGJvb3N0XzFfNDdfMFw7JChUSElSRF9QQVJUWSlcb3BlbnNzbFxPcGVuU1NMLVdpbjMyXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChPUEVOU1NMX1JPT1RfRElSKVxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXGluY2x1ZGU7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXDskKFRISVJEX1BBUlRZKVxvcGVuc3NsXE9wZW5TU0wtV2luMzJcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKE9QRU5TU0xfUk9PVF9ESVIpXGluY2x1ZGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMlxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMlxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXG9wZW5zc2xcT3BlblNTTC1XaW4zMlxpbmNsdWRlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoT1BFTlNTTF9ST09UX0RJUilcaW5jbHVkZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KICAgICA8Q2xDb21waWxlPgogICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KICAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CiAgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CkBAIC00MjcsOCArMjU4LDcgQEAKICAgICAgIDxQcmVjb21waWxlZEhlYWRlcj5Ob3RVc2luZzwvUHJlY29tcGlsZWRIZWFkZXI+CiAgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgogICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmg7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KICAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgpAQCAtNDQyLDggKzI3Miw3IEBACiAgICAgICA8UHJlY29tcGlsZWRIZWFkZXI+Tm90VXNpbmc8L1ByZWNvbXBpbGVkSGVhZGVyPgogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KQEAgLTQ1NSw4ICsyODQsNyBAQAogICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPk5vdFVzaW5nPC9QcmVjb21waWxlZEhlYWRlcj4KICAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CiAgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CkBAIC00NzEsOCArMjk5LDcgQEAKICAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmg7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKEludERpcilsaWJ0aHJpZnQucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTQ4OSw4ICszMTYsNyBAQAogICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdC5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPgogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgpAQCAtNTA4LDggKzMzNCw3IEBACiAgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CiAgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CiAgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4KQEAgLTUyNSw4ICszNTAsNyBAQAogICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgpAQCAtNTM5LDQgKzM2Myw0IEBACiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CiAgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CiAgIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzIGIvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvai5maWx0ZXJzCmluZGV4IDM5MjI5ODguLjVmNjRmNzggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2ouZmlsdGVycworKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qLmZpbHRlcnMKQEAgLTQsNyArNCw3IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUQnVmZmVyVHJhbnNwb3J0cy5jcHAiPgogICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVGhyaWZ0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVE91dHB1dC5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KQEAgLTI1LDE2ICsyNSwxNiBAQAogICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVidWdQcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxURGVuc2VQcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmFzZTY0VXRpbHMuY3BwIj4KLSAgICAgIDxGaWx0ZXI+cHJvdG9jYWw8L0ZpbHRlcj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcHAiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAiPgorICAgICAgPEZpbHRlcj5wcm90b2NvbDwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEZEVHJhbnNwb3J0LmNwcCI+CiAgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgpAQCAtNjYsOSArNjYsMTUgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNwcCI+CiAgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNwcCI+CisgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNDaGFubmVsLmNwcCI+CiAgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIj4KKyAgICAgIDxGaWx0ZXI+YXN5bmM8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFBlZWtQcm9jZXNzb3IuY3BwIj4KICAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC05Myw2ICs5OSw5IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XEJvb3N0VGhyZWFkRmFjdG9yeS5jcHAiPgogICAgICAgPEZpbHRlcj5jb25jdXJyZW5jeTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxTdGRUaHJlYWRGYWN0b3J5LmNwcCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbENvbXBpbGU+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcV2luRmNudGwuY3BwIj4KICAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgpAQCAtMTExLDcgKzEyMCw3IEBACiAgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuaCI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XFRocmlmdC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUUHJvY2Vzc29yLmgiIC8+CkBAIC0xNDQsMTAgKzE1MywxMCBAQAogICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRQcm90b2NvbC5oIj4KLSAgICAgIDxGaWx0ZXI+cHJvdG9jYWw8L0ZpbHRlcj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVFZpcnR1YWxQcm90b2NvbC5oIj4KLSAgICAgIDxGaWx0ZXI+cHJvdG9jYWw8L0ZpbHRlcj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRTZXJ2ZXIuaCI+CiAgICAgICA8RmlsdGVyPnNlcnZlcjwvRmlsdGVyPgpAQCAtMTU4LDEyICsxNjcsMjEgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmgiPgogICAgICAgPEZpbHRlcj5zZXJ2ZXI8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFRUaHJlYWRlZFNlcnZlci5oIj4KKyAgICAgIDxGaWx0ZXI+c2VydmVyPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY0NoYW5uZWwuaCI+CiAgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaCI+CisgICAgICA8RmlsdGVyPmFzeW5jPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb2Nlc3NvclxQZWVrUHJvY2Vzc29yLmgiPgogICAgICAgPEZpbHRlcj5wcm9jZXNzb3I8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvY2Vzc29yXFRNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvY2Vzc29yPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxURkRUcmFuc3BvcnQuaCI+CiAgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtMTg2LDEzICsyMDQsMTMgQEAKICAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFRKU09OUHJvdG9jb2wuaCI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHByb3RvY29sXFREZW5zZVByb3RvY29sLmgiPgotICAgICAgPEZpbHRlcj5wcm90b2NhbDwvRmlsdGVyPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxwcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbC5oIj4KKyAgICAgIDxGaWx0ZXI+cHJvdG9jb2w8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVERlYnVnUHJvdG9jb2wuaCI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUU2VydmVyU29ja2V0LmgiPgogICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KQEAgLTIxMiw2ICsyMzAsOSBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxjb25jdXJyZW5jeVxCb29zdFRocmVhZEZhY3RvcnkuaCI+CiAgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFN0ZFRocmVhZEZhY3RvcnkuaCI+CisgICAgICA8RmlsdGVyPmNvbmN1cnJlbmN5PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGNvbmN1cnJlbmN5XFBsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIj4KICAgICAgIDxGaWx0ZXI+Y29uY3VycmVuY3k8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTIyNiw3ICsyNDcsNyBAQAogICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KLSAgICA8RmlsdGVyIEluY2x1ZGU9InByb3RvY2FsIj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InByb3RvY29sIj4KICAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnswN2NlZDE5Yi1iNzJhLTQxMDUtOWZmYi02ZDJiY2Y2NDQ5N2V9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgogICAgIDxGaWx0ZXIgSW5jbHVkZT0idHJhbnNwb3J0Ij4KQEAgLTI1MywxMCArMjc0LDEwIEBACiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRccHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLnRjYyI+Ci0gICAgICA8RmlsdGVyPnByb3RvY2FsPC9GaWx0ZXI+CisgICAgICA8RmlsdGVyPnByb3RvY29sPC9GaWx0ZXI+CiAgICAgPC9Ob25lPgogICAgIDxOb25lIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1x0cjFcZnVuY3Rpb25hbCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3NcdHIxPC9GaWx0ZXI+CiAgICAgPC9Ob25lPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKaW5kZXggNDU1OTE4MS4uOWE2ZmZlNiAxMDA3NTUKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpAQCAtMzUsNTYgKzM1LDIzIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCI+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgIDwvQ2xDb21waWxlPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Zy1tdHxXaW4zMiciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fFdpbjMyJyI+X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj5fQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlLW10fHg2NCciPl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICA8L0NsQ29tcGlsZT4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBDbGllbnRDaGFubmVsLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xUQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwU2VydmVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xjb25maWcuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xUYXJnZXRWZXJzaW9uLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+CkBAIC0xNDIsNTIgKzEwOSw2MCBAQAogICA8L0ltcG9ydEdyb3VwPgogICA8SW1wb3J0R3JvdXAgTGFiZWw9IlByb3BlcnR5U2hlZXRzIiBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+CiAgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CiAgIDwvSW1wb3J0R3JvdXA+CiAgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fFdpbjMyJyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPEltcG9ydEdyb3VwIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+CiAgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CiAgIDwvSW1wb3J0R3JvdXA+CiAgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPgogICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4KKyAgICA8SW1wb3J0IFByb2plY3Q9IjNyZHBhcnR5LnByb3BzIiAvPgogICA8L0ltcG9ydEdyb3VwPgogICA8SW1wb3J0R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+CiAgICAgPEltcG9ydCBQcm9qZWN0PSIkKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMiIENvbmRpdGlvbj0iZXhpc3RzKCckKFVzZXJSb290RGlyKVxNaWNyb3NvZnQuQ3BwLiQoUGxhdGZvcm0pLnVzZXIucHJvcHMnKSIgTGFiZWw9IkxvY2FsQXBwRGF0YVBsYXRmb3JtIiAvPgorICAgIDxJbXBvcnQgUHJvamVjdD0iM3JkcGFydHkucHJvcHMiIC8+CiAgIDwvSW1wb3J0R3JvdXA+CiAgIDxJbXBvcnRHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8eDY0JyIgTGFiZWw9IlByb3BlcnR5U2hlZXRzIj4KICAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+CisgICAgPEltcG9ydCBQcm9qZWN0PSIzcmRwYXJ0eS5wcm9wcyIgLz4KICAgPC9JbXBvcnRHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgTGFiZWw9IlVzZXJNYWNyb3MiIC8+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcV0lOMzItQ29kZVw7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWctbXR8V2luMzInIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcV0lOMzItQ29kZVw7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8eDY0JyI+Ci0gICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXGluY2x1ZGU7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXDskKFRISVJEX1BBUlRZKVxsaWJldmVudFxsaWJldmVudC0yLjAuMTMtc3RhYmxlXFdJTjMyLUNvZGVcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxsaWJldmVudFxsaWJldmVudC0yLjAuMTMtc3RhYmxlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnLW10fHg2NCciPgotICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoVEhJUkRfUEFSVFkpXGJvb3N0XGJvb3N0XzFfNDdfMFxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGJvb3N0XGJvb3N0XzFfNDdfMFw7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVxXSU4zMi1Db2RlXDskKFRISVJEX1BBUlRZKVxsaWJldmVudFxsaWJldmVudC0yLjAuMTMtc3RhYmxlXGluY2x1ZGU7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgorICAgIDxJbmNsdWRlUGF0aD4kKFByb2plY3REaXIpXHNyY1w7JChQcm9qZWN0RGlyKVxzcmNcdGhyaWZ0XHdpbmRvd3NcOyQoQk9PU1RfUk9PVClcaW5jbHVkZTskKEJPT1NUX1JPT1QpXDskKExJQkVWRU5UX1JPT1QpXFdJTjMyLUNvZGVcOyQoTElCRVZFTlRfUk9PVClcaW5jbHVkZTskKExJQkVWRU5UX1JPT1QpXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+Ci0gICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXGluY2x1ZGU7JChUSElSRF9QQVJUWSlcYm9vc3RcYm9vc3RfMV80N18wXDskKFRISVJEX1BBUlRZKVxsaWJldmVudFxsaWJldmVudC0yLjAuMTMtc3RhYmxlXFdJTjMyLUNvZGVcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxsaWJldmVudFxsaWJldmVudC0yLjAuMTMtc3RhYmxlXDskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+CisgICAgPEluY2x1ZGVQYXRoPiQoUHJvamVjdERpcilcc3JjXDskKFByb2plY3REaXIpXHNyY1x0aHJpZnRcd2luZG93c1w7JChCT09TVF9ST09UKVxpbmNsdWRlOyQoQk9PU1RfUk9PVClcOyQoTElCRVZFTlRfUk9PVClcV0lOMzItQ29kZVw7JChMSUJFVkVOVF9ST09UKVxpbmNsdWRlOyQoTElCRVZFTlRfUk9PVClcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UtbXR8V2luMzInIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcV0lOMzItQ29kZVw7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXx4NjQnIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcV0lOMzItQ29kZVw7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZS1tdHx4NjQnIj4KLSAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcaW5jbHVkZTskKFRISVJEX1BBUlRZKVxib29zdFxib29zdF8xXzQ3XzBcOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcV0lOMzItQ29kZVw7JChUSElSRF9QQVJUWSlcbGliZXZlbnRcbGliZXZlbnQtMi4wLjEzLXN0YWJsZVxpbmNsdWRlOyQoVEhJUkRfUEFSVFkpXGxpYmV2ZW50XGxpYmV2ZW50LTIuMC4xMy1zdGFibGVcOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4KKyAgICA8SW5jbHVkZVBhdGg+JChQcm9qZWN0RGlyKVxzcmNcOyQoUHJvamVjdERpcilcc3JjXHRocmlmdFx3aW5kb3dzXDskKEJPT1NUX1JPT1QpXGluY2x1ZGU7JChCT09TVF9ST09UKVw7JChMSUJFVkVOVF9ST09UKVxXSU4zMi1Db2RlXDskKExJQkVWRU5UX1JPT1QpXGluY2x1ZGU7JChMSUJFVkVOVF9ST09UKVw7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPgogICA8L1Byb3BlcnR5R3JvdXA+CiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4KICAgICA8Q2xDb21waWxlPgpAQCAtMTk1LDggKzE3MCw3IEBACiAgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPgogICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtfREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0bmIucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTIxMCw4ICsxODQsNyBAQAogICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KICAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CiAgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CiAgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZERlYnVnPC9SdW50aW1lTGlicmFyeT4KICAgICA8L0NsQ29tcGlsZT4KQEAgLTIyNiw4ICsxOTksNyBAQAogICAgICAgPC9QcmVjb21waWxlZEhlYWRlcj4KICAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+CiAgICAgICA8T3B0aW1pemF0aW9uPkRpc2FibGVkPC9PcHRpbWl6YXRpb24+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7X0RFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPFN1YlN5c3RlbT5XaW5kb3dzPC9TdWJTeXN0ZW0+CkBAIC0yNDAsOCArMjEyLDcgQEAKICAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+CiAgICAgICA8V2FybmluZ0xldmVsPkxldmVsMzwvV2FybmluZ0xldmVsPgogICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmg7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO19ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWc8L1J1bnRpbWVMaWJyYXJ5PgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgpAQCAtMjU3LDggKzIyOCw3IEBACiAgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CiAgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CiAgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChJbnREaXIpbGlidGhyaWZ0bmIucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KQEAgLTI3Niw4ICsyNDYsNyBAQAogICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPgogICAgICAgPEZ1bmN0aW9uTGV2ZWxMaW5raW5nPnRydWU8L0Z1bmN0aW9uTGV2ZWxMaW5raW5nPgogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+Ci0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgotICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xmb3JjZV9pbmMuaDslKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5IQVZFX0NPTkZJR19IPTE7V0lOMzI7TkRFQlVHO19MSUI7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoSW50RGlyKWxpYnRocmlmdG5iLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+CiAgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0yOTYsOCArMjY1LDcgQEAKICAgICAgIDxPcHRpbWl6YXRpb24+TWF4U3BlZWQ8L09wdGltaXphdGlvbj4KICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4KICAgICAgIDxJbnRyaW5zaWNGdW5jdGlvbnM+dHJ1ZTwvSW50cmluc2ljRnVuY3Rpb25zPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KLSAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmg7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+CisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+SEFWRV9DT05GSUdfSD0xO1dJTjMyO05ERUJVRztfTElCOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KICAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPgpAQCAtMzE0LDggKzI4Miw3IEBACiAgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+CiAgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+CiAgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+Ci0gICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPnRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oOyUoRm9yY2VkSW5jbHVkZUZpbGVzKTwvRm9yY2VkSW5jbHVkZUZpbGVzPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkhBVkVfQ09ORklHX0g9MTtXSU4zMjtOREVCVUc7X0xJQjslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+CiAgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCmluZGV4IDUyNDU1NDQuLjg1NzAzZGQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvai5maWx0ZXJzCkBAIC0xMCw2ICsxMCw5IEBACiAgICAgPEZpbHRlciBJbmNsdWRlPSJ3aW5kb3dzIj4KICAgICAgIDxVbmlxdWVJZGVudGlmaWVyPns2MGZjOWU1ZS0wODY2LTRhYmEtODY2Mi00MzliYjRhNDYxZDN9PC9VbmlxdWVJZGVudGlmaWVyPgogICAgIDwvRmlsdGVyPgorICAgIDxGaWx0ZXIgSW5jbHVkZT0idHJhbnNwb3J0Ij4KKyAgICAgIDxVbmlxdWVJZGVudGlmaWVyPnsyM2ZlMmZkZS1hN2M5LTQzZWMtYTQwOS03ZjUzZGY1ZWVlNjR9PC9VbmlxdWVJZGVudGlmaWVyPgorICAgIDwvRmlsdGVyPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiPgpAQCAtMjcsNiArMzAsMTIgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcd2luZG93c1xTdGRBZnguY3BwIj4KICAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5oIj4KQEAgLTUzLDUgKzYyLDE0IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiPgogICAgICAgPEZpbHRlcj53aW5kb3dzPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKaW5kZXggMTExMGJhMi4uMmYxNDY1MyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcHAKQEAgLTIwLDcgKzIwLDggQEAKICNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCiB1aW50MzJfdCBUQXBwbGljYXRpb25FeGNlcHRpb246OnJlYWQoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KSB7CiAgIHVpbnQzMl90IHhmZXIgPSAwOwpAQCAtNzYsNSArNzcsNSBAQAogICB4ZmVyICs9IG9wcm90LT53cml0ZVN0cnVjdEVuZCgpOwogICByZXR1cm4geGZlcjsKIH0KLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaAppbmRleCA3OWYwMjZkLi42MDYxOGZiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCkBAIC0yMiwxNiArMjIsMTUgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCiBuYW1lc3BhY2UgcHJvdG9jb2wgewotICBjbGFzcyBUUHJvdG9jb2w7CitjbGFzcyBUUHJvdG9jb2w7CiB9CiAKIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IHB1YmxpYyBURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyoqCiAgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgogICAgKi8KQEAgLTQzLDI3ICs0MiwyMiBAQAogICAgIEJBRF9TRVFVRU5DRV9JRCA9IDQsCiAgICAgTUlTU0lOR19SRVNVTFQgPSA1LAogICAgIElOVEVSTkFMX0VSUk9SID0gNiwKLSAgICBQUk9UT0NPTF9FUlJPUiA9IDcKKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcsCisgICAgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4LAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5LAorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAKICAgfTsKIAotICBUQXBwbGljYXRpb25FeGNlcHRpb24oKSA6Ci0gICAgVEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKFVOS05PV04pIHt9CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIDogVEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQogCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUpIDoKLSAgICBURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgdHlwZSkgOiBURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CiAKLSAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgVEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQorICBUQXBwbGljYXRpb25FeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8oVU5LTk9XTikge30KIAotICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKHR5cGUpIHt9CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogVEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8odHlwZSkge30KIAotICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKICAgLyoqCiAgICAqIFJldHVybnMgYW4gZXJyb3IgY29kZSB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIGVycm9yCkBAIC03MSwyMCArNjUsMzUgQEAKICAgICoKICAgICogQHJldHVybiBFcnJvciBjb2RlCiAgICAqLwotICBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGdldFR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGVfOwotICB9CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFVua25vd24gYXBwbGljYXRpb24gZXhjZXB0aW9uIjsKLSAgICAgICAgY2FzZSBVTktOT1dOX01FVEhPRCAgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIG1ldGhvZCI7Ci0gICAgICAgIGNhc2UgSU5WQUxJRF9NRVNTQUdFX1RZUEUgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW52YWxpZCBtZXNzYWdlIHR5cGUiOwotICAgICAgICBjYXNlIFdST05HX01FVEhPRF9OQU1FICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFdyb25nIG1ldGhvZCBuYW1lIjsKLSAgICAgICAgY2FzZSBCQURfU0VRVUVOQ0VfSUQgICAgICA6IHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBCYWQgc2VxdWVuY2UgaWRlbnRpZmllciI7Ci0gICAgICAgIGNhc2UgTUlTU0lOR19SRVNVTFQgICAgICAgOiByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogTWlzc2luZyByZXN1bHQiOwotICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgIDogcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CisgICAgICBjYXNlIFVOS05PV046CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiI7CisgICAgICBjYXNlIFVOS05PV05fTUVUSE9EOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogVW5rbm93biBtZXRob2QiOworICAgICAgY2FzZSBJTlZBTElEX01FU1NBR0VfVFlQRToKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEludmFsaWQgbWVzc2FnZSB0eXBlIjsKKyAgICAgIGNhc2UgV1JPTkdfTUVUSE9EX05BTUU6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBXcm9uZyBtZXRob2QgbmFtZSI7CisgICAgICBjYXNlIEJBRF9TRVFVRU5DRV9JRDoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IEJhZCBzZXF1ZW5jZSBpZGVudGlmaWVyIjsKKyAgICAgIGNhc2UgTUlTU0lOR19SRVNVTFQ6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBNaXNzaW5nIHJlc3VsdCI7CisgICAgICBjYXNlIElOVEVSTkFMX0VSUk9SOgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogSW50ZXJuYWwgZXJyb3IiOworICAgICAgY2FzZSBQUk9UT0NPTF9FUlJPUjoKKyAgICAgICAgcmV0dXJuICJUQXBwbGljYXRpb25FeGNlcHRpb246IFByb3RvY29sIGVycm9yIjsKKyAgICAgIGNhc2UgSU5WQUxJRF9UUkFOU0ZPUk06CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIHRyYW5zZm9ybSI7CisgICAgICBjYXNlIElOVkFMSURfUFJPVE9DT0w6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBJbnZhbGlkIHByb3RvY29sIjsKKyAgICAgIGNhc2UgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6CisgICAgICAgIHJldHVybiAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uOiBVbnN1cHBvcnRlZCBjbGllbnQgdHlwZSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKICAgICAgIH07CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwpAQCAtOTQsMTQgKzEwMywxMyBAQAogICB1aW50MzJfdCByZWFkKHByb3RvY29sOjpUUHJvdG9jb2wqIGlwcm90KTsKICAgdWludDMyX3Qgd3JpdGUocHJvdG9jb2w6OlRQcm90b2NvbCogb3Byb3QpIGNvbnN0OwogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICAvKioKICAgICogRXJyb3IgY29kZQogICAgKi8KICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlXzsKLQogfTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVBQTElDQVRJT05FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3NGJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQmFzZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCisjZGVmaW5lIF9USFJJRlRfVEJBU0VfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKworY2xhc3MgVEJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5UQmFzZSgpe307CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZChwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKHByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90KSBjb25zdCA9IDA7Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RCQVNFX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKaW5kZXggZjk4NzUxYi4uMjhkMzQ3ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMTksOSArMTksMTAgQEAKICNpZm5kZWYgX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8KICNkZWZpbmUgX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8gMQogCi0jaW5jbHVkZSAiVFByb2Nlc3Nvci5oIgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CiAKIC8qKgogICogVERpc3BhdGNoUHJvY2Vzc29yIGlzIGEgaGVscGVyIGNsYXNzIHRvIHBhcnNlIHRoZSBtZXNzYWdlIGhlYWRlciB0aGVuIGNhbGwKQEAgLTMxLDkgKzMyLDkgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KIGNsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQgOiBwdWJsaWMgVFByb2Nlc3NvciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorcHVibGljOgorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CkBAIC02MCwxNSArNjEsMTQgQEAKICAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAogICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQogICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtdHlwZSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsKGluUmF3LCBvdXRSYXcsIGZuYW1lLCBzZXFpZCwgY29ubmVjdGlvbkNvbnRleHQpOwogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIGJvb2wgcHJvY2Vzc0Zhc3QoUHJvdG9jb2xfKiBpbiwgUHJvdG9jb2xfKiBvdXQsIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAgICAgc3RkOjpzdHJpbmcgZm5hbWU7CiAgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZTsKQEAgLTc2LDEzICs3NiwxMSBAQAogICAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOwogCiAgICAgaWYgKG10eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gcHJvdG9jb2w6OlRfT05FV0FZKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG10eXBlKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwgbXR5cGUpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGxUZW1wbGF0ZWQoaW4sIG91dCwgZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCwgY29ubmVjdGlvbkNvbnRleHQpOworICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGxUZW1wbGF0ZWQoaW4sIG91dCwgZm5hbWUsIHNlcWlkLCBjb25uZWN0aW9uQ29udGV4dCk7CiAgIH0KIAogICAvKioKQEAgLTkwLDExICs4OCwxNCBAQAogICAgKi8KICAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbChhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY2FsbENvbnRleHQpID0gMDsKIAotICB2aXJ0dWFsIGJvb2wgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKFByb3RvY29sXyogaW4sIFByb3RvY29sXyogb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwgaW50MzJfdCBzZXFpZCwKKyAgdmlydHVhbCBib29sIGRpc3BhdGNoQ2FsbFRlbXBsYXRlZChQcm90b2NvbF8qIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxDb250ZXh0KSA9IDA7CiB9OwogCkBAIC0xMDMsOSArMTA0LDkgQEAKICAqIHBlcmZvcm0gYSBkeW5hbWljX2Nhc3QuCiAgKi8KIGNsYXNzIFREaXNwYXRjaFByb2Nlc3NvciA6IHB1YmxpYyBUUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCitwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOwpAQCAtMTEzLDMwICsxMTQsMjggQEAKICAgICBpbi0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKIAogICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtdHlwZSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICByZXR1cm4gZGlzcGF0Y2hDYWxsKGluLmdldCgpLCBvdXQuZ2V0KCksIGZuYW1lLCBzZXFpZCwgY29ubmVjdGlvbkNvbnRleHQpOwogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIHZpcnR1YWwgYm9vbCBkaXNwYXRjaENhbGwoYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNhbGxDb250ZXh0KSA9IDA7CiB9OwogCiAvLyBTcGVjaWFsaXplIFREaXNwYXRjaFByb2Nlc3NvclQgZm9yIFRQcm90b2NvbCBhbmQgVER1bW15UHJvdG9jb2wganVzdCB0byB1c2UKIC8vIHRoZSBnZW5lcmljIFREaXNwYXRjaFByb2Nlc3Nvci4KIHRlbXBsYXRlIDw+Ci1jbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpURHVtbXlQcm90b2NvbD4gOgotICBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OworY2xhc3MgVERpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VER1bW15UHJvdG9jb2w+IDogcHVibGljIFREaXNwYXRjaFByb2Nlc3NvciB7fTsKIHRlbXBsYXRlIDw+Ci1jbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpUUHJvdG9jb2w+IDoKLSAgcHVibGljIFREaXNwYXRjaFByb2Nlc3NvciB7fTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKK2NsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlRQcm90b2NvbD4gOiBwdWJsaWMgVERpc3BhdGNoUHJvY2Vzc29yIHt9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAogCiAjZW5kaWYgLy8gX1RIUklGVF9URElTUEFUQ0hQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UTG9nZ2luZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmgKaW5kZXggOTM0ZThmYy4uMDdmZjAzMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RMb2dnaW5nLmgKQEAgLTIwLDIwICsyMCwxNCBAQAogI2lmbmRlZiBfVEhSSUZUX1RMT0dHSU5HX0hfCiAjZGVmaW5lIF9USFJJRlRfVExPR0dJTkdfSF8gMQogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogLyoqCiAgKiBDb250YWlucyB1dGlsaXR5IG1hY3JvcyBmb3IgZGVidWdnaW5nIGFuZCBsb2dnaW5nLgogICoKICAqLwogCi0jaWZuZGVmIEhBVkVfQ0xPQ0tfR0VUVElNRQogI2luY2x1ZGUgPHRpbWUuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgogCiAjaWZkZWYgSEFWRV9TVERJTlRfSAogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtNDUsMTMgKzM5LDExIEBACiAgKi8KICNkZWZpbmUgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMIDAKIAotCiAvKioKICAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAwOiBhbGwgbG9nZ2luZyB0dXJuZWQgb2ZmLCBsb2dnaW5nIG1hY3JvcyB1bmRlZmluZWQKICAqIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPSAxOiBhbGwgbG9nZ2luZyB0dXJuZWQgb24KICAqLwotI2RlZmluZSBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMICAgMQotCisjZGVmaW5lIFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgMQogCiAvKioKICAqIFN0YW5kYXJkIHdyYXBwZXIgYXJvdW5kIGZwcmludGYgd2hhdCB3aWxsIHByZWZpeCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lCkBAIC02MSwxMDYgKzUzLDExNSBAQAogICogQHBhcmFtIGZvcm1hdF9zdHJpbmcKICAqLwogI2lmIFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDAKLSAgI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIyNfX1ZBX0FSR1NfXyk7IFwKKyNkZWZpbmUgVF9ERUJVRyhmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlslcywlZF0gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgIFwKICAgfQogI2Vsc2UKLSAgI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsLi4uKQorI2RlZmluZSBUX0RFQlVHKGZvcm1hdF9zdHJpbmcsIC4uLikKICNlbmRpZgogCi0KIC8qKgotICogYW5hbGFnb3VzIHRvIFRfREVCVUcgYnV0IGFsc28gcHJpbnRzIHRoZSB0aW1lCisgKiBhbmFsb2dvdXMgdG8gVF9ERUJVRyBidXQgYWxzbyBwcmludHMgdGhlIHRpbWUKICAqCiAgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwogICovCiAjaWYgVF9HTE9CQUxfREVCVUdHSU5HX0xFVkVMID4gMAotICAjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChUX0dMT0JBTF9ERUJVR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjdGltZV9yKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyxkYmd0aW1lLCMjX19WQV9BUkdTX18pOyBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9CisjZGVmaW5lIFRfREVCVUdfVChmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFRfR0xPQkFMX0RFQlVHR0lOR19MRVZFTCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICJbJXMsJWRdIFslc10gIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIGRiZ3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KICNlbHNlCi0gICNkZWZpbmUgVF9ERUJVR19UKGZvcm1hdF9zdHJpbmcsLi4uKQorI2RlZmluZSBUX0RFQlVHX1QoZm9ybWF0X3N0cmluZywgLi4uKQogI2VuZGlmCiAKLQogLyoqCi0gKiBhbmFsYWdvdXMgdG8gVF9ERUJVRyBidXQgdXNlcyBpbnB1dCBsZXZlbCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIHN0cmluZworICogYW5hbG9nb3VzIHRvIFRfREVCVUcgYnV0IHVzZXMgaW5wdXQgbGV2ZWwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcKICAqIHNob3VsZCBiZSBsb2dnZWQuCiAgKgogICogQHBhcmFtIGludCAgICAgbGV2ZWw6IHNwZWNpZmllZCBkZWJ1ZyBsZXZlbAogICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogZm9ybWF0IHN0cmluZwogICovCi0jZGVmaW5lIFRfREVCVUdfTChsZXZlbCwgZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKChsZXZlbCkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCMjX19WQV9BUkdTX18pOyBcCisjZGVmaW5lIFRfREVCVUdfTChsZXZlbCwgZm9ybWF0X3N0cmluZywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgobGV2ZWwpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCiAgIH0KIAotCiAvKioKICAqIEV4cGxpY2l0IGVycm9yIGxvZ2dpbmcuIFByaW50cyB0aW1lLCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCiAgKgogICogQHBhcmFtIHN0cmluZyAgZm9ybWF0X3N0cmluZyBpbnB1dDogcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcKICAqLwotI2RlZmluZSBUX0VSUk9SKGZvcm1hdF9zdHJpbmcsLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgZGJndGltZVsyNl0gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZwcmludGYoc3RkZXJyLCJbJXMsJWRdIFslc10gRVJST1I6ICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgX19GSUxFX18sIF9fTElORV9fLGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7IFwKKyNkZWZpbmUgVF9FUlJPUihmb3JtYXRfc3RyaW5nLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyIGRiZ3RpbWVbMjZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJbJXMsJWRdIFslc10gRVJST1I6ICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fRklMRV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fTElORV9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRiZ3RpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCi0KIC8qKgotICogQW5hbGFnb3VzIHRvIFRfRVJST1IsIGFkZGl0aW9uYWxseSBhYm9ydGluZyB0aGUgcHJvY2Vzcy4KKyAqIEFuYWxvZ291cyB0byBUX0VSUk9SLCBhZGRpdGlvbmFsbHkgYWJvcnRpbmcgdGhlIHByb2Nlc3MuCiAgKiBXQVJOSU5HOiBtYWNybyBjYWxscyBhYm9ydCgpLCBlbmRpbmcgcHJvZ3JhbSBleGVjdXRpb24KICAqCiAgKiBAcGFyYW0gc3RyaW5nICBmb3JtYXRfc3RyaW5nIGlucHV0OiBwcmludGYgc3R5bGUgZm9ybWF0IHN0cmluZwogICovCi0jZGVmaW5lIFRfRVJST1JfQUJPUlQoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2hhciBkYmd0aW1lWzI2XSA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3RpbWVfcigmbm93LCBkYmd0aW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnByaW50ZihzdGRlcnIsIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiBmb3JtYXRfc3RyaW5nICIgXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sZGJndGltZSwjI19fVkFfQVJHU19fKTsgXAotICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUX0VSUk9SX0FCT1JUKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWVfdCBub3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIgZGJndGltZVsyNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRpbWUoJm5vdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRIUklGVF9DVElNRV9SKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRiZ3RpbWVbMjRdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlslcywlZF0gWyVzXSBFUlJPUjogR29pbmcgdG8gYWJvcnQgIiBmb3JtYXRfc3RyaW5nICIgXG4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19GSUxFX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZGJndGltZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGV4aXQoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CiAKLQogLyoqCiAgKiBMb2cgaW5wdXQgbWVzc2FnZQogICoKICAqIEBwYXJhbSBzdHJpbmcgIGZvcm1hdF9zdHJpbmcgaW5wdXQ6IHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nCiAgKi8KICNpZiBUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMAotICAjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKFRfR0xPQkFMX0xPR0dJTkdfTEVWRUwgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lX3Qgbm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjaGFyIGRiZ3RpbWVbMjZdIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aW1lKCZub3cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjdGltZV9yKCZub3csIGRiZ3RpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkYmd0aW1lWzI0XSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiWyVzXSAiIGZvcm1hdF9zdHJpbmcgIiBcbiIsIGRiZ3RpbWUsIyNfX1ZBX0FSR1NfXyk7ICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQorI2RlZmluZSBUX0xPR19PUEVSKGZvcm1hdF9zdHJpbmcsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChUX0dMT0JBTF9MT0dHSU5HX0xFVkVMID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZV90IG5vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hhciBkYmd0aW1lWzI2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGltZSgmbm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVEhSSUZUX0NUSU1FX1IoJm5vdywgZGJndGltZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGJndGltZVsyNF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJbJXNdICIgZm9ybWF0X3N0cmluZyAiIFxuIiwgZGJndGltZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CiAjZWxzZQotICAjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywuLi4pCisjZGVmaW5lIFRfTE9HX09QRVIoZm9ybWF0X3N0cmluZywgLi4uKQogI2VuZGlmCiAKLQogLyoqCiAgKiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID0gMCBvciB1bnNldDogbm9ybWFsIG9wZXJhdGlvbiwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGNhbGwgZGVidWcgbWVzc2FnZXMgZGlzYWJsZWQKQEAgLTE3MSwyOSArMTcyLDI0IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb2ZpbGVfcHJpbnRfaW5mbygpCiAgKi8KICNpZiBUX0dMT0JBTF9ERUJVR19WSVJUVUFMID4gMQotICAjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV92aXJ0dWFsX2NhbGwodHlwZWlkKCp0aGlzKSkKLSAgI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHR5cGVpZCgqdGVtcGxhdGVfY2xhc3MpLCB0eXBlaWQoKmdlbmVyaWNfcHJvdCkpOyAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKSA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm9maWxlX3ZpcnR1YWxfY2FsbCh0eXBlaWQoKnRoaXMpKQorI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHNwZWNpZmljX3Byb3QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvZmlsZV9nZW5lcmljX3Byb3RvY29sKHR5cGVpZCgqdGVtcGxhdGVfY2xhc3MpLCB0eXBlaWQoKmdlbmVyaWNfcHJvdCkpOyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQogI2VsaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA9PSAxCi0gICNkZWZpbmUgVF9WSVJUVUFMX0NBTEwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcHJpbnRmKHN0ZGVyciwiWyVzLCVkXSB2aXJ0dWFsIGNhbGxcbiIsIF9fRklMRV9fLCBfX0xJTkVfXykKLSAgI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoIShzcGVjaWZpY19wcm90KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICJbJXMsJWRdIGZhaWxlZCB0byBjYXN0IHRvIHNwZWNpZmljIHByb3RvY29sIHR5cGVcbiIsICAgICBcCi0gICAgICAgICAgICAgICAgX19GSUxFX18sIF9fTElORV9fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdIHZpcnR1YWwgY2FsbFxuIiwgX19GSUxFX18sIF9fTElORV9fKQorI2RlZmluZSBUX0dFTkVSSUNfUFJPVE9DT0wodGVtcGxhdGVfY2xhc3MsIGdlbmVyaWNfcHJvdCwgc3BlY2lmaWNfcHJvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKHNwZWNpZmljX3Byb3QpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZnByaW50ZihzdGRlcnIsICJbJXMsJWRdIGZhaWxlZCB0byBjYXN0IHRvIHNwZWNpZmljIHByb3RvY29sIHR5cGVcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7ICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQogI2Vsc2UKLSAgI2RlZmluZSBUX1ZJUlRVQUxfQ0FMTCgpCi0gICNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpCisjZGVmaW5lIFRfVklSVFVBTF9DQUxMKCkKKyNkZWZpbmUgVF9HRU5FUklDX1BST1RPQ09MKHRlbXBsYXRlX2NsYXNzLCBnZW5lcmljX3Byb3QsIHNwZWNpZmljX3Byb3QpCiAjZW5kaWYKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UTE9HR0lOR19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlM2E5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK1RPdXRwdXQgR2xvYmFsT3V0cHV0OworCit2b2lkIFRPdXRwdXQ6OnByaW50Zihjb25zdCBjaGFyKiBtZXNzYWdlLCAuLi4pIHsKKyNpZm5kZWYgVEhSSUZUX1NRVUVMQ0hfQ09OU09MRV9PVVRQVVQKKyAgLy8gVHJ5IHRvIHJlZHVjZSBoZWFwIHVzYWdlLCBldmVuIGlmIHByaW50ZiBpcyBjYWxsZWQgcmFyZWx5LgorICBzdGF0aWMgY29uc3QgaW50IFNUQUNLX0JVRl9TSVpFID0gMjU2OworICBjaGFyIHN0YWNrX2J1ZltTVEFDS19CVUZfU0laRV07CisgIHZhX2xpc3QgYXA7CisKKyNpZmRlZiBfTVNDX1ZFUgorICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBuZWVkID0gX3ZzY3ByaW50ZihtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisKKyAgaWYgKG5lZWQgPCBTVEFDS19CVUZfU0laRSkgeworICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKKyAgICB2YV9lbmQoYXApOworICAgIGZfKHN0YWNrX2J1Zik7CisgICAgcmV0dXJuOworICB9CisjZWxzZQorICB2YV9zdGFydChhcCwgbWVzc2FnZSk7CisgIGludCBuZWVkID0gdnNucHJpbnRmKHN0YWNrX2J1ZiwgU1RBQ0tfQlVGX1NJWkUsIG1lc3NhZ2UsIGFwKTsKKyAgdmFfZW5kKGFwKTsKKworICBpZiAobmVlZCA8IFNUQUNLX0JVRl9TSVpFKSB7CisgICAgZl8oc3RhY2tfYnVmKTsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorCisgIGNoYXIqIGhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgaWYgKGhlYXBfYnVmID09IE5VTEwpIHsKKyNpZmRlZiBfTVNDX1ZFUgorICAgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgICB2c25wcmludGZfcyhzdGFja19idWYsIFNUQUNLX0JVRl9TSVpFLCBfVFJVTkNBVEUsIG1lc3NhZ2UsIGFwKTsKKyAgICB2YV9lbmQoYXApOworI2VuZGlmCisgICAgLy8gTWFsbG9jIGZhaWxlZC4gIFdlIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIHN0YWNrIGJ1ZmZlci4KKyAgICBmXyhzdGFja19idWYpOworICAgIHJldHVybjsKKyAgfQorCisgIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKKyAgaW50IHJ2YWwgPSB2c25wcmludGYoaGVhcF9idWYsIG5lZWQgKyAxLCBtZXNzYWdlLCBhcCk7CisgIHZhX2VuZChhcCk7CisgIC8vIFRPRE8oc2hpZ2luKTogaW5mb3JtIHVzZXIKKyAgaWYgKHJ2YWwgIT0gLTEpIHsKKyAgICBmXyhoZWFwX2J1Zik7CisgIH0KKyAgZnJlZShoZWFwX2J1Zik7CisjZW5kaWYKK30KKwordm9pZCBUT3V0cHV0OjplcnJvclRpbWVXcmFwcGVyKGNvbnN0IGNoYXIqIG1zZykgeworI2lmbmRlZiBUSFJJRlRfU1FVRUxDSF9DT05TT0xFX09VVFBVVAorICB0aW1lX3Qgbm93OworICBjaGFyIGRiZ3RpbWVbMjZdOworICB0aW1lKCZub3cpOworICBUSFJJRlRfQ1RJTUVfUigmbm93LCBkYmd0aW1lKTsKKyAgZGJndGltZVsyNF0gPSAwOworICBmcHJpbnRmKHN0ZGVyciwgIlRocmlmdDogJXMgJXNcbiIsIGRiZ3RpbWUsIG1zZyk7CisjZW5kaWYKK30KKwordm9pZCBUT3V0cHV0OjpwZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKKyAgc3RkOjpzdHJpbmcgb3V0ID0gbWVzc2FnZSArIHN0ZDo6c3RyaW5nKCI6ICIpICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKKyAgZl8ob3V0LmNfc3RyKCkpOworfQorCitzdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7CisjaWZuZGVmIEhBVkVfU1RSRVJST1JfUgorICByZXR1cm4gImVycm5vID0gIiArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKKyNlbHNlIC8vIEhBVkVfU1RSRVJST1JfUgorCisgIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7J1wwJ307CisjaWZkZWYgU1RSRVJST1JfUl9DSEFSX1AKKyAgY2hhciogYl9lcnJvciA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOworI2Vsc2UKKyAgY2hhciogYl9lcnJvciA9IGJfZXJyYnVmOworICBpbnQgcnYgPSBzdHJlcnJvcl9yKGVycm5vX2NvcHksIGJfZXJyYnVmLCBzaXplb2YoYl9lcnJidWYpKTsKKyAgaWYgKHJ2ID09IC0xKSB7CisgICAgLy8gc3RyZXJyb3JfciBmYWlsZWQuICBvbWd3dGZiYnEuCisgICAgcmV0dXJuICJYU0ktY29tcGxpYW50IHN0cmVycm9yX3IoKSBmYWlsZWQgd2l0aCBlcnJubyA9ICIKKyAgICAgICAgICAgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CisgIH0KKyNlbmRpZgorICAvLyBDYW4gYW55b25lIHByb3ZlIHRoYXQgZXhwbGljaXQgY2FzdCBpcyBwcm9iYWJseSBub3QgbmVjZXNzYXJ5CisgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGJlZm9yZQorICAvLyBiX2Vycm9yIGJlY29tZXMgaW52YWxpZD8KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJfZXJyb3IpOworCisjZW5kaWYgLy8gSEFWRV9TVFJFUlJPUl9SCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzc1ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuaApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9PVVRQVVRfSF8KKyNkZWZpbmUgX1RIUklGVF9PVVRQVVRfSF8gMQorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitjbGFzcyBUT3V0cHV0IHsKK3B1YmxpYzoKKyAgVE91dHB1dCgpIDogZl8oJmVycm9yVGltZVdyYXBwZXIpIHt9CisKKyAgaW5saW5lIHZvaWQgc2V0T3V0cHV0RnVuY3Rpb24odm9pZCAoKmZ1bmN0aW9uKShjb25zdCBjaGFyKikpIHsgZl8gPSBmdW5jdGlvbjsgfQorCisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgY2hhciogbWVzc2FnZSkgeyBmXyhtZXNzYWdlKTsgfQorCisgIC8vIEl0IGlzIGltcG9ydGFudCB0byBoYXZlIGEgY29uc3QgY2hhciogb3ZlcmxvYWQgaGVyZSBpbnN0ZWFkIG9mCisgIC8vIGp1c3QgdGhlIHN0cmluZyB2ZXJzaW9uLCBvdGhlcndpc2UgZXJybm8gY291bGQgYmUgY29ycnVwdGVkCisgIC8vIGlmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSBhbGxvY2F0aW5nIG1lbW9yeSB3aGVuIGNvbnN0cnVjdGluZworICAvLyB0aGUgc3RyaW5nLgorICB2b2lkIHBlcnJvcihjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSk7CisgIGlubGluZSB2b2lkIHBlcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKKyAgICBwZXJyb3IobWVzc2FnZS5jX3N0cigpLCBlcnJub19jb3B5KTsKKyAgfQorCisgIHZvaWQgcHJpbnRmKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIC4uLik7CisKKyAgc3RhdGljIHZvaWQgZXJyb3JUaW1lV3JhcHBlcihjb25zdCBjaGFyKiBtc2cpOworCisgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLworICBzdGF0aWMgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7CisKK3ByaXZhdGU6CisgIHZvaWQgKCpmXykoY29uc3QgY2hhciopOworfTsKKworZXh0ZXJuIFRPdXRwdXQgR2xvYmFsT3V0cHV0OworfQorfSAvLyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vX1RIUklGVF9PVVRQVVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCmluZGV4IGI0YTQ2NTcuLjZhNDY0NjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaApAQCAtMjIsOSArMjIsOSBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAogLyoqCiAgKiBWaXJ0dWFsIGludGVyZmFjZSBjbGFzcyB0aGF0IGNhbiBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHByb2Nlc3Nvci4gVG8KQEAgLTM0LDggKzM0LDcgQEAKICAqIGluc3RhbmNlJ3Mgc3RhdGUpLgogICovCiBjbGFzcyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgdmlydHVhbCB+VFByb2Nlc3NvckV2ZW50SGFuZGxlcigpIHt9CiAKICAgLyoqCkBAIC00NSw4ICs0NCw4IEBACiAgICAqIGZvciB0aGF0IGZ1bmN0aW9uIGludm9jYXRpb24uCiAgICAqLwogICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgewotICAgICh2b2lkKSBmbl9uYW1lOwotICAgICh2b2lkKSBzZXJ2ZXJDb250ZXh0OworICAgICh2b2lkKWZuX25hbWU7CisgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCkBAIC01NCw2MSArNTMsNjEgQEAKICAgICogRXhwZWN0ZWQgdG8gZnJlZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgY29udGV4dC4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBmcmVlQ29udGV4dCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCBiZWZvcmUgcmVhZGluZyBhcmd1bWVudHMuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCBiZXR3ZWVuIHJlYWRpbmcgYXJndW1lbnRzIGFuZCBjYWxsaW5nIHRoZSBoYW5kbGVyLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHBvc3RSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSwgdWludDMyX3QgYnl0ZXMpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOwotICAgICh2b2lkKSBieXRlczsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKKyAgICAodm9pZClieXRlczsKICAgfQogCiAgIC8qKgogICAgKiBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBwcmVXcml0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKLSAgICAodm9pZCkgY3R4OwotICAgICh2b2lkKSBmbl9uYW1lOworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCBhZnRlciB3cml0aW5nIHRoZSByZXNwb25zZS4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7Ci0gICAgKHZvaWQpIGJ5dGVzOworICAgICh2b2lkKWN0eDsKKyAgICAodm9pZClmbl9uYW1lOworICAgICh2b2lkKWJ5dGVzOwogICB9CiAKICAgLyoqCiAgICAqIENhbGxlZCB3aGVuIGFuIGFzeW5jIGZ1bmN0aW9uIGNhbGwgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBhc3luY0NvbXBsZXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgICh2b2lkKSBjdHg7Ci0gICAgKHZvaWQpIGZuX25hbWU7CisgICAgKHZvaWQpY3R4OworICAgICh2b2lkKWZuX25hbWU7CiAgIH0KIAogICAvKioKICAgICogQ2FsbGVkIGlmIHRoZSBoYW5kbGVyIHRocm93cyBhbiB1bmRlY2xhcmVkIGV4Y2VwdGlvbi4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBoYW5kbGVyRXJyb3Iodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGN0eDsKLSAgICAodm9pZCkgZm5fbmFtZTsKKyAgICAodm9pZCljdHg7CisgICAgKHZvaWQpZm5fbmFtZTsKICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkge30KIH07CiAKQEAgLTExNiwxMiArMTE1LDE2IEBACiAgKiBBIGhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBmcmVlIGVhY2ggY29udGV4dC4KICAqLwogY2xhc3MgVFByb2Nlc3NvckNvbnRleHRGcmVlciB7Ci0gcHVibGljOgotICBUUHJvY2Vzc29yQ29udGV4dEZyZWVyKFRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXIsIHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1ldGhvZCkgOgotICAgIGhhbmRsZXJfKGhhbmRsZXIpLCBjb250ZXh0Xyhjb250ZXh0KSwgbWV0aG9kXyhtZXRob2QpIHt9Ci0gIH5UUHJvY2Vzc29yQ29udGV4dEZyZWVyKCkgeyBpZiAoaGFuZGxlcl8gIT0gTlVMTCkgaGFuZGxlcl8tPmZyZWVDb250ZXh0KGNvbnRleHRfLCBtZXRob2RfKTsgfQorcHVibGljOgorICBUUHJvY2Vzc29yQ29udGV4dEZyZWVyKFRQcm9jZXNzb3JFdmVudEhhbmRsZXIqIGhhbmRsZXIsIHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1ldGhvZCkKKyAgICA6IGhhbmRsZXJfKGhhbmRsZXIpLCBjb250ZXh0Xyhjb250ZXh0KSwgbWV0aG9kXyhtZXRob2QpIHt9CisgIH5UUHJvY2Vzc29yQ29udGV4dEZyZWVyKCkgeworICAgIGlmIChoYW5kbGVyXyAhPSBOVUxMKQorICAgICAgaGFuZGxlcl8tPmZyZWVDb250ZXh0KGNvbnRleHRfLCBtZXRob2RfKTsKKyAgfQogICB2b2lkIHVucmVnaXN0ZXIoKSB7IGhhbmRsZXJfID0gTlVMTDsgfQotIHByaXZhdGU6CisKK3ByaXZhdGU6CiAgIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRXZlbnRIYW5kbGVyKiBoYW5kbGVyXzsKICAgdm9pZCogY29udGV4dF87CiAgIGNvbnN0IGNoYXIqIG1ldGhvZF87CkBAIC0xMzUsMzQgKzEzOCwzMSBAQAogICoKICAqLwogY2xhc3MgVFByb2Nlc3NvciB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5UUHJvY2Vzc29yKCkge30KIAotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSA9IDA7CiAKLSAgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbywKLSAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvLCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgewogICAgIHJldHVybiBwcm9jZXNzKGlvLCBpbywgY29ubmVjdGlvbkNvbnRleHQpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBldmVudEhhbmRsZXJfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CiAKLSAgdm9pZCBzZXRFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgIHZvaWQgc2V0RXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKICAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIFRQcm9jZXNzb3IoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwogfTsKIAogLyoqCi0gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGFsbG93IGJvb3N0OjpzaGFyZWRfcHRyIHRvIGJlIHVzZWQgd2l0aCBoYW5kbGVyCisgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGFsbG93IHN0ZDo6c2hhcmVkX3B0ciB0byBiZSB1c2VkIHdpdGggaGFuZGxlcgogICogcG9pbnRlcnMgcmV0dXJuZWQgYnkgdGhlIGdlbmVyYXRlZCBoYW5kbGVyIGZhY3Rvcmllcy4KICAqCiAgKiBUaGUgaGFuZGxlciBmYWN0b3J5IGNsYXNzZXMgZ2VuZXJhdGVkIGJ5IHRoZSB0aHJpZnQgY29tcGlsZXIgcmV0dXJuIHJhdwpAQCAtMTczLDM1ICsxNzMsMzUgQEAKICAqIHBhcmFtZXRlciB0byBhIHNoYXJlZF9wdHIsIHNvIHRoYXQgZmFjdG9yeS0+cmVsZWFzZUhhbmRsZXIoKSB3aWxsIGJlIGNhbGxlZAogICogd2hlbiB0aGUgb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQsIGluc3RlYWQgb2YgZGVsZXRpbmcgdGhlIHBvaW50ZXIuCiAgKi8KLXRlbXBsYXRlPHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV8+CiBjbGFzcyBSZWxlYXNlSGFuZGxlciB7Ci0gcHVibGljOgotICAgUmVsZWFzZUhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiYgaGFuZGxlckZhY3RvcnkpIDoKLSAgICAgICBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9CitwdWJsaWM6CisgIFJlbGVhc2VIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+JiBoYW5kbGVyRmFjdG9yeSkKKyAgICA6IGhhbmRsZXJGYWN0b3J5XyhoYW5kbGVyRmFjdG9yeSkge30KIAotICAgdm9pZCBvcGVyYXRvcigpKHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xzo6SGFuZGxlciogaGFuZGxlcikgewotICAgICBpZiAoaGFuZGxlcikgewotICAgICAgIGhhbmRsZXJGYWN0b3J5Xy0+cmVsZWFzZUhhbmRsZXIoaGFuZGxlcik7Ci0gICAgIH0KLSAgIH0KKyAgdm9pZCBvcGVyYXRvcigpKHR5cGVuYW1lIEhhbmRsZXJGYWN0b3J5Xzo6SGFuZGxlciogaGFuZGxlcikgeworICAgIGlmIChoYW5kbGVyKSB7CisgICAgICBoYW5kbGVyRmFjdG9yeV8tPnJlbGVhc2VIYW5kbGVyKGhhbmRsZXIpOworICAgIH0KKyAgfQogCi0gcHJpdmF0ZToKLSAgIGJvb3N0OjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4gaGFuZGxlckZhY3RvcnlfOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4gaGFuZGxlckZhY3RvcnlfOwogfTsKIAogc3RydWN0IFRDb25uZWN0aW9uSW5mbyB7CiAgIC8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29scwotICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CiAgIC8vIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciB0aGUgY29ubmVjdGlvbgogICAvLyBUaGlzIGlzIHRoZSB0cmFuc3BvcnQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgVFNlcnZlclRyYW5zcG9ydDo6YWNjZXB0KCksCiAgIC8vIGFuZCBpdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHRyYW5zcG9ydCBwb2ludGVkIHRvIGJ5IHRoZSBpbnB1dCBhbmQKICAgLy8gb3V0cHV0IHByb3RvY29scy4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKIH07CiAKIGNsYXNzIFRQcm9jZXNzb3JGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflRQcm9jZXNzb3JGYWN0b3J5KCkge30KIAogICAvKioKQEAgLTIxMSwyMyArMjExLDE5IEBACiAgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQogICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKAotICAgICAgY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOwogfTsKIAogY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBwdWJsaWMgVFByb2Nlc3NvckZhY3RvcnkgewotIHB1YmxpYzoKLSAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSA6Ci0gICAgICBwcm9jZXNzb3JfKHByb2Nlc3Nvcikge30KK3B1YmxpYzoKKyAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgOiBwcm9jZXNzb3JfKHByb2Nlc3Nvcikge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJikgewotICAgIHJldHVybiBwcm9jZXNzb3JfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJikgeyByZXR1cm4gcHJvY2Vzc29yXzsgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwogfTsKLQotfX0gLy8gYXBhY2hlOjp0aHJpZnQKK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFJlZmxlY3Rpb25Mb2NhbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RSZWZsZWN0aW9uTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVmNzUxMS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVFJlZmxlY3Rpb25Mb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfVFJFRkxFQ1RJT05MT0NBTF9IXwotI2RlZmluZSBfVEhSSUZUX1RSRUZMRUNUSU9OTE9DQUxfSF8gMQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+Ci0KLS8qKgotICogTG9jYWwgUmVmbGVjdGlvbiBpcyBhIGJsYW5rZXQgdGVybSByZWZlcnJpbmcgdG8gdGhlIHRoZSBzdHJ1Y3R1cmUKLSAqIGFuZCBnZW5lcmF0aW9uIG9mIHRoaXMgcGFydGljdWxhciByZXByZXNlbnRhdGlvbiBvZiBUaHJpZnQgdHlwZXMuCi0gKiAoSXQgaXMgY2FsbGVkIGxvY2FsIGJlY2F1c2UgaXQgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYnkgVGhyaWZ0KS4KLSAqCi0gKi8KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcmVmbGVjdGlvbiB7IG5hbWVzcGFjZSBsb2NhbCB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGU7Ci0KLS8vIFdlIGluY2x1ZGUgdGhpcyBtYW55IGJ5dGVzIG9mIHRoZSBzdHJ1Y3R1cmUncyBmaW5nZXJwcmludCB3aGVuIHNlcmlhbGl6aW5nCi0vLyBhIHRvcC1sZXZlbCBzdHJ1Y3R1cmUuICBMb25nIGVub3VnaCB0byBtYWtlIGNvbGxpc2lvbnMgdW5saWtlbHksIHNob3J0Ci0vLyBlbm91Z2ggdG8gbm90IHNpZ25pZmljYW50bHkgYWZmZWN0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQuCi1jb25zdCBpbnQgRlBfUFJFRklYX0xFTiA9IDQ7Ci0KLXN0cnVjdCBGaWVsZE1ldGEgewotICBpbnQxNl90IHRhZzsKLSAgYm9vbCBpc19vcHRpb25hbDsKLX07Ci0KLXN0cnVjdCBUeXBlU3BlYyB7Ci0gIFRUeXBlIHR0eXBlOwotICB1aW50OF90ICAgIGZwX3ByZWZpeFtGUF9QUkVGSVhfTEVOXTsKLQotICAvLyBVc2UgYW4gYW5vbnltb3VzIHVuaW9uIGhlcmUgc28gd2UgY2FuIGZpdCB0d28gVHlwZVNwZWNzIGluIG9uZSBjYWNoZSBsaW5lLgotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIC8vIFVzZSBwYXJhbGxlbCBhcnJheXMgaGVyZSBmb3IgZGVuc2VyIHBhY2tpbmcgKG9mIHRoZSBhcnJheXMpLgotICAgICAgRmllbGRNZXRhKiBtZXRhczsKLSAgICAgIFR5cGVTcGVjKiogc3BlY3M7Ci0gICAgfSB0c3RydWN0OwotICAgIHN0cnVjdCB7Ci0gICAgICBUeXBlU3BlYyAqc3VidHlwZTE7Ci0gICAgICBUeXBlU3BlYyAqc3VidHlwZTI7Ci0gICAgfSB0Y29udGFpbmVyOwotICB9OwotCi0gIC8vIFN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiB1bmlvbnMgaXNuJ3QgcmVhbGx5IHBvc3NpYmxlLAotICAvLyBzbyB0YWtlIHRoZSBwbHVuZ2UgYW5kIHVzZSBjb25zdHJ1Y3RvcnMuCi0gIC8vIEhvcGVmdWxseSB0aGV5J2xsIGJlIGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUuCi0KLSAgVHlwZVNwZWMoVFR5cGUgdHR5cGUpIDogdHR5cGUodHR5cGUpIHsKLSAgICBzdGQ6Om1lbXNldChmcF9wcmVmaXgsIDAsIEZQX1BSRUZJWF9MRU4pOwotICB9Ci0KLSAgVHlwZVNwZWMoVFR5cGUgdHR5cGUsCi0gICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZpbmdlcnByaW50LAotICAgICAgICAgICBGaWVsZE1ldGEqIG1ldGFzLAotICAgICAgICAgICBUeXBlU3BlYyoqIHNwZWNzKSA6Ci0gICAgdHR5cGUodHR5cGUpCi0gIHsKLSAgICBzdGQ6Om1lbWNweShmcF9wcmVmaXgsIGZpbmdlcnByaW50LCBGUF9QUkVGSVhfTEVOKTsKLSAgICB0c3RydWN0Lm1ldGFzID0gbWV0YXM7Ci0gICAgdHN0cnVjdC5zcGVjcyA9IHNwZWNzOwotICB9Ci0KLSAgVHlwZVNwZWMoVFR5cGUgdHR5cGUsIFR5cGVTcGVjKiBzdWJ0eXBlMSwgVHlwZVNwZWMqIHN1YnR5cGUyKSA6Ci0gICAgdHR5cGUodHR5cGUpCi0gIHsKLSAgICBzdGQ6Om1lbXNldChmcF9wcmVmaXgsIDAsIEZQX1BSRUZJWF9MRU4pOwotICAgIHRjb250YWluZXIuc3VidHlwZTEgPSBzdWJ0eXBlMTsKLSAgICB0Y29udGFpbmVyLnN1YnR5cGUyID0gc3VidHlwZTI7Ci0gIH0KLQotfTsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cmVmbGVjdGlvbjo6bG9jYWwKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkVGTEVDVElPTkxPQ0FMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3ODBmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfVE9TVFJJTkdfSF8KKyNkZWZpbmUgX1RIUklGVF9UT1NUUklOR19IXyAxCisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKKy8vIFRPRE86IHJlcGxhY2UgdGhlIGNvbXB1dGF0aW9ucyBiZWxvdyB3aXRoIHN0ZDo6bnVtZXJpY19saW1pdHM6Om1heF9kaWdpdHMxMCBvbmNlIEMrKzExCisvLyBpcyBlbmFibGVkLgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBmbG9hdCYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBsb25nIGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6Om1hcDxLLCBWPiYgbSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6c2V0PFQ+JiBzKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCB0eXBlbmFtZSBzdGQ6OnBhaXI8SywgVj4mIHYpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdG9fc3RyaW5nKHYuZmlyc3QpIDw8ICI6ICIgPDwgdG9fc3RyaW5nKHYuc2Vjb25kKTsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQmIGJlZywgY29uc3QgVCYgZW5kKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBmb3IgKFQgaXQgPSBiZWc7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdCAhPSBiZWcpCisgICAgICBvIDw8ICIsICI7CisgICAgbyA8PCB0b19zdHJpbmcoKml0KTsKKyAgfQorICByZXR1cm4gby5zdHIoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b19zdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8VD4mIHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgIlsiIDw8IHRvX3N0cmluZyh0LmJlZ2luKCksIHQuZW5kKCkpIDw8ICJdIjsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IHN0ZDo6bWFwPEssIFY+JiBtKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOworICBvIDw8ICJ7IiA8PCB0b19zdHJpbmcobS5iZWdpbigpLCBtLmVuZCgpKSA8PCAifSI7CisgIHJldHVybiBvLnN0cigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBzdGQ6OnNldDxUPiYgcykgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgbyA8PCAieyIgPDwgdG9fc3RyaW5nKHMuYmVnaW4oKSwgcy5lbmQoKSkgPDwgIn0iOworICByZXR1cm4gby5zdHIoKTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKKworI2VuZGlmIC8vIF9USFJJRlRfVE9TVFJJTkdfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmRiMWEuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotCi1UT3V0cHV0IEdsb2JhbE91dHB1dDsKLQotdm9pZCBUT3V0cHV0OjpwcmludGYoY29uc3QgY2hhciAqbWVzc2FnZSwgLi4uKSB7Ci0gIC8vIFRyeSB0byByZWR1Y2UgaGVhcCB1c2FnZSwgZXZlbiBpZiBwcmludGYgaXMgY2FsbGVkIHJhcmVseS4KLSAgc3RhdGljIGNvbnN0IGludCBTVEFDS19CVUZfU0laRSA9IDI1NjsKLSAgY2hhciBzdGFja19idWZbU1RBQ0tfQlVGX1NJWkVdOwotICB2YV9saXN0IGFwOwotCi0gIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgaW50IG5lZWQgPSB2c25wcmludGYoc3RhY2tfYnVmLCBTVEFDS19CVUZfU0laRSwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQoYXApOwotCi0gIGlmIChuZWVkIDwgU1RBQ0tfQlVGX1NJWkUpIHsKLSAgICBmXyhzdGFja19idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGNoYXIgKmhlYXBfYnVmID0gKGNoYXIqKW1hbGxvYygobmVlZCsxKSAqIHNpemVvZihjaGFyKSk7Ci0gIGlmIChoZWFwX2J1ZiA9PSBOVUxMKSB7Ci0gICAgLy8gTWFsbG9jIGZhaWxlZC4gIFdlIG1pZ2h0IGFzIHdlbGwgcHJpbnQgdGhlIHN0YWNrIGJ1ZmZlci4KLSAgICBmXyhzdGFja19idWYpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHZhX3N0YXJ0KGFwLCBtZXNzYWdlKTsKLSAgaW50IHJ2YWwgPSB2c25wcmludGYoaGVhcF9idWYsIG5lZWQrMSwgbWVzc2FnZSwgYXApOwotICB2YV9lbmQoYXApOwotICAvLyBUT0RPKHNoaWdpbik6IGluZm9ybSB1c2VyCi0gIGlmIChydmFsICE9IC0xKSB7Ci0gICAgZl8oaGVhcF9idWYpOwotICB9Ci0gIGZyZWUoaGVhcF9idWYpOwotfQotCi12b2lkIFRPdXRwdXQ6OnBlcnJvcihjb25zdCBjaGFyICptZXNzYWdlLCBpbnQgZXJybm9fY29weSkgewotICBzdGQ6OnN0cmluZyBvdXQgPSBtZXNzYWdlICsgc3RyZXJyb3JfcyhlcnJub19jb3B5KTsKLSAgZl8ob3V0LmNfc3RyKCkpOwotfQotCi1zdGQ6OnN0cmluZyBUT3V0cHV0OjpzdHJlcnJvcl9zKGludCBlcnJub19jb3B5KSB7Ci0jaWZuZGVmIEhBVkVfU1RSRVJST1JfUgotICByZXR1cm4gImVycm5vID0gIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KGVycm5vX2NvcHkpOwotI2Vsc2UgIC8vIEhBVkVfU1RSRVJST1JfUgotCi0gIGNoYXIgYl9lcnJidWZbMTAyNF0gPSB7ICdcMCcgfTsKLSNpZmRlZiBTVFJFUlJPUl9SX0NIQVJfUAotICBjaGFyICpiX2Vycm9yID0gc3RyZXJyb3JfcihlcnJub19jb3B5LCBiX2VycmJ1Ziwgc2l6ZW9mKGJfZXJyYnVmKSk7Ci0jZWxzZQotICBjaGFyICpiX2Vycm9yID0gYl9lcnJidWY7Ci0gIGludCBydiA9IHN0cmVycm9yX3IoZXJybm9fY29weSwgYl9lcnJidWYsIHNpemVvZihiX2VycmJ1ZikpOwotICBpZiAocnYgPT0gLTEpIHsKLSAgICAvLyBzdHJlcnJvcl9yIGZhaWxlZC4gIG9tZ3d0ZmJicS4KLSAgICByZXR1cm4gIlhTSS1jb21wbGlhbnQgc3RyZXJyb3JfcigpIGZhaWxlZCB3aXRoIGVycm5vID0gIiArCi0gICAgICBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKLSAgfQotI2VuZGlmCi0gIC8vIENhbiBhbnlvbmUgcHJvdmUgdGhhdCBleHBsaWNpdCBjYXN0IGlzIHByb2JhYmx5IG5vdCBuZWNlc3NhcnkKLSAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIHN0cmluZyBvYmplY3QgaXMgY29uc3RydWN0ZWQgYmVmb3JlCi0gIC8vIGJfZXJyb3IgYmVjb21lcyBpbnZhbGlkPwotICByZXR1cm4gc3RkOjpzdHJpbmcoYl9lcnJvcik7Ci0KLSNlbmRpZiAgLy8gSEFWRV9TVFJFUlJPUl9SCi19Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKaW5kZXggNWNkYzM3ZS4uNjMyMjc0MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaApAQCAtMjAsMTMgKzIwLDEwIEBACiAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0hfCiAjZGVmaW5lIF9USFJJRlRfVEhSSUZUX0hfIDEKIAotI2lmZGVmIF9XSU4zMgotI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL2NvbmZpZy5oPgotI2VuZGlmCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKQEAgLTQ1LDExNSArNDIsNDYgQEAKICNpbmNsdWRlIDxleGNlcHRpb24+CiAjaW5jbHVkZSA8dHlwZWluZm8+CiAKLSNpbmNsdWRlIDxib29zdC91dGlsaXR5L2VuYWJsZV9pZi5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvaXNfY29udmVydGlibGUuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgorI2luY2x1ZGUgPHRocmlmdC9UT3V0cHV0Lmg+CiAKLSNpbmNsdWRlICJUTG9nZ2luZy5oIgorI2RlZmluZSBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHgpICgodm9pZCkoeCkpCiAKLS8qKgotICogSGVscGVyIG1hY3JvcyB0byBhbGxvdyBmdW5jdGlvbiBvdmVybG9hZGluZyBldmVuIHdoZW4gdXNpbmcKLSAqIGJvb3N0OjpzaGFyZWRfcHRyLgotICoKLSAqIHNoYXJlZF9wdHIgbWFrZXMgb3ZlcmxvYWRpbmcgcmVhbGx5IGFubm95aW5nLCBzaW5jZSBzaGFyZWRfcHRyIGRlZmluZXMKLSAqIGNvbnN0cnVjdG9yIG1ldGhvZHMgdG8gYWxsb3cgb25lIHNoYXJlZF9wdHIgdHlwZSB0byBiZSBjb25zdHJ1Y3RlZCBmcm9tIGFueQotICogb3RoZXIgc2hhcmVkX3B0ciB0eXBlLiAgKEV2ZW4gaWYgaXQgd291bGQgYmUgYSBjb21waWxlIGVycm9yIHRvIGFjdHVhbGx5IHRyeQotICogdG8gaW5zdGFudGlhdGUgdGhlIGNvbnN0cnVjdG9yLikgIFRoZXNlIG1hY3JvcyBhZGQgYW4gZXh0cmEgYXJndW1lbnQgdG8gdGhlCi0gKiBmdW5jdGlvbiB0byBjYXVzZSBpdCB0byBvbmx5IGJlIGluc3RhbnRpYXRlZCBpZiBhIHBvaW50ZXIgb2YgdHlwZSBUIGlzCi0gKiBjb252ZXJ0aWJsZSB0byBhIHBvaW50ZXIgb2YgdHlwZSBVLgotICoKLSAqIFRIUklGVF9PVkVSTE9BRF9JRiBzaG91bGQgYmUgdXNlZCBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0gKiBUSFJJRlRfT1ZFUkxPQURfSUZfREVGTiBzaG91bGQgYmUgdXNlZCBpbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiwgaWYgaXQgaXMKLSAqIGRlZmluZWQgc2VwYXJhdGVseSBmcm9tIHdoZXJlIGl0IGlzIGRlY2xhcmVkLgotICovCi0jZGVmaW5lIFRIUklGVF9PVkVSTE9BRF9JRl9ERUZOKFQsIFkpIFwKLSAgdHlwZW5hbWUgOjpib29zdDo6ZW5hYmxlX2lmPHR5cGVuYW1lIDo6Ym9vc3Q6OmlzX2NvbnZlcnRpYmxlPFQqLCBZKj46OnR5cGUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqPjo6dHlwZQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAotI2RlZmluZSBUSFJJRlRfT1ZFUkxPQURfSUYoVCwgWSkgXAotICBUSFJJRlRfT1ZFUkxPQURfSUZfREVGTihULCBZKSA9IE5VTEwKK2NsYXNzIFRFbnVtSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIqPiA+IHsKK3B1YmxpYzoKKyAgVEVudW1JdGVyYXRvcihpbnQgbiwgaW50KiBlbnVtcywgY29uc3QgY2hhcioqIG5hbWVzKQorICAgIDogaWlfKDApLCBuXyhuKSwgZW51bXNfKGVudW1zKSwgbmFtZXNfKG5hbWVzKSB7fQogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CisgIGludCBvcGVyYXRvcisrKCkgeyByZXR1cm4gKytpaV87IH0KIAotY2xhc3MgVEVudW1JdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIqPiA+IHsKLSBwdWJsaWM6Ci0gIFRFbnVtSXRlcmF0b3IoaW50IG4sCi0gICAgICAgICAgICAgICAgaW50KiBlbnVtcywKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogbmFtZXMpIDoKLSAgICAgIGlpXygwKSwgbl8obiksIGVudW1zXyhlbnVtcyksIG5hbWVzXyhuYW1lcykgewotICB9Ci0KLSAgaW50IG9wZXJhdG9yICsrKCkgewotICAgIHJldHVybiArK2lpXzsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3IgIT0oY29uc3QgVEVudW1JdGVyYXRvciYgZW5kKSB7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBURW51bUl0ZXJhdG9yJiBlbmQpIHsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGVuZCk7CiAgICAgYXNzZXJ0KGVuZC5uXyA9PSAtMSk7CiAgICAgcmV0dXJuIChpaV8gIT0gbl8pOwogICB9CiAKLSAgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhcio+IG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW51bXNfW2lpX10sIG5hbWVzX1tpaV9dKTsKLSAgfQorICBzdGQ6OnBhaXI8aW50LCBjb25zdCBjaGFyKj4gb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gc3RkOjptYWtlX3BhaXIoZW51bXNfW2lpX10sIG5hbWVzX1tpaV9dKTsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGludCBpaV87CiAgIGNvbnN0IGludCBuXzsKICAgaW50KiBlbnVtc187CiAgIGNvbnN0IGNoYXIqKiBuYW1lc187CiB9OwogCi1jbGFzcyBUT3V0cHV0IHsKLSBwdWJsaWM6Ci0gIFRPdXRwdXQoKSA6IGZfKCZlcnJvclRpbWVXcmFwcGVyKSB7fQotCi0gIGlubGluZSB2b2lkIHNldE91dHB1dEZ1bmN0aW9uKHZvaWQgKCpmdW5jdGlvbikoY29uc3QgY2hhciAqKSl7Ci0gICAgZl8gPSBmdW5jdGlvbjsKLSAgfQotCi0gIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoY29uc3QgY2hhciAqbWVzc2FnZSl7Ci0gICAgZl8obWVzc2FnZSk7Ci0gIH0KLQotICAvLyBJdCBpcyBpbXBvcnRhbnQgdG8gaGF2ZSBhIGNvbnN0IGNoYXIqIG92ZXJsb2FkIGhlcmUgaW5zdGVhZCBvZgotICAvLyBqdXN0IHRoZSBzdHJpbmcgdmVyc2lvbiwgb3RoZXJ3aXNlIGVycm5vIGNvdWxkIGJlIGNvcnJ1cHRlZAotICAvLyBpZiB0aGVyZSBpcyBzb21lIHByb2JsZW0gYWxsb2NhdGluZyBtZW1vcnkgd2hlbiBjb25zdHJ1Y3RpbmcKLSAgLy8gdGhlIHN0cmluZy4KLSAgdm9pZCBwZXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpOwotICBpbmxpbmUgdm9pZCBwZXJyb3IoY29uc3Qgc3RkOjpzdHJpbmcgJm1lc3NhZ2UsIGludCBlcnJub19jb3B5KSB7Ci0gICAgcGVycm9yKG1lc3NhZ2UuY19zdHIoKSwgZXJybm9fY29weSk7Ci0gIH0KLQotICB2b2lkIHByaW50Zihjb25zdCBjaGFyICptZXNzYWdlLCAuLi4pOwotCi0gIGlubGluZSBzdGF0aWMgdm9pZCBlcnJvclRpbWVXcmFwcGVyKGNvbnN0IGNoYXIqIG1zZykgewotICAgIHRpbWVfdCBub3c7Ci0gICAgY2hhciBkYmd0aW1lWzI2XTsKLSAgICB0aW1lKCZub3cpOwotICAgIGN0aW1lX3IoJm5vdywgZGJndGltZSk7Ci0gICAgZGJndGltZVsyNF0gPSAwOwotICAgIGZwcmludGYoc3RkZXJyLCAiVGhyaWZ0OiAlcyAlc1xuIiwgZGJndGltZSwgbXNnKTsKLSAgfQotCi0gIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwotICBzdGF0aWMgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7Ci0KLSBwcml2YXRlOgotICB2b2lkICgqZl8pKGNvbnN0IGNoYXIgKik7Ci19OwotCi1leHRlcm4gVE91dHB1dCBHbG9iYWxPdXRwdXQ7Ci0KIGNsYXNzIFRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewotIHB1YmxpYzoKLSAgVEV4Y2VwdGlvbigpOgotICAgIG1lc3NhZ2VfKCkge30KK3B1YmxpYzoKKyAgVEV4Y2VwdGlvbigpIDogbWVzc2FnZV8oKSB7fQogCi0gIFRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBtZXNzYWdlXyhtZXNzYWdlKSB7fQorICBURXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IG1lc3NhZ2VfKG1lc3NhZ2UpIHt9CiAKLSAgdmlydHVhbCB+VEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgdmlydHVhbCB+VEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgcmV0dXJuICJEZWZhdWx0IFRFeGNlcHRpb24uIjsKICAgICB9IGVsc2UgewpAQCAtMTYxLDMzICs4OSwyOSBAQAogICAgIH0KICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKLQogfTsKIAotCi0vLyBGb3J3YXJkIGRlY2xhcmUgdGhpcyBzdHJ1Y3R1cmUgdXNlZCBieSBURGVuc2VQcm90b2NvbAotbmFtZXNwYWNlIHJlZmxlY3Rpb24geyBuYW1lc3BhY2UgbG9jYWwgewotc3RydWN0IFR5cGVTcGVjOwotfX0KLQogY2xhc3MgVERlbGF5ZWRFeGNlcHRpb24gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPGNsYXNzIEU+IHN0YXRpYyBURGVsYXllZEV4Y2VwdGlvbiogZGVsYXlFeGNlcHRpb24oY29uc3QgRSYgZSk7CitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBFPgorICBzdGF0aWMgVERlbGF5ZWRFeGNlcHRpb24qIGRlbGF5RXhjZXB0aW9uKGNvbnN0IEUmIGUpOwogICB2aXJ0dWFsIHZvaWQgdGhyb3dfaXQoKSA9IDA7Ci0gIHZpcnR1YWwgflREZWxheWVkRXhjZXB0aW9uKCkge307CisgIHZpcnR1YWwgflREZWxheWVkRXhjZXB0aW9uKCl7fTsKIH07CiAKLXRlbXBsYXRlIDxjbGFzcyBFPiBjbGFzcyBURXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBURGVsYXllZEV4Y2VwdGlvbiB7Ci0gcHVibGljOgordGVtcGxhdGUgPGNsYXNzIEU+CitjbGFzcyBURXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBURGVsYXllZEV4Y2VwdGlvbiB7CitwdWJsaWM6CiAgIFRFeGNlcHRpb25XcmFwcGVyKGNvbnN0IEUmIGUpIDogZV8oZSkge30KICAgdmlydHVhbCB2b2lkIHRocm93X2l0KCkgewogICAgIEUgdGVtcChlXyk7CiAgICAgZGVsZXRlIHRoaXM7CiAgICAgdGhyb3cgdGVtcDsKICAgfQotIHByaXZhdGU6CisKK3ByaXZhdGU6CiAgIEUgZV87CiB9OwogCkBAIC0xOTgsMTMgKzEyMiwxMiBAQAogCiAjaWYgVF9HTE9CQUxfREVCVUdfVklSVFVBTCA+IDEKIHZvaWQgcHJvZmlsZV92aXJ0dWFsX2NhbGwoY29uc3Qgc3RkOjp0eXBlX2luZm8mIGluZm8pOwotdm9pZCBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRlbXBsYXRlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgcHJvdF90eXBlKTsKLXZvaWQgcHJvZmlsZV9wcmludF9pbmZvKEZJTEUgKmYpOwordm9pZCBwcm9maWxlX2dlbmVyaWNfcHJvdG9jb2woY29uc3Qgc3RkOjp0eXBlX2luZm8mIHRlbXBsYXRlX3R5cGUsIGNvbnN0IHN0ZDo6dHlwZV9pbmZvJiBwcm90X3R5cGUpOwordm9pZCBwcm9maWxlX3ByaW50X2luZm8oRklMRSogZik7CiB2b2lkIHByb2ZpbGVfcHJpbnRfaW5mbygpOwogdm9pZCBwcm9maWxlX3dyaXRlX3Bwcm9mKEZJTEUqIGdlbl9jYWxsc19mLCBGSUxFKiB2aXJ0dWFsX2NhbGxzX2YpOwogI2VuZGlmCi0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEhSSUZUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAKaW5kZXggMTgwY2ZiNy4uNmNlMzQ2YiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1ZpcnR1YWxQcm9maWxpbmcuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9WaXJ0dWFsUHJvZmlsaW5nLmNwcApAQCAtMzUsMTQgKzM1LDE0IEBACiAjZXJyb3IgIlRocmlmdCB2aXJ0dWFsIGZ1bmN0aW9uIHByb2ZpbGluZyBjdXJyZW50bHkgcmVxdWlyZXMgZ2xpYmMiCiAjZW5kaWYgLy8gIV9fR0xJQkNfXwogCi0KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIAogI2luY2x1ZGUgPGV4dC9oYXNoX21hcD4KICNpbmNsdWRlIDxleGVjaW5mby5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CiAKIHVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKIHVzaW5nIDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKQEAgLTUzLDIwICs1MywxOCBAQAogICogQSBzdGFjayB0cmFjZQogICovCiBjbGFzcyBCYWNrdHJhY2UgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQmFja3RyYWNlKGludCBza2lwID0gMCk7Ci0gIEJhY2t0cmFjZShCYWNrdHJhY2UgY29uc3QgJmJ0KTsKKyAgQmFja3RyYWNlKEJhY2t0cmFjZSBjb25zdCYgYnQpOwogCi0gIHZvaWQgb3BlcmF0b3I9KEJhY2t0cmFjZSBjb25zdCAmYnQpIHsKKyAgdm9pZCBvcGVyYXRvcj0oQmFja3RyYWNlIGNvbnN0JiBidCkgewogICAgIG51bUNhbGxlcnNfID0gYnQubnVtQ2FsbGVyc187CiAgICAgaWYgKG51bUNhbGxlcnNfID49IDApIHsKICAgICAgIG1lbWNweShjYWxsZXJzXywgYnQuY2FsbGVyc18sIG51bUNhbGxlcnNfICogc2l6ZW9mKHZvaWQqKSk7CiAgICAgfQogICB9CiAKLSAgYm9vbCBvcGVyYXRvcj09KEJhY2t0cmFjZSBjb25zdCAmYnQpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNtcChidCkgPT0gMCk7Ci0gIH0KKyAgYm9vbCBvcGVyYXRvcj09KEJhY2t0cmFjZSBjb25zdCYgYnQpIGNvbnN0IHsgcmV0dXJuIChjbXAoYnQpID09IDApOyB9CiAKICAgc2l6ZV90IGhhc2goKSBjb25zdCB7CiAgICAgaW50cHRyX3QgcmV0ID0gMDsKQEAgLTgzLDggKzgxLDggQEAKICAgICB9CiAKICAgICBmb3IgKGludCBuID0gMDsgbiA8IG51bUNhbGxlcnNfOyArK24pIHsKLSAgICAgIGludCBkaWZmID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oY2FsbGVyc19bbl0pIC0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oYnQuY2FsbGVyc19bbl0pOworICAgICAgaW50IGRpZmYgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihjYWxsZXJzX1tuXSkKKyAgICAgICAgICAgICAgICAgLSByZWludGVycHJldF9jYXN0PGludHB0cl90PihidC5jYWxsZXJzX1tuXSk7CiAgICAgICBpZiAoZGlmZiAhPSAwKSB7CiAgICAgICAgIHJldHVybiBkaWZmOwogICAgICAgfQpAQCAtOTMsOCArOTEsOCBAQAogICAgIHJldHVybiAwOwogICB9CiAKLSAgdm9pZCBwcmludChGSUxFICpmLCBpbnQgaW5kZW50PTAsIGludCBzdGFydD0wKSBjb25zdCB7Ci0gICAgY2hhciAqKnN0cmluZ3MgPSBiYWNrdHJhY2Vfc3ltYm9scyhjYWxsZXJzXywgbnVtQ2FsbGVyc18pOworICB2b2lkIHByaW50KEZJTEUqIGYsIGludCBpbmRlbnQgPSAwLCBpbnQgc3RhcnQgPSAwKSBjb25zdCB7CisgICAgY2hhcioqIHN0cmluZ3MgPSBiYWNrdHJhY2Vfc3ltYm9scyhjYWxsZXJzXywgbnVtQ2FsbGVyc18pOwogICAgIGlmIChzdHJpbmdzKSB7CiAgICAgICBzdGFydCArPSBza2lwXzsKICAgICAgIGlmIChzdGFydCA8IDApIHsKQEAgLTEwOSwxMSArMTA3LDkgQEAKICAgICB9CiAgIH0KIAotICBpbnQgZ2V0RGVwdGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bUNhbGxlcnNfIC0gc2tpcF87Ci0gIH0KKyAgaW50IGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gbnVtQ2FsbGVyc18gLSBza2lwXzsgfQogCi0gIHZvaWQgKmdldEZyYW1lKGludCBpbmRleCkgY29uc3QgeworICB2b2lkKiBnZXRGcmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKICAgICBpbnQgYWRqdXN0ZWRfaW5kZXggPSBpbmRleCArIHNraXBfOwogICAgIGlmIChhZGp1c3RlZF9pbmRleCA8IDAgfHwgYWRqdXN0ZWRfaW5kZXggPj0gbnVtQ2FsbGVyc18pIHsKICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTIxLDggKzExNyw4IEBACiAgICAgcmV0dXJuIGNhbGxlcnNfW2FkanVzdGVkX2luZGV4XTsKICAgfQogCi0gcHJpdmF0ZToKLSAgdm9pZCAqY2FsbGVyc19bTUFYX1NUQUNLX0RFUFRIXTsKK3ByaXZhdGU6CisgIHZvaWQqIGNhbGxlcnNfW01BWF9TVEFDS19ERVBUSF07CiAgIGludCBudW1DYWxsZXJzXzsKICAgaW50IHNraXBfOwogfTsKQEAgLTEzOCw5ICsxMzQsNyBAQAogICB9CiB9CiAKLUJhY2t0cmFjZTo6QmFja3RyYWNlKEJhY2t0cmFjZSBjb25zdCAmYnQpCi0gIDogbnVtQ2FsbGVyc18oYnQubnVtQ2FsbGVyc18pCi0gICwgc2tpcF8oYnQuc2tpcF8pIHsKK0JhY2t0cmFjZTo6QmFja3RyYWNlKEJhY2t0cmFjZSBjb25zdCYgYnQpIDogbnVtQ2FsbGVyc18oYnQubnVtQ2FsbGVyc18pLCBza2lwXyhidC5za2lwXykgewogICBpZiAobnVtQ2FsbGVyc18gPj0gMCkgewogICAgIG1lbWNweShjYWxsZXJzXywgYnQuY2FsbGVyc18sIG51bUNhbGxlcnNfICogc2l6ZW9mKHZvaWQqKSk7CiAgIH0KQEAgLTE1MCwzMiArMTQ0LDIwIEBACiAgKiBBIGJhY2t0cmFjZSwgcGx1cyBvbmUgb3IgdHdvIHR5cGUgbmFtZXMKICAqLwogY2xhc3MgS2V5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIGNsYXNzIEhhc2ggewotICAgcHVibGljOgotICAgIHNpemVfdCBvcGVyYXRvcigpKEtleSBjb25zdCYgaykgY29uc3QgewotICAgICAgcmV0dXJuIGsuaGFzaCgpOwotICAgIH0KKyAgcHVibGljOgorICAgIHNpemVfdCBvcGVyYXRvcigpKEtleSBjb25zdCYgaykgY29uc3QgeyByZXR1cm4gay5oYXNoKCk7IH0KICAgfTsKIAogICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbykKLSAgICA6IGJhY2t0cmFjZV8oYnQpCi0gICAgLCB0eXBlTmFtZTFfKHR5cGVfaW5mby5uYW1lKCkpCi0gICAgLCB0eXBlTmFtZTJfKE5VTEwpIHsKLSAgfQorICAgIDogYmFja3RyYWNlXyhidCksIHR5cGVOYW1lMV8odHlwZV9pbmZvLm5hbWUoKSksIHR5cGVOYW1lMl8oTlVMTCkge30KIAotICBLZXkoY29uc3QgQmFja3RyYWNlKiBidCwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzEsCi0gICAgICBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvMikKLSAgICA6IGJhY2t0cmFjZV8oYnQpCi0gICAgLCB0eXBlTmFtZTFfKHR5cGVfaW5mbzEubmFtZSgpKQotICAgICwgdHlwZU5hbWUyXyh0eXBlX2luZm8yLm5hbWUoKSkgewotICB9CisgIEtleShjb25zdCBCYWNrdHJhY2UqIGJ0LCBjb25zdCBzdGQ6OnR5cGVfaW5mbyYgdHlwZV9pbmZvMSwgY29uc3Qgc3RkOjp0eXBlX2luZm8mIHR5cGVfaW5mbzIpCisgICAgOiBiYWNrdHJhY2VfKGJ0KSwgdHlwZU5hbWUxXyh0eXBlX2luZm8xLm5hbWUoKSksIHR5cGVOYW1lMl8odHlwZV9pbmZvMi5uYW1lKCkpIHt9CiAKICAgS2V5KGNvbnN0IEtleSYgaykKLSAgICA6IGJhY2t0cmFjZV8oay5iYWNrdHJhY2VfKQotICAgICwgdHlwZU5hbWUxXyhrLnR5cGVOYW1lMV8pCi0gICAgLCB0eXBlTmFtZTJfKGsudHlwZU5hbWUyXykgewotICB9CisgICAgOiBiYWNrdHJhY2VfKGsuYmFja3RyYWNlXyksIHR5cGVOYW1lMV8oay50eXBlTmFtZTFfKSwgdHlwZU5hbWUyXyhrLnR5cGVOYW1lMl8pIHt9CiAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgS2V5JiBrKSB7CiAgICAgYmFja3RyYWNlXyA9IGsuYmFja3RyYWNlXzsKQEAgLTE4MywxNyArMTY1LDExIEBACiAgICAgdHlwZU5hbWUyXyA9IGsudHlwZU5hbWUyXzsKICAgfQogCi0gIGNvbnN0IEJhY2t0cmFjZSogZ2V0QmFja3RyYWNlKCkgY29uc3QgewotICAgIHJldHVybiBiYWNrdHJhY2VfOwotICB9CisgIGNvbnN0IEJhY2t0cmFjZSogZ2V0QmFja3RyYWNlKCkgY29uc3QgeyByZXR1cm4gYmFja3RyYWNlXzsgfQogCi0gIGNvbnN0IGNoYXIqIGdldFR5cGVOYW1lKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlTmFtZTFfOwotICB9CisgIGNvbnN0IGNoYXIqIGdldFR5cGVOYW1lKCkgY29uc3QgeyByZXR1cm4gdHlwZU5hbWUxXzsgfQogCi0gIGNvbnN0IGNoYXIqIGdldFR5cGVOYW1lMigpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZU5hbWUyXzsKLSAgfQorICBjb25zdCBjaGFyKiBnZXRUeXBlTmFtZTIoKSBjb25zdCB7IHJldHVybiB0eXBlTmFtZTJfOyB9CiAKICAgdm9pZCBtYWtlUGVyc2lzdGVudCgpIHsKICAgICAvLyBDb3B5IHRoZSBCYWNrdHJhY2Ugb2JqZWN0CkBAIC0yMzMsMjAgKzIwOSwxNyBAQAogICAgIHJldHVybiBrLnR5cGVOYW1lMl8gLSB0eXBlTmFtZTJfOwogICB9CiAKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEtleSYgaykgY29uc3QgewotICAgIHJldHVybiBjbXAoaykgPT0gMDsKLSAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgS2V5JiBrKSBjb25zdCB7IHJldHVybiBjbXAoaykgPT0gMDsgfQogCiAgIHNpemVfdCBoYXNoKCkgY29uc3QgewogICAgIC8vIE5PVEU6IEFzIGFib3ZlLCB3ZSBqdXN0IHVzZSB0aGUgbmFtZSBwb2ludGVyIHZhbHVlLgogICAgIC8vIFdvcmtzIHdpdGggR05VIGxpYnN0ZGMrKywgYnV0IG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3Qgb24gYWxsCiAgICAgLy8gaW1wbGVtZW50YXRpb25zLgotICAgIHJldHVybiBiYWNrdHJhY2VfLT5oYXNoKCkgXgotICAgICAgcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHR5cGVOYW1lMV8pIF4KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Pih0eXBlTmFtZTJfKTsKKyAgICByZXR1cm4gYmFja3RyYWNlXy0+aGFzaCgpIF4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHR5cGVOYW1lMV8pCisgICAgICAgICAgIF4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KHR5cGVOYW1lMl8pOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgY29uc3QgQmFja3RyYWNlKiBiYWNrdHJhY2VfOwogICBjb25zdCBjaGFyKiB0eXBlTmFtZTFfOwogICBjb25zdCBjaGFyKiB0eXBlTmFtZTJfOwpAQCAtMjU3LDkgKzIzMCw4IEBACiAgKiBoYXMgYSBoaWdoZXIgY291bnQuCiAgKi8KIGNsYXNzIENvdW50R3JlYXRlciB7Ci0gcHVibGljOgotICBib29sIG9wZXJhdG9yKCkoc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDEsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+IGJ0MikgY29uc3QgeworcHVibGljOgorICBib29sIG9wZXJhdG9yKCkoc3RkOjpwYWlyPEtleSwgc2l6ZV90PiBidDEsIHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gYnQyKSBjb25zdCB7CiAgICAgcmV0dXJuIGJ0MS5zZWNvbmQgPiBidDIuc2Vjb25kOwogICB9CiB9OwpAQCAtMjc4LDggKzI1MCw3IEBACiBCYWNrdHJhY2VNYXAgZ2VuZXJpY19jYWxsczsKIE11dGV4IGdlbmVyaWNfY2FsbHNfbXV0ZXg7CiAKLQotdm9pZCBfcmVjb3JkX2JhY2t0cmFjZShCYWNrdHJhY2VNYXAqIG1hcCwgY29uc3QgTXV0ZXgmIG11dGV4LCBLZXkgKmspIHsKK3ZvaWQgX3JlY29yZF9iYWNrdHJhY2UoQmFja3RyYWNlTWFwKiBtYXAsIGNvbnN0IE11dGV4JiBtdXRleCwgS2V5KiBrKSB7CiAgIEd1YXJkIGd1YXJkKG11dGV4KTsKIAogICBCYWNrdHJhY2VNYXA6Oml0ZXJhdG9yIGl0ID0gbWFwLT5maW5kKCprKTsKQEAgLTMyNCw3ICsyOTUsNyBAQAogICogUHJpbnQgdGhlIHJlY29yZGVkIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCiAgKi8KIHZvaWQgcHJvZmlsZV9wcmludF9pbmZvKEZJTEUqIGYpIHsKLSAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjwgc3RkOjpwYWlyPEtleSwgc2l6ZV90PiA+IEJhY2t0cmFjZVZlY3RvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+ID4gQmFja3RyYWNlVmVjdG9yOwogCiAgIENvdW50R3JlYXRlciBpc19ncmVhdGVyOwogCkBAIC0zNDIsMTMgKzMxMywxNCBAQAogICBCYWNrdHJhY2VWZWN0b3IgZ3Bfc29ydGVkKGdlbmVyaWNfY2FsbHMuYmVnaW4oKSwgZ2VuZXJpY19jYWxscy5lbmQoKSk7CiAgIHN0ZDo6c29ydChncF9zb3J0ZWQuYmVnaW4oKSwgZ3Bfc29ydGVkLmVuZCgpLCBpc19ncmVhdGVyKTsKIAotICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBncF9zb3J0ZWQuYmVnaW4oKTsKLSAgICAgICBpdCAhPSBncF9zb3J0ZWQuZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIEtleSBjb25zdCAma2V5ID0gaXQtPmZpcnN0OworICBmb3IgKEJhY2t0cmFjZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBncF9zb3J0ZWQuYmVnaW4oKTsgaXQgIT0gZ3Bfc29ydGVkLmVuZCgpOyArK2l0KSB7CisgICAgS2V5IGNvbnN0JiBrZXkgPSBpdC0+Zmlyc3Q7CiAgICAgc2l6ZV90IGNvbnN0IGNvdW50ID0gaXQtPnNlY29uZDsKLSAgICBmcHJpbnRmKGYsICJUX0dFTkVSSUNfUFJPVE9DT0w6ICV6dSBjYWxscyB0byAlcyB3aXRoIGEgJXM6XG4iLAotICAgICAgICAgICAgY291bnQsIGtleS5nZXRUeXBlTmFtZSgpLCBrZXkuZ2V0VHlwZU5hbWUyKCkpOworICAgIGZwcmludGYoZiwKKyAgICAgICAgICAgICJUX0dFTkVSSUNfUFJPVE9DT0w6ICV6dSBjYWxscyB0byAlcyB3aXRoIGEgJXM6XG4iLAorICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICBrZXkuZ2V0VHlwZU5hbWUoKSwKKyAgICAgICAgICAgIGtleS5nZXRUeXBlTmFtZTIoKSk7CiAgICAga2V5LmdldEJhY2t0cmFjZSgpLT5wcmludChmLCAyKTsKICAgICBmcHJpbnRmKGYsICJcbiIpOwogICB9CkBAIC0zNTcsMTAgKzMyOSw4IEBACiAgIEJhY2t0cmFjZVZlY3RvciB2Y19zb3J0ZWQodmlydHVhbF9jYWxscy5iZWdpbigpLCB2aXJ0dWFsX2NhbGxzLmVuZCgpKTsKICAgc3RkOjpzb3J0KHZjX3NvcnRlZC5iZWdpbigpLCB2Y19zb3J0ZWQuZW5kKCksIGlzX2dyZWF0ZXIpOwogCi0gIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHZjX3NvcnRlZC5iZWdpbigpOwotICAgICAgIGl0ICE9IHZjX3NvcnRlZC5lbmQoKTsKLSAgICAgICArK2l0KSB7Ci0gICAgS2V5IGNvbnN0ICZrZXkgPSBpdC0+Zmlyc3Q7CisgIGZvciAoQmFja3RyYWNlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHZjX3NvcnRlZC5iZWdpbigpOyBpdCAhPSB2Y19zb3J0ZWQuZW5kKCk7ICsraXQpIHsKKyAgICBLZXkgY29uc3QmIGtleSA9IGl0LT5maXJzdDsKICAgICBzaXplX3QgY29uc3QgY291bnQgPSBpdC0+c2Vjb25kOwogICAgIGZwcmludGYoZiwgIlRfVklSVFVBTF9DQUxMOiAlenUgY2FsbHMgb24gJXM6XG4iLCBjb3VudCwga2V5LmdldFR5cGVOYW1lKCkpOwogICAgIGtleS5nZXRCYWNrdHJhY2UoKS0+cHJpbnQoZiwgMik7CkBAIC0zODAsNyArMzUwLDcgQEAKICAqLwogc3RhdGljIHZvaWQgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKEZJTEUqIGYsIEJhY2t0cmFjZU1hcCBjb25zdCYgbWFwKSB7CiAgIC8vIFdyaXRlIHRoZSBoZWFkZXIKLSAgdWludHB0cl90IGhlYWRlcls1XSA9IHsgMCwgMywgMCwgMCwgMCB9OworICB1aW50cHRyX3QgaGVhZGVyWzVdID0gezAsIDMsIDAsIDAsIDB9OwogICBmd3JpdGUoJmhlYWRlciwgc2l6ZW9mKGhlYWRlciksIDEsIGYpOwogCiAgIC8vIFdyaXRlIHRoZSBwcm9maWxlIHJlY29yZHMKQEAgLTM5OSwxMiArMzY5LDEyIEBACiAgIH0KIAogICAvLyBXcml0ZSB0aGUgdHJhaWxlcgotICB1aW50cHRyX3QgdHJhaWxlclszXSA9IHsgMCwgMSwgMCB9OworICB1aW50cHRyX3QgdHJhaWxlclszXSA9IHswLCAxLCAwfTsKICAgZndyaXRlKCZ0cmFpbGVyLCBzaXplb2YodHJhaWxlciksIDEsIGYpOwogCiAgIC8vIFdyaXRlIC9wcm9jL3NlbGYvbWFwcwogICAvLyBUT0RPKHNpbXBraW5zKTogVGhpcyBvbmx5IHdvcmtzIG9uIGxpbnV4Ci0gIEZJTEUgKnByb2NfbWFwcyA9IGZvcGVuKCIvcHJvYy9zZWxmL21hcHMiLCAiciIpOworICBGSUxFKiBwcm9jX21hcHMgPSBmb3BlbigiL3Byb2Mvc2VsZi9tYXBzIiwgInIiKTsKICAgaWYgKHByb2NfbWFwcykgewogICAgIHVpbnQ4X3QgYnVmWzQwOTZdOwogICAgIHdoaWxlICh0cnVlKSB7CkBAIC00MzQsNyArNDA0LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV92aXJ0dWFsX2NhbGwoKSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhpcyBmaWxlLgogICovCiB2b2lkIHByb2ZpbGVfd3JpdGVfcHByb2YoRklMRSogZ2VuX2NhbGxzX2YsIEZJTEUqIHZpcnR1YWxfY2FsbHNfZikgewotICB0eXBlZGVmIHN0ZDo6dmVjdG9yPCBzdGQ6OnBhaXI8S2V5LCBzaXplX3Q+ID4gQmFja3RyYWNlVmVjdG9yOworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxLZXksIHNpemVfdD4gPiBCYWNrdHJhY2VWZWN0b3I7CiAKICAgQ291bnRHcmVhdGVyIGlzX2dyZWF0ZXI7CiAKQEAgLTQ0OSw3ICs0MTksNyBAQAogICAvLyB3cml0ZSB0aGUgaW5mbyBmcm9tIHZpcnR1YWxfY2FsbHMKICAgcHJvZmlsZV93cml0ZV9wcHJvZl9maWxlKHZpcnR1YWxfY2FsbHNfZiwgdmlydHVhbF9jYWxscyk7CiB9Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyBUX0dMT0JBTF9QUk9GSUxFX1ZJUlRVQUwgPiAwCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKaW5kZXggYTdmNjQzNS4uOWM5NmIxNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaApAQCAtMjAsMjcgKzIwLDI3IEBACiAjaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KICNkZWZpbmUgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXyAxCiAKLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLy8gUHJvY2VzcyBkYXRhIGluICJpbiIsIHB1dHRpbmcgdGhlIHJlc3VsdCBpbiAib3V0Ii4KICAgLy8gQ2FsbCBfcmV0dXJuKHRydWUpIHdoZW4gZG9uZSwgb3IgX3JldHVybihmYWxzZSkgdG8KICAgLy8gZm9yY2VmdWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiAoaWYgYXBwbGljYWJsZSkuCiAgIC8vICJpbiIgYW5kICJvdXQiIHNob3VsZCBiZSBUTWVtb3J5QnVmZmVyIG9yIHNpbWlsYXIsCiAgIC8vIG5vdCBhIHdyYXBwZXIgYXJvdW5kIGEgc29ja2V0LgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcygKLSAgICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpID0gMDsKICAgdmlydHVhbCB+VEFzeW5jQnVmZmVyUHJvY2Vzc29yKCkge30KIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFTWU5DX0JVRkZFUl9QUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAppbmRleCBiZmRlNjYwLi4wMWI5MTEzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCkBAIC0xOCwxNyArMTgsMTkgQEAKICAqLwogCiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIHZvaWQgVEFzeW5jQ2hhbm5lbDo6c2VuZEFuZFJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciogc2VuZEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpIHsKLSAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gc2VuZF9kb25lID0KLSAgICBzdGQ6OnRyMTo6YmluZCgmVEFzeW5jQ2hhbm5lbDo6cmVjdk1lc3NhZ2UsIHRoaXMsIGNvYiwgcmVjdkJ1Zik7CisgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBzZW5kX2RvbmUKKyAgICAgID0gc3RkOjpiaW5kKCZUQXN5bmNDaGFubmVsOjpyZWN2TWVzc2FnZSwgdGhpcywgY29iLCByZWN2QnVmKTsKIAogICBzZW5kTWVzc2FnZShzZW5kX2RvbmUsIHNlbmRCdWYpOwogfQotCi19fX0gIC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCmluZGV4IDYzNGI2YTQuLmQ3YWNlOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaApAQCAtMjAsMTkgKzIwLDI2IEBACiAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXwogI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8gMQogCi0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogY2xhc3MgVE1lbW9yeUJ1ZmZlcjsKLX19fQorfQorfQorfQogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiAKIGNsYXNzIFRBc3luY0NoYW5uZWwgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UQXN5bmNDaGFubmVsKCkge30KIApAQCAtNDUsMjIgKzUyLDIzIEBACiAgICAqIFNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIGNoYW5uZWwuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgc2VuZE1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgPSAwOwogCiAgIC8qKgogICAgKiBSZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBjaGFubmVsLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAotICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpID0gMDsKIAogICAvKioKICAgICogU2VuZCBhIG1lc3NhZ2Ugb3ZlciB0aGUgY2hhbm5lbCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKLSAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAotICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1Zik7CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0FTWU5DX1RBU1lOQ0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKaW5kZXggOTQyN2EzMi4uNTlkYjU5NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKQEAgLTE5LDkgKzE5LDExIEBACiAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVEFTWU5DRElTUEFUQ0hQUk9DRVNTT1JfSF8KICNkZWZpbmUgX1RIUklGVF9BU1lOQ19UQVNZTkNESVNQQVRDSFBST0NFU1NPUl9IXyAxCiAKLSNpbmNsdWRlICJUQXN5bmNQcm9jZXNzb3IuaCIKKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiAvKioKICAqIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIGlzIGEgaGVscGVyIGNsYXNzIHRvIHBhcnNlIHRoZSBtZXNzYWdlIGhlYWRlciB0aGVuCkBAIC0zMSwxMCArMzMsMTAgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KIGNsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVCA6IHB1YmxpYyBUQXN5bmNQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgeworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CiAKQEAgLTYwLDggKzYyLDcgQEAKICAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAogICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQogICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtdHlwZSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKICAgICAgIF9yZXR1cm4oZmFsc2UpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTY5LDE2ICs3MCwxNiBAQAogICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKICAgfQogCi0gIHZvaWQgcHJvY2Vzc0Zhc3Qoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICBQcm90b2NvbF8qIGluLCBQcm90b2NvbF8qIG91dCkgeworICB2b2lkIHByb2Nlc3NGYXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOwogICAgIGludDMyX3Qgc2VxaWQ7CiAgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4oZm5hbWUsIG10eXBlLCBzZXFpZCk7CiAKICAgICBpZiAobXR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiBtdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInJlY2VpdmVkIGludmFsaWQgbWVzc2FnZSB0eXBlICVkIGZyb20gY2xpZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbXR5cGUpOworICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLCBtdHlwZSk7CiAgICAgICBfcmV0dXJuKGZhbHNlKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NiwxMyArODcsMTUgQEAKICAgICByZXR1cm4gdGhpcy0+ZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKF9yZXR1cm4sIGluLCBvdXQsIGZuYW1lLCBzZXFpZCk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsIGludDMyX3Qgc2VxaWQpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCkgPSAwOwogCi0gIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBpbiwgUHJvdG9jb2xfKiBvdXQsCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKIH07CkBAIC0xMDIsMTAgKzEwNSwxMCBAQAogICogdGhhdCBkb2Vzbid0IGJvdGhlciB0cnlpbmcgdG8gcGVyZm9ybSBhIGR5bmFtaWNfY2FzdC4KICAqLwogY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVEFzeW5jUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgewogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIGluUmF3ID0gaW4uZ2V0KCk7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogb3V0UmF3ID0gb3V0LmdldCgpOwogCkBAIC0xMjAsOCArMTIzLDcgQEAKICAgICAvLyAoVGhlIG9sZCBnZW5lcmF0ZWQgcHJvY2Vzc29yIGNvZGUgdXNlZCB0byB0cnkgdG8gc2tpcCBhIFRfU1RSVUNUIGFuZAogICAgIC8vIGNvbnRpbnVlLiAgSG93ZXZlciwgdGhhdCBzZWVtcyB1bnNhZmUuKQogICAgIGlmIChtdHlwZSAhPSBwcm90b2NvbDo6VF9DQUxMICYmIG10eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigicmVjZWl2ZWQgaW52YWxpZCBtZXNzYWdlIHR5cGUgJWQgZnJvbSBjbGllbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtdHlwZSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJyZWNlaXZlZCBpbnZhbGlkIG1lc3NhZ2UgdHlwZSAlZCBmcm9tIGNsaWVudCIsIG10eXBlKTsKICAgICAgIF9yZXR1cm4oZmFsc2UpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEyOSwyMSArMTMxLDIxIEBACiAgICAgcmV0dXJuIGRpc3BhdGNoQ2FsbChfcmV0dXJuLCBpblJhdywgb3V0UmF3LCBmbmFtZSwgc2VxaWQpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLCBpbnQzMl90IHNlcWlkKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKIH07CiAKIC8vIFNwZWNpYWxpemUgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUIGZvciBUUHJvdG9jb2wgYW5kIFREdW1teVByb3RvY29sIGp1c3QgdG8KIC8vIHVzZSB0aGUgZ2VuZXJpYyBURGlzcGF0Y2hQcm9jZXNzb3IuCiB0ZW1wbGF0ZSA8PgotY2xhc3MgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3JUPHByb3RvY29sOjpURHVtbXlQcm90b2NvbD4gOgotICBwdWJsaWMgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3Ige307CitjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlREdW1teVByb3RvY29sPiA6IHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKIHRlbXBsYXRlIDw+Ci1jbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQ8cHJvdG9jb2w6OlRQcm90b2NvbD4gOgotICBwdWJsaWMgVEFzeW5jRGlzcGF0Y2hQcm9jZXNzb3Ige307Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKK2NsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yVDxwcm90b2NvbDo6VFByb3RvY29sPiA6IHB1YmxpYyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvciB7fTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCiAKICNlbmRpZiAvLyBfVEhSSUZUX0FTWU5DX1RBU1lOQ0RJU1BBVENIUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKaW5kZXggZTY4YzU1MC4uZmRiOTc2ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaApAQCAtMjAsNTggKzIwLDQ2IEBACiAjaWZuZGVmIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfCiAjZGVmaW5lIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfIDEKIAotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIC8qKgogICogQXN5bmMgdmVyc2lvbiBvZiBhIFRQcm9jZXNzb3IuICBJdCBpcyBub3QgZXhwZWN0ZWQgdG8gY29tcGxldGUgYnkgdGhlIHRpbWUKICAqIHRoZSBjYWxsIHRvIHByb2Nlc3MgcmV0dXJucy4gIEluc3RlYWQsIGl0IGNhbGxzIGEgY29iIHRvIHNpZ25hbCBjb21wbGV0aW9uLgogICovCiAKLWNsYXNzIFRFdmVudFNlcnZlcjsgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotCiBjbGFzcyBUQXN5bmNQcm9jZXNzb3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB+VEFzeW5jUHJvY2Vzc29yKCkge30KIAotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKIAotICB2b2lkIHByb2Nlc3Moc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbykgeworICB2b2lkIHByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgc3VjY2Vzcyk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8pIHsKICAgICByZXR1cm4gcHJvY2VzcyhfcmV0dXJuLCBpbywgaW8pOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgewotICAgIHJldHVybiBldmVudEhhbmRsZXJfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CiAKLSAgdm9pZCBzZXRFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgIHZvaWQgc2V0RXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKICAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwogICB9CiAKLSAgY29uc3QgVEV2ZW50U2VydmVyKiBnZXRBc3luY1NlcnZlcigpIHsKLSAgICByZXR1cm4gYXN5bmNTZXJ2ZXJfOwotICB9Ci0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBUQXN5bmNQcm9jZXNzb3IoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0gIGNvbnN0IFRFdmVudFNlcnZlciogYXN5bmNTZXJ2ZXJfOwotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBURXZlbnRTZXJ2ZXI7Ci0gIHZvaWQgc2V0QXN5bmNTZXJ2ZXIoY29uc3QgVEV2ZW50U2VydmVyKiBzZXJ2ZXIpIHsKLSAgICBhc3luY1NlcnZlcl8gPSBzZXJ2ZXI7Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CiB9OwogCiBjbGFzcyBUQXN5bmNQcm9jZXNzb3JGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvckZhY3RvcnkoKSB7fQogCiAgIC8qKgpAQCAtODEsMTcgKzY5LDE2IEBACiAgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQogICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoCi0gICAgICBjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pID0gMDsKIH07Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwogCi0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwotCi0vLyBYWFggSSdtIGxhenkgZm9yIG5vdwotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgewotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7Ci19fQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7Cit9Cit9CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVEFTWU5DUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAppbmRleCBlYWE4NmUwLi5jYjUyMDFiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKQEAgLTE3LDM1ICsxNywzNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIlRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCi12b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpwcm9jZXNzKAotICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IGlidWYsCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IG9idWYpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKLSAgcmV0dXJuIHVuZGVybHlpbmdfLT5wcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmJpbmQoCi0gICAgICAgICZUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoLAotICAgICAgICBfcmV0dXJuLAotICAgICAgICBvcHJvdCwKLSAgICAgICAgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgaXByb3QsIG9wcm90KTsKK3ZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiBvYnVmKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2woaWJ1ZikpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKKyAgcmV0dXJuIHVuZGVybHlpbmdfCisgICAgICAtPnByb2Nlc3Moc3RkOjpiaW5kKCZUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICBpcHJvdCwKKyAgICAgICAgICAgICAgICBvcHJvdCk7CiB9CiAKIC8qIHN0YXRpYyAqLyB2b2lkIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2goCi0gICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAogICAgIGJvb2wgaGVhbHRoeSkgewotICAodm9pZCkgb3Byb3Q7CisgICh2b2lkKW9wcm90OwogICAvLyBUaGlzIGlzIGEgc3R1YiBmdW5jdGlvbiB0byBob2xkIGEgcmVmZXJlbmNlIHRvIG9wcm90LgogICByZXR1cm4gX3JldHVybihoZWFsdGh5KTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKaW5kZXggMTM5ZTM5NC4uODA1MmNmMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKQEAgLTIwLDM4ICsyMCwzNiBAQAogI2lmbmRlZiBfVEhSSUZUX1ROQU1FX01FX0hfCiAjZGVmaW5lIF9USFJJRlRfVE5BTUVfTUVfSF8gMQogCi0jaW5jbHVkZSAiVEFzeW5jUHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAiVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXN5bmMgewogCiBjbGFzcyBUQXN5bmNQcm90b2NvbFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQotICAgIDogdW5kZXJseWluZ18odW5kZXJseWluZykKLSAgICAsIHBmYWN0XyhwZmFjdCkKLSAge30KK3B1YmxpYzoKKyAgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3QpCisgICAgOiB1bmRlcmx5aW5nXyh1bmRlcmx5aW5nKSwgcGZhY3RfKHBmYWN0KSB7fQogCi0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpOworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IG9idWYpOwogCiAgIHZpcnR1YWwgflRBc3luY1Byb3RvY29sUHJvY2Vzc29yKCkge30KIAotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIGZpbmlzaCgKLSAgICAgIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3Byb3QsCi0gICAgICBib29sIGhlYWx0aHkpOworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgZmluaXNoKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGVhbHRoeSk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB1bmRlcmx5aW5nXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmdfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1ROQU1FX01FX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlMjdjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmNwcApAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaD4KKyNpbmNsdWRlIDx0aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKKworVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6VENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbygpIDoKKyAgc3RvcF8oZmFsc2UpLAorICBzZXFpZE11dGV4XygpLAorICAvLyB0ZXN0IHJvbGxvdmVyIGFsbCB0aGUgdGltZQorICBuZXh0c2VxaWRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCktMTApLAorICBzZXFpZFRvTW9uaXRvck1hcF8oKSwKKyAgZnJlZU1vbml0b3JzXygpLAorICB3cml0ZU11dGV4XygpLAorICByZWFkTXV0ZXhfKCksCisgIHJlY3ZQZW5kaW5nXyhmYWxzZSksCisgIHdha2V1cFNvbWVvbmVfKGZhbHNlKSwKKyAgc2VxaWRQZW5kaW5nXygwKSwKKyAgZm5hbWVQZW5kaW5nXygpLAorICBtdHlwZVBlbmRpbmdfKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwpCit7CisgIGZyZWVNb25pdG9yc18ucmVzZXJ2ZShNT05JVE9SX0NBQ0hFX1NJWkUpOworfQorCitib29sIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OmdldFBlbmRpbmcoCisgIHN0ZDo6c3RyaW5nICZmbmFtZSwKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSAmbXR5cGUsCisgIGludDMyX3QgJnJzZXFpZCkKK3sKKyAgaWYoc3RvcF8pCisgICAgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKyAgd2FrZXVwU29tZW9uZV8gPSBmYWxzZTsKKyAgaWYocmVjdlBlbmRpbmdfKQorICB7CisgICAgcmVjdlBlbmRpbmdfID0gZmFsc2U7CisgICAgcnNlcWlkID0gc2VxaWRQZW5kaW5nXzsKKyAgICBmbmFtZSAgPSBmbmFtZVBlbmRpbmdfOworICAgIG10eXBlICA9IG10eXBlUGVuZGluZ187CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnVwZGF0ZVBlbmRpbmcoCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZmbmFtZSwKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKKyAgaW50MzJfdCByc2VxaWQpCit7CisgIHJlY3ZQZW5kaW5nXyA9IHRydWU7CisgIHNlcWlkUGVuZGluZ18gPSByc2VxaWQ7CisgIGZuYW1lUGVuZGluZ18gPSBmbmFtZTsKKyAgbXR5cGVQZW5kaW5nXyA9IG10eXBlOworICBNb25pdG9yUHRyIG1vbml0b3I7CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgICBNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmZpbmQocnNlcWlkKTsKKyAgICBpZihpID09IHNlcWlkVG9Nb25pdG9yTWFwXy5lbmQoKSkKKyAgICAgIHRocm93QmFkU2VxSWRfKCk7CisgICAgbW9uaXRvciA9IGktPnNlY29uZDsKKyAgfQorICBtb25pdG9yLT5ub3RpZnkoKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp3YWl0Rm9yV29yayhpbnQzMl90IHNlcWlkKQoreworICBNb25pdG9yUHRyIG07CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHNlcWlkTXV0ZXhfKTsKKyAgICBtID0gc2VxaWRUb01vbml0b3JNYXBfW3NlcWlkXTsKKyAgfQorICB3aGlsZSh0cnVlKQorICB7CisgICAgLy8gYmUgdmVyeSBjYXJlZnVsIGFib3V0IHNldHRpbmcgc3RhdGUgaW4gdGhpcyBsb29wIHRoYXQgYWZmZWN0cyB3YWtpbmcgdXAuICBZb3UgbWF5IGV4aXQKKyAgICAvLyB0aGlzIGZ1bmN0aW9uLCBhdHRlbXB0IHRvIGdyYWIgc29tZSB3b3JrLCBhbmQgc29tZW9uZSBlbHNlIGNvdWxkIGhhdmUgYmVhdGVuIHlvdSAob3Igbm90CisgICAgLy8gbGVmdCkgdGhlIHJlYWQgbXV0ZXgsIGFuZCB0aGF0IHdpbGwgcHV0IHlvdSByaWdodCBiYWNrIGluIHRoaXMgbG9vcCwgd2l0aCB0aGUgbWFuZ2xlZAorICAgIC8vIHN0YXRlIHlvdSBsZWZ0IGJlaGluZC4KKyAgICBpZihzdG9wXykKKyAgICAgIHRocm93RGVhZENvbm5lY3Rpb25fKCk7CisgICAgaWYod2FrZXVwU29tZW9uZV8pCisgICAgICByZXR1cm47CisgICAgaWYocmVjdlBlbmRpbmdfICYmIHNlcWlkUGVuZGluZ18gPT0gc2VxaWQpCisgICAgICByZXR1cm47CisgICAgbS0+d2FpdEZvcmV2ZXIoKTsKKyAgfQorfQorCit2b2lkIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86OnRocm93QmFkU2VxSWRfKCkKK3sKKyAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICBUQXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCwKKyAgICAic2VydmVyIHNlbnQgYSBiYWQgc2VxaWQiKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp0aHJvd0RlYWRDb25uZWN0aW9uXygpCit7CisgIHRocm93IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgInRoaXMgY2xpZW50IGRpZWQgb24gYW5vdGhlciB0aHJlYWQsIGFuZCBpcyBub3cgaW4gYW4gdW51c2FibGUgc3RhdGUiKTsKK30KKwordm9pZCBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvOjp3YWtldXBBbnlvbmVfKGNvbnN0IEd1YXJkICYpCit7CisgIHdha2V1cFNvbWVvbmVfID0gdHJ1ZTsKKyAgaWYoIXNlcWlkVG9Nb25pdG9yTWFwXy5lbXB0eSgpKQorICB7CisgICAgLy8gVGhlIG1vbml0b3IgbWFwIG1hcHMgaW50ZWdlcnMgdG8gbW9uaXRvcnMuICBMYXJnZXIgaW50ZWdlcnMgYXJlIG1vcmUgcmVjZW50CisgICAgLy8gbWVzc2FnZXMuICBTaW5jZSB0aGlzIGlzIG9yZGVyZWQsIGl0IG1lYW5zIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBpcyB0aGUgbW9zdCByZWNlbnQuCisgICAgLy8gV2UgYXJlIHRyeWluZyB0byBndWVzcyB3aGljaCB0aHJlYWQgd2lsbCBoYXZlIGl0cyBtZXNzYWdlIGNvbXBsZXRlIG5leHQsIHNvIHdlIGFyZSBwaWNraW5nCisgICAgLy8gdGhlIG1vc3QgcmVjZW50LiBUaGUgb2xkZXN0IG1lc3NhZ2UgaXMgbGlrZWx5IHRvIGJlIHNvbWUgcG9sbGluZywgbG9uZyBsaXZlZCBtZXNzYWdlLgorICAgIC8vIElmIHdlIGd1ZXNzIHJpZ2h0LCB0aGUgdGhyZWFkIHdlIHdha2UgdXAgd2lsbCBoYW5kbGUgdGhlIG1lc3NhZ2UgdGhhdCBjb21lcyBpbi4KKyAgICAvLyBJZiB3ZSBndWVzcyB3cm9uZywgdGhlIHRocmVhZCB3ZSB3YWtlIHVwIHdpbGwgaGFuZCBvZmYgdGhlIHdvcmsgdG8gdGhlIGNvcnJlY3QgdGhyZWFkLAorICAgIC8vIGNvc3RpbmcgdXMgYW4gZXh0cmEgY29udGV4dCBzd2l0Y2guCisgICAgc2VxaWRUb01vbml0b3JNYXBfLnJiZWdpbigpLT5zZWNvbmQtPm5vdGlmeSgpOworICB9Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bWFya0JhZF8oY29uc3QgR3VhcmQgJikKK3sKKyAgd2FrZXVwU29tZW9uZV8gPSB0cnVlOworICBzdG9wXyA9IHRydWU7CisgIGZvcihNb25pdG9yTWFwOjppdGVyYXRvciBpID0gc2VxaWRUb01vbml0b3JNYXBfLmJlZ2luKCk7IGkgIT0gc2VxaWRUb01vbml0b3JNYXBfLmVuZCgpOyArK2kpCisgICAgaS0+c2Vjb25kLT5ub3RpZnkoKTsKK30KKworVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cgorVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6bmV3TW9uaXRvcl8oY29uc3QgR3VhcmQgJikKK3sKKyAgaWYoZnJlZU1vbml0b3JzXy5lbXB0eSgpKQorICAgIHJldHVybiBNb25pdG9yUHRyKG5ldyBNb25pdG9yKCZyZWFkTXV0ZXhfKSk7CisgIE1vbml0b3JQdHIgcmV0dmFsOworICAvL3N3YXBwaW5nIHRvIGF2b2lkIGFuIGF0b21pYyBvcGVyYXRpb24KKyAgcmV0dmFsLnN3YXAoZnJlZU1vbml0b3JzXy5iYWNrKCkpOworICBmcmVlTW9uaXRvcnNfLnBvcF9iYWNrKCk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6ZGVsZXRlTW9uaXRvcl8oCisgIGNvbnN0IEd1YXJkICYsCisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm86Ok1vbml0b3JQdHIgJm0pIC8qbm9leGNlcHQqLworeworICBpZihmcmVlTW9uaXRvcnNfLnNpemUoKSA+IE1PTklUT1JfQ0FDSEVfU0laRSkKKyAgeworICAgIG0ucmVzZXQoKTsKKyAgICByZXR1cm47CisgIH0KKyAgLy9mcmVlTW9uaXRvcnNfIHdhcyByZXNlcnZlZCB1cCB0byBNT05JVE9SX0NBQ0hFX1NJWkUgaW4gdGhlIGN0b3IsCisgIC8vc28gdGhpcyBzaG91bGRuJ3QgdGhyb3cKKyAgZnJlZU1vbml0b3JzXy5wdXNoX2JhY2soVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6TW9uaXRvclB0cigpKTsKKyAgLy9zd2FwcGluZyB0byBhdm9pZCBhbiBhdG9taWMgb3BlcmF0aW9uCisgIG0uc3dhcChmcmVlTW9uaXRvcnNfLmJhY2soKSk7Cit9CisKK2ludDMyX3QgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbzo6Z2VuZXJhdGVTZXFJZCgpCit7CisgIEd1YXJkIHNlcWlkR3VhcmQoc2VxaWRNdXRleF8pOworICBpZihzdG9wXykKKyAgICB0aHJvd0RlYWRDb25uZWN0aW9uXygpOworCisgIGlmKCFzZXFpZFRvTW9uaXRvck1hcF8uZW1wdHkoKSkKKyAgICBpZihuZXh0c2VxaWRfID09IHNlcWlkVG9Nb25pdG9yTWFwXy5iZWdpbigpLT5maXJzdCkKKyAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lELAorICAgICAgICAiYWJvdXQgdG8gcmVwZWF0IGEgc2VxaWQiKTsKKyAgaW50MzJfdCBuZXdTZXFJZCA9IG5leHRzZXFpZF8rKzsKKyAgc2VxaWRUb01vbml0b3JNYXBfW25ld1NlcUlkXSA9IG5ld01vbml0b3JfKHNlcWlkR3VhcmQpOworICByZXR1cm4gbmV3U2VxSWQ7Cit9CisKK1RDb25jdXJyZW50UmVjdlNlbnRyeTo6VENvbmN1cnJlbnRSZWN2U2VudHJ5KFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gKnN5bmMsIGludDMyX3Qgc2VxaWQpIDoKKyAgc3luY18oKnN5bmMpLAorICBzZXFpZF8oc2VxaWQpLAorICBjb21taXR0ZWRfKGZhbHNlKQoreworICBzeW5jXy5nZXRSZWFkTXV0ZXgoKS5sb2NrKCk7Cit9CisKK1RDb25jdXJyZW50UmVjdlNlbnRyeTo6flRDb25jdXJyZW50UmVjdlNlbnRyeSgpCit7CisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHN5bmNfLnNlcWlkTXV0ZXhfKTsKKyAgICBzeW5jXy5kZWxldGVNb25pdG9yXyhzZXFpZEd1YXJkLCBzeW5jXy5zZXFpZFRvTW9uaXRvck1hcF9bc2VxaWRfXSk7CisKKyAgICBzeW5jXy5zZXFpZFRvTW9uaXRvck1hcF8uZXJhc2Uoc2VxaWRfKTsKKyAgICBpZihjb21taXR0ZWRfKQorICAgICAgc3luY18ud2FrZXVwQW55b25lXyhzZXFpZEd1YXJkKTsKKyAgICBlbHNlCisgICAgICBzeW5jXy5tYXJrQmFkXyhzZXFpZEd1YXJkKTsKKyAgfQorICBzeW5jXy5nZXRSZWFkTXV0ZXgoKS51bmxvY2soKTsKK30KKwordm9pZCBUQ29uY3VycmVudFJlY3ZTZW50cnk6OmNvbW1pdCgpCit7CisgIGNvbW1pdHRlZF8gPSB0cnVlOworfQorCitUQ29uY3VycmVudFNlbmRTZW50cnk6OlRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvICpzeW5jKSA6CisgIHN5bmNfKCpzeW5jKSwKKyAgY29tbWl0dGVkXyhmYWxzZSkKK3sKKyAgc3luY18uZ2V0V3JpdGVNdXRleCgpLmxvY2soKTsKK30KKworVENvbmN1cnJlbnRTZW5kU2VudHJ5Ojp+VENvbmN1cnJlbnRTZW5kU2VudHJ5KCkKK3sKKyAgaWYoIWNvbW1pdHRlZF8pCisgIHsKKyAgICBHdWFyZCBzZXFpZEd1YXJkKHN5bmNfLnNlcWlkTXV0ZXhfKTsKKyAgICBzeW5jXy5tYXJrQmFkXyhzZXFpZEd1YXJkKTsKKyAgfQorICBzeW5jXy5nZXRXcml0ZU11dGV4KCkudW5sb2NrKCk7Cit9CisKK3ZvaWQgVENvbmN1cnJlbnRTZW5kU2VudHJ5Ojpjb21taXQoKQoreworICBjb21taXR0ZWRfID0gdHJ1ZTsKK30KKworCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM1ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBfVEhSSUZUX1RDT05DVVJSRU5UQ0xJRU5UU1lOQ0lORk9fSF8KKyNkZWZpbmUgX1RIUklGVF9UQ09OQ1VSUkVOVENMSUVOVFNZTkNJTkZPX0hfIDEKKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CisKK2NsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm87CisKK2NsYXNzIFRDb25jdXJyZW50U2VuZFNlbnRyeSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRDb25jdXJyZW50U2VuZFNlbnRyeShUQ29uY3VycmVudENsaWVudFN5bmNJbmZvKiBzeW5jKTsKKyAgflRDb25jdXJyZW50U2VuZFNlbnRyeSgpOworCisgIHZvaWQgY29tbWl0KCk7CisKK3ByaXZhdGU6CisgIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8mIHN5bmNfOworICBib29sIGNvbW1pdHRlZF87Cit9OworCitjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnkgeworcHVibGljOgorICBUQ29uY3VycmVudFJlY3ZTZW50cnkoVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbyogc3luYywgaW50MzJfdCBzZXFpZCk7CisgIH5UQ29uY3VycmVudFJlY3ZTZW50cnkoKTsKKworICB2b2lkIGNvbW1pdCgpOworCitwcml2YXRlOgorICBUQ29uY3VycmVudENsaWVudFN5bmNJbmZvJiBzeW5jXzsKKyAgaW50MzJfdCBzZXFpZF87CisgIGJvb2wgY29tbWl0dGVkXzsKK307CisKK2NsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8geworcHJpdmF0ZTogLy8gdHlwZWRlZnMKKyAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yPiBNb25pdG9yUHRyOworICB0eXBlZGVmIHN0ZDo6bWFwPGludDMyX3QsIE1vbml0b3JQdHI+IE1vbml0b3JNYXA7CisKK3B1YmxpYzoKKyAgVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mbygpOworCisgIGludDMyX3QgZ2VuZXJhdGVTZXFJZCgpOworCisgIGJvb2wgZ2V0UGVuZGluZyhzdGQ6OnN0cmluZyYgZm5hbWUsCisgICAgICAgICAgICAgICAgICA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlJiBtdHlwZSwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIHJzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICB2b2lkIHVwZGF0ZVBlbmRpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcnNlcWlkKTsgLyogcmVxdWlyZXMgcmVhZE11dGV4XyAqLworCisgIHZvaWQgd2FpdEZvcldvcmsoaW50MzJfdCBzZXFpZCk7IC8qIHJlcXVpcmVzIHJlYWRNdXRleF8gKi8KKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXgmIGdldFJlYWRNdXRleCgpIHsgcmV0dXJuIHJlYWRNdXRleF87IH0KKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4JiBnZXRXcml0ZU11dGV4KCkgeyByZXR1cm4gd3JpdGVNdXRleF87IH0KKworcHJpdmF0ZTogLy8gY29uc3RhbnRzCisgIGVudW0geyBNT05JVE9SX0NBQ0hFX1NJWkUgPSAxMCB9OworCitwcml2YXRlOiAvLyBmdW5jdGlvbnMKKyAgTW9uaXRvclB0ciBuZXdNb25pdG9yXygKKyAgICAgIGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZCYgc2VxaWRHdWFyZCk7IC8qIHJlcXVpcmVzIHNlcWlkTXV0ZXhfICovCisgIHZvaWQgZGVsZXRlTW9uaXRvcl8oY29uc3QgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkJiBzZXFpZEd1YXJkLCBNb25pdG9yUHRyJiBtKTsKKyAgICAgIC8qbm9leGNlcHQqLyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIHdha2V1cEFueW9uZV8oCisgICAgICBjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAgICAgICAgICAgLyogcmVxdWlyZXMgc2VxaWRNdXRleF8gKi8KKyAgdm9pZCBtYXJrQmFkXyhjb25zdCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQmIHNlcWlkR3VhcmQpOyAvKiByZXF1aXJlcyBzZXFpZE11dGV4XyAqLworICB2b2lkIHRocm93QmFkU2VxSWRfKCk7CisgIHZvaWQgdGhyb3dEZWFkQ29ubmVjdGlvbl8oKTsKKworcHJpdmF0ZTogLy8gZGF0YSBtZW1iZXJzCisgIHZvbGF0aWxlIGJvb2wgc3RvcF87CisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHNlcWlkTXV0ZXhfOworICAvLyBiZWdpbiBzZXFpZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworICBpbnQzMl90IG5leHRzZXFpZF87CisgIE1vbml0b3JNYXAgc2VxaWRUb01vbml0b3JNYXBfOworICBzdGQ6OnZlY3RvcjxNb25pdG9yUHRyPiBmcmVlTW9uaXRvcnNfOworICAvLyBlbmQgc2VxaWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKworICA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXggd3JpdGVNdXRleF87CisKKyAgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4IHJlYWRNdXRleF87CisgIC8vIGJlZ2luIHJlYWRNdXRleF8gcHJvdGVjdGVkIG1lbWJlcnMKKyAgYm9vbCByZWN2UGVuZGluZ187CisgIGJvb2wgd2FrZXVwU29tZW9uZV87CisgIGludDMyX3Qgc2VxaWRQZW5kaW5nXzsKKyAgc3RkOjpzdHJpbmcgZm5hbWVQZW5kaW5nXzsKKyAgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSBtdHlwZVBlbmRpbmdfOworICAvLyBlbmQgcmVhZE11dGV4XyBwcm90ZWN0ZWQgbWVtYmVycworCisgIGZyaWVuZCBjbGFzcyBUQ29uY3VycmVudFNlbmRTZW50cnk7CisgIGZyaWVuZCBjbGFzcyBUQ29uY3VycmVudFJlY3ZTZW50cnk7Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKKworI2VuZGlmIC8vIF9USFJJRlRfVENPTkNVUlJFTlRDTElFTlRTWU5DSU5GT19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKaW5kZXggNTg3MTUwMy4uNmFmODEwNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCkBAIC0xNyw4ICsxNywxMCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIlRFdmh0dHBDbGllbnRDaGFubmVsLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CiAjaW5jbHVkZSA8ZXZodHRwLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlci5oPgorI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXJfY29tcGF0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaD4KIApAQCAtMjgsNDIgKzMwLDMzIEBACiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKK1RFdmh0dHBDbGllbnRDaGFubmVsOjpURXZodHRwQ2xpZW50Q2hhbm5lbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSogZG5zYmFzZSkKIAotVEV2aHR0cENsaWVudENoYW5uZWw6OlRFdmh0dHBDbGllbnRDaGFubmVsKAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgaW50IHBvcnQsCi0gICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViKQotICA6IGhvc3RfKGhvc3QpCi0gICwgcGF0aF8ocGF0aCkKLSAgLCByZWN2QnVmXyhOVUxMKQotICAsIGNvbm5fKE5VTEwpCi17Ci0gIGNvbm5fID0gZXZodHRwX2Nvbm5lY3Rpb25fbmV3KGFkZHJlc3MsIHBvcnQpOworICA6IGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSwgY29ubl8oTlVMTCkgeworICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX2Jhc2VfbmV3KGViLCBkbnNiYXNlLCBhZGRyZXNzLCBwb3J0KTsKICAgaWYgKGNvbm5fID09IE5VTEwpIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfY29ubmVjdGlvbl9uZXcgZmFpbGVkIik7CiAgIH0KLSAgZXZodHRwX2Nvbm5lY3Rpb25fc2V0X2Jhc2UoY29ubl8sIGViKTsKIH0KIAotCiBURXZodHRwQ2xpZW50Q2hhbm5lbDo6flRFdmh0dHBDbGllbnRDaGFubmVsKCkgewogICBpZiAoY29ubl8gIT0gTlVMTCkgewogICAgIGV2aHR0cF9jb25uZWN0aW9uX2ZyZWUoY29ubl8pOwogICB9CiB9CiAKLQotdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZEFuZFJlY3ZNZXNzYWdlKAotICAgIGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAotICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHNlbmRCdWYsCi0gICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogcmVjdkJ1ZikgewotICBjb2JfID0gY29iOwotICByZWN2QnVmXyA9IHJlY3ZCdWY7Ci0KK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpIHsKICAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEgPSBldmh0dHBfcmVxdWVzdF9uZXcocmVzcG9uc2UsIHRoaXMpOwogICBpZiAocmVxID09IE5VTEwpIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfcmVxdWVzdF9uZXcgZmFpbGVkIik7CkBAIC05Myw3MCArODYsNzEgQEAKICAgaWYgKHJ2ICE9IDApIHsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJldmh0dHBfbWFrZV9yZXF1ZXN0IGZhaWxlZCIpOwogICB9CisKKyAgY29tcGxldGlvblF1ZXVlXy5wdXNoKENvbXBsZXRpb24oY29iLCByZWN2QnVmKSk7CiB9CiAKLQotdm9pZCBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZE1lc3NhZ2UoCi0gICAgY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKLSAgKHZvaWQpIGNvYjsKLSAgKHZvaWQpIG1lc3NhZ2U7Cit2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpIHsKKyAgKHZvaWQpY29iOworICAodm9pZCltZXNzYWdlOwogICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0JCQkgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpzZW5kTWVzc2FnZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwQ2xpZW50Q2hhbm5lbDo6c2VuZE1lc3NhZ2UiKTsKIH0KIAotCi12b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSgKLSAgICBjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgewotICAodm9pZCkgY29iOwotICAodm9pZCkgbWVzc2FnZTsKK3ZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlKGNvbnN0IFZvaWRDYWxsYmFjayYgY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSkgeworICAodm9pZCljb2I7CisgICh2b2lkKW1lc3NhZ2U7CiAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKLQkJCSAgICJVbmV4cGVjdGVkIGNhbGwgdG8gVEV2aHR0cENsaWVudENoYW5uZWw6OnJlY3ZNZXNzYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjYWxsIHRvIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZWN2TWVzc2FnZSIpOwogfQogCi0KIHZvaWQgVEV2aHR0cENsaWVudENoYW5uZWw6OmZpbmlzaChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgeworICBhc3NlcnQoIWNvbXBsZXRpb25RdWV1ZV8uZW1wdHkoKSk7CisgIENvbXBsZXRpb24gY29tcGxldGlvbiA9IGNvbXBsZXRpb25RdWV1ZV8uZnJvbnQoKTsKKyAgY29tcGxldGlvblF1ZXVlXy5wb3AoKTsKICAgaWYgKHJlcSA9PSBOVUxMKSB7Ci0gIHRyeSB7Ci0gICAgY29iXygpOwotICB9IGNhdGNoKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIGUpIHsKLSAgICBpZihlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSkKLSAgICAgIHRocm93IFRFeGNlcHRpb24oImNvbm5lY3QgZmFpbGVkIik7Ci0gICAgZWxzZQotICAgICAgdGhyb3c7Ci0gIH0KLSAgcmV0dXJuOworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgaWYgKGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKQorICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJjb25uZWN0IGZhaWxlZCIpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOwogICB9IGVsc2UgaWYgKHJlcS0+cmVzcG9uc2VfY29kZSAhPSAyMDApIHsKLSAgdHJ5IHsKLSAgICBjb2JfKCk7Ci0gIH0gY2F0Y2goY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgewotICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICAgIHNzIDw8ICJzZXJ2ZXIgcmV0dXJuZWQgY29kZSAiIDw8IHJlcS0+cmVzcG9uc2VfY29kZTsKLQlpZihyZXEtPnJlc3BvbnNlX2NvZGVfbGluZSkKLQkJc3MgPDwgIjogIiA8PCByZXEtPnJlc3BvbnNlX2NvZGVfbGluZTsKLSAgICBpZihlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSkKLSAgICAgIHRocm93IFRFeGNlcHRpb24oc3Muc3RyKCkpOwotICAgIGVsc2UKLSAgICAgIHRocm93OworICAgIHRyeSB7CisgICAgICBjb21wbGV0aW9uLmZpcnN0KCk7CisgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgeworICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICBzcyA8PCAic2VydmVyIHJldHVybmVkIGNvZGUgIiA8PCByZXEtPnJlc3BvbnNlX2NvZGU7CisgICAgICBpZiAocmVxLT5yZXNwb25zZV9jb2RlX2xpbmUpCisgICAgICAgIHNzIDw8ICI6ICIgPDwgcmVxLT5yZXNwb25zZV9jb2RlX2xpbmU7CisgICAgICBpZiAoZS5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpCisgICAgICAgIHRocm93IFRFeGNlcHRpb24oc3Muc3RyKCkpOworICAgICAgZWxzZQorICAgICAgICB0aHJvdzsKKyAgICB9CisgICAgcmV0dXJuOwogICB9Ci0gIHJldHVybjsKLSAgfQotICByZWN2QnVmXy0+cmVzZXRCdWZmZXIoCi0gICAgICBFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwKLSAgICAgIEVWQlVGRkVSX0xFTkdUSChyZXEtPmlucHV0X2J1ZmZlcikpOwotICBjb2JfKCk7CisgIGNvbXBsZXRpb24uc2Vjb25kLT5yZXNldEJ1ZmZlcihFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihFVkJVRkZFUl9MRU5HVEgocmVxLT5pbnB1dF9idWZmZXIpKSk7CisgIGNvbXBsZXRpb24uZmlyc3QoKTsKICAgcmV0dXJuOwogfQogCi0KIC8qIHN0YXRpYyAqLyB2b2lkIFRFdmh0dHBDbGllbnRDaGFubmVsOjpyZXNwb25zZShzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSwgdm9pZCogYXJnKSB7CiAgIFRFdmh0dHBDbGllbnRDaGFubmVsKiBzZWxmID0gKFRFdmh0dHBDbGllbnRDaGFubmVsKilhcmc7CiAgIHRyeSB7CiAgICAgc2VsZi0+ZmluaXNoKHJlcSk7Ci0gIH0gY2F0Y2goc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKICAgICAvLyBkb24ndCBwcm9wYWdhdGUgYSBDKysgZXhjZXB0aW9uIGluIEMgY29kZSAoZS5nLiBsaWJldmVudCkKLSAgICBzdGQ6OmNlcnIgPDwgIlRFdmh0dHBDbGllbnRDaGFubmVsOjpyZXNwb25zZSBleGNlcHRpb24gdGhyb3duIChpZ25vcmVkKTogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJURXZodHRwQ2xpZW50Q2hhbm5lbDo6cmVzcG9uc2UgZXhjZXB0aW9uIHRocm93biAoaWdub3JlZCk6ICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICB9CiB9Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKaW5kZXggZDQ5N2VkYi4uYTMyMWY0MSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmgKQEAgLTIwLDU3ICsyMCw2OSBAQAogI2lmbmRlZiBfVEhSSUZUX1RFVkhUVFBfQ0xJRU5UX0NIQU5ORUxfSF8KICNkZWZpbmUgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfIDEKIAorI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlICJUQXN5bmNDaGFubmVsLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KIAogc3RydWN0IGV2ZW50X2Jhc2U7CitzdHJ1Y3QgZXZkbnNfYmFzZTsKIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbjsKIHN0cnVjdCBldmh0dHBfcmVxdWVzdDsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIGNsYXNzIFRNZW1vcnlCdWZmZXI7Ci19fX0KK30KK30KK30KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIGNsYXNzIFRFdmh0dHBDbGllbnRDaGFubmVsIDogcHVibGljIFRBc3luY0NoYW5uZWwgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdXNpbmcgVEFzeW5jQ2hhbm5lbDo6Vm9pZENhbGxiYWNrOwogCi0gIFRFdmh0dHBDbGllbnRDaGFubmVsKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYik7CisgIFRFdmh0dHBDbGllbnRDaGFubmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZG5zX2Jhc2UgKmRuc2Jhc2UgPSAwKTsKICAgflRFdmh0dHBDbGllbnRDaGFubmVsKCk7CiAKICAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWYpOwogCi0gIHZpcnR1YWwgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7Ci0gIHZpcnR1YWwgdm9pZCByZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlciogbWVzc2FnZSk7CisgIHZpcnR1YWwgdm9pZCBzZW5kTWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIG1lc3NhZ2UpOworICB2aXJ0dWFsIHZvaWQgcmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyKiBtZXNzYWdlKTsKIAogICB2b2lkIGZpbmlzaChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7CiAKLSAgLy9YWFgKKyAgLy8gWFhYCiAgIHZpcnR1YWwgYm9vbCBnb29kKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogICB2aXJ0dWFsIGJvb2wgZXJyb3IoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICB2aXJ0dWFsIGJvb2wgdGltZWRPdXQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHN0YXRpYyB2b2lkIHJlc3BvbnNlKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBhcmcpOwogCiAgIHN0ZDo6c3RyaW5nIGhvc3RfOwogICBzdGQ6OnN0cmluZyBwYXRoXzsKLSAgVm9pZENhbGxiYWNrIGNvYl87Ci0gIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqIHJlY3ZCdWZfOworICB0eXBlZGVmIHN0ZDo6cGFpcjxWb2lkQ2FsbGJhY2ssIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXIqPiBDb21wbGV0aW9uOworICB0eXBlZGVmIHN0ZDo6cXVldWU8Q29tcGxldGlvbj4gQ29tcGxldGlvblF1ZXVlOworICBDb21wbGV0aW9uUXVldWUgY29tcGxldGlvblF1ZXVlXzsKICAgc3RydWN0IGV2aHR0cF9jb25uZWN0aW9uKiBjb25uXzsKLQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX0NMSUVOVF9DSEFOTkVMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKaW5kZXggNzM1MTZkYi4uYmRjMzI2NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcApAQCAtMTcsMTEgKzE3LDEzIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiVEV2aHR0cFNlcnZlci5oIgotI2luY2x1ZGUgIlRBc3luY0J1ZmZlclByb2Nlc3Nvci5oIgorI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8ZXZodHRwLmg+Ci0KKyNpbmNsdWRlIDxldmVudDIvYnVmZmVyLmg+CisjaW5jbHVkZSA8ZXZlbnQyL2J1ZmZlcl9jb21wYXQuaD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogI2lmbmRlZiBIVFRQX0lOVEVSTkFMIC8vIGxpYmV2ZW50IDwgMgpAQCAtMjksMzEgKzMxLDI2IEBACiAjZW5kaWYKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgewotCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKIAogc3RydWN0IFRFdmh0dHBTZXJ2ZXI6OlJlcXVlc3RDb250ZXh0IHsKICAgc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXE7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGlidWY7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG9idWY7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb2J1ZjsKIAogICBSZXF1ZXN0Q29udGV4dChzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSk7CiB9OwogCitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvcikKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksIGViXyhOVUxMKSwgZWhfKE5VTEwpIHsKK30KIAotVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvcikKLSAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvcikKLSAgLCBlYl8oTlVMTCkKLSAgLCBlaF8oTlVMTCkKLXt9Ci0KLQotVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpCi0gIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpCi0gICwgZWJfKE5VTEwpCi0gICwgZWhfKE5VTEwpCi17CitURXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLCBlYl8oTlVMTCksIGVoXyhOVUxMKSB7CiAgIC8vIENyZWF0ZSBldmVudF9iYXNlIGFuZCBldmh0dHAuCiAgIGViXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CiAgIGlmIChlYl8gPT0gTlVMTCkgewpAQCAtNzAsNyArNjcsNyBAQAogICBpZiAocmV0IDwgMCkgewogICAgIGV2aHR0cF9mcmVlKGVoXyk7CiAgICAgZXZlbnRfYmFzZV9mcmVlKGViXyk7Ci0JdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2JpbmRfc29ja2V0IGZhaWxlZCIpOworICAgIHRocm93IFRFeGNlcHRpb24oImV2aHR0cF9iaW5kX3NvY2tldCBmYWlsZWQiKTsKICAgfQogCiAgIC8vIFJlZ2lzdGVyIGEgaGFuZGxlci4gIElmIHlvdSB1c2UgdGhlIG90aGVyIGNvbnN0cnVjdG9yLApAQCAtNzksNyArNzYsNiBAQAogICBldmh0dHBfc2V0X2NiKGVoXywgIi8iLCByZXF1ZXN0LCAodm9pZCopdGhpcyk7CiB9CiAKLQogVEV2aHR0cFNlcnZlcjo6flRFdmh0dHBTZXJ2ZXIoKSB7CiAgIGlmIChlaF8gIT0gTlVMTCkgewogICAgIGV2aHR0cF9mcmVlKGVoXyk7CkBAIC04OSw3ICs4NSw2IEBACiAgIH0KIH0KIAotCiBpbnQgVEV2aHR0cFNlcnZlcjo6c2VydmUoKSB7CiAgIGlmIChlYl8gPT0gTlVMTCkgewogICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY2FsbCB0byBURXZodHRwU2VydmVyOjpzZXJ2ZSIpOwpAQCAtOTcsMzggKzkyLDM0IEBACiAgIHJldHVybiBldmVudF9iYXNlX2Rpc3BhdGNoKGViXyk7CiB9CiAKLQotVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQ6OlJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKSA6IHJlcShyZXEpCi0gICwgaWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcihFVkJVRkZFUl9EQVRBKHJlcS0+aW5wdXRfYnVmZmVyKSwgRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpCi0gICwgb2J1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKQote30KLQorVEV2aHR0cFNlcnZlcjo6UmVxdWVzdENvbnRleHQ6OlJlcXVlc3RDb250ZXh0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKQorICA6IHJlcShyZXEpLAorICAgIGlidWYobmV3IFRNZW1vcnlCdWZmZXIoRVZCVUZGRVJfREFUQShyZXEtPmlucHV0X2J1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRVZCVUZGRVJfTEVOR1RIKHJlcS0+aW5wdXRfYnVmZmVyKSkpKSwKKyAgICBvYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpIHsKK30KIAogdm9pZCBURXZodHRwU2VydmVyOjpyZXF1ZXN0KHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxLCB2b2lkKiBzZWxmKSB7CiAgIHRyeSB7CiAgICAgc3RhdGljX2Nhc3Q8VEV2aHR0cFNlcnZlcio+KHNlbGYpLT5wcm9jZXNzKHJlcSk7Ci0gIH0gY2F0Y2goc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKICAgICBldmh0dHBfc2VuZF9yZXBseShyZXEsIEhUVFBfSU5URVJOQUwsIGUud2hhdCgpLCAwKTsKICAgfQogfQogCi0KIHZvaWQgVEV2aHR0cFNlcnZlcjo6cHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgewogICBSZXF1ZXN0Q29udGV4dCogY3R4ID0gbmV3IFJlcXVlc3RDb250ZXh0KHJlcSk7Ci0gIHJldHVybiBwcm9jZXNzb3JfLT5wcm9jZXNzKAotICAgICAgc3RkOjp0cjE6OmJpbmQoCi0gICAgICAgICZURXZodHRwU2VydmVyOjpjb21wbGV0ZSwKLSAgICAgICAgdGhpcywKLSAgICAgICAgY3R4LAotICAgICAgICBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSksCi0gICAgICBjdHgtPmlidWYsCi0gICAgICBjdHgtPm9idWYpOworICByZXR1cm4gcHJvY2Vzc29yXy0+cHJvY2VzcyhzdGQ6OmJpbmQoJlRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vYnVmKTsKIH0KIAotCiB2b2lkIFRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2VzcykgewotICAodm9pZCkgc3VjY2VzczsKLSAgc3RkOjphdXRvX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7CisgICh2b2lkKXN1Y2Nlc3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7CiAKICAgaW50IGNvZGUgPSBzdWNjZXNzID8gMjAwIDogNDAwOwogICBjb25zdCBjaGFyKiByZWFzb24gPSBzdWNjZXNzID8gIk9LIiA6ICJCYWQgUmVxdWVzdCI7CkBAIC0xNDIsNyArMTMzLDcgQEAKICAgc3RydWN0IGV2YnVmZmVyKiBidWYgPSBldmJ1ZmZlcl9uZXcoKTsKICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CiAgICAgLy8gVE9ETzogTG9nIGFuIGVycm9yLgotICAgICAgc3RkOjpjZXJyIDw8ICJldmJ1ZmZlcl9uZXcgZmFpbGVkICIgPDwgX19GSUxFX18gPDwgIjoiIDw8ICBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJldmJ1ZmZlcl9uZXcgZmFpbGVkICIgPDwgX19GSUxFX18gPDwgIjoiIDw8IF9fTElORV9fIDw8IHN0ZDo6ZW5kbDsKICAgfSBlbHNlIHsKICAgICB1aW50OF90KiBvYnVmOwogICAgIHVpbnQzMl90IHN6OwpAQCAtMTUwLDcgKzE0MSw4IEBACiAgICAgaW50IHJldCA9IGV2YnVmZmVyX2FkZChidWYsIG9idWYsIHN6KTsKICAgICBpZiAocmV0ICE9IDApIHsKICAgICAgIC8vIFRPRE86IExvZyBhbiBlcnJvci4KLSAgICAgIHN0ZDo6Y2VyciA8PCAiZXZodHRwX2FkZCBmYWlsZWQgd2l0aCAiIDw8IHJldCA8PCAiICIgPDwgX19GSUxFX18gPDwgIjoiIDw8ICBfX0xJTkVfXyA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNlcnIgPDwgImV2aHR0cF9hZGQgZmFpbGVkIHdpdGggIiA8PCByZXQgPDwgIiAiIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBfX0xJTkVfXworICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAgIH0KIApAQCAtMTYwLDEwICsxNTIsOSBAQAogICB9CiB9CiAKLQogc3RydWN0IGV2ZW50X2Jhc2UqIFRFdmh0dHBTZXJ2ZXI6OmdldEV2ZW50QmFzZSgpIHsKICAgcmV0dXJuIGViXzsKIH0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmFzeW5jCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKaW5kZXggZWRjNmZmYi4uYzViZjNiNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCkBAIC0yMCwxOCArMjAsMjAgQEAKICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogc3RydWN0IGV2ZW50X2Jhc2U7CiBzdHJ1Y3QgZXZodHRwOwogc3RydWN0IGV2aHR0cF9yZXF1ZXN0OwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKIAogY2xhc3MgVEFzeW5jQnVmZmVyUHJvY2Vzc29yOwogCiBjbGFzcyBURXZodHRwU2VydmVyIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBDcmVhdGUgYSBURXZodHRwU2VydmVyIGZvciB1c2Ugd2l0aCBhbiBleHRlcm5hbCBldmh0dHAgaW5zdGFuY2UuCiAgICAqIE11c3QgYmUgbWFudWFsbHkgaW5zdGFsbGVkIHdpdGggZXZodHRwX3NldF9jYiwgdXNpbmcKQEAgLTM5LDE0ICs0MSwxNCBAQAogICAgKiBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIgYXMgdGhlIGV4dHJhIGFyZy4KICAgICogRG8gbm90IGNhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlci4KICAgICovCi0gIFRFdmh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3IpOworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcik7CiAKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRFdmh0dHBTZXJ2ZXIgd2l0aCBhbiBlbWJlZGRlZCBldmVudF9iYXNlIGFuZCBldmh0dHAsCiAgICAqIGxpc3RlbmluZyBvbiBwb3J0IGFuZCByZXNwb25kaW5nIG9uIHRoZSBlbmRwb2ludCAiLyIuCiAgICAqIENhbGwgInNlcnZlIiBvbiB0aGlzIHNlcnZlciB0byBzZXJ2ZSBmb3JldmVyLgogICAgKi8KLSAgVEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpOworICBURXZodHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvciwgaW50IHBvcnQpOwogCiAgIH5URXZodHRwU2VydmVyKCk7CiAKQEAgLTU1LDE3ICs1NywxOCBAQAogCiAgIHN0cnVjdCBldmVudF9iYXNlKiBnZXRFdmVudEJhc2UoKTsKIAotIHByaXZhdGU6Citwcml2YXRlOgogICBzdHJ1Y3QgUmVxdWVzdENvbnRleHQ7CiAKICAgdm9pZCBwcm9jZXNzKHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxKTsKICAgdm9pZCBjb21wbGV0ZShSZXF1ZXN0Q29udGV4dCogY3R4LCBib29sIHN1Y2Nlc3MpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViXzsKICAgc3RydWN0IGV2aHR0cCogZWhfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMThmZS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJNb25pdG9yLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBib29zdCB0aHJlYWQgbGlicmFyeQotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE1vbml0b3I6OkltcGwgOiBwdWJsaWMgYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgewotCi0gcHVibGljOgotCi0gIEltcGwoKQotICAgICA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwKLSAgICAgICBtdXRleF8oTlVMTCkgewotICAgIGluaXQob3duZWRNdXRleF8uZ2V0KCkpOwotICB9Ci0KLSAgSW1wbChNdXRleCogbXV0ZXgpCi0gICAgIDogbXV0ZXhfKE5VTEwpIHsKLSAgICBpbml0KG11dGV4KTsKLSAgfQotCi0gIEltcGwoTW9uaXRvciogbW9uaXRvcikKLSAgICAgOiBtdXRleF8oTlVMTCkgewotICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7Ci0gIH0KLQotICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9Ci0gIHZvaWQgbG9jaygpIHsgbXV0ZXgoKS5sb2NrKCk7IH0KLSAgdm9pZCB1bmxvY2soKSB7IG11dGV4KCkudW5sb2NrKCk7IH0KLQotICAvKioKLSAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5Ci0gICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KLSAgICoKLSAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgotICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotICAgKi8KLSAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgewotICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOwotICAgIGlmIChyZXN1bHQgPT0gRVRJTUVET1VUKSB7Ci0gICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwotICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oCi0gICAgICAgICJNb25pdG9yOjp3YWl0KCkgZmFpbGVkIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KLSAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgotICAgKgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIHsKLSAgICBpZiAodGltZW91dF9tcyA9PSAwTEwpIHsKLSAgICAgIHJldHVybiB3YWl0Rm9yZXZlcigpOwotICAgIH0KLQotICAgIGFzc2VydChtdXRleF8pOwotCWJvb3N0Ojp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vc3Q6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotCWJvb3N0Ojp0aW1lZF9tdXRleDo6c2NvcGVkX2xvY2sgbG9jaygqbXV0ZXhJbXBsLCBib29zdDo6YWRvcHRfbG9jayk7Ci0JaW50IHJlcyA9IHRpbWVkX3dhaXQobG9jaywgYm9vc3Q6OmdldF9zeXN0ZW1fdGltZSgpK2Jvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHModGltZW91dF9tcykpID8gMCA6IEVUSU1FRE9VVDsKLQlsb2NrLnJlbGVhc2UoKTsKLQlyZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXNwZWMuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBFVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KLSAgICovCi0gIGludCB3YWl0Rm9yVGltZShjb25zdCB0aW1lc3BlYyogYWJzdGltZSkgewotICAgIGFzc2VydChtdXRleF8pOwotICAgIGJvb3N0Ojp0aW1lZF9tdXRleCogbXV0ZXhJbXBsID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Ym9vc3Q6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKLSAgICBhc3NlcnQobXV0ZXhJbXBsKTsKLQotICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50dGltZTsKLSAgICBVdGlsOjp0b1RpbWVzcGVjKGN1cnJlbnR0aW1lLCBVdGlsOjpjdXJyZW50VGltZSgpKTsKLQotCWxvbmcgdHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjIC0gY3VycmVudHRpbWUudHZfc2VjKTsKLQlsb25nIHR2X25zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9uc2VjIC0gY3VycmVudHRpbWUudHZfbnNlYyk7Ci0JaWYodHZfc2VjIDwgMCkKLQkJdHZfc2VjID0gMDsKLQlpZih0dl9uc2VjIDwgMCkKLQkJdHZfbnNlYyA9IDA7Ci0KLQlib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotCWludCByZXMgPSB0aW1lZF93YWl0KGxvY2ssIGJvb3N0OjpnZXRfc3lzdGVtX3RpbWUoKSArCi0JCWJvb3N0Ojpwb3NpeF90aW1lOjpzZWNvbmRzKHR2X3NlYykgKwotCQlib29zdDo6cG9zaXhfdGltZTo6bWljcm9zZWNvbmRzKHR2X25zZWMgLyAxMDAwKQotCQkpID8gMCA6IEVUSU1FRE9VVDsKLQlsb2NrLnJlbGVhc2UoKTsKLQlyZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICovCi0gIGludCB3YWl0Rm9yZXZlcigpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBib29zdDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGJvb3N0Ojp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLQlib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotCSgoYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkqKXRoaXMpLT53YWl0KGxvY2spOwotCWxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICB2b2lkIG5vdGlmeSgpIHsKLQkgIG5vdGlmeV9vbmUoKTsKLSAgfQotCi0gIHZvaWQgbm90aWZ5QWxsKCkgewotCSAgbm90aWZ5X2FsbCgpOwotICB9Ci0KLSBwcml2YXRlOgotCi0gIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKLSAgICBtdXRleF8gPSBtdXRleDsKLSAgfQotCi0gIGJvb3N0OjpzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKLSAgTXV0ZXgqIG11dGV4XzsKLX07Ci0KLU1vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHt9Ci1Nb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHt9Ci0KLU1vbml0b3I6On5Nb25pdG9yKCkgeyBkZWxldGUgaW1wbF87IH0KLQotTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5tdXRleCgpOyB9Ci0KLXZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7IH0KLQotdm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeyBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXQodGltZW91dCk7IH0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWVzcGVjKiBhYnN0aW1lKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JldmVyKCkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yZXZlcigpOwotfQotCi12b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnkoKTsgfQotCi12b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnlBbGwoKTsgfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjVjMzcuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0jaW5jbHVkZSAiTXV0ZXguaCIKLSNpbmNsdWRlICJVdGlsLmgiCi0KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL211dGV4LmhwcD4KLSNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIGJvb3N0IGludGVycHJvY2VzcyBtdXRleAotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE11dGV4OjppbXBsIDogcHVibGljIGJvb3N0Ojp0aW1lZF9tdXRleCB7Ci19OwotCi1NdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoKSkge30KLQotdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF8uZ2V0KCk7IH0KLQotdm9pZCBNdXRleDo6bG9jaygpIGNvbnN0IHsgaW1wbF8tPmxvY2soKTsgfQotCi1ib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRyeV9sb2NrKCk7IH0KLQotYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT50aW1lZF9sb2NrKGJvb3N0OjpnZXRfc3lzdGVtX3RpbWUoKStib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKG1zKSk7IH0KLQotdm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeyBpbXBsXy0+dW5sb2NrKCk7IH0KLQotdm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKLX0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDczZDliLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotI2luY2x1ZGUgIkJvb3N0VGhyZWFkRmFjdG9yeS5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OndlYWtfcHRyOwotCi0vKioKLSAqIFRoZSBib29zdCB0aHJlYWQgY2xhc3MuCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLwotY2xhc3MgQm9vc3RUaHJlYWQ6IHB1YmxpYyBUaHJlYWQgewotIHB1YmxpYzoKLQotICBlbnVtIFNUQVRFIHsKLSAgICB1bmluaXRpYWxpemVkLAotICAgIHN0YXJ0aW5nLAotICAgIHN0YXJ0ZWQsCi0gICAgc3RvcHBpbmcsCi0gICAgc3RvcHBlZAotICB9OwotCi0gIHN0YXRpYyB2b2lkKiB0aHJlYWRNYWluKHZvaWQqIGFyZyk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OmF1dG9fcHRyPGJvb3N0Ojp0aHJlYWQ+IHRocmVhZF87Ci0gIFNUQVRFIHN0YXRlXzsKLSAgd2Vha19wdHI8Qm9vc3RUaHJlYWQ+IHNlbGZfOwotICBib29sIGRldGFjaGVkXzsKLQotIHB1YmxpYzoKLQotICBCb29zdFRocmVhZChib29sIGRldGFjaGVkLCBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgOgotICAgIHN0YXRlXyh1bmluaXRpYWxpemVkKSwKLSAgICBkZXRhY2hlZF8oZGV0YWNoZWQpIHsKLSAgICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOwotICAgIH0KLQotICB+Qm9vc3RUaHJlYWQoKSB7Ci0gICAgaWYoIWRldGFjaGVkXykgewotICAgICAgdHJ5IHsKLSAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCguLi4pIHsKLSAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAKLSAgLy8gQ3JlYXRlIHJlZmVyZW5jZQotICAgIHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KCk7Ci0gICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7Ci0KLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKLQotICAgIHRocmVhZF8gPSBzdGQ6OmF1dG9fcHRyPGJvb3N0Ojp0aHJlYWQ+KG5ldyBib29zdDo6dGhyZWFkKGJvb3N0OjpiaW5kKHRocmVhZE1haW4sICh2b2lkKilzZWxmUmVmKSkpOwotCi0gICAgaWYoZGV0YWNoZWRfKQotICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7Ci0gIH0KLQotICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICB9Ci0gIH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7Ci0gICAgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IGJvb3N0Ojp0aHJlYWQ6OmlkKCk7Ci0gIH0KLQotICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQotCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KLQotICB2b2lkIHdlYWtSZWYoc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gc2VsZikgewotICAgIGFzc2VydChzZWxmLmdldCgpID09IHRoaXMpOwotICAgIHNlbGZfID0gd2Vha19wdHI8Qm9vc3RUaHJlYWQ+KHNlbGYpOwotICB9Ci19OwotCi12b2lkKiBCb29zdFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gdGhyZWFkID0gKihzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiopYXJnOwotICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgdGhyZWFkLT5zdGF0ZV8gPSBzdGFydGVkOwotICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOwotCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKLSAgfQotICByZXR1cm4gKHZvaWQqKTA7Ci19Ci0KLS8qKgotICogUE9TSVggVGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KLSAqLwotY2xhc3MgQm9vc3RUaHJlYWRGYWN0b3J5OjpJbXBsIHsKLQotIHByaXZhdGU6Ci0gIGJvb2wgZGV0YWNoZWRfOwotCi0gcHVibGljOgotCi0gIEltcGwoYm9vbCBkZXRhY2hlZCkgOgotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkge30KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBQT1NJWCB0aHJlYWQgdG8gcnVuIHRoZSBydW5uYWJsZSBvYmplY3QKLSAgICoKLSAgICogQHBhcmFtIHJ1bm5hYmxlIEEgcnVubmFibGUgb2JqZWN0Ci0gICAqLwotICBzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gICAgc2hhcmVkX3B0cjxCb29zdFRocmVhZD4gcmVzdWx0ID0gc2hhcmVkX3B0cjxCb29zdFRocmVhZD4obmV3IEJvb3N0VGhyZWFkKGRldGFjaGVkXywgcnVubmFibGUpKTsKLSAgICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKLSAgICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0IHsgcmV0dXJuIGRldGFjaGVkXzsgfQotCi0gIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCB2YWx1ZSkgeyBkZXRhY2hlZF8gPSB2YWx1ZTsgfQotCi0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7Ci0gIH0KLX07Ci0KLUJvb3N0VGhyZWFkRmFjdG9yeTo6Qm9vc3RUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDoKLSAgaW1wbF8obmV3IEJvb3N0VGhyZWFkRmFjdG9yeTo6SW1wbChkZXRhY2hlZCkpIHt9Ci0KLXNoYXJlZF9wdHI8VGhyZWFkPiBCb29zdFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7IH0KLQotYm9vbCBCb29zdFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOyB9Ci0KLXZvaWQgQm9vc3RUaHJlYWRGYWN0b3J5OjpzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGltcGxfLT5zZXREZXRhY2hlZCh2YWx1ZSk7IH0KLQotVGhyZWFkOjppZF90IEJvb3N0VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2NjcwNS4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9CT09TVFRIUkVBREZBQ1RPUllfSF8KLSNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9CT09TVFRIUkVBREZBQ1RPUllfSF8gMQotCi0jaW5jbHVkZSAiVGhyZWFkLmgiCi0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHBvc2l4IHRocmVhZHMKLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBCb29zdFRocmVhZEZhY3RvcnkgOiBwdWJsaWMgVGhyZWFkRmFjdG9yeSB7Ci0KLSBwdWJsaWM6Ci0KLSAgLyoqCi0gICAqIEJvb3N0IHRocmVhZCBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCi0gICAqIHZpYSBib29zdDo6c2hhcmVkX3B0ciBhbmQgYm9vc3Q6OndlYWtfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kCi0gICAqIHRoZSBSdW5uYWJsZSB0YXNrcyB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgotICAgKgotICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBib29zdCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplLiBBIGRldGFjaGFibGUgdGhyZWFkIGlzIG5vdAotICAgKiBqb2luYWJsZS4KLSAgICoKLSAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCi0gICAqLwotCi0gIEJvb3N0VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkPXRydWUpOwotCi0gIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKLQotICAvKioKLSAgICogU2V0cyBkZXRhY2hlZCBtb2RlIG9mIHRocmVhZHMKLSAgICovCi0gIHZpcnR1YWwgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKTsKLQotICAvKioKLSAgICogR2V0cyBjdXJyZW50IGRldGFjaGVkIG1vZGUKLSAgICovCi0gIHZpcnR1YWwgYm9vbCBpc0RldGFjaGVkKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gIGNsYXNzIEltcGw7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEltcGw+IGltcGxfOwotfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oCmluZGV4IGM2MmYxMTYuLjY0MzhmZGEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgKQEAgLTIzLDcgKzIzLDkgQEAKICNpbmNsdWRlIDxleGNlcHRpb24+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogY2xhc3MgTm9TdWNoVGFza0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7fTsKIApAQCAtMzksMjYgKzQxLDI0IEBACiAKIGNsYXNzIFRpbWVkT3V0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKIHB1YmxpYzoKLSAgVGltZWRPdXRFeGNlcHRpb24oKTpURXhjZXB0aW9uKCJUaW1lZE91dEV4Y2VwdGlvbiIpe307Ci0gIFRpbWVkT3V0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlICkgOgotICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KKyAgVGltZWRPdXRFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRpbWVkT3V0RXhjZXB0aW9uIil7fTsKKyAgVGltZWRPdXRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQogfTsKIAogY2xhc3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbiB7CiBwdWJsaWM6Ci0gIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKTpURXhjZXB0aW9uKCJUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIil7fTsKLSAgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSApIDoKLSAgICBURXhjZXB0aW9uKG1lc3NhZ2UpIHt9CisgIFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24oKSA6IFRFeGNlcHRpb24oIlRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24iKXt9OworICBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IFRFeGNlcHRpb24obWVzc2FnZSkge30KIH07CiAKIGNsYXNzIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKIHB1YmxpYzoKLSAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigpIHt9CisgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCkge30KIAotICAgIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgICAgIFRFeGNlcHRpb24obWVzc2FnZSkge30KKyAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDogVEV4Y2VwdGlvbihtZXNzYWdlKSB7fQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9FWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKaW5kZXggZjIxNjJkNi4uOGFkMTc2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmgKQEAgLTIwLDEwICsyMCwxMiBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQogCi0jaW5jbHVkZSA8dHIxL2Z1bmN0aW9uYWw+Ci0jaW5jbHVkZSAidGhyaWZ0L2xpYi9jcHAvY29uY3VycmVuY3kvVGhyZWFkLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogQ29udmVuaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBSdW5uYWJsZSB0aGF0IHdpbGwgZXhlY3V0ZSBhcmJpdHJhcnkgY2FsbGJhY2tzLgpAQCAtNDIsNDcgKzQ0LDQ5IEBACiAgKiAgQSogYSA9IG5ldyBBKCk7CiAgKiAgLy8gVG8gY3JlYXRlIGEgdGhyZWFkIHRoYXQgZXhlY3V0ZXMgYS5mb28oKSBldmVyeSAxMDAgbWlsbGlzZWNvbmRzOgogICogIGZhY3RvcnktPm5ld1RocmVhZChGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKAotICogICAgc3RkOjp0cjE6OmJpbmQoJkE6OmZvbywgYSksIDEwMCkpLT5zdGFydCgpOworICogICAgc3RkOjpiaW5kKCZBOjpmb28sIGEpLCAxMDApKS0+c3RhcnQoKTsKICAqCiAgKi8KIAogY2xhc3MgRnVuY3Rpb25SdW5uZXIgOiBwdWJsaWMgUnVubmFibGUgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLy8gVGhpcyBpcyB0aGUgdHlwZSBvZiBjYWxsYmFjayAncHRocmVhZF9jcmVhdGUoKScgZXhwZWN0cy4KLSAgdHlwZWRlZiB2b2lkKiAoKlB0aHJlYWRGdW5jUHRyKSh2b2lkICphcmcpOworICB0eXBlZGVmIHZvaWQqICgqUHRocmVhZEZ1bmNQdHIpKHZvaWQqIGFyZyk7CiAgIC8vIFRoaXMgYSBmdWxseS1nZW5lcmljIHZvaWQodm9pZCkgY2FsbGJhY2sgZm9yIGN1c3RvbSBiaW5kaW5ncy4KLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkRnVuYzsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7CiAKLSAgdHlwZWRlZiBzdGQ6OnRyMTo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gQm9vbEZ1bmM7CiAKICAgLyoqCiAgICAqIFN5bnRhY3RpYyBzdWdhciB0byBtYWtlIGl0IGVhc2llciB0byBjcmVhdGUgbmV3IEZ1bmN0aW9uUnVubmVyCiAgICAqIG9iamVjdHMgd3JhcHBlZCBpbiBzaGFyZWRfcHRyLgogICAgKi8KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KG5ldyBGdW5jdGlvblJ1bm5lcihjb2IpKTsKICAgfQogCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4gY3JlYXRlKFB0aHJlYWRGdW5jUHRyIGZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFyZykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOwogICB9CiAKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIHB0aHJlYWRfZnVuY193cmFwcGVyKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykgeworICAgIC8vIGRpc2NhcmQgcmV0dXJuIHZhbHVlCisgICAgZnVuYyhhcmcpOworICB9CiAKK3B1YmxpYzoKICAgLyoqCiAgICAqIEdpdmVuIGEgJ3B0aHJlYWRfY3JlYXRlJyBzdHlsZSBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsCiAgICAqIGV4ZWN1dGUgdGhlIGdpdmVuIGNhbGxiYWNrLiAgTm90ZSB0aGF0IHRoZSAndm9pZConIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgogICAgKi8KICAgRnVuY3Rpb25SdW5uZXIoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKQotICAgOiBmdW5jXyhzdGQ6OnRyMTo6YmluZChmdW5jLCBhcmcpKSwgcmVwRnVuY18oMCkKLSAgeyB9CisgICAgOiBmdW5jXyhzdGQ6OmJpbmQocHRocmVhZF9mdW5jX3dyYXBwZXIsIGZ1bmMsIGFyZykpLCBpbnRlcnZhbE1zXygtMSkge30KIAogICAvKioKICAgICogR2l2ZW4gYSBnZW5lcmljIGNhbGxiYWNrLCB0aGlzIEZ1bmN0aW9uUnVubmVyIHdpbGwgZXhlY3V0ZSBpdC4KICAgICovCi0gIEZ1bmN0aW9uUnVubmVyKGNvbnN0IFZvaWRGdW5jJiBjb2IpCi0gICA6IGZ1bmNfKGNvYiksIHJlcEZ1bmNfKDApCi0gIHsgfQorICBGdW5jdGlvblJ1bm5lcihjb25zdCBWb2lkRnVuYyYgY29iKSA6IGZ1bmNfKGNvYiksIGludGVydmFsTXNfKC0xKSB7fQogCiAgIC8qKgogICAgKiBHaXZlbiBhIGJvb2wgZm9vKC4uLikgdHlwZSBjYWxsYmFjaywgRnVuY3Rpb25SdW5uZXIgd2lsbCBleGVjdXRlCkBAIC05MCwyNiArOTQsMjUgQEAKICAgICogdW50aWwgaXQgcmV0dXJucyBmYWxzZS4gTm90ZSB0aGF0IHRoZSBhY3R1YWwgaW50ZXJ2YWwgYmV0d2VlbiBjYWxscyB3aWxsCiAgICAqIGJlIGludGVydmFsTXMgcGx1cyBleGVjdXRpb24gdGltZSBvZiB0aGUgY2FsbGJhY2suCiAgICAqLwotICBGdW5jdGlvblJ1bm5lcihjb25zdCBCb29sRnVuYyYgY29iLCBpbnQgaW50ZXJ2YWxNcykKLSAgIDogZnVuY18oMCksIHJlcEZ1bmNfKGNvYiksIGludGVydmFsTXNfKGludGVydmFsTXMpCi0gIHsgfQorICBGdW5jdGlvblJ1bm5lcihjb25zdCBCb29sRnVuYyYgY29iLCBpbnQgaW50ZXJ2YWxNcykgOiByZXBGdW5jXyhjb2IpLCBpbnRlcnZhbE1zXyhpbnRlcnZhbE1zKSB7fQogCiAgIHZvaWQgcnVuKCkgewogICAgIGlmIChyZXBGdW5jXykgewotICAgICAgd2hpbGUocmVwRnVuY18oKSkgewotICAgICAgICB1c2xlZXAoaW50ZXJ2YWxNc18qMTAwMCk7CisgICAgICB3aGlsZSAocmVwRnVuY18oKSkgeworICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhpbnRlcnZhbE1zXyAqIDEwMDApOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBmdW5jXygpOwogICAgIH0KICAgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIFZvaWRGdW5jIGZ1bmNfOwogICBCb29sRnVuYyByZXBGdW5jXzsKICAgaW50IGludGVydmFsTXNfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9GVU5DVElPTl9SVU5ORVJfSApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCmluZGV4IDNkNjQ0MGMuLjk1NzBjYzYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKQEAgLTE3LDIyICsxNywyNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJVdGlsLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KIAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAotdXNpbmcgYm9vc3Q6OnNjb3BlZF9wdHI7Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5CkBAIC00MSwyNiArNDYsMTQgQEAKICAqLwogY2xhc3MgTW9uaXRvcjo6SW1wbCB7CiAKLSBwdWJsaWM6Ci0KLSAgSW1wbCgpCi0gICAgIDogb3duZWRNdXRleF8obmV3IE11dGV4KCkpLAotICAgICAgIG11dGV4XyhOVUxMKSwKLSAgICAgICBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7CitwdWJsaWM6CisgIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgbXV0ZXhfKE5VTEwpLCBjb25kSW5pdGlhbGl6ZWRfKGZhbHNlKSB7CiAgICAgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7CiAgIH0KIAotICBJbXBsKE11dGV4KiBtdXRleCkKLSAgICAgOiBtdXRleF8oTlVMTCksCi0gICAgICAgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIGluaXQobXV0ZXgpOwotICB9CisgIEltcGwoTXV0ZXgqIG11dGV4KSA6IG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgeyBpbml0KG11dGV4KTsgfQogCi0gIEltcGwoTW9uaXRvciogbW9uaXRvcikKLSAgICAgOiBtdXRleF8oTlVMTCksCi0gICAgICAgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgewotICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7Ci0gIH0KKyAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG11dGV4XyhOVUxMKSwgY29uZEluaXRpYWxpemVkXyhmYWxzZSkgeyBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOyB9CiAKICAgfkltcGwoKSB7IGNsZWFudXAoKTsgfQogCkBAIC03NywxNCArNzAsMTMgQEAKICAgICovCiAgIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0IHsKICAgICBpbnQgcmVzdWx0ID0gd2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKLSAgICBpZiAocmVzdWx0ID09IEVUSU1FRE9VVCkgeworICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgewogICAgICAgLy8gcHRocmVhZF9jb25kX3RpbWVkd2FpdCBoYXMgYmVlbiBvYnNlcnZlZCB0byByZXR1cm4gZWFybHkgb24KICAgICAgIC8vIHZhcmlvdXMgcGxhdGZvcm1zLCBzbyBjb21tZW50IG91dCB0aGlzIGFzc2VydC4KLSAgICAgIC8vYXNzZXJ0KFV0aWw6OmN1cnJlbnRUaW1lKCkgPj0gKG5vdyArIHRpbWVvdXQpKTsKKyAgICAgIC8vIGFzc2VydChVdGlsOjpjdXJyZW50VGltZSgpID49IChub3cgKyB0aW1lb3V0KSk7CiAgICAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOwogICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oCi0gICAgICAgICJwdGhyZWFkX2NvbmRfd2FpdCgpIG9yIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBmYWlsZWQiKTsKKyAgICAgIHRocm93IFRFeGNlcHRpb24oInB0aHJlYWRfY29uZF93YWl0KCkgb3IgcHRocmVhZF9jb25kX3RpbWVkd2FpdCgpIGZhaWxlZCIpOwogICAgIH0KICAgfQogCkBAIC05Miw2MSArODQsNjMgQEAKICAgICogV2FpdHMgdW50aWwgdGhlIHNwZWNpZmllZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGNvbmRpdGlvbiB0bwogICAgKiBvY2N1ciwgb3Igd2FpdHMgZm9yZXZlciBpZiB0aW1lb3V0X21zID09IDAuCiAgICAqCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBFVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KICAgICovCiAgIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgewogICAgIGlmICh0aW1lb3V0X21zID09IDBMTCkgewogICAgICAgcmV0dXJuIHdhaXRGb3JldmVyKCk7CiAgICAgfQogCi0gICAgc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7CisgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBhYnN0aW1lOwogICAgIFV0aWw6OnRvVGltZXNwZWMoYWJzdGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSArIHRpbWVvdXRfbXMpOwogICAgIHJldHVybiB3YWl0Rm9yVGltZSgmYWJzdGltZSk7CiAgIH0KIAogICAvKioKLSAgICogV2FpdHMgdW50aWwgdGhlIGFic29sdXRlIHRpbWUgc3BlY2lmaWVkIHVzaW5nIHN0cnVjdCB0aW1lc3BlYy4KLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIEVUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KICAgICovCi0gIGludCB3YWl0Rm9yVGltZShjb25zdCB0aW1lc3BlYyogYWJzdGltZSkgY29uc3QgeworICBpbnQgd2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CiAgICAgYXNzZXJ0KG11dGV4Xyk7Ci0gICAgcHRocmVhZF9tdXRleF90KiBtdXRleEltcGwgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxwdGhyZWFkX211dGV4X3QqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOworICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0gcmVpbnRlcnByZXRfY2FzdDxwdGhyZWFkX211dGV4X3QqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwogICAgIGFzc2VydChtdXRleEltcGwpOwogCiAgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKLSAgICByZXR1cm4gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmcHRocmVhZF9jb25kXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRleEltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzdGltZSk7CisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCwgYWJzdGltZSk7CiAgIH0KIAorICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRlbXA7CisgICAgdGVtcC50dl9zZWMgPSBhYnN0aW1lLT50dl9zZWM7CisgICAgdGVtcC50dl9uc2VjID0gYWJzdGltZS0+dHZfdXNlYyAqIDEwMDA7CisgICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKKyAgfQogICAvKioKICAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KICAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgogICAgKi8KICAgaW50IHdhaXRGb3JldmVyKCkgY29uc3QgewogICAgIGFzc2VydChtdXRleF8pOwotICAgIHB0aHJlYWRfbXV0ZXhfdCogbXV0ZXhJbXBsID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBwdGhyZWFkX211dGV4X3QqIG11dGV4SW1wbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRocmVhZF9tdXRleF90Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKICAgICBhc3NlcnQobXV0ZXhJbXBsKTsKICAgICByZXR1cm4gcHRocmVhZF9jb25kX3dhaXQoJnB0aHJlYWRfY29uZF8sIG11dGV4SW1wbCk7CiAgIH0KIAotCiAgIHZvaWQgbm90aWZ5KCkgewogICAgIC8vIFhYWCBOZWVkIHRvIGFzc2VydCB0aGF0IGNhbGxlciBvd25zIG11dGV4CiAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwdGhyZWFkX2NvbmRfKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGlyZXQpOwogICAgIGFzc2VydChpcmV0ID09IDApOwogICB9CiAKICAgdm9pZCBub3RpZnlBbGwoKSB7CiAgICAgLy8gWFhYIE5lZWQgdG8gYXNzZXJ0IHRoYXQgY2FsbGVyIG93bnMgbXV0ZXgKICAgICBpbnQgaXJldCA9IHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnB0aHJlYWRfY29uZF8pOworICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoaXJldCk7CiAgICAgYXNzZXJ0KGlyZXQgPT0gMCk7CiAgIH0KIAotIHByaXZhdGU6Ci0KK3ByaXZhdGU6CiAgIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsKICAgICBtdXRleF8gPSBtdXRleDsKIApAQCAtMTY0LDMyICsxNTgsNTAgQEAKICAgICBpZiAoY29uZEluaXRpYWxpemVkXykgewogICAgICAgY29uZEluaXRpYWxpemVkXyA9IGZhbHNlOwogICAgICAgaW50IGlyZXQgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcHRocmVhZF9jb25kXyk7CisgICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGlyZXQpOwogICAgICAgYXNzZXJ0KGlyZXQgPT0gMCk7CiAgICAgfQogICB9CiAKLSAgc2NvcGVkX3B0cjxNdXRleD4gb3duZWRNdXRleF87CisgIHVuaXF1ZV9wdHI8TXV0ZXg+IG93bmVkTXV0ZXhfOwogICBNdXRleCogbXV0ZXhfOwogCiAgIG11dGFibGUgcHRocmVhZF9jb25kX3QgcHRocmVhZF9jb25kXzsKICAgbXV0YWJsZSBib29sIGNvbmRJbml0aWFsaXplZF87CiB9OwogCi1Nb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7fQotTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7fQotTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7fQorTW9uaXRvcjo6TW9uaXRvcigpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwoKSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNdXRleCogbXV0ZXgpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobXV0ZXgpKSB7Cit9CitNb25pdG9yOjpNb25pdG9yKE1vbml0b3IqIG1vbml0b3IpIDogaW1wbF8obmV3IE1vbml0b3I6OkltcGwobW9uaXRvcikpIHsKK30KIAotTW9uaXRvcjo6fk1vbml0b3IoKSB7IGRlbGV0ZSBpbXBsXzsgfQorTW9uaXRvcjo6fk1vbml0b3IoKSB7CisgIGRlbGV0ZSBpbXBsXzsKK30KIAotTXV0ZXgmIE1vbml0b3I6Om11dGV4KCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm11dGV4KCk7IH0KK011dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5tdXRleCgpOworfQogCi12b2lkIE1vbml0b3I6OmxvY2soKSBjb25zdCB7IGltcGxfLT5sb2NrKCk7IH0KK3ZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsKKyAgaW1wbF8tPmxvY2soKTsKK30KIAotdm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQordm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KIAotdm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeyBpbXBsXy0+d2FpdCh0aW1lb3V0KTsgfQordm9pZCBNb25pdG9yOjp3YWl0KGludDY0X3QgdGltZW91dCkgY29uc3QgeworICBpbXBsXy0+d2FpdCh0aW1lb3V0KTsKK30KIAotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWVzcGVjKiBhYnN0aW1lKSBjb25zdCB7CitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWUoYWJzdGltZSk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yVGltZShjb25zdCB0aW1ldmFsKiBhYnN0aW1lKSBjb25zdCB7CiAgIHJldHVybiBpbXBsXy0+d2FpdEZvclRpbWUoYWJzdGltZSk7CiB9CiAKQEAgLTIwMSw4ICsyMTMsMTMgQEAKICAgcmV0dXJuIGltcGxfLT53YWl0Rm9yZXZlcigpOwogfQogCi12b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsgaW1wbF8tPm5vdGlmeSgpOyB9Cit2b2lkIE1vbml0b3I6Om5vdGlmeSgpIGNvbnN0IHsKKyAgaW1wbF8tPm5vdGlmeSgpOworfQogCi12b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsgaW1wbF8tPm5vdGlmeUFsbCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK3ZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeworICBpbXBsXy0+bm90aWZ5QWxsKCk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgKaW5kZXggYWE2ZmU5My4uMjM5OWE5OCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oCkBAIC0yMCwxMyArMjAsMTggQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTU9OSVRPUl9IXyAxCiAKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJNdXRleC5oIgorI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIAogI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkuaHBwPgogCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIEEgbW9uaXRvciBpcyBhIGNvbWJpbmF0aW9uIG11dGV4IGFuZCBjb25kaXRpb24tZXZlbnQuICBXYWl0aW5nIGFuZApAQCAtNDcsNyArNTIsNyBAQAogICogQHZlcnNpb24gJElkOiQKICAqLwogY2xhc3MgTW9uaXRvciA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gcHVibGljOgorcHVibGljOgogICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRleCwgYW5kIHRha2VzIG93bmVyc2hpcCBvZiBpdC4gKi8KICAgTW9uaXRvcigpOwogCkBAIC03MCwxNSArNzUsMjEgQEAKICAgICogV2FpdHMgYSBtYXhpbXVtIG9mIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24KICAgICogdG8gb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgogICAgKgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCiAgICAqLwogICBpbnQgd2FpdEZvclRpbWVSZWxhdGl2ZShpbnQ2NF90IHRpbWVvdXRfbXMpIGNvbnN0OwogCiAgIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWVzcGVjLgotICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDLgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgogICAgKi8KLSAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IHRpbWVzcGVjKiBhYnN0aW1lKSBjb25zdDsKKyAgaW50IHdhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3Q7CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBhYnNvbHV0ZSB0aW1lIHNwZWNpZmllZCB1c2luZyBzdHJ1Y3QgdGltZXZhbC4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCogYWJzdGltZSkgY29uc3Q7CiAKICAgLyoqCiAgICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCkBAIC05NSwzMCArMTA2LDI4IEBACiAgICAqLwogICB2b2lkIHdhaXQoaW50NjRfdCB0aW1lb3V0X21zID0gMExMKSBjb25zdDsKIAotCiAgIC8qKiBXYWtlcyB1cCBvbmUgdGhyZWFkIHdhaXRpbmcgb24gdGhpcyBtb25pdG9yLiAqLwogICB2aXJ0dWFsIHZvaWQgbm90aWZ5KCkgY29uc3Q7CiAKICAgLyoqIFdha2VzIHVwIGFsbCB3YWl0aW5nIHRocmVhZHMgb24gdGhpcyBtb25pdG9yLiAqLwogICB2aXJ0dWFsIHZvaWQgbm90aWZ5QWxsKCkgY29uc3Q7CiAKLSBwcml2YXRlOgotCitwcml2YXRlOgogICBjbGFzcyBJbXBsOwogCiAgIEltcGwqIGltcGxfOwogfTsKIAogY2xhc3MgU3luY2hyb25pemVkIHsKLSBwdWJsaWM6Ci0gU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3IqIG1vbml0b3IpIDogZyhtb25pdG9yLT5tdXRleCgpKSB7IH0KLSBTeW5jaHJvbml6ZWQoY29uc3QgTW9uaXRvciYgbW9uaXRvcikgOiBnKG1vbml0b3IubXV0ZXgoKSkgeyB9CitwdWJsaWM6CisgIFN5bmNocm9uaXplZChjb25zdCBNb25pdG9yKiBtb25pdG9yKSA6IGcobW9uaXRvci0+bXV0ZXgoKSkge30KKyAgU3luY2hyb25pemVkKGNvbnN0IE1vbml0b3ImIG1vbml0b3IpIDogZyhtb25pdG9yLm11dGV4KCkpIHt9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgR3VhcmQgZzsKIH07Ci0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NT05JVE9SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcAppbmRleCA2MDFhZmE4Li5hNTI2NDYxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKQEAgLTE3LDYzICsxNyw2OSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotI2luY2x1ZGUgIk11dGV4LmgiCi0jaW5jbHVkZSAiVXRpbC5oIgorLy8gbmVlZGVkIHRvIHRlc3QgZm9yIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gY2FwYWJpbGl0aWVzOgorI2RlZmluZSBfX1VTRV9HTlUKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpZmRlZiBIQVZFX1BUSFJFQURfSAorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKKy8vIEVuYWJsZSB0aGlzIHRvIHR1cm4gb24gbXV0ZXggY29udGVudGlvbiBwcm9maWxpbmcgc3VwcG9ydAorLy8gI2RlZmluZSBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORwogCi1zdGF0aWMgc2lnX2F0b21pY190IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IDA7CisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworc3RhdGljIGludDMyX3QgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gMDsKK3N0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nU2FtcGxlUmF0ZSA9IDA7CiBzdGF0aWMgTXV0ZXhXYWl0Q2FsbGJhY2sgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IDA7CiAKLXZvbGF0aWxlIHN0YXRpYyBzaWdfYXRvbWljX3QgbXV0ZXhQcm9maWxpbmdDb3VudGVyID0gMDsKLQotdm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKSB7Cit2b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spIHsKICAgbXV0ZXhQcm9maWxpbmdTYW1wbGVSYXRlID0gcHJvZmlsaW5nU2FtcGxlUmF0ZTsKICAgbXV0ZXhQcm9maWxpbmdDYWxsYmFjayA9IGNhbGxiYWNrOwogfQogCi0jZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpIFwKLSAgICBpbnQ2NF90IF9sb2NrX3N0YXJ0VGltZSA9IG1heWJlR2V0UHJvZmlsaW5nU3RhcnRUaW1lKCk7CisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpIGludDY0X3QgX2xvY2tfc3RhcnRUaW1lID0gbWF5YmVHZXRQcm9maWxpbmdTdGFydFRpbWUoKTsKIAotI2RlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKSBcCi0gIGRvIHsgXAotICAgIGlmIChfbG9ja19zdGFydFRpbWUgPiAwKSB7IFwKLSAgICAgIGludDY0X3QgZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpOyBcCi0gICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIGVuZFRpbWUgLSBfbG9ja19zdGFydFRpbWUpOyBcCi0gICAgfSBcCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9sb2NrX3N0YXJ0VGltZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIGVuZFRpbWUgLSBfbG9ja19zdGFydFRpbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKSBcCi0gIGRvIHsgXAotICAgIHByb2ZpbGVUaW1lXyA9IF9sb2NrX3N0YXJ0VGltZTsgXAotICAgIGlmIChwcm9maWxlVGltZV8gPiAwKSB7IFwKLSAgICAgIHByb2ZpbGVUaW1lXyA9IFV0aWw6OmN1cnJlbnRUaW1lVXNlYygpIC0gcHJvZmlsZVRpbWVfOyBcCi0gICAgfSBcCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHJvZmlsZVRpbWVfID0gX2xvY2tfc3RhcnRUaW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHByb2ZpbGVUaW1lXyA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBwcm9maWxlVGltZV8gPSBVdGlsOjpjdXJyZW50VGltZVVzZWMoKSAtIHByb2ZpbGVUaW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKSBcCi0gIGludDY0X3QgX3RlbXBfcHJvZmlsZVRpbWUgPSBwcm9maWxlVGltZV87IFwKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50NjRfdCBfdGVtcF9wcm9maWxlVGltZSA9IHByb2ZpbGVUaW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgcHJvZmlsZVRpbWVfID0gMDsKIAotI2RlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkgXAotICBkbyB7IFwKLSAgICBpZiAoX3RlbXBfcHJvZmlsZVRpbWUgPiAwKSB7IFwKLSAgICAgICgqbXV0ZXhQcm9maWxpbmdDYWxsYmFjaykodGhpcywgX3RlbXBfcHJvZmlsZVRpbWUpOyBcCi0gICAgfSBcCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF90ZW1wX3Byb2ZpbGVUaW1lID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAoKm11dGV4UHJvZmlsaW5nQ2FsbGJhY2spKHRoaXMsIF90ZW1wX3Byb2ZpbGVUaW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKIHN0YXRpYyBpbmxpbmUgaW50NjRfdCBtYXliZUdldFByb2ZpbGluZ1N0YXJ0VGltZSgpIHsKQEAgLTEwMSwyMiArMTA3LDMwIEBACiB9CiAKICNlbHNlCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKQotIyAgZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkKLSMgIGRlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpCi0jICBkZWZpbmUgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpCi0jZW5kaWYgLy8gVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpCisjZGVmaW5lIFBST0ZJTEVfTVVURVhfTE9DS0VEKCkKKyNkZWZpbmUgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKQorI2RlZmluZSBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCkKKyNlbmRpZiAvLyBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORworCisjZGVmaW5lIEVJTlRSX0xPT1AoX0NBTEwpICAgICAgICAgIGludCByZXQ7IGRvIHsgcmV0ID0gX0NBTEw7IH0gd2hpbGUgKHJldCA9PSBFSU5UUikKKyNkZWZpbmUgQUJPUlRfT05GQUlMKF9DQUxMKSAgICAgIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQpIHsgYWJvcnQoKTsgfSB9CisjZGVmaW5lIFRIUk9XX1NSRShfQ0FMTFNUUiwgUkVUKSB7IHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKGJvb3N0OjpzdHIoYm9vc3Q6OmZvcm1hdCgiJTElIHJldHVybmVkICUyJSAoJTMlKSIpICUgX0NBTExTVFIgJSBSRVQgJSA6OnN0cmVycm9yKFJFVCkpKTsgfQorI2RlZmluZSBUSFJPV19TUkVfT05GQUlMKF9DQUxMKSAgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCkgeyBUSFJPV19TUkUoI19DQUxMLCByZXQpOyB9IH0KKyNkZWZpbmUgVEhST1dfU1JFX1RSWUZBSUwoX0NBTEwpIHsgRUlOVFJfTE9PUChfQ0FMTCk7IGlmIChyZXQgPT0gMCkgeyByZXR1cm4gdHJ1ZTsgfSBlbHNlIGlmIChyZXQgPT0gRUJVU1kpIHsgcmV0dXJuIGZhbHNlOyB9IFRIUk9XX1NSRSgjX0NBTEwsIHJldCk7IH0KIAogLyoqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiBNdXRleCBjbGFzcyB1c2luZyBQT1NJWCBtdXRleAogICoKKyAqIFRocm93cyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uIG9uIGVycm9yLgorICoKICAqIEB2ZXJzaW9uICRJZDokCiAgKi8KIGNsYXNzIE11dGV4OjppbXBsIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIGltcGwoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbml0aWFsaXplZF8oZmFsc2UpIHsKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisjaWZkZWYgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKICAgICBwcm9maWxlVGltZV8gPSAwOwogI2VuZGlmCiAgICAgaW5pdCgmcHRocmVhZF9tdXRleF8pOwpAQCAtMTI2LDM2ICsxNDAsMzkgQEAKICAgfmltcGwoKSB7CiAgICAgaWYgKGluaXRpYWxpemVkXykgewogICAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7Ci0gICAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCZwdGhyZWFkX211dGV4Xyk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOworICAgICAgQUJPUlRfT05GQUlMKHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pKTsKICAgICB9CiAgIH0KIAogICB2b2lkIGxvY2soKSBjb25zdCB7CiAgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4Xyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2xvY2soJnB0aHJlYWRfbXV0ZXhfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKICAgfQogCi0gIGJvb2wgdHJ5bG9jaygpIGNvbnN0IHsgcmV0dXJuICgwID09IHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsgfQorICBib29sIHRyeWxvY2soKSBjb25zdCB7CisgICAgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9tdXRleF90cnlsb2NrKCZwdGhyZWFkX211dGV4XykpOworICB9CiAKICAgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0IHsKICNpZiBkZWZpbmVkKF9QT1NJWF9USU1FT1VUUykgJiYgX1BPU0lYX1RJTUVPVVRTID49IDIwMDExMkwKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKIAotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHRzOwogICAgIFV0aWw6OnRvVGltZXNwZWModHMsIG1pbGxpc2Vjb25kcyArIFV0aWw6OmN1cnJlbnRUaW1lKCkpOwotICAgIGludCByZXQgPSBwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cyk7CisgICAgRUlOVFJfTE9PUChwdGhyZWFkX211dGV4X3RpbWVkbG9jaygmcHRocmVhZF9tdXRleF8sICZ0cykpOwogICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmV0ID09IEVUSU1FRE9VVCkgeworICAgICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgUFJPRklMRV9NVVRFWF9OT1RfTE9DS0VEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIFRIUk9XX1NSRSgicHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpIiwgcmV0KTsKICNlbHNlCiAgICAgLyogT3RoZXJ3aXNlIGZvbGxvdyBzb2x1dGlvbiB1c2VkIGJ5IE1vbm8gZm9yIEFuZHJvaWQgKi8KLSAgICBzdHJ1Y3QgdGltZXNwZWMgc2xlZXB5dGltZSwgbm93LCB0bzsKKyAgICBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDIHNsZWVweXRpbWUsIG5vdywgdG87CiAKICAgICAvKiBUaGlzIGlzIGp1c3QgdG8gYXZvaWQgYSBjb21wbGV0ZWx5IGJ1c3kgd2FpdCAqLwogICAgIHNsZWVweXRpbWUudHZfc2VjID0gMDsKQEAgLTE3MCw2MCArMTg3LDYyIEBACiAgICAgICB9CiAgICAgICBuYW5vc2xlZXAoJnNsZWVweXRpbWUsIE5VTEwpOwogICAgIH0KLSAKKwogICAgIHJldHVybiB0cnVlOwogI2VuZGlmCiAgIH0KIAogICB2b2lkIHVubG9jaygpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwdGhyZWFkX211dGV4Xyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pKTsKICAgICBQUk9GSUxFX01VVEVYX1VOTE9DS0VEKCk7CiAgIH0KIAotICB2b2lkKiBnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsgcmV0dXJuICh2b2lkKikgJnB0aHJlYWRfbXV0ZXhfOyB9CisgIHZvaWQqIGdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gKHZvaWQqKSZwdGhyZWFkX211dGV4XzsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIG11dGFibGUgcHRocmVhZF9tdXRleF90IHB0aHJlYWRfbXV0ZXhfOwogICBtdXRhYmxlIGJvb2wgaW5pdGlhbGl6ZWRfOwotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORwogICBtdXRhYmxlIGludDY0X3QgcHJvZmlsZVRpbWVfOwogI2VuZGlmCiB9OwogCi1NdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoaW5pdCkpIHt9CitNdXRleDo6TXV0ZXgoSW5pdGlhbGl6ZXIgaW5pdCkgOiBpbXBsXyhuZXcgTXV0ZXg6OmltcGwoaW5pdCkpIHsKK30KIAotdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFVuZGVybHlpbmdJbXBsKCk7IH0KK3ZvaWQqIE11dGV4OjpnZXRVbmRlcmx5aW5nSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT5nZXRVbmRlcmx5aW5nSW1wbCgpOworfQogCi12b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeyBpbXBsXy0+bG9jaygpOyB9Cit2b2lkIE11dGV4Ojpsb2NrKCkgY29uc3QgeworICBpbXBsXy0+bG9jaygpOworfQogCi1ib29sIE11dGV4Ojp0cnlsb2NrKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPnRyeWxvY2soKTsgfQorYm9vbCBNdXRleDo6dHJ5bG9jaygpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlsb2NrKCk7Cit9CiAKLWJvb2wgTXV0ZXg6OnRpbWVkbG9jayhpbnQ2NF90IG1zKSBjb25zdCB7IHJldHVybiBpbXBsXy0+dGltZWRsb2NrKG1zKTsgfQorYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50aW1lZGxvY2sobXMpOworfQogCi12b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7IGltcGxfLT51bmxvY2soKTsgfQordm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgeworICBpbXBsXy0+dW5sb2NrKCk7Cit9CiAKIHZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CiAgIHB0aHJlYWRfbXV0ZXhfdCogcHRocmVhZF9tdXRleCA9IChwdGhyZWFkX211dGV4X3QqKWFyZzsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4LCBOVUxMKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCkpOwogfQogCi0jaWYgZGVmaW5lZChQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKSB8fCBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQorI2lmIGRlZmluZWQoUFRIUkVBRF9BREFQVElWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkgfHwgZGVmaW5lZChQVEhSRUFEX0VSUk9SQ0hFQ0tfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9SRUNVUlNJVkVfTVVURVhfSU5JVElBTElaRVJfTlApCiBzdGF0aWMgdm9pZCBpbml0X3dpdGhfa2luZChwdGhyZWFkX211dGV4X3QqIG11dGV4LCBpbnQga2luZCkgewogICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4YXR0cjsKLSAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgLy8gQXBwYXJlbnRseSwgdGhpcyBjYW4gZmFpbC4gIFNob3VsZCB3ZSByZWFsbHkgYmUgYWJvcnRpbmc/Ci0gIHJldCA9IHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCk7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgcmV0ID0gcHRocmVhZF9tdXRleF9pbml0KG11dGV4LCAmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLQotICByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cikpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCkpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4YXR0cikpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4YXR0cikpOwogfQogI2VuZGlmCiAKQEAgLTI0MSwxMyArMjYwLDE4IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIFBUSFJFQURfRVJST1JDSEVDS19NVVRFWF9JTklUSUFMSVpFUl9OUAordm9pZCBNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgaW5pdF93aXRoX2tpbmQoKHB0aHJlYWRfbXV0ZXhfdCopYXJnLCBQVEhSRUFEX01VVEVYX0VSUk9SQ0hFQ0spOworfQorI2VuZGlmCisKICNpZmRlZiBQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUAogdm9pZCBNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewogICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QKTsKIH0KICNlbmRpZgogCi0KIC8qKgogICogSW1wbGVtZW50YXRpb24gb2YgUmVhZFdyaXRlTXV0ZXggY2xhc3MgdXNpbmcgUE9TSVggcncgbG9jawogICoKQEAgLTI1Niw2OCArMjgwLDc3IEBACiBjbGFzcyBSZWFkV3JpdGVNdXRleDo6aW1wbCB7CiBwdWJsaWM6CiAgIGltcGwoKSA6IGluaXRpYWxpemVkXyhmYWxzZSkgewotI2lmbmRlZiBUSFJJRlRfTk9fQ09OVEVOVElPTl9QUk9GSUxJTkcKKyNpZmRlZiBUSFJJRlRfUFRIUkVBRF9NVVRFWF9DT05URU5USU9OX1BST0ZJTElORwogICAgIHByb2ZpbGVUaW1lXyA9IDA7CiAjZW5kaWYKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9yd2xvY2tfaW5pdCgmcndfbG9ja18sIE5VTEwpOwotICAgIGFzc2VydChyZXQgPT0gMCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja19pbml0KCZyd19sb2NrXywgTlVMTCkpOwogICAgIGluaXRpYWxpemVkXyA9IHRydWU7CiAgIH0KIAogICB+aW1wbCgpIHsKLSAgICBpZihpbml0aWFsaXplZF8pIHsKKyAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7CiAgICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgICAgIGludCByZXQgPSBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZyd19sb2NrXyk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOworICAgICAgQUJPUlRfT05GQUlMKHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJnJ3X2xvY2tfKSk7CiAgICAgfQogICB9CiAKICAgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja19yZGxvY2soJnJ3X2xvY2tfKTsKLSAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsgIC8vIG5vdCBleGNsdXNpdmUsIHNvIHVzZSBub3QtbG9ja2VkIHBhdGgKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pKTsKKyAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsgLy8gbm90IGV4Y2x1c2l2ZSwgc28gdXNlIG5vdC1sb2NrZWQgcGF0aAogICB9CiAKICAgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdCB7CiAgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZyd19sb2NrXyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ3X2xvY2tfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKICAgfQogCi0gIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdCB7IHJldHVybiAhcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXyk7IH0KKyAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXykpOyB9CiAKLSAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IHJldHVybiAhcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXyk7IH0KKyAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfcndsb2NrX3RyeXdybG9jaygmcndfbG9ja18pKTsgfQogCiAgIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3VubG9jaygmcndfbG9ja18pOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXykpOwogICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKICAgfQogCiBwcml2YXRlOgogICBtdXRhYmxlIHB0aHJlYWRfcndsb2NrX3QgcndfbG9ja187CiAgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAgIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87CiAjZW5kaWYKIH07CiAKLVJlYWRXcml0ZU11dGV4OjpSZWFkV3JpdGVNdXRleCgpIDogaW1wbF8obmV3IFJlYWRXcml0ZU11dGV4OjppbXBsKCkpIHt9CitSZWFkV3JpdGVNdXRleDo6UmVhZFdyaXRlTXV0ZXgoKSA6IGltcGxfKG5ldyBSZWFkV3JpdGVNdXRleDo6aW1wbCgpKSB7Cit9CiAKLXZvaWQgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCkgY29uc3QgeyBpbXBsXy0+YWNxdWlyZVJlYWQoKTsgfQordm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdCB7CisgIGltcGxfLT5hY3F1aXJlUmVhZCgpOworfQogCi12b2lkIFJlYWRXcml0ZU11dGV4OjphY3F1aXJlV3JpdGUoKSBjb25zdCB7IGltcGxfLT5hY3F1aXJlV3JpdGUoKTsgfQordm9pZCBSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCkgY29uc3QgeworICBpbXBsXy0+YWNxdWlyZVdyaXRlKCk7Cit9CiAKLWJvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRSZWFkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmF0dGVtcHRSZWFkKCk7IH0KK2Jvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRSZWFkKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPmF0dGVtcHRSZWFkKCk7Cit9CiAKLWJvb2wgUmVhZFdyaXRlTXV0ZXg6OmF0dGVtcHRXcml0ZSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5hdHRlbXB0V3JpdGUoKTsgfQorYm9vbCBSZWFkV3JpdGVNdXRleDo6YXR0ZW1wdFdyaXRlKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8tPmF0dGVtcHRXcml0ZSgpOworfQogCi12b2lkIFJlYWRXcml0ZU11dGV4OjpyZWxlYXNlKCkgY29uc3QgeyBpbXBsXy0+cmVsZWFzZSgpOyB9Cit2b2lkIFJlYWRXcml0ZU11dGV4OjpyZWxlYXNlKCkgY29uc3QgeworICBpbXBsXy0+cmVsZWFzZSgpOworfQogCi1Ob1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjpOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkgOiB3cml0ZXJXYWl0aW5nXyhmYWxzZSkge30KK05vU3RhcnZlUmVhZFdyaXRlTXV0ZXg6Ok5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSA6IHdyaXRlcldhaXRpbmdfKGZhbHNlKSB7Cit9CiAKLXZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVJlYWQoKSBjb25zdAotewordm9pZCBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4OjphY3F1aXJlUmVhZCgpIGNvbnN0IHsKICAgaWYgKHdyaXRlcldhaXRpbmdfKSB7CiAgICAgLy8gd3JpdGVyIGlzIHdhaXRpbmcsIGJsb2NrIG9uIHRoZSB3cml0ZXIncyBtdXRleCB1bnRpbCBoZSdzIGRvbmUgd2l0aCBpdAogICAgIG11dGV4Xy5sb2NrKCk7CkBAIC0zMjcsOCArMzYwLDcgQEAKICAgUmVhZFdyaXRlTXV0ZXg6OmFjcXVpcmVSZWFkKCk7CiB9CiAKLXZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCkgY29uc3QKLXsKK3ZvaWQgTm9TdGFydmVSZWFkV3JpdGVNdXRleDo6YWNxdWlyZVdyaXRlKCkgY29uc3QgewogICAvLyBpZiB3ZSBjYW4gYWNxdWlyZSB0aGUgcndsb2NrIHRoZSBlYXN5IHdheSwgd2UncmUgZG9uZQogICBpZiAoYXR0ZW1wdFdyaXRlKCkpIHsKICAgICByZXR1cm47CkBAIC0zNDMsNiArMzc1LDYgQEAKICAgd3JpdGVyV2FpdGluZ18gPSBmYWxzZTsKICAgbXV0ZXhfLnVubG9jaygpOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCmluZGV4IDE3NjNiNWMuLmExZjUzOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCkBAIC0yMCwxMCArMjAsMTMgQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXwogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX01VVEVYX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAjaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORwogCkBAIC00NiwyMiArNDksMjcgQEAKICAqIHBhcnRpY3VsYXIgdGltZSBwZXJpb2QuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKk11dGV4V2FpdENhbGxiYWNrKShjb25zdCB2b2lkKiBpZCwgaW50NjRfdCB3YWl0VGltZU1pY3Jvcyk7Ci12b2lkIGVuYWJsZU11dGV4UHJvZmlsaW5nKGludDMyX3QgcHJvZmlsaW5nU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhXYWl0Q2FsbGJhY2sgY2FsbGJhY2spOwordm9pZCBlbmFibGVNdXRleFByb2ZpbGluZyhpbnQzMl90IHByb2ZpbGluZ1NhbXBsZVJhdGUsIE11dGV4V2FpdENhbGxiYWNrIGNhbGxiYWNrKTsKIAogI2VuZGlmCiAKIC8qKgorICogTk9URTogQWxsIG11dGV4IGltcGxlbWVudGF0aW9ucyB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4gIFNlZSBlYWNoCisgKiAgICAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBleGNlcHRpb24gdHlwZShzKSB1c2VkLgorICovCisKKy8qKgogICogQSBzaW1wbGUgbXV0ZXggY2xhc3MKICAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCiBjbGFzcyBNdXRleCB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIHZvaWQgKCpJbml0aWFsaXplcikodm9pZCopOwogCiAgIE11dGV4KEluaXRpYWxpemVyIGluaXQgPSBERUZBVUxUX0lOSVRJQUxJWkVSKTsKICAgdmlydHVhbCB+TXV0ZXgoKSB7fQorCiAgIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7CiAgIHZpcnR1YWwgYm9vbCB0cnlsb2NrKCkgY29uc3Q7CiAgIHZpcnR1YWwgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0OwpAQCAtNjksMTQgKzc3LDE2IEBACiAKICAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdDsKIAotICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgLy8gSWYgeW91IGF0dGVtcHQgdG8gdXNlIG9uZSBvZiB0aGVzZSBhbmQgaXQgZmFpbHMgdG8gbGluaywgaXQgbWVhbnMKKyAgLy8geW91ciB2ZXJzaW9uIG9mIHB0aHJlYWRzIGRvZXMgbm90IHN1cHBvcnQgaXQgLSB0cnkgYW5vdGhlciBvbmUuCiAgIHN0YXRpYyB2b2lkIEFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgREVGQVVMVF9JTklUSUFMSVpFUih2b2lkKik7CisgIHN0YXRpYyB2b2lkIEVSUk9SQ0hFQ0tfSU5JVElBTElaRVIodm9pZCopOwogICBzdGF0aWMgdm9pZCBSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCopOwogCi0gcHJpdmF0ZToKLQorcHJpdmF0ZToKICAgY2xhc3MgaW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKIH07CiAKIGNsYXNzIFJlYWRXcml0ZU11dGV4IHsKQEAgLTk2LDkgKzEwNiw4IEBACiAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0KICAgY2xhc3MgaW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKIH07CiAKIC8qKgpAQCAtMTIxLDcgKzEzMCw3IEBACiB9OwogCiBjbGFzcyBHdWFyZCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Ci0gcHVibGljOgorcHVibGljOgogICBHdWFyZChjb25zdCBNdXRleCYgdmFsdWUsIGludDY0X3QgdGltZW91dCA9IDApIDogbXV0ZXhfKCZ2YWx1ZSkgewogICAgIGlmICh0aW1lb3V0ID09IDApIHsKICAgICAgIHZhbHVlLmxvY2soKTsKQEAgLTE0MSw1NyArMTUwLDQwIEBACiAgICAgfQogICB9CiAKLSAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKG11dGV4XyAhPSBOVUxMKTsKLSAgfQorICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gKG11dGV4XyAhPSBOVUxMKTsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIGNvbnN0IE11dGV4KiBtdXRleF87CiB9OwogCiAvLyBDYW4gYmUgdXNlZCBhcyBzZWNvbmQgYXJndW1lbnQgdG8gUldHdWFyZCB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZQogLy8gYXMgdG8gd2hldGhlciB3ZSdyZSBkb2luZyBhY3F1aXJlUmVhZCgpIG9yIGFjcXVpcmVXcml0ZSgpLgotZW51bSBSV0d1YXJkVHlwZSB7Ci0gIFJXX1JFQUQgPSAwLAotICBSV19XUklURSA9IDEKLX07Ci0KK2VudW0gUldHdWFyZFR5cGUgeyBSV19SRUFEID0gMCwgUldfV1JJVEUgPSAxIH07CiAKIGNsYXNzIFJXR3VhcmQgOiBib29zdDo6bm9uY29weWFibGUgewotICBwdWJsaWM6Ci0gICAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIGJvb2wgd3JpdGUgPSBmYWxzZSkKLSAgICAgICAgIDogcndfbXV0ZXhfKHZhbHVlKSB7Ci0gICAgICBpZiAod3JpdGUpIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgICB9CitwdWJsaWM6CisgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBib29sIHdyaXRlID0gZmFsc2UpIDogcndfbXV0ZXhfKHZhbHVlKSB7CisgICAgaWYgKHdyaXRlKSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOwogICAgIH0KKyAgfQogCi0gICAgUldHdWFyZChjb25zdCBSZWFkV3JpdGVNdXRleCYgdmFsdWUsIFJXR3VhcmRUeXBlIHR5cGUpCi0gICAgICAgICA6IHJ3X211dGV4Xyh2YWx1ZSkgewotICAgICAgaWYgKHR5cGUgPT0gUldfV1JJVEUpIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVXcml0ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcndfbXV0ZXhfLmFjcXVpcmVSZWFkKCk7Ci0gICAgICB9CisgIFJXR3VhcmQoY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHZhbHVlLCBSV0d1YXJkVHlwZSB0eXBlKSA6IHJ3X211dGV4Xyh2YWx1ZSkgeworICAgIGlmICh0eXBlID09IFJXX1dSSVRFKSB7CisgICAgICByd19tdXRleF8uYWNxdWlyZVdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJ3X211dGV4Xy5hY3F1aXJlUmVhZCgpOwogICAgIH0KLSAgICB+UldHdWFyZCgpIHsKLSAgICAgIHJ3X211dGV4Xy5yZWxlYXNlKCk7Ci0gICAgfQotICBwcml2YXRlOgotICAgIGNvbnN0IFJlYWRXcml0ZU11dGV4JiByd19tdXRleF87CisgIH0KKyAgflJXR3VhcmQoKSB7IHJ3X211dGV4Xy5yZWxlYXNlKCk7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgUmVhZFdyaXRlTXV0ZXgmIHJ3X211dGV4XzsKIH07Ci0KLQotLy8gQSBsaXR0bGUgaGFjayB0byBwcmV2ZW50IHNvbWVvbmUgZnJvbSB0cnlpbmcgdG8gZG8gIkd1YXJkKG0pOyIKLS8vIFN1Y2ggYSB1c2UgaXMgaW52YWxpZCBiZWNhdXNlIHRoZSB0ZW1wb3JhcnkgR3VhcmQgb2JqZWN0IGlzCi0vLyBkZXN0cm95ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSwgcmVsZWFzaW5nIHRoZSBsb2NrLgotLy8gU29ycnkgZm9yIHBvbGx1dGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgYnV0IEkgdGhpbmsgaXQncyB3b3J0aCBpdC4KLSNkZWZpbmUgR3VhcmQobSkgaW5jb3JyZWN0X3VzZV9vZl9HdWFyZChtKQotI2RlZmluZSBSV0d1YXJkKG0pIGluY29ycmVjdF91c2Vfb2ZfUldHdWFyZChtKQotCi0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaAppbmRleCAwNGY2ZWUzLi45OWI0NDAzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCkBAIC0yMCwyMCArMjAsMjkgQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9QTEFURk9STVRIUkVBREZBQ1RPUllfSF8gMQogCi0jaWZuZGVmIFVTRV9CT09TVF9USFJFQUQKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorI2lmIFVTRV9TVERfVEhSRUFECisjICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgorI2Vsc2UKICMgIGluY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5Lmg+CiAjZW5kaWYKKy8vIGNsYW5nLWZvcm1hdCBvbgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotI2lmbmRlZiBVU0VfQk9PU1RfVEhSRUFECisvLyBjbGFuZy1mb3JtYXQgb2ZmCisjaWYgVVNFX1NURF9USFJFQUQKKyAgdHlwZWRlZiBTdGRUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKKyNlbHNlCiAgIHR5cGVkZWYgUG9zaXhUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKLSNlbHNlCi0gIHR5cGVkZWYgQm9vc3RUaHJlYWRGYWN0b3J5IFBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKICNlbmRpZgorLy8gY2xhbmctZm9ybWF0IG9uCiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUExBVEZPUk1USFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCmluZGV4IDIwMTkzNTMuLjVjNTkyNjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCkBAIC0xNywxNCArMTcsMTQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJQb3NpeFRocmVhZEZhY3RvcnkuaCIKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgogCiAjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKLSMgIGluY2x1ZGUgPGdvb2dsZS9wcm9maWxlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm9maWxlci5oPgogI2VuZGlmCiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KQEAgLTMyLDU1ICszMiw1MSBAQAogCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OndlYWtfcHRyOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogVGhlIFBPU0lYIHRocmVhZCBjbGFzcy4KICAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCi1jbGFzcyBQdGhyZWFkVGhyZWFkOiBwdWJsaWMgVGhyZWFkIHsKLSBwdWJsaWM6Ci0KLSAgZW51bSBTVEFURSB7Ci0gICAgdW5pbml0aWFsaXplZCwKLSAgICBzdGFydGluZywKLSAgICBzdGFydGVkLAotICAgIHN0b3BwaW5nLAotICAgIHN0b3BwZWQKLSAgfTsKK2NsYXNzIFB0aHJlYWRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OwogCiAgIHN0YXRpYyBjb25zdCBpbnQgTUIgPSAxMDI0ICogMTAyNDsKIAogICBzdGF0aWMgdm9pZCogdGhyZWFkTWFpbih2b2lkKiBhcmcpOwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHB0aHJlYWRfdCBwdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOworICBNb25pdG9yIG1vbml0b3JfOwkJLy8gZ3VhcmQgdG8gcHJvdGVjdCBzdGF0ZV8gYW5kIGFsc28gbm90aWZpY2F0aW9uCisgIFNUQVRFIHN0YXRlXzsgICAgICAgICAvLyB0byBwcm90ZWN0IHByb3BlciB0aHJlYWQgc3RhcnQgYmVoYXZpb3IKICAgaW50IHBvbGljeV87CiAgIGludCBwcmlvcml0eV87CiAgIGludCBzdGFja1NpemVfOwotICB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKKyAgc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKICAgYm9vbCBkZXRhY2hlZF87CiAKLSBwdWJsaWM6Ci0KLSAgUHRocmVhZFRocmVhZChpbnQgcG9saWN5LCBpbnQgcHJpb3JpdHksIGludCBzdGFja1NpemUsIGJvb2wgZGV0YWNoZWQsIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6CitwdWJsaWM6CisgIFB0aHJlYWRUaHJlYWQoaW50IHBvbGljeSwKKyAgICAgICAgICAgICAgICBpbnQgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgaW50IHN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICBib29sIGRldGFjaGVkLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgOgogCiAjaWZuZGVmIF9XSU4zMgotICAgIHB0aHJlYWRfKDApLAorICAgICAgcHRocmVhZF8oMCksCiAjZW5kaWYgLy8gX1dJTjMyCi0KLSAgICBzdGF0ZV8odW5pbml0aWFsaXplZCksCi0gICAgcG9saWN5Xyhwb2xpY3kpLAotICAgIHByaW9yaXR5Xyhwcmlvcml0eSksCi0gICAgc3RhY2tTaXplXyhzdGFja1NpemUpLAotICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgeworICAgICAgc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLAorICAgICAgcG9saWN5Xyhwb2xpY3kpLAorICAgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKKyAgICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSwKKyAgICAgIGRldGFjaGVkXyhkZXRhY2hlZCkgewogCiAgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7CiAgIH0KQEAgLTg5LDMwICs4NSw0NyBAQAogICAgIC8qIE5vdGhpbmcgcmVmZXJlbmNlcyB0aGlzIHRocmVhZCwgaWYgaXMgaXMgbm90IGRldGFjaGVkLCBkbyBhIGpvaW4KICAgICAgICBub3csIG90aGVyd2lzZSB0aGUgdGhyZWFkLWlkIGFuZCwgcG9zc2libHksIG90aGVyIHJlc291cmNlcyB3aWxsCiAgICAgICAgYmUgbGVha2VkLiAqLwotICAgIGlmKCFkZXRhY2hlZF8pIHsKKyAgICBpZiAoIWRldGFjaGVkXykgewogICAgICAgdHJ5IHsKICAgICAgICAgam9pbigpOwotICAgICAgfSBjYXRjaCguLi4pIHsKKyAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCiAgICAgICB9CiAgICAgfQogICB9CiAKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCiAgIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgewogICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOwogICAgIGlmIChwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHIpICE9IDApIHsKLSAgICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9pbml0IGZhaWxlZCIpOworICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9pbml0IGZhaWxlZCIpOwogICAgIH0KIAotICAgIGlmKHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpICE9IDApIHsKLSAgICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSBmYWlsZWQiKTsKKyAgICBpZiAocHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZ0aHJlYWRfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkXyA/IFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEIDogUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUpCisgICAgICAgICE9IDApIHsKKyAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUgZmFpbGVkIik7CiAgICAgfQogCiAgICAgLy8gU2V0IHRocmVhZCBzdGFjayBzaXplCkBAIC0xMjAsMTUgKzEzMywxOCBAQAogICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUgZmFpbGVkIik7CiAgICAgfQogCi0gICAgLy8gU2V0IHRocmVhZCBwb2xpY3kKLSAgICAjaWZkZWYgX1dJTjMyCi0JLy9XSU4zMiBQdGhyZWFkIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHNoZWR1bGluZyBwb2xpY2llcyBvdGhlciB0aGVuIFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIgLSBydW50aW1lIGVycm9yCi0JcG9saWN5XyA9IFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVI7Ci0gICAgI2VuZGlmCisvLyBTZXQgdGhyZWFkIHBvbGljeQorI2lmZGVmIF9XSU4zMgorICAgIC8vIFdJTjMyIFB0aHJlYWQgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgc2hlZHVsaW5nIHBvbGljaWVzIG90aGVyIHRoZW4KKyAgICAvLyBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSIC0gcnVudGltZSBlcnJvcgorICAgIHBvbGljeV8gPSBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSOworI2VuZGlmCiAKKyNpZiBfUE9TSVhfVEhSRUFEX1BSSU9SSVRZX1NDSEVEVUxJTkcgPiAwCiAgICAgaWYgKHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSgmdGhyZWFkX2F0dHIsIHBvbGljeV8pICE9IDApIHsKICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3kgZmFpbGVkIik7CiAgICAgfQorI2VuZGlmCiAKICAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWRfcGFyYW07CiAgICAgc2NoZWRfcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eV87CkBAIC0xMzksMTggKzE1NSwyNyBAQAogICAgIH0KIAogICAgIC8vIENyZWF0ZSByZWZlcmVuY2UKLSAgICBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4oKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qIHNlbGZSZWYgPSBuZXcgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KCk7CiAgICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7CiAKLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKKyAgICBzZXRTdGF0ZShzdGFydGluZyk7CiAKKwlTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisJCiAgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZwdGhyZWFkXywgJnRocmVhZF9hdHRyLCB0aHJlYWRNYWluLCAodm9pZCopc2VsZlJlZikgIT0gMCkgewogICAgICAgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oInB0aHJlYWRfY3JlYXRlIGZhaWxlZCIpOwogICAgIH0KKyAgICAKKyAgICAvLyBUaGUgY2FsbGVyIG1heSBub3QgY2hvb3NlIHRvIGd1YXJhbnRlZSB0aGUgc2NvcGUgb2YgdGhlIFJ1bm5hYmxlCisgICAgLy8gYmVpbmcgdXNlZCBpbiB0aGUgdGhyZWFkLCBzbyB3ZSBtdXN0IGFjdHVhbGx5IHdhaXQgdW50aWwgdGhlIHRocmVhZAorICAgIC8vIHN0YXJ0cyBiZWZvcmUgd2UgcmV0dXJuLiAgSWYgd2UgZG8gbm90IHdhaXQsIGl0IHdvdWxkIGJlIHBvc3NpYmxlCisgICAgLy8gZm9yIHRoZSBjYWxsZXIgdG8gc3RhcnQgZGVzdHJ1Y3RpbmcgdGhlIFJ1bm5hYmxlIGFuZCB0aGUgVGhyZWFkLAorICAgIC8vIGFuZCB3ZSB3b3VsZCBlbmQgdXAgaW4gYSByYWNlLiAgVGhpcyB3YXMgaWRlbnRpZmllZCB3aXRoIHZhbGdyaW5kLgorICAgIG1vbml0b3JfLndhaXQoKTsKICAgfQogCiAgIHZvaWQgam9pbigpIHsKLSAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgewogICAgICAgdm9pZCogaWdub3JlOwogICAgICAgLyogWFhYCiAgICAgICAgICBJZiBqb2luIGZhaWxzIGl0IGlzIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdApAQCAtMTY0LDggKzE4OSw2IEBACiAgICAgICBpZiAocmVzICE9IDApIHsKICAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiUHRocmVhZFRocmVhZDo6am9pbigpOiBmYWlsIHdpdGggY29kZSAlZCIsIHJlcyk7CiAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlB0aHJlYWRUaHJlYWQ6OmpvaW4oKTogZGV0YWNoZWQgdGhyZWFkIik7CiAgICAgfQogICB9CiAKQEAgLTE3OCwxNjUgKzIwMSwxMzUgQEAKICNlbmRpZiAvLyBfV0lOMzIKICAgfQogCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KIAotICB2b2lkIHJ1bm5hYmxlKHNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQogCi0gIHZvaWQgd2Vha1JlZihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKKyAgdm9pZCB3ZWFrUmVmKHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmKSB7CiAgICAgYXNzZXJ0KHNlbGYuZ2V0KCkgPT0gdGhpcyk7Ci0gICAgc2VsZl8gPSB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKKyAgICBzZWxmXyA9IHN0ZDo6d2Vha19wdHI8UHRocmVhZFRocmVhZD4oc2VsZik7CiAgIH0KIH07CiAKIHZvaWQqIFB0aHJlYWRUaHJlYWQ6OnRocmVhZE1haW4odm9pZCogYXJnKSB7Ci0gIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gdGhyZWFkID0gKihzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kilhcmc7Ci0gIGRlbGV0ZSByZWludGVycHJldF9jYXN0PHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qPihhcmcpOwotCi0gIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQotCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdGFydGluZykgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gdGhyZWFkID0gKihzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKKyAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+Kj4oYXJnKTsKIAogI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECiAgIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKICNlbmRpZgogCi0gIHRocmVhZC0+c3RhdGVfID0gc3RhcnRlZDsKKyAgdGhyZWFkLT5zZXRTdGF0ZShzdGFydGVkKTsKKwogICB0aHJlYWQtPnJ1bm5hYmxlKCktPnJ1bigpOwotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBlZCkgewotICAgIHRocmVhZC0+c3RhdGVfID0gc3RvcHBpbmc7CisKKyAgU1RBVEUgX3MgPSB0aHJlYWQtPmdldFN0YXRlKCk7CisgIGlmIChfcyAhPSBzdG9wcGluZyAmJiBfcyAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CiAgIH0KIAogICByZXR1cm4gKHZvaWQqKTA7CiB9CiAKIC8qKgotICogUE9TSVggVGhyZWFkIGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKKyAqIEFQSSB2YWx1ZXMuCiAgKi8KLWNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeTo6SW1wbCB7Ci0KLSBwcml2YXRlOgotICBQT0xJQ1kgcG9saWN5XzsKLSAgUFJJT1JJVFkgcHJpb3JpdHlfOwotICBpbnQgc3RhY2tTaXplXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIGdlbmVyaWMgcG9zaXggdGhyZWFkIHNjaGVkdWxlIHBvbGljeSBlbnVtcyBpbnRvIHB0aHJlYWQKLSAgICogQVBJIHZhbHVlcy4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUG9saWN5KFBPTElDWSBwb2xpY3kpIHsKLSAgICBzd2l0Y2ggKHBvbGljeSkgewotICAgIGNhc2UgT1RIRVI6Ci0gICAgICByZXR1cm4gU0NIRURfT1RIRVI7Ci0gICAgY2FzZSBGSUZPOgotICAgICAgcmV0dXJuIFNDSEVEX0ZJRk87Ci0gICAgY2FzZSBST1VORF9ST0JJTjoKLSAgICAgIHJldHVybiBTQ0hFRF9SUjsKLSAgICB9CitzdGF0aWMgaW50IHRvUHRocmVhZFBvbGljeShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3kpIHsKKyAgc3dpdGNoIChwb2xpY3kpIHsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSOgogICAgIHJldHVybiBTQ0hFRF9PVEhFUjsKKyAgY2FzZSBQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk86CisgICAgcmV0dXJuIFNDSEVEX0ZJRk87CisgIGNhc2UgUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTjoKKyAgICByZXR1cm4gU0NIRURfUlI7CiAgIH0KKyAgcmV0dXJuIFNDSEVEX09USEVSOworfQogCi0gIC8qKgotICAgKiBDb252ZXJ0cyByZWxhdGl2ZSB0aHJlYWQgcHJpb3JpdGllcyB0byBhYnNvbHV0ZSB2YWx1ZSBiYXNlZCBvbiBwb3NpeAotICAgKiB0aHJlYWQgc2NoZWR1bGVyIHBvbGljeQotICAgKgotICAgKiAgVGhlIGlkZWEgaXMgc2ltcGx5IHRvIGRpdmlkZSB1cCB0aGUgcHJpb3JpdHkgcmFuZ2UgZm9yIHRoZSBnaXZlbiBwb2xpY3kKLSAgICogaW50byB0aGUgY29ycmVwc29uZGluZyByZWxhdGl2ZSBwcmlvcml0eSBsZXZlbCAobG93ZXN0Li5oaWdoZXN0KSBhbmQKLSAgICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KLSAgICovCi0gIHN0YXRpYyBpbnQgdG9QdGhyZWFkUHJpb3JpdHkoUE9MSUNZIHBvbGljeSwgUFJJT1JJVFkgcHJpb3JpdHkpIHsKLSAgICBpbnQgcHRocmVhZF9wb2xpY3kgPSB0b1B0aHJlYWRQb2xpY3kocG9saWN5KTsKLSAgICBpbnQgbWluX3ByaW9yaXR5ID0gMDsKLSAgICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKKy8qKgorICogQ29udmVydHMgcmVsYXRpdmUgdGhyZWFkIHByaW9yaXRpZXMgdG8gYWJzb2x1dGUgdmFsdWUgYmFzZWQgb24gcG9zaXgKKyAqIHRocmVhZCBzY2hlZHVsZXIgcG9saWN5CisgKgorICogIFRoZSBpZGVhIGlzIHNpbXBseSB0byBkaXZpZGUgdXAgdGhlIHByaW9yaXR5IHJhbmdlIGZvciB0aGUgZ2l2ZW4gcG9saWN5CisgKiBpbnRvIHRoZSBjb3JyZXBzb25kaW5nIHJlbGF0aXZlIHByaW9yaXR5IGxldmVsIChsb3dlc3QuLmhpZ2hlc3QpIGFuZAorICogdGhlbiBwcm8tcmF0ZSBhY2NvcmRpbmdseS4KKyAqLworc3RhdGljIGludCB0b1B0aHJlYWRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3ksIFBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgcHJpb3JpdHkpIHsKKyAgaW50IHB0aHJlYWRfcG9saWN5ID0gdG9QdGhyZWFkUG9saWN5KHBvbGljeSk7CisgIGludCBtaW5fcHJpb3JpdHkgPSAwOworICBpbnQgbWF4X3ByaW9yaXR5ID0gMDsKICNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NSU4KLSAgICBtaW5fcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHB0aHJlYWRfcG9saWN5KTsKKyAgbWluX3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihwdGhyZWFkX3BvbGljeSk7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1NDSEVEX0dFVF9QUklPUklUWV9NQVgKLSAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHB0aHJlYWRfcG9saWN5KTsKKyAgbWF4X3ByaW9yaXR5ID0gc2NoZWRfZ2V0X3ByaW9yaXR5X21heChwdGhyZWFkX3BvbGljeSk7CiAjZW5kaWYKLSAgICBpbnQgcXVhbnRhID0gKEhJR0hFU1QgLSBMT1dFU1QpICsgMTsKLSAgICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChmbG9hdCkobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKKyAgaW50IHF1YW50YSA9IChQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QgLSBQb3NpeFRocmVhZEZhY3Rvcnk6OkxPV0VTVCkgKyAxOworICBmbG9hdCBzdGVwc3BlcnF1YW50YSA9IChmbG9hdCkobWF4X3ByaW9yaXR5IC0gbWluX3ByaW9yaXR5KSAvIHF1YW50YTsKIAotICAgIGlmIChwcmlvcml0eSA8PSBISUdIRVNUKSB7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBwcmlvcml0eSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZSBmb3IgcHJpb3JpdHkgaW5jcmVtZW50cy4KLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBOT1JNQUwpOwotICAgIH0KKyAgaWYgKHByaW9yaXR5IDw9IFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCkgeworICAgIHJldHVybiAoaW50KShtaW5fcHJpb3JpdHkgKyBzdGVwc3BlcnF1YW50YSAqIHByaW9yaXR5KTsKKyAgfSBlbHNlIHsKKyAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgZm9yIHByaW9yaXR5IGluY3JlbWVudHMuCisgICAgYXNzZXJ0KGZhbHNlKTsKKyAgICByZXR1cm4gKGludCkobWluX3ByaW9yaXR5ICsgc3RlcHNwZXJxdWFudGEgKiBQb3NpeFRocmVhZEZhY3Rvcnk6Ok5PUk1BTCk7CiAgIH0KK30KIAotIHB1YmxpYzoKLQotICBJbXBsKFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkKSA6CitQb3NpeFRocmVhZEZhY3Rvcnk6OlBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFkgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKICAgICBwb2xpY3lfKHBvbGljeSksCiAgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKLSAgICBzdGFja1NpemVfKHN0YWNrU2l6ZSksCi0gICAgZGV0YWNoZWRfKGRldGFjaGVkKSB7fQorICAgIHN0YWNrU2l6ZV8oc3RhY2tTaXplKSB7Cit9CiAKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUE9TSVggdGhyZWFkIHRvIHJ1biB0aGUgcnVubmFibGUgb2JqZWN0Ci0gICAqCi0gICAqIEBwYXJhbSBydW5uYWJsZSBBIHJ1bm5hYmxlIG9iamVjdAotICAgKi8KLSAgc2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgewotICAgIHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0ID0gc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksIHRvUHRocmVhZFByaW9yaXR5KHBvbGljeV8sIHByaW9yaXR5XyksIHN0YWNrU2l6ZV8sIGRldGFjaGVkXywgcnVubmFibGUpKTsKLSAgICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKLSAgICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQorUG9zaXhUaHJlYWRGYWN0b3J5OjpQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCkKKyAgOiBUaHJlYWRGYWN0b3J5KGRldGFjaGVkKSwKKyAgICBwb2xpY3lfKFJPVU5EX1JPQklOKSwKKyAgICBwcmlvcml0eV8oTk9STUFMKSwKKyAgICBzdGFja1NpemVfKDEpIHsKK30KIAotICBpbnQgZ2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gc3RhY2tTaXplXzsgfQorc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeworICBzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gcmVzdWx0CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9QdGhyZWFkUHJpb3JpdHkocG9saWN5XywgcHJpb3JpdHlfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGV0YWNoZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5uYWJsZSkpOworICByZXN1bHQtPndlYWtSZWYocmVzdWx0KTsKKyAgcnVubmFibGUtPnRocmVhZChyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQogCi0gIHZvaWQgc2V0U3RhY2tTaXplKGludCB2YWx1ZSkgeyBzdGFja1NpemVfID0gdmFsdWU7IH0KK2ludCBQb3NpeFRocmVhZEZhY3Rvcnk6OmdldFN0YWNrU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YWNrU2l6ZV87Cit9CiAKLSAgUFJJT1JJVFkgZ2V0UHJpb3JpdHkoKSBjb25zdCB7IHJldHVybiBwcmlvcml0eV87IH0KK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7CisgIHN0YWNrU2l6ZV8gPSB2YWx1ZTsKK30KIAotICAvKioKLSAgICogU2V0cyBwcmlvcml0eS4KLSAgICoKLSAgICogIFhYWAotICAgKiAgTmVlZCB0byBoYW5kbGUgaW5jcmVtZW50YWwgcHJpb3JpdGllcyBwcm9wZXJseS4KLSAgICovCi0gIHZvaWQgc2V0UHJpb3JpdHkoUFJJT1JJVFkgdmFsdWUpIHsgcHJpb3JpdHlfID0gdmFsdWU7IH0KK1Bvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIHByaW9yaXR5XzsKK30KIAotICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KK3ZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQUklPUklUWSB2YWx1ZSkgeworICBwcmlvcml0eV8gPSB2YWx1ZTsKK30KIAotICB2b2lkIHNldERldGFjaGVkKGJvb2wgdmFsdWUpIHsgZGV0YWNoZWRfID0gdmFsdWU7IH0KLQotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgewotCitUaHJlYWQ6OmlkX3QgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCB7CiAjaWZuZGVmIF9XSU4zMgotICAgIHJldHVybiAoVGhyZWFkOjppZF90KXB0aHJlYWRfc2VsZigpOworICByZXR1cm4gKFRocmVhZDo6aWRfdClwdGhyZWFkX3NlbGYoKTsKICNlbHNlCi0gICAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCkucDsKKyAgcmV0dXJuIChUaHJlYWQ6OmlkX3QpcHRocmVhZF9zZWxmKCkucDsKICNlbmRpZiAvLyBfV0lOMzIKK30KIAotICB9Ci0KLX07Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UG9zaXhUaHJlYWRGYWN0b3J5KFBPTElDWSBwb2xpY3ksIFBSSU9SSVRZIHByaW9yaXR5LCBpbnQgc3RhY2tTaXplLCBib29sIGRldGFjaGVkKSA6Ci0gIGltcGxfKG5ldyBQb3NpeFRocmVhZEZhY3Rvcnk6OkltcGwocG9saWN5LCBwcmlvcml0eSwgc3RhY2tTaXplLCBkZXRhY2hlZCkpIHt9Ci0KLXNoYXJlZF9wdHI8VGhyZWFkPiBQb3NpeFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gaW1wbF8tPm5ld1RocmVhZChydW5uYWJsZSk7IH0KLQotaW50IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldFN0YWNrU2l6ZSgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRTdGFja1NpemUoaW50IHZhbHVlKSB7IGltcGxfLT5zZXRTdGFja1NpemUodmFsdWUpOyB9Ci0KLVBvc2l4VGhyZWFkRmFjdG9yeTo6UFJJT1JJVFkgUG9zaXhUaHJlYWRGYWN0b3J5OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsgcmV0dXJuIGltcGxfLT5nZXRQcmlvcml0eSgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OlBSSU9SSVRZIHZhbHVlKSB7IGltcGxfLT5zZXRQcmlvcml0eSh2YWx1ZSk7IH0KLQotYm9vbCBQb3NpeFRocmVhZEZhY3Rvcnk6OmlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBpbXBsXy0+aXNEZXRhY2hlZCgpOyB9Ci0KLXZvaWQgUG9zaXhUaHJlYWRGYWN0b3J5OjpzZXREZXRhY2hlZChib29sIHZhbHVlKSB7IGltcGxfLT5zZXREZXRhY2hlZCh2YWx1ZSk7IH0KLQotVGhyZWFkOjppZF90IFBvc2l4VGhyZWFkRmFjdG9yeTo6Z2V0Q3VycmVudFRocmVhZElkKCkgY29uc3QgeyByZXR1cm4gaW1wbF8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOyB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKaW5kZXggZDZkODNhMy4uY2IzYjE3YyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaApAQCAtMjAsMTEgKzIwLDEzIEBACiAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfIDEKIAotI2luY2x1ZGUgIlRocmVhZC5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcwpAQCAtMzMsMjMgKzM1LDE4IEBACiAgKi8KIGNsYXNzIFBvc2l4VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKIAotIHB1YmxpYzoKLQorcHVibGljOgogICAvKioKICAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciBwb2xpY2llcwogICAgKi8KLSAgZW51bSBQT0xJQ1kgewotICAgIE9USEVSLAotICAgIEZJRk8sCi0gICAgUk9VTkRfUk9CSU4KLSAgfTsKKyAgZW51bSBQT0xJQ1kgeyBPVEhFUiwgRklGTywgUk9VTkRfUk9CSU4gfTsKIAogICAvKioKICAgICogUE9TSVggVGhyZWFkIHNjaGVkdWxlciByZWxhdGl2ZSBwcmlvcml0aWVzLAogICAgKgogICAgKiBBYnNvbHV0ZSBwcmlvcml0eSBpcyBkZXRlcm1pbmVkIGJ5IHNjaGVkdWxlciBwb2xpY3kgYW5kIE9TLiBUaGlzCiAgICAqIGVudW1lcmF0aW9uIHNwZWNpZmllcyByZWxhdGl2ZSBwcmlvcml0aWVzIHN1Y2ggdGhhdCBvbmUgY2FuIHNwZWNpZnkgYQotICAgKiBwcmlvcml0eSB3aXRoaW5nIGEgZ2l2aW5nIHNjaGVkdWxlciBwb2xpY3kgd2l0aG91dCBrbm93aW5nIHRoZSBhYnNvbHV0ZQorICAgKiBwcmlvcml0eSB3aXRoaW4gYSBnaXZpbmcgc2NoZWR1bGVyIHBvbGljeSB3aXRob3V0IGtub3dpbmcgdGhlIGFic29sdXRlCiAgICAqIHZhbHVlIG9mIHRoZSBwcmlvcml0eS4KICAgICovCiAgIGVudW0gUFJJT1JJVFkgewpAQCAtNjYsOSArNjMsOSBAQAogCiAgIC8qKgogICAgKiBQb3NpeCB0aHJlYWQgKHB0aHJlYWQpIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCisgICAqIHZpYSBzdGQ6OnNoYXJlZF9wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQgdGhlIFJ1bm5hYmxlIHRhc2tzIAorICAgKiB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byBib3RoIGlzCisgICAqIGdpdmVuIHVwLgogICAgKgogICAgKiBUaHJlYWRzIGFyZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBwb2xpY3ksIHByaW9yaXR5LCBzdGFjay1zaXplIGFuZCBkZXRhY2hhYmxlLW1vZGUKICAgICogZGV0YWNoZWQgbWVhbnMgdGhlIHRocmVhZCBpcyBmcmVlLXJ1bm5pbmcgYW5kIHdpbGwgcmVsZWFzZSBhbGwgc3lzdGVtIHJlc291cmNlcyB0aGUKQEAgLTc3LDI0ICs3NCwzNCBAQAogICAgKgogICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KICAgICovCisgIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5ID0gUk9VTkRfUk9CSU4sCisgICAgICAgICAgICAgICAgICAgICBQUklPUklUWSBwcmlvcml0eSA9IE5PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdGFja1NpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZXRhY2hlZCA9IHRydWUpOwogCi0gIFBvc2l4VGhyZWFkRmFjdG9yeShQT0xJQ1kgcG9saWN5PVJPVU5EX1JPQklOLCBQUklPUklUWSBwcmlvcml0eT1OT1JNQUwsIGludCBzdGFja1NpemU9MSwgYm9vbCBkZXRhY2hlZD10cnVlKTsKKyAgLyoqCisgICAqIFByb3ZpZGUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIGZhY3RvcmllcworICAgKiBUaGUgZGVmYXVsdCBwb2xpY3kgaXMgUE9MSUNZOjpST1VORF9ST0JJTi4KKyAgICogVGhlIGRlZmF1bHQgcHJpb3JpdHkgaXMgUFJJT1JJVFk6Ok5PUk1BTC4KKyAgICogVGhlIGRlZmF1bHQgc3RhY2tTaXplIGlzIDEuCisgICAqLworICBQb3NpeFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCk7CiAKICAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CiAKICAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwogICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7CiAKICAgLyoqCi0gICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgY3JlYXRlZCB0aHJlYWRzCisgICAqIEdldHMgc3RhY2sgc2l6ZSBmb3IgbmV3bHkgY3JlYXRlZCB0aHJlYWRzCiAgICAqCiAgICAqIEByZXR1cm4gaW50IHNpemUgaW4gbWVnYWJ5dGVzCiAgICAqLwogICB2aXJ0dWFsIGludCBnZXRTdGFja1NpemUoKSBjb25zdDsKIAogICAvKioKLSAgICogU2V0cyBzdGFjayBzaXplIGZvciBjcmVhdGVkIHRocmVhZHMKKyAgICogU2V0cyBzdGFjayBzaXplIGZvciBuZXdseSBjcmVhdGVkIHRocmVhZHMKICAgICoKICAgICogQHBhcmFtIHZhbHVlIHNpemUgaW4gbWVnYWJ5dGVzCiAgICAqLwpAQCAtMTEwLDIxICsxMTcsMTMgQEAKICAgICovCiAgIHZpcnR1YWwgdm9pZCBzZXRQcmlvcml0eShQUklPUklUWSBwcmlvcml0eSk7CiAKLSAgLyoqCi0gICAqIFNldHMgZGV0YWNoZWQgbW9kZSBvZiB0aHJlYWRzCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgc2V0RGV0YWNoZWQoYm9vbCBkZXRhY2hlZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCi0gICAqLwotICB2aXJ0dWFsIGJvb2wgaXNEZXRhY2hlZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgSW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbF87Citwcml2YXRlOgorICBQT0xJQ1kgcG9saWN5XzsKKyAgUFJJT1JJVFkgcHJpb3JpdHlfOworICBpbnQgc3RhY2tTaXplXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfUE9TSVhUSFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTW9uaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzYjIwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNb25pdG9yLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIE1vbml0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIHN0ZCB0aHJlYWQgbGlicmFyeQorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE1vbml0b3I6OkltcGwgeworCitwdWJsaWM6CisgIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQob3duZWRNdXRleF8uZ2V0KCkpOyB9CisKKyAgSW1wbChNdXRleCogbXV0ZXgpIDogb3duZWRNdXRleF8oKSwgY29uZGl0aW9uVmFyaWFibGVfKCksIG11dGV4XyhOVUxMKSB7IGluaXQobXV0ZXgpOyB9CisKKyAgSW1wbChNb25pdG9yKiBtb25pdG9yKSA6IG93bmVkTXV0ZXhfKCksIGNvbmRpdGlvblZhcmlhYmxlXygpLCBtdXRleF8oTlVMTCkgeworICAgIGluaXQoJihtb25pdG9yLT5tdXRleCgpKSk7CisgIH0KKworICBNdXRleCYgbXV0ZXgoKSB7IHJldHVybiAqbXV0ZXhfOyB9CisgIHZvaWQgbG9jaygpIHsgbXV0ZXhfLT5sb2NrKCk7IH0KKyAgdm9pZCB1bmxvY2soKSB7IG11dGV4Xy0+dW5sb2NrKCk7IH0KKworICAvKioKKyAgICogRXhjZXB0aW9uLXRocm93aW5nIHZlcnNpb24gb2Ygd2FpdEZvclRpbWVSZWxhdGl2ZSgpLCBjYWxsZWQgc2ltcGx5CisgICAqIHdhaXQoaW50NjQpIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBUaW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcy4KKyAgICoKKyAgICogSWYgdGhlIGNvbmRpdGlvbiBvY2N1cnMsICB0aGlzIGZ1bmN0aW9uIHJldHVybnMgY2xlYW5seTsgb24gdGltZW91dCBvcgorICAgKiBlcnJvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKi8KKyAgdm9pZCB3YWl0KGludDY0X3QgdGltZW91dF9tcykgeworICAgIGludCByZXN1bHQgPSB3YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOworICAgIGlmIChyZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkgeworICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSAwKSB7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKCJNb25pdG9yOjp3YWl0KCkgZmFpbGVkIik7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFdhaXRzIHVudGlsIHRoZSBzcGVjaWZpZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBjb25kaXRpb24gdG8KKyAgICogb2NjdXIsIG9yIHdhaXRzIGZvcmV2ZXIgaWYgdGltZW91dF9tcyA9PSAwLgorICAgKgorICAgKiBSZXR1cm5zIDAgaWYgY29uZGl0aW9uIG9jY3VycywgVEhSSUZUX0VUSU1FRE9VVCBvbiB0aW1lb3V0LCBvciBhbiBlcnJvciBjb2RlLgorICAgKi8KKyAgaW50IHdhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSB7CisgICAgaWYgKHRpbWVvdXRfbXMgPT0gMExMKSB7CisgICAgICByZXR1cm4gd2FpdEZvcmV2ZXIoKTsKKyAgICB9CisKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOworICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHModGltZW91dF9tcykpCisgICAgICAgICAgICAgICAgICAgICA9PSBzdGQ6OmN2X3N0YXR1czo6dGltZW91dCk7CisgICAgbG9jay5yZWxlYXNlKCk7CisgICAgcmV0dXJuICh0aW1lZG91dCA/IFRIUklGVF9FVElNRURPVVQgOiAwKTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KKyAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KKyAgICovCisgIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0ZW1wOworICAgIHRlbXAudHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjKTsKKyAgICB0ZW1wLnR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9uc2VjKSAvIDEwMDA7CisgICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKKyAgfQorCisgIC8qKgorICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCisgICAqLworICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIHsKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnR0aW1lOworICAgIFV0aWw6OnRvVGltZXZhbChjdXJyZW50dGltZSwgVXRpbDo6Y3VycmVudFRpbWUoKSk7CisKKyAgICBsb25nIHR2X3NlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3NlYyAtIGN1cnJlbnR0aW1lLnR2X3NlYyk7CisgICAgbG9uZyB0dl91c2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfdXNlYyAtIGN1cnJlbnR0aW1lLnR2X3VzZWMpOworICAgIGlmICh0dl9zZWMgPCAwKQorICAgICAgdHZfc2VjID0gMDsKKyAgICBpZiAodHZfdXNlYyA8IDApCisgICAgICB0dl91c2VjID0gMDsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOworICAgIGJvb2wgdGltZWRvdXQgPSAoY29uZGl0aW9uVmFyaWFibGVfLndhaXRfZm9yKGxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OnNlY29uZHModHZfc2VjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyh0dl91c2VjKSkKKyAgICAgICAgICAgICAgICAgICAgID09IHN0ZDo6Y3Zfc3RhdHVzOjp0aW1lb3V0KTsKKyAgICBsb2NrLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gKHRpbWVkb3V0ID8gVEhSSUZUX0VUSU1FRE9VVCA6IDApOworICB9CisKKyAgLyoqCisgICAqIFdhaXRzIGZvcmV2ZXIgdW50aWwgdGhlIGNvbmRpdGlvbiBvY2N1cnMuCisgICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBvciBhbiBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICovCisgIGludCB3YWl0Rm9yZXZlcigpIHsKKyAgICBhc3NlcnQobXV0ZXhfKTsKKyAgICBzdGQ6OnRpbWVkX211dGV4KiBtdXRleEltcGwgPSBzdGF0aWNfY2FzdDxzdGQ6OnRpbWVkX211dGV4Kj4obXV0ZXhfLT5nZXRVbmRlcmx5aW5nSW1wbCgpKTsKKyAgICBhc3NlcnQobXV0ZXhJbXBsKTsKKworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjp0aW1lZF9tdXRleD4gbG9jaygqbXV0ZXhJbXBsLCBzdGQ6OmFkb3B0X2xvY2spOworICAgIGNvbmRpdGlvblZhcmlhYmxlXy53YWl0KGxvY2spOworICAgIGxvY2sucmVsZWFzZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgdm9pZCBub3RpZnkoKSB7IGNvbmRpdGlvblZhcmlhYmxlXy5ub3RpZnlfb25lKCk7IH0KKworICB2b2lkIG5vdGlmeUFsbCgpIHsgY29uZGl0aW9uVmFyaWFibGVfLm5vdGlmeV9hbGwoKTsgfQorCitwcml2YXRlOgorICB2b2lkIGluaXQoTXV0ZXgqIG11dGV4KSB7IG11dGV4XyA9IG11dGV4OyB9CisKKyAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGVfYW55IGNvbmRpdGlvblZhcmlhYmxlXzsKKyAgTXV0ZXgqIG11dGV4XzsKK307CisKK01vbml0b3I6Ok1vbml0b3IoKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKCkpIHsKK30KK01vbml0b3I6Ok1vbml0b3IoTXV0ZXgqIG11dGV4KSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG11dGV4KSkgeworfQorTW9uaXRvcjo6TW9uaXRvcihNb25pdG9yKiBtb25pdG9yKSA6IGltcGxfKG5ldyBNb25pdG9yOjpJbXBsKG1vbml0b3IpKSB7Cit9CisKK01vbml0b3I6On5Nb25pdG9yKCkgeworICBkZWxldGUgaW1wbF87Cit9CisKK011dGV4JiBNb25pdG9yOjptdXRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bXV0ZXgoKTsKK30KKwordm9pZCBNb25pdG9yOjpsb2NrKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPmxvY2soKTsKK30KKwordm9pZCBNb25pdG9yOjp1bmxvY2soKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+dW5sb2NrKCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6d2FpdChpbnQ2NF90IHRpbWVvdXQpIGNvbnN0IHsKKyAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0KHRpbWVvdXQpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgVEhSSUZUX1RJTUVTUEVDKiBhYnN0aW1lKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lKGFic3RpbWUpOworfQorCitpbnQgTW9uaXRvcjo6d2FpdEZvclRpbWUoY29uc3QgdGltZXZhbCogYWJzdGltZSkgY29uc3QgeworICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKK30KKworaW50IE1vbml0b3I6OndhaXRGb3JUaW1lUmVsYXRpdmUoaW50NjRfdCB0aW1lb3V0X21zKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JUaW1lUmVsYXRpdmUodGltZW91dF9tcyk7Cit9CisKK2ludCBNb25pdG9yOjp3YWl0Rm9yZXZlcigpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvcmV2ZXIoKTsKK30KKwordm9pZCBNb25pdG9yOjpub3RpZnkoKSBjb25zdCB7CisgIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+bm90aWZ5KCk7Cit9CisKK3ZvaWQgTW9uaXRvcjo6bm90aWZ5QWxsKCkgY29uc3QgeworICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeUFsbCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjc5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIEMrKzExIHN0ZDo6dGltZWRfbXV0ZXgKKyAqCisgKiBNZXRob2RzIHRocm93IHN0ZDo6c3lzdGVtX2Vycm9yIG9uIGVycm9yLgorICoKKyAqIEB2ZXJzaW9uICRJZDokCisgKi8KK2NsYXNzIE11dGV4OjppbXBsIDogcHVibGljIHN0ZDo6dGltZWRfbXV0ZXgge307CisKK011dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbCgpKSB7CisgICgodm9pZClpbml0KTsKK30KKwordm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgeworICByZXR1cm4gaW1wbF8uZ2V0KCk7Cit9CisKK3ZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7CisgIGltcGxfLT5sb2NrKCk7Cit9CisKK2Jvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7CisgIHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsKK30KKworYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKKyAgcmV0dXJuIGltcGxfLT50cnlfbG9ja19mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhtcykpOworfQorCit2b2lkIE11dGV4Ojp1bmxvY2soKSBjb25zdCB7CisgIGltcGxfLT51bmxvY2soKTsKK30KKwordm9pZCBNdXRleDo6REVGQVVMVF9JTklUSUFMSVpFUih2b2lkKiBhcmcpIHsKKyAgKCh2b2lkKWFyZyk7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODVmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpZiBVU0VfU1REX1RIUkVBRAorCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisKKy8qKgorICogVGhlIEMrKzExIHRocmVhZCBjbGFzcy4KKyAqCisgKiBOb3RlIHRoYXQgd2UgdXNlIGJvb3N0IHNoYXJlZF9wdHIgcmF0aGVyIHRoYW4gc3RkIHNoYXJlZF9wdHJzIGhlcmUKKyAqIGJlY2F1c2UgdGhlIFRocmVhZC9SdW5uYWJsZSBjbGFzc2VzIHVzZSB0aG9zZSBhbmQgd2UgZG9uJ3Qgd2FudCB0bworICogbWl4IHRoZW0uCisgKgorICogQHZlcnNpb24gJElkOiQKKyAqLworY2xhc3MgU3RkVGhyZWFkIDogcHVibGljIFRocmVhZCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RkVGhyZWFkPiB7CitwdWJsaWM6CisgIGVudW0gU1RBVEUgeyB1bmluaXRpYWxpemVkLCBzdGFydGluZywgc3RhcnRlZCwgc3RvcHBpbmcsIHN0b3BwZWQgfTsKKworICBzdGF0aWMgdm9pZCB0aHJlYWRNYWluKHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4gdGhyZWFkXzsKKyAgTW9uaXRvciBtb25pdG9yXzsKKyAgU1RBVEUgc3RhdGVfOworICBib29sIGRldGFjaGVkXzsKKworcHVibGljOgorICBTdGRUaHJlYWQoYm9vbCBkZXRhY2hlZCwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKKyAgICA6IHN0YXRlXyh1bmluaXRpYWxpemVkKSwgZGV0YWNoZWRfKGRldGFjaGVkKSB7CisgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7CisgIH0KKworICB+U3RkVGhyZWFkKCkgeworICAgIGlmICghZGV0YWNoZWRfICYmIHRocmVhZF8tPmpvaW5hYmxlKCkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGpvaW4oKTsKKyAgICAgIH0gY2F0Y2ggKC4uLikgeworICAgICAgICAvLyBXZSdyZSByZWFsbHkgaG9zZWQuCisgICAgICB9CisgICAgfQorICB9CisKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCisgIHZvaWQgc3RhcnQoKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHNlbGZSZWYgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgc2V0U3RhdGUoc3RhcnRpbmcpOworCisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHRocmVhZF8gPSBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp0aHJlYWQ+KG5ldyBzdGQ6OnRocmVhZCh0aHJlYWRNYWluLCBzZWxmUmVmKSk7CisKKyAgICBpZiAoZGV0YWNoZWRfKQorICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7CisgICAgCisgICAgLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydCBhbmQgZ2V0IGZhciBlbm91Z2ggdG8gZ3JhYiBldmVyeXRoaW5nCisgICAgLy8gdGhhdCBpdCBuZWVkcyBmcm9tIHRoZSBjYWxsaW5nIGNvbnRleHQsIHRodXMgYWJzb2x2aW5nIHRoZSBjYWxsZXIKKyAgICAvLyBmcm9tIGJlaW5nIHJlcXVpcmVkIHRvIGhvbGQgb24gdG8gcnVubmFibGUgaW5kZWZpbml0ZWx5LgorICAgIG1vbml0b3JfLndhaXQoKTsKKyAgfQorCisgIHZvaWQgam9pbigpIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiBzdGF0ZV8gIT0gdW5pbml0aWFsaXplZCkgeworICAgICAgdGhyZWFkXy0+am9pbigpOworICAgIH0KKyAgfQorCisgIFRocmVhZDo6aWRfdCBnZXRJZCgpIHsgcmV0dXJuIHRocmVhZF8uZ2V0KCkgPyB0aHJlYWRfLT5nZXRfaWQoKSA6IHN0ZDo6dGhyZWFkOjppZCgpOyB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQorCisgIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQorfTsKKwordm9pZCBTdGRUaHJlYWQ6OnRocmVhZE1haW4oc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gdGhyZWFkKSB7CisjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKKyAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOworI2VuZGlmCisKKyAgdGhyZWFkLT5zZXRTdGF0ZShzdGFydGVkKTsKKyAgdGhyZWFkLT5ydW5uYWJsZSgpLT5ydW4oKTsKKworICBpZiAodGhyZWFkLT5nZXRTdGF0ZSgpICE9IHN0b3BwaW5nICYmIHRocmVhZC0+Z2V0U3RhdGUoKSAhPSBzdG9wcGVkKSB7CisgICAgdGhyZWFkLT5zZXRTdGF0ZShzdG9wcGluZyk7CisgIH0KK30KKworU3RkVGhyZWFkRmFjdG9yeTo6U3RkVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKSA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpIHsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gU3RkVGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gcmVzdWx0ID0gc3RkOjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4obmV3IFN0ZFRocmVhZChpc0RldGFjaGVkKCksIHJ1bm5hYmxlKSk7CisgIHJ1bm5hYmxlLT50aHJlYWQocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVGhyZWFkOjppZF90IFN0ZFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vIFVTRV9TVERfVEhSRUFECmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzQwNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfCisjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfU1REVEhSRUFERkFDVE9SWV9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworCisvKioKKyAqIEEgdGhyZWFkIGZhY3RvcnkgdG8gY3JlYXRlIHN0ZDo6dGhyZWFkcy4KKyAqCisgKiBAdmVyc2lvbiAkSWQ6JAorICovCitjbGFzcyBTdGRUaHJlYWRGYWN0b3J5IDogcHVibGljIFRocmVhZEZhY3RvcnkgeworCitwdWJsaWM6CisgIC8qKgorICAgKiBTdGQgdGhyZWFkIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKKyAgICogdmlhIHN0ZDo6c2hhcmVkX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZCB0aGUgUnVubmFibGUgdGFza3MKKyAgICogdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKKyAgICogdG8gYm90aCBpcyBnaXZlbiB1cC4KKyAgICoKKyAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCisgICAqLworCisgIFN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCA9IHRydWUpOworCisgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OworCisgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKKyAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OworfTsKKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9TVERUSFJFQURGQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxNjRkZjBjLi5iMmVhNGUyCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKQEAgLTIxLDIyICsyMSwyMSBAQAogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXyAxCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotI2VuZGlmCi0KKyNpZiBVU0VfU1REX1RIUkVBRAorI2luY2x1ZGUgPHRocmVhZD4KKyNlbHNlCiAjaWZkZWYgSEFWRV9QVEhSRUFEX0gKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjZW5kaWYKKyNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogY2xhc3MgVGhyZWFkOwogCkBAIC00NywyNCArNDYsMjQgQEAKICAqLwogY2xhc3MgUnVubmFibGUgewogCi0gcHVibGljOgotICB2aXJ0dWFsIH5SdW5uYWJsZSgpIHt9OworcHVibGljOgorICB2aXJ0dWFsIH5SdW5uYWJsZSgpe307CiAgIHZpcnR1YWwgdm9pZCBydW4oKSA9IDA7CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIHRocmVhZCBvYmplY3QgdGhhdCBpcyBob3N0aW5nIHRoaXMgcnVubmFibGUgb2JqZWN0ICAtIGNhbiByZXR1cm4KLSAgICogYW4gZW1wdHkgYm9vc3Q6OnNoYXJlZCBwb2ludGVyIGlmIG5vIHJlZmVyZW5jZXMgcmVtYWluIG9uIHRoZXQgdGhyZWFkICBvYmplY3QKKyAgICogYW4gZW1wdHkgYm9vc3Q6OnNoYXJlZCBwb2ludGVyIGlmIG5vIHJlZmVyZW5jZXMgcmVtYWluIG9uIHRoYXQgdGhyZWFkIG9iamVjdAogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF8ubG9jaygpOyB9CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkKCkgeyByZXR1cm4gdGhyZWFkXy5sb2NrKCk7IH0KIAogICAvKioKICAgICogU2V0cyB0aGUgdGhyZWFkIHRoYXQgaXMgZXhlY3V0aW5nIHRoaXMgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IG1lYW50IGZvcgogICAgKiB1c2UgYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KKyAgdmlydHVhbCB2b2lkIHRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB2YWx1ZSkgeyB0aHJlYWRfID0gdmFsdWU7IH0KIAotIHByaXZhdGU6Ci0gIGJvb3N0Ojp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87Citwcml2YXRlOgorICBzdGQ6OndlYWtfcHRyPFRocmVhZD4gdGhyZWFkXzsKIH07CiAKIC8qKgpAQCAtNzgsMjAgKzc3LDIwIEBACiAgKi8KIGNsYXNzIFRocmVhZCB7CiAKLSBwdWJsaWM6CitwdWJsaWM6CisjaWYgVVNFX1NURF9USFJFQUQKKyAgdHlwZWRlZiBzdGQ6OnRocmVhZDo6aWQgaWRfdDsKIAotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLSAgdHlwZWRlZiBib29zdDo6dGhyZWFkOjppZCBpZF90OwotCi0gIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBib29zdDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9Ci0gIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KKyAgc3RhdGljIGlubGluZSBib29sIGlzX2N1cnJlbnQoaWRfdCB0KSB7IHJldHVybiB0ID09IHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9CisgIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIHN0ZDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9CiAjZWxzZQogICB0eXBlZGVmIHB0aHJlYWRfdCBpZF90OworCiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gcHRocmVhZF9lcXVhbChwdGhyZWFkX3NlbGYoKSwgdCk7IH0KICAgc3RhdGljIGlubGluZSBpZF90IGdldF9jdXJyZW50KCkgeyByZXR1cm4gcHRocmVhZF9zZWxmKCk7IH0KICNlbmRpZgogCi0gIHZpcnR1YWwgflRocmVhZCgpIHt9OworICB2aXJ0dWFsIH5UaHJlYWQoKXt9OwogCiAgIC8qKgogICAgKiBTdGFydHMgdGhlIHRocmVhZC4gRG9lcyBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWQgY3JlYXRpb24gYW5kCkBAIC0xMDEsOCArMTAwLDkgQEAKICAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOwogCiAgIC8qKgotICAgKiBKb2luIHRoaXMgdGhyZWFkLiBDdXJyZW50IHRocmVhZCBibG9ja3MgdW50aWwgdGhpcyB0YXJnZXQgdGhyZWFkCi0gICAqIGNvbXBsZXRlcy4KKyAgICogSm9pbiB0aGlzIHRocmVhZC4gSWYgdGhpcyB0aHJlYWQgaXMgam9pbmFibGUsIHRoZSBjYWxsaW5nIHRocmVhZCBibG9ja3MKKyAgICogdW50aWwgdGhpcyB0aHJlYWQgY29tcGxldGVzLiAgSWYgdGhlIHRhcmdldCB0aHJlYWQgaXMgbm90IGpvaW5hYmxlLCB0aGVuCisgICAqIG5vdGhpbmcgaGFwcGVucy4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBqb2luKCkgPSAwOwogCkBAIC0xMTQsMTQgKzExNCwxMyBAQAogICAvKioKICAgICogR2V0cyB0aGUgcnVubmFibGUgb2JqZWN0IHRoaXMgdGhyZWFkIGlzIGhvc3RpbmcKICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gX3J1bm5hYmxlOyB9CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9ydW5uYWJsZTsgfQogCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgcnVubmFibGUoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IF9ydW5uYWJsZSA9IHZhbHVlOyB9Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IF9ydW5uYWJsZSA9IHZhbHVlOyB9CiAKLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOwotCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IF9ydW5uYWJsZTsKIH07CiAKIC8qKgpAQCAtMTI5LDE4ICsxMjgsNDMgQEAKICAqIG9iamVjdCBmb3IgZXhlY3V0aW9uCiAgKi8KIGNsYXNzIFRocmVhZEZhY3RvcnkgeworcHJvdGVjdGVkOgorICBUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQpIDogZGV0YWNoZWRfKGRldGFjaGVkKSB7IH0KIAotIHB1YmxpYzoKLSAgdmlydHVhbCB+VGhyZWFkRmFjdG9yeSgpIHt9Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCA9IDA7CitwdWJsaWM6CisgIHZpcnR1YWwgflRocmVhZEZhY3RvcnkoKSB7IH0KIAotICAvKiogR2V0cyB0aGUgY3VycmVudCB0aHJlYWQgaWQgb3IgdW5rbm93bl90aHJlYWRfaWQgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHRocmlmdCB0aHJlYWQgKi8KKyAgLyoqCisgICAqIEdldHMgY3VycmVudCBkZXRhY2hlZCBtb2RlCisgICAqLworICBib29sIGlzRGV0YWNoZWQoKSBjb25zdCB7IHJldHVybiBkZXRhY2hlZF87IH0KIAorICAvKioKKyAgICogU2V0cyB0aGUgZGV0YWNoZWQgZGlzcG9zaXRpb24gb2YgbmV3bHkgY3JlYXRlZCB0aHJlYWRzLgorICAgKi8KKyAgdm9pZCBzZXREZXRhY2hlZChib29sIGRldGFjaGVkKSB7IGRldGFjaGVkXyA9IGRldGFjaGVkOyB9CisKKyAgLyoqCisgICAqIENyZWF0ZSBhIG5ldyB0aHJlYWQuCisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEdldHMgdGhlIGN1cnJlbnQgdGhyZWFkIGlkIG9yIHVua25vd25fdGhyZWFkX2lkIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB0aHJpZnQgdGhyZWFkCisgICAqLworICB2aXJ0dWFsIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdCA9IDA7CisKKyAgLyoqCisgICAqIEZvciBjb2RlIHJlYWRhYmlsaXR5IGRlZmluZSB0aGUgdW5rbm93bi91bmRlZmluZWQgdGhyZWFkIGlkCisgICAqLwogICBzdGF0aWMgY29uc3QgVGhyZWFkOjppZF90IHVua25vd25fdGhyZWFkX2lkOwogCi0gIHZpcnR1YWwgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0ID0gMDsKK3ByaXZhdGU6CisgIGJvb2wgZGV0YWNoZWRfOwogfTsKIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAppbmRleCBiNzU2YmYxLi41ODAyNWY5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCkBAIC0xNywyOSArMTcsMjUgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCi0jaW5jbHVkZSAiVGhyZWFkTWFuYWdlci5oIgotI2luY2x1ZGUgIkV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgIk1vbml0b3IuaCIKLSNpbmNsdWRlICJVdGlsLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPHNldD4KIAotI2lmIGRlZmluZWQoREVCVUcpCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jZW5kaWYgLy9kZWZpbmVkKERFQlVHKQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwogCiAvKioKICAqIFRocmVhZE1hbmFnZXIgY2xhc3MKQEAgLTQ5LDQwICs0NSw0MiBAQAogICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAogICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzLgogICoKKyAqIFRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgbW9uaXRvcnMgdXNlZCBmb3Igc2lnbmFsaW5nIGRpZmZlcmVudCBjb25kaXRpb25zCisgKiBob3dldmVyIHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lIG11dGV4Xy4KKyAqCiAgKiBAdmVyc2lvbiAkSWQ6JAogICovCi1jbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsIDogcHVibGljIFRocmVhZE1hbmFnZXIgIHsKK2NsYXNzIFRocmVhZE1hbmFnZXI6OkltcGwgOiBwdWJsaWMgVGhyZWFkTWFuYWdlciB7CiAKLSBwdWJsaWM6Ci0gIEltcGwoKSA6Ci0gICAgd29ya2VyQ291bnRfKDApLAotICAgIHdvcmtlck1heENvdW50XygwKSwKLSAgICBpZGxlQ291bnRfKDApLAotICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKDApLAotICAgIGV4cGlyZWRDb3VudF8oMCksCi0gICAgc3RhdGVfKFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpLAotICAgIG1vbml0b3JfKCZtdXRleF8pLAotICAgIG1heE1vbml0b3JfKCZtdXRleF8pIHt9CitwdWJsaWM6CisgIEltcGwoKQorICAgIDogd29ya2VyQ291bnRfKDApLAorICAgICAgd29ya2VyTWF4Q291bnRfKDApLAorICAgICAgaWRsZUNvdW50XygwKSwKKyAgICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfKDApLAorICAgICAgZXhwaXJlZENvdW50XygwKSwKKyAgICAgIHN0YXRlXyhUaHJlYWRNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKKyAgICAgIG1vbml0b3JfKCZtdXRleF8pLAorICAgICAgbWF4TW9uaXRvcl8oJm11dGV4XyksCisgICAgICB3b3JrZXJNb25pdG9yXygmbXV0ZXhfKSB7fQogCiAgIH5JbXBsKCkgeyBzdG9wKCk7IH0KIAogICB2b2lkIHN0YXJ0KCk7CisgIHZvaWQgc3RvcCgpOwogCi0gIHZvaWQgc3RvcCgpIHsgc3RvcEltcGwoZmFsc2UpOyB9Ci0KLSAgdm9pZCBqb2luKCkgeyBzdG9wSW1wbCh0cnVlKTsgfQotCi0gIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlKCkgY29uc3QgewotICAgIHJldHVybiBzdGF0ZV87Ci0gIH0KKyAgVGhyZWFkTWFuYWdlcjo6U1RBVEUgc3RhdGUoKSBjb25zdCB7IHJldHVybiBzdGF0ZV87IH0KIAogICBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICByZXR1cm4gdGhyZWFkRmFjdG9yeV87CiAgIH0KIAogICB2b2lkIHRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgaWYgKHRocmVhZEZhY3RvcnlfICYmIHRocmVhZEZhY3RvcnlfLT5pc0RldGFjaGVkKCkgIT0gdmFsdWUtPmlzRGV0YWNoZWQoKSkgeworICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQogICAgIHRocmVhZEZhY3RvcnlfID0gdmFsdWU7CiAgIH0KIApAQCAtOTAsNTYgKzg4LDY4IEBACiAKICAgdm9pZCByZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKTsKIAotICBzaXplX3QgaWRsZVdvcmtlckNvdW50KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlQ291bnRfOwotICB9CisgIHNpemVfdCBpZGxlV29ya2VyQ291bnQoKSBjb25zdCB7IHJldHVybiBpZGxlQ291bnRfOyB9CiAKICAgc2l6ZV90IHdvcmtlckNvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHdvcmtlckNvdW50XzsKICAgfQogCiAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50KCkgY29uc3QgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKKyAgICBHdWFyZCBnKG11dGV4Xyk7CiAgICAgcmV0dXJuIHRhc2tzXy5zaXplKCk7CiAgIH0KIAogICBzaXplX3QgdG90YWxUYXNrQ291bnQoKSBjb25zdCB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICAgIEd1YXJkIGcobXV0ZXhfKTsKICAgICByZXR1cm4gdGFza3NfLnNpemUoKSArIHdvcmtlckNvdW50XyAtIGlkbGVDb3VudF87CiAgIH0KIAogICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCgpIGNvbnN0IHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHJldHVybiBwZW5kaW5nVGFza0NvdW50TWF4XzsKICAgfQogCiAgIHNpemVfdCBleHBpcmVkVGFza0NvdW50KCkgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBzaXplX3QgcmVzdWx0ID0gZXhwaXJlZENvdW50XzsKLSAgICBleHBpcmVkQ291bnRfID0gMDsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gZXhwaXJlZENvdW50XzsKICAgfQogCiAgIHZvaWQgcGVuZGluZ1Rhc2tDb3VudE1heChjb25zdCBzaXplX3QgdmFsdWUpIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgICAgR3VhcmQgZyhtdXRleF8pOwogICAgIHBlbmRpbmdUYXNrQ291bnRNYXhfID0gdmFsdWU7CiAgIH0KIAotICBib29sIGNhblNsZWVwKCk7Ci0KICAgdm9pZCBhZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsIGludDY0X3QgdGltZW91dCwgaW50NjRfdCBleHBpcmF0aW9uKTsKIAogICB2b2lkIHJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKIAogICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpOwogCi0gIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCk7CisgIHZvaWQgcmVtb3ZlRXhwaXJlZFRhc2tzKCkgeworICAgIHJlbW92ZUV4cGlyZWQoZmFsc2UpOworICB9CiAKICAgdm9pZCBzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjayk7CiAKIHByaXZhdGU6Ci0gIHZvaWQgc3RvcEltcGwoYm9vbCBqb2luKTsKKyAgLyoqCisgICAqIFJlbW92ZSBvbmUgb3IgbW9yZSBleHBpcmVkIHRhc2tzLgorICAgKiBccGFyYW1baW5dICBqdXN0T25lICBpZiB0cnVlLCB0cnkgdG8gcmVtb3ZlIGp1c3Qgb25lIHRhc2sgYW5kIHJldHVybgorICAgKi8KKyAgdm9pZCByZW1vdmVFeHBpcmVkKGJvb2wganVzdE9uZSk7CisKKyAgLyoqCisgICAqIFxyZXR1cm5zIHdoZXRoZXIgaXQgaXMgYWNjZXB0YWJsZSB0byBibG9jaywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHRocmVhZCBpZAorICAgKi8KKyAgYm9vbCBjYW5TbGVlcCgpIGNvbnN0OworCisgIC8qKgorICAgKiBMb3dlcnMgdGhlIG1heGltdW0gd29ya2VyIGNvdW50IGFuZCBibG9ja3MgdW50aWwgZW5vdWdoIHdvcmtlciB0aHJlYWRzIGNvbXBsZXRlCisgICAqIHRvIGdldCB0byB0aGUgbmV3IG1heGltdW0gd29ya2VyIGxpbWl0LiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYWNxdWlyaW5nCisgICAqIGEgbG9jayBvbiB0aGUgY2xhc3MgbXV0ZXhfLgorICAgKi8KKyAgdm9pZCByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHNpemVfdCB2YWx1ZSk7CiAKICAgc2l6ZV90IHdvcmtlckNvdW50XzsKICAgc2l6ZV90IHdvcmtlck1heENvdW50XzsKQEAgLTE1MSwxMyArMTYxLDEzIEBACiAgIFRocmVhZE1hbmFnZXI6OlNUQVRFIHN0YXRlXzsKICAgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKIAotCiAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpUYXNrOwotICBzdGQ6OnF1ZXVlPHNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrc187CisgIHR5cGVkZWYgc3RkOjpkZXF1ZTxzaGFyZWRfcHRyPFRhc2s+ID4gVGFza1F1ZXVlOworICBUYXNrUXVldWUgdGFza3NfOwogICBNdXRleCBtdXRleF87CiAgIE1vbml0b3IgbW9uaXRvcl87CiAgIE1vbml0b3IgbWF4TW9uaXRvcl87Ci0gIE1vbml0b3Igd29ya2VyTW9uaXRvcl87CisgIE1vbml0b3Igd29ya2VyTW9uaXRvcl87ICAgICAgIC8vIHVzZWQgdG8gc3luY2hyb25pemUgY2hhbmdlcyBpbiB3b3JrZXIgY291bnQKIAogICBmcmllbmQgY2xhc3MgVGhyZWFkTWFuYWdlcjo6V29ya2VyOwogICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB3b3JrZXJzXzsKQEAgLTE2NywxOCArMTc3LDEzIEBACiAKIGNsYXNzIFRocmVhZE1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogCi0gcHVibGljOgotICBlbnVtIFNUQVRFIHsKLSAgICBXQUlUSU5HLAotICAgIEVYRUNVVElORywKLSAgICBDQU5DRUxMRUQsCi0gICAgQ09NUExFVEUKLSAgfTsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgVElNRURPVVQsIENPTVBMRVRFIH07CiAKLSAgVGFzayhzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSwgaW50NjRfdCBleHBpcmF0aW9uPTBMTCkgIDoKLSAgICBydW5uYWJsZV8ocnVubmFibGUpLAotICAgIHN0YXRlXyhXQUlUSU5HKSwKLSAgICBleHBpcmVUaW1lXyhleHBpcmF0aW9uICE9IDBMTCA/IFV0aWw6OmN1cnJlbnRUaW1lKCkgKyBleHBpcmF0aW9uIDogMExMKSB7fQorICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlLCBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpCisgICAgOiBydW5uYWJsZV8ocnVubmFibGUpLAorICAgICAgc3RhdGVfKFdBSVRJTkcpLAorICAgICAgZXhwaXJlVGltZV8oZXhwaXJhdGlvbiAhPSAwTEwgPyBVdGlsOjpjdXJyZW50VGltZSgpICsgZXhwaXJhdGlvbiA6IDBMTCkge30KIAogICB+VGFzaygpIHt9CiAKQEAgLTE4OSw0NiArMTk0LDMyIEBACiAgICAgfQogICB9CiAKLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gZ2V0UnVubmFibGUoKSB7Ci0gICAgcmV0dXJuIHJ1bm5hYmxlXzsKLSAgfQorICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBnZXRSdW5uYWJsZSgpIHsgcmV0dXJuIHJ1bm5hYmxlXzsgfQogCi0gIGludDY0X3QgZ2V0RXhwaXJlVGltZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZXhwaXJlVGltZV87Ci0gIH0KKyAgaW50NjRfdCBnZXRFeHBpcmVUaW1lKCkgY29uc3QgeyByZXR1cm4gZXhwaXJlVGltZV87IH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CiAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXI7CiAgIFNUQVRFIHN0YXRlXzsKICAgaW50NjRfdCBleHBpcmVUaW1lXzsKIH07CiAKLWNsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlcjogcHVibGljIFJ1bm5hYmxlIHsKLSAgZW51bSBTVEFURSB7Ci0gICAgVU5JTklUSUFMSVpFRCwKLSAgICBTVEFSVElORywKLSAgICBTVEFSVEVELAotICAgIFNUT1BQSU5HLAotICAgIFNUT1BQRUQKLSAgfTsKK2NsYXNzIFRocmVhZE1hbmFnZXI6OldvcmtlciA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKIAotIHB1YmxpYzoKLSAgV29ya2VyKFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXIpIDoKLSAgICBtYW5hZ2VyXyhtYW5hZ2VyKSwKLSAgICBzdGF0ZV8oVU5JTklUSUFMSVpFRCksCi0gICAgaWRsZV8oZmFsc2UpIHt9CitwdWJsaWM6CisgIFdvcmtlcihUaHJlYWRNYW5hZ2VyOjpJbXBsKiBtYW5hZ2VyKSA6IG1hbmFnZXJfKG1hbmFnZXIpLCBzdGF0ZV8oVU5JTklUSUFMSVpFRCkge30KIAogICB+V29ya2VyKCkge30KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBib29sIGlzQWN0aXZlKCkgY29uc3QgewotICAgIHJldHVybgotICAgICAgKG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPD0gbWFuYWdlcl8tPndvcmtlck1heENvdW50XykgfHwKLSAgICAgIChtYW5hZ2VyXy0+c3RhdGVfID09IEpPSU5JTkcgJiYgIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSk7CisgICAgcmV0dXJuIChtYW5hZ2VyXy0+d29ya2VyQ291bnRfIDw9IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pCisgICAgICAgICAgIHx8IChtYW5hZ2VyXy0+c3RhdGVfID09IEpPSU5JTkcgJiYgIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSk7CiAgIH0KIAotIHB1YmxpYzoKK3B1YmxpYzoKICAgLyoqCiAgICAqIFdvcmtlciBlbnRyeSBwb2ludAogICAgKgpAQCAtMjM2LDMyOCArMjI3LDMzOCBAQAogICAgKiBleGVjdXRlLgogICAgKi8KICAgdm9pZCBydW4oKSB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBib29sIG5vdGlmeU1hbmFnZXIgPSBmYWxzZTsKKyAgICBHdWFyZCBnKG1hbmFnZXJfLT5tdXRleF8pOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaGFzIHRocmVlIHBhcnRzOyBvbmUgaXMgdG8gY2hlY2sgZm9yIGFuZCBhY2NvdW50IGZvcgorICAgICAqIGFkbWl0dGluZyBhIHRhc2sgd2hpY2ggaGFwcGVucyB1bmRlciBhIGxvY2suICBUaGVuIHRoZSBsb2NrIGlzIHJlbGVhc2VkCisgICAgICogYW5kIHRoZSB0YXNrIGl0c2VsZiBpcyBleGVjdXRlZC4gIEZpbmFsbHkgd2UgZG8gc29tZSBhY2NvdW50aW5nCisgICAgICogdW5kZXIgbG9jayBhZ2FpbiB3aGVuIHRoZSB0YXNrIGNvbXBsZXRlcy4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEFkbWl0dGluZworICAgICAqLwogCiAgICAgLyoqCiAgICAgICogSW5jcmVtZW50IHdvcmtlciBzZW1hcGhvcmUgYW5kIG5vdGlmeSBtYW5hZ2VyIGlmIHdvcmtlciBjb3VudCByZWFjaGVkCiAgICAgICogZGVzaXJlZCBtYXgKLSAgICAgKgotICAgICAqIE5vdGU6IFdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgbW9uaXRvciBhbmQgYWNxdWlyZSB0aGUgd29ya2VyTW9uaXRvcgotICAgICAqIHNpbmNlIHRoYXQgaXMgd2hhdCB0aGUgbWFuYWdlciBibG9ja3Mgb24gZm9yIHdvcmtlciBhZGQvcmVtb3ZlCiAgICAgICovCi0gICAgewotICAgICAgU3luY2hyb25pemVkIHMobWFuYWdlcl8tPm1vbml0b3JfKTsKLSAgICAgIGFjdGl2ZSA9IG1hbmFnZXJfLT53b3JrZXJDb3VudF8gPCBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfOwotICAgICAgaWYgKGFjdGl2ZSkgewotICAgICAgICBtYW5hZ2VyXy0+d29ya2VyQ291bnRfKys7Ci0gICAgICAgIG5vdGlmeU1hbmFnZXIgPSBtYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG5vdGlmeU1hbmFnZXIpIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXyk7Ci0gICAgICBtYW5hZ2VyXy0+d29ya2VyTW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICBub3RpZnlNYW5hZ2VyID0gZmFsc2U7Ci0gICAgfQotCi0gICAgd2hpbGUgKGFjdGl2ZSkgewotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrOwotCi0gICAgICAvKioKLSAgICAgICAqIFdoaWxlIGhvbGRpbmcgbWFuYWdlciBtb25pdG9yIGJsb2NrIGZvciBub24tZW1wdHkgdGFzayBxdWV1ZSAoQWxzbwotICAgICAgICogY2hlY2sgdGhhdCB0aGUgdGhyZWFkIGhhc24ndCBiZWVuIHJlcXVlc3RlZCB0byBzdG9wKS4gT25jZSB0aGUgcXVldWUKLSAgICAgICAqIGlzIG5vbi1lbXB0eSwgZGVxdWV1ZSBhIHRhc2ssIHJlbGVhc2UgbW9uaXRvciwgYW5kIGV4ZWN1dGUuIElmIHRoZQotICAgICAgICogd29ya2VyIG1heCBjb3VudCBoYXMgYmVlbiBkZWNyZW1lbnRlZCBzdWNoIHRoYXQgd2UgZXhjZWVkIGl0LCBtYXJrCi0gICAgICAgKiBvdXJzZWxmIGluYWN0aXZlLCBkZWNyZW1lbnQgdGhlIHdvcmtlciBjb3VudCBhbmQgbm90aWZ5IHRoZSBtYW5hZ2VyCi0gICAgICAgKiAodGVjaG5pY2FsbHkgd2UncmUgbm90aWZ5aW5nIHRoZSBuZXh0IGJsb2NrZWQgdGhyZWFkIGJ1dCBldmVudHVhbGx5Ci0gICAgICAgKiB0aGUgbWFuYWdlciB3aWxsIHNlZSBpdC4KLSAgICAgICAqLwotICAgICAgewotICAgICAgICBHdWFyZCBnKG1hbmFnZXJfLT5tdXRleF8pOwotICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOwotCi0gICAgICAgIHdoaWxlIChhY3RpdmUgJiYgbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8rKzsKLSAgICAgICAgICBpZGxlXyA9IHRydWU7Ci0gICAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQoKTsKLSAgICAgICAgICBhY3RpdmUgPSBpc0FjdGl2ZSgpOwotICAgICAgICAgIGlkbGVfID0gZmFsc2U7Ci0gICAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8tLTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3RpdmUpIHsKLSAgICAgICAgICBtYW5hZ2VyXy0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7Ci0KLSAgICAgICAgICBpZiAoIW1hbmFnZXJfLT50YXNrc18uZW1wdHkoKSkgewotICAgICAgICAgICAgdGFzayA9IG1hbmFnZXJfLT50YXNrc18uZnJvbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18ucG9wKCk7Ci0gICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlRhc2s6OldBSVRJTkcpIHsKLSAgICAgICAgICAgICAgdGFzay0+c3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyB0YXNrIG1heCBhbmQgd2UganVzdCBkcm9wcGVkIGJlbG93IGl0LCB3YWtldXAgYW55Ci0gICAgICAgICAgICAgICB0aHJlYWQgdGhhdCBtaWdodCBiZSBibG9ja2VkIG9uIGFkZC4gKi8KLSAgICAgICAgICAgIGlmIChtYW5hZ2VyXy0+cGVuZGluZ1Rhc2tDb3VudE1heF8gIT0gMCAmJgotICAgICAgICAgICAgICAgIG1hbmFnZXJfLT50YXNrc18uc2l6ZSgpIDw9IG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAtIDEpIHsKLSAgICAgICAgICAgICAgbWFuYWdlcl8tPm1heE1vbml0b3JfLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZGxlXyA9IHRydWU7Ci0gICAgICAgICAgbWFuYWdlcl8tPndvcmtlckNvdW50Xy0tOwotICAgICAgICAgIG5vdGlmeU1hbmFnZXIgPSAobWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAodGFzayAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRhc2stPnJ1bigpOwotICAgICAgICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICAgICAgICAvLyBYWFggbmVlZCB0byBsb2cgdGhpcwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXyk7Ci0gICAgICBtYW5hZ2VyXy0+ZGVhZFdvcmtlcnNfLmluc2VydCh0aGlzLT50aHJlYWQoKSk7Ci0gICAgICBpZiAobm90aWZ5TWFuYWdlcikgeworICAgIGJvb2wgYWN0aXZlID0gbWFuYWdlcl8tPndvcmtlckNvdW50XyA8IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF87CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgaWYgKCsrbWFuYWdlcl8tPndvcmtlckNvdW50XyA9PSBtYW5hZ2VyXy0+d29ya2VyTWF4Q291bnRfKSB7CiAgICAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm47CisgICAgd2hpbGUgKGFjdGl2ZSkgeworICAgICAgLyoqCisgICAgICAgICogV2hpbGUgaG9sZGluZyBtYW5hZ2VyIG1vbml0b3IgYmxvY2sgZm9yIG5vbi1lbXB0eSB0YXNrIHF1ZXVlIChBbHNvCisgICAgICAgICogY2hlY2sgdGhhdCB0aGUgdGhyZWFkIGhhc24ndCBiZWVuIHJlcXVlc3RlZCB0byBzdG9wKS4gT25jZSB0aGUgcXVldWUKKyAgICAgICAgKiBpcyBub24tZW1wdHksIGRlcXVldWUgYSB0YXNrLCByZWxlYXNlIG1vbml0b3IsIGFuZCBleGVjdXRlLiBJZiB0aGUKKyAgICAgICAgKiB3b3JrZXIgbWF4IGNvdW50IGhhcyBiZWVuIGRlY3JlbWVudGVkIHN1Y2ggdGhhdCB3ZSBleGNlZWQgaXQsIG1hcmsKKyAgICAgICAgKiBvdXJzZWxmIGluYWN0aXZlLCBkZWNyZW1lbnQgdGhlIHdvcmtlciBjb3VudCBhbmQgbm90aWZ5IHRoZSBtYW5hZ2VyCisgICAgICAgICogKHRlY2huaWNhbGx5IHdlJ3JlIG5vdGlmeWluZyB0aGUgbmV4dCBibG9ja2VkIHRocmVhZCBidXQgZXZlbnR1YWxseQorICAgICAgICAqIHRoZSBtYW5hZ2VyIHdpbGwgc2VlIGl0LgorICAgICAgICAqLworICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKKworICAgICAgd2hpbGUgKGFjdGl2ZSAmJiBtYW5hZ2VyXy0+dGFza3NfLmVtcHR5KCkpIHsKKyAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8rKzsKKyAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQoKTsKKyAgICAgICAgYWN0aXZlID0gaXNBY3RpdmUoKTsKKyAgICAgICAgbWFuYWdlcl8tPmlkbGVDb3VudF8tLTsKKyAgICAgIH0KKworICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrOworCisgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tzXy5lbXB0eSgpKSB7CisgICAgICAgICAgdGFzayA9IG1hbmFnZXJfLT50YXNrc18uZnJvbnQoKTsKKyAgICAgICAgICBtYW5hZ2VyXy0+dGFza3NfLnBvcF9mcm9udCgpOworICAgICAgICAgIGlmICh0YXNrLT5zdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6VGFzazo6V0FJVElORykgeworICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXRlIGlzIGNoYW5nZWQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiBFWEVDVVRJTkcgb3IgVElNRURPVVQgaGVyZQorICAgICAgICAgICAgLy8gdGhlbiB0aGUgZXhlY3V0aW9uIGxvb3AgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWxvdy4KKyAgICAgICAgICAgIHRhc2stPnN0YXRlXyA9CisgICAgICAgICAgICAgICAgKHRhc2stPmdldEV4cGlyZVRpbWUoKSAmJiB0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPCBVdGlsOjpjdXJyZW50VGltZSgpKSA/CisgICAgICAgICAgICAgICAgICAgIFRocmVhZE1hbmFnZXI6OlRhc2s6OlRJTUVET1VUIDoKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkTWFuYWdlcjo6VGFzazo6RVhFQ1VUSU5HOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGhhdmUgYSBwZW5kaW5nIHRhc2sgbWF4IGFuZCB3ZSBqdXN0IGRyb3BwZWQgYmVsb3cgaXQsIHdha2V1cCBhbnkKKyAgICAgICAgICAgIHRocmVhZCB0aGF0IG1pZ2h0IGJlIGJsb2NrZWQgb24gYWRkLiAqLworICAgICAgICBpZiAobWFuYWdlcl8tPnBlbmRpbmdUYXNrQ291bnRNYXhfICE9IDAKKyAgICAgICAgICAgICYmIG1hbmFnZXJfLT50YXNrc18uc2l6ZSgpIDw9IG1hbmFnZXJfLT5wZW5kaW5nVGFza0NvdW50TWF4XyAtIDEpIHsKKyAgICAgICAgICBtYW5hZ2VyXy0+bWF4TW9uaXRvcl8ubm90aWZ5KCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBFeGVjdXRpb24gLSBub3QgaG9sZGluZyBhIGxvY2sKKyAgICAgICAqLworICAgICAgaWYgKHRhc2spIHsKKyAgICAgICAgaWYgKHRhc2stPnN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpUYXNrOjpFWEVDVVRJTkcpIHsKKworICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGxvY2sgc28gd2UgY2FuIHJ1biB0aGUgdGFzayB3aXRob3V0IGJsb2NraW5nIHRoZSB0aHJlYWQgbWFuYWdlcgorICAgICAgICAgIG1hbmFnZXJfLT5tdXRleF8udW5sb2NrKCk7CisKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFzay0+cnVuKCk7CisgICAgICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gdGFzay0+cnVuKCkgcmFpc2VkIGFuIGV4Y2VwdGlvbjogJXMiLCBlLndoYXQoKSk7CisgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CisgICAgICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIHRhc2stPnJ1bigpIHJhaXNlZCBhbiB1bmtub3duIGV4Y2VwdGlvbiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFJlLWFjcXVpcmUgdGhlIGxvY2sgdG8gcHJvY2VlZCBpbiB0aGUgdGhyZWFkIG1hbmFnZXIKKyAgICAgICAgICBtYW5hZ2VyXy0+bXV0ZXhfLmxvY2soKTsKKworICAgICAgICB9IGVsc2UgaWYgKG1hbmFnZXJfLT5leHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgICAvLyBUaGUgb25seSBvdGhlciBzdGF0ZSB0aGUgdGFzayBjb3VsZCBoYXZlIGJlZW4gaW4gaXMgVElNRURPVVQgKHNlZSBhYm92ZSkKKyAgICAgICAgICBtYW5hZ2VyXy0+ZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOworICAgICAgICAgIG1hbmFnZXJfLT5leHBpcmVkQ291bnRfKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5hbCBhY2NvdW50aW5nIGZvciB0aGUgd29ya2VyIHRocmVhZCB0aGF0IGlzIGRvbmUgd29ya2luZworICAgICAqLworICAgIG1hbmFnZXJfLT5kZWFkV29ya2Vyc18uaW5zZXJ0KHRoaXMtPnRocmVhZCgpKTsKKyAgICBpZiAoLS1tYW5hZ2VyXy0+d29ya2VyQ291bnRfID09IG1hbmFnZXJfLT53b3JrZXJNYXhDb3VudF8pIHsKKyAgICAgIG1hbmFnZXJfLT53b3JrZXJNb25pdG9yXy5ub3RpZnkoKTsKKyAgICB9CiAgIH0KIAotICBwcml2YXRlOgotICAgIFRocmVhZE1hbmFnZXI6OkltcGwqIG1hbmFnZXJfOwotICAgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsOwotICAgIFNUQVRFIHN0YXRlXzsKLSAgICBib29sIGlkbGVfOworcHJpdmF0ZToKKyAgVGhyZWFkTWFuYWdlcjo6SW1wbCogbWFuYWdlcl87CisgIGZyaWVuZCBjbGFzcyBUaHJlYWRNYW5hZ2VyOjpJbXBsOworICBTVEFURSBzdGF0ZV87CiB9OwogCi0KLSAgdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGRXb3JrZXIoc2l6ZV90IHZhbHVlKSB7Cit2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZFdvcmtlcihzaXplX3QgdmFsdWUpIHsKICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gbmV3VGhyZWFkczsKICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IHZhbHVlOyBpeCsrKSB7Ci0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+IHdvcmtlciA9IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6V29ya2VyPihuZXcgVGhyZWFkTWFuYWdlcjo6V29ya2VyKHRoaXMpKTsKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyCisgICAgICAgID0gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+KG5ldyBUaHJlYWRNYW5hZ2VyOjpXb3JrZXIodGhpcykpOwogICAgIG5ld1RocmVhZHMuaW5zZXJ0KHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQod29ya2VyKSk7CiAgIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIHdvcmtlck1heENvdW50XyArPSB2YWx1ZTsKLSAgICB3b3JrZXJzXy5pbnNlcnQobmV3VGhyZWFkcy5iZWdpbigpLCBuZXdUaHJlYWRzLmVuZCgpKTsKLSAgfQorICBHdWFyZCBnKG11dGV4Xyk7CisgIHdvcmtlck1heENvdW50XyArPSB2YWx1ZTsKKyAgd29ya2Vyc18uaW5zZXJ0KG5ld1RocmVhZHMuYmVnaW4oKSwgbmV3VGhyZWFkcy5lbmQoKSk7CiAKLSAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBuZXdUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IG5ld1RocmVhZHMuZW5kKCk7IGl4KyspIHsKLSAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6Oldvcmtlcj4gd29ya2VyID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8VGhyZWFkTWFuYWdlcjo6V29ya2VyLCBSdW5uYWJsZT4oKCppeCktPnJ1bm5hYmxlKCkpOworICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IG5ld1RocmVhZHMuYmVnaW4oKTsgaXggIT0gbmV3VGhyZWFkcy5lbmQoKTsKKyAgICAgICArK2l4KSB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpXb3JrZXI+IHdvcmtlcgorICAgICAgICA9IGR5bmFtaWNfcG9pbnRlcl9jYXN0PFRocmVhZE1hbmFnZXI6OldvcmtlciwgUnVubmFibGU+KCgqaXgpLT5ydW5uYWJsZSgpKTsKICAgICB3b3JrZXItPnN0YXRlXyA9IFRocmVhZE1hbmFnZXI6Oldvcmtlcjo6U1RBUlRJTkc7CiAgICAgKCppeCktPnN0YXJ0KCk7CiAgICAgaWRNYXBfLmluc2VydChzdGQ6OnBhaXI8Y29uc3QgVGhyZWFkOjppZF90LCBzaGFyZWRfcHRyPFRocmVhZD4gPigoKml4KS0+Z2V0SWQoKSwgKml4KSk7CiAgIH0KIAotICB7Ci0gICAgU3luY2hyb25pemVkIHMod29ya2VyTW9uaXRvcl8pOwotICAgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7Ci0gICAgICB3b3JrZXJNb25pdG9yXy53YWl0KCk7Ci0gICAgfQorICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgeworICAgIHdvcmtlck1vbml0b3JfLndhaXQoKTsKICAgfQogfQogCiB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0YXJ0KCkgewotCisgIEd1YXJkIGcobXV0ZXhfKTsKICAgaWYgKHN0YXRlXyA9PSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEKSB7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKLSAgICAgIGlmICh0aHJlYWRGYWN0b3J5XyA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRDsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOworICBpZiAoc3RhdGVfID09IFRocmVhZE1hbmFnZXI6OlVOSU5JVElBTElaRUQpIHsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlfKSB7CisgICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKICAgICB9CisgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RBUlRFRDsKKyAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKKyAgfQogCi0gICAgd2hpbGUgKHN0YXRlXyA9PSBTVEFSVElORykgewotICAgICAgbW9uaXRvcl8ud2FpdCgpOwotICAgIH0KKyAgd2hpbGUgKHN0YXRlXyA9PSBTVEFSVElORykgeworICAgIG1vbml0b3JfLndhaXQoKTsKICAgfQogfQogCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnN0b3BJbXBsKGJvb2wgam9pbikgewordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzdG9wKCkgeworICBHdWFyZCBnKG11dGV4Xyk7CiAgIGJvb2wgZG9TdG9wID0gZmFsc2U7Ci0gIGlmIChzdGF0ZV8gPT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRCkgewotICAgIHJldHVybjsKLSAgfQogCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7Ci0gICAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUElORyAmJgotICAgICAgICBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORyAmJgotICAgICAgICBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRCkgewotICAgICAgZG9TdG9wID0gdHJ1ZTsKLSAgICAgIHN0YXRlXyA9IGpvaW4gPyBUaHJlYWRNYW5hZ2VyOjpKT0lOSU5HIDogVGhyZWFkTWFuYWdlcjo6U1RPUFBJTkc7Ci0gICAgfQorICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUT1BQSU5HICYmIHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpKT0lOSU5HCisgICAgICAmJiBzdGF0ZV8gIT0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRCkgeworICAgIGRvU3RvcCA9IHRydWU7CisgICAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6Sk9JTklORzsKICAgfQogCiAgIGlmIChkb1N0b3ApIHsKLSAgICByZW1vdmVXb3JrZXIod29ya2VyQ291bnRfKTsKKyAgICByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHdvcmtlckNvdW50Xyk7CiAgIH0KIAotICAvLyBYWFgKLSAgLy8gc2hvdWxkIGJlIGFibGUgdG8gYmxvY2sgaGVyZSBmb3IgdHJhbnNpdGlvbiB0byBTVE9QUEVEIHNpbmNlIHdlJ3JlIG5vCi0gIC8vIHVzaW5nIHNoYXJlZF9wdHJzCi0KLSAgewotICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBzdGF0ZV8gPSBUaHJlYWRNYW5hZ2VyOjpTVE9QUEVEOwotICB9Ci0KKyAgc3RhdGVfID0gVGhyZWFkTWFuYWdlcjo6U1RPUFBFRDsKIH0KIAogdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVXb3JrZXIoc2l6ZV90IHZhbHVlKSB7Ci0gIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+IHJlbW92ZWRUaHJlYWRzOwotICB7Ci0gICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwotICAgIGlmICh2YWx1ZSA+IHdvcmtlck1heENvdW50XykgewotICAgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgd29ya2VyTWF4Q291bnRfIC09IHZhbHVlOwotCi0gICAgaWYgKGlkbGVDb3VudF8gPCB2YWx1ZSkgewotICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGlkbGVDb3VudF87IGl4KyspIHsKLSAgICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwotICAgIH0KLSAgfQotCi0gIHsKLSAgICBTeW5jaHJvbml6ZWQgcyh3b3JrZXJNb25pdG9yXyk7Ci0KLSAgICB3aGlsZSAod29ya2VyQ291bnRfICE9IHdvcmtlck1heENvdW50XykgewotICAgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOwotICAgIH0KLQotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gZGVhZFdvcmtlcnNfLmJlZ2luKCk7IGl4ICE9IGRlYWRXb3JrZXJzXy5lbmQoKTsgaXgrKykgewotICAgICAgd29ya2Vyc18uZXJhc2UoKml4KTsKLSAgICAgIGlkTWFwXy5lcmFzZSgoKml4KS0+Z2V0SWQoKSk7Ci0gICAgfQotCi0gICAgZGVhZFdvcmtlcnNfLmNsZWFyKCk7Ci0gIH0KKyAgR3VhcmQgZyhtdXRleF8pOworICByZW1vdmVXb3JrZXJzVW5kZXJMb2NrKHZhbHVlKTsKIH0KIAotICBib29sIFRocmVhZE1hbmFnZXI6OkltcGw6OmNhblNsZWVwKCkgewotICAgIGNvbnN0IFRocmVhZDo6aWRfdCBpZCA9IHRocmVhZEZhY3RvcnlfLT5nZXRDdXJyZW50VGhyZWFkSWQoKTsKLSAgICByZXR1cm4gaWRNYXBfLmZpbmQoaWQpID09IGlkTWFwXy5lbmQoKTsKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlV29ya2Vyc1VuZGVyTG9jayhzaXplX3QgdmFsdWUpIHsKKyAgaWYgKHZhbHVlID4gd29ya2VyTWF4Q291bnRfKSB7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgIH0KIAotICB2b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24pIHsKLSAgICBHdWFyZCBnKG11dGV4XywgdGltZW91dCk7CisgIHdvcmtlck1heENvdW50XyAtPSB2YWx1ZTsKIAotICAgIGlmICghZykgewotICAgICAgdGhyb3cgVGltZWRPdXRFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhyZWFkTWFuYWdlcjo6SW1wbDo6YWRkIFRocmVhZE1hbmFnZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3Qgc3RhcnRlZCIpOwotICAgIH0KLQotICAgIHJlbW92ZUV4cGlyZWRUYXNrcygpOwotICAgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7Ci0gICAgICBpZiAoY2FuU2xlZXAoKSAmJiB0aW1lb3V0ID49IDApIHsKLSAgICAgICAgd2hpbGUgKHBlbmRpbmdUYXNrQ291bnRNYXhfID4gMCAmJiB0YXNrc18uc2l6ZSgpID49IHBlbmRpbmdUYXNrQ291bnRNYXhfKSB7Ci0gICAgICAgICAgLy8gVGhpcyBpcyB0aHJlYWQgc2FmZSBiZWNhdXNlIHRoZSBtdXRleCBpcyBzaGFyZWQgYmV0d2VlbiBtb25pdG9ycy4KLSAgICAgICAgICBtYXhNb25pdG9yXy53YWl0KHRpbWVvdXQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGFza3NfLnB1c2goc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKLQotICAgIC8vIElmIGlkbGUgdGhyZWFkIGlzIGF2YWlsYWJsZSBub3RpZnkgaXQsIG90aGVyd2lzZSBhbGwgd29ya2VyIHRocmVhZHMgYXJlCi0gICAgLy8gcnVubmluZyBhbmQgd2lsbCBnZXQgYXJvdW5kIHRvIHRoaXMgdGFzayBpbiB0aW1lLgotICAgIGlmIChpZGxlQ291bnRfID4gMCkgeworICBpZiAoaWRsZUNvdW50XyA+IHZhbHVlKSB7CisgICAgLy8gVGhlcmUgYXJlIG1vcmUgaWRsZSB3b3JrZXJzIHRoYW4gd2UgbmVlZCB0byByZW1vdmUsCisgICAgLy8gc28gbm90aWZ5IGVub3VnaCBvZiB0aGVtIHNvIHRoZXkgY2FuIHRlcm1pbmF0ZS4KKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgdmFsdWU7IGl4KyspIHsKICAgICAgIG1vbml0b3JfLm5vdGlmeSgpOwogICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBUaGVyZSBhcmUgYXMgbWFueSBvciBsZXNzIGlkbGUgd29ya2VycyB0aGFuIHdlIG5lZWQgdG8gcmVtb3ZlLAorICAgIC8vIHNvIGp1c3Qgbm90aWZ5IHRoZW0gYWxsIHNvIHRoZXkgY2FuIHRlcm1pbmF0ZS4KKyAgICBtb25pdG9yXy5ub3RpZnlBbGwoKTsKICAgfQogCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gICh2b2lkKSB0YXNrOwotICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIHdoaWxlICh3b3JrZXJDb3VudF8gIT0gd29ya2VyTWF4Q291bnRfKSB7CisgICAgd29ya2VyTW9uaXRvcl8ud2FpdCgpOworICB9CisKKyAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBkZWFkV29ya2Vyc18uYmVnaW4oKTsKKyAgICAgICBpeCAhPSBkZWFkV29ya2Vyc18uZW5kKCk7CisgICAgICAgKytpeCkgeworCisgICAgLy8gd2hlbiB1c2VkIHdpdGggYSBqb2luYWJsZSB0aHJlYWQgZmFjdG9yeSwgd2Ugam9pbiB0aGUgdGhyZWFkcyBhcyB3ZSByZW1vdmUgdGhlbQorICAgIGlmICghdGhyZWFkRmFjdG9yeV8tPmlzRGV0YWNoZWQoKSkgeworICAgICAgKCppeCktPmpvaW4oKTsKKyAgICB9CisKKyAgICBpZE1hcF8uZXJhc2UoKCppeCktPmdldElkKCkpOworICAgIHdvcmtlcnNfLmVyYXNlKCppeCk7CisgIH0KKworICBkZWFkV29ya2Vyc18uY2xlYXIoKTsKK30KKworYm9vbCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpjYW5TbGVlcCgpIGNvbnN0IHsKKyAgY29uc3QgVGhyZWFkOjppZF90IGlkID0gdGhyZWFkRmFjdG9yeV8tPmdldEN1cnJlbnRUaHJlYWRJZCgpOworICByZXR1cm4gaWRNYXBfLmZpbmQoaWQpID09IGlkTWFwXy5lbmQoKTsKK30KKwordm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUsIGludDY0X3QgdGltZW91dCwgaW50NjRfdCBleHBpcmF0aW9uKSB7CisgIEd1YXJkIGcobXV0ZXhfLCB0aW1lb3V0KTsKKworICBpZiAoIWcpIHsKKyAgICB0aHJvdyBUaW1lZE91dEV4Y2VwdGlvbigpOworICB9CisKICAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7Ci0gICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUgVGhyZWFkTWFuYWdlciBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRlZCIpOworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgIlRocmVhZE1hbmFnZXI6OkltcGw6OmFkZCBUaHJlYWRNYW5hZ2VyICIKKyAgICAgICAgIm5vdCBzdGFydGVkIik7CisgIH0KKworICAvLyBpZiB3ZSdyZSBhdCBhIGxpbWl0LCByZW1vdmUgYW4gZXhwaXJlZCB0YXNrIHRvIHNlZSBpZiB0aGUgbGltaXQgY2xlYXJzCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgcmVtb3ZlRXhwaXJlZCh0cnVlKTsKKyAgfQorCisgIGlmIChwZW5kaW5nVGFza0NvdW50TWF4XyA+IDAgJiYgKHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pKSB7CisgICAgaWYgKGNhblNsZWVwKCkgJiYgdGltZW91dCA+PSAwKSB7CisgICAgICB3aGlsZSAocGVuZGluZ1Rhc2tDb3VudE1heF8gPiAwICYmIHRhc2tzXy5zaXplKCkgPj0gcGVuZGluZ1Rhc2tDb3VudE1heF8pIHsKKyAgICAgICAgLy8gVGhpcyBpcyB0aHJlYWQgc2FmZSBiZWNhdXNlIHRoZSBtdXRleCBpcyBzaGFyZWQgYmV0d2VlbiBtb25pdG9ycy4KKyAgICAgICAgbWF4TW9uaXRvcl8ud2FpdCh0aW1lb3V0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHRhc2tzXy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlcjo6VGFzayh2YWx1ZSwgZXhwaXJhdGlvbikpKTsKKworICAvLyBJZiBpZGxlIHRocmVhZCBpcyBhdmFpbGFibGUgbm90aWZ5IGl0LCBvdGhlcndpc2UgYWxsIHdvcmtlciB0aHJlYWRzIGFyZQorICAvLyBydW5uaW5nIGFuZCB3aWxsIGdldCBhcm91bmQgdG8gdGhpcyB0YXNrIGluIHRpbWUuCisgIGlmIChpZGxlQ291bnRfID4gMCkgeworICAgIG1vbml0b3JfLm5vdGlmeSgpOwogICB9CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZygpIHsKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKICAgR3VhcmQgZyhtdXRleF8pOwogICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKLSAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRocmVhZE1hbmFnZXIgbm90IHN0YXJ0ZWQiKTsKKyAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICJUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmUgVGhyZWFkTWFuYWdlciBub3QgIgorICAgICAgICAic3RhcnRlZCIpOworICB9CisKKyAgZm9yIChUYXNrUXVldWU6Oml0ZXJhdG9yIGl0ID0gdGFza3NfLmJlZ2luKCk7IGl0ICE9IHRhc2tzXy5lbmQoKTsgKytpdCkKKyAgeworICAgIGlmICgoKml0KS0+Z2V0UnVubmFibGUoKSA9PSB0YXNrKQorICAgIHsKKyAgICAgIHRhc2tzXy5lcmFzZShpdCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcoKSB7CisgIEd1YXJkIGcobXV0ZXhfKTsKKyAgaWYgKHN0YXRlXyAhPSBUaHJlYWRNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAiVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlTmV4dFBlbmRpbmcgIgorICAgICAgICAiVGhyZWFkTWFuYWdlciBub3Qgc3RhcnRlZCIpOwogICB9CiAKICAgaWYgKHRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KCk7CiAgIH0KIAogICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI6OlRhc2s+IHRhc2sgPSB0YXNrc18uZnJvbnQoKTsKLSAgdGFza3NfLnBvcCgpOwotICAKKyAgdGFza3NfLnBvcF9mcm9udCgpOworCiAgIHJldHVybiB0YXNrLT5nZXRSdW5uYWJsZSgpOwogfQogCi12b2lkIFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZUV4cGlyZWRUYXNrcygpIHsKLSAgaW50NjRfdCBub3cgPSAwTEw7IC8vIHdlIHdvbid0IGFzayBmb3IgdGhlIHRpbWUgdW50aWxlIHdlIG5lZWQgaXQKK3ZvaWQgVGhyZWFkTWFuYWdlcjo6SW1wbDo6cmVtb3ZlRXhwaXJlZChib29sIGp1c3RPbmUpIHsKKyAgLy8gdGhpcyBpcyBhbHdheXMgY2FsbGVkIHVuZGVyIGEgbG9jaworICBpbnQ2NF90IG5vdyA9IDBMTDsKIAotICAvLyBub3RlIHRoYXQgdGhpcyBsb29wIGJyZWFrcyBhdCB0aGUgZmlyc3Qgbm9uLWV4cGlyaW5nIHRhc2sKLSAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcjo6VGFzaz4gdGFzayA9IHRhc2tzXy5mcm9udCgpOwotICAgIGlmICh0YXNrLT5nZXRFeHBpcmVUaW1lKCkgPT0gMExMKSB7Ci0gICAgICBicmVhazsKLSAgICB9CisgIGZvciAoVGFza1F1ZXVlOjppdGVyYXRvciBpdCA9IHRhc2tzXy5iZWdpbigpOyBpdCAhPSB0YXNrc18uZW5kKCk7ICkKKyAgewogICAgIGlmIChub3cgPT0gMExMKSB7CiAgICAgICBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogICAgIH0KLSAgICBpZiAodGFzay0+Z2V0RXhwaXJlVGltZSgpID4gbm93KSB7Ci0gICAgICBicmVhazsKKworICAgIGlmICgoKml0KS0+Z2V0RXhwaXJlVGltZSgpID4gMExMICYmICgqaXQpLT5nZXRFeHBpcmVUaW1lKCkgPCBub3cpIHsKKyAgICAgIGlmIChleHBpcmVDYWxsYmFja18pIHsKKyAgICAgICAgZXhwaXJlQ2FsbGJhY2tfKCgqaXQpLT5nZXRSdW5uYWJsZSgpKTsKKyAgICAgIH0KKyAgICAgIGl0ID0gdGFza3NfLmVyYXNlKGl0KTsKKyAgICAgICsrZXhwaXJlZENvdW50XzsKKyAgICAgIGlmIChqdXN0T25lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KICAgICB9Ci0gICAgaWYgKGV4cGlyZUNhbGxiYWNrXykgewotICAgICAgZXhwaXJlQ2FsbGJhY2tfKHRhc2stPmdldFJ1bm5hYmxlKCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICArK2l0OwogICAgIH0KLSAgICB0YXNrc18ucG9wKCk7Ci0gICAgZXhwaXJlZENvdW50XysrOwogICB9CiB9CiAKLQogdm9pZCBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpzZXRFeHBpcmVDYWxsYmFjayhFeHBpcmVDYWxsYmFjayBleHBpcmVDYWxsYmFjaykgeworICBHdWFyZCBnKG11dGV4Xyk7CiAgIGV4cGlyZUNhbGxiYWNrXyA9IGV4cGlyZUNhbGxiYWNrOwogfQogCiBjbGFzcyBTaW1wbGVUaHJlYWRNYW5hZ2VyIDogcHVibGljIFRocmVhZE1hbmFnZXI6OkltcGwgewogCi0gcHVibGljOgotICBTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCB3b3JrZXJDb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKSA6Ci0gICAgd29ya2VyQ291bnRfKHdvcmtlckNvdW50KSwKLSAgICBwZW5kaW5nVGFza0NvdW50TWF4XyhwZW5kaW5nVGFza0NvdW50TWF4KSwKLSAgICBmaXJzdFRpbWVfKHRydWUpIHsKLSAgfQorcHVibGljOgorICBTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCB3b3JrZXJDb3VudCA9IDQsIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4ID0gMCkKKyAgICA6IHdvcmtlckNvdW50Xyh3b3JrZXJDb3VudCksIHBlbmRpbmdUYXNrQ291bnRNYXhfKHBlbmRpbmdUYXNrQ291bnRNYXgpIHt9CiAKICAgdm9pZCBzdGFydCgpIHsKICAgICBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpwZW5kaW5nVGFza0NvdW50TWF4KHBlbmRpbmdUYXNrQ291bnRNYXhfKTsKQEAgLTU2NSwyMSArNTY2LDE5IEBACiAgICAgYWRkV29ya2VyKHdvcmtlckNvdW50Xyk7CiAgIH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBjb25zdCBzaXplX3Qgd29ya2VyQ291bnRfOwogICBjb25zdCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heF87Ci0gIGJvb2wgZmlyc3RUaW1lXzsKLSAgTW9uaXRvciBtb25pdG9yXzsKIH07CiAKLQogc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdUaHJlYWRNYW5hZ2VyKCkgewogICByZXR1cm4gc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPihuZXcgVGhyZWFkTWFuYWdlcjo6SW1wbCgpKTsKIH0KIAotc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgpIHsKK3NoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgpIHsKICAgcmV0dXJuIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4obmV3IFNpbXBsZVRocmVhZE1hbmFnZXIoY291bnQsIHBlbmRpbmdUYXNrQ291bnRNYXgpKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKaW5kZXggNmQ3YjBlZi4uNDcwZmMwYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCkBAIC0yMCwxMiArMjAsMTQgQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlICJUaHJlYWQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIFRocmVhZCBQb29sIE1hbmFnZXIgYW5kIHJlbGF0ZWQgY2xhc3NlcwpAQCAtMzksMjYgKzQxLDI1IEBACiAgKgogICogVGhpcyBjbGFzcyBtYW5hZ2VzIGEgcG9vbCBvZiB0aHJlYWRzLiBJdCB1c2VzIGEgVGhyZWFkRmFjdG9yeSB0byBjcmVhdGUKICAqIHRocmVhZHMuIEl0IG5ldmVyIGFjdHVhbGx5IGNyZWF0ZXMgb3IgZGVzdHJveXMgd29ya2VyIHRocmVhZHMsIHJhdGhlcgotICogSXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAorICogaXQgbWFpbnRhaW5zIHN0YXRpc3RpY3Mgb24gbnVtYmVyIG9mIGlkbGUgdGhyZWFkcywgbnVtYmVyIG9mIGFjdGl2ZSB0aHJlYWRzLAogICogdGFzayBiYWNrbG9nLCBhbmQgYXZlcmFnZSB3YWl0IGFuZCBzZXJ2aWNlIHRpbWVzIGFuZCBpbmZvcm1zIHRoZSBQb29sUG9saWN5CiAgKiBvYmplY3QgYm91bmQgdG8gaW5zdGFuY2VzIG9mIHRoaXMgbWFuYWdlciBvZiBpbnRlcmVzdGluZyB0cmFuc2l0aW9ucy4gSXQgaXMKICAqIHRoZW4gdXAgdGhlIFBvb2xQb2xpY3kgb2JqZWN0IHRvIGRlY2lkZSBpZiB0aGUgdGhyZWFkIHBvb2wgc2l6ZSBuZWVkcyB0byBiZQogICogYWRqdXN0ZWQgYW5kIGNhbGwgdGhpcyBvYmplY3QgYWRkV29ya2VyIGFuZCByZW1vdmVXb3JrZXIgbWV0aG9kcyB0byBtYWtlCiAgKiBjaGFuZ2VzLgogICoKLSAqIFRoaXMgZGVzaWduIGFsbG93cyBkaWZmZXJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9ucyB0byB1c2VkIHRoaXMgY29kZSB0bworICogVGhpcyBkZXNpZ24gYWxsb3dzIGRpZmZlcmVudCBwb2xpY3kgaW1wbGVtZW50YXRpb25zIHRvIHVzZSB0aGlzIGNvZGUgdG8KICAqIGhhbmRsZSBiYXNpYyB3b3JrZXIgdGhyZWFkIG1hbmFnZW1lbnQgYW5kIHdvcmtlciB0YXNrIGV4ZWN1dGlvbiBhbmQgZm9jdXMgb24KICAqIHBvbGljeSBpc3N1ZXMuIFRoZSBzaW1wbGVzdCBwb2xpY3ksIFN0YXRpY1BvbGljeSwgZG9lcyBub3RoaW5nIG90aGVyIHRoYW4KICAqIGNyZWF0ZSBhIGZpeGVkIG51bWJlciBvZiB0aHJlYWRzLgogICovCiBjbGFzcyBUaHJlYWRNYW5hZ2VyIHsKIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgVGhyZWFkTWFuYWdlcigpIHt9CiAKLSBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s7Ci0gIHR5cGVkZWYgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KT4gRXhwaXJlQ2FsbGJhY2s7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KIApAQCAtNzAsMzggKzcxLDQ2IEBACiAKICAgLyoqCiAgICAqIFN0b3BzIHRoZSB0aHJlYWQgbWFuYWdlci4gQWJvcnRzIGFsbCByZW1haW5pbmcgdW5wcm9jZXNzZWQgdGFzaywgc2h1dHMKLSAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlYWxlYXNlcyBhbGwgYWxsb2NhdGVkIHJlc291cmNlcy4KKyAgICogZG93biBhbGwgY3JlYXRlZCB3b3JrZXIgdGhyZWFkcywgYW5kIHJlbGVhc2VzIGFsbCBhbGxvY2F0ZWQgcmVzb3VyY2VzLgogICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgZm9yIGFsbCB3b3JrZXIgdGhyZWFkcyB0byBjb21wbGV0ZSwgdGh1cyBpdCBjYW4KICAgICogcG90ZW50aWFsbHkgYmxvY2sgZm9yZXZlciBpZiBhIHdvcmtlciB0aHJlYWQgaXMgcnVubmluZyBhIHRhc2sgdGhhdAogICAgKiB3b24ndCB0ZXJtaW5hdGUuCisgICAqCisgICAqIFdvcmtlciB0aHJlYWRzIHdpbGwgYmUgam9pbmVkIGRlcGVuZGluZyBvbiB0aGUgdGhyZWFkRmFjdG9yeSdzIGRldGFjaGVkCisgICAqIGRpc3Bvc2l0aW9uLgogICAgKi8KICAgdmlydHVhbCB2b2lkIHN0b3AoKSA9IDA7CiAKLSAgLyoqCi0gICAqIEpvaW5zIHRoZSB0aHJlYWQgbWFuYWdlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBzdG9wLCBleGNlcHQgdGhhdCBpdCB3aWxsCi0gICAqIGJsb2NrIHVudGlsIGFsbCB0aGUgd29ya2VycyBoYXZlIGZpbmlzaGVkIHRoZWlyIHdvcmsuIEF0IHRoYXQgcG9pbnQKLSAgICogdGhlIFRocmVhZE1hbmFnZXIgd2lsbCB0cmFuc2l0aW9uIGludG8gdGhlIFNUT1BQRUQgc3RhdGUuCi0gICAqLwotICB2aXJ0dWFsIHZvaWQgam9pbigpID0gMDsKLQotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgSk9JTklORywKLSAgICBTVE9QUElORywKLSAgICBTVE9QUEVECi0gIH07CisgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgSk9JTklORywgU1RPUFBJTkcsIFNUT1BQRUQgfTsKIAogICB2aXJ0dWFsIFNUQVRFIHN0YXRlKCkgY29uc3QgPSAwOwogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0ID0gMDsKKyAgLyoqCisgICAqIFxyZXR1cm5zIHRoZSBjdXJyZW50IHRocmVhZCBmYWN0b3J5CisgICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOwogCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+IHZhbHVlKSA9IDA7CisgIC8qKgorICAgKiBTZXQgdGhlIHRocmVhZCBmYWN0b3J5LgorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHRocmVhZCBmYWN0b3J5IGhhcyBhIGRpZmZlcmVudAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCBkaXNwb3NpdGlvbiB0aGFuIHRoZSBvbmUgcmVwbGFjaW5nIGl0CisgICAqLworICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZT0xKSA9IDA7CisgIC8qKgorICAgKiBBZGRzIHdvcmtlciB0aHJlYWQocykuCisgICAqLworICB2aXJ0dWFsIHZvaWQgYWRkV29ya2VyKHNpemVfdCB2YWx1ZSA9IDEpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgcmVtb3ZlV29ya2VyKHNpemVfdCB2YWx1ZT0xKSA9IDA7CisgIC8qKgorICAgKiBSZW1vdmVzIHdvcmtlciB0aHJlYWQocykuCisgICAqIFRocmVhZHMgYXJlIGpvaW5lZCBpZiB0aGUgdGhyZWFkIGZhY3RvcnkgZGV0YWNoZWQgZGlzcG9zaXRpb24gYWxsb3dzIGl0LgorICAgKiBCbG9ja3MgdW50aWwgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyByZWFjaGVzIHRoZSBuZXcgbGltaXQuCisgICAqIFxwYXJhbVtpbl0gIHZhbHVlICB0aGUgbnVtYmVyIHRvIHJlbW92ZQorICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygd29ya2VycworICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZVdvcmtlcihzaXplX3QgdmFsdWUgPSAxKSA9IDA7CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGlkbGUgd29ya2VyIHRocmVhZHMKQEAgLTExNiw3ICsxMjUsNyBAQAogICAvKioKICAgICogR2V0cyB0aGUgY3VycmVudCBudW1iZXIgb2YgcGVuZGluZyB0YXNrcwogICAgKi8KLSAgdmlydHVhbCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudCgpIGNvbnN0ICA9IDA7CisgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnQoKSBjb25zdCA9IDA7CiAKICAgLyoqCiAgICAqIEdldHMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBlbmRpbmcgYW5kIGV4ZWN1dGluZyB0YXNrcwpAQCAtMTI5LDcgKzEzOCw4IEBACiAgIHZpcnR1YWwgc2l6ZV90IHBlbmRpbmdUYXNrQ291bnRNYXgoKSBjb25zdCA9IDA7CiAKICAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiB0YXNrcyB3aGljaCBoYXZlIGJlZW4gZXhwaXJlZCB3aXRob3V0IGJlaW5nIHJ1bi4KKyAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHRhc2tzIHdoaWNoIGhhdmUgYmVlbiBleHBpcmVkIHdpdGhvdXQgYmVpbmcgcnVuCisgICAqIHNpbmNlIHN0YXJ0KCkgd2FzIGNhbGxlZC4KICAgICovCiAgIHZpcnR1YWwgc2l6ZV90IGV4cGlyZWRUYXNrQ291bnQoKSA9IDA7CiAKQEAgLTE1MiwyMSArMTYyLDIxIEBACiAgICAqCiAgICAqIEB0aHJvd3MgVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiBQZW5kaW5nIHRhc2sgY291bnQgZXhjZWVkcyBtYXggcGVuZGluZyB0YXNrIGNvdW50CiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPnRhc2ssCi0gICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0PTBMTCwKLSAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb249MExMKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTCwKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOwogCiAgIC8qKgogICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KICAgICoKICAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KQEAgLTE4MSwxNCArMTkxLDE1IEBACiAgICAqLwogICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKIAotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKIAogICAvKioKICAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcwogICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0CiAgICAqIG9uIHBlbmRpbmcgdGFza3MKICAgICovCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudD00LCBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heD0wKTsKKyAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCA9IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZW5kaW5nVGFza0NvdW50TWF4ID0gMCk7CiAKICAgY2xhc3MgVGFzazsKIApAQCAtMTk2LDcgKzIwNyw4IEBACiAKICAgY2xhc3MgSW1wbDsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAppbmRleCA4YmU4YTZlLi42MWEzNGZmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcApAQCAtMTcsMTcgKzE3LDIwIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiVGltZXJNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiRXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiVXRpbC5oIgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKIAogLyoqCiAgKiBUaW1lck1hbmFnZXIgY2xhc3MKQEAgLTM2LDIwICszOSwxMiBAQAogICovCiBjbGFzcyBUaW1lck1hbmFnZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogCi0gcHVibGljOgotICBlbnVtIFNUQVRFIHsKLSAgICBXQUlUSU5HLAotICAgIEVYRUNVVElORywKLSAgICBDQU5DRUxMRUQsCi0gICAgQ09NUExFVEUKLSAgfTsKK3B1YmxpYzoKKyAgZW51bSBTVEFURSB7IFdBSVRJTkcsIEVYRUNVVElORywgQ0FOQ0VMTEVELCBDT01QTEVURSB9OwogCi0gIFRhc2soc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIDoKLSAgICBydW5uYWJsZV8ocnVubmFibGUpLAotICAgIHN0YXRlXyhXQUlUSU5HKSB7fQorICBUYXNrKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSA6IHJ1bm5hYmxlXyhydW5uYWJsZSksIHN0YXRlXyhXQUlUSU5HKSB7fQogCi0gIH5UYXNrKCkgewotICB9CisgIH5UYXNrKCkge30KIAogICB2b2lkIHJ1bigpIHsKICAgICBpZiAoc3RhdGVfID09IEVYRUNVVElORykgewpAQCAtNTgsMTcgKzUzLDIwIEBACiAgICAgfQogICB9CiAKLSBwcml2YXRlOgorICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX3B0cjxSdW5uYWJsZT4gJiBydW5uYWJsZSkgY29uc3QgeyByZXR1cm4gcnVubmFibGVfID09IHJ1bm5hYmxlOyB9CisKKyAgdGFza19pdGVyYXRvciBpdF87CisKK3ByaXZhdGU6CiAgIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlXzsKICAgZnJpZW5kIGNsYXNzIFRpbWVyTWFuYWdlcjo6RGlzcGF0Y2hlcjsKICAgU1RBVEUgc3RhdGVfOwogfTsKIAotY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyOiBwdWJsaWMgUnVubmFibGUgeworY2xhc3MgVGltZXJNYW5hZ2VyOjpEaXNwYXRjaGVyIDogcHVibGljIFJ1bm5hYmxlIHsKIAotIHB1YmxpYzoKLSAgRGlzcGF0Y2hlcihUaW1lck1hbmFnZXIqIG1hbmFnZXIpIDoKLSAgICBtYW5hZ2VyXyhtYW5hZ2VyKSB7fQorcHVibGljOgorICBEaXNwYXRjaGVyKFRpbWVyTWFuYWdlciogbWFuYWdlcikgOiBtYW5hZ2VyXyhtYW5hZ2VyKSB7fQogCiAgIH5EaXNwYXRjaGVyKCkge30KIApAQCAtOTMsMTYgKzkxLDE5IEBACiAgICAgICAgIFN5bmNocm9uaXplZCBzKG1hbmFnZXJfLT5tb25pdG9yXyk7CiAgICAgICAgIHRhc2tfaXRlcmF0b3IgZXhwaXJlZFRhc2tFbmQ7CiAgICAgICAgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKLSAgICAgICAgd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEICYmCi0gICAgICAgICAgICAgICAoZXhwaXJlZFRhc2tFbmQgPSBtYW5hZ2VyXy0+dGFza01hcF8udXBwZXJfYm91bmQobm93KSkgPT0gbWFuYWdlcl8tPnRhc2tNYXBfLmJlZ2luKCkpIHsKKyAgICAgICAgd2hpbGUgKG1hbmFnZXJfLT5zdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVECisgICAgICAgICAgICAgICAmJiAoZXhwaXJlZFRhc2tFbmQgPSBtYW5hZ2VyXy0+dGFza01hcF8udXBwZXJfYm91bmQobm93KSkKKyAgICAgICAgICAgICAgICAgID09IG1hbmFnZXJfLT50YXNrTWFwXy5iZWdpbigpKSB7CiAgICAgICAgICAgaW50NjRfdCB0aW1lb3V0ID0gMExMOwogICAgICAgICAgIGlmICghbWFuYWdlcl8tPnRhc2tNYXBfLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHRpbWVvdXQgPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKS0+Zmlyc3QgLSBub3c7CiAgICAgICAgICAgfQotICAgICAgICAgIGFzc2VydCgodGltZW91dCAhPSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID4gMCkgfHwgKHRpbWVvdXQgPT0gMCAmJiBtYW5hZ2VyXy0+dGFza0NvdW50XyA9PSAwKSk7CisgICAgICAgICAgYXNzZXJ0KCh0aW1lb3V0ICE9IDAgJiYgbWFuYWdlcl8tPnRhc2tDb3VudF8gPiAwKQorICAgICAgICAgICAgICAgICB8fCAodGltZW91dCA9PSAwICYmIG1hbmFnZXJfLT50YXNrQ291bnRfID09IDApKTsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgbWFuYWdlcl8tPm1vbml0b3JfLndhaXQodGltZW91dCk7Ci0gICAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24gJikge30KKyAgICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiYpIHsKKyAgICAgICAgICB9CiAgICAgICAgICAgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKICAgICAgICAgfQogCkBAIC0xMTAsNiArMTExLDcgQEAKICAgICAgICAgICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiB0YXNrID0gaXgtPnNlY29uZDsKICAgICAgICAgICAgIGV4cGlyZWRUYXNrcy5pbnNlcnQodGFzayk7CisgICAgICAgICAgICB0YXNrLT5pdF8gPSBtYW5hZ2VyXy0+dGFza01hcF8uZW5kKCk7CiAgICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VGFzazo6V0FJVElORykgewogICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKICAgICAgICAgICAgIH0KQEAgLTExOSw3ICsxMjEsOSBAQAogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUYXNrPiA+OjppdGVyYXRvciBpeCA9ICBleHBpcmVkVGFza3MuYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tzLmVuZCgpOyBpeCsrKSB7CisgICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGFzaz4gPjo6aXRlcmF0b3IgaXggPSBleHBpcmVkVGFza3MuYmVnaW4oKTsKKyAgICAgICAgICAgaXggIT0gZXhwaXJlZFRhc2tzLmVuZCgpOworICAgICAgICAgICArK2l4KSB7CiAgICAgICAgICgqaXgpLT5ydW4oKTsKICAgICAgIH0KIApAQCAtMTM1LDIwICsxMzksMjAgQEAKICAgICByZXR1cm47CiAgIH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBUaW1lck1hbmFnZXIqIG1hbmFnZXJfOwogICBmcmllbmQgY2xhc3MgVGltZXJNYW5hZ2VyOwogfTsKIAogI2lmIGRlZmluZWQoX01TQ19WRVIpCiAjcHJhZ21hIHdhcm5pbmcocHVzaCkKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0MzU1KSAvLyAndGhpcycgdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQzNTUpIC8vICd0aGlzJyB1c2VkIGluIGJhc2UgbWVtYmVyIGluaXRpYWxpemVyIGxpc3QKICNlbmRpZgogCi1UaW1lck1hbmFnZXI6OlRpbWVyTWFuYWdlcigpIDoKLSAgdGFza0NvdW50XygwKSwKLSAgc3RhdGVfKFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCksCi0gIGRpc3BhdGNoZXJfKHNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4obmV3IERpc3BhdGNoZXIodGhpcykpKSB7CitUaW1lck1hbmFnZXI6OlRpbWVyTWFuYWdlcigpCisgIDogdGFza0NvdW50XygwKSwKKyAgICBzdGF0ZV8oVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSwKKyAgICBkaXNwYXRjaGVyXyhzaGFyZWRfcHRyPERpc3BhdGNoZXI+KG5ldyBEaXNwYXRjaGVyKHRoaXMpKSkgewogfQogCiAjaWYgZGVmaW5lZChfTVNDX1ZFUikKQEAgLTE2Myw5ICsxNjcsOCBAQAogICBpZiAoc3RhdGVfICE9IFNUT1BQRUQpIHsKICAgICB0cnkgewogICAgICAgc3RvcCgpOwotICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICB0aHJvdzsKLSAgICAgIC8vIHVob2gKKyAgICB9IGNhdGNoICguLi4pIHsKKyAgICAgIC8vIFdlJ3JlIHJlYWxseSBob3NlZC4KICAgICB9CiAgIH0KIH0KQEAgLTE3NCw3ICsxNzcsNyBAQAogICBib29sIGRvU3RhcnQgPSBmYWxzZTsKICAgewogICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgICBpZiAodGhyZWFkRmFjdG9yeV8gPT0gTlVMTCkgeworICAgIGlmICghdGhyZWFkRmFjdG9yeV8pIHsKICAgICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgIH0KICAgICBpZiAoc3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VU5JTklUSUFMSVpFRCkgewpAQCAtMjAzLDcgKzIwNiw3IEBACiAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwogICAgIGlmIChzdGF0ZV8gPT0gVGltZXJNYW5hZ2VyOjpVTklOSVRJQUxJWkVEKSB7CiAgICAgICBzdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlNUT1BQRUQ7Ci0gICAgfSBlbHNlIGlmIChzdGF0ZV8gIT0gU1RPUFBJTkcgJiYgIHN0YXRlXyAhPSBTVE9QUEVEKSB7CisgICAgfSBlbHNlIGlmIChzdGF0ZV8gIT0gU1RPUFBJTkcgJiYgc3RhdGVfICE9IFNUT1BQRUQpIHsKICAgICAgIGRvU3RvcCA9IHRydWU7CiAgICAgICBzdGF0ZV8gPSBTVE9QUElORzsKICAgICAgIG1vbml0b3JfLm5vdGlmeUFsbCgpOwpAQCAtMjI3LDcgKzIzMCw3IEBACiAgIHJldHVybiB0aHJlYWRGYWN0b3J5XzsKIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiAgdmFsdWUpIHsKK3ZvaWQgVGltZXJNYW5hZ2VyOjp0aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdmFsdWUpIHsKICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwogICB0aHJlYWRGYWN0b3J5XyA9IHZhbHVlOwogfQpAQCAtMjM2LDcgKzIzOSw3IEBACiAgIHJldHVybiB0YXNrQ291bnRfOwogfQogCi12b2lkIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKICAgaW50NjRfdCBub3cgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogICB0aW1lb3V0ICs9IG5vdzsKIApAQCAtMjUxLDggKzI1NCw5IEBACiAgICAgLy8gYmVjYXVzZSB0aGUgbmV3IHRhc2sgbWlnaHQgaW5zZXJ0IGF0IHRoZSBmcm9udC4KICAgICBib29sIG5vdGlmeVJlcXVpcmVkID0gKHRhc2tDb3VudF8gPT0gMCkgPyB0cnVlIDogdGltZW91dCA8IHRhc2tNYXBfLmJlZ2luKCktPmZpcnN0OwogCisgICAgc2hhcmVkX3B0cjxUYXNrPiB0aW1lcihuZXcgVGFzayh0YXNrKSk7CiAgICAgdGFza0NvdW50XysrOwotICAgIHRhc2tNYXBfLmluc2VydChzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHNoYXJlZF9wdHI8VGFzaz4obmV3IFRhc2sodGFzaykpKSk7CisgICAgdGltZXItPml0XyA9IHRhc2tNYXBfLmluc2VydChzdGQ6OnBhaXI8aW50NjRfdCwgc2hhcmVkX3B0cjxUYXNrPiA+KHRpbWVvdXQsIHRpbWVyKSk7CiAKICAgICAvLyBJZiB0aGUgdGFzayBtYXAgd2FzIGVtcHR5LCBvciBpZiB3ZSBoYXZlIGFuIGV4cGlyYXRpb24gdGhhdCBpcyBlYXJsaWVyCiAgICAgLy8gdGhhbiBhbnkgcHJldmlvdXNseSBzZWVuLCBraWNrIHRoZSBkaXNwYXRjaGVyIHNvIGl0IGNhbiB1cGRhdGUgaXRzCkBAIC0yNjAsMTAgKzI2NCwxMyBAQAogICAgIGlmIChub3RpZnlSZXF1aXJlZCkgewogICAgICAgbW9uaXRvcl8ubm90aWZ5KCk7CiAgICAgfQorCisgICAgcmV0dXJuIHRpbWVyOwogICB9CiB9CiAKLXZvaWQgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgY29uc3Qgc3RydWN0IHRpbWVzcGVjJiB2YWx1ZSkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CiAKICAgaW50NjRfdCBleHBpcmF0aW9uOwogICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CkBAIC0yNzEsMjIgKzI3OCw3MCBAQAogICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKLSAgICB0aHJvdyAgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgdGhyb3cgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCk7CiAgIH0KIAotICBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7CisgIHJldHVybiBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7CiB9CiAKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywKKyAgICBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUpIHsKKworICBpbnQ2NF90IGV4cGlyYXRpb247CisgIFV0aWw6OnRvTWlsbGlzZWNvbmRzKGV4cGlyYXRpb24sIHZhbHVlKTsKKworICBpbnQ2NF90IG5vdyA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisKKyAgaWYgKGV4cGlyYXRpb24gPCBub3cpIHsKKyAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgfQorCisgIHJldHVybiBhZGQodGFzaywgZXhwaXJhdGlvbiAtIG5vdyk7Cit9CiAKIHZvaWQgVGltZXJNYW5hZ2VyOjpyZW1vdmUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICAodm9pZCkgdGFzazsKICAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOwogICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgewogICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICB9CisgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgZm9yICh0YXNrX2l0ZXJhdG9yIGl4ID0gdGFza01hcF8uYmVnaW4oKTsgaXggIT0gdGFza01hcF8uZW5kKCk7KSB7CisgICAgaWYgKCppeC0+c2Vjb25kID09IHRhc2spIHsKKyAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgIHRhc2tDb3VudF8tLTsKKyAgICAgIHRhc2tNYXBfLmVyYXNlKGl4KyspOworICAgIH0gZWxzZSB7CisgICAgICArK2l4OworICAgIH0KKyAgfQorICBpZiAoIWZvdW5kKSB7CisgICAgdGhyb3cgTm9TdWNoVGFza0V4Y2VwdGlvbigpOworICB9CiB9CiAKLVRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRlXzsgfQordm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShUaW1lciBoYW5kbGUpIHsKKyAgU3luY2hyb25pemVkIHMobW9uaXRvcl8pOworICBpZiAoc3RhdGVfICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKKyAgc2hhcmVkX3B0cjxUYXNrPiB0YXNrID0gaGFuZGxlLmxvY2soKTsKKyAgaWYgKCF0YXNrKSB7CisgICAgdGhyb3cgTm9TdWNoVGFza0V4Y2VwdGlvbigpOworICB9CiAKKyAgaWYgKHRhc2stPml0XyA9PSB0YXNrTWFwXy5lbmQoKSkgeworICAgIC8vIFRhc2sgaXMgYmVpbmcgZXhlY3V0ZWQKKyAgICB0aHJvdyBVbmNhbmNlbGxhYmxlVGFza0V4Y2VwdGlvbigpOworICB9CisKKyAgdGFza01hcF8uZXJhc2UodGFzay0+aXRfKTsKKyAgdGFza0NvdW50Xy0tOworfQorCitUaW1lck1hbmFnZXI6OlNUQVRFIFRpbWVyTWFuYWdlcjo6c3RhdGUoKSBjb25zdCB7CisgIHJldHVybiBzdGF0ZV87Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCmluZGV4IGQ5MDVkZGIuLmJhNzkyMjYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKQEAgLTIwLDE1ICsyMCwxNyBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXwogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RJTUVSTUFOQUdFUl9IXyAxCiAKLSNpbmNsdWRlICJFeGNlcHRpb24uaCIKLSNpbmNsdWRlICJNb25pdG9yLmgiCi0jaW5jbHVkZSAiVGhyZWFkLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvKioKICAqIFRpbWVyIE1hbmFnZXIKQEAgLTM5LDE1ICs0MSwxNyBAQAogICovCiBjbGFzcyBUaW1lck1hbmFnZXIgewogCi0gcHVibGljOgorcHVibGljOgorICBjbGFzcyBUYXNrOworICB0eXBlZGVmIHN0ZDo6d2Vha19wdHI8VGFzaz4gVGltZXI7CiAKICAgVGltZXJNYW5hZ2VyKCk7CiAKICAgdmlydHVhbCB+VGltZXJNYW5hZ2VyKCk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3Q7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKIAotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CisgIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB2YWx1ZSk7CiAKICAgLyoqCiAgICAqIFN0YXJ0cyB0aGUgdGltZXIgbWFuYWdlciBzZXJ2aWNlCkBAIC02MSwyNyArNjUsNDAgQEAKICAgICovCiAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7CiAKLSAgdmlydHVhbCBzaXplX3QgdGFza0NvdW50KCkgY29uc3QgOworICB2aXJ0dWFsIHNpemVfdCB0YXNrQ291bnQoKSBjb25zdDsKIAogICAvKioKICAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzaworICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpOworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KICAgICoKICAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQogICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMmIHRpbWVvdXQpOworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHRpbWVvdXQpOworCisgIC8qKgorICAgKiBBZGRzIGEgdGFzayB0byBiZSBleGVjdXRlZCBhdCBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSBieSBhIHdvcmtlciB0aHJlYWQuCisgICAqCisgICAqIEBwYXJhbSB0YXNrIFRoZSB0YXNrIHRvIGV4ZWN1dGUKKyAgICogQHBhcmFtIHRpbWVvdXQgQWJzb2x1dGUgdGltZSBpbiB0aGUgZnV0dXJlIHRvIGV4ZWN1dGUgdGFzay4KKyAgICogQHJldHVybiBIYW5kbGUgb2YgdGhlIHRpbWVyLCB3aGljaCBjYW4gYmUgdXNlZCB0byByZW1vdmUgdGhlIHRpbWVyLgorICAgKi8KKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKICAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gcmVtb3ZlLiBBbGwgdGltZXJzIHdoaWNoIGV4ZWN1dGUgdGhpcyB0YXNrIHdpbGwKKyAgICogYmUgcmVtb3ZlZC4KICAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCkBAIC04OSwzNCArMTA2LDQyIEBACiAgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZwogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKIAotICBlbnVtIFNUQVRFIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIFNUQVJUSU5HLAotICAgIFNUQVJURUQsCi0gICAgU1RPUFBJTkcsCi0gICAgU1RPUFBFRAotICB9OworICAvKioKKyAgICogUmVtb3ZlcyBhIHNpbmdsZSBwZW5kaW5nIHRhc2sKKyAgICoKKyAgICogQHBhcmFtIHRpbWVyIFRoZSB0aW1lciB0byByZW1vdmUuIFRoZSB0aW1lciBpcyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgdGhlCisgICAqIGFkZCgpIG1ldGhvZC4KKyAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCisgICAqCisgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShUaW1lciB0aW1lcik7CisKKyAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OwogCiAgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdDsKIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwotICBjbGFzcyBUYXNrOworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOwogICBmcmllbmQgY2xhc3MgVGFzazsKLSAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOworICBzdGQ6Om11bHRpbWFwPGludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxUYXNrPiA+IHRhc2tNYXBfOwogICBzaXplX3QgdGFza0NvdW50XzsKICAgTW9uaXRvciBtb25pdG9yXzsKICAgU1RBVEUgc3RhdGVfOwogICBjbGFzcyBEaXNwYXRjaGVyOwogICBmcmllbmQgY2xhc3MgRGlzcGF0Y2hlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87Ci0gIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBib29zdDo6c2hhcmVkX3B0cjxUaW1lck1hbmFnZXI6OlRhc2s+ID46Oml0ZXJhdG9yIHRhc2tfaXRlcmF0b3I7CisgIHN0ZDo6c2hhcmVkX3B0cjxEaXNwYXRjaGVyPiBkaXNwYXRjaGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZGlzcGF0Y2hlclRocmVhZF87CisgIHR5cGVkZWYgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+OjppdGVyYXRvciB0YXNrX2l0ZXJhdG9yOwogICB0eXBlZGVmIHN0ZDo6cGFpcjx0YXNrX2l0ZXJhdG9yLCB0YXNrX2l0ZXJhdG9yPiB0YXNrX3JhbmdlOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USU1FUk1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmNwcAppbmRleCA3NjRiNmY1Li5kZDZkMTlmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuY3BwCkBAIC0xNywzOSArMTcsMjggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKworI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgorCisjaWYgZGVmaW5lZChIQVZFX1NZU19USU1FX0gpCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiVXRpbC5oIgotCi0jaWYgZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpCi0jaW5jbHVkZSA8dGltZS5oPgotI2VsaWYgZGVmaW5lZChIQVZFX1NZU19USU1FX0gpCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZiAvLyBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIGludDY0X3QgVXRpbDo6Y3VycmVudFRpbWVUaWNrcyhpbnQ2NF90IHRpY2tzUGVyU2VjKSB7CiAgIGludDY0X3QgcmVzdWx0OwotCi0jaWYgZGVmaW5lZChIQVZFX0NMT0NLX0dFVFRJTUUpCi0gIHN0cnVjdCB0aW1lc3BlYyBub3c7Ci0gIGludCByZXQgPSBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgcmV0ID0gcmV0OyAvL3NxdWVsY2hpbmcgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZwotICB0b1RpY2tzKHJlc3VsdCwgbm93LCB0aWNrc1BlclNlYyk7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfR0VUVElNRU9GREFZKQogICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gIGludCByZXQgPSBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7CisgIGludCByZXQgPSBUSFJJRlRfR0VUVElNRU9GREFZKCZub3csIE5VTEwpOwogICBhc3NlcnQocmV0ID09IDApOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7IC8vIHNxdWVsY2hpbmcgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZwogICB0b1RpY2tzKHJlc3VsdCwgbm93LCB0aWNrc1BlclNlYyk7Ci0jZWxzZQotI2Vycm9yICJObyBoaWdoLXByZWNpc2lvbiBjbG9jayBpcyBhdmFpbGFibGUuIgotI2VuZGlmIC8vIGRlZmluZWQoSEFWRV9DTE9DS19HRVRUSU1FKQotCiAgIHJldHVybiByZXN1bHQ7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaAppbmRleCBlZTY3ZmM3Li4xYTkxNTk5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9VdGlsLmgKQEAgLTI5LDcgKzI5LDExIEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAogLyoqCiAgKiBVdGlsaXR5IG1ldGhvZHMKQEAgLTUzLDI2ICs1NywyOCBAQAogICBzdGF0aWMgY29uc3QgaW50NjRfdCBOU19QRVJfVVMgPSBOU19QRVJfUyAvIFVTX1BFUl9TOwogICBzdGF0aWMgY29uc3QgaW50NjRfdCBVU19QRVJfTVMgPSBVU19QRVJfUyAvIE1TX1BFUl9TOwogCi0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgotICAgKiBDb252ZXJ0cyBtaWxsaXNlY29uZCB0aW1lc3RhbXAgaW50byBhIHRpbWVzcGVjIHN0cnVjdAorICAgKiBDb252ZXJ0cyBtaWxsaXNlY29uZCB0aW1lc3RhbXAgaW50byBhIFRIUklGVF9USU1FU1BFQyBzdHJ1Y3QKICAgICoKLSAgICogQHBhcmFtIHN0cnVjdCB0aW1lc3BlYyYgcmVzdWx0CisgICAqIEBwYXJhbSBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQKICAgICogQHBhcmFtIHRpbWUgb3IgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCiAgICAqLwotICBzdGF0aWMgdm9pZCB0b1RpbWVzcGVjKHN0cnVjdCB0aW1lc3BlYyYgcmVzdWx0LCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgcmVzdWx0LnR2X3NlYyA9IHZhbHVlIC8gTVNfUEVSX1M7IC8vIG1zIHRvIHMKKyAgc3RhdGljIHZvaWQgdG9UaW1lc3BlYyhzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKKyAgICByZXN1bHQudHZfc2VjID0gdmFsdWUgLyBNU19QRVJfUzsgICAgICAgICAgICAgICAgLy8gbXMgdG8gcwogICAgIHJlc3VsdC50dl9uc2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogTlNfUEVSX01TOyAvLyBtcyB0byBucwogICB9CiAKICAgc3RhdGljIHZvaWQgdG9UaW1ldmFsKHN0cnVjdCB0aW1ldmFsJiByZXN1bHQsIGludDY0X3QgdmFsdWUpIHsKLSAgICByZXN1bHQudHZfc2VjID0gKHVpbnQzMl90KSh2YWx1ZSAvIE1TX1BFUl9TKTsgLy8gbXMgdG8gcwotICAgIHJlc3VsdC50dl91c2VjID0gKHZhbHVlICUgTVNfUEVSX1MpICogVVNfUEVSX01TOyAvLyBtcyB0byB1cworICAgIHJlc3VsdC50dl9zZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsdWUgLyBNU19QRVJfUyk7ICAgICAgICAgICAgICAgIC8vIG1zIHRvIHMKKyAgICByZXN1bHQudHZfdXNlYyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigodmFsdWUgJSBNU19QRVJfUykgKiBVU19QRVJfTVMpOyAvLyBtcyB0byB1cwogICB9CiAKLSAgc3RhdGljIHZvaWQgdG9UaWNrcyhpbnQ2NF90JiByZXN1bHQsIGludDY0X3Qgc2VjcywgaW50NjRfdCBvbGRUaWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzUGVyU2VjLCBpbnQ2NF90IG5ld1RpY2tzUGVyU2VjKSB7CisgIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2VjcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9sZFRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2xkVGlja3NQZXJTZWMsCisgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBuZXdUaWNrc1BlclNlYykgewogICAgIHJlc3VsdCA9IHNlY3MgKiBuZXdUaWNrc1BlclNlYzsKICAgICByZXN1bHQgKz0gb2xkVGlja3MgKiBuZXdUaWNrc1BlclNlYyAvIG9sZFRpY2tzUGVyU2VjOwogCkBAIC04Miw0MyArODgsMzcgQEAKICAgICB9CiAgIH0KICAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1lc3BlYyB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKKyAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aWNrc1BlclNlYykgeworICBzdGF0aWMgdm9pZCB0b1RpY2tzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUsIGludDY0X3QgdGlja3NQZXJTZWMpIHsKICAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLnR2X3NlYywgdmFsdWUudHZfbnNlYywgTlNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKICAgfQogCiAgIC8qKgogICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBhcmJpdHJhcnktc2l6ZWQgdGlja3Mgc2luY2UgZXBvY2gKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpY2tzUGVyU2VjKSB7Ci0gICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZS50dl9zZWMsIHZhbHVlLnR2X3VzZWMsIFVTX1BFUl9TLCB0aWNrc1BlclNlYyk7CisgIHN0YXRpYyB2b2lkIHRvVGlja3MoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdmFsdWUsIGludDY0X3QgdGlja3NQZXJTZWMpIHsKKyAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsICh1bnNpZ25lZCBsb25nKXZhbHVlLnR2X3NlYywgKHVuc2lnbmVkIGxvbmcpdmFsdWUudHZfdXNlYywgVVNfUEVSX1MsIHRpY2tzUGVyU2VjKTsKICAgfQogCiAgIC8qKgotICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXNwZWMgdG8gbWlsbGlzZWNvbmRzCisgICAqIENvbnZlcnRzIHN0cnVjdCBUSFJJRlRfVElNRVNQRUMgdG8gbWlsbGlzZWNvbmRzCiAgICAqLwotICBzdGF0aWMgdm9pZCB0b01pbGxpc2Vjb25kcyhpbnQ2NF90JiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUpIHsKKyAgc3RhdGljIHZvaWQgdG9NaWxsaXNlY29uZHMoaW50NjRfdCYgcmVzdWx0LCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgewogICAgIHJldHVybiB0b1RpY2tzKHJlc3VsdCwgdmFsdWUsIE1TX1BFUl9TKTsKICAgfQogCiAgIC8qKgogICAgKiBDb252ZXJ0cyBzdHJ1Y3QgdGltZXZhbCB0byBtaWxsaXNlY29uZHMKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CisgIHN0YXRpYyB2b2lkIHRvTWlsbGlzZWNvbmRzKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IHRpbWV2YWwmIHZhbHVlKSB7CiAgICAgcmV0dXJuIHRvVGlja3MocmVzdWx0LCB2YWx1ZSwgTVNfUEVSX1MpOwogICB9CiAKICAgLyoqCi0gICAqIENvbnZlcnRzIHN0cnVjdCB0aW1lc3BlYyB0byBtaWNyb3NlY29uZHMKKyAgICogQ29udmVydHMgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0byBtaWNyb3NlY29uZHMKICAgICovCi0gIHN0YXRpYyB2b2lkIHRvVXNlYyhpbnQ2NF90JiByZXN1bHQsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyYgdmFsdWUpIHsKKyAgc3RhdGljIHZvaWQgdG9Vc2VjKGludDY0X3QmIHJlc3VsdCwgY29uc3Qgc3RydWN0IFRIUklGVF9USU1FU1BFQyYgdmFsdWUpIHsKICAgICByZXR1cm4gdG9UaWNrcyhyZXN1bHQsIHZhbHVlLCBVU19QRVJfUyk7CiAgIH0KIApAQCAtMTQ0LDcgKzE0NCw4IEBACiAgICAqLwogICBzdGF0aWMgaW50NjRfdCBjdXJyZW50VGltZVVzZWMoKSB7IHJldHVybiBjdXJyZW50VGltZVRpY2tzKFVTX1BFUl9TKTsgfQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9VVElMX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcAppbmRleCA5YTliNjcyLi4wN2Y2YmE1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKQEAgLTE3LDQ4ICsxNyw1MyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIlBlZWtQcm9jZXNzb3IuaCIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgewogCiBQZWVrUHJvY2Vzc29yOjpQZWVrUHJvY2Vzc29yKCkgewogICBtZW1vcnlCdWZmZXJfLnJlc2V0KG5ldyBUTWVtb3J5QnVmZmVyKCkpOwogICB0YXJnZXRUcmFuc3BvcnRfID0gbWVtb3J5QnVmZmVyXzsKIH0KLVBlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkge30KK1BlZWtQcm9jZXNzb3I6On5QZWVrUHJvY2Vzc29yKCkgeworfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OmluaXRpYWxpemUoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KSB7Cit2b2lkIFBlZWtQcm9jZXNzb3I6OmluaXRpYWxpemUoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KSB7CiAgIGFjdHVhbFByb2Nlc3Nvcl8gPSBhY3R1YWxQcm9jZXNzb3I7CiAgIHBpcGVkUHJvdG9jb2xfID0gcHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbCh0YXJnZXRUcmFuc3BvcnRfKTsKICAgdHJhbnNwb3J0RmFjdG9yeV8gPSB0cmFuc3BvcnRGYWN0b3J5OwogICB0cmFuc3BvcnRGYWN0b3J5Xy0+aW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydCh0YXJnZXRUcmFuc3BvcnRfKTsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gUGVla1Byb2Nlc3Nvcjo6Z2V0UGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW4pIHsKK3N0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBQZWVrUHJvY2Vzc29yOjpnZXRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW4pIHsKICAgcmV0dXJuIHRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoaW4pOwogfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OnNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpIHsKK3ZvaWQgUGVla1Byb2Nlc3Nvcjo6c2V0VGFyZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpIHsKICAgdGFyZ2V0VHJhbnNwb3J0XyA9IHRhcmdldFRyYW5zcG9ydDsKLSAgaWYgKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgewotICAgIG1lbW9yeUJ1ZmZlcl8gPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0KTsKLSAgfSBlbHNlIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKSkgewotICAgIG1lbW9yeUJ1ZmZlcl8gPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XyktPmdldFRhcmdldFRyYW5zcG9ydCgpKTsKKyAgaWYgKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKKyAgICBtZW1vcnlCdWZmZXJfID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KAorICAgICAgICBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XyktPmdldFRhcmdldFRyYW5zcG9ydCgpKTsKICAgfQogCiAgIGlmICghbWVtb3J5QnVmZmVyXykgewotICAgIHRocm93IFRFeGNlcHRpb24oIlRhcmdldCB0cmFuc3BvcnQgbXVzdCBiZSBhIFRNZW1vcnlCdWZmZXIgb3IgYSBUUGlwZWRUcmFuc3BvcnQgd2l0aCBUTWVtb3J5QnVmZmVyIik7CisgICAgdGhyb3cgVEV4Y2VwdGlvbigKKyAgICAgICAgIlRhcmdldCB0cmFuc3BvcnQgbXVzdCBiZSBhIFRNZW1vcnlCdWZmZXIgb3IgYSBUUGlwZWRUcmFuc3BvcnQgd2l0aCBUTWVtb3J5QnVmZmVyIik7CiAgIH0KIH0KIAotYm9vbCBQZWVrUHJvY2Vzc29yOjpwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXQsCitib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAKICAgc3RkOjpzdHJpbmcgZm5hbWU7CkBAIC02Niw3ICs3MSw3IEBACiAgIGludDMyX3Qgc2VxaWQ7CiAgIGluLT5yZWFkTWVzc2FnZUJlZ2luKGZuYW1lLCBtdHlwZSwgc2VxaWQpOwogCi0gIGlmIChtdHlwZSAhPSBUX0NBTEwpIHsKKyAgaWYgKG10eXBlICE9IFRfQ0FMTCAmJiBtdHlwZSAhPSBUX09ORVdBWSkgewogICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CiAgIH0KIApAQCAtMTA3LDIxICsxMTIsMjEgQEAKIH0KIAogdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZm5hbWUpIHsKLSAgKHZvaWQpIGZuYW1lOworICAodm9pZClmbmFtZTsKIH0KIAogdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkgewotICAodm9pZCkgYnVmZmVyOwotICAodm9pZCkgc2l6ZTsKKyAgKHZvaWQpYnVmZmVyOworICAodm9pZClzaXplOwogfQogCi12b2lkIFBlZWtQcm9jZXNzb3I6OnBlZWsoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSBmdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGZpZCkgewotICAodm9pZCkgZmlkOwordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLCBUVHlwZSBmdHlwZSwgaW50MTZfdCBmaWQpIHsKKyAgKHZvaWQpZmlkOwogICBpbi0+c2tpcChmdHlwZSk7CiB9CiAKLXZvaWQgUGVla1Byb2Nlc3Nvcjo6cGVla0VuZCgpIHt9Ci0KLX19fQordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrRW5kKCkgeworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaAppbmRleCA5Y2ZiMzVhLi5lZmFjMmI5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaApAQCAtMjUsOSArMjUsMTEgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb2Nlc3NvciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb2Nlc3NvciB7CiAKIC8qCiAgKiBDbGFzcyBmb3IgcGVla2luZyBhdCB0aGUgcmF3IGRhdGEgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQgYnkgYW5vdGhlciBwcm9jZXNzb3IKQEAgLTM2LDcgKzM4LDcgQEAKICAqLwogY2xhc3MgUGVla1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7CiAKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFBlZWtQcm9jZXNzb3IoKTsKICAgdmlydHVhbCB+UGVla1Byb2Nlc3NvcigpOwogCkBAIC00NCwzNSArNDYsMzggQEAKICAgLy8gICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5ICAtIHRoZSBwcm90b2NvbCBmYWN0b3J5IHVzZWQgdG8gd3JhcCB0aGUgbWVtb3J5IGJ1ZmZlcgogICAvLyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5IC0gdGhpcyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5IGlzIHVzZWQgdG8gd3JhcCB0aGUgc291cmNlIHRyYW5zcG9ydAogICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlhIGEgY2FsbCB0byBnZXRQaXBlZFRyYW5zcG9ydAotICB2b2lkIGluaXRpYWxpemUoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7CisgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGdldFBpcGVkVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluKTsKIAotICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0YXJnZXRUcmFuc3BvcnQpOworICB2b2lkIHNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKIAotICB2aXJ0dWFsIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCk7CiAKICAgLy8gVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgY2FuIGJlIG92ZXJsb2FkZWQgYnkgY2hpbGQgY2xhc3NlcyB0bwogICAvLyBhY2hpZXZlIGRlc2lyZWQgcGVla2luZyBiZWhhdmlvcgogICB2aXJ0dWFsIHZvaWQgcGVla05hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lKTsKICAgdmlydHVhbCB2b2lkIHBlZWtCdWZmZXIodWludDhfdCogYnVmZmVyLCB1aW50MzJfdCBzaXplKTsKLSAgdmlydHVhbCB2b2lkIHBlZWsoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICB2aXJ0dWFsIHZvaWQgcGVlayhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAogICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlLAogICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGZpZCk7CiAgIHZpcnR1YWwgdm9pZCBwZWVrRW5kKCk7CiAKLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gbWVtb3J5QnVmZmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXBlZFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gbWVtb3J5QnVmZmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydF87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb2Nlc3NvcgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCmluZGV4IDU4Y2QxZGMuLmU5OGVmYjggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKQEAgLTIwLDEyICsyMCwxNCBAQAogI2lmbmRlZiBTVEFUU1BST0NFU1NPUl9ICiAjZGVmaW5lIFNUQVRTUFJPQ0VTU09SX0gKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm9jZXNzb3IgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm9jZXNzb3IgewogCiAvKgogICogQ2xhc3MgZm9yIGtlZXBpbmcgdHJhY2sgb2YgZnVuY3Rpb24gY2FsbCBzdGF0aXN0aWNzIGFuZCBwcmludGluZyB0aGVtIGlmIGRlc2lyZWQKQEAgLTMzLDE0ICszNSwxMSBAQAogICovCiBjbGFzcyBTdGF0c1Byb2Nlc3NvciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIFN0YXRzUHJvY2Vzc29yKGJvb2wgcHJpbnQsIGJvb2wgZnJlcXVlbmN5KQotICAgIDogcHJpbnRfKHByaW50KSwKLSAgICAgIGZyZXF1ZW5jeV8oZnJlcXVlbmN5KQotICB7fQotICB2aXJ0dWFsIH5TdGF0c1Byb2Nlc3NvcigpIHt9OworICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkgOiBwcmludF8ocHJpbnQpLCBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkge30KKyAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKXt9OwogCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc2VydmVyQ29udGV4dCkgewogCiAgICAgcGlwcm90XyA9IHBpcHJvdDsKQEAgLTUwLDcgKzQ5LDcgQEAKICAgICBpbnQzMl90IHNlcWlkOwogCiAgICAgcGlwcm90Xy0+cmVhZE1lc3NhZ2VCZWdpbihmbmFtZSwgbXR5cGUsIHNlcWlkKTsKLSAgICBpZiAobXR5cGUgIT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwpIHsKKyAgICBpZiAobXR5cGUgIT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0NBTEwgJiYgbXR5cGUgIT0gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX09ORVdBWSkgewogICAgICAgaWYgKHByaW50XykgewogICAgICAgICBwcmludGYoIlVua25vd24gbWVzc2FnZSB0eXBlXG4iKTsKICAgICAgIH0KQEAgLTg4LDE3OSArODcsMTU2IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4mIGdldF9mcmVxdWVuY3lfbWFwKCkgewotICAgIHJldHVybiBmcmVxdWVuY3lfbWFwXzsKLSAgfQorICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4mIGdldF9mcmVxdWVuY3lfbWFwKCkgeyByZXR1cm4gZnJlcXVlbmN5X21hcF87IH0KIAogcHJvdGVjdGVkOgogICB2b2lkIHByaW50QW5kUGFzc1RvQnVmZmVyKGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGUpIHsKICAgICBzd2l0Y2ggKGZ0eXBlKSB7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9CT09MOgotICAgICAgICB7Ci0gICAgICAgICAgYm9vbCBib29sdjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkQm9vbChib29sdik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGJvb2x2KTsKLSAgICAgICAgICB9CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQk9PTDogeworICAgICAgYm9vbCBib29sdjsKKyAgICAgIHBpcHJvdF8tPnJlYWRCb29sKGJvb2x2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGJvb2x2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0JZVEU6IHsKKyAgICAgIGludDhfdCBieXRldjsKKyAgICAgIHBpcHJvdF8tPnJlYWRCeXRlKGJ5dGV2KTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGJ5dGV2KTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kxNjogeworICAgICAgaW50MTZfdCBpMTY7CisgICAgICBwaXByb3RfLT5yZWFkSTE2KGkxNik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWQiLCBpMTYpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTMyOiB7CisgICAgICBpbnQzMl90IGkzMjsKKyAgICAgIHBpcHJvdF8tPnJlYWRJMzIoaTMyKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCIlZCIsIGkzMik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQ6IHsKKyAgICAgIGludDY0X3QgaTY0OworICAgICAgcGlwcm90Xy0+cmVhZEk2NChpNjQpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIiVsZCIsIGk2NCk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEU6IHsKKyAgICAgIGRvdWJsZSBkdWI7CisgICAgICBwaXByb3RfLT5yZWFkRG91YmxlKGR1Yik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJWYiLCBkdWIpOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSSU5HOiB7CisgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICBwaXByb3RfLT5yZWFkU3RyaW5nKHN0cik7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiJXMiLCBzdHIuY19zdHIoKSk7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJVQ1Q6IHsKKyAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICBpbnQxNl90IGZpZDsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZnR5cGU7CisgICAgICBwaXByb3RfLT5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiPCIpOworICAgICAgfQorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7CisgICAgICAgIGlmIChmdHlwZSA9PSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RPUCkgeworICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfQllURToKLSAgICAgICAgewotICAgICAgICAgIGludDhfdCBieXRldjsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkQnl0ZShieXRldik7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlZCIsIGJ5dGV2KTsKLSAgICAgICAgICB9CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKGZ0eXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiLCIpOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfSTE2OgotICAgICAgICB7Ci0gICAgICAgICAgaW50MTZfdCBpMTY7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZEkxNihpMTYpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJWQiLCBpMTYpOwotICAgICAgICAgIH0KKyAgICAgICAgcGlwcm90Xy0+cmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkU3RydWN0RW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGI+Iik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVA6IHsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUga2V5VHlwZTsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgdmFsVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigieyIpOworICAgICAgfQorICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihrZXlUeXBlKTsKKyAgICAgICAgaWYgKHByaW50XykgeworICAgICAgICAgIHByaW50ZigiPT4iKTsKICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMjoKLSAgICAgICAgewotICAgICAgICAgIGludDMyX3QgaTMyOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRJMzIoaTMyKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVkIiwgaTMyKTsKLSAgICAgICAgICB9CisgICAgICAgIHByaW50QW5kUGFzc1RvQnVmZmVyKHZhbFR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9JNjQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBpbnQ2NF90IGk2NDsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkSTY0KGk2NCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCIlbGQiLCBpNjQpOwotICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBpcHJvdF8tPnJlYWRNYXBFbmQoKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJcYn0iKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NFVDogeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBlbGVtVHlwZTsKKyAgICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgICBwaXByb3RfLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoInsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9ET1VCTEU6Ci0gICAgICAgIHsKLSAgICAgICAgICBkb3VibGUgZHViOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWREb3VibGUoZHViKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVmIiwgZHViKTsKLSAgICAgICAgICB9CisgICAgICB9CisgICAgICBwaXByb3RfLT5yZWFkU2V0RW5kKCk7CisgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgIHByaW50ZigiXGJ9Iik7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9MSVNUOiB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOworICAgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICAgIHBpcHJvdF8tPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgICAgaWYgKHByaW50XykgeworICAgICAgICBwcmludGYoIlsiKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOworICAgICAgICBpZiAocHJpbnRfKSB7CisgICAgICAgICAgcHJpbnRmKCIsIik7CiAgICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVFJJTkc6Ci0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnN0cmluZyBzdHI7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFN0cmluZyhzdHIpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiJXMiLCBzdHIuY19zdHIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUOgotICAgICAgICB7Ci0gICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKLSAgICAgICAgICBpbnQxNl90IGZpZDsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGZ0eXBlOwotICAgICAgICAgIHBpcHJvdF8tPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIjwiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOwotICAgICAgICAgICAgaWYgKGZ0eXBlID09IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZnR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBpcHJvdF8tPnJlYWRGaWVsZEVuZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYj4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9NQVA6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGtleVR5cGU7Ci0gICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSB2YWxUeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigieyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludEFuZFBhc3NUb0J1ZmZlcihrZXlUeXBlKTsKLSAgICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCI9PiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIodmFsVHlwZSk7Ci0gICAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBwaXByb3RfLT5yZWFkTWFwRW5kKCk7Ci0gICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgcHJpbnRmKCJcYn0iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TRVQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRUeXBlIGVsZW1UeXBlOwotICAgICAgICAgIHVpbnQzMl90IGksIHNpemU7Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoInsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZFNldEVuZCgpOwotICAgICAgICAgIGlmIChwcmludF8pIHsKLSAgICAgICAgICAgIHByaW50ZigiXGJ9Iik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfTElTVDoKLSAgICAgICAgewotICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFR5cGUgZWxlbVR5cGU7Ci0gICAgICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgICAgICBwaXByb3RfLT5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlsiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgcHJpbnRBbmRQYXNzVG9CdWZmZXIoZWxlbVR5cGUpOwotICAgICAgICAgICAgaWYgKHByaW50XykgewotICAgICAgICAgICAgICBwcmludGYoIiwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcGlwcm90Xy0+cmVhZExpc3RFbmQoKTsKLSAgICAgICAgICBpZiAocHJpbnRfKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxiXSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcGlwcm90Xy0+cmVhZExpc3RFbmQoKTsKKyAgICAgIGlmIChwcmludF8pIHsKKyAgICAgICAgcHJpbnRmKCJcYl0iKTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgICB9CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOwogICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50NjRfdD4gZnJlcXVlbmN5X21hcF87CiAKICAgYm9vbCBwcmludF87CiAgIGJvb2wgZnJlcXVlbmN5XzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvY2Vzc29yCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm9jZXNzb3IKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWE3Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaApAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UTVVMVElQTEVYRURQUk9DRVNTT1JfSF8KKyNkZWZpbmUgVEhSSUZUX1RNVUxUSVBMRVhFRFBST0NFU1NPUl9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8Ym9vc3QvdG9rZW5pemVyLmhwcD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKKy8qKgorICogIFRvIGJlIGFibGUgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbERlY29yYXRvciB7CitwdWJsaWM6CisgIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpCisgICAgOiBUUHJvdG9jb2xEZWNvcmF0b3IoX3Byb3RvY29sKSwgbmFtZShfbmFtZSksIHR5cGUoX3R5cGUpLCBzZXFpZChfc2VxaWQpIHt9CisKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBfbmFtZSwgVE1lc3NhZ2VUeXBlJiBfdHlwZSwgaW50MzJfdCYgX3NlcWlkKSB7CisKKyAgICBfbmFtZSA9IG5hbWU7CisgICAgX3R5cGUgPSB0eXBlOworICAgIF9zZXFpZCA9IHNlcWlkOworCisgICAgcmV0dXJuIDA7IC8vIChOb3JtYWwgVFByb3RvY29sIHJlYWQgZnVuY3Rpb25zIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZCkKKyAgfQorCisgIHN0ZDo6c3RyaW5nIG5hbWU7CisgIFRNZXNzYWdlVHlwZSB0eXBlOworICBpbnQzMl90IHNlcWlkOworfTsKK30gLy8gbmFtZXNwYWNlIHByb3RvY29sCisKKy8qKgorICogPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPiBpcyBhIDxjb2RlPlRQcm9jZXNzb3I8L2NvZGU+IGFsbG93aW5nCisgKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgorICoKKyAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCisgKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+CisgKgorICogPGJsb2NrcXVvdGU+PGNvZGU+CisgKiAgICAgc3RkOjpzaGFyZWRfcHRyPFRNdWx0aXBsZXhlZFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CisgKgorICogICAgIHByb2Nlc3Nvci0+cmVnaXN0ZXJQcm9jZXNzb3IoCisgKiAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAqICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcigKKyAqICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4oIG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAorICogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBXZWF0aGVyUmVwb3J0UHJvY2Vzc29yKAorICogICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFdlYXRoZXJSZXBvcnRIYW5kbGVyPiggbmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKSkpOworICoKKyAqICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogcHVibGljIFRQcm9jZXNzb3IgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gPiBzZXJ2aWNlc190OworCisgIC8qKgorICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCisgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICoKKyAgICAqIFxwYXJhbSBbaW5dIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCisgICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KKyAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIsCisgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydElmIGludGVyZmFjZS4KKyAgICAqLworICB2b2lkIHJlZ2lzdGVyUHJvY2Vzc29yKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJ2aWNlTmFtZSwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgeworICAgIHNlcnZpY2VzW3NlcnZpY2VOYW1lXSA9IHByb2Nlc3NvcjsKKyAgfQorCisgIC8qKgorICAgKiBSZWdpc3RlciBhIHNlcnZpY2UgdG8gYmUgY2FsbGVkIHRvIHByb2Nlc3MgcXVlcmllcyB3aXRob3V0IHNlcnZpY2UgbmFtZQorICAgKiBccGFyYW0gW2luXSBwcm9jZXNzb3IgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UuCisgICAqLworICB2b2lkIHJlZ2lzdGVyRGVmYXVsdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvcikgeworICAgIGRlZmF1bHRQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgIH0KKworICAvKioKKyAgICogQ2hldyB1cCBpbnZhbGlkIGlucHV0IGFuZCByZXR1cm4gYW4gZXhjZXB0aW9uIHRvIHRocm93LgorICAgKi8KKyAgVEV4Y2VwdGlvbiBwcm90b2NvbF9lcnJvcihzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXFpZCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZykgY29uc3QgeworICAgIGluLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7CisgICAgaW4tPnJlYWRNZXNzYWdlRW5kKCk7CisgICAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7CisgICAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgICB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsCisgICAgICAgICJUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6ICIgKyBtc2cpOworICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7CisgICAgeC53cml0ZShvdXQuZ2V0KCkpOworICAgIG91dC0+d3JpdGVNZXNzYWdlRW5kKCk7CisgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKKyAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOworICAgIHJldHVybiBURXhjZXB0aW9uKG1zZyk7Cit9CisgICAKKyAgLyoqCisgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICoKKyAgICogPG9sPgorICAgKiAgICAgPGxpPlJlYWQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS48L2xpPgorICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+CisgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgorICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCisgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuPC9saT4KKyAgICogPC9vbD4KKyAgICoKKyAgICogXHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IFRfQ0FMTCBvciBUX09ORVdBWSwgaWYKKyAgICogdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQorICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgorICAgKi8KKyAgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSB0eXBlOworICAgIGludDMyX3Qgc2VxaWQ7CisKKyAgICAvLyBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAvLyBtZXNzYWdlIGhlYWRlci4gIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgLy8gZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgaW4tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpOworCisgICAgaWYgKHR5cGUgIT0gcHJvdG9jb2w6OlRfQ0FMTCAmJiB0eXBlICE9IHByb3RvY29sOjpUX09ORVdBWSkgeworICAgICAgLy8gVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUuCisgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgYm9vc3Q6OnRva2VuaXplcjxib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4gPiB0b2sobmFtZSwgYm9vc3Q6OmNoYXJfc2VwYXJhdG9yPGNoYXI+KCI6IikpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgICBzdGQ6OmNvcHkodG9rLmJlZ2luKCksIHRvay5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHRva2VucykpOworCisgICAgLy8gQSB2YWxpZCBtZXNzYWdlIHNob3VsZCBjb25zaXN0IG9mIHR3byB0b2tlbnM6IHRoZSBzZXJ2aWNlCisgICAgLy8gbmFtZSBhbmQgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsLgorICAgIGlmICh0b2tlbnMuc2l6ZSgpID09IDIpIHsKKyAgICAgIC8vIFNlYXJjaCBmb3IgYSBwcm9jZXNzb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZSBuYW1lLgorICAgICAgc2VydmljZXNfdDo6aXRlcmF0b3IgaXQgPSBzZXJ2aWNlcy5maW5kKHRva2Vuc1swXSk7CisKKyAgICAgIGlmIChpdCAhPSBzZXJ2aWNlcy5lbmQoKSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gaXQtPnNlY29uZDsKKyAgICAgICAgLy8gTGV0IHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzZXJ2aWNlIG5hbWUKKyAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWVzc2FnZS4KKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgorICAgICAgICAgICAgLT5wcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb3RvY29sOjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHRva2Vuc1sxXSwgdHlwZSwgc2VxaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVW5rbm93biBzZXJ2aWNlLgorICAgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgCisgICAgICAgICAgICAiVW5rbm93biBzZXJ2aWNlOiAiICsgdG9rZW5zWzBdICsKKwkJCQkiLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2tlbnMuc2l6ZSgpID09IDEpIHsKKwkgIGlmIChkZWZhdWx0UHJvY2Vzc29yKSB7CisgICAgICAgIC8vIG5vbi1tdWx0aXBsZXhlZCBjbGllbnQgZm9yd2FyZHMgdG8gZGVmYXVsdCBwcm9jZXNzb3IKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRQcm9jZXNzb3IgICAgICAgICAgICAKKyAgICAgICAgICAgIC0+cHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBwcm90b2NvbDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB0b2tlbnNbMF0sIHR5cGUsIHNlcWlkKSksCisgICAgICAgICAgICAgICAgICAgICAgb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0KTsKKwkgIH0gZWxzZSB7CisJCXRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLAorCQkJIk5vbi1tdWx0aXBsZXhlZCBjbGllbnQgcmVxdWVzdCBkcm9wcGVkLiAiCisJCQkiRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBkZWZhdWx0UHJvY2Vzc29yKCk/Iik7CisJICB9CisgICAgfSBlbHNlIHsKKwkJdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsCisJCSAgICAiV3JvbmcgbnVtYmVyIG9mIHRva2Vucy4iKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLyoqIE1hcCBvZiBzZXJ2aWNlIHByb2Nlc3NvciBvYmplY3RzLCBpbmRleGVkIGJ5IHNlcnZpY2UgbmFtZXMuICovCisgIHNlcnZpY2VzX3Qgc2VydmljZXM7CisgIAorICAvLyEgSWYgYSBub24tbXVsdGkgY2xpZW50IHJlcXVlc3RzIHNvbWV0aGluZywgaXQgZ29lcyB0byB0aGUKKyAgLy8hIGRlZmF1bHQgcHJvY2Vzc29yIChpZiBvbmUgaXMgZGVmaW5lZCkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZGVmYXVsdFByb2Nlc3NvcjsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBUSFJJRlRfVE1VTFRJUExFWEVEUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCmluZGV4IDQ1Mjk4NWMuLjc0NzRmNWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCkBAIC0xNywxOSArMTcsMTggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJUQmFzZTY0VXRpbHMuaCIKLQotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCitzdGF0aWMgY29uc3QgdWludDhfdCoga0Jhc2U2NEVuY29kZVRhYmxlCisgICAgPSAoY29uc3QgdWludDhfdCopIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogCi1zdGF0aWMgY29uc3QgdWludDhfdCAqa0Jhc2U2NEVuY29kZVRhYmxlID0gKGNvbnN0IHVpbnQ4X3QgKikKLSAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi12b2lkICBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKmJ1Zikgewordm9pZCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QqIGluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QqIGJ1ZikgewogICBidWZbMF0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzBdID4+IDIpICYgMHgzZl07CiAgIGlmIChsZW4gPT0gMykgewogICAgIGJ1ZlsxXSA9IGtCYXNlNjRFbmNvZGVUYWJsZVsoKGluWzBdIDw8IDQpICYgMHgzMCkgfCAoKGluWzFdID4+IDQpICYgMHgwZildOwpAQCAtMzgsNDIgKzM3LDI3OSBAQAogICB9IGVsc2UgaWYgKGxlbiA9PSAyKSB7CiAgICAgYnVmWzFdID0ga0Jhc2U2NEVuY29kZVRhYmxlWygoaW5bMF0gPDwgNCkgJiAweDMwKSB8ICgoaW5bMV0gPj4gNCkgJiAweDBmKV07CiAgICAgYnVmWzJdID0ga0Jhc2U2NEVuY29kZVRhYmxlWyhpblsxXSA8PCAyKSAmIDB4M2NdOwotICB9IGVsc2UgIHsgLy8gbGVuID09IDEKKyAgfSBlbHNlIHsgLy8gbGVuID09IDEKICAgICBidWZbMV0gPSBrQmFzZTY0RW5jb2RlVGFibGVbKGluWzBdIDw8IDQpICYgMHgzMF07CiAgIH0KIH0KIAotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0Jhc2U2NERlY29kZVRhYmxlWzI1Nl0gPXsKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4M2UsMHhmZiwweGZmLDB4ZmYsMHgzZiwKLTB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4M2EsMHgzYiwweDNjLDB4M2QsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4MDAsMHgwMSwweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksMHgwYSwweDBiLDB4MGMsMHgwZCwweDBlLAotMHgwZiwweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHgxYSwweDFiLDB4MWMsMHgxZCwweDFlLDB4MWYsMHgyMCwweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsCi0weDI5LDB4MmEsMHgyYiwweDJjLDB4MmQsMHgyZSwweDJmLDB4MzAsMHgzMSwweDMyLDB4MzMsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCi0weGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAotMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKLTB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCitzdGF0aWMgY29uc3QgdWludDhfdCBrQmFzZTY0RGVjb2RlVGFibGVbMjU2XSA9IHsKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4M2UsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgzZiwKKyAgICAweDM0LAorICAgIDB4MzUsCisgICAgMHgzNiwKKyAgICAweDM3LAorICAgIDB4MzgsCisgICAgMHgzOSwKKyAgICAweDNhLAorICAgIDB4M2IsCisgICAgMHgzYywKKyAgICAweDNkLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHgwMCwKKyAgICAweDAxLAorICAgIDB4MDIsCisgICAgMHgwMywKKyAgICAweDA0LAorICAgIDB4MDUsCisgICAgMHgwNiwKKyAgICAweDA3LAorICAgIDB4MDgsCisgICAgMHgwOSwKKyAgICAweDBhLAorICAgIDB4MGIsCisgICAgMHgwYywKKyAgICAweDBkLAorICAgIDB4MGUsCisgICAgMHgwZiwKKyAgICAweDEwLAorICAgIDB4MTEsCisgICAgMHgxMiwKKyAgICAweDEzLAorICAgIDB4MTQsCisgICAgMHgxNSwKKyAgICAweDE2LAorICAgIDB4MTcsCisgICAgMHgxOCwKKyAgICAweDE5LAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4MWEsCisgICAgMHgxYiwKKyAgICAweDFjLAorICAgIDB4MWQsCisgICAgMHgxZSwKKyAgICAweDFmLAorICAgIDB4MjAsCisgICAgMHgyMSwKKyAgICAweDIyLAorICAgIDB4MjMsCisgICAgMHgyNCwKKyAgICAweDI1LAorICAgIDB4MjYsCisgICAgMHgyNywKKyAgICAweDI4LAorICAgIDB4MjksCisgICAgMHgyYSwKKyAgICAweDJiLAorICAgIDB4MmMsCisgICAgMHgyZCwKKyAgICAweDJlLAorICAgIDB4MmYsCisgICAgMHgzMCwKKyAgICAweDMxLAorICAgIDB4MzIsCisgICAgMHgzMywKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAorICAgIDB4ZmYsCisgICAgMHhmZiwKKyAgICAweGZmLAogfTsKIAotdm9pZCBiYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGJ1ZlswXSA9IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzBdXSA8PCAyKSB8Ci0gICAgICAgICAgIChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA+PiA0KTsKK3ZvaWQgYmFzZTY0X2RlY29kZSh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBidWZbMF0gPSAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlswXV0gPDwgMikgfCAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPj4gNCk7CiAgIGlmIChsZW4gPiAyKSB7Ci0gICAgYnVmWzFdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzFdXSA8PCA0KSAmIDB4ZjApIHwKLSAgICAgICAgICAgICAgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbMl1dID4+IDIpOworICAgIGJ1ZlsxXSA9ICgoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlsxXV0gPDwgNCkgJiAweGYwKSB8IChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA+PiAyKTsKICAgICBpZiAobGVuID4gMykgewotICAgICAgYnVmWzJdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA8PCA2KSAmIDB4YzApIHwKLSAgICAgICAgICAgICAgICAoa0Jhc2U2NERlY29kZVRhYmxlW2J1ZlszXV0pOworICAgICAgYnVmWzJdID0gKChrQmFzZTY0RGVjb2RlVGFibGVbYnVmWzJdXSA8PCA2KSAmIDB4YzApIHwgKGtCYXNlNjREZWNvZGVUYWJsZVtidWZbM11dKTsKICAgICB9CiAgIH0KIH0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oCmluZGV4IDNkZWY3MzMuLjFlYTY3NDQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmgKQEAgLTIzLDIwICsyMywyMyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZz4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIC8vIGluIG11c3QgYmUgYXQgbGVhc3QgbGVuIGJ5dGVzCiAvLyBsZW4gbXVzdCBiZSAxLCAyLCBvciAzCiAvLyBidWYgbXVzdCBiZSBhIGJ1ZmZlciBvZiBhdCBsZWFzdCA0IGJ5dGVzIGFuZCBtYXkgbm90IG92ZXJsYXAgaW4KIC8vIHRoZSBkYXRhIGlzIG5vdCBwYWRkZWQgd2l0aCAnPSc7IHRoZSBjYWxsZXIgY2FuIGRvIHRoaXMgaWYgZGVzaXJlZAotdm9pZCBiYXNlNjRfZW5jb2RlKGNvbnN0IHVpbnQ4X3QgKmluLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKmJ1Zik7Cit2b2lkIGJhc2U2NF9lbmNvZGUoY29uc3QgdWludDhfdCogaW4sIHVpbnQzMl90IGxlbiwgdWludDhfdCogYnVmKTsKIAogLy8gYnVmIG11c3QgYmUgYSBidWZmZXIgb2YgYXQgbGVhc3QgNCBieXRlcyBhbmQgY29udGFpbiBiYXNlNjQgZW5jb2RlZCB2YWx1ZXMKIC8vIGJ1ZiB3aWxsIGJlIGNoYW5nZWQgdG8gY29udGFpbiBvdXRwdXQgYnl0ZXMKIC8vIGxlbiBpcyBudW1iZXIgb2YgYnl0ZXMgdG8gY29uc3VtZSBmcm9tIGlucHV0IChtdXN0IGJlIDIsIDMsIG9yIDQpCiAvLyBubyAnPScgcGFkZGluZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGlucHV0Ci12b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pOwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit2b2lkIGJhc2U2NF9kZWNvZGUodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAogI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQkFTRTY0VVRJTFNfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAppbmRleCBiNzYyYWQ0Li45MDY3NzU4IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCkBAIC0yMCw2NSArMjAsNTAgQEAKICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8gMQogCi0jaW5jbHVkZSAiVFByb3RvY29sLmgiCi0jaW5jbHVkZSAiVFZpcnR1YWxQcm90b2NvbC5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAogLyoqCiAgKiBUaGUgZGVmYXVsdCBiaW5hcnkgcHJvdG9jb2wgZm9yIHRocmlmdC4gV3JpdGVzIGFsbCBkYXRhIGluIGEgdmVyeSBiYXNpYwogICogYmluYXJ5IGZvcm1hdCwgZXNzZW50aWFsbHkganVzdCBzcGl0dGluZyBvdXQgdGhlIHJhdyBieXRlcy4KICAqCiAgKi8KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotY2xhc3MgVEJpbmFyeVByb3RvY29sVAotICA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4gewotIHByb3RlY3RlZDoKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CitjbGFzcyBUQmluYXJ5UHJvdG9jb2xUIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+IHsKK3B1YmxpYzoKICAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9NQVNLID0gKChpbnQzMl90KTB4ZmZmZjAwMDApOwogICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzEgPSAoKGludDMyX3QpMHg4MDAxMDAwMCk7Ci0gIC8vIFZFUlNJT05fMiAoMHg4MDAyMDAwMCkgIGlzIHRha2VuIGJ5IFREZW5zZVByb3RvY29sLgorICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApIHdhcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbCAod2hpY2ggaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZCkKIAotIHB1YmxpYzoKLSAgVEJpbmFyeVByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykgOgotICAgIFRWaXJ0dWFsUHJvdG9jb2w8IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCi0gICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKLSAgICBzdHJpY3Rfd3JpdGVfKHRydWUpLAotICAgIHN0cmluZ19idWZfKE5VTEwpLAotICAgIHN0cmluZ19idWZfc2l6ZV8oMCkge30KKyAgVEJpbmFyeVByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XygwKSwKKyAgICAgIGNvbnRhaW5lcl9saW1pdF8oMCksCisgICAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAorICAgICAgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQogCi0gIFRCaW5hcnlQcm90b2NvbFQoYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCisgIFRCaW5hcnlQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAogICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAogICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0LAogICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaWN0X3JlYWQsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAotICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCi0gICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAotICAgIGNvbnRhaW5lcl9saW1pdF8oY29udGFpbmVyX2xpbWl0KSwKLSAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAotICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApIHt9CisgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAorICAgICAgc3RyaWN0X3JlYWRfKHN0cmljdF9yZWFkKSwKKyAgICAgIHN0cmljdF93cml0ZV8oc3RyaWN0X3dyaXRlKSB7fQogCi0gIH5UQmluYXJ5UHJvdG9jb2xUKCkgewotICAgIGlmIChzdHJpbmdfYnVmXyAhPSBOVUxMKSB7Ci0gICAgICBzdGQ6OmZyZWUoc3RyaW5nX2J1Zl8pOwotICAgICAgc3RyaW5nX2J1Zl9zaXplXyA9IDA7Ci0gICAgfQotICB9CisgIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7IHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7IH0KIAotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KLQotICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgewotICAgIGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsgfQogCiAgIHZvaWQgc2V0U3RyaWN0KGJvb2wgc3RyaWN0X3JlYWQsIGJvb2wgc3RyaWN0X3dyaXRlKSB7CiAgICAgc3RyaWN0X3JlYWRfID0gc3RyaWN0X3JlYWQ7CkBAIC05NSwyMiArODAsMTcgQEAKIAogICAvKm9sKi8gdWludDMyX3Qgd3JpdGVNZXNzYWdlRW5kKCk7CiAKLQogICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKIAogICBpbmxpbmUgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKIAotICBpbmxpbmUgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwogCiAgIGlubGluZSB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7CiAKICAgaW5saW5lIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CiAKLSAgaW5saW5lIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOwogCiAgIGlubGluZSB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwogCkBAIC0xNDMsMTAgKzEyMyw3IEBACiAgICAqIFJlYWRpbmcgZnVuY3Rpb25zCiAgICAqLwogCi0KLSAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKKyAgLypvbCovIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKTsKIAogICAvKm9sKi8gdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKIApAQCAtMTU0LDE1ICsxMzEsMTEgQEAKIAogICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwogCi0gIGlubGluZSB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKKyAgaW5saW5lIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKIAogICBpbmxpbmUgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7CiAKLSAgaW5saW5lIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7CisgIGlubGluZSB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKIApAQCAtMTc2LDcgKzE0OSw3IEBACiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKICAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID46OnJlYWRCb29sOworICB1c2luZyBUVmlydHVhbFByb3RvY29sPFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz4gPjo6cmVhZEJvb2w7CiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWRCeXRlKGludDhfdCYgYnl0ZSk7CiAKQEAgLTE4OCwxMyArMTYxLDEzIEBACiAKICAgaW5saW5lIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFN0clR5cGU+CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTdHJUeXBlPgogICBpbmxpbmUgdWludDMyX3QgcmVhZFN0cmluZyhTdHJUeXBlJiBzdHIpOwogCiAgIGlubGluZSB1aW50MzJfdCByZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpOwogCi0gcHJvdGVjdGVkOgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJUeXBlPgorcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KICAgdWludDMyX3QgcmVhZFN0cmluZ0JvZHkoU3RyVHlwZSYgc3RyLCBpbnQzMl90IHN6KTsKIAogICBUcmFuc3BvcnRfKiB0cmFuc187CkBAIC0yMDUsNzggKzE3OCw3MyBAQAogICAvLyBFbmZvcmNlIHByZXNlbmNlIG9mIHZlcnNpb24gaWRlbnRpZmllcgogICBib29sIHN0cmljdF9yZWFkXzsKICAgYm9vbCBzdHJpY3Rfd3JpdGVfOwotCi0gIC8vIEJ1ZmZlciBmb3IgcmVhZGluZyBzdHJpbmdzLCBzYXZlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3RvY29sIHRvCi0gIC8vIGF2b2lkIG1lbW9yeSBjaHVybiBhbGxvY2F0aW5nIG1lbW9yeSBvbiBldmVyeSBzdHJpbmcgcmVhZAotICB1aW50OF90KiBzdHJpbmdfYnVmXzsKLSAgaW50MzJfdCBzdHJpbmdfYnVmX3NpemVfOwotCiB9OwogCiB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydD4gVEJpbmFyeVByb3RvY29sOwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQsIFROZXR3b3JrTGl0dGxlRW5kaWFuPiBUTEVCaW5hcnlQcm90b2NvbDsKIAogLyoqCiAgKiBDb25zdHJ1Y3RzIGJpbmFyeSBwcm90b2NvbCBoYW5kbGVycwogICovCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfID0gVE5ldHdvcmtCaWdFbmRpYW4+CiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKCkgOgotICAgIHN0cmluZ19saW1pdF8oMCksCi0gICAgY29udGFpbmVyX2xpbWl0XygwKSwKLSAgICBzdHJpY3RfcmVhZF8oZmFsc2UpLAotICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KK3B1YmxpYzoKKyAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKQorICAgIDogc3RyaW5nX2xpbWl0XygwKSwgY29udGFpbmVyX2xpbWl0XygwKSwgc3RyaWN0X3JlYWRfKGZhbHNlKSwgc3RyaWN0X3dyaXRlXyh0cnVlKSB7fQogCi0gIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwgYm9vbCBzdHJpY3Rfd3JpdGUpIDoKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpLAotICAgIHN0cmljdF9yZWFkXyhzdHJpY3RfcmVhZCksCi0gICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CisgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3RfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJpY3Rfd3JpdGUpCisgICAgOiBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCisgICAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCksCisgICAgICBzdHJpY3RfcmVhZF8oc3RyaWN0X3JlYWQpLAorICAgICAgc3RyaWN0X3dyaXRlXyhzdHJpY3Rfd3JpdGUpIHt9CiAKICAgdmlydHVhbCB+VEJpbmFyeVByb3RvY29sRmFjdG9yeVQoKSB7fQogCi0gIHZvaWQgc2V0U3RyaW5nU2l6ZUxpbWl0KGludDMyX3Qgc3RyaW5nX2xpbWl0KSB7Ci0gICAgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsKLSAgfQorICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgeyBzdHJpbmdfbGltaXRfID0gc3RyaW5nX2xpbWl0OyB9CiAKLSAgdm9pZCBzZXRDb250YWluZXJTaXplTGltaXQoaW50MzJfdCBjb250YWluZXJfbGltaXQpIHsKLSAgICBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OwotICB9CisgIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7IGNvbnRhaW5lcl9saW1pdF8gPSBjb250YWluZXJfbGltaXQ7IH0KIAogICB2b2lkIHNldFN0cmljdChib29sIHN0cmljdF9yZWFkLCBib29sIHN0cmljdF93cml0ZSkgewogICAgIHN0cmljdF9yZWFkXyA9IHN0cmljdF9yZWFkOwogICAgIHN0cmljdF93cml0ZV8gPSBzdHJpY3Rfd3JpdGU7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gc3BlY2lmaWNfdHJhbnMgPQotICAgICAgYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CiAgICAgVFByb3RvY29sKiBwcm90OwogICAgIGlmIChzcGVjaWZpY190cmFucykgewotICAgICAgcHJvdCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+KHNwZWNpZmljX3RyYW5zLCBzdHJpbmdfbGltaXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sIHN0cmljdF9yZWFkXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKKyAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPihzcGVjaWZpY190cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3JlYWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZV8pOwogICAgIH0gZWxzZSB7Ci0gICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywgc3RyaWN0X3dyaXRlXyk7CisgICAgICBwcm90ID0gbmV3IFRCaW5hcnlQcm90b2NvbFQ8VFRyYW5zcG9ydCwgQnl0ZU9yZGVyXz4odHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2xpbWl0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGltaXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF9yZWFkXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Rfd3JpdGVfKTsKICAgICB9CiAKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CiAgIH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBpbnQzMl90IHN0cmluZ19saW1pdF87CiAgIGludDMyX3QgY29udGFpbmVyX2xpbWl0XzsKICAgYm9vbCBzdHJpY3RfcmVhZF87CiAgIGJvb2wgc3RyaWN0X3dyaXRlXzsKLQogfTsKIAogdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0PiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5VDxUVHJhbnNwb3J0LCBUTmV0d29ya0xpdHRsZUVuZGlhbj4gVExFQmluYXJ5UHJvdG9jb2xGYWN0b3J5OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jaW5jbHVkZSAiVEJpbmFyeVByb3RvY29sLnRjYyIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYz4KIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UQklOQVJZUFJPVE9DT0xfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wudGNjIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKaW5kZXggMjk0YzgzMS4uZmU3Mzk5MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MKQEAgLTIwLDE3ICsyMCwxOCBAQAogI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RCSU5BUllQUk9UT0NPTF9UQ0NfCiAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX1RDQ18gMQogCi0jaW5jbHVkZSAiVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogCiAjaW5jbHVkZSA8bGltaXRzPgogCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKICAgaWYgKHRoaXMtPnN0cmljdF93cml0ZV8pIHsKICAgICBpbnQzMl90IHZlcnNpb24gPSAoVkVSU0lPTl8xKSB8ICgoaW50MzJfdCltZXNzYWdlVHlwZSk7CiAgICAgdWludDMyX3Qgd3NpemUgPSAwOwpAQCAtNDcsNDggKzQ4LDQ3IEBACiAgIH0KIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZU1lc3NhZ2VFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlTWVzc2FnZUVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgKHZvaWQpbmFtZTsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVTdHJ1Y3RFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RydWN0RW5kKCkgewogICByZXR1cm4gMDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgICh2b2lkKW5hbWU7CiAgIHVpbnQzMl90IHdzaXplID0gMDsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZmllbGRUeXBlKTsKICAgd3NpemUgKz0gd3JpdGVJMTYoZmllbGRJZCk7CiAgIHJldHVybiB3c2l6ZTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUZpZWxkRW5kKCkgewogICByZXR1cm4gMDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUZpZWxkU3RvcCgpIHsKLSAgcmV0dXJuCi0gICAgd3JpdGVCeXRlKChpbnQ4X3QpVF9TVE9QKTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVGaWVsZFN0b3AoKSB7CisgIHJldHVybiB3cml0ZUJ5dGUoKGludDhfdClUX1NUT1ApOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgdWludDMyX3Qgd3NpemUgPSAwOwogICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdClrZXlUeXBlKTsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpdmFsVHlwZSk7CkBAIC05Niw4OSArOTYsODggQEAKICAgcmV0dXJuIHdzaXplOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlTWFwRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZU1hcEVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIHVpbnQzMl90IHdzaXplID0gMDsKLSAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpIGVsZW1UeXBlKTsKLSAgd3NpemUgKz0gd3JpdGVJMzIoKGludDMyX3Qpc2l6ZSk7Ci0gIHJldHVybiB3c2l6ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUxpc3RFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgIHVpbnQzMl90IHdzaXplID0gMDsKICAgd3NpemUgKz0gd3JpdGVCeXRlKChpbnQ4X3QpZWxlbVR5cGUpOwogICB3c2l6ZSArPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKICAgcmV0dXJuIHdzaXplOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU2V0RW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUxpc3RFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7Ci0gIHVpbnQ4X3QgdG1wID0gIHZhbHVlID8gMSA6IDA7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU2V0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdWludDMyX3Qgd3NpemUgPSAwOworICB3c2l6ZSArPSB3cml0ZUJ5dGUoKGludDhfdCllbGVtVHlwZSk7CisgIHdzaXplICs9IHdyaXRlSTMyKChpbnQzMl90KXNpemUpOworICByZXR1cm4gd3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVTZXRFbmQoKSB7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKSB7CisgIHVpbnQ4X3QgdG1wID0gdmFsdWUgPyAxIDogMDsKICAgdGhpcy0+dHJhbnNfLT53cml0ZSgmdG1wLCAxKTsKICAgcmV0dXJuIDE7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYnl0ZSwgMSk7CiAgIHJldHVybiAxOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KSB7Ci0gIGludDE2X3QgbmV0ID0gKGludDE2X3QpaHRvbnMoaTE2KTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKKyAgaW50MTZfdCBuZXQgPSAoaW50MTZfdClCeXRlT3JkZXJfOjp0b1dpcmUxNihpMTYpOwogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmbmV0LCAyKTsKICAgcmV0dXJuIDI7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubChpMzIpOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgeworICBpbnQzMl90IG5ldCA9IChpbnQzMl90KUJ5dGVPcmRlcl86OnRvV2lyZTMyKGkzMik7CiAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDQpOwogICByZXR1cm4gNDsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KWh0b25sbChpNjQpOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgeworICBpbnQ2NF90IG5ldCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OnRvV2lyZTY0KGk2NCk7CiAgIHRoaXMtPnRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZuZXQsIDgpOwogICByZXR1cm4gODsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOwordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKICAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKLSAgYml0cyA9IGh0b25sbChiaXRzKTsKKyAgYml0cyA9IEJ5dGVPcmRlcl86OnRvV2lyZTY0KGJpdHMpOwogICB0aGlzLT50cmFuc18tPndyaXRlKCh1aW50OF90KikmYml0cywgOCk7CiAgIHJldHVybiA4OwogfQogCi0KLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdGVtcGxhdGU8dHlwZW5hbWUgU3RyVHlwZT4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKGNvbnN0IFN0clR5cGUmIHN0cikgewotICBpZihzdHIuc2l6ZSgpID4gc3RhdGljX2Nhc3Q8c2l6ZV90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordGVtcGxhdGUgPHR5cGVuYW1lIFN0clR5cGU+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+Ojp3cml0ZVN0cmluZyhjb25zdCBTdHJUeXBlJiBzdHIpIHsKKyAgaWYgKHN0ci5zaXplKCkgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB1aW50MzJfdCBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5zaXplKCkpOwogICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUkzMigoaW50MzJfdClzaXplKTsKQEAgLTE4OCwxOSArMTg3LDE5IEBACiAgIHJldHVybiByZXN1bHQgKyBzaXplOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlU3RyaW5nKHN0cik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OndyaXRlU3RyaW5nKHN0cik7CiB9CiAKIC8qKgogICogUmVhZGluZyBmdW5jdGlvbnMKICAqLwogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc3o7CiAgIHJlc3VsdCArPSByZWFkSTMyKHN6KTsKQEAgLTIxNiw3ICsyMTUsOCBAQAogICAgIHJlc3VsdCArPSByZWFkSTMyKHNlcWlkKTsKICAgfSBlbHNlIHsKICAgICBpZiAodGhpcy0+c3RyaWN0X3JlYWRfKSB7Ci0gICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHZlcnNpb24gaWRlbnRpZmllci4uLiBvbGQgcHJvdG9jb2wgY2xpZW50IGluIHN0cmljdCBtb2RlPyIpOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAogICAgICAgaW50OF90IHR5cGU7CkBAIC0yMjksMjcgKzIyOSwyNyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNZXNzYWdlRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWVzc2FnZUVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewogICBuYW1lID0gIiI7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJ1Y3RFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJ1Y3RFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgKHZvaWQpbmFtZTsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50OF90IHR5cGU7CiAgIHJlc3VsdCArPSByZWFkQnl0ZSh0eXBlKTsKQEAgLTI2MiwxNSArMjYyLDE1IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEZpZWxkRW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRmllbGRFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKICAgaW50OF90IGssIHY7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc2l6ZWk7CkBAIC0yODgsMTQgKzI4OCwxMyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRNYXBFbmQoKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRNYXBFbmQoKSB7CiAgIHJldHVybiAwOwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKICAgaW50OF90IGU7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGludDMyX3Qgc2l6ZWk7CkBAIC0zMTEsMTQgKzMxMCwxMyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRMaXN0RW5kKCkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkTGlzdEVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFNldEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICBpbnQ4X3QgZTsKICAgdWludDMyX3QgcmVzdWx0ID0gMDsKICAgaW50MzJfdCBzaXplaTsKQEAgLTMzNCw5MyArMzMyLDkyIEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZFNldEVuZCgpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZFNldEVuZCgpIHsKICAgcmV0dXJuIDA7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKICAgdWludDhfdCBiWzFdOwogICB0aGlzLT50cmFuc18tPnJlYWRBbGwoYiwgMSk7CiAgIHZhbHVlID0gKihpbnQ4X3QqKWIgIT0gMDsKICAgcmV0dXJuIDE7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewogICB1aW50OF90IGJbMV07CiAgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbChiLCAxKTsKICAgYnl0ZSA9ICooaW50OF90KiliOwogICByZXR1cm4gMTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkSTE2KGludDE2X3QmIGkxNikgewogICB1bmlvbiBieXRlcyB7CiAgICAgdWludDhfdCBiWzJdOwogICAgIGludDE2X3QgYWxsOwogICB9IHRoZUJ5dGVzOwogICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgMik7Ci0gIGkxNiA9IChpbnQxNl90KW50b2hzKHRoZUJ5dGVzLmFsbCk7CisgIGkxNiA9IChpbnQxNl90KUJ5dGVPcmRlcl86OmZyb21XaXJlMTYodGhlQnl0ZXMuYWxsKTsKICAgcmV0dXJuIDI7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEkzMihpbnQzMl90JiBpMzIpIHsKICAgdW5pb24gYnl0ZXMgewogICAgIHVpbnQ4X3QgYls0XTsKICAgICBpbnQzMl90IGFsbDsKICAgfSB0aGVCeXRlczsKICAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoZUJ5dGVzLmIsIDQpOwotICBpMzIgPSAoaW50MzJfdCludG9obCh0aGVCeXRlcy5hbGwpOworICBpMzIgPSAoaW50MzJfdClCeXRlT3JkZXJfOjpmcm9tV2lyZTMyKHRoZUJ5dGVzLmFsbCk7CiAgIHJldHVybiA0OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgQnl0ZU9yZGVyXz4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7CiAgIHVuaW9uIGJ5dGVzIHsKICAgICB1aW50OF90IGJbOF07CiAgICAgaW50NjRfdCBhbGw7CiAgIH0gdGhlQnl0ZXM7CiAgIHRoaXMtPnRyYW5zXy0+cmVhZEFsbCh0aGVCeXRlcy5iLCA4KTsKLSAgaTY0ID0gKGludDY0X3QpbnRvaGxsKHRoZUJ5dGVzLmFsbCk7CisgIGk2NCA9IChpbnQ2NF90KUJ5dGVPcmRlcl86OmZyb21XaXJlNjQodGhlQnl0ZXMuYWxsKTsKICAgcmV0dXJuIDg7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgeworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVuaW9uIGJ5dGVzIHsKICAgICB1aW50OF90IGJbOF07CiAgICAgdWludDY0X3QgYWxsOwogICB9IHRoZUJ5dGVzOwogICB0aGlzLT50cmFuc18tPnJlYWRBbGwodGhlQnl0ZXMuYiwgOCk7Ci0gIHRoZUJ5dGVzLmFsbCA9IG50b2hsbCh0aGVCeXRlcy5hbGwpOworICB0aGVCeXRlcy5hbGwgPSBCeXRlT3JkZXJfOjpmcm9tV2lyZTY0KHRoZUJ5dGVzLmFsbCk7CiAgIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KHRoZUJ5dGVzLmFsbCk7CiAgIHJldHVybiA4OwogfQogCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLXRlbXBsYXRlPHR5cGVuYW1lIFN0clR5cGU+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkU3RyaW5nKFN0clR5cGUmIHN0cikgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmcoU3RyVHlwZSYgc3RyKSB7CiAgIHVpbnQzMl90IHJlc3VsdDsKICAgaW50MzJfdCBzaXplOwogICByZXN1bHQgPSByZWFkSTMyKHNpemUpOwogICByZXR1cm4gcmVzdWx0ICsgcmVhZFN0cmluZ0JvZHkoc3RyLCBzaXplKTsKIH0KIAotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+Ci11aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmcoc3RyKTsKK3RlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgordWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkU3RyaW5nKHN0cik7CiB9CiAKLXRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdGVtcGxhdGU8dHlwZW5hbWUgU3RyVHlwZT4KLXVpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OnJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2l6ZSkgewordGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyVHlwZT4KK3VpbnQzMl90IFRCaW5hcnlQcm90b2NvbFQ8VHJhbnNwb3J0XywgQnl0ZU9yZGVyXz46OnJlYWRTdHJpbmdCb2R5KFN0clR5cGUmIHN0ciwgaW50MzJfdCBzaXplKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAKICAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKQEAgLTQ0NiwyMCArNDQzLDEyIEBACiAgICAgcmV0dXJuIHNpemU7CiAgIH0KIAotICAvLyBVc2UgdGhlIGhlYXAgaGVyZSB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IGZvciB2LiBsYXJnZSBzdHJpbmdzCi0gIGlmIChzaXplID4gdGhpcy0+c3RyaW5nX2J1Zl9zaXplXyB8fCB0aGlzLT5zdHJpbmdfYnVmXyA9PSBOVUxMKSB7Ci0gICAgdm9pZCogbmV3X3N0cmluZ19idWYgPSBzdGQ6OnJlYWxsb2ModGhpcy0+c3RyaW5nX2J1Zl8sICh1aW50MzJfdClzaXplKTsKLSAgICBpZiAobmV3X3N0cmluZ19idWYgPT0gTlVMTCkgewotICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKLSAgICB9Ci0gICAgdGhpcy0+c3RyaW5nX2J1Zl8gPSAodWludDhfdCopbmV3X3N0cmluZ19idWY7Ci0gICAgdGhpcy0+c3RyaW5nX2J1Zl9zaXplXyA9IHNpemU7Ci0gIH0KLSAgdGhpcy0+dHJhbnNfLT5yZWFkQWxsKHRoaXMtPnN0cmluZ19idWZfLCBzaXplKTsKLSAgc3RyLmFzc2lnbigoY2hhciopdGhpcy0+c3RyaW5nX2J1Zl8sIHNpemUpOworICBzdHIucmVzaXplKHNpemUpOworICB0aGlzLT50cmFuc18tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN0clswXSksIHNpemUpOwogICByZXR1cm4gKHVpbnQzMl90KXNpemU7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVEJJTkFSWVBST1RPQ09MX1RDQ18KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCmluZGV4IGM0ZDFmMDguLjVjZmI0N2QgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaApAQCAtMjAsMjUgKzIwLDI4IEBACiAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVENPTVBBQ1RQUk9UT0NPTF9IXwogI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RDT01QQUNUUFJPVE9DT0xfSF8gMQogCi0jaW5jbHVkZSAiVFZpcnR1YWxQcm90b2NvbC5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CiAKICNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiAvKioKICAqIEMrKyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tcGFjdCBQcm90b2NvbCBhcyBkZXNjcmliZWQgaW4gVEhSSUZULTExMAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xUCi0gIDogcHVibGljIFRWaXJ0dWFsUHJvdG9jb2w8IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4geworY2xhc3MgVENvbXBhY3RQcm90b2NvbFQgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludDhfdCBQUk9UT0NPTF9JRCA9IChpbnQ4X3QpMHg4MnU7CisgIHN0YXRpYyBjb25zdCBpbnQ4X3QgVkVSU0lPTl9OID0gMTsKKyAgc3RhdGljIGNvbnN0IGludDhfdCBWRVJTSU9OX01BU0sgPSAweDFmOyAgICAgICAvLyAwMDAxIDExMTEKIAotIHByb3RlY3RlZDoKLSAgc3RhdGljIGNvbnN0IGludDhfdCAgUFJPVE9DT0xfSUQgPSAoaW50OF90KTB4ODI7Ci0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFZFUlNJT05fTiA9IDE7Ci0gIHN0YXRpYyBjb25zdCBpbnQ4X3QgIFZFUlNJT05fTUFTSyA9IDB4MWY7IC8vIDAwMDEgMTExMQotICBzdGF0aWMgY29uc3QgaW50OF90ICBUWVBFX01BU0sgPSAoaW50OF90KTB4RTA7IC8vIDExMTAgMDAwMAorcHJvdGVjdGVkOgorICBzdGF0aWMgY29uc3QgaW50OF90IFRZUEVfTUFTSyA9IChpbnQ4X3QpMHhFMHU7IC8vIDExMTAgMDAwMAorICBzdGF0aWMgY29uc3QgaW50OF90IFRZUEVfQklUUyA9IDB4MDc7ICAgICAgICAgIC8vIDAwMDAgMDExMQogICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CiAKICAgVHJhbnNwb3J0XyogdHJhbnNfOwpAQCAtNzAsMzcgKzczLDM0IEBACiAgIHN0ZDo6c3RhY2s8aW50MTZfdD4gbGFzdEZpZWxkXzsKICAgaW50MTZfdCBsYXN0RmllbGRJZF87CiAKLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKSA6Ci0gICAgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCi0gICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKLSAgICBsYXN0RmllbGRJZF8oMCksCi0gICAgc3RyaW5nX2xpbWl0XygwKSwKLSAgICBzdHJpbmdfYnVmXyhOVUxMKSwKLSAgICBzdHJpbmdfYnVmX3NpemVfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkgeworcHVibGljOgorICBUQ29tcGFjdFByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMpCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+ID4odHJhbnMpLAorICAgICAgdHJhbnNfKHRyYW5zLmdldCgpKSwKKyAgICAgIGxhc3RGaWVsZElkXygwKSwKKyAgICAgIHN0cmluZ19saW1pdF8oMCksCisgICAgICBzdHJpbmdfYnVmXyhOVUxMKSwKKyAgICAgIHN0cmluZ19idWZfc2l6ZV8oMCksCisgICAgICBjb250YWluZXJfbGltaXRfKDApIHsKICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwogICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CiAgIH0KIAotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb250YWluZXJfbGltaXQpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKLSAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAotICAgIGxhc3RGaWVsZElkXygwKSwKLSAgICBzdHJpbmdfbGltaXRfKHN0cmluZ19saW1pdCksCi0gICAgc3RyaW5nX2J1Zl8oTlVMTCksCi0gICAgc3RyaW5nX2J1Zl9zaXplXygwKSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCisgICAgICB0cmFuc18odHJhbnMuZ2V0KCkpLAorICAgICAgbGFzdEZpZWxkSWRfKDApLAorICAgICAgc3RyaW5nX2xpbWl0XyhzdHJpbmdfbGltaXQpLAorICAgICAgc3RyaW5nX2J1Zl8oTlVMTCksCisgICAgICBzdHJpbmdfYnVmX3NpemVfKDApLAorICAgICAgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHsKICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwogICAgIGJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID0gZmFsc2U7CiAgIH0KIAotICB+VENvbXBhY3RQcm90b2NvbFQoKSB7Ci0gICAgZnJlZShzdHJpbmdfYnVmXyk7Ci0gIH0KLQorICB+VENvbXBhY3RQcm90b2NvbFQoKSB7IGZyZWUoc3RyaW5nX2J1Zl8pOyB9CiAKICAgLyoqCiAgICAqIFdyaXRpbmcgZnVuY3Rpb25zCkBAIC0xMTQsMjEgKzExNCwxNSBAQAogCiAgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwogCiAgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKIAogICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSk7CiAKQEAgLTE1Niw0NCArMTUwLDM2IEBACiAgIHVpbnQzMl90IHdyaXRlU2V0RW5kKCkgeyByZXR1cm4gMDsgfQogICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCkgeyByZXR1cm4gMDsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBpbnQzMl90IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgdHlwZU92ZXJyaWRlKTsKLSAgdWludDMyX3Qgd3JpdGVDb2xsZWN0aW9uQmVnaW4oaW50OF90IGVsZW1UeXBlLCBpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZUNvbGxlY3Rpb25CZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgaW50MzJfdCBzaXplKTsKICAgdWludDMyX3Qgd3JpdGVWYXJpbnQzMih1aW50MzJfdCBuKTsKICAgdWludDMyX3Qgd3JpdGVWYXJpbnQ2NCh1aW50NjRfdCBuKTsKICAgdWludDY0X3QgaTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKTsKICAgdWludDMyX3QgaTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKTsKLSAgaW5saW5lIGludDhfdCBnZXRDb21wYWN0VHlwZShpbnQ4X3QgdHR5cGUpOworICBpbmxpbmUgaW50OF90IGdldENvbXBhY3RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKTsKIAotIHB1YmxpYzoKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKTsKK3B1YmxpYzoKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpOwogCiAgIHVpbnQzMl90IHJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSk7CiAKICAgdWludDMyX3QgcmVhZFN0cnVjdEVuZCgpOwogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKTsKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpOwogCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOworICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKLSAgdWludDMyX3QgcmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOworICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpOwogCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7CisgIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKTsKIAogICB1aW50MzJfdCByZWFkQm9vbChib29sJiB2YWx1ZSk7CiAgIC8vIFByb3ZpZGUgdGhlIGRlZmF1bHQgcmVhZEJvb2woKSBpbXBsZW1lbnRhdGlvbiBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4KLSAgdXNpbmcgVFZpcnR1YWxQcm90b2NvbDwgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPjo6cmVhZEJvb2w7CisgIHVzaW5nIFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPjo6cmVhZEJvb2w7CiAKICAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKTsKIApAQCAtMjE5LDcgKzIwNSw3IEBACiAgIHVpbnQzMl90IHJlYWRMaXN0RW5kKCkgeyByZXR1cm4gMDsgfQogICB1aW50MzJfdCByZWFkU2V0RW5kKCkgeyByZXR1cm4gMDsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICB1aW50MzJfdCByZWFkVmFyaW50MzIoaW50MzJfdCYgaTMyKTsKICAgdWludDMyX3QgcmVhZFZhcmludDY0KGludDY0X3QmIGk2NCk7CiAgIGludDMyX3QgemlnemFnVG9JMzIodWludDMyX3Qgbik7CkBAIC0yNDEsNDkgKzIyNyw0MCBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIGNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCA6IHB1YmxpYyBUUHJvdG9jb2xGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VCgpIDoKLSAgICBzdHJpbmdfbGltaXRfKDApLAotICAgIGNvbnRhaW5lcl9saW1pdF8oMCkge30KK3B1YmxpYzoKKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkgOiBzdHJpbmdfbGltaXRfKDApLCBjb250YWluZXJfbGltaXRfKDApIHt9CiAKLSAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgOgotICAgIHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwKLSAgICBjb250YWluZXJfbGltaXRfKGNvbnRhaW5lcl9saW1pdCkge30KKyAgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKGludDMyX3Qgc3RyaW5nX2xpbWl0LCBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKKyAgICA6IHN0cmluZ19saW1pdF8oc3RyaW5nX2xpbWl0KSwgY29udGFpbmVyX2xpbWl0Xyhjb250YWluZXJfbGltaXQpIHt9CiAKICAgdmlydHVhbCB+VENvbXBhY3RQcm90b2NvbEZhY3RvcnlUKCkge30KIAotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQogCi0gIHZvaWQgc2V0Q29udGFpbmVyU2l6ZUxpbWl0KGludDMyX3QgY29udGFpbmVyX2xpbWl0KSB7Ci0gICAgY29udGFpbmVyX2xpbWl0XyA9IGNvbnRhaW5lcl9saW1pdDsKLSAgfQorICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0KLSAgICAgIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOwogICAgIFRQcm90b2NvbCogcHJvdDsKICAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKLSAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4oc3BlY2lmaWNfdHJhbnMsIHN0cmluZ19saW1pdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9saW1pdF8pOworICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CiAgICAgfSBlbHNlIHsKICAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgaW50MzJfdCBzdHJpbmdfbGltaXRfOwogICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdF87Ci0KIH07CiAKIHR5cGVkZWYgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRUcmFuc3BvcnQ+IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCi0jaW5jbHVkZSAiVENvbXBhY3RQcm90b2NvbC50Y2MiCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjPgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwppbmRleCA1NWI3ODRmLi44ZWZlYzZlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCkBAIC0yMSw2ICsyMSw4IEBACiAKICNpbmNsdWRlIDxsaW1pdHM+CiAKKyNpbmNsdWRlICJ0aHJpZnQvY29uZmlnLmgiCisKIC8qCiAgKiBUQ29tcGFjdFByb3RvY29sOjppKlRvWmlnemFnIGRlcGVuZCBvbiB0aGUgZmFjdCB0aGF0IHRoZSByaWdodCBzaGlmdAogICogb3BlcmF0b3Igb24gYSBzaWduZWQgaW50ZWdlciBpcyBhbiBhcml0aG1ldGljIChzaWduLWV4dGVuZGluZykgc2hpZnQuCkBAIC0xOTgsMTYgKzIwMCwyMCBAQAogCiAgIGlmIChib29sZWFuRmllbGRfLm5hbWUgIT0gTlVMTCkgewogICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAotICAgIHdzaXplICs9IHdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX0ZBTFNFKTsKKyAgICB3c2l6ZQorICAgICAgKz0gd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoYm9vbGVhbkZpZWxkXy5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfLmZpZWxkSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpKTsKICAgICBib29sZWFuRmllbGRfLm5hbWUgPSBOVUxMOwogICB9IGVsc2UgewogICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlCi0gICAgd3NpemUgKz0gd3JpdGVCeXRlKHZhbHVlID8gZGV0YWlsOjpjb21wYWN0OjpDVF9CT09MRUFOX1RSVUUgOgotICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpOworICAgIHdzaXplCisgICAgICArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90Pih2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXRhaWw6OmNvbXBhY3Q6OkNUX0JPT0xFQU5fRkFMU0UpKTsKICAgfQogICByZXR1cm4gd3NpemU7CiB9CkBAIC0yNDcsMTcgKzI1MywxNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVpbnQ2NF90IGJpdHMgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KGR1Yik7Ci0gIGJpdHMgPSBodG9sZWxsKGJpdHMpOworICBiaXRzID0gVEhSSUZUX2h0b2xlbGwoYml0cyk7CiAgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKSZiaXRzLCA4KTsKICAgcmV0dXJuIDg7CiB9CiAKIC8qKgotICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZWRpbmcuCisgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CkBAIC0yNjYsOCArMjcyLDE1IEBACiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3Qgc3NpemUgPSBzdHIuc2l6ZSgpOwotICB1aW50MzJfdCB3c2l6ZSA9IHdyaXRlVmFyaW50MzIoc3NpemUpICsgc3NpemU7CisgIGlmKHN0ci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgdWludDMyX3Qgc3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLnNpemUoKSk7CisgIHVpbnQzMl90IHdzaXplID0gd3JpdGVWYXJpbnQzMihzc2l6ZSkgOworICAvLyBjaGVja2luZyBzc2l6ZSArIHdzaXplID4gdWludF9tYXgsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIG92ZXJmbG93IHdoaWxlIGNoZWNraW5nIGZvciBvdmVyZmxvd3MuCisgIC8vIHRyYW5zZm9ybWluZyB0aGUgY2hlY2sgdG8gc3NpemUgPiB1aW50X21heCAtIHdzaXplCisgIGlmKHNzaXplID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkgLSB3c2l6ZSkKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKKyAgd3NpemUgKz0gc3NpemU7CiAgIHRyYW5zXy0+d3JpdGUoKHVpbnQ4X3QqKXN0ci5kYXRhKCksIHNzaXplKTsKICAgcmV0dXJuIHdzaXplOwogfQpAQCAtMjk2LDcgKzMwOSw4IEBACiAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAogICBpZiAoZmllbGRJZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZElkIC0gbGFzdEZpZWxkSWRfIDw9IDE1KSB7CiAgICAgLy8gd3JpdGUgdGhlbSB0b2dldGhlcgotICAgIHdzaXplICs9IHdyaXRlQnl0ZSgoZmllbGRJZCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICB3c2l6ZSArPSB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8aW50OF90PigoZmllbGRJZCAtIGxhc3RGaWVsZElkXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgdHlwZVRvV3JpdGUpKTsKICAgfSBlbHNlIHsKICAgICAvLyB3cml0ZSB0aGVtIHNlcGFyYXRlCiAgICAgd3NpemUgKz0gd3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKQEAgLTMxMiwxMSArMzI2LDEyIEBACiAgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlQ29sbGVjdGlvbkJlZ2luKGludDhfdCBlbGVtVHlwZSwKK3VpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp3cml0ZUNvbGxlY3Rpb25CZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpemUpIHsKICAgdWludDMyX3Qgd3NpemUgPSAwOwogICBpZiAoc2l6ZSA8PSAxNCkgewotICAgIHdzaXplICs9IHdyaXRlQnl0ZShzaXplIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIHdzaXplICs9IHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSk7CiAgIH0gZWxzZSB7CiAgICAgd3NpemUgKz0gd3JpdGVCeXRlKDB4ZjAgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOwogICAgIHdzaXplICs9IHdyaXRlVmFyaW50MzIoc2l6ZSk7CkBAIC0zNzIsNyArMzg3LDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50NjRfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTY0VG9aaWd6YWcoY29uc3QgaW50NjRfdCBsKSB7Ci0gIHJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKTsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50NjRfdD4obCkgPDwgMSkgXiAobCA+PiA2Myk7CiB9CiAKIC8qKgpAQCAtMzgxLDE0ICszOTYsMTQgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6aTMyVG9aaWd6YWcoY29uc3QgaW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obikgPDwgMSkgXiAobiA+PiAzMSk7CiB9CiAKIC8qKgogICogR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgZGV0YWlsOjpjb21wYWN0OjpUeXBlcyB2YWx1ZQogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KLWludDhfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6Z2V0Q29tcGFjdFR5cGUoaW50OF90IHR0eXBlKSB7CitpbnQ4X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OmdldENvbXBhY3RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKSB7CiAgIHJldHVybiBkZXRhaWw6OmNvbXBhY3Q6OlRUeXBlVG9DVHlwZVt0dHlwZV07CiB9CiAKQEAgLTQyMCw3ICs0MzUsNyBAQAogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHByb3RvY29sIHZlcnNpb24iKTsKICAgfQogCi0gIG1lc3NhZ2VUeXBlID0gKFRNZXNzYWdlVHlwZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDMpOworICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOwogICByc2l6ZSArPSByZWFkVmFyaW50MzIoc2VxaWQpOwogICByc2l6ZSArPSByZWFkU3RyaW5nKG5hbWUpOwogCkBAIC02MzgsMTUgKzY1MywxNiBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCi0gIHVpbnQ2NF90IGJpdHM7Ci0gIHVpbnQ4X3QgYls4XTsKLSAgdHJhbnNfLT5yZWFkQWxsKGIsIDgpOwotICBiaXRzID0gKih1aW50NjRfdCopYjsKLSAgYml0cyA9IGxldG9obGwoYml0cyk7Ci0gIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KGJpdHMpOworICB1bmlvbiB7CisgICAgdWludDY0X3QgYml0czsKKyAgICB1aW50OF90IGJbOF07CisgIH0gdTsKKyAgdHJhbnNfLT5yZWFkQWxsKHUuYiwgOCk7CisgIHUuYml0cyA9IFRIUklGVF9sZXRvaGxsKHUuYml0cyk7CisgIGR1YiA9IGJpdHdpc2VfY2FzdDxkb3VibGU+KHUuYml0cyk7CiAgIHJldHVybiA4OwogfQogCkBAIC03NjEsNyArNzc3LDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiBpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+Ojp6aWd6YWdUb0kzMih1aW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpOworICByZXR1cm4gKG4gPj4gMSkgXiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLXN0YXRpY19jYXN0PGludDMyX3Q+KG4gJiAxKSk7CiB9CiAKIC8qKgpAQCAtNzY5LDcgKzc4NSw3IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogaW50NjRfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6emlnemFnVG9JNjQodWludDY0X3QgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtKG4gJiAxKTsKKyAgcmV0dXJuIChuID4+IDEpIF4gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1zdGF0aWNfY2FzdDxpbnQ2NF90PihuICYgMSkpOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KQEAgLTgwMSw5ICs4MTcsOCBAQAogICAgIGNhc2UgZGV0YWlsOjpjb21wYWN0OjpDVF9TVFJVQ1Q6CiAgICAgICByZXR1cm4gVF9TVFJVQ1Q7CiAgICAgZGVmYXVsdDoKLSAgICAgIHRocm93IFRFeGNlcHRpb24oImRvbid0IGtub3cgd2hhdCB0eXBlOiAiICsgdHlwZSk7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKHN0ZDo6c3RyaW5nKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIikgKyAoY2hhcil0eXBlKTsKICAgfQotICByZXR1cm4gVF9TVE9QOwogfQogCiB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcAppbmRleCA4YjY5ZGY0Li4wZTZkNGEyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKQEAgLTE3LDQ5ICsxNyw2NSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIlREZWJ1Z1Byb3RvY29sLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAKKyNpbmNsdWRlIDx0aHJpZnQvVFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KICNpbmNsdWRlIDxjY3R5cGU+CiAjaW5jbHVkZSA8Y3N0ZGlvPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotCiBzdGF0aWMgc3RyaW5nIGJ5dGVfdG9faGV4KGNvbnN0IHVpbnQ4X3QgYnl0ZSkgewogICBjaGFyIGJ1ZlszXTsKICAgaW50IHJldCA9IHN0ZDo6c3ByaW50ZihidWYsICIlMDJ4IiwgKGludClieXRlKTsKLSAgcmV0ID0gcmV0OyAvL3NxdWVsY2hpbmcgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7CiAgIGFzc2VydChyZXQgPT0gMik7CiAgIGFzc2VydChidWZbMl0gPT0gJ1wwJyk7CiAgIHJldHVybiBidWY7CiB9CiAKLQotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIHN0cmluZyBURGVidWdQcm90b2NvbDo6ZmllbGRUeXBlTmFtZShUVHlwZSB0eXBlKSB7CiAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVF9TVE9QICAgOiByZXR1cm4gInN0b3AiICAgOwotICAgIGNhc2UgVF9WT0lEICAgOiByZXR1cm4gInZvaWQiICAgOwotICAgIGNhc2UgVF9CT09MICAgOiByZXR1cm4gImJvb2wiICAgOwotICAgIGNhc2UgVF9CWVRFICAgOiByZXR1cm4gImJ5dGUiICAgOwotICAgIGNhc2UgVF9JMTYgICAgOiByZXR1cm4gImkxNiIgICAgOwotICAgIGNhc2UgVF9JMzIgICAgOiByZXR1cm4gImkzMiIgICAgOwotICAgIGNhc2UgVF9VNjQgICAgOiByZXR1cm4gInU2NCIgICAgOwotICAgIGNhc2UgVF9JNjQgICAgOiByZXR1cm4gImk2NCIgICAgOwotICAgIGNhc2UgVF9ET1VCTEUgOiByZXR1cm4gImRvdWJsZSIgOwotICAgIGNhc2UgVF9TVFJJTkcgOiByZXR1cm4gInN0cmluZyIgOwotICAgIGNhc2UgVF9TVFJVQ1QgOiByZXR1cm4gInN0cnVjdCIgOwotICAgIGNhc2UgVF9NQVAgICAgOiByZXR1cm4gIm1hcCIgICAgOwotICAgIGNhc2UgVF9TRVQgICAgOiByZXR1cm4gInNldCIgICAgOwotICAgIGNhc2UgVF9MSVNUICAgOiByZXR1cm4gImxpc3QiICAgOwotICAgIGNhc2UgVF9VVEY4ICAgOiByZXR1cm4gInV0ZjgiICAgOwotICAgIGNhc2UgVF9VVEYxNiAgOiByZXR1cm4gInV0ZjE2IiAgOwotICAgIGRlZmF1bHQ6IHJldHVybiAidW5rbm93biI7CisgIGNhc2UgVF9TVE9QOgorICAgIHJldHVybiAic3RvcCI7CisgIGNhc2UgVF9WT0lEOgorICAgIHJldHVybiAidm9pZCI7CisgIGNhc2UgVF9CT09MOgorICAgIHJldHVybiAiYm9vbCI7CisgIGNhc2UgVF9CWVRFOgorICAgIHJldHVybiAiYnl0ZSI7CisgIGNhc2UgVF9JMTY6CisgICAgcmV0dXJuICJpMTYiOworICBjYXNlIFRfSTMyOgorICAgIHJldHVybiAiaTMyIjsKKyAgY2FzZSBUX1U2NDoKKyAgICByZXR1cm4gInU2NCI7CisgIGNhc2UgVF9JNjQ6CisgICAgcmV0dXJuICJpNjQiOworICBjYXNlIFRfRE9VQkxFOgorICAgIHJldHVybiAiZG91YmxlIjsKKyAgY2FzZSBUX1NUUklORzoKKyAgICByZXR1cm4gInN0cmluZyI7CisgIGNhc2UgVF9TVFJVQ1Q6CisgICAgcmV0dXJuICJzdHJ1Y3QiOworICBjYXNlIFRfTUFQOgorICAgIHJldHVybiAibWFwIjsKKyAgY2FzZSBUX1NFVDoKKyAgICByZXR1cm4gInNldCI7CisgIGNhc2UgVF9MSVNUOgorICAgIHJldHVybiAibGlzdCI7CisgIGNhc2UgVF9VVEY4OgorICAgIHJldHVybiAidXRmOCI7CisgIGNhc2UgVF9VVEYxNjoKKyAgICByZXR1cm4gInV0ZjE2IjsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gInVua25vd24iOwogICB9CiB9CiAKQEAgLTc1LDE5ICs5MSwxOSBAQAogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVQbGFpbihjb25zdCBzdHJpbmcmIHN0cikgewotICBpZihzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHN0ci5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CiAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlSW5kZW50ZWQoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgaWYoc3RyLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGlmIChzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgaWYoaW5kZW50X3N0cl8ubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKGluZGVudF9zdHJfLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHVpbnQ2NF90IHRvdGFsX2xlbiA9IGluZGVudF9zdHJfLmxlbmd0aCgpICsgc3RyLmxlbmd0aCgpOwotICBpZih0b3RhbF9sZW4gPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHRvdGFsX2xlbiA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KilpbmRlbnRfc3RyXy5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRlbnRfc3RyXy5sZW5ndGgoKSkpOwogICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyLmxlbmd0aCgpKSk7CkBAIC05OCw1MiArMTE0LDUxIEBACiAgIHVpbnQzMl90IHNpemU7CiAKICAgc3dpdGNoICh3cml0ZV9zdGF0ZV8uYmFjaygpKSB7Ci0gICAgY2FzZSBVTklOSVQ6Ci0gICAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCi0gICAgICAvL3Rocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAvL3JldHVybiB3cml0ZUluZGVudGVkKHN0cik7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIFNUUlVDVDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU0VUOgotICAgICAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoIiIpOwotICAgIGNhc2UgTUFQX0tFWToKLSAgICAgIHJldHVybiB3cml0ZUluZGVudGVkKCIiKTsKLSAgICBjYXNlIE1BUF9WQUxVRToKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7Ci0gICAgY2FzZSBMSVNUOgotICAgICAgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoCi0gICAgICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGxpc3RfaWR4Xy5iYWNrKCkpICsgIl0gPSAiKTsKLSAgICAgIGxpc3RfaWR4Xy5iYWNrKCkrKzsKLSAgICAgIHJldHVybiBzaXplOwotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CisgIGNhc2UgVU5JTklUOgorICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KKyAgICAvLyB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgIC8vIHJldHVybiB3cml0ZUluZGVudGVkKHN0cik7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgU1RSVUNUOgorICAgIHJldHVybiAwOworICBjYXNlIFNFVDoKKyAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7CisgIGNhc2UgTUFQX0tFWToKKyAgICByZXR1cm4gd3JpdGVJbmRlbnRlZCgiIik7CisgIGNhc2UgTUFQX1ZBTFVFOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIgLT4gIik7CisgIGNhc2UgTElTVDoKKyAgICBzaXplID0gd3JpdGVJbmRlbnRlZCgiWyIgKyB0b19zdHJpbmcobGlzdF9pZHhfLmJhY2soKSkgKyAiXSA9ICIpOworICAgIGxpc3RfaWR4Xy5iYWNrKCkrKzsKKyAgICByZXR1cm4gc2l6ZTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CiAgIH0KIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OmVuZEl0ZW0oKSB7Ci0gIC8vdWludDMyX3Qgc2l6ZTsKKyAgLy8gdWludDMyX3Qgc2l6ZTsKIAogICBzd2l0Y2ggKHdyaXRlX3N0YXRlXy5iYWNrKCkpIHsKLSAgICBjYXNlIFVOSU5JVDoKLSAgICAgIC8vIFhYWCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZS4KLSAgICAgIC8vdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgIC8vcmV0dXJuIHdyaXRlSW5kZW50ZWQoc3RyKTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgU0VUOgotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgTUFQX0tFWToKLSAgICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfVkFMVUU7Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIE1BUF9WQUxVRToKLSAgICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfS0VZOwotICAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIixcbiIpOwotICAgIGNhc2UgTElTVDoKLSAgICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiSW52YWxpZCBlbnVtIHZhbHVlLiIpOworICBjYXNlIFVOSU5JVDoKKyAgICAvLyBYWFggZmlndXJlIG91dCB3aGF0IHRvIGRvIGhlcmUuCisgICAgLy8gdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAvLyByZXR1cm4gd3JpdGVJbmRlbnRlZChzdHIpOworICAgIHJldHVybiAwOworICBjYXNlIFNUUlVDVDoKKyAgICByZXR1cm4gd3JpdGVQbGFpbigiLFxuIik7CisgIGNhc2UgU0VUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBNQVBfS0VZOgorICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfVkFMVUU7CisgICAgcmV0dXJuIDA7CisgIGNhc2UgTUFQX1ZBTFVFOgorICAgIHdyaXRlX3N0YXRlXy5iYWNrKCkgPSBNQVBfS0VZOworICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgY2FzZSBMSVNUOgorICAgIHJldHVybiB3cml0ZVBsYWluKCIsXG4iKTsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJJbnZhbGlkIGVudW0gdmFsdWUuIik7CiAgIH0KIH0KIApAQCAtMTU4LDEzICsxNzMsMjEgQEAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgewotICAodm9pZCkgc2VxaWQ7CisgICh2b2lkKXNlcWlkOwogICBzdHJpbmcgbXR5cGU7CiAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKLSAgICBjYXNlIFRfQ0FMTCAgICAgIDogbXR5cGUgPSAiY2FsbCIgICA7IGJyZWFrOwotICAgIGNhc2UgVF9SRVBMWSAgICAgOiBtdHlwZSA9ICJyZXBseSIgIDsgYnJlYWs7Ci0gICAgY2FzZSBUX0VYQ0VQVElPTiA6IG10eXBlID0gImV4biIgICAgOyBicmVhazsKLSAgICBjYXNlIFRfT05FV0FZICAgIDogbXR5cGUgPSAib25ld2F5IiA7IGJyZWFrOworICBjYXNlIFRfQ0FMTDoKKyAgICBtdHlwZSA9ICJjYWxsIjsKKyAgICBicmVhazsKKyAgY2FzZSBUX1JFUExZOgorICAgIG10eXBlID0gInJlcGx5IjsKKyAgICBicmVhazsKKyAgY2FzZSBUX0VYQ0VQVElPTjoKKyAgICBtdHlwZSA9ICJleG4iOworICAgIGJyZWFrOworICBjYXNlIFRfT05FV0FZOgorICAgIG10eXBlID0gIm9uZXdheSI7CisgICAgYnJlYWs7CiAgIH0KIAogICB1aW50MzJfdCBzaXplID0gd3JpdGVJbmRlbnRlZCgiKCIgKyBtdHlwZSArICIpICIgKyBuYW1lICsgIigiKTsKQEAgLTE5OSwxMyArMjIyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CiAgIC8vIHNwcmludGYoaWRfc3RyLCAiJTAyZCIsIGZpZWxkSWQpOwotICBzdHJpbmcgaWRfc3RyID0gYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGZpZWxkSWQpOwotICBpZiAoaWRfc3RyLmxlbmd0aCgpID09IDEpIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKKyAgc3RyaW5nIGlkX3N0ciA9IHRvX3N0cmluZyhmaWVsZElkKTsKKyAgaWYgKGlkX3N0ci5sZW5ndGgoKSA9PSAxKQorICAgIGlkX3N0ciA9ICcwJyArIGlkX3N0cjsKIAotICByZXR1cm4gd3JpdGVJbmRlbnRlZCgKLSAgICAgIGlkX3N0ciArICI6ICIgKwotICAgICAgbmFtZSArICIgKCIgKwotICAgICAgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKKyAgcmV0dXJuIHdyaXRlSW5kZW50ZWQoaWRfc3RyICsgIjogIiArIG5hbWUgKyAiICgiICsgZmllbGRUeXBlTmFtZShmaWVsZFR5cGUpICsgIikgPSAiKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRFbmQoKSB7CkBAIC0yMTUsNyArMjM2LDcgQEAKIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewogICByZXR1cm4gMDsKLSAgICAvL3dyaXRlSW5kZW50ZWQoIioqKlNUT1AqKipcbiIpOworICAvLyB3cml0ZUluZGVudGVkKCIqKipTVE9QKioqXG4iKTsKIH0KIAogdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKQEAgLTIyNiw3ICsyNDcsNyBAQAogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKE1BUF9LRVkpOwogICByZXR1cm4gYnNpemU7CkBAIC0yNDEsMTQgKzI2MiwxMyBAQAogICByZXR1cm4gc2l6ZTsKIH0KIAotdWludDMyX3QgVERlYnVnUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICAvLyBUT0RPKGRyZWlzcyk6IE9wdGltaXplIHNob3J0IGFycmF5cy4KICAgdWludDMyX3QgYnNpemUgPSAwOwogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJsaXN0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7CisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKICAgaW5kZW50VXAoKTsKICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhMSVNUKTsKICAgbGlzdF9pZHhfLnB1c2hfYmFjaygwKTsKQEAgLTI2NSwxNCArMjg1LDEzIEBACiAgIHJldHVybiBzaXplOwogfQogCi11aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKK3VpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgIC8vIFRPRE8oZHJlaXNzKTogT3B0aW1pemUgc2hvcnQgc2V0cy4KICAgdWludDMyX3QgYnNpemUgPSAwOwogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJzZXQ8IiArIGZpZWxkVHlwZU5hbWUoZWxlbVR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFNFVCk7CiAgIHJldHVybiBic2l6ZTsKQEAgLTI5NiwyOSArMzE1LDI4IEBACiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMTYpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTE2KSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpMzIpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTMyKSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZUk2NChjb25zdCBpbnQ2NF90IGk2NCkgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihpNjQpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoaTY0KSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIHJldHVybiB3cml0ZUl0ZW0oYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KGR1YikpOworICByZXR1cm4gd3JpdGVJdGVtKHRvX3N0cmluZyhkdWIpKTsKIH0KIAotCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpIHsKICAgLy8gWFhYIFJhdy9VVEYtOD8KIAogICBzdHJpbmcgdG9fc2hvdyA9IHN0cjsKICAgaWYgKHRvX3Nob3cubGVuZ3RoKCkgPiAoc3RyaW5nOjpzaXplX3R5cGUpc3RyaW5nX2xpbWl0XykgewogICAgIHRvX3Nob3cgPSBzdHIuc3Vic3RyKDAsIHN0cmluZ19wcmVmaXhfc2l6ZV8pOwotICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc3RyLmxlbmd0aCgpKSArICIpIjsKKyAgICB0b19zaG93ICs9ICJbLi4uXSgiICsgdG9fc3RyaW5nKHN0ci5sZW5ndGgoKSkgKyAiKSI7CiAgIH0KIAogICBzdHJpbmcgb3V0cHV0ID0gIlwiIjsKQEAgLTMyOCwyMCArMzQ2LDM2IEBACiAgICAgICBvdXRwdXQgKz0gIlxcXFwiOwogICAgIH0gZWxzZSBpZiAoKml0ID09ICciJykgewogICAgICAgb3V0cHV0ICs9ICJcXFwiIjsKLSAgICB9IGVsc2UgaWYgKHN0ZDo6aXNwcmludCgqaXQpKSB7CisgICAgICAvLyBwYXNzaW5nIGNoYXJhY3RlcnMgPDAgdG8gc3RkOjppc3ByaW50IGNhdXNlcyBhc3NlcnRzLiBpc3ByaW50IHRha2VzIGFuCisgICAgICAvLyBpbnQsIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBzaWduIGV4dGVuc2lvbgorICAgIH0gZWxzZSBpZiAoc3RkOjppc3ByaW50KCh1bnNpZ25lZCBjaGFyKSppdCkpIHsKICAgICAgIG91dHB1dCArPSAqaXQ7CiAgICAgfSBlbHNlIHsKICAgICAgIHN3aXRjaCAoKml0KSB7Ci0gICAgICAgIGNhc2UgJ1xhJzogb3V0cHV0ICs9ICJcXGEiOyBicmVhazsKLSAgICAgICAgY2FzZSAnXGInOiBvdXRwdXQgKz0gIlxcYiI7IGJyZWFrOwotICAgICAgICBjYXNlICdcZic6IG91dHB1dCArPSAiXFxmIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzogb3V0cHV0ICs9ICJcXG4iOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiBvdXRwdXQgKz0gIlxcciI7IGJyZWFrOwotICAgICAgICBjYXNlICdcdCc6IG91dHB1dCArPSAiXFx0IjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x2Jzogb3V0cHV0ICs9ICJcXHYiOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBvdXRwdXQgKz0gIlxceCI7Ci0gICAgICAgICAgb3V0cHV0ICs9IGJ5dGVfdG9faGV4KCppdCk7CisgICAgICBjYXNlICdcYSc6CisgICAgICAgIG91dHB1dCArPSAiXFxhIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcYic6CisgICAgICAgIG91dHB1dCArPSAiXFxiIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcZic6CisgICAgICAgIG91dHB1dCArPSAiXFxmIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcbic6CisgICAgICAgIG91dHB1dCArPSAiXFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdccic6CisgICAgICAgIG91dHB1dCArPSAiXFxyIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdCc6CisgICAgICAgIG91dHB1dCArPSAiXFx0IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdcdic6CisgICAgICAgIG91dHB1dCArPSAiXFx2IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBvdXRwdXQgKz0gIlxceCI7CisgICAgICAgIG91dHB1dCArPSBieXRlX3RvX2hleCgqaXQpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzU0LDUgKzM4OCw2IEBACiAgIC8vIFhYWCBIZXg/CiAgIHJldHVybiBURGVidWdQcm90b2NvbDo6d3JpdGVTdHJpbmcoc3RyKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKaW5kZXggZjY0OTI4ZS4uYzA3OTYyNCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmgKQEAgLTIwLDExICsyMCwxMyBAQAogI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERUJVR1BST1RPQ09MX0hfCiAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFQlVHUFJPVE9DT0xfSF8gMQogCi0jaW5jbHVkZSAiVFZpcnR1YWxQcm90b2NvbC5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiAvKgogCkBAIC0zOSw0NCArNDEsMzAgQEAKIAogKi8KIAotCiAvKioKICAqIFByb3RvY29sIHRoYXQgcHJpbnRzIHRoZSBwYXlsb2FkIGluIGEgbmljZSBodW1hbi1yZWFkYWJsZSBmb3JtYXQuCiAgKiBSZWFkaW5nIGZyb20gdGhpcyBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkLgogICoKICAqLwogY2xhc3MgVERlYnVnUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxURGVidWdQcm90b2NvbD4gewotIHByaXZhdGU6Ci0gIGVudW0gd3JpdGVfc3RhdGVfdAotICB7IFVOSU5JVAotICAsIFNUUlVDVAotICAsIExJU1QKLSAgLCBTRVQKLSAgLCBNQVBfS0VZCi0gICwgTUFQX1ZBTFVFCi0gIH07Citwcml2YXRlOgorICBlbnVtIHdyaXRlX3N0YXRlX3QgeyBVTklOSVQsIFNUUlVDVCwgTElTVCwgU0VULCBNQVBfS0VZLCBNQVBfVkFMVUUgfTsKIAotIHB1YmxpYzoKLSAgVERlYnVnUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpCi0gICAgOiBUVmlydHVhbFByb3RvY29sPFREZWJ1Z1Byb3RvY29sPih0cmFucykKLSAgICAsIHRyYW5zXyh0cmFucy5nZXQoKSkKLSAgICAsIHN0cmluZ19saW1pdF8oREVGQVVMVF9TVFJJTkdfTElNSVQpCi0gICAgLCBzdHJpbmdfcHJlZml4X3NpemVfKERFRkFVTFRfU1RSSU5HX1BSRUZJWF9TSVpFKQotICB7CitwdWJsaWM6CisgIFREZWJ1Z1Byb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKKyAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+KHRyYW5zKSwKKyAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCisgICAgICBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKSwKKyAgICAgIHN0cmluZ19wcmVmaXhfc2l6ZV8oREVGQVVMVF9TVFJJTkdfUFJFRklYX1NJWkUpIHsKICAgICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKFVOSU5JVCk7CiAgIH0KIAogICBzdGF0aWMgY29uc3QgaW50MzJfdCBERUZBVUxUX1NUUklOR19MSU1JVCA9IDI1NjsKICAgc3RhdGljIGNvbnN0IGludDMyX3QgREVGQVVMVF9TVFJJTkdfUFJFRklYX1NJWkUgPSAxNjsKIAotICB2b2lkIHNldFN0cmluZ1NpemVMaW1pdChpbnQzMl90IHN0cmluZ19saW1pdCkgewotICAgIHN0cmluZ19saW1pdF8gPSBzdHJpbmdfbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRTdHJpbmdTaXplTGltaXQoaW50MzJfdCBzdHJpbmdfbGltaXQpIHsgc3RyaW5nX2xpbWl0XyA9IHN0cmluZ19saW1pdDsgfQogCi0gIHZvaWQgc2V0U3RyaW5nUHJlZml4U2l6ZShpbnQzMl90IHN0cmluZ19wcmVmaXhfc2l6ZSkgewotICAgIHN0cmluZ19wcmVmaXhfc2l6ZV8gPSBzdHJpbmdfcHJlZml4X3NpemU7Ci0gIH0KLQorICB2b2lkIHNldFN0cmluZ1ByZWZpeFNpemUoaW50MzJfdCBzdHJpbmdfcHJlZml4X3NpemUpIHsgc3RyaW5nX3ByZWZpeF9zaXplXyA9IHN0cmluZ19wcmVmaXhfc2l6ZTsgfQogCiAgIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCkBAIC04NCwzMiArNzIsMjUgQEAKIAogICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VFbmQoKTsKIAotCiAgIHVpbnQzMl90IHdyaXRlU3RydWN0QmVnaW4oY29uc3QgY2hhciogbmFtZSk7CiAKICAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmQoKTsKIAotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCk7CiAKICAgdWludDMyX3Qgd3JpdGVGaWVsZEVuZCgpOwogCiAgIHVpbnQzMl90IHdyaXRlRmllbGRTdG9wKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKICAgdWludDMyX3Qgd3JpdGVNYXBFbmQoKTsKIAotICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSk7CisgIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKIAogICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKIAotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKIAogICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwogCkBAIC0xMjksOCArMTEwLDcgQEAKIAogICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKIAotCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHZvaWQgaW5kZW50VXAoKTsKICAgdm9pZCBpbmRlbnREb3duKCk7CiAgIHVpbnQzMl90IHdyaXRlUGxhaW4oY29uc3Qgc3RkOjpzdHJpbmcmIHN0cik7CkBAIC0xNTcsMzAgKzEzNywzMCBAQAogICogQ29uc3RydWN0cyBkZWJ1ZyBwcm90b2NvbCBoYW5kbGVycwogICovCiBjbGFzcyBURGVidWdQcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQogICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBURGVidWdQcm90b2NvbCh0cmFucykpOwogICB9Ci0KIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAogLy8gVE9ETyhkcmVpc3MpOiBNb3ZlIChwYXJ0IG9mKSBUaHJpZnREZWJ1Z1N0cmluZyBpbnRvIGEgLmNwcCBmaWxlIGFuZCByZW1vdmUgdGhpcy4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFRocmlmdFN0cnVjdD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+CiBzdGQ6OnN0cmluZyBUaHJpZnREZWJ1Z1N0cmluZyhjb25zdCBUaHJpZnRTdHJ1Y3QmIHRzKSB7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpAQCAtMTk4LDcgKzE3OCw3IEBACiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICAvLyBJIGFtIGdyb3NzIQpAQCAtMjE4LDEwICsxOTgsNyBAQAogICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZiwgKHVuc2lnbmVkIGludClzaXplKTsKIH0KICNlbmRpZiAvLyAwCi0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Ci0KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVCVUdQUk9UT0NPTF9IXwotCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI0NDRiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKgotCi1JTVBMRU1FTlRBVElPTiBERVRBSUxTCi0KLVREZW5zZVByb3RvY29sIHdhcyBkZXNpZ25lZCB0byBoYXZlIGEgc21hbGxlciBzZXJpYWxpemVkIGZvcm0gdGhhbgotVEJpbmFyeVByb3RvY29sLiAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgdHdvIHRlY2huaXF1ZXMuICBUaGUgZmlyc3QgaXMKLXZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGVuY29kaW5nLiAgV2UgdXNlIHRoZSBzYW1lIHRlY2huaXF1ZSB0aGF0IHRoZSBTdGFuZGFyZAotTUlESSBGaWxlIGZvcm1hdCB1c2VzIGZvciAidmFyaWFibGUtbGVuZ3RoIHF1YW50aXRpZXMiCi0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WYXJpYWJsZS1sZW5ndGhfcXVhbnRpdHkpLgotQWxsIGludGVnZXJzIChpbmNsdWRpbmcgaTE2LCBidXQgbm90IGJ5dGUpIGFyZSBmaXJzdCBjYXN0IHRvIHVpbnQ2NF90LAotdGhlbiB3cml0dGVuIG91dCBhcyB2YXJpYWJsZS1sZW5ndGggcXVhbnRpdGllcy4gIFRoaXMgaGFzIHRoZSB1bmZvcnR1bmF0ZSBzaWRlCi1lZmZlY3QgdGhhdCBhbGwgbmVnYXRpdmUgbnVtYmVycyByZXF1aXJlIDEwIGJ5dGVzLCBidXQgbmVnYXRpdmUgbnVtYmVycyB0ZW5kCi10byBiZSBmYXIgbGVzcyBjb21tb24gdGhhbiBwb3NpdGl2ZSBvbmVzLgotCi1UaGUgc2Vjb25kIHRlY2huaXF1ZSBlbGltaW5hdGluZyB0aGUgZmllbGQgaWRzIHVzZWQgYnkgVEJpbmFyeVByb3RvY29sLiAgVGhpcwotZGVjaXNpb24gcmVxdWlyZWQgc3VwcG9ydCBmcm9tIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIGFsc28gc2FjcmlmaWNlcyBzb21lIG9mCi10aGUgYmFja3dhcmQgYW5kIGZvcndhcmQgY29tcGF0aWJpbGl0eSBvZiBUQmluYXJ5UHJvdG9jb2wuCi0KLVdlIGNvbnNpZGVyZWQgaW1wbGVtZW50aW5nIHRoaXMgdGVjaG5pcXVlIGJ5IGdlbmVyYXRpbmcgc2VwYXJhdGUgcmVhZGVycyBhbmQKLXdyaXRlcnMgZm9yIHRoZSBkZW5zZSBwcm90b2NvbCAodGhpcyBpcyBob3cgUGlsbGFyLCBUaHJpZnQncyBwcmVkZWNlc3NvciwKLXdvcmtlZCksIGJ1dCB0aGlzIGlkZWEgaGFkIGEgZmV3IHByb2JsZW1zOgotLSBPdXIgYWJzdHJhY3Rpb25zIGdvIG91dCB0aGUgd2luZG93LgotLSBXZSB3b3VsZCBoYXZlIHRvIG1haW50YWluIGEgc2Vjb25kIGNvZGUgZ2VuZXJhdG9yLgotLSBQcmVzZXJ2aW5nIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgdmVyc2lvbnMgb2YgdGhlIHN0cnVjdHVyZXMgd291bGQgYmUgYQotICBuaWdodG1hcmUuCi0KLVRoZXJlZm9yZSwgd2UgY2hvc2UgYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uIHRoYXQgc3RvcmVkIHRoZSBkZXNjcmlwdGlvbiBvZgotdGhlIGRhdGEgbmVpdGhlciBpbiB0aGUgZGF0YSBpdHNlbGYgKGxpa2UgVEJpbmFyeVByb3RvY29sKSBub3IgaW4gdGhlCi1zZXJpYWxpemF0aW9uIGNvZGUgKGxpa2UgUGlsbGFyKSwgYnV0IGluc3RlYWQgaW4gYSBzZXBhcmF0ZSBkYXRhIHN0cnVjdHVyZSwKLWNhbGxlZCBhIFR5cGVTcGVjLiAgVHlwZVNwZWNzIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgotKHNwZWNpZmljYWxseSBpbiB0aGUgdF9jcHBfZ2VuZXJhdG9yKSwgYW5kIHRoZWlyIHN0cnVjdHVyZSBzaG91bGQgYmUKLWRvY3VtZW50ZWQgdGhlcmUgKFRPRE8oZHJlaXNzKTogcy9zaG91bGQgYmUvaXMvKS4KLQotV2UgbWFpbnRhaW4gYSBzdGFjayBvZiBUeXBlU3BlY3Mgd2l0aGluIHRoZSBwcm90b2NvbCBzbyBpdCBrbm93cyB3aGVyZSB0aGUKLWdlbmVyYXRlZCBjb2RlIGlzIGluIHRoZSByZWFkaW5nL3dyaXRpbmcgcHJvY2Vzcy4gIEZvciBleGFtcGxlLCBpZiB3ZSBhcmUKLXdyaXRpbmcgYW4gaTMyIGNvbnRhaW5lZCBpbiBhIHN0cnVjdCBiYXIsIGNvbnRhaW5lZCBpbiBhIHN0cnVjdCBmb28sIHRoZW4gdGhlCi1zdGFjayB3b3VsZCBsb29rIGxpa2U6IFRPUCAsIGkzMiAsIHN0cnVjdCBiYXIgLCBzdHJ1Y3QgZm9vICwgQk9UVE9NLgotVGhlIGZvbGxvd2luZyBpbnZhcmlhbnQ6IHdoZW5ldmVyIHdlIGFyZSBhYm91dCB0byByZWFkL3dyaXRlIGFuIG9iamVjdAotKHN0cnVjdEJlZ2luLCBjb250YWluZXJCZWdpbiwgb3IgYSBzY2FsYXIpLCB0aGUgVHlwZVNwZWMgb24gdGhlIHRvcCBvZiB0aGUKLXN0YWNrIG11c3QgbWF0Y2ggdGhlIHR5cGUgYmVpbmcgcmVhZC93cml0dGVuLiAgVGhlIG1haW4gcmVhc29ucyB0aGF0IHRoaXMKLWludmFyaWFudCBtdXN0IGJlIG1haW50YWluZWQgaXMgdGhhdCBpZiB3ZSBldmVyIHN0YXJ0IHJlYWRpbmcgYSBzdHJ1Y3R1cmUsIHdlCi1tdXN0IGhhdmUgaXRzIGV4YWN0IFR5cGVTcGVjIGluIG9yZGVyIHRvIHBhc3MgdGhlIHJpZ2h0IHRhZ3MgdG8gdGhlCi1kZXNlcmlhbGl6ZXIuCi0KLVdlIHVzZSB0aGUgZm9sbG93aW5nIHN0cmF0ZWdpZXMgZm9yIG1haW50YWluaW5nIHRoaXMgaW52YXJpYW50OgotCi0tIEZvciBzdHJ1Y3R1cmVzLCB3ZSBoYXZlIGEgc2VwYXJhdGUgc3RhY2sgb2YgaW5kZXhlcywgb25lIGZvciBlYWNoIHN0cnVjdHVyZQotICBvbiB0aGUgVHlwZVNwZWMgc3RhY2suICBUaGVzZSBhcmUgaW5kZXhlcyBpbnRvIHRoZSBsaXN0IG9mIGZpZWxkcyBpbiB0aGUKLSAgc3RydWN0dXJlJ3MgVHlwZVNwZWMuICBXaGVuIHdlIHtyZWFkLHdyaXRlfUZpZWxkQmVnaW4sIHdlIHB1c2ggb24gdGhlCi0gIFR5cGVTcGVjIGZvciB0aGUgZmllbGQuCi0tIFdoZW4gd2UgYmVnaW4gd3JpdGluZyBhIGxpc3Qgb3Igc2V0LCB3ZSBwdXNoIG9uIHRoZSBUeXBlU3BlYyBmb3IgdGhlCi0gIGVsZW1lbnQgdHlwZS4KLS0gRm9yIG1hcHMsIHdlIGhhdmUgYSBzZXBhcmF0ZSBzdGFjayBvZiBib29sZWFucywgb25lIGZvciBlYWNoIG1hcCBvbiB0aGUKLSAgVHlwZVNwZWMgc3RhY2suICBUaGUgYm9vbGVhbiBpcyB0cnVlIGlmIHdlIGFyZSB3cml0aW5nIHRoZSBrZXkgZm9yIHRoYXQKLSAgbWFwLCBhbmQgZmFsc2UgaWYgd2UgYXJlIHdyaXRpbmcgdGhlIHZhbHVlLiAgTWFwcyBhcmUgdGhlIHRyaWNraWVzdCBjYXNlCi0gIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IGNhbGwgYW55IHByb3RvY29sIG1ldGhvZCBiZXR3ZWVuCi0gIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZS4gIEFzIGEgcmVzdWx0LCB3ZSBwb3RlbnRpYWxseSBoYXZlIHRvIHN3aXRjaAotICBiZXR3ZWVuIG1hcCBrZXkgc3RhdGUgYW5kIG1hcCB2YWx1ZSBzdGF0ZSBhZnRlciByZWFkaW5nL3dyaXRpbmcgYW55IG9iamVjdC4KLS0gVGhpcyBqb2IgaXMgaGFuZGxlZCBieSB0aGUgc3RhdGVUcmFuc2l0aW9uIG1ldGhvZC4gIEl0IGlzIGNhbGxlZCBhZnRlcgotICByZWFkaW5nL3dyaXRpbmcgZXZlcnkgb2JqZWN0LiAgSXQgcG9wcyB0aGUgY3VycmVudCBUeXBlU3BlYyBvZmYgdGhlIHN0YWNrLAotICB0aGVuIG9wdGlvbmFsbHkgcHVzaGVzIGEgbmV3IG9uZSBvbiwgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIG5leHQgVHlwZVNwZWMgaXMuCi0gIElmIGl0IGlzIGEgc3RydWN0LCB0aGUgam9iIGlzIGxlZnQgdG8gdGhlIG5leHQgd3JpdGVGaWVsZEJlZ2luLiAgSWYgaXQgaXMgYQotICBzZXQgb3IgbGlzdCwgdGhlIGp1c3QtcG9wcGVkIHR5cGVzcGVjIGlzIHB1c2hlZCBiYWNrIG9uLiAgSWYgaXQgaXMgYSBtYXAsCi0gIHRoZSB0b3Agb2YgdGhlIGtleS92YWx1ZSBzdGFjayBpcyB0b2dnbGVkLCBhbmQgdGhlIGFwcHJvcHJpYXRlIFR5cGVTcGVjCi0gIGlzIHB1c2hlZC4KLQotT3B0aW9uYWwgZmllbGRzIGFyZSBhIGxpdHRsZSB0cmlja3kgYWxzby4gIFdlIHdyaXRlIGEgemVybyBieXRlIGlmIHRoZXkgYXJlCi1hYnNlbnQgYW5kIHByZWZpeCB0aGVtIHdpdGggYW4gMHgwMSBieXRlIGlmIHRoZXkgYXJlIHByZXNlbnQKLSovCi0KLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC9UUmVmbGVjdGlvbkxvY2FsLmg+Ci0KLS8vIExlYXZpbmcgdGhpcyBvbiBmb3Igbm93LiAgRGlzYWJsaW5nIGl0IHdpbGwgdHVybiBvZmYgYXNzZXJ0cywgd2hpY2ggc2hvdWxkCi0vLyBnaXZlIGEgcGVyZm9ybWFuY2UgYm9vc3QuICBXaGVuIHdlIGhhdmUgKnJlYWxseSogdGhvcm91Z2ggdGVzdCBjYXNlcywKLS8vIHdlIHNob3VsZCBkcm9wIHRoaXMuCi0jZGVmaW5lIERFQlVHX1RERU5TRVBST1RPQ09MCi0KLS8vIE5PVEU6IEFzc2VydGlvbnMgc2hvdWxkICpvbmx5KiBiZSB1c2VkIHRvIGRldGVjdCBidWdzIGluIGNvZGUsCi0vLyAgICAgICBlaXRoZXIgaW4gVERlbnNlUHJvdG9jb2wgaXRzZWxmLCBvciBpbiBjb2RlIHVzaW5nIGl0LgotLy8gICAgICAgKEZvciBleGFtcGxlLCB1c2luZyB0aGUgd3JvbmcgVHlwZVNwZWMuKQotLy8gICAgICAgSW52YWxpZCBkYXRhIHNob3VsZCBORVZFUiBjYXVzZSBhbiBhc3NlcnRpb24gZmFpbHVyZSwKLS8vICAgICAgIG5vIG1hdHRlciBob3cgZ3Jvc3NseSBjb3JydXB0ZWQsIG5vciBob3cgaW5nZW5pb3VzbHkgY3JhZnRlZC4KLSNpZmRlZiBERUJVR19UREVOU0VQUk9UT0NPTAotI3VuZGVmIE5ERUJVRwotI2Vsc2UKLSNkZWZpbmUgTkRFQlVHCi0jZW5kaWYKLSNpbmNsdWRlIDxjYXNzZXJ0PgotCi11c2luZyBzdGQ6OnN0cmluZzsKLQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIFVOTElLRUxZKHZhbCkgKF9fYnVpbHRpbl9leHBlY3QoKHZhbCksIDApKQotI2Vsc2UKLSNkZWZpbmUgVU5MSUtFTFkodmFsKSAodmFsKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotY29uc3QgaW50IFREZW5zZVByb3RvY29sOjpGUF9QUkVGSVhfTEVOID0KLSAgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpGUF9QUkVGSVhfTEVOOwotCi0vLyBUb3AgVHlwZVNwZWMuICBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlIGJlaW5nIGVuY29kZWQuCi0jZGVmaW5lIFRUUyAgKHRzX3N0YWNrXy5iYWNrKCkpICAvLyB0eXBlID0gVHlwZVNwZWMqCi0vLyBJbkRlWC4gIEluZGV4IGludG8gVFRTIG9mIHRoZSBjdXJyZW50L25leHQgZmllbGQgdG8gZW5jb2RlLgotI2RlZmluZSBJRFggKGlkeF9zdGFja18uYmFjaygpKSAgLy8gdHlwZSA9IGludAotLy8gRmllbGQgVHlwZVNwZWMuICBUeXBlU3BlYyBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgRlRTIChUVFMtPnRzdHJ1Y3Quc3BlY3NbSURYXSkgIC8vIHR5cGUgPSBUeXBlU3BlYyoKLS8vIEZpZWxkIE1lVGEuICBNZXRhZGF0YSBvZiB0aGUgY3VycmVudC9uZXh0IGZpZWxkIHRvIGVuY29kZS4KLSNkZWZpbmUgRk1UIChUVFMtPnRzdHJ1Y3QubWV0YXNbSURYXSkgIC8vIHR5cGUgPSBGaWVsZE1ldGEKLS8vIFN1YlR5cGUgMS8yLiAgVHlwZVNwZWMgb2YgdGhlIGZpcnN0L3NlY29uZCBzdWJ0eXBlIG9mIHRoaXMgY29udGFpbmVyLgotI2RlZmluZSBTVDEgKFRUUy0+dGNvbnRhaW5lci5zdWJ0eXBlMSkKLSNkZWZpbmUgU1QyIChUVFMtPnRjb250YWluZXIuc3VidHlwZTIpCi0KLQotLyoqCi0gKiBDaGVja3MgdGhhdCBAYyB0dHlwZSBpcyBpbmRlZWQgdGhlIHR0eXBlIHRoYXQgd2Ugc2hvdWxkIGJlIHdyaXRpbmcsCi0gKiBhY2NvcmRpbmcgdG8gb3VyIHR5cGVzcGVjLiAgQWJvcnRzIGlmIHRoZSB0ZXN0IGZhaWxzIGFuZCBkZWJ1Z2dpbmcgaW4gb24uCi0gKi8KLWlubGluZSB2b2lkIFREZW5zZVByb3RvY29sOjpjaGVja1RUeXBlKGNvbnN0IFRUeXBlIHR0eXBlKSB7Ci0gIGFzc2VydCghdHNfc3RhY2tfLmVtcHR5KCkpOwotICBhc3NlcnQoVFRTLT50dHlwZSA9PSB0dHlwZSk7Ci19Ci0KLS8qKgotICogTWFrZXMgc3VyZSB0aGF0IHRoZSBUeXBlU3BlYyBzdGFjayBpcyBjb3JyZWN0IGZvciB0aGUgbmV4dCBvYmplY3QuCi0gKiBTZWUgdG9wLW9mLWZpbGUgY29tbWVudHMuCi0gKi8KLWlubGluZSB2b2lkIFREZW5zZVByb3RvY29sOjpzdGF0ZVRyYW5zaXRpb24oKSB7Ci0gIFR5cGVTcGVjKiBvbGRfdHRzID0gdHNfc3RhY2tfLmJhY2soKTsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0KLSAgLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSB0b3AtbGV2ZWwgd3JpdGUsIHdlIHNob3VsZCBoYXZlIGp1c3QgcG9wcGVkCi0gIC8vIHRoZSBUeXBlU3BlYyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBpZiAodHNfc3RhY2tfLmVtcHR5KCkpIHsKLSAgICBhc3NlcnQob2xkX3R0cyA9IHR5cGVfc3BlY18pOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN3aXRjaCAoVFRTLT50dHlwZSkgewotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IEZUUyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MSVNUOgotICAgIGNhc2UgVF9TRVQ6Ci0gICAgICBhc3NlcnQob2xkX3R0cyA9PSBTVDEpOwotICAgICAgdHNfc3RhY2tfLnB1c2hfYmFjayhvbGRfdHRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX01BUDoKLSAgICAgIGFzc2VydChvbGRfdHRzID09IChta3Zfc3RhY2tfLmJhY2soKSA/IFNUMSA6IFNUMikpOwotICAgICAgbWt2X3N0YWNrXy5iYWNrKCkgPSAhbWt2X3N0YWNrXy5iYWNrKCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKG1rdl9zdGFja18uYmFjaygpID8gU1QxIDogU1QyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCghIkludmFsaWQgVFR5cGUgaW4gc3RhdGVUcmFuc2l0aW9uLiIpOwotICAgICAgYnJlYWs7Ci0KLSAgfQotfQotCi0KLS8qCi0gKiBWYXJpYWJsZS1sZW5ndGggcXVhbnRpdHkgZnVuY3Rpb25zLgotICovCi0KLWlubGluZSB1aW50MzJfdCBURGVuc2VQcm90b2NvbDo6dmxxUmVhZCh1aW50NjRfdCYgdmxxKSB7Ci0gIHVpbnQzMl90IHVzZWQgPSAwOwotICB1aW50NjRfdCB2YWwgPSAwOwotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICB1aW50MzJfdCBidWZfc2l6ZSA9IHNpemVvZihidWYpOwotICBjb25zdCB1aW50OF90KiBib3Jyb3dlZCA9IHRyYW5zXy0+Ym9ycm93KGJ1ZiwgJmJ1Zl9zaXplKTsKLQotICAvLyBGYXN0IHBhdGguICBUT0RPKGRyZWlzcyk6IE1ha2UgaXQgZmFzdGVyLgotICBpZiAoYm9ycm93ZWQgIT0gTlVMTCkgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGUgPSBib3Jyb3dlZFt1c2VkXTsKLSAgICAgIHVzZWQrKzsKLSAgICAgIHZhbCA9ICh2YWwgPDwgNykgfCAoYnl0ZSAmIDB4N2YpOwotICAgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7Ci0gICAgICAgIHZscSA9IHZhbDsKLSAgICAgICAgdHJhbnNfLT5jb25zdW1lKHVzZWQpOwotICAgICAgICByZXR1cm4gdXNlZDsKLSAgICAgIH0KLSAgICAgIC8vIEhhdmUgdG8gY2hlY2sgZm9yIGludmFsaWQgZGF0YSBzbyB3ZSBkb24ndCBjcmFzaC4KLSAgICAgIGlmIChVTkxJS0VMWSh1c2VkID09IHNpemVvZihidWYpKSkgewotICAgICAgICByZXNldFN0YXRlKCk7Ci0gICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwgIlZhcmlhYmxlLWxlbmd0aCBpbnQgb3ZlciAxMCBieXRlcy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBTbG93IHBhdGguCi0gIGVsc2UgewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB1aW50OF90IGJ5dGU7Ci0gICAgICB1c2VkICs9IHRyYW5zXy0+cmVhZEFsbCgmYnl0ZSwgMSk7Ci0gICAgICB2YWwgPSAodmFsIDw8IDcpIHwgKGJ5dGUgJiAweDdmKTsKLSAgICAgIGlmICghKGJ5dGUgJiAweDgwKSkgewotICAgICAgICB2bHEgPSB2YWw7Ci0gICAgICAgIHJldHVybiB1c2VkOwotICAgICAgfQotICAgICAgLy8gTWlnaHQgYXMgd2VsbCBjaGVjayBmb3IgaW52YWxpZCBkYXRhIG9uIHRoZSBzbG93IHBhdGggdG9vLgotICAgICAgaWYgKFVOTElLRUxZKHVzZWQgPj0gc2l6ZW9mKGJ1ZikpKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1pbmxpbmUgdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnZscVdyaXRlKHVpbnQ2NF90IHZscSkgewotICB1aW50OF90IGJ1ZlsxMF07ICAvLyA2NCBiaXRzIC8gKDcgYml0cy9ieXRlKSA9IDEwIGJ5dGVzLgotICBpbnQzMl90IHBvcyA9IHNpemVvZihidWYpIC0gMTsKLQotICAvLyBXcml0ZSB0aGUgdGhpbmcgZnJvbSBiYWNrIHRvIGZyb250LgotICBidWZbcG9zXSA9IHZscSAmIDB4N2Y7Ci0gIHZscSA+Pj0gNzsKLSAgcG9zLS07Ci0KLSAgd2hpbGUgKHZscSA+IDApIHsKLSAgICBhc3NlcnQocG9zID49IDApOwotICAgIGJ1Zltwb3NdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4odmxxIHwgMHg4MCk7Ci0gICAgdmxxID4+PSA3OwotICAgIHBvcy0tOwotICB9Ci0KLSAgLy8gQmFjayB1cCBvbmUgc3RlcCBiZWZvcmUgd3JpdGluZy4KLSAgcG9zKys7Ci0KLSAgdHJhbnNfLT53cml0ZShidWYrcG9zLCBzaXplb2YoYnVmKSAtIHBvcyk7Ci0gIHJldHVybiBzaXplb2YoYnVmKSAtIHBvczsKLX0KLQotCi0KLS8qCi0gKiBXcml0aW5nIGZ1bmN0aW9ucy4KLSAqLwotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVNZXNzYWdlQmVnaW4oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpIHsKLSAgdGhyb3cgVEV4Y2VwdGlvbigiVERlbnNlUHJvdG9jb2wgZG9lc24ndCB3b3JrIHdpdGggbWVzc2FnZXMgKHlldCkuIik7Ci0KLSAgaW50MzJfdCB2ZXJzaW9uID0gKFZFUlNJT05fMikgfCAoKGludDMyX3QpbWVzc2FnZVR5cGUpOwotICB1aW50MzJfdCB3c2l6ZSA9IDA7Ci0gIHdzaXplICs9IHN1YldyaXRlSTMyKHZlcnNpb24pOwotICB3c2l6ZSArPSBzdWJXcml0ZVN0cmluZyhuYW1lKTsKLSAgd3NpemUgKz0gc3ViV3JpdGVJMzIoc2VxaWQpOwotICByZXR1cm4gd3NpemU7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZU1lc3NhZ2VFbmQoKSB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICAvLyBUaGUgVHlwZVNwZWMgc3RhY2sgc2hvdWxkIGJlIGVtcHR5IGlmIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCByZWFkL3dyaXRlLgotICAvLyBJZiBpdCBpcywgd2UgcHVzaCB0aGUgVHlwZVNwZWMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAgaWYgKHRzX3N0YWNrXy5lbXB0eSgpKSB7Ci0gICAgYXNzZXJ0KHN0YW5kYWxvbmVfKTsKLQotICAgIGlmICh0eXBlX3NwZWNfID09IE5VTEwpIHsKLSAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgIHRocm93IFRFeGNlcHRpb24oIlREZW5zZVByb3RvY29sOiBObyB0eXBlIHNwZWNpZmllZC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KHR5cGVfc3BlY18tPnR0eXBlID09IFRfU1RSVUNUKTsKLSAgICAgIHRzX3N0YWNrXy5wdXNoX2JhY2sodHlwZV9zcGVjXyk7Ci0gICAgICAvLyBXcml0ZSBvdXQgYSBwcmVmaXggb2YgdGhlIHN0cnVjdHVyZSBmaW5nZXJwcmludC4KLSAgICAgIHRyYW5zXy0+d3JpdGUodHlwZV9zcGVjXy0+ZnBfcHJlZml4LCBGUF9QUkVGSVhfTEVOKTsKLSAgICAgIHhmZXIgKz0gRlBfUFJFRklYX0xFTjsKLSAgICB9Ci0gIH0KLQotICAvLyBXZSBuZWVkIGEgbmV3IGZpZWxkIGluZGV4IGZvciB0aGlzIHN0cnVjdHVyZS4KLSAgaWR4X3N0YWNrXy5wdXNoX2JhY2soMCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTdHJ1Y3RFbmQoKSB7Ci0gIGlkeF9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOwotICB1aW50MzJfdCB4ZmVyID0gMDsKLQotICAvLyBTa2lwIG92ZXIgb3B0aW9uYWwgZmllbGRzLgotICB3aGlsZSAoRk1ULnRhZyAhPSBmaWVsZElkKSB7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBPbGQgbWV0YSBoZXJlLgotICAgIGFzc2VydChGVFMtPnR0eXBlICE9IFRfU1RPUCk7Ci0gICAgYXNzZXJ0KEZNVC5pc19vcHRpb25hbCk7Ci0gICAgLy8gV3JpdGUgYSB6ZXJvIGJ5dGUgc28gdGhlIHJlYWRlciBjYW4gc2tpcCBpdC4KLSAgICB4ZmVyICs9IHN1YldyaXRlQm9vbChmYWxzZSk7Ci0gICAgLy8gQW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgZmllbGQuCi0gICAgSURYKys7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IGdpdmUgYSBiZXR0ZXIgZXhjZXB0aW9uLgotICBhc3NlcnQoRlRTLT50dHlwZSA9PSBmaWVsZFR5cGUpOwotCi0gIGlmIChGTVQuaXNfb3B0aW9uYWwpIHsKLSAgICBzdWJXcml0ZUJvb2wodHJ1ZSk7Ci0gICAgeGZlciArPSAxOwotICB9Ci0KLSAgLy8gd3JpdGVGaWVsZFN0b3Agc2hhcmVzIGFsbCBsb3Qgb2YgbG9naWMgdXAgdG8gdGhpcyBwb2ludC4KLSAgLy8gSW5zdGVhZCBvZiByZXBsaWNhdGluZyBpdCBhbGwsIHdlIGp1c3QgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIHRoYXQgb25lCi0gIC8vIGFuZCB1c2UgYSBncm9zcyBzcGVjaWFsIGNhc2UgaGVyZS4KLSAgaWYgKFVOTElLRUxZKEZUUy0+dHR5cGUgIT0gVF9TVE9QKSkgewotICAgIC8vIEZvciBub3JtYWwgZmllbGRzLCBwdXNoIHRoZSBUeXBlU3BlYyB0aGF0IHdlJ3JlIGFib3V0IHRvIHVzZS4KLSAgICB0c19zdGFja18ucHVzaF9iYWNrKEZUUyk7Ci0gIH0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUZpZWxkRW5kKCkgewotICAvLyBKdXN0IG1vdmUgb24gdG8gdGhlIG5leHQgZmllbGQuCi0gIElEWCsrOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRTdG9wKCkgewotICByZXR1cm4gVERlbnNlUHJvdG9jb2w6OndyaXRlRmllbGRCZWdpbigiIiwgVF9TVE9QLCAwKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9NQVApOwotCi0gIGFzc2VydChrZXlUeXBlID09IFNUMS0+dHR5cGUpOwotICBhc3NlcnQodmFsVHlwZSA9PSBTVDItPnR0eXBlKTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIG1rdl9zdGFja18ucHVzaF9iYWNrKHRydWUpOwotCi0gIHJldHVybiBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICAvLyBQb3Agb2ZmIHRoZSB2YWx1ZSB0eXBlLCBhcyB3ZWxsIGFzIG91ciBlbnRyeSBpbiB0aGUgbWFwIGtleS92YWx1ZSBzdGFjay4KLSAgLy8gc3RhdGVUcmFuc2l0aW9uIHRha2VzIGNhcmUgb2YgcG9wcGluZyBvZmYgb3VyIFR5cGVTcGVjLgotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgbWt2X3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gIGNoZWNrVFR5cGUoVF9MSVNUKTsKLQotICBhc3NlcnQoZWxlbVR5cGUgPT0gU1QxLT50dHlwZSk7Ci0gIHRzX3N0YWNrXy5wdXNoX2JhY2soU1QxKTsKLSAgcmV0dXJuIHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVMaXN0RW5kKCkgewotICAvLyBQb3Agb2ZmIHRoZSBlbGVtZW50IHR5cGUuICBzdGF0ZVRyYW5zaXRpb24gdGFrZXMgY2FyZSBvZiBwb3BwaW5nIG9mZiBvdXJzLgotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgY2hlY2tUVHlwZShUX1NFVCk7Ci0KLSAgYXNzZXJ0KGVsZW1UeXBlID09IFNUMS0+dHR5cGUpOwotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIHJldHVybiBzdWJXcml0ZUkzMigoaW50MzJfdClzaXplKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU2V0RW5kKCkgewotICAvLyBQb3Agb2ZmIHRoZSBlbGVtZW50IHR5cGUuICBzdGF0ZVRyYW5zaXRpb24gdGFrZXMgY2FyZSBvZiBwb3BwaW5nIG9mZiBvdXJzLgotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVCb29sKGNvbnN0IGJvb2wgdmFsdWUpIHsKLSAgY2hlY2tUVHlwZShUX0JPT0wpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVCb29sKHZhbHVlKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICBjaGVja1RUeXBlKFRfQllURSk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjp3cml0ZUJ5dGUoYnl0ZSk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICBjaGVja1RUeXBlKFRfSTE2KTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiB2bHFXcml0ZShpMTYpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgY2hlY2tUVHlwZShUX0kzMik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gdmxxV3JpdGUoaTMyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gIGNoZWNrVFR5cGUoVF9JNjQpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIHZscVdyaXRlKGk2NCk7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjp3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gIGNoZWNrVFR5cGUoVF9ET1VCTEUpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6d3JpdGVEb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgY2hlY2tUVHlwZShUX1NUUklORyk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gc3ViV3JpdGVTdHJpbmcoc3RyKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OndyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjp3cml0ZVN0cmluZyhzdHIpOwotfQotCi1pbmxpbmUgdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnN1YldyaXRlSTMyKGNvbnN0IGludDMyX3QgaTMyKSB7Ci0gIHJldHVybiB2bHFXcml0ZShpMzIpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6c3ViV3JpdGVTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBpZihzdHIuc2l6ZSgpID4gc3RhdGljX2Nhc3Q8c2l6ZV90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgdWludDMyX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHIuc2l6ZSgpKTsKLSAgdWludDMyX3QgeGZlciA9IHN1YldyaXRlSTMyKChpbnQzMl90KXNpemUpOwotICBpZiAoc2l6ZSA+IDApIHsKLSAgICB0cmFuc18tPndyaXRlKCh1aW50OF90KilzdHIuZGF0YSgpLCBzaXplKTsKLSAgfQotICByZXR1cm4geGZlciArIHNpemU7Ci19Ci0KLQotCi0vKgotICogUmVhZGluZyBmdW5jdGlvbnMKLSAqCi0gKiBUaGVzZSBoYXZlIGEgbG90IG9mIHRoZSBzYW1lIGxvZ2ljIGFzIHRoZSB3cml0aW5nIGZ1bmN0aW9ucywgc28gaWYKLSAqIHNvbWV0aGluZyBpcyBjb25mdXNpbmcsIGxvb2sgZm9yIGNvbW1lbnRzIGluIHRoZSBjb3JyZXNwb25kaW5nIHdyaXRlci4KLSAqLwotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbCBkb2Vzbid0IHdvcmsgd2l0aCBtZXNzYWdlcyAoeWV0KS4iKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzejsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHN6KTsKLQotICBpZiAoc3ogPCAwKSB7Ci0gICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIKLSAgICBpbnQzMl90IHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKLSAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzIpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaWRlbnRpZmllciIpOwotICAgIH0KLSAgICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpKHN6ICYgMHgwMDAwMDBmZik7Ci0gICAgeGZlciArPSBzdWJSZWFkU3RyaW5nKG5hbWUpOwotICAgIHhmZXIgKz0gc3ViUmVhZEkzMihzZXFpZCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sICJObyB2ZXJzaW9uIGlkZW50aWZpZXIuLi4gb2xkIHByb3RvY29sIGNsaWVudCBpbiBzdHJpY3QgbW9kZT8iKTsKLSAgfQotICByZXR1cm4geGZlcjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRNZXNzYWdlRW5kKCkgewotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdHJpbmcmIG5hbWUpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIGlmICh0c19zdGFja18uZW1wdHkoKSkgewotICAgIGFzc2VydChzdGFuZGFsb25lXyk7Ci0KLSAgICBpZiAodHlwZV9zcGVjXyA9PSBOVUxMKSB7Ci0gICAgICByZXNldFN0YXRlKCk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJURGVuc2VQcm90b2NvbDogTm8gdHlwZSBzcGVjaWZpZWQuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFzc2VydCh0eXBlX3NwZWNfLT50dHlwZSA9PSBUX1NUUlVDVCk7Ci0gICAgICB0c19zdGFja18ucHVzaF9iYWNrKHR5cGVfc3BlY18pOwotCi0gICAgICAvLyBDaGVjayB0aGUgZmluZ2VycHJpbnQgcHJlZml4LgotICAgICAgdWludDhfdCBidWZbRlBfUFJFRklYX0xFTl07Ci0gICAgICB4ZmVyICs9IHRyYW5zXy0+cmVhZChidWYsIEZQX1BSRUZJWF9MRU4pOwotICAgICAgaWYgKHN0ZDo6bWVtY21wKGJ1ZiwgdHlwZV9zcGVjXy0+ZnBfcHJlZml4LCBGUF9QUkVGSVhfTEVOKSAhPSAwKSB7Ci0gICAgICAgIHJlc2V0U3RhdGUoKTsKLSAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgIkZpbmdlcnByaW50IGluIGRhdGEgZG9lcyBub3QgbWF0Y2ggdHlwZV9zcGVjLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFdlIG5lZWQgYSBuZXcgZmllbGQgaW5kZXggZm9yIHRoaXMgc3RydWN0dXJlLgotICBpZHhfc3RhY2tfLnB1c2hfYmFjaygwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU3RydWN0RW5kKCkgewotICBpZHhfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Ci0gIHVpbnQzMl90IHhmZXIgPSAwOwotCi0gIC8vIEZvciBvcHRpb25hbCBmaWVsZHMsIGNoZWNrIHRvIHNlZSBpZiB0aGV5IGFyZSB0aGVyZS4KLSAgd2hpbGUgKEZNVC5pc19vcHRpb25hbCkgewotICAgIGJvb2wgaXNfcHJlc2VudDsKLSAgICB4ZmVyICs9IHN1YlJlYWRCb29sKGlzX3ByZXNlbnQpOwotICAgIGlmIChpc19wcmVzZW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgSURYKys7Ci0gIH0KLQotICAvLyBPbmNlIHdlIGhpdCBhIG1hbmRhdG9yeSBmaWVsZCwgb3IgYW4gb3B0aW9uYWwgZmllbGQgdGhhdCBpcyBwcmVzZW50LAotICAvLyB3ZSBrbm93IHRoYXQgRk1UIGFuZCBGVFMgcG9pbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGZpZWxkLgotCi0gIGZpZWxkSWQgICA9IEZNVC50YWc7Ci0gIGZpZWxkVHlwZSA9IEZUUy0+dHR5cGU7Ci0KLSAgLy8gTm9ybWFsbHksIHdlIHB1c2ggdGhlIFR5cGVTcGVjIHRoYXQgd2UgYXJlIGFib3V0IHRvIHJlYWQsCi0gIC8vIGJ1dCBubyByZWFkaW5nIGlzIGRvbmUgZm9yIFRfU1RPUC4KLSAgaWYgKEZUUy0+dHR5cGUgIT0gVF9TVE9QKSB7Ci0gICAgdHNfc3RhY2tfLnB1c2hfYmFjayhGVFMpOwotICB9Ci0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEZpZWxkRW5kKCkgewotICBJRFgrKzsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTUFQKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGtleVR5cGUgPSBTVDEtPnR0eXBlOwotICB2YWxUeXBlID0gU1QyLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0gIG1rdl9zdGFja18ucHVzaF9iYWNrKHRydWUpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKLSAgdHNfc3RhY2tfLnBvcF9iYWNrKCk7Ci0gIG1rdl9zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfTElTVCk7Ci0KLSAgdWludDMyX3QgeGZlciA9IDA7Ci0gIGludDMyX3Qgc2l6ZWk7Ci0gIHhmZXIgKz0gc3ViUmVhZEkzMihzaXplaSk7Ci0gIGlmIChzaXplaSA8IDApIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6TkVHQVRJVkVfU0laRSk7Ci0gIH0gZWxzZSBpZiAoY29udGFpbmVyX2xpbWl0XyAmJiBzaXplaSA+IGNvbnRhaW5lcl9saW1pdF8pIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIH0KLSAgc2l6ZSA9ICh1aW50MzJfdClzaXplaTsKLQotICBlbGVtVHlwZSA9IFNUMS0+dHR5cGU7Ci0KLSAgdHNfc3RhY2tfLnB1c2hfYmFjayhTVDEpOwotCi0gIHJldHVybiB4ZmVyOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZExpc3RFbmQoKSB7Ci0gIHRzX3N0YWNrXy5wb3BfYmFjaygpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewotICBjaGVja1RUeXBlKFRfU0VUKTsKLQotICB1aW50MzJfdCB4ZmVyID0gMDsKLSAgaW50MzJfdCBzaXplaTsKLSAgeGZlciArPSBzdWJSZWFkSTMyKHNpemVpKTsKLSAgaWYgKHNpemVpIDwgMCkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpORUdBVElWRV9TSVpFKTsKLSAgfSBlbHNlIGlmIChjb250YWluZXJfbGltaXRfICYmIHNpemVpID4gY29udGFpbmVyX2xpbWl0XykgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKLSAgfQotICBzaXplID0gKHVpbnQzMl90KXNpemVpOwotCi0gIGVsZW1UeXBlID0gU1QxLT50dHlwZTsKLQotICB0c19zdGFja18ucHVzaF9iYWNrKFNUMSk7Ci0KLSAgcmV0dXJuIHhmZXI7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkU2V0RW5kKCkgewotICB0c19zdGFja18ucG9wX2JhY2soKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiAwOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgY2hlY2tUVHlwZShUX0JPT0wpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgcmV0dXJuIFRCaW5hcnlQcm90b2NvbDo6cmVhZEJvb2wodmFsdWUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gIGNoZWNrVFR5cGUoVF9CWVRFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWRCeXRlKGJ5dGUpOwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZEkxNihpbnQxNl90JiBpMTYpIHsKLSAgY2hlY2tUVHlwZShUX0kxNik7Ci0gIHN0YXRlVHJhbnNpdGlvbigpOwotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDE2X01BWCB8fCB2YWwgPCBJTlQxNl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkxNiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTE2ID0gKGludDE2X3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkSTMyKGludDMyX3QmIGkzMikgewotICBjaGVja1RUeXBlKFRfSTMyKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgdWludDMyX3QgcnYgPSB2bHFSZWFkKHU2NCk7Ci0gIGludDY0X3QgdmFsID0gKGludDY0X3QpdTY0OwotICBpZiAoVU5MSUtFTFkodmFsID4gSU5UMzJfTUFYIHx8IHZhbCA8IElOVDMyX01JTikpIHsKLSAgICByZXNldFN0YXRlKCk7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTMyIG91dCBvZiByYW5nZS4iKTsKLSAgfQotICBpMzIgPSAoaW50MzJfdCl2YWw7Ci0gIHJldHVybiBydjsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRJNjQoaW50NjRfdCYgaTY0KSB7Ci0gIGNoZWNrVFR5cGUoVF9JNjQpOwotICBzdGF0ZVRyYW5zaXRpb24oKTsKLSAgdWludDY0X3QgdTY0OwotICB1aW50MzJfdCBydiA9IHZscVJlYWQodTY0KTsKLSAgaW50NjRfdCB2YWwgPSAoaW50NjRfdCl1NjQ7Ci0gIGlmIChVTkxJS0VMWSh2YWwgPiBJTlQ2NF9NQVggfHwgdmFsIDwgSU5UNjRfTUlOKSkgewotICAgIHJlc2V0U3RhdGUoKTsKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpNjQgb3V0IG9mIHJhbmdlLiIpOwotICB9Ci0gIGk2NCA9IChpbnQ2NF90KXZhbDsKLSAgcmV0dXJuIHJ2OwotfQotCi11aW50MzJfdCBURGVuc2VQcm90b2NvbDo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBjaGVja1RUeXBlKFRfRE9VQkxFKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OnJlYWREb3VibGUoZHViKTsKLX0KLQotdWludDMyX3QgVERlbnNlUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICBjaGVja1RUeXBlKFRfU1RSSU5HKTsKLSAgc3RhdGVUcmFuc2l0aW9uKCk7Ci0gIHJldHVybiBzdWJSZWFkU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIFREZW5zZVByb3RvY29sOjpyZWFkU3RyaW5nKHN0cik7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJSZWFkSTMyKGludDMyX3QmIGkzMikgewotICB1aW50NjRfdCB1NjQ7Ci0gIHVpbnQzMl90IHJ2ID0gdmxxUmVhZCh1NjQpOwotICBpbnQ2NF90IHZhbCA9IChpbnQ2NF90KXU2NDsKLSAgaWYgKFVOTElLRUxZKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4pKSB7Ci0gICAgcmVzZXRTdGF0ZSgpOwotICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkzMiBvdXQgb2YgcmFuZ2UuIik7Ci0gIH0KLSAgaTMyID0gKGludDMyX3QpdmFsOwotICByZXR1cm4gcnY7Ci19Ci0KLXVpbnQzMl90IFREZW5zZVByb3RvY29sOjpzdWJSZWFkU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgdWludDMyX3QgeGZlcjsKLSAgaW50MzJfdCBzaXplOwotICB4ZmVyID0gc3ViUmVhZEkzMihzaXplKTsKLSAgcmV0dXJuIHhmZXIgKyByZWFkU3RyaW5nQm9keShzdHIsIHNpemUpOwotfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlbnNlUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzI1Y2I3Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RERU5TRVBST1RPQ09MX0hfCi0jZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVERFTlNFUFJPVE9DT0xfSF8gMQotCi0jaW5jbHVkZSAiVEJpbmFyeVByb3RvY29sLmgiCi0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQotLyoqCi0gKiAhISFXQVJOSU5HISEhCi0gKiBUaGlzIGNsYXNzIGlzIHN0aWxsIGhpZ2hseSBleHBlcmltZW50YWwuICBJbmNvbXBhdGlibGUgY2hhbmdlcwotICogV0lMTCBiZSBtYWRlIHRvIGl0IHdpdGhvdXQgbm90aWNlLiAgRE8gTk9UIFVTRSBJVCBZRVQgdW5sZXNzCi0gKiB5b3UgYXJlIGNvb3JkaW5hdGluZyB5b3VyIHRlc3Rpbmcgd2l0aCB0aGUgYXV0aG9yLgotICoKLSAqIFRoZSBkZW5zZSBwcm90b2NvbCBpcyBkZXNpZ25lZCB0byB1c2UgYXMgbGl0dGxlIHNwYWNlIGFzIHBvc3NpYmxlLgotICoKLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgZGVuc2UgcHJvdG9jb2wgaW5zdGFuY2VzLiAgU3RhbmRhbG9uZSBpbnN0YW5jZXMKLSAqIGFyZSBub3QgdXNlZCBmb3IgUlBDIGFuZCBqdXN0IGVuY29kZWQgYW5kIGRlY29kZSBzdHJ1Y3R1cmVzIG9mCi0gKiBhIHByZWRldGVybWluZWQgdHlwZS4gIE5vbi1zdGFuZGFsb25lIGluc3RhbmNlcyBhcmUgdXNlZCBmb3IgUlBDLgotICogQ3VycmVudGx5LCBvbmx5IHN0YW5kYWxvbmUgaW5zdGFuY2VzIGV4aXN0LgotICoKLSAqIFRvIHVzZSBhIHN0YW5kYWxvbmUgZGVuc2UgcHJvdG9jb2wgb2JqZWN0LCB5b3UgbXVzdCBzZXQgdGhlIHR5cGVfc3BlYwotICogcHJvcGVydHkgKGVpdGhlciBpbiB0aGUgY29uc3RydWN0b3IsIG9yIHdpdGggc2V0VHlwZVNwZWMpIHRvIHRoZSBsb2NhbAotICogcmVmbGVjdGlvbiBUeXBlU3BlYyBvZiB0aGUgc3RydWN0dXJlcyB5b3Ugd2lsbCB3cml0ZSB0byAob3IgcmVhZCBmcm9tKSB0aGUKLSAqIHByb3RvY29sIGluc3RhbmNlLgotICoKLSAqIEJFU1QgUFJBQ1RJQ0VTOgotICogLSBOZXZlciB1c2Ugb3B0aW9uYWwgZm9yIHByaW1pdGl2ZXMgb3IgY29udGFpbmVycy4KLSAqIC0gT25seSB1c2Ugb3B0aW9uYWwgZm9yIHN0cnVjdHVyZXMgaWYgdGhleSBhcmUgdmVyeSBiaWcgYW5kIHZlcnkgcmFyZWx5IHNldC4KLSAqIC0gQWxsIGludGVnZXJzIGFyZSB2YXJpYWJsZS1sZW5ndGgsIHNvIHlvdSBjYW4gdXNlIGk2NCB3aXRob3V0IGJsb2F0aW5nLgotICogLSBORVZFUiBFVkVSIGNoYW5nZSB0aGUgc3RydWN0IGRlZmluaXRpb25zIElOIEFOWSBXQVkgd2l0aG91dCBlaXRoZXIKLSAqICAgY2hhbmdpbmcgeW91ciBjYWNoZSBrZXlzIG9yIHRhbGtpbmcgdG8gZHJlaXNzLgotICoKLSAqIFRPRE8oZHJlaXNzKTogTmV3IGNsYXNzIHdyaXRlIHdpdGggb2xkIG1ldGEuCi0gKgotICogV2Ugb3ZlcnJpZGUgYWxsIG9mIFRCaW5hcnlQcm90b2NvbCdzIG1ldGhvZHMuCi0gKiBXZSBpbmhlcml0IHNvIHRoYXQgd2UgY2FuIGNhbiBleHBsaWNpdGx5IGNhbGwgVEJQcydzIHByaW1pdGl2ZS13cml0aW5nCi0gKiBtZXRob2RzIHdpdGhpbiBvdXIgdmVyc2lvbnMuCi0gKgotICovCi1jbGFzcyBURGVuc2VQcm90b2NvbAotICA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9ICgoaW50MzJfdCkweGZmZmYwMDAwKTsKLSAgLy8gVkVSU0lPTl8xICgweDgwMDEwMDAwKSAgaXMgdGFrZW4gYnkgVEJpbmFyeVByb3RvY29sLgotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OXzIgPSAoKGludDMyX3QpMHg4MDAyMDAwMCk7Ci0KLSBwdWJsaWM6Ci0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnJlZmxlY3Rpb246OmxvY2FsOjpUeXBlU3BlYyBUeXBlU3BlYzsKLSAgc3RhdGljIGNvbnN0IGludCBGUF9QUkVGSVhfTEVOOwotCi0gIC8qKgotICAgKiBAcGFyYW0gdHJhbiAgICAgICBUaGUgdHJhbnNwb3J0IHRvIHVzZS4KLSAgICogQHBhcmFtIHR5cGVfc3BlYyAgVGhlIFR5cGVTcGVjIG9mIHRoZSBzdHJ1Y3R1cmVzIHVzaW5nIHRoaXMgcHJvdG9jb2wuCi0gICAqLwotICBURGVuc2VQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucywKLSAgICAgICAgICAgICAgICAgVHlwZVNwZWMqIHR5cGVfc3BlYyA9IE5VTEwpIDoKLSAgICBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+KHRyYW5zKSwKLSAgICB0eXBlX3NwZWNfKHR5cGVfc3BlYyksCi0gICAgc3RhbmRhbG9uZV8odHJ1ZSkKLSAge30KLQotICB2b2lkIHNldFR5cGVTcGVjKFR5cGVTcGVjKiB0eXBlX3NwZWMpIHsKLSAgICB0eXBlX3NwZWNfID0gdHlwZV9zcGVjOwotICB9Ci0gIFR5cGVTcGVjKiBnZXRUeXBlU3BlYygpIHsKLSAgICByZXR1cm4gdHlwZV9zcGVjXzsKLSAgfQotCi0KLSAgLyoKLSAgICogV3JpdGluZyBmdW5jdGlvbnMuCi0gICAqLwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2VxaWQpOwotCi0gIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZCgpOwotCi0KLSAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKTsKLQotICB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKTsKLQotICB1aW50MzJfdCB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3AoKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZU1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZUxpc3RFbmQoKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKTsKLQotICB1aW50MzJfdCB3cml0ZVNldEVuZCgpOwotCi0gIHVpbnQzMl90IHdyaXRlQm9vbChjb25zdCBib29sIHZhbHVlKTsKLQotICB1aW50MzJfdCB3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpOwotCi0gIHVpbnQzMl90IHdyaXRlSTE2KGNvbnN0IGludDE2X3QgaTE2KTsKLQotICB1aW50MzJfdCB3cml0ZUkzMihjb25zdCBpbnQzMl90IGkzMik7Ci0KLSAgdWludDMyX3Qgd3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpOwotCi0gIHVpbnQzMl90IHdyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpOwotCi0gIHVpbnQzMl90IHdyaXRlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0gIHVpbnQzMl90IHdyaXRlQmluYXJ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOwotCi0KLSAgLyoKLSAgICogSGVscGVyIHdyaXRpbmcgZnVuY3Rpb25zIChkb24ndCBkbyBzdGF0ZSB0cmFuc2l0aW9ucykuCi0gICAqLwotICBpbmxpbmUgdWludDMyX3Qgc3ViV3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpOwotCi0gIGlubGluZSB1aW50MzJfdCBzdWJXcml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKLQotICB1aW50MzJfdCBzdWJXcml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2w6OndyaXRlQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAqLwotCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7Ci0KLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VFbmQoKTsKLQotICB1aW50MzJfdCByZWFkU3RydWN0QmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKLQotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7Ci0KLSAgdWludDMyX3QgcmVhZEZpZWxkRW5kKCk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZE1hcEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKLQotICB1aW50MzJfdCByZWFkTGlzdEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7Ci0KLSAgdWludDMyX3QgcmVhZFNldEVuZCgpOwotCi0gIHVpbnQzMl90IHJlYWRCb29sKGJvb2wmIHZhbHVlKTsKLSAgLy8gUHJvdmlkZSB0aGUgZGVmYXVsdCByZWFkQm9vbCgpIGltcGxlbWVudGF0aW9uIGZvciBzdGQ6OnZlY3Rvcjxib29sPgotICB1c2luZyBUVmlydHVhbFByb3RvY29sPFREZW5zZVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2w+OjpyZWFkQm9vbDsKLQotICB1aW50MzJfdCByZWFkQnl0ZShpbnQ4X3QmIGJ5dGUpOwotCi0gIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KTsKLQotICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpOwotCi0gIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpOwotCi0gIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKTsKLQotICAvKgotICAgKiBIZWxwZXIgcmVhZGluZyBmdW5jdGlvbnMgKGRvbid0IGRvIHN0YXRlIHRyYW5zaXRpb25zKS4KLSAgICovCi0gIGlubGluZSB1aW50MzJfdCBzdWJSZWFkSTMyKGludDMyX3QmIGkzMik7Ci0KLSAgaW5saW5lIHVpbnQzMl90IHN1YlJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cik7Ci0KLSAgdWludDMyX3Qgc3ViUmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sOjpyZWFkQm9vbCh2YWx1ZSk7Ci0gIH0KLQotCi0gcHJpdmF0ZToKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMsIGRvY3VtZW50ZWQgaW4gdGhlIC5jcHAuCi0gIGlubGluZSB2b2lkIGNoZWNrVFR5cGUoY29uc3QgVFR5cGUgdHR5cGUpOwotICBpbmxpbmUgdm9pZCBzdGF0ZVRyYW5zaXRpb24oKTsKLQotICAvLyBSZWFkIGFuZCB3cml0ZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMuCi0gIC8vIFVzZXMgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHRoZSBNSURJIGZpbGUgZm9ybWF0LgotICBpbmxpbmUgdWludDMyX3QgdmxxUmVhZCh1aW50NjRfdCYgdmxxKTsKLSAgaW5saW5lIHVpbnQzMl90IHZscVdyaXRlKHVpbnQ2NF90IHZscSk7Ci0KLSAgLy8gQ2FsbGVkIGJlZm9yZSB0aHJvd2luZyBhbiBleGNlcHRpb24gdG8gbWFrZSB0aGUgb2JqZWN0IHJldXNhYmxlLgotICB2b2lkIHJlc2V0U3RhdGUoKSB7Ci0gICAgdHNfc3RhY2tfLmNsZWFyKCk7Ci0gICAgaWR4X3N0YWNrXy5jbGVhcigpOwotICAgIG1rdl9zdGFja18uY2xlYXIoKTsKLSAgfQotCi0gIC8vIFR5cGVTcGVjIG9mIHRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIHRvIHdyaXRlLAotICAvLyBmb3Igc3RhbmRhbG9uZSBwcm90b2NvbCBvYmplY3RzLgotICBUeXBlU3BlYyogdHlwZV9zcGVjXzsKLQotICBzdGQ6OnZlY3RvcjxUeXBlU3BlYyo+IHRzX3N0YWNrXzsgICAvLyBUeXBlU3BlYyBzdGFjay4KLSAgc3RkOjp2ZWN0b3I8aW50PiAgICAgICBpZHhfc3RhY2tfOyAgLy8gSW5EZVggc3RhY2suCi0gIHN0ZDo6dmVjdG9yPGJvb2w+ICAgICAgbWt2X3N0YWNrXzsgIC8vIE1hcCBLZXkvVmx1ZSBzdGFjay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ1ZSA9IGtleSwgRmFsc2UgPSB2YWx1ZS4KLQotICAvLyBUcnVlIGlmZiB0aGlzIGlzIGEgc3RhbmRhbG9uZSBpbnN0YW5jZSAobm8gUlBDKS4KLSAgYm9vbCBzdGFuZGFsb25lXzsKLX07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKLQotI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UREVOU0VQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQyZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9DUFBfCisjZGVmaW5lIFRIUklGVF9QUk9UT0NPTF9USEVBREVSUFJPVE9DT0xfQ1BQXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+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+IG91dFRyYW5zKSB7CisgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbCA9IG5ldyBUSGVhZGVyUHJvdG9jb2woaW5UcmFucywgb3V0VHJhbnMsIFRfQklOQVJZX1BST1RPQ09MKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOworICB9Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1BST1RPQ09MX1RIRUFERVJQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmluZGV4IDA5NTE4NzYuLjQ1NzZmYTEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTE3LDE3ICsxNywyNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIlRKU09OUHJvdG9jb2wuaCIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgogCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+Ci0jaW5jbHVkZSAiVEJhc2U2NFV0aWxzLmgiCisjaW5jbHVkZSA8Ym9vc3QvbG9jYWxlLmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL2ZwY2xhc3NpZnkuaHBwPgorI2luY2x1ZGUgPGJvb3N0L21hdGgvc3BlY2lhbF9mdW5jdGlvbnMvc2lnbi5ocHA+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bG9jYWxlPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKLQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIC8vIFN0YXRpYyBkYXRhCiAKQEAgLTM1LDEyICs0NSwxMCBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05PYmplY3RFbmQgPSAnfSc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5U3RhcnQgPSAnWyc7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkFycmF5RW5kID0gJ10nOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05OZXdsaW5lID0gJ1xuJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OUGFpclNlcGFyYXRvciA9ICc6JzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQmFja3NsYXNoID0gJ1xcJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OU3RyaW5nRGVsaW1pdGVyID0gJyInOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05aZXJvQ2hhciA9ICcwJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORXNjYXBlQ2hhciA9ICd1JzsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtKU09ORXNjYXBlUHJlZml4KCJcXHUwMCIpOwpAQCAtNjMsNyArNzEsNyBAQAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZUxpc3QoImxzdCIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtUeXBlTmFtZVNldCgic2V0Iik7CiAKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VHlwZU5hbWVGb3JUeXBlSUQoVFR5cGUgdHlwZUlEKSB7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkgewogICBzd2l0Y2ggKHR5cGVJRCkgewogICBjYXNlIFRfQk9PTDoKICAgICByZXR1cm4ga1R5cGVOYW1lQm9vbDsKQEAgLTg4LDEyICs5NiwxMSBAQAogICBjYXNlIFRfTElTVDoKICAgICByZXR1cm4ga1R5cGVOYW1lTGlzdDsKICAgZGVmYXVsdDoKLSAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CiAgIH0KIH0KIAotc3RhdGljIFRUeXBlIGdldFR5cGVJREZvclR5cGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CitzdGF0aWMgVFR5cGUgZ2V0VHlwZUlERm9yVHlwZU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKICAgVFR5cGUgcmVzdWx0ID0gVF9TVE9QOyAvLyBTZW50aW5lbCB2YWx1ZQogICBpZiAobmFtZS5sZW5ndGgoKSA+IDEpIHsKICAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKQEAgLTEyOCw4ICsxMzUsNyBAQAogICAgIGNhc2UgJ3MnOgogICAgICAgaWYgKG5hbWVbMV0gPT0gJ3QnKSB7CiAgICAgICAgIHJlc3VsdCA9IFRfU1RSSU5HOwotICAgICAgfQotICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKKyAgICAgIH0gZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKICAgICAgICAgcmVzdWx0ID0gVF9TRVQ7CiAgICAgICB9CiAgICAgICBicmVhazsKQEAgLTEzOSwyNSArMTQ1LDY3IEBACiAgICAgfQogICB9CiAgIGlmIChyZXN1bHQgPT0gVF9TVE9QKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLQogLy8gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGhhbmRsaW5nIGZvciB0aGUgZmlyc3QgMHgzMCBjaGFyYWN0ZXJzCiAvLyAgMCA6IGVzY2FwZSB1c2luZyAiXHUwMHh4IiBub3RhdGlvbgogLy8gIDEgOiBqdXN0IG91dHB1dCBpbmRleAogLy8gPG90aGVyPiA6IGVzY2FwZSB1c2luZyAiXDxvdGhlcj4iIG5vdGF0aW9uCiBzdGF0aWMgY29uc3QgdWludDhfdCBrSlNPTkNoYXJUYWJsZVsweDMwXSA9IHsKLS8vICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGCi0gICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsJ2InLCd0JywnbicsICAwLCdmJywncicsICAwLCAgMCwgLy8gMAotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8vIDEKLSAgICAxLCAgMSwnIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAvLyAyCisgICAgLy8gIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgJ2InLAorICAgICd0JywKKyAgICAnbicsCisgICAgMCwKKyAgICAnZicsCisgICAgJ3InLAorICAgIDAsCisgICAgMCwgLy8gMAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsCisgICAgMCwKKyAgICAwLAorICAgIDAsIC8vIDEKKyAgICAxLAorICAgIDEsCisgICAgJyInLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsCisgICAgMSwKKyAgICAxLAorICAgIDEsIC8vIDIKIH07CiAKLQogLy8gVGhpcyBzdHJpbmcncyBjaGFyYWN0ZXJzIG11c3QgbWF0Y2ggdXAgd2l0aCB0aGUgZWxlbWVudHMgaW4ga0VzY2FwZUNoYXJWYWxzLgogLy8gSSBkb24ndCBoYXZlICcvJyBvbiB0aGlzIGxpc3QgZXZlbiB0aG91Z2ggaXQgYXBwZWFycyBvbiB3d3cuanNvbi5vcmcgLS0KIC8vIGl0IGlzIG5vdCBpbiB0aGUgUkZDCkBAIC0xNjYsMjMgKzIxNCwyNiBAQAogLy8gVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCiAvLyBrRXNjYXBlQ2hhcnMKIGNvbnN0IHN0YXRpYyB1aW50OF90IGtFc2NhcGVDaGFyVmFsc1s3XSA9IHsKLSAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAorICAgICciJywKKyAgICAnXFwnLAorICAgICdcYicsCisgICAgJ1xmJywKKyAgICAnXG4nLAorICAgICdccicsCisgICAgJ1x0JywKIH07CiAKLQogLy8gU3RhdGljIGhlbHBlciBmdW5jdGlvbnMKIAogLy8gUmVhZCAxIGNoYXJhY3RlciBmcm9tIHRoZSB0cmFuc3BvcnQgdHJhbnMgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIHRoZQogLy8gZXhwZWN0ZWQgY2hhcmFjdGVyIGNoLgogLy8gVGhyb3cgYSBwcm90b2NvbCBleGNlcHRpb24gaWYgaXQgaXMgbm90Lgotc3RhdGljIHVpbnQzMl90IHJlYWRTeW50YXhDaGFyKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2gpIHsKK3N0YXRpYyB1aW50MzJfdCByZWFkU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpMb29rYWhlYWRSZWFkZXImIHJlYWRlciwgdWludDhfdCBjaCkgewogICB1aW50OF90IGNoMiA9IHJlYWRlci5yZWFkKCk7CiAgIGlmIChjaDIgIT0gY2gpIHsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaCwgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCc7IGdvdCBcJyIgKyBzdGQ6OnN0cmluZygoY2hhciAqKSZjaDIsIDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgXCciICsgc3RkOjpzdHJpbmcoKGNoYXIqKSZjaCwgMSkgKyAiXCc7IGdvdCBcJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdGQ6OnN0cmluZygoY2hhciopJmNoMiwgMSkgKyAiXCcuIik7CiAgIH0KICAgcmV0dXJuIDE7CiB9CkBAIC0xOTIsMTQgKzI0MywxMiBAQAogc3RhdGljIHVpbnQ4X3QgaGV4VmFsKHVpbnQ4X3QgY2gpIHsKICAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7CiAgICAgcmV0dXJuIGNoIC0gJzAnOwotICB9Ci0gIGVsc2UgaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKSB7CisgIH0gZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKICAgICByZXR1cm4gY2ggLSAnYScgKyAxMDsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBoZXggdmFsIChbMC05YS1mXSk7IGdvdCBcJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0ZDo6c3RyaW5nKChjaGFyICopJmNoLCAxKSArICJcJy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhleCB2YWwgKFswLTlhLWZdKTsgZ290IFwnIiArIHN0ZDo6c3RyaW5nKChjaGFyKikmY2gsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwnLiIpOwogICB9CiB9CiAKQEAgLTIwOSw4ICsyNTgsNyBAQAogICB2YWwgJj0gMHgwRjsKICAgaWYgKHZhbCA8IDEwKSB7CiAgICAgcmV0dXJuIHZhbCArICcwJzsKLSAgfQotICBlbHNlIHsKKyAgfSBlbHNlIHsKICAgICByZXR1cm4gdmFsIC0gMTAgKyAnYSc7CiAgIH0KIH0KQEAgLTIzOCw2ICsyODYsMTUgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29kZSB1bml0IGlzIGhpZ2ggc3Vycm9nYXRlCitzdGF0aWMgYm9vbCBpc0hpZ2hTdXJyb2dhdGUodWludDE2X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPj0gMHhEODAwICYmIHZhbCA8PSAweERCRkY7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb2RlIHVuaXQgaXMgbG93IHN1cnJvZ2F0ZQorc3RhdGljIGJvb2wgaXNMb3dTdXJyb2dhdGUodWludDE2X3QgdmFsKSB7CisgIHJldHVybiB2YWwgPj0gMHhEQzAwICYmIHZhbCA8PSAweERGRkY7Cit9CiAKIC8qKgogICogQ2xhc3MgdG8gc2VydmUgYXMgYmFzZSBKU09OIGNvbnRleHQgYW5kIGFzIGJhc2UgY2xhc3MgZm9yIG90aGVyIGNvbnRleHQKQEAgLTI0NSwyNSArMzAyLDI0IEBACiAgKi8KIGNsYXNzIFRKU09OQ29udGV4dCB7CiAKLSBwdWJsaWM6CitwdWJsaWM6CisgIFRKU09OQ29udGV4dCgpe307CiAKLSAgVEpTT05Db250ZXh0KCkge307Ci0KLSAgdmlydHVhbCB+VEpTT05Db250ZXh0KCkge307CisgIHZpcnR1YWwgflRKU09OQ29udGV4dCgpe307CiAKICAgLyoqCiAgICAqIFdyaXRlIGNvbnRleHQgZGF0YSB0byB0aGUgdHJhbnNwb3J0LiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCiAgICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQgJnRyYW5zKSB7Ci0gICAgKHZvaWQpIHRyYW5zOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlKFRUcmFuc3BvcnQmIHRyYW5zKSB7CisgICAgKHZvaWQpdHJhbnM7CiAgICAgcmV0dXJuIDA7CiAgIH07CiAKICAgLyoqCiAgICAqIFJlYWQgY29udGV4dCBkYXRhIGZyb20gdGhlIHRyYW5zcG9ydC4gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgogICAgKi8KLSAgdmlydHVhbCB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7Ci0gICAgKHZvaWQpIHJlYWRlcjsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciYgcmVhZGVyKSB7CisgICAgKHZvaWQpcmVhZGVyOwogICAgIHJldHVybiAwOwogICB9OwogCkBAIC0yNzEsNDEgKzMyNywzMyBAQAogICAgKiBSZXR1cm4gdHJ1ZSBpZiBudW1iZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyBzdHJpbmdzIGluIHRoaXMgY29udGV4dC4KICAgICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byByZXR1cm4gZmFsc2UuCiAgICAqLwotICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQorICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgeyByZXR1cm4gZmFsc2U7IH0KIH07CiAKIC8vIENvbnRleHQgY2xhc3MgZm9yIG9iamVjdCBtZW1iZXIga2V5LXZhbHVlIHBhaXJzCiBjbGFzcyBKU09OUGFpckNvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKIAogcHVibGljOgorICBKU09OUGFpckNvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSwgY29sb25fKHRydWUpIHt9CiAKLSAgSlNPTlBhaXJDb250ZXh0KCkgOgotICAgIGZpcnN0Xyh0cnVlKSwKLSAgICBjb2xvbl8odHJ1ZSkgewotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCAmdHJhbnMpIHsKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKICAgICBpZiAoZmlyc3RfKSB7CiAgICAgICBmaXJzdF8gPSBmYWxzZTsKICAgICAgIGNvbG9uXyA9IHRydWU7CiAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHRyYW5zLndyaXRlKGNvbG9uXyA/ICZrSlNPTlBhaXJTZXBhcmF0b3IgOiAma0pTT05FbGVtU2VwYXJhdG9yLCAxKTsKICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CiAgICAgICByZXR1cm4gMTsKICAgICB9CiAgIH0KIAotICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7CisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKICAgICBpZiAoZmlyc3RfKSB7CiAgICAgICBmaXJzdF8gPSBmYWxzZTsKICAgICAgIGNvbG9uXyA9IHRydWU7CiAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHVpbnQ4X3QgY2ggPSAoY29sb25fID8ga0pTT05QYWlyU2VwYXJhdG9yIDoga0pTT05FbGVtU2VwYXJhdG9yKTsKICAgICAgIGNvbG9uXyA9ICFjb2xvbl87CiAgICAgICByZXR1cm4gcmVhZFN5bnRheENoYXIocmVhZGVyLCBjaCk7CkBAIC0zMTMsNjEgKzM2MSw1MyBAQAogICB9CiAKICAgLy8gTnVtYmVycyBtdXN0IGJlIHR1cm5lZCBpbnRvIHN0cmluZ3MgaWYgdGhleSBhcmUgdGhlIGtleSBwYXJ0IG9mIGEgcGFpcgotICB2aXJ0dWFsIGJvb2wgZXNjYXBlTnVtKCkgewotICAgIHJldHVybiBjb2xvbl87Ci0gIH0KKyAgdmlydHVhbCBib29sIGVzY2FwZU51bSgpIHsgcmV0dXJuIGNvbG9uXzsgfQogCi0gIHByaXZhdGU6Ci0KLSAgICBib29sIGZpcnN0XzsKLSAgICBib29sIGNvbG9uXzsKK3ByaXZhdGU6CisgIGJvb2wgZmlyc3RfOworICBib29sIGNvbG9uXzsKIH07CiAKIC8vIENvbnRleHQgY2xhc3MgZm9yIGxpc3RzCiBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBwdWJsaWMgVEpTT05Db250ZXh0IHsKIAogcHVibGljOgorICBKU09OTGlzdENvbnRleHQoKSA6IGZpcnN0Xyh0cnVlKSB7fQogCi0gIEpTT05MaXN0Q29udGV4dCgpIDoKLSAgICBmaXJzdF8odHJ1ZSkgewotICB9Ci0KLSAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCAmdHJhbnMpIHsKKyAgdWludDMyX3Qgd3JpdGUoVFRyYW5zcG9ydCYgdHJhbnMpIHsKICAgICBpZiAoZmlyc3RfKSB7CiAgICAgICBmaXJzdF8gPSBmYWxzZTsKICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgdHJhbnMud3JpdGUoJmtKU09ORWxlbVNlcGFyYXRvciwgMSk7CiAgICAgICByZXR1cm4gMTsKICAgICB9CiAgIH0KIAotICB1aW50MzJfdCByZWFkKFRKU09OUHJvdG9jb2w6Okxvb2thaGVhZFJlYWRlciAmcmVhZGVyKSB7CisgIHVpbnQzMl90IHJlYWQoVEpTT05Qcm90b2NvbDo6TG9va2FoZWFkUmVhZGVyJiByZWFkZXIpIHsKICAgICBpZiAoZmlyc3RfKSB7CiAgICAgICBmaXJzdF8gPSBmYWxzZTsKICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlciwga0pTT05FbGVtU2VwYXJhdG9yKTsKICAgICB9CiAgIH0KIAotICBwcml2YXRlOgotICAgIGJvb2wgZmlyc3RfOworcHJpdmF0ZToKKyAgYm9vbCBmaXJzdF87CiB9OwogCi0KLVRKU09OUHJvdG9jb2w6OlRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6Ci0gIFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4ocHRyYW5zKSwKLSAgdHJhbnNfKHB0cmFucy5nZXQoKSksCi0gIGNvbnRleHRfKG5ldyBUSlNPTkNvbnRleHQoKSksCi0gIHJlYWRlcl8oKnB0cmFucykgeworVEpTT05Qcm90b2NvbDo6VEpTT05Qcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQorICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEpTT05Qcm90b2NvbD4ocHRyYW5zKSwKKyAgICB0cmFuc18ocHRyYW5zLmdldCgpKSwKKyAgICBjb250ZXh0XyhuZXcgVEpTT05Db250ZXh0KCkpLAorICAgIHJlYWRlcl8oKnB0cmFucykgewogfQogCi1USlNPTlByb3RvY29sOjp+VEpTT05Qcm90b2NvbCgpIHt9CitUSlNPTlByb3RvY29sOjp+VEpTT05Qcm90b2NvbCgpIHsKK30KIAotdm9pZCBUSlNPTlByb3RvY29sOjpwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGMpIHsKK3ZvaWQgVEpTT05Qcm90b2NvbDo6cHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgewogICBjb250ZXh0c18ucHVzaChjb250ZXh0Xyk7CiAgIGNvbnRleHRfID0gYzsKIH0KQEAgLTM3OSw3ICs0MTksNyBAQAogCiAvLyBXcml0ZSB0aGUgY2hhcmFjdGVyIGNoIGFzIGEgSlNPTiBlc2NhcGUgc2VxdWVuY2UgKCJcdTAweHgiKQogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09ORXNjYXBlQ2hhcih1aW50OF90IGNoKSB7Ci0gIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QgKilrSlNPTkVzY2FwZVByZWZpeC5jX3N0cigpLAorICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90KilrSlNPTkVzY2FwZVByZWZpeC5jX3N0cigpLAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihrSlNPTkVzY2FwZVByZWZpeC5sZW5ndGgoKSkpOwogICB1aW50OF90IG91dENoID0gaGV4Q2hhcihjaCA+PiA0KTsKICAgdHJhbnNfLT53cml0ZSgmb3V0Q2gsIDEpOwpAQCAtMzk1LDI1ICs0MzUsMjEgQEAKICAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKICAgICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OQmFja3NsYXNoLCAxKTsKICAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBlbHNlIHsKKyAgICB9IGVsc2UgewogICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOwogICAgICAgcmV0dXJuIDE7CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIHVpbnQ4X3Qgb3V0Q2ggPSBrSlNPTkNoYXJUYWJsZVtjaF07CiAgICAgLy8gQ2hlY2sgaWYgcmVndWxhciBjaGFyYWN0ZXIsIGJhY2tzbGFzaCBlc2NhcGVkLCBvciBKU09OIGVzY2FwZWQKICAgICBpZiAob3V0Q2ggPT0gMSkgewogICAgICAgdHJhbnNfLT53cml0ZSgmY2gsIDEpOwogICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGVsc2UgaWYgKG91dENoID4gMSkgeworICAgIH0gZWxzZSBpZiAob3V0Q2ggPiAxKSB7CiAgICAgICB0cmFuc18tPndyaXRlKCZrSlNPTkJhY2tzbGFzaCwgMSk7CiAgICAgICB0cmFuc18tPndyaXRlKCZvdXRDaCwgMSk7CiAgICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgZWxzZSB7CisgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiB3cml0ZUpTT05Fc2NhcGVDaGFyKGNoKTsKICAgICB9CiAgIH0KQEAgLTQyMSw3ICs0NTcsNyBAQAogCiAvLyBXcml0ZSBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgc3RyIGFzIGEgSlNPTiBzdHJpbmcsIGVzY2FwaW5nCiAvLyBjaGFyYWN0ZXJzIGFzIGFwcHJvcHJpYXRlLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKICAgcmVzdWx0ICs9IDI7IC8vIEZvciBxdW90ZXMKICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwpAQCAtNDM2LDEzICs0NzIsMTMgQEAKIAogLy8gV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGFzIEpTT04gc3RyaW5nLCBiYXNlNjQtZW5jb2RpbmcKIC8vIHRoZSBzdHJpbmcncyBjb250ZW50cywgYW5kIGVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cikgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVKU09OQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwogICByZXN1bHQgKz0gMjsgLy8gRm9yIHF1b3RlcwogICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CiAgIHVpbnQ4X3QgYls0XTsKLSAgY29uc3QgdWludDhfdCAqYnl0ZXMgPSAoY29uc3QgdWludDhfdCAqKXN0ci5jX3N0cigpOwotICBpZihzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgY29uc3QgdWludDhfdCogYnl0ZXMgPSAoY29uc3QgdWludDhfdCopc3RyLmNfc3RyKCk7CisgIGlmIChzdHIubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKICAgdWludDMyX3QgbGVuID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ci5sZW5ndGgoKSk7CiAgIHdoaWxlIChsZW4gPj0gMykgewpAQCAtNDUxLDcgKzQ4Nyw3IEBACiAgICAgdHJhbnNfLT53cml0ZShiLCA0KTsKICAgICByZXN1bHQgKz0gNDsKICAgICBieXRlcyArPSAzOwotICAgIGxlbiAtPTM7CisgICAgbGVuIC09IDM7CiAgIH0KICAgaWYgKGxlbikgeyAvLyBIYW5kbGUgcmVtYWluZGVyCiAgICAgYmFzZTY0X2VuY29kZShieXRlcywgbGVuLCBiKTsKQEAgLTQ2NywxNSArNTAzLDE1IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7CisgIHN0ZDo6c3RyaW5nIHZhbCh0b19zdHJpbmcobnVtKSk7CiAgIGJvb2wgZXNjYXBlTnVtID0gY29udGV4dF8tPmVzY2FwZU51bSgpOwogICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwogICAgIHJlc3VsdCArPSAxOwogICB9Ci0gIGlmKHZhbC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICBpZiAodmFsLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7Ci0gIHRyYW5zXy0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QgKil2YWwuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSkpOworICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90Kil2YWwuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSkpOwogICByZXN1bHQgKz0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbC5sZW5ndGgoKSk7CiAgIGlmIChlc2NhcGVOdW0pIHsKICAgICB0cmFuc18tPndyaXRlKCZrSlNPTlN0cmluZ0RlbGltaXRlciwgMSk7CkBAIC00ODQsMzAgKzUyMCwzOSBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCituYW1lc3BhY2Ugeworc3RkOjpzdHJpbmcgZG91YmxlVG9TdHJpbmcoZG91YmxlIGQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cjsKKyAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICBjb25zdCBzdGQ6OnN0cmVhbXNpemUgbWF4X2RpZ2l0czEwID0gMiArIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTA7CisgIHN0ci5wcmVjaXNpb24obWF4X2RpZ2l0czEwKTsKKyAgc3RyIDw8IGQ7CisgIHJldHVybiBzdHIuc3RyKCk7Cit9Cit9CisKIC8vIENvbnZlcnQgdGhlIGdpdmVuIGRvdWJsZSB0byBhIEpTT04gc3RyaW5nLCB3aGljaCBpcyBlaXRoZXIgdGhlIG51bWJlciwKIC8vICJOYU4iIG9yICJJbmZpbml0eSIgb3IgIi1JbmZpbml0eSIuCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+d3JpdGUoKnRyYW5zXyk7Ci0gIHN0ZDo6c3RyaW5nIHZhbChib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihudW0pKTsKKyAgc3RkOjpzdHJpbmcgdmFsOwogCi0gIC8vIE5vcm1hbGl6ZSBvdXRwdXQgb2YgYm9vc3Q6OmxleGljYWxfY2FzdCBmb3IgTmFOcyBhbmQgSW5maW5pdGllcwogICBib29sIHNwZWNpYWwgPSBmYWxzZTsKLSAgc3dpdGNoICh2YWxbMF0pIHsKLSAgY2FzZSAnTic6Ci0gIGNhc2UgJ24nOgorICBzd2l0Y2ggKGJvb3N0OjptYXRoOjpmcGNsYXNzaWZ5KG51bSkpIHsKKyAgY2FzZSBGUF9JTkZJTklURToKKyAgICBpZiAoYm9vc3Q6Om1hdGg6OnNpZ25iaXQobnVtKSkgeworICAgICAgdmFsID0ga1RocmlmdE5lZ2F0aXZlSW5maW5pdHk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhbCA9IGtUaHJpZnRJbmZpbml0eTsKKyAgICB9CisgICAgc3BlY2lhbCA9IHRydWU7CisgICAgYnJlYWs7CisgIGNhc2UgRlBfTkFOOgogICAgIHZhbCA9IGtUaHJpZnROYW47CiAgICAgc3BlY2lhbCA9IHRydWU7CiAgICAgYnJlYWs7Ci0gIGNhc2UgJ0knOgotICBjYXNlICdpJzoKLSAgICB2YWwgPSBrVGhyaWZ0SW5maW5pdHk7Ci0gICAgc3BlY2lhbCA9IHRydWU7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgJy0nOgotICAgIGlmICgodmFsWzFdID09ICdJJykgfHwgKHZhbFsxXSA9PSAnaScpKSB7Ci0gICAgICB2YWwgPSBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eTsKLSAgICAgIHNwZWNpYWwgPSB0cnVlOwotICAgIH0KKyAgZGVmYXVsdDoKKyAgICB2YWwgPSBkb3VibGVUb1N0cmluZyhudW0pOwogICAgIGJyZWFrOwogICB9CiAKQEAgLTUxNiw5ICs1NjEsOSBAQAogICAgIHRyYW5zXy0+d3JpdGUoJmtKU09OU3RyaW5nRGVsaW1pdGVyLCAxKTsKICAgICByZXN1bHQgKz0gMTsKICAgfQotICBpZih2YWwubGVuZ3RoKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHZhbC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwotICB0cmFuc18tPndyaXRlKChjb25zdCB1aW50OF90ICopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKKyAgdHJhbnNfLT53cml0ZSgoY29uc3QgdWludDhfdCopdmFsLmNfc3RyKCksIHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpKTsKICAgcmVzdWx0ICs9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwubGVuZ3RoKCkpOwogICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwpAQCAtNTMwLDcgKzU3NSw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RTdGFydCgpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwogICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdFN0YXJ0LCAxKTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQgKyAxOwogfQogCkBAIC01NDMsNyArNTg4LDcgQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkFycmF5U3RhcnQoKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKICAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheVN0YXJ0LCAxKTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQgKyAxOwogfQogCkBAIC01NjksNyArNjE0LDcgQEAKIH0KIAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7Ci0gICh2b2lkKSBuYW1lOworICAodm9pZCluYW1lOwogICByZXR1cm4gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKIH0KIApAQCAtNTgwLDcgKzYyNSw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7Ci0gICh2b2lkKSBuYW1lOworICAodm9pZCluYW1lOwogICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkSWQpOwogICByZXN1bHQgKz0gd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKICAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZFR5cGUpKTsKQEAgLTYwNywxMSArNjUyLDEyIEBACiB9CiAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTWFwRW5kKCkgewotICByZXR1cm4gd3JpdGVKU09OT2JqZWN0RW5kKCkgKyB3cml0ZUpTT05BcnJheUVuZCgpOworICB1aW50MzJfdCByZXN1bHQgPSB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgcmVzdWx0ICs9IHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlTGlzdEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gd3JpdGVKU09OQXJyYXlTdGFydCgpOwogICByZXN1bHQgKz0gd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGVsZW1UeXBlKSk7CiAgIHJlc3VsdCArPSB3cml0ZUpTT05JbnRlZ2VyKChpbnQ2NF90KXNpemUpOwpAQCAtNjIyLDggKzY2OCw3IEBACiAgIHJldHVybiB3cml0ZUpTT05BcnJheUVuZCgpOwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKICAgcmVzdWx0ICs9IHdyaXRlSlNPTlN0cmluZyhnZXRUeXBlTmFtZUZvclR5cGVJRChlbGVtVHlwZSkpOwogICByZXN1bHQgKz0gd3JpdGVKU09OSW50ZWdlcigoaW50NjRfdClzaXplKTsKQEAgLTYzOSw3ICs2ODQsNyBAQAogfQogCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUJ5dGUoY29uc3QgaW50OF90IGJ5dGUpIHsKLSAgLy8gd3JpdGVCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWN1YXNlIGJvb3N0OjpsZXhpY2FsIGNhc3Qgc2VlcworICAvLyB3cml0ZUJ5dGUoKSBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5IGJlY2F1c2UgdG9fc3RyaW5nIHNlZXMKICAgLy8gaW50OF90IGFzIGEgdGV4dCB0eXBlIGluc3RlYWQgb2YgYW4gaW50ZWdlciB0eXBlCiAgIHJldHVybiB3cml0ZUpTT05JbnRlZ2VyKChpbnQxNl90KWJ5dGUpOwogfQpAQCAtNjY4LDkgKzcxMyw5IEBACiAgIHJldHVybiB3cml0ZUpTT05CYXNlNjQoc3RyKTsKIH0KIAotICAvKioKLSAgICogUmVhZGluZyBmdW5jdGlvbnMKLSAgICovCisvKioKKyAqIFJlYWRpbmcgZnVuY3Rpb25zCisgKi8KIAogLy8gUmVhZHMgMSBieXRlIGFuZCB2ZXJpZmllcyB0aGF0IGl0IG1hdGNoZXMgY2guCiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTlN5bnRheENoYXIodWludDhfdCBjaCkgewpAQCAtNjc4LDIxICs3MjMsMjUgQEAKIH0KIAogLy8gRGVjb2RlcyB0aGUgZm91ciBoZXggcGFydHMgb2YgYSBKU09OIGVzY2FwZWQgc3RyaW5nIGNoYXJhY3RlciBhbmQgcmV0dXJucwotLy8gdGhlIGNoYXJhY3RlciB2aWEgb3V0LiBUaGUgZmlyc3QgdHdvIGNoYXJhY3RlcnMgbXVzdCBiZSAiMDAiLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQ4X3QgKm91dCkgewotICB1aW50OF90IGJbMl07Ci0gIHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlplcm9DaGFyKTsKLSAgcmVhZEpTT05TeW50YXhDaGFyKGtKU09OWmVyb0NoYXIpOworLy8gdGhlIFVURi0xNiBjb2RlIHVuaXQgdmlhIG91dC4KK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09ORXNjYXBlQ2hhcih1aW50MTZfdCogb3V0KSB7CisgIHVpbnQ4X3QgYls0XTsKICAgYlswXSA9IHJlYWRlcl8ucmVhZCgpOwogICBiWzFdID0gcmVhZGVyXy5yZWFkKCk7Ci0gICpvdXQgPSAoaGV4VmFsKGJbMF0pIDw8IDQpICsgaGV4VmFsKGJbMV0pOworICBiWzJdID0gcmVhZGVyXy5yZWFkKCk7CisgIGJbM10gPSByZWFkZXJfLnJlYWQoKTsKKworICAqb3V0ID0gKGhleFZhbChiWzBdKSA8PCAxMikKKyAgICArIChoZXhWYWwoYlsxXSkgPDwgOCkgKyAoaGV4VmFsKGJbMl0pIDw8IDQpICsgaGV4VmFsKGJbM10pOworCiAgIHJldHVybiA0OwogfQogCiAvLyBEZWNvZGVzIGEgSlNPTiBzdHJpbmcsIGluY2x1ZGluZyB1bmVzY2FwaW5nLCBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZpYSBzdHIKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nICZzdHIsIGJvb2wgc2tpcENvbnRleHQpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgc2tpcENvbnRleHQpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gKHNraXBDb250ZXh0ID8gMCA6IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTlN0cmluZ0RlbGltaXRlcik7CisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjb2RldW5pdHM7CiAgIHVpbnQ4X3QgY2g7CiAgIHN0ci5jbGVhcigpOwogICB3aGlsZSAodHJ1ZSkgewpAQCAtNzA1LDM1ICs3NTQsNjUgQEAKICAgICAgIGNoID0gcmVhZGVyXy5yZWFkKCk7CiAgICAgICArK3Jlc3VsdDsKICAgICAgIGlmIChjaCA9PSBrSlNPTkVzY2FwZUNoYXIpIHsKLSAgICAgICAgcmVzdWx0ICs9IHJlYWRKU09ORXNjYXBlQ2hhcigmY2gpOwotICAgICAgfQotICAgICAgZWxzZSB7CisgICAgICAgIHVpbnQxNl90IGNwOworICAgICAgICByZXN1bHQgKz0gcmVhZEpTT05Fc2NhcGVDaGFyKCZjcCk7CisgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoY3ApKSB7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKGNwKQorICAgICAgICAgICAgICAgJiYgY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUgcGFpci4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjayhjcCk7CisgICAgICAgICAgY29kZXVuaXRzLnB1c2hfYmFjaygwKTsKKyAgICAgICAgICBzdHIgKz0gYm9vc3Q6OmxvY2FsZTo6Y29udjo6dXRmX3RvX3V0ZjxjaGFyPihjb2RldW5pdHMuZGF0YSgpKTsKKyAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7Ci0gICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKHBvcyA9PSBrRXNjYXBlQ2hhcnMubnBvcykgewogICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIgKikmY2gsIDEpICArICInLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY29udHJvbCBjaGFyLCBnb3QgJyIgKyBzdGQ6OnN0cmluZygoY29uc3QgY2hhciopJmNoLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInLiIpOwogICAgICAgICB9CiAgICAgICAgIGNoID0ga0VzY2FwZUNoYXJWYWxzW3Bvc107CiAgICAgICB9CiAgICAgfQorICAgIGlmICghY29kZXVuaXRzLmVtcHR5KCkpIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZSBwYWlyLiIpOworICAgIH0KICAgICBzdHIgKz0gY2g7CiAgIH0KKworICBpZiAoIWNvZGV1bml0cy5lbXB0eSgpKSB7CisgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBVVEYtMTYgbG93IHN1cnJvZ2F0ZSBwYWlyLiIpOworICB9CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8vIFJlYWRzIGEgYmxvY2sgb2YgYmFzZTY0IGNoYXJhY3RlcnMsIGRlY29kaW5nIGl0LCBhbmQgcmV0dXJucyB2aWEgc3RyCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyAmc3RyKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkJhc2U2NChzdGQ6OnN0cmluZyYgc3RyKSB7CiAgIHN0ZDo6c3RyaW5nIHRtcDsKICAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05TdHJpbmcodG1wKTsKLSAgdWludDhfdCAqYiA9ICh1aW50OF90ICopdG1wLmNfc3RyKCk7Ci0gIGlmKHRtcC5sZW5ndGgoKSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICB1aW50OF90KiBiID0gKHVpbnQ4X3QqKXRtcC5jX3N0cigpOworICBpZiAodG1wLmxlbmd0aCgpID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVCk7CiAgIHVpbnQzMl90IGxlbiA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXAubGVuZ3RoKCkpOwogICBzdHIuY2xlYXIoKTsKKyAgLy8gSWdub3JlIHBhZGRpbmcKKyAgaWYgKGxlbiA+PSAyKSAgeworICAgIHVpbnQzMl90IGJvdW5kID0gbGVuIC0gMjsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KKyAgfQogICB3aGlsZSAobGVuID49IDQpIHsKICAgICBiYXNlNjRfZGVjb2RlKGIsIDQpOwotICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIgKiliLCAzKTsKKyAgICBzdHIuYXBwZW5kKChjb25zdCBjaGFyKiliLCAzKTsKICAgICBiICs9IDQ7CiAgICAgbGVuIC09IDQ7CiAgIH0KQEAgLTc0MSwxNCArODIwLDE0IEBACiAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKICAgaWYgKGxlbiA+IDEpIHsKICAgICBiYXNlNjRfZGVjb2RlKGIsIGxlbik7Ci0gICAgc3RyLmFwcGVuZCgoY29uc3QgY2hhciAqKWIsIGxlbiAtIDEpOworICAgIHN0ci5hcHBlbmQoKGNvbnN0IGNoYXIqKWIsIGxlbiAtIDEpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycywgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IG9uZSB0aGF0IGlzIG5vdAogLy8gYSB2YWxpZCBKU09OIG51bWVyaWMgY2hhcmFjdGVyLgotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05OdW1lcmljQ2hhcnMoc3RkOjpzdHJpbmcgJnN0cikgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05OdW1lcmljQ2hhcnMoc3RkOjpzdHJpbmcmIHN0cikgewogICB1aW50MzJfdCByZXN1bHQgPSAwOwogICBzdHIuY2xlYXIoKTsKICAgd2hpbGUgKHRydWUpIHsKQEAgLTc2MywxMCArODQyLDIzIEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKK25hbWVzcGFjZSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1QgZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICBUIHQ7CisgIHN0ZDo6aXN0cmluZ3N0cmVhbSBzdHIocyk7CisgIHN0ci5pbWJ1ZShzdGQ6OmxvY2FsZTo6Y2xhc3NpYygpKTsKKyAgc3RyID4+IHQ7CisgIGlmIChzdHIuYmFkKCkgfHwgIXN0ci5lb2YoKSkKKyAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Iocyk7CisgIHJldHVybiB0OworfQorfQorCiAvLyBSZWFkcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYW5kIGFzc2VtYmxlcyB0aGVtIGludG8gYSBudW1iZXIsCiAvLyByZXR1cm5pbmcgdGhlbSB2aWEgbnVtCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OSW50ZWdlcihOdW1iZXJUeXBlICZudW0pIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OSW50ZWdlcihOdW1iZXJUeXBlJiBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CiAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKICAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKQEAgLTc3NCwxMiArODY2LDEwIEBACiAgIHN0ZDo6c3RyaW5nIHN0cjsKICAgcmVzdWx0ICs9IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0cik7CiAgIHRyeSB7Ci0gICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxOdW1iZXJUeXBlPihzdHIpOwotICB9Ci0gIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKKyAgICBudW0gPSBmcm9tU3RyaW5nPE51bWJlclR5cGU+KHN0cik7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYpIHsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CiAgIH0KICAgaWYgKGNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewogICAgIHJlc3VsdCArPSByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwpAQCAtNzg4LDUwICs4NzgsNDIgQEAKIH0KIAogLy8gUmVhZHMgYSBKU09OIG51bWJlciBvciBzdHJpbmcgYW5kIGludGVycHJldHMgaXQgYXMgYSBkb3VibGUuCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkRvdWJsZShkb3VibGUgJm51bSkgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CiAgIHN0ZDo6c3RyaW5nIHN0cjsKICAgaWYgKHJlYWRlcl8ucGVlaygpID09IGtKU09OU3RyaW5nRGVsaW1pdGVyKSB7CiAgICAgcmVzdWx0ICs9IHJlYWRKU09OU3RyaW5nKHN0ciwgdHJ1ZSk7CiAgICAgLy8gQ2hlY2sgZm9yIE5hTiwgSW5maW5pdHkgYW5kIC1JbmZpbml0eQogICAgIGlmIChzdHIgPT0ga1RocmlmdE5hbikgewotICAgICAgbnVtID0gSFVHRV9WQUwvSFVHRV9WQUw7IC8vIGdlbmVyYXRlcyBOYU4KLSAgICB9Ci0gICAgZWxzZSBpZiAoc3RyID09IGtUaHJpZnRJbmZpbml0eSkgeworICAgICAgbnVtID0gSFVHRV9WQUwgLyBIVUdFX1ZBTDsgLy8gZ2VuZXJhdGVzIE5hTgorICAgIH0gZWxzZSBpZiAoc3RyID09IGtUaHJpZnRJbmZpbml0eSkgewogICAgICAgbnVtID0gSFVHRV9WQUw7Ci0gICAgfQotICAgIGVsc2UgaWYgKHN0ciA9PSBrVGhyaWZ0TmVnYXRpdmVJbmZpbml0eSkgeworICAgIH0gZWxzZSBpZiAoc3RyID09IGtUaHJpZnROZWdhdGl2ZUluZmluaXR5KSB7CiAgICAgICBudW0gPSAtSFVHRV9WQUw7Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSB7CiAgICAgICBpZiAoIWNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewogICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOwogICAgICAgfQogICAgICAgdHJ5IHsKLSAgICAgICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxkb3VibGU+KHN0cik7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoYm9vc3Q6OmJhZF9sZXhpY2FsX2Nhc3QgZSkgewotICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiKTsKKyAgICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3ImIGUpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CiAgICAgICB9CiAgICAgfQotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCiAgICAgICByZWFkSlNPTlN5bnRheENoYXIoa0pTT05TdHJpbmdEZWxpbWl0ZXIpOwogICAgIH0KICAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKICAgICB0cnkgewotICAgICAgbnVtID0gYm9vc3Q6OmxleGljYWxfY2FzdDxkb3VibGU+KHN0cik7Ci0gICAgfQotICAgIGNhdGNoIChib29zdDo6YmFkX2xleGljYWxfY2FzdCBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIpOworICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CiAgICAgfQogICB9CiAgIHJldHVybiByZXN1bHQ7CkBAIC04NDAsNyArOTIyLDcgQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRKU09OT2JqZWN0U3RhcnQoKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwogICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OT2JqZWN0U3RhcnQpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OUGFpckNvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtODUzLDcgKzkzNSw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTkFycmF5U3RhcnQoKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT5yZWFkKHJlYWRlcl8pOwogICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OQXJyYXlTdGFydCk7Ci0gIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CisgIHB1c2hDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOwogICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC04NzAsMTQgKzk1MiwxMyBAQAogICB1aW50NjRfdCB0bXBWYWwgPSAwOwogICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7CiAgIGlmICh0bXBWYWwgIT0ga1RocmlmdFZlcnNpb24xKSB7Ci0gICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTiwgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwogICB9CiAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyhuYW1lKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwogICBtZXNzYWdlVHlwZSA9IChUTWVzc2FnZVR5cGUpdG1wVmFsOwogICByZXN1bHQgKz0gcmVhZEpTT05JbnRlZ2VyKHRtcFZhbCk7Ci0gIGlmKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKKyAgaWYgKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKICAgc2VxaWQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0bXBWYWwpOwogICByZXR1cm4gcmVzdWx0OwpAQCAtODg4LDcgKzk2OSw3IEBACiB9CiAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJ1Y3RCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSkgewotICAodm9pZCkgbmFtZTsKKyAgKHZvaWQpbmFtZTsKICAgcmV0dXJuIHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKIH0KIApAQCAtODk2LDIxICs5NzcsMTggQEAKICAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCk7CiB9CiAKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKLSAgKHZvaWQpIG5hbWU7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVFR5cGUmIGZpZWxkVHlwZSwgaW50MTZfdCYgZmllbGRJZCkgeworICAodm9pZCluYW1lOwogICB1aW50MzJfdCByZXN1bHQgPSAwOwogICAvLyBDaGVjayBpZiB3ZSBoaXQgdGhlIGVuZCBvZiB0aGUgbGlzdAogICB1aW50OF90IGNoID0gcmVhZGVyXy5wZWVrKCk7CiAgIGlmIChjaCA9PSBrSlNPTk9iamVjdEVuZCkgewogICAgIGZpZWxkVHlwZSA9IGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9TVE9QOwotICB9Ci0gIGVsc2UgeworICB9IGVsc2UgewogICAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CiAgICAgc3RkOjpzdHJpbmcgdG1wU3RyOwogICAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgICBpZih0bXBWYWwgPiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSkpCisgICAgaWYgKHRtcFZhbCA+IHN0YXRpY19jYXN0PHVpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkKICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICAgIGZpZWxkSWQgPSBzdGF0aWNfY2FzdDxpbnQxNl90Pih0bXBWYWwpOwogICAgIHJlc3VsdCArPSByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CkBAIC05MjQsOSArMTAwMiw3IEBACiAgIHJldHVybiByZWFkSlNPTk9iamVjdEVuZCgpOwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CiAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CiAgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKICAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CkBAIC05MzUsNyArMTAxMSw3IEBACiAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwogICB2YWxUeXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUodG1wU3RyKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OSW50ZWdlcih0bXBWYWwpOwotICBpZih0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKHRtcFZhbCA+IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpOwogICBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcFZhbCk7CiAgIHJlc3VsdCArPSByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CkBAIC05NDMsMTggKzEwMTksMTkgQEAKIH0KIAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZE1hcEVuZCgpIHsKLSAgcmV0dXJuIHJlYWRKU09OT2JqZWN0RW5kKCkgKyByZWFkSlNPTkFycmF5RW5kKCk7CisgIHVpbnQzMl90IHJlc3VsdCA9IHJlYWRKU09OT2JqZWN0RW5kKCk7CisgIHJlc3VsdCArPSByZWFkSlNPTkFycmF5RW5kKCk7CisgIHJldHVybiByZXN1bHQ7CiB9CiAKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgewordWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZExpc3RCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CiAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CiAgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKICAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CiAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwogICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CiAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgaWYodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKICAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOwogICByZXR1cm4gcmVzdWx0OwpAQCAtOTY0LDE1ICsxMDQxLDE0IEBACiAgIHJldHVybiByZWFkSlNPTkFycmF5RW5kKCk7CiB9CiAKLXVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTZXRCZWdpbihUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CiAgIHVpbnQ2NF90IHRtcFZhbCA9IDA7CiAgIHN0ZDo6c3RyaW5nIHRtcFN0cjsKICAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05BcnJheVN0YXJ0KCk7CiAgIHJlc3VsdCArPSByZWFkSlNPTlN0cmluZyh0bXBTdHIpOwogICBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHRtcFN0cik7CiAgIHJlc3VsdCArPSByZWFkSlNPTkludGVnZXIodG1wVmFsKTsKLSAgaWYodG1wVmFsID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpCisgIGlmICh0bXBWYWwgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKTsKICAgc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0bXBWYWwpOwogICByZXR1cm4gcmVzdWx0OwpAQCAtOTg2LDExICsxMDYyLDExIEBACiAgIHJldHVybiByZWFkSlNPTkludGVnZXIodmFsdWUpOwogfQogCi0vLyByZWFkQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBwcm9wZXJseSBiZWN1YXNlIGJvb3N0OjpsZXhpY2FsIGNhc3Qgc2VlcyBpbnQ4X3QKKy8vIHJlYWRCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHByb3Blcmx5IGJlY2F1c2UgYm9vc3Q6OmxleGljYWwgY2FzdCBzZWVzIGludDhfdAogLy8gYXMgYSB0ZXh0IHR5cGUgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyIHR5cGUKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRCeXRlKGludDhfdCYgYnl0ZSkgewotICBpbnQxNl90IHRtcCA9IChpbnQxNl90KSBieXRlOwotICB1aW50MzJfdCByZXN1bHQgPSAgcmVhZEpTT05JbnRlZ2VyKHRtcCk7CisgIGludDE2X3QgdG1wID0gKGludDE2X3QpYnl0ZTsKKyAgdWludDMyX3QgcmVzdWx0ID0gcmVhZEpTT05JbnRlZ2VyKHRtcCk7CiAgIGFzc2VydCh0bXAgPCAyNTYpOwogICBieXRlID0gKGludDhfdCl0bXA7CiAgIHJldHVybiByZXN1bHQ7CkBAIC0xMDEyLDEyICsxMDg4LDEzIEBACiAgIHJldHVybiByZWFkSlNPTkRvdWJsZShkdWIpOwogfQogCi11aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkU3RyaW5nKHN0ZDo6c3RyaW5nICZzdHIpIHsKK3VpbnQzMl90IFRKU09OUHJvdG9jb2w6OnJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewogICByZXR1cm4gcmVhZEpTT05TdHJpbmcoc3RyKTsKIH0KIAotdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEJpbmFyeShzdGQ6OnN0cmluZyAmc3RyKSB7Cit1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkQmluYXJ5KHN0ZDo6c3RyaW5nJiBzdHIpIHsKICAgcmV0dXJuIHJlYWRKU09OQmFzZTY0KHN0cik7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaAppbmRleCAwYTZmMDljLi45YzJmODcyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKQEAgLTIwLDExICsyMCwxMyBAQAogI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8KICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9USlNPTlBST1RPQ09MX0hfIDEKIAotI2luY2x1ZGUgIlRWaXJ0dWFsUHJvdG9jb2wuaCIKKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCiAjaW5jbHVkZSA8c3RhY2s+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHByb3RvY29sIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewogCiAvLyBGb3J3YXJkIGRlY2xhcmF0aW9uCiBjbGFzcyBUSlNPTkNvbnRleHQ7CkBAIC00MSw3ICs0Myw3IEBACiAgKiAyLiBUaHJpZnQgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBudW1iZXJzLiBTb21lIHNwZWNpYWwgdmFsdWVzIGFyZQogICogICAgcmVwcmVzZW50ZWQgYXMgc3RyaW5nczoKICAqICAgIGEuICJOYU4iIGZvciBub3QtYS1udW1iZXIgdmFsdWVzCi0gKiAgICBiLiAiSW5maW5pdHkiIGZvciBwb3N0aXZlIGluZmluaXR5CisgKiAgICBiLiAiSW5maW5pdHkiIGZvciBwb3NpdGl2ZSBpbmZpbml0eQogICogICAgYy4gIi1JbmZpbml0eSIgZm9yIG5lZ2F0aXZlIGluZmluaXR5CiAgKgogICogMy4gVGhyaWZ0IHN0cmluZyB2YWx1ZXMgYXJlIGVtaXR0ZWQgYXMgSlNPTiBzdHJpbmdzLCB3aXRoIGFwcHJvcHJpYXRlCkBAIC01MSw2ICs1MywxMCBAQAogICogICAgVGhlIHJlYWRCaW5hcnkoKSBtZXRob2QgaXMgd3JpdHRlbiBzdWNoIHRoYXQgaXQgd2lsbCBwcm9wZXJseSBza2lwIGlmCiAgKiAgICBjYWxsZWQgb24gYSBUaHJpZnQgc3RyaW5nIChhbHRob3VnaCBpdCB3aWxsIGRlY29kZSBnYXJiYWdlIGRhdGEpLgogICoKKyAqICAgIE5PVEU6IEJhc2U2NCBwYWRkaW5nIGlzIG9wdGlvbmFsIGZvciBUaHJpZnQgYmluYXJ5IHZhbHVlIGVuY29kaW5nLiBTbworICogICAgdGhlIHJlYWRCaW5hcnkoKSBtZXRob2QgbmVlZHMgdG8gZGVjb2RlIGJvdGggaW5wdXQgc3RyaW5ncyB3aXRoIHBhZGRpbmcKKyAqICAgIGFuZCB0aG9zZSB3aXRob3V0IG9uZS4KKyAqCiAgKiA1LiBUaHJpZnQgc3RydWN0cyBhcmUgcmVwcmVzZW50ZWQgYXMgSlNPTiBvYmplY3RzLCB3aXRoIHRoZSBmaWVsZCBJRCBhcyB0aGUKICAqICAgIGtleSwgYW5kIHRoZSBmaWVsZCB2YWx1ZSByZXByZXNlbnRlZCBhcyBhIEpTT04gb2JqZWN0IHdpdGggYSBzaW5nbGUKICAqICAgIGtleS12YWx1ZSBwYWlyLiBUaGUga2V5IGlzIGEgc2hvcnQgc3RyaW5nIGlkZW50aWZpZXIgZm9yIHRoYXQgdHlwZSwKQEAgLTgxLDIyICs4NywyMSBAQAogICogdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0aGUgYmVoYXZpb3IKICAqIG9mIEphdmEncyBEb3VibGUudG9TdHJpbmcoKSwgd2hpY2ggaGFzIG5vIHByZWNpc2lvbiBsb3NzLiAgSW1wbGVtZW50b3JzIGluCiAgKiBvdGhlciBsYW5ndWFnZXMgc2hvdWxkIHN0cml2ZSB0byBhY2hpZXZlIHRoYXQgd2hlcmUgcG9zc2libGUuIEkgaGF2ZSBub3QKLSAqIHlldCB2ZXJpZmllZCB3aGV0aGVyIGJvb3N0OmxleGljYWxfY2FzdCwgd2hpY2ggaXMgZG9pbmcgdGhhdCB3b3JrIGZvciBtZSBpbgotICogQysrLCBsb3NlcyBhbnkgcHJlY2lzaW9uLCBidXQgSSBhbSBsZWF2aW5nIHRoaXMgYXMgYSBmdXR1cmUgaW1wcm92ZW1lbnQuIEkKLSAqIG1heSB0cnkgdG8gcHJvdmlkZSBhIEMgY29tcG9uZW50IGZvciB0aGlzLCBzbyB0aGF0IG90aGVyIGxhbmd1YWdlcyBjb3VsZAotICogYmluZCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZvciBtYXhpbXVtIGNvbnNpc3RlbmN5LgorICogeWV0IHZlcmlmaWVkIHdoZXRoZXIgc3RkOjppc3RyaW5nc3RyZWFtOjpvcGVyYXRvcj4+LCB3aGljaCBpcyBkb2luZyB0aGF0CisgKiB3b3JrIGZvciBtZSBpbiBDKyssIGxvc2VzIGFueSBwcmVjaXNpb24sIGJ1dCBJIGFtIGxlYXZpbmcgdGhpcyBhcyBhIGZ1dHVyZQorICogaW1wcm92ZW1lbnQuIEkgbWF5IHRyeSB0byBwcm92aWRlIGEgQyBjb21wb25lbnQgZm9yIHRoaXMsIHNvIHRoYXQgb3RoZXIKKyAqIGxhbmd1YWdlcyBjb3VsZCBiaW5kIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZm9yIG1heGltdW0KKyAqIGNvbnNpc3RlbmN5LgogICoKICAqLwogY2xhc3MgVEpTT05Qcm90b2NvbCA6IHB1YmxpYyBUVmlydHVhbFByb3RvY29sPFRKU09OUHJvdG9jb2w+IHsKLSBwdWJsaWM6Ci0KLSAgVEpTT05Qcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpOworcHVibGljOgorICBUSlNPTlByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpOwogCiAgIH5USlNPTlByb3RvY29sKCk7CiAKLSBwcml2YXRlOgotCi0gIHZvaWQgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKTsKK3ByaXZhdGU6CisgIHZvaWQgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CiAKICAgdm9pZCBwb3BDb250ZXh0KCk7CiAKQEAgLTEwNCwxNiArMTA5LDE2IEBACiAKICAgdWludDMyX3Qgd3JpdGVKU09OQ2hhcih1aW50OF90IGNoKTsKIAotICB1aW50MzJfdCB3cml0ZUpTT05TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cik7CisgIHVpbnQzMl90IHdyaXRlSlNPTlN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKIAotICB1aW50MzJfdCB3cml0ZUpTT05CYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnN0cik7CisgIHVpbnQzMl90IHdyaXRlSlNPTkJhc2U2NChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKTsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KICAgdWludDMyX3Qgd3JpdGVKU09OSW50ZWdlcihOdW1iZXJUeXBlIG51bSk7CiAKICAgdWludDMyX3Qgd3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pOwogCi0gIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdFN0YXJ0KCkgOworICB1aW50MzJfdCB3cml0ZUpTT05PYmplY3RTdGFydCgpOwogCiAgIHVpbnQzMl90IHdyaXRlSlNPTk9iamVjdEVuZCgpOwogCkBAIC0xMjMsMTggKzEyOCwxOCBAQAogCiAgIHVpbnQzMl90IHJlYWRKU09OU3ludGF4Q2hhcih1aW50OF90IGNoKTsKIAotICB1aW50MzJfdCByZWFkSlNPTkVzY2FwZUNoYXIodWludDhfdCAqb3V0KTsKKyAgdWludDMyX3QgcmVhZEpTT05Fc2NhcGVDaGFyKHVpbnQxNl90KiBvdXQpOwogCi0gIHVpbnQzMl90IHJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nICZzdHIsIGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSk7CisgIHVpbnQzMl90IHJlYWRKU09OU3RyaW5nKHN0ZDo6c3RyaW5nJiBzdHIsIGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSk7CiAKLSAgdWludDMyX3QgcmVhZEpTT05CYXNlNjQoc3RkOjpzdHJpbmcgJnN0cik7CisgIHVpbnQzMl90IHJlYWRKU09OQmFzZTY0KHN0ZDo6c3RyaW5nJiBzdHIpOwogCi0gIHVpbnQzMl90IHJlYWRKU09OTnVtZXJpY0NoYXJzKHN0ZDo6c3RyaW5nICZzdHIpOworICB1aW50MzJfdCByZWFkSlNPTk51bWVyaWNDaGFycyhzdGQ6OnN0cmluZyYgc3RyKTsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KLSAgdWludDMyX3QgcmVhZEpTT05JbnRlZ2VyKE51bWJlclR5cGUgJm51bSk7CisgIHVpbnQzMl90IHJlYWRKU09OSW50ZWdlcihOdW1iZXJUeXBlJiBudW0pOwogCi0gIHVpbnQzMl90IHJlYWRKU09ORG91YmxlKGRvdWJsZSAmbnVtKTsKKyAgdWludDMyX3QgcmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pOwogCiAgIHVpbnQzMl90IHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKIApAQCAtMTQ0LDggKzE0OSw3IEBACiAKICAgdWludDMyX3QgcmVhZEpTT05BcnJheUVuZCgpOwogCi0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KICAgICovCkBAIC0xNjAsMjcgKzE2NCwyMSBAQAogCiAgIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVGaWVsZEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpOworICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwgY29uc3QgVFR5cGUgZmllbGRUeXBlLCBjb25zdCBpbnQxNl90IGZpZWxkSWQpOwogCiAgIHVpbnQzMl90IHdyaXRlRmllbGRFbmQoKTsKIAogICB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcCgpOwogCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsIGNvbnN0IFRUeXBlIHZhbFR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpOwogCiAgIHVpbnQzMl90IHdyaXRlTWFwRW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpOworICB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKICAgdWludDMyX3Qgd3JpdGVMaXN0RW5kKCk7CiAKLSAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKTsKKyAgdWludDMyX3Qgd3JpdGVTZXRCZWdpbihjb25zdCBUVHlwZSBlbGVtVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSk7CiAKICAgdWludDMyX3Qgd3JpdGVTZXRFbmQoKTsKIApAQCAtMjA0LDkgKzIwMiw3IEBACiAgICAqIFJlYWRpbmcgZnVuY3Rpb25zCiAgICAqLwogCi0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCk7CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKTsKIAogICB1aW50MzJfdCByZWFkTWVzc2FnZUVuZCgpOwogCkBAIC0yMTQsMjUgKzIxMCwxOSBAQAogCiAgIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmQoKTsKIAotICB1aW50MzJfdCByZWFkRmllbGRCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCk7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKTsKIAogICB1aW50MzJfdCByZWFkRmllbGRFbmQoKTsKIAotICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKTsKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpOwogCiAgIHVpbnQzMl90IHJlYWRNYXBFbmQoKTsKIAotICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSk7CisgIHVpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKICAgdWludDMyX3QgcmVhZExpc3RFbmQoKTsKIAotICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpOworICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSk7CiAKICAgdWludDMyX3QgcmVhZFNldEVuZCgpOwogCkBAIC0yNTcsMTggKzI0NywxMyBAQAogCiAgIGNsYXNzIExvb2thaGVhZFJlYWRlciB7CiAKLSAgIHB1YmxpYzoKLQotICAgIExvb2thaGVhZFJlYWRlcihUVHJhbnNwb3J0ICZ0cmFucykgOgotICAgICAgdHJhbnNfKCZ0cmFucyksCi0gICAgICBoYXNEYXRhXyhmYWxzZSkgewotICAgIH0KKyAgcHVibGljOgorICAgIExvb2thaGVhZFJlYWRlcihUVHJhbnNwb3J0JiB0cmFucykgOiB0cmFuc18oJnRyYW5zKSwgaGFzRGF0YV8oZmFsc2UpIHt9CiAKICAgICB1aW50OF90IHJlYWQoKSB7CiAgICAgICBpZiAoaGFzRGF0YV8pIHsKICAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgeworICAgICAgfSBlbHNlIHsKICAgICAgICAgdHJhbnNfLT5yZWFkQWxsKCZkYXRhXywgMSk7CiAgICAgICB9CiAgICAgICByZXR1cm4gZGF0YV87CkBAIC0yODIsMTcgKzI2NywxNyBAQAogICAgICAgcmV0dXJuIGRhdGFfOwogICAgIH0KIAotICAgcHJpdmF0ZToKLSAgICBUVHJhbnNwb3J0ICp0cmFuc187CisgIHByaXZhdGU6CisgICAgVFRyYW5zcG9ydCogdHJhbnNfOwogICAgIGJvb2wgaGFzRGF0YV87CiAgICAgdWludDhfdCBkYXRhXzsKICAgfTsKIAotIHByaXZhdGU6Citwcml2YXRlOgogICBUVHJhbnNwb3J0KiB0cmFuc187CiAKLSAgc3RkOjpzdGFjazxib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+ID4gY29udGV4dHNfOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+IGNvbnRleHRfOworICBzdGQ6OnN0YWNrPHN0ZDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+ID4gY29udGV4dHNfOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjb250ZXh0XzsKICAgTG9va2FoZWFkUmVhZGVyIHJlYWRlcl87CiB9OwogCkBAIC0zMDAsMzAgKzI4NSwzMSBAQAogICogQ29uc3RydWN0cyBpbnB1dCBhbmQgb3V0cHV0IHByb3RvY29sIG9iamVjdHMgZ2l2ZW4gdHJhbnNwb3J0cy4KICAqLwogY2xhc3MgVEpTT05Qcm90b2NvbEZhY3RvcnkgOiBwdWJsaWMgVFByb3RvY29sRmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUSlNPTlByb3RvY29sRmFjdG9yeSgpIHt9CiAKICAgdmlydHVhbCB+VEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVEpTT05Qcm90b2NvbCh0cmFucykpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKICAgfQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAotCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAvLyBUT0RPKGRyZWlzcyk6IE1vdmUgcGFydCBvZiBUaHJpZnRKU09OU3RyaW5nIGludG8gYSAuY3BwIGZpbGUgYW5kIHJlbW92ZSB0aGlzLgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAotdGVtcGxhdGU8dHlwZW5hbWUgVGhyaWZ0U3RydWN0PgotICBzdGQ6OnN0cmluZyBUaHJpZnRKU09OU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUaHJpZnRTdHJ1Y3Q+CitzdGQ6OnN0cmluZyBUaHJpZnRKU09OU3RyaW5nKGNvbnN0IFRocmlmdFN0cnVjdCYgdHMpIHsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiAgIFRNZW1vcnlCdWZmZXIqIGJ1ZmZlciA9IG5ldyBUTWVtb3J5QnVmZmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKICAgVEpTT05Qcm90b2NvbCBwcm90b2NvbCh0cmFucyk7CiAKICAgdHMud3JpdGUoJnByb3RvY29sKTsKQEAgLTMzMyw3ICszMTksNyBAQAogICBidWZmZXItPmdldEJ1ZmZlcigmYnVmLCAmc2l6ZSk7CiAgIHJldHVybiBzdGQ6OnN0cmluZygoY2hhciopYnVmLCAodW5zaWduZWQgaW50KXNpemUpOwogfQotCi19fSAvLyBhcGFjaGU6OnRocmlmdAorfQorfSAvLyBhcGFjaGU6OnRocmlmdAogCiAjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RKU09OUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkYzY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcHAKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHJvdG9jb2wgewordWludDMyX3QgVE11bHRpcGxleGVkUHJvdG9jb2w6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpIHsKKyAgaWYgKF90eXBlID09IFRfQ0FMTCB8fCBfdHlwZSA9PSBUX09ORVdBWSkgeworICAgIHJldHVybiBUUHJvdG9jb2xEZWNvcmF0b3I6OndyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoc2VydmljZU5hbWUgKyBzZXBhcmF0b3IgKyBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlcWlkKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVFByb3RvY29sRGVjb3JhdG9yOjp3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KF9uYW1lLCBfdHlwZSwgX3NlcWlkKTsKKyAgfQorfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJkODJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXworI2RlZmluZSBUSFJJRlRfVE1VTFRJUExFWEVEUFJPVE9DT0xfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKKyAqIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgKiBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICoKKyAqIFxub3RlIFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4gIE9uIHRoZSBzZXJ2ZXIsIHVzZQorICoge0BsaW5rIGFwYWNoZTo6dGhyaWZ0OjpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgVE11bHRpcGxleGVkUHJvY2Vzc29yfSB0byBoYW5kbGUgcmVxdWVzdHMKKyAqIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgorICoKKyAqIFRoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHRyYW5zcG9ydChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCkpOworICogICAgIHRyYW5zcG9ydC0+b3BlbigpOworICoKKyAqICAgICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm90b2NvbD4gbXAxKG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKSk7CisgKiAgICAgc2hhcmVkX3B0cjxDYWxjdWxhdG9yQ2xpZW50PiBzZXJ2aWNlMShuZXcgQ2FsY3VsYXRvckNsaWVudChtcDEpKTsKKyAqCisgKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm90b2NvbD4gbXAyKG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKSk7CisgKiAgICAgc2hhcmVkX3B0cjxXZWF0aGVyUmVwb3J0Q2xpZW50PiBzZXJ2aWNlMihuZXcgV2VhdGhlclJlcG9ydENsaWVudChtcDIpKTsKKyAqCisgKiAgICAgc2VydmljZTEtPmFkZCgyLDIpOworICogICAgIGludCB0ZW1wID0gc2VydmljZTItPmdldFRlbXBlcmF0dXJlKCk7CisgKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgorICoKKyAqIEBzZWUgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xEZWNvcmF0b3IKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yIHsKK3B1YmxpYzoKKyAgLyoqCisgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICogbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8Y29kZT5zZXJ2aWNlTmFtZTwvY29kZT4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgKgorICAgKiBccGFyYW0gX3Byb3RvY29sICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPGNvZGU+VEJpbmFyeVByb3RvY29sPC9jb2RlPi4KKyAgICogXHBhcmFtIF9zZXJ2aWNlTmFtZSBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAqLworICBUTXVsdGlwbGV4ZWRQcm90b2NvbChzaGFyZWRfcHRyPFRQcm90b2NvbD4gX3Byb3RvY29sLCBjb25zdCBzdGQ6OnN0cmluZyYgX3NlcnZpY2VOYW1lKQorICAgIDogVFByb3RvY29sRGVjb3JhdG9yKF9wcm90b2NvbCksIHNlcnZpY2VOYW1lKF9zZXJ2aWNlTmFtZSksIHNlcGFyYXRvcigiOiIpIHt9CisgIHZpcnR1YWwgflRNdWx0aXBsZXhlZFByb3RvY29sKCkge30KKworICAvKioKKyAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IuCisgICAqCisgICAqIFxwYXJhbSBbaW5dIF9uYW1lICAgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgaW4gdGhlIHNlcnZpY2UuCisgICAqIFxwYXJhbSBbaW5dIF90eXBlICAgVGhlIHR5cGUgb2YgbWVzc2FnZQorICAgKiBccGFyYW0gW2luXSBfbmFtZSAgIFRoZSBzZXF1ZW50aWFsIGlkIG9mIHRoZSBtZXNzYWdlCisgICAqCisgICAqIFx0aHJvd3MgVEV4Y2VwdGlvbiAgUGFzc2VkIHRocm91Z2ggZnJvbSB3cmFwcGVkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UuCisgICAqLworICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBfc2VxaWQpOworCitwcml2YXRlOgorICBjb25zdCBzdGQ6OnN0cmluZyBzZXJ2aWNlTmFtZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2VwYXJhdG9yOworfTsKK30KK30KK30KKworI2VuZGlmIC8vIFRIUklGVF9UTVVMVElQTEVYRURQUk9UT0NPTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc4YWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKworVFByb3RvY29sOjp+VFByb3RvY29sKCkge30KK3VpbnQzMl90IFRQcm90b2NvbDo6c2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsKKyAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKK30KKworVFByb3RvY29sRmFjdG9yeTo6flRQcm90b2NvbEZhY3RvcnkoKSB7fQorCit9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKaW5kZXggMDljZTdjNC4uYmJjNjgxNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaApAQCAtMjAsMTEgKzIwLDE1IEBACiAjaWZuZGVmIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfCiAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MX0hfIDEKIAorI2lmZGVmIF9XSU4zMgorLy8gTmVlZCB0byBjb21lIGJlZm9yZSBhbnkgV2luZG93cy5oIGluY2x1ZGVzCisjaW5jbHVkZSA8V2luc29jazIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CkBAIC0zMywxOCArMzcsMTcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHZlY3Rvcj4KLQorI2luY2x1ZGUgPGNsaW1pdHM+CiAKIC8vIFVzZSB0aGlzIHRvIGdldCBhcm91bmQgc3RyaWN0IGFsaWFzaW5nIHJ1bGVzLgogLy8gRm9yIGV4YW1wbGUsIHVpbnQ2NF90IGkgPSBiaXR3aXNlX2Nhc3Q8dWludDY0X3Q+KHJldHVybnNfZG91YmxlKCkpOwogLy8gVGhlIG1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBpcyB0byBqdXN0IGNhc3QgYSBwb2ludGVyLAogLy8gYnV0IHRoYXQgZG9lc24ndCB3b3JrLgogLy8gRm9yIGEgcHJldHR5IGluLWRlcHRoIGV4cGxhbmF0aW9uIG9mIHRoZSBwcm9ibGVtLCBzZWUKLS8vIGh0dHA6Ly93d3cuY2VsbHBlcmZvcm1hbmNlLmNvbS9taWtlX2FjdG9uLzIwMDYvMDYvICguLi4pCi0vLyB1bmRlcnN0YW5kaW5nX3N0cmljdF9hbGlhc2luZy5odG1sCisvLyBodHRwOi8vY2VsbHBlcmZvcm1hbmNlLmJleW9uZDNkLmNvbS9hcnRpY2xlcy8yMDA2LzA2L3VuZGVyc3RhbmRpbmctc3RyaWN0LWFsaWFzaW5nLmh0bWwKIHRlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KIHN0YXRpYyBpbmxpbmUgVG8gYml0d2lzZV9jYXN0KEZyb20gZnJvbSkgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSwgInNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pIik7CiAKICAgLy8gQkFEISEhICBUaGVzZSBhcmUgYWxsIGJyb2tlbiB3aXRoIC1PMi4KICAgLy9yZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VG8qPigmZnJvbSk7ICAvLyBCQUQhISEKQEAgLTc1LDEwICs3OCw2IEBACiB9CiAKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgewotCi11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwotCiAjaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAogI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgogI2VuZGlmCkBAIC0xMDMsMTIgKzEwMiwxOCBAQAogI2VuZGlmCiAKICNpZiBfX1RIUklGVF9CWVRFX09SREVSID09IF9fVEhSSUZUX0JJR19FTkRJQU4KLSMgIGRlZmluZSBudG9obGwobikgKG4pCi0jICBkZWZpbmUgaHRvbmxsKG4pIChuKQorIyBpZiAhZGVmaW5lZChUSFJJRlRfbnRvaGxsKQorIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSAobikKKyMgZW5kaWYKICMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dMSUJDX18pCiAjICBpbmNsdWRlIDxieXRlc3dhcC5oPgotIyAgZGVmaW5lIGh0b2xlbGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlbGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgYnN3YXBfMzIobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b2xlcyhuKSBic3dhcF8xNihuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgYnN3YXBfMTYobikKICMgZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KICMgIGRlZmluZSBic3dhcF82NChuKSBcCiAgICAgICAoICgoKG4pICYgMHhmZjAwMDAwMDAwMDAwMDAwdWxsKSA+PiA1NikgXApAQCAtMTE5LDI3ICsxMjQsNDkgQEAKICAgICAgIHwgKCgobikgJiAweDAwMDAwMDAwMDBmZjAwMDB1bGwpIDw8IDI0KSBcCiAgICAgICB8ICgoKG4pICYgMHgwMDAwMDAwMDAwMDBmZjAwdWxsKSA8PCA0MCkgXAogICAgICAgfCAoKChuKSAmIDB4MDAwMDAwMDAwMDAwMDBmZnVsbCkgPDwgNTYpICkKLSMgIGRlZmluZSBodG9sZWxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgbGV0b2hsbChuKSBic3dhcF82NChuKQorIyAgZGVmaW5lIGJzd2FwXzMyKG4pIFwKKyAgICAgICggKCgobikgJiAweGZmMDAwMDAwdWwpID4+IDI0KSBcCisgICAgICB8ICgoKG4pICYgMHgwMGZmMDAwMHVsKSA+PiA4KSAgXAorICAgICAgfCAoKChuKSAmIDB4MDAwMGZmMDB1bCkgPDwgOCkgIFwKKyAgICAgIHwgKCgobikgJiAweDAwMDAwMGZmdWwpIDw8IDI0KSApCisjICBkZWZpbmUgYnN3YXBfMTYobikgXAorICAgICAgKCAoKChuKSAmICgodW5zaWduZWQgc2hvcnQpMHhmZjAwdWwpKSA+PiA4KSAgXAorICAgICAgfCAoKChuKSAmICgodW5zaWduZWQgc2hvcnQpMHgwMGZmdWwpKSA8PCA4KSAgKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVsKG4pIGJzd2FwXzMyKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obChuKSBic3dhcF8zMihuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZXMobikgYnN3YXBfMTYobikKKyMgIGRlZmluZSBUSFJJRlRfbGV0b2hzKG4pIGJzd2FwXzE2KG4pCiAjIGVuZGlmIC8qIEdOVUMgJiBHTElCQyAqLwogI2VsaWYgX19USFJJRlRfQllURV9PUkRFUiA9PSBfX1RIUklGVF9MSVRUTEVfRU5ESUFOCi0jICBkZWZpbmUgaHRvbGVsbChuKSAobikKLSMgIGRlZmluZSBsZXRvaGxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaGxsKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9odG9sZWwobikgKG4pCisjICBkZWZpbmUgVEhSSUZUX2xldG9obChuKSAobikKKyMgIGRlZmluZSBUSFJJRlRfaHRvbGVzKG4pIChuKQorIyAgZGVmaW5lIFRIUklGVF9sZXRvaHMobikgKG4pCiAjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQogIyAgaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KLSMgIGRlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKLSMgIGRlZmluZSBodG9ubGwobikgYnN3YXBfNjQobikKKyMgIGRlZmluZSBUSFJJRlRfbnRvaGxsKG4pIGJzd2FwXzY0KG4pCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSBic3dhcF82NChuKQogIyBlbGlmIGRlZmluZWQoX01TQ19WRVIpIC8qIE1pY3Jvc29mdCBWaXN1YWwgQysrICovCi0jICBkZWZpbmUgbnRvaGxsKG4pICggX2J5dGVzd2FwX3VpbnQ2NCgodWludDY0X3QpbikgKQotIyAgZGVmaW5lIGh0b25sbChuKSAoIF9ieXRlc3dhcF91aW50NjQoKHVpbnQ2NF90KW4pICkKLSMgZWxzZSAvKiBOb3QgR05VQy9HTElCQyBvciBNU1ZDICovCi0jICBkZWZpbmUgbnRvaGxsKG4pICggKCgodWludDY0X3QpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpICkKLSMgIGRlZmluZSBodG9ubGwobikgKCAoKCh1aW50NjRfdClodG9ubChuKSkgPDwgMzIpICsgaHRvbmwobiA+PiAzMikgKQorIyAgZGVmaW5lIFRIUklGVF9udG9obGwobikgKCBfYnl0ZXN3YXBfdWludDY0KCh1aW50NjRfdCluKSApCisjICBkZWZpbmUgVEhSSUZUX2h0b25sbChuKSAoIF9ieXRlc3dhcF91aW50NjQoKHVpbnQ2NF90KW4pICkKKyMgZWxpZiAhZGVmaW5lZChUSFJJRlRfbnRvaGxsKSAvKiBOb3QgR05VQy9HTElCQyBvciBNU1ZDICovCisjICBkZWZpbmUgVEhSSUZUX250b2hsbChuKSAoICgoKHVpbnQ2NF90KW50b2hsKCh1aW50MzJfdCluKSkgPDwgMzIpICsgbnRvaGwoKHVpbnQzMl90KShuID4+IDMyKSkgKQorIyAgZGVmaW5lIFRIUklGVF9odG9ubGwobikgKCAoKCh1aW50NjRfdClodG9ubCgodWludDMyX3QpbikpIDw8IDMyKSArIGh0b25sKCh1aW50MzJfdCkobiA+PiAzMikpICkKICMgZW5kaWYgLyogR05VQy9HTElCQyBvciBNU1ZDIG9yIHNvbWV0aGluZyBlbHNlICovCiAjZWxzZSAvKiBfX1RIUklGVF9CWVRFX09SREVSICovCi0jIGVycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCisjIGVycm9yICJDYW4ndCBkZWZpbmUgVEhSSUZUX2h0b25sbCBvciBUSFJJRlRfbnRvaGxsISIKICNlbmRpZgogCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKKwogLyoqCiAgKiBFbnVtZXJhdGVkIGRlZmluaXRpb24gb2YgdGhlIHR5cGVzIHRoYXQgdGhlIFRocmlmdCBwcm90b2NvbCBzdXBwb3J0cy4KICAqIFRha2Ugc3BlY2lhbCBub3RlIG9mIHRoZSBUX0VORCB0eXBlIHdoaWNoIGlzIHVzZWQgc3BlY2lmaWNhbGx5IHRvIG1hcmsKQEAgLTE3NywxMTEgKzIwNCw3IEBACiAgIFRfT05FV0FZICAgICA9IDQKIH07CiAKLQotLyoqCi0gKiBIZWxwZXIgdGVtcGxhdGUgZm9yIGltcGxlbWVudGluZyBUUHJvdG9jb2w6OnNraXAoKS4KLSAqCi0gKiBUZW1wbGF0aXplZCB0byBhdm9pZCBoYXZpbmcgdG8gbWFrZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPgotdWludDMyX3Qgc2tpcChQcm90b2NvbF8mIHByb3QsIFRUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gIGNhc2UgVF9CT09MOgotICAgIHsKLSAgICAgIGJvb2wgYm9vbHY7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkQm9vbChib29sdik7Ci0gICAgfQotICBjYXNlIFRfQllURToKLSAgICB7Ci0gICAgICBpbnQ4X3QgYnl0ZXY7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkQnl0ZShieXRldik7Ci0gICAgfQotICBjYXNlIFRfSTE2OgotICAgIHsKLSAgICAgIGludDE2X3QgaTE2OwotICAgICAgcmV0dXJuIHByb3QucmVhZEkxNihpMTYpOwotICAgIH0KLSAgY2FzZSBUX0kzMjoKLSAgICB7Ci0gICAgICBpbnQzMl90IGkzMjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRJMzIoaTMyKTsKLSAgICB9Ci0gIGNhc2UgVF9JNjQ6Ci0gICAgewotICAgICAgaW50NjRfdCBpNjQ7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkSTY0KGk2NCk7Ci0gICAgfQotICBjYXNlIFRfRE9VQkxFOgotICAgIHsKLSAgICAgIGRvdWJsZSBkdWI7Ci0gICAgICByZXR1cm4gcHJvdC5yZWFkRG91YmxlKGR1Yik7Ci0gICAgfQotICBjYXNlIFRfU1RSSU5HOgotICAgIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHN0cjsKLSAgICAgIHJldHVybiBwcm90LnJlYWRCaW5hcnkoc3RyKTsKLSAgICB9Ci0gIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7Ci0gICAgICBpbnQxNl90IGZpZDsKLSAgICAgIFRUeXBlIGZ0eXBlOwotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZFN0cnVjdEJlZ2luKG5hbWUpOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgcmVzdWx0ICs9IHByb3QucmVhZEZpZWxkQmVnaW4obmFtZSwgZnR5cGUsIGZpZCk7Ci0gICAgICAgIGlmIChmdHlwZSA9PSBUX1NUT1ApIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCBmdHlwZSk7Ci0gICAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEVuZCgpOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZFN0cnVjdEVuZCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIGNhc2UgVF9NQVA6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIFRUeXBlIGtleVR5cGU7Ci0gICAgICBUVHlwZSB2YWxUeXBlOwotICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwga2V5VHlwZSk7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIHZhbFR5cGUpOwotICAgICAgfQotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZE1hcEVuZCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIGNhc2UgVF9TRVQ6Ci0gICAgewotICAgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICAgIFRUeXBlIGVsZW1UeXBlOwotICAgICAgdWludDMyX3QgaSwgc2l6ZTsKLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRTZXRFbmQoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICBjYXNlIFRfTElTVDoKLSAgICB7Ci0gICAgICB1aW50MzJfdCByZXN1bHQgPSAwOwotICAgICAgVFR5cGUgZWxlbVR5cGU7Ci0gICAgICB1aW50MzJfdCBpLCBzaXplOwotICAgICAgcmVzdWx0ICs9IHByb3QucmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRMaXN0RW5kKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgY2FzZSBUX1NUT1A6IGNhc2UgVF9WT0lEOiBjYXNlIFRfVTY0OiBjYXNlIFRfVVRGODogY2FzZSBUX1VURjE2OgotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiAwOwotfQorc3RhdGljIGNvbnN0IHVpbnQzMl90IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gNjQ7CiAKIC8qKgogICogQWJzdHJhY3QgY2xhc3MgZm9yIGEgdGhyaWZ0IHByb3RvY29sIGRyaXZlci4gVGhlc2UgYXJlIGFsbCB0aGUgbWV0aG9kcyB0aGF0CkBAIC0yOTgsOCArMjIxLDggQEAKICAqCiAgKi8KIGNsYXNzIFRQcm90b2NvbCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5UUHJvdG9jb2woKSB7fQorcHVibGljOgorICB2aXJ0dWFsIH5UUHJvdG9jb2woKTsKIAogICAvKioKICAgICogV3JpdGluZyBmdW5jdGlvbnMuCkBAIC0zMTEsNyArMjM0LDYgQEAKIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgPSAwOwogCi0KICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luX3ZpcnQoY29uc3QgY2hhciogbmFtZSkgPSAwOwogCiAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpID0gMDsKQEAgLTMyNCwxOSArMjQ2LDE2IEBACiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkKKyAgICAgID0gMDsKIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSA9IDA7CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpID0gMDsKIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSA9IDA7CiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgPSAwOwogCkBAIC0zNjgsNyArMjg3LDYgQEAKICAgICByZXR1cm4gd3JpdGVNZXNzYWdlRW5kX3ZpcnQoKTsKICAgfQogCi0KICAgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbihjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgVF9WSVJUVUFMX0NBTEwoKTsKICAgICByZXR1cm4gd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KG5hbWUpOwpAQCAtMzc5LDkgKzI5Nyw3IEBACiAgICAgcmV0dXJuIHdyaXRlU3RydWN0RW5kX3ZpcnQoKTsKICAgfQogCi0gIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBmaWVsZElkKSB7CisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIHdyaXRlRmllbGRCZWdpbl92aXJ0KG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KQEAgLTM5Niw5ICszMTIsNyBAQAogICAgIHJldHVybiB3cml0ZUZpZWxkU3RvcF92aXJ0KCk7CiAgIH0KIAotICB1aW50MzJfdCB3cml0ZU1hcEJlZ2luKGNvbnN0IFRUeXBlIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgdmFsVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwgY29uc3QgVFR5cGUgdmFsVHlwZSwgY29uc3QgdWludDMyX3Qgc2l6ZSkgewogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIHdyaXRlTWFwQmVnaW5fdmlydChrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKICAgfQpAQCAtNDgyLDI1ICszOTYsMTkgQEAKIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpID0gMDsKIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpID0gMDsKIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEVuZF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CiAKICAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwRW5kX3ZpcnQoKSA9IDA7CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSA9IDA7CiAKICAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgPSAwOwogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgPSAwOwogCiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgPSAwOwogCkBAIC01MjIsOSArNDMwLDcgQEAKIAogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCaW5hcnlfdmlydChzdGQ6OnN0cmluZyYgc3RyKSA9IDA7CiAKLSAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIHNlcWlkKSB7CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CiAgICAgVF9WSVJUVUFMX0NBTEwoKTsKICAgICByZXR1cm4gcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CiAgIH0KQEAgLTU0NCw5ICs0NTAsNyBAQAogICAgIHJldHVybiByZWFkU3RydWN0RW5kX3ZpcnQoKTsKICAgfQogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7CisgIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUVHlwZSYgZmllbGRUeXBlLCBpbnQxNl90JiBmaWVsZElkKSB7CiAgICAgVF9WSVJUVUFMX0NBTEwoKTsKICAgICByZXR1cm4gcmVhZEZpZWxkQmVnaW5fdmlydChuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpOwogICB9CkBAIC02NDMsNDQgKzU0Nyw2MyBAQAogICAgIFRfVklSVFVBTF9DQUxMKCk7CiAgICAgcmV0dXJuIHNraXBfdmlydCh0eXBlKTsKICAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKTsKIAotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KCkgewotICAgIHJldHVybiBwdHJhbnNfOwotICB9CisgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQogCiAgIC8vIFRPRE86IHJlbW92ZSB0aGVzZSB0d28gY2FsbHMsIHRoZXkgYXJlIGZvciBiYWNrd2FyZHMKICAgLy8gY29tcGF0aWJpbGl0eQotICBpbmxpbmUgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0SW5wdXRUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHB0cmFuc187Ci0gIH0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gcHRyYW5zXzsKLSAgfQorICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldElucHV0VHJhbnNwb3J0KCkgeyByZXR1cm4gcHRyYW5zXzsgfQorICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KIAotIHByb3RlY3RlZDoKLSAgVFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucyk6Ci0gICAgcHRyYW5zXyhwdHJhbnMpIHsKKyAgLy8gaW5wdXQgYW5kIG91dHB1dCByZWN1cnNpb24gZGVwdGggYXJlIGtlcHQgc2VwYXJhdGUgc28gdGhhdCBvbmUgcHJvdG9jb2wKKyAgLy8gY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCisgIHZvaWQgaW5jcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpIHsKKyAgICBpZiAocmVjdXJzaW9uX2xpbWl0XyA8ICsraW5wdXRfcmVjdXJzaW9uX2RlcHRoXykgeworICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6REVQVEhfTElNSVQpOworICAgIH0KICAgfQorICB2b2lkIGRlY3JlbWVudElucHV0UmVjdXJzaW9uRGVwdGgoKSB7IC0taW5wdXRfcmVjdXJzaW9uX2RlcHRoXzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187CisgIHZvaWQgaW5jcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKSB7CisgICAgaWYgKHJlY3Vyc2lvbl9saW1pdF8gPCArK291dHB1dF9yZWN1cnNpb25fZGVwdGhfKSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpERVBUSF9MSU1JVCk7CisgICAgfQorICB9CisgIHZvaWQgZGVjcmVtZW50T3V0cHV0UmVjdXJzaW9uRGVwdGgoKSB7IC0tb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF87IH0KIAotIHByaXZhdGU6CisgIHVpbnQzMl90IGdldFJlY3Vyc2lvbkxpbWl0KCkgY29uc3Qge3JldHVybiByZWN1cnNpb25fbGltaXRfO30KKyAgdm9pZCBzZXRSZWN1cmlzaW9uTGltaXQodWludDMyX3QgZGVwdGgpIHtyZWN1cnNpb25fbGltaXRfID0gZGVwdGg7fQorCitwcm90ZWN0ZWQ6CisgIFRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQorICAgIDogcHRyYW5zXyhwdHJhbnMpLCBpbnB1dF9yZWN1cnNpb25fZGVwdGhfKDApLCBvdXRwdXRfcmVjdXJzaW9uX2RlcHRoXygwKSwgcmVjdXJzaW9uX2xpbWl0XyhERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCkKKyAge30KKworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zXzsKKworcHJpdmF0ZToKICAgVFByb3RvY29sKCkge30KKyAgdWludDMyX3QgaW5wdXRfcmVjdXJzaW9uX2RlcHRoXzsKKyAgdWludDMyX3Qgb3V0cHV0X3JlY3Vyc2lvbl9kZXB0aF87CisgIHVpbnQzMl90IHJlY3Vyc2lvbl9saW1pdF87CiB9OwogCiAvKioKICAqIENvbnN0cnVjdHMgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbCBvYmplY3RzIGdpdmVuIHRyYW5zcG9ydHMuCiAgKi8KIGNsYXNzIFRQcm90b2NvbEZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVFByb3RvY29sRmFjdG9yeSgpIHt9CiAKLSAgdmlydHVhbCB+VFByb3RvY29sRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgflRQcm90b2NvbEZhY3RvcnkoKTsKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFucywKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFucykgeworICAgICh2b2lkKW91dFRyYW5zOworICAgIHJldHVybiBnZXRQcm90b2NvbChpblRyYW5zKTsKKyAgfQogfTsKIAogLyoqCkBAIC02ODksOSArNjEyLDE1MiBAQAogICogVGhpcyBjbGFzcyBkb2VzIG5vdGhpbmcsIGFuZCBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgogICogSXQgaXMgdXNlZCBvbmx5IGJ5IHRoZSBnZW5lcmF0b3IgY29kZS4KICAqLwotY2xhc3MgVER1bW15UHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sIHsKK2NsYXNzIFREdW1teVByb3RvY29sIDogcHVibGljIFRQcm90b2NvbCB7fTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCAvIGxlZ2FjeSBjaG9pY2UKK3N0cnVjdCBUTmV0d29ya0JpZ0VuZGlhbgoreworICBzdGF0aWMgdWludDE2X3QgdG9XaXJlMTYodWludDE2X3QgeCkgICB7cmV0dXJuIGh0b25zKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IHRvV2lyZTMyKHVpbnQzMl90IHgpICAge3JldHVybiBodG9ubCh4KTt9CisgIHN0YXRpYyB1aW50NjRfdCB0b1dpcmU2NCh1aW50NjRfdCB4KSAgIHtyZXR1cm4gVEhSSUZUX2h0b25sbCh4KTt9CisgIHN0YXRpYyB1aW50MTZfdCBmcm9tV2lyZTE2KHVpbnQxNl90IHgpIHtyZXR1cm4gbnRvaHMoeCk7fQorICBzdGF0aWMgdWludDMyX3QgZnJvbVdpcmUzMih1aW50MzJfdCB4KSB7cmV0dXJuIG50b2hsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IGZyb21XaXJlNjQodWludDY0X3QgeCkge3JldHVybiBUSFJJRlRfbnRvaGxsKHgpO30KIH07CiAKKy8vIE9uIG1vc3Qgc3lzdGVtcywgdGhpcyB3aWxsIGJlIGEgYml0IGZhc3RlciB0aGFuIFROZXR3b3JrQmlnRW5kaWFuCitzdHJ1Y3QgVE5ldHdvcmtMaXR0bGVFbmRpYW4KK3sKKyAgc3RhdGljIHVpbnQxNl90IHRvV2lyZTE2KHVpbnQxNl90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbGVzKHgpO30KKyAgc3RhdGljIHVpbnQzMl90IHRvV2lyZTMyKHVpbnQzMl90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbGVsKHgpO30KKyAgc3RhdGljIHVpbnQ2NF90IHRvV2lyZTY0KHVpbnQ2NF90IHgpICAge3JldHVybiBUSFJJRlRfaHRvbGVsbCh4KTt9CisgIHN0YXRpYyB1aW50MTZfdCBmcm9tV2lyZTE2KHVpbnQxNl90IHgpIHtyZXR1cm4gVEhSSUZUX2xldG9ocyh4KTt9CisgIHN0YXRpYyB1aW50MzJfdCBmcm9tV2lyZTMyKHVpbnQzMl90IHgpIHtyZXR1cm4gVEhSSUZUX2xldG9obCh4KTt9CisgIHN0YXRpYyB1aW50NjRfdCBmcm9tV2lyZTY0KHVpbnQ2NF90IHgpIHtyZXR1cm4gVEhSSUZUX2xldG9obGwoeCk7fQorfTsKKworc3RydWN0IFRPdXRwdXRSZWN1cnNpb25UcmFja2VyIHsKKyAgVFByb3RvY29sICZwcm90XzsKKyAgVE91dHB1dFJlY3Vyc2lvblRyYWNrZXIoVFByb3RvY29sICZwcm90KSA6IHByb3RfKHByb3QpIHsKKyAgICBwcm90Xy5pbmNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpOworICB9CisgIH5UT3V0cHV0UmVjdXJzaW9uVHJhY2tlcigpIHsKKyAgICBwcm90Xy5kZWNyZW1lbnRPdXRwdXRSZWN1cnNpb25EZXB0aCgpOworICB9Cit9OworCitzdHJ1Y3QgVElucHV0UmVjdXJzaW9uVHJhY2tlciB7CisgIFRQcm90b2NvbCAmcHJvdF87CisgIFRJbnB1dFJlY3Vyc2lvblRyYWNrZXIoVFByb3RvY29sICZwcm90KSA6IHByb3RfKHByb3QpIHsKKyAgICBwcm90Xy5pbmNyZW1lbnRJbnB1dFJlY3Vyc2lvbkRlcHRoKCk7CisgIH0KKyAgflRJbnB1dFJlY3Vyc2lvblRyYWNrZXIoKSB7CisgICAgcHJvdF8uZGVjcmVtZW50SW5wdXRSZWN1cnNpb25EZXB0aCgpOworICB9Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIFRQcm90b2NvbDo6c2tpcCgpLgorICoKKyAqIFRlbXBsYXRpemVkIHRvIGF2b2lkIGhhdmluZyB0byBtYWtlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbHMuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+Cit1aW50MzJfdCBza2lwKFByb3RvY29sXyYgcHJvdCwgVFR5cGUgdHlwZSkgeworICBUSW5wdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIocHJvdCk7CisKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9CT09MOiB7CisgICAgYm9vbCBib29sdjsKKyAgICByZXR1cm4gcHJvdC5yZWFkQm9vbChib29sdik7CisgIH0KKyAgY2FzZSBUX0JZVEU6IHsKKyAgICBpbnQ4X3QgYnl0ZXYgPSAwOworICAgIHJldHVybiBwcm90LnJlYWRCeXRlKGJ5dGV2KTsKKyAgfQorICBjYXNlIFRfSTE2OiB7CisgICAgaW50MTZfdCBpMTY7CisgICAgcmV0dXJuIHByb3QucmVhZEkxNihpMTYpOworICB9CisgIGNhc2UgVF9JMzI6IHsKKyAgICBpbnQzMl90IGkzMjsKKyAgICByZXR1cm4gcHJvdC5yZWFkSTMyKGkzMik7CisgIH0KKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgaTY0OworICAgIHJldHVybiBwcm90LnJlYWRJNjQoaTY0KTsKKyAgfQorICBjYXNlIFRfRE9VQkxFOiB7CisgICAgZG91YmxlIGR1YjsKKyAgICByZXR1cm4gcHJvdC5yZWFkRG91YmxlKGR1Yik7CisgIH0KKyAgY2FzZSBUX1NUUklORzogeworICAgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgICByZXR1cm4gcHJvdC5yZWFkQmluYXJ5KHN0cik7CisgIH0KKyAgY2FzZSBUX1NUUlVDVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBpbnQxNl90IGZpZDsKKyAgICBUVHlwZSBmdHlwZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU3RydWN0QmVnaW4obmFtZSk7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZ0eXBlLCBmaWQpOworICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGZ0eXBlKTsKKyAgICAgIHJlc3VsdCArPSBwcm90LnJlYWRGaWVsZEVuZCgpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBjYXNlIFRfTUFQOiB7CisgICAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgICBUVHlwZSBrZXlUeXBlOworICAgIFRUeXBlIHZhbFR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwga2V5VHlwZSk7CisgICAgICByZXN1bHQgKz0gc2tpcChwcm90LCB2YWxUeXBlKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHByb3QucmVhZE1hcEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX1NFVDogeworICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CisgICAgVFR5cGUgZWxlbVR5cGU7CisgICAgdWludDMyX3QgaSwgc2l6ZTsKKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgIHJlc3VsdCArPSBza2lwKHByb3QsIGVsZW1UeXBlKTsKKyAgICB9CisgICAgcmVzdWx0ICs9IHByb3QucmVhZFNldEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX0xJU1Q6IHsKKyAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgIFRUeXBlIGVsZW1UeXBlOworICAgIHVpbnQzMl90IGksIHNpemU7CisgICAgcmVzdWx0ICs9IHByb3QucmVhZExpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgcmVzdWx0ICs9IHNraXAocHJvdCwgZWxlbVR5cGUpOworICAgIH0KKyAgICByZXN1bHQgKz0gcHJvdC5yZWFkTGlzdEVuZCgpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2FzZSBUX1NUT1A6CisgIGNhc2UgVF9WT0lEOgorICBjYXNlIFRfVTY0OgorICBjYXNlIFRfVVRGODoKKyAgY2FzZSBUX1VURjE2OgorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAogI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0M2EwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVFBST1RPQ09MREVDT1JBVE9SX0hfCisjZGVmaW5lIFRIUklGVF9UUFJPVE9DT0xERUNPUkFUT1JfSF8gMQorCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKKy8qKgorICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKKyAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQorICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuCisgKgorICogPHA+U2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKTwvcD4KKyAqCisgKiBAc2VlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE11bHRpcGxleGVkUHJvdG9jb2wKKyAqLworY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogcHVibGljIFRQcm90b2NvbCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflRQcm90b2NvbERlY29yYXRvcigpIHt9CisKKyAgLy8gRGVzYzogSW5pdGlhbGl6ZXMgdGhlIHByb3RvY29sIGRlY29yYXRvciBvYmplY3QuCisgIFRQcm90b2NvbERlY29yYXRvcihzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8pCisgICAgOiBUUHJvdG9jb2wocHJvdG8tPmdldFRyYW5zcG9ydCgpKSwgcHJvdG9jb2wocHJvdG8pIHt9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbl92aXJ0KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzZXFpZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWVzc2FnZUVuZCgpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0QmVnaW4obmFtZSk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVN0cnVjdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgIHJldHVybiBwcm90b2NvbC0+d3JpdGVGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUZpZWxkRW5kKCk7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlRmllbGRTdG9wKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT53cml0ZU1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZU1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTWFwRW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlTGlzdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTZXRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZVNldEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUJvb2xfdmlydChjb25zdCBib29sIHZhbHVlKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCb29sKHZhbHVlKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQnl0ZV92aXJ0KGNvbnN0IGludDhfdCBieXRlKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVCeXRlKGJ5dGUpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVJMTZfdmlydChjb25zdCBpbnQxNl90IGkxNikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlSTE2KGkxNik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUkzMl92aXJ0KGNvbnN0IGludDMyX3QgaTMyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVJMzIoaTMyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlSTY0X3ZpcnQoY29uc3QgaW50NjRfdCBpNjQpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZUk2NChpNjQpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZURvdWJsZV92aXJ0KGNvbnN0IGRvdWJsZSBkdWIpIHsgcmV0dXJuIHByb3RvY29sLT53cml0ZURvdWJsZShkdWIpOyB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJpbmdfdmlydChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7IHJldHVybiBwcm90b2NvbC0+d3JpdGVTdHJpbmcoc3RyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlQmluYXJ5X3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPndyaXRlQmluYXJ5KHN0cik7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW5fdmlydChzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBwcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKKyAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkRmllbGRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZE1hcEJlZ2luKGtleVR5cGUsIHZhbFR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRNYXBFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKKyAgICByZXR1cm4gcHJvdG9jb2wtPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RFbmRfdmlydCgpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkTGlzdEVuZCgpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2V0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsIHVpbnQzMl90JiBzaXplKSB7CisgICAgcmV0dXJuIHByb3RvY29sLT5yZWFkU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRTZXRFbmQoKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCb29sKHZhbHVlKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRCb29sX3ZpcnQoc3RkOjp2ZWN0b3I8Ym9vbD46OnJlZmVyZW5jZSB2YWx1ZSkgeworICAgIHJldHVybiBwcm90b2NvbC0+cmVhZEJvb2wodmFsdWUpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQnl0ZV92aXJ0KGludDhfdCYgYnl0ZSkgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCeXRlKGJ5dGUpOyB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkSTE2X3ZpcnQoaW50MTZfdCYgaTE2KSB7IHJldHVybiBwcm90b2NvbC0+cmVhZEkxNihpMTYpOyB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZEkzMl92aXJ0KGludDMyX3QmIGkzMikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRJMzIoaTMyKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRJNjRfdmlydChpbnQ2NF90JiBpNjQpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkSTY0KGk2NCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWREb3VibGVfdmlydChkb3VibGUmIGR1YikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWREb3VibGUoZHViKTsgfQorCisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cmluZ192aXJ0KHN0ZDo6c3RyaW5nJiBzdHIpIHsgcmV0dXJuIHByb3RvY29sLT5yZWFkU3RyaW5nKHN0cik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQmluYXJ5X3ZpcnQoc3RkOjpzdHJpbmcmIHN0cikgeyByZXR1cm4gcHJvdG9jb2wtPnJlYWRCaW5hcnkoc3RyKTsgfQorCitwcml2YXRlOgorICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7Cit9OworfQorfQorfQorCisjZW5kaWYgLy8gVEhSSUZUX1RQUk9UT0NPTERFQ09SQVRPUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCmluZGV4IGEwM2QzYzguLjEwMTc4ZTEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKQEAgLTIyLDcgKzIyLDkgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIC8qKgogICogQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIHRoZSBwb3NzaWJsZSB0eXBlcyBvZiBwcm90b2NvbCBlcnJvcnMgdGhhdCBtYXkKQEAgLTMzLDM3ICszNSwzMSBAQAogICoKICAqLwogY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyoqCiAgICAqIEVycm9yIGNvZGVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBleGNlcHRpb25zLgogICAgKi8KLSAgZW51bSBUUHJvdG9jb2xFeGNlcHRpb25UeXBlCi0gIHsgVU5LTk9XTiA9IDAKLSAgLCBJTlZBTElEX0RBVEEgPSAxCi0gICwgTkVHQVRJVkVfU0laRSA9IDIKLSAgLCBTSVpFX0xJTUlUID0gMwotICAsIEJBRF9WRVJTSU9OID0gNAotICAsIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgZW51bSBUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHsKKyAgICBVTktOT1dOID0gMCwKKyAgICBJTlZBTElEX0RBVEEgPSAxLAorICAgIE5FR0FUSVZFX1NJWkUgPSAyLAorICAgIFNJWkVfTElNSVQgPSAzLAorICAgIEJBRF9WRVJTSU9OID0gNCwKKyAgICBOT1RfSU1QTEVNRU5URUQgPSA1LAorICAgIERFUFRIX0xJTUlUID0gNgogICB9OwogCi0gIFRQcm90b2NvbEV4Y2VwdGlvbigpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLAotICAgIHR5cGVfKFVOS05PV04pIHt9CisgIFRQcm90b2NvbEV4Y2VwdGlvbigpIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwgdHlwZV8oVU5LTk9XTikge30KIAotICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyh0eXBlKSB7fQorICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CiAKLSAgVFByb3RvY29sRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8oVU5LTk9XTikge30KKyAgVFByb3RvY29sRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQorICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKFVOS05PV04pIHt9CiAKLSAgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIDoKLSAgICBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwKLSAgICB0eXBlXyh0eXBlKSB7fQorICBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRQcm90b2NvbEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgbm9leGNlcHQge30KIAogICAvKioKICAgICogUmV0dXJucyBhbiBlcnJvciBjb2RlIHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgZXJyb3IKQEAgLTcxLDM0ICs2NywzOSBAQAogICAgKgogICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKICAgICovCi0gIFRQcm90b2NvbEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIHsKLSAgICByZXR1cm4gdHlwZV87Ci0gIH0KKyAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICBzd2l0Y2ggKHR5cGVfKSB7Ci0gICAgICAgIGNhc2UgVU5LTk9XTiAgICAgICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IFVua25vd24gcHJvdG9jb2wgZXhjZXB0aW9uIjsKLSAgICAgICAgY2FzZSBJTlZBTElEX0RBVEEgICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogSW52YWxpZCBkYXRhIjsKLSAgICAgICAgY2FzZSBORUdBVElWRV9TSVpFICAgOiByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTmVnYXRpdmUgc2l6ZSI7Ci0gICAgICAgIGNhc2UgU0laRV9MSU1JVCAgICAgIDogcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IEV4Y2VlZGVkIHNpemUgbGltaXQiOwotICAgICAgICBjYXNlIEJBRF9WRVJTSU9OICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIHZlcnNpb24iOwotICAgICAgICBjYXNlIE5PVF9JTVBMRU1FTlRFRCA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOb3QgaW1wbGVtZW50ZWQiOwotICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICA6IHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgICAgY2FzZSBVTktOT1dOOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogVW5rbm93biBwcm90b2NvbCBleGNlcHRpb24iOworICAgICAgY2FzZSBJTlZBTElEX0RBVEE6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIGRhdGEiOworICAgICAgY2FzZSBORUdBVElWRV9TSVpFOgorICAgICAgICByZXR1cm4gIlRQcm90b2NvbEV4Y2VwdGlvbjogTmVnYXRpdmUgc2l6ZSI7CisgICAgICBjYXNlIFNJWkVfTElNSVQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBFeGNlZWRlZCBzaXplIGxpbWl0IjsKKyAgICAgIGNhc2UgQkFEX1ZFUlNJT046CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBJbnZhbGlkIHZlcnNpb24iOworICAgICAgY2FzZSBOT1RfSU1QTEVNRU5URUQ6CisgICAgICAgIHJldHVybiAiVFByb3RvY29sRXhjZXB0aW9uOiBOb3QgaW1wbGVtZW50ZWQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJUUHJvdG9jb2xFeGNlcHRpb246IChJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwogICAgIH0KICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICAvKioKICAgICogRXJyb3IgY29kZQogICAgKi8KICAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSB0eXBlXzsKLQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xFWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaAppbmRleCBmNDkzZjg4Li5kMDAwYmE2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCkBAIC0yMiw3ICsyMiw5IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBwcm90b2NvbCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHByb3RvY29sIHsKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIApAQCAtMzMsMTcgKzM1LDExIEBACiAgKgogICovCiBjbGFzcyBUUHJvdG9jb2xUYXAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+IHsKLSBwdWJsaWM6Ci0gICBUUHJvdG9jb2xUYXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rKQotICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VFByb3RvY29sVGFwPihzb3VyY2UtPmdldFRyYW5zcG9ydCgpKQotICAgICAsIHNvdXJjZV8oc291cmNlKQotICAgICAsIHNpbmtfKHNpbmspCi0gIHt9CitwdWJsaWM6CisgIFRQcm90b2NvbFRhcChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4oc291cmNlLT5nZXRUcmFuc3BvcnQoKSksIHNvdXJjZV8oc291cmNlKSwgc2lua18oc2luaykge30KIAotICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgc2VxaWQpIHsKKyAgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbihzdGQ6OnN0cmluZyYgbmFtZSwgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwgaW50MzJfdCYgc2VxaWQpIHsKICAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKICAgICBzaW5rXy0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKTsKICAgICByZXR1cm4gcnY7CkBAIC02Nyw5ICs2Myw3IEBACiAgICAgcmV0dXJuIHJ2OwogICB9CiAKLSAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKICAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgICAgaWYgKGZpZWxkVHlwZSA9PSBUX1NUT1ApIHsKICAgICAgIHNpbmtfLT53cml0ZUZpZWxkU3RvcCgpOwpAQCAtNzksMjIgKzczLDE4IEBACiAgICAgcmV0dXJuIHJ2OwogICB9CiAKLQogICB1aW50MzJfdCByZWFkRmllbGRFbmQoKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkRmllbGRFbmQoKTsKICAgICBzaW5rXy0+d3JpdGVGaWVsZEVuZCgpOwogICAgIHJldHVybiBydjsKICAgfQogCi0gIHVpbnQzMl90IHJlYWRNYXBCZWdpbihUVHlwZSYga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlJiB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgdWludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrZXlUeXBlLCBUVHlwZSYgdmFsVHlwZSwgdWludDMyX3QmIHNpemUpIHsKICAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKICAgICBzaW5rXy0+d3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKTsKICAgICByZXR1cm4gcnY7CiAgIH0KIAotCiAgIHVpbnQzMl90IHJlYWRNYXBFbmQoKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTWFwRW5kKCk7CiAgICAgc2lua18tPndyaXRlTWFwRW5kKCk7CkBAIC0xMDcsNyArOTcsNiBAQAogICAgIHJldHVybiBydjsKICAgfQogCi0KICAgdWludDMyX3QgcmVhZExpc3RFbmQoKSB7CiAgICAgdWludDMyX3QgcnYgPSBzb3VyY2VfLT5yZWFkTGlzdEVuZCgpOwogICAgIHNpbmtfLT53cml0ZUxpc3RFbmQoKTsKQEAgLTEyMCw3ICsxMDksNiBAQAogICAgIHJldHVybiBydjsKICAgfQogCi0KICAgdWludDMyX3QgcmVhZFNldEVuZCgpIHsKICAgICB1aW50MzJfdCBydiA9IHNvdXJjZV8tPnJlYWRTZXRFbmQoKTsKICAgICBzaW5rXy0+d3JpdGVTZXRFbmQoKTsKQEAgLTE3OCwxMSArMTY2LDEyIEBACiAgICAgcmV0dXJuIHJ2OwogICB9CiAKLSBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNvdXJjZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc2lua187Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCiAKICNlbmRpZiAvLyAjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVEFQX0hfIDEKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5OGIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFJPVE9DT0xfVFBST1RPQ09MVFlQRVNfSF8KKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX1RQUk9UT0NPTFRZUEVTX0hfIDEKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CisKK2VudW0gUFJPVE9DT0xfVFlQRVMgeworICBUX0JJTkFSWV9QUk9UT0NPTCA9IDAsCisgIFRfSlNPTl9QUk9UT0NPTCA9IDEsCisgIFRfQ09NUEFDVF9QUk9UT0NPTCA9IDIsCit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKKworI2VuZGlmIC8vICNkZWZpbmUgX1RIUklGVF9QUk9UT0NPTF9UUFJPVE9DT0xUWVBFU19IXyAxCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaAppbmRleCBlMDY4NzI1Li40ZWVhNTc5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKQEAgLTIyLDcgKzIyLDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiAKQEAgLTM4LDEzICs0MCwxMSBAQAogICogaW5zdGVhZC4KICAqLwogY2xhc3MgVFByb3RvY29sRGVmYXVsdHMgOiBwdWJsaWMgVFByb3RvY29sIHsKLSBwdWJsaWM6Ci0gIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlJiBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICAgICh2b2lkKSBuYW1lOwotICAgICh2b2lkKSBtZXNzYWdlVHlwZTsKLSAgICAodm9pZCkgc2VxaWQ7CitwdWJsaWM6CisgIHVpbnQzMl90IHJlYWRNZXNzYWdlQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRNZXNzYWdlVHlwZSYgbWVzc2FnZVR5cGUsIGludDMyX3QmIHNlcWlkKSB7CisgICAgKHZvaWQpbmFtZTsKKyAgICAodm9pZCltZXNzYWdlVHlwZTsKKyAgICAodm9pZClzZXFpZDsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQpAQCAtNTUsNyArNTUsNyBAQAogICB9CiAKICAgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgKHZvaWQpIG5hbWU7CisgICAgKHZvaWQpbmFtZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQpAQCAtNjUsMTIgKzY1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCi0gIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90JiBmaWVsZElkKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgKHZvaWQpIGZpZWxkVHlwZTsKLSAgICAodm9pZCkgZmllbGRJZDsKKyAgdWludDMyX3QgcmVhZEZpZWxkQmVnaW4oc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKWZpZWxkVHlwZTsKKyAgICAodm9pZClmaWVsZElkOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CkBAIC04MSw5ICs3OSw5IEBACiAgIH0KIAogICB1aW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGtleVR5cGUsIFRUeXBlJiB2YWxUeXBlLCB1aW50MzJfdCYgc2l6ZSkgewotICAgICh2b2lkKSBrZXlUeXBlOwotICAgICh2b2lkKSB2YWxUeXBlOwotICAgICh2b2lkKSBzaXplOworICAgICh2b2lkKWtleVR5cGU7CisgICAgKHZvaWQpdmFsVHlwZTsKKyAgICAodm9pZClzaXplOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CkBAIC05NCw4ICs5Miw4IEBACiAgIH0KIAogICB1aW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKLSAgICAodm9pZCkgZWxlbVR5cGU7Ci0gICAgKHZvaWQpIHNpemU7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQpAQCAtMTA2LDggKzEwNCw4IEBACiAgIH0KIAogICB1aW50MzJfdCByZWFkU2V0QmVnaW4oVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewotICAgICh2b2lkKSBlbGVtVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKKyAgICAodm9pZCllbGVtVHlwZTsKKyAgICAodm9pZClzaXplOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CkBAIC0xMTgsNTUgKzExNiw1NSBAQAogICB9CiAKICAgdWludDMyX3QgcmVhZEJvb2woYm9vbCYgdmFsdWUpIHsKLSAgICAodm9pZCkgdmFsdWU7CisgICAgKHZvaWQpdmFsdWU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCByZWFkQm9vbChzdGQ6OnZlY3Rvcjxib29sPjo6cmVmZXJlbmNlIHZhbHVlKSB7Ci0gICAgKHZvaWQpIHZhbHVlOworICAgICh2b2lkKXZhbHVlOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3QgcmVhZEJ5dGUoaW50OF90JiBieXRlKSB7Ci0gICAgKHZvaWQpIGJ5dGU7CisgICAgKHZvaWQpYnl0ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHJlYWRJMTYoaW50MTZfdCYgaTE2KSB7Ci0gICAgKHZvaWQpIGkxNjsKKyAgICAodm9pZClpMTY7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCByZWFkSTMyKGludDMyX3QmIGkzMikgewotICAgICh2b2lkKSBpMzI7CisgICAgKHZvaWQpaTMyOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3QgcmVhZEk2NChpbnQ2NF90JiBpNjQpIHsKLSAgICAodm9pZCkgaTY0OworICAgICh2b2lkKWk2NDsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHJlYWREb3VibGUoZG91YmxlJiBkdWIpIHsKLSAgICAodm9pZCkgZHViOworICAgICh2b2lkKWR1YjsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHJlYWRTdHJpbmcoc3RkOjpzdHJpbmcmIHN0cikgewotICAgICh2b2lkKSBzdHI7CisgICAgKHZvaWQpc3RyOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgKHZvaWQpIHN0cjsKKyAgICAodm9pZClzdHI7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTE3NCw5ICsxNzIsOSBAQAogICB1aW50MzJfdCB3cml0ZU1lc3NhZ2VCZWdpbihjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gICAgKHZvaWQpIG5hbWU7Ci0gICAgKHZvaWQpIG1lc3NhZ2VUeXBlOwotICAgICh2b2lkKSBzZXFpZDsKKyAgICAodm9pZCluYW1lOworICAgICh2b2lkKW1lc3NhZ2VUeXBlOworICAgICh2b2lkKXNlcWlkOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CkBAIC0xODYsOSArMTg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKLQogICB1aW50MzJfdCB3cml0ZVN0cnVjdEJlZ2luKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICAodm9pZCkgbmFtZTsKKyAgICAodm9pZCluYW1lOwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CkBAIC0xOTgsMTIgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAotICB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW4oY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgZmllbGRJZCkgewotICAgICh2b2lkKSBuYW1lOwotICAgICh2b2lkKSBmaWVsZFR5cGU7Ci0gICAgKHZvaWQpIGZpZWxkSWQ7CisgIHVpbnQzMl90IHdyaXRlRmllbGRCZWdpbihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBUVHlwZSBmaWVsZFR5cGUsIGNvbnN0IGludDE2X3QgZmllbGRJZCkgeworICAgICh2b2lkKW5hbWU7CisgICAgKHZvaWQpZmllbGRUeXBlOworICAgICh2b2lkKWZpZWxkSWQ7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTIxOCwxMiArMjEzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQogCi0gIHVpbnQzMl90IHdyaXRlTWFwQmVnaW4oY29uc3QgVFR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICAodm9pZCkga2V5VHlwZTsKLSAgICAodm9pZCkgdmFsVHlwZTsKLSAgICAodm9pZCkgc2l6ZTsKKyAgdWludDMyX3Qgd3JpdGVNYXBCZWdpbihjb25zdCBUVHlwZSBrZXlUeXBlLCBjb25zdCBUVHlwZSB2YWxUeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7CisgICAgKHZvaWQpa2V5VHlwZTsKKyAgICAodm9pZCl2YWxUeXBlOworICAgICh2b2lkKXNpemU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTIzNCw4ICsyMjcsOCBAQAogICB9CiAKICAgdWludDMyX3Qgd3JpdGVMaXN0QmVnaW4oY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKLSAgICAodm9pZCkgZWxlbVR5cGU7Ci0gICAgKHZvaWQpIHNpemU7CisgICAgKHZvaWQpZWxlbVR5cGU7CisgICAgKHZvaWQpc2l6ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQpAQCAtMjQ2LDggKzIzOSw4IEBACiAgIH0KIAogICB1aW50MzJfdCB3cml0ZVNldEJlZ2luKGNvbnN0IFRUeXBlIGVsZW1UeXBlLCBjb25zdCB1aW50MzJfdCBzaXplKSB7Ci0gICAgKHZvaWQpIGVsZW1UeXBlOwotICAgICh2b2lkKSBzaXplOworICAgICh2b2lkKWVsZW1UeXBlOworICAgICh2b2lkKXNpemU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KQEAgLTI1OCw3MCArMjUxLDY2IEBACiAgIH0KIAogICB1aW50MzJfdCB3cml0ZUJvb2woY29uc3QgYm9vbCB2YWx1ZSkgewotICAgICh2b2lkKSB2YWx1ZTsKKyAgICAodm9pZCl2YWx1ZTsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHdyaXRlQnl0ZShjb25zdCBpbnQ4X3QgYnl0ZSkgewotICAgICh2b2lkKSBieXRlOworICAgICh2b2lkKWJ5dGU7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCB3cml0ZUkxNihjb25zdCBpbnQxNl90IGkxNikgewotICAgICh2b2lkKSBpMTY7CisgICAgKHZvaWQpaTE2OwogICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246Ok5PVF9JTVBMRU1FTlRFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgcHJvdG9jb2wgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nICh5ZXQpLiIpOwogICB9CiAKICAgdWludDMyX3Qgd3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgICAodm9pZCkgaTMyOworICAgICh2b2lkKWkzMjsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpOT1RfSU1QTEVNRU5URUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIHByb3RvY29sIGRvZXMgbm90IHN1cHBvcnQgd3JpdGluZyAoeWV0KS4iKTsKICAgfQogCiAgIHVpbnQzMl90IHdyaXRlSTY0KGNvbnN0IGludDY0X3QgaTY0KSB7Ci0gICAgKHZvaWQpIGk2NDsKKyAgICAodm9pZClpNjQ7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCB3cml0ZURvdWJsZShjb25zdCBkb3VibGUgZHViKSB7Ci0gICAgKHZvaWQpIGR1YjsKKyAgICAodm9pZClkdWI7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCB3cml0ZVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgKHZvaWQpIHN0cjsKKyAgICAodm9pZClzdHI7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAogICB1aW50MzJfdCB3cml0ZUJpbmFyeShjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gICAgKHZvaWQpIHN0cjsKKyAgICAodm9pZClzdHI7CiAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbjo6Tk9UX0lNUExFTUVOVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgKHlldCkuIik7CiAgIH0KIAotICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsKLSAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OnNraXAoKnRoaXMsIHR5cGUpOwotICB9CisgIHVpbnQzMl90IHNraXAoVFR5cGUgdHlwZSkgeyByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OnNraXAoKnRoaXMsIHR5cGUpOyB9CiAKLSBwcm90ZWN0ZWQ6Ci0gIFRQcm90b2NvbERlZmF1bHRzKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKLSAgICA6IFRQcm90b2NvbChwdHJhbnMpCi0gIHt9Citwcm90ZWN0ZWQ6CisgIFRQcm90b2NvbERlZmF1bHRzKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpIDogVFByb3RvY29sKHB0cmFucykge30KIH07CiAKIC8qKgogICogQ29uY3JldGUgVFByb3RvY29sIGNsYXNzZXMgc2hvdWxkIGluaGVyaXQgZnJvbSBUVmlydHVhbFByb3RvY29sCiAgKiBzbyB0aGV5IGRvbid0IGhhdmUgdG8gbWFudWFsbHkgb3ZlcnJpZGUgdmlydHVhbCBtZXRob2RzLgogICovCi10ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfLCBjbGFzcyBTdXBlcl89VFByb3RvY29sRGVmYXVsdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfLCBjbGFzcyBTdXBlcl8gPSBUUHJvdG9jb2xEZWZhdWx0cz4KIGNsYXNzIFRWaXJ0dWFsUHJvdG9jb2wgOiBwdWJsaWMgU3VwZXJfIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBXcml0aW5nIGZ1bmN0aW9ucy4KICAgICovCkBAIC0zMjksMzcgKzMxOCwyOCBAQAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUJlZ2luX3ZpcnQoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUTWVzc2FnZVR5cGUgbWVzc2FnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHNlcWlkKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCk7CiAgIH0KIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWVzc2FnZUVuZF92aXJ0KCkgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVNZXNzYWdlRW5kKCk7CiAgIH0KIAotCiAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RCZWdpbl92aXJ0KGNvbnN0IGNoYXIqIG5hbWUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU3RydWN0QmVnaW4obmFtZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU3RydWN0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEVuZCgpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZVN0cnVjdEVuZCgpOyB9CiAKICAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkQmVnaW5fdmlydChjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRUeXBlIGZpZWxkVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRCZWdpbihuYW1lLCBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVGaWVsZEVuZCgpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVGaWVsZFN0b3BfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRTdG9wKCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUZpZWxkU3RvcF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlRmllbGRTdG9wKCk7IH0KIAogICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwQmVnaW5fdmlydChjb25zdCBUVHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUVHlwZSB2YWxUeXBlLApAQCAtMzY3LDI3ICszNDcsMTkgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTWFwRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEVuZCgpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVNYXBFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZU1hcEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZUxpc3RCZWdpbl92aXJ0KGNvbnN0IFRUeXBlIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSkgeworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVMaXN0RW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT53cml0ZUxpc3RFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlTGlzdEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlTGlzdEVuZCgpOyB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEJlZ2luX3ZpcnQoY29uc3QgVFR5cGUgZWxlbVR5cGUsIGNvbnN0IHVpbnQzMl90IHNpemUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPndyaXRlU2V0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCB3cml0ZVNldEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlU2V0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVTZXRFbmQoKTsgfQogCiAgIHZpcnR1YWwgdWludDMyX3Qgd3JpdGVCb29sX3ZpcnQoY29uc3QgYm9vbCB2YWx1ZSkgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+d3JpdGVCb29sKHZhbHVlKTsKQEAgLTQyOCw2MCArNDAwLDQwIEBACiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZE1lc3NhZ2VCZWdpbl92aXJ0KHN0ZDo6c3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBzZXFpZCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VCZWdpbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTWVzc2FnZUVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNZXNzYWdlRW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZE1lc3NhZ2VFbmQoKTsgfQogCiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTdHJ1Y3RCZWdpbihuYW1lKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFN0cnVjdEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFN0cnVjdEVuZCgpOworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRTdHJ1Y3RFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkU3RydWN0RW5kKCk7IH0KKworICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsIFRUeXBlJiBmaWVsZFR5cGUsIGludDE2X3QmIGZpZWxkSWQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRGaWVsZEJlZ2luX3ZpcnQoc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZSYgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCYgZmllbGRJZCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEZpZWxkQmVnaW4obmFtZSwgZmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJZCk7Ci0gIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkRmllbGRFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEZpZWxkRW5kX3ZpcnQoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkRmllbGRFbmQoKTsKLSAgfQotCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZE1hcEJlZ2luX3ZpcnQoVFR5cGUmIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGUmIHZhbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkTWFwQmVnaW5fdmlydChUVHlwZSYga2V5VHlwZSwgVFR5cGUmIHZhbFR5cGUsIHVpbnQzMl90JiBzaXplKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWFwQmVnaW4oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSk7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRNYXBFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRNYXBFbmRfdmlydCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkTWFwRW5kKCk7IH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0QmVnaW5fdmlydChUVHlwZSYgZWxlbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZExpc3RCZWdpbl92aXJ0KFRUeXBlJiBlbGVtVHlwZSwgdWludDMyX3QmIHNpemUpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOwogICB9CiAKLSAgdmlydHVhbCB1aW50MzJfdCByZWFkTGlzdEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RFbmQoKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRMaXN0RW5kX3ZpcnQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZExpc3RFbmQoKTsgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzaXplKSB7CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEJlZ2luX3ZpcnQoVFR5cGUmIGVsZW1UeXBlLCB1aW50MzJfdCYgc2l6ZSkgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKICAgfQogCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZFNldEVuZCgpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZFNldEVuZF92aXJ0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8UHJvdG9jb2xfKj4odGhpcyktPnJlYWRTZXRFbmQoKTsgfQogCiAgIHZpcnR1YWwgdWludDMyX3QgcmVhZEJvb2xfdmlydChib29sJiB2YWx1ZSkgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxQcm90b2NvbF8qPih0aGlzKS0+cmVhZEJvb2wodmFsdWUpOwpAQCAtNTE5LDkgKzQ3MSw3IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5yZWFkQmluYXJ5KHN0cik7CiAgIH0KIAotICB2aXJ0dWFsIHVpbnQzMl90IHNraXBfdmlydChUVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5za2lwKHR5cGUpOwotICB9CisgIHZpcnR1YWwgdWludDMyX3Qgc2tpcF92aXJ0KFRUeXBlIHR5cGUpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFByb3RvY29sXyo+KHRoaXMpLT5za2lwKHR5cGUpOyB9CiAKICAgLyoKICAgICogUHJvdmlkZSBhIGRlZmF1bHQgc2tpcCgpIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBub24tdmlydHVhbCByZWFkCkBAIC01NTMsMTIgKzUwMywxMSBAQAogICB9CiAgIHVzaW5nIFN1cGVyXzo6cmVhZEJvb2w7IC8vIHNvIHdlIGRvbid0IGhpZGUgcmVhZEJvb2woYm9vbCYpCiAKLSBwcm90ZWN0ZWQ6Ci0gIFRWaXJ0dWFsUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKQotICAgIDogU3VwZXJfKHB0cmFucykKLSAge30KK3Byb3RlY3RlZDoKKyAgVFZpcnR1YWxQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFN1cGVyXyhwdHJhbnMpIHt9CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAogCiAjZW5kaWYgLy8gI2RlZmluZSBfVEhSSUZUX1BST1RPQ09MX1RWSVJUVUFMUFJPVE9DT0xfSF8gMQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTlhMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwyOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NldCggdGhyaWZ0Y3BwcXQ1X1NPVVJDRVMKKyAgICBUUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAorICAgIFRRVGNwU2VydmVyLmNwcAorKQorc2V0KENNQUtFX0FVVE9NT0MgT04pCitmaW5kX3BhY2thZ2UoUXQ1IFJFUVVJUkVEIENPTVBPTkVOVFMgQ29yZSBOZXR3b3JrKQorQUREX0xJQlJBUllfVEhSSUZUKHRocmlmdHF0NSAke3RocmlmdGNwcHF0NV9TT1VSQ0VTfSkKK1RBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQodGhyaWZ0cXQ1IFF0NTo6Q29yZSBRdDU6Ok5ldHdvcmspCitUQVJHRVRfTElOS19MSUJSQVJJRVNfVEhSSUZUX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0cXQ1IHRocmlmdCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAppbmRleCAzYTNlMjIyLi5mNzdjOTkzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCkBAIC0yMyw0NiArMjMsNDIgQEAKICNpbmNsdWRlIDxRSU9EZXZpY2U+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLSAgCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKIAotVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KQotICA6IGRldl8oZGV2KQotewordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KSA6IGRldl8oZGV2KSB7CiB9CiAKLVRRSU9EZXZpY2VUcmFuc3BvcnQ6On5UUUlPRGV2aWNlVHJhbnNwb3J0KCkKLXsKK1RRSU9EZXZpY2VUcmFuc3BvcnQ6On5UUUlPRGV2aWNlVHJhbnNwb3J0KCkgewogICBkZXZfLT5jbG9zZSgpOwogfQogCi12b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6Om9wZW4oKQotewordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpvcGVuKCkgewogICBpZiAoIWlzT3BlbigpKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzbid0IG9wZW4iKTsKICAgfQogfQogCi1ib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmlzT3BlbigpCi17Citib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmlzT3BlbigpIHsKICAgcmV0dXJuIGRldl8tPmlzT3BlbigpOwogfQogCi1ib29sIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnBlZWsoKQoteworYm9vbCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpwZWVrKCkgewogICByZXR1cm4gZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSA+IDA7CiB9CiAKLXZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Y2xvc2UoKQotewordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0OjpjbG9zZSgpIHsKICAgZGV2Xy0+Y2xvc2UoKTsKIH0KIAotdWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgcmVxdWVzdExlbiA9IGxlbjsKICAgd2hpbGUgKGxlbikgewogICAgIHVpbnQzMl90IHJlYWRTaXplOwpAQCAtODYsOCArODIsNyBAQAogICByZXR1cm4gcmVxdWVzdExlbjsKIH0KIAotdWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OnJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgdWludDMyX3QgYWN0dWFsU2l6ZTsKICAgcWludDY0IHJlYWRTaXplOwogCkBAIC05NiwyNSArOTEsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CiAgIH0KIAotICBhY3R1YWxTaXplID0gKHVpbnQzMl90KXN0ZDo6bWluKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKLSAgcmVhZFNpemUgPSBkZXZfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihidWYpLCBhY3R1YWxTaXplKTsKKyAgYWN0dWFsU2l6ZSA9ICh1aW50MzJfdCkoc3RkOjptaW4pKChxaW50NjQpbGVuLCBkZXZfLT5ieXRlc0F2YWlsYWJsZSgpKTsKKyAgcmVhZFNpemUgPSBkZXZfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZiksIGFjdHVhbFNpemUpOwogCiAgIGlmIChyZWFkU2l6ZSA8IDApIHsKICAgICBRQWJzdHJhY3RTb2NrZXQqIHNvY2tldDsKLSAgICBpZiAoKHNvY2tldCA9IHFvYmplY3RfY2FzdDxRQWJzdHJhY3RTb2NrZXQqID4oZGV2Xy5nZXQoKSkpKSB7CisgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVhZCgpIGZyb20gUUFic3RyYWN0U29ja2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKICAgICB9Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGZyb20gZnJvbSBRSU9EZXZpY2UiKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJGYWlsZWQgdG8gcmVhZCBmcm9tIGZyb20gUUlPRGV2aWNlIik7CiAgIH0KIAogICByZXR1cm4gKHVpbnQzMl90KXJlYWRTaXplOwogfQogCi12b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKQotewordm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICB3aGlsZSAobGVuKSB7CiAgICAgdWludDMyX3Qgd3JpdHRlbiA9IHdyaXRlX3BhcnRpYWwoYnVmLCBsZW4pOwogICAgIGxlbiAtPSB3cml0dGVuOwpAQCAtMTIyLDggKzExNSw3IEBACiAgIH0KIH0KIAotdWludDMyX3QgVFFJT0RldmljZVRyYW5zcG9ydDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikKLXsKK3VpbnQzMl90IFRRSU9EZXZpY2VUcmFuc3BvcnQ6OndyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgcWludDY0IHdyaXR0ZW47CiAKICAgaWYgKCFkZXZfLT5pc09wZW4oKSkgewpAQCAtMTM2LDcgKzEyOCw4IEBACiAgICAgUUFic3RyYWN0U29ja2V0KiBzb2NrZXQ7CiAgICAgaWYgKChzb2NrZXQgPSBxb2JqZWN0X2Nhc3Q8UUFic3RyYWN0U29ja2V0Kj4oZGV2Xy5nZXQoKSkpKSB7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV9wYXJ0aWFsKCk6IGZhaWxlZCB0byB3cml0ZSB0byBRQWJzdHJhY3RTb2NrZXQiLCBzb2NrZXQtPmVycm9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfcGFydGlhbCgpOiBmYWlsZWQgdG8gd3JpdGUgdG8gUUFic3RyYWN0U29ja2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5lcnJvcigpKTsKICAgICB9CiAKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCkBAIC0xNDYsOCArMTM5LDcgQEAKICAgcmV0dXJuICh1aW50MzJfdCl3cml0dGVuOwogfQogCi12b2lkIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmZsdXNoKCkKLXsKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Zmx1c2goKSB7CiAgIGlmICghZGV2Xy0+aXNPcGVuKCkpIHsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdXNoKCk6IHVuZGVybHlpbmcgUUlPRGV2aWNlIGlzIG5vdCBvcGVuIik7CkBAIC0xNjIsMTggKzE1NCwxNiBAQAogICB9CiB9CiAKLXVpbnQ4X3QqIFRRSU9EZXZpY2VUcmFuc3BvcnQ6OmJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pCi17Ci0gICh2b2lkKSBidWY7Ci0gICh2b2lkKSBsZW47Cit1aW50OF90KiBUUUlPRGV2aWNlVHJhbnNwb3J0Ojpib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CisgICh2b2lkKWJ1ZjsKKyAgKHZvaWQpbGVuOwogICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBUUUlPRGV2aWNlVHJhbnNwb3J0Ojpjb25zdW1lKHVpbnQzMl90IGxlbikKLXsKLSAgKHZvaWQpIGxlbjsKK3ZvaWQgVFFJT0RldmljZVRyYW5zcG9ydDo6Y29uc3VtZSh1aW50MzJfdCBsZW4pIHsKKyAgKHZvaWQpbGVuOwogICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAotCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCmluZGV4IDY0ZmFhMTIuLjkxY2U4ZDUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaApAQCAtMjAsMjAgKzIwLDIzIEBACiAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KICNkZWZpbmUgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAKIGNsYXNzIFFJT0RldmljZTsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiAgVHJhbnNwb3J0IHRoYXQgb3BlcmF0ZXMgb24gYSBRSU9EZXZpY2UgKHNvY2tldCwgZmlsZSwgZXRjKS4KICAqLwotY2xhc3MgVFFJT0RldmljZVRyYW5zcG9ydCA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVmlydHVhbFRyYW5zcG9ydDxUUUlPRGV2aWNlVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBUUUlPRGV2aWNlVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKK2NsYXNzIFRRSU9EZXZpY2VUcmFuc3BvcnQKKyAgICA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVmlydHVhbFRyYW5zcG9ydDxUUUlPRGV2aWNlVHJhbnNwb3J0PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRRSU9EZXZpY2VUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKICAgdmlydHVhbCB+VFFJT0RldmljZVRyYW5zcG9ydCgpOwogCiAgIHZvaWQgb3BlbigpOwpAQCAtNDEsNyArNDQsNyBAQAogICBib29sIHBlZWsoKTsKICAgdm9pZCBjbG9zZSgpOwogCi0gIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCAqYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CkBAIC01MiwxMyArNTUsMTQgQEAKICAgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CiAgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pOwogCi0gcHJpdmF0ZToKLSAgIFRRSU9EZXZpY2VUcmFuc3BvcnQoY29uc3QgVFFJT0RldmljZVRyYW5zcG9ydCYpOwotICAgVFFJT0RldmljZVRyYW5zcG9ydCYgb3BlcmF0b3I9KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKLSAgIAotICAgYm9vc3Q6OnNoYXJlZF9wdHI8UUlPRGV2aWNlPiBkZXZfOworcHJpdmF0ZToKKyAgVFFJT0RldmljZVRyYW5zcG9ydChjb25zdCBUUUlPRGV2aWNlVHJhbnNwb3J0Jik7CisgIFRRSU9EZXZpY2VUcmFuc3BvcnQmIG9wZXJhdG9yPShjb25zdCBUUUlPRGV2aWNlVHJhbnNwb3J0Jik7CisKKyAgc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2XzsKIH07Ci19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfQVNZTkNfVFFJT0RFVklDRV9UUkFOU1BPUlRfSF8KLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKaW5kZXggMmFmOGZhMy4uOTlhYWQwNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCkBAIC0xNywyOCArMTcsMzMgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJUUVRjcFNlcnZlci5oIgotI2luY2x1ZGUgIlRRSU9EZXZpY2VUcmFuc3BvcnQuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgPHRocmlmdC9xdC9UUVRjcFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlIDxRTWV0YVR5cGU+CiAjaW5jbHVkZSA8UVRjcFNvY2tldD4KIAotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydDsKLXVzaW5nIHN0ZDo6dHIxOjpmdW5jdGlvbjsKLXVzaW5nIHN0ZDo6dHIxOjpiaW5kOwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpmdW5jdGlvbjsKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogUVRfVVNFX05BTUVTUEFDRQogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBhc3luYyB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIGFzeW5jIHsKIAogc3RydWN0IFRRVGNwU2VydmVyOjpDb25uZWN0aW9uQ29udGV4dCB7CiAgIHNoYXJlZF9wdHI8UVRjcFNvY2tldD4gY29ubmVjdGlvbl87CkBAIC01MCw2NCArNTUsNTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90KQotICAgIDogY29ubmVjdGlvbl8oY29ubmVjdGlvbikKLSAgICAsIHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgaXByb3RfKGlwcm90KQotICAgICwgb3Byb3RfKG9wcm90KQotICB7fQorICAgIDogY29ubmVjdGlvbl8oY29ubmVjdGlvbiksIHRyYW5zcG9ydF8odHJhbnNwb3J0KSwgaXByb3RfKGlwcm90KSwgb3Byb3RfKG9wcm90KSB7fQogfTsKIAogVFFUY3BTZXJ2ZXI6OlRRVGNwU2VydmVyKHNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBRT2JqZWN0KiBwYXJlbnQpCi0gIDogUU9iamVjdChwYXJlbnQpCi0gICwgc2VydmVyXyhzZXJ2ZXIpCi0gICwgcHJvY2Vzc29yXyhwcm9jZXNzb3IpCi0gICwgcGZhY3RfKHBmYWN0KQoteworICA6IFFPYmplY3QocGFyZW50KSwgc2VydmVyXyhzZXJ2ZXIpLCBwcm9jZXNzb3JfKHByb2Nlc3NvciksIHBmYWN0XyhwZmFjdCkgeworICBxUmVnaXN0ZXJNZXRhVHlwZTxRVGNwU29ja2V0Kj4oIlFUY3BTb2NrZXQqIik7CiAgIGNvbm5lY3Qoc2VydmVyLmdldCgpLCBTSUdOQUwobmV3Q29ubmVjdGlvbigpKSwgU0xPVChwcm9jZXNzSW5jb21pbmcoKSkpOwogfQogCi1UUVRjcFNlcnZlcjo6flRRVGNwU2VydmVyKCkKLXsKK1RRVGNwU2VydmVyOjp+VFFUY3BTZXJ2ZXIoKSB7CiB9CiAKLXZvaWQgVFFUY3BTZXJ2ZXI6OnByb2Nlc3NJbmNvbWluZygpCi17Cit2b2lkIFRRVGNwU2VydmVyOjpwcm9jZXNzSW5jb21pbmcoKSB7CiAgIHdoaWxlIChzZXJ2ZXJfLT5oYXNQZW5kaW5nQ29ubmVjdGlvbnMoKSkgewogICAgIC8vIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBRVGNwU29ja2V0OyB0ZWNobmljYWxseSBpdCBjb3VsZCBiZSBkZWxldGVkCiAgICAgLy8gd2hlbiB0aGUgUVRjcFNlcnZlciBpcyBkZXN0cm95ZWQsIGJ1dCBhbnkgcmVhbCBhcHAgc2hvdWxkIGRlbGV0ZSB0aGlzCiAgICAgLy8gY2xhc3MgYmVmb3JlIGRlbGV0aW5nIHRoZSBRVGNwU2VydmVyIHRoYXQgd2UgYXJlIHVzaW5nCiAgICAgc2hhcmVkX3B0cjxRVGNwU29ja2V0PiBjb25uZWN0aW9uKHNlcnZlcl8tPm5leHRQZW5kaW5nQ29ubmVjdGlvbigpKTsKLSAgICAKKwogICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OwogICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdDsKICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3Byb3Q7Ci0gICAgCisKICAgICB0cnkgewogICAgICAgdHJhbnNwb3J0ID0gc2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFFJT0RldmljZVRyYW5zcG9ydChjb25uZWN0aW9uKSk7CiAgICAgICBpcHJvdCA9IHNoYXJlZF9wdHI8VFByb3RvY29sPihwZmFjdF8tPmdldFByb3RvY29sKHRyYW5zcG9ydCkpOwogICAgICAgb3Byb3QgPSBzaGFyZWRfcHRyPFRQcm90b2NvbD4ocGZhY3RfLT5nZXRQcm90b2NvbCh0cmFuc3BvcnQpKTsKLSAgICB9IGNhdGNoKC4uLikgeworICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gRmFpbGVkIHRvIGluaXRpYWxpemUgdHJhbnNwb3J0cy9wcm90b2NvbHMiKTsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICAKLSAgICBjdHhNYXBfW2Nvbm5lY3Rpb24uZ2V0KCldID0KLSAgICAgIHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+KAotICAgICAgICAgbmV3IENvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24sIHRyYW5zcG9ydCwgaXByb3QsIG9wcm90KSk7Ci0gICAgCisKKyAgICBjdHhNYXBfW2Nvbm5lY3Rpb24uZ2V0KCldCisgICAgICAgID0gc2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4obmV3IENvbm5lY3Rpb25Db250ZXh0KGNvbm5lY3Rpb24sIHRyYW5zcG9ydCwgaXByb3QsIG9wcm90KSk7CisKICAgICBjb25uZWN0KGNvbm5lY3Rpb24uZ2V0KCksIFNJR05BTChyZWFkeVJlYWQoKSksIFNMT1QoYmVnaW5EZWNvZGUoKSkpOwotICAgIAotICAgIC8vIG5lZWQgdG8gdXNlIFF1ZXVlZENvbm5lY3Rpb24gc2luY2Ugd2Ugd2lsbCBiZSBkZWxldGluZyB0aGUgc29ja2V0IGluIHRoZSBzbG90Ci0gICAgY29ubmVjdChjb25uZWN0aW9uLmdldCgpLCBTSUdOQUwoZGlzY29ubmVjdGVkKCkpLCBTTE9UKHNvY2tldENsb3NlZCgpKSwKLSAgICAgICAgICAgIFF0OjpRdWV1ZWRDb25uZWN0aW9uKTsKKworICAgIGNvbm5lY3QoY29ubmVjdGlvbi5nZXQoKSwgU0lHTkFMKGRpc2Nvbm5lY3RlZCgpKSwgU0xPVChzb2NrZXRDbG9zZWQoKSkpOwogICB9CiB9CiAKLXZvaWQgVFFUY3BTZXJ2ZXI6OmJlZ2luRGVjb2RlKCkKLXsKK3ZvaWQgVFFUY3BTZXJ2ZXI6OmJlZ2luRGVjb2RlKCkgewogICBRVGNwU29ja2V0KiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKICAgUV9BU1NFUlQoY29ubmVjdGlvbik7CiAKQEAgLTExNSw0MyArMTA3LDQ2IEBACiAgICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gR290IGRhdGEgb24gYW4gdW5rbm93biBRVGNwU29ja2V0Iik7CiAgICAgcmV0dXJuOwogICB9Ci0gIAorCiAgIHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCA9IGN0eE1hcF9bY29ubmVjdGlvbl07Ci0gIAorCiAgIHRyeSB7Ci0gICAgcHJvY2Vzc29yXy0+cHJvY2VzcygKLSAgICAgIGJpbmQoJlRRVGNwU2VydmVyOjpmaW5pc2gsIHRoaXMsCi0gICAgICAgICAgIGN0eCwgc3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzEpLAotICAgICAgY3R4LT5pcHJvdF8sIGN0eC0+b3Byb3RfKTsKLSAgfSBjYXRjaChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmc6ICclcyciLAotICAgICAgICAgICAgIGV4LndoYXQoKSk7Ci0gICAgY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKLSAgfSBjYXRjaCguLi4pIHsKKyAgICBwcm9jZXNzb3JfCisgICAgICAgIC0+cHJvY2VzcyhiaW5kKCZUUVRjcFNlcnZlcjo6ZmluaXNoLCB0aGlzLCBjdHgsIF8xKSwKKyAgICAgICAgICAgICAgICAgIGN0eC0+aXByb3RfLAorICAgICAgICAgICAgICAgICAgY3R4LT5vcHJvdF8pOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmc6ICclcyciLCBleC53aGF0KCkpOworICAgIHNjaGVkdWxlRGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY29ubmVjdGlvbik7CisgIH0gY2F0Y2ggKC4uLikgewogICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFVua25vd24gcHJvY2Vzc29yIGV4Y2VwdGlvbiIpOwotICAgIGN0eE1hcF8uZXJhc2UoY29ubmVjdGlvbik7CisgICAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKICAgfQogfQogCi12b2lkIFRRVGNwU2VydmVyOjpzb2NrZXRDbG9zZWQoKQotewordm9pZCBUUVRjcFNlcnZlcjo6c29ja2V0Q2xvc2VkKCkgewogICBRVGNwU29ja2V0KiBjb25uZWN0aW9uKHFvYmplY3RfY2FzdDxRVGNwU29ja2V0Kj4oc2VuZGVyKCkpKTsKICAgUV9BU1NFUlQoY29ubmVjdGlvbik7Ci0KLSAgaWYgKGN0eE1hcF8uZmluZChjb25uZWN0aW9uKSA9PSBjdHhNYXBfLmVuZCgpKSB7Ci0gICAgcVdhcm5pbmcoIltUUVRjcFNlcnZlcl0gVW5rbm93biBRVGNwU29ja2V0IGNsb3NlZCIpOwotICAgIHJldHVybjsKLSAgfQotICAKLSAgY3R4TWFwXy5lcmFzZShjb25uZWN0aW9uKTsKKyAgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChjb25uZWN0aW9uKTsKIH0KIAotdm9pZCBUUVRjcFNlcnZlcjo6ZmluaXNoKHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KQotewordm9pZCBUUVRjcFNlcnZlcjo6ZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoUVRjcFNvY2tldCogY29ubmVjdGlvbikgeworICBjb25zdCBDb25uZWN0aW9uQ29udGV4dE1hcDo6c2l6ZV90eXBlIGRlbGV0ZWQgPSBjdHhNYXBfLmVyYXNlKGNvbm5lY3Rpb24pOworICBpZiAoMCA9PSBkZWxldGVkKSB7CisgICAgICBxV2FybmluZygiW1RRVGNwU2VydmVyXSBVbmtub3duIFFUY3BTb2NrZXQiKTsKKyAgfQorfQorCit2b2lkIFRRVGNwU2VydmVyOjpzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pIHsKKyAgUU1ldGFPYmplY3Q6Omludm9rZU1ldGhvZCh0aGlzLCAiZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQiLCBRdDo6UXVldWVkQ29ubmVjdGlvbiwgUV9BUkcoUVRjcFNvY2tldCosIGNvbm5lY3Rpb24pKTsKK30KKwordm9pZCBUUVRjcFNlcnZlcjo6ZmluaXNoKHNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KSB7CiAgIGlmICghaGVhbHRoeSkgewogICAgIHFXYXJuaW5nKCJbVFFUY3BTZXJ2ZXJdIFByb2Nlc3NvciBmYWlsZWQgdG8gcHJvY2VzcyBkYXRhIHN1Y2Nlc3NmdWxseSIpOwotICAgIGN0eE1hcF8uZXJhc2UoY3R4LT5jb25uZWN0aW9uXy5nZXQoKSk7CisgICAgZGVsZXRlQ29ubmVjdGlvbkNvbnRleHQoY3R4LT5jb25uZWN0aW9uXy5nZXQoKSk7CiAgIH0KIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKaW5kZXggMTJhNDUwZi4uOGUzZmUzYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKQEAgLTIzLDEzICsyMywxOSBAQAogI2luY2x1ZGUgPFFPYmplY3Q+CiAjaW5jbHVkZSA8UVRjcFNlcnZlcj4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgcHJvdG9jb2wgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBwcm90b2NvbCB7CiBjbGFzcyBUUHJvdG9jb2xGYWN0b3J5OwotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2wKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgYXN5bmMgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBhc3luYyB7CiAKIGNsYXNzIFRBc3luY1Byb2Nlc3NvcjsKIApAQCAtMzksMzQgKzQ1LDM3IEBACiAgKiAgcHJvY2Vzc29yIGFuZCBhIHByb3RvY29sIGZhY3RvcnksIGFuZCB0aGVuIHJ1biB0aGUgUXQgZXZlbnQgbG9vcC4KICAqLwogY2xhc3MgVFFUY3BTZXJ2ZXIgOiBwdWJsaWMgUU9iamVjdCB7Ci0gUV9PQkpFQ1QKLSBwdWJsaWM6Ci0gIFRRVGNwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKLSAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICBRVF9QUkVQRU5EX05BTUVTUEFDRShRT2JqZWN0KSogcGFyZW50ID0gTlVMTCk7CisgIFFfT0JKRUNUCitwdWJsaWM6CisgIFRRVGNwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXIsCisgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICBRT2JqZWN0KiBwYXJlbnQgPSBOVUxMKTsKICAgdmlydHVhbCB+VFFUY3BTZXJ2ZXIoKTsKIAotIHByaXZhdGUgUV9TTE9UUzoKK3ByaXZhdGUgUV9TTE9UUzoKICAgdm9pZCBwcm9jZXNzSW5jb21pbmcoKTsKICAgdm9pZCBiZWdpbkRlY29kZSgpOwogICB2b2lkIHNvY2tldENsb3NlZCgpOworICB2b2lkIGRlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOwogCi0gcHJpdmF0ZToKLSAgVFFUY3BTZXJ2ZXIoY29uc3QgVFFUY3BTZXJ2ZXImKTsKLSAgVFFUY3BTZXJ2ZXImIG9wZXJhdG9yPShjb25zdCBUUVRjcFNlcnZlciYpOwotICAKLSAgY2xhc3MgQ29ubmVjdGlvbkNvbnRleHQ7Citwcml2YXRlOgorICBRX0RJU0FCTEVfQ09QWShUUVRjcFNlcnZlcikKIAotICB2b2lkIGZpbmlzaChib29zdDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gY3R4LCBib29sIGhlYWx0aHkpOworICBzdHJ1Y3QgQ29ubmVjdGlvbkNvbnRleHQ7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKKyAgdm9pZCBzY2hlZHVsZURlbGV0ZUNvbm5lY3Rpb25Db250ZXh0KFFUY3BTb2NrZXQqIGNvbm5lY3Rpb24pOworICB2b2lkIGZpbmlzaChzdGQ6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KTsKIAotICBzdGQ6Om1hcDxRVF9QUkVQRU5EX05BTUVTUEFDRShRVGNwU29ja2V0KSosIGJvb3N0OjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiA+IGN0eE1hcF87CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwZmFjdF87CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxRVGNwU29ja2V0Kiwgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiA+IENvbm5lY3Rpb25Db250ZXh0TWFwOworICBDb25uZWN0aW9uQ29udGV4dE1hcCBjdHhNYXBfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojphc3luYworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfUVRDUF9TRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGFhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgeworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1RDb25uZWN0ZWRDbGllbnQ6OlRDb25uZWN0ZWRDbGllbnQoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbD4mIGlucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sPiYgb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4mIGV2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgY2xpZW50KQorCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xfKGlucHV0UHJvdG9jb2wpLAorICAgIG91dHB1dFByb3RvY29sXyhvdXRwdXRQcm90b2NvbCksCisgICAgZXZlbnRIYW5kbGVyXyhldmVudEhhbmRsZXIpLAorICAgIGNsaWVudF8oY2xpZW50KSwKKyAgICBvcGFxdWVDb250ZXh0XygwKSB7Cit9CisKK1RDb25uZWN0ZWRDbGllbnQ6On5UQ29ubmVjdGVkQ2xpZW50KCkgeworfQorCit2b2lkIFRDb25uZWN0ZWRDbGllbnQ6OnJ1bigpIHsKKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBvcGFxdWVDb250ZXh0XyA9IGV2ZW50SGFuZGxlcl8tPmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CisgIH0KKworICBmb3IgKGJvb2wgZG9uZSA9IGZhbHNlOyAhZG9uZTspIHsKKyAgICBpZiAoZXZlbnRIYW5kbGVyXykgeworICAgICAgZXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQob3BhcXVlQ29udGV4dF8sIGNsaWVudF8pOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgb3BhcXVlQ29udGV4dF8pKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgc3dpdGNoICh0dHguZ2V0VHlwZSgpKSB7CisgICAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEU6CisgICAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQ6CisgICAgICAgIGNhc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUOgorICAgICAgICAgIC8vIENsaWVudCBkaXNjb25uZWN0ZWQgb3Igd2FzIGludGVycnVwdGVkIG9yIGRpZCBub3QgcmVzcG9uZCB3aXRoaW4gdGhlIHJlY2VpdmUgdGltZW91dC4KKyAgICAgICAgICAvLyBObyBsb2dnaW5nIG5lZWRlZC4gIERvbmUuCisgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgIC8vIEFsbCBvdGhlciB0cmFuc3BvcnQgZXhjZXB0aW9ucyBhcmUgbG9nZ2VkLgorICAgICAgICAgIC8vIFN0YXRlIG9mIGNvbm5lY3Rpb24gaXMgdW5rbm93bi4gIERvbmUuCisgICAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBkaWVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mIHRleCkgeworICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVENvbm5lY3RlZENsaWVudCBwcm9jZXNzaW5nIGV4Y2VwdGlvbjogIikgKyB0ZXgud2hhdCgpOworICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKKyAgICAgIC8vIERpc2Nvbm5lY3QgZnJvbSBjbGllbnQsIGJlY2F1c2Ugd2UgY291bGQgbm90IHByb2Nlc3MgdGhlIG1lc3NhZ2UuCisgICAgICBkb25lID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBjbGVhbnVwKCk7Cit9CisKK3ZvaWQgVENvbm5lY3RlZENsaWVudDo6Y2xlYW51cCgpIHsKKyAgaWYgKGV2ZW50SGFuZGxlcl8pIHsKKyAgICBldmVudEhhbmRsZXJfLT5kZWxldGVDb250ZXh0KG9wYXF1ZUNvbnRleHRfLCBpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfKTsKKyAgfQorCisgIHRyeSB7CisgICAgaW5wdXRQcm90b2NvbF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKKyAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUQ29ubmVjdGVkQ2xpZW50IGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIH0KKworICB0cnkgeworICAgIG91dHB1dFByb3RvY29sXy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIH0KKworICB0cnkgeworICAgIGNsaWVudF8tPmNsb3NlKCk7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRDb25uZWN0ZWRDbGllbnQgY2xpZW50IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOworICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgIH0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWU3MGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfCisjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8gMQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKKy8qKgorICogVGhpcyByZXByZXNlbnRzIGEgY2xpZW50IGNvbm5lY3RlZCB0byBhIFRTZXJ2ZXIuICBUaGUKKyAqIHByb2Nlc3NpbmcgbG9vcCBmb3IgYSBjbGllbnQgbXVzdCBwcm92aWRlIHNvbWUgcmVxdWlyZWQKKyAqIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvIGFsbCBpbXBsZW1lbnRhdGlvbnMgc28gaXQgaXMKKyAqIGVuY2Fwc3VsYXRlZCBoZXJlLgorICovCisKK2NsYXNzIFRDb25uZWN0ZWRDbGllbnQgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtW2luXSBwcm9jZXNzb3IgICAgICB0aGUgVFByb2Nlc3NvcgorICAgKiBAcGFyYW1baW5dIGlucHV0UHJvdG9jb2wgIHRoZSBpbnB1dCBUUHJvdG9jb2wKKyAgICogQHBhcmFtW2luXSBvdXRwdXRQcm90b2NvbCB0aGUgb3V0cHV0IFRQcm90b2NvbAorICAgKiBAcGFyYW1baW5dIGV2ZW50SGFuZGxlciAgIHRoZSBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgKiBAcGFyYW1baW5dIGNsaWVudCAgICAgICAgIHRoZSBUVHJhbnNwb3J0IHJlcHJlc2VudGluZyB0aGUgY2xpZW50CisgICAqLworICBUQ29ubmVjdGVkQ2xpZW50KAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiYgaW5wdXRQcm90b2NvbCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIG91dHB1dFByb3RvY29sLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+JiBldmVudEhhbmRsZXIsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4mIGNsaWVudCk7CisKKyAgLyoqCisgICAqIERlc3RydWN0b3IuCisgICAqLworICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50KCk7CisKKyAgLyoqCisgICAqIERyaXZlIHRoZSBjbGllbnQgdW50aWwgaXQgaXMgZG9uZS4KKyAgICogVGhlIGNsaWVudCBwcm9jZXNzaW5nIGxvb3AgaXM6CisgICAqCisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPmNyZWF0ZUNvbnRleHQgb25jZQorICAgKiBbb3B0aW9uYWxdIGNhbGwgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dCBwZXIgcmVxdWVzdAorICAgKiAgICAgICAgICAgIGNhbGwgcHJvY2Vzc29yLT5wcm9jZXNzIHBlciByZXF1ZXN0CisgICAqICAgICAgICAgICAgICBoYW5kbGUgZXhwZWN0ZWQgdHJhbnNwb3J0IGV4Y2VwdGlvbnM6CisgICAqICAgICAgICAgICAgICAgIEVORF9PRl9GSUxFIG1lYW5zIHRoZSBjbGllbnQgaXMgZ29uZQorICAgKiAgICAgICAgICAgICAgICBJTlRFUlJVUFRFRCBtZWFucyB0aGUgY2xpZW50IHdhcyBpbnRlcnJ1cHRlZAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBUU2VydmVyVHJhbnNwb3J0OjppbnRlcnJ1cHRDaGlsZHJlbigpCisgICAqICAgICAgICAgICAgICBoYW5kbGUgdW5leHBlY3RlZCB0cmFuc3BvcnQgZXhjZXB0aW9ucyBieSBsb2dnaW5nCisgICAqICAgICAgICAgICAgICBoYW5kbGUgc3RhbmRhcmQgZXhjZXB0aW9ucyBieSBsb2dnaW5nCisgICAqICAgICAgICAgICAgICBoYW5kbGUgdW5leHBlY3RlZCBleGNlcHRpb25zIGJ5IGxvZ2dpbmcKKyAgICogICAgICAgICAgICBjbGVhbnVwKCkKKyAgICovCisgIHZpcnR1YWwgdm9pZCBydW4oKSAvKiBvdmVycmlkZSAqLzsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogQ2xlYW51cCBhZnRlciBhIGNsaWVudC4gIFRoaXMgaGFwcGVucyBpZiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLAorICAgKiBvciBpZiB0aGUgc2VydmVyIGlzIHN0b3BwZWQsIG9yIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAqCisgICAqIFRoZSBjbGVhbnVwIHByb2Nlc3NpbmcgaXM6CisgICAqIFtvcHRpb25hbF0gY2FsbCBldmVudEhhbmRsZXItPmRlbGV0ZUNvbnRleHQgb25jZQorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBpbnB1dFByb3RvY29sJ3MgVFRyYW5zcG9ydAorICAgKiAgICAgICAgICAgIGNsb3NlIHRoZSBvdXRwdXRQcm90b2NvbCdzIFRUcmFuc3BvcnQKKyAgICogICAgICAgICAgICBjbG9zZSB0aGUgY2xpZW50CisgICAqLworICB2aXJ0dWFsIHZvaWQgY2xlYW51cCgpOworCitwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGNsaWVudF87CisKKyAgLyoqCisgICAqIENvbnRleHQgYWNxdWlyZWQgZnJvbSB0aGUgZXZlbnRIYW5kbGVyXyBpZiBvbmUgZXhpc3RzLgorICAgKi8KKyAgdm9pZCogb3BhcXVlQ29udGV4dF87Cit9OworfQorfQorfQorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UQ09OTkVDVEVEQ0xJRU5UX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKaW5kZXggMjVmZTFmMi4uZjE2ZmNlNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcApAQCAtMTcsMTkgKzE3LDI1IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiVE5vbmJsb2NraW5nU2VydmVyLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2VsaWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1NFTEVDVF9ICisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2VuZGlmCisKICNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNlbmRpZgpAQCAtNTEsNyArNTcsNiBAQAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpZmRlZiBIQVZFX1NDSEVEX0gKQEAgLTYyLDI2ICs2NywyNyBAQAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCiAjZW5kaWYKIAotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIFBSSXUzMiAiSTMydSIKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvLy8gVGhyZWUgc3RhdGVzIGZvciBzb2NrZXRzOiByZWN2IGZyYW1lIHNpemUsIHJlY3YgZGF0YSwgYW5kIHNlbmQgbW9kZQotZW51bSBUU29ja2V0U3RhdGUgewotICBTT0NLRVRfUkVDVl9GUkFNSU5HLAotICBTT0NLRVRfUkVDViwKLSAgU09DS0VUX1NFTkQKLX07CitlbnVtIFRTb2NrZXRTdGF0ZSB7IFNPQ0tFVF9SRUNWX0ZSQU1JTkcsIFNPQ0tFVF9SRUNWLCBTT0NLRVRfU0VORCB9OwogCiAvKioKICAqIEZpdmUgc3RhdGVzIGZvciB0aGUgbm9uYmxvY2tpbmcgc2VydmVyOgpAQCAtMTA1LDcgKzExMSw3IEBACiAgKiBlc3NlbnRpYWxseSBlbmNhcHN1bGF0ZXMgYSBzb2NrZXQgdGhhdCBoYXMgc29tZSBhc3NvY2lhdGVkIGxpYmV2ZW50IHN0YXRlLgogICovCiBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uIHsKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgLy8vIFNlcnZlciBJTyBUaHJlYWQgaGFuZGxpbmcgdGhpcyBjb25uZWN0aW9uCiAgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZF87CiAKQEAgLTExMywxMCArMTE5LDEwIEBACiAgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKIAogICAvLy8gVFByb2Nlc3NvcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKIAogICAvLy8gT2JqZWN0IHdyYXBwaW5nIG5ldHdvcmsgc29ja2V0Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gdFNvY2tldF87CiAKICAgLy8vIExpYmV2ZW50IG9iamVjdAogICBzdHJ1Y3QgZXZlbnQgZXZlbnRfOwpAQCAtMTU3LDQ4ICsxNjMsMzYgQEAKICAgLy8vIENvdW50IG9mIHRoZSBudW1iZXIgb2YgY2FsbHMgZm9yIHVzZSB3aXRoIGdldFJlc2l6ZUJ1ZmZlckV2ZXJ5TigpLgogICBpbnQzMl90IGNhbGxzRm9yUmVzaXplXzsKIAotICAvLy8gVGFzayBoYW5kbGUKLSAgaW50IHRhc2tIYW5kbGVfOwotCi0gIC8vLyBUYXNrIGV2ZW50Ci0gIHN0cnVjdCBldmVudCB0YXNrRXZlbnRfOwotCiAgIC8vLyBUcmFuc3BvcnQgdG8gcmVhZCBmcm9tCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGlucHV0VHJhbnNwb3J0XzsKIAogICAvLy8gVHJhbnNwb3J0IHRoYXQgcHJvY2Vzc29yIHdyaXRlcyB0bwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gb3V0cHV0VHJhbnNwb3J0XzsKIAogICAvLy8gZXh0cmEgdHJhbnNwb3J0IGdlbmVyYXRlZCBieSB0cmFuc3BvcnQgZmFjdG9yeSAoZS5nLiBCdWZmZXJlZFJvdXRlclRyYW5zcG9ydCkKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeUlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZmFjdG9yeU91dHB1dFRyYW5zcG9ydF87CiAKICAgLy8vIFByb3RvY29sIGRlY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87CiAKICAgLy8vIFByb3RvY29sIGVuY29kZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKIAogICAvLy8gU2VydmVyIGV2ZW50IGhhbmRsZXIsIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKIAogICAvLy8gVGhyaWZ0IGNhbGwgY29udGV4dCwgaWYgYW55Ci0gIHZvaWQgKmNvbm5lY3Rpb25Db250ZXh0XzsKKyAgdm9pZCogY29ubmVjdGlvbkNvbnRleHRfOwogCiAgIC8vLyBHbyBpbnRvIHJlYWQgbW9kZQotICB2b2lkIHNldFJlYWQoKSB7Ci0gICAgc2V0RmxhZ3MoRVZfUkVBRCB8IEVWX1BFUlNJU1QpOwotICB9CisgIHZvaWQgc2V0UmVhZCgpIHsgc2V0RmxhZ3MoRVZfUkVBRCB8IEVWX1BFUlNJU1QpOyB9CiAKICAgLy8vIEdvIGludG8gd3JpdGUgbW9kZQotICB2b2lkIHNldFdyaXRlKCkgewotICAgIHNldEZsYWdzKEVWX1dSSVRFIHwgRVZfUEVSU0lTVCk7Ci0gIH0KKyAgdm9pZCBzZXRXcml0ZSgpIHsgc2V0RmxhZ3MoRVZfV1JJVEUgfCBFVl9QRVJTSVNUKTsgfQogCiAgIC8vLyBTZXQgc29ja2V0IGlkbGUKLSAgdm9pZCBzZXRJZGxlKCkgewotICAgIHNldEZsYWdzKDApOwotICB9CisgIHZvaWQgc2V0SWRsZSgpIHsgc2V0RmxhZ3MoMCk7IH0KIAogICAvKioKICAgICogU2V0IGV2ZW50IGZsYWdzIGZvciB0aGlzIGNvbm5lY3Rpb24uCkBAIC0yMTUsMTYgKzIwOSwxMiBAQAogICAgKi8KICAgdm9pZCB3b3JrU29ja2V0KCk7CiAKLSAgLy8vIENsb3NlIHRoaXMgY29ubmVjdGlvbiBhbmQgZnJlZSBvciByZXNldCBpdHMgcmVzb3VyY2VzLgotICB2b2lkIGNsb3NlKCk7Ci0KLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgY2xhc3MgVGFzazsKIAogICAvLy8gQ29uc3RydWN0b3IKLSAgVENvbm5lY3Rpb24oaW50IHNvY2tldCwgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwgc29ja2xlbl90IGFkZHJMZW4pIHsKKyAgVENvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CiAgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOwogICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CiAKQEAgLTIzNCwyNyArMjI0LDMyIEBACiAgICAgLy8gQWxsb2NhdGUgaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIHRoZXNlIG9ubHkgbmVlZCB0byBiZSBhbGxvY2F0ZWQKICAgICAvLyBvbmNlIHBlciBUQ29ubmVjdGlvbiAodGhleSBkb24ndCBuZWVkIHRvIGJlIHJlYWxsb2NhdGVkIG9uIGluaXQoKSBjYWxsKQogICAgIGlucHV0VHJhbnNwb3J0Xy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclNpemVfKSk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpOwotICAgIHRTb2NrZXRfLnJlc2V0KG5ldyBUU29ja2V0KCkpOwotICAgIGluaXQoc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisgICAgb3V0cHV0VHJhbnNwb3J0Xy5yZXNldCgKKyAgICAgICAgbmV3IFRNZW1vcnlCdWZmZXIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNlcnZlcl8tPmdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSkpKTsKKworICAgIHRTb2NrZXRfID0gIHNvY2tldDsKKworICAgIGluaXQoaW9UaHJlYWQpOwogICB9CiAKLSAgflRDb25uZWN0aW9uKCkgewotICAgIHN0ZDo6ZnJlZShyZWFkQnVmZmVyXyk7Ci0gIH0KKyAgflRDb25uZWN0aW9uKCkgeyBzdGQ6OmZyZWUocmVhZEJ1ZmZlcl8pOyB9CiAKLSAvKioKLSAgICogQ2hlY2sgYnVmZmVycyBhZ2FpbnN0IGFueSBzaXplIGxpbWl0cyBhbmQgc2hyaW5rIGl0IGlmIGV4Y2VlZGVkLgotICAgKgotICAgKiBAcGFyYW0gcmVhZExpbWl0IHdlIHJlZHVjZSByZWFkIGJ1ZmZlciBzaXplIHRvIHRoaXMgKGlmIG5vbnplcm8pLgotICAgKiBAcGFyYW0gd3JpdGVMaW1pdCBpZiBub256ZXJvIGFuZCB3cml0ZSBidWZmZXIgaXMgbGFyZ2VyLCByZXBsYWNlIGl0LgotICAgKi8KKyAgLy8vIENsb3NlIHRoaXMgY29ubmVjdGlvbiBhbmQgZnJlZSBvciByZXNldCBpdHMgcmVzb3VyY2VzLgorICB2b2lkIGNsb3NlKCk7CisKKyAgLyoqCisgICAgKiBDaGVjayBidWZmZXJzIGFnYWluc3QgYW55IHNpemUgbGltaXRzIGFuZCBzaHJpbmsgaXQgaWYgZXhjZWVkZWQuCisgICAgKgorICAgICogQHBhcmFtIHJlYWRMaW1pdCB3ZSByZWR1Y2UgcmVhZCBidWZmZXIgc2l6ZSB0byB0aGlzIChpZiBub256ZXJvKS4KKyAgICAqIEBwYXJhbSB3cml0ZUxpbWl0IGlmIG5vbnplcm8gYW5kIHdyaXRlIGJ1ZmZlciBpcyBsYXJnZXIsIHJlcGxhY2UgaXQuCisgICAgKi8KICAgdm9pZCBjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCk7CiAKICAgLy8vIEluaXRpYWxpemUKLSAgdm9pZCBpbml0KGludCBzb2NrZXQsIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCwKLSAgICAgICAgICAgIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbik7CisgIHZvaWQgaW5pdChUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQpOworCisgIC8vLyBzZXQgc29ja2V0IGZvciBjb25uZWN0aW9uCisgIHZvaWQgc2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOwogCiAgIC8qKgogICAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCkBAIC0yNzIsNyArMjY3LDcgQEAKICAgICogQHBhcmFtIHYgdm9pZCogY2FsbGJhY2sgYXJnIHdoZXJlIHdlIHBsYWNlZCBUQ29ubmVjdGlvbidzICJ0aGlzIi4KICAgICovCiAgIHN0YXRpYyB2b2lkIGV2ZW50SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IC8qIHdoaWNoICovLCB2b2lkKiB2KSB7Ci0gICAgYXNzZXJ0KGZkID09ICgoVENvbm5lY3Rpb24qKXYpLT5nZXRUU29ja2V0KCktPmdldFNvY2tldEZEKCkpOworICAgIGFzc2VydChmZCA9PSBzdGF0aWNfY2FzdDxldnV0aWxfc29ja2V0X3Q+KCgoVENvbm5lY3Rpb24qKXYpLT5nZXRUU29ja2V0KCktPmdldFNvY2tldEZEKCkpKTsKICAgICAoKFRDb25uZWN0aW9uKil2KS0+d29ya1NvY2tldCgpOwogICB9CiAKQEAgLTI4MywxMTggKzI3OCwxMDAgQEAKICAgICoKICAgICogRG9uJ3QgY2FsbCB0aGlzIGZyb20gdGhlIElPIHRocmVhZCBpdHNlbGYuCiAgICAqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bmFibGUgdG8gbm90aWZ5IChjaGVjayBlcnJubykuCisgICAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bmFibGUgdG8gbm90aWZ5IChjaGVjayBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUikuCiAgICAqLwotICBib29sIG5vdGlmeUlPVGhyZWFkKCkgewotICAgIHJldHVybiBpb1RocmVhZF8tPm5vdGlmeSh0aGlzKTsKLSAgfQorICBib29sIG5vdGlmeUlPVGhyZWFkKCkgeyByZXR1cm4gaW9UaHJlYWRfLT5ub3RpZnkodGhpcyk7IH0KIAogICAvKgogICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhpcyBjb25uZWN0aW9uJ3MgY3VycmVudGx5IGFzc2lnbmVkIElPCiAgICAqIHRocmVhZC4KICAgICovCi0gIGludCBnZXRJT1RocmVhZE51bWJlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaW9UaHJlYWRfLT5nZXRUaHJlYWROdW1iZXIoKTsKLSAgfQorICBpbnQgZ2V0SU9UaHJlYWROdW1iZXIoKSBjb25zdCB7IHJldHVybiBpb1RocmVhZF8tPmdldFRocmVhZE51bWJlcigpOyB9CiAKICAgLy8vIEZvcmNlIGNvbm5lY3Rpb24gc2h1dGRvd24gZm9yIHRoaXMgY29ubmVjdGlvbi4KICAgdm9pZCBmb3JjZUNsb3NlKCkgewogICAgIGFwcFN0YXRlXyA9IEFQUF9DTE9TRV9DT05ORUNUSU9OOwogICAgIGlmICghbm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOworICAgICAgY2xvc2UoKTsKICAgICAgIHRocm93IFRFeGNlcHRpb24oIlRDb25uZWN0aW9uOjpmb3JjZUNsb3NlOiBmYWlsZWQgd3JpdGUgb24gbm90aWZ5IHBpcGUiKTsKICAgICB9CiAgIH0KIAogICAvLy8gcmV0dXJuIHRoZSBzZXJ2ZXIgdGhpcyBjb25uZWN0aW9uIHdhcyBpbml0aWFsaXplZCBmb3IuCi0gIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgewotICAgIHJldHVybiBzZXJ2ZXJfOwotICB9CisgIFROb25ibG9ja2luZ1NlcnZlciogZ2V0U2VydmVyKCkgY29uc3QgeyByZXR1cm4gc2VydmVyXzsgfQogCiAgIC8vLyBnZXQgc3RhdGUgb2YgY29ubmVjdGlvbi4KLSAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgewotICAgIHJldHVybiBhcHBTdGF0ZV87Ci0gIH0KKyAgVEFwcFN0YXRlIGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gYXBwU3RhdGVfOyB9CiAKICAgLy8vIHJldHVybiB0aGUgVFNvY2tldCB0cmFuc3BvcnQgd3JhcHBpbmcgdGhpcyBuZXR3b3JrIGNvbm5lY3Rpb24KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gZ2V0VFNvY2tldCgpIGNvbnN0IHsKLSAgICByZXR1cm4gdFNvY2tldF87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7IHJldHVybiB0U29ja2V0XzsgfQogCiAgIC8vLyByZXR1cm4gdGhlIHNlcnZlciBldmVudCBoYW5kbGVyIGlmIGFueQotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KIAogICAvLy8gcmV0dXJuIHRoZSBUaHJpZnQgY29ubmVjdGlvbiBjb250ZXh0IGlmIGFueQotICB2b2lkKiBnZXRDb25uZWN0aW9uQ29udGV4dCgpIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbkNvbnRleHRfOwotICB9Ci0KKyAgdm9pZCogZ2V0Q29ubmVjdGlvbkNvbnRleHQoKSB7IHJldHVybiBjb25uZWN0aW9uQ29udGV4dF87IH0KIH07CiAKLWNsYXNzIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gcHVibGljOgotICBUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAotICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKSA6Ci0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIGNvbm5lY3Rpb25fKGNvbm5lY3Rpb24pLAotICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKLSAgICBjb25uZWN0aW9uQ29udGV4dF8oY29ubmVjdGlvbl8tPmdldENvbm5lY3Rpb25Db250ZXh0KCkpIHt9CitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpUYXNrIDogcHVibGljIFJ1bm5hYmxlIHsKK3B1YmxpYzoKKyAgVGFzayhzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAorICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCwKKyAgICAgICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbikKKyAgICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKKyAgICAgIGlucHV0XyhpbnB1dCksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBjb25uZWN0aW9uXyhjb25uZWN0aW9uKSwKKyAgICAgIHNlcnZlckV2ZW50SGFuZGxlcl8oY29ubmVjdGlvbl8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpKSwKKyAgICAgIGNvbm5lY3Rpb25Db250ZXh0Xyhjb25uZWN0aW9uXy0+Z2V0Q29ubmVjdGlvbkNvbnRleHQoKSkge30KIAogICB2b2lkIHJ1bigpIHsKICAgICB0cnkgewogICAgICAgZm9yICg7OykgewotICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CiAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBjb25uZWN0aW9uXy0+Z2V0VFNvY2tldCgpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoIXByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRfLCBvdXRwdXRfLCBjb25uZWN0aW9uQ29udGV4dF8pIHx8Ci0gICAgICAgICAgICAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7CisgICAgICAgIGlmICghcHJvY2Vzc29yXy0+cHJvY2VzcyhpbnB1dF8sIG91dHB1dF8sIGNvbm5lY3Rpb25Db250ZXh0XykKKyAgICAgICAgICAgIHx8ICFpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewogICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBjbGllbnQgZGllZDogJXMiLCB0dHgud2hhdCgpKTsKLSAgICB9IGNhdGNoIChjb25zdCBiYWRfYWxsb2MmKSB7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfYWxsb2MmKSB7CiAgICAgICBHbG9iYWxPdXRwdXQoIlROb25ibG9ja2luZ1NlcnZlcjogY2F1Z2h0IGJhZF9hbGxvYyBleGNlcHRpb24uIik7CiAgICAgICBleGl0KDEpOwogICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiB4KSB7CiAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IHByb2Nlc3MoKSBleGNlcHRpb246ICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksIHgud2hhdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWlkKHgpLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeC53aGF0KCkpOwogICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigKLSAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlcjogdW5rbm93biBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZy4iKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogdW5rbm93biBleGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZy4iKTsKICAgICB9CiAKICAgICAvLyBTaWduYWwgY29tcGxldGlvbiBiYWNrIHRvIHRoZSBsaWJldmVudCB0aHJlYWQgdmlhIGEgcGlwZQogICAgIGlmICghY29ubmVjdGlvbl8tPm5vdGlmeUlPVGhyZWFkKCkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogZmFpbGVkIHRvIG5vdGlmeUlPVGhyZWFkLCBjbG9zaW5nLiIpOworICAgICAgY29ubmVjdGlvbl8tPnNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgIGNvbm5lY3Rpb25fLT5jbG9zZSgpOwogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpUYXNrOjpydW46IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOwogICAgIH0KICAgfQogCi0gIFRDb25uZWN0aW9uKiBnZXRUQ29ubmVjdGlvbigpIHsKLSAgICByZXR1cm4gY29ubmVjdGlvbl87Ci0gIH0KKyAgVENvbm5lY3Rpb24qIGdldFRDb25uZWN0aW9uKCkgeyByZXR1cm4gY29ubmVjdGlvbl87IH0KIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Citwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwogICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwogICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dF87CiB9OwogCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoaW50IHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pIHsKLSAgdFNvY2tldF8tPnNldFNvY2tldEZEKHNvY2tldCk7Ci0gIHRTb2NrZXRfLT5zZXRDYWNoZWRBZGRyZXNzKGFkZHIsIGFkZHJMZW4pOwotCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CiAgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOwogICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOwogICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKQEAgLTQxMiwyMiArMzg5LDIzIEBACiAgIGNhbGxzRm9yUmVzaXplXyA9IDA7CiAKICAgLy8gZ2V0IGlucHV0L3RyYW5zcG9ydHMKLSAgZmFjdG9yeUlucHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0Xyk7Ci0gIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpLT5nZXRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydF8pOworICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0gc2VydmVyXy0+Z2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCktPmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XyA9IHNlcnZlcl8tPmdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKS0+Z2V0VHJhbnNwb3J0KG91dHB1dFRyYW5zcG9ydF8pOwogCiAgIC8vIENyZWF0ZSBwcm90b2NvbAotICBpbnB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldElucHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKAotICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7Ci0gIG91dHB1dFByb3RvY29sXyA9IHNlcnZlcl8tPmdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbCgKLSAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgaWYgKHNlcnZlcl8tPmdldEhlYWRlclRyYW5zcG9ydCgpKSB7CisgICAgaW5wdXRQcm90b2NvbF8gPSBzZXJ2ZXJfLT5nZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpLT5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICAgIG91dHB1dFByb3RvY29sXyA9IGlucHV0UHJvdG9jb2xfOworICB9IGVsc2UgeworICAgIGlucHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKS0+Z2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgb3V0cHV0UHJvdG9jb2xfID0gc2VydmVyXy0+Z2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCktPmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKKyAgfQogCiAgIC8vIFNldCB1cCBmb3IgYW55IHNlcnZlciBldmVudCBoYW5kbGVyCiAgIHNlcnZlckV2ZW50SGFuZGxlcl8gPSBzZXJ2ZXJfLT5nZXRFdmVudEhhbmRsZXIoKTsKLSAgaWYgKHNlcnZlckV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IHNlcnZlckV2ZW50SGFuZGxlcl8tPmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbF8pOworICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXykgeworICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9IHNlcnZlckV2ZW50SGFuZGxlcl8tPmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXyk7CiAgIH0gZWxzZSB7CiAgICAgY29ubmVjdGlvbkNvbnRleHRfID0gTlVMTDsKICAgfQpAQCAtNDM2LDggKzQxNCwxMiBAQAogICBwcm9jZXNzb3JfID0gc2VydmVyXy0+Z2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRTb2NrZXRfKTsKIH0KIAordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCkgeworICB0U29ja2V0XyA9IHNvY2tldDsKK30KKwogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCkgewotICBpbnQgZ290PTAsIGxlZnQ9MCwgc2VudD0wOworICBpbnQgZ290ID0gMCwgbGVmdCA9IDAsIHNlbnQgPSAwOwogICB1aW50MzJfdCBmZXRjaCA9IDA7CiAKICAgc3dpdGNoIChzb2NrZXRTdGF0ZV8pIHsKQEAgLTQ2MSwxMCArNDQzLDE0IEBACiAgICAgICB9CiAgICAgICByZWFkQnVmZmVyUG9zXyArPSBmZXRjaDsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOwotICAgICAgY2xvc2UoKTsKKyAgICAgIC8vSW4gTm9uYmxvY2tpbmcgU1NMU29ja2V0IHNvbWUgb3BlcmF0aW9ucyBuZWVkIHRvIGJlIHJldHJpZWQgYWdhaW4uCisgICAgICAvL0N1cnJlbnQgYXBwcm9hY2ggaXMgcGFyc2luZyBleGNlcHRpb24gbWVzc2FnZSwgYnV0IGEgYmV0dGVyIHNvbHV0aW9uIG5lZWRzIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgIGlmKCFzdHJzdHIodGUud2hhdCgpLCAicmV0cnkiKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7CisgICAgICAgIGNsb3NlKCk7CiAKLSAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZWFkQnVmZmVyUG9zXyA8IHNpemVvZihmcmFtaW5nLnNpemUpKSB7CkBAIC00NzcsMTYgKzQ2MywzMSBAQAogICAgIGlmIChyZWFkV2FudF8gPiBzZXJ2ZXJfLT5nZXRNYXhGcmFtZVNpemUoKSkgewogICAgICAgLy8gRG9uJ3QgYWxsb3cgZ2lhbnQgZnJhbWUgc2l6ZXMuICBUaGlzIHByZXZlbnRzIGJhZCBjbGllbnRzIGZyb20KICAgICAgIC8vIGNhdXNpbmcgdXMgdG8gdHJ5IGFuZCBhbGxvY2F0ZSBhIGdpYW50IGJ1ZmZlci4KLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogZnJhbWUgc2l6ZSB0b28gbGFyZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiKCUiUFJJdTMyIiA+ICV6dSkgZnJvbSBjbGllbnQgJXMuIHJlbW90ZSBzaWRlIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBURnJhbWVkVHJhbnNwb3J0PyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRXYW50Xywgc2VydmVyXy0+Z2V0TWF4RnJhbWVTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRTb2NrZXRfLT5nZXRTb2NrZXRJbmZvKCkuY19zdHIoKSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IGZyYW1lIHNpemUgdG9vIGxhcmdlICIKKyAgICAgICAgICAiKCUiIFBSSXUzMiAiID4gJSIgUFJJdTY0CisgICAgICAgICAgIikgZnJvbSBjbGllbnQgJXMuICIKKyAgICAgICAgICAiUmVtb3RlIHNpZGUgbm90IHVzaW5nIFRGcmFtZWRUcmFuc3BvcnQ/IiwKKyAgICAgICAgICByZWFkV2FudF8sCisgICAgICAgICAgKHVpbnQ2NF90KXNlcnZlcl8tPmdldE1heEZyYW1lU2l6ZSgpLAorICAgICAgICAgIHRTb2NrZXRfLT5nZXRTb2NrZXRJbmZvKCkuY19zdHIoKSk7CiAgICAgICBjbG9zZSgpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBzaXplIGtub3duOyBub3cgZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZQogICAgIHRyYW5zaXRpb24oKTsKKworICAgIC8vIElmIHRoZSBzb2NrZXQgaGFzIG1vcmUgZGF0YSB0aGFuIHRoZSBmcmFtZSBoZWFkZXIsIGNvbnRpbnVlIHRvIHdvcmsgb24gaXQuIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBmb3IKKyAgICAvLyByZWd1bGFyIHNvY2tldHMsIGJlY2F1c2UgaWYgdGhlcmUgaXMgbW9yZSBkYXRhLCBsaWJldmVudCB3aWxsIGZpcmUgdGhlIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgcmVhZAorICAgIC8vIHJlYWRpbmVzcywgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgd29ya1NvY2tldCgpLiBIb3dldmVyLCBzb21lIHNvY2tldCB0eXBlcyAoc3VjaCBhcyBUU1NMU29ja2V0KSBtYXkgaGF2ZSB0aGUKKyAgICAvLyBkYXRhIHNpdHRpbmcgaW4gdGhlaXIgaW50ZXJuYWwgYnVmZmVycyBhbmQgZnJvbSBsaWJldmVudCdzIHBlcnNwZWN0aXZlLCB0aGVyZSBpcyBubyBmdXJ0aGVyIGRhdGEgYXZhaWxhYmxlLiBJbgorICAgIC8vIHRoYXQgY2FzZSwgbm90IGhhdmluZyB0aGlzIHdvcmtTb2NrZXQoKSBjYWxsIGhlcmUgd291bGQgcmVzdWx0IGluIGEgaGFuZyBhcyB3ZSB3aWxsIG5ldmVyIGdldCB0byB3b3JrIHRoZSBzb2NrZXQsCisgICAgLy8gZGVzcGl0ZSBoYXZpbmcgbW9yZSBkYXRhLgorICAgIGlmICh0U29ja2V0Xy0+aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSkKKyAgICB7CisgICAgICAgIHdvcmtTb2NrZXQoKTsKKyAgICB9CisKICAgICByZXR1cm47CiAKICAgY2FzZSBTT0NLRVRfUkVDVjoKQEAgLTQ5NywxMCArNDk4LDEzIEBACiAgICAgICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAogICAgICAgZmV0Y2ggPSByZWFkV2FudF8gLSByZWFkQnVmZmVyUG9zXzsKICAgICAgIGdvdCA9IHRTb2NrZXRfLT5yZWFkKHJlYWRCdWZmZXJfICsgcmVhZEJ1ZmZlclBvc18sIGZldGNoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgICAvL0luIE5vbmJsb2NraW5nIFNTTFNvY2tldCBzb21lIG9wZXJhdGlvbnMgbmVlZCB0byBiZSByZXRyaWVkIGFnYWluLgorICAgICAgLy9DdXJyZW50IGFwcHJvYWNoIGlzIHBhcnNpbmcgZXhjZXB0aW9uIG1lc3NhZ2UsIGJ1dCBhIGJldHRlciBzb2x1dGlvbiBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQuCisgICAgICBpZighc3Ryc3RyKHRlLndoYXQoKSwgInJldHJ5IikpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVENvbm5lY3Rpb246OndvcmtTb2NrZXQoKTogJXMiLCB0ZS53aGF0KCkpOworICAgICAgICBjbG9zZSgpOworICAgICAgfQogCiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTMwLDcgKzUzNCw3IEBACiAKICAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIHRvIHNlbmQsIHRoZW4gbGV0IHVzIG1vdmUgb24KICAgICBpZiAod3JpdGVCdWZmZXJQb3NfID09IHdyaXRlQnVmZmVyU2l6ZV8pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiV0FSTklORzogU2VuZCBzdGF0ZSB3aXRoIG5vIGRhdGEgdG8gc2VuZFxuIik7CisgICAgICBHbG9iYWxPdXRwdXQoIldBUk5JTkc6IFNlbmQgc3RhdGUgd2l0aCBubyBkYXRhIHRvIHNlbmQiKTsKICAgICAgIHRyYW5zaXRpb24oKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MzgsOCArNTQyLDcgQEAKICAgICB0cnkgewogICAgICAgbGVmdCA9IHdyaXRlQnVmZmVyU2l6ZV8gLSB3cml0ZUJ1ZmZlclBvc187CiAgICAgICBzZW50ID0gdFNvY2tldF8tPndyaXRlX3BhcnRpYWwod3JpdGVCdWZmZXJfICsgd3JpdGVCdWZmZXJQb3NfLCBsZWZ0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdGUpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzICIsIHRlLndoYXQoKSk7CiAgICAgICBjbG9zZSgpOwogICAgICAgcmV0dXJuOwpAQCAtNTYzLDYgKzU2NiwxMyBAQAogICB9CiB9CiAKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpnZXRIZWFkZXJUcmFuc3BvcnQoKSB7CisgIC8vIEN1cnJlbnRseSBpZiB0aGVyZSBpcyBubyBvdXRwdXQgcHJvdG9jb2wgZmFjdG9yeSwKKyAgLy8gd2UgYXNzdW1lIGhlYWRlciB0cmFuc3BvcnQgKHdpdGhvdXQgaGF2aW5nIHRvIGNyZWF0ZQorICAvLyBhIG5ldyB0cmFuc3BvcnQgYW5kIGNoZWNrKQorICByZXR1cm4gZ2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgPT0gTlVMTDsKK30KKwogLyoqCiAgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmFuc2l0aW9ucyBmcm9tIG9uZSBzdGF0ZSBpbnRvCiAgKiBhbm90aGVyLiBUaGlzIG1lYW5zIHRoYXQgaXQgaGFzIGZpbmlzaGVkIHdyaXRpbmcgdGhlIGRhdGEgdGhhdCBpdCBuZWVkZWQKQEAgLTU3OSwxMiArNTg5LDIwIEBACiAgIGNhc2UgQVBQX1JFQURfUkVRVUVTVDoKICAgICAvLyBXZSBhcmUgZG9uZSByZWFkaW5nIHRoZSByZXF1ZXN0LCBwYWNrYWdlIHRoZSByZWFkIGJ1ZmZlciBpbnRvIHRyYW5zcG9ydAogICAgIC8vIGFuZCBnZXQgYmFjayBzb21lIGRhdGEgZnJvbSB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24KLSAgICBpbnB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHJlYWRCdWZmZXJfLCByZWFkQnVmZmVyUG9zXyk7Ci0gICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKLSAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KLSAgICAvLyB3cml0ZSB0aGUgZnJhbWUgc2l6ZSB0aGVyZSBsYXRlci4KLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5nZXRXcml0ZVB0cig0KTsKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIGlmIChzZXJ2ZXJfLT5nZXRIZWFkZXJUcmFuc3BvcnQoKSkgeworICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXywgcmVhZEJ1ZmZlclBvc18pOworICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+cmVzZXRCdWZmZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2F2ZWQgcm9vbSBmb3IgdGhlIGZyYW1pbmcgc2l6ZSBpbiBjYXNlIGhlYWRlciB0cmFuc3BvcnQgbmVlZGVkIGl0LAorICAgICAgLy8gYnV0IGp1c3Qgc2tpcCBpdCBmb3IgdGhlIG5vbi1oZWFkZXIgY2FzZQorICAgICAgaW5wdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihyZWFkQnVmZmVyXyArIDQsIHJlYWRCdWZmZXJQb3NfIC0gNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcigpOworCisgICAgICAvLyBQcmVwZW5kIGZvdXIgYnl0ZXMgb2YgYmxhbmsgc3BhY2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4KKyAgICAgIC8vIHdyaXRlIHRoZSBmcmFtZSBzaXplIHRoZXJlIGxhdGVyLgorICAgICAgb3V0cHV0VHJhbnNwb3J0Xy0+Z2V0V3JpdGVQdHIoNCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnRfLT53cm90ZUJ5dGVzKDQpOworICAgIH0KIAogICAgIHNlcnZlcl8tPmluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKIApAQCAtNTkyLDQ1ICs2MTAsNDkgQEAKICAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHVwIGEgVGFzayB0byBkbyB0aGlzIHdvcmsgYW5kIHdlIHdpbGwgd2FpdCBvbiBpdAogCiAgICAgICAvLyBDcmVhdGUgdGFzayBhbmQgZGlzcGF0Y2ggdG8gdGhlIHRocmVhZCBtYW5hZ2VyCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgVGFzayhwcm9jZXNzb3JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+KAorICAgICAgICAgIG5ldyBUYXNrKHByb2Nlc3Nvcl8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHRoaXMpKTsKICAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBpcyBub3cgd2FpdGluZyBvbiB0aGUgdGFzayB0byBmaW5pc2gKICAgICAgIGFwcFN0YXRlXyA9IEFQUF9XQUlUX1RBU0s7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBzZXJ2ZXJfLT5hZGRUYXNrKHRhc2spOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gJiBpc2UpIHsKLSAgICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgotICAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKLSAgICAgICAgICBjbG9zZSgpOwotICAgICAgICB9Ci0KICAgICAgIC8vIFNldCB0aGlzIGNvbm5lY3Rpb24gaWRsZSBzbyB0aGF0IGxpYmV2ZW50IGRvZXNuJ3QgcHJvY2VzcyBtb3JlCiAgICAgICAvLyBkYXRhIG9uIGl0IHdoaWxlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIHRoZSB0aHJlYWRtYW5hZ2VyIHRvCiAgICAgICAvLyBmaW5pc2ggdGhpcyB0YXNrCiAgICAgICBzZXRJZGxlKCk7CisKKyAgICAgIHRyeSB7CisgICAgICAgIHNlcnZlcl8tPmFkZFRhc2sodGFzayk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24mIGlzZSkgeworICAgICAgICAvLyBUaGUgVGhyZWFkTWFuYWdlciBpcyBub3QgcmVhZHkgdG8gaGFuZGxlIGFueSBtb3JlIHRhc2tzIChpdCdzIHByb2JhYmx5IHNodXR0aW5nIGRvd24pLgorICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgaXNlLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJiB0bykgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJbRVJST1JdIFRpbWVkT3V0RXhjZXB0aW9uOiBTZXJ2ZXI6OnByb2Nlc3MoKSAlcyIsIHRvLndoYXQoKSk7CisgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KKwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSB7CiAgICAgICB0cnkgewotCWlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLQkgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLAotCQkJCQkJZ2V0VFNvY2tldCgpKTsKLQl9CisgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CisgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+cHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHRfLCBnZXRUU29ja2V0KCkpOworICAgICAgICB9CiAgICAgICAgIC8vIEludm9rZSB0aGUgcHJvY2Vzc29yCi0gICAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8pOwotICAgICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiAmdHR4KSB7Ci0gICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlciB0cmFuc3BvcnQgZXJyb3IgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzKCk6ICVzIiwgdHR4LndoYXQoKSk7CisgICAgICAgIHByb2Nlc3Nvcl8tPnByb2Nlc3MoaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgY29ubmVjdGlvbkNvbnRleHRfKTsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICAgIlROb25ibG9ja2luZ1NlcnZlciB0cmFuc3BvcnQgZXJyb3IgaW4gIgorICAgICAgICAgICAgInByb2Nlc3MoKTogJXMiLAorICAgICAgICAgICAgdHR4LndoYXQoKSk7CiAgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24gJngpIHsKKyAgICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiB4KSB7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlNlcnZlcjo6cHJvY2VzcygpIHVuY2F1Z2h0IGV4Y2VwdGlvbjogJXM6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLCB4LndoYXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWlkKHgpLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LndoYXQoKSk7CiAgICAgICAgIHNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgcmV0dXJuOwpAQCAtNjQxLDkgKzY2MywxMCBAQAogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQorICAgIC8vIGZhbGx0aHJvdWdoCiAKLSAgICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KLSAgICAvLyB0aGUgd3JpdGVCdWZmZXJfCisgIC8vIEludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUsIHRoZSBjYWxsIHRvIHByb2Nlc3MgaGFzIHdyaXR0ZW4gaW50bworICAvLyB0aGUgd3JpdGVCdWZmZXJfCiAKICAgY2FzZSBBUFBfV0FJVF9UQVNLOgogICAgIC8vIFdlIGhhdmUgbm93IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB0YXNrIGFuZCB0aGUgcmVzdWx0IGhhcyBiZWVuIHdyaXR0ZW4KQEAgLTY3MSw5ICs2OTQsNiBAQAogICAgICAgYXBwU3RhdGVfID0gQVBQX1NFTkRfUkVTVUxUOwogICAgICAgc2V0V3JpdGUoKTsKIAotICAgICAgLy8gVHJ5IHRvIHdvcmsgdGhlIHNvY2tldCBpbW1lZGlhdGVseQotICAgICAgLy8gd29ya1NvY2tldCgpOwotCiAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC02OTIsOCArNzEyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl8tPmdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkpOwogICAgICAgY2FsbHNGb3JSZXNpemVfID0gMDsKICAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKIAotICAgIC8vIE4uQi46IFdlIGFsc28gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSBpbnRvIHRoZSBJTklUIHN0YXRlIQorICAvLyBOLkIuOiBXZSBhbHNvIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoIGhlcmUgaW50byB0aGUgSU5JVCBzdGF0ZSEKIAogICBMQUJFTF9BUFBfSU5JVDoKICAgY2FzZSBBUFBfSU5JVDoKQEAgLTcxMiwxMiArNzMzLDExIEBACiAgICAgLy8gUmVnaXN0ZXIgcmVhZCBldmVudAogICAgIHNldFJlYWQoKTsKIAotICAgIC8vIFRyeSB0byB3b3JrIHRoZSBzb2NrZXQgcmlnaHQgYXdheQotICAgIC8vIHdvcmtTb2NrZXQoKTsKLQogICAgIHJldHVybjsKIAogICBjYXNlIEFQUF9SRUFEX0ZSQU1FX1NJWkU6CisgICAgcmVhZFdhbnRfICs9IDQ7CisKICAgICAvLyBXZSBqdXN0IHJlYWQgdGhlIHJlcXVlc3QgbGVuZ3RoCiAgICAgLy8gRG91YmxlIHRoZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCBpcyBiaWcgZW5vdWdoCiAgICAgaWYgKHJlYWRXYW50XyA+IHJlYWRCdWZmZXJTaXplXykgewpAQCAtNzM4LDE1ICs3NTgsMTMgQEAKICAgICAgIHJlYWRCdWZmZXJTaXplXyA9IG5ld1NpemU7CiAgICAgfQogCi0gICAgcmVhZEJ1ZmZlclBvc189IDA7CisgICAgcmVhZEJ1ZmZlclBvc18gPSA0OworICAgICooKHVpbnQzMl90KilyZWFkQnVmZmVyXykgPSBodG9ubChyZWFkV2FudF8gLSA0KTsKIAogICAgIC8vIE1vdmUgaW50byByZWFkIHJlcXVlc3Qgc3RhdGUKICAgICBzb2NrZXRTdGF0ZV8gPSBTT0NLRVRfUkVDVjsKICAgICBhcHBTdGF0ZV8gPSBBUFBfUkVBRF9SRVFVRVNUOwogCi0gICAgLy8gV29yayB0aGUgc29ja2V0IHJpZ2h0IGF3YXkKLSAgICAvLyB3b3JrU29ja2V0KCk7Ci0KICAgICByZXR1cm47CiAKICAgY2FzZSBBUFBfQ0xPU0VfQ09OTkVDVElPTjoKQEAgLTc2NywxMSArNzg1LDkgQEAKICAgfQogCiAgIC8vIERlbGV0ZSBhIHByZXZpb3VzbHkgZXhpc3RpbmcgZXZlbnQKLSAgaWYgKGV2ZW50RmxhZ3NfICE9IDApIHsKLSAgICBpZiAoZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRDb25uZWN0aW9uOjpzZXRGbGFncyBldmVudF9kZWwiKTsKLSAgICAgIHJldHVybjsKLSAgICB9CisgIGlmIChldmVudEZsYWdzXyAmJiBldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKSBldmVudF9kZWwiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgcmV0dXJuOwogICB9CiAKICAgLy8gVXBkYXRlIGluIG1lbW9yeSBzdHJ1Y3R1cmUKQEAgLTgwOSwxMyArODI1LDEyIEBACiAgICAqIGV2IHN0cnVjdHVyZSBmb3IgbXVsdGlwbGUgbW9uaXRvcmVkIGRlc2NyaXB0b3JzOyBlYWNoIGRlc2NyaXB0b3IgbmVlZHMKICAgICogaXRzIG93biBldi4KICAgICovCi0gIGV2ZW50X3NldCgmZXZlbnRfLCB0U29ja2V0Xy0+Z2V0U29ja2V0RkQoKSwgZXZlbnRGbGFnc18sCi0gICAgICAgICAgICBUQ29ubmVjdGlvbjo6ZXZlbnRIYW5kbGVyLCB0aGlzKTsKKyAgZXZlbnRfc2V0KCZldmVudF8sIHRTb2NrZXRfLT5nZXRTb2NrZXRGRCgpLCBldmVudEZsYWdzXywgVENvbm5lY3Rpb246OmV2ZW50SGFuZGxlciwgdGhpcyk7CiAgIGV2ZW50X2Jhc2Vfc2V0KGlvVGhyZWFkXy0+Z2V0RXZlbnRCYXNlKCksICZldmVudF8pOwogCiAgIC8vIEFkZCB0aGUgZXZlbnQKICAgaWYgKGV2ZW50X2FkZCgmZXZlbnRfLCAwKSA9PSAtMSkgewotICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OnNldEZsYWdzKCk6IGNvdWxkIG5vdCBldmVudF9hZGQiKTsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKTogY291bGQgbm90IGV2ZW50X2FkZCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgfQogfQogCkBAIC04MjMsMTIgKzgzOCw5IEBACiAgKiBDbG9zZXMgYSBjb25uZWN0aW9uCiAgKi8KIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2xvc2UoKSB7Ci0gIC8vIERlbGV0ZSB0aGUgcmVnaXN0ZXJlZCBsaWJldmVudAotICBpZiAoZXZlbnRfZGVsKCZldmVudF8pID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVENvbm5lY3Rpb246OmNsb3NlKCkgZXZlbnRfZGVsIiwgZXJybm8pOwotICB9CisgIHNldElkbGUoKTsKIAotICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7CisgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CiAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwogICB9CiAgIGlvVGhyZWFkXyA9IE5VTEw7CkBAIC04NDAsMTMgKzg1MiwxNCBAQAogICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfLT5jbG9zZSgpOwogICBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xy0+Y2xvc2UoKTsKIAorICAvLyByZWxlYXNlIHByb2Nlc3NvciBhbmQgaGFuZGxlcgorICBwcm9jZXNzb3JfLnJlc2V0KCk7CisKICAgLy8gR2l2ZSB0aGlzIG9iamVjdCBiYWNrIHRvIHRoZSBzZXJ2ZXIgdGhhdCBvd25zIGl0CiAgIHNlcnZlcl8tPnJldHVybkNvbm5lY3Rpb24odGhpcyk7CiB9CiAKLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6Y2hlY2tJZGxlQnVmZmVyTWVtTGltaXQoCi0gICAgc2l6ZV90IHJlYWRMaW1pdCwKLSAgICBzaXplX3Qgd3JpdGVMaW1pdCkgewordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjaGVja0lkbGVCdWZmZXJNZW1MaW1pdChzaXplX3QgcmVhZExpbWl0LCBzaXplX3Qgd3JpdGVMaW1pdCkgewogICBpZiAocmVhZExpbWl0ID4gMCAmJiByZWFkQnVmZmVyU2l6ZV8gPiByZWFkTGltaXQpIHsKICAgICBmcmVlKHJlYWRCdWZmZXJfKTsKICAgICByZWFkQnVmZmVyXyA9IE5VTEw7CkBAIC04NTUsNTIgKzg2OCw1OSBAQAogCiAgIGlmICh3cml0ZUxpbWl0ID4gMCAmJiBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA+IHdyaXRlTGltaXQpIHsKICAgICAvLyBqdXN0IHN0YXJ0IG92ZXIKLSAgICBvdXRwdXRUcmFuc3BvcnRfLT5yZXNldEJ1ZmZlcihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpOworICAgIG91dHB1dFRyYW5zcG9ydF8tPnJlc2V0QnVmZmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpKTsKICAgICBsYXJnZXN0V3JpdGVCdWZmZXJTaXplXyA9IDA7CiAgIH0KIH0KIAogVE5vbmJsb2NraW5nU2VydmVyOjp+VE5vbmJsb2NraW5nU2VydmVyKCkgewotICAvLyBUT0RPOiBXZSBjdXJyZW50bHkgbGVhayBhbnkgYWN0aXZlIFRDb25uZWN0aW9uIG9iamVjdHMuCi0gIC8vIFNpbmNlIHdlJ3JlIHNodXR0aW5nIGRvd24gYW5kIGRlc3Ryb3lpbmcgdGhlIGV2ZW50X2Jhc2UsIHRoZSBUQ29ubmVjdGlvbgotICAvLyBvYmplY3RzIHdpbGwgbmV2ZXIgcmVjZWl2ZSBhbnkgYWRkaXRpb25hbCBjYWxsYmFja3MuICAoQW5kIGV2ZW4gaWYgdGhleQotICAvLyBkaWQsIGl0IHdvdWxkIGJlIGJhZCwgc2luY2UgdGhleSBrZWVwIGEgcG9pbnRlciBhcm91bmQgdG8gdGhlIHNlcnZlciwKLSAgLy8gd2hpY2ggaXMgYmVpbmcgZGVzdHJveWVkLikKLQorICAvLyBDbG9zZSBhbnkgYWN0aXZlIGNvbm5lY3Rpb25zIChtb3ZlcyB0aGVtIHRvIHRoZSBpZGxlIGNvbm5lY3Rpb24gc3RhY2spCisgIHdoaWxlIChhY3RpdmVDb25uZWN0aW9uc18uc2l6ZSgpKSB7CisgICAgYWN0aXZlQ29ubmVjdGlvbnNfLmZyb250KCktPmNsb3NlKCk7CisgIH0KICAgLy8gQ2xlYW4gdXAgdW51c2VkIFRDb25uZWN0aW9uIG9iamVjdHMgaW4gY29ubmVjdGlvblN0YWNrXwogICB3aGlsZSAoIWNvbm5lY3Rpb25TdGFja18uZW1wdHkoKSkgewogICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gY29ubmVjdGlvblN0YWNrXy50b3AoKTsKICAgICBjb25uZWN0aW9uU3RhY2tfLnBvcCgpOwogICAgIGRlbGV0ZSBjb25uZWN0aW9uOwogICB9CisgIC8vIFRoZSBUTm9uYmxvY2tpbmdJT1RocmVhZCBvYmplY3RzIGhhdmUgc2hhcmVkX3B0cnMgdG8gdGhlIFRocmVhZAorICAvLyBvYmplY3RzIGFuZCB0aGUgVGhyZWFkIG9iamVjdHMgaGF2ZSBzaGFyZWRfcHRycyB0byB0aGUgVE5vbmJsb2NraW5nSU9UaHJlYWQKKyAgLy8gb2JqZWN0cyAoYXMgcnVubmFibGUpIHNvIHRoZXNlIG9iamVjdHMgd2lsbCBuZXZlciBkZWFsbG9jYXRlIHdpdGhvdXQgaGVscC4KKyAgd2hpbGUgKCFpb1RocmVhZHNfLmVtcHR5KCkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IGlvdCA9IGlvVGhyZWFkc18uYmFjaygpOworICAgIGlvVGhyZWFkc18ucG9wX2JhY2soKTsKKyAgICBpb3QtPnNldFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPigpKTsKKyAgfQogfQogCiAvKioKICAqIENyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBlaXRoZXIgYnkgcmV1c2luZyBhbiBvYmplY3Qgb2ZmIHRoZSBzdGFjayBvcgogICogYnkgYWxsb2NhdGluZyBhIG5ldyBvbmUgZW50aXJlbHkKICAqLwotVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVDb25uZWN0aW9uKAotICAgIGludCBzb2NrZXQsIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbikgeworVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKICAgLy8gQ2hlY2sgdGhlIHN0YWNrCiAgIEd1YXJkIGcoY29ubk11dGV4Xyk7CiAKICAgLy8gcGljayBhbiBJTyB0aHJlYWQgdG8gaGFuZGxlIHRoaXMgY29ubmVjdGlvbiAtLSBjdXJyZW50bHkgcm91bmQgcm9iaW4KICAgYXNzZXJ0KG5leHRJT1RocmVhZF8gPCBpb1RocmVhZHNfLnNpemUoKSk7CiAgIGludCBzZWxlY3RlZFRocmVhZElkeCA9IG5leHRJT1RocmVhZF87Ci0gIG5leHRJT1RocmVhZF8gPSAobmV4dElPVGhyZWFkXyArIDEpICUgaW9UaHJlYWRzXy5zaXplKCk7CisgIG5leHRJT1RocmVhZF8gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKG5leHRJT1RocmVhZF8gKyAxKSAlIGlvVGhyZWFkc18uc2l6ZSgpKTsKIAogICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQgPSBpb1RocmVhZHNfW3NlbGVjdGVkVGhyZWFkSWR4XS5nZXQoKTsKIAogICAvLyBDaGVjayB0aGUgY29ubmVjdGlvbiBzdGFjayB0byBzZWUgaWYgd2UgY2FuIHJlLXVzZQogICBUQ29ubmVjdGlvbiogcmVzdWx0ID0gTlVMTDsKICAgaWYgKGNvbm5lY3Rpb25TdGFja18uZW1wdHkoKSkgewotICAgIHJlc3VsdCA9IG5ldyBUQ29ubmVjdGlvbihzb2NrZXQsIGlvVGhyZWFkLCBhZGRyLCBhZGRyTGVuKTsKKyAgICByZXN1bHQgPSBuZXcgVENvbm5lY3Rpb24oc29ja2V0LCBpb1RocmVhZCk7CiAgICAgKytudW1UQ29ubmVjdGlvbnNfOwogICB9IGVsc2UgewogICAgIHJlc3VsdCA9IGNvbm5lY3Rpb25TdGFja18udG9wKCk7CiAgICAgY29ubmVjdGlvblN0YWNrXy5wb3AoKTsKLSAgICByZXN1bHQtPmluaXQoc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisgICAgcmVzdWx0LT5zZXRTb2NrZXQoc29ja2V0KTsKKyAgICByZXN1bHQtPmluaXQoaW9UaHJlYWQpOwogICB9CisgIGFjdGl2ZUNvbm5lY3Rpb25zXy5wdXNoX2JhY2socmVzdWx0KTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtOTEwLDggKzkzMCwxMiBAQAogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnJldHVybkNvbm5lY3Rpb24oVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pIHsKICAgR3VhcmQgZyhjb25uTXV0ZXhfKTsKIAotICBpZiAoY29ubmVjdGlvblN0YWNrTGltaXRfICYmCi0gICAgICAoY29ubmVjdGlvblN0YWNrXy5zaXplKCkgPj0gY29ubmVjdGlvblN0YWNrTGltaXRfKSkgeworICBhY3RpdmVDb25uZWN0aW9uc18uZXJhc2Uoc3RkOjpyZW1vdmUoYWN0aXZlQ29ubmVjdGlvbnNfLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5lbmQoKSk7CisKKyAgaWYgKGNvbm5lY3Rpb25TdGFja0xpbWl0XyAmJiAoY29ubmVjdGlvblN0YWNrXy5zaXplKCkgPj0gY29ubmVjdGlvblN0YWNrTGltaXRfKSkgewogICAgIGRlbGV0ZSBjb25uZWN0aW9uOwogICAgIC0tbnVtVENvbm5lY3Rpb25zXzsKICAgfSBlbHNlIHsKQEAgLTkyNCw1OCArOTQ4LDQwIEBACiAgKiBTZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nIGNsaWVudAogICogY29ubmVjdGlvbnMgb24gZmQgYW5kIGFzc2lnbiBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGhhbmRsZSB0aG9zZSByZXF1ZXN0cy4KICAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmhhbmRsZUV2ZW50KGludCBmZCwgc2hvcnQgd2hpY2gpIHsKLSAgKHZvaWQpIHdoaWNoOwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmhhbmRsZUV2ZW50KFRIUklGVF9TT0NLRVQgZmQsIHNob3J0IHdoaWNoKSB7CisgICh2b2lkKXdoaWNoOwogICAvLyBNYWtlIHN1cmUgdGhhdCBsaWJldmVudCBkaWRuJ3QgbWVzcyB1cCB0aGUgc29ja2V0IGhhbmRsZXMKICAgYXNzZXJ0KGZkID09IHNlcnZlclNvY2tldF8pOwogCi0gIC8vIFNlcnZlciBzb2NrZXQgYWNjZXB0ZWQgYSBuZXcgY29ubmVjdGlvbgotICBzb2NrbGVuX3QgYWRkckxlbjsKLSAgc29ja2FkZHJfc3RvcmFnZSBhZGRyU3RvcmFnZTsKLSAgc29ja2FkZHIqIGFkZHJwID0gKHNvY2thZGRyKikmYWRkclN0b3JhZ2U7Ci0gIGFkZHJMZW4gPSBzaXplb2YoYWRkclN0b3JhZ2UpOwotCiAgIC8vIEdvaW5nIHRvIGFjY2VwdCBhIG5ldyBjbGllbnQgc29ja2V0Ci0gIGludCBjbGllbnRTb2NrZXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnRTb2NrZXQ7CiAKLSAgLy8gQWNjZXB0IGFzIG1hbnkgbmV3IGNsaWVudHMgYXMgcG9zc2libGUsIGV2ZW4gdGhvdWdoIGxpYmV2ZW50IHNpZ25hbGVkIG9ubHkKLSAgLy8gb25lLCB0aGlzIGhlbHBzIHVzIHRvIGF2b2lkIGhhdmluZyB0byBnbyBiYWNrIGludG8gdGhlIGxpYmV2ZW50IGVuZ2luZSBzbwotICAvLyBtYW55IHRpbWVzCi0gIHdoaWxlICgoY2xpZW50U29ja2V0ID0gOjphY2NlcHQoZmQsIGFkZHJwLCAmYWRkckxlbikpICE9IC0xKSB7CisgIGNsaWVudFNvY2tldCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOworICBpZiAoY2xpZW50U29ja2V0KSB7CiAgICAgLy8gSWYgd2UncmUgb3ZlcmxvYWRlZCwgdGFrZSBhY3Rpb24gaGVyZQogICAgIGlmIChvdmVybG9hZEFjdGlvbl8gIT0gVF9PVkVSTE9BRF9OT19BQ1RJT04gJiYgc2VydmVyT3ZlcmxvYWRlZCgpKSB7CiAgICAgICBHdWFyZCBnKGNvbm5NdXRleF8pOwogICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKICAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8rKzsKICAgICAgIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQpIHsKLSAgICAgICAgOjpjbG9zZShjbGllbnRTb2NrZXQpOworICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0gZWxzZSBpZiAob3ZlcmxvYWRBY3Rpb25fID09IFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSkgewogICAgICAgICBpZiAoIWRyYWluUGVuZGluZ1Rhc2soKSkgewogICAgICAgICAgIC8vIE5vdGhpbmcgbGVmdCB0byBkaXNjYXJkLCBzbyB3ZSBkcm9wIGNvbm5lY3Rpb24gaW5zdGVhZC4KLSAgICAgICAgICA6OmNsb3NlKGNsaWVudFNvY2tldCk7CisgICAgICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAotICAgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaWYgKChmbGFncyA9IGZjbnRsKGNsaWVudFNvY2tldCwgRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgICBmY250bChjbGllbnRTb2NrZXQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykgPCAwKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBPX05PTkJMT0NLIChmY250bCkgIiwgZXJybm8pOwotICAgICAgOjpjbG9zZShjbGllbnRTb2NrZXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIC8vIENyZWF0ZSBhIG5ldyBUQ29ubmVjdGlvbiBmb3IgdGhpcyBjbGllbnQgc29ja2V0LgotICAgIFRDb25uZWN0aW9uKiBjbGllbnRDb25uZWN0aW9uID0KLSAgICAgIGNyZWF0ZUNvbm5lY3Rpb24oY2xpZW50U29ja2V0LCBhZGRycCwgYWRkckxlbik7CisgICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCk7CiAKICAgICAvLyBGYWlsIGZhc3QgaWYgd2UgY291bGQgbm90IGNyZWF0ZSBhIFRDb25uZWN0aW9uIG9iamVjdAogICAgIGlmIChjbGllbnRDb25uZWN0aW9uID09IE5VTEwpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogZmFpbGVkIFRDb25uZWN0aW9uIGZhY3RvcnkiKTsKLSAgICAgIDo6Y2xvc2UoY2xpZW50U29ja2V0KTsKKyAgICAgIGNsaWVudFNvY2tldC0+Y2xvc2UoKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTk5NCwxOCArMTAwMCwxMSBAQAogICAgIGlmIChjbGllbnRDb25uZWN0aW9uLT5nZXRJT1RocmVhZE51bWJlcigpID09IDApIHsKICAgICAgIGNsaWVudENvbm5lY3Rpb24tPnRyYW5zaXRpb24oKTsKICAgICB9IGVsc2UgewotICAgICAgY2xpZW50Q29ubmVjdGlvbi0+bm90aWZ5SU9UaHJlYWQoKTsKKyAgICAgIGlmICghY2xpZW50Q29ubmVjdGlvbi0+bm90aWZ5SU9UaHJlYWQoKSkgeworICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJbRVJST1JdIG5vdGlmeUlPVGhyZWFkIGZhaWxlZCBvbiBmcmVzaCBjb25uZWN0aW9uLCBjbG9zaW5nIiwgZXJybm8pOworICAgICAgICBjbGllbnRDb25uZWN0aW9uLT5jbG9zZSgpOworICAgICAgfQogICAgIH0KLQotICAgIC8vIGFkZHJMZW4gaXMgd3JpdHRlbiBieSB0aGUgYWNjZXB0KCkgY2FsbCwgc28gbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSB0aGUgbmV4dCBjYWxsLgotICAgIGFkZHJMZW4gPSBzaXplb2YoYWRkclN0b3JhZ2UpOwotICB9Ci0KLQotICAvLyBEb25lIGxvb3BpbmcgYWNjZXB0LCBub3cgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGlzIGR1ZSB0bwotICAvLyBibG9ja2luZy4gQW55IG90aGVyIGVycm9yIGlzIGEgcHJvYmxlbQotICBpZiAoZXJybm8gIT0gRUFHQUlOICYmIGVycm5vICE9IEVXT1VMREJMT0NLKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBhY2NlcHQoKSAiLCBlcnJubyk7CiAgIH0KIH0KIApAQCAtMTAxMywxMzcgKzEwMTIsMzkgQEAKICAqIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KICAqLwogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCkgewotICBpbnQgczsKLQotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOwotICBpbnQgZXJyb3I7Ci0KLSAgY2hhciBwb3J0W3NpemVvZigiNjU1MzYiKSArIDFdOwotICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKLSAgaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOwotICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICBoaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkUgfCBBSV9BRERSQ09ORklHOwotICBzcHJpbnRmKHBvcnQsICIlZCIsIHBvcnRfKTsKLQotICAvLyBXaWxkY2FyZCBhZGRyZXNzCi0gIGVycm9yID0gZ2V0YWRkcmluZm8oTlVMTCwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7Ci0gIGlmIChlcnJvcikgewotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBnZXRhZGRyaW5mbyAiICsKLSAgICAgICAgICAgICAgICAgICAgIHN0cmluZyhnYWlfc3RyZXJyb3IoZXJyb3IpKSk7Ci0gIH0KLQotICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAotICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKLSAgICBpZiAocmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVDYgfHwgcmVzLT5haV9uZXh0ID09IE5VTEwpCi0gICAgICBicmVhazsKLSAgfQotCi0gIC8vIENyZWF0ZSB0aGUgc2VydmVyIHNvY2tldAotICBzID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKLSAgaWYgKHMgPT0gLTEpIHsKLSAgICBmcmVlYWRkcmluZm8ocmVzMCk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHNvY2tldCgpIC0xIik7Ci0gIH0KLQotICAjaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIGNvbnN0X2Nhc3Rfc29ja29wdCgmemVybyksIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkiKTsKLSAgICB9Ci0gIH0KLSAgI2VuZGlmIC8vICNpZmRlZiBJUFY2X1Y2T05MWQotCi0KLSAgaW50IG9uZSA9IDE7Ci0KLSAgLy8gU2V0IHJldXNlYWRkciB0byBhdm9pZCAyTVNMIGRlbGF5IG9uIHNlcnZlciByZXN0YXJ0Ci0gIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLQotICBpZiAoOjpiaW5kKHMsIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVuKSA9PSAtMSkgewotICAgIDo6Y2xvc2Uocyk7Ci0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGJpbmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8pOwotICB9Ci0KLSAgLy8gRG9uZSB3aXRoIHRoZSBhZGRyIGluZm8KLSAgZnJlZWFkZHJpbmZvKHJlczApOwotCi0gIC8vIFNldCB1cCB0aGlzIGZpbGUgZGVzY3JpcHRvciBmb3IgbGlzdGVuaW5nCi0gIGxpc3RlblNvY2tldChzKTsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRTb2NrZXRGRCgpOwogfQogCi0vKioKLSAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgbGlzdGVuU29ja2V0KCkgYW5kIHNldHMgdmFyaW91cyBvcHRpb25zIG9uIGl0Ci0gKiB0byBwcmVwYXJlIGZvciB1c2UgaW4gdGhlIHNlcnZlci4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6Omxpc3RlblNvY2tldChpbnQgcykgewotICAvLyBTZXQgc29ja2V0IHRvIG5vbmJsb2NraW5nIG1vZGUKLSAgaW50IGZsYWdzOwotICBpZiAoKGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCkpIDwgMCB8fAotICAgICAgZmNudGwocywgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA8IDApIHsKLSAgICA6OmNsb3NlKHMpOwotICAgIHRocm93IFRFeGNlcHRpb24oIlROb25ibG9ja2luZ1NlcnZlcjo6c2VydmUoKSBPX05PTkJMT0NLIik7Ci0gIH0KIAotICBpbnQgb25lID0gMTsKLSAgc3RydWN0IGxpbmdlciBsaW5nID0gezAsIDB9OwotCi0gIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19LRUVQQUxJVkUsIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotCi0gIC8vIFR1cm4gbGluZ2VyIG9mZiB0byBhdm9pZCBodW5nIHNvY2tldHMKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19MSU5HRVIsIGNvbnN0X2Nhc3Rfc29ja29wdCgmbGluZyksIHNpemVvZihsaW5nKSk7Ci0KLSAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjawotICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKLSAgI2lmbmRlZiBUQ1BfTk9QVVNICi0gIHNldHNvY2tvcHQocywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLSAgI2VuZGlmCi0KLSAgI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwotICBpZiAoVFNvY2tldDo6Z2V0VXNlTG93TWluUnRvKCkpIHsKLSAgICBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotICB9Ci0gICNlbmRpZgotCi0gIGlmIChsaXN0ZW4ocywgTElTVEVOX0JBQ0tMT0cpID09IC0xKSB7Ci0gICAgOjpjbG9zZShzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgbGlzdGVuIik7Ci0gIH0KLQotICAvLyBDb29sLCB0aGlzIHNvY2tldCBpcyBnb29kIHRvIGdvLCBzZXQgaXQgYXMgdGhlIHNlcnZlclNvY2tldF8KLSAgc2VydmVyU29ja2V0XyA9IHM7Ci19Ci0KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpIHsKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7CiAgIHRocmVhZE1hbmFnZXJfID0gdGhyZWFkTWFuYWdlcjsKLSAgaWYgKHRocmVhZE1hbmFnZXIgIT0gTlVMTCkgewotICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKHN0ZDo6dHIxOjpiaW5kKCZUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlLCB0aGlzLCBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSkpOworICBpZiAodGhyZWFkTWFuYWdlcikgeworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKAorICAgICAgICBzdGQ6OmJpbmQoJlROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSB0cnVlOwogICB9IGVsc2UgewogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwogICB9CiB9CiAKLWJvb2wgIFROb25ibG9ja2luZ1NlcnZlcjo6c2VydmVyT3ZlcmxvYWRlZCgpIHsKK2Jvb2wgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZXJPdmVybG9hZGVkKCkgewogICBzaXplX3QgYWN0aXZlQ29ubmVjdGlvbnMgPSBudW1UQ29ubmVjdGlvbnNfIC0gY29ubmVjdGlvblN0YWNrXy5zaXplKCk7Ci0gIGlmIChudW1BY3RpdmVQcm9jZXNzb3JzXyA+IG1heEFjdGl2ZVByb2Nlc3NvcnNfIHx8Ci0gICAgICBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgeworICBpZiAobnVtQWN0aXZlUHJvY2Vzc29yc18gPiBtYXhBY3RpdmVQcm9jZXNzb3JzXyB8fCBhY3RpdmVDb25uZWN0aW9ucyA+IG1heENvbm5lY3Rpb25zXykgewogICAgIGlmICghb3ZlcmxvYWRlZF8pIHsKLSAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGNvbmRpdGlvbiBiZWd1bi4iKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogb3ZlcmxvYWQgY29uZGl0aW9uIGJlZ3VuLiIpOwogICAgICAgb3ZlcmxvYWRlZF8gPSB0cnVlOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBpZiAob3ZlcmxvYWRlZF8gJiYKLSAgICAgICAgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykgJiYKLSAgICAgICAgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGVuZGVkOyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIldSBkcm9wcGVkICglbGx1IHRvdGFsKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfLCBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKKyAgICBpZiAob3ZlcmxvYWRlZF8gJiYgKG51bUFjdGl2ZVByb2Nlc3NvcnNfIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhBY3RpdmVQcm9jZXNzb3JzXykKKyAgICAgICAgJiYgKGFjdGl2ZUNvbm5lY3Rpb25zIDw9IG92ZXJsb2FkSHlzdGVyZXNpc18gKiBtYXhDb25uZWN0aW9uc18pKSB7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6IG92ZXJsb2FkIGVuZGVkOyAiCisgICAgICAgICAgIiV1IGRyb3BwZWQgKCVsbHUgdG90YWwpIiwKKyAgICAgICAgICBuQ29ubmVjdGlvbnNEcm9wcGVkXywKKyAgICAgICAgICBuVG90YWxDb25uZWN0aW9uc0Ryb3BwZWRfKTsKICAgICAgIG5Db25uZWN0aW9uc0Ryb3BwZWRfID0gMDsKICAgICAgIG92ZXJsb2FkZWRfID0gZmFsc2U7CiAgICAgfQpAQCAtMTE1NCwxMiArMTA1NSwxMCBAQAogCiBib29sIFROb25ibG9ja2luZ1NlcnZlcjo6ZHJhaW5QZW5kaW5nVGFzaygpIHsKICAgaWYgKHRocmVhZE1hbmFnZXJfKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2sgPSB0aHJlYWRNYW5hZ2VyXy0+cmVtb3ZlTmV4dFBlbmRpbmcoKTsKICAgICBpZiAodGFzaykgewotICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPQotICAgICAgICBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOwotICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkKLSAgICAgICAgICAgICAmJiBjb25uZWN0aW9uLT5nZXRTdGF0ZSgpID09IEFQUF9XQUlUX1RBU0spOworICAgICAgVENvbm5lY3Rpb24qIGNvbm5lY3Rpb24gPSBzdGF0aWNfY2FzdDxUQ29ubmVjdGlvbjo6VGFzayo+KHRhc2suZ2V0KCkpLT5nZXRUQ29ubmVjdGlvbigpOworICAgICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKICAgICAgIGNvbm5lY3Rpb24tPmZvcmNlQ2xvc2UoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTExNjcsMTEgKzEwNjYsOSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgewotICBUQ29ubmVjdGlvbiogY29ubmVjdGlvbiA9Ci0gICAgc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKLSAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYKLSAgICAgICAgIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKKyAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKICAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwogfQogCkBAIC0xMTgyLDMxICsxMDc5LDMyIEBACiAgIH0KIH0KIAotLyoqCi0gKiBNYWluIHdvcmtob3JzZSBmdW5jdGlvbiwgc3RhcnRzIHVwIHRoZSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGEgcG9ydCBhbmQKLSAqIGxvb3BzIG92ZXIgdGhlIGxpYmV2ZW50IGhhbmRsZXIuCi0gKi8KLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIHsKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpyZWdpc3RlckV2ZW50cyhldmVudF9iYXNlKiB1c2VyX2V2ZW50X2Jhc2UpIHsKKyAgdXNlckV2ZW50QmFzZV8gPSB1c2VyX2V2ZW50X2Jhc2U7CisKICAgLy8gaW5pdCBsaXN0ZW4gc29ja2V0Ci0gIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7CisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkKKyAgICBjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpOwogCiAgIC8vIHNldCB1cCB0aGUgSU8gdGhyZWFkcwogICBhc3NlcnQoaW9UaHJlYWRzXy5lbXB0eSgpKTsKICAgaWYgKCFudW1JT1RocmVhZHNfKSB7CiAgICAgbnVtSU9UaHJlYWRzXyA9IERFRkFVTFRfSU9fVEhSRUFEUzsKICAgfQorICAvLyBVc2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgZG9lc24ndCB3b3JrcyBmb3IgbXVsdGktdGhyZWFkZWQgc2VydmVycworICBhc3NlcnQobnVtSU9UaHJlYWRzXyA9PSAxIHx8ICF1c2VyRXZlbnRCYXNlXyk7CiAKICAgZm9yICh1aW50MzJfdCBpZCA9IDA7IGlkIDwgbnVtSU9UaHJlYWRzXzsgKytpZCkgewogICAgIC8vIHRoZSBmaXJzdCBJTyB0aHJlYWQgYWxzbyBkb2VzIHRoZSBsaXN0ZW5pbmcgb24gc2VydmVyIHNvY2tldAotICAgIGludCBsaXN0ZW5GZCA9IChpZCA9PSAwID8gc2VydmVyU29ja2V0XyA6IC0xKTsKKyAgICBUSFJJRlRfU09DS0VUIGxpc3RlbkZkID0gKGlkID09IDAgPyBzZXJ2ZXJTb2NrZXRfIDogVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKIAogICAgIHNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IHRocmVhZCgKLSAgICAgIG5ldyBUTm9uYmxvY2tpbmdJT1RocmVhZCh0aGlzLCBpZCwgbGlzdGVuRmQsIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18pKTsKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ0lPVGhyZWFkKHRoaXMsIGlkLCBsaXN0ZW5GZCwgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXykpOwogICAgIGlvVGhyZWFkc18ucHVzaF9iYWNrKHRocmVhZCk7CiAgIH0KIAogICAvLyBOb3RpZnkgaGFuZGxlciBvZiB0aGUgcHJlU2VydmUgZXZlbnQKLSAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgeworICBpZiAoZXZlbnRIYW5kbGVyXykgewogICAgIGV2ZW50SGFuZGxlcl8tPnByZVNlcnZlKCk7CiAgIH0KIApAQCAtMTIxNSwxOSArMTExMywxOSBAQAogICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPT0gbnVtSU9UaHJlYWRzXyk7CiAgIGFzc2VydChpb1RocmVhZHNfLnNpemUoKSA+IDApOwogCi0gIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogU2VydmluZyBvbiBwb3J0ICVkLCAlZCBpbyB0aHJlYWRzLiIsCi0gICAgICAgICAgICAgICBwb3J0XywgaW9UaHJlYWRzXy5zaXplKCkpOworICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IFNlcnZpbmcgd2l0aCAlZCBpbyB0aHJlYWRzLiIsCisgICAgICAgICAgICAgICAgICAgICAgaW9UaHJlYWRzXy5zaXplKCkpOwogCiAgIC8vIExhdW5jaCBhbGwgdGhlIHNlY29uZGFyeSBJTyB0aHJlYWRzIGluIHNlcGFyYXRlIHRocmVhZHMKICAgaWYgKGlvVGhyZWFkc18uc2l6ZSgpID4gMSkgewogICAgIGlvVGhyZWFkRmFjdG9yeV8ucmVzZXQobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKLSNpZm5kZWYgVVNFX0JPT1NUX1RIUkVBRAotICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgIC8vIHNjaGVkdWxlcgotICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsIC8vIHByaW9yaXR5Ci0gICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhY2sgc2l6ZSAoTUIpCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsICAvLyBzY2hlZHVsZXIKKyAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsIC8vIHByaW9yaXR5CisgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFjayBzaXplIChNQikKICNlbmRpZgotICAgICAgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldGFjaGVkCi0gICAgKSk7CisgICAgICAgIGZhbHNlIC8vIGRldGFjaGVkCisgICAgICAgICkpOwogCiAgICAgYXNzZXJ0KGlvVGhyZWFkRmFjdG9yeV8uZ2V0KCkpOwogCkBAIC0xMjM5LDYgKzExMzcsMTkgQEAKICAgICB9CiAgIH0KIAorICAvLyBSZWdpc3RlciB0aGUgZXZlbnRzIGZvciB0aGUgcHJpbWFyeSAobGlzdGVuZXIpIElPIHRocmVhZAorICBpb1RocmVhZHNfWzBdLT5yZWdpc3RlckV2ZW50cygpOworfQorCisvKioKKyAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZAorICogbG9vcHMgb3ZlciB0aGUgbGliZXZlbnQgaGFuZGxlci4KKyAqLwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgeworCisgIGlmIChpb1RocmVhZHNfLmVtcHR5KCkpCisgICAgcmVnaXN0ZXJFdmVudHMoTlVMTCk7CisKICAgLy8gUnVuIHRoZSBwcmltYXJ5IChsaXN0ZW5lcikgSU8gdGhyZWFkIGxvb3AgaW4gb3VyIG1haW4gdGhyZWFkOyB0aGlzIHdpbGwKICAgLy8gb25seSByZXR1cm4gd2hlbiB0aGUgc2VydmVyIGlzIHNodXR0aW5nIGRvd24uCiAgIGlvVGhyZWFkc19bMF0tPnJ1bigpOwpAQCAtMTI1MiwxMyArMTE2MywxNCBAQAogCiBUTm9uYmxvY2tpbmdJT1RocmVhZDo6VE5vbmJsb2NraW5nSU9UaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdGVuU29ja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlSGlnaFByaW9yaXR5KQotICAgICAgOiBzZXJ2ZXJfKHNlcnZlcikKLSAgICAgICwgbnVtYmVyXyhudW1iZXIpCi0gICAgICAsIGxpc3RlblNvY2tldF8obGlzdGVuU29ja2V0KQotICAgICAgLCB1c2VIaWdoUHJpb3JpdHlfKHVzZUhpZ2hQcmlvcml0eSkKLSAgICAgICwgZXZlbnRCYXNlXyhOVUxMKSB7CisgIDogc2VydmVyXyhzZXJ2ZXIpLAorICAgIG51bWJlcl8obnVtYmVyKSwKKyAgICBsaXN0ZW5Tb2NrZXRfKGxpc3RlblNvY2tldCksCisgICAgdXNlSGlnaFByaW9yaXR5Xyh1c2VIaWdoUHJpb3JpdHkpLAorICAgIGV2ZW50QmFzZV8oTlVMTCksCisgICAgb3duRXZlbnRCYXNlXyhmYWxzZSkgewogICBub3RpZmljYXRpb25QaXBlRkRzX1swXSA9IC0xOwogICBub3RpZmljYXRpb25QaXBlRkRzX1sxXSA9IC0xOwogfQpAQCAtMTI2Nyw1MiArMTE3OSw1MyBAQAogICAvLyBtYWtlIHN1cmUgb3VyIGFzc29jaWF0ZWQgdGhyZWFkIGlzIGZ1bGx5IGZpbmlzaGVkCiAgIGpvaW4oKTsKIAotICBpZiAoZXZlbnRCYXNlXykgeworICBpZiAoZXZlbnRCYXNlXyAmJiBvd25FdmVudEJhc2VfKSB7CiAgICAgZXZlbnRfYmFzZV9mcmVlKGV2ZW50QmFzZV8pOworICAgIG93bkV2ZW50QmFzZV8gPSBmYWxzZTsKICAgfQogCi0gIGlmIChsaXN0ZW5Tb2NrZXRfID49IDApIHsKLSAgICBpZiAoMCAhPSA6OmNsb3NlKGxpc3RlblNvY2tldF8pKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBsaXN0ZW5Tb2NrZXRfIGNsb3NlKCk6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vKTsKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaWYgKDAgIT0gOjpUSFJJRlRfQ0xPU0VTT0NLRVQobGlzdGVuU29ja2V0XykpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkIGxpc3RlblNvY2tldF8gY2xvc2UoKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgIH0KLSAgICBsaXN0ZW5Tb2NrZXRfID0gVE5vbmJsb2NraW5nU2VydmVyOjpJTlZBTElEX1NPQ0tFVF9WQUxVRTsKKyAgICBsaXN0ZW5Tb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKICAgICBpZiAobm90aWZpY2F0aW9uUGlwZUZEc19baV0gPj0gMCkgewotICAgICAgaWYgKDAgIT0gOjpjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1tpXSkpIHsKKyAgICAgIGlmICgwICE9IDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldKSkgewogICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBub3RpZmljYXRpb25QaXBlIGNsb3NlKCk6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgICAgIH0KLSAgICAgIG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldID0gVE5vbmJsb2NraW5nU2VydmVyOjpJTlZBTElEX1NPQ0tFVF9WQUxVRTsKKyAgICAgIG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICAgIH0KICAgfQogfQogCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgewotICBpZihldnV0aWxfc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIG5vdGlmaWNhdGlvblBpcGVGRHNfKSA9PSAtMSkgeworICBpZiAoZXZ1dGlsX3NvY2tldHBhaXIoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCAwLCBub3RpZmljYXRpb25QaXBlRkRzXykgPT0gLTEpIHsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUgIiwgRVZVVElMX1NPQ0tFVF9FUlJPUigpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKCJjYW4ndCBjcmVhdGUgbm90aWZpY2F0aW9uIHBpcGUiKTsKICAgfQotICBpZihldnV0aWxfbWFrZV9zb2NrZXRfbm9uYmxvY2tpbmcobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pPDAgfHwKLSAgICAgZXZ1dGlsX21ha2Vfc29ja2V0X25vbmJsb2NraW5nKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKTwwKSB7Ci0gICAgOjpjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1swXSk7Ci0gICAgOjpjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpjcmVhdGVOb3RpZmljYXRpb25QaXBlKCkgT19OT05CTE9DSyIpOworICBpZiAoZXZ1dGlsX21ha2Vfc29ja2V0X25vbmJsb2NraW5nKG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdKSA8IDAKKyAgICAgIHx8IGV2dXRpbF9tYWtlX3NvY2tldF9ub25ibG9ja2luZyhub3RpZmljYXRpb25QaXBlRkRzX1sxXSkgPCAwKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKG5vdGlmaWNhdGlvblBpcGVGRHNfWzFdKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSBUSFJJRlRfT19OT05CTE9DSyIpOwogICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CiAjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPCAweDAyMDAwMDAwCiAgICAgaW50IGZsYWdzOwotICAgIGlmICgoZmxhZ3MgPSBmY250bChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9HRVRGRCwgMCkpIDwgMCB8fAotICAgICAgICBmY250bChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApIHsKKyAgICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKG5vdGlmaWNhdGlvblBpcGVGRHNfW2ldLCBGX0dFVEZELCAwKSkgPCAwCisgICAgICAgIHx8IFRIUklGVF9GQ05UTChub3RpZmljYXRpb25QaXBlRkRzX1tpXSwgRl9TRVRGRCwgZmxhZ3MgfCBGRF9DTE9FWEVDKSA8IDApIHsKICNlbHNlCiAgICAgaWYgKGV2dXRpbF9tYWtlX3NvY2tldF9jbG9zZW9uZXhlYyhub3RpZmljYXRpb25QaXBlRkRzX1tpXSkgPCAwKSB7CiAjZW5kaWYKLSAgICAgIDo6Y2xvc2Uobm90aWZpY2F0aW9uUGlwZUZEc19bMF0pOwotICAgICAgOjpjbG9zZShub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSAiCi0gICAgICAgICJGRF9DTE9FWEVDIik7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1swXSk7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChub3RpZmljYXRpb25QaXBlRkRzX1sxXSk7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKSAiCisgICAgICAgICAgIkZEX0NMT0VYRUMiKTsKICAgICB9CiAgIH0KIH0KQEAgLTEzMjEsNyArMTIzNCwyMyBAQAogICogUmVnaXN0ZXIgdGhlIGNvcmUgbGliZXZlbnQgZXZlbnRzIG9udG8gdGhlIHByb3BlciBiYXNlLgogICovCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpyZWdpc3RlckV2ZW50cygpIHsKLSAgaWYgKGxpc3RlblNvY2tldF8gPj0gMCkgeworICB0aHJlYWRJZF8gPSBUaHJlYWQ6OmdldF9jdXJyZW50KCk7CisKKyAgYXNzZXJ0KGV2ZW50QmFzZV8gPT0gMCk7CisgIGV2ZW50QmFzZV8gPSBnZXRTZXJ2ZXIoKS0+Z2V0VXNlckV2ZW50QmFzZSgpOworICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKSB7CisgICAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgICAgb3duRXZlbnRCYXNlXyA9IHRydWU7CisgIH0KKworICAvLyBQcmludCBzb21lIGxpYmV2ZW50IHN0YXRzCisgIGlmIChudW1iZXJfID09IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IHVzaW5nIGxpYmV2ZW50ICVzIG1ldGhvZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudF9nZXRfdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGV2ZW50QmFzZV8pKTsKKyAgfQorCisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIC8vIFJlZ2lzdGVyIHRoZSBzZXJ2ZXIgZXZlbnQKICAgICBldmVudF9zZXQoJnNlcnZlckV2ZW50XywKICAgICAgICAgICAgICAgbGlzdGVuU29ja2V0XywKQEAgLTEzMzIsMTEgKzEyNjEsMTEgQEAKIAogICAgIC8vIEFkZCB0aGUgZXZlbnQgYW5kIHN0YXJ0IHVwIHRoZSBzZXJ2ZXIKICAgICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZzZXJ2ZXJFdmVudF8sIDApKSB7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50X2FkZCgpIGZhaWxlZCBvbiBzZXJ2ZXIgbGlzdGVuIGV2ZW50Iik7CisgICAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAgICJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCk6ICIKKyAgICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHNlcnZlciBsaXN0ZW4gZXZlbnQiKTsKICAgICB9Ci0gICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyB0aHJlYWQgIyVkIHJlZ2lzdGVyZWQgZm9yIGxpc3Rlbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyXyk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyB0aHJlYWQgIyVkIHJlZ2lzdGVyZWQgZm9yIGxpc3Rlbi4iLCBudW1iZXJfKTsKICAgfQogCiAgIGNyZWF0ZU5vdGlmaWNhdGlvblBpcGUoKTsKQEAgLTEzNTMsNTkgKzEyODIsMTI4IEBACiAKICAgLy8gQWRkIHRoZSBldmVudCBhbmQgc3RhcnQgdXAgdGhlIHNlcnZlcgogICBpZiAoLTEgPT0gZXZlbnRfYWRkKCZub3RpZmljYXRpb25FdmVudF8sIDApKSB7Ci0gICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiAiCi0gICAgICAgICAgICAgICAgICAgICAiZXZlbnRfYWRkKCkgZmFpbGVkIG9uIHRhc2stZG9uZSBub3RpZmljYXRpb24gZXZlbnQiKTsKKyAgICB0aHJvdyBURXhjZXB0aW9uKAorICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpOiAiCisgICAgICAgICJldmVudF9hZGQoKSBmYWlsZWQgb24gdGFzay1kb25lIG5vdGlmaWNhdGlvbiBldmVudCIpOwogICB9Ci0gIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gdGhyZWFkICMlZCByZWdpc3RlcmVkIGZvciBub3RpZnkuIiwKLSAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfKTsKKyAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nOiBJTyB0aHJlYWQgIyVkIHJlZ2lzdGVyZWQgZm9yIG5vdGlmeS4iLCBudW1iZXJfKTsKIH0KIAogYm9vbCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5KFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIGNvbm4pIHsKLSAgaW50IGZkID0gZ2V0Tm90aWZpY2F0aW9uU2VuZEZEKCk7CisgIFRIUklGVF9TT0NLRVQgZmQgPSBnZXROb3RpZmljYXRpb25TZW5kRkQoKTsKICAgaWYgKGZkIDwgMCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGNvbnN0IGludCBrU2l6ZSA9IHNpemVvZihjb25uKTsKLSAgaWYgKHNlbmQoZmQsIGNvbnN0X2Nhc3Rfc29ja29wdCgmY29ubiksIGtTaXplLCAwKSAhPSBrU2l6ZSkgewotICAgIHJldHVybiBmYWxzZTsKKyAgaW50IHJldCA9IC0xOworICBsb25nIGtTaXplID0gc2l6ZW9mKGNvbm4pOworICBjb25zdCBjaGFyICogcG9zID0gKGNvbnN0IGNoYXIgKiljb25zdF9jYXN0X3NvY2tvcHQoJmNvbm4pOworCisjaWYgZGVmaW5lZChIQVZFX1BPTExfSCkgfHwgZGVmaW5lZChIQVZFX1NZU19QT0xMX0gpCisgIHN0cnVjdCBwb2xsZmQgcGZkID0ge2ZkLCBQT0xMT1VULCAwfTsKKworICB3aGlsZSAoa1NpemUgPiAwKSB7CisgICAgcGZkLnJldmVudHMgPSAwOworICAgIHJldCA9IHBvbGwoJnBmZCwgMSwgLTEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTEhVUCB8fCBwZmQucmV2ZW50cyAmIFBPTExFUlIpIHsKKyAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMT1VUKSB7CisgICAgICByZXQgPSBzZW5kKGZkLCBwb3MsIGtTaXplLCAwKTsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBrU2l6ZSAtPSByZXQ7CisgICAgICBwb3MgKz0gcmV0OworICAgIH0KICAgfQorI2Vsc2UKKyAgZmRfc2V0IHdmZHMsIGVmZHM7CisKKyAgd2hpbGUgKGtTaXplID4gMCkgeworICAgIEZEX1pFUk8oJndmZHMpOworICAgIEZEX1pFUk8oJmVmZHMpOworICAgIEZEX1NFVChmZCwgJndmZHMpOworICAgIEZEX1NFVChmZCwgJmVmZHMpOworICAgIHJldCA9IHNlbGVjdChzdGF0aWNfY2FzdDxpbnQ+KGZkICsgMSksIE5VTEwsICZ3ZmRzLCAmZWZkcywgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAoRkRfSVNTRVQoZmQsICZlZmRzKSkgeworICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoZmQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChGRF9JU1NFVChmZCwgJndmZHMpKSB7CisgICAgICByZXQgPSBzZW5kKGZkLCBwb3MsIGtTaXplLCAwKTsKKyAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4pIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGZkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBrU2l6ZSAtPSByZXQ7CisgICAgICBwb3MgKz0gcmV0OworICAgIH0KKyAgfQorI2VuZGlmCiAKICAgcmV0dXJuIHRydWU7CiB9CiAKIC8qIHN0YXRpYyAqLwogdm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6bm90aWZ5SGFuZGxlcihldnV0aWxfc29ja2V0X3QgZmQsIHNob3J0IHdoaWNoLCB2b2lkKiB2KSB7Ci0gIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCA9IChUTm9uYmxvY2tpbmdJT1RocmVhZCopIHY7CisgIFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCA9IChUTm9uYmxvY2tpbmdJT1RocmVhZCopdjsKICAgYXNzZXJ0KGlvVGhyZWFkKTsKICAgKHZvaWQpd2hpY2g7CiAKICAgd2hpbGUgKHRydWUpIHsKICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gMDsKICAgICBjb25zdCBpbnQga1NpemUgPSBzaXplb2YoY29ubmVjdGlvbik7Ci0gICAgaW50IG5CeXRlcyA9IHJlY3YoZmQsIGNhc3Rfc29ja29wdCgmY29ubmVjdGlvbiksIGtTaXplLCAwKTsKKyAgICBsb25nIG5CeXRlcyA9IHJlY3YoZmQsIGNhc3Rfc29ja29wdCgmY29ubmVjdGlvbiksIGtTaXplLCAwKTsKICAgICBpZiAobkJ5dGVzID09IGtTaXplKSB7CiAgICAgICBpZiAoY29ubmVjdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNvbW1hbmQgdG8gc3RvcCBvdXIgdGhyZWFkLCBleGl0IHRoZSBoYW5kbGVyIQorICAgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKGZhbHNlKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgY29ubmVjdGlvbi0+dHJhbnNpdGlvbigpOwogICAgIH0gZWxzZSBpZiAobkJ5dGVzID4gMCkgewogICAgICAgLy8gdGhyb3cgYXdheSB0aGVzZSBieXRlcyBhbmQgaG9wZSB0aGF0IG5leHQgdGltZSB3ZSBnZXQgYSBzb2xpZCByZWFkCi0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJub3RpZnlIYW5kbGVyOiBCYWQgcmVhZCBvZiAlZCBieXRlcywgd2FudGVkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzLCBrU2l6ZSk7CisgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJub3RpZnlIYW5kbGVyOiBCYWQgcmVhZCBvZiAlZCBieXRlcywgd2FudGVkICVkIiwgbkJ5dGVzLCBrU2l6ZSk7CiAgICAgICBpb1RocmVhZC0+YnJlYWtMb29wKHRydWUpOwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAobkJ5dGVzID09IDApIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IE5vdGlmeSBzb2NrZXQgY2xvc2VkISIpOworICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcChmYWxzZSk7CiAgICAgICAvLyBleGl0IHRoZSBsb29wCiAgICAgICBicmVhazsKICAgICB9IGVsc2UgeyAvLyBuQnl0ZXMgPCAwCi0gICAgICBpZiAoZXJybm8gIT0gRVdPVUxEQkxPQ0sgJiYgZXJybm8gIT0gRUFHQUlOKSB7Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigKLSAgICAgICAgICAgICJUTm9uYmxvY2tpbmc6IG5vdGlmeUhhbmRsZXIgcmVhZCgpIGZhaWxlZDogIiwgZXJybm8pOwotICAgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AodHJ1ZSk7Ci0gICAgICAgICAgcmV0dXJuOworICAgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FV09VTERCTE9DSworICAgICAgICAgICYmIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FQUdBSU4pIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nOiBub3RpZnlIYW5kbGVyIHJlYWQoKSBmYWlsZWQ6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcCh0cnVlKTsKKyAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgLy8gZXhpdCB0aGUgbG9vcAogICAgICAgYnJlYWs7CkBAIC0xNDE1LDI3ICsxNDEzLDIyIEBACiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmJyZWFrTG9vcChib29sIGVycm9yKSB7CiAgIGlmIChlcnJvcikgewotICAgIEdsb2JhbE91dHB1dC5wcmludGYoCi0gICAgICAiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGV4aXRpbmcgd2l0aCBlcnJvci4iLCBudW1iZXJfKTsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZXhpdGluZyB3aXRoIGVycm9yLiIsIG51bWJlcl8pOwogICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlciB0byBkbyBoZXJlLCBidXQgZm9yIG5vdyBraWxsIHRoZQogICAgIC8vIHdob2xlIHByb2Nlc3MuCiAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBhYm9ydGluZyBwcm9jZXNzLiIpOwogICAgIDo6YWJvcnQoKTsKICAgfQogCi0gIC8vIHNldHMgYSBmbGFnIHNvIHRoYXQgdGhlIGxvb3AgZXhpdHMgb24gdGhlIG5leHQgZXZlbnQKLSAgZXZlbnRfYmFzZV9sb29wYnJlYWsoZXZlbnRCYXNlXyk7Ci0KLSAgLy8gZXZlbnRfYmFzZV9sb29wYnJlYWsoKSBvbmx5IGNhdXNlcyB0aGUgbG9vcCB0byBleGl0IHRoZSBuZXh0IHRpbWUKLSAgLy8gaXQgd2FrZXMgdXAuICBXZSBuZWVkIHRvIGZvcmNlIGl0IHRvIHdha2UgdXAsIGluIGNhc2UgdGhlcmUgYXJlCi0gIC8vIG5vIHJlYWwgZXZlbnRzIGl0IG5lZWRzIHRvIHByb2Nlc3MuCi0gIC8vCiAgIC8vIElmIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlIHNhbWUgdGhyZWFkLCB3ZSBjYW4ndCB1c2UgdGhlIG5vdGlmeSgwKQogICAvLyBtZWNoYW5pc20gdG8gc3RvcCB0aGUgdGhyZWFkLCBidXQgaGFwcGlseSBpZiB3ZSdyZSBydW5uaW5nIGluIHRoZQogICAvLyBzYW1lIHRocmVhZCwgdGhpcyBtZWFucyB0aGUgdGhyZWFkIGNhbid0IGJlIGJsb2NraW5nIGluIHRoZSBldmVudAogICAvLyBsb29wIGVpdGhlci4KICAgaWYgKCFUaHJlYWQ6OmlzX2N1cnJlbnQodGhyZWFkSWRfKSkgewogICAgIG5vdGlmeShOVUxMKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBjYXVzZSB0aGUgbG9vcCB0byBzdG9wIEFTQVAgLSBldmVuIGlmIGl0IGhhcyB0aGluZ3MgdG8gZG8gaW4gaXQKKyAgICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKICAgfQogfQogCkBAIC0xNDQzLDcgKzE0MzYsNyBAQAogI2lmZGVmIEhBVkVfU0NIRURfSAogICAvLyBTdGFydCBvdXQgd2l0aCBhIHN0YW5kYXJkLCBsb3ctcHJpb3JpdHkgc2V0dXAgZm9yIHRoZSBzY2hlZCBwYXJhbXMuCiAgIHN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKLSAgYnplcm8oKHZvaWQqKSAmc3AsIHNpemVvZihzcCkpOworICBiemVybygodm9pZCopJnNwLCBzaXplb2Yoc3ApKTsKICAgaW50IHBvbGljeSA9IFNDSEVEX09USEVSOwogCiAgIC8vIElmIGRlc2lyZWQsIHNldCB1cCBoaWdoLXByaW9yaXR5IHNjaGVkIHBhcmFtcyBzdHJ1Y3R1cmUuCkBAIC0xNDUyLDcxICsxNDQ1LDU4IEBACiAgICAgcG9saWN5ID0gU0NIRURfRklGTzsKICAgICAvLyBUaGUgcHJpb3JpdHkgb25seSBjb21wYXJlcyB1cyB0byBvdGhlciBTQ0hFRF9GSUZPIHRocmVhZHMsIHNvIHdlCiAgICAgLy8ganVzdCBwaWNrIGEgcmFuZG9tIHByaW9yaXR5IGhhbGZ3YXkgYmV0d2VlbiBtaW4gJiBtYXguCi0gICAgY29uc3QgaW50IHByaW9yaXR5ID0gKHNjaGVkX2dldF9wcmlvcml0eV9tYXgocG9saWN5KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkX2dldF9wcmlvcml0eV9taW4ocG9saWN5KSkgLyAyOworICAgIGNvbnN0IGludCBwcmlvcml0eSA9IChzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KHBvbGljeSkgKyBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHBvbGljeSkpIC8gMjsKIAogICAgIHNwLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CiAgIH0KIAogICAvLyBBY3R1YWxseSBzZXQgdGhlIHNjaGVkIHBhcmFtcyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgogICBpZiAoMCA9PSBwdGhyZWFkX3NldHNjaGVkcGFyYW0ocHRocmVhZF9zZWxmKCksIHBvbGljeSwgJnNwKSkgewotICAgIEdsb2JhbE91dHB1dC5wcmludGYoCi0gICAgICAiVE5vbmJsb2NraW5nOiBJTyBUaHJlYWQgIyVkIHVzaW5nIGhpZ2gtcHJpb3JpdHkgc2NoZWR1bGVyISIsIG51bWJlcl8pOworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZzogSU8gVGhyZWFkICMlZCB1c2luZyBoaWdoLXByaW9yaXR5IHNjaGVkdWxlciEiLCBudW1iZXJfKTsKICAgfSBlbHNlIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmc6IHB0aHJlYWRfc2V0c2NoZWRwYXJhbSgpOiAiLCBlcnJubyk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nOiBwdGhyZWFkX3NldHNjaGVkcGFyYW0oKTogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICB9CisjZWxzZQorICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHZhbHVlKTsKICNlbmRpZgogfQogCiB2b2lkIFROb25ibG9ja2luZ0lPVGhyZWFkOjpydW4oKSB7Ci0gIHRocmVhZElkXyA9IFRocmVhZDo6Z2V0X2N1cnJlbnQoKTsKLQotICBhc3NlcnQoZXZlbnRCYXNlXyA9PSAwKTsKLSAgZXZlbnRCYXNlXyA9IGV2ZW50X2Jhc2VfbmV3KCk7Ci0KLSAgLy8gUHJpbnQgc29tZSBsaWJldmVudCBzdGF0cwotICBpZiAobnVtYmVyXyA9PSAwKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiB1c2luZyBsaWJldmVudCAlcyBtZXRob2QgJXMiLAotICAgICAgICAgICAgZXZlbnRfZ2V0X3ZlcnNpb24oKSwKLSAgICAgICAgICAgIGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChldmVudEJhc2VfKSk7CisgIGlmIChldmVudEJhc2VfID09IE5VTEwpIHsKKyAgICByZWdpc3RlckV2ZW50cygpOwogICB9Ci0KLQotICByZWdpc3RlckV2ZW50cygpOwotCi0gIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogSU8gdGhyZWFkICMlZCBlbnRlcmluZyBsb29wLi4uIiwKLSAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfKTsKLQogICBpZiAodXNlSGlnaFByaW9yaXR5XykgewogICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkodHJ1ZSk7CiAgIH0KIAotICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgotICBldmVudF9iYXNlX2xvb3AoZXZlbnRCYXNlXywgMCk7CisgIGlmIChldmVudEJhc2VfICE9IE5VTEwpCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZW50ZXJpbmcgbG9vcC4uLiIsIG51bWJlcl8pOworICAgIC8vIFJ1biBsaWJldmVudCBlbmdpbmUsIG5ldmVyIHJldHVybnMsIGludm9rZXMgY2FsbHMgdG8gZXZlbnRIYW5kbGVyCisgICAgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOwogCi0gIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7Ci0gICAgc2V0Q3VycmVudFRocmVhZEhpZ2hQcmlvcml0eShmYWxzZSk7CisgICAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKKyAgICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoZmFsc2UpOworICAgIH0KKworICAgIC8vIGNsZWFucyB1cCBvdXIgcmVnaXN0ZXJlZCBldmVudHMKKyAgICBjbGVhbnVwRXZlbnRzKCk7CiAgIH0KIAotICAvLyBjbGVhbnMgdXAgb3VyIHJlZ2lzdGVyZWQgZXZlbnRzCi0gIGNsZWFudXBFdmVudHMoKTsKLQotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgcnVuKCkgZG9uZSEiLAotICAgIG51bWJlcl8pOworICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgcnVuKCkgZG9uZSEiLCBudW1iZXJfKTsKIH0KIAogdm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6Y2xlYW51cEV2ZW50cygpIHsKICAgLy8gc3RvcCB0aGUgbGlzdGVuIHNvY2tldCwgaWYgYW55Ci0gIGlmIChsaXN0ZW5Tb2NrZXRfID49IDApIHsKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgaWYgKGV2ZW50X2RlbCgmc2VydmVyRXZlbnRfKSA9PSAtMSkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnN0b3AoKSBldmVudF9kZWw6ICIsIGVycm5vKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkOjpzdG9wKCkgZXZlbnRfZGVsOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgICAgfQogICB9CiAKICAgZXZlbnRfZGVsKCZub3RpZmljYXRpb25FdmVudF8pOwogfQogCi0KIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OnN0b3AoKSB7CiAgIC8vIFRoaXMgc2hvdWxkIGNhdXNlIHRoZSB0aHJlYWQgdG8gZmFsbCBvdXQgb2YgaXRzIGV2ZW50IGxvb3AgQVNBUC4KICAgYnJlYWtMb29wKGZhbHNlKTsKQEAgLTE1MzAsMTAgKzE1MTAsMTEgQEAKICAgICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBzYWZlIHRvIGJvdGggam9pbigpIG91cnNlbHZlcyB0d2ljZSwgYXMgd2VsbCBhcyBqb2luCiAgICAgICAvLyB0aGUgY3VycmVudCB0aHJlYWQgYXMgdGhlIHB0aHJlYWQgaW1wbGVtZW50YXRpb24gY2hlY2tzIGZvciBkZWFkbG9jay4KICAgICAgIHRocmVhZF8tPmpvaW4oKTsKLSAgICB9IGNhdGNoKC4uLikgeworICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgLy8gc3dhbGxvdyBldmVyeXRoaW5nCiAgICAgfQogICB9CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCmluZGV4IGU5OTU0MjQuLmU3OWMyNGYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaApAQCAtMjEsOSArMjEsMTIgQEAKICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CkBAIC0zMiwxOSArMzUsMjEgQEAKICNpbmNsdWRlIDxzdGFjaz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpZmRlZiBIQVZFX1VOSVNURF9ICiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxldmVudC5oPgorI2luY2x1ZGUgPGV2ZW50Mi9ldmVudF9jb21wYXQuaD4KKyNpbmNsdWRlIDxldmVudDIvZXZlbnRfc3RydWN0Lmg+CiAKLQotCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzZXJ2ZXIgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBzZXJ2ZXIgewogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpSdW5uYWJsZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKQEAgLTYzLDI3ICs2OCwyOCBAQAogI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX01BSk9SIDEKICNkZWZpbmUgTElCRVZFTlRfVkVSU0lPTl9NSU5PUiAxNAogI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX1JFTCAxMwotI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiAoKExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgPDwgMjQpIHwgKExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgPDwgMTYpIHwgKExJQkVWRU5UX1ZFUlNJT05fUkVMIDw8IDgpKQorI2RlZmluZSBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKExJQkVWRU5UX1ZFUlNJT05fTUFKT1IgPDwgMjQpIHwgKExJQkVWRU5UX1ZFUlNJT05fTUlOT1IgPDwgMTYpIHwgKExJQkVWRU5UX1ZFUlNJT05fUkVMIDw8IDgpKQogI2VuZGlmCiAKICNpZiBMSUJFVkVOVF9WRVJTSU9OX05VTUJFUiA8IDB4MDIwMDAwMDAKLSB0eXBlZGVmIGludCBldnV0aWxfc29ja2V0X3Q7Cit0eXBlZGVmIFRIUklGVF9TT0NLRVQgZXZ1dGlsX3NvY2tldF90OwogI2VuZGlmCiAKICNpZm5kZWYgU09DS09QVF9DQVNUX1QKLSMgICBpZm5kZWYgX1dJTjMyCi0jICAgICAgIGRlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCi0jICAgZWxzZQotIyAgICAgICBkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgotIyAgIGVuZGlmIC8vIF9XSU4zMgorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgogI2VuZGlmCiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGlubGluZSBjb25zdCBTT0NLT1BUX0NBU1RfVCogY29uc3RfY2FzdF9zb2Nrb3B0KGNvbnN0IFQqIHYpIHsKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgewogICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOwogfQpAQCAtOTMsMjggKzk5LDI0IEBACiAgKiBvcGVyYXRlcyBhIHNldCBvZiBJTyB0aHJlYWRzIChieSBkZWZhdWx0IG9ubHkgb25lKS4gSXQgYXNzdW1lcyB0aGF0CiAgKiBhbGwgaW5jb21pbmcgcmVxdWVzdHMgYXJlIGZyYW1lZCB3aXRoIGEgNCBieXRlIGxlbmd0aCBpbmRpY2F0b3IgYW5kCiAgKiB3cml0ZXMgb3V0IHJlc3BvbnNlcyB1c2luZyB0aGUgc2FtZSBmcmFtaW5nLgotICoKLSAqIEl0IGRvZXMgbm90IHVzZSB0aGUgVFNlcnZlclRyYW5zcG9ydCBmcmFtZXdvcmssIGJ1dCByYXRoZXIgaGFzIHNvY2tldAotICogb3BlcmF0aW9ucyBoYXJkY29kZWQgZm9yIHVzZSB3aXRoIHNlbGVjdC4KLSAqCiAgKi8KIAotCiAvLy8gT3ZlcmxvYWQgY29uZGl0aW9uIGFjdGlvbnMuCiBlbnVtIFRPdmVybG9hZEFjdGlvbiB7Ci0gIFRfT1ZFUkxPQURfTk9fQUNUSU9OLCAgICAgICAgLy8vPCBEb24ndCBoYW5kbGUgb3ZlcmxvYWQgKi8KLSAgVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQsICAvLy88IERyb3AgbmV3IGNvbm5lY3Rpb25zIGltbWVkaWF0ZWx5ICovCi0gIFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSAgLy8vPCBEcm9wIHNvbWUgdGFza3MgZnJvbSBoZWFkIG9mIHRhc2sgcXVldWUgKi8KKyAgVF9PVkVSTE9BRF9OT19BQ1RJT04sICAgICAgIC8vLzwgRG9uJ3QgaGFuZGxlIG92ZXJsb2FkICovCisgIFRfT1ZFUkxPQURfQ0xPU0VfT05fQUNDRVBULCAvLy88IERyb3AgbmV3IGNvbm5lY3Rpb25zIGltbWVkaWF0ZWx5ICovCisgIFRfT1ZFUkxPQURfRFJBSU5fVEFTS19RVUVVRSAvLy88IERyb3Agc29tZSB0YXNrcyBmcm9tIGhlYWQgb2YgdGFzayBxdWV1ZSAqLwogfTsKIAogY2xhc3MgVE5vbmJsb2NraW5nSU9UaHJlYWQ7CiAKIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlciA6IHB1YmxpYyBUU2VydmVyIHsKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgY2xhc3MgVENvbm5lY3Rpb247CiAKICAgZnJpZW5kIGNsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkOwotIHByaXZhdGU6CisKK3ByaXZhdGU6CiAgIC8vLyBMaXN0ZW4gYmFja2xvZwogICBzdGF0aWMgY29uc3QgaW50IExJU1RFTl9CQUNLTE9HID0gMTAyNDsKIApAQCAtMTQ1LDkgKzE0Nyw2IEBACiAgIC8vLyAjIG9mIElPIHRocmVhZHMgdG8gdXNlIGJ5IGRlZmF1bHQKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0lPX1RIUkVBRFMgPSAxOwogCi0gIC8vLyBGaWxlIGRlc2NyaXB0b3Igb2YgYW4gaW52YWxpZCBzb2NrZXQKLSAgc3RhdGljIGNvbnN0IGludCBJTlZBTElEX1NPQ0tFVF9WQUxVRSA9IC0xOwotCiAgIC8vLyAjIG9mIElPIHRocmVhZHMgdGhpcyBzZXJ2ZXIgd2lsbCB1c2UKICAgc2l6ZV90IG51bUlPVGhyZWFkc187CiAKQEAgLTE1NSwyMiArMTU0LDIyIEBACiAgIGJvb2wgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsKIAogICAvLy8gU2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKLSAgaW50IHNlcnZlclNvY2tldF87CisgIFRIUklGVF9TT0NLRVQgc2VydmVyU29ja2V0XzsKIAotICAvLy8gUG9ydCBzZXJ2ZXIgcnVucyBvbgotICBpbnQgcG9ydF87CisgIC8vLyBUaGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQorICBldmVudF9iYXNlKiB1c2VyRXZlbnRCYXNlXzsKIAogICAvLy8gRm9yIHByb2Nlc3NpbmcgdmlhIHRocmVhZCBwb29sLCBtYXkgYmUgTlVMTAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwogCiAgIC8vLyBJcyB0aHJlYWQgcG9vbCBwcm9jZXNzaW5nPwogICBib29sIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsKIAogICAvLyBGYWN0b3J5IHRvIGNyZWF0ZSB0aGUgSU8gdGhyZWFkcwotICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IGlvVGhyZWFkRmFjdG9yeV87CiAKICAgLy8gVmVjdG9yIG9mIElPVGhyZWFkIG9iamVjdHMgdGhhdCB3aWxsIGhhbmRsZSBvdXIgSU8KLSAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+ID4gaW9UaHJlYWRzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiA+IGlvVGhyZWFkc187CiAKICAgLy8gSW5kZXggb2YgbmV4dCBJTyBUaHJlYWQgdG8gYmUgdXNlZCAoZm9yIHJvdW5kLXJvYmluKQogICB1aW50MzJfdCBuZXh0SU9UaHJlYWRfOwpAQCAtMjU2LDIxICsyNTUsMzIgQEAKICAgc3RkOjpzdGFjazxUQ29ubmVjdGlvbio+IGNvbm5lY3Rpb25TdGFja187CiAKICAgLyoqCisgICAqIFRoaXMgY29udGFpbmVyIGhvbGRzIHBvaW50ZXJzIHRvIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMuIFRoaXMgY29udGFpbmVyCisgICAqIGFsbG93cyB0aGUgc2VydmVyIHRvIGNsZWFuIHVwIHVubGNvc2VkIGNvbm5lY3Rpb24gb2JqZWN0cyBhdCBkZXN0cnVjdGlvbiwKKyAgICogd2hpY2ggaW4gdHVybiBhbGxvd3MgdGhlaXIgdHJhbnNwb3J0cywgcHJvdG9jb2xzLCBwcm9jZXNzb3JzIGFuZCBoYW5kbGVycworICAgKiB0byBkZWFsbG9jYXRlIGFuZCBjbGVhbiB1cCBjb3JyZWN0bHkuCisgICAqLworICBzdGQ6OnZlY3RvcjxUQ29ubmVjdGlvbio+IGFjdGl2ZUNvbm5lY3Rpb25zXzsKKworICAvKgorICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworCisgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBzZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nCiAgICAqIGNsaWVudCBjb25uZWN0aW9ucyBvbiBsaXN0ZW4gc29ja2V0IGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cwogICAgKiB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCiAgICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgbGlzdGVuIHNvY2tldC4KICAgICogQHBhcmFtIHdoaWNoIHRoZSBldmVudCBmbGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyLgogICAgKi8KLSAgdm9pZCBoYW5kbGVFdmVudChpbnQgZmQsIHNob3J0IHdoaWNoKTsKKyAgdm9pZCBoYW5kbGVFdmVudChUSFJJRlRfU09DS0VUIGZkLCBzaG9ydCB3aGljaCk7CiAKLSAgdm9pZCBpbml0KGludCBwb3J0KSB7Ci0gICAgc2VydmVyU29ja2V0XyA9IC0xOworICB2b2lkIGluaXQoKSB7CisgICAgc2VydmVyU29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKICAgICBudW1JT1RocmVhZHNfID0gREVGQVVMVF9JT19USFJFQURTOwogICAgIG5leHRJT1RocmVhZF8gPSAwOwogICAgIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSBmYWxzZTsKLSAgICBwb3J0XyA9IHBvcnQ7CisgICAgdXNlckV2ZW50QmFzZV8gPSBOVUxMOwogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwogICAgIG51bVRDb25uZWN0aW9uc18gPSAwOwogICAgIG51bUFjdGl2ZVByb2Nlc3NvcnNfID0gMDsKQEAgLTI5MCw3MiArMzAwLDU2IEBACiAgICAgblRvdGFsQ29ubmVjdGlvbnNEcm9wcGVkXyA9IDA7CiAgIH0KIAotIHB1YmxpYzoKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKLSAgICBpbml0KHBvcnQpOworcHVibGljOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKICAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvcikgewotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgaW50IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCksCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSB7CiAKLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgaW50IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciA9Ci0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCksCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yKSB7Ci0KLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5KTsKICAgICBzZXRUaHJlYWRNYW5hZ2VyKHRocmVhZE1hbmFnZXIpOwogICB9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVE5vbmJsb2NraW5nU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBpbnQgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyID0KLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKLQotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKIAogICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOwogICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7CkBAIC0zNjQsMjAgKzM1OCwxNiBAQAogICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CiAgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+Ci0gIFROb25ibG9ja2luZ1NlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGludCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIgPQotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpLAotICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvcikgewotCi0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogCiAgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGlucHV0VHJhbnNwb3J0RmFjdG9yeSk7CiAgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KTsKQEAgLTM4OCwxMSArMzc4LDExIEBACiAKICAgflROb25ibG9ja2luZ1NlcnZlcigpOwogCi0gIHZvaWQgc2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKKyAgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgewotICAgIHJldHVybiB0aHJlYWRNYW5hZ2VyXzsKLSAgfQorICBpbnQgZ2V0TGlzdGVuUG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF8tPmdldExpc3RlblBvcnQoKTsgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgeyByZXR1cm4gdGhyZWFkTWFuYWdlcl87IH0KIAogICAvKioKICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIElPIHRocmVhZHMgdXNlZCBieSB0aGlzIHNlcnZlci4gQ2FuIG9ubHkgYmUgdXNlZCBiZWZvcmUKQEAgLTQwMiw0NiArMzkyLDM2IEBACiAgICAqLwogICB2b2lkIHNldE51bUlPVGhyZWFkcyhzaXplX3QgbnVtVGhyZWFkcykgewogICAgIG51bUlPVGhyZWFkc18gPSBudW1UaHJlYWRzOworICAgIC8vIFVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSBkb2Vzbid0IHdvcmtzIGZvciBtdWx0aS10aHJlYWRlZCBzZXJ2ZXJzCisgICAgYXNzZXJ0KG51bUlPVGhyZWFkc18gPD0gMSB8fCAhdXNlckV2ZW50QmFzZV8pOwogICB9CiAKICAgLyoqIFJldHVybiB3aGV0aGVyIHRoZSBJTyB0aHJlYWRzIHdpbGwgZ2V0IGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSAqLwotICBib29sIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXzsKLSAgfQorICBib29sIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc187IH0KIAogICAvKiogU2V0IHdoZXRoZXIgdGhlIElPIHRocmVhZHMgd2lsbCBnZXQgaGlnaCBzY2hlZHVsaW5nIHByaW9yaXR5LiAqLwotICB2b2lkIHNldFVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkcyhib29sIHZhbCkgewotICAgIHVzZUhpZ2hQcmlvcml0eUlPVGhyZWFkc18gPSB2YWw7Ci0gIH0KKyAgdm9pZCBzZXRVc2VIaWdoUHJpb3JpdHlJT1RocmVhZHMoYm9vbCB2YWwpIHsgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXyA9IHZhbDsgfQogCiAgIC8qKiBSZXR1cm4gdGhlIG51bWJlciBvZiBJTyB0aHJlYWRzIHVzZWQgYnkgdGhpcyBzZXJ2ZXIuICovCi0gIHNpemVfdCBnZXROdW1JT1RocmVhZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG51bUlPVGhyZWFkc187Ci0gIH0KKyAgc2l6ZV90IGdldE51bUlPVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIG51bUlPVGhyZWFkc187IH0KIAogICAvKioKICAgICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB1bnVzZWQgVENvbm5lY3Rpb24gd2Ugd2lsbCBob2xkIGluIHJlc2VydmUuCiAgICAqCiAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbGltaXQgb24gVENvbm5lY3Rpb24gcG9vbCBzaXplLgogICAgKi8KLSAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBjb25uZWN0aW9uU3RhY2tMaW1pdF87Ci0gIH0KKyAgc2l6ZV90IGdldENvbm5lY3Rpb25TdGFja0xpbWl0KCkgY29uc3QgeyByZXR1cm4gY29ubmVjdGlvblN0YWNrTGltaXRfOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW51c2VkIFRDb25uZWN0aW9uIHdlIHdpbGwgaG9sZCBpbiByZXNlcnZlLgogICAgKgogICAgKiBAcGFyYW0gc3ogdGhlIG5ldyBsaW1pdCBmb3IgVENvbm5lY3Rpb24gcG9vbCBzaXplLgogICAgKi8KLSAgdm9pZCBzZXRDb25uZWN0aW9uU3RhY2tMaW1pdChzaXplX3Qgc3opIHsKLSAgICBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsKLSAgfQorICB2b2lkIHNldENvbm5lY3Rpb25TdGFja0xpbWl0KHNpemVfdCBzeikgeyBjb25uZWN0aW9uU3RhY2tMaW1pdF8gPSBzejsgfQogCi0gIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGhyZWFkUG9vbFByb2Nlc3NpbmdfOwotICB9CisgIGJvb2wgaXNUaHJlYWRQb29sUHJvY2Vzc2luZygpIGNvbnN0IHsgcmV0dXJuIHRocmVhZFBvb2xQcm9jZXNzaW5nXzsgfQogCi0gIHZvaWQgYWRkVGFzayhib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgeworICB2b2lkIGFkZFRhc2soc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CiAgICAgdGhyZWFkTWFuYWdlcl8tPmFkZCh0YXNrLCAwTEwsIHRhc2tFeHBpcmVUaW1lXyk7CiAgIH0KIApAQCAtNDUwLDI3ICs0MzAsMjEgQEAKICAgICoKICAgICogQHJldHVybiBjb3VudCBvZiBjb25uZWN0ZWQgc29ja2V0cy4KICAgICovCi0gIHNpemVfdCBnZXROdW1Db25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtVENvbm5lY3Rpb25zXzsKLSAgfQorICBzaXplX3QgZ2V0TnVtQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBudW1UQ29ubmVjdGlvbnNfOyB9CiAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgY291bnQgb2Ygc29ja2V0cyBjdXJyZW50bHkgY29ubmVjdGVkIHRvLgogICAgKgogICAgKiBAcmV0dXJuIGNvdW50IG9mIGNvbm5lY3RlZCBzb2NrZXRzLgogICAgKi8KLSAgc2l6ZV90IGdldE51bUFjdGl2ZUNvbm5lY3Rpb25zKCkgY29uc3QgewotICAgIHJldHVybiBnZXROdW1Db25uZWN0aW9ucygpIC0gZ2V0TnVtSWRsZUNvbm5lY3Rpb25zKCk7Ci0gIH0KKyAgc2l6ZV90IGdldE51bUFjdGl2ZUNvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtQ29ubmVjdGlvbnMoKSAtIGdldE51bUlkbGVDb25uZWN0aW9ucygpOyB9CiAKICAgLyoqCiAgICAqIFJldHVybiB0aGUgY291bnQgb2YgY29ubmVjdGlvbiBvYmplY3RzIGFsbG9jYXRlZCBidXQgbm90IGluIHVzZS4KICAgICoKICAgICogQHJldHVybiBjb3VudCBvZiBpZGxlIGNvbm5lY3Rpb24gb2JqZWN0cy4KICAgICovCi0gIHNpemVfdCBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbm5lY3Rpb25TdGFja18uc2l6ZSgpOwotICB9CisgIHNpemVfdCBnZXROdW1JZGxlQ29ubmVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBjb25uZWN0aW9uU3RhY2tfLnNpemUoKTsgfQogCiAgIC8qKgogICAgKiBSZXR1cm4gY291bnQgb2YgbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgcHJvY2Vzc2luZy4KQEAgLTQ4MCw5ICs0NTQsNyBAQAogICAgKgogICAgKiBAcmV0dXJuICMgb2YgY29ubmVjdGlvbnMgY3VycmVudGx5IHByb2Nlc3NpbmcuCiAgICAqLwotICBzaXplX3QgZ2V0TnVtQWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbnVtQWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KKyAgc2l6ZV90IGdldE51bUFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBudW1BY3RpdmVQcm9jZXNzb3JzXzsgfQogCiAgIC8vLyBJbmNyZW1lbnQgdGhlIGNvdW50IG9mIGNvbm5lY3Rpb25zIGN1cnJlbnRseSBwcm9jZXNzaW5nLgogICB2b2lkIGluY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKSB7CkBAIC01MDMsMjcgKzQ3NSwyMSBAQAogICAgKgogICAgKiBAcmV0dXJuIGN1cnJlbnQgc2V0dGluZy4KICAgICovCi0gIHNpemVfdCBnZXRNYXhDb25uZWN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF4Q29ubmVjdGlvbnNfOwotICB9CisgIHNpemVfdCBnZXRNYXhDb25uZWN0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1heENvbm5lY3Rpb25zXzsgfQogCiAgIC8qKgogICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyBhbGxvd2VkIGJlZm9yZSBvdmVybG9hZC4KICAgICoKICAgICogQHBhcmFtIG1heENvbm5lY3Rpb25zIG5ldyBzZXR0aW5nIGZvciBtYXhpbXVtICMgb2YgY29ubmVjdGlvbnMuCiAgICAqLwotICB2b2lkIHNldE1heENvbm5lY3Rpb25zKHNpemVfdCBtYXhDb25uZWN0aW9ucykgewotICAgIG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOwotICB9CisgIHZvaWQgc2V0TWF4Q29ubmVjdGlvbnMoc2l6ZV90IG1heENvbm5lY3Rpb25zKSB7IG1heENvbm5lY3Rpb25zXyA9IG1heENvbm5lY3Rpb25zOyB9CiAKICAgLyoqCiAgICAqIEdldCB0aGUgbWF4aW11bSAjIG9mIGNvbm5lY3Rpb25zIHdhaXRpbmcgaW4gaGFuZGxlci90YXNrIGJlZm9yZSBvdmVybG9hZC4KICAgICoKICAgICogQHJldHVybiBjdXJyZW50IHNldHRpbmcuCiAgICAqLwotICBzaXplX3QgZ2V0TWF4QWN0aXZlUHJvY2Vzc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWF4QWN0aXZlUHJvY2Vzc29yc187Ci0gIH0KKyAgc2l6ZV90IGdldE1heEFjdGl2ZVByb2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBtYXhBY3RpdmVQcm9jZXNzb3JzXzsgfQogCiAgIC8qKgogICAgKiBTZXQgdGhlIG1heGltdW0gIyBvZiBjb25uZWN0aW9ucyB3YWl0aW5nIGluIGhhbmRsZXIvdGFzayBiZWZvcmUgb3ZlcmxvYWQuCkBAIC01NDIsMjcgKzUwOCwyMSBAQAogICAgKgogICAgKiBAcmV0dXJuIE1heGl1bSBmcmFtZSBzaXplLCBpbiBieXRlcy4KICAgICovCi0gIHNpemVfdCBnZXRNYXhGcmFtZVNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1heEZyYW1lU2l6ZV87Ci0gIH0KKyAgc2l6ZV90IGdldE1heEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1heEZyYW1lU2l6ZV87IH0KIAogICAvKioKICAgICogU2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgZnJhbWUgc2l6ZS4KICAgICoKICAgICogQHBhcmFtIG1heEZyYW1lU2l6ZSBUaGUgbmV3IG1heGltdW0gZnJhbWUgc2l6ZS4KICAgICovCi0gIHZvaWQgc2V0TWF4RnJhbWVTaXplKHNpemVfdCBtYXhGcmFtZVNpemUpIHsKLSAgICBtYXhGcmFtZVNpemVfID0gbWF4RnJhbWVTaXplOwotICB9CisgIHZvaWQgc2V0TWF4RnJhbWVTaXplKHNpemVfdCBtYXhGcmFtZVNpemUpIHsgbWF4RnJhbWVTaXplXyA9IG1heEZyYW1lU2l6ZTsgfQogCiAgIC8qKgogICAgKiBHZXQgZnJhY3Rpb24gb2YgbWF4aW11bSBsaW1pdHMgYmVmb3JlIGFuIG92ZXJsb2FkIGNvbmRpdGlvbiBpcyBjbGVhcmVkLgogICAgKgogICAgKiBAcmV0dXJuIGh5c3RlcmVzaXMgZnJhY3Rpb24KICAgICovCi0gIGRvdWJsZSBnZXRPdmVybG9hZEh5c3RlcmVzaXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187Ci0gIH0KKyAgZG91YmxlIGdldE92ZXJsb2FkSHlzdGVyZXNpcygpIGNvbnN0IHsgcmV0dXJuIG92ZXJsb2FkSHlzdGVyZXNpc187IH0KIAogICAvKioKICAgICogU2V0IGZyYWN0aW9uIG9mIG1heGltdW0gbGltaXRzIGJlZm9yZSBhbiBvdmVybG9hZCBjb25kaXRpb24gaXMgY2xlYXJlZC4KQEAgLTU4MSwzNiArNTQxLDI4IEBACiAgICAqCiAgICAqIEByZXR1cm4gYSBUT3ZlcmxvYWRBY3Rpb24gZW51bSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnRseSBzZXQgYWN0aW9uLgogICAgKi8KLSAgVE92ZXJsb2FkQWN0aW9uIGdldE92ZXJsb2FkQWN0aW9uKCkgY29uc3QgewotICAgIHJldHVybiBvdmVybG9hZEFjdGlvbl87Ci0gIH0KKyAgVE92ZXJsb2FkQWN0aW9uIGdldE92ZXJsb2FkQWN0aW9uKCkgY29uc3QgeyByZXR1cm4gb3ZlcmxvYWRBY3Rpb25fOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgYWN0aW9uIHRoZSBzZXJ2ZXIgaXMgdG8gdGFrZSBvbiBvdmVybG9hZC4KICAgICoKICAgICogQHBhcmFtIG92ZXJsb2FkQWN0aW9uIGEgVE92ZXJsb2FkQWN0aW9uIGVudW0gdmFsdWUgZm9yIHRoZSBhY3Rpb24uCiAgICAqLwotICB2b2lkIHNldE92ZXJsb2FkQWN0aW9uKFRPdmVybG9hZEFjdGlvbiBvdmVybG9hZEFjdGlvbikgewotICAgIG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOwotICB9CisgIHZvaWQgc2V0T3ZlcmxvYWRBY3Rpb24oVE92ZXJsb2FkQWN0aW9uIG92ZXJsb2FkQWN0aW9uKSB7IG92ZXJsb2FkQWN0aW9uXyA9IG92ZXJsb2FkQWN0aW9uOyB9CiAKICAgLyoqCiAgICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgd2hpY2ggYSB0YXNrIGV4cGlyZXMgKDAgPT0gaW5maW5pdGUpLgogICAgKgogICAgKiBAcmV0dXJuIGEgNjQtYml0IHRpbWUgaW4gbWlsbGlzZWNvbmRzLgogICAgKi8KLSAgaW50NjRfdCBnZXRUYXNrRXhwaXJlVGltZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdGFza0V4cGlyZVRpbWVfOwotICB9CisgIGludDY0X3QgZ2V0VGFza0V4cGlyZVRpbWUoKSBjb25zdCB7IHJldHVybiB0YXNrRXhwaXJlVGltZV87IH0KIAogICAvKioKICAgICogU2V0IHRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciB3aGljaCBhIHRhc2sgZXhwaXJlcyAoMCA9PSBpbmZpbml0ZSkuCiAgICAqCiAgICAqIEBwYXJhbSB0YXNrRXhwaXJlVGltZSBhIDY0LWJpdCB0aW1lIGluIG1pbGxpc2Vjb25kcy4KICAgICovCi0gIHZvaWQgc2V0VGFza0V4cGlyZVRpbWUoaW50NjRfdCB0YXNrRXhwaXJlVGltZSkgewotICAgIHRhc2tFeHBpcmVUaW1lXyA9IHRhc2tFeHBpcmVUaW1lOwotICB9CisgIHZvaWQgc2V0VGFza0V4cGlyZVRpbWUoaW50NjRfdCB0YXNrRXhwaXJlVGltZSkgeyB0YXNrRXhwaXJlVGltZV8gPSB0YXNrRXhwaXJlVGltZTsgfQogCiAgIC8qKgogICAgKiBEZXRlcm1pbmUgaWYgdGhlIHNlcnZlciBpcyBjdXJyZW50bHkgb3ZlcmxvYWRlZC4KQEAgLTYzNCwyNyArNTg2LDIxIEBACiAgICAqCiAgICAqIEByZXR1cm4gIyBieXRlcyB3ZSBpbml0aWFsaXplIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyIHRvLgogICAgKi8KLSAgc2l6ZV90IGdldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfOwotICB9CisgIHNpemVfdCBnZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkgY29uc3QgeyByZXR1cm4gd3JpdGVCdWZmZXJEZWZhdWx0U2l6ZV87IH0KIAogICAvKioKICAgICogU2V0IHRoZSBzdGFydGluZyBzaXplIG9mIGEgVENvbm5lY3Rpb24gb2JqZWN0J3Mgd3JpdGUgYnVmZmVyLgogICAgKgogICAgKiBAcGFyYW0gc2l6ZSAjIGJ5dGVzIHdlIGluaXRpYWxpemUgYSBUQ29ubmVjdGlvbiBvYmplY3QncyB3cml0ZSBidWZmZXIgdG8uCiAgICAqLwotICB2b2lkIHNldFdyaXRlQnVmZmVyRGVmYXVsdFNpemUoc2l6ZV90IHNpemUpIHsKLSAgICB3cml0ZUJ1ZmZlckRlZmF1bHRTaXplXyA9IHNpemU7Ci0gIH0KKyAgdm9pZCBzZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKHNpemVfdCBzaXplKSB7IHdyaXRlQnVmZmVyRGVmYXVsdFNpemVfID0gc2l6ZTsgfQogCiAgIC8qKgogICAgKiBHZXQgdGhlIG1heGltdW0gc2l6ZSBvZiByZWFkIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgogICAgKgogICAgKiBAcmV0dXJuICMgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgZGVhbGxvYyBpZGxlIGJ1ZmZlci4KICAgICovCi0gIHNpemVfdCBnZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLSAgfQorICBzaXplX3QgZ2V0SWRsZVJlYWRCdWZmZXJMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGlkbGVSZWFkQnVmZmVyTGltaXRfOyB9CiAKICAgLyoqCiAgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIGdldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCkBAIC02NjIsOSArNjA4LDcgQEAKICAgICoKICAgICogQHJldHVybiAjIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIGRlYWxsb2MgaWRsZSBidWZmZXIuCiAgICAqLwotICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlUmVhZEJ1ZmZlckxpbWl0XzsKLSAgfQorICBzaXplX3QgZ2V0SWRsZUJ1ZmZlck1lbUxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVJlYWRCdWZmZXJMaW1pdF87IH0KIAogICAvKioKICAgICogU2V0IHRoZSBtYXhpbXVtIHNpemUgcmVhZCBidWZmZXIgYWxsb2NhdGVkIHRvIGlkbGUgVENvbm5lY3Rpb24gb2JqZWN0cy4KQEAgLTY3NSw5ICs2MTksNyBAQAogICAgKgogICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgogICAgKi8KLSAgdm9pZCBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KHNpemVfdCBsaW1pdCkgewotICAgIGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRJZGxlUmVhZEJ1ZmZlckxpbWl0KHNpemVfdCBsaW1pdCkgeyBpZGxlUmVhZEJ1ZmZlckxpbWl0XyA9IGxpbWl0OyB9CiAKICAgLyoqCiAgICAqIFtOT1RFOiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdXNlIHNldElkbGVSZWFkQnVmZmVyTGltaXQoKS5dCkBAIC02ODksMjAgKzYzMSwxNCBAQAogICAgKgogICAgKiBAcGFyYW0gbGltaXQgb2YgYnl0ZXMgYmV5b25kIHdoaWNoIHdlIHdpbGwgc2hyaW5rIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgogICAgKi8KLSAgdm9pZCBzZXRJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZVJlYWRCdWZmZXJMaW1pdF8gPSBsaW1pdDsKLSAgfQotCi0KKyAgdm9pZCBzZXRJZGxlQnVmZmVyTWVtTGltaXQoc2l6ZV90IGxpbWl0KSB7IGlkbGVSZWFkQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KIAogICAvKioKICAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygd3JpdGUgYnVmZmVyIGFsbG9jYXRlZCB0byBpZGxlIFRDb25uZWN0aW9uIG9iamVjdHMuCiAgICAqCiAgICAqIEByZXR1cm4gIyBieXRlcyBiZXlvbmQgd2hpY2ggd2Ugd2lsbCByZWFsbG9jYXRlIGJ1ZmZlcnMgd2hlbiBjaGVja2VkLgogICAgKi8KLSAgc2l6ZV90IGdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkgY29uc3QgewotICAgIHJldHVybiBpZGxlV3JpdGVCdWZmZXJMaW1pdF87Ci0gIH0KKyAgc2l6ZV90IGdldElkbGVXcml0ZUJ1ZmZlckxpbWl0KCkgY29uc3QgeyByZXR1cm4gaWRsZVdyaXRlQnVmZmVyTGltaXRfOyB9CiAKICAgLyoqCiAgICAqIFNldCB0aGUgbWF4aW11bSBzaXplIHdyaXRlIGJ1ZmZlciBhbGxvY2F0ZWQgdG8gaWRsZSBUQ29ubmVjdGlvbiBvYmplY3RzLgpAQCAtNzEzLDI5ICs2NDksMjMgQEAKICAgICoKICAgICogQHBhcmFtIGxpbWl0IG9mIGJ5dGVzIGJleW9uZCB3aGljaCB3ZSB3aWxsIHNocmluayBidWZmZXJzIHdoZW4gaWRsZS4KICAgICovCi0gIHZvaWQgc2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoc2l6ZV90IGxpbWl0KSB7Ci0gICAgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7Ci0gIH0KKyAgdm9pZCBzZXRJZGxlV3JpdGVCdWZmZXJMaW1pdChzaXplX3QgbGltaXQpIHsgaWRsZVdyaXRlQnVmZmVyTGltaXRfID0gbGltaXQ7IH0KIAogICAvKioKICAgICogR2V0ICMgb2YgY2FsbHMgbWFkZSBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4gIDAgbWVhbnMgZGlzYWJsZWQuCiAgICAqCiAgICAqIEByZXR1cm4gIyBvZiBjYWxscyBiZXR3ZWVuIGJ1ZmZlciBzaXplIGNoZWNrcy4KICAgICovCi0gIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgewotICAgIHJldHVybiByZXNpemVCdWZmZXJFdmVyeU5fOwotICB9CisgIGludDMyX3QgZ2V0UmVzaXplQnVmZmVyRXZlcnlOKCkgY29uc3QgeyByZXR1cm4gcmVzaXplQnVmZmVyRXZlcnlOXzsgfQogCiAgIC8qKgogICAgKiBDaGVjayBidWZmZXIgc2l6ZXMgZXZlcnkgImNvdW50IiBjYWxscy4gIFRoaXMgYWxsb3dzIGJ1ZmZlciBsaW1pdHMKLSAgICogdG8gYmUgZW5mb3JjZWQgZm9yIHBlcnNpc3RhbnQgY29ubmVjdGlvbnMgd2l0aCBhIGNvbnRyb2xsYWJsZSBkZWdyZWUKKyAgICogdG8gYmUgZW5mb3JjZWQgZm9yIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2l0aCBhIGNvbnRyb2xsYWJsZSBkZWdyZWUKICAgICogb2Ygb3ZlcmhlYWQuIDAgZGlzYWJsZXMgY2hlY2tzIGV4Y2VwdCBhdCBjb25uZWN0aW9uIGNsb3NlLgogICAgKgogICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiBjYWxscyBiZXR3ZWVuIGNoZWNrcywgb3IgMCB0byBkaXNhYmxlCiAgICAqLwotICB2b2lkIHNldFJlc2l6ZUJ1ZmZlckV2ZXJ5TihpbnQzMl90IGNvdW50KSB7Ci0gICAgcmVzaXplQnVmZmVyRXZlcnlOXyA9IGNvdW50OwotICB9CisgIHZvaWQgc2V0UmVzaXplQnVmZmVyRXZlcnlOKGludDMyX3QgY291bnQpIHsgcmVzaXplQnVmZmVyRXZlcnlOXyA9IGNvdW50OyB9CiAKICAgLyoqCiAgICAqIE1haW4gd29ya2hvcnNlIGZ1bmN0aW9uLCBzdGFydHMgdXAgdGhlIHNlcnZlciBsaXN0ZW5pbmcgb24gYSBwb3J0IGFuZApAQCAtNzQ4LDI1ICs2NzgsMzkgQEAKICAgICovCiAgIHZvaWQgc3RvcCgpOwogCi0gcHJpdmF0ZToKKyAgLy8vIENyZWF0ZXMgYSBzb2NrZXQgdG8gbGlzdGVuIG9uIGFuZCBiaW5kcyBpdCB0byB0aGUgbG9jYWwgcG9ydC4KKyAgdm9pZCBjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpOworCisgIC8qKgorICAgKiBSZWdpc3RlciB0aGUgb3B0aW9uYWwgdXNlci1wcm92aWRlZCBldmVudC1iYXNlIChmb3Igc2luZ2xlLXRocmVhZCBzZXJ2ZXJzKQorICAgKgorICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBpbiBhIHNpbmdsZS10aHJlYWQKKyAgICogbW9kZSwgYW5kIHRoZSBldmVudCBiYXNlIGlzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIChpLmUuLCB0aGUgY2FsbGVyKS4KKyAgICoKKyAgICogQHBhcmFtIHVzZXJfZXZlbnRfYmFzZSB0aGUgdXNlci1wcm92aWRlZCBldmVudC1iYXNlLiBUaGUgdXNlciBpcworICAgKiByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgZXZlbnQgYmFzZSBtZW1vcnkuCisgICAqLworICB2b2lkIHJlZ2lzdGVyRXZlbnRzKGV2ZW50X2Jhc2UqIHVzZXJfZXZlbnRfYmFzZSk7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG9wdGlvbmFsIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSAoZm9yIHNpbmdsZS10aHJlYWQgc2VydmVycykuCisgICAqLworICBldmVudF9iYXNlKiBnZXRVc2VyRXZlbnRCYXNlKCkgY29uc3QgeyByZXR1cm4gdXNlckV2ZW50QmFzZV87IH0KKworICAvKiogU29tZSB0cmFuc3BvcnRzLCBsaWtlIFRIZWFkZXJUcmFuc3BvcnQsIHJlcXVpcmUgcGFzc2luZyB0aHJvdWdoCisgICAqIHRoZSBmcmFtaW5nIHNpemUgaW5zdGVhZCBvZiBzdHJpcHBpbmcgaXQuCisgICAqLworICBib29sIGdldEhlYWRlclRyYW5zcG9ydCgpOworCitwcml2YXRlOgogICAvKioKICAgICogQ2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0aGUgdGhyZWFkbWFuYWdlciBjYWxscyB3aGVuIGEgdGFzayByZWFjaGVzCiAgICAqIGl0cyBleHBpcmF0aW9uIHRpbWUuICBJdCBpcyBuZWVkZWQgdG8gY2xlYW4gdXAgdGhlIGV4cGlyZWQgY29ubmVjdGlvbi4KICAgICoKICAgICogQHBhcmFtIHRhc2sgdGhlIHJ1bm5hYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhwaXJlZCB0YXNrLgogICAgKi8KLSAgdm9pZCBleHBpcmVDbG9zZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisgIHZvaWQgZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKIAotICAvLy8gQ3JlYXRlcyBhIHNvY2tldCB0byBsaXN0ZW4gb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBsb2NhbCBwb3J0LgotICB2b2lkIGNyZWF0ZUFuZExpc3Rlbk9uU29ja2V0KCk7Ci0KLSAgLyoqCi0gICAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKSBhbmQgc2V0cyB2YXJpb3VzCi0gICAqIG9wdGlvbnMgb24gaXQgdG8gcHJlcGFyZSBmb3IgdXNlIGluIHRoZSBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmZCBkZXNjcmlwdG9yIG9mIHNvY2tldCB0byBiZSBpbml0aWFsaXplZC8KLSAgICovCi0gIHZvaWQgbGlzdGVuU29ja2V0KGludCBmZCk7CiAgIC8qKgogICAgKiBSZXR1cm4gYW4gaW5pdGlhbGl6ZWQgY29ubmVjdGlvbiBvYmplY3QuICBDcmVhdGVzIG9yIHJlY292ZXJzIGZyb20KICAgICogcG9vbCBhIFRDb25uZWN0aW9uIGFuZCBpbml0aWFsaXplcyBpdCB3aXRoIHRoZSBwcm92aWRlZCBzb2NrZXQgRkQKQEAgLTc3Nyw4ICs3MjEsNyBAQAogICAgKiBAcGFyYW0gYWRkckxlbiB0aGUgbGVuZ3RoIG9mIGFkZHIKICAgICogQHJldHVybiBwb2ludGVyIHRvIGluaXRpYWxpemVkIFRDb25uZWN0aW9uIG9iamVjdC4KICAgICovCi0gIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKGludCBzb2NrZXQsIGNvbnN0IHNvY2thZGRyKiBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgYWRkckxlbik7CisgIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOwogCiAgIC8qKgogICAgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byBwb29sIG9yIGRlbGV0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gcG9vbApAQCAtNzkxLDEzICs3MzQsMTMgQEAKIH07CiAKIGNsYXNzIFROb25ibG9ja2luZ0lPVGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8vIENyZWF0ZXMgYW4gSU8gdGhyZWFkIGFuZCBzZXRzIHVwIHRoZSBldmVudCBiYXNlLiAgVGhlIGxpc3RlblNvY2tldCBzaG91bGQKICAgLy8gYmUgYSB2YWxpZCBGRCBvbiB3aGljaCBsaXN0ZW4oKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4gIElmIHRoZQogICAvLyBsaXN0ZW5Tb2NrZXQgaXMgPCAwLCBhY2NlcHRpbmcgd2lsbCBub3QgYmUgZG9uZS4KICAgVE5vbmJsb2NraW5nSU9UaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyKiBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0ZW5Tb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhpZ2hQcmlvcml0eSk7CiAKICAgflROb25ibG9ja2luZ0lPVGhyZWFkKCk7CkBAIC04MjIsMTAgKzc2NSwxMCBAQAogICBldnV0aWxfc29ja2V0X3QgZ2V0Tm90aWZpY2F0aW9uUmVjdkZEKCkgY29uc3QgeyByZXR1cm4gbm90aWZpY2F0aW9uUGlwZUZEc19bMF07IH0KIAogICAvLyBSZXR1cm5zIHRoZSBhY3R1YWwgdGhyZWFkIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBJTyB0aHJlYWQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gZ2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBnZXRUaHJlYWQoKSBjb25zdCB7IHJldHVybiB0aHJlYWRfOyB9CiAKICAgLy8gU2V0cyB0aGUgYWN0dWFsIHRocmVhZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU8gdGhyZWFkLgotICB2b2lkIHNldFRocmVhZChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+JiB0KSB7IHRocmVhZF8gPSB0OyB9CisgIHZvaWQgc2V0VGhyZWFkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+JiB0KSB7IHRocmVhZF8gPSB0OyB9CiAKICAgLy8gVXNlZCBieSBUQ29ubmVjdGlvbiBvYmplY3RzIHRvIGluZGljYXRlIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLgogICBib29sIG5vdGlmeShUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBjb25uKTsKQEAgLTgzOSw3ICs3ODIsMTAgQEAKICAgLy8gRW5zdXJlcyB0aGF0IHRoZSBldmVudC1sb29wIHRocmVhZCBpcyBmdWxseSBmaW5pc2hlZCBhbmQgc2h1dCBkb3duLgogICB2b2lkIGpvaW4oKTsKIAotIHByaXZhdGU6CisgIC8vLyBSZWdpc3RlcnMgdGhlIGV2ZW50cyBmb3IgdGhlIG5vdGlmaWNhdGlvbiAmIGxpc3RlbiBzb2NrZXRzCisgIHZvaWQgcmVnaXN0ZXJFdmVudHMoKTsKKworcHJpdmF0ZToKICAgLyoqCiAgICAqIEMtY2FsbGFibGUgZXZlbnQgaGFuZGxlciBmb3Igc2lnbmFsaW5nIHRhc2sgY29tcGxldGlvbi4gIFByb3ZpZGVzIGEKICAgICogY2FsbGJhY2sgdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB0aGF0IHdpbGwgcmVhZCBhIGNvbm5lY3Rpb24KQEAgLTg1NCw3ICs4MDAsNyBAQAogICAgKiBDLWNhbGxhYmxlIGV2ZW50IGhhbmRsZXIgZm9yIGxpc3RlbmVyIGV2ZW50cy4gIFByb3ZpZGVzIGEgY2FsbGJhY2sKICAgICogdGhhdCBsaWJldmVudCBjYW4gdW5kZXJzdGFuZCB3aGljaCBpbnZva2VzIHNlcnZlci0+aGFuZGxlRXZlbnQoKS4KICAgICoKLSAgICogQHBhcmFtIGZkIHRoZSBkZXNjcmlwdG9yIHRoZSBldmVudCBvY2N1cmVkIG9uLgorICAgKiBAcGFyYW0gZmQgdGhlIGRlc2NyaXB0b3IgdGhlIGV2ZW50IG9jY3VycmVkIG9uLgogICAgKiBAcGFyYW0gd2hpY2ggdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuCiAgICAqIEBwYXJhbSB2IHZvaWQqIGNhbGxiYWNrIGFyZyB3aGVyZSB3ZSBwbGFjZWQgVE5vbmJsb2NraW5nU2VydmVyJ3MgInRoaXMiLgogICAgKi8KQEAgLTg2NSw5ICs4MTEsNiBAQAogICAvLy8gRXhpdHMgdGhlIGxvb3AgQVNBUCBpbiBjYXNlIG9mIHNodXRkb3duIG9yIGVycm9yLgogICB2b2lkIGJyZWFrTG9vcChib29sIGVycm9yKTsKIAotICAvLy8gUmVnaXN0ZXJzIHRoZSBldmVudHMgZm9yIHRoZSBub3RpZmljYXRpb24gJiBsaXN0ZW4gc29ja2V0cwotICB2b2lkIHJlZ2lzdGVyRXZlbnRzKCk7Ci0KICAgLy8vIENyZWF0ZSB0aGUgcGlwZSB1c2VkIHRvIG5vdGlmeSBJL08gcHJvY2VzcyBvZiB0YXNrIGNvbXBsZXRpb24uCiAgIHZvaWQgY3JlYXRlTm90aWZpY2F0aW9uUGlwZSgpOwogCkBAIC04NzcsNyArODIwLDcgQEAKICAgLy8vIFNldHMgKG9yIGNsZWFycykgaGlnaCBwcmlvcml0eSBzY2hlZHVsaW5nIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLgogICB2b2lkIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoYm9vbCB2YWx1ZSk7CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgLy8vIGFzc29jaWF0ZWQgc2VydmVyCiAgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKIApAQCAtODg4LDcgKzgzMSw3IEBACiAgIFRocmVhZDo6aWRfdCB0aHJlYWRJZF87CiAKICAgLy8vIElmIGxpc3RlblNvY2tldF8gPj0gMCwgYWRkcyBhbiBldmVudCBvbiB0aGUgZXZlbnRfYmFzZSB0byBhY2NlcHQgY29ubnMKLSAgaW50IGxpc3RlblNvY2tldF87CisgIFRIUklGVF9TT0NLRVQgbGlzdGVuU29ja2V0XzsKIAogICAvLy8gU2V0cyBhIGhpZ2ggc2NoZWR1bGluZyBwcmlvcml0eSB3aGVuIHJ1bm5pbmcKICAgYm9vbCB1c2VIaWdoUHJpb3JpdHlfOwpAQCAtODk2LDE5ICs4MzksMjQgQEAKICAgLy8vIHBvaW50ZXIgdG8gZXZlbnRiYXNlIHRvIGJlIHVzZWQgZm9yIGxvb3BpbmcKICAgZXZlbnRfYmFzZSogZXZlbnRCYXNlXzsKIAorICAvLy8gU2V0IHRvIHRydWUgaWYgdGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgZXZlbnQgYmFzZQorICAvLy8gbWVtb3J5LgorICBib29sIG93bkV2ZW50QmFzZV87CisKICAgLy8vIFVzZWQgd2l0aCBldmVudEJhc2VfIGZvciBjb25uZWN0aW9uIGV2ZW50cyAob25seSBpbiBsaXN0ZW5lciB0aHJlYWQpCiAgIHN0cnVjdCBldmVudCBzZXJ2ZXJFdmVudF87CiAKICAgLy8vIFVzZWQgd2l0aCBldmVudEJhc2VfIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uCiAgIHN0cnVjdCBldmVudCBub3RpZmljYXRpb25FdmVudF87CiAKLSAvLy8gRmlsZSBkZXNjcmlwdG9ycyBmb3IgcGlwZSB1c2VkIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgorICAvLy8gRmlsZSBkZXNjcmlwdG9ycyBmb3IgcGlwZSB1c2VkIGZvciB0YXNrIGNvbXBsZXRpb24gbm90aWZpY2F0aW9uLgogICBldnV0aWxfc29ja2V0X3Qgbm90aWZpY2F0aW9uUGlwZUZEc19bMl07CiAKICAgLy8vIEFjdHVhbCBJTyBUaHJlYWQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWRfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UTk9OQkxPQ0tJTkdTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuY3BwCmluZGV4IGY2NzE0YTkuLmRmNzMxYzIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmNwcApAQCAtMTcsOSArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKICNpZmRlZiBIQVZFX1NZU19USU1FX0gKICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtMzIsMTggKzMwLDIzIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAotaW50IGluY3JlYXNlX21heF9mZHMoaW50IG1heF9mZHM9KDE8PDI0KSkgIHsKKyNpZmRlZiBIQVZFX1NZU19SRVNPVVJDRV9ICitpbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2ZkcyA9ICgxIDw8IDI0KSkgewogICBzdHJ1Y3QgcmxpbWl0IGZkbWF4cmw7CiAKLSAgZm9yKGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkczsKLSAgICAgIG1heF9mZHMgJiYgKHNldHJsaW1pdChSTElNSVRfTk9GSUxFLCAmZmRtYXhybCkgPCAwKTsKLSAgICAgIGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkcykgeworICBmb3IgKGZkbWF4cmwucmxpbV9jdXIgPSBtYXhfZmRzLCBmZG1heHJsLnJsaW1fbWF4ID0gbWF4X2ZkczsKKyAgICAgICBtYXhfZmRzICYmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmZkbWF4cmwpIDwgMCk7CisgICAgICAgZmRtYXhybC5ybGltX2N1ciA9IG1heF9mZHMsIGZkbWF4cmwucmxpbV9tYXggPSBtYXhfZmRzKSB7CiAgICAgbWF4X2ZkcyAvPSAyOwogICB9CiAKLSAgcmV0dXJuICBmZG1heHJsLnJsaW1fY3VyOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihmZG1heHJsLnJsaW1fY3VyKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCmluZGV4IGM5ZTg4YjEuLjNjNmQ4MTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCkBAIC0yNSw5ICsyNSwxMSBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwpAQCAtNDUsOCArNDcsNyBAQAogICogaW5zdGFuY2UncyBzdGF0ZSkuCiAgKi8KIGNsYXNzIFRTZXJ2ZXJFdmVudEhhbmRsZXIgewotIHB1YmxpYzoKLQorcHVibGljOgogICB2aXJ0dWFsIH5UU2VydmVyRXZlbnRIYW5kbGVyKCkge30KIAogICAvKioKQEAgLTU3LDggKzU4LDggQEAKICAgLyoqCiAgICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgogICAgKi8KLSAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKICAgICAodm9pZClpbnB1dDsKICAgICAodm9pZClvdXRwdXQ7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC02OSw4ICs3MCw4IEBACiAgICAqIGNvbnRleHQuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+aW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD5vdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgewogICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgKHZvaWQpaW5wdXQ7CiAgICAgKHZvaWQpb3V0cHV0OwpAQCAtNzksMTkgKzgwLDE2IEBACiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgewogICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgKHZvaWQpdHJhbnNwb3J0OwotfQorICB9CiAKLSBwcm90ZWN0ZWQ6Ci0KK3Byb3RlY3RlZDoKICAgLyoqCiAgICAqIFByZXZlbnQgZGlyZWN0IGluc3RhbnRpYXRpb24uCiAgICAqLwogICBUU2VydmVyRXZlbnRIYW5kbGVyKCkge30KLQogfTsKIAogLyoqCkBAIC05OSw4ICs5Nyw3IEBACiAgKgogICovCiBjbGFzcyBUU2VydmVyIDogcHVibGljIGNvbmN1cnJlbmN5OjpSdW5uYWJsZSB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIHZpcnR1YWwgflRTZXJ2ZXIoKSB7fQogCiAgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpID0gMDsKQEAgLTEwOCwxNDYgKzEwNSwxMDcgQEAKICAgdmlydHVhbCB2b2lkIHN0b3AoKSB7fQogCiAgIC8vIEFsbG93cyBydW5uaW5nIHRoZSBzZXJ2ZXIgYXMgYSBSdW5uYWJsZSB0aHJlYWQKLSAgdmlydHVhbCB2b2lkIHJ1bigpIHsKLSAgICBzZXJ2ZSgpOwotICB9CisgIHZpcnR1YWwgdm9pZCBydW4oKSB7IHNlcnZlKCk7IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4gZ2V0UHJvY2Vzc29yRmFjdG9yeSgpIHsKLSAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBnZXRQcm9jZXNzb3JGYWN0b3J5KCkgeyByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IGdldFNlcnZlclRyYW5zcG9ydCgpIHsgcmV0dXJuIHNlcnZlclRyYW5zcG9ydF87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgewotICAgIHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgeyByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7CiAgICAgcmV0dXJuIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGdldE91dHB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGV2ZW50SGFuZGxlcl87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldEV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIGV2ZW50SGFuZGxlcl87IH0KIAogcHJvdGVjdGVkOgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3JGYWN0b3J5PgotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpOgotICAgIHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4oCi0gICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigKLSAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpOgotICAgIHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSkgeworICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKICAgfQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKToKLSAgICBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4oCi0gICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PigKLSAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KAotICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4oCi0gICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CiAgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpOgotICAgIHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgewotICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKLSAgICBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CiAgIH0KIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3JGYWN0b3J5PgotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvckZhY3RvcnksIFRQcm9jZXNzb3JGYWN0b3J5KSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCi0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpIHt9CisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAotICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAotICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgICAgOiBwcm9jZXNzb3JGYWN0b3J5XyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSksCisgICAgICBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCksCisgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKHRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvckZhY3RvcnksIFRQcm9jZXNzb3JGYWN0b3J5KSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8ocHJvY2Vzc29yRmFjdG9yeSksCi0gICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAotICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyhvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ob3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7fQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSk6Ci0gICAgcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAotICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfKGlucHV0VHJhbnNwb3J0RmFjdG9yeSksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCi0gICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAorICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAorICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8ob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSksCisgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8oaW5wdXRQcm90b2NvbEZhY3RvcnkpLAorICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHt9CiAKICAgLyoqCiAgICAqIEdldCBhIFRQcm9jZXNzb3IgdG8gaGFuZGxlIGNhbGxzIG9uIGEgcGFydGljdWxhciBjb25uZWN0aW9uLgpAQCAtMjU2LDEwICsyMTQsOSBAQAogICAgKiBjYWxsKS4gIFRoaXMgYWxsb3dzIHRoZSBUUHJvY2Vzc29yRmFjdG9yeSB0byByZXR1cm4gYSBkaWZmZXJlbnQgcHJvY2Vzc29yCiAgICAqIGZvciBlYWNoIGNvbm5lY3Rpb24gaWYgaXQgZGVzaXJlcy4KICAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcigKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CiAgICAgVENvbm5lY3Rpb25JbmZvIGNvbm5JbmZvOwogICAgIGNvbm5JbmZvLmlucHV0ID0gaW5wdXRQcm90b2NvbDsKICAgICBjb25uSW5mby5vdXRwdXQgPSBvdXRwdXRQcm90b2NvbDsKQEAgLTI2OCwzOCArMjI1LDM3IEBACiAgIH0KIAogICAvLyBDbGFzcyB2YXJpYWJsZXMKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIAogcHVibGljOgotICB2b2lkIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSB7CisgIHZvaWQgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSB7CiAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKICAgfQogCi0gIHZvaWQgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkgeworICB2b2lkIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KSB7CiAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSkgeworICB2b2lkIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSkgewogICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIHZvaWQgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwogICB9CiAKLSAgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKICAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwogICB9Ci0KIH07CiAKIC8qKgpAQCAtMzA3LDkgKzI2MywxMSBAQAogICogZm9yIHRoZSBjdXJyZW50IHByb2Nlc3MgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4uCiAgKiBCeSBkZWZhdWx0LCB0cmllcyB0byBpbmNyZWFzZSBpdCB0byBhcyBtdWNoIGFzIDJeMjQuCiAgKi8KLSBpbnQgaW5jcmVhc2VfbWF4X2ZkcyhpbnQgbWF4X2Zkcz0oMTw8MjQpKTsKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorI2lmZGVmIEhBVkVfU1lTX1JFU09VUkNFX0gKK2ludCBpbmNyZWFzZV9tYXhfZmRzKGludCBtYXhfZmRzID0gKDEgPDwgMjQpKTsKKyNlbmRpZgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZWFhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKK3VzaW5nIHN0ZDo6c3RyaW5nOworCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICBjbGllbnRzXygwKSwKKyAgICBod21fKDApLAorICAgIGxpbWl0XyhJTlQ2NF9NQVgpIHsKK30KKworVFNlcnZlckZyYW1ld29yazo6VFNlcnZlckZyYW1ld29yayhjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIGNsaWVudHNfKDApLAorICAgIGh3bV8oMCksCisgICAgbGltaXRfKElOVDY0X01BWCkgeworfQorCitUU2VydmVyRnJhbWV3b3JrOjpUU2VydmVyRnJhbWV3b3JrKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgOiBUU2VydmVyKHByb2Nlc3NvciwKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgY2xpZW50c18oMCksCisgICAgaHdtXygwKSwKKyAgICBsaW1pdF8oSU5UNjRfTUFYKSB7Cit9CisKK1RTZXJ2ZXJGcmFtZXdvcms6On5UU2VydmVyRnJhbWV3b3JrKCkgeworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHJlbGVhc2VPbmVEZXNjcmlwdG9yKGNvbnN0IHN0cmluZyYgbmFtZSwgVCYgcFRyYW5zcG9ydCkgeworICBpZiAocFRyYW5zcG9ydCkgeworICAgIHRyeSB7CisgICAgICBwVHJhbnNwb3J0LT5jbG9zZSgpOworICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgeworICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNlcnZlckZyYW1ld29yayAiICsgbmFtZSArICIgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCkgeworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7CisgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOworICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7CisKKyAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudCB0byBpbmRpY2F0ZSBzZXJ2ZXIgaXMgbm93IGxpc3RlbmluZworICAvLyBhbmQgdGhhdCBpdCBpcyBzYWZlIHRvIGNvbm5lY3QuCisgIGlmIChldmVudEhhbmRsZXJfKSB7CisgICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKKyAgfQorCisgIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgorICBmb3IgKDs7KSB7CisgICAgdHJ5IHsKKyAgICAgIC8vIERlcmVmZXJlbmNlIGFueSByZXNvdXJjZXMgZnJvbSBhbnkgcHJldmlvdXMgY2xpZW50IGNyZWF0aW9uCisgICAgICAvLyBzdWNoIHRoYXQgYSBibG9ja2luZyBhY2NlcHQgZG9lcyBub3QgaG9sZCB0aGVtIGluZGVmaW5pdGVseS4KKyAgICAgIG91dHB1dFByb3RvY29sLnJlc2V0KCk7CisgICAgICBpbnB1dFByb3RvY29sLnJlc2V0KCk7CisgICAgICBvdXRwdXRUcmFuc3BvcnQucmVzZXQoKTsKKyAgICAgIGlucHV0VHJhbnNwb3J0LnJlc2V0KCk7CisgICAgICBjbGllbnQucmVzZXQoKTsKKworICAgICAgLy8gSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQKKyAgICAgIC8vIGNsaWVudHMgYWxsb3dlZCwgd2FpdCBmb3Igb25lIG9yIG1vcmUgY2xpZW50cyB0byBkcmFpbiBiZWZvcmUKKyAgICAgIC8vIGFjY2VwdGluZyBhbm90aGVyLgorICAgICAgeworICAgICAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgICAgICAgd2hpbGUgKGNsaWVudHNfID49IGxpbWl0XykgeworICAgICAgICAgIG1vbl8ud2FpdCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOworCisgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgaWYgKCFvdXRwdXRQcm90b2NvbEZhY3RvcnlfKSB7CisgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0LCBvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICBvdXRwdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2w7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIH0KKworICAgICAgbmV3bHlDb25uZWN0ZWRDbGllbnQoc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PigKKyAgICAgICAgICBuZXcgVENvbm5lY3RlZENsaWVudChnZXRQcm9jZXNzb3IoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEhhbmRsZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCksCisgICAgICAgICAgYmluZCgmVFNlcnZlckZyYW1ld29yazo6ZGlzcG9zZUNvbm5lY3RlZENsaWVudCwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSkpOworCisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CisgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigiaW5wdXRUcmFuc3BvcnQiLCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigib3V0cHV0VHJhbnNwb3J0Iiwgb3V0cHV0VHJhbnNwb3J0KTsKKyAgICAgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJjbGllbnQiLCBjbGllbnQpOworICAgICAgaWYgKHR0eC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB7CisgICAgICAgIC8vIEFjY2VwdCB0aW1lb3V0IC0gY29udGludWUgcHJvY2Vzc2luZy4KKyAgICAgICAgY29udGludWU7CisgICAgICB9IGVsc2UgaWYgKHR0eC5nZXRUeXBlKCkgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUKKyAgICAgICAgICAgICAgICAgfHwgdHR4LmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgeworICAgICAgICAvLyBTZXJ2ZXIgd2FzIGludGVycnVwdGVkLiAgVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiBzdG9wcGluZy4KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBBbGwgb3RoZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZC4KKyAgICAgICAgLy8gU3RhdGUgb2YgY29ubmVjdGlvbiBpcyB1bmtub3duLiAgRG9uZS4KKyAgICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNlcnZlclRyYW5zcG9ydCBkaWVkOiAiKSArIHR0eC53aGF0KCk7CisgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHJlbGVhc2VPbmVEZXNjcmlwdG9yKCJzZXJ2ZXJUcmFuc3BvcnQiLCBzZXJ2ZXJUcmFuc3BvcnRfKTsKK30KKworaW50NjRfdCBUU2VydmVyRnJhbWV3b3JrOjpnZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICByZXR1cm4gbGltaXRfOworfQorCitpbnQ2NF90IFRTZXJ2ZXJGcmFtZXdvcms6OmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpIGNvbnN0IHsKKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIHJldHVybiBjbGllbnRzXzsKK30KKworaW50NjRfdCBUU2VydmVyRnJhbWV3b3JrOjpnZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSBjb25zdCB7CisgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICByZXR1cm4gaHdtXzsKK30KKwordm9pZCBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCkgeworICBpZiAobmV3TGltaXQgPCAxKSB7CisgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJuZXdMaW1pdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIik7CisgIH0KKyAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CisgIGxpbWl0XyA9IG5ld0xpbWl0OworICBpZiAobGltaXRfIC0gY2xpZW50c18gPiAwKSB7CisgICAgbW9uXy5ub3RpZnkoKTsKKyAgfQorfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6OnN0b3AoKSB7CisgIC8vIE9yZGVyIGlzIGltcG9ydGFudCBiZWNhdXNlIHNlcnZlKCkgcmVsZWFzZXMgc2VydmVyVHJhbnNwb3J0XyB3aGVuIGl0IGlzCisgIC8vIGludGVycnVwdGVkLCB3aGljaCBjbG9zZXMgdGhlIHNvY2tldCB0aGF0IGludGVycnVwdENoaWxkcmVuIHVzZXMuCisgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdENoaWxkcmVuKCk7CisgIHNlcnZlclRyYW5zcG9ydF8tPmludGVycnVwdCgpOworfQorCit2b2lkIFRTZXJ2ZXJGcmFtZXdvcms6Om5ld2x5Q29ubmVjdGVkQ2xpZW50KGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgeworICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbl8pOworICAgICsrY2xpZW50c187CisgICAgaHdtXyA9IChzdGQ6Om1heCkoaHdtXywgY2xpZW50c18pOworICB9CisKKyAgb25DbGllbnRDb25uZWN0ZWQocENsaWVudCk7Cit9CisKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6ZGlzcG9zZUNvbm5lY3RlZENsaWVudChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSB7CisgIG9uQ2xpZW50RGlzY29ubmVjdGVkKHBDbGllbnQpOworICBkZWxldGUgcENsaWVudDsKKworICBTeW5jaHJvbml6ZWQgc3luYyhtb25fKTsKKyAgaWYgKGxpbWl0XyAtIC0tY2xpZW50c18gPiAwKSB7CisgICAgbW9uXy5ub3RpZnkoKTsKKyAgfQorfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhY2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXworI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfIDEKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKKworLyoqCisgKiBUU2VydmVyRnJhbWV3b3JrIHByb3ZpZGVzIGEgc2luZ2xlIGNvbnNvbGlkYXRlZCBwcm9jZXNzaW5nIGxvb3AgZm9yCisgKiBzZXJ2ZXJzLiAgQnkgaGF2aW5nIGEgc2luZ2xlIHByb2Nlc3NpbmcgbG9vcCwgYmVoYXZpb3IgYmV0d2VlbiBzZXJ2ZXJzCisgKiBpcyBtb3JlIHByZWRpY3RhYmxlIGFuZCBtYWludGVuYW5jZSBjb3N0IGlzIGxvd2VyZWQuICBJbXBsZW1lbnRhdGlvbnMKKyAqIG9mIFRTZXJ2ZXJGcmFtZXdvcmsgbXVzdCBwcm92aWRlIGEgbWV0aG9kIHRvIGRlYWwgd2l0aCBhIGNsaWVudCB0aGF0CisgKiBjb25uZWN0cyBhbmQgb25lIHRoYXQgZGlzY29ubmVjdHMuCisgKgorICogV2hpbGUgdGhpcyBmdW5jdGlvbmFsaXR5IGNvdWxkIGJlIHJvbGxlZCBkaXJlY3RseSBpbnRvIFRTZXJ2ZXIsIGFuZAorICogcHJvYmFibHkgc2hvdWxkIGJlLCBpdCB3b3VsZCBicmVhayB0aGUgVFNlcnZlciBpbnRlcmZhY2UgY29udHJhY3Qgc28KKyAqIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciB0aGlyZCBwYXJ0eSBzZXJ2ZXJzLCBubyBUU2VydmVycworICogd2VyZSBoYXJtZWQgaW4gdGhlIG1ha2luZyBvZiB0aGlzIGNsYXNzLgorICovCitjbGFzcyBUU2VydmVyRnJhbWV3b3JrIDogcHVibGljIFRTZXJ2ZXIgeworcHVibGljOgorICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKworICBUU2VydmVyRnJhbWV3b3JrKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisKKyAgVFNlcnZlckZyYW1ld29yaygKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworCisgIHZpcnR1YWwgflRTZXJ2ZXJGcmFtZXdvcmsoKTsKKworICAvKioKKyAgICogQWNjZXB0IGNsaWVudHMgZnJvbSB0aGUgVFNlcnZlclRyYW5zcG9ydCBhbmQgYWRkIHRoZW0gZm9yIHByb2Nlc3NpbmcuCisgICAqIENhbGwgc3RvcCgpIG9uIGFub3RoZXIgdGhyZWFkIHRvIGludGVycnVwdCBwcm9jZXNzaW5nCisgICAqIGFuZCByZXR1cm4gY29udHJvbCB0byB0aGUgY2FsbGVyLgorICAgKiBQb3N0LWNvbmRpdGlvbnMgKHJldHVybiBndWFyYW50ZWVzKToKKyAgICogICBUaGUgc2VydmVyVHJhbnNwb3J0IHdpbGwgYmUgY2xvc2VkLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNlcnZlKCk7CisKKyAgLyoqCisgICAqIEludGVycnVwdCBzZXJ2ZSgpIHNvIHRoYXQgaXQgbWVldHMgcG9zdC1jb25kaXRpb25zIGFuZCByZXR1cm5zLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHN0b3AoKTsKKworICAvKioKKyAgICogR2V0IHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdC4KKyAgICogXHJldHVybnMgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0CisgICAqLworICB2aXJ0dWFsIGludDY0X3QgZ2V0Q29uY3VycmVudENsaWVudExpbWl0KCkgY29uc3Q7CisKKyAgLyoqCisgICAqIEdldCB0aGUgbnVtYmVyIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cy4KKyAgICogXHJldHVybnMgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMKKyAgICovCisgIHZpcnR1YWwgaW50NjRfdCBnZXRDb25jdXJyZW50Q2xpZW50Q291bnQoKSBjb25zdDsKKworICAvKioKKyAgICogR2V0IHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqIFxyZXR1cm5zIHRoZSBoaWdoZXN0IG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMKKyAgICovCisgIHZpcnR1YWwgaW50NjRfdCBnZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSBjb25zdDsKKworICAvKioKKyAgICogU2V0IHRoZSBjb25jdXJyZW50IGNsaWVudCBsaW1pdC4gIFRoaXMgY2FuIGJlIGNoYW5nZWQgd2hpbGUKKyAgICogdGhlIHNlcnZlciBpcyBzZXJ2aW5nIGhvd2V2ZXIgaXQgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUKKyAgICogZW5mb3JjZWQgdW50aWwgdGhlIG5leHQgY2xpZW50IGlzIGFjY2VwdGVkIGFuZCBhZGRlZC4gIElmIHRoZQorICAgKiBsaW1pdCBpcyBsb3dlcmVkIGJlbG93IHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIGNsaWVudHMsIG5vCisgICAqIGFjdGlvbiBpcyB0YWtlbiB0byBkaXNjb25uZWN0IHRoZSBjbGllbnRzLgorICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSB1c2VkIGlmIHRoaXMgaXMgbm90IGNhbGxlZCBpcyBJTlQ2NF9NQVguCisgICAqIFxwYXJhbVtpbl0gIG5ld0xpbWl0ICB0aGUgbmV3IGxpbWl0IG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKiBcdGhyb3dzIHN0ZDo6aW52YWxpZF9hcmd1bWVudCBpZiBuZXdMaW1pdCBpcyBsZXNzIHRoYW4gMQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90IG5ld0xpbWl0KTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogQSBjbGllbnQgaGFzIGNvbm5lY3RlZC4gIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlCisgICAqIGxpZmV0aW1lIG9mIHRoZSBjbGllbnQgb2JqZWN0LiAgVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZSgpIHRocmVhZCwKKyAgICogdGhlcmVmb3JlIGEgZmFpbHVyZSB0byByZXR1cm4gcXVpY2tseSB3aWxsIHJlc3VsdCBpbiBuZXcgY2xpZW50IGNvbm5lY3Rpb24KKyAgICogZGVsYXlzLgorICAgKgorICAgKiBccGFyYW1baW5dICBwQ2xpZW50ICB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudAorICAgKi8KKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgPSAwOworCisgIC8qKgorICAgKiBBIGNsaWVudCBoYXMgZGlzY29ubmVjdGVkLgorICAgKiBXaGVuIGNhbGxlZDoKKyAgICogICBUaGUgc2VydmVyIG5vIGxvbmdlciB0cmFja3MgdGhlIGNsaWVudC4KKyAgICogICBUaGUgY2xpZW50IFRUcmFuc3BvcnQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCisgICAqICAgVGhlIGltcGxlbWVudGF0aW9uIG11c3Qgbm90IGRlbGV0ZSB0aGUgcG9pbnRlci4KKyAgICoKKyAgICogXHBhcmFtW2luXSAgcENsaWVudCAgdGhlIGRpc2Nvbm5lY3RlZCBjbGllbnQKKyAgICovCisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSA9IDA7CisKK3ByaXZhdGU6CisgIC8qKgorICAgKiBDb21tb24gaGFuZGxpbmcgZm9yIG5ldyBjb25uZWN0ZWQgY2xpZW50cy4gIEltcGxlbWVudHMgY29uY3VycmVudAorICAgKiBjbGllbnQgcmF0ZSBsaW1pdGluZyBhZnRlciBvbkNsaWVudENvbm5lY3RlZCByZXR1cm5zIGJ5IGJsb2NraW5nIHRoZQorICAgKiBzZXJ2ZSgpIHRocmVhZCBpZiB0aGUgbGltaXQgaGFzIGJlZW4gcmVhY2hlZC4KKyAgICovCisgIHZvaWQgbmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKKworICAvKioKKyAgICogU21hcnQgcG9pbnRlciBjbGllbnQgZGVsZXRpb24uCisgICAqIENhbGxzIG9uQ2xpZW50RGlzY29ubmVjdGVkIGFuZCB0aGVuIGRlbGV0ZXMgcENsaWVudC4KKyAgICovCisgIHZvaWQgZGlzcG9zZUNvbm5lY3RlZENsaWVudChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KTsKKworICAvKioKKyAgICogTW9uaXRvciBmb3IgbGltaXRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgbW9uXzsKKworICAvKioKKyAgICogVGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNsaWVudHMuCisgICAqLworICBpbnQ2NF90IGNsaWVudHNfOworCisgIC8qKgorICAgKiBUaGUgaGlnaCB3YXRlciBtYXJrIG9mIGNvbmN1cnJlbnQgY2xpZW50cy4KKyAgICovCisgIGludDY0X3QgaHdtXzsKKworICAvKioKKyAgICogVGhlIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzLgorICAgKi8KKyAgaW50NjRfdCBsaW1pdF87Cit9OworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCisKKyNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RTRVJWRVJGUkFNRVdPUktfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCmluZGV4IGIxMzJhNjYuLjcxNjIzNGQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcApAQCAtMTgsMTM2ICsxOCw5MCBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotLyoqCi0gKiBBIHNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgYXBwbGljYXRpb24gc2VydmVyLiBQZXJmZWN0IGZvciB1bml0IHRlc3RzIQotICoKLSAqLwotdm9pZCBUU2ltcGxlU2VydmVyOjpzZXJ2ZSgpIHsKLQotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7Ci0KLSAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0KLSAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAotICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKLSAgfQotCi0gIC8vIEZldGNoIGNsaWVudCBmcm9tIHNlcnZlcgotICB3aGlsZSAoIXN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOwotICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoY2xpZW50KTsKLSAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoIXN0b3BfIHx8IHR0eC5nZXRUeXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpIHsKLSAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2VydmVyVHJhbnNwb3J0IGRpZWQgb24gYWNjZXB0OiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiU29tZSBraW5kIG9mIGFjY2VwdCBleGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiU29tZSBraW5kIG9mIGFjY2VwdCBleGNlcHRpb246ICIpICsgczsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBHZXQgdGhlIHByb2Nlc3NvcgotICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wsIGNsaWVudCk7Ci0KLSAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCA9IE5VTEw7Ci0gICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXJfLT5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gTlVMTCkgewotICAgICAgICAgIGV2ZW50SGFuZGxlcl8tPnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBjbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvY2Vzc29yLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCkgfHwKLSAgICAgICAgICAvLyBQZWVrIGFoZWFkLCBpcyB0aGUgcmVtb3RlIHNpZGUgY2xvc2VkPwotICAgICAgICAgICAgIWlucHV0UHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpLT5wZWVrKCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFNpbXBsZVNlcnZlciBjbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgeCkgewotICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVFNpbXBsZVNlcnZlciBleGNlcHRpb246ICVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVpZCh4KS5uYW1lKCksIHgud2hhdCgpKTsKLSAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNpbXBsZVNlcnZlciB1bmNhdWdodCBleGNlcHRpb24uIik7Ci0gICAgfQotICAgIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICAgIGV2ZW50SGFuZGxlcl8tPmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUU2ltcGxlU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikKLSAgICAgICAgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXIgb3V0cHV0IGNsb3NlIGZhaWxlZDogIikKLSAgICAgICAgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGNsaWVudC0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTaW1wbGVTZXJ2ZXIgY2xpZW50IGNsb3NlIGZhaWxlZDogIikKLSAgICAgICAgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgc2VydmVyVHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICZ0dHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRTZXJ2ZXJUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICBzdG9wXyA9IGZhbHNlOwotICB9CitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7CiB9CiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCitUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoMSk7Cit9CisKK1RTaW1wbGVTZXJ2ZXI6OlRTaW1wbGVTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgxKTsKK30KKworVFNpbXBsZVNlcnZlcjo6VFNpbXBsZVNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgVFNlcnZlckZyYW1ld29yazo6c2V0Q29uY3VycmVudENsaWVudExpbWl0KDEpOworfQorCitUU2ltcGxlU2VydmVyOjp+VFNpbXBsZVNlcnZlcigpIHsKK30KKworLyoqCisgKiBUaGUgbWFpbiBib2R5IG9mIGN1c3RvbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIFRTaW1wbGVTZXJ2ZXIgaXMgcXVpdGUgc2ltcGxlOgorICogV2hlbiBhIGNsaWVudCBjb25uZWN0cywgdXNlIHRoZSBzZXJ2ZSgpIHRocmVhZCB0byBkcml2ZSBpdCB0byBjb21wbGV0aW9uIHRodXMKKyAqIGJsb2NraW5nIG5ldyBjb25uZWN0aW9ucy4KKyAqLwordm9pZCBUU2ltcGxlU2VydmVyOjpvbkNsaWVudENvbm5lY3RlZChjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSB7CisgIHBDbGllbnQtPnJ1bigpOworfQorCisvKioKKyAqIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgdHJhY2sgY2xpZW50cyBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCisgKi8KK3ZvaWQgVFNpbXBsZVNlcnZlcjo6b25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCopIHsKK30KKworLyoqCisgKiBUaGlzIG1ha2VzIGxpdHRsZSBzZW5zZSB0byB0aGUgc2ltcGxlIHNlcnZlciBiZWNhdXNlIGl0IGlzIG5vdCBjYXBhYmxlCisgKiBvZiBoYXZpbmcgbW9yZSB0aGFuIG9uZSBjbGllbnQgYXQgYSB0aW1lLCBzbyB3ZSBoaWRlIGl0LgorICovCit2b2lkIFRTaW1wbGVTZXJ2ZXI6OnNldENvbmN1cnJlbnRDbGllbnRMaW1pdChpbnQ2NF90KSB7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmgKaW5kZXggZjllMGUyYi4uNDU0OTIyNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmgKQEAgLTIwLDgzICsyMCw1OCBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UU0lNUExFU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RTSU1QTEVTRVJWRVJfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKIC8qKgogICogVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBzaW1wbGUgc2VydmVyLiBJdCBpcyBzaW5nbGUtdGhyZWFkZWQgYW5kIHJ1bnMgYQogICogY29udGludW91cyBsb29wIG9mIGFjY2VwdGluZyBhIHNpbmdsZSBjb25uZWN0aW9uLCBwcm9jZXNzaW5nIHJlcXVlc3RzIG9uCi0gKiB0aGF0IGNvbm5lY3Rpb24gdW50aWwgaXQgY2xvc2VzLCBhbmQgdGhlbiByZXBlYXRpbmcuIEl0IGlzIGEgZ29vZCBleGFtcGxlCi0gKiBvZiBob3cgdG8gZXh0ZW5kIHRoZSBUU2VydmVyIGludGVyZmFjZS4KLSAqCisgKiB0aGF0IGNvbm5lY3Rpb24gdW50aWwgaXQgY2xvc2VzLCBhbmQgdGhlbiByZXBlYXRpbmcuCiAgKi8KLWNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3JGYWN0b3J5PgorY2xhc3MgVFNpbXBsZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKICAgVFNpbXBsZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpLAotICAgIHN0b3BfKGZhbHNlKSB7fQorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+CiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgICBzdG9wXyhmYWxzZSkge30KKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+CiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICBzdG9wXyhmYWxzZSkge30KKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICAgIHN0b3BfKGZhbHNlKSB7fQorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CiAKLSAgflRTaW1wbGVTZXJ2ZXIoKSB7fQorICB2aXJ0dWFsIH5UU2ltcGxlU2VydmVyKCk7CiAKLSAgdm9pZCBzZXJ2ZSgpOworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOwogCi0gIHZvaWQgc3RvcCgpIHsKLSAgICBzdG9wXyA9IHRydWU7Ci0gICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgYm9vbCBzdG9wXzsKLQorcHJpdmF0ZToKKyAgdm9pZCBzZXRDb25jdXJyZW50Q2xpZW50TGltaXQoaW50NjRfdCBuZXdMaW1pdCk7IC8vIGhpZGUKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNJTVBMRVNFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcAppbmRleCBkM2I5NzE0Li5lZTM0NWE5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNwcApAQCAtMTcsMTgxICsxNyw4NiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgeworVFRocmVhZFBvb2xTZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcikKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQogCi1wdWJsaWM6CitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcikKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAorICAgIHRpbWVvdXRfKDApLAorICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7Cit9CiAKLSAgVGFzayhUVGhyZWFkUG9vbFNlcnZlciAmc2VydmVyLAotICAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gICAgc2VydmVyXyhzZXJ2ZXIpLAotICAgIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgICBpbnB1dF8oaW5wdXQpLAotICAgIG91dHB1dF8ob3V0cHV0KSwKLSAgICB0cmFuc3BvcnRfKHRyYW5zcG9ydCkgewotICB9CitUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKKyAgICB0aW1lb3V0XygwKSwKKyAgICB0YXNrRXhwaXJhdGlvbl8oMCkgeworfQogCi0gIH5UYXNrKCkge30KK1RUaHJlYWRQb29sU2VydmVyOjpUVGhyZWFkUG9vbFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZE1hbmFnZXJfKHRocmVhZE1hbmFnZXIpLAorICAgIHRpbWVvdXRfKDApLAorICAgIHRhc2tFeHBpcmF0aW9uXygwKSB7Cit9CiAKLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQgPSBOVUxMOwotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXItPmNyZWF0ZUNvbnRleHQoaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgdHJhbnNwb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgICAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJikgewotICAgICAgLy8gVGhpcyBpcyByZWFzb25hYmx5IGV4cGVjdGVkLCBjbGllbnQgZGlkbid0IHNlbmQgYSBmdWxsIHJlcXVlc3Qgc28ganVzdAotICAgICAgLy8gaWdub3JlIGhpbQotICAgICAgLy8gc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgY2xpZW50IGRpZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIC8vIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIHgpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRUaHJlYWRQb29sU2VydmVyIGV4Y2VwdGlvbiAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLCB4LndoYXQoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRUaHJlYWRQb29sU2VydmVyLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiAiCi0gICAgICAgICAgICAgICAgICAgIlRUaHJlYWRQb29sU2VydmVyOjpUYXNrOjpydW4oKSIpOwotICAgIH0KLQotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgZXZlbnRIYW5kbGVyLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZFBvb2xTZXJ2ZXIgaW5wdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLSAgICB0cnkgewotICAgICAgb3V0cHV0Xy0+Z2V0VHJhbnNwb3J0KCktPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlciBvdXRwdXQgY2xvc2UgZmFpbGVkOiAiKSArIHR0eC53aGF0KCk7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgIH0KLQotICB9Ci0KLSBwcml2YXRlOgotICBUU2VydmVyJiBzZXJ2ZXJfOwotICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRfOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Ci19OwotCi1UVGhyZWFkUG9vbFNlcnZlcjo6flRUaHJlYWRQb29sU2VydmVyKCkge30KK1RUaHJlYWRQb29sU2VydmVyOjp+VFRocmVhZFBvb2xTZXJ2ZXIoKSB7Cit9CiAKIHZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6OnNlcnZlKCkgewotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNsaWVudDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQ7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sOwotICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2w7Ci0KLSAgLy8gU3RhcnQgdGhlIHNlcnZlciBsaXN0ZW5pbmcKLSAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7Ci0KLSAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAotICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBOVUxMKSB7Ci0gICAgZXZlbnRIYW5kbGVyXy0+cHJlU2VydmUoKTsKLSAgfQotCi0gIHdoaWxlICghc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgY2xpZW50LnJlc2V0KCk7Ci0gICAgICBpbnB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBpbnB1dFByb3RvY29sLnJlc2V0KCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbC5yZXNldCgpOwotCi0gICAgICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKLSAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAvLyBNYWtlIElPIHRyYW5zcG9ydHMKLSAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKLQotICAgICAgLy8gQWRkIHRvIHRocmVhZG1hbmFnZXIgcG9vbAotICAgICAgc2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcjo6VGFzaz4gdGFzayhuZXcgVFRocmVhZFBvb2xTZXJ2ZXI6OlRhc2soCi0gICAgICAgICAgICAqdGhpcywgcHJvY2Vzc29yLCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2xpZW50KSk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIHRpbWVvdXRfKTsKLQotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmICghc3RvcF8gfHwgdHR4LmdldFR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCkgewotICAgICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogQ2F1Z2h0IFRFeGNlcHRpb246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gY2F0Y2ggKHN0cmluZyBzKSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgc3RyaW5nIGVyclN0ciA9ICJUVGhyZWFkUG9vbFNlcnZlcjogVW5rbm93biBleGNlcHRpb246ICIgKyBzOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIElmIHN0b3BwZWQgbWFudWFsbHksIGpvaW4gdGhlIGV4aXN0aW5nIHRocmVhZHMKLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgICB0aHJlYWRNYW5hZ2VyXy0+am9pbigpOwotICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJnR4KSB7Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkUG9vbFNlcnZlcjogRXhjZXB0aW9uIHNodXR0aW5nIGRvd246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgc3RvcF8gPSBmYWxzZTsKLSAgfQotCisgIFRTZXJ2ZXJGcmFtZXdvcms6OnNlcnZlKCk7CisgIHRocmVhZE1hbmFnZXJfLT5zdG9wKCk7CiB9CiAKIGludDY0X3QgVFRocmVhZFBvb2xTZXJ2ZXI6OmdldFRpbWVvdXQoKSBjb25zdCB7CkBAIC0yMDIsNCArMTA3LDI2IEBACiAgIHRpbWVvdXRfID0gdmFsdWU7CiB9CiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCitpbnQ2NF90IFRUaHJlYWRQb29sU2VydmVyOjpnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHRhc2tFeHBpcmF0aW9uXzsKK30KKwordm9pZCBUVGhyZWFkUG9vbFNlcnZlcjo6c2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSkgeworICB0YXNrRXhwaXJhdGlvbl8gPSB2YWx1ZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4KK1RUaHJlYWRQb29sU2VydmVyOjpnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3QgeworICByZXR1cm4gdGhyZWFkTWFuYWdlcl87Cit9CisKK3ZvaWQgVFRocmVhZFBvb2xTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKKyAgdGhyZWFkTWFuYWdlcl8tPmFkZChwQ2xpZW50LCBnZXRUaW1lb3V0KCksIGdldFRhc2tFeHBpcmF0aW9uKCkpOworfQorCit2b2lkIFRUaHJlYWRQb29sU2VydmVyOjpvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KikgeworfQorCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAppbmRleCA3MGIxOWJiLi4xMjE5OThjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCkBAIC0yMCwxMDcgKzIwLDgyIEBACiAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCiAjZGVmaW5lIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfIDEKIAorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHNlcnZlciB7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHNlcnZlciB7Ci0KLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKLQotY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBwdWJsaWMgVFNlcnZlciB7Ci0gcHVibGljOgotICBjbGFzcyBUYXNrOwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+CisvKioKKyAqIE1hbmFnZSBjbGllbnRzIHVzaW5nIGEgdGhyZWFkIHBvb2wuCisgKi8KK2NsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgeworcHVibGljOgogICBUVGhyZWFkUG9vbFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlciwKLSAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgICBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgc3RvcF8oZmFsc2UpLAotICAgIHRpbWVvdXRfKDApIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgogICBUVGhyZWFkUG9vbFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIsCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSkgOgotICAgIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgc3RvcF8oZmFsc2UpLAotICAgIHRpbWVvdXRfKDApIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3NvckZhY3Rvcnk+CiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIsCi0gICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gICAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgICB0aHJlYWRNYW5hZ2VyXyh0aHJlYWRNYW5hZ2VyKSwKLSAgICBzdG9wXyhmYWxzZSksCi0gICAgdGltZW91dF8oMCkge30KKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+CiAgIFRUaHJlYWRQb29sU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyLAotICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgICBUU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSksCi0gICAgdGhyZWFkTWFuYWdlcl8odGhyZWFkTWFuYWdlciksCi0gICAgc3RvcF8oZmFsc2UpLAotICAgIHRpbWVvdXRfKDApIHt9CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgID0gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKCkpOwogCiAgIHZpcnR1YWwgflRUaHJlYWRQb29sU2VydmVyKCk7CiAKKyAgLyoqCisgICAqIFBvc3QtY29uZGl0aW9ucyAocmV0dXJuIGd1YXJhbnRlZXMpOgorICAgKiAgIFRoZXJlIHdpbGwgYmUgbm8gY2xpZW50cyBjb25uZWN0ZWQuCisgICAqLwogICB2aXJ0dWFsIHZvaWQgc2VydmUoKTsKIAogICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZW91dCgpIGNvbnN0OwotCiAgIHZpcnR1YWwgdm9pZCBzZXRUaW1lb3V0KGludDY0X3QgdmFsdWUpOwogCi0gIHZpcnR1YWwgdm9pZCBzdG9wKCkgewotICAgIHN0b3BfID0gdHJ1ZTsKLSAgICBzZXJ2ZXJUcmFuc3BvcnRfLT5pbnRlcnJ1cHQoKTsKLSAgfQorICB2aXJ0dWFsIGludDY0X3QgZ2V0VGFza0V4cGlyYXRpb24oKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHNldFRhc2tFeHBpcmF0aW9uKGludDY0X3QgdmFsdWUpOwogCi0gcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSBjb25zdDsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CisgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAotICB2b2xhdGlsZSBib29sIHN0b3BfOwotCi0gIHZvbGF0aWxlIGludDY0X3QgdGltZW91dF87Ci0KKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRpbWVvdXRfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0YXNrRXhwaXJhdGlvbl87CiB9OwogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RUSFJFQURQT09MU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKaW5kZXggNmVkOGZkOC4uMjI2NGRmNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApAQCAtMTcsMjI1ICsxNywxMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KLQogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CiAKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci0KLWNsYXNzIFRUaHJlYWRlZFNlcnZlcjo6VGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotcHVibGljOgotCi0gIFRhc2soVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXIsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQsCi0gICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgICBzZXJ2ZXJfKHNlcnZlciksCi0gICAgcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgb3V0cHV0XyhvdXRwdXQpLAotICAgIHRyYW5zcG9ydF8odHJhbnNwb3J0KSB7Ci0gIH0KLQotICB+VGFzaygpIHt9Ci0KLSAgdm9pZCBydW4oKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyID0KLSAgICAgIHNlcnZlcl8uZ2V0RXZlbnRIYW5kbGVyKCk7Ci0gICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQgPSBOVUxMOwotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBldmVudEhhbmRsZXItPmNyZWF0ZUNvbnRleHQoaW5wdXRfLCBvdXRwdXRfKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgZXZlbnRIYW5kbGVyLT5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgdHJhbnNwb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0Xywgb3V0cHV0XywgY29ubmVjdGlvbkNvbnRleHQpIHx8Ci0gICAgICAgICAgICAhaW5wdXRfLT5nZXRUcmFuc3BvcnQoKS0+cGVlaygpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0dHgpIHsKLSAgICAgIGlmICh0dHguZ2V0VHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKSB7Ci0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlciBjbGllbnQgZGllZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uICZ4KSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUVGhyZWFkZWRTZXJ2ZXIgZXhjZXB0aW9uOiAlczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlaWQoeCkubmFtZSgpLCB4LndoYXQoKSk7Ci0gICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIlRUaHJlYWRlZFNlcnZlciB1bmNhdWdodCBleGNlcHRpb24uIik7Ci0gICAgfQotICAgIGlmIChldmVudEhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgZXZlbnRIYW5kbGVyLT5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dF8sIG91dHB1dF8pOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIGlucHV0IGNsb3NlIGZhaWxlZDogIikgKyB0dHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIG91dHB1dF8tPmdldFRyYW5zcG9ydCgpLT5jbG9zZSgpOwotICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyIG91dHB1dCBjbG9zZSBmYWlsZWQ6ICIpICsgdHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgLy8gUmVtb3ZlIHRoaXMgdGFzayBmcm9tIHBhcmVudCBib29ra2VlcGluZwotICAgIHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHNlcnZlcl8udGFza3NNb25pdG9yXyk7Ci0gICAgICBzZXJ2ZXJfLnRhc2tzXy5lcmFzZSh0aGlzKTsKLSAgICAgIGlmIChzZXJ2ZXJfLnRhc2tzXy5lbXB0eSgpKSB7Ci0gICAgICAgIHNlcnZlcl8udGFza3NNb25pdG9yXy5ub3RpZnkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gcHJpdmF0ZToKLSAgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfOwotICBmcmllbmQgY2xhc3MgVFRocmVhZGVkU2VydmVyOwotCi0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKLX07Ci0KLXZvaWQgVFRocmVhZGVkU2VydmVyOjppbml0KCkgewotICBzdG9wXyA9IGZhbHNlOwotCi0gIGlmICghdGhyZWFkRmFjdG9yeV8pIHsKLSAgICB0aHJlYWRGYWN0b3J5Xy5yZXNldChuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKLSAgfQorVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkpCisgIDogVFNlcnZlckZyYW1ld29yayhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgewogfQogCi1UVGhyZWFkZWRTZXJ2ZXI6On5UVGhyZWFkZWRTZXJ2ZXIoKSB7fQorVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSksCisgICAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgeworfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSkKKyAgOiBUU2VydmVyRnJhbWV3b3JrKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAorICAgIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKK30KKworVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5KQorICA6IFRTZXJ2ZXJGcmFtZXdvcmsocHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICB0aHJlYWRGYWN0b3J5Xyh0aHJlYWRGYWN0b3J5KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6flRUaHJlYWRlZFNlcnZlcigpIHsKK30KIAogdm9pZCBUVGhyZWFkZWRTZXJ2ZXI6OnNlcnZlKCkgeworICBUU2VydmVyRnJhbWV3b3JrOjpzZXJ2ZSgpOwogCi0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY2xpZW50OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0OwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydDsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2w7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbDsKLQotICAvLyBTdGFydCB0aGUgc2VydmVyIGxpc3RlbmluZwotICBzZXJ2ZXJUcmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAvLyBSdW4gdGhlIHByZVNlcnZlIGV2ZW50Ci0gIGlmIChldmVudEhhbmRsZXJfICE9IE5VTEwpIHsKLSAgICBldmVudEhhbmRsZXJfLT5wcmVTZXJ2ZSgpOworICAvLyBFbnN1cmUgcG9zdC1jb25kaXRpb24gb2Ygbm8gYWN0aXZlIGNsaWVudHMKKyAgU3luY2hyb25pemVkIHMoY2xpZW50TW9uaXRvcl8pOworICB3aGlsZSAoIWFjdGl2ZUNsaWVudE1hcF8uZW1wdHkoKSkgeworICAgIGNsaWVudE1vbml0b3JfLndhaXQoKTsKICAgfQogCi0gIHdoaWxlICghc3RvcF8pIHsKLSAgICB0cnkgewotICAgICAgY2xpZW50LnJlc2V0KCk7Ci0gICAgICBpbnB1dFRyYW5zcG9ydC5yZXNldCgpOwotICAgICAgb3V0cHV0VHJhbnNwb3J0LnJlc2V0KCk7Ci0gICAgICBpbnB1dFByb3RvY29sLnJlc2V0KCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbC5yZXNldCgpOwotCi0gICAgICAvLyBGZXRjaCBjbGllbnQgZnJvbSBzZXJ2ZXIKLSAgICAgIGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAvLyBNYWtlIElPIHRyYW5zcG9ydHMKLSAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGNsaWVudCk7Ci0gICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gZ2V0UHJvY2Vzc29yKGlucHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwgY2xpZW50KTsKLQotICAgICAgVFRocmVhZGVkU2VydmVyOjpUYXNrKiB0YXNrID0gbmV3IFRUaHJlYWRlZFNlcnZlcjo6VGFzaygqdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KTsKLQotICAgICAgLy8gQ3JlYXRlIGEgdGFzawotICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUgPQotICAgICAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPih0YXNrKTsKLQotICAgICAgLy8gQ3JlYXRlIGEgdGhyZWFkIGZvciB0aGlzIHRhc2sKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQgPQotICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4odGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChydW5uYWJsZSkpOwotCi0gICAgICAvLyBJbnNlcnQgdGhyZWFkIGludG8gdGhlIHNldCBvZiB0aHJlYWRzCi0gICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKHRhc2tzTW9uaXRvcl8pOwotICAgICAgICB0YXNrc18uaW5zZXJ0KHRhc2spOwotICAgICAgfQotCi0gICAgICAvLyBTdGFydCB0aGUgdGhyZWFkIQotICAgICAgdGhyZWFkLT5zdGFydCgpOwotCi0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBpbnB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IG91dHB1dFRyYW5zcG9ydC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKGNsaWVudCAhPSBOVUxMKSB7IGNsaWVudC0+Y2xvc2UoKTsgfQotICAgICAgaWYgKCFzdG9wXyB8fCB0dHguZ2V0VHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVEKSB7Ci0gICAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogVFNlcnZlclRyYW5zcG9ydCBkaWVkIG9uIGFjY2VwdDogIikgKyB0dHgud2hhdCgpOwotICAgICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBOVUxMKSB7IGlucHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgb3V0cHV0VHJhbnNwb3J0LT5jbG9zZSgpOyB9Ci0gICAgICBpZiAoY2xpZW50ICE9IE5VTEwpIHsgY2xpZW50LT5jbG9zZSgpOyB9Ci0gICAgICBzdHJpbmcgZXJyU3RyID0gc3RyaW5nKCJUVGhyZWFkZWRTZXJ2ZXI6IENhdWdodCBURXhjZXB0aW9uOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGNhdGNoIChzdHJpbmcgcykgewotICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IE5VTEwpIHsgaW5wdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gTlVMTCkgeyBvdXRwdXRUcmFuc3BvcnQtPmNsb3NlKCk7IH0KLSAgICAgIGlmIChjbGllbnQgIT0gTlVMTCkgeyBjbGllbnQtPmNsb3NlKCk7IH0KLSAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFRocmVhZGVkU2VydmVyOiBVbmtub3duIGV4Y2VwdGlvbjogIiArIHM7Ci0gICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgc3RvcHBlZCBtYW51YWxseSwgbWFrZSBzdXJlIHRvIGNsb3NlIHNlcnZlciB0cmFuc3BvcnQKLSAgaWYgKHN0b3BfKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHNlcnZlclRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICAgIHN0cmluZyBlcnJTdHIgPSBzdHJpbmcoIlRUaHJlYWRlZFNlcnZlcjogRXhjZXB0aW9uIHNodXR0aW5nIGRvd246ICIpICsgdHgud2hhdCgpOwotICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIFN5bmNocm9uaXplZCBzKHRhc2tzTW9uaXRvcl8pOwotICAgICAgd2hpbGUgKCF0YXNrc18uZW1wdHkoKSkgewotICAgICAgICB0YXNrc01vbml0b3JfLndhaXQoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0eCkgewotICAgICAgc3RyaW5nIGVyclN0ciA9IHN0cmluZygiVFRocmVhZGVkU2VydmVyOiBFeGNlcHRpb24gam9pbmluZyB3b3JrZXJzOiAiKSArIHR4LndoYXQoKTsKLSAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7Ci0gICAgfQotICAgIHN0b3BfID0gZmFsc2U7Ci0gIH0KLQorICBkcmFpbkRlYWRDbGllbnRzKCk7CiB9CiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6ZHJhaW5EZWFkQ2xpZW50cygpIHsKKyAgLy8gd2UncmUgaW4gYSBtb25pdG9yIGhlcmUKKyAgd2hpbGUgKCFkZWFkQ2xpZW50TWFwXy5lbXB0eSgpKSB7CisgICAgQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IGRlYWRDbGllbnRNYXBfLmJlZ2luKCk7CisgICAgaXQtPnNlY29uZC0+am9pbigpOworICAgIGRlYWRDbGllbnRNYXBfLmVyYXNlKGl0KTsKKyAgfQorfQorCit2b2lkIFRUaHJlYWRlZFNlcnZlcjo6b25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgeworICBTeW5jaHJvbml6ZWQgc3luYyhjbGllbnRNb25pdG9yXyk7CisgIHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4gcFJ1bm5hYmxlID0gbWFrZV9zaGFyZWQ8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4ocENsaWVudCk7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiBwVGhyZWFkID0gdGhyZWFkRmFjdG9yeV8tPm5ld1RocmVhZChwUnVubmFibGUpOworICBwUnVubmFibGUtPnRocmVhZChwVGhyZWFkKTsKKyAgYWN0aXZlQ2xpZW50TWFwXy5pbnNlcnQoQ2xpZW50TWFwOjp2YWx1ZV90eXBlKHBDbGllbnQuZ2V0KCksIHBUaHJlYWQpKTsKKyAgcFRocmVhZC0+c3RhcnQoKTsKK30KKwordm9pZCBUVGhyZWFkZWRTZXJ2ZXI6Om9uQ2xpZW50RGlzY29ubmVjdGVkKFRDb25uZWN0ZWRDbGllbnQqIHBDbGllbnQpIHsKKyAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOworICBkcmFpbkRlYWRDbGllbnRzKCk7IC8vIHVzZSB0aGUgb3V0Z29pbmcgdGhyZWFkIHRvIGRvIHNvbWUgbWFpbnRlbmFuY2Ugb24gb3VyIGRlYWQgY2xpZW50IGJhY2tsb2cKKyAgQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IGFjdGl2ZUNsaWVudE1hcF8uZmluZChwQ2xpZW50KTsKKyAgaWYgKGl0ICE9IGFjdGl2ZUNsaWVudE1hcF8uZW5kKCkpIHsKKyAgICBDbGllbnRNYXA6Oml0ZXJhdG9yIGVuZCA9IGl0OworICAgIGRlYWRDbGllbnRNYXBfLmluc2VydChpdCwgKytlbmQpOworICAgIGFjdGl2ZUNsaWVudE1hcF8uZXJhc2UoaXQpOworICB9CisgIGlmIChhY3RpdmVDbGllbnRNYXBfLmVtcHR5KCkpIHsKKyAgICBjbGllbnRNb25pdG9yXy5ub3RpZnkoKTsKKyAgfQorfQorCitUVGhyZWFkZWRTZXJ2ZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXI6OlRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkKKyAgOiBwQ2xpZW50XyhwQ2xpZW50KSB7Cit9CisKK1RUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6flRDb25uZWN0ZWRDbGllbnRSdW5uZXIoKSB7Cit9CisKK3ZvaWQgVFRocmVhZGVkU2VydmVyOjpUQ29ubmVjdGVkQ2xpZW50UnVubmVyOjpydW4oKSAvKiBvdmVycmlkZSAqLyB7CisgIHBDbGllbnRfLT5ydW4oKTsgIC8vIFJ1biB0aGUgY2xpZW50CisgIHBDbGllbnRfLnJlc2V0KCk7IC8vIFRoZSBjbGllbnQgaXMgZG9uZSAtIHJlbGVhc2UgaXQgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZGVzdHJ1Y3RvciBmb3Igc2FmZXR5Cit9CisKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKaW5kZXggZjk2NWZjZC4uYzVjY2QwMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCkBAIC0yMCwxMjYgKzIwLDEyNCBAQAogI2lmbmRlZiBfVEhSSUZUX1NFUlZFUl9UVEhSRUFERURTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2Ugc2VydmVyIHsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2Ugc2VydmVyIHsKKy8qKgorICogTWFuYWdlIGNsaWVudHMgdXNpbmcgdGhyZWFkcyAtIHRocmVhZHMgYXJlIGNyZWF0ZWQgb25lIGZvciBlYWNoIGNsaWVudCBhbmQgYXJlCisgKiByZWxlYXNlZCB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMuICBUaGlzIHNlcnZlciBpcyB1c2VkIHRvIG1ha2UgYSBkeW5hbWljYWxseQorICogc2NhbGFibGUgc2VydmVyIHVwIHRvIHRoZSBjb25jdXJyZW50IGNvbm5lY3Rpb24gbGltaXQuCisgKi8KK2NsYXNzIFRUaHJlYWRlZFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKK3B1YmxpYzoKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSkpOwogCi11c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeTsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKLXVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAotY2xhc3MgVFRocmVhZGVkU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgeworICBUVGhyZWFkZWRTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKLSBwdWJsaWM6Ci0gIGNsYXNzIFRhc2s7Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLSAgVFRocmVhZGVkU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKTsKLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3JGYWN0b3J5PgotICBUVGhyZWFkZWRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgVEhSSUZUX09WRVJMT0FEX0lGKFByb2Nlc3NvckZhY3RvcnksIFRQcm9jZXNzb3JGYWN0b3J5KSk7Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUVGhyZWFkZWRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBUSFJJRlRfT1ZFUkxPQURfSUYoUHJvY2Vzc29yLCBUUHJvY2Vzc29yKSk7Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yPgotICBUVGhyZWFkZWRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgIFRIUklGVF9PVkVSTE9BRF9JRihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKTsKKyAgVFRocmVhZGVkU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAogICB2aXJ0dWFsIH5UVGhyZWFkZWRTZXJ2ZXIoKTsKIAorICAvKioKKyAgICogUG9zdC1jb25kaXRpb25zIChyZXR1cm4gZ3VhcmFudGVlcyk6CisgICAqICAgVGhlcmUgd2lsbCBiZSBubyBjbGllbnRzIGNvbm5lY3RlZC4KKyAgICovCiAgIHZpcnR1YWwgdm9pZCBzZXJ2ZSgpOwogCi0gIHZvaWQgc3RvcCgpIHsKLSAgICBzdG9wXyA9IHRydWU7Ci0gICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7Ci0gIH0KK3Byb3RlY3RlZDoKKyAgLyoqCisgICAqIERyYWluIHJlY2VudGx5IGNvbm5lY3RlZCBjbGllbnRzIGJ5IGpvaW5pbmcgdGhlaXIgdGhyZWFkcyAtIHRoaXMgaXMgZG9uZSBsYXppbHkgYmVjYXVzZQorICAgKiB3ZSBjYW5ub3QgZG8gaXQgaW5zaWRlIHRoZSB0aHJlYWQgY29udGV4dCB0aGF0IGlzIGRpc2Nvbm5lY3RpbmcuCisgICAqLworICB2aXJ0dWFsIHZvaWQgZHJhaW5EZWFkQ2xpZW50cygpOwogCi0gcHJvdGVjdGVkOgotICB2b2lkIGluaXQoKTsKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50Q29ubmVjdGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKLSAgdm9sYXRpbGUgYm9vbCBzdG9wXzsKKyAgLyoqCisgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50RGlzY29ubmVjdGVkCisgICAqLworICB2aXJ0dWFsIHZvaWQgb25DbGllbnREaXNjb25uZWN0ZWQoVENvbm5lY3RlZENsaWVudCAqcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAKLSAgTW9uaXRvciB0YXNrc01vbml0b3JfOwotICBzdGQ6OnNldDxUYXNrKj4gdGFza3NfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKIAorICAvKioKKyAgICogQSBoZWxwZXIgd3JhcHBlciB1c2VkIHRvIHdyYXAgdGhlIGNsaWVudCBpbiBzb21ldGhpbmcgd2UgY2FuIHVzZSB0byBtYWludGFpbgorICAgKiB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbm5lY3RlZCBjbGllbnQgd2l0aGluIGEgZGV0YWNoZWQgdGhyZWFkLiAgV2UgY2Fubm90IHNpbXBseQorICAgKiB0cmFjayB0aGUgdGhyZWFkcyBiZWNhdXNlIGEgc2hhcmVkX3B0cjxUaHJlYWQ+IGhhbmdzIG9uIHRvIHRoZSBSdW5uYWJsZSBpdCBpcworICAgKiBwYXNzZWQsIGFuZCBUU2VydmVyRnJhbWV3b3JrIHJlcXVpcmVzIHRoZSBydW5uYWJsZSAoVENvbm5lY3RlZENsaWVudCkgdG8gYmUKKyAgICogZGVzdHJveWVkIGluIG9yZGVyIHRvIHdvcmsgcHJvcGVybHkuCisgICAqLworICBjbGFzcyBUQ29ubmVjdGVkQ2xpZW50UnVubmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGUKKyAgeworICBwdWJsaWM6CisgICAgVENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworICAgIHZpcnR1YWwgflRDb25uZWN0ZWRDbGllbnRSdW5uZXIoKTsKKyAgICB2b2lkIHJ1bigpIC8qIG92ZXJyaWRlICovOworICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiBwQ2xpZW50XzsKKyAgfTsKKworICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3IgY2xpZW50TW9uaXRvcl87CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxUQ29ubmVjdGVkQ2xpZW50ICosIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gPiBDbGllbnRNYXA7CisKKyAgLyoqCisgICAqIEEgbWFwIG9mIGFjdGl2ZSBjbGllbnRzCisgICAqLworICBDbGllbnRNYXAgYWN0aXZlQ2xpZW50TWFwXzsKKworICAvKioKKyAgICogQSBtYXAgb2YgY2xpZW50cyB0aGF0IGhhdmUgZGlzY29ubmVjdGVkIGJ1dCB0aGVpciB0aHJlYWRzIGhhdmUgbm90IGJlZW4gam9pbmVkCisgICAqLworICBDbGllbnRNYXAgZGVhZENsaWVudE1hcF87CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3JGYWN0b3J5PgotVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8UHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICBUSFJJRlRfT1ZFUkxPQURfSUZfREVGTihQcm9jZXNzb3JGYWN0b3J5LCBUUHJvY2Vzc29yRmFjdG9yeSkpIDoKLSAgVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gIGluaXQoKTsKIH0KLQotdGVtcGxhdGU8dHlwZW5hbWUgUHJvY2Vzc29yRmFjdG9yeT4KLVRUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnksCi0gICAgVEhSSUZUX09WRVJMT0FEX0lGX0RFRk4oUHJvY2Vzc29yRmFjdG9yeSwgVFByb2Nlc3NvckZhY3RvcnkpKSA6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIHByb3RvY29sRmFjdG9yeSksCi0gIHRocmVhZEZhY3RvcnlfKHRocmVhZEZhY3RvcnkpIHsKLSAgaW5pdCgpOwogfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBQcm9jZXNzb3I+Ci1UVGhyZWFkZWRTZXJ2ZXI6OlRUaHJlYWRlZFNlcnZlcigKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICBUSFJJRlRfT1ZFUkxPQURfSUZfREVGTihQcm9jZXNzb3IsIFRQcm9jZXNzb3IpKSA6Ci0gIFRTZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkgewotICBpbml0KCk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFByb2Nlc3Nvcj4KLVRUaHJlYWRlZFNlcnZlcjo6VFRocmVhZGVkU2VydmVyKAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5LAotICAgIFRIUklGVF9PVkVSTE9BRF9JRl9ERUZOKFByb2Nlc3NvciwgVFByb2Nlc3NvcikpIDoKLSAgVFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSwKLSAgdGhyZWFkRmFjdG9yeV8odGhyZWFkRmFjdG9yeSkgewotICBpbml0KCk7Ci19Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6c2VydmVyCit9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXIKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBREVEU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0LWNvbmZpZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjQ4NzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RocmlmdC1jb25maWcuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9jb25maWcuaD4KKyNlbHNlCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5MTA1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisKKyNpZmRlZiBfV0lOMzIKKyMgIGluY2x1ZGUgPHdpbnNvY2syLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgOjpXU0FHZXRMYXN0RXJyb3IoKQorIyAgZGVmaW5lIFRIUklGVF9FUlJOTyAoKl9lcnJubygpKQorIyAgZGVmaW5lIFRIUklGVF9FSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUworIyAgZGVmaW5lIFRIUklGVF9FQUdBSU4gV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgV1NBRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX0VOT1RDT05OIFdTQUVOT1RDT05OCisjICBkZWZpbmUgVEhSSUZUX0VUSU1FRE9VVCBXU0FFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRVBJUEUgV1NBRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBTT19FWENMVVNJVkVBRERSVVNFCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVCBTT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgSU5WQUxJRF9TT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiB0aHJpZnRfc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCB0aHJpZnRfZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyAxCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgMAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIDEKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIHRocmlmdF9nZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2Vzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgX2Nsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gX29wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIF9jaHNpemVfcworIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBfY29tbWl0CisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVQgaW9jdGxzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIHVfbG9uZworIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAorIyAgaWZkZWYgX1dJTjMyX1dDRQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiguLi4pIHRocmlmdF93c3RyMnN0cihnYWlfc3RyZXJyb3JXKF9fVkFfQVJHU19fKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yQQorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHB0cmRpZmZfdAorIyAgaWYgKF9NU0NfVkVSIDwgMTkwMCkKKyMgICAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBfc25wcmludGYKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHRocmlmdF9zbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHRocmlmdF91c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGhyaWZ0X3RpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgdGhyaWZ0X2N0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCB0aHJpZnRfcG9sbAorIyAgaWYgV0lOVkVSIDw9IDB4MDUwMiAvL1hQLCBTZXJ2ZXIyMDAzCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICB0aHJpZnRfcG9sbGZkCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTElOICAweDAzMDAKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIDB4MDAxMAorIyAgZWxzZSAvL1Zpc3RhLCBXaW43Li4uCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTEZEICBwb2xsZmQKKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZW5kaWYgLy9XSU5WRVIKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyMgIGlmICFkZWZpbmVkKEFJX0FERFJDT05GSUcpCisjICAgIGRlZmluZSBBSV9BRERSQ09ORklHIDB4MDAwMDA0MDAKKyMgIGVuZGlmCisjZWxzZSAvL25vdCBfV0lOMzIKKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgICAgICAgRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCAgRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiAgICBFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgICBFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOICAgICAgRUFHQUlOCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFICAgICAgIEVQSVBFCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX1JFVVNFQUREUgorIyAgZGVmaW5lIFRIUklGVF9TT0NLRVQgaW50CisjICBkZWZpbmUgVEhSSUZUX0lOVkFMSURfU09DS0VUICgtMSkKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiBzb2NrZXRwYWlyCisjICBkZWZpbmUgVEhSSUZUX0ZDTlRMIGZjbnRsCisjICBkZWZpbmUgVEhSSUZUX09fTk9OQkxPQ0sgT19OT05CTE9DSworIyAgZGVmaW5lIFRIUklGVF9GX0dFVEZMIEZfR0VURkwKKyMgIGRlZmluZSBUSFJJRlRfRl9TRVRGTCBGX1NFVEZMCisjICBkZWZpbmUgVEhSSUZUX0dFVFRJTUVPRkRBWSBnZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgY2xvc2UKKyMgIGRlZmluZSBUSFJJRlRfT1BFTiBvcGVuCisjICBkZWZpbmUgVEhSSUZUX0ZUUlVOQ0FURSBmdHJ1bmNhdGUKKyMgIGRlZmluZSBUSFJJRlRfRlNZTkMgZnN5bmMKKyMgIGRlZmluZSBUSFJJRlRfTFNFRUsgbHNlZWsKKyMgIGRlZmluZSBUSFJJRlRfV1JJVEUgd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCByZWFkCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVCBpb2N0bAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgaW50CisjICBkZWZpbmUgVEhSSUZUX1NUQVQgc3RhdAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBmc3RhdAorIyAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yCisjICBkZWZpbmUgVEhSSUZUX1NTSVpFVCBzc2l6ZV90CisjICBkZWZpbmUgVEhSSUZUX1NOUFJJTlRGIHNucHJpbnRmCisjICBkZWZpbmUgVEhSSUZUX1NMRUVQX1NFQyBzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHVzbGVlcAorIyAgZGVmaW5lIFRIUklGVF9USU1FU1BFQyB0aW1lc3BlYworIyAgZGVmaW5lIFRIUklGVF9DVElNRV9SIGN0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCBwb2xsCisjICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgcG9sbGZkCisjICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAorIyAgZGVmaW5lIFRIUklGVF9TSFVUX1JEV1IgU0hVVF9SRFdSCisjZW5kaWYKKworI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1BMQVRGT1JNX1NPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcAppbmRleCA4ZDdiNjcwLi45YWMyZjg0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmNwcApAQCAtMjQsOCArMjQsOSBAQAogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiB1aW50MzJfdCBUQnVmZmVyZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CkBAIC02Miw3ICs2Myw3IEBACiB2b2lkIFRCdWZmZXJlZFRyYW5zcG9ydDo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOwogICB1aW50MzJfdCBzcGFjZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsKLSAgLy8gV2Ugc2hvdWxkIG9ubHkgdGFrZSB0aGUgc2xvdyBwYXRoIGlmIHdlIGNhbid0IGFjY29tb2RhdGUgdGhlIHdyaXRlCisgIC8vIFdlIHNob3VsZCBvbmx5IHRha2UgdGhlIHNsb3cgcGF0aCBpZiB3ZSBjYW4ndCBhY2NvbW1vZGF0ZSB0aGUgd3JpdGUKICAgLy8gd2l0aCB0aGUgZnJlZSBzcGFjZSBhbHJlYWR5IGluIHRoZSBidWZmZXIuCiAgIGFzc2VydCh3Qm91bmRfIC0gd0Jhc2VfIDwgc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihsZW4pKTsKIApAQCAtODUsNyArODYsNyBAQAogICAvLyBUaGUgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGRvIHR3byBzeXNjYWxscy4KICAgLy8gVGhpcyBjYXNlIGFsc28gY292ZXJzIHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgaXMgZW1wdHksCiAgIC8vIGJ1dCBpdCBpcyBjbGVhcmVyIChJIHRoaW5rKSB0byB0aGluayBvZiBpdCBhcyB0d28gc2VwYXJhdGUgY2FzZXMuCi0gIGlmICgoaGF2ZV9ieXRlcyArIGxlbiA+PSAyKndCdWZTaXplXykgfHwgKGhhdmVfYnl0ZXMgPT0gMCkpIHsKKyAgaWYgKChoYXZlX2J5dGVzICsgbGVuID49IDIgKiB3QnVmU2l6ZV8pIHx8IChoYXZlX2J5dGVzID09IDApKSB7CiAgICAgLy8gVE9ETyhkcmVpc3MpOiB3cml0ZXYKICAgICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKICAgICAgIHRyYW5zcG9ydF8tPndyaXRlKHdCdWZfLmdldCgpLCBoYXZlX2J5dGVzKTsKQEAgLTEwOSwxNCArMTEwLDE0IEBACiB9CiAKIGNvbnN0IHVpbnQ4X3QqIFRCdWZmZXJlZFRyYW5zcG9ydDo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgKHZvaWQpIGJ1ZjsKLSAgKHZvaWQpIGxlbjsKKyAgKHZvaWQpYnVmOworICAodm9pZClsZW47CiAgIC8vIFNpbXBseSByZXR1cm4gTlVMTC4gIFdlIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgYWN0dWFsbHkgZGF0YSBhdmFpbGFibGUgb24KICAgLy8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCBzbyBjYWxsaW5nIHJlYWQoKSBtaWdodCBibG9jay4KICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgVEJ1ZmZlcmVkVHJhbnNwb3J0OjpmbHVzaCgpICB7Cit2b2lkIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSB7CiAgIC8vIFdyaXRlIG91dCBhbnkgZGF0YSB3YWl0aW5nIGluIHRoZSB3cml0ZSBidWZmZXIuCiAgIHVpbnQzMl90IGhhdmVfYnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOwogICBpZiAoaGF2ZV9ieXRlcyA+IDApIHsKQEAgLTEzMSw3ICsxMzIsNiBAQAogICB0cmFuc3BvcnRfLT5mbHVzaCgpOwogfQogCi0KIHVpbnQzMl90IFRGcmFtZWRUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHVpbnQzMl90IHdhbnQgPSBsZW47CiAgIHVpbnQzMl90IGhhdmUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCYXNlXyk7CkBAIC0xNzUsMTEgKzE3NSwxMiBAQAogICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KICAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgogICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KLSAgaW50MzJfdCBzejsKKyAgaW50MzJfdCBzeiA9IC0xOwogICB1aW50MzJfdCBzaXplX2J5dGVzX3JlYWQgPSAwOwogICB3aGlsZSAoc2l6ZV9ieXRlc19yZWFkIDwgc2l6ZW9mKHN6KSkgewogICAgIHVpbnQ4X3QqIHN6cCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZzeikgKyBzaXplX2J5dGVzX3JlYWQ7Ci0gICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydF8tPnJlYWQoc3pwLCBzaXplb2Yoc3opIC0gc2l6ZV9ieXRlc19yZWFkKTsKKyAgICB1aW50MzJfdCBieXRlc19yZWFkCisgICAgICAgID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3opKSAtIHNpemVfYnl0ZXNfcmVhZCk7CiAgICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewogICAgICAgaWYgKHNpemVfYnl0ZXNfcmVhZCA9PSAwKSB7CiAgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCkBAIC0yMDAsNiArMjAxLDEwIEBACiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRnJhbWUgc2l6ZSBoYXMgbmVnYXRpdmUgdmFsdWUiKTsKICAgfQogCisgIC8vIENoZWNrIGZvciBvdmVyc2l6ZWQgZnJhbWUKKyAgaWYgKHN6ID4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obWF4RnJhbWVTaXplXykpCisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwgIlJlY2VpdmVkIGFuIG92ZXJzaXplZCBmcmFtZSIpOworCiAgIC8vIFJlYWQgdGhlIGZyYW1lIHBheWxvYWQsIGFuZCByZXNldCBtYXJrZXJzLgogICBpZiAoc3ogPiBzdGF0aWNfY2FzdDxpbnQzMl90PihyQnVmU2l6ZV8pKSB7CiAgICAgckJ1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbc3pdKTsKQEAgLTIxNiw3ICsyMjEsNyBAQAogICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXzsKICAgaWYgKGxlbiArIGhhdmUgPCBoYXZlIC8qIG92ZXJmbG93ICovIHx8IGxlbiArIGhhdmUgPiAweDdmZmZmZmZmKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgIkF0dGVtcHRlZCB0byB3cml0ZSBvdmVyIDIgR0IgdG8gVEZyYW1lZFRyYW5zcG9ydC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0ZWQgdG8gd3JpdGUgb3ZlciAyIEdCIHRvIFRGcmFtZWRUcmFuc3BvcnQuIik7CiAgIH0KICAgd2hpbGUgKG5ld19zaXplIDwgbGVuICsgaGF2ZSkgewogICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKQEAgLTI0Miw3ICsyNDcsNyBAQAogICB3QmFzZV8gKz0gbGVuOwogfQogCi12b2lkIFRGcmFtZWRUcmFuc3BvcnQ6OmZsdXNoKCkgIHsKK3ZvaWQgVEZyYW1lZFRyYW5zcG9ydDo6Zmx1c2goKSB7CiAgIGludDMyX3Qgc3pfaGJvLCBzel9uYm87CiAgIGFzc2VydCh3QnVmU2l6ZV8gPiBzaXplb2Yoc3pfbmJvKSk7CiAKQEAgLTI1OSwxMSArMjY0LDIyIEBACiAgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2Yoc3pfbmJvKTsKIAogICAgIC8vIFdyaXRlIHNpemUgYW5kIGZyYW1lIGJvZHkuCi0gICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHNpemVvZihzel9uYm8pK3N6X2hibyk7CisgICAgdHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaXplb2Yoc3pfbmJvKSkgKyBzel9oYm8pOwogICB9CiAKICAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgogICB0cmFuc3BvcnRfLT5mbHVzaCgpOworCisgIC8vIHJlY2xhaW0gd3JpdGUgYnVmZmVyCisgIGlmICh3QnVmU2l6ZV8gPiBidWZSZWNsYWltVGhyZXNoXykgeworICAgIHdCdWZTaXplXyA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgd0J1Zl8ucmVzZXQobmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSk7CisgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CisKKyAgICAvLyByZXNldCB3QmFzZV8gd2l0aCBhIHBhZCBmb3IgdGhlIGZyYW1lIHNpemUKKyAgICBpbnQzMl90IHBhZCA9IDA7CisgICAgd0Jhc2VfID0gd0J1Zl8uZ2V0KCkgKyBzaXplb2YocGFkKTsKKyAgfQogfQogCiB1aW50MzJfdCBURnJhbWVkVHJhbnNwb3J0Ojp3cml0ZUVuZCgpIHsKQEAgLTI3MSw4ICsyODcsOCBAQAogfQogCiBjb25zdCB1aW50OF90KiBURnJhbWVkVHJhbnNwb3J0Ojpib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgewotICAodm9pZCkgYnVmOwotICAodm9pZCkgbGVuOworICAodm9pZClidWY7CisgICh2b2lkKWxlbjsKICAgLy8gRG9uJ3QgdHJ5IHRvIGJlIGNsZXZlciB3aXRoIHNoaWZ0aW5nIGJ1ZmZlcnMuCiAgIC8vIElmIHRoZSBmYXN0IHBhdGggZmFpbGVkIGxldCB0aGUgcHJvdG9jb2wgdXNlIGl0cyBzbG93IHBhdGguCiAgIC8vIEJlc2lkZXMsIHdobyBpcyBnb2luZyB0byB0cnkgdG8gYm9ycm93IGFjcm9zcyBtZXNzYWdlcz8KQEAgLTI4MSw3ICsyOTcsMTUgQEAKIAogdWludDMyX3QgVEZyYW1lZFRyYW5zcG9ydDo6cmVhZEVuZCgpIHsKICAgLy8gaW5jbHVkZSBmcmFtaW5nIGJ5dGVzCi0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCdWZfLmdldCgpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ockJvdW5kXyAtIHJCdWZfLmdldCgpICsgc2l6ZW9mKHVpbnQzMl90KSk7CisKKyAgaWYgKHJCdWZTaXplXyA+IGJ1ZlJlY2xhaW1UaHJlc2hfKSB7CisgICAgckJ1ZlNpemVfID0gMDsKKyAgICByQnVmXy5yZXNldCgpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHJCdWZTaXplXyk7CisgIH0KKworICByZXR1cm4gYnl0ZXNfcmVhZDsKIH0KIAogdm9pZCBUTWVtb3J5QnVmZmVyOjpjb21wdXRlUmVhZCh1aW50MzJfdCBsZW4sIHVpbnQ4X3QqKiBvdXRfc3RhcnQsIHVpbnQzMl90KiBvdXRfZ2l2ZSkgewpAQCAtMzM3LDI1ICszNjEsMjggQEAKICAgfQogCiAgIC8vIEdyb3cgdGhlIGJ1ZmZlciBhcyBuZWNlc3NhcnkuCi0gIHVpbnQzMl90IG5ld19zaXplID0gYnVmZmVyU2l6ZV87CisgIHVpbnQ2NF90IG5ld19zaXplID0gYnVmZmVyU2l6ZV87CiAgIHdoaWxlIChsZW4gPiBhdmFpbCkgewogICAgIG5ld19zaXplID0gbmV3X3NpemUgPiAwID8gbmV3X3NpemUgKiAyIDogMTsKLSAgICBhdmFpbCA9IGF2YWlsYWJsZV93cml0ZSgpICsgKG5ld19zaXplIC0gYnVmZmVyU2l6ZV8pOworICAgIGlmIChuZXdfc2l6ZSA+IG1heEJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWwgYnVmZmVyIHNpemUgb3ZlcmZsb3ciKTsKKyAgICB9CisgICAgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKSArIChzdGF0aWNfY2FzdDx1aW50MzJfdD4obmV3X3NpemUpIC0gYnVmZmVyU2l6ZV8pOwogICB9CiAKICAgLy8gQWxsb2NhdGUgaW50byBhIG5ldyBwb2ludGVyIHNvIHdlIGRvbid0IGJvcmsgb3VycyBpZiBpdCBmYWlscy4KLSAgdm9pZCogbmV3X2J1ZmZlciA9IHN0ZDo6cmVhbGxvYyhidWZmZXJfLCBuZXdfc2l6ZSk7CisgIHVpbnQ4X3QqIG5ld19idWZmZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oc3RkOjpyZWFsbG9jKGJ1ZmZlcl8sIG5ld19zaXplKSk7CiAgIGlmIChuZXdfYnVmZmVyID09IE5VTEwpIHsKICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICB9Ci0gIGJ1ZmZlclNpemVfID0gbmV3X3NpemU7CiAKLSAgcHRyZGlmZl90IG9mZnNldCA9ICh1aW50OF90KiluZXdfYnVmZmVyIC0gYnVmZmVyXzsKLSAgYnVmZmVyXyArPSBvZmZzZXQ7Ci0gIHJCYXNlXyArPSBvZmZzZXQ7Ci0gIHJCb3VuZF8gKz0gb2Zmc2V0OwotICB3QmFzZV8gKz0gb2Zmc2V0OwotICB3Qm91bmRfID0gYnVmZmVyXyArIGJ1ZmZlclNpemVfOworICByQmFzZV8gPSBuZXdfYnVmZmVyICsgKHJCYXNlXyAtIGJ1ZmZlcl8pOworICByQm91bmRfID0gbmV3X2J1ZmZlciArIChyQm91bmRfIC0gYnVmZmVyXyk7CisgIHdCYXNlXyA9IG5ld19idWZmZXIgKyAod0Jhc2VfIC0gYnVmZmVyXyk7CisgIHdCb3VuZF8gPSBuZXdfYnVmZmVyICsgbmV3X3NpemU7CisgIGJ1ZmZlcl8gPSBuZXdfYnVmZmVyOworICBidWZmZXJTaXplXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihuZXdfc2l6ZSk7CiB9CiAKIHZvaWQgVE1lbW9yeUJ1ZmZlcjo6d3JpdGVTbG93KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CkBAIC0zNzUsNyArNDAyLDcgQEAKIH0KIAogY29uc3QgdWludDhfdCogVE1lbW9yeUJ1ZmZlcjo6Ym9ycm93U2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgKHZvaWQpIGJ1ZjsKKyAgKHZvaWQpYnVmOwogICByQm91bmRfID0gd0Jhc2VfOwogICBpZiAoYXZhaWxhYmxlX3JlYWQoKSA+PSAqbGVuKSB7CiAgICAgKmxlbiA9IGF2YWlsYWJsZV9yZWFkKCk7CkBAIC0zODMsNSArNDEwLDYgQEAKICAgfQogICByZXR1cm4gTlVMTDsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCmluZGV4IGMxMzUyMjkuLmM0MjNmOWMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKQEAgLTIwLDggKzIwLDEwIEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfIDEKIAorI2luY2x1ZGUgPGNzdGRsaWI+CiAjaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlICJib29zdC9zY29wZWRfYXJyYXkuaHBwIgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgpAQCAtMzQsOCArMzYsOSBAQAogI2RlZmluZSBUREJfVU5MSUtFTFkodmFsKSAodmFsKQogI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Ci0KK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiBCYXNlIGNsYXNzIGZvciBhbGwgdHJhbnNwb3J0cyB0aGF0IHVzZSByZWFkL3dyaXRlIGJ1ZmZlcnMgZm9yIHBlcmZvcm1hbmNlLgpAQCAtNDksOCArNTIsNyBAQAogICovCiBjbGFzcyBUQnVmZmVyQmFzZSA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUQnVmZmVyQmFzZT4gewogCi0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBGYXN0LXBhdGggcmVhZC4KICAgICoKQEAgLTg1LDcgKzg3LDcgQEAKICAgLyoqCiAgICAqIEZhc3QtcGF0aCB3cml0ZS4KICAgICoKLSAgICogV2hlbiB3ZSBoYXZlIGVub3VnaCBlbXB0eSBzcGFjZSBpbiBvdXIgYnVmZmVyIHRvIGFjY29tb2RhdGUgdGhlIHdyaXRlLCB3ZQorICAgKiBXaGVuIHdlIGhhdmUgZW5vdWdoIGVtcHR5IHNwYWNlIGluIG91ciBidWZmZXIgdG8gYWNjb21tb2RhdGUgdGhlIHdyaXRlLCB3ZQogICAgKiBjYW4gc2F0aXNmeSBpdCB3aXRoIGEgc2luZ2xlIG1lbWNweSwgdGhlbiBhZGp1c3Qgb3VyIGludGVybmFsIHBvaW50ZXJzLgogICAgKiBJZiB0aGUgYnVmZmVyIGlzIGZ1bGwsIHdlIGNhbGwgb3V0IHRvIG91ciBzbG93IHBhdGgsIGltcGxlbWVudGVkIGJ5IGEKICAgICogc3ViY2xhc3MuICBUaGlzIG1ldGhvZCBpcyBtZWFudCB0byBldmVudHVhbGx5IGJlIG5vbnZpcnR1YWwgYW5kCkBAIC0xMjEsMTQgKzEyMywxMSBAQAogICAgIGlmIChUREJfTElLRUxZKHN0YXRpY19jYXN0PHB0cmRpZmZfdD4obGVuKSA8PSByQm91bmRfIC0gckJhc2VfKSkgewogICAgICAgckJhc2VfICs9IGxlbjsKICAgICB9IGVsc2UgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiY29uc3VtZSBkaWQgbm90IGZvbGxvdyBhIGJvcnJvdy4iKTsKICAgICB9CiAgIH0KIAotCi0gcHJvdGVjdGVkOgotCitwcm90ZWN0ZWQ6CiAgIC8vLyBTbG93IHBhdGggcmVhZC4KICAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgPSAwOwogCkBAIC0xNDksMjMgKzE0OCwxOCBAQAogICAgKiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgb3BlcmF0aW9uLCBzbyBpdCBpcyBva2F5IHRvIGp1c3QgbGVhdmUgaXQgdG8KICAgICogdGhlIGNvbmNyZXRlIGNsYXNzIHRvIHNldCB1cCBwb2ludGVycyBjb3JyZWN0bHkuCiAgICAqLwotICBUQnVmZmVyQmFzZSgpCi0gICAgOiByQmFzZV8oTlVMTCkKLSAgICAsIHJCb3VuZF8oTlVMTCkKLSAgICAsIHdCYXNlXyhOVUxMKQotICAgICwgd0JvdW5kXyhOVUxMKQotICB7fQorICBUQnVmZmVyQmFzZSgpIDogckJhc2VfKE5VTEwpLCByQm91bmRfKE5VTEwpLCB3QmFzZV8oTlVMTCksIHdCb3VuZF8oTlVMTCkge30KIAogICAvLy8gQ29udmVuaWVuY2UgbXV0YXRvciBmb3Igc2V0dGluZyB0aGUgcmVhZCBidWZmZXIuCiAgIHZvaWQgc2V0UmVhZEJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICAgIHJCYXNlXyA9IGJ1ZjsKLSAgICByQm91bmRfID0gYnVmK2xlbjsKKyAgICByQm91bmRfID0gYnVmICsgbGVuOwogICB9CiAKICAgLy8vIENvbnZlbmllbmNlIG11dGF0b3IgZm9yIHNldHRpbmcgdGhlIHdyaXRlIGJ1ZmZlci4KICAgdm9pZCBzZXRXcml0ZUJ1ZmZlcih1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICAgIHdCYXNlXyA9IGJ1ZjsKLSAgICB3Qm91bmRfID0gYnVmK2xlbjsKKyAgICB3Qm91bmRfID0gYnVmICsgbGVuOwogICB9CiAKICAgdmlydHVhbCB+VEJ1ZmZlckJhc2UoKSB7fQpAQCAtMTgxLDU5ICsxNzUsNDkgQEAKICAgdWludDhfdCogd0JvdW5kXzsKIH07CiAKLQogLyoqCiAgKiBCdWZmZXJlZCB0cmFuc3BvcnQuIEZvciByZWFkcyBpdCB3aWxsIHJlYWQgbW9yZSBkYXRhIHRoYW4gaXMgcmVxdWVzdGVkCiAgKiBhbmQgd2lsbCBzZXJ2ZSBmdXR1cmUgZGF0YSBvdXQgb2YgYSBsb2NhbCBidWZmZXIuIEZvciB3cml0ZXMsIGRhdGEgaXMKICAqIHN0b3JlZCB0byBhbiBpbiBtZW1vcnkgYnVmZmVyIGJlZm9yZSBiZWluZyB3cml0dGVuIG91dC4KICAqCiAgKi8KLWNsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydAotICA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUQnVmZmVyZWRUcmFuc3BvcnQsIFRCdWZmZXJCYXNlPiB7Ci0gcHVibGljOgotCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBUQnVmZmVyQmFzZT4geworcHVibGljOgogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA1MTI7CiAKICAgLy8vIFVzZSBkZWZhdWx0IGJ1ZmZlciBzaXplcy4KLSAgVEJ1ZmZlcmVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpCi0gICAgLCB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSkKLSAgICAsIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pCi0gICAgLCB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKQotICB7CisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7CiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAogICAvLy8gVXNlIHNwZWNpZmllZCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oc3opCi0gICAgLCB3QnVmU2l6ZV8oc3opCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgeworICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3Qgc3opCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8oc3opLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHJCdWZfKG5ldyB1aW50OF90W3JCdWZTaXplX10pLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkgewogICAgIGluaXRQb2ludGVycygpOwogICB9CiAKICAgLy8vIFVzZSBzcGVjaWZpZWQgcmVhZCBhbmQgd3JpdGUgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCByc3osIHVpbnQzMl90IHdzeikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKHJzeikKLSAgICAsIHdCdWZTaXplXyh3c3opCi0gICAgLCByQnVmXyhuZXcgdWludDhfdFtyQnVmU2l6ZV9dKQotICAgICwgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSkKLSAgeworICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3QgcnN6LCB1aW50MzJfdCB3c3opCisgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCisgICAgICByQnVmU2l6ZV8ocnN6KSwKKyAgICAgIHdCdWZTaXplXyh3c3opLAorICAgICAgckJ1Zl8obmV3IHVpbnQ4X3RbckJ1ZlNpemVfXSksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSB7CiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOwotICB9CisgIHZvaWQgb3BlbigpIHsgdHJhbnNwb3J0Xy0+b3BlbigpOyB9CiAKLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9CisgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KIAogICBib29sIHBlZWsoKSB7CiAgICAgaWYgKHJCYXNlXyA9PSByQm91bmRfKSB7CkBAIC0yNTMsNiArMjM3LDEwIEBACiAKICAgdm9pZCBmbHVzaCgpOwogCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAqLworICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmdldE9yaWdpbigpOyB9CiAKICAgLyoqCiAgICAqIFRoZSBmb2xsb3dpbmcgYmVoYXZpb3IgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGJ5IFRCdWZmZXJlZFRyYW5zcG9ydCwKQEAgLTI2NywyNiArMjU1LDIyIEBACiAgICAqLwogICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCiAgIC8qCiAgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCiAgICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCiAgICAqLwotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZiwgbGVuKTsKLSAgfQorICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsIGxlbik7IH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgdm9pZCBpbml0UG9pbnRlcnMoKSB7CiAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgMCk7CiAgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CiAgICAgLy8gV3JpdGUgc2l6ZSBuZXZlciBjaGFuZ2VzLgogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgdWludDMyX3QgckJ1ZlNpemVfOwogICB1aW50MzJfdCB3QnVmU2l6ZV87CkBAIC0yOTQsMTMgKzI3OCwxMiBAQAogICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IHdCdWZfOwogfTsKIAotCiAvKioKICAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCiAgKgogICovCiBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQogCiAgIHZpcnR1YWwgflRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQpAQCAtMzA4LDEzICsyOTEsMTEgQEAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykpOwogICB9Ci0KIH07CiAKLQogLyoqCiAgKiBGcmFtZWQgdHJhbnNwb3J0LiBBbGwgd3JpdGVzIGdvIGludG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciB1bnRpbCBmbHVzaCBpcwogICogY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNwb3J0IHdyaXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBlbnRpcmUKQEAgLTMyMiw0NCArMzAzLDUxIEBACiAgKiBvdGhlciBlbmQgdG8gYWx3YXlzIGRvIGZpeGVkLWxlbmd0aCByZWFkcy4KICAqCiAgKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQKLSAgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZyYW1lZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKLSBwdWJsaWM6Ci0KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEZyYW1lZFRyYW5zcG9ydCwgVEJ1ZmZlckJhc2U+IHsKK3B1YmxpYzoKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOworICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfTUFYX0ZSQU1FX1NJWkUgPSAyNTYgKiAxMDI0ICogMTAyNDsKIAogICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgotICBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgckJ1ZlNpemVfKDApCi0gICAgLCB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSkKLSAgICAsIHJCdWZfKCkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKKyAgVEZyYW1lZFRyYW5zcG9ydCgpCisgICAgOiB0cmFuc3BvcnRfKCksCisgICAgICByQnVmU2l6ZV8oMCksCisgICAgICB3QnVmU2l6ZV8oREVGQVVMVF9CVUZGRVJfU0laRSksCisgICAgICByQnVmXygpLAorICAgICAgd0J1Zl8obmV3IHVpbnQ4X3Rbd0J1ZlNpemVfXSksCisgICAgICBidWZSZWNsYWltVGhyZXNoXygoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkgewogICAgIGluaXRQb2ludGVycygpOwogICB9CiAKLSAgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQotICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpCi0gICAgLCByQnVmU2l6ZV8oMCkKLSAgICAsIHdCdWZTaXplXyhzeikKLSAgICAsIHJCdWZfKCkKLSAgICAsIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pCi0gIHsKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKDApLAorICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAorICAgICAgckJ1Zl8oKSwKKyAgICAgIHdCdWZfKG5ldyB1aW50OF90W3dCdWZTaXplX10pLAorICAgICAgYnVmUmVjbGFpbVRocmVzaF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCkpLAorICAgICAgbWF4RnJhbWVTaXplXyhERUZBVUxUX01BWF9GUkFNRV9TSVpFKSB7CiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICB2b2lkIG9wZW4oKSB7Ci0gICAgdHJhbnNwb3J0Xy0+b3BlbigpOworICBURnJhbWVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3osCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmUmVjbGFpbVRocmVzaCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgckJ1ZlNpemVfKDApLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHJCdWZfKCksCisgICAgICB3QnVmXyhuZXcgdWludDhfdFt3QnVmU2l6ZV9dKSwKKyAgICAgIGJ1ZlJlY2xhaW1UaHJlc2hfKGJ1ZlJlY2xhaW1UaHJlc2gpLAorICAgICAgbWF4RnJhbWVTaXplXyhERUZBVUxUX01BWF9GUkFNRV9TSVpFKSB7CisgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KKyAgdm9pZCBvcGVuKCkgeyB0cmFuc3BvcnRfLT5vcGVuKCk7IH0KIAotICBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsgfQorCisgIGJvb2wgcGVlaygpIHsgcmV0dXJuIChyQmFzZV8gPCByQm91bmRfKSB8fCB0cmFuc3BvcnRfLT5wZWVrKCk7IH0KIAogICB2b2lkIGNsb3NlKCkgewogICAgIGZsdXNoKCk7CkBAIC0zNzgsMjYgKzM2NiwzNyBAQAogCiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCiAgIC8qCiAgICAqIFRWaXJ0dWFsVHJhbnNwb3J0IHByb3ZpZGVzIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkQWxsKCkuCiAgICAqIFdlIHdhbnQgdG8gdXNlIHRoZSBUQnVmZmVyQmFzZSB2ZXJzaW9uIGluc3RlYWQuCiAgICAqLwotICB1aW50MzJfdCByZWFkQWxsKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZixsZW4pOwotICB9CisgIHVzaW5nIFRCdWZmZXJCYXNlOjpyZWFkQWxsOwogCi0gcHJvdGVjdGVkOgorICAvKioKKyAgICogUmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgKi8KKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKSB7IHJldHVybiB0cmFuc3BvcnRfLT5nZXRPcmlnaW4oKTsgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgZnJhbWUgYXQgcmVhZAorICAgKi8KKyAgdm9pZCBzZXRNYXhGcmFtZVNpemUodWludDMyX3QgbWF4RnJhbWVTaXplKSB7IG1heEZyYW1lU2l6ZV8gPSBtYXhGcmFtZVNpemU7IH0KKworICAvKioKKyAgICogR2V0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGZyYW1lIGF0IHJlYWQKKyAgICovCisgIHVpbnQzMl90IGdldE1heEZyYW1lU2l6ZSgpIHsgcmV0dXJuIG1heEZyYW1lU2l6ZV87IH0KKworcHJvdGVjdGVkOgogICAvKioKICAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KICAgICoKICAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCiAgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKICAgICovCi0gIGJvb2wgcmVhZEZyYW1lKCk7CisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKIAogICB2b2lkIGluaXRQb2ludGVycygpIHsKICAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOwpAQCAtNDA4LDEyICs0MDcsMTQgQEAKICAgICB0aGlzLT53cml0ZSgodWludDhfdCopJnBhZCwgc2l6ZW9mKHBhZCkpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgdWludDMyX3QgckJ1ZlNpemVfOwogICB1aW50MzJfdCB3QnVmU2l6ZV87CiAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gckJ1Zl87CiAgIGJvb3N0OjpzY29wZWRfYXJyYXk8dWludDhfdD4gd0J1Zl87CisgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2hfOworICB1aW50MzJfdCBtYXhGcmFtZVNpemVfOwogfTsKIAogLyoqCkBAIC00MjEsNyArNDIyLDcgQEAKICAqCiAgKi8KIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KIAogICB2aXJ0dWFsIH5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC00MjksMTMgKzQzMCwxMSBAQAogICAvKioKICAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgZnJhbWVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKSk7CiAgIH0KLQogfTsKIAotCiAvKioKICAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KICAqIGluIG1lbW9yeSBidWZmZXIuIEFueXRpbWUgeW91IGNhbGwgd3JpdGUgb24gaXQsIHRoZSBkYXRhIGlzIHNpbXBseSBwbGFjZWQKQEAgLTQ0NiwxNSArNDQ1LDE3IEBACiAgKgogICovCiBjbGFzcyBUTWVtb3J5QnVmZmVyIDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRNZW1vcnlCdWZmZXIsIFRCdWZmZXJCYXNlPiB7Ci0gcHJpdmF0ZToKLQorcHJpdmF0ZToKICAgLy8gQ29tbW9uIGluaXRpYWxpemF0aW9uIGRvbmUgYnkgYWxsIGNvbnN0cnVjdG9ycy4KICAgdm9pZCBpbml0Q29tbW9uKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3Qgc2l6ZSwgYm9vbCBvd25lciwgdWludDMyX3Qgd1BvcykgeworCisgICAgbWF4QnVmZmVyU2l6ZV8gPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKTsKKwogICAgIGlmIChidWYgPT0gTlVMTCAmJiBzaXplICE9IDApIHsKICAgICAgIGFzc2VydChvd25lcik7CiAgICAgICBidWYgPSAodWludDhfdCopc3RkOjptYWxsb2Moc2l6ZSk7CiAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKKwl0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgICAgfQogICAgIH0KIApAQCAtNDczLDcgKzQ3NCw3IEBACiAgICAgLy8gZXF1YWwgdG8gd0Jhc2VfLiAgV2UgdXBkYXRlIGl0IGluIGEgZmV3IHBsYWNlcyAoY29tcHV0ZVJlYWQsIGV0Yy4pLgogICB9CiAKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBkZWZhdWx0U2l6ZSA9IDEwMjQ7CiAKICAgLyoqCkBAIC00OTYsMTkgKzQ5NywxMyBAQAogICAgKiAgIGFuZCB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0LgogICAgKiAgIFRoZSBtZW1ib3J5IG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoIG1hbGxvYy4KICAgICovCi0gIGVudW0gTWVtb3J5UG9saWN5Ci0gIHsgT0JTRVJWRSA9IDEKLSAgLCBDT1BZID0gMgotICAsIFRBS0VfT1dORVJTSElQID0gMwotICB9OworICBlbnVtIE1lbW9yeVBvbGljeSB7IE9CU0VSVkUgPSAxLCBDT1BZID0gMiwgVEFLRV9PV05FUlNISVAgPSAzIH07CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGRlZmF1bHQtc2l6ZWQgYnVmZmVyLAogICAgKiBvd25lZCBieSB0aGUgVE1lbW9yeUJ1ZmZlciBvYmplY3QuCiAgICAqLwotICBUTWVtb3J5QnVmZmVyKCkgewotICAgIGluaXRDb21tb24oTlVMTCwgZGVmYXVsdFNpemUsIHRydWUsIDApOwotICB9CisgIFRNZW1vcnlCdWZmZXIoKSB7IGluaXRDb21tb24oTlVMTCwgZGVmYXVsdFNpemUsIHRydWUsIDApOyB9CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdCBhIFRNZW1vcnlCdWZmZXIgd2l0aCBhIGJ1ZmZlciBvZiBhIHNwZWNpZmllZCBzaXplLApAQCAtNTE2LDkgKzUxMSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBzeiAgVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnVmZmVyLgogICAgKi8KLSAgVE1lbW9yeUJ1ZmZlcih1aW50MzJfdCBzeikgewotICAgIGluaXRDb21tb24oTlVMTCwgc3osIHRydWUsIDApOwotICB9CisgIFRNZW1vcnlCdWZmZXIodWludDMyX3Qgc3opIHsgaW5pdENvbW1vbihOVUxMLCBzeiwgdHJ1ZSwgMCk7IH0KIAogICAvKioKICAgICogQ29uc3RydWN0IGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGJ1ZiBhcyBpdHMgaW5pdGlhbCBjb250ZW50cy4KQEAgLTUzNywxNyArNTMwLDE3IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChwb2xpY3kpIHsKLSAgICAgIGNhc2UgT0JTRVJWRToKLSAgICAgIGNhc2UgVEFLRV9PV05FUlNISVA6Ci0gICAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDT1BZOgotICAgICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKLSAgICAgICAgdGhpcy0+d3JpdGUoYnVmLCBzeik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBNZW1vcnlQb2xpY3kgZm9yIFRNZW1vcnlCdWZmZXIiKTsKKyAgICBjYXNlIE9CU0VSVkU6CisgICAgY2FzZSBUQUtFX09XTkVSU0hJUDoKKyAgICAgIGluaXRDb21tb24oYnVmLCBzeiwgcG9saWN5ID09IFRBS0VfT1dORVJTSElQLCBzeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIENPUFk6CisgICAgICBpbml0Q29tbW9uKE5VTEwsIHN6LCB0cnVlLCAwKTsKKyAgICAgIHRoaXMtPndyaXRlKGJ1Ziwgc3opOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE1lbW9yeVBvbGljeSBmb3IgVE1lbW9yeUJ1ZmZlciIpOwogICAgIH0KICAgfQogCkBAIC01NTcsMTMgKzU1MCw5IEBACiAgICAgfQogICB9CiAKLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CiAKLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsKLSAgfQorICBib29sIHBlZWsoKSB7IHJldHVybiAockJhc2VfIDwgd0Jhc2VfKTsgfQogCiAgIHZvaWQgb3BlbigpIHt9CiAKQEAgLTY0Niw3ICs2MzUsNyBAQAogCiAgIC8vIHJldHVybiBudW1iZXIgb2YgYnl0ZXMgcmVhZAogICB1aW50MzJfdCByZWFkRW5kKCkgewotICAgIC8vVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAogICAgIHVpbnQzMl90IGJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJCYXNlXyAtIGJ1ZmZlcl8pOwogICAgIGlmIChyQmFzZV8gPT0gd0Jhc2VfKSB7CiAgICAgICByZXNldEJ1ZmZlcigpOwpAQCAtNjU2LDcgKzY0NSw3IEBACiAKICAgLy8gUmV0dXJuIG51bWJlciBvZiBieXRlcyB3cml0dGVuCiAgIHVpbnQzMl90IHdyaXRlRW5kKCkgewotICAgIC8vVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLCBiZWNhdXNlIGJ1ZmZlcl8ncyBzaXplIGlzIGEgdWludDMyX3QKKyAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUsIGJlY2F1c2UgYnVmZmVyXydzIHNpemUgaXMgYSB1aW50MzJfdAogICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gYnVmZmVyXyk7CiAgIH0KIApAQCAtNjY1LDEyICs2NTQsMTAgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHJCYXNlXyk7CiAgIH0KIAotICB1aW50MzJfdCBhdmFpbGFibGVfd3JpdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih3Qm91bmRfIC0gd0Jhc2VfKTsKLSAgfQorICB1aW50MzJfdCBhdmFpbGFibGVfd3JpdGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4od0JvdW5kXyAtIHdCYXNlXyk7IH0KIAogICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgY2xpZW50IGNhbiB3cml0ZSBkYXRhIHRvIGFwcGVuZCB0bwotICAvLyB0aGUgVE1lbW9yeUJ1ZmZlciwgYW5kIGVuc3VyZXMgdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGFjY29tb2RhdGUgYQorICAvLyB0aGUgVE1lbW9yeUJ1ZmZlciwgYW5kIGVuc3VyZXMgdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGEKICAgLy8gd3JpdGUgb2YgdGhlIHByb3ZpZGVkIGxlbmd0aC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIHZlcnkgY29udmVuaWVudCBmb3IKICAgLy8gcGFzc2luZyB0byByZWFkKCksIHJlY3YoKSwgb3Igc2ltaWxhci4gWW91IG11c3QgY2FsbCB3cm90ZUJ5dGVzKCkgYXMgc29vbgogICAvLyBhcyBkYXRhIGlzIHdyaXR0ZW4gb3IgdGhlIGJ1ZmZlciB3aWxsIG5vdCBiZSBhd2FyZSB0aGF0IGRhdGEgaGFzIGNoYW5nZWQuCkBAIC02ODcsMjIgKzY3NCw0MyBAQAogICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgogICAgKiBXZSB3YW50IHRvIHVzZSB0aGUgVEJ1ZmZlckJhc2UgdmVyc2lvbiBpbnN0ZWFkLgogICAgKi8KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiBUQnVmZmVyQmFzZTo6cmVhZEFsbChidWYsbGVuKTsKKyAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gVEJ1ZmZlckJhc2U6OnJlYWRBbGwoYnVmLCBsZW4pOyB9CisKKyAgLy8hIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIHVpbnQzMl90IGdldEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1ZmZlclNpemVfOwogICB9CiAKLSBwcm90ZWN0ZWQ6CisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgdWludDMyX3QgZ2V0TWF4QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4QnVmZmVyU2l6ZV87CisgIH0KKworICAvLyEgXGJyaWVmIENoYW5nZSB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHBhcmFtW2luXSAgbWF4U2l6ZSAgdGhlIG5ldyBtYXhpbXVtIGJ1ZmZlciBzaXplIGFsbG93ZWQgdG8gZ3JvdyB0bworICAvLyEgXHRocm93cyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihCQURfQVJHUykgaWYgbWF4U2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgdm9pZCBzZXRNYXhCdWZmZXJTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBpZiAobWF4U2l6ZSA8IGJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSBidWZmZXIgc2l6ZSB3b3VsZCBiZSBsZXNzIHRoYW4gY3VycmVudCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgICBtYXhCdWZmZXJTaXplXyA9IG1heFNpemU7CisgIH0KKworcHJvdGVjdGVkOgogICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgewogICAgIHVzaW5nIHN0ZDo6c3dhcDsKLSAgICBzd2FwKGJ1ZmZlcl8sICAgICB0aGF0LmJ1ZmZlcl8pOworICAgIHN3YXAoYnVmZmVyXywgdGhhdC5idWZmZXJfKTsKICAgICBzd2FwKGJ1ZmZlclNpemVfLCB0aGF0LmJ1ZmZlclNpemVfKTsKIAotICAgIHN3YXAockJhc2VfLCAgICAgIHRoYXQuckJhc2VfKTsKLSAgICBzd2FwKHJCb3VuZF8sICAgICB0aGF0LnJCb3VuZF8pOwotICAgIHN3YXAod0Jhc2VfLCAgICAgIHRoYXQud0Jhc2VfKTsKLSAgICBzd2FwKHdCb3VuZF8sICAgICB0aGF0LndCb3VuZF8pOworICAgIHN3YXAockJhc2VfLCB0aGF0LnJCYXNlXyk7CisgICAgc3dhcChyQm91bmRfLCB0aGF0LnJCb3VuZF8pOworICAgIHN3YXAod0Jhc2VfLCB0aGF0LndCYXNlXyk7CisgICAgc3dhcCh3Qm91bmRfLCB0aGF0LndCb3VuZF8pOwogCi0gICAgc3dhcChvd25lcl8sICAgICAgdGhhdC5vd25lcl8pOworICAgIHN3YXAob3duZXJfLCB0aGF0Lm93bmVyXyk7CiAgIH0KIAogICAvLyBNYWtlIHN1cmUgdGhlcmUncyBhdCBsZWFzdCAnbGVuJyBieXRlcyBhdmFpbGFibGUgZm9yIHdyaXRpbmcuCkBAIC03MjMsMTMgKzczMSwxNyBAQAogICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKICAgdWludDMyX3QgYnVmZmVyU2l6ZV87CiAKKyAgLy8gTWF4aW11bSBhbGxvd2VkIHNpemUKKyAgdWludDMyX3QgbWF4QnVmZmVyU2l6ZV87CisKICAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/CiAgIGJvb2wgb3duZXJfOwogCiAgIC8vIERvbid0IGZvcmdldCB0byB1cGRhdGUgY29uc3RyY3RvcnMsIGluaXRDb21tb24sIGFuZCBzd2FwIGlmCiAgIC8vIHlvdSBhZGQgbmV3IG1lbWJlcnMuCiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RCVUZGRVJUUkFOU1BPUlRTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKaW5kZXggMTc2ZTdiZi4uOTNkZDEwMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGV4Y2VwdGlvbj4KIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogCiAjaWZkZWYgSEFWRV9VTklTVERfSAogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtMzAsMjMgKzMxLDIzIEBACiAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIHZvaWQgVEZEVHJhbnNwb3J0OjpjbG9zZSgpIHsKICAgaWYgKCFpc09wZW4oKSkgewogICAgIHJldHVybjsKICAgfQogCi0gIGludCBydiA9IDo6Y2xvc2UoZmRfKTsKLSAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgaW50IHJ2ID0gOjpUSFJJRlRfQ0xPU0UoZmRfKTsKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CiAgIGZkXyA9IC0xOwogICAvLyBIYXZlIHRvIGNoZWNrIHVuY2F1Z2h0X2V4Y2VwdGlvbiBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGluIHRoZSBkZXN0cnVjdG9yLgogICBpZiAocnYgPCAwICYmICFzdGQ6OnVuY2F1Z2h0X2V4Y2VwdGlvbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6Y2xvc2UoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURkRUcmFuc3BvcnQ6OmNsb3NlKCkiLCBlcnJub19jb3B5KTsKICAgfQogfQogCkBAIC01NCw0MyArNTUsMzkgQEAKICAgdW5zaWduZWQgaW50IG1heFJldHJpZXMgPSA1OyAvLyBzYW1lIGFzIHRoZSBUU29ja2V0IGRlZmF1bHQKICAgdW5zaWduZWQgaW50IHJldHJpZXMgPSAwOwogICB3aGlsZSAodHJ1ZSkgewotICAgIHNzaXplX3QgcnYgPSA6OnJlYWQoZmRfLCBidWYsIGxlbik7CisgICAgVEhSSUZUX1NTSVpFVCBydiA9IDo6VEhSSUZUX1JFQUQoZmRfLCBidWYsIGxlbik7CiAgICAgaWYgKHJ2IDwgMCkgewotICAgICAgaWYgKGVycm5vID09IEVJTlRSICYmIHJldHJpZXMgPCBtYXhSZXRyaWVzKSB7CisgICAgICBpZiAoVEhSSUZUX0VSUk5PID09IFRIUklGVF9FSU5UUiAmJiByZXRyaWVzIDwgbWF4UmV0cmllcykgewogICAgICAgICAvLyBJZiBpbnRlcnJ1cHRlZCwgdHJ5IGFnYWluCiAgICAgICAgICsrcmV0cmllczsKICAgICAgICAgY29udGludWU7CiAgICAgICB9Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVEZEVHJhbnNwb3J0OjpyZWFkKCkiLCBlcnJub19jb3B5KTsKICAgICB9Ci0gICAgLy90aGlzIHNob3VsZCBiZSBmaW5lLCBzaW5jZSB3ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcywKLSAgICAvL2FuZCA6OnJlYWQgc2hvdWxkIG9ubHkgcmV0dXJuIGEgMzItYml0IHZhbHVlIHNpbmNlIGxlbiBpcyAzMi1iaXQuCisgICAgLy8gdGhpcyBzaG91bGQgYmUgZmluZSwgc2luY2Ugd2UgYWxyZWFkeSBjaGVja2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMsCisgICAgLy8gYW5kIDo6cmVhZCBzaG91bGQgb25seSByZXR1cm4gYSAzMi1iaXQgdmFsdWUgc2luY2UgbGVuIGlzIDMyLWJpdC4KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJ2KTsKICAgfQogfQogCiB2b2lkIFRGRFRyYW5zcG9ydDo6d3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKICAgd2hpbGUgKGxlbiA+IDApIHsKLSAgICBzc2l6ZV90IHJ2ID0gOjp3cml0ZShmZF8sIGJ1ZiwgbGVuKTsKKyAgICBUSFJJRlRfU1NJWkVUIHJ2ID0gOjpUSFJJRlRfV1JJVEUoZmRfLCBidWYsIGxlbik7CiAKICAgICBpZiAocnYgPCAwKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZEVHJhbnNwb3J0Ojp3cml0ZSgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIsIGVycm5vX2NvcHkpOwogICAgIH0gZWxzZSBpZiAocnYgPT0gMCkgewotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIlRGRFRyYW5zcG9ydDo6d3JpdGUoKSIpOwogICAgIH0KIAogICAgIGJ1ZiArPSBydjsKLSAgICAvL3RoaXMgc2hvdWxkIGJlIGZpbmUsIGFzIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBmb3IgbmVnYXRpdmUgdmFsdWVzLCBhbmQKKyAgICAvLyB0aGlzIHNob3VsZCBiZSBmaW5lLCBhcyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yIG5lZ2F0aXZlIHZhbHVlcywgYW5kCiAgICAgLy86OndyaXRlIHNob3VsZG4ndCByZXR1cm4gbW9yZSB0aGFuIGEgdWludDMyX3Qgc2luY2UgbGVuIGlzIGEgdWludDMyX3QKICAgICBsZW4gLT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJ2KTsKICAgfQogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaAppbmRleCAzZWJhZDVjLi41NTkzZDQzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgKQEAgLTI1LDMwICsyNSwzMSBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIlRUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUVmlydHVhbFRyYW5zcG9ydC5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiBEZWFkLXNpbXBsZSB3cmFwcGVyIGFyb3VuZCBhIGZpbGUgZGVzY3JpcHRvci4KICAqCiAgKi8KIGNsYXNzIFRGRFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxURkRUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6Ci0gIGVudW0gQ2xvc2VQb2xpY3kKLSAgeyBOT19DTE9TRV9PTl9ERVNUUk9ZID0gMAotICAsIENMT1NFX09OX0RFU1RST1kgPSAxCi0gIH07CitwdWJsaWM6CisgIGVudW0gQ2xvc2VQb2xpY3kgeyBOT19DTE9TRV9PTl9ERVNUUk9ZID0gMCwgQ0xPU0VfT05fREVTVFJPWSA9IDEgfTsKIAogICBURkRUcmFuc3BvcnQoaW50IGZkLCBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3kgPSBOT19DTE9TRV9PTl9ERVNUUk9ZKQotICAgIDogZmRfKGZkKQotICAgICwgY2xvc2VfcG9saWN5XyhjbG9zZV9wb2xpY3kpCi0gIHt9CisgICAgOiBmZF8oZmQpLCBjbG9zZV9wb2xpY3lfKGNsb3NlX3BvbGljeSkge30KIAogICB+VEZEVHJhbnNwb3J0KCkgewogICAgIGlmIChjbG9zZV9wb2xpY3lfID09IENMT1NFX09OX0RFU1RST1kpIHsKLSAgICAgIGNsb3NlKCk7CisgICAgICB0cnkgeworICAgICAgICBjbG9zZSgpOworICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiflRGRFRyYW5zcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uOiAnJXMnIiwgZXgud2hhdCgpKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtNjUsMTEgKzY2LDEyIEBACiAgIHZvaWQgc2V0RkQoaW50IGZkKSB7IGZkXyA9IGZkOyB9CiAgIGludCBnZXRGRCgpIHsgcmV0dXJuIGZkXzsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBpbnQgZmRfOwogICBDbG9zZVBvbGljeSBjbG9zZV9wb2xpY3lfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9URkRUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKaW5kZXggMGEwN2ZiYS4uYWZiNDQxMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAKQEAgLTE3LDIzICsxNywyMSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKLSNpbmNsdWRlICJURmlsZVRyYW5zcG9ydC5oIgotI2luY2x1ZGUgIlRUcmFuc3BvcnRVdGlscy5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaD4KIAotI2lmZGVmIEhBVkVfUFRIUkVBRF9ICi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CisKICNpZmRlZiBIQVZFX1NZU19USU1FX0gKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2Vsc2UKICNpbmNsdWRlIDx0aW1lLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAjaWZkZWYgSEFWRV9VTklTVERfSAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmCkBAIC00Myw2ICs0MSw4IEBACiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNlbmRpZgpAQCAtNTEsNjYgKzUxLDQ4IEBACiAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKLSNpZm5kZWYgSEFWRV9DTE9DS19HRVRUSU1FCi0KLS8qKgotICogRmFrZSBjbG9ja19nZXR0aW1lIGZvciBzeXN0ZW1zIGxpa2UgZGFyd2luCi0gKgotICovCi0jZGVmaW5lIENMT0NLX1JFQUxUSU1FIDAKLXN0YXRpYyBpbnQgY2xvY2tfZ2V0dGltZShpbnQgY2xrX2lkIC8qaWdub3JlZCovLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKSB7Ci0gIHN0cnVjdCB0aW1ldmFsIG5vdzsKLQotICBpbnQgcnYgPSBnZXR0aW1lb2ZkYXkoJm5vdywgTlVMTCk7Ci0gIGlmIChydiAhPSAwKSB7Ci0gICAgcmV0dXJuIHJ2OwotICB9Ci0KLSAgdHAtPnR2X3NlYyA9IG5vdy50dl9zZWM7Ci0gIHRwLT50dl9uc2VjID0gbm93LnR2X3VzZWMgKiAxMDAwOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBURmlsZVRyYW5zcG9ydDo6VEZpbGVUcmFuc3BvcnQoc3RyaW5nIHBhdGgsIGJvb2wgcmVhZE9ubHkpCi0gIDogcmVhZFN0YXRlXygpCi0gICwgcmVhZEJ1ZmZfKE5VTEwpCi0gICwgY3VycmVudEV2ZW50XyhOVUxMKQotICAsIHJlYWRCdWZmU2l6ZV8oREVGQVVMVF9SRUFEX0JVRkZfU0laRSkKLSAgLCByZWFkVGltZW91dF8oTk9fVEFJTF9SRUFEX1RJTUVPVVQpCi0gICwgY2h1bmtTaXplXyhERUZBVUxUX0NIVU5LX1NJWkUpCi0gICwgZXZlbnRCdWZmZXJTaXplXyhERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFKQotICAsIGZsdXNoTWF4VXNfKERFRkFVTFRfRkxVU0hfTUFYX1VTKQotICAsIGZsdXNoTWF4Qnl0ZXNfKERFRkFVTFRfRkxVU0hfTUFYX0JZVEVTKQotICAsIG1heEV2ZW50U2l6ZV8oREVGQVVMVF9NQVhfRVZFTlRfU0laRSkKLSAgLCBtYXhDb3JydXB0ZWRFdmVudHNfKERFRkFVTFRfTUFYX0NPUlJVUFRFRF9FVkVOVFMpCi0gICwgZW9mU2xlZXBUaW1lXyhERUZBVUxUX0VPRl9TTEVFUF9USU1FX1VTKQotICAsIGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyhERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTKQotICAsIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKERFRkFVTFRfV1JJVEVSX1RIUkVBRF9TTEVFUF9USU1FX1VTKQotICAsIHdyaXRlclRocmVhZElkXygwKQotICAsIGRlcXVldWVCdWZmZXJfKE5VTEwpCi0gICwgZW5xdWV1ZUJ1ZmZlcl8oTlVMTCkKLSAgLCBub3RGdWxsXygmbXV0ZXhfKQotICAsIG5vdEVtcHR5XygmbXV0ZXhfKQotICAsIGNsb3NpbmdfKGZhbHNlKQotICAsIGZsdXNoZWRfKCZtdXRleF8pCi0gICwgZm9yY2VGbHVzaF8oZmFsc2UpCi0gICwgZmlsZW5hbWVfKHBhdGgpCi0gICwgZmRfKDApCi0gICwgYnVmZmVyQW5kVGhyZWFkSW5pdGlhbGl6ZWRfKGZhbHNlKQotICAsIG9mZnNldF8oMCkKLSAgLCBsYXN0QmFkQ2h1bmtfKDApCi0gICwgbnVtQ29ycnVwdGVkRXZlbnRzSW5DaHVua18oMCkKLSAgLCByZWFkT25seV8ocmVhZE9ubHkpCi17CisgIDogcmVhZFN0YXRlXygpLAorICAgIHJlYWRCdWZmXyhOVUxMKSwKKyAgICBjdXJyZW50RXZlbnRfKE5VTEwpLAorICAgIHJlYWRCdWZmU2l6ZV8oREVGQVVMVF9SRUFEX0JVRkZfU0laRSksCisgICAgcmVhZFRpbWVvdXRfKE5PX1RBSUxfUkVBRF9USU1FT1VUKSwKKyAgICBjaHVua1NpemVfKERFRkFVTFRfQ0hVTktfU0laRSksCisgICAgZXZlbnRCdWZmZXJTaXplXyhERUZBVUxUX0VWRU5UX0JVRkZFUl9TSVpFKSwKKyAgICBmbHVzaE1heFVzXyhERUZBVUxUX0ZMVVNIX01BWF9VUyksCisgICAgZmx1c2hNYXhCeXRlc18oREVGQVVMVF9GTFVTSF9NQVhfQllURVMpLAorICAgIG1heEV2ZW50U2l6ZV8oREVGQVVMVF9NQVhfRVZFTlRfU0laRSksCisgICAgbWF4Q29ycnVwdGVkRXZlbnRzXyhERUZBVUxUX01BWF9DT1JSVVBURURfRVZFTlRTKSwKKyAgICBlb2ZTbGVlcFRpbWVfKERFRkFVTFRfRU9GX1NMRUVQX1RJTUVfVVMpLAorICAgIGNvcnJ1cHRlZEV2ZW50U2xlZXBUaW1lXyhERUZBVUxUX0NPUlJVUFRFRF9TTEVFUF9USU1FX1VTKSwKKyAgICB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyhERUZBVUxUX1dSSVRFUl9USFJFQURfU0xFRVBfVElNRV9VUyksCisgICAgZGVxdWV1ZUJ1ZmZlcl8oTlVMTCksCisgICAgZW5xdWV1ZUJ1ZmZlcl8oTlVMTCksCisgICAgbm90RnVsbF8oJm11dGV4XyksCisgICAgbm90RW1wdHlfKCZtdXRleF8pLAorICAgIGNsb3NpbmdfKGZhbHNlKSwKKyAgICBmbHVzaGVkXygmbXV0ZXhfKSwKKyAgICBmb3JjZUZsdXNoXyhmYWxzZSksCisgICAgZmlsZW5hbWVfKHBhdGgpLAorICAgIGZkXygwKSwKKyAgICBidWZmZXJBbmRUaHJlYWRJbml0aWFsaXplZF8oZmFsc2UpLAorICAgIG9mZnNldF8oMCksCisgICAgbGFzdEJhZENodW5rXygwKSwKKyAgICBudW1Db3JydXB0ZWRFdmVudHNJbkNodW5rXygwKSwKKyAgICByZWFkT25seV8ocmVhZE9ubHkpIHsKKyAgdGhyZWFkRmFjdG9yeV8uc2V0RGV0YWNoZWQoZmFsc2UpOwogICBvcGVuTG9nRmlsZSgpOwogfQogCkBAIC0xMjMsMTIgKzEwNSwxNCBAQAogICAgIC8vIGZsdXNoIGFueSBldmVudHMgaW4gdGhlIHF1ZXVlCiAgICAgZmx1c2goKTsKICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJlcnJvciwgY3VycmVudCBmaWxlICglcykgbm90IGNsb3NlZCIsIGZpbGVuYW1lXy5jX3N0cigpKTsKLSAgICBpZiAoLTEgPT0gOjpjbG9zZShmZF8pKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgIGlmICgtMSA9PSA6OlRIUklGVF9DTE9TRShmZF8pKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiByZXNldE91dHB1dEZpbGUoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJURmlsZVRyYW5zcG9ydDogZXJyb3IgaW4gZmlsZSBjbG9zZSIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGVycm9yIGluIGZpbGUgY2xvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICB9IGVsc2UgewotICAgICAgLy9zdWNjZXNzZnVsbHkgY2xvc2VkIGZkCisgICAgICAvLyBzdWNjZXNzZnVsbHkgY2xvc2VkIGZkCiAgICAgICBmZF8gPSAwOwogICAgIH0KICAgfQpAQCAtMTQxLDI4ICsxMjUsMTggQEAKICAgfQogfQogCi0KIFRGaWxlVHJhbnNwb3J0Ojp+VEZpbGVUcmFuc3BvcnQoKSB7CiAgIC8vIGZsdXNoIHRoZSBidWZmZXIgaWYgYSB3cml0ZXIgdGhyZWFkIGlzIGFjdGl2ZQotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLSAgaWYod3JpdGVyVGhyZWFkSWRfLmdldCgpKSB7Ci0jZWxzZQotICBpZiAod3JpdGVyVGhyZWFkSWRfID4gMCkgewotI2VuZGlmCisgIGlmICh3cml0ZXJUaHJlYWRfLmdldCgpKSB7CiAgICAgLy8gc2V0IHN0YXRlIHRvIGNsb3NpbmcKICAgICBjbG9zaW5nXyA9IHRydWU7CiAKICAgICAvLyB3YWtlIHVwIHRoZSB3cml0ZXIgdGhyZWFkCiAgICAgLy8gU2luY2UgY2xvc2luZ18gaXMgdHJ1ZSwgaXQgd2lsbCBhdHRlbXB0IHRvIGZsdXNoIGFsbCBkYXRhLCB0aGVuIGV4aXQuCi0Jbm90RW1wdHlfLm5vdGlmeSgpOworICAgIG5vdEVtcHR5Xy5ub3RpZnkoKTsKIAotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLSAgICB3cml0ZXJUaHJlYWRJZF8tPmpvaW4oKTsKLQl3cml0ZXJUaHJlYWRJZF8ucmVzZXQoKTsKLSNlbHNlCi0gICAgcHRocmVhZF9qb2luKHdyaXRlclRocmVhZElkXywgTlVMTCk7Ci0gICAgd3JpdGVyVGhyZWFkSWRfID0gMDsKLSNlbmRpZgorICAgIHdyaXRlclRocmVhZF8tPmpvaW4oKTsKKyAgICB3cml0ZXJUaHJlYWRfLnJlc2V0KCk7CiAgIH0KIAogICBpZiAoZGVxdWV1ZUJ1ZmZlcl8pIHsKQEAgLTE4NywxMCArMTYxLDEwIEBACiAKICAgLy8gY2xvc2UgbG9nZmlsZQogICBpZiAoZmRfID4gMCkgewotICAgIGlmKC0xID09IDo6Y2xvc2UoZmRfKSkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IH5URmlsZVRyYW5zcG9ydCgpIDo6Y2xvc2UoKSAiLCBlcnJubyk7CisgICAgaWYgKC0xID09IDo6VEhSSUZUX0NMT1NFKGZkXykpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB+VEZpbGVUcmFuc3BvcnQoKSA6OmNsb3NlKCkgIiwgVEhSSUZUX0VSUk5PKTsKICAgICB9IGVsc2UgewotICAgICAgLy9zdWNjZXNzZnVsbHkgY2xvc2VkIGZkCisgICAgICAvLyBzdWNjZXNzZnVsbHkgY2xvc2VkIGZkCiAgICAgICBmZF8gPSAwOwogICAgIH0KICAgfQpAQCAtMjAyLDE4ICsxNzYsMTEgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLSAgaWYoIXdyaXRlclRocmVhZElkXy5nZXQoKSkgewotICAgIHdyaXRlclRocmVhZElkXyA9IHN0ZDo6YXV0b19wdHI8Ym9vc3Q6OnRocmVhZD4obmV3IGJvb3N0Ojp0aHJlYWQoYm9vc3Q6OmJpbmQoc3RhcnRXcml0ZXJUaHJlYWQsICh2b2lkICopdGhpcykpKTsKKyAgaWYgKCF3cml0ZXJUaHJlYWRfLmdldCgpKSB7CisgICAgd3JpdGVyVGhyZWFkXyA9IHRocmVhZEZhY3RvcnlfLm5ld1RocmVhZCgKKyAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKHN0YXJ0V3JpdGVyVGhyZWFkLCB0aGlzKSk7CisgICAgd3JpdGVyVGhyZWFkXy0+c3RhcnQoKTsKICAgfQotI2Vsc2UKLSAgaWYgKHdyaXRlclRocmVhZElkXyA9PSAwKSB7Ci0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ3cml0ZXJUaHJlYWRJZF8sIE5VTEwsIHN0YXJ0V3JpdGVyVGhyZWFkLCAodm9pZCAqKXRoaXMpICE9IDApIHsKLSAgICAgIFRfRVJST1IoIiVzIiwgIkNvdWxkIG5vdCBjcmVhdGUgd3JpdGVyIHRocmVhZCIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotI2VuZGlmCiAKICAgZGVxdWV1ZUJ1ZmZlcl8gPSBuZXcgVEZpbGVUcmFuc3BvcnRCdWZmZXIoZXZlbnRCdWZmZXJTaXplXyk7CiAgIGVucXVldWVCdWZmZXJfID0gbmV3IFRGaWxlVHJhbnNwb3J0QnVmZmVyKGV2ZW50QnVmZmVyU2l6ZV8pOwpAQCAtMjMwLDYgKzE5NywxMiBAQAogICBlbnF1ZXVlRXZlbnQoYnVmLCBsZW4pOwogfQogCit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdHJ1Y3QgdW5pcXVlRGVsZXRlcgoreworICB2b2lkIG9wZXJhdG9yKCkoX1QgKnB0cikgY29uc3QgeyBkZWxldGUgcHRyOyB9Cit9OworCiB2b2lkIFRGaWxlVHJhbnNwb3J0OjplbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbikgewogICAvLyBjYW4ndCBlbnF1ZXVlIG1vcmUgZXZlbnRzIGlmIGZpbGUgaXMgZ29pbmcgdG8gY2xvc2UKICAgaWYgKGNsb3NpbmdfKSB7CkBAIC0yMzcsNyArMjEwLDcgQEAKICAgfQogCiAgIC8vIG1ha2Ugc3VyZSB0aGF0IGV2ZW50IHNpemUgaXMgdmFsaWQKLSAgaWYgKCAobWF4RXZlbnRTaXplXyA+IDApICYmIChldmVudExlbiA+IG1heEV2ZW50U2l6ZV8pICkgeworICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAoZXZlbnRMZW4gPiBtYXhFdmVudFNpemVfKSkgewogICAgIFRfRVJST1IoIm1zZyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZTogJXUgPiAldVxuIiwgZXZlbnRMZW4sIG1heEV2ZW50U2l6ZV8pOwogICAgIHJldHVybjsKICAgfQpAQCAtMjQ3LDEyICsyMjAsOSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIGV2ZW50SW5mbyogdG9FbnF1ZXVlID0gbmV3IGV2ZW50SW5mbygpOwotICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSAodWludDhfdCAqKXN0ZDo6bWFsbG9jKChzaXplb2YodWludDhfdCkgKiBldmVudExlbikgKyA0KTsKLSAgaWYgKHRvRW5xdWV1ZS0+ZXZlbnRCdWZmXyA9PSBOVUxMKSB7Ci0gICAgZGVsZXRlIHRvRW5xdWV1ZTsKLSAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwotICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxldmVudEluZm8sIHVuaXF1ZURlbGV0ZXI8ZXZlbnRJbmZvPiA+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOworICB0b0VucXVldWUtPmV2ZW50QnVmZl8gPSBuZXcgdWludDhfdFsoc2l6ZW9mKHVpbnQ4X3QpICogZXZlbnRMZW4pICsgNF07CisKICAgLy8gZmlyc3QgNCBieXRlcyBpcyB0aGUgZXZlbnQgbGVuZ3RoCiAgIG1lbWNweSh0b0VucXVldWUtPmV2ZW50QnVmZl8sICh2b2lkKikoJmV2ZW50TGVuKSwgNCk7CiAgIC8vIGFjdHVhbCBldmVudCBjb250ZW50cwpAQCAtMjY1LDE0ICsyMzUsMTMgQEAKICAgLy8gbWFrZSBzdXJlIHRoYXQgZW5xdWV1ZSBidWZmZXIgaXMgaW5pdGlhbGl6ZWQgYW5kIHdyaXRlciB0aHJlYWQgaXMgcnVubmluZwogICBpZiAoIWJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewogICAgIGlmICghaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCkpIHsKLSAgICAgIGRlbGV0ZSB0b0VucXVldWU7CiAgICAgICByZXR1cm47CiAgICAgfQogICB9CiAKICAgLy8gQ2FuJ3QgZW5xdWV1ZSB3aGlsZSBidWZmZXIgaXMgZnVsbAogICB3aGlsZSAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRnVsbCgpKSB7Ci0JICBub3RGdWxsXy53YWl0KCk7CisgICAgbm90RnVsbF8ud2FpdCgpOwogICB9CiAKICAgLy8gV2Ugc2hvdWxkbid0IGJlIHRyeWluZyB0byBlbnF1ZXVlIG5ldyBkYXRhIHdoaWxlIGEgZm9yY2VkIGZsdXNoIGlzCkBAIC0yODEsOCArMjUwLDkgQEAKICAgYXNzZXJ0KCFmb3JjZUZsdXNoXyk7CiAKICAgLy8gYWRkIHRvIHRoZSBidWZmZXIKLSAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQodG9FbnF1ZXVlKSkgewotICAgIGRlbGV0ZSB0b0VucXVldWU7CisgIGV2ZW50SW5mbyogcEV2ZW50ID0gdG9FbnF1ZXVlLnJlbGVhc2UoKTsKKyAgaWYgKCFlbnF1ZXVlQnVmZmVyXy0+YWRkRXZlbnQocEV2ZW50KSkgeworICAgIGRlbGV0ZSBwRXZlbnQ7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTI5NCw3ICsyNjQsNyBAQAogICAvLyBpdCBpcyBwcm9iYWJseSBhIG5vbi1mYWN0b3IgZm9yIHRoZSB0aW1lIGJlaW5nCiB9CiAKLWJvb2wgVEZpbGVUcmFuc3BvcnQ6OnN3YXBFdmVudEJ1ZmZlcnMoc3RydWN0IHRpbWVzcGVjKiBkZWFkbGluZSkgeworYm9vbCBURmlsZVRyYW5zcG9ydDo6c3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXZhbCogZGVhZGxpbmUpIHsKICAgYm9vbCBzd2FwOwogICBHdWFyZCBnKG11dGV4Xyk7CiAKQEAgLTMxOCwyOSArMjg4LDI3IEBACiAgIH0KIAogICBpZiAoc3dhcCkgewotICAgIFRGaWxlVHJhbnNwb3J0QnVmZmVyICp0ZW1wID0gZW5xdWV1ZUJ1ZmZlcl87CisgICAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIHRlbXAgPSBlbnF1ZXVlQnVmZmVyXzsKICAgICBlbnF1ZXVlQnVmZmVyXyA9IGRlcXVldWVCdWZmZXJfOwogICAgIGRlcXVldWVCdWZmZXJfID0gdGVtcDsKICAgfQogCi0KICAgaWYgKHN3YXApIHsKLQkgIG5vdEZ1bGxfLm5vdGlmeSgpOworICAgIG5vdEZ1bGxfLm5vdGlmeSgpOwogICB9CiAKICAgcmV0dXJuIHN3YXA7CiB9CiAKLQogdm9pZCBURmlsZVRyYW5zcG9ydDo6d3JpdGVyVGhyZWFkKCkgewogICBib29sIGhhc0lPRXJyb3IgPSBmYWxzZTsKIAogICAvLyBvcGVuIGZpbGUgaWYgaXQgaXMgbm90IG9wZW4KLSAgaWYoIWZkXykgeworICBpZiAoIWZkXykgewogICAgIHRyeSB7CiAgICAgICBvcGVuTG9nRmlsZSgpOwogICAgIH0gY2F0Y2ggKC4uLikgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POwogICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIG9wZW5Mb2dGaWxlKCkgIiwgZXJybm9fY29weSk7CiAgICAgICBmZF8gPSAwOwogICAgICAgaGFzSU9FcnJvciA9IHRydWU7CkBAIC0zNTMsMjEgKzMyMSwyMiBAQAogICAgICAgc2Vla1RvRW5kKCk7CiAgICAgICAvLyB0aHJvdyBhd2F5IGFueSBwYXJ0aWFsIGV2ZW50cwogICAgICAgb2Zmc2V0XyArPSByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl87Ci0jaWZuZGVmIF9XSU4zMgotICAgICAgZnRydW5jYXRlKGZkXywgb2Zmc2V0Xyk7Ci0jZWxzZQotICAgICAgX2Noc2l6ZV9zKGZkXywgb2Zmc2V0Xyk7Ci0jZW5kaWYKLSAgICAgIHJlYWRTdGF0ZV8ucmVzZXRBbGxWYWx1ZXMoKTsKKyAgICAgIGlmICgwID09IFRIUklGVF9GVFJVTkNBVEUoZmRfLCBvZmZzZXRfKSkgeworICAgICAgICByZWFkU3RhdGVfLnJlc2V0QWxsVmFsdWVzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIHRydW5jYXRlICIsIGVycm5vX2NvcHkpOworICAgICAgICBoYXNJT0Vycm9yID0gdHJ1ZTsKKyAgICAgIH0KICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBpbml0aWFsaXphdGlvbiAiLCBlcnJub19jb3B5KTsKICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwogICAgIH0KICAgfQogCiAgIC8vIEZpZ3VyZSBvdXQgdGhlIG5leHQgdGltZSBieSB3aGljaCBhIGZsdXNoIG11c3QgdGFrZSBwbGFjZQotICBzdHJ1Y3QgdGltZXNwZWMgdHNfbmV4dF9mbHVzaDsKKyAgc3RydWN0IHRpbWV2YWwgdHNfbmV4dF9mbHVzaDsKICAgZ2V0TmV4dEZsdXNoVGltZSgmdHNfbmV4dF9mbHVzaCk7CiAgIHVpbnQzMl90IHVuZmx1c2hlZCA9IDA7CiAKQEAgLTM3NSw1MyArMzQ0LDQ0IEBACiAgICAgLy8gdGhpcyB3aWxsIG9ubHkgYmUgdHJ1ZSB3aGVuIHRoZSBkZXN0cnVjdG9yIGlzIGJlaW5nIGludm9rZWQKICAgICBpZiAoY2xvc2luZ18pIHsKICAgICAgIGlmIChoYXNJT0Vycm9yKSB7Ci0jaWZuZGVmIFVTRV9CT09TVF9USFJFQUQKLQkJICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0jZWxzZQotCQkgIHJldHVybjsKLSNlbmRpZgorICAgICAgICByZXR1cm47CiAgICAgICB9CiAKICAgICAgIC8vIFRyeSB0byBlbXB0eSBidWZmZXJzIGJlZm9yZSBleGl0CiAgICAgICBpZiAoZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSAmJiBkZXF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKSB7Ci0jaWZuZGVmIF9XSU4zMgotICAgICAgICBmc3luYyhmZF8pOwotI2VuZGlmCi0gICAgICAgIGlmICgtMSA9PSA6OmNsb3NlKGZkXykpIHsKLSAgICAgICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgICAgICA6OlRIUklGVF9GU1lOQyhmZF8pOworICAgICAgICBpZiAoLTEgPT0gOjpUSFJJRlRfQ0xPU0UoZmRfKSkgeworICAgICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POwogICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSA6OmNsb3NlKCkgIiwgZXJybm9fY29weSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy9mZCBzdWNjZXNzZnVsbHkgY2xvc2VkCisgICAgICAgICAgLy8gZmQgc3VjY2Vzc2Z1bGx5IGNsb3NlZAogICAgICAgICAgIGZkXyA9IDA7CiAgICAgICAgIH0KLSNpZm5kZWYgVVNFX0JPT1NUX1RIUkVBRAotICAgICAgICBwdGhyZWFkX2V4aXQoTlVMTCk7Ci0jZWxzZQogICAgICAgICByZXR1cm47Ci0jZW5kaWYKLQkgIH0KKyAgICAgIH0KICAgICB9CiAKICAgICBpZiAoc3dhcEV2ZW50QnVmZmVycygmdHNfbmV4dF9mbHVzaCkpIHsKICAgICAgIGV2ZW50SW5mbyogb3V0RXZlbnQ7CiAgICAgICB3aGlsZSAoTlVMTCAhPSAob3V0RXZlbnQgPSBkZXF1ZXVlQnVmZmVyXy0+Z2V0TmV4dCgpKSkgewotICAgICAgICAvLyBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzay4gSWYgdGhlcmUgaXMgYW55IElPIGVycm9yLCBmb3IgaW5zdGFuY2UsCi0gICAgICAgIC8vIHRoZSBvdXRwdXQgZmlsZSBpcyB1bm1vdW50ZWQgb3IgZGVsZXRlZCwgdGhlbiB0aGlzIGV2ZW50IGlzIGRyb3BwZWQuIEhvd2V2ZXIsIHRoZSB3cml0ZXIgdGhyZWFkCi0gICAgICAgIC8vIHdpbGw6ICgxKSBzbGVlcCBmb3IgYSBzaG9ydCB3aGlsZTsgKDIpIHRyeSB0byByZW9wZW4gdGhlIGZpbGU7ICgzKSBpZiBzdWNjZXNzZnVsIHRoZW4gc3RhcnQgd3JpdGluZworICAgICAgICAvLyBSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgYnVmZmVyIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzay4gSWYgdGhlcmUgaXMgYW55IElPIGVycm9yLCBmb3IKKyAgICAgICAgLy8gaW5zdGFuY2UsCisgICAgICAgIC8vIHRoZSBvdXRwdXQgZmlsZSBpcyB1bm1vdW50ZWQgb3IgZGVsZXRlZCwgdGhlbiB0aGlzIGV2ZW50IGlzIGRyb3BwZWQuIEhvd2V2ZXIsIHRoZSB3cml0ZXIKKyAgICAgICAgLy8gdGhyZWFkCisgICAgICAgIC8vIHdpbGw6ICgxKSBzbGVlcCBmb3IgYSBzaG9ydCB3aGlsZTsgKDIpIHRyeSB0byByZW9wZW4gdGhlIGZpbGU7ICgzKSBpZiBzdWNjZXNzZnVsIHRoZW4KKyAgICAgICAgLy8gc3RhcnQgd3JpdGluZwogICAgICAgICAvLyBmcm9tIHRoZSBlbmQuCiAKICAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKLSAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogd3JpdGVyIHRocmVhZCBnb2luZyB0byBzbGVlcCBmb3IgJWQgbWljcm9zZWNvbmRzIGR1ZSB0byBJTyBlcnJvcnMiLCB3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7Ci0gICAgICAgICAgdXNsZWVwKHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKKyAgICAgICAgICBUX0VSUk9SKAorICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICV1IG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV8pOworICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKICAgICAgICAgICBpZiAoY2xvc2luZ18pIHsKLSNpZm5kZWYgVVNFX0JPT1NUX1RIUkVBRAotICAgICAgICAgICAgcHRocmVhZF9leGl0KE5VTEwpOwotI2Vsc2UKICAgICAgICAgICAgIHJldHVybjsKLSNlbmRpZgogICAgICAgICAgIH0KICAgICAgICAgICBpZiAoIWZkXykgewotICAgICAgICAgICAgOjpjbG9zZShmZF8pOworICAgICAgICAgICAgOjpUSFJJRlRfQ0xPU0UoZmRfKTsKICAgICAgICAgICAgIGZkXyA9IDA7CiAgICAgICAgICAgfQogICAgICAgICAgIHRyeSB7CkBAIC00MjksMTUgKzM4OSwyMCBAQAogICAgICAgICAgICAgc2Vla1RvRW5kKCk7CiAgICAgICAgICAgICB1bmZsdXNoZWQgPSAwOwogICAgICAgICAgICAgaGFzSU9FcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgVF9MT0dfT1BFUigiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlICVzIHJlb3BlbmVkIGJ5IHdyaXRlciB0aHJlYWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwgZmlsZW5hbWVfLmNfc3RyKCkpOworICAgICAgICAgICAgVF9MT0dfT1BFUigKKyAgICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IGxvZyBmaWxlICVzIHJlb3BlbmVkIGJ5IHdyaXRlciB0aHJlYWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IiwKKyAgICAgICAgICAgICAgICBmaWxlbmFtZV8uY19zdHIoKSk7CiAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7Ci0gICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogdW5hYmxlIHRvIHJlb3BlbiBsb2cgZmlsZSAlcyBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLCBmaWxlbmFtZV8uY19zdHIoKSk7CisgICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogdW5hYmxlIHRvIHJlb3BlbiBsb2cgZmlsZSAlcyBkdXJpbmcgZXJyb3IgcmVjb3ZlcnkiLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZV8uY19zdHIoKSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gc2FuaXR5IGNoZWNrIG9uIGV2ZW50CiAgICAgICAgIGlmICgobWF4RXZlbnRTaXplXyA+IDApICYmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IG1heEV2ZW50U2l6ZV8pKSB7Ci0gICAgICAgICAgVF9FUlJPUigibXNnIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplOiAldSA+ICV1XG4iLCBvdXRFdmVudC0+ZXZlbnRTaXplXywgbWF4RXZlbnRTaXplXyk7CisgICAgICAgICAgVF9FUlJPUigibXNnIHNpemUgaXMgZ3JlYXRlciB0aGFuIG1heCBldmVudCBzaXplOiAldSA+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgb3V0RXZlbnQtPmV2ZW50U2l6ZV8sCisgICAgICAgICAgICAgICAgICBtYXhFdmVudFNpemVfKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDUsMjUgKzQxMCwyOCBAQAogICAgICAgICBpZiAoKG91dEV2ZW50LT5ldmVudFNpemVfID4gMCkgJiYgKGNodW5rU2l6ZV8gIT0gMCkpIHsKICAgICAgICAgICAvLyBldmVudCBzaXplIG11c3QgYmUgbGVzcyB0aGFuIGNodW5rIHNpemUKICAgICAgICAgICBpZiAob3V0RXZlbnQtPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7Ci0gICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogZXZlbnQgc2l6ZSgldSkgPiBjaHVuayBzaXplKCV1KTogc2tpcHBpbmcgZXZlbnQiLCBvdXRFdmVudC0+ZXZlbnRTaXplXywgY2h1bmtTaXplXyk7CisgICAgICAgICAgICBUX0VSUk9SKCJURmlsZVRyYW5zcG9ydDogZXZlbnQgc2l6ZSgldSkgPiBjaHVuayBzaXplKCV1KTogc2tpcHBpbmcgZXZlbnQiLAorICAgICAgICAgICAgICAgICAgICBvdXRFdmVudC0+ZXZlbnRTaXplXywKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplXyk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAKLSAgICAgICAgICBpbnQ2NF90IGNodW5rMSA9IG9mZnNldF8vY2h1bmtTaXplXzsKLSAgICAgICAgICBpbnQ2NF90IGNodW5rMiA9IChvZmZzZXRfICsgb3V0RXZlbnQtPmV2ZW50U2l6ZV8gLSAxKS9jaHVua1NpemVfOworICAgICAgICAgIGludDY0X3QgY2h1bmsxID0gb2Zmc2V0XyAvIGNodW5rU2l6ZV87CisgICAgICAgICAgaW50NjRfdCBjaHVuazIgPSAob2Zmc2V0XyArIG91dEV2ZW50LT5ldmVudFNpemVfIC0gMSkgLyBjaHVua1NpemVfOwogCiAgICAgICAgICAgLy8gaWYgYWRkaW5nIHRoaXMgZXZlbnQgd2lsbCBjcm9zcyBhIGNodW5rIGJvdW5kYXJ5LCBwYWQgdGhlIGNodW5rIHdpdGggemVyb3MKICAgICAgICAgICBpZiAoY2h1bmsxICE9IGNodW5rMikgewogICAgICAgICAgICAgLy8gcmVmZXRjaCB0aGUgb2Zmc2V0IHRvIGtlZXAgaW4gc3luYwotICAgICAgICAgICAgb2Zmc2V0XyA9IGxzZWVrKGZkXywgMCwgU0VFS19DVVIpOworICAgICAgICAgICAgb2Zmc2V0XyA9IFRIUklGVF9MU0VFSyhmZF8sIDAsIFNFRUtfQ1VSKTsKICAgICAgICAgICAgIGludDMyX3QgcGFkZGluZyA9IChpbnQzMl90KSgob2Zmc2V0XyAvIGNodW5rU2l6ZV8gKyAxKSAqIGNodW5rU2l6ZV8gLSBvZmZzZXRfKTsKIAogICAgICAgICAgICAgdWludDhfdCogemVyb3MgPSBuZXcgdWludDhfdFtwYWRkaW5nXTsKICAgICAgICAgICAgIG1lbXNldCh6ZXJvcywgJ1wwJywgcGFkZGluZyk7CiAgICAgICAgICAgICBib29zdDo6c2NvcGVkX2FycmF5PHVpbnQ4X3Q+IGFycmF5KHplcm9zKTsKICAgICAgICAgICAgIGlmICgtMSA9PSA6OndyaXRlKGZkXywgemVyb3MsIHBhZGRpbmcpKSB7Ci0gICAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXJUaHJlYWQoKSBlcnJvciB3aGlsZSBwYWRkaW5nIHplcm9zICIsIGVycm5vX2NvcHkpOworICAgICAgICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9FUlJOTzsKKyAgICAgICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlclRocmVhZCgpIGVycm9yIHdoaWxlIHBhZGRpbmcgemVyb3MgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICAgICAgICAgICAgaGFzSU9FcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNDc0LDggKzQ0Miw4IEBACiAKICAgICAgICAgLy8gd3JpdGUgdGhlIGRlcXVldWVkIGV2ZW50IHRvIHRoZSBmaWxlCiAgICAgICAgIGlmIChvdXRFdmVudC0+ZXZlbnRTaXplXyA+IDApIHsKLSAgICAgICAgICBpZiAoLTEgPT0gOjp3cml0ZShmZF8sIG91dEV2ZW50LT5ldmVudEJ1ZmZfLCBvdXRFdmVudC0+ZXZlbnRTaXplXykpIHsKLSAgICAgICAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgICAgICAgaWYgKC0xID09IDo6VEhSSUZUX1dSSVRFKGZkXywgb3V0RXZlbnQtPmV2ZW50QnVmZl8sIG91dEV2ZW50LT5ldmVudFNpemVfKSkgeworICAgICAgICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CiAgICAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgd3JpdGluZyBldmVudCAiLCBlcnJub19jb3B5KTsKICAgICAgICAgICAgIGhhc0lPRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgY29udGludWU7CkBAIC00OTgsMzUgKzQ2NiwzNSBAQAogICAgIC8vIHRpbWUsIGl0IGNvdWxkIGhhdmUgY2hhbmdlZCBzdGF0ZSBpbiBiZXR3ZWVuLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiB1cwogICAgIC8vIG1ha2luZyBpbmNvbnNpc3RlbnQgZGVjaXNpb25zLgogICAgIGJvb2wgZm9yY2VkX2ZsdXNoID0gZmFsc2U7Ci0JewotICAgIEd1YXJkIGcobXV0ZXhfKTsKLSAgICBpZiAoZm9yY2VGbHVzaF8pIHsKLSAgICAgIGlmICghZW5xdWV1ZUJ1ZmZlcl8tPmlzRW1wdHkoKSkgewotICAgICAgICAvLyBJZiBmb3JjZUZsdXNoXyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGFsbCBhdmFpbGFibGUgZGF0YS4KLSAgICAgICAgLy8gSWYgZW5xdWV1ZUJ1ZmZlcl8gaXMgbm90IGVtcHR5LCBnbyBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgbG9vcCB0bwotICAgICAgICAvLyB3cml0ZSBpdCBvdXQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIGtub3cgdGhlIG1haW4gdGhyZWFkIGlzIHdhaXRpbmcgb24gZm9yY2VGbHVzaF8gdG8gYmUgY2xlYXJlZCwKLSAgICAgICAgLy8gc28gbm8gbmV3IGV2ZW50cyB3aWxsIGJlIGFkZGVkIHRvIGVucXVldWVCdWZmZXJfIHVudGlsIHdlIGNsZWFyCi0gICAgICAgIC8vIGZvcmNlRmx1c2hfLiAgVGhlcmVmb3JlIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wIGVucXVldWVCdWZmZXJfCi0gICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgZW1wdHkuICAoSS5lLiwgd2UncmUgZ3VhcmFudGVlZCB0byBtYWtlIHByb2dyZXNzCi0gICAgICAgIC8vIGFuZCBjbGVhciBmb3JjZUZsdXNoXyB0aGUgbmV4dCB0aW1lIGFyb3VuZCB0aGUgbG9vcC4pCi0gICAgICAgIGNvbnRpbnVlOworICAgIHsKKyAgICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICAgIGlmIChmb3JjZUZsdXNoXykgeworICAgICAgICBpZiAoIWVucXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAvLyBJZiBmb3JjZUZsdXNoXyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGFsbCBhdmFpbGFibGUgZGF0YS4KKyAgICAgICAgICAvLyBJZiBlbnF1ZXVlQnVmZmVyXyBpcyBub3QgZW1wdHksIGdvIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsb29wIHRvCisgICAgICAgICAgLy8gd3JpdGUgaXQgb3V0LgorICAgICAgICAgIC8vCisgICAgICAgICAgLy8gV2Uga25vdyB0aGUgbWFpbiB0aHJlYWQgaXMgd2FpdGluZyBvbiBmb3JjZUZsdXNoXyB0byBiZSBjbGVhcmVkLAorICAgICAgICAgIC8vIHNvIG5vIG5ldyBldmVudHMgd2lsbCBiZSBhZGRlZCB0byBlbnF1ZXVlQnVmZmVyXyB1bnRpbCB3ZSBjbGVhcgorICAgICAgICAgIC8vIGZvcmNlRmx1c2hfLiAgVGhlcmVmb3JlIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wIGVucXVldWVCdWZmZXJfCisgICAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBiZSBlbXB0eS4gIChJLmUuLCB3ZSdyZSBndWFyYW50ZWVkIHRvIG1ha2UgcHJvZ3Jlc3MKKyAgICAgICAgICAvLyBhbmQgY2xlYXIgZm9yY2VGbHVzaF8gdGhlIG5leHQgdGltZSBhcm91bmQgdGhlIGxvb3AuKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvcmNlZF9mbHVzaCA9IHRydWU7CiAgICAgICB9Ci0gICAgICBmb3JjZWRfZmx1c2ggPSB0cnVlOwotCX0KLQl9CisgICAgfQogCiAgICAgLy8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcGVyZm9ybSBhbiBmc3luYwogICAgIGJvb2wgZmx1c2ggPSBmYWxzZTsKICAgICBpZiAoZm9yY2VkX2ZsdXNoIHx8IHVuZmx1c2hlZCA+IGZsdXNoTWF4Qnl0ZXNfKSB7CiAgICAgICBmbHVzaCA9IHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgIHN0cnVjdCB0aW1lc3BlYyBjdXJyZW50X3RpbWU7Ci0gICAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VycmVudF90aW1lKTsKLSAgICAgIGlmIChjdXJyZW50X3RpbWUudHZfc2VjID4gdHNfbmV4dF9mbHVzaC50dl9zZWMgfHwKLSAgICAgICAgICAoY3VycmVudF90aW1lLnR2X3NlYyA9PSB0c19uZXh0X2ZsdXNoLnR2X3NlYyAmJgotICAgICAgICAgICBjdXJyZW50X3RpbWUudHZfbnNlYyA+IHRzX25leHRfZmx1c2gudHZfbnNlYykpIHsKKyAgICAgIHN0cnVjdCB0aW1ldmFsIGN1cnJlbnRfdGltZTsKKyAgICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmN1cnJlbnRfdGltZSwgTlVMTCk7CisgICAgICBpZiAoY3VycmVudF90aW1lLnR2X3NlYyA+IHRzX25leHRfZmx1c2gudHZfc2VjCisgICAgICAgICAgfHwgKGN1cnJlbnRfdGltZS50dl9zZWMgPT0gdHNfbmV4dF9mbHVzaC50dl9zZWMKKyAgICAgICAgICAgICAgJiYgY3VycmVudF90aW1lLnR2X3VzZWMgPiB0c19uZXh0X2ZsdXNoLnR2X3VzZWMpKSB7CiAgICAgICAgIGlmICh1bmZsdXNoZWQgPiAwKSB7CiAgICAgICAgICAgZmx1c2ggPSB0cnVlOwogICAgICAgICB9IGVsc2UgewpAQCAtNTM5LDkgKzUwNyw3IEBACiAKICAgICBpZiAoZmx1c2gpIHsKICAgICAgIC8vIHN5bmMgKGZvcmNlIGZsdXNoKSBmaWxlIHRvIGRpc2sKLSNpZm5kZWYgX1dJTjMyCi0gICAgICBmc3luYyhmZF8pOwotI2VuZGlmCisgICAgICBUSFJJRlRfRlNZTkMoZmRfKTsKICAgICAgIHVuZmx1c2hlZCA9IDA7CiAgICAgICBnZXROZXh0Rmx1c2hUaW1lKCZ0c19uZXh0X2ZsdXNoKTsKIApAQCAtNTUxLDcgKzUxNyw3IEBACiAgICAgICAgIGZvcmNlRmx1c2hfID0gZmFsc2U7CiAgICAgICAgIGFzc2VydChlbnF1ZXVlQnVmZmVyXy0+aXNFbXB0eSgpKTsKICAgICAgICAgYXNzZXJ0KGRlcXVldWVCdWZmZXJfLT5pc0VtcHR5KCkpOwotCQlmbHVzaGVkXy5ub3RpZnlBbGwoKTsKKyAgICAgICAgZmx1c2hlZF8ubm90aWZ5QWxsKCk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC01NTksMTUgKzUyNSw5IEBACiAKIHZvaWQgVEZpbGVUcmFuc3BvcnQ6OmZsdXNoKCkgewogICAvLyBmaWxlIG11c3QgYmUgb3BlbiBmb3Igd3JpdGluZyBmb3IgYW55IGZsdXNoaW5nIHRvIHRha2UgcGxhY2UKLSNpZmRlZiBVU0VfQk9PU1RfVEhSRUFECi0gIGlmICghd3JpdGVyVGhyZWFkSWRfLmdldCgpKSB7CisgIGlmICghd3JpdGVyVGhyZWFkXy5nZXQoKSkgewogICAgIHJldHVybjsKICAgfQotI2Vsc2UKLSAgaWYgKHdyaXRlclRocmVhZElkXyA8PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0jZW5kaWYKICAgLy8gd2FpdCBmb3IgZmx1c2ggdG8gdGFrZSBwbGFjZQogICBHdWFyZCBnKG11dGV4Xyk7CiAKQEAgLTU4MSwxMyArNTQxLDEyIEBACiAgIH0KIH0KIAotCiB1aW50MzJfdCBURmlsZVRyYW5zcG9ydDo6cmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICB1aW50MzJfdCBoYXZlID0gMDsKICAgdWludDMyX3QgZ2V0ID0gMDsKIAogICB3aGlsZSAoaGF2ZSA8IGxlbikgewotICAgIGdldCA9IHJlYWQoYnVmK2hhdmUsIGxlbi1oYXZlKTsKKyAgICBnZXQgPSByZWFkKGJ1ZiArIGhhdmUsIGxlbiAtIGhhdmUpOwogICAgIGlmIChnZXQgPD0gMCkgewogICAgICAgdGhyb3cgVEVPRkV4Y2VwdGlvbigpOwogICAgIH0KQEAgLTYzMCwxMSArNTg5LDkgQEAKICAgaWYgKHJlbWFpbmluZyA8PSAoaW50MzJfdClsZW4pIHsKICAgICAvLyBjb3B5IG92ZXIgYW55dGhpbmcgdGhhdHMgcmVtYWluaW5nCiAgICAgaWYgKHJlbWFpbmluZyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsCi0gICAgICAgICAgICAgY3VycmVudEV2ZW50Xy0+ZXZlbnRCdWZmXyArIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZlBvc18sCi0gICAgICAgICAgICAgcmVtYWluaW5nKTsKKyAgICAgIG1lbWNweShidWYsIGN1cnJlbnRFdmVudF8tPmV2ZW50QnVmZl8gKyBjdXJyZW50RXZlbnRfLT5ldmVudEJ1ZmZQb3NfLCByZW1haW5pbmcpOwogICAgIH0KLSAgICBkZWxldGUoY3VycmVudEV2ZW50Xyk7CisgICAgZGVsZXRlIChjdXJyZW50RXZlbnRfKTsKICAgICBjdXJyZW50RXZlbnRfID0gTlVMTDsKICAgICByZXR1cm4gcmVtYWluaW5nOwogICB9CkBAIC02NTgsNyArNjE1LDcgQEAKICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJQdHJfID09IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgewogICAgICAgLy8gYWR2YW5jZSB0aGUgb2Zmc2V0IHBvaW50ZXIKICAgICAgIG9mZnNldF8gKz0gcmVhZFN0YXRlXy5idWZmZXJMZW5fOwotICAgICAgcmVhZFN0YXRlXy5idWZmZXJMZW5fID0gOjpyZWFkKGZkXywgcmVhZEJ1ZmZfLCByZWFkQnVmZlNpemVfKTsKKyAgICAgIHJlYWRTdGF0ZV8uYnVmZmVyTGVuXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pig6OlRIUklGVF9SRUFEKGZkXywgcmVhZEJ1ZmZfLCByZWFkQnVmZlNpemVfKSk7CiAgICAgICAvLyAgICAgICBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fKSB7CiAgICAgICAvLyAgICAgICAgIFRfREVCVUdfTCgxLCAiQW1vdW50IHJlYWQ6ICV1IChvZmZzZXQ6ICVsdSkiLCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8sIG9mZnNldF8pOwogICAgICAgLy8gICAgICAgfQpAQCAtNjcwLDEwICs2MjcsMTAgQEAKICAgICAgICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOwogICAgICAgICBHbG9iYWxPdXRwdXQoIlRGaWxlVHJhbnNwb3J0OiBlcnJvciB3aGlsZSByZWFkaW5nIGZyb20gZmlsZSIpOwogICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJURmlsZVRyYW5zcG9ydDogZXJyb3Igd2hpbGUgcmVhZGluZyBmcm9tIGZpbGUiKTsKLSAgICAgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5idWZmZXJMZW5fID09IDApIHsgIC8vIEVPRgorICAgICAgfSBlbHNlIGlmIChyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gPT0gMCkgeyAvLyBFT0YKICAgICAgICAgLy8gd2FpdCBpbmRlZmluaXRlbHkgaWYgdGhlcmUgaXMgbm8gdGltZW91dAogICAgICAgICBpZiAocmVhZFRpbWVvdXRfID09IFRBSUxfUkVBRF9USU1FT1VUKSB7Ci0gICAgICAgICAgdXNsZWVwKGVvZlNsZWVwVGltZV8pOworICAgICAgICAgIFRIUklGVF9TTEVFUF9VU0VDKGVvZlNsZWVwVGltZV8pOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgaWYgKHJlYWRUaW1lb3V0XyA9PSBOT19UQUlMX1JFQURfVElNRU9VVCkgewogICAgICAgICAgIC8vIHJlc2V0IHN0YXRlCkBAIC02ODUsNyArNjQyLDcgQEAKICAgICAgICAgICAgIHJlYWRTdGF0ZV8ucmVzZXRTdGF0ZSgwKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1c2xlZXAocmVhZFRpbWVvdXRfICogMTAwMCk7CisgICAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyhyZWFkVGltZW91dF8gKiAxMDAwKTsKICAgICAgICAgICAgIHJlYWRUcmllcysrOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQpAQCAtNjk2LDExICs2NTMsMTEgQEAKICAgICByZWFkVHJpZXMgPSAwOwogCiAgICAgLy8gYXR0ZW1wdCB0byByZWFkIGFuIGV2ZW50IGZyb20gdGhlIGJ1ZmZlcgotICAgIHdoaWxlKHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyA8IHJlYWRTdGF0ZV8uYnVmZmVyTGVuXykgeworICAgIHdoaWxlIChyZWFkU3RhdGVfLmJ1ZmZlclB0cl8gPCByZWFkU3RhdGVfLmJ1ZmZlckxlbl8pIHsKICAgICAgIGlmIChyZWFkU3RhdGVfLnJlYWRpbmdTaXplXykgewotICAgICAgICBpZihyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfID09IDApIHsKLSAgICAgICAgICBpZiAoIChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKS9jaHVua1NpemVfICE9Ci0gICAgICAgICAgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyAzKS9jaHVua1NpemVfKSkgeworICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSAwKSB7CisgICAgICAgICAgaWYgKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfKSAvIGNodW5rU2l6ZV8KKyAgICAgICAgICAgICAgIT0gKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfICsgMykgLyBjaHVua1NpemVfKSkgewogICAgICAgICAgICAgLy8gc2tpcCBvbmUgYnl0ZSB0b3dhcmRzIGNodW5rIGJvdW5kYXJ5CiAgICAgICAgICAgICAvLyAgICAgICAgICAgIFRfREVCVUdfTCgxLCAiU2tpcHBpbmcgYSBieXRlIik7CiAgICAgICAgICAgICByZWFkU3RhdGVfLmJ1ZmZlclB0cl8rKzsKQEAgLTcwOCwxMSArNjY1LDEyIEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmVhZFN0YXRlXy5ldmVudFNpemVCdWZmX1tyZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZQb3NfKytdID0KLSAgICAgICAgICByZWFkQnVmZl9bcmVhZFN0YXRlXy5idWZmZXJQdHJfKytdOworICAgICAgICByZWFkU3RhdGVfLmV2ZW50U2l6ZUJ1ZmZfW3JlYWRTdGF0ZV8uZXZlbnRTaXplQnVmZlBvc18rK10KKyAgICAgICAgICAgID0gcmVhZEJ1ZmZfW3JlYWRTdGF0ZV8uYnVmZmVyUHRyXysrXTsKKwogICAgICAgICBpZiAocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmUG9zXyA9PSA0KSB7Ci0gICAgICAgICAgLy8gMCBsZW5ndGggZXZlbnQgaW5kaWNhdGVzIHBhZGRpbmcKLSAgICAgICAgICBpZiAoKigodWludDMyX3QgKikocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmXykpID09IDApIHsKKyAgICAgICAgICBpZiAocmVhZFN0YXRlXy5nZXRFdmVudFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyAwIGxlbmd0aCBldmVudCBpbmRpY2F0ZXMgcGFkZGluZwogICAgICAgICAgICAgLy8gICAgICAgICAgICBUX0RFQlVHX0woMSwgIkdvdCBwYWRkaW5nIik7CiAgICAgICAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNzIwLDEwICs2NzgsMTAgQEAKICAgICAgICAgICAvLyBnb3QgYSB2YWxpZCBldmVudAogICAgICAgICAgIHJlYWRTdGF0ZV8ucmVhZGluZ1NpemVfID0gZmFsc2U7CiAgICAgICAgICAgaWYgKHJlYWRTdGF0ZV8uZXZlbnRfKSB7Ci0gICAgICAgICAgICBkZWxldGUocmVhZFN0YXRlXy5ldmVudF8pOworICAgICAgICAgICAgZGVsZXRlIChyZWFkU3RhdGVfLmV2ZW50Xyk7CiAgICAgICAgICAgfQogICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfID0gbmV3IGV2ZW50SW5mbygpOwotICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID0gKigodWludDMyX3QgKikocmVhZFN0YXRlXy5ldmVudFNpemVCdWZmXykpOworICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfID0gcmVhZFN0YXRlXy5nZXRFdmVudFNpemUoKTsKIAogICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBldmVudCBpcyBjb3JydXB0ZWQgYW5kIHBlcmZvcm0gcmVjb3ZlcnkgaWYgcmVxdWlyZWQKICAgICAgICAgICBpZiAoaXNFdmVudENvcnJ1cHRlZCgpKSB7CkBAIC03MzgsOCArNjk2LDggQEAKICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gdGFrZSBlaXRoZXIgdGhlIGVudGlyZSBldmVudCBvciB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKLSAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSBtaW4oKHVpbnQzMl90KShyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfKTsKKyAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSAoc3RkOjptaW4pKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOwogCiAgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCiAgICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLApAQCAtNzY0LDI4ICs3MjIsMzAgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLQogICB9CiB9CiAKIGJvb2wgVEZpbGVUcmFuc3BvcnQ6OmlzRXZlbnRDb3JydXB0ZWQoKSB7CiAgIC8vIGFuIGVycm9yIGlzIHRyaWdnZXJlZCBpZjoKLSAgaWYgKCAobWF4RXZlbnRTaXplXyA+IDApICYmICAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBtYXhFdmVudFNpemVfKSkgeworICBpZiAoKG1heEV2ZW50U2l6ZV8gPiAwKSAmJiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBtYXhFdmVudFNpemVfKSkgewogICAgIC8vIDEuIEV2ZW50IHNpemUgaXMgbGFyZ2VyIHRoYW4gdXNlci1zcGVmaWNpZWQgbWF4LWV2ZW50IHNpemUKICAgICBUX0VSUk9SKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IHNpemUoJXUpIGdyZWF0ZXIgdGhhbiBtYXggZXZlbnQgc2l6ZSAoJXUpIiwKLSAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLCBtYXhFdmVudFNpemVfKTsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLAorICAgICAgICAgICAgbWF4RXZlbnRTaXplXyk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0gZWxzZSBpZiAocmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8gPiBjaHVua1NpemVfKSB7CiAgICAgLy8gMi4gRXZlbnQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBjaHVuayBzaXplCiAgICAgVF9FUlJPUigiUmVhZCBjb3JydXB0IGV2ZW50LiBFdmVudCBzaXplKCV1KSBncmVhdGVyIHRoYW4gY2h1bmsgc2l6ZSAoJXUpIiwKLSAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLCBjaHVua1NpemVfKTsKKyAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfLAorICAgICAgICAgICAgY2h1bmtTaXplXyk7CiAgICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiggKChvZmZzZXRfICsgcmVhZFN0YXRlXy5idWZmZXJQdHJfIC0gNCkvY2h1bmtTaXplXykgIT0KLSAgICAgICAgICAgICAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIDEpL2NodW5rU2l6ZV8pICkgeworICB9IGVsc2UgaWYgKCgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyAtIDQpIC8gY2h1bmtTaXplXykKKyAgICAgICAgICAgICAhPSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIDEpCisgICAgICAgICAgICAgICAgIC8gY2h1bmtTaXplXykpIHsKICAgICAvLyAzLiBzaXplIGluZGljYXRlcyB0aGF0IGV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkKICAgICBUX0VSUk9SKCJSZWFkIGNvcnJ1cHQgZXZlbnQuIEV2ZW50IGNyb3NzZXMgY2h1bmsgYm91bmRhcnkuIEV2ZW50IHNpemU6JXUgIE9mZnNldDolbHUiLAogICAgICAgICAgICAgcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50U2l6ZV8sCi0gICAgICAgICAgICAob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXyArIDQpKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8gKyA0KSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtODE1LDggKzc3NSw4IEBACiAgICAgfSBlbHNlIGlmIChyZWFkVGltZW91dF8gPT0gVEFJTF9SRUFEX1RJTUVPVVQpIHsKICAgICAgIC8vIGlmIHRhaWxpbmcgdGhlIGZpbGUsIHdhaXQgdW50aWwgdGhlcmUgaXMgZW5vdWdoIGRhdGEgdG8gc3RhcnQKICAgICAgIC8vIHRoZSBuZXh0IGNodW5rCi0gICAgICB3aGlsZShjdXJDaHVuayA9PSAoZ2V0TnVtQ2h1bmtzKCkgLSAxKSkgewotICAgICAgICB1c2xlZXAoREVGQVVMVF9DT1JSVVBURURfU0xFRVBfVElNRV9VUyk7CisgICAgICB3aGlsZSAoY3VyQ2h1bmsgPT0gKGdldE51bUNodW5rcygpIC0gMSkpIHsKKyAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUMoY29ycnVwdGVkRXZlbnRTbGVlcFRpbWVfKTsKICAgICAgIH0KICAgICAgIHNlZWtUb0NodW5rKGN1ckNodW5rICsgMSk7CiAgICAgfSBlbHNlIHsKQEAgLTgyNSwxNCArNzg1LDE0IEBACiAgICAgICByZWFkU3RhdGVfLnJlc2V0U3RhdGUocmVhZFN0YXRlXy5sYXN0RGlzcGF0Y2hQdHJfKTsKICAgICAgIGN1cnJlbnRFdmVudF8gPSBOVUxMOwogICAgICAgY2hhciBlcnJvck1zZ1sxMDI0XTsKLSAgICAgIHNwcmludGYoZXJyb3JNc2csICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgY29ycnVwdGVkIGF0IG9mZnNldDogJWx1IiwKLSAgICAgICAgICAgICAgKG9mZnNldF8gKyByZWFkU3RhdGVfLmxhc3REaXNwYXRjaFB0cl8pKTsKKyAgICAgIHNwcmludGYoZXJyb3JNc2csCisgICAgICAgICAgICAgICJURmlsZVRyYW5zcG9ydDogbG9nIGZpbGUgY29ycnVwdGVkIGF0IG9mZnNldDogJWx1IiwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ob2Zmc2V0XyArIHJlYWRTdGF0ZV8ubGFzdERpc3BhdGNoUHRyXykpOwogCiAgICAgICBHbG9iYWxPdXRwdXQoZXJyb3JNc2cpOwogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihlcnJvck1zZyk7CiAgICAgfQogICB9Ci0KIH0KIAogdm9pZCBURmlsZVRyYW5zcG9ydDo6c2Vla1RvQ2h1bmsoaW50MzJfdCBjaHVuaykgewpAQCAtODY2LDExICs4MjYsMTEgQEAKICAgICBzZWVrVG9FbmQgPSB0cnVlOwogICAgIGNodW5rID0gbnVtQ2h1bmtzIC0gMTsKICAgICAvLyB0aGlzIGlzIHRoZSBtaW4gb2Zmc2V0IHRvIHByb2Nlc3MgZXZlbnRzIHRpbGwKLSAgICBtaW5FbmRPZmZzZXQgPSBsc2VlayhmZF8sIDAsIFNFRUtfRU5EKTsKKyAgICBtaW5FbmRPZmZzZXQgPSA6OlRIUklGVF9MU0VFSyhmZF8sIDAsIFNFRUtfRU5EKTsKICAgfQogCiAgIG9mZl90IG5ld09mZnNldCA9IG9mZl90KGNodW5rKSAqIGNodW5rU2l6ZV87Ci0gIG9mZnNldF8gPSBsc2VlayhmZF8sIG5ld09mZnNldCwgU0VFS19TRVQpOworICBvZmZzZXRfID0gOjpUSFJJRlRfTFNFRUsoZmRfLCBuZXdPZmZzZXQsIFNFRUtfU0VUKTsKICAgcmVhZFN0YXRlXy5yZXNldEFsbFZhbHVlcygpOwogICBjdXJyZW50RXZlbnRfID0gTlVMTDsKICAgaWYgKG9mZnNldF8gPT0gLTEpIHsKQEAgLTg4Myw3ICs4NDMsNyBAQAogICAgIHVpbnQzMl90IG9sZFJlYWRUaW1lb3V0ID0gZ2V0UmVhZFRpbWVvdXQoKTsKICAgICBzZXRSZWFkVGltZW91dChOT19UQUlMX1JFQURfVElNRU9VVCk7CiAgICAgLy8ga2VlcCBvbiByZWFkaW5nIHVudGkgdGhlIGxhc3QgZXZlbnQgYXQgcG9pbnQgb2Ygc2Vla0NodW5rIGNhbGwKLSAgICBib29zdDo6c2NvcGVkX3B0cjxldmVudEluZm8+IGV2ZW50OworICAgIHNoYXJlZF9wdHI8ZXZlbnRJbmZvPiBldmVudDsKICAgICB3aGlsZSAoKG9mZnNldF8gKyByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pIDwgbWluRW5kT2Zmc2V0KSB7CiAgICAgICBldmVudC5yZXNldChyZWFkRXZlbnQoKSk7CiAgICAgICBpZiAoZXZlbnQuZ2V0KCkgPT0gTlVMTCkgewpAQCAtODkyLDcgKzg1Miw2IEBACiAgICAgfQogICAgIHNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKICAgfQotCiB9CiAKIHZvaWQgVEZpbGVUcmFuc3BvcnQ6OnNlZWtUb0VuZCgpIHsKQEAgLTkwNCwxOCArODYzLDIxIEBACiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICBzdHJ1Y3Qgc3RhdCBmX2luZm87Ci0gIGludCBydiA9IGZzdGF0KGZkXywgJmZfaW5mbyk7CisgIHN0cnVjdCBUSFJJRlRfU1RBVCBmX2luZm87CisgIGludCBydiA9IDo6VEhSSUZUX0ZTVEFUKGZkXywgJmZfaW5mbyk7CiAKICAgaWYgKHJ2IDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfRVJSTk87CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OjpnZXROdW1DaHVua3MoKSAoZnN0YXQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICB9CiAKICAgaWYgKGZfaW5mby5zdF9zaXplID4gMCkgewotICAgIHJldHVybiAoKGZfaW5mby5zdF9zaXplKS9jaHVua1NpemVfKSArIDE7CisgICAgc2l6ZV90IG51bUNodW5rcyA9ICgoZl9pbmZvLnN0X3NpemUpIC8gY2h1bmtTaXplXykgKyAxOworICAgIGlmIChudW1DaHVua3MgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIlRvbyBtYW55IGNodW5rcyIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obnVtQ2h1bmtzKTsKICAgfQogCiAgIC8vIGVtcHR5IGZpbGUgaGFzIG5vIGNodW5rcwpAQCAtOTIzLDQ4ICs4ODUsNDMgQEAKIH0KIAogdWludDMyX3QgVEZpbGVUcmFuc3BvcnQ6OmdldEN1ckNodW5rKCkgewotICByZXR1cm4gb2Zmc2V0Xy9jaHVua1NpemVfOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG9mZnNldF8gLyBjaHVua1NpemVfKTsKIH0KIAogLy8gVXRpbGl0eSBGdW5jdGlvbnMKIHZvaWQgVEZpbGVUcmFuc3BvcnQ6Om9wZW5Mb2dGaWxlKCkgewogI2lmbmRlZiBfV0lOMzIKLSAgbW9kZV90IG1vZGUgPSByZWFkT25seV8gPyBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEggOiBTX0lSVVNSIHwgU19JV1VTUnwgU19JUkdSUCB8IFNfSVJPVEg7CisgIG1vZGVfdCBtb2RlID0gcmVhZE9ubHlfID8gU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RIIDogU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKICAgaW50IGZsYWdzID0gcmVhZE9ubHlfID8gT19SRE9OTFkgOiBPX1JEV1IgfCBPX0NSRUFUIHwgT19BUFBFTkQ7Ci0gIGZkXyA9IDo6b3BlbihmaWxlbmFtZV8uY19zdHIoKSwgZmxhZ3MsIG1vZGUpOwogI2Vsc2UKICAgaW50IG1vZGUgPSByZWFkT25seV8gPyBfU19JUkVBRCA6IF9TX0lSRUFEIHwgX1NfSVdSSVRFOwogICBpbnQgZmxhZ3MgPSByZWFkT25seV8gPyBfT19SRE9OTFkgOiBfT19SRFdSIHwgX09fQ1JFQVQgfCBfT19BUFBFTkQ7Ci0gIGZkXyA9IDo6X29wZW4oZmlsZW5hbWVfLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKICNlbmRpZgorICBmZF8gPSA6OlRIUklGVF9PUEVOKGZpbGVuYW1lXy5jX3N0cigpLCBmbGFncywgbW9kZSk7CiAgIG9mZnNldF8gPSAwOwogCiAgIC8vIG1ha2Ugc3VyZSBvcGVuIGNhbGwgd2FzIHN1Y2Nlc3NmdWwKLSAgaWYoZmRfID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgaWYgKGZkXyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0VSUk5POwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRGaWxlVHJhbnNwb3J0OiBvcGVuTG9nRmlsZSgpIDo6b3BlbigpIGZpbGU6ICIgKyBmaWxlbmFtZV8sIGVycm5vX2NvcHkpOwogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sIGZpbGVuYW1lXywgZXJybm9fY29weSk7CiAgIH0KLQogfQogCi12b2lkIFRGaWxlVHJhbnNwb3J0OjpnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1lc3BlYyogdHNfbmV4dF9mbHVzaCkgewotICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCB0c19uZXh0X2ZsdXNoKTsKLSAgdHNfbmV4dF9mbHVzaC0+dHZfbnNlYyArPSAoZmx1c2hNYXhVc18gJSAxMDAwMDAwKSAqIDEwMDA7Ci0gIGlmICh0c19uZXh0X2ZsdXNoLT50dl9uc2VjID4gMTAwMDAwMDAwMCkgewotICAgIHRzX25leHRfZmx1c2gtPnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKLSAgICB0c19uZXh0X2ZsdXNoLT50dl9zZWMgKz0gMTsKK3ZvaWQgVEZpbGVUcmFuc3BvcnQ6OmdldE5leHRGbHVzaFRpbWUoc3RydWN0IHRpbWV2YWwqIHRzX25leHRfZmx1c2gpIHsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSh0c19uZXh0X2ZsdXNoLCBOVUxMKTsKKworICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICs9IGZsdXNoTWF4VXNfOworICBpZiAodHNfbmV4dF9mbHVzaC0+dHZfdXNlYyA+IDEwMDAwMDApIHsKKyAgICBsb25nIGV4dHJhX3NlY3MgPSB0c19uZXh0X2ZsdXNoLT50dl91c2VjIC8gMTAwMDAwMDsKKyAgICB0c19uZXh0X2ZsdXNoLT50dl91c2VjICU9IDEwMDAwMDA7CisgICAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IGV4dHJhX3NlY3M7CiAgIH0KLSAgdHNfbmV4dF9mbHVzaC0+dHZfc2VjICs9IGZsdXNoTWF4VXNfIC8gMTAwMDAwMDsKIH0KIAogVEZpbGVUcmFuc3BvcnRCdWZmZXI6OlRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpCi0gIDogYnVmZmVyTW9kZV8oV1JJVEUpCi0gICwgd3JpdGVQb2ludF8oMCkKLSAgLCByZWFkUG9pbnRfKDApCi0gICwgc2l6ZV8oc2l6ZSkKLXsKLSAgYnVmZmVyXyA9IG5ldyBldmVudEluZm8qW3NpemVdOworICA6IGJ1ZmZlck1vZGVfKFdSSVRFKSwgd3JpdGVQb2ludF8oMCksIHJlYWRQb2ludF8oMCksIHNpemVfKHNpemUpIHsKKyAgYnVmZmVyXyA9IG5ldyBldmVudEluZm8qIFtzaXplXTsKIH0KIAogVEZpbGVUcmFuc3BvcnRCdWZmZXI6On5URmlsZVRyYW5zcG9ydEJ1ZmZlcigpIHsKQEAgLTk3Nyw3ICs5MzQsNyBAQAogICB9CiB9CiAKLWJvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmFkZEV2ZW50KGV2ZW50SW5mbyAqZXZlbnQpIHsKK2Jvb2wgVEZpbGVUcmFuc3BvcnRCdWZmZXI6OmFkZEV2ZW50KGV2ZW50SW5mbyogZXZlbnQpIHsKICAgaWYgKGJ1ZmZlck1vZGVfID09IFJFQUQpIHsKICAgICBHbG9iYWxPdXRwdXQoIlRyeWluZyB0byB3cml0ZSB0byBhIGJ1ZmZlciBpbiByZWFkIG1vZGUiKTsKICAgfQpAQCAtMTAyNSwxMSArOTgyLDExIEBACiAKIFRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKIAogICAvLyBkZWZhdWx0IHRoZSBvdXRwdXQgdHJhbnNwb3J0IHRvIGEgbnVsbCB0cmFuc3BvcnQgKGNvbW1vbiBjYXNlKQogICBvdXRwdXRUcmFuc3BvcnRfID0gc2hhcmVkX3B0cjxUTnVsbFRyYW5zcG9ydD4obmV3IFROdWxsVHJhbnNwb3J0KCkpOwpAQCAtMTAzOCwxMSArOTk1LDExIEBACiBURmlsZVByb2Nlc3Nvcjo6VEZpbGVQcm9jZXNzb3Ioc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKLSAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyhvdXRwdXRQcm90b2NvbEZhY3RvcnkpLAotICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCkKKyAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksCisgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKGlucHV0UHJvdG9jb2xGYWN0b3J5KSwKKyAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSksCisgICAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSB7CiAKICAgLy8gZGVmYXVsdCB0aGUgb3V0cHV0IHRyYW5zcG9ydCB0byBhIG51bGwgdHJhbnNwb3J0IChjb21tb24gY2FzZSkKICAgb3V0cHV0VHJhbnNwb3J0XyA9IHNoYXJlZF9wdHI8VE51bGxUcmFuc3BvcnQ+KG5ldyBUTnVsbFRyYW5zcG9ydCgpKTsKQEAgLTEwNTEsMTIgKzEwMDgsMTMgQEAKIFRGaWxlUHJvY2Vzc29yOjpURmlsZVByb2Nlc3NvcihzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk6Ci0gIHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCi0gIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKLSAgaW5wdXRUcmFuc3BvcnRfKGlucHV0VHJhbnNwb3J0KSwKLSAgb3V0cHV0VHJhbnNwb3J0XyhvdXRwdXRUcmFuc3BvcnQpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpCisgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAorICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5Xyhwcm90b2NvbEZhY3RvcnkpLAorICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKKyAgICBpbnB1dFRyYW5zcG9ydF8oaW5wdXRUcmFuc3BvcnQpLAorICAgIG91dHB1dFRyYW5zcG9ydF8ob3V0cHV0VHJhbnNwb3J0KSB7Cit9CiAKIHZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3ModWludDMyX3QgbnVtRXZlbnRzLCBib29sIHRhaWwpIHsKICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0Xyk7CkBAIC0xMDcwLDIwICsxMDI4LDIwIEBACiAgIH0KIAogICB1aW50MzJfdCBudW1Qcm9jZXNzZWQgPSAwOwotICB3aGlsZSgxKSB7CisgIHdoaWxlICgxKSB7CiAgICAgLy8gYmFkIGZvcm0gdG8gdXNlIGV4Y2VwdGlvbnMgZm9yIGZsb3cgY29udHJvbCBidXQgdGhlcmUgaXMgcmVhbGx5CiAgICAgLy8gbm8gb3RoZXIgd2F5IGFyb3VuZCBpdAogICAgIHRyeSB7CiAgICAgICBwcm9jZXNzb3JfLT5wcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sLCBOVUxMKTsKICAgICAgIG51bVByb2Nlc3NlZCsrOwotICAgICAgaWYgKCAobnVtRXZlbnRzID4gMCkgJiYgKG51bVByb2Nlc3NlZCA9PSBudW1FdmVudHMpKSB7CisgICAgICBpZiAoKG51bUV2ZW50cyA+IDApICYmIChudW1Qcm9jZXNzZWQgPT0gbnVtRXZlbnRzKSkgewogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfSBjYXRjaCAoVEVPRkV4Y2VwdGlvbiYpIHsKICAgICAgIGlmICghdGFpbCkgewogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0ZSkgeworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHRlKSB7CiAgICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTA5Myw3ICsxMDUxLDYgQEAKICAgaWYgKHRhaWwpIHsKICAgICBpbnB1dFRyYW5zcG9ydF8tPnNldFJlYWRUaW1lb3V0KG9sZFJlYWRUaW1lb3V0KTsKICAgfQotCiB9CiAKIHZvaWQgVEZpbGVQcm9jZXNzb3I6OnByb2Nlc3NDaHVuaygpIHsKQEAgLTExMDIsNyArMTA1OSw3IEBACiAKICAgdWludDMyX3QgY3VyQ2h1bmsgPSBpbnB1dFRyYW5zcG9ydF8tPmdldEN1ckNodW5rKCk7CiAKLSAgd2hpbGUoMSkgeworICB3aGlsZSAoMSkgewogICAgIC8vIGJhZCBmb3JtIHRvIHVzZSBleGNlcHRpb25zIGZvciBmbG93IGNvbnRyb2wgYnV0IHRoZXJlIGlzIHJlYWxseQogICAgIC8vIG5vIG90aGVyIHdheSBhcm91bmQgaXQKICAgICB0cnkgewpAQCAtMTExMiwxMSArMTA2OSwxMiBAQAogICAgICAgfQogICAgIH0gY2F0Y2ggKFRFT0ZFeGNlcHRpb24mKSB7CiAgICAgICBicmVhazsKLSAgICB9IGNhdGNoIChURXhjZXB0aW9uICZ0ZSkgeworICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIHRlKSB7CiAgICAgICBjZXJyIDw8IHRlLndoYXQoKSA8PCBlbmRsOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaAppbmRleCBlZGZjNDA3Li42Y2M3YmQyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCkBAIC0yNCwyNCArMjQsMTggQEAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KIAorI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2lmZGVmIEhBVkVfUFRIUkVBRF9ICi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQk9PU1RfVEhSRUFECi0jaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwpAQCAtNTQsNyArNDgsNyBAQAogICB1aW50MzJfdCBldmVudFNpemVfOwogICB1aW50MzJfdCBldmVudEJ1ZmZQb3NfOwogCi0gIGV2ZW50SW5mbygpOmV2ZW50QnVmZl8oTlVMTCksIGV2ZW50U2l6ZV8oMCksIGV2ZW50QnVmZlBvc18oMCl7fTsKKyAgZXZlbnRJbmZvKCkgOiBldmVudEJ1ZmZfKE5VTEwpLCBldmVudFNpemVfKDApLCBldmVudEJ1ZmZQb3NfKDApe307CiAgIH5ldmVudEluZm8oKSB7CiAgICAgaWYgKGV2ZW50QnVmZl8pIHsKICAgICAgIGRlbGV0ZVtdIGV2ZW50QnVmZl87CkBAIC02NywxMyArNjEsMTMgQEAKICAgZXZlbnRJbmZvKiBldmVudF87CiAKICAgLy8ga2VlcCB0cmFjayBvZiBldmVudCBzaXplCi0gIHVpbnQ4X3QgICBldmVudFNpemVCdWZmX1s0XTsKLSAgdWludDhfdCAgIGV2ZW50U2l6ZUJ1ZmZQb3NfOwotICBib29sICAgICAgcmVhZGluZ1NpemVfOworICB1aW50OF90IGV2ZW50U2l6ZUJ1ZmZfWzRdOworICB1aW50OF90IGV2ZW50U2l6ZUJ1ZmZQb3NfOworICBib29sIHJlYWRpbmdTaXplXzsKIAogICAvLyByZWFkIGJ1ZmZlciB2YXJpYWJsZXMKLSAgaW50MzJfdCAgYnVmZmVyUHRyXzsKLSAgaW50MzJfdCAgYnVmZmVyTGVuXzsKKyAgaW50MzJfdCBidWZmZXJQdHJfOworICBpbnQzMl90IGJ1ZmZlckxlbl87CiAKICAgLy8gbGFzdCBzdWNjZXNzZnVsIGRpc3BhdGNoIHBvaW50CiAgIGludDMyX3QgbGFzdERpc3BhdGNoUHRyXzsKQEAgLTg5LDE5ICs4MywyNCBAQAogICAgIGJ1ZmZlclB0cl8gPSAwOwogICAgIGJ1ZmZlckxlbl8gPSAwOwogICAgIGlmIChldmVudF8pIHsKLSAgICAgIGRlbGV0ZShldmVudF8pOworICAgICAgZGVsZXRlIChldmVudF8pOwogICAgIH0KICAgICBldmVudF8gPSAwOwogICB9CiAKKyAgaW5saW5lIHVpbnQzMl90IGdldEV2ZW50U2l6ZSgpIHsKKyAgICBjb25zdCB2b2lkKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqPihldmVudFNpemVCdWZmXyk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oYnVmZmVyKTsKKyAgfQorCiAgIHJlYWRTdGF0ZSgpIHsKICAgICBldmVudF8gPSAwOwotICAgcmVzZXRBbGxWYWx1ZXMoKTsKKyAgICByZXNldEFsbFZhbHVlcygpOwogICB9CiAKICAgfnJlYWRTdGF0ZSgpIHsKICAgICBpZiAoZXZlbnRfKSB7Ci0gICAgICBkZWxldGUoZXZlbnRfKTsKKyAgICAgIGRlbGV0ZSAoZXZlbnRfKTsKICAgICB9CiAgIH0KIApAQCAtMTIyLDM2ICsxMjEsMzMgQEAKICAqCiAgKi8KIGNsYXNzIFRGaWxlVHJhbnNwb3J0QnVmZmVyIHsKLSAgcHVibGljOgotICAgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKHVpbnQzMl90IHNpemUpOwotICAgIH5URmlsZVRyYW5zcG9ydEJ1ZmZlcigpOworcHVibGljOgorICBURmlsZVRyYW5zcG9ydEJ1ZmZlcih1aW50MzJfdCBzaXplKTsKKyAgflRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7CiAKLSAgICBib29sIGFkZEV2ZW50KGV2ZW50SW5mbyAqZXZlbnQpOwotICAgIGV2ZW50SW5mbyogZ2V0TmV4dCgpOwotICAgIHZvaWQgcmVzZXQoKTsKLSAgICBib29sIGlzRnVsbCgpOwotICAgIGJvb2wgaXNFbXB0eSgpOworICBib29sIGFkZEV2ZW50KGV2ZW50SW5mbyogZXZlbnQpOworICBldmVudEluZm8qIGdldE5leHQoKTsKKyAgdm9pZCByZXNldCgpOworICBib29sIGlzRnVsbCgpOworICBib29sIGlzRW1wdHkoKTsKIAotICBwcml2YXRlOgotICAgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKCk7IC8vIHNob3VsZCBub3QgYmUgdXNlZAorcHJpdmF0ZToKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIoKTsgLy8gc2hvdWxkIG5vdCBiZSB1c2VkCiAKLSAgICBlbnVtIG1vZGUgewotICAgICAgV1JJVEUsCi0gICAgICBSRUFECi0gICAgfTsKLSAgICBtb2RlIGJ1ZmZlck1vZGVfOworICBlbnVtIG1vZGUgeyBXUklURSwgUkVBRCB9OworICBtb2RlIGJ1ZmZlck1vZGVfOwogCi0gICAgdWludDMyX3Qgd3JpdGVQb2ludF87Ci0gICAgdWludDMyX3QgcmVhZFBvaW50XzsKLSAgICB1aW50MzJfdCBzaXplXzsKLSAgICBldmVudEluZm8qKiBidWZmZXJfOworICB1aW50MzJfdCB3cml0ZVBvaW50XzsKKyAgdWludDMyX3QgcmVhZFBvaW50XzsKKyAgdWludDMyX3Qgc2l6ZV87CisgIGV2ZW50SW5mbyoqIGJ1ZmZlcl87CiB9OwogCiAvKioKICAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgdHJhbnNwb3J0cyB1c2VkIHRvIHJlYWQgZmlsZXMKICAqLwogY2xhc3MgVEZpbGVSZWFkZXJUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpID0gMDsKICAgdmlydHVhbCB2b2lkIHNldFJlYWRUaW1lb3V0KGludDMyX3QgcmVhZFRpbWVvdXQpID0gMDsKIApAQCAtMTY1LDcgKzE2MSw3IEBACiAgKiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRyYW5zcG9ydHMgdXNlZCB0byB3cml0ZSBmaWxlcwogICovCiBjbGFzcyBURmlsZVdyaXRlclRyYW5zcG9ydCA6IHZpcnR1YWwgcHVibGljIFRUcmFuc3BvcnQgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB1aW50MzJfdCBnZXRDaHVua1NpemUoKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBzZXRDaHVua1NpemUodWludDMyX3QgY2h1bmtTaXplKSA9IDA7CiB9OwpAQCAtMTc1LDE3ICsxNzEsMTQgQEAKICAqIGZpbGUgb24gZGlzay4KICAqCiAgKi8KLWNsYXNzIFRGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGaWxlUmVhZGVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVEZpbGVXcml0ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEZpbGVUcmFuc3BvcnQoc3RkOjpzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seT1mYWxzZSk7CitjbGFzcyBURmlsZVRyYW5zcG9ydCA6IHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCwgcHVibGljIFRGaWxlV3JpdGVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVEZpbGVUcmFuc3BvcnQoc3RkOjpzdHJpbmcgcGF0aCwgYm9vbCByZWFkT25seSA9IGZhbHNlKTsKICAgflRGaWxlVHJhbnNwb3J0KCk7CiAKICAgLy8gVE9ETzogd2hhdCBpcyB0aGUgY29ycmVjdCBiZWhhdmlvdXIgZm9yIHRoaXM/CiAgIC8vIHRoZSBsb2cgZmlsZSBpcyBnZW5lcmFsbHkgYWx3YXlzIG9wZW4KLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiB0cnVlOyB9CiAKICAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAgIHZvaWQgZmx1c2goKTsKQEAgLTIwOSwyNyArMjAyLDE5IEBACiAgICAgICByZWFkQnVmZlNpemVfID0gcmVhZEJ1ZmZTaXplOwogICAgIH0KICAgfQotICB1aW50MzJfdCBnZXRSZWFkQnVmZlNpemUoKSB7Ci0gICAgcmV0dXJuIHJlYWRCdWZmU2l6ZV87Ci0gIH0KKyAgdWludDMyX3QgZ2V0UmVhZEJ1ZmZTaXplKCkgeyByZXR1cm4gcmVhZEJ1ZmZTaXplXzsgfQogCiAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRBSUxfUkVBRF9USU1FT1VUID0gLTE7CiAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE5PX1RBSUxfUkVBRF9USU1FT1VUID0gMDsKLSAgdm9pZCBzZXRSZWFkVGltZW91dChpbnQzMl90IHJlYWRUaW1lb3V0KSB7Ci0gICAgcmVhZFRpbWVvdXRfID0gcmVhZFRpbWVvdXQ7Ci0gIH0KLSAgaW50MzJfdCBnZXRSZWFkVGltZW91dCgpIHsKLSAgICByZXR1cm4gcmVhZFRpbWVvdXRfOwotICB9CisgIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50MzJfdCByZWFkVGltZW91dCkgeyByZWFkVGltZW91dF8gPSByZWFkVGltZW91dDsgfQorICBpbnQzMl90IGdldFJlYWRUaW1lb3V0KCkgeyByZXR1cm4gcmVhZFRpbWVvdXRfOyB9CiAKICAgdm9pZCBzZXRDaHVua1NpemUodWludDMyX3QgY2h1bmtTaXplKSB7CiAgICAgaWYgKGNodW5rU2l6ZSkgewogICAgICAgY2h1bmtTaXplXyA9IGNodW5rU2l6ZTsKICAgICB9CiAgIH0KLSAgdWludDMyX3QgZ2V0Q2h1bmtTaXplKCkgewotICAgIHJldHVybiBjaHVua1NpemVfOwotICB9CisgIHVpbnQzMl90IGdldENodW5rU2l6ZSgpIHsgcmV0dXJuIGNodW5rU2l6ZV87IH0KIAogICB2b2lkIHNldEV2ZW50QnVmZmVyU2l6ZSh1aW50MzJfdCBidWZmZXJTaXplKSB7CiAgICAgaWYgKGJ1ZmZlckFuZFRocmVhZEluaXRpYWxpemVkXykgewpAQCAtMjM5LDc2ICsyMjQsNTYgQEAKICAgICBldmVudEJ1ZmZlclNpemVfID0gYnVmZmVyU2l6ZTsKICAgfQogCi0gIHVpbnQzMl90IGdldEV2ZW50QnVmZmVyU2l6ZSgpIHsKLSAgICByZXR1cm4gZXZlbnRCdWZmZXJTaXplXzsKLSAgfQorICB1aW50MzJfdCBnZXRFdmVudEJ1ZmZlclNpemUoKSB7IHJldHVybiBldmVudEJ1ZmZlclNpemVfOyB9CiAKICAgdm9pZCBzZXRGbHVzaE1heFVzKHVpbnQzMl90IGZsdXNoTWF4VXMpIHsKICAgICBpZiAoZmx1c2hNYXhVcykgewogICAgICAgZmx1c2hNYXhVc18gPSBmbHVzaE1heFVzOwogICAgIH0KICAgfQotICB1aW50MzJfdCBnZXRGbHVzaE1heFVzKCkgewotICAgIHJldHVybiBmbHVzaE1heFVzXzsKLSAgfQorICB1aW50MzJfdCBnZXRGbHVzaE1heFVzKCkgeyByZXR1cm4gZmx1c2hNYXhVc187IH0KIAogICB2b2lkIHNldEZsdXNoTWF4Qnl0ZXModWludDMyX3QgZmx1c2hNYXhCeXRlcykgewogICAgIGlmIChmbHVzaE1heEJ5dGVzKSB7CiAgICAgICBmbHVzaE1heEJ5dGVzXyA9IGZsdXNoTWF4Qnl0ZXM7CiAgICAgfQogICB9Ci0gIHVpbnQzMl90IGdldEZsdXNoTWF4Qnl0ZXMoKSB7Ci0gICAgcmV0dXJuIGZsdXNoTWF4Qnl0ZXNfOwotICB9CisgIHVpbnQzMl90IGdldEZsdXNoTWF4Qnl0ZXMoKSB7IHJldHVybiBmbHVzaE1heEJ5dGVzXzsgfQogCi0gIHZvaWQgc2V0TWF4RXZlbnRTaXplKHVpbnQzMl90IG1heEV2ZW50U2l6ZSkgewotICAgIG1heEV2ZW50U2l6ZV8gPSBtYXhFdmVudFNpemU7Ci0gIH0KLSAgdWludDMyX3QgZ2V0TWF4RXZlbnRTaXplKCkgewotICAgIHJldHVybiBtYXhFdmVudFNpemVfOwotICB9CisgIHZvaWQgc2V0TWF4RXZlbnRTaXplKHVpbnQzMl90IG1heEV2ZW50U2l6ZSkgeyBtYXhFdmVudFNpemVfID0gbWF4RXZlbnRTaXplOyB9CisgIHVpbnQzMl90IGdldE1heEV2ZW50U2l6ZSgpIHsgcmV0dXJuIG1heEV2ZW50U2l6ZV87IH0KIAogICB2b2lkIHNldE1heENvcnJ1cHRlZEV2ZW50cyh1aW50MzJfdCBtYXhDb3JydXB0ZWRFdmVudHMpIHsKICAgICBtYXhDb3JydXB0ZWRFdmVudHNfID0gbWF4Q29ycnVwdGVkRXZlbnRzOwogICB9Ci0gIHVpbnQzMl90IGdldE1heENvcnJ1cHRlZEV2ZW50cygpIHsKLSAgICByZXR1cm4gbWF4Q29ycnVwdGVkRXZlbnRzXzsKLSAgfQorICB1aW50MzJfdCBnZXRNYXhDb3JydXB0ZWRFdmVudHMoKSB7IHJldHVybiBtYXhDb3JydXB0ZWRFdmVudHNfOyB9CiAKICAgdm9pZCBzZXRFb2ZTbGVlcFRpbWVVcyh1aW50MzJfdCBlb2ZTbGVlcFRpbWUpIHsKICAgICBpZiAoZW9mU2xlZXBUaW1lKSB7CiAgICAgICBlb2ZTbGVlcFRpbWVfID0gZW9mU2xlZXBUaW1lOwogICAgIH0KICAgfQotICB1aW50MzJfdCBnZXRFb2ZTbGVlcFRpbWVVcygpIHsKLSAgICByZXR1cm4gZW9mU2xlZXBUaW1lXzsKLSAgfQorICB1aW50MzJfdCBnZXRFb2ZTbGVlcFRpbWVVcygpIHsgcmV0dXJuIGVvZlNsZWVwVGltZV87IH0KIAogICAvKgogICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KICAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKICAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KICAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdWludDMyX3QgcmVhZEFsbF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOwotICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZEFsbChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBhIGZpbGUKICAgdm9pZCBlbnF1ZXVlRXZlbnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBldmVudExlbik7Ci0gIGJvb2wgc3dhcEV2ZW50QnVmZmVycyhzdHJ1Y3QgdGltZXNwZWMqIGRlYWRsaW5lKTsKKyAgYm9vbCBzd2FwRXZlbnRCdWZmZXJzKHN0cnVjdCB0aW1ldmFsKiBkZWFkbGluZSk7CiAgIGJvb2wgaW5pdEJ1ZmZlckFuZFdyaXRlVGhyZWFkKCk7CiAKICAgLy8gY29udHJvbCBmb3Igd3JpdGVyIHRocmVhZAogICBzdGF0aWMgdm9pZCogc3RhcnRXcml0ZXJUaHJlYWQodm9pZCogcHRyKSB7Ci0gICAgKCgoVEZpbGVUcmFuc3BvcnQqKXB0ciktPndyaXRlclRocmVhZCgpKTsKLSAgICByZXR1cm4gMDsKKyAgICBzdGF0aWNfY2FzdDxURmlsZVRyYW5zcG9ydCo+KHB0ciktPndyaXRlclRocmVhZCgpOworICAgIHJldHVybiBOVUxMOwogICB9CiAgIHZvaWQgd3JpdGVyVGhyZWFkKCk7CiAKQEAgLTMyMSw3ICsyODYsNyBAQAogCiAgIC8vIFV0aWxpdHkgZnVuY3Rpb25zCiAgIHZvaWQgb3BlbkxvZ0ZpbGUoKTsKLSAgdm9pZCBnZXROZXh0Rmx1c2hUaW1lKHN0cnVjdCB0aW1lc3BlYyogdHNfbmV4dF9mbHVzaCk7CisgIHZvaWQgZ2V0TmV4dEZsdXNoVGltZShzdHJ1Y3QgdGltZXZhbCogdHNfbmV4dF9mbHVzaCk7CiAKICAgLy8gQ2xhc3MgdmFyaWFibGVzCiAgIHJlYWRTdGF0ZSByZWFkU3RhdGVfOwpAQCAtMzcwLDI1ICszMzUsMjIgQEAKICAgdWludDMyX3Qgd3JpdGVyVGhyZWFkSU9FcnJvclNsZWVwVGltZV87CiAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1dSSVRFUl9USFJFQURfU0xFRVBfVElNRV9VUyA9IDYwICogMTAwMCAqIDEwMDA7CiAKLSAgLy8gd3JpdGVyIHRocmVhZCBpZAotI2lmZGVmIFVTRV9CT09TVF9USFJFQUQKLQlzdGQ6OmF1dG9fcHRyPGJvb3N0Ojp0aHJlYWQ+IHdyaXRlclRocmVhZElkXzsKLSNlbHNlCi0JcHRocmVhZF90IHdyaXRlclRocmVhZElkXzsKLSNlbmRpZgorICAvLyB3cml0ZXIgdGhyZWFkCisgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHdyaXRlclRocmVhZF87CiAKICAgLy8gYnVmZmVycyB0byBob2xkIGRhdGEgYmVmb3JlIGl0IGlzIGZsdXNoZWQuIEVhY2ggZWxlbWVudCBvZiB0aGUgYnVmZmVyIHN0b3JlcyBhIG1zZyB0aGF0CiAgIC8vIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUuICBUaGUgYnVmZmVycyBhcmUgc3dhcHBlZCBieSB0aGUgd3JpdGVyIHRocmVhZC4KLSAgVEZpbGVUcmFuc3BvcnRCdWZmZXIgKmRlcXVldWVCdWZmZXJfOwotICBURmlsZVRyYW5zcG9ydEJ1ZmZlciAqZW5xdWV1ZUJ1ZmZlcl87CisgIFRGaWxlVHJhbnNwb3J0QnVmZmVyKiBkZXF1ZXVlQnVmZmVyXzsKKyAgVEZpbGVUcmFuc3BvcnRCdWZmZXIqIGVucXVldWVCdWZmZXJfOwogCiAgIC8vIGNvbmRpdGlvbnMgdXNlZCB0byBibG9jayB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBvciBlbXB0eQogICBNb25pdG9yIG5vdEZ1bGxfLCBub3RFbXB0eV87Ci0gIHZvbGF0aWxlIGJvb2wgY2xvc2luZ187CisgIHN0ZDo6YXRvbWljPGJvb2w+IGNsb3NpbmdfOwogCiAgIC8vIFRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIGZsdXNoZWQKICAgTW9uaXRvciBmbHVzaGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBmb3JjZUZsdXNoXzsKKyAgc3RkOjphdG9taWM8Ym9vbD4gZm9yY2VGbHVzaF87CiAKICAgLy8gTXV0ZXggdGhhdCBpcyBncmFiYmVkIHdoZW4gZW5xdWV1ZWluZyBhbmQgc3dhcHBpbmcgdGhlIHJlYWQvd3JpdGUgYnVmZmVycwogICBNdXRleCBtdXRleF87CkBAIC00MTIsMTUgKzM3NCwxMyBAQAogCiAvLyBFeGNlcHRpb24gdGhyb3duIHdoZW4gRU9GIGlzIGhpdAogY2xhc3MgVEVPRkV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRFT0ZFeGNlcHRpb24oKToKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKSB7fTsKK3B1YmxpYzoKKyAgVEVPRkV4Y2VwdGlvbigpIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSl7fTsKIH07CiAKLQogLy8gd3JhcHBlciBjbGFzcyB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIGEgZmlsZSBjb250YWluaW5nIHRocmlmdCBldmVudHMKIGNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvciB0aGF0IGRlZmF1bHRzIG91dHB1dCB0cmFuc3BvcnQgdG8gbnVsbCB0cmFuc3BvcnQKICAgICoKQEAgLTQyOCwxNCArMzg4LDE0IEBACiAgICAqIEBwYXJhbSBwcm90b2NvbEZhY3RvcnkgcHJvdG9jb2wgZmFjdG9yeQogICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgZmlsZSB0cmFuc3BvcnQKICAgICovCi0gIFRGaWxlUHJvY2Vzc29yKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKIAotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CisgIFRGaWxlUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yCkBAIC00NDUsMTAgKzQwNSwxMCBAQAogICAgKiBAcGFyYW0gaW5wdXRUcmFuc3BvcnQgaW5wdXQgZmlsZSB0cmFuc3BvcnQKICAgICogQHBhcmFtIG91dHB1dCBvdXRwdXQgdHJhbnNwb3J0CiAgICAqLwotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnQpOworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KTsKIAogICAvKioKICAgICogcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIHRoZSBmaWxlCkBAIC00NjQsMTUgKzQyNCwxNiBAQAogICAgKi8KICAgdm9pZCBwcm9jZXNzQ2h1bmsoKTsKIAotIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnRfOwogfTsKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RSQU5TUE9SVF9URklMRVRSQU5TUE9SVF9IXworCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTA4NGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcApAQCAtMCwwICsxLDYxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9CSU5BUlkgfHwgY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQ09NUEFDVCkgeworICAgIHJldHVybiB0cmFuc3BvcnRfLT5yZWFkKGJ1ZiwgbGVuKTsKKyAgfQorCisgIHJldHVybiBURnJhbWVkVHJhbnNwb3J0OjpyZWFkU2xvdyhidWYsIGxlbik7Cit9CisKK3VpbnQxNl90IFRIZWFkZXJUcmFuc3BvcnQ6OmdldFByb3RvY29sSWQoKSBjb25zdCB7CisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICByZXR1cm4gcHJvdG9JZDsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgcmV0dXJuIFRfQ09NUEFDVF9QUk9UT0NPTDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gVF9CSU5BUllfUFJPVE9DT0w7IC8vIEFzc3VtZSBvdGhlciB0cmFuc3BvcnRzIHVzZSBUQmluYXJ5CisgIH0KK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjplbnN1cmVSZWFkQnVmZmVyKHVpbnQzMl90IHN6KSB7CisgIGlmIChzeiA+IHJCdWZTaXplXykgeworICAgIHJCdWZfLnJlc2V0KG5ldyB1aW50OF90W3N6XSk7CisgICAgckJ1ZlNpemVfID0gc3o7CisgIH0KK30KKworYm9vbCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkRnJhbWUoKSB7CisgIC8vIHN6TiBpcyBuZXR3b3JrIGJ5dGUgb3JkZXIgb2Ygc3oKKyAgdWludDMyX3Qgc3pOOworICB1aW50MzJfdCBzejsKKworICAvLyBSZWFkIHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lLgorICAvLyBXZSBjYW4ndCB1c2UgcmVhZEFsbCgmc3osIHNpemVvZihzeikpLCBzaW5jZSB0aGF0IGFsd2F5cyB0aHJvd3MgYW4KKyAgLy8gZXhjZXB0aW9uIG9uIEVPRi4gIFdlIHdhbnQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIG9ubHkgaWYgRU9GIG9jY3VycyBhZnRlcgorICAvLyBwYXJ0aWFsIHNpemUgZGF0YS4KKyAgdWludDMyX3Qgc2l6ZUJ5dGVzUmVhZCA9IDA7CisgIHdoaWxlIChzaXplQnl0ZXNSZWFkIDwgc2l6ZW9mKHN6TikpIHsKKyAgICB1aW50OF90KiBzenAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc3pOKSArIHNpemVCeXRlc1JlYWQ7CisgICAgdWludDMyX3QgYnl0ZXNSZWFkID0gdHJhbnNwb3J0Xy0+cmVhZChzenAsIHNpemVvZihzek4pIC0gc2l6ZUJ5dGVzUmVhZCk7CisgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICBpZiAoc2l6ZUJ5dGVzUmVhZCA9PSAwKSB7CisgICAgICAgIC8vIEVPRiBiZWZvcmUgYW55IGRhdGEgd2FzIHJlYWQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEVPRiBhZnRlciBhIHBhcnRpYWwgZnJhbWUgaGVhZGVyLiAgUmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBtb3JlIGRhdGEgdG8gcmVhZCBhZnRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwgZnJhbWUgaGVhZGVyLiIpOworICAgICAgfQorICAgIH0KKyAgICBzaXplQnl0ZXNSZWFkICs9IGJ5dGVzUmVhZDsKKyAgfQorCisgIHN6ID0gbnRvaGwoc3pOKTsKKworICBlbnN1cmVSZWFkQnVmZmVyKDQpOworCisgIGlmICgoc3ogJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgLy8gdW5mcmFtZWQKKyAgICBjbGllbnRUeXBlID0gVEhSSUZUX1VORlJBTUVEX0JJTkFSWTsKKyAgICBtZW1jcHkockJ1Zl8uZ2V0KCksICZzek4sIHNpemVvZihzek4pKTsKKyAgICBzZXRSZWFkQnVmZmVyKHJCdWZfLmdldCgpLCA0KTsKKyAgfSBlbHNlIGlmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDI0KSA9PSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRAorICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN6ID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgPT0gVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9OKSB7CisgICAgY2xpZW50VHlwZSA9IFRIUklGVF9VTkZSQU1FRF9DT01QQUNUOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJnN6Tiwgc2l6ZW9mKHN6TikpOworICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIDQpOworICB9IGVsc2UgeworICAgIC8vIENvdWxkIGJlIGhlYWRlciBmb3JtYXQgb3IgZnJhbWVkLiBDaGVjayBuZXh0IHVpbnQzMgorICAgIHVpbnQzMl90IG1hZ2ljX247CisgICAgdWludDMyX3QgbWFnaWM7CisKKyAgICBpZiAoc3ogPiBNQVhfRlJBTUVfU0laRSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIGxhcmdlIik7CisgICAgfQorCisgICAgZW5zdXJlUmVhZEJ1ZmZlcihzeik7CisKKyAgICAvLyBXZSBjYW4gdXNlIHJlYWRBbGwgaGVyZSwgYmVjYXVzZSBpdCB3b3VsZCBiZSBhbiBpbnZhbGlkIGZyYW1lIG90aGVyd2lzZQorICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJm1hZ2ljX24pLCBzaXplb2YobWFnaWNfbikpOworICAgIG1lbWNweShyQnVmXy5nZXQoKSwgJm1hZ2ljX24sIHNpemVvZihtYWdpY19uKSk7CisgICAgbWFnaWMgPSBudG9obChtYWdpY19uKTsKKworICAgIGlmICgobWFnaWMgJiBUQmluYXJ5UHJvdG9jb2w6OlZFUlNJT05fTUFTSykgPT0gKHVpbnQzMl90KVRCaW5hcnlQcm90b2NvbDo6VkVSU0lPTl8xKSB7CisgICAgICAvLyBmcmFtZWQKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0JJTkFSWTsKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgIH0gZWxzZSBpZiAoc3RhdGljX2Nhc3Q8aW50OF90PihtYWdpYyA+PiAyNCkgPT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQKKyAgICAgICAgICAgICAgICYmIChzdGF0aWNfY2FzdDxpbnQ4X3Q+KG1hZ2ljID4+IDE2KSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICA9PSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OX04pIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfRlJBTUVEX0NPTVBBQ1Q7CisgICAgICB0cmFuc3BvcnRfLT5yZWFkQWxsKHJCdWZfLmdldCgpICsgNCwgc3ogLSA0KTsKKyAgICAgIHNldFJlYWRCdWZmZXIockJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgaWYgKEhFQURFUl9NQUdJQyA9PSAobWFnaWMgJiBIRUFERVJfTUFTSykpIHsKKyAgICAgIGlmIChzeiA8IDEwKSB7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciB0cmFuc3BvcnQgZnJhbWUgaXMgdG9vIHNtYWxsIik7CisgICAgICB9CisKKyAgICAgIHRyYW5zcG9ydF8tPnJlYWRBbGwockJ1Zl8uZ2V0KCkgKyA0LCBzeiAtIDQpOworCisgICAgICAvLyBoZWFkZXIgZm9ybWF0CisgICAgICBjbGllbnRUeXBlID0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRTsKKyAgICAgIC8vIGZsYWdzCisgICAgICBmbGFncyA9IG1hZ2ljICYgRkxBR1NfTUFTSzsKKyAgICAgIC8vIHNlcUlkCisgICAgICB1aW50MzJfdCBzZXFJZF9uOworICAgICAgbWVtY3B5KCZzZXFJZF9uLCByQnVmXy5nZXQoKSArIDQsIHNpemVvZihzZXFJZF9uKSk7CisgICAgICBzZXFJZCA9IG50b2hsKHNlcUlkX24pOworICAgICAgLy8gaGVhZGVyIHNpemUKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemVfbjsKKyAgICAgIG1lbWNweSgmaGVhZGVyU2l6ZV9uLCByQnVmXy5nZXQoKSArIDgsIHNpemVvZihoZWFkZXJTaXplX24pKTsKKyAgICAgIHVpbnQxNl90IGhlYWRlclNpemUgPSBudG9ocyhoZWFkZXJTaXplX24pOworICAgICAgc2V0UmVhZEJ1ZmZlcihyQnVmXy5nZXQoKSwgc3opOworICAgICAgcmVhZEhlYWRlckZvcm1hdChoZWFkZXJTaXplLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIGNsaWVudFR5cGUgPSBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IGNsaWVudCB0cmFuc3BvcnQgdHlwZSIpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFJlYWRzIGEgc3RyaW5nIGZyb20gcHRyLCB0YWtpbmcgY2FyZSBub3QgdG8gcmVhY2ggaGVhZGVyQm91bmRhcnkKKyAqIEFkdmFuY2VzIHB0ciBvbiBzdWNjZXNzCisgKgorICogQHBhcmFtICAgc3RyICAgICAgICAgICAgIG91dHB1dCBzdHJpbmcKKyAqIEB0aHJvd3MgIENPUlJVUFRFRF9EQVRBICBpZiBzaXplIG9mIHN0cmluZyBleGNlZWRzIGJvdW5kYXJ5CisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFN0cmluZyh1aW50OF90KiYgcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLyBzdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNvbnN0KiBoZWFkZXJCb3VuZGFyeSkgeworICBpbnQzMl90IHN0ckxlbjsKKworICB1aW50MzJfdCBieXRlcyA9IHJlYWRWYXJpbnQzMihwdHIsICZzdHJMZW4sIGhlYWRlckJvdW5kYXJ5KTsKKyAgaWYgKHN0ckxlbiA+IGhlYWRlckJvdW5kYXJ5IC0gcHRyKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZvIGhlYWRlciBsZW5ndGggZXhjZWVkcyBoZWFkZXIgc2l6ZSIpOworICB9CisgIHB0ciArPSBieXRlczsKKyAgc3RyLmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBzdHJMZW4pOworICBwdHIgKz0gc3RyTGVuOworfQorCit2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opIHsKKyAgcmVhZFRyYW5zXy5jbGVhcigpOyAgIC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgdHJhbnNmb3Jtcy4KKyAgcmVhZEhlYWRlcnNfLmNsZWFyKCk7IC8vIENsZWFyIG91dCBhbnkgcHJldmlvdXMgaGVhZGVycy4KKworICAvLyBza2lwIG92ZXIgYWxyZWFkeSBwcm9jZXNzZWQgbWFnaWMoNCksIHNlcUlkKDQpLCBoZWFkZXJTaXplKDIpCisgIHVpbnQ4X3QqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHJCdWZfLmdldCgpICsgMTApOworCisgIC8vIENhdGNoIGludGVnZXIgb3ZlcmZsb3csIGNoZWNrIGZvciByZWFzb25hYmxlIGhlYWRlciBzaXplCisgIGlmIChoZWFkZXJTaXplID49IDE2Mzg0KSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgfQorICBoZWFkZXJTaXplICo9IDQ7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlckJvdW5kYXJ5ID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgaWYgKGhlYWRlclNpemUgPiBzeikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNpemUgaXMgbGFyZ2VyIHRoYW4gZnJhbWUiKTsKKyAgfQorICB1aW50OF90KiBkYXRhID0gcHRyICsgaGVhZGVyU2l6ZTsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZwcm90b0lkLCBoZWFkZXJCb3VuZGFyeSk7CisgIGludDE2X3QgbnVtVHJhbnNmb3JtczsKKyAgcHRyICs9IHJlYWRWYXJpbnQxNihwdHIsICZudW1UcmFuc2Zvcm1zLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgLy8gRm9yIG5vdyBhbGwgdHJhbnNmb3JtcyBjb25zaXN0IG9mIG9ubHkgdGhlIElELCBub3QgZGF0YS4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpKyspIHsKKyAgICBpbnQzMl90IHRyYW5zSWQ7CisgICAgcHRyICs9IHJlYWRWYXJpbnQzMihwdHIsICZ0cmFuc0lkLCBoZWFkZXJCb3VuZGFyeSk7CisKKyAgICByZWFkVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsKKyAgfQorCisgIC8vIEluZm8gaGVhZGVycworICB3aGlsZSAocHRyIDwgaGVhZGVyQm91bmRhcnkpIHsKKyAgICBpbnQzMl90IGluZm9JZDsKKyAgICBwdHIgKz0gcmVhZFZhcmludDMyKHB0ciwgJmluZm9JZCwgaGVhZGVyQm91bmRhcnkpOworCisgICAgaWYgKGluZm9JZCA9PSAwKSB7CisgICAgICAvLyBoZWFkZXIgcGFkZGluZworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpbmZvSWQgPj0gaW5mb0lkVHlwZTo6RU5EKSB7CisgICAgICAvLyBjYW5ub3QgaGFuZGxlIGluZm9JZAorICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAoaW5mb0lkKSB7CisgICAgY2FzZSBpbmZvSWRUeXBlOjpLRVlWQUxVRToKKyAgICAgIC8vIFByb2Nlc3Mga2V5LXZhbHVlIGhlYWRlcnMKKyAgICAgIHVpbnQzMl90IG51bUtWSGVhZGVyczsKKyAgICAgIHB0ciArPSByZWFkVmFyaW50MzIocHRyLCAoaW50MzJfdCopJm51bUtWSGVhZGVycywgaGVhZGVyQm91bmRhcnkpOworICAgICAgLy8gY29udGludWUgdW50aWwgd2UgcmVhY2ggKHBhZGRlZCkgZW5kIG9mIHBhY2tldAorICAgICAgd2hpbGUgKG51bUtWSGVhZGVycy0tICYmIHB0ciA8IGhlYWRlckJvdW5kYXJ5KSB7CisgICAgICAgIC8vIGZvcm1hdDoga2V5OyB2YWx1ZQorICAgICAgICAvLyBib3RoOiBsZW5ndGggKHZhcmludDMyKTsgdmFsdWUgKHN0cmluZykKKyAgICAgICAgc3RyaW5nIGtleSwgdmFsdWU7CisgICAgICAgIHJlYWRTdHJpbmcocHRyLCBrZXksIGhlYWRlckJvdW5kYXJ5KTsKKyAgICAgICAgLy8gdmFsdWUKKyAgICAgICAgcmVhZFN0cmluZyhwdHIsIHZhbHVlLCBoZWFkZXJCb3VuZGFyeSk7CisgICAgICAgIC8vIHNhdmUgdG8gaGVhZGVycworICAgICAgICByZWFkSGVhZGVyc19ba2V5XSA9IHZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gVW50cmFuc2Zvcm0gdGhlIGRhdGEgc2VjdGlvbi4gIHJCdWYgd2lsbCBjb250YWluIHJlc3VsdC4KKyAgdW50cmFuc2Zvcm0oZGF0YSwgc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHN0YXRpY19jYXN0PHB0cmRpZmZfdD4oc3opIC0gKGRhdGEgLSByQnVmXy5nZXQoKSkpKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0Ojp1bnRyYW5zZm9ybSh1aW50OF90KiBwdHIsIHVpbnQzMl90IHN6KSB7CisgIC8vIFVwZGF0ZSB0aGUgdHJhbnNmb3JtIGJ1ZmZlciBzaXplIGlmIG5lZWRlZAorICByZXNpemVUcmFuc2Zvcm1CdWZmZXIoKTsKKworICBmb3IgKHZlY3Rvcjx1aW50MTZfdD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVhZFRyYW5zXy5iZWdpbigpOyBpdCAhPSByZWFkVHJhbnNfLmVuZCgpOyArK2l0KSB7CisgICAgY29uc3QgdWludDE2X3QgdHJhbnNJZCA9ICppdDsKKworICAgIGlmICh0cmFuc0lkID09IFpMSUJfVFJBTlNGT1JNKSB7CisgICAgICB6X3N0cmVhbSBzdHJlYW07CisgICAgICBpbnQgZXJyOworCisgICAgICBzdHJlYW0ubmV4dF9pbiA9IHB0cjsKKyAgICAgIHN0cmVhbS5hdmFpbF9pbiA9IHN6OworCisgICAgICAvLyBTZXR0aW5nIHRoZXNlIHRvIDAgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IGZyZWUvYWxsb2MgZnVuY3Rpb25zCisgICAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKKyAgICAgIHN0cmVhbS5vcGFxdWUgPSAodm9pZHBmKTA7CisgICAgICBlcnIgPSBpbmZsYXRlSW5pdCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICBzdHJlYW0ubmV4dF9vdXQgPSB0QnVmXy5nZXQoKTsKKyAgICAgIHN0cmVhbS5hdmFpbF9vdXQgPSB0QnVmU2l6ZV87CisgICAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EIHx8IHN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGUiKTsKKyAgICAgIH0KKyAgICAgIHN6ID0gc3RyZWFtLnRvdGFsX291dDsKKworICAgICAgZXJyID0gaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpNSVNTSU5HX1JFU1VMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVFbmQiKTsKKyAgICAgIH0KKworICAgICAgbWVtY3B5KHB0ciwgdEJ1Zl8uZ2V0KCksIHN6KTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6TUlTU0lOR19SRVNVTFQsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHNldFJlYWRCdWZmZXIocHRyLCBzeik7Cit9CisKKy8qKgorICogV2UgbWF5IGhhdmUgdXBkYXRlZCB0aGUgd0J1ZiBzaXplLCB1cGRhdGUgdGhlIHRCdWYgc2l6ZSB0byBtYXRjaC4KKyAqIFNob3VsZCBiZSBjYWxsZWQgaW4gdHJhbnNmb3JtLgorICoKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGJlIHNsaWdodGx5IGxhcmdlciB0aGFuIHdyaXRlIGJ1ZmZlciBzaXplIGR1ZSB0bworICogY29tcHJlc3Npb24gdHJhbnNmb3JtcyAodGhhdCBtYXkgc2xpZ2h0bHkgZ3JvdyBvbiBzbWFsbCBmcmFtZSBzaXplcykKKyAqLwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpyZXNpemVUcmFuc2Zvcm1CdWZmZXIodWludDMyX3QgYWRkaXRpb25hbFNpemUpIHsKKyAgaWYgKHRCdWZTaXplXyA8IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUpIHsKKyAgICB1aW50MzJfdCBuZXdfc2l6ZSA9IHdCdWZTaXplXyArIERFRkFVTFRfQlVGRkVSX1NJWkUgKyBhZGRpdGlvbmFsU2l6ZTsKKyAgICB1aW50OF90KiBuZXdfYnVmID0gbmV3IHVpbnQ4X3RbbmV3X3NpemVdOworICAgIHRCdWZfLnJlc2V0KG5ld19idWYpOworICAgIHRCdWZTaXplXyA9IG5ld19zaXplOworICB9Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6dHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKKyAgLy8gVXBkYXRlIHRoZSB0cmFuc2Zvcm0gYnVmZmVyIHNpemUgaWYgbmVlZGVkCisgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcigpOworCisgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IHVpbnQxNl90IHRyYW5zSWQgPSAqaXQ7CisKKyAgICBpZiAodHJhbnNJZCA9PSBaTElCX1RSQU5TRk9STSkgeworICAgICAgel9zdHJlYW0gc3RyZWFtOworICAgICAgaW50IGVycjsKKworICAgICAgc3RyZWFtLm5leHRfaW4gPSBwdHI7CisgICAgICBzdHJlYW0uYXZhaWxfaW4gPSBzejsKKworICAgICAgc3RyZWFtLnphbGxvYyA9IChhbGxvY19mdW5jKTA7CisgICAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisgICAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOworICAgICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKKyAgICAgIGlmIChlcnIgIT0gWl9PSykgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSB6bGliIGRlZmxhdGVJbml0Iik7CisgICAgICB9CisgICAgICB1aW50MzJfdCB0YnVmX3NpemUgPSAwOworICAgICAgd2hpbGUgKGVyciA9PSBaX09LKSB7CisgICAgICAgIHJlc2l6ZVRyYW5zZm9ybUJ1ZmZlcih0YnVmX3NpemUpOworCisgICAgICAgIHN0cmVhbS5uZXh0X291dCA9IHRCdWZfLmdldCgpOworICAgICAgICBzdHJlYW0uYXZhaWxfb3V0ID0gdEJ1ZlNpemVfOworICAgICAgICBlcnIgPSBkZWZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICAgICAgdGJ1Zl9zaXplICs9IERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgICB9CisgICAgICBzeiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICAgIGVyciA9IGRlZmxhdGVFbmQoJnN0cmVhbSk7CisgICAgICBpZiAoZXJyICE9IFpfT0spIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgemxpYiBkZWZsYXRlRW5kIik7CisgICAgICB9CisKKyAgICAgIG1lbWNweShwdHIsIHRCdWZfLmdldCgpLCBzeik7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsICJVbmtub3duIHRyYW5zZm9ybSIpOworICAgIH0KKyAgfQorCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpICsgc3o7Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVzZXRQcm90b2NvbCgpIHsKKyAgLy8gU2V0IHRvIGFueXRoaW5nIGV4Y2VwdCBIVFRQIHR5cGUgc28gd2UgZG9uJ3QgZmx1c2ggYWdhaW4KKyAgY2xpZW50VHlwZSA9IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEU7CisKKyAgLy8gUmVhZCB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hpY2ggcHJvdG9jb2wgdG8gZ28gd2l0aAorICByZWFkRnJhbWUoKTsKK30KKwordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0V3JpdGVCeXRlcygpIHsKKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90Pih3QmFzZV8gLSB3QnVmXy5nZXQoKSk7Cit9CisKKy8qKgorICogV3JpdGVzIGEgc3RyaW5nIHRvIGEgYnl0ZSBidWZmZXIsIGFzIHNpemUgKHZhcmludDMyKSArIHN0cmluZyAobm9uLW51bGwKKyAqIHRlcm1pbmF0ZWQpCisgKiBBdXRvbWF0aWNhbGx5IGFkdmFuY2VzIHB0ciB0byBhZnRlciB0aGUgd3JpdHRlbiBwb3J0aW9uCisgKi8KK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6d3JpdGVTdHJpbmcodWludDhfdComIHB0ciwgY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgaW50MzJfdCBzdHJMZW4gPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90PihzdHIubGVuZ3RoKCkpOworICBwdHIgKz0gd3JpdGVWYXJpbnQzMihzdHJMZW4sIHB0cik7CisgIG1lbWNweShwdHIsIHN0ci5jX3N0cigpLCBzdHJMZW4pOyAvLyBubyBuZWVkIHRvIHdyaXRlIFwwCisgIHB0ciArPSBzdHJMZW47Cit9CisKK3ZvaWQgVEhlYWRlclRyYW5zcG9ydDo6c2V0SGVhZGVyKGNvbnN0IHN0cmluZyYga2V5LCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7CisgIHdyaXRlSGVhZGVyc19ba2V5XSA9IHZhbHVlOworfQorCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3QgeworICBzaXplX3QgbWF4V3JpdGVIZWFkZXJzU2l6ZSA9IDA7CisgIFRIZWFkZXJUcmFuc3BvcnQ6OlN0cmluZ1RvU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IHdyaXRlSGVhZGVyc18uYmVnaW4oKTsgaXQgIT0gd3JpdGVIZWFkZXJzXy5lbmQoKTsgKytpdCkgeworICAgIC8vIGFkZCBzaXplcyBvZiBrZXkgYW5kIHZhbHVlIHRvIG1heFdyaXRlSGVhZGVyc1NpemUKKyAgICAvLyAyIHZhcmludHMzMiArIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMKKyAgICBtYXhXcml0ZUhlYWRlcnNTaXplICs9IDUgKyA1ICsgKGl0LT5maXJzdCkubGVuZ3RoKCkgKyAoaXQtPnNlY29uZCkubGVuZ3RoKCk7CisgIH0KKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihtYXhXcml0ZUhlYWRlcnNTaXplKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpjbGVhckhlYWRlcnMoKSB7CisgIHdyaXRlSGVhZGVyc18uY2xlYXIoKTsKK30KKwordm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpmbHVzaCgpIHsKKyAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlci4KKyAgdWludDMyX3QgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOworCisgIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9IRUFERVJfQ0xJRU5UX1RZUEUpIHsKKyAgICB0cmFuc2Zvcm0od0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgICAgaGF2ZUJ5dGVzID0gZ2V0V3JpdGVCeXRlcygpOyAvLyB0cmFuc2Zvcm0gbWF5IGhhdmUgY2hhbmdlZCB0aGUgc2l6ZQorICB9CisKKyAgLy8gTm90ZSB0aGF0IHdlIHJlc2V0IHdCYXNlXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgIHdCYXNlXyA9IHdCdWZfLmdldCgpOworCisgIGlmIChoYXZlQnl0ZXMgPiBNQVhfRlJBTUVfU0laRSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBzZW5kIGZyYW1lIHRoYXQgaXMgdG9vIGxhcmdlIik7CisgIH0KKworICBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFKSB7CisgICAgLy8gaGVhZGVyIHNpemUgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgdGhlIGVuZCBiZWNhdXNlIG9mIHZhcmludHMuCisgICAgLy8gTWFrZSBpdCBiaWcgZW5vdWdoIGhlcmUgZm9yIG1heCB2YXJpbnQgc2l6ZSwgcGx1cyA0IGZvciBwYWRkaW5nLgorICAgIHVpbnQzMl90IGhlYWRlclNpemUgPSAoMiArIGdldE51bVRyYW5zZm9ybXMoKSkgKiBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTICsgNDsKKyAgICAvLyBhZGQgYXBwcm94aW1hdGUgc2l6ZSBvZiBpbmZvIGhlYWRlcnMKKyAgICBoZWFkZXJTaXplICs9IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKTsKKworICAgIC8vIFBrdCBzaXplCisgICAgdWludDMyX3QgbWF4U3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICArIDEwOyAgICAgICAgICAgICAgICAgIC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIHVpbnQ4X3QqIHBrdCA9IHRCdWZfLmdldCgpOworICAgIHVpbnQ4X3QqIGhlYWRlclN0YXJ0OworICAgIHVpbnQ4X3QqIGhlYWRlclNpemVQdHI7CisgICAgdWludDhfdCogcGt0U3RhcnQgPSBwa3Q7CisKKyAgICBpZiAobWF4U3pIYm8gPiB0QnVmU2l6ZV8pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIGhlYWRlciBmcmFtZSB0aGF0IGlzIHRvbyBsYXJnZSIpOworICAgIH0KKworICAgIHVpbnQzMl90IHN6SGJvOworICAgIHVpbnQzMl90IHN6TmJvOworICAgIHVpbnQxNl90IGhlYWRlclNpemVOOworCisgICAgLy8gRml4dXAgc3pIYm8gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKHN6TmJvKTsKKyAgICB1aW50MTZfdCBoZWFkZXJOID0gaHRvbnMoSEVBREVSX01BR0lDID4+IDE2KTsKKyAgICBtZW1jcHkocGt0LCAmaGVhZGVyTiwgc2l6ZW9mKGhlYWRlck4pKTsKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlck4pOworICAgIHVpbnQxNl90IGZsYWdzTiA9IGh0b25zKGZsYWdzKTsKKyAgICBtZW1jcHkocGt0LCAmZmxhZ3NOLCBzaXplb2YoZmxhZ3NOKSk7CisgICAgcGt0ICs9IHNpemVvZihmbGFnc04pOworICAgIHVpbnQzMl90IHNlcUlkTiA9IGh0b25sKHNlcUlkKTsKKyAgICBtZW1jcHkocGt0LCAmc2VxSWROLCBzaXplb2Yoc2VxSWROKSk7CisgICAgcGt0ICs9IHNpemVvZihzZXFJZE4pOworICAgIGhlYWRlclNpemVQdHIgPSBwa3Q7CisgICAgLy8gRml4dXAgaGVhZGVyU2l6ZU4gbGF0ZXIKKyAgICBwa3QgKz0gc2l6ZW9mKGhlYWRlclNpemVOKTsKKyAgICBoZWFkZXJTdGFydCA9IHBrdDsKKworICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHByb3RvSWQsIHBrdCk7CisgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoZ2V0TnVtVHJhbnNmb3JtcygpLCBwa3QpOworCisgICAgLy8gRm9yIG5vdywgZWFjaCB0cmFuc2Zvcm0gaXMgb25seSB0aGUgSUQsIG5vIGZvbGxvd2luZyBkYXRhLgorICAgIGZvciAodmVjdG9yPHVpbnQxNl90Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB3cml0ZVRyYW5zXy5iZWdpbigpOyBpdCAhPSB3cml0ZVRyYW5zXy5lbmQoKTsgKytpdCkgeworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoKml0LCBwa3QpOworICAgIH0KKworICAgIC8vIHdyaXRlIGluZm8gaGVhZGVycworCisgICAgLy8gZm9yIG5vdyBvbmx5IHdyaXRlIGt2LWhlYWRlcnMKKyAgICBpbnQzMl90IGhlYWRlckNvdW50ID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4od3JpdGVIZWFkZXJzXy5zaXplKCkpOworICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHsKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGluZm9JZFR5cGU6OktFWVZBTFVFLCBwa3QpOworICAgICAgLy8gV3JpdGUga2V5LXZhbHVlIGhlYWRlcnMgY291bnQKKyAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGhlYWRlckNvdW50KSwgcGt0KTsKKyAgICAgIC8vIFdyaXRlIGluZm8gaGVhZGVycworICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgICAgICBmb3IgKGl0ID0gd3JpdGVIZWFkZXJzXy5iZWdpbigpOyBpdCAhPSB3cml0ZUhlYWRlcnNfLmVuZCgpOyArK2l0KSB7CisgICAgICAgIHdyaXRlU3RyaW5nKHBrdCwgaXQtPmZpcnN0KTsgIC8vIGtleQorICAgICAgICB3cml0ZVN0cmluZyhwa3QsIGl0LT5zZWNvbmQpOyAvLyB2YWx1ZQorICAgICAgfQorICAgICAgd3JpdGVIZWFkZXJzXy5jbGVhcigpOworICAgIH0KKworICAgIC8vIEZpeHVwcyBhZnRlciB2YXJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMKKyAgICBoZWFkZXJTaXplID0gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHBrdCAtIGhlYWRlclN0YXJ0KTsKKyAgICB1aW50OF90IHBhZGRpbmcgPSA0IC0gKGhlYWRlclNpemUgJSA0KTsKKyAgICBoZWFkZXJTaXplICs9IHBhZGRpbmc7CisKKyAgICAvLyBQYWQgb3V0IHBrdCB3aXRoIDB4MDAKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhZGRpbmc7IGkrKykgeworICAgICAgKihwa3QrKykgPSAweDAwOworICAgIH0KKworICAgIC8vIFBrdCBzaXplCisgICAgcHRyZGlmZl90IHN6SGJwID0gKGhlYWRlclN0YXJ0IC0gcGt0U3RhcnQgLSA0KTsKKyAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN6SGJwKSA+IHN0YXRpY19jYXN0PHVpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD4oKS5tYXgpKCkpIC0gKGhlYWRlclNpemUgKyBoYXZlQnl0ZXMpKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVhZGVyIHNlY3Rpb24gc2l6ZSBpcyB1bnJlYXNvbmFibGUiKTsKKyAgICB9CisgICAgc3pIYm8gPSBoZWFkZXJTaXplICsgaGF2ZUJ5dGVzICAgICAgICAgIC8vIHRocmlmdCBoZWFkZXIgKyBwYXlsb2FkCisgICAgICAgICAgICArIHN0YXRpY19jYXN0PHVpbnQzMl90PihzekhicCk7IC8vIGNvbW1vbiBoZWFkZXIgc2VjdGlvbgorICAgIGhlYWRlclNpemVOID0gaHRvbnMoaGVhZGVyU2l6ZSAvIDQpOworICAgIG1lbWNweShoZWFkZXJTaXplUHRyLCAmaGVhZGVyU2l6ZU4sIHNpemVvZihoZWFkZXJTaXplTikpOworCisgICAgLy8gU2V0IGZyYW1pbmcgc2l6ZS4KKyAgICBzek5ibyA9IGh0b25sKHN6SGJvKTsKKyAgICBtZW1jcHkocGt0U3RhcnQsICZzek5ibywgc2l6ZW9mKHN6TmJvKSk7CisKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZShwa3RTdGFydCwgc3pIYm8gLSBoYXZlQnl0ZXMgKyA0KTsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIGlmIChjbGllbnRUeXBlID09IFRIUklGVF9GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX0ZSQU1FRF9DT01QQUNUKSB7CisgICAgdWludDMyX3Qgc3pIYm8gPSAodWludDMyX3QpaGF2ZUJ5dGVzOworICAgIHVpbnQzMl90IHN6TmJvID0gaHRvbmwoc3pIYm8pOworCisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnN6TmJvKSwgNCk7CisgICAgb3V0VHJhbnNwb3J0Xy0+d3JpdGUod0J1Zl8uZ2V0KCksIGhhdmVCeXRlcyk7CisgIH0gZWxzZSBpZiAoY2xpZW50VHlwZSA9PSBUSFJJRlRfVU5GUkFNRURfQklOQVJZIHx8IGNsaWVudFR5cGUgPT0gVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QpIHsKKyAgICBvdXRUcmFuc3BvcnRfLT53cml0ZSh3QnVmXy5nZXQoKSwgaGF2ZUJ5dGVzKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLCAiVW5rbm93biBjbGllbnQgdHlwZSIpOworICB9CisKKyAgLy8gRmx1c2ggdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICBvdXRUcmFuc3BvcnRfLT5mbHVzaCgpOworfQorCisvKioKKyAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAzIGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MTYodWludDhfdCBjb25zdCogcHRyLCBpbnQxNl90KiBpMTYsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisgIGludDMyX3QgdmFsOworICB1aW50MzJfdCByc2l6ZSA9IHJlYWRWYXJpbnQzMihwdHIsICZ2YWwsIGJvdW5kYXJ5KTsKKyAgKmkxNiA9IChpbnQxNl90KXZhbDsKKyAgcmV0dXJuIHJzaXplOworfQorCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCit1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpyZWFkVmFyaW50MzIodWludDhfdCBjb25zdCogcHRyLCBpbnQzMl90KiBpMzIsIHVpbnQ4X3QgY29uc3QqIGJvdW5kYXJ5KSB7CisKKyAgdWludDMyX3QgcnNpemUgPSAwOworICB1aW50MzJfdCB2YWwgPSAwOworICBpbnQgc2hpZnQgPSAwOworCisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKHB0ciA9PSBib3VuZGFyeSkgeworICAgICAgdGhyb3cgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byByZWFkIHBhc3QgaGVhZGVyIGJvdW5kYXJ5Iik7CisgICAgfQorICAgIHVpbnQ4X3QgYnl0ZSA9ICoocHRyKyspOworICAgIHJzaXplKys7CisgICAgdmFsIHw9ICh1aW50NjRfdCkoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0OworICAgIHNoaWZ0ICs9IDc7CisgICAgaWYgKCEoYnl0ZSAmIDB4ODApKSB7CisgICAgICAqaTMyID0gdmFsOworICAgICAgcmV0dXJuIHJzaXplOworICAgIH0KKyAgfQorfQorCisvKioKKyAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgKi8KK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MzIoaW50MzJfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgdWludDhfdCBidWZbNV07CisgIHVpbnQzMl90IHdzaXplID0gMDsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7CisgICAgICBidWZbd3NpemUrK10gPSAoaW50OF90KW47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKGludDhfdCkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgbiA+Pj0gNzsKKyAgICB9CisgIH0KKworICAvLyBDYWxsZXIgd2lsbCBhZHZhbmNlIHBrdC4KKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHdzaXplOyBpKyspIHsKKyAgICBwa3RbaV0gPSBidWZbaV07CisgIH0KKworICByZXR1cm4gd3NpemU7Cit9CisKK3VpbnQzMl90IFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpIHsKKyAgcmV0dXJuIHdyaXRlVmFyaW50MzIobiwgcGt0KTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM1N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8KKyNkZWZpbmUgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfIDEKKworI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bWFwPgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VsaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX2FycmF5LmhwcD4KKworI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUeXBlcy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisKK2VudW0gQ0xJRU5UX1RZUEUgeworICBUSFJJRlRfSEVBREVSX0NMSUVOVF9UWVBFID0gMCwKKyAgVEhSSUZUX0ZSQU1FRF9CSU5BUlkgPSAxLAorICBUSFJJRlRfVU5GUkFNRURfQklOQVJZID0gMiwKKyAgVEhSSUZUX0ZSQU1FRF9DT01QQUNUID0gMywKKyAgVEhSSUZUX1VORlJBTUVEX0NPTVBBQ1QgPSA0LAorICBUSFJJRlRfVU5LTk9XTl9DTElFTlRfVFlQRSA9IDUsCit9OworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9DT01QQUNUX1BST1RPQ09MOworCisvKioKKyAqIEhlYWRlciB0cmFuc3BvcnQuIEFsbCB3cml0ZXMgZ28gaW50byBhbiBpbi1tZW1vcnkgYnVmZmVyIHVudGlsIGZsdXNoIGlzCisgKiBjYWxsZWQsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc3BvcnQgd3JpdGVzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZQorICogYmluYXJ5IGNodW5rIGZvbGxvd2VkIGJ5IHRoZSBkYXRhIHBheWxvYWQuIFRoaXMgYWxsb3dzIHRoZSByZWNlaXZlciBvbiB0aGUKKyAqIG90aGVyIGVuZCB0byBhbHdheXMgZG8gZml4ZWQtbGVuZ3RoIHJlYWRzLgorICoKKyAqIFN1YmNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgYmVjYXVzZSBtb3N0IG9mIHRoZSByZWFkL3dyaXRlIG1ldGhvZHMgYXJlIHNpbWlsYXIKKyAqIGFuZCBuZWVkIHNpbWlsYXIgYnVmZmVycy4gIE1ham9yIGNoYW5nZXMgYXJlIHJlYWRGcmFtZSAmIGZsdXNoLgorICoKKyAqIEhlYWRlciBUcmFuc3BvcnQgKm11c3QqIGJlIHRoZSBzYW1lIHRyYW5zcG9ydCBmb3IgYm90aCBpbnB1dCBhbmQKKyAqIG91dHB1dCB3aGVuIHVzZWQgb24gdGhlIHNlcnZlciBzaWRlIC0gY2xpZW50IHJlc3BvbnNlcyBzaG91bGQgYmUKKyAqIHRoZSBzYW1lIHByb3RvY29sIGFzIHRob3NlIGluIHRoZSByZXF1ZXN0LgorICovCitjbGFzcyBUSGVhZGVyVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRIZWFkZXJUcmFuc3BvcnQsIFRGcmFtZWRUcmFuc3BvcnQ+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEydTsKKyAgc3RhdGljIGNvbnN0IGludCBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTID0gNTsKKworICAvLy8gVXNlIGRlZmF1bHQgYnVmZmVyIHNpemVzLgorICBleHBsaWNpdCBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0KQorICAgIDogVFZpcnR1YWxUcmFuc3BvcnQodHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8odHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJ0cmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydCkKKyAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KGluVHJhbnNwb3J0KSwKKyAgICAgIG91dFRyYW5zcG9ydF8ob3V0VHJhbnNwb3J0KSwKKyAgICAgIHByb3RvSWQoVF9DT01QQUNUX1BST1RPQ09MKSwKKyAgICAgIGNsaWVudFR5cGUoVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSksCisgICAgICBzZXFJZCgwKSwKKyAgICAgIGZsYWdzKDApLAorICAgICAgdEJ1ZlNpemVfKDApLAorICAgICAgdEJ1Zl8oTlVMTCkgeworICAgIGlmICghdHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJpblRyYW5zcG9ydCBpcyBlbXB0eSIpOworICAgIGlmICghb3V0VHJhbnNwb3J0XykgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJvdXRUcmFuc3BvcnQgaXMgZW1wdHkiKTsKKyAgICBpbml0QnVmZmVycygpOworICB9CisKKyAgdmlydHVhbCB1aW50MzJfdCByZWFkU2xvdyh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOworCisgIHZvaWQgcmVzaXplVHJhbnNmb3JtQnVmZmVyKHVpbnQzMl90IGFkZGl0aW9uYWxTaXplID0gMCk7CisKKyAgdWludDE2X3QgZ2V0UHJvdG9jb2xJZCgpIGNvbnN0OworICB2b2lkIHNldFByb3RvY29sSWQodWludDE2X3QgcHJvdG9JZCkgeyB0aGlzLT5wcm90b0lkID0gcHJvdG9JZDsgfQorCisgIHZvaWQgcmVzZXRQcm90b2NvbCgpOworCisgIC8qKgorICAgKiBXZSBrbm93IHdlIGdvdCBhIHBhY2tldCBpbiBoZWFkZXIgZm9ybWF0IGhlcmUsIHRyeSB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAqCisgICAqIEBwYXJhbSBoZWFkZXJTaXplIHNpemUgb2YgdGhlIGhlYWRlciBwb3J0aW9uCisgICAqIEBwYXJhbSBzeiBTaXplIG9mIHRoZSB3aG9sZSBtZXNzYWdlLCBpbmNsdWRpbmcgaGVhZGVyCisgICAqLworICB2b2lkIHJlYWRIZWFkZXJGb3JtYXQodWludDE2X3QgaGVhZGVyU2l6ZSwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBVbnRyYW5zZm9ybSB0aGUgZGF0YSBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgaGVhZGVyIGZsYWdzCisgICAqIE9uIGNvbmNsdXNpb24gb2YgZnVuY3Rpb24sIHNldFJlYWRCdWZmZXIgaXMgY2FsbGVkIHdpdGggdGhlCisgICAqIHVudHJhbnNmb3JtZWQgZGF0YS4KKyAgICoKKyAgICogQHBhcmFtIHB0ciBwdHIgdG8gZGF0YQorICAgKiBAcGFyYW0gc2l6ZSBvZiBkYXRhCisgICAqLworICB2b2lkIHVudHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOworCisgIC8qKgorICAgKiBUcmFuc2Zvcm0gdGhlIGRhdGEgYmFzZWQgb24gb3VyIHdyaXRlIHRyYW5zZm9ybSBmbGFncworICAgKiBBdCBjb25jbHVzaW9uIG9mIGZ1bmN0aW9uIHRoZSB3cml0ZSBidWZmZXIgaXMgc2V0IHRvIHRoZQorICAgKiB0cmFuc2Zvcm1lZCBkYXRhLgorICAgKgorICAgKiBAcGFyYW0gcHRyIFB0ciB0byBkYXRhIHRvIHRyYW5zZm9ybQorICAgKiBAcGFyYW0gc3ogU2l6ZSBvZiBkYXRhIGJ1ZmZlcgorICAgKi8KKyAgdm9pZCB0cmFuc2Zvcm0odWludDhfdCogcHRyLCB1aW50MzJfdCBzeik7CisKKyAgdWludDE2X3QgZ2V0TnVtVHJhbnNmb3JtcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDE2X3Q+KHdyaXRlVHJhbnNfLnNpemUoKSk7CisgIH0KKworICB2b2lkIHNldFRyYW5zZm9ybSh1aW50MTZfdCB0cmFuc0lkKSB7IHdyaXRlVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsgfQorCisgIC8vIEluZm8gaGVhZGVycworCisgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBTdHJpbmdUb1N0cmluZ01hcDsKKworICAvLyB0aGVzZSB3b3JrIHdpdGggd3JpdGUgaGVhZGVycworICB2b2lkIHNldEhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpOworCisgIHZvaWQgY2xlYXJIZWFkZXJzKCk7CisKKyAgU3RyaW5nVG9TdHJpbmdNYXAmIGdldFdyaXRlSGVhZGVycygpIHsgcmV0dXJuIHdyaXRlSGVhZGVyc187IH0KKworICAvLyB0aGVzZSB3b3JrIHdpdGggcmVhZCBoZWFkZXJzCisgIGNvbnN0IFN0cmluZ1RvU3RyaW5nTWFwJiBnZXRIZWFkZXJzKCkgY29uc3QgeyByZXR1cm4gcmVhZEhlYWRlcnNfOyB9CisKKyAgLy8gYWNjZXNzb3JzIGZvciBzZXFJZAorICBpbnQzMl90IGdldFNlcXVlbmNlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gc2VxSWQ7IH0KKyAgdm9pZCBzZXRTZXF1ZW5jZU51bWJlcihpbnQzMl90IHNlcUlkKSB7IHRoaXMtPnNlcUlkID0gc2VxSWQ7IH0KKworICBlbnVtIFRSQU5TRk9STVMgeworICAgIFpMSUJfVFJBTlNGT1JNID0gMHgwMSwKKyAgfTsKKworcHJvdGVjdGVkOgorICAvKioKKyAgICogUmVhZHMgYSBmcmFtZSBvZiBpbnB1dCBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICoKKyAgICogUmV0dXJucyB0cnVlIGlmIGEgZnJhbWUgd2FzIHJlYWQgc3VjY2Vzc2Z1bGx5LCBvciBmYWxzZSBvbiBFT0YuCisgICAqIChSYWlzZXMgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIEVPRiBvY2N1cnMgYWZ0ZXIgYSBwYXJ0aWFsIGZyYW1lLikKKyAgICovCisgIHZpcnR1YWwgYm9vbCByZWFkRnJhbWUoKTsKKworICB2b2lkIGVuc3VyZVJlYWRCdWZmZXIodWludDMyX3Qgc3opOworICB1aW50MzJfdCBnZXRXcml0ZUJ5dGVzKCk7CisKKyAgdm9pZCBpbml0QnVmZmVycygpIHsKKyAgICBzZXRSZWFkQnVmZmVyKE5VTEwsIDApOworICAgIHNldFdyaXRlQnVmZmVyKHdCdWZfLmdldCgpLCB3QnVmU2l6ZV8pOworICB9CisKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zcG9ydF87CisKKyAgLy8gMCBhbmQgMTZ0aCBiaXRzIG11c3QgYmUgMCB0byBkaWZmZXJlbnRpYXRlIGZyb20gZnJhbWVkICYgdW5mcmFtZWQKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEhFQURFUl9NQUdJQyA9IDB4MEZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBIRUFERVJfTUFTSyA9IDB4RkZGRjAwMDA7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHU19NQVNLID0gMHgwMDAwRkZGRjsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0ZSQU1FX1NJWkUgPSAweDNGRkZGRkZGOworCisgIGludDE2X3QgcHJvdG9JZDsKKyAgdWludDE2X3QgY2xpZW50VHlwZTsKKyAgdWludDMyX3Qgc2VxSWQ7CisgIHVpbnQxNl90IGZsYWdzOworCisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiByZWFkVHJhbnNfOworICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gd3JpdGVUcmFuc187CisKKyAgLy8gTWFwIHRvIHVzZSBmb3IgaGVhZGVycworICBTdHJpbmdUb1N0cmluZ01hcCByZWFkSGVhZGVyc187CisgIFN0cmluZ1RvU3RyaW5nTWFwIHdyaXRlSGVhZGVyc187CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd3JpdGUgay92IGhlYWRlcnMgY2FuIHRha2UKKyAgICovCisgIHVpbnQzMl90IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKSBjb25zdDsKKworICBzdHJ1Y3QgaW5mb0lkVHlwZSB7CisgICAgZW51bSBpZFR5cGUgeworICAgICAgLy8gc3RhcnQgYXQgMSB0byBhdm9pZCBjb25mdXNpbmcgaGVhZGVyIHBhZGRpbmcgZm9yIGFuIGluZm9JZAorICAgICAgS0VZVkFMVUUgPSAxLAorICAgICAgRU5EIC8vIHNpZ25hbCB0aGUgZW5kIG9mIGluZm9JZHMgd2UgY2FuIGhhbmRsZQorICAgIH07CisgIH07CisKKyAgLy8gQnVmZmVycyB0byB1c2UgZm9yIHRyYW5zZm9ybSBwcm9jZXNzaW5nCisgIHVpbnQzMl90IHRCdWZTaXplXzsKKyAgYm9vc3Q6OnNjb3BlZF9hcnJheTx1aW50OF90PiB0QnVmXzsKKworICB2b2lkIHJlYWRTdHJpbmcodWludDhfdComIHB0ciwgLyogb3V0ICovIHN0ZDo6c3RyaW5nJiBzdHIsIHVpbnQ4X3QgY29uc3QqIGhlYWRlckJvdW5kYXJ5KTsKKworICB2b2lkIHdyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpOworCisgIC8vIFZhcmludCB1dGlscworICAvKioKKyAgICogUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMyBieXRlcy4KKyAgICovCisgIHVpbnQzMl90IHJlYWRWYXJpbnQxNih1aW50OF90IGNvbnN0KiBwdHIsIGludDE2X3QqIGkxNiwgdWludDhfdCBjb25zdCogYm91bmRhcnkpOworCisgIC8qKgorICAgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICAgKi8KKyAgdWludDMyX3QgcmVhZFZhcmludDMyKHVpbnQ4X3QgY29uc3QqIHB0ciwgaW50MzJfdCogaTMyLCB1aW50OF90IGNvbnN0KiBib3VuZGFyeSk7CisKKyAgLyoqCisgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAqLworICB1aW50MzJfdCB3cml0ZVZhcmludDMyKGludDMyX3QgbiwgdWludDhfdCogcGt0KTsKKworICAvKioKKyAgICogV3JpdGUgYW4gaTE2IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMyBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICovCisgIHVpbnQzMl90IHdyaXRlVmFyaW50MTYoaW50MTZfdCBuLCB1aW50OF90KiBwa3QpOworfTsKKworLyoqCisgKiBXcmFwcyBhIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAqCisgKi8KK2NsYXNzIFRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5IDogcHVibGljIFRUcmFuc3BvcnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgVEhlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQorCisgIHZpcnR1YWwgflRIZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KKworICAvKioKKyAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgaGVhZGVyIG9uZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zKSk7CisgIH0KK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgVEhSSUZUX1RSQU5TUE9SVF9USEVBREVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCmluZGV4IGE0NzcxNjIuLmQxNTIxOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuY3BwCkBAIC0xNywzMyArMTcsNDIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8Y3N0ZGxpYj4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogCisjaW5jbHVkZSA8dGhyaWZ0L2NvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCi11c2luZyBuYW1lc3BhY2Ugc3RkOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi1USHR0cENsaWVudDo6VEh0dHBDbGllbnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoKSA6Ci0gIFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCksIGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSB7CitUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgpCisgIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKIH0KIAotVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpIDoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKK1RIdHRwQ2xpZW50OjpUSHR0cENsaWVudChzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0cmluZyBwYXRoKQorICA6IFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSkpLAorICAgIGhvc3RfKGhvc3QpLAorICAgIHBhdGhfKHBhdGgpIHsKIH0KIAotVEh0dHBDbGllbnQ6On5USHR0cENsaWVudCgpIHt9CitUSHR0cENsaWVudDo6flRIdHRwQ2xpZW50KCkgeworfQogCiB2b2lkIFRIdHRwQ2xpZW50OjpwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpIHsKICAgY2hhciogY29sb24gPSBzdHJjaHIoaGVhZGVyLCAnOicpOwogICBpZiAoY29sb24gPT0gTlVMTCkgewogICAgIHJldHVybjsKICAgfQotICBjaGFyKiB2YWx1ZSA9IGNvbG9uKzE7CisgIGNoYXIqIHZhbHVlID0gY29sb24gKyAxOwogCiAgIGlmIChib29zdDo6aXN0YXJ0c193aXRoKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIikpIHsKICAgICBpZiAoYm9vc3Q6OmllbmRzX3dpdGgodmFsdWUsICJjaHVua2VkIikpIHsKQEAgLTY0LDcgKzczLDggQEAKICAgfQogCiAgICpjb2RlID0gJ1wwJzsKLSAgd2hpbGUgKCooY29kZSsrKSA9PSAnICcpIHt9OworICB3aGlsZSAoKihjb2RlKyspID09ICcgJykgeworICB9OwogCiAgIGNoYXIqIG1zZyA9IHN0cmNocihjb2RlLCAnICcpOwogICBpZiAobXNnID09IE5VTEwpIHsKQEAgLTkxLDE3ICsxMDEsMTMgQEAKIAogICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOwotICBoIDw8Ci0gICAgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8Ci0gICAgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRiA8PAotICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGIDw8Ci0gICAgIkFjY2VwdDogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwKLSAgICAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgVkVSU0lPTiA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8Ci0gICAgQ1JMRjsKKyAgaCA8PCAiUE9TVCAiIDw8IHBhdGhfIDw8ICIgSFRUUC8xLjEiIDw8IENSTEYgPDwgIkhvc3Q6ICIgPDwgaG9zdF8gPDwgQ1JMRgorICAgIDw8ICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJDb250ZW50LUxlbmd0aDogIiA8PCBsZW4gPDwgQ1JMRgorICAgIDw8ICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJVc2VyLUFnZW50OiBUaHJpZnQvIiA8PCBQQUNLQUdFX1ZFUlNJT04KKyAgICA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8IENSTEY7CiAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwogCi0gIGlmKGhlYWRlci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKKyAgaWYgKGhlYWRlci5zaXplKCkgPiAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJIZWFkZXIgdG9vIGJpZyIpOwogICAvLyBXcml0ZSB0aGUgaGVhZGVyLCB0aGVuIHRoZSBkYXRhLCB0aGVuIGZsdXNoCiAgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKQEAgLTExMiw1ICsxMTgsNiBAQAogICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCmluZGV4IDA4OThiMTEuLmY0ZmIxMmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKQEAgLTIyLDI4ICsyMiwyOSBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBjbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHN0ZDo6c3RyaW5nIGhvc3QsIHN0ZDo6c3RyaW5nIHBhdGg9IiIpOworcHVibGljOgorICBUSHR0cENsaWVudChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBzdGQ6OnN0cmluZyBob3N0LCBzdGQ6OnN0cmluZyBwYXRoID0gIiIpOwogCi0gIFRIdHRwQ2xpZW50KHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0LCBzdGQ6OnN0cmluZyBwYXRoPSIiKTsKKyAgVEh0dHBDbGllbnQoc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c3RyaW5nIHBhdGggPSAiIik7CiAKICAgdmlydHVhbCB+VEh0dHBDbGllbnQoKTsKIAogICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKIAotIHByb3RlY3RlZDoKLQorcHJvdGVjdGVkOgogICBzdGQ6OnN0cmluZyBob3N0XzsKICAgc3RkOjpzdHJpbmcgcGF0aF87CiAKICAgdmlydHVhbCB2b2lkIHBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcik7CiAgIHZpcnR1YWwgYm9vbCBwYXJzZVN0YXR1c0xpbmUoY2hhciogc3RhdHVzKTsKLQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9USFRUUENMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAppbmRleCAxYjNmZTdiLi45NmIyNDgwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcApAQCAtMjEsMTggKzIxLDM0IEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPFNobHdhcGkuaD4KKyNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpzdHJpbmc7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLVRIdHRwU2VydmVyOjpUSHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDoKLSAgVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7CitUSHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgOiBUSHR0cFRyYW5zcG9ydCh0cmFuc3BvcnQpIHsKIH0KIAotVEh0dHBTZXJ2ZXI6On5USHR0cFNlcnZlcigpIHt9CitUSHR0cFNlcnZlcjo6flRIdHRwU2VydmVyKCkgeworfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcygmVE0sICZUSU1FKQorICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIF9zdHJuaWNtcChzdHIxLCBzdHIyLCBsZW4pCisgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgU3RyU3RySUEoaGF5c3RhY2ssIG5lZWRsZSkKKyNlbHNlCisgICNkZWZpbmUgVEhSSUZUX0dNVElNRShUTSwgVElNRSkgICAgICAgICAgICAgZ210aW1lX3IoJlRJTUUsICZUTSkKKyAgI2RlZmluZSBUSFJJRlRfc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbGVuKSBzdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pCisgICNkZWZpbmUgVEhSSUZUX3N0cmNhc2VzdHIoaGF5c3RhY2ssIG5lZWRsZSkgc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKQorI2VuZGlmCiAKIHZvaWQgVEh0dHBTZXJ2ZXI6OnBhcnNlSGVhZGVyKGNoYXIqIGhlYWRlcikgewogICBjaGFyKiBjb2xvbiA9IHN0cmNocihoZWFkZXIsICc6Jyk7CkBAIC00MCwxNSArNTYsMTcgQEAKICAgICByZXR1cm47CiAgIH0KICAgc2l6ZV90IHN6ID0gY29sb24gLSBoZWFkZXI7Ci0gIGNoYXIqIHZhbHVlID0gY29sb24rMTsKKyAgY2hhciogdmFsdWUgPSBjb2xvbiArIDE7CiAKLSAgaWYgKHN0cm5jbXAoaGVhZGVyLCAiVHJhbnNmZXItRW5jb2RpbmciLCBzeikgPT0gMCkgewotICAgIGlmIChzdHJzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgeworICBpZiAoVEhSSUZUX3N0cm5jYXNlY21wKGhlYWRlciwgIlRyYW5zZmVyLUVuY29kaW5nIiwgc3opID09IDApIHsKKyAgICBpZiAoVEhSSUZUX3N0cmNhc2VzdHIodmFsdWUsICJjaHVua2VkIikgIT0gTlVMTCkgewogICAgICAgY2h1bmtlZF8gPSB0cnVlOwogICAgIH0KLSAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIkNvbnRlbnQtTGVuZ3RoIiwgc3opID09IDApIHsKKyAgfSBlbHNlIGlmIChUSFJJRlRfc3RybmNhc2VjbXAoaGVhZGVyLCAiQ29udGVudC1sZW5ndGgiLCBzeikgPT0gMCkgewogICAgIGNodW5rZWRfID0gZmFsc2U7CiAgICAgY29udGVudExlbmd0aF8gPSBhdG9pKHZhbHVlKTsKKyAgfSBlbHNlIGlmIChzdHJuY21wKGhlYWRlciwgIlgtRm9yd2FyZGVkLUZvciIsIHN6KSA9PSAwKSB7CisgICAgb3JpZ2luXyA9IHZhbHVlOwogICB9CiB9CiAKQEAgLTYxLDcgKzc5LDggQEAKICAgfQogCiAgICpwYXRoID0gJ1wwJzsKLSAgd2hpbGUgKCooKytwYXRoKSA9PSAnICcpIHt9OworICB3aGlsZSAoKigrK3BhdGgpID09ICcgJykgeworICB9OwogCiAgIGNoYXIqIGh0dHAgPSBzdHJjaHIocGF0aCwgJyAnKTsKICAgaWYgKGh0dHAgPT0gTlVMTCkgewpAQCAtNzIsNiArOTEsMjkgQEAKICAgaWYgKHN0cmNtcChtZXRob2QsICJQT1NUIikgPT0gMCkgewogICAgIC8vIFBPU1QgbWV0aG9kIG9rLCBsb29raW5nIGZvciBjb250ZW50LgogICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgaWYgKHN0cmNtcChtZXRob2QsICJPUFRJT05TIikgPT0gMCkgeworICAgIC8vIHByZWZsaWdodCBPUFRJT05TIG1ldGhvZCwgd2UgZG9uJ3QgbmVlZCBmdXJ0aGVyIGNvbnRlbnQuCisgICAgLy8gaG93IHRvIGdyYWNpb3VzbHkgY2xvc2UgY29ubmVjdGlvbj8KKyAgICB1aW50OF90KiBidWY7CisgICAgdWludDMyX3QgbGVuOworICAgIHdyaXRlQnVmZmVyXy5nZXRCdWZmZXIoJmJ1ZiwgJmxlbik7CisKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CisgICAgaCA8PCAiSFRUUC8xLjEgMjAwIE9LIiA8PCBDUkxGIDw8ICJEYXRlOiAiIDw8IGdldFRpbWVSRkMxMTIzKCkgPDwgQ1JMRgorICAgICAgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbjogKiIgPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kczogUE9TVCwgT1BUSU9OUyIKKyAgICAgIDw8IENSTEYgPDwgIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnM6IENvbnRlbnQtVHlwZSIgPDwgQ1JMRiA8PCBDUkxGOworICAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOworCisgICAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaAorICAgIHRyYW5zcG9ydF8tPndyaXRlKChjb25zdCB1aW50OF90KiloZWFkZXIuY19zdHIoKSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlYWRlci5zaXplKCkpKTsKKyAgICB0cmFuc3BvcnRfLT53cml0ZShidWYsIGxlbik7CisgICAgdHJhbnNwb3J0Xy0+Zmx1c2goKTsKKworICAgIC8vIFJlc2V0IHRoZSBidWZmZXIgYW5kIGhlYWRlciB2YXJpYWJsZXMKKyAgICB3cml0ZUJ1ZmZlcl8ucmVzZXRCdWZmZXIoKTsKKyAgICByZWFkSGVhZGVyc18gPSB0cnVlOworICAgIHJldHVybiB0cnVlOwogICB9CiAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nKCJCYWQgU3RhdHVzICh1bnN1cHBvcnRlZCBtZXRob2QpOiAiKSArIHN0YXR1cyk7CiB9CkBAIC04NCwxNSArMTI2LDEwIEBACiAKICAgLy8gQ29uc3RydWN0IHRoZSBIVFRQIGhlYWRlcgogICBzdGQ6Om9zdHJpbmdzdHJlYW0gaDsKLSAgaCA8PAotICAgICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwKLSAgICAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwKLSAgICAiU2VydmVyOiBUaHJpZnQvIiA8PCBWRVJTSU9OIDw8IENSTEYgPDwKLSAgICAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGIDw8Ci0gICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwKLSAgICAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYgPDwKLSAgICAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgPDwgQ1JMRiA8PAotICAgIENSTEY7CisgIGggPDwgIkhUVFAvMS4xIDIwMCBPSyIgPDwgQ1JMRiA8PCAiRGF0ZTogIiA8PCBnZXRUaW1lUkZDMTEyMygpIDw8IENSTEYgPDwgIlNlcnZlcjogVGhyaWZ0LyIKKyAgICA8PCBQQUNLQUdFX1ZFUlNJT04gPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGCisgICAgPDwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGCisgICAgPDwgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIDw8IENSTEYgPDwgQ1JMRjsKICAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CiAKICAgLy8gV3JpdGUgdGhlIGhlYWRlciwgdGhlbiB0aGUgZGF0YSwgdGhlbiBmbHVzaApAQCAtMTA2LDE5ICsxNDMsMjcgQEAKICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKIH0KIAotc3RkOjpzdHJpbmcgVEh0dHBTZXJ2ZXI6OmdldFRpbWVSRkMxMTIzKCkKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIERheXNbXSA9IHsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0In07Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBNb250aHNbXSA9IHsiSmFuIiwiRmViIiwiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwgIkp1bCIsIkF1ZyIsICJTZXAiLCAiT2N0IiwiTm92IiwiRGVjIn07CitzdGQ6OnN0cmluZyBUSHR0cFNlcnZlcjo6Z2V0VGltZVJGQzExMjMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyKiBEYXlzW10gPSB7IlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJ9OworICBzdGF0aWMgY29uc3QgY2hhciogTW9udGhzW10KKyAgICAgID0geyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OwogICBjaGFyIGJ1ZmZbMTI4XTsKLSAgdGltZV90IHQgPSB0aW1lKE5VTEwpOwotICB0bSogYnJva2VuX3QgPSBnbXRpbWUoJnQpOwogCi0gIHNwcmludGYoYnVmZiwiJXMsICVkICVzICVkICVkOiVkOiVkIEdNVCIsCi0gICAgICAgICAgRGF5c1ticm9rZW5fdC0+dG1fd2RheV0sIGJyb2tlbl90LT50bV9tZGF5LCBNb250aHNbYnJva2VuX3QtPnRtX21vbl0sCi0gICAgICAgICAgYnJva2VuX3QtPnRtX3llYXIgKyAxOTAwLAotICAgICAgICAgIGJyb2tlbl90LT50bV9ob3VyLGJyb2tlbl90LT50bV9taW4sYnJva2VuX3QtPnRtX3NlYyk7CisgIHRpbWVfdCB0ID0gdGltZShOVUxMKTsKKyAgc3RydWN0IHRtIHRtYjsKKyAgVEhSSUZUX0dNVElNRSh0bWIsIHQpOworCisgIHNwcmludGYoYnVmZiwKKyAgICAgICAgICAiJXMsICVkICVzICVkICVkOiVkOiVkIEdNVCIsCisgICAgICAgICAgRGF5c1t0bWIudG1fd2RheV0sCisgICAgICAgICAgdG1iLnRtX21kYXksCisgICAgICAgICAgTW9udGhzW3RtYi50bV9tb25dLAorICAgICAgICAgIHRtYi50bV95ZWFyICsgMTkwMCwKKyAgICAgICAgICB0bWIudG1faG91ciwKKyAgICAgICAgICB0bWIudG1fbWluLAorICAgICAgICAgIHRtYi50bV9zZWMpOwogICByZXR1cm4gc3RkOjpzdHJpbmcoYnVmZik7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaAppbmRleCBiZjY5ZGJlLi5jMzg2MDZmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCkBAIC0yMiwzMCArMjIsMzAgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgVEh0dHBTZXJ2ZXIgOiBwdWJsaWMgVEh0dHBUcmFuc3BvcnQgewotIHB1YmxpYzoKLSAgVEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKK3B1YmxpYzoKKyAgVEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgdmlydHVhbCB+VEh0dHBTZXJ2ZXIoKTsKIAogICB2aXJ0dWFsIHZvaWQgZmx1c2goKTsKIAotIHByb3RlY3RlZDoKLQorcHJvdGVjdGVkOgogICB2b2lkIHJlYWRIZWFkZXJzKCk7CiAgIHZpcnR1YWwgdm9pZCBwYXJzZUhlYWRlcihjaGFyKiBoZWFkZXIpOwogICB2aXJ0dWFsIGJvb2wgcGFyc2VTdGF0dXNMaW5lKGNoYXIqIHN0YXR1cyk7CiAgIHN0ZDo6c3RyaW5nIGdldFRpbWVSRkMxMTIzKCk7Ci0KIH07CiAKIC8qKgogICogV3JhcHMgYSB0cmFuc3BvcnQgaW50byBIVFRQIHByb3RvY29sCiAgKi8KIGNsYXNzIFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQogCiAgIHZpcnR1YWwgflRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC01MywxMiArNTMsMTIgQEAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGJ1ZmZlcmVkIG9uZS4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSHR0cFNlcnZlcih0cmFucykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEh0dHBTZXJ2ZXIodHJhbnMpKTsKICAgfQotCiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RIVFRQU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCmluZGV4IGM0MTVkZGIuLjZjY2MwMzQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuY3BwCkBAIC0xNywzMiArMTcsMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxzc3RyZWFtPgorCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpzdHJpbmc7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8vIFllYWgsIHllYWgsIGhhY2t5IHRvIHB1dCB0aGVzZSBoZXJlLCBJIGtub3cuCiBjb25zdCBjaGFyKiBUSHR0cFRyYW5zcG9ydDo6Q1JMRiA9ICJcclxuIjsKIGNvbnN0IGludCBUSHR0cFRyYW5zcG9ydDo6Q1JMRl9MRU4gPSAyOwogCi1USHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6Ci0gIHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKLSAgcmVhZEhlYWRlcnNfKHRydWUpLAotICBjaHVua2VkXyhmYWxzZSksCi0gIGNodW5rZWREb25lXyhmYWxzZSksCi0gIGNodW5rU2l6ZV8oMCksCi0gIGNvbnRlbnRMZW5ndGhfKDApLAotICBodHRwQnVmXyhOVUxMKSwKLSAgaHR0cFBvc18oMCksCi0gIGh0dHBCdWZMZW5fKDApLAotICBodHRwQnVmU2l6ZV8oMTAyNCkgeworVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgIG9yaWdpbl8oIiIpLAorICAgIHJlYWRIZWFkZXJzXyh0cnVlKSwKKyAgICBjaHVua2VkXyhmYWxzZSksCisgICAgY2h1bmtlZERvbmVfKGZhbHNlKSwKKyAgICBjaHVua1NpemVfKDApLAorICAgIGNvbnRlbnRMZW5ndGhfKDApLAorICAgIGh0dHBCdWZfKE5VTEwpLAorICAgIGh0dHBQb3NfKDApLAorICAgIGh0dHBCdWZMZW5fKDApLAorICAgIGh0dHBCdWZTaXplXygxMDI0KSB7CiAgIGluaXQoKTsKIH0KIAogdm9pZCBUSHR0cFRyYW5zcG9ydDo6aW5pdCgpIHsKLSAgaHR0cEJ1Zl8gPSAoY2hhciopc3RkOjptYWxsb2MoaHR0cEJ1ZlNpemVfKzEpOworICBodHRwQnVmXyA9IChjaGFyKilzdGQ6Om1hbGxvYyhodHRwQnVmU2l6ZV8gKyAxKTsKICAgaWYgKGh0dHBCdWZfID09IE5VTEwpIHsKICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICB9CkBAIC03OSw4ICs4NCwxMCBAQAogdWludDMyX3QgVEh0dHBUcmFuc3BvcnQ6OnJlYWRNb3JlRGF0YSgpIHsKICAgdWludDMyX3Qgc2l6ZTsKIAotICAvLyBHZXQgbW9yZSBkYXRhIQotICByZWZpbGwoKTsKKyAgaWYgKGh0dHBQb3NfID09IGh0dHBCdWZMZW5fKSB7CisgICAgLy8gR2V0IG1vcmUgZGF0YSEKKyAgICByZWZpbGwoKTsKKyAgfQogCiAgIGlmIChyZWFkSGVhZGVyc18pIHsKICAgICByZWFkSGVhZGVycygpOwpAQCAtOTAsOCArOTcsOSBAQAogICAgIHNpemUgPSByZWFkQ2h1bmtlZCgpOwogICB9IGVsc2UgewogICAgIHNpemUgPSByZWFkQ29udGVudChjb250ZW50TGVuZ3RoXyk7CisgICAgcmVhZEhlYWRlcnNfID0gdHJ1ZTsKICAgfQotICByZWFkSGVhZGVyc18gPSB0cnVlOworCiAgIHJldHVybiBzaXplOwogfQogCkBAIC0xNDksNyArMTU3LDcgQEAKICAgICBpZiAobmVlZCA8IGdpdmUpIHsKICAgICAgIGdpdmUgPSBuZWVkOwogICAgIH0KLSAgICByZWFkQnVmZmVyXy53cml0ZSgodWludDhfdCopKGh0dHBCdWZfK2h0dHBQb3NfKSwgZ2l2ZSk7CisgICAgcmVhZEJ1ZmZlcl8ud3JpdGUoKHVpbnQ4X3QqKShodHRwQnVmXyArIGh0dHBQb3NfKSwgZ2l2ZSk7CiAgICAgaHR0cFBvc18gKz0gZ2l2ZTsKICAgICBuZWVkIC09IGdpdmU7CiAgIH0KQEAgLTE2MCw3ICsxNjgsNyBAQAogICB3aGlsZSAodHJ1ZSkgewogICAgIGNoYXIqIGVvbCA9IE5VTEw7CiAKLSAgICBlb2wgPSBzdHJzdHIoaHR0cEJ1Zl8raHR0cFBvc18sIENSTEYpOworICAgIGVvbCA9IHN0cnN0cihodHRwQnVmXyArIGh0dHBQb3NfLCBDUkxGKTsKIAogICAgIC8vIE5vIENSTEYgeWV0PwogICAgIGlmIChlb2wgPT0gTlVMTCkgewpAQCAtMTcwLDE5ICsxNzgsMTggQEAKICAgICB9IGVsc2UgewogICAgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gbmV4dCBsaW5lCiAgICAgICAqZW9sID0gJ1wwJzsKLSAgICAgIGNoYXIqIGxpbmUgPSBodHRwQnVmXytodHRwUG9zXzsKLSAgICAgIGh0dHBQb3NfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KChlb2wtaHR0cEJ1Zl8pICsgQ1JMRl9MRU4pOworICAgICAgY2hhciogbGluZSA9IGh0dHBCdWZfICsgaHR0cFBvc187CisgICAgICBodHRwUG9zXyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigoZW9sIC0gaHR0cEJ1Zl8pICsgQ1JMRl9MRU4pOwogICAgICAgcmV0dXJuIGxpbmU7CiAgICAgfQogICB9Ci0KIH0KIAogdm9pZCBUSHR0cFRyYW5zcG9ydDo6c2hpZnQoKSB7CiAgIGlmIChodHRwQnVmTGVuXyA+IGh0dHBQb3NfKSB7CiAgICAgLy8gU2hpZnQgZG93biByZW1haW5pbmcgZGF0YSBhbmQgcmVhZCBtb3JlCiAgICAgdWludDMyX3QgbGVuZ3RoID0gaHR0cEJ1Zkxlbl8gLSBodHRwUG9zXzsKLSAgICBtZW1tb3ZlKGh0dHBCdWZfLCBodHRwQnVmXytodHRwUG9zXywgbGVuZ3RoKTsKKyAgICBtZW1tb3ZlKGh0dHBCdWZfLCBodHRwQnVmXyArIGh0dHBQb3NfLCBsZW5ndGgpOwogICAgIGh0dHBCdWZMZW5fID0gbGVuZ3RoOwogICB9IGVsc2UgewogICAgIGh0dHBCdWZMZW5fID0gMDsKQEAgLTE5NSwxOSArMjAyLDIwIEBACiAgIHVpbnQzMl90IGF2YWlsID0gaHR0cEJ1ZlNpemVfIC0gaHR0cEJ1Zkxlbl87CiAgIGlmIChhdmFpbCA8PSAoaHR0cEJ1ZlNpemVfIC8gNCkpIHsKICAgICBodHRwQnVmU2l6ZV8gKj0gMjsKLSAgICBodHRwQnVmXyA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXysxKTsKLSAgICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgeworICAgIGNoYXIqIHRtcEJ1ZiA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXyArIDEpOworICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgewogICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICB9CisgICAgaHR0cEJ1Zl8gPSB0bXBCdWY7CiAgIH0KIAogICAvLyBSZWFkIG1vcmUgZGF0YQotICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKCh1aW50OF90KikoaHR0cEJ1Zl8raHR0cEJ1Zkxlbl8pLCBodHRwQnVmU2l6ZV8taHR0cEJ1Zkxlbl8pOworICB1aW50MzJfdCBnb3QgPSB0cmFuc3BvcnRfLT5yZWFkKCh1aW50OF90KikoaHR0cEJ1Zl8gKyBodHRwQnVmTGVuXyksIGh0dHBCdWZTaXplXyAtIGh0dHBCdWZMZW5fKTsKICAgaHR0cEJ1Zkxlbl8gKz0gZ290OwogICBodHRwQnVmX1todHRwQnVmTGVuX10gPSAnXDAnOwogCiAgIGlmIChnb3QgPT0gMCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCByZWZpbGwgYnVmZmVyIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSwgIkNvdWxkIG5vdCByZWZpbGwgYnVmZmVyIik7CiAgIH0KIH0KIApAQCAtMjQ5LDQgKzI1NywxNCBAQAogICB3cml0ZUJ1ZmZlcl8ud3JpdGUoYnVmLCBsZW4pOwogfQogCi19fX0KK2NvbnN0IHN0ZDo6c3RyaW5nIFRIdHRwVHJhbnNwb3J0OjpnZXRPcmlnaW4oKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgIGlmICghb3JpZ2luXy5lbXB0eSgpKSB7CisgICAgb3NzIDw8IG9yaWdpbl8gPDwgIiwgIjsKKyAgfQorICBvc3MgPDwgdHJhbnNwb3J0Xy0+Z2V0T3JpZ2luKCk7CisgIHJldHVybiBvc3Muc3RyKCk7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKaW5kZXggOTk5N2M5My4uZTQ2YWI3ZiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaApAQCAtMjEsOSArMjEsMTEgQEAKICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBUUkFOU1BPUlRfSF8gMQogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotI2luY2x1ZGUgIlRWaXJ0dWFsVHJhbnNwb3J0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIEhUVFAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRocmlmdCB0cmFuc3BvcnQuIFRoaXMgd2FzIGlycml0YXRpbmcKQEAgLTMzLDI2ICszNSwxOCBAQAogICogY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZywga2VlcGFsaXZlLCBldGMuIFRlc3RlZCBhZ2FpbnN0IEFwYWNoZS4KICAqLwogY2xhc3MgVEh0dHBUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEh0dHBUcmFuc3BvcnQ+IHsKLSBwdWJsaWM6Ci0gIFRIdHRwVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CitwdWJsaWM6CisgIFRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpOwogCiAgIHZpcnR1YWwgflRIdHRwVHJhbnNwb3J0KCk7CiAKLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQorICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CiAKLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CiAKLSAgdm9pZCBjbG9zZSgpIHsKLSAgICB0cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9CisgIHZvaWQgY2xvc2UoKSB7IHRyYW5zcG9ydF8tPmNsb3NlKCk7IH0KIAogICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIApAQCAtNjIsOSArNTYsMTEgQEAKIAogICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CiAKLSBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c3RyaW5nIG9yaWdpbl87CiAKICAgVE1lbW9yeUJ1ZmZlciB3cml0ZUJ1ZmZlcl87CiAgIFRNZW1vcnlCdWZmZXIgcmVhZEJ1ZmZlcl87CkBAIC0xMDEsNyArOTcsOCBAQAogICBzdGF0aWMgY29uc3QgY2hhciogQ1JMRjsKICAgc3RhdGljIGNvbnN0IGludCBDUkxGX0xFTjsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVEhUVFBDTElFTlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGVjNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0Lmg+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+IGFjY2VwdEltcGwoKSA9IDA7CisKK307Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKKworI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCmluZGV4IDQ2NDI3MmQuLjhhODQ0NTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwCkBAIC0xNywxNDEgKzE3LDMwMiBAQAogKiB1bmRlciB0aGUgTGljZW5zZS4KICovCiAKLSNpbmNsdWRlICJUVHJhbnNwb3J0RXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiVFBpcGUuaCIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9TeW5jLmg+CisjZW5kaWYKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAqIFRQaXBlIGltcGxlbWVudGF0aW9uLgogKi8KIAogI2lmZGVmIF9XSU4zMgorCit1aW50MzJfdCBwaXBlX3JlYWQoSEFORExFIHBpcGUsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKK3ZvaWQgcGlwZV93cml0ZShIQU5ETEUgcGlwZSwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCit1aW50MzJfdCBwc2V1ZG9fc3luY19yZWFkKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKK3ZvaWQgcHNldWRvX3N5bmNfd3JpdGUoSEFORExFIHBpcGUsIEhBTkRMRSBldmVudCwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworCitjbGFzcyBUUGlwZUltcGwgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICBUUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIH5UUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSA9IDA7IC8vIGRvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIHBpcGVoYW5kbGUpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSkge30KKyAgdmlydHVhbCBib29sIGlzQnVmZmVyZWREYXRhQXZhaWxhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9Cit9OworCitjbGFzcyBUTmFtZWRQaXBlSW1wbCA6IHB1YmxpYyBUUGlwZUltcGwgeworcHVibGljOgorICBleHBsaWNpdCBUTmFtZWRQaXBlSW1wbChUQXV0b0hhbmRsZSAmcGlwZWhhbmRsZSkgOiBQaXBlXyhwaXBlaGFuZGxlLnJlbGVhc2UoKSkge30KKyAgdmlydHVhbCB+VE5hbWVkUGlwZUltcGwoKSB7fQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgICByZXR1cm4gcHNldWRvX3N5bmNfcmVhZChQaXBlXy5oLCByZWFkX2V2ZW50Xy5oLCBidWYsIGxlbik7CisgIH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcHNldWRvX3N5bmNfd3JpdGUoUGlwZV8uaCwgd3JpdGVfZXZlbnRfLmgsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlXy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7IFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUpOyB9CisKK3ByaXZhdGU6CisgIFRNYW51YWxSZXNldEV2ZW50IHJlYWRfZXZlbnRfOworICBUTWFudWFsUmVzZXRFdmVudCB3cml0ZV9ldmVudF87CisgIFRBdXRvSGFuZGxlIFBpcGVfOworfTsKKworY2xhc3MgVEFub25QaXBlSW1wbCA6IHB1YmxpYyBUUGlwZUltcGwgeworcHVibGljOgorICBUQW5vblBpcGVJbXBsKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KSA6IFBpcGVSZF8oUGlwZVJkKSwgUGlwZVdydF8oUGlwZVdydCkge30KKyAgdmlydHVhbCB+VEFub25QaXBlSW1wbCgpIHt9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gcGlwZV9yZWFkKFBpcGVSZF8uaCwgYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyBwaXBlX3dyaXRlKFBpcGVXcnRfLmgsIGJ1ZiwgbGVuKTsgfQorCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlUmRfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFBpcGVIYW5kbGUoSEFORExFIFBpcGVSZCkgeyBQaXBlUmRfLnJlc2V0KFBpcGVSZCk7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVXcnRfLmg7IH0KKyAgdmlydHVhbCB2b2lkIHNldFdydFBpcGVIYW5kbGUoSEFORExFIFBpcGVXcnQpIHsgUGlwZVdydF8ucmVzZXQoUGlwZVdydCk7IH0KKworcHJpdmF0ZToKKyAgVEF1dG9IYW5kbGUgUGlwZVJkXzsKKyAgVEF1dG9IYW5kbGUgUGlwZVdydF87Cit9OworCisvLyBJZiB5b3Ugd2FudCBhIHNlbGVjdC1saWtlIGxvb3AgdG8gd29yaywgdXNlIHRoaXMgc3ViY2xhc3MuICBCZSB3YXJuZWQuLi4KKy8vIHRoZSByZWFkIGltcGxlbWVudGF0aW9uIGhhcyBzZXZlcmFsIGNvbnRleHQgc3dpdGNoZXMsIHNvIHRoaXMgaXMgc2xvd2VyCisvLyB0aGFuIHVzaW5nIHRoZSByZWd1bGFyIG5hbWVkIHBpcGUgaW1wbGVtZW50YXRpb24KK2NsYXNzIFRXYWl0YWJsZU5hbWVkUGlwZUltcGwgOiBwdWJsaWMgVFBpcGVJbXBsIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChUQXV0b0hhbmRsZSAmcGlwZWhhbmRsZSkKKyAgICA6IGJlZ2luX3VucmVhZF9pZHhfKDApLCBlbmRfdW5yZWFkX2lkeF8oMCkgeworICAgIHJlYWRPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpSRUFEOworICAgIHJlYWRPdmVybGFwXy5oID0gcGlwZWhhbmRsZS5oOworICAgIGNhbmNlbE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OkNBTkNFTElPOworICAgIGNhbmNlbE92ZXJsYXBfLmggPSBwaXBlaGFuZGxlLmg7CisgICAgYnVmZmVyXy5yZXNpemUoMTAyNCAvKmFyYml0cmFyeSBidWZmZXIgc2l6ZSovLCAnXDAnKTsKKyAgICBiZWdpbkFzeW5jUmVhZCgmYnVmZmVyX1swXSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcl8uc2l6ZSgpKSk7CisgICAgUGlwZV8ucmVzZXQocGlwZWhhbmRsZS5yZWxlYXNlKCkpOworICB9CisgIHZpcnR1YWwgflRXYWl0YWJsZU5hbWVkUGlwZUltcGwoKSB7CisgICAgLy8gc2VlIGlmIHRoZXJlIGlzIGFuIG91dHN0YW5kaW5nIHJlYWQgcmVxdWVzdAorICAgIGlmIChiZWdpbl91bnJlYWRfaWR4XyA9PSBlbmRfdW5yZWFkX2lkeF8pIHsKKyAgICAgIC8vIGlmIHNvLCBjYW5jZWwgaXQsIGFuZCB3YWl0IGZvciB0aGUgZGVhZCBjb21wbGV0aW9uCisgICAgICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmY2FuY2VsT3ZlcmxhcF8pOworICAgICAgcmVhZE92ZXJsYXBfLm92ZXJsYXBwZWRSZXN1bHRzKGZhbHNlIC8qaWdub3JlIGVycm9ycyovKTsKKyAgICB9CisgIH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgICAgcHNldWRvX3N5bmNfd3JpdGUoUGlwZV8uaCwgd3JpdGVfZXZlbnRfLmgsIGJ1ZiwgbGVuKTsKKyAgfQorCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlXy5oOyB9CisgIHZpcnR1YWwgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7IFBpcGVfLnJlc2V0KHBpcGVoYW5kbGUpOyB9CisgIHZpcnR1YWwgYm9vbCBpc0J1ZmZlcmVkRGF0YUF2YWlsYWJsZSgpIHsgcmV0dXJuIGJlZ2luX3VucmVhZF9pZHhfIDwgZW5kX3VucmVhZF9pZHhfOyB9CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiByZWFkeV9ldmVudF8uaDsgfQorCitwcml2YXRlOgorICB2b2lkIGJlZ2luQXN5bmNSZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdWludDMyX3QgZW5kQXN5bmNSZWFkKCk7CisKKyAgVEF1dG9PdmVybGFwVGhyZWFkIHRocmVhZF87CisgIFRBdXRvSGFuZGxlIFBpcGVfOworICBUT3ZlcmxhcHBlZFdvcmtJdGVtIHJlYWRPdmVybGFwXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBjYW5jZWxPdmVybGFwXzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgcmVhZHlfZXZlbnRfOworICBUTWFudWFsUmVzZXRFdmVudCB3cml0ZV9ldmVudF87CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcl87CisgIHVpbnQzMl90IGJlZ2luX3VucmVhZF9pZHhfOworICB1aW50MzJfdCBlbmRfdW5yZWFkX2lkeF87Cit9OworCit2b2lkIFRXYWl0YWJsZU5hbWVkUGlwZUltcGw6OmJlZ2luQXN5bmNSZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIGJlZ2luX3VucmVhZF9pZHhfID0gZW5kX3VucmVhZF9pZHhfID0gMDsKKyAgcmVhZE92ZXJsYXBfLnJlc2V0KGJ1ZiwgbGVuLCByZWFkeV9ldmVudF8uaCk7CisgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZyZWFkT3ZlcmxhcF8pOworICBpZiAocmVhZE92ZXJsYXBfLnN1Y2Nlc3MgPT0gRkFMU0UgJiYgcmVhZE92ZXJsYXBfLmxhc3RfZXJyb3IgIT0gRVJST1JfSU9fUEVORElORykgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6UmVhZEZpbGUgZXJyb3JlZCBHTEU9IiwgcmVhZE92ZXJsYXBfLmxhc3RfZXJyb3IpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiBSZWFkRmlsZSBmYWlsZWQiKTsKKyAgfQorfQorCit1aW50MzJfdCBUV2FpdGFibGVOYW1lZFBpcGVJbXBsOjplbmRBc3luY1JlYWQoKSB7CisgIHJldHVybiByZWFkT3ZlcmxhcF8ub3ZlcmxhcHBlZFJlc3VsdHMoKTsKK30KKwordWludDMyX3QgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gPT0gZW5kX3VucmVhZF9pZHhfKSB7CisgICAgZW5kX3VucmVhZF9pZHhfID0gZW5kQXN5bmNSZWFkKCk7CisgIH0KKworICB1aW50MzJfdCBfX2lkeHNpemUgPSBlbmRfdW5yZWFkX2lkeF8gLSBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChsZW4gPCBfX2lkeHNpemUpID8gbGVuIDogX19pZHhzaXplOworICBtZW1jcHkoYnVmLCAmYnVmZmVyX1tiZWdpbl91bnJlYWRfaWR4X10sIGJ5dGVzX3RvX2NvcHkpOworICBiZWdpbl91bnJlYWRfaWR4XyArPSBieXRlc190b19jb3B5OworICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gIT0gZW5kX3VucmVhZF9pZHhfKSB7CisgICAgYXNzZXJ0KGxlbiA9PSBieXRlc190b19jb3B5KTsKKyAgICAvLyB3ZSB3ZXJlIGFibGUgdG8gZnVsZmlsbCB0aGUgcmVhZCB3aXRoIGp1c3QgdGhlIGJ5dGVzIGluIG91cgorICAgIC8vIGJ1ZmZlciwgYW5kIHdlIHN0aWxsIGhhdmUgYnVmZmVyIGxlZnQKKyAgICByZXR1cm4gYnl0ZXNfdG9fY29weTsKKyAgfQorICB1aW50MzJfdCBieXRlc19jb3BpZWQgPSBieXRlc190b19jb3B5OworCisgIC8vIGFsbCBvZiB0aGUgcmVxdWVzdGVkIGRhdGEgaGFzIGJlZW4gcmVhZC4gIEtpY2sgb2ZmIGFuIGFzeW5jIHJlYWQgZm9yIHRoZSBuZXh0IHJvdW5kLgorICBiZWdpbkFzeW5jUmVhZCgmYnVmZmVyX1swXSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlcl8uc2l6ZSgpKSk7CisKKyAgcmV0dXJuIGJ5dGVzX2NvcGllZDsKK30KKwordm9pZCBwc2V1ZG9fc3luY193cml0ZShIQU5ETEUgcGlwZSwgSEFORExFIGV2ZW50LCBjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBPVkVSTEFQUEVEIHRlbXBPdmVybGFwOworICBtZW1zZXQoJnRlbXBPdmVybGFwLCAwLCBzaXplb2YodGVtcE92ZXJsYXApKTsKKyAgdGVtcE92ZXJsYXAuaEV2ZW50ID0gZXZlbnQ7CisKKyAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CisgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgQk9PTCByZXN1bHQgPSA6OldyaXRlRmlsZShwaXBlLCBidWYgKyB3cml0dGVuLCBsZW4gLSB3cml0dGVuLCBOVUxMLCAmdGVtcE92ZXJsYXApOworCisgICAgaWYgKHJlc3VsdCA9PSBGQUxTRSAmJiA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6V3JpdGVGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IHdyaXRlIGZhaWxlZCIpOworICAgIH0KKworICAgIERXT1JEIGJ5dGVzID0gMDsKKyAgICByZXN1bHQgPSA6OkdldE92ZXJsYXBwZWRSZXN1bHQocGlwZSwgJnRlbXBPdmVybGFwLCAmYnl0ZXMsIFRSVUUpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogR2V0T3ZlcmxhcHBlZFJlc3VsdCBmYWlsZWQiKTsKKyAgICB9CisgICAgd3JpdHRlbiArPSBieXRlczsKKyAgfQorfQorCit1aW50MzJfdCBwc2V1ZG9fc3luY19yZWFkKEhBTkRMRSBwaXBlLCBIQU5ETEUgZXZlbnQsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CisgIE9WRVJMQVBQRUQgdGVtcE92ZXJsYXA7CisgIG1lbXNldCgmdGVtcE92ZXJsYXAsIDAsIHNpemVvZih0ZW1wT3ZlcmxhcCkpOworICB0ZW1wT3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKKworICBCT09MIHJlc3VsdCA9IDo6UmVhZEZpbGUocGlwZSwgYnVmLCBsZW4sIE5VTEwsICZ0ZW1wT3ZlcmxhcCk7CisKKyAgaWYgKHJlc3VsdCA9PSBGQUxTRSAmJiA6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX0lPX1BFTkRJTkcpIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OlJlYWRGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlRQaXBlOiByZWFkIGZhaWxlZCIpOworICB9CisKKyAgRFdPUkQgYnl0ZXMgPSAwOworICByZXN1bHQgPSA6OkdldE92ZXJsYXBwZWRSZXN1bHQocGlwZSwgJnRlbXBPdmVybGFwLCAmYnl0ZXMsIFRSVUUpOworICBpZiAoIXJlc3VsdCkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlIDo6R2V0T3ZlcmxhcHBlZFJlc3VsdCBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJUUGlwZTogR2V0T3ZlcmxhcHBlZFJlc3VsdCBmYWlsZWQiKTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKIC8vLS0tLSBDb25zdHJ1Y3RvcnMgLS0tLQotVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlKSA6Ci0gIFBpcGVfKFBpcGUpLAotICBUaW1lb3V0U2Vjb25kc18oMyksCi0gIGlzQW5vbnltb3VzKGZhbHNlKQote30KK1RQaXBlOjpUUGlwZShUQXV0b0hhbmRsZSAmUGlwZSkKKyAgOiBpbXBsXyhuZXcgVFdhaXRhYmxlTmFtZWRQaXBlSW1wbChQaXBlKSksIFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7Cit9CiAKLVRQaXBlOjpUUGlwZShjb25zdCBjaGFyICpwaXBlbmFtZSkgOgotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIFRpbWVvdXRTZWNvbmRzXygzKSwKLSAgaXNBbm9ueW1vdXMoZmFsc2UpCitUUGlwZTo6VFBpcGUoSEFORExFIFBpcGUpCisgIDogVGltZW91dFNlY29uZHNfKDMpLCBpc0Fub255bW91c18oZmFsc2UpCiB7CisgIFRBdXRvSGFuZGxlIHBpcGVIYW5kbGUoUGlwZSk7CisgIGltcGxfLnJlc2V0KG5ldyBUV2FpdGFibGVOYW1lZFBpcGVJbXBsKHBpcGVIYW5kbGUpKTsKK30KKworVFBpcGU6OlRQaXBlKGNvbnN0IGNoYXIqIHBpcGVuYW1lKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CiAgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKIH0KIAotVFBpcGU6OlRQaXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSkgOgotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIFRpbWVvdXRTZWNvbmRzXygzKSwKLSAgaXNBbm9ueW1vdXMoZmFsc2UpCi17CitUUGlwZTo6VFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CiAgIHNldFBpcGVuYW1lKHBpcGVuYW1lKTsKIH0KIAotVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KSA6Ci0gIFBpcGVfKFBpcGVSZCksCi0gIFBpcGVXcnRfKFBpcGVXcnQpLAotICBUaW1lb3V0U2Vjb25kc18oMyksCi0gIGlzQW5vbnltb3VzKHRydWUpCi17fQorVFBpcGU6OlRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KQorICA6IGltcGxfKG5ldyBUQW5vblBpcGVJbXBsKFBpcGVSZCwgUGlwZVdydCkpLCBUaW1lb3V0U2Vjb25kc18oMyksIGlzQW5vbnltb3VzXyh0cnVlKSB7Cit9CiAKLVRQaXBlOjpUUGlwZSgpIDoKLSAgUGlwZV8oSU5WQUxJRF9IQU5ETEVfVkFMVUUpLAotICBUaW1lb3V0U2Vjb25kc18oMykKLXt9CitUUGlwZTo6VFBpcGUoKSA6IFRpbWVvdXRTZWNvbmRzXygzKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7Cit9CiAKLS8vLS0tLSBEZXN0cnVjdG9yIC0tLS0KIFRQaXBlOjp+VFBpcGUoKSB7Ci0gIGNsb3NlKCk7CiB9CiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFRyYW5zcG9ydCBjYWxsYmFja3MKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIGJvb2wgVFBpcGU6OmlzT3BlbigpIHsKLSAgcmV0dXJuIChQaXBlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSk7CisgIHJldHVybiBpbXBsXy5nZXQoKSAhPSBOVUxMOwogfQogCiBib29sIFRQaXBlOjpwZWVrKCkgewotICBpZiAoIWlzT3BlbigpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIERXT1JEIGJ5dGVzYXZhaWwgPSAwOwotICBpbnQgIFBlZWtSZXQgPSAwOwotICBQZWVrUmV0ID0gUGVla05hbWVkUGlwZShQaXBlXywgTlVMTCwgMCwgTlVMTCwgJmJ5dGVzYXZhaWwsIE5VTEwpOwotICByZXR1cm4gKFBlZWtSZXQgIT0gMCAmJiBieXRlc2F2YWlsID4gMCk7CisgIHJldHVybiBpc09wZW4oKTsKIH0KIAogdm9pZCBUUGlwZTo6b3BlbigpIHsKLSAgaWYgKGlzT3BlbigpKSB7CisgIGlmIChpc09wZW4oKSkKICAgICByZXR1cm47Ci0gIH0KIAotICBpbnQgU2xlZXBJbnRlcnZhbCA9IDUwMDsgLy9tcwotICBpbnQgcmV0cmllcyA9IFRpbWVvdXRTZWNvbmRzXyAqIDEwMDAgLyBTbGVlcEludGVydmFsOwotICBIQU5ETEUgaFBpcGVfOwotICBmb3IoaW50IGk9MDsgaTxyZXRyaWVzOyBpKyspCi0gIHsKLSAgICBoUGlwZV8gPSBDcmVhdGVGaWxlKAotICAgICAgICAgICAgICBwaXBlbmFtZV8uY19zdHIoKSwKLSAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKLSAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIC8vIG5vIHNoYXJpbmcKLSAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlcwotICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCAgLy8gb3BlbnMgZXhpc3RpbmcgcGlwZQotICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgLy8gZGVmYXVsdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIE5VTEwpOyAgICAgICAgICAvLyBubyB0ZW1wbGF0ZSBmaWxlCisgIFRBdXRvSGFuZGxlIGhQaXBlOworICBkbyB7CisgICAgRFdPUkQgZmxhZ3MgPSBGSUxFX0ZMQUdfT1ZFUkxBUFBFRDsgLy8gYXN5bmMgbW9kZSwgc28gd2UgY2FuIGRvIHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUgYXMgd3JpdGVzCisgICAgaFBpcGUucmVzZXQoQ3JlYXRlRmlsZUEocGlwZW5hbWVfLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBubyBzaGFyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgLy8gb3BlbnMgZXhpc3RpbmcgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKTsgLy8gbm8gdGVtcGxhdGUgZmlsZQogCi0gICAgaWYgKGhQaXBlXyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgIHNsZWVwKFNsZWVwSW50ZXJ2YWwpOwotICAgIGVsc2UKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChoUGlwZV8gPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgaWYgKGhQaXBlLmggIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICBicmVhazsgLy8gc3VjY2VzcyEKKworICAgIGlmICg6OkdldExhc3RFcnJvcigpICE9IEVSUk9SX1BJUEVfQlVTWSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGU6Om9wZW4gOjpDcmVhdGVGaWxlIGVycm9yZWQgR0xFPSIsIDo6R2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlVuYWJsZSB0byBvcGVuIHBpcGUiKTsKKyAgICB9CisgIH0gd2hpbGUgKDo6V2FpdE5hbWVkUGlwZUEocGlwZW5hbWVfLmNfc3RyKCksIFRpbWVvdXRTZWNvbmRzXyAqIDEwMDApKTsKKworICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlOjpvcGVuIDo6Q3JlYXRlRmlsZSBlcnJvcmVkIEdMRT0iLCA6OkdldExhc3RFcnJvcigpKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVW5hYmxlIHRvIG9wZW4gcGlwZSIpOwotCi0gIC8vIFRoZSBwaXBlIGNvbm5lY3RlZDsgY2hhbmdlIHRvIG1lc3NhZ2UtcmVhZCBtb2RlLgotICBEV09SRCBkd01vZGUgPSBQSVBFX1JFQURNT0RFX01FU1NBR0U7Ci0gIGludCBmU3VjY2VzcyA9IFNldE5hbWVkUGlwZUhhbmRsZVN0YXRlKAotICAgICAgICAgICAgICBoUGlwZV8sIC8vIHBpcGUgaGFuZGxlCi0gICAgICAgICAgICAgICZkd01vZGUsICAvLyBuZXcgcGlwZSBtb2RlCi0gICAgICAgICAgICAgIE5VTEwsICAgICAvLyBkb24ndCBzZXQgbWF4aW11bSBieXRlcwotICAgICAgICAgICAgICBOVUxMKTsgICAgLy8gZG9uJ3Qgc2V0IG1heGltdW0gdGltZQotICBpZiAoZlN1Y2Nlc3MgPT0gMCkKLSAgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSBmYWlsZWQiKTsKLSAgICBjbG9zZSgpOwogICB9Ci0gIFBpcGVfID0gaFBpcGVfOworCisgIGltcGxfLnJlc2V0KG5ldyBUTmFtZWRQaXBlSW1wbChoUGlwZSkpOwogfQogCi0KIHZvaWQgVFBpcGU6OmNsb3NlKCkgewotICBpZiAoaXNPcGVuKCkpCi0gIHsKLSAgICBDbG9zZUhhbmRsZShQaXBlXyk7Ci0gICAgUGlwZV8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgfQorICBpbXBsXy5yZXNldCgpOwogfQogCiB1aW50MzJfdCBUUGlwZTo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICBpZiAoIWlzT3BlbigpKQogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBwaXBlIik7CisgIHJldHVybiBpbXBsXy0+cmVhZChidWYsIGxlbik7Cit9CiAKLSAgRFdPUkQgIGNiUmVhZDsKLSAgaW50IGZTdWNjZXNzID0gUmVhZEZpbGUoCi0gICAgICAgICAgICAgIFBpcGVfLCAvLyBwaXBlIGhhbmRsZQotICAgICAgICAgICAgICBidWYsICAgICAgLy8gYnVmZmVyIHRvIHJlY2VpdmUgcmVwbHkKLSAgICAgICAgICAgICAgbGVuLCAgICAgIC8vIHNpemUgb2YgYnVmZmVyCi0gICAgICAgICAgICAgICZjYlJlYWQsICAvLyBudW1iZXIgb2YgYnl0ZXMgcmVhZAotICAgICAgICAgICAgICBOVUxMKTsgICAgLy8gbm90IG92ZXJsYXBwZWQKK3VpbnQzMl90IHBpcGVfcmVhZChIQU5ETEUgcGlwZSwgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgRFdPUkQgY2JSZWFkOworICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZShwaXBlLCAgICAvLyBwaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsICAgICAvLyBidWZmZXIgdG8gcmVjZWl2ZSByZXBseQorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sICAgICAvLyBzaXplIG9mIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JSZWFkLCAvLyBudW1iZXIgb2YgYnl0ZXMgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAvLyBub3Qgb3ZlcmxhcHBlZAogCi0gIGlmICggIWZTdWNjZXNzICYmIEdldExhc3RFcnJvcigpICE9IEVSUk9SX01PUkVfREFUQSApCisgIGlmICghZlN1Y2Nlc3MgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTU9SRV9EQVRBKQogICAgIHJldHVybiAwOyAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KIAogICByZXR1cm4gY2JSZWFkOwpAQCAtMTYwLDE3ICszMjEsMTggQEAKIHZvaWQgVFBpcGU6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIGlmICghaXNPcGVuKCkpCiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlIik7CisgIGltcGxfLT53cml0ZShidWYsIGxlbik7Cit9CiAKLSAgSEFORExFIFdyaXRlUGlwZSA9IGlzQW5vbnltb3VzPyBQaXBlV3J0XzogUGlwZV87Ci0gIERXT1JEICBjYldyaXR0ZW47Ci0gIGludCBmU3VjY2VzcyA9IFdyaXRlRmlsZSgKLSAgICAgICAgICAgICAgV3JpdGVQaXBlLCAvLyBwaXBlIGhhbmRsZQotICAgICAgICAgICAgICBidWYsICAgICAgICAvLyBtZXNzYWdlCi0gICAgICAgICAgICAgIGxlbiwgICAgICAgIC8vIG1lc3NhZ2UgbGVuZ3RoCi0gICAgICAgICAgICAgICZjYldyaXR0ZW4sIC8vIGJ5dGVzIHdyaXR0ZW4KLSAgICAgICAgICAgICAgTlVMTCk7ICAgICAgLy8gbm90IG92ZXJsYXBwZWQKK3ZvaWQgcGlwZV93cml0ZShIQU5ETEUgcGlwZSwgY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKKyAgRFdPUkQgY2JXcml0dGVuOworICBpbnQgZlN1Y2Nlc3MgPSBXcml0ZUZpbGUocGlwZSwgICAgICAgLy8gcGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgICAgICAgIC8vIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgICAgICAgIC8vIG1lc3NhZ2UgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JXcml0dGVuLCAvLyBieXRlcyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAvLyBub3Qgb3ZlcmxhcHBlZAogCi0gIGlmICggIWZTdWNjZXNzKQorICBpZiAoIWZTdWNjZXNzKQogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJXcml0ZSB0byBwaXBlIGZhaWxlZCIpOwogfQogCkBAIC0xNzgsNDAgKzM0MCw1OSBAQAogLy8gQWNjZXNzb3JzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgeworc3RkOjpzdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgewogICByZXR1cm4gcGlwZW5hbWVfOwogfQogCi12b2lkIFRQaXBlOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUpIHsKLSAgaWYocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IC0xKQordm9pZCBUUGlwZTo6c2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSB7CisgIGlmIChwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpCiAgICAgcGlwZW5hbWVfID0gIlxcXFwuXFxwaXBlXFwiICsgcGlwZW5hbWU7CiAgIGVsc2UKICAgICBwaXBlbmFtZV8gPSBwaXBlbmFtZTsKIH0KIAogSEFORExFIFRQaXBlOjpnZXRQaXBlSGFuZGxlKCkgewotICByZXR1cm4gUGlwZV87CisgIGlmIChpbXBsXykKKyAgICByZXR1cm4gaW1wbF8tPmdldFBpcGVIYW5kbGUoKTsKKyAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOwogfQogCiB2b2lkIFRQaXBlOjpzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKSB7Ci0gIFBpcGVfID0gcGlwZWhhbmRsZTsKKyAgaWYgKGlzQW5vbnltb3VzXykKKyAgICBpbXBsXy0+c2V0UGlwZUhhbmRsZShwaXBlaGFuZGxlKTsKKyAgZWxzZQorICB7CisgICAgVEF1dG9IYW5kbGUgcGlwZShwaXBlaGFuZGxlKTsKKyAgICBpbXBsXy5yZXNldChuZXcgVE5hbWVkUGlwZUltcGwocGlwZSkpOworICB9CiB9CiAKIEhBTkRMRSBUUGlwZTo6Z2V0V3J0UGlwZUhhbmRsZSgpIHsKLSAgcmV0dXJuIFBpcGVXcnRfOworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXRXcnRQaXBlSGFuZGxlKCk7CisgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTsKIH0KIAogdm9pZCBUUGlwZTo6c2V0V3J0UGlwZUhhbmRsZShIQU5ETEUgcGlwZWhhbmRsZSkgewotICBQaXBlV3J0XyA9IHBpcGVoYW5kbGU7CisgIGlmIChpbXBsXykKKyAgICBpbXBsXy0+c2V0V3J0UGlwZUhhbmRsZShwaXBlaGFuZGxlKTsKIH0KIAotbG9uZyBUUGlwZTo6Z2V0Q29ubmVjdFRpbWVvdXQoKSB7CitIQU5ETEUgVFBpcGU6OmdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7CisgIGlmIChpbXBsXykKKyAgICByZXR1cm4gaW1wbF8tPmdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKKyAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCitsb25nIFRQaXBlOjpnZXRDb25uVGltZW91dCgpIHsKICAgcmV0dXJuIFRpbWVvdXRTZWNvbmRzXzsKIH0KIAotdm9pZCBUUGlwZTo6c2V0Q29ubmVjdFRpbWVvdXQobG9uZyBzZWNvbmRzKSB7Cit2b2lkIFRQaXBlOjpzZXRDb25uVGltZW91dChsb25nIHNlY29uZHMpIHsKICAgVGltZW91dFNlY29uZHNfID0gc2Vjb25kczsKIH0KLSNlbmRpZiAvL19XSU4zMgogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorI2VuZGlmIC8vX1dJTjMyCit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaAppbmRleCA3NzQyNjQ0Li5hYTE0Zjk1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCkBAIC0yMywyNiArMjMsMzkgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAjaWZuZGVmIF9XSU4zMgotIyAgaW5jbHVkZSAiVFNvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2VuZGlmCisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1N5bmMuaD4KICNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFdpbmRvd3MgUGlwZXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgotICoKKyAqIERvbid0IGRlc3Ryb3kgYSBUUGlwZSBhdCBnbG9iYWwgc2NvcGUsIGFzIHRoYXQgd2lsbCBjYXVzZSBhIHRocmVhZCBqb2luCisgKiBkdXJpbmcgRExMTWFpbi4gIFRoYXQgYWxzbyBtZWFucyB0aGF0IGNsaWVudCBvYmplY3RzIHVzaW5nIFRQaXBlIHNob3VsZG4ndCBiZSBhdCBnbG9iYWwKKyAqIHNjb3BlLgogICovCiAjaWZkZWYgX1dJTjMyCi1jbGFzcyBUUGlwZSA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUUGlwZT4gewotIHB1YmxpYzoKK2NsYXNzIFRQaXBlSW1wbDsKIAorY2xhc3MgVFBpcGUgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFBpcGU+IHsKK3B1YmxpYzoKICAgLy8gQ29uc3RydWN0cyBhIG5ldyBwaXBlIG9iamVjdC4KICAgVFBpcGUoKTsKICAgLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcnMgLQotICBleHBsaWNpdCBUUGlwZShIQU5ETEUgUGlwZSk7IC8vSEFORExFIGlzIGEgdm9pZCoKLSAgLy9uZWVkIGEgY29uc3QgY2hhciAqIG92ZXJsb2FkIHNvIHN0cmluZyBsaXRlcmFscyBkb24ndCBnbyB0byB0aGUgSEFORExFIG92ZXJsb2FkCi0gIGV4cGxpY2l0IFRQaXBlKGNvbnN0IGNoYXIgKnBpcGVuYW1lKTsKLSAgZXhwbGljaXQgVFBpcGUoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lKTsKKyAgZXhwbGljaXQgVFBpcGUoSEFORExFIFBpcGUpOyAgICAgICAvLyBIQU5ETEUgaXMgYSB2b2lkKgorICBleHBsaWNpdCBUUGlwZShUQXV0b0hhbmRsZSYgUGlwZSk7IC8vIHRoaXMgY3RvciB3aWxsIGNsZWFyIG91dCAvIG1vdmUgZnJvbSBQaXBlCisgIC8vIG5lZWQgYSBjb25zdCBjaGFyICogb3ZlcmxvYWQgc28gc3RyaW5nIGxpdGVyYWxzIGRvbid0IGdvIHRvIHRoZSBIQU5ETEUgb3ZlcmxvYWQKKyAgZXhwbGljaXQgVFBpcGUoY29uc3QgY2hhciogcGlwZW5hbWUpOworICBleHBsaWNpdCBUUGlwZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOwogICAvLyBBbm9ueW1vdXMgcGlwZSAtCiAgIFRQaXBlKEhBTkRMRSBQaXBlUmQsIEhBTkRMRSBQaXBlV3J0KTsKIApAQCAtNjcsMzAgKzgwLDM0IEBACiAgIC8vIFdyaXRlcyB0byB0aGUgcGlwZS4KICAgdmlydHVhbCB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAotCi0gIC8vQWNjZXNzb3JzCisgIC8vIEFjY2Vzc29ycwogICBzdGQ6OnN0cmluZyBnZXRQaXBlbmFtZSgpOwotICB2b2lkIHNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSk7Ci0gIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCk7IC8vZG91YmxlcyBhcyB0aGUgcmVhZCBoYW5kbGUgZm9yIGFub24gcGlwZQorICB2b2lkIHNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSk7CisgIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCk7IC8vIGRvdWJsZXMgYXMgdGhlIHJlYWQgaGFuZGxlIGZvciBhbm9uIHBpcGUKICAgdm9pZCBzZXRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKTsKICAgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKTsKICAgdm9pZCBzZXRXcnRQaXBlSGFuZGxlKEhBTkRMRSBwaXBlaGFuZGxlKTsKLSAgbG9uZyBnZXRDb25uZWN0VGltZW91dCgpOwotICB2b2lkIHNldENvbm5lY3RUaW1lb3V0KGxvbmcgc2Vjb25kcyk7CisgIGxvbmcgZ2V0Q29ublRpbWVvdXQoKTsKKyAgdm9pZCBzZXRDb25uVGltZW91dChsb25nIHNlY29uZHMpOwogCi0gcHJpdmF0ZToKKyAgLy8gdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdlbmVyaWMgLyB0ZW1wbGF0ZSBzaXR1YXRpb25zLAorICAvLyBzbyBpdHMgbmFtZSBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcyBUUGlwZVNlcnZlcidzCisgIEhBTkRMRSBnZXROYXRpdmVXYWl0SGFuZGxlKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZUltcGw+IGltcGxfOworCiAgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKIAotICAvL05hbWVkIHBpcGUgaGFuZGxlcyBhcmUgUi9XLCB3aGlsZSBhbm9ueW1vdXMgcGlwZXMgYXJlIG9uZSBvciB0aGUgb3RoZXIgKGhhbGYgZHVwbGV4KS4KLSAgSEFORExFIFBpcGVfLCBQaXBlV3J0XzsKICAgbG9uZyBUaW1lb3V0U2Vjb25kc187Ci0gIGJvb2wgaXNBbm9ueW1vdXM7CisgIGJvb2wgaXNBbm9ueW1vdXNfOwogfTsKKwogI2Vsc2UKIHR5cGVkZWYgVFNvY2tldCBUUGlwZTsKICNlbmRpZgotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RQSVBFX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKaW5kZXggZjRkNDcwNC4uNTVjMzU4MCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5jcHAKQEAgLTE3LDE5MyArMTcsMzA4IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KICNpbmNsdWRlIDxjc3RyaW5nPgogCi0jaW5jbHVkZSAiVFBpcGUuaCIKLSNpbmNsdWRlICJUUGlwZVNlcnZlci5oIgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorCiAjaWZkZWYgX1dJTjMyCi0jICBpbmNsdWRlIDxBY2NDdHJsLmg+Ci0jICBpbmNsdWRlIDxBY2xhcGkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oPgorI2luY2x1ZGUgPEFjY0N0cmwuaD4KKyNpbmNsdWRlIDxBY2xhcGkuaD4KICNlbmRpZiAvL19XSU4zMgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAjaWZkZWYgX1dJTjMyCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAotLy8tLS0tIENvbnN0cnVjdG9ycyAtLS0tCi1UUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKSA6Ci0gIHBpcGVuYW1lXyhwaXBlbmFtZSksCi0gIGJ1ZnNpemVfKGJ1ZnNpemUpLAotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIG1heGNvbm5zXyhUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQpLAotICBpc0Fub255bW91cyhmYWxzZSkKLSB7Ci0gICAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOwotIH0KK2NsYXNzIFRQaXBlU2VydmVySW1wbCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CitwdWJsaWM6CisgIFRQaXBlU2VydmVySW1wbCgpIHt9CisgIHZpcnR1YWwgflRQaXBlU2VydmVySW1wbCgpIHt9CisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CiAKLVRQaXBlU2VydmVyOjpUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyAmcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUsIHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKSA6Ci0gIHBpcGVuYW1lXyhwaXBlbmFtZSksCi0gIGJ1ZnNpemVfKGJ1ZnNpemUpLAotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIGlzQW5vbnltb3VzKGZhbHNlKQotIHsgIC8vUmVzdHJpY3QgbWF4Y29ubnNfIHRvIDEtUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTCi0gICAgaWYobWF4Y29ubmVjdGlvbnMgPT0gMCkKLSAgICAgIG1heGNvbm5zXyA9IDE7Ci0gICAgZWxzZSBpZiAobWF4Y29ubmVjdGlvbnMgPiBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpCi0gICAgICBtYXhjb25uc18gPSBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVM7Ci0JZWxzZQotICAgICAgbWF4Y29ubnNfID0gbWF4Y29ubmVjdGlvbnM7CisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSA9IDA7CisgIHZpcnR1YWwgSEFORExFIGdldENsaWVudFJkUGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpID0gMDsKKyAgdmlydHVhbCBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpIHsgcmV0dXJuIE5VTEw7IH0KK307CiAKLSAgICBzZXRQaXBlbmFtZShwaXBlbmFtZSk7Ci0gfQotCi1UUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lKSA6Ci0gIHBpcGVuYW1lXyhwaXBlbmFtZSksCi0gIGJ1ZnNpemVfKDEwMjQpLAotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIG1heGNvbm5zXyhUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQpLAotICBpc0Fub255bW91cyhmYWxzZSkKLSB7Ci0gICAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOwotIH0KLQotVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKGludCBidWZzaXplKSA6Ci0gIHBpcGVuYW1lXygiIiksCi0gIGJ1ZnNpemVfKGJ1ZnNpemUpLAotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIG1heGNvbm5zXygxKSwKLSAgaXNBbm9ueW1vdXModHJ1ZSkKLSB7Ci0gIC8vVGhlIGFub255bW91cyBwaXBlIG5lZWRzIHRvIGJlIGNyZWF0ZWQgZmlyc3Qgc28gdGhhdCB0aGUgc2VydmVyIGNhbgotICAvL3Bhc3MgdGhlIGhhbmRsZXMgb24gdG8gdGhlIGNsaWVudCBiZWZvcmUgdGhlIHNlcnZlIChhY2NlcHRJbXBsKQotICAvL2Jsb2NraW5nIGNhbGwuCi0gIGlmICghVENyZWF0ZUFub25QaXBlKCkpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDcmVhdGUoQW5vbilQaXBlIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkIik7CitjbGFzcyBUQW5vblBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFBpcGVTZXJ2ZXJJbXBsIHsKK3B1YmxpYzoKKyAgVEFub25QaXBlU2VydmVyKCkgeworICAgIC8vIFRoZSBhbm9ueW1vdXMgcGlwZSBuZWVkcyB0byBiZSBjcmVhdGVkIGZpcnN0IHNvIHRoYXQgdGhlIHNlcnZlciBjYW4KKyAgICAvLyBwYXNzIHRoZSBoYW5kbGVzIG9uIHRvIHRoZSBjbGllbnQgYmVmb3JlIHRoZSBzZXJ2ZSAoYWNjZXB0SW1wbCkKKyAgICAvLyBibG9ja2luZyBjYWxsLgorICAgIGlmICghY3JlYXRlQW5vblBpcGUoKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlKEFub24pUGlwZSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkIik7CisgICAgfQogICB9CisKKyAgdmlydHVhbCB+VEFub25QaXBlU2VydmVyKCkgeworICAgIFBpcGVSXy5yZXNldCgpOworICAgIFBpcGVXXy5yZXNldCgpOworICAgIENsaWVudEFub25SZWFkXy5yZXNldCgpOworICAgIENsaWVudEFub25Xcml0ZV8ucmVzZXQoKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7fSAvLyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkCisKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworCisgIHZpcnR1YWwgSEFORExFIGdldFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlUl8uaDsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZVdfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgeyByZXR1cm4gQ2xpZW50QW5vblJlYWRfLmg7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIENsaWVudEFub25Xcml0ZV8uaDsgfQorCitwcml2YXRlOgorICBib29sIGNyZWF0ZUFub25QaXBlKCk7CisKKyAgVEF1dG9IYW5kbGUgUGlwZVJfOyAvLyBBbm9ueW1vdXMgUGlwZSAoUikKKyAgVEF1dG9IYW5kbGUgUGlwZVdfOyAvLyBBbm9ueW1vdXMgUGlwZSAoVykKKworICAvLyBDbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCisgIC8vPyBEbyB3ZSBuZWVkIGR1cGxpY2F0ZXMgdG8gc2VuZCB0byBjbGllbnQ/CisgIFRBdXRvSGFuZGxlIENsaWVudEFub25SZWFkXzsKKyAgVEF1dG9IYW5kbGUgQ2xpZW50QW5vbldyaXRlXzsKK307CisKK2NsYXNzIFROYW1lZFBpcGVTZXJ2ZXIgOiBwdWJsaWMgVFBpcGVTZXJ2ZXJJbXBsIHsKK3B1YmxpYzoKKyAgVE5hbWVkUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUsIHVpbnQzMl90IGJ1ZnNpemUsIHVpbnQzMl90IG1heGNvbm5lY3Rpb25zKQorICAgIDogc3RvcHBpbmdfKGZhbHNlKSwgcGlwZW5hbWVfKHBpcGVuYW1lKSwgYnVmc2l6ZV8oYnVmc2l6ZSksIG1heGNvbm5zXyhtYXhjb25uZWN0aW9ucykKKyAgeworICAgIGNvbm5lY3RPdmVybGFwXy5hY3Rpb24gPSBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpDT05ORUNUOworICAgIGNhbmNlbE92ZXJsYXBfLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OkNBTkNFTElPOworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOworICAgIGluaXRpYXRlTmFtZWRDb25uZWN0KGxvY2spOworICB9CisgIHZpcnR1YWwgflROYW1lZFBpcGVTZXJ2ZXIoKSB7fQorCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQoKTsKKyAgICBpZiAoUGlwZV8uaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgICAgc3RvcHBpbmdfID0gdHJ1ZTsKKyAgICAgIGNhbmNlbE92ZXJsYXBfLmggPSBQaXBlXy5oOworICAgICAgLy8gVGhpcyBzaG91bGQgd2FrZSB1cCBHZXRPdmVybGFwcGVkUmVzdWx0CisgICAgICB0aHJlYWRfLT5hZGRXb3JrSXRlbSgmY2FuY2VsT3ZlcmxhcF8pOworICAgIH0KKyAgfQorCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKworICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQorICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KKyAgdmlydHVhbCBIQU5ETEUgZ2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFOyB9CisgIHZpcnR1YWwgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKSB7IHJldHVybiBsaXN0ZW5fZXZlbnRfLmg7IH0KKworcHJpdmF0ZToKKyAgYm9vbCBjcmVhdGVOYW1lZFBpcGUoY29uc3QgVEF1dG9Dcml0ICZsb2NrUHJvb2YpOworICB2b2lkIGluaXRpYXRlTmFtZWRDb25uZWN0KGNvbnN0IFRBdXRvQ3JpdCAmbG9ja1Byb29mKTsKKworICBUQXV0b092ZXJsYXBUaHJlYWQgdGhyZWFkXzsKKyAgVE92ZXJsYXBwZWRXb3JrSXRlbSBjb25uZWN0T3ZlcmxhcF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gY2FuY2VsT3ZlcmxhcF87CisKKyAgYm9vbCBzdG9wcGluZ187CisgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKKyAgdWludDMyX3QgYnVmc2l6ZV87CisgIHVpbnQzMl90IG1heGNvbm5zXzsKKyAgVE1hbnVhbFJlc2V0RXZlbnQgbGlzdGVuX2V2ZW50XzsKKworICBUQ3JpdGljYWxTZWN0aW9uIHBpcGVfcHJvdGVjdF87CisgIC8vIG9ubHkgcmVhZCBvciB3cml0ZSB0aGVzZSB2YXJpYWJsZXMgdW5kZXJuZWF0aCBhIGxvY2tlZCBwaXBlX3Byb3RlY3RfCisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZT4gY2FjaGVkX2NsaWVudF87CisgIFRBdXRvSGFuZGxlIFBpcGVfOworfTsKKworSEFORExFIFRQaXBlU2VydmVyOjpnZXROYXRpdmVXYWl0SGFuZGxlKCkgeworICBpZiAoaW1wbF8pCisgICAgcmV0dXJuIGltcGxfLT5nZXROYXRpdmVXYWl0SGFuZGxlKCk7CisgIHJldHVybiBOVUxMOwogfQogCi1UUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoKSA6Ci0gIHBpcGVuYW1lXygiIiksCi0gIGJ1ZnNpemVfKDEwMjQpLAotICBQaXBlXyhJTlZBTElEX0hBTkRMRV9WQUxVRSksCi0gIG1heGNvbm5zXygxKSwKLSAgaXNBbm9ueW1vdXModHJ1ZSkKLXsKLSAgaWYgKCFUQ3JlYXRlQW5vblBpcGUoKSkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZShBbm9uKVBpcGUgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVFBpcGVTZXJ2ZXIgQ3JlYXRlKEFub24pUGlwZSBmYWlsZWQiKTsKLSAgfQorLy8tLS0tIENvbnN0cnVjdG9ycyAtLS0tCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKQorICA6IGJ1ZnNpemVfKGJ1ZnNpemUpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucykKKyAgOiBidWZzaXplXyhidWZzaXplKSwgaXNBbm9ueW1vdXNfKGZhbHNlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKG1heGNvbm5lY3Rpb25zKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKSA6IGJ1ZnNpemVfKDEwMjQpLCBpc0Fub255bW91c18oZmFsc2UpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgc2V0UGlwZW5hbWUocGlwZW5hbWUpOworfQorCitUUGlwZVNlcnZlcjo6VFBpcGVTZXJ2ZXIoaW50IGJ1ZnNpemUpIDogYnVmc2l6ZV8oYnVmc2l6ZSksIGlzQW5vbnltb3VzXyh0cnVlKSB7CisgIHNldE1heENvbm5lY3Rpb25zKDEpOworICBpbXBsXy5yZXNldChuZXcgVEFub25QaXBlU2VydmVyKTsKK30KKworVFBpcGVTZXJ2ZXI6OlRQaXBlU2VydmVyKCkgOiBidWZzaXplXygxMDI0KSwgaXNBbm9ueW1vdXNfKHRydWUpIHsKKyAgc2V0TWF4Q29ubmVjdGlvbnMoMSk7CisgIGltcGxfLnJlc2V0KG5ldyBUQW5vblBpcGVTZXJ2ZXIpOwogfQogCiAvLy0tLS0gRGVzdHJ1Y3RvciAtLS0tCi1UUGlwZVNlcnZlcjo6flRQaXBlU2VydmVyKCkgewotICBjbG9zZSgpOwotfQorVFBpcGVTZXJ2ZXI6On5UUGlwZVNlcnZlcigpIHt9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUcmFuc3BvcnQgY2FsbGJhY2tzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBUUGlwZVNlcnZlcjo6bGlzdGVuKCkgeworICBpZiAoaXNBbm9ueW1vdXNfKQorICAgIHJldHVybjsKKyAgaW1wbF8ucmVzZXQobmV3IFROYW1lZFBpcGVTZXJ2ZXIocGlwZW5hbWVfLCBidWZzaXplXywgbWF4Y29ubnNfKSk7Cit9CiAKIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVFBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7Ci0gIHNoYXJlZF9wdHI8VFBpcGU+IGNsaWVudDsKKyAgcmV0dXJuIGltcGxfLT5hY2NlcHRJbXBsKCk7Cit9CiAKLSAgaWYoaXNBbm9ueW1vdXMpCi0gIHsgLy9Bbm9ueW1vdXMgUGlwZQotICAgIC8vVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KLSAgICBieXRlIGJ1ZjsKLSAgICBEV09SRCBicjsKLSAgICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZSgKLSAgICAgICAgICBQaXBlXywgLy8gcGlwZSBoYW5kbGUKLSAgICAgICAgICAmYnVmLCAgIC8vIGJ1ZmZlciB0byByZWNlaXZlIHJlcGx5Ci0gICAgICAgICAgMCwgICAgICAvLyBzaXplIG9mIGJ1ZmZlcgotICAgICAgICAgICZiciwgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKLSAgICAgICAgICBOVUxMKTsgIC8vIG5vdCBvdmVybGFwcGVkCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFRBbm9uUGlwZVNlcnZlcjo6YWNjZXB0SW1wbCgpIHsKKyAgLy8gVGhpcyAwLWJ5dGUgcmVhZCBzZXJ2ZXMgbWVyZWx5IGFzIGEgYmxvY2tpbmcgY2FsbC4KKyAgYnl0ZSBidWY7CisgIERXT1JEIGJyOworICBpbnQgZlN1Y2Nlc3MgPSBSZWFkRmlsZShQaXBlUl8uaCwgLy8gcGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZiwgICAgIC8vIGJ1ZmZlciB0byByZWNlaXZlIHJlcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAvLyBzaXplIG9mIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnIsICAgICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAgIC8vIG5vdCBvdmVybGFwcGVkCiAKLSAgICBpZiAoICFmU3VjY2VzcyAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9NT1JFX0RBVEEgKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tcywgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVFBpcGVTZXJ2ZXIgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXMiKTsKLSAgICB9Ci0JY2xpZW50LnJlc2V0KG5ldyBUUGlwZShQaXBlXywgUGlwZVdfKSk7CisgIGlmICghZlN1Y2Nlc3MgJiYgR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfTU9SRV9EQVRBKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXMsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgdW5hYmxlIHRvIGluaXRpYXRlIHBpcGUgY29tbXMiKTsKICAgfQotICBlbHNlCi0gIHsgLy9OYW1lZCBQaXBlCi0gICAgaW50IENvbm5lY3RSZXQ7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWYgKCFUQ3JlYXRlTmFtZWRQaXBlKCkpIHsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlTmFtZWRQaXBlIGZhaWxlZCwgR0xFPSIsIEdldExhc3RFcnJvcigpKTsKLSAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBUUGlwZVNlcnZlciBDcmVhdGVOYW1lZFBpcGUgZmFpbGVkIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdDsgaWYgaXQgc3VjY2VlZHMsIHRoZQotICAgICAgLy8gZnVuY3Rpb24gcmV0dXJucyBhIG5vbnplcm8gdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0gICAgICAvLyB6ZXJvLCBHZXRMYXN0RXJyb3Igc2hvdWxkIHJldHVybiBFUlJPUl9QSVBFX0NPTk5FQ1RFRC4KLSAgICAgIENvbm5lY3RSZXQgPSBDb25uZWN0TmFtZWRQaXBlKFBpcGVfLCBOVUxMKSA/Ci0gICAgICAgICAgICAgICAgICAgIFRSVUUgOiAoR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfUElQRV9DT05ORUNURUQpOwotCi0gICAgICBpZiAoQ29ubmVjdFJldCA9PSBUUlVFKQotICAgICAgewotICAgICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJDbGllbnQgY29ubmVjdGVkLiIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOwotICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFBpcGVTZXJ2ZXI6IGNsaWVudCBjb25uZWN0aW9uIGZhaWxlZCIpOwotICAgICAgfQotICAgIH0KLQljbGllbnQucmVzZXQobmV3IFRQaXBlKFBpcGVfKSk7Ci0gIH0KLQorICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVSXy5oLCBQaXBlV18uaCkpOwogICByZXR1cm4gY2xpZW50OwogfQogCi12b2lkIFRQaXBlU2VydmVyOjppbnRlcnJ1cHQoKSB7Ci0gIGlmKFBpcGVfICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgQ2FuY2VsSW8oUGlwZV8pOwordm9pZCBUTmFtZWRQaXBlU2VydmVyOjppbml0aWF0ZU5hbWVkQ29ubmVjdChjb25zdCBUQXV0b0NyaXQgJmxvY2tQcm9vZikgeworICBpZiAoc3RvcHBpbmdfKQorICAgIHJldHVybjsKKyAgaWYgKCFjcmVhdGVOYW1lZFBpcGUobG9ja1Byb29mKSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENyZWF0ZU5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIiBUUGlwZVNlcnZlciBDcmVhdGVOYW1lZFBpcGUgZmFpbGVkIik7CiAgIH0KKworICAvLyBUaGUgcHJpb3IgY29ubmVjdGlvbiBoYXMgYmVlbiBoYW5kbGVkLCBzbyBjbG9zZSB0aGUgZ2F0ZQorICBSZXNldEV2ZW50KGxpc3Rlbl9ldmVudF8uaCk7CisgIGNvbm5lY3RPdmVybGFwXy5yZXNldChOVUxMLCAwLCBsaXN0ZW5fZXZlbnRfLmgpOworICBjb25uZWN0T3ZlcmxhcF8uaCA9IFBpcGVfLmg7CisgIHRocmVhZF8tPmFkZFdvcmtJdGVtKCZjb25uZWN0T3ZlcmxhcF8pOworCisgIC8vIFdhaXQgZm9yIHRoZSBjbGllbnQgdG8gY29ubmVjdDsgaWYgaXQgc3VjY2VlZHMsIHRoZQorICAvLyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8gemVybywgR2V0TGFzdEVycm9yIHNob3VsZCByZXR1cm4gRVJST1JfUElQRV9DT05ORUNURUQuCisgIGlmIChjb25uZWN0T3ZlcmxhcF8uc3VjY2VzcykgeworICAgIEdsb2JhbE91dHB1dC5wcmludGYoIkNsaWVudCBjb25uZWN0ZWQuIik7CisgICAgY2FjaGVkX2NsaWVudF8ucmVzZXQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8gbWFrZSBzdXJlIHBlb3BsZSBrbm93IHRoYXQgYSBjb25uZWN0aW9uIGlzIHJlYWR5CisgICAgU2V0RXZlbnQobGlzdGVuX2V2ZW50Xy5oKTsKKyAgICByZXR1cm47CisgIH0KKworICBEV09SRCBkd0VyciA9IGNvbm5lY3RPdmVybGFwXy5sYXN0X2Vycm9yOworICBzd2l0Y2ggKGR3RXJyKSB7CisgIGNhc2UgRVJST1JfUElQRV9DT05ORUNURUQ6CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBjYWNoZWRfY2xpZW50Xy5yZXNldChuZXcgVFBpcGUoUGlwZV8pKTsKKyAgICAvLyBtYWtlIHN1cmUgcGVvcGxlIGtub3cgdGhhdCBhIGNvbm5lY3Rpb24gaXMgcmVhZHkKKyAgICBTZXRFdmVudChsaXN0ZW5fZXZlbnRfLmgpOworICAgIHJldHVybjsKKyAgY2FzZSBFUlJPUl9JT19QRU5ESU5HOgorICAgIHJldHVybjsgLy8gYWNjZXB0SW1wbCB3aWxsIGRvIHRoZSBhcHByb3ByaWF0ZSBXYWl0Rm9yTXVsdGlwbGVPYmplY3RzCisgIGRlZmF1bHQ6CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQsIEdMRT0iLCBkd0Vycik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVFBpcGVTZXJ2ZXIgQ29ubmVjdE5hbWVkUGlwZSBmYWlsZWQiKTsKKyAgfQorfQorCitzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFROYW1lZFBpcGVTZXJ2ZXI6OmFjY2VwdEltcGwoKSB7CisgIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsKKyAgICBpZiAoY2FjaGVkX2NsaWVudF8uZ2V0KCkgIT0gTlVMTCkgeworICAgICAgc2hhcmVkX3B0cjxUUGlwZT4gY2xpZW50OworICAgICAgLy8gemVybyBvdXQgY2FjaGVkX2NsaWVudCwgc2luY2Ugd2UgYXJlIGFib3V0IHRvIHJldHVybiBpdC4KKyAgICAgIGNsaWVudC5zd2FwKGNhY2hlZF9jbGllbnRfKTsKKworICAgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgICBpbml0aWF0ZU5hbWVkQ29ubmVjdChsb2NrKTsKKyAgICAgIHJldHVybiBjbGllbnQ7IC8vIHN1Y2Nlc3MhCisgICAgfQorICB9CisKKyAgaWYgKFBpcGVfLmggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlROYW1lZFBpcGVTZXJ2ZXI6IHNvbWVvbmUgY2FsbGVkIGFjY2VwdCBvbiBhIGNsb3NlZCBwaXBlIHNlcnZlciIpOworICB9CisKKyAgRFdPUkQgZHdEdW1teSA9IDA7CisKKyAgLy8gRm9yIHRoZSBtb3N0IHBhcnQsIFBpcGVfIHNob3VsZCBiZSBwcm90ZWN0ZWQgd2l0aCBwaXBlX3Byb3RlY3RfLiAgV2UgY2FuJ3QKKyAgLy8gcmVhc29uYWJseSBkbyB0aGF0IGhlcmUgdGhvdWdoIHdpdGhvdXQgYnJlYWtpbmcgaW50ZXJydXB0YWJpbGl0eS4gIEhvd2V2ZXIsCisgIC8vIHRoaXMgc2hvdWxkIGJlIHNhZmUsIHRob3VnaCBJJ20gbm90IGhhcHB5IGFib3V0IGl0LiAgV2Ugb25seSBuZWVkIHRvIGVuc3VyZQorICAvLyB0aGF0IG5vIG9uZSB3cml0ZXMgLyBtb2RpZmllcyBQaXBlXy5oIHdoaWxlIHdlIGFyZSByZWFkaW5nIGl0LiAgV2VsbCwgdGhlCisgIC8vIG9ubHkgdHdvIHRoaW5ncyB0aGF0IHNob3VsZCBiZSBtb2RpZnlpbmcgUGlwZV8gYXJlIGFjY2VwdEltcGwsIHRoZQorICAvLyBmdW5jdGlvbnMgaXQgY2FsbHMsIGFuZCB0aGUgZGVzdHJ1Y3Rvci4gIFRob3NlIHRoaW5ncyBzaG91bGRuJ3QgYmUgcnVuCisgIC8vIGNvbmN1cnJlbnRseSBhbnl3YXkuICBTbyB0aGlzIGNhbGwgaXMgJ3JlYWxseScganVzdCBhIHJlYWQgdGhhdCBtYXkgaGFwcGVuCisgIC8vIGNvbmN1cnJlbnRseSB3aXRoIGludGVycnVwdCwgYW5kIHRoYXQgc2hvdWxkIGJlIGZpbmUuCisgIGlmIChHZXRPdmVybGFwcGVkUmVzdWx0KFBpcGVfLmgsICZjb25uZWN0T3ZlcmxhcF8ub3ZlcmxhcCwgJmR3RHVtbXksIFRSVUUpKSB7CisgICAgVEF1dG9Dcml0IGxvY2socGlwZV9wcm90ZWN0Xyk7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiQ2xpZW50IGNvbm5lY3RlZC4iKTsKKyAgICBzaGFyZWRfcHRyPFRQaXBlPiBjbGllbnQobmV3IFRQaXBlKFBpcGVfKSk7CisgICAgLy8ga2ljayBvZmYgdGhlIG5leHQgY29ubmVjdGlvbiBiZWZvcmUgcmV0dXJuaW5nCisgICAgaW5pdGlhdGVOYW1lZENvbm5lY3QobG9jayk7CisgICAgcmV0dXJuIGNsaWVudDsgLy8gc3VjY2VzcyEKKyAgfQorICAvLyBpZiB3ZSBnb3QgaGVyZSwgdGhlbiB3ZSBhcmUgaW4gYW4gZXJyb3IgLyBzaHV0ZG93biBjYXNlCisgIERXT1JEIGdsZSA9IEdldExhc3RFcnJvcigpOyAvLyBzYXZlIGVycm9yIGJlZm9yZSBkb2luZyBjbGVhbnVwCisgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRQaXBlU2VydmVyIENvbm5lY3ROYW1lZFBpcGUgR0xFPSIsIGdsZSk7CisgIGlmKGdsZSA9PSBFUlJPUl9PUEVSQVRJT05fQUJPUlRFRCkgeworICAgIFRBdXRvQ3JpdCBsb2NrKHBpcGVfcHJvdGVjdF8pOyAgICAJLy8gTmVlZGVkIHRvIGluc3VyZSBjb25jdXJyZW50IHRocmVhZCB0byBiZSBvdXQgb2YgaW50ZXJydXB0LgorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsICJUUGlwZVNlcnZlcjogc2VydmVyIGludGVydXB0ZWQiKTsKKyAgfQorICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVFBpcGVTZXJ2ZXI6IGNsaWVudCBjb25uZWN0aW9uIGZhaWxlZCIpOworfQorCit2b2lkIFRQaXBlU2VydmVyOjppbnRlcnJ1cHQoKSB7CisgIGlmIChpbXBsXykKKyAgICBpbXBsXy0+aW50ZXJydXB0KCk7CiB9CiAKIHZvaWQgVFBpcGVTZXJ2ZXI6OmNsb3NlKCkgewotICBpZighaXNBbm9ueW1vdXMpCi0gIHsKLSAgICBpZihQaXBlXyAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgewotICAgICAgRGlzY29ubmVjdE5hbWVkUGlwZShQaXBlXyk7Ci0gICAgICBDbG9zZUhhbmRsZShQaXBlXyk7Ci0gICAgICBQaXBlXyA9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICB0cnkgewotICAgICAgQ2xvc2VIYW5kbGUoUGlwZV8pOwotICAgICAgQ2xvc2VIYW5kbGUoUGlwZVdfKTsKLSAgICAgIENsb3NlSGFuZGxlKENsaWVudEFub25SZWFkKTsKLSAgICAgIENsb3NlSGFuZGxlKENsaWVudEFub25Xcml0ZSk7Ci0gICAgfQotICAgIGNhdGNoKC4uLikgewotICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBhbm9uIGNsb3NlIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7Ci0gICAgfQotICB9CisgIGltcGxfLnJlc2V0KCk7CiB9CiAKK2Jvb2wgVE5hbWVkUGlwZVNlcnZlcjo6Y3JlYXRlTmFtZWRQaXBlKGNvbnN0IFRBdXRvQ3JpdCAmIC8qbG9ja1Byb29mKi8pIHsKIAotYm9vbCBUUGlwZVNlcnZlcjo6VENyZWF0ZU5hbWVkUGlwZSgpIHsKLQotICAvL1dpbmRvd3MgLSBzZXQgc2VjdXJpdHkgdG8gYWxsb3cgbm9uLWVsZXZhdGVkIGFwcHMKLSAgLy90byBhY2Nlc3MgcGlwZXMgY3JlYXRlZCBieSBlbGV2YXRlZCBhcHBzLgorICAvLyBXaW5kb3dzIC0gc2V0IHNlY3VyaXR5IHRvIGFsbG93IG5vbi1lbGV2YXRlZCBhcHBzCisgIC8vIHRvIGFjY2VzcyBwaXBlcyBjcmVhdGVkIGJ5IGVsZXZhdGVkIGFwcHMuCiAgIFNJRF9JREVOVElGSUVSX0FVVEhPUklUWSBTSURBdXRoV29ybGQgPSBTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZOwogICBQU0lEIGV2ZXJ5b25lX3NpZCA9IE5VTEw7Ci0gIEFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZCgmU0lEQXV0aFdvcmxkLCAxLCBTRUNVUklUWV9XT1JMRF9SSUQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICZldmVyeW9uZV9zaWQpOworICBBbGxvY2F0ZUFuZEluaXRpYWxpemVTaWQoCisgICAgICAmU0lEQXV0aFdvcmxkLCAxLCBTRUNVUklUWV9XT1JMRF9SSUQsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICZldmVyeW9uZV9zaWQpOwogCiAgIEVYUExJQ0lUX0FDQ0VTUyBlYTsKICAgWmVyb01lbW9yeSgmZWEsIHNpemVvZihFWFBMSUNJVF9BQ0NFU1MpKTsKQEAgLTIxMiwxMiArMzI3LDEyIEBACiAgIGVhLmdyZkluaGVyaXRhbmNlID0gTk9fSU5IRVJJVEFOQ0U7CiAgIGVhLlRydXN0ZWUuVHJ1c3RlZUZvcm0gPSBUUlVTVEVFX0lTX1NJRDsKICAgZWEuVHJ1c3RlZS5UcnVzdGVlVHlwZSA9IFRSVVNURUVfSVNfV0VMTF9LTk9XTl9HUk9VUDsKLSAgZWEuVHJ1c3RlZS5wdHN0ck5hbWUgID0gKExQU1RSKWV2ZXJ5b25lX3NpZDsKKyAgZWEuVHJ1c3RlZS5wdHN0ck5hbWUgPSBzdGF0aWNfY2FzdDxMUFRTVFI+KGV2ZXJ5b25lX3NpZCk7CiAKICAgUEFDTCBhY2wgPSBOVUxMOwogICBTZXRFbnRyaWVzSW5BY2woMSwgJmVhLCBOVUxMLCAmYWNsKTsKIAotICBQU0VDVVJJVFlfREVTQ1JJUFRPUiBzZCA9IChQU0VDVVJJVFlfREVTQ1JJUFRPUilMb2NhbEFsbG9jKExQVFIsU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKTsKKyAgUFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2QgPSAoUFNFQ1VSSVRZX0RFU0NSSVBUT1IpTG9jYWxBbGxvYyhMUFRSLCBTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpOwogICBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKTsKICAgU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbChzZCwgVFJVRSwgYWNsLCBGQUxTRSk7CiAKQEAgLTIyNyw1NiArMzQyLDYzIEBACiAgIHNhLmJJbmhlcml0SGFuZGxlID0gRkFMU0U7CiAKICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBuYW1lZCBwaXBlCi0gIEhBTkRMRSBoUGlwZV8gPSBDcmVhdGVOYW1lZFBpcGUoCi0gICAgICAgIHBpcGVuYW1lXy5jX3N0cigpLCAgICAgICAgLy8gcGlwZSBuYW1lCi0gICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCwgICAgICAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKLSAgICAgICAgUElQRV9UWVBFX01FU1NBR0UgfCAgICAgICAvLyBtZXNzYWdlIHR5cGUgcGlwZQotICAgICAgICBQSVBFX1JFQURNT0RFX01FU1NBR0UsICAgIC8vIG1lc3NhZ2UtcmVhZCBtb2RlCi0gICAgICAgIG1heGNvbm5zXywgICAgICAgICAgICAgICAgLy8gbWF4LiBpbnN0YW5jZXMKLSAgICAgICAgYnVmc2l6ZV8sICAgICAgICAgICAgICAgICAvLyBvdXRwdXQgYnVmZmVyIHNpemUKLSAgICAgICAgYnVmc2l6ZV8sICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCB0aW1lLW91dAotICAgICAgICAmc2EpOyAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VjdXJpdHkgYXR0cmlidXRlCisgIFRBdXRvSGFuZGxlIGhQaXBlKENyZWF0ZU5hbWVkUGlwZUEocGlwZW5hbWVfLmNfc3RyKCksICAgIC8vIHBpcGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCB8ICAvLyByZWFkL3dyaXRlIGFjY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfRkxBR19PVkVSTEFQUEVELCAvLyBhc3luYyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9UWVBFX0JZVEUgfCAgICAgIC8vIGJ5dGUgdHlwZSBwaXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgIC8vIGJ5dGUgcmVhZCBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y29ubnNfLCAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZV8sICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemVfLCAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgdGltZS1vdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2EpKTsgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkgYXR0cmlidXRlcwogCi0gIGlmKGhQaXBlXyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgewotICAgIFBpcGVfID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkIiwgR2V0TGFzdEVycm9yKCkpOworICBEV09SRCBsYXN0RXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgTG9jYWxGcmVlKHNkKTsKKyAgTG9jYWxGcmVlKGFjbCk7CisgIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKKworICBpZiAoaFBpcGUuaCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIFBpcGVfLnJlc2V0KCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgbGFzdEVycm9yKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQiLAorICAgICAgICAgICAgICAgIGxhc3RFcnJvcik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgUGlwZV8gPSBoUGlwZV87CisgIFBpcGVfLnJlc2V0KGhQaXBlLnJlbGVhc2UoKSk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFRQaXBlU2VydmVyOjpUQ3JlYXRlQW5vblBpcGUoKSB7Citib29sIFRBbm9uUGlwZVNlcnZlcjo6Y3JlYXRlQW5vblBpcGUoKSB7CiAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgc2E7Ci0gIFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7IC8vc2VjdXJpdHkgaW5mb3JtYXRpb24gZm9yIHBpcGVzCisgIFNFQ1VSSVRZX0RFU0NSSVBUT1Igc2Q7IC8vIHNlY3VyaXR5IGluZm9ybWF0aW9uIGZvciBwaXBlcwogCi0gIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoJnNkLFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pOworICBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCZzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTik7CiAgIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woJnNkLCB0cnVlLCBOVUxMLCBmYWxzZSk7CiAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yID0gJnNkOwogICBzYS5uTGVuZ3RoID0gc2l6ZW9mKFNFQ1VSSVRZX0FUVFJJQlVURVMpOwotICBzYS5iSW5oZXJpdEhhbmRsZSA9IHRydWU7IC8vYWxsb3cgcGFzc2luZyBoYW5kbGUgdG8gY2hpbGQKKyAgc2EuYkluaGVyaXRIYW5kbGUgPSB0cnVlOyAvLyBhbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAogCiAgIEhBTkRMRSBDbGllbnRBbm9uUmVhZEgsIFBpcGVXX0gsIENsaWVudEFub25Xcml0ZUgsIFBpcGVfSDsKLSAgaWYgKCFDcmVhdGVQaXBlKCZDbGllbnRBbm9uUmVhZEgsJlBpcGVXX0gsJnNhLDApKSAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgaWYgKCFDcmVhdGVQaXBlKCZDbGllbnRBbm9uUmVhZEgsICZQaXBlV19ILCAmc2EsIDApKSAvLyBjcmVhdGUgc3RkaW4gcGlwZQogICB7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAoIUNyZWF0ZVBpcGUoJlBpcGVfSCwmQ2xpZW50QW5vbldyaXRlSCwmc2EsMCkpICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICBpZiAoIUNyZWF0ZVBpcGUoJlBpcGVfSCwgJkNsaWVudEFub25Xcml0ZUgsICZzYSwgMCkpIC8vIGNyZWF0ZSBzdGRvdXQgcGlwZQogICB7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXIgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOwogICAgIENsb3NlSGFuZGxlKENsaWVudEFub25SZWFkSCk7CiAgICAgQ2xvc2VIYW5kbGUoUGlwZVdfSCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIENsaWVudEFub25SZWFkICA9IENsaWVudEFub25SZWFkSDsKLSAgQ2xpZW50QW5vbldyaXRlID0gQ2xpZW50QW5vbldyaXRlSDsKLSAgUGlwZV8gID0gUGlwZV9IOwotICBQaXBlV18gPSBQaXBlV19IOworCisgIENsaWVudEFub25SZWFkXy5yZXNldChDbGllbnRBbm9uUmVhZEgpOworICBDbGllbnRBbm9uV3JpdGVfLnJlc2V0KENsaWVudEFub25Xcml0ZUgpOworICBQaXBlUl8ucmVzZXQoUGlwZV9IKTsKKyAgUGlwZVdfLnJlc2V0KFBpcGVXX0gpOwogCiAgIHJldHVybiB0cnVlOwogfQpAQCAtMjg0LDUyICs0MDYsNTQgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBY2Nlc3NvcnMKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CitzdGQ6OnN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CiAgIHJldHVybiBwaXBlbmFtZV87CiB9CiAKLXZvaWQgVFBpcGVTZXJ2ZXI6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSkgewotICBpZihwaXBlbmFtZS5maW5kKCJcXFxcIikgPT0gLTEpCit2b2lkIFRQaXBlU2VydmVyOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIHsKKyAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKICAgICBwaXBlbmFtZV8gPSAiXFxcXC5cXHBpcGVcXCIgKyBwaXBlbmFtZTsKICAgZWxzZQogICAgIHBpcGVuYW1lXyA9IHBpcGVuYW1lOwogfQogCi1pbnQgIFRQaXBlU2VydmVyOjpnZXRCdWZmZXJTaXplKCkgeworaW50IFRQaXBlU2VydmVyOjpnZXRCdWZmZXJTaXplKCkgewogICByZXR1cm4gYnVmc2l6ZV87CiB9Ci0KIHZvaWQgVFBpcGVTZXJ2ZXI6OnNldEJ1ZmZlclNpemUoaW50IGJ1ZnNpemUpIHsKICAgYnVmc2l6ZV8gPSBidWZzaXplOwogfQogCiBIQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldFBpcGVIYW5kbGUoKSB7Ci0gIHJldHVybiBQaXBlXzsKKyAgcmV0dXJuIGltcGxfID8gaW1wbF8tPmdldFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOwogfQotCi1IQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldFdydFBpcGVIYW5kbGUoKQotewotICByZXR1cm4gUGlwZVdfOworSEFORExFIFRQaXBlU2VydmVyOjpnZXRXcnRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0V3J0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiB9Ci0KLUhBTkRMRSBUUGlwZVNlcnZlcjo6Z2V0Q2xpZW50UmRQaXBlSGFuZGxlKCkKLXsKLSAgcmV0dXJuIENsaWVudEFub25SZWFkOworSEFORExFIFRQaXBlU2VydmVyOjpnZXRDbGllbnRSZFBpcGVIYW5kbGUoKSB7CisgIHJldHVybiBpbXBsXyA/IGltcGxfLT5nZXRDbGllbnRSZFBpcGVIYW5kbGUoKSA6IElOVkFMSURfSEFORExFX1ZBTFVFOwogfQotCi1IQU5ETEUgVFBpcGVTZXJ2ZXI6OmdldENsaWVudFdydFBpcGVIYW5kbGUoKQotewotICByZXR1cm4gQ2xpZW50QW5vbldyaXRlOworSEFORExFIFRQaXBlU2VydmVyOjpnZXRDbGllbnRXcnRQaXBlSGFuZGxlKCkgeworICByZXR1cm4gaW1wbF8gPyBpbXBsXy0+Z2V0Q2xpZW50V3J0UGlwZUhhbmRsZSgpIDogSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiB9CiAKIGJvb2wgVFBpcGVTZXJ2ZXI6OmdldEFub255bW91cygpIHsKLSAgcmV0dXJuIGlzQW5vbnltb3VzOworICByZXR1cm4gaXNBbm9ueW1vdXNfOwogfQotCiB2b2lkIFRQaXBlU2VydmVyOjpzZXRBbm9ueW1vdXMoYm9vbCBhbm9uKSB7Ci0gIGlzQW5vbnltb3VzID0gYW5vbjsKKyAgaXNBbm9ueW1vdXNfID0gYW5vbjsKIH0KLSNlbmRpZiAvL19XSU4zMgogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAordm9pZCBUUGlwZVNlcnZlcjo6c2V0TWF4Q29ubmVjdGlvbnModWludDMyX3QgbWF4Y29ubmVjdGlvbnMpIHsKKyAgaWYgKG1heGNvbm5lY3Rpb25zID09IDApCisgICAgbWF4Y29ubnNfID0gMTsKKyAgZWxzZSBpZiAobWF4Y29ubmVjdGlvbnMgPiBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMpCisgICAgbWF4Y29ubnNfID0gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTOworICBlbHNlCisgICAgbWF4Y29ubnNfID0gbWF4Y29ubmVjdGlvbnM7Cit9CisKKyNlbmRpZiAvL19XSU4zMgorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2MjRhMzBhLi5jOWIxM2U1Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKQEAgLTIwLDcxICsyMCw4NCBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfIDEKIAotI2luY2x1ZGUgIlRTZXJ2ZXJUcmFuc3BvcnQuaCIKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CiAjaWZuZGVmIF9XSU4zMgotIyAgaW5jbHVkZSAiVFNlcnZlclNvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgogI2VuZGlmCiAKLSNkZWZpbmUgVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUIDEwCisjZGVmaW5lIFRQSVBFX1NFUlZFUl9NQVhfQ09OTlNfREVGQVVMVCBQSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogLyoqCiAgKiBXaW5kb3dzIFBpcGVzIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuCisgKiBEb24ndCBkZXN0cm95IGEgVFBpcGVTZXJ2ZXIgYXQgZ2xvYmFsIHNjb3BlLCBhcyB0aGF0IHdpbGwgY2F1c2UgYSB0aHJlYWQgam9pbgorICogZHVyaW5nIERMTE1haW4uICBUaGF0IGFsc28gbWVhbnMgdGhhdCBUU2VydmVyJ3MgdXNpbmcgVFBpcGVTZXJ2ZXIgc2hvdWxkbid0IGJlIGF0IGdsb2JhbAorICogc2NvcGUuCiAgKi8KICNpZmRlZiBfV0lOMzIKK2NsYXNzIFRQaXBlU2VydmVySW1wbDsKK2NsYXNzIFRQaXBlOworCiBjbGFzcyBUUGlwZVNlcnZlciA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIC8vQ29uc3RydWN0b3JzCitwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9ycwogICAvLyBOYW1lZCBQaXBlIC0KLSAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplKTsKLSAgVFBpcGVTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lLCB1aW50MzJfdCBidWZzaXplLCB1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7Ci0gIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nICZwaXBlbmFtZSk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSk7CisgIFRQaXBlU2VydmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSwgdWludDMyX3QgYnVmc2l6ZSwgdWludDMyX3QgbWF4Y29ubmVjdGlvbnMpOworICBUUGlwZVNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpOwogICAvLyBBbm9ueW1vdXMgcGlwZSAtCiAgIFRQaXBlU2VydmVyKGludCBidWZzaXplKTsKICAgVFBpcGVTZXJ2ZXIoKTsKIAotICAvL0Rlc3RydWN0b3IKLSAgflRQaXBlU2VydmVyKCk7CisgIC8vIERlc3RydWN0b3IKKyAgdmlydHVhbCB+VFBpcGVTZXJ2ZXIoKTsKIAotICAvL1N0YW5kYXJkIHRyYW5zcG9ydCBjYWxsYmFja3MKLSAgdm9pZCBpbnRlcnJ1cHQoKTsKLSAgdm9pZCBjbG9zZSgpOwotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICAvLyBTdGFuZGFyZCB0cmFuc3BvcnQgY2FsbGJhY2tzCisgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisgIHZpcnR1YWwgdm9pZCBsaXN0ZW4oKTsKIAotICBib29sIFRDcmVhdGVOYW1lZFBpcGUoKTsKLSAgYm9vbCBUQ3JlYXRlQW5vblBpcGUoKTsKLQotIHB1YmxpYzoKLSAgLy9BY2Nlc3NvcnMKKyAgLy8gQWNjZXNzb3JzCiAgIHN0ZDo6c3RyaW5nIGdldFBpcGVuYW1lKCk7Ci0gIHZvaWQgc2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJnBpcGVuYW1lKTsKLSAgaW50ICBnZXRCdWZmZXJTaXplKCk7CisgIHZvaWQgc2V0UGlwZW5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHBpcGVuYW1lKTsKKyAgaW50IGdldEJ1ZmZlclNpemUoKTsKICAgdm9pZCBzZXRCdWZmZXJTaXplKGludCBidWZzaXplKTsKLSAgSEFORExFIGdldFBpcGVIYW5kbGUoKTsgIC8vTmFtZWQgUGlwZSBSL1cgLW9yLSBBbm9ueW1vdXMgcGlwZSBSZWFkIGhhbmRsZQorICBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpOyAvLyBOYW1lZCBQaXBlIFIvVyAtb3ItIEFub255bW91cyBwaXBlIFJlYWQgaGFuZGxlCiAgIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCk7CiAgIEhBTkRMRSBnZXRDbGllbnRSZFBpcGVIYW5kbGUoKTsKICAgSEFORExFIGdldENsaWVudFdydFBpcGVIYW5kbGUoKTsKICAgYm9vbCBnZXRBbm9ueW1vdXMoKTsKICAgdm9pZCBzZXRBbm9ueW1vdXMoYm9vbCBhbm9uKTsKKyAgdm9pZCBzZXRNYXhDb25uZWN0aW9ucyh1aW50MzJfdCBtYXhjb25uZWN0aW9ucyk7CiAKLSBwcml2YXRlOgorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gZ2VuZXJpYyAvIHRlbXBsYXRlIHNpdHVhdGlvbnMsCisgIC8vIHNvIGl0cyBuYW1lIG5lZWRzIHRvIGJlIHRoZSBzYW1lIGFzIFRQaXBlJ3MKKyAgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZVNlcnZlckltcGw+IGltcGxfOworCiAgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKICAgdWludDMyX3QgYnVmc2l6ZV87Ci0gIEhBTkRMRSBQaXBlXzsgIC8vTmFtZWQgUGlwZSAoUi9XKSBvciBBbm9ueW1vdXMgUGlwZSAoUikKICAgdWludDMyX3QgbWF4Y29ubnNfOwotICBIQU5ETEUgUGlwZVdfOyAvL0Fub255bW91cyBQaXBlIChXKQotICBIQU5ETEUgQ2xpZW50QW5vblJlYWQsIENsaWVudEFub25Xcml0ZTsgLy9DbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCi0gIC8vPyBEbyB3ZSBuZWVkIGR1cGxpY2F0ZXMgdG8gc2VuZCB0byBjbGllbnQ/Ci0gIGJvb2wgaXNBbm9ueW1vdXM7CisgIGJvb2wgaXNBbm9ueW1vdXNfOwogfTsKICNlbHNlIC8vX1dJTjMyCiAvLypOSVggbmFtZWQgcGlwZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGRvbWFpbiBzb2NrZXQKIHR5cGVkZWYgVFNlcnZlclNvY2tldCBUUGlwZVNlcnZlcjsKICNlbmRpZgotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJXSU5QSVBFU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKaW5kZXggOGUwNmYzMC4uMzQ2MDVjMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0xNywzMSArMTcsNDQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJUU1NMU2VydmVyU29ja2V0LmgiCi0jaW5jbHVkZSAiVFNTTFNvY2tldC5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogU1NMIHNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24uCiAgKi8KK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUU2VydmVyU29ja2V0KHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CisgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7Cit9CisKK1RTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVFNlcnZlclNvY2tldChhZGRyZXNzLCBwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCiBUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCi1UU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeV8oZmFjdG9yeSkgewotICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwotfQorc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTU0xTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudCkgeworICBpZiAoaW50ZXJydXB0YWJsZUNoaWxkcmVuXykgeworICAgICAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50LCBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXyk7CiAKLXNoYXJlZF9wdHI8VFNvY2tldD4gVFNTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KGludCBjbGllbnQpIHsKLSAgcmV0dXJuIGZhY3RvcnlfLT5jcmVhdGVTb2NrZXQoY2xpZW50KTsKKyAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCk7CisgIH0KIH0KLQotfX19Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCmluZGV4IGE0ZTY1OWQuLjhiNzVkZTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCkBAIC0yMCw0MCArMjAsNTcgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXwogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UU1NMU0VSVkVSU09DS0VUX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgIlRTZXJ2ZXJTb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CiAKIC8qKgogICogU2VydmVyIHNvY2tldCB0aGF0IGFjY2VwdHMgU1NMIGNvbm5lY3Rpb25zLgogICovCi1jbGFzcyBUU1NMU2VydmVyU29ja2V0OiBwdWJsaWMgVFNlcnZlclNvY2tldCB7Ci0gcHVibGljOgorY2xhc3MgVFNTTFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyU29ja2V0IHsKK3B1YmxpYzoKICAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgogICAgKgogICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAogICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KICAgICovCi0gIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKyAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKwogICAvKioKLSAgICogQ29uc3RydWN0b3IuCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorICAgKgorICAgKiBAcGFyYW0gYWRkcmVzcyBBZGRyZXNzIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHBvcnQgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIGZhY3RvcnkgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCisgICAqLworICBUU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCiAgICAqCiAgICAqIEBwYXJhbSBwb3J0ICAgICAgICBMaXN0ZW5pbmcgcG9ydAogICAgKiBAcGFyYW0gc2VuZFRpbWVvdXQgU29ja2V0IHNlbmQgdGltZW91dAogICAgKiBAcGFyYW0gcmVjdlRpbWVvdXQgU29ja2V0IHJlY2VpdmUgdGltZW91dAogICAgKiBAcGFyYW0gZmFjdG9yeSAgICAgU1NMIHNvY2tldCBmYWN0b3J5IGltcGxlbWVudGF0aW9uCiAgICAqLwotICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCwKLSAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7Ci0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjcmVhdGVTb2NrZXQoaW50IHNvY2tldCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKLX07CisgIFRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgaW50IHNlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgIGludCByZWN2VGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCi19fX0KK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87Cit9OworfQorfQorfQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCmluZGV4IDE0YzEzZGMuLjcxOGU5YjEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcApAQCAtMTcsMTEgKzE3LDExIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKwogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGNzdHJpbmc+CiAjaWZkZWYgSEFWRV9BUlBBX0lORVRfSAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2VuZGlmCkBAIC0yOSw0MSArMjksMTcwIEBACiAjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZDTlRMX0gKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgT1BFTlNTTF9FTkdJTkVfQ0xFQU5VUF9SRVFVSVJFRF9CRUZPUkUgMHgxMDEwMDAwMEwKKwogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9FTkdJTkVfQ0xFQU5VUF9SRVFVSVJFRF9CRUZPUkUpCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgogI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgotI2luY2x1ZGUgIlRTU0xTb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgogCi0jZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQgMHgxMDAwMDAwMEwKLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlIHsKICAgTXV0ZXggbXV0ZXg7CiB9OwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCisvLyBPcGVuU1NMIGluaXRpYWxpemF0aW9uL2NsZWFudXAKIAotc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJyb3IgPSAwKTsKK3N0YXRpYyBib29sIG9wZW5TU0xJbml0aWFsaXplZCA9IGZhbHNlOworc3RhdGljIGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+IG11dGV4ZXM7CisKK3N0YXRpYyB2b2lkIGNhbGxiYWNrTG9ja2luZyhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgIC8vIGFzc2VydGlvbiBvZiAocHggIT0gMCkgaGVyZSB0eXBpY2FsbHkgbWVhbnMgdGhhdCBhIFRTU0xTb2NrZXQncyBsaWZldGltZQorICAgIC8vIGV4Y2VlZGVkIHRoZSBsaWZldGltZSBvZiB0aGUgVFNTTFNvY2tldEZhY3RvcnkgdGhhdCBjcmVhdGVkIGl0LCBhbmQgdGhlCisgICAgLy8gVFNTTFNvY2tldEZhY3RvcnkgYWxyZWFkeSByYW4gY2xlYW51cE9wZW5TU0woKSwgd2hpY2ggZGVsZXRlZCAibXV0ZXhlcyIuCisgICAgbXV0ZXhlc1tuXS5sb2NrKCk7CisgIH0gZWxzZSB7CisgICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKKyAgfQorfQorCisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEX0JFRk9SRSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGxiYWNrVGhyZWFkSUQoKSB7CisjaWZkZWYgX1dJTjMyCisgIHJldHVybiAodW5zaWduZWQgbG9uZylHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiAodW5zaWduZWQgbG9uZylwdGhyZWFkX3NlbGYoKTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBDUllQVE9fZHlubG9ja192YWx1ZSogZHluX2NyZWF0ZShjb25zdCBjaGFyKiwgaW50KSB7CisgIHJldHVybiBuZXcgQ1JZUFRPX2R5bmxvY2tfdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9sb2NrKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGxvY2ssIGNvbnN0IGNoYXIqLCBpbnQpIHsKKyAgaWYgKGxvY2sgIT0gTlVMTCkgeworICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgIGxvY2stPm11dGV4LmxvY2soKTsKKyAgICB9IGVsc2UgeworICAgICAgbG9jay0+bXV0ZXgudW5sb2NrKCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIGR5bl9kZXN0cm95KHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywgY29uc3QgY2hhciosIGludCkgeworICBkZWxldGUgbG9jazsKK30KKwordm9pZCBpbml0aWFsaXplT3BlblNTTCgpIHsKKyAgaWYgKG9wZW5TU0xJbml0aWFsaXplZCkgeworICAgIHJldHVybjsKKyAgfQorICBvcGVuU1NMSW5pdGlhbGl6ZWQgPSB0cnVlOworICBTU0xfbGlicmFyeV9pbml0KCk7CisgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworICAvLyBzdGF0aWMgbG9ja2luZworICAvLyBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMIGNoYW5nZWQgQ1JZUFRPX251bV9sb2NrcyAtIHNlZSBUSFJJRlQtMzg3OAorI2lmZGVmIENSWVBUT19udW1fbG9ja3MKKyAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFtDUllQVE9fbnVtX2xvY2tzKCldKTsKKyNlbHNlCisgIG11dGV4ZXMgPSBib29zdDo6c2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbIDo6Q1JZUFRPX251bV9sb2NrcygpXSk7CisjZW5kaWYKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCisgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CisjZW5kaWYKKworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKworICAvLyBkeW5hbWljIGxvY2tpbmcKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOworICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhkeW5fZGVzdHJveSk7Cit9CisKK3ZvaWQgY2xlYW51cE9wZW5TU0woKSB7CisgIGlmICghb3BlblNTTEluaXRpYWxpemVkKSB7CisgICAgcmV0dXJuOworICB9CisgIG9wZW5TU0xJbml0aWFsaXplZCA9IGZhbHNlOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCisjZW5kaWYKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKKyAgRVZQX2NsZWFudXAoKTsKKyAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKyAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCisgIG11dGV4ZXMucmVzZXQoKTsKK30KKworc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJybm9fY29weSA9IDAsIGludCBzc2xlcnJubyA9IDApOwogc3RhdGljIGJvb2wgbWF0Y2hOYW1lKGNvbnN0IGNoYXIqIGhvc3QsIGNvbnN0IGNoYXIqIHBhdHRlcm4sIGludCBzaXplKTsKIHN0YXRpYyBjaGFyIHVwcGVyY2FzZShjaGFyIGMpOwogCiAvLyBTU0xDb250ZXh0IGltcGxlbWVudGF0aW9uCi1TU0xDb250ZXh0OjpTU0xDb250ZXh0KCkgewotICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworU1NMQ29udGV4dDo6U1NMQ29udGV4dChjb25zdCBTU0xQcm90b2NvbCYgcHJvdG9jb2wpIHsKKyAgaWYgKHByb3RvY29sID09IFNTTFRMUykgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBTU0x2MykgeworICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2M19tZXRob2QoKSk7CisjZW5kaWYKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8wKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbCA9PSBUTFN2MV8xKSB7CisgICAgY3R4XyA9IFNTTF9DVFhfbmV3KFRMU3YxXzFfbWV0aG9kKCkpOworICB9IGVsc2UgaWYgKHByb3RvY29sID09IFRMU3YxXzIpIHsKKyAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfMl9tZXRob2QoKSk7CisgIH0gZWxzZSB7CisgICAgLy8vIFVOS05PV04gUFJPVE9DT0whCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXc6IFVua25vd24gcHJvdG9jb2wiKTsKKyAgfQorCiAgIGlmIChjdHhfID09IE5VTEwpIHsKICAgICBzdHJpbmcgZXJyb3JzOwogICAgIGJ1aWxkRXJyb3JzKGVycm9ycyk7CiAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXc6ICIgKyBlcnJvcnMpOwogICB9CiAgIFNTTF9DVFhfc2V0X21vZGUoY3R4XywgU1NMX01PREVfQVVUT19SRVRSWSk7CisKKyAgLy8gRGlzYWJsZSBob3JyaWJseSBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMgcHJvdG9jb2xzIGJ1dCBhbGxvdyBhIGhhbmRzaGFrZQorICAvLyB3aXRoIG9sZGVyIGNsaWVudHMgc28gdGhleSBnZXQgYSBncmFjZWZ1bCBkZW5pYWwuCisgIGlmIChwcm90b2NvbCA9PSBTU0xUTFMpIHsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYyKTsKKyAgICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYzKTsgICAvLyBUSFJJRlQtMzE2NAorICB9CiB9CiAKIFNTTENvbnRleHQ6On5TU0xDb250ZXh0KCkgewpAQCAtODQsNTIgKzIxMywxMTMgQEAKIH0KIAogLy8gVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgotVFNTTFNvY2tldDo6VFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpOgotICBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KQorICA6IFRTb2NrZXQoKSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKIH0KIAotVFNTTFNvY2tldDo6VFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIGludCBzb2NrZXQpOgotICBUU29ja2V0KHNvY2tldCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCisgICAgICAgIDogVFNvY2tldCgpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworICBpbnRlcnJ1cHRMaXN0ZW5lcl8gPSBpbnRlcnJ1cHRMaXN0ZW5lcjsKIH0KIAotVFNTTFNvY2tldDo6VFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCk6Ci0gIFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCkKKyAgOiBUU29ja2V0KHNvY2tldCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7Cit9CisKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgICAgICAgOiBUU29ja2V0KHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgOiBUU29ja2V0KGhvc3QsIHBvcnQpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOworfQorCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQorICAgICAgICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CisgIGludGVycnVwdExpc3RlbmVyXyA9IGludGVycnVwdExpc3RlbmVyOwogfQogCiBUU1NMU29ja2V0Ojp+VFNTTFNvY2tldCgpIHsKICAgY2xvc2UoKTsKIH0KIAorYm9vbCBUU1NMU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJUU1NMU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKKyAgLy8gZGF0YSBtYXkgYmUgYXZhaWxhYmxlIGluIFNTTCBidWZmZXJzIChub3RlOiBTU0xfcGVuZGluZyBkb2VzIG5vdCBoYXZlIGEgZmFpbHVyZSBtb2RlKQorICByZXR1cm4gU1NMX3BlbmRpbmcoc3NsXykgPiAwIHx8IFRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdCgpIHsKKyAgaGFuZHNoYWtlQ29tcGxldGVkXyA9IGZhbHNlOworICByZWFkUmV0cnlDb3VudF8gPSAwOworICBldmVudFNhZmVfID0gZmFsc2U7Cit9CisKIGJvb2wgVFNTTFNvY2tldDo6aXNPcGVuKCkgewogICBpZiAoc3NsXyA9PSBOVUxMIHx8ICFUU29ja2V0Ojppc09wZW4oKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBpbnQgc2h1dGRvd24gPSBTU0xfZ2V0X3NodXRkb3duKHNzbF8pOwotICBib29sIHNodXRkb3duUmVjZWl2ZWQgPSAoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pOwotICBib29sIHNodXRkb3duU2VudCAgICAgPSAoc2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTik7CisgIC8vICIhISIgaXMgc3F1ZWxjaGluZyBDNDgwMCAiZm9yY2luZyBib29sIC0+IHRydWUgb3IgZmFsc2UiIHBlcmZvcm1hbmNlIHdhcm5pbmcKKyAgYm9vbCBzaHV0ZG93blJlY2VpdmVkID0gISEoc2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pOworICBib29sIHNodXRkb3duU2VudCA9ICEhKHNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pOwogICBpZiAoc2h1dGRvd25SZWNlaXZlZCAmJiBzaHV0ZG93blNlbnQpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCiBib29sIFRTU0xTb2NrZXQ6OnBlZWsoKSB7CiAgIGlmICghaXNPcGVuKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgY2hlY2tIYW5kc2hha2UoKTsKKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CiAgIGludCByYzsKICAgdWludDhfdCBieXRlOwotICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKLSAgaWYgKHJjIDwgMCkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9wZWVrOiAiICsgZXJyb3JzKTsKLSAgfQotICBpZiAocmMgPT0gMCkgewotICAgIEVSUl9jbGVhcl9lcnJvcigpOwotICB9CisgIGRvIHsKKyAgICByYyA9IFNTTF9wZWVrKHNzbF8sICZieXRlLCAxKTsKKyAgICBpZiAocmMgPCAwKSB7CisKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiByZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQorICAgICAgc3RyaW5nIGVycm9yczsKKyAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOworICAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3BlZWs6ICIgKyBlcnJvcnMpOworICAgIH0gZWxzZSBpZiAocmMgPT0gMCkgeworICAgICAgRVJSX2NsZWFyX2Vycm9yKCk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHRydWUpOwogICByZXR1cm4gKHJjID4gMCk7CiB9CiAKQEAgLTE0MCwxMDkgKzMzMCwzNTYgQEAKICAgVFNvY2tldDo6b3BlbigpOwogfQogCisvKgorICogTm90ZTogVGhpcyBtZXRob2QgaXMgbm90IGxpYmV2ZW50IHNhZmUuCisqLwogdm9pZCBUU1NMU29ja2V0OjpjbG9zZSgpIHsKICAgaWYgKHNzbF8gIT0gTlVMTCkgewotICAgIGludCByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKLSAgICBpZiAocmMgPT0gMCkgewotICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7Ci0gICAgfQotICAgIGlmIChyYyA8IDApIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBzdHJpbmcgZXJyb3JzOwotICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKLSAgICAgIEdsb2JhbE91dHB1dCgoIlNTTF9zaHV0ZG93bjogIiArIGVycm9ycykuY19zdHIoKSk7CisgICAgdHJ5IHsKKyAgICAgIGludCByYzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gMDsKKyAgICAgIGludCBlcnJvciA9IDA7CisKKyAgICAgIGRvIHsKKyAgICAgICAgcmMgPSBTU0xfc2h1dGRvd24oc3NsXyk7CisgICAgICAgIGlmIChyYyA8PSAwKSB7CisgICAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGx0aHJvdWdoCisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlL3JlYWQgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOworICAgICAgICAgICAgICByYyA9IDI7CisgICAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IHdoaWxlIChyYyA9PSAyKTsKKworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBzdHJpbmcgZXJyb3JzOworICAgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgICAgR2xvYmFsT3V0cHV0KCgiU1NMX3NodXRkb3duOiAiICsgZXJyb3JzKS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgLy8gRG9uJ3QgZW1pdCBhbiBleGNlcHRpb24gYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlCisgICAgICAvLyBkZXN0cnVjdG9yLiBUaGVyZSdzIGFsc28gbm90IG11Y2ggdGhhdCBhIHVzZXIgY2FuIGRvIHRvIHJlY292ZXIsIHNvCisgICAgICAvLyBqdXN0IGNsZWFuIHVwIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCB0aHJvd2luZywgc2ltaWxhciB0byB0aGUgcmMKKyAgICAgIC8vIDwgMCBjYXNlIGFib3ZlLgorICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiU1NMX3NodXRkb3duOiAlcyIsIHRlLndoYXQoKSk7CiAgICAgfQogICAgIFNTTF9mcmVlKHNzbF8pOwogICAgIHNzbF8gPSBOVUxMOworICAgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOwogICB9CiAgIFRTb2NrZXQ6OmNsb3NlKCk7CiB9CiAKKy8qCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGluIFNTTCBTb2NrZXQuCisgKiBJZiBldmVudFNhZmUgaXMgc2V0LCBhbmQgaXQgbWF5IHJldHVybnMgMCBieXRlcyB0aGVuIHJlYWQgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwogdWludDMyX3QgVFNTTFNvY2tldDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZXRyeSBhZ2FpbiIpOwogICBpbnQzMl90IGJ5dGVzID0gMDsKLSAgZm9yIChpbnQzMl90IHJldHJpZXMgPSAwOyByZXRyaWVzIDwgbWF4UmVjdlJldHJpZXNfOyByZXRyaWVzKyspeworICB3aGlsZSAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CiAgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfLCBidWYsIGxlbik7Ci0gICAgaWYgKGJ5dGVzID49IDApCisgICAgaW50MzJfdCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaW50MzJfdCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpOworICAgIHJlYWRSZXRyeUNvdW50XysrOworICAgIGlmIChlcnJvciA9PSBTU0xfRVJST1JfTk9ORSkgeworICAgICAgcmVhZFJldHJ5Q291bnRfID0gMDsKICAgICAgIGJyZWFrOwotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgaWYgKFNTTF9nZXRfZXJyb3Ioc3NsXywgYnl0ZXMpID09IFNTTF9FUlJPUl9TWVNDQUxMKSB7Ci0gICAgICBpZiAoRVJSX2dldF9lcnJvcigpID09IDAgJiYgZXJybm9fY29weSA9PSBFSU5UUikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KKyAgICB9CisgICAgdW5zaWduZWQgaW50IHdhaXRFdmVudFJldHVybjsKKyAgICBib29sIGJyZWFrb3V0ID0gZmFsc2U7CisgICAgc3dpdGNoIChlcnJvcikgeworICAgICAgY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUsICJjbGllbnQgZGlzY29ubmVjdGVkIik7CisKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgIGlmIChlcnJub19jb3B5ID09IDAgJiYgRVJSX3BlZWtfZXJyb3IoKSA9PSAwKSB7CisgICAgICAgICAgYnJlYWtvdXQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVhZFJldHJ5Q291bnRfID49IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKKyAgICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIC8vIGZhbGx0aHJvdWdoCisKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmV0cnkgYWdhaW4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gcmVhZCBldmVudCBhZ2FpbgorICAgICAgICBlbHNlIGlmICgod2FpdEV2ZW50UmV0dXJuID0gd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKSkgPT0gVFNTTF9FSU5UUiApIHsKKyAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICJ0b28gbXVjaCByZWN2IHJldHJpZXMiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh3YWl0RXZlbnRSZXR1cm4gPT0gVFNTTF9EQVRBKSB7CisgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIFNTTCBhbmQgaHVnZSB0aHJpZnQgcGFja2V0cywgdGhlcmUgbWF5IGJlIGEgbnVtYmVyIG9mCisgICAgICAgICAgICAvLyBzb2NrZXQgb3BlcmF0aW9ucywgYmVmb3JlIGFueSBkYXRhIGJlY29tZXMgYXZhaWxhYmxlIGJ5IFNTTF9yZWFkKCkuCisgICAgICAgICAgICAvLyBUaGVyZWZvcmUgdGhlIG51bWJlciBvZiByZXRyaWVzIHNob3VsZCBub3QgYmUgaW5jcmVhc2VkIGFuZAorICAgICAgICAgICAgLy8gdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmVwZWF0ZWQuCisgICAgICAgICAgICByZWFkUmV0cnlDb3VudF8tLTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICJ1bmtvd24gd2FpdEZvckV2ZW50IHJldHVybiB2YWx1ZSIpOworICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgIH0KKyAgICBpZiAoYnJlYWtvdXQpIHsKKyAgICAgIGJyZWFrOwogICAgIH0KICAgICBzdHJpbmcgZXJyb3JzOwotICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX3JlYWQ6ICIgKyBlcnJvcnMpOwogICB9CiAgIHJldHVybiBieXRlczsKIH0KIAogdm9pZCBUU1NMU29ja2V0Ojp3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICByZXR1cm47CiAgIC8vIGxvb3AgaW4gY2FzZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSBpcyBzZXQgaW4gU1NMX0NUWC4KICAgdWludDMyX3Qgd3JpdHRlbiA9IDA7CiAgIHdoaWxlICh3cml0dGVuIDwgbGVuKSB7CisgICAgRVJSX2NsZWFyX2Vycm9yKCk7CiAgICAgaW50MzJfdCBieXRlcyA9IFNTTF93cml0ZShzc2xfLCAmYnVmW3dyaXR0ZW5dLCBsZW4gLSB3cml0dGVuKTsKICAgICBpZiAoYnl0ZXMgPD0gMCkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIGJ5dGVzKTsKKyAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQorICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAvLyBmYWxsdGhyb3VnaCAgICAgICAgCisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZworICAgICAgfQogICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CiAgICAgfQogICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CiAgIH0KIH0KIAorLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW4gU1NMIFNvY2tldC4KKyAqIElmIGV2ZW50U2FmZSBpcyBzZXQsIGFuZCBpdCBtYXkgcmV0dXJucyAwIGJ5dGVzIHRoZW4gd3JpdGUgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwordWludDMyX3QgVFNTTFNvY2tldDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKIHZvaWQgVFNTTFNvY2tldDo6Zmx1c2goKSB7CiAgIC8vIERvbid0IHRocm93IGV4Y2VwdGlvbiBpZiBub3Qgb3Blbi4gVGhyaWZ0IHNlcnZlcnMgY2xvc2Ugc29ja2V0IHR3aWNlLgogICBpZiAoc3NsXyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKICAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CiAgIGlmIChiaW8gPT0gTlVMTCkgewogICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5zIE5VTEwiKTsKICAgfQogICBpZiAoQklPX2ZsdXNoKGJpbykgIT0gMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBzdHJpbmcgZXJyb3JzOwogICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CiAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiQklPX2ZsdXNoOiAiICsgZXJyb3JzKTsKICAgfQogfQogCi12b2lkIFRTU0xTb2NrZXQ6OmNoZWNrSGFuZHNoYWtlKCkgewotICBpZiAoIVRTb2NrZXQ6OmlzT3BlbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gIH0KLSAgaWYgKHNzbF8gIT0gTlVMTCkgewordm9pZCBUU1NMU29ja2V0Ojppbml0aWFsaXplSGFuZHNoYWtlUGFyYW1zKCkgeworICAvLyBzZXQgdW5kZXJseWluZyBzb2NrZXQgdG8gbm9uLWJsb2NraW5nCisgIGludCBmbGFnczsKKyAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAorICAgICAgfHwgVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IHNldCBUSFJJRlRfT19OT05CTE9DSyAoVEhSSUZUX0ZDTlRMKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNvY2tldF8pOwogICAgIHJldHVybjsKICAgfQogICBzc2xfID0gY3R4Xy0+Y3JlYXRlU1NMKCk7Ci0gIFNTTF9zZXRfZmQoc3NsXywgc29ja2V0Xyk7CisKKyAgU1NMX3NldF9mZChzc2xfLCBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldF8pKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpjaGVja0hhbmRzaGFrZSgpIHsKKyAgcmV0dXJuIGhhbmRzaGFrZUNvbXBsZXRlZF87Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZSgpIHsKKyAgaWYgKCFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisgIGlmIChjaGVja0hhbmRzaGFrZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgfQorCiAgIGludCByYzsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworICBpbnQgZXJyb3IgPSAwOwogICBpZiAoc2VydmVyKCkpIHsKLSAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CisgICAgZG8geworICAgICAgcmMgPSBTU0xfYWNjZXB0KHNzbF8pOworICAgICAgaWYgKHJjIDw9IDApIHsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKyAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCisgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHdoaWxlIChyYyA9PSAyKTsKICAgfSBlbHNlIHsKLSAgICByYyA9IFNTTF9jb25uZWN0KHNzbF8pOworICAgIC8vIE9wZW5TU0wgPCAwLjkuOGYgZG9lcyBub3QgaGF2ZSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQorICAgICNpZiBkZWZpbmVkKFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSkKKyAgICAgIC8vIHNldCB0aGUgU05JIGhvc3RuYW1lCisgICAgICBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoc3NsXywgZ2V0SG9zdCgpLmNfc3RyKCkpOworICAgICNlbmRpZgorICAgIGRvIHsKKyAgICAgIHJjID0gU1NMX2Nvbm5lY3Qoc3NsXyk7CisgICAgICBpZiAocmMgPD0gMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CisgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAorICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgaWYgKGlzTGliZXZlbnRTYWZlKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIC8vIHJlcGVhdCBvcGVyYXRpb24KKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCisgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgICAgcmMgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKHJjID09IDIpOwogICB9CiAgIGlmIChyYyA8PSAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKICAgICBzdHJpbmcgZm5hbWUoc2VydmVyKCkgPyAiU1NMX2FjY2VwdCIgOiAiU1NMX2Nvbm5lY3QiKTsKICAgICBzdHJpbmcgZXJyb3JzOwotICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihmbmFtZSArICI6ICIgKyBlcnJvcnMpOwogICB9CiAgIGF1dGhvcml6ZSgpOworICBoYW5kc2hha2VDb21wbGV0ZWRfID0gdHJ1ZTsKIH0KIAogdm9pZCBUU1NMU29ja2V0OjphdXRob3JpemUoKSB7CiAgIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfKTsKLSAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAgLy8gdmVyaWZ5IGF1dGhlbnRpY2F0aW9uIHJlc3VsdAotICAgIHRocm93IFRTU0xFeGNlcHRpb24oc3RyaW5nKCJTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoKSwgIikgKwotICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmMpKTsKKyAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAvLyB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0CisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbihzdHJpbmcoIlNTTF9nZXRfdmVyaWZ5X3Jlc3VsdCgpLCAiKSArIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHJjKSk7CiAgIH0KIAogICBYNTA5KiBjZXJ0ID0gU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbF8pOwpAQCAtMjgzLDggKzcyMCw4IEBACiAgIH0KIAogICAvLyBleHRyYWN0IHN1YmplY3RBbHRlcm5hdGl2ZU5hbWUKLSAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSogYWx0ZXJuYXRpdmVzID0gKFNUQUNLX09GKEdFTkVSQUxfTkFNRSkqKQotICAgICAgICAgICAgICAgICAgICAgICBYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKKyAgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSogYWx0ZXJuYXRpdmVzCisgICAgICA9IChTVEFDS19PRihHRU5FUkFMX05BTUUpKilYNTA5X2dldF9leHRfZDJpKGNlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCBOVUxMLCBOVUxMKTsKICAgaWYgKGFsdGVybmF0aXZlcyAhPSBOVUxMKSB7CiAgICAgY29uc3QgaW50IGNvdW50ID0gc2tfR0VORVJBTF9OQU1FX251bShhbHRlcm5hdGl2ZXMpOwogICAgIGZvciAoaW50IGkgPSAwOyBkZWNpc2lvbiA9PSBBY2Nlc3NNYW5hZ2VyOjpTS0lQICYmIGkgPCBjb3VudDsgaSsrKSB7CkBAIC0yOTUsMTUgKzczMiwxNSBAQAogICAgICAgY2hhciogZGF0YSA9IChjaGFyKilBU04xX1NUUklOR19kYXRhKG5hbWUtPmQuaWE1KTsKICAgICAgIGludCBsZW5ndGggPSBBU04xX1NUUklOR19sZW5ndGgobmFtZS0+ZC5pYTUpOwogICAgICAgc3dpdGNoIChuYW1lLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgR0VOX0ROUzoKLSAgICAgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBob3N0ID0gKHNlcnZlcigpID8gZ2V0UGVlckhvc3QoKSA6IGdldEhvc3QoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIGRhdGEsIGxlbmd0aCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0VOX0lQQUREOgotICAgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhLCBkYXRhLCBsZW5ndGgpOwotICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRU5fRE5TOgorICAgICAgICBpZiAoaG9zdC5lbXB0eSgpKSB7CisgICAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldFBlZXJIb3N0KCkgOiBnZXRIb3N0KCkpOworICAgICAgICB9CisgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIGRhdGEsIGxlbmd0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBHRU5fSVBBREQ6CisgICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KHNhLCBkYXRhLCBsZW5ndGgpOworICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgICAgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGFsdGVybmF0aXZlcywgR0VORVJBTF9OQU1FX2ZyZWUpOwpAQCAtMzMzLDcgKzc3MCw3IEBACiAgICAgICBBU04xX1NUUklORyogY29tbW9uID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKGVudHJ5KTsKICAgICAgIGludCBzaXplID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgY29tbW9uKTsKICAgICAgIGlmIChob3N0LmVtcHR5KCkpIHsKLSAgICAgICAgaG9zdCA9IChzZXJ2ZXIoKSA/IGdldEhvc3QoKSA6IGdldEhvc3QoKSk7CisgICAgICAgIGhvc3QgPSAoc2VydmVyKCkgPyBnZXRQZWVySG9zdCgpIDogZ2V0SG9zdCgpKTsKICAgICAgIH0KICAgICAgIGRlY2lzaW9uID0gYWNjZXNzXy0+dmVyaWZ5KGhvc3QsIChjaGFyKil1dGY4LCBzaXplKTsKICAgICAgIE9QRU5TU0xfZnJlZSh1dGY4KTsKQEAgLTM0NSw1MiArNzgyLDEzNCBAQAogICB9CiB9CiAKLS8vIFRTU0xTb2NrZXRGYWN0b3J5IGltcGxlbWVudGF0aW9uCi1ib29sICAgICBUU1NMU29ja2V0RmFjdG9yeTo6aW5pdGlhbGl6ZWQgPSBmYWxzZTsKLXVpbnQ2NF90IFRTU0xTb2NrZXRGYWN0b3J5Ojpjb3VudF8gPSAwOwotTXV0ZXggICAgVFNTTFNvY2tldEZhY3Rvcnk6Om11dGV4XzsKKy8qCisgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBub3QgbGliZXZlbnQgc2FmZS4KKyovCit1bnNpZ25lZCBpbnQgVFNTTFNvY2tldDo6d2FpdEZvckV2ZW50KGJvb2wgd2FudFJlYWQpIHsKKyAgaW50IGZkU29ja2V0OworICBCSU8qIGJpbzsKIAotVFNTTFNvY2tldEZhY3Rvcnk6OlRTU0xTb2NrZXRGYWN0b3J5KCk6IHNlcnZlcl8oZmFsc2UpIHsKKyAgaWYgKHdhbnRSZWFkKSB7CisgICAgYmlvID0gU1NMX2dldF9yYmlvKHNzbF8pOworICB9IGVsc2UgeworICAgIGJpbyA9IFNTTF9nZXRfd2Jpbyhzc2xfKTsKKyAgfQorCisgIGlmIChiaW8gPT0gTlVMTCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfP2JpbyByZXR1cm5lZCBOVUxMIik7CisgIH0KKworICBpZiAoQklPX2dldF9mZChiaW8sICZmZFNvY2tldCkgPD0gMCkgeworICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19nZXRfZmQgZmFpbGVkIik7CisgIH0KKworICBzdHJ1Y3QgVEhSSUZUX1BPTExGRCBmZHNbMl07CisgIG1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgZmRzWzBdLmZkID0gZmRTb2NrZXQ7CisgIC8vIHVzZSBQT0xMSU4gYWxzbyBvbiB3cml0ZSBvcGVyYXRpb25zIHRvbywgdGhpcyBpcyBuZWVkZWQgZm9yIG9wZXJhdGlvbnMKKyAgLy8gd2hpY2ggcmVxdWlyZXMgcmVhZCBhbmQgd3JpdGUgb24gdGhlIHNvY2tldC4KKyAgZmRzWzBdLmV2ZW50cyA9IHdhbnRSZWFkID8gVEhSSUZUX1BPTExJTiA6IFRIUklGVF9QT0xMSU4gfCBUSFJJRlRfUE9MTE9VVDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworICB9CisKKyAgaW50IHRpbWVvdXQgPSAtMTsKKyAgaWYgKHdhbnRSZWFkICYmIHJlY3ZUaW1lb3V0XykgeworICAgIHRpbWVvdXQgPSByZWN2VGltZW91dF87CisgIH0KKyAgaWYgKCF3YW50UmVhZCAmJiBzZW5kVGltZW91dF8pIHsKKyAgICB0aW1lb3V0ID0gc2VuZFRpbWVvdXRfOworICB9CisKKyAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgaW50ZXJydXB0TGlzdGVuZXJfID8gMiA6IDEsIHRpbWVvdXQpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgLy8gZXJyb3IgY2FzZXMKKyAgICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgPT0gVEhSSUZUX0VJTlRSKSB7CisgICAgICByZXR1cm4gVFNTTF9FSU5UUjsgLy8gcmVwZWF0IG9wZXJhdGlvbgorICAgIH0KKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTU0xTb2NrZXQ6OnJlYWQgVEhSSUZUX1BPTEwoKSAiLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgIH0gZWxzZSBpZiAocmV0ID4gMCl7CisgICAgaWYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgfQorICAgIHJldHVybiBUU1NMX0RBVEE7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfUE9MTCAodGltZWQgb3V0KSIpOworICB9Cit9CisKKy8vIFRTU0xTb2NrZXRGYWN0b3J5IGltcGxlbWVudGF0aW9uCit1aW50NjRfdCBUU1NMU29ja2V0RmFjdG9yeTo6Y291bnRfID0gMDsKK011dGV4IFRTU0xTb2NrZXRGYWN0b3J5OjptdXRleF87Citib29sIFRTU0xTb2NrZXRGYWN0b3J5OjptYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fID0gZmFsc2U7CisKK1RTU0xTb2NrZXRGYWN0b3J5OjpUU1NMU29ja2V0RmFjdG9yeShTU0xQcm90b2NvbCBwcm90b2NvbCkgOiBzZXJ2ZXJfKGZhbHNlKSB7CiAgIEd1YXJkIGd1YXJkKG11dGV4Xyk7CiAgIGlmIChjb3VudF8gPT0gMCkgewotICAgIGluaXRpYWxpemVPcGVuU1NMKCk7CisgICAgaWYgKCFtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fKSB7CisgICAgICBpbml0aWFsaXplT3BlblNTTCgpOworICAgIH0KICAgICByYW5kb21pemUoKTsKICAgfQogICBjb3VudF8rKzsKLSAgY3R4XyA9IGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+KG5ldyBTU0xDb250ZXh0KTsKKyAgY3R4XyA9IHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PihuZXcgU1NMQ29udGV4dChwcm90b2NvbCkpOwogfQogCiBUU1NMU29ja2V0RmFjdG9yeTo6flRTU0xTb2NrZXRGYWN0b3J5KCkgewogICBHdWFyZCBndWFyZChtdXRleF8pOworICBjdHhfLnJlc2V0KCk7CiAgIGNvdW50Xy0tOwotICBpZiAoY291bnRfID09IDApIHsKKyAgaWYgKGNvdW50XyA9PSAwICYmICFtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fKSB7CiAgICAgY2xlYW51cE9wZW5TU0woKTsKICAgfQogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOwogICBzZXR1cChzc2wpOwogICByZXR1cm4gc3NsOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGludCBzb2NrZXQpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaW50ZXJydXB0TGlzdGVuZXIpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQpKTsKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0KSk7CiAgIHNldHVwKHNzbCk7CiAgIHJldHVybiBzc2w7CiB9CiAKLXZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnNldHVwKGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbCkgeworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIGhvc3QsIHBvcnQpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKKyAgc2V0dXAoc3NsKTsKKyAgcmV0dXJuIHNzbDsKK30KKworCit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKSB7CiAgIHNzbC0+c2VydmVyKHNlcnZlcigpKTsKICAgaWYgKGFjY2Vzc18gPT0gTlVMTCAmJiAhc2VydmVyKCkpIHsKLSAgICBhY2Nlc3NfID0gYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4obmV3IERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyKTsKKyAgICBhY2Nlc3NfID0gc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+KG5ldyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcik7CiAgIH0KICAgaWYgKGFjY2Vzc18gIT0gTlVMTCkgewogICAgIHNzbC0+YWNjZXNzKGFjY2Vzc18pOwpAQCAtNDEyLDcgKzkzMSw3IEBACiB2b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjphdXRoZW50aWNhdGUoYm9vbCByZXF1aXJlZCkgewogICBpbnQgbW9kZTsKICAgaWYgKHJlcXVpcmVkKSB7Ci0gICAgbW9kZSAgPSBTU0xfVkVSSUZZX1BFRVIgfCBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgU1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKyAgICBtb2RlID0gU1NMX1ZFUklGWV9QRUVSIHwgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IFNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CiAgIH0gZWxzZSB7CiAgICAgbW9kZSA9IFNTTF9WRVJJRllfTk9ORTsKICAgfQpAQCAtNDIyLDExICs5NDEsMTEgQEAKIHZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRDZXJ0aWZpY2F0ZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBmb3JtYXQpIHsKICAgaWYgKHBhdGggPT0gTlVMTCB8fCBmb3JtYXQgPT0gTlVMTCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAibG9hZENlcnRpZmljYXRlQ2hhaW46IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRDZXJ0aWZpY2F0ZUNoYWluOiBlaXRoZXIgPHBhdGg+IG9yIDxmb3JtYXQ+IGlzIE5VTEwiKTsKICAgfQogICBpZiAoc3RyY21wKGZvcm1hdCwgIlBFTSIpID09IDApIHsKICAgICBpZiAoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShjdHhfLT5nZXQoKSwgcGF0aCkgPT0gMCkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICBzdHJpbmcgZXJyb3JzOwogICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKICAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGU6ICIgKyBlcnJvcnMpOwpAQCAtNDM5LDExICs5NTgsMTEgQEAKIHZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRQcml2YXRlS2V5KGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGZvcm1hdCkgewogICBpZiAocGF0aCA9PSBOVUxMIHx8IGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICJsb2FkUHJpdmF0ZUtleTogZWl0aGVyIDxwYXRoPiBvciA8Zm9ybWF0PiBpcyBOVUxMIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFByaXZhdGVLZXk6IGVpdGhlciA8cGF0aD4gb3IgPGZvcm1hdD4gaXMgTlVMTCIpOwogICB9CiAgIGlmIChzdHJjbXAoZm9ybWF0LCAiUEVNIikgPT0gMCkgewogICAgIGlmIChTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4Xy0+Z2V0KCksIHBhdGgsIFNTTF9GSUxFVFlQRV9QRU0pID09IDApIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgc3RyaW5nIGVycm9yczsKICAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CiAgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGU6ICIgKyBlcnJvcnMpOwpAQCAtNDUxLDEzICs5NzAsMTMgQEAKICAgfQogfQogCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoKSB7Cit2b2lkIFRTU0xTb2NrZXRGYWN0b3J5Ojpsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGgpIHsKICAgaWYgKHBhdGggPT0gTlVMTCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXM6IDxwYXRoPiBpcyBOVUxMIik7CiAgIH0KLSAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8tPmdldCgpLCBwYXRoLCBOVUxMKSA9PSAwKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8tPmdldCgpLCBwYXRoLCBjYXBhdGgpID09IDApIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIHN0cmluZyBlcnJvcnM7CiAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9uczogIiArIGVycm9ycyk7CkBAIC00NzMsMTA0ICs5OTIsMjMgQEAKICAgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoY3R4Xy0+Z2V0KCksIHRoaXMpOwogfQogCi1pbnQgVFNTTFNvY2tldEZhY3Rvcnk6OnBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRhdGEpIHsKK2ludCBUU1NMU29ja2V0RmFjdG9yeTo6cGFzc3dvcmRDYWxsYmFjayhjaGFyKiBwYXNzd29yZCwgaW50IHNpemUsIGludCwgdm9pZCogZGF0YSkgewogICBUU1NMU29ja2V0RmFjdG9yeSogZmFjdG9yeSA9IChUU1NMU29ja2V0RmFjdG9yeSopZGF0YTsKICAgc3RyaW5nIHVzZXJQYXNzd29yZDsKICAgZmFjdG9yeS0+Z2V0UGFzc3dvcmQodXNlclBhc3N3b3JkLCBzaXplKTsKLSAgaW50IGxlbmd0aCA9IHVzZXJQYXNzd29yZC5zaXplKCk7CisgIGludCBsZW5ndGggPSBzdGF0aWNfY2FzdDxpbnQ+KHVzZXJQYXNzd29yZC5zaXplKCkpOwogICBpZiAobGVuZ3RoID4gc2l6ZSkgewogICAgIGxlbmd0aCA9IHNpemU7CiAgIH0KICAgc3RybmNweShwYXNzd29yZCwgdXNlclBhc3N3b3JkLmNfc3RyKCksIGxlbmd0aCk7CisgIHVzZXJQYXNzd29yZC5hc3NpZ24odXNlclBhc3N3b3JkLnNpemUoKSwgJyonKTsKICAgcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIHNoYXJlZF9hcnJheTxNdXRleD4gbXV0ZXhlczsKLQotc3RhdGljIHZvaWQgY2FsbGJhY2tMb2NraW5nKGludCBtb2RlLCBpbnQgbiwgY29uc3QgY2hhciosIGludCkgewotICBpZiAobW9kZSAmIENSWVBUT19MT0NLKSB7Ci0gICAgbXV0ZXhlc1tuXS5sb2NrKCk7Ci0gIH0gZWxzZSB7Ci0gICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKLSAgfQotfQotCi0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsbGJhY2tUaHJlYWRJRCgpIHsKLSAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSBwdGhyZWFkX3NlbGYoKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgQ1JZUFRPX2R5bmxvY2tfdmFsdWUqIGR5bl9jcmVhdGUoY29uc3QgY2hhciosIGludCkgewotICByZXR1cm4gbmV3IENSWVBUT19keW5sb2NrX3ZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBkeW5fbG9jayhpbnQgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBpbnQpIHsKLSAgaWYgKGxvY2sgIT0gTlVMTCkgewotICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKLSAgICAgIGxvY2stPm11dGV4LmxvY2soKTsKLSAgICB9IGVsc2UgewotICAgICAgbG9jay0+bXV0ZXgudW5sb2NrKCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGR5bl9kZXN0cm95KHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSogbG9jaywgY29uc3QgY2hhciosIGludCkgewotICBkZWxldGUgbG9jazsKLX0KLQotdm9pZCBUU1NMU29ja2V0RmFjdG9yeTo6aW5pdGlhbGl6ZU9wZW5TU0woKSB7Ci0gIGlmIChpbml0aWFsaXplZCkgewotICAgIHJldHVybjsKLSAgfQotICBpbml0aWFsaXplZCA9IHRydWU7Ci0gIFNTTF9saWJyYXJ5X2luaXQoKTsKLSAgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOwotICAvLyBzdGF0aWMgbG9ja2luZwotICBtdXRleGVzID0gc2hhcmVkX2FycmF5PE11dGV4PihuZXcgTXV0ZXhbOjpDUllQVE9fbnVtX2xvY2tzKCldKTsKLSAgaWYgKG11dGV4ZXMgPT0gTlVMTCkgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgImluaXRpYWxpemVPcGVuU1NMKCkgZmFpbGVkLCAiCi0gICAgICAgICAgIm91dCBvZiBtZW1vcnkgd2hpbGUgY3JlYXRpbmcgbXV0ZXggYXJyYXkiKTsKLSAgfQotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCkKLSAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhjYWxsYmFja1RocmVhZElEKTsKLSNlbmRpZgotICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKLSAgLy8gZHluYW1pYyBsb2NraW5nCi0gIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soZHluX2NyZWF0ZSk7Ci0gIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGR5bl9sb2NrKTsKLSAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soZHluX2Rlc3Ryb3kpOwotfQotCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpjbGVhbnVwT3BlblNTTCgpIHsKLSAgaWYgKCFpbml0aWFsaXplZCkgewotICAgIHJldHVybjsKLSAgfQotICBpbml0aWFsaXplZCA9IGZhbHNlOwotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCkKLSAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayhOVUxMKTsKLSNlbmRpZgotICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7Ci0gIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soTlVMTCk7Ci0gIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhOVUxMKTsKLSAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKLSAgRVJSX2ZyZWVfc3RyaW5ncygpOwotICBFVlBfY2xlYW51cCgpOwotICBFUlJfcmVtb3ZlX3N0YXRlKDApOwotICBtdXRleGVzLnJlc2V0KCk7Ci19Ci0KIC8vIGV4dHJhY3QgZXJyb3IgbWVzc2FnZXMgZnJvbSBlcnJvciBxdWV1ZQotdm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHkpIHsKLSAgdW5zaWduZWQgbG9uZyAgZXJyb3JDb2RlOwotICBjaGFyICAgbWVzc2FnZVsyNTZdOwordm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHksIGludCBzc2xlcnJubykgeworICB1bnNpZ25lZCBsb25nIGVycm9yQ29kZTsKKyAgY2hhciBtZXNzYWdlWzI1Nl07CiAKICAgZXJyb3JzLnJlc2VydmUoNTEyKTsKICAgd2hpbGUgKChlcnJvckNvZGUgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKQEAgLTU3OSw3ICsxMDE3LDcgQEAKICAgICB9CiAgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JDb2RlKTsKICAgICBpZiAocmVhc29uID09IE5VTEwpIHsKLSAgICAgIHNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSAtIDEsICJTU0wgZXJyb3IgIyAlbHUiLCBlcnJvckNvZGUpOworICAgICAgVEhSSUZUX1NOUFJJTlRGKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSAtIDEsICJTU0wgZXJyb3IgIyAlbHUiLCBlcnJvckNvZGUpOwogICAgICAgcmVhc29uID0gbWVzc2FnZTsKICAgICB9CiAgICAgZXJyb3JzICs9IHJlYXNvbjsKQEAgLTU5MCwyMiArMTAyOCwzMiBAQAogICAgIH0KICAgfQogICBpZiAoZXJyb3JzLmVtcHR5KCkpIHsKLSAgICBlcnJvcnMgPSAiZXJyb3IgY29kZTogIiArIGxleGljYWxfY2FzdDxzdHJpbmc+KGVycm5vX2NvcHkpOworICAgIGVycm9ycyA9ICJlcnJvciBjb2RlOiAiICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOworICB9CisgIGlmIChzc2xlcnJubykgeworICAgIGVycm9ycyArPSAiIChTU0xfZXJyb3JfY29kZSA9ICIgKyB0b19zdHJpbmcoc3NsZXJybm8pICsgIikiOworICAgIGlmIChzc2xlcnJubyA9PSBTU0xfRVJST1JfU1lTQ0FMTCkgeworICAgICAgY2hhciBidWZbNDA5Nl07CisgICAgICBpbnQgZXJyOworICAgICAgd2hpbGUgKChlcnIgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApIHsKKyAgICAgICAgZXJyb3JzICs9ICIgIjsKKyAgICAgICAgZXJyb3JzICs9IEVSUl9lcnJvcl9zdHJpbmcoZXJyLCBidWYpOworICAgICAgfQorICAgIH0KICAgfQogfQogCiAvKioKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQWNjZXNzTWFuYWdlcgogICovCi1EZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKQotICB0aHJvdygpIHsgCi0gICh2b2lkKSBzYTsKK0RlY2lzaW9uIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyOjp2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIG5vZXhjZXB0IHsKKyAgKHZvaWQpc2E7CiAgIHJldHVybiBTS0lQOwogfQogCiBEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHN0cmluZyYgaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgewogICBpZiAoaG9zdC5lbXB0eSgpIHx8IG5hbWUgPT0gTlVMTCB8fCBzaXplIDw9IDApIHsKICAgICByZXR1cm4gU0tJUDsKICAgfQpAQCAtNjE0LDcgKzEwNjIsNyBAQAogCiBEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgdGhyb3coKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSBub2V4Y2VwdCB7CiAgIGJvb2wgbWF0Y2ggPSBmYWxzZTsKICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUICYmIHNpemUgPT0gc2l6ZW9mKGluX2FkZHIpKSB7CiAgICAgbWF0Y2ggPSAobWVtY21wKCYoKHNvY2thZGRyX2luKikmc2EpLT5zaW5fYWRkciwgZGF0YSwgc2l6ZSkgPT0gMCk7CkBAIC02NTUsMTYgKzExMDMsMTYgQEAKICAgICBtYXRjaCA9IHRydWU7CiAgIH0KICAgcmV0dXJuIG1hdGNoOwotCiB9CiAKIC8vIFRoaXMgaXMgdG8gd29yayBhcm91bmQgdGhlIFR1cmtpc2ggbG9jYWxlIGlzc3VlLCBpLmUuLAogLy8gdG91cHBlcignaScpICE9IHRvdXBwZXIoJ0knKSBpZiBsb2NhbGUgaXMgInRyX1RSIgotY2hhciB1cHBlcmNhc2UgKGNoYXIgYykgeworY2hhciB1cHBlcmNhc2UoY2hhciBjKSB7CiAgIGlmICgnYScgPD0gYyAmJiBjIDw9ICd6JykgewogICAgIHJldHVybiBjICsgKCdBJyAtICdhJyk7CiAgIH0KICAgcmV0dXJuIGM7CiB9Ci0KLX19fQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAppbmRleCBkNzdjMmY1Li41YTg3ZDFlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaApAQCAtMjAsMzggKzIwLDczIEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KLSNpbmNsdWRlICJUU29ja2V0LmgiCisvLyBQdXQgdGhpcyBmaXJzdCB0byBhdm9pZCBXSU4zMiBidWlsZCBmYWlsdXJlCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogY2xhc3MgQWNjZXNzTWFuYWdlcjsKIGNsYXNzIFNTTENvbnRleHQ7CiAKK2VudW0gU1NMUHJvdG9jb2wgeworICBTU0xUTFMgID0gMCwgIC8vIFN1cHBvcnRzIFNTTHYyIGFuZCBTU0x2MyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlcyBhdCBUTFN2MV8wIG9yIGxhdGVyLgorLy9TU0x2MiAgID0gMSwgIC8vIEhPUlJJQkxZIElOU0VDVVJFIQorICBTU0x2MyAgID0gMiwgIC8vIFN1cHBvcnRzIFNTTHYzIG9ubHkgLSBhbHNvIGhvcnJpYmx5IGluc2VjdXJlIQorICBUTFN2MV8wID0gMywgIC8vIFN1cHBvcnRzIFRMU3YxXzAgb3IgbGF0ZXIuCisgIFRMU3YxXzEgPSA0LCAgLy8gU3VwcG9ydHMgVExTdjFfMSBvciBsYXRlci4KKyAgVExTdjFfMiA9IDUsICAvLyBTdXBwb3J0cyBUTFN2MV8yIG9yIGxhdGVyLgorICBMQVRFU1QgID0gVExTdjFfMgorfTsKKworI2RlZmluZSBUU1NMX0VJTlRSIDAKKyNkZWZpbmUgVFNTTF9EQVRBIDEKKworLyoqCisgKiBJbml0aWFsaXplIE9wZW5TU0wgbGlicmFyeS4gIFRoaXMgZnVuY3Rpb24sIG9yIHNvbWUgb3RoZXIKKyAqIGVxdWl2YWxlbnQgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBPcGVuU1NMLCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUKKyAqIFRTU0xTb2NrZXQgaXMgdXNlZC4gIElmIHlvdSBzZXQgVFNTTFNvY2tldEZhY3RvcnkgdG8gdXNlIG1hbnVhbAorICogT3BlblNTTCBpbml0aWFsaXphdGlvbiwgeW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gb3Igb3RoZXJ3aXNlCisgKiBlbnN1cmUgT3BlblNTTCBpcyBpbml0aWFsaXplZCB5b3Vyc2VsZi4KKyAqLwordm9pZCBpbml0aWFsaXplT3BlblNTTCgpOworLyoqCisgKiBDbGVhbnVwIE9wZW5TU0wgbGlicmFyeS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB0byBjbGVhbgorICogdXAgT3BlblNTTCBhZnRlciB1c2Ugb2YgT3BlblNTTCBmdW5jdGlvbmFsaXR5IGlzIGZpbmlzaGVkLiAgSWYgeW91CisgKiBzZXQgVFNTTFNvY2tldEZhY3RvcnkgdG8gdXNlIG1hbnVhbCBPcGVuU1NMIGluaXRpYWxpemF0aW9uLCB5b3UKKyAqIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24geW91cnNlbGYgb3IgZW5zdXJlIHRoYXQgd2hhdGV2ZXIKKyAqIGluaXRpYWxpemVkIE9wZW5TU0wgY2xlYW5zIGl0IHVwIHRvby4KKyAqLwordm9pZCBjbGVhbnVwT3BlblNTTCgpOworCiAvKioKICAqIE9wZW5TU0wgaW1wbGVtZW50YXRpb24gZm9yIFNTTCBzb2NrZXQgaW50ZXJmYWNlLgogICovCi1jbGFzcyBUU1NMU29ja2V0OiBwdWJsaWMgVFNvY2tldCB7Ci0gcHVibGljOgotIH5UU1NMU29ja2V0KCk7CitjbGFzcyBUU1NMU29ja2V0IDogcHVibGljIFRTb2NrZXQgeworcHVibGljOgorICB+VFNTTFNvY2tldCgpOwogICAvKioKICAgICogVFRyYW5zcG9ydCBpbnRlcmZhY2UuCiAgICAqLwotICBib29sICAgICBpc09wZW4oKTsKLSAgYm9vbCAgICAgcGVlaygpOwotICB2b2lkICAgICBvcGVuKCk7Ci0gIHZvaWQgICAgIGNsb3NlKCk7CisgIGJvb2wgaXNPcGVuKCk7CisgIGJvb2wgcGVlaygpOworICB2b2lkIG9wZW4oKTsKKyAgdm9pZCBjbG9zZSgpOworICBib29sIGhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7CiAgIHVpbnQzMl90IHJlYWQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwotICB2b2lkICAgICB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7Ci0gIHZvaWQgICAgIGZsdXNoKCk7Ci0gICAvKioKLSAgICogU2V0IHdoZXRoZXIgdG8gdXNlIGNsaWVudCBvciBzZXJ2ZXIgc2lkZSBTU0wgaGFuZHNoYWtlIHByb3RvY29sLgotICAgKgotICAgKiBAcGFyYW0gZmxhZyAgVXNlIHNlcnZlciBzaWRlIGhhbmRzaGFrZSBwcm90b2NvbCBpZiB0cnVlLgotICAgKi8KKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CisgIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2b2lkIGZsdXNoKCk7CisgIC8qKgorICAqIFNldCB3aGV0aGVyIHRvIHVzZSBjbGllbnQgb3Igc2VydmVyIHNpZGUgU1NMIGhhbmRzaGFrZSBwcm90b2NvbC4KKyAgKgorICAqIEBwYXJhbSBmbGFnICBVc2Ugc2VydmVyIHNpZGUgaGFuZHNoYWtlIHByb3RvY29sIGlmIHRydWUuCisgICovCiAgIHZvaWQgc2VydmVyKGJvb2wgZmxhZykgeyBzZXJ2ZXJfID0gZmxhZzsgfQogICAvKioKICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFNTTCBzb2NrZXQgaXMgc2VydmVyIG9yIGNsaWVudCBtb2RlLgpAQCAtNjIsMjkgKzk3LDUxIEBACiAgICAqCiAgICAqIEBwYXJhbSBtYW5hZ2VyICBJbnN0YW5jZSBvZiBBY2Nlc3NNYW5hZ2VyCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWNjZXNzKGJvb3N0OjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsKLSAgICBhY2Nlc3NfID0gbWFuYWdlcjsKLSAgfQorICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIC8qKgorICAgKiBTZXQgZXZlbnRTYWZlIGZsYWcgaWYgbGliZXZlbnQgaXMgdXNlZC4KKyAgICovCisgIHZvaWQgc2V0TGliZXZlbnRTYWZlKCkgeyBldmVudFNhZmVfID0gdHJ1ZTsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIFNTTCBTb2NrZXQgaXMgbGliZXZlbnQgc2FmZSBvciBub3QuCisgICAqLworICBib29sIGlzTGliZXZlbnRTYWZlKCkgY29uc3QgeyByZXR1cm4gZXZlbnRTYWZlXzsgfQorCiBwcm90ZWN0ZWQ6CiAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4KICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KTsKKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KTsKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCBnaXZlbiBhbiBleGlzdGluZyBzb2NrZXQuCiAgICAqCiAgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0CiAgICAqLwotICBUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgaW50IHNvY2tldCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOwogICAvKioKKyAgICogQ29uc3RydWN0b3IsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IGdpdmVuIGFuIGV4aXN0aW5nIHNvY2tldCB0aGF0IGNhbiBiZSBpbnRlcnJ1cHRlZC4KKyAgICoKKyAgICogQHBhcmFtIHNvY2tldCBBbiBleGlzdGluZyBzb2NrZXQKKyAgICovCisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgICAvKioKICAgICogQ29uc3RydWN0b3IuCiAgICAqCiAgICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCiAgICAqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCBudW1iZXIKICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCk7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQpOworICAgIC8qKgorICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAqLworICAgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAgKiBBdXRob3JpemUgcGVlciBhY2Nlc3MgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMuCiAgICAqLwpAQCAtOTIsNDMgKzE0OSw5OSBAQAogICAvKioKICAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBpZiBub3QgYWxyZWFkeSBpbml0aWF0ZWQuCiAgICAqLwotICB2b2lkIGNoZWNrSGFuZHNoYWtlKCk7CisgIHZvaWQgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICAvKioKKyAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBwYXJhbXMuCisgICAqLworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgLyoqCisgICAqIENoZWNrIGlmICBTU0wgaGFuZHNoYWtlIGlzIGNvbXBsZXRlZCBvciBub3QuCisgICAqLworICBib29sIGNoZWNrSGFuZHNoYWtlKCk7CisgIC8qKgorICAgKiBXYWl0cyBmb3IgYW4gc29ja2V0IG9yIHNodXRkb3duIGV2ZW50LgorICAgKgorICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQgaWYgaW50ZXJydXB0ZWQgaXMgc2lnbmFsZWQuCisgICAqCisgICAqIEByZXR1cm4gVFNTTF9FSU5UUiBpZiBFSU5UUiBoYXBwZW5lZCBvbiB0aGUgdW5kZXJseWluZyBzb2NrZXQKKyAgICogICAgICAgICBUU1NMX0RBVEEgIGlmIGRhdGEgaXMgYXZhaWxhYmxlIG9uIHRoZSBzb2NrZXQuCisgICAqLworICB1bnNpZ25lZCBpbnQgd2FpdEZvckV2ZW50KGJvb2wgd2FudFJlYWQpOwogCiAgIGJvb2wgc2VydmVyXzsKICAgU1NMKiBzc2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOwotICBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKKyAgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IGFjY2Vzc187CiAgIGZyaWVuZCBjbGFzcyBUU1NMU29ja2V0RmFjdG9yeTsKKworcHJpdmF0ZToKKyAgYm9vbCBoYW5kc2hha2VDb21wbGV0ZWRfOworICBpbnQgcmVhZFJldHJ5Q291bnRfOworICBib29sIGV2ZW50U2FmZV87CisKKyAgdm9pZCBpbml0KCk7CiB9OwogCiAvKioKICAqIFNTTCBzb2NrZXQgZmFjdG9yeS4gU1NMIHNvY2tldHMgc2hvdWxkIGJlIGNyZWF0ZWQgdmlhIFNTTCBmYWN0b3J5LgorICogVGhlIGZhY3Rvcnkgd2lsbCBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCBhcyBsb25nIGFzCisgKiB0aGVyZSBpcyBhIFRTU0xTb2NrZXRGYWN0b3J5IGluc3RhbnRpYXRlZCwgYW5kIGFzIGxvbmcgYXMgdGhlIHN0YXRpYworICogYm9vbGVhbiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHNldCB0byBmYWxzZSwgdGhlIGRlZmF1bHQuCisgKgorICogSWYgeW91IHdvdWxkIGxpa2UgdG8gaW5pdGlhbGl6ZSBhbmQgY2xlYW51cCBvcGVuc3NsIHlvdXJzZWxmLCBzZXQKKyAqIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gdG8gdHJ1ZSBhbmQgVFNTTFNvY2tldEZhY3Rvcnkgd2lsbCBubworICogbG9uZ2VyIGJlIHJlc3BvbnNpYmxlIGZvciBvcGVuc3NsIGluaXRpYWxpemF0aW9uIGFuZCB0ZWFyZG93bi4KKyAqCisgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNvZGUgdXNpbmcgVFNTTFNvY2tldEZhY3RvcnkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBmYWN0b3J5IGxpZmV0aW1lIGV4Y2VlZHMgdGhlIGxpZmV0aW1lIG9mIGFueSBzb2NrZXRzCisgKiBpdCBtaWdodCBjcmVhdGUuICBJZiB0aGlzIGlzIG5vdCBndWFyYW50ZWVkLCBhIHNvY2tldCBtYXkgY2FsbCBpbnRvCisgKiBvcGVuc3NsIGFmdGVyIHRoZSBzb2NrZXQgZmFjdG9yeSBoYXMgY2xlYW5lZCB1cCBvcGVuc3NsISAgVGhpcworICogZ3VhcmFudGVlIGlzIHVubmVjZXNzYXJ5IGlmIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gaXMgdHJ1ZSwKKyAqIGhvd2V2ZXIsIHNpbmNlIGl0IHdvdWxkIGJlIHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24gaW5zdGVhZC4KICAqLwogY2xhc3MgVFNTTFNvY2tldEZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yL0Rlc3RydWN0b3IKKyAgICoKKyAgICogQHBhcmFtIHByb3RvY29sIFRoZSBTU0wvVExTIHByb3RvY29sIHRvIHVzZS4KICAgICovCi0gIFRTU0xTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTb2NrZXRGYWN0b3J5KFNTTFByb3RvY29sIHByb3RvY29sID0gU1NMVExTKTsKICAgdmlydHVhbCB+VFNTTFNvY2tldEZhY3RvcnkoKTsKICAgLyoqCiAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggYSBmcmVzaCBuZXcgc29ja2V0LgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KCk7CisgIC8qKgorICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldCwgd2hpY2ggaXMgaW50ZXJydXB0YWJsZS4KKyAgICovCisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogICAvKioKICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0LgogICAgKgogICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGludCBzb2NrZXQpOwotICAgLyoqCi0gICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0LgorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICAvKioKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0IHdoaWNoIGlzIGludGVycnVwdGFibGUuCiAgICAqCi0gICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCB0byBiZSBjb25uZWN0ZWQgdG8KLSAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bworICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgLyoqCisgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQuCisgICoKKyAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKKyAgLyoqCisgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQuCisgICoKKyAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bworICAqLworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogICAvKioKICAgICogU2V0IGNpcGhlcnMgdG8gYmUgdXNlZCBpbiBTU0wgaGFuZHNoYWtlIHByb2Nlc3MuCiAgICAqCkBAIC0xNjAsNyArMjczLDcgQEAKICAgICoKICAgICogQHBhcmFtIHBhdGggUGF0aCB0byB0cnVzdGVkIGNlcnRpZmljYXRlIGZpbGUKICAgICovCi0gIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoKTsKKyAgdmlydHVhbCB2b2lkIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGNhcGF0aCA9IE5VTEwpOwogICAvKioKICAgICogRGVmYXVsdCByYW5kb21pemUgbWV0aG9kLgogICAgKi8KQEAgLTE4NiwxNCArMjk5LDE0IEBACiAgICAqCiAgICAqIEBwYXJhbSBtYW5hZ2VyICBUaGUgQWNjZXNzTWFuYWdlciBpbnN0YW5jZQogICAgKi8KLSAgdmlydHVhbCB2b2lkIGFjY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7Ci0gICAgYWNjZXNzXyA9IG1hbmFnZXI7CisgIHZpcnR1YWwgdm9pZCBhY2Nlc3Moc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc01hbmFnZXI+IG1hbmFnZXIpIHsgYWNjZXNzXyA9IG1hbmFnZXI7IH0KKyAgc3RhdGljIHZvaWQgc2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKGJvb2wgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKSB7CisgICAgbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyA9IG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbjsKICAgfQotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKIAotICBzdGF0aWMgdm9pZCBpbml0aWFsaXplT3BlblNTTCgpOwotICBzdGF0aWMgdm9pZCBjbGVhbnVwT3BlblNTTCgpOworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKKwogICAvKioKICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZAogICAgKiBtdWx0aXBsZSB0aW1lcyBhdCBhbnkgdGltZSBkdXJpbmcgYSBzZXNzaW9uIGFzIG5lY2Vzc2FyeS4KQEAgLTIwMiwyNSArMzE1LDI2IEBACiAgICAqIEBwYXJhbSBzaXplICAgICBNYXhpbXVtIGxlbmd0aCBvZiBwYXNzd29yZCBpbmNsdWRpbmcgTlVMTCBjaGFyYWN0ZXIKICAgICovCiAgIHZpcnR1YWwgdm9pZCBnZXRQYXNzd29yZChzdGQ6OnN0cmluZyYgLyogcGFzc3dvcmQgKi8sIGludCAvKiBzaXplICovKSB7fQotIHByaXZhdGU6CisKK3ByaXZhdGU6CiAgIGJvb2wgc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKLSAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOwogICBzdGF0aWMgY29uY3VycmVuY3k6Ok11dGV4IG11dGV4XzsKICAgc3RhdGljIHVpbnQ2NF90IGNvdW50XzsKLSAgdm9pZCBzZXR1cChib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpOworICBzdGF0aWMgYm9vbCBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fOworICB2b2lkIHNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpOwogICBzdGF0aWMgaW50IHBhc3N3b3JkQ2FsbGJhY2soY2hhciogcGFzc3dvcmQsIGludCBzaXplLCBpbnQsIHZvaWQqIGRhdGEpOwogfTsKIAogLyoqCiAgKiBTU0wgZXhjZXB0aW9uLgogICovCi1jbGFzcyBUU1NMRXhjZXB0aW9uOiBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gcHVibGljOgotICBUU1NMRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKToKLSAgICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlKSB7fQorY2xhc3MgVFNTTEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKK3B1YmxpYzoKKyAgVFNTTEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsIG1lc3NhZ2UpIHt9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgcmV0dXJuICJUU1NMRXhjZXB0aW9uIjsKICAgICB9IGVsc2UgewpAQCAtMjMzLDEyICszNDcsMTMgQEAKICAqIFdyYXAgT3BlblNTTCBTU0xfQ1RYIGludG8gYSBjbGFzcy4KICAqLwogY2xhc3MgU1NMQ29udGV4dCB7Ci0gcHVibGljOgotICBTU0xDb250ZXh0KCk7CitwdWJsaWM6CisgIFNTTENvbnRleHQoY29uc3QgU1NMUHJvdG9jb2wmIHByb3RvY29sID0gU1NMVExTKTsKICAgdmlydHVhbCB+U1NMQ29udGV4dCgpOwogICBTU0wqIGNyZWF0ZVNTTCgpOwogICBTU0xfQ1RYKiBnZXQoKSB7IHJldHVybiBjdHhfOyB9Ci0gcHJpdmF0ZToKKworcHJpdmF0ZToKICAgU1NMX0NUWCogY3R4XzsKIH07CiAKQEAgLTI0OSw2NyArMzY0LDczIEBACiAgKiBvYmplY3QuCiAgKi8KIGNsYXNzIEFjY2Vzc01hbmFnZXIgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgZW51bSBEZWNpc2lvbiB7Ci0gICAgREVOWSAgID0gLTEsICAgIC8vIGRlbnkgYWNjZXNzCi0gICAgU0tJUCAgID0gIDAsICAgIC8vIGNhbm5vdCBtYWtlIGRlY2lzaW9uLCBtb3ZlIG9uIHRvIG5leHQgKGlmIGFueSkKLSAgICBBTExPVyAgPSAgMSAgICAgLy8gYWxsb3cgYWNjZXNzCisgICAgREVOWSA9IC0xLCAvLyBkZW55IGFjY2VzcworICAgIFNLSVAgPSAwLCAgLy8gY2Fubm90IG1ha2UgZGVjaXNpb24sIG1vdmUgb24gdG8gbmV4dCAoaWYgYW55KQorICAgIEFMTE9XID0gMSAgLy8gYWxsb3cgYWNjZXNzCiAgIH07Ci0gLyoqCi0gICogRGVzdHJ1Y3RvcgotICAqLwotIHZpcnR1YWwgfkFjY2Vzc01hbmFnZXIoKSB7fQotIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCi0gICogb25jZSBhZnRlciB0aGUgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBiZWZvcmUgcGVlciBjZXJ0aWZpY2F0ZQotICAqIGlzIGV4YW1pbmVkLgotICAqCi0gICogSWYgYSB2YWxpZCBkZWNpc2lvbiAoQUxMT1cgb3IgREVOWSkgaXMgcmV0dXJuZWQsIHRoZSBwZWVyIGNlcnRpZmljYXRlIGlzCi0gICogbm90IHRvIGJlIHZlcmlmaWVkLgotICAqCi0gICogQHBhcmFtICBzYSBQZWVyIElQIGFkZHJlc3MKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICovCi0gdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8gKSB0aHJvdygpIHsgcmV0dXJuIERFTlk7IH0KLSAvKioKLSAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGVlciBzaG91bGQgYmUgZ3JhbnRlZCBhY2Nlc3Mgb3Igbm90LiBJdCdzIGNhbGxlZAotICAqIGV2ZXJ5IHRpbWUgYSBETlMgc3ViamVjdEFsdE5hbWUvY29tbW9uIG5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzCi0gICogY2VydGlmaWNhdGUuCi0gICoKLSAgKiBAcGFyYW0gIGhvc3QgQ2xpZW50IG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRIb3N0KCkKLSAgKiAgICAgICAgICAgICAgU2VydmVyIG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRQZWVySG9zdCgpCi0gICogQHBhcmFtICBuYW1lIFN1YmplY3RBbHROYW1lIG9yIGNvbW1vbiBuYW1lIGV4dHJhY3RlZCBmcm9tIHBlZXIgY2VydGlmaWNhdGUKLSAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIG5hbWUKLSAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHBlZXIgaXMgdHJ1c3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICoKLSAgKiBOb3RlOiBUaGUgIm5hbWUiIHBhcmFtZXRlciBtYXkgYmUgVVRGOCBlbmNvZGVkLgotICAqLwotIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBob3N0ICovLCBjb25zdCBjaGFyKiAvKiBuYW1lICovLCBpbnQgLyogc2l6ZSAqLykKLSAgIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQotIC8qKgotICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCi0gICogZXZlcnkgdGltZSBhbiBJUCBzdWJqZWN0QWx0TmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MgY2VydGlmaWNhdGUuCi0gICoKLSAgKiBAcGFyYW0gIHNhICAgUGVlciBJUCBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldAotICAqIEBwYXJhbSAgZGF0YSBJUCBhZGRyZXNzIGV4dHJhY3RlZCBmcm9tIGNlcnRpZmljYXRlCi0gICogQHBhcmFtICBzaXplIExlbmd0aCBvZiB0aGUgSVAgYWRkcmVzcwotICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKLSAgKi8KLSB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLywgY29uc3QgY2hhciogLyogZGF0YSAqLywgaW50IC8qIHNpemUgKi8pCi0gICB0aHJvdygpIHsgcmV0dXJuIERFTlk7IH0KKyAgLyoqCisgICAqIERlc3RydWN0b3IKKyAgICovCisgIHZpcnR1YWwgfkFjY2Vzc01hbmFnZXIoKSB7fQorICAvKioKKyAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKKyAgICogb25jZSBhZnRlciB0aGUgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LCBiZWZvcmUgcGVlciBjZXJ0aWZpY2F0ZQorICAgKiBpcyBleGFtaW5lZC4KKyAgICoKKyAgICogSWYgYSB2YWxpZCBkZWNpc2lvbiAoQUxMT1cgb3IgREVOWSkgaXMgcmV0dXJuZWQsIHRoZSBwZWVyIGNlcnRpZmljYXRlIGlzCisgICAqIG5vdCB0byBiZSB2ZXJpZmllZC4KKyAgICoKKyAgICogQHBhcmFtICBzYSBQZWVyIElQIGFkZHJlc3MKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8pIG5vZXhjZXB0IHsgcmV0dXJuIERFTlk7IH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIGV2ZXJ5IHRpbWUgYSBETlMgc3ViamVjdEFsdE5hbWUvY29tbW9uIG5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzCisgICAqIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gIGhvc3QgQ2xpZW50IG1vZGU6IGhvc3QgbmFtZSByZXR1cm5lZCBieSBUU29ja2V0OjpnZXRIb3N0KCkKKyAgICogICAgICAgICAgICAgIFNlcnZlciBtb2RlOiBob3N0IG5hbWUgcmV0dXJuZWQgYnkgVFNvY2tldDo6Z2V0UGVlckhvc3QoKQorICAgKiBAcGFyYW0gIG5hbWUgU3ViamVjdEFsdE5hbWUgb3IgY29tbW9uIG5hbWUgZXh0cmFjdGVkIGZyb20gcGVlciBjZXJ0aWZpY2F0ZQorICAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIG5hbWUKKyAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQorICAgKgorICAgKiBOb3RlOiBUaGUgIm5hbWUiIHBhcmFtZXRlciBtYXkgYmUgVVRGOCBlbmNvZGVkLgorICAgKi8KKyAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSBub2V4Y2VwdCB7CisgICAgcmV0dXJuIERFTlk7CisgIH0KKyAgLyoqCisgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBwZWVyIHNob3VsZCBiZSBncmFudGVkIGFjY2VzcyBvciBub3QuIEl0J3MgY2FsbGVkCisgICAqIGV2ZXJ5IHRpbWUgYW4gSVAgc3ViamVjdEFsdE5hbWUgaXMgZXh0cmFjdGVkIGZyb20gcGVlcidzIGNlcnRpZmljYXRlLgorICAgKgorICAgKiBAcGFyYW0gIHNhICAgUGVlciBJUCBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHNvY2tldAorICAgKiBAcGFyYW0gIGRhdGEgSVAgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSBjZXJ0aWZpY2F0ZQorICAgKiBAcGFyYW0gIHNpemUgTGVuZ3RoIG9mIHRoZSBJUCBhZGRyZXNzCisgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGVlciBpcyB0cnVzdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICovCisgIHZpcnR1YWwgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIC8qIHNhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBkYXRhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgbm9leGNlcHQgeworICAgIHJldHVybiBERU5ZOworICB9CiB9OwogCiB0eXBlZGVmIEFjY2Vzc01hbmFnZXI6OkRlY2lzaW9uIERlY2lzaW9uOwogCi1jbGFzcyBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjogcHVibGljIEFjY2Vzc01hbmFnZXIgewotIHB1YmxpYzoKK2NsYXNzIERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyIDogcHVibGljIEFjY2Vzc01hbmFnZXIgeworcHVibGljOgogICAvLyBBY2Nlc3NNYW5hZ2VyIGludGVyZmFjZQotICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EpIHRocm93KCk7Ci0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpIHRocm93KCk7Ci0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIHRocm93KCk7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgY29uc3QgY2hhciogbmFtZSwgaW50IHNpemUpIG5vZXhjZXB0OworICBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgc2EsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSBub2V4Y2VwdDsKIH07Ci0KLQotfX19Cit9Cit9Cit9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKaW5kZXggMjAzMTNhYy4uMTE4Yjk5MyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCkBAIC0xNywxMCArMTcsMTAgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCiAjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CkBAIC0zOSw4NCArMzksMTQ2IEBACiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNlbmRpZgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNpZmRlZiBIQVZFX1VOSVNURF9ICiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIlRTb2NrZXQuaCIKLSNpbmNsdWRlICJUU2VydmVyU29ja2V0LmgiCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogCiAjaWZuZGVmIEFGX0xPQ0FMCiAjZGVmaW5lIEFGX0xPQ0FMIEFGX1VOSVgKICNlbmRpZgogCiAjaWZuZGVmIFNPQ0tPUFRfQ0FTVF9UCi0jICAgaWZuZGVmIF9XSU4zMgotIyAgICAgICBkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAotIyAgIGVsc2UKLSMgICAgICAgZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKLSMgICBlbmRpZiAvLyBfV0lOMzIKKyNpZm5kZWYgX1dJTjMyCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIGNoYXIKKyNlbmRpZiAvLyBfV0lOMzIKICNlbmRpZgogCi10ZW1wbGF0ZTxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzIFQ+CiBpbmxpbmUgY29uc3QgU09DS09QVF9DQVNUX1QqIGNvbnN0X2Nhc3Rfc29ja29wdChjb25zdCBUKiB2KSB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgU09DS09QVF9DQVNUX1QqPih2KTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIFNPQ0tPUFRfQ0FTVF9UKiBjYXN0X3NvY2tvcHQoVCogdikgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7CiB9CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7Cit2b2lkIGRlc3Ryb3llcl9vZl9maW5lX3NvY2tldHMoVEhSSUZUX1NPQ0tFVCogc3NvY2spIHsKKyAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoKnNzb2NrKTsKKyAgZGVsZXRlIHNzb2NrOworfQogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCkgOgotICBwb3J0Xyhwb3J0KSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgYWNjVGltZW91dF8oLTEpLAotICByZXRyeUxpbWl0XygwKSwKLSAgcmV0cnlEZWxheV8oMCksCi0gIHRjcFNlbmRCdWZmZXJfKDApLAotICB0Y3BSZWN2QnVmZmVyXygwKSwKLSAgaW50U29jazFfKC0xKSwKLSAgaW50U29jazJfKC0xKSB7fQorbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCi1UU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkgOgotICBwb3J0Xyhwb3J0KSwKLSAgc2VydmVyU29ja2V0XygtMSksCi0gIGFjY2VwdEJhY2tsb2dfKDEwMjQpLAotICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAotICByZWN2VGltZW91dF8ocmVjdlRpbWVvdXQpLAotICBhY2NUaW1lb3V0XygtMSksCi0gIHJldHJ5TGltaXRfKDApLAotICByZXRyeURlbGF5XygwKSwKLSAgdGNwU2VuZEJ1ZmZlcl8oMCksCi0gIHRjcFJlY3ZCdWZmZXJfKDApLAotICBpbnRTb2NrMV8oLTEpLAotICBpbnRTb2NrMl8oLTEpIHt9Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKLVRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoc3RyaW5nIHBhdGgpIDoKLSAgcG9ydF8oMCksCi0gIHBhdGhfKHBhdGgpLAotICBzZXJ2ZXJTb2NrZXRfKC0xKSwKLSAgYWNjZXB0QmFja2xvZ18oMTAyNCksCi0gIHNlbmRUaW1lb3V0XygwKSwKLSAgcmVjdlRpbWVvdXRfKDApLAotICBhY2NUaW1lb3V0XygtMSksCi0gIHJldHJ5TGltaXRfKDApLAotICByZXRyeURlbGF5XygwKSwKLSAgdGNwU2VuZEJ1ZmZlcl8oMCksCi0gIHRjcFJlY3ZCdWZmZXJfKDApLAotICBpbnRTb2NrMV8oLTEpLAotICBpbnRTb2NrMl8oLTEpIHt9CitUR2V0QWRkckluZm9XcmFwcGVyOjpUR2V0QWRkckluZm9XcmFwcGVyKGNvbnN0IGNoYXIqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogaGludHMpCisgIDogbm9kZV8obm9kZSksIHNlcnZpY2VfKHNlcnZpY2UpLCBoaW50c18oaGludHMpLCByZXNfKE5VTEwpIHt9CisKK1RHZXRBZGRySW5mb1dyYXBwZXI6On5UR2V0QWRkckluZm9XcmFwcGVyKCkgeworICBpZiAodGhpcy0+cmVzXyAhPSBOVUxMKQorICAgIGZyZWVhZGRyaW5mbyh0aGlzLT5yZXNfKTsKK30KKworaW50IFRHZXRBZGRySW5mb1dyYXBwZXI6OmluaXQoKSB7CisgIGlmICh0aGlzLT5yZXNfID09IE5VTEwpCisgICAgcmV0dXJuIGdldGFkZHJpbmZvKHRoaXMtPm5vZGVfLCB0aGlzLT5zZXJ2aWNlXywgdGhpcy0+aGludHNfLCAmKHRoaXMtPnJlc18pKTsKKyAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBhZGRyaW5mbyogVEdldEFkZHJJbmZvV3JhcHBlcjo6cmVzKCkgeworICByZXR1cm4gdGhpcy0+cmVzXzsKK30KKworVFNlcnZlclNvY2tldDo6VFNlcnZlclNvY2tldChpbnQgcG9ydCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XyhzZW5kVGltZW91dCksCisgICAgcmVjdlRpbWVvdXRfKHJlY3ZUaW1lb3V0KSwKKyAgICBhY2NUaW1lb3V0XygtMSksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSksCisgICAgaW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7Cit9CisKK1RTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQorCitUU2VydmVyU29ja2V0OjpUU2VydmVyU29ja2V0KGNvbnN0IHN0cmluZyYgcGF0aCkKKyAgOiBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fKHRydWUpLAorICAgIHBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgYWNjVGltZW91dF8oLTEpLAorICAgIHJldHJ5TGltaXRfKDApLAorICAgIHJldHJ5RGVsYXlfKDApLAorICAgIHRjcFNlbmRCdWZmZXJfKDApLAorICAgIHRjcFJlY3ZCdWZmZXJfKDApLAorICAgIGtlZXBBbGl2ZV8oZmFsc2UpLAorICAgIGxpc3RlbmluZ18oZmFsc2UpLAorICAgIGludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgaW50ZXJydXB0U29ja1JlYWRlcl8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworfQogCiBUU2VydmVyU29ja2V0Ojp+VFNlcnZlclNvY2tldCgpIHsKICAgY2xvc2UoKTsKQEAgLTEzNCw2ICsxOTYsMTAgQEAKICAgYWNjVGltZW91dF8gPSBhY2NUaW1lb3V0OwogfQogCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCiB2b2lkIFRTZXJ2ZXJTb2NrZXQ6OnNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpIHsKICAgcmV0cnlMaW1pdF8gPSByZXRyeUxpbWl0OwogfQpAQCAtMTUwLDExMSArMjE2LDE3MyBAQAogICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7CiB9CiAKK3ZvaWQgVFNlcnZlclNvY2tldDo6c2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKSB7CisgIGlmIChsaXN0ZW5pbmdfKSB7CisgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigic2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgbGlzdGVuKCkiKTsKKyAgfQorICBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fID0gZW5hYmxlOworfQorCiB2b2lkIFRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHsKLSAgU09DS0VUIHN2WzJdOwotICBpZiAoLTEgPT0gc29ja2V0cGFpcihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHN2KSkgewotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSAiLCBlcnJubyk7Ci0gICAgaW50U29jazFfID0gLTE7Ci0gICAgaW50U29jazJfID0gLTE7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIFRIUklGVF9TT0NLRVQgc3ZbMl07CisgIC8vIENyZWF0ZSB0aGUgc29ja2V0IHBhaXIgdXNlZCB0byBpbnRlcnJ1cHQKKyAgaWYgKC0xID09IFRIUklGVF9TT0NLRVRQQUlSKEFGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgMCwgc3YpKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc29ja2V0cGFpcigpIGludGVycnVwdCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKICAgfSBlbHNlIHsKLSAgICBpbnRTb2NrMV8gPSBzdlsxXTsKLSAgICBpbnRTb2NrMl8gPSBzdlswXTsKKyAgICBpbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IHN2WzFdOworICAgIGludGVycnVwdFNvY2tSZWFkZXJfID0gc3ZbMF07CiAgIH0KIAotICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMwOworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0IGFsbCBjbGllbnRzCisgIGlmICgtMSA9PSBUSFJJRlRfU09DS0VUUEFJUihBRl9MT0NBTCwgU09DS19TVFJFQU0sIDAsIHN2KSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldHBhaXIoKSBjaGlsZEludGVycnVwdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXy5yZXNldCgpOworICB9IGVsc2UgeworICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKKyAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXworICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPihuZXcgVEhSSUZUX1NPQ0tFVChzdlswXSksIGRlc3Ryb3llcl9vZl9maW5lX3NvY2tldHMpOworICB9CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgIH0KKworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnJlczsKICAgaW50IGVycm9yOwotICBjaGFyIHBvcnRbc2l6ZW9mKCI2NTUzNiIpICsgMV07CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOwogICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwogICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CiAgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CiAgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7Ci0gIHNwcmludGYocG9ydCwgIiVkIiwgcG9ydF8pOwogCi0gIC8vIFdpbGRjYXJkIGFkZHJlc3MKLSAgZXJyb3IgPSBnZXRhZGRyaW5mbyhOVUxMLCBwb3J0LCAmaGludHMsICZyZXMwKTsKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKICAgaWYgKGVycm9yKSB7Ci0gICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIGdhaV9zdHJlcnJvcihlcnJvcikpOworICAgIEdsb2JhbE91dHB1dC5wcmludGYoImdldGFkZHJpbmZvICVkOiAlcyIsIGVycm9yLCBUSFJJRlRfR0FJX1NUUkVSUk9SKGVycm9yKSk7CiAgICAgY2xvc2UoKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIHNlcnZlciBzb2NrZXQuIik7CiAgIH0KIAogICAvLyBQaWNrIHRoZSBpcHY2IGFkZHJlc3MgZmlyc3Qgc2luY2UgaXB2NCBhZGRyZXNzZXMgY2FuIGJlIG1hcHBlZAogICAvLyBpbnRvIGlwdjYgc3BhY2UuCi0gIGZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewogICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKICAgICAgIGJyZWFrOwogICB9CiAKLSAgaWYgKCEgcGF0aF8uZW1wdHkoKSkgeworICBpZiAoIXBhdGhfLmVtcHR5KCkpIHsKICAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKLSAgfSBlbHNlIHsKKyAgfSBlbHNlIGlmIChyZXMgIT0gTlVMTCkgewogICAgIHNlcnZlclNvY2tldF8gPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwogICB9CiAKLSAgaWYgKHNlcnZlclNvY2tldF8gPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNvY2tldCgpICIsIGVycm5vX2NvcHkpOwogICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLCBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBjcmVhdGUgc2VydmVyIHNvY2tldC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CiAgIH0KIAotICAvLyBTZXQgcmV1c2FkZHJlc3MgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICAvLyBTZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKICAgaW50IG9uZSA9IDE7Ci0gIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SRVVTRUFERFIgIiwgZXJybm9fY29weSk7CisgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgIFNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORywKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob25lKSkpIHsKKy8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorLy8gU09fRVhDTFVTSVZFQUREUlVTRSByZXF1aXJlcyBhZG1pbiBwcml2aWxlZ2VzIG9uIFdpblhQLCBidXQgd2UgZG9uJ3QKKy8vIHdhbnQgdG8gZm9yY2Ugc2VydmVycyB0byBiZSBhbiBhZG1pbi4KKyNpZm5kZWYgX1dJTjMyCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HICIsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1JFVVNFQUREUiIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisjZW5kaWYKICAgfQogCiAgIC8vIFNldCBUQ1AgYnVmZmVyIHNpemVzCiAgIGlmICh0Y3BTZW5kQnVmZmVyXyA+IDApIHsKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBTT0xfU09DS0VULCBTT19TTkRCVUYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BTZW5kQnVmZmVyXyksIHNpemVvZih0Y3BTZW5kQnVmZmVyXykpKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT19TTkRCVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ0Y3BTZW5kQnVmZmVyXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRjcFNlbmRCdWZmZXJfKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fU05EQlVGICIsIGVycm5vX2NvcHkpOwogICAgICAgY2xvc2UoKTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFNPX1NOREJVRiIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgU09fU05EQlVGIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CiAgICAgfQogICB9CiAKICAgaWYgKHRjcFJlY3ZCdWZmZXJfID4gMCkgewotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwgc2l6ZW9mKHRjcFJlY3ZCdWZmZXJfKSkpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19SQ1ZCVUYgIiwgZXJybm9fY29weSk7CiAgICAgICBjbG9zZSgpOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fUkNWQlVGIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICB9CiAgIH0KIAotICAvLyBEZWZlciBhY2NlcHQKLSAgI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgVENQX0RFRkVSX0FDQ0VQVCwKLSAgICAgICAgICAgICAgICAgICAgICAgJm9uZSwgc2l6ZW9mKG9uZSkpKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0RFRkVSX0FDQ0VQVCAiLCBlcnJub19jb3B5KTsKLSAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgc2V0IFRDUF9ERUZFUl9BQ0NFUFQiLCBlcnJub19jb3B5KTsKKy8vIERlZmVyIGFjY2VwdAorI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX0RFRkVSX0FDQ0VQVCwgJm9uZSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRDUF9ERUZFUl9BQ0NFUFQgIiwgZXJybm9fY29weSk7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX0RFRkVSX0FDQ0VQVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KICAgfQotICAjZW5kaWYgLy8gI2lmZGVmIFRDUF9ERUZFUl9BQ0NFUFQKKyNlbmRpZiAvLyAjaWZkZWYgVENQX0RFRkVSX0FDQ0VQVAogCi0gICNpZmRlZiBJUFY2X1Y2T05MWQorI2lmZGVmIElQVjZfVjZPTkxZCiAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CiAgICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksCi0gICAgICAgICAgY2FzdF9zb2Nrb3B0KCZ6ZXJvKSwgc2l6ZW9mKHplcm8pKSkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkgIiwgZXJybm8pOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkgIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgIH0KICAgfQotICAjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCiAKICAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCiAgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKLSAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAotICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fTElOR0VSICIsIGVycm5vX2NvcHkpOwogICAgIGNsb3NlKCk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBzZXQgU09fTElOR0VSIiwgZXJybm9fY29weSk7CkBAIC0yNjMsOTIgKzM5MSwxMzYgQEAKICAgLy8gVW5peCBTb2NrZXRzIGRvIG5vdCBuZWVkIHRoYXQKICAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKICAgICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKLSAgICBpZiAoLTEgPT0gc2V0c29ja29wdChzZXJ2ZXJTb2NrZXRfLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgICAgaWYgKC0xCisgICAgICAgID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKICAgICAgIGNsb3NlKCk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVENQX05PREVMQVkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICB9CiAgIH0KIAogICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKLSAgaW50IGZsYWdzID0gZmNudGwoc2VydmVyU29ja2V0XywgRl9HRVRGTCwgMCk7CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CiAgIGlmIChmbGFncyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgZmNudGwoKSBGX0dFVEZMICIsIGVycm5vX2NvcHkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCi0gIGlmICgtMSA9PSBmY250bChzZXJ2ZXJTb2NrZXRfLCBGX1NFVEZMLCBmbGFncyB8IE9fTk9OQkxPQ0spKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBmY250bCgpIE9fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImZjbnRsKCkgZmFpbGVkIiwgZXJybm9fY29weSk7CisgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc2VydmVyU29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfT19OT05CTE9DSyAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfU0VURkwgVEhSSUZUX09fTk9OQkxPQ0sgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICB9CiAKICAgLy8gcHJlcGFyZSB0aGUgcG9ydCBpbmZvcm1hdGlvbgotICAvLyB3ZSBtYXkgd2FudCB0byB0cnkgdG8gYmluZCBtb3JlIHRoYW4gb25jZSwgc2luY2UgU09fUkVVU0VBRERSIGRvZXNuJ3QKKyAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CiAgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgogICBpbnQgcmV0cmllcyA9IDA7CisgIGludCBlcnJub19jb3B5ID0gMDsKIAotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgewogCiAjaWZuZGVmIF9XSU4zMgogCiAgICAgLy8gVW5peCBEb21haW4gU29ja2V0Ci0gICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7Ci0gICAgc29ja2xlbl90IGxlbjsKLQotICAgIGlmIChwYXRoXy5sZW5ndGgoKSA+IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgICB9CiAKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKICAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotICAgIHNucHJpbnRmKGFkZHJlc3Muc3VuX3BhdGgsIHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSwgIiVzIiwgcGF0aF8uY19zdHIoKSk7Ci0gICAgbGVuID0gc2l6ZW9mKGFkZHJlc3MpOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KIAogICAgIGRvIHsKLSAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyZXNzLCBsZW4pKSB7CisgICAgICBpZiAoMCA9PSA6OmJpbmQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmFkZHJlc3MsIHN0cnVjdGxlbikpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCi0gICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoc2xlZXAocmV0cnlEZWxheV8pID09IDApKTsKKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CiAjZWxzZQogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKICNlbmRpZgogICB9IGVsc2UgewogICAgIGRvIHsKICAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCi0gICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoc2xlZXAocmV0cnlEZWxheV8pID09IDApKTsKKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CiAKLSAgICAvLyBmcmVlIGFkZHJpbmZvCi0gICAgZnJlZWFkZHJpbmZvKHJlczApOworICAgIC8vIHJldHJpZXZlIGJpbmQgaW5mbworICAgIGlmIChwb3J0XyA9PSAwICYmIHJldHJpZXMgPD0gcmV0cnlMaW1pdF8pIHsKKyAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNhOworICAgICAgc29ja2xlbl90IGxlbiA9IHNpemVvZihzYSk7CisgICAgICBzdGQ6Om1lbXNldCgmc2EsIDAsIGxlbik7CisgICAgICBpZiAoOjpnZXRzb2NrbmFtZShzZXJ2ZXJTb2NrZXRfLCByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcio+KCZzYSksICZsZW4pIDwgMCkgeworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmdldFBvcnQoKSBnZXRzb2NrbmFtZSgpICIsIGVycm5vX2NvcHkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqIHNpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luNio+KCZzYSk7CisgICAgICAgICAgcG9ydF8gPSBudG9ocyhzaW4tPnNpbjZfcG9ydCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbio+KCZzYSk7CisgICAgICAgICAgcG9ydF8gPSBudG9ocyhzaW4tPnNpbl9wb3J0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KICAgfQogCiAgIC8vIHRocm93IGFuIGVycm9yIGlmIHdlIGZhaWxlZCB0byBiaW5kIHByb3Blcmx5CiAgIGlmIChyZXRyaWVzID4gcmV0cnlMaW1pdF8pIHsKICAgICBjaGFyIGVycmJ1ZlsxMDI0XTsKLSAgICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Ci0gICAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBzcHJpbnRmKGVycmJ1ZiwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIEJJTkQgJWQiLCBwb3J0Xyk7CisgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlRTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIFBBVEggJXMiLCBwYXRoXy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgVEhSSUZUX1NOUFJJTlRGKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBCSU5EICVkIiwgcG9ydF8pOwogICAgIH0KICAgICBHbG9iYWxPdXRwdXQoZXJyYnVmKTsKICAgICBjbG9zZSgpOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgYmluZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYmluZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCisgIGlmIChsaXN0ZW5DYWxsYmFja18pCisgICAgbGlzdGVuQ2FsbGJhY2tfKHNlcnZlclNvY2tldF8pOworCiAgIC8vIENhbGwgbGlzdGVuCiAgIGlmICgtMSA9PSA6Omxpc3RlbihzZXJ2ZXJTb2NrZXRfLCBhY2NlcHRCYWNrbG9nXykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBsaXN0ZW4oKSAiLCBlcnJub19jb3B5KTsKICAgICBjbG9zZSgpOwogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgbGlzdGVuIiwgZXJybm9fY29weSk7CkBAIC0zNTcsODQgKzUyOSw5NiBAQAogICAvLyBUaGUgc29ja2V0IGlzIG5vdyBsaXN0ZW5pbmchCiB9CiAKK2ludCBUU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgeworICByZXR1cm4gcG9ydF87Cit9CisKIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHsKLSAgaWYgKHNlcnZlclNvY2tldF8gPT0gLTEpIHsKKyAgaWYgKHNlcnZlclNvY2tldF8gPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRTZXJ2ZXJTb2NrZXQgbm90IGxpc3RlbmluZyIpOwogICB9CiAKLSAgc3RydWN0IHBvbGxmZCBmZHNbMl07CisgIHN0cnVjdCBUSFJJRlRfUE9MTEZEIGZkc1syXTsKIAogICBpbnQgbWF4RWludHJzID0gNTsKICAgaW50IG51bUVpbnRycyA9IDA7CiAKICAgd2hpbGUgKHRydWUpIHsKLSAgICBzdGQ6Om1lbXNldChmZHMsIDAgLCBzaXplb2YoZmRzKSk7CisgICAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CiAgICAgZmRzWzBdLmZkID0gc2VydmVyU29ja2V0XzsKLSAgICBmZHNbMF0uZXZlbnRzID0gUE9MTElOOwotICAgIGlmIChpbnRTb2NrMl8gIT0gLTEpIHsKLSAgICAgIGZkc1sxXS5mZCA9IGludFNvY2syXzsKLSAgICAgIGZkc1sxXS5ldmVudHMgPSBQT0xMSU47CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgICAgZmRzWzFdLmZkID0gaW50ZXJydXB0U29ja1JlYWRlcl87CisgICAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKICAgICB9CiAgICAgLyoKLSAgICAgIFRPRE86IGlmIEVJTlRSIGlzIHJlY2VpdmVkLCB3ZSdsbCByZXN0YXJ0IHRoZSB0aW1lb3V0LgorICAgICAgVE9ETzogaWYgVEhSSUZUX0VJTlRSIGlzIHJlY2VpdmVkLCB3ZSdsbCByZXN0YXJ0IHRoZSB0aW1lb3V0LgogICAgICAgVG8gYmUgYWNjdXJhdGUsIHdlIG5lZWQgdG8gZml4IHRoaXMgaW4gdGhlIGZ1dHVyZS4KICAgICAgKi8KLSAgICBpbnQgcmV0ID0gcG9sbChmZHMsIDIsIGFjY1RpbWVvdXRfKTsKKyAgICBpbnQgcmV0ID0gVEhSSUZUX1BPTEwoZmRzLCAyLCBhY2NUaW1lb3V0Xyk7CiAKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgLy8gZXJyb3IgY2FzZXMKLSAgICAgIGlmIChlcnJubyA9PSBFSU5UUiAmJiAobnVtRWludHJzKysgPCBtYXhFaW50cnMpKSB7Ci0gICAgICAgIC8vIEVJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FSU5UUiAmJiAobnVtRWludHJzKysgPCBtYXhFaW50cnMpKSB7CisgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcG9sbCgpICIsIGVycm5vX2NvcHkpOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfUE9MTCgpICIsIGVycm5vX2NvcHkpOwogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOwogICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewogICAgICAgLy8gQ2hlY2sgZm9yIGFuIGludGVycnVwdCBzaWduYWwKLSAgICAgIGlmIChpbnRTb2NrMl8gIT0gLTEgJiYgKGZkc1sxXS5yZXZlbnRzICYgUE9MTElOKSkgeworICAgICAgaWYgKGludGVycnVwdFNvY2tSZWFkZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiAoZmRzWzFdLnJldmVudHMgJiBUSFJJRlRfUE9MTElOKSkgewogICAgICAgICBpbnQ4X3QgYnVmOwotICAgICAgICBpZiAoLTEgPT0gcmVjdihpbnRTb2NrMl8sIGNhc3Rfc29ja29wdCgmYnVmKSwgc2l6ZW9mKGludDhfdCksIDApKSB7Ci0gICAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHJlY3YoKSBpbnRlcnJ1cHQgIiwgZXJybm8pOworICAgICAgICBpZiAoLTEgPT0gcmVjdihpbnRlcnJ1cHRTb2NrUmVhZGVyXywgY2FzdF9zb2Nrb3B0KCZidWYpLCBzaXplb2YoaW50OF90KSwgMCkpIHsKKyAgICAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgcmVjdigpIGludGVycnVwdCAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQpOwogICAgICAgfQogCiAgICAgICAvLyBDaGVjayBmb3IgdGhlIGFjdHVhbCBzZXJ2ZXIgc29ja2V0IGJlaW5nIHJlYWR5Ci0gICAgICBpZiAoZmRzWzBdLnJldmVudHMgJiBQT0xMSU4pIHsKKyAgICAgIGlmIChmZHNbMF0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIHBvbGwgMCIpOworICAgICAgR2xvYmFsT3V0cHV0KCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX1BPTEwgMCIpOwogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKICAgICB9CiAgIH0KIAogICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBjbGllbnRBZGRyZXNzOwogICBpbnQgc2l6ZSA9IHNpemVvZihjbGllbnRBZGRyZXNzKTsKLSAgU09DS0VUIGNsaWVudFNvY2tldCA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZjbGllbnRBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvY2tsZW5fdCAqKSAmc2l6ZSk7CisgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CisgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CiAKLSAgaWYgKGNsaWVudFNvY2tldCA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgIGlmIChjbGllbnRTb2NrZXQgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOwogICB9CiAKICAgLy8gTWFrZSBzdXJlIGNsaWVudCBzb2NrZXQgaXMgYmxvY2tpbmcKLSAgaW50IGZsYWdzID0gZmNudGwoY2xpZW50U29ja2V0LCBGX0dFVEZMLCAwKTsKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOwogICBpZiAoZmxhZ3MgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBmY250bCgpIEZfR0VURkwgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiZmNudGwoRl9HRVRGTCkiLCBlcnJub19jb3B5KTsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIFRIUklGVF9GQ05UTCgpIFRIUklGVF9GX0dFVEZMICIsIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRkNOVEwoVEhSSUZUX0ZfR0VURkwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOwogICB9CiAKLSAgaWYgKC0xID09IGZjbnRsKGNsaWVudFNvY2tldCwgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSykpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOwotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBmY250bCgpIEZfU0VURkwgfk9fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiZmNudGwoRl9TRVRGTCkiLCBlcnJub19jb3B5KTsKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChjbGllbnRTb2NrZXQsIFRIUklGVF9GX1NFVEZMLCBmbGFncyAmIH5USFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0CisgICAgICAgIC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCB+VEhSSUZUX09fTk9OQkxPQ0sgIiwKKyAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX1NFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKICAgfQogCiAgIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50ID0gY3JlYXRlU29ja2V0KGNsaWVudFNvY2tldCk7CkBAIC00NDQsNDUgKzYyOCw3MCBAQAogICBpZiAocmVjdlRpbWVvdXRfID4gMCkgewogICAgIGNsaWVudC0+c2V0UmVjdlRpbWVvdXQocmVjdlRpbWVvdXRfKTsKICAgfQotICBjbGllbnQtPnNldENhY2hlZEFkZHJlc3MoKHNvY2thZGRyKikgJmNsaWVudEFkZHJlc3MsIHNpemUpOworICBpZiAoa2VlcEFsaXZlXykgeworICAgIGNsaWVudC0+c2V0S2VlcEFsaXZlKGtlZXBBbGl2ZV8pOworICB9CisgIGNsaWVudC0+c2V0Q2FjaGVkQWRkcmVzcygoc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCBzaXplKTsKKworICBpZiAoYWNjZXB0Q2FsbGJhY2tfKQorICAgIGFjY2VwdENhbGxiYWNrXyhjbGllbnRTb2NrZXQpOwogCiAgIHJldHVybiBjbGllbnQ7CiB9CiAKLXNoYXJlZF9wdHI8VFNvY2tldD4gVFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFNPQ0tFVCBjbGllbnRTb2NrZXQpIHsKLSAgcmV0dXJuIHNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoY2xpZW50U29ja2V0KSk7CitzaGFyZWRfcHRyPFRTb2NrZXQ+IFRTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgeworICBpZiAoaW50ZXJydXB0YWJsZUNoaWxkcmVuXykgeworICAgIHJldHVybiBzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGNsaWVudFNvY2tldCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKKyAgfQogfQogCi12b2lkIFRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHsKLSAgaWYgKGludFNvY2sxXyAhPSAtMSkgewordm9pZCBUU2VydmVyU29ja2V0Ojpub3RpZnkoVEhSSUZUX1NPQ0tFVCBub3RpZnlTb2NrZXQpIHsKKyAgaWYgKG5vdGlmeVNvY2tldCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICBpbnQ4X3QgYnl0ZSA9IDA7Ci0gICAgaWYgKC0xID09IHNlbmQoaW50U29jazFfLCBjYXN0X3NvY2tvcHQoJmJ5dGUpLCBzaXplb2YoaW50OF90KSwgMCkpIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHNlbmQoKSAiLCBlcnJubyk7CisgICAgaWYgKC0xID09IHNlbmQobm90aWZ5U29ja2V0LCBjYXN0X3NvY2tvcHQoJmJ5dGUpLCBzaXplb2YoaW50OF90KSwgMCkpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTZXJ2ZXJTb2NrZXQ6Om5vdGlmeSgpIHNlbmQoKSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgICAgfQogICB9CiB9CiAKLXZvaWQgVFNlcnZlclNvY2tldDo6Y2xvc2UoKSB7Ci0gIGlmIChzZXJ2ZXJTb2NrZXRfICE9IC0xKSB7Ci0KLSNpZmRlZiBfV0lOMzIKLSAgICAgIHNodXRkb3duKHNlcnZlclNvY2tldF8sIFNEX0JPVEgpOwotICAgICAgOjpjbG9zZXNvY2tldChzZXJ2ZXJTb2NrZXRfKTsKLSNlbHNlCi0gICAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBTSFVUX1JEV1IpOwotICAgICAgOjpjbG9zZShzZXJ2ZXJTb2NrZXRfKTsKLSNlbmRpZgotCit2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmludGVycnVwdCgpIHsKKyAgY29uY3VycmVuY3k6Okd1YXJkIGcocndNdXRleF8pOworICBpZiAoaW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgbm90aWZ5KGludGVycnVwdFNvY2tXcml0ZXJfKTsKICAgfQotICBpZiAoaW50U29jazFfICE9IC0xKSB7Ci0gICAgICA6OmNsb3NlKGludFNvY2sxXyk7Ci0gIH0KLSAgaWYgKGludFNvY2syXyAhPSAtMSkgewotICAgIDo6Y2xvc2UoaW50U29jazJfKTsKLSAgfQotICBzZXJ2ZXJTb2NrZXRfID0gLTE7Ci0gIGludFNvY2sxXyA9IC0xOwotICBpbnRTb2NrMl8gPSAtMTsKIH0KIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK3ZvaWQgVFNlcnZlclNvY2tldDo6aW50ZXJydXB0Q2hpbGRyZW4oKSB7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgbm90aWZ5KGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9Cit9CisKK3ZvaWQgVFNlcnZlclNvY2tldDo6Y2xvc2UoKSB7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKHNlcnZlclNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc2VydmVyU29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc2VydmVyU29ja2V0Xyk7CisgIH0KKyAgaWYgKGludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQorICBpZiAoaW50ZXJydXB0U29ja1JlYWRlcl8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoaW50ZXJydXB0U29ja1JlYWRlcl8pOworICB9CisgIGlmIChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8pOworICB9CisgIHNlcnZlclNvY2tldF8gPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7CisgIGludGVycnVwdFNvY2tXcml0ZXJfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBpbnRlcnJ1cHRTb2NrUmVhZGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKKyAgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8ucmVzZXQoKTsKKyAgbGlzdGVuaW5nXyA9IGZhbHNlOworfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCmluZGV4IDJlZTc1OTMuLmIyM2QyYzEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oCkBAIC0yMCw1MyArMjAsMTQ0IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlICJUU2VydmVyVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaWZuZGVmIF9XSU4zMgotICAgdHlwZWRlZiBpbnQgU09DS0VUOworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KICNlbmRpZgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBjbGFzcyBUU29ja2V0OwogCitjbGFzcyBUR2V0QWRkckluZm9XcmFwcGVyIHsKK3B1YmxpYzoKKyAgVEdldEFkZHJJbmZvV3JhcHBlcihjb25zdCBjaGFyKiBub2RlLCBjb25zdCBjaGFyKiBzZXJ2aWNlLCBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzKTsKKworICB2aXJ0dWFsIH5UR2V0QWRkckluZm9XcmFwcGVyKCk7CisKKyAgaW50IGluaXQoKTsKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiByZXMoKTsKKworcHJpdmF0ZToKKyAgY29uc3QgY2hhciogbm9kZV87CisgIGNvbnN0IGNoYXIqIHNlcnZpY2VfOworICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzXzsKKyAgc3RydWN0IGFkZHJpbmZvKiByZXNfOworfTsKKwogLyoqCiAgKiBTZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQuIFdyYXBwZXIgYXJvdW5kIGEgdW5peAogICogc29ja2V0IGxpc3RlbiBhbmQgYWNjZXB0IGNhbGxzLgogICoKICAqLwogY2xhc3MgVFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOwotICBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCk7Ci0gIFRTZXJ2ZXJTb2NrZXQoc3RkOjpzdHJpbmcgcGF0aCk7CitwdWJsaWM6CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKFRIUklGVF9TT0NLRVQgZmQpPiBzb2NrZXRfZnVuY190OwogCi0gIH5UU2VydmVyU29ja2V0KCk7CisgIGNvbnN0IHN0YXRpYyBpbnQgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBzZW5kVGltZW91dCwgaW50IHJlY3ZUaW1lb3V0KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLCBpbnQgcG9ydCk7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIHVuaXggc29ja2V0cy4KKyAgICoKKyAgICogQHBhcmFtIHBhdGggUGF0aG5hbWUgZm9yIHVuaXggc29ja2V0LgorICAgKi8KKyAgVFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VFNlcnZlclNvY2tldCgpOwogCiAgIHZvaWQgc2V0U2VuZFRpbWVvdXQoaW50IHNlbmRUaW1lb3V0KTsKICAgdm9pZCBzZXRSZWN2VGltZW91dChpbnQgcmVjdlRpbWVvdXQpOwogCiAgIHZvaWQgc2V0QWNjZXB0VGltZW91dChpbnQgYWNjVGltZW91dCk7CisgIHZvaWQgc2V0QWNjZXB0QmFja2xvZyhpbnQgYWNjQmFja2xvZyk7CiAKICAgdm9pZCBzZXRSZXRyeUxpbWl0KGludCByZXRyeUxpbWl0KTsKICAgdm9pZCBzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KTsKIAorICB2b2lkIHNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeyBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOyB9CisKICAgdm9pZCBzZXRUY3BTZW5kQnVmZmVyKGludCB0Y3BTZW5kQnVmZmVyKTsKICAgdm9pZCBzZXRUY3BSZWN2QnVmZmVyKGludCB0Y3BSZWN2QnVmZmVyKTsKIAorICAvLyBsaXN0ZW5DYWxsYmFjayBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSBsaXN0ZW4sIGFuZCBhZnRlciBhbGwgVGhyaWZ0CisgIC8vIHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZSBjdXN0b20gc2V0c29ja29wdAorICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgIHZvaWQgc2V0TGlzdGVuQ2FsbGJhY2soY29uc3Qgc29ja2V0X2Z1bmNfdCYgbGlzdGVuQ2FsbGJhY2spIHsgbGlzdGVuQ2FsbGJhY2tfID0gbGlzdGVuQ2FsbGJhY2s7IH0KKworICAvLyBhY2NlcHRDYWxsYmFjayBnZXRzIGNhbGxlZCBhZnRlciBlYWNoIGFjY2VwdCBjYWxsLCBvbiB0aGUgbmV3bHkgY3JlYXRlZCBzb2NrZXQuCisgIC8vIEl0IGlzIGNhbGxlZCBhZnRlciBhbGwgVGhyaWZ0IHNldHNvY2tvcHQgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuICBJZiB5b3UgaGF2ZQorICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgLy8gc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRBY2NlcHRDYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBhY2NlcHRDYWxsYmFjaykgeyBhY2NlcHRDYWxsYmFja18gPSBhY2NlcHRDYWxsYmFjazsgfQorCisgIC8vIFdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLCBuZXcgY2hpbGRyZW4gVFNvY2tldHMgd2lsbCBiZSBjb25zdHJ1Y3RlZCBzbworICAvLyB0aGV5IGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBUU2VydmVyVHJhbnNwb3J0OjppbnRlcnJ1cHRDaGlsZHJlbigpLgorICAvLyBUaGlzIGlzIG1vcmUgZXhwZW5zaXZlIGluIHRlcm1zIG9mIHN5c3RlbSBjYWxscyAocG9sbCArIHJlY3YpIGhvd2V2ZXIKKyAgLy8gZW5zdXJlcyBhIGNvbm5lY3RlZCBjbGllbnQgY2Fubm90IGludGVyZmVyZSB3aXRoIFRTZXJ2ZXI6OnN0b3AoKS4KKyAgLy8KKyAgLy8gV2hlbiBkaXNhYmxlZCwgVFNvY2tldCBjaGlsZHJlbiBkbyBub3QgaW5jdXIgYW4gYWRkaXRpb25hbCBwb2xsKCkgY2FsbC4KKyAgLy8gU2VydmVyLXNpZGUgcmVhZHMgYXJlIG1vcmUgZWZmaWNpZW50LCBob3dldmVyIGEgY2xpZW50IGNhbiBpbnRlcmZlcmUgd2l0aAorICAvLyB0aGUgc2VydmVyJ3MgYWJpbGl0eSB0byBzaHV0ZG93biBwcm9wZXJseSBieSBzdGF5aW5nIGNvbm5lY3RlZC4KKyAgLy8KKyAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxpc3RlbigpOyBtb2RlIGNhbm5vdCBiZSBzd2l0Y2hlZCBhZnRlciB0aGF0LgorICAvLyBcdGhyb3dzIHN0ZDo6bG9naWNfZXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCisgIHZvaWQgc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKTsKKworICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCisgIGludCBnZXRQb3J0KCk7CisKICAgdm9pZCBsaXN0ZW4oKTsKKyAgdm9pZCBpbnRlcnJ1cHQoKTsKKyAgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpOwogICB2b2lkIGNsb3NlKCk7CiAKLSAgdm9pZCBpbnRlcnJ1cHQoKTsKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgYm9vbCBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fOworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl87IC8vIGlmIGludGVycnVwdGFibGVDaGlsZHJlbl8gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cwogCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFNPQ0tFVCBjbGllbnQpOworcHJpdmF0ZToKKyAgdm9pZCBub3RpZnkoVEhSSUZUX1NPQ0tFVCBub3RpZnlTb2NrKTsKIAotIHByaXZhdGU6CiAgIGludCBwb3J0XzsKKyAgc3RkOjpzdHJpbmcgYWRkcmVzc187CiAgIHN0ZDo6c3RyaW5nIHBhdGhfOwotICBTT0NLRVQgc2VydmVyU29ja2V0XzsKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOwogICBpbnQgYWNjZXB0QmFja2xvZ187CiAgIGludCBzZW5kVGltZW91dF87CiAgIGludCByZWN2VGltZW91dF87CkBAIC03NSwxMSArMTY2LDE5IEBACiAgIGludCByZXRyeURlbGF5XzsKICAgaW50IHRjcFNlbmRCdWZmZXJfOwogICBpbnQgdGNwUmVjdkJ1ZmZlcl87CisgIGJvb2wga2VlcEFsaXZlXzsKKyAgYm9vbCBsaXN0ZW5pbmdfOwogCi0gIFNPQ0tFVCBpbnRTb2NrMV87Ci0gIFNPQ0tFVCBpbnRTb2NrMl87CisgIGNvbmN1cnJlbmN5OjpNdXRleCByd011dGV4XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQtc2FmZSBpbnRlcnJ1cHQKKyAgVEhSSUZUX1NPQ0tFVCBpbnRlcnJ1cHRTb2NrV3JpdGVyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdGlmaWVkIG9uIGludGVycnVwdCgpCisgIFRIUklGVF9TT0NLRVQgaW50ZXJydXB0U29ja1JlYWRlcl87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1c2VkIGluIHNlbGVjdC9wb2xsIHdpdGggc2VydmVyU29ja2V0XyBmb3IgaW50ZXJydXB0YWJpbGl0eQorICBUSFJJRlRfU09DS0VUIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl87ICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gaW50ZXJydXB0Q2hpbGRyZW4oKQorCisgIHNvY2tldF9mdW5jX3QgbGlzdGVuQ2FsbGJhY2tfOworICBzb2NrZXRfZnVuY190IGFjY2VwdENhbGxiYWNrXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaAppbmRleCA0MGJiYzZjLi5kYjc2MzJhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaApAQCAtMjAsMTkgKzIwLDIxIEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJUUkFOU1BPUlRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXyAxCiAKLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCi0gKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLgotICoKKyAqIGNyZWF0aW5nIGJhc2UgdHJhbnNwb3J0cyB0byByZWFkL3dyaXRlIGZyb20uICBUaGUgc2VydmVyIGlzIGV4cGVjdGVkCisgKiB0byBrZWVwIHRyYWNrIG9mIFRUcmFuc3BvcnQgY2hpbGRyZW4gdGhhdCBpdCBjcmVhdGVzIGZvciBwdXJwb3NlcyBvZgorICogY29udHJvbGxpbmcgdGhlaXIgbGlmZXRpbWUuCiAgKi8KIGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB+VFNlcnZlclRyYW5zcG9ydCgpIHt9CiAKICAgLyoqCkBAIC01Myw5ICs1NSw5IEBACiAgICAqIEByZXR1cm4gQSBuZXcgVFRyYW5zcG9ydCBvYmplY3QKICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCiAgICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7CisgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTY1LDE2ICs2NywzNSBAQAogICAgKiBGb3IgInNtYXJ0IiBUU2VydmVyVHJhbnNwb3J0IGltcGxlbWVudGF0aW9ucyB0aGF0IHdvcmsgaW4gYSBtdWx0aQogICAgKiB0aHJlYWRlZCBjb250ZXh0IHRoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgb3V0IG9mIGFuIGFjY2VwdCgpIGNhbGwuCiAgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHRyYW5zcG9ydCB3aWxsIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbgotICAgKiB3aXRoIHRoZSBpbnRlcnJ1cHRlZCBlcnJvciBjb2RlLgorICAgKiB3aXRoIHRoZSBJTlRFUlJVUFRFRCBlcnJvciBjb2RlLgorICAgKgorICAgKiBUaGlzIHdpbGwgbm90IG1ha2UgYW4gYXR0ZW1wdCB0byBpbnRlcnJ1cHQgYW55IFRUcmFuc3BvcnQgY2hpbGRyZW4uCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30KIAogICAvKioKKyAgICogVGhpcyB3aWxsIGludGVycnVwdCB0aGUgY2hpbGRyZW4gY3JlYXRlZCBieSB0aGUgc2VydmVyIHRyYW5zcG9ydC4KKyAgICogYWxsb3dpbmcgdGhlbSB0byBicmVhayBvdXQgb2YgYW55IGJsb2NraW5nIGRhdGEgcmVjZXB0aW9uIGNhbGwuCisgICAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGNoaWxkcmVuIHdpbGwgdGhyb3cgYSBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAqIHdpdGggdGhlIElOVEVSUlVQVEVEIGVycm9yIGNvZGUuCisgICAqLworICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0Q2hpbGRyZW4oKSB7fQorCisgIC8qKgorICAqIFV0aWxpdHkgbWV0aG9kCisgICoKKyAgKiBAcmV0dXJuIHNlcnZlciBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gLTE7IH0KKworICAvKioKICAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KICAgICovCiAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgVFNlcnZlclRyYW5zcG9ydCgpIHt9CiAKICAgLyoqCkBAIC04MywxMCArMTA0LDEwIEBACiAgICAqIEByZXR1cm4gQSBuZXdseSBhbGxvY2F0ZWQgVFRyYW5zcG9ydCBvYmplY3QKICAgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7Ci0KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaAppbmRleCA4ZGVmMzU0Li4xMTgyNTJkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaApAQCAtMjUsNyArMjUsMTAgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSB0ZXN0IHsKIAogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIG9ubHkgbWVhbnQgZm9yIHRlc3RpbmcuICBJdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydC4KQEAgLTM0LDY0ICszNyw0NiBAQAogICoKICAqLwogY2xhc3MgVFNob3J0UmVhZFRyYW5zcG9ydCA6IHB1YmxpYyBUVmlydHVhbFRyYW5zcG9ydDxUU2hvcnRSZWFkVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotICBUU2hvcnRSZWFkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgZG91YmxlIGZ1bGxfcHJvYikKLSAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KQotICAgICwgZnVsbFByb2JfKGZ1bGxfcHJvYikKLSAge30KK3B1YmxpYzoKKyAgVFNob3J0UmVhZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLCBmdWxsUHJvYl8oZnVsbF9wcm9iKSB7fQogCi0gIGJvb2wgaXNPcGVuKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmlzT3BlbigpOyB9CiAKLSAgYm9vbCBwZWVrKCkgewotICAgIHJldHVybiB0cmFuc3BvcnRfLT5wZWVrKCk7Ci0gIH0KKyAgYm9vbCBwZWVrKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+cGVlaygpOyB9CiAKLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQorICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQorICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICAgIGlmIChsZW4gPT0gMCkgewogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKHJhbmQoKS8oZG91YmxlKVJBTkRfTUFYID49IGZ1bGxQcm9iXykgewotICAgICAgbGVuID0gMSArIHJhbmQoKSVsZW47CisgICAgaWYgKHJhbmQoKSAvIChkb3VibGUpUkFORF9NQVggPj0gZnVsbFByb2JfKSB7CisgICAgICBsZW4gPSAxICsgcmFuZCgpICUgbGVuOwogICAgIH0KICAgICByZXR1cm4gdHJhbnNwb3J0Xy0+cmVhZChidWYsIGxlbik7CiAgIH0KIAotICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOwotICB9CisgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdHJhbnNwb3J0Xy0+d3JpdGUoYnVmLCBsZW4pOyB9CiAKLSAgdm9pZCBmbHVzaCgpIHsKLSAgICB0cmFuc3BvcnRfLT5mbHVzaCgpOwotICB9CisgIHZvaWQgZmx1c2goKSB7IHRyYW5zcG9ydF8tPmZsdXNoKCk7IH0KIAotICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF8tPmJvcnJvdyhidWYsIGxlbik7Ci0gIH0KKyAgY29uc3QgdWludDhfdCogYm9ycm93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbikgeyByZXR1cm4gdHJhbnNwb3J0Xy0+Ym9ycm93KGJ1ZiwgbGVuKTsgfQogCi0gIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsKLSAgICByZXR1cm4gdHJhbnNwb3J0Xy0+Y29uc3VtZShsZW4pOwotICB9CisgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7Ci0gICAgcmV0dXJuIHRyYW5zcG9ydF87Ci0gIH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CiAKLSBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogICBkb3VibGUgZnVsbFByb2JfOwogfTsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3QKIAogI2VuZGlmIC8vICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFNIT1JUUkVBRFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcAppbmRleCBiNTJlNGQ1Li40YjEzOTllIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmNwcApAQCAtMTcsMTAgKzE3LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICJUU2ltcGxlRmlsZVRyYW5zcG9ydC5oIgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0Lmg+CiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKQEAgLTMyLDExICszMSwxMiBAQAogI2luY2x1ZGUgPGlvLmg+CiAjZW5kaWYKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotVFNpbXBsZUZpbGVUcmFuc3BvcnQ6OgotVFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wgcmVhZCwgYm9vbCB3cml0ZSkKLSAgICA6IFRGRFRyYW5zcG9ydCgtMSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSB7CitUU2ltcGxlRmlsZVRyYW5zcG9ydDo6VFNpbXBsZUZpbGVUcmFuc3BvcnQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGJvb2wgcmVhZCwgYm9vbCB3cml0ZSkKKyAgOiBURkRUcmFuc3BvcnQoLTEsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSkgewogICBpbnQgZmxhZ3MgPSAwOwogICBpZiAocmVhZCAmJiB3cml0ZSkgewogICAgIGZsYWdzID0gT19SRFdSOwpAQCAtNTEsMTggKzUxLDE3IEBACiAgICAgZmxhZ3MgfD0gT19DUkVBVCB8IE9fQVBQRU5EOwogICB9CiAjaWZuZGVmIF9XSU4zMgotICBtb2RlX3QgbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSfCBTX0lSR1JQIHwgU19JUk9USDsKKyAgbW9kZV90IG1vZGUgPSBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIOwogI2Vsc2UKICAgaW50IG1vZGUgPSBfU19JUkVBRCB8IF9TX0lXUklURTsKICNlbmRpZgotICBpbnQgZmQgPSA6Om9wZW4ocGF0aC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgaW50IGZkID0gOjpUSFJJRlRfT1BFTihwYXRoLmNfc3RyKCksIGZsYWdzLCBtb2RlKTsKICAgaWYgKGZkIDwgMCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oImZhaWxlZCB0byBvcGVuIGZpbGUgZm9yIHdyaXRpbmc6ICIgKyBwYXRoKTsKICAgfQogICBzZXRGRChmZCk7CiAgIG9wZW4oKTsKIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5oCmluZGV4IDZjYzUyZWEuLjMyZTE4OTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaW1wbGVGaWxlVHJhbnNwb3J0LmgKQEAgLTIwLDkgKzIwLDExIEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfIDEKIAotI2luY2x1ZGUgIlRGRFRyYW5zcG9ydC5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogRGVhZC1zaW1wbGUgd3JhcHBlciBhcm91bmQgYSBmaWxlLgpAQCAtMzAsMTIgKzMyLDExIEBACiAgKiBXcml0ZWFibGUgZmlsZXMgYXJlIG9wZW5lZCB3aXRoIE9fQ1JFQVQgYW5kIE9fQVBQRU5ECiAgKi8KIGNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IDogcHVibGljIFRGRFRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUU2ltcGxlRmlsZVRyYW5zcG9ydChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkID0gIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGUgPSBmYWxzZSk7CitwdWJsaWM6CisgIFRTaW1wbGVGaWxlVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBib29sIHJlYWQgPSB0cnVlLCBib29sIHdyaXRlID0gZmFsc2UpOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gIF9USFJJRlRfVFJBTlNQT1JUX1RTSU1QTEVGSUxFVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcAppbmRleCA4OGNiMjgyLi5jNmMyYmZhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKQEAgLTE3LDExICsxNywxMyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPHNzdHJlYW0+CisjaWZkZWYgSEFWRV9TWVNfSU9DVExfSAorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCiAjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjZW5kaWYKQEAgLTMyLDkgKzM0LDYgQEAKICNpbmNsdWRlIDxzeXMvcG9sbC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9BUlBBX0lORVRfSAotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2VuZGlmCiAjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KQEAgLTQyLDE1NyArNDEsMjI4IEBACiAjaWZkZWYgSEFWRV9VTklTVERfSAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlICJUU29ja2V0LmgiCi0jaW5jbHVkZSAiVFRyYW5zcG9ydEV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KIAogI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAotIyAgIGlmbmRlZiBfV0lOMzIKLSMgICAgICAgZGVmaW5lIFNPQ0tPUFRfQ0FTVF9UIHZvaWQKLSMgICBlbHNlCi0jICAgICAgIGRlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCi0jICAgZW5kaWYgLy8gX1dJTjMyCisjaWZuZGVmIF9XSU4zMgorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCB2b2lkCisjZWxzZQorI2RlZmluZSBTT0NLT1BUX0NBU1RfVCBjaGFyCisjZW5kaWYgLy8gX1dJTjMyCiAjZW5kaWYKIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKj4odik7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIGlubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTT0NLT1BUX0NBU1RfVCo+KHYpOwogfQogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewordXNpbmcgc3RkOjpzdHJpbmc7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLS8vIEdsb2JhbCB2YXIgdG8gdHJhY2sgdG90YWwgc29ja2V0IHN5cyBjYWxscwotdWludDMyX3QgZ19zb2NrZXRfc3lzY2FsbHMgPSAwOworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFRTb2NrZXQgaW1wbGVtZW50YXRpb24uCiAgKgogICovCiAKLVRTb2NrZXQ6OlRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KSA6Ci0gIGhvc3RfKGhvc3QpLAotICBwb3J0Xyhwb3J0KSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKC0xKSwKLSAgY29ublRpbWVvdXRfKDApLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgbGluZ2VyT25fKDEpLAotICBsaW5nZXJWYWxfKDApLAotICBub0RlbGF5XygxKSwKLSAgbWF4UmVjdlJldHJpZXNfKDUpIHsKLSAgcmVjdlRpbWV2YWxfLnR2X3NlYyA9IChpbnQpKHJlY3ZUaW1lb3V0Xy8xMDAwKTsKLSAgcmVjdlRpbWV2YWxfLnR2X3VzZWMgPSAoaW50KSgocmVjdlRpbWVvdXRfJTEwMDApKjEwMDApOworVFNvY2tldDo6VFNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQorICA6IGhvc3RfKGhvc3QpLAorICAgIHBvcnRfKHBvcnQpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKIH0KIAotVFNvY2tldDo6VFNvY2tldChzdHJpbmcgcGF0aCkgOgotICBob3N0XygiIiksCi0gIHBvcnRfKDApLAotICBwYXRoXyhwYXRoKSwKLSAgc29ja2V0XygtMSksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKK1RTb2NrZXQ6OlRTb2NrZXQoY29uc3Qgc3RyaW5nJiBwYXRoKQorICA6IHBvcnRfKDApLAorICAgIHBhdGhfKHBhdGgpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBwZWVyUG9ydF8oMCksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKICAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKIH0KIAotVFNvY2tldDo6VFNvY2tldCgpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKC0xKSwKLSAgY29ublRpbWVvdXRfKDApLAotICBzZW5kVGltZW91dF8oMCksCi0gIHJlY3ZUaW1lb3V0XygwKSwKLSAgbGluZ2VyT25fKDEpLAotICBsaW5nZXJWYWxfKDApLAotICBub0RlbGF5XygxKSwKLSAgbWF4UmVjdlJldHJpZXNfKDUpIHsKLSAgcmVjdlRpbWV2YWxfLnR2X3NlYyA9IChpbnQpKHJlY3ZUaW1lb3V0Xy8xMDAwKTsKLSAgcmVjdlRpbWV2YWxfLnR2X3VzZWMgPSAoaW50KSgocmVjdlRpbWVvdXRfJTEwMDApKjEwMDApOworVFNvY2tldDo6VFNvY2tldCgpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgewogICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOwogfQogCi1UU29ja2V0OjpUU29ja2V0KFNPQ0tFVCBzb2NrZXQpIDoKLSAgaG9zdF8oIiIpLAotICBwb3J0XygwKSwKLSAgcGF0aF8oIiIpLAotICBzb2NrZXRfKHNvY2tldCksCi0gIGNvbm5UaW1lb3V0XygwKSwKLSAgc2VuZFRpbWVvdXRfKDApLAotICByZWN2VGltZW91dF8oMCksCi0gIGxpbmdlck9uXygxKSwKLSAgbGluZ2VyVmFsXygwKSwKLSAgbm9EZWxheV8oMSksCi0gIG1heFJlY3ZSZXRyaWVzXyg1KSB7Ci0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCisgIDogcG9ydF8oMCksCisgICAgc29ja2V0Xyhzb2NrZXQpLAorICAgIHBlZXJQb3J0XygwKSwKKyAgICBjb25uVGltZW91dF8oMCksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaW5nZXJPbl8oMSksCisgICAgbGluZ2VyVmFsXygwKSwKKyAgICBub0RlbGF5XygxKSwKKyAgICBtYXhSZWN2UmV0cmllc18oNSkgewogICBjYWNoZWRQZWVyQWRkcl8uaXB2NC5zaW5fZmFtaWx5ID0gQUZfVU5TUEVDOworI2lmZGVmIFNPX05PU0lHUElQRQorICB7CisgICAgaW50IG9uZSA9IDE7CisgICAgc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19OT1NJR1BJUEUsICZvbmUsIHNpemVvZihvbmUpKTsKKyAgfQorI2VuZGlmCit9CisKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKKyAgOiBwb3J0XygwKSwKKyAgICBzb2NrZXRfKHNvY2tldCksCisgICAgcGVlclBvcnRfKDApLAorICAgIGludGVycnVwdExpc3RlbmVyXyhpbnRlcnJ1cHRMaXN0ZW5lciksCisgICAgY29ublRpbWVvdXRfKDApLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGluZ2VyT25fKDEpLAorICAgIGxpbmdlclZhbF8oMCksCisgICAgbm9EZWxheV8oMSksCisgICAgbWF4UmVjdlJldHJpZXNfKDUpIHsKKyAgY2FjaGVkUGVlckFkZHJfLmlwdjQuc2luX2ZhbWlseSA9IEFGX1VOU1BFQzsKKyNpZmRlZiBTT19OT1NJR1BJUEUKKyAgeworICAgIGludCBvbmUgPSAxOworICAgIHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTk9TSUdQSVBFLCAmb25lLCBzaXplb2Yob25lKSk7CisgIH0KKyNlbmRpZgogfQogCiBUU29ja2V0Ojp+VFNvY2tldCgpIHsKICAgY2xvc2UoKTsKIH0KIAorYm9vbCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpIHsKKyAgaWYgKCFpc09wZW4oKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludDMyX3QgcmV0cmllcyA9IDA7CisgIFRIUklGVF9JT0NUTF9TT0NLRVRfTlVNX0JZVEVTX1RZUEUgbnVtQnl0ZXNBdmFpbGFibGU7Cit0cnlfYWdhaW46CisgIGludCByID0gVEhSSUZUX0lPQ1RMX1NPQ0tFVChzb2NrZXRfLCBGSU9OUkVBRCwgJm51bUJ5dGVzQXZhaWxhYmxlKTsKKyAgaWYgKHIgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSkgeworICAgICAgZ290byB0cnlfYWdhaW47CisgICAgfQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgVEhSSUZUX0lPQ1RMX1NPQ0tFVCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgfQorICByZXR1cm4gbnVtQnl0ZXNBdmFpbGFibGUgPiAwOworfQorCiBib29sIFRTb2NrZXQ6OmlzT3BlbigpIHsKLSAgcmV0dXJuIChzb2NrZXRfICE9IC0xKTsKKyAgcmV0dXJuIChzb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCk7CiB9CiAKIGJvb2wgVFNvY2tldDo6cGVlaygpIHsKICAgaWYgKCFpc09wZW4oKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQorICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgZm9yIChpbnQgcmV0cmllcyA9IDA7OykgeworICAgICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICAgICAgc3RkOjptZW1zZXQoZmRzLCAwLCBzaXplb2YoZmRzKSk7CisgICAgICBmZHNbMF0uZmQgPSBzb2NrZXRfOworICAgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgICBmZHNbMV0uZmQgPSAqKGludGVycnVwdExpc3RlbmVyXy5nZXQoKSk7CisgICAgICBmZHNbMV0uZXZlbnRzID0gVEhSSUZUX1BPTExJTjsKKyAgICAgIGludCByZXQgPSBUSFJJRlRfUE9MTChmZHMsIDIsIChyZWN2VGltZW91dF8gPT0gMCkgPyAtMSA6IHJlY3ZUaW1lb3V0Xyk7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cGVlaygpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgIlVua25vd24iLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgICAgaWYgKGZkc1sxXS5yZXZlbnRzICYgVEhSSUZUX1BPTExJTikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGRhdGEgb3IgYSBkaXNjb25uZWN0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIFBFRUsKKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyB0aW1lb3V0CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDaGVjayB0byBzZWUgaWYgZGF0YSBpcyBhdmFpbGFibGUgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZAogICB1aW50OF90IGJ1ZjsKLSAgaW50IHIgPSByZWN2KHNvY2tldF8sIGNhc3Rfc29ja29wdCgmYnVmKSwgMSwgTVNHX1BFRUspOworICBpbnQgciA9IHN0YXRpY19jYXN0PGludD4ocmVjdihzb2NrZXRfLCBjYXN0X3NvY2tvcHQoJmJ1ZiksIDEsIE1TR19QRUVLKSk7CiAgIGlmIChyID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKLSAgICAjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXyB8fCBkZWZpbmVkIF9fTUFDSF9fCisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KICAgICAvKiBzaGlnaW46Ci0gICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBFQ09OTlJFU0VUIGlmIHNvY2tldCB3YXMgY2xvc2VkIGJ5CisgICAgICogZnJlZWJzZCByZXR1cm5zIC0xIGFuZCBUSFJJRlRfRUNPTk5SRVNFVCBpZiBzb2NrZXQgd2FzIGNsb3NlZCBieQogICAgICAqIHRoZSBvdGhlciBzaWRlCiAgICAgICovCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCkKLSAgICB7Ci0gICAgICBjbG9zZSgpOworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgICNlbmRpZgorI2VuZGlmCiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cGVlaygpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJyZWN2KCkiLCBlcnJub19jb3B5KTsKICAgfQogICByZXR1cm4gKHIgPiAwKTsKIH0KIAotdm9pZCBUU29ja2V0OjpvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8gKnJlcykgewordm9pZCBUU29ja2V0OjpvcGVuQ29ubmVjdGlvbihzdHJ1Y3QgYWRkcmluZm8qIHJlcykgewogCiAgIGlmIChpc09wZW4oKSkgewogICAgIHJldHVybjsKICAgfQogCi0gIGlmICghIHBhdGhfLmVtcHR5KCkpIHsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAgICAgc29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CiAgIH0gZWxzZSB7CiAgICAgc29ja2V0XyA9IHNvY2tldChyZXMtPmFpX2ZhbWlseSwgcmVzLT5haV9zb2NrdHlwZSwgcmVzLT5haV9wcm90b2NvbCk7CiAgIH0KIAotICBpZiAoc29ja2V0XyA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIHNvY2tldCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQoKSIsIGVycm5vX2NvcHkpOwogICB9CkBAIC0yMDcsMTMgKzI3NywyNCBAQAogICAgIHNldFJlY3ZUaW1lb3V0KHJlY3ZUaW1lb3V0Xyk7CiAgIH0KIAorICBpZiAoa2VlcEFsaXZlXykgeworICAgIHNldEtlZXBBbGl2ZShrZWVwQWxpdmVfKTsKKyAgfQorCiAgIC8vIExpbmdlcgogICBzZXRMaW5nZXIobGluZ2VyT25fLCBsaW5nZXJWYWxfKTsKIAogICAvLyBObyBkZWxheQogICBzZXROb0RlbGF5KG5vRGVsYXlfKTsKIAotICAvLyBVc2VzIGEgbG93IG1pbiBSVE8gaWYgYXNrZWQgdG8uCisjaWZkZWYgU09fTk9TSUdQSVBFCisgIHsKKyAgICBpbnQgb25lID0gMTsKKyAgICBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX05PU0lHUElQRSwgJm9uZSwgc2l6ZW9mKG9uZSkpOworICB9CisjZW5kaWYKKworLy8gVXNlcyBhIGxvdyBtaW4gUlRPIGlmIGFza2VkIHRvLgogI2lmZGVmIFRDUF9MT1dfTUlOX1JUTwogICBpZiAoZ2V0VXNlTG93TWluUnRvKCkpIHsKICAgICBpbnQgb25lID0gMTsKQEAgLTIyMSw0NiArMzAyLDU2IEBACiAgIH0KICNlbmRpZgogCi0KICAgLy8gU2V0IHRoZSBzb2NrZXQgdG8gYmUgbm9uIGJsb2NraW5nIGZvciBjb25uZWN0IGlmIGEgdGltZW91dCBleGlzdHMKLSAgaW50IGZsYWdzID0gZmNudGwoc29ja2V0XywgRl9HRVRGTCwgMCk7CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CiAgIGlmIChjb25uVGltZW91dF8gPiAwKSB7Ci0gICAgaWYgKC0xID09IGZjbnRsKHNvY2tldF8sIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSykpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZmNudGwoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJmY250bCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIGlmICgtMSA9PSBUSFJJRlRfRkNOVEwoc29ja2V0XywgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFRIUklGVF9GQ05UTCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBpZiAoLTEgPT0gZmNudGwoc29ja2V0XywgRl9TRVRGTCwgZmxhZ3MgJiB+T19OT05CTE9DSykpIHsKLSAgICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgZmNudGwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZmNudGwoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKKyAgICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncyAmIH5USFJJRlRfT19OT05CTE9DSykpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVEhSSUZUX0ZDTlRMICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwogICAgIH0KICAgfQogCiAgIC8vIENvbm5lY3QgdGhlIHNvY2tldAogICBpbnQgcmV0OwotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgewogCiAjaWZuZGVmIF9XSU4zMgotCi0gICAgc3RydWN0IHNvY2thZGRyX3VuIGFkZHJlc3M7Ci0gICAgc29ja2xlbl90IGxlbjsKLQotICAgIGlmIChwYXRoXy5sZW5ndGgoKSA+IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSkgewotICAgICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLCBlcnJub19jb3B5KTsKICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciKTsKICAgICB9CiAKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKICAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOwotICAgIHNucHJpbnRmKGFkZHJlc3Muc3VuX3BhdGgsIHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSwgIiVzIiwgcGF0aF8uY19zdHIoKSk7Ci0gICAgbGVuID0gc2l6ZW9mKGFkZHJlc3MpOwotICAgIHJldCA9IGNvbm5lY3Qoc29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkcmVzcywgbGVuKTsKKyAgICBtZW1jcHkoYWRkcmVzcy5zdW5fcGF0aCwgcGF0aF8uY19zdHIoKSwgbGVuKTsKIAorICAgIHNvY2tsZW5fdCBzdHJ1Y3RsZW4gPSBzdGF0aWNfY2FzdDxzb2NrbGVuX3Q+KHNpemVvZihhZGRyZXNzKSk7CisKKyAgICBpZiAoIWFkZHJlc3Muc3VuX3BhdGhbMF0pIHsgLy8gYWJzdHJhY3QgbmFtZXNwYWNlIHNvY2tldAorI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gc3VuX3BhdGggaXMgbm90IG51bGwtdGVybWluYXRlZCBpbiB0aGlzIGNhc2UgYW5kIHN0cnVjdGxlbiBkZXRlcm1pbmVzIGl0cyBsZW5ndGgKKyAgICAgIHN0cnVjdGxlbiAtPSBzaXplb2YoYWRkcmVzcy5zdW5fcGF0aCkgLSBsZW47CiAjZWxzZQotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQgb24gd2luZG93cyIsIC05OSk7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldHMgb25seSBzdXBwb3J0ZWQgb24gbGludXg6ICIsIC05OSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFic3RyYWN0IE5hbWVzcGFjZSBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOworI2VuZGlmCisgICAgfQorCisgICAgcmV0ID0gY29ubmVjdChzb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKTsKKyNlbHNlCisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQgb24gd2luZG93cyIsIC05OSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVW5peCBEb21haW4gc29ja2V0IHBhdGggbm90IHN1cHBvcnRlZCIpOwogI2VuZGlmCiAKICAgfSBlbHNlIHsKQEAgLTI3MiwxOCArMzYzLDE4IEBACiAgICAgZ290byBkb25lOwogICB9CiAKLSAgaWYgKChlcnJubyAhPSBFSU5QUk9HUkVTUykgJiYgKGVycm5vICE9IEVXT1VMREJMT0NLKSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87CisgIGlmICgoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VJTlBST0dSRVNTKQorICAgICAgJiYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SICE9IFRIUklGVF9FV09VTERCTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBjb25uZWN0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgImNvbm5lY3QoKSBmYWlsZWQiLCBlcnJub19jb3B5KTsKICAgfQogCi0KLSAgc3RydWN0IHBvbGxmZCBmZHNbMV07Ci0gIHN0ZDo6bWVtc2V0KGZkcywgMCAsIHNpemVvZihmZHMpKTsKKyAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzFdOworICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKICAgZmRzWzBdLmZkID0gc29ja2V0XzsKLSAgZmRzWzBdLmV2ZW50cyA9IFBPTExPVVQ7Ci0gIHJldCA9IHBvbGwoZmRzLCAxLCBjb25uVGltZW91dF8pOworICBmZHNbMF0uZXZlbnRzID0gVEhSSUZUX1BPTExPVVQ7CisgIHJldCA9IFRIUklGVF9QT0xMKGZkcywgMSwgY29ublRpbWVvdXRfKTsKIAogICBpZiAocmV0ID4gMCkgewogICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldApAQCAtMjkyLDcgKzM4Myw3IEBACiAgICAgbG9uID0gc2l6ZW9mKGludCk7CiAgICAgaW50IHJldDIgPSBnZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCBjYXN0X3NvY2tvcHQoJnZhbCksICZsb24pOwogICAgIGlmIChyZXQyID09IC0xKSB7Ci0gICAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBnZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiZ2V0c29ja29wdCgpIiwgZXJybm9fY29weSk7CiAgICAgfQpAQCAtMzAwLDcgKzM5MSw4IEBACiAgICAgaWYgKHZhbCA9PSAwKSB7CiAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBlcnJvciBvbiBzb2NrZXQgKGFmdGVyIHBvbGwpICIgKyBnZXRTb2NrZXRJbmZvKCksIHZhbCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIGVycm9yIG9uIHNvY2tldCAoYWZ0ZXIgVEhSSUZUX1BPTEwpICIgKyBnZXRTb2NrZXRJbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwpOwogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJzb2NrZXQgb3BlbigpIGVycm9yIiwgdmFsKTsKICAgfSBlbHNlIGlmIChyZXQgPT0gMCkgewogICAgIC8vIHNvY2tldCB0aW1lZCBvdXQKQEAgLTMwOCwxNSArNDAwLDE5IEBACiAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAib3BlbigpIHRpbWVkIG91dCIpOwogICB9IGVsc2UgewotICAgIC8vIGVycm9yIG9uIHBvbGwoKQotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6b3BlbigpIHBvbGwoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAicG9sbCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICAgIC8vIGVycm9yIG9uIFRIUklGVF9QT0xMKCkKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfUE9MTCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfUE9MTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOwogICB9CiAKLSBkb25lOgorZG9uZToKICAgLy8gU2V0IHNvY2tldCBiYWNrIHRvIG5vcm1hbCBtb2RlIChibG9ja2luZykKLSAgZmNudGwoc29ja2V0XywgRl9TRVRGTCwgZmxhZ3MpOworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CiAKICAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKICAgICBzZXRDYWNoZWRBZGRyZXNzKHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8c29ja2xlbl90PihyZXMtPmFpX2FkZHJsZW4pKTsKQEAgLTMyNywyNCArNDIzLDI0IEBACiAgIGlmIChpc09wZW4oKSkgewogICAgIHJldHVybjsKICAgfQotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7CisgIGlmICghcGF0aF8uZW1wdHkoKSkgewogICAgIHVuaXhfb3BlbigpOwogICB9IGVsc2UgewogICAgIGxvY2FsX29wZW4oKTsKICAgfQogfQogCi12b2lkIFRTb2NrZXQ6OnVuaXhfb3BlbigpewotICBpZiAoISBwYXRoXy5lbXB0eSgpKSB7Cit2b2lkIFRTb2NrZXQ6OnVuaXhfb3BlbigpIHsKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAgICAgLy8gVW5peCBEb21haW4gU09ja2V0IGRvZXMgbm90IG5lZWQgYWRkcmluZm8gc3RydWN0LCBzbyB3ZSBwYXNzIE5VTEwKICAgICBvcGVuQ29ubmVjdGlvbihOVUxMKTsKICAgfQogfQogCi12b2lkIFRTb2NrZXQ6OmxvY2FsX29wZW4oKXsKK3ZvaWQgVFNvY2tldDo6bG9jYWxfb3BlbigpIHsKIAogI2lmZGVmIF9XSU4zMgotICAgIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyAgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOwogI2VuZGlmIC8vIF9XSU4zMgogCiAgIGlmIChpc09wZW4oKSkgewpAQCAtMzUzLDcgKzQ0OSw3IEBACiAKICAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKICAgaWYgKHBvcnRfIDwgMCB8fCBwb3J0XyA+IDB4RkZGRikgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKICAgfQogCiAgIHN0cnVjdCBhZGRyaW5mbyBoaW50cywgKnJlcywgKnJlczA7CkBAIC0zNjksMTEgKzQ2NSwyMCBAQAogCiAgIGVycm9yID0gZ2V0YWRkcmluZm8oaG9zdF8uY19zdHIoKSwgcG9ydCwgJmhpbnRzLCAmcmVzMCk7CiAKKyNpZmRlZiBfV0lOMzIKKyAgaWYgKGVycm9yID09IFdTQU5PX0RBVEEpIHsKKyAgICBoaW50cy5haV9mbGFncyAmPSB+QUlfQUREUkNPTkZJRzsKKyAgICBlcnJvciA9IGdldGFkZHJpbmZvKGhvc3RfLmNfc3RyKCksIHBvcnQsICZoaW50cywgJnJlczApOworICB9CisjZW5kaWYKKwogICBpZiAoZXJyb3IpIHsKLSAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXQ6Om9wZW4oKSBnZXRhZGRyaW5mbygpICIgKyBnZXRTb2NrZXRJbmZvKCkgKyBzdHJpbmcoZ2FpX3N0cmVycm9yKGVycm9yKSk7CisgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0OjpvcGVuKCkgZ2V0YWRkcmluZm8oKSAiICsgZ2V0U29ja2V0SW5mbygpCisgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nKFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKICAgICBHbG9iYWxPdXRwdXQoZXJyU3RyLmNfc3RyKCkpOwogICAgIGNsb3NlKCk7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCByZXNvbHZlIGhvc3QgZm9yIGNsaWVudCBzb2NrZXQuIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVzb2x2ZSBob3N0IGZvciBjbGllbnQgc29ja2V0LiIpOwogICB9CiAKICAgLy8gQ3ljbGUgdGhyb3VnaCBhbGwgdGhlIHJldHVybmVkIGFkZHJlc3NlcyB1bnRpbCBvbmUKQEAgLTM5OCwxNDAgKzUwMywxMzkgQEAKIH0KIAogdm9pZCBUU29ja2V0OjpjbG9zZSgpIHsKLSAgaWYgKHNvY2tldF8gIT0gLTEpIHsKLQotI2lmZGVmIF9XSU4zMgotICAgICAgc2h1dGRvd24oc29ja2V0XywgU0RfQk9USCk7Ci0gICAgICA6OmNsb3Nlc29ja2V0KHNvY2tldF8pOwotI2Vsc2UKLSAgICAgIHNodXRkb3duKHNvY2tldF8sIFNIVVRfUkRXUik7Ci0gICAgICA6OmNsb3NlKHNvY2tldF8pOwotI2VuZGlmCi0KKyAgaWYgKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CisgICAgc2h1dGRvd24oc29ja2V0XywgVEhSSUZUX1NIVVRfUkRXUik7CisgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoc29ja2V0Xyk7CiAgIH0KLSAgc29ja2V0XyA9IC0xOworICBzb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogfQogCi12b2lkIFRTb2NrZXQ6OnNldFNvY2tldEZEKGludCBzb2NrZXQpIHsKLSAgaWYgKHNvY2tldF8gIT0gLTEpIHsKK3ZvaWQgVFNvY2tldDo6c2V0U29ja2V0RkQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpIHsKKyAgaWYgKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgY2xvc2UoKTsKICAgfQogICBzb2NrZXRfID0gc29ja2V0OwogfQogCiB1aW50MzJfdCBUU29ja2V0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzb2NrZXRfID09IC0xKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgcmVhZCBvbiBub24tb3BlbiBzb2NrZXQiKTsKICAgfQogCiAgIGludDMyX3QgcmV0cmllcyA9IDA7CiAKLSAgLy8gRUFHQUlOIGNhbiBiZSBzaWduYWxsZWQgYm90aCB3aGVuIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgYW5kIHdoZW4KKyAgLy8gVEhSSUZUX0VBR0FJTiBjYW4gYmUgc2lnbmFsbGVkIGJvdGggd2hlbiBhIHRpbWVvdXQgaGFzIG9jY3VycmVkIGFuZCB3aGVuCiAgIC8vIHRoZSBzeXN0ZW0gaXMgb3V0IG9mIHJlc291cmNlcyAoYW4gYXdlc29tZSB1bmRvY3VtZW50ZWQgZmVhdHVyZSkuCiAgIC8vIFRoZSBmb2xsb3dpbmcgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgdGltZSBpbnRlcnZhbCB1bmRlciB3aGljaAotICAvLyBFQUdBSU4gaXMgdGFrZW4gdG8gaW5kaWNhdGUgYW4gb3V0IG9mIHJlc291cmNlcyBlcnJvci4KKyAgLy8gVEhSSUZUX0VBR0FJTiBpcyB0YWtlbiB0byBpbmRpY2F0ZSBhbiBvdXQgb2YgcmVzb3VyY2VzIGVycm9yLgogICB1aW50MzJfdCBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAwOwogICBpZiAocmVjdlRpbWVvdXRfKSB7CiAgICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCiAgICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCiAgICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKLSAgICBlYWdhaW5UaHJlc2hvbGRNaWNyb3MgPSAocmVjdlRpbWVvdXRfKjEwMDApLyAoKG1heFJlY3ZSZXRyaWVzXz4wKSA/IG1heFJlY3ZSZXRyaWVzXyA6IDIpOworICAgIGVhZ2FpblRocmVzaG9sZE1pY3JvcyA9IChyZWN2VGltZW91dF8gKiAxMDAwKSAvICgobWF4UmVjdlJldHJpZXNfID4gMCkgPyBtYXhSZWN2UmV0cmllc18gOiAyKTsKICAgfQogCi0gdHJ5X2FnYWluOgordHJ5X2FnYWluOgogICAvLyBSZWFkIGZyb20gdGhlIHNvY2tldAogICBzdHJ1Y3QgdGltZXZhbCBiZWdpbjsKICAgaWYgKHJlY3ZUaW1lb3V0XyA+IDApIHsKLSAgICBnZXR0aW1lb2ZkYXkoJmJlZ2luLCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZiZWdpbiwgTlVMTCk7CiAgIH0gZWxzZSB7CiAgICAgLy8gaWYgdGhlcmUgaXMgbm8gcmVhZCB0aW1lb3V0IHdlIGRvbid0IG5lZWQgdGhlIFRPRCB0byBkZXRlcm1pbmUgd2hldGhlcgotICAgIC8vIGFuIEVBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCisgICAgLy8gYW4gVEhSSUZUX0VBR0FJTiBpcyBkdWUgdG8gYSB0aW1lb3V0IG9yIGFuIG91dC1vZi1yZXNvdXJjZSBjb25kaXRpb24uCiAgICAgYmVnaW4udHZfc2VjID0gYmVnaW4udHZfdXNlYyA9IDA7CiAgIH0KLSAgaW50IGdvdCA9IHJlY3Yoc29ja2V0XywgY2FzdF9zb2Nrb3B0KGJ1ZiksIGxlbiwgMCk7Ci0gIGludCBlcnJub19jb3B5ID0gZXJybm87IC8vZ2V0dGltZW9mZGF5IGNhbiBjaGFuZ2UgZXJybm8KLSAgKytnX3NvY2tldF9zeXNjYWxsczsKKworICBpbnQgZ290ID0gMDsKKworICBpZiAoaW50ZXJydXB0TGlzdGVuZXJfKSB7CisgICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOworICAgIHN0ZDo6bWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOworICAgIGZkc1swXS5mZCA9IHNvY2tldF87CisgICAgZmRzWzBdLmV2ZW50cyA9IFRIUklGVF9QT0xMSU47CisgICAgZmRzWzFdLmZkID0gKihpbnRlcnJ1cHRMaXN0ZW5lcl8uZ2V0KCkpOworICAgIGZkc1sxXS5ldmVudHMgPSBUSFJJRlRfUE9MTElOOworCisgICAgaW50IHJldCA9IFRIUklGVF9QT0xMKGZkcywgMiwgKHJlY3ZUaW1lb3V0XyA9PSAwKSA/IC0xIDogcmVjdlRpbWVvdXRfKTsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAvLyBlcnJvciBjYXNlcworICAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgfQorICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIFRIUklGVF9QT0xMKCkgIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CisgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAvLyBDaGVjayB0aGUgaW50ZXJydXB0TGlzdGVuZXIKKyAgICAgIGlmIChmZHNbMV0ucmV2ZW50cyAmIFRIUklGVF9QT0xMSU4pIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgIkludGVycnVwdGVkIik7CisgICAgICB9CisgICAgfSBlbHNlIC8qIHJldCA9PSAwICovIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VBR0FJTiAodGltZWQgb3V0KSIpOworICAgIH0KKworICAgIC8vIGZhbGxpbmcgdGhyb3VnaCBtZWFucyB0aGVyZSBpcyBzb21ldGhpbmcgdG8gcmVjdiBhbmQgaXQgY2Fubm90IGJsb2NrCisgIH0KKworICBnb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3Yoc29ja2V0XywgY2FzdF9zb2Nrb3B0KGJ1ZiksIGxlbiwgMCkpOworICAvLyBUSFJJRlRfR0VUVElNRU9GREFZIGNhbiBjaGFuZ2UgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IKKyAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKIAogICAvLyBDaGVjayBmb3IgZXJyb3Igb24gcmVhZAogICBpZiAoZ290IDwgMCkgewotICAgIGlmIChlcnJub19jb3B5ID09IEVBR0FJTikgeworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQUdBSU4pIHsKICAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgogICAgICAgaWYgKHJlY3ZUaW1lb3V0XyA9PSAwKSB7CiAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUSFJJRlRfRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7CiAgICAgICB9CiAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYWNrIG9mIHJlc291cmNlcyBvciB0aW1lb3V0IGNhc2UKICAgICAgIHN0cnVjdCB0aW1ldmFsIGVuZDsKLSAgICAgIGdldHRpbWVvZmRheSgmZW5kLCBOVUxMKTsKLSAgICAgIHVpbnQzMl90IHJlYWRFbGFwc2VkTWljcm9zID0gICgoKGVuZC50dl9zZWMgLSBiZWdpbi50dl9zZWMpICogMTAwMCAqIDEwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKCh1aW50NjRfdCkoZW5kLnR2X3VzZWMgLSBiZWdpbi50dl91c2VjKSkpKTsKKyAgICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmVuZCwgTlVMTCk7CisgICAgICB1aW50MzJfdCByZWFkRWxhcHNlZE1pY3JvcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigoKGVuZC50dl9zZWMgLSBiZWdpbi50dl9zZWMpICogMTAwMCAqIDEwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChlbmQudHZfdXNlYyAtIGJlZ2luLnR2X3VzZWMpKTsKIAogICAgICAgaWYgKCFlYWdhaW5UaHJlc2hvbGRNaWNyb3MgfHwgKHJlYWRFbGFwc2VkTWljcm9zIDwgZWFnYWluVGhyZXNob2xkTWljcm9zKSkgewogICAgICAgICBpZiAocmV0cmllcysrIDwgbWF4UmVjdlJldHJpZXNfKSB7Ci0gICAgICAgICAgdXNsZWVwKDUwKTsKKyAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyg1MCk7CiAgICAgICAgICAgZ290byB0cnlfYWdhaW47CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRUFHQUlOICh1bmF2YWlsYWJsZSByZXNvdXJjZXMpIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0VBR0FJTiAodW5hdmFpbGFibGUgcmVzb3VyY2VzKSIpOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0Ci0gICAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFQUdBSU4gKHRpbWVkIG91dCkiKTsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQsICJUSFJJRlRfRUFHQUlOICh0aW1lZCBvdXQpIik7CiAgICAgICB9CiAgICAgfQogCiAgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgotICAgIGlmIChlcnJub19jb3B5ID09IEVJTlRSICYmIHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUiAmJiByZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pIHsKICAgICAgIGdvdG8gdHJ5X2FnYWluOwogICAgIH0KIAotICAgICNpZiBkZWZpbmVkIF9fRnJlZUJTRF9fIHx8IGRlZmluZWQgX19NQUNIX18KLSAgICBpZiAoZXJybm9fY29weSA9PSBFQ09OTlJFU0VUKSB7Ci0gICAgICAvKiBzaGlnaW46IGZyZWVic2QgZG9lc24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdiBhbmQgZmFpbHMgd2l0aAotICAgICAgICogRUNPTk5SRVNFVCBpZiBwZWVyIHBlcmZvcm1lZCBzaHV0ZG93bgotICAgICAgICogZWRoYWxsOiBlbGltaW5hdGVkIGNsb3NlKCkgc2luY2Ugd2UgZG8gdGhhdCBpbiB0aGUgZGVzdHJ1Y3Rvci4KLSAgICAgICAqLworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgI2VuZGlmCi0KLSNpZmRlZiBfV0lOMzIKLSAgICBpZihlcnJub19jb3B5ID09IFdTQUVDT05OUkVTRVQpIHsKLSAgICAgIHJldHVybiAwOyAvLyBFT0YKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6Ci0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKLQotICAgIC8vIElmIHdlIGRpc2Nvbm5lY3Qgd2l0aCBubyBsaW5nZXIgdGltZQotICAgIGlmIChlcnJub19jb3B5ID09IEVDT05OUkVTRVQpIHsKLSAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJFQ09OTlJFU0VUIik7Ci0gICAgfQogCiAgICAgLy8gVGhpcyBpc2ggaXNuJ3Qgb3BlbgotICAgIGlmIChlcnJub19jb3B5ID09IEVOT1RDT05OKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiRU5PVENPTk4iKTsKKyAgICBpZiAoZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJUSFJJRlRfRU5PVENPTk4iKTsKICAgICB9CiAKICAgICAvLyBUaW1lZCBvdXQhCi0gICAgaWYgKGVycm5vX2NvcHkgPT0gRVRJTUVET1VUKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgIkVUSU1FRE9VVCIpOworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FVElNRURPVVQpIHsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VULCAiVEhSSUZUX0VUSU1FRE9VVCIpOwogICAgIH0KIAorICAgIC8vIE5vdyBpdCdzIG5vdCBhIHRyeSBhZ2FpbiBjYXNlLCBidXQgYSByZWFsIHByb2JibGV6CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6cmVhZCgpIHJlY3YoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKKwogICAgIC8vIFNvbWUgb3RoZXIgZXJyb3IsIHdoYXRldnoKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJVbmtub3duIiwgZXJybm9fY29weSk7CiAgIH0KIAotICAvLyBUaGUgcmVtb3RlIGhvc3QgaGFzIGNsb3NlZCB0aGUgc29ja2V0Ci0gIGlmIChnb3QgPT0gMCkgewotICAgIC8vIGVkaGFsbDogd2UgdXNlZCB0byBjYWxsIGNsb3NlKCkgaGVyZSwgYnV0IG91ciBjYWxsZXIgbWF5IHdhbnQgdG8gZGVhbAotICAgIC8vIHdpdGggdGhlIHNvY2tldCBmZCBhbmQgd2UnbGwgY2xvc2UoKSBpbiBvdXIgZGVzdHJ1Y3RvciBpbiBhbnkgY2FzZS4KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFBhY2sgZGF0YSBpbnRvIHN0cmluZwogICByZXR1cm4gZ290OwogfQogCkBAIC01NDMsMTUgKzY0NywxNCBAQAogICAgIGlmIChiID09IDApIHsKICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0aW1lb3V0IHNldCB3aXRoIFNPX1NORFRJTUVPIGV4cGlyZWQuCiAgICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24uCi0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbmQgdGltZW91dCBleHBpcmVkIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgInNlbmQgdGltZW91dCBleHBpcmVkIik7CiAgICAgfQogICAgIHNlbnQgKz0gYjsKICAgfQogfQogCiB1aW50MzJfdCBUU29ja2V0Ojp3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGlmIChzb2NrZXRfID09IC0xKSB7CisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gc29ja2V0Iik7CiAgIH0KIApAQCAtNTYwLDIzICs2NjMsMjIgQEAKICAgaW50IGZsYWdzID0gMDsKICNpZmRlZiBNU0dfTk9TSUdOQUwKICAgLy8gTm90ZSB0aGUgdXNlIG9mIE1TR19OT1NJR05BTCB0byBzdXBwcmVzcyBTSUdQSVBFIGVycm9ycywgaW5zdGVhZCB3ZQotICAvLyBjaGVjayBmb3IgdGhlIEVQSVBFIHJldHVybiBjb25kaXRpb24gYW5kIGNsb3NlIHRoZSBzb2NrZXQgaW4gdGhhdCBjYXNlCisgIC8vIGNoZWNrIGZvciB0aGUgVEhSSUZUX0VQSVBFIHJldHVybiBjb25kaXRpb24gYW5kIGNsb3NlIHRoZSBzb2NrZXQgaW4gdGhhdCBjYXNlCiAgIGZsYWdzIHw9IE1TR19OT1NJR05BTDsKICNlbmRpZiAvLyBpZmRlZiBNU0dfTk9TSUdOQUwKIAotICBpbnQgYiA9IHNlbmQoc29ja2V0XywgY29uc3RfY2FzdF9zb2Nrb3B0KGJ1ZiArIHNlbnQpLCBsZW4gLSBzZW50LCBmbGFncyk7Ci0gICsrZ19zb2NrZXRfc3lzY2FsbHM7CisgIGludCBiID0gc3RhdGljX2Nhc3Q8aW50PihzZW5kKHNvY2tldF8sIGNvbnN0X2Nhc3Rfc29ja29wdChidWYgKyBzZW50KSwgbGVuIC0gc2VudCwgZmxhZ3MpKTsKIAogICBpZiAoYiA8IDApIHsKLSAgICBpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0sgfHwgZXJybm8gPT0gRUFHQUlOKSB7CisgICAgaWYgKFRIUklGVF9HRVRfU09DS0VUX0VSUk9SID09IFRIUklGVF9FV09VTERCTE9DSyB8fCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA9PSBUSFJJRlRfRUFHQUlOKSB7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgLy8gRmFpbCBvbiBhIHNlbmQgZXJyb3IKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6d3JpdGVfcGFydGlhbCgpIHNlbmQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKIAotICAgIGlmIChlcnJub19jb3B5ID09IEVQSVBFIHx8IGVycm5vX2NvcHkgPT0gRUNPTk5SRVNFVCB8fCBlcnJub19jb3B5ID09IEVOT1RDT05OKSB7Ci0gICAgICBjbG9zZSgpOworICAgIGlmIChlcnJub19jb3B5ID09IFRIUklGVF9FUElQRSB8fCBlcnJub19jb3B5ID09IFRIUklGVF9FQ09OTlJFU0VUCisgICAgICAgIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VOT1RDT05OKSB7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKICAgICB9CiAKQEAgLTYwOSwyMSArNzExLDI3IEBACiB2b2lkIFRTb2NrZXQ6OnNldExpbmdlcihib29sIG9uLCBpbnQgbGluZ2VyKSB7CiAgIGxpbmdlck9uXyA9IG9uOwogICBsaW5nZXJWYWxfID0gbGluZ2VyOwotICBpZiAoc29ja2V0XyA9PSAtMSkgeworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICByZXR1cm47CiAgIH0KIAorI2lmbmRlZiBfV0lOMzIKICAgc3RydWN0IGxpbmdlciBsID0geyhsaW5nZXJPbl8gPyAxIDogMCksIGxpbmdlclZhbF99OworI2Vsc2UKKyAgc3RydWN0IGxpbmdlciBsID0ge3N0YXRpY19jYXN0PHVfc2hvcnQ+KGxpbmdlck9uXyA/IDEgOiAwKSwgc3RhdGljX2Nhc3Q8dV9zaG9ydD4obGluZ2VyVmFsXyl9OworI2VuZGlmCisKICAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmwpLCBzaXplb2YobCkpOwogICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0TGluZ2VyKCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOwogICB9CiB9CiAKIHZvaWQgVFNvY2tldDo6c2V0Tm9EZWxheShib29sIG5vRGVsYXkpIHsKICAgbm9EZWxheV8gPSBub0RlbGF5OwotICBpZiAoc29ja2V0XyA9PSAtMSB8fCAhcGF0aF8uZW1wdHkoKSkgeworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgfHwgIXBhdGhfLmVtcHR5KCkpIHsKICAgICByZXR1cm47CiAgIH0KIApAQCAtNjMxLDcgKzczOSw4IEBACiAgIGludCB2ID0gbm9EZWxheV8gPyAxIDogMDsKICAgaW50IHJldCA9IHNldHNvY2tvcHQoc29ja2V0XywgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBjYXN0X3NvY2tvcHQoJnYpLCBzaXplb2YodikpOwogICBpZiAocmV0ID09IC0xKSB7Ci0gICAgaW50IGVycm5vX2NvcHkgPSBlcnJubzsgIC8vIENvcHkgZXJybm8gYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBpbnQgZXJybm9fY29weQorICAgICAgICA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOyAvLyBDb3B5IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0Tm9EZWxheSgpIHNldHNvY2tvcHQoKSAiICsgZ2V0U29ja2V0SW5mbygpLCBlcnJub19jb3B5KTsKICAgfQogfQpAQCAtNjQwLDUwICs3NDksNTcgQEAKICAgY29ublRpbWVvdXRfID0gbXM7CiB9CiAKLXZvaWQgVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IG1zKSB7Ci0gIGlmIChtcyA8IDApIHsKK3ZvaWQgc2V0R2VuZXJpY1RpbWVvdXQoVEhSSUZUX1NPQ0tFVCBzLCBpbnQgdGltZW91dF9tcywgaW50IG9wdG5hbWUpIHsKKyAgaWYgKHRpbWVvdXRfbXMgPCAwKSB7CiAgICAgY2hhciBlcnJCdWZbNTEyXTsKLSAgICBzcHJpbnRmKGVyckJ1ZiwgIlRTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0IHdpdGggbmVnYXRpdmUgaW5wdXQ6ICVkXG4iLCBtcyk7CisgICAgc3ByaW50ZihlcnJCdWYsICJUU29ja2V0OjpzZXRHZW5lcmljVGltZW91dCB3aXRoIG5lZ2F0aXZlIGlucHV0OiAlZFxuIiwgdGltZW91dF9tcyk7CiAgICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7CiAgICAgcmV0dXJuOwogICB9Ci0gIHJlY3ZUaW1lb3V0XyA9IG1zOwogCi0gIGlmIChzb2NrZXRfID09IC0xKSB7CisgIGlmIChzID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHJldHVybjsKICAgfQogCi0gIHJlY3ZUaW1ldmFsXy50dl9zZWMgPSAoaW50KShyZWN2VGltZW91dF8vMTAwMCk7Ci0gIHJlY3ZUaW1ldmFsXy50dl91c2VjID0gKGludCkoKHJlY3ZUaW1lb3V0XyUxMDAwKSoxMDAwKTsKKyNpZmRlZiBfV0lOMzIKKyAgRFdPUkQgcGxhdGZvcm1fdGltZSA9IHN0YXRpY19jYXN0PERXT1JEPih0aW1lb3V0X21zKTsKKyNlbHNlCisgIHN0cnVjdCB0aW1ldmFsIHBsYXRmb3JtX3RpbWUgPSB7KGludCkodGltZW91dF9tcyAvIDEwMDApLCAoaW50KSgodGltZW91dF9tcyAlIDEwMDApICogMTAwMCl9OworI2VuZGlmCiAKLSAgLy8gQ29weSBiZWNhdXNlIHBvbGwgbWF5IG1vZGlmeQotICBzdHJ1Y3QgdGltZXZhbCByID0gcmVjdlRpbWV2YWxfOwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgY2FzdF9zb2Nrb3B0KCZyKSwgc2l6ZW9mKHIpKTsKKyAgaW50IHJldCA9IHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgb3B0bmFtZSwgY2FzdF9zb2Nrb3B0KCZwbGF0Zm9ybV90aW1lKSwgc2l6ZW9mKHBsYXRmb3JtX3RpbWUpKTsKICAgaWYgKHJldCA9PSAtMSkgewotICAgIGludCBlcnJub19jb3B5ID0gZXJybm87ICAvLyBDb3B5IGVycm5vIGJlY2F1c2Ugd2UncmUgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgaW50IGVycm5vX2NvcHkKKyAgICAgICAgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsgLy8gQ29weSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldEdlbmVyaWNUaW1lb3V0KCkgc2V0c29ja29wdCgpICIsIGVycm5vX2NvcHkpOwogICB9CiB9CiAKK3ZvaWQgVFNvY2tldDo6c2V0UmVjdlRpbWVvdXQoaW50IG1zKSB7CisgIHNldEdlbmVyaWNUaW1lb3V0KHNvY2tldF8sIG1zLCBTT19SQ1ZUSU1FTyk7CisgIHJlY3ZUaW1lb3V0XyA9IG1zOworfQorCiB2b2lkIFRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBtcykgewotICBpZiAobXMgPCAwKSB7Ci0gICAgY2hhciBlcnJCdWZbNTEyXTsKLSAgICBzcHJpbnRmKGVyckJ1ZiwgIlRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0IHdpdGggbmVnYXRpdmUgaW5wdXQ6ICVkXG4iLCBtcyk7Ci0gICAgR2xvYmFsT3V0cHV0KGVyckJ1Zik7Ci0gICAgcmV0dXJuOwotICB9CisgIHNldEdlbmVyaWNUaW1lb3V0KHNvY2tldF8sIG1zLCBTT19TTkRUSU1FTyk7CiAgIHNlbmRUaW1lb3V0XyA9IG1zOworfQogCi0gIGlmIChzb2NrZXRfID09IC0xKSB7Cit2b2lkIFRTb2NrZXQ6OnNldEtlZXBBbGl2ZShib29sIGtlZXBBbGl2ZSkgeworICBrZWVwQWxpdmVfID0ga2VlcEFsaXZlOworCisgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHJldHVybjsKICAgfQogCi0gIHN0cnVjdCB0aW1ldmFsIHMgPSB7KGludCkoc2VuZFRpbWVvdXRfLzEwMDApLAotICAgICAgICAgICAgICAgICAgICAgIChpbnQpKChzZW5kVGltZW91dF8lMTAwMCkqMTAwMCl9OwotICBpbnQgcmV0ID0gc2V0c29ja29wdChzb2NrZXRfLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgY2FzdF9zb2Nrb3B0KCZzKSwgc2l6ZW9mKHMpKTsKKyAgaW50IHZhbHVlID0ga2VlcEFsaXZlXzsKKyAgaW50IHJldAorICAgICAgPSBzZXRzb2Nrb3B0KHNvY2tldF8sIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZ2YWx1ZSksIHNpemVvZih2YWx1ZSkpOworCiAgIGlmIChyZXQgPT0gLTEpIHsKLSAgICBpbnQgZXJybm9fY29weSA9IGVycm5vOyAgLy8gQ29weSBlcnJubyBiZWNhdXNlIHdlJ3JlIGFsbG9jYXRpbmcgbWVtb3J5LgotICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KCkgc2V0c29ja29wdCgpICIgKyBnZXRTb2NrZXRJbmZvKCksIGVycm5vX2NvcHkpOworICAgIGludCBlcnJub19jb3B5CisgICAgICAgID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7IC8vIENvcHkgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgYmVjYXVzZSB3ZSdyZSBhbGxvY2F0aW5nIG1lbW9yeS4KKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpzZXRLZWVwQWxpdmUoKSBzZXRzb2Nrb3B0KCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CiAgIH0KIH0KIApAQCAtNjkzLDExICs4MDksMTUgQEAKIAogc3RyaW5nIFRTb2NrZXQ6OmdldFNvY2tldEluZm8oKSB7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0gIGlmIChob3N0Xy5lbXB0eSgpIHx8IHBvcnRfID09IDApIHsKLSAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGdldFBlZXJBZGRyZXNzKCk7Ci0gICAgb3NzIDw8ICIgUG9ydDogIiA8PCBnZXRQZWVyUG9ydCgpIDw8ICI+IjsKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpZiAoaG9zdF8uZW1wdHkoKSB8fCBwb3J0XyA9PSAwKSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGdldFBlZXJBZGRyZXNzKCk7CisgICAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGhvc3RfIDw8ICIgUG9ydDogIiA8PCBwb3J0XyA8PCAiPiI7CisgICAgfQogICB9IGVsc2UgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKKyAgICBvc3MgPDwgIjxQYXRoOiAiIDw8IHBhdGhfIDw8ICI+IjsKICAgfQogICByZXR1cm4gb3NzLnN0cigpOwogfQpAQCAtNzA4LDcgKzgyOCw3IEBACiAgICAgc3RydWN0IHNvY2thZGRyKiBhZGRyUHRyOwogICAgIHNvY2tsZW5fdCBhZGRyTGVuOwogCi0gICAgaWYgKHNvY2tldF8gPT0gLTEpIHsKKyAgICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICAgIHJldHVybiBob3N0XzsKICAgICB9CiAKQEAgLTcxNiw3ICs4MzYsNyBAQAogCiAgICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgewogICAgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKLSAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSAmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKKyAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSZhZGRyLCAmYWRkckxlbikgIT0gMCkgewogICAgICAgICByZXR1cm4gcGVlckhvc3RfOwogICAgICAgfQogICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7CkBAIC03MjcsOSArODQ3LDEzIEBACiAgICAgY2hhciBjbGllbnRob3N0W05JX01BWEhPU1RdOwogICAgIGNoYXIgY2xpZW50c2VydmljZVtOSV9NQVhTRVJWXTsKIAotICAgIGdldG5hbWVpbmZvKChzb2NrYWRkciopIGFkZHJQdHIsIGFkZHJMZW4sCi0gICAgICAgICAgICAgICAgY2xpZW50aG9zdCwgc2l6ZW9mKGNsaWVudGhvc3QpLAotICAgICAgICAgICAgICAgIGNsaWVudHNlcnZpY2UsIHNpemVvZihjbGllbnRzZXJ2aWNlKSwgMCk7CisgICAgZ2V0bmFtZWluZm8oKHNvY2thZGRyKilhZGRyUHRyLAorICAgICAgICAgICAgICAgIGFkZHJMZW4sCisgICAgICAgICAgICAgICAgY2xpZW50aG9zdCwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50aG9zdCksCisgICAgICAgICAgICAgICAgY2xpZW50c2VydmljZSwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2xpZW50c2VydmljZSksCisgICAgICAgICAgICAgICAgMCk7CiAKICAgICBwZWVySG9zdF8gPSBjbGllbnRob3N0OwogICB9CkBAIC03NDIsNyArODY2LDcgQEAKICAgICBzdHJ1Y3Qgc29ja2FkZHIqIGFkZHJQdHI7CiAgICAgc29ja2xlbl90IGFkZHJMZW47CiAKLSAgICBpZiAoc29ja2V0XyA9PSAtMSkgeworICAgIGlmIChzb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgICAgcmV0dXJuIHBlZXJBZGRyZXNzXzsKICAgICB9CiAKQEAgLTc1MCw3ICs4NzQsNyBAQAogCiAgICAgaWYgKGFkZHJQdHIgPT0gTlVMTCkgewogICAgICAgYWRkckxlbiA9IHNpemVvZihhZGRyKTsKLSAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSAmYWRkciwgJmFkZHJMZW4pICE9IDApIHsKKyAgICAgIGlmIChnZXRwZWVybmFtZShzb2NrZXRfLCAoc29ja2FkZHIqKSZhZGRyLCAmYWRkckxlbikgIT0gMCkgewogICAgICAgICByZXR1cm4gcGVlckFkZHJlc3NfOwogICAgICAgfQogICAgICAgYWRkclB0ciA9IChzb2NrYWRkciopJmFkZHI7CkBAIC03NjEsMTAgKzg4NSwxMyBAQAogICAgIGNoYXIgY2xpZW50aG9zdFtOSV9NQVhIT1NUXTsKICAgICBjaGFyIGNsaWVudHNlcnZpY2VbTklfTUFYU0VSVl07CiAKLSAgICBnZXRuYW1laW5mbyhhZGRyUHRyLCBhZGRyTGVuLAotICAgICAgICAgICAgICAgIGNsaWVudGhvc3QsIHNpemVvZihjbGllbnRob3N0KSwKLSAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLCBzaXplb2YoY2xpZW50c2VydmljZSksCi0gICAgICAgICAgICAgICAgTklfTlVNRVJJQ0hPU1R8TklfTlVNRVJJQ1NFUlYpOworICAgIGdldG5hbWVpbmZvKGFkZHJQdHIsCisgICAgICAgICAgICAgICAgYWRkckxlbiwKKyAgICAgICAgICAgICAgICBjbGllbnRob3N0LAorICAgICAgICAgICAgICAgIHNpemVvZihjbGllbnRob3N0KSwKKyAgICAgICAgICAgICAgICBjbGllbnRzZXJ2aWNlLAorICAgICAgICAgICAgICAgIHNpemVvZihjbGllbnRzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVCB8IE5JX05VTUVSSUNTRVJWKTsKIAogICAgIHBlZXJBZGRyZXNzXyA9IGNsaWVudGhvc3Q7CiAgICAgcGVlclBvcnRfID0gc3RkOjphdG9pKGNsaWVudHNlcnZpY2UpOwpAQCAtNzk1LDE3ICs5MjIsMTkgQEAKICAgICB9CiAgICAgYnJlYWs7CiAgIH0KKyAgcGVlckFkZHJlc3NfLmNsZWFyKCk7CisgIHBlZXJIb3N0Xy5jbGVhcigpOwogfQogCiBzb2NrYWRkciogVFNvY2tldDo6Z2V0Q2FjaGVkQWRkcmVzcyhzb2NrbGVuX3QqIGxlbikgY29uc3QgewogICBzd2l0Y2ggKGNhY2hlZFBlZXJBZGRyXy5pcHY0LnNpbl9mYW1pbHkpIHsKICAgY2FzZSBBRl9JTkVUOgogICAgICpsZW4gPSBzaXplb2Yoc29ja2FkZHJfaW4pOwotICAgIHJldHVybiAoc29ja2FkZHIqKSAmY2FjaGVkUGVlckFkZHJfLmlwdjQ7CisgICAgcmV0dXJuIChzb2NrYWRkciopJmNhY2hlZFBlZXJBZGRyXy5pcHY0OwogCiAgIGNhc2UgQUZfSU5FVDY6CiAgICAgKmxlbiA9IHNpemVvZihzb2NrYWRkcl9pbjYpOwotICAgIHJldHVybiAoc29ja2FkZHIqKSAmY2FjaGVkUGVlckFkZHJfLmlwdjY7CisgICAgcmV0dXJuIChzb2NrYWRkciopJmNhY2hlZFBlZXJBZGRyXy5pcHY2OwogCiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIE5VTEw7CkBAIC04MjAsNCArOTQ5LDExIEBACiAgIHJldHVybiB1c2VMb3dNaW5SdG9fOwogfQogCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorY29uc3Qgc3RkOjpzdHJpbmcgVFNvY2tldDo6Z2V0T3JpZ2luKCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICBvc3MgPDwgZ2V0UGVlckhvc3QoKSA8PCAiOiIgPDwgZ2V0UGVlclBvcnQoKTsKKyAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaAppbmRleCBlY2Y2ZDc5Li40MDMwZDQ2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaApAQCAtMjIsMjggKzIyLDMxIEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKLSNpbmNsdWRlICJUVHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAiVFZpcnR1YWxUcmFuc3BvcnQuaCIKLSNpbmNsdWRlICJUU2VydmVyU29ja2V0LmgiCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KIAorI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNlbmRpZgogI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZW5kaWYKICNpZmRlZiBIQVZFX05FVERCX0gKICNpbmNsdWRlIDxuZXRkYi5oPgogI2VuZGlmCi0jaWZuZGVmIF9XSU4zMgotICAgdHlwZWRlZiBpbnQgU09DS0VUOwotI2VuZGlmCiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogVENQIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCiAgKgogICovCiBjbGFzcyBUU29ja2V0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRTb2NrZXQ+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKICAgICogc29ja2V0LgpAQCAtNTgsNyArNjEsNyBAQAogICAgKiBAcGFyYW0gaG9zdCBBbiBJUCBhZGRyZXNzIG9yIGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8KICAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCBvbgogICAgKi8KLSAgVFNvY2tldChzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CisgIFRTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKIAogICAvKioKICAgICogQ29uc3RydWN0cyBhIG5ldyBVbml4IGRvbWFpbiBzb2NrZXQuCkBAIC02Niw3ICs2OSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBwYXRoIFRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZS5nLiAiL3RtcC9UaHJpZnRUZXN0LmJpbmFyeS50aHJpZnQiCiAgICAqLwotICBUU29ja2V0KHN0ZDo6c3RyaW5nIHBhdGgpOworICBUU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAogICAvKioKICAgICogRGVzdHJveWVzIHRoZSBzb2NrZXQgb2JqZWN0LCBjbG9zaW5nIGl0IGlmIG5lY2Vzc2FyeS4KQEAgLTgxLDcgKzg0LDkgQEAKICAgdmlydHVhbCBib29sIGlzT3BlbigpOwogCiAgIC8qKgotICAgKiBDYWxscyBzZWxlY3Qgb24gdGhlIHNvY2tldCB0byBzZWUgaWYgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZS4KKyAgICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgaXMgbW9yZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgc29ja2V0IHRvIHJlYWQuCisgICAqCisgICAqIFRoaXMgY2FsbCBibG9ja3MgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgYXZhaWxhYmxlIG9yIHRoZSBzb2NrZXQgaXMgY2xvc2VkLgogICAgKi8KICAgdmlydHVhbCBib29sIHBlZWsoKTsKIApAQCAtOTgsNyArMTAzLDI1IEBACiAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOwogCiAgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQgb3Igbm90LgorICAgKgorICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgYmxvY2suCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIE5PVF9PUEVOIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAqICAgICAgICAgICBVTktOT1dOIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAqIFxyZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBib29sIGhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7CisKKyAgLyoqCiAgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpbmRpY2F0ZXMgRU9GCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIElOVEVSUlVQVEVEIG1lYW5zIHRoZSBzb2NrZXQgd2FzIGludGVycnVwdGVkCisgICAqICAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgYSBibG9ja2luZyBjYWxsCisgICAqICAgICAgICAgICBOT1RfT1BFTiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgKiAgICAgICAgICAgVElNRURfT1VUIG1lYW5zIHRoZSByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZAorICAgKiAgICAgICAgICAgVU5LTk9XTiBtZWFucyBzb21ldGhpbmcgdW5leHBlY3RlZCBoYXBwZW5lZAogICAgKi8KICAgdmlydHVhbCB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIApAQCAtMTEwLDcgKzEzMyw3IEBACiAgIC8qKgogICAgKiBXcml0ZXMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LiAgRG9lcyBzaW5nbGUgc2VuZCgpIGFuZCByZXR1cm5zIHJlc3VsdC4KICAgICovCi0gIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB2aXJ0dWFsIHVpbnQzMl90IHdyaXRlX3BhcnRpYWwoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOwogCiAgIC8qKgogICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwpAQCAtMTcyLDEzICsxOTUsMTggQEAKICAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgbXMpOwogCiAgIC8qKgotICAgKiBTZXQgdGhlIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzIGluIGNhc2Ugb2YgYW4gRUFHQUlOCisgICAqIFNldCB0aGUgbWF4IG51bWJlciBvZiByZWN2IHJldHJpZXMgaW4gY2FzZSBvZiBhbiBUSFJJRlRfRUFHQUlOCiAgICAqIGVycm9yCiAgICAqLwogICB2b2lkIHNldE1heFJlY3ZSZXRyaWVzKGludCBtYXhSZWN2UmV0cmllcyk7CiAKICAgLyoqCi0gICAqIEdldCBzb2NrZXQgaW5mb3JtYXRpb24gZm9ybWF0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICogU2V0IFNPX0tFRVBBTElWRQorICAgKi8KKyAgdm9pZCBzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpOworCisgIC8qKgorICAgKiBHZXQgc29ja2V0IGluZm9ybWF0aW9uIGZvcm1hdHRlZCBhcyBhIHN0cmluZyA8SG9zdDogeCBQb3J0OiB4PgogICAgKi8KICAgc3RkOjpzdHJpbmcgZ2V0U29ja2V0SW5mbygpOwogCkBAIC0yMDAsOSArMjI4LDcgQEAKICAgLyoqCiAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgc29ja2V0IGZpbGUgZGVzY3JpcHRvci4KICAgICovCi0gIFNPQ0tFVCBnZXRTb2NrZXRGRCgpIHsKLSAgICByZXR1cm4gc29ja2V0XzsKLSAgfQorICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc29ja2V0XzsgfQogCiAgIC8qKgogICAgKiAoUmUtKWluaXRpYWxpemUgYSBUU29ja2V0IGZvciB0aGUgc3VwcGxpZWQgZGVzY3JpcHRvci4gIFRoaXMgaXMgb25seQpAQCAtMjExLDcgKzIzNyw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBmZCB0aGUgZGVzY3JpcHRvciBmb3IgYW4gYWxyZWFkeS1jb25uZWN0ZWQgc29ja2V0CiAgICAqLwotICB2b2lkIHNldFNvY2tldEZEKGludCBmZCk7CisgIHZvaWQgc2V0U29ja2V0RkQoVEhSSUZUX1NPQ0tFVCBmZCk7CiAKICAgLyoKICAgICogUmV0dXJucyBhIGNhY2hlZCBjb3B5IG9mIHRoZSBwZWVyIGFkZHJlc3MuCkBAIC0yMjksOSArMjU1LDIyIEBACiAgIHN0YXRpYyBib29sIGdldFVzZUxvd01pblJ0bygpOwogCiAgIC8qKgotICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gcmF3IFVOSVggaGFuZGxlLgorICAgKiBHZXQgdGhlIG9yaWdpbiB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgKgorICAgKiBAcmV0dXJuIHN0cmluZyBwZWVyIGhvc3QgaWRlbnRpZmllciBhbmQgcG9ydAogICAgKi8KLSAgVFNvY2tldChTT0NLRVQgc29ja2V0KTsKKyAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRPcmlnaW4oKTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIHNvY2tldCBmcm9tIGZpbGUgZGVzY3JpcHRvci4KKyAgICovCisgIFRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yIHRoYXQKKyAgICogY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KKyAgICovCisgIFRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAKICAgLyoqCiAgICAqIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCkBAIC0yMzksMTMgKzI3OCwyMiBAQAogICAgKi8KICAgdm9pZCBzZXRDYWNoZWRBZGRyZXNzKGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgbGVuKTsKIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgLyoqIGNvbm5lY3QsIGNhbGxlZCBieSBvcGVuICovCi0gIHZvaWQgb3BlbkNvbm5lY3Rpb24oc3RydWN0IGFkZHJpbmZvICpyZXMpOworICB2b2lkIG9wZW5Db25uZWN0aW9uKHN0cnVjdCBhZGRyaW5mbyogcmVzKTsKIAogICAvKiogSG9zdCB0byBjb25uZWN0IHRvICovCiAgIHN0ZDo6c3RyaW5nIGhvc3RfOwogCisgIC8qKiBQb3J0IG51bWJlciB0byBjb25uZWN0IG9uICovCisgIGludCBwb3J0XzsKKworICAvKiogVU5JWCBkb21haW4gc29ja2V0IHBhdGggKi8KKyAgc3RkOjpzdHJpbmcgcGF0aF87CisKKyAgLyoqIFVuZGVybHlpbmcgc29ja2V0IGhhbmRsZSAqLworICBUSFJJRlRfU09DS0VUIHNvY2tldF87CisKICAgLyoqIFBlZXIgaG9zdG5hbWUgKi8KICAgc3RkOjpzdHJpbmcgcGVlckhvc3RfOwogCkBAIC0yNTUsMTQgKzMwMywxMSBAQAogICAvKiogUGVlciBwb3J0ICovCiAgIGludCBwZWVyUG9ydF87CiAKLSAgLyoqIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3Qgb24gKi8KLSAgaW50IHBvcnRfOwotCi0gIC8qKiBVTklYIGRvbWFpbiBzb2NrZXQgcGF0aCAqLwotICBzdGQ6OnN0cmluZyBwYXRoXzsKLQotICAvKiogVW5kZXJseWluZyBVTklYIHNvY2tldCBoYW5kbGUgKi8KLSAgU09DS0VUIHNvY2tldF87CisgIC8qKgorICAgKiBBIHNoYXJlZCBzb2NrZXQgcG9pbnRlciB0aGF0IHdpbGwgaW50ZXJydXB0IGEgYmxvY2tpbmcgcmVhZCBpZiBkYXRhCisgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9uIGl0CisgICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXJfOwogCiAgIC8qKiBDb25uZWN0IHRpbWVvdXQgaW4gbXMgKi8KICAgaW50IGNvbm5UaW1lb3V0XzsKQEAgLTI3Myw2ICszMTgsOSBAQAogICAvKiogUmVjdiB0aW1lb3V0IGluIG1zICovCiAgIGludCByZWN2VGltZW91dF87CiAKKyAgLyoqIEtlZXAgYWxpdmUgb24gKi8KKyAgYm9vbCBrZWVwQWxpdmVfOworCiAgIC8qKiBMaW5nZXIgb24gKi8KICAgYm9vbCBsaW5nZXJPbl87CiAKQEAgLTI4NSwyNyArMzMzLDIxIEBACiAgIC8qKiBSZWN2IEVHQUlOIHJldHJpZXMgKi8KICAgaW50IG1heFJlY3ZSZXRyaWVzXzsKIAotICAvKiogUmVjdiB0aW1lb3V0IHRpbWV2YWwgKi8KLSAgc3RydWN0IHRpbWV2YWwgcmVjdlRpbWV2YWxfOwotCiAgIC8qKiBDYWNoZWQgcGVlciBhZGRyZXNzICovCiAgIHVuaW9uIHsKICAgICBzb2NrYWRkcl9pbiBpcHY0OwogICAgIHNvY2thZGRyX2luNiBpcHY2OwogICB9IGNhY2hlZFBlZXJBZGRyXzsKIAotICAvKiogQ29ubmVjdGlvbiBzdGFydCB0aW1lICovCi0gIHRpbWVzcGVjIHN0YXJ0VGltZV87Ci0KICAgLyoqIFdoZXRoZXIgdG8gdXNlIGxvdyBtaW5pbXVtIFRDUCByZXRyYW5zbWlzc2lvbiB0aW1lb3V0ICovCiAgIHN0YXRpYyBib29sIHVzZUxvd01pblJ0b187CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdm9pZCB1bml4X29wZW4oKTsKICAgdm9pZCBsb2NhbF9vcGVuKCk7CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRfSF8KLQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAppbmRleCAwMzc2NGMyLi41NDc3YmJiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApAQCAtMTcsNTkgKzE3LDY2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMCisjaW5jbHVkZSA8cmFuZG9tPgorI2VuZGlmCiAKLSNpbmNsdWRlICJUU29ja2V0UG9vbC5oIgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK3VzaW5nIHN0ZDo6cGFpcjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjp2ZWN0b3I7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvKioKICAqIFRTb2NrZXRQb29sU2VydmVyIGltcGxlbWVudGF0aW9uCiAgKgogICovCiBUU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoKQotICA6IGhvc3RfKCIiKSwKLSAgICBwb3J0XygwKSwKLSAgICBzb2NrZXRfKC0xKSwKLSAgICBsYXN0RmFpbFRpbWVfKDApLAotICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHt9CisgIDogaG9zdF8oIiIpLCBwb3J0XygwKSwgc29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLCBsYXN0RmFpbFRpbWVfKDApLCBjb25zZWN1dGl2ZUZhaWx1cmVzXygwKSB7Cit9CiAKIC8qKgogICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgogICovCi1UU29ja2V0UG9vbFNlcnZlcjo6VFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RyaW5nICZob3N0LCBpbnQgcG9ydCkKK1RTb2NrZXRQb29sU2VydmVyOjpUU29ja2V0UG9vbFNlcnZlcihjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KQogICA6IGhvc3RfKGhvc3QpLAogICAgIHBvcnRfKHBvcnQpLAotICAgIHNvY2tldF8oLTEpLAorICAgIHNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKICAgICBsYXN0RmFpbFRpbWVfKDApLAotICAgIGNvbnNlY3V0aXZlRmFpbHVyZXNfKDApIHt9CisgICAgY29uc2VjdXRpdmVGYWlsdXJlc18oMCkgeworfQogCiAvKioKICAqIFRTb2NrZXRQb29sIGltcGxlbWVudGF0aW9uLgogICoKICAqLwogCi1UU29ja2V0UG9vbDo6VFNvY2tldFBvb2woKSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbCgpCisgIDogVFNvY2tldCgpLAorICAgIG51bVJldHJpZXNfKDEpLAorICAgIHJldHJ5SW50ZXJ2YWxfKDYwKSwKKyAgICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKKyAgICByYW5kb21pemVfKHRydWUpLAorICAgIGFsd2F5c1RyeUxhc3RfKHRydWUpIHsKIH0KIAotVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzdHJpbmc+ICZob3N0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50PiAmcG9ydHMpIDogVFNvY2tldCgpLAotICBudW1SZXRyaWVzXygxKSwKLSAgcmV0cnlJbnRlcnZhbF8oNjApLAotICBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXygxKSwKLSAgcmFuZG9taXplXyh0cnVlKSwKLSAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkKLXsKK1RTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8c3RyaW5nPiYgaG9zdHMsIGNvbnN0IHZlY3RvcjxpbnQ+JiBwb3J0cykKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgewogICBpZiAoaG9zdHMuc2l6ZSgpICE9IHBvcnRzLnNpemUoKSkgewogICAgIEdsb2JhbE91dHB1dCgiVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sOiBob3N0cy5zaXplICE9IHBvcnRzLnNpemUiKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKQEAgLTgwLDQxICs4Nyw0MSBAQAogICB9CiB9CiAKLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCB2ZWN0b3I8cGFpcjxzdHJpbmcsIGludD4gPiYgc2VydmVycykgOiBUU29ja2V0KCksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQoteworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxwYWlyPHN0cmluZywgaW50PiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CiAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzZXJ2ZXJzLnNpemUoKTsgKytpKSB7CiAgICAgYWRkU2VydmVyKHNlcnZlcnNbaV0uZmlyc3QsIHNlcnZlcnNbaV0uc2Vjb25kKTsKICAgfQogfQogCi1UU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3QgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSA6IFRTb2NrZXQoKSwKLSAgc2VydmVyc18oc2VydmVycyksCi0gIG51bVJldHJpZXNfKDEpLAotICByZXRyeUludGVydmFsXyg2MCksCi0gIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAotICByYW5kb21pemVfKHRydWUpLAotICBhbHdheXNUcnlMYXN0Xyh0cnVlKQoteworVFNvY2tldFBvb2w6OlRTb2NrZXRQb29sKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKQorICA6IFRTb2NrZXQoKSwKKyAgICBzZXJ2ZXJzXyhzZXJ2ZXJzKSwKKyAgICBudW1SZXRyaWVzXygxKSwKKyAgICByZXRyeUludGVydmFsXyg2MCksCisgICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCisgICAgcmFuZG9taXplXyh0cnVlKSwKKyAgICBhbHdheXNUcnlMYXN0Xyh0cnVlKSB7CiB9CiAKLVRTb2NrZXRQb29sOjpUU29ja2V0UG9vbChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSA6IFRTb2NrZXQoKSwKLSAgbnVtUmV0cmllc18oMSksCi0gIHJldHJ5SW50ZXJ2YWxfKDYwKSwKLSAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18oMSksCi0gIHJhbmRvbWl6ZV8odHJ1ZSksCi0gIGFsd2F5c1RyeUxhc3RfKHRydWUpCi17CitUU29ja2V0UG9vbDo6VFNvY2tldFBvb2woY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCkKKyAgOiBUU29ja2V0KCksCisgICAgbnVtUmV0cmllc18oMSksCisgICAgcmV0cnlJbnRlcnZhbF8oNjApLAorICAgIG1heENvbnNlY3V0aXZlRmFpbHVyZXNfKDEpLAorICAgIHJhbmRvbWl6ZV8odHJ1ZSksCisgICAgYWx3YXlzVHJ5TGFzdF8odHJ1ZSkgewogICBhZGRTZXJ2ZXIoaG9zdCwgcG9ydCk7CiB9CiAKIFRTb2NrZXRQb29sOjp+VFNvY2tldFBvb2woKSB7Ci0gIHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNlcnZlcnNfLmJlZ2luKCk7Ci0gIHZlY3Rvcjwgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlckVuZCA9IHNlcnZlcnNfLmVuZCgpOworICB2ZWN0b3I8c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHNlcnZlcnNfLmJlZ2luKCk7CisgIHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+Ojpjb25zdF9pdGVyYXRvciBpdGVyRW5kID0gc2VydmVyc18uZW5kKCk7CiAgIGZvciAoOyBpdGVyICE9IGl0ZXJFbmQ7ICsraXRlcikgewogICAgIHNldEN1cnJlbnRTZXJ2ZXIoKml0ZXIpOwogICAgIFRTb2NrZXRQb29sOjpjbG9zZSgpOwpAQCAtMTI1LDE3ICsxMzIsMTcgQEAKICAgc2VydmVyc18ucHVzaF9iYWNrKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+KG5ldyBUU29ja2V0UG9vbFNlcnZlcihob3N0LCBwb3J0KSkpOwogfQogCi12b2lkIFRTb2NrZXRQb29sOjphZGRTZXJ2ZXIoc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlcikgewordm9pZCBUU29ja2V0UG9vbDo6YWRkU2VydmVyKHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKICAgaWYgKHNlcnZlcikgewogICAgIHNlcnZlcnNfLnB1c2hfYmFjayhzZXJ2ZXIpOwogICB9CiB9CiAKLXZvaWQgVFNvY2tldFBvb2w6OnNldFNlcnZlcnMoY29uc3QgdmVjdG9yPCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7Cit2b2lkIFRTb2NrZXRQb29sOjpzZXRTZXJ2ZXJzKGNvbnN0IHZlY3RvcjxzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKSB7CiAgIHNlcnZlcnNfID0gc2VydmVyczsKIH0KIAotdm9pZCBUU29ja2V0UG9vbDo6Z2V0U2VydmVycyh2ZWN0b3I8IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKK3ZvaWQgVFNvY2tldFBvb2w6OmdldFNlcnZlcnModmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpIHsKICAgc2VydmVycyA9IHNlcnZlcnNfOwogfQogCkBAIC0xNDcsNyArMTU0LDYgQEAKICAgcmV0cnlJbnRlcnZhbF8gPSByZXRyeUludGVydmFsOwogfQogCi0KIHZvaWQgVFNvY2tldFBvb2w6OnNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXMpIHsKICAgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOwogfQpAQCAtMTYwLDcgKzE2Niw3IEBACiAgIGFsd2F5c1RyeUxhc3RfID0gYWx3YXlzVHJ5TGFzdDsKIH0KIAotdm9pZCBUU29ja2V0UG9vbDo6c2V0Q3VycmVudFNlcnZlcihjb25zdCBzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKSB7Cit2b2lkIFRTb2NrZXRQb29sOjpzZXRDdXJyZW50U2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpIHsKICAgY3VycmVudFNlcnZlcl8gPSBzZXJ2ZXI7CiAgIGhvc3RfID0gc2VydmVyLT5ob3N0XzsKICAgcG9ydF8gPSBzZXJ2ZXItPnBvcnRfOwpAQCAtMTc2LDcgKzE4Miw3IEBACiAKICAgc2l6ZV90IG51bVNlcnZlcnMgPSBzZXJ2ZXJzXy5zaXplKCk7CiAgIGlmIChudW1TZXJ2ZXJzID09IDApIHsKLSAgICBzb2NrZXRfID0gLTE7CisgICAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKICAgfQogCkBAIC0xODUsMTIgKzE5MSwxOCBAQAogICB9CiAKICAgaWYgKHJhbmRvbWl6ZV8gJiYgbnVtU2VydmVycyA+IDEpIHsKLSAgICByYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorICAgIHN0ZDo6cmFuZG9tX2RldmljZSBybmc7CisgICAgc3RkOjptdDE5OTM3IHVybmcocm5nKCkpOworICAgIHN0ZDo6c2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSwgdXJuZyk7CisjZWxzZQorICAgIHN0ZDo6cmFuZG9tX3NodWZmbGUoc2VydmVyc18uYmVnaW4oKSwgc2VydmVyc18uZW5kKCkpOworI2VuZGlmCiAgIH0KIAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNlcnZlcnM7ICsraSkgewogCi0gICAgc2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gJnNlcnZlciA9IHNlcnZlcnNfW2ldOworICAgIHNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIgPSBzZXJ2ZXJzX1tpXTsKICAgICAvLyBJbXBlcnNvbmF0ZSB0aGUgc2VydmVyIHNvY2tldAogICAgIHNldEN1cnJlbnRTZXJ2ZXIoc2VydmVyKTsKIApAQCAtMjE0LDEwICsyMjYsMTAgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtUmV0cmllc187ICsraikgewogICAgICAgICB0cnkgewogICAgICAgICAgIFRTb2NrZXQ6Om9wZW4oKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgc3RyaW5nIGVyclN0ciA9ICJUU29ja2V0UG9vbDo6b3BlbiBmYWlsZWQgIitnZXRTb2NrZXRJbmZvKCkrIjogIitlLndoYXQoKTsKKyAgICAgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiAmZSkgeworICAgICAgICAgIHN0cmluZyBlcnJTdHIgPSAiVFNvY2tldFBvb2w6Om9wZW4gZmFpbGVkICIgKyBnZXRTb2NrZXRJbmZvKCkgKyAiOiAiICsgZS53aGF0KCk7CiAgICAgICAgICAgR2xvYmFsT3V0cHV0KGVyclN0ci5jX3N0cigpKTsKLSAgICAgICAgICBzb2NrZXRfID0gLTE7CisgICAgICAgICAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC0yNDUsOCArMjU3LDkgQEAKIHZvaWQgVFNvY2tldFBvb2w6OmNsb3NlKCkgewogICBUU29ja2V0OjpjbG9zZSgpOwogICBpZiAoY3VycmVudFNlcnZlcl8pIHsKLSAgICBjdXJyZW50U2VydmVyXy0+c29ja2V0XyA9IC0xOworICAgIGN1cnJlbnRTZXJ2ZXJfLT5zb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICB9CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaAppbmRleCA0OGUzNWJiLi4xOGYxMDFjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCkBAIC0yMSwxNyArMjEsMTkgQEAKICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNPQ0tFVFBPT0xfSF8gMQogCiAjaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgIlRTb2NrZXQuaCIKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotIC8qKgotICAqIENsYXNzIHRvIGhvbGQgc2VydmVyIGluZm9ybWF0aW9uIGZvciBUU29ja2V0UG9vbAotICAqCi0gICovCisvKioKKyAqIENsYXNzIHRvIGhvbGQgc2VydmVyIGluZm9ybWF0aW9uIGZvciBUU29ja2V0UG9vbAorICoKKyAqLwogY2xhc3MgVFNvY2tldFBvb2xTZXJ2ZXIgewogCi0gIHB1YmxpYzoKK3B1YmxpYzoKICAgLyoqCiAgICAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIHNlcnZlciBpbmZvCiAgICAqLwpAQCAtNDAsNyArNDIsNyBAQAogICAvKioKICAgICogQ29uc3RydWN0b3IgZm9yIFRTb2NrZXRQb29sIHNlcnZlcgogICAgKi8KLSAgVFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcgJmhvc3QsIGludCBwb3J0KTsKKyAgVFNvY2tldFBvb2xTZXJ2ZXIoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKIAogICAvLyBIb3N0IG5hbWUKICAgc3RkOjpzdHJpbmcgaG9zdF87CkBAIC00OSw3ICs1MSw3IEBACiAgIGludCBwb3J0XzsKIAogICAvLyBTb2NrZXQgZm9yIHRoZSBzZXJ2ZXIKLSAgU09DS0VUIHNvY2tldF87CisgIFRIUklGVF9TT0NLRVQgc29ja2V0XzsKIAogICAvLyBMYXN0IHRpbWUgY29ubmVjdGluZyB0byB0aGlzIHNlcnZlciBmYWlsZWQKICAgdGltZV90IGxhc3RGYWlsVGltZV87CkBAIC02NCwxMzMgKzY2LDEzMCBAQAogICovCiBjbGFzcyBUU29ja2V0UG9vbCA6IHB1YmxpYyBUU29ja2V0IHsKIAotIHB1YmxpYzoKK3B1YmxpYzoKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqLworICBUU29ja2V0UG9vbCgpOwogCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKi8KLSAgIFRTb2NrZXRQb29sKCk7CisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gaG9zdHMgbGlzdCBvZiBob3N0IG5hbWVzCisgICAqIEBwYXJhbSBwb3J0cyBsaXN0IG9mIHBvcnQgbmFtZXMKKyAgICovCisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgaG9zdHMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBvcnRzKTsKIAotICAgLyoqCi0gICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgICoKLSAgICAqIEBwYXJhbSBob3N0cyBsaXN0IG9mIGhvc3QgbmFtZXMKLSAgICAqIEBwYXJhbSBwb3J0cyBsaXN0IG9mIHBvcnQgbmFtZXMKLSAgICAqLwotICAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZob3N0cywKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gJnBvcnRzKTsKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgcGFpcnMgb2YgaG9zdCBuYW1lIGFuZCBwb3J0CisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiYgc2VydmVycyk7CiAKLSAgIC8qKgotICAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICAqCi0gICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIHBhaXJzIG9mIGhvc3QgbmFtZSBhbmQgcG9ydAotICAgICovCi0gICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiYgc2VydmVycyk7CisgIC8qKgorICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgKgorICAgKiBAcGFyYW0gc2VydmVycyBsaXN0IG9mIFRTb2NrZXRQb29sU2VydmVycworICAgKi8KKyAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKIAotICAgLyoqCi0gICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgICoKLSAgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgVFNvY2tldFBvb2xTZXJ2ZXJzCi0gICAgKi8KLSAgVFNvY2tldFBvb2woY29uc3Qgc3RkOjp2ZWN0b3I8IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKKyAgLyoqCisgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAqCisgICAqIEBwYXJhbSBob3N0IHNpbmdsZSBob3N0CisgICAqIEBwYXJhbSBwb3J0IHNpbmdsZSBwb3J0CisgICAqLworICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOwogCi0gICAvKioKLSAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCi0gICAgKgotICAgICogQHBhcmFtIGhvc3Qgc2luZ2xlIGhvc3QKLSAgICAqIEBwYXJhbSBwb3J0IHNpbmdsZSBwb3J0Ci0gICAgKi8KLSAgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCk7CisgIC8qKgorICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgKi8KKyAgdmlydHVhbCB+VFNvY2tldFBvb2woKTsKIAotICAgLyoqCi0gICAgKiBEZXN0cm95ZXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgotICAgICovCi0gICB2aXJ0dWFsIH5UU29ja2V0UG9vbCgpOworICAvKioKKyAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCisgICAqLworICB2b2lkIGFkZFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOwogCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gICB2b2lkIGFkZFNlcnZlcihjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworICAvKioKKyAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCisgICAqLworICB2b2lkIGFkZFNlcnZlcihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOwogCi0gICAvKioKLSAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgICovCi0gIHZvaWQgYWRkU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKTsKKyAgLyoqCisgICAqIFNldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCisgICAqLworICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKIAotICAgLyoqCi0gICAgKiBTZXQgbGlzdCBvZiBzZXJ2ZXJzIGluIHRoaXMgcG9vbAotICAgICovCi0gIHZvaWQgc2V0U2VydmVycyhjb25zdCBzdGQ6OnZlY3RvcjwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworICAvKioKKyAgICogR2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKKyAgICovCisgIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwogCi0gICAvKioKLSAgICAqIEdldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCi0gICAgKi8KLSAgdm9pZCBnZXRTZXJ2ZXJzKHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisgIC8qKgorICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgorICAgKi8KKyAgdm9pZCBzZXROdW1SZXRyaWVzKGludCBudW1SZXRyaWVzKTsKIAotICAgLyoqCi0gICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgotICAgICovCi0gICB2b2lkIHNldE51bVJldHJpZXMoaW50IG51bVJldHJpZXMpOworICAvKioKKyAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KKyAgICovCisgIHZvaWQgc2V0UmV0cnlJbnRlcnZhbChpbnQgcmV0cnlJbnRlcnZhbCk7CiAKLSAgIC8qKgotICAgICogU2V0cyBob3cgbG9uZyB0byB3YWl0IHVudGlsIHJldHJ5aW5nIGEgaG9zdCBpZiBpdCB3YXMgbWFya2VkIGRvd24KLSAgICAqLwotICAgdm9pZCBzZXRSZXRyeUludGVydmFsKGludCByZXRyeUludGVydmFsKTsKKyAgLyoqCisgICAqIFNldHMgaG93IG1hbnkgdGltZXMgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KKyAgICovCisgIHZvaWQgc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcyhpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlcyk7CiAKLSAgIC8qKgotICAgICogU2V0cyBob3cgbWFueSB0aW1lcyB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgotICAgICovCi0gICB2b2lkIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoaW50IG1heENvbnNlY3V0aXZlRmFpbHVyZXMpOworICAvKioKKyAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KKyAgICovCisgIHZvaWQgc2V0UmFuZG9taXplKGJvb2wgcmFuZG9taXplKTsKIAotICAgLyoqCi0gICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgotICAgICovCi0gICB2b2lkIHNldFJhbmRvbWl6ZShib29sIHJhbmRvbWl6ZSk7CisgIC8qKgorICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgorICAgKi8KKyAgdm9pZCBzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCk7CiAKLSAgIC8qKgotICAgICogV2hldGhlciB0byBhbHdheXMgdHJ5IHRoZSBsYXN0IHNlcnZlci4KLSAgICAqLwotICAgdm9pZCBzZXRBbHdheXNUcnlMYXN0KGJvb2wgYWx3YXlzVHJ5TGFzdCk7CisgIC8qKgorICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCisgICAqLworICB2b2lkIG9wZW4oKTsKIAotICAgLyoqCi0gICAgKiBDcmVhdGVzIGFuZCBvcGVucyB0aGUgVU5JWCBzb2NrZXQuCi0gICAgKi8KLSAgIHZvaWQgb3BlbigpOworICAvKgorICAgKiBDbG9zZXMgdGhlIFVOSVggc29ja2V0CisgICAqLworICB2b2lkIGNsb3NlKCk7CiAKLSAgIC8qCi0gICAgKiBDbG9zZXMgdGhlIFVOSVggc29ja2V0Ci0gICAgKi8KLSAgIHZvaWQgY2xvc2UoKTsKK3Byb3RlY3RlZDoKKyAgdm9pZCBzZXRDdXJyZW50U2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CiAKLSBwcm90ZWN0ZWQ6Ci0KLSAgdm9pZCBzZXRDdXJyZW50U2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiAmc2VydmVyKTsKLQotICAgLyoqIExpc3Qgb2Ygc2VydmVycyB0byBjb25uZWN0IHRvICovCi0gIHN0ZDo6dmVjdG9yPCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiBzZXJ2ZXJzXzsKKyAgLyoqIExpc3Qgb2Ygc2VydmVycyB0byBjb25uZWN0IHRvICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiBzZXJ2ZXJzXzsKIAogICAvKiogQ3VycmVudCBzZXJ2ZXIgKi8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+IGN1cnJlbnRTZXJ2ZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+IGN1cnJlbnRTZXJ2ZXJfOwogCi0gICAvKiogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QgKi8KLSAgIGludCBudW1SZXRyaWVzXzsKKyAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCisgIGludCBudW1SZXRyaWVzXzsKIAotICAgLyoqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCi0gICAgKiBtYXJrZWQgYXMgZG93bi4KLSAgICAqLwotICAgdGltZV90IHJldHJ5SW50ZXJ2YWxfOworICAvKiogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KKyAgICogbWFya2VkIGFzIGRvd24uCisgICAqLworICB0aW1lX3QgcmV0cnlJbnRlcnZhbF87CiAKLSAgIC8qKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uICovCi0gICBpbnQgbWF4Q29uc2VjdXRpdmVGYWlsdXJlc187CisgIC8qKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uICovCisgIGludCBtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXzsKIAotICAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KLSAgIGJvb2wgcmFuZG9taXplXzsKKyAgLyoqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8gKi8KKyAgYm9vbCByYW5kb21pemVfOwogCi0gICAvKiogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/ICovCi0gICBib29sIGFsd2F5c1RyeUxhc3RfOworICAvKiogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/ICovCisgIGJvb2wgYWx3YXlzVHJ5TGFzdF87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTT0NLRVRQT09MX0hfCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKaW5kZXggM2I1NTJjNC4uZDg0NDIzOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKQEAgLTIxLDI1ICsyMSwyNiBAQAogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JUX0hfIDEKIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIEhlbHBlciB0ZW1wbGF0ZSB0byBob2lzdCByZWFkQWxsIGltcGxlbWVudGF0aW9uIG91dCBvZiBUVHJhbnNwb3J0CiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgotdWludDMyX3QgcmVhZEFsbChUcmFuc3BvcnRfICZ0cmFucywgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKK3VpbnQzMl90IHJlYWRBbGwoVHJhbnNwb3J0XyYgdHJhbnMsIHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIHVpbnQzMl90IGhhdmUgPSAwOwogICB1aW50MzJfdCBnZXQgPSAwOwogCiAgIHdoaWxlIChoYXZlIDwgbGVuKSB7Ci0gICAgZ2V0ID0gdHJhbnMucmVhZChidWYraGF2ZSwgbGVuLWhhdmUpOworICAgIGdldCA9IHRyYW5zLnJlYWQoYnVmICsgaGF2ZSwgbGVuIC0gaGF2ZSk7CiAgICAgaWYgKGdldCA8PSAwKSB7Ci0gICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSBkYXRhIHRvIHJlYWQuIik7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIHRvIHJlYWQuIik7CiAgICAgfQogICAgIGhhdmUgKz0gZ2V0OwogICB9CkBAIC00NywxNCArNDgsMTMgQEAKICAgcmV0dXJuIGhhdmU7CiB9CiAKLQogLyoqCiAgKiBHZW5lcmljIGludGVyZmFjZSBmb3IgYSBtZXRob2Qgb2YgdHJhbnNwb3J0aW5nIGRhdGEuIEEgVFRyYW5zcG9ydCBtYXkgYmUKICAqIGNhcGFibGUgb2YgZWl0aGVyIHJlYWRpbmcgb3Igd3JpdGluZywgYnV0IG5vdCBuZWNlc3NhcmlseSBib3RoLgogICoKICAqLwogY2xhc3MgVFRyYW5zcG9ydCB7Ci0gcHVibGljOgorcHVibGljOgogICAvKioKICAgICogVmlydHVhbCBkZWNvbnN0cnVjdG9yLgogICAgKi8KQEAgLTYzLDkgKzYzLDcgQEAKICAgLyoqCiAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KICAgICovCi0gIHZpcnR1YWwgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CisgIHZpcnR1YWwgYm9vbCBpc09wZW4oKSB7IHJldHVybiBmYWxzZTsgfQogCiAgIC8qKgogICAgKiBUZXN0cyB3aGV0aGVyIHRoZXJlIGlzIG1vcmUgZGF0YSB0byByZWFkIG9yIGlmIHRoZSByZW1vdGUgc2lkZSBpcwpAQCAtNzUsOSArNzMsNyBAQAogICAgKiBUaGlzIGlzIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY2hlY2sgaWYgaXQgc2hvdWxkIGxpc3RlbiBmb3IgYW5vdGhlcgogICAgKiByZXF1ZXN0LgogICAgKi8KLSAgdmlydHVhbCBib29sIHBlZWsoKSB7Ci0gICAgcmV0dXJuIGlzT3BlbigpOwotICB9CisgIHZpcnR1YWwgYm9vbCBwZWVrKCkgeyByZXR1cm4gaXNPcGVuKCk7IH0KIAogICAvKioKICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbnMuCkBAIC0xMDksOCArMTA1LDcgQEAKICAgICByZXR1cm4gcmVhZF92aXJ0KGJ1ZiwgbGVuKTsKICAgfQogICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90IC8qIGxlbiAqLykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCByZWFkLiIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHJlYWQuIik7CiAgIH0KIAogICAvKioKQEAgLTE1OCw4ICsxNTMsNyBAQAogICAgIHdyaXRlX3ZpcnQoYnVmLCBsZW4pOwogICB9CiAgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHdyaXRlLiIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJCYXNlIFRUcmFuc3BvcnQgY2Fubm90IHdyaXRlLiIpOwogICB9CiAKICAgLyoqCkBAIC0yMTUsOSArMjA5LDcgQEAKICAgICBUX1ZJUlRVQUxfQ0FMTCgpOwogICAgIHJldHVybiBib3Jyb3dfdmlydChidWYsIGxlbik7CiAgIH0KLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dfdmlydCh1aW50OF90KiAvKiBidWYgKi8sIHVpbnQzMl90KiAvKiBsZW4gKi8pIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQorICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd192aXJ0KHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QqIC8qIGxlbiAqLykgeyByZXR1cm4gTlVMTDsgfQogCiAgIC8qKgogICAgKiBSZW1vdmUgbGVuIGJ5dGVzIGZyb20gdGhlIHRyYW5zcG9ydC4gIFRoaXMgc2hvdWxkIGFsd2F5cyBmb2xsb3cgYSBib3Jyb3cKQEAgLTIzMywxMSArMjI1LDIwIEBACiAgICAgY29uc3VtZV92aXJ0KGxlbik7CiAgIH0KICAgdmlydHVhbCB2b2lkIGNvbnN1bWVfdmlydCh1aW50MzJfdCAvKiBsZW4gKi8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhc2UgVFRyYW5zcG9ydCBjYW5ub3QgY29uc3VtZS4iKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQmFzZSBUVHJhbnNwb3J0IGNhbm5vdCBjb25zdW1lLiIpOwogICB9CiAKLSBwcm90ZWN0ZWQ6CisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gb2YgdGhlIHRyYW5zcG9ydHMgY2FsbC4gVGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlCisgICAqIHRyYW5zcG9ydCB1c2VkLiBBbiBJUCBiYXNlZCB0cmFuc3BvcnQgZm9yIGV4YW1wbGUgd2lsbCByZXR1cm4gdGhlCisgICAqIElQIGFkZHJlc3Mgb2YgdGhlIGNsaWVudCBtYWtpbmcgdGhlIHJlcXVlc3QuCisgICAqIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBrbm93IHRoZSBvcmlnaW4gVW5rbm93biBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkIGluIGEgbG9nIG1lc3NhZ2UgZm9yIGV4YW1wbGUKKyAgICovCisgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0T3JpZ2luKCkgeyByZXR1cm4gIlVua25vd24iOyB9CisKK3Byb3RlY3RlZDoKICAgLyoqCiAgICAqIFNpbXBsZSBjb25zdHJ1Y3Rvci4KICAgICovCkBAIC0yNTEsNyArMjUyLDcgQEAKICAqCiAgKi8KIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRUcmFuc3BvcnRGYWN0b3J5KCkge30KIAogICB2aXJ0dWFsIH5UVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC0yNTksMTIgKzI2MCwxMiBAQAogICAvKioKICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcsIGp1c3QgcmV0dXJucyB0aGUgdHJhbnNwb3J0IGdpdmVuLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewogICAgIHJldHVybiB0cmFuczsKICAgfQotCiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCmluZGV4IGJkNGY0NGIuLmE1MjczMTcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcApAQCAtMTgsMTcgKzE4LDQyIEBACiAgKi8KIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAjaW5jbHVkZSA8Y3N0cmluZz4KIAotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYm9vc3Q6OmxleGljYWxfY2FzdDsKIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKLQorY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKKyAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICBzd2l0Y2ggKHR5cGVfKSB7CisgICAgY2FzZSBVTktOT1dOOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOworICAgIGNhc2UgTk9UX09QRU46CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRyYW5zcG9ydCBub3Qgb3BlbiI7CisgICAgY2FzZSBUSU1FRF9PVVQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IFRpbWVkIG91dCI7CisgICAgY2FzZSBFTkRfT0ZfRklMRToKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogRW5kIG9mIGZpbGUiOworICAgIGNhc2UgSU5URVJSVVBURUQ6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKKyAgICBjYXNlIEJBRF9BUkdTOgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBJbnZhbGlkIGFyZ3VtZW50cyI7CisgICAgY2FzZSBDT1JSVVBURURfREFUQToKKyAgICAgIHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogQ29ycnVwdGVkIERhdGEiOworICAgIGNhc2UgSU5URVJOQUxfRVJST1I6CisgICAgICByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbWVzc2FnZV8uY19zdHIoKTsKKyAgfQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCmluZGV4IDAyOGRiYjguLmZiNWYwMGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oCkBAIC0yMCwxMCArMjAsMTMgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVEVYQ0VQVElPTl9IXwogI2RlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfIDEKIAorI2luY2x1ZGUgPGJvb3N0L251bWVyaWMvY29udmVyc2lvbi9jYXN0LmhwcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIENsYXNzIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aGUgcG9zc2libGUgdHlwZXMgb2YgdHJhbnNwb3J0IGVycm9ycyB0aGF0IG1heQpAQCAtMzQsNDQgKzM3LDM1IEBACiAgKgogICovCiBjbGFzcyBUVHJhbnNwb3J0RXhjZXB0aW9uIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qKgogICAgKiBFcnJvciBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgdHlwZXMgb2YgZXhjZXB0aW9ucy4KICAgICovCi0gIGVudW0gVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUKLSAgeyBVTktOT1dOID0gMAotICAsIE5PVF9PUEVOID0gMQotICAsIFRJTUVEX09VVCA9IDIKLSAgLCBFTkRfT0ZfRklMRSA9IDMKLSAgLCBJTlRFUlJVUFRFRCA9IDQKLSAgLCBCQURfQVJHUyA9IDUKLSAgLCBDT1JSVVBURURfREFUQSA9IDYKLSAgLCBJTlRFUk5BTF9FUlJPUiA9IDcKKyAgZW51bSBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB7CisgICAgVU5LTk9XTiA9IDAsCisgICAgTk9UX09QRU4gPSAxLAorICAgIFRJTUVEX09VVCA9IDIsCisgICAgRU5EX09GX0ZJTEUgPSAzLAorICAgIElOVEVSUlVQVEVEID0gNCwKKyAgICBCQURfQVJHUyA9IDUsCisgICAgQ09SUlVQVEVEX0RBVEEgPSA2LAorICAgIElOVEVSTkFMX0VSUk9SID0gNwogICB9OwogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oKSwKLSAgICB0eXBlXyhVTktOT1dOKSB7fQorICBUVHJhbnNwb3J0RXhjZXB0aW9uKCkgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigpLCB0eXBlXyhVTktOT1dOKSB7fQogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlKSA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCksIHR5cGVfKHR5cGUpIHt9CiAKLSAgVFRyYW5zcG9ydEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLAotICAgIHR5cGVfKFVOS05PV04pIHt9CisgIFRUcmFuc3BvcnRFeGNlcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlKSwgdHlwZV8oVU5LTk9XTikge30KIAotICBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6Ci0gICAgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKKyAgICA6IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXyh0eXBlKSB7fQogCi0gIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJybm9fY29weSkgOgotICAgIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKG1lc3NhZ2UgKyAiOiAiICsgVE91dHB1dDo6c3RyZXJyb3JfcyhlcnJub19jb3B5KSksCi0gICAgdHlwZV8odHlwZSkge30KKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpCisgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNzksMzcgKzczLDM0IEBACiAgICAqCiAgICAqIEByZXR1cm4gRXJyb3IgY29kZQogICAgKi8KLSAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgZ2V0VHlwZSgpIGNvbnN0IHRocm93KCkgewotICAgIHJldHVybiB0eXBlXzsKLSAgfQorICBUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3Qgbm9leGNlcHQgeyByZXR1cm4gdHlwZV87IH0KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKLSAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgc3dpdGNoICh0eXBlXykgewotICAgICAgICBjYXNlIFVOS05PV04gICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBVbmtub3duIHRyYW5zcG9ydCBleGNlcHRpb24iOwotICAgICAgICBjYXNlIE5PVF9PUEVOICAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUcmFuc3BvcnQgbm90IG9wZW4iOwotICAgICAgICBjYXNlIFRJTUVEX09VVCAgICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBUaW1lZCBvdXQiOwotICAgICAgICBjYXNlIEVORF9PRl9GSUxFICAgIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBFbmQgb2YgZmlsZSI7Ci0gICAgICAgIGNhc2UgSU5URVJSVVBURUQgICAgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVycnVwdGVkIjsKLSAgICAgICAgY2FzZSBCQURfQVJHUyAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogSW52YWxpZCBhcmd1bWVudHMiOwotICAgICAgICBjYXNlIENPUlJVUFRFRF9EQVRBIDogcmV0dXJuICJUVHJhbnNwb3J0RXhjZXB0aW9uOiBDb3JydXB0ZWQgRGF0YSI7Ci0gICAgICAgIGNhc2UgSU5URVJOQUxfRVJST1IgOiByZXR1cm4gIlRUcmFuc3BvcnRFeGNlcHRpb246IEludGVybmFsIGVycm9yIjsKLSAgICAgICAgZGVmYXVsdCAgICAgICAgICAgICA6IHJldHVybiAiVFRyYW5zcG9ydEV4Y2VwdGlvbjogKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG1lc3NhZ2VfLmNfc3RyKCk7Ci0gICAgfQotICB9CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OwogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICAvKiogSnVzdCBsaWtlIHN0cmVycm9yX3IgYnV0IHJldHVybnMgYSBDKysgc3RyaW5nIG9iamVjdC4gKi8KICAgc3RkOjpzdHJpbmcgc3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSk7CiAKICAgLyoqIEVycm9yIGNvZGUgKi8KICAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZV87Ci0KIH07CiAKLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CisvKioKKyAqIExlZ2FjeSBjb2RlIGluIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBvdmVyZmxvdyBpc3N1ZXMKKyAqIHRoYXQgbmVlZCB0byBiZSBlbmZvcmNlZC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBUbyBzYWZlX251bWVyaWNfY2FzdChGcm9tIGkpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gYm9vc3Q6Om51bWVyaWNfY2FzdDxUbz4oaSk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2Nhc3QmIGJjKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjLndoYXQoKSk7CisgIH0KK30KKworfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcAppbmRleCA0NGY2MTAxLi42ZjQ3Yzc5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCkBAIC0yMSwzOSArMjEsNDQgQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIHVpbnQzMl90IFRQaXBlZFRyYW5zcG9ydDo6cmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewogICB1aW50MzJfdCBuZWVkID0gbGVuOwogCiAgIC8vIFdlIGRvbid0IGhhdmUgZW5vdWdoIGRhdGEgeWV0Ci0gIGlmIChyTGVuXy1yUG9zXyA8IG5lZWQpIHsKKyAgaWYgKHJMZW5fIC0gclBvc18gPCBuZWVkKSB7CiAgICAgLy8gQ29weSBvdXQgd2hhdGV2ZXIgd2UgaGF2ZQotICAgIGlmIChyTGVuXy1yUG9zXyA+IDApIHsKLSAgICAgIG1lbWNweShidWYsIHJCdWZfK3JQb3NfLCByTGVuXy1yUG9zXyk7Ci0gICAgICBuZWVkIC09IHJMZW5fLXJQb3NfOwotICAgICAgYnVmICs9IHJMZW5fLXJQb3NfOworICAgIGlmIChyTGVuXyAtIHJQb3NfID4gMCkgeworICAgICAgbWVtY3B5KGJ1ZiwgckJ1Zl8gKyByUG9zXywgckxlbl8gLSByUG9zXyk7CisgICAgICBuZWVkIC09IHJMZW5fIC0gclBvc187CisgICAgICBidWYgKz0gckxlbl8gLSByUG9zXzsKICAgICAgIHJQb3NfID0gckxlbl87CiAgICAgfQogCiAgICAgLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiBpdCBpcyBmdWxsCiAgICAgaWYgKHJMZW5fID09IHJCdWZTaXplXykgewotICAgICAgckJ1ZlNpemVfICo9MjsKLSAgICAgIHJCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICByQnVmU2l6ZV8gKj0gMjsKKyAgICAgIHVpbnQ4X3QgKnRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgICAgckJ1Zl8gPSB0bXBCdWY7CiAgICAgfQogCiAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgotICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXytyUG9zXywgckJ1ZlNpemVfIC0gclBvc18pOworICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXyArIHJQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7CiAgIH0KIAotCiAgIC8vIEhhbmQgb3ZlciB3aGF0ZXZlciB3ZSBoYXZlCiAgIHVpbnQzMl90IGdpdmUgPSBuZWVkOwotICBpZiAockxlbl8tclBvc18gPCBnaXZlKSB7Ci0gICAgZ2l2ZSA9IHJMZW5fLXJQb3NfOworICBpZiAockxlbl8gLSByUG9zXyA8IGdpdmUpIHsKKyAgICBnaXZlID0gckxlbl8gLSByUG9zXzsKICAgfQogICBpZiAoZ2l2ZSA+IDApIHsKLSAgICBtZW1jcHkoYnVmLCByQnVmXytyUG9zXywgZ2l2ZSk7CisgICAgbWVtY3B5KGJ1ZiwgckJ1Zl8gKyByUG9zXywgZ2l2ZSk7CiAgICAgclBvc18gKz0gZ2l2ZTsKICAgICBuZWVkIC09IGdpdmU7CiAgIH0KQEAgLTY4LDExICs3MywxNiBAQAogCiAgIC8vIE1ha2UgdGhlIGJ1ZmZlciBhcyBiaWcgYXMgaXQgbmVlZHMgdG8gYmUKICAgaWYgKChsZW4gKyB3TGVuXykgPj0gd0J1ZlNpemVfKSB7Ci0gICAgdWludDMyX3QgbmV3QnVmU2l6ZSA9IHdCdWZTaXplXyoyOworICAgIHVpbnQzMl90IG5ld0J1ZlNpemUgPSB3QnVmU2l6ZV8gKiAyOwogICAgIHdoaWxlICgobGVuICsgd0xlbl8pID49IG5ld0J1ZlNpemUpIHsKICAgICAgIG5ld0J1ZlNpemUgKj0gMjsKICAgICB9Ci0gICAgd0J1Zl8gPSAodWludDhfdCAqKXN0ZDo6cmVhbGxvYyh3QnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogbmV3QnVmU2l6ZSk7CisgICAgdWludDhfdCAqdG1wQnVmPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHdCdWZfLCBzaXplb2YodWludDhfdCkgKiBuZXdCdWZTaXplKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gdG1wQnVmOworCiAgICAgd0J1ZlNpemVfID0gbmV3QnVmU2l6ZTsKICAgfQogCkBAIC04MSw3ICs5MSw3IEBACiAgIHdMZW5fICs9IGxlbjsKIH0KIAotdm9pZCBUUGlwZWRUcmFuc3BvcnQ6OmZsdXNoKCkgIHsKK3ZvaWQgVFBpcGVkVHJhbnNwb3J0OjpmbHVzaCgpIHsKICAgLy8gV3JpdGUgb3V0IGFueSBkYXRhIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGJ1ZmZlcgogICBpZiAod0xlbl8gPiAwKSB7CiAgICAgc3JjVHJhbnNfLT53cml0ZSh3QnVmXywgd0xlbl8pOwpAQCAtOTIsOSArMTAyLDEwIEBACiAgIHNyY1RyYW5zXy0+Zmx1c2goKTsKIH0KIAotVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQotICA6IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnMpLAotICAgIHNyY1RyYW5zXyhzcmNUcmFucykgeworVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwgc3JjVHJhbnNfKHNyY1RyYW5zKSB7CiB9CiAKIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQ6On5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCkgewpAQCAtMTI1LDcgKzEzNiw3IEBACiAgIHVpbnQzMl90IGdldCA9IDA7CiAKICAgd2hpbGUgKGhhdmUgPCBsZW4pIHsKLSAgICBnZXQgPSByZWFkKGJ1ZitoYXZlLCBsZW4taGF2ZSk7CisgICAgZ2V0ID0gcmVhZChidWYgKyBoYXZlLCBsZW4gLSBoYXZlKTsKICAgICBpZiAoZ2V0IDw9IDApIHsKICAgICAgIHRocm93IFRFT0ZFeGNlcHRpb24oKTsKICAgICB9CkBAIC0xNzQsNSArMTg1LDYgQEAKIHZvaWQgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydDo6c2Vla1RvRW5kKCkgewogICBzcmNUcmFuc18tPnNlZWtUb0VuZCgpOwogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaAppbmRleCBhYTI5NGI0Li40YzgyZGQzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKQEAgLTI5LDcgKzI5LDkgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFRoZSBudWxsIHRyYW5zcG9ydCBpcyBhIGR1bW15IHRyYW5zcG9ydCB0aGF0IGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuCkBAIC0zOSwyNCArNDEsMTggQEAKICAqCiAgKi8KIGNsYXNzIFROdWxsVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFROdWxsVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBUTnVsbFRyYW5zcG9ydCgpIHt9CiAKICAgflROdWxsVHJhbnNwb3J0KCkge30KIAotICBib29sIGlzT3BlbigpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQorICBib29sIGlzT3BlbigpIHsgcmV0dXJuIHRydWU7IH0KIAogICB2b2lkIG9wZW4oKSB7fQogCi0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogLyogYnVmICovLCB1aW50MzJfdCAvKiBsZW4gKi8pIHsKLSAgICByZXR1cm47Ci0gIH0KLQorICB2b2lkIHdyaXRlKGNvbnN0IHVpbnQ4X3QqIC8qIGJ1ZiAqLywgdWludDMyX3QgLyogbGVuICovKSB7IHJldHVybjsgfQogfTsKIAotCiAvKioKICAqIFRQaXBlZFRyYW5zcG9ydC4gVGhpcyB0cmFuc3BvcnQgYWxsb3dzIHBpcGluZyBvZiBhIHJlcXVlc3QgZnJvbSBvbmUKICAqIHRyYW5zcG9ydCB0byBhbm90aGVyIGVpdGhlciB3aGVuIHJlYWRFbmQoKSBvciB3cml0ZUVuZCgpLiBUaGUgdHlwaWNhbApAQCAtNjYsNDEgKzYyLDQ2IEBACiAgKgogICovCiBjbGFzcyBUUGlwZWRUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6Ci0gIFRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSA6Ci0gICAgc3JjVHJhbnNfKHNyY1RyYW5zKSwKLSAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAotICAgIHJCdWZTaXplXyg1MTIpLCByUG9zXygwKSwgckxlbl8oMCksCi0gICAgd0J1ZlNpemVfKDUxMiksIHdMZW5fKDApIHsKK3B1YmxpYzoKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQorICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKKyAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCisgICAgICByQnVmU2l6ZV8oNTEyKSwKKyAgICAgIHJQb3NfKDApLAorICAgICAgckxlbl8oMCksCisgICAgICB3QnVmU2l6ZV8oNTEyKSwKKyAgICAgIHdMZW5fKDApIHsKIAogICAgIC8vIGRlZmF1bHQgaXMgdG8gdG8gcGlwZSB0aGUgcmVxdWVzdCB3aGVuIHJlYWRFbmQoKSBpcyBjYWxsZWQKICAgICBwaXBlT25SZWFkXyA9IHRydWU7CiAgICAgcGlwZU9uV3JpdGVfID0gZmFsc2U7CiAKLSAgICByQnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICByQnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOwogICAgIGlmIChyQnVmXyA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KLSAgICB3QnVmXyA9ICh1aW50OF90Kikgc3RkOjptYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogd0J1ZlNpemVfKTsKKyAgICB3QnVmXyA9ICh1aW50OF90KilzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOwogICAgIGlmICh3QnVmXyA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOwogICAgIH0KICAgfQogCi0gIFRQaXBlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zLAotICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3opIDoKLSAgICBzcmNUcmFuc18oc3JjVHJhbnMpLAotICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCi0gICAgckJ1ZlNpemVfKDUxMiksIHJQb3NfKDApLCByTGVuXygwKSwKLSAgICB3QnVmU2l6ZV8oc3opLCB3TGVuXygwKSB7CisgIFRQaXBlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCisgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeikKKyAgICA6IHNyY1RyYW5zXyhzcmNUcmFucyksCisgICAgICBkc3RUcmFuc18oZHN0VHJhbnMpLAorICAgICAgckJ1ZlNpemVfKDUxMiksCisgICAgICByUG9zXygwKSwKKyAgICAgIHJMZW5fKDApLAorICAgICAgd0J1ZlNpemVfKHN6KSwKKyAgICAgIHdMZW5fKDApIHsKIAotICAgIHJCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiByQnVmU2l6ZV8pOworICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CiAgICAgaWYgKHJCdWZfID09IE5VTEwpIHsKICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QqKSBzdGQ6Om1hbGxvYyhzaXplb2YodWludDhfdCkgKiB3QnVmU2l6ZV8pOworICAgIHdCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemVvZih1aW50OF90KSAqIHdCdWZTaXplXyk7CiAgICAgaWYgKHdCdWZfID09IE5VTEwpIHsKICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CiAgICAgfQpAQCAtMTExLDQwICsxMTIsMzMgQEAKICAgICBzdGQ6OmZyZWUod0J1Zl8pOwogICB9CiAKLSAgYm9vbCBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHNyY1RyYW5zXy0+aXNPcGVuKCk7Ci0gIH0KKyAgYm9vbCBpc09wZW4oKSB7IHJldHVybiBzcmNUcmFuc18tPmlzT3BlbigpOyB9CiAKICAgYm9vbCBwZWVrKCkgewogICAgIGlmIChyUG9zXyA+PSByTGVuXykgewogICAgICAgLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpZiBpdCBpcyBmdWxsCiAgICAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7Ci0gICAgICAgIHJCdWZTaXplXyAqPTI7Ci0gICAgICAgIHJCdWZfID0gKHVpbnQ4X3QgKilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICAgIHJCdWZTaXplXyAqPSAyOworICAgICAgICB1aW50OF90ICogdG1wQnVmID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKwlpZiAodG1wQnVmID09IE5VTEwpIHsKKwkgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisJfQorCXJCdWZfID0gdG1wQnVmOwogICAgICAgfQogCiAgICAgICAvLyB0cnkgdG8gZmlsbCB1cCB0aGUgYnVmZmVyCi0gICAgICByTGVuXyArPSBzcmNUcmFuc18tPnJlYWQockJ1Zl8rclBvc18sIHJCdWZTaXplXyAtIHJQb3NfKTsKKyAgICAgIHJMZW5fICs9IHNyY1RyYW5zXy0+cmVhZChyQnVmXyArIHJQb3NfLCByQnVmU2l6ZV8gLSByUG9zXyk7CiAgICAgfQogICAgIHJldHVybiAockxlbl8gPiByUG9zXyk7CiAgIH0KIAorICB2b2lkIG9wZW4oKSB7IHNyY1RyYW5zXy0+b3BlbigpOyB9CiAKLSAgdm9pZCBvcGVuKCkgewotICAgIHNyY1RyYW5zXy0+b3BlbigpOwotICB9CisgIHZvaWQgY2xvc2UoKSB7IHNyY1RyYW5zXy0+Y2xvc2UoKTsgfQogCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgc3JjVHJhbnNfLT5jbG9zZSgpOwotICB9CisgIHZvaWQgc2V0UGlwZU9uUmVhZChib29sIHBpcGVWYWwpIHsgcGlwZU9uUmVhZF8gPSBwaXBlVmFsOyB9CiAKLSAgdm9pZCBzZXRQaXBlT25SZWFkKGJvb2wgcGlwZVZhbCkgewotICAgIHBpcGVPblJlYWRfID0gcGlwZVZhbDsKLSAgfQotCi0gIHZvaWQgc2V0UGlwZU9uV3JpdGUoYm9vbCBwaXBlVmFsKSB7Ci0gICAgcGlwZU9uV3JpdGVfID0gcGlwZVZhbDsKLSAgfQorICB2b2lkIHNldFBpcGVPbldyaXRlKGJvb2wgcGlwZVZhbCkgeyBwaXBlT25Xcml0ZV8gPSBwaXBlVmFsOyB9CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKQEAgLTE4MCwyNSArMTc0LDE5IEBACiAKICAgdm9pZCBmbHVzaCgpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gZHN0VHJhbnNfOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUYXJnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBkc3RUcmFuc187IH0KIAogICAvKgogICAgKiBPdmVycmlkZSBUVHJhbnNwb3J0ICpfdmlydCgpIGZ1bmN0aW9ucyB0byBpbnZva2Ugb3VyIGltcGxlbWVudGF0aW9ucy4KICAgICogV2UgY2Fubm90IHVzZSBUVmlydHVhbFRyYW5zcG9ydCB0byBwcm92aWRlIHRoZXNlLCBzaW5jZSB3ZSBuZWVkIHRvIGluaGVyaXQKICAgICogdmlydHVhbGx5IGZyb20gVFRyYW5zcG9ydC4KICAgICovCi0gIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPnJlYWQoYnVmLCBsZW4pOwotICB9Ci0gIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOwotICB9CisgIHZpcnR1YWwgdWludDMyX3QgcmVhZF92aXJ0KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsgfQorICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT53cml0ZShidWYsIGxlbik7IH0KIAotIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnNfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CiAKICAgdWludDhfdCogckJ1Zl87CiAgIHVpbnQzMl90IHJCdWZTaXplXzsKQEAgLTIxMywxNSArMjAxLDE0IEBACiAgIGJvb2wgcGlwZU9uV3JpdGVfOwogfTsKIAotCiAvKioKICAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSBwaXBlZFRyYW5zcG9ydCBpbnN0YW5jZS4KICAqCiAgKi8KIGNsYXNzIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFRyYW5zcG9ydEZhY3RvcnkgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0gIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKKyAgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKICAgICBpbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KGRzdFRyYW5zKTsKICAgfQogICB2aXJ0dWFsIH5UUGlwZWRUcmFuc3BvcnRGYWN0b3J5KCkge30KQEAgLTIyOSwxMSArMjE2LDExIEBACiAgIC8qKgogICAgKiBXcmFwcyB0aGUgYmFzZSB0cmFuc3BvcnQgaW50byBhIHBpcGVkIHRyYW5zcG9ydC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgIHZpcnR1YWwgdm9pZCBpbml0aWFsaXplVGFyZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgewogICAgIGlmIChkc3RUcmFuc18uZ2V0KCkgPT0gTlVMTCkgewogICAgICAgZHN0VHJhbnNfID0gZHN0VHJhbnM7CiAgICAgfSBlbHNlIHsKQEAgLTI0MSw4ICsyMjgsOCBAQAogICAgIH0KICAgfQogCi0gcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187Citwcm90ZWN0ZWQ6CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CiB9OwogCiAvKioKQEAgLTI1MSwxMCArMjM4LDEwIEBACiAgKiBUVHJhbnNwb3J0IGNhbiBzdGlsbCBhY2Nlc3MgdGhlIG9yaWdpbmFsIHRyYW5zcG9ydC4KICAqCiAgKi8KLWNsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCB7Ci0gcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOworY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydCA6IHB1YmxpYyBUUGlwZWRUcmFuc3BvcnQsIHB1YmxpYyBURmlsZVJlYWRlclRyYW5zcG9ydCB7CitwdWJsaWM6CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOwogCiAgIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7CiAKQEAgLTI4MywyMCArMjcwLDE0IEBACiAgICAqIFdlIGNhbm5vdCB1c2UgVFZpcnR1YWxUcmFuc3BvcnQgdG8gcHJvdmlkZSB0aGVzZSwgc2luY2Ugd2UgbmVlZCB0byBpbmhlcml0CiAgICAqIHZpcnR1YWxseSBmcm9tIFRUcmFuc3BvcnQuCiAgICAqLwotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRBbGxfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5yZWFkQWxsKGJ1ZiwgbGVuKTsKLSAgfQotICB2aXJ0dWFsIHZvaWQgd3JpdGVfdmlydChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsKLSAgfQorICB2aXJ0dWFsIHVpbnQzMl90IHJlYWRfdmlydCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyByZXR1cm4gdGhpcy0+cmVhZChidWYsIGxlbik7IH0KKyAgdmlydHVhbCB1aW50MzJfdCByZWFkQWxsX3ZpcnQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPnJlYWRBbGwoYnVmLCBsZW4pOyB9CisgIHZpcnR1YWwgdm9pZCB3cml0ZV92aXJ0KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHRoaXMtPndyaXRlKGJ1ZiwgbGVuKTsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICAvLyBzaG91bGRuJ3QgYmUgdXNlZAogICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOwogfTsKIAogLyoqCkBAIC0zMDQsMjcgKzI4NSwzMCBAQAogICoKICAqLwogY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0RmFjdG9yeSgpIHt9Ci0gIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQotICAgIDogVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShkc3RUcmFucykKLSAge30KKyAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQorICAgIDogVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShkc3RUcmFucykge30KICAgdmlydHVhbCB+VFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBwRmlsZVJlYWRlclRyYW5zcG9ydCA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gcEZpbGVSZWFkZXJUcmFuc3BvcnQKKyAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRGaWxlUmVhZGVyVHJhbnNwb3J0PihzcmNUcmFucyk7CiAgICAgaWYgKHBGaWxlUmVhZGVyVHJhbnNwb3J0LmdldCgpICE9IE5VTEwpIHsKICAgICAgIHJldHVybiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KHBGaWxlUmVhZGVyVHJhbnNwb3J0KTsKICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KCk7CisgICAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KCk7CiAgICAgfQogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGdldEZpbGVSZWFkZXJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PihuZXcgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PigKKyAgICAgICAgbmV3IFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zXykpOwogICB9CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRVVElMU19IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oCmluZGV4IDU3NWY1NDcuLjBjYWNmNjEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0LmgKQEAgLTIyLDggKzIyLDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgewotCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8qKgogICogSGVscGVyIGNsYXNzIHRoYXQgcHJvdmlkZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgVFRyYW5zcG9ydCBtZXRob2RzLgpAQCAtNDIsMjggKzQzLDIwIEBACiAgKiByZWFkX3ZpcnQoKS4pCiAgKi8KIGNsYXNzIFRUcmFuc3BvcnREZWZhdWx0cyA6IHB1YmxpYyBUVHJhbnNwb3J0IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qCiAgICAqIFRUcmFuc3BvcnQgKl92aXJ0KCkgbWV0aG9kcyBwcm92aWRlIHJlYXNvbmFibGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuCiAgICAqIEludm9rZSB0aGVtIG5vbi12aXJ0dWFsbHkuCiAgICAqLwotICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gICAgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OnJlYWRfdmlydChidWYsIGxlbik7Ci0gIH0KLSAgdWludDMyX3QgcmVhZEFsbCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgewotICAgIHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkQWxsX3ZpcnQoYnVmLCBsZW4pOwotICB9Ci0gIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKLSAgICB0aGlzLT5UVHJhbnNwb3J0Ojp3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsKLSAgfQorICB1aW50MzJfdCByZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7IHJldHVybiB0aGlzLT5UVHJhbnNwb3J0OjpyZWFkX3ZpcnQoYnVmLCBsZW4pOyB9CisgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OnJlYWRBbGxfdmlydChidWYsIGxlbik7IH0KKyAgdm9pZCB3cml0ZShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeyB0aGlzLT5UVHJhbnNwb3J0Ojp3cml0ZV92aXJ0KGJ1ZiwgbGVuKTsgfQogICBjb25zdCB1aW50OF90KiBib3Jyb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKSB7CiAgICAgcmV0dXJuIHRoaXMtPlRUcmFuc3BvcnQ6OmJvcnJvd192aXJ0KGJ1ZiwgbGVuKTsKICAgfQotICB2b2lkIGNvbnN1bWUodWludDMyX3QgbGVuKSB7Ci0gICAgdGhpcy0+VFRyYW5zcG9ydDo6Y29uc3VtZV92aXJ0KGxlbik7Ci0gIH0KKyAgdm9pZCBjb25zdW1lKHVpbnQzMl90IGxlbikgeyB0aGlzLT5UVHJhbnNwb3J0Ojpjb25zdW1lX3ZpcnQobGVuKTsgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBUVHJhbnNwb3J0RGVmYXVsdHMoKSB7fQogfTsKIApAQCAtODQsOSArNzcsOSBAQAogICoKICAqIEBhdXRob3IgQ2hhZCBXYWx0ZXJzIDxjaGFkQHBvd2Vyc2V0LmNvbT4KICAqLwotdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIFN1cGVyXz1UVHJhbnNwb3J0RGVmYXVsdHM+Cit0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0XywgY2xhc3MgU3VwZXJfID0gVFRyYW5zcG9ydERlZmF1bHRzPgogY2xhc3MgVFZpcnR1YWxUcmFuc3BvcnQgOiBwdWJsaWMgU3VwZXJfIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIC8qCiAgICAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgKl92aXJ0KCkgZnVuY3Rpb25zLCB0byBjYWxsIHRoZSBzdWJjbGFzcydzCiAgICAqIG5vbi12aXJ0dWFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9uLgpAQCAtMTA3LDkgKzEwMCw3IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRyYW5zcG9ydF8qPih0aGlzKS0+Ym9ycm93KGJ1ZiwgbGVuKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBjb25zdW1lX3ZpcnQodWludDMyX3QgbGVuKSB7Ci0gICAgc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5jb25zdW1lKGxlbik7Ci0gIH0KKyAgdmlydHVhbCB2b2lkIGNvbnN1bWVfdmlydCh1aW50MzJfdCBsZW4pIHsgc3RhdGljX2Nhc3Q8VHJhbnNwb3J0Xyo+KHRoaXMpLT5jb25zdW1lKGxlbik7IH0KIAogICAvKgogICAgKiBQcm92aWRlIGEgZGVmYXVsdCByZWFkQWxsKCkgaW1wbGVtZW50YXRpb24gdGhhdCBpbnZva2VzCkBAIC0xMjYsNyArMTE3LDcgQEAKICAgICByZXR1cm4gOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpyZWFkQWxsKCp0cmFucywgYnVmLCBsZW4pOwogICB9CiAKLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIFRWaXJ0dWFsVHJhbnNwb3J0KCkge30KIAogICAvKgpAQCAtMTM1LDEyICsxMjYsMTUgQEAKICAgICogYWRkaXRpb25hbCB2ZXJzaW9ucyBjYW4gYmUgYWRkZWQgYXMgbmVlZGVkLgogICAgKi8KICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFyZ18+Ci0gIFRWaXJ0dWFsVHJhbnNwb3J0KEFyZ18gY29uc3QmIGFyZykgOiBTdXBlcl8oYXJnKSB7IH0KKyAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnXyBjb25zdCYgYXJnKQorICAgIDogU3VwZXJfKGFyZykge30KIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMV8sIHR5cGVuYW1lIEFyZzJfPgotICBUVmlydHVhbFRyYW5zcG9ydChBcmcxXyBjb25zdCYgYTEsIEFyZzJfIGNvbnN0JiBhMikgOiBTdXBlcl8oYTEsIGEyKSB7IH0KKyAgVFZpcnR1YWxUcmFuc3BvcnQoQXJnMV8gY29uc3QmIGExLCBBcmcyXyBjb25zdCYgYTIpCisgICAgOiBTdXBlcl8oYTEsIGEyKSB7fQogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAogCiAjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVklSVFVBTFRSQU5TUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAppbmRleCA5OGIyNWI4Li5lNDI2ZGMzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcApAQCAtMjEsMTEgKzIxLDEyIEBACiAjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oPgotI2luY2x1ZGUgPHpsaWIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIC8vIERvbid0IGNhbGwgdGhpcyBvdXRzaWRlIG9mIHRoZSBjb25zdHJ1Y3Rvci4KIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OmluaXRabGliKCkgewpAQCAtMzcsMTcgKzM4LDE3IEBACiAKICAgICByc3RyZWFtXy0+emFsbG9jID0gWl9OVUxMOwogICAgIHdzdHJlYW1fLT56YWxsb2MgPSBaX05VTEw7Ci0gICAgcnN0cmVhbV8tPnpmcmVlICA9IFpfTlVMTDsKLSAgICB3c3RyZWFtXy0+emZyZWUgID0gWl9OVUxMOworICAgIHJzdHJlYW1fLT56ZnJlZSA9IFpfTlVMTDsKKyAgICB3c3RyZWFtXy0+emZyZWUgPSBaX05VTEw7CiAgICAgcnN0cmVhbV8tPm9wYXF1ZSA9IFpfTlVMTDsKICAgICB3c3RyZWFtXy0+b3BhcXVlID0gWl9OVUxMOwogCi0gICAgcnN0cmVhbV8tPm5leHRfaW4gICA9IGNyYnVmXzsKLSAgICB3c3RyZWFtXy0+bmV4dF9pbiAgID0gdXdidWZfOwotICAgIHJzdHJlYW1fLT5uZXh0X291dCAgPSB1cmJ1Zl87Ci0gICAgd3N0cmVhbV8tPm5leHRfb3V0ICA9IGN3YnVmXzsKLSAgICByc3RyZWFtXy0+YXZhaWxfaW4gID0gMDsKLSAgICB3c3RyZWFtXy0+YXZhaWxfaW4gID0gMDsKKyAgICByc3RyZWFtXy0+bmV4dF9pbiA9IGNyYnVmXzsKKyAgICB3c3RyZWFtXy0+bmV4dF9pbiA9IHV3YnVmXzsKKyAgICByc3RyZWFtXy0+bmV4dF9vdXQgPSB1cmJ1Zl87CisgICAgd3N0cmVhbV8tPm5leHRfb3V0ID0gY3didWZfOworICAgIHJzdHJlYW1fLT5hdmFpbF9pbiA9IDA7CisgICAgd3N0cmVhbV8tPmF2YWlsX2luID0gMDsKICAgICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CiAgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOwogCkBAIC01Nyw3ICs1OCw3IEBACiAgICAgLy8gSGF2ZSB0byBzZXQgdGhpcyBmbGFnIHNvIHdlIGtub3cgd2hldGhlciB0byBkZS1pbml0aWFsaXplLgogICAgIHJfaW5pdCA9IHRydWU7CiAKLSAgICBydiA9IGRlZmxhdGVJbml0KHdzdHJlYW1fLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04pOworICAgIHJ2ID0gZGVmbGF0ZUluaXQod3N0cmVhbV8sIGNvbXBfbGV2ZWxfKTsKICAgICBjaGVja1psaWJSdihydiwgd3N0cmVhbV8tPm1zZyk7CiAgIH0KIApAQCAtODAsOCArODEsOCBAQAogCiBpbmxpbmUgdm9pZCBUWmxpYlRyYW5zcG9ydDo6Y2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1lc3NhZ2UpIHsKICAgaWYgKHN0YXR1cyAhPSBaX09LKSB7Ci0gICAgc3RyaW5nIG91dHB1dCA9ICJUWmxpYlRyYW5zcG9ydDogemxpYiBmYWlsdXJlIGluIGRlc3RydWN0b3I6ICIgKwotICAgICAgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb246OmVycm9yTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UpOworICAgIHN0cmluZyBvdXRwdXQgPSAiVFpsaWJUcmFuc3BvcnQ6IHpsaWIgZmFpbHVyZSBpbiBkZXN0cnVjdG9yOiAiCisgICAgICAgICAgICAgICAgICAgICsgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb246OmVycm9yTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UpOwogICAgIEdsb2JhbE91dHB1dChvdXRwdXQuY19zdHIoKSk7CiAgIH0KIH0KQEAgLTExNyw4ICsxMTgsNiBAQAogICByZXR1cm4gKHJlYWRBdmFpbCgpID4gMCkgfHwgKHJzdHJlYW1fLT5hdmFpbF9pbiA+IDApIHx8IHRyYW5zcG9ydF8tPnBlZWsoKTsKIH0KIAotCi0KIC8vIFJFQURJTkcgU1RSQVRFR1kKIC8vCiAvLyBXZSBoYXZlIHR3byBidWZmZXJzIGZvciByZWFkaW5nOiBvbmUgY29udGFpbmluZyB0aGUgY29tcHJlc3NlZCBkYXRhIChjcmJ1Zl8pCkBAIC0xNDQsNyArMTQzLDcgQEAKICAgd2hpbGUgKHRydWUpIHsKICAgICAvLyBDb3B5IG91dCB3aGF0ZXZlciB3ZSBoYXZlIGF2YWlsYWJsZSwgdGhlbiBnaXZlIHRoZW0gdGhlIG1pbiBvZgogICAgIC8vIHdoYXQgd2UgaGF2ZSBhbmQgd2hhdCB0aGV5IHdhbnQsIHRoZW4gYWR2YW5jZSBpbmRpY2VzLgotICAgIGludCBnaXZlID0gc3RkOjptaW4oKHVpbnQzMl90KSByZWFkQXZhaWwoKSwgbmVlZCk7CisgICAgaW50IGdpdmUgPSAoc3RkOjptaW4pKCh1aW50MzJfdClyZWFkQXZhaWwoKSwgbmVlZCk7CiAgICAgbWVtY3B5KGJ1ZiwgdXJidWZfICsgdXJwb3NfLCBnaXZlKTsKICAgICBuZWVkIC09IGdpdmU7CiAgICAgYnVmICs9IGdpdmU7CkBAIC0xNzEsNyArMTcwLDcgQEAKICAgICB9CiAKICAgICAvLyBUaGUgdW5jb21wcmVzc2VkIHJlYWQgYnVmZmVyIGlzIGVtcHR5LCBzbyByZXNldCB0aGUgc3RyZWFtIGZpZWxkcy4KLSAgICByc3RyZWFtXy0+bmV4dF9vdXQgID0gdXJidWZfOworICAgIHJzdHJlYW1fLT5uZXh0X291dCA9IHVyYnVmXzsKICAgICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CiAgICAgdXJwb3NfID0gMDsKIApAQCAtMTk2LDcgKzE5NSw3IEBACiAgICAgaWYgKGdvdCA9PSAwKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJzdHJlYW1fLT5uZXh0X2luICA9IGNyYnVmXzsKKyAgICByc3RyZWFtXy0+bmV4dF9pbiA9IGNyYnVmXzsKICAgICByc3RyZWFtXy0+YXZhaWxfaW4gPSBnb3Q7CiAgIH0KIApAQCAtMjEyLDcgKzIxMSw2IEBACiAgIHJldHVybiB0cnVlOwogfQogCi0KIC8vIFdSSVRJTkcgU1RSQVRFR1kKIC8vCiAvLyBXZSBidWZmZXIgdXAgc21hbGwgd3JpdGVzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gemxpYiwgc28gb3VyIGxvZ2ljIGlzOgpAQCAtMjMzLDggKzIzMSw3IEBACiAKIHZvaWQgVFpsaWJUcmFuc3BvcnQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7CiAgIGlmIChvdXRwdXRfZmluaXNoZWRfKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsICJ3cml0ZSgpIGNhbGxlZCBhZnRlciBmaW5pc2goKSIpOwogICB9CiAKICAgLy8gemxpYidzICJkZWZsYXRlIiBmdW5jdGlvbiBoYXMgZW5vdWdoIGxvZ2ljIGluIGl0IHRoYXQgSSB0aGluawpAQCAtMjUzLDI1ICsyNTAsMzIgQEAKICAgfQogfQogCi12b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaCgpICB7Cit2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaCgpIHsKICAgaWYgKG91dHB1dF9maW5pc2hlZF8pIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CisgIH0KKworICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9CTE9DSyk7CisgIHV3cG9zXyA9IDA7CisKKyAgaWYod3N0cmVhbV8tPmF2YWlsX291dCA8IDYpeworICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOwogICB9CiAKICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZVTExfRkxVU0gpOwogfQogCi12b2lkIFRabGliVHJhbnNwb3J0OjpmaW5pc2goKSAgewordm9pZCBUWmxpYlRyYW5zcG9ydDo6ZmluaXNoKCkgewogICBpZiAob3V0cHV0X2ZpbmlzaGVkXykgewotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluaXNoKCkgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZpbmlzaCgpIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOwogICB9CiAKICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZJTklTSCk7CiB9CiAKLXZvaWQgVFpsaWJUcmFuc3BvcnQ6OmZsdXNoVG9UcmFuc3BvcnQoaW50IGZsdXNoKSAgewordm9pZCBUWmxpYlRyYW5zcG9ydDo6Zmx1c2hUb1RyYW5zcG9ydChpbnQgZmx1c2gpIHsKICAgLy8gd3JpdGUgcGVuZGluZyBkYXRhIGluIHV3YnVmXyB0byB6bGliCiAgIGZsdXNoVG9abGliKHV3YnVmXywgdXdwb3NfLCBmbHVzaCk7CiAgIHV3cG9zXyA9IDA7CkBAIC0yODYsMTggKzI5MCwxOCBAQAogfQogCiB2b2lkIFRabGliVHJhbnNwb3J0OjpmbHVzaFRvWmxpYihjb25zdCB1aW50OF90KiBidWYsIGludCBsZW4sIGludCBmbHVzaCkgewotICB3c3RyZWFtXy0+bmV4dF9pbiAgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihidWYpOworICB3c3RyZWFtXy0+bmV4dF9pbiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KGJ1Zik7CiAgIHdzdHJlYW1fLT5hdmFpbF9pbiA9IGxlbjsKIAogICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChmbHVzaCA9PSBaX05PX0ZMVVNIICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7CisgICAgaWYgKChmbHVzaCA9PSBaX05PX0ZMVVNIIHx8IGZsdXNoID09IFpfQkxPQ0spICYmIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwKSB7CiAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBJZiBvdXIgb3VwdXQgYnVmZmVyIGlzIGZ1bGwsIGZsdXNoIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KICAgICBpZiAod3N0cmVhbV8tPmF2YWlsX291dCA9PSAwKSB7CiAgICAgICB0cmFuc3BvcnRfLT53cml0ZShjd2J1Zl8sIGN3YnVmX3NpemVfKTsKLSAgICAgIHdzdHJlYW1fLT5uZXh0X291dCAgPSBjd2J1Zl87CisgICAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CiAgICAgICB3c3RyZWFtXy0+YXZhaWxfb3V0ID0gY3didWZfc2l6ZV87CiAgICAgfQogCkBAIC0zMTEsMTUgKzMxNSwxNSBAQAogCiAgICAgY2hlY2tabGliUnYoemxpYl9ydiwgd3N0cmVhbV8tPm1zZyk7CiAKLSAgICBpZiAoKGZsdXNoID09IFpfU1lOQ19GTFVTSCB8fCBmbHVzaCA9PSBaX0ZVTExfRkxVU0gpICYmCi0gICAgICAgIHdzdHJlYW1fLT5hdmFpbF9pbiA9PSAwICYmIHdzdHJlYW1fLT5hdmFpbF9vdXQgIT0gMCkgeworICAgIGlmICgoZmx1c2ggPT0gWl9TWU5DX0ZMVVNIIHx8IGZsdXNoID09IFpfRlVMTF9GTFVTSCkgJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDAKKyAgICAgICAgJiYgd3N0cmVhbV8tPmF2YWlsX291dCAhPSAwKSB7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KIH0KIAogY29uc3QgdWludDhfdCogVFpsaWJUcmFuc3BvcnQ6OmJvcnJvdyh1aW50OF90KiBidWYsIHVpbnQzMl90KiBsZW4pIHsKLSAgKHZvaWQpIGJ1ZjsKKyAgKHZvaWQpYnVmOwogICAvLyBEb24ndCB0cnkgdG8gYmUgY2xldmVyIHdpdGggc2hpZnRpbmcgYnVmZmVycy4KICAgLy8gSWYgd2UgaGF2ZSBlbm91Z2ggZGF0YSwgZ2l2ZSBhIHBvaW50ZXIgdG8gaXQsCiAgIC8vIG90aGVyd2lzZSBsZXQgdGhlIHByb3Rjb2wgdXNlIGl0cyBzbG93IHBhdGguCkBAIC0zMzQsOCArMzM4LDcgQEAKICAgaWYgKHJlYWRBdmFpbCgpID49IChpbnQpbGVuKSB7CiAgICAgdXJwb3NfICs9IGxlbjsKICAgfSBlbHNlIHsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImNvbnN1bWUgZGlkIG5vdCBmb2xsb3cgYSBib3Jyb3cuIik7CiAgIH0KIH0KIApAQCAtMzQ5LDE0ICszNTIsMTMgQEAKICAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiByZWFkaW5nIGlzIGNvbXBsZXRlLgogICAvLyBJZiB0aGUgY2FsbGVyIHN0aWxsIGhhcyB1bnJlYWQgZGF0YSwgdGhyb3cgYW4gZXhjZXB0aW9uLgogICBpZiAocmVhZEF2YWlsKCkgPiAwKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Q09SUlVQVEVEX0RBVEEsCi0gICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mIHpsaWIgc3RyZWFtIik7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mIHpsaWIgc3RyZWFtIik7CiAgIH0KIAogICAvLyBSZXNldCB0aGUgcnN0cmVhbSBmaWVsZHMsIGluIGNhc2UgYXZhaWxfb3V0IGlzIDAuCiAgIC8vIChTaW5jZSByZWFkQXZhaWwoKSBpcyAwLCB3ZSBrbm93IHRoZXJlIGlzIG5vIHVucmVhZCBkYXRhIGluIHVyYnVmXykKLSAgcnN0cmVhbV8tPm5leHRfb3V0ICA9IHVyYnVmXzsKKyAgcnN0cmVhbV8tPm5leHRfb3V0ID0gdXJidWZfOwogICByc3RyZWFtXy0+YXZhaWxfb3V0ID0gdXJidWZfc2l6ZV87CiAgIHVycG9zXyA9IDA7CiAKQEAgLTM5NSw2ICszOTcsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJpZnlDaGVja3N1bSgpIGNhbGxlZCBiZWZvcmUgZW5kIG9mICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemxpYiBzdHJlYW0iKTsKIH0KLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKaW5kZXggNjA3OTY5Yy4uYjQ1ZWM0MyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaApAQCAtMjAsMjMgKzIwLDI1IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVmlydHVhbFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KKyNpbmNsdWRlIDx6bGliLmg+CiAKIHN0cnVjdCB6X3N0cmVhbV9zOwogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0cmFuc3BvcnQgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBjbGFzcyBUWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbiA6IHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSBwdWJsaWM6Ci0gIFRabGliVHJhbnNwb3J0RXhjZXB0aW9uKGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgOgotICAgIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2Uoc3RhdHVzLCBtc2cpKSwKLSAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKLSAgICB6bGliX21zZ18obXNnID09IE5VTEwgPyAiKG51bGwpIiA6IG1zZykge30KK3B1YmxpYzoKKyAgVFpsaWJUcmFuc3BvcnRFeGNlcHRpb24oaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKQorICAgIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgZXJyb3JNZXNzYWdlKHN0YXR1cywgbXNnKSksCisgICAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKKyAgICAgIHpsaWJfbXNnXyhtc2cgPT0gTlVMTCA/ICIobnVsbCkiIDogbXNnKSB7fQogCi0gIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKICAgaW50IGdldFpsaWJTdGF0dXMoKSB7IHJldHVybiB6bGliX3N0YXR1c187IH0KICAgc3RkOjpzdHJpbmcgZ2V0WmxpYk1lc3NhZ2UoKSB7IHJldHVybiB6bGliX21zZ187IH0KQEAgLTQ5LDcgKzUxLDcgQEAKICAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOwogICAgIH0KICAgICBydiArPSAiIChzdGF0dXMgPSAiOwotICAgIHJ2ICs9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0YXR1cyk7CisgICAgcnYgKz0gdG9fc3RyaW5nKHN0YXR1cyk7CiAgICAgcnYgKz0gIikiOwogICAgIHJldHVybiBydjsKICAgfQpAQCAtNTksMjAgKzYxLDE0IEBACiB9OwogCiAvKioKLSAqIFRoaXMgdHJhbnNwb3J0IHVzZXMgemxpYidzIGNvbXByZXNzZWQgZm9ybWF0IG9uIHRoZSAiZmFyIiBzaWRlLgotICoKLSAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgVFpsaWJUcmFuc3BvcnQgb2JqZWN0czoKLSAqIC0gU3RhbmRhbG9uZSBvYmplY3RzIGFyZSB1c2VkIHRvIGVuY29kZSBzZWxmLWNvbnRhaW5lZCBjaHVua3Mgb2YgZGF0YQotICogICAobGlrZSBzdHJ1Y3R1cmVzKS4gIFRoZXkgaW5jbHVkZSBjaGVja3N1bXMuCi0gKiAtIE5vbi1zdGFuZGFsb25lIHRyYW5zcG9ydHMgYXJlIHVzZWQgZm9yIFJQQy4gIFRoZXkgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisgKiBUaGlzIHRyYW5zcG9ydCB1c2VzIHpsaWIgdG8gY29tcHJlc3Mgb24gd3JpdGUgYW5kIGRlY29tcHJlc3Mgb24gcmVhZAogICoKICAqIFRPRE8oZHJlaXNzKTogRG9uJ3QgZG8gYW4gZXh0cmEgY29weSBvZiB0aGUgY29tcHJlc3NlZCBkYXRhIGlmCiAgKiAgICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpcyBUQnVmZmVyZWQgb3IgVE1lbW9yeS4KICAqCiAgKi8KIGNsYXNzIFRabGliVHJhbnNwb3J0IDogcHVibGljIFRWaXJ0dWFsVHJhbnNwb3J0PFRabGliVHJhbnNwb3J0PiB7Ci0gcHVibGljOgotCitwdWJsaWM6CiAgIC8qKgogICAgKiBAcGFyYW0gdHJhbnNwb3J0ICAgIFRoZSB0cmFuc3BvcnQgdG8gcmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbQogICAgKiAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSBjb21wcmVzc2VkIGRhdGEgdG8uCkBAIC04MCwzNyArNzYsMzYgQEAKICAgICogQHBhcmFtIGNyYnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciByZWFkaW5nLgogICAgKiBAcGFyYW0gdXdidWZfc2l6ZSAgIFVuY29tcHJlc3NlZCBidWZmZXIgc2l6ZSBmb3Igd3JpdGluZy4KICAgICogQHBhcmFtIGN3YnVmX3NpemUgICBDb21wcmVzc2VkIGJ1ZmZlciBzaXplIGZvciB3cml0aW5nLgotICAgKgotICAgKiBUT0RPKGRyZWlzcyk6IFdyaXRlIGEgY29uc3RydWN0b3IgdGhhdCBpc24ndCBhIHBhaW4uCisgICAqIEBwYXJhbSBjb21wX2xldmVsICAgQ29tcHJlc3Npb24gbGV2ZWwgKDA9bm9uZVtmYXN0XSwgNj1kZWZhdWx0LCA5PW1heFtzbG93XSkuCiAgICAqLwotICBUWmxpYlRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgIFRabGliVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAogICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKICAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCBjd2J1Zl9zaXplID0gREVGQVVMVF9DV0JVRl9TSVpFKSA6Ci0gICAgdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAotICAgIHVycG9zXygwKSwKLSAgICB1d3Bvc18oMCksCi0gICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKLSAgICBvdXRwdXRfZmluaXNoZWRfKGZhbHNlKSwKLSAgICB1cmJ1Zl9zaXplXyh1cmJ1Zl9zaXplKSwKLSAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKLSAgICB1d2J1Zl9zaXplXyh1d2J1Zl9zaXplKSwKLSAgICBjd2J1Zl9zaXplXyhjd2J1Zl9zaXplKSwKLSAgICB1cmJ1Zl8oTlVMTCksCi0gICAgY3JidWZfKE5VTEwpLAotICAgIHV3YnVmXyhOVUxMKSwKLSAgICBjd2J1Zl8oTlVMTCksCi0gICAgcnN0cmVhbV8oTlVMTCksCi0gICAgd3N0cmVhbV8oTlVMTCkKLSAgeworICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSwKKyAgICAgICAgICAgICAgICAgaW50MTZfdCBjb21wX2xldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKQorICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAorICAgICAgdXJwb3NfKDApLAorICAgICAgdXdwb3NfKDApLAorICAgICAgaW5wdXRfZW5kZWRfKGZhbHNlKSwKKyAgICAgIG91dHB1dF9maW5pc2hlZF8oZmFsc2UpLAorICAgICAgdXJidWZfc2l6ZV8odXJidWZfc2l6ZSksCisgICAgICBjcmJ1Zl9zaXplXyhjcmJ1Zl9zaXplKSwKKyAgICAgIHV3YnVmX3NpemVfKHV3YnVmX3NpemUpLAorICAgICAgY3didWZfc2l6ZV8oY3didWZfc2l6ZSksCisgICAgICB1cmJ1Zl8oTlVMTCksCisgICAgICBjcmJ1Zl8oTlVMTCksCisgICAgICB1d2J1Zl8oTlVMTCksCisgICAgICBjd2J1Zl8oTlVMTCksCisgICAgICByc3RyZWFtXyhOVUxMKSwKKyAgICAgIHdzdHJlYW1fKE5VTEwpLAorICAgICAgY29tcF9sZXZlbF8oY29tcF9sZXZlbCkgewogICAgIGlmICh1d2J1Zl9zaXplXyA8IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFKSB7CiAgICAgICAvLyBIYXZlIHRvIGNvcHkgdGhpcyBpbnRvIGEgbG9jYWwgYmVjYXVzZSBvZiBhIGxpbmtpbmcgaXNzdWUuCiAgICAgICBpbnQgbWluaW11bSA9IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFOwotICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKLSAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKLSAgICAgICAgICArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KG1pbmltdW0pICsgIi4iKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QkFEX0FSR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUWkxpYlRyYW5zcG9ydDogdW5jb21wcmVzc2VkIHdyaXRlIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRvX3N0cmluZyhtaW5pbXVtKSArICIuIik7CiAgICAgfQogCiAgICAgdHJ5IHsKQEAgLTE0NiwxMyArMTQxLDkgQEAKICAgYm9vbCBpc09wZW4oKTsKICAgYm9vbCBwZWVrKCk7CiAKLSAgdm9pZCBvcGVuKCkgewotICAgIHRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQorICB2b2lkIG9wZW4oKSB7IHRyYW5zcG9ydF8tPm9wZW4oKTsgfQogCi0gIHZvaWQgY2xvc2UoKSB7Ci0gICAgdHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQorICB2b2lkIGNsb3NlKCkgeyB0cmFuc3BvcnRfLT5jbG9zZSgpOyB9CiAKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAKQEAgLTE4MSwxNiArMTcyLDE3IEBACiAgICAqLwogICB2b2lkIHZlcmlmeUNoZWNrc3VtKCk7CiAKLSAgIC8qKgotICAgICogVE9ETyhzb21lb25lX3NtYXJ0KTogQ2hvb3NlIHNtYXJ0IGRlZmF1bHRzLgotICAgICovCisgIC8qKgorICAgKiBUT0RPKHNvbWVvbmVfc21hcnQpOiBDaG9vc2Ugc21hcnQgZGVmYXVsdHMuCisgICAqLwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfVVJCVUZfU0laRSA9IDEyODsKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0NSQlVGX1NJWkUgPSAxMDI0OwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfVVdCVUZfU0laRSA9IDEyODsKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0NXQlVGX1NJWkUgPSAxMDI0OwogCi0gcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIGNvbnN0IHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KIAorcHJvdGVjdGVkOgogICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdihpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpOwogICBpbmxpbmUgdm9pZCBjaGVja1psaWJSdk5vdGhyb3coaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKICAgaW5saW5lIGludCByZWFkQXZhaWwoKTsKQEAgLTE5OCwzOCArMTkwLDEyIEBACiAgIHZvaWQgZmx1c2hUb1psaWIoY29uc3QgdWludDhfdCogYnVmLCBpbnQgbGVuLCBpbnQgZmx1c2gpOwogICBib29sIHJlYWRGcm9tWmxpYigpOwogCi0gcHJpdmF0ZToKLSAgLy8gRGVwcmVjYXRlZCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuCi0gIC8vCi0gIC8vIFRoaXMgdXNlZCB0byBiZSB0aGUgY29uc3RydWN0b3Igc2lnbmF0dXJlLiAgSWYgeW91IGFyZSBnZXR0aW5nIGEgY29tcGlsZQotICAvLyBlcnJvciBiZWNhdXNlIHlvdSBhcmUgdHJ5aW5nIHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yLCB5b3UgbmVlZCB0byB1cGRhdGUKLSAgLy8geW91ciBjb2RlIGFzIGZvbGxvd3M6Ci0gIC8vIC0gUmVtb3ZlIHRoZSB1c2VfZm9yX3JwYyBhcmd1bWVudCBpbiB0aGUgY29uc3RydWN0dXIuCi0gIC8vICAgVGhlcmUgaXMgbm8gbG9uZ2VyIGFueSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFJQQyBhbmQgc3RhbmRhbG9uZSB6bGliCi0gIC8vICAgdHJhbnNwb3J0cy4gIChQcmV2aW91c2x5LCBvbmx5IHN0YW5kYWxvbmUgd2FzIGFsbG93ZWQsIGFueXdheS4pCi0gIC8vIC0gUmVwbGFjZSBUWmxpYlRyYW5zcG9ydDo6Zmx1c2goKSBjYWxscyB3aXRoIFRabGliVHJhbnNwb3J0OjpmaW5pc2goKQotICAvLyAgIGluIHlvdXIgY29kZS4gIFByZXZpb3VzbHksIGZsdXNoKCkgdXNlZCB0byBmaW5pc2ggdGhlIHpsaWIgc3RyZWFtLgotICAvLyAgIE5vdyBmbHVzaCgpIG9ubHkgZmx1c2hlcyBvdXQgcGVuZGluZyBkYXRhLCBzbyBtb3JlIHdyaXRlcyBjYW4gYmUKLSAgLy8gICBwZXJmb3JtZWQgYWZ0ZXIgYSBmbHVzaCgpLiAgVGhlIGZpbmlzaCgpIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmaW5hbGl6ZQotICAvLyAgIHRoZSB6bGliIHN0cmVhbS4KLSAgLy8KLSAgLy8gSWYgd2UgZG9uJ3QgZGVjbGFyZSB0aGlzIGNvbnN0cnVjdG9yLCBvbGQgY29kZSB3cml0dGVuIGFzCi0gIC8vIFRabGliVHJhbnNwb3J0KHRyYW5zLCBmYWxzZSkgc3RpbGwgY29tcGlsZXMgYnV0IGJlaGF2ZXMgaW5jb3JyZWN0bHkuCi0gIC8vIFRoZSBzZWNvbmQgYm9vbCBhcmd1bWVudCBpcyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBhbmQgdXNlZCBhcyB0aGUKLSAgLy8gdXJidWZfc2l6ZS4KLSAgVFpsaWJUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBib29sIHVzZV9mb3JfcnBjLAotICAgICAgICAgICAgICAgICBpbnQgdXJidWZfc2l6ZSA9IERFRkFVTFRfVVJCVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgaW50IGNyYnVmX3NpemUgPSBERUZBVUxUX0NSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgIGludCB1d2J1Zl9zaXplID0gREVGQVVMVF9VV0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICBpbnQgY3didWZfc2l6ZSA9IERFRkFVTFRfQ1dCVUZfU0laRSk7Ci0KLSBwcm90ZWN0ZWQ6Citwcm90ZWN0ZWQ6CiAgIC8vIFdyaXRlcyBzbWFsbGVyIHRoYW4gdGhpcyBhcmUgYnVmZmVyZWQgdXAuCiAgIC8vIExhcmdlciAob3IgZXF1YWwpIHdyaXRlcyBhcmUgZHVtcGVkIHN0cmFpZ2h0IHRvIHpsaWIuCiAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5fRElSRUNUX0RFRkxBVEVfU0laRSA9IDMyOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogCiAgIGludCB1cnBvc187CiAgIGludCB1d3Bvc187CkBAIC0yNTEsMjYgKzIxNywyNiBAQAogCiAgIHN0cnVjdCB6X3N0cmVhbV9zKiByc3RyZWFtXzsKICAgc3RydWN0IHpfc3RyZWFtX3MqIHdzdHJlYW1fOwotfTsKIAorICBjb25zdCBpbnQgY29tcF9sZXZlbF87Cit9OwogCiAvKioKICAqIFdyYXBzIGEgdHJhbnNwb3J0IGludG8gYSB6bGliYmVkIG9uZS4KICAqCiAgKi8KIGNsYXNzIFRabGliVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gcHVibGljOgorcHVibGljOgogICBUWmxpYlRyYW5zcG9ydEZhY3RvcnkoKSB7fQogCiAgIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUWmxpYlRyYW5zcG9ydCh0cmFucykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFpsaWJUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKLQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CiAKICNlbmRpZiAvLyAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RaTElCVFJBTlNQT1JUX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmNwcAppbmRleCA2MjAxZWRhLi44MjA4MjhmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5jcHAKQEAgLTE3LDc2ICsxNyw5MCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIkdldFRpbWVPZkRheS5oIgotI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oPgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKIC8vIHdpbjMyCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTVNDX0VYVEVOU0lPTlMpCi0jICAgZGVmaW5lIERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUyAgMTE2NDQ0NzM2MDAwMDAwMDBVaTY0Ci0jZWxzZQotIyAgIGRlZmluZSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1MgIDExNjQ0NDczNjAwMDAwMDAwVUxMCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjZW5kaWYKIAotc3RydWN0IHRpbWV6b25lCi17Ci0gICAgaW50ICB0el9taW51dGVzd2VzdDsgLyogbWludXRlcyBXIG9mIEdyZWVud2ljaCAqLwotICAgIGludCAgdHpfZHN0dGltZTsgICAgIC8qIHR5cGUgb2YgZHN0IGNvcnJlY3Rpb24gKi8KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykKKyNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVWk2NAorI2Vsc2UKKyNkZWZpbmUgREVMVEFfRVBPQ0hfSU5fTUlDUk9TRUNTIDExNjQ0NDczNjAwMDAwMDAwVUxMCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorc3RydWN0IHRpbWV6b25lIHsKKyAgaW50IHR6X21pbnV0ZXN3ZXN0OyAvKiBtaW51dGVzIFcgb2YgR3JlZW53aWNoICovCisgIGludCB0el9kc3R0aW1lOyAgICAgLyogdHlwZSBvZiBkc3QgY29ycmVjdGlvbiAqLwogfTsKKyNlbmRpZgogCi1pbnQgZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICogdHYsIHN0cnVjdCB0aW1lem9uZSAqIHR6KQotewotICAgIEZJTEVUSU1FICAgICAgICAgZnQ7Ci0gICAgdW5zaWduZWQgX19pbnQ2NCB0bXByZXMoMCk7Ci0gICAgc3RhdGljIGludCAgICAgICB0emZsYWc7CisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKK2ludCB0aHJpZnRfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsKiB0diwgc3RydWN0IHRpbWV6b25lKiB0eikgeworICByZXR1cm4gZ2V0dGltZW9mZGF5KHR2LHR6KTsKK30KKyNlbHNlCitpbnQgdGhyaWZ0X2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCogdHYsIHN0cnVjdCB0aW1lem9uZSogdHopIHsKKyAgRklMRVRJTUUgZnQ7CisgIHVuc2lnbmVkIF9faW50NjQgdG1wcmVzKDApOworICBzdGF0aWMgaW50IHR6ZmxhZzsKIAotICAgIGlmIChOVUxMICE9IHR2KQotICAgIHsKLSAgICAgICAgR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUoJmZ0KTsKKyAgaWYgKE5VTEwgIT0gdHYpIHsKKyAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwogCi0gICAgICAgIHRtcHJlcyB8PSBmdC5kd0hpZ2hEYXRlVGltZTsKLSAgICAgICAgdG1wcmVzIDw8PSAzMjsKLSAgICAgICAgdG1wcmVzIHw9IGZ0LmR3TG93RGF0ZVRpbWU7CisgICAgdG1wcmVzIHw9IGZ0LmR3SGlnaERhdGVUaW1lOworICAgIHRtcHJlcyA8PD0gMzI7CisgICAgdG1wcmVzIHw9IGZ0LmR3TG93RGF0ZVRpbWU7CiAKLSAgICAgICAgLypjb252ZXJ0aW5nIGZpbGUgdGltZSB0byB1bml4IGVwb2NoKi8KLSAgICAgICAgdG1wcmVzIC09IERFTFRBX0VQT0NIX0lOX01JQ1JPU0VDUzsgCi0gICAgICAgIHRtcHJlcyAvPSAxMDsgIC8qY29udmVydCBpbnRvIG1pY3Jvc2Vjb25kcyovCi0gICAgICAgIHR2LT50dl9zZWMgPSAobG9uZykodG1wcmVzIC8gMTAwMDAwMFVMKTsKLSAgICAgICAgdHYtPnR2X3VzZWMgPSAobG9uZykodG1wcmVzICUgMTAwMDAwMFVMKTsKKyAgICAvKmNvbnZlcnRpbmcgZmlsZSB0aW1lIHRvIHVuaXggZXBvY2gqLworICAgIHRtcHJlcyAtPSBERUxUQV9FUE9DSF9JTl9NSUNST1NFQ1M7CisgICAgdG1wcmVzIC89IDEwOyAvKmNvbnZlcnQgaW50byBtaWNyb3NlY29uZHMqLworICAgIHR2LT50dl9zZWMgPSAobG9uZykodG1wcmVzIC8gMTAwMDAwMFVMKTsKKyAgICB0di0+dHZfdXNlYyA9IChsb25nKSh0bXByZXMgJSAxMDAwMDAwVUwpOworICB9CisKKyAgaWYgKE5VTEwgIT0gdHopIHsKKyAgICBpZiAoIXR6ZmxhZykgeworICAgICAgX3R6c2V0KCk7CisgICAgICB0emZsYWcrKzsKICAgICB9CiAKLSAgICBpZiAoTlVMTCAhPSB0eikKLSAgICB7Ci0gICAgICAgIGlmICghdHpmbGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdHpzZXQoKTsKLSAgICAgICAgICAgIHR6ZmxhZysrOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyB0aW1lX3pvbmUoMCk7Ci0gICAgICAgIGVycm5vX3QgZXJyKF9nZXRfdGltZXpvbmUoJnRpbWVfem9uZSkpOwotICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ei0+dHpfbWludXRlc3dlc3QgPSB0aW1lX3pvbmUgLyA2MDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkYXlfbGlnaHQoMCk7Ci0gICAgICAgIGVyciA9IChfZ2V0X2RheWxpZ2h0KCZkYXlfbGlnaHQpKTsKLSAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikKLSAgICAgICAgewotICAgICAgICAgICAgdHotPnR6X2RzdHRpbWUgPSBkYXlfbGlnaHQ7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgIGxvbmcgdGltZV96b25lKDApOworICAgIGVycm5vX3QgZXJyKF9nZXRfdGltZXpvbmUoJnRpbWVfem9uZSkpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgIHR6LT50el9taW51dGVzd2VzdCA9IHRpbWVfem9uZSAvIDYwOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIC0xOworICAgIGludCBkYXlfbGlnaHQoMCk7CisgICAgZXJyID0gKF9nZXRfZGF5bGlnaHQoJmRheV9saWdodCkpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgIHR6LT50el9kc3R0aW1lID0gZGF5X2xpZ2h0OworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgdGhyaWZ0X3NsZWVwKHVuc2lnbmVkIGludCBzZWNvbmRzKSB7CisgIDo6U2xlZXAoc2Vjb25kcyAqIDEwMDApOworICByZXR1cm4gMDsKK30KK2ludCB0aHJpZnRfdXNsZWVwKHVuc2lnbmVkIGludCBtaWNyb3NlY29uZHMpIHsKKyAgdW5zaWduZWQgaW50IG1pbGxpc2Vjb25kcyA9IChtaWNyb3NlY29uZHMgKyA5OTkpIC8gMTAwMDsKKyAgOjpTbGVlcChtaWxsaXNlY29uZHMpOworICByZXR1cm4gMDsKK30KKworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpIHsKKyAgc3RyY3B5KF9idWYsIGN0aW1lKF9jbG9jaykpOworICByZXR1cm4gX2J1ZjsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL0dldFRpbWVPZkRheS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmgKaW5kZXggZjZiZGYxYy4uNzYyYWM1ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvR2V0VGltZU9mRGF5LmgKQEAgLTI4LDYgKzI4LDE3IEBACiAjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCiAjZW5kaWYKIAotaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2LCBzdHJ1Y3QgdGltZXpvbmUgKiB0eik7CisjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0cnVjdCB0aHJpZnRfdGltZXNwZWMgeworICBpbnQ2NF90IHR2X3NlYzsKKyAgaW50NjRfdCB0dl9uc2VjOworfTsKKworaW50IHRocmlmdF9nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwqIHR2LCBzdHJ1Y3QgdGltZXpvbmUqIHR6KTsKK2ludCB0aHJpZnRfc2xlZXAodW5zaWduZWQgaW50IHNlY29uZHMpOworaW50IHRocmlmdF91c2xlZXAodW5zaWduZWQgaW50IG1pY3JvX3NlY29uZHMpOworY2hhciogdGhyaWZ0X2N0aW1lX3IoY29uc3QgdGltZV90KiBfY2xvY2ssIGNoYXIqIF9idWYpOwogCiAjZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0dFVFRJTUVPRkRBWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3BlcmF0b3JzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaAppbmRleCA5NWQ4ZTNlLi45Yjg2MDk2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaApAQCAtMjQsMTcgKzI0LDE3IEBACiAjcHJhZ21hIG9uY2UKICNlbmRpZiAvLyBfTVNDX1ZFUgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgewogCiBjbGFzcyBURW51bUl0ZXJhdG9yOwogCi1pbmxpbmUgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgVEVudW1JdGVyYXRvciYsIGNvbnN0IFRFbnVtSXRlcmF0b3ImKQotewotICAgIC8vIE5vdCBlbnRpcmVseSBzdXJlIHdoYXQgdGhlIHRlc3Qgc2hvdWxkIGJlIGhlcmUuIEl0IGlzIG9ubHkgdG8gZW5hYmxlCi0gICAgLy8gaXRlcmF0b3IgZGVidWdnaW5nIGFuZCBpcyBub3QgdXNlZCBpbiByZWxlYXNlIG1vZGUuCi0gICAgcmV0dXJuIHRydWU7CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRFbnVtSXRlcmF0b3ImLCBjb25zdCBURW51bUl0ZXJhdG9yJikgeworICAvLyBOb3QgZW50aXJlbHkgc3VyZSB3aGF0IHRoZSB0ZXN0IHNob3VsZCBiZSBoZXJlLiBJdCBpcyBvbmx5IHRvIGVuYWJsZQorICAvLyBpdGVyYXRvciBkZWJ1Z2dpbmcgYW5kIGlzIG5vdCB1c2VkIGluIHJlbGVhc2UgbW9kZS4KKyAgcmV0dXJuIHRydWU7CiB9Ci0KLX19IC8vIGFwYWNoZTo6dGhyaWZ0Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfT1BFUkFUT1JTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjNmZlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmNwcApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Njb3BlX2V4aXQuaHBwPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitUT3ZlcmxhcHBlZFdvcmtJdGVtOjpUT3ZlcmxhcHBlZFdvcmtJdGVtKCkKKyAgOiBTTElTVF9FTlRSWSgpLAorICAgIGFjdGlvbihVTktOT1dOKSwKKyAgICBoKElOVkFMSURfSEFORExFX1ZBTFVFKSwKKyAgICBidWZmZXIoTlVMTCksCisgICAgYnVmZmVyX2xlbigwKSwKKyAgICBvdmVybGFwKCksCisgICAgbGFzdF9lcnJvcigwKSwKKyAgICBzdWNjZXNzKFRSVUUpIHsKK30KKwordm9pZCBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpyZXNldCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbiwgSEFORExFIGV2ZW50KSB7CisgIG1lbXNldCgmb3ZlcmxhcCwgMCwgc2l6ZW9mKG92ZXJsYXApKTsKKyAgb3ZlcmxhcC5oRXZlbnQgPSBldmVudDsKKyAgYnVmZmVyID0gYnVmOworICBidWZmZXJfbGVuID0gbGVuOworICBsYXN0X2Vycm9yID0gMDsKKyAgc3VjY2VzcyA9IEZBTFNFOworfQorCit1aW50MzJfdCBUT3ZlcmxhcHBlZFdvcmtJdGVtOjpvdmVybGFwcGVkUmVzdWx0cyhib29sIHNpZ25hbF9mYWlsdXJlKSB7CisgIERXT1JEIGJ5dGVzID0gMDsKKyAgQk9PTCByZXN1bHQgPSA6OkdldE92ZXJsYXBwZWRSZXN1bHQoaCwgJm92ZXJsYXAsICZieXRlcywgVFJVRSk7CisgIGlmIChzaWduYWxfZmFpbHVyZSAmJiAhcmVzdWx0KSAvLyBnZXQgb3ZlcmxhcHBlZCBlcnJvciBjYXNlCisgIHsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZSA6OkdldE92ZXJsYXBwZWRSZXN1bHQgZXJyb3JlZCBHTEU9IiwgOjpHZXRMYXN0RXJyb3IoKSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVFBpcGU6IEdldE92ZXJsYXBwZWRSZXN1bHQgZmFpbGVkIik7CisgIH0KKyAgcmV0dXJuIGJ5dGVzOworfQorCitib29sIFRPdmVybGFwcGVkV29ya0l0ZW06OnByb2Nlc3MoKSB7CisgIEJPT1NUX1NDT1BFX0VYSVQoKCZkb25lU3VibWl0dGluZ0V2ZW50KSkgeyBTZXRFdmVudChkb25lU3VibWl0dGluZ0V2ZW50LmgpOyB9CisgIEJPT1NUX1NDT1BFX0VYSVRfRU5ECisKKyAgc3dpdGNoIChhY3Rpb24pIHsKKyAgY2FzZSAoQ09OTkVDVCk6CisgICAgc3VjY2VzcyA9IDo6Q29ubmVjdE5hbWVkUGlwZShoLCAmb3ZlcmxhcCk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSAoUkVBRCk6CisgICAgc3VjY2VzcyA9IDo6UmVhZEZpbGUoaCwgYnVmZmVyLCBidWZmZXJfbGVuLCBOVUxMLCAmb3ZlcmxhcCk7CisgICAgaWYgKHN1Y2Nlc3MgPT0gRkFMU0UpCisgICAgICBsYXN0X2Vycm9yID0gOjpHZXRMYXN0RXJyb3IoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgY2FzZSAoQ0FOQ0VMSU8pOgorICAgIHN1Y2Nlc3MgPSA6OkNhbmNlbElvKGgpOworICAgIGlmIChzdWNjZXNzID09IEZBTFNFKQorICAgICAgbGFzdF9lcnJvciA9IDo6R2V0TGFzdEVycm9yKCk7CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgKFNUT1ApOgorICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWRkV29ya0l0ZW0oVE92ZXJsYXBwZWRXb3JrSXRlbSogaXRlbSkgeworICBJbnRlcmxvY2tlZFB1c2hFbnRyeVNMaXN0KCZ3b3JrTGlzdF8sIGl0ZW0pOworICBTZXRFdmVudCh3b3JrQXZhaWxhYmxlRXZlbnRfLmgpOworICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGl0ZW0tPmRvbmVTdWJtaXR0aW5nRXZlbnQuaCwgSU5GSU5JVEUpOworfQorCitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6YWNxdWlyZV9pbnN0YW5jZSgpIHsKKyAgVEF1dG9Dcml0IGxvY2soaW5zdGFuY2VHdWFyZF8pOworICBpZiAoaW5zdGFuY2VfID09IE5VTEwpIHsKKyAgICBhc3NlcnQoaW5zdGFuY2VSZWZDb3VudF8gPT0gMCk7CisgICAgaW5zdGFuY2VfID0gbmV3IFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDsKKyAgfQorICArK2luc3RhbmNlUmVmQ291bnRfOworICByZXR1cm4gaW5zdGFuY2VfOworfQordm9pZCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnJlbGVhc2VfaW5zdGFuY2UoKSB7CisgIFRBdXRvQ3JpdCBsb2NrKGluc3RhbmNlR3VhcmRfKTsKKyAgaWYgKC0taW5zdGFuY2VSZWZDb3VudF8gPT0gMCkgeworICAgIGRlbGV0ZSBpbnN0YW5jZV87CisgICAgaW5zdGFuY2VfID0gTlVMTDsKKyAgfQorfQorCitUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OlRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpIHsKKyAgc3RvcEl0ZW1fLmFjdGlvbiA9IFRPdmVybGFwcGVkV29ya0l0ZW06OlNUT1A7CisKKyAgSW5pdGlhbGl6ZVNMaXN0SGVhZCgmd29ya0xpc3RfKTsKKyAgdGhyZWFkXyA9IChIQU5ETEUpX2JlZ2ludGhyZWFkZXgoTlVMTCwgMCwgdGhyZWFkX3Byb2MsIHRoaXMsIDAsIE5VTEwpOworICBpZiAodGhyZWFkXyA9PSAwKSB7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkLCBlcnJubz0iLCBlcnJubyk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkIHVuYWJsZSB0byBjcmVhdGUgdGhyZWFkIik7CisgIH0KK30KKworVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjp+VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKCkgeworICBhZGRXb3JrSXRlbSgmc3RvcEl0ZW1fKTsKKyAgOjpXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF8sIElORklOSVRFKTsKKyAgQ2xvc2VIYW5kbGUodGhyZWFkXyk7Cit9CisKK3ZvaWQgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpydW4oKSB7CisgIGZvciAoOzspIHsKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHdvcmtBdmFpbGFibGVFdmVudF8uaCwgSU5GSU5JVEUpOworICAgIC8vIHRvZG8gY2hlY2sgcmVzdWx0CisgICAgU0xJU1RfRU5UUlkqIGVudHJ5ID0gTlVMTDsKKyAgICB3aGlsZSAoKGVudHJ5ID0gSW50ZXJsb2NrZWRQb3BFbnRyeVNMaXN0KCZ3b3JrTGlzdF8pKSAhPSBOVUxMKSB7CisgICAgICBUT3ZlcmxhcHBlZFdvcmtJdGVtJiBpdGVtID0gKnN0YXRpY19jYXN0PFRPdmVybGFwcGVkV29ya0l0ZW0qPihlbnRyeSk7CisgICAgICBpZiAoIWl0ZW0ucHJvY2VzcygpKQorICAgICAgICByZXR1cm47CisgICAgfQorICB9Cit9CisKK3Vuc2lnbmVkIF9fc3RkY2FsbCBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OnRocmVhZF9wcm9jKHZvaWQqIGFkZHIpIHsKKyAgc3RhdGljX2Nhc3Q8VE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKj4oYWRkciktPnJ1bigpOworICByZXR1cm4gMDsKK30KKworVENyaXRpY2FsU2VjdGlvbiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6Omluc3RhbmNlR3VhcmRfOworVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6Omluc3RhbmNlXzsKK3VpbnQzMl90IFRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZDo6aW5zdGFuY2VSZWZDb3VudF8gPSAwOworfQorfQorfSAvLyBhcGFjaDo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9XSU5ET1dTX092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkX0hfCisjZGVmaW5lIF9USFJJRlRfV0lORE9XU19PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZF9IXyAxCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIk92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmggaXMgb25seSB1c2FibGUgb24gV2luZG93cyIKKyNlbmRpZgorCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU3luYy5oPgorI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KKyNpbmNsdWRlIDxXaW5kb3dzLmg+CisKKy8qCisgICoqKiBXaHkgZG9lcyB0aGlzIGNsYXNzIGV4aXN0PworICBJbiBzaG9ydCwgYmVjYXVzZSB3ZSB3YW50IHRvIGVuYWJsZSBzb21ldGhpbmcgc2ltaWxhciB0byBhICJzZWxlY3QiIGxvb3AsIG9uIFdpbmRvd3MsIHdpdGgKKyAgbmFtZWQgcGlwZXMuICBUaGUgY29yZSBvZiB0aGUgInNlbGVjdCIgbG9vcCBpcyBhIGNhbGwgdG8gV2FpdEZvck11bHRpcGxlT2JqZWN0cy4gIFNvIHRoYXQgbWVhbnMKKyAgd2UgbmVlZCBhIHNpZ25hbGFibGUgb2JqZWN0IHRoYXQgaW5kaWNhdGVzIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUuCisKKyAgQSBwaXBlIGhhbmRsZSBkb2Vzbid0IGRvIHRoYXQuICBBIHBpcGUgaGFuZGxlIGlzIHNpZ25hbGVkIHdoZW4gYSByZWFkIG9yIHdyaXRlIGNvbXBsZXRlcywgYW5kIGlmCisgIG5vIG9uZSBoYXMgY2FsbGVkIHJlYWQgb3Igd3JpdGUsIHRoZW4gdGhlIHBpcGUgaGFuZGxlIGlzIHVzZWxlc3MgaW4gV2FpdEZvck11bHRpcGxlT2JqZWN0cy4gIFNvCisgIGluc3RlYWQsIHdlIHVzZSBvdmVybGFwcGVkIEkvTy4gIFdpdGggb3ZlcmxhcHBlZCBJL08sIHlvdSBjYWxsIHJlYWQsIGFuZCBhc3NvY2lhdGUgYW4gZXZlbnQgd2l0aAorICB0aGUgcmVhZC4gIFdoZW4gdGhlIHJlYWQgZmluaXNoZXMsIHRoZSBldmVudCBpcyBzaWduYWxlZC4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHlvdSBjcmVhdGUgYSBwaXBlLAorICB5b3Ugc3RhcnQgYSByZWFkLiAgV2hlbiB0aGUgY3VzdG9tZXIgY2FsbHMgcmVhZCBvbiB5b3VyIHRyYW5zcG9ydCBvYmplY3QsIHlvdSB3YWl0IGZvciB0aGUgbGFzdAorICByZWFkIHRvIGZpbmlzaCwgYW5kIHRoZW4ga2ljayBvZmYgYW5vdGhlci4KKworICBUaGVyZSBpcyBvbmUgYmlnIGNhdmVhdCB0byB0aGlzIHRob3VnaC4gIFRoZSB0aHJlYWQgdGhhdCBpbml0aWF0ZWQgdGhlIHJlYWQgbXVzdCBzdGF5IGFsaXZlLiAgSWYKKyAgdGhlIHRocmVhZCB0aGF0IGluaXRpYXRlZCB0aGUgcmVhZCBleGl0cywgdGhlbiB0aGUgcmVhZCBjb21wbGV0ZXMgaW4gYW4gZXJyb3Igc3RhdGUuICBUbyBlbnN1cmUKKyAgdGhhdCB0aGUgaW5pdGlhdGluZyB0aHJlYWQgc3RheXMgYWxpdmUsIHdlIGNyZWF0ZSBhIHNpbmdsZXRvbiB0aHJlYWQgd2hvc2Ugc29sZSByZXNwb25zaWJpbGl0eSBpcworICB0byBtYW5hZ2UgdGhpcyBvdmVybGFwcGVkIEkvTyByZXF1ZXN0cy4gIFRoaXMgaW50cm9kdWNlcyBzb21lIG92ZXJoZWFkLCBidXQgaXQgaXMgb3ZlcmhlYWQgdGhhdAorICBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3QgYmVoYXZpb3IuCisKKyAgVGhpcyB0aHJlYWQgY3VycmVudGx5IHN1cHBvcnRzIGNvbm5lY3QsIHJlYWQsIGFuZCBjYW5jZWwgaW8uICBTbyBmYXIsIEkgaGF2ZW4ndCBuZWVkZWQgdG8gcHV0IGFueQorICB3cml0ZXMgb24gdGhpcyB0aHJlYWQsIGJ1dCBpZiBuZWVkZWQsIGl0IGNvdWxkIGJlIGRvbmUuICBUaGUgY2xpZW50IHdyaXRlIGJ1ZmZlciB3b3VsZCBuZWVkIHRvIGJlCisgIGNvcGllZCB0byBlbnN1cmUgdGhhdCBpdCBkb2Vzbid0IGdldCBpbnZhbGlkYXRlZC4KKworICAqKiogSG93IGRvZXMgb25lIHVzZSB0aGlzIGNsYXNzPworICBDcmVhdGUgYSBUT3ZlcmxhcHBlZFdvcmtJdGVtLCBhbmQgZmlsbCBpbiB0aGUgYWN0aW9uIGFuZCAiaCIsIHRoZW4gY2FsbCByZXNldCgpLiAgWW91ciB3b3JrIGl0ZW0KKyAgaXMgbm93IHJlYWR5IHRvIGJlIHN1Ym1pdHRlZCB0byB0aGUgb3ZlcmxhcHBlZCBzdWJtaXNzaW9uIHRocmVhZC4gIENyZWF0ZSBhIFRBdXRvT3ZlcmxhcFRocmVhZCwKKyAgYW5kIGNhbGwgdGhyZWFkLT5hZGRXb3JrSXRlbSB3aXRoIHlvdXIgd29yayBpdGVtLiAgQWZ0ZXIgYWRkV29ya0l0ZW0gY29tcGxldGVzLCB5b3UgbWF5IGluc3BlY3QKKyAgbGFzdF9lcnJvciBhbmQgc3VjY2Vzcy4gIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSwgY2FsbCB3b3JrSXRlbS5vdmVybGFwcGVkUmVzdWx0cyB0byB3YWl0CisgIHVudGlsIHRoZSBvcGVyYXRpb24gaGFzIGNvbXBsZXRlZC4KKyovCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdHJhbnNwb3J0IHsKKworc3RydWN0IERFQ0xTUEVDX0FMSUdOKE1FTU9SWV9BTExPQ0FUSU9OX0FMSUdOTUVOVCkgVE92ZXJsYXBwZWRXb3JrSXRlbSA6IHB1YmxpYyBTTElTVF9FTlRSWSB7CisgIFRPdmVybGFwcGVkV29ya0l0ZW0oKTsKKworICBlbnVtIGFjdGlvbl90IHsKKyAgICBVTktOT1dOID0gMzAwMCwKKyAgICBDT05ORUNULAorICAgIFJFQUQsCisgICAgQ0FOQ0VMSU8sCisgICAgU1RPUCwKKyAgfTsKKworICBUQXV0b1Jlc2V0RXZlbnQgZG9uZVN1Ym1pdHRpbmdFdmVudDsKKyAgYWN0aW9uX3QgYWN0aW9uOworICBIQU5ETEUgaDsKKyAgdWludDhfdCogYnVmZmVyOworICB1aW50MzJfdCBidWZmZXJfbGVuOworICBPVkVSTEFQUEVEIG92ZXJsYXA7CisKKyAgRFdPUkQgbGFzdF9lcnJvcjsKKyAgQk9PTCBzdWNjZXNzOworCisgIHZvaWQgcmVzZXQodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4sIEhBTkRMRSBldmVudCk7CisgIHVpbnQzMl90IG92ZXJsYXBwZWRSZXN1bHRzKGJvb2wgc2lnbmFsX2ZhaWx1cmUgPSB0cnVlKTsKKyAgYm9vbCBwcm9jZXNzKCk7Cit9OworCitjbGFzcyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQgOiBib29zdDo6bm9uY29weWFibGUgeworcHVibGljOgorICB2b2lkIGFkZFdvcmtJdGVtKFRPdmVybGFwcGVkV29ya0l0ZW0qIGl0ZW0pOworCisgIC8vIHNpbmdsZXRvbiBzdHVmZgorcHVibGljOgorICBzdGF0aWMgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBhY3F1aXJlX2luc3RhbmNlKCk7CisgIHN0YXRpYyB2b2lkIHJlbGVhc2VfaW5zdGFuY2UoKTsKKworcHJpdmF0ZToKKyAgc3RhdGljIFRDcml0aWNhbFNlY3Rpb24gaW5zdGFuY2VHdWFyZF87CisgIHN0YXRpYyBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQqIGluc3RhbmNlXzsKKyAgc3RhdGljIHVpbnQzMl90IGluc3RhbmNlUmVmQ291bnRfOworCisgIC8vIHRocmVhZCBkZXRhaWxzCitwcml2YXRlOgorICBUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQoKTsKKyAgflRPdmVybGFwcGVkU3VibWlzc2lvblRocmVhZCgpOworICB2b2lkIHJ1bigpOworICBzdGF0aWMgdW5zaWduZWQgX19zdGRjYWxsIHRocmVhZF9wcm9jKHZvaWQqIGFkZHIpOworCitwcml2YXRlOgorICBERUNMU1BFQ19BTElHTihNRU1PUllfQUxMT0NBVElPTl9BTElHTk1FTlQpIFNMSVNUX0hFQURFUiB3b3JrTGlzdF87CisgIFRPdmVybGFwcGVkV29ya0l0ZW0gc3RvcEl0ZW1fOworICBUQXV0b1Jlc2V0RXZlbnQgd29ya0F2YWlsYWJsZUV2ZW50XzsKKyAgSEFORExFIHRocmVhZF87Cit9OworCitjbGFzcyBUQXV0b092ZXJsYXBUaHJlYWQgOiBib29zdDo6bm9uY29weWFibGUgeworcHJpdmF0ZToKKyAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBwOworCitwdWJsaWM6CisgIFRBdXRvT3ZlcmxhcFRocmVhZCgpIDogcChUT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQ6OmFjcXVpcmVfaW5zdGFuY2UoKSkge30KKyAgflRBdXRvT3ZlcmxhcFRocmVhZCgpIHsgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkOjpyZWxlYXNlX2luc3RhbmNlKCk7IH0KKyAgVE92ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gcDsgfQorfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKaW5kZXggYmNhOGQ5Mi4uNzIyODgzMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5jcHAKQEAgLTI3LDcgKzI3LDggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJTb2NrZXRQYWlyLmgiCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oPgorI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAogLy8gc3RsCiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0zNSw2MSArMzYsNjUgQEAKIC8vIFdpbjMyCiAjaW5jbHVkZSA8V1MydGNwaXAuaD4KIAotaW50IHNvY2tldHBhaXIoaW50IGQsIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIFNPQ0tFVCBzdlsyXSkKLXsKLSAgICB1bmlvbiB7Ci0gICAgICAgc3RydWN0IHNvY2thZGRyX2luIGluYWRkcjsKLSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKLSAgICB9IGE7Ci0gICAgU09DS0VUIGxpc3RlbmVyOwotICAgIGludCBlOwotICAgIHNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKGEuaW5hZGRyKTsKLSAgICBEV09SRCBmbGFncyA9IDA7Ci0gICAgaW50IHJldXNlID0gMTsKK2ludCB0aHJpZnRfc29ja2V0cGFpcihpbnQgZCwgaW50IHR5cGUsIGludCBwcm90b2NvbCwgVEhSSUZUX1NPQ0tFVCBzdlsyXSkgeworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHByb3RvY29sKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh0eXBlKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShkKTsKIAotICAgIGlmIChzdiA9PSAwKSB7Ci0gICAgICBXU0FTZXRMYXN0RXJyb3IoV1NBRUlOVkFMKTsKLSAgICAgIHJldHVybiBTT0NLRVRfRVJST1I7Ci0gICAgfQorICB1bmlvbiB7CisgICAgc3RydWN0IHNvY2thZGRyX2luIGluYWRkcjsKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgYWRkcjsKKyAgfSBhOworICBUSFJJRlRfU09DS0VUIGxpc3RlbmVyOworICBpbnQgZTsKKyAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYS5pbmFkZHIpOworICBEV09SRCBmbGFncyA9IDA7CisgIGludCByZXVzZSA9IDE7CiAKLSAgICBsaXN0ZW5lciA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOwotICAgIGlmIChsaXN0ZW5lciA9PSBJTlZBTElEX1NPQ0tFVCkKLSAgICAgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKLQotICAgIG1lbXNldCgmYSwgMCwgc2l6ZW9mKGEpKTsKLSAgICBhLmluYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOwotICAgIGEuaW5hZGRyLnNpbl9wb3J0ID0gMDsKLQotICAgIHN2WzBdID0gc3ZbMV0gPSBJTlZBTElEX1NPQ0tFVDsKLSAgICBkbyB7Ci0gICAgICAgIGlmIChzZXRzb2Nrb3B0KGxpc3RlbmVyLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsCi0gICAgICAgICAgICAgICAoY2hhciopICZyZXVzZSwgKHNvY2tsZW5fdCkgc2l6ZW9mKHJldXNlKSkgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgIChiaW5kKGxpc3RlbmVyLCAmYS5hZGRyLCBzaXplb2YoYS5pbmFkZHIpKSA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgIChnZXRzb2NrbmFtZShsaXN0ZW5lciwgJmEuYWRkciwgJmFkZHJsZW4pID09IFNPQ0tFVF9FUlJPUikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAobGlzdGVuKGxpc3RlbmVyLCAxKSA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3ZbMF0gPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIE5VTEwsIDAsIGZsYWdzKTsKLSAgICAgICAgaWYgKHN2WzBdID09IElOVkFMSURfU09DS0VUKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChjb25uZWN0KHN2WzBdLCAmYS5hZGRyLCBzaXplb2YoYS5pbmFkZHIpKSA9PSBTT0NLRVRfRVJST1IpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3ZbMV0gPSBhY2NlcHQobGlzdGVuZXIsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoc3ZbMV0gPT0gSU5WQUxJRF9TT0NLRVQpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjbG9zZXNvY2tldChsaXN0ZW5lcik7Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgfSB3aGlsZSAoMCk7Ci0KLSAgICBlID0gV1NBR2V0TGFzdEVycm9yKCk7Ci0gICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOwotICAgIGNsb3Nlc29ja2V0KHN2WzBdKTsKLSAgICBjbG9zZXNvY2tldChzdlsxXSk7Ci0gICAgV1NBU2V0TGFzdEVycm9yKGUpOworICBpZiAoc3YgPT0gMCkgeworICAgIFdTQVNldExhc3RFcnJvcihXU0FFSU5WQUwpOwogICAgIHJldHVybiBTT0NLRVRfRVJST1I7CisgIH0KKworICBsaXN0ZW5lciA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworICBpZiAobGlzdGVuZXIgPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgcmV0dXJuIFNPQ0tFVF9FUlJPUjsKKworICBtZW1zZXQoJmEsIDAsIHNpemVvZihhKSk7CisgIGEuaW5hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICBhLmluYWRkci5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICBhLmluYWRkci5zaW5fcG9ydCA9IDA7CisKKyAgc3ZbMF0gPSBzdlsxXSA9IElOVkFMSURfU09DS0VUOworICBkbyB7CisgICAgLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdC4gIFRoaXMgaXMgYmVjYXVzZQorICAgIC8vIFNPX0VYQ0xVU0lWRUFERFJVU0UgcmVxdWlyZXMgYWRtaW4gcHJpdmlsZWdlcyBvbiBXaW5YUCwgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byBmb3JjZSBzb2NrZXQgcGFpcnMgdG8gYmUgYW4gYWRtaW4uCisgICAgc2V0c29ja29wdChsaXN0ZW5lciwgU09MX1NPQ0tFVCwgU09fRVhDTFVTSVZFQUREUlVTRSwgKGNoYXIqKSZyZXVzZSwgKHNvY2tsZW5fdClzaXplb2YocmV1c2UpKTsKKyAgICBpZiAoYmluZChsaXN0ZW5lciwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGdldHNvY2tuYW1lKGxpc3RlbmVyLCAmYS5hZGRyLCAmYWRkcmxlbikgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgaWYgKGxpc3RlbihsaXN0ZW5lciwgMSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMF0gPSBXU0FTb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDAsIE5VTEwsIDAsIGZsYWdzKTsKKyAgICBpZiAoc3ZbMF0gPT0gSU5WQUxJRF9TT0NLRVQpCisgICAgICBicmVhazsKKyAgICBpZiAoY29ubmVjdChzdlswXSwgJmEuYWRkciwgc2l6ZW9mKGEuaW5hZGRyKSkgPT0gU09DS0VUX0VSUk9SKQorICAgICAgYnJlYWs7CisgICAgc3ZbMV0gPSBhY2NlcHQobGlzdGVuZXIsIE5VTEwsIE5VTEwpOworICAgIGlmIChzdlsxXSA9PSBJTlZBTElEX1NPQ0tFVCkKKyAgICAgIGJyZWFrOworCisgICAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICAgIHJldHVybiAwOworCisgIH0gd2hpbGUgKDApOworCisgIGUgPSBXU0FHZXRMYXN0RXJyb3IoKTsKKyAgY2xvc2Vzb2NrZXQobGlzdGVuZXIpOworICBjbG9zZXNvY2tldChzdlswXSk7CisgIGNsb3Nlc29ja2V0KHN2WzFdKTsKKyAgV1NBU2V0TGFzdEVycm9yKGUpOworICByZXR1cm4gU09DS0VUX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oCmluZGV4IDlkMDI5OTguLjg2YmY0MzEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1NvY2tldFBhaXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9Tb2NrZXRQYWlyLmgKQEAgLTMwLDcgKzMwLDggQEAKIAogLy8gV2luMzIKICNpbmNsdWRlIDxXaW5zb2NrMi5oPgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKLWludCBzb2NrZXRwYWlyKGludCBkLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBTT0NLRVQgc3ZbMl0pOworaW50IHRocmlmdF9zb2NrZXRwYWlyKGludCBkLCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBUSFJJRlRfU09DS0VUIHN2WzJdKTsKIAogI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19TT0NLRVRQQUlSX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TdGRBZnguY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3RkQWZ4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU0OTQ4Ny4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TdGRBZnguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAic3RkYWZ4LmgiCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TdGRBZnguaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N0ZEFmeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmViYmJhLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1N0ZEFmeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfV0lORE9XU19TVERBRlhfSF8KLSNkZWZpbmUgX1RIUklGVF9XSU5ET1dTX1NUREFGWF9IXwotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSNwcmFnbWEgb25jZQotI2VuZGlmIC8vIF9NU0NfVkVSCi0KLSNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCi0jZW5kaWYKLQotI2luY2x1ZGUgIlRhcmdldFZlcnNpb24uaCIKLSNpbmNsdWRlICJDb25maWcuaCIKLQotLy8gRXhjbHVkZSByYXJlbHktdXNlZCBzdHVmZiBmcm9tIFdpbmRvd3MgaGVhZGVycwotI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNlbmRpZgotCi0jaW5jbHVkZSA8V2luZG93cy5oPgotCi0jZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX1NUREFGWF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvU3luYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzIxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9TeW5jLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1dJTkRPV1NfU3luY19IXworI2RlZmluZSBfVEhSSUZUX1dJTkRPV1NfU3luY19IXyAxCisKKyNpZm5kZWYgX1dJTjMyCisjZXJyb3IgIndpbmRvd3MvU3luYy5oIGlzIG9ubHkgdXNhYmxlIG9uIFdpbmRvd3MiCisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDxib29zdC9ub25jb3B5YWJsZS5ocHA+CisjaW5jbHVkZSA8V2luZG93cy5oPgorCisvKgorICBMaWdodHdlaWdodCBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyB0aGF0IG9ubHkgbWFrZSBzZW5zZSBvbiBXaW5kb3dzLiAgRm9yIGNyb3NzLXBsYXRmb3JtCisgIGNvZGUsIHVzZSB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgY29uY3VycmVuY3kgbmFtZXNwYWNlCisqLworCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworCitzdHJ1Y3QgVENyaXRpY2FsU2VjdGlvbiA6IGJvb3N0Ojpub25jb3B5YWJsZSB7CisgIENSSVRJQ0FMX1NFQ1RJT04gY3M7CisgIFRDcml0aWNhbFNlY3Rpb24oKSB7IEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oJmNzKTsgfQorICB+VENyaXRpY2FsU2VjdGlvbigpIHsgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZjcyk7IH0KK307CisKK2NsYXNzIFRBdXRvQ3JpdCA6IGJvb3N0Ojpub25jb3B5YWJsZSB7Citwcml2YXRlOgorICBDUklUSUNBTF9TRUNUSU9OKiBjc187CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVEF1dG9Dcml0KFRDcml0aWNhbFNlY3Rpb24mIGNzKSA6IGNzXygmY3MuY3MpIHsgRW50ZXJDcml0aWNhbFNlY3Rpb24oY3NfKTsgfQorICB+VEF1dG9Dcml0KCkgeyBMZWF2ZUNyaXRpY2FsU2VjdGlvbihjc18pOyB9Cit9OworCitzdHJ1Y3QgVEF1dG9SZXNldEV2ZW50IDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgSEFORExFIGg7CisKKyAgVEF1dG9SZXNldEV2ZW50KCkgeworICAgIGggPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRBdXRvUmVzZXRFdmVudCB1bmFibGUgdG8gY3JlYXRlIGV2ZW50LCBHTEU9IiwgR2V0TGFzdEVycm9yKCkpOworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbigiQ3JlYXRlRXZlbnQgZmFpbGVkIik7CisgICAgfQorICB9CisgIH5UQXV0b1Jlc2V0RXZlbnQoKSB7IENsb3NlSGFuZGxlKGgpOyB9Cit9OworCitzdHJ1Y3QgVE1hbnVhbFJlc2V0RXZlbnQgOiBib29zdDo6bm9uY29weWFibGUgeworICBIQU5ETEUgaDsKKworICBUTWFudWFsUmVzZXRFdmVudCgpIHsKKyAgICBoID0gQ3JlYXRlRXZlbnQoTlVMTCwgVFJVRSwgRkFMU0UsIE5VTEwpOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRNYW51YWxSZXNldEV2ZW50IHVuYWJsZSB0byBjcmVhdGUgZXZlbnQsIEdMRT0iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJDcmVhdGVFdmVudCBmYWlsZWQiKTsKKyAgICB9CisgIH0KKyAgflRNYW51YWxSZXNldEV2ZW50KCkgeyBDbG9zZUhhbmRsZShoKTsgfQorfTsKKworc3RydWN0IFRBdXRvSGFuZGxlIDogYm9vc3Q6Om5vbmNvcHlhYmxlIHsKKyAgSEFORExFIGg7CisgIGV4cGxpY2l0IFRBdXRvSGFuZGxlKEhBTkRMRSBoXyA9IElOVkFMSURfSEFORExFX1ZBTFVFKSA6IGgoaF8pIHt9CisgIH5UQXV0b0hhbmRsZSgpIHsKKyAgICBpZiAoaCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgIENsb3NlSGFuZGxlKGgpOworICB9CisKKyAgSEFORExFIHJlbGVhc2UoKSB7CisgICAgSEFORExFIHJldHZhbCA9IGg7CisgICAgaCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKyAgdm9pZCByZXNldChIQU5ETEUgaF8gPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgeworICAgIGlmIChoXyA9PSBoKQorICAgICAgcmV0dXJuOworICAgIGlmIChoICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgQ2xvc2VIYW5kbGUoaCk7CisgICAgaCA9IGhfOworICB9Cit9OworfQorfSAvLyBhcGFjaGU6OnRocmlmdAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcAppbmRleCBhYWUyNWFiLi5kMjY4M2IwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCkBAIC0xNyw0NyArMTcsNDUgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJTdGRBZnguaCIKLSNpbmNsdWRlICJUV2luc29ja1NpbmdsZXRvbi5oIgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAKIC8vIGJvb3N0CiAjaW5jbHVkZSA8Ym9vc3QvYXNzZXJ0LmhwcD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRyYW5zcG9ydCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIFRXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHIgVFdpbnNvY2tTaW5nbGV0b246Omluc3RhbmNlX3B0cl8oTlVMTCk7Ci1ib29zdDo6b25jZV9mbGFnICAgICAgICAgICAgICAgIFRXaW5zb2NrU2luZ2xldG9uOjpmbGFnc18gPSBCT09TVF9PTkNFX0lOSVQ7CitzdGQ6Om9uY2VfZmxhZyBUV2luc29ja1NpbmdsZXRvbjo6ZmxhZ3NfOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVFdpbnNvY2tTaW5nbGV0b246OlRXaW5zb2NrU2luZ2xldG9uKHZvaWQpCi17Ci0gICAgV09SRCAgICB2ZXJzaW9uKE1BS0VXT1JEKDIsIDIpKTsKLSAgICBXU0FEYXRhIGRhdGEgPSB7MH07CitUV2luc29ja1NpbmdsZXRvbjo6VFdpbnNvY2tTaW5nbGV0b24odm9pZCkgeworICBXT1JEIHZlcnNpb24oTUFLRVdPUkQoMiwgMikpOworICBXU0FEYXRhIGRhdGEgPSB7MH07CiAKLSAgICBpbnQgZXJyb3IoV1NBU3RhcnR1cCh2ZXJzaW9uLCAmZGF0YSkpOwotICAgIGlmIChlcnJvciAhPSAwKQotICAgIHsKLSAgICAgICAgQk9PU1RfQVNTRVJUKGZhbHNlKTsKLSAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJGYWlsZWQgdG8gaW5pdGlhbGlzZSBXaW5zb2NrLiIpOwotICAgIH0KKyAgaW50IGVycm9yKFdTQVN0YXJ0dXAodmVyc2lvbiwgJmRhdGEpKTsKKyAgaWYgKGVycm9yICE9IDApIHsKKyAgICBCT09TVF9BU1NFUlQoZmFsc2UpOworICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpc2UgV2luc29jay4iKTsKKyAgfQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVFdpbnNvY2tTaW5nbGV0b246On5UV2luc29ja1NpbmdsZXRvbih2b2lkKQotewotICAgIFdTQUNsZWFudXAoKTsKK1RXaW5zb2NrU2luZ2xldG9uOjp+VFdpbnNvY2tTaW5nbGV0b24odm9pZCkgeworICBXU0FDbGVhbnVwKCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUodm9pZCkKLXsKLSAgICBib29zdDo6Y2FsbF9vbmNlKGluaXQsIGZsYWdzXyk7Cit2b2lkIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUodm9pZCkgeworICBzdGQ6OmNhbGxfb25jZShmbGFnc18sIGluaXQpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBUV2luc29ja1NpbmdsZXRvbjo6aW5pdCh2b2lkKQotewotICAgIGluc3RhbmNlX3B0cl8ucmVzZXQobmV3IFRXaW5zb2NrU2luZ2xldG9uKTsKK3ZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmluaXQodm9pZCkgeworICBpbnN0YW5jZV9wdHJfLnJlc2V0KG5ldyBUV2luc29ja1NpbmdsZXRvbik7CiB9Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCmluZGV4IDEzNGM3YjAuLmEzMDgwNmIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaApAQCAtMjgsNTAgKzI4LDQ2IEBACiAjZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCiAjZW5kaWYKIAorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKIC8vIGJvb3N0CiAjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC9vbmNlLmhwcD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgewogCiAvKioKICAqIFdpbnNvY2syIG11c3QgYmUgaW50aWFsaXNlZCBvbmNlIG9ubHkgaW4gb3JkZXIgdG8gY3JlYXRlIHNvY2tldHMuIFRoaXMgY2xhc3MKICAqIHBlcmZvcm1zIGEgb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gd2hlbiBjcmVhdGUgaXMgY2FsbGVkLgogICovCi1jbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlCi17CitjbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlIHsKIAogcHVibGljOgotCi0gICAgdHlwZWRlZiBib29zdDo6c2NvcGVkX3B0cjxUV2luc29ja1NpbmdsZXRvbj4gaW5zdGFuY2VfcHRyOworICB0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxUV2luc29ja1NpbmdsZXRvbj4gaW5zdGFuY2VfcHRyOwogCiBwcml2YXRlOgotCi0gICAgZnJpZW5kIHZvaWQgYm9vc3Q6OmNhbGxfb25jZSh2b2lkICgqZnVuYykodm9pZCksIGJvb3N0OjpvbmNlX2ZsYWcmIGZsYWcpOwotCi1wcml2YXRlOgotCi0gICAgVFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisgIFRXaW5zb2NrU2luZ2xldG9uKHZvaWQpOwogCiBwdWJsaWM6Ci0KLSAgICB+VFdpbnNvY2tTaW5nbGV0b24odm9pZCk7CisgIH5UV2luc29ja1NpbmdsZXRvbih2b2lkKTsKIAogcHVibGljOgotCi0gICAgc3RhdGljIHZvaWQgY3JlYXRlKHZvaWQpOworICBzdGF0aWMgdm9pZCBjcmVhdGUodm9pZCk7CiAKIHByaXZhdGU6Ci0KLSAgICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOworICBzdGF0aWMgdm9pZCBpbml0KHZvaWQpOwogCiBwcml2YXRlOgotCi0gICAgc3RhdGljIGluc3RhbmNlX3B0ciAgICAgaW5zdGFuY2VfcHRyXzsKLSAgICBzdGF0aWMgYm9vc3Q6Om9uY2VfZmxhZyBmbGFnc187CisgIHN0YXRpYyBpbnN0YW5jZV9wdHIgaW5zdGFuY2VfcHRyXzsKKyAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWdzXzsKIH07Ci0KLX19fSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKIAogI2VuZGlmIC8vIF9USFJJRlRfVFJBTlNQT1JUX1dJTkRPV1NfVFdJTlNPQ0tTSU5HTEVUT05fSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RhcmdldFZlcnNpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RhcmdldFZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjMDkzZi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UYXJnZXRWZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgX1RISVJGVF9XSU5ET1dTX1RBUkdFVFZFUlNJT05fSF8KLSNkZWZpbmUgX1RISVJGVF9XSU5ET1dTX1RBUkdFVFZFUlNJT05fSF8KLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDEyMDApCi0jcHJhZ21hIG9uY2UKLSNlbmRpZiAvLyBfTVNDX1ZFUgotCi0jaWZuZGVmIF9XSU4zMgotI2Vycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgotI2VuZGlmCi0KLSNlbmRpZiAvL19USElSRlRfV0lORE9XU19UQVJHRVRWRVJTSU9OX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5jcHAKaW5kZXggZGEyZjczYS4uYzkwN2U5MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmNwcApAQCAtMTcsMzQgKzE3LDg1IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiV2luRmNudGwuaCIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9XaW5GY250bC5oPgogCi1pbnQgZmNudGwoU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpCi17Ci0gICAgaWYoY21kICE9IEZfR0VURkwgJiYgY21kICE9IEZfU0VURkwpCi0gICAgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQoraW50IHRocmlmdF9mY250bChUSFJJRlRfU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpIHsKKyAgaWYgKGNtZCAhPSBUSFJJRlRfRl9HRVRGTCAmJiBjbWQgIT0gVEhSSUZUX0ZfU0VURkwpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KIAotICAgIGlmKGZsYWdzICE9IE9fTk9OQkxPQ0sgJiYgZmxhZ3MgIT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgIGlmIChmbGFncyAhPSBUSFJJRlRfT19OT05CTE9DSyAmJiBmbGFncyAhPSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9CiAKLSAgICBpZihjbWQgPT0gRl9HRVRGTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgaWYgKGNtZCA9PSBUSFJJRlRfRl9HRVRGTCkgeworICAgIHJldHVybiAwOworICB9CiAKLSAgICBpbnQgcmVzOwotICAgIGlmKGZsYWdzKQotICAgIHsKLSAgICAgICAgcmVzID0gaW9jdGxzb2NrZXQoZmQsIEZJT05CSU8sIHJlaW50ZXJwcmV0X2Nhc3Q8dV9sb25nICo+KCYoZmxhZ3MgPSAxKSkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICByZXMgPSBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgcmVpbnRlcnByZXRfY2FzdDx1X2xvbmcgKj4oJihmbGFncyA9IDApKSk7Ci0gICAgfQorICBpbnQgcmVzOworICBpZiAoZmxhZ3MpIHsKKyAgICByZXMgPSBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgcmVpbnRlcnByZXRfY2FzdDx1X2xvbmcqPigmKGZsYWdzID0gMSkpKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBpb2N0bHNvY2tldChmZCwgRklPTkJJTywgcmVpbnRlcnByZXRfY2FzdDx1X2xvbmcqPigmKGZsYWdzID0gMCkpKTsKKyAgfQogCi0gICAgcmV0dXJuIHJlczsKKyAgcmV0dXJuIHJlczsKIH0KKworI2lmIFdJTlZFUiA8PSAweDA1MDIgLy8gWFAsIFNlcnZlcjIwMDMKK2ludCB0aHJpZnRfcG9sbChUSFJJRlRfUE9MTEZEKiBmZEFycmF5LCBVTE9ORyBuZmRzLCBJTlQgdGltZW91dCkgeworICBmZF9zZXQgcmVhZF9mZHMsIHdyaXRlX2ZkczsKKyAgZmRfc2V0KiByZWFkX2Zkc19wdHIgPSBOVUxMOworICBmZF9zZXQqIHdyaXRlX2Zkc19wdHIgPSBOVUxMOworCisgIEZEX1pFUk8oJnJlYWRfZmRzKTsKKyAgRkRfWkVSTygmd3JpdGVfZmRzKTsKKworICBmb3IgKFVMT05HIGkgPSAwOyBpIDwgbmZkczsgaSsrKSB7CisgICAgLy8gUmVhZCAoaW4pIHNvY2tldAorICAgIGlmICgoZmRBcnJheVtpXS5ldmVudHMgJiBUSFJJRlRfUE9MTElOKSA9PSBUSFJJRlRfUE9MTElOKSB7CisgICAgICByZWFkX2Zkc19wdHIgPSAmcmVhZF9mZHM7CisgICAgICBGRF9TRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKTsKKyAgICB9CisgICAgLy8gV3JpdGUgKG91dCkgc29ja2V0CisgICAgZWxzZSBpZiAoKGZkQXJyYXlbaV0uZXZlbnRzICYgVEhSSUZUX1BPTExPVVQpID09IFRIUklGVF9QT0xMT1VUKSB7CisgICAgICB3cml0ZV9mZHNfcHRyID0gJndyaXRlX2ZkczsKKyAgICAgIEZEX1NFVChmZEFycmF5W2ldLmZkLCAmd3JpdGVfZmRzKTsKKyAgICB9CisgIH0KKworICB0aW1ldmFsIHRpbWVfb3V0OworICB0aW1ldmFsKiB0aW1lX291dF9wdHIgPSBOVUxMOworICBpZiAodGltZW91dCA+PSAwKSB7CisgICAgdGltZV9vdXQudHZfc2VjID0gdGltZW91dCAvIDEwMDA7CisgICAgdGltZV9vdXQudHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworICAgIHRpbWVfb3V0X3B0ciA9ICZ0aW1lX291dDsKKyAgfSBlbHNlIHsgLy8gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKKyAgICAodm9pZCl0aW1lX291dDsKKyAgICAodm9pZCl0aW1lb3V0OworICB9CisKKyAgaW50IHNrdHJlYWR5ID0gc2VsZWN0KDEsIHJlYWRfZmRzX3B0ciwgd3JpdGVfZmRzX3B0ciwgTlVMTCwgdGltZV9vdXRfcHRyKTsKKyAgaWYgKHNrdHJlYWR5ID4gMCkgeworICAgIGZvciAoVUxPTkcgaSA9IDA7IGkgPCBuZmRzOyBpKyspIHsKKyAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyA9IDA7CisgICAgICBpZiAoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKSkKKyAgICAgICAgZmRBcnJheVtpXS5yZXZlbnRzIHw9IFRIUklGVF9QT0xMSU47CisgICAgICBpZiAoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJndyaXRlX2ZkcykpCisgICAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyB8PSBUSFJJRlRfUE9MTE9VVDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHNrdHJlYWR5OworfQorI2Vsc2UgIC8vIFZpc3RhLCBXaW43Li4uCitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpIHsKKyAgcmV0dXJuIFdTQVBvbGwoZmRBcnJheSwgbmZkcywgdGltZW91dCk7Cit9CisjZW5kaWYgLy8gV0lOVkVSCisKKyNpZmRlZiBfV0lOMzJfV0NFCitzdGQ6OnN0cmluZyB0aHJpZnRfd3N0cjJzdHIoc3RkOjp3c3RyaW5nIHdzKSB7CisgIHN0ZDo6c3RyaW5nIHMod3MuYmVnaW4oKSwgd3MuZW5kKCkpOworICByZXR1cm4gczsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1dpbkZjbnRsLmgKaW5kZXggYmU4MGM1Yi4uNmM2YmU5NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvV2luRmNudGwuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9XaW5GY250bC5oCkBAIC0yOCwxNyArMjgsMjkgQEAKICNlcnJvciBUaGlzIGlzIGEgTVNWQyBoZWFkZXIgb25seS4KICNlbmRpZgogCisjaWZkZWYgX1dJTjMyX1dDRQorI2luY2x1ZGUgPHN0cmluZz4KKyNlbmRpZgorCiAvLyBXaW4zMgogI2luY2x1ZGUgPFdpbnNvY2syLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogCi0jZGVmaW5lIE9fTk9OQkxPQ0sgMQotCi1lbnVtCi17Ci0gICAgRl9HRVRGTCwKLSAgICBGX1NFVEZMLAorI2lmIFdJTlZFUiA8PSAweDA1MDIgLy8gWFAsIFNlcnZlcjIwMDMKK3N0cnVjdCB0aHJpZnRfcG9sbGZkIHsKKyAgVEhSSUZUX1NPQ0tFVCBmZDsKKyAgU0hPUlQgZXZlbnRzOworICBTSE9SVCByZXZlbnRzOwogfTsKKyNlbmRpZgogCi1pbnQgZmNudGwoU09DS0VUIGZkLCBpbnQgY21kLCBpbnQgZmxhZ3MpOworZXh0ZXJuICJDIiB7CitpbnQgdGhyaWZ0X2ZjbnRsKFRIUklGVF9TT0NLRVQgZmQsIGludCBjbWQsIGludCBmbGFncyk7CitpbnQgdGhyaWZ0X3BvbGwoVEhSSUZUX1BPTExGRCogZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpOworfQorCisjaWZkZWYgX1dJTjMyX1dDRQorc3RkOjpzdHJpbmcgdGhyaWZ0X3dzdHIyc3RyKHN0ZDo6d3N0cmluZyB3cyk7CisjZW5kaWYKIAogI2VuZGlmIC8vIF9USFJJRlRfV0lORE9XU19GQ05UTF9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAppbmRleCAzZWMyZGI4Li5hNWY0NDU3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMjUsMTI2ICsyNSw4NSBAQAogI2VuZGlmIC8vIF9NU0NfVkVSCiAKICNpZm5kZWYgX1dJTjMyCi0jZXJyb3IgVGhpcyBpcyBhIE1TVkMgaGVhZGVyIG9ubHkuCisjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgogI2VuZGlmCiAKLSNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0OTk2KSAvLyBEZXByZWNpYXRlZCBwb3NpeCBuYW1lLgotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQyNTApIC8vIEluaGVyaXRzIHZpYSBkb21pbmFuY2UuCisvLyB1c2Ugc3RkOjp0aHJlYWQgaW4gTVNWQzExICgyMDEyKSBvciBuZXdlciBhbmQgaW4gTWluR1cKKyNpZiAoX01TQ19WRVIgPj0gMTcwMCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgVVNFX1NURF9USFJFQUQgMQorI2VuZGlmCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC45LjAiCisvLyBTb21ldGhpbmcgdGhhdCBkZWZpbmVzIFBSSWQ2NCBpcyByZXF1aXJlZCB0byBidWlsZAorI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvLyBWUzIwMTAgb3IgbGF0ZXIgaGFzIHN0ZGludC5oIGFzIGRvZXMgTWluR1cKKyNpZiAoX01TQ19WRVIgPj0gMTYwMCkgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisjZW5kaWYKKworI2lmbmRlZiBUQVJHRVRfV0lOX1hQCisjZGVmaW5lIFRBUkdFVF9XSU5fWFAgMQorI2VuZGlmCisKKyNpZiBUQVJHRVRfV0lOX1hQCisjaWZuZGVmIFdJTlZFUgorI2RlZmluZSBXSU5WRVIgMHgwNTAxCisjZW5kaWYKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDEKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9NX1g2NCkKKyNkZWZpbmUgQVJJVEhNRVRJQ19SSUdIVF9TSElGVCAxCisjZGVmaW5lIFNJR05FRF9SSUdIVF9TSElGVF9JUyAxCisjZW5kaWYKKworI2lmbmRlZiBfX01JTkdXMzJfXworI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KSAvLyBEZXByZWNhdGVkIHBvc2l4IG5hbWUuCisjZW5kaWYKKwogI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCiAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCiAKLSNpbmNsdWRlICJUYXJnZXRWZXJzaW9uLmgiCi0jaW5jbHVkZSAiR2V0VGltZU9mRGF5LmgiCi0jaW5jbHVkZSAiT3BlcmF0b3JzLmgiCi0jaW5jbHVkZSAiVFdpbnNvY2tTaW5nbGV0b24uaCIKLSNpbmNsdWRlICJXaW5GY250bC5oIgotI2luY2x1ZGUgIlNvY2tldFBhaXIuaCIKLQotLy8gYm9vc3QKKy8vIE11c3QgYmUgdXNpbmcgVlMyMDEwIG9yIGxhdGVyLCBvciBib29zdCwgc28gdGhhdCBDOTkgdHlwZXMgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxzZQogI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgogCi10eXBlZGVmIGJvb3N0OjppbnQ2NF90ICBpbnQ2NF90OwordHlwZWRlZiBib29zdDo6aW50NjRfdCBpbnQ2NF90OwordHlwZWRlZiBib29zdDo6dWludDY0X3QgdWludDY0X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQzMl90IGludDMyX3Q7CiB0eXBlZGVmIGJvb3N0Ojp1aW50MzJfdCB1aW50MzJfdDsKLXR5cGVkZWYgYm9vc3Q6OnVpbnQ4X3QgIHVpbnQ4X3Q7Cit0eXBlZGVmIGJvb3N0OjppbnQxNl90IGludDE2X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50MTZfdCB1aW50MTZfdDsKK3R5cGVkZWYgYm9vc3Q6OmludDhfdCBpbnQ4X3Q7Cit0eXBlZGVmIGJvb3N0Ojp1aW50OF90IHVpbnQ4X3Q7CisjZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9HZXRUaW1lT2ZEYXkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9PcGVyYXRvcnMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1dpbkZjbnRsLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvU29ja2V0UGFpci5oPgogCiAvLyB3aW5kb3dzCiAjaW5jbHVkZSA8V2luc29jazIuaD4KICNpbmNsdWRlIDx3czJ0Y3BpcC5oPgotI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMl8zMi5saWIiKQotI3ByYWdtYSBjb21tZW50KGxpYiwgImFkdmFwaTMyLmxpYiIpIC8vRm9yIHNlY3VyaXR5IEFQSXMgaW4gVFBpcGVTZXJ2ZXIKLQotLy8gcHRocmVhZHMKLSNpZiAwCi0jCWluY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbHNlCi1zdHJ1Y3QgdGltZXNwZWMgewotICBpbnQ2NF90IHR2X3NlYzsKLSAgaW50NjRfdCB0dl9uc2VjOwotfTsKLSMJZGVmaW5lIFVTRV9CT09TVF9USFJFQUQgMQotIwlkZWZpbmUgY3RpbWVfciggX2Nsb2NrLCBfYnVmICkgXAotICAgICAgICAoIHN0cmNweSggKF9idWYpLCBjdGltZSggKF9jbG9jaykgKSApLCAgXAotICAgICAgICAgIChfYnVmKSApCi0jZW5kaWYKLQotdHlwZWRlZiBwdHJkaWZmX3Qgc3NpemVfdDsKLQotLy8gTWlzc2luZyBmdW5jdGlvbnMuCi0jZGVmaW5lIHVzbGVlcChtcykgU2xlZXAobXMpCi1pbmxpbmUgaW50IHNsZWVwKERXT1JEIG1zKQotewotICAgIFNsZWVwKG1zKTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2lmIFdJTlZFUiA8PSAweDA1MDIgLy9YUCwgU2VydmVyMjAwMwotI2RlZmluZSBQT0xMSU4gIDB4MDMwMAotI2RlZmluZSBQT0xMT1VUIDB4MDAxMAotI2RlZmluZSBwb2xsKGZkcywgbmZkcywgdGltZW91dCkgXAotICAgIHBvbGxfd2luMzIoZmRzLCBuZmRzLCB0aW1lb3V0KQotCi10eXBlZGVmIHN0cnVjdCBwb2xsZmQgewotICBTT0NLRVQgIGZkOwotICBTSE9SVCAgIGV2ZW50czsKLSAgU0hPUlQgICByZXZlbnRzOwotfSBXU0FQT0xMRkQsICpQV1NBUE9MTEZELCBGQVIgKkxQV1NBUE9MTEZEOwotCi1pbmxpbmUgaW50IHBvbGxfd2luMzIoTFBXU0FQT0xMRkQgZmRBcnJheSwgVUxPTkcgbmZkcywgSU5UIHRpbWVvdXQpCi17Ci0gIGZkX3NldCByZWFkX2Zkcywgd3JpdGVfZmRzOwotICBmZF9zZXQqIHJlYWRfZmRzX3B0ciAgPSBOVUxMOwotICBmZF9zZXQqIHdyaXRlX2Zkc19wdHIgPSBOVUxMOwotCi0gIEZEX1pFUk8oJnJlYWRfZmRzKTsKLSAgRkRfWkVSTygmd3JpdGVfZmRzKTsKLQotICBmb3IoVUxPTkcgaT0wOyBpPG5mZHM7IGkrKykgewotICAgIC8vUmVhZCAoaW4pIHNvY2tldAotICAgIGlmKChmZEFycmF5W2ldLmV2ZW50cyAmIFBPTExJTikgPT0gUE9MTElOKSB7Ci0gICAgICByZWFkX2Zkc19wdHIgPSAmcmVhZF9mZHM7Ci0gICAgICBGRF9TRVQoZmRBcnJheVtpXS5mZCwgJnJlYWRfZmRzKTsKLSAgICB9Ci0gICAgLy9Xcml0ZSAob3V0KSBzb2NrZXQKLSAgICBlbHNlIGlmKChmZEFycmF5W2ldLmV2ZW50cyAmIFBPTExPVVQpID09IFBPTExPVVQpIHsKLSAgICAgIHdyaXRlX2Zkc19wdHIgPSAmd3JpdGVfZmRzOwotICAgICAgRkRfU0VUKGZkQXJyYXlbaV0uZmQsICZ3cml0ZV9mZHMpOwotICAgIH0KLSAgfQotCi0gIHRpbWV2YWwgdGltZV9vdXQ7Ci0gIHRpbWV2YWwqIHRpbWVfb3V0X3B0ciA9IE5VTEw7Ci0gIGlmKHRpbWVvdXQgPj0gMCkgewotICAgIHRpbWV2YWwgdGltZV9vdXQgPSB7dGltZW91dCAvIDEwMDAsIHRpbWVvdXQgKiAxMDAwfTsKLSAgICB0aW1lX291dF9wdHIgPSAmdGltZV9vdXQ7Ci0gIH0KLSAgZWxzZSB7IC8vdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLSAgICAodm9pZCl0aW1lX291dDsKLSAgICAodm9pZCl0aW1lb3V0OwotICB9Ci0KLSAgaW50IHNrdHJlYWR5ID0gc2VsZWN0KDEsIHJlYWRfZmRzX3B0ciwgd3JpdGVfZmRzX3B0ciwgTlVMTCwgdGltZV9vdXRfcHRyKTsKLSAgaWYoc2t0cmVhZHkgPiAwKSB7Ci0gICAgZm9yKFVMT05HIGk9MDsgaTxuZmRzOyBpKyspIHsKLSAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyA9IDA7Ci0gICAgICBpZihGRF9JU1NFVChmZEFycmF5W2ldLmZkLCAmcmVhZF9mZHMpKQotICAgICAgICBmZEFycmF5W2ldLnJldmVudHMgfD0gUE9MTElOOwotICAgICAgaWYoRkRfSVNTRVQoZmRBcnJheVtpXS5mZCwgJndyaXRlX2ZkcykpCi0gICAgICAgIGZkQXJyYXlbaV0ucmV2ZW50cyB8PSBQT0xMT1VUOwotICAgIH0KLSAgfQotICByZXR1cm4gc2t0cmVhZHk7Ci19Ci0jZWxzZSAvL1Zpc3RhLCBXaW43Li4uCi0gIGlubGluZSBpbnQgcG9sbChzdHJ1Y3QgcG9sbGZkKiBmZEFycmF5LCBVTE9ORyBmZHMsIElOVCB0aW1lb3V0KSB7Ci0gICAgcmV0dXJuIFdTQVBvbGwoZmRBcnJheSwgZmRzLCB0aW1lb3V0KTsKLSAgfQotI2VuZGlmIC8vIFdJTlZFUgotCi1pbmxpbmUgaW50IGNsb3NlKFNPQ0tFVCBzb2NrZXQpCi17Ci0gICAgcmV0dXJuIDo6Y2xvc2Vzb2NrZXQoc29ja2V0KTsKLX0KKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgI2lmZGVmIF9XSU4zMl9XQ0UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQorICAjZWxzZQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCisgICNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCisgICNlbmRpZgorI2VuZGlmIC8vIF9fTUlOR1czMl9fCiAKICNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9mb3JjZV9pbmMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2ZvcmNlX2luYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGViMTM0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2ZvcmNlX2luYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIF9USFJJRlRfV0lORE9XU19GT1JDRUlOQ19IXwotIyAgZGVmaW5lIF9USFJJRlRfV0lORE9XU19GT1JDRUlOQ19IXwotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID4gMTIwMCkKLSMgIHByYWdtYSBvbmNlCi0jZW5kaWYgLy8gX01TQ19WRVIKLQotI2lmbmRlZiBfV0lOMzIKLSMgIGVycm9yIFRoaXMgaXMgYSBNU1ZDIGhlYWRlciBvbmx5LgotI2VuZGlmCi0KLSNpZm5kZWYgTk9NSU5NQVgKLSMgIGRlZmluZSBOT01JTk1BWAotI2VuZGlmCi0jaWZuZGVmIFVTRV9CT09TVF9USFJFQUQKLSMgIGRlZmluZSBCT09TVF9BTExfTk9fTElCIDEKLSMgIGRlZmluZSBCT09TVF9USFJFQURfTk9fTElCIDEKLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfV0lOX1hQCi0KLSNpZmRlZiBUQVJHRVRfV0lOX1hQCi0jICBpZm5kZWYgV0lOVkVSCi0jICAgIGRlZmluZSBXSU5WRVIgMHgwNTAxCi0jICBlbmRpZgotIyAgaWZuZGVmIF9XSU4zMl9XSU5OVAotIyAgICBkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDUwMQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIF9XSU4zMl9XSU5OVAotIyAgZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDEKLSNlbmRpZgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSN1bmRlZiBnYWlfc3RyZXJyb3IKLSNkZWZpbmUgZ2FpX3N0cmVycm9yIGdhaV9zdHJlcnJvckEKLQotI3VuZGVmIGVycm5vCi0jdW5kZWYgRUlOVFIKLSN1bmRlZiBFSU5QUk9HUkVTUwotI3VuZGVmIEVDT05OUkVTRVQKLSN1bmRlZiBFTk9UQ09OTgotI3VuZGVmIEVUSU1FRE9VVAotI3VuZGVmIEVXT1VMREJMT0NLCi0jdW5kZWYgRUFHQUlOCi0jdW5kZWYgRVBJUEUKLSNkZWZpbmUgZXJybm8gOjpXU0FHZXRMYXN0RXJyb3IoKQotI2RlZmluZSBFSU5QUk9HUkVTUyBXU0FFSU5QUk9HUkVTUwotI2RlZmluZSBFQUdBSU4gV1NBRVdPVUxEQkxPQ0sKLSNkZWZpbmUgRUlOVFIgV1NBRUlOVFIKLSNkZWZpbmUgRUNPTk5SRVNFVCBXU0FFQ09OTlJFU0VUCi0jZGVmaW5lIEVOT1RDT05OIFdTQUVOT1RDT05OCi0jZGVmaW5lIEVUSU1FRE9VVCBXU0FFVElNRURPVVQKLSNkZWZpbmUgRVdPVUxEQkxPQ0sgV1NBRVdPVUxEQkxPQ0sKLSNkZWZpbmUgRVBJUEUgV1NBRUNPTk5SRVNFVAotCi0jZW5kaWYgLy8gX1RIUklGVF9XSU5ET1dTX0ZPUkNFSU5DX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy90cjEvZnVuY3Rpb25hbCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL3RyMS9mdW5jdGlvbmFsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmVlMzg0Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL3RyMS9mdW5jdGlvbmFsCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8ZnVuY3Rpb25hbD4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcCBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLmNwcAppbmRleCA2NWQxOTI3Li42YjVjN2M0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMuY3BwCkBAIC0yMiw2ICsyMiwxMCBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBBbGxQcm90b2NvbFRlc3RzCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiAjaW5jbHVkZSAiQWxsUHJvdG9jb2xUZXN0cy50Y2MiCiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKQEAgLTMwLDE1ICszNCwxNCBAQAogCiBjaGFyIGVycm9yTWVzc2FnZVtFUlJfTEVOXTsKIAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gICh2b2lkKSBhcmdjOwotICAodm9pZCkgYXJndjsKLSAgdHJ5IHsKLSAgICB0ZXN0UHJvdG9jb2w8VEJpbmFyeVByb3RvY29sPigiVEJpbmFyeVByb3RvY29sIik7Ci0gICAgdGVzdFByb3RvY29sPFRDb21wYWN0UHJvdG9jb2w+KCJUQ29tcGFjdFByb3RvY29sIik7Ci0gIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgIHByaW50ZigiJXNcbiIsIGUud2hhdCgpKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluYXJ5X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUQmluYXJ5UHJvdG9jb2w+KCJUQmluYXJ5UHJvdG9jb2wiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9saXR0bGVfYmluYXJ5X3Byb3RvY29sKSB7CisgIHRlc3RQcm90b2NvbDxUTEVCaW5hcnlQcm90b2NvbD4oIlRMRUJpbmFyeVByb3RvY29sIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY29tcGFjdF9wcm90b2NvbCkgeworICB0ZXN0UHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbD4oIlRDb21wYWN0UHJvdG9jb2wiKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYwppbmRleCA5MTU1ZGE4Li5hN2VhYjA3IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKKysrIGIvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCkBAIC0yOCw3ICsyOCw3IEBACiAKICNpbmNsdWRlICJHZW5lcmljSGVscGVycy5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKQEAgLTQ1LDcgKzQ1LDEwIEBACiAgIFZhbCBvdXQ7CiAgIEdlbmVyaWNJTzo6cmVhZChwcm90b2NvbCwgb3V0KTsKICAgaWYgKG91dCAhPSB2YWwpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIG5ha2VkIHRlc3QgKHR5cGU6ICVzKSIsIENsYXNzTmFtZXM6OmdldE5hbWU8VmFsPigpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICBFUlJfTEVOLAorICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBuYWtlZCB0ZXN0ICh0eXBlOiAlcykiLAorICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVzOjpnZXROYW1lPFZhbD4oKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CkBAIC03MSwxMSArNzQsMTEgQEAKICAgcHJvdG9jb2wtPnJlYWRGaWVsZEJlZ2luKG5hbWUsIGZpZWxkVHlwZSwgZmllbGRJZCk7CiAKICAgaWYgKGZpZWxkSWQgIT0gMTUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOworICAgIFRIUklGVF9TTlBSSU5URihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIElEICh0eXBlOiAlcykiLCB0eXBlaWQodmFsKS5uYW1lKCkpOwogICAgIHRocm93IFRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKICAgfQogICBpZiAoZmllbGRUeXBlICE9IHR5cGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIEZpZWxkIFR5cGUgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgRmllbGQgVHlwZSAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CiAgIH0KIApAQCAtODMsNyArODYsNyBAQAogICBHZW5lcmljSU86OnJlYWQocHJvdG9jb2wsIG91dCk7CiAKICAgaWYgKG91dCAhPSB2YWwpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICJJbnZhbGlkIHZhbHVlIHJlYWQgKHR5cGU6ICVzKSIsIHR5cGVpZCh2YWwpLm5hbWUoKSk7CisgICAgVEhSSUZUX1NOUFJJTlRGKGVycm9yTWVzc2FnZSwgRVJSX0xFTiwgIkludmFsaWQgdmFsdWUgcmVhZCAodHlwZTogJXMpIiwgdHlwZWlkKHZhbCkubmFtZSgpKTsKICAgICB0aHJvdyBURXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CiAgIH0KIApAQCAtOTcsMjAgKzEwMCwxOCBAQAogICAgIGNvbnN0IGNoYXIqIG5hbWU7CiAgICAgVE1lc3NhZ2VUeXBlIHR5cGU7CiAgICAgaW50MzJfdCBzZXFpZDsKLSAgfSBtZXNzYWdlc1s0XSA9IHsKLSAgICB7InNob3J0IG1lc3NhZ2UgbmFtZSIsIFRfQ0FMTCwgMH0sCi0gICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAotICAgIHsibG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyIsIFRfRVhDRVBUSU9OLCAxIDw8IDE2fSwKLSAgICB7Ikphbmt5IiwgVF9DQUxMLCAwfQotICB9OworICB9IG1lc3NhZ2VzW10gPSB7eyJzaG9ydCBtZXNzYWdlIG5hbWUiLCBUX0NBTEwsIDB9LAorICAgICAgICAgICAgICAgICAgeyIxIiwgVF9SRVBMWSwgMTIzNDV9LAorICAgICAgICAgICAgICAgICAgeyJsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIiwgVF9FWENFUFRJT04sIDEgPDwgMTZ9LAorICAgICAgICAgICAgICAgICAgeyJvbmUgd2F5IHB1c2giLCBUX09ORVdBWSwgMTJ9LAorICAgICAgICAgICAgICAgICAgeyJKYW5reSIsIFRfQ0FMTCwgMH19OworICBjb25zdCBpbnQgbWVzc2FnZXNfY291bnQgPSBzaXplb2YobWVzc2FnZXMpIC8gc2l6ZW9mKFRNZXNzYWdlKTsKIAotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzX2NvdW50OyBpKyspIHsKICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRQcm90byh0cmFuc3BvcnQpKTsKIAotICAgIHByb3RvY29sLT53cml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlc1tpXS5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpXS5zZXFpZCk7CisgICAgcHJvdG9jb2wtPndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2VzW2ldLm5hbWUsIG1lc3NhZ2VzW2ldLnR5cGUsIG1lc3NhZ2VzW2ldLnNlcWlkKTsKICAgICBwcm90b2NvbC0+d3JpdGVNZXNzYWdlRW5kKCk7CiAKICAgICBzdGQ6OnN0cmluZyBuYW1lOwpAQCAtMTE4LDkgKzExOSw3IEBACiAgICAgaW50MzJfdCBzZXFpZDsKIAogICAgIHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKTsKLSAgICBpZiAobmFtZSAhPSBtZXNzYWdlc1tpXS5uYW1lIHx8Ci0gICAgICAgIHR5cGUgIT0gbWVzc2FnZXNbaV0udHlwZSB8fAotICAgICAgICBzZXFpZCAhPSBtZXNzYWdlc1tpXS5zZXFpZCkgeworICAgIGlmIChuYW1lICE9IG1lc3NhZ2VzW2ldLm5hbWUgfHwgdHlwZSAhPSBtZXNzYWdlc1tpXS50eXBlIHx8IHNlcWlkICE9IG1lc3NhZ2VzW2ldLnNlcWlkKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJyZWFkTWVzc2FnZUJlZ2luIGZhaWxlZC4iKTsKICAgICB9CiAgIH0KQEAgLTE0Myw4ICsxNDIsOCBAQAogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0xKTsKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PigoaW50MTZfdCktMTUwMDApOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KChpbnQxNl90KS0weDdmZmYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDE2X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQxNl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MTZfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSk7CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kxNiwgaW50MTZfdD4oKGludDE2X3QpMCk7CiAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JMTYsIGludDE2X3Q+KChpbnQxNl90KTEpOwpAQCAtMTY1LDggKzE2NCw4IEBACiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTEpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KC0xNTAwMCk7CiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oLTB4ZmZmZik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50MzJfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDMyX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQzMl90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKIAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigwKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oMSk7CkBAIC0xODIsMjQgKzE4MSwyMyBAQAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMTUwMDApOwogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTMyLCBpbnQzMl90PigtMHhmZmZmKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0kzMiwgaW50MzJfdD4oLTB4ZmZmZmZmKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSk7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICsgMTApOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpIC0gMTYpOwotICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKTsKLSAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgoKSk7Ci0KKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpICsgMTApOworICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkgLSAxNik7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbikoKSk7CisgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSk7CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigwKTsKICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigxTCA8PCBpKTsKLSAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUwgPDwgaSkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oLSgxTEwgPDwgaSkpOwogICAgIH0KIAogICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigwKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYyOyBpKyspIHsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTCA8PCBpKTsKLSAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3RGaWVsZDxUUHJvdG8sIFRfSTY0LCBpbnQ2NF90PigxTEwgPDwgaSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTEwgPDwgaSkpOwogICAgIH0KIAogICAgIHRlc3ROYWtlZDxUUHJvdG8sIGRvdWJsZT4oMTIzLjQ1Nik7CkBAIC0yMDgsNyArMjA2LDcgQEAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBzdGQ6OnN0cmluZz4oInNob3J0Iik7CiAgICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJib3JkZXJsaW5ldGlueSIpOwogICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiYSBiaXQgbG9uZ2VyIHRoYW4gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIik7Ci0gICAgdGVzdE5ha2VkPFRQcm90bywgc3RkOjpzdHJpbmc+KCJceDFceDJceDNceDRceDVceDZceDdceDhceDlceEEiKTsgLy9raW5kYSBiaW5hcnkgdGVzdAorICAgIHRlc3ROYWtlZDxUUHJvdG8sIHN0ZDo6c3RyaW5nPigiXHgxXHgyXHgzXHg0XHg1XHg2XHg3XHg4XHg5XHhBIik7IC8vIGtpbmRhIGJpbmFyeSB0ZXN0CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCIiKTsKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX1NUUklORywgc3RkOjpzdHJpbmc+KCJzaG9ydCIpOwpAQCAtMjE5LDcgKzIxNyw3IEBACiAKICAgICBwcmludGYoIiVzID0+IE9LXG4iLCBwcm90b25hbWUpOwogICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKLSAgICBzbnByaW50ZihlcnJvck1lc3NhZ2UsIEVSUl9MRU4sICIlcyA9PiBUZXN0IEZBSUxFRDogJXMiLCBwcm90b25hbWUsIGUud2hhdCgpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoZXJyb3JNZXNzYWdlLCBFUlJfTEVOLCAiJXMgPT4gVGVzdCBGQUlMRUQ6ICVzIiwgcHJvdG9uYW1lLCBlLndoYXQoKSk7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQW5ub3RhdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE4ODQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcApAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEFubm90YXRpb25UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgImdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCIKKyNpbmNsdWRlIDxvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKy8vIE5vcm1hbGx5IHRocmlmdCBnZW5lcmF0ZXMgb3N0cmVhbSBvcGVyYXRvcnMsIGhvd2V2ZXIKKy8vIHdpdGggdGhlIGFubm90YXRpb24gImNwcC5jdXN0b21vc3RyZWFtIiBvbmUgY2FuIHRlbGwgdGhlCisvLyBjb21waWxlciB0aGV5IGFyZSBnb2luZyB0byBwcm92aWRlIHRoZWlyIG93biwgYW5kIG5vdAorLy8gZW1pdCBvcGVyYXRvciA8PCBvciBwcmludFRvKCkuCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBvc3RyX2N1c3RvbSYgb3NjKQoreworICBvcyA8PCAieyBiYXIgPSAiIDw8IG9zYy5iYXIgPDwgIjsgfSI7CisgIHJldHVybiBvczsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEJPT1NUX1RFU1RfTU9EVUxFKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jb21waWxlcl9nZW5lcmF0ZWRfb3N0cmVhbV9vcGVyYXRvcikKK3sKKyAgb3N0cl9kZWZhdWx0IGRlZjsKKyAgZGVmLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3NkOworICBzc2QgPDwgZGVmOworICBCT09TVF9DSEVDS19FUVVBTChzc2Quc3RyKCksICJvc3RyX2RlZmF1bHQoYmFyPTEwKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF9jdXN0b21vc3RyZWFtX3VzZXNfY29uc3VtaW5nX2FwcGxpY2F0aW9uX2RlZmluaXRpb24pCit7CisgIG9zdHJfY3VzdG9tIGN1czsKKyAgY3VzLl9fc2V0X2JhcigxMCk7CisKKyAgc3RkOjpzdHJpbmdzdHJlYW0gY3NkOworICBjc2QgPDwgY3VzOworICBCT09TVF9DSEVDS19FUVVBTChjc2Quc3RyKCksICJ7IGJhciA9IDEwOyB9Iik7Cit9CisKKy8qKgorICogRGlzYWJsZWQ7IHNlZSBUSFJJRlQtMTU2NyAtIG5vdCBzdXJlIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfY3BwX3R5cGUpIHsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgImNwcC50eXBlIiBhbm5vdGF0aW9uIGNoYW5nZXMgInN0cnVjdCBmb28iIHRvICJEZW5zZUZvbyIKKyAgLy8gVGhpcyB3b24ndCBjb21waWxlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc2hhbmRsZWQKKyAgRGVuc2VGb28gZm9vOworICBmb28uX19zZXRfYmFyKDUpOworfQorICovCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCmluZGV4IDVjYWFhZTguLjc2ODZlNGUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6YmFzZTY0X2VuY29kZTsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6YmFzZTY0X2RlY29kZTsKIAotQk9PU1RfQVVUT19URVNUX1NVSVRFKCBCYXNlNjRUZXN0ICkKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShCYXNlNjRUZXN0KQogCiB2b2lkIHNldHVwVGVzdERhdGEoaW50IGksIHVpbnQ4X3QqIGRhdGEsIGludCYgbGVuKSB7CiAgIGxlbiA9IDA7CkBAIC0zNywxMiArMzcsMTYgQEAKIH0KIAogdm9pZCBjaGVja0VuY29kaW5nKHVpbnQ4X3QqIGRhdGEsIGludCBsZW4pIHsKKyNpZmRlZiBOREVCVUcKKyAgKCh2b2lkKWRhdGEpOworI2VuZGlmCisKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgIEJPT1NUX0FTU0VSVChpc2FsbnVtKGRhdGFbaV0pIHx8IGRhdGFbaV0gPT0gJy8nIHx8IGRhdGFbaV0gPT0gJysnKTsKICAgfQogfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9CYXNlNjRfRW5jb2RlX0RlY29kZSApIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfQmFzZTY0X0VuY29kZV9EZWNvZGUpIHsKICAgaW50IGxlbjsKICAgdWludDhfdCB0ZXN0SW5wdXRbM107CiAgIHVpbnQ4X3QgdGVzdE91dHB1dFs0XTsKQEAgLTY0LDcgKzY4LDYgQEAKICAgICAvLyBkZWNvZGUgb3V0cHV0IGFuZCBjaGVjayB0aGF0IGl0IG1hdGNoZXMgaW5wdXQKICAgICBiYXNlNjRfZGVjb2RlKHRlc3RPdXRwdXQsIGxlbiArIDEpOwogICAgIEJPT1NUX0FTU0VSVCgwID09IG1lbWNtcCh0ZXN0SW5wdXQsIHRlc3RPdXRwdXQsIGxlbikpOwotCiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0JlbmNobWFyay5jcHAgYi9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcAppbmRleCA5ZWUyNTg2Li41ZmY3N2FhIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcApAQCAtMjEsMTEgKzIxLDEzIEBACiAjaW5jbHVkZSA8Y29uZmlnLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxjbWF0aD4KLSNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgiCisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKLSNpbmNsdWRlIDx0aW1lLmg+CisKICNpZmRlZiBIQVZFX1NZU19USU1FX0gKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2VuZGlmCkBAIC0zNCw3NiArMzYsMjA3IEBACiBwdWJsaWM6CiAgIHRpbWV2YWwgdlN0YXJ0OwogCi0gIFRpbWVyKCkgewotICAgIGdldHRpbWVvZmRheSgmdlN0YXJ0LCAwKTsKLSAgfQotICB2b2lkIHN0YXJ0KCkgewotICAgIGdldHRpbWVvZmRheSgmdlN0YXJ0LCAwKTsKLSAgfQorICBUaW1lcigpIHsgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdlN0YXJ0LCAwKTsgfQorICB2b2lkIHN0YXJ0KCkgeyBUSFJJRlRfR0VUVElNRU9GREFZKCZ2U3RhcnQsIDApOyB9CiAKICAgZG91YmxlIGZyYW1lKCkgewogICAgIHRpbWV2YWwgdkVuZDsKLSAgICBnZXR0aW1lb2ZkYXkoJnZFbmQsIDApOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJnZFbmQsIDApOwogICAgIGRvdWJsZSBkc3RhcnQgPSB2U3RhcnQudHZfc2VjICsgKChkb3VibGUpdlN0YXJ0LnR2X3VzZWMgLyAxMDAwMDAwLjApOwogICAgIGRvdWJsZSBkZW5kID0gdkVuZC50dl9zZWMgKyAoKGRvdWJsZSl2RW5kLnR2X3VzZWMgLyAxMDAwMDAwLjApOwogICAgIHJldHVybiBkZW5kIC0gZHN0YXJ0OwogICB9Ci0KIH07CiAKIGludCBtYWluKCkgewotICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0gIHVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyAgdXNpbmcgc3RkOjpjb3V0OworICB1c2luZyBzdGQ6OmVuZGw7CiAKICAgT25lT2ZFYWNoIG9vZTsKLSAgb29lLmltX3RydWUgICA9IHRydWU7Ci0gIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKLSAgb29lLmFfYml0ZSAgICA9IDB4N2Y7CisgIG9vZS5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS5hX2JpdGUgPSAweDdmOwogICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKKyAgb29lLmludGVnZXIzMiA9IDEgPDwgMjQ7CiAgIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwogICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkpTT04gVEhJUyEgXCJcMSI7Ci0gIG9vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOworICBvb2Uuc29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CiAgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBpbnQgbnVtID0gMTAwMDAwOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CiAKLSAgaW50IG51bSA9IDEwMDAwMDA7CisgIHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICB1aW50MzJfdCBkYXRhc2l6ZSA9IDA7CiAKICAgeworICAgIGJ1Zi0+cmVzZXRCdWZmZXIoKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBidWYtPnJlc2V0QnVmZmVyKCk7Ci0gICAgICBUQmluYXJ5UHJvdG9jb2xUPFRCdWZmZXJCYXNlPiBwcm90KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewogICAgICAgb29lLndyaXRlKCZwcm90KTsKICAgICB9Ci0gICAgY291dCA8PCAiV3JpdGU6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJXcml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CiAgIH0KIAotICB1aW50OF90KiBkYXRhOwotICB1aW50MzJfdCBkYXRhc2l6ZTsKLQogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKICAgICBUaW1lciB0aW1lcjsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpICsrKSB7Ci0gICAgICBPbmVPZkVhY2ggb29lMjsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKLSAgICAgIC8vYnVmMi0+cmVzZXRCdWZmZXIoZGF0YSwgZGF0YXNpemUpOwotICAgICAgVEJpbmFyeVByb3RvY29sVDxUQnVmZmVyQmFzZT4gcHJvdChidWYyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICBvb2UyLnJlYWQoJnByb3QpOwotCi0gICAgICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG9vZTIpIDw8IGVuZGwgPDwgZW5kbDsKICAgICB9Ci0gICAgY291dCA8PCAiIFJlYWQ6ICIgPDwgbnVtIC8gKDEwMDAgKiB0aW1lci5mcmFtZSgpKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgIG9vZS53cml0ZSgmcHJvdCk7CisgICAgfQorICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIldyaXRlIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBPbmVPZkVhY2ggb29lMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICBvb2UyLnJlYWQoJnByb3QpOworICAgIH0KKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICIgUmVhZCBsaXR0bGUgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lLndyaXRlKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiV3JpdGUgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOworICAgIE9uZU9mRWFjaCBvb2UyOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgeworICAgICAgb29lMi5yZWFkKCZwcm90KTsKKyAgICB9CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIFJlYWQgYmlnIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKworICBkYXRhID0gTlVMTDsKKyAgZGF0YXNpemUgPSAwOworICBudW0gPSAxMDAwMDAwMDsKKworICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjsKKyAgbGlzdERvdWJsZVBlcmYuZmllbGQucmVzZXJ2ZShudW0pOworICBmb3IgKGludCB4ID0gMDsgeCA8IG51bTsgKyt4KQorICAgIGxpc3REb3VibGVQZXJmLmZpZWxkLnB1c2hfYmFjayhkb3VibGUoeCkpOworCisgIGJ1Zi5yZXNldChuZXcgVE1lbW9yeUJ1ZmZlcihudW0gKiAxMDApKTsKKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYpOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYud3JpdGUoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIkRvdWJsZSB3cml0ZSBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CisgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOworICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOworICAgIFRpbWVyIHRpbWVyOworCisgICAgbGlzdERvdWJsZVBlcmYyLnJlYWQoJnByb3QpOworICAgIGVsYXBzZWQgPSB0aW1lci5mcmFtZSgpOworICAgIGNvdXQgPDwgIiBEb3VibGUgcmVhZCBiaWcgZW5kaWFuOiAiIDw8IG51bSAvICgxMDAwICogZWxhcHNlZCkgPDwgIiBrSHoiIDw8IGVuZGw7CisgIH0KKworICB7CisgICAgYnVmLT5yZXNldEJ1ZmZlcigpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmKTsKKyAgICBkb3VibGUgZWxhcHNlZCA9IDAuMDsKKyAgICBUaW1lciB0aW1lcjsKKworICAgIGxpc3REb3VibGVQZXJmLndyaXRlKCZwcm90KTsKKyAgICBlbGFwc2VkID0gdGltZXIuZnJhbWUoKTsKKyAgICBjb3V0IDw8ICJEb3VibGUgd3JpdGUgbGl0dGxlIGVuZGlhbjogIiA8PCBudW0gLyAoMTAwMCAqIGVsYXBzZWQpIDw8ICIga0h6IiA8PCBlbmRsOworICB9CisKKyAgeworICAgIExpc3REb3VibGVQZXJmIGxpc3REb3VibGVQZXJmMjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGxpdHRsZSBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBidWYtPnJlc2V0QnVmZmVyKCk7CisgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1Zik7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZi53cml0ZSgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiRG91YmxlIHdyaXRlIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKKyAgfQorCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKKyAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CisgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CisgICAgVGltZXIgdGltZXI7CisKKyAgICBsaXN0RG91YmxlUGVyZjIucmVhZCgmcHJvdCk7CisgICAgZWxhcHNlZCA9IHRpbWVyLmZyYW1lKCk7CisgICAgY291dCA8PCAiIERvdWJsZSByZWFkIGJpZyBlbmRpYW46ICIgPDwgbnVtIC8gKDEwMDAgKiBlbGFwc2VkKSA8PCAiIGtIeiIgPDwgZW5kbDsKICAgfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ0N2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDA1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKK2lmIChXSVRIX0RZTl9MSU5LX1RFU1QpCisgICAgYWRkX2RlZmluaXRpb25zKCAtREJPT1NUX1RFU1RfRFlOX0xJTksgKQorZW5kaWYoKQorCisjIE1ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworIyBDcmVhdGUgdGhlIHRocmlmdCBDKysgdGVzdCBsaWJyYXJ5CitzZXQodGVzdGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgKKyAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oCisgICAgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcAorICAgIGdlbi1jcHAvT25lV2F5U2VydmljZS5oCisgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmgKKyAgICBUaHJpZnRUZXN0X2V4dHJhcy5jcHAKKyAgICBEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCispCisKK2FkZF9saWJyYXJ5KHRlc3RnZW5jcHAgU1RBVElDICR7dGVzdGdlbmNwcF9TT1VSQ0VTfSkKKworc2V0KHRlc3RnZW5jcHBfY29iX1NPVVJDRVMKKyAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL0NoaWxkU2VydmljZS5oCisgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaAorICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaAorICAgIGdlbi1jcHAvcHJvY190eXBlcy5jcHAKKyAgICBnZW4tY3BwL3Byb2NfdHlwZXMuaAorKQorYWRkX2xpYnJhcnkodGVzdGdlbmNwcF9jb2IgU1RBVElDICR7dGVzdGdlbmNwcF9jb2JfU09VUkNFU30pCisKK2FkZF9leGVjdXRhYmxlKEJlbmNobWFyayBCZW5jaG1hcmsuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEJlbmNobWFyayB0ZXN0Z2VuY3BwKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKEJlbmNobWFyayB0aHJpZnQpCithZGRfdGVzdChOQU1FIEJlbmNobWFyayBDT01NQU5EIEJlbmNobWFyaykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhCZW5jaG1hcmsgdGVzdGdlbmNwcCkKKworc2V0KFVuaXRUZXN0X1NPVVJDRVMKKyAgICBVbml0VGVzdE1haW4uY3BwCisgICAgT25lV2F5SFRUUFRlc3QuY3BwCisgICAgVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCisgICAgVEJ1ZmZlckJhc2VUZXN0LmNwcAorICAgIEJhc2U2NFRlc3QuY3BwCisgICAgVG9TdHJpbmdUZXN0LmNwcAorICAgIFR5cGVkZWZUZXN0LmNwcAorICAgIFRTZXJ2ZXJTb2NrZXRUZXN0LmNwcAorICAgIFRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcAorKQorCitpZihOT1QgV0lUSF9TVERUSFJFQURTIEFORCBOT1QgTVNWQyBBTkQgTk9UIE1JTkdXKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCkKKyAgICBsaXN0KEFQUEVORCBVbml0VGVzdF9TT1VSQ0VTIGNvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUoVW5pdFRlc3RzICR7VW5pdFRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVW5pdFRlc3RzIHRlc3RnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFVuaXRUZXN0cyB0aHJpZnQpCithZGRfdGVzdChOQU1FIFVuaXRUZXN0cyBDT01NQU5EIFVuaXRUZXN0cykKK2lmICggTVNWQyApCisgICAgIyBEaXNhYmxlIEM0NTAzOiBkZWNvcmF0ZWQgbmFtZSBsZW5ndGggZXhjZWVkZWQsIG5hbWUgd2FzIHRydW5jYXRlZAorICAgICMgJ2luc2FuaXR5JyByZXN1bHRzIGluIHZlcnkgbG9uZyBkZWNvcmF0ZWQgbmFtZXMKKyAgICBzZXRfcHJvcGVydHkoIFRBUkdFVCBVbml0VGVzdHMgQVBQRU5EX1NUUklORyBQUk9QRVJUWSBDT01QSUxFX0ZMQUdTIC93ZDQ1MDMgKQorZW5kaWYgKCBNU1ZDICkKKworCitzZXQoIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgVFNvY2tldEludGVycnVwdFRlc3QuY3BwCisgICAgIFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorKQoraWYgKFdJTjMyKQorICAgIGxpc3QoQVBQRU5EIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMKKyAgICAgICAgVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcAorICAgICkKK2VuZGlmKCkKK2FkZF9leGVjdXRhYmxlKFRJbnRlcnJ1cHRUZXN0ICR7VEludGVycnVwdFRlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEludGVycnVwdFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEludGVycnVwdFRlc3QgdGhyaWZ0KQoraWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRJbnRlcnJ1cHRUZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBUSW50ZXJydXB0VGVzdCBDT01NQU5EIFRJbnRlcnJ1cHRUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKKworYWRkX2V4ZWN1dGFibGUoVFNlcnZlckludGVncmF0aW9uVGVzdCBUU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUU2VydmVySW50ZWdyYXRpb25UZXN0IHRocmlmdCkKK2lmIChOT1QgTVNWQyBBTkQgTk9UICR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgQU5EIE5PVCBNSU5HVykKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUU2VydmVySW50ZWdyYXRpb25UZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBUU2VydmVySW50ZWdyYXRpb25UZXN0IENPTU1BTkQgVFNlcnZlckludGVncmF0aW9uVGVzdCkKKworaWYoV0lUSF9aTElCKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7WkxJQl9JTkNMVURFX0RJUlN9IikKK2FkZF9leGVjdXRhYmxlKFRyYW5zcG9ydFRlc3QgVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVHJhbnNwb3J0VGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAke1pMSUJfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRyYW5zcG9ydFRlc3QgdGhyaWZ0KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRyYW5zcG9ydFRlc3QgdGhyaWZ0eikKK2FkZF90ZXN0KE5BTUUgVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRyYW5zcG9ydFRlc3QpCisKK2FkZF9leGVjdXRhYmxlKFpsaWJUZXN0IFpsaWJUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhabGliVGVzdAorICAgIHRlc3RnZW5jcHAKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgICAke1pMSUJfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFpsaWJUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShabGliVGVzdCB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBabGliVGVzdCBDT01NQU5EIFpsaWJUZXN0KQorZW5kaWYoV0lUSF9aTElCKQorCithZGRfZXhlY3V0YWJsZShBbm5vdGF0aW9uVGVzdCBBbm5vdGF0aW9uVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQW5ub3RhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQW5ub3RhdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBBbm5vdGF0aW9uVGVzdCBDT01NQU5EIEFubm90YXRpb25UZXN0KQorCithZGRfZXhlY3V0YWJsZShFbnVtVGVzdCBFbnVtVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoRW51bVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoRW51bVRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBFbnVtVGVzdCBDT01NQU5EIEVudW1UZXN0KQorCitpZihIQVZFX0dFVE9QVF9IKQorYWRkX2V4ZWN1dGFibGUoVEZpbGVUcmFuc3BvcnRUZXN0IFRGaWxlVHJhbnNwb3J0VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoVEZpbGVUcmFuc3BvcnRUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFRGaWxlVHJhbnNwb3J0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRGaWxlVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRGaWxlVHJhbnNwb3J0VGVzdCkKK2VuZGlmKCkKKworYWRkX2V4ZWN1dGFibGUoVEZEVHJhbnNwb3J0VGVzdCBURkRUcmFuc3BvcnRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhURkRUcmFuc3BvcnRUZXN0CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVEZEVHJhbnNwb3J0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFRGRFRyYW5zcG9ydFRlc3QgQ09NTUFORCBURkRUcmFuc3BvcnRUZXN0KQorCithZGRfZXhlY3V0YWJsZShUUGlwZWRUcmFuc3BvcnRUZXN0IFRQaXBlZFRyYW5zcG9ydFRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRQaXBlZFRyYW5zcG9ydFRlc3QKKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKykKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUGlwZWRUcmFuc3BvcnRUZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgVFBpcGVkVHJhbnNwb3J0VGVzdCBDT01NQU5EIFRQaXBlZFRyYW5zcG9ydFRlc3QpCisKK3NldChBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVMKKyAgICBBbGxQcm90b2NvbFRlc3RzLmNwcAorICAgIEFsbFByb3RvY29sVGVzdHMudGNjCisgICAgR2VuZXJpY0hlbHBlcnMKKyAgICApCisKK2FkZF9leGVjdXRhYmxlKEFsbFByb3RvY29sc1Rlc3QgJHtBbGxQcm90b2NvbHNUZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEFsbFByb3RvY29sc1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQWxsUHJvdG9jb2xzVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEFsbFByb3RvY29sc1Rlc3QgQ09NTUFORCBBbGxQcm90b2NvbHNUZXN0KQorCisjIFRoZSBkZWJ1ZyBydW4tdGltZSBpbiBXaW5kb3dzIGFzc2VydHMgb24gaXNwcmludCgpIHdpdGggbmVnYXRpdmUgaW5wdXRzCitpZiAoTk9UIE1TVkMgT1IgKE1TVkMgQU5EIENNQUtFX0JVSUxEX1RZUEUgRVFVQUwgIkRFQlVHIikpCithZGRfZXhlY3V0YWJsZShEZWJ1Z1Byb3RvVGVzdCBEZWJ1Z1Byb3RvVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoRGVidWdQcm90b1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoRGVidWdQcm90b1Rlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBEZWJ1Z1Byb3RvVGVzdCBDT01NQU5EIERlYnVnUHJvdG9UZXN0KQorZW5kaWYoKQorCithZGRfZXhlY3V0YWJsZShKU09OUHJvdG9UZXN0IEpTT05Qcm90b1Rlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKEpTT05Qcm90b1Rlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoSlNPTlByb3RvVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIEpTT05Qcm90b1Rlc3QgQ09NTUFORCBKU09OUHJvdG9UZXN0KQorCithZGRfZXhlY3V0YWJsZShPcHRpb25hbFJlcXVpcmVkVGVzdCBPcHRpb25hbFJlcXVpcmVkVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoT3B0aW9uYWxSZXF1aXJlZFRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoT3B0aW9uYWxSZXF1aXJlZFRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBPcHRpb25hbFJlcXVpcmVkVGVzdCBDT01NQU5EIE9wdGlvbmFsUmVxdWlyZWRUZXN0KQorCithZGRfZXhlY3V0YWJsZShSZWN1cnNpdmVUZXN0IFJlY3Vyc2l2ZVRlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFJlY3Vyc2l2ZVRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoUmVjdXJzaXZlVGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIFJlY3Vyc2l2ZVRlc3QgQ09NTUFORCBSZWN1cnNpdmVUZXN0KQorCithZGRfZXhlY3V0YWJsZShTcGVjaWFsaXphdGlvblRlc3QgU3BlY2lhbGl6YXRpb25UZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhTcGVjaWFsaXphdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3BlY2lhbGl6YXRpb25UZXN0IHRocmlmdCkKK2FkZF90ZXN0KE5BTUUgU3BlY2lhbGl6YXRpb25UZXN0IENPTU1BTkQgU3BlY2lhbGl6YXRpb25UZXN0KQorCitzZXQoY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTCisgICAgY29uY3VycmVuY3kvVGVzdHMuY3BwCisgICAgY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKyAgICBjb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaAorICAgIGNvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKykKK2FkZF9leGVjdXRhYmxlKGNvbmN1cnJlbmN5X3Rlc3QgJHtjb25jdXJyZW5jeV90ZXN0X1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKGNvbmN1cnJlbmN5X3Rlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBjb25jdXJyZW5jeV90ZXN0IENPTU1BTkQgY29uY3VycmVuY3lfdGVzdCkKKworc2V0KGxpbmtfdGVzdF9TT1VSQ0VTCisgICAgbGluay9MaW5rVGVzdC5jcHAKKyAgICBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaAorICAgIGxpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCisgICAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKKykKKworYWRkX2V4ZWN1dGFibGUobGlua190ZXN0ICR7bGlua190ZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxpbmtfdGVzdCB0ZXN0Z2VuY3BwX2NvYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShsaW5rX3Rlc3QgdGhyaWZ0KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGxpbmtfdGVzdCB0ZXN0Z2VuY3BwKQorYWRkX3Rlc3QoTkFNRSBsaW5rX3Rlc3QgQ09NTUFORCBsaW5rX3Rlc3QpCisKK2lmKFdJVEhfTElCRVZFTlQpCitzZXQocHJvY2Vzc29yX3Rlc3RfU09VUkNFUworICAgIHByb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAorICAgIHByb2Nlc3Nvci9FdmVudExvZy5jcHAKKyAgICBwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcAorICAgIHByb2Nlc3Nvci9FdmVudExvZy5oCisgICAgcHJvY2Vzc29yL0hhbmRsZXJzLmgKKyAgICBwcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKykKK2FkZF9leGVjdXRhYmxlKHByb2Nlc3Nvcl90ZXN0ICR7cHJvY2Vzc29yX3Rlc3RfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMocHJvY2Vzc29yX3Rlc3QKKyAgICB0ZXN0Z2VuY3BwX2NvYgorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHByb2Nlc3Nvcl90ZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShwcm9jZXNzb3JfdGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgcHJvY2Vzc29yX3Rlc3QgQ09NTUFORCBwcm9jZXNzb3JfdGVzdCkKKworc2V0KFROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFUyBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcCkKK2FkZF9leGVjdXRhYmxlKFROb25ibG9ja2luZ1NlcnZlclRlc3QgJHtUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0X1NPVVJDRVN9KQoraW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVE5vbmJsb2NraW5nU2VydmVyVGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtMSUJFVkVOVF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU2VydmVyVGVzdCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU2VydmVyVGVzdCB0aHJpZnRuYikKK2FkZF90ZXN0KE5BTUUgVE5vbmJsb2NraW5nU2VydmVyVGVzdCBDT01NQU5EIFROb25ibG9ja2luZ1NlcnZlclRlc3QpCisKK2lmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKKyAgc2V0KFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFUyBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCkKKyAgYWRkX2V4ZWN1dGFibGUoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCAke1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFU30pCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtMSUJFVkVOVF9JTkNMVURFX0RJUlN9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorICAgIHRlc3RnZW5jcHBfY29iCisgICAgJHtMSUJFVkVOVF9MSUJSQVJJRVN9CisgICAgJHtCb29zdF9MSUJSQVJJRVN9CisgICkKKyAgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgdGhyaWZ0KQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnRuYikKKyAgYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCitlbmRpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCitlbmRpZihXSVRIX0xJQkVWRU5UKQorCitpZihPUEVOU1NMX0ZPVU5EIEFORCBXSVRIX09QRU5TU0wpCithZGRfZXhlY3V0YWJsZShPcGVuU1NMTWFudWFsSW5pdFRlc3QgT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhPcGVuU1NMTWFudWFsSW5pdFRlc3QKKyAgICAke09QRU5TU0xfTElCUkFSSUVTfQorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKE9wZW5TU0xNYW51YWxJbml0VGVzdCB0aHJpZnQpCithZGRfdGVzdChOQU1FIE9wZW5TU0xNYW51YWxJbml0VGVzdCBDT01NQU5EIE9wZW5TU0xNYW51YWxJbml0VGVzdCkKKworYWRkX2V4ZWN1dGFibGUoU2VjdXJpdHlUZXN0IFNlY3VyaXR5VGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0CisgICAgdGVzdGdlbmNwcAorICAgICR7Qm9vc3RfTElCUkFSSUVTfQorKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFNlY3VyaXR5VGVzdCB0aHJpZnQpCitpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCit0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0IC1scnQpCitlbmRpZiAoKQorYWRkX3Rlc3QoTkFNRSBTZWN1cml0eVRlc3QgQ09NTUFORCBTZWN1cml0eVRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorCitlbmRpZigpCisKK2lmKFdJVEhfUVQ0KQorc2V0KENNQUtFX0FVVE9NT0MgT04pCitmaW5kX3BhY2thZ2UoUXQ0IFJFUVVJUkVEIENPTVBPTkVOVFMgUXRUZXN0KQorc2V0KFRRVGNwU2VydmVyVGVzdF9TT1VSQ0VTCisgICAgcXQvVFFUY3BTZXJ2ZXJUZXN0LmNwcAorKQorYWRkX2V4ZWN1dGFibGUoVFFUY3BTZXJ2ZXJUZXN0ICR7VFFUY3BTZXJ2ZXJUZXN0X1NPVVJDRVN9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRRVGNwU2VydmVyVGVzdCB0ZXN0Z2VuY3BwX2NvYiB0aHJpZnRxdCBRdDQ6OlF0VGVzdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBUUVRjcFNlcnZlclRlc3QgQ09NTUFORCBUUVRjcFNlcnZlclRlc3QpCitlbmRpZigpCisKK2lmKFdJVEhfUVQ1KQorYWRkX3N1YmRpcmVjdG9yeShxdCkKK2VuZGlmKCkKKworIworIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcworIworCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL2Zvb19zZXJ2aWNlLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9FbnVtVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmgKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmNwcCBnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlcnZpY2UuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKKykKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorKQorCithZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAKKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L09uZVdheVRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Byb2Nlc3Nvci9wcm9jLnRocmlmdAorKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKaW5kZXggMjZjYzFlYS4uMDYwZjM1NCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCkBAIC0xNyw4OSArMTcsMjk0IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8aW9zdHJlYW0+CisjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgRGVidWdQcm90b1Rlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAKK3VzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwogCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotICBvb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQ3XG5cYVx0IjsKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxPbmVPZkVhY2g+IG9vZTsKIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvb2UpIDw8IGVuZGwgPDwgZW5kbDsKK3ZvaWQgdGVzdENhc2VTZXR1cF8xKCkgeworICBvb2UucmVzZXQobmV3IE9uZU9mRWFjaCk7CisgIG9vZS0+aW1fdHJ1ZSA9IHRydWU7CisgIG9vZS0+aW1fZmFsc2UgPSBmYWxzZTsKKyAgb29lLT5hX2JpdGUgPSAweDdmOworICBvb2UtPmludGVnZXIxNiA9IDI3MDAwOworICBvb2UtPmludGVnZXIzMiA9IDEgPDwgMjQ7CisgIG9vZS0+aW50ZWdlcjY0ID0gKHVpbnQ2NF90KTYwMDAgKiAxMDAwICogMTAwMDsKKyAgb29lLT5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKKyAgb29lLT5zb21lX2NoYXJhY3RlcnMgPSAiRGVidWcgVEhJUyEiOworICBvb2UtPnpvbWdfdW5pY29kZSA9ICJceGQ3XG5cYVx0IjsKK30KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWJ1Z19wcm90b18xKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOwogCi0gIE5lc3RpbmcgbjsKLSAgbi5teV9vb2UgPSBvb2U7Ci0gIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwotICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKLSAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUuMCkrMSkvMjsKLSAgbi5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzICA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKLSAgbi5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGQwXHg5ZFx4Y2VceGJmXHhlMlx4ODVceGJmXHhkMFx4YmVceGM5XHhhMVx4ZDBceGIzXHhkMFx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDIwXHhjZVx4OTFceDc0XHg3NFx4Y2VceGIxXHhlMlx4ODVceGJkXHhjZVx4YmFceGM3XHg4M1x4ZTJceDgwXHhiYyI7Ci0gIG4ubXlfYm9uay50eXBlICAgID0gMzEzMzc7Ci0gIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIk9uZU9mRWFjaCB7XG4iCisgICAgIiAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAwMjogaW1fZmFsc2UgKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgMDM6IGFfYml0ZSAoYnl0ZSkgPSAweDdmLFxuIgorICAgICIgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAyNzAwMCxcbiIKKyAgICAiICAwNTogaW50ZWdlcjMyIChpMzIpID0gMTY3NzcyMTYsXG4iCisgICAgIiAgMDY6IGludGVnZXI2NCAoaTY0KSA9IDYwMDAwMDAwMDAsXG4iCisgICAgIiAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAzLjE0MTU5MjY1MzU4OTc5MzEsXG4iCisgICAgIiAgMDg6IHNvbWVfY2hhcmFjdGVycyAoc3RyaW5nKSA9IFwiRGVidWcgVEhJUyFcIixcbiIKKyAgICAiICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkN1xcblxcYVxcdFwiLFxuIgorICAgICIgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAxMTogYmFzZTY0IChzdHJpbmcpID0gXCJcIixcbiIKKyAgICAiICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgIFsxXSA9IDB4MDIsXG4iCisgICAgIiAgICBbMl0gPSAweDAzLFxuIgorICAgICIgIH0sXG4iCisgICAgIiAgMTM6IGkxNl9saXN0IChsaXN0KSA9IGxpc3Q8aTE2PlszXSB7XG4iCisgICAgIiAgICBbMF0gPSAxLFxuIgorICAgICIgICAgWzFdID0gMixcbiIKKyAgICAiICAgIFsyXSA9IDMsXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgIFswXSA9IDEsXG4iCisgICAgIiAgICBbMV0gPSAyLFxuIgorICAgICIgICAgWzJdID0gMyxcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoKm9vZSkpOwogCi0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CiAKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxOZXN0aW5nPiBuOwogCi0gIEhvbHlNb2xleSBobTsKK3ZvaWQgdGVzdENhc2VTZXR1cF8yKCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKIAotICBobS5iaWcucHVzaF9iYWNrKG9vZSk7Ci0gIGhtLmJpZy5wdXNoX2JhY2sobi5teV9vb2UpOwotICBobS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLSAgaG0uYmlnWzFdLmFfYml0ZSA9IDB4MzM7CisgIG4ucmVzZXQobmV3IE5lc3RpbmcpOworICBuLT5teV9vb2UgPSAqb29lOworICBuLT5teV9vb2UuaW50ZWdlcjE2ID0gMTY7CisgIG4tPm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKKyAgbi0+bXlfb29lLmludGVnZXI2NCA9IDY0OworICBuLT5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSArIDEpIC8gMjsKKyAgbi0+bXlfb29lLnNvbWVfY2hhcmFjdGVycyA9ICI6UiAobWUgZ29pbmcgXCJycnJyXCIpIjsKKyAgbi0+bXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjBceGQwXHg5ZFx4Y2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGIwXHhjZlx4ODFceGUyXHg4NFx4OGVceDIwXHhjZVx4OTFceDc0XHg3NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YmMiOworICBuLT5teV9ib25rLnR5cGUgPSAzMTMzNzsKKyAgbi0+bXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2RlYnVnX3Byb3RvXzIpIHsKKyAgdGVzdENhc2VTZXR1cF8yKCk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJOZXN0aW5nIHtcbiIKKyAgICAiICAwMTogbXlfYm9uayAoc3RydWN0KSA9IEJvbmsge1xuIgorICAgICIgICAgMDE6IHR5cGUgKGkzMikgPSAzMTMzNyxcbiIKKyAgICAiICAgIDAyOiBtZXNzYWdlIChzdHJpbmcpID0gXCJJIGFtIGEgYm9uay4uLiB4b3IhXCIsXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAwMjogbXlfb29lIChzdHJ1Y3QpID0gT25lT2ZFYWNoIHtcbiIKKyAgICAiICAgIDAxOiBpbV90cnVlIChib29sKSA9IHRydWUsXG4iCisgICAgIiAgICAwMjogaW1fZmFsc2UgKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAwMzogYV9iaXRlIChieXRlKSA9IDB4N2YsXG4iCisgICAgIiAgICAwNDogaW50ZWdlcjE2IChpMTYpID0gMTYsXG4iCisgICAgIiAgICAwNTogaW50ZWdlcjMyIChpMzIpID0gMzIsXG4iCisgICAgIiAgICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjQsXG4iCisgICAgIiAgICAwNzogZG91YmxlX3ByZWNpc2lvbiAoZG91YmxlKSA9IDEuNjE4MDMzOTg4NzQ5ODk0OSxcbiIKKyAgICAiICAgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCIsXG4iCisgICAgIiAgICAwOTogem9tZ191bmljb2RlIChzdHJpbmcpID0gXCJcXHhkM1xceDgwXFx4ZTJcXHg4NVxceGFlXFx4Y2VcXHg5ZCBcXHhkIgorICAgICAgIjBcXHg5ZFxceGNlXFx4YmZcXHhlMlxceDg1XFx4YmZcXHhkMFxceGJlXFx4YzlcXHhhMVxceGQwXFx4YjNcXHhkMFxceGIwIgorICAgICAgIlxceGNmXFx4ODFcXHhlMlxceDg0XFx4OGUgXFx4Y2VcXHg5MXR0XFx4Y2VcXHhiMVxceGUyXFx4ODVcXHhiZFxceGNlXFx4YiIKKyAgICAgICJhXFx4YzdcXHg4M1xceGUyXFx4ODBcXHhiY1wiLFxuIgorICAgICIgICAgMTA6IHdoYXRfd2hvIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgICAxMjogYnl0ZV9saXN0IChsaXN0KSA9IGxpc3Q8Ynl0ZT5bM10ge1xuIgorICAgICIgICAgICBbMF0gPSAweDAxLFxuIgorICAgICIgICAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgICBbMl0gPSAweDAzLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIDE0OiBpNjRfbGlzdCAobGlzdCkgPSBsaXN0PGk2ND5bM10ge1xuIgorICAgICIgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICBbMV0gPSAyLFxuIgorICAgICIgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICB9LFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoKm4pKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIDo6c3RkOjpzaGFyZWRfcHRyPEhvbHlNb2xleT4gaG07CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8zKCkgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBobS5yZXNldChuZXcgSG9seU1vbGV5KTsKKworICBobS0+YmlnLnB1c2hfYmFjaygqb29lKTsKKyAgaG0tPmJpZy5wdXNoX2JhY2sobi0+bXlfb29lKTsKKyAgaG0tPmJpZ1swXS5hX2JpdGUgPSAweDIyOworICBobS0+YmlnWzFdLmFfYml0ZSA9IDB4MzM7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7CiAgIHN0YWdlMS5wdXNoX2JhY2soInRoZW4gYSBvbmUsIHR3byIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aHJlZSEiKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiRk9VUiEhIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAKICAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIGhtLT5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwogICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CisgIGhtLT5ib25rc1sicG9lIl0gPSBzdGFnZTI7Cit9CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcoaG0pIDw8IGVuZGwgPDwgZW5kbDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVidWdfcHJvdG9fMykgeworICB0ZXN0Q2FzZVNldHVwXzMoKTsKIAorICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIkhvbHlNb2xleSB7XG4iCisgICAgIiAgMDE6IGJpZyAobGlzdCkgPSBsaXN0PHN0cnVjdD5bMl0ge1xuIgorICAgICIgICAgWzBdID0gT25lT2ZFYWNoIHtcbiIKKyAgICAiICAgICAgMDE6IGltX3RydWUgKGJvb2wpID0gdHJ1ZSxcbiIKKyAgICAiICAgICAgMDI6IGltX2ZhbHNlIChib29sKSA9IGZhbHNlLFxuIgorICAgICIgICAgICAwMzogYV9iaXRlIChieXRlKSA9IDB4MjIsXG4iCisgICAgIiAgICAgIDA0OiBpbnRlZ2VyMTYgKGkxNikgPSAyNzAwMCxcbiIKKyAgICAiICAgICAgMDU6IGludGVnZXIzMiAoaTMyKSA9IDE2Nzc3MjE2LFxuIgorICAgICIgICAgICAwNjogaW50ZWdlcjY0IChpNjQpID0gNjAwMDAwMDAwMCxcbiIKKyAgICAiICAgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAzLjE0MTU5MjY1MzU4OTc5MzEsXG4iCisgICAgIiAgICAgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIkRlYnVnIFRISVMhXCIsXG4iCisgICAgIiAgICAgIDA5OiB6b21nX3VuaWNvZGUgKHN0cmluZykgPSBcIlxceGQ3XFxuXFxhXFx0XCIsXG4iCisgICAgIiAgICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgICAgIDEyOiBieXRlX2xpc3QgKGxpc3QpID0gbGlzdDxieXRlPlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDB4MDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgICBbMV0gPSBPbmVPZkVhY2gge1xuIgorICAgICIgICAgICAwMTogaW1fdHJ1ZSAoYm9vbCkgPSB0cnVlLFxuIgorICAgICIgICAgICAwMjogaW1fZmFsc2UgKGJvb2wpID0gZmFsc2UsXG4iCisgICAgIiAgICAgIDAzOiBhX2JpdGUgKGJ5dGUpID0gMHgzMyxcbiIKKyAgICAiICAgICAgMDQ6IGludGVnZXIxNiAoaTE2KSA9IDE2LFxuIgorICAgICIgICAgICAwNTogaW50ZWdlcjMyIChpMzIpID0gMzIsXG4iCisgICAgIiAgICAgIDA2OiBpbnRlZ2VyNjQgKGk2NCkgPSA2NCxcbiIKKyAgICAiICAgICAgMDc6IGRvdWJsZV9wcmVjaXNpb24gKGRvdWJsZSkgPSAxLjYxODAzMzk4ODc0OTg5NDksXG4iCisgICAgIiAgICAgIDA4OiBzb21lX2NoYXJhY3RlcnMgKHN0cmluZykgPSBcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCIsXG4iCisgICAgIiAgICAgIDA5OiB6b21nX3VuaWNvZGUgKHN0cmluZykgPSBcIlxceGQzXFx4ODBcXHhlMlxceDg1XFx4YWVcXHhjZVxceDlkIFxcIgorICAgICAgInhkMFxceDlkXFx4Y2VcXHhiZlxceGUyXFx4ODVcXHhiZlxceGQwXFx4YmVcXHhjOVxceGExXFx4ZDBcXHhiM1xceGQwXFx4YiIKKyAgICAgICIwXFx4Y2ZcXHg4MVxceGUyXFx4ODRcXHg4ZSBcXHhjZVxceDkxdHRcXHhjZVxceGIxXFx4ZTJcXHg4NVxceGJkXFx4Y2VcXHgiCisgICAgICAiYmFcXHhjN1xceDgzXFx4ZTJcXHg4MFxceGJjXCIsXG4iCisgICAgIiAgICAgIDEwOiB3aGF0X3dobyAoYm9vbCkgPSBmYWxzZSxcbiIKKyAgICAiICAgICAgMTE6IGJhc2U2NCAoc3RyaW5nKSA9IFwiXCIsXG4iCisgICAgIiAgICAgIDEyOiBieXRlX2xpc3QgKGxpc3QpID0gbGlzdDxieXRlPlszXSB7XG4iCisgICAgIiAgICAgICAgWzBdID0gMHgwMSxcbiIKKyAgICAiICAgICAgICBbMV0gPSAweDAyLFxuIgorICAgICIgICAgICAgIFsyXSA9IDB4MDMsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIDEzOiBpMTZfbGlzdCAobGlzdCkgPSBsaXN0PGkxNj5bM10ge1xuIgorICAgICIgICAgICAgIFswXSA9IDEsXG4iCisgICAgIiAgICAgICAgWzFdID0gMixcbiIKKyAgICAiICAgICAgICBbMl0gPSAzLFxuIgorICAgICIgICAgICB9LFxuIgorICAgICIgICAgICAxNDogaTY0X2xpc3QgKGxpc3QpID0gbGlzdDxpNjQ+WzNdIHtcbiIKKyAgICAiICAgICAgICBbMF0gPSAxLFxuIgorICAgICIgICAgICAgIFsxXSA9IDIsXG4iCisgICAgIiAgICAgICAgWzJdID0gMyxcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAwMjogY29udGFpbiAoc2V0KSA9IHNldDxsaXN0PlszXSB7XG4iCisgICAgIiAgICBsaXN0PHN0cmluZz5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIGxpc3Q8c3RyaW5nPlsyXSB7XG4iCisgICAgIiAgICAgIFswXSA9IFwiYW5kIGEgb25lXCIsXG4iCisgICAgIiAgICAgIFsxXSA9IFwiYW5kIGEgdHdvXCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgbGlzdDxzdHJpbmc+WzNdIHtcbiIKKyAgICAiICAgICAgWzBdID0gXCJ0aGVuIGEgb25lLCB0d29cIixcbiIKKyAgICAiICAgICAgWzFdID0gXCJ0aHJlZSFcIixcbiIKKyAgICAiICAgICAgWzJdID0gXCJGT1VSISFcIixcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAiICAwMzogYm9ua3MgKG1hcCkgPSBtYXA8c3RyaW5nLGxpc3Q+WzNdIHtcbiIKKyAgICAiICAgIFwibm90aGluZ1wiIC0+IGxpc3Q8c3RydWN0PlswXSB7XG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgXCJwb2VcIiAtPiBsaXN0PHN0cnVjdD5bM10ge1xuIgorICAgICIgICAgICBbMF0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDMsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcInF1b3RoXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIFsxXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gNCxcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwidGhlIHJhdmVuXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIFsyXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gNSxcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwibmV2ZXJtb3JlXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgICAgXCJzb21ldGhpbmdcIiAtPiBsaXN0PHN0cnVjdD5bMl0ge1xuIgorICAgICIgICAgICBbMF0gPSBCb25rIHtcbiIKKyAgICAiICAgICAgICAwMTogdHlwZSAoaTMyKSA9IDEsXG4iCisgICAgIiAgICAgICAgMDI6IG1lc3NhZ2UgKHN0cmluZykgPSBcIldhaXQuXCIsXG4iCisgICAgIiAgICAgIH0sXG4iCisgICAgIiAgICAgIFsxXSA9IEJvbmsge1xuIgorICAgICIgICAgICAgIDAxOiB0eXBlIChpMzIpID0gMixcbiIKKyAgICAiICAgICAgICAwMjogbWVzc2FnZSAoc3RyaW5nKSA9IFwiV2hhdD9cIixcbiIKKyAgICAiICAgICAgfSxcbiIKKyAgICAiICAgIH0sXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKCpobSkpOwogCi0gIHJldHVybiAwOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKaW5kZXggYzg5ZGI3NC4uNWM0ZmQzNSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKQEAgLTIxLDEzICsyMSwxNSBAQAogCiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgogCi0KLW5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7IG5hbWVzcGFjZSBkZWJ1ZyB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBkZWJ1ZyB7CiAKIGJvb2wgRW1wdHk6Om9wZXJhdG9yPChFbXB0eSBjb25zdCYgb3RoZXIpIGNvbnN0IHsKLSAgKHZvaWQpIG90aGVyOworICAodm9pZClvdGhlcjsKICAgLy8gSXQgaXMgZW1wdHksIHNvIGFsbCBhcmUgZXF1YWwuCiAgIHJldHVybiBmYWxzZTsKIH0KLQotfX19Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVuc2VQcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczNTc5Zi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3Rlc3QvRGVuc2VQcm90b1Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLS4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gY3BwOmRlbnNlIERlYnVnUHJvdG9UZXN0LnRocmlmdAotLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBjcHA6ZGVuc2UgT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0Ci1nKysgLVdhbGwgLWcgLUkuLi9saWIvY3BwL3NyYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9ib29zdC0xXzMzXzEgXAotICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBcCi0gIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKLSAgRGVuc2VQcm90b1Rlc3QuY3BwIC4uL2xpYi9jcHAvLmxpYnMvbGlidGhyaWZ0LmEgLW8gRGVuc2VQcm90b1Rlc3QKLS4vRGVuc2VQcm90b1Rlc3QKLSovCi0KLS8vIEkgZG8gdGhpcyB0byByZWFjaCBpbnRvIHRoZSBndXRzIG9mIFREZW5zZVByb3RvY29sLiAgU29ycnkuCi0jZGVmaW5lIHByaXZhdGUgcHVibGljCi0jZGVmaW5lIGlubGluZQotCi0jdW5kZWYgTkRFQlVHCi0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCi0jaW5jbHVkZSAiZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIgotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9URGVuc2VQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KLQotCi0vLyBDYW4ndCB1c2UgbWVtY21wIGhlcmUuICBHQ0MgaXMgdG9vIHNtYXJ0LgotYm9vbCBteV9tZW1lcShjb25zdCBjaGFyKiBzdHIxLCBjb25zdCBjaGFyKiBzdHIyLCBpbnQgbGVuKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBpZiAoc3RyMVtpXSAhPSBzdHIyW2ldKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWludCBtYWluKCkgewotICB1c2luZyBzdGQ6OnN0cmluZzsKLSAgdXNpbmcgc3RkOjpjb3V0OwotICB1c2luZyBzdGQ6OmVuZGw7Ci0gIHVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLSAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0gIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7Ci0KLQotICBPbmVPZkVhY2ggb29lOwotICBvb2UuaW1fdHJ1ZSAgID0gdHJ1ZTsKLSAgb29lLmltX2ZhbHNlICA9IGZhbHNlOwotICBvb2UuYV9iaXRlICAgID0gMHhkNjsKLSAgb29lLmludGVnZXIxNiA9IDI3MDAwOwotICBvb2UuaW50ZWdlcjMyID0gMTw8MjQ7Ci0gIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwotICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkRlYnVnIFRISVMhIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0KLSAgLy9jb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvb2UpIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIE5lc3RpbmcgbjsKLSAgbi5teV9vb2UgPSBvb2U7Ci0gIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwotICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKLSAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUpKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OwotICBuLm15X2JvbmsubWVzc2FnZSA9ICJJIGFtIGEgYm9uay4uLiB4b3IhIjsKLQotICAvL2NvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKLQotCi0gIEhvbHlNb2xleSBobTsKLQotICBobS5iaWcucHVzaF9iYWNrKG9vZSk7Ci0gIGhtLmJpZy5wdXNoX2JhY2sobi5teV9vb2UpOwotICBobS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLSAgaG0uYmlnWzFdLmFfYml0ZSA9IDB4MzM7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOwotICBzdGFnZTEuY2xlYXIoKTsKLSAgc3RhZ2UxLnB1c2hfYmFjaygidGhlbiBhIG9uZSwgdHdvIik7Ci0gIHN0YWdlMS5wdXNoX2JhY2soInRocmVlISIpOwotICBzdGFnZTEucHVzaF9iYWNrKCJGT1VSISEiKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKLSAgc3RhZ2UxLmNsZWFyKCk7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDE7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJXYWl0LiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKLSAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKLSAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOwotICBzdGFnZTIuYmFjaygpLnR5cGUgPSAzOwotICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAicXVvdGgiOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDQ7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJ0aGUgcmF2ZW4iOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7Ci0gIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7Ci0gIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7Ci0KLSAgLy9jb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhobSkgPDwgZW5kbCA8PCBlbmRsOwotCi0gIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBzaGFyZWRfcHRyPFREZW5zZVByb3RvY29sPiBwcm90byhuZXcgVERlbnNlUHJvdG9jb2woYnVmZmVyKSk7Ci0gIHByb3RvLT5zZXRUeXBlU3BlYyhIb2x5TW9sZXk6OmxvY2FsX3JlZmxlY3Rpb24pOwotCi0gIGhtLndyaXRlKHByb3RvLmdldCgpKTsKLSAgSG9seU1vbGV5IGhtMjsKLSAgaG0yLnJlYWQocHJvdG8uZ2V0KCkpOwotCi0gIGFzc2VydChobSA9PSBobTIpOwotCi0KLSAgLy8gTGV0J3MgdGVzdCBvdXQgdGhlIHZhcmlhYmxlLWxlbmd0aCBpbnRzLCBzaGFsbCB3ZT8KLSAgdWludDY0X3QgdmxxOwotICAjZGVmaW5lIGNoZWNrb3V0KGksIGMpIHsgXAotICAgIGJ1ZmZlci0+cmVzZXRCdWZmZXIoKTsgXAotICAgIHByb3RvLT52bHFXcml0ZShpKTsgXAotICAgIHByb3RvLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsgXAotICAgIGFzc2VydChteV9tZW1lcShidWZmZXItPmdldEJ1ZmZlckFzU3RyaW5nKCkuZGF0YSgpLCBjLCBzaXplb2YoYyktMSkpOyBcCi0gICAgcHJvdG8tPnZscVJlYWQodmxxKTsgXAotICAgIGFzc2VydCh2bHEgPT0gaSk7IFwKLSAgfQotCi0gIGNoZWNrb3V0KDB4MDAwMDAwMDAsICJceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwNDAsICJceDQwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwN0YsICJceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwODAsICJceDgxXHgwMCIpOwotICBjaGVja291dCgweDAwMDAyMDAwLCAiXHhDMFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDAwM0ZGRiwgIlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDQwMDAsICJceDgxXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgwMDEwMDAwMCwgIlx4QzBceDgwXHgwMCIpOwotICBjaGVja291dCgweDAwMUZGRkZGLCAiXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAyMDAwMDAsICJceDgxXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDgwMDAwMDAsICJceEMwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MEZGRkZGRkYsICJceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MTAwMDAwMDAsICJceDgxXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDIwMDAwMDAwLCAiXHg4Mlx4ODBceDgwXHg4MFx4MDAiKTsKLSAgY2hlY2tvdXQoMHgxRkZGRkZGRiwgIlx4ODFceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4RkZGRkZGRkYsICJceDhGXHhGRlx4RkZceEZGXHg3RiIpOwotCi0gIGNoZWNrb3V0KDB4MDAwMDAwMDEwMDAwMDAwMHVsbCwgIlx4OTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDIwMDAwMDAwMHVsbCwgIlx4QTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDMwMDAwMDAwMHVsbCwgIlx4QjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDcwMDAwMDAwMHVsbCwgIlx4RjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGMDAwMDAwMHVsbCwgIlx4RkZceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGRkZGRkZGRnVsbCwgIlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDgwMDAwMDAwMHVsbCwgIlx4ODFceDgwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGRkZGRkZGRkZ1bGwsICJceDlGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHg3RkZGRkZGRkZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4RkZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4ODFceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLQotICAvLyBUZXN0IG91dCB0aGUgc2xvdyBwYXRoIHdpdGggYSBUQnVmZmVyZWRUcmFuc3BvcnQuCi0gIHNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmX3RyYW5zKG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoYnVmZmVyLCAzKSk7Ci0gIHByb3RvLnJlc2V0KG5ldyBURGVuc2VQcm90b2NvbChidWZmX3RyYW5zKSk7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDEwMDAwMDAwMHVsbCwgIlx4OTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDIwMDAwMDAwMHVsbCwgIlx4QTBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDMwMDAwMDAwMHVsbCwgIlx4QjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDcwMDAwMDAwMHVsbCwgIlx4RjBceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGMDAwMDAwMHVsbCwgIlx4RkZceDgwXHg4MFx4ODBceDAwIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDdGRkZGRkZGRnVsbCwgIlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4MDAwMDAwMDgwMDAwMDAwMHVsbCwgIlx4ODFceDgwXHg4MFx4ODBceDgwXHgwMCIpOwotICBjaGVja291dCgweDFGRkZGRkZGRkZGRkZGRkZ1bGwsICJceDlGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLSAgY2hlY2tvdXQoMHg3RkZGRkZGRkZGRkZGRkZGdWxsLCAiXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceDdGIik7Ci0gIGNoZWNrb3V0KDB4RkZGRkZGRkZGRkZGRkZGRnVsbCwgIlx4ODFceEZGXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4N0YiKTsKLQotICAvLyBUZXN0IG9wdGlvbmFsIHN0dWZmLgotICBwcm90by5yZXNldChuZXcgVERlbnNlUHJvdG9jb2woYnVmZmVyKSk7Ci0gIHByb3RvLT5zZXRUeXBlU3BlYyhNYW55T3B0Ojpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgTWFueU9wdCBtbzEsIG1vMiwgbW8zLCBtbzQsIG1vNSwgbW82OwotICBtbzEub3B0MSA9IDkyMzc1OTM0NzsKLSAgbW8xLm9wdDIgPSAzOTI3NDkyNzQ7Ci0gIG1vMS5vcHQzID0gMzk1NzM5NDAyOwotICBtbzEuZGVmNCA9IDI5NDczMDkyODsKLSAgbW8xLm9wdDUgPSAzOTQzMDkyMTg7Ci0gIG1vMS5vcHQ2ID0gODMyMTk0NzIzOwotICBtbzEuX19pc3NldC5vcHQxID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MiA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDMgPSB0cnVlOwotICBtbzEuX19pc3NldC5kZWY0ID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDYgPSB0cnVlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vMi5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW8yLl9faXNzZXQub3B0MSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDIgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5vcHQzID09IHRydWUpOwotICBhc3NlcnQobW8yLl9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vMi5fX2lzc2V0Lm9wdDUgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzIuX19pc3NldC5vcHQ2ID09IHRydWUpOwotCi0gIGFzc2VydChtbzEgPT0gbW8yKTsKLQotICBtbzEuX19pc3NldC5vcHQxID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDMgPSBmYWxzZTsKLSAgbW8xLl9faXNzZXQub3B0NSA9IGZhbHNlOwotCi0gIG1vMS53cml0ZShwcm90by5nZXQoKSk7Ci0gIG1vMy5yZWFkKHByb3RvLmdldCgpKTsKLQotICBhc3NlcnQobW8zLl9faXNzZXQub3B0MSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQyID09IHRydWUpOwotICBhc3NlcnQobW8zLl9faXNzZXQub3B0MyA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW8zLl9faXNzZXQub3B0NSA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzMuX19pc3NldC5vcHQ2ID09IHRydWUpOwotCi0gIGFzc2VydChtbzEgPT0gbW8zKTsKLQotICBtbzEuX19pc3NldC5vcHQxID0gdHJ1ZTsKLSAgbW8xLl9faXNzZXQub3B0MyA9IHRydWU7Ci0gIG1vMS5fX2lzc2V0Lm9wdDUgPSB0cnVlOwotICBtbzEuX19pc3NldC5vcHQyID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDYgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzQucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDEgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5vcHQyID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDMgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzQuX19pc3NldC5kZWY0ID09IHRydWUpOwotICBhc3NlcnQobW80Ll9faXNzZXQub3B0NSA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNC5fX2lzc2V0Lm9wdDYgPT0gZmFsc2UpOwotCi0gIGFzc2VydChtbzEgPT0gbW80KTsKLQotICBtbzEuX19pc3NldC5vcHQxID0gZmFsc2U7Ci0gIG1vMS5fX2lzc2V0Lm9wdDUgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzUucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDEgPT0gZmFsc2UpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0MiA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzUuX19pc3NldC5vcHQzID09IHRydWUpOwotICBhc3NlcnQobW81Ll9faXNzZXQuZGVmNCA9PSB0cnVlKTsKLSAgYXNzZXJ0KG1vNS5fX2lzc2V0Lm9wdDUgPT0gZmFsc2UpOwotICBhc3NlcnQobW81Ll9faXNzZXQub3B0NiA9PSBmYWxzZSk7Ci0KLSAgYXNzZXJ0KG1vMSA9PSBtbzUpOwotCi0gIG1vMS5fX2lzc2V0Lm9wdDMgPSBmYWxzZTsKLQotICBtbzEud3JpdGUocHJvdG8uZ2V0KCkpOwotICBtbzYucmVhZChwcm90by5nZXQoKSk7Ci0KLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDEgPT0gZmFsc2UpOwotICBhc3NlcnQobW82Ll9faXNzZXQub3B0MiA9PSBmYWxzZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQzID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0LmRlZjQgPT0gdHJ1ZSk7Ci0gIGFzc2VydChtbzYuX19pc3NldC5vcHQ1ID09IGZhbHNlKTsKLSAgYXNzZXJ0KG1vNi5fX2lzc2V0Lm9wdDYgPT0gZmFsc2UpOwotCi0gIGFzc2VydChtbzEgPT0gbW82KTsKLQotCi0gIC8vIFRlc3QgZmluZ2VycHJpbnQgY2hlY2tpbmcgc3R1ZmYuCi0KLSAgewotICAgIC8vIERlZmF1bHQgYW5kIHJlcXVpcmVkIGhhdmUgdGhlIHNhbWUgZmluZ2VycHJpbnQuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kzIHQzOwotICAgIGFzc2VydChzdHJpbmcoVHJpY2t5MTo6YXNjaWlfZmluZ2VycHJpbnQpID09IFRyaWNreTM6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTM6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQzLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIGFzc2VydCh0My5pbV9yZXF1aXJlZCA9PSAyMjcpOwotICB9Ci0KLSAgewotICAgIC8vIE9wdGlvbmFsIGNoYW5nZXMgdGhpbmdzLgotICAgIFRyaWNreTEgdDE7Ci0gICAgVHJpY2t5MiB0MjsKLSAgICBhc3NlcnQoc3RyaW5nKFRyaWNreTE6OmFzY2lpX2ZpbmdlcnByaW50KSAhPSBUcmlja3kyOjphc2NpaV9maW5nZXJwcmludCk7Ci0gICAgcHJvdG8tPnNldFR5cGVTcGVjKFRyaWNreTE6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHQxLmltX2RlZmF1bHQgPSAyMjc7Ci0gICAgdDEud3JpdGUocHJvdG8uZ2V0KCkpOwotICAgIHRyeSB7Ci0gICAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5Mjo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgICB0Mi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIHsKLSAgICAvLyBIb2x5IGNvdy4gIFdlIGNhbiB1c2UgdGhlIFRyaWNreTEgdHlwZXNwZWMgd2l0aCB0aGUgVHJpY2t5MiBzdHJ1Y3R1cmUuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhUcmlja3kxOjpsb2NhbF9yZWZsZWN0aW9uKTsKLSAgICB0MS5pbV9kZWZhdWx0ID0gMjI3OwotICAgIHQxLndyaXRlKHByb3RvLmdldCgpKTsKLSAgICB0Mi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICBhc3NlcnQodDIuX19pc3NldC5pbV9vcHRpb25hbCA9PSB0cnVlKTsKLSAgICBhc3NlcnQodDIuaW1fb3B0aW9uYWwgPT0gMjI3KTsKLSAgfQotCi0gIHsKLSAgICAvLyBBbmQgdG90YWxseSBvZmYgdGhlIHdhbGwuCi0gICAgVHJpY2t5MSB0MTsKLSAgICBPbmVPZkVhY2ggb29lMjsKLSAgICBhc3NlcnQoc3RyaW5nKFRyaWNreTE6OmFzY2lpX2ZpbmdlcnByaW50KSAhPSBPbmVPZkVhY2g6OmFzY2lpX2ZpbmdlcnByaW50KTsKLSAgICBwcm90by0+c2V0VHlwZVNwZWMoVHJpY2t5MTo6bG9jYWxfcmVmbGVjdGlvbik7Ci0gICAgdDEuaW1fZGVmYXVsdCA9IDIyNzsKLSAgICB0MS53cml0ZShwcm90by5nZXQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIHByb3RvLT5zZXRUeXBlU3BlYyhPbmVPZkVhY2g6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgICAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uJiBleCkgewotICAgICAgYnVmZmVyLT5yZXNldEJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIC8vIE9rYXksIHRoaXMgaXMgcmVhbGx5IG9mZiB0aGUgd2FsbC4KLSAgLy8gSnVzdCBkb24ndCBjcmFzaC4KLSAgY291dCA8PCAiU3RhcnRpbmcgZnV6eiB0ZXN0LiAgVGhpcyB0YWtlcyBhIHdoaWxlLiAgKDIwIGRvdHMuKSIgPDwgZW5kbDsKLSAgc3RkOjpzcmFuZCgxMjM0NSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7Ci0gICAgaWYgKGkgJSAxMDAgPT0gMCkgewotICAgICAgY291dCA8PCAiLiI7Ci0gICAgICBjb3V0LmZsdXNoKCk7Ci0gICAgfQotICAgIGJ1ZmZlci0+cmVzZXRCdWZmZXIoKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGZpbmdlcnByaW50IHByZWZpeCBpcyByaWdodC4KLSAgICBidWZmZXItPndyaXRlKE5lc3Rpbmc6OmJpbmFyeV9maW5nZXJwcmludCwgNCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDI0KjEwMjQ7IGorKykgewotICAgICAgdWludDhfdCByID0gc3RkOjpyYW5kKCk7Ci0gICAgICBidWZmZXItPndyaXRlKCZyLCAxKTsKLSAgICB9Ci0gICAgTmVzdGluZyBuOwotICAgIHByb3RvLT5zZXRUeXBlU3BlYyhPbmVPZkVhY2g6OmxvY2FsX3JlZmxlY3Rpb24pOwotICAgIHRyeSB7Ci0gICAgICBuLnJlYWQocHJvdG8uZ2V0KCkpOwotICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiYgZXgpIHsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewotICAgIH0KLSAgfQotICBjb3V0IDw8IGVuZGw7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM1YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEVudW1UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgImdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCIKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6dHlwZSYgdmFsKQoreworICBvcyA8PCAieyIgPDwgKGludCl2YWwgPDwgIjpDVVNUT00hIiA8PCAifSI7CisgIHJldHVybiBvczsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKEVudW1UZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fdmFsdWUpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgdGhlIGVudW0gdmFsdWVzIG1hdGNoIHdoYXQgd2UgZXhwZWN0CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8wLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMiwgMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8zLCAzKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMTo6TUUxXzUsIDUpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfNiwgNik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMjo6TUUyXzAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0yOjpNRTJfMSwgMSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTI6Ok1FMl8yLCAyKTsKKworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfMCwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM18xLCAxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtMzo6TUUzX04yLCAtMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM19OMSwgLTEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfRDAsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfRDEsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0zOjpNRTNfOSwgOSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTM6Ok1FM18xMCwgMTApOworCisgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9BLCAweDdmZmZmZmZkKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0IsIDB4N2ZmZmZmZmUpOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQywgMHg3ZmZmZmZmZik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNTo6ZTEsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMiwgNDIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1Q+CitzdGQ6OnN0cmluZyBFbnVtVG9TdHJpbmcoX1QgZSkKK3sKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IGU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fb3N0cmVhbSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTE6Ok1FMV8wKSwgIk1FMV8wIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW01OjplMiksICJlMiIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtMzo6TUUzX04xKSwgIk1FM19OMSIpOworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtV2l0aEN1c3RvbU9zdHJlYW06OkN1c3RvTTIpLCAiezI6Q1VTVE9NIX0iKTsKKworICAvLyBzb21lIGludmFsaWQgb3IgdW5rbm93biB2YWx1ZQorICBNeUVudW01Ojp0eXBlIHV1dCA9IChNeUVudW01Ojp0eXBlKTQ0OworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcodXV0KSwgIjQ0Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9jb25zdGFudCkKK3sKKyAgTXlTdHJ1Y3QgbXM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lMl8yLCAyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUzX24yLCAtMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1zLm1lM19kMSwgMSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmggYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaAppbmRleCAxODUzYTM3Li5iY2VmOWYyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaAorKysgYi9saWIvY3BwL3Rlc3QvR2VuZXJpY0hlbHBlcnMuaApAQCAtMjAsODMgKzIwLDg4IEBACiAjaWZuZGVmIF9USFJJRlRfVEVTVF9HRU5FUklDSEVMUEVSU19IXwogI2RlZmluZSBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotCiAvKiBDbGFzc05hbWUgSGVscGVyIGZvciBjbGVhbmVyIGV4Y2VwdGlvbnMgKi8KIGNsYXNzIENsYXNzTmFtZXMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gIlVua25vd24gdHlwZSI7IH0KKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgcmV0dXJuICJVbmtub3duIHR5cGUiOworICB9CiB9OwogCi10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDhfdD4oKSB7IHJldHVybiAiYnl0ZSI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7IHJldHVybiAic2hvcnQiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDMyX3Q+KCkgeyByZXR1cm4gImludCI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50NjRfdD4oKSB7IHJldHVybiAibG9uZyI7IH0KLXRlbXBsYXRlIDw+IGNvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsgcmV0dXJuICJkb3VibGUiOyB9Ci10ZW1wbGF0ZSA8PiBjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPHN0ZDo6c3RyaW5nPigpIHsgcmV0dXJuICJzdHJpbmciOyB9Cit0ZW1wbGF0ZSA8PgorY29uc3QgY2hhciogQ2xhc3NOYW1lczo6Z2V0TmFtZTxpbnQ4X3Q+KCkgeworICByZXR1cm4gImJ5dGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MTZfdD4oKSB7CisgIHJldHVybiAic2hvcnQiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8aW50MzJfdD4oKSB7CisgIHJldHVybiAiaW50IjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBjaGFyKiBDbGFzc05hbWVzOjpnZXROYW1lPGludDY0X3Q+KCkgeworICByZXR1cm4gImxvbmciOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8ZG91YmxlPigpIHsKKyAgcmV0dXJuICJkb3VibGUiOworfQordGVtcGxhdGUgPD4KK2NvbnN0IGNoYXIqIENsYXNzTmFtZXM6OmdldE5hbWU8c3RkOjpzdHJpbmc+KCkgeworICByZXR1cm4gInN0cmluZyI7Cit9CiAKIC8qIEdlbmVyaWMgUHJvdG9jb2wgSS9PIGZ1bmN0aW9uIGZvciB0ZXN0cyAqLwogY2xhc3MgR2VuZXJpY0lPIHsKLSBwdWJsaWM6Ci0KK3B1YmxpYzoKICAgLyogV3JpdGUgZnVuY3Rpb25zICovCiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDhfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUJ5dGUodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDE2X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUkxNih2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MzJfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQzMl90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTMyKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgZG91YmxlJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlRG91YmxlKHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ2NF90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJNjQodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlU3RyaW5nKHZhbCk7CiAgIH0KIAogICAvKiBSZWFkIGZ1bmN0aW9ucyAqLwogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsKLSAgICByZXR1cm4gcHJvdG8tPnJlYWRJMTYodmFsKTsKLSAgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KIAotICBzdGF0aWMgdWludDMyX3QgcmVhZChzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGludDMyX3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRJMzIodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7Ci0gICAgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7Ci0gIH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgewotICAgIHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOwotICB9CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGRvdWJsZSYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZERvdWJsZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCByZWFkKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIHN0ZDo6c3RyaW5nJiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPnJlYWRTdHJpbmcodmFsKTsKICAgfQotCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcAppbmRleCBkY2IzNGQxLi5jMmFkNzNlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCkBAIC0xNywxMjggKzE3LDIyNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGlvc3RyZWFtPgorI2RlZmluZSBfVVNFX01BVEhfREVGSU5FUwogI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKIAotaW50IG1haW4oKSB7Ci0gIHVzaW5nIHN0ZDo6Y291dDsKLSAgdXNpbmcgc3RkOjplbmRsOwotICB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUSlNPTlByb3RvY29sOworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBKU09OUHJvdG9UZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgogCi0gIE9uZU9mRWFjaCBvb2U7Ci0gIG9vZS5pbV90cnVlICAgPSB0cnVlOwotICBvb2UuaW1fZmFsc2UgID0gZmFsc2U7Ci0gIG9vZS5hX2JpdGUgICAgPSAweDdmOwotICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKLSAgb29lLmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7Ci0gIG9vZS5kb3VibGVfcHJlY2lzaW9uID0gTV9QSTsKLSAgb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiSlNPTiBUSElTISBcIlwxIjsKLSAgb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkN1xuXGFcdCI7Ci0gIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7Ci0gIGNvdXQgPDwgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcob29lKSA8PCBlbmRsIDw8IGVuZGw7Cit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OjpkZWJ1ZzsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRKU09OUHJvdG9jb2w7CiAKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8T25lT2ZFYWNoPiBvb2U7CiAKLSAgTmVzdGluZyBuOwotICBuLm15X29vZSA9IG9vZTsKLSAgbi5teV9vb2UuaW50ZWdlcjE2ID0gMTY7Ci0gIG4ubXlfb29lLmludGVnZXIzMiA9IDMyOwotICBuLm15X29vZS5pbnRlZ2VyNjQgPSA2NDsKLSAgbi5teV9vb2UuZG91YmxlX3ByZWNpc2lvbiA9IChzdGQ6OnNxcnQoNS4wKSsxKS8yOwotICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOwotICBuLm15X29vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDNceDgwXHhlMlx4ODVceGFlXHhjZVx4OWRceDIwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZVx4YzlceGExXHhkMFx4YjNceGQwXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODBceGJjIjsKLSAgbi5teV9ib25rLnR5cGUgICAgPSAzMTMzNzsKLSAgbi5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKKyAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOworICBvb2UtPmltX3RydWUgPSB0cnVlOworICBvb2UtPmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS0+YV9iaXRlID0gMHg3ZjsKKyAgb29lLT5pbnRlZ2VyMTYgPSAyNzAwMDsKKyAgb29lLT5pbnRlZ2VyMzIgPSAxIDw8IDI0OworICBvb2UtPmludGVnZXI2NCA9ICh1aW50NjRfdCk2MDAwICogMTAwMCAqIDEwMDA7CisgIG9vZS0+ZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7CisgIG9vZS0+c29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS0+em9tZ191bmljb2RlID0gIlx4ZDdcblxhXHQiOworICBvb2UtPmJhc2U2NCA9ICJcMVwyXDNcMjU1IjsKK30KIAotICBjb3V0IDw8IGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnRKU09OU3RyaW5nKG4pIDw8IGVuZGwgPDwgZW5kbDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18xKSB7CisgIHRlc3RDYXNlU2V0dXBfMSgpOwogCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sXCIzXCI6e1wiaThcIjoxMjd9LFwiNFwiOntcImkxNlwiOjI3MDAwfSwiCisgICJcIjVcIjp7XCJpMzJcIjoxNjc3NzIxNn0sXCI2XCI6e1wiaTY0XCI6NjAwMDAwMDAwMH0sXCI3XCI6e1wiZGJsXCI6My4xNDE1OTI2IgorICAiNTM1ODk3OTMxfSxcIjhcIjp7XCJzdHJcIjpcIkpTT04gVEhJUyEgXFxcIlxcdTAwMDFcIn0sXCI5XCI6e1wic3RyXCI6XCJceGQ3XFwiCisgICJuXFx1MDAwN1xcdFwifSxcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iKTsKIAotICBIb2x5TW9sZXkgaG07CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqb29lKSk7CiAKLSAgaG0uYmlnLnB1c2hfYmFjayhvb2UpOwotICBobS5iaWcucHVzaF9iYWNrKG4ubXlfb29lKTsKLSAgaG0uYmlnWzBdLmFfYml0ZSA9IDB4MjI7Ci0gIGhtLmJpZ1sxXS5hX2JpdGUgPSAweDMzOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxOZXN0aW5nPiBuOworCit2b2lkIHRlc3RDYXNlU2V0dXBfMigpIHsKKyAgdGVzdENhc2VTZXR1cF8xKCk7CisKKyAgbi5yZXNldChuZXcgTmVzdGluZyk7CisgIG4tPm15X29vZSA9ICpvb2U7CisgIG4tPm15X29vZS5pbnRlZ2VyMTYgPSAxNjsKKyAgbi0+bXlfb29lLmludGVnZXIzMiA9IDMyOworICBuLT5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7CisgIG4tPm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApICsgMSkgLyAyOworICBuLT5teV9vb2Uuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiOworICBuLT5teV9vb2Uuem9tZ191bmljb2RlICAgICA9ICJceGQzXHg4MFx4ZTJceDg1XHhhZVx4Y2VceDlkXHgyMFx4ZDBceDlkXHhjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4YjBceGNmXHg4MVx4ZTJceDg0XHg4ZVx4MjBceGNlXHg5MVx4NzRceDc0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiYyI7CisgIG4tPm15X2JvbmsudHlwZSA9IDMxMzM3OworICBuLT5teV9ib25rLm1lc3NhZ2UgPSAiSSBhbSBhIGJvbmsuLi4geG9yISI7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b18yKSB7CisgIHRlc3RDYXNlU2V0dXBfMigpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAie1wiMVwiOntcInJlY1wiOntcIjFcIjp7XCJpMzJcIjozMTMzN30sXCIyXCI6e1wic3RyXCI6XCJJIGFtIGEgYm9uay4uLiB4b3IiCisgICAgIiFcIn19fSxcIjJcIjp7XCJyZWNcIjp7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3IgorICAgICJ9LFwiNFwiOntcImkxNlwiOjE2fSxcIjVcIjp7XCJpMzJcIjozMn0sXCI2XCI6e1wiaTY0XCI6NjR9LFwiN1wiOntcImRibFwiOiIKKyAgICAiMS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIpXCJ9LFwiOVwiOnsiCisgICAgIlwic3RyXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc66x4PigLxcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiIgorICAgICJBUUlEclFcIn0sXCIxMlwiOntcImxzdFwiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiIKKyAgICAiLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fX19IgorICApOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZygqbikpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEhvbHlNb2xleT4gaG07CisKK3ZvaWQgdGVzdENhc2VTZXR1cF8zKCkgeworICB0ZXN0Q2FzZVNldHVwXzIoKTsKKworICBobS5yZXNldChuZXcgSG9seU1vbGV5KTsKKworICBobS0+YmlnLnB1c2hfYmFjaygqb29lKTsKKyAgaG0tPmJpZy5wdXNoX2JhY2sobi0+bXlfb29lKTsKKyAgaG0tPmJpZ1swXS5hX2JpdGUgPSAweDIyOworICBobS0+YmlnWzFdLmFfYml0ZSA9IDB4MzM7CiAKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0YWdlMTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiYW5kIGEgb25lIik7CiAgIHN0YWdlMS5wdXNoX2JhY2soImFuZCBhIHR3byIpOwotICBobS5jb250YWluLmluc2VydChzdGFnZTEpOworICBobS0+Y29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKICAgc3RhZ2UxLmNsZWFyKCk7CiAgIHN0YWdlMS5wdXNoX2JhY2soInRoZW4gYSBvbmUsIHR3byIpOwogICBzdGFnZTEucHVzaF9iYWNrKCJ0aHJlZSEiKTsKICAgc3RhZ2UxLnB1c2hfYmFjaygiRk9VUiEhIik7Ci0gIGhtLmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CisgIGhtLT5jb250YWluLmluc2VydChzdGFnZTEpOwogICBzdGFnZTEuY2xlYXIoKTsKLSAgaG0uY29udGFpbi5pbnNlcnQoc3RhZ2UxKTsKKyAgaG0tPmNvbnRhaW4uaW5zZXJ0KHN0YWdlMSk7CiAKICAgc3RkOjp2ZWN0b3I8Qm9uaz4gc3RhZ2UyOwotICBobS5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOwotICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkrMSk7CisgIGhtLT5ib25rc1sibm90aGluZyJdID0gc3RhZ2UyOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKLSAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOworICBobS0+Ym9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwogICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwotICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CisgIGhtLT5ib25rc1sicG9lIl0gPSBzdGFnZTI7Cit9CiAKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhobSkgPDwgZW5kbCA8PCBlbmRsOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzMpIHsKKyAgdGVzdENhc2VTZXR1cF8zKCk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAie1wiMVwiOntcImxzdFwiOltcInJlY1wiLDIse1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOiIKKyAgIjM0fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sXCI1XCI6e1wiaTMyXCI6MTY3NzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDAiCisgICJ9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxIgorICAiXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOiIKKyAgIlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIiCisgICIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjRcIiwzLDEsMiwzXX19LHtcIjFcIjp7XCJ0ZlwiOjF9LFwiMlwiOntcInRmXCI6MH0sIgorICAiXCIzXCI6e1wiaThcIjo1MX0sXCI0XCI6e1wiaTE2XCI6MTZ9LFwiNVwiOntcImkzMlwiOjMyfSxcIjZcIjp7XCJpNjRcIjo2NH0sIgorICAiXCI3XCI6e1wiZGJsXCI6MS42MTgwMzM5ODg3NDk4OTQ5fSxcIjhcIjp7XCJzdHJcIjpcIjpSIChtZSBnb2luZyBcXFwicnJyclxcXCIiCisgICIpXCJ9LFwiOVwiOntcInN0clwiOlwi04Diha7OnSDQnc6/4oW/0L7JodCz0LDPgeKEjiDOkXR0zrHihb3OuseD4oC8XCJ9LFwiMTBcIjp7XCJ0ZlwiOjB9LFwiMTFcIjp7IgorICAiXCJzdHJcIjpcIkFRSURyUVwifSxcIjEyXCI6e1wibHN0XCI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNiIKKyAgIlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0XCIsMywxLDIsM119fV19LFwiMlwiOntcInNldFwiOltcImxzdFwiLDMiCisgICIsW1wic3RyXCIsMF0sW1wic3RyXCIsMixcImFuZCBhIG9uZVwiLFwiYW5kIGEgdHdvXCJdLFtcInN0clwiLDMsXCJ0aGVuIGEgb25lIgorICAiLCB0d29cIixcInRocmVlIVwiLFwiRk9VUiEhXCJdXX0sXCIzXCI6e1wibWFwXCI6W1wic3RyXCIsXCJsc3RcIiwzLHtcIm5vdGhpbiIKKyAgImdcIjpbXCJyZWNcIiwwXSxcInBvZVwiOltcInJlY1wiLDMse1wiMVwiOntcImkzMlwiOjN9LFwiMlwiOntcInN0clwiOlwicXVvdGgiCisgICJcIn19LHtcIjFcIjp7XCJpMzJcIjo0fSxcIjJcIjp7XCJzdHJcIjpcInRoZSByYXZlblwifX0se1wiMVwiOntcImkzMlwiOjV9LFwiIgorICAiMlwiOntcInN0clwiOlwibmV2ZXJtb3JlXCJ9fV0sXCJzb21ldGhpbmdcIjpbXCJyZWNcIiwyLHtcIjFcIjp7XCJpMzJcIjoxfSxcIiIKKyAgIjJcIjp7XCJzdHJcIjpcIldhaXQuXCJ9fSx7XCIxXCI6e1wiaTMyXCI6Mn0sXCIyXCI6e1wic3RyXCI6XCJXaGF0P1wifX1dfV19fSIKKyAgKTsKIAorICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoKmhtKSk7CiAKLSAgY291dCA8PCAiVGVzdGluZyBvb2UiIDw8IGVuZGw7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQogCi0gIG9vZS53cml0ZShwcm90by5nZXQoKSk7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fNCkgeworICB0ZXN0Q2FzZVNldHVwXzEoKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgb29lLT53cml0ZShwcm90by5nZXQoKSk7CiAgIE9uZU9mRWFjaCBvb2UyOwogICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChvb2UgPT0gb29lMik7CisgIEJPT1NUX0NIRUNLKCpvb2UgPT0gb29lMik7Cit9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b181KSB7CisgIHRlc3RDYXNlU2V0dXBfMygpOwogCi0gIGNvdXQgPDwgIlRlc3RpbmcgaG0iIDw8IGVuZGw7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAotICBobS53cml0ZShwcm90by5nZXQoKSk7CisgIGhtLT53cml0ZShwcm90by5nZXQoKSk7CiAgIEhvbHlNb2xleSBobTI7CiAgIGhtMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQoaG0gPT0gaG0yKTsKKyAgQk9PU1RfQ0hFQ0soKmhtID09IGhtMik7CiAKICAgaG0yLmJpZ1swXS5hX2JpdGUgPSAweDAwOwogCi0gIGFzc2VydChobSAhPSBobTIpOworICBCT09TVF9DSEVDSygqaG0gIT0gaG0yKTsKK30KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3Byb3RvXzYpIHsKICAgRG91YmxlcyBkdWI7Ci0gIGR1Yi5uYW4gPSBIVUdFX1ZBTC9IVUdFX1ZBTDsKKyAgZHViLm5hbiA9IEhVR0VfVkFMIC8gSFVHRV9WQUw7CiAgIGR1Yi5pbmYgPSBIVUdFX1ZBTDsKICAgZHViLm5lZ2luZiA9IC1IVUdFX1ZBTDsKLSAgZHViLnJlcGVhdGluZyA9IDEwLjAvMy4wOworICBkdWIucmVwZWF0aW5nID0gMTAuMCAvIDMuMDsKICAgZHViLmJpZyA9IDFFKzMwNTsKLSAgZHViLnNtYWxsID0gMUUtMzA1OworICBkdWIudGlueSA9IDFFLTMwNTsKICAgZHViLnplcm8gPSAwLjA7CiAgIGR1Yi5uZWd6ZXJvID0gLTAuMDsKLSAgY291dCA8PCBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0SlNPTlN0cmluZyhkdWIpIDw8IGVuZGwgPDwgZW5kbDsKIAotICBjb3V0IDw8ICJUZXN0aW5nIGJhc2UiIDw8IGVuZGw7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgIntcIjFcIjp7XCJkYmxcIjpcIk5hTlwifSxcIjJcIjp7XCJkYmxcIjpcIkluZmluaXR5XCJ9LFwiM1wiOntcImRibFwiOlwiLUluZmkiCisgICJuaXR5XCJ9LFwiNFwiOntcImRibFwiOjMuMzMzMzMzMzMzMzMzMzMzNX0sXCI1XCI6e1wiZGJsXCI6OS45OTk5OTk5OTk5OTk5OTk0ZSsiCisgICIzMDR9LFwiNlwiOntcImRibFwiOjFlLTMwNX0sXCI3XCI6e1wiZGJsXCI6MH0sXCI4XCI6e1wiZGJsXCI6LTB9fSIKKyAgKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdEpTT05TdHJpbmcoZHViKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b183KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBCYXNlNjQgYmFzZTsKICAgYmFzZS5hID0gMTIzOwpAQCAtMTUzLDcgKzI1Miw5MiBAQAogICBCYXNlNjQgYmFzZTI7CiAgIGJhc2UyLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChiYXNlID09IGJhc2UyKTsKKyAgQk9PU1RfQ0hFQ0soYmFzZSA9PSBiYXNlMik7Cit9CiAKLSAgcmV0dXJuIDA7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fcHJvdG9fOCkgeworICBjb25zdCBjaGFyKiBqc29uX3N0cmluZyA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTYuNzcyMTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCJ9LFwiOVwiOntcInN0clwiOlwiXHhkN1xcIgorICAiblxcdTAwMDdcXHRcIn0sXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiQVFJRHJRXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBjb25zdCBzdGQ6OnNpemVfdCBidWZTaXogPSBzdHJsZW4oanNvbl9zdHJpbmcpICogc2l6ZW9mKGNoYXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmU2l6KSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisKKyAgT25lT2ZFYWNoIG9vZTI7CisKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyB0b0hleFNlcXVlbmNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpOworICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgaSsrKSB7CisgICAgc3MgPDwgIlxceCIgPDwgaW50KHVpbnQ4X3Qoc3RyW2ldKSk7CisgIH0KKyAgcmV0dXJuIHNzLnN0cigpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2pzb25fdW5pY29kZV9lc2NhcGVkKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1MGUwMSBcXHVkODM1XFx1ZGQzZVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworICBjb25zdCBjaGFyKiBleHBlY3RlZF96b21nX3VuaWNvZGUgPSAiXHhlMFx4YjhceDgxIFx4ZjBceDlkXHg5NFx4YmUiOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBvb2UyLnJlYWQocHJvdG8uZ2V0KCkpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFvb2UyLnpvbWdfdW5pY29kZS5jb21wYXJlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSksCisgICAgIkV4cGVjdGVkOlxuIiA8PCB0b0hleFNlcXVlbmNlKGV4cGVjdGVkX3pvbWdfdW5pY29kZSkgPDwgIlxuR290dGVuOlxuIgorICAgICAgICAgICAgICAgICAgPDwgdG9IZXhTZXF1ZW5jZShvb2UyLnpvbWdfdW5pY29kZSkpOworCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl91bmljb2RlX2VzY2FwZWRfbWlzc2luZ19sb3dfc3Vycm9nYXRlKSB7CisgIGNvbnN0IGNoYXIganNvbl9zdHJpbmdbXSA9CisgICJ7XCIxXCI6e1widGZcIjoxfSxcIjJcIjp7XCJ0ZlwiOjB9LFwiM1wiOntcImk4XCI6MTI3fSxcIjRcIjp7XCJpMTZcIjoyNzAwMH0sIgorICAiXCI1XCI6e1wiaTMyXCI6MTZ9LFwiNlwiOntcImk2NFwiOjYwMDAwMDAwMDB9LFwiN1wiOntcImRibFwiOjMuMTQxNTkyNiIKKyAgIjUzNTg5NzkzMX0sXCI4XCI6e1wic3RyXCI6XCJKU09OIFRISVMhXCJ9LFwiOVwiOntcInN0clwiOlwiXFx1ZDgzNVwifSwiCisgICJcIjEwXCI6e1widGZcIjowfSxcIjExXCI6e1wic3RyXCI6XCIwMDAwMDBcIn0sXCIxMlwiOntcImxzdFwiIgorICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKKyAgIlwiLDMsMSwyLDNdfX0iOworCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworCisgIE9uZU9mRWFjaCBvb2UyOworICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9qc29uX3VuaWNvZGVfZXNjYXBlZF9taXNzaW5nX2hpX3N1cnJvZ2F0ZSkgeworICBjb25zdCBjaGFyIGpzb25fc3RyaW5nW10gPQorICAie1wiMVwiOntcInRmXCI6MX0sXCIyXCI6e1widGZcIjowfSxcIjNcIjp7XCJpOFwiOjEyN30sXCI0XCI6e1wiaTE2XCI6MjcwMDB9LCIKKyAgIlwiNVwiOntcImkzMlwiOjE2fSxcIjZcIjp7XCJpNjRcIjo2MDAwMDAwMDAwfSxcIjdcIjp7XCJkYmxcIjozLjE0MTU5MjYiCisgICI1MzU4OTc5MzF9LFwiOFwiOntcInN0clwiOlwiSlNPTiBUSElTIVwifSxcIjlcIjp7XCJzdHJcIjpcIlxcdWRkM2VcIn0sIgorICAiXCIxMFwiOntcInRmXCI6MH0sXCIxMVwiOntcInN0clwiOlwiMDAwMDAwXCJ9LFwiMTJcIjp7XCJsc3RcIiIKKyAgIjpbXCJpOFwiLDMsMSwyLDNdfSxcIjEzXCI6e1wibHN0XCI6W1wiaTE2XCIsMywxLDIsM119LFwiMTRcIjp7XCJsc3RcIjpbXCJpNjQiCisgICJcIiwzLDEsMiwzXX19IjsKKworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKworICBPbmVPZkVhY2ggb29lMjsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cob29lMi5yZWFkKHByb3RvLmdldCgpKSwKKyAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggMDVlZTljYy4uZDY0NWE2NSAxMDA3NTUKLS0tIGEvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTYsMjIgKzE2LDU3IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCitBVVRPTUFLRV9PUFRJT05TID0gc3ViZGlyLW9iamVjdHMgc2VyaWFsLXRlc3RzCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmggXAorCQlnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBcCisJCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKIAogbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYSBsaWJwcm9jZXNzb3J0ZXN0LmxhCiBub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmggXAogCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIFwKLQlnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBcCi0JZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgXAotCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvT3B0aW9uYWxSZXF1aXJlZFRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuY3BwIFwKKwlnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIFwKKwlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIFwKKwlnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwIFwKIAlUaHJpZnRUZXN0X2V4dHJhcy5jcHAgXAogCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAKIAogbm9kaXN0X2xpYnByb2Nlc3NvcnRlc3RfbGFfU09VUkNFUyA9IFwKIAlnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgXAogCWdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggXAorCWdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaCBcCiAJZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBcCiAJZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmggXAogCWdlbi1jcHAvcHJvY190eXBlcy5jcHAgXApAQCAtNDIsNyArNzcsOCBAQAogCiBsaWJ0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQogCi1ub2luc3RfUFJPR1JBTVMgPSBCZW5jaG1hcmsKK25vaW5zdF9QUk9HUkFNUyA9IEJlbmNobWFyayBcCisJY29uY3VycmVuY3lfdGVzdAogCiBCZW5jaG1hcmtfU09VUkNFUyA9IFwKIAlCZW5jaG1hcmsuY3BwCkBAIC01MCw0MyArODYsOTcgQEAKIEJlbmNobWFya19MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKIAogY2hlY2tfUFJPR1JBTVMgPSBcCisJVW5pdFRlc3RzIFwKIAlURkRUcmFuc3BvcnRUZXN0IFwKIAlUUGlwZWRUcmFuc3BvcnRUZXN0IFwKIAlEZWJ1Z1Byb3RvVGVzdCBcCiAJSlNPTlByb3RvVGVzdCBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QgXAorCVJlY3Vyc2l2ZVRlc3QgXAogCVNwZWNpYWxpemF0aW9uVGVzdCBcCiAJQWxsUHJvdG9jb2xzVGVzdCBcCiAJVHJhbnNwb3J0VGVzdCBcCisJVEludGVycnVwdFRlc3QgXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgXAorCVNlY3VyaXR5VGVzdCBcCiAJWmxpYlRlc3QgXAogCVRGaWxlVHJhbnNwb3J0VGVzdCBcCi0JVW5pdFRlc3RzCi0jIGRpc2FibGUgdGhlc2UgdGVzdCAuLi4gdG9vIHN0cm9uZwotIyAgICAgICBwcm9jZXNzb3JfdGVzdAotIwljb25jdXJyZW5jeV90ZXN0CisJbGlua190ZXN0IFwKKwlPcGVuU1NMTWFudWFsSW5pdFRlc3QgXAorCUVudW1UZXN0IFwKKwlSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QgXAorICAgICAgICBBbm5vdGF0aW9uVGVzdAorCitpZiBBTVhfSEFWRV9MSUJFVkVOVAorbm9pbnN0X1BST0dSQU1TICs9IFwKKwlwcm9jZXNzb3JfdGVzdAorY2hlY2tfUFJPR1JBTVMgKz0gXAorCVROb25ibG9ja2luZ1NlcnZlclRlc3QgXAorCVROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKK2VuZGlmCiAKIFRFU1RTX0VOVklST05NRU5UPSBcCiAJQk9PU1RfVEVTVF9MT0dfU0lOSz10ZXN0cy54bWwgXAogCUJPT1NUX1RFU1RfTE9HX0xFVkVMPXRlc3Rfc3VpdGUgXAotCUJPT1NUX1RFU1RfTE9HX0ZPUk1BVD14bWwKKwlCT09TVF9URVNUX0xPR19GT1JNQVQ9WE1MCiAKIFRFU1RTID0gXAogCSQoY2hlY2tfUFJPR1JBTVMpCiAKIFVuaXRUZXN0c19TT1VSQ0VTID0gXAogCVVuaXRUZXN0TWFpbi5jcHAgXAorCU9uZVdheUhUVFBUZXN0LmNwcCBcCiAJVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIFwKIAlUQnVmZmVyQmFzZVRlc3QuY3BwIFwKLQlCYXNlNjRUZXN0LmNwcAorCUJhc2U2NFRlc3QuY3BwIFwKKwlUb1N0cmluZ1Rlc3QuY3BwIFwKKwlUeXBlZGVmVGVzdC5jcHAgXAorCVRTZXJ2ZXJTb2NrZXRUZXN0LmNwcCBcCisJVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwIFwKKwlUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oCiAKLWlmICFXSVRIX0JPT1NUVEhSRUFEUwogVW5pdFRlc3RzX1NPVVJDRVMgKz0gXAotICAgICAgICBSV011dGV4U3RhcnZlVGVzdC5jcHAKLWVuZGlmCisgIGNvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAgXAorICBjb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKIAogVW5pdFRlc3RzX0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKLSAgJChCT09TVF9ST09UX1BBVEgpL2xpYi9saWJib29zdF91bml0X3Rlc3RfZnJhbWV3b3JrLmEKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitUSW50ZXJydXB0VGVzdF9TT1VSQ0VTID0gXAorCVRTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBcCisJVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCisKK1RJbnRlcnJ1cHRUZXN0X0xEQUREID0gXAorICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAorICAkKEJPT1NUX1NZU1RFTV9MREFERCkgXAorICAkKEJPT1NUX1RIUkVBRF9MREFERCkKKworVFNlcnZlckludGVncmF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCVRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCisKK1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQorCitTZWN1cml0eVRlc3RfU09VUkNFUyA9IFwKKwlTZWN1cml0eVRlc3QuY3BwCisKK1NlY3VyaXR5VGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgIGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9GSUxFU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICQoQk9PU1RfVEhSRUFEX0xEQUREKQogCiBUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCiAJVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTk0LDcgKzE4NCw3IEBACiBUcmFuc3BvcnRUZXN0X0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCi0gICQoQk9PU1RfUk9PVF9QQVRIKS9saWIvbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCiAgIC1segogCiBabGliVGVzdF9TT1VSQ0VTID0gXApAQCAtMTAzLDE1ICsxOTMsMzMgQEAKIFpsaWJUZXN0X0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCi0gICQoQk9PU1RfUk9PVF9QQVRIKS9saWIvbGliYm9vc3RfdW5pdF90ZXN0X2ZyYW1ld29yay5hIFwKKyAgJChCT09TVF9URVNUX0xEQUREKSBcCiAgIC1segogCitFbnVtVGVzdF9TT1VSQ0VTID0gXAorCUVudW1UZXN0LmNwcAorCitFbnVtVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKworUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0X1NPVVJDRVMgPSBSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCisKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEgJChCT09TVF9URVNUX0xEQUREKQorCitBbm5vdGF0aW9uVGVzdF9TT1VSQ0VTID0gXAorCUFubm90YXRpb25UZXN0LmNwcAorCitBbm5vdGF0aW9uVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKKwogVEZpbGVUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCiAJVEZpbGVUcmFuc3BvcnRUZXN0LmNwcAogCiBURmlsZVRyYW5zcG9ydFRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAotICAkKEJPT1NUX1JPT1RfUEFUSCkvbGliL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAkKEJPT1NUX1RFU1RfTERBREQpCiAKICMKICMgVEZEVHJhbnNwb3J0VGVzdApAQCAtMTE5LDE4ICsyMjcsMjQgQEAKIFRGRFRyYW5zcG9ydFRlc3RfU09VUkNFUyA9IFwKIAlURkRUcmFuc3BvcnRUZXN0LmNwcAogCi1URkRUcmFuc3BvcnRUZXN0X0xEQUREID0gXAotCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorVEZEVHJhbnNwb3J0VGVzdF9MREFERCA9ICBcCisJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCiAKIAogIwogIyBUUGlwZWRUcmFuc3BvcnRUZXN0CiAjCiBUUGlwZWRUcmFuc3BvcnRUZXN0X1NPVVJDRVMgPSBcCi0JVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKKwlUUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBcCisJVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcAogCiBUUGlwZWRUcmFuc3BvcnRUZXN0X0xEQUREID0gXAotCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChCT09TVF9TWVNURU1fTERBREQpIFwKKwkkKEJPT1NUX1RIUkVBRF9MREFERCkKIAogIwogIyBBbGxQcm90b2NvbHNUZXN0CkBAIC0xNDAsNyArMjU0LDkgQEAKIAlBbGxQcm90b2NvbFRlc3RzLnRjYyBcCiAJR2VuZXJpY0hlbHBlcnMuaAogCi1BbGxQcm90b2NvbHNUZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorQWxsUHJvdG9jb2xzVGVzdF9MREFERCA9IFwKKyAgbGlidGVzdGdlbmNwcC5sYSBcCisgICQoQk9PU1RfVEVTVF9MREFERCkKIAogIwogIyBEZWJ1Z1Byb3RvVGVzdApAQCAtMTQ4LDcgKzI2NCw5IEBACiBEZWJ1Z1Byb3RvVGVzdF9TT1VSQ0VTID0gXAogCURlYnVnUHJvdG9UZXN0LmNwcAogCi1EZWJ1Z1Byb3RvVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK0RlYnVnUHJvdG9UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAogCiAjCkBAIC0xNTcsNyArMjc1LDM2IEBACiBKU09OUHJvdG9UZXN0X1NPVVJDRVMgPSBcCiAJSlNPTlByb3RvVGVzdC5jcHAKIAotSlNPTlByb3RvVGVzdF9MREFERCA9IGxpYnRlc3RnZW5jcHAubGEKK0pTT05Qcm90b1Rlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisjCisjIFROb25ibG9ja2luZ1NlcnZlclRlc3QKKyMKK1ROb25ibG9ja2luZ1NlcnZlclRlc3RfU09VUkNFUyA9IFROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCisKK1ROb25ibG9ja2luZ1NlcnZlclRlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCisjCisjIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QKKyMKK1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfU09VUkNFUyA9IFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCisKK1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdG5iLmxhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0xERkxBR1MpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0ZJTEVTWVNURU1fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX0NIUk9OT19MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfU1lTVEVNX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9USFJFQURfTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCiAKICMKICMgT3B0aW9uYWxSZXF1aXJlZFRlc3QKQEAgLTE2NSw3ICszMTIsMTkgQEAKIE9wdGlvbmFsUmVxdWlyZWRUZXN0X1NPVVJDRVMgPSBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCiAKLU9wdGlvbmFsUmVxdWlyZWRUZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorT3B0aW9uYWxSZXF1aXJlZFRlc3RfTERBREQgPSBcCisJbGlidGVzdGdlbmNwcC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKQorCisjCisjIE9wdGlvbmFsUmVxdWlyZWRUZXN0CisjCitSZWN1cnNpdmVUZXN0X1NPVVJDRVMgPSBcCisJUmVjdXJzaXZlVGVzdC5jcHAKKworUmVjdXJzaXZlVGVzdF9MREFERCA9IFwKKwlsaWJ0ZXN0Z2VuY3BwLmxhIFwKKwkkKEJPT1NUX1RFU1RfTERBREQpCiAKICMKICMgU3BlY2lhbGl6YXRpb25UZXN0CkBAIC0xNzMsNyArMzMyLDkgQEAKIFNwZWNpYWxpemF0aW9uVGVzdF9TT1VSQ0VTID0gXAogCVNwZWNpYWxpemF0aW9uVGVzdC5jcHAKIAotU3BlY2lhbGl6YXRpb25UZXN0X0xEQUREID0gbGlidGVzdGdlbmNwcC5sYQorU3BlY2lhbGl6YXRpb25UZXN0X0xEQUREID0gXAorCWxpYnRlc3RnZW5jcHAubGEgXAorCSQoQk9PU1RfVEVTVF9MREFERCkKIAogY29uY3VycmVuY3lfdGVzdF9TT1VSQ0VTID0gXAogCWNvbmN1cnJlbmN5L1Rlc3RzLmNwcCBcCkBAIC0xODQsNiArMzQ1LDExIEBACiBjb25jdXJyZW5jeV90ZXN0X0xEQUREID0gXAogICAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKIAorbGlua190ZXN0X1NPVVJDRVMgPSBcCisgIGxpbmsvTGlua1Rlc3QuY3BwIFwKKyAgbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAgXAorICBsaW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcAorCiBwcm9jZXNzb3JfdGVzdF9TT1VSQ0VTID0gXAogCXByb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcCBcCiAJcHJvY2Vzc29yL0V2ZW50TG9nLmNwcCBcCkBAIC0xOTUsNDIgKzM2MSw2OSBAQAogcHJvY2Vzc29yX3Rlc3RfTERBREQgPSBsaWJwcm9jZXNzb3J0ZXN0LmxhIFwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0LmxhIFwKICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RFU1RfTERBREQpIFwKICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9MREZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICAgICAgIC1sZXZlbnQgXAotICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1JPT1RfUEFUSCkvbGliL2xpYmJvb3N0X3VuaXRfdGVzdF9mcmFtZXdvcmsuYQorICAgICAgICAgICAgICAgICAgICAgICAkKExJQkVWRU5UX0xJQlMpCisKK09wZW5TU0xNYW51YWxJbml0VGVzdF9TT1VSQ0VTID0gXAorCU9wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAKKworT3BlblNTTE1hbnVhbEluaXRUZXN0X0xEQUREID0gXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisJJChCT09TVF9URVNUX0xEQUREKSBcCisJJChPUEVOU1NMX0xERkxBR1MpIFwKKwkkKE9QRU5TU0xfTElCUykKKwogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIAotZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmggZ2VuLWNwcC9FbXB0eVNlcnZpY2UuY3BwIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmg6ICQodG9wX3NyY2RpcikvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CisKK2dlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCisKK2dlbi1jcHAvRW51bVRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0VudW1UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCiBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQKLQkkKFRIUklGVCkgLS1nZW4gY3BwOmRlbnNlICQ8CisJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAorCitnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5jcHAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIGdlbi1jcHAvU2VydmljZS5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGNwcDpkZW5zZSAkPAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBjcHA6ZGVuc2UgJDwKKwkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKLWdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmNwcDogcHJvY2Vzc29yL3Byb2MudGhyaWZ0CitnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIGdlbi1jcHAvT25lV2F5U2VydmljZS5oIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwOiBPbmVXYXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oOiBwcm9jZXNzb3IvcHJvYy50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJDwKIAotSU5DTFVERVMgPSBcCi0JLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjCi0KLUFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykKK0FNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1EX19TVERDX0ZPUk1BVF9NQUNST1MgLURfX1NURENfTElNSVRfTUFDUk9TIC1JLgogQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykKLUFNX0NYWEZMQUdTID0gLVdhbGwKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLWNwcAorCSQoUk0pIGdlbi1jcHAvKgogCiBFWFRSQV9ESVNUID0gXAotCURlbnNlUHJvdG9UZXN0LmNwcCBcCi0JVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKLQlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwIFwKIAljb25jdXJyZW5jeSBcCi0JcHJvY2Vzc29yCisJcHJvY2Vzc29yIFwKKwlxdCBcCisJQ01ha2VMaXN0cy50eHQgXAorCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgXAorCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCisJT25lV2F5VGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmExNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgiCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShPbmVXYXlIVFRQVGVzdCkKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIdHRwU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOworbmFtZXNwYWNlIHV0ZiA9IGJvb3N0Ojp1bml0X3Rlc3Q7CisKKy8vIERlZmluZSB0aGlzIGVudiB2YXIgdG8gZW5hYmxlIHNvbWUgbG9nZ2luZyAoaW4gY2FzZSB5b3UgbmVlZCB0byBkZWJ1ZykKKyN1bmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKworY2xhc3MgT25lV2F5U2VydmljZUhhbmRsZXIgOiBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgT25lV2F5U2VydmljZUhhbmRsZXIoKSB7fQorCisgIHZvaWQgcm91bmRUcmlwUlBDKCkgb3ZlcnJpZGUgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgInJvdW5kVHJpcFJQQygpIiA8PCBlbmRsOworI2VuZGlmCisgIH0KKyAgdm9pZCBvbmVXYXlSUEMoKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAib25lV2F5UlBDKCkiIDw8IHN0ZDo6ZW5kbCA7CisjZW5kaWYKKyB9Cit9OworCitjbGFzcyBPbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5IDogdmlydHVhbCBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmRmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5KCkge30KKyAgdmlydHVhbCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGdldEhhbmRsZXIoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykKKyAgeworICAgICh2b2lkKWNvbm5JbmZvIDsKKyAgICByZXR1cm4gbmV3IE9uZVdheVNlcnZpY2VIYW5kbGVyOworICB9CisgIHZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlciggb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CisKK2NsYXNzIFJQQzBUaHJlYWRDbGFzcyB7CitwdWJsaWM6CisgIFJQQzBUaHJlYWRDbGFzcyhUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcikgOiBzZXJ2ZXJfKHNlcnZlcikgeyB9IC8vIENvbnN0cnVjdG9yCit+UlBDMFRocmVhZENsYXNzKCkgeyB9IC8vIERlc3RydWN0b3IKKwordm9pZCBSdW4oKSB7CisgIHNlcnZlcl8uc2VydmUoKSA7Cit9CisgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfIDsKK30gOworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7CisKKy8vIGNvcGllZCBmcm9tIEludGVncmF0aW9uVGVzdAorY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworY2xhc3MgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgcHVibGljOgorICBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQsIDEwMjQwKSwKKyAgICBibG9ja2VkXyhmYWxzZSkgeworICB9CisKKyAgdWludDMyX3Qgd3JpdGVfYnVmZmVyX2xlbmd0aCgpIHsKKyAgICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgICByZXR1cm4gaGF2ZV9ieXRlcyA7CisgIH0KKworICB2b2lkIGJsb2NrKCkgeworICAgIGJsb2NrZWRfID0gdHJ1ZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAiYmxvY2sgZmx1c2hpbmdcbiIgOworI2VuZGlmCisgfQorICB2b2lkIHVuYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSBmYWxzZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAidW5ibG9jayBmbHVzaGluZywgYnVmZmVyIGlzXG48PCIgPDwgc3RkOjpzdHJpbmcoKGNoYXIgKil3QnVmXy5nZXQoKSwgd3JpdGVfYnVmZmVyX2xlbmd0aCgpKSA8PCAiPj5cbiIgOworI2VuZGlmCisgfQorCisgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgaWYgKGJsb2NrZWRfKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgICBjZXJyIDw8ICJmbHVzaCB3YXMgYmxvY2tlZFxuIiA7CisjZW5kaWYKKyAgICAgIHJldHVybiA7CisgICAgfQorICAgIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSA7CisgIH0KKworICBib29sIGJsb2NrZWRfIDsKK30gOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggSlNPTl9CdWZmZXJlZEhUVFAgKQoreworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDApIDsKKyAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPE9uZVdheVNlcnZpY2VDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHNzLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyKG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpIDsKKyAgc2VydmVyLnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOworI2VuZGlmCisgIFJQQzBUaHJlYWRDbGFzcyB0KHNlcnZlcikgOworICBib29zdDo6dGhyZWFkIHRocmVhZCgmUlBDMFRocmVhZENsYXNzOjpSdW4sICZ0KTsKKworICB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKCFwRXZlbnRIYW5kbGVyLT5pc0xpc3RlbmluZygpKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorICB9CisKKyAgaW50IHBvcnQgPSBzcy0+Z2V0UG9ydCgpIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgY2VyciA8PCAicG9ydCAiIDw8IHBvcnQgPDwgZW5kbCA7CisjZW5kaWYKKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgcG9ydCkpOworICAgIHNvY2tldC0+c2V0UmVjdlRpbWVvdXQoMTAwMDApIDsgLy8gMTAwMG1zZWMgc2hvdWxkIGJlIGVub3VnaAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQ+IGJsb2NrYWJsZV90cmFuc3BvcnQobmV3IFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUSHR0cENsaWVudChibG9ja2FibGVfdHJhbnNwb3J0LCAibG9jYWxob3N0IiwgIi9zZXJ2aWNlIikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VDbGllbnQgY2xpZW50KHByb3RvY29sKTsKKworCisgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisgICAgY2xpZW50LnJvdW5kVHJpcFJQQygpOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmJsb2NrKCkgOworICAgIHVpbnQzMl90IHNpemUwID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBjbGllbnQuc2VuZF9vbmVXYXlSUEMoKSA7CisgICAgdWludDMyX3Qgc2l6ZTEgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMiA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgQk9PU1RfQ0hFQ0soKHNpemUxIC0gc2l6ZTApID09IChzaXplMiAtIHNpemUxKSkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPnVuYmxvY2soKSA7CisgICAgY2xpZW50LnNlbmRfcm91bmRUcmlwUlBDKCkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmZsdXNoKCkgOworICAgIHRyeSB7CisgICAgICBjbGllbnQucmVjdl9yb3VuZFRyaXBSUEMoKSA7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBCT09TVF9FUlJPUiggIndlIHNob3VsZCBub3QgZ2V0IGEgdHJhbnNwb3J0IGV4Y2VwdGlvbiAtLSB0aGlzIG1lYW5zIHdlIGZhaWxlZDogIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSApIDsKKyAgICB9CisgICAgdHJhbnNwb3J0LT5jbG9zZSgpOworICB9CisgIHNlcnZlci5zdG9wKCk7CisgIHRocmVhZC5qb2luKCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJmaW5pc2hlZC5cbiI7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQgYi9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZTlmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIE9uZVdheVRlc3QKK25hbWVzcGFjZSBqYXZhIG9uZXdheXRlc3QKK25hbWVzcGFjZSBjcHAgb25ld2F5dGVzdAorbmFtZXNwYWNlIHJiIE9uZXdheXRlc3QKK25hbWVzcGFjZSBwZXJsIE9uZVdheVRlc3QKK25hbWVzcGFjZSBjc2hhcnAgT25ld2F5dGVzdAorbmFtZXNwYWNlIGpzIE9uZVdheVRlc3QKK25hbWVzcGFjZSBzdCBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkgT25lV2F5VGVzdAorbmFtZXNwYWNlIHB5LnR3aXN0ZWQgT25lV2F5VGVzdAorbmFtZXNwYWNlIGdvIG9uZXdheXRlc3QKK25hbWVzcGFjZSBwaHAgT25lV2F5VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBPbmV3YXl0ZXN0CituYW1lc3BhY2UgY29jb2EgT25lV2F5VGVzdAorbmFtZXNwYWNlIGx1YSBPbmVXYXlUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvT25lV2F5VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRBc3luYy5PbmVXYXlUZXN0CisKKy8vIGEgbWluaW1hbCBUaHJpZnQgc2VydmljZSwgZm9yIHVzZSBpbiBPbmVXYXlIVFRQVHRlc3QuY3BwCitzZXJ2aWNlIE9uZVdheVNlcnZpY2UgeworICB2b2lkIHJvdW5kVHJpcFJQQygpLAorICBvbmV3YXkgdm9pZCBvbmVXYXlSUEMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBiMzAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8gVG8gc2hvdyB0aGF0IHRoaXMgdGVzdCBhY3R1YWxseSB0ZXN0cyBzb21ldGhpbmcsIHlvdSBjYW4gY2hhbmdlCisvLyBNQU5VQUxfT1BFTlNTTF9JTklUIHRvIDAgdG8gY2F1c2UgYXV0b21hdGljIE9wZW5TU0wgaW5pdC9jbGVhbnVwLAorLy8gd2hpY2ggd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCisjZGVmaW5lIE1BTlVBTF9PUEVOU1NMX0lOSVQgMQorI2lmZGVmIF9XSU4zMgorI2luY2x1ZGUgPFdpblNvY2syLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKKwordm9pZCBtYWtlX2lzb2xhdGVkX3NzbHNvY2tldGZhY3RvcnkoKSB7CisgIC8vIEhlcmUgd2UgY3JlYXRlIGFuIGlzb2xhdGVkIFRTU0xTb2NrZXRGYWN0b3J5IHRvIGVuc3VyZSB0aGUKKyAgLy8gY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3Igb2YgVFNTTFNvY2tldEZhY3RvcnkgZ2V0IHJ1bi4gIFRodXMKKyAgLy8gd2l0aG91dCBtYW51YWwgaW5pdGlhbGl6YXRpb24gbm9ybWFsbHkgT3BlblNTTCB3b3VsZCBiZQorICAvLyB1bmluaXRpYWxpemVkIGFmdGVyIHRoaXMgZnVuY3Rpb24uCisgIFRTU0xTb2NrZXRGYWN0b3J5IGZhY3Rvcnk7Cit9CisKK3ZvaWQgb3BlbnNzbF9pbml0KCkgeworI2lmIE1BTlVBTF9PUEVOU1NMX0lOSVQKKyAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgaW5pdGlhbGl6ZU9wZW5TU0woKTsKKyNlbmRpZgorfQorCit2b2lkIG9wZW5zc2xfY2xlYW51cCgpIHsKKyNpZiBNQU5VQUxfT1BFTlNTTF9JTklUCisgIGNsZWFudXBPcGVuU1NMKCk7CisjZW5kaWYKK30KKwordm9pZCB0ZXN0X29wZW5zc2xfYXZhaWxhYmlsaXR5KCkgeworICAvLyBDaGVjayB3aGV0aGVyIFRocmlmdCBsZWF2ZXMgT3BlblNTTCBmdW5jdGlvbmFsaXR5IGF2YWlsYWJsZSBhZnRlcgorICAvLyB0aGUgbGFzdCBUU1NMU29ja2V0RmFjdG9yeSBpcyBkZXN0cm95ZWQgd2hlbiBtYW51YWwKKyAgLy8gaW5pdGlhbGl6YXRpb24gaXMgc2V0CisgIG9wZW5zc2xfaW5pdCgpOworICBtYWtlX2lzb2xhdGVkX3NzbHNvY2tldGZhY3RvcnkoKTsKKworICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIG9uZSB0aGF0IHdpbGwgZmFpbCBpZiBPcGVuU1NMIGlzCisgIC8vIHVuaW5pdGlhbGl6ZWQuICBJdCBtaWdodCBhbHNvIGZhaWwgb24gdmVyeSBvbGQgdmVyc2lvbnMgb2YKKyAgLy8gT3BlblNTTC4uLgorICBjb25zdCBFVlBfTUQqIG1kID0gRVZQX2dldF9kaWdlc3RieW5hbWUoIlNIQTI1NiIpOworICBCT09TVF9DSEVDSyhtZCAhPSBOVUxMKTsKKyAgb3BlbnNzbF9jbGVhbnVwKCk7Cit9CisKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSA9ICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIHN1aXRlLT5wX25hbWUudmFsdWUgPSAiT3BlblNTTE1hbnVhbEluaXQiOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfb3BlbnNzbF9hdmFpbGFiaWxpdHkpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKyAKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCitib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnYyk7CisgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJndik7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJPcGVuU1NMTWFudWFsSW5pdCI7CisKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9vcGVuc3NsX2F2YWlsYWJpbGl0eSkpOworCisgIHJldHVybiBOVUxMOworfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKaW5kZXggZGRhZmE4MS4uNGM0MzU0NiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCkBAIC0yMSwyNDIgKzIxLDM2NiBAQAogICogZGV0YWlscy4KICAqLwogCi0jaW5jbHVkZSA8Y2Fzc2VydD4KICNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlICJnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmgiCiAKLXVzaW5nIHN0ZDo6Y291dDsKLXVzaW5nIHN0ZDo6ZW5kbDsKLXVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpzdHJpbmc7CisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIE9wdGlvbmFsUmVxdWlyZWRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogCi0KIC8qCiB0ZW1wbGF0ZTx0eXBlbmFtZSBTdHJ1Y3Q+CiB2b2lkIHRyeXdyaXRlKGNvbnN0IFN0cnVjdCYgcywgYm9vbCBzaG91bGRfd29yaykgewogICBib29sIHdvcmtlZDsKICAgdHJ5IHsKLSAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CiAgICAgcy53cml0ZSgmcHJvdG9jb2wpOwogICAgIHdvcmtlZCA9IHRydWU7CiAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAmIGV4KSB7CiAgICAgd29ya2VkID0gZmFsc2U7CiAgIH0KLSAgYXNzZXJ0KHdvcmtlZCA9PSBzaG91bGRfd29yayk7CisgIEJPT1NUX0NIRUNLKHdvcmtlZCA9PSBzaG91bGRfd29yayk7CiB9CiAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RydWN0MSwgdHlwZW5hbWUgU3RydWN0Mj4KLXZvaWQgd3JpdGVfdG9fcmVhZChjb25zdCBTdHJ1Y3QxICYgdywgU3RydWN0MiAmIHIpIHsKLSAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7Cit2b2lkIHdyaXRlX3RvX3JlYWQoY29uc3QgU3RydWN0MSYgdywgU3RydWN0MiYgcikgeworICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CiAgIHcud3JpdGUoJnByb3RvY29sKTsKICAgci5yZWFkKCZwcm90b2NvbCk7CiB9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMSkgeworICBPbGRTY2hvb2wgbzsKIAotaW50IG1haW4oKSB7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT2xkU2Nob29sIHtcbiIKKyAgICAiICAwMTogaW1faW50IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fc3RyIChzdHJpbmcpID0gXCJcIixcbiIKKyAgICAiICAwMzogaW1fYmlnIChsaXN0KSA9IGxpc3Q8bWFwPlswXSB7XG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKG8pKTsKIAotICBjb3V0IDw8ICJUaGlzIG9sZCBzY2hvb2wgc3RydWN0IHNob3VsZCBoYXZlIHRocmVlIGZpZWxkcy4iIDw8IGVuZGw7Ci0gIHsKLSAgICBPbGRTY2hvb2wgbzsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKG8pIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KIAotICBjb3V0IDw8ICJTZXR0aW5nIGEgdmFsdWUgYmVmb3JlIHNldHRpbmcgaXNzZXQuIiA8PCBlbmRsOwotICB7Ci0gICAgU2ltcGxlIHM7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICAgIHMuaW1fb3B0aW9uYWwgPSAxMDsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gICAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHMpIDw8IGVuZGw7Ci0gIH0KLSAgY291dCA8PCBlbmRsOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzEpIHsKKyAgU2ltcGxlIHM7CiAKLSAgY291dCA8PCAiU2V0dGluZyBpc3NldCBiZWZvcmUgc2V0dGluZyBhIHZhbHVlLiIgPDwgZW5kbDsKLSAgewotICAgIFNpbXBsZSBzOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcocykgPDwgZW5kbDsKLSAgICBzLmltX29wdGlvbmFsID0gMTA7Ci0gICAgY291dCA8PCBUaHJpZnREZWJ1Z1N0cmluZyhzKSA8PCBlbmRsOwotICB9Ci0gIGNvdXQgPDwgZW5kbDsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJTaW1wbGUge1xuIgorICAgICIgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAwMjogaW1fcmVxdWlyZWQgKGkxNikgPSAwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOwogCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfMikgeworICBTaW1wbGUgczsKKyAgcy5pbV9vcHRpb25hbCA9IDEwOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8yXzMpIHsKKyAgU2ltcGxlIHM7CisgIHMuaW1fb3B0aW9uYWwgPSAxMDsKKyAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQoCisgICAgIlNpbXBsZSB7XG4iCisgICAgIiAgMDE6IGltX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDM6IGltX29wdGlvbmFsIChpMTYpID0gMTAsXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhzKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMl80KSB7CisgIFNpbXBsZSBzOworICBzLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwMzogaW1fb3B0aW9uYWwgKGkxNikgPSAwLFxuIgorICAgICJ9Iik7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHJlc3VsdChhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmcocykpOworCisgIEJPT1NUX0NIRUNLX01FU1NBR0UoIWV4cGVjdGVkX3Jlc3VsdC5jb21wYXJlKHJlc3VsdCksCisgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzJfNSkgeworICBTaW1wbGUgczsKKyAgcy5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgcy5pbV9vcHRpb25hbCA9IDEwOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiU2ltcGxlIHtcbiIKKyAgICAiICAwMTogaW1fZGVmYXVsdCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDI6IGltX3JlcXVpcmVkIChpMTYpID0gMCxcbiIKKyAgICAiICAwMzogaW1fb3B0aW9uYWwgKGkxNikgPSAxMCxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHMpKTsKKworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8zKSB7CisgIC8vIGFzc2lnbi9jb3B5LWNvbnN0cnVjdCB3aXRoIG5vbi1yZXF1aXJlZCBmaWVsZHMKKworICBTaW1wbGUgczEsIHMyOworICBzMS5fX2lzc2V0LmltX2RlZmF1bHQgPSB0cnVlOworICBzMS5fX3NldF9pbV9vcHRpb25hbCgxMCk7CisgIEJPT1NUX0NIRUNLKHMxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIEJPT1NUX0NIRUNLKHMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOworCisgIHMyID0gczE7CisKKyAgQk9PU1RfQ0hFQ0soczIuX19pc3NldC5pbV9kZWZhdWx0KTsKKyAgQk9PU1RfQ0hFQ0soczIuX19pc3NldC5pbV9vcHRpb25hbCk7CisKKyAgU2ltcGxlIHMzKHMxKTsKKworICBCT09TVF9DSEVDSyhzMy5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyhzMy5fX2lzc2V0LmltX29wdGlvbmFsKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF80KSB7CiAgIC8vIFdyaXRlLXRvLXJlYWQgd2l0aCBvcHRpb25hbCBmaWVsZHMuCi0gIHsKLSAgICBTaW1wbGUgczEsIHMyLCBzMzsKLSAgICBzMS5pbV9vcHRpb25hbCA9IDEwOwotICAgIGFzc2VydCghczEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgLy9hc3NlcnQoIXMxLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICBhc3NlcnQoIXMxLl9faXNzZXQuaW1fb3B0aW9uYWwpOwogCi0gICAgd3JpdGVfdG9fcmVhZChzMSwgczIpOworICBTaW1wbGUgczEsIHMyLCBzMzsKKyAgczEuaW1fb3B0aW9uYWwgPSAxMDsKKyAgQk9PU1RfQ0hFQ0soIXMxLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKCFzMS5fX2lzc2V0LmltX29wdGlvbmFsKTsKIAotICAgIGFzc2VydCggczIuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgLy9hc3NlcnQoIHMyLl9faXNzZXQuaW1fcmVxdWlyZWQpOyAgLy8gQ29tcGlsZSBlcnJvci4KLSAgICBhc3NlcnQoIXMyLl9faXNzZXQuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydChzMy5pbV9vcHRpb25hbCA9PSAwKTsKKyAgd3JpdGVfdG9fcmVhZChzMSwgczIpOwogCi0gICAgczEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgd3JpdGVfdG9fcmVhZChzMSwgczMpOworICBCT09TVF9DSEVDSyhzMi5fX2lzc2V0LmltX2RlZmF1bHQpOworICAvLyBCT09TVF9DSEVDSyggczIuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgorICBCT09TVF9DSEVDSyghczIuX19pc3NldC5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHMzLmltX29wdGlvbmFsID09IDApOwogCi0gICAgYXNzZXJ0KCBzMy5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAvL2Fzc2VydCggczMuX19pc3NldC5pbV9yZXF1aXJlZCk7ICAvLyBDb21waWxlIGVycm9yLgotICAgIGFzc2VydCggczMuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHMzLmltX29wdGlvbmFsID09IDEwKTsKLSAgfQorICBzMS5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKKyAgd3JpdGVfdG9fcmVhZChzMSwgczMpOwogCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fZGVmYXVsdCk7CisgIC8vIEJPT1NUX0NIRUNLKCBzMy5fX2lzc2V0LmltX3JlcXVpcmVkKTsgIC8vIENvbXBpbGUgZXJyb3IuCisgIEJPT1NUX0NIRUNLKHMzLl9faXNzZXQuaW1fb3B0aW9uYWwpOworICBCT09TVF9DSEVDSyhzMy5pbV9vcHRpb25hbCA9PSAxMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNSkgewogICAvLyBXcml0aW5nIGJldHdlZW4gb3B0aW9uYWwgYW5kIGRlZmF1bHQuCi0gIHsKLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTIgdDI7CiAKLSAgICB0Mi5pbV9vcHRpb25hbCA9IDEwOwotICAgIHdyaXRlX3RvX3JlYWQodDIsIHQxKTsKLSAgICB3cml0ZV90b19yZWFkKHQxLCB0Mik7Ci0gICAgYXNzZXJ0KCF0MS5fX2lzc2V0LmltX2RlZmF1bHQpOwotICAgIGFzc2VydCggdDIuX19pc3NldC5pbV9vcHRpb25hbCk7Ci0gICAgYXNzZXJ0KHQxLmltX2RlZmF1bHQgPT0gdDIuaW1fb3B0aW9uYWwpOwotICAgIGFzc2VydCh0MS5pbV9kZWZhdWx0ID09IDApOwotICB9CisgIFRyaWNreTEgdDE7CisgIFRyaWNreTIgdDI7CiAKKyAgdDIuaW1fb3B0aW9uYWwgPSAxMDsKKyAgd3JpdGVfdG9fcmVhZCh0MiwgdDEpOworICB3cml0ZV90b19yZWFkKHQxLCB0Mik7CisgIEJPT1NUX0NIRUNLKCF0MS5fX2lzc2V0LmltX2RlZmF1bHQpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKyAgQk9PU1RfQ0hFQ0sodDEuaW1fZGVmYXVsdCA9PSB0Mi5pbV9vcHRpb25hbCk7CisgIEJPT1NUX0NIRUNLKHQxLmltX2RlZmF1bHQgPT0gMCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfNikgewogICAvLyBXcml0aW5nIGJldHdlZW4gZGVmYXVsdCBhbmQgcmVxdWlyZWQuCi0gIHsKLSAgICBUcmlja3kxIHQxOwotICAgIFRyaWNreTMgdDM7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MSwgdDMpOwotICAgIHdyaXRlX3RvX3JlYWQodDMsIHQxKTsKLSAgICBhc3NlcnQodDEuX19pc3NldC5pbV9kZWZhdWx0KTsKLSAgfQogCisgIFRyaWNreTEgdDE7CisgIFRyaWNreTMgdDM7CisgIHdyaXRlX3RvX3JlYWQodDEsIHQzKTsKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDEpOworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0LmltX2RlZmF1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzcpIHsKICAgLy8gV3JpdGluZyBiZXR3ZWVuIG9wdGlvbmFsIGFuZCByZXF1aXJlZC4KLSAgewotICAgIFRyaWNreTIgdDI7Ci0gICAgVHJpY2t5MyB0MzsKLSAgICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gdHJ1ZTsKLSAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7Ci0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOwotICB9CiAKKyAgVHJpY2t5MiB0MjsKKyAgVHJpY2t5MyB0MzsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKKyAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzgpIHsKICAgLy8gTXUtaHUtaGEtaGEtaGEhCi0gIHsKLSAgICBUcmlja3kyIHQyOwotICAgIFRyaWNreTMgdDM7Ci0gICAgdHJ5IHsKLSAgICAgIHdyaXRlX3RvX3JlYWQodDIsIHQzKTsKLSAgICAgIGFib3J0KCk7Ci0gICAgfQotICAgIGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24mIGV4KSB7fQogCi0gICAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKKyAgVHJpY2t5MiB0MjsKKyAgVHJpY2t5MyB0MzsKKyAgdHJ5IHsKKyAgICB3cml0ZV90b19yZWFkKHQyLCB0Myk7CisgICAgYWJvcnQoKTsKKyAgfSBjYXRjaCAoY29uc3QgVFByb3RvY29sRXhjZXB0aW9uJikgewogICB9CiAKLSAgY291dCA8PCAiQ29tcGxleCBzdHJ1Y3QsIHNpbXBsZSB0ZXN0LiIgPDwgZW5kbDsKLSAgewotICAgIENvbXBsZXggYzsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKGMpIDw8IGVuZGw7Ci0gIH0KKyAgd3JpdGVfdG9fcmVhZCh0MywgdDIpOworICBCT09TVF9DSEVDSyh0Mi5fX2lzc2V0LmltX29wdGlvbmFsKTsKK30KIAorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF85KSB7CisgIENvbXBsZXggYzsKIAotICB7Ci0gICAgVHJpY2t5MSB0MTsKLSAgICBUcmlja3kyIHQyOwotICAgIC8vIENvbXBpbGUgZXJyb3IuCi0gICAgLy8odm9pZCkodDEgPT0gdDIpOwotICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiQ29tcGxleCB7XG4iCisgICAgIiAgMDE6IGNwX2RlZmF1bHQgKGkxNikgPSAwLFxuIgorICAgICIgIDAyOiBjcF9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgMDQ6IHRoZV9tYXAgKG1hcCkgPSBtYXA8aTE2LHN0cnVjdD5bMF0ge1xuIgorICAgICIgIH0sXG4iCisgICAgIiAgMDU6IHJlcV9zaW1wIChzdHJ1Y3QpID0gU2ltcGxlIHtcbiIKKyAgICAiICAgIDAxOiBpbV9kZWZhdWx0IChpMTYpID0gMCxcbiIKKyAgICAiICAgIDAyOiBpbV9yZXF1aXJlZCAoaTE2KSA9IDAsXG4iCisgICAgIiAgfSxcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKGMpKTsKIAotICB7Ci0gICAgT2xkU2Nob29sIG8xLCBvMiwgbzM7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5pbV9pbnQgPSBvMi5pbV9pbnQgPSAxMDsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8xLl9faXNzZXQuaW1faW50ID0gdHJ1ZTsKLSAgICBvMi5fX2lzc2V0LmltX2ludCA9IGZhbHNlOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuaW1faW50ID0gMjA7Ci0gICAgbzEuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8xLmltX2ludCA9IDEwOwotICAgIGFzc2VydChvMSA9PSBvMik7Ci0gICAgbzEuaW1fc3RyID0gbzIuaW1fc3RyID0gImZvbyI7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKLSAgICBvMS5fX2lzc2V0LmltX3N0ciA9IG8yLl9faXNzZXQuaW1fc3RyID0gdHJ1ZTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG1hcDxpbnQzMl90LHN0cmluZz4gbXltYXA7Ci0gICAgbXltYXBbMV0gPSAiYmFyIjsKLSAgICBteW1hcFsyXSA9ICJiYXoiOwotICAgIG8xLmltX2JpZy5wdXNoX2JhY2sobWFwPGludDMyX3Qsc3RyaW5nPigpKTsKLSAgICBhc3NlcnQobzEgIT0gbzIpOwotICAgIG8yLmltX2JpZy5wdXNoX2JhY2sobWFwPGludDMyX3Qsc3RyaW5nPigpKTsKLSAgICBhc3NlcnQobzEgPT0gbzIpOwotICAgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzEuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xID09IG8yKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7Cit9CiAKLSAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKLSAgICBvMS53cml0ZSgmcHJvdG9jb2wpOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMCkgeworICBUcmlja3kxIHQxOworICBUcmlja3kyIHQyOworICAvLyBDb21waWxlIGVycm9yLgorICAvLyh2b2lkKSh0MSA9PSB0Mik7Cit9CiAKLSAgICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKLSAgICBteW1hcFszXSA9ICJxdXgiOwotICAgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwotICAgIGFzc2VydChvMSAhPSBvMik7Ci0gICAgbzEuaW1fYmlnLmJhY2soKVszXSA9ICJxdXgiOwotICAgIGFzc2VydChvMSA9PSBvMik7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X29wdGlvbmFsX3JlcXVpcmVkXzExKSB7CisgIE9sZFNjaG9vbCBvMSwgbzIsIG8zOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLmltX2ludCA9IG8yLmltX2ludCA9IDEwOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8xLl9faXNzZXQuaW1faW50ID0gdHJ1ZTsKKyAgbzIuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9pbnQgPSAyMDsKKyAgbzEuX19pc3NldC5pbV9pbnQgPSBmYWxzZTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9pbnQgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5pbV9zdHIgPSBvMi5pbV9zdHIgPSAiZm9vIjsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBvMS5fX2lzc2V0LmltX3N0ciA9IG8yLl9faXNzZXQuaW1fc3RyID0gdHJ1ZTsKKyAgQk9PU1RfQ0hFQ0sobzEgPT0gbzIpOworICBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6OnN0cmluZz4gbXltYXA7CisgIG15bWFwWzFdID0gImJhciI7CisgIG15bWFwWzJdID0gImJheiI7CisgIG8xLmltX2JpZy5wdXNoX2JhY2soc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+KCkpOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8yLmltX2JpZy5wdXNoX2JhY2soc3RkOjptYXA8aW50MzJfdCwgc3RkOjpzdHJpbmc+KCkpOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CisgIG8yLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSAhPSBvMik7CisgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CiAKLSAgICBvMy5yZWFkKCZwcm90b2NvbCk7Ci0gICAgbzMuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7Ci0gICAgYXNzZXJ0KG8xID09IG8zKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICBvMS53cml0ZSgmcHJvdG9jb2wpOwogCi0gICAgLy9jb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKG8zKSA8PCBlbmRsOwotICB9CisgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOworICBteW1hcFszXSA9ICJxdXgiOworICBvMi5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKKyAgQk9PU1RfQ0hFQ0sobzEgIT0gbzIpOworICBvMS5pbV9iaWcuYmFjaygpWzNdID0gInF1eCI7CisgIEJPT1NUX0NIRUNLKG8xID09IG8yKTsKKyAgCisgIG8zLnJlYWQoJnByb3RvY29sKTsKKyAgbzMuaW1fYmlnLnB1c2hfYmFjayhteW1hcCk7CisgIEJPT1NUX0NIRUNLKG8xID09IG8zKTsKIAotICB7Ci0gICAgVHJpY2t5MiB0MSwgdDI7Ci0gICAgYXNzZXJ0KHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0LmltX29wdGlvbmFsID09IGZhbHNlKTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLmltX29wdGlvbmFsID0gNTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQyLmltX29wdGlvbmFsID0gNTsKLSAgICBhc3NlcnQodDEgPT0gdDIpOwotICAgIHQxLl9faXNzZXQuaW1fb3B0aW9uYWwgPSB0cnVlOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7Ci0gICAgYXNzZXJ0KHQxID09IHQyKTsKLSAgICB0MS5pbV9vcHRpb25hbCA9IDEwOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gICAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IGZhbHNlOwotICAgIGFzc2VydCh0MSAhPSB0Mik7Ci0gIH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0KAorICAgICJPbGRTY2hvb2wge1xuIgorICAgICIgIDAxOiBpbV9pbnQgKGkxNikgPSAxMCxcbiIKKyAgICAiICAwMjogaW1fc3RyIChzdHJpbmcpID0gXCJmb29cIixcbiIKKyAgICAiICAwMzogaW1fYmlnIChsaXN0KSA9IGxpc3Q8bWFwPlszXSB7XG4iCisgICAgIiAgICBbMF0gPSBtYXA8aTMyLHN0cmluZz5bMF0ge1xuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFsxXSA9IG1hcDxpMzIsc3RyaW5nPlsyXSB7XG4iCisgICAgIiAgICAgIDEgLT4gXCJiYXJcIixcbiIKKyAgICAiICAgICAgMiAtPiBcImJhelwiLFxuIgorICAgICIgICAgfSxcbiIKKyAgICAiICAgIFsyXSA9IG1hcDxpMzIsc3RyaW5nPlszXSB7XG4iCisgICAgIiAgICAgIDEgLT4gXCJiYXJcIixcbiIKKyAgICAiICAgICAgMiAtPiBcImJhelwiLFxuIgorICAgICIgICAgICAzIC0+IFwicXV4XCIsXG4iCisgICAgIiAgICB9LFxuIgorICAgICIgIH0sXG4iCisgICAgIn0iKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgcmVzdWx0KGFwYWNoZTo6dGhyaWZ0OjpUaHJpZnREZWJ1Z1N0cmluZyhvMykpOwogCi0gIHsKLSAgICBPcHRpb25hbERlZmF1bHQgdDEsIHQyOwotICAgIGNvdXQgPDwgVGhyaWZ0RGVidWdTdHJpbmcodDEpIDw8IGVuZGw7Ci0gICAgYXNzZXJ0KHQxLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKLSAgICBhc3NlcnQodDEuX19pc3NldC5vcHRfc3RyID09IHRydWUpOwotICAgIGFzc2VydCh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOwotICAgIGFzc2VydCh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFleHBlY3RlZF9yZXN1bHQuY29tcGFyZShyZXN1bHQpLAorICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKK30KIAotICAgIHdyaXRlX3RvX3JlYWQodDEsIHQyKTsKLSAgICBjb3V0IDw8IFRocmlmdERlYnVnU3RyaW5nKHQyKSA8PCBlbmRsOwotICAgIGFzc2VydCh0Mi5fX2lzc2V0Lm9wdF9pbnQgPT0gdHJ1ZSk7Ci0gICAgYXNzZXJ0KHQyLl9faXNzZXQub3B0X3N0ciA9PSB0cnVlKTsKLSAgICBhc3NlcnQodDEub3B0X2ludCA9PSB0Mi5vcHRfaW50KTsKLSAgICBhc3NlcnQodDEub3B0X3N0ciA9PSB0Mi5vcHRfc3RyKTsKLSAgfQorQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9vcHRpb25hbF9yZXF1aXJlZF8xMikgeworICBUcmlja3kyIHQxLCB0MjsKKyAgQk9PU1RfQ0hFQ0sodDEuX19pc3NldC5pbV9vcHRpb25hbCA9PSBmYWxzZSk7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQuaW1fb3B0aW9uYWwgPT0gZmFsc2UpOworICBCT09TVF9DSEVDSyh0MSA9PSB0Mik7CisgIHQxLmltX29wdGlvbmFsID0gNTsKKyAgQk9PU1RfQ0hFQ0sodDEgPT0gdDIpOworICB0Mi5pbV9vcHRpb25hbCA9IDU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKKyAgdDIuX19pc3NldC5pbV9vcHRpb25hbCA9IHRydWU7CisgIEJPT1NUX0NIRUNLKHQxID09IHQyKTsKKyAgdDEuaW1fb3B0aW9uYWwgPSAxMDsKKyAgQk9PU1RfQ0hFQ0sodDEgIT0gdDIpOworICB0Mi5fX2lzc2V0LmltX29wdGlvbmFsID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLKHQxICE9IHQyKTsKK30KIAotICByZXR1cm4gMDsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfb3B0aW9uYWxfcmVxdWlyZWRfMTMpIHsKKyAgT3B0aW9uYWxEZWZhdWx0IHQxLCB0MjsKKworICBCT09TVF9DSEVDSyh0MS5fX2lzc2V0Lm9wdF9pbnQgPT0gdHJ1ZSk7CisgIEJPT1NUX0NIRUNLKHQxLl9faXNzZXQub3B0X3N0ciA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDEub3B0X2ludCA9PSB0Mi5vcHRfaW50KTsKKyAgQk9PU1RfQ0hFQ0sodDEub3B0X3N0ciA9PSB0Mi5vcHRfc3RyKTsKKworICB3cml0ZV90b19yZWFkKHQxLCB0Mik7CisgIEJPT1NUX0NIRUNLKHQyLl9faXNzZXQub3B0X2ludCA9PSB0cnVlKTsKKyAgQk9PU1RfQ0hFQ0sodDIuX19pc3NldC5vcHRfc3RyID09IHRydWUpOworICBCT09TVF9DSEVDSyh0MS5vcHRfaW50ID09IHQyLm9wdF9pbnQpOworICBCT09TVF9DSEVDSyh0MS5vcHRfc3RyID09IHQyLm9wdF9zdHIpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCgKKyAgICAiT3B0aW9uYWxEZWZhdWx0IHtcbiIKKyAgICAiICAwMTogb3B0X2ludCAoaTE2KSA9IDEyMzQsXG4iCisgICAgIiAgMDI6IG9wdF9zdHIgKHN0cmluZykgPSBcImRlZmF1bHRcIixcbiIKKyAgICAifSIpOworICBjb25zdCBzdGQ6OnN0cmluZyByZXN1bHQoYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nKHQyKSk7CisKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghZXhwZWN0ZWRfcmVzdWx0LmNvbXBhcmUocmVzdWx0KSwKKyAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUldNdXRleFN0YXJ2ZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1JXTXV0ZXhTdGFydmVUZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjY2NmMi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3Rlc3QvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotCi0jaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCi0jaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIgotCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Ci11c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOwotCi11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotY2xhc3MgTG9ja2VyIDogcHVibGljIFJ1bm5hYmxlCi17Ci1wcm90ZWN0ZWQ6Ci0gIExvY2tlcihib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikgOgotICAgIHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLAotICAgIHN0YXJ0ZWRfKGZhbHNlKSwgZ290TG9ja18oZmFsc2UpLCBzaWduYWxlZF8oZmFsc2UpIHsgfQotCi1wdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBydW4oKQotICB7Ci0gICAgc3RhcnRlZF8gPSB0cnVlOwotICAgIGlmICh3cml0ZXJfKSB7Ci0gICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKLSAgICB9Ci0gICAgZ290TG9ja18gPSB0cnVlOwotICAgIHdoaWxlICghc2lnbmFsZWRfKSB7Ci0gICAgICB1c2xlZXAoNTAwMCk7Ci0gICAgfQotICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKLSAgfQotCi0gIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9Ci0gIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9Ci0gIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9Ci0KLXByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9ja187Ci0gIGJvb2wgd3JpdGVyXzsKLSAgdm9sYXRpbGUgYm9vbCBzdGFydGVkXzsKLSAgdm9sYXRpbGUgYm9vbCBnb3RMb2NrXzsKLSAgdm9sYXRpbGUgYm9vbCBzaWduYWxlZF87Ci19OwotCi1jbGFzcyBSZWFkZXIgOiBwdWJsaWMgTG9ja2VyCi17Ci1wdWJsaWM6Ci0gIFJlYWRlcihib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIGZhbHNlKSB7IH0KLX07Ci0KLWNsYXNzIFdyaXRlciA6IHB1YmxpYyBMb2NrZXIKLXsKLXB1YmxpYzoKLSAgV3JpdGVyKGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkgeyB9Ci19OwotCi12b2lkIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6UE9MSUNZIHBvbGljeSkKLXsKLSAgLy8gdGhlIG1hbiBwYWdlcyBmb3IgcHRocmVhZF93cmxvY2tfcmRsb2NrIHN1Z2dlc3QgdGhhdCBhbnkgT1MgZ3VhcmFudGVlIGFib3V0Ci0gIC8vIHdyaXRlciBzdGFydmF0aW9uIG1heSBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBzY2hlZHVsaW5nIHBvbGljeSwgc28gbGV0J3MgdHJ5Ci0gIC8vIGFsbCAzIHBvbGljaWVzIHRvIHNlZSBpZiBhbnkgb2YgdGhlbSB3b3JrLgotICBQb3NpeFRocmVhZEZhY3RvcnkgZmFjdG9yeShwb2xpY3kpOwotICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKG5ldyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRlcj4gcmVhZGVyMShuZXcgUmVhZGVyKHJ3bG9jaykpOwotICBib29zdDo6c2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjIobmV3IFJlYWRlcihyd2xvY2spKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8V3JpdGVyPiB3cml0ZXIobmV3IFdyaXRlcihyd2xvY2spKTsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIxID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjIgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIyKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0d3JpdGVyID0gZmFjdG9yeS5uZXdUaHJlYWQod3JpdGVyKTsKLQotICAvLyBsYXVuY2ggYSByZWFkZXIgYW5kIG1ha2Ugc3VyZSBoZSBoYXMgdGhlIGxvY2sKLSAgdHJlYWRlcjEtPnN0YXJ0KCk7Ci0gIHdoaWxlICghcmVhZGVyMS0+Z290TG9jaygpKSB7Ci0gICAgdXNsZWVwKDIwMDApOwotICB9Ci0KLSAgLy8gbGF1bmNoIGEgd3JpdGVyIGFuZCBtYWtlIHN1cmUgaGUncyBibG9ja2VkIG9uIHRoZSBsb2NrCi0gIHR3cml0ZXItPnN0YXJ0KCk7Ci0gIHdoaWxlICghd3JpdGVyLT5zdGFydGVkKCkpIHsKLSAgICB1c2xlZXAoMjAwMCk7Ci0gIH0KLSAgLy8gdHJpY2t5IHBhcnQuLi4gd2UgY2FuIG5ldmVyIGJlIDEwMCUgc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgYWN0dWFsbHkKLSAgLy8gYmxvY2tlZCBvbiB0aGUgbG9jaywgYnV0IHdlIGNhbiBwcmV0dHkgcmVhc29uYWJseSBzdXJlIGJlY2F1c2Ugd2Uga25vdwotICAvLyBoZSBqdXN0IGV4ZWN1dGVkIHRoZSBsaW5lIGltbWVkaWF0ZWx5IGJlZm9yZSBnZXR0aW5nIHRoZSBsb2NrLCBhbmQKLSAgLy8gd2UnbGwgd2FpdCBhIGZ1bGwgc2Vjb25kIGZvciBoaW0gdG8gZ2V0IG9uIGl0LgotICBzbGVlcCgxKTsKLQotICAvLyBsYXVuY2ggYSBzZWNvbmQgcmVhZGVyLi4uIGlmIHRoZSBSV011dGV4IGd1YXJhbnRlZXMgdGhhdCB3cml0ZXJzIHdvbid0Ci0gIC8vIHN0YXJ2ZSwgdGhpcyByZWFkZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjcXVpcmUgdGhlIGxvY2sgdW50aWwgdGhlIHdyaXRlcgotICAvLyBoYXMgYWNxdWlyZWQgYW5kIHJlbGVhc2VkIGl0LgotICB0cmVhZGVyMi0+c3RhcnQoKTsKLSAgd2hpbGUgKCFyZWFkZXIyLT5zdGFydGVkKCkpIHsKLSAgICB1c2xlZXAoMjAwMCk7Ci0gIH0KLSAgLy8gYWdhaW4uLi4gY2FuJ3QgYmUgMTAwJSBzdXJlIHRoZSByZWFkZXIgaXMgd2FpdGluZyBvbiAob3IgaGFzKSB0aGUgbG9jawotICAvLyBidXQgd2UgY2FuIGJlIGNsb3NlLgotICBzbGVlcCgxKTsKLQotICAvLyB0ZWxsIHJlYWRlciAxIHRvIGxldCBnbyBvZiB0aGUgbG9jawotICByZWFkZXIxLT5zaWduYWwoKTsKLQotICAvLyB3YWl0IGZvciBzb21lb25lIHRvIGdldCB0aGUgbG9jawotICB3aGlsZSAoIXJlYWRlcjItPmdvdExvY2soKSAmJiAhd3JpdGVyLT5nb3RMb2NrKCkpIHsKLSAgICB1c2xlZXAoMjAwMCk7Ci0gIH0KLQotICAvLyB0aGUgdGVzdCBzdWNjZWVkZWQgaWYgdGhlIFdSSVRFUiBnb3QgdGhlIGxvY2suCi0gIGJvb2wgc3VjY2VzcyA9IHdyaXRlci0+Z290TG9jaygpOwotCi0gIC8vIHRlbGwgZXZlcnlvbmUgd2UncmUgZG9uZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBmaW5pc2gKLSAgcmVhZGVyMi0+c2lnbmFsKCk7Ci0gIHdyaXRlci0+c2lnbmFsKCk7Ci0gIHRyZWFkZXIxLT5qb2luKCk7Ci0gIHRyZWFkZXIyLT5qb2luKCk7Ci0gIHR3cml0ZXItPmpvaW4oKTsKLQotICAvLyBtYWtlIHN1cmUgaXQgd29ya2VkLgotICBCT09TVF9DSEVDS19NRVNTQUdFKHN1Y2Nlc3MsICJ3cml0ZXIgaXMgc3RhcnZpbmciKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX1NVSVRFKCBSV011dGV4U3RhcnZlVGVzdCApCi0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKCB0ZXN0X3N0YXJ2ZV9vdGhlciApCi17Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9zdGFydmVfcnIgKQotewotICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlJPVU5EX1JPQklOKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3Rfc3RhcnZlX2ZpZm8gKQotewotICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk8pOwotfQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYyMzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlICJnZW4tY3BwL1JlY3Vyc2l2ZV90eXBlcy5oIgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlY3Vyc2l2ZVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMSkgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBSZWNUcmVlIHRyZWU7CisgIFJlY1RyZWUgY2hpbGQ7CisgIHRyZWUuY2hpbGRyZW4ucHVzaF9iYWNrKGNoaWxkKTsKKworICB0cmVlLndyaXRlKHByb3QuZ2V0KCkpOworCisgIFJlY1RyZWUgcmVzdWx0OworICByZXN1bHQucmVhZChwcm90LmdldCgpKTsKKyAgQk9PU1RfQ0hFQ0sodHJlZSA9PSByZXN1bHQpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV8yKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOworCisgIFJlY0xpc3QgbDsKKyAgc2hhcmVkX3B0cjxSZWNMaXN0PiBsMihuZXcgUmVjTGlzdCk7CisgIGwubmV4dGl0ZW0gPSBsMjsKKworICBsLndyaXRlKHByb3QuZ2V0KCkpOworCisgIFJlY0xpc3QgcmVzdWx0bGlzdDsKKyAgcmVzdWx0bGlzdC5yZWFkKHByb3QuZ2V0KCkpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtICE9IE5VTEwpOworICBCT09TVF9DSEVDSyhyZXN1bHRsaXN0Lm5leHRpdGVtLT5uZXh0aXRlbSA9PSBOVUxMKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMykgeworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKKworICBDb1JlYyBjOworICBzaGFyZWRfcHRyPENvUmVjMj4gcihuZXcgQ29SZWMyKTsKKyAgYy5vdGhlciA9IHI7CisKKyAgYy53cml0ZShwcm90LmdldCgpKTsKKworICBjLnJlYWQocHJvdC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXIgIT0gTlVMTCk7CisgIEJPT1NUX0NIRUNLKGMub3RoZXItPm90aGVyLm90aGVyID09IE5VTEwpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlY3Vyc2l2ZV80KSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gcHJvdChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZikpOworCisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gZGVwdGhMaW1pdChuZXcgUmVjTGlzdCk7CisgIGRlcHRoTGltaXQtPm5leHRpdGVtID0gZGVwdGhMaW1pdDsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coZGVwdGhMaW1pdC0+d3JpdGUocHJvdC5nZXQoKSksCisgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xFeGNlcHRpb24pOworCisgIGRlcHRoTGltaXQtPm5leHRpdGVtLnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBFUFNJTE9OIDAuMDAwMDAwMQorI2luY2x1ZGUgPHR5cGVpbmRleD4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmgiCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKSB7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUykuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKQorICAgICAgICAgICAgLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3QpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+IEVYUEVDVEVEX0RPVUJMRV9MSVNUezEuMCwtMTAwLjAsMTAwLjAsOTIyMzM3MjAzNjg1NDc3NTgwNy4wLC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsCisgICAgICAgIDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCksIEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCk7ICsraSkgeworICAgICAgICBCT09TVF9DSEVDS19DTE9TRShnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldLCBFUFNJTE9OKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhNGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBTZWN1cml0eVRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNlcnZlclNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OworCit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKK2Jvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKK3sKKyAgICByZXR1cm4ga2V5RGlyIC8gZmlsZW5hbWU7Cit9Citib29zdDo6bXV0ZXggZ011dGV4OworCitzdHJ1Y3QgR2xvYmFsRml4dHVyZQoreworICAgIEdsb2JhbEZpeHR1cmUoKQorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYzsgKytpKQorICAgIHsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICB9CisKKyAgICAjaWZkZWYgX19saW51eF9fCisgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAvLyBkaXNjb25uZWN0ZWQgY2FuIGNhdXNlIGEgU0lHUElQRSBzaWduYWwuLi4KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgI2VuZGlmCisKKyAgICBUU1NMU29ja2V0RmFjdG9yeTo6c2V0TWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uKHRydWUpOworICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgIHsKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlKCkKKyAgICB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CisjZW5kaWYKKyAgICB9Cit9OworCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSk7CisjZWxzZQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZSkKKyNlbmRpZgorCitzdHJ1Y3QgU2VjdXJpdHlGaXh0dXJlCit7CisgICAgdm9pZCBzZXJ2ZXIoYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBwU2VydmVyU29ja2V0OworCisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgic2VydmVyLmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+c2VydmVyKHRydWUpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldChuZXcgVFNTTFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpKTsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gY29ubmVjdGVkQ2xpZW50OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5saXN0ZW4oKTsKKyAgICAgICAgICAgICAgICBtUG9ydCA9IHBTZXJ2ZXJTb2NrZXQtPmdldFBvcnQoKTsKKyAgICAgICAgICAgICAgICBtQ1Zhci5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudCA9IHBTZXJ2ZXJTb2NrZXQtPmFjY2VwdCgpOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzJdOworICAgICAgICAgICAgICAgIGJ1ZlswXSA9ICdPJzsKKyAgICAgICAgICAgICAgICBidWZbMV0gPSAnSyc7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT53cml0ZSgmYnVmWzBdLCAyKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0ZWRDbGllbnQtPmZsdXNoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhdGNoIChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZ011dGV4KTsKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiU1JWICUxJSBFeGNlcHRpb246ICUyJSIpICUgYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSAlIGV4LndoYXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb25uZWN0ZWRDbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGVkQ2xpZW50LT5jbG9zZSgpOworICAgICAgICAgICAgICAgIGNvbm5lY3RlZENsaWVudC5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU2VydmVyU29ja2V0LT5jbG9zZSgpOworICAgICAgICAgICAgcFNlcnZlclNvY2tldC5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgY2xpZW50KGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sIHByb3RvY29sKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBwQ2xpZW50U29ja2V0OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3Rvcnkoc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHByb3RvY29sKSkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0RmlsZSgiY2xpZW50LmNydCIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldCA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIG1Qb3J0KTsKKyAgICAgICAgICAgICAgICBwQ2xpZW50U29ja2V0LT5vcGVuKCk7CisKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZlszXTsKKyAgICAgICAgICAgICAgICBidWZbMF0gPSAwOworICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IDA7CisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcENsaWVudFNvY2tldC0+cmVhZCgmYnVmWzBdLCAyKSk7CisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbWVtY21wKCZidWZbMF0sICJPSyIsIDIpKTsKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29zdDo6bXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soZ011dGV4KTsKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiQ0xJICUxJSBFeGNlcHRpb246ICUyJSIpICUgYm9vc3Q6OnRoaXNfdGhyZWFkOjpnZXRfaWQoKSAlIGV4LndoYXQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ2xpZW50U29ja2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrZXQtPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcENsaWVudFNvY2tldC5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT1NUX0ZBSUwoYm9vc3Q6OmZvcm1hdCgiJTElOiAlMiUiKSAlIHR5cGVpZChleCkubmFtZSgpICUgZXgud2hhdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpwcm90b2NvbDJzdHIoc2l6ZV90IHByb3RvY29sKQorICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnN0cmluZ3NbYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV0gPQorICAgICAgICB7CisgICAgICAgICAgICAgICAgIlNTTFRMUyIsCisgICAgICAgICAgICAgICAgIlNTTHYyIiwKKyAgICAgICAgICAgICAgICAiU1NMdjMiLAorICAgICAgICAgICAgICAgICJUTFN2MV8wIiwKKyAgICAgICAgICAgICAgICAiVExTdjFfMSIsCisgICAgICAgICAgICAgICAgIlRMU3YxXzIiCisgICAgICAgIH07CisgICAgICAgIHJldHVybiBzdHJpbmdzW3Byb3RvY29sXTsKKyAgICB9CisKKyAgICBib29zdDo6bXV0ZXggbU11dGV4OworICAgIGJvb3N0Ojpjb25kaXRpb25fdmFyaWFibGUgbUNWYXI7CisgICAgaW50IG1Qb3J0OworICAgIGJvb2wgbUNvbm5lY3RlZDsKK307CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9TVUlURShCT09TVF9URVNUX01PRFVMRSwgU2VjdXJpdHlGaXh0dXJlKQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShzc2xfc2VjdXJpdHlfbWF0cml4KQoreworICAgIHRyeQorICAgIHsKKyAgICAgICAgLy8gbWF0cml4IG9mIGNvbm5lY3Rpb24gc3VjY2VzcyBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyIHdpdGggZGlmZmVyZW50IFNTTFByb3RvY29sIHNlbGVjdGlvbnMKKyAgICAgICAgYm9vbCBtYXRyaXhbYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV1bYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6TEFURVNUICsgMV0gPQorICAgICAgICB7CisgICAgLy8gICBzZXJ2ZXIgICAgPSBTU0xUTFMgICBTU0x2MiAgICBTU0x2MyAgICBUTFN2MV8wICBUTFN2MV8xICBUTFN2MV8yCisgICAgLy8gY2xpZW50CisgICAgLyogU1NMVExTICAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICB0cnVlLCAgICB0cnVlICAgIH0sCisgICAgLyogU1NMdjIgICAqLyAgeyBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogU1NMdjMgICAqLyAgeyBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMCAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMSAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlLCAgICBmYWxzZSAgIH0sCisgICAgLyogVExTdjFfMiAqLyAgeyB0cnVlLCAgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICBmYWxzZSwgICB0cnVlICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBzaSA9IDA7IHNpIDw9IGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OkxBVEVTVDsgKytzaSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzaXplX3QgY2kgPSAwOyBjaSA8PSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpMQVRFU1Q7ICsrY2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNpID09IDEgfHwgY2kgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgYWxsIFNTTHYyIGNhc2VzIC0gcHJvdG9jb2wgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICAgICAgICAgICAgICBpZiAoc2kgPT0gMiB8fCBjaSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBhbGwgU1NMdjMgY2FzZXMgLSBwcm90b2NvbCBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgYm9vc3Q6Om11dGV4OjpzY29wZWRfbG9jayBsb2NrKG1NdXRleCk7CisKKyAgICAgICAgICAgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiVEVTVDogU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUiKQorICAgICAgICAgICAgICAgICAgICAlIHByb3RvY29sMnN0cihzaSkgJSBwcm90b2NvbDJzdHIoY2kpKTsKKworICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAvLyB0aHJlYWRfZ3JvdXAgbWFuYWdlcyB0aGUgdGhyZWFkIGxpZmV0aW1lIC0gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgb2YgY3JlYXRlX3RocmVhZAorICAgICAgICAgICAgICAgIGJvb3N0Ojp0aHJlYWRfZ3JvdXAgdGhyZWFkczsKKyAgICAgICAgICAgICAgICAodm9pZCl0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYmluZCgmU2VjdXJpdHlGaXh0dXJlOjpzZXJ2ZXIsIHRoaXMsIHN0YXRpY19jYXN0PGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlNTTFByb3RvY29sPihzaSkpKTsKKyAgICAgICAgICAgICAgICBtQ1Zhci53YWl0KGxvY2spOyAgICAgICAgICAgLy8gd2FpdCBmb3IgbGlzdGVuKCkgdG8gc3VjY2VlZAorICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6Y2xpZW50LCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oY2kpKSk7CisgICAgICAgICAgICAgICAgdGhyZWFkcy5qb2luX2FsbCgpOworCisgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShtQ29ubmVjdGVkID09IG1hdHJpeFtjaV1bc2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmZvcm1hdCgiICAgICAgU2VydmVyID0gJTElLCBDbGllbnQgPSAlMiUgZXhwZWN0ZWQgbUNvbm5lY3RlZCA9PSAlMyUgYnV0IHdhcyAlNCUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgcHJvdG9jb2wyc3RyKHNpKSAlIHByb3RvY29sMnN0cihjaSkgJSBtYXRyaXhbY2ldW3NpXSAlIG1Db25uZWN0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZXgpCisgICAgeworICAgICAgICBCT09TVF9GQUlMKGJvb3N0Ojpmb3JtYXQoIiUxJTogJTIlIikgJSB0eXBlaWQoZXgpLm5hbWUoKSAlIGV4LndoYXQoKSk7CisgICAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9TcGVjaWFsaXphdGlvblRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKaW5kZXggN2EzZDM0Ny4uMDA4ODM3ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAKQEAgLTEsMzAgKzEsMzAgQEAKLSNpbmNsdWRlIDxpb3N0cmVhbT4KKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKICNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDxnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmg+CiAKLXVzaW5nIHN0ZDo6Y291dDsKLXVzaW5nIHN0ZDo6ZW5kbDsKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFNwZWNpYWxpemF0aW9uVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKwogdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IE15UHJvdG9jb2w7Ci0vL3R5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUVHJhbnNwb3J0PiBNeVByb3RvY29sOworLy8gdHlwZWRlZiBUQmluYXJ5UHJvdG9jb2xUPFRUcmFuc3BvcnQ+IE15UHJvdG9jb2w7CiAKLWludCBtYWluKCkgewotCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NwZWNpYWxpemF0aW9uXzEpIHsKICAgT25lT2ZFYWNoIG9vZTsKLSAgb29lLmltX3RydWUgICA9IHRydWU7Ci0gIG9vZS5pbV9mYWxzZSAgPSBmYWxzZTsKLSAgb29lLmFfYml0ZSAgICA9IDB4N2Y7CisgIG9vZS5pbV90cnVlID0gdHJ1ZTsKKyAgb29lLmltX2ZhbHNlID0gZmFsc2U7CisgIG9vZS5hX2JpdGUgPSAweDdmOwogICBvb2UuaW50ZWdlcjE2ID0gMjcwMDA7Ci0gIG9vZS5pbnRlZ2VyMzIgPSAxPDwyNDsKKyAgb29lLmludGVnZXIzMiA9IDEgPDwgMjQ7CiAgIG9vZS5pbnRlZ2VyNjQgPSAodWludDY0X3QpNjAwMCAqIDEwMDAgKiAxMDAwOwogICBvb2UuZG91YmxlX3ByZWNpc2lvbiA9IE1fUEk7Ci0gIG9vZS5zb21lX2NoYXJhY3RlcnMgID0gIkpTT04gVEhJUyEgXCJcMSI7Ci0gIG9vZS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOworICBvb2Uuc29tZV9jaGFyYWN0ZXJzID0gIkpTT04gVEhJUyEgXCJcMSI7CisgIG9vZS56b21nX3VuaWNvZGUgPSAiXHhkN1xuXGFcdCI7CiAgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CiAKICAgTmVzdGluZyBuOwpAQCAtMzIsMTIgKzMyLDE0IEBACiAgIG4ubXlfb29lLmludGVnZXIxNiA9IDE2OwogICBuLm15X29vZS5pbnRlZ2VyMzIgPSAzMjsKICAgbi5teV9vb2UuaW50ZWdlcjY0ID0gNjQ7Ci0gIG4ubXlfb29lLmRvdWJsZV9wcmVjaXNpb24gPSAoc3RkOjpzcXJ0KDUpKzEpLzI7Ci0gIG4ubXlfb29lLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci0gIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhkMFx4OWRceGNlXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgyMFx4Y2VceDkxXHg3NFx4NzRceGNlXHhiMVx4ZTJceDg1XHhiZFx4Y2VceGJhXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotICBuLm15X2JvbmsudHlwZSAgICA9IDMxMzM3OworICBuLm15X29vZS5kb3VibGVfcHJlY2lzaW9uID0gKHN0ZDo6c3FydCg1LjApICsgMSkgLyAyOworICBuLm15X29vZS5zb21lX2NoYXJhY3RlcnMgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7CisgIG4ubXlfb29lLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjBceGQwXHg5ZFx4Y2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiZlx4ZTJceDg1XHhiZlx4ZDBceGJlXHhjOVx4YTFceGQwXHhiM1x4ZDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiMFx4Y2ZceDgxXHhlMlx4ODRceDhlXHgyMFx4Y2VceDkxXHg3NFx4NzQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYVx4YzdceDgzXHhlMlx4ODAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhiYyI7CisgIG4ubXlfYm9uay50eXBlID0gMzEzMzc7CiAgIG4ubXlfYm9uay5tZXNzYWdlID0gIkkgYW0gYSBib25rLi4uIHhvciEiOwogCiAgIEhvbHlNb2xleSBobTsKQEAgLTYxLDQ4ICs2Myw0MSBAQAogCiAgIHN0ZDo6dmVjdG9yPEJvbms+IHN0YWdlMjsKICAgaG0uYm9ua3NbIm5vdGhpbmciXSA9IHN0YWdlMjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMTsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldhaXQuIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMjsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gIldoYXQ/IjsKICAgaG0uYm9ua3NbInNvbWV0aGluZyJdID0gc3RhZ2UyOwogICBzdGFnZTIuY2xlYXIoKTsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gMzsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInF1b3RoIjsKLSAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpKzEpOworICBzdGFnZTIucmVzaXplKHN0YWdlMi5zaXplKCkgKyAxKTsKICAgc3RhZ2UyLmJhY2soKS50eXBlID0gNDsKICAgc3RhZ2UyLmJhY2soKS5tZXNzYWdlID0gInRoZSByYXZlbiI7Ci0gIHN0YWdlMi5yZXNpemUoc3RhZ2UyLnNpemUoKSsxKTsKKyAgc3RhZ2UyLnJlc2l6ZShzdGFnZTIuc2l6ZSgpICsgMSk7CiAgIHN0YWdlMi5iYWNrKCkudHlwZSA9IDU7CiAgIHN0YWdlMi5iYWNrKCkubWVzc2FnZSA9ICJuZXZlcm1vcmUiOwogICBobS5ib25rc1sicG9lIl0gPSBzdGFnZTI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvKG5ldyBNeVByb3RvY29sKGJ1ZmZlcikpOwotCi0gIGNvdXQgPDwgIlRlc3Rpbmcgb29lIiA8PCBlbmRsOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90byhuZXcgTXlQcm90b2NvbChidWZmZXIpKTsKIAogICBvb2Uud3JpdGUocHJvdG8uZ2V0KCkpOwogICBPbmVPZkVhY2ggb29lMjsKICAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKIAotICBhc3NlcnQob29lID09IG9vZTIpOwotCi0KLSAgY291dCA8PCAiVGVzdGluZyBobSIgPDwgZW5kbDsKKyAgQk9PU1RfQ0hFQ0sob29lID09IG9vZTIpOwogCiAgIGhtLndyaXRlKHByb3RvLmdldCgpKTsKICAgSG9seU1vbGV5IGhtMjsKICAgaG0yLnJlYWQocHJvdG8uZ2V0KCkpOwogCi0gIGFzc2VydChobSA9PSBobTIpOworICBCT09TVF9DSEVDSyhobSA9PSBobTIpOwogCiAgIGhtMi5iaWdbMF0uYV9iaXRlID0gMHgwMDsKIAotICBhc3NlcnQoaG0gIT0gaG0yKTsKLQotICByZXR1cm4gMDsKKyAgQk9PU1RfQ0hFQ0soaG0gIT0gaG0yKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKaW5kZXggZjg4YTAxOS4uNDMwMzAyYyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RCdWZmZXJCYXNlVGVzdC5jcHAKQEAgLTIxLDEzICsyMSwxNCBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLXVzaW5nIHN0ZDo6c3RyaW5nOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OnRlc3Q6OlRTaG9ydFJlYWRUcmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAogLy8gU2hhbWVsZXNzbHkgY29waWVkIGZyb20gWmxpYlRyYW5zcG9ydC4gIFRPRE86IHJlZmFjdG9yLgogdW5zaWduZWQgaW50IGRpc3RbXVs1MDAwXSA9IHsKQEAgLTM0OSw3ICszNTAsNyBAQAogICAgICAgaW50IHdyaXRlX2luZGV4ID0gMDsKICAgICAgIHVuc2lnbmVkIGludCB0b193cml0ZSA9ICgxPDwxNCktNDI7CiAgICAgICB3aGlsZSAodG9fd3JpdGUgPiAwKSB7Ci0gICAgICAgIGludCB3cml0ZV9hbXQgPSBzdGQ6Om1pbihkaXN0W2QxXVt3cml0ZV9pbmRleF0sIHRvX3dyaXRlKTsKKyAgICAgICAgaW50IHdyaXRlX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bd3JpdGVfaW5kZXhdLCB0b193cml0ZSk7CiAgICAgICAgIGJ1ZmZlci53cml0ZSgmZGF0YVt3cml0ZV9vZmZzZXRdLCB3cml0ZV9hbXQpOwogICAgICAgICB3cml0ZV9vZmZzZXQgKz0gd3JpdGVfYW10OwogICAgICAgICB3cml0ZV9pbmRleCsrOwpAQCAtMzYwLDcgKzM2MSw3IEBACiAgICAgICBpbnQgcmVhZF9pbmRleCA9IDA7CiAgICAgICB1bnNpZ25lZCBpbnQgdG9fcmVhZCA9ICgxPDwxMyktNDI7CiAgICAgICB3aGlsZSAodG9fcmVhZCA+IDApIHsKLSAgICAgICAgaW50IHJlYWRfYW10ID0gc3RkOjptaW4oZGlzdFtkMl1bcmVhZF9pbmRleF0sIHRvX3JlYWQpOworICAgICAgICBpbnQgcmVhZF9hbXQgPSAoc3RkOjptaW4pKGRpc3RbZDJdW3JlYWRfaW5kZXhdLCB0b19yZWFkKTsKICAgICAgICAgaW50IGdvdCA9IGJ1ZmZlci5yZWFkKCZkYXRhX291dFtyZWFkX29mZnNldF0sIHJlYWRfYW10KTsKICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ290LCByZWFkX2FtdCk7CiAgICAgICAgIHJlYWRfb2Zmc2V0ICs9IHJlYWRfYW10OwpAQCAtMzc0LDcgKzM3NSw3IEBACiAgICAgICBpbnQgc2Vjb25kX2luZGV4ID0gd3JpdGVfaW5kZXgtMTsKICAgICAgIHVuc2lnbmVkIGludCB0b19zZWNvbmQgPSAoMTw8MTQpKzQyOwogICAgICAgd2hpbGUgKHRvX3NlY29uZCA+IDApIHsKLSAgICAgICAgaW50IHNlY29uZF9hbXQgPSBzdGQ6Om1pbihkaXN0W2QxXVtzZWNvbmRfaW5kZXhdLCB0b19zZWNvbmQpOworICAgICAgICBpbnQgc2Vjb25kX2FtdCA9IChzdGQ6Om1pbikoZGlzdFtkMV1bc2Vjb25kX2luZGV4XSwgdG9fc2Vjb25kKTsKICAgICAgICAgLy9wcmludGYoIiVkXG4iLCBzZWNvbmRfYW10KTsKICAgICAgICAgYnVmZmVyLndyaXRlKCZkYXRhW3NlY29uZF9vZmZzZXRdLCBzZWNvbmRfYW10KTsKICAgICAgICAgc2Vjb25kX29mZnNldCArPSBzZWNvbmRfYW10OwpAQCAtNTY2LDcgKzU2Nyw3IEBACiAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgMzsgZDErKykgewogICAgICAgICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigxNikpOwogICAgICAgICBURnJhbWVkVHJhbnNwb3J0IHRyYW5zKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIHVpbnQ4X3QgZGF0YV9vdXRbMTw8MTVdOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhX291dCgxPDwxNywgMCk7CiAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmx1c2hfc2l6ZXM7CiAKICAgICAgICAgaW50IHdyaXRlX29mZnNldCA9IDA7CkBAIC02MDQsNyArNjA1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIEJPT1NUX0NIRUNLX0VRVUFMKCh1bnNpZ25lZCBpbnQpcmVhZF9vZmZzZXQsIHNpemVvZihkYXRhKSk7Ci0gICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgZGF0YV9vdXQsIHNpemVvZihkYXRhKSkpOworICAgICAgICBCT09TVF9DSEVDSyghbWVtY21wKGRhdGEsICZkYXRhX291dFswXSwgc2l6ZW9mKGRhdGEpKSk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVEZEVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggN2ZmY2E3MS4uMGJhMDM1YSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9URkRUcmFuc3BvcnRUZXN0LmNwcApAQCAtMjEsMzYgKzIxLDMwIEBACiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5oPgorCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRGRFRyYW5zcG9ydFRlc3QKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKy8vIERpc2FibGVkIG9uIE1TVkMgYmVjYXVzZSB0aGUgUlRMIGFzc2VydHMgb24gYW4gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKKy8vIGluIGJvdGggZGVidWcgYW5kIHJlbGVhc2UgbW9kZTsgYXQgbGVhc3QgaW4gTVNWQ1IxMDAgKFZpc3VhbCBTdHVkaW8gMjAxMCkKKyNpZiAhZGVmaW5lZChXSU4zMikKKwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKIAotY2xhc3MgRHVtbXlFeGNlcHRpb24gOiBzdGQ6OmV4Y2VwdGlvbiB7Ci19OwotCi1pbnQgbWFpbigpIHsKLSAgewotICAgIFRGRFRyYW5zcG9ydCB0KDI1NiwgVEZEVHJhbnNwb3J0OjpOT19DTE9TRV9PTl9ERVNUUk9ZKTsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgIH0KLSAgICBzdGQ6OmFib3J0KCk7Ci0gIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIHsKLSAgfQotCi0gIHRyeSB7Ci0gICAgewotICAgICAgVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpOwotICAgICAgdGhyb3cgRHVtbXlFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgc3RkOjphYm9ydCgpOwotICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgewotICAgIGFib3J0KCk7Ci0gIH0gY2F0Y2ggKER1bW15RXhjZXB0aW9uJikgewotICB9Ci0KLSAgcmV0dXJuIDA7Ci0KK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0XzEpIHsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coVEZEVHJhbnNwb3J0IHQoMjU2LCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpKTsKIH0KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF90ZmR0cmFuc3BvcnRfMikgeworICBURkRUcmFuc3BvcnQgdCgyNTYsIFRGRFRyYW5zcG9ydDo6Q0xPU0VfT05fREVTVFJPWSk7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHQuY2xvc2UoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKKyNlbHNlCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfdGZkdHJhbnNwb3J0X2R1bW15KSB7CisgIEJPT1NUX0NIRUNLKHRydWUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggNzY5MWM3My4uZDBjMjZiMyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTIwLDkgKzIwLDggQEAKICNkZWZpbmUgX0dOVV9TT1VSQ0UgLy8gbmVlZGVkIGZvciBnZXRvcHRfbG9uZwogI2VuZGlmCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgorCiAjaWZkZWYgSEFWRV9TWVNfVElNRV9ICiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbmRpZgpAQCAtMzEsNiArMzAsMTQgQEAKIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaD4KIAorI2lmZGVmIF9fTUlOR1czMl9fCisgICNpbmNsdWRlIDxpby5oPgorICAjaW5jbHVkZSA8dW5pc3RkLmg+CisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPGZjbnRsLmg+CisgICNpbmNsdWRlIDxzeXNcc3RhdC5oPgorI2VuZGlmCisKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQyLDMwICs0OSwxNSBAQAogY2xhc3MgRnN5bmNMb2c7CiBGc3luY0xvZyogZnN5bmNfbG9nOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSGVscGVyIGNvZGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLy8gUHJvdmlkZSBCT09TVF9DSEVDS19MVCgpIGFuZCBCT09TVF9DSEVDS19HVCgpLCBpbiBjYXNlIHdlJ3JlIGNvbXBpbGVkCi0vLyB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgYm9vc3QKLSNpZm5kZWYgQk9PU1RfQ0hFQ0tfTFQKLSNkZWZpbmUgQk9PU1RfQ0hFQ0tfQ01QKGEsIGIsIG9wLCBjaGVja19mbikgXAotICBjaGVja19mbigoYSkgb3AgKGIpLCBcCi0gICAgICAgICAgICJjaGVjayAiIEJPT1NUX1NUUklOR0laRShhKSAiICIgQk9PU1RfU1RSSU5HSVpFKG9wKSAiICIgXAotICAgICAgICAgICBCT09TVF9TVFJJTkdJWkUoYikgIiBmYWlsZWQ6ICIgQk9PU1RfU1RSSU5HSVpFKGEpICI9IiA8PCAoYSkgPDwgXAotICAgICAgICAgICAiICIgQk9PU1RfU1RSSU5HSVpFKGIpICI9IiA8PCAoYikpCi0KLSNkZWZpbmUgQk9PU1RfQ0hFQ0tfTFQoYSwgYikgQk9PU1RfQ0hFQ0tfQ01QKGEsIGIsIDwsIEJPT1NUX0NIRUNLX01FU1NBR0UpCi0jZGVmaW5lIEJPT1NUX0NIRUNLX0dUKGEsIGIpIEJPT1NUX0NIRUNLX0NNUChhLCBiLCA+LCBCT09TVF9DSEVDS19NRVNTQUdFKQotI2RlZmluZSBCT09TVF9SRVFVSVJFX0xUKGEsIGIpIEJPT1NUX0NIRUNLX0NNUChhLCBiLCA8LCBCT09TVF9SRVFVSVJFX01FU1NBR0UpCi0jZW5kaWYgLy8gQk9PU1RfQ0hFQ0tfTFQKLQogLyoqCiAgKiBDbGFzcyB0byByZWNvcmQgY2FsbHMgdG8gZnN5bmMKICAqLwogY2xhc3MgRnN5bmNMb2cgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgc3RydWN0IEZzeW5jQ2FsbCB7CiAgICAgc3RydWN0IHRpbWV2YWwgdGltZTsKICAgICBpbnQgZmQ7CkBAIC03NSwxNyArNjcsMTUgQEAKICAgRnN5bmNMb2coKSB7fQogCiAgIHZvaWQgZnN5bmMoaW50IGZkKSB7Ci0gICAgKHZvaWQpIGZkOworICAgICh2b2lkKWZkOwogICAgIEZzeW5jQ2FsbCBjYWxsOwotICAgIGdldHRpbWVvZmRheSgmY2FsbC50aW1lLCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZjYWxsLnRpbWUsIE5VTEwpOwogICAgIGNhbGxzXy5wdXNoX2JhY2soY2FsbCk7CiAgIH0KIAotICBjb25zdCBDYWxsTGlzdCogZ2V0Q2FsbHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICZjYWxsc187Ci0gIH0KKyAgY29uc3QgQ2FsbExpc3QqIGdldENhbGxzKCkgY29uc3QgeyByZXR1cm4gJmNhbGxzXzsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIENhbGxMaXN0IGNhbGxzXzsKIH07CiAKQEAgLTkzLDggKzgzLDIyIEBACiAgKiBIZWxwZXIgY2xhc3MgdG8gY2xlYW4gdXAgdGVtcG9yYXJ5IGZpbGVzCiAgKi8KIGNsYXNzIFRlbXBGaWxlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlbXBGaWxlKGNvbnN0IGNoYXIqIGRpcmVjdG9yeSwgY29uc3QgY2hhciogcHJlZml4KSB7CisgICNpZmRlZiBfX01JTkdXMzJfXworICAgICgodm9pZClkaXJlY3RvcnkpOworICAgIHNpemVfdCBwYXRoX2xlbiA9IHN0cmxlbihwcmVmaXgpICsgODsKKyAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKKyAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlc1hYWFhYWCIsIHByZWZpeCk7CisgICAgaWYgKF9ta3RlbXBfcyhwYXRoXyxwYXRoX2xlbikgPT0gMCkgeworICAgICAgZmRfID0gb3BlbihwYXRoXyxPX0NSRUFUIHwgT19SRFdSIHwgT19CSU5BUlksU19JUkVBRCB8IFNfSVdSSVRFKTsKKyAgICAgIGlmIChmZF8gPCAwKSB7CisgICAgICAgIHRocm93IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKCJfbWt0ZW1wX3MoKSBmYWlsZWQiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24oIl9ta3RlbXBfcygpIGZhaWxlZCIpOworICAgIH0KKyAgI2Vsc2UKICAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4oZGlyZWN0b3J5KSArIHN0cmxlbihwcmVmaXgpICsgODsKICAgICBwYXRoXyA9IG5ldyBjaGFyW3BhdGhfbGVuXTsKICAgICBzbnByaW50ZihwYXRoXywgcGF0aF9sZW4sICIlcy8lc1hYWFhYWCIsIGRpcmVjdG9yeSwgcHJlZml4KTsKQEAgLTEwMyw2ICsxMDcsNyBAQAogICAgIGlmIChmZF8gPCAwKSB7CiAgICAgICB0aHJvdyBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbigibWtzdGVtcCgpIGZhaWxlZCIpOwogICAgIH0KKyAgI2VuZGlmCiAgIH0KIAogICB+VGVtcEZpbGUoKSB7CkBAIC0xMTAsMTMgKzExNSw5IEBACiAgICAgY2xvc2UoKTsKICAgfQogCi0gIGNvbnN0IGNoYXIqIGdldFBhdGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHBhdGhfOwotICB9CisgIGNvbnN0IGNoYXIqIGdldFBhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQogCi0gIGludCBnZXRGRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gZmRfOwotICB9CisgIGludCBnZXRGRCgpIGNvbnN0IHsgcmV0dXJuIGZkXzsgfQogCiAgIHZvaWQgdW5saW5rKCkgewogICAgIGlmIChwYXRoXykgewpAQCAtMTM1LDcgKzEzNiw3IEBACiAgICAgZmRfID0gLTE7CiAgIH0KIAotIHByaXZhdGU6Citwcml2YXRlOgogICBjaGFyKiBwYXRoXzsKICAgaW50IGZkXzsKIH07CkBAIC0xNDMsOCArMTQ0LDcgQEAKIC8vIFVzZSBvdXIgb3duIHZlcnNpb24gb2YgZnN5bmMoKSBmb3IgdGVzdGluZy4KIC8vIFRoaXMgcmV0dXJucyBpbW1lZGlhdGVseSwgc28gdGltaW5nIGluIHRlc3RfZGVzdHJ1Y3RvcigpIGlzbid0IGFmZmVjdGVkIGJ5CiAvLyB3YWl0aW5nIG9uIHRoZSBhY3R1YWwgZmlsZXN5c3RlbS4KLWV4dGVybiAiQyIKLWludCBmc3luYyhpbnQgZmQpIHsKK2V4dGVybiAiQyIgaW50IGZzeW5jKGludCBmZCkgewogICBpZiAoZnN5bmNfbG9nKSB7CiAgICAgZnN5bmNfbG9nLT5mc3luYyhmZCk7CiAgIH0KQEAgLTE1NSw3ICsxNTUsNiBAQAogICByZXR1cm4gKHQyLT50dl91c2VjIC0gdDEtPnR2X3VzZWMpICsgKHQyLT50dl9zZWMgLSB0MS0+dHZfc2VjKSAqIDEwMDAwMDA7CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBUZXN0IGNhc2VzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNzcsNyArMTc2LDcgQEAKIAogICB1bnNpZ25lZCBpbnQgbnVtX292ZXIgPSAwOwogICBmb3IgKHVuc2lnbmVkIGludCBuID0gMDsgbiA8IE5VTV9JVEVSQVRJT05TOyArK24pIHsKLSAgICBmdHJ1bmNhdGUoZi5nZXRGRCgpLCAwKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBmdHJ1bmNhdGUoZi5nZXRGRCgpLCAwKSk7CiAKICAgICBURmlsZVRyYW5zcG9ydCogdHJhbnNwb3J0ID0gbmV3IFRGaWxlVHJhbnNwb3J0KGYuZ2V0UGF0aCgpKTsKIApAQCAtMTk2LDE2ICsxOTUsMTYgQEAKICAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7CiAKLSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgTlVMTCk7CiAgICAgZGVsZXRlIHRyYW5zcG9ydDsKLSAgICBnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmZW5kLCBOVUxMKTsKIAogICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZigmc3RhcnQsICZlbmQpOwogCiAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmFpbHVyZS4KICAgICAvLyBUcmVhdCB0aGlzIGFzIGEgZmF0YWwgZmFpbHVyZSwgc28gd2UnbGwgcmV0dXJuIG5vdyBpbnN0ZWFkIG9mCiAgICAgLy8gbG9vcGluZyBvdmVyIGEgdmVyeSBzbG93IG9wZXJhdGlvbi4KLSAgICBCT09TVF9SRVFVSVJFX0xUKGRlbHRhLCA1MDAwMDApOworICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgNTAwMDAwICk7CiAKICAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDEwMG1zIG9uIG15IGRldiBib3guCiAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zCkBAIC0yMTYsMTcgKzIxNSwxNiBAQAogICB9CiAKICAgLy8gTWFrZSBzdXJlIGZld2VyIHRoYW4gMTAlIG9mIHRoZSBydW5zIHRvb2sgbG9uZ2VyIHRoYW4gMTAwMHVzCi0gIEJPT1NUX0NIRUNLKG51bV9vdmVyIDwgKE5VTV9JVEVSQVRJT05TIC8gMTApKTsKKyAgQk9PU1RfV0FSTihudW1fb3ZlciA8IChOVU1fSVRFUkFUSU9OUyAvIDEwKSk7CiB9CiAKIC8qKgogICogTWFrZSBzdXJlIHNldEZsdXNoTWF4VXMoKSBpcyBob25vcmVkLgogICovCi12b2lkIHRlc3RfZmx1c2hfbWF4X3VzX2ltcGwodWludDMyX3QgZmx1c2hfdXMsIHVpbnQzMl90IHdyaXRlX3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlc3RfdXMpIHsKK3ZvaWQgdGVzdF9mbHVzaF9tYXhfdXNfaW1wbCh1aW50MzJfdCBmbHVzaF91cywgdWludDMyX3Qgd3JpdGVfdXMsIHVpbnQzMl90IHRlc3RfdXMpIHsKICAgLy8gVEZpbGVUcmFuc3BvcnQgb25seSBjYWxscyBmc3luYygpIGlmIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiwKICAgLy8gc28gbWFrZSBzdXJlIHRoZSB3cml0ZSBpbnRlcnZhbCBpcyBzbWFsbGVyIHRoYW4gdGhlIGZsdXNoIGludGVydmFsLgotICBCT09TVF9SRVFVSVJFKHdyaXRlX3VzIDwgZmx1c2hfdXMpOworICBCT09TVF9XQVJOKHdyaXRlX3VzIDwgZmx1c2hfdXMpOwogCiAgIFRlbXBGaWxlIGYodG1wX2RpciwgInRocmlmdC5URmlsZVRyYW5zcG9ydFRlc3QuIik7CiAKQEAgLTI3OCwxNiArMjc2LDEzIEBACiAgIGNvbnN0IEZzeW5jTG9nOjpDYWxsTGlzdCogY2FsbHMgPSBsb2cuZ2V0Q2FsbHMoKTsKICAgLy8gV2UgYWRkZWQgMSBmc3luYyBjYWxsIGFib3ZlLgogICAvLyBNYWtlIHN1cmUgVEZpbGVUcmFuc3BvcnQgY2FsbGVkIGZzeW5jIGF0IGxlYXN0IG9uY2UKLSAgQk9PU1RfQ0hFQ0tfR0UoY2FsbHMtPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnN5bmNMb2c6OkNhbGxMaXN0OjpzaXplX3R5cGU+KDEpKTsKKyAgQk9PU1RfV0FSTl9HRShjYWxscy0+c2l6ZSgpLCBzdGF0aWNfY2FzdDxGc3luY0xvZzo6Q2FsbExpc3Q6OnNpemVfdHlwZT4oMSkpOwogCiAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsKiBwcmV2X3RpbWUgPSBOVUxMOwotICBmb3IgKEZzeW5jTG9nOjpDYWxsTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWxscy0+YmVnaW4oKTsKLSAgICAgICBpdCAhPSBjYWxscy0+ZW5kKCk7Ci0gICAgICAgKytpdCkgeworICBmb3IgKEZzeW5jTG9nOjpDYWxsTGlzdDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWxscy0+YmVnaW4oKTsgaXQgIT0gY2FsbHMtPmVuZCgpOyArK2l0KSB7CiAgICAgaWYgKHByZXZfdGltZSkgewogICAgICAgaW50IGRlbHRhID0gdGltZV9kaWZmKHByZXZfdGltZSwgJml0LT50aW1lKTsKLSAgICAgIEJPT1NUX0NIRUNLX0xUKGRlbHRhLCBtYXhfYWxsb3dlZF9kZWx0YSk7CisgICAgICBCT09TVF9XQVJOKCBkZWx0YSA8IG1heF9hbGxvd2VkX2RlbHRhICk7CiAgICAgfQogICAgIHByZXZfdGltZSA9ICZpdC0+dGltZTsKICAgfQpAQCAtMzIzLDEzICszMTgsMTMgQEAKICAgdHJhbnNwb3J0LndyaXRlKGJ1ZiwgMSk7CiAKICAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7Ci0gIGdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgTlVMTCk7CiAKICAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCAxMDsgKytuKSB7CiAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CiAKICAgICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gICAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgTlVMTCk7CiAKICAgICAvLyBGYWlsIGlmIGF0IGFueSBwb2ludCB3ZSd2ZSBiZWVuIHJ1bm5pbmcgZm9yIGxvbmdlciB0aGFuIGhhbGYgYSBzZWNvbmQuCiAgICAgLy8gKFdpdGggdGhlIGJ1Z2d5IGNvZGUsIFRGaWxlVHJhbnNwb3J0IHVzZWQgdG8gdGFrZSAzIHNlY29uZHMgcGVyIGZsdXNoKCkpCkBAIC0zMzcsNyArMzMyLDcgQEAKICAgICAvLyBVc2UgYSBmYXRhbCBmYWlsIHNvIHdlIGJyZWFrIG91dCBlYXJseSwgcmF0aGVyIHRoYW4gY29udGludWluZyB0byBtYWtlCiAgICAgLy8gbWFueSBtb3JlIHNsb3cgZmx1c2goKSBjYWxscy4KICAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYoJnN0YXJ0LCAmbm93KTsKLSAgICBCT09TVF9SRVFVSVJFX0xUKGRlbHRhLCAyMDAwMDAwKTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDIwMDAwMDAgKTsKICAgfQogfQogCkBAIC0zNTMsMTEgKzM0OCw4IEBACiB9CiAKIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7Ci0gICAgeyAiaGVscCIsIGZhbHNlLCBOVUxMLCAnaCcgfSwKLSAgICB7ICJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnIH0sCi0gICAgeyBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgfTsKKyAgc3RydWN0IG9wdGlvbiBsb25nX29wdHNbXQorICAgICAgPSB7eyJoZWxwIiwgZmFsc2UsIE5VTEwsICdoJ30sIHsidG1wLWRpciIsIHRydWUsIE5VTEwsICd0J30sIHtOVUxMLCAwLCBOVUxMLCAwfX07CiAKICAgd2hpbGUgKHRydWUpIHsKICAgICBvcHRvcHQgPSAxOwpAQCAtMzY3LDI4ICszNTksNDYgQEAKICAgICB9CiAKICAgICBzd2l0Y2ggKG9wdGNoYXIpIHsKLSAgICAgIGNhc2UgJ3QnOgotICAgICAgICB0bXBfZGlyID0gb3B0YXJnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2gnOgotICAgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDApOwotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAotICAgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOwotICAgICAgICBleGl0KDEpOworICAgIGNhc2UgJ3QnOgorICAgICAgdG1wX2RpciA9IG9wdGFyZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2gnOgorICAgICAgcHJpbnRfdXNhZ2Uoc3Rkb3V0LCBhcmd2WzBdKTsKKyAgICAgIGV4aXQoMCk7CisgICAgY2FzZSAnPyc6CisgICAgICBleGl0KDEpOworICAgIGRlZmF1bHQ6CisgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAorICAgICAgLy8gYnV0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRvIGhhbmRsZSBpdC4KKyAgICAgIGZwcmludGYoc3RkZXJyLCAidW5rbm93biBvcHRpb24gXCItJWNcIlxuIiwgb3B0Y2hhcik7CisgICAgICBleGl0KDEpOwogICAgIH0KICAgfQogfQogCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworc3RhdGljIGludCBteUFyZ2MgPSAwOworc3RhdGljIGNoYXIgKipteUFyZ3YgPSBOVUxMOworCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlRGaWxlVHJhbnNwb3J0VGVzdCI7CisKKyAgLy8gUGFyc2UgYXJndW1lbnRzCisgIHBhcnNlX2FyZ3MobXlBcmdjLG15QXJndik7CisgIHJldHVybiB0cnVlOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSApIHsKKyAgbXlBcmdjID0gYXJnYzsKKyAgbXlBcmd2ID0gYXJndjsKKyAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7Cit9CisjZWxzZQogYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0KLSAgICAiVEZpbGVUcmFuc3BvcnRUZXN0IjsKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJURmlsZVRyYW5zcG9ydFRlc3QiOwogCiAgIC8vIFBhcnNlIGFyZ3VtZW50cwogICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKaW5kZXggMTBiNTNmNC4uOTIwNjg3MiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCkBAIC0yMCw4OSArMjAsMTQxIEBACiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KLSNpbmNsdWRlIDxjYXNzZXJ0PgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCiAKLUJPT1NUX0FVVE9fVEVTVF9TVUlURSggVE1lbW9yeUJ1ZmZlclRlc3QgKQorQk9PU1RfQVVUT19URVNUX1NVSVRFKFRNZW1vcnlCdWZmZXJUZXN0KQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9yb3VuZHRyaXAgKSB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKLSAgICB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2woc3RyQnVmZmVyKSk7CitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3JlYWRfd3JpdGVfZ3JvdykgeworICAvLyBBZGRlZCB0byB0ZXN0IHRoZSBmaXggZm9yIFRIUklGVC0xMjQ4CisgIFRNZW1vcnlCdWZmZXIgdXV0OworICBjb25zdCBpbnQgbWF4U2l6ZSA9IDY1NTM2OworICB1aW50OF90IHZlcmlmeVttYXhTaXplXTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmOworICBidWYucmVzaXplKG1heFNpemUpOwogCi0gICAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTsKLSAgICBhLmkzMl90aGluZyA9IDEwOwotICAgIGEuaTY0X3RoaW5nID0gMzA7Ci0gICAgYS5zdHJpbmdfdGhpbmcgPSJob2xsYSBiYWNrIGEiOwotCi0gICAgYS53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKLSAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkID0gc3RyQnVmZmVyLT5nZXRCdWZmZXJBc1N0cmluZygpOwotCi0gICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBzdHJCdWZmZXIyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sMihuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcjIpKTsKLQotICAgIHN0ckJ1ZmZlcjItPnJlc2V0QnVmZmVyKCh1aW50OF90KilzZXJpYWxpemVkLmRhdGEoKSwgc2VyaWFsaXplZC5sZW5ndGgoKSk7Ci0gICAgdGhyaWZ0Ojp0ZXN0OjpYdHJ1Y3QgYTI7Ci0gICAgYTIucmVhZChiaW5hcnlQcm90Y29sMi5nZXQoKSk7Ci0KLSAgICBhc3NlcnQoYSA9PSBhMik7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXhTaXplOyArK2kpIHsKKyAgICBidWZbaV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKICAgfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSggdGVzdF9jb3B5ICkKKyAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IG1heFNpemU7IGkgKj0gMikgeworICAgIHV1dC53cml0ZSgmYnVmWzBdLCBpKTsKKyAgfQorCisgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBtYXhTaXplOyBpICo9IDIpIHsKKyAgICB1dXQucmVhZCh2ZXJpZnksIGkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIDo6bWVtY21wKHZlcmlmeSwgJmJ1ZlswXSwgaSkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfcm91bmR0cmlwKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gc3RyQnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRCaW5hcnlQcm90b2NvbD4gYmluYXJ5UHJvdGNvbChuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcikpOworCisgIHRocmlmdDo6dGVzdDo6WHRydWN0IGE7CisgIGEuaTMyX3RoaW5nID0gMTA7CisgIGEuaTY0X3RoaW5nID0gMzA7CisgIGEuc3RyaW5nX3RoaW5nID0gImhvbGxhIGJhY2sgYSI7CisKKyAgYS53cml0ZShiaW5hcnlQcm90Y29sLmdldCgpKTsKKyAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZCA9IHN0ckJ1ZmZlci0+Z2V0QnVmZmVyQXNTdHJpbmcoKTsKKworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHN0ckJ1ZmZlcjIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sMihuZXcgVEJpbmFyeVByb3RvY29sKHN0ckJ1ZmZlcjIpKTsKKworICBzdHJCdWZmZXIyLT5yZXNldEJ1ZmZlcigodWludDhfdCopc2VyaWFsaXplZC5kYXRhKCksIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJpYWxpemVkLmxlbmd0aCgpKSk7CisgIHRocmlmdDo6dGVzdDo6WHRydWN0IGEyOworICBhMi5yZWFkKGJpbmFyeVByb3Rjb2wyLmdldCgpKTsKKworICBCT09TVF9DSEVDSyhhID09IGEyKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWFkQXBwZW5kVG9TdHJpbmcpIHsKKyAgc3RyaW5nKiBzdHIxID0gbmV3IHN0cmluZygiYWJjZDEyMzQiKTsKKyAgVE1lbW9yeUJ1ZmZlciBidWYoKHVpbnQ4X3QqKXN0cjEtPmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0cjEtPmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7CisKKyAgc3RyaW5nIHN0cjMgPSAid3h5eiIsIHN0cjQgPSAiNjc4OSI7CisgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7CisgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyNCwgSU5UX01BWCk7CisKKyAgQk9PU1RfQ0hFQ0soc3RyMyA9PSAid3h5emFiY2QiKTsKKyAgQk9PU1RfQ0hFQ0soc3RyNCA9PSAiNjc4OTEyMzQiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9leGNlcHRpb25zKSB7CisgIGNoYXIgZGF0YVtdID0gImZvb1wwYmFyIjsKKworICBUTWVtb3J5QnVmZmVyIGJ1ZjEoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6Ok9CU0VSVkUpOworICBzdHJpbmcgc3RyID0gYnVmMS5nZXRCdWZmZXJBc1N0cmluZygpOworICBCT09TVF9DSEVDSyhzdHIubGVuZ3RoKCkgPT0gNyk7CisKKyAgYnVmMS5yZXNldEJ1ZmZlcigpOworCisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1ZjEud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJmb28iLCAzKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7CisKKyAgVE1lbW9yeUJ1ZmZlciBidWYyKCh1aW50OF90KilkYXRhLCA3LCBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coYnVmMi53cml0ZSgoY29uc3QgdWludDhfdCopImJhciIsIDMpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWZhdWx0X21heGltdW1fYnVmZmVyX3NpemUpCit7CisgIEJPT1NUX0NIRUNLX0VRVUFMKChzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KSgpLCBUTWVtb3J5QnVmZmVyKCkuZ2V0TWF4QnVmZmVyU2l6ZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9kZWZhdWx0X2J1ZmZlcl9zaXplKQoreworICBCT09TVF9DSEVDS19FUVVBTCgxMDI0LCBUTWVtb3J5QnVmZmVyKCkuZ2V0QnVmZmVyU2l6ZSgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lcnJvcl9zZXRfbWF4X2J1ZmZlcl9zaXplX3Rvb19zbWFsbCkKK3sKKyAgVE1lbW9yeUJ1ZmZlciBidWY7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi5zZXRNYXhCdWZmZXJTaXplKGJ1Zi5nZXRCdWZmZXJTaXplKCkgLSAxKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfbWF4aW11bV9idWZmZXJfc2l6ZSkKK3sKKyAgVE1lbW9yeUJ1ZmZlciBidWY7CisgIGJ1Zi5zZXRNYXhCdWZmZXJTaXplKDgxOTIpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzbWFsbF9idWZmKDEpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgODE5MjsgKytpKQogICB7Ci0gICAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKLSAgICB1c2luZyBzdGQ6OnN0cmluZzsKLSAgICB1c2luZyBzdGQ6OmNvdXQ7Ci0gICAgdXNpbmcgc3RkOjplbmRsOwotCi0gICAgc3RyaW5nKiBzdHIxID0gbmV3IHN0cmluZygiYWJjZDEyMzQiKTsKLSAgICBjb25zdCBjaGFyKiBkYXRhMSA9IHN0cjEtPmRhdGEoKTsKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLCBzdHIxLT5sZW5ndGgoKSwgVE1lbW9yeUJ1ZmZlcjo6Q09QWSk7Ci0gICAgZGVsZXRlIHN0cjE7Ci0gICAgc3RyaW5nKiBzdHIyID0gbmV3IHN0cmluZygicGxzcmV1c2UiKTsKLSAgICBib29sIG9ial9yZXVzZSA9IChzdHIxID09IHN0cjIpOwotICAgIGJvb2wgZGF0X3JldXNlID0gKGRhdGExID09IHN0cjItPmRhdGEoKSk7Ci0gICAgY291dCA8PCAiT2JqZWN0IHJldXNlOiAiIDw8IG9ial9yZXVzZSA8PCAiICAgRGF0YSByZXVzZTogIiA8PCBkYXRfcmV1c2UKLSAgICAgIDw8ICgob2JqX3JldXNlICYmIGRhdF9yZXVzZSkgPyAiICAgWUFZISIgOiAiIikgPDwgZW5kbDsKLSAgICBkZWxldGUgc3RyMjsKLQotICAgIHN0cmluZyBzdHIzID0gInd4eXoiLCBzdHI0ID0gIjY3ODkiOwotICAgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7Ci0gICAgYnVmLnJlYWRBcHBlbmRUb1N0cmluZyhzdHI0LCBJTlRfTUFYKTsKLQotICAgIGFzc2VydChzdHIzID09ICJ3eHl6YWJjZCIpOwotICAgIGFzc2VydChzdHI0ID09ICI2Nzg5MTIzNCIpOworICAgIGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSk7CiAgIH0KIAotQk9PU1RfQVVUT19URVNUX0NBU0UoIHRlc3RfZXhjZXB0aW9ucyApCi0gIHsKLSAgICB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotICAgIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Ci0gICAgdXNpbmcgc3RkOjpzdHJpbmc7CisgIEJPT1NUX0NIRUNLX1RIUk9XKGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQogCi0gICAgY2hhciBkYXRhW10gPSAiZm9vXDBiYXIiOworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tZW1vcnlfYnVmZmVyX3RvX2dldF9zaXplb2Zfb2JqZWN0cykKK3sKKyAgLy8gVGhpcyBpcyBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBUTWVtb3J5QnVmZmVyIHRvIGRldGVybWluZQorICAvLyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIGEgdGhyaWZ0IG9iamVjdCBpbiB0aGUgQmluYXJ5IHByb3RvY29sLgorICAvLyBTZWUgVEhSSUZULTM0ODAKIAotICAgIFRNZW1vcnlCdWZmZXIgYnVmMSgodWludDhfdCopZGF0YSwgNywgVE1lbW9yeUJ1ZmZlcjo6T0JTRVJWRSk7Ci0gICAgc3RyaW5nIHN0ciA9IGJ1ZjEuZ2V0QnVmZmVyQXNTdHJpbmcoKTsKLSAgICBhc3NlcnQoc3RyLmxlbmd0aCgpID09IDcpOwotICAgIGJ1ZjEucmVzZXRCdWZmZXIoKTsKLSAgICB0cnkgewotICAgICAgYnVmMS53cml0ZSgoY29uc3QgdWludDhfdCopImZvbyIsIDMpOwotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkge30KKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1CdWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90Y29sKG5ldyBUQmluYXJ5UHJvdG9jb2wobWVtQnVmZmVyKSk7CiAKLSAgICBUTWVtb3J5QnVmZmVyIGJ1ZjIoKHVpbnQ4X3QqKWRhdGEsIDcsIFRNZW1vcnlCdWZmZXI6OkNPUFkpOwotICAgIHRyeSB7Ci0gICAgICBidWYyLndyaXRlKChjb25zdCB1aW50OF90KikiYmFyIiwgMyk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgfQotICB9CisgIHRocmlmdDo6dGVzdDo6WHRydWN0IG9iamVjdDsKKyAgb2JqZWN0LmkzMl90aGluZyA9IDEwOworICBvYmplY3QuaTY0X3RoaW5nID0gMzA7CisgIG9iamVjdC5zdHJpbmdfdGhpbmcgPSAid2hvJ3MgeW91ciBkYWRkeT8iOworCisgIHVpbnQzMl90IHNpemUgPSBvYmplY3Qud3JpdGUoYmluYXJ5UHJvdGNvbC5nZXQoKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDQ3LCBzaXplKTsKK30KIAogQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCi0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzODBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaCIKKyNpbmNsdWRlICJ0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIgorCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisKKyNpbmNsdWRlIDxldmVudC5oPgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Okd1YXJkOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNdXRleDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU29ja2V0RmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXQ7CisKK3N0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CisgIHZvaWQgYWRkU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7IHN0cmluZ3NfLnB1c2hfYmFjayhzKTsgfQorICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+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+aW50ZXJydXB0KCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHN0cmVzc19waXBlX2FjY2VwdF9pbnRlcnJ1cHRpb24pIHsKKyAgaW50IGludGVycnVwdEl0ZXJzID0gMTA7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcnJ1cHRJdGVyczsgKytpKQorICB7CisgICAgVFBpcGVTZXJ2ZXIgcGlwZVNlcnZlcigiVFBpcGVJbnRlcnJ1cHRUZXN0Iik7CisgICAgcGlwZVNlcnZlci5saXN0ZW4oKTsKKyAgICBib29zdDo6dGhyZWFkIGFjY2VwdFRocmVhZChzdGQ6OmJpbmQoYWNjZXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOworICAgIGJvb3N0Ojp0aHJlYWQgaW50ZXJydXB0VGhyZWFkKHN0ZDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CisgICAgdHJ5CisgICAgeworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgVFBpcGUgY2xpZW50KCJUUGlwZUludGVycnVwdFRlc3QiKTsKKyAgICAgICAgY2xpZW50LnNldENvbm5UaW1lb3V0KDEpOworICAgICAgICBjbGllbnQub3BlbigpOworICAgICAgfQorICAgIH0gY2F0Y2ggKC4uLikgeyAvKmp1c3QgdGVzdGluZyBmb3IgY3Jhc2hlcyovIH0KKyAgICBpbnRlcnJ1cHRUaHJlYWQuam9pbigpOworICAgIGFjY2VwdFRocmVhZC5qb2luKCk7CisgIH0KK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAppbmRleCA3NzYyZjA1Li5mMzA5MWE0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0xNywzNyArMTcsMzcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjc3RkbGliPgotI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUUGlwZWRUcmFuc3BvcnRUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIAotaW50IG1haW4oKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHVuZGVybHlpbmcobmV3IFRNZW1vcnlCdWZmZXIpOwotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0PiB0cmFucyhuZXcgVFBpcGVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIHBpcGUpKTsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gdW5kZXJseWluZyhuZXcgVE1lbW9yeUJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBwaXBlKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CiAKICAgdWludDhfdCBidWZmZXJbNF07CiAKICAgdW5kZXJseWluZy0+d3JpdGUoKHVpbnQ4X3QqKSJhYmNkIiwgNCk7CiAgIHRyYW5zLT5yZWFkQWxsKGJ1ZmZlciwgMik7Ci0gIGFzc2VydCggc3RyaW5nKChjaGFyKilidWZmZXIsIDIpID09ICJhYiIgKTsKKyAgQk9PU1RfQ0hFQ0soc3RkOjpzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImFiIik7CiAgIHRyYW5zLT5yZWFkRW5kKCk7Ci0gIGFzc2VydCggcGlwZS0+Z2V0QnVmZmVyQXNTdHJpbmcoKSA9PSAiYWIiICk7CisgIEJPT1NUX0NIRUNLKHBpcGUtPmdldEJ1ZmZlckFzU3RyaW5nKCkgPT0gImFiIik7CiAgIHBpcGUtPnJlc2V0QnVmZmVyKCk7CiAgIHVuZGVybHlpbmctPndyaXRlKCh1aW50OF90KikiZWYiLCAyKTsKICAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKLSAgYXNzZXJ0KCBzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImNkIiApOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiY2QiKTsKICAgdHJhbnMtPnJlYWRBbGwoYnVmZmVyLCAyKTsKLSAgYXNzZXJ0KCBzdHJpbmcoKGNoYXIqKWJ1ZmZlciwgMikgPT0gImVmIiApOworICBCT09TVF9DSEVDSyhzdGQ6OnN0cmluZygoY2hhciopYnVmZmVyLCAyKSA9PSAiZWYiKTsKICAgdHJhbnMtPnJlYWRFbmQoKTsKLSAgYXNzZXJ0KCBwaXBlLT5nZXRCdWZmZXJBc1N0cmluZygpID09ICJjZGVmIiApOwotCi0gIHJldHVybiAwOwotCisgIEJPT1NUX0NIRUNLKHBpcGUtPmdldEJ1ZmZlckFzU3RyaW5nKCkgPT0gImNkZWYiKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjY4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdF9zdWl0ZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDxib29zdC9maWxlc3lzdGVtLmhwcD4KKyNpbmNsdWRlIDxib29zdC9mb3JtYXQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU1NMU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldEZhY3Rvcnk7CisKK3VzaW5nIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0KQorCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KK2Jvb3N0OjptdXRleCBnTXV0ZXg7CisKK3N0cnVjdCBHbG9iYWxGaXh0dXJlU1NMCit7CisgICAgR2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjOyArK2kpCisgICAgICB7CisgICAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJhcmd2WyUxJV0gPSBcIiUyJVwiIikgJSBpICUgbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W2ldKTsKKyAgICAgIH0KKworI2lmZGVmIF9fbGludXhfXworICAgICAgLy8gT3BlblNTTCBjYWxscyBzZW5kKCkgd2l0aG91dCBNU0dfTk9TSUdQSVBFIHNvIHdyaXRpbmcgdG8gYSBzb2NrZXQgdGhhdCBoYXMKKyAgICAgIC8vIGRpc2Nvbm5lY3RlZCBjYW4gY2F1c2UgYSBTSUdQSVBFIHNpZ25hbC4uLgorICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworI2VuZGlmCisKKyAgICAgIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOworCisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6Y3VycmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkgLyAidGVzdCIgLyAia2V5cyI7CisgICAgICBpZiAoIWJvb3N0OjpmaWxlc3lzdGVtOjpleGlzdHMoY2VydEZpbGUoInNlcnZlci5jcnQiKSkpCisgICAgICB7CisgICAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoKG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndlttYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2MgLSAxXSk7CisgICAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgICAgeworICAgICAgICAgIHRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZVNTTCgpCisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6Y2xlYW51cE9wZW5TU0woKTsKKyNpZmRlZiBfX2xpbnV4X18KKyAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyNlbmRpZgorICAgIH0KK307CisKKyNpZiAoQk9PU1RfVkVSU0lPTiA+PSAxMDU5MDApCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKTsKKyNlbHNlCitCT09TVF9HTE9CQUxfRklYVFVSRShHbG9iYWxGaXh0dXJlU1NMKQorI2VuZGlmCisKK3ZvaWQgcmVhZGVyV29ya2VyKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CisgIHVpbnQ4X3QgYnVmWzRdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHRyeSB7CisgICAgdWludDhfdCBidWZbNDAwXTsKKyAgICB0dC0+cmVhZChidWYsIDEpOworICAgIHR0LT5yZWFkKGJ1ZiwgNDAwKTsKKyAgICBCT09TVF9FUlJPUigic2hvdWxkIG5vdCBoYXZlIGdvdHRlbiBoZXJlIik7CisgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR4KSB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoVFRyYW5zcG9ydEV4Y2VwdGlvbjo6SU5URVJSVVBURUQsIHR4LmdldFR5cGUoKSk7CisgIH0KK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisKKyAgcFNlcnZlclNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoInNlcnZlci5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJzZXJ2ZXIua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5zZXJ2ZXIodHJ1ZSk7CisgIHJldHVybiBwU2VydmVyU29ja2V0RmFjdG9yeTsKK30KKworc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisKKyAgcENsaWVudFNvY2tldEZhY3RvcnkucmVzZXQobmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJjbGllbnQuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgiY2xpZW50LmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwQ2xpZW50U29ja2V0RmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2VydEZpbGUoIkNBLnBlbSIpLnN0cmluZygpLmNfc3RyKCkpOworICByZXR1cm4gcENsaWVudFNvY2tldEZhY3Rvcnk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZF93aGlsZV9oYW5kc2hha2luZykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMCkpLAorICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2stPm9wZW4oKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CisgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOworICAvLyByZWFkVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CisgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CisgIEJPT1NUX0NIRUNLX01FU1NBR0UocmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcmVhZCIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKHN0ZDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIGNsaWVudFNvY2stPndyaXRlKChjb25zdCB1aW50OF90KikiMCIsIDEpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyB3YWl0IGZvciByZWNlaXZlIHRpbWVvdXQgdG8ga2ljayBpbgorICByZWFkVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIGNsaWVudFNvY2stPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CisgIHNvY2sxLmxpc3RlbigpOworICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKwordm9pZCBwZWVrZXJXb3JrZXIoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0MDBdOworICB0cnkgeworICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCit2b2lkIHBlZWtlcldvcmtlckludGVycnVwdChzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0KSB7CisgIHVpbnQ4X3QgYnVmWzQwMF07CisgIHRyeSB7CisgICAgdHQtPnJlYWQoYnVmLCAxKTsKKyAgICB0dC0+cGVlaygpOworICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCB0eC5nZXRUeXBlKCkpOworICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VySW50ZXJydXB0LCBhY2NlcHRlZCkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBhY2NlcHRlZC0+Y2xvc2UoKTsKKyAgY2xpZW50U29jay0+Y2xvc2UoKTsKKyAgc29jazEuY2xvc2UoKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zc2xfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcGVlaykgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOworICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgorICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay0+b3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcGVla1RocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHBlZWsiKTsKKworICAvLyB3YWl0IGZvciB0aGUgcmVjZWl2ZSB0aW1lb3V0IHRvIGtpY2sgaW4KKyAgcGVla1RocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBjbGllbnRTb2NrLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2YzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCkBAIC0wLDAgKzEsNTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVFNlcnZlckludGVncmF0aW9uVGVzdAorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wdGltZS5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2ltcGxlU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlSWZGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRlc3Q6OlBhcmVudFNlcnZpY2VJZlNpbmdsZXRvbkZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3NvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5OwordXNpbmcgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kczsKKworLyoqCisgKiBwcmVTZXJ2ZSBydW5zIGFmdGVyIGxpc3RlbigpIGlzIHN1Y2Nlc3NmdWwsIHdoZW4gd2UgY2FuIGNvbm5lY3QKKyAqLworY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworLyoqCisgKiBSZXVzaW5nIGFub3RoZXIgZ2VuZXJhdGVkIHRlc3QsIGp1c3Qgc29tZXRoaW5nIHRvIHNlcnZlIHVwCisgKi8KK2NsYXNzIFBhcmVudEhhbmRsZXIgOiBwdWJsaWMgUGFyZW50U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgUGFyZW50SGFuZGxlcigpIDogZ2VuZXJhdGlvbl8oMCkge30KKworICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIHJldHVybiArK2dlbmVyYXRpb25fOworICB9CisKKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICByZXR1cm4gZ2VuZXJhdGlvbl87CisgIH0KKworICB2b2lkIGFkZFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgIEd1YXJkIGcobXV0ZXhfKTsKKyAgICBzdHJpbmdzXy5wdXNoX2JhY2socyk7CisgIH0KKworICB2b2lkIGdldFN0cmluZ3Moc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBfcmV0dXJuKSB7CisgICAgR3VhcmQgZyhtdXRleF8pOworICAgIF9yZXR1cm4gPSBzdHJpbmdzXzsKKyAgfQorCisgIHZvaWQgZ2V0RGF0YVdhaXQoc3RkOjpzdHJpbmcmIF9yZXR1cm4sIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShfcmV0dXJuKTsKKyAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGxlbmd0aCk7CisgIH0KKworICB2b2lkIG9uZXdheVdhaXQoKSB7fQorCisgIHZvaWQgZXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisKKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgeyBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKG1lc3NhZ2UpOyB9CisKK3Byb3RlY3RlZDoKKyAgTXV0ZXggbXV0ZXhfOworICBpbnQzMl90IGdlbmVyYXRpb25fOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187Cit9OworCit2b2lkIGF1dG9Tb2NrZXRDbG9zZXIoVFNvY2tldCogcFNvY2spIHsKKyAgcFNvY2stPmNsb3NlKCk7CisgIGRlbGV0ZSBwU29jazsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUgeworcHVibGljOgorICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgX3Byb2Nlc3NvckZhY3RvcnkpCisgICAgOiBwU2VydmVyKG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSkpLAorICAgICAgcEV2ZW50SGFuZGxlcihzaGFyZWRfcHRyPFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcj4obmV3IFRTZXJ2ZXJSZWFkeUV2ZW50SGFuZGxlcikpLAorICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKKyAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAorICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgeworICAgIHBTZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKyAgfQorCisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIF9wcm9jZXNzb3IpCisgICAgOiBwU2VydmVyKAorICAgICAgICAgIG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+KG5ldyBUU2VydmVyU29ja2V0KCJsb2NhbGhvc3QiLCAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkpKSksCisgICAgICBwRXZlbnRIYW5kbGVyKHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgICBiU3RyZXNzRG9uZShmYWxzZSksCisgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudCgwKSwKKyAgICBiU3RyZXNzUmVxdWVzdENvdW50KDApIHsKKyAgICBwU2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIocEV2ZW50SGFuZGxlcik7CisgIH0KKworICB2b2lkIHN0YXJ0U2VydmVyKCkgeworICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQobmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVyVHlwZTo6c2VydmUsIHBTZXJ2ZXIuZ2V0KCkpKSk7CisKKyAgICAvLyBibG9jayB1bnRpbCBsaXN0ZW4oKSBjb21wbGV0ZXMgc28gY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gY29ubmVjdAorICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlICghcEV2ZW50SGFuZGxlci0+aXNMaXN0ZW5pbmcoKSkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgaXMgbGlzdGVuaW5nIik7CisgIH0KKworICB2b2lkIGJsb2NrVW50aWxBY2NlcHRlZCh1aW50NjRfdCBudW1BY2NlcHRlZCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCoocEV2ZW50SGFuZGxlci5nZXQoKSkpOworICAgIHdoaWxlIChwRXZlbnRIYW5kbGVyLT5hY2NlcHRlZENvdW50KCkgPCBudW1BY2NlcHRlZCkgeworICAgICAgcEV2ZW50SGFuZGxlci0+d2FpdCgpOworICAgIH0KKworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCIgIHNlcnZlciBoYXMgYWNjZXB0ZWQgJTElIikgJSBudW1BY2NlcHRlZCk7CisgIH0KKworICB2b2lkIHN0b3BTZXJ2ZXIoKSB7CisgICAgaWYgKHBTZXJ2ZXJUaHJlYWQpIHsKKyAgICAgIHBTZXJ2ZXItPnN0b3AoKTsKKyAgICAgIEJPT1NUX1RFU1RfTUVTU0FHRSgiICBzZXJ2ZXIgc3RvcCBjb21wbGV0ZWQiKTsKKworICAgICAgcFNlcnZlclRocmVhZC0+am9pbigpOworICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCIgIHNlcnZlciB0aHJlYWQgam9pbmVkIik7CisgICAgICBwU2VydmVyVGhyZWFkLnJlc2V0KCk7CisgICAgfQorICB9CisKKyAgflRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlKCkgeyBzdG9wU2VydmVyKCk7IH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBiYXNlbGluZSB0ZXN0IHdoZXJlIHNvbWUgY2xpZW50cyBhcmUgb3BlbmVkIGFuZCBpc3N1ZSBhIHNpbmdsZSBvcGVyYXRpb24KKyAgICogYW5kIHRoZW4gZGlzY29ubmVjdCBhdCBkaWZmZXJlbnQgaW50ZXJ2YWxzLgorICAgKiBccGFyYW1baW5dICBudW1Ub01ha2UgIHRoZSBudW1iZXIgb2YgY29uY3VycmVudCBjbGllbnRzCisgICAqIFxwYXJhbVtpbl0gIGV4cGVjdGVkSFdNICB0aGUgaGlnaCB3YXRlciBtYXJrIHdlIGV4cGVjdCBvZiBjb25jdXJyZW5jeQorICAgKiBccGFyYW1baW5dICBwdXJwb3NlICBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0IGZvciBsb2dnaW5nIHB1cnBvc2VzCisgICAqLworICB2b2lkIGJhc2VsaW5lKGludDY0X3QgbnVtVG9NYWtlLCBpbnQ2NF90IGV4cGVjdGVkSFdNLCBjb25zdCBzdGQ6OnN0cmluZyYgcHVycG9zZSkgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJUZXN0aW5nICUxJTogJTIlIHdpdGggJTMlIGNsaWVudHMsIGV4cGVjdCAlNCUgSFdNIikKKyAgICAgICAgICAgICUgdHlwZWlkKFRTZXJ2ZXJUeXBlKS5uYW1lKCkgJSBwdXJwb3NlICUgbnVtVG9NYWtlICUgZXhwZWN0ZWRIV00pOworCisgICAgc3RhcnRTZXJ2ZXIoKTsKKworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldD4gPiBob2xkU29ja2V0czsKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisKKyAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgeworICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jayhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICAgICAgaG9sZFNvY2tldHMucHVzaF9iYWNrKHBDbGllbnRTb2NrKTsKKyAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwQ2xpZW50UHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwQ2xpZW50U29jaykpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocENsaWVudFByb3RvY29sKTsKKyAgICAgIHBDbGllbnRTb2NrLT5vcGVuKCk7CisgICAgICBjbGllbnQuaW5jcmVtZW50R2VuZXJhdGlvbigpOworICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygxMCAqIG51bVRvTWFrZSkpKSkpOworICAgIH0KKworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkSFdNLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSk7CisKKyAgICBCT09TVF9GT1JFQUNIIChzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQorICAgIGhvbGRUaHJlYWRzLmNsZWFyKCk7CisgICAgaG9sZFNvY2tldHMuY2xlYXIoKTsKKworICAgIHN0b3BTZXJ2ZXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgdG8gY2xvc2UgYSBjb25uZWN0aW9uIGFmdGVyIGEgZGVsYXkuCisgICAqIFxwYXJhbVtpbl0gIHRvQ2xvc2UgIHRoZSBjb25uZWN0aW9uIHRvIGNsb3NlCisgICAqIFxwYXJhbVtpbl0gIGFmdGVyICB0aGUgZGVsYXkgdG8gaW1wb3NlCisgICAqLworICB2b2lkIGRlbGF5Q2xvc2Uoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0b0Nsb3NlLCBib29zdDo6cG9zaXhfdGltZTo6dGltZV9kdXJhdGlvbiBhZnRlcikgeworICAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYWZ0ZXIpOworICAgIHRvQ2xvc2UtPmNsb3NlKCk7CisgIH0KKworICAvKioKKyAgICogXHJldHVybnMgIHRoZSBzZXJ2ZXIgcG9ydCBudW1iZXIKKyAgICovCisgIGludCBnZXRTZXJ2ZXJQb3J0KCkgeworICAgIFRTZXJ2ZXJTb2NrZXQqIHBTb2NrID0gZHluYW1pY19jYXN0PFRTZXJ2ZXJTb2NrZXQqPihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKS5nZXQoKSk7CisgICAgaWYgKCFwU29jaykgeyB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJob3cgY29tZT8iKTsgfQorICAgIHJldHVybiBwU29jay0+Z2V0UG9ydCgpOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgc3RyZXNzIHRlc3QgYnkgc3Bhd25pbmcgdGhyZWFkcyB0aGF0IGNvbm5lY3QsIGRvIGEgbnVtYmVyIG9mIG9wZXJhdGlvbnMKKyAgICogYW5kIGRpc2Nvbm5lY3QsIHRoZW4gYSByYW5kb20gZGVsYXksIHRoZW4gZG8gaXQgb3ZlciBhZ2Fpbi4gIFRoaXMgaXMgZG9uZSBmb3IgYSBmaXhlZAorICAgKiBwZXJpb2Qgb2YgdGltZSB0byB0ZXN0IGZvciBjb25jdXJyZW5jeSBjb3JyZWN0bmVzcy4KKyAgICogXHBhcmFtW2luXSAgbnVtVG9NYWtlICB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgY2xpZW50cworICAgKi8KKyAgdm9pZCBzdHJlc3MoaW50NjRfdCBudW1Ub01ha2UsIGNvbnN0IGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uJiBkdXJhdGlvbikgeworICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCJTdHJlc3MgdGVzdGluZyAlMSUgd2l0aCAlMiUgY2xpZW50cyBmb3IgJTMlIHNlY29uZHMiKQorICAgICAgICAlIHR5cGVpZChUU2VydmVyVHlwZSkubmFtZSgpICUgbnVtVG9NYWtlICUgZHVyYXRpb24udG90YWxfc2Vjb25kcygpKTsKKworICAgIHN0YXJ0U2VydmVyKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgbnVtVG9NYWtlOyArK2kpIHsKKyAgICAgIGhvbGRUaHJlYWRzLnB1c2hfYmFjayhzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+KAorICAgICAgICBuZXcgYm9vc3Q6OnRocmVhZChzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpzdHJlc3NvciwgdGhpcykpKSk7CisgICAgfQorCisgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChkdXJhdGlvbik7CisgICAgYlN0cmVzc0RvbmUgPSB0cnVlOworCisgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoIiAgc2VydmljZWQgJTElIGNvbm5lY3Rpb25zIChIV00gJTIlKSB0b3RhbGluZyAlMyUgcmVxdWVzdHMiKQorICAgICAgICAlIGJTdHJlc3NDb25uZWN0aW9uQ291bnQgJSBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSAlIGJTdHJlc3NSZXF1ZXN0Q291bnQpOworCisgICAgQk9PU1RfRk9SRUFDSCAoc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwVGhyZWFkLCBob2xkVGhyZWFkcykgeyBwVGhyZWFkLT5qb2luKCk7IH0KKyAgICBob2xkVGhyZWFkcy5jbGVhcigpOworCisgICAgQk9PU1RfQ0hFQ0soYlN0cmVzc1JlcXVlc3RDb3VudCA+IDApOworCisgICAgc3RvcFNlcnZlcigpOworICB9CisKKyAgLyoqCisgICAqIEhlbHBlciBtZXRob2QgdG8gc3RyZXNzIHRoZSBzeXN0ZW0KKyAgICovCisgIHZvaWQgc3RyZXNzb3IoKSB7CisgIHdoaWxlICghYlN0cmVzc0RvbmUpIHsKKyAgICAgIHNoYXJlZF9wdHI8VFNvY2tldD4gcFNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwgYXV0b1NvY2tldENsb3Nlcik7CisgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gcFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocFNvY2tldCkpOworICAgICAgUGFyZW50U2VydmljZUNsaWVudCBjbGllbnQocFByb3RvY29sKTsKKyAgICAgIHBTb2NrZXQtPm9wZW4oKTsKKyAgICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kKCkgJSAxMDAwOyArK2kpIHsKKyAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7CisgICAgICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHNoYXJlZF9wdHI8VFNlcnZlclR5cGU+IHBTZXJ2ZXI7CisgIHNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyOworICBzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBTZXJ2ZXJUaHJlYWQ7CisgIHN0ZDo6YXRvbWljPGJvb2w+IGJTdHJlc3NEb25lOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzQ29ubmVjdGlvbkNvdW50OworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiBiU3RyZXNzUmVxdWVzdENvdW50OworfTsKKwordGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgorY2xhc3MgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlCisgICAgOiBwdWJsaWMgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+IHsKK3B1YmxpYzoKKyAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlKCkKKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPihtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeT4oCisgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZUlmU2luZ2xldG9uRmFjdG9yeT4oCisgICAgICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSkge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUU2VydmVyVHlwZT4KK2NsYXNzIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlIDogcHVibGljIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPiB7CitwdWJsaWM6CisgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlKCkKKyAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPigKKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yPihtYWtlX3NoYXJlZDxQYXJlbnRIYW5kbGVyPigpKSkge30KK307CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShjb25zdHJ1Y3RvcnMpCisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3Rfc2ltcGxlX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFNpbXBsZVNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMywgMSwgImZhY3RvcnkiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF9zaW1wbGUsIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRTaW1wbGVTZXJ2ZXI+KSB7CisgIGJhc2VsaW5lKDMsIDEsICJwcm9jZXNzb3IiKTsKK30KKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRlZF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yRmFjdG9yeVRlc3RGaXh0dXJlPFRUaHJlYWRlZFNlcnZlcj4pIHsKKyAgYmFzZWxpbmUoMTAsIDEwLCAiZmFjdG9yeSIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkLCBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIGJhc2VsaW5lKDEwLCAxMCwgInByb2Nlc3NvciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX2JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikgeworICBwU2VydmVyLT5zZXRDb25jdXJyZW50Q2xpZW50TGltaXQoNCk7CisgIGJhc2VsaW5lKDEwLCA0LCAibGltaXQgYnkgc2VydmVyIGZyYW1ld29yayIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZGVkX3N0cmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkZWRTZXJ2ZXI+KSB7CisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvckZhY3RvcnlUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaG93ZXZlciBpcyBhIGJhZCB3YXkgdG8gbGltaXQgY29uY3VycmVudCBjbGllbnRzCisgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCisgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQorICAvLyB0aGF0IGNsaWVudC4KKyAgYmFzZWxpbmUoMTAsIDUsICJsaW1pdCBieSB0aHJlYWQgbWFuYWdlciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaGFzIDQgdGhyZWFkcyBhcyBhIGRlZmF1bHQKKyAgLy8gdGhyZWFkIGZhY3RvcnkgaG93ZXZlciBpcyBhIGJhZCB3YXkgdG8gbGltaXQgY29uY3VycmVudCBjbGllbnRzCisgIC8vIGFzIGFjY2VwdCgpIHdpbGwgYmUgY2FsbGVkIHRvIGdyYWIgYSA1dGggY2xpZW50IHNvY2tldCwgaW4gdGhpcyBjYXNlCisgIC8vIGFuZCB0aGVuIHRoZSB0aHJlYWQgZmFjdG9yeSB3aWxsIGJsb2NrIGFkZGluZyB0aGUgdGhyZWFkIHRvIG1hbmFnZQorICAvLyB0aGF0IGNsaWVudC4KKyAgYmFzZWxpbmUoMTAsIDUsICJsaW1pdCBieSB0aHJlYWQgbWFuYWdlciIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfYm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOworICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKKworICBiYXNlbGluZSgxMCwgNCwgInNlcnZlciBmcmFtZXdvcmsgY29ubmVjdGlvbiBsaW1pdCIpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2xfc3RyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CisgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKKyAgICAgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkpKTsKKyAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT5zdGFydCgpOworCisgIHN0cmVzcygxMCwgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHMoMykpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKKworQk9PU1RfRklYVFVSRV9URVNUX1NVSVRFKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlckludGVncmF0aW9uUHJvY2Vzc29yVGVzdEZpeHR1cmU8VFRocmVhZGVkU2VydmVyPikKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdG9wX3dpdGhfaW50ZXJydXB0YWJsZV9jbGllbnRzX2Nvbm5lY3RlZCkgeworICAvLyBUaGlzIHRlc3RzIFRIUklGVC0yNDQxIG5ldyBiZWhhdmlvcjogc3RvcHBpbmcgdGhlIHNlcnZlciBkaXNjb25uZWN0cyBjbGllbnRzCisgIEJPT1NUX1RFU1RfTUVTU0FHRSgiVGVzdGluZyBzdG9wIHdpdGggaW50ZXJydXB0YWJsZSBjbGllbnRzIik7CisKKyAgc3RhcnRTZXJ2ZXIoKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazItPm9wZW4oKTsKKworICAvLyBFbnN1cmUgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDIpOworCisgIC8vIFRoZSB0ZXN0IGZpeHR1cmUgZGVzdHJ1Y3RvciB3aWxsIGZvcmNlIHRoZSBzb2NrZXRzIHRvIGRpc2Nvbm5lY3QKKyAgLy8gUHJpb3IgdG8gVEhSSUZULTI0NDEsIHBTZXJ2ZXItPnN0b3AoKSB3b3VsZCBoYW5nIHVudGlsIGNsaWVudHMgZGlzY29ubmVjdGVkCisgIHN0b3BTZXJ2ZXIoKTsKKworICAvLyBleHRyYSBwcm9vZiB0aGUgc2VydmVyIGVuZCBkaXNjb25uZWN0ZWQgdGhlIGNsaWVudHMKKyAgdWludDhfdCBidWZbMV07CisgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHBDbGllbnRTb2NrMS0+cmVhZCgmYnVmWzBdLCAxKSk7IC8vIDAgPSBkaXNjb25uZWN0ZWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcENsaWVudFNvY2syLT5yZWFkKCZidWZbMF0sIDEpKTsgLy8gMCA9IGRpc2Nvbm5lY3RlZAorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0b3Bfd2l0aF91bmludGVycnVwdGFibGVfY2xpZW50c19jb25uZWN0ZWQpIHsKKyAgLy8gVGhpcyB0ZXN0cyBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3I6IHN0b3BwaW5nIHRoZSBzZXJ2ZXIgYmxvY2tzIHVudGlsIGNsaWVudHMKKyAgLy8gZGlzY29ubmVjdC4KKyAgICBCT09TVF9URVNUX01FU1NBR0UoIlRlc3Rpbmcgc3RvcCB3aXRoIHVuaW50ZXJydXB0YWJsZSBjbGllbnRzIik7CisKKyAgZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNlcnZlclNvY2tldD4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkpCisgICAgICAtPnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisKKyAgc3RhcnRTZXJ2ZXIoKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazEtPm9wZW4oKTsKKworICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Tb2NrZXRDbG9zZXIpOworICBwQ2xpZW50U29jazItPm9wZW4oKTsKKworICAvLyBFbnN1cmUgdGhleSBoYXZlIGJlZW4gYWNjZXB0ZWQKKyAgYmxvY2tVbnRpbEFjY2VwdGVkKDIpOworCisgIGJvb3N0Ojp0aHJlYWQgdDEoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMoMjUwKSkpOworICBib29zdDo6dGhyZWFkIHQyKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jazIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDI1MCkpKTsKKworICAvLyBPbmNlIHRoZSBjbGllbnRzIGRpc2Nvbm5lY3QgdGhlIHNlcnZlciB3aWxsIHN0b3AKKyAgc3RvcFNlcnZlcigpOworICBCT09TVF9DSEVDSyhwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50Q291bnRIV00oKSA+IDApOworICB0MS5qb2luKCk7CisgIHQyLmpvaW4oKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jb25jdXJyZW50X2NsaWVudF9saW1pdCkgeworICBzdGFydFNlcnZlcigpOworICBCT09TVF9URVNUX01FU1NBR0UoIlRlc3RpbmcgdGhlIGNvbmN1cnJlbnQgY2xpZW50IGxpbWl0Iik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoSU5UNjRfTUFYLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSk7CisgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCgyKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworICBCT09TVF9DSEVDS19FUVVBTCgyLCBwU2VydmVyLT5nZXRDb25jdXJyZW50Q2xpZW50TGltaXQoKSk7CisKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgcENsaWVudFNvY2sxLT5vcGVuKCk7CisgIGJsb2NrVW50aWxBY2NlcHRlZCgxKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOworCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2syKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKKworICAvLyBhIHRoaXJkIGNsaWVudCBjYW5ub3QgY29ubmVjdCB1bnRpbCBvbmUgb2YgdGhlIG90aGVyIHR3byBjbG9zZXMKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7CisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2szKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CisgIHBDbGllbnRTb2NrMi0+b3BlbigpOworICBibG9ja1VudGlsQWNjZXB0ZWQoMik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDIsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkpOworCisgIHN0b3BTZXJ2ZXIoKTsKKyAgQk9PU1RfQ0hFQ0socFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgPiAwKTsKKyAgdDIuam9pbigpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNvY2tldDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVFNlcnZlclNvY2tldFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfYmluZF90b19hZGRyZXNzKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworCisgIHN0ZDo6Y291dCA8PCAiQW4gZXJyb3IgbWVzc2FnZSBmcm9tIGdldGFkZHJpbmZvIG9uIHRoZSBjb25zb2xlIGlzIGV4cGVjdGVkOiIgPDwgc3RkOjplbmRsOworICBUU2VydmVyU29ja2V0IHNvY2syKCIyNTcuMjU4LjI1OS4yNjAiLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazIubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworICBzb2NrMi5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2xpc3Rlbl92YWxpZF9wb3J0KSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoLTEpOworICBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKHNvY2sxLmxpc3RlbigpLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUyk7CisKKyAgVFNlcnZlclNvY2tldCBzb2NrMig2NTUzNik7CisgIFRUUkFOU1BPUlRfQ0hFQ0tfVEhST1coc29jazIubGlzdGVuKCksIFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jbG9zZV9iZWZvcmVfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2dldF9wb3J0KSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsSG9zdCIsIDg4OCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKDg4OCwgc29jazEuZ2V0UG9ydCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzliZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTZXJ2ZXJUcmFuc3BvcnRUZXN0KQorCitjbGFzcyBUZXN0VFRyYW5zcG9ydCA6IHB1YmxpYyBUVHJhbnNwb3J0IHt9OworCitjbGFzcyBUZXN0VFNlcnZlclRyYW5zcG9ydCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYzoKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQoKSA6IHZhbGlkXyh0cnVlKSB7fQorICB2b2lkIGNsb3NlKCkge30KKyAgYm9vbCB2YWxpZF87CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgeworICAgIHJldHVybiB2YWxpZF8gPyBzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PihuZXcgVGVzdFRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICA6IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KCk7CisgIH0KK307CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcG9zaXRpdmVfYWNjZXB0KSB7CisgIFRlc3RUU2VydmVyVHJhbnNwb3J0IHV1dDsKKyAgQk9PU1RfQ0hFQ0sodXV0LmFjY2VwdCgpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9uZWdhdGl2ZV9hY2NlcHQpIHsKKyAgVGVzdFRTZXJ2ZXJUcmFuc3BvcnQgdXV0OworICB1dXQudmFsaWRfID0gZmFsc2U7CisgIEJPT1NUX0NIRUNLX1RIUk9XKHV1dC5hY2NlcHQoKSwgVFRyYW5zcG9ydEV4Y2VwdGlvbik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2MjQyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUU29ja2V0SW50ZXJydXB0VGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8Ym9vc3QvY2hyb25vL2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wb3NpeF90aW1lX2R1cmF0aW9uLmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQvdGhyZWFkLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShUU29ja2V0SW50ZXJydXB0VGVzdCkKKwordm9pZCByZWFkZXJXb3JrZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCB1aW50MzJfdCBleHBlY3RlZFJlc3VsdCkgeworICB1aW50OF90IGJ1Zls0XTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5yZWFkKGJ1ZiwgNCkpOworfQorCit2b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKKyAgdHJ5IHsKKyAgICB1aW50OF90IGJ1Zls0XTsKKyAgICB0dC0+cmVhZChidWYsIDQpOworICAgIEJPT1NUX0VSUk9SKCJzaG91bGQgbm90IGhhdmUgZ290dGVuIGhlcmUiKTsKKyAgfSBjYXRjaCAoY29uc3QgVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBCT09TVF9DSEVDS19FUVVBTChUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUlJVUFRFRCwgdHguZ2V0VHlwZSgpKTsKKyAgfQorfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKHJlYWRUaHJlYWQudHJ5X2pvaW5fZm9yKGJvb3N0OjpjaHJvbm86Om1pbGxpc2Vjb25kcygyMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIHNvY2tldCBpbnRlcnJ1cHRDaGlsZHJlbiBkaWQgbm90IGludGVycnVwdCBjaGlsZCByZWFkIik7CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfbm9uX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgeworICBUU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwKTsKKyAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKKyAgc29jazEubGlzdGVuKCk7CisgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOworICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOworICBjbGllbnRTb2NrLm9wZW4oKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIGhlcmUKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRSghcmVhZFRocmVhZC50cnlfam9pbl9mb3IoYm9vc3Q6OmNocm9ubzo6bWlsbGlzZWNvbmRzKDIwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIgc29ja2V0IGludGVycnVwdENoaWxkcmVuIGludGVycnVwdGVkIGNoaWxkIHJlYWQiKTsKKworICAvLyBvbmx5IHdheSB0byBwcm9jZWVkIGlzIHRvIGhhdmUgdGhlIGNsaWVudCBkaXNjb25uZWN0CisgIGNsaWVudFNvY2suY2xvc2UoKTsKKyAgcmVhZFRocmVhZC5qb2luKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2Nhbm5vdF9jaGFuZ2VfYWZ0ZXJfbGlzdGVuKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1coc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKSwgc3RkOjpsb2dpY19lcnJvcik7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK3ZvaWQgcGVla2VyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgYm9vbCBleHBlY3RlZFJlc3VsdCkgeworICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZFJlc3VsdCwgdHQtPnBlZWsoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfaW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7CisgIFRTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDApOworICBzb2NrMS5saXN0ZW4oKTsKKyAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CisgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CisgIGNsaWVudFNvY2sub3BlbigpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKKyAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGNoaWxkIGlzIGludGVycnVwdGVkCisgIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChzdGQ6OmJpbmQocGVla2VyV29ya2VyLCBhY2NlcHRlZCwgZmFsc2UpKTsKKyAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CisgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKKyAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKKyAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gZGlkIG5vdCBpbnRlcnJ1cHQgY2hpbGQgcGVlayIpOworICBjbGllbnRTb2NrLmNsb3NlKCk7CisgIGFjY2VwdGVkLT5jbG9zZSgpOworICBzb2NrMS5jbG9zZSgpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKKyAgVFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCk7CisgIHNvY2sxLnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCisgIHNvY2sxLmxpc3RlbigpOworICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKKyAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgY2xpZW50U29jay5vcGVuKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICAvLyBwZWVrKCkgd2lsbCByZXR1cm4gZmFsc2Ugd2hlbiByZW1vdGUgc2lkZSBpcyBjbG9zZWQKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKKyAgLy8gcGVla1RocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdworICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOworICBCT09TVF9DSEVDS19NRVNTQUdFKCFwZWVrVGhyZWFkLnRyeV9qb2luX2Zvcihib29zdDo6Y2hyb25vOjptaWxsaXNlY29uZHMoMjAwKSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlciBzb2NrZXQgaW50ZXJydXB0Q2hpbGRyZW4gaW50ZXJydXB0ZWQgY2hpbGQgcGVlayIpOworCisgIC8vIG9ubHkgd2F5IHRvIHByb2NlZWQgaXMgdG8gaGF2ZSB0aGUgY2xpZW50IGRpc2Nvbm5lY3QKKyAgY2xpZW50U29jay5jbG9zZSgpOworICBwZWVrVGhyZWFkLmpvaW4oKTsKKyAgYWNjZXB0ZWQtPmNsb3NlKCk7CisgIHNvY2sxLmNsb3NlKCk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmggYi9saWIvY3BwL3Rlc3QvVFRyYW5zcG9ydENoZWNrVGhyb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI3N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1RUcmFuc3BvcnRDaGVja1Rocm93LmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2RlZmluZSBUVFJBTlNQT1JUX0NIRUNLX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJvb2wgY2F1Z2h0ID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKF9DQUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2F1Z2h0ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEJPT1NUX0NIRUNLX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgVFRSQU5TUE9SVF9SRVFVSVJFX1RIUk9XKF9DQUxMLCBfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIGNhdWdodCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIChfQ0FMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICYgZXgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZXguZ2V0VHlwZSgpLCBfVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhdWdodCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCT09TVF9SRVFVSVJFX01FU1NBR0UoY2F1Z2h0LCAiZXhwZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgbm90aGluZyB3YXMgdGhyb3duIik7ICAgICAgICAgIFwKKyAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcCBiL2xpYi9jcHAvdGVzdC9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKaW5kZXggMzNmNjgxZi4uYWY1NjA2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RocmlmdFRlc3RfZXh0cmFzLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC0yMiwxMiArMjIsMTIgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KICNpbmNsdWRlICJnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaCIKIAotCi1uYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIGJvb2wgSW5zYW5pdHk6Om9wZXJhdG9yPCh0aHJpZnQ6OnRlc3Q6Okluc2FuaXR5IGNvbnN0JiBvdGhlcikgY29uc3QgewogICB1c2luZyBhcGFjaGU6OnRocmlmdDo6VGhyaWZ0RGVidWdTdHJpbmc7CiAgIHJldHVybiBUaHJpZnREZWJ1Z1N0cmluZygqdGhpcykgPCBUaHJpZnREZWJ1Z1N0cmluZyhvdGhlcik7CiB9Ci0KLX19Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Ub1N0cmluZ1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDRjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVG9TdHJpbmdUZXN0LmNwcApAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgorCisjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCisjaW5jbHVkZSAiZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5oIgorI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKKwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRvX3N0cmluZzsKKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFRvU3RyaW5nVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoYmFzZV90eXBlc190b19zdHJpbmcpIHsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKDEwKSwgIjEwIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyh0cnVlKSwgIjEiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKCdhJyksICJhIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygxLjIpLCAiMS4yIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZygiYWJjIiksICJhYmMiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZW1wdHlfdmVjdG9yX3RvX3N0cmluZykgeworICBzdGQ6OnZlY3RvcjxpbnQ+IGw7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhsKSwgIltdIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBsLnB1c2hfYmFjaygxMDApOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbMTAwXSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShtdWx0aXBsZV9pdGVtX3ZlY3Rvcl90b19zdHJpbmcpIHsKKyAgc3RkOjp2ZWN0b3I8aW50PiBsOworICBsLnB1c2hfYmFjaygxMDApOworICBsLnB1c2hfYmFjaygxNTApOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksICJbMTAwLCAxNTBdIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGVtcHR5X21hcF90b19zdHJpbmcpIHsKKyAgc3RkOjptYXA8aW50LCBzdGQ6OnN0cmluZz4gbTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKG0pLCAie30iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0Uoc2luZ2xlX2l0ZW1fbWFwX3RvX3N0cmluZykgeworICBzdGQ6Om1hcDxpbnQsIHN0ZDo6c3RyaW5nPiBtOworICBtWzEyXSA9ICJhYmMiOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobSksICJ7MTI6IGFiY30iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UobXVsdGlfaXRlbV9tYXBfdG9fc3RyaW5nKSB7CisgIHN0ZDo6bWFwPGludCwgc3RkOjpzdHJpbmc+IG07CisgIG1bMTJdID0gImFiYyI7CisgIG1bMzFdID0gInh5eiI7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhtKSwgInsxMjogYWJjLCAzMTogeHl6fSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShlbXB0eV9zZXRfdG9fc3RyaW5nKSB7CisgIHN0ZDo6c2V0PGNoYXI+IHM7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhzKSwgInt9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHNpbmdsZV9pdGVtX3NldF90b19zdHJpbmcpIHsKKyAgc3RkOjpzZXQ8Y2hhcj4gczsKKyAgcy5pbnNlcnQoJ2MnKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG9fc3RyaW5nKHMpLCAie2N9Iik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKG11bHRpX2l0ZW1fc2V0X3RvX3N0cmluZykgeworICBzdGQ6OnNldDxjaGFyPiBzOworICBzLmluc2VydCgnYScpOworICBzLmluc2VydCgneicpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcocyksICJ7YSwgen0iKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UoZ2VuZXJhdGVkX2VtcHR5X29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpFbXB0eVN0cnVjdCBlOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoZSksICJFbXB0eVN0cnVjdCgpIik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGdlbmVyYXRlZF9zaW5nbGVfYmFzaWNfZmllbGRfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6OlN0cnVjdEEgYTsKKyAgYS5fX3NldF9zKCJhYmNkIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlN0cnVjdEEocz1hYmNkKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfdHdvX2Jhc2ljX2ZpZWxkc19vYmplY3RfdG9fc3RyaW5nKSB7CisgIHRocmlmdDo6dGVzdDo6Qm9uayBhOworICBhLl9fc2V0X21lc3NhZ2UoImFiY2QiKTsKKyAgYS5fX3NldF90eXBlKDEyMzQpOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJCb25rKG1lc3NhZ2U9YWJjZCwgdHlwZT0xMjM0KSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfb3B0aW9uYWxfZmllbGRzX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpUcmlja3kyIGE7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlRyaWNreTIoaW1fb3B0aW9uYWw9PG51bGw+KSIpOworICBhLl9fc2V0X2ltX29wdGlvbmFsKDEyMyk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKHRvX3N0cmluZyhhKSwgIlRyaWNreTIoaW1fb3B0aW9uYWw9MTIzKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfbmVzdGVkX29iamVjdF90b19zdHJpbmcpIHsKKyAgdGhyaWZ0Ojp0ZXN0OjpPbmVGaWVsZCBhOworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcoYSksICJPbmVGaWVsZChmaWVsZD1FbXB0eVN0cnVjdCgpKSIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRShnZW5lcmF0ZWRfbmVzdGVkX2xpc3Rfb2JqZWN0X3RvX3N0cmluZykgeworICB0aHJpZnQ6OnRlc3Q6Okxpc3RCb25rcyBsOworICBsLmJvbmsuYXNzaWduKDIsIHRocmlmdDo6dGVzdDo6Qm9uaygpKTsKKyAgbC5ib25rWzBdLl9fc2V0X21lc3NhZ2UoImEiKTsKKyAgbC5ib25rWzFdLl9fc2V0X21lc3NhZ2UoImIiKTsKKworICBCT09TVF9DSEVDS19FUVVBTCh0b19zdHJpbmcobCksCisgICAgICAgICAgICAgICAgICAgICJMaXN0Qm9ua3MoYm9uaz1bQm9uayhtZXNzYWdlPWEsIHR5cGU9MCksIEJvbmsobWVzc2FnZT1iLCB0eXBlPTApXSkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggNTA4ZDNlMy4uY2UxOTU0NCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcApAQCAtMTYsMjMgKzE2LDIzIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2lmbmRlZiBfR05VX1NPVVJDRQotI2RlZmluZSBfR05VX1NPVVJDRSAvLyBuZWVkZWQgZm9yIGdldG9wdF9sb25nCi0jZW5kaWYKKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKICNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorI2luY2x1ZGUgPGZzdHJlYW0+CiAKICNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KICNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzLmhwcD4KICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvdmVyc2lvbi5ocHA+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuaD4KQEAgLTQwLDI0ICs0MCwzMCBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KIAorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9GdW5jdGlvblJ1bm5lci5oPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGUuaD4KKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCisKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogCiBzdGF0aWMgYm9vc3Q6Om10MTk5Mzcgcm5nOwotc3RhdGljIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSAiL3RtcCI7CiAKIHZvaWQgaW5pdHJhbmQodW5zaWduZWQgaW50IHNlZWQpIHsKICAgcm5nLnNlZWQoc2VlZCk7CiB9CiAKIGNsYXNzIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdmlydHVhbCB+U2l6ZUdlbmVyYXRvcigpIHt9CiAgIHZpcnR1YWwgdWludDMyX3QgbmV4dFNpemUoKSA9IDA7CiAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCA9IDA7CiB9OwogCiBjbGFzcyBDb25zdGFudFNpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgorcHVibGljOgogICBDb25zdGFudFNpemVHZW5lcmF0b3IodWludDMyX3QgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQogICB1aW50MzJfdCBuZXh0U2l6ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQogICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IHsKQEAgLTY2LDE0ICs3MiwxNCBAQAogICAgIHJldHVybiBkZXNjLnN0cigpOwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdWludDMyX3QgdmFsdWVfOwogfTsKIAogY2xhc3MgUmFuZG9tU2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFJhbmRvbVNpemVHZW5lcmF0b3IodWludDMyX3QgbWluLCB1aW50MzJfdCBtYXgpIDoKLSAgICBnZW5lcmF0b3JfKHJuZywgYm9vc3Q6OnVuaWZvcm1faW50PGludD4obWluLCBtYXgpKSB7fQorcHVibGljOgorICBSYW5kb21TaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQorICAgIDogZ2VuZXJhdG9yXyhybmcsIGJvb3N0Ojp1bmlmb3JtX2ludDxpbnQ+KG1pbiwgbWF4KSkge30KIAogICB1aW50MzJfdCBuZXh0U2l6ZSgpIHsgcmV0dXJuIGdlbmVyYXRvcl8oKTsgfQogCkBAIC04MywxMiArODksMTEgQEAKICAgICByZXR1cm4gZGVzYy5zdHIoKTsKICAgfQogCi0gIHVpbnQzMl90IGdldE1pbigpIGNvbnN0IHsgcmV0dXJuIGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWluKCk7IH0KLSAgdWludDMyX3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5tYXgoKTsgfQorICB1aW50MzJfdCBnZXRNaW4oKSBjb25zdCB7IHJldHVybiAoZ2VuZXJhdG9yXy5kaXN0cmlidXRpb24oKS5taW4pKCk7IH0KKyAgdWludDMyX3QgZ2V0TWF4KCkgY29uc3QgeyByZXR1cm4gKGdlbmVyYXRvcl8uZGlzdHJpYnV0aW9uKCkubWF4KSgpOyB9CiAKLSBwcml2YXRlOgotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3JiwgYm9vc3Q6OnVuaWZvcm1faW50PGludD4gPgotICAgIGdlbmVyYXRvcl87Citwcml2YXRlOgorICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcmLCBib29zdDo6dW5pZm9ybV9pbnQ8aW50PiA+IGdlbmVyYXRvcl87CiB9OwogCiAvKioKQEAgLTk5LDE3ICsxMDQsMTYgQEAKICAqICAgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGdlbmVyYXRvciB0byBiaW5kIGl0IHRvIHRoZSB0ZXN0IGZ1bmN0aW9uLikKICAqLwogY2xhc3MgR2VuZXJpY1NpemVHZW5lcmF0b3IgOiBwdWJsaWMgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBHZW5lcmljU2l6ZUdlbmVyYXRvcih1aW50MzJfdCB2YWx1ZSkgOgotICAgIGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9Ci0gIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KSA6Ci0gICAgZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CitwdWJsaWM6CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IHZhbHVlKSA6IGdlbmVyYXRvcl8obmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcih2YWx1ZSkpIHt9CisgIEdlbmVyaWNTaXplR2VuZXJhdG9yKHVpbnQzMl90IG1pbiwgdWludDMyX3QgbWF4KQorICAgIDogZ2VuZXJhdG9yXyhuZXcgUmFuZG9tU2l6ZUdlbmVyYXRvcihtaW4sIG1heCkpIHt9CiAKICAgdWludDMyX3QgbmV4dFNpemUoKSB7IHJldHVybiBnZW5lcmF0b3JfLT5uZXh0U2l6ZSgpOyB9CiAgIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgeyByZXR1cm4gZ2VuZXJhdG9yXy0+ZGVzY3JpYmUoKTsgfQogCi0gcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gZ2VuZXJhdG9yXzsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBnZW5lcmF0b3JfOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMjYsMzIgKzEzMCwzMSBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgfkNvdXBsZWRUcmFuc3BvcnRzKCkge30KICAgdHlwZWRlZiBUcmFuc3BvcnRfIFRyYW5zcG9ydFR5cGU7CiAKICAgQ291cGxlZFRyYW5zcG9ydHMoKSA6IGluKCksIG91dCgpIHt9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gaW47Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IG91dDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IGluOworICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gb3V0OwogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIENvdXBsZWRUcmFuc3BvcnRzKGNvbnN0IENvdXBsZWRUcmFuc3BvcnRzJik7Ci0gIENvdXBsZWRUcmFuc3BvcnRzICZvcGVyYXRvcj0oY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKKyAgQ291cGxlZFRyYW5zcG9ydHMmIG9wZXJhdG9yPShjb25zdCBDb3VwbGVkVHJhbnNwb3J0cyYpOwogfTsKIAogLyoqCiAgKiBDb3VwbGVkIFRNZW1vcnlCdWZmZXJzCiAgKi8KIGNsYXNzIENvdXBsZWRNZW1vcnlCdWZmZXJzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRNZW1vcnlCdWZmZXI+IHsKLSBwdWJsaWM6Ci0gIENvdXBsZWRNZW1vcnlCdWZmZXJzKCkgOgotICAgIGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcikgeworcHVibGljOgorICBDb3VwbGVkTWVtb3J5QnVmZmVycygpIDogYnVmKG5ldyBUTWVtb3J5QnVmZmVyKSB7CiAgICAgaW4gPSBidWY7CiAgICAgb3V0ID0gYnVmOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmOwogfTsKIAogLyoqCkBAIC0xNjAsNyArMTYzLDcgQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFdyYXBwZXJUcmFuc3BvcnRfLCBjbGFzcyBJbm5lckNvdXBsZWRUcmFuc3BvcnRzXz4KIGNsYXNzIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8V3JhcHBlclRyYW5zcG9ydF8+IHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1QoKSB7CiAgICAgaWYgKGlubmVyXy5pbikgewogICAgICAgdGhpcy0+aW4ucmVzZXQobmV3IFdyYXBwZXJUcmFuc3BvcnRfKGlubmVyXy5pbikpOwpAQCAtMTc3LDQwICsxODAsMzUgQEAKICAqIENvdXBsZWQgVEJ1ZmZlcmVkVHJhbnNwb3J0cy4KICAqLwogdGVtcGxhdGUgPGNsYXNzIElubmVyVHJhbnNwb3J0Xz4KLWNsYXNzIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHsKLX07CitjbGFzcyBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVAorICAgIDogcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEJ1ZmZlcmVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzOwordHlwZWRlZiBDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0czsKIAogLyoqCiAgKiBDb3VwbGVkIFRGcmFtZWRUcmFuc3BvcnRzLgogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgSW5uZXJUcmFuc3BvcnRfPgotY2xhc3MgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VEZyYW1lZFRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7Ci19OworY2xhc3MgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUCisgICAgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxURnJhbWVkVHJhbnNwb3J0LCBJbm5lclRyYW5zcG9ydF8+IHt9OwogCi10eXBlZGVmIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4KLSAgQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkTWVtb3J5QnVmZmVycz4gQ291cGxlZEZyYW1lZFRyYW5zcG9ydHM7CiAKIC8qKgogICogQ291cGxlZCBUWmxpYlRyYW5zcG9ydHMuCiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBJbm5lclRyYW5zcG9ydF8+Ci1jbGFzcyBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUIDoKLSAgcHVibGljIENvdXBsZWRXcmFwcGVyVHJhbnNwb3J0c1Q8VFpsaWJUcmFuc3BvcnQsIElubmVyVHJhbnNwb3J0Xz4gewotfTsKK2NsYXNzIENvdXBsZWRabGliVHJhbnNwb3J0c1QgOiBwdWJsaWMgQ291cGxlZFdyYXBwZXJUcmFuc3BvcnRzVDxUWmxpYlRyYW5zcG9ydCwgSW5uZXJUcmFuc3BvcnRfPiB7fTsKIAotdHlwZWRlZiBDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRNZW1vcnlCdWZmZXJzPgotICBDb3VwbGVkWmxpYlRyYW5zcG9ydHM7Cit0eXBlZGVmIENvdXBsZWRabGliVHJhbnNwb3J0c1Q8Q291cGxlZE1lbW9yeUJ1ZmZlcnM+IENvdXBsZWRabGliVHJhbnNwb3J0czsKIAorI2lmbmRlZiBfV0lOMzIKKy8vIEZEIHRyYW5zcG9ydCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSBvbiBXaW5kb3dzLgogLyoqCiAgKiBDb3VwbGVkIFRGRFRyYW5zcG9ydHMuCiAgKi8KIGNsYXNzIENvdXBsZWRGRFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VEZEVHJhbnNwb3J0PiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkRkRUcmFuc3BvcnRzKCkgewogICAgIGludCBwaXBlc1syXTsKIApAQCAtMjIyLDU0ICsyMjAsNzMgQEAKICAgICBvdXQucmVzZXQobmV3IFRGRFRyYW5zcG9ydChwaXBlc1sxXSwgVEZEVHJhbnNwb3J0OjpDTE9TRV9PTl9ERVNUUk9ZKSk7CiAgIH0KIH07CisjZWxzZQorLyoqCisgKiBDb3VwbGVkIHBpcGUgdHJhbnNwb3J0cworICovCitjbGFzcyBDb3VwbGVkUGlwZVRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFBpcGU+IHsKK3B1YmxpYzoKKyAgSEFORExFIGhSZWFkOworICBIQU5ETEUgaFdyaXRlOworCisgIENvdXBsZWRQaXBlVHJhbnNwb3J0cygpIHsKKyAgICBCT09TVF9SRVFVSVJFKENyZWF0ZVBpcGUoJmhSZWFkLCAmaFdyaXRlLCBOVUxMLCAxMDQ4NTc2ICogMikpOworICAgIGluLnJlc2V0KG5ldyBUUGlwZShoUmVhZCwgaFdyaXRlKSk7CisgICAgaW4tPm9wZW4oKTsKKyAgICBvdXQgPSBpbjsKKyAgfQorfTsKKyNlbmRpZgogCiAvKioKICAqIENvdXBsZWQgVFNvY2tldHMKICAqLwogY2xhc3MgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFNvY2tldD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoKSB7Ci0gICAgaW50IHNvY2tldHNbMl07Ci0gICAgaWYgKHNvY2tldHBhaXIoUEZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNvY2tldHMpICE9IDApIHsKKyAgICBUSFJJRlRfU09DS0VUIHNvY2tldHNbMl0gPSB7MH07CisgICAgaWYgKFRIUklGVF9TT0NLRVRQQUlSKFBGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzb2NrZXRzKSAhPSAwKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaW4ucmVzZXQobmV3IFRTb2NrZXQoc29ja2V0c1swXSkpOwogICAgIG91dC5yZXNldChuZXcgVFNvY2tldChzb2NrZXRzWzFdKSk7CisgICAgb3V0LT5zZXRTZW5kVGltZW91dCgxMDApOwogICB9CiB9OwogCisvLyBUaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKyNpZm5kZWYgX1dJTjMyCiAvKioKICAqIENvdXBsZWQgVEZpbGVUcmFuc3BvcnRzCiAgKi8KIGNsYXNzIENvdXBsZWRGaWxlVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxURmlsZVRyYW5zcG9ydD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZEZpbGVUcmFuc3BvcnRzKCkgeworI2lmbmRlZiBfV0lOMzIKKyAgICBjb25zdCBjaGFyKiB0bXBfZGlyID0gIi90bXAiOworI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIi90aHJpZnQudHJhbnNwb3J0X3Rlc3QiCisjZWxzZQorICAgIGNvbnN0IGNoYXIqIHRtcF9kaXIgPSBnZXRlbnYoIlRNUCIpOworI2RlZmluZSBGSUxFTkFNRV9TVUZGSVggIlxcdGhyaWZ0LnRyYW5zcG9ydF90ZXN0IgorI2VuZGlmCisKICAgICAvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgICBzaXplX3QgZmlsZW5hbWVfbGVuID0gc3RybGVuKHRtcF9kaXIpICsgMzI7Ci0gICAgZmlsZW5hbWUgPSBuZXcgY2hhcltmaWxlbmFtZV9sZW5dOwotICAgIHNucHJpbnRmKGZpbGVuYW1lLCBmaWxlbmFtZV9sZW4sCi0gICAgICAgICAgICAgIiVzL3RocmlmdC50cmFuc3BvcnRfdGVzdC5YWFhYWFgiLCB0bXBfZGlyKTsKLSAgICBmZCA9IG1rc3RlbXAoZmlsZW5hbWUpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgIHJldHVybjsKLSAgICB9CisgICAgZmlsZW5hbWUucmVzaXplKHN0cmxlbih0bXBfZGlyKSArIHN0cmxlbihGSUxFTkFNRV9TVUZGSVgpKTsKKyAgICBUSFJJRlRfU05QUklOVEYoJmZpbGVuYW1lWzBdLCBmaWxlbmFtZS5zaXplKCksICIlcyIgRklMRU5BTUVfU1VGRklYLCB0bXBfZGlyKTsKKyN1bmRlZiBGSUxFTkFNRV9TVUZGSVgKKworICAgIHsgc3RkOjpvZnN0cmVhbSBkdW1teV9jcmVhdGlvbihmaWxlbmFtZS5jX3N0cigpLCBzdGQ6Om9mc3RyZWFtOjp0cnVuYyk7IH0KIAogICAgIGluLnJlc2V0KG5ldyBURmlsZVRyYW5zcG9ydChmaWxlbmFtZSwgdHJ1ZSkpOwogICAgIG91dC5yZXNldChuZXcgVEZpbGVUcmFuc3BvcnQoZmlsZW5hbWUpKTsKICAgfQogCi0gIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7Ci0gICAgaWYgKGZkID49IDApIHsKLSAgICAgIGNsb3NlKGZkKTsKLSAgICAgIHVubGluayhmaWxlbmFtZSk7Ci0gICAgfQotICAgIGRlbGV0ZVtdIGZpbGVuYW1lOwotICB9CisgIH5Db3VwbGVkRmlsZVRyYW5zcG9ydHMoKSB7IHJlbW92ZShmaWxlbmFtZS5jX3N0cigpKTsgfQogCi0gIGNoYXIqIGZpbGVuYW1lOwotICBpbnQgZmQ7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lOwogfTsKKyNlbmRpZgogCiAvKioKICAqIFdyYXBwZXIgYXJvdW5kIGFub3RoZXIgQ291cGxlZFRyYW5zcG9ydHMgaW1wbGVtZW50YXRpb24gdGhhdCBleHBvc2VzIHRoZQpAQCAtMjgxLDcgKzI5OCw3IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0c18+CiBjbGFzcyBDb3VwbGVkVFRyYW5zcG9ydHMgOiBwdWJsaWMgQ291cGxlZFRyYW5zcG9ydHM8VFRyYW5zcG9ydD4gewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ291cGxlZFRUcmFuc3BvcnRzKCkgOiB0cmFuc3BvcnRzKCkgewogICAgIGluID0gdHJhbnNwb3J0cy5pbjsKICAgICBvdXQgPSB0cmFuc3BvcnRzLm91dDsKQEAgLTI5OSw3ICszMTYsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgQ291cGxlZFRyYW5zcG9ydHNfPgogY2xhc3MgQ291cGxlZEJ1ZmZlckJhc2VzIDogcHVibGljIENvdXBsZWRUcmFuc3BvcnRzPFRCdWZmZXJCYXNlPiB7Ci0gcHVibGljOgorcHVibGljOgogICBDb3VwbGVkQnVmZmVyQmFzZXMoKSA6IHRyYW5zcG9ydHMoKSB7CiAgICAgaW4gPSB0cmFuc3BvcnRzLmluOwogICAgIG91dCA9IHRyYW5zcG9ydHMub3V0OwpAQCAtMzIzLDQ0ICszNDAsNDIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IFRyaWdnZXJJbmZvIHsKLSAgVHJpZ2dlckluZm8oaW50IHNlY29uZHMsIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlTGVuZ3RoKSA6Ci0gICAgdGltZW91dFNlY29uZHMoc2Vjb25kcyksCi0gICAgdHJhbnNwb3J0KHRyYW5zcG9ydCksCi0gICAgd3JpdGVMZW5ndGgod3JpdGVMZW5ndGgpLAotICAgIG5leHQoTlVMTCkge30KKyAgVHJpZ2dlckluZm8oaW50IHNlY29uZHMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LCB1aW50MzJfdCB3cml0ZUxlbmd0aCkKKyAgICA6IHRpbWVvdXRTZWNvbmRzKHNlY29uZHMpLCB0cmFuc3BvcnQodHJhbnNwb3J0KSwgd3JpdGVMZW5ndGgod3JpdGVMZW5ndGgpLCBuZXh0KE5VTEwpIHt9CiAKICAgaW50IHRpbWVvdXRTZWNvbmRzOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiAgIHVpbnQzMl90IHdyaXRlTGVuZ3RoOwogICBUcmlnZ2VySW5mbyogbmV4dDsKIH07CiAKLVRyaWdnZXJJbmZvKiB0cmlnZ2VySW5mbzsKLXVuc2lnbmVkIGludCBudW1UcmlnZ2Vyc0ZpcmVkOworYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdfYWxhcm1fbW9uaXRvcjsKK1RyaWdnZXJJbmZvKiBnX3RyaWdnZXJJbmZvOwordW5zaWduZWQgaW50IGdfbnVtVHJpZ2dlcnNGaXJlZDsKK2Jvb2wgZ190ZWFyZG93biA9IGZhbHNlOwogCi12b2lkIHNldF9hbGFybSgpOwordm9pZCBhbGFybV9oYW5kbGVyKCkgeworICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CisgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgLy8gVGhlIGFsYXJtIHRpbWVkIG91dCwgd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyB3ZSdyZSBzdHVjaworICAgIC8vIG9uIGEgdHJhbnNwb3J0IHRoYXQgaXMgaW5jb3JyZWN0bHkgYmxvY2tlZC4KKyAgICArK2dfbnVtVHJpZ2dlcnNGaXJlZDsKIAotdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWdudW0pIHsKLSAgKHZvaWQpIHNpZ251bTsKLSAgLy8gVGhlIGFsYXJtIHRpbWVkIG91dCwgd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyB3ZSdyZSBzdHVjawotICAvLyBvbiBhIHRyYW5zcG9ydCB0aGF0IGlzIGluY29ycmVjdGx5IGJsb2NrZWQuCi0gICsrbnVtVHJpZ2dlcnNGaXJlZDsKKyAgICAvLyBOb3RlOiB3ZSBwcmludCBtZXNzYWdlcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIsIHNpbmNlCisgICAgLy8gdG9vbHMvdGVzdC9ydW5uZXIgb25seSByZWNvcmRzIHN0ZG91dCBtZXNzYWdlcyBpbiB0aGUgZmFpbHVyZSBtZXNzYWdlcyBmb3IKKyAgICAvLyBib29zdCB0ZXN0cy4gIChib29zdCBwcmludHMgaXRzIHRlc3QgaW5mbyB0byBzdGRvdXQuKQorICAgIHByaW50ZigiVGltZW91dCBhbGFybSBleHBpcmVkOyBhdHRlbXB0aW5nIHRvIHVuYmxvY2sgdHJhbnNwb3J0XG4iKTsKKyAgICBpZiAoZ190cmlnZ2VySW5mbyA9PSBOVUxMKSB7CisgICAgICBwcmludGYoIiAgdHJpZ2dlciBzdGFjayBpcyBlbXB0eSFcbiIpOworICAgIH0KIAotICAvLyBOb3RlOiB3ZSBwcmludCBtZXNzYWdlcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIsIHNpbmNlCi0gIC8vIHRvb2xzL3Rlc3QvcnVubmVyIG9ubHkgcmVjb3JkcyBzdGRvdXQgbWVzc2FnZXMgaW4gdGhlIGZhaWx1cmUgbWVzc2FnZXMgZm9yCi0gIC8vIGJvb3N0IHRlc3RzLiAgKGJvb3N0IHByaW50cyBpdHMgdGVzdCBpbmZvIHRvIHN0ZG91dC4pCi0gIHByaW50ZigiVGltZW91dCBhbGFybSBleHBpcmVkOyBhdHRlbXB0aW5nIHRvIHVuYmxvY2sgdHJhbnNwb3J0XG4iKTsKLSAgaWYgKHRyaWdnZXJJbmZvID09IE5VTEwpIHsKLSAgICBwcmludGYoIiAgdHJpZ2dlciBzdGFjayBpcyBlbXB0eSFcbiIpOworICAgIC8vIFBvcCBvZmYgdGhlIGZpcnN0IFRyaWdnZXJJbmZvLgorICAgIC8vIElmIHRoZXJlIGlzIGFub3RoZXIgb25lLCBzY2hlZHVsZSBhbiBhbGFybSBmb3IgaXQuCisgICAgaW5mbyA9IGdfdHJpZ2dlckluZm87CisgICAgZ190cmlnZ2VySW5mbyA9IGluZm8tPm5leHQ7CiAgIH0KIAotICAvLyBQb3Agb2ZmIHRoZSBmaXJzdCBUcmlnZ2VySW5mby4KLSAgLy8gSWYgdGhlcmUgaXMgYW5vdGhlciBvbmUsIHNjaGVkdWxlIGFuIGFsYXJtIGZvciBpdC4KLSAgVHJpZ2dlckluZm8qIGluZm8gPSB0cmlnZ2VySW5mbzsKLSAgdHJpZ2dlckluZm8gPSBpbmZvLT5uZXh0OwotICBzZXRfYWxhcm0oKTsKLQogICAvLyBXcml0ZSBzb21lIGRhdGEgdG8gdGhlIHRyYW5zcG9ydCB0byBob3BlZnVsbHkgdW5ibG9jayBpdC4KICAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbaW5mby0+d3JpdGVMZW5ndGhdOwogICBtZW1zZXQoYnVmLCAnYicsIGluZm8tPndyaXRlTGVuZ3RoKTsKQEAgLTM3MSwyMSArMzg2LDI4IEBACiAgIGRlbGV0ZSBpbmZvOwogfQogCi12b2lkIHNldF9hbGFybSgpIHsKLSAgaWYgKHRyaWdnZXJJbmZvID09IE5VTEwpIHsKLSAgICAvLyBjbGVhciBhbnkgYWxhcm0KLSAgICBhbGFybSgwKTsKLSAgICByZXR1cm47Cit2b2lkIGFsYXJtX2hhbmRsZXJfd3JhcHBlcigpIHsKKyAgaW50NjRfdCB0aW1lb3V0ID0gMDsgLy8gdGltZW91dCBvZiAwIG1lYW5zIHdhaXQgZm9yZXZlcgorICB3aGlsZSAodHJ1ZSkgeworICAgIGJvb2wgZmlyZUhhbmRsZXIgPSBmYWxzZTsKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgICBpZiAoZ190ZWFyZG93bikKKyAgICAgICAgcmV0dXJuOworICAgICAgLy8gY2FsY3VsYXRlIHRpbWVvdXQKKyAgICAgIGlmIChnX3RyaWdnZXJJbmZvID09IE5VTEwpIHsKKyAgICAgICAgdGltZW91dCA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aW1lb3V0ID0gZ190cmlnZ2VySW5mby0+dGltZW91dFNlY29uZHMgKiAxMDAwOworICAgICAgfQorCisgICAgICBpbnQgd2FpdFJlc3VsdCA9IGdfYWxhcm1fbW9uaXRvci53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXQpOworICAgICAgaWYgKHdhaXRSZXN1bHQgPT0gVEhSSUZUX0VUSU1FRE9VVCkKKyAgICAgICAgZmlyZUhhbmRsZXIgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZmlyZUhhbmRsZXIpCisgICAgICBhbGFybV9oYW5kbGVyKCk7IC8vIGNhbGxpbmcgb3V0c2lkZSB0aGUgbG9jawogICB9Ci0KLSAgc3RydWN0IHNpZ2FjdGlvbiBhY3Rpb247Ci0gIG1lbXNldCgmYWN0aW9uLCAwLCBzaXplb2YoYWN0aW9uKSk7Ci0gIGFjdGlvbi5zYV9oYW5kbGVyID0gYWxhcm1faGFuZGxlcjsKLSAgYWN0aW9uLnNhX2ZsYWdzID0gU0FfUkVTRVRIQU5EOwotICBzaWdlbXB0eXNldCgmYWN0aW9uLnNhX21hc2spOwotICBzaWdhY3Rpb24oU0lHQUxSTSwgJmFjdGlvbiwgTlVMTCk7Ci0KLSAgYWxhcm0odHJpZ2dlckluZm8tPnRpbWVvdXRTZWNvbmRzKTsKIH0KIAogLyoqCkBAIC0zOTcsMzEgKzQxOSwzNyBAQAogICogdG8gdGhlIGVuZC4pCiAgKi8KIHZvaWQgYWRkX3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+ICZ0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKICAgVHJpZ2dlckluZm8qIGluZm8gPSBuZXcgVHJpZ2dlckluZm8oc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOwotCi0gIGlmICh0cmlnZ2VySW5mbyA9PSBOVUxMKSB7Ci0gICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdHJpZ2dlci4KLSAgICAvLyBTZXQgdHJpZ2dlckluZm8sIGFuZCBzY2hlZHVsZSB0aGUgYWxhcm0KLSAgICB0cmlnZ2VySW5mbyA9IGluZm87Ci0gICAgc2V0X2FsYXJtKCk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gQWRkIHRoaXMgdHJpZ2dlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0gICAgVHJpZ2dlckluZm8qIHByZXYgPSB0cmlnZ2VySW5mbzsKLSAgICB3aGlsZSAocHJldi0+bmV4dCkgewotICAgICAgcHJldiA9IHByZXYtPm5leHQ7CisgIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKGdfYWxhcm1fbW9uaXRvcik7CisgICAgaWYgKGdfdHJpZ2dlckluZm8gPT0gTlVMTCkgeworICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdHJpZ2dlci4KKyAgICAgIC8vIFNldCBnX3RyaWdnZXJJbmZvLCBhbmQgc2NoZWR1bGUgdGhlIGFsYXJtCisgICAgICBnX3RyaWdnZXJJbmZvID0gaW5mbzsKKyAgICAgIGdfYWxhcm1fbW9uaXRvci5ub3RpZnkoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWRkIHRoaXMgdHJpZ2dlciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICBUcmlnZ2VySW5mbyogcHJldiA9IGdfdHJpZ2dlckluZm87CisgICAgICB3aGlsZSAocHJldi0+bmV4dCkgeworICAgICAgICBwcmV2ID0gcHJldi0+bmV4dDsKKyAgICAgIH0KKyAgICAgIHByZXYtPm5leHQgPSBpbmZvOwogICAgIH0KLQotICAgIHByZXYtPm5leHQgPSBpbmZvOwogICB9CiB9CiAKIHZvaWQgY2xlYXJfdHJpZ2dlcnMoKSB7Ci0gIFRyaWdnZXJJbmZvICppbmZvID0gdHJpZ2dlckluZm87Ci0gIGFsYXJtKDApOwotICB0cmlnZ2VySW5mbyA9IE5VTEw7Ci0gIG51bVRyaWdnZXJzRmlyZWQgPSAwOworICBUcmlnZ2VySW5mbyogaW5mbyA9IE5VTEw7CisKKyAgeworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3luY2hyb25pemVkIHMoZ19hbGFybV9tb25pdG9yKTsKKyAgICBpbmZvID0gZ190cmlnZ2VySW5mbzsKKyAgICBnX3RyaWdnZXJJbmZvID0gTlVMTDsKKyAgICBnX251bVRyaWdnZXJzRmlyZWQgPSAwOworICAgIGdfYWxhcm1fbW9uaXRvci5ub3RpZnkoKTsKKyAgfQogCiAgIHdoaWxlIChpbmZvICE9IE5VTEwpIHsKICAgICBUcmlnZ2VySW5mbyogbmV4dCA9IGluZm8tPm5leHQ7CkBAIC00MzEsNyArNDU5LDcgQEAKIH0KIAogdm9pZCBzZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gJnRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2xlbikgewogICBjbGVhcl90cmlnZ2VycygpOwogICBhZGRfdHJpZ2dlcihzZWNvbmRzLCB0cmFuc3BvcnQsIHdyaXRlX2xlbik7CkBAIC00NzUsMTAgKzUwMyw4IEBACiAgIEJPT1NUX1JFUVVJUkUodHJhbnNwb3J0cy5pbiAhPSBOVUxMKTsKICAgQk9PU1RfUkVRVUlSRSh0cmFuc3BvcnRzLm91dCAhPSBOVUxMKTsKIAotICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IHdidWYgPQotICAgIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4obmV3IHVpbnQ4X3RbdG90YWxTaXplXSk7Ci0gIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gcmJ1ZiA9Ci0gICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiB3YnVmID0gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKKyAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiByYnVmID0gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihuZXcgdWludDhfdFt0b3RhbFNpemVdKTsKIAogICAvLyBzdG9yZSBzb21lIGRhdGEgaW4gd2J1ZgogICBmb3IgKHVpbnQzMl90IG4gPSAwOyBuIDwgdG90YWxTaXplOyArK24pIHsKQEAgLTQ5OCw4ICs1MjQsNyBAQAogCiAgICAgLy8gTWFrZSBzdXJlICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkgKyB3Y2h1bmtfc2l6ZQogICAgIC8vIGlzIGxlc3MgdGhhbiBtYXhPdXRzdGFuZGluZwotICAgIGlmIChtYXhPdXRzdGFuZGluZyA+IDAgJiYKLSAgICAgICAgd2NodW5rX3NpemUgPiBtYXhPdXRzdGFuZGluZyAtICh0b3RhbF93cml0dGVuIC0gdG90YWxfcmVhZCkpIHsKKyAgICBpZiAobWF4T3V0c3RhbmRpbmcgPiAwICYmIHdjaHVua19zaXplID4gbWF4T3V0c3RhbmRpbmcgLSAodG90YWxfd3JpdHRlbiAtIHRvdGFsX3JlYWQpKSB7CiAgICAgICB3Y2h1bmtfc2l6ZSA9IG1heE91dHN0YW5kaW5nIC0gKHRvdGFsX3dyaXR0ZW4gLSB0b3RhbF9yZWFkKTsKICAgICB9CiAKQEAgLTUxMSw3ICs1MzYsMTMgQEAKICAgICAgICAgd3JpdGVfc2l6ZSA9IHdjaHVua19zaXplIC0gY2h1bmtfd3JpdHRlbjsKICAgICAgIH0KIAotICAgICAgdHJhbnNwb3J0cy5vdXQtPndyaXRlKHdidWYuZ2V0KCkgKyB0b3RhbF93cml0dGVuLCB3cml0ZV9zaXplKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHRyYW5zcG9ydHMub3V0LT53cml0ZSh3YnVmLmdldCgpICsgdG90YWxfd3JpdHRlbiwgd3JpdGVfc2l6ZSk7CisgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgeworICAgICAgICBpZiAodGUuZ2V0VHlwZSgpID09IFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgdGhyb3cgdGU7CisgICAgICB9CiAgICAgICBjaHVua193cml0dGVuICs9IHdyaXRlX3NpemU7CiAgICAgICB0b3RhbF93cml0dGVuICs9IHdyaXRlX3NpemU7CiAgICAgfQpAQCAtNTQxLDE3ICs1NzIsMTUgQEAKICAgICAgIHRyeSB7CiAgICAgICAgIGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJidWYuZ2V0KCkgKyB0b3RhbF9yZWFkLCByZWFkX3NpemUpOwogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgZSkgewotICAgICAgICBCT09TVF9GQUlMKCJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PAotICAgICAgICAgICAgICAgICAgICIpIHRocmV3IGV4Y2VwdGlvbiBcIiIgPDwgZS53aGF0KCkgPDwKLSAgICAgICAgICAgICAgICAgICAiXCI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIgPDwKLSAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgPDwgIiBieXRlcyIpOworICAgICAgICBCT09TVF9GQUlMKCJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PCAiKSB0aHJldyBleGNlcHRpb24gXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZS53aGF0KCkgPDwgIlwiOyB3cml0dGVuIHNvIGZhcjogIiA8PCB0b3RhbF93cml0dGVuIDw8ICIgLyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG90YWxTaXplIDw8ICIgYnl0ZXMiKTsKICAgICAgIH0KIAogICAgICAgQk9PU1RfUkVRVUlSRV9NRVNTQUdFKGJ5dGVzX3JlYWQgPiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zaXplIDw8ICIpIHJldHVybmVkICIgPDwgYnl0ZXNfcmVhZCA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7IHdyaXR0ZW4gc28gZmFyOiAiIDw8IHRvdGFsX3dyaXR0ZW4gPDwgIiAvICIgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUgPDwgIiBieXRlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkKHBvcz0iIDw8IHRvdGFsX3JlYWQgPDwgIiwgc2l6ZT0iIDw8IHJlYWRfc2l6ZSA8PCAiKSByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnl0ZXNfcmVhZCA8PCAiOyB3cml0dGVuIHNvIGZhcjogIiA8PCB0b3RhbF93cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAvICIgPDwgdG90YWxTaXplIDw8ICIgYnl0ZXMiKTsKICAgICAgIGNodW5rX3JlYWQgKz0gYnl0ZXNfcmVhZDsKICAgICAgIHRvdGFsX3JlYWQgKz0gYnl0ZXNfcmVhZDsKICAgICB9CkBAIC01NjEsNyArNTkwLDYgQEAKICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKHJidWYuZ2V0KCksIHdidWYuZ2V0KCksIHRvdGFsU2l6ZSksIDApOwogfQogCi0KIHRlbXBsYXRlIDxjbGFzcyBDb3VwbGVkVHJhbnNwb3J0cz4KIHZvaWQgdGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlKCkgewogICBDb3VwbGVkVHJhbnNwb3J0cyB0cmFuc3BvcnRzOwpAQCAtNTc4LDggKzYwNiw4IEBACiAgIHRyYW5zcG9ydHMub3V0LT5mbHVzaCgpOwogICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CiAgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPSB0cmFuc3BvcnRzLmluLT5yZWFkKHJlYWRfYnVmLCAxMCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOwotICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpIDkpOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCk5KTsKIAogICBjbGVhcl90cmlnZ2VycygpOwogfQpAQCAtNjAwLDEzICs2MjgsMTMgQEAKIAogICAvLyBSZWFkIDEgYnl0ZSwgdG8gZm9yY2UgdGhlIHRyYW5zcG9ydCB0byByZWFkIHRoZSBmcmFtZQogICB1aW50MzJfdCBieXRlc19yZWFkID0gdHJhbnNwb3J0cy5pbi0+cmVhZChyZWFkX2J1ZiwgMSk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsIDEpOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAxdSk7CiAKICAgLy8gUmVhZCBtb3JlIHRoYW4gd2hhdCBpcyByZW1haW5pbmcgYW5kIHZlcmlmeSB0aGUgdHJhbnNwb3J0IGRvZXMgbm90IGJsb2NrCiAgIHNldF90cmlnZ2VyKDMsIHRyYW5zcG9ydHMub3V0LCAxKTsKICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobnVtVHJpZ2dlcnNGaXJlZCwgMCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsIDkpOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsIDB1KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoYnl0ZXNfcmVhZCwgOXUpOwogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CiB9CkBAIC02NDUsNyArNjczLDcgQEAKIAogICAvLyBOb3cgcmVhZCA0IGJ5dGVzLCBzbyB0aGF0IHdlIGFyZSBwYXJ0d2F5IHRocm91Z2ggdGhlIHdyaXR0ZW4gZGF0YS4KICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDQpOwotICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpIDQpOworICBCT09TVF9DSEVDS19FUVVBTChieXRlc19yZWFkLCAodWludDMyX3QpNCk7CiAKICAgLy8gTm93IGF0dGVtcHQgdG8gcmVhZCAxMCBieXRlcy4gIE9ubHkgOSBtb3JlIGFyZSBhdmFpbGFibGUuCiAgIC8vCkBAIC02NTgsMTMgKzY4NiwxMyBAQAogICB3aGlsZSAodG90YWxfcmVhZCA8IDkpIHsKICAgICBzZXRfdHJpZ2dlcigzLCB0cmFuc3BvcnRzLm91dCwgMSk7CiAgICAgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKLSAgICBCT09TVF9SRVFVSVJFX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOwotICAgIEJPT1NUX1JFUVVJUkVfR1QoYnl0ZXNfcmVhZCwgKHVpbnQzMl90KSAwKTsKKyAgICBCT09TVF9SRVFVSVJFX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKKyAgICBCT09TVF9SRVFVSVJFX0dUKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkwKTsKICAgICB0b3RhbF9yZWFkICs9IGJ5dGVzX3JlYWQ7Ci0gICAgQk9PU1RfUkVRVUlSRV9MRSh0b3RhbF9yZWFkLCAodWludDMyX3QpIDkpOworICAgIEJPT1NUX1JFUVVJUkVfTEUodG90YWxfcmVhZCwgKHVpbnQzMl90KTkpOwogICB9CiAKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwodG90YWxfcmVhZCwgKHVpbnQzMl90KSA5KTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwodG90YWxfcmVhZCwgKHVpbnQzMl90KTkpOwogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CiB9CkBAIC02ODYsNyArNzE0LDcgQEAKICAgc2V0X3RyaWdnZXIoMywgdHJhbnNwb3J0cy5vdXQsIDEpOwogICB1aW50MzJfdCBib3Jyb3dfbGVuID0gMTA7CiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd2VkX2J1ZiA9IHRyYW5zcG9ydHMuaW4tPmJvcnJvdyhyZWFkX2J1ZiwgJmJvcnJvd19sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChudW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KSAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTApOwogICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKQEAgLTcxMiwxMSArNzQwLDExIEBACiAgIGFkZF90cmlnZ2VyKDEsIHRyYW5zcG9ydHMub3V0LCA4KTsKICAgdWludDMyX3QgYnl0ZXNfcmVhZCA9IHRyYW5zcG9ydHMuaW4tPnJlYWQocmVhZF9idWYsIDEwKTsKICAgaWYgKGJ5dGVzX3JlYWQgPT0gMCkgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfbnVtVHJpZ2dlcnNGaXJlZCwgKHVuc2lnbmVkIGludCkwKTsKICAgICBjbGVhcl90cmlnZ2VycygpOwogICB9IGVsc2UgewotICAgIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDEpOwotICAgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkgMik7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZ19udW1UcmlnZ2Vyc0ZpcmVkLCAodW5zaWduZWQgaW50KTEpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGJ5dGVzX3JlYWQsICh1aW50MzJfdCkyKTsKICAgfQogCiAgIGNsZWFyX3RyaWdnZXJzKCk7CkBAIC03MzYsNyArNzY0LDcgQEAKICAgdWludDMyX3QgYm9ycm93X2xlbiA9IDEwOwogICBjb25zdCB1aW50OF90KiBib3Jyb3dlZF9idWYgPSB0cmFuc3BvcnRzLmluLT5ib3Jyb3coTlVMTCwgJmJvcnJvd19sZW4pOwogICBCT09TVF9DSEVDSyhib3Jyb3dlZF9idWYgPT0gTlVMTCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKG51bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpIDApOworICBCT09TVF9DSEVDS19FUVVBTChnX251bVRyaWdnZXJzRmlyZWQsICh1bnNpZ25lZCBpbnQpMCk7CiAKICAgY2xlYXJfdHJpZ2dlcnMoKTsKIH0KQEAgLTc1MSw1MyArNzc5LDQ2IEBACiAgKiAtIENvbWJpbmluZyBtYW55IHRlc3RzIGludG8gYSBzaW5nbGUgZnVuY3Rpb24gbWFrZXMgaXQgbW9yZSBkaWZmaWN1bHQgdG8KICAqICAgdGVsbCBwcmVjaXNlbHkgd2hpY2ggdGVzdHMgZmFpbGVkLiAgSXQgYWxzbyBtZWFucyB5b3UgY2FuJ3QgZ2V0IGEgcHJvZ3Jlc3MKICAqICAgdXBkYXRlIGFmdGVyIGVhY2ggdGVzdCwgYW5kIHRoZSB0ZXN0cyBhcmUgYWxyZWFkeSBmYWlybHkgc2xvdy4KLSAqIC0gU2ltaWxhciByZWdpc3RyYXRpb24gY291bGQgYmUgYWNoZWl2ZWQgd2l0aCBCT09TVF9URVNUX0NBU0VfVEVNUExBVEUsCisgKiAtIFNpbWlsYXIgcmVnaXN0cmF0aW9uIGNvdWxkIGJlIGFjaGlldmVkIHdpdGggQk9PU1RfVEVTVF9DQVNFX1RFTVBMQVRFLAogICogICBidXQgaXQgcmVxdWlyZXMgYSBsb3Qgb2YgYXdrd2FyZCBNUEwgY29kZSwgYW5kIHJlc3VsdHMgaW4gdXNlbGVzcyB0ZXN0CiAgKiAgIGNhc2UgbmFtZXMuICAoVGhlIG5hbWVzIGFyZSBnZW5lcmF0ZWQgZnJvbSBzdGQ6OnR5cGVfaW5mbzo6bmFtZSgpLCB3aGljaAogICogICBpcyBjb21waWxlci1kZXBlbmRlbnQuICBnY2MgcmV0dXJucyBtYW5nbGVkIG5hbWVzLikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBBRERfVEVTVF9SVyhDb3VwbGVkVHJhbnNwb3J0cywgdG90YWxTaXplLCAuLi4pIFwKLSAgICBhZGRUZXN0Ulc8IENvdXBsZWRUcmFuc3BvcnRzID4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsKKyNkZWZpbmUgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWRkVGVzdFJXPENvdXBsZWRUcmFuc3BvcnRzPihCT09TVF9TVFJJTkdJWkUoQ291cGxlZFRyYW5zcG9ydHMpLCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOwogCi0jZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSBcCi0gIGRvIHsgXAotICAgIC8qIEFkZCB0aGUgdGVzdCBhcyBzcGVjaWZpZWQsIHRvIHRlc3QgdGhlIG5vbi12aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkVHJhbnNwb3J0cywgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBcCi0gICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCBcCi0gICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyBcCi0gICAgICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+LCBcCi0gICAgICAgICAgICAgICAgdG90YWxTaXplLCAjIyBfX1ZBX0FSR1NfXyk7IFwKLSAgICAvKiBUZXN0IHdyYXBwaW5nIHRoZSB0cmFuc3BvcnQgd2l0aCBUQnVmZmVyZWRUcmFuc3BvcnQgKi8gXAotICAgIEFERF9URVNUX1JXKENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCi0gICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gXAotICAgIEFERF9URVNUX1JXKENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIFwKLSAgICAgICAgICAgICAgICB0b3RhbFNpemUsICMjIF9fVkFfQVJHU19fKTsgXAotICAgIC8qIFRlc3Qgd3JhcHBpbmcgdGhlIHRyYW5zcG9ydCB3aXRoIFRabGliVHJhbnNwb3J0ICovIFwKLSAgICBBRERfVEVTVF9SVyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgXAotICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwgIyMgX19WQV9BUkdTX18pOyBcCisjZGVmaW5lIFRFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogQWRkIHRoZSB0ZXN0IGFzIHNwZWNpZmllZCwgdG8gdGVzdCB0aGUgbm9uLXZpcnR1YWwgZnVuY3Rpb24gY2FsbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRyYW5zcG9ydHMsIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogQWxzbyB0ZXN0IHVzaW5nIHRoZSB0cmFuc3BvcnQgYXMgYSBUVHJhbnNwb3J0KiwgdG8gdGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICogdGhlIHJlYWRfdmlydCgpL3dyaXRlX3ZpcnQoKSBjYWxscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEJ1ZmZlcmVkVHJhbnNwb3J0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+LCB0b3RhbFNpemUsICMjX19WQV9BUkdTX18pOyAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVEZyYW1lZFRyYW5zcG9ydHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZEZyYW1lZFRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICBcCisgICAgLyogVGVzdCB3cmFwcGluZyB0aGUgdHJhbnNwb3J0IHdpdGggVFpsaWJUcmFuc3BvcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREX1RFU1RfUlcoQ291cGxlZFpsaWJUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4sIHRvdGFsU2l6ZSwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRyYW5zcG9ydHMpIFwKLSAgICBhZGRUZXN0QmxvY2tpbmc8IENvdXBsZWRUcmFuc3BvcnRzID4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CisjZGVmaW5lIEFERF9URVNUX0JMT0NLSU5HKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFkZFRlc3RCbG9ja2luZzxDb3VwbGVkVHJhbnNwb3J0cz4oQk9PU1RfU1RSSU5HSVpFKENvdXBsZWRUcmFuc3BvcnRzKSk7CiAKLSNkZWZpbmUgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkVHJhbnNwb3J0cykgXAotICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRUcmFuc3BvcnRzPik7IFwKLSAgQUREX1RFU1RfQkxPQ0tJTkcoQ291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgXAotICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgXAorI2RlZmluZSBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRUcmFuc3BvcnRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVHJhbnNwb3J0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkQnVmZmVyZWRUcmFuc3BvcnRzVDxDb3VwbGVkVHJhbnNwb3J0cz4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkRnJhbWVkVHJhbnNwb3J0c1Q8Q291cGxlZFRyYW5zcG9ydHM+KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBBRERfVEVTVF9CTE9DS0lORyhDb3VwbGVkWmxpYlRyYW5zcG9ydHNUPENvdXBsZWRUcmFuc3BvcnRzPik7CiAKIGNsYXNzIFRyYW5zcG9ydFRlc3RHZW4gewotIHB1YmxpYzoKLSAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwKLSAgICAgICAgICAgICAgICAgICBmbG9hdCBzaXplTXVsdGlwbGllcikgOgotICAgICAgc3VpdGVfKHN1aXRlKSwKLSAgICAgIHNpemVNdWx0aXBsaWVyXyhzaXplTXVsdGlwbGllcikge30KK3B1YmxpYzoKKyAgVHJhbnNwb3J0VGVzdEdlbihib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBzdWl0ZSwgZmxvYXQgc2l6ZU11bHRpcGxpZXIpCisgICAgOiBzdWl0ZV8oc3VpdGUpLCBzaXplTXVsdGlwbGllcl8oc2l6ZU11bHRpcGxpZXIpIHt9CiAKICAgdm9pZCBnZW5lcmF0ZSgpIHsKICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByYW5kNGsoMSwgNDA5Nik7CkBAIC04MDgsMTA0ICs4MjksMTM5IEBACiAgICAgICovCiAKICAgICAvLyBUTWVtb3J5QnVmZmVyIHRlc3RzCi0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoxMDI0LCAwLCAwKTsKLSAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0KjI1NiwgcmFuZDRrLCByYW5kNGspOwotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCAxNjcsIDE2Myk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoxNiwgMSwgMSk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDE2LCAxLCAxKTsKIAotICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQqMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCoxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRNZW1vcnlCdWZmZXJzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZE1lbW9yeUJ1ZmZlcnMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkTWVtb3J5QnVmZmVycywgMTAyNCAqIDE2LCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRNZW1vcnlCdWZmZXJzKTsKIAorI2lmbmRlZiBfV0lOMzIKICAgICAvLyBURkRUcmFuc3BvcnQgdGVzdHMKICAgICAvLyBTaW5jZSBDb3VwbGVkRkRUcmFuc3BvcnRzIHRlc3RzIHdpdGggYSBwaXBlLCB3cml0ZXMgd2lsbCBibG9jawogICAgIC8vIGlmIHRoZXJlIGlzIHRvbyBtdWNoIG91dHN0YW5kaW5nIHVucmVhZCBkYXRhIGluIHRoZSBwaXBlLgogICAgIHVpbnQzMl90IGZkX21heF9vdXRzdGFuZGluZyA9IDQwOTY7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjEwMjQsIDAsIDAsCi0gICAgICAgICAgICAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLAotICAgICAgICAgICAgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAxNjcsIDE2MywKLSAgICAgICAgICAgIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwLCAwLCAwLCBmZF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGssIDAsIDAsIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgMCwgMCwgZmRfbWF4X291dHN0YW5kaW5nKTsKIAotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoyNTYsIDAsIDAsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZEZEVHJhbnNwb3J0cywgMTAyNCoyNTYsIDE2NywgMTYzLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0KjE2LCAxLCAxLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0aywgZmRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRGRFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGssIGZkX21heF9vdXRzdGFuZGluZyk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGRFRyYW5zcG9ydHMpOworI2Vsc2UKKyAgICAvLyBUUGlwZSB0ZXN0cyAoV0lOMzIgb25seSkKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDApOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDE2LCAxLCAxKTsKKworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAwLCAwLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworCisgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkUGlwZVRyYW5zcG9ydHMpOworI2VuZGlmIC8vX1dJTjMyCiAKICAgICAvLyBUU29ja2V0IHRlc3RzCiAgICAgdWludDMyX3Qgc29ja2V0X21heF9vdXRzdGFuZGluZyA9IDQwOTY7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoxMDI0LCAwLCAwLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIHJhbmQ0aywgcmFuZDRrLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoyNTYsIDE2NywgMTYzLAotICAgICAgICAgICAgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDEwMjQsIDAsIDAsIDAsIDAsIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAyNTYsIHJhbmQ0aywgcmFuZDRrLCAwLCAwLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CiAgICAgLy8gRG9oLiAgQXBwYXJlbnRseSB3cml0aW5nIHRvIGEgc29ja2V0IGhhcyBzb21lIGFkZGl0aW9uYWwgb3ZlcmhlYWQgZm9yCiAgICAgLy8gZWFjaCBzZW5kKCkgY2FsbC4gIElmIHdlIGhhdmUgbW9yZSB0aGFuIH40MDAgb3V0c3RhbmRpbmcgMS1ieXRlIHdyaXRlCiAgICAgLy8gcmVxdWVzdHMsIGFkZGl0aW9uYWwgc2VuZCgpIGNhbGxzIHN0YXJ0IGJsb2NraW5nLgotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMTYsIDEsIDEsCi0gICAgICAgICAgICAwLCAwLCA0MDApOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCAwLCAwLAotICAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOwotICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQqMjU2LCByYW5kNGssIHJhbmQ0aywKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKLSAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0KjI1NiwgMTY3LCAxNjMsCi0gICAgICAgICAgICByYW5kNGssIHJhbmQ0aywgc29ja2V0X21heF9vdXRzdGFuZGluZyk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCoxNiwgMSwgMSwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCA0MDApOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSwgMCwgMCwgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGssIHNvY2tldF9tYXhfb3V0c3RhbmRpbmcpOworICAgIFRFU1RfUlcoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMsCisgICAgICAgICAgICAxMDI0ICogMjU2LAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgc29ja2V0X21heF9vdXRzdGFuZGluZyk7CisgICAgVEVTVF9SVyhDb3VwbGVkU29ja2V0VHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMTY3LCAxNjMsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKKyAgICBURVNUX1JXKENvdXBsZWRTb2NrZXRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRfbWF4X291dHN0YW5kaW5nKTsKIAogICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFNvY2tldFRyYW5zcG9ydHMpOwogCisvLyBUaGVzZSBjb3VsZCBiZSBtYWRlIHRvIHdvcmsgb24gV2luZG93cywgYnV0IEkgZG9uJ3QgY2FyZSBlbm91Z2ggdG8gbWFrZSBpdCBoYXBwZW4KKyNpZm5kZWYgX1dJTjMyCiAgICAgLy8gVEZpbGVUcmFuc3BvcnQgdGVzdHMKICAgICAvLyBXZSB1c2Ugc21hbGxlciBidWZmZXIgc2l6ZXMgaGVyZSwgc2luY2UgVEZpbGVUcmFuc3BvcnQgaXMgZmFpcmx5IHNsb3cuCiAgICAgLy8KICAgICAvLyBURmlsZVRyYW5zcG9ydCBjYW4ndCB3cml0ZSBtb3JlIHRoYW4gMTZNQiBhdCBvbmNlCi0gICAgdWludDMyX3QgbWF4X3dyaXRlX2F0X29uY2UgPSAxMDI0KjEwMjQqMTYgLSA0OwotICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0KjEwMjQsIG1heF93cml0ZV9hdF9vbmNlLCAwKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoxMjgsIHJhbmQ0aywgcmFuZDRrKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoxMjgsIDE2NywgMTYzKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCoyLCAxLCAxKTsKKyAgICB1aW50MzJfdCBtYXhfd3JpdGVfYXRfb25jZSA9IDEwMjQgKiAxMDI0ICogMTYgLSA0OworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTAyNCwgbWF4X3dyaXRlX2F0X29uY2UsIDApOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogMTI4LCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAxMjgsIDE2NywgMTYzKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDIsIDEsIDEpOwogCi0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqNjQsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKLSAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCo2NCwKLSAgICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqNjQsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7Ci0gICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQqMiwgMSwgMSwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIDAsIDAsIHJhbmQ0aywgcmFuZDRrKTsKKyAgICBURVNUX1JXKENvdXBsZWRGaWxlVHJhbnNwb3J0cywgMTAyNCAqIDY0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZEZpbGVUcmFuc3BvcnRzLCAxMDI0ICogNjQsIDE2NywgMTYzLCByYW5kNGssIHJhbmQ0ayk7CisgICAgVEVTVF9SVyhDb3VwbGVkRmlsZVRyYW5zcG9ydHMsIDEwMjQgKiAyLCAxLCAxLCByYW5kNGssIHJhbmQ0ayk7CiAKICAgICBURVNUX0JMT0NLSU5HX0JFSEFWSU9SKENvdXBsZWRGaWxlVHJhbnNwb3J0cyk7CisjZW5kaWYKIAogICAgIC8vIEFkZCBzb21lIHRlc3RzIHRoYXQgYWNjZXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBhbmQgVEZyYW1lZFRyYW5zcG9ydAogICAgIC8vIHZpYSBUVHJhbnNwb3J0IHBvaW50ZXJzIGFuZCBUQnVmZmVyQmFzZSBwb2ludGVycy4KICAgICBBRERfVEVTVF9SVyhDb3VwbGVkVFRyYW5zcG9ydHM8Q291cGxlZEJ1ZmZlcmVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRCdWZmZXJlZFRyYW5zcG9ydHM+LAotICAgICAgICAgICAgICAgIDEwMjQqMTAyNCwgcmFuZDRrLCByYW5kNGssIHJhbmQ0aywgcmFuZDRrKTsKKyAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCwKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGspOwogICAgIEFERF9URVNUX1JXKENvdXBsZWRUVHJhbnNwb3J0czxDb3VwbGVkRnJhbWVkVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgICAgQUREX1RFU1RfUlcoQ291cGxlZEJ1ZmZlckJhc2VzPENvdXBsZWRGcmFtZWRUcmFuc3BvcnRzPiwKLSAgICAgICAgICAgICAgICAxMDI0KjEwMjQsIHJhbmQ0aywgcmFuZDRrLCByYW5kNGssIHJhbmQ0ayk7CisgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQsCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrKTsKIAogICAgIC8vIFRlc3QgdXNpbmcgVFpsaWJUcmFuc3BvcnQgdmlhIGEgVFRyYW5zcG9ydCBwb2ludGVyCiAgICAgQUREX1RFU1RfUlcoQ291cGxlZFRUcmFuc3BvcnRzPENvdXBsZWRabGliVHJhbnNwb3J0cz4sCi0gICAgICAgICAgICAgICAgMTAyNCoxMDI0LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0LAorICAgICAgICAgICAgICAgIHJhbmQ0aywKKyAgICAgICAgICAgICAgICByYW5kNGssCisgICAgICAgICAgICAgICAgcmFuZDRrLAorICAgICAgICAgICAgICAgIHJhbmQ0ayk7CiAgIH0KIAotIHByaXZhdGU6CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorI2RlZmluZSBNQUtFX1RFU1RfQ0FTRShfRlVOQywgX05BTUUpIGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKF9GVU5DLCBfTkFNRSwgX19GSUxFX18sIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUgTUFLRV9URVNUX0NBU0UoX0ZVTkMsIF9OQU1FKSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZShfRlVOQywgX05BTUUpCisjZW5kaWYKKworcHJpdmF0ZToKICAgdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgotICB2b2lkIGFkZFRlc3RSVyhjb25zdCBjaGFyKiB0cmFuc3BvcnRfbmFtZSwgdWludDMyX3QgdG90YWxTaXplLAotICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciB3U2l6ZUdlbiwgR2VuZXJpY1NpemVHZW5lcmF0b3IgclNpemVHZW4sCisgIHZvaWQgYWRkVGVzdFJXKGNvbnN0IGNoYXIqIHRyYW5zcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCB0b3RhbFNpemUsCisgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHdTaXplR2VuLAorICAgICAgICAgICAgICAgICBHZW5lcmljU2l6ZUdlbmVyYXRvciByU2l6ZUdlbiwKICAgICAgICAgICAgICAgICAgR2VuZXJpY1NpemVHZW5lcmF0b3Igd0NodW5rU2l6ZUdlbiA9IDAsCiAgICAgICAgICAgICAgICAgIEdlbmVyaWNTaXplR2VuZXJhdG9yIHJDaHVua1NpemVHZW4gPSAwLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhPdXRzdGFuZGluZyA9IDAsCkBAIC05MTQsNjEgKzk3MCw0NiBAQAogICAgIHRvdGFsU2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0b3RhbFNpemUgKiBzaXplTXVsdGlwbGllcl8pOwogCiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG5hbWU7Ci0gICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwKLSAgICAgIHdTaXplR2VuLmRlc2NyaWJlKCkgPDwgIiwgIiA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwKLSAgICAgIHdDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8Ci0gICAgICBtYXhPdXRzdGFuZGluZyA8PCAiKSI7CisgICAgbmFtZSA8PCB0cmFuc3BvcnRfbmFtZSA8PCAiOjp0ZXN0X3J3KCIgPDwgdG90YWxTaXplIDw8ICIsICIgPDwgd1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiCisgICAgICAgICA8PCByU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIgPDwgd0NodW5rU2l6ZUdlbi5kZXNjcmliZSgpIDw8ICIsICIKKyAgICAgICAgIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IG1heE91dHN0YW5kaW5nIDw8ICIpIjsKIAotICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYyA9Ci0gICAgICBzdGQ6OnRyMTo6YmluZCh0ZXN0X3J3PENvdXBsZWRUcmFuc3BvcnRzPiwgdG90YWxTaXplLAotICAgICAgICAgICAgICAgICAgICAgd1NpemVHZW4sIHJTaXplR2VuLCB3Q2h1bmtTaXplR2VuLCByQ2h1bmtTaXplR2VuLAotICAgICAgICAgICAgICAgICAgICAgbWF4T3V0c3RhbmRpbmcpOwotICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgPQotICAgICAgYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UodGVzdF9mdW5jLCBuYW1lLnN0cigpKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jCisjZWxzZQorICAgIGJvb3N0Ojp1bml0X3Rlc3Q6OmNhbGxiYWNrMDw+IHRlc3RfZnVuYworI2VuZGlmCisgICAgICAgID0gc3RkOjpiaW5kKHRlc3Rfcnc8Q291cGxlZFRyYW5zcG9ydHM+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByU2l6ZUdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDaHVua1NpemVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByQ2h1bmtTaXplR2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4T3V0c3RhbmRpbmcpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfZnVuYywgbmFtZS5zdHIoKSksIGV4cGVjdGVkRmFpbHVyZXMpOwogICB9CiAKICAgdGVtcGxhdGUgPGNsYXNzIENvdXBsZWRUcmFuc3BvcnRzPgotICB2b2lkIGFkZFRlc3RCbG9ja2luZyhjb25zdCBjaGFyKiB0cmFuc3BvcnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBleHBlY3RlZEZhaWx1cmVzID0gMCkgeworICB2b2lkIGFkZFRlc3RCbG9ja2luZyhjb25zdCBjaGFyKiB0cmFuc3BvcnROYW1lLCB1aW50MzJfdCBleHBlY3RlZEZhaWx1cmVzID0gMCkgewogICAgIGNoYXIgbmFtZVsxMDI0XTsKLSAgICBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9wYXJ0X2F2YWlsYWJsZV9pbl9jaHVua3MoKSIsCi0gICAgICAgICAgICAgdHJhbnNwb3J0TmFtZSk7Ci0gICAgdGMgPSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSgKLSAgICAgICAgICB0ZXN0X3JlYWRfcGFydF9hdmFpbGFibGVfaW5fY2h1bmtzPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rcygpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX3BhcnRfYXZhaWxhYmxlX2luX2NodW5rczxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKIAotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X3JlYWRfcGFydGlhbF9taWRmcmFtZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSk7Ci0gICAgc3VpdGVfLT5hZGQodGMsIGV4cGVjdGVkRmFpbHVyZXMpOworICAgIFRIUklGVF9TTlBSSU5URihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9yZWFkX3BhcnRpYWxfbWlkZnJhbWUoKSIsIHRyYW5zcG9ydE5hbWUpOworICAgIHN1aXRlXy0+YWRkKE1BS0VfVEVTVF9DQVNFKHRlc3RfcmVhZF9wYXJ0aWFsX21pZGZyYW1lPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwKLSAgICAgICAgICAgICB0cmFuc3BvcnROYW1lKTsKLSAgICB0YyA9IGJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKAotICAgICAgICAgIHRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfcmVhZF9ub25lX2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9yZWFkX25vbmVfYXZhaWxhYmxlPENvdXBsZWRUcmFuc3BvcnRzPiwgbmFtZSksIGV4cGVjdGVkRmFpbHVyZXMpOwogCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X3BhcnRfYXZhaWxhYmxlKCkiLAotICAgICAgICAgICAgIHRyYW5zcG9ydE5hbWUpOwotICAgIHRjID0gYm9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UoCi0gICAgICAgICAgdGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKTsKLSAgICBzdWl0ZV8tPmFkZCh0YywgZXhwZWN0ZWRGYWlsdXJlcyk7CisgICAgVEhSSUZUX1NOUFJJTlRGKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzOjp0ZXN0X2JvcnJvd19wYXJ0X2F2YWlsYWJsZSgpIiwgdHJhbnNwb3J0TmFtZSk7CisgICAgc3VpdGVfLT5hZGQoTUFLRV9URVNUX0NBU0UodGVzdF9ib3Jyb3dfcGFydF9hdmFpbGFibGU8Q291cGxlZFRyYW5zcG9ydHM+LCBuYW1lKSwgZXhwZWN0ZWRGYWlsdXJlcyk7CiAKLSAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlczo6dGVzdF9ib3Jyb3dfbm9uZV9hdmFpbGFibGUoKSIsCi0gICAgICAgICAgICAgdHJhbnNwb3J0TmFtZSk7Ci0gICAgdGMgPSBib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSgKLSAgICAgICAgICB0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpOwotICAgIHN1aXRlXy0+YWRkKHRjLCBleHBlY3RlZEZhaWx1cmVzKTsKKyAgICBUSFJJRlRfU05QUklOVEYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXM6OnRlc3RfYm9ycm93X25vbmVfYXZhaWxhYmxlKCkiLCB0cmFuc3BvcnROYW1lKTsKKyAgICBzdWl0ZV8tPmFkZChNQUtFX1RFU1RfQ0FTRSh0ZXN0X2JvcnJvd19ub25lX2F2YWlsYWJsZTxDb3VwbGVkVHJhbnNwb3J0cz4sIG5hbWUpLCBleHBlY3RlZEZhaWx1cmVzKTsKICAgfQogCiAgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlXzsKQEAgLTk4MywxMDMgKzEwMjQsNjggQEAKICAqIEdlbmVyYWwgSW5pdGlhbGl6YXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCBwcmludF91c2FnZShGSUxFKiBmLCBjb25zdCBjaGFyKiBhcmd2MCkgewotICBmcHJpbnRmKGYsICJVc2FnZTogJXMgW2Jvb3N0X29wdGlvbnNdIFtvcHRpb25zXVxuIiwgYXJndjApOwotICBmcHJpbnRmKGYsICJPcHRpb25zOlxuIik7Ci0gIGZwcmludGYoZiwgIiAgLS1zZWVkPTxOPiwgLXMgPE4+XG4iKTsKLSAgZnByaW50ZihmLCAiICAtLXRtcC1kaXI9RElSLCAtdCBESVJcbiIpOwotICBmcHJpbnRmKGYsICIgIC0taGVscFxuIik7Ci19CitzdHJ1Y3QgZ2xvYmFsX2ZpeHR1cmUgeworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IGFsYXJtVGhyZWFkXzsKKyAgZ2xvYmFsX2ZpeHR1cmUoKSB7CisjaWYgX1dJTjMyCisgICAgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAKLXN0cnVjdCBPcHRpb25zIHsKLSAgaW50IHNlZWQ7Ci0gIGJvb2wgaGF2ZVNlZWQ7Ci0gIGZsb2F0IHNpemVNdWx0aXBsaWVyOworICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IGZhY3Rvcnk7CisgICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgICBhbGFybVRocmVhZF8gPSBmYWN0b3J5Lm5ld1RocmVhZCgKKyAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpGdW5jdGlvblJ1bm5lcjo6Y3JlYXRlKGFsYXJtX2hhbmRsZXJfd3JhcHBlcikpOworICAgIGFsYXJtVGhyZWFkXy0+c3RhcnQoKTsKKyAgfQorICB+Z2xvYmFsX2ZpeHR1cmUoKSB7CisgICAgeworICAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhnX2FsYXJtX21vbml0b3IpOworICAgICAgZ190ZWFyZG93biA9IHRydWU7CisgICAgICBnX2FsYXJtX21vbml0b3Iubm90aWZ5KCk7CisgICAgfQorICAgIGFsYXJtVGhyZWFkXy0+am9pbigpOworICB9CiB9OwogCi12b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgT3B0aW9ucyogb3B0aW9ucykgewotICBib29sIGhhdmVfc2VlZCA9IGZhbHNlOwotICBvcHRpb25zLT5zaXplTXVsdGlwbGllciA9IDE7CisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorQk9PU1RfR0xPQkFMX0ZJWFRVUkUoZ2xvYmFsX2ZpeHR1cmUpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKGdsb2JhbF9maXh0dXJlKQorI2VuZGlmCiAKLSAgc3RydWN0IG9wdGlvbiBsb25nX29wdHNbXSA9IHsKLSAgICB7ICJoZWxwIiwgZmFsc2UsIE5VTEwsICdoJyB9LAotICAgIHsgInNlZWQiLCB0cnVlLCBOVUxMLCAncycgfSwKLSAgICB7ICJ0bXAtZGlyIiwgdHJ1ZSwgTlVMTCwgJ3QnIH0sCi0gICAgeyAic2l6ZS1tdWx0aXBsaWVyIiwgdHJ1ZSwgTlVMTCwgJ3gnIH0sCi0gICAgeyBOVUxMLCAwLCBOVUxMLCAwIH0KLSAgfTsKKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOworICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CiAKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBvcHRvcHQgPSAxOwotICAgIGludCBvcHRjaGFyID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhzOnQ6eDoiLCBsb25nX29wdHMsIE5VTEwpOwotICAgIGlmIChvcHRjaGFyID09IC0xKSB7Ci0gICAgICBicmVhazsKLSAgICB9CisgIGluaXRyYW5kKHNlZWQpOwogCi0gICAgc3dpdGNoIChvcHRjaGFyKSB7Ci0gICAgICBjYXNlICd0JzoKLSAgICAgICAgdG1wX2RpciA9IG9wdGFyZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdzJzogewotICAgICAgICBjaGFyICplbmRwdHI7Ci0gICAgICAgIG9wdGlvbnMtPnNlZWQgPSBzdHJ0b2wob3B0YXJnLCAmZW5kcHRyLCAwKTsKLSAgICAgICAgaWYgKGVuZHB0ciA9PSBvcHRhcmcgfHwgKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHNlZWQgdmFsdWUgXCIlc1wiOiBtdXN0IGJlIGFuIGludGVnZXJcbiIsCi0gICAgICAgICAgICAgICAgICBvcHRhcmcpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGF2ZV9zZWVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlICdoJzoKLSAgICAgICAgcHJpbnRfdXNhZ2Uoc3Rkb3V0LCBhcmd2WzBdKTsKLSAgICAgICAgZXhpdCgwKTsKLSAgICAgIGNhc2UgJ3gnOiB7Ci0gICAgICAgIGNoYXIgKmVuZHB0cjsKLSAgICAgICAgb3B0aW9ucy0+c2l6ZU11bHRpcGxpZXIgPSBzdHJ0b2Yob3B0YXJnLCAmZW5kcHRyKTsKLSAgICAgICAgaWYgKGVuZHB0ciA9PSBvcHRhcmcgfHwgKmVuZHB0ciAhPSAnXDAnKSB7Ci0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHNpemUgbXVsdGlwbGllciBcIiVzXCI6IG11c3QgYmUgYSBudW1iZXJcbiIsCi0gICAgICAgICAgICAgICAgICBvcHRhcmcpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG9wdGlvbnMtPnNpemVNdWx0aXBsaWVyIDwgMCkgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBzaXplIG11bHRpcGxpZXIgXCIlc1wiOiAiCi0gICAgICAgICAgICAgICAgICAibXVzdCBiZSBub24tbmVnYXRpdmVcbiIsIG9wdGFyZyk7Ci0gICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJz8nOgotICAgICAgICBleGl0KDEpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLy8gT25seSBoYXBwZW5zIGlmIHNvbWVvbmUgYWRkcyBhbm90aGVyIG9wdGlvbiB0byB0aGUgb3B0YXJnIHN0cmluZywKLSAgICAgICAgLy8gYnV0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzd2l0Y2ggc3RhdGVtZW50IHRvIGhhbmRsZSBpdC4KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJ1bmtub3duIG9wdGlvbiBcIi0lY1wiXG4iLCBvcHRjaGFyKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWhhdmVfc2VlZCkgewotICAgIC8vIGNob29zZSBhIHNlZWQgbm93IGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IG9uZQotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKLSAgICBnZXR0aW1lb2ZkYXkoJnR2LCAmdHopOwotICAgIG9wdGlvbnMtPnNlZWQgPSB0di50dl9zZWMgXiB0di50dl91c2VjOwotICB9CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKKyAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKKyAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIDEpOworICB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3IuZ2VuZXJhdGUoKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCiBib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0gIC8vIFBhcnNlIGFyZ3VtZW50cwotICBPcHRpb25zIG9wdGlvbnM7Ci0gIHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgJm9wdGlvbnMpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ2MpOworICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKGFyZ3YpOworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOworICBpbnQgc2VlZCA9IHR2LnR2X3NlYyBeIHR2LnR2X3VzZWM7CiAKLSAgaW5pdHJhbmQob3B0aW9ucy5zZWVkKTsKKyAgaW5pdHJhbmQoc2VlZCk7CiAKLSAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPQotICAgICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKICAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJUcmFuc3BvcnRUZXN0IjsKLSAgVHJhbnNwb3J0VGVzdEdlbiB0cmFuc3BvcnRfdGVzdF9nZW5lcmF0b3Ioc3VpdGUsIG9wdGlvbnMuc2l6ZU11bHRpcGxpZXIpOworICBUcmFuc3BvcnRUZXN0R2VuIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvcihzdWl0ZSwgMSk7CiAgIHRyYW5zcG9ydF90ZXN0X2dlbmVyYXRvci5nZW5lcmF0ZSgpOwotCiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHlwZWRlZlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU5MjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L1R5cGVkZWZUZXN0LmNwcApAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KKyNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KKworI2luY2x1ZGUgImdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuaCIKKworQk9PU1RfU1RBVElDX0FTU0VSVCgoYm9vc3Q6OmlzX3NhbWU8aW50MzJfdCwgdGhyaWZ0Ojp0ZXN0OjpNeUludDMyPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoKGJvb3N0Ojppc19zYW1lPHN0ZDo6c3RyaW5nLCB0aHJpZnQ6OnRlc3Q6Ok15U3RyaW5nPjo6dmFsdWUpKTsKK0JPT1NUX1NUQVRJQ19BU1NFUlQoCisgICAgKGJvb3N0Ojppc19zYW1lPHRocmlmdDo6dGVzdDo6VHlwZWRlZlRlc3RTdHJ1Y3QsIHRocmlmdDo6dGVzdDo6TXlTdHJ1Y3Q+Ojp2YWx1ZSkpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKaW5kZXggNGQ3OTY2ZS4uYzgyNjgxNCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCkBAIC0xNywzMSArMTcsMzggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUwotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotCiAjaWZuZGVmIF9HTlVfU09VUkNFCiAjZGVmaW5lIF9HTlVfU09VUkNFIC8vIG5lZWRlZCBmb3IgZ2V0b3B0X2xvbmcKICNlbmRpZgogCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDE3MDApCisvLyBwb2x5bm9taWFsIGFuZCBzdGQ6OmZpbGxfdCB3YXJuaW5nIGhhcHBlbnMgaW4gTVNWQyAyMDEwLCAyMDEzLCBtYXliZSBvdGhlcnMKKy8vIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTQyNgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGNzdGRkZWY+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx0cjEvZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIGJvb3N0OjptdDE5OTM3IHJuZzsKIApAQCAtNTAsMjYgKzU3LDI0IEBACiAgKi8KIAogY2xhc3MgU2l6ZUdlbmVyYXRvciB7Ci0gcHVibGljOgorcHVibGljOgogICB2aXJ0dWFsIH5TaXplR2VuZXJhdG9yKCkge30KICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpID0gMDsKIH07CiAKIGNsYXNzIENvbnN0YW50U2l6ZUdlbmVyYXRvciA6IHB1YmxpYyBTaXplR2VuZXJhdG9yIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIENvbnN0YW50U2l6ZUdlbmVyYXRvcih1bnNpZ25lZCBpbnQgdmFsdWUpIDogdmFsdWVfKHZhbHVlKSB7fQotICB2aXJ0dWFsIHVuc2lnbmVkIGludCBnZXRTaXplKCkgewotICAgIHJldHVybiB2YWx1ZV87Ci0gIH0KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsgcmV0dXJuIHZhbHVlXzsgfQogCi0gcHJpdmF0ZToKK3ByaXZhdGU6CiAgIHVuc2lnbmVkIGludCB2YWx1ZV87CiB9OwogCiBjbGFzcyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yIDogcHVibGljIFNpemVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcihkb3VibGUgbWVhbiwgZG91YmxlIHN0ZF9kZXYpIDoKLSAgICAgIGdlbl8ocm5nLCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CitwdWJsaWM6CisgIExvZ05vcm1hbFNpemVHZW5lcmF0b3IoZG91YmxlIG1lYW4sIGRvdWJsZSBzdGRfZGV2KQorICAgIDogZ2VuXyhybmcsIGJvb3N0Ojpsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4obWVhbiwgc3RkX2RldikpIHt9CiAKICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0U2l6ZSgpIHsKICAgICAvLyBMb29wIHVudGlsIHdlIGdldCBhIHNpemUgb2YgMSBvciBtb3JlCkBAIC04MSwyNiArODYsMjYgQEAKICAgICB9CiAgIH0KIAotIHByaXZhdGU6Ci0gIHZhcmlhdGVfZ2VuZXJhdG9yPCBtdDE5OTM3LCBsb2dub3JtYWxfZGlzdHJpYnV0aW9uPGRvdWJsZT4gPiBnZW5fOworcHJpdmF0ZToKKyAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPGJvb3N0OjptdDE5OTM3LCBib29zdDo6bG9nbm9ybWFsX2Rpc3RyaWJ1dGlvbjxkb3VibGU+ID4gZ2VuXzsKIH07CiAKLXVpbnQ4X3QqIGdlbl91bmlmb3JtX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuLCB1aW50OF90IGMpIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX3VuaWZvcm1fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4sIHVpbnQ4X3QgYykgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKICAgbWVtc2V0KGJ1ZiwgYywgYnVmX2xlbik7Ci0gIHJldHVybiBidWY7CisgIHJldHVybiBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+KGJ1Zik7CiB9CiAKLXVpbnQ4X3QqIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKK2Jvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIodWludDMyX3QgYnVmX2xlbikgewogICB1aW50OF90KiBidWYgPSBuZXcgdWludDhfdFtidWZfbGVuXTsKIAogICAvLyBHZW5lcmF0ZSBzbWFsbCBydW5zIG9mIGFsdGVybmF0ZWx5IGluY3JlYXNpbmcgYW5kIGRlY3JlYXNpbmcgYnl0ZXMKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDMyX3Q+IHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKDEsIDY0KTsKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gYnl0ZV9kaXN0cmlidXRpb24oMCwgVUlOVDhfTUFYKTsKLSAgYm9vc3Q6OnZhcmlhdGVfZ2VuZXJhdG9yPCBib29zdDo6bXQxOTkzNywgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gPgotICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOwotICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8IGJvb3N0OjptdDE5OTM3LCBib29zdDo6dW5pZm9ybV9zbWFsbGludDx1aW50MzJfdD4gPgotICAgIHJ1bl9sZW5fZ2VuZXJhdG9yKHJuZywgcnVuX2xlbmd0aF9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGJ5dGVfZ2VuZXJhdG9yKHJuZywgYnl0ZV9kaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQzMl90PiA+CisgICAgICBydW5fbGVuX2dlbmVyYXRvcihybmcsIHJ1bl9sZW5ndGhfZGlzdHJpYnV0aW9uKTsKIAogICB1aW50MzJfdCBpZHggPSAwOwogICBpbnQ4X3Qgc3RlcCA9IDE7CkBAIC0xMjAsODIgKzEyNSw4MSBAQAogICAgIHN0ZXAgKj0gLTE7CiAgIH0KIAotICByZXR1cm4gYnVmOworICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PihidWYpOwogfQogCi11aW50OF90KiBnZW5fcmFuZG9tX2J1ZmZlcih1aW50MzJfdCBidWZfbGVuKSB7Citib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGdlbl9yYW5kb21fYnVmZmVyKHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgdWludDhfdCogYnVmID0gbmV3IHVpbnQ4X3RbYnVmX2xlbl07CiAKICAgYm9vc3Q6OnVuaWZvcm1fc21hbGxpbnQ8dWludDhfdD4gZGlzdHJpYnV0aW9uKDAsIFVJTlQ4X01BWCk7Ci0gIGJvb3N0Ojp2YXJpYXRlX2dlbmVyYXRvcjwgYm9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KLSAgICBnZW5lcmF0b3Iocm5nLCBkaXN0cmlidXRpb24pOworICBib29zdDo6dmFyaWF0ZV9nZW5lcmF0b3I8Ym9vc3Q6Om10MTk5MzcsIGJvb3N0Ojp1bmlmb3JtX3NtYWxsaW50PHVpbnQ4X3Q+ID4KKyAgICAgIGdlbmVyYXRvcihybmcsIGRpc3RyaWJ1dGlvbik7CiAKICAgZm9yICh1aW50MzJfdCBuID0gMDsgbiA8IGJ1Zl9sZW47ICsrbikgewogICAgIGJ1ZltuXSA9IGdlbmVyYXRvcigpOwogICB9CiAKLSAgcmV0dXJuIGJ1ZjsKKyAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4oYnVmKTsKIH0KIAogLyoKICAqIFRlc3QgZnVuY3Rpb25zCiAgKi8KIAotdm9pZCB0ZXN0X3dyaXRlX3RoZW5fcmVhZChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7Cit2b2lkIHRlc3Rfd3JpdGVfdGhlbl9yZWFkKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAKICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOwogICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CiAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLCBidWZfbGVuKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOwogICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwogfQogCi12b2lkIHRlc3Rfc2VwYXJhdGVfY2hlY2tzdW0oY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7Cit2b2lkIHRlc3Rfc2VwYXJhdGVfY2hlY2tzdW0oY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gVGhpcyBvbmUgaXMgdHJpY2t5LiAgSSBzZXBhcmF0ZSB0aGUgbGFzdCBieXRlIG9mIHRoZSBzdHJlYW0gb3V0CiAgIC8vIGludG8gYSBzZXBhcmF0ZSBjcmJ1Zl8uICBUaGUgbGFzdCBieXRlIGlzIHBhcnQgb2YgdGhlIGNoZWNrc3VtLAogICAvLyBzbyB0aGUgZW50aXJlIHJlYWQgZ29lcyBmaW5lLCBidXQgd2hlbiBJIGdvIHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0KICAgLy8gaXQgaXNuJ3QgdGhlcmUuICBUaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gY29tcGxhaW5lZCB0aGF0CiAgIC8vIHRoZSBzdHJlYW0gd2FzIG5vdCBjb21wbGV0ZS4gIEknbSBhYm91dCB0byBnbyBmaXggdGhhdC4KICAgLy8gSXQgd29ya2VkLiAgQXdlc29tZS4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwogICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOwogICB6bGliX3RyYW5zLnJlc2V0KG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRabGliVHJhbnNwb3J0OjpERUZBVUxUX1VSQlVGX1NJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9idWYubGVuZ3RoKCktMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4odG1wX2J1Zi5sZW5ndGgoKSAtIDEpKSk7CiAKICAgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBtaXJyb3IobmV3IHVpbnQ4X3RbYnVmX2xlbl0pOwogICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkQWxsKG1pcnJvci5nZXQoKSwgYnVmX2xlbik7CiAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoZ290LCBidWZfbGVuKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLCBidWZfbGVuKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOwogICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwogfQogCi12b2lkIHRlc3RfaW5jb21wbGV0ZV9jaGVja3N1bShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCBnZXQgdGhhdCAibm90IGNvbXBsZXRlIiBlcnJvciBpZgogICAvLyBpdCByZWFsbHkgaXNuJ3QgY29tcGxldGUuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwotICB6bGliX3RyYW5zLT53cml0ZShidWYsIGJ1Zl9sZW4pOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKICAgbWVtYnVmLT5hcHBlbmRCdWZmZXJUb1N0cmluZyh0bXBfYnVmKTsKICAgdG1wX2J1Zi5lcmFzZSh0bXBfYnVmLmxlbmd0aCgpIC0gMSk7Ci0gIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4oCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAotICAgICAgICAgICAgICAgICAgICAgIHRtcF9idWYubGVuZ3RoKCkpOworICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkpKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHVpbnQzMl90IGdvdCA9IHpsaWJfdHJhbnMtPnJlYWRBbGwobWlycm9yLmdldCgpLCBidWZfbGVuKTsKICAgQk9PU1RfUkVRVUlSRV9FUVVBTChnb3QsIGJ1Zl9sZW4pOwotICBCT09TVF9DSEVDS19FUVVBTChtZW1jbXAobWlycm9yLmdldCgpLCBidWYsIGJ1Zl9sZW4pLCAwKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLmdldCgpLCBidWZfbGVuKSwgMCk7CiAgIHRyeSB7CiAgICAgemxpYl90cmFucy0+dmVyaWZ5Q2hlY2tzdW0oKTsKICAgICBCT09TVF9FUlJPUigidmVyaWZ5Q2hlY2tzdW0oKSBkaWQgbm90IHJlcG9ydCBhbiBlcnJvciIpOwpAQCAtMjA0LDEyICsyMDgsMTMgQEAKICAgfQogfQogCi12b2lkIHRlc3RfcmVhZF93cml0ZV9taXgoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBidWZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHJlYWRfZ2VuKSB7Cit2b2lkIHRlc3RfcmVhZF93cml0ZV9taXgoY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgcmVhZF9nZW4pIHsKICAgLy8gVHJ5IGl0IHdpdGggYSBtaXggb2YgcmVhZC93cml0ZSBzaXplcy4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgdW5zaWduZWQgaW50IHRvdDsKIAogICB0b3QgPSAwOwpAQCAtMjE4LDcgKzIyMyw3IEBACiAgICAgaWYgKHRvdCArIHdyaXRlX2xlbiA+IGJ1Zl9sZW4pIHsKICAgICAgIHdyaXRlX2xlbiA9IGJ1Zl9sZW4gLSB0b3Q7CiAgICAgfQotICAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiArIHRvdCwgd3JpdGVfbGVuKTsKKyAgICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCkgKyB0b3QsIHdyaXRlX2xlbik7CiAgICAgdG90ICs9IHdyaXRlX2xlbjsKICAgfQogCkBAIC0yMzQsMTkgKzIzOSwxOSBAQAogICAgIH0KICAgICB1aW50MzJfdCBnb3QgPSB6bGliX3RyYW5zLT5yZWFkKG1pcnJvci5nZXQoKSArIHRvdCwgcmVhZF9sZW4pOwogICAgIEJPT1NUX1JFUVVJUkVfTEUoZ290LCBleHBlY3RlZF9yZWFkX2xlbik7Ci0gICAgQk9PU1RfUkVRVUlSRV9ORShnb3QsICh1aW50MzJfdCkgMCk7CisgICAgQk9PU1RfUkVRVUlSRV9ORShnb3QsICh1aW50MzJfdCkwKTsKICAgICB0b3QgKz0gZ290OwogICB9CiAKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtY21wKG1pcnJvci5nZXQoKSwgYnVmLCBidWZfbGVuKSwgMCk7CisgIEJPT1NUX0NIRUNLX0VRVUFMKG1lbWNtcChtaXJyb3IuZ2V0KCksIGJ1Zi5nZXQoKSwgYnVmX2xlbiksIDApOwogICB6bGliX3RyYW5zLT52ZXJpZnlDaGVja3N1bSgpOwogfQogCi12b2lkIHRlc3RfaW52YWxpZF9jaGVja3N1bShjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF9pbnZhbGlkX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIFZlcmlmeSBjaGVja3N1bSBjaGVja2luZy4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAgIHN0cmluZyB0bXBfYnVmOwogICBtZW1idWYtPmFwcGVuZEJ1ZmZlclRvU3RyaW5nKHRtcF9idWYpOwpAQCAtMjY0LDExICsyNjksMTAgQEAKICAgLy8gKFdoZW4gdGhpcyBvY2N1cnMsIHZlcmlmeUNoZWNrc3VtKCkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nCiAgIC8vIHRoYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSBoYXNuJ3QgYmVlbiByZWFjaGVkLikgIEkgaGF2ZW4ndCBzZWVuIHRoaXMKICAgLy8gZXJyb3Igd2hlbiBvbmx5IG1vZGlmeWluZyBjaGVja3N1bSBieXRlcy4KLSAgaW50IGluZGV4ID0gdG1wX2J1Zi5zaXplKCkgLSAxOworICBpbnQgaW5kZXggPSBzdGF0aWNfY2FzdDxpbnQ+KHRtcF9idWYuc2l6ZSgpIC0gMSk7CiAgIHRtcF9idWZbaW5kZXhdKys7Ci0gIG1lbWJ1Zi0+cmVzZXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4oCi0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPih0bXBfYnVmLmRhdGEoKSkpLAotICAgICAgICAgICAgICAgICAgICAgIHRtcF9idWYubGVuZ3RoKCkpOworICBtZW1idWYtPnJlc2V0QnVmZmVyKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHRtcF9idWYuZGF0YSgpKSksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcF9idWYubGVuZ3RoKCkpKTsKIAogICBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IG1pcnJvcihuZXcgdWludDhfdFtidWZfbGVuXSk7CiAgIHRyeSB7CkBAIC0yODAsMTEgKzI4NCwxMSBAQAogICB9CiB9CiAKLXZvaWQgdGVzdF93cml0ZV9hZnRlcl9mbHVzaChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKK3ZvaWQgdGVzdF93cml0ZV9hZnRlcl9mbHVzaChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyB3cml0ZSBzb21lIGRhdGEKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7Ci0gIHpsaWJfdHJhbnMtPndyaXRlKGJ1ZiwgYnVmX2xlbik7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKIAogICAvLyBjYWxsIGZpbmlzaCgpCiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwpAQCAtMzE4LDMyICszMjIsNTIgQEAKIHZvaWQgdGVzdF9ub193cml0ZSgpIHsKICAgLy8gVmVyaWZ5IHRoYXQgbm8gZGF0YSBpcyB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpZiB3ZQogICAvLyBuZXZlciB3cml0ZSBkYXRhIHRvIHRoZSBUWmxpYlRyYW5zcG9ydC4KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgewogICAgIC8vIENyZWF0ZSBhIFRabGliVHJhbnNwb3J0IG9iamVjdCwgYW5kIGltbWVkaWF0ZWx5IGRlc3Ryb3kgaXQKICAgICAvLyB3aGVuIGl0IGdvZXMgb3V0IG9mIHNjb3BlLgogICAgIFRabGliVHJhbnNwb3J0IHdfemxpYl90cmFucyhtZW1idWYpOwogICB9CiAKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLT5hdmFpbGFibGVfcmVhZCgpLCAodWludDMyX3QpIDApOworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYtPmF2YWlsYWJsZV9yZWFkKCksICh1aW50MzJfdCkwKTsKK30KKwordm9pZCB0ZXN0X2dldF91bmRlcmx5aW5nX3RyYW5zcG9ydCgpIHsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBCT09TVF9DSEVDS19FUVVBTChtZW1idWYuZ2V0KCksIHpsaWJfdHJhbnMtPmdldFVuZGVybHlpbmdUcmFuc3BvcnQoKS5nZXQoKSk7CiB9CiAKIC8qCiAgKiBJbml0aWFsaXphdGlvbgogICovCiAKLSNkZWZpbmUgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgZnVuY3Rpb24sIC4uLikgXAotICBkbyB7IFwKLSAgICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBuYW1lX3NzOyBcCi0gICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoZnVuY3Rpb24pOyBcCi0gICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSggXAotICAgICAgICA6OnN0ZDo6dHIxOjpiaW5kKGZ1bmN0aW9uLCAjIyBfX1ZBX0FSR1NfXyksIFwKLSAgICAgICAgbmFtZV9zcy5zdHIoKSk7IFwKLSAgICAoc3VpdGUpLT5hZGQodGMpOyBcCisjaWYgKEJPT1NUX1ZFUlNJT04gPj0gMTA1OTAwKQorI2RlZmluZSBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCBfRlVOQywgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpvc3RyaW5nc3RyZWFtIG5hbWVfc3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWVfc3MgPDwgbmFtZSA8PCAiLSIgPDwgQk9PU1RfU1RSSU5HSVpFKF9GVU5DKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDo6c3RkOjpmdW5jdGlvbjx2b2lkICgpPiB0ZXN0X2Z1bmMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDo6c3RkOjpiaW5kKF9GVU5DLCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3RfY2FzZSogdGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgPSA6OmJvb3N0Ojp1bml0X3Rlc3Q6Om1ha2VfdGVzdF9jYXNlKHRlc3RfZnVuYywgbmFtZV9zcy5zdHIoKSwgX19GSUxFX18sIF9fTElORV9fKTsgICAgICAgIFwKKyAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIF9GVU5DLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OnN0ZDo6YmluZChfRlVOQywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3Muc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgogCi12b2lkIGFkZF90ZXN0cyh1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlLAotICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmLAordm9pZCBhZGRfdGVzdHMoYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUsCisgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+JiBidWYsCiAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAogICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgewogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X3dyaXRlX3RoZW5fcmVhZCwgYnVmLCBidWZfbGVuKTsKQEAgLTM1MiwyMCArMzc2LDMwIEBACiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3RfaW52YWxpZF9jaGVja3N1bSwgYnVmLCBidWZfbGVuKTsKICAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSwgdGVzdF93cml0ZV9hZnRlcl9mbHVzaCwgYnVmLCBidWZfbGVuKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplXzMyayhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDE8PDE1KSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItY29uc3RhbnQiLAotICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsIGJ1ZiwgYnVmX2xlbiwKLSAgICAgICAgICAgICAgICBzaXplXzMyaywgc2l6ZV8zMmspOwotICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItbG9nbm9ybWFsLXdyaXRlIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsIHNpemVfMzJrKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWxvZ25vcm1hbC1yZWFkIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV8zMmssIHNpemVfbG9nbm9ybWFsKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWxvZ25vcm1hbC1ib3RoIiwKLSAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sCi0gICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsIHNpemVfbG9nbm9ybWFsKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplXzMyayhuZXcgQ29uc3RhbnRTaXplR2VuZXJhdG9yKDEgPDwgMTUpKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiBzaXplX2xvZ25vcm1hbChuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWNvbnN0YW50IiwgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLCBzaXplXzMyaywgc2l6ZV8zMmspOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtd3JpdGUiLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgc2l6ZV9sb2dub3JtYWwsCisgICAgICAgICAgICAgICAgc2l6ZV8zMmspOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtcmVhZCIsCisgICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwKKyAgICAgICAgICAgICAgICBidWYsCisgICAgICAgICAgICAgICAgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICBzaXplXzMyaywKKyAgICAgICAgICAgICAgICBzaXplX2xvZ25vcm1hbCk7CisgIEFERF9URVNUX0NBU0Uoc3VpdGUsCisgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC1ib3RoIiwKKyAgICAgICAgICAgICAgICB0ZXN0X3JlYWRfd3JpdGVfbWl4LAorICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICBidWZfbGVuLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsLAorICAgICAgICAgICAgICAgIHNpemVfbG9nbm9ybWFsKTsKIAogICAvLyBUZXN0IHdpdGggYSByYW5kb20gc2l6ZSBkaXN0cmlidXRpb24sCiAgIC8vIGJ1dCB1c2UgdGhlIGV4YWN0IHNhbWUgZGlzdHJpYnV0aW9uIGZvciByZWFkaW5nIGFzIGZvciB3cml0aW5nLgpAQCAtMzczLDExICs0MDcsMTUgQEAKICAgLy8gQmVjYXVzZSB0aGUgU2l6ZUdlbmVyYXRvciBtYWtlcyBhIGNvcHkgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLAogICAvLyBib3RoIFNpemVHZW5lcmF0b3JzIHNob3VsZCByZXR1cm4gdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHZhbHVlcywgc2luY2UgdGhleQogICAvLyBib3RoIHN0YXJ0IHdpdGggcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGluIHRoZSBzYW1lIHN0YXRlLgotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gcmVhZF9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKLSAgQUREX1RFU1RfQ0FTRShzdWl0ZSwgbmFtZSA8PCAiLWxvZ25vcm1hbC1zYW1lLWRpc3RyaWJ1dGlvbiIsCi0gICAgICAgICAgICAgICAgdGVzdF9yZWFkX3dyaXRlX21peCwgYnVmLCBidWZfbGVuLAotICAgICAgICAgICAgICAgIHdyaXRlX3NpemVfZ2VuLCByZWFkX3NpemVfZ2VuKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiByZWFkX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBBRERfVEVTVF9DQVNFKHN1aXRlLAorICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtc2FtZS1kaXN0cmlidXRpb24iLAorICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCisgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgIGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgd3JpdGVfc2l6ZV9nZW4sCisgICAgICAgICAgICAgICAgcmVhZF9zaXplX2dlbik7CiB9CiAKIHZvaWQgcHJpbnRfdXNhZ2UoRklMRSogZiwgY29uc3QgY2hhciogYXJndjApIHsKQEAgLTM4Nyw2NCArNDI1LDQ1IEBACiAgIGZwcmludGYoZiwgIiAgLS1oZWxwXG4iKTsKIH0KIAotdm9pZCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgdWludDMyX3Qgc2VlZCA9IDA7Ci0gIGJvb2wgaGFzX3NlZWQgPSBmYWxzZTsKLQotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0gewotICAgIHsgImhlbHAiLCBmYWxzZSwgTlVMTCwgJ2gnIH0sCi0gICAgeyAic2VlZCIsIHRydWUsIE5VTEwsICdzJyB9LAotICAgIHsgTlVMTCwgMCwgTlVMTCwgMCB9Ci0gIH07Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBvcHRvcHQgPSAxOwotICAgIGludCBvcHRjaGFyID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhzOiIsIGxvbmdfb3B0cywgTlVMTCk7Ci0gICAgaWYgKG9wdGNoYXIgPT0gLTEpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCAob3B0Y2hhcikgewotICAgICAgY2FzZSAncyc6IHsKLSAgICAgICAgY2hhciAqZW5kcHRyOwotICAgICAgICBzZWVkID0gc3RydG9sKG9wdGFyZywgJmVuZHB0ciwgMCk7Ci0gICAgICAgIGlmIChlbmRwdHIgPT0gb3B0YXJnIHx8ICplbmRwdHIgIT0gJ1wwJykgewotICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBzZWVkIHZhbHVlIFwiJXNcIjogbXVzdCBiZSBhIHBvc2l0aXZlICIKLSAgICAgICAgICAgICAgICAgICJpbnRlZ2VyXG4iLCBvcHRhcmcpOwotICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaGFzX3NlZWQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJ2gnOgotICAgICAgICBwcmludF91c2FnZShzdGRvdXQsIGFyZ3ZbMF0pOwotICAgICAgICBleGl0KDApOwotICAgICAgY2FzZSAnPyc6Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBPbmx5IGhhcHBlbnMgaWYgc29tZW9uZSBhZGRzIGFub3RoZXIgb3B0aW9uIHRvIHRoZSBvcHRhcmcgc3RyaW5nLAotICAgICAgICAvLyBidXQgZG9lc24ndCB1cGRhdGUgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdG8gaGFuZGxlIGl0LgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gb3B0aW9uIFwiLSVjXCJcbiIsIG9wdGNoYXIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgfQotCi0gIGlmICghaGFzX3NlZWQpIHsKLSAgICBzZWVkID0gdGltZShOVUxMKTsKLSAgfQotCisjaWZkZWYgQk9PU1RfVEVTVF9EWU5fTElOSworYm9vbCBpbml0X3VuaXRfdGVzdF9zdWl0ZSgpIHsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKICAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKICAgcm5nLnNlZWQoc2VlZCk7Ci19CiAKLXVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogaW5pdF91bml0X3Rlc3Rfc3VpdGUoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotICBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwotCi0gIHVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPQotICAgICZib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCk7CisgIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIHN1aXRlID0gJmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKTsKICAgc3VpdGUtPnBfbmFtZS52YWx1ZSA9ICJabGliVGVzdCI7CiAKLSAgdWludDMyX3QgYnVmX2xlbiA9IDEwMjQqMzI7CisgIHVpbnQzMl90IGJ1Zl9sZW4gPSAxMDI0ICogMzI7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3VuaWZvcm1fYnVmZmVyKGJ1Zl9sZW4sICdhJyksIGJ1Zl9sZW4sICJ1bmlmb3JtIik7CisgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX2NvbXByZXNzaWJsZV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJjb21wcmVzc2libGUiKTsKKyAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fcmFuZG9tX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgInJhbmRvbSIpOworCisgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfbm9fd3JpdGUpKTsKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworaW50IG1haW4oIGludCBhcmdjLCBjaGFyKiBhcmd2W10gKSB7CisgIHJldHVybiA6OmJvb3N0Ojp1bml0X3Rlc3Q6OnVuaXRfdGVzdF9tYWluKCZpbml0X3VuaXRfdGVzdF9zdWl0ZSxhcmdjLGFyZ3YpOworfQorI2Vsc2UKK2Jvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgdWludDMyX3Qgc2VlZCA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0aW1lKE5VTEwpKTsKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyAgcHJpbnRmKCJzZWVkOiAlIiBQUkl1MzIgIlxuIiwgc2VlZCk7CisjZW5kaWYKKyAgcm5nLnNlZWQoc2VlZCk7CisKKyAgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZSogc3VpdGUgPSAmYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpOworICBzdWl0ZS0+cF9uYW1lLnZhbHVlID0gIlpsaWJUZXN0IjsKKworICB1aW50MzJfdCBidWZfbGVuID0gMTAyNCAqIDMyOwogICBhZGRfdGVzdHMoc3VpdGUsIGdlbl91bmlmb3JtX2J1ZmZlcihidWZfbGVuLCAnYScpLCBidWZfbGVuLCAidW5pZm9ybSIpOwogICBhZGRfdGVzdHMoc3VpdGUsIGdlbl9jb21wcmVzc2libGVfYnVmZmVyKGJ1Zl9sZW4pLCBidWZfbGVuLCAiY29tcHJlc3NpYmxlIik7CiAgIGFkZF90ZXN0cyhzdWl0ZSwgZ2VuX3JhbmRvbV9idWZmZXIoYnVmX2xlbiksIGJ1Zl9sZW4sICJyYW5kb20iKTsKQEAgLTQ1MywzICs0NzIsNCBAQAogCiAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MWVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvTXV0ZXhUZXN0LmNwcApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBUaGlzIGlzIGxpbmtlZCBpbnRvIHRoZSBVbml0VGVzdHMgdGVzdCBleGVjdXRhYmxlCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitzdHJ1Y3QgTEZBVAoreworICBMRkFUKCkKKyAgICA6IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUikKKyAgeworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXgsIDApKTsKKyAgICBCT09TVF9DSEVDS19FUVVBTCgwLCBwdGhyZWFkX2NvbmRfaW5pdCgmY3YsIDApKTsKKyAgfQorCisgIE11dGV4IHV1dDsKKyAgcHRocmVhZF9tdXRleF90IG14OworICBwdGhyZWFkX2NvbmRfdCBjdjsKK307CisKKy8vIEhlbHBlciBmb3IgdGVzdGluZyBtdXRleCBiZWhhdmlvciB3aGVuIGxvY2tlZCBieSBhbm90aGVyIHRocmVhZAordm9pZCAqIGxvY2tGcm9tQW5vdGhlclRocmVhZCh2b2lkICpwdHIpCit7CisgIHN0cnVjdCBMRkFUICpsZmF0ID0gKExGQVQgKilwdHI7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfbXV0ZXhfbG9jaygmbGZhdC0+bXgpKTsgICAgICAgICAgIC8vIHN5bmNocm9uaXplIHdpdGggdGVzdGluZyB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LT5jdikpOyAgICAgICAgICAvLyB0ZWxsIHRlc3RpbmcgdGhyZWFkIHdlIGhhdmUgbG9ja2VkIHRoZSBtdXRleAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC0+Y3YsICZsZmF0LT5teCkpOyAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byBzaWduYWwgY29uZGl0aW9uIHZhcmlhYmxlIHRlbGxpbmcgdXMgdG8gdW5sb2NrCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LT51dXQudW5sb2NrKCkpOworICByZXR1cm4gcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0aW5nIHRocmVhZCBzaG91bGQgam9pbiB0byBlbnN1cmUgY29tcGxldGVuZXNzCit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShNdXRleFRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKGhhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6RVJST1JDSEVDS19JTklUSUFMSVpFUik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZCB0byB0ZXN0IHVubG9ja2luZyB0d2ljZSB3aXRob3V0IHVuZGVmaW5lZCBiZWhhdmlvcgorCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIHV1dC5sb2NrKCksIFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKTsgICAgICAgLy8gRURFQURMSyAodGhpcyB0aHJlYWQgb3ducyBpdCkKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHJlY3Vyc2l2ZV9oYXBweV9wYXRoKQoreworICBNdXRleCB1dXQoTXV0ZXg6OlJFQ1VSU0lWRV9JTklUSUFMSVpFUik7CisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodHJ5bG9jaykKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpBREFQVElWRV9JTklUSUFMSVpFUik7ICAgLy8ganVzdCB1c2luZyBhbm90aGVyIGluaXRpYWxpemVyIGZvciBjb3ZlcmFnZQorCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQudHJ5bG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIXV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGltZWRsb2NrKQoreworICBwdGhyZWFkX3QgdGg7CisgIHN0cnVjdCBMRkFUIGxmYXQ7CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsKKyAgQk9PU1RfQ0hFQ0tfVEhST1cgICAoIGxmYXQudXV0LnRpbWVkbG9jaygxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAgICAgICAgICAgICAvLyBFREVBRExLIChjdXJyZW50IHRocmVhZCBvd25zIG11dGV4IC0gbG9naWMgZXJyb3IpCisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCBsZmF0LnV1dC51bmxvY2soKSk7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0Lm14KSk7ICAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCBoZWxwZXIgdGhyZWFkCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY3JlYXRlKCZ0aCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrRnJvbUFub3RoZXJUaHJlYWQsICZsZmF0KSk7ICAgICAgICAgLy8gY3JlYXRlIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jb25kX3dhaXQoJmxmYXQuY3YsICZsZmF0Lm14KSk7ICAgLy8gd2FpdCBmb3IgaGVscGVyIHRocmVhZCB0byBsb2NrIG11dGV4CisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIWxmYXQudXV0LnRpbWVkbG9jaygxMDApKTsgICAgICAgICAgICAgICAgICAgLy8gZmFsc2U6IGFub3RoZXIgdGhyZWFkIG93bnMgdGhlIGxvY2sKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfc2lnbmFsKCZsZmF0LmN2KSk7ICAgICAgICAgICAvLyB0ZWxsIGhlbHBlciB0aHJlYWQgd2UgYXJlIGRvbmUKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF91bmxvY2soJmxmYXQubXgpKTsgICAgICAgICAgLy8gbGV0IGhlbHBlciB0aHJlYWQgY2xlYW4gdXAKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9qb2luKHRoLCAwKSk7ICAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGVzdGluZyB0aHJlYWQgdG8gdW5sb2NrIGFuZCBiZSBkb25lCit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHVuZGVybHlpbmcpCit7CisgIE11dGV4IHV1dDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggdXV0LmdldFVuZGVybHlpbmdJbXBsKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWEyMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oIgorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGU7Cit1c2luZyBib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlOworCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OworCitjbGFzcyBMb2NrZXIgOiBwdWJsaWMgUnVubmFibGUgeworcHJvdGVjdGVkOgorICBMb2NrZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrLCBib29sIHdyaXRlcikKKyAgICA6IHJ3bG9ja18ocndsb2NrKSwgd3JpdGVyXyh3cml0ZXIpLCBzdGFydGVkXyhmYWxzZSksIGdvdExvY2tfKGZhbHNlKSwgc2lnbmFsZWRfKGZhbHNlKSB7fQorCitwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgc3RhcnRlZF8gPSB0cnVlOworICAgIGlmICh3cml0ZXJfKSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlV3JpdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgcndsb2NrXy0+YWNxdWlyZVJlYWQoKTsKKyAgICB9CisgICAgZ290TG9ja18gPSB0cnVlOworICAgIHdoaWxlICghc2lnbmFsZWRfKSB7CisgICAgICB1c2xlZXAoNTAwMCk7CisgICAgfQorICAgIHJ3bG9ja18tPnJlbGVhc2UoKTsKKyAgfQorCisgIGJvb2wgc3RhcnRlZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXJ0ZWRfOyB9CisgIGJvb2wgZ290TG9jaygpIGNvbnN0IHsgcmV0dXJuIGdvdExvY2tfOyB9CisgIHZvaWQgc2lnbmFsKCkgeyBzaWduYWxlZF8gPSB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrXzsKKyAgYm9vbCB3cml0ZXJfOworICB2b2xhdGlsZSBib29sIHN0YXJ0ZWRfOworICB2b2xhdGlsZSBib29sIGdvdExvY2tfOworICB2b2xhdGlsZSBib29sIHNpZ25hbGVkXzsKK307CisKK2NsYXNzIFJlYWRlciA6IHB1YmxpYyBMb2NrZXIgeworcHVibGljOgorICBSZWFkZXIoc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIGZhbHNlKSB7fQorfTsKKworY2xhc3MgV3JpdGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFdyaXRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgdHJ1ZSkge30KK307CisKK3ZvaWQgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpQT0xJQ1kgcG9saWN5KSB7CisgIC8vIHRoZSBtYW4gcGFnZXMgZm9yIHB0aHJlYWRfd3Jsb2NrX3JkbG9jayBzdWdnZXN0IHRoYXQgYW55IE9TIGd1YXJhbnRlZSBhYm91dAorICAvLyB3cml0ZXIgc3RhcnZhdGlvbiBtYXkgYmUgaW5mbHVlbmNlZCBieSB0aGUgc2NoZWR1bGluZyBwb2xpY3ksIHNvIGxldCdzIHRyeQorICAvLyBhbGwgMyBwb2xpY2llcyB0byBzZWUgaWYgYW55IG9mIHRoZW0gd29yay4KKyAgUG9zaXhUaHJlYWRGYWN0b3J5IGZhY3RvcnkocG9saWN5KTsKKyAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKG5ldyBOb1N0YXJ2ZVJlYWRXcml0ZU11dGV4KCkpOworCisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIxKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIyKG5ldyBSZWFkZXIocndsb2NrKSk7CisgIHNoYXJlZF9wdHI8V3JpdGVyPiB3cml0ZXIobmV3IFdyaXRlcihyd2xvY2spKTsKKworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjEgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIxKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRyZWFkZXIyID0gZmFjdG9yeS5uZXdUaHJlYWQocmVhZGVyMik7CisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0d3JpdGVyID0gZmFjdG9yeS5uZXdUaHJlYWQod3JpdGVyKTsKKworICAvLyBsYXVuY2ggYSByZWFkZXIgYW5kIG1ha2Ugc3VyZSBoZSBoYXMgdGhlIGxvY2sKKyAgdHJlYWRlcjEtPnN0YXJ0KCk7CisgIHdoaWxlICghcmVhZGVyMS0+Z290TG9jaygpKSB7CisgICAgdXNsZWVwKDIwMDApOworICB9CisKKyAgLy8gbGF1bmNoIGEgd3JpdGVyIGFuZCBtYWtlIHN1cmUgaGUncyBibG9ja2VkIG9uIHRoZSBsb2NrCisgIHR3cml0ZXItPnN0YXJ0KCk7CisgIHdoaWxlICghd3JpdGVyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gdHJpY2t5IHBhcnQuLi4gd2UgY2FuIG5ldmVyIGJlIDEwMCUgc3VyZSB0aGF0IHRoZSB3cml0ZXIgaXMgYWN0dWFsbHkKKyAgLy8gYmxvY2tlZCBvbiB0aGUgbG9jaywgYnV0IHdlIGNhbiBwcmV0dHkgcmVhc29uYWJseSBzdXJlIGJlY2F1c2Ugd2Uga25vdworICAvLyBoZSBqdXN0IGV4ZWN1dGVkIHRoZSBsaW5lIGltbWVkaWF0ZWx5IGJlZm9yZSBnZXR0aW5nIHRoZSBsb2NrLCBhbmQKKyAgLy8gd2UnbGwgd2FpdCBhIGZ1bGwgc2Vjb25kIGZvciBoaW0gdG8gZ2V0IG9uIGl0LgorICBzbGVlcCgxKTsKKworICAvLyBsYXVuY2ggYSBzZWNvbmQgcmVhZGVyLi4uIGlmIHRoZSBSV011dGV4IGd1YXJhbnRlZXMgdGhhdCB3cml0ZXJzIHdvbid0CisgIC8vIHN0YXJ2ZSwgdGhpcyByZWFkZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGFjcXVpcmUgdGhlIGxvY2sgdW50aWwgdGhlIHdyaXRlcgorICAvLyBoYXMgYWNxdWlyZWQgYW5kIHJlbGVhc2VkIGl0LgorICB0cmVhZGVyMi0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIyLT5zdGFydGVkKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKyAgLy8gYWdhaW4uLi4gY2FuJ3QgYmUgMTAwJSBzdXJlIHRoZSByZWFkZXIgaXMgd2FpdGluZyBvbiAob3IgaGFzKSB0aGUgbG9jaworICAvLyBidXQgd2UgY2FuIGJlIGNsb3NlLgorICBzbGVlcCgxKTsKKworICAvLyB0ZWxsIHJlYWRlciAxIHRvIGxldCBnbyBvZiB0aGUgbG9jaworICByZWFkZXIxLT5zaWduYWwoKTsKKworICAvLyB3YWl0IGZvciBzb21lb25lIHRvIGdldCB0aGUgbG9jaworICB3aGlsZSAoIXJlYWRlcjItPmdvdExvY2soKSAmJiAhd3JpdGVyLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyB0aGUgdGVzdCBzdWNjZWVkZWQgaWYgdGhlIFdSSVRFUiBnb3QgdGhlIGxvY2suCisgIGJvb2wgc3VjY2VzcyA9IHdyaXRlci0+Z290TG9jaygpOworCisgIC8vIHRlbGwgZXZlcnlvbmUgd2UncmUgZG9uZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBmaW5pc2gKKyAgcmVhZGVyMi0+c2lnbmFsKCk7CisgIHdyaXRlci0+c2lnbmFsKCk7CisgIHRyZWFkZXIxLT5qb2luKCk7CisgIHRyZWFkZXIyLT5qb2luKCk7CisgIHR3cml0ZXItPmpvaW4oKTsKKworICAvLyBtYWtlIHN1cmUgaXQgd29ya2VkLgorICBCT09TVF9DSEVDS19NRVNTQUdFKHN1Y2Nlc3MsICJ3cml0ZXIgaXMgc3RhcnZpbmciKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJXTXV0ZXhTdGFydmVUZXN0KQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9vdGhlcikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6Ok9USEVSKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfcnIpIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpST1VORF9ST0JJTik7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX2ZpZm8pIHsKKyAgdGVzdF9zdGFydmUoUG9zaXhUaHJlYWRGYWN0b3J5OjpGSUZPKTsKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcAppbmRleCBjODBiYjg4Li5mYzBiYTdmIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAKQEAgLTI1LDExICsyNSwxNSBAQAogI2luY2x1ZGUgIlRpbWVyTWFuYWdlclRlc3RzLmgiCiAjaW5jbHVkZSAiVGhyZWFkTWFuYWdlclRlc3RzLmgiCiAKKy8vIFRoZSB0ZXN0IHdlaWdodCwgd2hlcmUgMTAgaXMgMTAgdGltZXMgbW9yZSB0aHJlYWRzIHRoYW4gYmFzZWxpbmUKKy8vIGFuZCB0aGUgYmFzZWxpbmUgaXMgb3B0aW1pemVkIGZvciBydW5uaW5nIGluIHZhbGdyaW5kCitzdGF0aWMgaW50IFdFSUdIVCA9IDEwOworCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKIAogICBzdGQ6OnN0cmluZyBhcmc7CiAKLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICBhcmdzKGFyZ2MgLSAxID4gMSA/IGFyZ2MgLSAxIDogMSk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzKGFyZ2MgLSAxID4gMSA/IGFyZ2MgLSAxIDogMSk7CiAKICAgYXJnc1swXSA9ICJhbGwiOwogCkBAIC0zNyw2ICs0MSwxMSBAQAogICAgIGFyZ3NbaXggLSAxXSA9IHN0ZDo6c3RyaW5nKGFyZ3ZbaXhdKTsKICAgfQogCisgIGlmIChnZXRlbnYoIlZBTEdSSU5EIikgIT0gMCkgeworCSAgLy8gbG93ZXIgdGhlIHNjYWxlIG9mIGV2ZXJ5IHRlc3QKKwkgIFdFSUdIVCA9IDE7CisgIH0KKwogICBib29sIHJ1bkFsbCA9IGFyZ3NbMF0uY29tcGFyZSgiYWxsIikgPT0gMDsKIAogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLWZhY3RvcnkiKSA9PSAwKSB7CkBAIC00NSwyNSArNTQsMzggQEAKIAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkRmFjdG9yeSB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCi0gICAgc2l6ZV90IGNvdW50ID0gIDEwMDA7Ci0gICAgc2l6ZV90IGZsb29kTG9vcHMgPSAgMTsKLSAgICBzaXplX3QgZmxvb2RDb3VudCA9ICAxMDAwMDA7CisgICAgaW50IHJlYXBMb29wcyA9IDIgKiBXRUlHSFQ7CisgICAgaW50IHJlYXBDb3VudCA9IDEwMCAqIFdFSUdIVDsKKyAgICBzaXplX3QgZmxvb2RMb29wcyA9IDM7CisgICAgc2l6ZV90IGZsb29kQ291bnQgPSA1MDAgKiBXRUlHSFQ7CiAKLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGNvdW50IDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHJlYXAgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IHJlYXBMb29wcyA8PCAieCIgPDwgcmVhcENvdW50IDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKGNvdW50KSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMucmVhcE5UaHJlYWRzKHJlYXBMb29wcywgcmVhcENvdW50KSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgcmVhcCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLSAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IGZsb29kTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZEZhY3RvcnkgZmxvb2QgTiB0aHJlYWRzIHRlc3Q6IE4gPSAiIDw8IGZsb29kTG9vcHMgPDwgIngiIDw8IGZsb29kQ291bnQgPDwgc3RkOjplbmRsOwogCi0gICAgYXNzZXJ0KHRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5mbG9vZE5UZXN0KGZsb29kTG9vcHMsIGZsb29kQ291bnQpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHR0VGhyZWFkRmFjdG9yeSBmbG9vZCBOIHRocmVhZHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IHN5bmNocm9ub3VzIHN0YXJ0IHRlc3QiIDw8IHN0ZDo6ZW5kbDsKIAotICAgIGFzc2VydCh0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSk7CisgICAgaWYgKCF0aHJlYWRGYWN0b3J5VGVzdHMuc3luY2hTdGFydFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3Rvcnkgc3luY2hyb25vdXMgc3RhcnQgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRGYWN0b3J5IG1vbml0b3IgdGltZW91dCB0ZXN0IiA8PCBzdGQ6OmVuZGw7CiAKLSAgICBhc3NlcnQodGhyZWFkRmFjdG9yeVRlc3RzLm1vbml0b3JUaW1lb3V0VGVzdCgpKTsKKyAgICBpZiAoIXRocmVhZEZhY3RvcnlUZXN0cy5tb25pdG9yVGltZW91dFRlc3QoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0dFRocmVhZEZhY3RvcnkgbW9uaXRvciB0aW1lb3V0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CisgICAgfQogICB9CiAKICAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInV0aWwiKSA9PSAwKSB7CkBAIC04OSw3ICsxMTEsNiBAQAogICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0c2NhbGwgcGVyIG1zOiAiIDw8IGNvdW50IC8gKHRpbWUwMSAtIHRpbWUwMCkgPDwgc3RkOjplbmRsOwogICB9CiAKLQogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGltZXItbWFuYWdlciIpID09IDApIHsKIAogICAgIHN0ZDo6Y291dCA8PCAiVGltZXJNYW5hZ2VyIHRlc3RzLi4uIiA8PCBzdGQ6OmVuZGw7CkBAIC05OCw3ICsxMTksMzggQEAKIAogICAgIFRpbWVyTWFuYWdlclRlc3RzIHRpbWVyTWFuYWdlclRlc3RzOwogCi0gICAgYXNzZXJ0KHRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKTsKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAxIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAyIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMigpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDAzIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwMygpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdDA0IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBpZiAoIXRpbWVyTWFuYWdlclRlc3RzLnRlc3QwNCgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaW1lck1hbmFnZXIgdGVzdHMgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAgIH0KIAogICBpZiAocnVuQWxsIHx8IGFyZ3NbMF0uY29tcGFyZSgidGhyZWFkLW1hbmFnZXIiKSA9PSAwKSB7CkBAIC0xMDYsMjMgKzE1OCwzNCBAQAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCiAgICAgewotCi0gICAgICBzaXplX3Qgd29ya2VyQ291bnQgPSAxMDA7Ci0KLSAgICAgIHNpemVfdCB0YXNrQ291bnQgPSAxMDAwMDA7Ci0KKyAgICAgIHNpemVfdCB3b3JrZXJDb3VudCA9IDEwICogV0VJR0hUOworICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDUwMCAqIFdFSUdIVDsKICAgICAgIGludDY0X3QgZGVsYXkgPSAxMExMOwogCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7Ci0KICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CiAKLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpKTsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpIHRlc3Q6IiA8PCBzdGQ6OmVuZGw7CiAKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYmxvY2sgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgZGVsYXk6ICIgPDwgZGVsYXkgPDwgc3RkOjplbmRsOworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMuYXBpVGVzdCgpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRocmVhZE1hbmFnZXIgYXBpVGVzdCBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CiAKLSAgICAgIGFzc2VydCh0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpOworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBsb2FkIHRlc3Q6IHdvcmtlciBjb3VudDogIiA8PCB3b3JrZXJDb3VudAorICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CiAKKyAgICAgIGlmICghdGhyZWFkTWFuYWdlclRlc3RzLmxvYWRUZXN0KHRhc2tDb3VudCwgZGVsYXksIHdvcmtlckNvdW50KSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKworICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9jayB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICA8PCAiIGRlbGF5OiAiIDw8IGRlbGF5IDw8IHN0ZDo6ZW5kbDsKKworICAgICAgaWYgKCF0aHJlYWRNYW5hZ2VyVGVzdHMuYmxvY2tUZXN0KGRlbGF5LCB3b3JrZXJDb3VudCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0VGhyZWFkTWFuYWdlciBibG9ja1Rlc3QgRkFJTEVEIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xMzQsMjIgKzE5NywzMCBAQAogCiAgICAgICBzaXplX3QgbWluV29ya2VyQ291bnQgPSAyOwogCi0gICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA1MTI7CisgICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA4OwogCi0gICAgICBzaXplX3QgdGFza3NQZXJXb3JrZXIgPSAxMDAwOworICAgICAgc2l6ZV90IHRhc2tzUGVyV29ya2VyID0gMTAwICogV0VJR0hUOwogCi0gICAgICBpbnQ2NF90IGRlbGF5ID0gMTBMTDsKKyAgICAgIGludDY0X3QgZGVsYXkgPSA1TEw7CiAKLSAgICAgIGZvciAoc2l6ZV90IHdvcmtlckNvdW50ID0gbWluV29ya2VyQ291bnQ7IHdvcmtlckNvdW50IDwgbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50Kj0gMikgeworICAgICAgZm9yIChzaXplX3Qgd29ya2VyQ291bnQgPSBtaW5Xb3JrZXJDb3VudDsgd29ya2VyQ291bnQgPD0gbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50ICo9IDQpIHsKIAogICAgICAgICBzaXplX3QgdGFza0NvdW50ID0gd29ya2VyQ291bnQgKiB0YXNrc1BlcldvcmtlcjsKIAotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWQgdGVzdDogd29ya2VyIGNvdW50OiAiIDw8IHdvcmtlckNvdW50IDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRocmVhZE1hbmFnZXIgbG9hZCB0ZXN0OiB3b3JrZXIgY291bnQ6ICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgICAgICAgICAgIDw8ICIgdGFzayBjb3VudDogIiA8PCB0YXNrQ291bnQgPDwgIiBkZWxheTogIiA8PCBkZWxheSA8PCBzdGQ6OmVuZGw7CiAKICAgICAgICAgVGhyZWFkTWFuYWdlclRlc3RzIHRocmVhZE1hbmFnZXJUZXN0czsKIAotICAgICAgICB0aHJlYWRNYW5hZ2VyVGVzdHMubG9hZFRlc3QodGFza0NvdW50LCBkZWxheSwgd29ya2VyQ291bnQpOworICAgICAgICBpZiAoIXRocmVhZE1hbmFnZXJUZXN0cy5sb2FkVGVzdCh0YXNrQ291bnQsIGRlbGF5LCB3b3JrZXJDb3VudCkpCisgICAgICAgIHsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRUaHJlYWRNYW5hZ2VyIGxvYWRUZXN0IEZBSUxFRCIgPDwgc3RkOjplbmRsOworICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CisKKyAgc3RkOjpjb3V0IDw8ICJBTEwgVEVTVFMgUEFTU0VEIiA8PCBzdGQ6OmVuZGw7CisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCmluZGV4IGI3ZTg3M2YuLmJhOTg1MDIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAorKysgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKQEAgLTE3LDIwICsxNywyMyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+CiAKICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIC8qKgpAQCAtNDEsMTMyICs0NCw4NCBAQAogY2xhc3MgVGhyZWFkRmFjdG9yeVRlc3RzIHsKIAogcHVibGljOgotCi0gIHN0YXRpYyBjb25zdCBkb3VibGUgRVJST1I7Ci0KLSAgY2xhc3MgVGFzazogcHVibGljIFJ1bm5hYmxlIHsKLQotICBwdWJsaWM6Ci0KLSAgICBUYXNrKCkge30KLQotICAgIHZvaWQgcnVuKCkgewotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRIZWxsbyBXb3JsZCIgPDwgc3RkOjplbmRsOwotICAgIH0KLSAgfTsKLQotICAvKioKLSAgICogSGVsbG8gd29ybGQgdGVzdAotICAgKi8KLSAgYm9vbCBoZWxsb1dvcmxkVGVzdCgpIHsKLQotICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7Ci0KLSAgICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBzaGFyZWRfcHRyPFRhc2s+KG5ldyBUaHJlYWRGYWN0b3J5VGVzdHM6OlRhc2soKSk7Ci0KLSAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7Ci0KLSAgICB0aHJlYWQtPnN0YXJ0KCk7Ci0KLSAgICB0aHJlYWQtPmpvaW4oKTsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0U3VjY2VzcyEiIDw8IHN0ZDo6ZW5kbDsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KICAgLyoqCiAgICAqIFJlYXAgTiB0aHJlYWRzCiAgICAqLwotICBjbGFzcyBSZWFwTlRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGNsYXNzIFJlYXBOVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKLSAgIHB1YmxpYzoKLQotICAgIFJlYXBOVGFzayhNb25pdG9yJiBtb25pdG9yLCBpbnQmIGFjdGl2ZUNvdW50KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9jb3VudChhY3RpdmVDb3VudCkge30KKyAgcHVibGljOgorICAgIFJlYXBOVGFzayhNb25pdG9yJiBtb25pdG9yLCBpbnQmIGFjdGl2ZUNvdW50KSA6IF9tb25pdG9yKG1vbml0b3IpLCBfY291bnQoYWN0aXZlQ291bnQpIHt9CiAKICAgICB2b2lkIHJ1bigpIHsKICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgX2NvdW50LS07Ci0KLSAgICAgIC8vc3RkOjpjb3V0IDw8ICJcdFx0XHR0aHJlYWQgY291bnQ6ICIgPDwgX2NvdW50IDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgaWYgKF9jb3VudCA9PSAwKSB7CisgICAgICAKKyAgICAgIGlmICgtLV9jb3VudCA9PSAwKSB7CiAgICAgICAgIF9tb25pdG9yLm5vdGlmeSgpOwogICAgICAgfQogICAgIH0KIAogICAgIE1vbml0b3ImIF9tb25pdG9yOwotCiAgICAgaW50JiBfY291bnQ7CiAgIH07CiAKLSAgYm9vbCByZWFwTlRocmVhZHMoaW50IGxvb3A9MSwgaW50IGNvdW50PTEwKSB7CisgIGJvb2wgcmVhcE5UaHJlYWRzKGludCBsb29wID0gMSwgaW50IGNvdW50ID0gMTApIHsKIAotICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOworICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CisgICAgc2hhcmVkX3B0cjxNb25pdG9yPiBtb25pdG9yKG5ldyBNb25pdG9yKTsKIAotICAgIE1vbml0b3IqIG1vbml0b3IgPSBuZXcgTW9uaXRvcigpOworICAgIGZvciAoaW50IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CiAKLSAgICBmb3IoaW50IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CisgICAgICBpbnQgYWN0aXZlQ291bnQgPSAwOwogCi0gICAgICBpbnQqIGFjdGl2ZUNvdW50ICA9IG5ldyBpbnQoY291bnQpOwotCi0gICAgICBzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOwotCisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZD4gPiB0aHJlYWRzOwogICAgICAgaW50IHRpeDsKIAogICAgICAgZm9yICh0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICB0aHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5Lm5ld1RocmVhZChzaGFyZWRfcHRyPFJ1bm5hYmxlPihuZXcgUmVhcE5UYXNrKCptb25pdG9yLCAqYWN0aXZlQ291bnQpKSkpOwotICAgICAgICB9IGNhdGNoKFN5c3RlbVJlc291cmNlRXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRmYWlsZWQgdG8gY3JlYXRlICIgPDwgbGl4ICogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgKythY3RpdmVDb3VudDsKKyAgICAgICAgICB0aHJlYWRzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4obmV3IFJlYXBOVGFzaygqbW9uaXRvciwgYWN0aXZlQ291bnQpKSkpOworICAgICAgICB9IGNhdGNoIChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIGNyZWF0ZSAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICB0aXggPSAwOwotICAgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gdGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gdGhyZWFkcy5lbmQoKTsgdGl4KyssICsrdGhyZWFkKSB7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CisgICAgICAgICAgIHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOworICAgICAgICAgICB0aXgrKywgKyt0aHJlYWQpIHsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICgqdGhyZWFkKS0+c3RhcnQoKTsKLSAgICAgICAgfSBjYXRjaChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgewotICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICB9IGNhdGNoIChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKCptb25pdG9yKTsKLSAgICAgICAgd2hpbGUgKCphY3RpdmVDb3VudCA+IDApIHsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgewogICAgICAgICAgIG1vbml0b3ItPndhaXQoMTAwMCk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGRlbGV0ZSBhY3RpdmVDb3VudDsKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0cmVhcGVkICIgPDwgbGl4ICogY291bnQgPDwgIiB0aHJlYWRzIiA8PCBzdGQ6OmVuZGw7CisgICAgICAKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0cmVhcGVkICIgPDwgbGl4KiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIGNsYXNzIFN5bmNoU3RhcnRUYXNrOiBwdWJsaWMgUnVubmFibGUgeworICBjbGFzcyBTeW5jaFN0YXJ0VGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKLSAgIHB1YmxpYzoKKyAgcHVibGljOgorICAgIGVudW0gU1RBVEUgeyBVTklOSVRJQUxJWkVELCBTVEFSVElORywgU1RBUlRFRCwgU1RPUFBJTkcsIFNUT1BQRUQgfTsKIAotICAgIGVudW0gU1RBVEUgewotICAgICAgVU5JTklUSUFMSVpFRCwKLSAgICAgIFNUQVJUSU5HLAotICAgICAgU1RBUlRFRCwKLSAgICAgIFNUT1BQSU5HLAotICAgICAgU1RPUFBFRAotICAgIH07Ci0KLSAgICBTeW5jaFN0YXJ0VGFzayhNb25pdG9yJiBtb25pdG9yLCB2b2xhdGlsZSAgU1RBVEUmIHN0YXRlKSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9zdGF0ZShzdGF0ZSkge30KKyAgICBTeW5jaFN0YXJ0VGFzayhNb25pdG9yJiBtb25pdG9yLCB2b2xhdGlsZSBTVEFURSYgc3RhdGUpIDogX21vbml0b3IobW9uaXRvciksIF9zdGF0ZShzdGF0ZSkge30KIAogICAgIHZvaWQgcnVuKCkgewogICAgICAgewpAQCAtMTkwLDkgKzE0NSw5IEBACiAgICAgICB9CiAgICAgfQogCi0gICBwcml2YXRlOgorICBwcml2YXRlOgogICAgIE1vbml0b3ImIF9tb25pdG9yOwotICAgIHZvbGF0aWxlICBTVEFURSYgX3N0YXRlOworICAgIHZvbGF0aWxlIFNUQVRFJiBfc3RhdGU7CiAgIH07CiAKICAgYm9vbCBzeW5jaFN0YXJ0VGVzdCgpIHsKQEAgLTIwMSw5ICsxNTYsMTAgQEAKIAogICAgIFN5bmNoU3RhcnRUYXNrOjpTVEFURSBzdGF0ZSA9IFN5bmNoU3RhcnRUYXNrOjpVTklOSVRJQUxJWkVEOwogCi0gICAgc2hhcmVkX3B0cjxTeW5jaFN0YXJ0VGFzaz4gdGFzayA9IHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+KG5ldyBTeW5jaFN0YXJ0VGFzayhtb25pdG9yLCBzdGF0ZSkpOworICAgIHNoYXJlZF9wdHI8U3luY2hTdGFydFRhc2s+IHRhc2sKKyAgICAgICAgPSBzaGFyZWRfcHRyPFN5bmNoU3RhcnRUYXNrPihuZXcgU3luY2hTdGFydFRhc2sobW9uaXRvciwgc3RhdGUpKTsKIAotICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOworICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CiAKICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7CiAKQEAgLTIyNyw4ICsxODMsOCBAQAogICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAKICAgICAgIHRyeSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KDEwMCk7Ci0gICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7CisgICAgICAgIG1vbml0b3Iud2FpdCgxMDApOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CiAgICAgICB9CiAKICAgICAgIGlmIChzdGF0ZSA9PSBTeW5jaFN0YXJ0VGFzazo6U1RBUlRFRCkgewpAQCAtMjUyLDEwNCArMjA4LDEwMiBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgLyoqIFNlZSBob3cgYWNjdXJhdGUgbW9uaXRvciB0aW1lb3V0IGlzLiAqLworICAvKioKKyAgICogVGhlIG9ubHkgZ3VhcmFudGVlIGEgbW9uaXRvciB0aW1lb3V0IGNhbiBnaXZlIHlvdSBpcyB0aGF0CisgICAqIGl0IHdpbGwgdGFrZSAiYXQgbGVhc3QiIGFzIGxvbmcgYXMgdGhlIHRpbWVvdXQsIG5vIGxlc3MuCisgICAqIFRoZXJlIGlzIGFic29sdXRlbHkgbm8gZ3VhcmFudGVlIGFyb3VuZCByZWdhaW5pbmcgZXhlY3V0aW9uCisgICAqIG5lYXIgdGhlIHRpbWVvdXQuICBPbiBhIGJ1c3kgc3lzdGVtIChsaWtlIGluc2lkZSBhIHRoaXJkIHBhcnR5CisgICAqIENJIGVudmlyb25tZW50KSBpdCBjb3VsZCB0YWtlIHF1aXRlIGEgYml0IGxvbmdlciB0aGFuIHRoZQorICAgKiByZXF1ZXN0ZWQgdGltZW91dCwgYW5kIHRoYXQncyBvay4KKyAgICovCiAKLSAgYm9vbCBtb25pdG9yVGltZW91dFRlc3Qoc2l6ZV90IGNvdW50PTEwMDAsIGludDY0X3QgdGltZW91dD0xMCkgeworICBib29sIG1vbml0b3JUaW1lb3V0VGVzdChpbnQ2NF90IGNvdW50ID0gMTAwMCwgaW50NjRfdCB0aW1lb3V0ID0gMikgewogCiAgICAgTW9uaXRvciBtb25pdG9yOwogCiAgICAgaW50NjRfdCBzdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCi0gICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNvdW50OyBpeCsrKSB7CisgICAgZm9yIChpbnQ2NF90IGl4ID0gMDsgaXggPCBjb3VudDsgaXgrKykgewogICAgICAgewogICAgICAgICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1vbml0b3Iud2FpdCh0aW1lb3V0KTsKLSAgICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgeworICAgICAgICAgIG1vbml0b3Iud2FpdCh0aW1lb3V0KTsKKyAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICBpbnQ2NF90IGVuZFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCi0gICAgZG91YmxlIGVycm9yID0gKChlbmRUaW1lIC0gc3RhcnRUaW1lKSAtIChjb3VudCAqIHRpbWVvdXQpKSAvIChkb3VibGUpKGNvdW50ICogdGltZW91dCk7CisgIGJvb2wgc3VjY2VzcyA9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSA+PSAoY291bnQgKiB0aW1lb3V0KTsKIAotICAgIGlmIChlcnJvciA8IDAuMCkgIHsKLQotICAgICAgZXJyb3IgKj0gMS4wOwotICAgIH0KLQotICAgIGJvb2wgc3VjY2VzcyA9IGVycm9yIDwgVGhyZWFkRmFjdG9yeVRlc3RzOjpFUlJPUjsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCBjb3VudCAqIHRpbWVvdXQgPDwgIm1zIGVsYXBzZWQgdGltZTogIjw8IGVuZFRpbWUgLSBzdGFydFRpbWUgPDwgIm1zIGVycm9yJTogIiA8PCBlcnJvciAqIDEwMC4wIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHN1Y2Nlc3MgPyAiU3VjY2VzcyIgOiAiRmFpbHVyZSIpCisgICAgICAgICAgICAgIDw8ICI6IG1pbmltdW0gcmVxdWlyZWQgdGltZSB0byBlbGFwc2UgIiA8PCBjb3VudCAqIHRpbWVvdXQKKyAgICAgICAgICAgICAgPDwgIm1zOyBhY3R1YWwgZWxhcHNlZCB0aW1lICIgPDwgZW5kVGltZSAtIHN0YXJ0VGltZSA8PCAibXMiCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKIAogICAgIHJldHVybiBzdWNjZXNzOwogICB9CiAKLQogICBjbGFzcyBGbG9vZFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogICBwdWJsaWM6Ci0KLSAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkKSA6X2lkKGlkKSB7fQotICAgIH5GbG9vZFRhc2soKXsKLSAgICAgIGlmKF9pZCAlIDEwMDAgPT0gMCkgeworICAgIEZsb29kVGFzayhjb25zdCBzaXplX3QgaWQsIE1vbml0b3ImIG1vbikgOiBfaWQoaWQpLCBfbW9uKG1vbikge30KKyAgICB+Rmxvb2RUYXNrKCkgeworICAgICAgaWYgKF9pZCAlIDEwMDAwID09IDApIHsKKwkJU3luY2hyb25pemVkIHN5bmMoX21vbik7CiAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdHRocmVhZCAiIDw8IF9pZCA8PCAiIGRvbmUiIDw8IHN0ZDo6ZW5kbDsKICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHJ1bigpewotICAgICAgaWYoX2lkICUgMTAwMCA9PSAwKSB7CisgICAgdm9pZCBydW4oKSB7CisgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOwogICAgICAgfQotCi0gICAgICB1c2xlZXAoMSk7CiAgICAgfQogICAgIGNvbnN0IHNpemVfdCBfaWQ7CisgICAgTW9uaXRvciYgX21vbjsKICAgfTsKIAotICB2b2lkIGZvbyhQbGF0Zm9ybVRocmVhZEZhY3RvcnkgKnRmKSB7Ci0gICAgKHZvaWQpIHRmOwotICB9CisgIHZvaWQgZm9vKFBsYXRmb3JtVGhyZWFkRmFjdG9yeSogdGYpIHsgKHZvaWQpdGY7IH0KIAotICBib29sIGZsb29kTlRlc3Qoc2l6ZV90IGxvb3A9MSwgc2l6ZV90IGNvdW50PTEwMDAwMCkgeworICBib29sIGZsb29kTlRlc3Qoc2l6ZV90IGxvb3AgPSAxLCBzaXplX3QgY291bnQgPSAxMDAwMDApIHsKIAogICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgZm9yKHNpemVfdCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgeworICAgIE1vbml0b3IgbW9uOworCQorICAgIGZvciAoc2l6ZV90IGxpeCA9IDA7IGxpeCA8IGxvb3A7IGxpeCsrKSB7CiAKICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7CiAgICAgICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKHRydWUpOwogCi0gICAgICAgIGZvcihzaXplX3QgdGl4ID0gMDsgdGl4IDwgY291bnQ7IHRpeCsrKSB7CisgICAgICBmb3IgKHNpemVfdCB0aXggPSAwOyB0aXggPCBjb3VudDsgdGl4KyspIHsKIAotICAgICAgICAgIHRyeSB7CisgICAgICAgIHRyeSB7CiAKLSAgICAgICAgICAgIHNoYXJlZF9wdHI8Rmxvb2RUYXNrPiB0YXNrKG5ldyBGbG9vZFRhc2sobGl4ICogY291bnQgKyB0aXggKSk7CisgICAgICAgICAgc2hhcmVkX3B0cjxGbG9vZFRhc2s+IHRhc2sobmV3IEZsb29kVGFzayhsaXggKiBjb3VudCArIHRpeCwgbW9uKSk7CisgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOworICAgICAgICAgIHRocmVhZC0+c3RhcnQoKTsKIAotICAgICAgICAgICAgc2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRhc2spOworICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7CiAKLSAgICAgICAgICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZhaWxlZCB0byBzdGFydCAgIiA8PCBsaXgqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkKKyAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogCi0gICAgICAgICAgICB1c2xlZXAoMSk7Ci0KLSAgICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uJiBlKSB7Ci0KLSAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIHN0YXJ0ICAiIDw8IGxpeCAqIGNvdW50ICsgdGl4IDw8ICIgdGhyZWFkICIgPDwgZS53aGF0KCkgPDwgc3RkOjplbmRsOwotCi0gICAgICAgICAgICByZXR1cm4gc3VjY2VzczsKLSAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgICAgIH0KKyAgICAgIH0KIAotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKLQotICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKKyAgICAgIFN5bmNocm9uaXplZCBzeW5jKG1vbik7CisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGZsb29kZWQgIiA8PCAobGl4ICsgMSkgKiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN1Y2Nlc3MgPSB0cnVlOwogICAgIH0KIAogICAgIHJldHVybiBzdWNjZXNzOwogICB9CiB9OwogCi1jb25zdCBkb3VibGUgVGhyZWFkRmFjdG9yeVRlc3RzOjpFUlJPUiA9IC4yMDsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3QKLQorfQorfQorfQorfSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3QKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaAppbmRleCBiNzM0ZjdhLi5kNmMwOTJkIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCkBAIC0xNyw1OCArMTcsNTggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CituYW1lc3BhY2UgdGVzdCB7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKLS8qKgotICogVGhyZWFkTWFuYWdlclRlc3RzIGNsYXNzCi0gKgotICogQHZlcnNpb24gJElkOiQKLSAqLworc3RhdGljIHN0ZDo6ZGVxdWU8c3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiA+IG1fZXhwaXJlZDsKK3N0YXRpYyB2b2lkIGV4cGlyZWROb3RpZmllcihzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQoreworICBtX2V4cGlyZWQucHVzaF9iYWNrKHJ1bm5hYmxlKTsKK30KKworc3RhdGljIHZvaWQgc2xlZXBfKGludDY0X3QgbWlsbGlzZWMpIHsKKyAgTW9uaXRvciBfc2xlZXA7CisgIFN5bmNocm9uaXplZCBzKF9zbGVlcCk7CisKKyAgdHJ5IHsKKyAgICBfc2xlZXAud2FpdChtaWxsaXNlYyk7CisgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgeworICAgIDsKKyAgfSBjYXRjaCAoLi4uKSB7CisgICAgYXNzZXJ0KDApOworICB9Cit9CisKIGNsYXNzIFRocmVhZE1hbmFnZXJUZXN0cyB7CiAKIHB1YmxpYzoKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIEVSUk9SOwotCi0gIGNsYXNzIFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGNsYXNzIFRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogCiAgIHB1YmxpYzoKLQotICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9jb3VudChjb3VudCksCi0gICAgICBfdGltZW91dCh0aW1lb3V0KSwKLSAgICAgIF9kb25lKGZhbHNlKSB7fQorICAgIFRhc2soTW9uaXRvciYgbW9uaXRvciwgc2l6ZV90JiBjb3VudCwgaW50NjRfdCB0aW1lb3V0KQorICAgICAgOiBfbW9uaXRvcihtb25pdG9yKSwgX2NvdW50KGNvdW50KSwgX3RpbWVvdXQodGltZW91dCksIF9zdGFydFRpbWUoMCksIF9lbmRUaW1lKDApLCBfZG9uZShmYWxzZSkge30KIAogICAgIHZvaWQgcnVuKCkgewogCiAgICAgICBfc3RhcnRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAotICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfc2xlZXApOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgX3NsZWVwLndhaXQoX3RpbWVvdXQpOwotICAgICAgICB9IGNhdGNoKFRpbWVkT3V0RXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9Y2F0Y2goLi4uKSB7Ci0gICAgICAgICAgYXNzZXJ0KDApOwotICAgICAgICB9Ci0gICAgICB9CisgICAgICBzbGVlcF8oX3RpbWVvdXQpOwogCiAgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKQEAgLTgwLDkgKzgwLDcgQEAKICAgICAgICAgLy8gc3RkOjpjb3V0IDw8ICJUaHJlYWQgIiA8PCBfY291bnQgPDwgIiBjb21wbGV0ZWQgIiA8PCBzdGQ6OmVuZGw7CiAKICAgICAgICAgX2NvdW50LS07Ci0KLSAgICAgICAgaWYgKF9jb3VudCA9PSAwKSB7Ci0KKyAgICAgICAgaWYgKF9jb3VudCAlIDEwMDAwID09IDApIHsKICAgICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTAyLDcgKzEwMCw3IEBACiAgICAqIGNvbXBsZXRlcy4gVmVyaWZ5IHRoYXQgYWxsIHRhc2tzIGNvbXBsZXRlZCBhbmQgdGhhdCB0aHJlYWQgbWFuYWdlciBjbGVhbnMKICAgICogdXAgcHJvcGVybHkgb24gZGVsZXRlLgogICAgKi8KLSAgYm9vbCBsb2FkVGVzdChzaXplX3QgY291bnQ9MTAwLCBpbnQ2NF90IHRpbWVvdXQ9MTAwTEwsIHNpemVfdCB3b3JrZXJDb3VudD00KSB7CisgIGJvb2wgbG9hZFRlc3Qoc2l6ZV90IGNvdW50ID0gMTAwLCBpbnQ2NF90IHRpbWVvdXQgPSAxMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50ID0gNCkgewogCiAgICAgTW9uaXRvciBtb25pdG9yOwogCkBAIC0xMTAsOSArMTA4LDEwIEBACiAKICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKIAotICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CisgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpOwogCi0jaWZuZGVmIFVTRV9CT09TVF9USFJFQUQKKyNpZiAhVVNFX1NURF9USFJFQUQKICAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwogI2VuZGlmCiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKQEAgLTEyMywyMSArMTIyLDI2IEBACiAKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY291bnQ7IGl4KyspIHsKIAotICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKG1vbml0b3IsIGFjdGl2ZUNvdW50LCB0aW1lb3V0KSkpOworICAgICAgdGFza3MuaW5zZXJ0KHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPigKKyAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrKG1vbml0b3IsIGFjdGl2ZUNvdW50LCB0aW1lb3V0KSkpOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZTAwID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAotICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+ID46Oml0ZXJhdG9yIGl4ID0gdGFza3MuYmVnaW4oKTsgaXggIT0gdGFza3MuZW5kKCk7IGl4KyspIHsKKyAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICBpeCAhPSB0YXNrcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKIAotICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoKml4KTsKKyAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOwogICAgIH0KIAorICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRsb2FkZWQgIiA8PCBjb3VudCA8PCAiIHRhc2tzIHRvIGV4ZWN1dGUiIDw8IHN0ZDo6ZW5kbDsKKwogICAgIHsKICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwogCi0gICAgICB3aGlsZShhY3RpdmVDb3VudCA+IDApIHsKLQorICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50ID4gMCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWN0aXZlQ291bnQgPSAiIDw8IGFjdGl2ZUNvdW50IDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAgICAgfQpAQCAtMTUxLDcgKzE1NSw5IEBACiAgICAgaW50NjRfdCBtaW5UaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwogICAgIGludDY0X3QgbWF4VGltZSA9IDA7CiAKLSAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7IGl4ICE9IHRhc2tzLmVuZCgpOyBpeCsrKSB7CisgICAgZm9yIChzdGQ6OnNldDxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOworICAgICAgICAgaXggIT0gdGFza3MuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CiAKICAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrID0gKml4OwogCkBAIC0xNzUsNTkgKzE4MSw1NyBAQAogICAgICAgICBtYXhUaW1lID0gZGVsdGE7CiAgICAgICB9CiAKLSAgICAgIGF2ZXJhZ2VUaW1lKz0gZGVsdGE7CisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKICAgICB9CiAKICAgICBhdmVyYWdlVGltZSAvPSBjb3VudDsKIAotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmlyc3Qgc3RhcnQ6ICIgPDwgZmlyc3RUaW1lIDw8ICJtcyBMYXN0IGVuZDogIiA8PCBsYXN0VGltZSA8PCAibXMgbWluOiAiIDw8IG1pblRpbWUgPDwgIm1zIG1heDogIiA8PCBtYXhUaW1lIDw8ICJtcyBhdmVyYWdlOiAiIDw8IGF2ZXJhZ2VUaW1lIDw8ICJtcyIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmlyc3Qgc3RhcnQ6ICIgPDwgZmlyc3RUaW1lIDw8ICIgTGFzdCBlbmQ6ICIgPDwgbGFzdFRpbWUKKyAgICAgICAgICAgICAgPDwgIiBtaW46ICIgPDwgbWluVGltZSA8PCAibXMgbWF4OiAiIDw8IG1heFRpbWUgPDwgIm1zIGF2ZXJhZ2U6ICIgPDwgYXZlcmFnZVRpbWUKKyAgICAgICAgICAgICAgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CiAKLSAgICBkb3VibGUgZXhwZWN0ZWRUaW1lID0gKChjb3VudCArICh3b3JrZXJDb3VudCAtIDEpKSAvIHdvcmtlckNvdW50KSAqIHRpbWVvdXQ7CisgICAgYm9vbCBzdWNjZXNzID0gKHRpbWUwMSAtIHRpbWUwMCkgPj0gKChpbnQ2NF90KWNvdW50ICogdGltZW91dCkgLyAoaW50NjRfdCl3b3JrZXJDb3VudDsKIAotICAgIGRvdWJsZSBlcnJvciA9ICgodGltZTAxIC0gdGltZTAwKSAtIGV4cGVjdGVkVGltZSkgLyBleHBlY3RlZFRpbWU7Ci0KLSAgICBpZiAoZXJyb3IgPCAwKSB7Ci0gICAgICBlcnJvcio9IC0xLjA7Ci0gICAgfQotCi0gICAgYm9vbCBzdWNjZXNzID0gZXJyb3IgPCBFUlJPUjsKLQotICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCBleHBlY3RlZFRpbWUgPDwgIm1zIGVsYXBzZWQgdGltZTogIjw8IHRpbWUwMSAtIHRpbWUwMCA8PCAibXMgZXJyb3IlOiAiIDw8IGVycm9yICogMTAwLjAgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAoc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikKKyAgICAgICAgICAgICAgPDwgIiEgZXhwZWN0ZWQgdGltZTogIiA8PCAoKGludDY0X3QpY291bnQgKiB0aW1lb3V0KSAvIChpbnQ2NF90KXdvcmtlckNvdW50IDw8ICJtcyBlbGFwc2VkIHRpbWU6ICIgPDwgdGltZTAxIC0gdGltZTAwCisgICAgICAgICAgICAgIDw8ICJtcyIgPDwgc3RkOjplbmRsOwogCiAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgIH0KIAotICBjbGFzcyBCbG9ja1Rhc2s6IHB1YmxpYyBSdW5uYWJsZSB7CisgIGNsYXNzIEJsb2NrVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAKICAgcHVibGljOgotCi0gICAgQmxvY2tUYXNrKE1vbml0b3ImIG1vbml0b3IsIE1vbml0b3ImIGJtb25pdG9yLCBzaXplX3QmIGNvdW50KSA6Ci0gICAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICAgIF9ibW9uaXRvcihibW9uaXRvciksCi0gICAgICBfY291bnQoY291bnQpIHt9CisgICAgQmxvY2tUYXNrKE1vbml0b3ImIGVudHJ5TW9uaXRvciwgTW9uaXRvciYgYmxvY2tNb25pdG9yLCBib29sJiBibG9ja2VkLCBNb25pdG9yJiBkb25lTW9uaXRvciwgc2l6ZV90JiBjb3VudCkKKyAgICAgIDogX2VudHJ5TW9uaXRvcihlbnRyeU1vbml0b3IpLCBfZW50ZXJlZChmYWxzZSksIF9ibG9ja01vbml0b3IoYmxvY2tNb25pdG9yKSwgX2Jsb2NrZWQoYmxvY2tlZCksIF9kb25lTW9uaXRvcihkb25lTW9uaXRvciksIF9jb3VudChjb3VudCkge30KIAogICAgIHZvaWQgcnVuKCkgewogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfYm1vbml0b3IpOwotCi0gICAgICAgIF9ibW9uaXRvci53YWl0KCk7Ci0KKyAgICAgICAgU3luY2hyb25pemVkIHMoX2VudHJ5TW9uaXRvcik7CisgICAgICAgIF9lbnRlcmVkID0gdHJ1ZTsKKyAgICAgICAgX2VudHJ5TW9uaXRvci5ub3RpZnkoKTsKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9ibG9ja01vbml0b3IpOworICAgICAgICB3aGlsZSAoX2Jsb2NrZWQpIHsKKyAgICAgICAgICBfYmxvY2tNb25pdG9yLndhaXQoKTsKKyAgICAgICAgfQorICAgICAgfQogCi0gICAgICAgIF9jb3VudC0tOwotCi0gICAgICAgIGlmIChfY291bnQgPT0gMCkgewotCi0gICAgICAgICAgX21vbml0b3Iubm90aWZ5KCk7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9kb25lTW9uaXRvcik7CisgICAgICAgIGlmICgtLV9jb3VudCA9PSAwKSB7CisgICAgICAgICAgX2RvbmVNb25pdG9yLm5vdGlmeSgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCi0gICAgTW9uaXRvciYgX21vbml0b3I7Ci0gICAgTW9uaXRvciYgX2Jtb25pdG9yOworICAgIE1vbml0b3ImIF9lbnRyeU1vbml0b3I7CisgICAgYm9vbCBfZW50ZXJlZDsKKyAgICBNb25pdG9yJiBfYmxvY2tNb25pdG9yOworICAgIGJvb2wmIF9ibG9ja2VkOworICAgIE1vbml0b3ImIF9kb25lTW9uaXRvcjsKICAgICBzaXplX3QmIF9jb3VudDsKICAgfTsKIApAQCAtMjM1LDE0NyArMjM5LDQ0NyBAQAogICAgKiBCbG9jayB0ZXN0LiAgQ3JlYXRlIHBlbmRpbmdUYXNrQ291bnRNYXggdGFza3MuICBWZXJpZnkgdGhhdCB3ZSBibG9jayBhZGRpbmcgdGhlCiAgICAqIHBlbmRpbmdUYXNrQ291bnRNYXggKyAxdGggdGFzay4gIFZlcmlmeSB0aGF0IHdlIHVuYmxvY2sgd2hlbiBhIHRhc2sgY29tcGxldGVzICovCiAKLSAgYm9vbCBibG9ja1Rlc3QoaW50NjRfdCB0aW1lb3V0PTEwMExMLCBzaXplX3Qgd29ya2VyQ291bnQ9MikgewotICAgICh2b2lkKSB0aW1lb3V0OworICBib29sIGJsb2NrVGVzdChpbnQ2NF90IHRpbWVvdXQgPSAxMDBMTCwgc2l6ZV90IHdvcmtlckNvdW50ID0gMikgeworICAgICh2b2lkKXRpbWVvdXQ7CiAgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CiAKICAgICB0cnkgewogCi0gICAgICBNb25pdG9yIGJtb25pdG9yOwotICAgICAgTW9uaXRvciBtb25pdG9yOworICAgICAgTW9uaXRvciBlbnRyeU1vbml0b3I7ICAgLy8gbm90IHVzZWQgYnkgdGhpcyB0ZXN0CisgICAgICBNb25pdG9yIGJsb2NrTW9uaXRvcjsKKyAgICAgIGJvb2wgYmxvY2tlZFtdID0ge3RydWUsIHRydWUsIHRydWV9OworICAgICAgTW9uaXRvciBkb25lTW9uaXRvcjsKIAogICAgICAgc2l6ZV90IHBlbmRpbmdUYXNrTWF4Q291bnQgPSB3b3JrZXJDb3VudDsKIAogICAgICAgc2l6ZV90IGFjdGl2ZUNvdW50c1tdID0ge3dvcmtlckNvdW50LCBwZW5kaW5nVGFza01heENvdW50LCAxfTsKIAotICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCwgcGVuZGluZ1Rhc2tNYXhDb3VudCk7CisgICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQsIHBlbmRpbmdUYXNrTWF4Q291bnQpOwogCi0gICAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICAgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgICA9IHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogCi0jaWZuZGVmIFVTRV9CT09TVF9USFJFQUQKKyNpZiAhVVNFX1NURF9USFJFQUQKICAgICAgIHRocmVhZEZhY3RvcnktPnNldFByaW9yaXR5KFBvc2l4VGhyZWFkRmFjdG9yeTo6SElHSEVTVCk7CiAjZW5kaWYKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKLSAgICAgIHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+ID4gdGFza3M7CisgICAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+IHRhc2tzOworICAgICAgdGFza3MucmVzZXJ2ZSh3b3JrZXJDb3VudCArIHBlbmRpbmdUYXNrTWF4Q291bnQpOwogCiAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgd29ya2VyQ291bnQ7IGl4KyspIHsKIAotICAgICAgICB0YXNrcy5pbnNlcnQoc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4obmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKG1vbml0b3IsIGJtb25pdG9yLGFjdGl2ZUNvdW50c1swXSkpKTsKKyAgICAgICAgdGFza3MucHVzaF9iYWNrKHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+KAorICAgICAgICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkWzBdLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnRzWzBdKSkpOwogICAgICAgfQogCiAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGVuZGluZ1Rhc2tNYXhDb3VudDsgaXgrKykgewogCi0gICAgICAgIHRhc2tzLmluc2VydChzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPihuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsYWN0aXZlQ291bnRzWzFdKSkpOworICAgICAgICB0YXNrcy5wdXNoX2JhY2soc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4oCisgICAgICAgICAgICBuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2soZW50cnlNb25pdG9yLCBibG9ja01vbml0b3IsIGJsb2NrZWRbMV0sIGRvbmVNb25pdG9yLCBhY3RpdmVDb3VudHNbMV0pKSk7CiAgICAgICB9CiAKLSAgICAgIGZvciAoc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gPjo6aXRlcmF0b3IgaXggPSB0YXNrcy5iZWdpbigpOyBpeCAhPSB0YXNrcy5lbmQoKTsgaXgrKykgeworICAgICAgZm9yIChzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrPiA+OjppdGVyYXRvciBpeCA9IHRhc2tzLmJlZ2luKCk7CisgICAgICAgICAgIGl4ICE9IHRhc2tzLmVuZCgpOworICAgICAgICAgICBpeCsrKSB7CiAgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZCgqaXgpOwogICAgICAgfQogCi0gICAgICBpZighKHN1Y2Nlc3MgPSAodGhyZWFkTWFuYWdlci0+dG90YWxUYXNrQ291bnQoKSA9PSBwZW5kaW5nVGFza01heENvdW50ICsgd29ya2VyQ291bnQpKSkgeworICAgICAgaWYgKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IHBlbmRpbmdUYXNrTWF4Q291bnQgKyB3b3JrZXJDb3VudCkpKSB7CiAgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgcGVuZGluZyB0YXNrIGNvdW50Iik7CiAgICAgICB9CiAKLSAgICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2s+IGV4dHJhVGFzayhuZXcgVGhyZWFkTWFuYWdlclRlc3RzOjpCbG9ja1Rhc2sobW9uaXRvciwgYm1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOworICAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gZXh0cmFUYXNrKAorICAgICAgICAgIG5ldyBUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzayhlbnRyeU1vbml0b3IsIGJsb2NrTW9uaXRvciwgYmxvY2tlZFsyXSwgZG9uZU1vbml0b3IsIGFjdGl2ZUNvdW50c1syXSkpOwogCiAgICAgICB0cnkgewogICAgICAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXh0cmFUYXNrLCAxKTsKICAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCBzdWNjZXNzIGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYgZSkgeworICAgICAgfSBjYXRjaCAoVG9vTWFueVBlbmRpbmdUYXNrc0V4Y2VwdGlvbiYpIHsKICAgICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiU2hvdWxkIGhhdmUgdGltZWQgb3V0IGFkZGluZyB0YXNrIGluIGV4Y2VzcyBvZiBwZW5kaW5nIHRhc2sgY291bnQiKTsKLSAgICAgIH0gY2F0Y2goVGltZWRPdXRFeGNlcHRpb24mIGUpIHsKKyAgICAgIH0gY2F0Y2ggKFRpbWVkT3V0RXhjZXB0aW9uJikgewogICAgICAgICAvLyBFeHBlY3RlZCByZXN1bHQKICAgICAgIH0KIAogICAgICAgdHJ5IHsKICAgICAgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4dHJhVGFzaywgLTEpOwogICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHN1Y2Nlc3MgYWRkaW5nIHRhc2sgaW4gZXhjZXNzIG9mIHBlbmRpbmcgdGFzayBjb3VudCIpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgeworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CiAgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayBpbiBleGNlc3Mgb2YgcGVuZGluZyB0YXNrIGNvdW50Iik7Ci0gICAgICB9IGNhdGNoKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mIGUpIHsKKyAgICAgIH0gY2F0Y2ggKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mKSB7CiAgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdAogICAgICAgfQogCi0gICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgIlBlbmRpbmcgdGFza3MgIiA8PCB0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCkgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgIDw8ICJQZW5kaW5nIHRhc2tzICIgPDwgdGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMF0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOwogICAgICAgfQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1swXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1swXSAhPSAwKSB7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IiA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CisgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICA8PCAiUGVuZGluZyB0YXNrcyAiIDw8IHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSA8PCBzdGQ6OmVuZGw7CiAKICAgICAgIHRyeSB7CiAgICAgICAgIHRocmVhZE1hbmFnZXItPmFkZChleHRyYVRhc2ssIDEpOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgewotICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgImFkZCB0aW1lZCBvdXQgdW5leHBlY3RlZGx5IiAgPDwgc3RkOjplbmRsOworICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0IgorICAgICAgICAgICAgICAgICAgPDwgImFkZCB0aW1lZCBvdXQgdW5leHBlY3RlZGx5IiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOwogCi0gICAgICB9IGNhdGNoKFRvb01hbnlQZW5kaW5nVGFza3NFeGNlcHRpb24mIGUpIHsKLSAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICJhZGQgZW5jb3VudGVyZWQgdG9vIG1hbnkgcGVuZGluZyBleGVwY3Rpb25zIiA8PCBzdGQ6OmVuZGw7CisgICAgICB9IGNhdGNoIChUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uJikgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIKKyAgICAgICAgICAgICAgICAgIDw8ICJhZGQgZW5jb3VudGVyZWQgdG9vIG1hbnkgcGVuZGluZyBleGVwY3Rpb25zIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdGltZW91dCBhZGRpbmcgdGFzayIpOwogICAgICAgfQogCiAgICAgICAvLyBXYWtlIHVwIHRhc2tzIHRoYXQgd2VyZSBwZW5kaW5nIGJlZm9yZSBhbmQgd2FpdCBmb3IgdGhlbSB0byBjb21wbGV0ZQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKGJtb25pdG9yKTsKLQotICAgICAgICBibW9uaXRvci5ub3RpZnlBbGwoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoYmxvY2tNb25pdG9yKTsKKyAgICAgICAgYmxvY2tlZFsxXSA9IGZhbHNlOworICAgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CiAgICAgICB9CiAKICAgICAgIHsKLSAgICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7Ci0KLSAgICAgICAgd2hpbGUoYWN0aXZlQ291bnRzWzFdICE9IDApIHsKLSAgICAgICAgICBtb25pdG9yLndhaXQoKTsKKyAgICAgICAgU3luY2hyb25pemVkIHMoZG9uZU1vbml0b3IpOworICAgICAgICB3aGlsZSAoYWN0aXZlQ291bnRzWzFdICE9IDApIHsKKyAgICAgICAgICBkb25lTW9uaXRvci53YWl0KCk7CiAgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgLy8gV2FrZSB1cCB0aGUgZXh0cmEgdGFzayBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKIAogICAgICAgewotICAgICAgICBTeW5jaHJvbml6ZWQgcyhibW9uaXRvcik7Ci0KLSAgICAgICAgYm1vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICAgIGJsb2NrZWRbMl0gPSBmYWxzZTsKKyAgICAgICAgYmxvY2tNb25pdG9yLm5vdGlmeUFsbCgpOwogICAgICAgfQogCiAgICAgICB7Ci0gICAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwotCi0gICAgICAgIHdoaWxlKGFjdGl2ZUNvdW50c1syXSAhPSAwKSB7Ci0gICAgICAgICAgbW9uaXRvci53YWl0KCk7CisgICAgICAgIFN5bmNocm9uaXplZCBzKGRvbmVNb25pdG9yKTsKKyAgICAgICAgd2hpbGUgKGFjdGl2ZUNvdW50c1syXSAhPSAwKSB7CisgICAgICAgICAgZG9uZU1vbml0b3Iud2FpdCgpOwogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGlmKCEoc3VjY2VzcyA9ICh0aHJlYWRNYW5hZ2VyLT50b3RhbFRhc2tDb3VudCgpID09IDApKSkgewotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJVbmV4cGVjdGVkIHBlbmRpbmcgdGFzayBjb3VudCIpOworICAgICAgdGhyZWFkTWFuYWdlci0+c3RvcCgpOworCisgICAgICBpZiAoIShzdWNjZXNzID0gKHRocmVhZE1hbmFnZXItPnRvdGFsVGFza0NvdW50KCkgPT0gMCkpKSB7CisgICAgICAgIHRocm93IFRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgdG90YWwgdGFzayBjb3VudCIpOwogICAgICAgfQogCi0gICAgfSBjYXRjaChURXhjZXB0aW9uJiBlKSB7CisgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZSkgewogICAgICAgc3RkOjpjb3V0IDw8ICJFUlJPUjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7CiAgICAgfQogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8IChzdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCBzdGQ6OmVuZGw7CiAgICAgcmV0dXJuIHN1Y2Nlc3M7Ci0gfQorICB9CisKKworICBib29sIGFwaVRlc3QoKSB7CisKKyAgICAvLyBwcm92ZSBjdXJyZW50VGltZSBoYXMgbWlsbGlzZWNvbmRzIGdyYW51bGFyaXR5IHNpbmNlIG1hbnkgb3RoZXIgdGhpbmdzIGRlcGVuZCBvbiBpdAorICAgIGludDY0X3QgYSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgc2xlZXBfKDEwMCk7CisgICAgaW50NjRfdCBiID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICBpZiAoYiAtIGEgPCA1MCB8fCBiIC0gYSA+IDE1MCkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRleHBlY3RlZCAxMDBtcyBnYXAsIGZvdW5kICIgPDwgKGItYSkgPDwgIm1zIGdhcCBpbnN0ZWFkLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworI2lmICFVU0VfU1REX1RIUkVBRAorICAgIC8vIHRlc3Qgb25jZSB3aXRoIGEgZGV0YWNoZWQgdGhyZWFkIGZhY3RvcnkgYW5kIG9uY2Ugd2l0aCBhIGpvaW5hYmxlIHRocmVhZCBmYWN0b3J5CisKKyAgICBzaGFyZWRfcHRyPFBvc2l4VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KGZhbHNlKSk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBqb2luYWJsZSB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIGlmICghYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkRmFjdG9yeS5yZXNldChuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KHRydWUpKTsKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdGFwaVRlc3Qgd2l0aCBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CisjZWxzZQorICAgIHJldHVybiBhcGlUZXN0V2l0aFRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworI2VuZGlmCisKKyAgfQorCisgIGJvb2wgYXBpVGVzdFdpdGhUaHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KQorICB7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigxKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOworCisjaWYgIVVTRV9TVERfVEhSRUFECisgICAgdGhyZWFkRmFjdG9yeS0+c2V0UHJpb3JpdHkoUG9zaXhUaHJlYWRGYWN0b3J5OjpISUdIRVNUKTsKKworICAgIC8vIHZlcmlmeSB3ZSBjYW5ub3QgY2hhbmdlIHRoZSB0aHJlYWQgZmFjdG9yeSB0byBvbmUgd2l0aCB0aGUgb3Bwb3NpdGUgZGV0YWNoZWQgc2V0dGluZworICAgIHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5MgorICAgICAgICA9IHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KAorICAgICAgICAgIFBvc2l4VGhyZWFkRmFjdG9yeTo6Uk9VTkRfUk9CSU4sCisgICAgICAgICAgUG9zaXhUaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgMSwKKyAgICAgICAgICAhdGhyZWFkRmFjdG9yeS0+aXNEZXRhY2hlZCgpKSk7CisgICAgdHJ5IHsKKyAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeTIpOworICAgICAgLy8gaWYgdGhlIGNhbGwgc3VjY2VlZGVkIHdlIGNoYW5nZWQgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB0aGF0IGhhZCB0aGUgb3Bwb3NpdGUgc2V0dGluZyBmb3IgImlzRGV0YWNoZWQoKSIuCisgICAgICAvLyB0aGlzIGlzIGJhZCwgYmVjYXVzZSB0aGUgdGhyZWFkIG1hbmFnZXIgY2hlY2tzIHdpdGggdGhlIHRocmVhZCBmYWN0b3J5IHRvIHNlZSBpZiBpdCBzaG91bGQgam9pbiB0aHJlYWRzCisgICAgICAvLyBhcyB0aGV5IGFyZSBsZWF2aW5nIC0gc28gdGhlIGRldGFjaGVkIHN0YXR1cyBvZiBuZXcgdGhyZWFkcyBjYW5ub3QgY2hhbmdlIHdoaWxlIHRoZXJlIGFyZSBleGlzdGluZyB0aHJlYWRzLgorICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRTaG91bGQgbm90IGJlIGFibGUgdG8gY2hhbmdlIHRocmVhZCBmYWN0b3J5IGRldGFjaGVkIGRpc3Bvc2l0aW9uIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mIGV4KSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKyNlbmRpZgorCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHN0YXJ0aW5nLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOworICAgIHRocmVhZE1hbmFnZXItPnNldEV4cGlyZUNhbGxiYWNrKGV4cGlyZWROb3RpZmllcik7IC8vIHN0ZDo6YmluZCgmVGhyZWFkTWFuYWdlclRlc3RzOjpleHBpcmVkTm90aWZpZXIsIHRoaXMpKTsKKworI2RlZmluZSBFWFBFQ1QoRlVOQywgQ09VTlQpIHsgc2l6ZV90IGMgPSBGVU5DOyBpZiAoYyAhPSBDT1VOVCkgeyBzdGQ6OmNlcnIgPDwgImV4cGVjdGVkICIgI0ZVTkMiIHRvIGJlICIgI0NPVU5UICIsIGJ1dCB3YXMgIiA8PCBjIDw8IHN0ZDo6ZW5kbDsgcmV0dXJuIGZhbHNlOyB9IH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAyKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDIpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAybmQgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSAxc3Qgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICAvLyBXZSdyZSBnb2luZyB0byB0aHJvdyBhIGJsb2NraW5nIHRhc2sgaW50byB0aGUgbWl4CisgICAgTW9uaXRvciBlbnRyeU1vbml0b3I7ICAgLy8gc2lnbmFsZWQgd2hlbiB0YXNrIGlzIHJ1bm5pbmcKKyAgICBNb25pdG9yIGJsb2NrTW9uaXRvcjsgICAvLyB0byBiZSBzaWduYWxlZCB0byB1bmJsb2NrIHRoZSB0YXNrCisgICAgYm9vbCBibG9ja2VkKHRydWUpOyAgICAgLy8gc2V0IHRvIGZhbHNlIGJlZm9yZSBub3RpZnlpbmcKKyAgICBNb25pdG9yIGRvbmVNb25pdG9yOyAgICAvLyBzaWduYWxlZCB3aGVuIGNvdW50IHJlYWNoZXMgemVybworICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDE7CisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OkJsb2NrVGFzaz4gYmxvY2tpbmdUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6QmxvY2tUYXNrKGVudHJ5TW9uaXRvciwgYmxvY2tNb25pdG9yLCBibG9ja2VkLCBkb25lTW9uaXRvciwgYWN0aXZlQ291bnQpKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBvdGhlciB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXJUZXN0czo6VGFzaz4gb3RoZXJUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChvdGhlclRhc2spOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMik7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGJsb2NraW5nIHRhc2sgc3BlY2lmaWNhbGx5Li4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrICE9IG90aGVyVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgcmVtb3ZlTmV4dFBlbmRpbmcgdG8gcmV0dXJuIG90aGVyVGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHJlbW92ZSBuZXh0IHBlbmRpbmcgdGFzayAobm9uZSBsZWZ0KS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICBuZXh0VGFzayA9IHRocmVhZE1hbmFnZXItPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgaWYgKG5leHRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCByZW1vdmVOZXh0UGVuZGluZyB0byByZXR1cm4gYW4gZW1wdHkgUnVubmFibGUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIDIgZXhwaXJlZCB0YXNrcyBhbmQgMSBub3QuLiIgPDwgc3RkOjplbmRsOworCisgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyVGVzdHM6OlRhc2s+IGV4cGlyZWRUYXNrKAorICAgICAgbmV3IFRocmVhZE1hbmFnZXJUZXN0czo6VGFzayhkb25lTW9uaXRvciwgYWN0aXZlQ291bnQsIDApKTsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZChleHBpcmVkVGFzaywgMCwgMSk7CisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGJsb2NraW5nVGFzayk7ICAgICAgIC8vIGFkZCBvbmUgdGhhdCBoYXNuJ3QgZXhwaXJlZCB0byBtYWtlIHN1cmUgaXQgZ2V0cyBza2lwcGVkCisgICAgdGhyZWFkTWFuYWdlci0+YWRkKGV4cGlyZWRUYXNrLCAwLCAxKTsgIC8vIGFkZCBhIHNlY29uZCBleHBpcmVkIHRvIGVuc3VyZSByZW1vdmVFeHBpcmVkVGFza3MgcmVtb3ZlcyBib3RoCisKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMSBtaWxsaXNlY29uZAorCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMyk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmV4cGlyZWRUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0cmVtb3ZlIGV4cGlyZWQgdGFza3MuLiIgPDwgc3RkOjplbmRsOworCisgICAgaWYgKCFtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIGVtcHR5IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGhyZWFkTWFuYWdlci0+cmVtb3ZlRXhwaXJlZFRhc2tzKCk7CisKKyAgICBpZiAobV9leHBpcmVkLnNpemUoKSAhPSAyKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWQgdG8gYmUgc2V0IiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1fZXhwaXJlZC5mcm9udCgpICE9IGV4cGlyZWRUYXNrKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBtX2V4cGlyZWRbMF0gdG8gYmUgdGhlIGV4cGlyZWQgdGFzayIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX2V4cGlyZWQucG9wX2Zyb250KCk7CisKKyAgICBpZiAobV9leHBpcmVkLmZyb250KCkgIT0gZXhwaXJlZFRhc2spIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFx0XHRcdGV4cGVjdGVkIG1fZXhwaXJlZFsxXSB0byBiZSB0aGUgZXhwaXJlZCB0YXNrIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9leHBpcmVkLmNsZWFyKCk7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmUoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDIpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBleHBpcmVkIHRhc2sgKGFnYWluKS4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoZXhwaXJlZFRhc2ssIDAsIDEpOyAgLy8gZXhwaXJlcyBpbiAxbXMKKyAgICBzbGVlcF8oNTApOyAgLy8gbWFrZSBzdXJlIGVub3VnaCB0aW1lIGVsYXBzZXMgZm9yIGl0IHRvIGV4cGlyZSAtIHRoZSBzaG9ydGVzdCBleHBpcmF0aW9uIHRpbWUgaXMgMW1zCisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0YWRkIHdvcmtlciB0byBjb25zdW1lIGV4cGlyZWQgdGFzay4uIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGRXb3JrZXIoKTsKKyAgICBzbGVlcF8oMTAwKTsgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgdGltZSB0byBzcGluIHVwIGFuZCBleHBpcmUgdGhlIHRhc2sKKworICAgIGlmIChtX2V4cGlyZWQuZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHNldCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtX2V4cGlyZWQuZnJvbnQoKSAhPSBleHBpcmVkVGFzaykgeworICAgICAgc3RkOjpjZXJyIDw8ICJcdFx0XHRcdFx0ZXhwZWN0ZWQgbV9leHBpcmVkIHRvIGJlIHRoZSBleHBpcmVkIHRhc2siIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2V4cGlyZWQuY2xlYXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAxKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDEpOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdHRyeSB0byByZW1vdmUgdG9vIG1hbnkgd29ya2VycyIgPDwgc3RkOjplbmRsOworICAgIHRyeSB7CisgICAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoMik7CisgICAgICBzdGQ6OmNlcnIgPDwgIlx0XHRcdFx0XHRleHBlY3RlZCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGNhdGNoIChjb25zdCBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24mKSB7CisgICAgICAvKiBleHBlY3RlZCAqLworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHRyZW1vdmUgd29ya2VyLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5yZW1vdmVXb3JrZXIoKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5leHBpcmVkVGFza0NvdW50KCksIDMpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCBibG9ja2luZyB0YXNrLi4gIiA8PCBzdGQ6OmVuZGw7CisKKyAgICB0aHJlYWRNYW5hZ2VyLT5hZGQoYmxvY2tpbmdUYXNrKTsKKworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT53b3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+aWRsZVdvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5wZW5kaW5nVGFza0NvdW50KCksIDEpOworCisgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRcdGFkZCB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHRocmVhZE1hbmFnZXItPmFkZFdvcmtlcigpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGVudHJ5TW9uaXRvcik7CisgICAgICB3aGlsZSAoIWJsb2NraW5nVGFzay0+X2VudGVyZWQpIHsKKyAgICAgICAgZW50cnlNb25pdG9yLndhaXQoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+d29ya2VyQ291bnQoKSwgMSk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPmlkbGVXb3JrZXJDb3VudCgpLCAwKTsKKyAgICBFWFBFQ1QodGhyZWFkTWFuYWdlci0+cGVuZGluZ1Rhc2tDb3VudCgpLCAwKTsKKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0XHR1bmJsb2NrIHRhc2sgYW5kIHJlbW92ZSB3b3JrZXIuLiAiIDw8IHN0ZDo6ZW5kbDsKKworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKGJsb2NrTW9uaXRvcik7CisgICAgICBibG9ja2VkID0gZmFsc2U7CisgICAgICBibG9ja01vbml0b3Iubm90aWZ5QWxsKCk7CisgICAgfQorICAgIHRocmVhZE1hbmFnZXItPnJlbW92ZVdvcmtlcigpOworCisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPndvcmtlckNvdW50KCksIDApOworICAgIEVYUEVDVCh0aHJlYWRNYW5hZ2VyLT5pZGxlV29ya2VyQ291bnQoKSwgMCk7CisgICAgRVhQRUNUKHRocmVhZE1hbmFnZXItPnBlbmRpbmdUYXNrQ291bnQoKSwgMCk7CisKKyAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0Y2xlYW51cC4uICIgPDwgc3RkOjplbmRsOworCisgICAgYmxvY2tpbmdUYXNrLnJlc2V0KCk7CisgICAgdGhyZWFkTWFuYWdlci5yZXNldCgpOworICAgIHJldHVybiB0cnVlOworICB9CiB9OwogCi1jb25zdCBkb3VibGUgVGhyZWFkTWFuYWdlclRlc3RzOjpFUlJPUiA9IC4yMDsKLQotfX19fSAvLyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3kKK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OnRlc3Q7Ci0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKaW5kZXggNGZlOTY2Ny4uMWM1MmM0NyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKQEAgLTI1LDU1ICsyNSwzNiBAQAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgY29uY3VycmVuY3kgeworbmFtZXNwYWNlIHRlc3QgewogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogCi0vKioKLSAqIFRocmVhZE1hbmFnZXJUZXN0cyBjbGFzcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KIGNsYXNzIFRpbWVyTWFuYWdlclRlc3RzIHsKIAotIHB1YmxpYzoKLQotICBzdGF0aWMgY29uc3QgZG91YmxlIEVSUk9SOwotCi0gIGNsYXNzIFRhc2s6IHB1YmxpYyBSdW5uYWJsZSB7Ci0gICBwdWJsaWM6Ci0KLSAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIGludDY0X3QgdGltZW91dCkgOgotICAgICAgX3RpbWVvdXQodGltZW91dCksCi0gICAgICBfc3RhcnRUaW1lKFV0aWw6OmN1cnJlbnRUaW1lKCkpLAotICAgICAgX21vbml0b3IobW9uaXRvciksCi0gICAgICBfc3VjY2VzcyhmYWxzZSksCi0gICAgICBfZG9uZShmYWxzZSkge30KK3B1YmxpYzoKKyAgY2xhc3MgVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CisgIHB1YmxpYzoKKyAgICBUYXNrKE1vbml0b3ImIG1vbml0b3IsIGludDY0X3QgdGltZW91dCkKKyAgICAgIDogX3RpbWVvdXQodGltZW91dCksCisgICAgICAgIF9zdGFydFRpbWUoVXRpbDo6Y3VycmVudFRpbWUoKSksCisgICAgICAgIF9lbmRUaW1lKDApLAorICAgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgICAgX3N1Y2Nlc3MoZmFsc2UpLAorICAgICAgICBfZG9uZShmYWxzZSkge30KIAogICAgIH5UYXNrKCkgeyBzdGQ6OmNlcnIgPDwgdGhpcyA8PCBzdGQ6OmVuZGw7IH0KIAogICAgIHZvaWQgcnVuKCkgewogCiAgICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICBfc3VjY2VzcyA9IChfZW5kVGltZSAtIF9zdGFydFRpbWUpID49IF90aW1lb3V0OwogCi0gICAgICAvLyBGaWd1cmUgb3V0IGVycm9yIHBlcmNlbnRhZ2UKLQotICAgICAgaW50NjRfdCBkZWx0YSA9IF9lbmRUaW1lIC0gX3N0YXJ0VGltZTsKLQotCi0gICAgICBkZWx0YSA9IGRlbHRhID4gX3RpbWVvdXQgPyAgZGVsdGEgLSBfdGltZW91dCA6IF90aW1lb3V0IC0gZGVsdGE7Ci0KLSAgICAgIGZsb2F0IGVycm9yID0gZGVsdGEgLyBfdGltZW91dDsKLQotICAgICAgaWYoZXJyb3IgPCBFUlJPUikgewotICAgICAgICBfc3VjY2VzcyA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIF9kb25lID0gdHJ1ZTsKLQotICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHRUaW1lck1hbmFnZXJUZXN0czo6VGFza1siIDw8IHRoaXMgPDwgIl0gZG9uZSIgPDwgc3RkOjplbmRsOyAvL2RlYnVnCi0KLSAgICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICB7CisgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgICAgX2RvbmUgPSB0cnVlOwogICAgICAgICBfbW9uaXRvci5ub3RpZnlBbGwoKTsKICAgICAgIH0KICAgICB9CkBAIC05MiwxOSArNzMsMTkgQEAKICAgICogcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQgdGFzayB3aGVuIHRoZQogICAgKiBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCiAgICAqLwotICBib29sIHRlc3QwMChpbnQ2NF90IHRpbWVvdXQ9MTAwMExMKSB7CisgIGJvb2wgdGVzdDAwKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgewogCi0gICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzayA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7CisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gb3JwaGFuVGFzaworICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7CiAKICAgICB7Ci0KICAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7Ci0KICAgICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKLQogICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7Ci0KLSAgICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworICAgICAgaWYgKHRpbWVyTWFuYWdlci5zdGF0ZSgpICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInRpbWVyTWFuYWdlciBpcyBub3QgaW4gdGhlIFNUQVJURUQgc3RhdGUsIGJ1dCBzaG91bGQgYmUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQogCiAgICAgICAvLyBEb24ndCBjcmVhdGUgdGFzayB5ZXQsIGJlY2F1c2UgaXRzIGNvbnN0cnVjdG9yIHNldHMgdGhlIGV4cGVjdGVkIGNvbXBsZXRpb24gdGltZSwgYW5kIHdlCiAgICAgICAvLyBuZWVkIHRvIGRlbGF5IGJldHdlZW4gaW5zZXJ0aW5nIHRoZSB0d28gdGFza3MgaW50byB0aGUgcnVuIHF1ZXVlLgpAQCAtMTEyLDM0ICs5MywxNjEgQEAKIAogICAgICAgewogICAgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7Ci0KICAgICAgICAgdGltZXJNYW5hZ2VyLmFkZChvcnBoYW5UYXNrLCAxMCAqIHRpbWVvdXQpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgLy8gV2FpdCBmb3IgMSBzZWNvbmQgaW4gb3JkZXIgdG8gZ2l2ZSB0aW1lck1hbmFnZXIgYSBjaGFuY2UgdG8gc3RhcnQgc2xlZXBpbmcgaW4gcmVzcG9uc2UKLSAgICAgICAgICAvLyB0byBhZGRpbmcgb3JwaGFuVGFzay4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIHdlIGNhbiB2ZXJpZnkgdGhhdCBhZGRpbmcgdGhlIHNlY29uZCB0YXNrCi0gICAgICAgICAgLy8ga2lja3MgdGhlIGRpc3BhdGNoZXIgb3V0IG9mIHRoZSBjdXJyZW50IHdhaXQgYW5kIHN0YXJ0cyB0aGUgbmV3IDEgc2Vjb25kIHdhaXQuCi0gICAgICAgICAgX21vbml0b3Iud2FpdCAoMTAwMCk7Ci0gICAgICAgICAgYXNzZXJ0ICgwID09ICJFUlJPUjogVGhpcyB3YWl0IHNob3VsZCB0aW1lIG91dC4gVGltZXJNYW5hZ2VyIGRpc3BhdGNoZXIgbWF5IGhhdmUgYSBwcm9ibGVtLiIpOwotICAgICAgICB9IGNhdGNoIChUaW1lZE91dEV4Y2VwdGlvbiAmZXgpIHsKLSAgICAgICAgfQorICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh0aW1lb3V0ICogMTAwMCk7CiAKLSAgICAgICAgdGFzay5yZXNldCAobmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7Ci0KKyAgICAgICAgdGFzay5yZXNldChuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKICAgICAgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0aW1lb3V0KTsKLQogICAgICAgICBfbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7Ci0KKyAgICAgIGlmICghdGFzay0+X2RvbmUpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJ0YXNrIGlzIG5vdCBkb25lLCBidXQgaXQgc2hvdWxkIGhhdmUgZXhlY3V0ZWQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQogCiAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdCIgPDwgKHRhc2stPl9zdWNjZXNzID8gIlN1Y2Nlc3MiIDogIkZhaWx1cmUiKSA8PCAiISIgPDwgc3RkOjplbmRsOwogICAgIH0KIAotICAgIC8vIHRpbWVyTWFuYWdlci5zdG9wKCk7IFRoaXMgaXMgd2hlcmUgaXQgaGFwcGVucyB2aWEgZGVzdHJ1Y3RvcgorICAgIGlmIChvcnBoYW5UYXNrLT5fZG9uZSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJvcnBoYW4gdGFzayBpcyBkb25lLCBidXQgaXQgc2hvdWxkIG5vdCBoYXZlIGV4ZWN1dGVkIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgYXNzZXJ0KCFvcnBoYW5UYXNrLT5fZG9uZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzLCByZW1vdmVzIHRoZSBmaXJzdCBvbmUgdGhlbiB3YWl0cyBmb3IgdGhlIHNlY29uZCBvbmUuIEl0IHRoZW4KKyAgICogdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dAorICAgKiB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAxKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHR3byB0YXNrcworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAyKSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSBvbmUgdGFzayBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGFza1RvUmVtb3ZlKTsKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQgKiAyKTsKKworICAgIGFzc2VydCghdGFza1RvUmVtb3ZlLT5fZG9uZSk7CisgICAgYXNzZXJ0KHRhc2stPl9kb25lKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcyB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrIGFuZCBhbm90aGVyIG9uZSwgdGhlbiByZW1vdmVzIHRoZSB0d28KKyAgICogZHVwbGljYXRlZCB0aGVuIHdhaXRzIGZvciB0aGUgbGFzdCBvbmUuIEl0IHRoZW4gdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseQorICAgKiBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dCB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUKKyAgICogYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAyKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIG9uZSB0YXNrcyBhbmQgYWRkIGl0IHR3aWNlCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDMpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQgKiAyKTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGZpcnN0IHRhc2sgKGUuZy4gdHdvIHRpbWVycykgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRhc2tUb1JlbW92ZSk7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3MsIHJlbW92ZXMgdGhlIGZpcnN0IG9uZSB0aGVuIHdhaXRzIGZvciB0aGUgc2Vjb25kIG9uZS4gSXQgdGhlbgorICAgKiB2ZXJpZmllcyB0aGF0IHRoZSB0aW1lciBtYW5hZ2VyIHByb3Blcmx5IGNsZWFuIHVwIGl0c2VsZiBhbmQgdGhlIHJlbWFpbmluZyBvcnBoYW5lZCB0aW1lb3V0CisgICAqIHRhc2sgd2hlbiB0aGUgbWFuYWdlciBnb2VzIG91dCBvZiBzY29wZSBhbmQgaXRzIGRlc3RydWN0b3IgaXMgY2FsbGVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDMoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdHdvIHRhc2tzCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFza1RvUmVtb3ZlCisgICAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMikpOworICAgIFRpbWVyTWFuYWdlcjo6VGltZXIgdGltZXIgPSB0aW1lck1hbmFnZXIuYWRkKHRhc2tUb1JlbW92ZSwgdGFza1RvUmVtb3ZlLT5fdGltZW91dCk7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIG9uZSB0YXNrIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICAvLyBWZXJpZnkgYmVoYXZpb3Igd2hlbiByZW1vdmluZyB0aGUgcmVtb3ZlZCB0YXNrCisgICAgdHJ5IHsKKyAgICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgICAgYXNzZXJ0KDAgPT0gIkVSUk9SOiBUaGlzIHJlbW92ZSBzaG91bGQgc2VuZCBhIE5vU3VjaFRhc2tFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgIH0gY2F0Y2ggKE5vU3VjaFRhc2tFeGNlcHRpb24mKSB7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgb25lIHRhc2tzLCBhbmQgdHJpZXMgdG8gcmVtb3ZlIGl0IGFmdGVyIGl0IGhhcyBleHBpcmVkLgorICAgKi8KKyAgYm9vbCB0ZXN0MDQoaW50NjRfdCB0aW1lb3V0ID0gMTAwMExMKSB7CisgICAgVGltZXJNYW5hZ2VyIHRpbWVyTWFuYWdlcjsKKyAgICB0aW1lck1hbmFnZXIudGhyZWFkRmFjdG9yeShzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKSk7CisgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7CisgICAgYXNzZXJ0KHRpbWVyTWFuYWdlci5zdGF0ZSgpID09IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCk7CisKKyAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisKKyAgICAvLyBTZXR1cCB0aGUgdGFzaworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMTApKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBXYWl0IHVudGlsIHRoZSB0YXNrIGhhcyBjb21wbGV0ZWQKKyAgICBfbW9uaXRvci53YWl0KHRpbWVvdXQpOworCisgICAgLy8gVmVyaWZ5IGJlaGF2aW9yIHdoZW4gcmVtb3ZpbmcgdGhlIGV4cGlyZWQgdGFzaworICAgIHRyeSB7CisgICAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICAgIGFzc2VydCgwID09ICJFUlJPUjogVGhpcyByZW1vdmUgc2hvdWxkIHNlbmQgYSBOb1N1Y2hUYXNrRXhjZXB0aW9uIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hUYXNrRXhjZXB0aW9uJikgeworICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0xNDksNyArMjU3LDcgQEAKICAgTW9uaXRvciBfbW9uaXRvcjsKIH07CiAKLWNvbnN0IGRvdWJsZSBUaW1lck1hbmFnZXJUZXN0czo6RVJST1IgPSAuMjA7Ci0KLX19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5Ci0KK30KK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvbGluay9MaW5rVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9saW5rL0xpbmtUZXN0LmNwcApAQCAtMCwwICsxLDIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ludCBtYWluKGludCwgY2hhcioqKSB7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwIGIvbGliL2NwcC90ZXN0L2xpbmsvVGVtcGxhdGVkU2VydmljZTEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMTc5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMS5jcHAKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGlzIGEgcGFydCBvZiBhIGxpbmsgdGVzdCB0aGF0IG1ha2VzIHN1cmUgZ2VuZXJhdGVkCisgKiB0ZW1wbGF0ZWQgc2VydmljZSBoZWFkZXJzIGNhbiBiZSBpbmNsdWRlZCBmcm9tIG11bHRpcGxlCisgKiBpbXBsZW1lbnRhdGlvbiBmaWxlcy4KKyAqLworCisjaW5jbHVkZSAiZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAgYi9saWIvY3BwL3Rlc3QvbGluay9UZW1wbGF0ZWRTZXJ2aWNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9saW5rL1RlbXBsYXRlZFNlcnZpY2UyLmNwcApAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgaXMgYSBwYXJ0IG9mIGEgbGluayB0ZXN0IHRoYXQgbWFrZXMgc3VyZSBnZW5lcmF0ZWQKKyAqIHRlbXBsYXRlZCBzZXJ2aWNlIGhlYWRlcnMgY2FuIGJlIGluY2x1ZGVkIGZyb20gbXVsdGlwbGUKKyAqIGltcGxlbWVudGF0aW9uIGZpbGVzLgorICovCisKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKaW5kZXggMGFjMzAyOC4uZTNkZGJjYyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAKQEAgLTE5LDI3ICsxOSwzMSBAQAogI2luY2x1ZGUgIkV2ZW50TG9nLmgiCiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIG5hbWVzcGFjZSB7CiAKKy8vIERlZmluZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBERUJVR19FVkVOVExPRyB0byBlbmFibGUgZGVidWcgbG9nZ2luZworLy8gZXg6ICQgREVCVUdfRVZFTlRMT0c9MSBwcm9jZXNzb3JfdGVzdAorc3RhdGljIGNvbnN0IGNoYXIgKiBERUJVR19FVkVOVExPRyA9IGdldGVudigiREVCVUdfRVZFTlRMT0ciKTsKKwogdm9pZCBkZWJ1Zyhjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICAvLyBDb21tZW50IG91dCB0aGlzIHJldHVybiB0byBlbmFibGUgZGVidWcgbG9ncyBmcm9tIHRoZSB0ZXN0IGNvZGUuCi0gIHJldHVybjsKKyAgaWYgKERFQlVHX0VWRU5UTE9HKSB7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CiAKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0KLSAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgfQorfQogfQogCi19Ci0KLW5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIHRlc3QgeworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0ZXN0IHsKIAogdWludDMyX3QgRXZlbnRMb2c6Om5leHRJZF8gPSAwOwogCkBAIC03NCwxMSArNzgsMTIgQEAKICAgZGVidWcoIk5ldyBsb2c6ICVkIiwgaWRfKTsKIH0KIAotdm9pZCBFdmVudExvZzo6YXBwZW5kKEV2ZW50VHlwZSB0eXBlLCB1aW50MzJfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGNhbGxJZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKK3ZvaWQgRXZlbnRMb2c6OmFwcGVuZChFdmVudFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FsbElkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CiAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKLSAgZGVidWcoIiVkIDwtLSAldSwgJXUsICVzIFwiJXNcIiIsIGlkXywgY29ubmVjdGlvbklkLCBjYWxsSWQsIHR5cGUsCi0gICAgICAgIG1lc3NhZ2UuY19zdHIoKSk7CisgIGRlYnVnKCIlZCA8LS0gJXUsICV1LCAlcyBcIiVzXCIiLCBpZF8sIGNvbm5lY3Rpb25JZCwgY2FsbElkLCB0eXBlLCBtZXNzYWdlLmNfc3RyKCkpOwogCiAgIEV2ZW50IGUodHlwZSwgY29ubmVjdGlvbklkLCBjYWxsSWQsIG1lc3NhZ2UpOwogICBldmVudHNfLnB1c2hfYmFjayhlKTsKQEAgLTEyNSw1ICsxMzAsNiBAQAogICAgIH0KICAgfQogfQotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvRXZlbnRMb2cuaAppbmRleCBkNzMxY2VjLi40ZjgyNzVkIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmgKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5oCkBAIC0yMSw3ICsyMSw5IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIC8vIEluaXRpYWxseSBJIG1hZGUgRXZlbnRUeXBlIGFuIGVudW0sIGJ1dCB1c2luZyBjaGFyKiByZXN1bHRzCiAvLyBpbiBtdWNoIG1vcmUgcmVhZGFibGUgZXJyb3IgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhIG1pc21hdGNoLgpAQCAtMzEsMjEgKzMzLDE3IEBACiB0eXBlZGVmIGNvbnN0IGNoYXIqIEV2ZW50VHlwZTsKIAogc3RydWN0IEV2ZW50IHsKLSAgRXZlbnQoRXZlbnRUeXBlIHR5cGUsIHVpbnQzMl90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgY2FsbElkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkgOgotICAgICAgdHlwZSh0eXBlKSwKLSAgICAgIGNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLAotICAgICAgY2FsbElkKGNhbGxJZCksCi0gICAgICBtZXNzYWdlKG1lc3NhZ2UpIHt9CisgIEV2ZW50KEV2ZW50VHlwZSB0eXBlLCB1aW50MzJfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGNhbGxJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpCisgICAgOiB0eXBlKHR5cGUpLCBjb25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgY2FsbElkKGNhbGxJZCksIG1lc3NhZ2UobWVzc2FnZSkge30KIAogICBFdmVudFR5cGUgdHlwZTsKLSAgdWludDMyX3QgIGNvbm5lY3Rpb25JZDsKLSAgdWludDMyX3QgIGNhbGxJZDsKLSAgc3RkOjpzdHJpbmcgICAgbWVzc2FnZTsKKyAgdWludDMyX3QgY29ubmVjdGlvbklkOworICB1aW50MzJfdCBjYWxsSWQ7CisgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CiB9OwogCiBjbGFzcyBFdmVudExvZyB7Ci0gcHVibGljOgorcHVibGljOgogICBzdGF0aWMgRXZlbnRUeXBlIEVUX0xPR19FTkQ7CiAgIHN0YXRpYyBFdmVudFR5cGUgRVRfQ09OTl9DUkVBVEVEOwogICBzdGF0aWMgRXZlbnRUeXBlIEVUX0NPTk5fREVTVFJPWUVEOwpAQCAtNzMsMTMgKzcxLDE1IEBACiAKICAgRXZlbnRMb2coKTsKIAotICB2b2lkIGFwcGVuZChFdmVudFR5cGUgdHlwZSwgdWludDMyX3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBjYWxsSWQsCisgIHZvaWQgYXBwZW5kKEV2ZW50VHlwZSB0eXBlLAorICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgIHVpbnQzMl90IGNhbGxJZCwKICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UgPSAiIik7CiAKICAgRXZlbnQgd2FpdEZvckV2ZW50KGludDY0X3QgdGltZW91dCA9IDUwMCk7CiAgIEV2ZW50IHdhaXRGb3JDb25uRXZlbnQodWludDMyX3QgY29ubklkLCBpbnQ2NF90IHRpbWVvdXQgPSA1MDApOwogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICB0eXBlZGVmIHN0ZDo6bGlzdDxFdmVudD4gRXZlbnRMaXN0OwogCiAgIGNvbmN1cnJlbmN5OjpNb25pdG9yIG1vbml0b3JfOwpAQCAtODgsNyArODgsOCBAQAogCiAgIHN0YXRpYyB1aW50MzJfdCBuZXh0SWRfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RFU1RfRVZFTlRMT0dfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaAppbmRleCAyYmUyNjJhLi4yOTc4NGQ4IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCkBAIC0yMywxNSArMjMsMTQgQEAKICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKICNpbmNsdWRlICJnZW4tY3BwL0NoaWxkU2VydmljZS5oIgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIGNsYXNzIFBhcmVudEhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyBQYXJlbnRTZXJ2aWNlSWYgewotIHB1YmxpYzoKLSAgUGFyZW50SGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOgotICAgICAgdHJpZ2dlck1vbml0b3IoJm11dGV4XyksCi0gICAgICBnZW5lcmF0aW9uXygwKSwKLSAgICAgIHdhaXRfKGZhbHNlKSwKLSAgICAgIGxvZ18obG9nKSB7IH0KK3B1YmxpYzoKKyAgUGFyZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpCisgICAgOiB0cmlnZ2VyTW9uaXRvcigmbXV0ZXhfKSwgZ2VuZXJhdGlvbl8oMCksIHdhaXRfKGZhbHNlKSwgbG9nXyhsb2cpIHt9CiAKICAgaW50MzJfdCBpbmNyZW1lbnRHZW5lcmF0aW9uKCkgewogICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CkBAIC01Nyw3ICs1Niw3IEBACiAgICAgX3JldHVybiA9IHN0cmluZ3NfOwogICB9CiAKLSAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYgX3JldHVybiwgaW50MzJfdCBsZW5ndGgpIHsKKyAgdm9pZCBnZXREYXRhV2FpdChzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3QgaW50MzJfdCBsZW5ndGgpIHsKICAgICBjb25jdXJyZW5jeTo6R3VhcmQgZyhtdXRleF8pOwogICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9HRVRfREFUQV9XQUlULCAwLCAwKTsKIApAQCAtMTE2LDcgKzExNSw3IEBACiAgICAgdHJpZ2dlck1vbml0b3Iubm90aWZ5QWxsKCk7CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgLyoqCiAgICAqIGJsb2NrVW50aWxUcmlnZ2VyZWQoKSB3b24ndCByZXR1cm4gdW50aWwgdHJpZ2dlclBlbmRpbmdDYWxscygpIGlzIGludm9rZWQKICAgICogaW4gYW5vdGhlciB0aHJlYWQuCkBAIC0xMzcsMTYgKzEzNiwxOSBAQAogICBpbnQzMl90IGdlbmVyYXRpb25fOwogICBib29sIHdhaXRfOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nc187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CiB9OwogCi1jbGFzcyBDaGlsZEhhbmRsZXIgOiBwdWJsaWMgUGFyZW50SGFuZGxlciwgdmlydHVhbCBwdWJsaWMgQ2hpbGRTZXJ2aWNlSWYgewotIHB1YmxpYzoKLSAgQ2hpbGRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6Ci0gICAgICBQYXJlbnRIYW5kbGVyKGxvZyksCi0gICAgICB2YWx1ZV8oMCkge30KKyNpZmRlZiBfV0lOMzIKKyAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDI1MCApIC8vaW5oZXJpdGluZyBtZXRob2RzIHZpYSBkb21pbmFuY2UKKyNlbmRpZgogCi0gIGludDMyX3Qgc2V0VmFsdWUoaW50MzJfdCB2YWx1ZSkgeworY2xhc3MgQ2hpbGRIYW5kbGVyIDogcHVibGljIFBhcmVudEhhbmRsZXIsIHZpcnR1YWwgcHVibGljIENoaWxkU2VydmljZUlmIHsKK3B1YmxpYzoKKyAgQ2hpbGRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBQYXJlbnRIYW5kbGVyKGxvZyksIHZhbHVlXygwKSB7fQorCisgIGludDMyX3Qgc2V0VmFsdWUoY29uc3QgaW50MzJfdCB2YWx1ZSkgewogICAgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKG11dGV4Xyk7CiAgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DQUxMX1NFVF9WQUxVRSwgMCwgMCk7CiAKQEAgLTE2Miw0NiArMTY0LDQ0IEBACiAgICAgcmV0dXJuIHZhbHVlXzsKICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICBpbnQzMl90IHZhbHVlXzsKIH07CiAKLXN0cnVjdCBDb25uQ29udGV4dCB7Ci0gcHVibGljOgotICBDb25uQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAotICAgICAgICAgICAgICB1aW50MzJfdCBpZCkgOgotICAgICAgaW5wdXQoaW4pLAotICAgICAgb3V0cHV0KG91dCksCi0gICAgICBpZChpZCkge30KKyNpZmRlZiBfV0lOMzIKKyAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorI2VuZGlmCiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKK3N0cnVjdCBDb25uQ29udGV4dCB7CitwdWJsaWM6CisgIENvbm5Db250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgICAgICAgICAgICAgdWludDMyX3QgaWQpCisgICAgOiBpbnB1dChpbiksIG91dHB1dChvdXQpLCBpZChpZCkge30KKworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CiAgIHVpbnQzMl90IGlkOwogfTsKIAogc3RydWN0IENhbGxDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIENhbGxDb250ZXh0KENvbm5Db250ZXh0ICpjb250ZXh0LCB1aW50MzJfdCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIDoKLSAgICAgIGNvbm5Db250ZXh0KGNvbnRleHQpLAotICAgICAgbmFtZShuYW1lKSwKLSAgICAgIGlkKGlkKSB7fQorcHVibGljOgorICBDYWxsQ29udGV4dChDb25uQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQorICAgIDogY29ubkNvbnRleHQoY29udGV4dCksIG5hbWUobmFtZSksIGlkKGlkKSB7fQogCi0gIENvbm5Db250ZXh0ICpjb25uQ29udGV4dDsKKyAgQ29ubkNvbnRleHQqIGNvbm5Db250ZXh0OwogICBzdGQ6OnN0cmluZyBuYW1lOwogICB1aW50MzJfdCBpZDsKIH07CiAKIGNsYXNzIFNlcnZlckV2ZW50SGFuZGxlciA6IHB1YmxpYyBzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXIgewotIHB1YmxpYzoKLSAgU2VydmVyRXZlbnRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6Ci0gICAgICBuZXh0SWRfKDEpLAotICAgICAgbG9nXyhsb2cpIHt9CitwdWJsaWM6CisgIFNlcnZlckV2ZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CiAKICAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkge30KIAotICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQpIHsKICAgICBDb25uQ29udGV4dCogY29udGV4dCA9IG5ldyBDb25uQ29udGV4dChpbnB1dCwgb3V0cHV0LCBuZXh0SWRfKTsKICAgICArK25leHRJZF87CiAgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9DT05OX0NSRUFURUQsIGNvbnRleHQtPmlkLCAwKTsKQEAgLTIwOSw4ICsyMDksOCBAQAogICB9CiAKICAgdmlydHVhbCB2b2lkIGRlbGV0ZUNvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD5pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD5vdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CiAKICAgICBpZiAoaW5wdXQgIT0gY29udGV4dC0+aW5wdXQpIHsKQEAgLTIyNSwzOCArMjI1LDM4IEBACiAgICAgZGVsZXRlIGNvbnRleHQ7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQoCi0gICAgICB2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKLSAgICAvLyBUT0RPOiBXZSBjdXJyZW50bHkgZG9uJ3QgdGVzdCB0aGUgYmVoYXZpb3Igb2YgdGhlIHByb2Nlc3NDb250ZXh0KCkKLSAgICAvLyBjYWxscy4gIFRoZSB2YXJpb3VzIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGF0Ci0gICAgLy8gc2xpZ2h0bHkgZGlmZmVyZW50IHRpbWVzLCBhbmQgaXQgaXMgdG9vIGFubm95aW5nIHRvIHRyeSBhbmQgYWNjb3VudCBmb3IKLSAgICAvLyB0aGVpciB2YXJpb3VzIGRpZmZlcmVuY2VzLgotICAgIC8vCi0gICAgLy8gVFRocmVhZGVkU2VydmVyLCBUVGhyZWFkUG9vbFNlcnZlciwgYW5kIFRTaW1wbGVTZXJ2ZXIgdXN1YWxseSB3YWl0IHVudGlsCi0gICAgLy8gdGhleSBzZWUgdGhlIGZpcnN0IGJ5dGUgb2YgYSByZXF1ZXN0IGJlZm9yZSBjYWxsaW5nIHByb2Nlc3NDb250ZXh0KCkuCi0gICAgLy8gSG93ZXZlciwgdGhleSBkb24ndCB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdmVyeSBmaXJzdCByZXF1ZXN0LAotICAgIC8vIGFuZCBpbnN0ZWFkIGltbWVkaWF0ZWx5IGNhbGwgcHJvY2Vzc0NvbnRleHQoKSBiZWZvcmUgYW55IGRhdGEgaXMKLSAgICAvLyByZWNlaXZlZC4KLSAgICAvLwotICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciBhbHdheXMgd2FpdHMgdW50aWwgcmVjZWl2aW5nIHRoZSBmdWxsIHJlcXVlc3QgYmVmb3JlCi0gICAgLy8gY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgorICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgeworLy8gVE9ETzogV2UgY3VycmVudGx5IGRvbid0IHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9jZXNzQ29udGV4dCgpCisvLyBjYWxscy4gIFRoZSB2YXJpb3VzIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGF0CisvLyBzbGlnaHRseSBkaWZmZXJlbnQgdGltZXMsIGFuZCBpdCBpcyB0b28gYW5ub3lpbmcgdG8gdHJ5IGFuZCBhY2NvdW50IGZvcgorLy8gdGhlaXIgdmFyaW91cyBkaWZmZXJlbmNlcy4KKy8vCisvLyBUVGhyZWFkZWRTZXJ2ZXIsIFRUaHJlYWRQb29sU2VydmVyLCBhbmQgVFNpbXBsZVNlcnZlciB1c3VhbGx5IHdhaXQgdW50aWwKKy8vIHRoZXkgc2VlIHRoZSBmaXJzdCBieXRlIG9mIGEgcmVxdWVzdCBiZWZvcmUgY2FsbGluZyBwcm9jZXNzQ29udGV4dCgpLgorLy8gSG93ZXZlciwgdGhleSBkb24ndCB3YWl0IGZvciB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdmVyeSBmaXJzdCByZXF1ZXN0LAorLy8gYW5kIGluc3RlYWQgaW1tZWRpYXRlbHkgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGJlZm9yZSBhbnkgZGF0YSBpcworLy8gcmVjZWl2ZWQuCisvLworLy8gVE5vbmJsb2NraW5nU2VydmVyIGFsd2F5cyB3YWl0cyB1bnRpbCByZWNlaXZpbmcgdGhlIGZ1bGwgcmVxdWVzdCBiZWZvcmUKKy8vIGNhbGxpbmcgcHJvY2Vzc0NvbnRleHQoKS4KICNpZiAwCiAgICAgQ29ubkNvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CiAgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUk9DRVNTLCBjb250ZXh0LT5pZCwgMCk7CisjZWxzZQorICAgIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoc2VydmVyQ29udGV4dCk7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRSh0cmFuc3BvcnQpOwogI2VuZGlmCiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgdWludDMyX3QgbmV4dElkXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKIH07CiAKIGNsYXNzIFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIFByb2Nlc3NvckV2ZW50SGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOgotICAgICAgbmV4dElkXygxKSwKLSAgICAgIGxvZ18obG9nKSB7fQorcHVibGljOgorICBQcm9jZXNzb3JFdmVudEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IG5leHRJZF8oMSksIGxvZ18obG9nKSB7fQogCiAgIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5OYW1lLCB2b2lkKiBzZXJ2ZXJDb250ZXh0KSB7CiAgICAgQ29ubkNvbnRleHQqIGNvbm5Db250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOwpAQCAtMjY0LDc4ICsyNjQsNzUgQEAKICAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IG5ldyBDYWxsQ29udGV4dChjb25uQ29udGV4dCwgbmV4dElkXywgZm5OYW1lKTsKICAgICArK25leHRJZF87CiAKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU1RBUlRFRCwgY29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwKLSAgICAgICAgICAgICAgICAgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfU1RBUlRFRCwgY29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgICByZXR1cm4gY29udGV4dDsKICAgfQogCiAgIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKICAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwotICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQ0FMTF9GSU5JU0hFRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLAotICAgICAgICAgICAgICAgICBjb250ZXh0LT5pZCwgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NBTExfRklOSVNIRUQsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgICAgZGVsZXRlIGNvbnRleHQ7CiAgIH0KIAogICB2b2lkIHByZVJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKICAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwotICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1JFQUQsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsCi0gICAgICAgICAgICAgICAgIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QUkVfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCiAgIHZvaWQgcG9zdFJlYWQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShieXRlcyk7CiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwKLSAgICAgICAgICAgICAgICAgZm5OYW1lKTsKKyAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfUkVBRCwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCiAgIHZvaWQgcHJlV3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUpIHsKICAgICBDYWxsQ29udGV4dCogY29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2FsbENvbnRleHQqPihjdHgpOwogICAgIGNoZWNrTmFtZShjb250ZXh0LCBmbk5hbWUpOwotICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLAotICAgICAgICAgICAgICAgICBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfUFJFX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICB9CiAKICAgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbk5hbWUsIHVpbnQzMl90IGJ5dGVzKSB7CisgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShieXRlcyk7CiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX1BPU1RfV1JJVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwKLSAgICAgICAgICAgICAgICAgY29udGV4dC0+aWQsIGZuTmFtZSk7CisgICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9QT1NUX1dSSVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsIGNvbnRleHQtPmlkLCBmbk5hbWUpOwogICB9CiAKICAgdm9pZCBhc3luY0NvbXBsZXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5OYW1lKSB7CiAgICAgQ2FsbENvbnRleHQqIGNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENhbGxDb250ZXh0Kj4oY3R4KTsKICAgICBjaGVja05hbWUoY29udGV4dCwgZm5OYW1lKTsKLSAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0FTWU5DX0NPTVBMRVRFLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsCi0gICAgICAgICAgICAgICAgIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfQVNZTkNfQ09NUExFVEUsIGNvbnRleHQtPmNvbm5Db250ZXh0LT5pZCwgY29udGV4dC0+aWQsIGZuTmFtZSk7CiAgIH0KIAogICB2b2lkIGhhbmRsZXJFcnJvcih2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuTmFtZSkgewogICAgIENhbGxDb250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDYWxsQ29udGV4dCo+KGN0eCk7CiAgICAgY2hlY2tOYW1lKGNvbnRleHQsIGZuTmFtZSk7Ci0gICAgbG9nXy0+YXBwZW5kKEV2ZW50TG9nOjpFVF9IQU5ETEVSX0VSUk9SLCBjb250ZXh0LT5jb25uQ29udGV4dC0+aWQsCi0gICAgICAgICAgICAgICAgIGNvbnRleHQtPmlkLCBmbk5hbWUpOworICAgIGxvZ18tPmFwcGVuZChFdmVudExvZzo6RVRfSEFORExFUl9FUlJPUiwgY29udGV4dC0+Y29ubkNvbnRleHQtPmlkLCBjb250ZXh0LT5pZCwgZm5OYW1lKTsKICAgfQogCi0gcHJvdGVjdGVkOgorcHJvdGVjdGVkOgogICB2b2lkIGNoZWNrTmFtZShjb25zdCBDYWxsQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogZm5OYW1lKSB7CiAgICAgLy8gTm90ZTogd2UgY2FuJ3QgdXNlIEJPT1NUX0NIRUNLX0VRVUFMIGhlcmUsIHNpbmNlIHRoZSBoYW5kbGVyIHJ1bnMgaW4gYQogICAgIC8vIGRpZmZlcmVudCB0aHJlYWQgZnJvbSB0aGUgdGVzdCBmdW5jdGlvbnMuICBKdXN0IGFib3J0IGlmIHRoZSBuYW1lcyBhcmUKICAgICAvLyBkaWZmZXJlbnQKICAgICBpZiAoY29udGV4dC0+bmFtZSAhPSBmbk5hbWUpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiY2FsbCBjb250ZXh0IG5hbWUgbWlzbWF0Y2g6IFwiJXNcIiAhPSBcIiVzXCJcbiIsCi0gICAgICAgICAgICAgIGNvbnRleHQtPm5hbWUuY19zdHIoKSwgZm5OYW1lKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiY2FsbCBjb250ZXh0IG5hbWUgbWlzbWF0Y2g6IFwiJXNcIiAhPSBcIiVzXCJcbiIsCisgICAgICAgICAgICAgIGNvbnRleHQtPm5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgZm5OYW1lKTsKICAgICAgIGZmbHVzaChzdGRlcnIpOwogICAgICAgYWJvcnQoKTsKICAgICB9CiAgIH0KIAogICB1aW50MzJfdCBuZXh0SWRfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOwogfTsKLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1BST0NFU1NPUl9URVNUX0hBTkRMRVJTX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAppbmRleCA1OGI4MmZiLi4zNmNlMDEzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKQEAgLTIzLDEwICsyMyw5IEBACiAgKiBpbXBsZW1lbnRhdGlvbnMuCiAgKi8KIAotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KIAotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KQEAgLTM0LDEzMCArMzMsMTI5IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgogCiAjaW5jbHVkZSAiRXZlbnRMb2cuaCIKICNpbmNsdWRlICJTZXJ2ZXJUaHJlYWQuaCIKICNpbmNsdWRlICJIYW5kbGVycy5oIgogI2luY2x1ZGUgImdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6c2VydmVyOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Ci0KIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dGVzdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKIAogLyoKICAqIFRyYWl0cyBjbGFzc2VzIHRoYXQgZW5jYXBzdWxhdGUgaG93IHRvIGNyZWF0ZSB2YXJpb3VzIHR5cGVzIG9mIHNlcnZlcnMuCiAgKi8KIAogY2xhc3MgVFNpbXBsZVNlcnZlclRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFRTaW1wbGVTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgc2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOwotICAgIHJldHVybiBzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KG5ldyBUU2ltcGxlU2VydmVyKAotICAgICAgICAgIHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4oCisgICAgICAgIG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKICAgfQogfTsKIAogY2xhc3MgVFRocmVhZGVkU2VydmVyVHJhaXRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgVFRocmVhZGVkU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgc2hhcmVkX3B0cjxUVGhyZWFkZWRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRlZFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0gICAgcmV0dXJuIHNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPihuZXcgVFRocmVhZGVkU2VydmVyKAotICAgICAgICAgIHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPigKKyAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0KIH07CiAKIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyVHJhaXRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgVFRocmVhZFBvb2xTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKIAotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkpOwotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9Ci0gICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOwogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIAotICAgIHJldHVybiBzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPihuZXcgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICAgICAgcHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICB0aHJlYWRNYW5hZ2VyKSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVGhyZWFkUG9vbFNlcnZlcj4oCisgICAgICAgIG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSk7CiAgIH0KIH07CiAKIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlclRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFROb25ibG9ja2luZ1NlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIHNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKICAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYXV0b21hdGljYWxseSB1c2VzIFRGcmFtZWRUcmFuc3BvcnQuCiAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCB0cmFuc3BvcnQgZmFjdG9yeSBpcyBub3QgYQogICAgIC8vIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqIGZyYW1lZEZhY3RvcnkgPQotICAgICAgZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CisgICAgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqIGZyYW1lZEZhY3RvcnkKKyAgICAgICAgPSBkeW5hbWljX2Nhc3Q8VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkqPih0cmFuc3BvcnRGYWN0b3J5LmdldCgpKTsKICAgICBpZiAoZnJhbWVkRmFjdG9yeSA9PSBOVUxMKSB7CiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOwogICAgIH0KIAotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KG5ldyBQb3NpeFRocmVhZEZhY3RvcnkpOwotICAgIHNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9Ci0gICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcig4KTsKICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKLSAgICByZXR1cm4gc2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoCi0gICAgICAgICAgcHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQsIHRocmVhZE1hbmFnZXIpKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4oCisgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHNvY2tldCwgdGhyZWFkTWFuYWdlcikpOwogICB9CiB9OwogCiBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJOb1RocmVhZHNUcmFpdHMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdHlwZWRlZiBUTm9uYmxvY2tpbmdTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4gY3JlYXRlU2VydmVyKAotICAgICAgY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICBjb25zdCBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IHNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIGF1dG9tYXRpY2FsbHkgdXNlcyBURnJhbWVkVHJhbnNwb3J0LgogICAgIC8vIFJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3VwcGxpZWQgdHJhbnNwb3J0IGZhY3RvcnkgaXMgbm90IGEKICAgICAvLyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeQotICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5ID0KLSAgICAgIGR5bmFtaWNfY2FzdDxURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSo+KHRyYW5zcG9ydEZhY3RvcnkuZ2V0KCkpOworICAgIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KiBmcmFtZWRGYWN0b3J5CisgICAgICAgID0gZHluYW1pY19jYXN0PFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Kj4odHJhbnNwb3J0RmFjdG9yeS5nZXQoKSk7CiAgICAgaWYgKGZyYW1lZEZhY3RvcnkgPT0gTlVMTCkgewogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKICAgICB9CiAKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CiAgICAgLy8gVXNlIGEgTlVMTCBUaHJlYWRNYW5hZ2VyCi0gICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyOwotICAgIHJldHVybiBzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcigKLSAgICAgICAgICBwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCwgdGhyZWFkTWFuYWdlcikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPigKKyAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgc29ja2V0LCB0aHJlYWRNYW5hZ2VyKSk7CiAgIH0KIH07CiAKQEAgLTE3NCw3ICsxNzIsNyBAQAogICovCiAKIGNsYXNzIFVudGVtcGxhdGVkVHJhaXRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3Rvcnk7CiAgIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sIFByb3RvY29sOwogCkBAIC0xODUsNyArMTgzLDcgQEAKIH07CiAKIGNsYXNzIFRlbXBsYXRlZFRyYWl0cyB7Ci0gcHVibGljOgorcHVibGljOgogICB0eXBlZGVmIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiBQcm90b2NvbEZhY3Rvcnk7CiAgIHR5cGVkZWYgVEJpbmFyeVByb3RvY29sVDxUQnVmZmVyQmFzZT4gUHJvdG9jb2w7CiAKQEAgLTE5NSwxMCArMTkzLDkgQEAKICAgdHlwZWRlZiBDaGlsZFNlcnZpY2VDbGllbnRUPFByb3RvY29sPiBDaGlsZENsaWVudDsKIH07CiAKLQotdGVtcGxhdGU8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgordGVtcGxhdGUgPHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXz4KIGNsYXNzIFBhcmVudFNlcnZpY2VUcmFpdHMgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdHlwZWRlZiB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c186OlBhcmVudFByb2Nlc3NvciBQcm9jZXNzb3I7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpQYXJlbnRDbGllbnQgQ2xpZW50OwogICB0eXBlZGVmIFBhcmVudEhhbmRsZXIgSGFuZGxlcjsKQEAgLTIwNyw5ICsyMDQsOSBAQAogICB0eXBlZGVmIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7CiB9OwogCi10ZW1wbGF0ZTx0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0c18+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfPgogY2xhc3MgQ2hpbGRTZXJ2aWNlVHJhaXRzIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpDaGlsZFByb2Nlc3NvciBQcm9jZXNzb3I7CiAgIHR5cGVkZWYgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHNfOjpDaGlsZENsaWVudCBDbGllbnQ7CiAgIHR5cGVkZWYgQ2hpbGRIYW5kbGVyIEhhbmRsZXI7CkBAIC0yMjUsMTcgKzIyMiwxOCBAQAogLy8gSXQgd291bGQgYWxzbyBiZSBuaWVjIGlmIHRoZXkgdXNlZCBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzLiAgVW5mb3J0dW5hdGVseSwKIC8vIHNpbmNlIHRoZXkgcmV0dXJuIHNoYXJlZF9wdHIgaW5zdGVhZCBvZiByYXcgcG9pbnRlcnMsIGNvdmFyaWFudCByZXR1cm4gdHlwZXMKIC8vIHdvbid0IHdvcmsuCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHNfLCB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXywKLSAgICAgICAgIHR5cGVuYW1lIFRyYW5zcG9ydEZhY3RvcnlfID0gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0eXBlbmFtZSBUcmFuc3BvcnRfID0gVEZyYW1lZFRyYW5zcG9ydD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHNfLAorICAgICAgICAgIHR5cGVuYW1lIFNlcnZpY2VUcmFpdHNfLAorICAgICAgICAgIHR5cGVuYW1lIFRyYW5zcG9ydEZhY3RvcnlfID0gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgdHlwZW5hbWUgVHJhbnNwb3J0XyA9IFRGcmFtZWRUcmFuc3BvcnQ+CiBjbGFzcyBTZXJ2aWNlU3RhdGUgOiBwdWJsaWMgU2VydmVyU3RhdGUgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvY2Vzc29yIFByb2Nlc3NvcjsKICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6Q2xpZW50IENsaWVudDsKICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6SGFuZGxlciBIYW5kbGVyOwogCi0gIFNlcnZpY2VTdGF0ZSgpIDoKLSAgICAgIHBvcnRfKDApLAorICBTZXJ2aWNlU3RhdGUoKQorICAgIDogcG9ydF8oMCksCiAgICAgICBsb2dfKG5ldyBFdmVudExvZyksCiAgICAgICBoYW5kbGVyXyhuZXcgSGFuZGxlcihsb2dfKSksCiAgICAgICBwcm9jZXNzb3JfKG5ldyBQcm9jZXNzb3IoaGFuZGxlcl8pKSwKQEAgLTI0Niw2MCArMjQ0LDQ4IEBACiAgICAgcHJvY2Vzc29yXy0+c2V0RXZlbnRIYW5kbGVyKHByb2Nlc3NvckV2ZW50SGFuZGxlcl8pOwogICB9CiAKLSAgc2hhcmVkX3B0cjxUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpIHsKICAgICBTZXJ2ZXJUcmFpdHNfIHNlcnZlclRyYWl0czsKLSAgICByZXR1cm4gc2VydmVyVHJhaXRzLmNyZWF0ZVNlcnZlcihwcm9jZXNzb3JfLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnlfKTsKKyAgICByZXR1cm4gc2VydmVyVHJhaXRzLmNyZWF0ZVNlcnZlcihwcm9jZXNzb3JfLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5XywgcHJvdG9jb2xGYWN0b3J5Xyk7CiAgIH0KIAotICBzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsKLSAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsKLSAgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0U2VydmVyRXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyXzsgfQogCi0gIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgcG9ydCkgewotICAgIHBvcnRfID0gcG9ydDsKLSAgfQorICB2b2lkIGJpbmRTdWNjZXNzZnVsKHVpbnQxNl90IHBvcnQpIHsgcG9ydF8gPSBwb3J0OyB9CiAKLSAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcG9ydF87Ci0gIH0KKyAgdWludDE2X3QgZ2V0UG9ydCgpIGNvbnN0IHsgcmV0dXJuIHBvcnRfOyB9CiAKLSAgY29uc3Qgc2hhcmVkX3B0cjxFdmVudExvZz4mIGdldExvZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbG9nXzsKLSAgfQorICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7IHJldHVybiBsb2dfOyB9CiAKLSAgY29uc3Qgc2hhcmVkX3B0cjxIYW5kbGVyPiYgZ2V0SGFuZGxlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gaGFuZGxlcl87Ci0gIH0KKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXI+JiBnZXRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlcl87IH0KIAotICBzaGFyZWRfcHRyPENsaWVudD4gY3JlYXRlQ2xpZW50KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7CiAKLSAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKLSAgICBzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zcG9ydChuZXcgVHJhbnNwb3J0Xyhzb2NrZXQpKTsKLSAgICBzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm90b2NvbD4gcHJvdG9jb2wobmV3IFByb3RvY29sKHRyYW5zcG9ydCkpOwogICAgIHRyYW5zcG9ydC0+b3BlbigpOwogCi0gICAgc2hhcmVkX3B0cjxDbGllbnQ+IGNsaWVudChuZXcgQ2xpZW50KHByb3RvY29sKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudD4gY2xpZW50KG5ldyBDbGllbnQocHJvdG9jb2wpKTsKICAgICByZXR1cm4gY2xpZW50OwogICB9CiAKLSBwcml2YXRlOgorcHJpdmF0ZToKICAgdWludDE2X3QgcG9ydF87Ci0gIHNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187Ci0gIHNoYXJlZF9wdHI8SGFuZGxlcj4gaGFuZGxlcl87Ci0gIHNoYXJlZF9wdHI8UHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKLSAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnlfOwotICBzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87Ci0gIHNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlcj4gaGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IHByb2Nlc3NvckV2ZW50SGFuZGxlcl87CiB9OwogCi0KIC8qKgogICogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBldmVudHMgaW4gdGhlIGxvZwogICovCi12b2lkIGNoZWNrTm9FdmVudHMoY29uc3Qgc2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewordm9pZCBjaGVja05vRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgewogICAvLyBXYWl0IGZvciBhbiBldmVudCB3aXRoIGEgdmVyeSBzaG9ydCB0aW1lb3V0IHBlcmlvZC4gIFdlIGRvbid0IGV4cGVjdAogICAvLyBhbnl0aGluZyB0byBiZSBwcmVzZW50LCBzbyB3ZSB3aWxsIG5vcm1hbGx5IHdhaXQgZm9yIHRoZSBmdWxsIHRpbWVvdXQuCiAgIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi16ZXJvIHRpbWVvdXQgaXMgbmljZSBzaW5jZSBpdCBkb2VzIGdpdmUgYSBzaG9ydApAQCAtMzEzLDkgKzI5OSw5IEBACiAgKgogICogUmV0dXJucyB0aGUgY29ubmVjdGlvbiBJRCBhbGxvY2F0ZWQgYnkgdGhlIHNlcnZlci4KICAqLwotdWludDMyX3QgY2hlY2tOZXdDb25uRXZlbnRzKGNvbnN0IHNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKK3VpbnQzMl90IGNoZWNrTmV3Q29ubkV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKICAgLy8gQ2hlY2sgZm9yIGFuIEVUX0NPTk5fQ1JFQVRFRCBldmVudAotICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CisgIEV2ZW50IGV2ZW50ID0gbG9nLT53YWl0Rm9yRXZlbnQoMjUwMCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0NSRUFURUQsIGV2ZW50LnR5cGUpOwogCiAgIC8vIFNvbWUgc2VydmVycyBjYWxsIHRoZSBwcm9jZXNzQ29udGV4dCgpIGhvb2sgaW1tZWRpYXRlbHkuCkBAIC0zMjgsNyArMzE0LDcgQEAKIC8qKgogICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgbG9nZ2VkIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KICAqLwotdm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csIHVpbnQzMl90IGNvbm5JZCkgewordm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7CiAgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0RFU1RST1lFRCBldmVudAogICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgZXZlbnQudHlwZSk7CkBAIC0zNDYsNyArMzMyLDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBjYWxsIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgogICovCi11aW50MzJfdCBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGNvbnN0IHNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCit1aW50MzJfdCBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGUgY2FsbFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKQEAgLTM4Myw3ICszNjksNyBAQAogLyoqCiAgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBhZnRlciBhIGhhbmRsZXIgcmV0dXJucy4KICAqLwotdm9pZCBjaGVja0NhbGxQb3N0SGFuZGxlckV2ZW50cyhjb25zdCBzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAordm9pZCBjaGVja0NhbGxQb3N0SGFuZGxlckV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FsbElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC00MjMsNyArNDA5LDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBjYWxsIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgogICovCi11aW50MzJfdCBjaGVja0NhbGxFdmVudHMoY29uc3Qgc2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKK3VpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC00MzcsOSArNDIzLDkgQEAKICAqIFRlc3QgZnVuY3Rpb25zCiAgKi8KIAotdGVtcGxhdGU8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7Ci0gIHNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGVfOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdGF0ZV8+Cit2b2lkIHRlc3RQYXJlbnRTZXJ2aWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgeworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGVfOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKIAogICBpbnQzMl90IGdlbiA9IGNsaWVudC0+Z2V0R2VuZXJhdGlvbigpOwogICBpbnQzMl90IG5ld0dlbiA9IGNsaWVudC0+aW5jcmVtZW50R2VuZXJhdGlvbigpOwpAQCAtNDU5LDkgKzQ0NSw5IEBACiAgIEJPT1NUX1JFUVVJUkVfRVFVQUwoImFzZGYiLCBzdHJpbmdzWzJdKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0Q2hpbGRTZXJ2aWNlKGNvbnN0IHNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKLSAgc2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwordGVtcGxhdGUgPHR5cGVuYW1lIFN0YXRlXz4KK3ZvaWQgdGVzdENoaWxkU2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gVGVzdCBjYWxsaW5nIHNvbWUgb2YgdGhlIHBhcmVudCBtZXRoaWRzIHZpYSB0aGUgYSBjaGlsZCBjbGllbnQKICAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKQEAgLTQ3NywyNSArNDYzLDIzIEBACiAgIEJPT1NUX0NIRUNLX0VRVUFMKDk5LCBjbGllbnQtPmdldFZhbHVlKCkpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+CiB2b2lkIHRlc3RCYXNpY1NlcnZpY2UoKSB7Ci0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIFBhcmVudFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgc2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOwogICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKIAogICB0ZXN0UGFyZW50U2VydmljZShzdGF0ZSk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KIHZvaWQgdGVzdEluaGVyaXRlZFNlcnZpY2UoKSB7Ci0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPgotICAgIFN0YXRlOworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIHNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNTA2LDIxICs0OTAsMjIgQEAKICAqIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgYW5kIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIKICAqIG1ldGhvZHMgYXJlIGludm9rZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgd2l0aCB0aGUgYWN0dWFsIGV2ZW50cy4KICAqLwotdGVtcGxhdGU8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgogdm9pZCB0ZXN0RXZlbnRTZXF1ZW5jaW5nKCkgewogICAvLyBXZSB1c2UgVEJ1ZmZlcmVkVHJhbnNwb3J0IGZvciB0aGlzIHRlc3QsIGluc3RlYWQgb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAgLy8gVGhpcyB3YXkgdGhlIHNlcnZlciB3aWxsIHN0YXJ0IHByb2Nlc3NpbmcgZGF0YSBhcyBzb29uIGFzIGl0IGlzIHJlY2VpdmVkLAogICAvLyBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBmdWxsIHJlcXVlc3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB3ZSBjYW4KICAgLy8gc2VwYXJhdGUgdGhlIHByZVJlYWQoKSBhbmQgcG9zdFJlYWQoKSBldmVudHMuCi0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4sCi0gICAgICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRUcmFuc3BvcnQ+Ci0gICAgU3RhdGU7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiwKKyAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0PiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIHNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3Qgc2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOwogCiAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBsb2cKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwpAQCAtNTI5LDcgKzUxNCw3IEBACiAKICAgLy8gTWFrZSBzdXJlIGNyZWF0ZUNvbnRleHQoKSBpcyBjYWxsZWQgYWZ0ZXIgYSBjb25uZWN0aW9uIGhhcyBiZWVuCiAgIC8vIGVzdGFibGlzaGVkLiAgV2Ugb3BlbiBhIHBsYWluIHNvY2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgY2xpZW50LgotICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgc3RhdGUtPmdldFBvcnQoKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CiAgIHNvY2tldC0+b3BlbigpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGV2ZW50cyBvY2N1cnJlZCBhZnRlciBhIG5ldyBjb25uZWN0aW9uCkBAIC01MzksNyArNTI0LDcgQEAKICAgLy8gY2FuIHRlc3QgdGhlIHRpbWluZyBmb3IgdGhlIHByZVJlYWQoKSBjYWxsLgogICBzdHJpbmcgcmVxdWVzdE5hbWUgPSAiZ2V0RGF0YVdhaXQiOwogICBzdHJpbmcgZXZlbnROYW1lID0gIlBhcmVudFNlcnZpY2UuZ2V0RGF0YVdhaXQiOwotICBpbnQzMl90IHNlcWlkID0gdGltZShOVUxMKTsKKyAgaW50MzJfdCBzZXFpZCA9IGludDMyX3QodGltZShOVUxMKSk7CiAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzb2NrZXQpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihyZXF1ZXN0TmFtZSwgVF9DQUxMLCBzZXFpZCk7CiAgIHNvY2tldC0+Zmx1c2goKTsKQEAgLTU2Myw3ICs1NDgsNyBAQAogICAvLyBTZW5kIHRoZSByZXN0IG9mIHRoZSByZXF1ZXN0CiAgIHByb3RvY29sLndyaXRlU3RydWN0QmVnaW4oIlBhcmVudFNlcnZpY2VfZ2V0RGF0YU5vdGlmaWVkX3BhcmdzIik7CiAgIHByb3RvY29sLndyaXRlRmllbGRCZWdpbigibGVuZ3RoIiwgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX0kzMiwgMSk7Ci0gIHByb3RvY29sLndyaXRlSTMyKDgqMTAyNCoxMDI0KTsKKyAgcHJvdG9jb2wud3JpdGVJMzIoOCAqIDEwMjQgKiAxMDI0KTsKICAgcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpOwogICBwcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOwogICBwcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpOwpAQCAtNjA3LDcgKzU5Miw3IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIAogICAvLyBSZWFkIHRoZSByZXNwb25zZSBoZWFkZXIKLSAgc3RkOjpzdHJpbmcgcmVzcG9uc2VOYW1lOworICBzdHJpbmcgcmVzcG9uc2VOYW1lOwogICBpbnQzMl90IHJlc3BvbnNlU2VxaWQgPSAwOwogICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRNZXNzYWdlVHlwZSByZXNwb25zZVR5cGU7CiAgIHByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4ocmVzcG9uc2VOYW1lLCByZXNwb25zZVR5cGUsIHJlc3BvbnNlU2VxaWQpOwpAQCAtNjQ1LDI1ICs2MzAsMjQgQEAKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgordGVtcGxhdGUgPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+CiB2b2lkIHRlc3RTZXBhcmF0ZUNvbm5lY3Rpb25zKCkgewotICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTwgU2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CiAKICAgLy8gU3RhcnQgdGhlIHNlcnZlcgotICBzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IHNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBDcmVhdGUgYSBjbGllbnQKLSAgc2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQxID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MSA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKIAogICAvLyBNYWtlIHN1cmUgdGhlIGV4cGVjdGVkIGV2ZW50cyB3ZXJlIGxvZ2dlZAogICB1aW50MzJfdCBjbGllbnQxSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKIAogICAvLyBDcmVhdGUgYSBzZWNvbmQgY2xpZW50Ci0gIHNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDIgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKICAgdWludDMyX3QgY2xpZW50MklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CkBAIC02NzQsMjAgKzY1OCwxOSBAQAogICAvLyBNYWtlIGEgY2FsbCwgYW5kIGNoZWNrIGZvciB0aGUgcHJvcGVyIGV2ZW50cwogICBpbnQzMl90IHZhbHVlID0gNTsKICAgY2xpZW50MS0+c2V0VmFsdWUodmFsdWUpOwotICB1aW50MzJfdCBjYWxsMSA9IGNoZWNrQ2FsbEV2ZW50cyhsb2csIGNsaWVudDFJZCwgRXZlbnRMb2c6OkVUX0NBTExfU0VUX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZFNlcnZpY2Uuc2V0VmFsdWUiKTsKKyAgdWludDMyX3QgY2FsbDEKKyAgICAgID0gY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MUlkLCBFdmVudExvZzo6RVRfQ0FMTF9TRVRfVkFMVUUsICJDaGlsZFNlcnZpY2Uuc2V0VmFsdWUiKTsKIAogICAvLyBNYWtlIGEgY2FsbCB3aXRoIGNsaWVudDIKICAgaW50MzJfdCB2ID0gY2xpZW50Mi0+Z2V0VmFsdWUoKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwodmFsdWUsIHYpOwotICBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQySWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKKyAgY2hlY2tDYWxsRXZlbnRzKGxvZywgY2xpZW50MklkLCBFdmVudExvZzo6RVRfQ0FMTF9HRVRfVkFMVUUsICJDaGlsZFNlcnZpY2UuZ2V0VmFsdWUiKTsKIAogICAvLyBNYWtlIGFub3RoZXIgY2FsbCB3aXRoIGNsaWVudDEKICAgdiA9IGNsaWVudDEtPmdldFZhbHVlKCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKHZhbHVlLCB2KTsKLSAgdWludDMyX3QgY2FsbDIgPSBjaGVja0NhbGxFdmVudHMobG9nLCBjbGllbnQxSWQsIEV2ZW50TG9nOjpFVF9DQUxMX0dFVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbGRTZXJ2aWNlLmdldFZhbHVlIik7CisgIHVpbnQzMl90IGNhbGwyCisgICAgICA9IGNoZWNrQ2FsbEV2ZW50cyhsb2csIGNsaWVudDFJZCwgRXZlbnRMb2c6OkVUX0NBTExfR0VUX1ZBTFVFLCAiQ2hpbGRTZXJ2aWNlLmdldFZhbHVlIik7CiAgIEJPT1NUX0NIRUNLX05FKGNhbGwxLCBjYWxsMik7CiAKICAgLy8gQ2xvc2UgdGhlIHNlY29uZCBjbGllbnQsIGFuZCBjaGVjayBmb3IgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwpAQCAtNjk1LDE5ICs2NzgsMTggQEAKICAgY2hlY2tDbG9zZUV2ZW50cyhsb2csIGNsaWVudDJJZCk7CiB9CiAKLXRlbXBsYXRlPHR5cGVuYW1lIFNlcnZlclRyYWl0cywgdHlwZW5hbWUgVGVtcGxhdGVUcmFpdHM+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KIHZvaWQgdGVzdE9uZXdheUNhbGwoKSB7Ci0gIHR5cGVkZWYgU2VydmljZVN0YXRlPCBTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPgotICAgIFN0YXRlOworICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIHNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKLSAgY29uc3Qgc2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOwogCiAgIC8vIENyZWF0ZSBhIGNsaWVudAotICBzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gTWFrZSBhIG9uZXdheSBjYWxsCkBAIC03MTYsOSArNjk4LDcgQEAKICAgc3RhdGUtPmdldEhhbmRsZXIoKS0+cHJlcGFyZVRyaWdnZXJlZENhbGwoKTsKICAgY2xpZW50LT5vbmV3YXlXYWl0KCk7CiAgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLm9uZXdheVdhaXQiOwotICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nOjpFVF9DQUxMX09ORVdBWV9XQUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxOYW1lKTsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfT05FV0FZX1dBSVQsIGNhbGxOYW1lKTsKIAogICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCiAgIGNoZWNrTm9FdmVudHMobG9nKTsKQEAgLTc1MCwxOSArNzMwLDE4IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgogdm9pZCB0ZXN0RXhwZWN0ZWRFcnJvcigpIHsKLSAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8IFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+Ci0gICAgU3RhdGU7CisgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgc2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOwogICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKIAotICBjb25zdCBzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIHNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOworICBzdGQ6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogICB1aW50MzJfdCBjb25uSWQgPSBjaGVja05ld0Nvbm5FdmVudHMobG9nKTsKIAogICAvLyBTZW5kIHRoZSBleGNlcHRpb25XYWl0KCkgY2FsbApAQCAtNzcwLDkgKzc0OSw3IEBACiAgIHN0cmluZyBtZXNzYWdlID0gInRlc3QgMTIzNCB0ZXN0IjsKICAgY2xpZW50LT5zZW5kX2V4Y2VwdGlvbldhaXQobWVzc2FnZSk7CiAgIHN0cmluZyBjYWxsTmFtZSA9ICJQYXJlbnRTZXJ2aWNlLmV4Y2VwdGlvbldhaXQiOwotICB1aW50MzJfdCBjYWxsSWQgPSBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGxvZywgY29ubklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TG9nOjpFVF9DQUxMX0VYQ0VQVElPTl9XQUlULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxOYW1lKTsKKyAgdWludDMyX3QgY2FsbElkID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfRVhDRVBUSU9OX1dBSVQsIGNhbGxOYW1lKTsKIAogICAvLyBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IG1vcmUgZXZlbnRzCiAgIGNoZWNrTm9FdmVudHMobG9nKTsKQEAgLTc5MCw2ICs3NjcsOSBAQAogICAgIEJPT1NUX0ZBSUwoImV4cGVjdGVkIE15RXJyb3IgdG8gYmUgdGhyb3duIik7CiAgIH0gY2F0Y2ggKGNvbnN0IE15RXJyb3ImIGUpIHsKICAgICBCT09TVF9DSEVDS19FUVVBTChtZXNzYWdlLCBlLm1lc3NhZ2UpOworICAgIC8vIENoZWNrIGlmIHN0ZDo6ZXhjZXB0aW9uOjp3aGF0KCkgaXMgaGFuZGxlZCBwcm9wZXJseQorICAgIHNpemVfdCBtZXNzYWdlX3BvcyA9IHN0cmluZyhlLndoYXQoKSkuZmluZCgiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogTXlFcnJvciIpOworICAgIEJPT1NUX0NIRUNLX05FKG1lc3NhZ2VfcG9zLCBzdHJpbmc6Om5wb3MpOwogICB9CiAKICAgLy8gTm93IHdlIHNob3VsZCBzZWUgdGhlIGV2ZW50cyBmb3IgYSBub3JtYWwgY2FsbCBmaW5pc2gKQEAgLTgwNSwxOSArNzg1LDE4IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgU2VydmVyVHJhaXRzLCB0eXBlbmFtZSBUZW1wbGF0ZVRyYWl0cz4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXJ2ZXJUcmFpdHMsIHR5cGVuYW1lIFRlbXBsYXRlVHJhaXRzPgogdm9pZCB0ZXN0VW5leHBlY3RlZEVycm9yKCkgewotICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTwgU2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4KLSAgICBTdGF0ZTsKKyAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CiAKICAgLy8gU3RhcnQgdGhlIHNlcnZlcgotICBzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IHNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKIAogICAvLyBDcmVhdGUgYSBjbGllbnQKLSAgc2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIFNlbmQgdGhlIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCkgY2FsbApAQCAtODI1LDggKzgwNCw4IEBACiAgIHN0cmluZyBtZXNzYWdlID0gIjEyMzQgdGVzdCA1Njc4IjsKICAgY2xpZW50LT5zZW5kX3VuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KG1lc3NhZ2UpOwogICBzdHJpbmcgY2FsbE5hbWUgPSAiUGFyZW50U2VydmljZS51bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCI7Ci0gIHVpbnQzMl90IGNhbGxJZCA9IGNoZWNrQ2FsbEhhbmRsZXJFdmVudHMoCi0gICAgICBsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOworICB1aW50MzJfdCBjYWxsSWQKKyAgICAgID0gY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhsb2csIGNvbm5JZCwgRXZlbnRMb2c6OkVUX0NBTExfVU5FWFBFQ1RFRF9FWENFUFRJT05fV0FJVCwgY2FsbE5hbWUpOwogCiAgIC8vIFRoZXJlIHNob3VsZG4ndCBiZSBhbnkgbW9yZSBldmVudHMKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwpAQCAtODQyLDcgKzgyMSw3IEBACiAgIHRyeSB7CiAgICAgY2xpZW50LT5yZWN2X3VuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCk7CiAgICAgQk9PU1RfRkFJTCgiZXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXJyb3IgdG8gYmUgdGhyb3duIik7Ci0gIH0gY2F0Y2ggKGNvbnN0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChjb25zdCBUQXBwbGljYXRpb25FeGNlcHRpb24mKSB7CiAgIH0KIAogICAvLyBOb3cgd2Ugc2hvdWxkIHNlZSBhIGhhbmRsZXIgZXJyb3IgZXZlbnQKQEAgLTg3Miw0NyArODUxLDQ2IEBACiAgIGNoZWNrTm9FdmVudHMobG9nKTsKIH0KIAotCiAvLyBNYWNybyB0byBkZWZpbmUgc2ltcGxlIHRlc3RzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBhbGwgc2VydmVyIHR5cGVzCi0jZGVmaW5lIERFRklORV9TSU1QTEVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfYmFzaWNTZXJ2aWNlKSB7IFwKLSAgICB0ZXN0QmFzaWNTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyBcCi0gIH0gXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfaW5oZXJpdGVkU2VydmljZSkgeyBcCi0gICAgdGVzdEluaGVyaXRlZFNlcnZpY2U8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKLSAgfSBcCi0gIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19vbmV3YXkpIHsgXAotICAgIHRlc3RPbmV3YXlDYWxsPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyBcCi0gIH0gXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfZXhjZXB0aW9uKSB7IFwKLSAgICB0ZXN0RXhwZWN0ZWRFcnJvcjxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgXAotICB9IFwKLSAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3VuZXhwZWN0ZWRFeGNlcHRpb24pIHsgXAotICAgIHRlc3RVbmV4cGVjdGVkRXJyb3I8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKKyNkZWZpbmUgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2Jhc2ljU2VydmljZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0QmFzaWNTZXJ2aWNlPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2luaGVyaXRlZFNlcnZpY2UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0SW5oZXJpdGVkU2VydmljZTxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX29uZXdheSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0T25ld2F5Q2FsbDxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V4Y2VwdGlvbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXhwZWN0ZWRFcnJvcjxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3VuZXhwZWN0ZWRFeGNlcHRpb24pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0VW5leHBlY3RlZEVycm9yPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCiAvLyBUZXN0cyB0aGF0IHJlcXVpcmUgdGhlIHNlcnZlciB0byBwcm9jZXNzIG11bHRpcGxlIGNvbm5lY3Rpb25zIGNvbmN1cnJlbnRseQogLy8gKGkuZS4sIG5vdCBUU2ltcGxlU2VydmVyKQotI2RlZmluZSBERUZJTkVfQ09OQ1VSUkVOVF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBCT09TVF9BVVRPX1RFU1RfQ0FTRShTZXJ2ZXIjI18jI1RlbXBsYXRlIyNfc2VwYXJhdGVDb25uZWN0aW9ucykgeyBcCi0gICAgdGVzdFNlcGFyYXRlQ29ubmVjdGlvbnM8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKKyNkZWZpbmUgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX3NlcGFyYXRlQ29ubmVjdGlvbnMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0U2VwYXJhdGVDb25uZWN0aW9uczxTZXJ2ZXIjI1RyYWl0cywgVGVtcGxhdGUjI1RyYWl0cz4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCiAvLyBUaGUgdGVzdEV2ZW50U2VxdWVuY2luZygpIHRlc3QgbWFudWFsbHkgZ2VuZXJhdGVzIGEgcmVxdWVzdCBmb3IgdGhlIHNlcnZlciwKIC8vIGFuZCBkb2Vzbid0IHdvcmsgd2l0aCBURnJhbWVkVHJhbnNwb3J0LiAgVGhlcmVmb3JlIHdlIGNhbid0IHRlc3QgaXQgd2l0aAogLy8gVE5vbmJsb2NraW5nU2VydmVyLgotI2RlZmluZSBERUZJTkVfTk9GUkFNRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSBcCi0gIEJPT1NUX0FVVE9fVEVTVF9DQVNFKFNlcnZlciMjXyMjVGVtcGxhdGUjI19ldmVudFNlcXVlbmNpbmcpIHsgXAotICAgIHRlc3RFdmVudFNlcXVlbmNpbmc8U2VydmVyIyNUcmFpdHMsIFRlbXBsYXRlIyNUcmFpdHM+KCk7IFwKKyNkZWZpbmUgREVGSU5FX05PRlJBTUVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQk9PU1RfQVVUT19URVNUX0NBU0UoU2VydmVyIyNfIyNUZW1wbGF0ZSMjX2V2ZW50U2VxdWVuY2luZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZXN0RXZlbnRTZXF1ZW5jaW5nPFNlcnZlciMjVHJhaXRzLCBUZW1wbGF0ZSMjVHJhaXRzPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCi0jZGVmaW5lIERFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpIFwKKyNkZWZpbmUgREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpCiAKLSNkZWZpbmUgREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgXAotICBERUZJTkVfU0lNUExFX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpIFwKLSAgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpIFwKKyNkZWZpbmUgREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX1NJTVBMRV9URVNUUyhTZXJ2ZXIsIFRlbXBsYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgREVGSU5FX0NPTkNVUlJFTlRfU0VSVkVSX1RFU1RTKFNlcnZlciwgVGVtcGxhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgREVGSU5FX05PRlJBTUVfVEVTVFMoU2VydmVyLCBUZW1wbGF0ZSkKIAogREVGSU5FX0FMTF9TRVJWRVJfVEVTVFMoVFRocmVhZGVkU2VydmVyLCBUZW1wbGF0ZWQpCkBAIC05MjUsMTcgKzkwMywyNyBAQAogREVGSU5FX1ROT05CTE9DS0lOR1NFUlZFUl9URVNUUyhUTm9uYmxvY2tpbmdTZXJ2ZXJOb1RocmVhZHMsIFRlbXBsYXRlZCkKIERFRklORV9UTk9OQkxPQ0tJTkdTRVJWRVJfVEVTVFMoVE5vbmJsb2NraW5nU2VydmVyTm9UaHJlYWRzLCBVbnRlbXBsYXRlZCkKIAotREVGSU5FX1NJTVBMRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpOwotREVGSU5FX1NJTVBMRV9URVNUUyhUU2ltcGxlU2VydmVyLCBVbnRlbXBsYXRlZCk7Ci1ERUZJTkVfTk9GUkFNRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpOwotREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVW50ZW1wbGF0ZWQpOworREVGSU5FX1NJTVBMRV9URVNUUyhUU2ltcGxlU2VydmVyLCBUZW1wbGF0ZWQpCitERUZJTkVfU0lNUExFX1RFU1RTKFRTaW1wbGVTZXJ2ZXIsIFVudGVtcGxhdGVkKQorREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVGVtcGxhdGVkKQorREVGSU5FX05PRlJBTUVfVEVTVFMoVFNpbXBsZVNlcnZlciwgVW50ZW1wbGF0ZWQpCiAKIC8vIFRPRE86IFdlIHNob3VsZCB0ZXN0IFRFdmVudFNlcnZlciBpbiB0aGUgZnV0dXJlLgogLy8gRm9yIG5vdywgaXQgaXMga25vd24gbm90IHRvIHdvcmsgY29ycmVjdGx5IHdpdGggVFByb2Nlc3NvckV2ZW50SGFuZGxlci4KKyNpZmRlZiBCT09TVF9URVNUX0RZTl9MSU5LCitib29sIGluaXRfdW5pdF90ZXN0X3N1aXRlKCkgeworICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiUHJvY2Vzc29yVGVzdCI7CisgIHJldHVybiB0cnVlOworfQogCi11bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgdW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0KLSAgICAiUHJvY2Vzc29yVGVzdCI7Ci0KK2ludCBtYWluKCBpbnQgYXJnYywgY2hhciogYXJndltdICkgeworICByZXR1cm4gOjpib29zdDo6dW5pdF90ZXN0Ojp1bml0X3Rlc3RfbWFpbigmaW5pdF91bml0X3Rlc3Rfc3VpdGUsYXJnYyxhcmd2KTsKK30KKyNlbHNlCis6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKKyAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKKyAgOjpib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOwogICByZXR1cm4gTlVMTDsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCmluZGV4IDlmMjA4N2MuLjRkMWVjNGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKQEAgLTIxLDIwICsyMSwyNCBAQAogCiAjaW5jbHVkZSAiU2VydmVyVGhyZWFkLmgiCiAKLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KIAotbmFtZXNwYWNlIGFwYWNoZSB7IG5hbWVzcGFjZSB0aHJpZnQgeyBuYW1lc3BhY2UgdGVzdCB7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgewogCiB2b2lkIFNlcnZlclRocmVhZDo6c3RhcnQoKSB7CiAgIGFzc2VydCghcnVubmluZ18pOwogICBydW5uaW5nXyA9IHRydWU7CiAKKyAgaGVscGVyXy5yZXNldChuZXcgSGVscGVyKHRoaXMpKTsKKwogICAvLyBTdGFydCB0aGUgb3RoZXIgdGhyZWFkCi0gIGNvbmN1cnJlbmN5OjpQb3NpeFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKKyAgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5OwogICB0aHJlYWRGYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKICAgdGhyZWFkXyA9IHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKGhlbHBlcl8pOwogCkBAIC00OCw5ICs1Miw4IEBACiAgIH0KIAogICBpZiAoZXJyb3JfKSB7Ci0gICAgdGhyb3cgdHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAotICAgICAgICAiZmFpbGVkIHRvIGJpbmQgb24gc2VydmVyIHNvY2tldCIpOworICAgIHRocm93IHRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbih0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGJpbmQgb24gc2VydmVyIHNvY2tldCIpOwogICB9CiB9CiAKQEAgLTg5LDcgKzkyLDcgQEAKICAgICB0cnkgewogICAgICAgLy8gVHJ5IHRvIHNlcnZlIHJlcXVlc3RzCiAgICAgICBzZXJ2ZXJfLT5zZXJ2ZSgpOwotICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24mIHgpIHsKKyAgICB9IGNhdGNoIChjb25zdCBURXhjZXB0aW9uJikgewogICAgICAgLy8gVE5vbmJsb2NraW5nU2VydmVyIHRocm93cyBhIGdlbmVyaWMgVEV4Y2VwdGlvbiBpZiBpdCBmYWlscyB0byBiaW5kLgogICAgICAgLy8gSWYgd2UgZ2V0IGEgVEV4Y2VwdGlvbiwgd2UnbGwgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoZSBiaW5kIGZhaWxlZC4KICAgICAgICsrcG9ydF87CkBAIC0xMjcsOCArMTMwLDggQEAKICAgc2VydmVyU3RhdGVfLT5iaW5kU3VjY2Vzc2Z1bChwb3J0Xyk7CiAKICAgLy8gU2V0IHRoZSByZWFsIHNlcnZlciBldmVudCBoYW5kbGVyIChyZXBsYWNpbmcgb3Vyc2VsZikKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXIgPQotICAgIHNlcnZlclN0YXRlXy0+Z2V0U2VydmVyRXZlbnRIYW5kbGVyKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcgorICAgICAgPSBzZXJ2ZXJTdGF0ZV8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpOwogICBzZXJ2ZXJfLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRIYW5kbGVyKTsKIAogICAvLyBOb3RpZnkgdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UgaGF2ZSBzdWNjZXNzZnVsbHkgc3RhcnRlZCBzZXJ2aW5nIHJlcXVlc3RzCkBAIC0xNDIsNyArMTQ1LDggQEAKICAgICBzZXJ2ZXJFdmVudEhhbmRsZXItPnByZVNlcnZlKCk7CiAgIH0KIH0KLQotfX19IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0CiAKICNlbmRpZiAvLyBfVEhSSUZUX1RFU1RfU0VSVkVSVEhSRUFEX1RDQ18KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmggYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oCmluZGV4IDBkZDUxMjcuLjYxZTMxYTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaApAQCAtMjYsMTMgKzI2LDE1IEBACiAKICNpbmNsdWRlICJFdmVudExvZy5oIgogCi1uYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSB0ZXN0IHsKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgdGVzdCB7CiAKIC8qKgogICogQSBoZWxwZXIgY2xhc3MgdG8gdGVsbCBTZXJ2ZXJUaHJlYWQgaG93IHRvIGNyZWF0ZSB0aGUgc2VydmVyCiAgKi8KIGNsYXNzIFNlcnZlclN0YXRlIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIHZpcnR1YWwgflNlcnZlclN0YXRlKCkge30KIAogICAvKioKQEAgLTQxLDcgKzQzLDcgQEAKICAgICogSWYgdGhlIHNlcnZlciByZXR1cm5lZCBmYWlscyB0byBiaW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCB3aGVuIHNlcnZlKCkgaXMKICAgICogY2FsbGVkIG9uIGl0LCBjcmVhdGVTZXJ2ZXIoKSBtYXkgYmUgY2FsbGVkIGFnYWluIG9uIGEgZGlmZmVyZW50IHBvcnQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgPSAwOwogCiAgIC8qKgogICAgKiBHZXQgdGhlIFRTZXJ2ZXJFdmVudEhhbmRsZXIgdG8gc2V0IG9uIHRoZSBzZXJ2ZXIuCkBAIC01MCw5ICs1Miw4IEBACiAgICAqIHN0YXJ0IHNlcnZpbmcgdHJhZmZpYy4gIEl0IGlzIGludm9rZWQgZnJvbSB0aGUgc2VydmVyIHRocmVhZCwgcmF0aGVyIHRoYW4KICAgICogdGhlIG1haW4gdGhyZWFkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+Ci0gICAgICBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4oKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CiAgIH0KIAogICAvKioKQEAgLTYxLDE4ICs2MiwxNiBAQAogICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IHdpc2ggdG8gcmVjb3JkIHRoZSBmaW5hbAogICAgKiBwb3J0IHRoYXQgd2FzIHVzZWQgZm9yIHRoZSBzZXJ2ZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYmluZFN1Y2Nlc3NmdWwodWludDE2X3QgcG9ydCkgewotICB9CisgIHZpcnR1YWwgdm9pZCBiaW5kU3VjY2Vzc2Z1bCh1aW50MTZfdCAvKnBvcnQqLykge30KIH07CiAKIC8qKgogICogU2VydmVyVGhyZWFkIHN0YXJ0cyBhIHRocmlmdCBzZXJ2ZXIgcnVubmluZyBpbiBhIHNlcGFyYXRlIHRocmVhZC4KICAqLwogY2xhc3MgU2VydmVyVGhyZWFkIHsKLSBwdWJsaWM6Ci0gIFNlcnZlclRocmVhZChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXJTdGF0ZT4mIHN0YXRlLCBib29sIGF1dG9TdGFydCkgOgotICAgICAgaGVscGVyXyhuZXcgSGVscGVyKHRoaXMpKSwKLSAgICAgIHBvcnRfKDApLAorcHVibGljOgorICBTZXJ2ZXJUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiYgc3RhdGUsIGJvb2wgYXV0b1N0YXJ0KQorICAgIDogcG9ydF8oMCksCiAgICAgICBydW5uaW5nXyhmYWxzZSksCiAgICAgICBzZXJ2aW5nXyhmYWxzZSksCiAgICAgICBlcnJvcl8oZmFsc2UpLApAQCAtODUsOSArODQsNyBAQAogICB2b2lkIHN0YXJ0KCk7CiAgIHZvaWQgc3RvcCgpOwogCi0gIHVpbnQxNl90IGdldFBvcnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHBvcnRfOwotICB9CisgIHVpbnQxNl90IGdldFBvcnQoKSBjb25zdCB7IHJldHVybiBwb3J0XzsgfQogCiAgIH5TZXJ2ZXJUaHJlYWQoKSB7CiAgICAgaWYgKHJ1bm5pbmdfKSB7CkBAIC05OSwzMyArOTYsMjcgQEAKICAgICB9CiAgIH0KIAotIHByb3RlY3RlZDoKK3Byb3RlY3RlZDoKICAgLy8gQW5ub3lpbmcuICB0aHJpZnQgZm9yY2VzIHVzIHRvIHVzZSBzaGFyZWRfcHRyLCBzbyB3ZSBoYXZlIHRvIHVzZQogICAvLyBhIGhlbHBlciBjbGFzcyB0aGF0IHdlIGNhbiBhbGxvY2F0ZSBvbiB0aGUgaGVhcCBhbmQgZ2l2ZSB0byB0aHJpZnQuCiAgIC8vIEl0IHdvdWxkIGJlIHNpbXBsZXIgaWYgd2UgY291bGQganVzdCBtYWtlIFJ1bm5hYmxlIGFuZCBUU2VydmVyRXZlbnRIYW5kbGVyCiAgIC8vIHByaXZhdGUgYmFzZSBjbGFzc2VzIG9mIFNlcnZlclRocmVhZC4KLSAgY2xhc3MgSGVscGVyIDogcHVibGljIGNvbmN1cnJlbmN5OjpSdW5uYWJsZSwKLSAgICAgICAgICAgICAgICAgcHVibGljIHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlciB7Ci0gICBwdWJsaWM6Ci0gICAgSGVscGVyKFNlcnZlclRocmVhZCogc2VydmVyVGhyZWFkKQotICAgICAgOiBzZXJ2ZXJUaHJlYWRfKHNlcnZlclRocmVhZCkge30KKyAgY2xhc3MgSGVscGVyIDogcHVibGljIGNvbmN1cnJlbmN5OjpSdW5uYWJsZSwgcHVibGljIHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlciB7CisgIHB1YmxpYzoKKyAgICBIZWxwZXIoU2VydmVyVGhyZWFkKiBzZXJ2ZXJUaHJlYWQpIDogc2VydmVyVGhyZWFkXyhzZXJ2ZXJUaHJlYWQpIHt9CiAKLSAgICB2b2lkIHJ1bigpIHsKLSAgICAgIHNlcnZlclRocmVhZF8tPnJ1bigpOwotICAgIH0KKyAgICB2b2lkIHJ1bigpIHsgc2VydmVyVGhyZWFkXy0+cnVuKCk7IH0KIAotICAgIHZvaWQgcHJlU2VydmUoKSB7Ci0gICAgICBzZXJ2ZXJUaHJlYWRfLT5wcmVTZXJ2ZSgpOwotICAgIH0KKyAgICB2b2lkIHByZVNlcnZlKCkgeyBzZXJ2ZXJUaHJlYWRfLT5wcmVTZXJ2ZSgpOyB9CiAKLSAgIHByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgU2VydmVyVGhyZWFkKiBzZXJ2ZXJUaHJlYWRfOwogICB9OwogCiAgIHZvaWQgcnVuKCk7CiAgIHZvaWQgcHJlU2VydmUoKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CiAKICAgdWludDE2X3QgcG9ydF87CiAgIGJvb2wgcnVubmluZ187CkBAIC0xMzMsMTEgKzEyNCwxMiBAQAogICBib29sIGVycm9yXzsKICAgY29uY3VycmVuY3k6Ok1vbml0b3Igc2VydmVyTW9uaXRvcl87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+IHNlcnZlclN0YXRlXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyPiBzZXJ2ZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWRfOworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyU3RhdGU+IHNlcnZlclN0YXRlXzsKKyAgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gc2VydmVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZF87CiB9OwotCi19fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRlc3QKIAogI2VuZGlmIC8vIF9USFJJRlRfVEVTVF9TRVJWRVJUSFJFQURfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jcHAvdGVzdC9xdC9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjM0MWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC90ZXN0L3F0L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoQ01BS0VfQVVUT01PQyBPTikKK2ZpbmRfcGFja2FnZShRdDUgUkVRVUlSRUQgQ09NUE9ORU5UUyBUZXN0IE5ldHdvcmspCitzZXQoVFFUY3BTZXJ2ZXJUZXN0X1F0NV9TT1VSQ0VTCisgICAgVFFUY3BTZXJ2ZXJUZXN0LmNwcAorKQorYWRkX2V4ZWN1dGFibGUoVFFUY3BTZXJ2ZXJUZXN0X1F0NSAke1RRVGNwU2VydmVyVGVzdF9RdDVfU09VUkNFU30pCit0YXJnZXRfbGlua19saWJyYXJpZXMoVFFUY3BTZXJ2ZXJUZXN0X1F0NSB0ZXN0Z2VuY3BwX2NvYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3RfUXQ1IHRocmlmdHF0NSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUUVRjcFNlcnZlclRlc3RfUXQ1IHRocmlmdCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUUVRjcFNlcnZlclRlc3RfUXQ1IFF0NTo6VGVzdCBRdDU6Ok5ldHdvcmspCisKK2FkZF90ZXN0KE5BTUUgVFFUY3BTZXJ2ZXJUZXN0X1F0NSBDT01NQU5EIFRRVGNwU2VydmVyVGVzdF9RdDUpCisKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkMGM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTEzIEBACisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRRVGNwU2VydmVyVGVzdAorI2luY2x1ZGUgPFFUZXN0PgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8UVRjcFNlcnZlcj4KKyNpbmNsdWRlIDxRVGNwU29ja2V0PgorI2luY2x1ZGUgPFFIb3N0QWRkcmVzcz4KKyNpbmNsdWRlIDxRVGhyZWFkPgorCisjaWZuZGVmIFFfTU9DX1JVTgorICAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorICAjaW5jbHVkZSAidGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIgorICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgiCisgICNpbmNsdWRlICJ0aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIgorCisgICNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CisKK3N0cnVjdCBBc3luY0hhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUNvYlN2SWYgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3RyaW5nczsKKyAgdmlydHVhbCB2b2lkIGFkZFN0cmluZyhzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgcykgeworICAgIHN0cmluZ3MucHVzaF9iYWNrKHMpOworICAgIGNvYigpOworICB9CisgIHZpcnR1YWwgdm9pZCBnZXRTdHJpbmdzKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IpIHsKKyAgICBjb2Ioc3RyaW5ncyk7CisgIH0KKworICAvLyBPdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0CisgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7fQorICB2aXJ0dWFsIHZvaWQgb25ld2F5V2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uV2FpdCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8sCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KKyAgdmlydHVhbCB2b2lkIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7fQorfTsKKworY2xhc3MgVFFUY3BTZXJ2ZXJUZXN0IDogcHVibGljIFFPYmplY3QgeworICBRX09CSkVDVAorCitwcml2YXRlIHNsb3RzOgorICB2b2lkIGluaXRUZXN0Q2FzZSgpOworICB2b2lkIGNsZWFudXBUZXN0Q2FzZSgpOworICB2b2lkIHRlc3RfY29tbXVuaWNhdGUoKTsKKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPFFUaHJlYWQ+IHNlcnZlclRocmVhZDsKKyAgc3RkOjpzaGFyZWRfcHRyPGFzeW5jOjpUUVRjcFNlcnZlcj4gc2VydmVyOworICBzdGQ6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZUNsaWVudD4gY2xpZW50OworfTsKKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OmluaXRUZXN0Q2FzZSgpIHsKKyAgLy8gc2V0dXAgc2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJTb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTZXJ2ZXI+KCk7CisgIHNlcnZlci5yZXNldChuZXcgYXN5bmM6OlRRVGNwU2VydmVyKHNlcnZlclNvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDx0ZXN0OjpQYXJlbnRTZXJ2aWNlQXN5bmNQcm9jZXNzb3I+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEFzeW5jSGFuZGxlcj4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpKTsKKyAgUVZFUklGWShzZXJ2ZXJTb2NrZXQtPmxpc3RlbihRSG9zdEFkZHJlc3M6OkxvY2FsSG9zdCkpOworICBpbnQgcG9ydCA9IHNlcnZlclNvY2tldC0+c2VydmVyUG9ydCgpOworICBRVkVSSUZZKHBvcnQgPiAwKTsKKworICAvL3NldHVwIHNlcnZlciB0aHJlYWQgYW5kIG1vdmUgc2VydmVyIHRvIGl0CisgIHNlcnZlclRocmVhZC5yZXNldChuZXcgUVRocmVhZCgpKTsKKyAgc2VydmVyU29ja2V0LT5tb3ZlVG9UaHJlYWQoc2VydmVyVGhyZWFkLmdldCgpKTsKKyAgc2VydmVyLT5tb3ZlVG9UaHJlYWQoc2VydmVyVGhyZWFkLmdldCgpKTsKKyAgc2VydmVyVGhyZWFkLT5zdGFydCgpOworCisgIC8vIHNldHVwIGNsaWVudAorICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0ID0gc3RkOjptYWtlX3NoYXJlZDxRVGNwU29ja2V0PigpOworICBjbGllbnQucmVzZXQobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0Pihzb2NrZXQpKSkpOworICBzb2NrZXQtPmNvbm5lY3RUb0hvc3QoUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QsIHBvcnQpOworICBRVkVSSUZZKHNvY2tldC0+d2FpdEZvckNvbm5lY3RlZCgpKTsKK30KKwordm9pZCBUUVRjcFNlcnZlclRlc3Q6OmNsZWFudXBUZXN0Q2FzZSgpIHsKKyAgLy9maXJzdCwgc3RvcCB0aGUgdGhyZWFkIHdoaWNoIGhvbGRzIHRoZSBzZXJ2ZXIKKyAgc2VydmVyVGhyZWFkLT5xdWl0KCk7CisgIHNlcnZlclRocmVhZC0+d2FpdCgpOworICAvLyBub3csIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoZSBzZXJ2ZXIKKyAgc2VydmVyLnJlc2V0KCk7CisgIC8vIGRlbGV0ZSB0aHJlYWQgbm93CisgIHNlcnZlclRocmVhZC5yZXNldCgpOworCisgIC8vIGNsZWFudXAgY2xpZW50CisgIGNsaWVudC5yZXNldCgpOworfQorCit2b2lkIFRRVGNwU2VydmVyVGVzdDo6dGVzdF9jb21tdW5pY2F0ZSgpIHsKKyAgY2xpZW50LT5hZGRTdHJpbmcoImZvbyIpOworICBjbGllbnQtPmFkZFN0cmluZygiYmFyIik7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcGx5OworICBjbGllbnQtPmdldFN0cmluZ3MocmVwbHkpOworICBRQ09NUEFSRShRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKHJlcGx5WzBdKSwgUVN0cmluZygiZm9vIikpOworICBRQ09NUEFSRShRU3RyaW5nOjpmcm9tU3RkU3RyaW5nKHJlcGx5WzFdKSwgUVN0cmluZygiYmFyIikpOworfQorCisKKyNpZiAoUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDUsIDAsIDApKQorUVRFU1RfR1VJTEVTU19NQUlOKFRRVGNwU2VydmVyVGVzdCk7CisjZWxzZQorI3VuZGVmIFFUX0dVSV9MSUIKK1FURVNUX01BSU4oVFFUY3BTZXJ2ZXJUZXN0KTsKKyNlbmRpZgorI2luY2x1ZGUgIlRRVGNwU2VydmVyVGVzdC5tb2MiCmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1uYi5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LW5iLnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYWUwNTE4OC4uMmM2YTk2OQotLS0gYS9saWIvY3BwL3RocmlmdC1uYi5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC1uYi5wYy5pbgpAQCAtMjcsNCArMjcsNCBAQAogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdG5iCi1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1xdC5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXF0LnBjLmluCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggODQ2ZTM2Mi4uNWU2MGQ4NAotLS0gYS9saWIvY3BwL3RocmlmdC1xdC5wYy5pbgorKysgYi9saWIvY3BwL3RocmlmdC1xdC5wYy5pbgpAQCAtMjcsNCArMjcsNCBAQAogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHF0Ci1DZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS90aHJpZnQKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CmRpZmYgLS1naXQgYS9saWIvY3BwL3RocmlmdC1xdDUucGMuaW4gYi9saWIvY3BwL3RocmlmdC1xdDUucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYThiMTY2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGhyaWZ0LXF0NS5wYy5pbgpAQCAtMCwwICsxLDMwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IFRocmlmdAorRGVzY3JpcHRpb246IFRocmlmdCBRdDUgQVBJCitWZXJzaW9uOiBAVkVSU0lPTkAKK1JlcXVpcmVzOiB0aHJpZnQgPSBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sdGhyaWZ0cXQ1CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90aHJpZnQtei5wYy5pbiBiL2xpYi9jcHAvdGhyaWZ0LXoucGMuaW4Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3MmY0NmJmLi40NjdkMmUxCi0tLSBhL2xpYi9jcHAvdGhyaWZ0LXoucGMuaW4KKysrIGIvbGliL2NwcC90aHJpZnQtei5wYy5pbgpAQCAtMjcsNCArMjcsNCBAQAogVmVyc2lvbjogQFZFUlNJT05ACiBSZXF1aXJlczogdGhyaWZ0ID0gQFZFUlNJT05ACiBMaWJzOiAtTCR7bGliZGlyfSAtbHRocmlmdHoKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9L3RocmlmdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LnBjLmluIGIvbGliL2NwcC90aHJpZnQucGMuaW4Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3YWVjMDlmLi5kMTFlNmRiCi0tLSBhL2xpYi9jcHAvdGhyaWZ0LnBjLmluCisrKyBiL2xpYi9jcHAvdGhyaWZ0LnBjLmluCkBAIC0yNiw0ICsyNiw0IEBACiBEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBBUEkKIFZlcnNpb246IEBWRVJTSU9OQAogTGliczogLUwke2xpYmRpcn0gLWx0aHJpZnQKLUNmbGFnczogLUkke2luY2x1ZGVkaXJ9L3RocmlmdAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGhyaWZ0LnNsbiBiL2xpYi9jcHAvdGhyaWZ0LnNsbgppbmRleCA4OGQ3OTY4Li5jYjBmNDU1IDEwMDY0NAotLS0gYS9saWIvY3BwL3RocmlmdC5zbG4KKysrIGIvbGliL2NwcC90aHJpZnQuc2xuCkBAIC03LDcgKzcsNyBAQAogRW5kUHJvamVjdAogUHJvamVjdCgiezIxNTBFMzMzLThGREMtNDJBMy05NDc0LTFBMzk1NkQ0NkRFOH0iKSA9ICJkb2MiLCAiZG9jIiwgInswMDY5ODRFMC03Q0MxLTQ3RTItQUNEMi1BNDBGRTREMzg2OTN9IgogCVByb2plY3RTZWN0aW9uKFNvbHV0aW9uSXRlbXMpID0gcHJlUHJvamVjdAotCQlSRUFETUVfV0lORE9XUyA9IFJFQURNRV9XSU5ET1dTCisJCVJFQURNRS5tZCA9IFJFQURNRS5tZAogCUVuZFByb2plY3RTZWN0aW9uCiBFbmRQcm9qZWN0CiBHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCmluZGV4IDhlMWZjN2IuLjU2YThiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMTcsOSArMTcsMTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVENPREU9IFwKK1NVQkRJUlMgPSAuIHRlc3QvTXVsdGlwbGV4CisKK1RIUklGVENPREUgPSBcCiAgICAgICAgICAgICBzcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MgXAorICAgICAgICAgICAgc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RCYXNlLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MgXApAQCAtMzEsNiArMzUsOSBAQAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcyBcCiAgICAgICAgICAgICBzcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MgXAorICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIFwKKyAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RUeXBlLmNzIFwKICAgICAgICAgICAgIHNyYy9Qcm90b2NvbC9URmllbGQuY3MgXAogICAgICAgICAgICAgc3JjL1Byb3RvY29sL1RNZXNzYWdlLmNzIFwKQEAgLTQxLDkgKzQ4LDExIEBACiAgICAgICAgICAgICBzcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIFwKICAgICAgICAgICAgIHNyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcyBcCiAgICAgICAgICAgICBzcmMvU2VydmVyL1RTZXJ2ZXIuY3MgXAorICAgICAgICAgICAgc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MgXApAQCAtNTIsMjcgKzYxLDU1IEBACiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgXAorICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzIFwKKyAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBcCiAgICAgICAgICAgICBzcmMvVFByb2Nlc3Nvci5jcyBcCisgICAgICAgICAgICBzcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgXAorICAgICAgICAgICAgc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIFwKKyAgICAgICAgICAgIHNyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyBcCisgICAgICAgICAgICBzcmMvVENvbnRyb2xsaW5nSGFuZGxlci5jcyBcCisgICAgICAgICAgICBzcmMvVEV4Y2VwdGlvbi5jcyBcCiAgICAgICAgICAgICBzcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCiAKLUNTQz1nbWNzCi0KLWlmIE5FVF8yXzAKLU1PTk9fREVGSU5FUz0vZDpORVRfMl8wCitpZiBNT05PX01DUworZXhwb3J0IENTQyA9IG1jcworZWxzZQorZXhwb3J0IENTQyA9IGdtY3MKIGVuZGlmCiAKLWFsbC1sb2NhbDogVGhyaWZ0LmRsbAoraWYgTkVUXzJfMAorZXhwb3J0IENTQ19ERUZJTkVTID0gLWQ6TkVUXzJfMAorZW5kaWYKKworYWxsLWxvY2FsOiBUaHJpZnQuZGxsIFRocmlmdC40NS5kbGwKIAogVGhyaWZ0LmRsbDogJChUSFJJRlRDT0RFKQotCSQoQ1NDKSAkKFRIUklGVENPREUpIC9vdXQ6VGhyaWZ0LmRsbCAvdGFyZ2V0OmxpYnJhcnkgL3JlZmVyZW5jZTpTeXN0ZW0uV2ViICQoTU9OT19ERUZJTkVTKQorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQorCitUaHJpZnQuNDUuZGxsOiAkKFRIUklGVENPREUpCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXRhcmdldDpsaWJyYXJ5IC1yZWZlcmVuY2U6U3lzdGVtLldlYiAkKFRIUklGVENPREUpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIFRocmlmdC5kbGwKKwkkKFJNKSBUaHJpZnQuZGxsICBcCisJJChSTSkgVGhyaWZ0LjQ1LmRsbAogCiBFWFRSQV9ESVNUID0gXAotICAgICAgICAgICAgICQoVEhSSUZUQ09ERSkgXAotICAgICAgICAgICAgIFRocmlmdE1TQnVpbGRUYXNrIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LmNzcHJvaiBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC5zbG4gXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuV1A3LmNzcHJvaiBcCi0gICAgICAgICAgICAgc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLldQNy5jcworCSQoVEhSSUZUQ09ERSkgXAorCVRocmlmdE1TQnVpbGRUYXNrIFwKKwlzcmMvVGhyaWZ0LmNzcHJvaiBcCisJc3JjL1RocmlmdC40NS5jc3Byb2ogXAorCXNyYy9UaHJpZnQuc2xuIFwKKwlzcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzIFwKKwlzcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBcCisJc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgXAorCXNyYy9UQXN5bmNQcm9jZXNzb3IuY3MgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZSBcCisJTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvUkVBRE1FIGIvbGliL2NzaGFycC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9jc2hhcnAvUkVBRE1FCnJlbmFtZSB0byBsaWIvY3NoYXJwL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggMmUwOGU2Ni4uYzc0MWI3MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC01Niw1ICs1Niw1IEBACiAvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwogLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKIC8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuKiIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcyBiL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0QnVpbGQuY3MKaW5kZXggNzViYjMzOS4uNGU2ZDMwMSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRCdWlsZC5jcworKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdEJ1aWxkLmNzCkBAIC0zMywyMTQgKzMzLDIxNCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0TVNCdWlsZFRhc2sKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIE1TQnVpbGQgVGFzayB0byBnZW5lcmF0ZSBjc2hhcnAgZnJvbSAudGhyaWZ0IGZpbGVzLCBhbmQgY29tcGlsZSB0aGUgY29kZSBpbnRvIGEgbGlicmFyeTogVGhyaWZ0SW1wbC5kbGwKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUaHJpZnRCdWlsZCA6IFRhc2sKLQl7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBmdWxsIHBhdGggdG8gdGhlIHRocmlmdC5leGUgY29tcGlsZXIKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdEV4ZWN1dGFibGUKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBNU0J1aWxkIFRhc2sgdG8gZ2VuZXJhdGUgY3NoYXJwIGZyb20gLnRocmlmdCBmaWxlcywgYW5kIGNvbXBpbGUgdGhlIGNvZGUgaW50byBhIGxpYnJhcnk6IFRocmlmdEltcGwuZGxsCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVGhyaWZ0QnVpbGQgOiBUYXNrCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSB0aHJpZnQuZXhlIGNvbXBpbGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFtSZXF1aXJlZF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBUaHJpZnRFeGVjdXRhYmxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgICAgIHNldDsKKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBmdWxsIHBhdGggdG8gYSB0aHJpZnQuZGxsIEMjIGxpYnJhcnkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJW1JlcXVpcmVkXQotCQlwdWJsaWMgSVRhc2tJdGVtIFRocmlmdExpYnJhcnkKLQkJewotCQkJZ2V0OwotCQkJc2V0OwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBmdWxsIHBhdGggdG8gYSB0aHJpZnQuZGxsIEMjIGxpYnJhcnkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdExpYnJhcnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQSBkaXJlY290cnkgY29udGFpbmluZyAudGhyaWZ0IGZpbGVzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtSZXF1aXJlZF0KLQkJcHVibGljIElUYXNrSXRlbSBUaHJpZnREZWZpbml0aW9uRGlyCi0JCXsKLQkJCWdldDsKLQkJCXNldDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBIGRpcmVjb3RyeSBjb250YWluaW5nIC50aHJpZnQgZmlsZXMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIFRocmlmdERlZmluaXRpb25EaXIKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIG5hbWUgb2YgdGhlIGF1dG8tZ2VuIGFuZCBjb21waWxlZCB0aHJpZnQgbGlicmFyeS4gSXQgd2lsbCBwbGFjZWQgaW4KLQkJLy8vIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBUaHJpZnRMaWJyYXJ5Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtSZXF1aXJlZF0KLQkJcHVibGljIElUYXNrSXRlbSBPdXRwdXROYW1lCi0JCXsKLQkJCWdldDsKLQkJCXNldDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgYXV0by1nZW4gYW5kIGNvbXBpbGVkIHRocmlmdCBsaWJyYXJ5LiBJdCB3aWxsIHBsYWNlZCBpbgorICAgICAgICAvLy8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIFRocmlmdExpYnJhcnkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW1JlcXVpcmVkXQorICAgICAgICBwdWJsaWMgSVRhc2tJdGVtIE91dHB1dE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0OworICAgICAgICAgICAgc2V0OworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZWQgVGhyaWZ0TGlicmFyeS4gVGhpcyBhbGxvd3MgbXNidWlsZCB0YXNrcyB0byB1c2UgdGhpcwotCQkvLy8gb3V0cHV0IGFzIGEgdmFyaWFibGUgZm9yIHVzZSBlbHNld2hlcmUuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCVtPdXRwdXRdCi0JCXB1YmxpYyBJVGFza0l0ZW0gVGhyaWZ0SW1wbGVtZW50YXRpb24KLQkJewotCQkJZ2V0IHsgcmV0dXJuIHRocmlmdEltcGw7IH0KLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVsbCBwYXRoIHRvIHRoZSBjb21waWxlZCBUaHJpZnRMaWJyYXJ5LiBUaGlzIGFsbG93cyBtc2J1aWxkIHRhc2tzIHRvIHVzZSB0aGlzCisgICAgICAgIC8vLyBvdXRwdXQgYXMgYSB2YXJpYWJsZSBmb3IgdXNlIGVsc2V3aGVyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgW091dHB1dF0KKyAgICAgICAgcHVibGljIElUYXNrSXRlbSBUaHJpZnRJbXBsZW1lbnRhdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdGhyaWZ0SW1wbDsgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBJVGFza0l0ZW0gdGhyaWZ0SW1wbDsKLQkJcHJpdmF0ZSBjb25zdCBzdHJpbmcgbGFzdENvbXBpbGF0aW9uTmFtZSA9ICJMQVNUX0NPTVBfVElNRVNUQU1QIjsKKyAgICAgICAgcHJpdmF0ZSBJVGFza0l0ZW0gdGhyaWZ0SW1wbDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgbGFzdENvbXBpbGF0aW9uTmFtZSA9ICJMQVNUX0NPTVBfVElNRVNUQU1QIjsKIAotCQkvL3VzZSB0aGUgTWVzc2FnZSBCdWlsZCBUYXNrIHRvIHdyaXRlIHNvbWV0aGluZyB0byBidWlsZCBsb2cKLQkJcHJpdmF0ZSB2b2lkIExvZ01lc3NhZ2Uoc3RyaW5nIHRleHQsIE1lc3NhZ2VJbXBvcnRhbmNlIGltcG9ydGFuY2UpCi0JCXsKLQkJCU1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7Ci0JCQltLlRleHQgPSB0ZXh0OwotCQkJbS5JbXBvcnRhbmNlID0gaW1wb3J0YW5jZS5Ub1N0cmluZygpOwotCQkJbS5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7Ci0JCQltLkV4ZWN1dGUoKTsKLQkJfQorICAgICAgICAvL3VzZSB0aGUgTWVzc2FnZSBCdWlsZCBUYXNrIHRvIHdyaXRlIHNvbWV0aGluZyB0byBidWlsZCBsb2cKKyAgICAgICAgcHJpdmF0ZSB2b2lkIExvZ01lc3NhZ2Uoc3RyaW5nIHRleHQsIE1lc3NhZ2VJbXBvcnRhbmNlIGltcG9ydGFuY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICBtLlRleHQgPSB0ZXh0OworICAgICAgICAgICAgbS5JbXBvcnRhbmNlID0gaW1wb3J0YW5jZS5Ub1N0cmluZygpOworICAgICAgICAgICAgbS5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7CisgICAgICAgICAgICBtLkV4ZWN1dGUoKTsKKyAgICAgICAgfQogCi0JCS8vcmVjdXJzaXZlbHkgZmluZCAuY3MgZmlsZXMgaW4gc3JjRGlyLCBwYXRocyBzaG91bGQgaW5pdGlhbGx5IGJlIG5vbi1udWxsIGFuZCBlbXB0eQotCQlwcml2YXRlIHZvaWQgRmluZFNvdXJjZXNIZWxwZXIoc3RyaW5nIHNyY0RpciwgTGlzdDxzdHJpbmc+IHBhdGhzKQotCQl7Ci0JCQlzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhzcmNEaXIsICIqLmNzIik7Ci0JCQlmb3JlYWNoIChzdHJpbmcgZiBpbiBmaWxlcykKLQkJCXsKLQkJCQlwYXRocy5BZGQoZik7Ci0JCQl9Ci0JCQlzdHJpbmdbXSBkaXJzID0gRGlyZWN0b3J5LkdldERpcmVjdG9yaWVzKHNyY0Rpcik7Ci0JCQlmb3JlYWNoIChzdHJpbmcgZGlyIGluIGRpcnMpCi0JCQl7Ci0JCQkJRmluZFNvdXJjZXNIZWxwZXIoZGlyLCBwYXRocyk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy9yZWN1cnNpdmVseSBmaW5kIC5jcyBmaWxlcyBpbiBzcmNEaXIsIHBhdGhzIHNob3VsZCBpbml0aWFsbHkgYmUgbm9uLW51bGwgYW5kIGVtcHR5CisgICAgICAgIHByaXZhdGUgdm9pZCBGaW5kU291cmNlc0hlbHBlcihzdHJpbmcgc3JjRGlyLCBMaXN0PHN0cmluZz4gcGF0aHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZ1tdIGZpbGVzID0gRGlyZWN0b3J5LkdldEZpbGVzKHNyY0RpciwgIiouY3MiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBmIGluIGZpbGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhdGhzLkFkZChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmluZ1tdIGRpcnMgPSBEaXJlY3RvcnkuR2V0RGlyZWN0b3JpZXMoc3JjRGlyKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyBkaXIgaW4gZGlycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaW5kU291cmNlc0hlbHBlcihkaXIsIHBhdGhzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFF1b3RlIHBhdGhzIHdpdGggc3BhY2VzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXByaXZhdGUgc3RyaW5nIFNhZmVQYXRoKHN0cmluZyBwYXRoKQotCQl7Ci0JCQlpZiAocGF0aC5Db250YWlucygnICcpICYmICFwYXRoLlN0YXJ0c1dpdGgoIlwiIikpCi0JCQl7Ci0JCQkJcmV0dXJuICJcIiIgKyBwYXRoICsgIlwiIjsKLQkJCX0KLQkJCXJldHVybiBwYXRoOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFF1b3RlIHBhdGhzIHdpdGggc3BhY2VzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNhZmVQYXRoKHN0cmluZyBwYXRoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGF0aC5Db250YWlucygnICcpICYmICFwYXRoLlN0YXJ0c1dpdGgoIlwiIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJcIiIgKyBwYXRoICsgIlwiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBJVGFza0l0ZW1bXSBGaW5kU291cmNlcyhzdHJpbmcgc3JjRGlyKQotCQl7Ci0JCQlMaXN0PHN0cmluZz4gZmlsZXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7Ci0JCQlGaW5kU291cmNlc0hlbHBlcihzcmNEaXIsIGZpbGVzKTsKLQkJCUlUYXNrSXRlbVtdIGl0ZW1zID0gbmV3IElUYXNrSXRlbVtmaWxlcy5Db3VudF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLkxlbmd0aDsgaSsrKQotCQkJewotCQkJCWl0ZW1zW2ldID0gbmV3IFRhc2tJdGVtKGZpbGVzW2ldKTsKLQkJCX0KLQkJCXJldHVybiBpdGVtczsKLQkJfQorICAgICAgICBwcml2YXRlIElUYXNrSXRlbVtdIEZpbmRTb3VyY2VzKHN0cmluZyBzcmNEaXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8c3RyaW5nPiBmaWxlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIEZpbmRTb3VyY2VzSGVscGVyKHNyY0RpciwgZmlsZXMpOworICAgICAgICAgICAgSVRhc2tJdGVtW10gaXRlbXMgPSBuZXcgSVRhc2tJdGVtW2ZpbGVzLkNvdW50XTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlbXNbaV0gPSBuZXcgVGFza0l0ZW0oZmlsZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGl0ZW1zOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdHJpbmcgTGFzdFdyaXRlVGltZShzdHJpbmcgZGVmRGlyKQotCQl7Ci0JCQlzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpOwotCQkJRGF0ZVRpbWUgZCA9IChuZXcgRGlyZWN0b3J5SW5mbyhkZWZEaXIpKS5MYXN0V3JpdGVUaW1lOwotCQkJZm9yZWFjaChzdHJpbmcgZmlsZSBpbiBmaWxlcykKLQkJCXsKLQkJCQlGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKGZpbGUpOwotCQkJCURhdGVUaW1lIGN1cnIgPSBmLkxhc3RXcml0ZVRpbWU7Ci0JCQkJaWYgKERhdGVUaW1lLkNvbXBhcmUoY3VyciwgZCkgPiAwKQotCQkJCXsKLQkJCQkJZCA9IGN1cnI7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGQuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgTGFzdFdyaXRlVGltZShzdHJpbmcgZGVmRGlyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmdbXSBmaWxlcyA9IERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpOworICAgICAgICAgICAgRGF0ZVRpbWUgZCA9IChuZXcgRGlyZWN0b3J5SW5mbyhkZWZEaXIpKS5MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgZm9yZWFjaChzdHJpbmcgZmlsZSBpbiBmaWxlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKGZpbGUpOworICAgICAgICAgICAgICAgIERhdGVUaW1lIGN1cnIgPSBmLkxhc3RXcml0ZVRpbWU7CisgICAgICAgICAgICAgICAgaWYgKERhdGVUaW1lLkNvbXBhcmUoY3VyciwgZCkgPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZCA9IGN1cnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGQuVG9GaWxlVGltZVV0YygpLlRvU3RyaW5nKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFeGVjdXRlKCkKLQkJewotCQkJc3RyaW5nIGRlZkRpciA9IFNhZmVQYXRoKFRocmlmdERlZmluaXRpb25EaXIuSXRlbVNwZWMpOwotCQkJLy9sb29rIGZvciBsYXN0IGNvbXBpbGF0aW9uIHRpbWVzdGFtcAotCQkJc3RyaW5nIGxhc3RCdWlsZFBhdGggPSBQYXRoLkNvbWJpbmUoZGVmRGlyLCBsYXN0Q29tcGlsYXRpb25OYW1lKTsKLQkJCURpcmVjdG9yeUluZm8gZGVmRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcik7Ci0JCQlzdHJpbmcgbGFzdFdyaXRlID0gTGFzdFdyaXRlVGltZShkZWZEaXIpOwotCQkJaWYgKEZpbGUuRXhpc3RzKGxhc3RCdWlsZFBhdGgpKQotCQkJewotCQkJCXN0cmluZyBsYXN0Q29tcCA9IEZpbGUuUmVhZEFsbFRleHQobGFzdEJ1aWxkUGF0aCk7Ci0JCQkJLy9kb24ndCByZWNvbXBpbGUgaWYgdGhlIHRocmlmdCBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgbGFzdENvbXAKLQkJCQlGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpOwotCQkJCXN0cmluZyB0aHJpZnRMaWJUaW1lID0gZi5MYXN0V3JpdGVUaW1lVXRjLlRvRmlsZVRpbWVVdGMoKS5Ub1N0cmluZygpOwotCQkJCWlmIChsYXN0Q29tcC5Db21wYXJlVG8odGhyaWZ0TGliVGltZSkgPCAwKQotCQkJCXsKLQkJCQkJLy9uZXcgdGhyaWZ0IGxpYnJhcnksIGRvIGEgY29tcGlsZQotCQkJCQlsYXN0V3JpdGUgPSB0aHJpZnRMaWJUaW1lOwotCQkJCX0KLQkJCQllbHNlIGlmIChsYXN0Q29tcCA9PSBsYXN0V3JpdGUgfHwgKGxhc3RDb21wID09IHRocmlmdExpYlRpbWUgJiYgbGFzdENvbXAuQ29tcGFyZVRvKGxhc3RXcml0ZSkgPiAwKSkKLQkJCQl7Ci0JCQkJCS8vdGhlIC50aHJpZnQgZGlyIGhhc24ndCBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgbGFzdCBjb21waWxhdGlvbiwgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZwotCQkJCQlMb2dNZXNzYWdlKCJUaHJpZnRJbXBsIHVwLXRvLWRhdGUiLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFeGVjdXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIGRlZkRpciA9IFNhZmVQYXRoKFRocmlmdERlZmluaXRpb25EaXIuSXRlbVNwZWMpOworICAgICAgICAgICAgLy9sb29rIGZvciBsYXN0IGNvbXBpbGF0aW9uIHRpbWVzdGFtcAorICAgICAgICAgICAgc3RyaW5nIGxhc3RCdWlsZFBhdGggPSBQYXRoLkNvbWJpbmUoZGVmRGlyLCBsYXN0Q29tcGlsYXRpb25OYW1lKTsKKyAgICAgICAgICAgIERpcmVjdG9yeUluZm8gZGVmRGlySW5mbyA9IG5ldyBEaXJlY3RvcnlJbmZvKGRlZkRpcik7CisgICAgICAgICAgICBzdHJpbmcgbGFzdFdyaXRlID0gTGFzdFdyaXRlVGltZShkZWZEaXIpOworICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGxhc3RCdWlsZFBhdGgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBsYXN0Q29tcCA9IEZpbGUuUmVhZEFsbFRleHQobGFzdEJ1aWxkUGF0aCk7CisgICAgICAgICAgICAgICAgLy9kb24ndCByZWNvbXBpbGUgaWYgdGhlIHRocmlmdCBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgc2luY2UgbGFzdENvbXAKKyAgICAgICAgICAgICAgICBGaWxlSW5mbyBmID0gbmV3IEZpbGVJbmZvKFRocmlmdExpYnJhcnkuSXRlbVNwZWMpOworICAgICAgICAgICAgICAgIHN0cmluZyB0aHJpZnRMaWJUaW1lID0gZi5MYXN0V3JpdGVUaW1lVXRjLlRvRmlsZVRpbWVVdGMoKS5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tcC5Db21wYXJlVG8odGhyaWZ0TGliVGltZSkgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9uZXcgdGhyaWZ0IGxpYnJhcnksIGRvIGEgY29tcGlsZQorICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGUgPSB0aHJpZnRMaWJUaW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXN0Q29tcCA9PSBsYXN0V3JpdGUgfHwgKGxhc3RDb21wID09IHRocmlmdExpYlRpbWUgJiYgbGFzdENvbXAuQ29tcGFyZVRvKGxhc3RXcml0ZSkgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhlIC50aHJpZnQgZGlyIGhhc24ndCBiZWVuIHdyaXR0ZW4gdG8gc2luY2UgbGFzdCBjb21waWxhdGlvbiwgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlKCJUaHJpZnRJbXBsIHVwLXRvLWRhdGUiLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQkvL2ZpbmQgdGhlIGRpcmVjdG9yeSBvZiB0aGUgdGhyaWZ0bGlicmFyeSAodGhhdCdzIHdoZXJlIG91dHB1dCB3aWxsIGdvKQotCQkJRmlsZUluZm8gdGhyaWZ0TGliSW5mbyA9IG5ldyBGaWxlSW5mbyhTYWZlUGF0aChUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSk7Ci0JCQlzdHJpbmcgdGhyaWZ0RGlyID0gdGhyaWZ0TGliSW5mby5EaXJlY3RvcnkuRnVsbE5hbWU7CisgICAgICAgICAgICAvL2ZpbmQgdGhlIGRpcmVjdG9yeSBvZiB0aGUgdGhyaWZ0bGlicmFyeSAodGhhdCdzIHdoZXJlIG91dHB1dCB3aWxsIGdvKQorICAgICAgICAgICAgRmlsZUluZm8gdGhyaWZ0TGliSW5mbyA9IG5ldyBGaWxlSW5mbyhTYWZlUGF0aChUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSk7CisgICAgICAgICAgICBzdHJpbmcgdGhyaWZ0RGlyID0gdGhyaWZ0TGliSW5mby5EaXJlY3RvcnkuRnVsbE5hbWU7CiAKLQkJCXN0cmluZyBnZW5EaXIgPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpOwotCQkJaWYgKERpcmVjdG9yeS5FeGlzdHMoZ2VuRGlyKSkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCURpcmVjdG9yeS5EZWxldGUoZ2VuRGlyLCB0cnVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggeyAvKmVoIGkgdHJpZWQsIGp1c3Qgb3Zlci13cml0ZSBub3cqL30KLQkJCX0KKyAgICAgICAgICAgIHN0cmluZyBnZW5EaXIgPSBQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpOworICAgICAgICAgICAgaWYgKERpcmVjdG9yeS5FeGlzdHMoZ2VuRGlyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yeS5EZWxldGUoZ2VuRGlyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggeyAvKmVoIGkgdHJpZWQsIGp1c3Qgb3Zlci13cml0ZSBub3cqL30KKyAgICAgICAgICAgIH0KIAotCQkJLy9ydW4gdGhlIHRocmlmdCBleGVjdXRhYmxlIHRvIGdlbmVyYXRlIEMjCi0JCQlmb3JlYWNoIChzdHJpbmcgdGhyaWZ0RmlsZSBpbiBEaXJlY3RvcnkuR2V0RmlsZXMoZGVmRGlyLCAiKi50aHJpZnQiKSkKLQkJCXsKLQkJCQlMb2dNZXNzYWdlKCJHZW5lcmF0aW5nIGNvZGUgZm9yOiAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuTm9ybWFsKTsKLQkJCQlQcm9jZXNzIHAgPSBuZXcgUHJvY2VzcygpOwotCQkJCXAuU3RhcnRJbmZvLkZpbGVOYW1lID0gU2FmZVBhdGgoVGhyaWZ0RXhlY3V0YWJsZS5JdGVtU3BlYyk7Ci0JCQkJcC5TdGFydEluZm8uQXJndW1lbnRzID0gIi0tZ2VuIGNzaGFycCAtbyAiICsgU2FmZVBhdGgodGhyaWZ0RGlyKSArICIgLXIgIiArIHRocmlmdEZpbGU7Ci0JCQkJcC5TdGFydEluZm8uVXNlU2hlbGxFeGVjdXRlID0gZmFsc2U7Ci0JCQkJcC5TdGFydEluZm8uQ3JlYXRlTm9XaW5kb3cgPSB0cnVlOwotCQkJCXAuU3RhcnRJbmZvLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQgPSBmYWxzZTsKLQkJCQlwLlN0YXJ0KCk7Ci0JCQkJcC5XYWl0Rm9yRXhpdCgpOwotCQkJCWlmIChwLkV4aXRDb2RlICE9IDApCi0JCQkJewotCQkJCQlMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAocC5FeGl0Q29kZSAhPSAwKQotCQkJCXsKLQkJCQkJTG9nTWVzc2FnZSgidGhyaWZ0LmV4ZSBmYWlsZWQgdG8gY29tcGlsZSAiICsgdGhyaWZ0RmlsZSwgTWVzc2FnZUltcG9ydGFuY2UuSGlnaCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICAvL3J1biB0aGUgdGhyaWZ0IGV4ZWN1dGFibGUgdG8gZ2VuZXJhdGUgQyMKKyAgICAgICAgICAgIGZvcmVhY2ggKHN0cmluZyB0aHJpZnRGaWxlIGluIERpcmVjdG9yeS5HZXRGaWxlcyhkZWZEaXIsICIqLnRocmlmdCIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoIkdlbmVyYXRpbmcgY29kZSBmb3I6ICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOworICAgICAgICAgICAgICAgIFByb2Nlc3MgcCA9IG5ldyBQcm9jZXNzKCk7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uRmlsZU5hbWUgPSBTYWZlUGF0aChUaHJpZnRFeGVjdXRhYmxlLkl0ZW1TcGVjKTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSAiLS1nZW4gY3NoYXJwIC1vICIgKyBTYWZlUGF0aCh0aHJpZnREaXIpICsgIiAtciAiICsgdGhyaWZ0RmlsZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5Vc2VTaGVsbEV4ZWN1dGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBwLlN0YXJ0SW5mby5DcmVhdGVOb1dpbmRvdyA9IHRydWU7CisgICAgICAgICAgICAgICAgcC5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZE91dHB1dCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHAuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBwLldhaXRGb3JFeGl0KCk7CisgICAgICAgICAgICAgICAgaWYgKHAuRXhpdENvZGUgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2UoInRocmlmdC5leGUgZmFpbGVkIHRvIGNvbXBpbGUgIiArIHRocmlmdEZpbGUsIE1lc3NhZ2VJbXBvcnRhbmNlLkhpZ2gpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwLkV4aXRDb2RlICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dNZXNzYWdlKCJ0aHJpZnQuZXhlIGZhaWxlZCB0byBjb21waWxlICIgKyB0aHJpZnRGaWxlLCBNZXNzYWdlSW1wb3J0YW5jZS5IaWdoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJQ3NjIGNzYyA9IG5ldyBDc2MoKTsKLQkJCWNzYy5UYXJnZXRUeXBlID0gImxpYnJhcnkiOwotCQkJY3NjLlJlZmVyZW5jZXMgPSBuZXcgSVRhc2tJdGVtW10geyBuZXcgVGFza0l0ZW0oVGhyaWZ0TGlicmFyeS5JdGVtU3BlYykgfTsKLQkJCWNzYy5FbWl0RGVidWdJbmZvcm1hdGlvbiA9IHRydWU7Ci0JCQlzdHJpbmcgb3V0cHV0UGF0aCA9IFBhdGguQ29tYmluZSh0aHJpZnREaXIsIE91dHB1dE5hbWUuSXRlbVNwZWMpOwotCQkJY3NjLk91dHB1dEFzc2VtYmx5ID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOwotCQkJY3NjLlNvdXJjZXMgPSBGaW5kU291cmNlcyhQYXRoLkNvbWJpbmUodGhyaWZ0RGlyLCAiZ2VuLWNzaGFycCIpKTsKLQkJCWNzYy5CdWlsZEVuZ2luZSA9IHRoaXMuQnVpbGRFbmdpbmU7Ci0JCQlMb2dNZXNzYWdlKCJDb21waWxpbmcgZ2VuZXJhdGVkIGNzLi4uIiwgTWVzc2FnZUltcG9ydGFuY2UuTm9ybWFsKTsKLQkJCWlmICghY3NjLkV4ZWN1dGUoKSkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CisgICAgICAgICAgICBDc2MgY3NjID0gbmV3IENzYygpOworICAgICAgICAgICAgY3NjLlRhcmdldFR5cGUgPSAibGlicmFyeSI7CisgICAgICAgICAgICBjc2MuUmVmZXJlbmNlcyA9IG5ldyBJVGFza0l0ZW1bXSB7IG5ldyBUYXNrSXRlbShUaHJpZnRMaWJyYXJ5Lkl0ZW1TcGVjKSB9OworICAgICAgICAgICAgY3NjLkVtaXREZWJ1Z0luZm9ybWF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyBvdXRwdXRQYXRoID0gUGF0aC5Db21iaW5lKHRocmlmdERpciwgT3V0cHV0TmFtZS5JdGVtU3BlYyk7CisgICAgICAgICAgICBjc2MuT3V0cHV0QXNzZW1ibHkgPSBuZXcgVGFza0l0ZW0ob3V0cHV0UGF0aCk7CisgICAgICAgICAgICBjc2MuU291cmNlcyA9IEZpbmRTb3VyY2VzKFBhdGguQ29tYmluZSh0aHJpZnREaXIsICJnZW4tY3NoYXJwIikpOworICAgICAgICAgICAgY3NjLkJ1aWxkRW5naW5lID0gdGhpcy5CdWlsZEVuZ2luZTsKKyAgICAgICAgICAgIExvZ01lc3NhZ2UoIkNvbXBpbGluZyBnZW5lcmF0ZWQgY3MuLi4iLCBNZXNzYWdlSW1wb3J0YW5jZS5Ob3JtYWwpOworICAgICAgICAgICAgaWYgKCFjc2MuRXhlY3V0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KIAotCQkJLy93cml0ZSBmaWxlIHRvIGRlZkRpciB0byBpbmRpY2F0ZSBhIGJ1aWxkIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkCi0JCQlGaWxlLldyaXRlQWxsVGV4dChsYXN0QnVpbGRQYXRoLCBsYXN0V3JpdGUpOworICAgICAgICAgICAgLy93cml0ZSBmaWxlIHRvIGRlZkRpciB0byBpbmRpY2F0ZSBhIGJ1aWxkIHdhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkCisgICAgICAgICAgICBGaWxlLldyaXRlQWxsVGV4dChsYXN0QnVpbGRQYXRoLCBsYXN0V3JpdGUpOwogCi0JCQl0aHJpZnRJbXBsID0gbmV3IFRhc2tJdGVtKG91dHB1dFBhdGgpOworICAgICAgICAgICAgdGhyaWZ0SW1wbCA9IG5ldyBUYXNrSXRlbShvdXRwdXRQYXRoKTsKIAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKaW5kZXggZmMzNzdhNC4uYTMxOWRmMiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKKysrIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2oKQEAgLTEsNCArMSw0IEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8IS0tCiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE2LDEwMyArMTYsMTAzIEBACiAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4NCi0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KLSAgICA8UHJvamVjdEd1aWQ+e0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX08L1Byb2plY3RHdWlkPg0KLSAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+DQotICAgIDxSb290TmFtZXNwYWNlPlRocmlmdE1TQnVpbGRUYXNrPC9Sb290TmFtZXNwYWNlPg0KLSAgICA8QXNzZW1ibHlOYW1lPlRocmlmdE1TQnVpbGRUYXNrPC9Bc3NlbWJseU5hbWU+DQotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCi0gICAgPEZpbGVVcGdyYWRlRmxhZ3M+DQotICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4NCi0gICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCi0gICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPg0KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4NCi0gICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCi0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPg0KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4NCi0gICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4NCi0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPg0KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPg0KLSAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+DQotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+DQotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4NCi0gICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4NCi0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4NCi0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4NCi0gICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+DQotICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCi0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4NCi0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCi0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5CdWlsZC5GcmFtZXdvcmsiIC8+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkJ1aWxkLlRhc2tzIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5CdWlsZC5VdGlsaXRpZXMiIC8+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPg0KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUaHJpZnRCdWlsZC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+DQotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPg0KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPg0KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KLSAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPg0KLSAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4NCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfTwvUHJvamVjdEd1aWQ+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0TVNCdWlsZFRhc2s8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRNU0J1aWxkVGFzazwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxGaWxlVXBncmFkZUZsYWdzPgorICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgorICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4KKyAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4KKyAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4KKyAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4KKyAgICA8VXBkYXRlTW9kZT5Gb3JlZ3JvdW5kPC9VcGRhdGVNb2RlPgorICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4KKyAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPgorICAgIDxVcGRhdGVQZXJpb2RpY2FsbHk+ZmFsc2U8L1VwZGF0ZVBlcmlvZGljYWxseT4KKyAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgorICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KKyAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQnVpbGQuRnJhbWV3b3JrIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkJ1aWxkLlRhc2tzIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkJ1aWxkLlV0aWxpdGllcyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPgorICAgICAgPFJlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPjMuNTwvUmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRocmlmdEJ1aWxkLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KICAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KICAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCiAgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgogICA8L1RhcmdldD4KICAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KICAgPC9UYXJnZXQ+Ci0gIC0tPg0KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIC0tPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2NzaGFycC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODcxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSw2IEBACisjIyBDIyBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW01TRE4gQyMgQ29kaW5nIENvbnZlbnRpb25zXShodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZmY5MjYwNzQuYXNweCkKKyAqIFtDIyBDb2RpbmcgR3VpZGVsaW5lc10oaHR0cDovL2NzaGFycGd1aWRlbGluZXMuY29kZXBsZXguY29tLykKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFmYjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC0wLDAgKzEsOTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgVENvbGxlY3Rpb25zCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgdmFsdWUtd2lzZSB0aGUgc2FtZS4KKyAgICAgICAgLy8vIElmIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgY29sbGVjdGlvbiwgdGhlIGNvbGxlY3Rpb25zIHdpbGwgYmUgY29tcGFyZWQgdXNpbmcgdGhpcyBtZXRob2QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBFcXVhbHMgKElFbnVtZXJhYmxlIGZpcnN0LCBJRW51bWVyYWJsZSBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgfHwgc2Vjb25kID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSUVudW1lcmF0b3IgZml0ZXIgPSBmaXJzdC5HZXRFbnVtZXJhdG9yICgpOworICAgICAgICAgICAgSUVudW1lcmF0b3Igc2l0ZXIgPSBzZWNvbmQuR2V0RW51bWVyYXRvciAoKTsKKworICAgICAgICAgICAgYm9vbCBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0ICgpOworICAgICAgICAgICAgYm9vbCBzbmV4dCA9IHNpdGVyLk1vdmVOZXh0ICgpOworICAgICAgICAgICAgd2hpbGUgKGZuZXh0ICYmIHNuZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElFbnVtZXJhYmxlIGZlbnVtID0gZml0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBzZW51bSA9IHNpdGVyLkN1cnJlbnQgYXMgSUVudW1lcmFibGU7CisgICAgICAgICAgICAgICAgaWYgKGZlbnVtICE9IG51bGwgJiYgc2VudW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGZlbnVtLCBzZW51bSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW51bSA9PSBudWxsIF4gc2VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUVxdWFscyhmaXRlci5DdXJyZW50LCBzaXRlci5DdXJyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm5leHQgPSBmaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHNuZXh0ID0gc2l0ZXIuTW92ZU5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZuZXh0ID09IHNuZXh0OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyByZXR1cm5zIGEgaGFzaGNvZGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZSAoSUVudW1lcmFibGUgZW51bWVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGVudW1lcmFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGhhc2hjb2RlID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggKG9iamVjdCBvYmogaW4gZW51bWVyYWJsZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRW51bWVyYWJsZSBlbnVtMiA9IG9iaiBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgb2JqSGFzaCA9IGVudW0yID09IG51bGwgPyBvYmouR2V0SGFzaENvZGUgKCkgOiBHZXRIYXNoQ29kZSAoZW51bTIpOworICAgICAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzaGNvZGUgPSAoaGFzaGNvZGUgKiAzOTcpIF4gKG9iakhhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKaW5kZXggYjcxYThkMi4uZTI5MjcxYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVEhhc2hTZXQuY3MKQEAgLTMwLDEzMSArMzAsMTMxIEBACiAjaWYgU0lMVkVSTElHSFQKICAgICBbRGF0YUNvbnRyYWN0XQogI2Vsc2UKLQlbU2VyaWFsaXphYmxlXQorICAgIFtTZXJpYWxpemFibGVdCiAjZW5kaWYKLQlwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgotCXsKKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgorICAgIHsKICNpZiBORVRfMl8wIHx8IFNJTFZFUkxJR0hUCiAjaWYgU0lMVkVSTElHSFQKICAgICAgICAgW0RhdGFNZW1iZXJdCiAjZW5kaWYKICAgICAgICAgVERpY3RTZXQ8VD4gc2V0ID0gbmV3IFREaWN0U2V0PFQ+KCk7CiAjZWxzZQotCQlIYXNoU2V0PFQ+IHNldCA9IG5ldyBIYXNoU2V0PFQ+KCk7CisgICAgICAgIEhhc2hTZXQ8VD4gc2V0ID0gbmV3IEhhc2hTZXQ8VD4oKTsKICNlbmRpZgotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBzZXQuQ291bnQ7IH0KLQkJfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXQuQ291bnQ7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sIElzUmVhZE9ubHkKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGZhbHNlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIGJvb2wgSXNSZWFkT25seQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCi0JCXsKLQkJCXNldC5BZGQoaXRlbSk7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgQWRkKFQgaXRlbSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0LkFkZChpdGVtKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyB2b2lkIENsZWFyKCkKLQkJewotCQkJc2V0LkNsZWFyKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBzZXQuQ2xlYXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sIENvbnRhaW5zKFQgaXRlbSkKLQkJewotCQkJcmV0dXJuIHNldC5Db250YWlucyhpdGVtKTsKLQkJfQorICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuQ29udGFpbnMoaXRlbSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgdm9pZCBDb3B5VG8oVFtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKLQkJewotCQkJc2V0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0JCX0KKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNldC5Db3B5VG8oYXJyYXksIGFycmF5SW5kZXgpOworICAgICAgICB9CiAKLQkJcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQotCQl7Ci0JCQlyZXR1cm4gc2V0LkdldEVudW1lcmF0b3IoKTsKLQkJfQorICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CiAKLQkJSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCi0JCXsKLQkJCXJldHVybiAoKElFbnVtZXJhYmxlPFQ+KXNldCkuR2V0RW51bWVyYXRvcigpOwotCQl9CisgICAgICAgIElFbnVtZXJhdG9yPFQ+IElFbnVtZXJhYmxlPFQ+LkdldEVudW1lcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZTxUPilzZXQpLkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCi0JCXsKLQkJCXJldHVybiBzZXQuUmVtb3ZlKGl0ZW0pOwotCQl9CisgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQuUmVtb3ZlKGl0ZW0pOworICAgICAgICB9CiAKICNpZiBORVRfMl8wIHx8IFNJTFZFUkxJR0hUCiAjaWYgU0lMVkVSTElHSFQKICAgICAgICAgW0RhdGFDb250cmFjdF0KICNlbmRpZgogICAgICAgICBwcml2YXRlIGNsYXNzIFREaWN0U2V0PFY+IDogSUNvbGxlY3Rpb248Vj4KLQkJeworICAgICAgICB7CiAjaWYgU0lMVkVSTElHSFQKICAgICAgICAgICAgIFtEYXRhTWVtYmVyXQogI2VuZGlmCi0JCQlEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PiBkaWN0ID0gbmV3IERpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+KCk7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PFYsIFREaWN0U2V0PFY+PiBkaWN0ID0gbmV3IERpY3Rpb25hcnk8ViwgVERpY3RTZXQ8Vj4+KCk7CiAKLQkJCXB1YmxpYyBpbnQgQ291bnQKLQkJCXsKLQkJCQlnZXQgeyByZXR1cm4gZGljdC5Db3VudDsgfQotCQkJfQorICAgICAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBkaWN0LkNvdW50OyB9CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBib29sIElzUmVhZE9ubHkKLQkJCXsKLQkJCQlnZXQgeyByZXR1cm4gZmFsc2U7IH0KLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQotCQkJewotCQkJCXJldHVybiAoKElFbnVtZXJhYmxlKWRpY3QuS2V5cykuR2V0RW51bWVyYXRvcigpOwotCQkJfQorICAgICAgICAgICAgcHVibGljIElFbnVtZXJhdG9yIEdldEVudW1lcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlKWRpY3QuS2V5cykuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgfQogCi0JCQlJRW51bWVyYXRvcjxWPiBJRW51bWVyYWJsZTxWPi5HZXRFbnVtZXJhdG9yKCkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5LZXlzLkdldEVudW1lcmF0b3IoKTsKLQkJCX0KKyAgICAgICAgICAgIElFbnVtZXJhdG9yPFY+IElFbnVtZXJhYmxlPFY+LkdldEVudW1lcmF0b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkaWN0LktleXMuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgYm9vbCBBZGQoViBpdGVtKQotCQkJewotCQkJCWlmICghZGljdC5Db250YWluc0tleShpdGVtKSkKLQkJCQl7Ci0JCQkJCWRpY3RbaXRlbV0gPSB0aGlzOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBBZGQoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZGljdC5Db250YWluc0tleShpdGVtKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRpY3RbaXRlbV0gPSB0aGlzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogCi0JCQl2b2lkIElDb2xsZWN0aW9uPFY+LkFkZChWIGl0ZW0pCi0JCQl7Ci0JCQkJQWRkKGl0ZW0pOwotCQkJfQorICAgICAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxWPi5BZGQoViBpdGVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFkZChpdGVtKTsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIHZvaWQgQ2xlYXIoKQotCQkJewotCQkJCWRpY3QuQ2xlYXIoKTsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWN0LkNsZWFyKCk7CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBib29sIENvbnRhaW5zKFYgaXRlbSkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5Db250YWluc0tleShpdGVtKTsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zKFYgaXRlbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5Db250YWluc0tleShpdGVtKTsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIHZvaWQgQ29weVRvKFZbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCi0JCQl7Ci0JCQkJZGljdC5LZXlzLkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oVltdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWN0LktleXMuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIGJvb2wgUmVtb3ZlKFYgaXRlbSkKLQkJCXsKLQkJCQlyZXR1cm4gZGljdC5SZW1vdmUoaXRlbSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShWIGl0ZW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuUmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAjZW5kaWYKLQl9CisgICAgfQogCiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpAQCAtMCwwICsxLDMxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKKyNpZiAoIU5FVDQ1KQorbmFtZXNwYWNlIFRocmlmdAoreworICAgIHN0YXRpYyBjbGFzcyBTdHJlYW1FeHRlbnNpb25zTmV0MzUKKyAgICB7CisgICAgICAgIC8vIENvcHlUbygpIGhhcyBiZWVuIGFkZGVkIGluIDQuMAorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgQ29weVRvKHRoaXMgU3RyZWFtIHNvdXJjZSwgU3RyZWFtIHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgbG9uZyBuVG90YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gc291cmNlLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuVG90YWw7CisKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgblRvdGFsICs9IG5SZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uV1A3LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjgwNGJjLi4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLldQNy5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLe+7vy8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZwotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0LldQNyIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJDIyBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbSIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLS8vQFRPRE8gd2hlcmUgdG8gcHV0IExpY2Vuc2UgaW5mb3JtYXRpb24/Ci0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoImEzNDNmODljLTU3ZGQtNGZhOC1hOWM2LTM1MzkxY2Q1ZjY1NSIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCBjZGFiMzU2Li43ZTg2NzgxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtNTEsNSArNTEsNSBAQAogLy8KIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuOS4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC45LjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNjFjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVEFic3RyYWN0QmFzZQorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgV3JpdGUoVFByb3RvY29sIHRQcm90b2NvbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcwppbmRleCAxOTY5YmIzLi40MTFlNGQ5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZS5jcwpAQCAtMTksMTYgKzE5LDExIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFRCYXNlCi0JewotCQkvLy8KLQkJLy8vIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotCQkvLy8KLQkJdm9pZCBSZWFkKFRQcm90b2NvbCB0UHJvdG9jb2wpOwotCi0JCS8vLwotCQkvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLQkJLy8vCi0JCXZvaWQgV3JpdGUoVFByb3RvY29sIHRQcm90b2NvbCk7Ci0JfQorICAgIHB1YmxpYyBpbnRlcmZhY2UgVEJhc2UgOiBUQWJzdHJhY3RCYXNlCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBSZWFkKFRQcm90b2NvbCB0UHJvdG9jb2wpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlNjRVdGlscy5jcwppbmRleCA3OGMzNzY3Li45ZWFhZWJkIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmFzZTY0VXRpbHMuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNzCkBAIC0yMSw4MCArMjEsODAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCWludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0VXRpbHMKLQl7Ci0JCWludGVybmFsIGNvbnN0IHN0cmluZyBFTkNPREVfVEFCTEUgPQotCQkJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0VXRpbHMKKyAgICB7CisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFTkNPREVfVEFCTEUgPQorICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogCi0JCWludGVybmFsIHN0YXRpYyB2b2lkIGVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LAotCQkJCQkJCQlpbnQgZHN0T2ZmKQotCQl7Ci0JCQlkc3RbZHN0T2ZmXSA9IChieXRlKUVOQ09ERV9UQUJMRVsoc3JjW3NyY09mZl0gPj4gMikgJiAweDNGXTsKLQkJCWlmIChsZW4gPT0gMykKLQkJCXsKLQkJCQlkc3RbZHN0T2ZmICsgMV0gPQotCQkJCQkoYnl0ZSlFTkNPREVfVEFCTEVbCi0JCQkJCQkoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKLQkJCQlkc3RbZHN0T2ZmICsgMl0gPQotCQkJCQkoYnl0ZSlFTkNPREVfVEFCTEVbCi0JCQkJCQkoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07Ci0JCQkJZHN0W2RzdE9mZiArIDNdID0KLQkJCQkJKGJ5dGUpRU5DT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOwotCQkJfQotCQkJZWxzZSBpZiAobGVuID09IDIpCi0JCQl7Ci0JCQkJZHN0W2RzdE9mZiArIDFdID0KLQkJCQkJKGJ5dGUpRU5DT0RFX1RBQkxFWwotCQkJCQkJKChzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzApIHwgKChzcmNbc3JjT2ZmICsgMV0gPj4gNCkgJiAweDBGKV07Ci0JCQkJZHN0W2RzdE9mZiArIDJdID0KLQkJCQkJKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDXTsKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgZW5jb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworICAgICAgICAgICAgaWYgKGxlbiA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKUVOQ09ERV9UQUJMRVsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQykgfCAoKHNyY1tzcmNPZmYgKyAyXSA+PiA2KSAmIDB4MDMpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgM10gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgzRl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZW4gPT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbCisgICAgICAgICAgICAgICAgICAgICAgICAoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSlFTkNPREVfVEFCTEVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0NdOwogCi0JCQl9Ci0JCQllbHNlCi0JCQl7IC8vIGxlbiA9PSAxKSB7Ci0JCQkJZHN0W2RzdE9mZiArIDFdID0KLQkJCQkJKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOwotCQkJfQotCQl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7IC8vIGxlbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgKGJ5dGUpRU5DT0RFX1RBQkxFWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgaW50W10gREVDT0RFX1RBQkxFID0gewotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLDYyLC0xLC0xLC0xLDYzLAotCQkJNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAsNjEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKLQkJCTE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsCi0JCQk0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCQktMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKLQkJCS0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAotCQkJLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCi0JCX07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGludFtdIERFQ09ERV9UQUJMRSA9IHsKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSw2MiwtMSwtMSwtMSw2MywKKyAgICAgICAgICAgIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksMTAsMTEsMTIsMTMsMTQsCisgICAgICAgICAgICAxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAorICAgICAgICAgICAgNDEsNDIsNDMsNDQsNDUsNDYsNDcsNDgsNDksNTAsNTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICB9OwogCi0JCWludGVybmFsIHN0YXRpYyB2b2lkIGRlY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LAotCQkJCQkJCQkgaW50IGRzdE9mZikKLQkJewotCQkJZHN0W2RzdE9mZl0gPSAoYnl0ZSkKLQkJCQkoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8Ci0JCQkJKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPj4gNCkpOwotCQkJaWYgKGxlbiA+IDIpCi0JCQl7Ci0JCQkJZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpCi0JCQkJCSgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8Ci0JCQkJCShERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdID4+IDIpKTsKLQkJCQlpZiAobGVuID4gMykKLQkJCQl7Ci0JCQkJCWRzdFtkc3RPZmYgKyAyXSA9IChieXRlKQotCQkJCQkJKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwKLQkJCQkJCURFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBkZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpCisgICAgICAgICAgICAgICAgKChERUNPREVfVEFCTEVbc3JjW3NyY09mZl0gJiAweDBGRl0gPDwgMikgfAorICAgICAgICAgICAgICAgIChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdID4+IDQpKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfAorICAgICAgICAgICAgICAgICAgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA+PiAyKSk7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPDwgNikgJiAweEMwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICBERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCX0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKaW5kZXggNTNkYWExZC4uYTRmYWE5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwpAQCAtMjcsMzg4ICsyNywzNjkgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgOiBUUHJvdG9jb2wKLQl7Ci0JCXByb3RlY3RlZCBjb25zdCB1aW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci0JCXByb3RlY3RlZCBjb25zdCB1aW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CisgICAgcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHVpbnQgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKIAotCQlwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOwotCQlwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0JCXByb3RlY3RlZCBpbnQgcmVhZExlbmd0aF87Ci0JCXByb3RlY3RlZCBib29sIGNoZWNrUmVhZExlbmd0aF8gPSBmYWxzZTsKKyAgICAgICAgI3JlZ2lvbiBCaW5hcnlQcm90b2NvbCBGYWN0b3J5CiAKKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFJlYWRfID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOwogCi0JCSNyZWdpb24gQmluYXJ5UHJvdG9jb2wgRmFjdG9yeQotCQkgLyoqCi0JCSAgKiBGYWN0b3J5Ci0JCSAgKi8KLQkJICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQorICAgICAgICAgICAgICAgIDogdGhpcyhmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KIAotCQkJICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOwotCQkJICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKKyAgICAgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgICAgIH0KIAotCQkJICBwdWJsaWMgRmFjdG9yeSgpCi0JCQkJICA6dGhpcyhmYWxzZSwgdHJ1ZSkKLQkJCSAgewotCQkJICB9CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCSAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQotCQkJICB7Ci0JCQkJICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7Ci0JCQkJICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKLQkJCSAgfQorICAgICAgICAjZW5kcmVnaW9uCiAKLQkJCXB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotCQkJICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7Ci0JCQl9Ci0JCSAgfQorICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkjZW5kcmVnaW9uCisgICAgICAgIHB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucywgYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQmluYXJ5UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKLQkJCTogdGhpcyh0cmFucywgZmFsc2UsIHRydWUpCi0JCXsKLQkJfQorICAgICAgICAjcmVnaW9uIFdyaXRlIE1ldGhvZHMKIAotCQlwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKLQkJCTpiYXNlKHRyYW5zKQotCQl7Ci0JCQlzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7Ci0JCQlzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyaWN0V3JpdGVfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8ICh1aW50KShtZXNzYWdlLlR5cGUpOworICAgICAgICAgICAgICAgIFdyaXRlSTMyKChpbnQpdmVyc2lvbik7CisgICAgICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgICAgICBXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbWVzc2FnZS5UeXBlKTsKKyAgICAgICAgICAgICAgICBXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCSNyZWdpb24gV3JpdGUgTWV0aG9kcworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKQotCQl7Ci0JCQlpZiAoc3RyaWN0V3JpdGVfKQotCQkJewotCQkJCXVpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8ICh1aW50KShtZXNzYWdlLlR5cGUpOwotCQkJCVdyaXRlSTMyKChpbnQpdmVyc2lvbik7Ci0JCQkJV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKLQkJCQlXcml0ZUkzMihtZXNzYWdlLlNlcUlEKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOwotCQkJCVdyaXRlQnl0ZSgoYnl0ZSltZXNzYWdlLlR5cGUpOwotCQkJCVdyaXRlSTMyKG1lc3NhZ2UuU2VxSUQpOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1YykKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlKChzYnl0ZSlmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgIFdyaXRlSTE2KGZpZWxkLklEKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpZmllbGQuVHlwZSk7Ci0JCQlXcml0ZUkxNihmaWVsZC5JRCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKVRUeXBlLlN0b3ApOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKW1hcC5LZXlUeXBlKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZSgoc2J5dGUpbWFwLlZhbHVlVHlwZSk7CisgICAgICAgICAgICBXcml0ZUkzMihtYXAuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpVFR5cGUuU3RvcCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpbWFwLktleVR5cGUpOwotCQkJV3JpdGVCeXRlKChieXRlKW1hcC5WYWx1ZVR5cGUpOwotCQkJV3JpdGVJMzIobWFwLkNvdW50KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKWxpc3QuRWxlbWVudFR5cGUpOworICAgICAgICAgICAgV3JpdGVJMzIobGlzdC5Db3VudCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQotCQl7Ci0JCQlXcml0ZUJ5dGUoKGJ5dGUpbGlzdC5FbGVtZW50VHlwZSk7Ci0JCQlXcml0ZUkzMihsaXN0LkNvdW50KTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGUoKHNieXRlKXNldC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICBXcml0ZUkzMihzZXQuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKLQkJewotCQkJV3JpdGVCeXRlKChieXRlKXNldC5FbGVtZW50VHlwZSk7Ci0JCQlXcml0ZUkzMihzZXQuQ291bnQpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZShiID8gKHNieXRlKTEgOiAoc2J5dGUpMCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCi0JCXsKLQkJfQorICAgICAgICBwcml2YXRlIGJ5dGVbXSBib3V0ID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBib3V0WzBdID0gKGJ5dGUpYjsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGJvdXQsIDAsIDEpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKLQkJewotCQkJV3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkxNm91dFswXSA9IChieXRlKSgweGZmICYgKHMgPj4gOCkpOworICAgICAgICAgICAgaTE2b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiBzKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGkxNm91dCwgMCwgMik7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBib3V0ID0gbmV3IGJ5dGVbMV07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIGIpCi0JCXsKLQkJCWJvdXRbMF0gPSBiOwotCQkJdHJhbnMuV3JpdGUoYm91dCwgMCwgMSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gaTMyb3V0ID0gbmV3IGJ5dGVbNF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGkzMm91dFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOworICAgICAgICAgICAgaTMyb3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDE2KSk7CisgICAgICAgICAgICBpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOworICAgICAgICAgICAgaTMyb3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiBpMzIpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTMyb3V0LCAwLCA0KTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgYnl0ZVtdIGkxNm91dCA9IG5ldyBieXRlWzJdOwotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBzKQotCQl7Ci0JCQlpMTZvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChzID4+IDgpKTsKLQkJCWkxNm91dFsxXSA9IChieXRlKSgweGZmICYgcyk7Ci0JCQl0cmFucy5Xcml0ZShpMTZvdXQsIDAsIDIpOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGk2NG91dCA9IG5ldyBieXRlWzhdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgaTY0b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7CisgICAgICAgICAgICBpNjRvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICAgICAgICAgIGk2NG91dFsyXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0MCkpOworICAgICAgICAgICAgaTY0b3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7CisgICAgICAgICAgICBpNjRvdXRbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICAgICAgICAgIGk2NG91dFs1XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAxNikpOworICAgICAgICAgICAgaTY0b3V0WzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKKyAgICAgICAgICAgIGk2NG91dFs3XSA9IChieXRlKSgweGZmICYgaTY0KTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGk2NG91dCwgMCwgOCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKLQkJewotCQkJaTMyb3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyID4+IDI0KSk7Ci0JCQlpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKLQkJCWkzMm91dFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7Ci0JCQlpMzJvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIGkzMik7Ci0JCQl0cmFucy5Xcml0ZShpMzJvdXQsIDAsIDQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBieXRlW10gaTY0b3V0ID0gbmV3IGJ5dGVbOF07Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQotCQl7Ci0JCQlpNjRvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKLQkJCWk2NG91dFsxXSA9IChieXRlKSgweGZmICYgKGk2NCA+PiA0OCkpOwotCQkJaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7Ci0JCQlpNjRvdXRbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKLQkJCWk2NG91dFs0XSA9IChieXRlKSgweGZmICYgKGk2NCA+PiAyNCkpOwotCQkJaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7Ci0JCQlpNjRvdXRbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOwotCQkJaTY0b3V0WzddID0gKGJ5dGUpKDB4ZmYgJiBpNjQpOwotCQkJdHJhbnMuV3JpdGUoaTY0b3V0LCAwLCA4KTsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKQotCQl7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKQorICAgICAgICB7CiAjaWYgIVNJTFZFUkxJR0hUCi0JCQlXcml0ZUk2NChCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCkpOworICAgICAgICAgICAgV3JpdGVJNjQoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpKTsKICNlbHNlCiAgICAgICAgICAgICB2YXIgYnl0ZXMgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXMoZCk7CiAgICAgICAgICAgICBXcml0ZUk2NChCaXRDb252ZXJ0ZXIuVG9JbnQ2NChieXRlcywgMCkpOwogI2VuZGlmCi0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYikKLQkJewotCQkJV3JpdGVJMzIoYi5MZW5ndGgpOwotCQkJdHJhbnMuV3JpdGUoYiwgMCwgYi5MZW5ndGgpOwotCQl9Ci0KLQkJI2VuZHJlZ2lvbgotCi0JCSNyZWdpb24gUmVhZE1ldGhvZHMKLQotCQlwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCi0JCXsKLQkJCVRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKLQkJCWludCBzaXplID0gUmVhZEkzMigpOwotCQkJaWYgKHNpemUgPCAwKQotCQkJewotCQkJCXVpbnQgdmVyc2lvbiA9ICh1aW50KXNpemUgJiBWRVJTSU9OX01BU0s7Ci0JCQkJaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAiICsgdmVyc2lvbik7Ci0JCQkJfQotCQkJCW1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpKHNpemUgJiAweDAwMDAwMGZmKTsKLQkJCQltZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nKCk7Ci0JCQkJbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoc3RyaWN0UmVhZF8pCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOwotCQkJCX0KLQkJCQltZXNzYWdlLk5hbWUgPSBSZWFkU3RyaW5nQm9keShzaXplKTsKLQkJCQltZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRCeXRlKCk7Ci0JCQkJbWVzc2FnZS5TZXFJRCA9IFJlYWRJMzIoKTsKLQkJCX0KLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQotCQl7Ci0JCQlyZXR1cm4gbmV3IFRTdHJ1Y3QoKTsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKLQkJewotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOwotCQkJZmllbGQuVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCi0JCQlpZiAoZmllbGQuVHlwZSAhPSBUVHlwZS5TdG9wKQotCQkJewotCQkJCWZpZWxkLklEID0gUmVhZEkxNigpOwotCQkJfQotCi0JCQlyZXR1cm4gZmllbGQ7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQotCQl7Ci0JCQlUTWFwIG1hcCA9IG5ldyBUTWFwKCk7Ci0JCQltYXAuS2V5VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbWFwLlZhbHVlVHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbWFwLkNvdW50ID0gUmVhZEkzMigpOwotCi0JCQlyZXR1cm4gbWFwOwotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKLQkJewotCQkJVExpc3QgbGlzdCA9IG5ldyBUTGlzdCgpOwotCQkJbGlzdC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJbGlzdC5Db3VudCA9IFJlYWRJMzIoKTsKLQotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkTGlzdEVuZCgpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCi0JCXsKLQkJCVRTZXQgc2V0ID0gbmV3IFRTZXQoKTsKLQkJCXNldC5FbGVtZW50VHlwZSA9IChUVHlwZSlSZWFkQnl0ZSgpOwotCQkJc2V0LkNvdW50ID0gUmVhZEkzMigpOwotCi0JCQlyZXR1cm4gc2V0OwotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKLQkJewotCQkJcmV0dXJuIFJlYWRCeXRlKCkgPT0gMTsKLQkJfQotCi0JCXByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOwotCQlwdWJsaWMgb3ZlcnJpZGUgYnl0ZSBSZWFkQnl0ZSgpCi0JCXsKLQkJCVJlYWRBbGwoYmluLCAwLCAxKTsKLQkJCXJldHVybiBiaW5bMF07Ci0JCX0KLQotCQlwcml2YXRlIGJ5dGVbXSBpMTZpbiA9IG5ldyBieXRlWzJdOwotCQlwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCi0JCXsKLQkJCVJlYWRBbGwoaTE2aW4sIDAsIDIpOwotCQkJcmV0dXJuIChzaG9ydCkoKChpMTZpblswXSAmIDB4ZmYpIDw8IDgpIHwgKChpMTZpblsxXSAmIDB4ZmYpKSk7Ci0JCX0KLQotCQlwcml2YXRlIGJ5dGVbXSBpMzJpbiA9IG5ldyBieXRlWzRdOwotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQotCQl7Ci0JCQlSZWFkQWxsKGkzMmluLCAwLCA0KTsKLQkJCXJldHVybiAoaW50KSgoKGkzMmluWzBdICYgMHhmZikgPDwgMjQpIHwgKChpMzJpblsxXSAmIDB4ZmYpIDw8IDE2KSB8ICgoaTMyaW5bMl0gJiAweGZmKSA8PCA4KSB8ICgoaTMyaW5bM10gJiAweGZmKSkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBieXRlW10gaTY0aW4gPSBuZXcgYnl0ZVs4XTsKLQkJcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCi0JCXsKLQkJCVJlYWRBbGwoaTY0aW4sIDAsIDgpOwotICAgICAgICAgICAgcmV0dXJuIChsb25nKSgKLSAgICAgICAgICAgICAgICAodWxvbmcpKCh1bG9uZykoaTY0aW5bMF0gJiAweGZmKSA8PCA1NikgfAotICAgICAgICAgICAgICAgICh1bG9uZykoKHVsb25nKShpNjRpblsxXSAmIDB4ZmYpIDw8IDQ4KSB8Ci0gICAgICAgICAgICAgICAgKHVsb25nKSgodWxvbmcpKGk2NGluWzJdICYgMHhmZikgPDwgNDApIHwKLSAgICAgICAgICAgICAgICAodWxvbmcpKCh1bG9uZykoaTY0aW5bM10gJiAweGZmKSA8PCAzMikgfAotICAgICAgICAgICAgICAgICh1bG9uZykoKHVsb25nKShpNjRpbls0XSAmIDB4ZmYpIDw8IDI0KSB8Ci0gICAgICAgICAgICAgICAgKHVsb25nKSgodWxvbmcpKGk2NGluWzVdICYgMHhmZikgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAodWxvbmcpKCh1bG9uZykoaTY0aW5bNl0gJiAweGZmKSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgKHVsb25nKSgodWxvbmcpKGk2NGluWzddICYgMHhmZikpKTsKICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCi0JCXsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSTMyKGIuTGVuZ3RoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGIsIDAsIGIuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IFJlYWRJMzIoKTsKKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50IHZlcnNpb24gPSAodWludClzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogIiArIHZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKShzaXplICYgMHgwMDAwMDBmZik7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmljdFJlYWRfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gUmVhZFN0cmluZ0JvZHkoc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSlSZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRGaWVsZCBSZWFkRmllbGRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IG5ldyBURmllbGQoKTsKKyAgICAgICAgICAgIGZpZWxkLlR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgIT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaWVsZC5JRCA9IFJlYWRJMTYoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIG1hcC5WYWx1ZVR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIG1hcC5Db3VudCA9IFJlYWRJMzIoKTsKKworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QoKTsKKyAgICAgICAgICAgIGxpc3QuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGxpc3QuQ291bnQgPSBSZWFkSTMyKCk7CisKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUU2V0IHNldCA9IG5ldyBUU2V0KCk7CisgICAgICAgICAgICBzZXQuRWxlbWVudFR5cGUgPSAoVFR5cGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IFJlYWRJMzIoKTsKKworICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWFkQnl0ZSgpID09IDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBiaW4gPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEFsbChiaW4sIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSliaW5bMF07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMTZpbiA9IG5ldyBieXRlWzJdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRBbGwoaTE2aW4sIDAsIDIpOworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkoKChpMTZpblswXSAmIDB4ZmYpIDw8IDgpIHwgKChpMTZpblsxXSAmIDB4ZmYpKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBpMzJpbiA9IG5ldyBieXRlWzRdOworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWRJMzIoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGkzMmluLCAwLCA0KTsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSgoKGkzMmluWzBdICYgMHhmZikgPDwgMjQpIHwgKChpMzJpblsxXSAmIDB4ZmYpIDw8IDE2KSB8ICgoaTMyaW5bMl0gJiAweGZmKSA8PCA4KSB8ICgoaTMyaW5bM10gJiAweGZmKSkpOworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDY3NQorCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGk2NGluID0gbmV3IGJ5dGVbOF07CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQWxsKGk2NGluLCAwLCA4KTsKKyAgICAgICAgICAgIHVuY2hlY2tlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAobG9uZykoCisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMF0gJiAweGZmKSA8PCA1NikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblsyXSAmIDB4ZmYpIDw8IDQwKSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bM10gJiAweGZmKSA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls1XSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bN10gJiAweGZmKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDY3NQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpCisgICAgICAgIHsKICNpZiAhU0lMVkVSTElHSFQKLQkJCXJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoUmVhZEk2NCgpKTsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoUmVhZEk2NCgpKTsKICNlbHNlCiAgICAgICAgICAgICB2YXIgdmFsdWUgPSBSZWFkSTY0KCk7CiAgICAgICAgICAgICB2YXIgYnl0ZXMgPSBCaXRDb252ZXJ0ZXIuR2V0Qnl0ZXModmFsdWUpOwogICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub0RvdWJsZShieXRlcywgMCk7CiAjZW5kaWYKLQkJfQorICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgU2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkKLQkJewotCQkJcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwotCQkJY2hlY2tSZWFkTGVuZ3RoXyA9IHRydWU7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSBSZWFkSTMyKCk7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRTdHJpbmdCb2R5KGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQogCi0JCXByb3RlY3RlZCB2b2lkIENoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKQotCQl7Ci0JCQlpZiAoY2hlY2tSZWFkTGVuZ3RoXykKLQkJCXsKLQkJCQlyZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0JCQkJaWYgKHJlYWRMZW5ndGhfIDwgMCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnMuUmVhZEFsbChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCi0JCXsKLQkJCWludCBzaXplID0gUmVhZEkzMigpOwotCQkJQ2hlY2tSZWFkTGVuZ3RoKHNpemUpOwotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwotCQkJdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOwotCQkJcmV0dXJuIGJ1ZjsKLQkJfQotCQlwcml2YXRlICBzdHJpbmcgUmVhZFN0cmluZ0JvZHkoaW50IHNpemUpCi0JCXsKLQkJCUNoZWNrUmVhZExlbmd0aChzaXplKTsKLQkJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKLQkJCXJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlDaGVja1JlYWRMZW5ndGgobGVuKTsKLQkJCXJldHVybiB0cmFucy5SZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0KLQkJI2VuZHJlZ2lvbgotCX0KKyAgICAgICAgI2VuZHJlZ2lvbgorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCmluZGV4IGE1Y2RmOWQuLmZmNjczOTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcwpAQCAtMTksODMyICsxOSw4MzEgQEAKICAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCiAgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgogICogZGV0YWlscy4KLSAqLw0KLQ0KLXVzaW5nIFN5c3RlbTsNCi11c2luZyBTeXN0ZW0uVGV4dDsNCi11c2luZyBUaHJpZnQuVHJhbnNwb3J0Ow0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsNCi11c2luZyBTeXN0ZW0uSU87DQotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7DQotDQotbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbA0KLXsNCi0gICAgcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBUUHJvdG9jb2wNCi0gICAgew0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOw0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVEZpZWxkIFRTVE9QID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU3RvcCwgKHNob3J0KTApOw0KLQ0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHR0eXBlVG9Db21wYWN0VHlwZSA9IG5ldyBieXRlWzE2XTsNCi0NCi0gICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBQUk9UT0NPTF9JRCA9IDB4ODI7DQotICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVkVSU0lPTiA9IDE7DQotICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVkVSU0lPTl9NQVNLID0gMHgxZjsgLy8gMDAwMSAxMTExDQotICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9NQVNLID0gMHhFMDsgLy8gMTExMCAwMDAwDQotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogQWxsIG9mIHRoZSBvbi13aXJlIHR5cGUgY29kZXMuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTVE9QID0gMHgwMDsNCi0gICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCT09MRUFOX1RSVUUgPSAweDAxOw0KLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJPT0xFQU5fRkFMU0UgPSAweDAyOw0KLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJZVEUgPSAweDAzOw0KLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkxNiA9IDB4MDQ7DQotICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTMyID0gMHgwNTsNCi0gICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJNjQgPSAweDA2Ow0KLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIERPVUJMRSA9IDB4MDc7DQotICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQklOQVJZID0gMHgwODsNCi0gICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBMSVNUID0gMHgwOTsNCi0gICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTRVQgPSAweDBBOw0KLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIE1BUCA9IDB4MEI7DQotICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RSVUNUID0gMHgwQzsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKLSAgICAgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIFN0YWNrPHNob3J0PiBsYXN0RmllbGRfID0gbmV3IFN0YWNrPHNob3J0PigxNSk7DQotDQotICAgICAgICBwcml2YXRlIHNob3J0IGxhc3RGaWVsZElkXyA9IDA7DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuIAotICAgICAgICAgKiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxURmllbGQ+IGJvb2xlYW5GaWVsZF87DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuIAotICAgICAgICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlICBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOw0KLQ0KLQ0KLSAgICAgICAgI3JlZ2lvbiBDb21wYWN0UHJvdG9jb2wgRmFjdG9yeQ0KLQ0KLSAgICAgICAgLyoqCi0JCSAgKiBGYWN0b3J5Ci0JCSAgKi8NCi0gICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeyB9DQotDQotICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQ0KLSAgICAgICAgICAgIDogYmFzZSh0cmFucykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TdG9wXSA9IFR5cGVzLlNUT1A7DQotICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuQm9vbF0gPSBUeXBlcy5CT09MRUFOX1RSVUU7DQotICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuQnl0ZV0gPSBUeXBlcy5CWVRFOw0KLSAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7DQotICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuSTMyXSA9IFR5cGVzLkkzMjsNCi0gICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5JNjRdID0gVHlwZXMuSTY0Ow0KLSAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkRvdWJsZV0gPSBUeXBlcy5ET1VCTEU7DQotICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU3RyaW5nXSA9IFR5cGVzLkJJTkFSWTsNCi0gICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5MaXN0XSA9IFR5cGVzLkxJU1Q7DQotICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuU2V0XSA9IFR5cGVzLlNFVDsNCi0gICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5NYXBdID0gVHlwZXMuTUFQOw0KLSAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TVFJVQ1Q7DQotICAgICAgICB9DQotDQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgbGFzdEZpZWxkXy5DbGVhcigpOw0KLSAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7DQotICAgICAgICB9DQotDQotICAgICAgICAjcmVnaW9uIFdyaXRlIE1ldGhvZHMNCi0NCi0NCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuIAotICAgICAgICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsNCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUJ5dGVEaXJlY3QoYnl0ZSBiKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOw0KLSAgICAgICAgICAgIHRyYW5zLldyaXRlKGJ5dGVEaXJlY3RCdWZmZXIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGludCBuKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgotICAgICAgICAgKiBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIFdyaXRlVmFyaW50NjQ/Ci0gICAgICAgICAqLw0KLSAgICAgICAgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzVdOw0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFyaW50MzIodWludCBuKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBpZHggPSAwOw0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgaWYgKChuICYgfjB4N0YpID09IDApDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSluOw0KLSAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGVCeXRlRGlyZWN0KChieXRlKW4pOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm47DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBpMzJidWZbaWR4KytdID0gKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKTsNCi0gICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsNCi0gICAgICAgICAgICAgICAgICAgIG4gPj49IDc7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTMyYnVmLCAwLCBpZHgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQotICAgICAgICAqIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgotICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoUFJPVE9DT0xfSUQpOw0KLSAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKCgoKHVpbnQpbWVzc2FnZS5UeXBlKSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKSk7DQotICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludCltZXNzYWdlLlNlcUlEKTsNCi0gICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSAKLSAgICAgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCi0gICAgICAgICAqIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJjdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsNCi0gICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCi0gICAgICAgICAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgotICAgICAgICAgKiBvZiB0aGUgZmllbGQgc3RhY2suCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8uUG9wKCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQotICAgICAgICAgKiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksCi0gICAgICAgICAqIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKLSAgICAgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0Lg0KLSAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfID0gZmllbGQ7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAweEZGKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgCi0gICAgICAgICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIAotICAgICAgICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlRmllbGRCZWdpbkludGVybmFsKFRGaWVsZCBmaWVsZCwgYnl0ZSB0eXBlT3ZlcnJpZGUpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5Qb3AoKTsNCi0NCi0gICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuDQotICAgICAgICAgICAgYnl0ZSB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gZ2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7DQotDQotICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkDQotICAgICAgICAgICAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfICYmIGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfIDw9IDE1KQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcg0KLSAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSA8PCA0IHwgdHlwZVRvV3JpdGUpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlDQotICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSk7DQotICAgICAgICAgICAgICAgIFdyaXRlSTE2KGZpZWxkLklEKTsNCi0gICAgICAgICAgICB9DQotDQotICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuSUQ7DQotICAgICAgICAgICAgLy8gbGFzdEZpZWxkXy5wdXNoKGZpZWxkLmlkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZFN0b3AoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChUeXBlcy5TVE9QKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZSAKLSAgICAgICAgICogaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KDApOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KW1hcC5Db3VudCk7DQotICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChnZXRDb21wYWN0VHlwZShtYXAuS2V5VHlwZSkgPDwgNCB8IGdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICB9DQotDQotICAgICAgICAvKiogCi0gICAgICAgICAqIFdyaXRlIGEgbGlzdCBoZWFkZXIuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihsaXN0LkVsZW1lbnRUeXBlLCBsaXN0LkNvdW50KTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHNldCBoZWFkZXIuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluIAotICAgICAgICAgKiB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQotICAgICAgICAgKiByaWdodCB0eXBlIGhlYWRlciBpcyBmb3IgdGhlIHZhbHVlIGFuZCB0aGVuIFdyaXRlIHRoZSBmaWVsZCBoZWFkZXIuIAotICAgICAgICAgKiBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKEJvb2xlYW4gYikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoYm9vbGVhbkZpZWxkXyAhPSBudWxsKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0DQotICAgICAgICAgICAgICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGJvb2xlYW5GaWVsZF8uVmFsdWUsIGIgPyBUeXBlcy5CT09MRUFOX1RSVUUgOiBUeXBlcy5CT09MRUFOX0ZBTFNFKTsNCi0gICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IG51bGw7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLg0KLSAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoYiA/IFR5cGVzLkJPT0xFQU5fVFJVRSA6IFR5cGVzLkJPT0xFQU5fRkFMU0UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIGIpDQotICAgICAgICB7DQotICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KGIpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoaW50VG9aaWdaYWcoaTE2KSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoaW50VG9aaWdaYWcoaTMyKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBXcml0ZVZhcmludDY0KGxvbmdUb1ppZ3phZyhpNjQpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkdWIpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9Ow0KLSAgICAgICAgICAgIGZpeGVkTG9uZ1RvQnl0ZXMoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGR1YiksIGRhdGEsIDApOw0KLSAgICAgICAgICAgIHRyYW5zLldyaXRlKGRhdGEpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoU3RyaW5nIHN0cikNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBVVEY4RW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdHIpOw0KLSAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLiAKLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJpbiwgMCwgYmluLkxlbmd0aCk7DQotICAgICAgICB9DQotDQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KWxlbmd0aCk7DQotICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnVmLCBvZmZzZXQsIGxlbmd0aCk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlIA0KLSAgICAgICAgLy8gb3V0cHV0IG9yIHB1cnBvc2UuDQotICAgICAgICAvLyANCi0NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpIHsgfQ0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKSB7IH0NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpIHsgfQ0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRFbmQoKSB7IH0NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKSB7IH0NCi0NCi0gICAgICAgIC8vDQotICAgICAgICAvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMNCi0gICAgICAgIC8vDQotDQotICAgICAgICAvKioKLSAgICAgICAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbiAKLSAgICAgICAgICogdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgotICAgICAgICAgKi8NCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIFdyaXRlQ29sbGVjdGlvbkJlZ2luKFRUeXBlIGVsZW1UeXBlLCBpbnQgc2l6ZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpZiAoc2l6ZSA8PSAxNCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChzaXplIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7DQotICAgICAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoKHVpbnQpc2l6ZSk7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgotICAgICAgICAgKi8NCi0gICAgICAgIGJ5dGVbXSB2YXJpbnQ2NG91dCA9IG5ldyBieXRlWzEwXTsNCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDY0KHVsb25nIG4pDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IGlkeCA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKHRydWUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBpZiAoKG4gJiB+KHVsb25nKTB4N0ZMKSA9PSAwKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoYnl0ZSluOw0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7DQotICAgICAgICAgICAgICAgICAgICBuID4+PSA3Ow0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHRyYW5zLldyaXRlKHZhcmludDY0b3V0LCAwLCBpZHgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUgCi0gICAgICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIHVsb25nIGxvbmdUb1ppZ3phZyhsb25nIG4pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICh1bG9uZykoKCh1bG9uZyluIDw8IDEpIF4gKCh1bG9uZyluID4+IDYzKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAotICAgICAgICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSB1aW50IGludFRvWmlnWmFnKGludCBuKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAodWludCkoKCh1aW50KW4gPDwgMSkgXiAoKHVpbnQpbiA+PiAzMSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZyAKLSAgICAgICAgICogdW50aWwgb2ZmKzcuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ1ZltvZmYgKyAwXSA9IChieXRlKShuICYgMHhmZik7DQotICAgICAgICAgICAgYnVmW29mZiArIDFdID0gKGJ5dGUpKChuID4+IDgpICYgMHhmZik7DQotICAgICAgICAgICAgYnVmW29mZiArIDJdID0gKGJ5dGUpKChuID4+IDE2KSAmIDB4ZmYpOw0KLSAgICAgICAgICAgIGJ1ZltvZmYgKyAzXSA9IChieXRlKSgobiA+PiAyNCkgJiAweGZmKTsNCi0gICAgICAgICAgICBidWZbb2ZmICsgNF0gPSAoYnl0ZSkoKG4gPj4gMzIpICYgMHhmZik7DQotICAgICAgICAgICAgYnVmW29mZiArIDVdID0gKGJ5dGUpKChuID4+IDQwKSAmIDB4ZmYpOw0KLSAgICAgICAgICAgIGJ1ZltvZmYgKyA2XSA9IChieXRlKSgobiA+PiA0OCkgJiAweGZmKTsNCi0gICAgICAgICAgICBidWZbb2ZmICsgN10gPSAoYnl0ZSkoKG4gPj4gNTYpICYgMHhmZik7DQotICAgICAgICB9DQotDQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICAjcmVnaW9uIFJlYWRNZXRob2RzDQotDQotICAgICAgICAvKioKLSAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLiAKLSAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnl0ZSBwcm90b2NvbElkID0gUmVhZEJ5dGUoKTsNCi0gICAgICAgICAgICBpZiAocHJvdG9jb2xJZCAhPSBQUk9UT0NPTF9JRCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIHByb3RvY29sIGlkICIgKyBQUk9UT0NPTF9JRC5Ub1N0cmluZygiWCIpICsgIiBidXQgZ290ICIgKyBwcm90b2NvbElkLlRvU3RyaW5nKCJYIikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBieXRlIHZlcnNpb25BbmRUeXBlID0gUmVhZEJ5dGUoKTsNCi0gICAgICAgICAgICBieXRlIHZlcnNpb24gPSAoYnl0ZSkodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOw0KLSAgICAgICAgICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT04pDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCB2ZXJzaW9uICIgKyBWRVJTSU9OICsgIiBidXQgZ290ICIgKyB2ZXJzaW9uKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiAweDAzKTsNCi0gICAgICAgICAgICBpbnQgc2VxaWQgPSAoaW50KVJlYWRWYXJpbnQzMigpOw0KLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IFJlYWRTdHJpbmcoKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKXR5cGUsIHNlcWlkKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKLSAgICAgICAgICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7DQotICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gMDsNCi0gICAgICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvciAKLSAgICAgICAgICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4NCi0gICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLlBvcCgpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiAKLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBieXRlIHR5cGUgPSBSZWFkQnl0ZSgpOw0KLQ0KLSAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4NCi0gICAgICAgICAgICBpZiAodHlwZSA9PSBUeXBlcy5TVE9QKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRTVE9QOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBzaG9ydCBmaWVsZElkOw0KLQ0KLSAgICAgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4NCi0gICAgICAgICAgICBzaG9ydCBtb2RpZmllciA9IChzaG9ydCkoKHR5cGUgJiAweGYwKSA+PiA0KTsNCi0gICAgICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4NCi0gICAgICAgICAgICAgICAgZmllbGRJZCA9IFJlYWRJMTYoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4NCi0gICAgICAgICAgICAgICAgZmllbGRJZCA9IChzaG9ydCkobGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOw0KLSAgICAgICAgICAgIH0NCi0NCi0gICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCIiLCBnZXRUVHlwZSgoYnl0ZSkodHlwZSAmIDB4MGYpKSwgZmllbGRJZCk7DQotDQotICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUNCi0gICAgICAgICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLg0KLSAgICAgICAgICAgICAgICBib29sVmFsdWVfID0gKGJ5dGUpKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2U7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLg0KLSAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLklEOw0KLSAgICAgICAgICAgIHJldHVybiBmaWVsZDsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQotICAgICAgICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQotICAgICAgICAgKiAiY29ycmVjdCIgdHlwZXMuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpUmVhZFZhcmludDMyKCk7DQotICAgICAgICAgICAgYnl0ZSBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAoYnl0ZSkwIDogUmVhZEJ5dGUoKTsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKSwgc2l6ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAotICAgICAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKLSAgICAgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICAgICAgICAgKiB0cnVlIHNpemUuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGJ5dGUgc2l6ZV9hbmRfdHlwZSA9IFJlYWRCeXRlKCk7DQotICAgICAgICAgICAgaW50IHNpemUgPSAoc2l6ZV9hbmRfdHlwZSA+PiA0KSAmIDB4MGY7DQotICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBzaXplID0gKGludClSZWFkVmFyaW50MzIoKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgVFR5cGUgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOw0KLSAgICAgICAgICAgIHJldHVybiBuZXcgVExpc3QodHlwZSwgc2l6ZSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbCAKLSAgICAgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKLSAgICAgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICAgICAgICAgKiB0cnVlIHNpemUuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gbmV3IFRTZXQoUmVhZExpc3RCZWdpbigpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCi0gICAgICAgICAqIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCi0gICAgICAgICAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEJvb2xlYW4gUmVhZEJvb2woKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChib29sVmFsdWVfICE9IG51bGwpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBib29sIHJlc3VsdCA9IGJvb2xWYWx1ZV8uVmFsdWU7DQotICAgICAgICAgICAgICAgIGJvb2xWYWx1ZV8gPSBudWxsOw0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ow0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICByZXR1cm4gUmVhZEJ5dGUoKSA9PSBUeXBlcy5CT09MRUFOX1RSVUU7DQotICAgICAgICB9DQotDQotICAgICAgICBieXRlW10gYnl0ZVJhd0J1ZiA9IG5ldyBieXRlWzFdOw0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZSBSZWFkQnl0ZSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChieXRlUmF3QnVmLCAwLCAxKTsNCi0gICAgICAgICAgICByZXR1cm4gYnl0ZVJhd0J1ZlswXTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovDQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2hvcnQgUmVhZEkxNigpDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChzaG9ydCl6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gemlnemFnVG9JbnQoUmVhZFZhcmludDMyKCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiB6aWd6YWdUb0xvbmcoUmVhZFZhcmludDY0KCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IFJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgotICAgICAgICAgKi8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBkb3VibGUgUmVhZERvdWJsZSgpDQotICAgICAgICB7DQotICAgICAgICAgICAgYnl0ZVtdIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07DQotICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChsb25nQml0cywgMCwgOCk7DQotICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShieXRlc1RvTG9uZyhsb25nQml0cykpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIFN0cmluZyBSZWFkU3RyaW5nKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsNCi0NCi0gICAgICAgICAgICBpZiAobGVuZ3RoID09IDApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5VVEY4LkdldFN0cmluZyhSZWFkQmluYXJ5KGxlbmd0aCkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4gCi0gICAgICAgICAqLw0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsNCi0gICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsNCi0NCi0gICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsNCi0gICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsNCi0gICAgICAgICAgICByZXR1cm4gYnVmOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBieXRlW10gb2YgYSBrbm93biBsZW5ndGggZnJvbSB0aGUgd2lyZS4gCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEJpbmFyeShpbnQgbGVuZ3RoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBieXRlWzBdOw0KLQ0KLSAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOw0KLSAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOw0KLSAgICAgICAgICAgIHJldHVybiBidWY7DQotICAgICAgICB9DQotDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZSANCi0gICAgICAgIC8vIGVuY29kaW5nLg0KLSAgICAgICAgLy8NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkgeyB9DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKSB7IH0NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKSB7IH0NCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRMaXN0RW5kKCkgeyB9DQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkgeyB9DQotDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzDQotICAgICAgICAvLw0KLQ0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAotICAgICAgICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSB1aW50IFJlYWRWYXJpbnQzMigpDQotICAgICAgICB7DQotICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOw0KLSAgICAgICAgICAgIGludCBzaGlmdCA9IDA7DQotICAgICAgICAgICAgd2hpbGUgKHRydWUpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBieXRlIGIgPSBSZWFkQnl0ZSgpOw0KLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVpbnQpKGIgJiAweDdmKSA8PCBzaGlmdDsNCi0gICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7DQotICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7DQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldCAKLSAgICAgICAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIHVsb25nIFJlYWRWYXJpbnQ2NCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgaW50IHNoaWZ0ID0gMDsNCi0gICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOw0KLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQ0KLSAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgYnl0ZSBiID0gUmVhZEJ5dGUoKTsNCi0gICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykoYiAmIDB4N2YpIDw8IHNoaWZ0Ow0KLSAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSBicmVhazsNCi0gICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsNCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICBwdWJsaWMgY2xhc3MgVENvbXBhY3RQcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHR0eXBlVG9Db21wYWN0VHlwZSA9IG5ldyBieXRlWzE2XTsKKworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgUFJPVE9DT0xfSUQgPSAweDgyOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVkVSU0lPTiA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFRZUEVfTUFTSyA9IDB4RTA7IC8vIDExMTAgMDAwMAorICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVFlQRV9CSVRTID0gMHgwNzsgLy8gMDAwMCAwMTExCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RPUCA9IDB4MDA7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCT09MRUFOX1RSVUUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQk9PTEVBTl9GQUxTRSA9IDB4MDI7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCWVRFID0gMHgwMzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkxNiA9IDB4MDQ7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJMzIgPSAweDA1OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTY0ID0gMHgwNjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIERPVUJMRSA9IDB4MDc7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBCSU5BUlkgPSAweDA4OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgTElTVCA9IDB4MDk7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTRVQgPSAweDBBOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgTUFQID0gMHgwQjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNUUlVDVCA9IDB4MEM7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgICAgICAvLy8gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBTdGFjazxzaG9ydD4gbGFzdEZpZWxkXyA9IG5ldyBTdGFjazxzaG9ydD4oMTUpOworCisgICAgICAgIHByaXZhdGUgc2hvcnQgbGFzdEZpZWxkSWRfID0gMDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgICAgICAgLy8vIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxURmllbGQ+IGJvb2xlYW5GaWVsZF87CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSWYgd2UgUmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisgICAgICAgIC8vLyB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxCb29sZWFuPiBib29sVmFsdWVfOworCisKKyAgICAgICAgI3JlZ2lvbiBDb21wYWN0UHJvdG9jb2wgRmFjdG9yeQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeSgpIHsgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKICAgICAgICAgICAgIH0KLQkJCQ0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7DQotICAgICAgICB9DQotDQotICAgICAgICAjZW5kcmVnaW9uDQotDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gZW5jb2RpbmcgaGVscGVycw0KLSAgICAgICAgLy8NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGludCB0byBpbnQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBpbnQgemlnemFnVG9JbnQodWludCBuKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAoaW50KShuID4+IDEpIF4gKC0oaW50KShuICYgMSkpOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KLSAgICAgICAgICovDQotICAgICAgICBwcml2YXRlIGxvbmcgemlnemFnVG9Mb25nKHVsb25nIG4pDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuIChsb25nKShuID4+IDEpIF4gKC0obG9uZykobiAmIDEpKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywgCi0gICAgICAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCi0gICAgICAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCi0gICAgICAgICAqLw0KLSAgICAgICAgcHJpdmF0ZSBsb25nIGJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4NCi0gICAgICAgICAgICAgICgoYnl0ZXNbN10gJiAweGZmTCkgPDwgNTYpIHwNCi0gICAgICAgICAgICAgICgoYnl0ZXNbNl0gJiAweGZmTCkgPDwgNDgpIHwNCi0gICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwNCi0gICAgICAgICAgICAgICgoYnl0ZXNbNF0gJiAweGZmTCkgPDwgMzIpIHwNCi0gICAgICAgICAgICAgICgoYnl0ZXNbM10gJiAweGZmTCkgPDwgMjQpIHwNCi0gICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwNCi0gICAgICAgICAgICAgICgoYnl0ZXNbMV0gJiAweGZmTCkgPDwgOCkgfA0KLSAgICAgICAgICAgICAgKChieXRlc1swXSAmIDB4ZmZMKSk7DQotICAgICAgICB9DQotDQotICAgICAgICAvLw0KLSAgICAgICAgLy8gdHlwZSB0ZXN0aW5nIGFuZCBjb252ZXJ0aW5nDQotICAgICAgICAvLw0KLQ0KLSAgICAgICAgcHJpdmF0ZSBCb29sZWFuIGlzQm9vbFR5cGUoYnl0ZSBiKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBmOw0KLSAgICAgICAgICAgIHJldHVybiBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgfHwgbG93ZXJOaWJibGUgPT0gVHlwZXMuQk9PTEVBTl9GQUxTRTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgCi0gICAgICAgICAqIFRUeXBlIHZhbHVlLgotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgVFR5cGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpKHR5cGUgJiAweDBmKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU1RPUDoNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdG9wOw0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJPT0xFQU5fRkFMU0U6DQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQk9PTEVBTl9UUlVFOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7DQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQllURToNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5CeXRlOw0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5JMTY7DQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuSTMyOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsNCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5JNjQ6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuSTY0Ow0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRPVUJMRToNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5Eb3VibGU7DQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQklOQVJZOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsNCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5MSVNUOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkxpc3Q7DQotICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU0VUOg0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlNldDsNCi0gICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5NQVA6DQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOw0KLSAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNUUlVDVDoNCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdHJ1Y3Q7DQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJkb24ndCBrbm93IHdoYXQgdHlwZTogIiArIChieXRlKSh0eXBlICYgMHgwZikpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0NCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgotICAgICAgICAgKi8NCi0gICAgICAgIHByaXZhdGUgYnl0ZSBnZXRDb21wYWN0VHlwZShUVHlwZSB0dHlwZSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICByZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpdHR5cGVdOw0KLSAgICAgICAgfQ0KLSAgICB9DQorICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgIHB1YmxpYyBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0b3BdID0gVHlwZXMuU1RPUDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkJvb2xdID0gVHlwZXMuQk9PTEVBTl9UUlVFOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuQnl0ZV0gPSBUeXBlcy5CWVRFOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuSTE2XSA9IFR5cGVzLkkxNjsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLkkzMl0gPSBUeXBlcy5JMzI7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5JNjRdID0gVHlwZXMuSTY0OworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuRG91YmxlXSA9IFR5cGVzLkRPVUJMRTsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0cmluZ10gPSBUeXBlcy5CSU5BUlk7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5MaXN0XSA9IFR5cGVzLkxJU1Q7CisgICAgICAgICAgICB0dHlwZVRvQ29tcGFjdFR5cGVbKGludClUVHlwZS5TZXRdID0gVHlwZXMuU0VUOworICAgICAgICAgICAgdHR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpVFR5cGUuTWFwXSA9IFR5cGVzLk1BUDsKKyAgICAgICAgICAgIHR0eXBlVG9Db21wYWN0VHlwZVsoaW50KVRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TVFJVQ1Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxhc3RGaWVsZF8uQ2xlYXIoKTsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAjcmVnaW9uIFdyaXRlIE1ldGhvZHMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZURpcmVjdEJ1ZmZlclswXSA9IGI7CisgICAgICAgICAgICB0cmFucy5Xcml0ZShieXRlRGlyZWN0QnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGludCBuKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAvLy8gVE9ETzogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSBXcml0ZVZhcmludDY0PworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNV07CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFyaW50MzIodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKW47CisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyYnVmW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZShpMzJidWYsIDAsIGlkeCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisgICAgICAgIC8vLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KFBST1RPQ09MX0lEKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKFZFUlNJT04gJiBWRVJTSU9OX01BU0spIHwgKCgoKHVpbnQpbWVzc2FnZS5UeXBlKSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKSk7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KW1lc3NhZ2UuU2VxSUQpOworICAgICAgICAgICAgV3JpdGVTdHJpbmcobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQorICAgICAgICAvLy8gdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICAgIC8vLyBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cmN0KQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICAgICAgICAvLy8gdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgICAgICAgIC8vLyBvZiB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUKKyAgICAgICAgLy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICgmbHQ7IDE1KSwKKyAgICAgICAgLy8vIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUKKyAgICAgICAgLy8vIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLkJvb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgICAgICAgICAgICAgICBib29sZWFuRmllbGRfID0gZmllbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQsIDB4RkYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKKyAgICAgICAgLy8vICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgICAgICAgIC8vLyBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLlBvcCgpOworCisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgICAgICAgICAgICBieXRlIHR5cGVUb1dyaXRlID0gdHlwZU92ZXJyaWRlID09IDB4RkYgPyBnZXRDb21wYWN0VHlwZShmaWVsZC5UeXBlKSA6IHR5cGVPdmVycmlkZTsKKworICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgICAgICBpZiAoZmllbGQuSUQgPiBsYXN0RmllbGRJZF8gJiYgZmllbGQuSUQgLSBsYXN0RmllbGRJZF8gPD0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoZmllbGQuSUQgLSBsYXN0RmllbGRJZF8pIDw8IDQgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgV3JpdGVJMTYoZmllbGQuSUQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5JRDsKKyAgICAgICAgICAgIC8vIGxhc3RGaWVsZF8ucHVzaChmaWVsZC5pZCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KFR5cGVzLlNUT1ApOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgICAgLy8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KW1hcC5Db3VudCk7CisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KGdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4obGlzdC5FbGVtZW50VHlwZSwgbGlzdC5Db3VudCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHNldCBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKHNldC5FbGVtZW50VHlwZSwgc2V0LkNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAgICAvLy8gd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKKyAgICAgICAgLy8vIHJpZ2h0IHR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgICAgLy8vIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKEJvb2xlYW4gYikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJvb2xlYW5GaWVsZF8gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgICAgICAgICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChib29sZWFuRmllbGRfLlZhbHVlLCBiID8gVHlwZXMuQk9PTEVBTl9UUlVFIDogVHlwZXMuQk9PTEVBTl9GQUxTRSk7CisgICAgICAgICAgICAgICAgYm9vbGVhbkZpZWxkXyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KGIgPyBUeXBlcy5CT09MRUFOX1RSVUUgOiBUeXBlcy5CT09MRUFOX0ZBTFNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSliKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMihpbnRUb1ppZ1phZyhpMTYpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTMyKGludCBpMzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlVmFyaW50MzIoaW50VG9aaWdaYWcoaTMyKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQ2NChsb25nVG9aaWd6YWcoaTY0KSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZURvdWJsZShkb3VibGUgZHViKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW10geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CisgICAgICAgICAgICBmaXhlZExvbmdUb0J5dGVzKEJpdENvbnZlcnRlci5Eb3VibGVUb0ludDY0Qml0cyhkdWIpLCBkYXRhLCAwKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKGRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHN0cikKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVVRGOEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3RyKTsKKyAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJpbiwgMCwgYmluLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMigodWludClsZW5ndGgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoYnVmLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKKyAgICAgICAgLy8gb3V0cHV0IG9yIHB1cnBvc2UuCisgICAgICAgIC8vCisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTGlzdEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpIHsgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkgeyB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCisgICAgICAgIC8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAvLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBXcml0ZUNvbGxlY3Rpb25CZWdpbihUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaXplIDw9IDE0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChzaXplIDw8IDQgfCBnZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgweGYwIHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgICAgICAgICBXcml0ZVZhcmludDMyKCh1aW50KXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGJ5dGVbXSB2YXJpbnQ2NG91dCA9IG5ldyBieXRlWzEwXTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFyaW50NjQodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKG4gJiB+KHVsb25nKTB4N0ZMKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFucy5Xcml0ZSh2YXJpbnQ2NG91dCwgMCwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgICAgLy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB1bG9uZyBsb25nVG9aaWd6YWcobG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHVsb25nKShuIDw8IDEpIF4gKHVsb25nKShuID4+IDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAgICAvLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVpbnQgaW50VG9aaWdaYWcoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAodWludCkobiA8PCAxKSBeICh1aW50KShuID4+IDMxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZworICAgICAgICAvLy8gdW50aWwgb2ZmKzcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBmaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpKG4gJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyAxXSA9IChieXRlKSgobiA+PiA4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDJdID0gKGJ5dGUpKChuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDNdID0gKGJ5dGUpKChuID4+IDI0KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDRdID0gKGJ5dGUpKChuID4+IDMyKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDVdID0gKGJ5dGUpKChuID4+IDQwKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDZdID0gKGJ5dGUpKChuID4+IDQ4KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDddID0gKGJ5dGUpKChuID4+IDU2KSAmIDB4ZmYpOworICAgICAgICB9CisKKyAgICAgICAgI2VuZHJlZ2lvbgorCisgICAgICAgICNyZWdpb24gUmVhZE1ldGhvZHMKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSBwcm90b2NvbElkID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGlmIChwcm90b2NvbElkICE9IFBST1RPQ09MX0lEKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIHByb3RvY29sIGlkICIgKyBQUk9UT0NPTF9JRC5Ub1N0cmluZygiWCIpICsgIiBidXQgZ290ICIgKyBwcm90b2NvbElkLlRvU3RyaW5nKCJYIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZSB2ZXJzaW9uQW5kVHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICBieXRlIHZlcnNpb24gPSAoYnl0ZSkodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCB2ZXJzaW9uICIgKyBWRVJTSU9OICsgIiBidXQgZ290ICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICAgICAgICAgIGludCBzZXFpZCA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZU5hbWUgPSBSZWFkU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKXR5cGUsIHNlcWlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorICAgICAgICAvLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBsYXN0RmllbGRfLlB1c2gobGFzdEZpZWxkSWRfKTsKKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IDA7CisgICAgICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yCisgICAgICAgIC8vLyB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFN0cnVjdEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlIHR5cGUgPSAoYnl0ZSlSZWFkQnl0ZSgpOworCisgICAgICAgICAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgICAgICAgICAgICBpZiAodHlwZSA9PSBUeXBlcy5TVE9QKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUU1RPUDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2hvcnQgZmllbGRJZDsKKworICAgICAgICAgICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSB0eXBlIGhlYWRlci4gaXQgY291bGQgY29udGFpbiBhIGZpZWxkIGlkIGRlbHRhLgorICAgICAgICAgICAgc2hvcnQgbW9kaWZpZXIgPSAoc2hvcnQpKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgICAgICBpZiAobW9kaWZpZXIgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisgICAgICAgICAgICAgICAgZmllbGRJZCA9IFJlYWRJMTYoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBoYXMgYSBkZWx0YS4gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgICAgICAgICAgICAgIGZpZWxkSWQgPSAoc2hvcnQpKGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgiIiwgZ2V0VFR5cGUoKGJ5dGUpKHR5cGUgJiAweDBmKSksIGZpZWxkSWQpOworCisgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgICAgICAgICAgaWYgKGlzQm9vbFR5cGUodHlwZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgICAgICAgICAgICAgYm9vbFZhbHVlXyA9IChieXRlKSh0eXBlICYgMHgwZikgPT0gVHlwZXMuQk9PTEVBTl9UUlVFID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKyAgICAgICAgICAgIGxhc3RGaWVsZElkXyA9IGZpZWxkLklEOworICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAvLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKKyAgICAgICAgLy8vICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KVJlYWRWYXJpbnQzMigpOworICAgICAgICAgICAgYnl0ZSBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAoYnl0ZSkwIDogKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVE1hcChnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlID4+IDQpKSwgZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAvLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCisgICAgICAgIC8vLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgIC8vLyB0cnVlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTGlzdCBSZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZSBzaXplX2FuZF90eXBlID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBUVHlwZSB0eXBlID0gZ2V0VFR5cGUoc2l6ZV9hbmRfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAvLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU2V0KFJlYWRMaXN0QmVnaW4oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYm9vbGVhbiBvZmYgdGhlIHdpcmUuIElmIHRoaXMgaXMgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgc2hvdWxkCisgICAgICAgIC8vLyBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICAgICAgICAvLy8gcHJlLXN0b3JlZCB2YWx1ZS4gT3RoZXJ3aXNlLCBSZWFkIGEgYnl0ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIEJvb2xlYW4gUmVhZEJvb2woKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYm9vbFZhbHVlXyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gYm9vbFZhbHVlXy5WYWx1ZTsKKyAgICAgICAgICAgICAgICBib29sVmFsdWVfID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFJlYWRCeXRlKCkgPT0gVHlwZXMuQk9PTEVBTl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSlieXRlUmF3QnVmWzBdOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCl6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHppZ3phZ1RvSW50KFJlYWRWYXJpbnQzMigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHppZ3phZ1RvTG9uZyhSZWFkVmFyaW50NjQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBObyBtYWdpYyBoZXJlIC0ganVzdCBSZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGxvbmdCaXRzLCAwLCA4KTsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KVJlYWRWYXJpbnQzMigpOworCisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoUmVhZEJpbmFyeShsZW5ndGgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJ5dGVbXSBSZWFkQmluYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpUmVhZFZhcmludDMyKCk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIFJlYWRCaW5hcnkoaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gbmV3IGJ5dGVbMF07CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIGxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQorICAgICAgICAvLyBlbmNvZGluZy4KKyAgICAgICAgLy8KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKSB7IH0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpIHsgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEludGVybmFsIFJlYWRpbmcgbWV0aG9kcworICAgICAgICAvLworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVpbnQgUmVhZFZhcmludDMyKCkKKyAgICAgICAgeworICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOworICAgICAgICAgICAgaW50IHNoaWZ0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKVJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1aW50KShiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgIC8vLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHVsb25nIFJlYWRWYXJpbnQ2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZSBiID0gKGJ5dGUpUmVhZEJ5dGUoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHVsb25nKShiICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgYnJlYWs7CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgICNlbmRyZWdpb24KKworICAgICAgICAvLworICAgICAgICAvLyBlbmNvZGluZyBoZWxwZXJzCisgICAgICAgIC8vCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCB6aWd6YWdUb0ludCh1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KShuID4+IDEpIF4gKC0oaW50KShuICYgMSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgbG9uZyB6aWd6YWdUb0xvbmcodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKShuID4+IDEpIF4gKC0obG9uZykobiAmIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAgICAvLy8gb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKyAgICAgICAgLy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgbG9uZyBieXRlc1RvTG9uZyhieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAoKGJ5dGVzWzddICYgMHhmZkwpIDw8IDU2KSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbNl0gJiAweGZmTCkgPDwgNDgpIHwKKyAgICAgICAgICAgICAgKChieXRlc1s1XSAmIDB4ZmZMKSA8PCA0MCkgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzRdICYgMHhmZkwpIDw8IDMyKSB8CisgICAgICAgICAgICAgICgoYnl0ZXNbM10gJiAweGZmTCkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgKChieXRlc1syXSAmIDB4ZmZMKSA8PCAxNikgfAorICAgICAgICAgICAgICAoKGJ5dGVzWzFdICYgMHhmZkwpIDw8IDgpIHwKKyAgICAgICAgICAgICAgKChieXRlc1swXSAmIDB4ZmZMKSk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICAgICAgLy8KKworICAgICAgICBwcml2YXRlIEJvb2xlYW4gaXNCb29sVHlwZShieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsb3dlck5pYmJsZSA9IGIgJiAweDBmOworICAgICAgICAgICAgcmV0dXJuIGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fVFJVRSB8fCBsb3dlck5pYmJsZSA9PSBUeXBlcy5CT09MRUFOX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCisgICAgICAgIC8vLyBUVHlwZSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBUVHlwZSBnZXRUVHlwZShieXRlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpKHR5cGUgJiAweDBmKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLlNUT1A6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5TdG9wOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuQk9PTEVBTl9GQUxTRToKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJPT0xFQU5fVFJVRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CWVRFOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJJTkFSWToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxJU1Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU0VUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTUFQOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU1RSVUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oImRvbid0IGtub3cgd2hhdCB0eXBlOiAiICsgKGJ5dGUpKHR5cGUgJiAweDBmKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGUgZ2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbKGludCl0dHlwZV07CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9URmllbGQuY3MKaW5kZXggZmExMDU4NC4uODE3OTU1NyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEZpZWxkLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RGaWVsZC5jcwpAQCAtMjcsMzYgKzI3LDM2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRGaWVsZAotCXsKLQkJcHJpdmF0ZSBzdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBUVHlwZSB0eXBlOwotCQlwcml2YXRlIHNob3J0IGlkOworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFRUeXBlIHR5cGU7CisgICAgICAgIHByaXZhdGUgc2hvcnQgaWQ7CiAKLQkJcHVibGljIFRGaWVsZChzdHJpbmcgbmFtZSwgVFR5cGUgdHlwZSwgc2hvcnQgaWQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9CisgICAgICAgIHB1YmxpYyBURmllbGQoc3RyaW5nIG5hbWUsIFRUeXBlIHR5cGUsIHNob3J0IGlkKQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBzdHJpbmcgTmFtZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gbmFtZTsgfQotCQkJc2V0IHsgbmFtZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lOyB9CisgICAgICAgICAgICBzZXQgeyBuYW1lID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiB0eXBlOyB9Ci0JCQlzZXQgeyB0eXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgdHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgc2hvcnQgSUQKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGlkOyB9Ci0JCQlzZXQgeyBpZCA9IHZhbHVlOyB9Ci0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBzaG9ydCBJRAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaWQ7IH0KKyAgICAgICAgICAgIHNldCB7IGlkID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCmluZGV4IGVkNjk3MGUuLjlkYmRlYTkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcwpAQCAtMjcsMTA0NyArMjcsMTA5OCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCi0JLy8vCi0JLy8vIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCi0JLy8vCi0JLy8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCi0JLy8vIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCi0JLy8vCi0JLy8vIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2wgOiBUUHJvdG9jb2wKLQl7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cwotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKLQkJewotCQkJcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQkJewotCQkJCXJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7Ci0JCQl9Ci0JCX0KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBUaGlzIGlzIGEgZnVsbC1mZWF0dXJlZCBwcm90b2NvbCBzdXBwb3J0aW5nIFdyaXRlIGFuZCBSZWFkLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFBsZWFzZSBzZWUgdGhlIEMrKyBjbGFzcyBoZWFkZXIgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlCisgICAgLy8vIHByb3RvY29sJ3Mgd2lyZSBmb3JtYXQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gQWRhcHRlZCBmcm9tIHRoZSBKYXZhIHZlcnNpb24uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRmFjdG9yeSBmb3IgSlNPTiBwcm90b2NvbCBvYmplY3RzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gQ09NTUEgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJywnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyAoYnl0ZSknOicgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyAoYnl0ZSkneycgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDRSA9IG5ldyBieXRlW10geyAoYnl0ZSknfScgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdbJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ10nIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBRVU9URSA9IG5ldyBieXRlW10geyAoYnl0ZSknIicgfTsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEJBQ0tTTEFTSCA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBaRVJPID0gbmV3IGJ5dGVbXSB7IChieXRlKScwJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gQ09NTUEgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJywnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBDT0xPTiA9IG5ldyBieXRlW10geyAoYnl0ZSknOicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyAoYnl0ZSkneycgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIFJCUkFDRSA9IG5ldyBieXRlW10geyAoYnl0ZSknfScgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIExCUkFDS0VUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdbJyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ10nIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBRVU9URSA9IG5ldyBieXRlW10geyAoYnl0ZSknIicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEJBQ0tTTEFTSCA9IG5ldyBieXRlW10geyAoYnl0ZSknXFwnIH07CiAKLQkJcHJpdmF0ZSBieXRlW10gRVNDU0VRID0gbmV3IGJ5dGVbXSB7IChieXRlKSdcXCcsIChieXRlKSd1JywgKGJ5dGUpJzAnLCAoYnl0ZSknMCcgfTsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gRVNDU0VRID0gbmV3IGJ5dGVbXSB7IChieXRlKSdcXCcsIChieXRlKSd1JywgKGJ5dGUpJzAnLCAoYnl0ZSknMCcgfTsKIAotCQlwcml2YXRlIGNvbnN0IGxvbmcgVkVSU0lPTiA9IDE7Ci0JCXByaXZhdGUgYnl0ZVtdIEpTT05fQ0hBUl9UQUJMRSA9IHsKLQkwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwoYnl0ZSknYicsKGJ5dGUpJ3QnLChieXRlKSduJywgIDAsKGJ5dGUpJ2YnLChieXRlKSdyJywgIDAsICAwLCAKLQkwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLQkxLCAgMSwoYnl0ZSknIicsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAgICBwcml2YXRlIGNvbnN0IGxvbmcgVkVSU0lPTiA9IDE7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIEpTT05fQ0hBUl9UQUJMRSA9IHsKKyAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwoYnl0ZSknYicsKGJ5dGUpJ3QnLChieXRlKSduJywgIDAsKGJ5dGUpJ2YnLChieXRlKSdyJywgIDAsICAwLAorICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgMSwgIDEsKGJ5dGUpJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKICAgfTsKIAotCQlwcml2YXRlIGNoYXJbXSBFU0NBUEVfQ0hBUlMgPSAiXCJcXGJmbnJ0Ii5Ub0NoYXJBcnJheSgpOworICAgICAgICBwcml2YXRlIGNoYXJbXSBFU0NBUEVfQ0hBUlMgPSAiXCJcXC9iZm5ydCIuVG9DaGFyQXJyYXkoKTsKIAotCQlwcml2YXRlIGJ5dGVbXSBFU0NBUEVfQ0hBUl9WQUxTID0gewotCShieXRlKSciJywgKGJ5dGUpJ1xcJywgKGJ5dGUpJ1xiJywgKGJ5dGUpJ1xmJywgKGJ5dGUpJ1xuJywgKGJ5dGUpJ1xyJywgKGJ5dGUpJ1x0JywKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKKyAgICAoYnl0ZSknIicsIChieXRlKSdcXCcsIChieXRlKScvJywgKGJ5dGUpJ1xiJywgKGJ5dGUpJ1xmJywgKGJ5dGUpJ1xuJywgKGJ5dGUpJ1xyJywgKGJ5dGUpJ1x0JywKICAgfTsKIAotCQlwcml2YXRlIGNvbnN0IGludCBERUZfU1RSSU5HX1NJWkUgPSAxNjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGX1NUUklOR19TSVpFID0gMTY7CiAKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfQk9PTCA9IG5ldyBieXRlW10geyAoYnl0ZSkndCcsIChieXRlKSdmJyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9CWVRFID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzgnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kxNiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKScxJywgKGJ5dGUpJzYnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0kzMiA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSczJywgKGJ5dGUpJzInIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0k2NCA9IG5ldyBieXRlW10geyAoYnl0ZSknaScsIChieXRlKSc2JywgKGJ5dGUpJzQnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0RPVUJMRSA9IG5ldyBieXRlW10geyAoYnl0ZSknZCcsIChieXRlKSdiJywgKGJ5dGUpJ2wnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUlVDVCA9IG5ldyBieXRlW10geyAoYnl0ZSkncicsIChieXRlKSdlJywgKGJ5dGUpJ2MnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NUUklORyA9IG5ldyBieXRlW10geyAoYnl0ZSkncycsIChieXRlKSd0JywgKGJ5dGUpJ3InIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX01BUCA9IG5ldyBieXRlW10geyAoYnl0ZSknbScsIChieXRlKSdhJywgKGJ5dGUpJ3AnIH07Ci0JCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0xJU1QgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2wnLCAoYnl0ZSkncycsIChieXRlKSd0JyB9OwotCQlwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9TRVQgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ3MnLCAoYnl0ZSknZScsIChieXRlKSd0JyB9OworICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gTkFNRV9CT09MID0gbmV3IGJ5dGVbXSB7IChieXRlKSd0JywgKGJ5dGUpJ2YnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX0JZVEUgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpJ2knLCAoYnl0ZSknOCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfSTE2ID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzEnLCAoYnl0ZSknNicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfSTMyID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzMnLCAoYnl0ZSknMicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfSTY0ID0gbmV3IGJ5dGVbXSB7IChieXRlKSdpJywgKGJ5dGUpJzYnLCAoYnl0ZSknNCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfRE9VQkxFID0gbmV3IGJ5dGVbXSB7IChieXRlKSdkJywgKGJ5dGUpJ2InLCAoYnl0ZSknbCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfU1RSVUNUID0gbmV3IGJ5dGVbXSB7IChieXRlKSdyJywgKGJ5dGUpJ2UnLCAoYnl0ZSknYycgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfU1RSSU5HID0gbmV3IGJ5dGVbXSB7IChieXRlKSdzJywgKGJ5dGUpJ3QnLCAoYnl0ZSkncicgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfTUFQID0gbmV3IGJ5dGVbXSB7IChieXRlKSdtJywgKGJ5dGUpJ2EnLCAoYnl0ZSkncCcgfTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIE5BTUVfTElTVCA9IG5ldyBieXRlW10geyAoYnl0ZSknbCcsIChieXRlKSdzJywgKGJ5dGUpJ3QnIH07CisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBOQU1FX1NFVCA9IG5ldyBieXRlW10geyAoYnl0ZSkncycsIChieXRlKSdlJywgKGJ5dGUpJ3QnIH07CiAKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEdldFR5cGVOYW1lRm9yVHlwZUlEKFRUeXBlIHR5cGVJRCkKLQkJewotCQkJc3dpdGNoICh0eXBlSUQpCi0JCQl7Ci0JCQkJY2FzZSBUVHlwZS5Cb29sOgotCQkJCQlyZXR1cm4gTkFNRV9CT09MOwotCQkJCWNhc2UgVFR5cGUuQnl0ZToKLQkJCQkJcmV0dXJuIE5BTUVfQllURTsKLQkJCQljYXNlIFRUeXBlLkkxNjoKLQkJCQkJcmV0dXJuIE5BTUVfSTE2OwotCQkJCWNhc2UgVFR5cGUuSTMyOgotCQkJCQlyZXR1cm4gTkFNRV9JMzI7Ci0JCQkJY2FzZSBUVHlwZS5JNjQ6Ci0JCQkJCXJldHVybiBOQU1FX0k2NDsKLQkJCQljYXNlIFRUeXBlLkRvdWJsZToKLQkJCQkJcmV0dXJuIE5BTUVfRE9VQkxFOwotCQkJCWNhc2UgVFR5cGUuU3RyaW5nOgotCQkJCQlyZXR1cm4gTkFNRV9TVFJJTkc7Ci0JCQkJY2FzZSBUVHlwZS5TdHJ1Y3Q6Ci0JCQkJCXJldHVybiBOQU1FX1NUUlVDVDsKLQkJCQljYXNlIFRUeXBlLk1hcDoKLQkJCQkJcmV0dXJuIE5BTUVfTUFQOwotCQkJCWNhc2UgVFR5cGUuU2V0OgotCQkJCQlyZXR1cm4gTkFNRV9TRVQ7Ci0JCQkJY2FzZSBUVHlwZS5MaXN0OgotCQkJCQlyZXR1cm4gTkFNRV9MSVNUOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwKLQkJCQkJCQkJCQkJCSAiVW5yZWNvZ25pemVkIHR5cGUiKTsKLQkJCX0KLQkJfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gR2V0VHlwZU5hbWVGb3JUeXBlSUQoVFR5cGUgdHlwZUlEKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGVJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0JPT0w7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9CWVRFOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9JMTY7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0kzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9ET1VCTEU7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX1NUUklORzsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cnVjdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5BTUVfU1RSVUNUOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkFNRV9NQVA7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TZXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX1NFVDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOQU1FX0xJU1Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VHlwZUlERm9yVHlwZU5hbWUoYnl0ZVtdIG5hbWUpCi0JCXsKLQkJCVRUeXBlIHJlc3VsdCA9IFRUeXBlLlN0b3A7Ci0JCQlpZiAobmFtZS5MZW5ndGggPiAxKQotCQkJewotCQkJCXN3aXRjaCAobmFtZVswXSkKLQkJCQl7Ci0JCQkJCWNhc2UgKGJ5dGUpJ2QnOgotCQkJCQkJcmVzdWx0ID0gVFR5cGUuRG91YmxlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ2knOgotCQkJCQkJc3dpdGNoIChuYW1lWzFdKQotCQkJCQkJewotCQkJCQkJCWNhc2UgKGJ5dGUpJzgnOgotCQkJCQkJCQlyZXN1bHQgPSBUVHlwZS5CeXRlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIChieXRlKScxJzoKLQkJCQkJCQkJcmVzdWx0ID0gVFR5cGUuSTE2OwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIChieXRlKSczJzoKLQkJCQkJCQkJcmVzdWx0ID0gVFR5cGUuSTMyOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIChieXRlKSc2JzoKLQkJCQkJCQkJcmVzdWx0ID0gVFR5cGUuSTY0OwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIChieXRlKSdsJzoKLQkJCQkJCXJlc3VsdCA9IFRUeXBlLkxpc3Q7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoYnl0ZSknbSc6Ci0JCQkJCQlyZXN1bHQgPSBUVHlwZS5NYXA7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoYnl0ZSkncic6Ci0JCQkJCQlyZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoYnl0ZSkncyc6Ci0JCQkJCQlpZiAobmFtZVsxXSA9PSAoYnl0ZSkndCcpCi0JCQkJCQl7Ci0JCQkJCQkJcmVzdWx0ID0gVFR5cGUuU3RyaW5nOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobmFtZVsxXSA9PSAoYnl0ZSknZScpCi0JCQkJCQl7Ci0JCQkJCQkJcmVzdWx0ID0gVFR5cGUuU2V0OwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgKGJ5dGUpJ3QnOgotCQkJCQkJcmVzdWx0ID0gVFR5cGUuQm9vbDsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChyZXN1bHQgPT0gVFR5cGUuU3RvcCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCi0JCQkJCQkJCQkJCSAiVW5yZWNvZ25pemVkIHR5cGUiKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VHlwZUlERm9yVHlwZU5hbWUoYnl0ZVtdIG5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRUeXBlIHJlc3VsdCA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuRG91YmxlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChuYW1lWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKScxJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSczJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTMyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSc2JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSdsJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkxpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknbSc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5NYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkncic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkncyc6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAoYnl0ZSkndCcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAoYnl0ZSknZScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuQm9vbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQotCQkvLy8gaW5zZXJ0aW5nL1JlYWRpbmcgYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzCi0JCS8vLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJvdGVjdGVkIGNsYXNzIEpTT05CYXNlQ29udGV4dAotCQl7Ci0JCQlwcm90ZWN0ZWQgVEpTT05Qcm90b2NvbCBwcm90bzsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQmFzZSBjbGFzcyBmb3IgdHJhY2tpbmcgSlNPTiBjb250ZXh0cyB0aGF0IG1heSByZXF1aXJlCisgICAgICAgIC8vLyBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgICAgICAgLy8vIFRoaXMgYmFzZSBjb250ZXh0IGRvZXMgbm90aGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05CYXNlQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgVEpTT05Qcm90b2NvbCBwcm90bzsKIAotCQkJcHVibGljIEpTT05CYXNlQ29udGV4dChUSlNPTlByb3RvY29sIHByb3RvKQotCQkJewotCQkJCXRoaXMucHJvdG8gPSBwcm90bzsKLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGUoKSB7IH0KKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGUoKSB7IH0KIAotCQkJcHVibGljIHZpcnR1YWwgdm9pZCBSZWFkKCkgeyB9CisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlYWQoKSB7IH0KIAotCQkJcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkgeyByZXR1cm4gZmFsc2U7IH0KLQkJfQorICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKLQkJLy8vIGZvciB0aGUgZmlyc3Qgb25lCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJvdGVjdGVkIGNsYXNzIEpTT05MaXN0Q29udGV4dCA6IEpTT05CYXNlQ29udGV4dAotCQl7Ci0JCQlwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG9jb2wpCi0JCQkJOiBiYXNlKHByb3RvY29sKQotCQkJeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIGxpc3RzLiBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdAorICAgICAgICAvLy8gZm9yIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05MaXN0Q29udGV4dCA6IEpTT05CYXNlQ29udGV4dAorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKU09OUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgewogCi0JCQl9CisgICAgICAgICAgICB9CiAKLQkJCXByaXZhdGUgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOwogCi0JCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJvdG8udHJhbnMuV3JpdGUoQ09NTUEpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by50cmFucy5Xcml0ZShDT01NQSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkKCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcm90by5SZWFkSlNPTlN5bnRheENoYXIoQ09NTUEpOwotCQkJCX0KLQkJCX0KLQkJfQorICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKENPTU1BKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCi0JCS8vLyBvZiBlYWNoIHJlY29yZCBwYWlyLCBhbmQgY29tbWFzIGJlZm9yZSBlYWNoIGtleSBleGNlcHQgdGhlIGZpcnN0LiBJbgotCQkvLy8gYWRkaXRpb24sIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZQotCQkvLy8gZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBjbGFzcyBKU09OUGFpckNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKLQkJewotCQkJcHVibGljIEpTT05QYWlyQ29udGV4dChUSlNPTlByb3RvY29sIHByb3RvKQotCQkJCTogYmFzZShwcm90bykKLQkJCXsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KKyAgICAgICAgLy8vIG9mIGVhY2ggcmVjb3JkIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluCisgICAgICAgIC8vLyBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgICAgICAgIC8vLyBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OUGFpckNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEpTT05QYWlyQ29udGV4dChUSlNPTlByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90bykKKyAgICAgICAgICAgIHsKIAotCQkJfQorICAgICAgICAgICAgfQogCi0JCQlwcml2YXRlIGJvb2wgZmlyc3QgPSB0cnVlOwotCQkJcHJpdmF0ZSBib29sIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgY29sb24gPSB0cnVlOwogCi0JCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJY29sb24gPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlwcm90by50cmFucy5Xcml0ZShjb2xvbiA/IENPTE9OIDogQ09NTUEpOwotCQkJCQljb2xvbiA9ICFjb2xvbjsKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29sb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by50cmFucy5Xcml0ZShjb2xvbiA/IENPTE9OIDogQ09NTUEpOworICAgICAgICAgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWQoKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCWNvbG9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKGNvbG9uID8gQ09MT04gOiBDT01NQSk7Ci0JCQkJCWNvbG9uID0gIWNvbG9uOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKGNvbG9uID8gQ09MT04gOiBDT01NQSk7CisgICAgICAgICAgICAgICAgICAgIGNvbG9uID0gIWNvbG9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQkJcHVibGljIG92ZXJyaWRlIGJvb2wgRXNjYXBlTnVtYmVycygpCi0JCQl7Ci0JCQkJcmV0dXJuIGNvbG9uOwotCQkJfQotCQl9CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29sb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBjbGFzcyBMb29rYWhlYWRSZWFkZXIKLQkJewotCQkJcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSlNPTlByb3RvY29sIHByb3RvOwogCi0JCQlwdWJsaWMgTG9va2FoZWFkUmVhZGVyKFRKU09OUHJvdG9jb2wgcHJvdG8pCi0JCQl7Ci0JCQkJdGhpcy5wcm90byA9IHByb3RvOwotCQkJfQorICAgICAgICAgICAgcHVibGljIExvb2thaGVhZFJlYWRlcihUSlNPTlByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KIAotCQkJcHJpdmF0ZSBib29sIGhhc0RhdGE7Ci0JCQlwcml2YXRlIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgaGFzRGF0YTsKKyAgICAgICAgICAgIHByaXZhdGUgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVsxXTsKIAotCQkJLy8vPHN1bW1hcnk+Ci0JCQkvLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQotCQkJLy8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgotCQkJLy8vPC9zdW1tYXJ5PgotCQkJcHVibGljIGJ5dGUgUmVhZCgpCi0JCQl7Ci0JCQkJaWYgKGhhc0RhdGEpCi0JCQkJewotCQkJCQloYXNEYXRhID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXByb3RvLnRyYW5zLlJlYWRBbGwoZGF0YSwgMCwgMSk7Ci0JCQkJfQotCQkJCXJldHVybiBkYXRhWzBdOwotCQkJfQorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgYnl0ZSBSZWFkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhc0RhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8udHJhbnMuUmVhZEFsbChkYXRhLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFbMF07CisgICAgICAgICAgICB9CiAKLQkJCS8vLzxzdW1tYXJ5PgotCQkJLy8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKLQkJCS8vLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgotCQkJLy8vPC9zdW1tYXJ5PgotCQkJcHVibGljIGJ5dGUgUGVlaygpCi0JCQl7Ci0JCQkJaWYgKCFoYXNEYXRhKQotCQkJCXsKLQkJCQkJcHJvdG8udHJhbnMuUmVhZEFsbChkYXRhLCAwLCAxKTsKLQkJCQl9Ci0JCQkJaGFzRGF0YSA9IHRydWU7Ci0JCQkJcmV0dXJuIGRhdGFbMF07Ci0JCQl9Ci0JCX0KKyAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgICAgICAvLy8gYnVmZmVyIGlmIGl0IGhhcyBub3QgYmVlbiBmaWxsZWQgYWxSZWFkeS4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgICAgICBwdWJsaWMgYnl0ZSBQZWVrKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0RhdGEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90by50cmFucy5SZWFkQWxsKGRhdGEsIDAsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vIERlZmF1bHQgZW5jb2RpbmcKLQkJcHJvdGVjdGVkIEVuY29kaW5nIHV0ZjhFbmNvZGluZyA9IFVURjhFbmNvZGluZy5VVEY4OworICAgICAgICAvLyBEZWZhdWx0IGVuY29kaW5nCisgICAgICAgIHByb3RlY3RlZCBFbmNvZGluZyB1dGY4RW5jb2RpbmcgPSBVVEY4RW5jb2RpbmcuVVRGODsKIAotCQkvLyBTdGFjayBvZiBuZXN0ZWQgY29udGV4dHMgdGhhdCB3ZSBtYXkgYmUgaW4KLQkJcHJvdGVjdGVkIFN0YWNrPEpTT05CYXNlQ29udGV4dD4gY29udGV4dFN0YWNrID0gbmV3IFN0YWNrPEpTT05CYXNlQ29udGV4dD4oKTsKKyAgICAgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgICAgIHByb3RlY3RlZCBTdGFjazxKU09OQmFzZUNvbnRleHQ+IGNvbnRleHRTdGFjayA9IG5ldyBTdGFjazxKU09OQmFzZUNvbnRleHQ+KCk7CiAKLQkJLy8gQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCi0JCXByb3RlY3RlZCBKU09OQmFzZUNvbnRleHQgY29udGV4dDsKKyAgICAgICAgLy8gQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCisgICAgICAgIHByb3RlY3RlZCBKU09OQmFzZUNvbnRleHQgY29udGV4dDsKIAotCQkvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgotCQlwcm90ZWN0ZWQgTG9va2FoZWFkUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgICAgICAgcHJvdGVjdGVkIExvb2thaGVhZFJlYWRlciByZWFkZXI7CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKLQkJewotCQkJY29udGV4dFN0YWNrLlB1c2goY29udGV4dCk7Ci0JCQljb250ZXh0ID0gYzsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHRTdGFjay5QdXNoKGNvbnRleHQpOworICAgICAgICAgICAgY29udGV4dCA9IGM7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjawotCQkvLy88L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCB2b2lkIFBvcENvbnRleHQoKQotCQl7Ci0JCQljb250ZXh0ID0gY29udGV4dFN0YWNrLlBvcCgpOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRTdGFjay5Qb3AoKTsKKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gVEpTT05Qcm90b2NvbCBDb25zdHJ1Y3RvcgotCQkvLy88L3N1bW1hcnk+Ci0JCXB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCi0JCQk6IGJhc2UodHJhbnMpCi0JCXsKLQkJCWNvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOwotCQkJcmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUSlNPTlByb3RvY29sIENvbnN0cnVjdG9yCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IGJhc2UodHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgSlNPTkJhc2VDb250ZXh0KHRoaXMpOworICAgICAgICAgICAgcmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICAgICAgfQogCi0JCS8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKLQkJcHJpdmF0ZSBieXRlW10gdGVtcEJ1ZmZlciA9IG5ldyBieXRlWzRdOworICAgICAgICAvLyBUZW1wb3JhcnkgYnVmZmVyIHVzZWQgYnkgc2V2ZXJhbCBtZXRob2RzCisgICAgICAgIHByaXZhdGUgYnl0ZVtdIHRlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KLQkJLy8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCi0JCS8vLyBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgdm9pZCBSZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpCi0JCXsKLQkJCWJ5dGUgY2ggPSByZWFkZXIuUmVhZCgpOwotCQkJaWYgKGNoICE9IGJbMF0pCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiIgKyAoY2hhciljaCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAvLy8gTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LlJlYWQKKyAgICAgICAgLy8vIGFuZCBKU09OUGFpckNvbnRleHQuUmVhZAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBSZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgY2ggPSByZWFkZXIuUmVhZCgpOworICAgICAgICAgICAgaWYgKGNoICE9IGJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiIgKyAoY2hhciljaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cwotCQkvLy8gY29ycmVzcG9uZGluZyBoZXggdmFsdWUKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIHN0YXRpYyBieXRlIEhleFZhbChieXRlIGNoKQotCQl7Ci0JCQlpZiAoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpCi0JCQl7Ci0JCQkJcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkKLQkJCXsKLQkJCQlyZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJ2EnKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0JCQkJCQkJCQkJCSAiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciIpOwotCQkJfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cworICAgICAgICAvLy8gY29ycmVzcG9uZGluZyBoZXggdmFsdWUKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhWYWwoYnl0ZSBjaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ggKz0gMTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICdhJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhDaGFyKGJ5dGUgdmFsKQotCQl7Ci0JCQl2YWwgJj0gMHgwRjsKLQkJCWlmICh2YWwgPCAxMCkKLQkJCXsKLQkJCQlyZXR1cm4gKGJ5dGUpKChjaGFyKXZhbCArICcwJyk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnYScpOwotCQkJfQotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggdmFsdWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgaGV4IGNoYXJhY3RlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0YXRpYyBieXRlIEhleENoYXIoYnl0ZSB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCAmPSAweDBGOworICAgICAgICAgICAgaWYgKHZhbCA8IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwgLT0gMTA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnYScpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJLy8vPHN1bW1hcnk+Ci0JCS8vLyBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OU3RyaW5nKGJ5dGVbXSBiKQotCQl7Ci0JCQljb250ZXh0LldyaXRlKCk7Ci0JCQl0cmFucy5Xcml0ZShRVU9URSk7Ci0JCQlpbnQgbGVuID0gYi5MZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKQotCQkJewotCQkJCWlmICgoYltpXSAmIDB4MDBGRikgPj0gMHgzMCkKLQkJCQl7Ci0JCQkJCWlmIChiW2ldID09IEJBQ0tTTEFTSFswXSkKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKLQkJCQkJCXRyYW5zLldyaXRlKEJBQ0tTTEFTSCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQl0cmFucy5Xcml0ZShiLCBpLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl0ZW1wQnVmZmVyWzBdID0gSlNPTl9DSEFSX1RBQkxFW2JbaV1dOwotCQkJCQlpZiAodGVtcEJ1ZmZlclswXSA9PSAxKQotCQkJCQl7Ci0JCQkJCQl0cmFucy5Xcml0ZShiLCBpLCAxKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0ZW1wQnVmZmVyWzBdID4gMSkKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKLQkJCQkJCXRyYW5zLldyaXRlKHRlbXBCdWZmZXIsIDAsIDEpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJdHJhbnMuV3JpdGUoRVNDU0VRKTsKLQkJCQkJCXRlbXBCdWZmZXJbMF0gPSBIZXhDaGFyKChieXRlKShiW2ldID4+IDQpKTsKLQkJCQkJCXRlbXBCdWZmZXJbMV0gPSBIZXhDaGFyKGJbaV0pOwotCQkJCQkJdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgMik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cmFucy5Xcml0ZShRVU9URSk7Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05TdHJpbmcoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgICAgIGludCBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChiW2ldICYgMHgwMEZGKSA+PSAweDMwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJbaV0gPT0gQkFDS1NMQVNIWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShCQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKGIsIGksIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBCdWZmZXJbMF0gPSBKU09OX0NIQVJfVEFCTEVbYltpXV07CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wQnVmZmVyWzBdID09IDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLldyaXRlKGIsIGksIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBCdWZmZXJbMF0gPiAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShCQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShFU0NTRVEpOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEJ1ZmZlclswXSA9IEhleENoYXIoKGJ5dGUpKGJbaV0gPj4gNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEJ1ZmZlclsxXSA9IEhleENoYXIoYltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZSh0ZW1wQnVmZmVyLCAwLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKKyAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCi0JCS8vLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OSW50ZWdlcihsb25nIG51bSkKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJU3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygpOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAgICAgLy8vIHdyYXBwZWQgaW4gcXVvdGVzIHRvIG91dHB1dCBhcyBhIEpTT04gc3RyaW5nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OSW50ZWdlcihsb25nIG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygpOworCisgICAgICAgICAgICBib29sIGVzY2FwZU51bSA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgICAgICAgIC8vLyBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05Eb3VibGUoZG91YmxlIG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIE5hTgorICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJ0knKQorICAgICAgICAgICAgICAgICAgICB7IC8vIC1JbmZpbml0eQorICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCisgICAgICAgIC8vLyBkYXRhCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFFVT1RFKTsKIAotCQkJYm9vbCBlc2NhcGVOdW0gPSBjb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgaW50IGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgaW50IG9mZiA9IDA7CiAKLQkJCXRyYW5zLldyaXRlKHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpKTsKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgNCk7CisgICAgICAgICAgICAgICAgb2ZmICs9IDM7CisgICAgICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBFbmNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdGVtcEJ1ZmZlciwgMCk7CisgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgbGVuICsgMSk7CisgICAgICAgICAgICB9CiAKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKLQkJLy8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pCi0JCXsKLQkJCWNvbnRleHQuV3JpdGUoKTsKLQkJCVN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0JCQlib29sIHNwZWNpYWwgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoTEJSQUNFKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CiAKLQkJCXN3aXRjaCAoc3RyWzBdKQotCQkJewotCQkJCWNhc2UgJ04nOiAvLyBOYU4KLQkJCQljYXNlICdJJzogLy8gSW5maW5pdHkKLQkJCQkJc3BlY2lhbCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJy0nOgotCQkJCQlpZiAoc3RyWzFdID09ICdJJykKLQkJCQkJeyAvLyAtSW5maW5pdHkKLQkJCQkJCXNwZWNpYWwgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQorICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoUkJSQUNFKTsKKyAgICAgICAgfQogCi0JCQlib29sIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOworICAgICAgICAgICAgdHJhbnMuV3JpdGUoTEJSQUNLRVQpOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KIAotCQkJaWYgKGVzY2FwZU51bSkKLQkJCQl0cmFucy5Xcml0ZShRVU9URSk7CisgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgICAgIHRyYW5zLldyaXRlKFJCUkFDS0VUKTsKKyAgICAgICAgfQogCi0JCQl0cmFucy5Xcml0ZSh1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSk7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CiAKLQkJCWlmIChlc2NhcGVOdW0pCi0JCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9Ci0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCi0JCS8vLyBkYXRhCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSB2b2lkIFdyaXRlSlNPTkJhc2U2NChieXRlW10gYikKLQkJewotCQkJY29udGV4dC5Xcml0ZSgpOwotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOworICAgICAgICAgICAgYnl0ZVtdIGIgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhiKTsKIAotCQkJaW50IGxlbiA9IGIuTGVuZ3RoOwotCQkJaW50IG9mZiA9IDA7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKChsb25nKW1lc3NhZ2UuVHlwZSk7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UuU2VxSUQpOworICAgICAgICB9CiAKLQkJCXdoaWxlIChsZW4gPj0gMykKLQkJCXsKLQkJCQkvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKLQkJCQlUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgMywgdGVtcEJ1ZmZlciwgMCk7Ci0JCQkJdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgNCk7Ci0JCQkJb2ZmICs9IDM7Ci0JCQkJbGVuIC09IDM7Ci0JCQl9Ci0JCQlpZiAobGVuID4gMCkKLQkJCXsKLQkJCQkvLyBFbmNvZGUgcmVtYWluZGVyCi0JCQkJVEJhc2U2NFV0aWxzLmVuY29kZShiLCBvZmYsIGxlbiwgdGVtcEJ1ZmZlciwgMCk7Ci0JCQkJdHJhbnMuV3JpdGUodGVtcEJ1ZmZlciwgMCwgbGVuICsgMSk7Ci0JCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQkJdHJhbnMuV3JpdGUoUVVPVEUpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OT2JqZWN0U3RhcnQoKQotCQl7Ci0JCQljb250ZXh0LldyaXRlKCk7Ci0JCQl0cmFucy5Xcml0ZShMQlJBQ0UpOwotCQkJUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBXcml0ZUpTT05PYmplY3RFbmQoKQotCQl7Ci0JCQlQb3BDb250ZXh0KCk7Ci0JCQl0cmFucy5Xcml0ZShSQlJBQ0UpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoZmllbGQuSUQpOworICAgICAgICAgICAgV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChmaWVsZC5UeXBlKSk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgV3JpdGVKU09OQXJyYXlTdGFydCgpCi0JCXsKLQkJCWNvbnRleHQuV3JpdGUoKTsKLQkJCXRyYW5zLldyaXRlKExCUkFDS0VUKTsKLQkJCVB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBXcml0ZUpTT05BcnJheUVuZCgpCi0JCXsKLQkJCVBvcENvbnRleHQoKTsKLQkJCXRyYW5zLldyaXRlKFJCUkFDS0VUKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpIHsgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5U3RhcnQoKTsKLQkJCVdyaXRlSlNPTkludGVnZXIoVkVSU0lPTik7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTlN0cmluZyhHZXRUeXBlTmFtZUZvclR5cGVJRChtYXAuS2V5VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5WYWx1ZVR5cGUpKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIobWFwLkNvdW50KTsKKyAgICAgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIH0KIAotCQkJYnl0ZVtdIGIgPSB1dGY4RW5jb2RpbmcuR2V0Qnl0ZXMobWVzc2FnZS5OYW1lKTsKLQkJCVdyaXRlSlNPTlN0cmluZyhiKTsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQkJV3JpdGVKU09OSW50ZWdlcigobG9uZyltZXNzYWdlLlR5cGUpOwotCQkJV3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLlNlcUlEKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobGlzdC5FbGVtZW50VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihsaXN0LkNvdW50KTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHIpCi0JCXsKLQkJCVdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTZXRCZWdpbihUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKHNldC5FbGVtZW50VHlwZSkpOworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihzZXQuQ291bnQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05PYmplY3RFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKQotCQl7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKLQkJCVdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQuVHlwZSkpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoYiA/IChsb25nKTEgOiAobG9uZykwKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05PYmplY3RFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJ5dGUoc2J5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZyliKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkgeyB9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcigobG9uZylpMTYpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNYXBCZWdpbihUTWFwIG1hcCkKLQkJewotCQkJV3JpdGVKU09OQXJyYXlTdGFydCgpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKG1hcC5LZXlUeXBlKSk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLlZhbHVlVHlwZSkpOwotCQkJV3JpdGVKU09OSW50ZWdlcihtYXAuQ291bnQpOwotCQkJV3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKChsb25nKWkzMik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCi0JCXsKLQkJCVdyaXRlSlNPTk9iamVjdEVuZCgpOwotCQkJV3JpdGVKU09OQXJyYXlFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OSW50ZWdlcihpNjQpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkKLQkJewotCQkJV3JpdGVKU09OQXJyYXlTdGFydCgpOwotCQkJV3JpdGVKU09OU3RyaW5nKEdldFR5cGVOYW1lRm9yVHlwZUlEKGxpc3QuRWxlbWVudFR5cGUpKTsKLQkJCVdyaXRlSlNPTkludGVnZXIobGlzdC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGR1YikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKHN0cik7CisgICAgICAgICAgICBXcml0ZUpTT05TdHJpbmcoYik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KQotCQl7Ci0JCQlXcml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0JCQlXcml0ZUpTT05TdHJpbmcoR2V0VHlwZU5hbWVGb3JUeXBlSUQoc2V0LkVsZW1lbnRUeXBlKSk7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKHNldC5Db3VudCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGVKU09OQmFzZTY0KGJpbik7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCi0JCXsKLQkJCVdyaXRlSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgICAgICovCiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKLQkJewotCQkJV3JpdGVKU09OSW50ZWdlcihiID8gKGxvbmcpMSA6IChsb25nKTApOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIHN0cmluZywgdW5lc2NhcGluZyBhcyBhcHByb3ByaWF0ZS4uIFNraXAgUmVhZGluZyBmcm9tIHRoZQorICAgICAgICAvLy8gY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTlN0cmluZyhib29sIHNraXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBNZW1vcnlTdHJlYW0gYnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgTGlzdDxjaGFyPiBjb2RldW5pdHMgPSBuZXcgTGlzdDxjaGFyPigpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShieXRlIGIpCi0JCXsKLQkJCVdyaXRlSlNPTkludGVnZXIoKGxvbmcpYik7Ci0JCX0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkxNihzaG9ydCBpMTYpCi0JCXsKLQkJCVdyaXRlSlNPTkludGVnZXIoKGxvbmcpaTE2KTsKLQkJfQorICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gUVVPVEVbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkzMikKLQkJewotCQkJV3JpdGVKU09OSW50ZWdlcigobG9uZylpMzIpOwotCQl9CisgICAgICAgICAgICAgICAgLy8gZXNjYXBlZD8KKyAgICAgICAgICAgICAgICBpZiAoY2ggIT0gRVNDU0VRWzBdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KQotCQl7Ci0JCQlXcml0ZUpTT05JbnRlZ2VyKGk2NCk7Ci0JCX0KKyAgICAgICAgICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIFx1WFhYWCBhbmQgXD8KKyAgICAgICAgICAgICAgICBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoICE9IEVTQ1NFUVsxXSkgIC8vIGNvbnRyb2wgY2hhcnMgbGlrZSBcbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mZiA9IEFycmF5LkluZGV4T2YoRVNDQVBFX0NIQVJTLCAoY2hhciljaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvZmYgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoID0gRVNDQVBFX0NIQVJfVkFMU1tvZmZdOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuV3JpdGUobmV3IGJ5dGVbXSB7IChieXRlKWNoIH0sIDAsIDEpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGR1YikKLQkJewotCQkJV3JpdGVKU09ORG91YmxlKGR1Yik7Ci0JCX0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgc3RyKQotCQl7Ci0JCQlieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOwotCQkJV3JpdGVKU09OU3RyaW5nKGIpOwotCQl9CisgICAgICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgICAgICB0cmFucy5SZWFkQWxsKHRlbXBCdWZmZXIsIDAsIDQpOworICAgICAgICAgICAgICAgIHZhciB3Y2ggPSAoc2hvcnQpKChIZXhWYWwoKGJ5dGUpdGVtcEJ1ZmZlclswXSkgPDwgMTIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSGV4VmFsKChieXRlKXRlbXBCdWZmZXJbMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4VmFsKHRlbXBCdWZmZXJbM10pKTsKKyAgICAgICAgICAgICAgICBpZiAoQ2hhci5Jc0hpZ2hTdXJyb2dhdGUoKGNoYXIpd2NoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RldW5pdHMuQWRkKChjaGFyKXdjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKENoYXIuSXNMb3dTdXJyb2dhdGUoKGNoYXIpd2NoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuQ291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhjb2RldW5pdHMuVG9BcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLldyaXRlKHRtcCwgMCwgdG1wLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5DbGVhcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdG1wID0gdXRmOEVuY29kaW5nLkdldEJ5dGVzKG5ldyBjaGFyW10geyAoY2hhcil3Y2ggfSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5Xcml0ZSh0bXAsIDAsIHRtcC5MZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYmluKQotCQl7Ci0JCQlXcml0ZUpTT05CYXNlNjQoYmluKTsKLQkJfQogCi0JCS8qKgotCQkgKiBSZWFkaW5nIG1ldGhvZHMuCi0JCSAqLworICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCi0JCS8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCi0JCS8vLzwvc3VtbWFyeT4KLQkJcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKLQkJewotCQkJTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXIuVG9BcnJheSgpOworICAgICAgICB9CiAKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbCBJc0pTT05OdW1lcmljKGJ5dGUgYikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJysnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJy0nOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJy4nOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzAnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzEnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzInOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzMnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzQnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzUnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzYnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzcnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzgnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJzknOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ0UnOgorICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpJ2UnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogCi0JCQlpZiAoIXNraXBDb250ZXh0KQotCQkJewotCQkJCWNvbnRleHQuUmVhZCgpOwotCQkJfQotCQkJUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKLQkJCXdoaWxlICh0cnVlKQotCQkJewotCQkJCWJ5dGUgY2ggPSByZWFkZXIuUmVhZCgpOwotCQkJCWlmIChjaCA9PSBRVU9URVswXSkKLQkJCQl7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY2ggPT0gRVNDU0VRWzBdKQotCQkJCXsKLQkJCQkJY2ggPSByZWFkZXIuUmVhZCgpOwotCQkJCQlpZiAoY2ggPT0gRVNDU0VRWzFdKQotCQkJCQl7Ci0JCQkJCQlSZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0JCQkJCQlSZWFkSlNPTlN5bnRheENoYXIoWkVSTyk7Ci0JCQkJCQl0cmFucy5SZWFkQWxsKHRlbXBCdWZmZXIsIDAsIDIpOwotCQkJCQkJY2ggPSAoYnl0ZSkoKEhleFZhbCgoYnl0ZSl0ZW1wQnVmZmVyWzBdKSA8PCA0KSArIEhleFZhbCh0ZW1wQnVmZmVyWzFdKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlpbnQgb2ZmID0gQXJyYXkuSW5kZXhPZihFU0NBUEVfQ0hBUlMsIChjaGFyKWNoKTsKLQkJCQkJCWlmIChvZmYgPT0gLTEpCi0JCQkJCQl7Ci0JCQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkJCQkgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOwotCQkJCQkJfQotCQkJCQkJY2ggPSBFU0NBUEVfQ0hBUl9WQUxTW29mZl07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnVmZmVyLldyaXRlKG5ldyBieXRlW10geyAoYnl0ZSljaCB9LCAwLCAxKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIuVG9BcnJheSgpOwotCQl9CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAgICAgLy8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmJsZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgICAgICAgICBpZiAoIUlzSlNPTk51bWVyaWMoY2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0cmJsZC5BcHBlbmQoKGNoYXIpcmVhZGVyLlJlYWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RyYmxkLlRvU3RyaW5nKCk7CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlIGNvdWxkIGJlIGEgdmFsaWQgcGFydCBvZiBhIEpTT04gbnVtYmVyLgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgYm9vbCBJc0pTT05OdW1lcmljKGJ5dGUgYikKLQkJewotCQkJc3dpdGNoIChiKQotCQkJewotCQkJCWNhc2UgKGJ5dGUpJysnOgotCQkJCWNhc2UgKGJ5dGUpJy0nOgotCQkJCWNhc2UgKGJ5dGUpJy4nOgotCQkJCWNhc2UgKGJ5dGUpJzAnOgotCQkJCWNhc2UgKGJ5dGUpJzEnOgotCQkJCWNhc2UgKGJ5dGUpJzInOgotCQkJCWNhc2UgKGJ5dGUpJzMnOgotCQkJCWNhc2UgKGJ5dGUpJzQnOgotCQkJCWNhc2UgKGJ5dGUpJzUnOgotCQkJCWNhc2UgKGJ5dGUpJzYnOgotCQkJCWNhc2UgKGJ5dGUpJzcnOgotCQkJCWNhc2UgKGJ5dGUpJzgnOgotCQkJCWNhc2UgKGJ5dGUpJzknOgotCQkJCWNhc2UgKGJ5dGUpJ0UnOgotCQkJCWNhc2UgKGJ5dGUpJ2UnOgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgbG9uZyBSZWFkSlNPTkludGVnZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgICAgICAgICAgfQogCi0JCS8vLzxzdW1tYXJ5PgotCQkvLy8gUmVhZCBpbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYWxsIHZhbGlkIGluIEpTT04gbnVtYmVycy4gRG9lcwotCQkvLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgotCQkvLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIFN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCi0JCXsKLQkJCVN0cmluZ0J1aWxkZXIgc3RyYmxkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXdoaWxlICh0cnVlKQotCQkJewotCQkJCWJ5dGUgY2ggPSByZWFkZXIuUGVlaygpOwotCQkJCWlmICghSXNKU09OTnVtZXJpYyhjaCkpCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJc3RyYmxkLkFwcGVuZCgoY2hhcilyZWFkZXIuUmVhZCgpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKLQkJfQorICAgICAgICAgICAgc3RyaW5nIHN0ciA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICAgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIFJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIGxvbmcgUmVhZEpTT05JbnRlZ2VyKCkKLQkJewotCQkJY29udGV4dC5SZWFkKCk7Ci0JCQlpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpCi0JCQl7Ci0JCQkJUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKLQkJCX0KLQkJCVN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOwotCQkJaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQotCQkJewotCQkJCVJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7Ci0JCQl9Ci0JCQl0cnkKLQkJCXsKLQkJCQlyZXR1cm4gSW50NjQuUGFyc2Uoc3RyKTsKLQkJCX0KLQkJCWNhdGNoIChGb3JtYXRFeGNlcHRpb24pCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludDY0LlBhcnNlKHN0cik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvLy88c3VtbWFyeT4KLQkJLy8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcwotCQkvLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KLQkJLy8vPC9zdW1tYXJ5PgotCQlwcml2YXRlIGRvdWJsZSBSZWFkSlNPTkRvdWJsZSgpCi0JCXsKLQkJCWNvbnRleHQuUmVhZCgpOwotCQkJaWYgKHJlYWRlci5QZWVrKCkgPT0gUVVPVEVbMF0pCi0JCQl7Ci0JCQkJYnl0ZVtdIGFyciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOwotCQkJCWRvdWJsZSBkdWIgPSBEb3VibGUuUGFyc2UodXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsMCxhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgICAgICAvLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBkb3VibGUgUmVhZEpTT05Eb3VibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuUGVlaygpID09IFFVT1RFWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSBhcnIgPSBSZWFkSlNPTlN0cmluZyh0cnVlKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLlBhcnNlKHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAKLQkJCQlpZiAoIWNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFEb3VibGUuSXNOYU4oZHViKSAmJgotCQkJCQkhRG91YmxlLklzSW5maW5pdHkoZHViKSkKLQkJCQl7Ci0JCQkJCS8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQotCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0JCQkJCQkJCQkJCQkgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0JCQkJfQotCQkJCXJldHVybiBkdWI7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKQotCQkJCXsKLQkJCQkJLy8gVGhpcyB3aWxsIHRocm93IC0gd2Ugc2hvdWxkIGhhdmUgaGFkIGEgcXVvdGUgaWYgZXNjYXBlTnVtID09IHRydWUKLQkJCQkJUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKLQkJCQl9Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlyZXR1cm4gRG91YmxlLlBhcnNlKFJlYWRKU09OTnVtZXJpY0NoYXJzKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotCQkJCQkJCQkJCQkJICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIik7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LkVzY2FwZU51bWJlcnMoKSAmJiAhRG91YmxlLklzTmFOKGR1YikgJiYgIURvdWJsZS5Jc0luZmluaXR5KGR1YikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZHViOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgICAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5QYXJzZShSZWFkSlNPTk51bWVyaWNDaGFycygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBmZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiLCBmZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCS8vPHN1bW1hcnk+Ci0JCS8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgotCQkvLy88L3N1bW1hcnk+Ci0JCXByaXZhdGUgYnl0ZVtdIFJlYWRKU09OQmFzZTY0KCkKLQkJewotCQkJYnl0ZVtdIGIgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0JCQlpbnQgbGVuID0gYi5MZW5ndGg7Ci0JCQlpbnQgb2ZmID0gMDsKLQkJCWludCBzaXplID0gMDsKLQkJCXdoaWxlIChsZW4gPj0gNCkKLQkJCXsKLQkJCQkvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKLQkJCQlUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCi0JCQkJb2ZmICs9IDQ7Ci0JCQkJbGVuIC09IDQ7Ci0JCQkJc2l6ZSArPSAzOwotCQkJfQotCQkJLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCi0JCQkvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCi0JCQlpZiAobGVuID4gMSkKLQkJCXsKLQkJCQkvLyBEZWNvZGUgcmVtYWluZGVyCi0JCQkJVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIGxlbiwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCi0JCQkJc2l6ZSArPSBsZW4gLSAxOwotCQkJfQotCQkJLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQotCQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOwotCQkJQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTkJhc2U2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAgICAgaW50IGxlbiA9IGIuTGVuZ3RoOworICAgICAgICAgICAgaW50IG9mZiA9IDA7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAobGVuID4gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBUQmFzZTY0VXRpbHMuZGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgICAgICAgICAgICAvLyBiYXNlNjQgYnV0IGxlZ2FsIGZvciBza2lwIG9mIHJlZ3VsYXIgc3RyaW5nIHR5cGUpCisgICAgICAgICAgICBpZiAobGVuID4gMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgcmVtYWluZGVyCisgICAgICAgICAgICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIGxlbiwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgc2l6ZSArPSBsZW4gLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2FkbHkgd2UgbXVzdCBjb3B5IHRoZSBieXRlW10gKGFueSB3YXkgYXJvdW5kIHRoaXM/KQorICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgQXJyYXkuQ29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQogCi0JCXByaXZhdGUgdm9pZCBSZWFkSlNPTk9iamVjdFN0YXJ0KCkKLQkJewotCQkJY29udGV4dC5SZWFkKCk7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKTsKLQkJCVB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0RW5kKCkKLQkJewotCQkJUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7Ci0JCQlQb3BDb250ZXh0KCk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OT2JqZWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDRSk7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KIAotCQlwcml2YXRlIHZvaWQgUmVhZEpTT05BcnJheVN0YXJ0KCkKLQkJewotCQkJY29udGV4dC5SZWFkKCk7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpOwotCQkJUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7Ci0JCX0KKyAgICAgICAgcHJpdmF0ZSB2b2lkIFJlYWRKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKExCUkFDS0VUKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFJlYWRKU09OQXJyYXlFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpOwotCQkJUG9wQ29udGV4dCgpOwotCQl9CisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkSlNPTkFycmF5RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFJCUkFDS0VUKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBUTWVzc2FnZSBSZWFkTWVzc2FnZUJlZ2luKCkKLQkJewotCQkJVE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOwotCQkJUmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0JCQlpZiAoUmVhZEpTT05JbnRlZ2VyKCkgIT0gVkVSU0lPTikKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLQkJCQkJCQkJCQkJICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKLQkJCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChSZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2YXIgYnVmID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOwotCQkJbWVzc2FnZS5OYW1lID0gdXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsMCxidWYuTGVuZ3RoKTsKLQkJCW1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQltZXNzYWdlLlNlcUlEID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9CisgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgICAgICBtZXNzYWdlLlR5cGUgPSAoVE1lc3NhZ2VUeXBlKVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgbWVzc2FnZS5TZXFJRCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkKLQkJewotCQkJUmVhZEpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKLQkJewotCQkJUmVhZEpTT05PYmplY3RTdGFydCgpOwotCQkJcmV0dXJuIG5ldyBUU3RydWN0KCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKLQkJewotCQkJUmVhZEpTT05PYmplY3RFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQotCQl7Ci0JCQlURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7Ci0JCQlieXRlIGNoID0gcmVhZGVyLlBlZWsoKTsKLQkJCWlmIChjaCA9PSBSQlJBQ0VbMF0pCi0JCQl7Ci0JCQkJZmllbGQuVHlwZSA9IFRUeXBlLlN0b3A7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZmllbGQuSUQgPSAoc2hvcnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQkJUmVhZEpTT05PYmplY3RTdGFydCgpOwotCQkJCWZpZWxkLlR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotCQkJfQotCQkJcmV0dXJuIGZpZWxkOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CisgICAgICAgICAgICBieXRlIGNoID0gcmVhZGVyLlBlZWsoKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSBSQlJBQ0VbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSAoc2hvcnQpUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZEZpZWxkRW5kKCkKLQkJewotCQkJUmVhZEpTT05PYmplY3RFbmQoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRNYXAgUmVhZE1hcEJlZ2luKCkKLQkJewotCQkJVE1hcCBtYXAgPSBuZXcgVE1hcCgpOwotCQkJUmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0JCQltYXAuS2V5VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCQltYXAuVmFsdWVUeXBlID0gR2V0VHlwZUlERm9yVHlwZU5hbWUoUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLQkJCW1hcC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQlSZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0JCQlyZXR1cm4gbWFwOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUTWFwIFJlYWRNYXBCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRNYXAgbWFwID0gbmV3IFRNYXAoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAgICAgbWFwLlZhbHVlVHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBtYXAuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTk9iamVjdEVuZCgpOwotCQkJUmVhZEpTT05BcnJheUVuZCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRNYXBFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgICAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIFRMaXN0IFJlYWRMaXN0QmVnaW4oKQotCQl7Ci0JCQlUTGlzdCBsaXN0ID0gbmV3IFRMaXN0KCk7Ci0JCQlSZWFkSlNPTkFycmF5U3RhcnQoKTsKLQkJCWxpc3QuRWxlbWVudFR5cGUgPSBHZXRUeXBlSURGb3JUeXBlTmFtZShSZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotCQkJbGlzdC5Db3VudCA9IChpbnQpUmVhZEpTT05JbnRlZ2VyKCk7Ci0JCQlyZXR1cm4gbGlzdDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QoKTsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAgICAgbGlzdC5FbGVtZW50VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBsaXN0LkNvdW50ID0gKGludClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQotCQl7Ci0JCQlUU2V0IHNldCA9IG5ldyBUU2V0KCk7Ci0JCQlSZWFkSlNPTkFycmF5U3RhcnQoKTsKLQkJCXNldC5FbGVtZW50VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0JCQlzZXQuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOwotCQkJcmV0dXJuIHNldDsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFNldCBSZWFkU2V0QmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBUU2V0IHNldCA9IG5ldyBUU2V0KCk7CisgICAgICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IEdldFR5cGVJREZvclR5cGVOYW1lKFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICAgICBzZXQuQ291bnQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTZXRFbmQoKQotCQl7Ci0JCQlSZWFkSlNPTkFycmF5RW5kKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZFNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKLQkJewotCQkJcmV0dXJuIChSZWFkSlNPTkludGVnZXIoKSA9PSAwID8gZmFsc2UgOiB0cnVlKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBSZWFkQm9vbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoUmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZSk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgYnl0ZSBSZWFkQnl0ZSgpCi0JCXsKLQkJCXJldHVybiAoYnl0ZSlSZWFkSlNPTkludGVnZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQotCQl7Ci0JCQlyZXR1cm4gKHNob3J0KVJlYWRKU09OSW50ZWdlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydClSZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCi0JCXsKLQkJCXJldHVybiAoaW50KVJlYWRKU09OSW50ZWdlcigpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCi0JCXsKLQkJCXJldHVybiAobG9uZylSZWFkSlNPTkludGVnZXIoKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKVJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKLQkJewotCQkJcmV0dXJuIFJlYWRKU09ORG91YmxlKCk7Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFJlYWRKU09ORG91YmxlKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFJlYWRTdHJpbmcoKQotCQl7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKICAgICAgICAgICAgIHZhciBidWYgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0JCQlyZXR1cm4gdXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsMCxidWYuTGVuZ3RoKTsKLQkJfQorICAgICAgICAgICAgcmV0dXJuIHV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCi0JCXsKLQkJCXJldHVybiBSZWFkSlNPTkJhc2U2NCgpOwotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBSZWFkSlNPTkJhc2U2NCgpOworICAgICAgICB9CiAKLQl9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVExpc3QuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcwppbmRleCBhNjUxZWIxLi4wYzhmMjE0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTGlzdC5jcwpAQCAtMjcsMjggKzI3LDI4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRMaXN0Ci0JewotCQlwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOwotCQlwcml2YXRlIGludCBjb3VudDsKKyAgICBwdWJsaWMgc3RydWN0IFRMaXN0CisgICAgeworICAgICAgICBwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOworICAgICAgICBwcml2YXRlIGludCBjb3VudDsKIAotCQlwdWJsaWMgVExpc3QoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKLQkJCTp0aGlzKCkKLQkJewotCQkJdGhpcy5lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQl9CisgICAgICAgIHB1YmxpYyBUTGlzdChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9Ci0JCQlzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBlbGVtZW50VHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgZWxlbWVudFR5cGUgPSB2YWx1ZTsgfQorICAgICAgICB9CiAKLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gY291bnQ7IH0KLQkJCXNldCB7IGNvdW50ID0gdmFsdWU7IH0KLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBDb3VudAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gY291bnQ7IH0KKyAgICAgICAgICAgIHNldCB7IGNvdW50ID0gdmFsdWU7IH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWFwLmNzCmluZGV4IDVjOGQ2NTAuLmFiYTlkM2EgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNYXAuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1hcC5jcwpAQCAtMjcsMzYgKzI3LDM2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRNYXAKLQl7Ci0JCXByaXZhdGUgVFR5cGUga2V5VHlwZTsKLQkJcHJpdmF0ZSBUVHlwZSB2YWx1ZVR5cGU7Ci0JCXByaXZhdGUgaW50IGNvdW50OworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBUVHlwZSBrZXlUeXBlOworICAgICAgICBwcml2YXRlIFRUeXBlIHZhbHVlVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CiAKLQkJcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMua2V5VHlwZSA9IGtleVR5cGU7Ci0JCQl0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJfQorICAgICAgICBwdWJsaWMgVE1hcChUVHlwZSBrZXlUeXBlLCBUVHlwZSB2YWx1ZVR5cGUsIGludCBjb3VudCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50OworICAgICAgICB9CiAKLQkJcHVibGljIFRUeXBlIEtleVR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIGtleVR5cGU7IH0KLQkJCXNldCB7IGtleVR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBrZXlUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyBrZXlUeXBlID0gdmFsdWU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBWYWx1ZVR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHZhbHVlVHlwZTsgfQotCQkJc2V0IHsgdmFsdWVUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB2YWx1ZVR5cGU7IH0KKyAgICAgICAgICAgIHNldCB7IHZhbHVlVHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBjb3VudDsgfQotCQkJc2V0IHsgY291bnQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb3VudDsgfQorICAgICAgICAgICAgc2V0IHsgY291bnQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2UuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwppbmRleCA4ZTk2ZGE1Li4zNDgyNjNjIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZS5jcwpAQCAtMjcsMzYgKzI3LDM2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgc3RydWN0IFRNZXNzYWdlCi0JewotCQlwcml2YXRlIHN0cmluZyBuYW1lOwotCQlwcml2YXRlIFRNZXNzYWdlVHlwZSB0eXBlOwotCQlwcml2YXRlIGludCBzZXFJRDsKKyAgICBwdWJsaWMgc3RydWN0IFRNZXNzYWdlCisgICAgeworICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFRNZXNzYWdlVHlwZSB0eXBlOworICAgICAgICBwcml2YXRlIGludCBzZXFJRDsKIAotCQlwdWJsaWMgVE1lc3NhZ2Uoc3RyaW5nIG5hbWUsIFRNZXNzYWdlVHlwZSB0eXBlLCBpbnQgc2VxaWQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5zZXFJRCA9IHNlcWlkOwotCQl9CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgICAgIDp0aGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgICAgICB0aGlzLnNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLQkJCXNldCB7IG5hbWUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gbmFtZTsgfQorICAgICAgICAgICAgc2V0IHsgbmFtZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgVE1lc3NhZ2VUeXBlIFR5cGUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIHR5cGU7IH0KLQkJCXNldCB7IHR5cGUgPSB2YWx1ZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHlwZTsgfQorICAgICAgICAgICAgc2V0IHsgdHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IFNlcUlECi0JCXsKLQkJCWdldCB7IHJldHVybiBzZXFJRDsgfQotCQkJc2V0IHsgc2VxSUQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IFNlcUlECisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBzZXFJRDsgfQorICAgICAgICAgICAgc2V0IHsgc2VxSUQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmNzCmluZGV4IGFiMDdjZjYuLmM3MDkxZmUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNZXNzYWdlVHlwZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTWVzc2FnZVR5cGUuY3MKQEAgLTIxLDExICsyMSwxMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIGVudW0gVE1lc3NhZ2VUeXBlCi0JewotCQlDYWxsID0gMSwKLQkJUmVwbHkgPSAyLAotCQlFeGNlcHRpb24gPSAzLAotCQlPbmV3YXkgPSA0Ci0JfQorICAgIHB1YmxpYyBlbnVtIFRNZXNzYWdlVHlwZQorICAgIHsKKyAgICAgICAgQ2FsbCA9IDEsCisgICAgICAgIFJlcGx5ID0gMiwKKyAgICAgICAgRXhjZXB0aW9uID0gMywKKyAgICAgICAgT25ld2F5ID0gNAorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkxYzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTgzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIDxzZWUgY3JlZj0iVE11bHRpcGxleGVkUHJvY2Vzc29yIi8+IGlzIGEgPHNlZSBjcmVmPSJUUHJvY2Vzc29yIi8+IGFsbG93aW5nIGEgc2luZ2xlIDxzZWUgY3JlZj0iVGhyaWZ0LlNlcnZlci5UU2VydmVyIi8+CisgICAgLy8vIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICAgIC8vLyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gPGNvZGU+CisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAgICAvLy8gICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAvLy8gICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgICAgLy8vICAgICAgICAgbmV3IFdlYXRoZXJSZXBvcnQuUHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgICAgLy8vCisgICAgLy8vICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAvLy8gICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHNlcnZlci5zZXJ2ZSgpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogVFByb2Nlc3NvcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4gU2VydmljZVByb2Nlc3Nvck1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgVFByb2Nlc3Nvcj4oKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgICAgLy8vIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gQXJnczoKKyAgICAgICAgLy8vIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAgICAvLy8gLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVnaXN0ZXJQcm9jZXNzb3Ioc3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBGYWlsKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLCBzdHJpbmcgZXR4dCkKKyAgICAgICAgeworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihleHR5cGUsIGV0eHQpOworCisgICAgICAgICAgICBUTWVzc2FnZSBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgIG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOworICAgICAgICAgICAgYXBwZXguV3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICAgICAgICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAgIC8vLworICAgICAgICAvLy8gLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAgICAvLy8gICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisgICAgICAgIC8vLyA8cGFyYS8+CisgICAgICAgIC8vLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmCisgICAgICAgIC8vLyAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAgICAvLy8gLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgaGFzIG5vdCBiZWVuIFJlZ2lzdGVyUHJvY2Vzc29yKCllZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiAgVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKKyAgICAgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4gKi8KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGlmICgobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5DYWxsKSAmJiAobWVzc2FnZS5UeXBlICE9IFRNZXNzYWdlVHlwZS5PbmV3YXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSB0eXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBtZXNzYWdlLk5hbWUuSW5kZXhPZihUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG1lc3NhZ2UuTmFtZSArICIuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgICAgICAgICAgICAgIHN0cmluZyBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UuTmFtZS5TdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYWN0dWFsUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIGlmICghU2VydmljZVByb2Nlc3Nvck1hcC5UcnlHZXRWYWx1ZShzZXJ2aWNlTmFtZSwgb3V0IGFjdHVhbFByb2Nlc3NvcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGYWlsKG9wcm90LCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogIiArIHNlcnZpY2VOYW1lICsgIi4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICBUTWVzc2FnZSBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lLlN1YnN0cmluZyhzZXJ2aWNlTmFtZS5MZW5ndGggKyBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQpOworCisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IuUHJvY2VzcyhuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBuZXdNZXNzYWdlKSwgb3Byb3QpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gc2ltaWxhciB0byBhbGwgb3RoZXIgcHJvY2Vzc29ycworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAgICAgLy8vICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgICAgIC8vLyAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgICAgICB7CisgICAgICAgICAgICBUTWVzc2FnZSBNc2dCZWdpbjsKKworICAgICAgICAgICAgcHVibGljIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFRNZXNzYWdlIG1lc3NhZ2VCZWdpbikKKyAgICAgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5Nc2dCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBNc2dCZWdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmQ0MjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuY3MKQEAgLTAsMCArMSwxMDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAoreworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgIC8vLyBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAvLy8gdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIE5PVEU6IFRISVMgSVMgTk9UIFRPIEJFIFVTRUQgQlkgU0VSVkVSUy4KKyAgICAvLy8gT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgIC8vLyAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgIC8vLyAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgICAgLy8vCisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgLy8vICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICAgIC8vLworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICB7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlZCB0byBkZWxpbWl0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgU0VQQVJBVE9SID0gIjoiOworCisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNlcnZpY2VOYW1lOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgICAgLy8vIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPHBhcmFtcmVmIG5hbWU9InNlcnZpY2VOYW1lIi8+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICAgIC8vLyBwcmVwZW5kZWQgdG8gdGhlIG1lc3NhZ2UgaGVhZGVyIHNvIHRoYXQgdGhlIG11bHRpcGxleGluZyBzZXJ2ZXIgY2FuIGJyb2tlcgorICAgICAgICAvLy8gdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sIj5Zb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIDxzZWUgY3JlZj0iVEJpbmFyeVByb3RvY29sIi8+LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VydmljZU5hbWUiPlRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBzdHJpbmcgc2VydmljZU5hbWUpCisgICAgICAgICAgICA6IGJhc2UocHJvdG9jb2wpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRNZXNzYWdlIj5UaGUgb3JpZ2luYWwgbWVzc2FnZS48L3BhcmFtPgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSB0TWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0TWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgorICAgICAgICAgICAgICAgICAgICBiYXNlLldyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgdE1lc3NhZ2UuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0TWVzc2FnZS5TZXFJRCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJhc2UuV3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwppbmRleCBiNjg4NGM5Li5kZDdhNmUwIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCkBAIC0yNyw2NiArMjcsMTE2IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sCi0JewotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydCB0cmFuczsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sIDogSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIID0gNjQ7CiAKLQkJcHJvdGVjdGVkIFRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKQotCQl7Ci0JCQl0aGlzLnRyYW5zID0gdHJhbnM7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgdHJhbnM7CisgICAgICAgIHByb3RlY3RlZCBpbnQgcmVjdXJzaW9uTGltaXQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgcmVjdXJzaW9uRGVwdGg7CiAKLQkJcHVibGljIFRUcmFuc3BvcnQgVHJhbnNwb3J0Ci0JCXsKLQkJCWdldCB7IHJldHVybiB0cmFuczsgfQotCQl9CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50cmFucyA9IHRyYW5zOworICAgICAgICAgICAgdGhpcy5yZWN1cnNpb25MaW1pdCA9IERFRkFVTFRfUkVDVVJTSU9OX0RFUFRIOworICAgICAgICAgICAgdGhpcy5yZWN1cnNpb25EZXB0aCA9IDA7CisgICAgICAgIH0KIAotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNZXNzYWdlRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Yyk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU3RydWN0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkRW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRmllbGRTdG9wKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWFwQmVnaW4oVE1hcCBtYXApOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1hcEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVMaXN0RW5kKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVNldEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJvb2woYm9vbCBiKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCeXRlKGJ5dGUgYik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTE2KHNob3J0IGkxNik7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTMyKGludCBpMzIpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUk2NChsb25nIGk2NCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKTsKLQkJcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgcykgewotCQkJV3JpdGVCaW5hcnkoRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKSk7Ci0JCX0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCaW5hcnkoYnl0ZVtdIGIpOworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRyYW5zOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgYWJzdHJhY3QgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTWVzc2FnZUVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVFN0cnVjdCBSZWFkU3RydWN0QmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFN0cnVjdEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCk7Ci0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRGaWVsZEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVE1hcCBSZWFkTWFwQmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1hcEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVExpc3QgUmVhZExpc3RCZWdpbigpOwotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkTGlzdEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgVFNldCBSZWFkU2V0QmVnaW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZFNldEVuZCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgYm9vbCBSZWFkQm9vbCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgYnl0ZSBSZWFkQnl0ZSgpOwotCQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgUmVhZEkxNigpOwotCQlwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWRJMzIoKTsKLQkJcHVibGljIGFic3RyYWN0IGxvbmcgUmVhZEk2NCgpOwotCQlwdWJsaWMgYWJzdHJhY3QgZG91YmxlIFJlYWREb3VibGUoKTsKLQkJcHVibGljIHZpcnR1YWwgc3RyaW5nIFJlYWRTdHJpbmcoKSB7CisgICAgICAgIHB1YmxpYyBpbnQgUmVjdXJzaW9uTGltaXQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHJlY3Vyc2lvbkxpbWl0OyB9CisgICAgICAgICAgICBzZXQgeyByZWN1cnNpb25MaW1pdCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWN1cnNpb25EZXB0aCA8IHJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICAtLXJlY3Vyc2lvbkRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFucyBpcyBJRGlzcG9zYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICh0cmFucyBhcyBJRGlzcG9zYWJsZSkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWMpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVN0cnVjdEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVGaWVsZEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUZpZWxkU3RvcCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVNYXBFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlTGlzdEVuZCgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgc2V0KTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVTZXRFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVCb29sKGJvb2wgYik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVJMzIoaW50IGkzMik7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTY0KGxvbmcgaTY0KTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIGQpOworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJpbmFyeShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYik7CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRNZXNzYWdlIFJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRGaWVsZCBSZWFkRmllbGRCZWdpbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZWFkRmllbGRFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRNYXAgUmVhZE1hcEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRNYXBFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRMaXN0IFJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgUmVhZExpc3RFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRTZXQgUmVhZFNldEJlZ2luKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFJlYWRTZXRFbmQoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgUmVhZEJvb2woKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHNieXRlIFJlYWRCeXRlKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzaG9ydCBSZWFkSTE2KCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZEkzMigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBSZWFkSTY0KCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBkb3VibGUgUmVhZERvdWJsZSgpOworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKICAgICAgICAgICAgIHZhciBidWYgPSBSZWFkQmluYXJ5KCk7CiAgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQotCQlwdWJsaWMgYWJzdHJhY3QgYnl0ZVtdIFJlYWRCaW5hcnkoKTsKLQl9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBieXRlW10gUmVhZEJpbmFyeSgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjAwMDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCkBAIC0wLDAgKzEsMjYxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIDxzZWUgY3JlZj0iVFByb3RvY29sRGVjb3JhdG9yIi8+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCA8c2VlIGNyZWY9IlRQcm90b2NvbCIvPiBpbnN0YW5jZSwKKyAgICAvLy8gcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBXaGlsZSBpdCBoYXMKKyAgICAvLy8gbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQgaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsCisgICAgLy8vIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCA8c2VlIGNyZWY9IlRQcm90b2NvbCIvPi4KKyAgICAvLy8gPHBhcmEvPgorICAgIC8vLyBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAvLy8gPHNlZWFsc28gY3JlZj0iVE11bHRpcGxleGVkUHJvdG9jb2wiLz4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIFRQcm90b2NvbCBXcmFwcGVkUHJvdG9jb2w7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcm90b2NvbCI+QWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoaXMgcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworCisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4odE1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRTdHJ1Y3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luKHRTdHJ1Y3QpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJ1Y3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRCZWdpbihURmllbGQgdEZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luKHRGaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkRW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRmllbGRTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgdE1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW4odE1hcCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0QmVnaW4oVExpc3QgdExpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RCZWdpbih0TGlzdCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEJlZ2luKFRTZXQgdFNldCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW4odFNldCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVNldEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCb29sKGJvb2wgYikKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlQm9vbChiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVCeXRlKGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTE2KGkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMzIoaW50IGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMihpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlSTY0KGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlSTY0KGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVEb3VibGUoZG91YmxlIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZSh2KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcocyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5Xcml0ZUJpbmFyeShieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1lc3NhZ2VFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU3RydWN0IFJlYWRTdHJ1Y3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU3RydWN0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBURmllbGQgUmVhZEZpZWxkQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkRmllbGRFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZE1hcEVuZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdyYXBwZWRQcm90b2NvbC5SZWFkTWFwRW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgUmVhZExpc3RFbmQoKQorICAgICAgICB7CisgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBUU2V0IFJlYWRTZXRCZWdpbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBSZWFkU2V0RW5kKCkKKyAgICAgICAgeworICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLlJlYWRTZXRFbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIFJlYWRCb29sKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQm9vbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNieXRlIFJlYWRCeXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkQnl0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHNob3J0IFJlYWRJMTYoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRJMTYoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZEkzMigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEkzMigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgUmVhZEk2NCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEk2NCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBXcmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKaW5kZXggNGU0MzkzZi4uYzBmMDA3ZSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpAQCAtMjUsNDIgKzI1LDQzIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogRXhjZXB0aW9uCi0JewotCQlwdWJsaWMgY29uc3QgaW50IFVOS05PV04gPSAwOwotCQlwdWJsaWMgY29uc3QgaW50IElOVkFMSURfREFUQSA9IDE7Ci0JCXB1YmxpYyBjb25zdCBpbnQgTkVHQVRJVkVfU0laRSA9IDI7Ci0JCXB1YmxpYyBjb25zdCBpbnQgU0laRV9MSU1JVCA9IDM7Ci0JCXB1YmxpYyBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OwotCQlwdWJsaWMgY29uc3QgaW50IE5PVF9JTVBMRU1FTlRFRD0gNTsKKyAgICBwdWJsaWMgY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBVTktOT1dOID0gMDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IFNJWkVfTElNSVQgPSAzOworICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERFUFRIX0xJTUlUID0gNjsKIAotCQlwcm90ZWN0ZWQgaW50IHR5cGVfID0gVU5LTk9XTjsKKyAgICAgICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKLQkJcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbigpCi0JCQk6IGJhc2UoKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbigpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlKQotCQkJOiBiYXNlKCkKLQkJewotCQkJdHlwZV8gPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oaW50IHR5cGUpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICB0eXBlXyA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBTdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCQl0eXBlXyA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVfID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0JCQk6IGJhc2UobWVzc2FnZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0JCXsKLQkJCXJldHVybiB0eXBlXzsKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGludCBnZXRUeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHR5cGVfOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEZhY3RvcnkuY3MKaW5kZXggZWJjNzM2Ny4uNzEzNjBhMSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5LmNzCkBAIC0yNiw4ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkKLQl7Ci0JCVRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKTsKLQl9CisgICAgcHVibGljIGludGVyZmFjZSBUUHJvdG9jb2xGYWN0b3J5CisgICAgeworICAgICAgICBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKaW5kZXggODJjZDNlMy4uZDk5NWM2YyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCkBAIC0yNSw3NCArMjUsODQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAotCXsKLQkJcHVibGljIHN0YXRpYyB2b2lkIFNraXAoVFByb3RvY29sIHByb3QsIFRUeXBlIHR5cGUpCi0JCXsKLQkJCXN3aXRjaCAodHlwZSkKLQkJCXsKLQkJCQljYXNlIFRUeXBlLkJvb2w6Ci0JCQkJCXByb3QuUmVhZEJvb2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5CeXRlOgotCQkJCQlwcm90LlJlYWRCeXRlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuSTE2OgotCQkJCQlwcm90LlJlYWRJMTYoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5JMzI6Ci0JCQkJCXByb3QuUmVhZEkzMigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkk2NDoKLQkJCQkJcHJvdC5SZWFkSTY0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuRG91YmxlOgotCQkJCQlwcm90LlJlYWREb3VibGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5TdHJpbmc6Ci0JCQkJCS8vIERvbid0IHRyeSB0byBkZWNvZGUgdGhlIHN0cmluZywganVzdCBza2lwIGl0LgotCQkJCQlwcm90LlJlYWRCaW5hcnkoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5TdHJ1Y3Q6Ci0JCQkJCXByb3QuUmVhZFN0cnVjdEJlZ2luKCk7Ci0JCQkJCXdoaWxlICh0cnVlKQotCQkJCQl7Ci0JCQkJCQlURmllbGQgZmllbGQgPSBwcm90LlJlYWRGaWVsZEJlZ2luKCk7Ci0JCQkJCQlpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQotCQkJCQkJewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJU2tpcChwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCXByb3QuUmVhZEZpZWxkRW5kKCk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkU3RydWN0RW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVFR5cGUuTWFwOgotCQkJCQlUTWFwIG1hcCA9IHByb3QuUmVhZE1hcEJlZ2luKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCVNraXAocHJvdCwgbWFwLktleVR5cGUpOwotCQkJCQkJU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsKLQkJCQkJfQotCQkJCQlwcm90LlJlYWRNYXBFbmQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBUVHlwZS5TZXQ6Ci0JCQkJCVRTZXQgc2V0ID0gcHJvdC5SZWFkU2V0QmVnaW4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZXQuQ291bnQ7IGkrKykKLQkJCQkJewotCQkJCQkJU2tpcChwcm90LCBzZXQuRWxlbWVudFR5cGUpOwotCQkJCQl9Ci0JCQkJCXByb3QuUmVhZFNldEVuZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFRUeXBlLkxpc3Q6Ci0JCQkJCVRMaXN0IGxpc3QgPSBwcm90LlJlYWRMaXN0QmVnaW4oKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LkNvdW50OyBpKyspCi0JCQkJCXsKLQkJCQkJCVNraXAocHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7Ci0JCQkJCX0KLQkJCQkJcHJvdC5SZWFkTGlzdEVuZCgpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRQcm90b2NvbFV0aWwKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBTa2lwKFRQcm90b2NvbCBwcm90LCBUVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJvb2w6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRCb29sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkSTE2KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZEJpbmFyeSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGaWVsZCBmaWVsZCA9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgZmllbGQuVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFN0cnVjdEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgVE1hcCBtYXAgPSBwcm90LlJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuQ291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIG1hcC5LZXlUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa2lwKHByb3QsIG1hcC5WYWx1ZVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUU2V0IHNldCA9IHByb3QuUmVhZFNldEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgc2V0LkVsZW1lbnRUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3QuUmVhZFNldEVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFRMaXN0IGxpc3QgPSBwcm90LlJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNraXAocHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90LlJlYWRMaXN0RW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFNldC5jcwppbmRleCA2OGU1Mjg2Li5hOTE4YWI1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTZXQuY3MKQEAgLTI3LDMzICsyNywzMyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0JcHVibGljIHN0cnVjdCBUU2V0Ci0JewotCQlwcml2YXRlIFRUeXBlIGVsZW1lbnRUeXBlOwotCQlwcml2YXRlIGludCBjb3VudDsKKyAgICBwdWJsaWMgc3RydWN0IFRTZXQKKyAgICB7CisgICAgICAgIHByaXZhdGUgVFR5cGUgZWxlbWVudFR5cGU7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50OwogCi0JCXB1YmxpYyBUU2V0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMuZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJfQorICAgICAgICBwdWJsaWMgVFNldChUVHlwZSBlbGVtZW50VHlwZSwgaW50IGNvdW50KQorICAgICAgICAgICAgOnRoaXMoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNldChUTGlzdCBsaXN0KQotCQkJOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gZWxlbWVudFR5cGU7IH0KLQkJCXNldCB7IGVsZW1lbnRUeXBlID0gdmFsdWU7IH0KLQkJfQorICAgICAgICBwdWJsaWMgVFR5cGUgRWxlbWVudFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGVsZW1lbnRUeXBlOyB9CisgICAgICAgICAgICBzZXQgeyBlbGVtZW50VHlwZSA9IHZhbHVlOyB9CisgICAgICAgIH0KIAotCQlwdWJsaWMgaW50IENvdW50Ci0JCXsKLQkJCWdldCB7IHJldHVybiBjb3VudDsgfQotCQkJc2V0IHsgY291bnQgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgaW50IENvdW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjb3VudDsgfQorICAgICAgICAgICAgc2V0IHsgY291bnQgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RTdHJ1Y3QuY3MKaW5kZXggMzdkMTEwNi4uZjQ4NDRhNCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFN0cnVjdC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UU3RydWN0LmNzCkBAIC0yNywyMCArMjcsMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbAogewotCXB1YmxpYyBzdHJ1Y3QgVFN0cnVjdAotCXsKLQkJcHJpdmF0ZSBzdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIG5hbWU7CiAKLQkJcHVibGljIFRTdHJ1Y3Qoc3RyaW5nIG5hbWUpCi0JCQk6dGhpcygpCi0JCXsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTdHJ1Y3Qoc3RyaW5nIG5hbWUpCisgICAgICAgICAgICA6dGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLQkJCXNldCB7IG5hbWUgPSB2YWx1ZTsgfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWU7IH0KKyAgICAgICAgICAgIHNldCB7IG5hbWUgPSB2YWx1ZTsgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFR5cGUuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwppbmRleCBlZmM3YmVmLi45Y2U5MTVlIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UVHlwZS5jcwpAQCAtMjUsMjAgKzI1LDIwIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKLQlwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKLQl7Ci0JCVN0b3AgPSAwLAotCQlWb2lkID0gMSwKLQkJQm9vbCA9IDIsCi0JCUJ5dGUgPSAzLAotCQlEb3VibGUgPSA0LAotCQlJMTYgPSA2LAotCQlJMzIgPSA4LAotCQlJNjQgPSAxMCwKLQkJU3RyaW5nID0gMTEsCi0JCVN0cnVjdCA9IDEyLAotCQlNYXAgPSAxMywKLQkJU2V0ID0gMTQsCi0JCUxpc3QgPSAxNQotCX0KKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKaW5kZXggN2JmMjc0Ny4uMmJjMDRmMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKQEAgLTI4LDExMiArMjgsMTI4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIKLQl7Ci0JCS8qKgotCQkgKiBDb3JlIHByb2Nlc3NvcgotCQkgKi8KLQkJcHJvdGVjdGVkIFRQcm9jZXNzb3IgcHJvY2Vzc29yOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCisgICAgeworICAgICAgICAvL0F0dHJpYnV0ZXMKKyAgICAgICAgcHJvdGVjdGVkIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIHNlcnZlckV2ZW50SGFuZGxlciA9IG51bGw7CiAKLQkJLyoqCi0JCSAqIFNlcnZlciB0cmFuc3BvcnQKLQkJICovCi0JCXByb3RlY3RlZCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydDsKKyAgICAgICAgLy9NZXRob2RzCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihUU2VydmVyRXZlbnRIYW5kbGVyIHNlaCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyID0gc2VoOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIC8vTG9nIGRlbGVnYXRpb24KKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgTG9nRGVsZWdhdGUoc3RyaW5nIHN0cik7CisgICAgICAgIHByaXZhdGUgTG9nRGVsZWdhdGUgX2xvZ0RlbGVnYXRlOworICAgICAgICBwcm90ZWN0ZWQgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsgfQorICAgICAgICAgICAgc2V0IHsgX2xvZ0RlbGVnYXRlID0gKHZhbHVlICE9IG51bGwpID8gdmFsdWUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7IH0KKyAgICAgICAgfQorICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgRGVmYXVsdExvZ0RlbGVnYXRlKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZShzKTsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkKLQkJICovCi0JCXByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAvL0NvbnN0cnVjdGlvbgorICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBJbnB1dCBQcm90b2NvbCBGYWN0b3J5Ci0JCSAqLwotCQlwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCS8qKgotCQkgKiBPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeQotCQkgKi8KLQkJcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotCQlwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKLQkJcHJvdGVjdGVkIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlOworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKKyAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQkvKioKLQkJICogRGVmYXVsdCBjb25zdHJ1Y3RvcnMuCi0JCSAqLworICAgICAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0JCQk6dGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpOworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQlMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCSAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCi0JCQk6dGhpcyhwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotCQkJCSBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCSAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0JCQk6dGhpcyhwcm9jZXNzb3IsCi0JCQkJIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9Ci0KLQkJcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJICBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJewotCQkJdGhpcy5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0JCQl0aGlzLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydDsKLQkJCXRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotCQkJdGhpcy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLQkJCXRoaXMuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKLQkJCXRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotCQkJdGhpcy5sb2dEZWxlZ2F0ZSA9IGxvZ0RlbGVnYXRlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBydW4gbWV0aG9kIGZpcmVzIHVwIHRoZSBzZXJ2ZXIgYW5kIGdldHMgdGhpbmdzIGdvaW5nLgotCQkgKi8KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgU2VydmUoKTsKLQotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTdG9wKCk7Ci0KLQkJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIERlZmF1bHRMb2dEZWxlZ2F0ZShzdHJpbmcgcykKLQkJewotCQkJQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUocyk7Ci0JCX0KLQl9CisgICAgICAgIC8vQWJzdHJhY3QgSW50ZXJmYWNlCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFNlcnZlKCk7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKKyAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxZWZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCkBAIC0wLDAgKzEsNTMgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc2VydmVyIHVzZXJzIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIHByZVNlcnZlKCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBuZXcgY2xpZW50IGhhcyBjb25uZWN0ZWQgYW5kIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIG9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgZGVsZXRlQ29udGV4dChvYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGlzIGFib3V0IHRvIGNhbGwgdGhlIHByb2Nlc3Nvci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBwcm9jZXNzQ29udGV4dChvYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCk7CisgICAgfTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2ltcGxlU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKaW5kZXggMTA5OWZjMS4uNGU3ZWE5NiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MKQEAgLTI3LDEyMiArMjcsMTU0IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZwotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotCQkJOmJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkJVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJTG9nRGVsZWdhdGUgbG9nRGVsKQotCQkJOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbG9nRGVsKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLQkJCQkJCSAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLQkJCTpiYXNlKHByb2Nlc3NvciwKLQkJCQkgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0JCQkJCQkgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLQkJCTpiYXNlKHByb2Nlc3NvciwKLQkJCQkgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsCisgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLQkJCQlzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCQl3aGlsZSAoIXN0b3ApCi0JCQl7Ci0JCQkJVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOwotCQkJCVRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJCVRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCQlUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7Ci0JCQkJVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLQkJCQl0cnkKLQkJCQl7Ci0gICAgICAgICAgdXNpbmcoY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXNpbmcoaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1c2luZyAob3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgotICAgICAgICAgIGlmIChzdG9wKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2ltcGxlU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgIiArIHR0eC5HZXRUeXBlKCkuTmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKLSAgICAgICAgewotICAgICAgICAgIGxvZ0RlbGVnYXRlKHguVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogCi0JCQlpZiAoc3RvcCkKLQkJCXsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5wb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IGZhbHNlOwotCQkJfQotCQl9CisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKIAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLQkJewotCQkJc3RvcCA9IHRydWU7Ci0JCQlzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKLQkJfQotCX0KKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAob3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0cyB1bnRpbCBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByb2Nlc3NDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCmluZGV4IGIyNTdmZDguLmE0OTRjZTcgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKQEAgLTI4LDE2NyArMjgsMjY4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gMTA7Ci0JCXByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyIDogVFNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NSU5fVEhSRUFEUyA9IC0xOyAgLy8gdXNlIC5ORVQgVGhyZWFkUG9vbCBkZWZhdWx0cworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CiAKLQkJcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTp0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NSU5fVEhSRUFEUywgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KLQotCi0JCXB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOnRoaXMocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0JCQkJIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAotCQkJCSBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0JCQkJCQkJCSBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0JCQk6YmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCSAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQotCQl7Ci0gICAgICBsb2NrICh0eXBlb2YoVFRocmVhZFBvb2xTZXJ2ZXIpKQotICAgICAgewotICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyhtaW5UaHJlYWRQb29sVGhyZWFkcywgbWluVGhyZWFkUG9vbFRocmVhZHMpKQorICAgICAgICBwdWJsaWMgc3RydWN0IENvbmZpZ3VyYXRpb24KICAgICAgICAgewotICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkVycm9yOiBjb3VsZCBub3QgU2V0TWluVGhyZWFkcyBpbiBUaHJlYWRQb29sIik7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1pbldvcmtlclRocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1heFdvcmtlclRocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1pbklPVGhyZWFkczsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgTWF4SU9UaHJlYWRzOworCisgICAgICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbihpbnQgbWluID0gREVGQVVMVF9NSU5fVEhSRUFEUywgaW50IG1heCA9IERFRkFVTFRfTUFYX1RIUkVBRFMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4OworICAgICAgICAgICAgICAgIE1pbklPVGhyZWFkcyA9IG1pbjsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW5Xb3JrLCBpbnQgbWF4V29yaywgaW50IG1pbklPLCBpbnQgbWF4SU8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTWluV29ya2VyVGhyZWFkcyA9IG1pbldvcms7CisgICAgICAgICAgICAgICAgTWF4V29ya2VyVGhyZWFkcyA9IG1heFdvcms7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluSU87CisgICAgICAgICAgICAgICAgTWF4SU9UaHJlYWRzID0gbWF4SU87CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFUaHJlYWRQb29sLlNldE1heFRocmVhZHMobWF4VGhyZWFkUG9vbFRocmVhZHMsIG1heFRocmVhZFBvb2xUaHJlYWRzKSkKKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJFcnJvcjogY291bGQgbm90IFNldE1heFRocmVhZHMgaW4gVGhyZWFkUG9vbCIpOwogICAgICAgICB9Ci0JCQl9Ci0JCX0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbihtaW5UaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpLAorICAgICAgICAgICAgIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHRocmVhZENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sU2VydmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1heFRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNYXhUaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1pblRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNaW5UaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFVzZSBuZXcgVGhyZWFkUG9vbCB0aHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlIG5ldyBUaHJlYWRQb29sIHRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAotCQkJd2hpbGUgKCFzdG9wKQotCQkJewotCQkJCWludCBmYWlsdXJlQ291bnQgPSAwOwotCQkJCXRyeQotCQkJCXsKLQkJCQkJVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0JCQkJCVRocmVhZFBvb2wuUXVldWVVc2VyV29ya0l0ZW0odGhpcy5FeGVjdXRlLCBjbGllbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQkJewotCQkJCQlpZiAoc3RvcCkKLQkJCQkJewotCQkJCQkJbG9nRGVsZWdhdGUoIlRUaHJlYWRQb29sU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgIiArIHR0eC5HZXRUeXBlKCkuTmFtZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkrK2ZhaWx1cmVDb3VudDsKLQkJCQkJCWxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLQkJCQkJfQorICAgICAgICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CiAKLQkJCQl9Ci0JCQl9CisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCWlmIChzdG9wKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKLQkJCQl9Ci0JCQkJc3RvcCA9IGZhbHNlOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgotCQkvLy8gdGhyZWFkQ29udGV4dCB3aWxsIGJlIGEgVFRyYW5zcG9ydCBpbnN0YW5jZQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InRocmVhZENvbnRleHQiPjwvcGFyYW0+Ci0JCXByaXZhdGUgdm9pZCBFeGVjdXRlKE9iamVjdCB0aHJlYWRDb250ZXh0KQotCQl7Ci0JCQlUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQ7Ci0JCQlUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLQkJCVRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLQkJCVRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0JCQl0cnkKLQkJCXsKLQkJCQlpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKLQkJCQlvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotCQkJCWlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0JCQkJb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLQkJCQl3aGlsZSAocHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQotCQkJCXsKLQkJCQkJLy9rZWVwIHByb2Nlc3NpbmcgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCi0JCQl7Ci0JCQkJLy8gQXNzdW1lIHRoZSBjbGllbnQgZGllZCBhbmQgY29udGludWUgc2lsZW50bHkKLQkJCQkvL0NvbnNvbGUuV3JpdGVMaW5lKHR0eCk7Ci0JCQl9Ci0JCQkKLQkJCWNhdGNoIChFeGNlcHRpb24geCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLQkJCX0KKyAgICAgICAgICAgIGlmIChzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJCWlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotCQkJewotCQkJCWlucHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUob2JqZWN0IHRocmVhZENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotCQl7Ci0JCQlzdG9wID0gdHJ1ZTsKLQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQl9Ci0JfQorICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yOiAiICsgeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU3RvcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3AgPSB0cnVlOworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcwppbmRleCA4ZTczYmI3Li5jYzA1MWEzIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKQEAgLTI2LDIwNCArMjYsMjU3IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIgOiBUU2VydmVyCi0JewotCQlwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gMTAwOwotCQlwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOwotCQlwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyB0aHJlYWRzIChhcyBvcHBvc2VkIHRvIHRoZSBUaHJlYWRQb29sKSB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbCBzdG9wID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG1heFRocmVhZHM7CiAKLQkJcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKLQkJcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7Ci0JCXByaXZhdGUgb2JqZWN0IGNsaWVudExvY2s7Ci0JCXByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKKyAgICAgICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKKyAgICAgICAgcHJpdmF0ZSBUSGFzaFNldDxUaHJlYWQ+IGNsaWVudFRocmVhZHM7CisgICAgICAgIHByaXZhdGUgb2JqZWN0IGNsaWVudExvY2s7CisgICAgICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKIAotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLQkJCTogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLQkJCQkgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotCQkJCSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0JCQkJIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLQkJewotCQl9Ci0KLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0JCQkJIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLQkJCQkgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCi0JCXsKLQkJfQotCi0KLQkJcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJCQkJCQkJIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotCQkJCQkJCQkgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotCQkJOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAotCQkJCSB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotCQkJCSBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLQkJCQkgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotCQkJCQkJCQkgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0JCQkJCQkJCSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCQkJCQkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLQkJCQkJCQkJIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotCQkJCQkJCQkgaW50IG1heFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLQkJCTogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotCQkJCSAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQotCQl7Ci0JCQl0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOwotCQkJY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKLQkJCWNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7Ci0JCQljbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKLQkJfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgPCBtYXhUaHJlYWRzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJLy9zdGFydCB3b3JrZXIgdGhyZWFkCi0JCQkJd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoRXhlY3V0ZSkpOwotCQkJCXdvcmtlclRocmVhZC5TdGFydCgpOwotCQkJCXNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCXsKLQkJCQlsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlpbnQgZmFpbHVyZUNvdW50ID0gMDsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOwotCQkJCQlsb2NrIChjbGllbnRMb2NrKQotCQkJCQl7Ci0JCQkJCQljbGllbnRRdWV1ZS5FbnF1ZXVlKGNsaWVudCk7Ci0JCQkJCQlNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWlmIChzdG9wKQotCQkJCQl7Ci0JCQkJCQlsb2dEZWxlZ2F0ZSgiVFRocmVhZFBvb2xTZXJ2ZXIgd2FzIHNodXR0aW5nIGRvd24sIGNhdWdodCAiICsgdHR4KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCSsrZmFpbHVyZUNvdW50OwotCQkJCQkJbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzdG9wKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLQkJCQl7Ci0JCQkJCWxvZ0RlbGVnYXRlKCJUU2VydmVUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCX0KLQkJCQlzdG9wID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBMb29wcyBvbiBwcm9jZXNzaW5nIGEgY2xpZW50IGZvcmV2ZXIKLQkJLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0aHJlYWRDb250ZXh0Ij48L3BhcmFtPgotCQlwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCi0JCXsKLQkJCXdoaWxlICghc3RvcCkKLQkJCXsKLQkJCQlUVHJhbnNwb3J0IGNsaWVudDsKLQkJCQlUaHJlYWQgdDsKLQkJCQlsb2NrIChjbGllbnRMb2NrKQotCQkJCXsKLQkJCQkJLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCi0JCQkJCXdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCi0JCQkJCXsKLQkJCQkJCU1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKLQkJCQkJfQotCi0JCQkJCXdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQotCQkJCQl7Ci0JCQkJCQlNb25pdG9yLldhaXQoY2xpZW50TG9jayk7Ci0JCQkJCX0KLQotCQkJCQljbGllbnQgPSBjbGllbnRRdWV1ZS5EZXF1ZXVlKCk7Ci0JCQkJCXQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50V29ya2VyKSk7Ci0JCQkJCWNsaWVudFRocmVhZHMuQWRkKHQpOwotCQkJCX0KLQkJCQkvL3N0YXJ0IHByb2Nlc3NpbmcgcmVxdWVzdHMgZnJvbSBjbGllbnQgb24gbmV3IHRocmVhZAotCQkJCXQuU3RhcnQoY2xpZW50KTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIoT2JqZWN0IGNvbnRleHQpCi0JCXsKLQkJCVRUcmFuc3BvcnQgY2xpZW50ID0gKFRUcmFuc3BvcnQpY29udGV4dDsKLQkJCVRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOwotCQkJVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotCQkJVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKLQkJCXRyeQotCQkJewotICAgICAgICB1c2luZyAoaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgIHB1YmxpYyBpbnQgQ2xpZW50VGhyZWFkc0NvdW50CiAgICAgICAgIHsKLSAgICAgICAgICB1c2luZyAob3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8va2VlcCBwcm9jZXNzaW5nIHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjbGllbnRUaHJlYWRzLkNvdW50OyB9CiAgICAgICAgIH0KLQkJCX0KLQkJCWNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQotCQkJewotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCWxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOwotCQkJfQogCi0JCQlsb2NrIChjbGllbnRMb2NrKQotCQkJewotCQkJCWNsaWVudFRocmVhZHMuUmVtb3ZlKFRocmVhZC5DdXJyZW50VGhyZWFkKTsKLQkJCQlNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOwotCQkJfQotCQkJcmV0dXJuOwotCQl9CisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotCQl7Ci0JCQlzdG9wID0gdHJ1ZTsKLQkJCXNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotCQkJLy9jbGVhbiB1cCBhbGwgdGhlIHRocmVhZHMgbXlzZWxmCi0JCQl3b3JrZXJUaHJlYWQuQWJvcnQoKTsKLQkJCWZvcmVhY2ggKFRocmVhZCB0IGluIGNsaWVudFRocmVhZHMpCi0JCQl7Ci0JCQkJdC5BYm9ydCgpOwotCQkJfQotCQl9Ci0JfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgbG9nRGVsKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOworICAgICAgICAgICAgY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgIGNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7CisgICAgICAgICAgICBjbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgJmx0OyBtYXhUaHJlYWRzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vc3RhcnQgd29ya2VyIHRocmVhZAorICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFRocmVhZFN0YXJ0KEV4ZWN1dGUpKTsKKyAgICAgICAgICAgICAgICB3b3JrZXJUaHJlYWQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIkVycm9yLCBjb3VsZCBub3QgbGlzdGVuIG9uIFNlcnZlclRyYW5zcG9ydDogIiArIHR0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKworICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmYWlsdXJlQ291bnQgPSAwOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFF1ZXVlLkVucXVldWUoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKytmYWlsdXJlQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgICAgICAgICAgICBUaHJlYWQgdDsKKyAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBjbGllbnRRdWV1ZS5EZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50V29ya2VyKSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZHMuQWRkKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3N0YXJ0IHByb2Nlc3NpbmcgcmVxdWVzdHMgZnJvbSBjbGllbnQgb24gbmV3IHRocmVhZAorICAgICAgICAgICAgICAgIHQuU3RhcnQoY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIob2JqZWN0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KWNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgorICAgICAgICAgICAgd29ya2VyVGhyZWFkLkFib3J0KCk7CisgICAgICAgICAgICBmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQuQWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcyBiL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwppbmRleCA1N2RkMzc1Li44ZGQ3YWU1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCkBAIC0yNiwxMTEgKzI2LDEyMSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0CiB7Ci0JcHVibGljIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotCXsKLQkJcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIEV4Y2VwdGlvblR5cGUgdHlwZTsKIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKLQkJewotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKLQkJewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJfQorICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLQkJCTogYmFzZShtZXNzYWdlKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBudWxsKSAvLyBUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgc2VyaWFsaXphYmxlLCBidXQgd2UgbmV2ZXIgc2VyaWFsaXplIElubmVyRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBSZWFkKFRQcm90b2NvbCBpcHJvdCkKLQkJewotCQkJVEZpZWxkIGZpZWxkOworICAgICAgICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBSZWFkKFRQcm90b2NvbCBpcHJvdCkKKyAgICAgICAgeworICAgICAgICAgICAgVEZpZWxkIGZpZWxkOwogCi0JCQlzdHJpbmcgbWVzc2FnZSA9IG51bGw7Ci0JCQlFeGNlcHRpb25UeXBlIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICBFeGNlcHRpb25UeXBlIHR5cGUgPSBFeGNlcHRpb25UeXBlLlVua25vd247CiAKLQkJCWlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOwotCQkJd2hpbGUgKHRydWUpCi0JCQl7Ci0JCQkJZmllbGQgPSBpcHJvdC5SZWFkRmllbGRCZWdpbigpOwotCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCi0JCQkJewotCQkJCQlicmVhazsKLQkJCQl9CisgICAgICAgICAgICBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkID0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdG9wKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJc3dpdGNoIChmaWVsZC5JRCkKLQkJCQl7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0cmluZykKLQkJCQkJCXsKLQkJCQkJCQltZXNzYWdlID0gaXByb3QuUmVhZFN0cmluZygpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCVRQcm90b2NvbFV0aWwuU2tpcChpcHJvdCwgZmllbGQuVHlwZSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQotCQkJCQkJewotCQkJCQkJCXR5cGUgPSAoRXhjZXB0aW9uVHlwZSlpcHJvdC5SZWFkSTMyKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5SZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5Ta2lwKGlwcm90LCBmaWVsZC5UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5JMzIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IChFeGNlcHRpb25UeXBlKWlwcm90LlJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIGZpZWxkLlR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJaXByb3QuUmVhZEZpZWxkRW5kKCk7Ci0JCQl9CisgICAgICAgICAgICAgICAgaXByb3QuUmVhZEZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CiAKLQkJCWlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgICAgIGlwcm90LlJlYWRTdHJ1Y3RFbmQoKTsKIAotCQkJcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7Ci0JCX0KKyAgICAgICAgICAgIHJldHVybiBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpOworICAgICAgICB9CiAKLQkJcHVibGljIHZvaWQgV3JpdGUoVFByb3RvY29sIG9wcm90KQotCQl7Ci0JCQlUU3RydWN0IHN0cnVjID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwotCQkJVEZpZWxkIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZShUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTdHJ1Y3Qgc3RydWMgPSBuZXcgVFN0cnVjdCgiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgICAgICAgICBURmllbGQgZmllbGQgPSBuZXcgVEZpZWxkKCk7CiAKLQkJCW9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7CiAKLQkJCWlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCi0JCQl7Ci0JCQkJZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKLQkJCQlmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOwotCQkJCWZpZWxkLklEID0gMTsKLQkJCQlvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotCQkJCW9wcm90LldyaXRlU3RyaW5nKE1lc3NhZ2UpOwotCQkJCW9wcm90LldyaXRlRmllbGRFbmQoKTsKLQkJCX0KKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVFR5cGUuU3RyaW5nOworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gMTsKKyAgICAgICAgICAgICAgICBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlU3RyaW5nKE1lc3NhZ2UpOworICAgICAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgICAgIH0KIAotCQkJZmllbGQuTmFtZSA9ICJ0eXBlIjsKLQkJCWZpZWxkLlR5cGUgPSBUVHlwZS5JMzI7Ci0JCQlmaWVsZC5JRCA9IDI7Ci0JCQlvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGQpOwotCQkJb3Byb3QuV3JpdGVJMzIoKGludCl0eXBlKTsKLQkJCW9wcm90LldyaXRlRmllbGRFbmQoKTsKLQkJCW9wcm90LldyaXRlRmllbGRTdG9wKCk7Ci0JCQlvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpOwotCQl9CisgICAgICAgICAgICBmaWVsZC5OYW1lID0gInR5cGUiOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gMjsKKyAgICAgICAgICAgIG9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7CisgICAgICAgICAgICBvcHJvdC5Xcml0ZUkzMigoaW50KXR5cGUpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZEVuZCgpOworICAgICAgICAgICAgb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgICAgIG9wcm90LldyaXRlU3RydWN0RW5kKCk7CisgICAgICAgIH0KIAotCQlwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCi0JCXsKLQkJCVVua25vd24sCi0JCQlVbmtub3duTWV0aG9kLAotCQkJSW52YWxpZE1lc3NhZ2VUeXBlLAotCQkJV3JvbmdNZXRob2ROYW1lLAotCQkJQmFkU2VxdWVuY2VJRCwKLQkJCU1pc3NpbmdSZXN1bHQKLQkJfQotCX0KKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSUQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldCB7IHJldHVybiB0eXBlOyB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UQXN5bmNQcm9jZXNzb3IuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0MzIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RBc3luY1Byb2Nlc3Nvci5jcwpAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9jZXNzZXMgYSBtZXNzYWdlIGFzeW5jaHJvbm91c2x5LgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByb2Nlc3NlcyB0aGUgbmV4dCBwYXJ0IG9mIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlwcm90Ij5UaGUgaW5wdXQgcHJvdG9jb2wuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvcHJvdCI+VGhlIG91dHB1dCBwcm90b2NvbC48L3BhcmFtPgorICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGVyZSdzIG1vcmUgdG8gcHJvY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLjwvcmV0dXJucz4KKyAgICAgICAgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RDb250cm9sbGluZ0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UQ29udHJvbGxpbmdIYW5kbGVyLmNzCkBAIC0wLDAgKzEsMjkgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVENvbnRyb2xsaW5nSGFuZGxlcgorICAgIHsKKyAgICAgICAgVFNlcnZlciBzZXJ2ZXIgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWEyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yLmNzCmluZGV4IGRjMWI3OTUuLjcxY2U3NTUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RQcm9jZXNzb3IuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3Nvci5jcwpAQCAtMjYsOCArMjYsOCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0CiB7Ci0JcHVibGljIGludGVyZmFjZSBUUHJvY2Vzc29yCi0JewotCQlib29sIFByb2Nlc3MoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpOwotCX0KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRQcm9jZXNzb3IKKyAgICB7CisgICAgICAgIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGY2MzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzMCBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBpbnRlcmZhY2UgVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ3MjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTxQLCBIPiA6IFRQcm9jZXNzb3JGYWN0b3J5IHdoZXJlIFAgOiBUUHJvY2Vzc29yCisgICAgeworICAgICAgICBvYmplY3RbXSBoYW5kbGVyQXJncyA9IG51bGw7CisKKyAgICAgICAgcHVibGljIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KCkKKyAgICAgICAgeworICAgICAgICAgICAgaGFuZGxlckFyZ3MgPSBuZXcgb2JqZWN0WzBdOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KHBhcmFtcyBvYmplY3RbXSBoYW5kbGVyQXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyQXJncyA9IGhhbmRsZXJBcmdzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgSCBoYW5kbGVyID0gKEgpQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihIKSwgaGFuZGxlckFyZ3MpOworCisgICAgICAgICAgICBUQ29udHJvbGxpbmdIYW5kbGVyIGhhbmRsZXJTZXJ2ZXJSZWYgPSBoYW5kbGVyIGFzIFRDb250cm9sbGluZ0hhbmRsZXI7CisgICAgICAgICAgICBpZiAoaGFuZGxlclNlcnZlclJlZiAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbmRsZXJTZXJ2ZXJSZWYuc2VydmVyID0gc2VydmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZSh0eXBlb2YoUCksIG5ldyBvYmplY3RbXSB7IGhhbmRsZXIgfSkgYXMgVFByb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyODk3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkgOiBUUHJvY2Vzc29yRmFjdG9yeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvY2Vzc29yIHByb2Nlc3Nvcl87CisKKyAgICAgICAgcHVibGljIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzb3JfID0gcHJvY2Vzc29yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm9jZXNzb3IgR2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMsIFRTZXJ2ZXIgc2VydmVyID0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3Nvcl87CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI4YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpAQCAtMCwwICsxLDEyOSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2plY3RHdWlkPntFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPgorICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ0NTwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnY0LjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRztORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+CisgICAgPERlYnVnVHlwZT5wb3J0YWJsZTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sLkxpbnEiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRDb2xsZWN0aW9ucy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQWJzdHJhY3RCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlNjRVdGlscy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlckV2ZW50SGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFzeW5jUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwVGFza0FzeW5jSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNpbHZlcmxpZ2h0U29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0VmVyc2lvbml6ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTdHJlYW1UcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTZXJ2ZXJTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUTFNTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IlNlcnZlclxDb2xsZWN0aW9uc1wiIC8+CisgICAgPEZvbGRlciBJbmNsdWRlPSJTZXJ2ZXJcUHJvdG9jb2xcIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PgorICAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuV1A3LmNzcHJvaiBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5XUDcuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM4YmM4Li4wMDAwMDAwCi0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5XUDcuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjEwLjAuMjA1MDY8L1Byb2R1Y3RWZXJzaW9uPgotICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KLSAgICA8UHJvamVjdEd1aWQ+e0RGNThCREIwLTI0NTctNEE1Mi05OTgxLTY1QTBFOEI1MDgzM308L1Byb2plY3RHdWlkPgotICAgIDxQcm9qZWN0VHlwZUd1aWRzPntDMDg5QzhDMC0zMEUwLTRFMjItODBDMC1DRTA5M0YxMTFBNDN9O3tmYWUwNGVjMC0zMDFmLTExZDMtYmY0Yi0wMGMwNGY3OWVmYmN9PC9Qcm9qZWN0VHlwZUd1aWRzPgotICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+Ci0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgotICAgIDxSb290TmFtZXNwYWNlPlRocmlmdC5XUDc8L1Jvb3ROYW1lc3BhY2U+Ci0gICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQuV1A3PC9Bc3NlbWJseU5hbWU+Ci0gICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuMDwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KLSAgICA8U2lsdmVybGlnaHRWZXJzaW9uPiQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbik8L1NpbHZlcmxpZ2h0VmVyc2lvbj4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT5XaW5kb3dzUGhvbmU8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+Ci0gICAgPFRhcmdldEZyYW1ld29ya0lkZW50aWZpZXI+U2lsdmVybGlnaHQ8L1RhcmdldEZyYW1ld29ya0lkZW50aWZpZXI+Ci0gICAgPFNpbHZlcmxpZ2h0QXBwbGljYXRpb24+ZmFsc2U8L1NpbHZlcmxpZ2h0QXBwbGljYXRpb24+Ci0gICAgPFZhbGlkYXRlWGFtbD50cnVlPC9WYWxpZGF0ZVhhbWw+Ci0gICAgPFRocm93RXJyb3JzSW5WYWxpZGF0aW9uPnRydWU8L1Rocm93RXJyb3JzSW5WYWxpZGF0aW9uPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+QmluXERlYnVnPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7U0lMVkVSTElHSFQ7V0lORE9XU19QSE9ORTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4KLSAgICA8Tm9Db25maWc+dHJ1ZTwvTm9Db25maWc+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+Ci0gICAgPE91dHB1dFBhdGg+QmluXFJlbGVhc2U8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtTSUxWRVJMSUdIVDtXSU5ET1dTX1BIT05FPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxOb0NvbmZpZz50cnVlPC9Ob0NvbmZpZz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlBob25lIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LlBob25lLkludGVyb3AiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2Vtb2RlbC5XZWIiIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2luZG93cyIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9InN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLldQNy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZTY0VXRpbHMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRGaWVsZC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRMaXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNYXAuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2VUeXBlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3Nvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTdHJlYW1UcmFuc3BvcnQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRFeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnRGYWN0b3J5LmNzIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcTWljcm9zb2Z0XFNpbHZlcmxpZ2h0IGZvciBQaG9uZVwkKFRhcmdldEZyYW1ld29ya1ZlcnNpb24pXE1pY3Jvc29mdC5TaWx2ZXJsaWdodC4kKFRhcmdldEZyYW1ld29ya1Byb2ZpbGUpLk92ZXJyaWRlcy50YXJnZXRzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVxNaWNyb3NvZnRcU2lsdmVybGlnaHQgZm9yIFBob25lXCQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbilcTWljcm9zb2Z0LlNpbHZlcmxpZ2h0LkNTaGFycC50YXJnZXRzIiAvPgotICA8UHJvamVjdEV4dGVuc2lvbnMgLz4KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagppbmRleCBmODAzODMwLi5iZjY1NTY5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKQEAgLTEsNCArMSw0IEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+CiA8IS0tCiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE2LDEyMiArMTYsMTQyIEBACiAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KLSAgICA8UHJvamVjdEd1aWQ+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3RHdWlkPg0KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4NCi0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KLSAgICA8T3V0cHV0VHlwZT5MaWJyYXJ5PC9PdXRwdXRUeXBlPg0KLSAgICA8Tm9TdGFuZGFyZExpYnJhcmllcz5mYWxzZTwvTm9TdGFuZGFyZExpYnJhcmllcz4NCi0gICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ8L0Fzc2VtYmx5TmFtZT4NCi0gICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4NCi0gICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50Pg0KLSAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnQ8L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxGaWxlVXBncmFkZUZsYWdzPg0KLSAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+DQotICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+DQotICAgIDxVcGdyYWRlQmFja3VwTG9jYXRpb24gLz4NCi0gICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+DQotICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQotICAgIDxJbnN0YWxsRnJvbT5EaXNrPC9JbnN0YWxsRnJvbT4NCi0gICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+DQotICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+DQotICAgIDxVcGRhdGVJbnRlcnZhbD43PC9VcGRhdGVJbnRlcnZhbD4NCi0gICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4NCi0gICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5Pg0KLSAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPg0KLSAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+DQotICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+DQotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+DQotICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+DQotICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0Pg0KLSAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+DQotICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPg0KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4NCi0gICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4NCi0gICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4NCi0gICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCi0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPg0KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4NCi0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+DQotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiPg0KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJDb2xsZWN0aW9uc1xUSGFzaFNldC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmFzZTY0VXRpbHMuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCaW5hcnlQcm90b2NvbC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEZpZWxkLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUSlNPTlByb3RvY29sLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1hcC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE1lc3NhZ2UuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbEZhY3RvcnkuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbFV0aWwuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTdHJ1Y3QuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRUeXBlLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRTaW1wbGVTZXJ2ZXIuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBIYW5kbGVyLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU29ja2V0LmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRUcmFuc3BvcnQuY3MiIC8+DQotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+DQotICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+DQotICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPg0KLSAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5XaW5kb3dzLkluc3RhbGxlci4zLjEiPg0KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KLSAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPg0KLSAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NIQVJQLlRhcmdldHMiIC8+DQotICA8UHJvamVjdEV4dGVuc2lvbnM+DQotICAgIDxWaXN1YWxTdHVkaW8gQWxsb3dFeGlzdGluZ0ZvbGRlcj0idHJ1ZSIgLz4NCi0gIDwvUHJvamVjdEV4dGVuc2lvbnM+DQorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9qZWN0R3VpZD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdEd1aWQ+CisgICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4yMTAyMjwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxPdXRwdXRUeXBlPkxpYnJhcnk8L091dHB1dFR5cGU+CisgICAgPE5vU3RhbmRhcmRMaWJyYXJpZXM+ZmFsc2U8L05vU3RhbmRhcmRMaWJyYXJpZXM+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52My41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KKyAgICA8Um9vdE5hbWVzcGFjZT5UaHJpZnQ8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtERUJVRzwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPgorICAgIDwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4KKyAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYiIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ik5ldDM1XEV4dGVuc2lvbnNOZXQzNS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQWJzdHJhY3RCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRCYXNlNjRVdGlscy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVENvbXBhY3RQcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxURmllbGQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEpTT05Qcm90b2NvbC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTGlzdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTWFwLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRNZXNzYWdlVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2wuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRQcm90b2NvbERlY29yYXRvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xFeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFByb3RvY29sRmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUUHJvdG9jb2xVdGlsLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNlcnZlckV2ZW50SGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFNpbXBsZVNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVENvbnRyb2xsaW5nSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJURXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3IuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRCdWZmZXJlZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEZyYW1lZFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEh0dHBDbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwSGFuZGxlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNlcnZlclRyYW5zcG9ydC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFNvY2tldFZlcnNpb25pemVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU3RyZWFtVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU2VydmVyU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVExTU29ja2V0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUVHJhbnNwb3J0RmFjdG9yeS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuNSBTUDEgQ2xpZW50IFByb2ZpbGU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkQmluUGF0aClcTWljcm9zb2Z0LkNTSEFSUC5UYXJnZXRzIiAvPgorICA8UHJvamVjdEV4dGVuc2lvbnM+CisgICAgPFZpc3VhbFN0dWRpbyBBbGxvd0V4aXN0aW5nRm9sZGVyPSJ0cnVlIiAvPgorICA8L1Byb2plY3RFeHRlbnNpb25zPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4gYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuc2xuCmluZGV4IGE1OTE1ZmEuLmEyOWU0NjggMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5zbG4KKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LnNsbgpAQCAtMSwzNSArMSw0NyBAQAot77u/DQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAxMA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIlRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iDQotRW5kUHJvamVjdA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0VGVzdCIsICIuLlwuLlwuLlx0ZXN0XGNzaGFycFxUaHJpZnRUZXN0XFRocmlmdFRlc3QuY3Nwcm9qIiwgIns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9Ig0KLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9DQotCUVuZFByb2plY3RTZWN0aW9uDQotRW5kUHJvamVjdA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVNCdWlsZFRhc2siLCAiLi5cVGhyaWZ0TVNCdWlsZFRhc2tcVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIiwgIntFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9Ig0KLUVuZFByb2plY3QNCi1HbG9iYWwNCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQotCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLQlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KLQkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQotCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQotCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCi0JRW5kR2xvYmFsU2VjdGlvbg0KLUVuZEdsb2JhbA0KK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdCIsICJUaHJpZnQuY3Nwcm9qIiwgIns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnRUZXN0IiwgIi4uXHRlc3RcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0LmNzcHJvaiIsICJ7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVNCdWlsZFRhc2siLCAiLi5cVGhyaWZ0TVNCdWlsZFRhc2tcVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qIiwgIntFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJUaHJpZnQuNDUiLCAiVGhyaWZ0LjQ1LmNzcHJvaiIsICJ7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0TVZDVGVzdCIsICIuLlx0ZXN0XFRocmlmdE1WQ1Rlc3RcVGhyaWZ0TVZDVGVzdC5jc3Byb2oiLCAiezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RUMwQTAyMzEtNjZFQS00NTkzLUE3OTItQzZDQTNCQjg2NjhFfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQzBBMDIzMS02NkVBLTQ1OTMtQTc5Mi1DNkNBM0JCODY2OEV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VDMEEwMjMxLTY2RUEtNDU5My1BNzkyLUM2Q0EzQkI4NjY4RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFQkNFMzVEQS1DRjZBLTQyQkMtQTM1Ny1BOUMwOUI1MzQyOTl9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0VCQ0UzNURBLUNGNkEtNDJCQy1BMzU3LUE5QzA5QjUzNDI5OX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RUJDRTM1REEtQ0Y2QS00MkJDLUEzNTctQTlDMDlCNTM0Mjk5fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezg5MUI0NDg3LUM3QkEtNDI3RS1CQkM4LTRDNTk2QzIyOUExMH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs4OTFCNDQ4Ny1DN0JBLTQyN0UtQkJDOC00QzU5NkMyMjlBMTB9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKE1vbm9EZXZlbG9wUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQkgICAgICAgIFN0YXJ0dXBJdGVtID0gVGhyaWZ0LmNzcHJvagorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKaW5kZXggMTRiNWRiMC4uODg3MDk4OCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCkBAIC0yMiw5OSArMjIsMTczIEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0gIHB1YmxpYyBjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQotCXsKLQkJcHJpdmF0ZSBCdWZmZXJlZFN0cmVhbSBpbnB1dEJ1ZmZlcjsKLQkJcHJpdmF0ZSBCdWZmZXJlZFN0cmVhbSBvdXRwdXRCdWZmZXI7Ci0JCXByaXZhdGUgaW50IGJ1ZlNpemU7Ci0JCXByaXZhdGUgVFN0cmVhbVRyYW5zcG9ydCB0cmFuc3BvcnQ7Ci0KLQkJcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUU3RyZWFtVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJCTp0aGlzKHRyYW5zcG9ydCwgMTAyNCkKLQkJewotCi0JCX0KLQotCQlwdWJsaWMgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRTdHJlYW1UcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgYnVmU2l6ZSkKLQkJewotCQkJdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKLQkJCXRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotCQkJSW5pdEJ1ZmZlcnMoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBJbml0QnVmZmVycygpCi0JCXsKLQkJCWlmICh0cmFuc3BvcnQuSW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dEJ1ZmZlciA9IG5ldyBCdWZmZXJlZFN0cmVhbSh0cmFuc3BvcnQuSW5wdXRTdHJlYW0sIGJ1ZlNpemUpOwotCQkJfQotCQkJaWYgKHRyYW5zcG9ydC5PdXRwdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRCdWZmZXIgPSBuZXcgQnVmZmVyZWRTdHJlYW0odHJhbnNwb3J0Lk91dHB1dFN0cmVhbSwgYnVmU2l6ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0Ci0JCXsKLQkJCWdldCB7IHJldHVybiB0cmFuc3BvcnQ7IH0KLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJhbnNwb3J0LklzT3BlbjsgfQotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJCXRyYW5zcG9ydC5PcGVuKCk7Ci0JCQlJbml0QnVmZmVycygpOwotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoaW5wdXRCdWZmZXIgIT0gbnVsbCAmJiBpbnB1dEJ1ZmZlci5DYW5SZWFkKQotCQkJewotCQkJCWlucHV0QnVmZmVyLkNsb3NlKCk7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0QnVmZmVyICE9IG51bGwgJiYgb3V0cHV0QnVmZmVyLkNhbldyaXRlKQotCQkJewotCQkJCW91dHB1dEJ1ZmZlci5DbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCXJldHVybiBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotCQl7Ci0JCQlvdXRwdXRCdWZmZXIuRmx1c2goKTsKLQkJfQotCi0gICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgotICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKLQotICAgIC8vIElEaXNwb3NhYmxlCi0gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICBwdWJsaWMgY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7Ci0gICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQotICAgICAgewotICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBidWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBpbnB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIG91dHB1dEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisKKyAgICAgICAgcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwpCi0gICAgICAgICAgICBpbnB1dEJ1ZmZlci5EaXNwb3NlKCk7Ci0gICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIGlmIChidWZTaXplIDw9IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJidWZTaXplIiwgIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuIik7CisgICAgICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRoaXMuYnVmU2l6ZSA9IGJ1ZlNpemU7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydCBVbmRlcmx5aW5nVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBsZWdpdGltYXRlbHkgdGhyb3cgaGVyZSBidXQgYmUgbmljZSBhIGJpdC4KKyAgICAgICAgICAgICAgICAvLyBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICFfSXNEaXNwb3NlZCAmJiB0cmFuc3BvcnQuSXNPcGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKworICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyLkNhcGFjaXR5IDwgYnVmU2l6ZSkKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBnb3QgPSBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworCisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoaW5wdXRCdWZmZXIuQ2FwYWNpdHkpOworICAgICAgICAgICAgICAgIGludCBmaWxsZWQgPSB0cmFuc3BvcnQuUmVhZChpbnB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClpbnB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBvZmZzZXQgZnJvbSAib2ZmIiBhcmd1bWVudAorICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNhcGEgPSAoaW50KShvdXRwdXRCdWZmZXIuQ2FwYWNpdHkgLSBvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdGVTaXplID0gY2FwYSA8PSBsZW4gPyBjYXBhIDogbGVuOworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgd3JpdGVTaXplKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gd3JpdGVTaXplOworICAgICAgICAgICAgICAgIGlmICh3cml0ZVNpemUgPT0gY2FwYSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShvdXRwdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpb3V0cHV0QnVmZmVyLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGxlbiAtIG9mZnNldCA+PSBidWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5Xcml0ZShidWYsIG9mZiArIG9mZnNldCwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZlNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcmVtYWluID0gbGVuIC0gb2Zmc2V0OworICAgICAgICAgICAgaWYgKHJlbWFpbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IGJ1ZlNpemUpCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLldyaXRlKGJ1Ziwgb2ZmICsgb2Zmc2V0LCByZW1haW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydC5GbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0LkJlZ2luRmx1c2goIGNhbGxiYWNrLCBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5FbmRGbHVzaCggYXN5bmNSZXN1bHQpOworICAgICAgICB9CisKKworCisgICAgICAgIHByb3RlY3RlZCB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX0lzRGlzcG9zZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdERpc3Bvc2VkRXhjZXB0aW9uKCJUQnVmZmVyZWRUcmFuc3BvcnQiKTsKKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJvdGVjdGVkIGJvb2wgX0lzRGlzcG9zZWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCmluZGV4IDNkNDMxMTIuLmE3NDZhMzIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmNzCkBAIC0yMSwxMzUgKzIxLDE4NSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotICBwdWJsaWMgY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCi0JewotCQlwcm90ZWN0ZWQgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOwotCQlwcm90ZWN0ZWQgTWVtb3J5U3RyZWFtIHdyaXRlQnVmZmVyOwotCQlwcm90ZWN0ZWQgTWVtb3J5U3RyZWFtIHJlYWRCdWZmZXIgPSBudWxsOwotCi0JCXByaXZhdGUgY29uc3QgaW50IGhlYWRlcl9zaXplID0gNDsKLQkJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhlYWRlcl9kdW1teSA9IG5ldyBieXRlW2hlYWRlcl9zaXplXTsgLy8gdXNlZCBhcyBoZWFkZXIgcGxhY2Vob2xkZXIgd2hpbGUgaW5pdGlsaXppbmcgbmV3IHdyaXRlIGJ1ZmZlcgotCi0JCXB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkKLQkJewotCQkJcHVibGljIG92ZXJyaWRlIFRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnMpCi0JCQl7Ci0JCQkJcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KCkKLQkJewotCQkJSW5pdFdyaXRlQnVmZmVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgVEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgOiB0aGlzKCkKLQkJewotCQkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKLQkJewotCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gdHJhbnNwb3J0LklzT3BlbjsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKLQkJewotCQkJaWYgKHJlYWRCdWZmZXIgIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnQgZ290ID0gcmVhZEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotCQkJCWlmIChnb3QgPiAwKQotCQkJCXsKLQkJCQkJcmV0dXJuIGdvdDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCi0JCQlSZWFkRnJhbWUoKTsKLQotCQkJcmV0dXJuIHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQotCQl7Ci0JCQlieXRlW10gaTMycmQgPSBuZXcgYnl0ZVtoZWFkZXJfc2l6ZV07Ci0JCQl0cmFuc3BvcnQuUmVhZEFsbChpMzJyZCwgMCwgaGVhZGVyX3NpemUpOwotCQkJaW50IHNpemUgPQotCQkJCSgoaTMycmRbMF0gJiAweGZmKSA8PCAyNCkgfAotCQkJCSgoaTMycmRbMV0gJiAweGZmKSA8PCAxNikgfAotCQkJCSgoaTMycmRbMl0gJiAweGZmKSA8PCAgOCkgfAotCQkJCSgoaTMycmRbM10gJiAweGZmKSk7Ci0KLQotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKLQkJCXRyYW5zcG9ydC5SZWFkQWxsKGJ1ZmYsIDAsIHNpemUpOwotCQkJcmVhZEJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmZik7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQl3cml0ZUJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKLQkJewotCQkJYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyLkdldEJ1ZmZlcigpOwotCQkJaW50IGxlbiA9IChpbnQpd3JpdGVCdWZmZXIuTGVuZ3RoOwotCQkJaW50IGRhdGFfbGVuID0gbGVuIC0gaGVhZGVyX3NpemU7Ci0JCQlpZiAoIGRhdGFfbGVuIDwgMCApCi0JCQkJdGhyb3cgbmV3IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uICgpOyAvLyBsb2dpYyBlcnJvciBhY3R1YWxseQotCi0JCQlJbml0V3JpdGVCdWZmZXIoKTsKLQotCQkJLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQotCQkJYnVmWzBdID0gKGJ5dGUpKDB4ZmYgJiAoZGF0YV9sZW4gPj4gMjQpKTsKLQkJCWJ1ZlsxXSA9IChieXRlKSgweGZmICYgKGRhdGFfbGVuID4+IDE2KSk7Ci0JCQlidWZbMl0gPSAoYnl0ZSkoMHhmZiAmIChkYXRhX2xlbiA+PiA4KSk7Ci0JCQlidWZbM10gPSAoYnl0ZSkoMHhmZiAmIChkYXRhX2xlbikpOwotCi0JCQkvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCi0JCQl0cmFuc3BvcnQuV3JpdGUoYnVmLCAwLCBsZW4pOwotCi0JCQl0cmFuc3BvcnQuRmx1c2goKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIgKCkKLQkJewotCQkJLy8gQ3JlYXRlIG5ldyBidWZmZXIgaW5zdGFuY2UKLQkJCXdyaXRlQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKLQotCQkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgbWVzc2FnZSBoZWFkZXIgdG8gYmUgcHV0IHJpZ2h0IGJlZm9yZSBzZW5kaW5nIGl0IG91dAotCQkJd3JpdGVCdWZmZXIuV3JpdGUgKCBoZWFkZXJfZHVtbXksIDAsIGhlYWRlcl9zaXplICk7Ci0JCX0KLSAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCi0gICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwotCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgIHB1YmxpYyBjbGFzcyBURnJhbWVkVHJhbnNwb3J0IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKICAgICB7Ci0gICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQotICAgICAgewotICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSB3cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIHJlYWRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDEwMjQpOworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBoZWFkZXJCdWYgPSBuZXcgYnl0ZVtIZWFkZXJTaXplXTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5CiAgICAgICAgIHsKLSAgICAgICAgICBpZiAocmVhZEJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgcmVhZEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisKKyAgICAgICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW4gbGVnaXRpbWF0ZWx5IHRocm93IGhlcmUgYnV0IGJlIG5pY2UgYSBiaXQuCisgICAgICAgICAgICAgICAgLy8gQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiAhX0lzRGlzcG9zZWQgJiYgdHJhbnNwb3J0LklzT3BlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgaW50IGdvdCA9IHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChnb3QgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWQgYW5vdGhlciBmcmFtZSBvZiBkYXRhCisgICAgICAgICAgICBSZWFkRnJhbWUoKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBSZWFkRnJhbWUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChoZWFkZXJCdWYsIDAsIEhlYWRlclNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBEZWNvZGVGcmFtZVNpemUoaGVhZGVyQnVmKTsKKworICAgICAgICAgICAgcmVhZEJ1ZmZlci5TZXRMZW5ndGgoc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBieXRlW10gYnVmZiA9IHJlYWRCdWZmZXIuR2V0QnVmZmVyKCk7CisgICAgICAgICAgICB0cmFuc3BvcnQuUmVhZEFsbChidWZmLCAwLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIGlmICh3cml0ZUJ1ZmZlci5MZW5ndGggKyAobG9uZylsZW4gPiAobG9uZylpbnQuTWF4VmFsdWUpCisgICAgICAgICAgICAgICAgRmx1c2goKTsKKyAgICAgICAgICAgIHdyaXRlQnVmZmVyLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXIuR2V0QnVmZmVyKCk7CisgICAgICAgICAgICBpbnQgbGVuID0gKGludCl3cml0ZUJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICBpbnQgZGF0YV9sZW4gPSBsZW4gLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFfbGVuIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsgLy8gbG9naWMgZXJyb3IgYWN0dWFsbHkKKworICAgICAgICAgICAgLy8gSW5qZWN0IG1lc3NhZ2UgaGVhZGVyIGludG8gdGhlIHJlc2VydmVkIGJ1ZmZlciBzcGFjZQorICAgICAgICAgICAgRW5jb2RlRnJhbWVTaXplKGRhdGFfbGVuLCBidWYpOworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCisgICAgICAgICAgICB0cmFuc3BvcnQuV3JpdGUoYnVmLCAwLCBsZW4pOworCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworICAgICAgICAgICAgSW50ZXJuYWxGbHVzaCgpOworCisgICAgICAgICAgICB0cmFuc3BvcnQuRmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5CZWdpbkZsdXNoKCBjYWxsYmFjaywgc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuRW5kRmx1c2goIGFzeW5jUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZWVrKDAsIFNlZWtPcmlnaW4uRW5kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRW5jb2RlRnJhbWVTaXplKGludCBmcmFtZVNpemUsIGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZlswXSA9IChieXRlKSgweGZmICYgKGZyYW1lU2l6ZSA+PiAyNCkpOworICAgICAgICAgICAgYnVmWzFdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CisgICAgICAgICAgICBidWZbMl0gPSAoYnl0ZSkoMHhmZiAmIChmcmFtZVNpemUgPj4gOCkpOworICAgICAgICAgICAgYnVmWzNdID0gKGJ5dGUpKDB4ZmYgJiAoZnJhbWVTaXplKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgRGVjb2RlRnJhbWVTaXplKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsxXSAmIDB4ZmYpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgKChidWZbMl0gJiAweGZmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgKChidWZbM10gJiAweGZmKSk7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZFRyYW5zcG9ydCIpOworICAgICAgICB9CisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcwppbmRleCA3ZjA0YmU3Li42NjdmYzI1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICoJIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0xNSw4ICsxNSw4IEBACiAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAKLSAqIAorICoKKyAqCiAgKi8KIAogdXNpbmcgU3lzdGVtOwpAQCAtMjQsNTYgKzI0LDY0IEBACiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uTmV0OwogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLklPLkNvbXByZXNzaW9uOwogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUSHR0cENsaWVudCA6IFRUcmFuc3BvcnQsIElEaXNwb3NhYmxlCi0JewotCQlwcml2YXRlIHJlYWRvbmx5IFVyaSB1cmk7Ci0JCXByaXZhdGUgU3RyZWFtIGlucHV0U3RyZWFtOwotCQlwcml2YXRlIE1lbW9yeVN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgcHVibGljIGNsYXNzIFRIdHRwQ2xpZW50IDogVFRyYW5zcG9ydCwgSURpc3Bvc2FibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIHVyaTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXM7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIGlucHV0U3RyZWFtOworICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CiAKICAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0ID0gMzAwMDA7CiAKICAgICAgICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXQgPSAzMDAwMDsKIAotCQlwcml2YXRlIElEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBjdXN0b21IZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgICAgIHByaXZhdGUgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGN1c3RvbUhlYWRlcnMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKIAotICAgICAgICBwcml2YXRlIEh0dHBXZWJSZXF1ZXN0IGNvbm5lY3Rpb24gPSBudWxsOw0KICNpZiAhU0lMVkVSTElHSFQKICAgICAgICAgcHJpdmF0ZSBJV2ViUHJveHkgcHJveHkgPSBXZWJSZXF1ZXN0LkRlZmF1bHRXZWJQcm94eTsKLSNlbmRpZg0KLQ0KKyNlbmRpZgorCiAgICAgICAgIHB1YmxpYyBUSHR0cENsaWVudChVcmkgdSkKLQkJewotCQkJdXJpID0gdTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBDcmVhdGVSZXF1ZXN0KCk7Ci0JCX0KKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIGludCBDb25uZWN0VGltZW91dAotCQl7Ci0JCQlzZXQKLQkJCXsKLQkJCSAgIGNvbm5lY3RUaW1lb3V0ID0gdmFsdWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50KFVyaSB1LCBJRW51bWVyYWJsZTxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdXJpID0gdTsKKyAgICAgICAgICAgIHRoaXMuY2VydGlmaWNhdGVzID0gKGNlcnRpZmljYXRlcyA/PyBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSkuVG9BcnJheSgpOworICAgICAgICB9CiAKLQkJcHVibGljIGludCBSZWFkVGltZW91dAotCQl7Ci0JCQlzZXQKLQkJCXsKLQkJCQlyZWFkVGltZW91dCA9IHZhbHVlOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBpbnQgQ29ubmVjdFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdFRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gQ3VzdG9tSGVhZGVycwotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gY3VzdG9tSGVhZGVyczsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgaW50IFJlYWRUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbUhlYWRlcnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogI2lmICFTSUxWRVJMSUdIVAogICAgICAgICBwdWJsaWMgSVdlYlByb3h5IFByb3h5CkBAIC04NSwxNDAgKzkzLDIwNyBAQAogICAgICAgICB9CiAjZW5kaWYKIAotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlpbnB1dFN0cmVhbS5DbG9zZSgpOwotCQkJCWlucHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJCWlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQlvdXRwdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJfQotCQl9CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOwotCQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQiKTsKKyAgICAgICAgICAgIH0KIAotCQkJdHJ5Ci0JCQl7Ci0JCQkJaW50IHJldCA9IGlucHV0U3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKIAotCQkJCWlmIChyZXQgPT0gLTEpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuRW5kT2ZGaWxlLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZSIpOwotCQkJCX0KKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKLQkJCXsgCi0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpKTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCW91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KIAogI2lmICFTSUxWRVJMSUdIVAotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCi0JCXsKLQkJCXRyeSAKLQkJCXsKLQkJCQlTZW5kUmVxdWVzdCgpOwotCQkJfQotCQkJZmluYWxseQotCQkJewotCQkJCW91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLQkJCX0KLQkJfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNlbmRSZXF1ZXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJcHJpdmF0ZSB2b2lkIFNlbmRSZXF1ZXN0KCkKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIFNlbmRSZXF1ZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IENyZWF0ZVJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnMuQWRkKCJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCwgZGVmbGF0ZSIpOwogCi0JCQkJYnl0ZVtdIGRhdGEgPSBvdXRwdXRTdHJlYW0uVG9BcnJheSgpOwotCQkJCWNvbm5lY3Rpb24uQ29udGVudExlbmd0aCA9IGRhdGEuTGVuZ3RoOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkNvbnRlbnRMZW5ndGggPSBkYXRhLkxlbmd0aDsKIAotCQkJCXVzaW5nIChTdHJlYW0gcmVxdWVzdFN0cmVhbSA9IGNvbm5lY3Rpb24uR2V0UmVxdWVzdFN0cmVhbSgpKQotCQkJCXsKLQkJCQkJcmVxdWVzdFN0cmVhbS5Xcml0ZShkYXRhLCAwLCBkYXRhLkxlbmd0aCk7Ci0JCQkJCWlucHV0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXNwb25zZSgpLkdldFJlc3BvbnNlU3RyZWFtKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOwotCQkJfQotCQkJY2F0Y2ggKFdlYkV4Y2VwdGlvbiB3eCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gpOwotCQkJfQotCQl9CisgICAgICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSByZXF1ZXN0U3RyZWFtID0gY29ubmVjdGlvbi5HZXRSZXF1ZXN0U3RyZWFtKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RyZWFtLldyaXRlKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIEhUVFAgaGFuZyB0aGF0IGNhbiBoYXBwZW5zIGFmdGVyIHN1Y2Nlc3NpdmUgY2FsbHMgYnkgbWFraW5nIHN1cmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSByZWxlYXNlIHRoZSByZXNwb25zZSBhbmQgcmVzcG9uc2Ugc3RyZWFtLiBUbyBzdXBwb3J0IHRoaXMsIHdlIGNvcHkKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc3BvbnNlIHRvIGEgbWVtb3J5IHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZXNwb25zZSA9IGNvbm5lY3Rpb24uR2V0UmVzcG9uc2UoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciByZXNwb25zZVN0cmVhbSA9IHJlc3BvbnNlLkdldFJlc3BvbnNlU3RyZWFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgcmVzcG9uc2UgdG8gYSBtZW1vcnkgc3RyZWFtIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5seSBjbG9zZSB0aGUgcmVzcG9uc2UgYW5kIHJlc3BvbnNlIHN0cmVhbS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07ICAvLyBtdWx0aXBsZSBvZiA0MDk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGJ5dGVzUmVhZCA9IHJlc3BvbnNlU3RyZWFtLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKSkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uV3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5TZWVrKDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5jb2RpbmdzID0gcmVzcG9uc2UuSGVhZGVycy5HZXRWYWx1ZXMoIkNvbnRlbnQtRW5jb2RpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZ3MgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZW5jb2RpbmcgaW4gZW5jb2RpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZ3ppcCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb21wcmVzc0daaXBwZWQocmVmIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlZmxhdGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29tcHJlc3NEZWZsYXRlZChyZWYgaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFdlYkV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gsIHd4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IERlZmxhdGVTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgRGVjb21wcmVzc0daaXBwZWQocmVmIFN0cmVhbSBpbnB1dFN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgIHVzaW5nICh2YXIgZGVjb21wID0gbmV3IEdaaXBTdHJlYW0oaW5wdXRTdHJlYW0sIENvbXByZXNzaW9uTW9kZS5EZWNvbXByZXNzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWNvbXAuQ29weVRvKHRtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHRtcDsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLlNlZWsoMCwgMCk7CisgICAgICAgIH0KICNlbmRpZgotCQkJCXByaXZhdGUgSHR0cFdlYlJlcXVlc3QgQ3JlYXRlUmVxdWVzdCgpCi0JCXsKLQkJCUh0dHBXZWJSZXF1ZXN0IGNvbm5lY3Rpb24gPSAoSHR0cFdlYlJlcXVlc3QpV2ViUmVxdWVzdC5DcmVhdGUodXJpKTsKKyAgICAgICAgcHJpdmF0ZSBIdHRwV2ViUmVxdWVzdCBDcmVhdGVSZXF1ZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgSHR0cFdlYlJlcXVlc3QgY29ubmVjdGlvbiA9IChIdHRwV2ViUmVxdWVzdClXZWJSZXF1ZXN0LkNyZWF0ZSh1cmkpOworCiAKICNpZiAhU0lMVkVSTElHSFQKLQkJCWlmIChjb25uZWN0VGltZW91dCA+IDApCi0JCQl7Ci0JCQkJY29ubmVjdGlvbi5UaW1lb3V0ID0gY29ubmVjdFRpbWVvdXQ7Ci0JCQl9Ci0JCQlpZiAocmVhZFRpbWVvdXQgPiAwKQotCQkJewotCQkJCWNvbm5lY3Rpb24uUmVhZFdyaXRlVGltZW91dCA9IHJlYWRUaW1lb3V0OwotCQkJfQorICAgICAgICAgICAgLy8gQWRkaW5nIGNlcnRpZmljYXRlcyB0aHJvdWdoIGNvZGUgaXMgbm90IHN1cHBvcnRlZCB3aXRoIFdQNyBTaWx2ZXJsaWdodAorICAgICAgICAgICAgLy8gc2VlICJXaW5kb3dzIFBob25lIDcgYW5kIENlcnRpZmljYXRlc19GSU5BTF8xMjE2MTAucGRmIgorICAgICAgICAgICAgY29ubmVjdGlvbi5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoY2VydGlmaWNhdGVzKTsKKworICAgICAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLlRpbWVvdXQgPSBjb25uZWN0VGltZW91dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFkVGltZW91dCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5SZWFkV3JpdGVUaW1lb3V0ID0gcmVhZFRpbWVvdXQ7CisgICAgICAgICAgICB9CiAjZW5kaWYKLQkJCS8vIE1ha2UgdGhlIHJlcXVlc3QKLQkJCWNvbm5lY3Rpb24uQ29udGVudFR5cGUgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOwotCQkJY29ubmVjdGlvbi5BY2NlcHQgPSAiYXBwbGljYXRpb24veC10aHJpZnQiOwotCQkJY29ubmVjdGlvbi5Vc2VyQWdlbnQgPSAiQyMvVEh0dHBDbGllbnQiOwotCQkJY29ubmVjdGlvbi5NZXRob2QgPSAiUE9TVCI7CisgICAgICAgICAgICAvLyBNYWtlIHRoZSByZXF1ZXN0CisgICAgICAgICAgICBjb25uZWN0aW9uLkNvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uQWNjZXB0ID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IjsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uVXNlckFnZW50ID0gIkMjL1RIdHRwQ2xpZW50IjsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uTWV0aG9kID0gIlBPU1QiOwogI2lmICFTSUxWRVJMSUdIVAotCQkJY29ubmVjdGlvbi5Qcm90b2NvbFZlcnNpb24gPSBIdHRwVmVyc2lvbi5WZXJzaW9uMTA7CisgICAgICAgICAgICBjb25uZWN0aW9uLlByb3RvY29sVmVyc2lvbiA9IEh0dHBWZXJzaW9uLlZlcnNpb24xMDsKICNlbmRpZgogCiAgICAgICAgICAgICAvL2FkZCBjdXN0b20gaGVhZGVycyBoZXJlCi0JCQlmb3JlYWNoIChLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+IGl0ZW0gaW4gY3VzdG9tSGVhZGVycykKLQkJCXsKKyAgICAgICAgICAgIGZvcmVhY2ggKEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4gaXRlbSBpbiBjdXN0b21IZWFkZXJzKQorICAgICAgICAgICAgewogI2lmICFTSUxWRVJMSUdIVAotCQkJCWNvbm5lY3Rpb24uSGVhZGVycy5BZGQoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uSGVhZGVycy5BZGQoaXRlbS5LZXksIGl0ZW0uVmFsdWUpOwogI2Vsc2UKICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkhlYWRlcnNbaXRlbS5LZXldID0gaXRlbS5WYWx1ZTsKICNlbmRpZgotCQkJfQorICAgICAgICAgICAgfQogCiAjaWYgIVNJTFZFUkxJR0hUCiAgICAgICAgICAgICBjb25uZWN0aW9uLlByb3h5ID0gcHJveHk7CiAjZW5kaWYKIAogICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247Ci0JCX0KKyAgICAgICAgfQogCi0jaWYgU0lMVkVSTElHSFQKICAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKQEAgLTI0MSw3ICszMTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LlRvU3RyaW5nKCksIGlveCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjQ5LDcgKzMyNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpIGFzeW5jUmVzdWx0OworICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNSZXN1bHQ7CiAKICAgICAgICAgICAgICAgICBpZiAoIWZsdXNoQXN5bmNSZXN1bHQuSXNDb21wbGV0ZWQpCiAgICAgICAgICAgICAgICAgewpAQCAtMjYyLDE0ICszMzcsMTQgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IGZsdXNoQXN5bmNSZXN1bHQuQXN5bmNFeGNlcHRpb247CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgIH0KIAotCiAgICAgICAgIHByaXZhdGUgdm9pZCBHZXRSZXF1ZXN0U3RyZWFtQ2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jaHJvbm91c1Jlc3VsdCkKICAgICAgICAgewogICAgICAgICAgICAgdmFyIGZsdXNoQXN5bmNSZXN1bHQgPSAoRmx1c2hBc3luY1Jlc3VsdClhc3luY2hyb25vdXNSZXN1bHQuQXN5bmNTdGF0ZTsKQEAgLTI4NSw3ICszNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKICAgICAgICAgICAgIH0KQEAgLTMwMCw3ICszNzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CkBAIC0zMTIsOSArMzg3LDkgQEAKICAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQm9vbGVhbiBfaXNDb21wbGV0ZWQ7CiAgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgX2V2dDsKICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXN5bmNDYWxsYmFjayBfY2JNZXRob2Q7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfc3RhdGU7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfc3RhdGU7CiAKLSAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIE9iamVjdCBzdGF0ZSkKKyAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIG9iamVjdCBzdGF0ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfY2JNZXRob2QgPSBjYk1ldGhvZDsKICAgICAgICAgICAgICAgICBfc3RhdGUgPSBzdGF0ZTsKQEAgLTM0MCw3ICs0MTUsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IF9sb2NrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfbG9ja2VyID0gbmV3IG9iamVjdCgpOwogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKQEAgLTM1OCwxMiArNDMzLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pc0NvbXBsZXRlZCA9IHRydWU7IC8vMS4gc2V0IF9pc2NvbXBsZXRlZCB0byB0cnVlIAorICAgICAgICAgICAgICAgIF9pc0NvbXBsZXRlZCA9IHRydWU7IC8vMS4gc2V0IF9pc2NvbXBsZXRlZCB0byB0cnVlCiAgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQuU2V0KCk7IC8vMi4gc2V0IHRoZSBldmVudCwgd2hlbiBpdCBleGlzdHMgCisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOyAvLzIuIHNldCB0aGUgZXZlbnQsIHdoZW4gaXQgZXhpc3RzCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0zNzcsMjUgKzQ1MiwyNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSNlbmRpZgotI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgotCQlwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCi0JCS8vIElEaXNwb3NhYmxlCi0JCXByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0JCXsKLQkJCWlmICghX0lzRGlzcG9zZWQpCi0JCQl7Ci0JCQkJaWYgKGRpc3Bvc2luZykKLQkJCQl7Ci0JCQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKQotCQkJCQkJaW5wdXRTdHJlYW0uRGlzcG9zZSgpOwotCQkJCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCi0JCQkJCQlvdXRwdXRTdHJlYW0uRGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCV9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKLQkJfQotI2VuZHJlZ2lvbgotCX0KKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwSGFuZGxlci5jcwppbmRleCAwYTEwZDc5Li40MTE1ZWY5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBIYW5kbGVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cEhhbmRsZXIuY3MKQEAgLTEsMTEgKzEsMjMgQEAKLS8vCi0vLyAgVEh0dHBIYW5kbGVyLmNzCi0vLwotLy8gIEF1dGhvcnM6Ci0vLwkJRnJlZHJpayBIZWRiZXJnIDxmaGVkYmVyZ0BhdmFpbG8uY29tPgotLy8KLS8vICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQXBhY2hlIFB1YmxpYyBMaWNlbnNlCi0vLworLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKgorICovCiAKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5XZWI7CkBAIC0zMSw3ICs0Myw3IEBACiAgICAgICAgIHsKIAogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHB1YmxpYyBUSHR0cEhhbmRsZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQogICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCiAgICAgICAgIHsKQEAgLTYzLDMwICs3NSwyMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KGlucHV0LG91dHB1dCk7CiAKLSAgICAgICAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0KICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIHZhciBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpOwogCi0gICAgICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeyB9CisgICAgICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eCkKKyAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHR4KTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBib29sIElzUmV1c2FibGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OTFmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBUYXNrQXN5bmNIYW5kbGVyLmNzCkBAIC0wLDAgKzEsOTcgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgU3lzdGVtLldlYjsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEFuIGFzeW5jIHRhc2sgYmFzZWQgSFRUUCBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIHRocmlmdCBzZXJ2aWNlcy4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUSHR0cFRhc2tBc3luY0hhbmRsZXIgOiBIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQXN5bmNQcm9jZXNzb3IgX3Byb2Nlc3NvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2xGYWN0b3J5IF9pbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2xGYWN0b3J5IF9vdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVEh0dHBUYXNrQXN5bmNIYW5kbGVyIi8+IGNsYXNzCisgICAgICAgIC8vLyB1c2luZyB0aGUgPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSIvPiBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUSHR0cFRhc2tBc3luY0hhbmRsZXIoVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvcikKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MKKyAgICAgICAgLy8vIHVzaW5nIDxwYXJhbXJlZiBuYW1lPSJwcm90b2NvbEZhY3RvcnkiLz4gZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb2Nlc3NvciI+VGhlIGFzeW5jIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbi48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvY29sRmFjdG9yeSI+VGhlIHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUSHR0cFRhc2tBc3luY0hhbmRsZXIiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvY2Vzc29yIj5UaGUgYXN5bmMgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9uLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXRQcm90b2NvbEZhY3RvcnkiPlRoZSBpbnB1dCBwcm90b2NvbCBmYWN0b3J5LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0UHJvdG9jb2xGYWN0b3J5Ij5UaGUgb3V0cHV0IHByb3RvY29sIGZhY3RvcnkuPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRIdHRwVGFza0FzeW5jSGFuZGxlcihUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgICAgICAgICBfaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBQcm9jZXNzUmVxdWVzdEFzeW5jKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuSW5wdXRTdHJlYW0sIGNvbnRleHQuUmVzcG9uc2UuT3V0cHV0U3RyZWFtKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gX2lucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IF9vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChhd2FpdCBfcHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2xpZW50IGRpZWQsIGp1c3QgbW92ZSBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNkMDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuY3MKQEAgLTAsMCArMSwxMTcgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAoreworICAgIHB1YmxpYyBjbGFzcyBUTWVtb3J5QnVmZmVyIDogVFRyYW5zcG9ydAorICAgIHsKKworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBieXRlU3RyZWFtOworCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBieXRlU3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5Ub0FycmF5KCk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU2VyaWFsaXplKFRBYnN0cmFjdEJhc2UgcykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAgICAgdmFyIHAgPSBuZXcgVEJpbmFyeVByb3RvY29sKHQpOworCisgICAgICAgICAgICBzLldyaXRlKHApOworCisgICAgICAgICAgICByZXR1cm4gdC5HZXRCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVCBEZVNlcmlhbGl6ZTxUPihieXRlW10gYnVmKSB3aGVyZSBUIDogVEFic3RyYWN0QmFzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgVE1lbW9yeUJ1ZmZlcihidWYpOworICAgICAgICAgICAgdmFyIHAgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoVEJhc2UpLklzQXNzaWduYWJsZUZyb20odHlwZW9mKFQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gdHlwZW9mKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgICAgIHZhciB0ID0gQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlPFQ+KCk7CisgICAgICAgICAgICAgICAgbWV0aG9kLkludm9rZSh0LCBuZXcgb2JqZWN0W10geyBwIH0pOworICAgICAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLlN0YXRpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgICAgIHJldHVybiAoVCltZXRob2QuSW52b2tlKG51bGwsIG5ldyBvYmplY3RbXSB7IHAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlhNTBhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTExIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIGNsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgU2VydmVyTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUGlwZU5hbWU7CisgICAgICAgIHByaXZhdGUgaW50IENvbm5lY3RUaW1lb3V0OworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNlcnZlck5hbWUgPSAiLiI7CisgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgc2VydmVyLCBzdHJpbmcgcGlwZSwgaW50IHRpbWVvdXQgPSBUaW1lb3V0LkluZmluaXRlKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJOYW1lID0gKHNlcnZlciAhPSAiIikgPyBzZXJ2ZXIgOiAiLiI7CisgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGNsaWVudCAhPSBudWxsICYmIGNsaWVudC5Jc0Nvbm5lY3RlZDsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oU2VydmVyTmFtZSwgUGlwZU5hbWUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOworICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoQ29ubmVjdFRpbWVvdXQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2xpZW50LlJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKworICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuRGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIxNWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyOTYgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU8uUGlwZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LlByaW5jaXBhbDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFBpcGUgb24gdGhlIGxvY2FsaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgcGlwZUFkZHJlc3M7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbCBhc3luY01vZGUgPSB0cnVlOworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHN0cmluZyBwaXBlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5waXBlQWRkcmVzcyA9IHBpcGVBZGRyZXNzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgTGlzdGVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBFbnN1cmVQaXBlSW5zdGFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0uTWF4QWxsb3dlZFNlcnZlckluc3RhbmNlczsKKyAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IFBpcGVUcmFuc21pc3Npb25Nb2RlLkJ5dGU7CisgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhc3luY01vZGUgPyBQaXBlT3B0aW9ucy5Bc3luY2hyb25vdXMgOiBQaXBlT3B0aW9ucy5Ob25lOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBJTkJVRl9TSVpFID0gNDA5NjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgT1VUQlVGX1NJWkUgPSA0MDk2OworCisgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICB2YXIgc2VjdXJpdHkgPSBuZXcgUGlwZVNlY3VyaXR5KCk7CisgICAgICAgICAgICAgICAgc2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFBpcGVBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5SWRlbnRpZmllcihXZWxsS25vd25TaWRUeXBlLldvcmxkU2lkLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVBY2Nlc3NSaWdodHMuUmVhZCB8IFBpcGVBY2Nlc3NSaWdodHMuV3JpdGUgfCBQaXBlQWNjZXNzUmlnaHRzLlN5bmNocm9uaXplIHwgUGlwZUFjY2Vzc1JpZ2h0cy5DcmVhdGVOZXdJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlLkFsbG93CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIElOQlVGX1NJWkUsIE9VVEJVRl9TSVpFLCBzZWN1cml0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgIC8vIE1vbm8gc3RpbGwgZG9lcyBub3Qgc3VwcG9ydCBhc3luYywgZmFsbGJhY2sgdG8gc3luYworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIElOQlVGX1NJWkUsIE9VVEJVRl9TSVpFLCBzZWN1cml0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkJlZ2luV2FpdEZvckNvbm5lY3Rpb24oYXN5bmNSZXN1bHQgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRW5kV2FpdEZvckNvbm5lY3Rpb24oYXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0uV2FpdEZvckNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgdHJhbnMgPSBuZXcgU2VydmVyVHJhbnNwb3J0KHN0cmVhbSxhc3luY01vZGUpOworICAgICAgICAgICAgICAgIHN0cmVhbSA9IG51bGw7ICAvLyBwYXNzIG93bmVyc2hpcCB0byBTZXJ2ZXJUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFNlcnZlclRyYW5zcG9ydCA6IFRUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGFzeW5jTW9kZTsKKworICAgICAgICAgICAgcHVibGljIFNlcnZlclRyYW5zcG9ydChOYW1lZFBpcGVTZXJ2ZXJTdHJlYW0gc3RyZWFtLCBib29sIGFzeW5jTW9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgICAgICB0aGlzLmFzeW5jTW9kZSA9IGFzeW5jTW9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHN0cmVhbSAhPSBudWxsICYmIHN0cmVhbS5Jc0Nvbm5lY3RlZDsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBPcGVuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpblJlYWQoYnVmLCBvZmYsIGxlbiwgYXN5bmNSZXN1bHQgPT4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBzdHJlYW0uRW5kUmVhZChhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CisKKyAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZU91dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlT3V0ZXI7IC8vIHJldGhyb3cgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGlmIG5lY2Vzc2FyeSwgc2VuZCB0aGUgZGF0YSBpbiBjaHVua3MKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgICAgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgICAgICAgICAgICAgICB2YXIgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCAxNSAqIDQwOTYpOyAgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICAgICAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYXN5bmNNb2RlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gZU91dGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpbldyaXRlKGJ1Ziwgb2ZmLCBuQnl0ZXMsIGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uRW5kV3JpdGUoYXN5bmNSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBldnQuV2FpdE9uZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZU91dGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBuQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb2ZmICs9IG5CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICAgICAgbkJ5dGVzID0gTWF0aC5NaW4obGVuLCBuQnl0ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwppbmRleCAxYWQzYmQ4Li5kOGVjNjJhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwpAQCAtMjcsMTUwICsyNywxNTAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKLQl7Ci0JCS8qKgotCQkqIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0Ci0JCSovCi0JCXByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKKyAgICBwdWJsaWMgY2xhc3MgVFNlcnZlclNvY2tldCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRjcExpc3RlbmVyIHNlcnZlciA9IG51bGw7CiAKLQkJLyoqCi0JCSAqIFBvcnQgdG8gbGlzdGVuIG9uCi0JCSAqLwotCQlwcml2YXRlIGludCBwb3J0ID0gMDsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9ydCB0byBsaXN0ZW4gb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOwogCi0JCS8qKgotCQkgKiBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dCA9IDA7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBjbGllbnRUaW1lb3V0ID0gMDsKIAotCQkvKioKLQkJICogV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCi0JCSAqLwotCQlwcml2YXRlIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOwogCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotCQkgKi8KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIpCi0JCQk6dGhpcyhsaXN0ZW5lciwgMCkKLQkJewotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lciwgaW50IGNsaWVudFRpbWVvdXQpCi0JCXsKLQkJCXRoaXMuc2VydmVyID0gbGlzdGVuZXI7Ci0JCQl0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKLQkJICovCi0JCXB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0KQotCQkJOiB0aGlzKHBvcnQsIDApCi0JCXsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0Ci0JCSAqLwotCQlwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCi0JCQk6dGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSkKLQkJewotCQl9Ci0KLQkJcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cykKLQkJewotCQkJdGhpcy5wb3J0ID0gcG9ydDsKLQkJCXRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0JCQl0aGlzLnVzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKLQkJCXRyeQotCQkJewotCQkJCS8vIE1ha2Ugc2VydmVyIHNvY2tldAotCQkJCXNlcnZlciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHRoaXMucG9ydCk7Ci0JCQkJc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24pCi0JCQl7Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQotCQl7Ci0JCQkvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyLlN0YXJ0KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIG92ZXJyaWRlIFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpCi0JCXsKLQkJCWlmIChzZXJ2ZXIgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKLQkJCX0KLQkJCXRyeQotCQkJewotCQkJCVRjcENsaWVudCByZXN1bHQgPSBzZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50KCk7Ci0JCQkJVFNvY2tldCByZXN1bHQyID0gbmV3IFRTb2NrZXQocmVzdWx0KTsKLSAgICAgICAgdHJ5CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKICAgICAgICAgewotICAgICAgICAgIHJlc3VsdDIgPSBuZXcgVFNvY2tldChyZXN1bHQpOwotICAgICAgICAgIHJlc3VsdDIuVGltZW91dCA9IGNsaWVudFRpbWVvdXQ7Ci0gICAgICAgICAgaWYgKHVzZUJ1ZmZlcmVkU29ja2V0cykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgcmVzdWx0MyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQocmVzdWx0Mik7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0MzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQyOwotICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjYXRjaCAoU3lzdGVtLkV4Y2VwdGlvbikKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQogICAgICAgICB7Ci0gICAgICAgICAgLy8gSWYgYSBUU29ja2V0IHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgdGhlbiBsZXQgCi0gICAgICAgICAgLy8gaXQgZG8gcHJvcGVyIGNsZWFudXAgb2YgdGhlIFRjcENsaWVudCBvYmplY3QuCi0gICAgICAgICAgaWYgKHJlc3VsdDIgIT0gbnVsbCkKLSAgICAgICAgICAgIHJlc3VsdDIuRGlzcG9zZSgpOwotICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgotICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlyZXN1bHQpLkRpc3Bvc2UoKTsKLSAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpKTsKLSAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGp1c3QgYSBwb3J0IGxpc3RlbmluZyBzZXJ2ZXIgc29ja2V0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLmNsaWVudFRpbWVvdXQgPSBjbGllbnRUaW1lb3V0OworICAgICAgICAgICAgdGhpcy51c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BMaXN0ZW5lcih0aGlzLnBvcnQpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSwgc3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBUVHJhbnNwb3J0IEFjY2VwdEltcGwoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUU29ja2V0IHJlc3VsdDIgPSBudWxsOworICAgICAgICAgICAgICAgIFRjcENsaWVudCByZXN1bHQgPSBzZXJ2ZXIuQWNjZXB0VGNwQ2xpZW50KCk7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQyID0gbmV3IFRTb2NrZXQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Mi5UaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0IHJlc3VsdDMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHJlc3VsdDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU3lzdGVtLkV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgVFNvY2tldCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIHRoZW4gbGV0CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IGRvIHByb3BlciBjbGVhbnVwIG9mIHRoZSBUY3BDbGllbnQgb2JqZWN0LgorICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0MiAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Mi5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgLy8gIE90aGVyd2lzZSwgY2xlYW4gaXQgdXAgb3Vyc2VsdmVzLgorICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSlyZXN1bHQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5Ub1N0cmluZygpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJc2VydmVyLlN0b3AoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJCQl7Ci0JCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogIiArIGV4KTsKLQkJCQl9Ci0JCQkJc2VydmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKaW5kZXggYzk5ZDA3Zi4uZTYzODgwYiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTI1LDE5ICsyNSwyMCBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Ci0JewotCQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKLQkJcHJvdGVjdGVkIGFic3RyYWN0IFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBMaXN0ZW4oKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFRUcmFuc3BvcnQgQWNjZXB0SW1wbCgpOwogCi0JCXB1YmxpYyBUVHJhbnNwb3J0IEFjY2VwdCgpCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOwotCQkJaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0JCQkgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJhbnNwb3J0OwotCQkgfQotCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQWNjZXB0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBBY2NlcHRJbXBsKCk7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ2OWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwpAQCAtMCwwICsxLDM5MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKKy8qIG9ubHkgZm9yIHNpbHZlcmxpZ2h0ICovCisjaWYgU0lMVkVSTElHSFQKKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRTaWx2ZXJsaWdodFNvY2tldCA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICBzdGF0aWMgTWFudWFsUmVzZXRFdmVudCByZWFkQXN5bmNDb21wbGV0ZSA9IG5ldyBNYW51YWxSZXNldEV2ZW50KGZhbHNlKTsKKyAgICAgICAgcHVibGljIGV2ZW50IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4gY29ubmVjdEhhbmRsZXIgPSBudWxsOworCisgICAgICAgIC8vIG1lbW9yeSBzdHJlYW0gZm9yIHdyaXRlIGNhY2hlLgorICAgICAgICBwcml2YXRlIE1lbW9yeVN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOworICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0ID0gMDsKKworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgVFNpbHZlcmxpZ2h0U29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgVFNpbHZlcmxpZ2h0U29ja2V0KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKKworICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDcmVhdGUgYSBzdHJlYW0tYmFzZWQsIFRDUCBzb2NrZXQgdXNpbmcgdGhlIEludGVyTmV0d29yayBBZGRyZXNzIEZhbWlseS4KKyAgICAgICAgICAgIHNvY2tldCA9IG5ldyBTb2NrZXQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmssIFNvY2tldFR5cGUuU3RyZWFtLCBQcm90b2NvbFR5cGUuVGNwKTsKKyAgICAgICAgICAgIHNvY2tldC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzb2NrZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGltZW91dCA9IDEwMDAwOyAgLy8gc2V0IGEgZGVmYXVsdCB0aW1lb3V0IGZvciBXUC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBEbnNFbmRQb2ludC4gVGhlIGhvc3ROYW1lIGFuZCBwb3J0IGFyZSBwYXNzZWQgaW4gdG8gdGhpcyBtZXRob2QuCisgICAgICAgICAgICAgICAgRG5zRW5kUG9pbnQgaG9zdEVudHJ5ID0gbmV3IERuc0VuZFBvaW50KHRoaXMuaG9zdCwgdGhpcy5wb3J0KTsKKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIFNvY2tldEFzeW5jRXZlbnRBcmdzIG9iamVjdCB0byBiZSB1c2VkIGluIHRoZSBjb25uZWN0aW9uIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBTb2NrZXRBc3luY0V2ZW50QXJncyBzb2NrZXRFdmVudEFyZyA9IG5ldyBTb2NrZXRBc3luY0V2ZW50QXJncygpOworICAgICAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gaG9zdEVudHJ5OworCisgICAgICAgICAgICAgICAgLy8gSW5saW5lIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBldmVudCBoYW5kbGVyIHdhcyBpbXBsZW1lbnRlZCBpbmxpbmUgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIG1ldGhvZCBzZWxmLWNvbnRhaW5lZC4KKyAgICAgICAgICAgICAgICBzb2NrZXRFdmVudEFyZy5Db21wbGV0ZWQgKz0gbmV3IEV2ZW50SGFuZGxlcjxTb2NrZXRBc3luY0V2ZW50QXJncz4oZGVsZWdhdGUob2JqZWN0IHMsIFNvY2tldEFzeW5jRXZlbnRBcmdzIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdEhhbmRsZXIodGhpcywgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYW4gYXN5bmNocm9ub3VzIENvbm5lY3QgcmVxdWVzdCBvdmVyIHRoZSBzb2NrZXQKKyAgICAgICAgICAgICAgICBzb2NrZXQuQ29ubmVjdEFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIF90aW1lb3V0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHN0cmluZyBfZXJyb3IgPSBudWxsOworICAgICAgICAgICAgaW50IF9yZWN2Qnl0ZXMgPSAtMTsKKworICAgICAgICAgICAgaWYgKHNvY2tldCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiU29ja2V0IGlzIG5vdCBvcGVuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBTb2NrZXRBc3luY0V2ZW50QXJncyBjb250ZXh0IG9iamVjdAorICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gc29ja2V0LlJlbW90ZUVuZFBvaW50OworCisgICAgICAgICAgICAvLyBTZXR1cCB0aGUgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGRhdGEKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlNldEJ1ZmZlcihidWYsIG9mZiwgbGVuKTsKKworICAgICAgICAgICAgLy8gSW5saW5lIGV2ZW50IGhhbmRsZXIgZm9yIHRoZSBDb21wbGV0ZWQgZXZlbnQuCisgICAgICAgICAgICAvLyBOb3RlOiBUaGlzIGV2ZW4gaGFuZGxlciB3YXMgaW1wbGVtZW50ZWQgaW5saW5lIGluIG9yZGVyIHRvIG1ha2UKKyAgICAgICAgICAgIC8vIHRoaXMgbWV0aG9kIHNlbGYtY29udGFpbmVkLgorICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IG5ldyBFdmVudEhhbmRsZXI8U29ja2V0QXN5bmNFdmVudEFyZ3M+KGRlbGVnYXRlKG9iamVjdCBzLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90aW1lb3V0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAoZS5Tb2NrZXRFcnJvciA9PSBTb2NrZXRFcnJvci5TdWNjZXNzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlY3ZCeXRlcyA9IGUuQnl0ZXNUcmFuc2ZlcnJlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2Vycm9yID0gZS5Tb2NrZXRFcnJvci5Ub1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLlNldCgpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBldmVudCB0byBub25zaWduYWxlZCwgY2F1c2luZyB0aHJlYWRzIHRvIGJsb2NrCisgICAgICAgICAgICByZWFkQXN5bmNDb21wbGV0ZS5SZXNldCgpOworCisgICAgICAgICAgICAvLyBNYWtlIGFuIGFzeW5jaHJvbm91cyBSZWNlaXZlIHJlcXVlc3Qgb3ZlciB0aGUgc29ja2V0CisgICAgICAgICAgICBzb2NrZXQuUmVjZWl2ZUFzeW5jKHNvY2tldEV2ZW50QXJnKTsKKworICAgICAgICAgICAgLy8gQmxvY2sgdGhlIFVJIHRocmVhZCBmb3IgYSBtYXhpbXVtIG9mIFRJTUVPVVRfTUlMTElTRUNPTkRTIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICAgIC8vIElmIG5vIHJlc3BvbnNlIGNvbWVzIGJhY2sgd2l0aGluIHRoaXMgdGltZSB0aGVuIHByb2NlZWQKKyAgICAgICAgICAgIHJlYWRBc3luY0NvbXBsZXRlLldhaXRPbmUodGhpcy50aW1lb3V0KTsKKworICAgICAgICAgICAgaWYgKF90aW1lb3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5UaW1lZE91dCwgIlNvY2tldCByZWN2IHRpbWVvdXQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9lcnJvciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBfZXJyb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gX3JlY3ZCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBiZWdpbkZsdXNoX0NvbXBsZXRlZChvYmplY3Qgc2VuZGVyLCBTb2NrZXRBc3luY0V2ZW50QXJncyBlKQorICAgICAgICB7CisgICAgICAgICAgICBGbHVzaEFzeW5jUmVzdWx0IGZsdXNoQXN5bmNSZXN1bHQgPSBlLlVzZXJUb2tlbiBhcyBGbHVzaEFzeW5jUmVzdWx0OworICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CisgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0Lk5vdGlmeUNhbGxiYWNrV2hlbkF2YWlsYWJsZSgpOworCisgICAgICAgICAgICBpZiAoZS5Tb2NrZXRFcnJvciAhPSBTb2NrZXRFcnJvci5TdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBlLlNvY2tldEVycm9yLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIElBc3luY1Jlc3VsdCBCZWdpbkZsdXNoKEFzeW5jQ2FsbGJhY2sgY2FsbGJhY2ssIG9iamVjdCBzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCByZXF1ZXN0IGFuZCByZXNldCBidWZmZXIKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgRmx1c2hBc3luY1Jlc3VsdCBmbHVzaEFzeW5jUmVzdWx0ID0gbmV3IEZsdXNoQXN5bmNSZXN1bHQoY2FsbGJhY2ssIHN0YXRlKTsKKworICAgICAgICAgICAgU29ja2V0QXN5bmNFdmVudEFyZ3Mgc29ja2V0RXZlbnRBcmcgPSBuZXcgU29ja2V0QXN5bmNFdmVudEFyZ3MoKTsKKyAgICAgICAgICAgIHNvY2tldEV2ZW50QXJnLlJlbW90ZUVuZFBvaW50ID0gc29ja2V0LlJlbW90ZUVuZFBvaW50OworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuVXNlclRva2VuID0gZmx1c2hBc3luY1Jlc3VsdDsKKworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuQ29tcGxldGVkICs9IGJlZ2luRmx1c2hfQ29tcGxldGVkOworICAgICAgICAgICAgc29ja2V0RXZlbnRBcmcuU2V0QnVmZmVyKGRhdGEsIDAsIGRhdGEuTGVuZ3RoKTsKKworICAgICAgICAgICAgc29ja2V0LlNlbmRBc3luYyhzb2NrZXRFdmVudEFyZyk7CisKKyAgICAgICAgICAgIHJldHVybiBmbHVzaEFzeW5jUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmx1c2hBc3luY1Jlc3VsdCA9IChGbHVzaEFzeW5jUmVzdWx0KWFzeW5jUmVzdWx0OworCisgICAgICAgICAgICAgICAgaWYgKCFmbHVzaEFzeW5jUmVzdWx0LklzQ29tcGxldGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdhaXRIYW5kbGUgPSBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jV2FpdEhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgd2FpdEhhbmRsZS5XYWl0T25lKCk7CisgICAgICAgICAgICAgICAgICAgIHdhaXRIYW5kbGUuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ29weSBmcm9tIGltcGwgZnJvbSBUSHR0cENsaWVudC5jcworICAgICAgICAvLyBCYXNlZCBvbiBodHRwOi8vbXNtdnBzLmNvbS9ibG9ncy9sdWlzYWJyZXUvYXJjaGl2ZS8yMDA5LzA2LzE1L211bHRpdGhyZWFkaW5nLWltcGxlbWVudGluZy10aGUtaWFzeW5jcmVzdWx0LWludGVyZmFjZS5hc3B4CisgICAgICAgIGNsYXNzIEZsdXNoQXN5bmNSZXN1bHQgOiBJQXN5bmNSZXN1bHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKKyAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKKworICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOworICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnRlcm5hbCBieXRlW10gRGF0YSB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBTb2NrZXQgQ29ubmVjdGlvbiB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBpbnRlcm5hbCBUVHJhbnNwb3J0RXhjZXB0aW9uIEFzeW5jRXhjZXB0aW9uIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBBc3luY1N0YXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9zdGF0ZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgV2FpdEhhbmRsZSBBc3luY1dhaXRIYW5kbGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0RXZ0SGFuZGxlKCk7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2wgQ29tcGxldGVkU3luY2hyb25vdXNseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0NvbXBsZXRlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKKworICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZXZ0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9ldnQgPSBuZXcgTWFudWFsUmVzZXRFdmVudChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9pc0NvbXBsZXRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2V2dC5TZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gX2V2dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBVcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaXNDb21wbGV0ZWQgPSB0cnVlOyAvLzEuIHNldCBfaXNjb21wbGV0ZWQgdG8gdHJ1ZQorICAgICAgICAgICAgICAgIGxvY2sgKF9sb2NrZXIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2V2dCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfZXZ0LlNldCgpOyAvLzIuIHNldCB0aGUgZXZlbnQsIHdoZW4gaXQgZXhpc3RzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2NiTWV0aG9kICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfY2JNZXRob2QodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc29ja2V0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc29ja2V0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgc29ja2V0ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCisgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKworICAgICAgICAvLyBJRGlzcG9zYWJsZQorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKElEaXNwb3NhYmxlKXNvY2tldCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisjZW5kcmVnaW9uCisgICAgfQorfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwppbmRleCBjMDViNmMyLi5kOGZhMzM1IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcwpAQCAtMjYsMTQzICsyNiwyMjAgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgY2xhc3MgVFNvY2tldCA6IFRTdHJlYW1UcmFuc3BvcnQKLQl7Ci0JCXByaXZhdGUgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7Ci0JCXByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOwotCQlwcml2YXRlIGludCBwb3J0ID0gMDsKLQkJcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7Ci0KLQkJcHVibGljIFRTb2NrZXQoVGNwQ2xpZW50IGNsaWVudCkKLQkJewotCQkJdGhpcy5jbGllbnQgPSBjbGllbnQ7Ci0KLQkJCWlmIChJc09wZW4pCi0JCQl7Ci0JCQkJaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQkJb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0KSA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKLQkJewotCQl9Ci0KLQkJcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKLQkJewotCQkJdGhpcy5ob3N0ID0gaG9zdDsKLQkJCXRoaXMucG9ydCA9IHBvcnQ7Ci0JCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCi0JCQlJbml0U29ja2V0KCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCi0JCXsKLQkJCWNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKLQkJCWNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7Ci0JCQljbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGludCBUaW1lb3V0Ci0JCXsKLQkJCXNldAotCQkJewotCQkJCWNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQgPSB2YWx1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBjbGllbnQ7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3RyaW5nIEhvc3QKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIGhvc3Q7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IFBvcnQKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIHBvcnQ7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJaWYgKGNsaWVudCA9PSBudWxsKQotCQkJCXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiBjbGllbnQuQ29ubmVjdGVkOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJCWlmIChJc09wZW4pCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7Ci0JCQl9Ci0KLQkJCWlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOwotCQkJfQotCi0JCQlpZiAocG9ydCA8PSAwKQotCQkJewotCQkJCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7Ci0JCQl9Ci0KLQkJCWlmIChjbGllbnQgPT0gbnVsbCkKLQkJCXsKLQkJCQlJbml0U29ja2V0KCk7Ci0JCQl9Ci0KLQkJCWNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOwotCQkJaW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCQlvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCi0JCXsKLQkJCWJhc2UuQ2xvc2UoKTsKLQkJCWlmIChjbGllbnQgIT0gbnVsbCkKLQkJCXsKLQkJCQljbGllbnQuQ2xvc2UoKTsKLQkJCQljbGllbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLSAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCi0gICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwotCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgIHB1YmxpYyBjbGFzcyBUU29ja2V0IDogVFN0cmVhbVRyYW5zcG9ydAogICAgIHsKLSAgICAgIGlmICghX0lzRGlzcG9zZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgIHByaXZhdGUgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIGhvc3QgPSBudWxsOworICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgdGltZW91dCA9IDA7CisKKyAgICAgICAgcHVibGljIFRTb2NrZXQoVGNwQ2xpZW50IGNsaWVudCkKICAgICAgICAgewotICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICgoSURpc3Bvc2FibGUpY2xpZW50KS5EaXNwb3NlKCk7Ci0gICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgVFNvY2tldChzdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXQoc3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworCisgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOworICAgICAgICAgICAgdGhpcy5jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgdGhpcy5jbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQuQ29ubmVjdGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLCAiU29ja2V0IGFscmVhZHkgY29ubmVjdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShob3N0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocG9ydCA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IDApICAgICAgICAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYSB0aW1lb3V0IC0+IHVzZSBpdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbm5lY3RIZWxwZXIgaGxwID0gbmV3IENvbm5lY3RIZWxwZXIoY2xpZW50KTsKKyAgICAgICAgICAgICAgICBJQXN5bmNSZXN1bHQgYXN5bmNyZXMgPSBjbGllbnQuQmVnaW5Db25uZWN0KGhvc3QsIHBvcnQsIG5ldyBBc3luY0NhbGxiYWNrKENvbm5lY3RDYWxsYmFjayksIGhscCk7CisgICAgICAgICAgICAgICAgYm9vbCBiQ29ubmVjdGVkID0gYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLldhaXRPbmUodGltZW91dCkgJiYgY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgICAgICBpZiAoIWJDb25uZWN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2NrIChobHAuTXV0ZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2FsbGJhY2tEb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscC5Eb0NsZWFudXAgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlRpbWVkT3V0LCAiQ29ubmVjdCB0aW1lZCBvdXQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICB9CisKKworICAgICAgICBzdGF0aWMgdm9pZCBDb25uZWN0Q2FsbGJhY2soSUFzeW5jUmVzdWx0IGFzeW5jcmVzKQorICAgICAgICB7CisgICAgICAgICAgICBDb25uZWN0SGVscGVyIGhscCA9IGFzeW5jcmVzLkFzeW5jU3RhdGUgYXMgQ29ubmVjdEhlbHBlcjsKKyAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBobHAuQ2FsbGJhY2tEb25lID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50LkVuZENvbm5lY3QoYXN5bmNyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2F0Y2ggdGhhdCBhd2F5CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhscC5Eb0NsZWFudXApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNyZXMuQXN5bmNXYWl0SGFuZGxlLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50IGlzIElEaXNwb3NhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpaGxwLkNsaWVudCkuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pIHsgfQorICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIENvbm5lY3RIZWxwZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIG9iamVjdCBNdXRleCA9IG5ldyBvYmplY3QoKTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIERvQ2xlYW51cCA9IGZhbHNlOworICAgICAgICAgICAgcHVibGljIGJvb2wgQ2FsbGJhY2tEb25lID0gZmFsc2U7CisgICAgICAgICAgICBwdWJsaWMgVGNwQ2xpZW50IENsaWVudDsKKyAgICAgICAgICAgIHB1YmxpYyBDb25uZWN0SGVscGVyKFRjcENsaWVudCBjbGllbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOworCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX0lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpY2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCiAgICAgfQotICAgICNlbmRyZWdpb24KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0YzBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0VmVyc2lvbml6ZXIuY3MKQEAgLTAsMCArMSw3OCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OworI2lmIE5FVDQ1Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworI2VuZGlmCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBQcm9wZXJ0eUluZm8gZm9yIHRoZSBEdWFsTW9kZSBwcm9wZXJ0eSBvZiB0aGUgU3lzdGVtLk5ldC5Tb2NrZXRzLlNvY2tldCBjbGFzcy4gVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHNvY2tldHMgYXJlIGNhcGFibGUgb2YKKyAgICAvLy8gYXV0b21hdGljIElQdjQgYW5kIElQdjYgaGFuZGxpbmcuIElmIER1YWxNb2RlIGlzIHByZXNlbnQgdGhlIHNvY2tldHMgYXV0b21hdGljYWxseSBoYW5kbGUgSVB2NCBhbmQgSVB2NiBjb25uZWN0aW9ucy4KKyAgICAvLy8gSWYgdGhlIER1YWxNb2RlIGlzIG5vdCBhdmFpbGFibGUgdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIGRldGVybWluZXMgd2hldGhlciBJUHY0IG9yIElQdjYgaXMgdXNlZC4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUU29ja2V0VmVyc2lvbml6ZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUY3BDbGllbnQgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yaworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBpbnRlcm5hbCBzdGF0aWMgVGNwQ2xpZW50IENyZWF0ZVRjcENsaWVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQgPSBudWxsOworCisjaWYgTkVUNDUKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmtWNik7CisgICAgICAgICAgICBjbGllbnQuQ2xpZW50LkR1YWxNb2RlID0gdHJ1ZTsKKyNlbHNlCisgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrKTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcExpc3RlbmVyIGFjY29yZGluZyB0byB0aGUgY2FwYWJpbGl0aXRlcyBvZiB0aGUgdXNlZCBmcmFtZXdvcmsuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BMaXN0ZW5lciBDcmVhdGVUY3BMaXN0ZW5lcihJbnQzMiBwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuSVB2NkFueSwgcG9ydCk7CisgICAgICAgICAgICBsaXN0ZW5lci5TZXJ2ZXIuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKworICAgICAgICAgICAgbGlzdGVuZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCBwb3J0KTsKKyNlbmRpZgorCisgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCmluZGV4IDkwMWI2MDkuLjMwNDU5OWYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzCkBAIC0yNiwxMDMgKzI2LDEwMyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydAogewotCXB1YmxpYyBjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IDogVFRyYW5zcG9ydAotCXsKLQkJcHJvdGVjdGVkIFN0cmVhbSBpbnB1dFN0cmVhbTsKLQkJcHJvdGVjdGVkIFN0cmVhbSBvdXRwdXRTdHJlYW07Ci0KLQkJcHVibGljIFRTdHJlYW1UcmFuc3BvcnQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgVFN0cmVhbVRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0JCXsKLQkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJCXRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOwotCQl9Ci0KLQkJcHVibGljIFN0cmVhbSBPdXRwdXRTdHJlYW0KLQkJewotCQkJZ2V0IHsgcmV0dXJuIG91dHB1dFN0cmVhbTsgfQotCQl9Ci0KLQkJcHVibGljIFN0cmVhbSBJbnB1dFN0cmVhbQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gaW5wdXRTdHJlYW07IH0KLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHJ1ZTsgfQotCQl9Ci0KLQkJcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCi0JCXsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKLQkJewotCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJaW5wdXRTdHJlYW0uQ2xvc2UoKTsKLQkJCQlpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCi0JCQl7Ci0JCQkJb3V0cHV0U3RyZWFtLkNsb3NlKCk7Ci0JCQkJb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOwotCQkJfQotCi0JCQlyZXR1cm4gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKLQkJfQotCi0JCXB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCi0JCXsKLQkJCWlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbSIpOwotCQkJfQotCi0JCQlvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KLQotCQlwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCi0JCXsKLQkJCWlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbSIpOwotCQkJfQotCi0JCQlvdXRwdXRTdHJlYW0uRmx1c2goKTsKLQkJfQotCi0KLSAgICAjcmVnaW9uICIgSURpc3Bvc2FibGUgU3VwcG9ydCAiCi0gICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwotCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgIHB1YmxpYyBjbGFzcyBUU3RyZWFtVHJhbnNwb3J0IDogVFRyYW5zcG9ydAogICAgIHsKLSAgICAgIGlmICghX0lzRGlzcG9zZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gaW5wdXRTdHJlYW07CisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gb3V0cHV0U3RyZWFtOworCisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtVHJhbnNwb3J0KCkKICAgICAgICAgewotICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOwotICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgVFN0cmVhbVRyYW5zcG9ydChTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmVhbSBvdXRwdXRTdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmVhbSBPdXRwdXRTdHJlYW0KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG91dHB1dFN0cmVhbTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmVhbSBJbnB1dFN0cmVhbQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gaW5wdXRTdHJlYW07IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgT3BlbigpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0uUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCB3cml0ZSB0byBudWxsIG91dHB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwdXRTdHJlYW0uRmx1c2goKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgICNlbmRyZWdpb24KICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmE5N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NlcnZlclNvY2tldC5jcwpAQCAtMCwwICsxLDIyMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNTTCBTZXJ2ZXIgU29ja2V0IFdyYXBwZXIgQ2xhc3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVExTU2VydmVyU29ja2V0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVW5kZXJseWluZyB0Y3Agc2VydmVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgc2VydmVyID0gbnVsbDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcG9ydCB3aGVyZSB0aGUgc29ja2V0IGxpc3RlbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBwb3J0ID0gMDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaW1lb3V0IGZvciB0aGUgY3JlYXRlZCBzZXJ2ZXIgc29ja2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGNsaWVudFRpbWVvdXQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV2hldGhlciBvciBub3QgdG8gd3JhcCBuZXcgVFNvY2tldCBjb25uZWN0aW9ucyBpbiBidWZmZXJzCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgc2VydmVyY2VydGlmaWNhdGUgd2l0aCB0aGUgcHJpdmF0ZS0gYW5kIHB1YmxpYy1rZXkKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGUgc2VydmVyQ2VydGlmaWNhdGU7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBjbGllbnQgY2VydGlmaWNhdGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2xpZW50Q2VydFZhbGlkYXRvcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTZXJ2ZXJTb2NrZXQiIC8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0IHdoZXJlIHRoZSBzZXJ2ZXIgcnVucy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIDAsIGNlcnRpZmljYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU2VydmVyU29ja2V0IiAvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjbGllbnRUaW1lb3V0Ij5TZW5kL3JlY2VpdmUgdGltZW91dC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCBmYWxzZSwgY2VydGlmaWNhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTZXJ2ZXJTb2NrZXQiIC8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0IHdoZXJlIHRoZSBzZXJ2ZXIgcnVucy48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudFRpbWVvdXQiPlNlbmQvcmVjZWl2ZSB0aW1lb3V0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXNlQnVmZmVyZWRTb2NrZXRzIj5JZiBzZXQgdG8gPGM+dHJ1ZTwvYz4gW3VzZSBidWZmZXJlZCBzb2NrZXRzXS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUgb2JqZWN0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2xpZW50Q2VydFZhbGlkYXRvciI+VGhlIGNlcnRpZmljYXRlIHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgaW50IGNsaWVudFRpbWVvdXQsCisgICAgICAgICAgICBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczExIGFuZCBUbHMxMiAoVExTIDEuMSBhbmQgMS4yKSBieSBkZWZhdWx0IG9uY2Ugd2Ugc3RhcnQgdXNpbmcgLk5FVCA0LjUrLgorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2VydGlmaWNhdGUuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIllvdXIgc2VydmVyLWNlcnRpZmljYXRlIG5lZWRzIHRvIGhhdmUgYSBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyQ2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZTsKKyAgICAgICAgICAgIHRoaXMudXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgdGhpcy5jbGllbnRDZXJ0VmFsaWRhdG9yID0gY2xpZW50Q2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcExpc3RlbmVyKHRoaXMucG9ydCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyB0aGlzLnBvcnQgKyAiLiIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFN0YXJ0cyB0aGUgc2VydmVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYWNjZXB0IGlzIG5vdCBibG9ja2luZworICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogIiArIHN4Lk1lc3NhZ2UsIHN4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsYmFjayBmb3IgQWNjZXB0IEltcGxlbWVudGF0aW9uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cmV0dXJucz4KKyAgICAgICAgLy8vIFRUcmFuc3BvcnQtb2JqZWN0LgorICAgICAgICAvLy8gPC9yZXR1cm5zPgorICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgVFRyYW5zcG9ydCBBY2NlcHRJbXBsKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXMuc2VydmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRjcENsaWVudCBjbGllbnQgPSB0aGlzLnNlcnZlci5BY2NlcHRUY3BDbGllbnQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuU2VuZFRpbWVvdXQgPSBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSB0aGlzLmNsaWVudFRpbWVvdXQ7CisKKyAgICAgICAgICAgICAgICAvL3dyYXAgdGhlIGNsaWVudCBpbiBhbiBTU0wgU29ja2V0IHBhc3NpbmcgaW4gdGhlIFNTTCBjZXJ0CisgICAgICAgICAgICAgICAgVFRMU1NvY2tldCBzb2NrZXQgPSBuZXcgVFRMU1NvY2tldCgKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlckNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudENlcnRWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyk7CisKKyAgICAgICAgICAgICAgICBzb2NrZXQuc2V0dXBUTFMoKTsKKworICAgICAgICAgICAgICAgIGlmICh1c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUQnVmZmVyZWRUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvY2tldDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gU3RvcHMgdGhlIFNlcnZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIuU3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAxOWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTb2NrZXQuY3MKQEAgLTAsMCArMSwzNzEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTU0wgU29ja2V0IFdyYXBwZXIgY2xhc3MKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVExTU29ja2V0IDogVFN0cmVhbVRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW50ZXJuYWwgVENQIENsaWVudAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIFRjcENsaWVudCBjbGllbnQ7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGhvc3QKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBzdHJpbmcgaG9zdDsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCBwb3J0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGludCB0aW1lb3V0OworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEludGVybmFsIFNTTCBTdHJlYW0gZm9yIElPCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgU3NsU3RyZWFtIHNlY3VyZVN0cmVhbTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEZWZpbmVzIHdoZXRlciBvciBub3QgdGhpcyBzb2NrZXQgaXMgYSBzZXJ2ZXIgc29ja2V0PGJyLz4KKyAgICAgICAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgdGhlIFRMUy1hdXRoZW50aWNhdGlvbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGJvb2wgaXNTZXJ2ZXI7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIGNlcnRpZmljYXRlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZXIgZGVmaW5lZCBjZXJ0aWZpY2F0ZSB2YWxpZGF0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvcjsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi5TU0wgcHJvdG9jb2xzIHRvIGJlIHVzZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29sczsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgPHNlZSBjcmVmPSJUVExTU29ja2V0Ii8+IGNsYXNzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNsaWVudCI+QW4gYWxyZWFkeSBjcmVhdGVkIFRDUC1jbGllbnQ8L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc1NlcnZlciI+aWYgc2V0IHRvIDxjPnRydWU8L2M+IFtpcyBzZXJ2ZXJdLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydFZhbGlkYXRvciI+VXNlciBkZWZpbmVkIGNlcnQgdmFsaWRhdG9yLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIj5UaGUgY2FsbGJhY2sgdG8gc2VsZWN0IHdoaWNoIGNlcnRpZmljYXRlIHRvIHVzZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFByb3RvY29scyI+VGhlIFNzbFByb3RvY29scyB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3RvY29sIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUVExTU29ja2V0KAorICAgICAgICAgICAgVGNwQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIGJvb2wgaXNTZXJ2ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICAvLyBUT0RPOiBFbmFibGUgVGxzMTEgYW5kIFRsczEyIChUTFMgMS4xIGFuZCAxLjIpIGJ5IGRlZmF1bHQgb25jZSB3ZSBzdGFydCB1c2luZyAuTkVUIDQuNSsuCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICB0aGlzLmNlcnRpZmljYXRlID0gY2VydGlmaWNhdGU7CisgICAgICAgICAgICB0aGlzLmNlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICB0aGlzLnNzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKyAgICAgICAgICAgIHRoaXMuaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKyAgICAgICAgICAgIGlmIChpc1NlcnZlciAmJiBjZXJ0aWZpY2F0ZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVFRMU1NvY2tldCBuZWVkcyBjZXJ0aWZpY2F0ZSB0byBiZSB1c2VkIGZvciBzZXJ2ZXIiLCAiY2VydGlmaWNhdGUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYXNlLmlucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJhc2Uub3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIDxzZWUgY3JlZj0iVFRMU1NvY2tldCIvPiBjbGFzcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJob3N0Ij5UaGUgaG9zdCwgd2hlcmUgdGhlIHNvY2tldCBzaG91bGQgY29ubmVjdCB0by48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcnQiPlRoZSBwb3J0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGVQYXRoIj5UaGUgY2VydGlmaWNhdGUgcGF0aC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIHN0cmluZyBob3N0LAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBzdHJpbmcgY2VydGlmaWNhdGVQYXRoLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsIFg1MDlDZXJ0aWZpY2F0ZS5DcmVhdGVGcm9tQ2VydEZpbGUoY2VydGlmaWNhdGVQYXRoKSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+VGhlIGhvc3QsIHdoZXJlIHRoZSBzb2NrZXQgc2hvdWxkIGNvbm5lY3QgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgY2VydGlmaWNhdGUuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0VmFsaWRhdG9yIj5Vc2VyIGRlZmluZWQgY2VydCB2YWxpZGF0b3IuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2siPlRoZSBjYWxsYmFjayB0byBzZWxlY3Qgd2hpY2ggY2VydGlmaWNhdGUgdG8gdXNlLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3NsUHJvdG9jb2xzIj5UaGUgU3NsUHJvdG9jb2xzIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgcHJvdG9jb2wgdXNlZCBmb3IgYXV0aGVudGljYXRpb24uPC9wYXJhbT4KKyAgICAgICAgcHVibGljIFRUTFNTb2NrZXQoCisgICAgICAgICAgICBzdHJpbmcgaG9zdCwKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gbnVsbCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgICAgIDogdGhpcyhob3N0LCBwb3J0LCAwLCBjZXJ0aWZpY2F0ZSwgY2VydFZhbGlkYXRvciwgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8c2VlIGNyZWY9IlRUTFNTb2NrZXQiLz4gY2xhc3MuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaG9zdCI+VGhlIGhvc3QsIHdoZXJlIHRoZSBzb2NrZXQgc2hvdWxkIGNvbm5lY3QgdG8uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRpbWVvdXQiPlRoZSB0aW1lb3V0LjwvcGFyYW0+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSBjZXJ0aWZpY2F0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRWYWxpZGF0b3IiPlVzZXIgZGVmaW5lZCBjZXJ0IHZhbGlkYXRvci48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayI+VGhlIGNhbGxiYWNrIHRvIHNlbGVjdCB3aGljaCBjZXJ0aWZpY2F0ZSB0byB1c2UuPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xQcm90b2NvbHMiPlRoZSBTc2xQcm90b2NvbHMgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBwcm90b2NvbCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbi48L3BhcmFtPgorICAgICAgICBwdWJsaWMgVFRMU1NvY2tldCgKKyAgICAgICAgICAgIHN0cmluZyBob3N0LAorICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICBpbnQgdGltZW91dCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRscykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgdGhpcy5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgdGhpcy5jZXJ0VmFsaWRhdG9yID0gY2VydFZhbGlkYXRvcjsKKyAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgdGhlIFRjcENsaWVudCBhbmQgc2V0cyB0aGUgdGltZW91dHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFNldHMgU2VuZCAvIFJlY3YgVGltZW91dCBmb3IgSU8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGludCBUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gdGhpcy5jbGllbnQuU2VuZFRpbWVvdXQgPSB0aGlzLnRpbWVvdXQgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEdldHMgdGhlIFRDUCBjbGllbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBob3N0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RyaW5nIEhvc3QKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIHRoZSBwb3J0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgaW50IFBvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIFRDUCBDbGllbnQgaXMgQ3BlbgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFZhbGlkYXRlcyB0aGUgY2VydGlmaWNhdGVzITxici8+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2VuZGVyIj5UaGUgc2VuZGVyLW9iamVjdC48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlcnRpZmljYXRlIj5UaGUgdXNlZCBjZXJ0aWZpY2F0ZS48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNoYWluIj5UaGUgY2VydGlmaWNhdGUgY2hhaW4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzc2xWYWxpZGF0aW9uRXJyb3JzIj5BbiBlbnVtLCB3aGljaCBsaXN0cyBhbGwgdGhlIGVycm9ycyBmcm9tIHRoZSAuTkVUIGNlcnRpZmljYXRlIGNoZWNrLjwvcGFyYW0+CisgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgICAgIHByaXZhdGUgYm9vbCBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLCBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xWYWxpZGF0aW9uRXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHNzbFZhbGlkYXRpb25FcnJvcnMgPT0gU3NsUG9saWN5RXJyb3JzLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29ubmVjdHMgdG8gdGhlIGhvc3QgYW5kIHN0YXJ0cyB0aGUgcm91dGluZSwgd2hpY2ggc2V0cyB1cCB0aGUgVExTCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5pdFNvY2tldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGllbnQuQ29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAgICAgc2V0dXBUTFMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMgYSBUTFMtc3RyZWFtIGFuZCBsYXlzIGl0IG92ZXIgdGhlIGV4aXN0aW5nIHNvY2tldAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cFRMUygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIHZhbGlkYXRvciA9IHRoaXMuY2VydFZhbGlkYXRvciA/PyBEZWZhdWx0Q2VydGlmaWNhdGVWYWxpZGF0b3I7CisKKyAgICAgICAgICAgIGlmICh0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbSA9IG5ldyBTc2xTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LkdldFN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzU2VydmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyKHRoaXMuY2VydGlmaWNhdGUsIHRoaXMuY2VydFZhbGlkYXRvciAhPSBudWxsLCBzc2xQcm90b2NvbHMsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjZXJ0cyA9IGNlcnRpZmljYXRlICE9IG51bGwgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7IGNlcnRpZmljYXRlIH0gOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudChob3N0LCBjZXJ0cywgc3NsUHJvdG9jb2xzLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSB0aGlzLnNlY3VyZVN0cmVhbTsKKyAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IHRoaXMuc2VjdXJlU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2xvc2VzIHRoZSBTU0wgU29ja2V0CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYmFzZS5DbG9zZSgpOworICAgICAgICAgICAgaWYgKHRoaXMuY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0aGlzLnNlY3VyZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhpcy5zZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcwppbmRleCBjMDNlOWMyLi41ZTRhYzIyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcwpAQCAtMjIsNzcgKzIyLDEyNSBAQAogICovCiAKIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5JTzsKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCi0JewotCQlwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc09wZW4KLQkJewotCQkJZ2V0OwotCQl9CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQgOiBJRGlzcG9zYWJsZQorICAgIHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldDsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBib29sIFBlZWsoKQotCQl7Ci0JCQlyZXR1cm4gSXNPcGVuOwotCQl9CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIF9wZWVrQnVmZmVyID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzUGVla0J5dGU7CiAKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgT3BlbigpOworICAgICAgICBwdWJsaWMgYm9vbCBQZWVrKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy9JZiB3ZSBhbHJlYWR5IGhhdmUgYSBieXRlIHJlYWQgYnV0IG5vdCBjb25zdW1lZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGlmIChfaGFzUGVla0J5dGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLQkJcHVibGljIGFic3RyYWN0IHZvaWQgQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vSWYgdHJhbnNwb3J0IGNsb3NlZCB3ZSBjYW4ndCBwZWVrLgorICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0JCXB1YmxpYyBhYnN0cmFjdCBpbnQgUmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKTsKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBieXRlcyA9IFJlYWQoX3BlZWtCdWZmZXIsIDAsIDEpOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQogCi0JCXB1YmxpYyBpbnQgUmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQotCQl7Ci0JCQlpbnQgZ290ID0gMDsKLQkJCWludCByZXQgPSAwOworICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAKLQkJCXdoaWxlIChnb3QgPCBsZW4pCi0JCQl7Ci0JCQkJcmV0ID0gUmVhZChidWYsIG9mZiArIGdvdCwgbGVuIC0gZ290KTsKLQkJCQlpZiAocmV0IDw9IDApCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLQkJCQkJCVRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5FbmRPZkZpbGUsCi0JCQkJCQkiQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQiKTsKLQkJCQl9Ci0JCQkJZ290ICs9IHJldDsKLQkJCX0KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgT3BlbigpOwogCi0JCQlyZXR1cm4gZ290OwotCQl9CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsb3NlKCk7CiAKLQkJcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZShieXRlW10gYnVmKSAKLQkJewotCQkJV3JpdGUgKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7Ci0JCX0KKyAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIFZhbGlkYXRlQnVmZmVyQXJncyhieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiYnVmIik7CisgICAgICAgICAgICBpZiAob2ZmIDwgMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJCdWZmZXIgb2Zmc2V0IGlzIHNtYWxsZXIgdGhhbiB6ZXJvLiIpOworICAgICAgICAgICAgaWYgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiQnVmZmVyIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIGlmIChvZmYgKyBsZW4gPiBidWYuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIk5vdCBlbm91Z2ggZGF0YS4iKTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IFJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbik7CiAKLQkJcHVibGljIHZpcnR1YWwgdm9pZCBGbHVzaCgpCi0JCXsKLQkJfQotICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBSZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGludCBnb3QgPSAwOworCisgICAgICAgICAgICAvL0lmIHdlIHByZXZpb3VzbHkgcGVla2VkIGEgYnl0ZSwgd2UgbmVlZCB0byB1c2UgdGhhdCBmaXJzdC4KKyAgICAgICAgICAgIGlmIChfaGFzUGVla0J5dGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmW29mZiArIGdvdCsrXSA9IF9wZWVrQnVmZmVyWzBdOworICAgICAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoZ290IDwgbGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBSZWFkKGJ1Ziwgb2ZmICsgZ290LCBsZW4gLSBnb3QpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3QgKz0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgV3JpdGUoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdmlydHVhbCBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sCisgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdHJhbnNwb3J0LiIpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBFbmRGbHVzaChJQXN5bmNSZXN1bHQgYXN5bmNSZXN1bHQpCiAgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIHRyYW5zcG9ydC4iKTsKICAgICAgICAgfQogCi0JCSNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKLQkJLy8gSURpc3Bvc2FibGUKLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZyk7CisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZyk7CiAKLQkJcHVibGljIHZvaWQgRGlzcG9zZSgpCi0JCXsKLQkJCS8vIERvIG5vdCBjaGFuZ2UgdGhpcyBjb2RlLiAgUHV0IGNsZWFudXAgY29kZSBpbiBEaXNwb3NlKEJ5VmFsIGRpc3Bvc2luZyBBcyBCb29sZWFuKSBhYm92ZS4KLQkJCURpc3Bvc2UodHJ1ZSk7Ci0JCQlHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOwotCQl9Ci0JCSNlbmRyZWdpb24KLQl9CisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBEbyBub3QgY2hhbmdlIHRoaXMgY29kZS4gIFB1dCBjbGVhbnVwIGNvZGUgaW4gRGlzcG9zZShCeVZhbCBkaXNwb3NpbmcgQXMgQm9vbGVhbikgYWJvdmUuCisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICAgICAgR0MuU3VwcHJlc3NGaW5hbGl6ZSh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kcmVnaW9uCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwppbmRleCBiOTZmN2U4Li43ZjZjYzE4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtMjUsNDQgKzI1LDQ1IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0JcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBFeGNlcHRpb24KLQl7Ci0JCXByb3RlY3RlZCBFeGNlcHRpb25UeXBlIHR5cGU7CisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlOwogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKCkKLQkJCTogYmFzZSgpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbigpCisgICAgICAgICAgICA6IGJhc2UoKQorICAgICAgICB7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUpCi0JCQk6IHRoaXMoKQotCQl7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9CisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KIAotCQlwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCX0KKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0JCXB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQotCQkJOiBiYXNlKG1lc3NhZ2UpCi0JCXsKLQkJfQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKKyAgICAgICAgeworICAgICAgICB9CiAKLQkJcHVibGljIEV4Y2VwdGlvblR5cGUgVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gdHlwZTsgfQotCQl9CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgfQogCi0JCXB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKLQkJewotCQkJVW5rbm93biwKLQkJCU5vdE9wZW4sCi0JCQlBbHJlYWR5T3BlbiwKLQkJCVRpbWVkT3V0LAotCQkJRW5kT2ZGaWxlCi0JCX0KLQl9CisgICAgICAgIHB1YmxpYyBlbnVtIEV4Y2VwdGlvblR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAgICAgICAgIE5vdE9wZW4sCisgICAgICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgIFRpbWVkT3V0LAorICAgICAgICAgICAgRW5kT2ZGaWxlLAorICAgICAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwppbmRleCA4ZjRmMTVkLi40N2EwYzYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCkBAIC0yNSwxOCArMjUsMTggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIEZyb20gTWFyayBTbGVlICYgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6Ci0JLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgotCS8vLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KLQkvLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCi0JLy8vIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQotCXsKLQkJcHVibGljIHZpcnR1YWwgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKLQkJewotCQkJcmV0dXJuIHRyYW5zOwotCQl9Ci0JfQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gRnJvbSBNYXJrIFNsZWUgJmFtcDsgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CisgICAgLy8vIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAgICAvLy8gYSBTZXJ2ZXJUcmFuc3BvcnQgYW5kIHRoZW4gbWF5IHdhbnQgdG8gbXV0YXRlIHRoZW0gKGkuZS4gY3JlYXRlCisgICAgLy8vIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQorICAgIHsKKyAgICAgICAgcHVibGljIHZpcnR1YWwgVFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vSlNPTlRlc3QuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L0pTT04vSlNPTlRlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2Q0M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9KU09OVGVzdC5jc3Byb2oKQEAgLTAsMCArMSw4NSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+eDg2PC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OC4wLjMwNzAzPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPntFMzdBMDAzNC1EQ0JGLTQ4ODYtQTBEQS0yNUEwM0QxMkQ5NzV9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPkpTT05UZXN0PC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+SlNPTlRlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC4wPC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPgorICAgIDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3x4ODYnICI+CisgICAgPFBsYXRmb3JtVGFyZ2V0Png4NjwvUGxhdGZvcm1UYXJnZXQ+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8eDg2JyAiPgorICAgIDxQbGF0Zm9ybVRhcmdldD54ODY8L1BsYXRmb3JtVGFyZ2V0PgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhLkRhdGFTZXRFeHRlbnNpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPE5vbmUgSW5jbHVkZT0iYXBwLmNvbmZpZyIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL1Byb2dyYW0uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTM4OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsOTUgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7CisKK25hbWVzcGFjZSBKU09OVGVzdAoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdFRocmlmdDIzNjUoKTsgIC8vIEpTT04gYmluYXJ5IGRlY29kZXMgdG9vIG11Y2ggZGF0YQorICAgICAgICAgICAgVGVzdFRocmlmdDIzMzYoKTsgIC8vIGhleCBlbmNvZGluZyB1c2luZyBcdVhYWFggd2hlcmUgMHhYWFhYID4gMHhGRgorICAgICAgICAgICAgVGVzdFRocmlmdDM0MDMoKTsgLy8gSlNPTiBlc2NhcGVkIHVuaWNvZGUgc3Vycm9nYXRlIHBhaXIgc3VwcG9ydC4KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQyMzY1KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGxlbiA9IDA7IGxlbiA8IDEwOyArK2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gZGF0YVdyaXR0ZW4gPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgICAgIHJuZC5OZXh0Qnl0ZXMoZGF0YVdyaXR0ZW4pOworCisgICAgICAgICAgICAgICAgU3RyZWFtIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQobnVsbCwgc3RtKTsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgICAgICBwcm90LldyaXRlQmluYXJ5KGRhdGFXcml0dGVuKTsKKworICAgICAgICAgICAgICAgIHN0bS5Qb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFN0cmVhbVRyYW5zcG9ydChzdG0sIG51bGwpOworICAgICAgICAgICAgICAgIHByb3QgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFucyk7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGFSZWFkID0gcHJvdC5SZWFkQmluYXJ5KCk7CisKKyAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQoZGF0YVJlYWQuTGVuZ3RoID09IGRhdGFXcml0dGVuLkxlbmd0aCk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhUmVhZC5MZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KGRhdGFSZWFkW2ldID09IGRhdGFXcml0dGVuW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFRlc3RUaHJpZnQyMzM2KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RyaW5nIFJVU1NJQU5fVEVYVCA9ICJcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1IjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBSVVNTSUFOX0pTT04gPSAiXCJcXHUwNDIwXFx1MDQ0M1xcdTA0NDFcXHUwNDQxXFx1MDQzYVxcdTA0M2VcXHUwNDM1IFxcdTA0MWRcXHUwNDMwXFx1MDQzN1xcdTA0MzJcXHUwNDMwXFx1MDQzZFxcdTA0MzhcXHUwNDM1XCIiOworCisgICAgICAgICAgICAvLyBwcmVwYXJlIGJ1ZmZlciB3aXRoIEpTT04gZGF0YQorICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gbmV3IGJ5dGVbUlVTU0lBTl9KU09OLkxlbmd0aF07CisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFJVU1NJQU5fSlNPTi5MZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICByYXdCeXRlc1tpXSA9IChieXRlKShSVVNTSUFOX0pTT05baV0gJiAoY2hhcikweEZGKTsgIC8vIG9ubHkgbG93IGJ5dGVzCisKKyAgICAgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjaworICAgICAgICAgICAgdmFyIHN0bSA9IG5ldyBNZW1vcnlTdHJlYW0ocmF3Qnl0ZXMpOworICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHByb3QuUmVhZFN0cmluZygpID09IFJVU1NJQU5fVEVYVCwgInJlYWRpbmcgSlNPTiB3aXRoIGhleC1lbmNvZGVkIGNoYXJzID4gOCBiaXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBUZXN0VGhyaWZ0MzQwMygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmluZyBHQ0xFRl9URVhUID0gIlx1ZDgzNFx1ZGQxZSI7CisgICAgICAgICAgICBjb25zdCBzdHJpbmcgR0NMRUZfSlNPTiA9ICJcIlxcdWQ4MzRcXHVkZDFlXCIiOworCisgICAgICAgICAgICAvLyBwYXJzZSBhbmQgY2hlY2sKKyAgICAgICAgICAgIHZhciBzdG0gPSBuZXcgTWVtb3J5U3RyZWFtKEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoR0NMRUZfSlNPTikpOworICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRTdHJlYW1UcmFuc3BvcnQoc3RtLCBudWxsKTsKKyAgICAgICAgICAgIHZhciBwcm90ID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgRGVidWcuQXNzZXJ0KHByb3QuUmVhZFN0cmluZygpID09IEdDTEVGX1RFWFQsICJyZWFkaW5nIEpTT04gd2l0aCBzdXJyb2dhdGUgcGFpciBoZXgtZW5jb2RlZCBjaGFycyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZmNGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAor77u/LyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEFsbGdlbWVpbmUgSW5mb3JtYXRpb25lbiDDvGJlciBlaW5lIEFzc2VtYmx5IHdlcmRlbiDDvGJlciBkaWUgZm9sZ2VuZGVuCisvLyBBdHRyaWJ1dGUgZ2VzdGV1ZXJ0LiDDhG5kZXJuIFNpZSBkaWVzZSBBdHRyaWJ1dHdlcnRlLCB1bSBkaWUgSW5mb3JtYXRpb25lbiB6dSDDpG5kZXJuLAorLy8gZGllIG1pdCBlaW5lciBBc3NlbWJseSB2ZXJrbsO8cGZ0IHNpbmQuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkpTT05UZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gRHVyY2ggRmVzdGxlZ2VuIHZvbiBDb21WaXNpYmxlIGF1ZiAiZmFsc2UiIHdlcmRlbiBkaWUgVHlwZW4gaW4gZGllc2VyIEFzc2VtYmx5IHVuc2ljaHRiYXIKKy8vIGbDvHIgQ09NLUtvbXBvbmVudGVuLiBXZW5uIFNpZSBhdWYgZWluZW4gVHlwIGluIGRpZXNlciBBc3NlbWJseSB2b24KKy8vIENPTSB6dWdyZWlmZW4gbcO8c3NlbiwgbGVnZW4gU2llIGRhcyBDb21WaXNpYmxlLUF0dHJpYnV0IGbDvHIgZGllc2VuIFR5cCBhdWYgInRydWUiIGZlc3QuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBEaWUgZm9sZ2VuZGUgR1VJRCBiZXN0aW1tdCBkaWUgSUQgZGVyIFR5cGJpYmxpb3RoZWssIHdlbm4gZGllc2VzIFByb2pla3QgZsO8ciBDT00gdmVyZsO8Z2JhciBnZW1hY2h0IHdpcmQKK1thc3NlbWJseTogR3VpZCgiMmIyZTdkNTYtM2U2NS00MzY4LTkyZDctZTM0ZDU2YjcxMDVlIildCisKKy8vIFZlcnNpb25zaW5mb3JtYXRpb25lbiBmw7xyIGVpbmUgQXNzZW1ibHkgYmVzdGVoZW4gYXVzIGRlbiBmb2xnZW5kZW4gdmllciBXZXJ0ZW46CisvLworLy8gICAgICBIYXVwdHZlcnNpb24KKy8vICAgICAgTmViZW52ZXJzaW9uCisvLyAgICAgIEJ1aWxkbnVtbWVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gU2llIGvDtm5uZW4gYWxsZSBXZXJ0ZSBhbmdlYmVuIG9kZXIgZGllIHN0YW5kYXJkbcOkw59pZ2VuIEJ1aWxkLSB1bmQgUmV2aXNpb25zbnVtbWVybgorLy8gw7xiZXJuZWhtZW4sIGluZGVtIFNpZSAiKiIgZWluZ2ViZW46CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9KU09OL2FwcC5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9hcHAuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTkxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9hcHAuY29uZmlnCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbj4KKzxzdGFydHVwPjxzdXBwb3J0ZWRSdW50aW1lIHZlcnNpb249InY0LjAiIHNrdT0iLk5FVEZyYW1ld29yayxWZXJzaW9uPXY0LjAiLz48L3N0YXJ0dXA+PC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTBhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXguVGVzdC5DbGllbnQuY3MKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGVzdC5NdWx0aXBsZXg7CisKK25hbWVzcGFjZSBUZXN0Lk11bHRpcGxleC5DbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAorICAgIHsKKyAgICAgICAgc3RhdGljIHZvaWQgRXhlY3V0ZShpbnQgcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFuczsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICB0cmFucy5PcGVuKCk7CisKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgUHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCB0cnVlLCB0cnVlKTsKKworICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG11bHRpcGxleDsKKworICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChQcm90b2NvbCwgQ29uc3RhbnRzLk5BTUVfQkVOQ0hNQVJLU0VSVklDRSk7CisgICAgICAgICAgICAgICAgQmVuY2htYXJrU2VydmljZS5JZmFjZSBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworCisgICAgICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKFByb3RvY29sLCBDb25zdGFudHMuTkFNRV9BR0dSKTsKKyAgICAgICAgICAgICAgICBBZ2dyLklmYWNlIGFnZ3IgPSBuZXcgQWdnci5DbGllbnQobXVsdGlwbGV4KTsKKworICAgICAgICAgICAgICAgIGZvciAoc2J5dGUgaSA9IDE7IDEwID49IGk7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoYmVuY2guZmlib25hY2NpKGkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChpbnQgayBpbiBhZ2dyLmdldFZhbHVlcygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrLlRvU3RyaW5nKCkgKyAiICIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYW5zLkNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb3J0ID0gdXNob3J0LlBhcnNlKGFyZ3NbMF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRXhlY3V0ZShwb3J0KTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWUxY2UxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagpAQCAtMCwwICsxLDE0OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns1RTkxREExNy1FNTQ4LTQxNUYtOEM5Ri05RTg0RURGOEVFMDZ9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPk11bHRpcGxleENsaWVudDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPk11bHRpcGxleENsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPi4uXGJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXE11bHRpcGxleC5UZXN0LkNvbW1vbi5jcyI+CisgICAgICA8TGluaz5NdWx0aXBsZXguVGVzdC5Db21tb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQWdnci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEJlbmNobWFya1NlcnZpY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxFcnJvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNdWx0aXBsZXguVGVzdC5DbGllbnQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKKworU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjg2ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleENsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjY2RkM2MUU1LTQyMEItNGI1Ni04MDEyLUQ2RDZDRTIyNTM3RiIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L01ha2VmaWxlLmFtIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI1M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworR0VORVJBVEVEID0gXAorCWdlbi1jc2hhcnAvQWdnci5jcyBcCisJZ2VuLWNzaGFycC9CZW5jaG1hcmtTZXJ2aWNlLmNzIFwKKwlnZW4tY3NoYXJwL0Vycm9yLmNzCisKK0JVSUxUX1NPVVJDRVMgPSAkKEdFTkVSQVRFRCkKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworZ2VuLWNzaGFycC9BZ2dyLmNzOiAkKHRvcF9zcmNkaXIpL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgJDwKKworZ2VuLWNzaGFycC9CZW5jaG1hcmtTZXJ2aWNlLmNzIGdlbi1jc2hhcnAvRXJyb3IuY3M6ICQodG9wX3NyY2RpcikvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNzaGFycCAkPAorCitUaHJpZnRJbXBsLmRsbDogTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzICQoR0VORVJBVEVEKSAuLi8uLi9UaHJpZnQuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC10OmxpYnJhcnkgLW91dDouL1RocmlmdEltcGwuZGxsIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAkKEdFTkVSQVRFRCkgJDwKKworTXVsdGlwbGV4Q2xpZW50LmV4ZTogQ2xpZW50L011bHRpcGxleC5UZXN0LkNsaWVudC5jcyBUaHJpZnRJbXBsLmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC1yZWZlcmVuY2U6Li4vLi4vVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQ8CisKK011bHRpcGxleFNlcnZlci5leGU6IFNlcnZlci9NdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MgVGhyaWZ0SW1wbC5kbGwKKwkkKENTQykgJChDU0NfREVGSU5FUykgLW91dDokQCAtcmVmZXJlbmNlOi4uLy4uL1RocmlmdC5kbGwgLXJlZmVyZW5jZTpUaHJpZnRJbXBsLmRsbCAkPAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtcmYgZ2VuLWNzaGFycCAqLmV4ZSAqLmRsbAorCitURVNUUE9SVCA9IDk1MDEKK2NoZWNrLWxvY2FsOiBNdWx0aXBsZXhTZXJ2ZXIuZXhlIE11bHRpcGxleENsaWVudC5leGUKKwllY2hvICQoVEVTVFBPUlQpCisJTU9OT19QQVRIPS4uLy4uLyB0aW1lb3V0IDEwIG1vbm8gTXVsdGlwbGV4U2VydmVyLmV4ZSAkKFRFU1RQT1JUKSAmCisJc2xlZXAgMQorCU1PTk9fUEFUSD0uLi8uLi8gbW9ubyBNdWx0aXBsZXhDbGllbnQuZXhlICQoVEVTVFBPUlQpCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L011bHRpcGxleC5UZXN0LkNvbW1vbi5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODc4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L011bHRpcGxleC5UZXN0LkNvbW1vbi5jcwpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOworCituYW1lc3BhY2UgVGVzdC5NdWx0aXBsZXgKK3sKKyAgICBwdWJsaWMgY2xhc3MgQ29uc3RhbnRzCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICJCZW5jaG1hcmtTZXJ2aWNlIjsKKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOQU1FX0FHR1IgICAgICAgICAgICAgPSAiQWdnciI7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleC5UZXN0LlNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Nzg2MTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmNzCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUZXN0Lk11bHRpcGxleDsKKworbmFtZXNwYWNlIFRlc3QuTXVsdGlwbGV4LlNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCisgICAgeworICAgICAgICBjbGFzcyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCA6IEJlbmNobWFya1NlcnZpY2UuSWZhY2UKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBmaWJvbmFjY2koc2J5dGUgbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJldiwgbmV4dCwgcmVzdWx0OworICAgICAgICAgICAgICAgIHByZXYgICA9IDA7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobiA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXh0ICAgPSByZXN1bHQgKyBwcmV2OworICAgICAgICAgICAgICAgICAgICBwcmV2ICAgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIC0tbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEFnZ3JTZXJ2aWNlSW1wbCA6IEFnZ3IuSWZhY2UKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxpbnQ+IHZhbHVlcyA9IG5ldyBMaXN0PGludD4oKTsKKworICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkVmFsdWUoaW50IHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlcy5BZGQodmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IGdldFZhbHVlcygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIEV4ZWN1dGUoaW50IHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBwcm90b2NvbCBmYWN0b3J5LCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkodHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlcnRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgZmFsc2UpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBCZW5jaG1hcmtTZXJ2aWNlLklmYWNlIGJlbmNoSGFuZGxlciA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCgpOworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3IgYmVuY2hQcm9jZXNzb3IgPSBuZXcgQmVuY2htYXJrU2VydmljZS5Qcm9jZXNzb3IoYmVuY2hIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIEFnZ3IuSWZhY2UgYWdnckhhbmRsZXIgPSBuZXcgQWdnclNlcnZpY2VJbXBsKCk7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBhZ2dyUHJvY2Vzc29yID0gbmV3IEFnZ3IuUHJvY2Vzc29yKGFnZ3JIYW5kbGVyKTsKKworICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKENvbnN0YW50cy5OQU1FX0JFTkNITUFSS1NFUlZJQ0UsIGJlbmNoUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoQ29uc3RhbnRzLk5BTUVfQUdHUiwgYWdnclByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUU2VydmVyIFNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKG11bHRpcGxleCwgc2VydmVydHJhbnMsIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvY29sRmFjdG9yeSk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciAuLi4iKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShlLk1lc3NhZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBvcnQgPSB1c2hvcnQuUGFyc2UoYXJnc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFeGVjdXRlKHBvcnQpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGE0Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagpAQCAtMCwwICsxLDE0OCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPntENTkyQkRGMy0wRENFLTQ4RkItODkwRi1FNEFFMUQ5Q0U3Q0R9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPk11bHRpcGxleFNlcnZlcjwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPk11bHRpcGxleFNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+CisgICAgPEZpbGVBbGlnbm1lbnQ+NTEyPC9GaWxlQWxpZ25tZW50PgorICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CisgICAgPEZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPC9GaWxlVXBncmFkZUZsYWdzPgorICAgIDxPbGRUb29sc1ZlcnNpb24+My41PC9PbGRUb29sc1ZlcnNpb24+CisgICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPgorICAgIDxQdWJsaXNoVXJsPnB1Ymxpc2hcPC9QdWJsaXNoVXJsPgorICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPgorICAgIDxVcGRhdGVFbmFibGVkPmZhbHNlPC9VcGRhdGVFbmFibGVkPgorICAgIDxVcGRhdGVNb2RlPkZvcmVncm91bmQ8L1VwZGF0ZU1vZGU+CisgICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPgorICAgIDxVcGRhdGVJbnRlcnZhbFVuaXRzPkRheXM8L1VwZGF0ZUludGVydmFsVW5pdHM+CisgICAgPFVwZGF0ZVBlcmlvZGljYWxseT5mYWxzZTwvVXBkYXRlUGVyaW9kaWNhbGx5PgorICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CisgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgorICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CisgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KKyAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KKyAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgorICAgIDxPdXRwdXRQYXRoPi4uXGJpblxEZWJ1Z1w8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5ERUJVRztUUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KKyAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+Li5cYmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgICA8Q29kZUFuYWx5c2lzUnVsZVNldD5BbGxSdWxlcy5ydWxlc2V0PC9Db2RlQW5hbHlzaXNSdWxlU2V0PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXE11bHRpcGxleC5UZXN0LkNvbW1vbi5jcyI+CisgICAgICA8TGluaz5NdWx0aXBsZXguVGVzdC5Db21tb24uY3M8L0xpbms+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9Ii4uXGdlbi1jc2hhcnBcQWdnci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlxnZW4tY3NoYXJwXEJlbmNobWFya1NlcnZpY2UuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cZ2VuLWNzaGFycFxFcnJvci5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxIENsaWVudCBQcm9maWxlPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4yLjAiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDMuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjU8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41LlNQMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPldpbmRvd3MgSW5zdGFsbGVyIDMuMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cc3JjXFRocmlmdC5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+ezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQ8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KKyAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KKyAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCisgIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgorICA8L1RhcmdldD4KKyAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIC0tPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8UHJlQnVpbGRFdmVudD5ybWRpciAvcyAvcSAiJChQcm9qZWN0RGlyKWdlbi1jc2hhcnAiCitkZWwgL2YgL3EgIiQoUHJvamVjdERpcilUaHJpZnRJbXBsLmRsbCIKK1NFVCBPVVRQVVRfRElSPSQoUHJvamVjdERpcikKKworU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Citmb3IgJTI1JTI1SSBpbiAoIiUyNU9VVFBVVF9ESVIlMjUiKSBkbyBzZXQgU0hPUlRfRElSPSUyNSUyNX5mc0kKK2ZvciAlMjUlMjVJIGluICgiJTI1VEhSSUZUX0ZJTEUlMjUiKSBkbyBzZXQgVEhSSUZUX1NIT1JUPSUyNSUyNX5mc0kKKyIkKFByb2plY3REaXIpXC4uXC4uXC4uXC4uXC4uXGNvbXBpbGVyXGNwcFx0aHJpZnQuZXhlIiAtLWdlbiBjc2hhcnAgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorCitTRVQgVEhSSUZUX0ZJTEU9JChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CisKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDQwNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIk11bHRpcGxleFNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIkYyRjQzNkMxLTNENEYtNDExYS1BREMzLUI5ODg0ODQ3NkE4RSIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9BcHBfU3RhcnQvRmlsdGVyQ29uZmlnLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUxODRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L0ZpbHRlckNvbmZpZy5jcwpAQCAtMCwwICsxLDMxIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uV2ViLk12YzsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlckNvbmZpZworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFJlZ2lzdGVyR2xvYmFsRmlsdGVycyhHbG9iYWxGaWx0ZXJDb2xsZWN0aW9uIGZpbHRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlcnMuQWRkKG5ldyBIYW5kbGVFcnJvckF0dHJpYnV0ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FwcF9TdGFydC9Sb3V0ZUNvbmZpZy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2MDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXBwX1N0YXJ0L1JvdXRlQ29uZmlnLmNzCkBAIC0wLDAgKzEsMzkgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5XZWIuTXZjOwordXNpbmcgU3lzdGVtLldlYi5Sb3V0aW5nOworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVDb25maWcKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBSZWdpc3RlclJvdXRlcyhSb3V0ZUNvbGxlY3Rpb24gcm91dGVzKQorICAgICAgICB7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0udGhyaWZ0Iik7CisgICAgICAgICAgICByb3V0ZXMuSWdub3JlUm91dGUoIntyZXNvdXJjZX0uYXhkL3sqcGF0aEluZm99Iik7CisKKyAgICAgICAgICAgIHJvdXRlcy5NYXBSb3V0ZSgKKyAgICAgICAgICAgICAgICBuYW1lOiAiRGVmYXVsdCIsCisgICAgICAgICAgICAgICAgdXJsOiAie2NvbnRyb2xsZXJ9L3thY3Rpb259L3tpZH0iLAorICAgICAgICAgICAgICAgIGRlZmF1bHRzOiBuZXcgeyBjb250cm9sbGVyID0gIkhvbWUiLCBhY3Rpb24gPSAiSW5kZXgiLCBpZCA9IFVybFBhcmFtZXRlci5PcHRpb25hbCB9CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQXN5bmNIdHRwSGFuZGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0FzeW5jSHR0cEhhbmRsZXIuY3MKQEAgLTAsMCArMSwzMiBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QKK3sKKyAgICBwdWJsaWMgY2xhc3MgQXN5bmNIdHRwSGFuZGxlciA6IFRIdHRwVGFza0FzeW5jSGFuZGxlcgorICAgIHsKKyAgICAgICAgcHVibGljIEFzeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLkFzeW5jUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlSW1wbCgpKSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvQ29udHJvbGxlcnMvSG9tZUNvbnRyb2xsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhMWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCkBAIC0wLDAgKzEsNzAgQEAKK++7vy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBTeXN0ZW0uV2ViLk12YzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIFRocmlmdE1WQ1Rlc3QuQ29udHJvbGxlcnMKK3sKKyAgICBwdWJsaWMgY2xhc3MgSG9tZUNvbnRyb2xsZXIgOiBDb250cm9sbGVyCisgICAgeworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IEluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFZpZXcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPEFjdGlvblJlc3VsdD4gVGVzdFRocmlmdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JQXN5bmMgYXN5bmNTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiQXN5bmMudGhyaWZ0IikpKSk7CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBhc3luY1NlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZ0FzeW5jKCJUZXN0U3RyaW5nIik7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlZGlyZWN0VG9BY3Rpb24oIkluZGV4Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWN0aW9uUmVzdWx0IFRlc3RUaHJpZnRTeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJhc2VVcmkgPSBuZXcgVXJpKHN0cmluZy5Gb3JtYXQoInswfTovL3sxfXsyfSIsIFJlcXVlc3QuVXJsLlNjaGVtZSwgUmVxdWVzdC5VcmwuQXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIFVybC5Db250ZW50KCJ+IikpKTsKKworICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JU3luYyBzZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiU3luYy50aHJpZnQiKSkpKTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZygiVGVzdFN0cmluZyIpOworICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAidGVzdFN0cmluZyhcIlRlc3RTdHJpbmdcIikiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlRoZSB3cm9uZyByZXN1bHQgd2FzIHJldHVybmVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBSZWRpcmVjdFRvQWN0aW9uKCJJbmRleCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXggYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmI2ODhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXgKQEAgLTAsMCArMSwxOSBAQAor77u/PCVAIEFwcGxpY2F0aW9uIENvZGViZWhpbmQ9Ikdsb2JhbC5hc2F4LmNzIiBJbmhlcml0cz0iVGhyaWZ0TVZDVGVzdC5NdmNBcHBsaWNhdGlvbiIgTGFuZ3VhZ2U9IkMjIiAlPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9HbG9iYWwuYXNheC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTczMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvR2xvYmFsLmFzYXguY3MKQEAgLTAsMCArMSwzNCBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLldlYi5NdmM7Cit1c2luZyBTeXN0ZW0uV2ViLlJvdXRpbmc7CisKK25hbWVzcGFjZSBUaHJpZnRNVkNUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIE12Y0FwcGxpY2F0aW9uIDogU3lzdGVtLldlYi5IdHRwQXBwbGljYXRpb24KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCB2b2lkIEFwcGxpY2F0aW9uX1N0YXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgQXJlYVJlZ2lzdHJhdGlvbi5SZWdpc3RlckFsbEFyZWFzKCk7CisgICAgICAgICAgICBGaWx0ZXJDb25maWcuUmVnaXN0ZXJHbG9iYWxGaWx0ZXJzKEdsb2JhbEZpbHRlcnMuRmlsdGVycyk7CisgICAgICAgICAgICBSb3V0ZUNvbmZpZy5SZWdpc3RlclJvdXRlcyhSb3V0ZVRhYmxlLlJvdXRlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZTg4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDUzIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiVGhyaWZ0TVZDVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCJBIHdlYiBwcm9qZWN0IGZvciB0ZXN0aW5nIHRoZSB0aHJpZnQgQVNQLk5FVCBmZWF0dXJlcy4iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjM2NmY5YmQwLTNjMGUtNDhhYS1iMmNhLTYxZmQ0YTkzZTQyNyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TZWNvbmRTZXJ2aWNlSW1wbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQzMDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKQEAgLTAsMCArMSwzNyBAQAor77u/LyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UZXN0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBTZWNvbmRTZXJ2aWNlSW1wbCA6IFNlY29uZFNlcnZpY2UuSUFzeW5jLCBTZWNvbmRTZXJ2aWNlLklTeW5jCisgICAgeworICAgICAgICBwdWJsaWMgVGFzazxzdHJpbmc+IHNlY29uZHRlc3RTdHJpbmdBc3luYyhzdHJpbmcgdGhpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9TeW5jSHR0cEhhbmRsZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMjY2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1N5bmNIdHRwSGFuZGxlci5jcwpAQCAtMCwwICsxLDMyIEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0OworCituYW1lc3BhY2UgVGhyaWZ0TVZDVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBTeW5jSHR0cEhhbmRsZXIgOiBUSHR0cEhhbmRsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBTeW5jSHR0cEhhbmRsZXIoKQorICAgICAgICAgICAgOiBiYXNlKAorICAgICAgICAgICAgICAgIG5ldyBUaHJpZnQuVGVzdC5TZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZUltcGwoKSkpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvaiBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1RocmlmdE1WQ1Rlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjk2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9UaHJpZnRNVkNUZXN0LmNzcHJvagpAQCAtMCwwICsxLDIwMCBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMTIuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzIiBDb25kaXRpb249IkV4aXN0cygnJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcycpIiAvPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KKyAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CisgICAgPFByb2R1Y3RWZXJzaW9uPgorICAgIDwvUHJvZHVjdFZlcnNpb24+CisgICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgorICAgIDxQcm9qZWN0R3VpZD57ODkxQjQ0ODctQzdCQS00MjdFLUJCQzgtNEM1OTZDMjI5QTEwfTwvUHJvamVjdEd1aWQ+CisgICAgPFByb2plY3RUeXBlR3VpZHM+ezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX07e2ZhZTA0ZWMwLTMwMWYtMTFkMy1iZjRiLTAwYzA0Zjc5ZWZiY308L1Byb2plY3RUeXBlR3VpZHM+CisgICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0TVZDVGVzdDwvUm9vdE5hbWVzcGFjZT4KKyAgICA8QXNzZW1ibHlOYW1lPlRocmlmdE1WQ1Rlc3Q8L0Fzc2VtYmx5TmFtZT4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgorICAgIDxNdmNCdWlsZFZpZXdzPmZhbHNlPC9NdmNCdWlsZFZpZXdzPgorICAgIDxVc2VJSVNFeHByZXNzPnRydWU8L1VzZUlJU0V4cHJlc3M+CisgICAgPElJU0V4cHJlc3NTU0xQb3J0IC8+CisgICAgPElJU0V4cHJlc3NBbm9ueW1vdXNBdXRoZW50aWNhdGlvbiAvPgorICAgIDxJSVNFeHByZXNzV2luZG93c0F1dGhlbnRpY2F0aW9uIC8+CisgICAgPElJU0V4cHJlc3NVc2VDbGFzc2ljUGlwZWxpbmVNb2RlIC8+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+CisgICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+CisgICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+CisgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cPC9PdXRwdXRQYXRoPgorICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KKyAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkNTaGFycCIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmciIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkR5bmFtaWNEYXRhIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5FbnRpdHkiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkFwcGxpY2F0aW9uU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29tcG9uZW50TW9kZWwuRGF0YUFubm90YXRpb25zIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvcmUiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YS5EYXRhU2V0RXh0ZW5zaW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwuTGlucSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkV4dGVuc2lvbnMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLkFic3RyYWN0aW9ucyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuUm91dGluZyIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29uZmlndXJhdGlvbiIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuU2VydmljZXMiIC8+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRW50ZXJwcmlzZVNlcnZpY2VzIiAvPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZSwgVmVyc2lvbj0xLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LldlYi5JbmZyYXN0cnVjdHVyZS4xLjAuMC4wXGxpYlxuZXQ0MFxNaWNyb3NvZnQuV2ViLkluZnJhc3RydWN0dXJlLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAiPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldlYlJlcXVlc3QiPgorICAgIDwvUmVmZXJlbmNlPgorICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLldlYi5IZWxwZXJzLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLkhlbHBlcnMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuTXZjLCBWZXJzaW9uPTUuMi4zLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0Lk12Yy41LjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5NdmMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuUmF6b3IsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuUmF6b3IuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuUmF6b3IuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMsIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgorICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE1pY3Jvc29mdC5Bc3BOZXQuV2ViUGFnZXMuMy4yLjNcbGliXG5ldDQ1XFN5c3RlbS5XZWIuV2ViUGFnZXMuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuRGVwbG95bWVudCwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4KKyAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+CisgICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTWljcm9zb2Z0LkFzcE5ldC5XZWJQYWdlcy4zLjIuM1xsaWJcbmV0NDVcU3lzdGVtLldlYi5XZWJQYWdlcy5EZXBsb3ltZW50LmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFiZjM4NTZhZDM2NGUzNSwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgorICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KKyAgICAgIDxIaW50UGF0aD4uLlxwYWNrYWdlc1xNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzLjMuMi4zXGxpYlxuZXQ0NVxTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsIj4KKyAgICAgIDxIaW50UGF0aD4uXFRocmlmdEltcGwuZGxsPC9IaW50UGF0aD4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQXBwX1N0YXJ0XEZpbHRlckNvbmZpZy5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJBcHBfU3RhcnRcUm91dGVDb25maWcuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iU3luY0h0dHBIYW5kbGVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IkFzeW5jSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29udHJvbGxlcnNcSG9tZUNvbnRyb2xsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iR2xvYmFsLmFzYXguY3MiPgorICAgICAgPERlcGVuZGVudFVwb24+R2xvYmFsLmFzYXg8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db21waWxlPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlY29uZFNlcnZpY2VJbXBsLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJmYXZpY29uLmljbyIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJHbG9iYWwuYXNheCIgLz4KKyAgICA8Q29udGVudCBJbmNsdWRlPSJXZWIuY29uZmlnIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IldlYi5EZWJ1Zy5jb25maWciPgorICAgICAgPERlcGVuZGVudFVwb24+V2ViLmNvbmZpZzwvRGVwZW5kZW50VXBvbj4KKyAgICA8L0NvbnRlbnQ+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iV2ViLlJlbGVhc2UuY29uZmlnIj4KKyAgICAgIDxEZXBlbmRlbnRVcG9uPldlYi5jb25maWc8L0RlcGVuZGVudFVwb24+CisgICAgPC9Db250ZW50PgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXFdlYi5jb25maWciIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcX1ZpZXdTdGFydC5jc2h0bWwiIC8+CisgICAgPENvbnRlbnQgSW5jbHVkZT0iVmlld3NcU2hhcmVkXF9MYXlvdXQuY3NodG1sIiAvPgorICAgIDxDb250ZW50IEluY2x1ZGU9IlZpZXdzXEhvbWVcSW5kZXguY3NodG1sIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Rm9sZGVyIEluY2x1ZGU9IkFwcF9EYXRhXCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPENvbnRlbnQgSW5jbHVkZT0icGFja2FnZXMuY29uZmlnIj4KKyAgICAgIDxTdWJUeXBlPkRlc2lnbmVyPC9TdWJUeXBlPgorICAgIDwvQ29udGVudD4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cc3JjXFRocmlmdC40NS5jc3Byb2oiPgorICAgICAgPFByb2plY3Q+e2ViY2UzNWRhLWNmNmEtNDJiYy1hMzU3LWE5YzA5YjUzNDI5OX08L1Byb2plY3Q+CisgICAgICA8TmFtZT5UaHJpZnQuNDU8L05hbWU+CisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgorICA8L0l0ZW1Hcm91cD4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFZpc3VhbFN0dWRpb1ZlcnNpb24gQ29uZGl0aW9uPSInJChWaXN1YWxTdHVkaW9WZXJzaW9uKScgPT0gJyciPjEwLjA8L1Zpc3VhbFN0dWRpb1ZlcnNpb24+CisgICAgPFZTVG9vbHNQYXRoIENvbmRpdGlvbj0iJyQoVlNUb29sc1BhdGgpJyA9PSAnJyI+JChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2JChWaXN1YWxTdHVkaW9WZXJzaW9uKTwvVlNUb29sc1BhdGg+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRCaW5QYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChWU1Rvb2xzUGF0aClcV2ViQXBwbGljYXRpb25zXE1pY3Jvc29mdC5XZWJBcHBsaWNhdGlvbi50YXJnZXRzIiBDb25kaXRpb249IickKFZTVG9vbHNQYXRoKScgIT0gJyciIC8+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1x2MTAuMFxXZWJBcHBsaWNhdGlvbnNcTWljcm9zb2Z0LldlYkFwcGxpY2F0aW9uLnRhcmdldHMiIENvbmRpdGlvbj0iZmFsc2UiIC8+CisgIDxUYXJnZXQgTmFtZT0iTXZjQnVpbGRWaWV3cyIgQWZ0ZXJUYXJnZXRzPSJBZnRlckJ1aWxkIiBDb25kaXRpb249IickKE12Y0J1aWxkVmlld3MpJz09J3RydWUnIj4KKyAgICA8QXNwTmV0Q29tcGlsZXIgVmlydHVhbFBhdGg9InRlbXAiIFBoeXNpY2FsUGF0aD0iJChXZWJQcm9qZWN0T3V0cHV0RGlyKSIgLz4KKyAgPC9UYXJnZXQ+CisgIDxQcm9qZWN0RXh0ZW5zaW9ucz4KKyAgICA8VmlzdWFsU3R1ZGlvPgorICAgICAgPEZsYXZvclByb3BlcnRpZXMgR1VJRD0iezM0OWM1ODUxLTY1ZGYtMTFkYS05Mzg0LTAwMDY1Yjg0NmYyMX0iPgorICAgICAgICA8V2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICAgICAgPFVzZUlJUz5UcnVlPC9Vc2VJSVM+CisgICAgICAgICAgPEF1dG9Bc3NpZ25Qb3J0PlRydWU8L0F1dG9Bc3NpZ25Qb3J0PgorICAgICAgICAgIDxEZXZlbG9wbWVudFNlcnZlclBvcnQ+NTc0ODI8L0RldmVsb3BtZW50U2VydmVyUG9ydD4KKyAgICAgICAgICA8RGV2ZWxvcG1lbnRTZXJ2ZXJWUGF0aD4vPC9EZXZlbG9wbWVudFNlcnZlclZQYXRoPgorICAgICAgICAgIDxJSVNVcmw+aHR0cDovL2xvY2FsaG9zdDo1NzQ4Mi88L0lJU1VybD4KKyAgICAgICAgICA8TlRMTUF1dGhlbnRpY2F0aW9uPkZhbHNlPC9OVExNQXV0aGVudGljYXRpb24+CisgICAgICAgICAgPFVzZUN1c3RvbVNlcnZlcj5GYWxzZTwvVXNlQ3VzdG9tU2VydmVyPgorICAgICAgICAgIDxDdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPC9DdXN0b21TZXJ2ZXJVcmw+CisgICAgICAgICAgPFNhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+RmFsc2U8L1NhdmVTZXJ2ZXJTZXR0aW5nc0luVXNlckZpbGU+CisgICAgICAgIDwvV2ViUHJvamVjdFByb3BlcnRpZXM+CisgICAgICA8L0ZsYXZvclByb3BlcnRpZXM+CisgICAgPC9WaXN1YWxTdHVkaW8+CisgIDwvUHJvamVjdEV4dGVuc2lvbnM+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cLi5cLi5cdGVzdFxUaHJpZnRUZXN0LnRocmlmdAorZm9yICUyNSUyNUkgaW4gKCIlMjVPVVRQVVRfRElSJTI1IikgZG8gc2V0IFNIT1JUX0RJUj0lMjUlMjV+ZnNJCitmb3IgJTI1JTI1SSBpbiAoIiUyNVRIUklGVF9GSUxFJTI1IikgZG8gc2V0IFRIUklGVF9TSE9SVD0lMjUlMjV+ZnNJCisiJChQcm9qZWN0RGlyKVwuLlwuLlwuLlwuLlxjb21waWxlclxjcHBcRGVidWdcdGhyaWZ0LmV4ZSIgLS1nZW4gY3NoYXJwOmFzeW5jPXRydWUgLW8gJTI1U0hPUlRfRElSJTI1ICUyNVRIUklGVF9TSE9SVCUyNQorIiQoTVNCdWlsZFRvb2xzUGF0aClcQ3NjLmV4ZSIgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cc3JjXGJpblxEZWJ1Z1xUaHJpZnQ0NS5kbGwiPC9QcmVCdWlsZEV2ZW50PgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuCisgICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgorICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KKyAgPC9UYXJnZXQ+CisgIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+CisgIDwvVGFyZ2V0PiAtLT4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL0hvbWUvSW5kZXguY3NodG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwY2E3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9Ib21lL0luZGV4LmNzaHRtbApAQCAtMCwwICsxLDI1IEBACivvu79AKgorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLgorKkAKKworQHsKKyAgICBWaWV3QmFnLlRpdGxlID0gIkhvbWUgUGFnZSI7Cit9CisKKzxwPkBIdG1sLkFjdGlvbkxpbmsoIlRlc3QgVGhyaWZ0IEFzeW5jIFNlcnZpY2UiLCAiVGVzdFRocmlmdEFzeW5jIik8L3A+Cis8cD5ASHRtbC5BY3Rpb25MaW5rKCJUZXN0IFRocmlmdCBTeW5jIFNlcnZpY2UiLCAiVGVzdFRocmlmdFN5bmMiKTwvcD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbCBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFjOTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvU2hhcmVkL19MYXlvdXQuY3NodG1sCkBAIC0wLDAgKzEsMzAgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgQVNQLk5FVCBUZXN0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorICAgIEBSZW5kZXJCb2R5KCkKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL1dlYi5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjExMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9WaWV3cy9XZWIuY29uZmlnCkBAIC0wLDAgKzEsNjAgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24+CisgIDxjb25maWdTZWN0aW9ucz4KKyAgICA8c2VjdGlvbkdyb3VwIG5hbWU9InN5c3RlbS53ZWIud2ViUGFnZXMucmF6b3IiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5SYXpvcldlYlNlY3Rpb25Hcm91cCwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiPgorICAgICAgPHNlY3Rpb24gbmFtZT0iaG9zdCIgdHlwZT0iU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvci5Db25maWd1cmF0aW9uLkhvc3RTZWN0aW9uLCBTeXN0ZW0uV2ViLldlYlBhZ2VzLlJhem9yLCBWZXJzaW9uPTMuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MzFCRjM4NTZBRDM2NEUzNSIgcmVxdWlyZVBlcm1pc3Npb249ImZhbHNlIiAvPgorICAgICAgPHNlY3Rpb24gbmFtZT0icGFnZXMiIHR5cGU9IlN5c3RlbS5XZWIuV2ViUGFnZXMuUmF6b3IuQ29uZmlndXJhdGlvbi5SYXpvclBhZ2VzU2VjdGlvbiwgU3lzdGVtLldlYi5XZWJQYWdlcy5SYXpvciwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxQkYzODU2QUQzNjRFMzUiIHJlcXVpcmVQZXJtaXNzaW9uPSJmYWxzZSIgLz4KKyAgICA8L3NlY3Rpb25Hcm91cD4KKyAgPC9jb25maWdTZWN0aW9ucz4KKworICA8c3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvcj4KKyAgICA8aG9zdCBmYWN0b3J5VHlwZT0iU3lzdGVtLldlYi5NdmMuTXZjV2ViUmF6b3JIb3N0RmFjdG9yeSwgU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiAvPgorICAgIDxwYWdlcyBwYWdlQmFzZVR5cGU9IlN5c3RlbS5XZWIuTXZjLldlYlZpZXdQYWdlIj4KKyAgICAgIDxuYW1lc3BhY2VzPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMiIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLk12Yy5BamF4IiAvPgorICAgICAgICA8YWRkIG5hbWVzcGFjZT0iU3lzdGVtLldlYi5NdmMuSHRtbCIgLz4KKyAgICAgICAgPGFkZCBuYW1lc3BhY2U9IlN5c3RlbS5XZWIuT3B0aW1pemF0aW9uIi8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJTeXN0ZW0uV2ViLlJvdXRpbmciIC8+CisgICAgICAgIDxhZGQgbmFtZXNwYWNlPSJUaHJpZnRNVkNUZXN0IiAvPgorICAgICAgPC9uYW1lc3BhY2VzPgorICAgIDwvcGFnZXM+CisgIDwvc3lzdGVtLndlYi53ZWJQYWdlcy5yYXpvcj4KKworICA8YXBwU2V0dGluZ3M+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOkVuYWJsZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgPC9hcHBTZXR0aW5ncz4KKworICA8c3lzdGVtLndlYlNlcnZlcj4KKyAgICA8aGFuZGxlcnM+CisgICAgICA8cmVtb3ZlIG5hbWU9IkJsb2NrVmlld0hhbmRsZXIiLz4KKyAgICAgIDxhZGQgbmFtZT0iQmxvY2tWaWV3SGFuZGxlciIgcGF0aD0iKiIgdmVyYj0iKiIgcHJlQ29uZGl0aW9uPSJpbnRlZ3JhdGVkTW9kZSIgdHlwZT0iU3lzdGVtLldlYi5IdHRwTm90Rm91bmRIYW5kbGVyIiAvPgorICAgIDwvaGFuZGxlcnM+CisgIDwvc3lzdGVtLndlYlNlcnZlcj4KKworICA8c3lzdGVtLndlYj4KKyAgICA8Y29tcGlsYXRpb24+CisgICAgICA8YXNzZW1ibGllcz4KKyAgICAgICAgPGFkZCBhc3NlbWJseT0iU3lzdGVtLldlYi5NdmMsIFZlcnNpb249NS4yLjMuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMUJGMzg1NkFEMzY0RTM1IiAvPgorICAgICAgPC9hc3NlbWJsaWVzPgorICAgIDwvY29tcGlsYXRpb24+CisgIDwvc3lzdGVtLndlYj4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvVmlld3MvX1ZpZXdTdGFydC5jc2h0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkZTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1ZpZXdzL19WaWV3U3RhcnQuY3NodG1sCkBAIC0wLDAgKzEsMjIgQEAKK++7v0AqCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuCisqQAorCitAeworICAgIExheW91dCA9ICJ+L1ZpZXdzL1NoYXJlZC9fTGF5b3V0LmNzaHRtbCI7Cit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuRGVidWcuY29uZmlnIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ1NmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLkRlYnVnLmNvbmZpZwpAQCAtMCwwICsxLDQ1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIHhtbG5zOnhkdD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9YTUwtRG9jdW1lbnQtVHJhbnNmb3JtIj4KKyAgPCEtLQorICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlNldEF0dHJpYnV0ZXMiIHRyYW5zZm9ybSB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YKKyAgICAiY29ubmVjdGlvblN0cmluZyIgdG8gdXNlICJSZWxlYXNlU1FMU2VydmVyIiBvbmx5IHdoZW4gdGhlICJNYXRjaCIgbG9jYXRvcgorICAgIGZpbmRzIGFuIGF0dHJpYnV0ZSAibmFtZSIgdGhhdCBoYXMgYSB2YWx1ZSBvZiAiTXlEQiIuCisKKyAgICA8Y29ubmVjdGlvblN0cmluZ3M+CisgICAgICA8YWRkIG5hbWU9Ik15REIiCisgICAgICAgIGNvbm5lY3Rpb25TdHJpbmc9IkRhdGEgU291cmNlPVJlbGVhc2VTUUxTZXJ2ZXI7SW5pdGlhbCBDYXRhbG9nPU15UmVsZWFzZURCO0ludGVncmF0ZWQgU2VjdXJpdHk9VHJ1ZSIKKyAgICAgICAgeGR0OlRyYW5zZm9ybT0iU2V0QXR0cmlidXRlcyIgeGR0OkxvY2F0b3I9Ik1hdGNoKG5hbWUpIi8+CisgICAgPC9jb25uZWN0aW9uU3RyaW5ncz4KKyAgLS0+CisgIDxzeXN0ZW0ud2ViPgorICAgIDwhLS0KKyAgICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlJlcGxhY2UiIHRyYW5zZm9ybSB3aWxsIHJlcGxhY2UgdGhlIGVudGlyZQorICAgICAgPGN1c3RvbUVycm9ycz4gc2VjdGlvbiBvZiB5b3VyIFdlYi5jb25maWcgZmlsZS4KKyAgICAgIE5vdGUgdGhhdCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIGN1c3RvbUVycm9ycyBzZWN0aW9uIHVuZGVyIHRoZQorICAgICAgPHN5c3RlbS53ZWI+IG5vZGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIHRoZSAieGR0OkxvY2F0b3IiIGF0dHJpYnV0ZS4KKworICAgICAgPGN1c3RvbUVycm9ycyBkZWZhdWx0UmVkaXJlY3Q9IkdlbmVyaWNFcnJvci5odG0iCisgICAgICAgIG1vZGU9IlJlbW90ZU9ubHkiIHhkdDpUcmFuc2Zvcm09IlJlcGxhY2UiPgorICAgICAgICA8ZXJyb3Igc3RhdHVzQ29kZT0iNTAwIiByZWRpcmVjdD0iSW50ZXJuYWxFcnJvci5odG0iLz4KKyAgICAgIDwvY3VzdG9tRXJyb3JzPgorICAgIC0tPgorICA8L3N5c3RlbS53ZWI+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9XZWIuUmVsZWFzZS5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5SZWxlYXNlLmNvbmZpZwpAQCAtMCwwICsxLDQ2IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIHhtbG5zOnhkdD0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9YTUwtRG9jdW1lbnQtVHJhbnNmb3JtIj4KKyAgPCEtLQorICAgIEluIHRoZSBleGFtcGxlIGJlbG93LCB0aGUgIlNldEF0dHJpYnV0ZXMiIHRyYW5zZm9ybSB3aWxsIGNoYW5nZSB0aGUgdmFsdWUgb2YKKyAgICAiY29ubmVjdGlvblN0cmluZyIgdG8gdXNlICJSZWxlYXNlU1FMU2VydmVyIiBvbmx5IHdoZW4gdGhlICJNYXRjaCIgbG9jYXRvcgorICAgIGZpbmRzIGFuIGF0dHJpYnV0ZSAibmFtZSIgdGhhdCBoYXMgYSB2YWx1ZSBvZiAiTXlEQiIuCisKKyAgICA8Y29ubmVjdGlvblN0cmluZ3M+CisgICAgICA8YWRkIG5hbWU9Ik15REIiCisgICAgICAgIGNvbm5lY3Rpb25TdHJpbmc9IkRhdGEgU291cmNlPVJlbGVhc2VTUUxTZXJ2ZXI7SW5pdGlhbCBDYXRhbG9nPU15UmVsZWFzZURCO0ludGVncmF0ZWQgU2VjdXJpdHk9VHJ1ZSIKKyAgICAgICAgeGR0OlRyYW5zZm9ybT0iU2V0QXR0cmlidXRlcyIgeGR0OkxvY2F0b3I9Ik1hdGNoKG5hbWUpIi8+CisgICAgPC9jb25uZWN0aW9uU3RyaW5ncz4KKyAgLS0+CisgIDxzeXN0ZW0ud2ViPgorICAgIDxjb21waWxhdGlvbiB4ZHQ6VHJhbnNmb3JtPSJSZW1vdmVBdHRyaWJ1dGVzKGRlYnVnKSIgLz4KKyAgICA8IS0tCisgICAgICBJbiB0aGUgZXhhbXBsZSBiZWxvdywgdGhlICJSZXBsYWNlIiB0cmFuc2Zvcm0gd2lsbCByZXBsYWNlIHRoZSBlbnRpcmUKKyAgICAgIDxjdXN0b21FcnJvcnM+IHNlY3Rpb24gb2YgeW91ciBXZWIuY29uZmlnIGZpbGUuCisgICAgICBOb3RlIHRoYXQgYmVjYXVzZSB0aGVyZSBpcyBvbmx5IG9uZSBjdXN0b21FcnJvcnMgc2VjdGlvbiB1bmRlciB0aGUKKyAgICAgIDxzeXN0ZW0ud2ViPiBub2RlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSB0aGUgInhkdDpMb2NhdG9yIiBhdHRyaWJ1dGUuCisKKyAgICAgIDxjdXN0b21FcnJvcnMgZGVmYXVsdFJlZGlyZWN0PSJHZW5lcmljRXJyb3IuaHRtIgorICAgICAgICBtb2RlPSJSZW1vdGVPbmx5IiB4ZHQ6VHJhbnNmb3JtPSJSZXBsYWNlIj4KKyAgICAgICAgPGVycm9yIHN0YXR1c0NvZGU9IjUwMCIgcmVkaXJlY3Q9IkludGVybmFsRXJyb3IuaHRtIi8+CisgICAgICA8L2N1c3RvbUVycm9ycz4KKyAgICAtLT4KKyAgPC9zeXN0ZW0ud2ViPgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvV2ViLmNvbmZpZyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1N2QxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1dlYi5jb25maWcKQEAgLTAsMCArMSw5MiBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKworPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tCisgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBBU1AuTkVUIGFwcGxpY2F0aW9uLCBwbGVhc2UgdmlzaXQKKyAgaHR0cDovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9MaW5rSWQ9MzAxODgwCisgIC0tPgorPGNvbmZpZ3VyYXRpb24+CisgIDxhcHBTZXR0aW5ncz4KKyAgICA8YWRkIGtleT0id2VicGFnZXM6VmVyc2lvbiIgdmFsdWU9IjMuMC4wLjAiIC8+CisgICAgPGFkZCBrZXk9IndlYnBhZ2VzOkVuYWJsZWQiIHZhbHVlPSJmYWxzZSIgLz4KKyAgICA8YWRkIGtleT0iQ2xpZW50VmFsaWRhdGlvbkVuYWJsZWQiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxhZGQga2V5PSJVbm9idHJ1c2l2ZUphdmFTY3JpcHRFbmFibGVkIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICA8YWRkIGtleT0ib3dpbjpBdXRvbWF0aWNBcHBTdGFydHVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgIDwvYXBwU2V0dGluZ3M+CisgIDxzeXN0ZW0ud2ViPgorICAgIDxhdXRoZW50aWNhdGlvbiBtb2RlPSJOb25lIiAvPgorICAgIDxjb21waWxhdGlvbiBkZWJ1Zz0idHJ1ZSIgdGFyZ2V0RnJhbWV3b3JrPSI0LjUiIC8+CisgICAgPGh0dHBSdW50aW1lIHRhcmdldEZyYW1ld29yaz0iNC41IiAvPgorICA8L3N5c3RlbS53ZWI+CisgIDxzeXN0ZW0ud2ViU2VydmVyPgorICAgIDxtb2R1bGVzPgorICAgICAgPHJlbW92ZSBuYW1lPSJGb3Jtc0F1dGhlbnRpY2F0aW9uIiAvPgorICAgIDwvbW9kdWxlcz4KKyAgICA8aGFuZGxlcnM+CisgICAgICA8YWRkIG5hbWU9IkFzeW5jSHR0cEhhbmRsZXIiIHZlcmI9IioiIHBhdGg9IkFzeW5jLnRocmlmdCIgdHlwZT0iVGhyaWZ0TVZDVGVzdC5Bc3luY0h0dHBIYW5kbGVyLCBUaHJpZnRNVkNUZXN0IiAvPgorICAgICAgPGFkZCBuYW1lPSJTeW5jSHR0cEhhbmRsZXIiIHZlcmI9IioiIHBhdGg9IlN5bmMudGhyaWZ0IiB0eXBlPSJUaHJpZnRNVkNUZXN0LlN5bmNIdHRwSGFuZGxlciwgVGhyaWZ0TVZDVGVzdCIgLz4KKyAgICA8L2hhbmRsZXJzPgorICA8L3N5c3RlbS53ZWJTZXJ2ZXI+CisgIDxydW50aW1lPgorICAgIDxhc3NlbWJseUJpbmRpbmcgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIj4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTWljcm9zb2Z0Lk93aW4uU2VjdXJpdHkiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjAuMC4wLjAtMy4wLjEuMCIgbmV3VmVyc2lvbj0iMy4wLjEuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9Ik1pY3Jvc29mdC5Pd2luLlNlY3VyaXR5Lk9BdXRoIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbi5TZWN1cml0eS5Db29raWVzIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTMuMC4xLjAiIG5ld1ZlcnNpb249IjMuMC4xLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJNaWNyb3NvZnQuT3dpbiIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMC4wLjAuMC0zLjAuMS4wIiBuZXdWZXJzaW9uPSIzLjAuMS4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iTmV3dG9uc29mdC5Kc29uIiBjdWx0dXJlPSJuZXV0cmFsIiBwdWJsaWNLZXlUb2tlbj0iMzBhZDRmZTZiMmE2YWVlZCIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTYuMC4wLjAiIG5ld1ZlcnNpb249IjYuMC4wLjAiIC8+CisgICAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgICA8YXNzZW1ibHlJZGVudGl0eSBuYW1lPSJTeXN0ZW0uV2ViLk9wdGltaXphdGlvbiIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0xLjEuMC4wIiBuZXdWZXJzaW9uPSIxLjEuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iV2ViR3JlYXNlIiBwdWJsaWNLZXlUb2tlbj0iMzFiZjM4NTZhZDM2NGUzNSIgLz4KKyAgICAgICAgPGJpbmRpbmdSZWRpcmVjdCBvbGRWZXJzaW9uPSIwLjAuMC4wLTEuNS4yLjE0MjM0IiBuZXdWZXJzaW9uPSIxLjUuMi4xNDIzNCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuSGVscGVycyIgcHVibGljS2V5VG9rZW49IjMxYmYzODU2YWQzNjRlMzUiIC8+CisgICAgICAgIDxiaW5kaW5nUmVkaXJlY3Qgb2xkVmVyc2lvbj0iMS4wLjAuMC0zLjAuMC4wIiBuZXdWZXJzaW9uPSIzLjAuMC4wIiAvPgorICAgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgbmFtZT0iU3lzdGVtLldlYi5NdmMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtNS4yLjMuMCIgbmV3VmVyc2lvbj0iNS4yLjMuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICAgIDxhc3NlbWJseUlkZW50aXR5IG5hbWU9IlN5c3RlbS5XZWIuV2ViUGFnZXMiIHB1YmxpY0tleVRva2VuPSIzMWJmMzg1NmFkMzY0ZTM1IiAvPgorICAgICAgICA8YmluZGluZ1JlZGlyZWN0IG9sZFZlcnNpb249IjEuMC4wLjAtMy4wLjAuMCIgbmV3VmVyc2lvbj0iMy4wLjAuMCIgLz4KKyAgICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgICAgPC9hc3NlbWJseUJpbmRpbmc+CisgIDwvcnVudGltZT4KKzwvY29uZmlndXJhdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L2Zhdmljb24uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYTc5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9mYXZpY29uLmljbwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcgYi9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9wYWNrYWdlcy5jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjODQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L3BhY2thZ2VzLmNvbmZpZwpAQCAtMCwwICsxLDI1IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHBhY2thZ2VzPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5NdmMiIHZlcnNpb249IjUuMi4zIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiAvPgorICA8cGFja2FnZSBpZD0iTWljcm9zb2Z0LkFzcE5ldC5SYXpvciIgdmVyc2lvbj0iMy4yLjMiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+CisgIDxwYWNrYWdlIGlkPSJNaWNyb3NvZnQuQXNwTmV0LldlYlBhZ2VzIiB2ZXJzaW9uPSIzLjIuMyIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KKyAgPHBhY2thZ2UgaWQ9Ik1pY3Jvc29mdC5XZWIuSW5mcmFzdHJ1Y3R1cmUiIHZlcnNpb249IjEuMC4wLjAiIHRhcmdldEZyYW1ld29yaz0ibmV0NDUiIC8+Cis8L3BhY2thZ2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kL01ha2VmaWxlLmFtIGIvbGliL2QvTWFrZWZpbGUuYW0KaW5kZXggMzZhNzU4Yy4uMmE4MTIxOCAxMDA2NDQKLS0tIGEvbGliL2QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2QvTWFrZWZpbGUuYW0KQEAgLTE3LDcgKzE3LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1TVUJESVJTID0gLiB0ZXN0CitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKIAogIwogIyBFbnVtZXJhdGlvbiBvZiBhbGwgdGhlIHB1YmxpYyBhbmQgcHJpdmF0ZSBtb2R1bGVzLgpAQCAtMzUsNyArNDEsMTAgQEAKIGRfYXN5bmNfREFUQSA9ICQoYWRkcHJlZml4IHNyYy8sICQoYWRkc3VmZml4IC5kLCAkKGRfYXN5bmNtb2R1bGVzKSkpCiAKIGRfY29kZWdlbm1vZHVsZXMgPSAkKGFkZHByZWZpeCB0aHJpZnQvY29kZWdlbi8sIGFzeW5jX2NsaWVudCBcCi0JYXN5bmNfY2xpZW50X3Bvb2wgYmFzZSBjbGllbnQgY2xpZW50X3Bvb2wgaWRsZ2VuIHByb2Nlc3NvcikKKwlhc3luY19jbGllbnRfcG9vbCBiYXNlIGNsaWVudCBjbGllbnRfcG9vbCBwcm9jZXNzb3IpCisjZF9jb2RlZ2VubW9kdWxlcyA9ICQoYWRkcHJlZml4IHRocmlmdC9jb2RlZ2VuLywgYXN5bmNfY2xpZW50IFwKKyMJYXN5bmNfY2xpZW50X3Bvb2wgYmFzZSBjbGllbnQgY2xpZW50X3Bvb2wgaWRsZ2VuIHByb2Nlc3NvcikKKwogZF9jb2RlZ2VuZGlyID0gJChkX3RocmlmdGRpcikvY29kZWdlbgogZF9jb2RlZ2VuX0RBVEEgPSAkKGFkZHByZWZpeCBzcmMvLCAkKGFkZHN1ZmZpeCAuZCwgJChkX2NvZGVnZW5tb2R1bGVzKSkpCiAKQEAgLTE2OCw3ICsxNzcsNyBAQAogCXRvdWNoICRACiAKIHVuaXR0ZXN0L2RlYnVnLyU6IHNyYy8lLmQgJChhbGxfdGFyZ2V0cykgdW5pdHRlc3QvZW1wdHltYWluLmQKLQkkKERNRCkgLWdjIC1vZiQoc3Vic3QgLywkKERNRF9PRl9ESVJTRVApLCRAKSAkKGRfdGVzdF9mbGFncykgJF4KKwkkKERNRCkgLWcgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgogCiB1bml0dGVzdC9yZWxlYXNlLyU6IHNyYy8lLmQgJChhbGxfdGFyZ2V0cykgdW5pdHRlc3QvZW1wdHltYWluLmQKIAkkKERNRCkgLU8gLXJlbGVhc2UgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgpAQCAtMTc2LDggKzE4NSwxMCBAQAogVEVTVFMgPSAkKGFkZHByZWZpeCB1bml0dGVzdC9kZWJ1Zy8sICQoZF90ZXN0X21vZHVsZXMpKSBcCiAJJChhZGRwcmVmaXggdW5pdHRlc3QvcmVsZWFzZS8sICQoZF90ZXN0X21vZHVsZXMpKQogCitwcmVjcm9zczogYWxsLWxvY2FsCisJJChNQUtFKSAtQyB0ZXN0IHByZWNyb3NzCiAKIEVYVFJBX0RJU1QgPSBcCiAJc3JjIFwKLQl0ZXN0IFwgCi0JUkVBRE1FCisJdGVzdCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvZC9SRUFETUUgYi9saWIvZC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9kL1JFQURNRQpyZW5hbWUgdG8gbGliL2QvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvZC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2QvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvbGliZXZlbnQuZAppbmRleCAzMzU4YmVmLi44MTJlNGE3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL2xpYmV2ZW50LmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9saWJldmVudC5kCkBAIC0zOTIsNyArMzkyLDcgQEAKICAgICAgIFRBc3luY0V2ZW50UmVhc29uLk5PUk1BTDsKICAgICAoKihjYXN0KFRTb2NrZXRFdmVudExpc3RlbmVyKilhcmcpKShyZWFzb24pOwogICAgIEdDLnJlbW92ZVJhbmdlKGFyZyk7Ci0gICAgY2xlYXIoYXJnKTsKKyAgICBkZXN0cm95KGFyZyk7CiAgICAgZnJlZShhcmcpOwogICB9CiAKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgIGFzc2VydChmbGFncyAmIEVWX1RJTUVPVVQpOwogICAgICgqKGNhc3Qodm9pZCBkZWxlZ2F0ZSgpKilhcmcpKSgpOwogICAgIEdDLnJlbW92ZVJhbmdlKGFyZyk7Ci0gICAgY2xlYXIoYXJnKTsKKyAgICBkZXN0cm95KGFyZyk7CiAgICAgZnJlZShhcmcpOwogICB9CiAKQEAgLTQzMCw3ICs0MzAsNyBAQAogICBXb3JrW11bVEFzeW5jVHJhbnNwb3J0XSB3b3JrUXVldWVzXzsKIAogICAvLy8gVGhlIHRvdGFsIG51bWJlciBvZiB3b3JrIGl0ZW1zIG5vdCB5ZXQgZmluaXNoZWQgKHF1ZXVlZCBhbmQgY3VycmVudGx5Ci0gIC8vLyBleGNlY3V0ZWQpIGFuZCBkZWxheXMgbm90IHlldCBleGVjdXRlZC4KKyAgLy8vIGV4ZWN1dGVkKSBhbmQgZGVsYXlzIG5vdCB5ZXQgZXhlY3V0ZWQuCiAgIHVpbnQgcXVldWVkQ291bnRfOwogCiAgIC8vLyBQcm90ZWN0cyBxdWV1ZWRDb3VudF8uCkBAIC00NDIsOCArNDQyLDggQEAKIAogcHJpdmF0ZSB7CiAgIHRpbWV2YWwgdG9UaW1ldmFsKGNvbnN0KER1cmF0aW9uKSBkdXIpIHsKLSAgICB0aW1ldmFsIHR2ID0ge3R2X3NlYzogY2FzdChpbnQpZHVyLnRvdGFsISJzZWNvbmRzIigpLAotICAgICAgdHZfdXNlYzogZHVyLmZyYWNTZWMudXNlY3N9OworICAgIHRpbWV2YWwgdHY7CisgICAgZHVyLnNwbGl0ISgic2Vjb25kcyIsICJ1c2VjcyIpKHR2LnR2X3NlYywgdHYudHZfdXNlYyk7CiAgICAgcmV0dXJuIHR2OwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCmluZGV4IDZkZTEzZDkuLmEwOGY1MWQgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZApAQCAtMTgsNiArMTgsNyBAQAogICovCiBtb2R1bGUgdGhyaWZ0LmFzeW5jLnNvY2tldDsKIAoraW1wb3J0IGNvcmUuc3RkYy5lcnJubzogRUNPTk5SRVNFVDsKIGltcG9ydCBjb3JlLnRocmVhZCA6IEZpYmVyOwogaW1wb3J0IGNvcmUudGltZSA6IGR1ciwgRHVyYXRpb247CiBpbXBvcnQgc3RkLmFycmF5IDogZW1wdHk7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kCmluZGV4IDI2NjIwMWIuLmQ1ZWNlNzMgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYmFzZS5kCkBAIC00MywxNCArNDMsMTQgQEAKICAgfQogCiAgIC8vLyBUaGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNoaWxkcmVuIG9mIHRoZSBvcGVyYXRpb24uIElmIGFwcGxpY2FibGUsCi0gIC8vLyB0aGUgbGlzdCBpcyBvcmRlcmVkIGluIHRoZSBzYW1lIHdheSB0aGUgZXhjZXB0aW9ucyBvY2N1cmVkLgorICAvLy8gdGhlIGxpc3QgaXMgb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkgdGhlIGV4Y2VwdGlvbnMgb2NjdXJyZWQuCiAgIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnM7CiB9CiAKIC8vLyBUaGUgVGhyaWZ0IHZlcnNpb24gc3RyaW5nLCB1c2VkIGZvciBpbmZvcm1hdGl2ZSBwdXJwb3Nlcy4KIC8vIE5vdGU6IFRoaXMgaXMgY3VycmVudGx5IGhhcmRjb2RlZCwgYnV0IHdpbGwgbGlrZWx5IGJlIGZpbGxlZCBpbiBieSB0aGUgYnVpbGQKIC8vIHN5c3RlbSBpbiBmdXR1cmUgdmVyc2lvbnMuCi1lbnVtIFZFUlNJT04gPSAiMC45LjAgZGV2IjsKK2VudW0gVkVSU0lPTiA9ICIxLjAuMCI7CiAKIC8qKgogICogRnVuY3Rpb25zIHVzZWQgZm9yIGxvZ2dpbmcgaW5zaWRlIFRocmlmdC4KQEAgLTYyLDcgKzYyLDcgQEAKICAqIEV4YW1wbGVzOgogICogLS0tCiAgKiBsb2dJbmZvKCJBbiBpbmZvcm1hdGl2ZSBtZXNzYWdlLiIpOwotICogbG9nRXJyb3IoIlNvbWUgZXJyb3Igb2NjdXJlZDogJXMiLCBlKTsKKyAqIGxvZ0Vycm9yKCJTb21lIGVycm9yIG9jY3VycmVkOiAlcyIsIGUpOwogICogLS0tCiAgKi8KIGFsaWFzIGxvZ0Zvcm1hdHRlZCFnX2luZm9Mb2dTaW5rIGxvZ0luZm87CkBAIC05Myw3ICs5Myw3IEBACiAvLyBUaGlzIHNob3VsZCBiZSBwcml2YXRlLCBpZiBpdCBjb3VsZCBzdGlsbCBiZSB1c2VkIHRocm91Z2ggdGhlIGFsaWFzZXMgdGhlbi4KIHRlbXBsYXRlIGxvZ0Zvcm1hdHRlZChhbGlhcyB0YXJnZXQpIHsKICAgdm9pZCBsb2dGb3JtYXR0ZWQoc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgaW50IGxpbmUgPSBfX0xJTkVfXywKLSAgICBULi4uKShzdHJpbmcgZm9ybWF0LCBUIGFyZ3MpIGlmICgKKyAgICBULi4uKShzdHJpbmcgZm10LCBUIGFyZ3MpIGlmICgKICAgICBfX3RyYWl0cyhjb21waWxlcywgeyB0YXJnZXQoIiIpOyB9KQogICApIHsKICAgICBpbXBvcnQgc3RkLmZvcm1hdCwgc3RkLnN0ZGlvOwpAQCAtMTA3LDkgKzEwNyw5IEBACiAgICAgICBmb3JtYXR0ZWRXcml0ZShnX2Zvcm1hdEJ1ZmZlciwgIiVzOiVzOiAiLCBmaWxlLCBsaW5lKTsKIAogICAgICAgc3RhdGljIGlmIChULmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIGdfZm9ybWF0QnVmZmVyLnB1dChmb3JtYXQpOworICAgICAgICBnX2Zvcm1hdEJ1ZmZlci5wdXQoZm10KTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvcm1hdHRlZFdyaXRlKGdfZm9ybWF0QnVmZmVyLCBmb3JtYXQsIGFyZ3MpOworICAgICAgICBmb3JtYXR0ZWRXcml0ZShnX2Zvcm1hdEJ1ZmZlciwgZm10LCBhcmdzKTsKICAgICAgIH0KICAgICAgIHRhcmdldChnX2Zvcm1hdEJ1ZmZlci5kYXRhKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2Jhc2UuZAppbmRleCBkNjk3Mzc1Li5kYjU0OTkyIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9iYXNlLmQKQEAgLTQzLDExICs0MywxMiBAQAogaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5LCBmcm9udDsKIGltcG9ydCBzdGQuY29udiA6IHRvOwogaW1wb3J0IHN0ZC5leGNlcHRpb24gOiBlbmZvcmNlOwotaW1wb3J0IHN0ZC50cmFpdHMgOiBCYXNlVHlwZVR1cGxlLCBpc1BvaW50ZXIsIGlzU29tZUZ1bmN0aW9uLCBwb2ludGVyVGFyZ2V0LAoraW1wb3J0IHN0ZC50cmFpdHMgOiBCYXNlVHlwZVR1cGxlLCBpc1BvaW50ZXIsIGlzU29tZUZ1bmN0aW9uLCBQb2ludGVyVGFyZ2V0LAogICBSZXR1cm5UeXBlOwogaW1wb3J0IHRocmlmdC5iYXNlOwogaW1wb3J0IHRocmlmdC5pbnRlcm5hbC5jb2RlZ2VuOwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOworaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CiAKIC8qCiAgKiBUaHJpZnQgc3RydWN0L3NlcnZpY2UgbWV0YSBkYXRhLCB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGZyb20KQEAgLTM1OCw3ICszNTksNyBAQAogbWl4aW4gdGVtcGxhdGUgVFN0cnVjdEhlbHBlcnMoYWxpYXMgZmllbGRNZXRhRGF0YSA9IGNhc3QoVEZpZWxkTWV0YVtdKW51bGwpIGlmICgKICAgaXModHlwZW9mKGZpZWxkTWV0YURhdGEpIDogVEZpZWxkTWV0YVtdKQogKSB7Ci0gIGltcG9ydCBzdGQuYWxnb3JpdGhtIDogY2FuRmluZDsKKyAgaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBhbnk7CiAgIGltcG9ydCB0aHJpZnQuY29kZWdlbi5iYXNlOwogICBpbXBvcnQgdGhyaWZ0LmludGVybmFsLmNvZGVnZW4gOiBpc051bGxhYmxlLCBNZW1iZXJUeXBlLCBtZXJnZUZpZWxkTWV0YSwKICAgICBGaWVsZE5hbWVzOwpAQCAtNDE5LDYgKzQyMCwxMCBAQAogCiAgICAgICByZXR1cm4gKGNhc3QoKXN1cGVyKS5vcEVxdWFscyhvdGhlcik7CiAgICAgfQorCisgICAgb3ZlcnJpZGUgc2l6ZV90IHRvSGFzaCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiB0aHJpZnRUb0hhc2hJbXBsKCk7CisgICAgfQogICB9IGVsc2UgewogICAgIHN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKICAgICAgIHJldHVybiB0aHJpZnRUb1N0cmluZ0ltcGwoKTsKQEAgLTQyNyw2ICs0MzIsMTAgQEAKICAgICBib29sIG9wRXF1YWxzKHJlZiBjb25zdCBUaGlzIG90aGVyKSBjb25zdCB7CiAgICAgICByZXR1cm4gdGhyaWZ0T3BFcXVhbHNJbXBsKG90aGVyKTsKICAgICB9CisKKyAgICBzaXplX3QgdG9IYXNoKCkgY29uc3QgQHNhZmUgbm90aHJvdyB7CisgICAgICByZXR1cm4gdGhyaWZ0VG9IYXNoSW1wbCgpOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgc3RyaW5nIHRocmlmdFRvU3RyaW5nSW1wbCgpIGNvbnN0IHsKQEAgLTQ1OSw3ICs0NjgsMTYgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIHN0YXRpYyBpZiAoY2FuRmluZCFgIWEuZGVmYXVsdFZhbHVlLmVtcHR5YChtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKSB7CisgIHByaXZhdGUgc2l6ZV90IHRocmlmdFRvSGFzaEltcGwoKSBjb25zdCBAdHJ1c3RlZCBub3Rocm93IHsKKyAgICBzaXplX3QgaGFzaCA9IDA7CisgICAgZm9yZWFjaCAoaSwgXzsgdGhpcy50dXBsZW9mKSB7CisgICAgICBhdXRvIHZhbCA9IHRoaXMudHVwbGVvZltpXTsKKyAgICAgIGhhc2ggKz0gdHlwZWlkKHZhbCkuZ2V0SGFzaCgmdmFsKTsKKyAgICB9CisgICAgcmV0dXJuIGhhc2g7CisgIH0KKworICBzdGF0aWMgaWYgKGFueSFgIWEuZGVmYXVsdFZhbHVlLmVtcHR5YChtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKSB7CiAgICAgc3RhdGljIGlmIChpcyhUaGlzIF8gPT0gY2xhc3MpKSB7CiAgICAgICB0aGlzKCkgewogICAgICAgICBtaXhpbih0aHJpZnRGaWVsZEluaXRDb2RlIShtZXJnZUZpZWxkTWV0YSEoVGhpcywgZmllbGRNZXRhRGF0YSkpKCJ0aGlzIikpOwpAQCAtNTAwLDEwICs1MTgsMTAgQEAKICAgcmV0dXJuIGNvZGU7CiB9CiAKLXZlcnNpb24gKHVuaXR0ZXN0KSB7Cit1bml0dGVzdCB7CiAgIC8vIENhbm5vdCBtYWtlIHRoaXMgbmVzdGVkIGluIHRoZSB1bml0dGVzdCBibG9jayBkdWUgdG8gYSDCu25vIHNpemUgeWV0IGZvcgogICAvLyBmb3J3YXJkIHJlZmVyZW5jZcKrIGVycm9yLgotICBzdHJ1Y3QgRm9vIHsKKyAgc3RhdGljIHN0cnVjdCBGb28gewogICAgIHN0cmluZyBhOwogICAgIGludCBiOwogICAgIGludCBjOwpAQCAtNTE0LDggKzUzMiw3IEBACiAgICAgICBURmllbGRNZXRhKCJjIiwgMywgVFJlcS5SRVFVSVJFRCwgIjQiKQogICAgIF0pOwogICB9Ci19Ci11bml0dGVzdCB7CisKICAgYXV0byBmID0gRm9vKCk7CiAKICAgZi5zZXQhImIiKDEyMzQ1KTsKQEAgLTU3NSw3ICs1OTIsNyBAQAogICogdGhlIHdpcmUgd2l0aG91dCBhbHRlcmluZyB0aGVpciBkZWZpbml0aW9ucy4KICAqLwogdm9pZCByZWFkU3RydWN0KFQsIFByb3RvY29sLCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCwKLSAgYm9vbCBwb2ludGVyU3RydWN0ID0gZmFsc2UpKHJlZiBUIHMsIFByb3RvY29sIHApIGlmIChpc1RQcm90b2NvbCFQcm90b2NvbCkKKyAgYm9vbCBwb2ludGVyU3RydWN0ID0gZmFsc2UpKGF1dG8gcmVmIFQgcywgUHJvdG9jb2wgcCkgaWYgKGlzVFByb3RvY29sIVByb3RvY29sKQogewogICBtaXhpbih7CiAgICAgc3RyaW5nIGNvZGU7CkBAIC02NzQsNyArNjkxLDcgQEAKICAgICBzdHJpbmcgcmVhZEZpZWxkQ29kZShGaWVsZFR5cGUpKHN0cmluZyBuYW1lLCBzaG9ydCBpZCwgVFJlcSByZXEpIHsKICAgICAgIHN0YXRpYyBpZiAocG9pbnRlclN0cnVjdCAmJiBpc1BvaW50ZXIhRmllbGRUeXBlKSB7CiAgICAgICAgIGltbXV0YWJsZSB2ID0gIigqcy4iIH4gbmFtZSB+ICIpIjsKLSAgICAgICAgYWxpYXMgcG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKKyAgICAgICAgYWxpYXMgUG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGltbXV0YWJsZSB2ID0gInMuIiB+IG5hbWU7CiAgICAgICAgIGFsaWFzIEZpZWxkVHlwZSBGOwpAQCAtODYyLDcgKzg3OSw3IEBACiAKICAgICAgIHN0YXRpYyBpZiAocG9pbnRlclN0cnVjdCAmJiBpc1BvaW50ZXIhRmllbGRUeXBlKSB7CiAgICAgICAgIGltbXV0YWJsZSB2ID0gIigqcy4iIH4gbmFtZSB+ICIpIjsKLSAgICAgICAgYWxpYXMgcG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKKyAgICAgICAgYWxpYXMgUG9pbnRlclRhcmdldCFGaWVsZFR5cGUgRjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGltbXV0YWJsZSB2ID0gInMuIiB+IG5hbWU7CiAgICAgICAgIGFsaWFzIEZpZWxkVHlwZSBGOwpAQCAtOTEzLDcgKzkzMCw3IEBACiAgIC8vIGNvbWJpbmF0aW9ucy4gRnVuY3Rpb25hbGl0eSBjaGVja3MgYXJlIGNvdmVyZWQgYnkgdGhlIHJlc3Qgb2YgdGhlIHRlc3QKICAgLy8gc3VpdGUuCiAKLSAgc3RydWN0IFRlc3QgeworICBzdGF0aWMgc3RydWN0IFRlc3QgewogICAgIC8vIE5vbi1udWxsYWJsZS4KICAgICBpbnQgYTE7CiAgICAgaW50IGEyOwpAQCAtOTQyLDYgKzk1OSwyOSBAQAogICBzdGF0aWMgYXNzZXJ0KF9fdHJhaXRzKGNvbXBpbGVzLCB7IFRlc3QgdDsgdC53cml0ZShjYXN0KFRQcm90b2NvbCludWxsKTsgfSkpOwogfQogCisvLyBFbnN1cmUgb3BFcXVhbHMgYW5kIHRvSGFzaCBjb25zaXN0ZW5jeS4KK3VuaXR0ZXN0IHsKKyAgc3RydWN0IFRlc3RFcXVhbHMgeworICAgIGludCBhMTsKKworICAgIG1peGluIFRTdHJ1Y3RIZWxwZXJzIShbCisgICAgICBURmllbGRNZXRhKCJhMSIsIDEsIFRSZXEuT1BUX0lOX1JFUV9PVVQpLAorICAgIF0pOworICB9CisKKyAgVGVzdEVxdWFscyBhLCBiOworICBhc3NlcnQoYSA9PSBiKTsKKyAgYXNzZXJ0KGEudG9IYXNoKCkgPT0gYi50b0hhc2goKSk7CisKKyAgYS5hMSA9IDQyOworICBhc3NlcnQoYSAhPSBiKTsKKyAgYXNzZXJ0KGEudG9IYXNoKCkgIT0gYi50b0hhc2goKSk7CisKKyAgYi5hMSA9IDQyOworICBhc3NlcnQoYSA9PSBiKTsKKyAgYXNzZXJ0KGEudG9IYXNoKCkgPT0gYi50b0hhc2goKSk7Cit9CisKIHByaXZhdGUgewogICAvKgogICAgKiBSZXR1cm5zIGEgRCBjb2RlIHN0cmluZyBjb250YWluaW5nIHRoZSBtYXRjaGluZyBUVHlwZSB2YWx1ZSBmb3IgYSBwYXNzZWQKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnQuZAppbmRleCA5NzU1ZWE4Li4xMTdiMDc2IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50LmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2NsaWVudC5kCkBAIC0xODQsMTMgKzE4NCwxNSBAQAogICAgICAgICAgICJUUGFyZ3NTdHJ1Y3QhKEludGVyZmFjZSwgYCIgfiBtZXRob2ROYW1lIH4gImApIjsKICAgICAgICAgY29kZSB+PSBwYXJhbVN0cnVjdFR5cGUgfiAiIGFyZ3MgPSAiIH4gcGFyYW1TdHJ1Y3RUeXBlIH4gIigpO1xuIjsKICAgICAgICAgY29kZSB+PSBwYXJhbUFzc2lnbkNvZGU7Ci0gICAgICAgIGNvZGUgfj0gIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShgIiB+IG1ldGhvZE5hbWUgfgotICAgICAgICAgICJgLCBUTWVzc2FnZVR5cGUuQ0FMTCwgKytzZXFpZF8pKTtcbiI7CisgICAgICAgIGNvZGUgfj0gIm9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZShgIiB+IG1ldGhvZE5hbWUgfiAiYCwgIjsKKyAgICAgICAgY29kZSB+PSAoKG1ldGhvZE1ldGFGb3VuZCAmJiBtZXRob2RNZXRhLnR5cGUgPT0gVE1ldGhvZFR5cGUuT05FV0FZKQorICAgICAgICAgICAgICAgICA/ICJUTWVzc2FnZVR5cGUuT05FV0FZIiA6ICJUTWVzc2FnZVR5cGUuQ0FMTCIpOworICAgICAgICBjb2RlIH49ICIsICsrc2VxaWRfKSk7XG4iOwogICAgICAgICBjb2RlIH49ICJhcmdzLndyaXRlKG9wcm90Xyk7XG4iOwogICAgICAgICBjb2RlIH49ICJvcHJvdF8ud3JpdGVNZXNzYWdlRW5kKCk7XG4iOwogICAgICAgICBjb2RlIH49ICJvcHJvdF8udHJhbnNwb3J0LmZsdXNoKCk7XG4iOwogCi0gICAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgb25ld2F5IG1ldGhvZCwgZ2VuZXJhdGUgdGhlIHJlY2lldmluZyBjb2RlLgorICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG9uZXdheSBtZXRob2QsIGdlbmVyYXRlIHRoZSByZWNlaXZpbmcgY29kZS4KICAgICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgfHwgbWV0aG9kTWV0YS50eXBlICE9IFRNZXRob2RUeXBlLk9ORVdBWSkgewogICAgICAgICAgIGNvZGUgfj0gIlRQcmVzdWx0U3RydWN0IShJbnRlcmZhY2UsIGAiIH4gbWV0aG9kTmFtZSB+ICJgKSByZXN1bHQ7XG4iOwogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vY2xpZW50X3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kCmluZGV4IGViZjViNjAuLmM0NmI3NDMgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9jbGllbnRfcG9vbC5kCkBAIC0yMDUsNyArMjA1LDcgQEAKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2UgYXJlIGRlYWxpbmcgd2l0aCBhIG5vcm1hbCBleGNlcHRpb24gdGhyb3duIGJ5IHRoZQogICAgICAgICAgICAgLy8gc2VydmVyLXNpZGUgbWV0aG9kLCBqdXN0IHBhc3MgaXQgb24uIEFzIGZhciBhcyB3ZSBhcmUKLSAgICAgICAgICAgIC8vIGNvbmNlcm5lZCwgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZGVkLgorICAgICAgICAgICAgLy8gY29uY2VybmVkLCB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZGVkLgogICAgICAgICAgICAgcG9vbF8ucmVjb3JkU3VjY2VzcyhjKTsKICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kIGIvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL2lkbGdlbi5kCmluZGV4IDAzZTliOTAuLjlmODg5MzYgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9pZGxnZW4uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vaWRsZ2VuLmQKQEAgLTE1NSwxMCArMTU1LDEwIEBACiAgICAgICAvLyB0aGUgZnJvbnQuIEJlY2F1c2Ugd2l0aCB0aGUgVGhyaWZ0IGNvbXBpbGVyIHR5cGVzIGNhbiBvbmx5IGRlcGVuZCBvbgogICAgICAgLy8gb3RoZXIgdHlwZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLCB3ZSBjb2xsZWN0IGFsbCB0aGUKICAgICAgIC8vIGRlcGVuZGVuY2llcywgcHJlcGVuZCB0aGVtIHRvIHRoZSBsaXN0LCBhbmQgdGhlbiBwcnVuZSB0aGUgZHVwbGljYXRlcwotICAgICAgLy8gKGtlZXBpbmcgdGhlIGZpcnN0IG9jY3VyZW5jZXMpLiBJZiB0aGlzIHJlcXVpcmVtZW50IHNob3VsZCBldmVyIGJlCisgICAgICAvLyAoa2VlcGluZyB0aGUgZmlyc3Qgb2NjdXJyZW5jZXMpLiBJZiB0aGlzIHJlcXVpcmVtZW50IHNob3VsZCBldmVyIGJlCiAgICAgICAvLyBkcm9wcGVkIGZyb20gVGhyaWZ0LCB0aGlzIGNvdWxkIGJlIGVhc2lseSBhZGFwdGVkIHRvIGhhbmRsZSBjaXJjdWxhcgogICAgICAgLy8gZGVwZW5kZW5jaWVzIGJ5IHBhc3NpbmcgVHlwZVR1cGxlIShULCBMaXN0KSB0byBGb3JBbGxXaXRoTGlzdCBpbnN0ZWFkCi0gICAgICAvLyBvZiBhcHBlbmRpbmcgTGlzdCBhZnRlcndhcmRzLCBhbmQgcmVtb3ZpbmcgdGhlIG5vdyB1bm5lY2Nlc2FyeQorICAgICAgLy8gb2YgYXBwZW5kaW5nIExpc3QgYWZ0ZXJ3YXJkcywgYW5kIHJlbW92aW5nIHRoZSBub3cgdW5uZWNlc3NhcnkKICAgICAgIC8vIE5vRHVwbGljYXRlcy4KICAgICAgIGFsaWFzIE5vRHVwbGljYXRlcyEoCiAgICAgICAgIEZvckFsbFdpdGhMaXN0ISgKQEAgLTY0MSwxMyArNjQxLDE2IEBACiB9CiBgKTsKIAotICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMgPT0KK2ltcG9ydCBzdGQuYWxnb3JpdGhtOworICBzdGF0aWMgYXNzZXJ0KHN0cnVjdElkbFN0cmluZyFXaXRoRGVmYXVsdHMuc3RhcnRzV2l0aCgKIGBzdHJ1Y3QgV2l0aERlZmF1bHRzIHsKICAgLTE6IHN0cmluZyBhID0gImFzZGYiLAotICAtMjogZG91YmxlIGIgPSAzLjE0MTUsCi0gIDE6IFdpdGhvdXRNZXRhIGMgPSB7YTogImZvbyIsIGI6IDMsIH0sCisgIC0yOiBkb3VibGUgYiA9IDMuMTQxYCkpOworCisgIHN0YXRpYyBhc3NlcnQoc3RydWN0SWRsU3RyaW5nIVdpdGhEZWZhdWx0cy5lbmRzV2l0aCgKK2AxOiBXaXRob3V0TWV0YSBjID0ge2E6ICJmb28iLCBiOiAzLCB9LAogfQotYCk7CitgKSk7CiAKICAgc3RhdGljIGFzc2VydChzdHJ1Y3RJZGxTdHJpbmchT25lT2ZFYWNoID09CiBgc3RydWN0IE9uZU9mRWFjaCB7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vcHJvY2Vzc29yLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2NvZGVnZW4vcHJvY2Vzc29yLmQKaW5kZXggZTZiNzdmYS4uNWNlN2FjNiAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9jb2RlZ2VuL3Byb2Nlc3Nvci5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvY29kZWdlbi9wcm9jZXNzb3IuZApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIGNvZGUgfj0gInJlc3VsdC5zZXQhYHN1Y2Nlc3NgKCIgfiBjYWxsIH4gIik7XG4iOwogICAgICAgfQogCi0gICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIG9uZXdheSBtZXRob2QsIGdlbmVyYXRlIHRoZSByZWNpZXZpbmcgY29kZS4KKyAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgb25ld2F5IG1ldGhvZCwgZ2VuZXJhdGUgdGhlIHJlY2VpdmluZyBjb2RlLgogICAgICAgaWYgKCFtZXRob2RNZXRhRm91bmQgfHwgbWV0aG9kTWV0YS50eXBlICE9IFRNZXRob2RUeXBlLk9ORVdBWSkgewogICAgICAgICBpZiAobWV0aG9kTWV0YUZvdW5kKSB7CiAgICAgICAgICAgZm9yZWFjaCAoZTsgbWV0aG9kTWV0YS5leGNlcHRpb25zKSB7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2NvZGVnZW4uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY29kZWdlbi5kCmluZGV4IGQ2Y2UwYTkuLjg1ZjlkMTggMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY29kZWdlbi5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY29kZWdlbi5kCkBAIC0xOSw2ICsxOSw3IEBACiAKIG1vZHVsZSB0aHJpZnQuaW50ZXJuYWwuY29kZWdlbjsKIAoraW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBjYW5GaW5kOwogaW1wb3J0IHN0ZC50cmFpdHMgOiBJbnRlcmZhY2VzVHVwbGUsIGlzU29tZUZ1bmN0aW9uLCBpc1NvbWVTdHJpbmc7CiBpbXBvcnQgc3RkLnR5cGV0dXBsZSA6IHN0YXRpY0luZGV4T2YsIHN0YXRpY01hcCwgTm9EdXBsaWNhdGVzLCBUeXBlVHVwbGU7CiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uYmFzZTsKQEAgLTE3OCw2ICsxNzksNyBAQAogdGVtcGxhdGUgRmllbGROYW1lcyhULCBhbGlhcyBmaWVsZE1ldGFEYXRhID0gY2FzdChURmllbGRNZXRhW10pbnVsbCkgewogICBhbGlhcyBTdGF0aWNGaWx0ZXIhKAogICAgIEFsbCEoCisgICAgICBkb2VzTm90UmVhZE1lbWJlcnMsCiAgICAgICBQQXBwbHkhKGlzVmFsdWVNZW1iZXIsIFQpLAogICAgICAgUEFwcGx5IShub3RJZ25vcmVkLCBULCBQQXBwbHlTa2lwLCBmaWVsZE1ldGFEYXRhKQogICAgICksCkBAIC0xODUsNiArMTg3LDE3IEBACiAgICkgRmllbGROYW1lczsKIH0KIAorLyoKKyAqIHRydWUgaWYgdGhlIHBhc3NlZCBtZW1iZXIgbmFtZSBpcyBub3QgYSBtZXRob2QgZ2VuZXJhdGVkIGJ5IHRoZQorICogVFN0cnVjdEhlbHBlcnMgdGVtcGxhdGUgdGhhdCBpbiBpdHMgaW1wbGVtZW50YXRpb25zIHF1ZXJpZXMgdGhlIHN0cnVjdAorICogbWVtYmVycy4KKyAqCisgKiBLbHVkZ2UgdXNlZCBpbnRlcm5hbGx5IHRvIGJyZWFrIGEgY3ljbGUgY2F1c2VkIGEgRE1EIGZvcndhcmQgcmVmZXJlbmNlCisgKiByZWdyZXNzaW9uLCBzZWUgVEhSSUZULTIxMzAuCisgKi8KK2VudW0gZG9lc05vdFJlYWRNZW1iZXJzKHN0cmluZyBuYW1lKSA9ICFbIm9wRXF1YWxzIiwgInRocmlmdE9wRXF1YWxzSW1wbCIsCisgICJ0b1N0cmluZyIsICJ0aHJpZnRUb1N0cmluZ0ltcGwiXS5jYW5GaW5kKG5hbWUpOworCiB0ZW1wbGF0ZSBkZXJpdmVkTWVtYmVycyhUKSB7CiAgIGFsaWFzIFR5cGVUdXBsZSEoX190cmFpdHMoZGVyaXZlZE1lbWJlcnMsIFQpKSBkZXJpdmVkTWVtYmVyczsKIH0KQEAgLTIwMSw3ICsyMTQsNyBAQAogICApIEFsbE1lbWJlck1ldGhvZE5hbWVzOwogfQogCi1wcml2YXRlIHRlbXBsYXRlIEZpbHRlck1ldGhvZE5hbWVzKFQsIE1lbWJlck5hbWVzLi4uKSB7Cit0ZW1wbGF0ZSBGaWx0ZXJNZXRob2ROYW1lcyhULCBNZW1iZXJOYW1lcy4uLikgewogICBhbGlhcyBTdGF0aWNGaWx0ZXIhKAogICAgIENvbXBpbGVzQW5kVHJ1ZSEoCiAgICAgICBDb21wb3NlIShpc1NvbWVGdW5jdGlvbiwgVHlwZU9mLCBQQXBwbHkhKEdldE1lbWJlciwgVCkpCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL2N0ZmUuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY3RmZS5kCmluZGV4IDNiMTBhNzguLjk3NGRiMDEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY3RmZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvY3RmZS5kCkBAIC04NiwxMSArODYsMTMgQEAKIH0KIAogdW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmFsZ29yaXRobTsKICAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoZG91YmxlLmluZmluaXR5KSA9PSAiaW5mIik7CiAgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKC1kb3VibGUuaW5maW5pdHkpID09ICItaW5mIik7CiAgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKGRvdWJsZS5uYW4pID09ICJuYW4iKTsKICAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMC4wKSA9PSAiMCIpOwogICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygtMC4wKSA9PSAiLTAiKTsKLSAgc3RhdGljIGFzc2VydChjdGZlVG9TdHJpbmcoMy4xNDE1KSA9PSAiMy4xNDE1Iik7CisgIHN0YXRpYyBhc3NlcnQoY3RmZVRvU3RyaW5nKDIuNSkgPT0gIjIuNSIpOworICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygzLjE0MTUpLnN0YXJ0c1dpdGgoIjMuMTQxIikpOwogICBzdGF0aWMgYXNzZXJ0KGN0ZmVUb1N0cmluZygyZS0yMDApID09ICIyZS0yMDAiKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvcmVzb3VyY2VfcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQKaW5kZXggOGJkNmFjNS4uYzA4MjBhMyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9yZXNvdXJjZV9wb29sLmQKQEAgLTY1LDcgKzY1LDcgQEAKICAgLyoqCiAgICAqIFJldHVybnMgYW4gwrtlbnJpY2hlZMKrIGlucHV0IHJhbmdlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgcG9vbCBtZW1iZXJzLgogICAgKi8KLSAgc3RydWN0IFJhbmdlIHsKKyAgc3RhdGljIHN0cnVjdCBSYW5nZSB7CiAgICAgLyoqCiAgICAgICogV2hldGhlciB0aGUgcmFuZ2UgaXMgZW1wdHkuCiAgICAgICoKQEAgLTk4LDkgKzk4LDcgQEAKICAgICAgICAgYXV0byBmaSA9IHIgaW4gcGFyZW50Xy5mYXVsdEluZm9zXzsKIAogICAgICAgICBpZiAoZmkgJiYgZmkucmVzZXRUaW1lICE9IGZpLnJlc2V0VGltZS5pbml0KSB7Ci0gICAgICAgICAgLy8gVGhlIGFyZ3VtZW50IHRvIDwgbmVlZHMgdG8gYmUgYW4gbHZhbHVl4oCmCi0gICAgICAgICAgYXV0byBjdXJyZW50VGljayA9IFRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljazsKLSAgICAgICAgICBpZiAoZmkucmVzZXRUaW1lIDwgY3VycmVudFRpY2spIHsKKyAgICAgICAgICBpZiAoZmkucmVzZXRUaW1lIDwgcGFyZW50Xy5nZXRDdXJyZW50VGlja18oKSkgewogICAgICAgICAgICAgLy8gVGhlIHRpbWVvdXQgZXhwaXJlZCwgcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBsaXN0IGFuZCBnbwogICAgICAgICAgICAgLy8gYWhlYWQgdHJ5aW5nIGl0LgogICAgICAgICAgICAgcGFyZW50Xy5mYXVsdEluZm9zXy5yZW1vdmUocik7CkBAIC0xNTQsNyArMTUyLDcgQEAKICAgICAgKi8KICAgICBib29sIHdpbGxCZWNvbWVOb25lbXB0eShvdXQgUmVzb3VyY2UgbmV4dCwgb3V0IER1cmF0aW9uIHdhaXRUaW1lKSB7CiAgICAgICAvLyBJZiBubyByZXNvdXJjZXMgYXJlIGluIHRoZSBwb29sLCB0aGUgcmFuZ2Ugd2lsbCBuZXZlciBiZWNvbWUgbm9uLWVtcHR5LgotICAgICAgaWYgKHJlc291cmNlc18uZW1wdHkpIHJldHVybiB0cnVlOworICAgICAgaWYgKHJlc291cmNlc18uZW1wdHkpIHJldHVybiBmYWxzZTsKIAogICAgICAgLy8gSWYgY3ljbGUgbW9kZSBpcyBub3QgZW5hYmxlZCwgYSByYW5nZSBuZXZlciBiZWNvbWVzIG5vbi1lbXB0eSBhZnRlcgogICAgICAgLy8gYmVpbmcgZW1wdHkgb25jZSwgYmVjYXVzZSBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuCkBAIC0xNjcsNyArMTY1LDcgQEAKICAgICAgICkuZnJvbnQ7CiAKICAgICAgIG5leHQgPSBuZXh0UGFpclswXTsKLSAgICAgIHdhaXRUaW1lID0gdG8hRHVyYXRpb24obmV4dFBhaXJbMV0ucmVzZXRUaW1lIC0gVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrKTsKKyAgICAgIHdhaXRUaW1lID0gdG8hRHVyYXRpb24obmV4dFBhaXJbMV0ucmVzZXRUaW1lIC0gcGFyZW50Xy5nZXRDdXJyZW50VGlja18oKSk7CiAKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTIzMiw4ICsyMzAsNyBAQAogICAgIGlmIChmaS5jb3VudCA+PSBmYXVsdERpc2FibGVDb3VudCkgewogICAgICAgLy8gSWYgdGhlIHJlc291cmNlIGhhcyBoaXQgdGhlIGZhdWx0IGNvdW50IGxpbWl0LCBkaXNhYmxlIGl0IGZvcgogICAgICAgLy8gc3BlY2lmaWVkIGR1cmF0aW9uLgotICAgICAgZmkucmVzZXRUaW1lID0gVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrICsKLSAgICAgICAgVGlja0R1cmF0aW9uLmZyb20hImhuc2VjcyIoZmF1bHREaXNhYmxlRHVyYXRpb24udG90YWwhImhuc2VjcyIpOworICAgICAgZmkucmVzZXRUaW1lID0gZ2V0Q3VycmVudFRpY2tfKCkgKyBjYXN0KFRpY2tEdXJhdGlvbilmYXVsdERpc2FibGVEdXJhdGlvbjsKICAgICB9CiAgIH0KIApAQCAtMjcwLDYgKzI2NywxNSBAQAogcHJpdmF0ZToKICAgUmVzb3VyY2VbXSByZXNvdXJjZXNfOwogICBGYXVsdEluZm9bUmVzb3VyY2VdIGZhdWx0SW5mb3NfOworCisgIC8vLyBGdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgdGltZXN0YW1wIGZyb20gc29tZSBtb25vdG9uaWMgc3lzdGVtIGNsb2NrLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb3ZlcnJpZGFibGUgdG8gYmUgYWJsZSB0byB3cml0ZSB0aW1pbmctaW5zZW5zaXRpdmUgdW5pdCB0ZXN0cy4KKyAgLy8vIFRoZSBleHRyYSBpbmRpcmVjdGlvbiBzaG91bGQgbm90IG1hdHRlciBtdWNoIHBlcmZvcm1hbmNlLXdpc2UgY29tcGFyZWQgdG8KKyAgLy8vIHRoZSBhY3R1YWwgc3lzdGVtIGNhbGwsIGFuZCBieSBpdHMgdmVyeSBuYXR1cmUgdGhpc3Nob3VsZCBub3QgYmUgb24gYSBob3QKKyAgLy8vIHBhdGggYW55d2F5LgorICB0eXBlb2YoJlRpY2tEdXJhdGlvbi5jdXJyU3lzdGVtVGljaykgZ2V0Q3VycmVudFRpY2tfID0KKyAgICAmVGlja0R1cmF0aW9uLmN1cnJTeXN0ZW1UaWNrOwogfQogCiBwcml2YXRlIHsKQEAgLTI3OSwxMSArMjg1LDE3IEBACiAgIH0KIH0KIAotaW1wb3J0IHN0ZC5kYXRldGltZTsKLWltcG9ydCB0aHJpZnQuYmFzZTsKK3VuaXR0ZXN0IHsKKyAgYXV0byBwb29sID0gbmV3IFRSZXNvdXJjZVBvb2whT2JqZWN0KFtdKTsKKyAgZW5mb3JjZShwb29sW10uZW1wdHkpOworICBPYmplY3QgZHVtbXlSZXM7CisgIER1cmF0aW9uIGR1bW15RHVyOworICBlbmZvcmNlKCFwb29sW10ud2lsbEJlY29tZU5vbmVtcHR5KGR1bW15UmVzLCBkdW1teUR1cikpOworfQogCiB1bml0dGVzdCB7Ci0gIGltcG9ydCBjb3JlLnRocmVhZDsKKyAgaW1wb3J0IHN0ZC5kYXRldGltZTsKKyAgaW1wb3J0IHRocmlmdC5iYXNlOwogCiAgIGF1dG8gYSA9IG5ldyBPYmplY3Q7CiAgIGF1dG8gYiA9IG5ldyBPYmplY3Q7CkBAIC0yOTEsNyArMzAzLDEwIEBACiAgIGF1dG8gb2JqcyA9IFthLCBiLCBjXTsKICAgYXV0byBwb29sID0gbmV3IFRSZXNvdXJjZVBvb2whT2JqZWN0KG9ianMpOwogICBwb29sLnBlcm11dGUgPSBmYWxzZTsKLSAgcG9vbC5mYXVsdERpc2FibGVEdXJhdGlvbiA9IGR1ciEibXNlY3MiKDUpOworCisgIHN0YXRpYyBEdXJhdGlvbiBmYWtlQ2xvY2s7CisgIHBvb2wuZ2V0Q3VycmVudFRpY2tfID0gKCkgPT4gY2FzdChUaWNrRHVyYXRpb24pZmFrZUNsb2NrOworCiAgIE9iamVjdCBkdW1teVJlcyA9IHZvaWQ7CiAgIER1cmF0aW9uIGR1bW15RHVyID0gdm9pZDsKIApAQCAtMzI4LDcgKzM0Myw3IEBACiAgICAgZW5mb3JjZShyLmVtcHR5KTsKICAgICBlbmZvcmNlKCFyLndpbGxCZWNvbWVOb25lbXB0eShkdW1teVJlcywgZHVtbXlEdXIpKTsKIAotICAgIFRocmVhZC5zbGVlcChkdXIhIm1zZWNzIig1KSk7CisgICAgZmFrZUNsb2NrICs9IDIuc2Vjb25kczsKICAgICAvLyBOb3QgaW4gY3ljbGUgbW9kZSwgaGFzIHRvIGJlIHN0aWxsIGVtcHR5IGFmdGVyIHRoZSB0aW1lb3V0cyBleHBpcmVkLgogICAgIGVuZm9yY2Uoci5lbXB0eSk7CiAgICAgZW5mb3JjZSghci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CkBAIC0zNDAsOSArMzU1LDcgQEAKICAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKIAogICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7Ci0gICAgVGhyZWFkLnNsZWVwKGR1ciEidXNlY3MiKDEpKTsKICAgICBwb29sLnJlY29yZEZhdWx0KGIpOwotICAgIFRocmVhZC5zbGVlcChkdXIhInVzZWNzIigxKSk7CiAgICAgcG9vbC5yZWNvcmRGYXVsdChjKTsKIAogICAgIGF1dG8gciA9IHBvb2xbXTsKQEAgLTM4Myw3ICszOTYsNyBAQAogICAgIHIucG9wRnJvbnQoKTsKICAgICBlbmZvcmNlKHIuZnJvbnQgPT0gYik7CiAKLSAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoNSkpOworICAgIGZha2VDbG9jayArPSAyLnNlY29uZHM7CiAKICAgICByLnBvcEZyb250KCk7CiAgICAgZW5mb3JjZShyLmZyb250ID09IGMpOwpAQCAtNDAwLDE5ICs0MTMsMTggQEAKICAgICBwb29sLmZhdWx0RGlzYWJsZUNvdW50ID0gMTsKIAogICAgIHBvb2wucmVjb3JkRmF1bHQoYSk7Ci0gICAgVGhyZWFkLnNsZWVwKGR1ciEidXNlY3MiKDEpKTsKKyAgICBmYWtlQ2xvY2sgKz0gMS5tc2VjczsKICAgICBwb29sLnJlY29yZEZhdWx0KGIpOwotICAgIFRocmVhZC5zbGVlcChkdXIhInVzZWNzIigxKSk7CisgICAgZmFrZUNsb2NrICs9IDEubXNlY3M7CiAgICAgcG9vbC5yZWNvcmRGYXVsdChjKTsKIAogICAgIGF1dG8gciA9IHBvb2xbXTsKICAgICBlbmZvcmNlKHIuZW1wdHkpOwogCi0gICAgT2JqZWN0IG5leHRSZXM7Ci0gICAgRHVyYXRpb24gbmV4dFdhaXQ7Ci0gICAgZW5mb3JjZShyLndpbGxCZWNvbWVOb25lbXB0eShuZXh0UmVzLCBuZXh0V2FpdCkpOwotICAgIGVuZm9yY2UobmV4dFJlcyA9PSBhKTsKLSAgICBlbmZvcmNlKG5leHRXYWl0ID4gZHVyISJobnNlY3MiKDApKTsKKyAgICAvLyBNYWtlIHN1cmUgd2lsbEJlY29tZU5vbmVtcHR5IGdldHMgdGhlIG9yZGVyIHJpZ2h0LgorICAgIGVuZm9yY2Uoci53aWxsQmVjb21lTm9uZW1wdHkoZHVtbXlSZXMsIGR1bW15RHVyKSk7CisgICAgZW5mb3JjZShkdW1teVJlcyA9PSBhKTsKKyAgICBlbmZvcmNlKGR1bW15RHVyID4gRHVyYXRpb24uemVybyk7CiAKICAgICBmb3JlYWNoIChvOyBvYmpzKSBwb29sLnJlY29yZFN1Y2Nlc3Mobyk7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbC5kCmluZGV4IDYzYTBhMmIuLjNhZjU0YjUgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2wuZApAQCAtMTc5LDcgKzE3OSw3IEBACiAgIEV4Y2VwdGlvbiBleGNlcHRpb247CiAKICAgdm9pZCBpbml0TWVzc2FnZSgpIHsKLSAgICBtZXNzYWdlLmNsZWFyKCk7CisgICAgbWVzc2FnZS5kZXN0cm95KCk7CiAgICAgaGFkTWVzc2FnZSA9IGZhbHNlOwogICAgIGlmICghbG9jYXRpb24uZW1wdHkpIHsKICAgICAgIG1lc3NhZ2Ugfj0gbG9jYXRpb247CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCmluZGV4IDc5NmJlOTEuLmFlODUwMjcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvc3NsX2Jpby5kCkBAIC03Myw3ICs3Myw3IEBACiAgIHZvaWQgc2V0RXJyb3IoRXhjZXB0aW9uIGUpIG5vdGhyb3cgewogICAgIEVSUl9wdXRfZXJyb3IoRVJSX0xJQl9EX0VYQ0VQVElPTiwgRVJSX0ZfRF9FWENFUFRJT04sIEVSUl9SX0RfRVhDRVBUSU9OLAogICAgICAgRVJSX0ZJTEVfRF9FWENFUFRJT04sIEVSUl9MSU5FX0RfRVhDRVBUSU9OKTsKLSAgICB0cnkgeyBHQy5hZGRSb290KGNhc3Qodm9pZCopZSk7IH0gY2F0Y2gge30KKyAgICB0cnkgeyBHQy5hZGRSb290KGNhc3Qodm9pZCopZSk7IH0gY2F0Y2ggKFRocm93YWJsZSkge30KICAgICBFUlJfc2V0X2Vycm9yX2RhdGEoY2FzdChjaGFyKillLCBFUlJfRkxBR1NfRF9FWENFUFRJT04pOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdGVzdC9zZXJ2ZXIuZAppbmRleCBiNTM5M2YwLi5mYzVlODZiIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3Rlc3Qvc2VydmVyLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90ZXN0L3NlcnZlci5kCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgc2VydmluZ0NvbmRpdGlvbi53YWl0KCk7CiAKICAgICAgICAgY2FuY2VsLnRyaWdnZXIoKTsKLSAgICAgICAgZW5mb3JjZShkb25lQ29uZGl0aW9uLndhaXQoZHVyISJtc2VjcyIoMTAwKSkpOworICAgICAgICBlbmZvcmNlKGRvbmVDb25kaXRpb24ud2FpdChkdXIhIm1zZWNzIigzKjEwMDApKSk7CiAgICAgICAgIHNlcnZlclRocmVhZC5qb2luKCk7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90cmFpdHMuZCBiL2xpYi9kL3NyYy90aHJpZnQvaW50ZXJuYWwvdHJhaXRzLmQKaW5kZXggMTFlOThjNS4uOGNlMTA4OSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC90cmFpdHMuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3RyYWl0cy5kCkBAIC0yMSwxMTUgKzIxLDYgQEAKIGltcG9ydCBzdGQudHJhaXRzOwogCiAvKioKLSAqIEFkZHMgb3IgcmVtb3ZlcyBhdHRyaWJ1dGVzIGZyb20gdGhlIGdpdmVuIGZ1bmN0aW9uIChwb2ludGVyKSBvciBkZWxlZ2F0ZQotICogdHlwZS4KLSAqCi0gKiBCZXNpZGVzIHRoZSBiYXNlIHR5cGUsIHR3byBzdGQudHJhaXRzLkZ1bmN0aW9uQXR0cmlidXRlIGJpdGZpZWxkcyBhcmUKLSAqIGFjY2VwdGVkLCByZXByZXNlbnRpbmcgdGhlIGF0dHJpYnV0ZXMgdG8gYWRkIHRvIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUKLSAqIHJlc3AuIHRvIHJlbW92ZSBmcm9tIGl0LiBJZiBhbiBhdHRyaWJ1dGUgYXBwZWFycyBpbiBib3RoIGZpZWxkcywgYW4gZXJyb3IKLSAqIGlzIHJhaXNlZC4KLSAqCi0gKiBQYXJhbXM6Ci0gKiAgIFQgPSBUaGUgYmFzZSB0eXBlLgotICogICBzZXRBdHRycyA9IFRoZSBhdHRyaWJ1dGVzIHRvIGFkZCB0byB0aGUgdHlwZSwgaWYgbm90IGFscmVhZHkgcHJlc2VudC4KLSAqICAgY2xlYXJBdHRycyA9IFRoZSBhdHRyaWJ1dGVzIHRvIHJlbW92ZSBmcm9tIHRoZSB0eXBlLCBpZiBwcmVzZW50LgotICovCi10ZW1wbGF0ZSBDaGFuZ2VGdW5jQXR0cnMoCi0gIFQsCi0gIEZ1bmN0aW9uQXR0cmlidXRlIHNldEF0dHJzID0gRnVuY3Rpb25BdHRyaWJ1dGUubm9uZSwKLSAgRnVuY3Rpb25BdHRyaWJ1dGUgY2xlYXJBdHRycyA9IEZ1bmN0aW9uQXR0cmlidXRlLm5vbmUKLSkgaWYgKGlzRnVuY3Rpb25Qb2ludGVyIVQgfHwgaXNEZWxlZ2F0ZSFUKSB7Ci0gIHN0YXRpYyBhc3NlcnQoIShzZXRBdHRycyAmIGNsZWFyQXR0cnMpLAotICAgICJDYW5ub3Qgc2V0IGFuZCBjbGVhciBhdHRyaWJ1dGVzIGF0IHRoZSBzYW1lIHRpbWUuIik7Ci0gIG1peGluKHsKLSAgICBlbnVtIG5ld0F0dHJzID0gKGZ1bmN0aW9uQXR0cmlidXRlcyFUIHwgc2V0QXR0cnMpICYgfmNsZWFyQXR0cnM7Ci0gICAgc3RhdGljIGFzc2VydCghKG5ld0F0dHJzICYgRnVuY3Rpb25BdHRyaWJ1dGUudHJ1c3RlZCkgfHwKLSAgICAgICEobmV3QXR0cnMgJiBGdW5jdGlvbkF0dHJpYnV0ZS5zYWZlKSwKLSAgICAgICJDYW5ub3QgaGF2ZSBhIGZ1bmN0aW9uL2RlbGVnYXRlIHRoYXQgaXMgYm90aCB0cnVzdGVkIGFuZCBzYWZlLiIpOwotCi0gICAgc3RyaW5nIHJlc3VsdCA9ICJhbGlhcyAiOwotCi0gICAgc3RhdGljIGlmIChmdW5jdGlvbkxpbmthZ2UhVCAhPSAiRCIpIHsKLSAgICAgIHJlc3VsdCB+PSAiZXh0ZXJuKCIgfiBmdW5jdGlvbkxpbmthZ2UhVCB+ICIpICI7Ci0gICAgfQotCi0gICAgc3RhdGljIGlmIChuZXdBdHRycyAmIEZ1bmN0aW9uQXR0cmlidXRlLnJlZl8pIHsKLSAgICAgIHJlc3VsdCB+PSAicmVmICI7Ci0gICAgfQotCi0gICAgcmVzdWx0IH49ICJSZXR1cm5UeXBlIVQiOwotCi0gICAgc3RhdGljIGlmIChpc0RlbGVnYXRlIVQpIHsKLSAgICAgIHJlc3VsdCB+PSAiIGRlbGVnYXRlIjsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0IH49ICIgZnVuY3Rpb24iOwotICAgIH0KLQotICAgIHJlc3VsdCB+PSAiKFBhcmFtZXRlclR5cGVUdXBsZSFUKSI7Ci0KLSAgICBzdGF0aWMgaWYgKG5ld0F0dHJzICYgRnVuY3Rpb25BdHRyaWJ1dGUucHVyZV8pIHsKLSAgICAgIHJlc3VsdCB+PSAiIHB1cmUiOwotICAgIH0KLSAgICBzdGF0aWMgaWYgKG5ld0F0dHJzICYgRnVuY3Rpb25BdHRyaWJ1dGUubm90aHJvd18pIHsKLSAgICAgIHJlc3VsdCB+PSAiIG5vdGhyb3ciOwotICAgIH0KLSAgICBzdGF0aWMgaWYgKG5ld0F0dHJzICYgRnVuY3Rpb25BdHRyaWJ1dGUucHJvcGVydHkpIHsKLSAgICAgIHJlc3VsdCB+PSAiIEBwcm9wZXJ0eSI7Ci0gICAgfQotICAgIHN0YXRpYyBpZiAobmV3QXR0cnMgJiBGdW5jdGlvbkF0dHJpYnV0ZS50cnVzdGVkKSB7Ci0gICAgICByZXN1bHQgfj0gIiBAdHJ1c3RlZCI7Ci0gICAgfQotICAgIHN0YXRpYyBpZiAobmV3QXR0cnMgJiBGdW5jdGlvbkF0dHJpYnV0ZS5zYWZlKSB7Ci0gICAgICByZXN1bHQgfj0gIiBAc2FmZSI7Ci0gICAgfQotCi0gICAgcmVzdWx0IH49ICIgQ2hhbmdlRnVuY0F0dHJzOyI7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSgpKTsKLX0KLQotLy8vIERpdHRvCi10ZW1wbGF0ZSBDaGFuZ2VGdW5jQXR0cnMoCi0gIFQsCi0gIEZ1bmN0aW9uQXR0cmlidXRlIHNldEF0dHJzID0gRnVuY3Rpb25BdHRyaWJ1dGUubm9uZSwKLSAgRnVuY3Rpb25BdHRyaWJ1dGUgY2xlYXJBdHRycyA9IEZ1bmN0aW9uQXR0cmlidXRlLm5vbmUKLSkgaWYgKGlzKFQgPT0gZnVuY3Rpb24pKSB7Ci0gIC8vIFRvIGF2b2lkIGEgbG90IG9mIHN5bnRhY3RpYyBoZWFkYWNoZXMsIHdlIGp1c3QgdXNlIHRoZSBhYm92ZSB2ZXJzaW9uIHRvCi0gIC8vIG9wZXJhdGUgb24gdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gcG9pbnRlciB0eXBlIGFuZCB0aGVuIHJlbW92ZSB0aGUKLSAgLy8gcG9pbnRlciBhZ2Fpbi4KLSAgYWxpYXMgRnVuY3Rpb25UeXBlT2YhKENoYW5nZUZ1bmNBdHRycyEoVCosIHNldEF0dHJzLCBjbGVhckF0dHJzKSkKLSAgICBDaGFuZ2VGdW5jQXR0cnM7Ci19Ci0KLXZlcnNpb24gKHVuaXR0ZXN0KSB7Ci0gIGltcG9ydCBzdGQuYWxnb3JpdGhtOwotICBpbXBvcnQgc3RkLm1ldGFzdHJpbmdzOwotICBpbXBvcnQgc3RkLnR5cGV0dXBsZTsKLX0KLXVuaXR0ZXN0IHsKLSAgYWxpYXMgRnVuY3Rpb25BdHRyaWJ1dGUgRkE7Ci0gIGZvcmVhY2ggKFQwOyBUeXBlVHVwbGUhKAotICAgIGludCBmdW5jdGlvbihpbnQpLAotICAgIGludCBkZWxlZ2F0ZShpbnQpLAotICAgIEZ1bmN0aW9uVHlwZU9mIShpbnQgZnVuY3Rpb24oaW50KSkKLSAgKSkgewotICAgIGFsaWFzIENoYW5nZUZ1bmNBdHRycyEoVDAsIEZBLnNhZmUpIFQxOwotICAgIHN0YXRpYyBhc3NlcnQoZnVuY3Rpb25BdHRyaWJ1dGVzIVQxID09IEZBLnNhZmUpOwotCi0gICAgYWxpYXMgQ2hhbmdlRnVuY0F0dHJzIShUMSwgRkEubm90aHJvd18gfCBGQS5yZWZfLCBGQS5zYWZlKSBUMjsKLSAgICBzdGF0aWMgYXNzZXJ0KGZ1bmN0aW9uQXR0cmlidXRlcyFUMiA9PSAoRkEubm90aHJvd18gfCBGQS5yZWZfKSk7Ci0KLSAgICBlbnVtIGFsbEF0dHJzID0gcmVkdWNlISJhIHwgYiIoW0VudW1NZW1iZXJzIUZBXSkgJiB+RkEuc2FmZTsKLQotICAgIGFsaWFzIENoYW5nZUZ1bmNBdHRycyEoVDIsIGFsbEF0dHJzKSBUMzsKLSAgICBzdGF0aWMgYXNzZXJ0KGZ1bmN0aW9uQXR0cmlidXRlcyFUMyA9PSBhbGxBdHRycyk7Ci0KLSAgICBhbGlhcyBDaGFuZ2VGdW5jQXR0cnMhKFQzLCBGQS5ub25lLCBhbGxBdHRycykgVDQ7Ci0gICAgc3RhdGljIGFzc2VydChpcyhUNCA9PSBUMCkpOwotICB9Ci19Ci0KLS8qKgogICogQWRkcyDCu25vdGhyb3fCqyB0byB0aGUgdHlwZSBvZiB0aGUgcGFzc2VkIGZ1bmN0aW9uIHBvaW50ZXIvZGVsZWdhdGUsIGlmIGl0CiAgKiBpcyBub3QgYWxyZWFkeSBwcmVzZW50LgogICoKQEAgLTEzNyw1ICsyOCw2IEBACiAgKiBhZHZhbnRhZ2Ugb2YgYmVpbmcgZXhwbGljaXRseSBhYm91dCB0aGUgb3BlcmF0aW9uIHRoYXQgaXMgcGVyZm9ybWVkLgogICovCiBhdXRvIGFzc3VtZU5vdGhyb3coVCkoVCB0KSBpZiAoaXNGdW5jdGlvblBvaW50ZXIhVCB8fCBpc0RlbGVnYXRlIVQpIHsKLSAgcmV0dXJuIGNhc3QoQ2hhbmdlRnVuY0F0dHJzIShULCBGdW5jdGlvbkF0dHJpYnV0ZS5ub3Rocm93XykpdDsKKyAgZW51bSBhdHRycyA9IGZ1bmN0aW9uQXR0cmlidXRlcyFUIHwgRnVuY3Rpb25BdHRyaWJ1dGUubm90aHJvd187CisgIHJldHVybiBjYXN0KFNldEZ1bmN0aW9uQXR0cmlidXRlcyEoVCwgZnVuY3Rpb25MaW5rYWdlIVQsIGF0dHJzKSkgdDsKIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQKaW5kZXggOTdjYmI0ZC4uNzA2NDhiMyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9iYXNlLmQKQEAgLTIwNyw3ICsyMDcsOCBAQAogICAgIE5FR0FUSVZFX1NJWkUsIC8vLwogICAgIFNJWkVfTElNSVQsIC8vLwogICAgIEJBRF9WRVJTSU9OLCAvLy8KLSAgICBOT1RfSU1QTEVNRU5URUQgLy8vCisgICAgTk9UX0lNUExFTUVOVEVELCAvLy8KKyAgICBERVBUSF9MSU1JVCAvLy8KICAgfQogCiAgIC8vLwpAQCAtMjIwLDYgKzIyMSw3IEBACiAgICAgICAgIGNhc2UgVHlwZS5TSVpFX0xJTUlUOiByZXR1cm4gIkV4Y2VlZGVkIHNpemUgbGltaXQiOwogICAgICAgICBjYXNlIFR5cGUuQkFEX1ZFUlNJT046IHJldHVybiAiSW52YWxpZCB2ZXJzaW9uIjsKICAgICAgICAgY2FzZSBUeXBlLk5PVF9JTVBMRU1FTlRFRDogcmV0dXJuICJOb3QgaW1wbGVtZW50ZWQiOworICAgICAgICBjYXNlIFR5cGUuREVQVEhfTElNSVQ6IHJldHVybiAiRXhjZWVkZWQgc2l6ZSBsaW1pdCI7CiAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAiKEludmFsaWQgZXhjZXB0aW9uIHR5cGUpIjsKICAgICAgIH0KICAgICB9CkBAIC0zNDUsNyArMzQ3LDEwIEBACiAgICAgQkFEX1NFUVVFTkNFX0lEID0gNCwgLy8vCiAgICAgTUlTU0lOR19SRVNVTFQgPSA1LCAvLy8KICAgICBJTlRFUk5BTF9FUlJPUiA9IDYsIC8vLwotICAgIFBST1RPQ09MX0VSUk9SID0gNyAvLy8KKyAgICBQUk9UT0NPTF9FUlJPUiA9IDcsIC8vLworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOCwgLy8vCisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDksIC8vLworICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTAgLy8vCiAgIH0KIAogICAvLy8KQEAgLTM1OCw2ICszNjMsMTEgQEAKICAgICAgICAgY2FzZSBUeXBlLldST05HX01FVEhPRF9OQU1FOiByZXR1cm4gIldyb25nIG1ldGhvZCBuYW1lIjsKICAgICAgICAgY2FzZSBUeXBlLkJBRF9TRVFVRU5DRV9JRDogcmV0dXJuICJCYWQgc2VxdWVuY2UgaWRlbnRpZmllciI7CiAgICAgICAgIGNhc2UgVHlwZS5NSVNTSU5HX1JFU1VMVDogcmV0dXJuICJNaXNzaW5nIHJlc3VsdCI7CisgICAgICAgIGNhc2UgVHlwZS5JTlRFUk5BTF9FUlJPUjogcmV0dXJuICJJbnRlcm5hbCBlcnJvciI7CisgICAgICAgIGNhc2UgVHlwZS5QUk9UT0NPTF9FUlJPUjogcmV0dXJuICJQcm90b2NvbCBlcnJvciI7CisgICAgICAgIGNhc2UgVHlwZS5JTlZBTElEX1RSQU5TRk9STTogcmV0dXJuICJJbnZhbGlkIHRyYW5zZm9ybSI7CisgICAgICAgIGNhc2UgVHlwZS5JTlZBTElEX1BST1RPQ09MOiByZXR1cm4gIkludmFsaWQgcHJvdG9jb2wiOworICAgICAgICBjYXNlIFR5cGUuVU5TVVBQT1JURURfQ0xJRU5UX1RZUEU6IHJldHVybiAiVW5zdXBwb3J0ZWQgY2xpZW50IHR5cGUiOwogICAgICAgICBkZWZhdWx0OiByZXR1cm4gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9wcm90b2NvbC9jb21wYWN0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZAppbmRleCBlOTcwZmQxLi45MTU1YzgxIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3QuZApAQCAtMTMzLDggKzEzMyw4IEBACiAKICAgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtc2cpIHsKICAgICB3cml0ZUJ5dGUoY2FzdChieXRlKVBST1RPQ09MX0lEKTsKLSAgICB3cml0ZUJ5dGUoKFZFUlNJT05fTiAmIFZFUlNJT05fTUFTSykgfAotICAgICAgKChjYXN0KGludCltc2cudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKKyAgICB3cml0ZUJ5dGUoY2FzdChieXRlKSgoVkVSU0lPTl9OICYgVkVSU0lPTl9NQVNLKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKChjYXN0KGludCltc2cudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKSk7CiAgICAgd3JpdGVWYXJpbnQzMihtc2cuc2VxaWQpOwogICAgIHdyaXRlU3RyaW5nKG1zZy5uYW1lKTsKICAgfQpAQCAtMjU5LDcgKzI1OSw3IEBACiAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5UeXBlLkJBRF9WRVJTSU9OKTsKICAgICB9CiAKLSAgICBtc2cudHlwZSA9IGNhc3QoVE1lc3NhZ2VUeXBlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMyk7CisgICAgbXNnLnR5cGUgPSBjYXN0KFRNZXNzYWdlVHlwZSkoKHZlcnNpb25BbmRUeXBlID4+IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfQklUUyk7CiAgICAgbXNnLnNlcWlkID0gcmVhZFZhcmludDMyKCk7CiAgICAgbXNnLm5hbWUgPSByZWFkU3RyaW5nKCk7CiAKQEAgLTM5MSw3ICszOTEsNyBAQAogICAgICAgd3JpdGVCeXRlKGNhc3QoYnl0ZSkoc2l6ZSA8PCA0IHwgdG9DVHlwZShlbGVtVHlwZSkpKTsKICAgICB9IGVsc2UgewogICAgICAgYXNzZXJ0KHNpemUgPD0gaW50Lm1heCk7Ci0gICAgICB3cml0ZUJ5dGUoMHhmMCB8IHRvQ1R5cGUoZWxlbVR5cGUpKTsKKyAgICAgIHdyaXRlQnl0ZShjYXN0KGJ5dGUpKDB4ZjAgfCB0b0NUeXBlKGVsZW1UeXBlKSkpOwogICAgICAgd3JpdGVWYXJpbnQzMihjYXN0KGludClzaXplKTsKICAgICB9CiAgIH0KQEAgLTU4OSw2ICs1ODksNyBAQAogICBlbnVtIFZFUlNJT05fTiA9IDE7CiAgIGVudW0gVkVSU0lPTl9NQVNLID0gMGIwMDAxXzExMTE7CiAgIGVudW0gVFlQRV9NQVNLID0gMGIxMTEwXzAwMDA7CisgIGVudW0gVFlQRV9CSVRTID0gMGIwMDAwXzAxMTE7CiAgIGVudW0gVFlQRV9TSElGVF9BTU9VTlQgPSA1OwogCiAgIC8vIFByb2JhYmx5IG5lZWQgdG8gaW1wbGVtZW50IGEgYmV0dGVyIHN0YWNrIGF0IHNvbWUgcG9pbnQuCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3Byb3RvY29sL2pzb24uZCBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCmluZGV4IGU4OWFlZTEuLjU2YTcxZGEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvcHJvdG9jb2wvanNvbi5kCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgc3RkLnN0cmluZyA6IGZvcm1hdDsKIGltcG9ydCBzdGQudHJhaXRzIDogaXNJbnRlZ3JhbDsKIGltcG9ydCBzdGQudHlwZXR1cGxlIDogYWxsU2F0aXNmeSwgVHlwZVR1cGxlOworaW1wb3J0IHN0ZC51dGYgOiB0b1VURjg7CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOwogCkBAIC02MSw3ICs2Miw3IEBACiAgIH0KIAogICB2b2lkIHJlc2V0KCkgewotICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKKyAgICBkZXN0cm95KGNvbnRleHRTdGFja18pOwogICAgIGNvbnRleHRfID0gbmV3IENvbnRleHQoKTsKICAgICByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcih0cmFuc18pOwogICB9CkBAIC0xMzIsNyArMTMzLDggQEAKICAgICBib29sIGVzY2FwZU51bSA9IHZhbHVlICFpcyBudWxsIHx8IGNvbnRleHRfLmVzY2FwZU51bTsKIAogICAgIGlmICh2YWx1ZSBpcyBudWxsKSB7Ci0gICAgICB2YWx1ZSA9IGZvcm1hdCgiJS4xNmciLCBkdWIpOworICAgICAgLyogcHJlY2lzaW9uIGlzIDE3ICovCisgICAgICB2YWx1ZSA9IGZvcm1hdCgiJS4xN2ciLCBkdWIpOwogICAgIH0KIAogICAgIGlmIChlc2NhcGVOdW0pIHRyYW5zXy53cml0ZShTVFJJTkdfREVMSU1JVEVSKTsKQEAgLTQ5MiwxMiArNDk0LDE1IEBACiAgICAgcmV0dXJuIHJlYWRTeW50YXhDaGFyKHJlYWRlcl8sIGNoKTsKICAgfQogCi0gIHVieXRlIHJlYWRKc29uRXNjYXBlQ2hhcigpIHsKLSAgICByZWFkSnNvblN5bnRheENoYXIoWkVST19DSEFSKTsKLSAgICByZWFkSnNvblN5bnRheENoYXIoWkVST19DSEFSKTsKKyAgd2NoYXIgcmVhZEpzb25Fc2NhcGVDaGFyKCkgewogICAgIGF1dG8gYSA9IHJlYWRlcl8ucmVhZCgpOwogICAgIGF1dG8gYiA9IHJlYWRlcl8ucmVhZCgpOwotICAgIHJldHVybiBjYXN0KHVieXRlKSgoaGV4VmFsKGFbMF0pIDw8IDQpICsgaGV4VmFsKGJbMF0pKTsKKyAgICBhdXRvIGMgPSByZWFkZXJfLnJlYWQoKTsKKyAgICBhdXRvIGQgPSByZWFkZXJfLnJlYWQoKTsKKyAgICByZXR1cm4gY2FzdCh1c2hvcnQpKAorICAgICAgICAgIChoZXhWYWwoYVswXSkgPDwgMTIpICsgKGhleFZhbChiWzBdKSA8PCA4KSArCisgICAgICAgICAgKGhleFZhbChjWzBdKSA8PCA0KSArIGhleFZhbChkWzBdKQorICAgICAgICApOwogICB9CiAKICAgc3RyaW5nIHJlYWRKc29uU3RyaW5nKGJvb2wgc2tpcENvbnRleHQgPSBmYWxzZSkgewpAQCAtNTA2LDYgKzUxMSw3IEBACiAgICAgcmVhZEpzb25TeW50YXhDaGFyKFNUUklOR19ERUxJTUlURVIpOwogICAgIGF1dG8gYnVmZmVyID0gYXBwZW5kZXIhc3RyaW5nKCk7CiAKKyAgICB3Y2hhcltdIHdjaHM7CiAgICAgaW50IGJ5dGVzUmVhZDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgYXV0byBjaCA9IHJlYWRlcl8ucmVhZCgpOwpAQCAtNTIxLDcgKzUyNywxOCBAQAogICAgICAgaWYgKGNoID09IEJBQ0tTTEFTSCkgewogICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgICBpZiAoY2ggPT0gRVNDQVBFX0NIQVIpIHsKLSAgICAgICAgICBjaCA9IHJlYWRKc29uRXNjYXBlQ2hhcigpOworICAgICAgICAgIGF1dG8gd2NoID0gcmVhZEpzb25Fc2NhcGVDaGFyKCk7CisgICAgICAgICAgaWYgKHdjaCA+PSAweEQ4MDAgJiYgd2NoIDw9IDB4REJGRikgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHhEQzAwICYmIHdjaCA8PSAweERGRkYgJiYgd2Nocy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWlzc2luZyBVVEYtMTYgaGlnaCBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2NocyB+PSB3Y2g7CisgICAgICAgICAgICBidWZmZXIucHV0KHdjaHMudG9VVEY4KTsKKyAgICAgICAgICAgIHdjaHMgPSBbXTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgYXV0byBwb3MgPSBjb3VudFVudGlsKGtFc2NhcGVDaGFyc1tdLCBjaFswXSk7CiAgICAgICAgICAgaWYgKHBvcyA9PSAtMSkgewpAQCAtNTMxLDkgKzU0OCwxNyBAQAogICAgICAgICAgIGNoID0ga0VzY2FwZUNoYXJWYWxzW3Bvc107CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGlmICh3Y2hzLmxlbmd0aCAhPSAwKSB7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uVHlwZS5JTlZBTElEX0RBVEEpOworICAgICAgfQogICAgICAgYnVmZmVyLnB1dChjaFswXSk7CiAgICAgfQogCisgICAgaWYgKHdjaHMubGVuZ3RoICE9IDApIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1pc3NpbmcgVVRGLTE2IGxvdyBzdXJyb2dhdGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLlR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICB9CiAgICAgcmV0dXJuIGJ1ZmZlci5kYXRhOwogICB9CiAKQEAgLTc3Miw2ICs3OTcsMzYgQEAKIH0KIAogdW5pdHRlc3QgeworICBpbXBvcnQgc3RkLmV4Y2VwdGlvbjsKKyAgaW1wb3J0IHRocmlmdC50cmFuc3BvcnQubWVtb3J5OworCisgIGF1dG8gYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoY2FzdCh1Ynl0ZVtdKSJcIlxcdTBlMDEgXFx1ZDgzNVxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGF1dG8gc3RyID0ganNvbi5yZWFkU3RyaW5nKCk7CisgIGVuZm9yY2Uoc3RyID09ICLguIEg8J2UviIpOworfQorCit1bml0dGVzdCB7CisgIC8vIFRocm93biBpZiBsb3cgc3Vycm9nYXRlIGlzIG1pc3NpbmcuCisgIGltcG9ydCBzdGQuZXhjZXB0aW9uOworICBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5tZW1vcnk7CisKKyAgYXV0byBidWYgPSBuZXcgVE1lbW9yeUJ1ZmZlcihjYXN0KHVieXRlW10pIlwiXFx1MGUwMSBcXHVkODM1XCIiKTsKKyAgYXV0byBqc29uID0gdEpzb25Qcm90b2NvbChidWYpOworICBhc3NlcnRUaHJvd24hVFByb3RvY29sRXhjZXB0aW9uKGpzb24ucmVhZFN0cmluZygpKTsKK30KKwordW5pdHRlc3QgeworICAvLyBUaHJvd24gaWYgaGlnaCBzdXJyb2dhdGUgaXMgbWlzc2luZy4KKyAgaW1wb3J0IHN0ZC5leGNlcHRpb247CisgIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lm1lbW9yeTsKKworICBhdXRvIGJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKGNhc3QodWJ5dGVbXSkiXCJcXHUwZTAxIFxcdWRkM2VcIiIpOworICBhdXRvIGpzb24gPSB0SnNvblByb3RvY29sKGJ1Zik7CisgIGFzc2VydFRocm93biFUUHJvdG9jb2xFeGNlcHRpb24oanNvbi5yZWFkU3RyaW5nKCkpOworfQorCit1bml0dGVzdCB7CiAgIGltcG9ydCB0aHJpZnQuaW50ZXJuYWwudGVzdC5wcm90b2NvbDsKICAgdGVzdENvbnRhaW5lclNpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKICAgdGVzdFN0cmluZ1NpemVMaW1pdCEoVEpzb25Qcm90b2NvbCEoKSkoKTsKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZAppbmRleCBiNTZhZTY2Li5hMjNiMWM3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCkBAIC0zNyw3ICszNyw3IEBACiAgIC8qKgogICAgKiBTdGFydHMgc2VydmluZy4KICAgICoKLSAgICogQmxvY2tzIHVudGlsIHRoZSBzZXJ2ZXIgZmluaXNoZXMsIGkuZS4gYSBzZXJpb3VzIHByb2JsZW0gb2NjdXJlZCBvciB0aGUKKyAgICogQmxvY2tzIHVudGlsIHRoZSBzZXJ2ZXIgZmluaXNoZXMsIGkuZS4gYSBzZXJpb3VzIHByb2JsZW0gb2NjdXJyZWQgb3IgdGhlCiAgICAqIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIHRyaWdnZXJlZC4KICAgICoKICAgICogU2VydmVyIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gaW1wbGVtZW50IGNhbmNlbGxhdGlvbiBpbiBhIGJlc3QtCkBAIC0xMTgsNiArMTE4LDM4IEBACiAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwogICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworCitwdWJsaWM6CisKKyAgQHByb3BlcnR5IFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KCkKKyAgeworICAgIHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOworICB9CisKKyAgQHByb3BlcnR5IFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIH0KIH0KIAogLyoqCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZAppbmRleCAwMjE2Nzk5Li41ODYwYzBjIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKQEAgLTg5MywxNCArODkzLDE0IEBACiAgICAgICBjYWxsc1NpbmNlUmVzaXplXyA9IDA7CiAKICAgICAgIGZhY3RvcnlJbnB1dFRyYW5zcG9ydF8gPQotICAgICAgICBzZXJ2ZXJfLmlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGlucHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8uaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOwogICAgICAgZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8gPQotICAgICAgICBzZXJ2ZXJfLm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKKyAgICAgICAgc2VydmVyXy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChvdXRwdXRUcmFuc3BvcnRfKTsKIAogICAgICAgaW5wdXRQcm90b2NvbF8gPQotICAgICAgICBzZXJ2ZXJfLmlucHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKKyAgICAgICAgc2VydmVyXy5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5SW5wdXRUcmFuc3BvcnRfKTsKICAgICAgIG91dHB1dFByb3RvY29sXyA9Ci0gICAgICAgIHNlcnZlcl8ub3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8ub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfKTsKIAogICAgICAgaWYgKHNlcnZlcl8uZXZlbnRIYW5kbGVyKSB7CiAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0XyA9CkBAIC05MDgsNyArOTA4LDcgQEAKICAgICAgIH0KIAogICAgICAgYXV0byBpbmZvID0gVENvbm5lY3Rpb25JbmZvKGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8sIHNvY2tldF8pOwotICAgICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8ucHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluZm8pOworICAgICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8ucHJvY2Vzc29yRmFjdG9yeS5nZXRQcm9jZXNzb3IoaW5mbyk7CiAgICAgfQogCiAgICAgfnRoaXMoKSB7CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCmluZGV4IGY3MTgzYTcuLjVhYmE0YzEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3NpbXBsZS5kCkBAIC0xNDAsNyArMTQwLDkgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICAgICAgICBpZiAodHR4LnR5cGUoKSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLlR5cGUuRU5EX09GX0ZJTEUpIHsKKyAgICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZAppbmRleCBiNDcyMGE0Li42NzBlNzIwIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKQEAgLTI2OCw3ICsyNjgsOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZAppbmRleCAxY2RlOTgzLi4zMDBjYzg0IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKQEAgLTE3Myw3ICsxNzMsOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZDogJXMiLCB0dHgpOworICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgIGxvZ0Vycm9yKCJDbGllbnQgZGllZCB1bmV4cGVjdGVkbHk6ICVzIiwgdHR4KTsKKyAgICAgIH0KICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgbG9nRXJyb3IoIlVuY2F1Z2h0IGV4Y2VwdGlvbjogJXMiLCBlKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kIGIvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZAppbmRleCBkYTE2NWQzLi43MDRlMTZkIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKQEAgLTk1LDE2ICs5NSw3IEBACiAKICAgLy8vCiAgIHRoaXMoVHlwZSB0eXBlLCBzdHJpbmcgZmlsZSA9IF9fRklMRV9fLCBzaXplX3QgbGluZSA9IF9fTElORV9fLCBUaHJvd2FibGUgbmV4dCA9IG51bGwpIHsKLSAgICBzdHJpbmcgbXNnID0gIlRUcmFuc3BvcnRFeGNlcHRpb246ICI7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICBjYXNlIFR5cGUuVU5LTk9XTjogbXNnIH49ICJVbmtub3duIHNlcnZlciB0cmFuc3BvcnQgZXhjZXB0aW9uIjsgYnJlYWs7Ci0gICAgICBjYXNlIFR5cGUuTk9UX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IG5vdCBsaXN0ZW5pbmciOyBicmVhazsKLSAgICAgIGNhc2UgVHlwZS5BTFJFQURZX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IGFscmVhZHkgbGlzdGVuaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFR5cGUuUkVTT1VSQ0VfRkFJTEVEOiBtc2cgfj0gIkFuIHVuZGVybHlpbmcgcmVzb3VyY2UgZmFpbGVkIjsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiBtc2cgfj0gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7IGJyZWFrOwotICAgIH0KLQotICAgIHRoaXMobXNnLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKKyAgICB0aGlzKGVycm9yTXNnKHR5cGUpLCB0eXBlLCBmaWxlLCBsaW5lLCBuZXh0KTsKICAgfQogCiAgIC8vLwpAQCAtMTI5LDUgKzEyMCwxOCBAQAogCiBwcm90ZWN0ZWQ6CiAgIFR5cGUgdHlwZV87CisKK3ByaXZhdGU6CisgIHN0cmluZyBlcnJvck1zZyhUeXBlIHR5cGUpIHsKKyAgICBzdHJpbmcgbXNnID0gIlRUcmFuc3BvcnRFeGNlcHRpb246ICI7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFR5cGUuVU5LTk9XTjogbXNnIH49ICJVbmtub3duIHNlcnZlciB0cmFuc3BvcnQgZXhjZXB0aW9uIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuTk9UX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IG5vdCBsaXN0ZW5pbmciOyBicmVhazsKKyAgICAgIGNhc2UgVHlwZS5BTFJFQURZX0xJU1RFTklORzogbXNnIH49ICJTZXJ2ZXIgdHJhbnNwb3J0IGFscmVhZHkgbGlzdGVuaW5nIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuUkVTT1VSQ0VfRkFJTEVEOiBtc2cgfj0gIkFuIHVuZGVybHlpbmcgcmVzb3VyY2UgZmFpbGVkIjsgYnJlYWs7CisgICAgICBkZWZhdWx0OiBtc2cgfj0gIihJbnZhbGlkIGV4Y2VwdGlvbiB0eXBlKSI7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbXNnOworICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZAppbmRleCA3YzY3MDVhLi5mZTg4ZTczIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCkBAIC0zNyw3ICszNyw4IEBACiBpbXBvcnQgc3RkLmFsZ29yaXRobSA6IG1pbiwgbWF4OwogaW1wb3J0IHN0ZC5jb25jdXJyZW5jeTsKIGltcG9ydCBzdGQuY29udiA6IHRvOwotaW1wb3J0IHN0ZC5kYXRldGltZSA6IEF1dG9TdGFydCwgZHVyLCBEdXJhdGlvbiwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5kYXRldGltZSA6IGR1ciwgRHVyYXRpb247CitpbXBvcnQgc3RkLmRhdGV0aW1lLnN0b3B3YXRjaCA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOwogaW1wb3J0IHN0ZC5leGNlcHRpb247CiBpbXBvcnQgc3RkLnN0ZGlvIDogRmlsZTsKIGltcG9ydCB0aHJpZnQuYmFzZTsKQEAgLTI0Niw3ICsyNDcsNyBAQAogICAgIGVuZm9yY2UoIWlzT3BlbiwgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCiAgICAgICAiQ2Fubm90IHNldCBjaHVuayBzaXplIGFmdGVyIFRGaWxlUmVhZGVyVHJhbnNwb3J0IGhhcyBiZWVuIG9wZW5lZC4iKSk7CiAgICAgZW5mb3JjZSh2YWx1ZSA+IEV2ZW50U2l6ZS5zaXplb2YsIG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDaHVua3MgbXVzdCAiIH4KLSAgICAgICJiZSBsYXJnZSBlbm91Z2ggdG8gYWNjb21vZGF0ZSBhdCBsZWFzdCBhIHNpbmdsZSBieXRlIG9mIHBheWxvYWQgZGF0YS4iKSk7CisgICAgICAiYmUgbGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlIGF0IGxlYXN0IGEgc2luZ2xlIGJ5dGUgb2YgcGF5bG9hZCBkYXRhLiIpKTsKICAgICBjaHVua1NpemVfID0gdmFsdWU7CiAgIH0KIApAQCAtNjM3LDcgKzYzOCw3IEBACiAgIG92ZXJyaWRlIHZvaWQgY2xvc2UoKSB7CiAgICAgaWYgKCFpc09wZW4pIHJldHVybjsKIAotICAgIHByaW9yaXR5U2VuZCh3cml0ZXJUaHJlYWRfLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7IC8vIEZJWE1FOiBTaG91bGQgdXNlIG5vcm1hbCBzZW5kIGhlcmUuCisgICAgc2VuZCh3cml0ZXJUaHJlYWRfLCBTaHV0ZG93bk1lc3NhZ2UoKSwgdGhpc1RpZCk7CiAgICAgcmVjZWl2ZSgoU2h1dGRvd25NZXNzYWdlIG1zZywgVGlkIHRpZCl7fSk7CiAgICAgaXNPcGVuXyA9IGZhbHNlOwogICB9CkBAIC04NDcsNyArODQ4LDcgQEAKICAgICAgICAgKGltbXV0YWJsZSh1Ynl0ZSlbXSBkYXRhKSB7CiAgICAgICAgICAgd2hpbGUgKGVycm9yT3BlbmluZykgewogICAgICAgICAgICAgbG9nRXJyb3IoIldyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVzIMK1cyBkdWUgdG8gSU8gZXJyb3JzIiwKLSAgICAgICAgICAgICAgaW9FcnJvclNsZWVwRHVyYXRpb24uZnJhY1NlYy51c2Vjcyk7CisgICAgICAgICAgICAgIGlvRXJyb3JTbGVlcER1cmF0aW9uLnRvdGFsISJ1c2VjcyIpOwogCiAgICAgICAgICAgICAvLyBTbGVlcCBmb3IgaW9FcnJvclNsZWVwRHVyYXRpb24sIGJlaW5nIHJlYWR5IHRvIGJlIGludGVycnVwdGVkCiAgICAgICAgICAgICAvLyBieSBzaHV0ZG93biByZXF1ZXN0cy4KQEAgLTEwNzYsMTUgKzEwNzcsMTUgQEAKIAogICAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmF0YWwgZmFpbHVyZSB0bwogICAgICAgLy8gYXZvaWQgbG9vcGluZyBvdmVyIGEgcG90ZW50aWFsbHkgdmVyeSBzbG93IG9wZXJhdGlvbi4KLSAgICAgIGVuZm9yY2Uoc3cucGVlaygpLm1zZWNzIDwgNTAwLAotICAgICAgICB0ZXh0KCJjbG9zZSgpIHRvb2sgIiwgc3cucGVlaygpLm1zZWNzLCAibXMuIikpOworICAgICAgZW5mb3JjZShzdy5wZWVrKCkudG90YWwhIm1zZWNzIiA8IDE1MDAsCisgICAgICAgIHRleHQoImNsb3NlKCkgdG9vayAiLCBzdy5wZWVrKCkudG90YWwhIm1zZWNzIiwgIm1zLiIpKTsKIAogICAgICAgLy8gTm9ybWFsbHksIGl0IHRha2VzIGxlc3MgdGhhbiA1bXMgb24gbXkgZGV2IGJveC4KICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBib3ggaXMgaGVhdmlseSBsb2FkZWQsIHNvbWUgb2YgdGhlIHRlc3QgcnVucyBjYW4gdGFrZQogICAgICAgLy8gbG9uZ2VyLiBBZGRpdGlvbmFsbHksIG9uIGEgV2luZG93cyBTZXJ2ZXIgMjAwOCBpbnN0YW5jZSBydW5uaW5nIGluCiAgICAgICAvLyBhIFZpcnR1YWxCb3ggVk0sIGl0IGhhcyBiZWVuIG9ic2VydmVkIHRoYXQgYWJvdXQgYSBxdWFydGVyIG9mIHRoZSBydW5zCiAgICAgICAvLyB0YWtlcyAoMjE3IMKxIDEpIG1zLCBmb3IgcmVhc29ucyBub3QgeWV0IGtub3duLgotICAgICAgaWYgKHN3LnBlZWsoKS5tc2VjcyA+IDUpIHsKKyAgICAgIGlmIChzdy5wZWVrKCkudG90YWwhIm1zZWNzIiA+IDUwKSB7CiAgICAgICAgICsrbnVtT3ZlcjsKICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCmluZGV4IDUxODZmM2QuLjBlNThkZWUgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgIH0KIAogICAgIHN0YXRpYyBib29sIGNvbXBUb0xvd2VyKHVieXRlIGEsIHVieXRlIGIpIHsKLSAgICAgIHJldHVybiBhID09IHRvTG93ZXIoY2FzdChjaGFyKWIpOworICAgICAgcmV0dXJuIHRvTG93ZXIoY2FzdChjaGFyKWEpID09IHRvTG93ZXIoY2FzdChjaGFyKWIpOwogICAgIH0KIAogICAgIGlmIChzdGFydHNXaXRoIWNvbXBUb0xvd2VyKHNwbGl0WzBdLCBjYXN0KHVieXRlW10pInRyYW5zZmVyLWVuY29kaW5nIikpIHsKQEAgLTMzMCw3ICszMzAsNyBAQAogICAgICAgIkhvc3Q6ICIgfiBob3N0XyB+ICJcclxuIiB+CiAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KICAgICAgICJDb250ZW50LUxlbmd0aDogIiB+IHRvIXN0cmluZyhkYXRhTGVuZ3RoKSB+ICJcclxuIiB+Ci0gICAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iCisgICAgICAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdFxyXG4iIH4KICAgICAgICJVc2VyLUFnZW50OiBUaHJpZnQvIiB+IFZFUlNJT04gfiAiIChEL1RDbGllbnRIdHRwVHJhbnNwb3J0KVxyXG4iIH4KICAgICAgICJcclxuIjsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZAppbmRleCAzOGI1NjdhLi5mY2IzOGRhIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZApAQCAtMTgsNiArMTgsNyBAQAogICovCiBtb2R1bGUgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CiAKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CiBpbXBvcnQgY29yZS50aW1lIDogZHVyLCBEdXJhdGlvbjsKIGltcG9ydCBzdGQuYXJyYXkgOiBlbXB0eTsKQEAgLTc5LDggKzgwLDggQEAKICAgICB2ZXJzaW9uIChub25lKSBhc3NlcnQod3JpdHRlbiA8PSBidWYubGVuZ3RoLCB0ZXh0KCJJbXBsZW1lbnRhdGlvbiB3cm90ZSAiIH4KICAgICAgICJtb3JlIGRhdGEgdGhhbiByZXF1ZXN0ZWQgdG8/ISAoIiwgd3JpdHRlbiwgIiB2cy4gIiwgYnVmLmxlbmd0aCwgIikiKSk7CiAgIH0gYm9keSB7Ci0gICAgYXNzZXJ0KDAsICJETUQgYnVnPyDigJMgV2h5IHdvdWxkIGNvbnRyYWN0cyB3b3JrIGZvciBpbnRlcmZhY2VzLCBidXQgbm90ICIKLSAgICAgICJmb3IgYWJzdHJhY3QgbWV0aG9kcz8gIgorICAgIGFzc2VydCgwLCAiRE1EIGJ1Zz8g4oCTIFdoeSB3b3VsZCBjb250cmFjdHMgd29yayBmb3IgaW50ZXJmYWNlcywgYnV0IG5vdCAiIH4KKyAgICAgICJmb3IgYWJzdHJhY3QgbWV0aG9kcz8gIiB+CiAgICAgICAiKEVycm9yOiBmdW5jdGlvbiBb4oCmXSBpbiBhbmQgb3V0IGNvbnRyYWN0cyByZXF1aXJlIGZ1bmN0aW9uIGJvZHkiKTsKICAgfQogCkBAIC0yNTYsNyArMjU3LDcgQEAKICAgICAgICAgbmV3IFRDb21wb3VuZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICB0ZXh0KAogICAgICAgICAgICAgIkFsbCBhZGRyZXNzZXMgdHJpZWQgZmFpbGVkICgiLAotICAgICAgICAgICAgam9pbmVyKG1hcCFxe3RleHQoYS5fMCwgYDogImAsIGEuXzEubXNnLCBgImApfSh6aXAoYWRkcnMsIGVycm9ycykpLCAiLCAiKSwKKyAgICAgICAgICAgIGpvaW5lcihtYXAhcXt0ZXh0KGFbMF0sIGA6ICJgLCBhWzFdLm1zZywgYCJgKX0oemlwKGFkZHJzLCBlcnJvcnMpKSwgIiwgIiksCiAgICAgICAgICAgICAiKS4iCiAgICAgICAgICAgKSwKICAgICAgICAgICBlcnJvcnMKZGlmZiAtLWdpdCBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NzbC5kIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKaW5kZXggYzFlYWIyNS4uZjhjZTQwZSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKKysrIGIvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQKQEAgLTI0OSw3ICsyNDksMTMgQEAKICAgICB9CiAgICAgY291bnRfKys7CiAKLSAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTdjFfbWV0aG9kKCkpOworICAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9BVF9MRUFTVCgxLCAxKSkgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoVExTX21ldGhvZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHhfID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHhfLCBTU0xfT1BfTk9fU1NMdjIpOworICAgIH0KKyAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Myk7ICAgLy8gVEhSSUZULTMxNjQKICAgICBlbmZvcmNlKGN0eF8sIGdldFNTTEV4Y2VwdGlvbigiU1NMX0NUWF9uZXciKSk7CiAgICAgU1NMX0NUWF9zZXRfbW9kZShjdHhfLCBTU0xfTU9ERV9BVVRPX1JFVFJZKTsKICAgfQpAQCAtNDQ2LDYgKzQ1Miw3IEBACiAgICAgfQogICAgIGluaXRpYWxpemVkXyA9IHRydWU7CiAKKyAgIHN0YXRpYyBpZiAoT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0JFRk9SRSgxLCAxKSkgewogICAgIFNTTF9saWJyYXJ5X2luaXQoKTsKICAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CiAKQEAgLTQ2MywxMiArNDcwLDE0IEBACiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrQ3JlYXRlQ2FsbGJhY2spKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrTG9ja0NhbGxiYWNrKSk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soYXNzdW1lTm90aHJvdygmZHlubG9ja0Rlc3Ryb3lDYWxsYmFjaykpOworICAgfQogICB9CiAKICAgc3RhdGljIHZvaWQgY2xlYW51cE9wZW5TU0woKSB7CiAgICAgaWYgKCFpbml0aWFsaXplZF8pIHJldHVybjsKIAogICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOworICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQkVGT1JFKDEsIDEpKSB7CiAgICAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKG51bGwpOwogICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sobnVsbCk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sobnVsbCk7CkBAIC00NzYsNiArNDg1LDcgQEAKICAgICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOwogICAgIEVSUl9mcmVlX3N0cmluZ3MoKTsKICAgICBFUlJfcmVtb3ZlX3N0YXRlKDApOworICAgfQogICB9CiAKICAgc3RhdGljIGV4dGVybihDKSB7CkBAIC01MTgsNyArNTI4LDcgQEAKICAgICAgIGNvbnN0KGNoYXIpKiBmaWxlLCBpbnQgbGluZSkKICAgICB7CiAgICAgICBHQy5yZW1vdmVSYW5nZShsKTsKLSAgICAgIGNsZWFyKGNhc3QoTXV0ZXgpbCk7CisgICAgICBkZXN0cm95KGNhc3QoTXV0ZXgpbCk7CiAgICAgICBmcmVlKGwpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC91dGlsL2Z1dHVyZS5kIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2Z1dHVyZS5kCmluZGV4IDdjMTI3YzQuLjJiMzJhMDEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9mdXR1cmUuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvZnV0dXJlLmQKQEAgLTMxNiw3ICszMTYsNyBAQAogfQogCiAvKioKLSAqIENyZWF0ZXMgYW4gaW50ZXJmYWNlIHRoYXQgaXMgc2ltaWxpYXIgdG8gYSBnaXZlbiBvbmUsIGJ1dCBhY2NlcHRzIGFuCisgKiBDcmVhdGVzIGFuIGludGVyZmFjZSB0aGF0IGlzIHNpbWlsYXIgdG8gYSBnaXZlbiBvbmUsIGJ1dCBhY2NlcHRzIGFuCiAgKiBhZGRpdGlvbmFsLCBvcHRpb25hbCBUQ2FuY2VsbGF0aW9uIHBhcmFtZXRlciBlYWNoIG1ldGhvZCwgYW5kIHJldHVybnMKICAqIFRGdXR1cmVzIGluc3RlYWQgb2YgcGxhaW4gcmV0dXJuIHZhbHVlcy4KICAqCkBAIC00NTQsNyArNDU0LDcgQEAKIAogICAgICAgKytjb21wbGV0ZWRDb3VudF87CiAgICAgICBpZiAoY29tcGxldGVkQ291bnRfID09IGZ1dHVyZXNfLmxlbmd0aCkgewotICAgICAgICAvLyBUaGlzIHdhcyB0aGUgbGFzdCBmdXR1cmUgaW4gdGhlIGxpc3QsIHRoZXJlIGlzIG5vIHBvc3NpYmxpdHkKKyAgICAgICAgLy8gVGhpcyB3YXMgdGhlIGxhc3QgZnV0dXJlIGluIHRoZSBsaXN0LCB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eQogICAgICAgICAvLyBhbm90aGVyIHJlc3VsdCBjb3VsZCBldmVyIGJlY29tZSBhdmFpbGFibGUuCiAgICAgICAgIGZpbmlzaGVkXyA9IHRydWU7CiAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kIGIvbGliL2Qvc3JjL3RocmlmdC91dGlsL2hhc2hzZXQuZAppbmRleCA1ZWY5N2Y5Li5lZGUxMjJlIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3V0aWwvaGFzaHNldC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdXRpbC9oYXNoc2V0LmQKQEAgLTIzLDEzICsyMywxNSBAQAogaW1wb3J0IHN0ZC50cmFpdHMgOiBpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSwgUGFyYW1ldGVyVHlwZVR1cGxlOwogaW1wb3J0IHN0ZC5yYW5nZSA6IEVsZW1lbnRUeXBlLCBpc0lucHV0UmFuZ2U7CiAKK3N0cnVjdCBWb2lkIHt9CisKIC8qKgogICogQSBxdWlja2x5IGhhY2tlZCB0b2dldGhlciBoYXNoIHNldCBpbXBsZW1lbnRhdGlvbiBiYWNrZWQgYnkgYnVpbHQtaW4KICAqIGFzc29jaWF0aXZlIGFycmF5cyB0byBoYXZlIHNvbWV0aGluZyB0byBjb21waWxlIFRocmlmdCdzIHNldDw+IHRvIHVudGlsCiAgKiBzdGQuY29udGFpbmVyIGdhaW5zIHNvbWV0aGluZyBzdWl0YWJsZS4KICAqLwogLy8gTm90ZTogVGhlIGZ1bmt5IHBvaW50ZXIgY2FzdHMgKGkuZS4gKihjYXN0KGltbXV0YWJsZShFKSopJmUpIGluc3RlYWQgb2YKLS8vIGp1c3QgY2FzdChpbW11dGFibGUoRSkpZSkgYXJlIGEgd29ya2Fyb3VuZCBmb3IgTERDIDIgY29tcGF0aWJpbHR5LgorLy8ganVzdCBjYXN0KGltbXV0YWJsZShFKSllKSBhcmUgYSB3b3JrYXJvdW5kIGZvciBMREMgMiBjb21wYXRpYmlsaXR5LgogZmluYWwgY2xhc3MgSGFzaFNldChFKSB7CiAgIC8vLwogICB0aGlzKCkge30KQEAgLTQxLDcgKzQzLDcgQEAKIAogICAvLy8KICAgdm9pZCBpbnNlcnQoU3R1ZmYpKFN0dWZmIHN0dWZmKSBpZiAoaXNJbXBsaWNpdGx5Q29udmVydGlibGUhKFN0dWZmLCBFKSkgewotICAgIGFhX1sqKGNhc3QoaW1tdXRhYmxlKEUpKikmc3R1ZmYpXSA9IFtdOworICAgIGFhX1sqKGNhc3QoaW1tdXRhYmxlKEUpKikmc3R1ZmYpXSA9IFZvaWQuaW5pdDsKICAgfQogCiAgIC8vLwpAQCAtNDksNyArNTEsNyBAQAogICAgIGlzSW5wdXRSYW5nZSFTdHVmZiAmJiBpc0ltcGxpY2l0bHlDb252ZXJ0aWJsZSEoRWxlbWVudFR5cGUhU3R1ZmYsIEUpCiAgICkgewogICAgIGZvcmVhY2ggKGU7IHN0dWZmKSB7Ci0gICAgICBhYV9bKihjYXN0KGltbXV0YWJsZShFKSopJmUpXSA9IFtdOworICAgICAgYWFfWyooY2FzdChpbW11dGFibGUoRSkqKSZlKV0gPSBWb2lkLmluaXQ7CiAgICAgfQogICB9CiAKQEAgLTg2LDcgKzg4LDcgQEAKIAogICAvLy8KICAgYXV0byBvcFNsaWNlKCkgY29uc3QgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB1c2luZyBBQSBrZXkgcmFuZ2Ugb25jZSBhdmFpbGFiZSBpbiByZWxlYXNlIERNRC9kcnVudGltZQorICAgIC8vIFRPRE86IEltcGxlbWVudCB1c2luZyBBQSBrZXkgcmFuZ2Ugb25jZSBhdmFpbGFibGUgaW4gcmVsZWFzZSBETUQvZHJ1bnRpbWUKICAgICAvLyB0byBhdm9pZCBhbGxvY2F0aW9uLgogICAgIHJldHVybiBjYXN0KEVbXSkoYWFfLmtleXMpOwogICB9CkBAIC0xMTUsNyArMTE3LDYgQEAKICAgfQogCiBwcml2YXRlOgotICBhbGlhcyB2b2lkWzBdIFZvaWQ7CiAgIFZvaWRbaW1tdXRhYmxlKEUpXSBhYV87CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZmY0YmQ0Ni4uM2I2YTZmMQotLS0gYS9saWIvZC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAorQVVUT01BS0VfT1BUSU9OUyA9IHNlcmlhbC10ZXN0cworCitCVUlMVF9TT1VSQ0VTID0gdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0gc2VydmVyLWNlcnRpZmljYXRlLnBlbQorCiAKICMgVGhyaWZ0IGNvbXBpbGVyIHJ1bGVzCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGRlYnVnX3Byb3RvX2dlbiA9ICQoYWRkcHJlZml4IGdlbi1kLywgRGVidWdQcm90b1Rlc3RfdHlwZXMuZCkKIAogJChkZWJ1Z19wcm90b19nZW4pOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CkBAIC01Miw3ICs1NCw3IEBACiAKIGxpYmV2ZW50X2RlcGVuZGVudF90YXJnZXRzID0gYXN5bmNfdGVzdF9jbGllbnQgY2xpZW50X3Bvb2xfdGVzdCBcCiAJc3RyZXNzX3Rlc3Rfc2VydmVyIHRocmlmdF90ZXN0X3NlcnZlcgotbGliZXZlbnRfZGVwZW5kZW50X3Jhbl90ZXN0cyA9IGFzeW5jX3Rlc3RfcnVubmVyLnNoIHRocmlmdF90ZXN0X3J1bm5lci5zaAorbGliZXZlbnRfZGVwZW5kZW50X3Jhbl90ZXN0cyA9IGNsaWVudF9wb29sX3Rlc3QgYXN5bmNfdGVzdF9ydW5uZXIuc2ggdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCiAKIG9wZW5zc2xfZGVwZW5kZW50X3RhcmdldHMgPSBhc3luY190ZXN0IHRocmlmdF90ZXN0X2NsaWVudCB0aHJpZnRfdGVzdF9zZXJ2ZXIKIG9wZW5zc2xfZGVwZW5kZW50X3Jhbl90ZXN0cyA9IGFzeW5jX3Rlc3RfcnVubmVyLnNoIHRocmlmdF90ZXN0X3J1bm5lci5zaApAQCAtNzAsNyArNzIsNyBAQAogCiBpZiBXSVRIX0RfU1NMX1RFU1RTCiBkX3Rlc3RfZmxhZ3MgKz0gJChETURfT1BFTlNTTF9GTEFHUykgLi4vJChEX1NTTF9MSUJfTkFNRSkKLXRhcmdldHMgPSB0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtICQodGFyZ2V0c18pCit0YXJnZXRzID0gJCh0YXJnZXRzXykKIHJhbl90ZXN0cyA9ICQocmFuX3Rlc3RzXykKIGVsc2UKIHRhcmdldHMgPSAkKGZpbHRlci1vdXQgJChvcGVuc3NsX2RlcGVuZGVudF90YXJnZXRzKSwgJCh0YXJnZXRzXykpCkBAIC0xMjEsMyArMTIzLDUgQEAKIAl0cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSBzZXJ2ZXItY2VydGlmaWNhdGUucGVtCiAKIFRFU1RTID0gJChyYW5fdGVzdHMpCisKK3ByZWNyb3NzOiAkKHRhcmdldHMpCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3QuZCBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCmluZGV4IDE2ZGI1MWIuLmZiNzY1YWQgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCisrKyBiL2xpYi9kL3Rlc3QvYXN5bmNfdGVzdC5kCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgfQogCiAgIGF1dG8gbWFuYWdlcnMgPSBuZXcgVExpYmV2ZW50QXN5bmNNYW5hZ2VyW21hbmFnZXJDb3VudF07Ci0gIHNjb3BlIChleGl0KSBmb3JlYWNoIChyZWYgbTsgbWFuYWdlcnMpIGNsZWFyKG0pOworICBzY29wZSAoZXhpdCkgZm9yZWFjaCAocmVmIG07IG1hbmFnZXJzKSBkZXN0cm95KG0pOwogCiAgIGF1dG8gY2xpZW50c1RocmVhZHMgPSBuZXcgVGhyZWFkR3JvdXA7CiAgIGZvcmVhY2ggKG1hbmFnZXJJbmRleCwgcmVmIG1hbmFnZXI7IG1hbmFnZXJzKSB7CkBAIC0zNDAsOSArMzQwLDkgQEAKICAgICAgICAgICBpZiAodHJhY2VfKSB3cml0ZWZsbihgQ2FsbGluZyBkZWxheWVkRWNobygiJXMiLCAxMDAgbXMpLi4uYCwgaWQpOwogICAgICAgICAgIGF1dG8gYSA9IGNsaWVudC5kZWxheWVkRWNobyhpZCwgMTAwKTsKICAgICAgICAgICBlbmZvcmNlKCFhLmNvbXBsZXRpb24ud2FpdChkdXIhInVzZWNzIigxKSksCi0gICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CisgICAgICAgICAgICB0ZXh0KCJ3YWl0KCkgc3VjY2VlZGVkIGVhcmx5ICgiLCBhLmdldCgpLCAiLCAiLCBpZCwgIikuIikpOwogICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKLSAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWRlZCBlYXJseSAoIiwgYS5nZXQoKSwgIiwgIiwgaWQsICIpLiIpKTsKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGEuZ2V0KCksICIsICIsIGlkLCAiKS4iKSk7CiAgICAgICAgICAgZW5mb3JjZShhLmNvbXBsZXRpb24ud2FpdChkdXIhIm1zZWNzIigyMDApKSwKICAgICAgICAgICAgIHRleHQoIndhaXQoKSBkaWRuJ3Qgc3VjY2VlZCBhcyBleHBlY3RlZCAoIiwgaWQsICIpLiIpKTsKICAgICAgICAgICBlbmZvcmNlKGEuZ2V0KCkgPT0gaWQpOwpAQCAtMzUzLDkgKzM1Myw5IEBACiAgICAgICAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oYENhbGxpbmcgZGVsYXllZEZhaWwoIiVzIiwgMTAwIG1zKS4uLiBgLCBpZCk7CiAgICAgICAgICAgYXV0byBhID0gY2xpZW50LmRlbGF5ZWRGYWlsKGlkLCAxMDApOwogICAgICAgICAgIGVuZm9yY2UoIWEuY29tcGxldGlvbi53YWl0KGR1ciEidXNlY3MiKDEpKSwKLSAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKKyAgICAgICAgICAgIHRleHQoIndhaXQoKSBzdWNjZWVkZWQgZWFybHkgKCIsIGlkLCAiLCAiLCBjb2xsZWN0RXhjZXB0aW9uKGEuZ2V0KCkpLCAiKS4iKSk7CiAgICAgICAgICAgZW5mb3JjZSghYS5jb21wbGV0aW9uLndhaXQoZHVyISJ1c2VjcyIoMSkpLAotICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZGVkIGVhcmx5ICgiLCBpZCwgIiwgIiwgY29sbGVjdEV4Y2VwdGlvbihhLmdldCgpKSwgIikuIikpOworICAgICAgICAgICAgdGV4dCgid2FpdCgpIHN1Y2NlZWRlZCBlYXJseSAoIiwgaWQsICIsICIsIGNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSksICIpLiIpKTsKICAgICAgICAgICBlbmZvcmNlKGEuY29tcGxldGlvbi53YWl0KGR1ciEibXNlY3MiKDIwMCkpLAogICAgICAgICAgICAgdGV4dCgid2FpdCgpIGRpZG4ndCBzdWNjZWVkIGFzIGV4cGVjdGVkICgiLCBpZCwgIikuIikpOwogICAgICAgICAgIGF1dG8gZSA9IGNhc3QoQXN5bmNUZXN0RXhjZXB0aW9uKWNvbGxlY3RFeGNlcHRpb24oYS5nZXQoKSk7CmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDRiOWI3YzAuLjdkNTA3ZWUKLS0tIGEvbGliL2QvdGVzdC9hc3luY190ZXN0X3J1bm5lci5zaAorKysgYi9saWIvZC90ZXN0L2FzeW5jX3Rlc3RfcnVubmVyLnNoCkBAIC0xLDYgKzEsMjggQEAKICMhL2Jpbi9iYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitDVVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKKwogIyBSdW5zIHRoZSBhc3luYyB0ZXN0IGluIGJvdGggU1NMIGFuZCBub24tU1NMIG1vZGUuCi0uL2FzeW5jX3Rlc3QgPiAvZGV2L251bGwgfHwgZXhpdCAxCiske0NVUn0vYXN5bmNfdGVzdCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKIGVjaG8gIk5vbi1TU0wgdGVzdHMgZG9uZS4iCi0uL2FzeW5jX3Rlc3QgLS1zc2wgPiAvZGV2L251bGwgfHwgZXhpdCAxCiske0NVUn0vYXN5bmNfdGVzdCAtLXNzbCA+IC9kZXYvbnVsbCB8fCBleGl0IDEKIGVjaG8gIlNTTCB0ZXN0cyBkb25lLiIKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvY2xpZW50X3Bvb2xfdGVzdC5kIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKaW5kZXggODViY2IyOS4uYjI0Yzk3YSAxMDA2NDQKLS0tIGEvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKKysrIGIvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogbW9kdWxlIGNsaWVudF9wb29sX3Rlc3Q7CiAKK2ltcG9ydCBjb3JlLnN5bmMuc2VtYXBob3JlIDogU2VtYXBob3JlOwogaW1wb3J0IGNvcmUudGltZSA6IER1cmF0aW9uLCBkdXI7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBUaHJlYWQ7CiBpbXBvcnQgc3RkLmFsZ29yaXRobTsKQEAgLTI4LDYgKzI5LDcgQEAKIGltcG9ydCBzdGQucmFuZ2U7CiBpbXBvcnQgc3RkLnN0ZGlvOwogaW1wb3J0IHN0ZC50eXBlY29uczsKK2ltcG9ydCBzdGQudmFyaWFudCA6IFZhcmlhbnQ7CiBpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmFzeW5jLmxpYmV2ZW50OwogaW1wb3J0IHRocmlmdC5hc3luYy5zb2NrZXQ7CkBAIC0zNyw5ICszOSwxMiBAQAogaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudDsKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5jbGllbnRfcG9vbDsKIGltcG9ydCB0aHJpZnQuY29kZWdlbi5wcm9jZXNzb3I7CitpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnByb3RvY29sLmJpbmFyeTsKK2ltcG9ydCB0aHJpZnQuc2VydmVyLmJhc2U7CiBpbXBvcnQgdGhyaWZ0LnNlcnZlci5zaW1wbGU7CiBpbXBvcnQgdGhyaWZ0LnNlcnZlci50cmFuc3BvcnQuc29ja2V0OworaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYmFzZTsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmJ1ZmZlcmVkOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc29ja2V0OwogaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKQEAgLTEwOCwxMSArMTEzLDI5IEBACiAgIH0KIH0KIAorY2xhc3MgU2VydmVyUHJlU2VydmVIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlciB7CisgIHRoaXMoU2VtYXBob3JlIHNlbSkgeworICAgIHNlbV8gPSBzZW07CisgIH0KKworICBvdmVycmlkZSB2b2lkIHByZVNlcnZlKCkgeworICAgIHNlbV8ubm90aWZ5KCk7CisgIH0KKworICBWYXJpYW50IGNyZWF0ZUNvbnRleHQoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7IHJldHVybiBWYXJpYW50LmluaXQ7IH0KKyAgdm9pZCBkZWxldGVDb250ZXh0KFZhcmlhbnQgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0KSB7fQorICB2b2lkIHByZVByb2Nlc3MoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUVHJhbnNwb3J0IHRyYW5zcG9ydCkge30KKworcHJpdmF0ZToKKyAgU2VtYXBob3JlIHNlbV87Cit9CisKIGNsYXNzIFNlcnZlclRocmVhZCA6IFRocmVhZCB7Ci0gIHRoaXMoRXhUZXN0SGFuZGxlciBoYW5kbGVyLCBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbikgeworICB0aGlzKEV4VGVzdEhhbmRsZXIgaGFuZGxlciwgU2VydmVyUHJlU2VydmVIYW5kbGVyIHNlcnZlckhhbmRsZXIsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uKSB7CiAgICAgc3VwZXIoJnJ1bik7CiAgICAgaGFuZGxlcl8gPSBoYW5kbGVyOwogICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc2VydmVySGFuZGxlcl8gPSBzZXJ2ZXJIYW5kbGVyOwogICB9CiBwcml2YXRlOgogICB2b2lkIHJ1bigpIHsKQEAgLTEyMywxNiArMTQ2LDE3IEBACiAgICAgICBzZXJ2ZXJUcmFuc3BvcnQucmVjdlRpbWVvdXQgPSBkdXIhInNlY29uZHMiKDMpOwogICAgICAgYXV0byB0cmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk7CiAKLSAgICAgIGF1dG8gc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoCi0gICAgICAgIHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIHNlcnZlci5ldmVudEhhbmRsZXIgPSBzZXJ2ZXJIYW5kbGVyXzsKICAgICAgIHNlcnZlci5zZXJ2ZShjYW5jZWxsYXRpb25fKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgd3JpdGVmbG4oIlNlcnZlciB0aHJlYWQgb24gcG9ydCAlcyBmYWlsZWQ6ICVzIiwgaGFuZGxlcl8ucG9ydCwgZSk7CiAgICAgfQogICB9CiAKLSAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOwogICBFeFRlc3RIYW5kbGVyIGhhbmRsZXJfOworICBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgc2VydmVySGFuZGxlcl87CisgIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uXzsKIH0KIAogdm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKQEAgLTE0NSw2ICsxNjksOSBAQAogCiAgIGltbXV0YWJsZSBwb3J0cyA9IGNhc3QoaW1tdXRhYmxlKWFycmF5KG1hcCEiY2FzdCh1c2hvcnQpYSIoaW90YShwb3J0LCBwb3J0ICsgNikpKTsKIAorICAvLyBzZW1hcGhvcmUgdGhhdCB3aWxsIGJlIGluY3JlbWVudGVkIHdoZW5ldmVyIGVhY2ggc2VydmVyIHRocmVhZCBoYXMgYm91bmQgYW5kIHN0YXJ0ZWQgbGlzdGVuaW5nCisgIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDApOworCiB2ZXJzaW9uIChub25lKSB7CiAgIC8vIENhbm5vdCB1c2UgdGhpcyBkdWUgdG8gbXVsdGlwbGUgRE1EIEBAQlVHQEBzOgogICAvLyAxLiDCu2Z1bmN0aW9uIEQgbWFpbiBpcyBhIG5lc3RlZCBmdW5jdGlvbiBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGZyb20gYXJyYXnCqwpAQCAtMTc0LDExICsyMDEsMTAgQEAKIH0KIAogICAvLyBGaXJlIHVwIHRoZSBzZXJ2ZXIgdGhyZWFkcy4KLSAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChuZXcgU2VydmVyVGhyZWFkKGgsIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAobmV3IFNlcnZlclRocmVhZChoLCBuZXcgU2VydmVyUHJlU2VydmVIYW5kbGVyKHNlbSksIHNlcnZlckNhbmNlbGxhdGlvbikpLnN0YXJ0KCk7CiAKLSAgLy8gR2l2ZSB0aGUgc2VydmVycyBzb21lIHRpbWUgdG8gZ2V0IHVwLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYWNjb21wbGlzaGVkCi0gIC8vIHZpYSBhIGJhcnJpZXIgaGVyZSBhbmQgaW4gdGhlIHByZVNlcnZlKCkgaG9vay4KLSAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDEwKSk7CisgIC8vIHdhaXQgdW50aWwgYWxsIHRoZSBoYW5kbGVycyBzaWduYWwgdGhhdCB0aGV5J3JlIHJlYWR5IHRvIHNlcnZlCisgIGZvcmVhY2ggKGg7IGhhbmRsZXJzKSAoc2VtLndhaXQoZHVyIWBzZWNvbmRzYCgxKSkpOwogCiAgIHN5bmNDbGllbnRQb29sVGVzdChwb3J0cywgaGFuZGxlcnMpOwogICBhc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CkBAIC00MDksOCArNDM1LDggQEAKICAgICApKCk7CiAgICAgVGhyZWFkLnNsZWVwKGR1ciEibXNlY3MiKDIwKSk7CiAgICAgYXV0byByZXN1bHRUdXBsZSA9IHBhcnRpYWxSZXN1bHQuZmluaXNoR2V0KCk7Ci0gICAgZW5mb3JjZShyZXN1bHRUdXBsZS5fMCA9PSBwb3J0c1swIC4uIDJdKTsKLSAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmVzdWx0VHVwbGUuXzEpLAorICAgIGVuZm9yY2UocmVzdWx0VHVwbGVbMF0gPT0gcG9ydHNbMCAuLiAyXSk7CisgICAgZW5mb3JjZShlcXVhbChtYXAhImEucG9ydCIoY2FzdChUZXN0U2VydmljZUV4Y2VwdGlvbltdKXJlc3VsdFR1cGxlWzFdKSwKICAgICAgIHBvcnRzWzMgLi4gJCAtIDFdKSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZCBiL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZAppbmRleCAzNTUxNWM4Li40MGQwNDgwIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKKysrIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCkBAIC0xMyw3ICsxMyw3IEBACiAgKi8KIG1vZHVsZSBzZXJpYWxpemF0aW9uX2JlbmNobWFyazsKIAotaW1wb3J0IHN0ZC5kYXRldGltZSA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKIGltcG9ydCBzdGQubWF0aCA6IFBJOwogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OwpAQCAtNDYsNyArNDYsNyBAQAogICAgIH0KICAgICBzdy5zdG9wKCk7CiAKLSAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLm1zZWNzOworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKICAgICB3cml0ZWZsbigiV3JpdGU6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CiAgIH0KIApAQCAtNjQsNyArNjQsNyBAQAogICAgIH0KICAgICBzdy5zdG9wKCk7CiAKLSAgICBhdXRvIG1zZWNzID0gc3cucGVlaygpLm1zZWNzOworICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkudG90YWwhIm1zZWNzIjsKICAgICB3cml0ZWZsbigiIFJlYWQ6ICVzIG1zICglcyBrSHopIiwgbXNlY3MsIElURVJBVElPTlMgLyBtc2Vjcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X2NsaWVudC5kCmluZGV4IGEyNThiNjQuLjQ5NDE5ZjcgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfY2xpZW50LmQKKysrIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9jbGllbnQuZApAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IHN0ZC5zdGRpbzsKIGltcG9ydCBzdGQuc3RyaW5nOwogaW1wb3J0IHN0ZC50cmFpdHM7CitpbXBvcnQgdGhyaWZ0LmJhc2U7CiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iYXNlOwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CkBAIC03NSw2ICs3Niw3IEBACiAgICAgInNzbCIsICZzc2wsCiAgICAgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnRUeXBlLAogICAgICJ0cmFjZSIsICZ0cmFjZSwKKyAgICAicG9ydCIsICZwb3J0LAogICAgICJob3N0IiwgKHN0cmluZyBfLCBzdHJpbmcgdmFsdWUpIHsKICAgICAgIGF1dG8gcGFydHMgPSBzcGxpdCh2YWx1ZSwgIjoiKTsKICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CkBAIC04NywxMyArODksMTQgQEAKICAgICAgIH0KICAgICB9CiAgICk7CisgIHBvcnQgPSB0byF1c2hvcnQocG9ydCk7CiAKICAgVFNvY2tldCBzb2NrZXQ7CiAgIGlmIChzc2wpIHsKICAgICBhdXRvIHNzbENvbnRleHQgPSBuZXcgVFNTTENvbnRleHQoKTsKICAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKICAgICBzc2xDb250ZXh0LmF1dGhlbnRpY2F0ZSA9IHRydWU7Ci0gICAgc3NsQ29udGV4dC5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcygiLi90cnVzdGVkLWNhLWNlcnRpZmljYXRlLnBlbSIpOworICAgIHNzbENvbnRleHQubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9DQS5wZW0iKTsKICAgICBzb2NrZXQgPSBuZXcgVFNTTFNvY2tldChzc2xDb250ZXh0LCBob3N0LCBwb3J0KTsKICAgfSBlbHNlIHsKICAgICBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKQEAgLTE1OSw2ICsxNjIsOCBAQAogICAgIGlmICh0cmFjZSkgd3JpdGVmbG4oIiA9ICVzIiwgZHViKTsKICAgICBlbmZvcmNlKGR1YiA9PSAtNS4yMDk4NTIzKTsKIAorCS8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCQogICAgIFh0cnVjdCBvdXQxOwogICAgIG91dDEuc3RyaW5nX3RoaW5nID0gIlplcm8iOwogICAgIG91dDEuYnl0ZV90aGluZyA9IDE7CkBAIC0yNzgsNiArMjgzLDE1IEBACiAgICAgICB9CiAKICAgICAgIHRyeSB7CisgICAgICAgIGlmICh0cmFjZSkgd3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWRcbkZBSUxVUkUiKTsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigidGVzdEV4Y2VwdGlvbiBmYWlsZWQuIik7CisgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWZsbigiICB7JXN9IiwgZS5tc2cpOworICAgICAgfQorCisgICAgICB0cnkgewogICAgICAgICBpZiAodHJhY2UpIHdyaXRlKCJjbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKICAgICAgICAgaWYgKHRyYWNlKSB3cml0ZWxuKCIgIHZvaWQiKTsKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9ydW5uZXIuc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBmYmU3NWYwLi41MWJmZTk5Ci0tLSBhL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3RfcnVubmVyLnNoCkBAIC0xLDEwICsxLDM0IEBACiAjIS9iaW4vYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwogIyBSdW5zIHRoZSBEIFRocmlmdFRlc3QgY2xpZW50IGFuZCBzZXJ2ZXJzIGZvciBhbGwgY29tYmluYXRpb25zIG9mIHRyYW5zcG9ydCwKICMgcHJvdG9jb2wsIFNTTC1tb2RlIGFuZCBzZXJ2ZXIgdHlwZS4KICMgUGFzcyAtayB0byBrZWVwIGdvaW5nIGFmdGVyIGZhaWxlZCB0ZXN0cy4KIAorQ1VSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCisKIHByb3RvY29scz0iYmluYXJ5IGNvbXBhY3QganNvbiIKLXRyYW5zcG9ydHM9ImJ1ZmZlcmVkIGZyYW1lZCBodHRwIHJhdyIKKyMgVE9ETzogZml4IGFuZCBlbmFibGUgaHR0cAorIyB0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3IGh0dHAiCit0cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgcmF3Igogc2VydmVycz0ic2ltcGxlIHRhc2twb29sIHRocmVhZGVkIgogZnJhbWVkX29ubHlfc2VydmVycz0ibm9uYmxvY2tpbmcgcG9vbGVkTm9uYmxvY2tpbmciCiAKQEAgLTIxLDE2ICs0NSwyMCBAQAogICAgICAgICBlc2FjCiAKICAgICAgICAgYXJncz0iLS10cmFuc3BvcnQ9JHRyYW5zcG9ydCAtLXByb3RvY29sPSRwcm90b2NvbCRzc2wiCi0gICAgICAgIC4vdGhyaWZ0X3Rlc3Rfc2VydmVyICRhcmdzIC0tc2VydmVyLXR5cGU9JHNlcnZlciA+IC9kZXYvbnVsbCAmCisgICAgICAgICR7Q1VSfS90aHJpZnRfdGVzdF9zZXJ2ZXIgJGFyZ3MgLS1zZXJ2ZXItdHlwZT0kc2VydmVyID4gL2Rldi9udWxsICYKICAgICAgICAgc2VydmVyX3BpZD0kIQogCiAgICAgICAgICMgR2l2ZSB0aGUgc2VydmVyIHNvbWUgdGltZSB0byBnZXQgdXAgYW5kIGNoZWNrIGlmIGl0IHJ1bnMgKHllcywgdGhpcwogICAgICAgICAjIGlzIGEgaHVnZSBrbHVkZ2UsIHNob3VsZCBhZGQgYSBjb25uZWN0IHRpbWVvdXQgdG8gdGVzdCBjbGllbnQpLgogICAgICAgICBjbGllbnRfcmM9LTEKLSAgICAgICAgc2xlZXAgMC4wMQorICAgICAgICBpZiBbICIkc2VydmVyIiA9ICJ0YXNrcG9vbCIgXTsgdGhlbgorICAgICAgICAgIHNsZWVwIDAuNQorICAgICAgICBlbHNlCisgICAgICAgICAgc2xlZXAgMC4wMgorICAgICAgICBmaQogICAgICAgICBraWxsIC0wICRzZXJ2ZXJfcGlkIDI+L2Rldi9udWxsCiAgICAgICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgotICAgICAgICAgIC4vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKKyAgICAgICAgICAke0NVUn0vdGhyaWZ0X3Rlc3RfY2xpZW50ICRhcmdzIC0tbnVtVGVzdHM9MTAgPiAvZGV2L251bGwKICAgICAgICAgICBjbGllbnRfcmM9JD8KIAogICAgICAgICAgICMgVGVtcG9yYXJpbHkgcmVkaXJlY3Qgc3RkZXJyIHRvIG51bGwgdG8gYXZvaWQgam9iIGNvbnRyb2wgbWVzc2FnZXMsCmRpZmYgLS1naXQgYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kIGIvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZAppbmRleCA5OTNjMDYzLi5iNTgyMjUzIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCisrKyBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKQEAgLTE2LDggKzE2LDExIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLworCiBtb2R1bGUgdGhyaWZ0X3Rlc3Rfc2VydmVyOwogCitpbXBvcnQgY29yZS5zdGRjLmVycm5vIDogZXJybm87CitpbXBvcnQgY29yZS5zdGRjLnNpZ25hbCA6IHNpZ25hbCwgc2lnZm5fdCwgU0lHSU5ULCBTSUdfREZMLCBTSUdfRVJSOwogaW1wb3J0IGNvcmUudGhyZWFkIDogZHVyLCBUaHJlYWQ7CiBpbXBvcnQgc3RkLmFsZ29yaXRobTsKIGltcG9ydCBzdGQuZXhjZXB0aW9uIDogZW5mb3JjZTsKQEAgLTQwLDYgKzQzLDcgQEAKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0LmZyYW1lZDsKIGltcG9ydCB0aHJpZnQudHJhbnNwb3J0Lmh0dHA7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zc2w7CitpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOwogaW1wb3J0IHRocmlmdC51dGlsLmhhc2hzZXQ7CiBpbXBvcnQgdGVzdF91dGlsczsKIApAQCAtODEsNiArODUsMTYgQEAKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAorICBvdmVycmlkZSBzdHJpbmcgdGVzdEJpbmFyeShzdHJpbmcgdGhpbmcpIHsKKyAgICBpZiAodHJhY2VfKSB3cml0ZWZsbigidGVzdEJpbmFyeShcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCisgIG92ZXJyaWRlIGJvb2wgdGVzdEJvb2woYm9vbCB0aGluZykgeworICAgIGlmICh0cmFjZV8pIHdyaXRlZmxuKCJ0ZXN0Qm9vbChcIiVzXCIpIiwgdGhpbmcpOworICAgIHJldHVybiB0aGluZzsKKyAgfQorCiAgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0U3RydWN0KHJlZiBjb25zdChYdHJ1Y3QpIHRoaW5nKSB7CiAgICAgaWYgKHRyYWNlXykgd3JpdGVmbG4oInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJXMsICVzLCAlc30pIiwKICAgICAgIHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpOwpAQCAtMTMzLDcgKzE0NywxNyBAQAogCiAgIG92ZXJyaWRlIEluc2FuaXR5W051bWJlcnpdW1VzZXJJZF0gdGVzdEluc2FuaXR5KHJlZiBjb25zdChJbnNhbml0eSkgYXJndW1lbnQpIHsKICAgICBpZiAodHJhY2VfKSB3cml0ZWxuKCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgIHJldHVybiB0ZXN0SW5zYW5pdHlSZXR1cm47CisgICAgSW5zYW5pdHlbTnVtYmVyel1bVXNlcklkXSByZXQ7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTE7CisgICAgSW5zYW5pdHlbTnVtYmVyel0gbTI7CisgICAgSW5zYW5pdHkgdG1wOworICAgIHRtcCA9IGNhc3QoSW5zYW5pdHkpYXJndW1lbnQ7CisgICAgbTFbTnVtYmVyei5UV09dID0gdG1wOworICAgIG0xW051bWJlcnouVEhSRUVdID0gdG1wOworICAgIG0yW051bWJlcnouU0lYXSA9IEluc2FuaXR5KCk7CisgICAgcmV0WzFdID0gbTE7CisgICAgcmV0WzJdID0gbTI7CisgICAgcmV0dXJuIHJldDsKICAgfQogCiAgIG92ZXJyaWRlIFh0cnVjdCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBzdHJpbmdbc2hvcnRdIGFyZzMsCkBAIC0xNTAsNiArMTc0LDggQEAKICAgICAgIGUuZXJyb3JDb2RlID0gMTAwMTsKICAgICAgIGUubWVzc2FnZSA9IGFyZzsKICAgICAgIHRocm93IGU7CisgICAgfSBlbHNlIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOwogICAgIH0gZWxzZSBpZiAoYXJnID09ICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpIHsKICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CiAgICAgfQpAQCAtMTgzLDE0ICsyMDksNDQgQEAKICAgYm9vbCB0cmFjZV87CiB9CiAKK3NoYXJlZChib29sKSBnU2h1dGRvd24gPSBmYWxzZTsKKworbm90aHJvdyBAbm9nYyBleHRlcm4oQykgdm9pZCBoYW5kbGVTaWduYWwoaW50IHNpZykgeworICBnU2h1dGRvd24gPSB0cnVlOworfQorCisvLyBSdW5zIGEgdGhyZWFkIHRoYXQgd2FpdHMgZm9yIHNodXRkb3duIHRvIGJlCisvLyBzaWduYWxlZCBhbmQgdGhlbiB0cmlnZ2VycyBjYW5jZWxsYXRpb24sCisvLyBjYXVzaW5nIHRoZSBzZXJ2ZXIgdG8gc3RvcC4gIFdoaWxlIHdlIGNvdWxkCisvLyB1c2UgYSBzaWduYWxmZCBmb3IgdGhpcyBwdXJwb3NlLCB3ZSBhcmUgaW5zdGVhZAorLy8gb3B0aW5nIGZvciBhIGJ1c3kgd2FpdGluZyBzY2hlbWUgZm9yIG1heGltdW0KKy8vIHBvcnRhYmlsaXR5IHNpbmNlIHNpZ25hbGZkIGlzIGEgbGludXggdGhpbmcuCisKK2NsYXNzIFNodXRkb3duVGhyZWFkIDogVGhyZWFkIHsKKyAgdGhpcyhUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbikgeworICAgIGNhbmNlbGxhdGlvbl8gPSBjYW5jZWxsYXRpb247CisgICAgc3VwZXIoJnJ1bik7CisgIH0KKyAgCitwcml2YXRlOgorICB2b2lkIHJ1bigpIHsKKyAgICB3aGlsZSAoIWdTaHV0ZG93bikgeworICAgICAgVGhyZWFkLnNsZWVwKGR1ciEoIm1zZWNzIikoMjUpKTsKKyAgICB9CisgICAgY2FuY2VsbGF0aW9uXy50cmlnZ2VyKCk7CisgIH0KKyAgCisgIFRDYW5jZWxsYXRpb25PcmlnaW4gY2FuY2VsbGF0aW9uXzsKK30KKwogdm9pZCBtYWluKHN0cmluZ1tdIGFyZ3MpIHsKICAgdXNob3J0IHBvcnQgPSA5MDkwOwogICBTZXJ2ZXJUeXBlIHNlcnZlclR5cGU7CiAgIFByb3RvY29sVHlwZSBwcm90b2NvbFR5cGU7CiAgIHNpemVfdCBudW1JT1RocmVhZHMgPSAxOwogICBUcmFuc3BvcnRUeXBlIHRyYW5zcG9ydFR5cGU7Ci0gIGJvb2wgc3NsOwotICBib29sIHRyYWNlOworICBib29sIHNzbCA9IGZhbHNlOworICBib29sIHRyYWNlID0gdHJ1ZTsKICAgc2l6ZV90IHRhc2tQb29sU2l6ZSA9IHRvdGFsQ1BVczsKIAogICBnZXRvcHQoYXJncywgInBvcnQiLCAmcG9ydCwgInByb3RvY29sIiwgJnByb3RvY29sVHlwZSwgInNlcnZlci10eXBlIiwKQEAgLTI0NCw4ICszMDAsOCBAQAogICBpZiAoc3NsKSB7CiAgICAgYXV0byBzc2xDb250ZXh0ID0gbmV3IFRTU0xDb250ZXh0KCk7CiAgICAgc3NsQ29udGV4dC5zZXJ2ZXJTaWRlID0gdHJ1ZTsKLSAgICBzc2xDb250ZXh0LmxvYWRDZXJ0aWZpY2F0ZSgiLi9zZXJ2ZXItY2VydGlmaWNhdGUucGVtIik7Ci0gICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi9zZXJ2ZXItcHJpdmF0ZS1rZXkucGVtIik7CisgICAgc3NsQ29udGV4dC5sb2FkQ2VydGlmaWNhdGUoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Iik7CisgICAgc3NsQ29udGV4dC5sb2FkUHJpdmF0ZUtleSgiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5rZXkiKTsKICAgICBzc2xDb250ZXh0LmNpcGhlcnMgPSAiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIjsKICAgICBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xDb250ZXh0KTsKICAgfSBlbHNlIHsKQEAgLTI1Nyw4ICszMTMsMjYgQEAKICAgYXV0byBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoc2VydmVyVHlwZSwgbnVtSU9UaHJlYWRzLCB0YXNrUG9vbFNpemUsCiAgICAgcHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CiAKKyAgLy8gU2V0IHVwIFNJR0lOVCBzaWduYWwgaGFuZGxpbmcKKyAgc2lnZm5fdCBvbGRIYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgJmhhbmRsZVNpZ25hbCk7CisgIGVuZm9yY2Uob2xkSGFuZGxlciAhPSBTSUdfRVJSLAorICAgICJDb3VsZCBub3QgcmVwbGFjZSB0aGUgU0lHSU5UIHNpZ25hbCBoYW5kbGVyOiBlcnJubyB7MH0iLmZvcm1hdChlcnJubygpKSk7CisgIAorICAvLyBTZXQgdXAgYSBzZXJ2ZXIgY2FuY2VsbGF0aW9uIHRyaWdnZXIKKyAgYXV0byBjYW5jZWwgPSBuZXcgVENhbmNlbGxhdGlvbk9yaWdpbigpOworCisgIC8vIFNldCB1cCBhIGxpc3RlbmVyIGZvciB0aGUgc2h1dGRvd24gY29uZGl0aW9uIC0gdGhpcyB3aWxsCisgIC8vIHdha2UgdXAgd2hlbiB0aGUgc2lnbmFsIG9jY3VycyBhbmQgdHJpZ2dlciBjYW5jZWxsYXRpb24uCisgIGF1dG8gc2h1dGRvd24gPSBuZXcgU2h1dGRvd25UaHJlYWQoY2FuY2VsKTsKKyAgc2h1dGRvd24uc3RhcnQoKTsKKyAgCisgIC8vIFNlcnZlIGZyb20gdGhpcyB0aHJlYWQ7IHRoZSBzaWduYWwgd2lsbCBzdG9wIHRoZSBzZXJ2ZXIKKyAgLy8gYW5kIGNvbnRyb2wgd2lsbCByZXR1cm4gaGVyZQogICB3cml0ZWZsbigiU3RhcnRpbmcgJXMvJXMgJXMgVGhyaWZ0VGVzdCBzZXJ2ZXIgJXNvbiBwb3J0ICVzLi4uIiwgcHJvdG9jb2xUeXBlLAogICAgIHRyYW5zcG9ydFR5cGUsIHNlcnZlclR5cGUsIHNzbCA/ICIodXNpbmcgU1NMKSAiOiAiIiwgcG9ydCk7Ci0gIHNlcnZlci5zZXJ2ZSgpOworICBzZXJ2ZXIuc2VydmUoY2FuY2VsKTsKKyAgc2h1dGRvd24uam9pbigpOworICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyAgICAKICAgd3JpdGVsbigiZG9uZS4iKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZCBiL2xpYi9kL3Rlc3QvdHJhbnNwb3J0X3Rlc3QuZAppbmRleCAzZjYxYTVkLi42MjNlMDNmIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L3RyYW5zcG9ydF90ZXN0LmQKKysrIGIvbGliL2QvdGVzdC90cmFuc3BvcnRfdGVzdC5kCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgfQogCiAgIH50aGlzKCkgewotICAgIGNsZWFyKGlubmVyXyk7CisgICAgZGVzdHJveShpbm5lcl8pOwogICB9CiAKIHByaXZhdGU6CkBAIC02NjksNyArNjY5LDcgQEAKICAgLy8gZWFjaCBzZW5kKCkgY2FsbC4gIElmIHdlIGhhdmUgbW9yZSB0aGFuIH40MDAgb3V0c3RhbmRpbmcgMS1ieXRlIHdyaXRlCiAgIC8vIHJlcXVlc3RzLCBhZGRpdGlvbmFsIHNlbmQoKSBjYWxscyBzdGFydCBibG9ja2luZy4KICAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSwKLSAgICAgICAgICAwLCAwLCA0MDApOworICAgICAgICAgIDAsIDAsIDI1MCk7CiAgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCAwLCAwLAogICAgICAgICAgIHJhbmQ0aywgcmFuZDRrLCBzb2NrZXRNYXhPdXRzdGFuZGluZyk7CiAgIHRlc3RSdyFDb3VwbGVkU29ja2V0VHJhbnNwb3J0cygxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywKQEAgLTY3Nyw3ICs2NzcsNyBAQAogICB0ZXN0UnchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoMTAyNCAqIDI1NiwgMTY3LCAxNjMsCiAgICAgICAgICAgcmFuZDRrLCByYW5kNGssIHNvY2tldE1heE91dHN0YW5kaW5nKTsKICAgdGVzdFJ3IUNvdXBsZWRTb2NrZXRUcmFuc3BvcnRzKDEwMjQgKiAxNiwgMSwgMSwKLSAgICAgICAgICByYW5kNGssIHJhbmQ0aywgNDAwKTsKKyAgICAgICAgICByYW5kNGssIHJhbmQ0aywgMjUwKTsKIAogICB0ZXN0QmxvY2tpbmchQ291cGxlZFNvY2tldFRyYW5zcG9ydHMoKTsKIApkaWZmIC0tZ2l0IGEvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMgYi9saWIvZGFydC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L0xJQ0VOU0UgYi9saWIvZGFydC9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYWNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9MSUNFTlNFCkBAIC0wLDAgKzEsMTYgQEAKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L01ha2VmaWxlLmFtIGIvbGliL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZGRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithbGwtbG9jYWw6CisJJChEQVJUUFVCKSBnZXQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgLnB1YgorCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCisKK2NoZWNrLWxvY2FsOiBhbGwKKworRVhUUkFfRElTVCA9IFwKKwkuYW5hbHlzaXNfb3B0aW9ucworCmRpZmYgLS1naXQgYS9saWIvZGFydC9SRUFETUUubWQgYi9saWIvZGFydC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMTY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kYXJ0L1JFQURNRS5tZApAQCAtMCwwICsxLDI2IEBACitUaHJpZnQgRGFydCBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERhcnQKKz09PT09PT09PT09PT09PT09PT09CisKK0RhcnQgMS4xMi4wIG9yIG5ld2VyIGlzIHJlcXVpcmVkCmRpZmYgLS1naXQgYS9saWIvZGFydC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY2MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RhcnQvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDYgQEAKKyMgRGFydCBDb2RpbmcgU3RhbmRhcmRzCisKKyMjIyBQbGVhc2UgZm9sbG93OgorICogW1RocmlmdCBHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyAqIFtVc2UgZGFydGZtdF0oaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL2RhcnRmbXQvKSBhbmQgZm9sbG93IHRoZSAKKyAgIFtEYXJ0IFN0eWxlIEd1aWRlXShodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvYXJ0aWNsZXMvc3R5bGUtZ3VpZGUvKQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0IGIvbGliL2RhcnQvbGliL3NyYy9icm93c2VyL3Rfd2ViX3NvY2tldC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NjkzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC9saWIvc3JjL2Jyb3dzZXIvdF93ZWJfc29ja2V0LmRhcnQKQEAgLTAsMCArMSwxMzAgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC5zcmMuYnJvd3NlcjsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JyBzaG93IEJBU0U2NDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IENsb3NlRXZlbnQ7CitpbXBvcnQgJ2RhcnQ6aHRtbCcgc2hvdyBFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IE1lc3NhZ2VFdmVudDsKK2ltcG9ydCAnZGFydDpodG1sJyBzaG93IFdlYlNvY2tldDsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CisKKy8vLyBBIFtUU29ja2V0XSBiYWNrZWQgYnkgYSBbV2ViU29ja2V0XSBmcm9tIGRhcnQ6aHRtbAorY2xhc3MgVFdlYlNvY2tldCBpbXBsZW1lbnRzIFRTb2NrZXQgeworICBmaW5hbCBVcmkgdXJsOworCisgIGZpbmFsIFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPiBfb25TdGF0ZUNvbnRyb2xsZXI7CisgIFN0cmVhbTxUU29ja2V0U3RhdGU+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+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9SRUFETUUubWQgYi9saWIvZGVscGhpL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc5OWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9SRUFETUUubWQKQEAgLTAsMCArMSwzMCBAQAorVGhyaWZ0IERlbHBoaSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIERlbHBoaQorPT09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBEZWxwaGkgTGlicmFyeSByZXF1aXJlcyBhdCBsZWFzdCBEZWxwaGkgMjAxMC4KKworQmVjYXVzZSB0aGUgTGlicmFyeSBoZWF2aWx5IHJlbGllcyBvbiBnZW5lcmljcywgdXNpbmcgaXQKK3dpdGggZWFybGllciB2ZXJzaW9ucyAoc3VjaCBhcyBEZWxwaGkgNykgd2lsbCAqbm90KiB3b3JrLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvZGVscGhpL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db2xsZWN0aW9ucy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuQ29sbGVjdGlvbnMucGFzCmluZGV4IDY2ZmYxYzAuLmIyMjA2Y2IgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db2xsZWN0aW9ucy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcwpAQCAtMSw2MTcgKzEsNjE5IEBACi0oKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKikNCi0NCi11bml0IFRocmlmdC5Db2xsZWN0aW9uczsNCi0NCi1pbnRlcmZhY2UNCi0NCi11c2VzDQotICBHZW5lcmljcy5Db2xsZWN0aW9ucywgR2VuZXJpY3MuRGVmYXVsdHMsIFRocmlmdC5VdGlsczsNCi0NCi10eXBlDQotDQoteyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfQ0KLSAgVEFycmF5PFQ+ID0gYXJyYXkgb2YgVDsNCi17JElGRU5EfQ0KLQ0KLSAgSVRocmlmdENvbnRhaW5lciA9IGludGVyZmFjZQ0KLSAgICBbJ3s5M0RFRjVBMC1EMTYyLTQ2MUEtQUIyMi01QjRFRTA3MzQwNTB9J10NCi0gICAgZnVuY3Rpb24gVG9TdHJpbmc6IHN0cmluZzsNCi0gIGVuZDsNCi0NCi0gIElUaHJpZnREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQ0KLSAgICBbJ3syNUVERDUwNi1GOUQxLTQwMDgtQTQwRi01OTQwMzY0QjdFNDZ9J10NCi0gICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSxUVmFsdWU+PjsNCi0NCi0gICAgZnVuY3Rpb24gR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOw0KLSAgICBmdW5jdGlvbiBHZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOw0KLSAgICBmdW5jdGlvbiBHZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsNCi0gICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7DQotDQotICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi0gICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBLZXk6IFRLZXkpOw0KLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9DQotICAgIGZ1bmN0aW9uIEV4dHJhY3RQYWlyKGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksVFZhbHVlPjsNCi17JElGRU5EfQ0KLSAgICBwcm9jZWR1cmUgQ2xlYXI7DQotICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOw0KLSAgICBmdW5jdGlvbiBUcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsNCi0gICAgcHJvY2VkdXJlIEFkZE9yU2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi0gICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsNCi0gICAgZnVuY3Rpb24gQ29udGFpbnNWYWx1ZShjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsNCi0gICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksVFZhbHVlPj47DQotDQotICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsNCi0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsNCi0gICAgcHJvcGVydHkgS2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uIHJlYWQgR2V0S2V5czsNCi0gICAgcHJvcGVydHkgVmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbiByZWFkIEdldFZhbHVlczsNCi0gIGVuZDsNCi0NCi0gIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LFRWYWx1ZT4gPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUaHJpZnREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPikNCi0gIHByaXZhdGUNCi0gICAgRkRpY3Rpb25hbHkgOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT47DQotICBwcm90ZWN0ZWQNCi0gICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSxUVmFsdWU+PjsNCi0NCi0gICAgZnVuY3Rpb24gR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOw0KLSAgICBmdW5jdGlvbiBHZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOw0KLSAgICBmdW5jdGlvbiBHZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsNCi0gICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7DQotDQotICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi0gICAgcHJvY2VkdXJlIFJlbW92ZShjb25zdCBLZXk6IFRLZXkpOw0KLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9DQotICAgIGZ1bmN0aW9uIEV4dHJhY3RQYWlyKGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksVFZhbHVlPjsNCi17JElGRU5EfQ0KLSAgICBwcm9jZWR1cmUgQ2xlYXI7DQotICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOw0KLSAgICBmdW5jdGlvbiBUcnlHZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7IG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsNCi0gICAgcHJvY2VkdXJlIEFkZE9yU2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi0gICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsNCi0gICAgZnVuY3Rpb24gQ29udGFpbnNWYWx1ZShjb25zdCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsNCi0gICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksVFZhbHVlPj47DQotICAgIHByb3BlcnR5IEl0ZW1zW2NvbnN0IEtleTogVEtleV06IFRWYWx1ZSByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsNCi0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsNCi0gICAgcHJvcGVydHkgS2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uIHJlYWQgR2V0S2V5czsNCi0gICAgcHJvcGVydHkgVmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbiByZWFkIEdldFZhbHVlczsNCi0gIHB1YmxpYw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUNhcGFjaXR5OiBJbnRlZ2VyID0gMCk7DQotICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7DQotICBlbmQ7DQotDQotICBJVGhyaWZ0TGlzdDxUPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQ0KLSAgICBbJ3syOUJFRUUzMS05Q0I0LTQwMUItQUEwNC01MTQ4QTc1RjQ3M0J9J10NCi0gICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47DQotICAgIGZ1bmN0aW9uIEdldENhcGFjaXR5OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0Q2FwYWNpdHkoVmFsdWU6IEludGVnZXIpOw0KLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsNCi0gICAgcHJvY2VkdXJlIFNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsNCi0gICAgZnVuY3Rpb24gR2V0SXRlbShJbmRleDogSW50ZWdlcik6IFQ7DQotICAgIHByb2NlZHVyZSBTZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7DQotICAgIGZ1bmN0aW9uIEFkZChjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsNCi0gICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7DQotICAgIHByb2NlZHVyZSBBZGRSYW5nZShDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOw0KLSAgICBwcm9jZWR1cmUgSW5zZXJ0KEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7DQotICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7DQotICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsNCi0gICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOw0KLSAgICBmdW5jdGlvbiBSZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgRGVsZXRlKEluZGV4OiBJbnRlZ2VyKTsNCi0gICAgcHJvY2VkdXJlIERlbGV0ZVJhbmdlKEFJbmRleCwgQUNvdW50OiBJbnRlZ2VyKTsNCi0gICAgZnVuY3Rpb24gRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7DQoteyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0NCi0gICAgcHJvY2VkdXJlIEV4Y2hhbmdlKEluZGV4MSwgSW5kZXgyOiBJbnRlZ2VyKTsNCi0gICAgcHJvY2VkdXJlIE1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsNCi0gICAgZnVuY3Rpb24gRmlyc3Q6IFQ7DQotICAgIGZ1bmN0aW9uIExhc3Q6IFQ7DQoteyRJRkVORH0NCi0gICAgcHJvY2VkdXJlIENsZWFyOw0KLSAgICBmdW5jdGlvbiBDb250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47DQotICAgIGZ1bmN0aW9uIEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOw0KLSAgICBmdW5jdGlvbiBMYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBSZXZlcnNlOw0KLSAgICBwcm9jZWR1cmUgU29ydDsgb3ZlcmxvYWQ7DQotICAgIHByb2NlZHVyZSBTb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsgb3ZlcmxvYWQ7DQotICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOyBvdmVybG9hZDsNCi0gICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOyBvdmVybG9hZDsNCi0gICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7DQotICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUPjsNCi0gICAgcHJvcGVydHkgQ2FwYWNpdHk6IEludGVnZXIgcmVhZCBHZXRDYXBhY2l0eSB3cml0ZSBTZXRDYXBhY2l0eTsNCi0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsNCi0gICAgcHJvcGVydHkgSXRlbXNbSW5kZXg6IEludGVnZXJdOiBUIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0Ow0KLSAgZW5kOw0KLQ0KLSAgVFRocmlmdExpc3RJbXBsPFQ+ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0TGlzdDxUPikNCi0gIHByaXZhdGUNCi0gICAgRkxpc3QgOiBUTGlzdDxUPjsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsNCi0gICAgZnVuY3Rpb24gR2V0Q2FwYWNpdHk6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBTZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7DQotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOw0KLSAgICBmdW5jdGlvbiBHZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsNCi0gICAgcHJvY2VkdXJlIFNldEl0ZW0oSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsNCi0gICAgZnVuY3Rpb24gQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsNCi0gICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7IG92ZXJsb2FkOw0KLSAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsNCi0gICAgcHJvY2VkdXJlIEFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7DQotICAgIHByb2NlZHVyZSBJbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsNCi0gICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsNCi0gICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOw0KLSAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7DQotICAgIGZ1bmN0aW9uIFJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBEZWxldGUoSW5kZXg6IEludGVnZXIpOw0KLSAgICBwcm9jZWR1cmUgRGVsZXRlUmFuZ2UoQUluZGV4LCBBQ291bnQ6IEludGVnZXIpOw0KLSAgICBmdW5jdGlvbiBFeHRyYWN0KGNvbnN0IFZhbHVlOiBUKTogVDsNCi17JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQ0KLSAgICBwcm9jZWR1cmUgRXhjaGFuZ2UoSW5kZXgxLCBJbmRleDI6IEludGVnZXIpOw0KLSAgICBwcm9jZWR1cmUgTW92ZShDdXJJbmRleCwgTmV3SW5kZXg6IEludGVnZXIpOw0KLSAgICBmdW5jdGlvbiBGaXJzdDogVDsNCi0gICAgZnVuY3Rpb24gTGFzdDogVDsNCi17JElGRU5EfQ0KLSAgICBwcm9jZWR1cmUgQ2xlYXI7DQotICAgIGZ1bmN0aW9uIENvbnRhaW5zKGNvbnN0IFZhbHVlOiBUKTogQm9vbGVhbjsNCi0gICAgZnVuY3Rpb24gSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7DQotICAgIGZ1bmN0aW9uIExhc3RJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsNCi0gICAgcHJvY2VkdXJlIFJldmVyc2U7DQotICAgIHByb2NlZHVyZSBTb3J0OyBvdmVybG9hZDsNCi0gICAgcHJvY2VkdXJlIFNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOyBvdmVybG9hZDsNCi0gICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcik6IEJvb2xlYW47IG92ZXJsb2FkOw0KLSAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik6IEJvb2xlYW47IG92ZXJsb2FkOw0KLSAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsNCi0gICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFQ+Ow0KLSAgICBwcm9wZXJ0eSBDYXBhY2l0eTogSW50ZWdlciByZWFkIEdldENhcGFjaXR5IHdyaXRlIFNldENhcGFjaXR5Ow0KLSAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50Ow0KLSAgICBwcm9wZXJ0eSBJdGVtc1tJbmRleDogSW50ZWdlcl06IFQgcmVhZCBHZXRJdGVtIHdyaXRlIFNldEl0ZW07IGRlZmF1bHQ7DQotICBwdWJsaWMNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlOw0KLSAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOw0KLSAgZW5kOw0KLQ0KLSAgSUhhc2hTZXQ8VFZhbHVlPiA9IGludGVyZmFjZShJVGhyaWZ0Q29udGFpbmVyKQ0KLSAgICBbJ3swOTIzQTNCNS1ENEQ0LTQ4QTgtOTFBRC00MDIzOEUyRUFENjZ9J10NCi0gICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFZhbHVlPjsNCi0gICAgZnVuY3Rpb24gR2V0SXNSZWFkT25seTogQm9vbGVhbjsNCi0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7DQotICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7DQotICAgIHByb3BlcnR5IElzUmVhZE9ubHk6IEJvb2xlYW4gcmVhZCBHZXRJc1JlYWRPbmx5Ow0KLSAgICBwcm9jZWR1cmUgQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOw0KLSAgICBwcm9jZWR1cmUgQ2xlYXI7DQotICAgIGZ1bmN0aW9uIENvbnRhaW5zKCBjb25zdCBpdGVtOiBUVmFsdWUpOiBCb29sZWFuOw0KLSAgICBwcm9jZWR1cmUgQ29weVRvKHZhciBBOiBUQXJyYXk8VFZhbHVlPjsgYXJyYXlJbmRleDogSW50ZWdlcik7DQotICAgIGZ1bmN0aW9uIFJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlICk6IEJvb2xlYW47DQotICBlbmQ7DQotDQotICBUSGFzaFNldEltcGw8VFZhbHVlPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSUhhc2hTZXQ8VFZhbHVlPikNCi0gIHByaXZhdGUNCi0gICAgRkRpY3Rpb25hcnkgOiBJVGhyaWZ0RGljdGlvbmFyeTxUVmFsdWUsSW50ZWdlcj47DQotICAgIEZJc1JlYWRPbmx5OiBCb29sZWFuOw0KLSAgcHJvdGVjdGVkDQotICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRWYWx1ZT47DQotICAgIGZ1bmN0aW9uIEdldElzUmVhZE9ubHk6IEJvb2xlYW47DQotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOw0KLSAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50Ow0KLSAgICBwcm9wZXJ0eSBJc1JlYWRPbmx5OiBCb29sZWFuIHJlYWQgRklzUmVhZE9ubHk7DQotICAgIHByb2NlZHVyZSBBZGQoIGNvbnN0IGl0ZW06IFRWYWx1ZSk7DQotICAgIHByb2NlZHVyZSBDbGVhcjsNCi0gICAgZnVuY3Rpb24gQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47DQotICAgIHByb2NlZHVyZSBDb3B5VG8odmFyIEE6IFRBcnJheTxUVmFsdWU+OyBhcnJheUluZGV4OiBJbnRlZ2VyKTsNCi0gICAgZnVuY3Rpb24gUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUgKTogQm9vbGVhbjsNCi0gIHB1YmxpYw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7DQotICBlbmQ7DQotDQotaW1wbGVtZW50YXRpb24NCi0NCi17IFRIYXNoU2V0SW1wbDxUVmFsdWU+IH0NCi0NCi1wcm9jZWR1cmUgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOw0KLWJlZ2luDQotICBpZiBub3QgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoaXRlbSkgdGhlbg0KLSAgYmVnaW4NCi0gICAgRkRpY3Rpb25hcnkuQWRkKCBpdGVtLCAwKTsNCi0gIGVuZDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNsZWFyOw0KLWJlZ2luDQotICBGRGljdGlvbmFyeS5DbGVhcjsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQ29udGFpbnMoIGNvbnN0IGl0ZW06IFRWYWx1ZSk6IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db250YWluc0tleShpdGVtKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOw0KLXZhcg0KLSAgaSA6IEludGVnZXI7DQotICBFbnVtbGF0b3IgOiBURW51bWVyYXRvcjxUVmFsdWU+Ow0KLWJlZ2luDQotICBFbnVtbGF0b3IgOj0gR2V0RW51bWVyYXRvcjsNCi0gIHdoaWxlIEVudW1sYXRvci5Nb3ZlTmV4dCBkbw0KLSAgYmVnaW4NCi0gICAgQVthcnJheUluZGV4XSA6PSBFbnVtbGF0b3IuQ3VycmVudDsNCi0gICAgSW5jKGFycmF5SW5kZXgpOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUSGFzaFNldEltcGw8VFZhbHVlPi5DcmVhdGU7DQotYmVnaW4NCi0gIGluaGVyaXRlZDsNCi0gIEZEaWN0aW9uYXJ5IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUVmFsdWUsSW50ZWdlcj4uQ3JlYXRlOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LkNvdW50Ow0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+Ow0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkRpY3Rpb25hcnkuS2V5cy5HZXRFbnVtZXJhdG9yOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRJc1JlYWRPbmx5OiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRklzUmVhZE9ubHk7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LlJlbW92ZSggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZhbHNlOw0KLSAgaWYgRkRpY3Rpb25hcnkuQ29udGFpbnNLZXkoIGl0ZW0gKSB0aGVuDQotICBiZWdpbg0KLSAgICBGRGljdGlvbmFyeS5SZW1vdmUoIGl0ZW0gKTsNCi0gICAgUmVzdWx0IDo9IG5vdCBGRGljdGlvbmFyeS5Db250YWluc0tleSggaXRlbSApOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi17IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+IH0NCi0NCi1wcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQWRkKGNvbnN0IEtleTogVEtleTsNCi0gIGNvbnN0IFZhbHVlOiBUVmFsdWUpOw0KLWJlZ2luDQotICBGRGljdGlvbmFseS5BZGQoIEtleSwgVmFsdWUpOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQWRkT3JTZXRWYWx1ZShjb25zdCBLZXk6IFRLZXk7DQotICBjb25zdCBWYWx1ZTogVFZhbHVlKTsNCi1iZWdpbg0KLSAgRkRpY3Rpb25hbHkuQWRkT3JTZXRWYWx1ZSggS2V5LCBWYWx1ZSk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5DbGVhcjsNCi1iZWdpbg0KLSAgRkRpY3Rpb25hbHkuQ2xlYXI7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNvbnRhaW5zS2V5KA0KLSAgY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvbnRhaW5zS2V5KCBLZXkgKTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ29udGFpbnNWYWx1ZSgNCi0gIGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuQ29udGFpbnNWYWx1ZSggVmFsdWUgKTsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ3JlYXRlKEFDYXBhY2l0eTogSW50ZWdlcik7DQotYmVnaW4NCi0gIEZEaWN0aW9uYWx5IDo9IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5DcmVhdGUoIEFDYXBhY2l0eSApOw0KLWVuZDsNCi0NCi1kZXN0cnVjdG9yIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkRlc3Ryb3k7DQotYmVnaW4NCi0gIEZEaWN0aW9uYWx5LkZyZWU7DQotICBpbmhlcml0ZWQ7DQotZW5kOw0KLQ0KLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9DQotZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uRXh0cmFjdFBhaXIoIGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksIFRWYWx1ZT47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGRGljdGlvbmFseS5FeHRyYWN0UGFpciggS2V5KTsNCi1lbmQ7DQoteyRJRkVORH0NCi0NCi1mdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvdW50Ow0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LCBUVmFsdWU+PjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkdldEVudW1lcmF0b3I7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldEl0ZW0oY29uc3QgS2V5OiBUS2V5KTogVFZhbHVlOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuSXRlbXNbS2V5XTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5US2V5Q29sbGVjdGlvbjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LktleXM7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkdldFZhbHVlczogVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVmFsdWVzOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7DQotYmVnaW4NCi0gIEZEaWN0aW9uYWx5LlJlbW92ZSggS2V5ICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5TZXRJdGVtKGNvbnN0IEtleTogVEtleTsNCi0gIGNvbnN0IFZhbHVlOiBUVmFsdWUpOw0KLWJlZ2luDQotICBGRGljdGlvbmFseS5BZGRPclNldFZhbHVlKCBLZXksIFZhbHVlKTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksIFRWYWx1ZT4+Ow0KLXskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0NCi12YXINCi0gIHggOiBUUGFpcjxUS2V5LCBUVmFsdWU+Ow0KLSAgaSA6IEludGVnZXI7DQoteyRJRkVORH0NCi1iZWdpbg0KLXskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjIuMH0NCi0gIFNldExlbmd0aChSZXN1bHQsIENvdW50KTsNCi0gIGkgOj0gMDsNCi0gIGZvciB4IGluIEZEaWN0aW9uYWx5IGRvDQotICBiZWdpbg0KLSAgICBSZXN1bHRbaV0gOj0geDsNCi0gICAgSW5jKCBpICk7DQotICBlbmQ7DQoteyRFTFNFfQ0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlRvQXJyYXk7DQoteyRJRkVORH0NCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRyaW1FeGNlc3M7DQotYmVnaW4NCi0gIEZEaWN0aW9uYWx5LlRyaW1FeGNlc3M7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LlRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsNCi0gIG91dCBWYWx1ZTogVFZhbHVlKTogQm9vbGVhbjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LlRyeUdldFZhbHVlKCBLZXksIFZhbHVlKTsNCi1lbmQ7DQotDQoteyBUVGhyaWZ0TGlzdEltcGw8VD4gfQ0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGQoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkxpc3QuQWRkKCBWYWx1ZSApOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsNCi1iZWdpbg0KLSAgRkxpc3QuQWRkUmFuZ2UoIENvbGxlY3Rpb24gKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGRSYW5nZShjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7DQotYmVnaW4NCi0gIEZMaXN0LkFkZFJhbmdlKCBDb2xsZWN0aW9uICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsNCi1iZWdpbg0KLSAgRkxpc3QuQWRkUmFuZ2UoIFZhbHVlcyApOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7DQotICBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkxpc3QuQmluYXJ5U2VhcmNoKCBJdGVtLCBJbmRleCk7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5CaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyOw0KLSAgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkxpc3QuQmluYXJ5U2VhcmNoKCBJdGVtLCBJbmRleCwgQUNvbXBhcmVyKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5DbGVhcjsNCi1iZWdpbg0KLSAgRkxpc3QuQ2xlYXI7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5Db250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTGlzdC5Db250YWlucyggVmFsdWUgKTsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFRocmlmdExpc3RJbXBsPFQ+LkNyZWF0ZTsNCi1iZWdpbg0KLSAgRkxpc3QgOj0gVExpc3Q8VD4uQ3JlYXRlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkRlbGV0ZShJbmRleDogSW50ZWdlcik7DQotYmVnaW4NCi0gIEZMaXN0LkRlbGV0ZSggSW5kZXggKQ0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkRlbGV0ZVJhbmdlKEFJbmRleCwgQUNvdW50OiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkxpc3QuRGVsZXRlUmFuZ2UoIEFJbmRleCwgQUNvdW50KQ0KLWVuZDsNCi0NCi1kZXN0cnVjdG9yIFRUaHJpZnRMaXN0SW1wbDxUPi5EZXN0cm95Ow0KLWJlZ2luDQotICBGTGlzdC5GcmVlOw0KLSAgaW5oZXJpdGVkOw0KLWVuZDsNCi0NCi17JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQ0KLXByb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uRXhjaGFuZ2UoSW5kZXgxLCBJbmRleDI6IEludGVnZXIpOw0KLWJlZ2luDQotICBGTGlzdC5FeGNoYW5nZSggSW5kZXgxLCBJbmRleDIgKQ0KLWVuZDsNCi17JElGRU5EfQ0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5FeHRyYWN0KGNvbnN0IFZhbHVlOiBUKTogVDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZMaXN0LkV4dHJhY3QoIFZhbHVlICkNCi1lbmQ7DQotDQoteyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0NCi1mdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uRmlyc3Q6IFQ7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTGlzdC5GaXJzdDsNCi1lbmQ7DQoteyRJRkVORH0NCi0NCi1mdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0Q2FwYWNpdHk6IEludGVnZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTGlzdC5DYXBhY2l0eTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldENvdW50OiBJbnRlZ2VyOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkxpc3QuQ291bnQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZMaXN0LkdldEVudW1lcmF0b3I7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRJdGVtKEluZGV4OiBJbnRlZ2VyKTogVDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZMaXN0W0luZGV4XTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkxpc3QuSW5kZXhPZiggVmFsdWUgKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsNCi1iZWdpbg0KLSAgRkxpc3QuSW5zZXJ0KCBJbmRleCwgVmFsdWUpOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lkluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOw0KLSAgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOw0KLWJlZ2luDQotICBGTGlzdC5JbnNlcnRSYW5nZSggSW5kZXgsIENvbGxlY3Rpb24gKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsNCi0gIGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7DQotYmVnaW4NCi0gIEZMaXN0Lkluc2VydFJhbmdlKCBJbmRleCwgVmFsdWVzKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsNCi0gIGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsNCi1iZWdpbg0KLSAgRkxpc3QuSW5zZXJ0UmFuZ2UoIEluZGV4LCBDb2xsZWN0aW9uICk7DQotZW5kOw0KLQ0KLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9DQotZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+Lkxhc3Q6IFQ7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTGlzdC5MYXN0Ow0KLWVuZDsNCi17JElGRU5EfQ0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5MYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTGlzdC5MYXN0SW5kZXhPZiggVmFsdWUgKTsNCi1lbmQ7DQotDQoteyRJRiBDb21waWxlclZlcnNpb24gPj0gMjEuMH0NCi1wcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lk1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkxpc3QuTW92ZSggQ3VySW5kZXgsICBOZXdJbmRleCk7DQotZW5kOw0KLXskSUZFTkR9DQotDQotZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LlJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTGlzdC5SZW1vdmUoIFZhbHVlICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uUmV2ZXJzZTsNCi1iZWdpbg0KLSAgRkxpc3QuUmV2ZXJzZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5TZXRDYXBhY2l0eShWYWx1ZTogSW50ZWdlcik7DQotYmVnaW4NCi0gIEZMaXN0LkNhcGFjaXR5IDo9IFZhbHVlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkxpc3QuQ291bnQgOj0gVmFsdWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU2V0SXRlbShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOw0KLWJlZ2luDQotICBGTGlzdFtJbmRleF0gOj0gVmFsdWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uU29ydDsNCi1iZWdpbg0KLSAgRkxpc3QuU29ydDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Tb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsNCi1iZWdpbg0KLSAgRkxpc3QuU29ydDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LlRvQXJyYXk6IFRBcnJheTxUPjsNCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9DQotdmFyDQotICB4IDogVDsNCi0gIGkgOiBJbnRlZ2VyOw0KLXskSUZFTkR9DQotYmVnaW4NCi17JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9DQotICBTZXRMZW5ndGgoUmVzdWx0LCBDb3VudCk7DQotICBpIDo9IDA7DQotICBmb3IgeCBpbiBGTGlzdCBkbw0KLSAgYmVnaW4NCi0gICAgUmVzdWx0W2ldIDo9IHg7DQotICAgIEluYyggaSApOw0KLSAgZW5kOw0KLXskRUxTRX0NCi0gIFJlc3VsdCA6PSBGTGlzdC5Ub0FycmF5Ow0KLXskSUZFTkR9DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uVHJpbUV4Y2VzczsNCi1iZWdpbg0KLSAgRkxpc3QuVHJpbUV4Y2VzczsNCi1lbmQ7DQotDQotZW5kLg0KKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK2ludGVyZmFjZQorCit1c2VzCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBHZW5lcmljcy5EZWZhdWx0cywgVGhyaWZ0LlV0aWxzOworCit0eXBlCisKK3skSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0KKyAgVEFycmF5PFQ+ID0gYXJyYXkgb2YgVDsKK3skSUZFTkR9CisKKyAgSVRocmlmdENvbnRhaW5lciA9IGludGVyZmFjZQorICAgIFsnezkzREVGNUEwLUQxNjItNDYxQS1BQjIyLTVCNEVFMDczNDA1MH0nXQorICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7CisgIGVuZDsKKworICBJVGhyaWZ0RGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4gPSBpbnRlcmZhY2UoSVRocmlmdENvbnRhaW5lcikKKyAgICBbJ3syNUVERDUwNi1GOUQxLTQwMDgtQTQwRi01OTQwMzY0QjdFNDZ9J10KKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUUGFpcjxUS2V5LFRWYWx1ZT4+OworCisgICAgZnVuY3Rpb24gR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uOworICAgIGZ1bmN0aW9uIEdldFZhbHVlczogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRWYWx1ZUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBBZGQoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBwcm9jZWR1cmUgUmVtb3ZlKGNvbnN0IEtleTogVEtleSk7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIGZ1bmN0aW9uIEV4dHJhY3RQYWlyKGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksVFZhbHVlPjsKK3skSUZFTkR9CisgICAgcHJvY2VkdXJlIENsZWFyOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRyeUdldFZhbHVlKGNvbnN0IEtleTogVEtleTsgb3V0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBBZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CisgICAgZnVuY3Rpb24gQ29udGFpbnNLZXkoY29uc3QgS2V5OiBUS2V5KTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBDb250YWluc1ZhbHVlKGNvbnN0IFZhbHVlOiBUVmFsdWUpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUUGFpcjxUS2V5LFRWYWx1ZT4+OworCisgICAgcHJvcGVydHkgSXRlbXNbY29uc3QgS2V5OiBUS2V5XTogVFZhbHVlIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgS2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uIHJlYWQgR2V0S2V5czsKKyAgICBwcm9wZXJ0eSBWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uIHJlYWQgR2V0VmFsdWVzOworICBlbmQ7CisKKyAgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksVFZhbHVlPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdERpY3Rpb25hcnk8VEtleSxUVmFsdWU+KQorICBwcml2YXRlCisgICAgRkRpY3Rpb25hbHkgOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT47CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRQYWlyPFRLZXksVFZhbHVlPj47CisKKyAgICBmdW5jdGlvbiBHZXRLZXlzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVEtleUNvbGxlY3Rpb247CisgICAgZnVuY3Rpb24gR2V0VmFsdWVzOiBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbjsKKyAgICBmdW5jdGlvbiBHZXRJdGVtKGNvbnN0IEtleTogVEtleSk6IFRWYWx1ZTsKKyAgICBwcm9jZWR1cmUgU2V0SXRlbShjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworCisgICAgcHJvY2VkdXJlIEFkZChjb25zdCBLZXk6IFRLZXk7IGNvbnN0IFZhbHVlOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBSZW1vdmUoY29uc3QgS2V5OiBUS2V5KTsKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgZnVuY3Rpb24gRXh0cmFjdFBhaXIoY29uc3QgS2V5OiBUS2V5KTogVFBhaXI8VEtleSxUVmFsdWU+OworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgcHJvY2VkdXJlIFRyaW1FeGNlc3M7CisgICAgZnVuY3Rpb24gVHJ5R2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBvdXQgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgcHJvY2VkdXJlIEFkZE9yU2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OyBjb25zdCBWYWx1ZTogVFZhbHVlKTsKKyAgICBmdW5jdGlvbiBDb250YWluc0tleShjb25zdCBLZXk6IFRLZXkpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIENvbnRhaW5zVmFsdWUoY29uc3QgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksVFZhbHVlPj47CisgICAgcHJvcGVydHkgSXRlbXNbY29uc3QgS2V5OiBUS2V5XTogVFZhbHVlIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQ7CisgICAgcHJvcGVydHkgS2V5czogVERpY3Rpb25hcnk8VEtleSxUVmFsdWU+LlRLZXlDb2xsZWN0aW9uIHJlYWQgR2V0S2V5czsKKyAgICBwcm9wZXJ0eSBWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksVFZhbHVlPi5UVmFsdWVDb2xsZWN0aW9uIHJlYWQgR2V0VmFsdWVzOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUNhcGFjaXR5OiBJbnRlZ2VyID0gMCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElUaHJpZnRMaXN0PFQ+ID0gaW50ZXJmYWNlKElUaHJpZnRDb250YWluZXIpCisgICAgWyd7MjlCRUVFMzEtOUNCNC00MDFCLUFBMDQtNTE0OEE3NUY0NzNCfSddCisgICAgZnVuY3Rpb24gR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VD47CisgICAgZnVuY3Rpb24gR2V0Q2FwYWNpdHk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q291bnQoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldEl0ZW0oSW5kZXg6IEludGVnZXIpOiBUOworICAgIHByb2NlZHVyZSBTZXRJdGVtKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgZnVuY3Rpb24gQWRkKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEFkZFJhbmdlKENvbGxlY3Rpb246IFRFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydChJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWU6IFQpOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBJRW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBJbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZW1vdmUoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBEZWxldGUoSW5kZXg6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBEZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7Cit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorICAgIHByb2NlZHVyZSBFeGNoYW5nZShJbmRleDEsIEluZGV4MjogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIE1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBGaXJzdDogVDsKKyAgICBmdW5jdGlvbiBMYXN0OiBUOworeyRJRkVORH0KKyAgICBwcm9jZWR1cmUgQ2xlYXI7CisgICAgZnVuY3Rpb24gQ29udGFpbnMoY29uc3QgVmFsdWU6IFQpOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIExhc3RJbmRleE9mKGNvbnN0IFZhbHVlOiBUKTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgUmV2ZXJzZTsKKyAgICBwcm9jZWR1cmUgU29ydDsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFNvcnQoY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyKTogQm9vbGVhbjsgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgVHJpbUV4Y2VzczsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQXJyYXk8VD47CisgICAgcHJvcGVydHkgQ2FwYWNpdHk6IEludGVnZXIgcmVhZCBHZXRDYXBhY2l0eSB3cml0ZSBTZXRDYXBhY2l0eTsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50OworICAgIHByb3BlcnR5IEl0ZW1zW0luZGV4OiBJbnRlZ2VyXTogVCByZWFkIEdldEl0ZW0gd3JpdGUgU2V0SXRlbTsgZGVmYXVsdDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0SW1wbDxUPiA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdExpc3Q8VD4pCisgIHByaXZhdGUKKyAgICBGTGlzdCA6IFRMaXN0PFQ+OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsKKyAgICBmdW5jdGlvbiBHZXRDYXBhY2l0eTogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0Q2FwYWNpdHkoVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb3VudChWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0SXRlbShJbmRleDogSW50ZWdlcik6IFQ7CisgICAgcHJvY2VkdXJlIFNldEl0ZW0oSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKKyAgICBmdW5jdGlvbiBBZGQoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBBZGRSYW5nZShjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoY29uc3QgQ29sbGVjdGlvbjogSUVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgQWRkUmFuZ2UoQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0KEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZTogVCk7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBWYWx1ZXM6IGFycmF5IG9mIFQpOyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7IGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEluc2VydFJhbmdlKEluZGV4OiBJbnRlZ2VyOyBjb25zdCBDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIERlbGV0ZShJbmRleDogSW50ZWdlcik7CisgICAgcHJvY2VkdXJlIERlbGV0ZVJhbmdlKEFJbmRleCwgQUNvdW50OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBFeHRyYWN0KGNvbnN0IFZhbHVlOiBUKTogVDsKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgICAgcHJvY2VkdXJlIEV4Y2hhbmdlKEluZGV4MSwgSW5kZXgyOiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgTW92ZShDdXJJbmRleCwgTmV3SW5kZXg6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEZpcnN0OiBUOworICAgIGZ1bmN0aW9uIExhc3Q6IFQ7Cit7JElGRU5EfQorICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyhjb25zdCBWYWx1ZTogVCk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gTGFzdEluZGV4T2YoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBSZXZlcnNlOworICAgIHByb2NlZHVyZSBTb3J0OyBvdmVybG9hZDsKKyAgICBwcm9jZWR1cmUgU29ydChjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIEJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOyBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBCaW5hcnlTZWFyY2goY29uc3QgSXRlbTogVDsgb3V0IEluZGV4OiBJbnRlZ2VyOyBjb25zdCBBQ29tcGFyZXI6IElDb21wYXJlcjxUPik6IEJvb2xlYW47IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBUcmltRXhjZXNzOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRBcnJheTxUPjsKKyAgICBwcm9wZXJ0eSBDYXBhY2l0eTogSW50ZWdlciByZWFkIEdldENhcGFjaXR5IHdyaXRlIFNldENhcGFjaXR5OworICAgIHByb3BlcnR5IENvdW50OiBJbnRlZ2VyIHJlYWQgR2V0Q291bnQgd3JpdGUgU2V0Q291bnQ7CisgICAgcHJvcGVydHkgSXRlbXNbSW5kZXg6IEludGVnZXJdOiBUIHJlYWQgR2V0SXRlbSB3cml0ZSBTZXRJdGVtOyBkZWZhdWx0OworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElIYXNoU2V0PFRWYWx1ZT4gPSBpbnRlcmZhY2UoSVRocmlmdENvbnRhaW5lcikKKyAgICBbJ3swOTIzQTNCNS1ENEQ0LTQ4QTgtOTFBRC00MDIzOEUyRUFENjZ9J10KKyAgICBmdW5jdGlvbiBHZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+OworICAgIGZ1bmN0aW9uIEdldElzUmVhZE9ubHk6IEJvb2xlYW47CisgICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7CisgICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudDsKKyAgICBwcm9wZXJ0eSBJc1JlYWRPbmx5OiBCb29sZWFuIHJlYWQgR2V0SXNSZWFkT25seTsKKyAgICBwcm9jZWR1cmUgQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQ29weVRvKHZhciBBOiBUQXJyYXk8VFZhbHVlPjsgYXJyYXlJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUgKTogQm9vbGVhbjsKKyAgZW5kOworCisgIFRIYXNoU2V0SW1wbDxUVmFsdWU+ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJSGFzaFNldDxUVmFsdWU+KQorICBwcml2YXRlCisgICAgRkRpY3Rpb25hcnkgOiBJVGhyaWZ0RGljdGlvbmFyeTxUVmFsdWUsSW50ZWdlcj47CisgICAgRklzUmVhZE9ubHk6IEJvb2xlYW47CisgIHByb3RlY3RlZAorICAgIGZ1bmN0aW9uIEdldEVudW1lcmF0b3I6IFRFbnVtZXJhdG9yPFRWYWx1ZT47CisgICAgZnVuY3Rpb24gR2V0SXNSZWFkT25seTogQm9vbGVhbjsKKyAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKKyAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50OworICAgIHByb3BlcnR5IElzUmVhZE9ubHk6IEJvb2xlYW4gcmVhZCBGSXNSZWFkT25seTsKKyAgICBwcm9jZWR1cmUgQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOworICAgIHByb2NlZHVyZSBDbGVhcjsKKyAgICBmdW5jdGlvbiBDb250YWlucyggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKKyAgICBwcm9jZWR1cmUgQ29weVRvKHZhciBBOiBUQXJyYXk8VFZhbHVlPjsgYXJyYXlJbmRleDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUgKTogQm9vbGVhbjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEhhc2hTZXRJbXBsPFRWYWx1ZT4gfQorCitwcm9jZWR1cmUgVEhhc2hTZXRJbXBsPFRWYWx1ZT4uQWRkKCBjb25zdCBpdGVtOiBUVmFsdWUpOworYmVnaW4KKyAgaWYgbm90IEZEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KGl0ZW0pIHRoZW4KKyAgYmVnaW4KKyAgICBGRGljdGlvbmFyeS5BZGQoIGl0ZW0sIDApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSGFzaFNldEltcGw8VFZhbHVlPi5DbGVhcjsKK2JlZ2luCisgIEZEaWN0aW9uYXJ5LkNsZWFyOworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5Db250YWlucyggY29uc3QgaXRlbTogVFZhbHVlKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFyeS5Db250YWluc0tleShpdGVtKTsKK2VuZDsKKworcHJvY2VkdXJlIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNvcHlUbyh2YXIgQTogVEFycmF5PFRWYWx1ZT47IGFycmF5SW5kZXg6IEludGVnZXIpOwordmFyCisgIGkgOiBJbnRlZ2VyOworICBFbnVtbGF0b3IgOiBURW51bWVyYXRvcjxUVmFsdWU+OworYmVnaW4KKyAgRW51bWxhdG9yIDo9IEdldEVudW1lcmF0b3I7CisgIHdoaWxlIEVudW1sYXRvci5Nb3ZlTmV4dCBkbworICBiZWdpbgorICAgIEFbYXJyYXlJbmRleF0gOj0gRW51bWxhdG9yLkN1cnJlbnQ7CisgICAgSW5jKGFycmF5SW5kZXgpOworICBlbmQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgRkRpY3Rpb25hcnkgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRWYWx1ZSxJbnRlZ2VyPi5DcmVhdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIYXNoU2V0SW1wbDxUVmFsdWU+LkdldENvdW50OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LkNvdW50OworZW5kOworCitmdW5jdGlvbiBUSGFzaFNldEltcGw8VFZhbHVlPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUVmFsdWU+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYXJ5LktleXMuR2V0RW51bWVyYXRvcjsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uR2V0SXNSZWFkT25seTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGSXNSZWFkT25seTsKK2VuZDsKKworZnVuY3Rpb24gVEhhc2hTZXRJbXBsPFRWYWx1ZT4uUmVtb3ZlKCBjb25zdCBpdGVtOiBUVmFsdWUpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZhbHNlOworICBpZiBGRGljdGlvbmFyeS5Db250YWluc0tleSggaXRlbSApIHRoZW4KKyAgYmVnaW4KKyAgICBGRGljdGlvbmFyeS5SZW1vdmUoIGl0ZW0gKTsKKyAgICBSZXN1bHQgOj0gbm90IEZEaWN0aW9uYXJ5LkNvbnRhaW5zS2V5KCBpdGVtICk7CisgIGVuZDsKK2VuZDsKKworeyBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPiB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5BZGQoY29uc3QgS2V5OiBUS2V5OworICBjb25zdCBWYWx1ZTogVFZhbHVlKTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LkFkZCggS2V5LCBWYWx1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5BZGRPclNldFZhbHVlKGNvbnN0IEtleTogVEtleTsKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGRGljdGlvbmFseS5BZGRPclNldFZhbHVlKCBLZXksIFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNsZWFyOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuQ2xlYXI7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUS2V5LCBUVmFsdWU+LkNvbnRhaW5zS2V5KAorICBjb25zdCBLZXk6IFRLZXkpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZEaWN0aW9uYWx5LkNvbnRhaW5zS2V5KCBLZXkgKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ29udGFpbnNWYWx1ZSgKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuQ29udGFpbnNWYWx1ZSggVmFsdWUgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uQ3JlYXRlKEFDYXBhY2l0eTogSW50ZWdlcik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGRGljdGlvbmFseSA6PSBURGljdGlvbmFyeTxUS2V5LFRWYWx1ZT4uQ3JlYXRlKCBBQ2FwYWNpdHkgKTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5EZXN0cm95OworYmVnaW4KKyAgRkRpY3Rpb25hbHkuRnJlZTsKKyAgaW5oZXJpdGVkOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uRXh0cmFjdFBhaXIoIGNvbnN0IEtleTogVEtleSk6IFRQYWlyPFRLZXksIFRWYWx1ZT47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuRXh0cmFjdFBhaXIoIEtleSk7CitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRDb3VudDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5Db3VudDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0RW51bWVyYXRvcjogVEVudW1lcmF0b3I8VFBhaXI8VEtleSwgVFZhbHVlPj47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuR2V0RW51bWVyYXRvcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0SXRlbShjb25zdCBLZXk6IFRLZXkpOiBUVmFsdWU7CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuSXRlbXNbS2V5XTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uR2V0S2V5czogVERpY3Rpb25hcnk8VEtleSwgVFZhbHVlPi5US2V5Q29sbGVjdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5LZXlzOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5HZXRWYWx1ZXM6IFREaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4uVFZhbHVlQ29sbGVjdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGRGljdGlvbmFseS5WYWx1ZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5SZW1vdmUoY29uc3QgS2V5OiBUS2V5KTsKK2JlZ2luCisgIEZEaWN0aW9uYWx5LlJlbW92ZSggS2V5ICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5TZXRJdGVtKGNvbnN0IEtleTogVEtleTsKKyAgY29uc3QgVmFsdWU6IFRWYWx1ZSk7CitiZWdpbgorICBGRGljdGlvbmFseS5BZGRPclNldFZhbHVlKCBLZXksIFZhbHVlKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVG9BcnJheTogVEFycmF5PFRQYWlyPFRLZXksIFRWYWx1ZT4+OworeyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQordmFyCisgIHggOiBUUGFpcjxUS2V5LCBUVmFsdWU+OworICBpIDogSW50ZWdlcjsKK3skSUZFTkR9CitiZWdpbgoreyRJRiBDb21waWxlclZlcnNpb24gPCAyMi4wfQorICBTZXRMZW5ndGgoUmVzdWx0LCBDb3VudCk7CisgIGkgOj0gMDsKKyAgZm9yIHggaW4gRkRpY3Rpb25hbHkgZG8KKyAgYmVnaW4KKyAgICBSZXN1bHRbaV0gOj0geDsKKyAgICBJbmMoIGkgKTsKKyAgZW5kOworeyRFTFNFfQorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVG9BcnJheTsKK3skSUZFTkR9CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VEtleSwgVFZhbHVlPi5UcmltRXhjZXNzOworYmVnaW4KKyAgRkRpY3Rpb25hbHkuVHJpbUV4Y2VzczsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdERpY3Rpb25hcnlJbXBsPFRLZXksIFRWYWx1ZT4uVHJ5R2V0VmFsdWUoY29uc3QgS2V5OiBUS2V5OworICBvdXQgVmFsdWU6IFRWYWx1ZSk6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRkRpY3Rpb25hbHkuVHJ5R2V0VmFsdWUoIEtleSwgVmFsdWUpOworZW5kOworCit7IFRUaHJpZnRMaXN0SW1wbDxUPiB9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGQoY29uc3QgVmFsdWU6IFQpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkFkZCggVmFsdWUgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5BZGRSYW5nZShDb2xsZWN0aW9uOiBURW51bWVyYWJsZTxUPik7CitiZWdpbgorICBGTGlzdC5BZGRSYW5nZSggQ29sbGVjdGlvbiApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkFkZFJhbmdlKGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0LkFkZFJhbmdlKCBDb2xsZWN0aW9uICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQWRkUmFuZ2UoY29uc3QgVmFsdWVzOiBhcnJheSBvZiBUKTsKK2JlZ2luCisgIEZMaXN0LkFkZFJhbmdlKCBWYWx1ZXMgKTsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkJpbmFyeVNlYXJjaChjb25zdCBJdGVtOiBUOworICBvdXQgSW5kZXg6IEludGVnZXIpOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkJpbmFyeVNlYXJjaCggSXRlbSwgSW5kZXgpOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uQmluYXJ5U2VhcmNoKGNvbnN0IEl0ZW06IFQ7IG91dCBJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgQUNvbXBhcmVyOiBJQ29tcGFyZXI8VD4pOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkJpbmFyeVNlYXJjaCggSXRlbSwgSW5kZXgsIEFDb21wYXJlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uQ2xlYXI7CitiZWdpbgorICBGTGlzdC5DbGVhcjsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkNvbnRhaW5zKGNvbnN0IFZhbHVlOiBUKTogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5Db250YWlucyggVmFsdWUgKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFRocmlmdExpc3RJbXBsPFQ+LkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgRkxpc3QgOj0gVExpc3Q8VD4uQ3JlYXRlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkRlbGV0ZShJbmRleDogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5EZWxldGUoIEluZGV4ICkKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5EZWxldGVSYW5nZShBSW5kZXgsIEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICBGTGlzdC5EZWxldGVSYW5nZSggQUluZGV4LCBBQ291bnQpCitlbmQ7CisKK2Rlc3RydWN0b3IgVFRocmlmdExpc3RJbXBsPFQ+LkRlc3Ryb3k7CitiZWdpbgorICBGTGlzdC5GcmVlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9Citwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LkV4Y2hhbmdlKEluZGV4MSwgSW5kZXgyOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkV4Y2hhbmdlKCBJbmRleDEsIEluZGV4MiApCitlbmQ7Cit7JElGRU5EfQorCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uRXh0cmFjdChjb25zdCBWYWx1ZTogVCk6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuRXh0cmFjdCggVmFsdWUgKQorZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkZpcnN0OiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkZpcnN0OworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LkdldENhcGFjaXR5OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZMaXN0LkNhcGFjaXR5OworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0Q291bnQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuQ291bnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5HZXRFbnVtZXJhdG9yOiBURW51bWVyYXRvcjxUPjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGTGlzdC5HZXRFbnVtZXJhdG9yOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uR2V0SXRlbShJbmRleDogSW50ZWdlcik6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3RbSW5kZXhdOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0TGlzdEltcGw8VD4uSW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuSW5kZXhPZiggVmFsdWUgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnQoSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydCggSW5kZXgsIFZhbHVlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5JbnNlcnRSYW5nZShJbmRleDogSW50ZWdlcjsKKyAgY29uc3QgQ29sbGVjdGlvbjogVEVudW1lcmFibGU8VD4pOworYmVnaW4KKyAgRkxpc3QuSW5zZXJ0UmFuZ2UoIEluZGV4LCBDb2xsZWN0aW9uICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IFZhbHVlczogYXJyYXkgb2YgVCk7CitiZWdpbgorICBGTGlzdC5JbnNlcnRSYW5nZSggSW5kZXgsIFZhbHVlcyk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0TGlzdEltcGw8VD4uSW5zZXJ0UmFuZ2UoSW5kZXg6IEludGVnZXI7CisgIGNvbnN0IENvbGxlY3Rpb246IElFbnVtZXJhYmxlPFQ+KTsKK2JlZ2luCisgIEZMaXN0Lkluc2VydFJhbmdlKCBJbmRleCwgQ29sbGVjdGlvbiApOworZW5kOworCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQorZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+Lkxhc3Q6IFQ7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuTGFzdDsKK2VuZDsKK3skSUZFTkR9CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5MYXN0SW5kZXhPZihjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuTGFzdEluZGV4T2YoIFZhbHVlICk7CitlbmQ7CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9Citwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+Lk1vdmUoQ3VySW5kZXgsIE5ld0luZGV4OiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0Lk1vdmUoIEN1ckluZGV4LCAgTmV3SW5kZXgpOworZW5kOworeyRJRkVORH0KKworZnVuY3Rpb24gVFRocmlmdExpc3RJbXBsPFQ+LlJlbW92ZShjb25zdCBWYWx1ZTogVCk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkxpc3QuUmVtb3ZlKCBWYWx1ZSApOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlJldmVyc2U7CitiZWdpbgorICBGTGlzdC5SZXZlcnNlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldENhcGFjaXR5KFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkNhcGFjaXR5IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZMaXN0LkNvdW50IDo9IFZhbHVlOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdExpc3RJbXBsPFQ+LlNldEl0ZW0oSW5kZXg6IEludGVnZXI7IGNvbnN0IFZhbHVlOiBUKTsKK2JlZ2luCisgIEZMaXN0W0luZGV4XSA6PSBWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Tb3J0OworYmVnaW4KKyAgRkxpc3QuU29ydDsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5Tb3J0KGNvbnN0IEFDb21wYXJlcjogSUNvbXBhcmVyPFQ+KTsKK2JlZ2luCisgIEZMaXN0LlNvcnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRMaXN0SW1wbDxUPi5Ub0FycmF5OiBUQXJyYXk8VD47Cit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9Cit2YXIKKyAgeCA6IFQ7CisgIGkgOiBJbnRlZ2VyOworeyRJRkVORH0KK2JlZ2luCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIyLjB9CisgIFNldExlbmd0aChSZXN1bHQsIENvdW50KTsKKyAgaSA6PSAwOworICBmb3IgeCBpbiBGTGlzdCBkbworICBiZWdpbgorICAgIFJlc3VsdFtpXSA6PSB4OworICAgIEluYyggaSApOworICBlbmQ7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSBGTGlzdC5Ub0FycmF5OworeyRJRkVORH0KK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRMaXN0SW1wbDxUPi5UcmltRXhjZXNzOworYmVnaW4KKyAgRkxpc3QuVHJpbUV4Y2VzczsKK2VuZDsKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjRlZmMzLi4wMDAwMDAwCi0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db25zb2xlLnBhcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0oKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKikNCi0NCi11bml0IFRocmlmdC5Db25zb2xlOw0KLQ0KLWludGVyZmFjZQ0KLQ0KLXVzZXMNCi0gIFN0ZEN0cmxzOw0KLQ0KLXR5cGUNCi0gIFRUaHJpZnRDb25zb2xlID0gY2xhc3MNCi0gIHB1YmxpYw0KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7DQotICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7DQotICBlbmQ7DQotDQotICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApDQotICBwcml2YXRlDQotICAgIEZMaW5lQnJlYWsgOiBCb29sZWFuOw0KLSAgICBGTWVtbyA6IFRNZW1vOw0KLQ0KLSAgICBwcm9jZWR1cmUgSW50ZXJuYWxXcml0ZSggY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsNCi0gIHB1YmxpYw0KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVE1lbW8pOw0KLSAgZW5kOw0KLQ0KLWZ1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOw0KLXByb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsNCi1wcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7DQotDQotaW1wbGVtZW50YXRpb24NCi0NCi12YXINCi0gIEZEZWZhdWx0Q29uc29sZSA6IFRUaHJpZnRDb25zb2xlOw0KLSAgRkNvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsNCi0NCi1mdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZDb25zb2xlOw0KLWVuZDsNCi0NCi17IFRUaHJpZnRDb25zb2xlIH0NCi0NCi1wcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsNCi1iZWdpbg0KLSAgU3lzdGVtLldyaXRlKCBTICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsNCi1iZWdpbg0KLSAgU3lzdGVtLldyaXRlbG4oIFMgKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOw0KLWJlZ2luDQotICBGQ29uc29sZSA6PSBBQ29uc29sZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0Ow0KLWJlZ2luDQotICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7DQotZW5kOw0KLQ0KLXsgVEdVSUNvbnNvbGUgfQ0KLQ0KLWNvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRNZW1vKTsNCi1iZWdpbg0KLSAgRk1lbW8gOj0gQU1lbW87DQotICBGTGluZUJyZWFrIDo9IFRydWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7DQotdmFyDQotICBpZHggOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBpZiBGTGluZUJyZWFrIHRoZW4NCi0gIGJlZ2luDQotICAgIEZNZW1vLkxpbmVzLkFkZCggUyApOw0KLSAgZW5kIGVsc2UNCi0gIGJlZ2luDQotICAgIGlkeCA6PSBGTWVtby5MaW5lcy5Db3VudCAtIDE7DQotICAgIGlmIGlkeCA8IDAgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIEZNZW1vLkxpbmVzLkFkZCggUyApOw0KLSAgICBlbmQ7DQotICAgIEZNZW1vLkxpbmVzW2lkeF0gOj0gRk1lbW8uTGluZXNbaWR4XSArIFM7DQotICBlbmQ7DQotICBGTGluZUJyZWFrIDo9IGJXcml0ZUxpbmU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOw0KLWJlZ2luDQotICBJbnRlcm5hbFdyaXRlKCBTLCBGYWxzZSk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsNCi1iZWdpbg0KLSAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7DQotZW5kOw0KLQ0KLWluaXRpYWxpemF0aW9uDQotYmVnaW4NCi0gIEZEZWZhdWx0Q29uc29sZSA6PSBUVGhyaWZ0Q29uc29sZS5DcmVhdGU7DQotICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7DQotZW5kOw0KLQ0KLWZpbmFsaXphdGlvbg0KLWJlZ2luDQotICBGRGVmYXVsdENvbnNvbGUuRnJlZTsNCi1lbmQ7DQotDQotZW5kLg0KLQ0KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5EZWZpbmVzLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTljY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkRlZmluZXMuaW5jCkBAIC0wLDAgKzEsNTAgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworCisvLyBHb29kIGxpc3RzIG9mIERlbHBoaSB2ZXJzaW9uIG51bWJlcnMKKy8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZWN0LWplZGkvamVkaS9ibG9iL21hc3Rlci9qZWRpLmluYworLy8gaHR0cDovL2RvY3dpa2kuZW1iYXJjYWRlcm8uY29tL1JBRFN0dWRpby9TZWF0dGxlL2VuL0NvbXBpbGVyX1ZlcnNpb25zCisKKworLy8gc3RhcnQgd2l0aCBtb3N0IGJhY2t3YXJkcyBjb21wYXRpYmxlIGRlZmF1bHRzCisKK3skREVGSU5FIE9MRF9VTklUX05BTUVTfQoreyRERUZJTkUgT0xEX1NPQ0tFVFN9ICAgICAgLy8gVE9ETzogYWRkIHNvY2tldCBzdXBwb3J0IGZvciBDb21waWxlclZlcnNpb24gPj0gMjguMAoreyRVTkRFRiBIQVZFX0NMQVNTX0NUT1J9CisKKworLy8gZW5hYmxlIGZlYXR1cmVzIGFzIHRoZXkgYXJlIGF2YWlsYWJsZQorCit7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfSAgIC8vIERlbHBoaSAyMDEwCisgIHskREVGSU5FIEhBVkVfQ0xBU1NfQ1RPUn0KK3skSUZFTkR9CisKK3skSUYgQ29tcGlsZXJWZXJzaW9uID49IDIzLjB9ICAgLy8gRGVscGhpIFhFMgorICB7JFVOREVGIE9MRF9VTklUX05BTUVTfQoreyRJRkVORH0KKworeyRJRiBDb21waWxlclZlcnNpb24gPj0gMjguMH0gICAvLyBEZWxwaGkgWEU3CisgIHskVU5ERUYgT0xEX1NPQ0tFVFN9Cit7JElGRU5EfQorCisKKy8vIEVPRgorCisKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkV4Y2VwdGlvbi5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxNWMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCkBAIC0wLDAgKzEsNjIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKworeyRTQ09QRURFTlVNUyBPTn0KKwordW5pdCBUaHJpZnQuRXhjZXB0aW9uOworCitpbnRlcmZhY2UKKwordXNlcworICBDbGFzc2VzLCBTeXNVdGlsczsKKwordHlwZQorICAvLyBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMKKyAgVEV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24pCisgIHB1YmxpYworICAgIGZ1bmN0aW9uIE1lc3NhZ2UgOiBzdHJpbmc7ICAgICAgICAvLyBoaWRlIGluaGVyaXRlZCBwcm9wZXJ0eTogYWxsb3cgcmVhZCwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKyAgICBwcm9jZWR1cmUgVXBkYXRlTWVzc2FnZVByb3BlcnR5OyAgLy8gdXBkYXRlIGluaGVyaXRlZCBtZXNzYWdlIHByb3BlcnR5IHdpdGggdG9TdHJpbmcoKQorICBlbmQ7CisKKworCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRFeGNlcHRpb24uTWVzc2FnZTsKKy8vIGFsbG93IHJlYWQgKGV4Y2VwdGlvbiBzdW1tYXJ5KSwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKKy8vIHJlYWQgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiBzdW1tYXJ5CitiZWdpbgorICByZXN1bHQgOj0gU2VsZi5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRFeGNlcHRpb24uVXBkYXRlTWVzc2FnZVByb3BlcnR5OworLy8gVXBkYXRlIHRoZSBpbmhlcml0ZWQgTWVzc2FnZSBwcm9wZXJ0eSB0byBiZXR0ZXIgY29uZm9ybSB0byBzdGFuZGFyZCBiZWhhdmlvdXIuCisvLyBOaWNlIGJlbmVmaXQ6IFRoZSBJREUgaXMgbm93IGFibGUgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYWdhaW4uCitiZWdpbgorICBpbmhlcml0ZWQgTWVzc2FnZSA6PSBTZWxmLlRvU3RyaW5nOyAgLy8gcHJvZHVjZXMgYSBzdW1tYXJ5IHRleHQKK2VuZDsKKworCisKKworZW5kLgorCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmMjNkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcwpAQCAtMCwwICsxLDIzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4OworCisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXg7CisKK3sgVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZyBhIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgIFRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsIHByb2Nlc3NvcnMgd2l0aCBpdCwKKyAgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisKKyAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKworICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgICAgICAiQ2FsY3VsYXRvciIsCisgICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKworICAgICBwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgICAgICAgICBuZXcgV2VhdGhlclJlcG9ydC5Qcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKKworICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAgVFNpbXBsZVNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHQpOworCisgICAgIHNlcnZlci5zZXJ2ZSgpOworfQorCisKK3R5cGUKKyAgSU11bHRpcGxleGVkUHJvY2Vzc29yID0gaW50ZXJmYWNlKCBJUHJvY2Vzc29yKQorICAgIFsnezgwN0Y5RDE5LTZDRjQtNDc4OS04NDBFLTkzRTg3QTEyRUI2M30nXQorICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdXMKKyAgICAvLyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZSBuYW1lCisgICAgLy8gdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgIHByb2NlZHVyZSBSZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4gPSBGQUxTRSk7CisgIGVuZDsKKworCisgIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNdWx0aXBsZXhlZFByb2Nlc3NvciwgSVByb2Nlc3NvcikKKyAgcHJpdmF0ZSB0eXBlCisgICAgLy8gT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAvLyB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgYSBUTWVzc2FnZSBpbiBleGFjdGx5CisgICAgLy8gdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgorICAgIFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQorICAgIHByaXZhdGUKKyAgICAgIEZNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICBwdWJsaWMKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBlbmQ7CisKKyAgcHJpdmF0ZQorICAgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwIDogVERpY3Rpb25hcnk8U3RyaW5nLCBJUHJvY2Vzc29yPjsKKyAgICBGRGVmYXVsdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CisKKyAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7IGNvbnN0IGV0eHQgOiBzdHJpbmcpOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKworICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC4gIFRoaXMgYWxsb3dzIHVzCisgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQorICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOworCisgICAgeyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgorICAgICAgLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgIC0gVXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci4KKyAgICAgIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisKKyAgICAgIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVkKKyAgICAgIG9yIGlmIHRoZSBzZXJ2aWNlIGlzIHVua25vd24gKG9yIG5vdCBwcm9wZXJseSByZWdpc3RlcmVkKS4KKyAgICB9CisgICAgZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3QsIG9wcm90OiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHByb3RvY29sKTsKKyAgRk1lc3NhZ2VCZWdpbiA6PSBhTXNnQmVnaW47CitlbmQ7CisKKworZnVuY3Rpb24gVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZNZXNzYWdlQmVnaW47CitlbmQ7CisKKworY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmljZVByb2Nlc3Nvck1hcCA6PSBURGljdGlvbmFyeTxzdHJpbmcsSVByb2Nlc3Nvcj4uQ3JlYXRlOworZW5kOworCisKK2Rlc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggRlNlcnZpY2VQcm9jZXNzb3JNYXApOworICBmaW5hbGx5CisgICAgaW5oZXJpdGVkIERlc3Ryb3k7CisgIGVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5SZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3I7IGNvbnN0IGFzRGVmYXVsdCA6IEJvb2xlYW4pOworYmVnaW4KKyAgRlNlcnZpY2VQcm9jZXNzb3JNYXAuQWRkKCBzZXJ2aWNlTmFtZSwgcHJvY2Vzc29yKTsKKworICBpZiBhc0RlZmF1bHQgdGhlbiBiZWdpbgorICAgIGlmIEZEZWZhdWx0UHJvY2Vzc29yID0gbmlsCisgICAgdGhlbiBGRGVmYXVsdFByb2Nlc3NvciA6PSBwcm9jZXNzb3IKKyAgICBlbHNlIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IuQ3JlYXRlKCdPbmx5IG9uZSBkZWZhdWx0IHNlcnZpY2UgYWxsb3dlZCcpOworICBlbmQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHR5cGUgOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV0eHQgOiBzdHJpbmcpOwordmFyIGFwcGV4ICA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKyAgICBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKK2JlZ2luCisgIGFwcGV4IDo9IGV4dHlwZS5DcmVhdGUoZXR4dCk7CisgIHRyeQorICAgIEluaXQoIG5ld01zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CisKKyAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNc2cpOworICAgIGFwcGV4LldyaXRlKG9wcm90KTsKKyAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvcHJvdC5UcmFuc3BvcnQuRmx1c2goKTsKKworICBmaW5hbGx5CisgICAgYXBwZXguRnJlZTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUHJvY2Vzcyhjb25zdCBpcHJvdCwgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOwordmFyIG1zZywgbmV3TXNnIDogVFRocmlmdE1lc3NhZ2U7CisgICAgaWR4ICAgICAgICAgOiBJbnRlZ2VyOworICAgIHNTZXJ2aWNlICAgIDogc3RyaW5nOworICAgIHByb2Nlc3NvciAgIDogSVByb2Nlc3NvcjsKKyAgICBwcm90b2NvbCAgICA6IElQcm90b2NvbDsKK2NvbnN0CisgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSAgID0gJ01lc3NhZ2UgbXVzdCBiZSAiY2FsbCIgb3IgIm9uZXdheSInOworICBFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCA9ICdObyBzZXJ2aWNlIG5hbWUgZm91bmQgaW4gIiVzIi4gQ2xpZW50IGlzIGV4cGVjdGVkIHRvIHVzZSBUTXVsdGlwbGV4UHJvdG9jb2wuJzsKKyAgRVJST1JfVU5LTk9XTl9TRVJWSUNFICAgPSAnU2VydmljZSAiJXMiIGlzIG5vdCByZWdpc3RlcmVkIHdpdGggTXVsdGlwbGV4ZWRQcm9jZXNzb3InOworYmVnaW4KKyAgLy8gVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlIG1lc3NhZ2UgaGVhZGVyLgorICAvLyBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbCBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgbXNnIDo9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgaWYgbm90IChtc2cuVHlwZV8gaW4gW1RNZXNzYWdlVHlwZS5DYWxsLCBUTWVzc2FnZVR5cGUuT25ld2F5XSkgdGhlbiBiZWdpbgorICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgIEVSUk9SX0lOVkFMSURfTVNHVFlQRSk7CisgICAgRXhpdCggRkFMU0UpOworICBlbmQ7CisKKyAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgIC8vIHVzZSBGRGVmYXVsdFByb2Nlc3NvciBhcyBmYWxsYmFjayBpZiB0aGVyZSBpcyBubyBzZXBhcmF0b3IKKyAgaWR4IDo9IFBvcyggVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLCBtc2cuTmFtZSk7CisgIGlmIGlkeCA+IDAgdGhlbiBiZWdpbgorCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgYW55IFRQcm90b2NvbAorICAgIHNTZXJ2aWNlIDo9IENvcHkoIG1zZy5OYW1lLCAxLCBpZHgtMSk7CisgICAgaWYgbm90IEZTZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKCBzU2VydmljZSwgcHJvY2Vzc29yKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3IsCisgICAgICAgICAgICAgRm9ybWF0KEVSUk9SX1VOS05PV05fU0VSVklDRSxbc1NlcnZpY2VdKSk7CisgICAgICBFeGl0KCBGQUxTRSk7CisgICAgZW5kOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKKyAgICBJbml0KCBuZXdNc2csIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKworICBlbmQKKyAgZWxzZSBpZiBGRGVmYXVsdFByb2Nlc3NvciA8PiBuaWwgdGhlbiBiZWdpbgorICAgIHByb2Nlc3NvciA6PSBGRGVmYXVsdFByb2Nlc3NvcjsKKyAgICBuZXdNc2cgICAgOj0gbXNnOyAgLy8gbm8gbmVlZCB0byBjaGFuZ2UKKworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIEVycm9yKCBvcHJvdCwgbXNnLAorICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wsCisgICAgICAgICAgIEZvcm1hdChFUlJPUl9JTkNPTVBBVElCTEVfUFJPVCxbbXNnLk5hbWVdKSk7CisgICAgRXhpdCggRkFMU0UpOworICBlbmQ7CisKKyAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICBwcm90b2NvbCA6PSBUU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggaXByb3QsIG5ld01zZyk7CisgIHJlc3VsdCAgIDo9IHByb2Nlc3Nvci5wcm9jZXNzKCBwcm90b2NvbCwgb3Byb3QsIGV2ZW50cyk7CitlbmQ7CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMWIzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKQEAgLTAsMCArMSwxMTE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3Q7CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlByb3RvY29sLAorICBUaHJpZnQuVXRpbHM7CisKK3R5cGUKKyAgSUNvbXBhY3RQcm90b2NvbCA9IGludGVyZmFjZSggSVByb3RvY29sKQorICAgIFsne0MwMTkyN0VDLTAyMUEtNDVGNy05M0IxLTIzRDZBNTQyMEVERH0nXQorICBlbmQ7CisKKyAgLy8gQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorICAvLyBBZGFwdGVkIGZyb20gdGhlIEMjIHZlcnNpb24uCisgIFRDb21wYWN0UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwsIElDb21wYWN0UHJvdG9jb2wpCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJUHJvdG9jb2xGYWN0b3J5KQorICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgIGVuZDsKKworICBwcml2YXRlIGNvbnN0CisKKyAgICB7IFRPRE8KKyAgICBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOworICAgIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TdG9wLCAoc2hvcnQpMCk7CisgICAgfQorCisgICAgUFJPVE9DT0xfSUQgICAgICAgPSBCeXRlKCAkODIpOworICAgIFZFUlNJT04gICAgICAgICAgID0gQnl0ZSggMSk7CisgICAgVkVSU0lPTl9NQVNLICAgICAgPSBCeXRlKCAkMUYpOyAvLyAwMDAxIDExMTEKKyAgICBUWVBFX01BU0sgICAgICAgICA9IEJ5dGUoICRFMCk7IC8vIDExMTAgMDAwMAorICAgIFRZUEVfQklUUyAgICAgICAgID0gQnl0ZSggJDA3KTsgLy8gMDAwMCAwMTExCisgICAgVFlQRV9TSElGVF9BTU9VTlQgPSBCeXRlKCA1KTsKKworICBwcml2YXRlIHR5cGUKKyAgICAvLyBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAgICBUeXBlcyA9ICgKKyAgICAgIFNUT1AgICAgICAgICAgPSAkMDAsCisgICAgICBCT09MRUFOX1RSVUUgID0gJDAxLAorICAgICAgQk9PTEVBTl9GQUxTRSA9ICQwMiwKKyAgICAgIEJZVEVfICAgICAgICAgPSAkMDMsCisgICAgICBJMTYgICAgICAgICAgID0gJDA0LAorICAgICAgSTMyICAgICAgICAgICA9ICQwNSwKKyAgICAgIEk2NCAgICAgICAgICAgPSAkMDYsCisgICAgICBET1VCTEVfICAgICAgID0gJDA3LAorICAgICAgQklOQVJZICAgICAgICA9ICQwOCwKKyAgICAgIExJU1QgICAgICAgICAgPSAkMDksCisgICAgICBTRVRfICAgICAgICAgID0gJDBBLAorICAgICAgTUFQICAgICAgICAgICA9ICQwQiwKKyAgICAgIFNUUlVDVCAgICAgICAgPSAkMEMKKyAgICApOworCisgIHByaXZhdGUgY29uc3QKKyAgICB0dHlwZVRvQ29tcGFjdFR5cGUgOiBhcnJheVtUVHlwZV0gb2YgVHlwZXMgPSAoCisgICAgICBUeXBlcy5TVE9QLCAgICAgICAgICAgLy8gU3RvcCAgICA9IDAsCisgICAgICBUeXBlcygtMSksICAgICAgICAgICAgLy8gVm9pZCAgICA9IDEsCisgICAgICBUeXBlcy5CT09MRUFOX1RSVUUsICAgLy8gQm9vbF8gICA9IDIsCisgICAgICBUeXBlcy5CWVRFXywgICAgICAgICAgLy8gQnl0ZV8gICA9IDMsCisgICAgICBUeXBlcy5ET1VCTEVfLCAgICAgICAgLy8gRG91YmxlXyA9IDQsCisgICAgICBUeXBlcygtNSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMTYsICAgICAgICAgICAgLy8gSTE2ICAgICA9IDYsCisgICAgICBUeXBlcygtNyksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JMzIsICAgICAgICAgICAgLy8gSTMyICAgICA9IDgsCisgICAgICBUeXBlcygtOSksICAgICAgICAgICAgLy8gdW51c2VkCisgICAgICBUeXBlcy5JNjQsICAgICAgICAgICAgLy8gSTY0ICAgICA9IDEwLAorICAgICAgVHlwZXMuQklOQVJZLCAgICAgICAgIC8vIFN0cmluZ18gPSAxMSwKKyAgICAgIFR5cGVzLlNUUlVDVCwgICAgICAgICAvLyBTdHJ1Y3QgID0gMTIsCisgICAgICBUeXBlcy5NQVAsICAgICAgICAgICAgLy8gTWFwICAgICA9IDEzLAorICAgICAgVHlwZXMuU0VUXywgICAgICAgICAgIC8vIFNldF8gICAgPSAxNCwKKyAgICAgIFR5cGVzLkxJU1QgICAgICAgICAgICAvLyBMaXN0ICAgID0gMTUsCisgICAgKTsKKworICAgIHRjb21wYWN0VHlwZVRvVHlwZSA6IGFycmF5W1R5cGVzXSBvZiBUVHlwZSA9ICgKKyAgICAgIFRUeXBlLlN0b3AsICAgICAgIC8vIFNUT1AKKyAgICAgIFRUeXBlLkJvb2xfLCAgICAgIC8vIEJPT0xFQU5fVFJVRQorICAgICAgVFR5cGUuQm9vbF8sICAgICAgLy8gQk9PTEVBTl9GQUxTRQorICAgICAgVFR5cGUuQnl0ZV8sICAgICAgLy8gQllURV8KKyAgICAgIFRUeXBlLkkxNiwgICAgICAgIC8vIEkxNgorICAgICAgVFR5cGUuSTMyLCAgICAgICAgLy8gSTMyCisgICAgICBUVHlwZS5JNjQsICAgICAgICAvLyBJNjQKKyAgICAgIFRUeXBlLkRvdWJsZV8sICAgIC8vIERPVUJMRV8KKyAgICAgIFRUeXBlLlN0cmluZ18sICAgIC8vIEJJTkFSWQorICAgICAgVFR5cGUuTGlzdCwgICAgICAgLy8gTElTVAorICAgICAgVFR5cGUuU2V0XywgICAgICAgLy8gU0VUXworICAgICAgVFR5cGUuTWFwLCAgICAgICAgLy8gTUFQCisgICAgICBUVHlwZS5TdHJ1Y3QgICAgICAvLyBTVFJVQ1QKKyAgICApOworCisgIHByaXZhdGUKKyAgICAvLyBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAorICAgIC8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgbGFzdEZpZWxkXyA6IFRTdGFjazxJbnRlZ2VyPjsKKyAgICBsYXN0RmllbGRJZF8gOiBJbnRlZ2VyOworCisgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IFRUaHJpZnRGaWVsZDsKKworICAgIC8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAgIC8vIHZhbHVlIGhlcmUgc28gdGhhdCBSZWFkQm9vbCBjYW4gdXNlIGl0LgorICAgIHByaXZhdGUgIGJvb2xWYWx1ZV8gIDogKCB1bnVzZWQsIGJvb2xfdHJ1ZSwgYm9vbF9mYWxzZSk7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IHRyYW5zIDogSVRyYW5zcG9ydCk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgUmVzZXQ7CisKKyAgcHJpdmF0ZQorICAgIHByb2NlZHVyZSBXcml0ZUJ5dGVEaXJlY3QoIGNvbnN0IGIgOiBCeXRlKTsgIG92ZXJsb2FkOworCisgICAgLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisKKyAgICAvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgIC8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICBwcm9jZWR1cmUgV3JpdGVWYXJpbnQzMiggbiA6IENhcmRpbmFsKTsKKworICBwcml2YXRlCisgICAgLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisgICAgLy8gb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbkludGVybmFsKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZDsgdHlwZU92ZXJyaWRlIDogQnl0ZSk7CisKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkdWI6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IG92ZXJyaWRlOworCisgIHByaXZhdGUKKyAgICBjbGFzcyBmdW5jdGlvbiAgRG91YmxlVG9JbnQ2NEJpdHMoIGNvbnN0IGRiIDogRG91YmxlKSA6IEludDY0OworICAgIGNsYXNzIGZ1bmN0aW9uICBJbnQ2NEJpdHNUb0RvdWJsZSggY29uc3QgaTY0IDogSW50NjQpIDogRG91YmxlOworCisgICAgLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgIC8vIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICBwcm9jZWR1cmUgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGNvbnN0IGVsZW1UeXBlIDogVFR5cGU7IHNpemUgOiBJbnRlZ2VyKTsKKworICAgIHByb2NlZHVyZSBXcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKKworICAgIC8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgY2xhc3MgZnVuY3Rpb24gIGxvbmdUb1ppZ3phZyggY29uc3QgbiA6IEludDY0KSA6IFVJbnQ2NDsKKworICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgIC8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICBjbGFzcyBmdW5jdGlvbiBpbnRUb1ppZ1phZyggY29uc3QgbiA6IEludGVnZXIpIDogQ2FyZGluYWw7CisKKyAgICAvL0NvbnZlcnQgYSBJbnQ2NCBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcgdW50aWwgb2ZmKzcuCisgICAgY2xhc3MgcHJvY2VkdXJlIGZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CisKKyAgcHVibGljCisgICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJMTY6IFNtYWxsSW50OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEkzMjogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZERvdWJsZTpEb3VibGU7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkQmluYXJ5OiBUQnl0ZXM7IG92ZXJsb2FkOyBvdmVycmlkZTsKKworICBwcml2YXRlCisgICAgLy8gSW50ZXJuYWwgUmVhZGluZyBtZXRob2RzCisKKyAgICAvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKyAgICAvLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgZnVuY3Rpb24gUmVhZFZhcmludDMyIDogQ2FyZGluYWw7CisKKyAgICAvLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICBmdW5jdGlvbiBSZWFkVmFyaW50NjQgOiBVSW50NjQ7CisKKworICAgIC8vIGVuY29kaW5nIGhlbHBlcnMKKworICAgIC8vIENvbnZlcnQgZnJvbSB6aWd6YWcgSW50ZWdlciB0byBJbnRlZ2VyLgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CisKKyAgICAvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorICAgIGNsYXNzIGZ1bmN0aW9uIHppZ3phZ1RvTG9uZyggY29uc3QgbiA6IFVJbnQ2NCkgOiBJbnQ2NDsKKworICAgIC8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBJbnQ2NCBsaXRlcmFscywKKyAgICAvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKyAgICAvLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgSW50ZWdlci4KKyAgICBjbGFzcyBmdW5jdGlvbiBieXRlc1RvTG9uZyggY29uc3QgYnl0ZXMgOiBUQnl0ZXMpIDogSW50NjQ7CisKKyAgICAvLyB0eXBlIHRlc3RpbmcgYW5kIGNvbnZlcnRpbmcKKyAgICBjbGFzcyBmdW5jdGlvbiBpc0Jvb2xUeXBlKCBjb25zdCBiIDogYnl0ZSkgOiBCb29sZWFuOworCisgICAgLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIFRUeXBlIHZhbHVlLgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldFRUeXBlKCBjb25zdCB0eXBlXyA6IGJ5dGUpIDogVFR5cGU7CisKKyAgICAvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgIGNsYXNzIGZ1bmN0aW9uIGdldENvbXBhY3RUeXBlKCBjb25zdCB0dHlwZSA6IFRUeXBlKSA6IEJ5dGU7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKKworLy8tLS0gVENvbXBhY3RQcm90b2NvbEltcGwuVEZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIHJlc3VsdCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsKK2VuZDsKKworCisvLy0tLSBUQ29tcGFjdFByb3RvY29sSW1wbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY29uc3RydWN0b3IgVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIHRyYW5zKTsKKworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgbGFzdEZpZWxkXyA6PSBUU3RhY2s8SW50ZWdlcj4uQ3JlYXRlOworCisgIEluaXQoIGJvb2xlYW5GaWVsZF8sICcnLCBUVHlwZS5TdG9wLCAwKTsKKyAgYm9vbFZhbHVlXyA6PSB1bnVzZWQ7CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUQ29tcGFjdFByb3RvY29sSW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgRnJlZUFuZE5pbCggbGFzdEZpZWxkXyk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlc2V0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5DbGVhcigpOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOworICBib29sVmFsdWVfIDo9IHVudXNlZDsKK2VuZDsKKworCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlRGlyZWN0KCBjb25zdCBiIDogQnl0ZSk7CitiZWdpbgorICBUcmFuc3BvcnQuV3JpdGUoIEBiLCBTaXplT2YoYikpOworZW5kOworCisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZURpcmVjdCggY29uc3QgbiA6IEludGVnZXIpOworYmVnaW4KKyAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKG4pKTsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlVmFyaW50MzIoIG4gOiBDYXJkaW5hbCk7Cit2YXIgaTMyYnVmIDogVEJ5dGVzOworICAgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBTZXRMZW5ndGgoIGkzMmJ1ZiwgNSk7CisgIGlkeCA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgQVNTRVJUKCBpZHggPCBMZW5ndGgoaTMyYnVmKSk7CisKKyAgICAvLyBsYXN0IHBhcnQ/CisgICAgaWYgKChuIGFuZCBub3QgJDdGKSA9IDApIHRoZW4gYmVnaW4KKyAgICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUobik7CisgICAgICBJbmMoaWR4KTsKKyAgICAgIEJyZWFrOworICAgIGVuZDsKKworICAgIGkzMmJ1ZltpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIGkzMmJ1ZiwgMCwgaWR4KTsKK2VuZDsKKworCisvLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisvLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7Cit2YXIgdmVyc2lvbkFuZFR5cGUgOiBCeXRlOworYmVnaW4KKyAgUmVzZXQ7CisKKyAgdmVyc2lvbkFuZFR5cGUgOj0gQnl0ZSggVkVSU0lPTiBhbmQgVkVSU0lPTl9NQVNLKQorICAgICAgICAgICAgICAgICBvciBCeXRlKCAoQ2FyZGluYWwobXNnLlR5cGVfKSBzaGwgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX01BU0spOworCisgIFdyaXRlQnl0ZURpcmVjdCggUFJPVE9DT0xfSUQpOworICBXcml0ZUJ5dGVEaXJlY3QoIHZlcnNpb25BbmRUeXBlKTsKKyAgV3JpdGVWYXJpbnQzMiggQ2FyZGluYWwobXNnLlNlcUlEKSk7CisgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSBpdCBhcyBhbgorLy8gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUKKy8vIGZpZWxkIGlkIGRlbHRhcyBjb3JyZWN0LgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIGxhc3RGaWVsZF8uUHVzaChsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKK2VuZDsKKworCisvLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZSB0aGlzIGFzIGFuCisvLyBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmIG9mIHRoZSBmaWVsZCBzdGFjay4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFdyaXRlIGEgZmllbGQgaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkIGlkIGFuZCBmaWVsZCB0eXBlLiBJZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorLy8gY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwgdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluCisvLyB0aGUgNCBNU0IgYXMgYSBkZWx0YS4gT3RoZXJ3aXNlLCB0aGUgZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworYmVnaW4KKyAgY2FzZSBmaWVsZC5UeXBlXyBvZgorICAgIFRUeXBlLkJvb2xfIDogYm9vbGVhbkZpZWxkXyA6PSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgZWxzZQorICAgIFdyaXRlRmllbGRCZWdpbkludGVybmFsKGZpZWxkLCAkRkYpOworICBlbmQ7CitlbmQ7CisKKworLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgJ3R5cGUgb3ZlcnJpZGUnCisvLyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIGJvb2xlYW4gZmllbGQgY2FzZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQ7IHR5cGVPdmVycmlkZSA6IEJ5dGUpOwordmFyIHR5cGVUb1dyaXRlIDogQnl0ZTsKK2JlZ2luCisgIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgaWYgdHlwZU92ZXJyaWRlID0gJEZGCisgIHRoZW4gdHlwZVRvV3JpdGUgOj0gZ2V0Q29tcGFjdFR5cGUoIGZpZWxkLlR5cGVfKQorICBlbHNlIHR5cGVUb1dyaXRlIDo9IHR5cGVPdmVycmlkZTsKKworICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgaWYgKGZpZWxkLklEID4gbGFzdEZpZWxkSWRfKSBhbmQgKChmaWVsZC5JRCAtIGxhc3RGaWVsZElkXykgPD0gMTUpCisgIHRoZW4gYmVnaW4KKyAgICAvLyBXcml0ZSB0aGVtIHRvZ2V0aGVyCisgICAgV3JpdGVCeXRlRGlyZWN0KCAoKGZpZWxkLklEIC0gbGFzdEZpZWxkSWRfKSBzaGwgNCkgb3IgdHlwZVRvV3JpdGUpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICBXcml0ZUJ5dGVEaXJlY3QoIHR5cGVUb1dyaXRlKTsKKyAgICBXcml0ZUkxNiggZmllbGQuSUQpOworICBlbmQ7CisKKyAgbGFzdEZpZWxkSWRfIDo9IGZpZWxkLklEOworZW5kOworCisKKy8vIFdyaXRlIHRoZSBTVE9QIHN5bWJvbCBzbyB3ZSBrbm93IHRoZXJlIGFyZSBubyBtb3JlIGZpZWxkcyBpbiB0aGlzIHN0cnVjdC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIFdyaXRlQnl0ZURpcmVjdCggQnl0ZSggVHlwZXMuU1RPUCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCisvLyBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK3ZhciBrZXksIHZhbCA6IEJ5dGU7CitiZWdpbgorICBpZiAobWFwLkNvdW50ID0gMCkKKyAgdGhlbiBXcml0ZUJ5dGVEaXJlY3QoIDApCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbCggbWFwLkNvdW50KSk7CisgICAga2V5IDo9IGdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKTsKKyAgICB2YWwgOj0gZ2V0Q29tcGFjdFR5cGUobWFwLlZhbHVlVHlwZSk7CisgICAgV3JpdGVCeXRlRGlyZWN0KCAoa2V5IHNobCA0KSBvciB2YWwpOworICBlbmQ7CitlbmQ7CisKKworLy8gV3JpdGUgYSBsaXN0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOworZW5kOworCisKKy8vIFdyaXRlIGEgc2V0IGhlYWRlci4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CitiZWdpbgorICBXcml0ZUNvbGxlY3Rpb25CZWdpbiggc2V0Xy5FbGVtZW50VHlwZSwgc2V0Xy5Db3VudCk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluCisvLyB3aGljaCBjYXNlIHRoZSBmaWVsZCBoZWFkZXIgaW5mbyBpc24ndCB3cml0dGVuIHlldC4gSWYgc28sIGRlY2lkZSB3aGF0IHRoZQorLy8gcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorLy8gT3RoZXJ3aXNlLCBXcml0ZSBhIHNpbmdsZSBieXRlLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQm9vbCggYjogQm9vbGVhbik7Cit2YXIgYnQgOiBUeXBlczsKK2JlZ2luCisgIGlmIGIKKyAgdGhlbiBidCA6PSBUeXBlcy5CT09MRUFOX1RSVUUKKyAgZWxzZSBidCA6PSBUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgIGlmIGJvb2xlYW5GaWVsZF8uVHlwZV8gPSBUVHlwZS5Cb29sXyB0aGVuIGJlZ2luCisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIEJ5dGUoYnQpKTsKKyAgICBib29sZWFuRmllbGRfLlR5cGVfIDo9IFRUeXBlLlN0b3A7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgV3JpdGVCeXRlRGlyZWN0KCBCeXRlKGJ0KSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7CitiZWdpbgorICBXcml0ZUJ5dGVEaXJlY3QoIEJ5dGUoYikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgV3JpdGVWYXJpbnQzMiggaW50VG9aaWdaYWcoIGkxNikpOworZW5kOworCisKKy8vIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBpbnRUb1ppZ1phZyggaTMyKSk7CitlbmQ7CisKKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CitiZWdpbgorICBXcml0ZVZhcmludDY0KCBsb25nVG9aaWd6YWcoIGk2NCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkRvdWJsZVRvSW50NjRCaXRzKCBjb25zdCBkYiA6IERvdWJsZSkgOiBJbnQ2NDsKK2JlZ2luCisgIEFTU0VSVCggU2l6ZU9mKGRiKSA9IFNpemVPZihyZXN1bHQpKTsKKyAgTW92ZSggZGIsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLkludDY0Qml0c1RvRG91YmxlKCBjb25zdCBpNjQgOiBJbnQ2NCkgOiBEb3VibGU7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihpNjQpID0gU2l6ZU9mKHJlc3VsdCkpOworICBNb3ZlKCBpNjQsIHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCkpOworZW5kOworCisKKy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGR1YjogRG91YmxlKTsKK3ZhciBkYXRhIDogVEJ5dGVzOworYmVnaW4KKyAgZml4ZWRMb25nVG9CeXRlcyggRG91YmxlVG9JbnQ2NEJpdHMoZHViKSwgZGF0YSk7CisgIFRyYW5zcG9ydC5Xcml0ZSggZGF0YSk7CitlbmQ7CisKKworLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChMZW5ndGgoYikpKTsKKyAgVHJhbnNwb3J0LldyaXRlKCBiKTsKK2VuZDsKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVNYXBFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7CitiZWdpbgorICAvLyBub3RoaW5nIHRvIGRvCitlbmQ7CisKKworLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQ29sbGVjdGlvbkJlZ2luKCBjb25zdCBlbGVtVHlwZSA6IFRUeXBlOyBzaXplIDogSW50ZWdlcik7CitiZWdpbgorICBpZiBzaXplIDw9IDE0CisgIHRoZW4gV3JpdGVCeXRlRGlyZWN0KCAoc2l6ZSBzaGwgNCkgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKQorICBlbHNlIGJlZ2luCisgICAgV3JpdGVCeXRlRGlyZWN0KCAkRjAgb3IgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICBXcml0ZVZhcmludDMyKCBDYXJkaW5hbChzaXplKSk7CisgIGVuZDsKK2VuZDsKKworCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVZhcmludDY0KCBuIDogVUludDY0KTsKK3ZhciB2YXJpbnQ2NG91dCA6IFRCeXRlczsKKyAgICBpZHggOiBJbnRlZ2VyOworYmVnaW4KKyAgU2V0TGVuZ3RoKCB2YXJpbnQ2NG91dCwgMTApOworICBpZHggOj0gMDsKKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIEFTU0VSVCggaWR4IDwgTGVuZ3RoKHZhcmludDY0b3V0KSk7CisKKyAgICAvLyBsYXN0IG9uZT8KKyAgICBpZiAobiBhbmQgbm90IFVJbnQ2NCgkN0YpKSA9IDAgdGhlbiBiZWdpbgorICAgICAgdmFyaW50NjRvdXRbaWR4XSA6PSBCeXRlKG4pOworICAgICAgSW5jKGlkeCk7CisgICAgICBCcmVhazsKKyAgICBlbmQ7CisKKyAgICB2YXJpbnQ2NG91dFtpZHhdIDo9IEJ5dGUoKG4gYW5kICQ3Rikgb3IgJDgwKTsKKyAgICBJbmMoaWR4KTsKKyAgICBuIDo9IG4gc2hyIDc7CisgIGVuZDsKKworICBUcmFuc3BvcnQuV3JpdGUoIHZhcmludDY0b3V0LCAwLCBpZHgpOworZW5kOworCisKKy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIEludDY0LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcoIGNvbnN0IG4gOiBJbnQ2NCkgOiBVSW50NjQ7CitiZWdpbgorICAvLyB0aGVyZSBpcyBubyBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IGluIERlbHBoaQorICBpZiBuID49IDAKKyAgdGhlbiByZXN1bHQgOj0gVUludDY0KG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IFVJbnQ2NChuIHNobCAxKSB4b3IgJEZGRkZGRkZGRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgSW50ZWdlci4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoIGNvbnN0IG4gOiBJbnRlZ2VyKSA6IENhcmRpbmFsOworYmVnaW4KKyAgLy8gdGhlcmUgaXMgbm8gYXJpdGhtZXRpYyByaWdodCBzaGlmdCBpbiBEZWxwaGkKKyAgaWYgbiA+PSAwCisgIHRoZW4gcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpCisgIGVsc2UgcmVzdWx0IDo9IENhcmRpbmFsKG4gc2hsIDEpIHhvciAkRkZGRkZGRkY7CitlbmQ7CisKKworLy8gQ29udmVydCBhIEludDY0IGludG8gOCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZgorY2xhc3MgcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLmZpeGVkTG9uZ1RvQnl0ZXMoIGNvbnN0IG4gOiBJbnQ2NDsgdmFyIGJ1ZiA6IFRCeXRlcyk7CitiZWdpbgorICBTZXRMZW5ndGgoIGJ1ZiwgOCk7CisgIGJ1ZlswXSA6PSBCeXRlKCBuICAgICAgICAgYW5kICRGRik7CisgIGJ1ZlsxXSA6PSBCeXRlKChuIHNociA4KSAgYW5kICRGRik7CisgIGJ1ZlsyXSA6PSBCeXRlKChuIHNociAxNikgYW5kICRGRik7CisgIGJ1ZlszXSA6PSBCeXRlKChuIHNociAyNCkgYW5kICRGRik7CisgIGJ1Zls0XSA6PSBCeXRlKChuIHNociAzMikgYW5kICRGRik7CisgIGJ1Zls1XSA6PSBCeXRlKChuIHNociA0MCkgYW5kICRGRik7CisgIGJ1Zls2XSA6PSBCeXRlKChuIHNociA0OCkgYW5kICRGRik7CisgIGJ1Zls3XSA6PSBCeXRlKChuIHNociA1NikgYW5kICRGRik7CitlbmQ7CisKKworCisvLyBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luIDogVFRocmlmdE1lc3NhZ2U7Cit2YXIgcHJvdG9jb2xJZCwgdmVyc2lvbkFuZFR5cGUsIHZlcnNpb24sIHR5cGVfIDogQnl0ZTsKKyAgICBzZXFpZCA6IEludGVnZXI7CisgICAgbXNnTm0gOiBTdHJpbmc7CitiZWdpbgorICBSZXNldDsKKworICBwcm90b2NvbElkIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKyAgaWYgKHByb3RvY29sSWQgPD4gUFJPVE9DT0xfSUQpCisgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoICdFeHBlY3RlZCBwcm90b2NvbCBpZCAnICsgSW50VG9IZXgoUFJPVE9DT0xfSUQsMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyBidXQgZ290ICcgKyBJbnRUb0hleChwcm90b2NvbElkLDIpKTsKKworICB2ZXJzaW9uQW5kVHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgIHZlcnNpb24gICAgICAgIDo9IEJ5dGUoIHZlcnNpb25BbmRUeXBlIGFuZCBWRVJTSU9OX01BU0spOworICBpZiAodmVyc2lvbiA8PiBWRVJTSU9OKQorICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCAnRXhwZWN0ZWQgdmVyc2lvbiAnICtJbnRUb1N0cihWRVJTSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnIGJ1dCBnb3QgJyArIEludFRvU3RyKHZlcnNpb24pKTsKKworICB0eXBlXyA6PSBCeXRlKCAodmVyc2lvbkFuZFR5cGUgc2hyIFRZUEVfU0hJRlRfQU1PVU5UKSBhbmQgVFlQRV9CSVRTKTsKKyAgc2VxaWQgOj0gSW50ZWdlciggUmVhZFZhcmludDMyKTsKKyAgbXNnTm0gOj0gUmVhZFN0cmluZzsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOworZW5kOworCisKKy8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgorLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOworICBsYXN0RmllbGRJZF8gOj0gMDsKKyAgSW5pdCggcmVzdWx0KTsKK2VuZDsKKworCisvLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIC8vIGNvbnN1bWUgdGhlIGxhc3QgZmllbGQgd2UgUmVhZCBvZmYgdGhlIHdpcmUuCisgIGxhc3RGaWVsZElkXyA6PSBsYXN0RmllbGRfLlBvcCgpOworZW5kOworCisKKy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK3ZhciB0eXBlXyA6IEJ5dGU7CisgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKK2JlZ2luCisgIHR5cGVfIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgRXhpdDsKKyAgZW5kOworCisgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgbW9kaWZpZXIgOj0gU2hvcnRJbnQoICh0eXBlXyBhbmQgJEYwKSBzaHIgNCk7CisgIGlmIChtb2RpZmllciA9IDApCisgIHRoZW4gZmllbGRJZCA6PSBSZWFkSTE2ICAgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgZWxzZSBmaWVsZElkIDo9IFNob3J0SW50KCBsYXN0RmllbGRJZF8gKyBtb2RpZmllcik7IC8vIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgUmVhZCBmaWVsZCBpZC4KKworICBJbml0KCByZXN1bHQsICcnLCBnZXRUVHlwZShCeXRlKHR5cGVfIGFuZCAkMEYpKSwgZmllbGRJZCk7CisKKyAgLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKyAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlLgorICBpZiBpc0Jvb2xUeXBlKHR5cGVfKSB0aGVuIGJlZ2luCisgICAgaWYgQnl0ZSh0eXBlXyBhbmQgJDBGKSA9IEJ5dGUoVHlwZXMuQk9PTEVBTl9UUlVFKQorICAgIHRoZW4gYm9vbFZhbHVlXyA6PSBib29sX3RydWUKKyAgICBlbHNlIGJvb2xWYWx1ZV8gOj0gYm9vbF9mYWxzZTsKKyAgZW5kOworCisgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICBsYXN0RmllbGRJZF8gOj0gcmVzdWx0LklEOworZW5kOworCisKKy8vIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKy8vIGFuZCB2YWx1ZSB0eXBlLiBUaGlzIG1lYW5zIHRoYXQgMC1sZW5ndGggbWFwcyB3aWxsIHlpZWxkIFRNYXBzIHdpdGhvdXQgdGhlCisvLyAiY29ycmVjdCIgdHlwZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7Cit2YXIgc2l6ZSA6IEludGVnZXI7CisgICAga2V5QW5kVmFsdWVUeXBlIDogQnl0ZTsKKyAgICBrZXksIHZhbCA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworICBpZiBzaXplID0gMAorICB0aGVuIGtleUFuZFZhbHVlVHlwZSA6PSAwCisgIGVsc2Uga2V5QW5kVmFsdWVUeXBlIDo9IEJ5dGUoIFJlYWRCeXRlKTsKKworICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOworICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKKyAgSW5pdCggcmVzdWx0LCBrZXksIHZhbCwgc2l6ZSk7CisgIEFTU0VSVCggKHJlc3VsdC5LZXlUeXBlID0ga2V5KSBhbmQgKHJlc3VsdC5WYWx1ZVR5cGUgPSB2YWwpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKK3ZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKKyAgICBzaXplIDogSW50ZWdlcjsKKyAgICB0eXBlXyA6IFRUeXBlOworYmVnaW4KKyAgc2l6ZV9hbmRfdHlwZSA6PSBCeXRlKCBSZWFkQnl0ZSk7CisKKyAgc2l6ZSA6PSAoc2l6ZV9hbmRfdHlwZSBzaHIgNCkgYW5kICQwRjsKKyAgaWYgKHNpemUgPSAxNSkKKyAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisKKyAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7Cit2YXIgc2l6ZV9hbmRfdHlwZSA6IEJ5dGU7CisgICAgc2l6ZSA6IEludGVnZXI7CisgICAgdHlwZV8gOiBUVHlwZTsKK2JlZ2luCisgIHNpemVfYW5kX3R5cGUgOj0gQnl0ZSggUmVhZEJ5dGUpOworCisgIHNpemUgOj0gKHNpemVfYW5kX3R5cGUgc2hyIDQpIGFuZCAkMEY7CisgIGlmIChzaXplID0gMTUpCisgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOworCisgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKKyAgSW5pdCggcmVzdWx0LCB0eXBlXywgc2l6ZSk7CitlbmQ7CisKKworLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQm9vbDogQm9vbGVhbjsKK2JlZ2luCisgIGlmIGJvb2xWYWx1ZV8gPD4gdW51c2VkIHRoZW4gYmVnaW4KKyAgICByZXN1bHQgOj0gKGJvb2xWYWx1ZV8gPSBib29sX3RydWUpOworICAgIGJvb2xWYWx1ZV8gOj0gdW51c2VkOworICAgIEV4aXQ7CisgIGVuZDsKKworICByZXN1bHQgOj0gKEJ5dGUoUmVhZEJ5dGUpID0gQnl0ZShUeXBlcy5CT09MRUFOX1RSVUUpKTsKK2VuZDsKKworCisvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkQnl0ZTogU2hvcnRJbnQ7CitiZWdpbgorICBUcmFuc3BvcnQuUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOworZW5kOworCisKKy8vIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7CitiZWdpbgorICByZXN1bHQgOj0gU21hbGxJbnQoIHppZ3phZ1RvSW50KCBSZWFkVmFyaW50MzIpKTsKK2VuZDsKKworCisvLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRJMzI6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gemlnemFnVG9JbnQoIFJlYWRWYXJpbnQzMik7CitlbmQ7CisKKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkSTY0OiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSB6aWd6YWdUb0xvbmcoIFJlYWRWYXJpbnQ2NCk7CitlbmQ7CisKKworLy8gTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRG91YmxlOkRvdWJsZTsKK3ZhciBsb25nQml0cyA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggbG9uZ0JpdHMsIDgpOworICBUcmFuc3BvcnQuUmVhZEFsbCggbG9uZ0JpdHMsIDAsIDgpOworICByZXN1bHQgOj0gSW50NjRCaXRzVG9Eb3VibGUoIGJ5dGVzVG9Mb25nKCBsb25nQml0cykpOworZW5kOworCisKKy8vIFJlYWQgYSBieXRlW10gZnJvbSB0aGUgd2lyZS4KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKK3ZhciBsZW5ndGggOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuZ3RoIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CisgIFNldExlbmd0aCggcmVzdWx0LCBsZW5ndGgpOworICBpZiAobGVuZ3RoID4gMCkKKyAgdGhlbiBUcmFuc3BvcnQuUmVhZEFsbCggcmVzdWx0LCAwLCBsZW5ndGgpOworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTWFwRW5kOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCisKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCitwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworCisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFZhcmludDMyIDogQ2FyZGluYWw7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoQ2FyZGluYWwoYiBhbmQgJDdGKSBzaGwgc2hpZnQpOworICAgIGlmICgoYiBhbmQgJDgwKSA8PiAkODApCisgICAgdGhlbiBCcmVhazsKKyAgICBJbmMoIHNoaWZ0LCA3KTsKKyAgZW5kOworZW5kOworCisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCitmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkVmFyaW50NjQgOiBVSW50NjQ7Cit2YXIgc2hpZnQgOiBJbnRlZ2VyOworICAgIGIgOiBCeXRlOworYmVnaW4KKyAgcmVzdWx0IDo9IDA7CisgIHNoaWZ0ICA6PSAwOworICB3aGlsZSBUUlVFIGRvIGJlZ2luCisgICAgYiA6PSBCeXRlKCBSZWFkQnl0ZSk7CisgICAgcmVzdWx0IDo9IHJlc3VsdCBvciAoVUludDY0KGIgYW5kICQ3Rikgc2hsIHNoaWZ0KTsKKyAgICBpZiAoKGIgYW5kICQ4MCkgPD4gJDgwKQorICAgIHRoZW4gQnJlYWs7CisgICAgSW5jKCBzaGlmdCwgNyk7CisgIGVuZDsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludGVnZXIgdG8gSW50ZWdlci4KK2NsYXNzIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KCBjb25zdCBuIDogQ2FyZGluYWwgKSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gSW50ZWdlcihuIHNociAxKSB4b3IgKC1JbnRlZ2VyKG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBDb252ZXJ0IGZyb20gemlnemFnIEludDY0IHRvIEludDY0LgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuemlnemFnVG9Mb25nKCBjb25zdCBuIDogVUludDY0KSA6IEludDY0OworYmVnaW4KKyAgcmVzdWx0IDo9IEludDY0KG4gc2hyIDEpIHhvciAoLUludDY0KG4gYW5kIDEpKTsKK2VuZDsKKworCisvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgSW50NjQgbGl0ZXJhbHMsCisvLyBvdGhlcndpc2UgdGhleSdsbCBkZWZhdWx0IHRvIGludHMsIGFuZCB3aGVuIHlvdSBzaGlmdCBhbiBJbnRlZ2VyIGxlZnQgNTYgYml0cywKKy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBJbnRlZ2VyLgorY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuYnl0ZXNUb0xvbmcoIGNvbnN0IGJ5dGVzIDogVEJ5dGVzKSA6IEludDY0OworYmVnaW4KKyAgQVNTRVJUKCBMZW5ndGgoYnl0ZXMpID49IDgpOworICByZXN1bHQgOj0gKEludDY0KGJ5dGVzWzddIGFuZCAkRkYpIHNobCA1Nikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1s2XSBhbmQgJEZGKSBzaGwgNDgpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbNV0gYW5kICRGRikgc2hsIDQwKSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzRdIGFuZCAkRkYpIHNobCAzMikgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1szXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgICAgICAgICAoSW50NjQoYnl0ZXNbMl0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgICAgICAgICAgKEludDY0KGJ5dGVzWzFdIGFuZCAkRkYpIHNobCAgOCkgb3IKKyAgICAgICAgICAgIChJbnQ2NChieXRlc1swXSBhbmQgJEZGKSk7CitlbmQ7CisKKworY2xhc3MgZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuaXNCb29sVHlwZSggY29uc3QgYiA6IGJ5dGUpIDogQm9vbGVhbjsKK3ZhciBsb3dlck5pYmJsZSA6IEJ5dGU7CitiZWdpbgorICBsb3dlck5pYmJsZSA6PSBiIGFuZCAkMGY7CisgIHJlc3VsdCA6PSAoVHlwZXMobG93ZXJOaWJibGUpIGluIFtUeXBlcy5CT09MRUFOX1RSVUUsIFR5cGVzLkJPT0xFQU5fRkFMU0VdKTsKK2VuZDsKKworCisvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRUVHlwZSggY29uc3QgdHlwZV8gOiBieXRlKSA6IFRUeXBlOwordmFyIHRjdCA6IFR5cGVzOworYmVnaW4KKyAgdGN0IDo9IFR5cGVzKCB0eXBlXyBhbmQgJDBGKTsKKyAgaWYgdGN0IGluIFtMb3coVHlwZXMpLi5IaWdoKFR5cGVzKV0KKyAgdGhlbiByZXN1bHQgOj0gdGNvbXBhY3RUeXBlVG9UeXBlW3RjdF0KKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ2RvbicndCBrbm93IHdoYXQgdHlwZTogJytJbnRUb1N0cihPcmQodGN0KSkpOworZW5kOworCisKKy8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCitjbGFzcyBmdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5nZXRDb21wYWN0VHlwZSggY29uc3QgdHR5cGUgOiBUVHlwZSkgOiBCeXRlOworYmVnaW4KKyAgaWYgdHR5cGUgaW4gVkFMSURfVFRZUEVTCisgIHRoZW4gcmVzdWx0IDo9IEJ5dGUoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0pCisgIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdkb24nJ3Qga25vdyB3aGF0IHR5cGU6ICcrSW50VG9TdHIoT3JkKHR0eXBlKSkpOworZW5kOworCisKKy8vLS0tIHVuaXQgdGVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3REb3VibGVUb0ludDY0Qml0czsKKworICBwcm9jZWR1cmUgVGVzdFBhaXIoIGNvbnN0IGEgOiBEb3VibGU7IGNvbnN0IGIgOiBJbnQ2NCk7CisgIGJlZ2luCisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5Eb3VibGVUb0ludDY0Qml0cyhhKSA9IGIpOworICAgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuSW50NjRCaXRzVG9Eb3VibGUoYikgPSBhKTsKKyAgZW5kOworCitiZWdpbgorICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkM0ZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS41MDAwMDAwMDAwMDAwMDAwRSswMDEsICBJbnQ2NCgkNDAyRTAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi41NTAwMDAwMDAwMDAwMDAwRSswMDIsICBJbnQ2NCgkNDA2RkUwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NCgkNDFFRkZGRkZGRkUwMDAwMCkpOworICBUZXN0UGFpciggMy45MDYyNTAwMDAwMDAwMDAwRS0wMDMsICBJbnQ2NCgkM0Y3MDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMi4zMjgzMDY0MzY1Mzg2OTYzRS0wMTAsICBJbnQ2NCgkM0RGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NCgkMDFBQTc0RkUxQzFFN0U0NSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTAwRS0xNTAsICBJbnQ2NCgkMjBEMDJBMzY1ODZEQjRCQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY1RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQSkpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSswMDAsICBJbnQ2NCgkM0ZGM0MwQ0E0MjhDNTlGQykpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSsxNTAsICBJbnQ2NCgkNUYxODIzNDRDRDNDREY5RikpOworICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NCgkN0UzRDdFRThCQ0JCRDM1MikpOworICBUZXN0UGFpciggLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCBJbnQ2NCgkRkZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsICBJbnQ2NCgkN0ZFRkZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMC4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0N0UtMzI0LCAgICBJbnQ2NCgkMDAwMDAwMDAwMDAwMDAwMSkpOworICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NCgkMDAwMDAwMDAwMDAwRkZGRikpOworICBUZXN0UGFpciggMS4zOTA2NzExNjE1NjY5OTU5RS0zMDksICBJbnQ2NCgkMDAwMEZGRkZGRkZGRkZGRikpOworICBUZXN0UGFpciggTmVnSW5maW5pdHksICAgICAgICAgICAgICBJbnQ2NCgkRkZGMDAwMDAwMDAwMDAwMCkpOworICBUZXN0UGFpciggSW5maW5pdHksICAgICAgICAgICAgICAgICBJbnQ2NCgkN0ZGMDAwMDAwMDAwMDAwMCkpOworCisgIC8vIE5hTiBpcyBzcGVjaWFsCisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuRG91YmxlVG9JbnQ2NEJpdHMoIE5hTikgPSBJbnQ2NCgkRkZGODAwMDAwMDAwMDAwMCkpOworICBBU1NFUlQoIElzTmFuKCBUQ29tcGFjdFByb3RvY29sSW1wbC5JbnQ2NEJpdHNUb0RvdWJsZSggSW50NjQoJEZGRjgwMDAwMDAwMDAwMDApKSkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RaaWdaYWc7CisKKyAgcHJvY2VkdXJlIFRlc3QzMiggY29uc3QgdGVzdCA6IEludGVnZXIpOworICB2YXIgenogOiBDYXJkaW5hbDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZyh0ZXN0KTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KHp6KSA9IHRlc3QsIEludFRvU3RyKHRlc3QpKTsKKyAgZW5kOworCisgIHByb2NlZHVyZSBUZXN0NjQoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciB6eiA6IFVJbnQ2NDsKKyAgYmVnaW4KKyAgICB6eiA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5sb25nVG9aaWd6YWcodGVzdCk7CisgICAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC56aWd6YWdUb0xvbmcoenopID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKDApICA9IDAsICdwYiAjMSB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygtMSkgPSAxLCAncGIgIzIgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoMSkgID0gMiwgJ3BiICMzIHRvIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmludFRvWmlnWmFnKC0yKSA9IDMsICdwYiAjNCB0byBaaWdaYWcnKTsKKyAgQVNTRVJUKCBUQ29tcGFjdFByb3RvY29sSW1wbC5pbnRUb1ppZ1phZygrMjE0NzQ4MzY0NykgPSA0Mjk0OTY3Mjk0LCAncGIgIzUgdG8gWmlnWmFnJyk7CisgIEFTU0VSVCggVENvbXBhY3RQcm90b2NvbEltcGwuaW50VG9aaWdaYWcoLTIxNDc0ODM2NDgpID0gNDI5NDk2NzI5NSwgJ3BiICM2IHRvIFppZ1phZycpOworCisgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDApICA9IDAsICdwYiAjMSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDEpID0gLTEsICdwYiAjMiBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDIpICA9IDEsICdwYiAjMyBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDMpID0gLTIsICdwYiAjNCBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTQpID0gKzIxNDc0ODM2NDcsICdwYiAjNSBmcm9tIFppZ1phZycpOworICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLnppZ3phZ1RvSW50KDQyOTQ5NjcyOTUpID0gLTIxNDc0ODM2NDgsICdwYiAjNiBmcm9tIFppZ1phZycpOworCisgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgIFRlc3QzMiggMCk7CisgIGZvciBpIDo9IDAgdG8gMzAgZG8gYmVnaW4KKyAgICBUZXN0MzIoICsoSW50ZWdlcigxKSBzaGwgaSkpOworICAgIFRlc3QzMiggLShJbnRlZ2VyKDEpIHNobCBpKSk7CisgIGVuZDsKKyAgVGVzdDMyKCBJbnRlZ2VyKCQ3RkZGRkZGRikpOworICBUZXN0MzIoIEludGVnZXIoJDgwMDAwMDAwKSk7CisKKyAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgVGVzdDY0KCAwKTsKKyAgZm9yIGkgOj0gMCB0byA2MiBkbyBiZWdpbgorICAgIFRlc3Q2NCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3Q2NCggLShJbnQ2NCgxKSBzaGwgaSkpOworICBlbmQ7CisgIFRlc3Q2NCggSW50NjQoJDdGRkZGRkZGRkZGRkZGRkYpKTsKKyAgVGVzdDY0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFRlc3RMb25nQnl0ZXM7CisKKyAgcHJvY2VkdXJlIFRlc3QoIGNvbnN0IHRlc3QgOiBJbnQ2NCk7CisgIHZhciBidWYgOiBUQnl0ZXM7CisgIGJlZ2luCisgICAgVENvbXBhY3RQcm90b2NvbEltcGwuZml4ZWRMb25nVG9CeXRlcyggdGVzdCwgYnVmKTsKKyAgICBBU1NFUlQoIFRDb21wYWN0UHJvdG9jb2xJbXBsLmJ5dGVzVG9Mb25nKCBidWYpID0gdGVzdCwgSW50VG9TdHIodGVzdCkpOworICBlbmQ7CisKK3ZhciBpIDogSW50ZWdlcjsKK2JlZ2luCisgIFRlc3QoIDApOworICBmb3IgaSA6PSAwIHRvIDYyIGRvIGJlZ2luCisgICAgVGVzdCggKyhJbnQ2NCgxKSBzaGwgaSkpOworICAgIFRlc3QoIC0oSW50NjQoMSkgc2hsIGkpKTsKKyAgZW5kOworICBUZXN0KCBJbnQ2NCgkN0ZGRkZGRkZGRkZGRkZGRikpOworICBUZXN0KCBJbnQ2NCgkODAwMDAwMDAwMDAwMDAwMCkpOworZW5kOworeyRFTkRJRn0KKworCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKworaW5pdGlhbGl6YXRpb24KKyAgeyRJRkRFRiBEZWJ1Z30KKyAgVW5pdFRlc3Q7CisgIHskRU5ESUZ9CisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCmluZGV4IDJjYzRiYmQuLjMwNjAwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTI0LDEzICsyNCwxNCBAQAogaW50ZXJmYWNlCiAKIHVzZXMKKyAgQ2hhcmFjdGVyLAogICBDbGFzc2VzLAogICBTeXNVdGlscywKICAgTWF0aCwKLSAgSWRDb2Rlck1JTUUsCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVHJhbnNwb3J0LAotICBUaHJpZnQuUHJvdG9jb2w7CisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlV0aWxzOwogCiB0eXBlCiAgIElKU09OUHJvdG9jb2wgPSBpbnRlcmZhY2UoIElQcm90b2NvbCkKQEAgLTEwMiw3ICsxMDMsNyBAQAogCiAgICAgICBwcml2YXRlCiAgICAgICAgIEZIYXNEYXRhIDogQm9vbGVhbjsKLSAgICAgICAgRkRhdGEgICAgOiBUQnl0ZXM7CisgICAgICAgIEZEYXRhICAgIDogQnl0ZTsKIAogICAgICAgcHVibGljCiAgICAgICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKQEAgLTE2OCwxOCArMTY5LDE4IEBACiAKICAgcHVibGljCiAgICAgLy8gSVByb3RvY29sCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKQEAgLTE5MCwxNyArMTkxLDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgICBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOwogICAgIC8vCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CkBAIC0yNTQsNyArMjU1LDYgQEAKICAgUkJSQUNLRVQgIDogVEJ5dGVzOwogICBRVU9URSAgICAgOiBUQnl0ZXM7CiAgIEJBQ0tTTEFTSCA6IFRCeXRlczsKLSAgWkVSTyAgICAgIDogVEJ5dGVzOwogICBFU0NTRVEgICAgOiBUQnl0ZXM7CiAKIGNvbnN0CkBAIC0yNjQsOCArMjY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsICAwLDAsMCwwLAogICAgICAgICAgICAgICAgICAgICAgMSwxLEJ5dGUoJyInKSwxLCAgMSwxLDEsMSwgMSwxLDEsMSwgMSwxLDEsMSk7CiAKLSAgRVNDQVBFX0NIQVJTICAgICA9ICciXGJ0bmZyJzsKLSAgRVNDQVBFX0NIQVJfVkFMUyA9ICciXCcjOCM5IzEwIzEyIzEzOworICBFU0NBUEVfQ0hBUlMgICAgID0gJyJcL2J0bmZyJzsKKyAgRVNDQVBFX0NIQVJfVkFMUyA9ICciXC8nIzgjOSMxMCMxMiMxMzsKIAogICBERUZfU1RSSU5HX1NJWkUgPSAxNjsKIApAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgVFR5cGUuU2V0XzogICAgIHJlc3VsdCA6PSBOQU1FX1NFVDsKICAgICBUVHlwZS5MaXN0OiAgICAgcmVzdWx0IDo9IE5BTUVfTElTVDsKICAgZWxzZQotICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICdVbnJlY29nbml6ZWQgdHlwZSAoJytJbnRUb1N0cihPcmQodHlwZUlEKSkrJyknKTsKKyAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK0ludFRvU3RyKE9yZCh0eXBlSUQpKSsnKScpOwogICBlbmQ7CiBlbmQ7CiAKQEAgLTMyOCw3ICszMjgsNyBAQAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX01BUCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5NYXAKICAgZWxzZSBpZiBuYW1lID0gTkFNRV9MSVNUICAgdGhlbiByZXN1bHQgOj0gVFR5cGUuTGlzdAogICBlbHNlIGlmIG5hbWUgPSBOQU1FX1NFVCAgICB0aGVuIHJlc3VsdCA6PSBUVHlwZS5TZXRfCi0gIGVsc2UgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZC5DcmVhdGUoJ1VucmVjb2duaXplZCB0eXBlICgnK25hbWUrJyknKTsKIGVuZDsKIAogCkBAIC00MzcsMjEgKzQzNywxOSBAQAogICBpZiBGSGFzRGF0YQogICB0aGVuIEZIYXNEYXRhIDo9IEZBTFNFCiAgIGVsc2UgYmVnaW4KLSAgICBTZXRMZW5ndGgoIEZEYXRhLCAxKTsKLSAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEZEYXRhLCAwLCAxKTsKKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5QZWVrIDogQnl0ZTsKIGJlZ2luCiAgIGlmIG5vdCBGSGFzRGF0YSB0aGVuIGJlZ2luCi0gICAgU2V0TGVuZ3RoKCBGRGF0YSwgMSk7Ci0gICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBGRGF0YSwgMCwgMSk7CisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOwogICAgIEZIYXNEYXRhIDo9IFRSVUU7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIApAQCAtNTA2LDcgKzUwNCw3IEBACiBiZWdpbgogICBjaCA6PSBGUmVhZGVyLlJlYWQ7CiAgIGlmIChjaCA8PiBiKQotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdVbmV4cGVjdGVkIGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCBjaGFyYWN0ZXIgKCcrQ2hhcihjaCkrJyknKTsKIGVuZDsKIAogCkBAIC01MTYsNyArNTE0LDcgQEAKICAgaSA6PSBTdHJUb0ludERlZiggJyQwJytDaGFyKGNoKSwgLTEpOwogICBpZiAoMCA8PSBpKSBhbmQgKGkgPCAkMTApCiAgIHRoZW4gcmVzdWx0IDo9IGkKLSAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOworICBlbHNlIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAoJytDaGFyKGNoKSsnKScpOwogZW5kOwogCiAKQEAgLTYyMywyNCArNjIxLDI5IEBACiAKIAogcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlSlNPTkJhc2U2NCggY29uc3QgYiA6IFRCeXRlcyk7Ci12YXIgc3RyIDogc3RyaW5nOwotICAgIHRtcCA6IFRCeXRlczsKLSAgICBpICAgOiBJbnRlZ2VyOwordmFyIGxlbiwgb2ZmLCBjbnQgOiBJbnRlZ2VyOworICAgIHRtcEJ1ZiA6IFRCeXRlczsKIGJlZ2luCiAgIEZDb250ZXh0LldyaXRlOwogICBUcmFuc3BvcnQuV3JpdGUoIFFVT1RFKTsKIAotICAvLyBGaXJzdCBiYXNlNjQtZW5jb2RlIGIsIHRoZW4gd3JpdGUgdGhlIHJlc3VsdGluZyA4LWJpdCBjaGFycwotICAvLyBVbmZvcnR1bmF0ZWx5LCBFbmNvZGVCeXRlcygpIHJldHVybnMgYSBzdHJpbmcgb2YgMTYtYml0ICh3aWRlKSBjaGFycwotICAvLyBBbmQgZm9yIHRoZSBzYWtlIG9mIGVmZmljaWVuY3ksIHdlIHdhbnQgdG8gd3JpdGUgZXZlcnl0aGluZyBhdCBvbmNlCi0gIHN0ciA6PSBUSWRFbmNvZGVyTUlNRS5FbmNvZGVCeXRlcyhiKTsKLSAgQVNTRVJUKCBTaXplT2Yoc3RyWzFdKSA9IFNpemVPZihXb3JkKSk7Ci0gIFNldExlbmd0aCggdG1wLCBMZW5ndGgoc3RyKSk7Ci0gIGZvciBpIDo9IDEgdG8gTGVuZ3RoKHN0cikgZG8gYmVnaW4KLSAgICBBU1NFUlQoIEhpKFdvcmQoc3RyW2ldKSkgPSAwKTsgICAvLyBiYXNlNjQgY29uc2lzdHMgb2YgYSB3ZWxsLWRlZmluZWQgc2V0IG9mIDgtYml0IGNoYXJzIG9ubHkKLSAgICB0bXBbaS0xXSA6PSBMbyhXb3JkKHN0cltpXSkpOyAgICAvLyBleHRyYWN0IHRoZSBsb3dlciBieXRlCisgIGxlbiA6PSBMZW5ndGgoYik7CisgIG9mZiA6PSAwOworICBTZXRMZW5ndGgoIHRtcEJ1ZiwgNCk7CisKKyAgd2hpbGUgbGVuID49IDMgZG8gYmVnaW4KKyAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICBCYXNlNjRVdGlscy5FbmNvZGUoIGIsIG9mZiwgMywgdG1wQnVmLCAwKTsKKyAgICBUcmFuc3BvcnQuV3JpdGUoIHRtcEJ1ZiwgMCwgNCk7CisgICAgSW5jKCBvZmYsIDMpOworICAgIERlYyggbGVuLCAzKTsKICAgZW5kOwotICBUcmFuc3BvcnQuV3JpdGUoIHRtcCk7ICAvLyBub3cgd3JpdGUgYWxsIHRoZSBkYXRhCisKKyAgLy8gRW5jb2RlIHJlbWFpbmRlciwgaWYgYW55CisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIGNudCA6PSBCYXNlNjRVdGlscy5FbmNvZGUoIGIsIG9mZiwgbGVuLCB0bXBCdWYsIDApOworICAgIFRyYW5zcG9ydC5Xcml0ZSggdG1wQnVmLCAwLCBjbnQpOworICBlbmQ7CiAKICAgVHJhbnNwb3J0LldyaXRlKCBRVU9URSk7CiBlbmQ7CkBAIC02NzYsNyArNjc5LDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7CiBiZWdpbgogICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCiAKQEAgLTY5NSw3ICs2OTgsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOwogYmVnaW4KICAgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CiBlbmQ7CkBAIC03MDcsNyArNzEwLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZCA6IElGaWVsZCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZCA6IFRUaHJpZnRGaWVsZCk7CiBiZWdpbgogICBXcml0ZUpTT05JbnRlZ2VyKGZpZWxkLklEKTsKICAgV3JpdGVKU09OT2JqZWN0U3RhcnQ7CkBAIC03MjYsNyArNzI5LDcgQEAKICAgLy8gbm90aGluZyB0byBkbwogZW5kOwogCi1wcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogYmVnaW4KICAgV3JpdGVKU09OQXJyYXlTdGFydDsKICAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLktleVR5cGUpKTsKQEAgLTc0Myw3ICs3NDYsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBXcml0ZUpTT05BcnJheVN0YXJ0OwogICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBsaXN0LkVsZW1lbnRUeXBlKSk7CkBAIC03NTcsNyArNzYwLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CiBiZWdpbgogICBXcml0ZUpTT05BcnJheVN0YXJ0OwogICBXcml0ZUpTT05TdHJpbmcoIEdldFR5cGVOYW1lRm9yVHlwZUlEKCBzZXRfLkVsZW1lbnRUeXBlKSk7CkBAIC04MTUsMTAgKzgxOCwxNCBAQAogCiBmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkSlNPTlN0cmluZyggc2tpcENvbnRleHQgOiBCb29sZWFuKSA6IFRCeXRlczsKIHZhciBidWZmZXIgOiBUTWVtb3J5U3RyZWFtOwotICAgIGNoIDogQnl0ZTsKKyAgICBjaCAgOiBCeXRlOworICAgIHdjaCA6IFdvcmQ7CisgICAgaGlnaFN1cm9nYXRlOiBDaGFyOworICAgIHN1cnJvZ2F0ZVBhaXJzOiBBcnJheVswLi4xXSBvZiBDaGFyOwogICAgIG9mZiA6IEludGVnZXI7CiAgICAgdG1wIDogVEJ5dGVzOwogYmVnaW4KKyAgaGlnaFN1cm9nYXRlIDo9ICMwOwogICBidWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CiAgIHRyeQogICAgIGlmIG5vdCBza2lwQ29udGV4dApAQCAtODMyLDI3ICs4MzksNTYgQEAKICAgICAgIGlmIChjaCA9IFFVT1RFWzBdKQogICAgICAgdGhlbiBCcmVhazsKIAotICAgICAgaWYgKGNoID0gRVNDU0VRWzBdKQotICAgICAgdGhlbiBiZWdpbgotICAgICAgICBjaCA6PSBGUmVhZGVyLlJlYWQ7Ci0gICAgICAgIGlmIChjaCA9IEVTQ1NFUVsxXSkKLSAgICAgICAgdGhlbiBiZWdpbgotICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggWkVST1swXSk7Ci0gICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBaRVJPWzBdKTsKLSAgICAgICAgICBTZXRMZW5ndGgoIHRtcCwgMik7Ci0gICAgICAgICAgVHJhbnNwb3J0LlJlYWRBbGwoIHRtcCwgMCwgMik7Ci0gICAgICAgICAgY2ggOj0gKEhleFZhbCh0bXBbMF0pIHNobCA0KSArIEhleFZhbCh0bXBbMV0pOwotICAgICAgICBlbmQKLSAgICAgICAgZWxzZSBiZWdpbgotICAgICAgICAgIG9mZiA6PSBQb3MoIENoYXIoY2gpLCBFU0NBUEVfQ0hBUlMpOwotICAgICAgICAgIGlmIG9mZiA8IDEKLSAgICAgICAgICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdFeHBlY3RlZCBjb250cm9sIGNoYXInKTsKLSAgICAgICAgICBjaCA6PSBCeXRlKCBFU0NBUEVfQ0hBUl9WQUxTW29mZl0pOwotICAgICAgICBlbmQ7CisgICAgICAvLyBjaGVjayBmb3IgZXNjYXBlcworICAgICAgaWYgKGNoIDw+IEVTQ1NFUVswXSkgdGhlbiBiZWdpbgorICAgICAgICBidWZmZXIuV3JpdGUoIGNoLCAxKTsKKyAgICAgICAgQ29udGludWU7CiAgICAgICBlbmQ7Ci0gICAgICBidWZmZXIuV3JpdGUoIGNoLCAxKTsKKworICAgICAgLy8gZGlzdHVpbmd1aXNoIGJldHdlZW4gXHVOTk5OIGFuZCBcPworICAgICAgY2ggOj0gRlJlYWRlci5SZWFkOworICAgICAgaWYgKGNoIDw+IEVTQ1NFUVsxXSkKKyAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgb2ZmIDo9IFBvcyggQ2hhcihjaCksIEVTQ0FQRV9DSEFSUyk7CisgICAgICAgIGlmIG9mZiA8IDEKKyAgICAgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGNvbnRyb2wgY2hhcicpOworICAgICAgICBjaCA6PSBCeXRlKCBFU0NBUEVfQ0hBUl9WQUxTW29mZl0pOworICAgICAgICBidWZmZXIuV3JpdGUoIGNoLCAxKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisKKyAgICAgIC8vIGl0IGlzIFx1WFhYWAorICAgICAgU2V0TGVuZ3RoKCB0bXAsIDQpOworICAgICAgVHJhbnNwb3J0LlJlYWRBbGwoIHRtcCwgMCwgNCk7CisgICAgICB3Y2ggOj0gKEhleFZhbCh0bXBbMF0pIHNobCAxMikKKyAgICAgICAgICAgKyAoSGV4VmFsKHRtcFsxXSkgc2hsIDgpCisgICAgICAgICAgICsgKEhleFZhbCh0bXBbMl0pIHNobCA0KQorICAgICAgICAgICArICBIZXhWYWwodG1wWzNdKTsKKworICAgICAgLy8gd2UgbmVlZCB0byBtYWtlIFVURjggYnl0ZXMgZnJvbSBpdCwgdG8gYmUgZGVjb2RlZCBsYXRlcgorICAgICAgaWYgQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZShjaGFyKHdjaCkpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgICAgIHRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXInKTsKKyAgICAgICAgaGlnaFN1cm9nYXRlIDo9IGNoYXIod2NoKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoY2hhcih3Y2gpKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIGhpZ2hTdXJvZ2F0ZSA9ICMwCisgICAgICAgIHRoZW4gVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdFeHBlY3RlZCBoaWdoIHN1cnJvZ2F0ZSBjaGFyJyk7CisgICAgICAgIHN1cnJvZ2F0ZVBhaXJzWzBdIDo9IGhpZ2hTdXJvZ2F0ZTsKKyAgICAgICAgc3Vycm9nYXRlUGFpcnNbMV0gOj0gY2hhcih3Y2gpOworICAgICAgICB0bXAgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3Vycm9nYXRlUGFpcnMpOworICAgICAgICBidWZmZXIuV3JpdGUoIHRtcFswXSwgTGVuZ3RoKHRtcCkpOworICAgICAgICBoaWdoU3Vyb2dhdGUgOj0gIzA7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgdG1wIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKENoYXIod2NoKSk7CisgICAgICAgIGJ1ZmZlci5Xcml0ZSggdG1wWzBdLCBMZW5ndGgodG1wKSk7CisgICAgICBlbmQ7CiAgICAgZW5kOwogCisgICAgaWYgaGlnaFN1cm9nYXRlIDw+ICMwCisgICAgdGhlbiByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0V4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhcicpOworCiAgICAgU2V0TGVuZ3RoKCByZXN1bHQsIGJ1ZmZlci5TaXplKTsKICAgICBpZiBidWZmZXIuU2l6ZSA+IDAgdGhlbiBNb3ZlKCBidWZmZXIuTWVtb3J5XiwgcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSk7CiAKQEAgLTkwNSw4ICs5NDEsNyBAQAogICAgIHJlc3VsdCA6PSBTdHJUb0ludDY0KHN0cik7CiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIGJlZ2luCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOworICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKQEAgLTkyOCw3ICs5NjMsNyBAQAogICAgIGFuZCBub3QgTWF0aC5Jc0luZmluaXRlKGR1YikKICAgICB0aGVuIGJlZ2luCiAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiAgU2VsZiBjYXNlCi0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQnKTsKICAgICBlbmQ7CiAgICAgcmVzdWx0IDo9IGR1YjsKICAgICBFeGl0OwpAQCAtOTQzLDIwICs5NzgsNDQgQEAKICAgICByZXN1bHQgOj0gU3RyVG9GbG9hdCggc3RyLCBJTlZBUklBTlRfQ1VMVFVSRSk7CiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uCi0gICAgZG8gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZSggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhICgnK3N0cisnKSAoJytlLk1lc3NhZ2UrJyknKTsKKyAgICBkbyByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUoJ0JhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEgKCcrc3RyKycpICgnK2UuTWVzc2FnZSsnKScpOwogICBlbmQ7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEpTT05CYXNlNjQgOiBUQnl0ZXM7CiB2YXIgYiA6IFRCeXRlczsKLSAgICBzdHIgOiBzdHJpbmc7CisgICAgbGVuLCBvZmYsIHNpemUgOiBJbnRlZ2VyOwogYmVnaW4KICAgYiA6PSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CiAKLSAgU2V0U3RyaW5nKCBzdHIsIFBBbnNpQ2hhcihiKSwgTGVuZ3RoKGIpKTsKLSAgcmVzdWx0IDo9IFRJZERlY29kZXJNSU1FLkRlY29kZUJ5dGVzKCBzdHIpOworICBsZW4gOj0gTGVuZ3RoKGIpOworICBvZmYgOj0gMDsKKyAgc2l6ZSA6PSAwOworCisgIC8vIHJlZHVjZSBsZW4gdG8gaWdub3JlIGZpbGwgYnl0ZXMKKyAgRGVjKGxlbik7CisgIHdoaWxlIChsZW4gPj0gMCkgYW5kIChiW2xlbl0gPSBCeXRlKCc9JykpIGRvIERlYyhsZW4pOworICBJbmMobGVuKTsKKworICAvLyByZWFkICYgZGVjb2RlIGZ1bGwgYnl0ZSB0cmlwbGV0cyA9IDQgc291cmNlIGJ5dGVzCisgIHdoaWxlIChsZW4gPj0gNCkgZG8gYmVnaW4KKyAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICBJbmMoIHNpemUsIEJhc2U2NFV0aWxzLkRlY29kZSggYiwgb2ZmLCA0LCBiLCBzaXplKSk7IC8vIGRlY29kZWQgaW4gcGxhY2UKKyAgICBJbmMoIG9mZiwgNCk7CisgICAgRGVjKCBsZW4sIDQpOworICBlbmQ7CisKKyAgLy8gRG9uJ3QgZGVjb2RlIGlmIHdlIGhpdCB0aGUgZW5kIG9yIGdvdCBhIHNpbmdsZSBsZWZ0b3ZlciBieXRlIChpbnZhbGlkCisgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgaWYgbGVuID4gMSB0aGVuIGJlZ2luCisgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgIEluYyggc2l6ZSwgQmFzZTY0VXRpbHMuRGVjb2RlKCBiLCBvZmYsIGxlbiwgYiwgc2l6ZSkpOyAvLyBkZWNvZGVkIGluIHBsYWNlCisgIGVuZDsKKworICAvLyByZXNpemUgdG8gZmluYWwgc2l6ZSBhbmQgcmV0dXJuIHRoZSBkYXRhCisgIFNldExlbmd0aCggYiwgc2l6ZSk7CisgIHJlc3VsdCA6PSBiOwogZW5kOwogCiAKQEAgLTk5MCwxNSArMTA0OSwxNSBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCiAKLSAgcmVzdWx0IDo9IFRNZXNzYWdlSW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBpZiBSZWFkSlNPTkludGVnZXIgPD4gVkVSU0lPTgotICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgJ01lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLicpOworICB0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4nKTsKIAogICByZXN1bHQuTmFtZSAgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyggRkFMU0UpKTsKICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEpTT05JbnRlZ2VyKTsKQEAgLTEwMTIsMTAgKzEwNzEsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW4gOiBJU3RydWN0IDsKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IFRUaHJpZnRTdHJ1Y3QgOwogYmVnaW4KICAgUmVhZEpTT05PYmplY3RTdGFydDsKLSAgcmVzdWx0IDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnJyk7CisgIEluaXQoIHJlc3VsdCk7CiBlbmQ7CiAKIApAQCAtMTAyNSwxMSArMTA4NCwxMSBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luIDogSUZpZWxkOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW4gOiBUVGhyaWZ0RmllbGQ7CiB2YXIgY2ggOiBCeXRlOwogICAgIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBURmllbGRJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgY2ggOj0gRlJlYWRlci5QZWVrOwogICBpZiBjaCA9IFJCUkFDRVswXQogICB0aGVuIHJlc3VsdC5UeXBlXyA6PSBUVHlwZS5TdG9wCkBAIC0xMDQ5LDEwICsxMTA4LDEwIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luIDogSU1hcDsKK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbiA6IFRUaHJpZnRNYXA7CiB2YXIgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRNYXBJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgUmVhZEpTT05BcnJheVN0YXJ0OwogCiAgIHN0ciA6PSBTeXNVdGlscy5URW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRKU09OU3RyaW5nKEZBTFNFKSk7CkBAIC0xMDczLDEwICsxMTMyLDEwIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbiA6IElMaXN0OworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbiA6IFRUaHJpZnRMaXN0OwogdmFyIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBUTGlzdEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKQEAgLTEwOTEsMTAgKzExNTAsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW4gOiBJU2V0OworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFNldEJlZ2luIDogVFRocmlmdFNldDsKIHZhciBzdHIgOiBzdHJpbmc7CiBiZWdpbgotICByZXN1bHQgOj0gVFNldEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKQEAgLTExNzQsNiArMTIzMyw1IEBACiAgIEluaXRCeXRlcyggUkJSQUNLRVQsICBbQnl0ZSgnXScpXSk7CiAgIEluaXRCeXRlcyggUVVPVEUsICAgICBbQnl0ZSgnIicpXSk7CiAgIEluaXRCeXRlcyggQkFDS1NMQVNILCBbQnl0ZSgnXCcpXSk7Ci0gIEluaXRCeXRlcyggWkVSTywgICAgICBbQnl0ZSgnMCcpXSk7CiAgIEluaXRCeXRlcyggRVNDU0VRLCAgICBbQnl0ZSgnXCcpLEJ5dGUoJ3UnKSxCeXRlKCcwJyksQnl0ZSgnMCcpXSk7CiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYTM4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwpAQCAtMCwwICsxLDEwNyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXg7CisKK2ludGVyZmFjZQorCit1c2VzIFRocmlmdC5Qcm90b2NvbDsKKworeyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvcgorICB0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorICBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorCisgIE5PVEU6IFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4KKyAgT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisKKyAgVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorCisgICAgICBUU29ja2V0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAgIHRyYW5zcG9ydC5vcGVuKCk7CisKKyAgICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKworICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgICAgICBDYWxjdWxhdG9yLkNsaWVudCBzZXJ2aWNlID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG1wKTsKKworICAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOworICAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworCit9CisKK3R5cGUKKyAgVE11bHRpcGxleGVkUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQorICBwdWJsaWMgY29uc3QKKyAgICB7ICBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lIH0KKyAgICBTRVBBUkFUT1IgPSAnOic7CisKKyAgcHJpdmF0ZQorICAgICBGU2VydmljZU5hbWUgOiBTdHJpbmc7CisKKyAgcHVibGljCisgICAgeyBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBzZXJ2ZXIuCisgICAgICBUaGUgc2VydmljZU5hbWUgaXMgcmVxdWlyZWQgYXMgaXQgaXMgcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcKKyAgICAgIHNlcnZlciBjYW4gYnJva2VyIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKworICAgICAgQXJnczoKKyAgICAgICAgcHJvdG9jb2wgLi4uLi4uLiBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbC4KKyAgICAgICAgc2VydmljZU5hbWUgLi4uLiBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhU2VydmljZU5hbWUgOiBzdHJpbmcpOworCisgICAgeyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgU0VQQVJBVE9SLgorICAgICAgQXJnczogVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgfQorICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworCitjb25zdHJ1Y3RvciBUTXVsdGlwbGV4ZWRQcm90b2NvbC5DcmVhdGUoY29uc3QgYVByb3RvY29sOiBJUHJvdG9jb2w7IGNvbnN0IGFTZXJ2aWNlTmFtZTogc3RyaW5nKTsKK2JlZ2luCisgIEFTU0VSVCggYVNlcnZpY2VOYW1lIDw+ICcnKTsKKyAgaW5oZXJpdGVkIENyZWF0ZShhUHJvdG9jb2wpOworICBGU2VydmljZU5hbWUgOj0gYVNlcnZpY2VOYW1lOworZW5kOworCisKK3Byb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CisvLyBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgordmFyIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOworYmVnaW4KKyAgY2FzZSBtc2cuVHlwZV8gb2YKKyAgICBUTWVzc2FnZVR5cGUuQ2FsbCwKKyAgICBUTWVzc2FnZVR5cGUuT25ld2F5IDogYmVnaW4KKyAgICAgIEluaXQoIG5ld01zZywgRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKyAgICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbmV3TXNnKTsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbXNnKTsKKyAgZW5kOworZW5kOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKaW5kZXggMzNlMTdkNy4uMzY1MDljYSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCkBAIC0xLDEyMzIgKzEsMTM4OSBAQAotKCoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICopDQotDQoteyRTQ09QRURFTlVNUyBPTn0NCi0NCi11bml0IFRocmlmdC5Qcm90b2NvbDsNCi0NCi1pbnRlcmZhY2UNCi0NCi11c2VzDQotICBDbGFzc2VzLA0KLSAgU3lzVXRpbHMsDQotICBDb250bnJzLA0KLSAgVGhyaWZ0LlN0cmVhbSwNCi0gIFRocmlmdC5Db2xsZWN0aW9ucywNCi0gIFRocmlmdC5UcmFuc3BvcnQ7DQotDQotdHlwZQ0KLQ0KLSAgVFR5cGUgPSAoDQotICAgIFN0b3AgPSAwLA0KLSAgICBWb2lkID0gMSwNCi0gICAgQm9vbF8gPSAyLA0KLSAgICBCeXRlXyA9IDMsDQotICAgIERvdWJsZV8gPSA0LA0KLSAgICBJMTYgPSA2LA0KLSAgICBJMzIgPSA4LA0KLSAgICBJNjQgPSAxMCwNCi0gICAgU3RyaW5nXyA9IDExLA0KLSAgICBTdHJ1Y3QgPSAxMiwNCi0gICAgTWFwID0gMTMsDQotICAgIFNldF8gPSAxNCwNCi0gICAgTGlzdCA9IDE1DQotICApOw0KLQ0KLSAgVE1lc3NhZ2VUeXBlID0gKA0KLSAgICBDYWxsID0gMSwNCi0gICAgUmVwbHkgPSAyLA0KLSAgICBFeGNlcHRpb24gPSAzLA0KLSAgICBPbmV3YXkgPSA0DQotICApOw0KLQ0KLSAgSVByb3RvY29sID0gaW50ZXJmYWNlOw0KLSAgSVN0cnVjdCA9IGludGVyZmFjZTsNCi0NCi0gIElQcm90b2NvbEZhY3RvcnkgPSBpbnRlcmZhY2UNCi0gICAgWyd7N0NENjRBMTAtNEU5Ri00RTk5LTkzQkYtNzA4QTMxRjRBNjdCfSddDQotICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsNCi0gIGVuZDsNCi0NCi0gIFRUaHJpZnRTdHJpbmdCdWlsZGVyID0gY2xhc3MoIFRTdHJpbmdCdWlsZGVyKQ0KLSAgcHVibGljDQotICAgIGZ1bmN0aW9uIEFwcGVuZChjb25zdCBWYWx1ZTogVEJ5dGVzKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOw0KLSAgICBmdW5jdGlvbiBBcHBlbmQoY29uc3QgVmFsdWU6IElUaHJpZnRDb250YWluZXIpOiBUU3RyaW5nQnVpbGRlcjsgb3ZlcmxvYWQ7DQotICBlbmQ7DQotDQotICBUUHJvdG9jb2xFeGNlcHRpb24gPSBjbGFzcyggRXhjZXB0aW9uICkNCi0gIHB1YmxpYw0KLSAgICBjb25zdA0KLSAgICAgIFVOS05PV04gOiBJbnRlZ2VyID0gMDsNCi0gICAgICBJTlZBTElEX0RBVEEgOiBJbnRlZ2VyID0gMTsNCi0gICAgICBORUdBVElWRV9TSVpFIDogSW50ZWdlciA9IDI7DQotICAgICAgU0laRV9MSU1JVCA6IEludGVnZXIgPSAzOw0KLSAgICAgIEJBRF9WRVJTSU9OIDogSW50ZWdlciA9IDQ7DQotICAgICAgTk9UX0lNUExFTUVOVEVEIDogSW50ZWdlciA9IDU7DQotICBwcm90ZWN0ZWQNCi0gICAgRlR5cGUgOiBJbnRlZ2VyOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHlwZV86IEludGVnZXIgKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggdHlwZV86IEludGVnZXI7IGNvbnN0IG1zZzogc3RyaW5nKTsgb3ZlcmxvYWQ7DQotICBlbmQ7DQotDQotICBJTWFwID0gaW50ZXJmYWNlDQotICAgIFsnezMwNTMxRDk3LTdFMDYtNDIzMy1CODAwLUMzRjUzQ0NEMjNFN30nXQ0KLSAgICBmdW5jdGlvbiBHZXRLZXlUeXBlOiBUVHlwZTsNCi0gICAgcHJvY2VkdXJlIFNldEtleVR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldFZhbHVlVHlwZTogVFR5cGU7DQotICAgIHByb2NlZHVyZSBTZXRWYWx1ZVR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsNCi0gICAgcHJvcGVydHkgS2V5VHlwZTogVFR5cGUgcmVhZCBHZXRLZXlUeXBlIHdyaXRlIFNldEtleVR5cGU7DQotICAgIHByb3BlcnR5IFZhbHVlVHlwZTogVFR5cGUgcmVhZCBHZXRWYWx1ZVR5cGUgd3JpdGUgU2V0VmFsdWVUeXBlOw0KLSAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50Ow0KLSAgZW5kOw0KLQ0KLSAgVE1hcEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNYXApDQotICBwcml2YXRlDQotICAgIEZWYWx1ZVR5cGU6IFRUeXBlOw0KLSAgICBGS2V5VHlwZTogVFR5cGU7DQotICAgIEZDb3VudDogSW50ZWdlcjsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXRLZXlUeXBlOiBUVHlwZTsNCi0gICAgcHJvY2VkdXJlIFNldEtleVR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldFZhbHVlVHlwZTogVFR5cGU7DQotICAgIHByb2NlZHVyZSBTZXRWYWx1ZVR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsNCi0gIHB1YmxpYw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFWYWx1ZVR5cGU6IFRUeXBlOyBBS2V5VHlwZTogVFR5cGU7IEFDb3VudDogSW50ZWdlcik7IG92ZXJsb2FkOw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOw0KLSAgZW5kOw0KLQ0KLSAgSUxpc3QgPSBpbnRlcmZhY2UNCi0gICAgWyd7Njc2M0UxRUEtQTkzNC00NDcyLTkwNEYtMDA4Mzk4MEI5Qjg3fSddDQotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsNCi0gICAgcHJvY2VkdXJlIFNldEVsZW1lbnRUeXBlKCBWYWx1ZTogVFR5cGUpOw0KLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsNCi0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7DQotICAgIHByb3BlcnR5IEVsZW1lbnRUeXBlOiBUVHlwZSByZWFkIEdldEVsZW1lbnRUeXBlIHdyaXRlIFNldEVsZW1lbnRUeXBlOw0KLSAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50Ow0KLSAgZW5kOw0KLQ0KLSAgVExpc3RJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTGlzdCkNCi0gIHByaXZhdGUNCi0gICAgRkVsZW1lbnRUeXBlOiBUVHlwZTsNCi0gICAgRkNvdW50IDogSW50ZWdlcjsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXRFbGVtZW50VHlwZTogVFR5cGU7DQotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsNCi0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7DQotICBlbmQ7DQotDQotICBJU2V0ID0gaW50ZXJmYWNlDQotICAgIFsne0E4NjcxNzAwLTc1MTQtNEMxRS04QTA1LTYyNzg2ODcyMDA1Rn0nXQ0KLSAgICBmdW5jdGlvbiBHZXRFbGVtZW50VHlwZTogVFR5cGU7DQotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsNCi0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOw0KLSAgICBwcm9wZXJ0eSBFbGVtZW50VHlwZTogVFR5cGUgcmVhZCBHZXRFbGVtZW50VHlwZSB3cml0ZSBTZXRFbGVtZW50VHlwZTsNCi0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsNCi0gIGVuZDsNCi0NCi0gIFRTZXRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2V0KQ0KLSAgcHJpdmF0ZQ0KLSAgICBGQ291bnQ6IEludGVnZXI7DQotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7DQotICBwcm90ZWN0ZWQNCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOw0KLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsNCi0gIHB1YmxpYw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFFbGVtZW50VHlwZTogVFR5cGU7IEFDb3VudDogSW50ZWdlcik7IG92ZXJsb2FkOw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOw0KLSAgZW5kOw0KLQ0KLSAgSU1lc3NhZ2UgPSBpbnRlcmZhY2UNCi0gICAgWyd7OUUzNjhCNEEtQjFGQS00M0U3LThDRjUtNTZDNjZEMjU2Q0E3fSddDQotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsNCi0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOw0KLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUTWVzc2FnZVR5cGU7DQotICAgIHByb2NlZHVyZSBTZXRUeXBlKCBWYWx1ZTogVE1lc3NhZ2VUeXBlKTsNCi0gICAgZnVuY3Rpb24gR2V0U2VxSUQ6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBTZXRTZXFJRCggVmFsdWU6IEludGVnZXIpOw0KLSAgICBwcm9wZXJ0eSBOYW1lOiBzdHJpbmcgcmVhZCBHZXROYW1lIHdyaXRlIFNldE5hbWU7DQotICAgIHByb3BlcnR5IFR5cGVfOiBUTWVzc2FnZVR5cGUgcmVhZCBHZXRUeXBlIHdyaXRlIFNldFR5cGU7DQotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgR2V0U2VxSUQgd3JpdGUgU2V0U2VxSUQ7DQotICBlbmQ7DQotDQotICBUTWVzc2FnZUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNZXNzYWdlICkNCi0gIHByaXZhdGUNCi0gICAgRk5hbWU6IHN0cmluZzsNCi0gICAgRk1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7DQotICAgIEZTZXFJRDogSW50ZWdlcjsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7DQotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsNCi0gICAgZnVuY3Rpb24gR2V0VHlwZTogVE1lc3NhZ2VUeXBlOw0KLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRNZXNzYWdlVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldFNlcUlEOiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0U2VxSUQoIFZhbHVlOiBJbnRlZ2VyKTsNCi0gIHB1YmxpYw0KLSAgICBwcm9wZXJ0eSBOYW1lOiBzdHJpbmcgcmVhZCBGTmFtZSB3cml0ZSBGTmFtZTsNCi0gICAgcHJvcGVydHkgVHlwZV86IFRNZXNzYWdlVHlwZSByZWFkIEZNZXNzYWdlVHlwZSB3cml0ZSBGTWVzc2FnZVR5cGU7DQotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgRlNlcUlEIHdyaXRlIEZTZXFJRDsNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTmFtZTogc3RyaW5nOyBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsgQVNlcUlEOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7DQotICBlbmQ7DQotDQotICBJRmllbGQgPSBpbnRlcmZhY2UNCi0gICAgWyd7RjBENDNCRTUtNzg4My00NDJFLTgzRkYtMDU4MENDNjMyQjcyfSddDQotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsNCi0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOw0KLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUVHlwZTsNCi0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldElkOiBTbWFsbEludDsNCi0gICAgcHJvY2VkdXJlIFNldElkKCBWYWx1ZTogU21hbGxJbnQpOw0KLSAgICBwcm9wZXJ0eSBOYW1lOiBzdHJpbmcgcmVhZCBHZXROYW1lIHdyaXRlIFNldE5hbWU7DQotICAgIHByb3BlcnR5IFR5cGVfOiBUVHlwZSByZWFkIEdldFR5cGUgd3JpdGUgU2V0VHlwZTsNCi0gICAgcHJvcGVydHkgSWQ6IFNtYWxsSW50IHJlYWQgR2V0SWQgd3JpdGUgU2V0SWQ7DQotICBlbmQ7DQotDQotICBURmllbGRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJRmllbGQpDQotICBwcml2YXRlDQotICAgIEZOYW1lIDogc3RyaW5nOw0KLSAgICBGVHlwZSA6IFRUeXBlOw0KLSAgICBGSWQgICA6IFNtYWxsSW50Ow0KLSAgcHJvdGVjdGVkDQotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsNCi0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOw0KLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUVHlwZTsNCi0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUVHlwZSk7DQotICAgIGZ1bmN0aW9uIEdldElkOiBTbWFsbEludDsNCi0gICAgcHJvY2VkdXJlIFNldElkKCBWYWx1ZTogU21hbGxJbnQpOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQU5hbWU6IHN0cmluZzsgY29uc3QgQVR5cGU6IFRUeXBlOyBBSWQ6IFNtYWxsSW50KTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZTsgb3ZlcmxvYWQ7DQotICBlbmQ7DQotDQotICBUUHJvdG9jb2xVdGlsID0gY2xhc3MNCi0gIHB1YmxpYw0KLSAgICBjbGFzcyBwcm9jZWR1cmUgU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOw0KLSAgZW5kOw0KLQ0KLSAgSVByb3RvY29sID0gaW50ZXJmYWNlDQotICAgIFsne0ZEOTVDMTUxLTE1MjctNEM5Ni04MTM0LUI5MDJCRkM0QjRGQ30nXQ0KLSAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7DQotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7DQotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7DQotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7DQotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7DQotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7DQotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7DQotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7DQotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7DQotICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7DQotICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7DQotICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7DQotICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsNCi0NCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7DQotICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOw0KLSAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7DQotICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOw0KLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOw0KLSAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7DQotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsNCi0gICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsNCi0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7DQotICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOw0KLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7DQotICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7DQotICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOw0KLSAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7DQotICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50Ow0KLSAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOw0KLSAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsNCi0gICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7DQotICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsNCi0gICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOw0KLSAgICBmdW5jdGlvbiBSZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsNCi0gICAgcHJvcGVydHkgVHJhbnNwb3J0OiBJVHJhbnNwb3J0IHJlYWQgR2V0VHJhbnNwb3J0Ow0KLSAgZW5kOw0KLQ0KLSAgVFByb3RvY29sSW1wbCA9IGNsYXNzIGFic3RyYWN0KCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sKQ0KLSAgcHJvdGVjdGVkDQotICAgIEZUcmFucyA6IElUcmFuc3BvcnQ7DQotICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsNCi0gIHB1YmxpYw0KLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZUkzMiggaTMyOiBJbnRlZ2VyKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOyB2aXJ0dWFsOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgdmlydHVhbDsNCi0gICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0NCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyB2aXJ0dWFsOyBhYnN0cmFjdDsNCi0gICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmc6IHN0cmluZzsgdmlydHVhbDsNCi0gICAgZnVuY3Rpb24gUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7IHZpcnR1YWw7DQotDQotICAgIHByb3BlcnR5IFRyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFRyYW5zcG9ydDsNCi0NCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCB0cmFuczogSVRyYW5zcG9ydCApOw0KLSAgZW5kOw0KLQ0KLSAgSUJhc2UgPSBpbnRlcmZhY2UNCi0gICAgWyd7MDhEOUJBQTgtNUVBQS00MTBGLUI1MEItQUMyRTZFNUU0MTU1fSddDQotICAgIGZ1bmN0aW9uIFRvU3RyaW5nOiBzdHJpbmc7DQotICAgIHByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsNCi0gIGVuZDsNCi0NCi0gIElTdHJ1Y3QgPSBpbnRlcmZhY2UNCi0gICAgWyd7NURDRTM5QUEtQzkxNi00QkM3LUE3OUItOTZBMEMzNkIyMjIwfSddDQotICAgIHByb2NlZHVyZSBTZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOw0KLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7DQotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsNCi0gIGVuZDsNCi0NCi0gIFRTdHJ1Y3RJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU3RydWN0ICkNCi0gIHByaXZhdGUNCi0gICAgRk5hbWU6IHN0cmluZzsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7DQotICAgIHByb2NlZHVyZSBTZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQU5hbWU6IHN0cmluZyk7DQotICBlbmQ7DQotDQotICBUQmluYXJ5UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwgKQ0KLSAgcHJvdGVjdGVkDQotICAgIGNvbnN0DQotICAgICAgVkVSU0lPTl9NQVNLIDogQ2FyZGluYWwgPSAkZmZmZjAwMDA7DQotICAgICAgVkVSU0lPTl8xIDogQ2FyZGluYWwgPSAkODAwMTAwMDA7DQotICBwcm90ZWN0ZWQNCi0gICAgRlN0cmljdFJlYWQgOiBCb29sZWFuOw0KLSAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOw0KLSAgICBGUmVhZExlbmd0aCA6IEludGVnZXI7DQotICAgIEZDaGVja1JlYWRMZW5ndGggOiBCb29sZWFuOw0KLQ0KLSAgcHJpdmF0ZQ0KLSAgICBmdW5jdGlvbiBSZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7DQotICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmdCb2R5KCBzaXplOiBJbnRlZ2VyKTogc3RyaW5nOw0KLSAgICBwcm9jZWR1cmUgQ2hlY2tSZWFkTGVuZ3RoKCBsZW46IEludGVnZXIgKTsNCi0gIHB1YmxpYw0KLQ0KLSAgICB0eXBlDQotICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbEZhY3RvcnkpDQotICAgICAgcHJvdGVjdGVkDQotICAgICAgICBGU3RyaWN0UmVhZCA6IEJvb2xlYW47DQotICAgICAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOw0KLSAgICAgIHB1YmxpYw0KLSAgICAgICAgZnVuY3Rpb24gR2V0UHJvdG9jb2woIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTogSVByb3RvY29sOw0KLSAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBU3RyaWN0UmVhZCwgQVN0cmljdFdyaXRlOiBCb29sZWFuICk7IG92ZXJsb2FkOw0KLSAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsNCi0gICAgICBlbmQ7DQotDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydDsgc3RyaWN0UmVhZDogQm9vbGVhbjsgc3RyaWN0V3JpdGU6IEJvb2xlYW4pOyBvdmVybG9hZDsNCi0NCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsNCi0NCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZEk2NDogSW50NjQ7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgb3ZlcnJpZGU7DQotDQotICAgIHByb2NlZHVyZSBTZXRSZWFkTGVuZ3RoKCByZWFkTGVuZ3RoOiBJbnRlZ2VyICk7DQotICBlbmQ7DQotDQotaW1wbGVtZW50YXRpb24NCi0NCi1mdW5jdGlvbiBDb252ZXJ0SW50NjRUb0RvdWJsZSggY29uc3QgbjogSW50NjQpOiBEb3VibGU7DQotYmVnaW4NCi0gIEFTU0VSVCggU2l6ZU9mKG4pID0gU2l6ZU9mKFJlc3VsdCkpOw0KLSAgU3lzdGVtLk1vdmUoIG4sIFJlc3VsdCwgU2l6ZU9mKFJlc3VsdCkpOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBDb252ZXJ0RG91YmxlVG9JbnQ2NCggY29uc3QgZDogRG91YmxlKTogSW50NjQ7DQotYmVnaW4NCi0gIEFTU0VSVCggU2l6ZU9mKGQpID0gU2l6ZU9mKFJlc3VsdCkpOw0KLSAgU3lzdGVtLk1vdmUoIGQsIFJlc3VsdCwgU2l6ZU9mKFJlc3VsdCkpOw0KLWVuZDsNCi0NCi17IFRGaWVsZEltcGwgfQ0KLQ0KLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlKGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsNCi0gIEFJZDogU21hbGxJbnQpOw0KLWJlZ2luDQotICBGTmFtZSA6PSBBTmFtZTsNCi0gIEZUeXBlIDo9IEFUeXBlOw0KLSAgRklkIDo9IEFJZDsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVEZpZWxkSW1wbC5DcmVhdGU7DQotYmVnaW4NCi0gIEZOYW1lIDo9ICcnOw0KLSAgRlR5cGUgOj0gTG93KFRUeXBlKTsNCi0gIEZJZCAgIDo9IDA7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0SWQ6IFNtYWxsSW50Ow0KLWJlZ2luDQotICBSZXN1bHQgOj0gRklkOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBURmllbGRJbXBsLkdldE5hbWU6IHN0cmluZzsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZOYW1lOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBURmllbGRJbXBsLkdldFR5cGU6IFRUeXBlOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRlR5cGU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldElkKFZhbHVlOiBTbWFsbEludCk7DQotYmVnaW4NCi0gIEZJZCA6PSBWYWx1ZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRGaWVsZEltcGwuU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsNCi1iZWdpbg0KLSAgRk5hbWUgOj0gVmFsdWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldFR5cGUoVmFsdWU6IFRUeXBlKTsNCi1iZWdpbg0KLSAgRlR5cGUgOj0gVmFsdWU7DQotZW5kOw0KLQ0KLXsgVFByb3RvY29sSW1wbCB9DQotDQotY29uc3RydWN0b3IgVFByb3RvY29sSW1wbC5DcmVhdGUodHJhbnM6IElUcmFuc3BvcnQpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlOw0KLSAgRlRyYW5zIDo9IHRyYW5zOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUUHJvdG9jb2xJbXBsLkdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZUcmFuczsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFByb3RvY29sSW1wbC5SZWFkQW5zaVN0cmluZzogQW5zaVN0cmluZzsNCi12YXINCi0gIGIgOiBUQnl0ZXM7DQotICBsZW4gOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gJyc7DQotICBiIDo9IFJlYWRCaW5hcnk7DQotICBsZW4gOj0gTGVuZ3RoKCBiICk7DQotICBpZiBsZW4gPiAwIHRoZW4NCi0gIGJlZ2luDQotICAgIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOw0KLSAgICBTeXN0ZW0uTW92ZSggYlswXSwgUG9pbnRlcihSZXN1bHQpXiwgbGVuICk7DQotICBlbmQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRQcm90b2NvbEltcGwuUmVhZFN0cmluZzogc3RyaW5nOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkQmluYXJ5ICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUUHJvdG9jb2xJbXBsLldyaXRlQW5zaVN0cmluZyhjb25zdCBzOiBBbnNpU3RyaW5nKTsNCi12YXINCi0gIGIgOiBUQnl0ZXM7DQotICBsZW4gOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBsZW4gOj0gTGVuZ3RoKHMpOw0KLSAgU2V0TGVuZ3RoKCBiLCBsZW4pOw0KLSAgaWYgbGVuID4gMCB0aGVuDQotICBiZWdpbg0KLSAgICBTeXN0ZW0uTW92ZSggUG9pbnRlcihzKV4sIGJbMF0sIGxlbiApOw0KLSAgZW5kOw0KLSAgV3JpdGVCaW5hcnkoIGIgKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuV3JpdGVTdHJpbmcoY29uc3Qgczogc3RyaW5nKTsNCi12YXINCi0gIGIgOiBUQnl0ZXM7DQotYmVnaW4NCi0gIGIgOj0gVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMocyk7DQotICBXcml0ZUJpbmFyeSggYiApOw0KLWVuZDsNCi0NCi17IFRQcm90b2NvbFV0aWwgfQ0KLQ0KLWNsYXNzIHByb2NlZHVyZSBUUHJvdG9jb2xVdGlsLlNraXAoIHByb3Q6IElQcm90b2NvbDsgdHlwZV86IFRUeXBlKTsNCi12YXIgZmllbGQgOiBJRmllbGQ7DQotICAgIG1hcCAgIDogSU1hcDsNCi0gICAgc2V0XyAgOiBJU2V0Ow0KLSAgICBsaXN0ICA6IElMaXN0Ow0KLSAgICBpICAgICA6IEludGVnZXI7DQotYmVnaW4NCi0gIGNhc2UgdHlwZV8gb2YNCi0gICAgLy8gc2ltcGxlIHR5cGVzDQotICAgIFRUeXBlLkJvb2xfICAgOiAgcHJvdC5SZWFkQm9vbCgpOw0KLSAgICBUVHlwZS5CeXRlXyAgIDogIHByb3QuUmVhZEJ5dGUoKTsNCi0gICAgVFR5cGUuSTE2ICAgICA6ICBwcm90LlJlYWRJMTYoKTsNCi0gICAgVFR5cGUuSTMyICAgICA6ICBwcm90LlJlYWRJMzIoKTsNCi0gICAgVFR5cGUuSTY0ICAgICA6ICBwcm90LlJlYWRJNjQoKTsNCi0gICAgVFR5cGUuRG91YmxlXyA6ICBwcm90LlJlYWREb3VibGUoKTsNCi0gICAgVFR5cGUuU3RyaW5nXyA6ICBwcm90LlJlYWRCaW5hcnkoKTsvLyBEb24ndCB0cnkgdG8gZGVjb2RlIHRoZSBzdHJpbmcsIGp1c3Qgc2tpcCBpdC4NCi0NCi0gICAgLy8gc3RydWN0dXJlZCB0eXBlcw0KLSAgICBUVHlwZS5TdHJ1Y3QgOiAgYmVnaW4NCi0gICAgICBwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOw0KLSAgICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4NCi0gICAgICAgIGZpZWxkIDo9IHByb3QuUmVhZEZpZWxkQmVnaW4oKTsNCi0gICAgICAgIGlmIChmaWVsZC5UeXBlXyA9IFRUeXBlLlN0b3ApIHRoZW4gQnJlYWs7DQotICAgICAgICBTa2lwKHByb3QsIGZpZWxkLlR5cGVfKTsNCi0gICAgICAgIHByb3QuUmVhZEZpZWxkRW5kKCk7DQotICAgICAgZW5kOw0KLSAgICAgIHByb3QuUmVhZFN0cnVjdEVuZCgpOw0KLSAgICBlbmQ7DQotDQotICAgIFRUeXBlLk1hcCA6ICBiZWdpbg0KLSAgICAgIG1hcCA6PSBwcm90LlJlYWRNYXBCZWdpbigpOw0KLSAgICAgIGZvciBpIDo9IDAgdG8gbWFwLkNvdW50LTEgZG8gYmVnaW4NCi0gICAgICAgIFNraXAocHJvdCwgbWFwLktleVR5cGUpOw0KLSAgICAgICAgU2tpcChwcm90LCBtYXAuVmFsdWVUeXBlKTsNCi0gICAgICBlbmQ7DQotICAgICAgcHJvdC5SZWFkTWFwRW5kKCk7DQotICAgIGVuZDsNCi0NCi0gICAgVFR5cGUuU2V0XyA6ICBiZWdpbg0KLSAgICAgIHNldF8gOj0gcHJvdC5SZWFkU2V0QmVnaW4oKTsNCi0gICAgICBmb3IgaSA6PSAwIHRvIHNldF8uQ291bnQtMQ0KLSAgICAgIGRvIFNraXAoIHByb3QsIHNldF8uRWxlbWVudFR5cGUpOw0KLSAgICAgIHByb3QuUmVhZFNldEVuZCgpOw0KLSAgICBlbmQ7DQotDQotICAgIFRUeXBlLkxpc3QgOiAgYmVnaW4NCi0gICAgICBsaXN0IDo9IHByb3QuUmVhZExpc3RCZWdpbigpOw0KLSAgICAgIGZvciBpIDo9IDAgdG8gbGlzdC5Db3VudC0xDQotICAgICAgZG8gU2tpcCggcHJvdCwgbGlzdC5FbGVtZW50VHlwZSk7DQotICAgICAgcHJvdC5SZWFkTGlzdEVuZCgpOw0KLSAgICBlbmQ7DQotDQotICBlbHNlDQotICAgIEFTU0VSVCggRkFMU0UpOyAvLyBhbnkgbmV3IHR5cGVzPw0KLSAgZW5kOw0KLWVuZDsNCi0NCi17IFRTdHJ1Y3RJbXBsIH0NCi0NCi1jb25zdHJ1Y3RvciBUU3RydWN0SW1wbC5DcmVhdGUoY29uc3QgQU5hbWU6IHN0cmluZyk7DQotYmVnaW4NCi0gIGluaGVyaXRlZCBDcmVhdGU7DQotICBGTmFtZSA6PSBBTmFtZTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFN0cnVjdEltcGwuR2V0TmFtZTogc3RyaW5nOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRk5hbWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUU3RydWN0SW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOw0KLWJlZ2luDQotICBGTmFtZSA6PSBWYWx1ZTsNCi1lbmQ7DQotDQoteyBUTWFwSW1wbCB9DQotDQotY29uc3RydWN0b3IgVE1hcEltcGwuQ3JlYXRlKEFWYWx1ZVR5cGUsIEFLZXlUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkIENyZWF0ZTsNCi0gIEZWYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsNCi0gIEZLZXlUeXBlIDo9IEFLZXlUeXBlOw0KLSAgRkNvdW50IDo9IEFDb3VudDsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVE1hcEltcGwuQ3JlYXRlOw0KLWJlZ2luDQotDQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldENvdW50OiBJbnRlZ2VyOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkNvdW50Ow0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUTWFwSW1wbC5HZXRLZXlUeXBlOiBUVHlwZTsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZLZXlUeXBlOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUTWFwSW1wbC5HZXRWYWx1ZVR5cGU6IFRUeXBlOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRlZhbHVlVHlwZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkNvdW50IDo9IFZhbHVlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVE1hcEltcGwuU2V0S2V5VHlwZShWYWx1ZTogVFR5cGUpOw0KLWJlZ2luDQotICBGS2V5VHlwZSA6PSBWYWx1ZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldFZhbHVlVHlwZShWYWx1ZTogVFR5cGUpOw0KLWJlZ2luDQotICBGVmFsdWVUeXBlIDo9IFZhbHVlOw0KLWVuZDsNCi0NCi17IElNZXNzYWdlIH0NCi0NCi1jb25zdHJ1Y3RvciBUTWVzc2FnZUltcGwuQ3JlYXRlKEFOYW1lOiBzdHJpbmc7IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOw0KLSAgQVNlcUlEOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkIENyZWF0ZTsNCi0gIEZOYW1lIDo9IEFOYW1lOw0KLSAgRk1lc3NhZ2VUeXBlIDo9IEFNZXNzYWdlVHlwZTsNCi0gIEZTZXFJRCA6PSBBU2VxSUQ7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRNZXNzYWdlSW1wbC5DcmVhdGU7DQotYmVnaW4NCi0gIGluaGVyaXRlZDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVE1lc3NhZ2VJbXBsLkdldE5hbWU6IHN0cmluZzsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZOYW1lOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0U2VxSUQ6IEludGVnZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGU2VxSUQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRNZXNzYWdlSW1wbC5HZXRUeXBlOiBUTWVzc2FnZVR5cGU7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGTWVzc2FnZVR5cGU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsNCi1iZWdpbg0KLSAgRk5hbWUgOj0gVmFsdWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0U2VxSUQoVmFsdWU6IEludGVnZXIpOw0KLWJlZ2luDQotICBGU2VxSUQgOj0gVmFsdWU7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0VHlwZShWYWx1ZTogVE1lc3NhZ2VUeXBlKTsNCi1iZWdpbg0KLSAgRk1lc3NhZ2VUeXBlIDo9IFZhbHVlOw0KLWVuZDsNCi0NCi17IElTZXQgfQ0KLQ0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkIENyZWF0ZTsNCi0gIEZDb3VudCA6PSBBQ291bnQ7DQotICBGRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUU2V0SW1wbC5DcmVhdGU7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVFNldEltcGwuR2V0Q291bnQ6IEludGVnZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGQ291bnQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRTZXRJbXBsLkdldEVsZW1lbnRUeXBlOiBUVHlwZTsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZFbGVtZW50VHlwZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkNvdW50IDo9IFZhbHVlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFNldEltcGwuU2V0RWxlbWVudFR5cGUoVmFsdWU6IFRUeXBlKTsNCi1iZWdpbg0KLSAgRkVsZW1lbnRUeXBlIDo9IFZhbHVlOw0KLWVuZDsNCi0NCi17IElMaXN0IH0NCi0NCi1jb25zdHJ1Y3RvciBUTGlzdEltcGwuQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlOw0KLSAgRkNvdW50IDo9IEFDb3VudDsNCi0gIEZFbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRMaXN0SW1wbC5DcmVhdGU7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVExpc3RJbXBsLkdldENvdW50OiBJbnRlZ2VyOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkNvdW50Ow0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUTGlzdEltcGwuR2V0RWxlbWVudFR5cGU6IFRUeXBlOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkVsZW1lbnRUeXBlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVExpc3RJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkNvdW50IDo9IFZhbHVlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVExpc3RJbXBsLlNldEVsZW1lbnRUeXBlKFZhbHVlOiBUVHlwZSk7DQotYmVnaW4NCi0gIEZFbGVtZW50VHlwZSA6PSBWYWx1ZTsNCi1lbmQ7DQotDQoteyBUQmluYXJ5UHJvdG9jb2xJbXBsIH0NCi0NCi1jb25zdHJ1Y3RvciBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOw0KLWJlZ2luDQotICBDcmVhdGUoIHRyYW5zLCBGYWxzZSwgVHJ1ZSk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNoZWNrUmVhZExlbmd0aChsZW46IEludGVnZXIpOw0KLWJlZ2luDQotICBpZiBGQ2hlY2tSZWFkTGVuZ3RoIHRoZW4NCi0gIGJlZ2luDQotICAgIERlYyggRlJlYWRMZW5ndGgsIGxlbik7DQotICAgIGlmIEZSZWFkTGVuZ3RoIDwgMCB0aGVuDQotICAgIGJlZ2luDQotICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSggJ01lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAnICsgSW50VG9TdHIoIGxlbiApICk7DQotICAgIGVuZDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkLA0KLSAgc3RyaWN0V3JpdGU6IEJvb2xlYW4pOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlKCB0cmFucyApOw0KLSAgRlN0cmljdFJlYWQgOj0gc3RyaWN0UmVhZDsNCi0gIEZTdHJpY3RXcml0ZSA6PSBzdHJpY3RXcml0ZTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZiwNCi0gIGxlbjogSW50ZWdlcik6IEludGVnZXI7DQotYmVnaW4NCi0gIENoZWNrUmVhZExlbmd0aCggbGVuICk7DQotICBSZXN1bHQgOj0gRlRyYW5zLlJlYWRBbGwoIGJ1Ziwgb2ZmLCBsZW4gKTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQmluYXJ5OiBUQnl0ZXM7DQotdmFyDQotICBzaXplIDogSW50ZWdlcjsNCi0gIGJ1ZiA6IFRCeXRlczsNCi1iZWdpbg0KLSAgc2l6ZSA6PSBSZWFkSTMyOw0KLSAgQ2hlY2tSZWFkTGVuZ3RoKCBzaXplICk7DQotICBTZXRMZW5ndGgoIGJ1Ziwgc2l6ZSApOw0KLSAgRlRyYW5zLlJlYWRBbGwoIGJ1ZiwgMCwgc2l6ZSk7DQotICBSZXN1bHQgOj0gYnVmOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gUmVhZEJ5dGUgPSAxOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsNCi12YXINCi0gIGJpbiA6IFRCeXRlczsNCi1iZWdpbg0KLSAgU2V0TGVuZ3RoKCBiaW4sIDEpOw0KLSAgUmVhZEFsbCggYmluLCAwLCAxICk7DQotICBSZXN1bHQgOj0gU2hvcnRJbnQoIGJpblswXSk7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZERvdWJsZTogRG91YmxlOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gQ29udmVydEludDY0VG9Eb3VibGUoIFJlYWRJNjQgKQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7DQotdmFyDQotICBmaWVsZCA6IElGaWVsZDsNCi1iZWdpbg0KLSAgZmllbGQgOj0gVEZpZWxkSW1wbC5DcmVhdGU7DQotICBmaWVsZC5UeXBlXyA6PSBUVHlwZSggUmVhZEJ5dGUpOw0KLSAgaWYgKCBmaWVsZC5UeXBlXyA8PiBUVHlwZS5TdG9wICkgdGhlbg0KLSAgYmVnaW4NCi0gICAgZmllbGQuSWQgOj0gUmVhZEkxNjsNCi0gIGVuZDsNCi0gIFJlc3VsdCA6PSBmaWVsZDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEZpZWxkRW5kOw0KLWJlZ2luDQotDQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkxNjogU21hbGxJbnQ7DQotdmFyDQotICBpMTZpbiA6IFRCeXRlczsNCi1iZWdpbg0KLSAgU2V0TGVuZ3RoKCBpMTZpbiwgMiApOw0KLSAgUmVhZEFsbCggaTE2aW4sIDAsIDIpOw0KLSAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsNCi12YXINCi0gIGkzMmluIDogVEJ5dGVzOw0KLWJlZ2luDQotICBTZXRMZW5ndGgoIGkzMmluLCA0ICk7DQotICBSZWFkQWxsKCBpMzJpbiwgMCwgNCk7DQotDQotICBSZXN1bHQgOj0gSW50ZWdlcigNCi0gICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yDQotICAgICgoaTMyaW5bMV0gYW5kICRGRikgc2hsIDE2KSBvcg0KLSAgICAoKGkzMmluWzJdIGFuZCAkRkYpIHNobCA4KSBvcg0KLSAgICAgKGkzMmluWzNdIGFuZCAkRkYpKTsNCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkSTY0OiBJbnQ2NDsNCi12YXINCi0gIGk2NGluIDogVEJ5dGVzOw0KLWJlZ2luDQotICBTZXRMZW5ndGgoIGk2NGluLCA4KTsNCi0gIFJlYWRBbGwoIGk2NGluLCAwLCA4KTsNCi0gIFJlc3VsdCA6PQ0KLSAgICAoSW50NjQoIGk2NGluWzBdIGFuZCAkRkYpIHNobCA1Nikgb3INCi0gICAgKEludDY0KCBpNjRpblsxXSBhbmQgJEZGKSBzaGwgNDgpIG9yDQotICAgIChJbnQ2NCggaTY0aW5bMl0gYW5kICRGRikgc2hsIDQwKSBvcg0KLSAgICAoSW50NjQoIGk2NGluWzNdIGFuZCAkRkYpIHNobCAzMikgb3INCi0gICAgKEludDY0KCBpNjRpbls0XSBhbmQgJEZGKSBzaGwgMjQpIG9yDQotICAgIChJbnQ2NCggaTY0aW5bNV0gYW5kICRGRikgc2hsIDE2KSBvcg0KLSAgICAoSW50NjQoIGk2NGluWzZdIGFuZCAkRkYpIHNobCA4KSBvcg0KLSAgICAoSW50NjQoIGk2NGluWzddIGFuZCAkRkYpKTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBJTGlzdDsNCi12YXINCi0gIGxpc3QgOiBJTGlzdDsNCi1iZWdpbg0KLSAgbGlzdCA6PSBUTGlzdEltcGwuQ3JlYXRlOw0KLSAgbGlzdC5FbGVtZW50VHlwZSA6PSBUVHlwZSggUmVhZEJ5dGUgKTsNCi0gIGxpc3QuQ291bnQgOj0gUmVhZEkzMjsNCi0gIFJlc3VsdCA6PSBsaXN0Ow0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogSU1hcDsNCi12YXINCi0gIG1hcCA6IElNYXA7DQotYmVnaW4NCi0gIG1hcCA6PSBUTWFwSW1wbC5DcmVhdGU7DQotICBtYXAuS2V5VHlwZSA6PSBUVHlwZSggUmVhZEJ5dGUgKTsNCi0gIG1hcC5WYWx1ZVR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7DQotICBtYXAuQ291bnQgOj0gUmVhZEkzMjsNCi0gIFJlc3VsdCA6PSBtYXA7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsNCi12YXINCi0gIHNpemUgOiBJbnRlZ2VyOw0KLSAgdmVyc2lvbiA6IEludGVnZXI7DQotICBtZXNzYWdlIDogSU1lc3NhZ2U7DQotYmVnaW4NCi0gIG1lc3NhZ2UgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZTsNCi0gIHNpemUgOj0gUmVhZEkzMjsNCi0gIGlmIChzaXplIDwgMCkgdGhlbg0KLSAgYmVnaW4NCi0gICAgdmVyc2lvbiA6PSBzaXplIGFuZCBJbnRlZ2VyKCBWRVJTSU9OX01BU0spOw0KLSAgICBpZiAoIHZlcnNpb24gPD4gSW50ZWdlciggVkVSU0lPTl8xKSkgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLCAnQmFkIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbjogJyArIEludFRvU3RyKHZlcnNpb24pICk7DQotICAgIGVuZDsNCi0gICAgbWVzc2FnZS5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIHNpemUgYW5kICQwMDAwMDBmZik7DQotICAgIG1lc3NhZ2UuTmFtZSA6PSBSZWFkU3RyaW5nOw0KLSAgICBtZXNzYWdlLlNlcUlEIDo9IFJlYWRJMzI7DQotICBlbmQgZWxzZQ0KLSAgYmVnaW4NCi0gICAgaWYgRlN0cmljdFJlYWQgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUoIFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgJ01pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PycgKTsNCi0gICAgZW5kOw0KLSAgICBtZXNzYWdlLk5hbWUgOj0gUmVhZFN0cmluZ0JvZHkoIHNpemUgKTsNCi0gICAgbWVzc2FnZS5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIFJlYWRCeXRlICk7DQotICAgIG1lc3NhZ2UuU2VxSUQgOj0gUmVhZEkzMjsNCi0gIGVuZDsNCi0gIFJlc3VsdCA6PSBtZXNzYWdlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkOw0KLQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogSVNldDsNCi12YXINCi0gIHNldF8gOiBJU2V0Ow0KLWJlZ2luDQotICBzZXRfIDo9IFRTZXRJbXBsLkNyZWF0ZTsNCi0gIHNldF8uRWxlbWVudFR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7DQotICBzZXRfLkNvdW50IDo9IFJlYWRJMzI7DQotICBSZXN1bHQgOj0gc2V0XzsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEVuZDsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJpbmdCb2R5KCBzaXplOiBJbnRlZ2VyKTogc3RyaW5nOw0KLXZhcg0KLSAgYnVmIDogVEJ5dGVzOw0KLWJlZ2luDQotICBDaGVja1JlYWRMZW5ndGgoIHNpemUgKTsNCi0gIFNldExlbmd0aCggYnVmLCBzaXplICk7DQotICBGVHJhbnMuUmVhZEFsbCggYnVmLCAwLCBzaXplICk7DQotICBSZXN1bHQgOj0gVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBidWYpOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnJyk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RFbmQ7DQotYmVnaW4NCi0gIGluaGVyaXRlZDsNCi0NCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuU2V0UmVhZExlbmd0aChyZWFkTGVuZ3RoOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRlJlYWRMZW5ndGggOj0gcmVhZExlbmd0aDsNCi0gIEZDaGVja1JlYWRMZW5ndGggOj0gVHJ1ZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7DQotdmFyIGlMZW4gOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBpTGVuIDo9IExlbmd0aChiKTsNCi0gIFdyaXRlSTMyKCBpTGVuKTsNCi0gIGlmIGlMZW4gPiAwIHRoZW4gRlRyYW5zLldyaXRlKGIsIDAsIGlMZW4pOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJvb2woYjogQm9vbGVhbik7DQotYmVnaW4NCi0gIGlmIGIgdGhlbg0KLSAgYmVnaW4NCi0gICAgV3JpdGVCeXRlKCAxICk7DQotICBlbmQgZWxzZQ0KLSAgYmVnaW4NCi0gICAgV3JpdGVCeXRlKCAwICk7DQotICBlbmQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQnl0ZShiOiBTaG9ydEludCk7DQotdmFyDQotICBhIDogVEJ5dGVzOw0KLWJlZ2luDQotICBTZXRMZW5ndGgoIGEsIDEpOw0KLSAgYVswXSA6PSBCeXRlKCBiICk7DQotICBGVHJhbnMuV3JpdGUoIGEsIDAsIDEgKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7DQotYmVnaW4NCi0gIFdyaXRlSTY0KENvbnZlcnREb3VibGVUb0ludDY0KGQpKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsNCi1iZWdpbg0KLSAgV3JpdGVCeXRlKFNob3J0SW50KGZpZWxkLlR5cGVfKSk7DQotICBXcml0ZUkxNihmaWVsZC5JRCk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRFbmQ7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZFN0b3A7DQotYmVnaW4NCi0gIFdyaXRlQnl0ZShTaG9ydEludChUVHlwZS5TdG9wKSk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTE2KGkxNjogU21hbGxJbnQpOw0KLXZhcg0KLSAgaTE2b3V0IDogVEJ5dGVzOw0KLWJlZ2luDQotICBTZXRMZW5ndGgoIGkxNm91dCwgMik7DQotICBpMTZvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpMTYgc2hyIDgpKTsNCi0gIGkxNm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgaTE2KTsNCi0gIEZUcmFucy5Xcml0ZSggaTE2b3V0ICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTMyKGkzMjogSW50ZWdlcik7DQotdmFyDQotICBpMzJvdXQgOiBUQnl0ZXM7DQotYmVnaW4NCi0gIFNldExlbmd0aCggaTMyb3V0LCA0KTsNCi0gIGkzMm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMjQpKTsNCi0gIGkzMm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMTYpKTsNCi0gIGkzMm91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgOCkpOw0KLSAgaTMyb3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCBpMzIpOw0KLSAgRlRyYW5zLldyaXRlKCBpMzJvdXQsIDAsIDQpOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7DQotdmFyDQotICBpNjRvdXQgOiBUQnl0ZXM7DQotYmVnaW4NCi0gIFNldExlbmd0aCggaTY0b3V0LCA4KTsNCi0gIGk2NG91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNTYpKTsNCi0gIGk2NG91dFsxXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDgpKTsNCi0gIGk2NG91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDApKTsNCi0gIGk2NG91dFszXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMzIpKTsNCi0gIGk2NG91dFs0XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMjQpKTsNCi0gIGk2NG91dFs1XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMTYpKTsNCi0gIGk2NG91dFs2XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgOCkpOw0KLSAgaTY0b3V0WzddIDo9IEJ5dGUoJEZGIGFuZCBpNjQpOw0KLSAgRlRyYW5zLldyaXRlKCBpNjRvdXQsIDAsIDgpOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOw0KLWJlZ2luDQotICBXcml0ZUJ5dGUoU2hvcnRJbnQobGlzdC5FbGVtZW50VHlwZSkpOw0KLSAgV3JpdGVJMzIobGlzdC5Db3VudCk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOw0KLWJlZ2luDQotICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLktleVR5cGUpKTsNCi0gIFdyaXRlQnl0ZShTaG9ydEludChtYXAuVmFsdWVUeXBlKSk7DQotICBXcml0ZUkzMihtYXAuQ291bnQpOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEVuZDsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7DQotdmFyDQotICB2ZXJzaW9uIDogQ2FyZGluYWw7DQotYmVnaW4NCi0gIGlmIEZTdHJpY3RXcml0ZSB0aGVuDQotICBiZWdpbg0KLSAgICB2ZXJzaW9uIDo9IFZFUlNJT05fMSBvciBDYXJkaW5hbCggbXNnLlR5cGVfKTsNCi0gICAgV3JpdGVJMzIoIEludGVnZXIoIHZlcnNpb24pICk7DQotICAgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7DQotICAgIFdyaXRlSTMyKCBtc2cuU2VxSUQpOw0KLSAgZW5kIGVsc2UNCi0gIGJlZ2luDQotICAgIFdyaXRlU3RyaW5nKCBtc2cuTmFtZSk7DQotICAgIFdyaXRlQnl0ZShTaG9ydEludCggbXNnLlR5cGVfKSk7DQotICAgIFdyaXRlSTMyKCBtc2cuU2VxSUQpOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VFbmQ7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCk7DQotYmVnaW4NCi0gIFdyaXRlQnl0ZShTaG9ydEludChzZXRfLkVsZW1lbnRUeXBlKSk7DQotICBXcml0ZUkzMihzZXRfLkNvdW50KTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRFbmQ7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOw0KLWJlZ2luDQotDQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU3RydWN0RW5kOw0KLWJlZ2luDQotDQotZW5kOw0KLQ0KLXsgVFByb3RvY29sRXhjZXB0aW9uIH0NCi0NCi1jb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlKCcnKTsNCi0gIEZUeXBlIDo9IFVOS05PV047DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRQcm90b2NvbEV4Y2VwdGlvbi5DcmVhdGUodHlwZV86IEludGVnZXIpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlKCcnKTsNCi0gIEZUeXBlIDo9IHR5cGVfOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk7DQotYmVnaW4NCi0gIGluaGVyaXRlZCBDcmVhdGUoIG1zZyApOw0KLSAgRlR5cGUgOj0gdHlwZV87DQotZW5kOw0KLQ0KLXsgVFRocmlmdFN0cmluZ0J1aWxkZXIgfQ0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRTdHJpbmdCdWlsZGVyLkFwcGVuZChjb25zdCBWYWx1ZTogVEJ5dGVzKTogVFN0cmluZ0J1aWxkZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBBcHBlbmQoIHN0cmluZyggUmF3Qnl0ZVN0cmluZyhWYWx1ZSkpICk7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRTdHJpbmdCdWlsZGVyLkFwcGVuZCgNCi0gIGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBBcHBlbmQoIFZhbHVlLlRvU3RyaW5nICk7DQotZW5kOw0KLQ0KLXsgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeSB9DQotDQotY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGUoQVN0cmljdFJlYWQsIEFTdHJpY3RXcml0ZTogQm9vbGVhbik7DQotYmVnaW4NCi0gIEZTdHJpY3RSZWFkIDo9IEFTdHJpY3RSZWFkOw0KLSAgRlN0cmljdFdyaXRlIDo9IEFTdHJpY3RXcml0ZTsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7DQotYmVnaW4NCi0gIENyZWF0ZSggRmFsc2UsIFRydWUgKQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucyApOw0KLWVuZDsNCi0NCi1lbmQuDQotDQorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit7JFNDT1BFREVOVU1TIE9OfQorCit1bml0IFRocmlmdC5Qcm90b2NvbDsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIENvbnRucnMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5TdHJlYW0sCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LlRyYW5zcG9ydDsKKwordHlwZQorCisgIFRUeXBlID0gKAorICAgIFN0b3AgPSAwLAorICAgIFZvaWQgPSAxLAorICAgIEJvb2xfID0gMiwKKyAgICBCeXRlXyA9IDMsCisgICAgRG91YmxlXyA9IDQsCisgICAgSTE2ID0gNiwKKyAgICBJMzIgPSA4LAorICAgIEk2NCA9IDEwLAorICAgIFN0cmluZ18gPSAxMSwKKyAgICBTdHJ1Y3QgPSAxMiwKKyAgICBNYXAgPSAxMywKKyAgICBTZXRfID0gMTQsCisgICAgTGlzdCA9IDE1CisgICk7CisKKyAgVE1lc3NhZ2VUeXBlID0gKAorICAgIENhbGwgPSAxLAorICAgIFJlcGx5ID0gMiwKKyAgICBFeGNlcHRpb24gPSAzLAorICAgIE9uZXdheSA9IDQKKyAgKTsKKworY29uc3QKKyAgVkFMSURfVFRZUEVTID0gWworICAgIFRUeXBlLlN0b3AsIFRUeXBlLlZvaWQsCisgICAgVFR5cGUuQm9vbF8sIFRUeXBlLkJ5dGVfLCBUVHlwZS5Eb3VibGVfLCBUVHlwZS5JMTYsIFRUeXBlLkkzMiwgVFR5cGUuSTY0LCBUVHlwZS5TdHJpbmdfLAorICAgIFRUeXBlLlN0cnVjdCwgVFR5cGUuTWFwLCBUVHlwZS5TZXRfLCBUVHlwZS5MaXN0CisgIF07CisKKyAgVkFMSURfTUVTU0FHRVRZUEVTID0gW0xvdyhUTWVzc2FnZVR5cGUpLi5IaWdoKFRNZXNzYWdlVHlwZSldOworCitjb25zdAorICBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCA9IDY0OworCit0eXBlCisgIElQcm90b2NvbCA9IGludGVyZmFjZTsKKworICBUVGhyaWZ0TWVzc2FnZSA9IHJlY29yZAorICAgIE5hbWU6IHN0cmluZzsKKyAgICBUeXBlXzogVE1lc3NhZ2VUeXBlOworICAgIFNlcUlEOiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdFN0cnVjdCA9IHJlY29yZAorICAgIE5hbWU6IHN0cmluZzsKKyAgZW5kOworCisgIFRUaHJpZnRGaWVsZCA9IHJlY29yZAorICAgIE5hbWU6IHN0cmluZzsKKyAgICBUeXBlXzogVFR5cGU7CisgICAgSWQ6IFNtYWxsSW50OworICBlbmQ7CisKKyAgVFRocmlmdExpc3QgPSByZWNvcmQKKyAgICBFbGVtZW50VHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0TWFwID0gcmVjb3JkCisgICAgS2V5VHlwZTogVFR5cGU7CisgICAgVmFsdWVUeXBlOiBUVHlwZTsKKyAgICBDb3VudDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTZXQgPSByZWNvcmQKKyAgICBFbGVtZW50VHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworCisKKyAgSVByb3RvY29sRmFjdG9yeSA9IGludGVyZmFjZQorICAgIFsnezdDRDY0QTEwLTRFOUYtNEU5OS05M0JGLTcwOEEzMUY0QTY3Qn0nXQorICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJpbmdCdWlsZGVyID0gY2xhc3MoIFRTdHJpbmdCdWlsZGVyKQorICBwdWJsaWMKKyAgICBmdW5jdGlvbiBBcHBlbmQoY29uc3QgVmFsdWU6IFRCeXRlcyk6IFRTdHJpbmdCdWlsZGVyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBBcHBlbmQoY29uc3QgVmFsdWU6IElUaHJpZnRDb250YWluZXIpOiBUU3RyaW5nQnVpbGRlcjsgb3ZlcmxvYWQ7CisgIGVuZDsKKworICBUUHJvdG9jb2xFeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKKyAgcHVibGljCisgICAgY29uc3QgLy8gVE9ETyhqZW5zZyk6IGNoYW5nZSBpbnRvIGVudW0KKyAgICAgIFVOS05PV04gPSAwOworICAgICAgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgIE5FR0FUSVZFX1NJWkUgPSAyOworICAgICAgU0laRV9MSU1JVCA9IDM7CisgICAgICBCQURfVkVSU0lPTiA9IDQ7CisgICAgICBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgICAgREVQVEhfTElNSVQgPSA2OworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworICBwdWJsaWMKKyAgICAvLyBwdXJwb3NlZnVsbHkgaGlkZSBpbmhlcml0ZWQgY29uc3RydWN0b3IKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFByb3RvY29sRXhjZXB0aW9uIHR5cGVzIChvciByZWdlbmVyYXRlIGZyb20gSURMKSc7CisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCB0eXBlXzogSW50ZWdlcik6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUUHJvdG9jb2xFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgZW5kOworCisgIC8vIE5lZWRlZCB0byByZW1vdmUgZGVwcmVjYXRpb24gd2FybmluZworICBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCA9IGNsYXNzIGFic3RyYWN0IChUUHJvdG9jb2xFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25TaXplTGltaXQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25CYWRWZXJzaW9uID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0ID0gY2xhc3MgKFRQcm90b2NvbEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKworCisgIFRQcm90b2NvbFV0aWwgPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOworICBlbmQ7CisKKyAgSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlciA9IGludGVyZmFjZQorICAgIFsnezI5Q0EwMzNGLUJCNTYtNDlCMS05RUUzLTMxQjFFODJGQzdBNX0nXQorICAgIC8vIG5vIG1lbWJlcnMgeWV0CisgIGVuZDsKKworICBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbCA9IGNsYXNzIGFic3RyYWN0KCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcikKKyAgcHJvdGVjdGVkCisgICAgRlByb3RvY29sIDogSVByb3RvY29sOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIHByb3QgOiBJUHJvdG9jb2wpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBJUHJvdG9jb2wgPSBpbnRlcmZhY2UKKyAgICBbJ3s2MDJBN0ZGQi0wRDlFLTRDRDgtOEQ3Ri1FNTA3NjY2MDU4OEF9J10KKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOworICAgIHByb2NlZHVyZSBXcml0ZUkxNiggaTE2OiBTbWFsbEludCk7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRG91YmxlKCBjb25zdCBkOiBEb3VibGUpOworICAgIHByb2NlZHVyZSBXcml0ZVN0cmluZyggY29uc3Qgczogc3RyaW5nICk7CisgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CisgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CisgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKKyAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsKKyAgICBmdW5jdGlvbiBSZWFkSTE2OiBTbWFsbEludDsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OworICAgIGZ1bmN0aW9uIFJlYWREb3VibGU6RG91YmxlOworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7CisKKyAgICBwcm9jZWR1cmUgU2V0UmVjdXJzaW9uTGltaXQoIHZhbHVlIDogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gIEdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiAgTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKKyAgICBwcm9jZWR1cmUgSW5jcmVtZW50UmVjdXJzaW9uRGVwdGg7CisgICAgcHJvY2VkdXJlIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworCisgICAgcHJvcGVydHkgVHJhbnNwb3J0OiBJVHJhbnNwb3J0IHJlYWQgR2V0VHJhbnNwb3J0OworICAgIHByb3BlcnR5IFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlciByZWFkIEdldFJlY3Vyc2lvbkxpbWl0IHdyaXRlIFNldFJlY3Vyc2lvbkxpbWl0OworICBlbmQ7CisKKyAgVFByb3RvY29sSW1wbCA9IGNsYXNzIGFic3RyYWN0KCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb3RvY29sKQorICBwcm90ZWN0ZWQKKyAgICBGVHJhbnMgOiBJVHJhbnNwb3J0OworICAgIEZSZWN1cnNpb25MaW1pdCA6IEludGVnZXI7CisgICAgRlJlY3Vyc2lvbkRlcHRoIDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBTZXRSZWN1cnNpb25MaW1pdCggdmFsdWUgOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiAgR2V0UmVjdXJzaW9uTGltaXQgOiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uICBOZXh0UmVjdXJzaW9uTGV2ZWwgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOworICAgIHByb2NlZHVyZSBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aDsKKyAgICBwcm9jZWR1cmUgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CisKKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IHZpcnR1YWw7IGFic3RyYWN0OworCisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRJMTY6IFNtYWxsSW50OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkSTMyOiBJbnRlZ2VyOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkSTY0OiBJbnQ2NDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZERvdWJsZTpEb3VibGU7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRCaW5hcnk6IFRCeXRlczsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZFN0cmluZzogc3RyaW5nOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOyB2aXJ0dWFsOworCisgICAgcHJvcGVydHkgVHJhbnNwb3J0OiBJVHJhbnNwb3J0IHJlYWQgR2V0VHJhbnNwb3J0OworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCB0cmFuczogSVRyYW5zcG9ydCApOworICBlbmQ7CisKKyAgSUJhc2UgPSBpbnRlcmZhY2UKKyAgICBbJ3swOEQ5QkFBOC01RUFBLTQxMEYtQjUwQi1BQzJFNkU1RTQxNTV9J10KKyAgICBmdW5jdGlvbiBUb1N0cmluZzogc3RyaW5nOworICAgIHByb2NlZHVyZSBSZWFkKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOworICBlbmQ7CisKKworICBUQmluYXJ5UHJvdG9jb2xJbXBsID0gY2xhc3MoIFRQcm90b2NvbEltcGwgKQorICBwcm90ZWN0ZWQKKyAgICBjb25zdAorICAgICAgVkVSU0lPTl9NQVNLIDogQ2FyZGluYWwgPSAkZmZmZjAwMDA7CisgICAgICBWRVJTSU9OXzEgOiBDYXJkaW5hbCA9ICQ4MDAxMDAwMDsKKyAgcHJvdGVjdGVkCisgICAgRlN0cmljdFJlYWQgOiBCb29sZWFuOworICAgIEZTdHJpY3RXcml0ZSA6IEJvb2xlYW47CisKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIFJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOyAgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWRTdHJpbmdCb2R5KCBzaXplOiBJbnRlZ2VyKTogc3RyaW5nOworCisgIHB1YmxpYworCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElQcm90b2NvbEZhY3RvcnkpCisgICAgICBwcm90ZWN0ZWQKKyAgICAgICAgRlN0cmljdFJlYWQgOiBCb29sZWFuOworICAgICAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOworICAgICAgcHVibGljCisgICAgICAgIGZ1bmN0aW9uIEdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKKyAgICAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBU3RyaWN0UmVhZCwgQVN0cmljdFdyaXRlOiBCb29sZWFuICk7IG92ZXJsb2FkOworICAgICAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgICAgZW5kOworCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQ7IHN0cmljdFJlYWQ6IEJvb2xlYW47IHN0cmljdFdyaXRlOiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTE2KCBpMTY6IFNtYWxsSW50KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlSTMyKCBpMzI6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOyBvdmVycmlkZTsKKworICBlbmQ7CisKKworICB7IFRQcm90b2NvbERlY29yYXRvciBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQgVFByb3RvY29sIGluc3RhbmNlLAorICAgIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZSBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gVGhlIGRlY29yYXRvcgorICAgIGRvZXMgbm90IChhbmQgc2hvdWxkIG5vdCkgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbAorCisgICAgU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQorICB9CisgIFRQcm90b2NvbERlY29yYXRvciA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsKQorICBwcml2YXRlCisgICAgRldyYXBwZWRQcm90b2NvbCA6IElQcm90b2NvbDsKKworICBwdWJsaWMKKyAgICAvLyBFbmNsb3NlcyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLgorICAgIC8vIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGUgZ2l2ZW4gcHJvdG9jb2wuICBNdXN0IGJlIG5vbi1udWxsLgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVByb3RvY29sIDogSVByb3RvY29sKTsKKworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVJMzIoIGkzMjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEkxNjogU21hbGxJbnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJMzI6IEludGVnZXI7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRJNjQ6IEludDY0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRG91YmxlOkRvdWJsZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEJpbmFyeTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RyaW5nOiBzdHJpbmc7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRBbnNpU3RyaW5nOiBBbnNpU3RyaW5nOyBvdmVycmlkZTsKKyAgZW5kOworCisKK3R5cGUKKyAgSVJlcXVlc3RFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3tGOTI2QTI2QS01QjAwLTQ1NjAtODZGQS0yQ0FFM0JBNzNEQUZ9J10KKyAgICAvLyBDYWxsZWQgYmVmb3JlIHJlYWRpbmcgYXJndW1lbnRzLgorICAgIHByb2NlZHVyZSBQcmVSZWFkOworICAgIC8vIENhbGxlZCBiZXR3ZWVuIHJlYWRpbmcgYXJndW1lbnRzIGFuZCBjYWxsaW5nIHRoZSBoYW5kbGVyLgorICAgIHByb2NlZHVyZSBQb3N0UmVhZDsKKyAgICAvLyBDYWxsZWQgYmV0d2VlbiBjYWxsaW5nIHRoZSBoYW5kbGVyIGFuZCB3cml0aW5nIHRoZSByZXNwb25zZS4KKyAgICBwcm9jZWR1cmUgUHJlV3JpdGU7CisgICAgLy8gQ2FsbGVkIGFmdGVyIHdyaXRpbmcgdGhlIHJlc3BvbnNlLgorICAgIHByb2NlZHVyZSBQb3N0V3JpdGU7CisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gb25ld2F5IChhc3luYykgZnVuY3Rpb24gY2FsbCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5LgorICAgIHByb2NlZHVyZSBPbmV3YXlDb21wbGV0ZTsKKyAgICAvLyBDYWxsZWQgaWYgdGhlIGhhbmRsZXIgdGhyb3dzIGFuIHVuZGVjbGFyZWQgZXhjZXB0aW9uLgorICAgIHByb2NlZHVyZSBVbmhhbmRsZWRFcnJvciggY29uc3QgZSA6IEV4Y2VwdGlvbik7CisgICAgLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaGFzIGZpbmlzaGVkIHJlcXVlc3QtaGFuZGxpbmcgdG8gY2xlYW4gdXAKKyAgICBwcm9jZWR1cmUgQ2xlYW51cENvbnRleHQ7CisgIGVuZDsKKworCisgIElQcm9jZXNzb3JFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3tBODY2MTExOS02NTdDLTQ0N0QtOTNDNS01MTJFMzYxNjJBNDV9J10KKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCisgICAgcHJvY2VkdXJlIFByb2Nlc3NpbmcoIGNvbnN0IHRyYW5zcG9ydCA6IElUcmFuc3BvcnQpOworICAgIC8vIENhbGxlZCBvbiBhbnkgc2VydmljZSBmdW5jdGlvbiBpbnZvY2F0aW9uCisgICAgZnVuY3Rpb24gIENyZWF0ZVJlcXVlc3RDb250ZXh0KCBjb25zdCBhRnVuY3Rpb25OYW1lIDogc3RyaW5nKSA6IElSZXF1ZXN0RXZlbnRzOworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGNsZWFuIHVwCisgICAgcHJvY2VkdXJlIENsZWFudXBDb250ZXh0OworICBlbmQ7CisKKworICBJUHJvY2Vzc29yID0gaW50ZXJmYWNlCisgICAgWyd7N0JBRTkyQTUtNDZEQS00RjEzLUI2RUEtMEVBQkUyMzNFRTVGfSddCisgICAgZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3QgOklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyA9IG5pbCk6IEJvb2xlYW47CisgIGVuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRNZXNzYWdlOyBjb25zdCBBTmFtZTogc3RyaW5nID0gJyc7IGNvbnN0IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlID0gTG93KFRNZXNzYWdlVHlwZSk7IGNvbnN0IEFTZXFJRDogSW50ZWdlciA9IDApOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTdHJ1Y3Q7ICBjb25zdCBBTmFtZTogc3RyaW5nID0gJycpOyAgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRGaWVsZDsgICBjb25zdCBBTmFtZTogc3RyaW5nID0gJyc7IGNvbnN0IEFUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFJRDogU21hbGxJbnQgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWFwOyAgICAgY29uc3QgQUtleVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQVZhbHVlVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7Citwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTZXQ7ICAgICBjb25zdCBBRWxlbWVudFR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TGlzdDsgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKKworCitpbXBsZW1lbnRhdGlvbgorCitmdW5jdGlvbiBDb252ZXJ0SW50NjRUb0RvdWJsZSggY29uc3QgbjogSW50NjQpOiBEb3VibGU7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihuKSA9IFNpemVPZihSZXN1bHQpKTsKKyAgU3lzdGVtLk1vdmUoIG4sIFJlc3VsdCwgU2l6ZU9mKFJlc3VsdCkpOworZW5kOworCitmdW5jdGlvbiBDb252ZXJ0RG91YmxlVG9JbnQ2NCggY29uc3QgZDogRG91YmxlKTogSW50NjQ7CitiZWdpbgorICBBU1NFUlQoIFNpemVPZihkKSA9IFNpemVPZihSZXN1bHQpKTsKKyAgU3lzdGVtLk1vdmUoIGQsIFJlc3VsdCwgU2l6ZU9mKFJlc3VsdCkpOworZW5kOworCisKKworeyBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbCB9CisKK2NvbnN0cnVjdG9yIFRQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXJJbXBsLkNyZWF0ZSggcHJvdCA6IElQcm90b2NvbCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworCisgIC8vIHN0b3JpbmcgdGhlIHBvaW50ZXIgKmFmdGVyKiB0aGUgKHN1Y2Nlc3NmdWwpIGluY3JlbWVudCBpcyBpbXBvcnRhbnQgaGVyZQorICBwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICBGUHJvdG9jb2wgOj0gcHJvdDsKK2VuZDsKKworZGVzdHJ1Y3RvciBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5EZXN0cm95OworYmVnaW4KKyAgdHJ5CisgICAgLy8gd2UgaGF2ZSB0byByZWxlYXNlIHRoZSByZWZlcmVuY2UgaWZmIHRoZSBwb2ludGVyIGhhcyBiZWVuIHN0b3JlZAorICAgIGlmIEZQcm90b2NvbCA8PiBuaWwgdGhlbiBiZWdpbgorICAgICAgRlByb3RvY29sLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworICAgICAgRlByb3RvY29sIDo9IG5pbDsKKyAgICBlbmQ7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCit7IFRQcm90b2NvbEltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xJbXBsLkNyZWF0ZSh0cmFuczogSVRyYW5zcG9ydCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVHJhbnMgOj0gdHJhbnM7CisgIEZSZWN1cnNpb25MaW1pdCA6PSBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVDsKKyAgRlJlY3Vyc2lvbkRlcHRoIDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLlNldFJlY3Vyc2lvbkxpbWl0KCB2YWx1ZSA6IEludGVnZXIpOworYmVnaW4KKyAgRlJlY3Vyc2lvbkxpbWl0IDo9IHZhbHVlOworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLkdldFJlY3Vyc2lvbkxpbWl0IDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGUmVjdXJzaW9uTGltaXQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuTmV4dFJlY3Vyc2lvbkxldmVsIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUHJvdG9jb2xSZWN1cnNpb25UcmFja2VySW1wbC5DcmVhdGUoU2VsZik7CitlbmQ7CisKK3Byb2NlZHVyZSBUUHJvdG9jb2xJbXBsLkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoOworYmVnaW4KKyAgaWYgRlJlY3Vyc2lvbkRlcHRoIDwgRlJlY3Vyc2lvbkxpbWl0CisgIHRoZW4gSW5jKEZSZWN1cnNpb25EZXB0aCkKKyAgZWxzZSByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb25EZXB0aExpbWl0LkNyZWF0ZSgnRGVwdGggbGltaXQgZXhjZWVkZWQnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGg7CitiZWdpbgorICBEZWMoRlJlY3Vyc2lvbkRlcHRoKQorZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLkdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnM7CitlbmQ7CisKK2Z1bmN0aW9uIFRQcm90b2NvbEltcGwuUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7Cit2YXIKKyAgYiA6IFRCeXRlczsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAnJzsKKyAgYiA6PSBSZWFkQmluYXJ5OworICBsZW4gOj0gTGVuZ3RoKCBiICk7CisgIGlmIGxlbiA+IDAgdGhlbgorICBiZWdpbgorICAgIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOworICAgIFN5c3RlbS5Nb3ZlKCBiWzBdLCBQb2ludGVyKFJlc3VsdCleLCBsZW4gKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUUHJvdG9jb2xJbXBsLlJlYWRTdHJpbmc6IHN0cmluZzsKK2JlZ2luCisgIFJlc3VsdCA6PSBURW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoIFJlYWRCaW5hcnkgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuV3JpdGVBbnNpU3RyaW5nKGNvbnN0IHM6IEFuc2lTdHJpbmcpOwordmFyCisgIGIgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBsZW4gOj0gTGVuZ3RoKHMpOworICBTZXRMZW5ndGgoIGIsIGxlbik7CisgIGlmIGxlbiA+IDAgdGhlbgorICBiZWdpbgorICAgIFN5c3RlbS5Nb3ZlKCBQb2ludGVyKHMpXiwgYlswXSwgbGVuICk7CisgIGVuZDsKKyAgV3JpdGVCaW5hcnkoIGIgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRQcm90b2NvbEltcGwuV3JpdGVTdHJpbmcoY29uc3Qgczogc3RyaW5nKTsKK3ZhcgorICBiIDogVEJ5dGVzOworYmVnaW4KKyAgYiA6PSBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgV3JpdGVCaW5hcnkoIGIgKTsKK2VuZDsKKworeyBUUHJvdG9jb2xVdGlsIH0KKworY2xhc3MgcHJvY2VkdXJlIFRQcm90b2NvbFV0aWwuU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOwordmFyIGZpZWxkIDogVFRocmlmdEZpZWxkOworICAgIG1hcCAgIDogVFRocmlmdE1hcDsKKyAgICBzZXRfICA6IFRUaHJpZnRTZXQ7CisgICAgbGlzdCAgOiBUVGhyaWZ0TGlzdDsKKyAgICBpICAgICA6IEludGVnZXI7CisgICAgdHJhY2tlciA6IElQcm90b2NvbFJlY3Vyc2lvblRyYWNrZXI7CitiZWdpbgorICB0cmFja2VyIDo9IHByb3QuTmV4dFJlY3Vyc2lvbkxldmVsOworICBjYXNlIHR5cGVfIG9mCisgICAgLy8gc2ltcGxlIHR5cGVzCisgICAgVFR5cGUuQm9vbF8gICA6ICBwcm90LlJlYWRCb29sKCk7CisgICAgVFR5cGUuQnl0ZV8gICA6ICBwcm90LlJlYWRCeXRlKCk7CisgICAgVFR5cGUuSTE2ICAgICA6ICBwcm90LlJlYWRJMTYoKTsKKyAgICBUVHlwZS5JMzIgICAgIDogIHByb3QuUmVhZEkzMigpOworICAgIFRUeXBlLkk2NCAgICAgOiAgcHJvdC5SZWFkSTY0KCk7CisgICAgVFR5cGUuRG91YmxlXyA6ICBwcm90LlJlYWREb3VibGUoKTsKKyAgICBUVHlwZS5TdHJpbmdfIDogIHByb3QuUmVhZEJpbmFyeSgpOy8vIERvbid0IHRyeSB0byBkZWNvZGUgdGhlIHN0cmluZywganVzdCBza2lwIGl0LgorCisgICAgLy8gc3RydWN0dXJlZCB0eXBlcworICAgIFRUeXBlLlN0cnVjdCA6ICBiZWdpbgorICAgICAgcHJvdC5SZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgICAgZmllbGQgOj0gcHJvdC5SZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoZmllbGQuVHlwZV8gPSBUVHlwZS5TdG9wKSB0aGVuIEJyZWFrOworICAgICAgICBTa2lwKHByb3QsIGZpZWxkLlR5cGVfKTsKKyAgICAgICAgcHJvdC5SZWFkRmllbGRFbmQoKTsKKyAgICAgIGVuZDsKKyAgICAgIHByb3QuUmVhZFN0cnVjdEVuZCgpOworICAgIGVuZDsKKworICAgIFRUeXBlLk1hcCA6ICBiZWdpbgorICAgICAgbWFwIDo9IHByb3QuUmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgaSA6PSAwIHRvIG1hcC5Db3VudC0xIGRvIGJlZ2luCisgICAgICAgIFNraXAocHJvdCwgbWFwLktleVR5cGUpOworICAgICAgICBTa2lwKHByb3QsIG1hcC5WYWx1ZVR5cGUpOworICAgICAgZW5kOworICAgICAgcHJvdC5SZWFkTWFwRW5kKCk7CisgICAgZW5kOworCisgICAgVFR5cGUuU2V0XyA6ICBiZWdpbgorICAgICAgc2V0XyA6PSBwcm90LlJlYWRTZXRCZWdpbigpOworICAgICAgZm9yIGkgOj0gMCB0byBzZXRfLkNvdW50LTEKKyAgICAgIGRvIFNraXAoIHByb3QsIHNldF8uRWxlbWVudFR5cGUpOworICAgICAgcHJvdC5SZWFkU2V0RW5kKCk7CisgICAgZW5kOworCisgICAgVFR5cGUuTGlzdCA6ICBiZWdpbgorICAgICAgbGlzdCA6PSBwcm90LlJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciBpIDo9IDAgdG8gbGlzdC5Db3VudC0xCisgICAgICBkbyBTa2lwKCBwcm90LCBsaXN0LkVsZW1lbnRUeXBlKTsKKyAgICAgIHByb3QuUmVhZExpc3RFbmQoKTsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgnVW5leHBlY3RlZCB0eXBlICcrSW50VG9TdHIoT3JkKHR5cGVfKSkpOworICBlbmQ7CitlbmQ7CisKKworeyBUQmluYXJ5UHJvdG9jb2xJbXBsIH0KKworY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkCisgIENyZWF0ZSggdHJhbnMsIEZhbHNlLCBUcnVlKTsKK2VuZDsKKworY29uc3RydWN0b3IgVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkLAorICBzdHJpY3RXcml0ZTogQm9vbGVhbik7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKCB0cmFucyApOworICBGU3RyaWN0UmVhZCA6PSBzdHJpY3RSZWFkOworICBGU3RyaWN0V3JpdGUgOj0gc3RyaWN0V3JpdGU7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEFsbCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlRyYW5zLlJlYWRBbGwoIHBCdWYsIGJ1Zmxlbiwgb2ZmLCBsZW4gKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkQmluYXJ5OiBUQnl0ZXM7Cit2YXIKKyAgc2l6ZSA6IEludGVnZXI7CisgIGJ1ZiA6IFRCeXRlczsKK2JlZ2luCisgIHNpemUgOj0gUmVhZEkzMjsKKyAgU2V0TGVuZ3RoKCBidWYsIHNpemUgKTsKKyAgRlRyYW5zLlJlYWRBbGwoIGJ1ZiwgMCwgc2l6ZSk7CisgIFJlc3VsdCA6PSBidWY7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJvb2w6IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gKFJlYWRCeXRlID0gMSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEJ5dGU6IFNob3J0SW50OworYmVnaW4KKyAgUmVhZEFsbCggQHJlc3VsdCwgU2l6ZU9mKHJlc3VsdCksIDAsIDEpOworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWREb3VibGU6IERvdWJsZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBDb252ZXJ0SW50NjRUb0RvdWJsZSggUmVhZEk2NCApCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK2JlZ2luCisgIEluaXQoIHJlc3VsdCwgJycsIFRUeXBlKCBSZWFkQnl0ZSksIDApOworICBpZiAoIHJlc3VsdC5UeXBlXyA8PiBUVHlwZS5TdG9wICkgdGhlbiBiZWdpbgorICAgIHJlc3VsdC5JZCA6PSBSZWFkSTE2OworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkSTE2OiBTbWFsbEludDsKK3ZhciBpMTZpbiA6IHBhY2tlZCBhcnJheVswLi4xXSBvZiBCeXRlOworYmVnaW4KKyAgUmVhZEFsbCggQGkxNmluLCBTaXplb2YoaTE2aW4pLCAwLCAyKTsKKyAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKK3ZhciBpMzJpbiA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOworYmVnaW4KKyAgUmVhZEFsbCggQGkzMmluLCBTaXplT2YoaTMyaW4pLCAwLCA0KTsKKworICBSZXN1bHQgOj0gSW50ZWdlcigKKyAgICAoKGkzMmluWzBdIGFuZCAkRkYpIHNobCAyNCkgb3IKKyAgICAoKGkzMmluWzFdIGFuZCAkRkYpIHNobCAxNikgb3IKKyAgICAoKGkzMmluWzJdIGFuZCAkRkYpIHNobCA4KSBvcgorICAgICAoaTMyaW5bM10gYW5kICRGRikpOworCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEk2NDogSW50NjQ7Cit2YXIgaTY0aW4gOiBwYWNrZWQgYXJyYXlbMC4uN10gb2YgQnl0ZTsKK2JlZ2luCisgIFJlYWRBbGwoIEBpNjRpbiwgU2l6ZU9mKGk2NGluKSwgMCwgOCk7CisgIFJlc3VsdCA6PQorICAgIChJbnQ2NCggaTY0aW5bMF0gYW5kICRGRikgc2hsIDU2KSBvcgorICAgIChJbnQ2NCggaTY0aW5bMV0gYW5kICRGRikgc2hsIDQ4KSBvcgorICAgIChJbnQ2NCggaTY0aW5bMl0gYW5kICRGRikgc2hsIDQwKSBvcgorICAgIChJbnQ2NCggaTY0aW5bM10gYW5kICRGRikgc2hsIDMyKSBvcgorICAgIChJbnQ2NCggaTY0aW5bNF0gYW5kICRGRikgc2hsIDI0KSBvcgorICAgIChJbnQ2NCggaTY0aW5bNV0gYW5kICRGRikgc2hsIDE2KSBvcgorICAgIChJbnQ2NCggaTY0aW5bNl0gYW5kICRGRikgc2hsIDgpIG9yCisgICAgKEludDY0KCBpNjRpbls3XSBhbmQgJEZGKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CitiZWdpbgorICByZXN1bHQuRWxlbWVudFR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgICAgOj0gUmVhZEkzMjsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOworYmVnaW4KKyAgcmVzdWx0LktleVR5cGUgICA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5WYWx1ZVR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgIDo9IFJlYWRJMzI7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CitiZWdpbgorCitlbmQ7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7Cit2YXIKKyAgc2l6ZSA6IEludGVnZXI7CisgIHZlcnNpb24gOiBJbnRlZ2VyOworYmVnaW4KKyAgSW5pdCggcmVzdWx0KTsKKyAgc2l6ZSA6PSBSZWFkSTMyOworICBpZiAoc2l6ZSA8IDApIHRoZW4gYmVnaW4KKyAgICB2ZXJzaW9uIDo9IHNpemUgYW5kIEludGVnZXIoIFZFUlNJT05fTUFTSyk7CisgICAgaWYgKCB2ZXJzaW9uIDw+IEludGVnZXIoIFZFUlNJT05fMSkpIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiAnICsgSW50VG9TdHIodmVyc2lvbikgKTsKKyAgICBlbmQ7CisgICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggc2l6ZSBhbmQgJDAwMDAwMGZmKTsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZTdHJpY3RSZWFkIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8nICk7CisgICAgZW5kOworICAgIHJlc3VsdC5OYW1lIDo9IFJlYWRTdHJpbmdCb2R5KCBzaXplICk7CisgICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggUmVhZEJ5dGUgKTsKKyAgICByZXN1bHQuU2VxSUQgOj0gUmVhZEkzMjsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUVuZDsKK2JlZ2luCisgIGluaGVyaXRlZDsKKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKK2JlZ2luCisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgICA6PSBSZWFkSTMyOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0RW5kOworYmVnaW4KKworZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJpbmdCb2R5KCBzaXplOiBJbnRlZ2VyKTogc3RyaW5nOwordmFyCisgIGJ1ZiA6IFRCeXRlczsKK2JlZ2luCisgIFNldExlbmd0aCggYnVmLCBzaXplICk7CisgIEZUcmFucy5SZWFkQWxsKCBidWYsIDAsIHNpemUgKTsKKyAgUmVzdWx0IDo9IFRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggYnVmKTsKK2VuZDsKKworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7CitiZWdpbgorICBJbml0KCBSZXN1bHQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0RW5kOworYmVnaW4KKyAgaW5oZXJpdGVkOworCitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOwordmFyIGlMZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgaUxlbiA6PSBMZW5ndGgoYik7CisgIFdyaXRlSTMyKCBpTGVuKTsKKyAgaWYgaUxlbiA+IDAgdGhlbiBGVHJhbnMuV3JpdGUoYiwgMCwgaUxlbik7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQm9vbChiOiBCb29sZWFuKTsKK2JlZ2luCisgIGlmIGIgdGhlbiBiZWdpbgorICAgIFdyaXRlQnl0ZSggMSApOworICBlbmQgZWxzZSBiZWdpbgorICAgIFdyaXRlQnl0ZSggMCApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQnl0ZShiOiBTaG9ydEludCk7CitiZWdpbgorICBGVHJhbnMuV3JpdGUoIEBiLCAwLCAxKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7CitiZWdpbgorICBXcml0ZUk2NChDb252ZXJ0RG91YmxlVG9JbnQ2NChkKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CitiZWdpbgorICBXcml0ZUJ5dGUoU2hvcnRJbnQoZmllbGQuVHlwZV8pKTsKKyAgV3JpdGVJMTYoZmllbGQuSUQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkRW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkU3RvcDsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChUVHlwZS5TdG9wKSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlSTE2KGkxNjogU21hbGxJbnQpOwordmFyIGkxNm91dCA6IHBhY2tlZCBhcnJheVswLi4xXSBvZiBCeXRlOworYmVnaW4KKyAgaTE2b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTE2IHNociA4KSk7CisgIGkxNm91dFsxXSA6PSBCeXRlKCRGRiBhbmQgaTE2KTsKKyAgRlRyYW5zLldyaXRlKCBAaTE2b3V0LCAwLCAyKTsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMzIoaTMyOiBJbnRlZ2VyKTsKK3ZhciBpMzJvdXQgOiBwYWNrZWQgYXJyYXlbMC4uM10gb2YgQnl0ZTsKK2JlZ2luCisgIGkzMm91dFswXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgMjQpKTsKKyAgaTMyb3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAxNikpOworICBpMzJvdXRbMl0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDgpKTsKKyAgaTMyb3V0WzNdIDo9IEJ5dGUoJEZGIGFuZCBpMzIpOworICBGVHJhbnMuV3JpdGUoIEBpMzJvdXQsIDAsIDQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUk2NCggY29uc3QgaTY0OiBJbnQ2NCk7Cit2YXIgaTY0b3V0IDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CitiZWdpbgorICBpNjRvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDU2KSk7CisgIGk2NG91dFsxXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDgpKTsKKyAgaTY0b3V0WzJdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA0MCkpOworICBpNjRvdXRbM10gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDMyKSk7CisgIGk2NG91dFs0XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgMjQpKTsKKyAgaTY0b3V0WzVdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociAxNikpOworICBpNjRvdXRbNl0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDgpKTsKKyAgaTY0b3V0WzddIDo9IEJ5dGUoJEZGIGFuZCBpNjQpOworICBGVHJhbnMuV3JpdGUoIEBpNjRvdXQsIDAsIDgpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOworYmVnaW4KKyAgV3JpdGVCeXRlKFNob3J0SW50KGxpc3QuRWxlbWVudFR5cGUpKTsKKyAgV3JpdGVJMzIobGlzdC5Db3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChtYXAuS2V5VHlwZSkpOworICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLlZhbHVlVHlwZSkpOworICBXcml0ZUkzMihtYXAuQ291bnQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwordmFyCisgIHZlcnNpb24gOiBDYXJkaW5hbDsKK2JlZ2luCisgIGlmIEZTdHJpY3RXcml0ZSB0aGVuCisgIGJlZ2luCisgICAgdmVyc2lvbiA6PSBWRVJTSU9OXzEgb3IgQ2FyZGluYWwoIG1zZy5UeXBlXyk7CisgICAgV3JpdGVJMzIoIEludGVnZXIoIHZlcnNpb24pICk7CisgICAgV3JpdGVTdHJpbmcoIG1zZy5OYW1lKTsKKyAgICBXcml0ZUkzMiggbXNnLlNlcUlEKTsKKyAgZW5kIGVsc2UKKyAgYmVnaW4KKyAgICBXcml0ZVN0cmluZyggbXNnLk5hbWUpOworICAgIFdyaXRlQnl0ZShTaG9ydEludCggbXNnLlR5cGVfKSk7CisgICAgV3JpdGVJMzIoIG1zZy5TZXFJRCk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNZXNzYWdlRW5kOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0KTsKK2JlZ2luCisgIFdyaXRlQnl0ZShTaG9ydEludChzZXRfLkVsZW1lbnRUeXBlKSk7CisgIFdyaXRlSTMyKHNldF8uQ291bnQpOworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVNldEVuZDsKK2JlZ2luCisKK2VuZDsKKworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOworYmVnaW4KKworZW5kOworCitwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEVuZDsKK2JlZ2luCisKK2VuZDsKKworeyBUUHJvdG9jb2xFeGNlcHRpb24gfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShNc2cpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlOiBUUHJvdG9jb2xFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJycpOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyKTogVFByb3RvY29sRXhjZXB0aW9uOworYmVnaW4KK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUodHlwZV8sICcnKTsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24uQ3JlYXRlKHR5cGVfOiBJbnRlZ2VyOyBjb25zdCBtc2c6IHN0cmluZyk6IFRQcm90b2NvbEV4Y2VwdGlvbjsKK2JlZ2luCisgIGNhc2UgdHlwZV8gb2YKKyAgICBJTlZBTElEX0RBVEE6ICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25JbnZhbGlkRGF0YS5DcmVhdGUobXNnKTsKKyAgICBORUdBVElWRV9TSVpFOiAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25OZWdhdGl2ZVNpemUuQ3JlYXRlKG1zZyk7CisgICAgU0laRV9MSU1JVDogICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uU2l6ZUxpbWl0LkNyZWF0ZShtc2cpOworICAgIEJBRF9WRVJTSU9OOiAgICAgUmVzdWx0IDo9IFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKG1zZyk7CisgICAgTk9UX0lNUExFTUVOVEVEOiBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uTm90SW1wbGVtZW50ZWQuQ3JlYXRlKG1zZyk7CisgICAgREVQVEhfTElNSVQ6ICAgICBSZXN1bHQgOj0gVFByb3RvY29sRXhjZXB0aW9uRGVwdGhMaW1pdC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUUHJvdG9jb2xFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShtc2cpOworICBlbmQ7CitlbmQ7CisKK3sgVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQgfQorCitjb25zdHJ1Y3RvciBUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZC5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOworYmVnaW4KKyAgaW5oZXJpdGVkIEhpZGRlbkNyZWF0ZShNc2cpOworZW5kOworCit7IFRUaHJpZnRTdHJpbmdCdWlsZGVyIH0KKworZnVuY3Rpb24gVFRocmlmdFN0cmluZ0J1aWxkZXIuQXBwZW5kKGNvbnN0IFZhbHVlOiBUQnl0ZXMpOiBUU3RyaW5nQnVpbGRlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBBcHBlbmQoIHN0cmluZyggUmF3Qnl0ZVN0cmluZyhWYWx1ZSkpICk7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJpbmdCdWlsZGVyLkFwcGVuZCgKKyAgY29uc3QgVmFsdWU6IElUaHJpZnRDb250YWluZXIpOiBUU3RyaW5nQnVpbGRlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBBcHBlbmQoIFZhbHVlLlRvU3RyaW5nICk7CitlbmQ7CisKK3sgVEJpbmFyeVByb3RvY29sSW1wbC5URmFjdG9yeSB9CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKEFTdHJpY3RSZWFkLCBBU3RyaWN0V3JpdGU6IEJvb2xlYW4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmljdFJlYWQgOj0gQVN0cmljdFJlYWQ7CisgIEZTdHJpY3RXcml0ZSA6PSBBU3RyaWN0V3JpdGU7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworYmVnaW4KKyAgLy9ubyBpbmhlcml0ZWQ7CisgIENyZWF0ZSggRmFsc2UsIFRydWUgKQorZW5kOworCitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkdldFByb3RvY29sKCBjb25zdCB0cmFuczogSVRyYW5zcG9ydCk6IElQcm90b2NvbDsKK2JlZ2luCisgIFJlc3VsdCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMsIEZTdHJpY3RSZWFkLCBGU3RyaWN0V3JpdGUpOworZW5kOworCisKK3sgVFByb3RvY29sRGVjb3JhdG9yIH0KKworY29uc3RydWN0b3IgVFByb3RvY29sRGVjb3JhdG9yLkNyZWF0ZSggY29uc3QgYVByb3RvY29sIDogSVByb3RvY29sKTsKK2JlZ2luCisgIEFTU0VSVCggYVByb3RvY29sIDw+IG5pbCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFQcm90b2NvbC5UcmFuc3BvcnQpOworICBGV3JhcHBlZFByb3RvY29sIDo9IGFQcm90b2NvbDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbiggc3RydWMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJ1Y3RFbmQ7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlU3RydWN0RW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luKCBmaWVsZCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUZpZWxkRW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZFN0b3A7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRTdG9wOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbiggbWFwKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTWFwRW5kOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZU1hcEVuZDsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlTGlzdEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RFbmQoKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVTZXRCZWdpbiggc2V0Xyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEVuZCgpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVCb29sKCBiOiBCb29sZWFuKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVCb29sKCBiKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlQnl0ZSggYjogU2hvcnRJbnQpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGUoIGIpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVJMTYoIGkxNjogU21hbGxJbnQpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUkxNiggaTE2KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlSTMyKCBpMzI6IEludGVnZXIpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUkzMiggaTMyKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlSTY0KCBjb25zdCBpNjQ6IEludDY0KTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVJNjQoIGk2NCk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVEb3VibGUoIGQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJpbmcoIGNvbnN0IHM6IHN0cmluZyApOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cmluZyggcyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUFuc2lTdHJpbmcoIGNvbnN0IHM6IEFuc2lTdHJpbmcpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUFuc2lTdHJpbmcoIHMpOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5KCBiKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1lc3NhZ2VFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEVuZDsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cnVjdEVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkRW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEVuZCgpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW47CitlbmQ7CisKKworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5SZWFkTWFwRW5kKCk7CitiZWdpbgorICBGV3JhcHBlZFByb3RvY29sLlJlYWRNYXBFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTGlzdEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZExpc3RFbmQoKTsKK2JlZ2luCisgIEZXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RFbmQoKTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFNldEJlZ2luOworZW5kOworCisKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFNldEVuZCgpOworYmVnaW4KKyAgRldyYXBwZWRQcm90b2NvbC5SZWFkU2V0RW5kKCk7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRCb29sOiBCb29sZWFuOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEJvb2w7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRCeXRlOiBTaG9ydEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRCeXRlOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkSTE2OiBTbWFsbEludDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRJMTY7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRJMzI6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkSTMyOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkSTY0OiBJbnQ2NDsKK2JlZ2luCisgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRJNjQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWREb3VibGU6RG91YmxlOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZERvdWJsZTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEJpbmFyeTogVEJ5dGVzOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZEJpbmFyeTsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cmluZzogc3RyaW5nOworYmVnaW4KKyAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZFN0cmluZzsKK2VuZDsKKworCitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEFuc2lTdHJpbmc6IEFuc2lTdHJpbmc7CitiZWdpbgorICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkQW5zaVN0cmluZzsKK2VuZDsKKworCit7IEluaXQgaGVscGVyIGZ1bmN0aW9ucyB9CisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1lc3NhZ2U7IGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOyBjb25zdCBBU2VxSUQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CisgIHJlYy5UeXBlXyA6PSBBTWVzc2FnZVR5cGU7CisgIHJlYy5TZXFJRCA6PSBBU2VxSUQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyBjb25zdCBBTmFtZTogc3RyaW5nID0gJycpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7IGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsgY29uc3QgQUlEOiBTbWFsbEludCk7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKKyAgcmVjLlR5cGVfIDo9IEFUeXBlOworICByZWMuSWQgOj0gQUlkOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgY29uc3QgQUtleVR5cGUsIEFWYWx1ZVR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLlZhbHVlVHlwZSA6PSBBVmFsdWVUeXBlOworICByZWMuS2V5VHlwZSA6PSBBS2V5VHlwZTsKKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTZXQ7IGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuQ291bnQgOj0gQUNvdW50OworICByZWMuRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7IGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuQ291bnQgOj0gQUNvdW50OworICByZWMuRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOworZW5kOworCisKKworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcmlhbGl6ZXIucGFzCmluZGV4IGE4MWNlZjAuLjVmMjkwNWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJpYWxpemVyLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU2VyaWFsaXplci5wYXMKQEAgLTE4LDEwICsxOCwxNiBAQAogICopCiB1bml0IFRocmlmdC5TZXJpYWxpemVyOwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQorCiBpbnRlcmZhY2UKIAogdXNlcworICB7JElGREVGIE9MRF9VTklUX05BTUVTfQogICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKKyAgeyRFTFNFfQorICBTeXN0ZW0uQ2xhc3NlcywgV2luYXBpLldpbmRvd3MsIFN5c3RlbS5TeXNVdGlscywKKyAgeyRFTkRJRn0KICAgVGhyaWZ0LlByb3RvY29sLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuU3RyZWFtOwpAQCAtODYsNiArOTIsNyBAQAogY29uc3RydWN0b3IgVFNlcmlhbGl6ZXIuQ3JlYXRlKCk7CiAvLyBDcmVhdGUgYSBuZXcgVFNlcmlhbGl6ZXIgdGhhdCB1c2VzIHRoZSBUQmluYXJ5UHJvdG9jb2wgYnkgZGVmYXVsdC4KIGJlZ2luCisgIC8vbm8gaW5oZXJpdGVkOwogICBDcmVhdGUoIFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKTsKIGVuZDsKIApAQCAtMTM3LDggKzE0NCw3IEBACiBwcm9jZWR1cmUgVFNlcmlhbGl6ZXIuU2VyaWFsaXplKCBjb25zdCBpbnB1dCA6IElCYXNlOyBjb25zdCBhU3RtIDogVFN0cmVhbSk7CiAvLyBTZXJpYWxpemUgdGhlIFRocmlmdCBvYmplY3QgaW50byBhIGJ5dGUgYXJyYXkuIFRoZSBwcm9jZXNzIGlzIHNpbXBsZSwKIC8vIGp1c3QgY2xlYXIgdGhlIGJ5dGUgYXJyYXkgb3V0cHV0LCB3cml0ZSB0aGUgb2JqZWN0IGludG8gaXQsIGFuZCBncmFiIHRoZQotLy8gcmF3IGJ5dGVzLiAKLXZhciBpQnl0ZXMgOiBJbnQ2NDsKKy8vIHJhdyBieXRlcy4KIGNvbnN0IENPUFlfRU5USVJFX1NUUkVBTSA9IDA7CiBiZWdpbgogICB0cnkKQEAgLTE1Nyw2ICsxNjMsNyBAQAogY29uc3RydWN0b3IgVERlc2VyaWFsaXplci5DcmVhdGUoKTsKIC8vIENyZWF0ZSBhIG5ldyBURGVzZXJpYWxpemVyIHRoYXQgdXNlcyB0aGUgVEJpbmFyeVByb3RvY29sIGJ5IGRlZmF1bHQuCiBiZWdpbgorICAvL25vIGluaGVyaXRlZDsKICAgQ3JlYXRlKCBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSk7CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TZXJ2ZXIucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKaW5kZXggZDQzNzUyNy4uMTNjNTc2MiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNlcnZlci5wYXMKQEAgLTE5LDE5ICsxOSw0MiBAQAogCiAgdW5pdCBUaHJpZnQuU2VydmVyOwogCit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQoreyRJLX0gIC8vIHByZXZlbnQgYW5ub3lpbmcgZXJyb3JzIHdpdGggZGVmYXVsdCBsb2cgZGVsZWdhdGUgYW5kIG5vIGNvbnNvbGUKKwogaW50ZXJmYWNlCiAKIHVzZXMKLSAgU3lzVXRpbHMsCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIFdpbmRvd3MsIFN5c1V0aWxzLAorICB7JEVMU0V9CisgIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsCisgIHskRU5ESUZ9CiAgIFRocmlmdCwKICAgVGhyaWZ0LlByb3RvY29sLAogICBUaHJpZnQuVHJhbnNwb3J0OwogCiB0eXBlCisgIElTZXJ2ZXJFdmVudHMgPSBpbnRlcmZhY2UKKyAgICBbJ3s5RTJBOTlDNS1FRTg1LTQwQjItOUE1Mi0yRDE3MjJCMTgxNzZ9J10KKyAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zLgorICAgIHByb2NlZHVyZSBQcmVTZXJ2ZTsKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2VydmVyIHRyYW5zcG9ydCBpcyByZWFkeSB0byBhY2NlcHQgcmVxdWVzdHMKKyAgICBwcm9jZWR1cmUgUHJlQWNjZXB0OworICAgIC8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCB0aGUgc2VydmVyIGlzIGFib3V0IHRvIGJlaW5nIHByb2Nlc3NpbmcuCisgICAgZnVuY3Rpb24gIENyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KCBjb25zdCBpbnB1dCwgb3V0cHV0IDogSVByb3RvY29sKSA6IElQcm9jZXNzb3JFdmVudHM7CisgIGVuZDsKKworCiAgIElTZXJ2ZXIgPSBpbnRlcmZhY2UKLSAgICBbJ3tDRjlGNTZDNi1CQjM5LTRDN0QtODc3Qi00M0I0MTY1NzJDRTZ9J10KKyAgICBbJ3tBREM0NkYyRC04MTk5LTREMUMtOTZEMi04N0ZENTQzNTE3MjN9J10KICAgICBwcm9jZWR1cmUgU2VydmU7CiAgICAgcHJvY2VkdXJlIFN0b3A7CisKKyAgICBmdW5jdGlvbiBHZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXJFdmVudHMoIGNvbnN0IHZhbHVlIDogSVNlcnZlckV2ZW50cyk7CisKKyAgICBwcm9wZXJ0eSBTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzIHJlYWQgR2V0U2VydmVyRXZlbnRzIHdyaXRlIFNldFNlcnZlckV2ZW50czsKICAgZW5kOwogCiAgIFRTZXJ2ZXJJbXBsID0gY2xhc3MgYWJzdHJhY3QoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2VydmVyICkKQEAgLTQ2LDkgKzY5LDEzIEBACiAgICAgRklucHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKICAgICBGT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeTsKICAgICBGTG9nRGVsZWdhdGUgOiBUTG9nRGVsZWdhdGU7CisgICAgRlNlcnZlckV2ZW50cyA6IElTZXJ2ZXJFdmVudHM7CiAKICAgICBjbGFzcyBwcm9jZWR1cmUgRGVmYXVsdExvZ0RlbGVnYXRlKCBjb25zdCBzdHI6IHN0cmluZyk7CiAKKyAgICBmdW5jdGlvbiBHZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXJFdmVudHMoIGNvbnN0IHZhbHVlIDogSVNlcnZlckV2ZW50cyk7CisKICAgICBwcm9jZWR1cmUgU2VydmU7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBTdG9wOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgcHVibGljCkBAIC02MiwxMCArODksMTAgQEAKICAgICAgIGNvbnN0IEFMb2dEZWxlZ2F0ZSA6IFRMb2dEZWxlZ2F0ZQogICAgICAgKTsgb3ZlcmxvYWQ7CiAKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIAorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgKICAgICAgIGNvbnN0IEFQcm9jZXNzb3IgOklQcm9jZXNzb3I7CiAgICAgICBjb25zdCBBU2VydmVyVHJhbnNwb3J0OiBJU2VydmVyVHJhbnNwb3J0Ci0JICApOyBvdmVybG9hZDsKKyAgICAgICk7IG92ZXJsb2FkOwogCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKAogICAgICAgY29uc3QgQVByb2Nlc3NvciA6SVByb2Nlc3NvcjsKQEAgLTEyMCw2ICsxNDcsNyBAQAogICBJbnB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOwogICBPdXRwdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKIAorICAvL25vIGluaGVyaXRlZDsKICAgQ3JlYXRlKAogICAgIEFQcm9jZXNzb3IsCiAgICAgQVNlcnZlclRyYW5zcG9ydCwKQEAgLTE0Myw2ICsxNzEsNyBAQAogICBJbnB1dFRyYW5zRmFjdG9yeSA6PSBUVHJhbnNwb3J0RmFjdG9yeUltcGwuQ3JlYXRlOwogICBPdXRwdXRUcmFuc0ZhY3RvcnkgOj0gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkNyZWF0ZTsKIAorICAvL25vIGluaGVyaXRlZDsKICAgQ3JlYXRlKAogICAgIEFQcm9jZXNzb3IsCiAgICAgQVNlcnZlclRyYW5zcG9ydCwKQEAgLTE2Myw2ICsxOTIsNyBAQAogICBJbnB1dFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOwogCisgIC8vbm8gaW5oZXJpdGVkOwogICBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsIEFUcmFuc3BvcnRGYWN0b3J5LCBBVHJhbnNwb3J0RmFjdG9yeSwKICAgICBJbnB1dFByb3RvY29sRmFjdG9yeSwgT3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBEZWZhdWx0TG9nRGVsZWdhdGUpOwogZW5kOwpAQCAtMTczLDYgKzIwMyw3IEBACiAgIGNvbnN0IEFJbnB1dFByb3RvY29sRmFjdG9yeSwgQU91dHB1dFByb3RvY29sRmFjdG9yeTogSVByb3RvY29sRmFjdG9yeTsKICAgY29uc3QgQUxvZ0RlbGVnYXRlIDogVExvZ0RlbGVnYXRlKTsKIGJlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CiAgIEZQcm9jZXNzb3IgOj0gQVByb2Nlc3NvcjsKICAgRlNlcnZlclRyYW5zcG9ydCA6PSBBU2VydmVyVHJhbnNwb3J0OwogICBGSW5wdXRUcmFuc3BvcnRGYWN0b3J5IDo9IEFJbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CkBAIC0xODQsMTkgKzIxNSwzOSBAQAogCiBjbGFzcyBwcm9jZWR1cmUgVFNlcnZlckltcGwuRGVmYXVsdExvZ0RlbGVnYXRlKCBjb25zdCBzdHI6IHN0cmluZyk7CiBiZWdpbgotICBXcml0ZWxuKCBzdHIgKTsKKyAgdHJ5CisgICAgV3JpdGVsbiggc3RyKTsKKyAgICBpZiBJb1Jlc3VsdCA8PiAwIHRoZW4gT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoc3RyKSk7CisgIGV4Y2VwdAorICAgIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKHN0cikpOworICBlbmQ7CiBlbmQ7CiAKIGNvbnN0cnVjdG9yIFRTZXJ2ZXJJbXBsLkNyZWF0ZSggY29uc3QgQVByb2Nlc3NvcjogSVByb2Nlc3NvcjsKICAgY29uc3QgQVNlcnZlclRyYW5zcG9ydDogSVNlcnZlclRyYW5zcG9ydDsgY29uc3QgQVRyYW5zcG9ydEZhY3Rvcnk6IElUcmFuc3BvcnRGYWN0b3J5OwogICBjb25zdCBBUHJvdG9jb2xGYWN0b3J5OiBJUHJvdG9jb2xGYWN0b3J5KTsKIGJlZ2luCisgIC8vbm8gaW5oZXJpdGVkOwogICBDcmVhdGUoIEFQcm9jZXNzb3IsIEFTZXJ2ZXJUcmFuc3BvcnQsCiAgICAgICAgICAgQVRyYW5zcG9ydEZhY3RvcnksIEFUcmFuc3BvcnRGYWN0b3J5LAogICAgICAgICAgIEFQcm90b2NvbEZhY3RvcnksIEFQcm90b2NvbEZhY3RvcnksCiAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKTsKIGVuZDsKIAorCitmdW5jdGlvbiBUU2VydmVySW1wbC5HZXRTZXJ2ZXJFdmVudHMgOiBJU2VydmVyRXZlbnRzOworYmVnaW4KKyAgcmVzdWx0IDo9IEZTZXJ2ZXJFdmVudHM7CitlbmQ7CisKKworcHJvY2VkdXJlIFRTZXJ2ZXJJbXBsLlNldFNlcnZlckV2ZW50cyggY29uc3QgdmFsdWUgOiBJU2VydmVyRXZlbnRzKTsKK2JlZ2luCisgIC8vIGlmIHlvdSBuZWVkIG1vcmUgdGhhbiBvbmUsIHByb3ZpZGUgYSBzcGVjaWFsaXplZCBJU2VydmVyRXZlbnRzIGltcGxlbWVudGF0aW9uCisgIEZTZXJ2ZXJFdmVudHMgOj0gdmFsdWU7CitlbmQ7CisKKwogeyBUU2ltcGxlU2VydmVyIH0KIAogY29uc3RydWN0b3IgVFNpbXBsZVNlcnZlci5DcmVhdGUoIGNvbnN0IEFQcm9jZXNzb3I6IElQcm9jZXNzb3I7CkBAIC0yNTUsNiArMzA2LDcgQEAKICAgT3V0cHV0VHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKICAgSW5wdXRQcm90b2NvbCA6IElQcm90b2NvbDsKICAgT3V0cHV0UHJvdG9jb2wgOiBJUHJvdG9jb2w7CisgIGNvbnRleHQgOiBJUHJvY2Vzc29yRXZlbnRzOwogYmVnaW4KICAgdHJ5CiAgICAgRlNlcnZlclRyYW5zcG9ydC5MaXN0ZW47CkBAIC0yNjUsMzggKzMxNyw3OSBAQAogICAgIGVuZDsKICAgZW5kOwogCi0gIGNsaWVudCA6PSBuaWw7Ci0gIElucHV0VHJhbnNwb3J0IDo9IG5pbDsKLSAgT3V0cHV0VHJhbnNwb3J0IDo9IG5pbDsKLSAgSW5wdXRQcm90b2NvbCA6PSBuaWw7Ci0gIE91dHB1dFByb3RvY29sIDo9IG5pbDsKKyAgaWYgRlNlcnZlckV2ZW50cyA8PiBuaWwKKyAgdGhlbiBGU2VydmVyRXZlbnRzLlByZVNlcnZlOwogCisgIGNsaWVudCA6PSBuaWw7CiAgIHdoaWxlIChub3QgRlN0b3ApIGRvCiAgIGJlZ2luCiAgICAgdHJ5Ci0gICAgICBjbGllbnQgOj0gRlNlcnZlclRyYW5zcG9ydC5BY2NlcHQ7CisgICAgICAvLyBjbGVhbiB1cCBhbnkgb2xkIGluc3RhbmNlcyBiZWZvcmUgd2FpdGluZyBmb3IgY2xpZW50cworICAgICAgSW5wdXRUcmFuc3BvcnQgOj0gbmlsOworICAgICAgT3V0cHV0VHJhbnNwb3J0IDo9IG5pbDsKKyAgICAgIElucHV0UHJvdG9jb2wgOj0gbmlsOworICAgICAgT3V0cHV0UHJvdG9jb2wgOj0gbmlsOworCisgICAgICAvLyBjbG9zZSBhbnkgb2xkIGNvbm5lY3Rpb25zIGJlZm9yZSBiZWZvcmUgd2FpdGluZyBmb3IgbmV3IGNsaWVudHMKKyAgICAgIGlmIGNsaWVudCA8PiBuaWwgdGhlbiB0cnkKKyAgICAgICAgdHJ5CisgICAgICAgICAgY2xpZW50LkNsb3NlOworICAgICAgICBmaW5hbGx5CisgICAgICAgICAgY2xpZW50IDo9IG5pbDsKKyAgICAgICAgZW5kOworICAgICAgZXhjZXB0CisgICAgICAgIC8vIGNhdGNoIGFsbCwgd2UgY2FuJ3QgZG8gbXVjaCBhYm91dCBpdCBhdCB0aGlzIHBvaW50CisgICAgICBlbmQ7CisKKyAgICAgIGNsaWVudCA6PSBGU2VydmVyVHJhbnNwb3J0LkFjY2VwdCggcHJvY2VkdXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgRlNlcnZlckV2ZW50cyA8PiBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIEZTZXJ2ZXJFdmVudHMuUHJlQWNjZXB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpOworCisgICAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiBiZWdpbgorICAgICAgICBpZiBGU3RvcAorICAgICAgICB0aGVuIEFib3J0ICAvLyBzaWxlbnQgZXhjZXB0aW9uCisgICAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCcpOworICAgICAgZW5kOworCiAgICAgICBGTG9nRGVsZWdhdGUoICdDbGllbnQgQ29ubmVjdGVkIScpOworCiAgICAgICBJbnB1dFRyYW5zcG9ydCA6PSBGSW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCggY2xpZW50ICk7CiAgICAgICBPdXRwdXRUcmFuc3BvcnQgOj0gRk91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KCBjbGllbnQgKTsKICAgICAgIElucHV0UHJvdG9jb2wgOj0gRklucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKCBJbnB1dFRyYW5zcG9ydCApOwogICAgICAgT3V0cHV0UHJvdG9jb2wgOj0gRk91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCggT3V0cHV0VHJhbnNwb3J0ICk7Ci0gICAgICB3aGlsZSAoIEZQcm9jZXNzb3IuUHJvY2VzcyggSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wgKSkgZG8KLSAgICAgIGJlZ2luCi0gICAgICAgIGlmIEZTdG9wIHRoZW4gQnJlYWs7CisKKyAgICAgIGlmIEZTZXJ2ZXJFdmVudHMgPD4gbmlsCisgICAgICB0aGVuIGNvbnRleHQgOj0gRlNlcnZlckV2ZW50cy5DcmVhdGVQcm9jZXNzaW5nQ29udGV4dCggSW5wdXRQcm90b2NvbCwgT3V0cHV0UHJvdG9jb2wpCisgICAgICBlbHNlIGNvbnRleHQgOj0gbmlsOworCisgICAgICB3aGlsZSBub3QgRlN0b3AgZG8gYmVnaW4KKyAgICAgICAgaWYgY29udGV4dCA8PiBuaWwKKyAgICAgICAgdGhlbiBjb250ZXh0LlByb2Nlc3NpbmcoIGNsaWVudCk7CisgICAgICAgIGlmIG5vdCBGUHJvY2Vzc29yLlByb2Nlc3MoIElucHV0UHJvdG9jb2wsIE91dHB1dFByb3RvY29sLCBjb250ZXh0KQorICAgICAgICB0aGVuIEJyZWFrOwogICAgICAgZW5kOworCiAgICAgZXhjZXB0CiAgICAgICBvbiBFOiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvCiAgICAgICBiZWdpbgotICAgICAgICBpZiBGU3RvcCB0aGVuCi0gICAgICAgIGJlZ2luCi0gICAgICAgICAgRkxvZ0RlbGVnYXRlKCdUU2ltcGxlU2VydmVyIHdhcyBzaHV0dGluZyBkb3duLCBjYXVnaHQgJyArIEUuQ2xhc3NOYW1lKTsKLSAgICAgICAgZW5kOworICAgICAgICBpZiBGU3RvcAorICAgICAgICB0aGVuIEZMb2dEZWxlZ2F0ZSgnVFNpbXBsZVNlcnZlciB3YXMgc2h1dHRpbmcgZG93biwgY2F1Z2h0ICcgKyBFLlRvU3RyaW5nKQorICAgICAgICBlbHNlIEZMb2dEZWxlZ2F0ZSggRS5Ub1N0cmluZyk7CiAgICAgICBlbmQ7CiAgICAgICBvbiBFOiBFeGNlcHRpb24gZG8KICAgICAgIGJlZ2luCi0gICAgICAgIEZMb2dEZWxlZ2F0ZSggRS5Ub1N0cmluZyApOworICAgICAgICBGTG9nRGVsZWdhdGUoIEUuVG9TdHJpbmcpOwogICAgICAgZW5kOwogICAgIGVuZDsKKworICAgIGlmIGNvbnRleHQgPD4gbmlsCisgICAgdGhlbiBiZWdpbgorICAgICAgY29udGV4dC5DbGVhbnVwQ29udGV4dDsKKyAgICAgIGNvbnRleHQgOj0gbmlsOworICAgIGVuZDsKKwogICAgIGlmIElucHV0VHJhbnNwb3J0IDw+IG5pbCB0aGVuCiAgICAgYmVnaW4KICAgICAgIElucHV0VHJhbnNwb3J0LkNsb3NlOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU29ja2V0LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGNhYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlNvY2tldC5wYXMKQEAgLTAsMCArMSwxNjE3IEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlNvY2tldDsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skSS19ICAvLyBwcmV2ZW50IGFubm95aW5nIGVycm9ycyB3aXRoIGRlZmF1bHQgbG9nIGRlbGVnYXRlIGFuZCBubyBjb25zb2xlCisKK2ludGVyZmFjZQoreyRJRk5ERUYgT0xEX1NPQ0tFVFN9IC8vIG5vdCBmb3IgT0xEX1NPQ0tFVFMKKwordXNlcworICBXaW5hcGkuV2luZG93cywgV2luYXBpLldpbnNvY2syOworCitjb25zdAorICBBSV9QQVNTSVZFICAgICAgICAgICAgICAgID0gJDAwMDAwMDAxOyAgLy8gU29ja2V0IGFkZHJlc3Mgd2lsbCBiZSB1c2VkIGluIGJpbmQoKSBjYWxsCisgIEFJX0NBTk9OTkFNRSAgICAgICAgICAgICAgPSAkMDAwMDAwMDI7ICAvLyBSZXR1cm4gY2Fub25pY2FsIG5hbWUgaW4gZmlyc3QgYWlfY2Fub25uYW1lCisgIEFJX05VTUVSSUNIT1NUICAgICAgICAgICAgPSAkMDAwMDAwMDQ7ICAvLyBOb2RlbmFtZSBtdXN0IGJlIGEgbnVtZXJpYyBhZGRyZXNzIHN0cmluZworICBBSV9OVU1FUklDU0VSViAgICAgICAgICAgID0gJDAwMDAwMDA4OyAgLy8gU2VydmljZW5hbWUgbXVzdCBiZSBhIG51bWVyaWMgcG9ydCBudW1iZXIKKworICBBSV9BTEwgICAgICAgICAgICAgICAgICAgID0gJDAwMDAwMTAwOyAgLy8gUXVlcnkgYm90aCBJUDYgYW5kIElQNCB3aXRoIEFJX1Y0TUFQUEVECisgIEFJX0FERFJDT05GSUcgICAgICAgICAgICAgPSAkMDAwMDA0MDA7ICAvLyBSZXNvbHV0aW9uIG9ubHkgaWYgZ2xvYmFsIGFkZHJlc3MgY29uZmlndXJlZAorICBBSV9WNE1BUFBFRCAgICAgICAgICAgICAgID0gJDAwMDAwODAwOyAgLy8gT24gdjYgZmFpbHVyZSwgcXVlcnkgdjQgYW5kIGNvbnZlcnQgdG8gVjRNQVBQRUQgZm9ybWF0CisKKyAgQUlfTk9OX0FVVEhPUklUQVRJVkUgICAgICA9ICQwMDAwNDAwMDsgIC8vIExVUF9OT05fQVVUSE9SSVRBVElWRQorICBBSV9TRUNVUkUgICAgICAgICAgICAgICAgID0gJDAwMDA4MDAwOyAgLy8gTFVQX1NFQ1VSRQorICBBSV9SRVRVUk5fUFJFRkVSUkVEX05BTUVTID0gJDAwMDEwMDAwOyAgLy8gTFVQX1JFVFVSTl9QUkVGRVJSRURfTkFNRVMKKworICBBSV9GUUROICAgICAgICAgICAgICAgICAgID0gJDAwMDIwMDAwOyAgLy8gUmV0dXJuIHRoZSBGUUROIGluIGFpX2Nhbm9ubmFtZQorICBBSV9GSUxFU0VSVkVSICAgICAgICAgICAgID0gJDAwMDQwMDAwOyAgLy8gUmVzb2x2aW5nIGZpbGVzZXJ2ZXIgbmFtZSByZXNvbHV0aW9uCisKK3R5cGUKKyAgUEFkZHJJbmZvQSA9IF5UQWRkckluZm9BOworICBUQWRkckluZm9BID0gcmVjb3JkCisgICAgYWlfZmxhZ3M6IEludGVnZXI7CisgICAgYWlfZmFtaWx5OiBJbnRlZ2VyOworICAgIGFpX3NvY2t0eXBlOiBJbnRlZ2VyOworICAgIGFpX3Byb3RvY29sOiBJbnRlZ2VyOworICAgIGFpX2FkZHJsZW46IE5hdGl2ZVVJbnQ7CisgICAgYWlfY2Fub25uYW1lOiBQQW5zaUNoYXI7CisgICAgYWlfYWRkcjogUFNvY2tBZGRyOworICAgIGFpX25leHQ6IFBBZGRySW5mb0E7CisgIGVuZDsKKworICBQQWRkckluZm9XID0gXlRBZGRySW5mb1c7CisgIFRBZGRySW5mb1cgPSByZWNvcmQKKyAgICBhaV9mbGFnczogSW50ZWdlcjsKKyAgICBhaV9mYW1pbHk6IEludGVnZXI7CisgICAgYWlfc29ja3R5cGU6IEludGVnZXI7CisgICAgYWlfcHJvdG9jb2w6IEludGVnZXI7CisgICAgYWlfYWRkcmxlbjogTmF0aXZlVUludDsKKyAgICBhaV9jYW5vbm5hbWU6IFBDaGFyOworICAgIGFpX2FkZHI6IFBTb2NrQWRkcjsKKyAgICBhaV9uZXh0OiBQQWRkckluZm9XOworICBlbmQ7CisKKyAgVEFkZHJlc3NGYW1pbHkgPSBVU0hPUlQ7CisKKyAgVEluNkFkZHIgPSByZWNvcmQKKyAgY2FzZSBJbnRlZ2VyIG9mCisgICAgMDogKF9CeXRlOiBhcnJheVswLi4xNV0gb2YgVUNIQVIpOworICAgIDE6IChfV29yZDogYXJyYXlbMC4uN10gb2YgVVNIT1JUKTsKKyAgZW5kOworCisgIFRTY29wZUlkID0gcmVjb3JkCisgIHB1YmxpYworICAgIFZhbHVlOiBVTE9ORzsKKyAgcHJpdmF0ZQorICAgIGZ1bmN0aW9uIEdldEJpdEZpZWxkKExvYzogSW50ZWdlcik6IEludGVnZXI7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgU2V0Qml0RmllbGQoTG9jOiBJbnRlZ2VyOyBjb25zdCBhVmFsdWU6IEludGVnZXIpOyBpbmxpbmU7CisgIHB1YmxpYworICAgIHByb3BlcnR5IFpvbmU6IEludGVnZXIgaW5kZXggJDAwMjggcmVhZCBHZXRCaXRGaWVsZCB3cml0ZSBTZXRCaXRGaWVsZDsKKyAgICBwcm9wZXJ0eSBMZXZlbDogSW50ZWdlciBpbmRleCAkMjgwNCByZWFkIEdldEJpdEZpZWxkIHdyaXRlIFNldEJpdEZpZWxkOworICBlbmQ7CisKKyAgVFNvY2tBZGRySW42ID0gcmVjb3JkCisgICAgc2luNl9mYW1pbHk6IFRBZGRyZXNzRmFtaWx5OworICAgIHNpbjZfcG9ydDogVVNIT1JUOworICAgIHNpbjZfZmxvd2luZm86IFVMT05HOworICAgIHNpbjZfYWRkcjogVEluNkFkZHI7CisgIGNhc2UgSW50ZWdlciBvZgorICAgIDA6IChzaW42X3Njb3BlX2lkOiBVTE9ORyk7CisgICAgMTogKHNpbjZfc2NvcGVfc3RydWN0OiBUU2NvcGVJZCk7CisgIGVuZDsKKyAgUFNvY2tBZGRySW42ID0gXlRTb2NrQWRkckluNjsKKworY29uc3QKKyAgTklfTk9GUUROICAgICAgPSAkMDE7ICAvLyBPbmx5IHJldHVybiBub2RlbmFtZSBwb3J0aW9uIGZvciBsb2NhbCBob3N0cworICBOSV9OVU1FUklDSE9TVCA9ICQwMjsgIC8vIFJldHVybiBudW1lcmljIGZvcm0gb2YgdGhlIGhvc3QncyBhZGRyZXNzCisgIE5JX05BTUVSRVFEICAgID0gJDA0OyAgLy8gRXJyb3IgaWYgdGhlIGhvc3QncyBuYW1lIG5vdCBpbiBETlMKKyAgTklfTlVNRVJJQ1NFUlYgPSAkMDg7ICAvLyBSZXR1cm4gbnVtZXJpYyBmb3JtIG9mIHRoZSBzZXJ2aWNlIChwb3J0ICMpCisgIE5JX0RHUkFNICAgICAgID0gJDEwOyAgLy8gU2VydmljZSBpcyBhIGRhdGFncmFtIHNlcnZpY2UKKworICBOSV9NQVhIT1NUICAgICA9IDEwMjU7ICAvLyBNYXggc2l6ZSBvZiBhIGZ1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZQorICBOSV9NQVhTRVJWICAgICA9IDMyOyAgICAvLyBNYXggc2l6ZSBvZiBhIHNlcnZpY2UgbmFtZQorCitmdW5jdGlvbiBnZXRhZGRyaW5mbyhwTm9kZU5hbWUsIHBTZXJ2aWNlTmFtZTogUEFuc2lDaGFyOyBjb25zdCBwSGludHM6IFRBZGRySW5mb0E7IHZhciBwcFJlc3VsdDogUEFkZHJJbmZvQSk6IEludGVnZXI7IHN0ZGNhbGw7CitmdW5jdGlvbiBHZXRBZGRySW5mb1cocE5vZGVOYW1lLCBwU2VydmljZU5hbWU6IFBXaWRlQ2hhcjsgY29uc3QgcEhpbnRzOiBUQWRkckluZm9XOyB2YXIgcHBSZXN1bHQ6IFBBZGRySW5mb1cpOiBJbnRlZ2VyOyBzdGRjYWxsOworcHJvY2VkdXJlIGZyZWVhZGRyaW5mbyhwQWRkckluZm86IFBBZGRySW5mb0EpOyBzdGRjYWxsOworcHJvY2VkdXJlIEZyZWVBZGRySW5mb1cocEFkZHJJbmZvOiBQQWRkckluZm9XKTsgc3RkY2FsbDsKK2Z1bmN0aW9uIGdldG5hbWVpbmZvKGNvbnN0IHBTb2NrYWRkcjogVFNvY2tBZGRyOyBTb2NrYWRkckxlbmd0aDogSW50ZWdlcjsgcE5vZGVCdWZmZXI6IFBBbnNpQ2hhcjsgTm9kZUJ1ZmZlclNpemU6IERXT1JEOyBwU2VydmljZUJ1ZmZlcjogUEFuc2lDaGFyOworICBTZXJ2aWNlQnVmZmVyU2l6ZTogRFdPUkQ7IEZsYWdzOiBJbnRlZ2VyKTogSW50ZWdlcjsgc3RkY2FsbDsKK2Z1bmN0aW9uIEdldE5hbWVJbmZvVyhjb25zdCBwU29ja2FkZHI6IFRTb2NrQWRkcjsgU29ja2FkZHJMZW5ndGg6IEludGVnZXI7IHBOb2RlQnVmZmVyOiBQV2lkZUNoYXI7IE5vZGVCdWZmZXJTaXplOiBEV09SRDsgcFNlcnZpY2VCdWZmZXI6IFBXaWRlQ2hhcjsKKyAgU2VydmljZUJ1ZmZlclNpemU6IERXT1JEOyBGbGFnczogSW50ZWdlcik6IEludGVnZXI7IHN0ZGNhbGw7CisKK3R5cGUKKyAgVFNtYXJ0UG9pbnRlckRlc3Ryb3llcjxUPiA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoVmFsdWU6IFQpOworCisgIElTbWFydFBvaW50ZXI8VD4gPSByZWZlcmVuY2UgdG8gZnVuY3Rpb246IFQ7CisKKyAgVFNtYXJ0UG9pbnRlcjxUPiA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJU21hcnRQb2ludGVyPFQ+KQorICBwcml2YXRlCisgICAgRlZhbHVlOiBUOworICAgIEZEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD47CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBVmFsdWU6IFQ7IEFEZXN0cm95ZXI6IFRTbWFydFBvaW50ZXJEZXN0cm95ZXI8VD4pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gSW52b2tlOiBUOworICBlbmQ7CisKKyAgVEJhc2VTb2NrZXQgPSBjbGFzcyBhYnN0cmFjdAorICBwdWJsaWMgdHlwZQorICAgIFRMb2dEZWxlZ2F0ZSA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIGNvbnN0IHN0cjogc3RyaW5nKTsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGUG9ydDogSW50ZWdlcjsKKyAgICBGU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsKKyAgICBGU2VuZFRpbWVvdXQsCisgICAgRlJlY3ZUaW1lb3V0OiBMb25nd29yZDsKKyAgICBGS2VlcEFsaXZlOiBCb29sZWFuOworICAgIEZMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlOworICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7CisgICAgY2xhc3MgcHJvY2VkdXJlIERlZmF1bHRMb2dEZWxlZ2F0ZShjb25zdCBTdHI6IHN0cmluZyk7CisgIHByb3RlY3RlZCB0eXBlCisgICAgSUdldEFkZHJJbmZvV3JhcHBlciA9IGludGVyZmFjZQorICAgICAgZnVuY3Rpb24gSW5pdDogSW50ZWdlcjsKKyAgICAgIGZ1bmN0aW9uIEdldFJlczogUEFkZHJJbmZvVzsKKyAgICAgIHByb3BlcnR5IFJlczogUEFkZHJJbmZvVyByZWFkIEdldFJlczsKKyAgICBlbmQ7CisgICAgVEdldEFkZHJJbmZvV3JhcHBlciA9IGNsYXNzKFRJbnRlcmZhY2VkT2JqZWN0LCBJR2V0QWRkckluZm9XcmFwcGVyKQorICAgIHN0cmljdCBwcml2YXRlCisgICAgICBGTm9kZTogc3RyaW5nOworICAgICAgRlNlcnZpY2U6IHN0cmluZzsKKyAgICAgIEZIaW50cywKKyAgICAgIEZSZXM6IFBBZGRySW5mb1c7CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQU5vZGUsIEFTZXJ2aWNlOiBzdHJpbmc7IEFIaW50czogUEFkZHJJbmZvVyk7CisgICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgICAgZnVuY3Rpb24gSW5pdDogSW50ZWdlcjsKKyAgICAgIGZ1bmN0aW9uIEdldFJlczogUEFkZHJJbmZvVzsKKyAgICAgIHByb3BlcnR5IFJlczogUEFkZHJJbmZvVyByZWFkIEdldFJlczsKKyAgICBlbmQ7CisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgQ29tbW9uSW5pdDsgdmlydHVhbDsKKyAgICBmdW5jdGlvbiBDcmVhdGVTb2NrZXQoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXIpOiBJR2V0QWRkckluZm9XcmFwcGVyOworICAgIHByb2NlZHVyZSBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlOiBCb29sZWFuKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgU2V0U29ja2V0KEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTsKKyAgICBwcm9wZXJ0eSBMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlIHJlYWQgRkxvZ0RlbGVnYXRlOworICBwdWJsaWMKKyAgICAvLworICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgc29ja2V0LiBOb3RlIHRoYXQgdGhpcyBkb2VzIE5PVCBhY3R1YWxseSBjb25uZWN0IHRoZQorICAgIC8vIHNvY2tldC4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBTG9nRGVsZWdhdGU6IFRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gRGVzdHJveXMgdGhlIHNvY2tldCBvYmplY3QsIGNsb3NpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgIC8vCisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKworICAgIC8vCisgICAgLy8gU2h1dHMgZG93biBjb21tdW5pY2F0aW9ucyBvbiB0aGUgc29ja2V0CisgICAgLy8KKyAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7CisKKyAgICAvLyBUaGUgcG9ydCB0aGF0IHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0IHdyaXRlIEZQb3J0OworCisgICAgLy8gVGhlIHJlY2VpdmUgdGltZW91dAorICAgIHByb3BlcnR5IFJlY3ZUaW1lb3V0OiBMb25nd29yZCByZWFkIEZSZWN2VGltZW91dCB3cml0ZSBTZXRSZWN2VGltZW91dDsKKworICAgIC8vIFRoZSBzZW5kIHRpbWVvdXQKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogTG9uZ3dvcmQgcmVhZCBGU2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisKKyAgICAvLyBTZXQgU09fS0VFUEFMSVZFCisgICAgcHJvcGVydHkgS2VlcEFsaXZlOiBCb29sZWFuIHJlYWQgRktlZXBBbGl2ZSB3cml0ZSBTZXRLZWVwQWxpdmU7CisKKyAgICAvLyBUaGUgdW5kZXJseWluZyBzb2NrZXQgZGVzY3JpcHRvcgorICAgIHByb3BlcnR5IFNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQgcmVhZCBGU29ja2V0IHdyaXRlIFNldFNvY2tldDsKKyAgZW5kOworCisgIFRTb2NrZXQgPSBjbGFzcyhUQmFzZVNvY2tldCkKKyAgc3RyaWN0IHByaXZhdGUgdHlwZQorICAgIFRDYWNoZWRQZWVyQWRkciA9IHJlY29yZAorICAgIGNhc2UgSW50ZWdlciBvZgorICAgICAgMDogKGlwdjQ6IFRTb2NrQWRkckluKTsKKyAgICAgIDE6IChpcHY2OiBUU29ja0FkZHJJbjYpOworICAgIGVuZDsKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSG9zdDogc3RyaW5nOworICAgIEZQZWVySG9zdDogc3RyaW5nOworICAgIEZQZWVyQWRkcmVzczogc3RyaW5nOworICAgIEZQZWVyUG9ydDogSW50ZWdlcjsKKyAgICBGSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICAgIEZDb25uVGltZW91dDogTG9uZ3dvcmQ7CisgICAgRkxpbmdlck9uOiBCb29sZWFuOworICAgIEZMaW5nZXJWYWw6IEludGVnZXI7CisgICAgRk5vRGVsYXk6IEJvb2xlYW47CisgICAgRk1heFJlY3ZSZXRyaWVzOiBMb25nd29yZDsKKyAgICBGQ2FjaGVkUGVlckFkZHI6IFRDYWNoZWRQZWVyQWRkcjsKKyAgICBwcm9jZWR1cmUgSW5pdFBlZXJJbmZvOworICAgIHByb2NlZHVyZSBPcGVuQ29ubmVjdGlvbihSZXM6IFRCYXNlU29ja2V0LklHZXRBZGRySW5mb1dyYXBwZXIpOworICAgIHByb2NlZHVyZSBMb2NhbE9wZW47CisgICAgcHJvY2VkdXJlIFNldEdlbmVyaWNUaW1lb3V0KFM6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBUaW1lb3V0OiBMb25nd29yZDsgT3B0TmFtZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBTZXROb0RlbGF5KEFOb0RlbGF5OiBCb29sZWFuKTsKKyAgICBmdW5jdGlvbiBHZXRTb2NrZXRJbmZvOiBzdHJpbmc7CisgICAgZnVuY3Rpb24gR2V0UGVlckhvc3Q6IHN0cmluZzsKKyAgICBmdW5jdGlvbiBHZXRQZWVyQWRkcmVzczogc3RyaW5nOworICAgIGZ1bmN0aW9uIEdldFBlZXJQb3J0OiBJbnRlZ2VyOworICAgIGZ1bmN0aW9uIEdldE9yaWdpbjogc3RyaW5nOworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIENvbW1vbkluaXQ7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBTZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KEFTZW5kVGltZW91dDogTG9uZ3dvcmQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHNvY2tldC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBOT1QgYWN0dWFsbHkgY29ubmVjdCB0aGUKKyAgICAvLyBzb2NrZXQuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIGRvZXMgTk9UIGFjdHVhbGx5IGNvbm5lY3QgdGhlCisgICAgLy8gc29ja2V0LgorICAgIC8vCisgICAgLy8gQHBhcmFtIGhvc3QgQW4gSVAgYWRkcmVzcyBvciBob3N0bmFtZSB0byBjb25uZWN0IHRvCisgICAgLy8gQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgIC8vCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gc29ja2V0IGRlc2NyaXB0b3IuCisgICAgLy8KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBzb2NrZXQgZnJvbSBzb2NrZXQgZGVzY3JpcHRvciB0aGF0CisgICAgLy8gY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBU29ja2V0OiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgQUludGVycnVwdExpc3RlbmVyOiBJU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0PjsKKyAgICAgIEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlID0gbmlsKTsgb3ZlcmxvYWQ7CisKKyAgICAvLworICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBzb2NrZXQKKyAgICAvLworICAgIC8vIEB0aHJvd3MgRVRyYW5zcG9ydGF0aW9uRXhjZXB0aW9uIElmIHRoZSBzb2NrZXQgY291bGQgbm90IGNvbm5lY3QKKyAgICAvLworICAgIHByb2NlZHVyZSBPcGVuOworCisgICAgLy8KKyAgICAvLyBTaHV0cyBkb3duIGNvbW11bmljYXRpb25zIG9uIHRoZSBzb2NrZXQKKyAgICAvLworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisKKyAgICAvLworICAgIC8vIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgorICAgIC8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAwIGluZGljYXRlcyBFT0YKKyAgICAvLyBcdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb2YgdHlwZXM6CisgICAgLy8gICAgICAgICAgSW50ZXJydXB0ZWQgbWVhbnMgdGhlIHNvY2tldCB3YXMgaW50ZXJydXB0ZWQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICBvdXQgb2YgYSBibG9ja2luZyBjYWxsCisgICAgLy8gICAgICAgICAgTm90T3BlbiBtZWFucyB0aGUgc29ja2V0IGhhcyBiZWVuIGNsb3NlZAorICAgIC8vICAgICAgICAgIFRpbWVkT3V0IG1lYW5zIHRoZSByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZAorICAgIC8vICAgICAgICAgIFVua25vd24gbWVhbnMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuZWQKKyAgICAvLworICAgIGZ1bmN0aW9uIFJlYWQodmFyIEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIC8vCisgICAgLy8gV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIExvb3BzIHVudGlsIGRvbmUgb3IgZmFpbC4KKyAgICAvLworICAgIHByb2NlZHVyZSBXcml0ZShjb25zdCBCdWY7IExlbjogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQuICBEb2VzIHNpbmdsZSBzZW5kKCkgYW5kIHJldHVybnMgcmVzdWx0LgorICAgIC8vCisgICAgZnVuY3Rpb24gV3JpdGVQYXJ0aWFsKGNvbnN0IEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKworICAgIC8vCisgICAgLy8gUmV0dXJucyBhIGNhY2hlZCBjb3B5IG9mIHRoZSBwZWVyIGFkZHJlc3MuCisgICAgLy8KKyAgICBmdW5jdGlvbiBHZXRDYWNoZWRBZGRyZXNzKG91dCBMZW46IEludGVnZXIpOiBQU29ja0FkZHI7CisKKyAgICAvLworICAgIC8vIFNldCBhIGNhY2hlIG9mIHRoZSBwZWVyIGFkZHJlc3MgKHVzZWQgd2hlbiB0cml2aWFsbHkgYXZhaWxhYmxlOiBlLmcuCisgICAgLy8gYWNjZXB0KCkgb3IgY29ubmVjdCgpKS4gT25seSBjYWNoZXMgSVBWNCBhbmQgSVBWNjsgdW5zZXQgZm9yIG90aGVycy4KKyAgICAvLworICAgIHByb2NlZHVyZSBTZXRDYWNoZWRBZGRyZXNzKGNvbnN0IEFkZHI6IFRTb2NrQWRkcjsgTGVuOiBJbnRlZ2VyKTsKKworICAgIC8vCisgICAgLy8gQ29udHJvbHMgd2hldGhlciB0aGUgbGluZ2VyIG9wdGlvbiBpcyBzZXQgb24gdGhlIHNvY2tldC4KKyAgICAvLworICAgIC8vIEBwYXJhbSBvbiAgICAgIFdoZXRoZXIgU09fTElOR0VSIGlzIG9uCisgICAgLy8gQHBhcmFtIGxpbmdlciAgSWYgbGluZ2VyIGlzIGFjdGl2ZSwgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGxpbmdlciBmb3IKKyAgICAvLworICAgIHByb2NlZHVyZSBTZXRMaW5nZXIoTGluZ2VyT246IEJvb2xlYW47IExpbmdlclZhbDogSW50ZWdlcik7CisKKyAgICAvLworICAgIC8vIENhbGxzIHNlbGVjdCgpIG9uIHRoZSBzb2NrZXQgdG8gc2VlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSBhdmFpbGFibGUuCisgICAgLy8KKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOworCisgICAgLy8gV2hldGhlciB0aGUgc29ja2V0IGlzIGFsaXZlCisgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOworCisgICAgLy8gVGhlIGhvc3QgdGhhdCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgIHByb3BlcnR5IEhvc3Q6IHN0cmluZyByZWFkIEZIb3N0IHdyaXRlIEZIb3N0OworCisgICAgLy8gV2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobQorICAgIHByb3BlcnR5IE5vRGVsYXk6IEJvb2xlYW4gcmVhZCBGTm9EZWxheSB3cml0ZSBTZXROb0RlbGF5OworCisgICAgLy8gQ29ubmVjdCB0aW1lb3V0CisgICAgcHJvcGVydHkgQ29ublRpbWVvdXQ6IExvbmd3b3JkIHJlYWQgRkNvbm5UaW1lb3V0IHdyaXRlIEZDb25uVGltZW91dDsKKworICAgIC8vIFRoZSBtYXggbnVtYmVyIG9mIHJlY3YgcmV0cmllcyBpbiB0aGUgY2FzZSBvZiBhIFdTQUVXT1VMREJMT0NLCisgICAgcHJvcGVydHkgTWF4UmVjdlJldHJpZXM6IExvbmd3b3JkIHJlYWQgRk1heFJlY3ZSZXRyaWVzIHdyaXRlIEZNYXhSZWN2UmV0cmllczsKKworICAgIC8vIFNvY2tldCBpbmZvcm1hdGlvbiBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcgPEhvc3Q6IHggUG9ydDogeD4KKyAgICBwcm9wZXJ0eSBTb2NrZXRJbmZvOiBzdHJpbmcgcmVhZCBHZXRTb2NrZXRJbmZvOworCisgICAgLy8gVGhlIEROUyBuYW1lIG9mIHRoZSBob3N0IHRvIHdoaWNoIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkCisgICAgcHJvcGVydHkgUGVlckhvc3Q6IHN0cmluZyByZWFkIEdldFBlZXJIb3N0OworCisgICAgLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIGhvc3QgdG8gd2hpY2ggdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQKKyAgICBwcm9wZXJ0eSBQZWVyQWRkcmVzczogc3RyaW5nIHJlYWQgR2V0UGVlckFkZHJlc3M7CisKKyAgICAvLyBUaGUgcG9ydCBvZiB0aGUgaG9zdCB0byB3aGljaCB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZAorICAgIHByb3BlcnR5IFBlZXJQb3J0OiBJbnRlZ2VyIHJlYWQgR2V0UGVlclBvcnQ7CisKKyAgICAvLyBUaGUgb3JpZ2luIHRoZSBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCisgICAgcHJvcGVydHkgT3JpZ2luOiBzdHJpbmcgcmVhZCBHZXRPcmlnaW47CisgIGVuZDsKKworICBUU2VydmVyU29ja2V0RnVuYyA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoc29jazogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworCisgIFRTZXJ2ZXJTb2NrZXQgPSBjbGFzcyhUQmFzZVNvY2tldCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGQWRkcmVzczogc3RyaW5nOworICAgIEZBY2NlcHRCYWNrbG9nLAorICAgIEZSZXRyeUxpbWl0LAorICAgIEZSZXRyeURlbGF5LAorICAgIEZUY3BTZW5kQnVmZmVyLAorICAgIEZUY3BSZWN2QnVmZmVyOiBJbnRlZ2VyOworICAgIEZBY2NlcHRUaW1lb3V0OiBMb25nd29yZDsKKyAgICBGTGlzdGVuaW5nLAorICAgIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW46IEJvb2xlYW47CisgICAgRkludGVycnVwdFNvY2tXcml0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBJbnRlcnJ1cHQoKQorICAgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdXNlZCBpbiBzZWxlY3Qgd2l0aCBGU29ja2V0IGZvciBpbnRlcnJ1cHRhYmlsaXR5CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7ICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBJbnRlcnJ1cHRDaGlsZHJlbigpCisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlcjogSVNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD47ICAvLyBpZiBGbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gdGhpcyBpcyBzaGFyZWQgd2l0aCBjaGlsZCBUU29ja2V0cworICAgIEZMaXN0ZW5DYWxsYmFjaywKKyAgICBGQWNjZXB0Q2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jOworICAgIGZ1bmN0aW9uIENyZWF0ZVNvY2tldE9iaihDbGllbnQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogVFNvY2tldDsKKyAgICBwcm9jZWR1cmUgTm90aWZ5KE5vdGlmeVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworICAgIHByb2NlZHVyZSBTZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oQVZhbHVlOiBCb29sZWFuKTsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBDb21tb25Jbml0OyBvdmVycmlkZTsKKyAgcHVibGljIGNvbnN0CisgICAgREVGQVVMVF9CQUNLTE9HID0gMTAyNDsKKyAgcHVibGljCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0b3IuCisgICAgLy8KKyAgICAvLyBAcGFyYW0gcG9ydCAgICAgICAgUG9ydCBudW1iZXIgdG8gYmluZCB0bworICAgIC8vIEBwYXJhbSBzZW5kVGltZW91dCBTb2NrZXQgc2VuZCB0aW1lb3V0CisgICAgLy8gQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBUG9ydDogSW50ZWdlcjsgQVNlbmRUaW1lb3V0LCBBUmVjdlRpbWVvdXQ6IExvbmd3b3JkOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSA9IG5pbCk7IG92ZXJsb2FkOworCisgICAgLy8KKyAgICAvLyBDb25zdHJ1Y3Rvci4KKyAgICAvLworICAgIC8vIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgIC8vIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICAvLworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOyBvdmVybG9hZDsKKworICAgIHByb2NlZHVyZSBMaXN0ZW47CisgICAgZnVuY3Rpb24gQWNjZXB0OiBUU29ja2V0OworICAgIHByb2NlZHVyZSBJbnRlcnJ1cHQ7CisgICAgcHJvY2VkdXJlIEludGVycnVwdENoaWxkcmVuOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisKKyAgICBwcm9wZXJ0eSBBY2NlcHRCYWNrbG9nOiBJbnRlZ2VyIHJlYWQgRkFjY2VwdEJhY2tsb2cgd3JpdGUgRkFjY2VwdEJhY2tsb2c7CisgICAgcHJvcGVydHkgQWNjZXB0VGltZW91dDogTG9uZ3dvcmQgcmVhZCBGQWNjZXB0VGltZW91dCB3cml0ZSBGQWNjZXB0VGltZW91dDsKKyAgICBwcm9wZXJ0eSBSZXRyeUxpbWl0OiBJbnRlZ2VyIHJlYWQgRlJldHJ5TGltaXQgd3JpdGUgRlJldHJ5TGltaXQ7CisgICAgcHJvcGVydHkgUmV0cnlEZWxheTogSW50ZWdlciByZWFkIEZSZXRyeURlbGF5IHdyaXRlIEZSZXRyeURlbGF5OworICAgIHByb3BlcnR5IFRjcFNlbmRCdWZmZXI6IEludGVnZXIgcmVhZCBGVGNwU2VuZEJ1ZmZlciB3cml0ZSBGVGNwU2VuZEJ1ZmZlcjsKKyAgICBwcm9wZXJ0eSBUY3BSZWN2QnVmZmVyOiBJbnRlZ2VyIHJlYWQgRlRjcFJlY3ZCdWZmZXIgd3JpdGUgRlRjcFJlY3ZCdWZmZXI7CisKKyAgICAvLyBXaGVuIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSwgbmV3IGNoaWxkcmVuIFRTb2NrZXRzIHdpbGwgYmUgY29uc3RydWN0ZWQgc28KKyAgICAvLyB0aGV5IGNhbiBiZSBpbnRlcnJ1cHRlZCBieSBUU2VydmVyVHJhbnNwb3J0LkludGVycnVwdENoaWxkcmVuKCkuCisgICAgLy8gVGhpcyBpcyBtb3JlIGV4cGVuc2l2ZSBpbiB0ZXJtcyBvZiBzeXN0ZW0gY2FsbHMgKHBvbGwgKyByZWN2KSBob3dldmVyCisgICAgLy8gZW5zdXJlcyBhIGNvbm5lY3RlZCBjbGllbnQgY2Fubm90IGludGVyZmVyZSB3aXRoIFRTZXJ2ZXIuU3RvcCgpLgorICAgIC8vCisgICAgLy8gV2hlbiBkaXNhYmxlZCwgVFNvY2tldCBjaGlsZHJlbiBkbyBub3QgaW5jdXIgYW4gYWRkaXRpb25hbCBwb2xsKCkgY2FsbC4KKyAgICAvLyBTZXJ2ZXItc2lkZSByZWFkcyBhcmUgbW9yZSBlZmZpY2llbnQsIGhvd2V2ZXIgYSBjbGllbnQgY2FuIGludGVyZmVyZSB3aXRoCisgICAgLy8gdGhlIHNlcnZlcidzIGFiaWxpdHkgdG8gc2h1dGRvd24gcHJvcGVybHkgYnkgc3RheWluZyBjb25uZWN0ZWQuCisgICAgLy8KKyAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgbGlzdGVuKCk7IG1vZGUgY2Fubm90IGJlIHN3aXRjaGVkIGFmdGVyIHRoYXQuCisgICAgLy8gXHRocm93cyBFUHJvcGVydHlFcnJvciBpZiBsaXN0ZW4oKSBoYXMgYmVlbiBjYWxsZWQKKyAgICBwcm9wZXJ0eSBJbnRlcnJ1cHRhYmxlQ2hpbGRyZW46IEJvb2xlYW4gcmVhZCBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIHdyaXRlIFNldEludGVycnVwdGFibGVDaGlsZHJlbjsKKworICAgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgICAvLyBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUgY3VzdG9tIHNldHNvY2tvcHQKKyAgICAvLyB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gaXQuCisgICAgcHJvcGVydHkgTGlzdGVuQ2FsbGJhY2s6IFRTZXJ2ZXJTb2NrZXRGdW5jIHJlYWQgRkxpc3RlbkNhbGxiYWNrIHdyaXRlIEZMaXN0ZW5DYWxsYmFjazsKKworICAgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgICAvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgYWxsIFRocmlmdCBzZXRzb2Nrb3B0IGNhbGxzIGhhdmUgYmVlbiBtYWRlLiAgSWYgeW91IGhhdmUKKyAgICAvLyBjdXN0b20gc2V0c29ja29wdCB0aGluZ3MgdGhhdCBuZWVkIHRvIGhhcHBlbiBvbiB0aGUgYWNjZXB0ZWQKKyAgICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICAgIHByb3BlcnR5IEFjY2VwdENhbGxiYWNrOiBUU2VydmVyU29ja2V0RnVuYyByZWFkIEZBY2NlcHRDYWxsYmFjayB3cml0ZSBGQWNjZXB0Q2FsbGJhY2s7CisgIGVuZDsKKworeyRFTkRJRn0gLy8gbm90IGZvciBPTERfU09DS0VUUworaW1wbGVtZW50YXRpb24KK3skSUZOREVGIE9MRF9TT0NLRVRTfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCisKK3VzZXMKKyAgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uTWF0aCwgU3lzdGVtLkRhdGVVdGlscywgVGhyaWZ0LlRyYW5zcG9ydDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5DcmVhdGUoQU5vZGUsIEFTZXJ2aWNlOiBzdHJpbmc7IEFIaW50czogUEFkZHJJbmZvVyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTm9kZSA6PSBBTm9kZTsKKyAgRlNlcnZpY2UgOj0gQVNlcnZpY2U7CisgIEZIaW50cyA6PSBBSGludHM7CisgIEZSZXMgOj0gbmlsOworZW5kOworCitkZXN0cnVjdG9yIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuRGVzdHJveTsKK2JlZ2luCisgIGlmIEFzc2lnbmVkKEZSZXMpIHRoZW4KKyAgICBGcmVlQWRkckluZm9XKEZSZXMpOworICBpbmhlcml0ZWQgRGVzdHJveTsKK2VuZDsKKworZnVuY3Rpb24gVEJhc2VTb2NrZXQuVEdldEFkZHJJbmZvV3JhcHBlci5Jbml0OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgRlJlcyA9IG5pbCB0aGVuCisgICAgRXhpdChHZXRBZGRySW5mb1coQEZOb2RlWzFdLCBARlNlcnZpY2VbMV0sIEZIaW50c14sIEZSZXMpKTsKKyAgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRCYXNlU29ja2V0LlRHZXRBZGRySW5mb1dyYXBwZXIuR2V0UmVzOiBQQWRkckluZm9XOworYmVnaW4KKyAgUmVzdWx0IDo9IEZSZXM7CitlbmQ7CisKK3Byb2NlZHVyZSBEZXN0cm95ZXJPZkZpbmVTb2NrZXRzKHNzb2NrOiBXaW5hcGkuV2luc29jazIuVFNvY2tldCk7CitiZWdpbgorICBjbG9zZXNvY2tldChzc29jayk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTY29wZUlkLkdldEJpdEZpZWxkKExvYzogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gKFZhbHVlIHNociAoTG9jIHNociA4KSkgYW5kICgoMSBzaGwgKExvYyBhbmQgJEZGKSkgLSAxKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTY29wZUlkLlNldEJpdEZpZWxkKExvYzogSW50ZWdlcjsgY29uc3QgYVZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIFZhbHVlIDo9IChWYWx1ZSBhbmQgVUxPTkcoKG5vdCAoKDEgc2hsIChMb2MgYW5kICRGRikpIC0gMSkpKSkgb3IgVUxPTkcoYVZhbHVlIHNobCAoTG9jIHNociA4KSk7CitlbmQ7CisKK2Z1bmN0aW9uIGdldGFkZHJpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZ2V0YWRkcmluZm8nOworZnVuY3Rpb24gR2V0QWRkckluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnR2V0QWRkckluZm9XJzsKK3Byb2NlZHVyZSBmcmVlYWRkcmluZm87IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdmcmVlYWRkcmluZm8nOworcHJvY2VkdXJlIEZyZWVBZGRySW5mb1c7IGV4dGVybmFsICd3czJfMzIuZGxsJyBuYW1lICdGcmVlQWRkckluZm9XJzsKK2Z1bmN0aW9uIGdldG5hbWVpbmZvOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnZ2V0bmFtZWluZm8nOworZnVuY3Rpb24gR2V0TmFtZUluZm9XOyBleHRlcm5hbCAnd3MyXzMyLmRsbCcgbmFtZSAnR2V0TmFtZUluZm9XJzsKKworY29uc3RydWN0b3IgVFNtYXJ0UG9pbnRlcjxUPi5DcmVhdGUoQVZhbHVlOiBUOyBBRGVzdHJveWVyOiBUU21hcnRQb2ludGVyRGVzdHJveWVyPFQ+KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZWYWx1ZSA6PSBBVmFsdWU7CisgIEZEZXN0cm95ZXIgOj0gQURlc3Ryb3llcjsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU21hcnRQb2ludGVyPFQ+LkRlc3Ryb3k7CitiZWdpbgorICBpZiBBc3NpZ25lZChGRGVzdHJveWVyKSB0aGVuIEZEZXN0cm95ZXIoRlZhbHVlKTsKKyAgaW5oZXJpdGVkIERlc3Ryb3k7CitlbmQ7CisKK2Z1bmN0aW9uIFRTbWFydFBvaW50ZXI8VD4uSW52b2tlOiBUOworYmVnaW4KKyAgUmVzdWx0IDo9IEZWYWx1ZTsKK2VuZDsKKworY2xhc3MgY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlOwordmFyCisgIFZlcnNpb246IFdPUkQ7CisgIERhdGE6IFdTQURhdGE7CisgIEVycm9yOiBJbnRlZ2VyOworYmVnaW4KKyAgVmVyc2lvbiA6PSAkMDIwMjsKKyAgRmlsbENoYXIoRGF0YSwgU2l6ZU9mKERhdGEpLCAwKTsKKyAgRXJyb3IgOj0gV1NBU3RhcnR1cChWZXJzaW9uLCBEYXRhKTsKKyAgaWYgRXJyb3IgPD4gMCB0aGVuCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnRmFpbGVkIHRvIGluaXRpYWxpemUgV2luc29jay4nKTsKK2VuZDsKKworY2xhc3MgZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5EZXN0cm95OworYmVnaW4KKyAgV1NBQ2xlYW51cDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRCYXNlU29ja2V0LkRlZmF1bHRMb2dEZWxlZ2F0ZShjb25zdCBTdHI6IHN0cmluZyk7Cit2YXIKKyAgT3V0U3RyOiBzdHJpbmc7CitiZWdpbgorICBPdXRTdHIgOj0gRm9ybWF0KCdUaHJpZnQ6ICVzICVzJywgW0RhdGVUaW1lVG9TdHIoTm93LCBURm9ybWF0U2V0dGluZ3MuQ3JlYXRlKSwgU3RyXSk7CisgIHRyeQorICAgIFdyaXRlbG4oT3V0U3RyKTsKKyAgICBpZiBJb1Jlc3VsdCA8PiAwIHRoZW4gT3V0cHV0RGVidWdTdHJpbmcoUENoYXIoT3V0U3RyKSk7CisgIGV4Y2VwdAorICAgIE91dHB1dERlYnVnU3RyaW5nKFBDaGFyKE91dFN0cikpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgRlNvY2tldCA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgRlBvcnQgOj0gMDsKKyAgRlNlbmRUaW1lb3V0IDo9IDA7CisgIEZSZWN2VGltZW91dCA6PSAwOworICBGS2VlcEFsaXZlIDo9IEZhbHNlOworICBGTG9nRGVsZWdhdGUgOj0gRGVmYXVsdExvZ0RlbGVnYXRlOworZW5kOworCitmdW5jdGlvbiBUQmFzZVNvY2tldC5DcmVhdGVTb2NrZXQoQUFkZHJlc3M6IHN0cmluZzsgQVBvcnQ6IEludGVnZXIpOiBJR2V0QWRkckluZm9XcmFwcGVyOwordmFyCisgIEhpbnRzOiBUQWRkckluZm9XOworICBSZXM6IFBBZGRySW5mb1c7CisgIFRoZVBvcnQ6IGFycmF5WzAuLjVdIG9mIENoYXI7CisgIEVycm9yOiBJbnRlZ2VyOworYmVnaW4KKyAgRmlsbENoYXIoSGludHMsIFNpemVPZihIaW50cyksIDApOworICBIaW50cy5haV9mYW1pbHkgOj0gUEZfVU5TUEVDOworICBIaW50cy5haV9zb2NrdHlwZSA6PSBTT0NLX1NUUkVBTTsKKyAgSGludHMuYWlfZmxhZ3MgOj0gQUlfUEFTU0lWRSBvciBBSV9BRERSQ09ORklHOworICBTdHJGbXQoVGhlUG9ydCwgJyVkJywgW0ZQb3J0XSk7CisKKyAgUmVzdWx0IDo9IFRHZXRBZGRySW5mb1dyYXBwZXIuQ3JlYXRlKEFBZGRyZXNzLCBUaGVQb3J0LCBASGludHMpOworICBFcnJvciA6PSBSZXN1bHQuSW5pdDsKKyAgaWYgRXJyb3IgPD4gMCB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdHZXRBZGRySW5mb1cgJWQ6ICVzJywgW0Vycm9yLCBTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4nKTsKKyAgZW5kOworCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgUmVzIDo9IFJlc3VsdC5SZXM7CisgIHdoaWxlIEFzc2lnbmVkKFJlcykgZG8gYmVnaW4KKyAgICBpZiAoUmVzXi5haV9mYW1pbHkgPSBBRl9JTkVUNikgb3IgKG5vdCBBc3NpZ25lZChSZXNeLmFpX25leHQpKSB0aGVuCisgICAgICBCcmVhazsKKyAgICBSZXMgOj0gUmVzXi5haV9uZXh0OworICBlbmQ7CisKKyAgRlNvY2tldCA6PSBXaW5hcGkuV2luc29jazIuc29ja2V0KFJlc14uYWlfZmFtaWx5LCBSZXNeLmFpX3NvY2t0eXBlLCBSZXNeLmFpX3Byb3RvY29sKTsKKyAgaWYgRlNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBFcnJvciA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUQmFzZVNvY2tldC5DcmVhdGVTb2NrZXQoKSBzb2NrZXQoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICAgIENsb3NlOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NvY2tldCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJyb3IpXSkpOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRSZWN2VGltZW91dChBUmVjdlRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIEZSZWN2VGltZW91dCA6PSBBUmVjdlRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRTZW5kVGltZW91dChBU2VuZFRpbWVvdXQ6IExvbmd3b3JkKTsKK2JlZ2luCisgIEZTZW5kVGltZW91dCA6PSBBU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRLZWVwQWxpdmUoQUtlZXBBbGl2ZTogQm9vbGVhbik7CitiZWdpbgorICBGS2VlcEFsaXZlIDo9IEFLZWVwQWxpdmU7CitlbmQ7CisKK3Byb2NlZHVyZSBUQmFzZVNvY2tldC5TZXRTb2NrZXQoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOworYmVnaW4KKyAgaWYgRlNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgQ2xvc2U7CisgIEZTb2NrZXQgOj0gQVNvY2tldDsKK2VuZDsKKworY29uc3RydWN0b3IgVEJhc2VTb2NrZXQuQ3JlYXRlKEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIENvbW1vbkluaXQ7CisgIGlmIEFzc2lnbmVkKEFMb2dEZWxlZ2F0ZSkgdGhlbiBGTG9nRGVsZWdhdGUgOj0gQUxvZ0RlbGVnYXRlOworZW5kOworCitjb25zdHJ1Y3RvciBUQmFzZVNvY2tldC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFMb2dEZWxlZ2F0ZTogVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIENvbW1vbkluaXQ7CisgIEZQb3J0IDo9IEFQb3J0OworICBpZiBBc3NpZ25lZChBTG9nRGVsZWdhdGUpIHRoZW4gRkxvZ0RlbGVnYXRlIDo9IEFMb2dEZWxlZ2F0ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQmFzZVNvY2tldC5EZXN0cm95OworYmVnaW4KKyAgQ2xvc2U7CisgIGluaGVyaXRlZCBEZXN0cm95OworZW5kOworCitwcm9jZWR1cmUgVEJhc2VTb2NrZXQuQ2xvc2U7CitiZWdpbgorICBpZiBGU29ja2V0IDw+IElOVkFMSURfU09DS0VUIHRoZW4gYmVnaW4KKyAgICBzaHV0ZG93bihGU29ja2V0LCBTRF9CT1RIKTsKKyAgICBjbG9zZXNvY2tldChGU29ja2V0KTsKKyAgZW5kOworICBGU29ja2V0IDo9IElOVkFMSURfU09DS0VUOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Jbml0UGVlckluZm87CitiZWdpbgorICBGQ2FjaGVkUGVlckFkZHIuaXB2NC5zaW5fZmFtaWx5IDo9IEFGX1VOU1BFQzsKKyAgRlBlZXJIb3N0IDo9ICcnOworICBGUGVlckFkZHJlc3MgOj0gJyc7CisgIEZQZWVyUG9ydCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5Db21tb25Jbml0OworYmVnaW4KKyAgaW5oZXJpdGVkIENvbW1vbkluaXQ7CisgIEZIb3N0IDo9ICcnOworICBGSW50ZXJydXB0TGlzdGVuZXIgOj0gbmlsOworICBGQ29ublRpbWVvdXQgOj0gMDsKKyAgRkxpbmdlck9uIDo9IFRydWU7CisgIEZMaW5nZXJWYWwgOj0gMDsKKyAgRk5vRGVsYXkgOj0gVHJ1ZTsKKyAgRk1heFJlY3ZSZXRyaWVzIDo9IDU7CisgIEluaXRQZWVySW5mbzsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuT3BlbkNvbm5lY3Rpb24oUmVzOiBUQmFzZVNvY2tldC5JR2V0QWRkckluZm9XcmFwcGVyKTsKK2xhYmVsCisgIERvbmU7Cit2YXIKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBSZXQsCisgIFJldDI6IEludGVnZXI7CisgIEZkczogVEZkU2V0OworICBUVmFsOiBUVGltZVZhbDsKKyAgUFRWYWw6IFBUaW1lVmFsOworICBWYWwsCisgIExvbjogSW50ZWdlcjsKKyAgT25lLAorICBaZXJvOiBDYXJkaW5hbDsKK2JlZ2luCisgIGlmIFNlbmRUaW1lb3V0ID4gMCB0aGVuIFNldFNlbmRUaW1lb3V0KFNlbmRUaW1lb3V0KTsKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4gU2V0UmVjdlRpbWVvdXQoUmVjdlRpbWVvdXQpOworICBpZiBLZWVwQWxpdmUgdGhlbiBTZXRLZWVwQWxpdmUoS2VlcEFsaXZlKTsKKyAgU2V0TGluZ2VyKEZMaW5nZXJPbiwgRkxpbmdlclZhbCk7CisgIFNldE5vRGVsYXkoRk5vRGVsYXkpOworCisgIC8vIFNldCB0aGUgc29ja2V0IHRvIGJlIG5vbiBibG9ja2luZyBmb3IgY29ubmVjdCBpZiBhIHRpbWVvdXQgZXhpc3RzCisgIFplcm8gOj0gMDsKKyAgaWYgRkNvbm5UaW1lb3V0ID4gMCB0aGVuIGJlZ2luCisgICAgT25lIDo9IDE7CisgICAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBPbmUpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBpb2N0bHNvY2tldCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBpZiBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBpb2N0bHNvY2tldCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBmYWlsZWQ6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIFJldCA6PSBjb25uZWN0KFNvY2tldCwgUmVzLlJlc14uYWlfYWRkcl4sIFJlcy5SZXNeLmFpX2FkZHJsZW4pOworICBpZiBSZXQgPSAwIHRoZW4gZ290byBEb25lOworCisgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgIGlmIChFcnJub0NvcHkgPD4gV1NBRUlOUFJPR1JFU1MpIGFuZCAoRXJybm9Db3B5IDw+IFdTQUVXT1VMREJMT0NLKSB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgY29ubmVjdCgpICcsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdjb25uZWN0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIEZEX1pFUk8oRmRzKTsKKyAgX0ZEX1NFVChTb2NrZXQsIEZkcyk7CisgIGlmIEZDb25uVGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgIFRWYWwudHZfc2VjIDo9IEZDb25uVGltZW91dCBkaXYgMTAwMDsKKyAgICBUVmFsLnR2X3VzZWMgOj0gKEZDb25uVGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgIFBUVmFsIDo9IEBUVmFsOworICBlbmQKKyAgZWxzZQorICAgIFBUVmFsIDo9IG5pbDsKKyAgUmV0IDo9IHNlbGVjdCgxLCBuaWwsIEBGZHMsIG5pbCwgUFRWYWwpOworCisgIGlmIFJldCA+IDAgdGhlbiBiZWdpbgorICAgIC8vIEVuc3VyZSB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZCBhbmQgdGhhdCB0aGVyZSBhcmUgbm8gZXJyb3JzIHNldAorICAgIExvbiA6PSBTaXplT2YoVmFsKTsKKyAgICBSZXQyIDo9IGdldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19FUlJPUiwgQFZhbCwgTG9uKTsKKyAgICBpZiBSZXQyID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBnZXRzb2Nrb3B0KCkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnZ2V0c29ja29wdCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgICAgLy8gbm8gZXJyb3JzIG9uIHNvY2tldCwgZ28gdG8gdG93bgorICAgIGlmIFZhbCA9IDAgdGhlbiBnb3RvIERvbmU7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0Lk9wZW5Db25uZWN0aW9uKCkgZXJyb3Igb24gc29ja2V0IChhZnRlciBzZWxlY3QoKSkgJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ3NvY2tldCBPcGVuQ29ubmVjdGlvbigpIGVycm9yOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoVmFsKV0pKTsKKyAgZW5kCisgIGVsc2UgaWYgUmV0ID0gMCB0aGVuIGJlZ2luCisgICAgLy8gc29ja2V0IHRpbWVkIG91dAorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5PcGVuQ29ubmVjdGlvbigpIHRpbWVkIG91dCAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdPcGVuQ29ubmVjdGlvbigpIHRpbWVkIG91dCcpOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIC8vIGVycm9yIG9uIHNlbGVjdCgpCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuT3BlbkNvbm5lY3Rpb24oKSBzZWxlY3QoKSAnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnc2VsZWN0KCkgZmFpbGVkOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCitEb25lOgorICAvLyBTZXQgc29ja2V0IGJhY2sgdG8gbm9ybWFsIG1vZGUgKGJsb2NraW5nKQorICBpb2N0bHNvY2tldChTb2NrZXQsIEludGVnZXIoRklPTkJJTyksIFplcm8pOworICBTZXRDYWNoZWRBZGRyZXNzKFJlcy5SZXNeLmFpX2FkZHJeLCBSZXMuUmVzXi5haV9hZGRybGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuTG9jYWxPcGVuOwordmFyCisgIFJlczogVEJhc2VTb2NrZXQuSUdldEFkZHJJbmZvV3JhcHBlcjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIEV4aXQ7CisKKyAgLy8gVmFsaWRhdGUgcG9ydCBudW1iZXIKKyAgaWYgKFBvcnQgPCAwKSBvciAoUG9ydCA+ICRGRkZGKSB0aGVuCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MuQ3JlYXRlKCdTcGVjaWZpZWQgcG9ydCBpcyBpbnZhbGlkJyk7CisKKyAgUmVzIDo9IENyZWF0ZVNvY2tldChIb3N0LCBQb3J0KTsKKworICBPcGVuQ29ubmVjdGlvbihSZXMpOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRHZW5lcmljVGltZW91dChTOiBXaW5hcGkuV2luc29jazIuVFNvY2tldDsgVGltZW91dDogTG9uZ3dvcmQ7IE9wdE5hbWU6IEludGVnZXIpOwordmFyCisgIFRpbWU6IERXT1JEOworYmVnaW4KKyAgaWYgUyA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIFRpbWUgOj0gVGltZW91dDsKKworICBpZiBzZXRzb2Nrb3B0KFMsIFNPTF9TT0NLRVQsIE9wdE5hbWUsIEBUaW1lLCBTaXplT2YoVGltZSkpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1NldEdlbmVyaWNUaW1lb3V0KCkgc2V0c29ja29wdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShXU0FHZXRMYXN0RXJyb3IpXSkpOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBTb2NrZXQgPD4gSU5WQUxJRF9TT0NLRVQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0LlNldE5vRGVsYXkoQU5vRGVsYXk6IEJvb2xlYW4pOwordmFyCisgIFY6IEludGVnZXI7CitiZWdpbgorICBGTm9EZWxheSA6PSBBTm9EZWxheTsKKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIEV4aXQ7CisKKyAgViA6PSBJZlRoZW4oRk5vRGVsYXksIDEsIDApOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgSVBQUk9UT19UQ1AsIFRDUF9OT0RFTEFZLCBAViwgU2l6ZU9mKFYpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldE5vRGVsYXkoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0U29ja2V0SW5mbzogc3RyaW5nOworYmVnaW4KKyAgaWYgKEZIb3N0ID0gJycpIG9yIChQb3J0ID0gMCkgdGhlbgorICAgIFJlc3VsdCA6PSAnPEhvc3Q6ICcgKyBHZXRQZWVyQWRkcmVzcyArICcgUG9ydDogJyArIEdldFBlZXJQb3J0LlRvU3RyaW5nICsgJz4nCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gJzxIb3N0OiAnICsgRkhvc3QgKyAnIFBvcnQ6ICcgKyBQb3J0LlRvU3RyaW5nICsgJz4nOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJIb3N0OiBzdHJpbmc7Cit2YXIKKyAgQWRkcjogVFNvY2tBZGRyU3RvcmFnZTsKKyAgQWRkclB0cjogUFNvY2tBZGRyOworICBBZGRyTGVuOiBJbnRlZ2VyOworICBDbGllbnRIb3N0OiBhcnJheVswLi5OSV9NQVhIT1NULTFdIG9mIENoYXI7CisgIENsaWVudFNlcnZpY2U6IGFycmF5WzAuLk5JX01BWFNFUlYtMV0gb2YgQ2hhcjsKK2JlZ2luCisgIGlmIEZQZWVySG9zdCA9ICcnIHRoZW4gYmVnaW4KKyAgICBpZiBTb2NrZXQgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBFeGl0KEZQZWVySG9zdCk7CisKKyAgICBBZGRyUHRyIDo9IEdldENhY2hlZEFkZHJlc3MoQWRkckxlbik7CisgICAgaWYgQWRkclB0ciA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBBZGRyTGVuIDo9IFNpemVPZihBZGRyKTsKKyAgICAgIGlmIGdldHBlZXJuYW1lKFNvY2tldCwgUFNvY2tBZGRyKEBBZGRyKV4sIEFkZHJMZW4pIDw+IDAgdGhlbgorICAgICAgICBFeGl0KEZQZWVySG9zdCk7CisgICAgICBBZGRyUHRyIDo9IFBTb2NrQWRkcihAQWRkcik7CisgICAgICBTZXRDYWNoZWRBZGRyZXNzKEFkZHJQdHJeLCBBZGRyTGVuKTsKKyAgICBlbmQ7CisKKyAgICBHZXROYW1lSW5mb1coQWRkclB0cl4sIEFkZHJMZW4sIENsaWVudEhvc3QsIE5JX01BWEhPU1QsIENsaWVudFNlcnZpY2UsIE5JX01BWFNFUlYsIDApOworICAgIEZQZWVySG9zdCA6PSBDbGllbnRIb3N0OworICBlbmQ7CisgIFJlc3VsdCA6PSBGUGVlckhvc3Q7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0UGVlckFkZHJlc3M6IHN0cmluZzsKK3ZhcgorICBBZGRyOiBUU29ja0FkZHJTdG9yYWdlOworICBBZGRyUHRyOiBQU29ja0FkZHI7CisgIEFkZHJMZW46IEludGVnZXI7CisgIENsaWVudEhvc3Q6IGFycmF5WzAuLk5JX01BWEhPU1QtMV0gb2YgQ2hhcjsKKyAgQ2xpZW50U2VydmljZTogYXJyYXlbMC4uTklfTUFYU0VSVi0xXSBvZiBDaGFyOworYmVnaW4KKyAgaWYgRlBlZXJBZGRyZXNzID0gJycgdGhlbiBiZWdpbgorICAgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoRlBlZXJBZGRyZXNzKTsKKworICAgIEFkZHJQdHIgOj0gR2V0Q2FjaGVkQWRkcmVzcyhBZGRyTGVuKTsKKyAgICBpZiBBZGRyUHRyID0gbmlsIHRoZW4gYmVnaW4KKyAgICAgIEFkZHJMZW4gOj0gU2l6ZU9mKEFkZHIpOworICAgICAgaWYgZ2V0cGVlcm5hbWUoU29ja2V0LCBQU29ja0FkZHIoQEFkZHIpXiwgQWRkckxlbikgPD4gMCB0aGVuCisgICAgICAgIEV4aXQoRlBlZXJIb3N0KTsKKyAgICAgIEFkZHJQdHIgOj0gUFNvY2tBZGRyKEBBZGRyKTsKKyAgICAgIFNldENhY2hlZEFkZHJlc3MoQWRkclB0cl4sIEFkZHJMZW4pOworICAgIGVuZDsKKworICAgIEdldE5hbWVJbmZvVyhBZGRyUHRyXiwgQWRkckxlbiwgQ2xpZW50SG9zdCwgTklfTUFYSE9TVCwgQ2xpZW50U2VydmljZSwgTklfTUFYU0VSViwgTklfTlVNRVJJQ0hPU1Qgb3IgTklfTlVNRVJJQ1NFUlYpOworICAgIEZQZWVyQWRkcmVzcyA6PSBDbGllbnRIb3N0OworICAgIFRyeVN0clRvSW50KENsaWVudFNlcnZpY2UsIEZQZWVyUG9ydCk7CisgIGVuZDsKKyAgUmVzdWx0IDo9IEZQZWVyQWRkcmVzcworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LkdldFBlZXJQb3J0OiBJbnRlZ2VyOworYmVnaW4KKyAgR2V0UGVlckFkZHJlc3M7CisgIFJlc3VsdCA6PSBGUGVlclBvcnQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuR2V0T3JpZ2luOiBzdHJpbmc7CitiZWdpbgorICBSZXN1bHQgOj0gR2V0UGVlckhvc3QgKyAnOicgKyBHZXRQZWVyUG9ydC5Ub1N0cmluZzsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0UmVjdlRpbWVvdXQoQVJlY3ZUaW1lb3V0KTsKKyAgU2V0R2VuZXJpY1RpbWVvdXQoU29ja2V0LCBBUmVjdlRpbWVvdXQsIFNPX1JDVlRJTUVPKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgU2V0U2VuZFRpbWVvdXQoQVNlbmRUaW1lb3V0KTsKKyAgU2V0R2VuZXJpY1RpbWVvdXQoU29ja2V0LCBBU2VuZFRpbWVvdXQsIFNPX1NORFRJTUVPKTsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0S2VlcEFsaXZlKEFLZWVwQWxpdmU6IEJvb2xlYW4pOwordmFyCisgIFZhbHVlOiBJbnRlZ2VyOworYmVnaW4KKyAgaW5oZXJpdGVkIFNldEtlZXBBbGl2ZShBS2VlcEFsaXZlKTsKKworICBWYWx1ZSA6PSBJZlRoZW4oS2VlcEFsaXZlLCAxLCAwKTsKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgQFZhbHVlLCBTaXplT2YoVmFsdWUpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlNldEtlZXBBbGl2ZSgpIHNldHNvY2tvcHQoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOworYmVnaW4KKyAgLy8gTm90IG5lZWRlZCwgYnV0IGp1c3QgYSBwbGFjZWhvbGRlcgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyOyBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFQb3J0LCBBTG9nRGVsZWdhdGUpOworICBGSG9zdCA6PSBBSG9zdDsKK2VuZDsKKworY29uc3RydWN0b3IgVFNvY2tldC5DcmVhdGUoQVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQUxvZ0RlbGVnYXRlKTsKKyAgU29ja2V0IDo9IEFTb2NrZXQ7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTb2NrZXQuQ3JlYXRlKEFTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OyBBSW50ZXJydXB0TGlzdGVuZXI6IElTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+OworICBBTG9nRGVsZWdhdGU6IFRCYXNlU29ja2V0LlRMb2dEZWxlZ2F0ZSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKEFMb2dEZWxlZ2F0ZSk7CisgIFNvY2tldCA6PSBBU29ja2V0OworICBGSW50ZXJydXB0TGlzdGVuZXIgOj0gQUludGVycnVwdExpc3RlbmVyOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5PcGVuOworYmVnaW4KKyAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKKyAgTG9jYWxPcGVuOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKyAgSW5pdFBlZXJJbmZvOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LlJlYWQodmFyIEJ1ZjsgTGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2xhYmVsCisgIFRyeUFnYWluOwordmFyCisgIFJldHJpZXM6IExvbmd3b3JkOworICBFQWdhaW5UaHJlc2hvbGQsCisgIFJlYWRFbGFwc2VkOiBVSW50NjQ7CisgIFN0YXJ0OiBURGF0ZVRpbWU7CisgIEdvdDogSW50ZWdlcjsKKyAgRmRzOiBURmRTZXQ7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgVFZhbDogVFRpbWVWYWw7CisgIFBUVmFsOiBQVGltZVZhbDsKKyAgUmV0OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gc29ja2V0Jyk7CisKKyAgUmV0cmllcyA6PSAwOworCisgIC8vIFRIUklGVF9FQUdBSU4gY2FuIGJlIHNpZ25hbGxlZCBib3RoIHdoZW4gYSB0aW1lb3V0IGhhcyBvY2N1cnJlZCBhbmQgd2hlbgorICAvLyB0aGUgc3lzdGVtIGlzIG91dCBvZiByZXNvdXJjZXMgKGFuIGF3ZXNvbWUgdW5kb2N1bWVudGVkIGZlYXR1cmUpLgorICAvLyBUaGUgZm9sbG93aW5nIGlzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIHRpbWUgaW50ZXJ2YWwgdW5kZXIgd2hpY2gKKyAgLy8gVEhSSUZUX0VBR0FJTiBpcyB0YWtlbiB0byBpbmRpY2F0ZSBhbiBvdXQgb2YgcmVzb3VyY2VzIGVycm9yLgorICBFQWdhaW5UaHJlc2hvbGQgOj0gMDsKKyAgaWYgUmVjdlRpbWVvdXQgPD4gMCB0aGVuCisgICAgLy8gaWYgYSByZWFkVGltZW91dCBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBhIG1heCBudW1iZXIgb2YgcmVjdiByZXRyaWVzLCB0aGVuCisgICAgLy8gdGhlIHRocmVzaG9sZCB3aWxsIGVuc3VyZSB0aGF0IHRoZSByZWFkIHRpbWVvdXQgaXMgbm90IGV4Y2VlZGVkIGV2ZW4gaW4gdGhlCisgICAgLy8gY2FzZSBvZiByZXNvdXJjZSBlcnJvcnMKKyAgICBFQWdhaW5UaHJlc2hvbGQgOj0gUmVjdlRpbWVvdXQgZGl2IElmVGhlbihGTWF4UmVjdlJldHJpZXMgPiAwLCBGTWF4UmVjdlJldHJpZXMsIDIpOworCitUcnlBZ2FpbjoKKyAgLy8gUmVhZCBmcm9tIHRoZSBzb2NrZXQKKyAgaWYgUmVjdlRpbWVvdXQgPiAwIHRoZW4KKyAgICBTdGFydCA6PSBOb3cKKyAgZWxzZQorICAgIC8vIGlmIHRoZXJlIGlzIG5vIHJlYWQgdGltZW91dCB3ZSBkb24ndCBuZWVkIHRoZSBUT0QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKyAgICAvLyBhbiBUSFJJRlRfRUFHQUlOIGlzIGR1ZSB0byBhIHRpbWVvdXQgb3IgYW4gb3V0LW9mLXJlc291cmNlIGNvbmRpdGlvbi4KKyAgICBTdGFydCA6PSAwOworCisgIGlmIEFzc2lnbmVkKEZJbnRlcnJ1cHRMaXN0ZW5lcikgdGhlbiBiZWdpbgorICAgIEZEX1pFUk8oRmRzKTsKKyAgICBfRkRfU0VUKFNvY2tldCwgRmRzKTsKKyAgICBfRkRfU0VUKEZJbnRlcnJ1cHRMaXN0ZW5lciwgRmRzKTsKKyAgICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgVFZhbC50dl9zZWMgOj0gUmVjdlRpbWVvdXQgZGl2IDEwMDA7CisgICAgICBUVmFsLnR2X3VzZWMgOj0gKFJlY3ZUaW1lb3V0IG1vZCAxMDAwKSAqIDEwMDA7CisgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICBlbmQKKyAgICBlbHNlCisgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoRXJybm9Db3B5ID0gV1NBRUlOVFIpIGFuZCAoUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcykgdGhlbiBiZWdpbgorICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgICBlbmQ7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUmVhZCgpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kCisgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgaWYgRkRfSVNTRVQoRkludGVycnVwdExpc3RlbmVyLCBGZHMpIHRoZW4KKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZSgnSW50ZXJydXB0ZWQnKTsKKyAgICBlbmQKKyAgICBlbHNlIC8vIFJldCA9IDAKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh0aW1lZCBvdXQpJyk7CisKKyAgICAvLyBmYWxsaW5nIHRocm91Z2ggbWVhbnMgdGhlcmUgaXMgc29tZXRoaW5nIHRvIHJlY3YgYW5kIGl0IGNhbm5vdCBibG9jaworICBlbmQ7CisKKyAgR290IDo9IHJlY3YoU29ja2V0LCBCdWYsIExlbiwgMCk7CisgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgIC8vIENoZWNrIGZvciBlcnJvciBvbiByZWFkCisgIGlmIEdvdCA8IDAgdGhlbiBiZWdpbgorICAgIGlmIEVycm5vQ29weSA9IFdTQUVXT1VMREJMT0NLIHRoZW4gYmVnaW4KKyAgICAgIC8vIGlmIG5vIHRpbWVvdXQgd2UgY2FuIGFzc3VtZSB0aGF0IHJlc291cmNlIGV4aGF1c3Rpb24gaGFzIG9jY3VycmVkLgorICAgICAgaWYgUmVjdlRpbWVvdXQgPSAwIHRoZW4KKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHVuYXZhaWxhYmxlIHJlc291cmNlcyknKTsKKyAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhY2sgb2YgcmVzb3VyY2VzIG9yIHRpbWVvdXQgY2FzZQorICAgICAgUmVhZEVsYXBzZWQgOj0gTWlsbGlTZWNvbmRzQmV0d2VlbihOb3csIFN0YXJ0KTsKKyAgICAgIGlmIChFQWdhaW5UaHJlc2hvbGQgPSAwKSBvciAoUmVhZEVsYXBzZWQgPCBFQWdhaW5UaHJlc2hvbGQpIHRoZW4gYmVnaW4KKyAgICAgICAgaWYgUmV0cmllcyA8IEZNYXhSZWN2UmV0cmllcyB0aGVuIGJlZ2luCisgICAgICAgICAgSW5jKFJldHJpZXMpOworICAgICAgICAgIFNsZWVwKDEpOworICAgICAgICAgIGdvdG8gVHJ5QWdhaW47CisgICAgICAgIGVuZAorICAgICAgICBlbHNlCisgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnV1NBRVdPVUxEQkxPQ0sgKHVuYXZhaWxhYmxlIHJlc291cmNlcyknKTsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICAvLyBpbmZlciB0aGF0IHRpbWVvdXQgaGFzIGJlZW4gaGl0CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1dTQUVXT1VMREJMT0NLICh0aW1lZCBvdXQpJyk7CisgICAgZW5kOworCisgICAgLy8gSWYgaW50ZXJydXB0ZWQsIHRyeSBhZ2FpbgorICAgIGlmIChFcnJub0NvcHkgPSBXU0FFSU5UUikgYW5kIChSZXRyaWVzIDwgRk1heFJlY3ZSZXRyaWVzKSB0aGVuIGJlZ2luCisgICAgICBJbmMoUmV0cmllcyk7CisgICAgICBnb3RvIFRyeUFnYWluOworICAgIGVuZDsKKworICAgIGlmIEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQgdGhlbgorICAgICAgRXhpdCgwKTsKKworICAgIC8vIFRoaXMgaXNoIGlzbid0IG9wZW4KKyAgICBpZiBFcnJub0NvcHkgPSBXU0FFTk9UQ09OTiB0aGVuCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1dTQUVOT1RDT05OJyk7CisKKyAgICAvLyBUaW1lZCBvdXQhCisgICAgaWYgRXJybm9Db3B5ID0gV1NBRVRJTUVET1VUIHRoZW4KKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV1NBRVRJTUVET1VUJyk7CisKKyAgICAvLyBOb3cgaXQncyBub3QgYSB0cnkgYWdhaW4gY2FzZSwgYnV0IGEgcmVhbCBwcm9iYmxlegorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5SZWFkKCkgcmVjdigpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworCisgICAgLy8gU29tZSBvdGhlciBlcnJvciwgd2hhdGV2egorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ1Vua25vd246ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgUmVzdWx0IDo9IEdvdDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuV3JpdGUoY29uc3QgQnVmOyBMZW46IEludGVnZXIpOwordmFyCisgIFNlbnQsIEI6IEludGVnZXI7CitiZWdpbgorICBTZW50IDo9IDA7CisgIHdoaWxlIFNlbnQgPCBMZW4gZG8gYmVnaW4KKyAgICBCIDo9IFdyaXRlUGFydGlhbCgoUEJ5dGUoQEJ1ZikgKyBTZW50KV4sIExlbiAtIFNlbnQpOworICAgIGlmIEIgPSAwIHRoZW4KKyAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHRoZSB0aW1lb3V0IHNldCB3aXRoIFNPX1NORFRJTUVPIGV4cGlyZWQuCisgICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24uCisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdzZW5kIHRpbWVvdXQgZXhwaXJlZCcpOworICAgIEluYyhTZW50LCBCKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUU29ja2V0LldyaXRlUGFydGlhbChjb25zdCBCdWY7IExlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgQjogSW50ZWdlcjsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgU29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHNvY2tldCcpOworCisgIEIgOj0gc2VuZChTb2NrZXQsIEJ1ZiwgTGVuLCAwKTsKKworICBpZiBCIDwgMCB0aGVuIGJlZ2luCisgICAgLy8gRmFpbCBvbiBhIHNlbmQgZXJyb3IKKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGlmIEVycm5vQ29weSA9IFdTQUVXT1VMREJMT0NLIHRoZW4KKyAgICAgIEV4aXQoMCk7CisKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuV3JpdGVQYXJ0aWFsKCkgc2VuZCgpICVzICVzJywgW1NvY2tldEluZm8sIFN5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworCisgICAgaWYgKEVycm5vQ29weSA9IFdTQUVDT05OUkVTRVQpIG9yIChFcnJub0NvcHkgPSBXU0FFTk9UQ09OTikgdGhlbiBiZWdpbgorICAgICAgQ2xvc2U7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCd3cml0ZSgpIHNlbmQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kOworCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnd3JpdGUoKSBzZW5kKCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisKKyAgLy8gRmFpbCBvbiBibG9ja2VkIHNlbmQKKyAgaWYgQiA9IDAgdGhlbgorICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnU29ja2V0IHNlbmQgcmV0dXJuZWQgMC4nKTsKKworICBSZXN1bHQgOj0gQjsKK2VuZDsKKworZnVuY3Rpb24gVFNvY2tldC5HZXRDYWNoZWRBZGRyZXNzKG91dCBMZW46IEludGVnZXIpOiBQU29ja0FkZHI7CitiZWdpbgorICBjYXNlIEZDYWNoZWRQZWVyQWRkci5pcHY0LnNpbl9mYW1pbHkgb2YKKyAgICBBRl9JTkVUOiBiZWdpbgorICAgICAgTGVuIDo9IFNpemVPZihUU29ja0FkZHJJbik7CisgICAgICBSZXN1bHQgOj0gUFNvY2tBZGRyKEBGQ2FjaGVkUGVlckFkZHIuaXB2NCk7CisgICAgZW5kOworICAgIEFGX0lORVQ2OiBiZWdpbgorICAgICAgTGVuIDo9IFNpemVPZihUU29ja0FkZHJJbjYpOworICAgICAgUmVzdWx0IDo9IFBTb2NrQWRkcihARkNhY2hlZFBlZXJBZGRyLmlwdjYpOworICAgIGVuZDsKKyAgZWxzZQorICAgIExlbiA6PSAwOworICAgIFJlc3VsdCA6PSBuaWw7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXQuU2V0Q2FjaGVkQWRkcmVzcyhjb25zdCBBZGRyOiBUU29ja0FkZHI7IExlbjogSW50ZWdlcik7CitiZWdpbgorICBjYXNlIEFkZHIuc2FfZmFtaWx5IG9mCisgICAgQUZfSU5FVDogaWYgTGVuID0gU2l6ZU9mKFRTb2NrQWRkckluKSB0aGVuIEZDYWNoZWRQZWVyQWRkci5pcHY0IDo9IFBTb2NrQWRkckluKEBBZGRyKV47CisgICAgQUZfSU5FVDY6IGlmIExlbiA9IFNpemVPZihUU29ja0FkZHJJbjYpIHRoZW4gRkNhY2hlZFBlZXJBZGRyLmlwdjYgOj0gUFNvY2tBZGRySW42KEBBZGRyKV47CisgIGVuZDsKKyAgRlBlZXJBZGRyZXNzIDo9ICcnOworICBGUGVlckhvc3QgOj0gJyc7CisgIEZQZWVyUG9ydCA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldC5TZXRMaW5nZXIoTGluZ2VyT246IEJvb2xlYW47IExpbmdlclZhbDogSW50ZWdlcik7Cit2YXIKKyAgTDogVExpbmdlcjsKK2JlZ2luCisgIEZMaW5nZXJPbiA6PSBMaW5nZXJPbjsKKyAgRkxpbmdlclZhbCA6PSBMaW5nZXJWYWw7CisgIGlmIFNvY2tldCA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICBFeGl0OworCisgIEwubF9vbm9mZiA6PSBJZlRoZW4oRkxpbmdlck9uLCAxLCAwKTsKKyAgTC5sX2xpbmdlciA6PSBMaW5nZXJWYWw7CisKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgQEwsIFNpemVPZihMKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNvY2tldC5TZXRMaW5nZXIoKSBzZXRzb2Nrb3B0KCkgJXMgJXMnLCBbU29ja2V0SW5mbywgU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXQuUGVlazogQm9vbGVhbjsKK3ZhcgorICBSZXRyaWVzOiBMb25nd29yZDsKKyAgRmRzOiBURmRTZXQ7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIFJldDogSW50ZWdlcjsKKyAgRXJybm9Db3B5OiBJbnRlZ2VyOworICBCdWY6IEJ5dGU7CitiZWdpbgorICBpZiBub3QgSXNPcGVuIHRoZW4gRXhpdChGYWxzZSk7CisKKyAgaWYgQXNzaWduZWQoRkludGVycnVwdExpc3RlbmVyKSB0aGVuIGJlZ2luCisgICAgUmV0cmllcyA6PSAwOworICAgIHdoaWxlIHRydWUgZG8gYmVnaW4KKyAgICAgIEZEX1pFUk8oRmRzKTsKKyAgICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgICAgX0ZEX1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcyk7CisgICAgICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbiBiZWdpbgorICAgICAgICBUVmFsLnR2X3NlYyA6PSBSZWN2VGltZW91dCBkaXYgMTAwMDsKKyAgICAgICAgVFZhbC50dl91c2VjIDo9IChSZWN2VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgICBQVFZhbCA6PSBAVFZhbDsKKyAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBQVFZhbCA6PSBuaWw7CisKKyAgICAgIFJldCA6PSBzZWxlY3QoMiwgQEZkcywgbmlsLCBuaWwsIFBUVmFsKTsKKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gZXJyb3IgY2FzZXMKKyAgICAgICAgaWYgKEVycm5vQ29weSA9IFdTQUVJTlRSKSBhbmQgKFJldHJpZXMgPCBGTWF4UmVjdlJldHJpZXMpIHRoZW4gYmVnaW4KKyAgICAgICAgICBJbmMoUmV0cmllcyk7CisgICAgICAgICAgQ29udGludWU7CisgICAgICAgIGVuZDsKKyAgICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU29ja2V0LlBlZWsoKSBzZWxlY3QoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgUmV0ID4gMCB0aGVuIGJlZ2luCisgICAgICAgIC8vIENoZWNrIHRoZSBpbnRlcnJ1cHRMaXN0ZW5lcgorICAgICAgICBpZiBGRF9JU1NFVChGSW50ZXJydXB0TGlzdGVuZXIsIEZkcykgdGhlbgorICAgICAgICAgIEV4aXQoRmFsc2UpOworICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGRhdGEgb3IgYSBkaXNjb25uZWN0aW9uLCBmYWxsIHRocm91Z2ggdG8gdGhlIFBFRUsKKyAgICAgICAgQnJlYWs7CisgICAgICBlbmQKKyAgICAgIGVsc2UKKyAgICAgICAgLy8gdGltZW91dAorICAgICAgICBFeGl0KEZhbHNlKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBDaGVjayB0byBzZWUgaWYgZGF0YSBpcyBhdmFpbGFibGUgb3IgaWYgdGhlIHJlbW90ZSBzaWRlIGNsb3NlZAorICBSZXQgOj0gcmVjdihTb2NrZXQsIEJ1ZiwgMSwgTVNHX1BFRUspOworICBpZiBSZXQgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgaWYgRXJybm9Db3B5ID0gV1NBRUNPTk5SRVNFVCB0aGVuIGJlZ2luCisgICAgICBDbG9zZTsKKyAgICAgIEV4aXQoRmFsc2UpOworICAgIGVuZDsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTb2NrZXQuUGVlaygpIHJlY3YoKSAlcyAlcycsIFtTb2NrZXRJbmZvLCBTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRm9ybWF0KCdyZWN2KCk6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICBlbmQ7CisgIFJlc3VsdCA6PSBSZXQgPiAwOworZW5kOworCitmdW5jdGlvbiBUU2VydmVyU29ja2V0LkNyZWF0ZVNvY2tldE9iaihDbGllbnQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0KTogVFNvY2tldDsKK2JlZ2luCisgIGlmIEZJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gdGhlbgorICAgIFJlc3VsdCA6PSBUU29ja2V0LkNyZWF0ZShDbGllbnQsIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIpCisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVFNvY2tldC5DcmVhdGUoQ2xpZW50KTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuTm90aWZ5KE5vdGlmeVNvY2tldDogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOwordmFyCisgIEJ5dDogQnl0ZTsKK2JlZ2luCisgIGlmIE5vdGlmeVNvY2tldCA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuIGJlZ2luCisgICAgQnl0IDo9IDA7CisgICAgaWYgc2VuZChOb3RpZnlTb2NrZXQsIEJ5dCwgU2l6ZU9mKEJ5dCksIDApID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5Ob3RpZnkoKSBzZW5kKCkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuU2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKEFWYWx1ZTogQm9vbGVhbik7CitiZWdpbgorICBpZiBGTGlzdGVuaW5nIHRoZW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4gY2Fubm90IGJlIHNldCBhZnRlciBsaXN0ZW4oKScpOworICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIDo9IEFWYWx1ZTsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXQuQ29tbW9uSW5pdDsKK2JlZ2luCisgIGluaGVyaXRlZCBDb21tb25Jbml0OworICBGSW50ZXJydXB0YWJsZUNoaWxkcmVuIDo9IFRydWU7CisgIEZBY2NlcHRCYWNrbG9nIDo9IERFRkFVTFRfQkFDS0xPRzsKKyAgRkFjY2VwdFRpbWVvdXQgOj0gMDsKKyAgRlJldHJ5TGltaXQgOj0gMDsKKyAgRlJldHJ5RGVsYXkgOj0gMDsKKyAgRlRjcFNlbmRCdWZmZXIgOj0gMDsKKyAgRlRjcFJlY3ZCdWZmZXIgOj0gMDsKKyAgRkxpc3RlbmluZyA6PSBGYWxzZTsKKyAgRkludGVycnVwdFNvY2tXcml0ZXIgOj0gSU5WQUxJRF9TT0NLRVQ7CisgIEZJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IElOVkFMSURfU09DS0VUOworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUgPSBuaWwpOworYmVnaW4KKyAgLy8gVW5uZWNlc3NhcnksIGJ1dCBoZXJlIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXQuQ3JlYXRlKEFQb3J0OiBJbnRlZ2VyOyBBU2VuZFRpbWVvdXQsIEFSZWN2VGltZW91dDogTG9uZ3dvcmQ7IEFMb2dEZWxlZ2F0ZTogVEJhc2VTb2NrZXQuVExvZ0RlbGVnYXRlKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoQVBvcnQsIEFMb2dEZWxlZ2F0ZSk7CisgIFNlbmRUaW1lb3V0IDo9IEFTZW5kVGltZW91dDsKKyAgUmVjdlRpbWVvdXQgOj0gQVJlY3ZUaW1lb3V0OworZW5kOworCitjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0LkNyZWF0ZShBQWRkcmVzczogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQUxvZ0RlbGVnYXRlOiBUQmFzZVNvY2tldC5UTG9nRGVsZWdhdGUpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZShBUG9ydCwgQUxvZ0RlbGVnYXRlKTsKKyAgRkFkZHJlc3MgOj0gQUFkZHJlc3M7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0Lkxpc3RlbjsKKworICBmdW5jdGlvbiBDcmVhdGVTb2NrZXRQYWlyKHZhciBSZWFkZXIsIFdyaXRlcjogV2luYXBpLldpbnNvY2syLlRTb2NrZXQpOiBJbnRlZ2VyOworICBsYWJlbAorICAgIEVycm9yOworICB0eXBlCisgICAgVFNBVW5pb24gPSByZWNvcmQKKyAgICBjYXNlIEludGVnZXIgb2YKKyAgICAgIDA6IChpbmFkZHI6IFRTb2NrQWRkckluKTsKKyAgICAgIDE6IChhZGRyOiBUU29ja0FkZHIpOworICAgIGVuZDsKKyAgdmFyCisgICAgYTogVFNBVW5pb247CisgICAgbGlzdGVuZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICAgIGU6IEludGVnZXI7CisgICAgYWRkcmxlbjogSW50ZWdlcjsKKyAgICBmbGFnczogRFdPUkQ7CisgICAgcmV1c2U6IEludGVnZXI7CisgIGJlZ2luCisgICAgYWRkcmxlbiA6PSBTaXplT2YoYS5pbmFkZHIpOworICAgIGZsYWdzIDo9IDA7CisgICAgcmV1c2UgOj0gMTsKKworICAgIGxpc3RlbmVyIDo9IFdpbmFwaS5XaW5zb2NrMi5zb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKyAgICBpZiBsaXN0ZW5lciA9IElOVkFMSURfU09DS0VUIHRoZW4KKyAgICAgIEV4aXQoU09DS0VUX0VSUk9SKTsKKworICAgIEZpbGxDaGFyKGEsIFNpemVPZihhKSwgMCk7CisgICAgYS5pbmFkZHIuc2luX2ZhbWlseSA6PSBBRl9JTkVUOworICAgIGEuaW5hZGRyLnNpbl9hZGRyLnNfYWRkciA6PSBodG9ubChJTkFERFJfTE9PUEJBQ0spOworICAgIGEuaW5hZGRyLnNpbl9wb3J0IDo9IDA7CisgICAgUmVhZGVyIDo9IElOVkFMSURfU09DS0VUOworICAgIFdyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKworICAgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQuICBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAgIC8vIHdhbnQgdG8gZm9yY2Ugc29ja2V0IHBhaXJzIHRvIGJlIGFuIGFkbWluLgorICAgIHNldHNvY2tvcHQobGlzdGVuZXIsIFNPTF9TT0NLRVQsIEludGVnZXIoU09fRVhDTFVTSVZFQUREUlVTRSksIEByZXVzZSwgU2l6ZU9mKHJldXNlKSk7CisgICAgaWYgYmluZChsaXN0ZW5lciwgYS5hZGRyLCBTaXplT2YoYS5pbmFkZHIpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgZ2V0c29ja25hbWUobGlzdGVuZXIsIGEuYWRkciwgYWRkcmxlbikgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGlmIFdpbmFwaS5XaW5zb2NrMi5saXN0ZW4obGlzdGVuZXIsIDEpID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBSZWFkZXIgOj0gV1NBU29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwLCBuaWwsIDAsIGZsYWdzKTsKKyAgICBpZiBSZWFkZXIgPSBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgY29ubmVjdChSZWFkZXIsIGEuYWRkciwgU2l6ZU9mKGEuaW5hZGRyKSkgPSBTT0NLRVRfRVJST1IgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIFdyaXRlciA6PSBXaW5hcGkuV2luc29jazIuYWNjZXB0KGxpc3RlbmVyLCBuaWwsIG5pbCk7CisgICAgaWYgV3JpdGVyID0gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgICAgZ290byBFcnJvcjsKKworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICBFeGl0KDApOworCisgIEVycm9yOgorICAgIGUgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIGNsb3Nlc29ja2V0KGxpc3RlbmVyKTsKKyAgICBjbG9zZXNvY2tldChSZWFkZXIpOworICAgIGNsb3Nlc29ja2V0KFdyaXRlcik7CisgICAgV1NBU2V0TGFzdEVycm9yKGUpOworICAgIFJlc3VsdCA6PSBTT0NLRVRfRVJST1I7CisgIGVuZDsKKwordmFyCisgIFRlbXBJbnRSZWFkZXIsCisgIFRlbXBJbnRXcml0ZXI6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICBPbmU6IENhcmRpbmFsOworICBFcnJub0NvcHk6IEludGVnZXI7CisgIExpbmc6IFRMaW5nZXI7CisgIFJldHJpZXM6IEludGVnZXI7CisgIEFkZHJJbmZvOiBJR2V0QWRkckluZm9XcmFwcGVyOworICBTQTogVFNvY2tBZGRyU3RvcmFnZTsKKyAgTGVuOiBJbnRlZ2VyOworYmVnaW4KKyAgLy8gQ3JlYXRlIHRoZSBzb2NrZXQgcGFpciB1c2VkIHRvIGludGVycnVwdAorICBpZiBDcmVhdGVTb2NrZXRQYWlyKFRlbXBJbnRSZWFkZXIsIFRlbXBJbnRXcml0ZXIpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgQ3JlYXRlU29ja2V0UGFpcigpIEludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgICBGSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGSW50ZXJydXB0U29ja1JlYWRlciA6PSBUZW1wSW50UmVhZGVyOworICAgIEZJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IFRlbXBJbnRXcml0ZXI7CisgIGVuZDsKKworICAvLyBDcmVhdGUgdGhlIHNvY2tldCBwYWlyIHVzZWQgdG8gaW50ZXJydXB0IGFsbCBjbGllbnRzCisgIGlmIENyZWF0ZVNvY2tldFBhaXIoVGVtcEludFJlYWRlciwgVGVtcEludFdyaXRlcikgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBDcmVhdGVTb2NrZXRQYWlyKCkgQ2hpbGRJbnRlcnJ1cHQgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1JlYWRlciA6PSBUU21hcnRQb2ludGVyPFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0Pi5DcmVhdGUoSU5WQUxJRF9TT0NLRVQsIG5pbCk7CisgICAgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA6PSBJTlZBTElEX1NPQ0tFVDsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyIDo9IFRTbWFydFBvaW50ZXI8V2luYXBpLldpbnNvY2syLlRTb2NrZXQ+LkNyZWF0ZShUZW1wSW50UmVhZGVyLCBEZXN0cm95ZXJPZkZpbmVTb2NrZXRzKTsKKyAgICBGQ2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyIDo9IFRlbXBJbnRXcml0ZXI7CisgIGVuZDsKKworICBpZiAoUG9ydCA8IDApIG9yIChQb3J0ID4gJEZGRkYpIHRoZW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUoJ1NwZWNpZmllZCBwb3J0IGlzIGludmFsaWQnKTsKKworICBBZGRySW5mbyA6PSBDcmVhdGVTb2NrZXQoRkFkZHJlc3MsIFBvcnQpOworCisgIC8vIFNldCBTT19FWENMVVNJVkVBRERSVVNFIHRvIHByZXZlbnQgMk1TTCBkZWxheSBvbiBhY2NlcHQKKyAgT25lIDo9IDE7CisgIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBJbnRlZ2VyKFNPX0VYQ0xVU0lWRUFERFJVU0UpLCBAb25lLCBTaXplT2YoT25lKSk7CisgIC8vIGlnbm9yZSBlcnJvcnMgY29taW5nIG91dCBvZiB0aGlzIHNldHNvY2tvcHQgb24gV2luZG93cy4gIFRoaXMgaXMgYmVjYXVzZQorICAvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorICAvLyB3YW50IHRvIGZvcmNlIHNlcnZlcnMgdG8gYmUgYW4gYWRtaW4uCisKKyAgLy8gU2V0IFRDUCBidWZmZXIgc2l6ZXMKKyAgaWYgRlRjcFNlbmRCdWZmZXIgPiAwIHRoZW4gYmVnaW4KKyAgICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCBARlRjcFNlbmRCdWZmZXIsIFNpemVPZihGVGNwU2VuZEJ1ZmZlcikpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZShGb3JtYXQoJ0NvdWxkIG5vdCBzZXQgU09fU05EQlVGOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICBpZiBGVGNwUmVjdkJ1ZmZlciA+IDAgdGhlbiBiZWdpbgorICAgIGlmIHNldHNvY2tvcHQoU29ja2V0LCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsIEBGVGNwUmVjdkJ1ZmZlciwgU2l6ZU9mKEZUY3BSZWN2QnVmZmVyKSkgPSBTT0NLRVRfRVJST1IgdGhlbiBiZWdpbgorICAgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fUkNWQlVGICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBTT19SQ1ZCVUY6ICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIGVuZDsKKyAgZW5kOworCisgIC8vIFR1cm4gbGluZ2VyIG9mZiwgZG9uJ3Qgd2FudCB0byBibG9jayBvbiBjYWxscyB0byBjbG9zZQorICBMaW5nLmxfb25vZmYgOj0gMDsKKyAgTGluZy5sX2xpbmdlciA6PSAwOworICBpZiBzZXRzb2Nrb3B0KFNvY2tldCwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBATGluZywgU2l6ZU9mKExpbmcpKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX0xJTkdFUiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3Qgc2V0IFNPX0xJTkdFUjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBUQ1AgTm9kZWxheSwgc3BlZWQgb3ZlciBiYW5kd2lkdGgKKyAgaWYgc2V0c29ja29wdChTb2NrZXQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgQE9uZSwgU2l6ZU9mKE9uZSkpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX05PREVMQVkgJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICAvLyBTZXQgTk9OQkxPQ0sgb24gdGhlIGFjY2VwdCBzb2NrZXQKKyAgaWYgaW9jdGxzb2NrZXQoU29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBPbmUpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBpb2N0bHNvY2tldCgpIEZJT05CSU8gJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKSBGSU9OQklPOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIHByZXBhcmUgdGhlIHBvcnQgaW5mb3JtYXRpb24KKyAgLy8gd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIGJpbmQgbW9yZSB0aGFuIG9uY2UsIHNpbmNlIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyBkb2Vzbid0CisgIC8vIGFsd2F5cyBzZWVtIHRvIHdvcmsuIFRoZSBjbGllbnQgY2FuIGNvbmZpZ3VyZSB0aGUgcmV0cnkgdmFyaWFibGVzLgorICBSZXRyaWVzIDo9IDA7CisgIHdoaWxlIFRydWUgZG8gYmVnaW4KKyAgICBpZiBiaW5kKFNvY2tldCwgQWRkckluZm8uUmVzXi5haV9hZGRyXiwgQWRkckluZm8uUmVzXi5haV9hZGRybGVuKSA9IDAgdGhlbgorICAgICAgQnJlYWs7CisgICAgSW5jKFJldHJpZXMpOworICAgIGlmIFJldHJpZXMgPiBGUmV0cnlMaW1pdCB0aGVuCisgICAgICBCcmVhazsKKyAgICBTbGVlcChGUmV0cnlEZWxheSAqIDEwMDApOworICBlbmQ7CisKKyAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgIGlmIChQb3J0ID0gMCkgYW5kIChSZXRyaWVzIDwgRlJldHJ5TGltaXQpIHRoZW4gYmVnaW4KKyAgICBMZW4gOj0gU2l6ZU9mKFNBKTsKKyAgICBGaWxsQ2hhcihTQSwgTGVuLCAwKTsKKyAgICBpZiBnZXRzb2NrbmFtZShTb2NrZXQsIFBTb2NrQWRkcihAU0EpXiwgTGVuKSA9IFNPQ0tFVF9FUlJPUiB0aGVuCisgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuTGlzdGVuKCkgZ2V0c29ja25hbWUoKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKQorICAgIGVsc2UgYmVnaW4KKyAgICAgIGlmIFNBLnNzX2ZhbWlseSA9IEFGX0lORVQ2IHRoZW4KKyAgICAgICAgUG9ydCA6PSBudG9ocyhQU29ja0FkZHJJbjYoQFNBKV4uc2luNl9wb3J0KQorICAgICAgZWxzZQorICAgICAgICBQb3J0IDo9IG50b2hzKFBTb2NrQWRkckluKEBTQSleLnNpbl9wb3J0KTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAoUmV0cmllcyA+IEZSZXRyeUxpbWl0KSB0aGVuIGJlZ2luCisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0Lkxpc3RlbigpIEJJTkQgJWQnLCBbUG9ydF0pKTsKKyAgICBDbG9zZTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3QgYmluZDogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKFdTQUdldExhc3RFcnJvcildKSk7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChGTGlzdGVuQ2FsbGJhY2spIHRoZW4KKyAgICBGTGlzdGVuQ2FsbGJhY2soU29ja2V0KTsKKworICAvLyBDYWxsIGxpc3RlbgorICBpZiBXaW5hcGkuV2luc29jazIubGlzdGVuKFNvY2tldCwgRkFjY2VwdEJhY2tsb2cpID0gU09DS0VUX0VSUk9SIHRoZW4gYmVnaW4KKyAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5MaXN0ZW4oKSBsaXN0ZW4oKSAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoRm9ybWF0KCdDb3VsZCBub3QgbGlzdGVuOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK2VuZDsKKworZnVuY3Rpb24gVFNlcnZlclNvY2tldC5BY2NlcHQ6IFRTb2NrZXQ7Cit2YXIKKyAgRmRzOiBURmRTZXQ7CisgIE1heEVJbnRlcnMsCisgIE51bUVJbnRlcnM6IEludGVnZXI7CisgIFRWYWw6IFRUaW1lVmFsOworICBQVFZhbDogUFRpbWVWYWw7CisgIEVycm5vQ29weTogSW50ZWdlcjsKKyAgQnVmOiBCeXRlOworICBDbGllbnRBZGRyZXNzOiBUU29ja0FkZHJTdG9yYWdlOworICBTaXplOiBJbnRlZ2VyOworICBDbGllbnRTb2NrZXQ6IFdpbmFwaS5XaW5zb2NrMi5UU29ja2V0OworICBaZXJvOiBDYXJkaW5hbDsKKyAgQ2xpZW50OiBUU29ja2V0OworICBSZXQ6IEludGVnZXI7CitiZWdpbgorICBNYXhFSW50ZXJzIDo9IDU7CisgIE51bUVJbnRlcnMgOj0gMDsKKworICB3aGlsZSBUcnVlIGRvIGJlZ2luCisgICAgRkRfWkVSTyhGZHMpOworICAgIF9GRF9TRVQoU29ja2V0LCBGZHMpOworICAgIF9GRF9TRVQoRkludGVycnVwdFNvY2tSZWFkZXIsIEZkcyk7CisgICAgaWYgRkFjY2VwdFRpbWVvdXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIFRWYWwudHZfc2VjIDo9IEZBY2NlcHRUaW1lb3V0IGRpdiAxMDAwOworICAgICAgVFZhbC50dl91c2VjIDo9IChGQWNjZXB0VGltZW91dCBtb2QgMTAwMCkgKiAxMDAwOworICAgICAgUFRWYWwgOj0gQFRWYWw7CisgICAgZW5kCisgICAgZWxzZQorICAgICAgUFRWYWwgOj0gbmlsOworCisgICAgLy8gVE9ETzogaWYgV1NBRUlOVFIgaXMgcmVjZWl2ZWQsIHdlJ2xsIHJlc3RhcnQgdGhlIHRpbWVvdXQuCisgICAgLy8gVG8gYmUgYWNjdXJhdGUsIHdlIG5lZWQgdG8gZml4IHRoaXMgaW4gdGhlIGZ1dHVyZS4KKyAgICBSZXQgOj0gc2VsZWN0KDIsIEBGZHMsIG5pbCwgbmlsLCBQVFZhbCk7CisKKyAgICBpZiBSZXQgPCAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIGVycm9yIGNhc2VzCisgICAgICBpZiAoV1NBR2V0TGFzdEVycm9yID0gV1NBRUlOVFIpIGFuZCAoTnVtRUludGVycyA8IE1heEVJbnRlcnMpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAvLyBhIGNlcnRhaW4gbnVtYmVyCisgICAgICAgIEluYyhOdW1FSW50ZXJzKTsKKyAgICAgICAgQ29udGludWU7CisgICAgICBlbmQ7CisgICAgICBFcnJub0NvcHkgOj0gV1NBR2V0TGFzdEVycm9yOworICAgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIHNlbGVjdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnVW5rbm93bjogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgZW5kCisgICAgZWxzZSBpZiBSZXQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIC8vIENoZWNrIGZvciBhbiBpbnRlcnJ1cHQgc2lnbmFsCisgICAgICBpZiAoRkludGVycnVwdFNvY2tSZWFkZXIgPD4gSU5WQUxJRF9TT0NLRVQpIGFuZCBGRF9JU1NFVChGSW50ZXJydXB0U29ja1JlYWRlciwgRmRzKSB0aGVuIGJlZ2luCisgICAgICAgIGlmIHJlY3YoRkludGVycnVwdFNvY2tSZWFkZXIsIEJ1ZiwgU2l6ZU9mKEJ1ZiksIDApID0gU09DS0VUX0VSUk9SIHRoZW4KKyAgICAgICAgICBMb2dEZWxlZ2F0ZShGb3JtYXQoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgcmVjdigpIGludGVycnVwdCAlcycsIFtTeXNFcnJvck1lc3NhZ2UoV1NBR2V0TGFzdEVycm9yKV0pKTsKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkLkNyZWF0ZSgnaW50ZXJydXB0ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBhY3R1YWwgc2VydmVyIHNvY2tldCBiZWluZyByZWFkeQorICAgICAgaWYgRkRfSVNTRVQoU29ja2V0LCBGZHMpIHRoZW4KKyAgICAgICAgQnJlYWs7CisgICAgZW5kCisgICAgZWxzZSBiZWdpbgorICAgICAgTG9nRGVsZWdhdGUoJ1RTZXJ2ZXJTb2NrZXQuQWNjZXB0KCkgc2VsZWN0KCkgMCcpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCd1bmtub3duIGVycm9yJyk7CisgICAgZW5kOworICBlbmQ7CisKKyAgU2l6ZSA6PSBTaXplT2YoQ2xpZW50QWRkcmVzcyk7CisgIENsaWVudFNvY2tldCA6PSBXaW5hcGkuV2luc29jazIuYWNjZXB0KFNvY2tldCwgQENsaWVudEFkZHJlc3MsIEBTaXplKTsKKyAgaWYgQ2xpZW50U29ja2V0ID0gSU5WQUxJRF9TT0NLRVQgdGhlbiBiZWdpbgorICAgIEVycm5vQ29weSA6PSBXU0FHZXRMYXN0RXJyb3I7CisgICAgTG9nRGVsZWdhdGUoRm9ybWF0KCdUU2VydmVyU29ja2V0LkFjY2VwdCgpIGFjY2VwdCgpICVzJywgW1N5c0Vycm9yTWVzc2FnZShFcnJub0NvcHkpXSkpOworICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShGb3JtYXQoJ2FjY2VwdCgpOiAlcycsIFtTeXNFcnJvck1lc3NhZ2UoRXJybm9Db3B5KV0pKTsKKyAgZW5kOworCisgIC8vIE1ha2Ugc3VyZSBjbGllbnQgc29ja2V0IGlzIGJsb2NraW5nCisgIFplcm8gOj0gMDsKKyAgaWYgaW9jdGxzb2NrZXQoQ2xpZW50U29ja2V0LCBJbnRlZ2VyKEZJT05CSU8pLCBaZXJvKSA9IFNPQ0tFVF9FUlJPUiB0aGVuIGJlZ2luCisgICAgRXJybm9Db3B5IDo9IFdTQUdldExhc3RFcnJvcjsKKyAgICBjbG9zZXNvY2tldChDbGllbnRTb2NrZXQpOworICAgIExvZ0RlbGVnYXRlKEZvcm1hdCgnVFNlcnZlclNvY2tldC5BY2NlcHQoKSBpb2N0bHNvY2tldCgpIEZJT05CSU8gJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEZvcm1hdCgnaW9jdGxzb2NrZXQoKTogJXMnLCBbU3lzRXJyb3JNZXNzYWdlKEVycm5vQ29weSldKSk7CisgIGVuZDsKKworICBDbGllbnQgOj0gQ3JlYXRlU29ja2V0T2JqKENsaWVudFNvY2tldCk7CisgIGlmIFNlbmRUaW1lb3V0ID4gMCB0aGVuCisgICAgQ2xpZW50LlNlbmRUaW1lb3V0IDo9IFNlbmRUaW1lb3V0OworICBpZiBSZWN2VGltZW91dCA+IDAgdGhlbgorICAgIENsaWVudC5SZWN2VGltZW91dCA6PSBSZWN2VGltZW91dDsKKyAgaWYgS2VlcEFsaXZlIHRoZW4KKyAgICBDbGllbnQuS2VlcEFsaXZlIDo9IEtlZXBBbGl2ZTsKKyAgQ2xpZW50LlNldENhY2hlZEFkZHJlc3MoUFNvY2tBZGRyKEBDbGllbnRBZGRyZXNzKV4sIFNpemUpOworCisgIGlmIEFzc2lnbmVkKEZBY2NlcHRDYWxsYmFjaykgdGhlbgorICAgIEZBY2NlcHRDYWxsYmFjayhDbGllbnRTb2NrZXQpOworCisgIFJlc3VsdCA6PSBDbGllbnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkludGVycnVwdDsKK2JlZ2luCisgIE5vdGlmeShGSW50ZXJydXB0U29ja1dyaXRlcik7CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0LkludGVycnVwdENoaWxkcmVuOworYmVnaW4KKyAgTm90aWZ5KEZDaGlsZEludGVycnVwdFNvY2tXcml0ZXIpOworZW5kOworCitwcm9jZWR1cmUgVFNlcnZlclNvY2tldC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKyAgaWYgRkludGVycnVwdFNvY2tXcml0ZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZJbnRlcnJ1cHRTb2NrV3JpdGVyKTsKKyAgaWYgRkludGVycnVwdFNvY2tSZWFkZXIgPD4gSU5WQUxJRF9TT0NLRVQgdGhlbgorICAgIGNsb3Nlc29ja2V0KEZJbnRlcnJ1cHRTb2NrUmVhZGVyKTsKKyAgaWYgRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlciA8PiBJTlZBTElEX1NPQ0tFVCB0aGVuCisgICAgY2xvc2Vzb2NrZXQoRkNoaWxkSW50ZXJydXB0U29ja1dyaXRlcik7CisgIEZDaGlsZEludGVycnVwdFNvY2tSZWFkZXIgOj0gVFNtYXJ0UG9pbnRlcjxXaW5hcGkuV2luc29jazIuVFNvY2tldD4uQ3JlYXRlKElOVkFMSURfU09DS0VULCBuaWwpOworICBGTGlzdGVuaW5nIDo9IEZhbHNlOworZW5kOworCit7JEVORElGfSAvLyBub3QgZm9yIE9MRF9TT0NLRVRTCitlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzCmluZGV4IDgxZDVkMmEuLjMzMDhjNTMgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5TdHJlYW0ucGFzCkBAIC0xLDI5OCArMSwzMTkgQEAKLSgqDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqKQ0KLQ0KLXVuaXQgVGhyaWZ0LlN0cmVhbTsNCi0NCi1pbnRlcmZhY2UNCi0NCi11c2VzDQotICBDbGFzc2VzLA0KLSAgU3lzVXRpbHMsDQotICBTeXNDb25zdCwNCi0gIFJUTENvbnN0cywNCi0gIFRocmlmdC5VdGlscywNCi0gIEFjdGl2ZVg7DQotDQotdHlwZQ0KLQ0KLSAgSVRocmlmdFN0cmVhbSA9IGludGVyZmFjZQ0KLSAgICBbJ3s3MzI2MjFCMy1GNjk3LTRENzYtQTFCMC1CNERENUE4RTQwMTh9J10NCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7DQotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7DQotICAgIHByb2NlZHVyZSBPcGVuOw0KLSAgICBwcm9jZWR1cmUgQ2xvc2U7DQotICAgIHByb2NlZHVyZSBGbHVzaDsNCi0gICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOw0KLSAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7DQotICBlbmQ7DQotDQotICBUVGhyaWZ0U3RyZWFtSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdFN0cmVhbSkNCi0gIHByaXZhdGUNCi0gICAgcHJvY2VkdXJlIENoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOw0KLSAgcHJvdGVjdGVkDQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyB2aXJ0dWFsOw0KLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOw0KLSAgICBwcm9jZWR1cmUgT3BlbjsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICBlbmQ7DQotDQotICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApDQotICBwcml2YXRlDQotICAgIEZTdHJlYW0gOiBUU3RyZWFtOw0KLSAgICBGT3duc1N0cmVhbSA6IEJvb2xlYW47DQotICBwcm90ZWN0ZWQNCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogVFN0cmVhbTsgQU93bnNTdHJlYW0gOiBCb29sZWFuKTsNCi0gICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsNCi0gIGVuZDsNCi0NCi0gIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQ0KLSAgcHJpdmF0ZQ0KLSAgICBGU3RyZWFtIDogSVN0cmVhbTsNCi0gIHByb3RlY3RlZA0KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7DQotICBwdWJsaWMNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJU3RyZWFtKTsNCi0gIGVuZDsNCi0NCi1pbXBsZW1lbnRhdGlvbg0KLQ0KLXsgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00gfQ0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DbG9zZTsNCi1iZWdpbg0KLSAgRlN0cmVhbSA6PSBuaWw7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVN0cmVhbSk7DQotYmVnaW4NCi0gIEZTdHJlYW0gOj0gQVN0cmVhbTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkZsdXNoOw0KLWJlZ2luDQotICBpZiBJc09wZW4gdGhlbg0KLSAgYmVnaW4NCi0gICAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIEZTdHJlYW0uQ29tbWl0KCBTVEdDX0RFRkFVTFQgKTsNCi0gICAgZW5kOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Jc09wZW46IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGU3RyZWFtIDw+IG5pbDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLk9wZW47DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkOw0KLSAgUmVzdWx0IDo9IDA7DQotICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICBpZiBjb3VudCA+IDAgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIEZTdHJlYW0uUmVhZCggQGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgQFJlc3VsdCk7DQotICAgIGVuZDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uVG9BcnJheTogVEJ5dGVzOw0KLXZhcg0KLSAgc3RhdHN0ZzogVFN0YXRTdGc7DQotICBsZW4gOiBJbnRlZ2VyOw0KLSAgTmV3UG9zIDogSW50NjQ7DQotICBjYlJlYWQgOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBGaWxsQ2hhciggc3RhdHN0ZywgU2l6ZU9mKCBzdGF0c3RnKSwgMCk7DQotICBsZW4gOj0gMDsNCi0gIGlmIElzT3BlbiB0aGVuDQotICBiZWdpbg0KLSAgICBpZiBTdWNjZWVkZWQoIEZTdHJlYW0uU3RhdCggc3RhdHN0ZywgU1RBVEZMQUdfTk9OQU1FICkpIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBsZW4gOj0gc3RhdHN0Zy5jYlNpemU7DQotICAgIGVuZDsNCi0gIGVuZDsNCi0NCi0gIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsNCi0NCi0gIGlmIGxlbiA+IDAgdGhlbg0KLSAgYmVnaW4NCi0gICAgaWYgU3VjY2VlZGVkKCBGU3RyZWFtLlNlZWsoIDAsIFNUUkVBTV9TRUVLX1NFVCwgTmV3UG9zKSApIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBGU3RyZWFtLlJlYWQoIEBSZXN1bHRbMF0sIGxlbiwgQGNiUmVhZCk7DQotICAgIGVuZDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLldyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7DQotdmFyDQotICBuV3JpdHRlbiA6IEludGVnZXI7DQotYmVnaW4NCi0gIGluaGVyaXRlZDsNCi0gIGlmIElzT3BlbiB0aGVuDQotICBiZWdpbg0KLSAgICBpZiBjb3VudCA+IDAgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIEZTdHJlYW0uV3JpdGUoIEBidWZmZXJbMF0sIGNvdW50LCBAbldyaXR0ZW4pOw0KLSAgICBlbmQ7DQotICBlbmQ7DQotZW5kOw0KLQ0KLXsgVFRocmlmdFN0cmVhbUltcGwgfQ0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5DaGVja1NpemVBbmRPZmZzZXQoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwNCi0gIGNvdW50OiBJbnRlZ2VyKTsNCi12YXINCi0gIGxlbiA6IEludGVnZXI7DQotYmVnaW4NCi0gIGlmIGNvdW50ID4gMCB0aGVuDQotICBiZWdpbg0KLSAgICBsZW4gOj0gTGVuZ3RoKCBidWZmZXIgKTsNCi0gICAgaWYgKG9mZnNldCA8IDApIG9yICggb2Zmc2V0ID49IGxlbikgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7DQotICAgIGVuZDsNCi0gICAgaWYgY291bnQgPiBsZW4gdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7DQotICAgIGVuZDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdFN0cmVhbUltcGwuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwNCi0gIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IDA7DQotICBDaGVja1NpemVBbmRPZmZzZXQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCApOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBDaGVja1NpemVBbmRPZmZzZXQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCApOw0KLWVuZDsNCi0NCi17IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpIH0NCi0NCi1wcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ2xvc2U7DQotYmVnaW4NCi0gIEZTdHJlYW0uRnJlZTsNCi0gIEZTdHJlYW0gOj0gbmlsOw0KLSAgRk93bnNTdHJlYW0gOj0gRmFsc2U7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogVFN0cmVhbTsgQU93bnNTdHJlYW06IEJvb2xlYW4pOw0KLWJlZ2luDQotICBGU3RyZWFtIDo9IEFTdHJlYW07DQotICBGT3duc1N0cmVhbSA6PSBBT3duc1N0cmVhbTsNCi1lbmQ7DQotDQotZGVzdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5EZXN0cm95Ow0KLWJlZ2luDQotICBpZiBGT3duc1N0cmVhbSB0aGVuDQotICBiZWdpbg0KLSAgICBGU3RyZWFtLkZyZWU7DQotICBlbmQ7DQotICBpbmhlcml0ZWQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5GbHVzaDsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Jc09wZW46IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGU3RyZWFtIDw+IG5pbDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLk9wZW47DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwNCi0gIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkOw0KLSAgUmVzdWx0IDo9IDA7DQotICBpZiBjb3VudCA+IDAgdGhlbg0KLSAgYmVnaW4NCi0gICAgUmVzdWx0IDo9IEZTdHJlYW0uUmVhZCggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpDQotICBlbmQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlRvQXJyYXk6IFRCeXRlczsNCi12YXINCi0gIE9yZ1BvcyA6IEludGVnZXI7DQotICBsZW4gOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBsZW4gOj0gMDsNCi0gIGlmIEZTdHJlYW0gPD4gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIGxlbiA6PSBGU3RyZWFtLlNpemU7DQotICBlbmQ7DQotDQotICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7DQotDQotICBpZiBsZW4gPiAwIHRoZW4NCi0gIGJlZ2luDQotICAgIE9yZ1BvcyA6PSBGU3RyZWFtLlBvc2l0aW9uOw0KLSAgICB0cnkNCi0gICAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IDA7DQotICAgICAgRlN0cmVhbS5SZWFkQnVmZmVyKCBQb2ludGVyKEBSZXN1bHRbMF0pXiwgbGVuICk7DQotICAgIGZpbmFsbHkNCi0gICAgICBGU3RyZWFtLlBvc2l0aW9uIDo9IE9yZ1BvczsNCi0gICAgZW5kOw0KLSAgZW5kDQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LA0KLSAgY291bnQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQ7DQotICBpZiBjb3VudCA+IDAgdGhlbg0KLSAgYmVnaW4NCi0gICAgRlN0cmVhbS5Xcml0ZSggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpDQotICBlbmQ7DQotZW5kOw0KLQ0KLWVuZC4NCisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgVGhyaWZ0LlN0cmVhbTsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywKKyAgU3lzVXRpbHMsCisgIFN5c0NvbnN0LAorICBSVExDb25zdHMsCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIEFjdGl2ZVgsCisgIHskRUxTRX0KKyAgV2luYXBpLkFjdGl2ZVgsCisgIHskRU5ESUZ9CisgIFRocmlmdC5VdGlsczsKKwordHlwZQorCisgIElUaHJpZnRTdHJlYW0gPSBpbnRlcmZhY2UKKyAgICBbJ3syQTc3RDkxNi03NDQ2LTQ2QzEtODU0NS0wQUVDMDAwOERCQ0F9J10KKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBPcGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJlYW1JbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVGhyaWZ0U3RyZWFtKQorICBwcml2YXRlCisgICAgcHJvY2VkdXJlIENoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBPcGVuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBGbHVzaDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IHZpcnR1YWw7IGFic3RyYWN0OworICBlbmQ7CisKKyAgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwgKQorICBwcml2YXRlCisgICAgRlN0cmVhbSA6IFRTdHJlYW07CisgICAgRk93bnNTdHJlYW0gOiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBUU3RyZWFtOyBBT3duc1N0cmVhbSA6IEJvb2xlYW4pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTSA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCkKKyAgcHJpdmF0ZQorICAgIEZTdHJlYW0gOiBJU3RyZWFtOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gVG9BcnJheTogVEJ5dGVzOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJU3RyZWFtKTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCit7IFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NIH0KKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNsb3NlOworYmVnaW4KKyAgRlN0cmVhbSA6PSBuaWw7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RyZWFtIDo9IEFTdHJlYW07CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5GbHVzaDsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgRlN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgICAgRlN0cmVhbS5Db21taXQoIFNUR0NfREVGQVVMVCApOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Jc09wZW46IEJvb2xlYW47CitiZWdpbgorICBSZXN1bHQgOj0gRlN0cmVhbSA8PiBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5PcGVuOworYmVnaW4KKyAgLy8gbm90aGluZyB0byBkbworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCisgIFJlc3VsdCA6PSAwOworICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZTdHJlYW0uUmVhZCggcFRtcCwgY291bnQsIEBSZXN1bHQpOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIKKyAgc3RhdHN0ZzogVFN0YXRTdGc7CisgIGxlbiA6IEludGVnZXI7CisgIE5ld1BvcyA6IHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDI5LjB9IFVJbnQ2NCB7JEVMU0V9IEludDY0ICB7JElGRU5EfTsKKyAgY2JSZWFkIDogSW50ZWdlcjsKK2JlZ2luCisgIEZpbGxDaGFyKCBzdGF0c3RnLCBTaXplT2YoIHN0YXRzdGcpLCAwKTsKKyAgbGVuIDo9IDA7CisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgaWYgU3VjY2VlZGVkKCBGU3RyZWFtLlN0YXQoIHN0YXRzdGcsIFNUQVRGTEFHX05PTkFNRSApKSB0aGVuIGJlZ2luCisgICAgICBsZW4gOj0gc3RhdHN0Zy5jYlNpemU7CisgICAgZW5kOworICBlbmQ7CisKKyAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbiApOworCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIGlmIFN1Y2NlZWRlZCggRlN0cmVhbS5TZWVrKCAwLCBTVFJFQU1fU0VFS19TRVQsIE5ld1BvcykgKSB0aGVuIGJlZ2luCisgICAgICBGU3RyZWFtLlJlYWQoIEBSZXN1bHRbMF0sIGxlbiwgQGNiUmVhZCk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5Xcml0ZSggY29uc3QgcEJ1ZjogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgbldyaXR0ZW4gOiBJbnRlZ2VyOworICAgIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGluaGVyaXRlZDsKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5Xcml0ZSggcFRtcCwgY291bnQsIEBuV3JpdHRlbik7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK3sgVFRocmlmdFN0cmVhbUltcGwgfQorCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuQ2hlY2tTaXplQW5kT2Zmc2V0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7CitiZWdpbgorICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIGlmIChvZmZzZXQgPCAwKSBvciAoIG9mZnNldCA+PSBidWZsZW4pIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CisgICAgZW5kOworICAgIGlmIGNvdW50ID4gYnVmbGVuIHRoZW4gYmVnaW4KKyAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQodmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIExlbmd0aChidWZmZXIpID4gMAorICB0aGVuIFJlc3VsdCA6PSBSZWFkKCBAYnVmZmVyWzBdLCBMZW5ndGgoYnVmZmVyKSwgb2Zmc2V0LCBjb3VudCkKKyAgZWxzZSBSZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IDA7CisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50ICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZmZlclswXSwgb2Zmc2V0LCBjb3VudCk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBwQnVmLCBvZmZzZXQrY291bnQsIG9mZnNldCwgY291bnQpOworZW5kOworCit7IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpIH0KKworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNsb3NlOworYmVnaW4KKyAgRlN0cmVhbS5GcmVlOworICBGU3RyZWFtIDo9IG5pbDsKKyAgRk93bnNTdHJlYW0gOj0gRmFsc2U7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogVFN0cmVhbTsgQU93bnNTdHJlYW06IEJvb2xlYW4pOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworICBGT3duc1N0cmVhbSA6PSBBT3duc1N0cmVhbTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5EZXN0cm95OworYmVnaW4KKyAgaWYgRk93bnNTdHJlYW0gCisgIHRoZW4gQ2xvc2U7CisgIAorICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5GbHVzaDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTdHJlYW0gPD4gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuT3BlbjsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuUmVhZChjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCisgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBwVG1wXiwgY291bnQpCisgIGVuZAorICBlbHNlIFJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Ub0FycmF5OiBUQnl0ZXM7Cit2YXIKKyAgT3JnUG9zIDogSW50ZWdlcjsKKyAgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuCisgIGJlZ2luCisgICAgbGVuIDo9IEZTdHJlYW0uU2l6ZTsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4gKTsKKworICBpZiBsZW4gPiAwIHRoZW4KKyAgYmVnaW4KKyAgICBPcmdQb3MgOj0gRlN0cmVhbS5Qb3NpdGlvbjsKKyAgICB0cnkKKyAgICAgIEZTdHJlYW0uUG9zaXRpb24gOj0gMDsKKyAgICAgIEZTdHJlYW0uUmVhZEJ1ZmZlciggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOworICAgIGZpbmFsbHkKKyAgICAgIEZTdHJlYW0uUG9zaXRpb24gOj0gT3JnUG9zOworICAgIGVuZDsKKyAgZW5kCitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Xcml0ZShjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgRlN0cmVhbS5Xcml0ZSggcFRtcF4sIGNvdW50KQorICBlbmQ7CitlbmQ7CisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKaW5kZXggOGY3ZWM1OS4uNzdhMzQzYiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMKQEAgLTE5LDkzICsxOSwxNDcgQEAKIHVuaXQgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlczsKIAogeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9Cit7JEkgVGhyaWZ0LkRlZmluZXMuaW5jfQogCiBpbnRlcmZhY2UKIAogdXNlcwotICBXaW5kb3dzLCBTeXNVdGlscywgTWF0aCwgQWNjQ3RybCwgQWNsQVBJLAorICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICBXaW5kb3dzLCBTeXNVdGlscywgTWF0aCwgQWNjQ3RybCwgQWNsQVBJLCBTeW5jT2JqcywKKyAgeyRFTFNFfQorICBXaW5hcGkuV2luZG93cywgU3lzdGVtLlN5c1V0aWxzLCBTeXN0ZW0uTWF0aCwgV2luYXBpLkFjY0N0cmwsIFdpbmFwaS5BY2xBUEksIFN5c3RlbS5TeW5jT2JqcywKKyAgeyRFTkRJRn0KICAgVGhyaWZ0LlRyYW5zcG9ydCwKLSAgVGhyaWZ0LkNvbnNvbGUsCisgIFRocmlmdC5VdGlscywKICAgVGhyaWZ0LlN0cmVhbTsKIAogY29uc3QKLSAgREVGQVVMVF9USFJJRlRfUElQRV9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCisgIERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUID0gMTA7ICAvLyBkZWZhdWx0OiBmYWlsIGZhc3Qgb24gb3BlbgogCiAKIHR5cGUKLSAgSVBpcGUgPSBpbnRlcmZhY2UoIElTdHJlYW1UcmFuc3BvcnQpCi0gICAgWyd7NUUwNUNDODUtNDM0Ri00MjhGLUJGQjItODU2QTE2OEI1NTU4fSddCi0gIGVuZDsKKyAgLy8tLS0gUGlwZSBTdHJlYW1zIC0tLQogCiAKLSAgVFBpcGVTdHJlYW1JbXBsID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQotICBwcml2YXRlCi0gICAgRlBpcGUgOiBUSGFuZGxlOwotICAgIEZPd25lciA6IEJvb2xlYW47Ci0gICAgRlBpcGVOYW1lIDogc3RyaW5nOworICBUUGlwZVN0cmVhbUJhc2UgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwpCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBGUGlwZSAgICA6IFRIYW5kbGU7CiAgICAgRlRpbWVvdXQgOiBEV09SRDsKLSAgICBGU2hhcmVNb2RlOiBEV09SRDsKLSAgICBGU2VjdXJpdHlBdHRyaWJzIDogUFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICBGT3BlblRpbWVPdXQgOiBEV09SRDsgIC8vIHNlcGFyYXRlIHZhbHVlIHRvIGFsbG93IGZvciBmYWlsLWZhc3Qtb24tb3BlbiBzY2VuYXJpb3MKKyAgICBGT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAKLSAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICAvL3Byb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsgLSBzZWUgZGVyaXZlZCBjbGFzc2VzCiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwogCisgICAgZnVuY3Rpb24gIFJlYWREaXJlY3QoICAgICBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiAgUmVhZE92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZURpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZU92ZXJsYXBwZWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworCiAgICAgZnVuY3Rpb24gSXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlSGFuZGxlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuKTsgIG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNoYXJlTW9kZTogRFdPUkQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlcyA9IG5pbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9QSVBFX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOwogICBlbmQ7CiAKIAotICBUTmFtZWRQaXBlSW1wbCA9IGNsYXNzKCBUU3RyZWFtVHJhbnNwb3J0SW1wbCwgSVBpcGUpCi0gIHB1YmxpYwotICAgIEZPd25lciA6IEJvb2xlYW47CisgIFROYW1lZFBpcGVTdHJlYW1JbXBsID0gY2xhc3Mgc2VhbGVkKCBUUGlwZVN0cmVhbUJhc2UpCisgIHN0cmljdCBwcml2YXRlCisgICAgRlBpcGVOYW1lICA6IHN0cmluZzsKKyAgICBGU2hhcmVNb2RlIDogRFdPUkQ7CisgICAgRlNlY3VyaXR5QXR0cmlicyA6IFBTZWN1cml0eUF0dHJpYnV0ZXM7CiAKLSAgICAvLyBDb25zdHJ1Y3RzIGEgbmV3IHBpcGUgb2JqZWN0LgotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgpOyBvdmVybG9hZDsKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcGVuVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9PUEVOX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgIGVuZDsKKworCisgIFRIYW5kbGVQaXBlU3RyZWFtSW1wbCA9IGNsYXNzIHNlYWxlZCggVFBpcGVTdHJlYW1CYXNlKQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZTcmNIYW5kbGUgOiBUSGFuZGxlOworCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CisKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZUhhbmRsZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3duc0hhbmRsZSwgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOyAgb3ZlcmxvYWQ7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIC8vLS0tIFBpcGUgVHJhbnNwb3J0cyAtLS0KKworCisgIElQaXBlVHJhbnNwb3J0ID0gaW50ZXJmYWNlKCBJU3RyZWFtVHJhbnNwb3J0KQorICAgIFsnezVFMDVDQzg1LTQzNEYtNDI4Ri1CRkIyLTg1NkExNjhCNTU1OH0nXQorICBlbmQ7CisKKworICBUUGlwZVRyYW5zcG9ydEJhc2UgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwsIElQaXBlVHJhbnNwb3J0KQorICBwdWJsaWMKKyAgICAvLyBJVHJhbnNwb3J0CisgICAgZnVuY3Rpb24gIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsID0gY2xhc3MoIFRQaXBlVHJhbnNwb3J0QmFzZSkKKyAgcHVibGljCiAgICAgLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcnMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXMgPSBuaWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfUElQRV9USU1FT1VUKTsgIG92ZXJsb2FkOwotCi0gICAgLy8gSVRyYW5zcG9ydAotICAgIGZ1bmN0aW9uICBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3BlblRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1BJUEVfT1BFTl9USU1FT1VUKTsgIG92ZXJsb2FkOwogICBlbmQ7CiAKIAotICBUQW5vbnltb3VzUGlwZUltcGwgPSBjbGFzcyggVFN0cmVhbVRyYW5zcG9ydEltcGwsIElQaXBlKQorICBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbCA9IGNsYXNzKCBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbCkKKyAgc3RyaWN0IHByaXZhdGUKKyAgICBGSGFuZGxlIDogVEhhbmRsZTsKICAgcHVibGljCi0gICAgRk93bmVyIDogQm9vbGVhbjsKLQotICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgcGlwZSBvYmplY3QuCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCk7IG92ZXJsb2FkOwotICAgIC8vIEFub255bW91cyBwaXBlIGNvbnN0cnVjdG9yCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZXMgOiBCb29sZWFuKTsgb3ZlcmxvYWQ7Ci0KICAgICAvLyBJVHJhbnNwb3J0Ci0gICAgZnVuY3Rpb24gIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBhUGlwZSA6IFRIYW5kbGU7IGFPd25zSGFuZGxlIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUKTsgcmVpbnRyb2R1Y2U7CiAgIGVuZDsKIAogCi0gIElQaXBlU2VydmVyID0gaW50ZXJmYWNlKCBJU2VydmVyVHJhbnNwb3J0KQorICBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVUcmFuc3BvcnRCYXNlKQorICBwdWJsaWMKKyAgICAvLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgorICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBhUGlwZVJlYWQsIGFQaXBlV3JpdGUgOiBUSGFuZGxlOworICAgICAgICAgICAgICAgICAgICAgICBhT3duc0hhbmRsZXMgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7IG92ZXJsb2FkOworICBlbmQ7CisKKworICAvLy0tLSBTZXJ2ZXIgVHJhbnNwb3J0cyAtLS0KKworCisgIElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0ID0gaW50ZXJmYWNlKCBJU2VydmVyVHJhbnNwb3J0KQogICAgIFsnezdBRUU2NzkzLTQ3QjktNEU0OS05ODFBLUMzOUU5MTA4RTlBRH0nXQogICAgIC8vIFNlcnZlciBzaWRlIGFub255bW91cyBwaXBlIGVuZHMKLSAgICBmdW5jdGlvbiBIYW5kbGUgOiBUSGFuZGxlOworICAgIGZ1bmN0aW9uIFJlYWRIYW5kbGUgOiBUSGFuZGxlOwogICAgIGZ1bmN0aW9uIFdyaXRlSGFuZGxlIDogVEhhbmRsZTsKICAgICAvLyBDbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBlbmRzCiAgICAgZnVuY3Rpb24gQ2xpZW50QW5vblJlYWQgOiBUSGFuZGxlOwpAQCAtMTEzLDg1ICsxNjcsMTIyIEBACiAgIGVuZDsKIAogCi0gIFRTZXJ2ZXJQaXBlSW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCwgSVBpcGVTZXJ2ZXIpCi0gIHByaXZhdGUKLSAgICBGUGlwZU5hbWUgICAgIDogc3RyaW5nOwotICAgIEZNYXhDb25ucyAgICAgOiBEV09SRDsKLSAgICBGQnVmU2l6ZSAgICAgIDogRFdPUkQ7Ci0gICAgRkFub255bW91cyAgICA6IEJvb2xlYW47CisgIElOYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElTZXJ2ZXJUcmFuc3BvcnQpCisgICAgWyd7OURGOUVFNDgtRDA2NS00MEFGLThGNjctRDMzMDM3RDNEOTYwfSddCisgICAgZnVuY3Rpb24gSGFuZGxlIDogVEhhbmRsZTsKKyAgZW5kOwogCi0gICAgRkhhbmRsZSwKKworICBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UgPSBjbGFzcyggVFNlcnZlclRyYW5zcG9ydEltcGwpCisgIHN0cmljdCBwcm90ZWN0ZWQKKyAgICBGU3RvcFNlcnZlciA6IFRFdmVudDsKKyAgICBwcm9jZWR1cmUgSW50ZXJuYWxDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUXVlcnlTdG9wU2VydmVyIDogQm9vbGVhbjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBMaXN0ZW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIFRBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UsIElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZCdWZTaXplICAgICAgOiBEV09SRDsKKworICAgIC8vIFNlcnZlciBzaWRlIGFub255bW91cyBwaXBlIGhhbmRsZXMKKyAgICBGUmVhZEhhbmRsZSwKICAgICBGV3JpdGVIYW5kbGUgOiBUSGFuZGxlOwogCiAgICAgLy9DbGllbnQgc2lkZSBhbm9ueW1vdXMgcGlwZSBoYW5kbGVzCiAgICAgRkNsaWVudEFub25SZWFkLAogICAgIEZDbGllbnRBbm9uV3JpdGUgIDogVEhhbmRsZTsKIAorICAgIEZUaW1lT3V0OiBEV09SRDsKICAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gQWNjZXB0SW1wbDogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOwogCi0gICAgZnVuY3Rpb24gQ3JlYXRlTmFtZWRQaXBlIDogQm9vbGVhbjsKICAgICBmdW5jdGlvbiBDcmVhdGVBbm9uUGlwZSA6IEJvb2xlYW47CiAKLSAgICAvLyBJUGlwZVNlcnZlcgotICAgIGZ1bmN0aW9uIEhhbmRsZSA6IFRIYW5kbGU7CisgICAgLy8gSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQKKyAgICBmdW5jdGlvbiBSZWFkSGFuZGxlIDogVEhhbmRsZTsKICAgICBmdW5jdGlvbiBXcml0ZUhhbmRsZSA6IFRIYW5kbGU7CiAgICAgZnVuY3Rpb24gQ2xpZW50QW5vblJlYWQgOiBUSGFuZGxlOwogICAgIGZ1bmN0aW9uIENsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOwogCi0gIHB1YmxpYwotICAgIC8vIENvbnN0cnVjdG9ycwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSgpOyAgb3ZlcmxvYWQ7Ci0gICAgLy8gTmFtZWQgUGlwZQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nKTsgIG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSA6IENhcmRpbmFsKTsgIG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSwgYU1heENvbm5zIDogQ2FyZGluYWwpOyAgb3ZlcmxvYWQ7Ci0gICAgLy8gQW5vbnltb3VzIHBpcGUKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGFCdWZzaXplIDogQ2FyZGluYWwpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IG92ZXJyaWRlOwogCi0gICAgcHJvY2VkdXJlIExpc3Rlbjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWwgPSA0MDk2OyBhVGltZU91dCA6IERXT1JEID0gREVGQVVMVF9USFJJRlRfVElNRU9VVCk7CiAgIGVuZDsKIAogCi1jb25zdAotICBUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQgPSAxMDsKKyAgVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLCBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KQorICBzdHJpY3QgcHJpdmF0ZQorICAgIEZQaXBlTmFtZSAgICAgOiBzdHJpbmc7CisgICAgRk1heENvbm5zICAgICA6IERXT1JEOworICAgIEZCdWZTaXplICAgICAgOiBEV09SRDsKKyAgICBGVGltZW91dCAgICAgIDogRFdPUkQ7CisgICAgRkhhbmRsZSAgICAgICA6IFRIYW5kbGU7CisgICAgRkNvbm5lY3RlZCAgICA6IEJvb2xlYW47CisKKworICBzdHJpY3QgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIENyZWF0ZU5hbWVkUGlwZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gQ3JlYXRlVHJhbnNwb3J0SW5zdGFuY2UgOiBJVHJhbnNwb3J0OworCisgICAgLy8gSU5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydAorICAgIGZ1bmN0aW9uIEhhbmRsZSA6IFRIYW5kbGU7CisgICAgcHJvY2VkdXJlIEludGVybmFsQ2xvc2U7IG92ZXJyaWRlOworCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSA6IENhcmRpbmFsID0gNDA5NjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFNYXhDb25ucyA6IENhcmRpbmFsID0gUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTOworICAgICAgICAgICAgICAgICAgICAgICAgYVRpbWVPdXQgOiBDYXJkaW5hbCA9IElORklOSVRFKTsKKyAgZW5kOwogCiAKIGltcGxlbWVudGF0aW9uCiAKIAoteyBUUGlwZVN0cmVhbUltcGwgfQotCi0KLWNvbnN0cnVjdG9yIFRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlSGFuZGxlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuKTsKK3Byb2NlZHVyZSBDbG9zZVBpcGVIYW5kbGUoIHZhciBoUGlwZSA6IFRIYW5kbGUpOwogYmVnaW4KLSAgRlBpcGUgICAgICAgICAgICA6PSBhUGlwZUhhbmRsZTsKLSAgRk93bmVyICAgICAgICAgICA6PSBhT3duc0hhbmRsZTsKLSAgRlBpcGVOYW1lICAgICAgICA6PSAnJzsKLSAgRlRpbWVvdXQgICAgICAgICA6PSBERUZBVUxUX1RIUklGVF9QSVBFX1RJTUVPVVQ7Ci0gIEZTaGFyZU1vZGUgICAgICAgOj0gMDsKLSAgRlNlY3VyaXR5QXR0cmlicyA6PSBuaWw7CisgIGlmIGhQaXBlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFCisgIHRoZW4gdHJ5CisgICAgQ2xvc2VIYW5kbGUoIGhQaXBlKTsKKyAgZmluYWxseQorICAgIGhQaXBlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBlbmQ7CiBlbmQ7CiAKIAotY29uc3RydWN0b3IgVFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOyBjb25zdCBhU2hhcmVNb2RlOiBEV09SRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTZWN1cml0eUF0dHJpYnV0ZXM6IFBTZWN1cml0eUF0dHJpYnV0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKK2Z1bmN0aW9uIER1cGxpY2F0ZVBpcGVIYW5kbGUoIGNvbnN0IGhTb3VyY2UgOiBUSGFuZGxlKSA6IFRIYW5kbGU7CiBiZWdpbgotICBGUGlwZSAgICAgICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBGT3duZXIgICAgICAgICAgIDo9IFRSVUU7Ci0gIEZQaXBlTmFtZSAgICAgICAgOj0gYVBpcGVOYW1lOwotICBGVGltZW91dCAgICAgICAgIDo9IGFUaW1lT3V0OwotICBGU2hhcmVNb2RlICAgICAgIDo9IGFTaGFyZU1vZGU7Ci0gIEZTZWN1cml0eUF0dHJpYnMgOj0gYVNlY3VyaXR5QXR0cmlidXRlczsKLQotICBpZiBDb3B5KEZQaXBlTmFtZSwxLDIpIDw+ICdcXCcKLSAgdGhlbiBGUGlwZU5hbWUgOj0gJ1xcLlxwaXBlXCcgKyBGUGlwZU5hbWU7ICAvLyBhc3N1bWUgbG9jYWxob3N0CisgIGlmIG5vdCBEdXBsaWNhdGVIYW5kbGUoIEdldEN1cnJlbnRQcm9jZXNzLCBoU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcywgQHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgRkFMU0UsIERVUExJQ0FURV9TQU1FX0FDQ0VTUykKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0R1cGxpY2F0ZUhhbmRsZTogJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CiBlbmQ7CiAKIAotZGVzdHJ1Y3RvciBUUGlwZVN0cmVhbUltcGwuRGVzdHJveTsKKworeyBUUGlwZVN0cmVhbUJhc2UgfQorCisKK2NvbnN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5DcmVhdGUoIGFFbmFibGVPdmVybGFwcGVkIDogQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0LCBhT3BlblRpbWVPdXQgOiBEV09SRCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBBU1NFUlQoIGFUaW1lb3V0ID4gMCk7ICAvLyBhT3BlblRpbWVvdXQgbWF5IGJlIDAKKyAgRlBpcGUgICAgICAgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBGVGltZW91dCAgICAgOj0gYVRpbWVPdXQ7CisgIEZPcGVuVGltZU91dCA6PSBhT3BlblRpbWVPdXQ7CisgIEZPdmVybGFwcGVkICA6PSBhRW5hYmxlT3ZlcmxhcHBlZDsKK2VuZDsKKworCitkZXN0cnVjdG9yIFRQaXBlU3RyZWFtQmFzZS5EZXN0cm95OwogYmVnaW4KICAgdHJ5CiAgICAgQ2xvc2U7CkBAIC0yMDEsOTQgKzI5MiwxMjAgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFBpcGVTdHJlYW1JbXBsLkNsb3NlOworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5DbG9zZTsKIGJlZ2luCi0gIGlmIElzT3BlbiB0aGVuIHRyeQotICAgIGlmIEZPd25lcgotICAgIHRoZW4gQ2xvc2VIYW5kbGUoIEZQaXBlKTsKLSAgZmluYWxseQotICAgIEZQaXBlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBlbmQ7CisgIENsb3NlUGlwZUhhbmRsZSggRlBpcGUpOwogZW5kOwogCiAKLXByb2NlZHVyZSBUUGlwZVN0cmVhbUltcGwuRmx1c2g7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLkZsdXNoOwogYmVnaW4KLSAgLy8gbm90aGluZyB0byBkbworICBGbHVzaEZpbGVCdWZmZXJzKCBGUGlwZSk7CiBlbmQ7CiAKIAotZnVuY3Rpb24gVFBpcGVTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5Jc09wZW46IEJvb2xlYW47CiBiZWdpbgogICByZXN1bHQgOj0gKEZQaXBlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFKTsKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFBpcGVTdHJlYW1JbXBsLk9wZW47Ci12YXIgcmV0cmllcyAgOiBJbnRlZ2VyOwotICAgIGhQaXBlICAgIDogVEhhbmRsZTsKLSAgICBkd01vZGUgICA6IERXT1JEOwotY29uc3QgSU5URVJWQUwgPSA1MDA7IC8vIG1zCitwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudCA6IEludGVnZXIpOwogYmVnaW4KLSAgaWYgSXNPcGVuIHRoZW4gRXhpdDsKLQotICAvLyBvcGVuIHRoYXQgdGhpbmd5Ci0gIHJldHJpZXMgIDo9IE1heCggMSwgUm91bmQoIDEuMCAqIEZUaW1lb3V0IC8gSU5URVJWQUwpKTsKLSAgaFBpcGUgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gIHdoaWxlIFRSVUUgZG8gYmVnaW4KLSAgICBoUGlwZSA6PSBDcmVhdGVGaWxlKCBQQ2hhciggRlBpcGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUQgb3IgR0VORVJJQ19XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGU2hhcmVNb2RlLCAgICAgICAgLy8gc2hhcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgIEZTZWN1cml0eUF0dHJpYnMsICAvLyBzZWN1cml0eSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgT1BFTl9FWElTVElORywgICAgIC8vIG9wZW5zIGV4aXN0aW5nIHBpcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgIC8vIG5vIHRlbXBsYXRlIGZpbGUKLQotICAgIGlmIGhQaXBlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFCi0gICAgdGhlbiBCcmVhazsKLQotICAgIERlYyggcmV0cmllcyk7Ci0gICAgaWYgKHJldHJpZXMgPiAwKSBvciAoRlRpbWVvdXQgPSBJTkZJTklURSkKLSAgICB0aGVuIFNsZWVwKCBJTlRFUlZBTCkKLSAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBvcGVuIHBpcGUnKTsKLSAgZW5kOwotCi0gIC8vIHBpcGUgY29ubmVjdGVkOyBjaGFuZ2UgdG8gbWVzc2FnZS1yZWFkIG1vZGUuCi0gIGR3TW9kZSA6PSBQSVBFX1JFQURNT0RFX01FU1NBR0U7Ci0gIGlmIG5vdCBTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSggaFBpcGUsIGR3TW9kZSwgbmlsLCBuaWwpIHRoZW4gYmVnaW4KLSAgICBDbG9zZTsKLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUgZmFpbGVkJyk7Ci0gIGVuZDsKLQotICAvLyBldmVyeXRoaW5nIGZpbmUKLSAgRlBpcGUgOj0gaFBpcGU7CisgIGlmIEZPdmVybGFwcGVkCisgIHRoZW4gV3JpdGVPdmVybGFwcGVkKCBwQnVmLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIFdyaXRlRGlyZWN0KCBwQnVmLCBvZmZzZXQsIGNvdW50KTsKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFBpcGVTdHJlYW1JbXBsLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKLXZhciBjYldyaXR0ZW4gOiBEV09SRDsKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBGT3ZlcmxhcHBlZAorICB0aGVuIHJlc3VsdCA6PSBSZWFkT3ZlcmxhcHBlZCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIHJlc3VsdCA6PSBSZWFkRGlyZWN0KCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpOworZW5kOworCisKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGVEaXJlY3QoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBjYldyaXR0ZW4sIG5CeXRlcyA6IERXT1JEOworICAgIHBEYXRhIDogUEJ5dGU7CiBiZWdpbgogICBpZiBub3QgSXNPcGVuCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlJyk7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOwogCi0gIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBidWZmZXJbb2Zmc2V0XSwgY291bnQsIGNiV3JpdHRlbiwgbmlsKQotICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdXcml0ZSB0byBwaXBlIGZhaWxlZCcpOworICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgbkJ5dGVzIDo9IE1pbiggMTUqNDA5NiwgY291bnQpOyAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgIHBEYXRhICA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuQnl0ZXMgPiAwIGRvIGJlZ2luCisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG5pbCkKKyAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV3JpdGUgdG8gcGlwZSBmYWlsZWQnKTsKKworICAgIEluYyggcERhdGEsIGNiV3JpdHRlbik7CisgICAgRGVjKCBjb3VudCwgY2JXcml0dGVuKTsKKyAgICBuQnl0ZXMgOj0gTWluKCBuQnl0ZXMsIGNvdW50KTsKKyAgZW5kOwogZW5kOwogCiAKLWZ1bmN0aW9uIFRQaXBlU3RyZWFtSW1wbC5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwotdmFyIGNiUmVhZCAgOiBEV09SRDsKK3Byb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGVPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgY2JXcml0dGVuLCBkd1dhaXQsIGR3RXJyb3IsIG5CeXRlcyA6IERXT1JEOworICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBwRGF0YSA6IFBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHdyaXRlIG9uIG5vbi1vcGVuIHBpcGUnKTsKKworICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgbkJ5dGVzIDo9IE1pbiggMTUqNDA5NiwgY291bnQpOyAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgIHBEYXRhICA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuQnl0ZXMgPiAwIGRvIGJlZ2luCisgICAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOworICAgIGlmIG5vdCBXcml0ZUZpbGUoIEZQaXBlLCBwRGF0YV4sIG5CeXRlcywgY2JXcml0dGVuLCBvdmVybGFwcGVkLk92ZXJsYXBwZWRQdHIpCisgICAgdGhlbiBiZWdpbgorICAgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgICBjYXNlIGR3RXJyb3Igb2YKKyAgICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgICAgZHdXYWl0IDo9IG92ZXJsYXBwZWQuV2FpdEZvcihGVGltZW91dCk7CisKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSB3cml0ZSB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBlbmQ7CisKKyAgICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiV3JpdHRlbiwgVFJVRSkKKyAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnUGlwZSB3cml0ZSBlcnJvcicpOworICAgICAgICBlbmQ7CisKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShkd0Vycm9yKSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgQVNTRVJUKCBEV09SRChuQnl0ZXMpID0gY2JXcml0dGVuKTsKKworICAgIEluYyggcERhdGEsIGNiV3JpdHRlbik7CisgICAgRGVjKCBjb3VudCwgY2JXcml0dGVuKTsKKyAgICBuQnl0ZXMgOj0gTWluKCBuQnl0ZXMsIGNvdW50KTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIGNiUmVhZCwgZHdFcnIsIG5SZW1haW5pbmcgIDogRFdPUkQ7CiAgICAgYnl0ZXMsIHJldHJpZXMgIDogTG9uZ0ludDsKICAgICBiT2sgICAgIDogQm9vbGVhbjsKKyAgICBwRGF0YSAgIDogUEJ5dGU7CiBjb25zdCBJTlRFUlZBTCA9IDEwOyAgLy8gbXMKIGJlZ2luCiAgIGlmIG5vdCBJc09wZW4KLSAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOworICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOwogCiAgIC8vIE1TRE46IEhhbmRsZSBjYW4gYmUgYSBoYW5kbGUgdG8gYSBuYW1lZCBwaXBlIGluc3RhbmNlLAogICAvLyBvciBpdCBjYW4gYmUgYSBoYW5kbGUgdG8gdGhlIHJlYWQgZW5kIG9mIGFuIGFub255bW91cyBwaXBlLApAQCAtMjk2LDI4ICs0MTMsOTMgQEAKICAgaWYgRlRpbWVPdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgogICAgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRlRpbWVPdXQgLyBJTlRFUlZBTCkpOwogICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KLSAgICAgIGlmICBJc09wZW4KLSAgICAgIGFuZCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKQotICAgICAgYW5kIChieXRlcyA+IDApCi0gICAgICB0aGVuIEJyZWFrOyAgLy8gdGhlcmUgYXJlIGRhdGEKKyAgICAgIGlmIG5vdCBQZWVrTmFtZWRQaXBlKCBGUGlwZSwgbmlsLCAwLCBuaWwsIEBieXRlcywgbmlsKSB0aGVuIGJlZ2luCisgICAgICAgIGR3RXJyIDo9IEdldExhc3RFcnJvcjsKKyAgICAgICAgaWYgKGR3RXJyID0gRVJST1JfSU5WQUxJRF9IQU5ETEUpCisgICAgICAgIG9yIChkd0VyciA9IEVSUk9SX0JST0tFTl9QSVBFKQorICAgICAgICBvciAoZHdFcnIgPSBFUlJPUl9QSVBFX05PVF9DT05ORUNURUQpCisgICAgICAgIHRoZW4gYmVnaW4KKyAgICAgICAgICByZXN1bHQgOj0gMDsgIC8vIG90aGVyIHNpZGUgY2xvc2VkIHRoZSBwaXBlCisgICAgICAgICAgRXhpdDsKKyAgICAgICAgZW5kOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIGJ5dGVzID4gMCB0aGVuIGJlZ2luCisgICAgICAgIEJyZWFrOyAgLy8gdGhlcmUgYXJlIGRhdGEKKyAgICAgIGVuZDsKIAogICAgICAgRGVjKCByZXRyaWVzKTsKICAgICAgIGlmIHJldHJpZXMgPiAwCiAgICAgICB0aGVuIFNsZWVwKCBJTlRFUlZBTCkKLSAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuVGltZWRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgICAgZWxzZSByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CiAgICAgZW5kOwogICBlbmQ7CiAKLSAgLy8gcmVhZCB0aGUgZGF0YSAob3IgYmxvY2sgSU5GSU5JVEUtbHkpCi0gIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgY2JSZWFkLCBuaWwpOwotICBpZiAobm90IGJPaykgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCi0gIHRoZW4gcmVzdWx0IDo9IDAgLy8gTm8gbW9yZSBkYXRhLCBwb3NzaWJseSBiZWNhdXNlIGNsaWVudCBkaXNjb25uZWN0ZWQuCi0gIGVsc2UgcmVzdWx0IDo9IGNiUmVhZDsKKyAgcmVzdWx0IDo9IDA7CisgIG5SZW1haW5pbmcgOj0gY291bnQ7CisgIHBEYXRhIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5SZW1haW5pbmcgPiAwIGRvIGJlZ2luCisgICAgLy8gcmVhZCB0aGUgZGF0YSAob3IgYmxvY2sgSU5GSU5JVEUtbHkpCisgICAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgcERhdGFeLCBuUmVtYWluaW5nLCBjYlJlYWQsIG5pbCk7CisgICAgaWYgKG5vdCBiT2spIGFuZCAoR2V0TGFzdEVycm9yKCkgPD4gRVJST1JfTU9SRV9EQVRBKQorICAgIHRoZW4gQnJlYWs7IC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgorCisgICAgRGVjKCBuUmVtYWluaW5nLCBjYlJlYWQpOworICAgIEluYyggcERhdGEsIGNiUmVhZCk7CisgICAgSW5jKCByZXN1bHQsIGNiUmVhZCk7CisgIGVuZDsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWRPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd1dhaXQsIGR3RXJyb3IsIG5SZW1haW5pbmcgOiBEV09SRDsKKyAgICBiT2sgICAgIDogQm9vbGVhbjsKKyAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7CisgICAgcERhdGEgICA6IFBCeXRlOworYmVnaW4KKyAgaWYgbm90IElzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOworCisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKworICAgICAvLyByZWFkIHRoZSBkYXRhCisgICAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgcERhdGFeLCBuUmVtYWluaW5nLCBjYlJlYWQsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cik7CisgICAgaWYgbm90IGJPayB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKKworICAgICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpIHRoZW4gYmVnaW4KKyAgICAgICAgICAgIENhbmNlbElvKCBGUGlwZSk7ICAvLyBwcmV2ZW50cyBwb3NzaWJsZSBBViBvbiBpbnZhbGlkIG92ZXJsYXBwZWQgcHRyCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCdQaXBlIHJlYWQgdGltZWQgb3V0Jyk7CisgICAgICAgICAgZW5kOworCisgICAgICAgICAgaWYgKGR3V2FpdCA8PiBXQUlUX09CSkVDVF8wKQorICAgICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYlJlYWQsIFRSVUUpCisgICAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1BpcGUgcmVhZCBlcnJvcicpOworICAgICAgICBlbmQ7CisKKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShkd0Vycm9yKSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgQVNTRVJUKCBjYlJlYWQgPiAwKTsgIC8vIHNlZSBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKCkKKyAgICBBU1NFUlQoIGNiUmVhZCA8PSBEV09SRChuUmVtYWluaW5nKSk7CisgICAgRGVjKCBuUmVtYWluaW5nLCBjYlJlYWQpOworICAgIEluYyggcERhdGEsIGNiUmVhZCk7CisgICAgSW5jKCByZXN1bHQsIGNiUmVhZCk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuVG9BcnJheTogVEJ5dGVzOwogdmFyIGJ5dGVzIDogTG9uZ0ludDsKIGJlZ2luCiAgIFNldExlbmd0aCggcmVzdWx0LCAwKTsKQEAgLTMzMywzNzMgKzUxNSw1MjUgQEAKIGVuZDsKIAogCi17IFROYW1lZFBpcGVJbXBsIH0KK3sgVE5hbWVkUGlwZVN0cmVhbUltcGwgfQogCiAKLWNvbnN0cnVjdG9yIFROYW1lZFBpcGVJbXBsLkNyZWF0ZSgpOwotLy8gQ29uc3RydWN0cyBhIG5ldyBwaXBlIG9iamVjdCAvIHByb3ZpZGVzIGRlZmF1bHRzCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlTmFtZSA6IHN0cmluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2hhcmVNb2RlOiBEV09SRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKLSAgRk93bmVyIDo9IEZBTFNFOwotZW5kOworICBpbmhlcml0ZWQgQ3JlYXRlKCBhRW5hYmxlT3ZlcmxhcHBlZCwgYVRpbWVvdXQsIGFPcGVuVGltZU91dCk7CiAKLQotY29uc3RydWN0b3IgVE5hbWVkUGlwZUltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZU5hbWUgOiBzdHJpbmc7IGNvbnN0IGFTaGFyZU1vZGU6IERXT1JEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhU2VjdXJpdHlBdHRyaWJ1dGVzOiBQU2VjdXJpdHlBdHRyaWJ1dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKLS8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKLWJlZ2luCi0gIENyZWF0ZSgpOwotICBGSW5wdXRTdHJlYW0gIDo9IFRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlTmFtZSwgYVNoYXJlTW9kZSwgYVNlY3VyaXR5QXR0cmlidXRlcywgYVRpbWVPdXQpOwotICBGT3V0cHV0U3RyZWFtIDo9IEZJbnB1dFN0cmVhbTsgIC8vIHRydWUgZm9yIG5hbWVkIHBpcGVzCi0gIEZPd25lciAgICAgICAgOj0gVFJVRTsKLWVuZDsKLQotCi1jb25zdHJ1Y3RvciBUTmFtZWRQaXBlSW1wbC5DcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuKTsKLS8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKLWJlZ2luCi0gIENyZWF0ZSgpOwotICBGSW5wdXRTdHJlYW0gIDo9IFRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlLCBhT3duc0hhbmRsZSk7Ci0gIEZPdXRwdXRTdHJlYW0gOj0gRklucHV0U3RyZWFtOyAgLy8gdHJ1ZSBmb3IgbmFtZWQgcGlwZXMKLSAgRk93bmVyICAgICAgICA6PSBhT3duc0hhbmRsZTsKLWVuZDsKLQotCi1mdW5jdGlvbiBUTmFtZWRQaXBlSW1wbC5HZXRJc09wZW46IEJvb2xlYW47Ci1iZWdpbgotICByZXN1bHQgOj0gKEZJbnB1dFN0cmVhbSA8PiBuaWwpOwotZW5kOwotCi0KLXByb2NlZHVyZSBUTmFtZWRQaXBlSW1wbC5PcGVuOwotYmVnaW4KLSAgaWYgRk93bmVyIHRoZW4gYmVnaW4KLSAgICBGSW5wdXRTdHJlYW0uT3BlbjsKLSAgICBpZiAoRk91dHB1dFN0cmVhbSA8PiBuaWwpIGFuZCAoRk91dHB1dFN0cmVhbSA8PiBGSW5wdXRTdHJlYW0pCi0gICAgdGhlbiBGT3V0cHV0U3RyZWFtLk9wZW47Ci0gIGVuZDsKLWVuZDsKLQotCi1wcm9jZWR1cmUgVE5hbWVkUGlwZUltcGwuQ2xvc2U7Ci1iZWdpbgotICBpZiBGT3duZXIgdGhlbiBiZWdpbgotICAgIEZJbnB1dFN0cmVhbS5DbG9zZTsKLSAgICBpZiAoRk91dHB1dFN0cmVhbSA8PiBuaWwpIGFuZCAoRk91dHB1dFN0cmVhbSA8PiBGSW5wdXRTdHJlYW0pCi0gICAgdGhlbiBGT3V0cHV0U3RyZWFtLkNsb3NlOwotICBlbmQ7Ci1lbmQ7Ci0KLQoteyBUQW5vbnltb3VzUGlwZUltcGwgfQotCi0KLWNvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlSW1wbC5DcmVhdGUoKTsKLS8vIENvbnN0cnVjdHMgYSBuZXcgcGlwZSBvYmplY3QgLyBwcm92aWRlcyBkZWZhdWx0cwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSggbmlsLCBuaWwpOwotICBGT3duZXIgOj0gRkFMU0U7Ci1lbmQ7Ci0KLQotY29uc3RydWN0b3IgVEFub255bW91c1BpcGVJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVSZWFkLCBhUGlwZVdyaXRlIDogVEhhbmRsZTsgYU93bnNIYW5kbGVzIDogQm9vbGVhbik7Ci0vLyBBbm9ueW1vdXMgcGlwZSBjb25zdHJ1Y3RvcgotYmVnaW4KLSAgQ3JlYXRlKCk7Ci0gIEZJbnB1dFN0cmVhbSAgOj0gVFBpcGVTdHJlYW1JbXBsLkNyZWF0ZSggYVBpcGVSZWFkLCBhT3duc0hhbmRsZXMpOwotICBGT3V0cHV0U3RyZWFtIDo9IFRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlV3JpdGUsIGFPd25zSGFuZGxlcyk7Ci0gIEZPd25lciAgICAgICAgOj0gYU93bnNIYW5kbGVzOwotZW5kOwotCi0KLWZ1bmN0aW9uIFRBbm9ueW1vdXNQaXBlSW1wbC5HZXRJc09wZW46IEJvb2xlYW47Ci1iZWdpbgotICByZXN1bHQgOj0gKEZJbnB1dFN0cmVhbSA8PiBuaWwpIG9yIChGT3V0cHV0U3RyZWFtIDw+IG5pbCk7Ci1lbmQ7Ci0KLQotcHJvY2VkdXJlIFRBbm9ueW1vdXNQaXBlSW1wbC5PcGVuOwotYmVnaW4KLSAgaWYgRk93bmVyIHRoZW4gYmVnaW4KLSAgICBGSW5wdXRTdHJlYW0uT3BlbjsKLSAgICBpZiAoRk91dHB1dFN0cmVhbSA8PiBuaWwpIGFuZCAoRk91dHB1dFN0cmVhbSA8PiBGSW5wdXRTdHJlYW0pCi0gICAgdGhlbiBGT3V0cHV0U3RyZWFtLk9wZW47Ci0gIGVuZDsKLWVuZDsKLQotCi1wcm9jZWR1cmUgVEFub255bW91c1BpcGVJbXBsLkNsb3NlOwotYmVnaW4KLSAgaWYgRk93bmVyIHRoZW4gYmVnaW4KLSAgICBGSW5wdXRTdHJlYW0uQ2xvc2U7Ci0gICAgaWYgKEZPdXRwdXRTdHJlYW0gPD4gbmlsKSBhbmQgKEZPdXRwdXRTdHJlYW0gPD4gRklucHV0U3RyZWFtKQotICAgIHRoZW4gRk91dHB1dFN0cmVhbS5DbG9zZTsKLSAgZW5kOwotZW5kOwotCi0KLXsgVFNlcnZlclBpcGVJbXBsIH0KLQotCi1jb25zdHJ1Y3RvciBUU2VydmVyUGlwZUltcGwuQ3JlYXRlKCBhUGlwZW5hbWUgOiBzdHJpbmc7IGFCdWZzaXplLCBhTWF4Q29ubnMgOiBDYXJkaW5hbCk7Ci0vLyBOYW1lZCBQaXBlIENUT1IKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZQaXBlTmFtZSA6PSBhUGlwZW5hbWU7Ci0gIEZCdWZzaXplICA6PSBhQnVmU2l6ZTsKLSAgRk1heENvbm5zIDo9IE1heCggMSwgTWluKCAyNTUsIGFNYXhDb25ucykpOyAgLy8gcmVzdHJpY3QgdG8gMS0yNTUgY29ubmVjdGlvbnMKLSAgRkFub255bW91cyA6PSBGQUxTRTsKLSAgRkhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgRldyaXRlSGFuZGxlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICBGQ2xpZW50QW5vblJlYWQgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gIEZDbGllbnRBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZQaXBlTmFtZSAgICAgICAgOj0gYVBpcGVOYW1lOworICBGU2hhcmVNb2RlICAgICAgIDo9IGFTaGFyZU1vZGU7CisgIEZTZWN1cml0eUF0dHJpYnMgOj0gYVNlY3VyaXR5QXR0cmlidXRlczsKIAogICBpZiBDb3B5KEZQaXBlTmFtZSwxLDIpIDw+ICdcXCcKICAgdGhlbiBGUGlwZU5hbWUgOj0gJ1xcLlxwaXBlXCcgKyBGUGlwZU5hbWU7ICAvLyBhc3N1bWUgbG9jYWxob3N0CiBlbmQ7CiAKIAotY29uc3RydWN0b3IgVFNlcnZlclBpcGVJbXBsLkNyZWF0ZSggYVBpcGVuYW1lIDogc3RyaW5nOyBhQnVmc2l6ZSA6IENhcmRpbmFsKTsKLS8vIE5hbWVkIFBpcGUgQ1RPUgorcHJvY2VkdXJlIFROYW1lZFBpcGVTdHJlYW1JbXBsLk9wZW47Cit2YXIgaFBpcGUgICAgOiBUSGFuZGxlOworICAgIHJldHJpZXMsIHRpbWVvdXQsIGR3RXJyIDogRFdPUkQ7Citjb25zdCBJTlRFUlZBTCA9IDEwOyAvLyBtcwogYmVnaW4KLSAgQ3JlYXRlKCBhUGlwZW5hbWUsIGFCdWZTaXplLCBUUElQRV9TRVJWRVJfTUFYX0NPTk5TX0RFRkFVTFQpOworICBpZiBJc09wZW4gdGhlbiBFeGl0OworCisgIHJldHJpZXMgOj0gTWF4KCAxLCBSb3VuZCggMS4wICogRk9wZW5UaW1lT3V0IC8gSU5URVJWQUwpKTsKKyAgdGltZW91dCA6PSBGT3BlblRpbWVPdXQ7CisKKyAgLy8gaWYgdGhlIHNlcnZlciBoYXNuJ3QgZ290dGVuIHRvIHRoZSBwb2ludCB3aGVyZSB0aGUgcGlwZSBoYXMgYmVlbiBjcmVhdGVkLCBhdCBsZWFzdCB3YWl0IHRoZSB0aW1lb3V0CisgIC8vIEFjY29yZGluZyB0byBNU0ROLCBpZiBubyBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpZmllZCBuYW1lZCBwaXBlIGV4aXN0LCB0aGUgV2FpdE5hbWVkUGlwZSBmdW5jdGlvbgorICAvLyByZXR1cm5zIElNTUVESUFURUxZLCByZWdhcmRsZXNzIG9mIHRoZSB0aW1lLW91dCB2YWx1ZS4KKyAgLy8gQWx3YXlzIHVzZSBJTlRFUlZBTCwgc2luY2UgV2FpdE5hbWVkUGlwZSgwKSBkZWZhdWx0cyB0byBzb21lIG90aGVyIHZhbHVlCisgIHdoaWxlIG5vdCBXYWl0TmFtZWRQaXBlKCBQQ2hhcihGUGlwZU5hbWUpLCBJTlRFUlZBTCkgZG8gYmVnaW4KKyAgICBkd0VyciA6PSBHZXRMYXN0RXJyb3I7CisgICAgaWYgZHdFcnIgPD4gRVJST1JfRklMRV9OT1RfRk9VTkQKKyAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoZHdFcnIpKTsKKworICAgIGlmIHRpbWVvdXQgPD4gSU5GSU5JVEUgdGhlbiBiZWdpbgorICAgICAgaWYgKHJldHJpZXMgPiAwKQorICAgICAgdGhlbiBEZWMocmV0cmllcykKKyAgICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdVbmFibGUgdG8gb3BlbiBwaXBlLCB0aW1lZCBvdXQnKTsKKyAgICBlbmQ7CisKKyAgICBTbGVlcChJTlRFUlZBTCkKKyAgZW5kOworCisgIC8vIG9wZW4gdGhhdCB0aGluZ3kKKyAgaFBpcGUgOj0gQ3JlYXRlRmlsZSggUENoYXIoIEZQaXBlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRCBvciBHRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICBGU2hhcmVNb2RlLCAgICAgICAgLy8gc2hhcmluZworICAgICAgICAgICAgICAgICAgICAgICBGU2VjdXJpdHlBdHRyaWJzLCAgLy8gc2VjdXJpdHkgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICAgICBPUEVOX0VYSVNUSU5HLCAgICAgLy8gb3BlbnMgZXhpc3RpbmcgcGlwZQorICAgICAgICAgICAgICAgICAgICAgICBGSUxFX0ZMQUdfT1ZFUkxBUFBFRCBvciBGSUxFX0ZMQUdfV1JJVEVfVEhST1VHSCwgLy8gYXN5bmMrZmFzdCwgcGxlYXNlCisgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAvLyBubyB0ZW1wbGF0ZSBmaWxlCisKKyAgaWYgaFBpcGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVW5hYmxlIHRvIG9wZW4gcGlwZSwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CisKKyAgLy8gZXZlcnl0aGluZyBmaW5lCisgIEZQaXBlIDo9IGhQaXBlOwogZW5kOwogCiAKLWNvbnN0cnVjdG9yIFRTZXJ2ZXJQaXBlSW1wbC5DcmVhdGUoIGFQaXBlbmFtZSA6IHN0cmluZyk7Ci0vLyBOYW1lZCBQaXBlIENUT1IKK3sgVEhhbmRsZVBpcGVTdHJlYW1JbXBsIH0KKworCitjb25zdHJ1Y3RvciBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBhUGlwZUhhbmRsZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhT3duc0hhbmRsZSwgYUVuYWJsZU92ZXJsYXBwZWQgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCk7CiBiZWdpbgotICBDcmVhdGUoIGFQaXBlbmFtZSwgMTAyNCwgVFBJUEVfU0VSVkVSX01BWF9DT05OU19ERUZBVUxUKTsKKyAgaW5oZXJpdGVkIENyZWF0ZSggYUVuYWJsZU92ZXJsYXBwZWQsIGFUaW1lT3V0KTsKKworICBpZiBhT3duc0hhbmRsZQorICB0aGVuIEZTcmNIYW5kbGUgOj0gYVBpcGVIYW5kbGUKKyAgZWxzZSBGU3JjSGFuZGxlIDo9IER1cGxpY2F0ZVBpcGVIYW5kbGUoIGFQaXBlSGFuZGxlKTsKKworICBPcGVuOwogZW5kOwogCiAKLWNvbnN0cnVjdG9yIFRTZXJ2ZXJQaXBlSW1wbC5DcmVhdGUoIGFCdWZzaXplIDogQ2FyZGluYWwpOworZGVzdHJ1Y3RvciBUSGFuZGxlUGlwZVN0cmVhbUltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIENsb3NlUGlwZUhhbmRsZSggRlNyY0hhbmRsZSk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuT3BlbjsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiBGUGlwZSA6PSBEdXBsaWNhdGVQaXBlSGFuZGxlKCBGU3JjSGFuZGxlKTsKK2VuZDsKKworCit7IFRQaXBlVHJhbnNwb3J0QmFzZSB9CisKKworZnVuY3Rpb24gVFBpcGVUcmFuc3BvcnRCYXNlLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIHJlc3VsdCA6PSAoRklucHV0U3RyZWFtIDw+IG5pbCkgIGFuZCAoRklucHV0U3RyZWFtLklzT3BlbikKKyAgICAgICAgYW5kIChGT3V0cHV0U3RyZWFtIDw+IG5pbCkgYW5kIChGT3V0cHV0U3RyZWFtLklzT3Blbik7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlVHJhbnNwb3J0QmFzZS5PcGVuOworYmVnaW4KKyAgRklucHV0U3RyZWFtLk9wZW47CisgIEZPdXRwdXRTdHJlYW0uT3BlbjsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVUcmFuc3BvcnRCYXNlLkNsb3NlOworYmVnaW4KKyAgRklucHV0U3RyZWFtLkNsb3NlOworICBGT3V0cHV0U3RyZWFtLkNsb3NlOworZW5kOworCisKK3sgVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVUcmFuc3BvcnRDbGllbnRFbmRJbXBsLkNyZWF0ZSggY29uc3QgYVBpcGVOYW1lIDogc3RyaW5nOyBjb25zdCBhU2hhcmVNb2RlOiBEV09SRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVNlY3VyaXR5QXR0cmlidXRlczogUFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQsIGFPcGVuVGltZU91dCA6IERXT1JEKTsKKy8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKKyAgRklucHV0U3RyZWFtICA6PSBUTmFtZWRQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlTmFtZSwgVFJVRSwgYVNoYXJlTW9kZSwgYVNlY3VyaXR5QXR0cmlidXRlcywgYVRpbWVPdXQsIGFPcGVuVGltZU91dCk7CisgIEZPdXRwdXRTdHJlYW0gOj0gRklucHV0U3RyZWFtOyAgLy8gdHJ1ZSBmb3IgbmFtZWQgcGlwZXMKK2VuZDsKKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIGFQaXBlIDogVEhhbmRsZTsgYU93bnNIYW5kbGUgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhVGltZU91dCA6IERXT1JEKTsKKy8vIE5hbWVkIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKKyAgRklucHV0U3RyZWFtICA6PSBUSGFuZGxlUGlwZVN0cmVhbUltcGwuQ3JlYXRlKCBhUGlwZSwgVFJVRSwgYU93bnNIYW5kbGUsIGFUaW1lT3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07ICAvLyB0cnVlIGZvciBuYW1lZCBwaXBlcworZW5kOworCisKK3sgVE5hbWVkUGlwZVRyYW5zcG9ydFNlcnZlckVuZEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsLkNyZWF0ZSggYVBpcGUgOiBUSGFuZGxlOyBhT3duc0hhbmRsZSA6IEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFUaW1lT3V0IDogRFdPUkQpOworLy8gTmFtZWQgcGlwZSBjb25zdHJ1Y3RvcgorYmVnaW4KKyAgRkhhbmRsZSA6PSBEdXBsaWNhdGVQaXBlSGFuZGxlKCBhUGlwZSk7CisgIGluaGVyaXRlZCBDcmVhdGUoIGFQaXBlLCBhT3duc0hhbmRsZSwgYVRpbWVPdXQpOworZW5kOworCisKK3Byb2NlZHVyZSBUTmFtZWRQaXBlVHJhbnNwb3J0U2VydmVyRW5kSW1wbC5DbG9zZTsKK2JlZ2luCisgIEZsdXNoRmlsZUJ1ZmZlcnMoIEZIYW5kbGUpOworICBEaXNjb25uZWN0TmFtZWRQaXBlKCBGSGFuZGxlKTsgIC8vIGZvcmNlIGNsaWVudCBvZmYgdGhlIHBpcGUKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGSGFuZGxlKTsKKworICBpbmhlcml0ZWQgQ2xvc2U7CitlbmQ7CisKKworeyBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwgfQorCisKK2NvbnN0cnVjdG9yIFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IGFQaXBlUmVhZCwgYVBpcGVXcml0ZSA6IFRIYW5kbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhT3duc0hhbmRsZXMgOiBCb29sZWFuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYVRpbWVPdXQgOiBEV09SRCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQpOworLy8gQW5vbnltb3VzIHBpcGUgY29uc3RydWN0b3IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoIG5pbCwgbmlsKTsKKyAgLy8gb3ZlcmxhcHBlZCBpcyBub3Qgc3VwcG9ydGVkIHdpdGggQW5vblBpcGVzLCBzZWUgTVNETgorICBGSW5wdXRTdHJlYW0gIDo9IFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlUmVhZCwgYU93bnNIYW5kbGVzLCBGQUxTRSwgYVRpbWVPdXQpOworICBGT3V0cHV0U3RyZWFtIDo9IFRIYW5kbGVQaXBlU3RyZWFtSW1wbC5DcmVhdGUoIGFQaXBlV3JpdGUsIGFPd25zSGFuZGxlcywgRkFMU0UsIGFUaW1lT3V0KTsKK2VuZDsKKworCit7IFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZSB9CisKKworY29uc3RydWN0b3IgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTdG9wU2VydmVyIDo9IFRFdmVudC5DcmVhdGUobmlsLFRSVUUsRkFMU0UsJycpOyAgLy8gbWFudWFsIHJlc2V0CitlbmQ7CisKKworZGVzdHJ1Y3RvciBUUGlwZVNlcnZlclRyYW5zcG9ydEJhc2UuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZyZWVBbmROaWwoIEZTdG9wU2VydmVyKTsKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CitlbmQ7CisKKworZnVuY3Rpb24gVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLlF1ZXJ5U3RvcFNlcnZlciA6IEJvb2xlYW47CitiZWdpbgorICByZXN1bHQgOj0gKEZTdG9wU2VydmVyID0gbmlsKQorICAgICAgICAgb3IgKEZTdG9wU2VydmVyLldhaXRGb3IoMCkgPD4gd3JUaW1lb3V0KTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFBpcGVTZXJ2ZXJUcmFuc3BvcnRCYXNlLkxpc3RlbjsKK2JlZ2luCisgIEZTdG9wU2VydmVyLlJlc2V0RXZlbnQ7CitlbmQ7CisKKworcHJvY2VkdXJlIFRQaXBlU2VydmVyVHJhbnNwb3J0QmFzZS5DbG9zZTsKK2JlZ2luCisgIEZTdG9wU2VydmVyLlNldEV2ZW50OworICBJbnRlcm5hbENsb3NlOworZW5kOworCisKK3sgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKGFCdWZzaXplIDogQ2FyZGluYWw7IGFUaW1lT3V0IDogRFdPUkQpOwogLy8gQW5vbnltb3VzIHBpcGUgQ1RPUgogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRlBpcGVOYW1lIDo9ICcnOwogICBGQnVmc2l6ZSAgOj0gYUJ1ZlNpemU7Ci0gIEZNYXhDb25ucyA6PSAxOwotICBGQW5vbnltb3VzIDo9IFRSVUU7Ci0gIEZIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZSZWFkSGFuZGxlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICBGV3JpdGVIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CiAgIEZDbGllbnRBbm9uUmVhZCA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKICAgRkNsaWVudEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgRlRpbWVPdXQgOj0gYVRpbWVPdXQ7CiAKICAgLy8gVGhlIGFub255bW91cyBwaXBlIG5lZWRzIHRvIGJlIGNyZWF0ZWQgZmlyc3Qgc28gdGhhdCB0aGUgc2VydmVyIGNhbgogICAvLyBwYXNzIHRoZSBoYW5kbGVzIG9uIHRvIHRoZSBjbGllbnQgYmVmb3JlIHRoZSBzZXJ2ZSAoYWNjZXB0SW1wbCkKICAgLy8gYmxvY2tpbmcgY2FsbC4KICAgaWYgbm90IENyZWF0ZUFub25QaXBlCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lKycuQ3JlYXRlKCkgZmFpbGVkJyk7CisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKENsYXNzTmFtZSsnLkNyZWF0ZSgpIGZhaWxlZCcpOwogZW5kOwogCiAKLWNvbnN0cnVjdG9yIFRTZXJ2ZXJQaXBlSW1wbC5DcmVhdGUoKTsKLS8vIEFub255bW91cyBwaXBlIENUT1IKLWJlZ2luCi0gIENyZWF0ZSggMTAyNCk7Ci1lbmQ7Ci0KLQotZnVuY3Rpb24gVFNlcnZlclBpcGVJbXBsLkFjY2VwdEltcGw6IElUcmFuc3BvcnQ7CitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQWNjZXB0KGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7CiB2YXIgYnVmICAgIDogQnl0ZTsKICAgICBiciAgICAgOiBEV09SRDsKLSAgICBjb25uZWN0UmV0IDogQm9vbGVhbjsKIGJlZ2luCi0gIGlmIEZBbm9ueW1vdXMgdGhlbiBiZWdpbiAgIC8vQW5vbnltb3VzIFBpcGUKKyAgaWYgQXNzaWduZWQoZm5BY2NlcHRpbmcpCisgIHRoZW4gZm5BY2NlcHRpbmcoKTsKIAotICAgIC8vIFRoaXMgMC1ieXRlIHJlYWQgc2VydmVzIG1lcmVseSBhcyBhIGJsb2NraW5nIGNhbGwuCi0gICAgaWYgbm90IFJlYWRGaWxlKCBGSGFuZGxlLCBidWYsIDAsIGJyLCBuaWwpCi0gICAgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCi0gICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUGlwZVNlcnZlciB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tdW5pY2F0aW9uJyk7Ci0JICByZXN1bHQgOj0gVEFub255bW91c1BpcGVJbXBsLkNyZWF0ZSggRkhhbmRsZSwgRldyaXRlSGFuZGxlLCBGQUxTRSk7CisgIC8vIFRoaXMgMC1ieXRlIHJlYWQgc2VydmVzIG1lcmVseSBhcyBhIGJsb2NraW5nIGNhbGwuCisgIGlmIG5vdCBSZWFkRmlsZSggRlJlYWRIYW5kbGUsIGJ1ZiwgMCwgYnIsIG5pbCkKKyAgYW5kIChHZXRMYXN0RXJyb3IoKSA8PiBFUlJPUl9NT1JFX0RBVEEpCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSB1bmFibGUgdG8gaW5pdGlhdGUgcGlwZSBjb21tdW5pY2F0aW9uJyk7CiAKLSAgZW5kCi0gIGVsc2UgYmVnaW4gIC8vTmFtZWQgUGlwZQotCi0gICAgd2hpbGUgVFJVRSBkbyBiZWdpbgotICAgICAgaWYgbm90IENyZWF0ZU5hbWVkUGlwZSgpCi0gICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFBpcGVTZXJ2ZXIgQ3JlYXRlTmFtZWRQaXBlIGZhaWxlZCcpOwotCi0gICAgICAvLyBXYWl0IGZvciB0aGUgY2xpZW50IHRvIGNvbm5lY3Q7IGlmIGl0IHN1Y2NlZWRzLCB0aGUKLSAgICAgIC8vIGZ1bmN0aW9uIHJldHVybnMgYSBub256ZXJvIHZhbHVlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucwotICAgICAgLy8gemVybywgR2V0TGFzdEVycm9yIHNob3VsZCByZXR1cm4gRVJST1JfUElQRV9DT05ORUNURUQuCi0gICAgICBpZiBDb25uZWN0TmFtZWRQaXBlKCBGSGFuZGxlLG5pbCkKLSAgICAgIHRoZW4gY29ubmVjdFJldCA6PSBUUlVFCi0gICAgICBlbHNlIGNvbm5lY3RSZXQgOj0gKEdldExhc3RFcnJvcigpID0gRVJST1JfUElQRV9DT05ORUNURUQpOwotCi0gICAgICBpZiBjb25uZWN0UmV0Ci0gICAgICB0aGVuIEJyZWFrOwotCi0gICAgICBDbG9zZTsKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RQaXBlU2VydmVyOiBjbGllbnQgY29ubmVjdGlvbiBmYWlsZWQnKTsKLSAgICBlbmQ7Ci0KLQkgIHJlc3VsdCA6PSBUTmFtZWRQaXBlSW1wbC5DcmVhdGUoIEZIYW5kbGUsIFRSVUUpOwotICBlbmQ7CisgIC8vIGNyZWF0ZSB0aGUgdHJhbnNwb3J0IGltcGwKKyAgcmVzdWx0IDo9IFRBbm9ueW1vdXNQaXBlVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZSZWFkSGFuZGxlLCBGV3JpdGVIYW5kbGUsIEZBTFNFLCBGVGltZU91dCk7CiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRTZXJ2ZXJQaXBlSW1wbC5MaXN0ZW47Citwcm9jZWR1cmUgVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkludGVybmFsQ2xvc2U7CiBiZWdpbgotICAvLyBub3QgbXVjaCB0byBkbyBoZXJlCisgIENsb3NlUGlwZUhhbmRsZSggRlJlYWRIYW5kbGUpOworICBDbG9zZVBpcGVIYW5kbGUoIEZXcml0ZUhhbmRsZSk7CisgIENsb3NlUGlwZUhhbmRsZSggRkNsaWVudEFub25SZWFkKTsKKyAgQ2xvc2VQaXBlSGFuZGxlKCBGQ2xpZW50QW5vbldyaXRlKTsKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFNlcnZlclBpcGVJbXBsLkNsb3NlOworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLlJlYWRIYW5kbGUgOiBUSGFuZGxlOwogYmVnaW4KLSAgaWYgbm90IEZBbm9ueW1vdXMgdGhlbiBiZWdpbgotCi0gICAgaWYgRkhhbmRsZSA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRSB0aGVuIGJlZ2luCi0gICAgICBEaXNjb25uZWN0TmFtZWRQaXBlKCBGSGFuZGxlKTsKLSAgICAgIENsb3NlSGFuZGxlKCBGSGFuZGxlKTsKLSAgICAgIEZIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gICAgZW5kOwotCi0gIGVuZAotICBlbHNlIGJlZ2luCi0KLSAgICBpZiBGSGFuZGxlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFIHRoZW4gYmVnaW4KLSAgICAgIENsb3NlSGFuZGxlKCBGSGFuZGxlKTsKLSAgICAgIEZIYW5kbGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gICAgZW5kOwotICAgIGlmIEZXcml0ZUhhbmRsZSA8PiBJTlZBTElEX0hBTkRMRV9WQUxVRSB0aGVuIGJlZ2luCi0gICAgICBDbG9zZUhhbmRsZSggRldyaXRlSGFuZGxlKTsKLSAgICAgIEZXcml0ZUhhbmRsZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgICBlbmQ7Ci0gICAgaWYgRkNsaWVudEFub25SZWFkIDw+IElOVkFMSURfSEFORExFX1ZBTFVFIHRoZW4gYmVnaW4KLSAgICAgIENsb3NlSGFuZGxlKCBGQ2xpZW50QW5vblJlYWQpOwotICAgICAgRkNsaWVudEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICAgIGVuZDsKLSAgICBpZiBGQ2xpZW50QW5vbldyaXRlIDw+IElOVkFMSURfSEFORExFX1ZBTFVFIHRoZW4gYmVnaW4KLSAgICAgIENsb3NlSGFuZGxlKCBGQ2xpZW50QW5vbldyaXRlKTsKLSAgICAgIEZDbGllbnRBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Ci0gICAgZW5kOwotICBlbmQ7CisgIHJlc3VsdCA6PSBGUmVhZEhhbmRsZTsKIGVuZDsKIAogCi1mdW5jdGlvbiBUU2VydmVyUGlwZUltcGwuSGFuZGxlIDogVEhhbmRsZTsKLWJlZ2luCi0gIHJlc3VsdCA6PSBGSGFuZGxlOwotZW5kOwotCi0KLWZ1bmN0aW9uIFRTZXJ2ZXJQaXBlSW1wbC5Xcml0ZUhhbmRsZSA6IFRIYW5kbGU7CitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuV3JpdGVIYW5kbGUgOiBUSGFuZGxlOwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcml0ZUhhbmRsZTsKIGVuZDsKIAogCi1mdW5jdGlvbiBUU2VydmVyUGlwZUltcGwuQ2xpZW50QW5vblJlYWQgOiBUSGFuZGxlOworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNsaWVudEFub25SZWFkIDogVEhhbmRsZTsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGQ2xpZW50QW5vblJlYWQ7CiBlbmQ7CiAKIAotZnVuY3Rpb24gVFNlcnZlclBpcGVJbXBsLkNsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOworZnVuY3Rpb24gVEFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkNsaWVudEFub25Xcml0ZSAgOiBUSGFuZGxlOwogYmVnaW4KICAgcmVzdWx0IDo9IEZDbGllbnRBbm9uV3JpdGU7CiBlbmQ7CiAKIAotZnVuY3Rpb24gVFNlcnZlclBpcGVJbXBsLkNyZWF0ZU5hbWVkUGlwZSA6IEJvb2xlYW47CitmdW5jdGlvbiBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlQW5vblBpcGUgOiBCb29sZWFuOwordmFyIHNkICAgICAgICAgICA6IFBTRUNVUklUWV9ERVNDUklQVE9SOworICAgIHNhICAgICAgICAgICA6IFNFQ1VSSVRZX0FUVFJJQlVURVM7IC8vVFNlY3VyaXR5QXR0cmlidXRlczsKKyAgICBoQ0FSLCBoUGlwZVcsIGhDQVcsIGhQaXBlIDogVEhhbmRsZTsKK2JlZ2luCisgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOworICB0cnkKKyAgICBXaW4zMkNoZWNrKCBJbml0aWFsaXplU2VjdXJpdHlEZXNjcmlwdG9yKCBzZCwgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTikpOworICAgIFdpbjMyQ2hlY2soIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woIHNkLCBUUlVFLCBuaWwsIEZBTFNFKSk7CisKKyAgICBzYS5uTGVuZ3RoIDo9IHNpemVvZiggc2EpOworICAgIHNhLmxwU2VjdXJpdHlEZXNjcmlwdG9yIDo9IHNkOworICAgIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IFRSVUU7IC8vYWxsb3cgcGFzc2luZyBoYW5kbGUgdG8gY2hpbGQKKworICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoQ0FSLCBoUGlwZVcsIEBzYSwgRkJ1ZlNpemUpOyAvL2NyZWF0ZSBzdGRpbiBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaFBpcGUsIGhDQVcsIEBzYSwgRkJ1ZlNpemUpOyAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgLy9jcmVhdGUgc3Rkb3V0IHBpcGUKKyAgICAgIENsb3NlSGFuZGxlKCBoQ0FSKTsKKyAgICAgIENsb3NlSGFuZGxlKCBoUGlwZVcpOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdUU2VydmVyUGlwZSBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICBGQ2xpZW50QW5vblJlYWQgIDo9IGhDQVI7CisgICAgRkNsaWVudEFub25Xcml0ZSA6PSBoQ0FXOworICAgIEZSZWFkSGFuZGxlICAgICAgOj0gaFBpcGU7CisgICAgRldyaXRlSGFuZGxlICAgICA6PSBoUGlwZVc7CisgIGZpbmFsbHkKKyAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKHNkKSk7CisgIGVuZDsKK2VuZDsKKworCit7IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsIH0KKworCitjb25zdHJ1Y3RvciBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGFQaXBlbmFtZSA6IHN0cmluZzsgYUJ1ZnNpemUsIGFNYXhDb25ucywgYVRpbWVPdXQgOiBDYXJkaW5hbCk7CisvLyBOYW1lZCBQaXBlIENUT1IKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEFTU0VSVCggYVRpbWVvdXQgPiAwKTsKKyAgRlBpcGVOYW1lICA6PSBhUGlwZW5hbWU7CisgIEZCdWZzaXplICAgOj0gYUJ1ZlNpemU7CisgIEZNYXhDb25ucyAgOj0gTWF4KCAxLCBNaW4oIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUywgYU1heENvbm5zKSk7CisgIEZIYW5kbGUgICAgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIEZUaW1lb3V0ICAgOj0gYVRpbWVPdXQ7CisgIEZDb25uZWN0ZWQgOj0gRkFMU0U7CisKKyAgaWYgQ29weShGUGlwZU5hbWUsMSwyKSA8PiAnXFwnCisgIHRoZW4gRlBpcGVOYW1lIDo9ICdcXC5ccGlwZVwnICsgRlBpcGVOYW1lOyAgLy8gYXNzdW1lIGxvY2FsaG9zdAorZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdChjb25zdCBmbkFjY2VwdGluZzogVFByb2MpOiBJVHJhbnNwb3J0OwordmFyIGR3RXJyb3IsIGR3V2FpdCwgZHdEdW1teSA6IERXT1JEOworICAgIG92ZXJsYXBwZWQgOiBJT3ZlcmxhcHBlZEhlbHBlcjsKKyAgICBoYW5kbGVzIDogYXJyYXlbMC4uMV0gb2YgVEhhbmRsZTsKK2JlZ2luCisgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKworICBBU1NFUlQoIG5vdCBGQ29ubmVjdGVkKTsKKyAgQ3JlYXRlTmFtZWRQaXBlOworICB3aGlsZSBub3QgRkNvbm5lY3RlZCBkbyBiZWdpbgorCisgICAgaWYgUXVlcnlTdG9wU2VydmVyIHRoZW4gYmVnaW4KKyAgICAgIEludGVybmFsQ2xvc2U7CisgICAgICBBYm9ydDsKKyAgICBlbmQ7CisKKyAgICBpZiBBc3NpZ25lZChmbkFjY2VwdGluZykKKyAgICB0aGVuIGZuQWNjZXB0aW5nKCk7CisKKyAgICAvLyBXYWl0IGZvciB0aGUgY2xpZW50IHRvIGNvbm5lY3Q7IGlmIGl0IHN1Y2NlZWRzLCB0aGUKKyAgICAvLyBmdW5jdGlvbiByZXR1cm5zIGEgbm9uemVybyB2YWx1ZS4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgICAvLyB6ZXJvLCBHZXRMYXN0RXJyb3Igc2hvdWxkIHJldHVybiBFUlJPUl9QSVBFX0NPTk5FQ1RFRC4KKyAgICBpZiBDb25uZWN0TmFtZWRQaXBlKCBIYW5kbGUsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikgdGhlbiBiZWdpbgorICAgICAgRkNvbm5lY3RlZCA6PSBUUlVFOworICAgICAgQnJlYWs7CisgICAgZW5kOworCisgICAgLy8gQ29ubmVjdE5hbWVkUGlwZSgpIHJldHVybnMgRkFMU0UgZm9yIE92ZXJsYXBwZWRJTywgZXZlbiBpZiBjb25uZWN0ZWQuCisgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBHZXRMYXN0RXJyb3IoKSBleHBsaWNpdGx5IHRvIGZpbmQgb3V0CisgICAgZHdFcnJvciA6PSBHZXRMYXN0RXJyb3I7CisgICAgY2FzZSBkd0Vycm9yIG9mCisgICAgICBFUlJPUl9QSVBFX0NPTk5FQ1RFRCA6IGJlZ2luCisgICAgICAgIEZDb25uZWN0ZWQgOj0gbm90IFF1ZXJ5U3RvcFNlcnZlcjsgIC8vIHNwZWNpYWwgY2FzZTogcGlwZSBpbW1lZGlhdGVseSBjb25uZWN0ZWQKKyAgICAgIGVuZDsKKworICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCisgICAgICAgIGhhbmRsZXNbMF0gOj0gb3ZlcmxhcHBlZC5XYWl0SGFuZGxlOworICAgICAgICBoYW5kbGVzWzFdIDo9IEZTdG9wU2VydmVyLkhhbmRsZTsKKyAgICAgICAgZHdXYWl0IDo9IFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoIDIsIEBoYW5kbGVzLCBGQUxTRSwgRlRpbWVvdXQpOworICAgICAgICBGQ29ubmVjdGVkIDo9IChkd1dhaXQgPSBXQUlUX09CSkVDVF8wKQorICAgICAgICAgICAgICAgICAgYW5kIEdldE92ZXJsYXBwZWRSZXN1bHQoIEhhbmRsZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBkd0R1bW15LCBUUlVFKQorICAgICAgICAgICAgICAgICAgYW5kIG5vdCBRdWVyeVN0b3BTZXJ2ZXI7CisgICAgICBlbmQ7CisKKyAgICBlbHNlCisgICAgICBJbnRlcm5hbENsb3NlOworICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDbGllbnQgY29ubmVjdGlvbiBmYWlsZWQnKTsKKyAgICBlbmQ7CisgIGVuZDsKKworICAvLyBjcmVhdGUgdGhlIHRyYW5zcG9ydCBpbXBsCisgIHJlc3VsdCA6PSBDcmVhdGVUcmFuc3BvcnRJbnN0YW5jZTsKK2VuZDsKKworCitmdW5jdGlvbiBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5DcmVhdGVUcmFuc3BvcnRJbnN0YW5jZSA6IElUcmFuc3BvcnQ7CisvLyBjcmVhdGUgdGhlIHRyYW5zcG9ydCBpbXBsCit2YXIgaFBpcGUgOiBUSGFuZGxlOworYmVnaW4KKyAgaFBpcGUgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoIFBvaW50ZXIoRkhhbmRsZSksIFBvaW50ZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgIHRyeQorICAgIEZDb25uZWN0ZWQgOj0gRkFMU0U7CisgICAgcmVzdWx0IDo9IFROYW1lZFBpcGVUcmFuc3BvcnRTZXJ2ZXJFbmRJbXBsLkNyZWF0ZSggaFBpcGUsIFRSVUUsIEZUaW1lb3V0KTsKKyAgZXhjZXB0CisgICAgQ2xvc2VQaXBlSGFuZGxlKGhQaXBlKTsKKyAgICByYWlzZTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0SW1wbC5JbnRlcm5hbENsb3NlOwordmFyIGhQaXBlIDogVEhhbmRsZTsKK2JlZ2luCisgIGhQaXBlIDo9IFRIYW5kbGUoIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKCBQb2ludGVyKEZIYW5kbGUpLCBQb2ludGVyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICBpZiBoUGlwZSA9IElOVkFMSURfSEFORExFX1ZBTFVFIHRoZW4gRXhpdDsKKworICB0cnkKKyAgICBpZiBGQ29ubmVjdGVkCisgICAgdGhlbiBGbHVzaEZpbGVCdWZmZXJzKCBoUGlwZSkKKyAgICBlbHNlIENhbmNlbElvKCBoUGlwZSk7CisgICAgRGlzY29ubmVjdE5hbWVkUGlwZSggaFBpcGUpOworICBmaW5hbGx5CisgICAgQ2xvc2VQaXBlSGFuZGxlKCBoUGlwZSk7CisgICAgRkNvbm5lY3RlZCA6PSBGQUxTRTsKKyAgZW5kOworZW5kOworCisKK2Z1bmN0aW9uIFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnRJbXBsLkhhbmRsZSA6IFRIYW5kbGU7CitiZWdpbgorICB7JElGREVGIFdJTjY0fQorICByZXN1bHQgOj0gVEhhbmRsZSggSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCBJbnQ2NChGSGFuZGxlKSwgMCkpOworICB7JEVMU0V9CisgIHJlc3VsdCA6PSBUSGFuZGxlKCBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCBJbnRlZ2VyKEZIYW5kbGUpLCAwKSk7CisgIHskRU5ESUZ9CitlbmQ7CisKKworZnVuY3Rpb24gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlTmFtZWRQaXBlIDogVEhhbmRsZTsKIHZhciBTSURBdXRoV29ybGQgOiBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgOwogICAgIGV2ZXJ5b25lX3NpZCA6IFBTSUQ7CiAgICAgZWEgICAgICAgICAgIDogRVhQTElDSVRfQUNDRVNTOwogICAgIGFjbCAgICAgICAgICA6IFBBQ0w7CiAgICAgc2QgICAgICAgICAgIDogUFNFQ1VSSVRZX0RFU0NSSVBUT1I7CiAgICAgc2EgICAgICAgICAgIDogU0VDVVJJVFlfQVRUUklCVVRFUzsKLSAgICBoUGlwZSA6IFRIYW5kbGU7CiBjb25zdAogICBTRUNVUklUWV9XT1JMRF9TSURfQVVUSE9SSVRZICA6IFRTSURJZGVudGlmaWVyQXV0aG9yaXR5ID0gKFZhbHVlIDogKDAsMCwwLDAsMCwxKSk7CiAgIFNFQ1VSSVRZX1dPUkxEX1JJRCA9ICQwMDAwMDAwMDsKIGJlZ2luCi0gIC8vIFdpbmRvd3MgLSBzZXQgc2VjdXJpdHkgdG8gYWxsb3cgbm9uLWVsZXZhdGVkIGFwcHMKLSAgLy8gdG8gYWNjZXNzIHBpcGVzIGNyZWF0ZWQgYnkgZWxldmF0ZWQgYXBwcy4KLSAgU0lEQXV0aFdvcmxkIDo9IFNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFk7CisgIHNkIDo9IG5pbDsKICAgZXZlcnlvbmVfc2lkIDo9IG5pbDsKLSAgQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKCBTSURBdXRoV29ybGQsIDEsIFNFQ1VSSVRZX1dPUkxEX1JJRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZXZlcnlvbmVfc2lkKTsKKyAgdHJ5CisgICAgQVNTRVJUKCAoRkhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFKSBhbmQgbm90IEZDb25uZWN0ZWQpOwogCi0gIFplcm9NZW1vcnkoIEBlYSwgU2l6ZU9mKGVhKSk7Ci0gIGVhLmdyZkFjY2Vzc1Blcm1pc3Npb25zIDo9IFNQRUNJRklDX1JJR0hUU19BTEwgb3IgU1RBTkRBUkRfUklHSFRTX0FMTDsKLSAgZWEuZ3JmQWNjZXNzTW9kZSAgICAgICAgOj0gU0VUX0FDQ0VTUzsKLSAgZWEuZ3JmSW5oZXJpdGFuY2UgICAgICAgOj0gTk9fSU5IRVJJVEFOQ0U7Ci0gIGVhLlRydXN0ZWUuVHJ1c3RlZUZvcm0gIDo9IFRSVVNURUVfSVNfU0lEOwotICBlYS5UcnVzdGVlLlRydXN0ZWVUeXBlICA6PSBUUlVTVEVFX0lTX1dFTExfS05PV05fR1JPVVA7Ci0gIGVhLlRydXN0ZWUucHRzdHJOYW1lICAgIDo9IFBDaGFyKGV2ZXJ5b25lX3NpZCk7CisgICAgLy8gV2luZG93cyAtIHNldCBzZWN1cml0eSB0byBhbGxvdyBub24tZWxldmF0ZWQgYXBwcworICAgIC8vIHRvIGFjY2VzcyBwaXBlcyBjcmVhdGVkIGJ5IGVsZXZhdGVkIGFwcHMuCisgICAgU0lEQXV0aFdvcmxkIDo9IFNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFk7CisgICAgQWxsb2NhdGVBbmRJbml0aWFsaXplU2lkKCBTSURBdXRoV29ybGQsIDEsIFNFQ1VSSVRZX1dPUkxEX1JJRCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZXZlcnlvbmVfc2lkKTsKIAotICBhY2wgOj0gbmlsOwotICBTZXRFbnRyaWVzSW5BY2woIDEsIEBlYSwgbmlsLCBhY2wpOworICAgIFplcm9NZW1vcnkoIEBlYSwgU2l6ZU9mKGVhKSk7CisgICAgZWEuZ3JmQWNjZXNzUGVybWlzc2lvbnMgOj0gR0VORVJJQ19BTEw7IC8vU1BFQ0lGSUNfUklHSFRTX0FMTCBvciBTVEFOREFSRF9SSUdIVFNfQUxMOworICAgIGVhLmdyZkFjY2Vzc01vZGUgICAgICAgIDo9IFNFVF9BQ0NFU1M7CisgICAgZWEuZ3JmSW5oZXJpdGFuY2UgICAgICAgOj0gTk9fSU5IRVJJVEFOQ0U7CisgICAgZWEuVHJ1c3RlZS5UcnVzdGVlRm9ybSAgOj0gVFJVU1RFRV9JU19TSUQ7CisgICAgZWEuVHJ1c3RlZS5UcnVzdGVlVHlwZSAgOj0gVFJVU1RFRV9JU19XRUxMX0tOT1dOX0dST1VQOworICAgIGVhLlRydXN0ZWUucHRzdHJOYW1lICAgIDo9IFBDaGFyKGV2ZXJ5b25lX3NpZCk7CiAKLSAgc2QgOj0gUFNFQ1VSSVRZX0RFU0NSSVBUT1IoIExvY2FsQWxsb2MoIExQVFIsU0VDVVJJVFlfREVTQ1JJUFRPUl9NSU5fTEVOR1RIKSk7Ci0gIFdpbjMyQ2hlY2soIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoIHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKSk7Ci0gIFdpbjMyQ2hlY2soIFNldFNlY3VyaXR5RGVzY3JpcHRvckRhY2woIHNkLCBUUlVFLCBhY2wsIEZBTFNFKSk7CisgICAgYWNsIDo9IG5pbDsKKyAgICBTZXRFbnRyaWVzSW5BY2woIDEsIEBlYSwgbmlsLCBhY2wpOwogCi0gIHNhLm5MZW5ndGggOj0gU2l6ZU9mKHNhKTsKLSAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgOj0gc2Q7Ci0gIHNhLmJJbmhlcml0SGFuZGxlICAgICAgIDo9IEZBTFNFOworICAgIHNkIDo9IFBTRUNVUklUWV9ERVNDUklQVE9SKCBMb2NhbEFsbG9jKCBMUFRSLFNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSCkpOworICAgIFdpbjMyQ2hlY2soIEluaXRpYWxpemVTZWN1cml0eURlc2NyaXB0b3IoIHNkLCBTRUNVUklUWV9ERVNDUklQVE9SX1JFVklTSU9OKSk7CisgICAgV2luMzJDaGVjayggU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCggc2QsIFRSVUUsIGFjbCwgRkFMU0UpKTsKIAotICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIG5hbWVkIHBpcGUKLSAgaFBpcGUgOj0gV2luZG93cy5DcmVhdGVOYW1lZFBpcGUoIFBDaGFyKCBGUGlwZU5hbWUpLCAgICAgICAgLy8gcGlwZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX0FDQ0VTU19EVVBMRVgsICAgICAgIC8vIHJlYWQvd3JpdGUgYWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1RZUEVfTUVTU0FHRSBvciAgICAgIC8vIG1lc3NhZ2UgdHlwZSBwaXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSVBFX1JFQURNT0RFX01FU1NBR0UsICAgIC8vIG1lc3NhZ2UtcmVhZCBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTWF4Q29ubnMsICAgICAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQnVmU2l6ZSwgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJ1ZlNpemUsICAgICAgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgdGltZS1vdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBzYSk7ICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzZWN1cml0eSBhdHRyaWJ1dGUKKyAgICBzYS5uTGVuZ3RoIDo9IFNpemVPZihzYSk7CisgICAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgOj0gc2Q7CisgICAgc2EuYkluaGVyaXRIYW5kbGUgICAgICAgOj0gRkFMU0U7CiAKLSAgaWYoIGhQaXBlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHRoZW4gYmVnaW4KLSAgICBGSGFuZGxlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQgJyArIEludFRvU3RyKEdldExhc3RFcnJvcikpOworICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgbmFtZWQgcGlwZQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IFdpbmRvd3MuQ3JlYXRlTmFtZWRQaXBlKAorICAgIHskRUxTRX0KKyAgICByZXN1bHQgOj0gV2luYXBpLldpbmRvd3MuQ3JlYXRlTmFtZWRQaXBlKAorICAgIHskRU5ESUZ9CisgICAgICAgIFBDaGFyKCBGUGlwZU5hbWUpLCAgICAgICAgLy8gcGlwZSBuYW1lCisgICAgICAgIFBJUEVfQUNDRVNTX0RVUExFWCBvciAgICAgLy8gcmVhZC93cml0ZSBhY2Nlc3MKKyAgICAgICAgRklMRV9GTEFHX09WRVJMQVBQRUQsICAgICAvLyBhc3luYyBtb2RlCisgICAgICAgIFBJUEVfVFlQRV9CWVRFIG9yICAgICAgICAgLy8gYnl0ZSB0eXBlIHBpcGUKKyAgICAgICAgUElQRV9SRUFETU9ERV9CWVRFLCAgICAgICAvLyBieXRlIHJlYWQgbW9kZQorICAgICAgICBGTWF4Q29ubnMsICAgICAgICAgICAgICAgIC8vIG1heC4gaW5zdGFuY2VzCisgICAgICAgIEZCdWZTaXplLCAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICAgIEZCdWZTaXplLCAgICAgICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKKyAgICAgICAgRlRpbWVvdXQsICAgICAgICAgICAgICAgICAvLyB0aW1lLW91dCwgc2VlIE1TRE4KKyAgICAgICAgQHNhICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHNlY3VyaXR5IGF0dHJpYnV0ZQorICAgICk7CisKKyAgICBpZiggcmVzdWx0IDw+IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgIHRoZW4gSW50ZXJsb2NrZWRFeGNoYW5nZVBvaW50ZXIoIFBvaW50ZXIoRkhhbmRsZSksIFBvaW50ZXIocmVzdWx0KSkKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ3JlYXRlTmFtZWRQaXBlKCkgZmFpbGVkICcgKyBJbnRUb1N0cihHZXRMYXN0RXJyb3IpKTsKKworICBmaW5hbGx5CisgICAgaWYgc2QgPD4gbmlsIHRoZW4gTG9jYWxGcmVlKCBDYXJkaW5hbCggc2QpKTsKKyAgICBpZiBhY2wgPD4gbmlsIHRoZW4gTG9jYWxGcmVlKCBDYXJkaW5hbCggYWNsKSk7CisgICAgaWYgZXZlcnlvbmVfc2lkIDw+IG5pbCB0aGVuIEZyZWVTaWQoZXZlcnlvbmVfc2lkKTsKICAgZW5kOwotCi0gIEZIYW5kbGUgOj0gaFBpcGU7Ci0gIHJlc3VsdCAgOj0gVFJVRTsKLWVuZDsKLQotCi1mdW5jdGlvbiBUU2VydmVyUGlwZUltcGwuQ3JlYXRlQW5vblBpcGUgOiBCb29sZWFuOwotdmFyIHNkICAgICAgICAgICA6IFBTRUNVUklUWV9ERVNDUklQVE9SOwotICAgIHNhICAgICAgICAgICA6IFNFQ1VSSVRZX0FUVFJJQlVURVM7IC8vVFNlY3VyaXR5QXR0cmlidXRlczsKLSAgICBoQ0FSLCBoUGlwZVcsIGhDQVcsIGhQaXBlIDogVEhhbmRsZTsKLWJlZ2luCi0gIHJlc3VsdCA6PSBGQUxTRTsKLQotICBzZCA6PSBQU0VDVVJJVFlfREVTQ1JJUFRPUiggTG9jYWxBbGxvYyggTFBUUixTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpKTsKLSAgV2luMzJDaGVjayggSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvciggc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pKTsKLSAgV2luMzJDaGVjayggU2V0U2VjdXJpdHlEZXNjcmlwdG9yRGFjbCggc2QsIFRSVUUsIG5pbCwgRkFMU0UpKTsKLQotICBzYS5uTGVuZ3RoIDo9IHNpemVvZiggc2EpOwotICBzYS5scFNlY3VyaXR5RGVzY3JpcHRvciA6PSBzZDsKLSAgc2EuYkluaGVyaXRIYW5kbGUgICAgICAgOj0gVFJVRTsgLy9hbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAotCi0gIGlmIG5vdCBDcmVhdGVQaXBlKCBoQ0FSLCBoUGlwZVcsIEBzYSwgRkJ1ZlNpemUpIHRoZW4gYmVnaW4gICAvL2NyZWF0ZSBzdGRpbiBwaXBlCi0gICAgQ29uc29sZS5Xcml0ZUxpbmUoICdUUGlwZVNlcnZlciBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOwotICAgIEV4aXQ7Ci0gIGVuZDsKLQotICBpZiBub3QgQ3JlYXRlUGlwZSggaFBpcGUsIGhDQVcsIEBzYSwgRkJ1ZlNpemUpIHRoZW4gYmVnaW4gIC8vY3JlYXRlIHN0ZG91dCBwaXBlCi0gICAgQ29uc29sZS5Xcml0ZUxpbmUoICdUUGlwZVNlcnZlciBDcmVhdGVQaXBlIChhbm9uKSBmYWlsZWQsICcrU3lzRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcikpOwotICAgIENsb3NlSGFuZGxlKCBoQ0FSKTsKLSAgICBDbG9zZUhhbmRsZSggaFBpcGVXKTsKLSAgICBFeGl0OwotICBlbmQ7Ci0KLSAgRkNsaWVudEFub25SZWFkICA6PSBoQ0FSOwotICBGQ2xpZW50QW5vbldyaXRlIDo9IGhDQVc7Ci0gIEZIYW5kbGUgICAgICAgICAgOj0gaFBpcGU7Ci0gIEZXcml0ZUhhbmRsZSAgICAgOj0gaFBpcGVXOwotCi0gIHJlc3VsdCA6PSBUUlVFOwogZW5kOwogCiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKaW5kZXggMDY2NDc3Mi4uZGFkOWFiNyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKQEAgLTEsMTI1NSArMSwxNzE1IEBACi0oKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKikNCi0NCi0geyRTQ09QRURFTlVNUyBPTn0NCi0NCi11bml0IFRocmlmdC5UcmFuc3BvcnQ7DQotDQotaW50ZXJmYWNlDQotDQotdXNlcw0KLSAgQ2xhc3NlcywNCi0gIFN5c1V0aWxzLA0KLSAgU29ja2V0cywNCi0gIEdlbmVyaWNzLkNvbGxlY3Rpb25zLA0KLSAgVGhyaWZ0LkNvbGxlY3Rpb25zLA0KLSAgVGhyaWZ0LlV0aWxzLA0KLSAgVGhyaWZ0LlN0cmVhbSwNCi0gIEFjdGl2ZVgsDQotICBtc3htbDsNCi0NCi10eXBlDQotICBJVHJhbnNwb3J0ID0gaW50ZXJmYWNlDQotICAgIFsne0E0QTlGQzM3LUQ2MjAtNDREQy1BRDIxLTY2MkQxNjM2NENFNH0nXQ0KLSAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47DQotICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsNCi0gICAgZnVuY3Rpb24gUGVlazogQm9vbGVhbjsNCi0gICAgcHJvY2VkdXJlIE9wZW47DQotICAgIHByb2NlZHVyZSBDbG9zZTsNCi0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsNCi0gICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsNCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOw0KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOw0KLSAgICBwcm9jZWR1cmUgRmx1c2g7DQotICBlbmQ7DQotDQotICBUVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRyYW5zcG9ydCkNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47DQotICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47IHZpcnR1YWw7DQotICAgIHByb2NlZHVyZSBPcGVuKCk7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOw0KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7DQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0Ow0KLSAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7DQotICBlbmQ7DQotDQotICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIEV4Y2VwdGlvbiApDQotICBwdWJsaWMNCi0gICAgdHlwZQ0KLSAgICAgIFRFeGNlcHRpb25UeXBlID0gKA0KLSAgICAgICAgVW5rbm93biwNCi0gICAgICAgIE5vdE9wZW4sDQotICAgICAgICBBbHJlYWR5T3BlbiwNCi0gICAgICAgIFRpbWVkT3V0LA0KLSAgICAgICAgRW5kT2ZGaWxlDQotICAgICAgKTsNCi0gIHByaXZhdGUNCi0gICAgRlR5cGUgOiBURXhjZXB0aW9uVHlwZTsNCi0gIHB1YmxpYw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUeXBlOiBURXhjZXB0aW9uVHlwZSk7IG92ZXJsb2FkOw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IG1zZzogc3RyaW5nKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk7IG92ZXJsb2FkOw0KLSAgICBwcm9wZXJ0eSBUeXBlXzogVEV4Y2VwdGlvblR5cGUgcmVhZCBGVHlwZTsNCi0gIGVuZDsNCi0NCi0gIElIVFRQQ2xpZW50ID0gaW50ZXJmYWNlKCBJVHJhbnNwb3J0ICkNCi0gICAgWyd7MEY1REI4QUItNzEwRC00MzM4LUFBQzktNDZCNTczNEM1MDU3fSddDQotICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7DQotICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOw0KLSAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsNCi0gICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47DQotICAgIHByb2NlZHVyZSBTZW5kUmVxdWVzdDsNCi0gICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsNCi0gICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsNCi0gICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOw0KLSAgZW5kOw0KLQ0KLSAgVEhUVFBDbGllbnRJbXBsID0gY2xhc3MoIFRUcmFuc3BvcnRJbXBsLCBJSFRUUENsaWVudCkNCi0gIHByaXZhdGUNCi0gICAgRlVyaSA6IHN0cmluZzsNCi0gICAgRklucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsNCi0gICAgRk91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07DQotICAgIEZDb25uZWN0aW9uVGltZW91dCA6IEludGVnZXI7DQotICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7DQotICAgIEZDdXN0b21IZWFkZXJzIDogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47DQotDQotICAgIGZ1bmN0aW9uIENyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIENsb3NlKCk7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7DQotDQotICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7DQotICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOw0KLSAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOw0KLSAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsNCi0gICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47DQotICAgIHByb2NlZHVyZSBTZW5kUmVxdWVzdDsNCi0gICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsNCi0gICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsNCi0gICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVVyaTogc3RyaW5nKTsNCi0gICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsNCi0gIGVuZDsNCi0NCi0gIElTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UNCi0gICAgWyd7QkY2QjcwNDMtREEyMi00N0JGLThCMTEtMkI4OEVDNTVGRTEyfSddDQotICAgIHByb2NlZHVyZSBMaXN0ZW47DQotICAgIHByb2NlZHVyZSBDbG9zZTsNCi0gICAgZnVuY3Rpb24gQWNjZXB0OiBJVHJhbnNwb3J0Ow0KLSAgZW5kOw0KLQ0KLSAgVFNlcnZlclRyYW5zcG9ydEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTZXJ2ZXJUcmFuc3BvcnQpDQotICBwcm90ZWN0ZWQNCi0gICAgZnVuY3Rpb24gQWNjZXB0SW1wbDogSVRyYW5zcG9ydDsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICBwdWJsaWMNCi0gICAgcHJvY2VkdXJlIExpc3RlbjsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIHByb2NlZHVyZSBDbG9zZTsgdmlydHVhbDsgYWJzdHJhY3Q7DQotICAgIGZ1bmN0aW9uIEFjY2VwdDogSVRyYW5zcG9ydDsNCi0gIGVuZDsNCi0NCi0gIElUcmFuc3BvcnRGYWN0b3J5ID0gaW50ZXJmYWNlDQotICAgIFsne0REODA5NDQ2LTAwMEYtNDlFMS05QkZGLUUwRDBEQzc2QTlEN30nXQ0KLSAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7DQotICBlbmQ7DQotDQotICBUVHJhbnNwb3J0RmFjdG9yeUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUcmFuc3BvcnRGYWN0b3J5KQ0KLSAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IHZpcnR1YWw7DQotICBlbmQ7DQotDQotICBUVGNwU29ja2V0U3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApDQotICBwcml2YXRlDQotICAgIEZUY3BDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7DQotICBwcm90ZWN0ZWQNCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOw0KLQ0KLSAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOw0KLSAgICBmdW5jdGlvbiBUb0FycmF5OiBUQnl0ZXM7IG92ZXJyaWRlOw0KLSAgcHVibGljDQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50KTsNCi0gIGVuZDsNCi0NCi0gIElTdHJlYW1UcmFuc3BvcnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQ0KLSAgICBbJ3tBODQ3OUI0Ny0yQTNFLTQ0MjEtQTlBMC1ENUE5RURDQzYzNEF9J10NCi0gICAgZnVuY3Rpb24gR2V0SW5wdXRTdHJlYW06IElUaHJpZnRTdHJlYW07DQotICAgIGZ1bmN0aW9uIEdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsNCi0gICAgcHJvcGVydHkgSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0SW5wdXRTdHJlYW07DQotICAgIHByb3BlcnR5IE91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRPdXRwdXRTdHJlYW07DQotICBlbmQ7DQotDQotICBUU3RyZWFtVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCwgSVN0cmVhbVRyYW5zcG9ydCkNCi0gIHByb3RlY3RlZA0KLSAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOw0KLSAgICBGT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsNCi0gIHByb3RlY3RlZA0KLSAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOw0KLQ0KLSAgICBmdW5jdGlvbiBHZXRJbnB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsNCi0gICAgZnVuY3Rpb24gR2V0T3V0cHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOw0KLSAgcHVibGljDQotICAgIHByb3BlcnR5IElucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldElucHV0U3RyZWFtOw0KLSAgICBwcm9wZXJ0eSBPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0T3V0cHV0U3RyZWFtOw0KLQ0KLSAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsNCi0gICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsNCi0gIGVuZDsNCi0NCi0gIFRCdWZmZXJlZFN0cmVhbUltcGwgPSBjbGFzcyggVFRocmlmdFN0cmVhbUltcGwpDQotICBwcml2YXRlDQotICAgIEZTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOw0KLSAgICBGQnVmU2l6ZSA6IEludGVnZXI7DQotICAgIEZCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOw0KLSAgcHJvdGVjdGVkDQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBPcGVuOyAgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7DQotICBwdWJsaWMNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU3RyZWFtOiBJVGhyaWZ0U3RyZWFtOyBBQnVmU2l6ZTogSW50ZWdlcik7DQotICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7DQotICBlbmQ7DQotDQotICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkNCi0gIHByaXZhdGUNCi0gICAgRlNlcnZlciA6IFRUY3BTZXJ2ZXI7DQotICAgIEZQb3J0IDogSW50ZWdlcjsNCi0gICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOw0KLSAgICBGVXNlQnVmZmVyZWRTb2NrZXQgOiBCb29sZWFuOw0KLSAgICBGT3duc1NlcnZlciA6IEJvb2xlYW47DQotICBwcm90ZWN0ZWQNCi0gICAgZnVuY3Rpb24gQWNjZXB0SW1wbDogSVRyYW5zcG9ydDsgb3ZlcnJpZGU7DQotICBwdWJsaWMNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBU2VydmVyOiBUVGNwU2VydmVyICk7IG92ZXJsb2FkOw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRUY3BTZXJ2ZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVBvcnQ6IEludGVnZXIpOyBvdmVybG9hZDsNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIpOyBvdmVybG9hZDsNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXI7DQotICAgICAgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7IG92ZXJsb2FkOw0KLSAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOw0KLSAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsNCi0gICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsNCi0gIGVuZDsNCi0NCi0gIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwgKQ0KLSAgcHJpdmF0ZQ0KLSAgICBGSW5wdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOw0KLSAgICBGT3V0cHV0QnVmZmVyIDogSVRocmlmdFN0cmVhbTsNCi0gICAgRlRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7DQotICAgIEZCdWZTaXplIDogSW50ZWdlcjsNCi0NCi0gICAgcHJvY2VkdXJlIEluaXRCdWZmZXJzOw0KLSAgICBmdW5jdGlvbiBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0Ow0KLSAgcHJvdGVjdGVkDQotICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7DQotICBwdWJsaWMNCi0gICAgcHJvY2VkdXJlIE9wZW4oKTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQgKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7IEFCdWZTaXplOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7DQotICAgIHByb3BlcnR5IFVuZGVybHlpbmdUcmFuc3BvcnQ6IElUcmFuc3BvcnQgcmVhZCBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0Ow0KLSAgICBwcm9wZXJ0eSBJc09wZW46IEJvb2xlYW4gcmVhZCBHZXRJc09wZW47DQotICBlbmQ7DQotDQotICBUU29ja2V0SW1wbCA9IGNsYXNzKFRTdHJlYW1UcmFuc3BvcnRJbXBsKQ0KLSAgcHJpdmF0ZQ0KLSAgICBGQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50Ow0KLSAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47DQotICAgIEZIb3N0IDogc3RyaW5nOw0KLSAgICBGUG9ydCA6IEludGVnZXI7DQotICAgIEZUaW1lb3V0IDogSW50ZWdlcjsNCi0NCi0gICAgcHJvY2VkdXJlIEluaXRTb2NrZXQ7DQotICBwcm90ZWN0ZWQNCi0gICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsNCi0gIHB1YmxpYw0KLSAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUNsaWVudCA6IFRDdXN0b21JcENsaWVudCk7IG92ZXJsb2FkOw0KLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFIb3N0OiBzdHJpbmc7IEFQb3J0OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7DQotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQ6IEludGVnZXI7IEFUaW1lb3V0OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7DQotICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7DQotICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsNCi0gICAgcHJvcGVydHkgSG9zdCA6IHN0cmluZyByZWFkIEZIb3N0Ow0KLSAgICBwcm9wZXJ0eSBQb3J0OiBJbnRlZ2VyIHJlYWQgRlBvcnQ7DQotICBlbmQ7DQotDQotICBURnJhbWVkVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCkNCi0gIHByaXZhdGUgY29uc3QNCi0gICAgRkhlYWRlclNpemUgOiBJbnRlZ2VyID0gNDsNCi0gIHByaXZhdGUgY2xhc3MgdmFyDQotICAgIEZIZWFkZXJfRHVtbXkgOiBhcnJheSBvZiBCeXRlOw0KLSAgcHJvdGVjdGVkDQotICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0Ow0KLSAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOw0KLSAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07DQotDQotICAgIHByb2NlZHVyZSBJbml0V3JpdGVCdWZmZXI7DQotICAgIHByb2NlZHVyZSBSZWFkRnJhbWU7DQotICBwdWJsaWMNCi0gICAgdHlwZQ0KLSAgICAgIFRGYWN0b3J5ID0gY2xhc3MoIFRUcmFuc3BvcnRGYWN0b3J5SW1wbCApDQotICAgICAgcHVibGljDQotICAgICAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOw0KLSAgICAgIGVuZDsNCi0NCi17JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQ0KLSAgICBjbGFzcyBjb25zdHJ1Y3RvciBDcmVhdGU7DQoteyRJRkVORH0NCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsNCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsNCi0gICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsNCi0NCi0gICAgcHJvY2VkdXJlIE9wZW4oKTsgb3ZlcnJpZGU7DQotICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7DQotDQotICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsNCi0gICAgZnVuY3Rpb24gUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7DQotICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7DQotICBlbmQ7DQotDQoteyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfQ0KLXByb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOw0KLXskSUZFTkR9DQotDQotaW1wbGVtZW50YXRpb24NCi0NCi17IFRUcmFuc3BvcnRJbXBsIH0NCi0NCi1wcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuRmx1c2g7DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IElzT3BlbjsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZEFsbCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7DQotdmFyDQotICBnb3QgOiBJbnRlZ2VyOw0KLSAgcmV0IDogSW50ZWdlcjsNCi1iZWdpbg0KLSAgZ290IDo9IDA7DQotICB3aGlsZSAoIGdvdCA8IGxlbikgZG8NCi0gIGJlZ2luDQotICAgIHJldCA6PSBSZWFkKCBidWYsIG9mZiArIGdvdCwgbGVuIC0gZ290KTsNCi0gICAgaWYgKCByZXQgPD0gMCApIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggJ0Nhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkJyApOw0KLSAgICBlbmQ7DQotICAgIGdvdCA6PSBnb3QgKyByZXQ7DQotICBlbmQ7DQotICBSZXN1bHQgOj0gZ290Ow0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzKTsNCi1iZWdpbg0KLSAgU2VsZi5Xcml0ZSggYnVmLCAwLCBMZW5ndGgoYnVmKSApOw0KLWVuZDsNCi0NCi17IFRIVFRQQ2xpZW50SW1wbCB9DQotDQotcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5DbG9zZTsNCi1iZWdpbg0KLSAgRklucHV0U3RyZWFtIDo9IG5pbDsNCi0gIEZPdXRwdXRTdHJlYW0gOj0gbmlsOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUSFRUUENsaWVudEltcGwuQ3JlYXRlKGNvbnN0IEFVcmk6IHN0cmluZyk7DQotYmVnaW4NCi0gIGluaGVyaXRlZCBDcmVhdGU7DQotICBGVXJpIDo9IEFVcmk7DQotICBGQ3VzdG9tSGVhZGVycyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLHN0cmluZz4uQ3JlYXRlOw0KLSAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkNyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsNCi12YXINCi0gIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsNCi1iZWdpbg0KLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9DQotICBSZXN1bHQgOj0gQ29YTUxIVFRQLkNyZWF0ZTsNCi17JEVMU0V9DQotICBSZXN1bHQgOj0gQ29YTUxIVFRQUmVxdWVzdC5DcmVhdGU7DQoteyRJRkVORH0NCi0NCi0gIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7DQotICBSZXN1bHQuc2V0UmVxdWVzdEhlYWRlciggJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOw0KLSAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoICdBY2NlcHQnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKTsNCi0gIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsNCi0NCi0gIGZvciBwYWlyIGluIEZDdXN0b21IZWFkZXJzIGRvDQotICBiZWdpbg0KLSAgICBSZXN1bHQuc2V0UmVxdWVzdEhlYWRlciggcGFpci5LZXksIHBhaXIuVmFsdWUgKTsNCi0gIGVuZDsNCi1lbmQ7DQotDQotZGVzdHJ1Y3RvciBUSFRUUENsaWVudEltcGwuRGVzdHJveTsNCi1iZWdpbg0KLSAgQ2xvc2U7DQotICBpbmhlcml0ZWQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuRmx1c2g7DQotYmVnaW4NCi0gIHRyeQ0KLSAgICBTZW5kUmVxdWVzdDsNCi0gIGZpbmFsbHkNCi0gICAgRk91dHB1dFN0cmVhbSA6PSBuaWw7DQotICAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7DQotICBlbmQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+Ow0KLWJlZ2luDQotICBSZXN1bHQgOj0gRkN1c3RvbUhlYWRlcnM7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRJc09wZW46IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBUcnVlOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGUmVhZFRpbWVvdXQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUSFRUUENsaWVudEltcGwuUmVhZCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7DQotYmVnaW4NCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLA0KLSAgICAgICdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsNCi0gIGVuZDsNCi0gIHRyeQ0KLSAgICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIGJ1Ziwgb2ZmLCBsZW4gKQ0KLSAgZXhjZXB0DQotICAgIG9uIEU6IEV4Y2VwdGlvbiBkbw0KLSAgICBiZWdpbg0KLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLlVua25vd24sDQotICAgICAgICBFLk1lc3NhZ2UpOw0KLSAgICBlbmQ7DQotICBlbmQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2VuZFJlcXVlc3Q7DQotdmFyDQotICB4bWxodHRwIDogSVhNTEhUVFBSZXF1ZXN0Ow0KLSAgbXMgOiBUTWVtb3J5U3RyZWFtOw0KLSAgYSA6IFRCeXRlczsNCi0gIGxlbiA6IEludGVnZXI7DQotYmVnaW4NCi0gIHhtbGh0dHAgOj0gQ3JlYXRlUmVxdWVzdDsNCi0NCi0gIG1zIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOw0KLSAgdHJ5DQotICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5Ow0KLSAgICBsZW4gOj0gTGVuZ3RoKGEpOw0KLSAgICBpZiBsZW4gPiAwIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBtcy5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAYVswXSleLCBsZW4pOw0KLSAgICBlbmQ7DQotICAgIG1zLlBvc2l0aW9uIDo9IDA7DQotICAgIHhtbGh0dHAuc2VuZCggSVVua25vd24oIFRTdHJlYW1BZGFwdGVyLkNyZWF0ZSggbXMsIHNvUmVmZXJlbmNlICkpKTsNCi0gICAgRklucHV0U3RyZWFtIDo9IG5pbDsNCi0gICAgRklucHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLkNyZWF0ZSggSVVua25vd24oIHhtbGh0dHAucmVzcG9uc2VTdHJlYW0pIGFzIElTdHJlYW0pOw0KLSAgZmluYWxseQ0KLSAgICBtcy5GcmVlOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkNvbm5lY3Rpb25UaW1lb3V0IDo9IFZhbHVlOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRlJlYWRUaW1lb3V0IDo9IFZhbHVlDQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUSFRUUENsaWVudEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik7DQotYmVnaW4NCi0gIEZPdXRwdXRTdHJlYW0uV3JpdGUoIGJ1Ziwgb2ZmLCBsZW4pOw0KLWVuZDsNCi0NCi17IFRUcmFuc3BvcnRFeGNlcHRpb24gfQ0KLQ0KLWNvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk7DQotYmVnaW4NCi0gIENyZWF0ZSggQVR5cGUsICcnICkNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOw0KLSAgY29uc3QgbXNnOiBzdHJpbmcpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7DQotICBGVHlwZSA6PSBBVHlwZTsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoY29uc3QgbXNnOiBzdHJpbmcpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ3JlYXRlKG1zZyk7DQotZW5kOw0KLQ0KLXsgVFNlcnZlclRyYW5zcG9ydEltcGwgfQ0KLQ0KLWZ1bmN0aW9uIFRTZXJ2ZXJUcmFuc3BvcnRJbXBsLkFjY2VwdDogSVRyYW5zcG9ydDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEFjY2VwdEltcGw7DQotICBpZiBSZXN1bHQgPSBuaWwgdGhlbg0KLSAgYmVnaW4NCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoICdhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMJyApOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi17IFRUcmFuc3BvcnRGYWN0b3J5SW1wbCB9DQotDQotZnVuY3Rpb24gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEFUcmFuczsNCi1lbmQ7DQotDQoteyBUU2VydmVyU29ja2V0IH0NCi0NCi1jb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRUY3BTZXJ2ZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRlNlcnZlciA6PSBBU2VydmVyOw0KLSAgRkNsaWVudFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcik7DQotYmVnaW4NCi0gIENyZWF0ZSggQVNlcnZlciwgMCApOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBDcmVhdGUoIEFQb3J0LCAwICk7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRTZXJ2ZXJTb2NrZXRJbXBsLkFjY2VwdEltcGw6IElUcmFuc3BvcnQ7DQotdmFyDQotICByZXQgOiBUQ3VzdG9tSXBDbGllbnQ7DQotICByZXQyIDogSVN0cmVhbVRyYW5zcG9ydDsNCi0gIHJldDMgOiBJVHJhbnNwb3J0Ow0KLWJlZ2luDQotICBpZiBGU2VydmVyID0gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sDQotICAgICAgJ05vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4nKTsNCi0gIGVuZDsNCi0NCi0gIHRyeQ0KLSAgICByZXQgOj0gVEN1c3RvbUlwQ2xpZW50LkNyZWF0ZShuaWwpOw0KLSAgICBpZiAoIG5vdCBGU2VydmVyLkFjY2VwdCggcmV0ICkpIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICByZXQuRnJlZTsNCi0gICAgICBSZXN1bHQgOj0gbmlsOw0KLSAgICAgIEV4aXQ7DQotICAgIGVuZDsNCi0NCi0gICAgaWYgcmV0ID0gbmlsIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBSZXN1bHQgOj0gbmlsOw0KLSAgICAgIEV4aXQ7DQotICAgIGVuZDsNCi0NCi0gICAgcmV0MiA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIHJldCApOw0KLSAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbg0KLSAgICBiZWdpbg0KLSAgICAgIHJldDMgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUocmV0Mik7DQotICAgICAgUmVzdWx0IDo9IHJldDM7DQotICAgIGVuZCBlbHNlDQotICAgIGJlZ2luDQotICAgICAgUmVzdWx0IDo9IHJldDI7DQotICAgIGVuZDsNCi0NCi0gIGV4Y2VwdA0KLSAgICBvbiBFOiBFeGNlcHRpb24gZG8NCi0gICAgYmVnaW4NCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggRS5Ub1N0cmluZyApOw0KLSAgICBlbmQ7DQotICBlbmQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5DbG9zZTsNCi1iZWdpbg0KLSAgaWYgRlNlcnZlciA8PiBuaWwgdGhlbg0KLSAgYmVnaW4NCi0gICAgdHJ5DQotICAgICAgRlNlcnZlci5BY3RpdmUgOj0gRmFsc2U7DQotICAgIGV4Y2VwdA0KLSAgICAgIG9uIEU6IEV4Y2VwdGlvbiBkbw0KLSAgICAgIGJlZ2luDQotICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSgnRXJyb3Igb24gY2xvc2luZyBzb2NrZXQgOiAnICsgRS5NZXNzYWdlKTsNCi0gICAgICBlbmQ7DQotICAgIGVuZDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsNCi0gIEFVc2VCdWZmZXJlZFNvY2tldHM6IEJvb2xlYW4pOw0KLWJlZ2luDQotICBGUG9ydCA6PSBBUG9ydDsNCi0gIEZDbGllbnRUaW1lb3V0IDo9IEFDbGllbnRUaW1lb3V0Ow0KLSAgRlVzZUJ1ZmZlcmVkU29ja2V0IDo9IEFVc2VCdWZmZXJlZFNvY2tldHM7DQotICBGT3duc1NlcnZlciA6PSBUcnVlOw0KLSAgRlNlcnZlciA6PSBUVGNwU2VydmVyLkNyZWF0ZSggbmlsICk7DQotICBGU2VydmVyLkJsb2NrTW9kZSA6PSBibUJsb2NraW5nOw0KLXskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9DQotICBGU2VydmVyLkxvY2FsUG9ydCA6PSBBbnNpU3RyaW5nKCBJbnRUb1N0ciggRlBvcnQpKTsNCi17JEVMU0V9DQotICBGU2VydmVyLkxvY2FsUG9ydCA6PSBJbnRUb1N0ciggRlBvcnQpOw0KLXskSUZFTkR9DQotZW5kOw0KLQ0KLWRlc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuRGVzdHJveTsNCi1iZWdpbg0KLSAgaWYgRk93bnNTZXJ2ZXIgdGhlbg0KLSAgYmVnaW4NCi0gICAgRlNlcnZlci5GcmVlOw0KLSAgZW5kOw0KLSAgaW5oZXJpdGVkOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFNlcnZlclNvY2tldEltcGwuTGlzdGVuOw0KLWJlZ2luDQotICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICB0cnkNCi0gICAgICBGU2VydmVyLkFjdGl2ZSA6PSBUcnVlOw0KLSAgICBleGNlcHQNCi0gICAgICBvbiBFOiBFeGNlcHRpb24gZG8NCi0gICAgICBiZWdpbg0KLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoJ0NvdWxkIG5vdCBhY2NlcHQgb24gbGlzdGVuaW5nIHNvY2tldDogJyArIEUuTWVzc2FnZSk7DQotICAgICAgZW5kOw0KLSAgICBlbmQ7DQotICBlbmQ7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZShBUG9ydCwgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBDcmVhdGUoIEFQb3J0LCBBQ2xpZW50VGltZW91dCwgRmFsc2UgKTsNCi1lbmQ7DQotDQoteyBUU29ja2V0IH0NCi0NCi1jb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQpOw0KLXZhcg0KLSAgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsNCi1iZWdpbg0KLSAgRkNsaWVudCA6PSBBQ2xpZW50Ow0KLSAgc3RyZWFtIDo9IFRUY3BTb2NrZXRTdHJlYW1JbXBsLkNyZWF0ZSggRkNsaWVudCk7DQotICBGSW5wdXRTdHJlYW0gOj0gc3RyZWFtOw0KLSAgRk91dHB1dFN0cmVhbSA6PSBzdHJlYW07DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcik7DQotYmVnaW4NCi0gIENyZWF0ZSggQUhvc3QsIEFQb3J0LCAwKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRTb2NrZXRJbXBsLkNsb3NlOw0KLWJlZ2luDQotICBpbmhlcml0ZWQgQ2xvc2U7DQotICBpZiBGQ2xpZW50IDw+IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICBGQ2xpZW50LkZyZWU7DQotICAgIEZDbGllbnQgOj0gbmlsOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgRkhvc3QgOj0gQUhvc3Q7DQotICBGUG9ydCA6PSBBUG9ydDsNCi0gIEZUaW1lb3V0IDo9IEFUaW1lb3V0Ow0KLSAgSW5pdFNvY2tldDsNCi1lbmQ7DQotDQotZGVzdHJ1Y3RvciBUU29ja2V0SW1wbC5EZXN0cm95Ow0KLWJlZ2luDQotICBpZiBGT3duc0NsaWVudCB0aGVuDQotICBiZWdpbg0KLSAgICBGQ2xpZW50LkZyZWU7DQotICBlbmQ7DQotICBpbmhlcml0ZWQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRTb2NrZXRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IEZhbHNlOw0KLSAgaWYgRkNsaWVudCA8PiBuaWwgdGhlbg0KLSAgYmVnaW4NCi0gICAgUmVzdWx0IDo9IEZDbGllbnQuQ29ubmVjdGVkOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFNvY2tldEltcGwuSW5pdFNvY2tldDsNCi12YXINCi0gIHN0cmVhbSA6IElUaHJpZnRTdHJlYW07DQotYmVnaW4NCi0gIGlmIEZDbGllbnQgPD4gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIGlmIEZPd25zQ2xpZW50IHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBGQ2xpZW50LkZyZWU7DQotICAgICAgRkNsaWVudCA6PSBuaWw7DQotICAgIGVuZDsNCi0gIGVuZDsNCi0gIEZDbGllbnQgOj0gVFRjcENsaWVudC5DcmVhdGUoIG5pbCApOw0KLSAgRk93bnNDbGllbnQgOj0gVHJ1ZTsNCi0NCi0gIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQpOw0KLSAgRklucHV0U3RyZWFtIDo9IHN0cmVhbTsNCi0gIEZPdXRwdXRTdHJlYW0gOj0gc3RyZWFtOw0KLQ0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFNvY2tldEltcGwuT3BlbjsNCi1iZWdpbg0KLSAgaWYgSXNPcGVuIHRoZW4NCi0gIGJlZ2luDQotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuLA0KLSAgICAgICdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnKTsNCi0gIGVuZDsNCi0NCi0gIGlmIEZIb3N0ID0gICcnIHRoZW4NCi0gIGJlZ2luDQotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sDQotICAgICAgJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcpOw0KLSAgZW5kOw0KLQ0KLSAgaWYgUG9ydCA8PSAwIHRoZW4NCi0gIGJlZ2luDQotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sDQotICAgICAgJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcpOw0KLSAgZW5kOw0KLQ0KLSAgaWYgRkNsaWVudCA9IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICBJbml0U29ja2V0Ow0KLSAgZW5kOw0KLQ0KLSAgRkNsaWVudC5SZW1vdGVIb3N0IDo9IFRTb2NrZXRIb3N0KCBIb3N0KTsNCi0gIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsNCi0gIEZDbGllbnQuQ29ubmVjdDsNCi0NCi0gIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQpOw0KLSAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07DQotZW5kOw0KLQ0KLXsgVEJ1ZmZlcmVkU3RyZWFtIH0NCi0NCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DbG9zZTsNCi1iZWdpbg0KLSAgRmx1c2g7DQotICBGU3RyZWFtIDo9IG5pbDsNCi0gIEZCdWZmZXIuRnJlZTsNCi0gIEZCdWZmZXIgOj0gbmlsOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOw0KLWJlZ2luDQotICBGU3RyZWFtIDo9IEFTdHJlYW07DQotICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsNCi0gIEZCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7DQotZW5kOw0KLQ0KLWRlc3RydWN0b3IgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5EZXN0cm95Ow0KLWJlZ2luDQotICBDbG9zZTsNCi0gIGluaGVyaXRlZDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuRmx1c2g7DQotdmFyDQotICBidWYgOiBUQnl0ZXM7DQotICBsZW4gOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBpZiBJc09wZW4gdGhlbg0KLSAgYmVnaW4NCi0gICAgbGVuIDo9IEZCdWZmZXIuU2l6ZTsNCi0gICAgaWYgbGVuID4gMCB0aGVuDQotICAgIGJlZ2luDQotICAgICAgU2V0TGVuZ3RoKCBidWYsIGxlbiApOw0KLSAgICAgIEZCdWZmZXIuUG9zaXRpb24gOj0gMDsNCi0gICAgICBGQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZlswXSleLCBsZW4gKTsNCi0gICAgICBGU3RyZWFtLldyaXRlKCBidWYsIDAsIGxlbiApOw0KLSAgICBlbmQ7DQotICAgIEZCdWZmZXIuQ2xlYXI7DQotICBlbmQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRCdWZmZXJlZFN0cmVhbUltcGwuSXNPcGVuOiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gKEZCdWZmZXIgPD4gbmlsKSBhbmQgKCBGU3RyZWFtIDw+IG5pbCk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLk9wZW47DQotYmVnaW4NCi0NCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOw0KLXZhcg0KLSAgblJlYWQgOiBJbnRlZ2VyOw0KLSAgdGVtcGJ1ZiA6IFRCeXRlczsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkOw0KLSAgUmVzdWx0IDo9IDA7DQotICBpZiBjb3VudCA+IDAgdGhlbg0KLSAgYmVnaW4NCi0gICAgaWYgSXNPcGVuIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBpZiBGQnVmZmVyLlBvc2l0aW9uID49IEZCdWZmZXIuU2l6ZSB0aGVuDQotICAgICAgYmVnaW4NCi0gICAgICAgIEZCdWZmZXIuQ2xlYXI7DQotICAgICAgICBTZXRMZW5ndGgoIHRlbXBidWYsIEZCdWZTaXplKTsNCi0gICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsNCi0gICAgICAgIGlmIG5SZWFkID4gMCB0aGVuDQotICAgICAgICBiZWdpbg0KLSAgICAgICAgICBGQnVmZmVyLldyaXRlQnVmZmVyKCBQb2ludGVyKEB0ZW1wYnVmWzBdKV4sIG5SZWFkICk7DQotICAgICAgICAgIEZCdWZmZXIuUG9zaXRpb24gOj0gMDsNCi0gICAgICAgIGVuZDsNCi0gICAgICBlbmQ7DQotDQotICAgICAgaWYgRkJ1ZmZlci5Qb3NpdGlvbiA8IEZCdWZmZXIuU2l6ZSB0aGVuDQotICAgICAgYmVnaW4NCi0gICAgICAgIFJlc3VsdCA6PSBGQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50ICk7DQotICAgICAgZW5kOw0KLSAgICBlbmQ7DQotICBlbmQ7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRCdWZmZXJlZFN0cmVhbUltcGwuVG9BcnJheTogVEJ5dGVzOw0KLXZhcg0KLSAgbGVuIDogSW50ZWdlcjsNCi1iZWdpbg0KLSAgbGVuIDo9IDA7DQotDQotICBpZiBJc09wZW4gdGhlbg0KLSAgYmVnaW4NCi0gICAgbGVuIDo9IEZCdWZmZXIuU2l6ZTsNCi0gIGVuZDsNCi0NCi0gIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOw0KLQ0KLSAgaWYgbGVuID4gMCB0aGVuDQotICBiZWdpbg0KLSAgICBGQnVmZmVyLlBvc2l0aW9uIDo9IDA7DQotICAgIEZCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQ7DQotICBpZiBjb3VudCA+IDAgdGhlbg0KLSAgYmVnaW4NCi0gICAgaWYgSXNPcGVuIHRoZW4NCi0gICAgYmVnaW4NCi0gICAgICBGQnVmZmVyLldyaXRlKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBjb3VudCApOw0KLSAgICAgIGlmIEZCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4NCi0gICAgICBiZWdpbg0KLSAgICAgICAgRmx1c2g7DQotICAgICAgZW5kOw0KLSAgICBlbmQ7DQotICBlbmQ7DQotZW5kOw0KLQ0KLXsgVFN0cmVhbVRyYW5zcG9ydEltcGwgfQ0KLQ0KLXByb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsNCi1iZWdpbg0KLSAgaWYgRklucHV0U3RyZWFtIDw+IEZPdXRwdXRTdHJlYW0gdGhlbg0KLSAgYmVnaW4NCi0gICAgaWYgRklucHV0U3RyZWFtIDw+IG5pbCB0aGVuDQotICAgIGJlZ2luDQotICAgICAgRklucHV0U3RyZWFtIDo9IG5pbDsNCi0gICAgZW5kOw0KLSAgICBpZiBGT3V0cHV0U3RyZWFtIDw+IG5pbCB0aGVuDQotICAgIGJlZ2luDQotICAgICAgRk91dHB1dFN0cmVhbSA6PSBuaWw7DQotICAgIGVuZDsNCi0gIGVuZCBlbHNlDQotICBiZWdpbg0KLSAgICBGSW5wdXRTdHJlYW0gOj0gbmlsOw0KLSAgICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOyBjb25zdCBBT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSk7DQotYmVnaW4NCi0gIEZJbnB1dFN0cmVhbSA6PSBBSW5wdXRTdHJlYW07DQotICBGT3V0cHV0U3RyZWFtIDo9IEFPdXRwdXRTdHJlYW07DQotZW5kOw0KLQ0KLWRlc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuRGVzdHJveTsNCi1iZWdpbg0KLSAgRklucHV0U3RyZWFtIDo9IG5pbDsNCi0gIEZPdXRwdXRTdHJlYW0gOj0gbmlsOw0KLSAgaW5oZXJpdGVkOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuRmx1c2g7DQotYmVnaW4NCi0gIGlmIEZPdXRwdXRTdHJlYW0gPSBuaWwgdGhlbg0KLSAgYmVnaW4NCi0gICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoIFRUcmFuc3BvcnRFeGNlcHRpb24uVEV4Y2VwdGlvblR5cGUuTm90T3BlbiwgJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsNCi0gIGVuZDsNCi0NCi0gIEZPdXRwdXRTdHJlYW0uRmx1c2g7DQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBUcnVlOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5HZXRPdXRwdXRTdHJlYW06IElUaHJpZnRTdHJlYW07DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW07DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5PcGVuOw0KLWJlZ2luDQotDQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7DQotYmVnaW4NCi0gIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZSggVFRyYW5zcG9ydEV4Y2VwdGlvbi5URXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAnQ2Fubm90IHJlYWQgZnJvbSBudWxsIGlucHV0c3RyZWFtJyApOw0KLSAgZW5kOw0KLSAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBidWYsIG9mZiwgbGVuICk7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5Xcml0ZShjb25zdCBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOw0KLWJlZ2luDQotICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24uQ3JlYXRlKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlRFeGNlcHRpb25UeXBlLk5vdE9wZW4sICdDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0nICk7DQotICBlbmQ7DQotDQotICBGT3V0cHV0U3RyZWFtLldyaXRlKCBidWYsIG9mZiwgbGVuICk7DQotZW5kOw0KLQ0KLXsgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbCB9DQotDQotY29uc3RydWN0b3IgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElTdHJlYW1UcmFuc3BvcnQpOw0KLWJlZ2luDQotICBDcmVhdGUoIEFUcmFuc3BvcnQsIDEwMjQgKTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ2xvc2U7DQotYmVnaW4NCi0gIEZUcmFuc3BvcnQuQ2xvc2U7DQotZW5kOw0KLQ0KLWNvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0Ow0KLSAgQUJ1ZlNpemU6IEludGVnZXIpOw0KLWJlZ2luDQotICBGVHJhbnNwb3J0IDo9IEFUcmFuc3BvcnQ7DQotICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsNCi0gIEluaXRCdWZmZXJzOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5GbHVzaDsNCi1iZWdpbg0KLSAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbg0KLSAgYmVnaW4NCi0gICAgRk91dHB1dEJ1ZmZlci5GbHVzaDsNCi0gIGVuZDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5HZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0Ow0KLWJlZ2luDQotICBSZXN1bHQgOj0gRlRyYW5zcG9ydDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuSW5pdEJ1ZmZlcnM7DQotYmVnaW4NCi0gIGlmIEZUcmFuc3BvcnQuSW5wdXRTdHJlYW0gPD4gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsNCi0gIGVuZDsNCi0gIGlmIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtIDw+IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICBGT3V0cHV0QnVmZmVyIDo9IFRCdWZmZXJlZFN0cmVhbUltcGwuQ3JlYXRlKCBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsNCi0gIGVuZDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuT3BlbjsNCi1iZWdpbg0KLSAgRlRyYW5zcG9ydC5PcGVuDQotZW5kOw0KLQ0KLWZ1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IDA7DQotICBpZiBGSW5wdXRCdWZmZXIgPD4gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggYnVmLCBvZmYsIGxlbiApOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5Xcml0ZShjb25zdCBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOw0KLWJlZ2luDQotICBpZiBGT3V0cHV0QnVmZmVyIDw+IG5pbCB0aGVuDQotICBiZWdpbg0KLSAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBidWYsIG9mZiwgbGVuICk7DQotICBlbmQ7DQotZW5kOw0KLQ0KLXsgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQ0KLQ0KLXskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjEuMH0NCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsNCi1iZWdpbg0KLSAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7DQotICBGaWxsQ2hhciggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teVswXSwNCi0gICAgTGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsNCi1lbmQ7DQoteyRFTFNFfQ0KLWNsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsNCi1iZWdpbg0KLSAgU2V0TGVuZ3RoKCBGSGVhZGVyX0R1bW15LCBGSGVhZGVyU2l6ZSk7DQotICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsNCi1lbmQ7DQoteyRJRkVORH0NCi0NCi1jb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7DQotYmVnaW4NCi0gIEluaXRXcml0ZUJ1ZmZlcjsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNsb3NlOw0KLWJlZ2luDQotICBGVHJhbnNwb3J0LkNsb3NlOw0KLWVuZDsNCi0NCi1jb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk7DQotYmVnaW4NCi0gIEluaXRXcml0ZUJ1ZmZlcjsNCi0gIEZUcmFuc3BvcnQgOj0gQVRyYW5zOw0KLWVuZDsNCi0NCi1kZXN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkRlc3Ryb3k7DQotYmVnaW4NCi0gIEZXcml0ZUJ1ZmZlci5GcmVlOw0KLSAgRlJlYWRCdWZmZXIuRnJlZTsNCi0gIGluaGVyaXRlZDsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkZsdXNoOw0KLXZhcg0KLSAgYnVmIDogVEJ5dGVzOw0KLSAgbGVuIDogSW50ZWdlcjsNCi0gIGRhdGFfbGVuIDogSW50ZWdlcjsNCi0NCi1iZWdpbg0KLSAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOw0KLSAgU2V0TGVuZ3RoKCBidWYsIGxlbik7DQotICBpZiBsZW4gPiAwIHRoZW4NCi0gIGJlZ2luDQotICAgIFN5c3RlbS5Nb3ZlKCBGV3JpdGVCdWZmZXIuTWVtb3J5XiwgYnVmWzBdLCBsZW4gKTsNCi0gIGVuZDsNCi0NCi0gIGRhdGFfbGVuIDo9IGxlbiAtIEZIZWFkZXJTaXplOw0KLSAgaWYgKGRhdGFfbGVuIDwgMCkgdGhlbg0KLSAgYmVnaW4NCi0gICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSggJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsNCi0gIGVuZDsNCi0NCi0gIEluaXRXcml0ZUJ1ZmZlcjsNCi0NCi0gIGJ1ZlswXSA6PSBCeXRlKCRGRiBhbmQgKGRhdGFfbGVuIHNociAyNCkpOw0KLSAgYnVmWzFdIDo9IEJ5dGUoJEZGIGFuZCAoZGF0YV9sZW4gc2hyIDE2KSk7DQotICBidWZbMl0gOj0gQnl0ZSgkRkYgYW5kIChkYXRhX2xlbiBzaHIgOCkpOw0KLSAgYnVmWzNdIDo9IEJ5dGUoJEZGIGFuZCBkYXRhX2xlbik7DQotDQotICBGVHJhbnNwb3J0LldyaXRlKCBidWYsIDAsIGxlbiApOw0KLSAgRlRyYW5zcG9ydC5GbHVzaDsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOw0KLWJlZ2luDQotICBSZXN1bHQgOj0gRlRyYW5zcG9ydC5Jc09wZW47DQotZW5kOw0KLQ0KLXR5cGUNCi0gIFRBY2Nlc3NNZW1vcnlTdHJlYW0gPSBjbGFzcyhUTWVtb3J5U3RyZWFtKQ0KLSAgZW5kOw0KLQ0KLXByb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Jbml0V3JpdGVCdWZmZXI7DQotYmVnaW4NCi0gIEZXcml0ZUJ1ZmZlci5GcmVlOw0KLSAgRldyaXRlQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOw0KLSAgVEFjY2Vzc01lbW9yeVN0cmVhbShGV3JpdGVCdWZmZXIpLkNhcGFjaXR5IDo9IDEwMjQ7DQotICBGV3JpdGVCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQEZIZWFkZXJfRHVtbXlbMF0pXiwgRkhlYWRlclNpemUpOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuT3BlbjsNCi1iZWdpbg0KLSAgRlRyYW5zcG9ydC5PcGVuOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOw0KLXZhcg0KLSAgZ290IDogSW50ZWdlcjsNCi1iZWdpbg0KLSAgaWYgRlJlYWRCdWZmZXIgPD4gbmlsIHRoZW4NCi0gIGJlZ2luDQotICAgIGlmIGxlbiA+IDANCi0gICAgdGhlbiBnb3QgOj0gRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAYnVmW29mZl0pXiwgbGVuICkNCi0gICAgZWxzZSBnb3QgOj0gMDsNCi0gICAgaWYgZ290ID4gMCB0aGVuDQotICAgIGJlZ2luDQotICAgICAgUmVzdWx0IDo9IGdvdDsNCi0gICAgICBFeGl0Ow0KLSAgICBlbmQ7DQotICBlbmQ7DQotDQotICBSZWFkRnJhbWU7DQotICBpZiBsZW4gPiAwDQotICB0aGVuIFJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbb2ZmXSleLCBsZW4pDQotICBlbHNlIFJlc3VsdCA6PSAwOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuUmVhZEZyYW1lOw0KLXZhcg0KLSAgaTMycmQgOiBUQnl0ZXM7DQotICBzaXplIDogSW50ZWdlcjsNCi0gIGJ1ZmYgOiBUQnl0ZXM7DQotYmVnaW4NCi0gIFNldExlbmd0aCggaTMycmQsIEZIZWFkZXJTaXplICk7DQotICBGVHJhbnNwb3J0LlJlYWRBbGwoIGkzMnJkLCAwLCBGSGVhZGVyU2l6ZSk7DQotICBzaXplIDo9DQotICAgICgoaTMycmRbMF0gYW5kICRGRikgc2hsIDI0KSBvcg0KLSAgICAoKGkzMnJkWzFdIGFuZCAkRkYpIHNobCAxNikgb3INCi0gICAgKChpMzJyZFsyXSBhbmQgJEZGKSBzaGwgOCkgb3INCi0gICAgIChpMzJyZFszXSBhbmQgJEZGKTsNCi0gIFNldExlbmd0aCggYnVmZiwgc2l6ZSApOw0KLSAgRlRyYW5zcG9ydC5SZWFkQWxsKCBidWZmLCAwLCBzaXplICk7DQotICBGUmVhZEJ1ZmZlci5GcmVlOw0KLSAgRlJlYWRCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7DQotICBGUmVhZEJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmZlswXSleLCBzaXplICk7DQotICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsNCi1iZWdpbg0KLSAgaWYgbGVuID4gMA0KLSAgdGhlbiBGV3JpdGVCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZltvZmZdKV4sIGxlbiApOw0KLWVuZDsNCi0NCi17IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQ0KLQ0KLWZ1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRJbXBsLlRGYWN0b3J5LkdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsNCi1iZWdpbg0KLSAgUmVzdWx0IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggQVRyYW5zICk7DQotZW5kOw0KLQ0KLXsgVFRjcFNvY2tldFN0cmVhbUltcGwgfQ0KLQ0KLXByb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DbG9zZTsNCi1iZWdpbg0KLSAgRlRjcENsaWVudC5DbG9zZTsNCi1lbmQ7DQotDQotY29uc3RydWN0b3IgVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUQ3VzdG9tSXBDbGllbnQpOw0KLWJlZ2luDQotICBGVGNwQ2xpZW50IDo9IEFUY3BDbGllbnQ7DQotZW5kOw0KLQ0KLXByb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5GbHVzaDsNCi1iZWdpbg0KLQ0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Jc09wZW46IEJvb2xlYW47DQotYmVnaW4NCi0gIFJlc3VsdCA6PSBGVGNwQ2xpZW50LkFjdGl2ZTsNCi1lbmQ7DQotDQotcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLk9wZW47DQotYmVnaW4NCi0gIEZUY3BDbGllbnQuT3BlbjsNCi1lbmQ7DQotDQotZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwNCi0gIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsNCi1iZWdpbg0KLSAgaW5oZXJpdGVkOw0KLSAgUmVzdWx0IDo9IEZUY3BDbGllbnQuUmVjZWl2ZUJ1ZiggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQpOw0KLWVuZDsNCi0NCi1mdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Ub0FycmF5OiBUQnl0ZXM7DQotdmFyDQotICBsZW4gOiBJbnRlZ2VyOw0KLWJlZ2luDQotICBsZW4gOj0gMDsNCi0gIGlmIElzT3BlbiB0aGVuDQotICBiZWdpbg0KLSAgICBsZW4gOj0gRlRjcENsaWVudC5CeXRlc1JlY2VpdmVkOw0KLSAgZW5kOw0KLQ0KLSAgU2V0TGVuZ3RoKCBSZXN1bHQsIGxlbiApOw0KLQ0KLSAgaWYgbGVuID4gMCB0aGVuDQotICBiZWdpbg0KLSAgICBGVGNwQ2xpZW50LlJlY2VpdmVCdWYoIFBvaW50ZXIoQFJlc3VsdFswXSleLCBsZW4pOw0KLSAgZW5kOw0KLWVuZDsNCi0NCi1wcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOw0KLWJlZ2luDQotICBpbmhlcml0ZWQ7DQotICBGVGNwQ2xpZW50LlNlbmRCdWYoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50KTsNCi1lbmQ7DQotDQoteyRJRiBDb21waWxlclZlcnNpb24gPCAyMS4wfQ0KLWluaXRpYWxpemF0aW9uDQotYmVnaW4NCi0gIFRGcmFtZWRUcmFuc3BvcnRJbXBsX0luaXRpYWxpemU7DQotZW5kOw0KLXskSUZFTkR9DQotDQotDQotZW5kLg0KKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKK3VuaXQgVGhyaWZ0LlRyYW5zcG9ydDsKKworeyRJIFRocmlmdC5EZWZpbmVzLmluY30KK3skU0NPUEVERU5VTVMgT059CisKK2ludGVyZmFjZQorCit1c2VzCisgIENsYXNzZXMsCisgIFN5c1V0aWxzLAorICBNYXRoLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICBBY3RpdmVYLCBtc3htbCwgV2luU29jaywgU29ja2V0cywKKyAgeyRFTFNFfQorICAgIFdpbmFwaS5BY3RpdmVYLCBXaW5hcGkubXN4bWwsIFdpbmFwaS5XaW5Tb2NrLAorICAgIHskSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgICBXZWIuV2luLlNvY2tldHMsCisgICAgeyRFTFNFfQorICAgICAgVGhyaWZ0LlNvY2tldCwKKyAgICB7JEVORElGfQorICB7JEVORElGfQorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LlN0cmVhbTsKKwordHlwZQorICBJVHJhbnNwb3J0ID0gaW50ZXJmYWNlCisgICAgWyd7REI4NDk2MUUtOEJCMy00NTMyLTk5RTEtQThDN0FDMjMwMEY3fSddCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOworICAgIHByb2NlZHVyZSBPcGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBGbHVzaDsKKyAgZW5kOworCisgIFRUcmFuc3BvcnRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVHJhbnNwb3J0KQorICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBPcGVuKCk7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIHByb2NlZHVyZSBDbG9zZSgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIHR5cGUKKyAgICAgIFRFeGNlcHRpb25UeXBlID0gKAorICAgICAgICBVbmtub3duLAorICAgICAgICBOb3RPcGVuLAorICAgICAgICBBbHJlYWR5T3BlbiwKKyAgICAgICAgVGltZWRPdXQsCisgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgQmFkQXJncywKKyAgICAgICAgSW50ZXJydXB0ZWQKKyAgICAgICk7CisgIHByaXZhdGUKKyAgICBmdW5jdGlvbiBHZXRUeXBlOiBURXhjZXB0aW9uVHlwZTsKKyAgcHJvdGVjdGVkCisgICAgY29uc3RydWN0b3IgSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKKyAgcHVibGljCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUVHJhbnNwb3J0RXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRUcmFuc3BvcnRFeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKyAgICBjbGFzcyBmdW5jdGlvbiBDcmVhdGUoIGNvbnN0IG1zZzogc3RyaW5nKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsgcmVpbnRyb2R1Y2U7IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247IG92ZXJsb2FkOyBkZXByZWNhdGVkICdVc2Ugc3BlY2lhbGl6ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIHByb3BlcnR5IFR5cGVfOiBURXhjZXB0aW9uVHlwZSByZWFkIEdldFR5cGU7CisgIGVuZDsKKworICAvLyBOZWVkZWQgdG8gcmVtb3ZlIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CisgIGVuZDsKKworICBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93biA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3BlbiA9IGNsYXNzIChUVHJhbnNwb3J0RXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUVHJhbnNwb3J0RXhjZXB0aW9uQWxyZWFkeU9wZW4gPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0ID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkID0gY2xhc3MgKFRUcmFuc3BvcnRFeGNlcHRpb25TcGVjaWFsaXplZCk7CisKKyAgSUhUVFBDbGllbnQgPSBpbnRlcmZhY2UoIElUcmFuc3BvcnQgKQorICAgIFsne0JBMTQyRDEyLThBRTYtNEI1MC05RTMzLTZCNzg0M0IyMUQ3M30nXQorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworCisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKKyAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CisgIGVuZDsKKworICBUSFRUUENsaWVudEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwsIElIVFRQQ2xpZW50KQorICBwcml2YXRlCisgICAgRlVyaSA6IHN0cmluZzsKKyAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZEbnNSZXNvbHZlVGltZW91dCA6IEludGVnZXI7CisgICAgRkNvbm5lY3Rpb25UaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGU2VuZFRpbWVvdXQgOiBJbnRlZ2VyOworICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7CisgICAgRkN1c3RvbUhlYWRlcnMgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKKworICAgIGZ1bmN0aW9uIENyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3BlbigpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0Q29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXI7CisgICAgcHJvY2VkdXJlIFNldFNlbmRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXRTZW5kVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOworCisgICAgZnVuY3Rpb24gR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CisgICAgcHJvY2VkdXJlIFNlbmRSZXF1ZXN0OworICAgIHByb3BlcnR5IERuc1Jlc29sdmVUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0RG5zUmVzb2x2ZVRpbWVvdXQgd3JpdGUgU2V0RG5zUmVzb2x2ZVRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ29ubmVjdGlvblRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRDb25uZWN0aW9uVGltZW91dCB3cml0ZSBTZXRDb25uZWN0aW9uVGltZW91dDsKKyAgICBwcm9wZXJ0eSBTZW5kVGltZW91dDogSW50ZWdlciByZWFkIEdldFNlbmRUaW1lb3V0IHdyaXRlIFNldFNlbmRUaW1lb3V0OworICAgIHByb3BlcnR5IFJlYWRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0UmVhZFRpbWVvdXQgd3JpdGUgU2V0UmVhZFRpbWVvdXQ7CisgICAgcHJvcGVydHkgQ3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz4gcmVhZCBHZXRDdXN0b21IZWFkZXJzOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFVcmk6IHN0cmluZyk7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgZW5kOworCisgIElTZXJ2ZXJUcmFuc3BvcnQgPSBpbnRlcmZhY2UKKyAgICBbJ3tDNDNCODdFRC02OUVBLTQ3QzQtQjc3Qy0xNUUyODgyNTI5MDB9J10KKyAgICBwcm9jZWR1cmUgTGlzdGVuOworICAgIHByb2NlZHVyZSBDbG9zZTsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7CisgIGVuZDsKKworICBUU2VydmVyVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVNlcnZlclRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgcHJvY2VkdXJlIExpc3RlbjsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYyk6IElUcmFuc3BvcnQ7ICB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgZW5kOworCisgIElUcmFuc3BvcnRGYWN0b3J5ID0gaW50ZXJmYWNlCisgICAgWyd7REQ4MDk0NDYtMDAwRi00OUUxLTlCRkYtRTBEMERDNzZBOUQ3fSddCisgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0KCBjb25zdCBBVHJhbnM6IElUcmFuc3BvcnQpOiBJVHJhbnNwb3J0OworICBlbmQ7CisKKyAgVFRyYW5zcG9ydEZhY3RvcnlJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJVHJhbnNwb3J0RmFjdG9yeSkKKyAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IHZpcnR1YWw7CisgIGVuZDsKKworICBUVGNwU29ja2V0U3RyZWFtSW1wbCA9IGNsYXNzKCBUVGhyaWZ0U3RyZWFtSW1wbCApCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBwcml2YXRlIHR5cGUKKyAgICBUV2FpdEZvckRhdGEgPSAoIHdmZF9IYXZlRGF0YSwgd2ZkX1RpbWVvdXQsIHdmZF9FcnJvcik7CisgIHByaXZhdGUKKyAgICBGVGNwQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworICAgIEZUaW1lb3V0IDogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBTZWxlY3QoIFJlYWRSZWFkeSwgV3JpdGVSZWFkeSwgRXhjZXB0RmxhZzogUEJvb2xlYW47CisgICAgICAgICAgICAgICAgICAgICBUaW1lT3V0OiBJbnRlZ2VyOyB2YXIgd3NhRXJyb3IgOiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBXYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOyBEZXNpcmVkQnl0ZXM6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3c2FFcnJvciwgYnl0ZXNSZWFkeSA6IEludGVnZXIpOiBUV2FpdEZvckRhdGE7Cit7JEVMU0V9CisgICAgRlRjcENsaWVudDogVFNvY2tldDsKKyAgcHJvdGVjdGVkIGNvbnN0CisgICAgU0xFRVBfVElNRSA9IDIwMDsKK3skRU5ESUZ9CisgIHByb3RlY3RlZAorICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudDsgY29uc3QgYVRpbWVvdXQgOiBJbnRlZ2VyID0gMCk7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVGNwQ2xpZW50OiBUU29ja2V0OyBjb25zdCBhVGltZW91dCA6IExvbmd3b3JkID0gMCk7Cit7JEVORElGfQorICBlbmQ7CisKKyAgSVN0cmVhbVRyYW5zcG9ydCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCisgICAgWyd7QTg0NzlCNDctMkEzRS00NDIxLUE5QTAtRDVBOUVEQ0M2MzRBfSddCisgICAgZnVuY3Rpb24gR2V0SW5wdXRTdHJlYW06IElUaHJpZnRTdHJlYW07CisgICAgZnVuY3Rpb24gR2V0T3V0cHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIHByb3BlcnR5IElucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldElucHV0U3RyZWFtOworICAgIHByb3BlcnR5IE91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0gcmVhZCBHZXRPdXRwdXRTdHJlYW07CisgIGVuZDsKKworICBUU3RyZWFtVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCwgSVN0cmVhbVRyYW5zcG9ydCkKKyAgcHJvdGVjdGVkCisgICAgRklucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgICBGT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKworICAgIGZ1bmN0aW9uIEdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworICAgIGZ1bmN0aW9uIEdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKKyAgcHVibGljCisgICAgcHJvcGVydHkgSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtIHJlYWQgR2V0SW5wdXRTdHJlYW07CisgICAgcHJvcGVydHkgT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSByZWFkIEdldE91dHB1dFN0cmVhbTsKKworICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQUlucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsgY29uc3QgQU91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0pOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUQnVmZmVyZWRTdHJlYW1JbXBsID0gY2xhc3MoIFRUaHJpZnRTdHJlYW1JbXBsKQorICBwcml2YXRlCisgICAgRlN0cmVhbSA6IElUaHJpZnRTdHJlYW07CisgICAgRkJ1ZlNpemUgOiBJbnRlZ2VyOworICAgIEZSZWFkQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKyAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICBwcm90ZWN0ZWQKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgT3BlbjsgIG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOworICAgIGRlc3RydWN0b3IgRGVzdHJveTsgb3ZlcnJpZGU7CisgIGVuZDsKKworICBUU2VydmVyU29ja2V0SW1wbCA9IGNsYXNzKCBUU2VydmVyVHJhbnNwb3J0SW1wbCkKKyAgcHJpdmF0ZQoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGU2VydmVyIDogVFRjcFNlcnZlcjsKKyAgICBGUG9ydCA6IEludGVnZXI7CisgICAgRkNsaWVudFRpbWVvdXQgOiBJbnRlZ2VyOworeyRFTFNFfQorICAgIEZTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7Cit7JEVORElGfQorICAgIEZVc2VCdWZmZXJlZFNvY2tldCA6IEJvb2xlYW47CisgICAgRk93bnNTZXJ2ZXIgOiBCb29sZWFuOworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBBY2NlcHQoIGNvbnN0IGZuQWNjZXB0aW5nOiBUUHJvYykgOiBJVHJhbnNwb3J0OyBvdmVycmlkZTsKKyAgcHVibGljCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVNlcnZlcjogVFRjcFNlcnZlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBUG9ydDogSW50ZWdlcjsgQUNsaWVudFRpbWVvdXQ6IEludGVnZXIgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRUxTRX0KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCA9IDApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFQb3J0OiBJbnRlZ2VyOyBBQ2xpZW50VGltZW91dDogTG9uZ3dvcmQgPSAwOyBBVXNlQnVmZmVyZWRTb2NrZXRzOiBCb29sZWFuID0gRkFMU0UpOyBvdmVybG9hZDsKK3skRU5ESUZ9CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgTGlzdGVuOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOworICBlbmQ7CisKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbCA9IGNsYXNzKCBUVHJhbnNwb3J0SW1wbCApCisgIHByaXZhdGUKKyAgICBGSW5wdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIEZPdXRwdXRCdWZmZXIgOiBJVGhyaWZ0U3RyZWFtOworICAgIEZUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0OworICAgIEZCdWZTaXplIDogSW50ZWdlcjsKKworICAgIHByb2NlZHVyZSBJbml0QnVmZmVyczsKKyAgICBmdW5jdGlvbiBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0OworICBwcm90ZWN0ZWQKKyAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0IDogSVN0cmVhbVRyYW5zcG9ydCApOyBvdmVybG9hZDsKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0OyBBQnVmU2l6ZTogSW50ZWdlcik7IG92ZXJsb2FkOworICAgIHByb3BlcnR5IFVuZGVybHlpbmdUcmFuc3BvcnQ6IElUcmFuc3BvcnQgcmVhZCBHZXRVbmRlcmx5aW5nVHJhbnNwb3J0OworICAgIHByb3BlcnR5IElzT3BlbjogQm9vbGVhbiByZWFkIEdldElzT3BlbjsKKyAgZW5kOworCisgIFRTb2NrZXRJbXBsID0gY2xhc3MoVFN0cmVhbVRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgICAgRkNsaWVudCA6IFRDdXN0b21JcENsaWVudDsKK3skRUxTRX0KKyAgICBGQ2xpZW50OiBUU29ja2V0OworeyRFTkRJRn0KKyAgICBGT3duc0NsaWVudCA6IEJvb2xlYW47CisgICAgRkhvc3QgOiBzdHJpbmc7CisgICAgRlBvcnQgOiBJbnRlZ2VyOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBGVGltZW91dCA6IEludGVnZXI7Cit7JEVMU0V9CisgICAgRlRpbWVvdXQgOiBMb25nd29yZDsKK3skRU5ESUZ9CisKKyAgICBwcm9jZWR1cmUgSW5pdFNvY2tldDsKKyAgcHJvdGVjdGVkCisgICAgZnVuY3Rpb24gR2V0SXNPcGVuOiBCb29sZWFuOyBvdmVycmlkZTsKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFDbGllbnQgOiBUQ3VzdG9tSXBDbGllbnQ7IGFPd25zQ2xpZW50IDogQm9vbGVhbjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7Cit7JEVMU0V9CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IEFDbGllbnQ6IFRTb2NrZXQ7IGFPd25zQ2xpZW50OiBCb29sZWFuKTsgb3ZlcmxvYWQ7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkID0gMCk7IG92ZXJsb2FkOworeyRFTkRJRn0KKyAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7Cit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHByb3BlcnR5IFRjcENsaWVudDogVEN1c3RvbUlwQ2xpZW50IHJlYWQgRkNsaWVudDsKK3skRUxTRX0KKyAgICBwcm9wZXJ0eSBUY3BDbGllbnQ6IFRTb2NrZXQgcmVhZCBGQ2xpZW50OworeyRFTkRJRn0KKyAgICBwcm9wZXJ0eSBIb3N0IDogc3RyaW5nIHJlYWQgRkhvc3Q7CisgICAgcHJvcGVydHkgUG9ydDogSW50ZWdlciByZWFkIEZQb3J0OworICBlbmQ7CisKKyAgVEZyYW1lZFRyYW5zcG9ydEltcGwgPSBjbGFzcyggVFRyYW5zcG9ydEltcGwpCisgIHByaXZhdGUgY29uc3QKKyAgICBGSGVhZGVyU2l6ZSA6IEludGVnZXIgPSA0OworICBwcml2YXRlIGNsYXNzIHZhcgorICAgIEZIZWFkZXJfRHVtbXkgOiBhcnJheSBvZiBCeXRlOworICBwcm90ZWN0ZWQKKyAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKKyAgICBGV3JpdGVCdWZmZXIgOiBUTWVtb3J5U3RyZWFtOworICAgIEZSZWFkQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKKworICAgIHByb2NlZHVyZSBJbml0V3JpdGVCdWZmZXI7CisgICAgcHJvY2VkdXJlIFJlYWRGcmFtZTsKKyAgcHVibGljCisgICAgdHlwZQorICAgICAgVEZhY3RvcnkgPSBjbGFzcyggVFRyYW5zcG9ydEZhY3RvcnlJbXBsICkKKyAgICAgIHB1YmxpYworICAgICAgICBmdW5jdGlvbiBHZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7IG92ZXJyaWRlOworICAgICAgZW5kOworCisgICAgeyRJRkRFRiBIQVZFX0NMQVNTX0NUT1J9CisgICAgY2xhc3MgY29uc3RydWN0b3IgQ3JlYXRlOworICAgIHskRU5ESUZ9CisKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTsgb3ZlcmxvYWQ7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKKworICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIEdldElzT3BlbjogQm9vbGVhbjsgb3ZlcnJpZGU7CisKKyAgICBwcm9jZWR1cmUgQ2xvc2UoKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CisgIGVuZDsKKworeyRJRk5ERUYgSEFWRV9DTEFTU19DVE9SfQorcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsX0luaXRpYWxpemU7Cit7JEVORElGfQorCitjb25zdAorICBERUZBVUxUX1RIUklGVF9USU1FT1VUID0gNSAqIDEwMDA7IC8vIG1zCisKKworaW1wbGVtZW50YXRpb24KKworeyBUVHJhbnNwb3J0SW1wbCB9CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5GbHVzaDsKK2JlZ2luCisgIC8vIG5vdGhpbmcgdG8gZG8KK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUGVlazogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBJc09wZW47CitlbmQ7CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiByZXN1bHQgOj0gUmVhZCggQGJ1ZlswXSwgTGVuZ3RoKGJ1ZiksIG9mZiwgbGVuKQorICBlbHNlIHJlc3VsdCA6PSAwOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworYmVnaW4KKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWRBbGwoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKK2VuZDsKKworcHJvY2VkdXJlIFRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgMCwgTGVuZ3RoKGJ1ZikpOworZW5kOworCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgb2ZmLCBsZW4pOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcmV0IDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSAwOworICB3aGlsZSByZXN1bHQgPCBsZW4gZG8gYmVnaW4KKyAgICByZXQgOj0gUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYgKyByZXN1bHQsIGxlbiAtIHJlc3VsdCk7CisgICAgaWYgcmV0ID4gMAorICAgIHRoZW4gSW5jKCByZXN1bHQsIHJldCkKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSggJ0Nhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkJyApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgU2VsZi5Xcml0ZSggcEJ1ZiwgMCwgbGVuKTsKK2VuZDsKKworeyBUSFRUUENsaWVudEltcGwgfQorCitjb25zdHJ1Y3RvciBUSFRUUENsaWVudEltcGwuQ3JlYXRlKGNvbnN0IEFVcmk6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGVXJpIDo9IEFVcmk7CisKKyAgLy8gZGVmYXVsdHMgYWNjb3JkaW5nIHRvIE1TRE4KKyAgRkRuc1Jlc29sdmVUaW1lb3V0IDo9IDA7IC8vIG5vIHRpbWVvdXQKKyAgRkNvbm5lY3Rpb25UaW1lb3V0IDo9IDYwICogMTAwMDsKKyAgRlNlbmRUaW1lb3V0ICAgICAgIDo9IDMwICogMTAwMDsKKyAgRlJlYWRUaW1lb3V0ICAgICAgIDo9IDMwICogMTAwMDsKKworICBGQ3VzdG9tSGVhZGVycyA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8c3RyaW5nLHN0cmluZz4uQ3JlYXRlOworICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuQ3JlYXRlUmVxdWVzdDogSVhNTEhUVFBSZXF1ZXN0OwordmFyCisgIHBhaXIgOiBUUGFpcjxzdHJpbmcsc3RyaW5nPjsKKyAgc3J2SHR0cCA6IElTZXJ2ZXJYTUxIVFRQUmVxdWVzdDsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgIFJlc3VsdCA6PSBDb1NlcnZlclhNTEhUVFAuQ3JlYXRlOworICB7JEVMU0V9CisgIFJlc3VsdCA6PSBDb1hNTEhUVFBSZXF1ZXN0LkNyZWF0ZTsKKyAgeyRJRkVORH0KKworICAvLyBzZXR0aW5nIGEgdGltZW91dCB2YWx1ZSB0byAwICh6ZXJvKSBtZWFucyAibm8gdGltZW91dCIgZm9yIHRoYXQgc2V0dGluZworICBpZiBTdXBwb3J0cyggcmVzdWx0LCBJU2VydmVyWE1MSFRUUFJlcXVlc3QsIHNydkh0dHApCisgIHRoZW4gc3J2SHR0cC5zZXRUaW1lb3V0cyggRG5zUmVzb2x2ZVRpbWVvdXQsIENvbm5lY3Rpb25UaW1lb3V0LCBTZW5kVGltZW91dCwgUmVhZFRpbWVvdXQpOworCisgIFJlc3VsdC5vcGVuKCdQT1NUJywgRlVyaSwgRmFsc2UsICcnLCAnJyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnQWNjZXB0JywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0Jyk7CisgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCAnVXNlci1BZ2VudCcsICdEZWxwaGkvSUhUVFBDbGllbnQnKTsKKworICBmb3IgcGFpciBpbiBGQ3VzdG9tSGVhZGVycyBkbyBiZWdpbgorICAgIFJlc3VsdC5zZXRSZXF1ZXN0SGVhZGVyKCBwYWlyLktleSwgcGFpci5WYWx1ZSApOworICBlbmQ7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEhUVFBDbGllbnRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRkRuc1Jlc29sdmVUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25uZWN0aW9uVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRTZW5kVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGU2VuZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlNlbmRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CitiZWdpbgorICBSZXN1bHQgOj0gRlJlYWRUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZSZWFkVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+OworYmVnaW4KKyAgUmVzdWx0IDo9IEZDdXN0b21IZWFkZXJzOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuT3BlbjsKK2JlZ2luCisgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuQ2xvc2U7CitiZWdpbgorICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2JlZ2luCisgIHRyeQorICAgIFNlbmRSZXF1ZXN0OworICBmaW5hbGx5CisgICAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisgICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKKyAgICBBU1NFUlQoIEZPdXRwdXRTdHJlYW0gPD4gbmlsKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyByZXF1ZXN0IGhhcyBiZWVuIHNlbnQnKTsKKyAgZW5kOworCisgIHRyeQorICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbikKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uCisgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZW5kUmVxdWVzdDsKK3ZhcgorICB4bWxodHRwIDogSVhNTEhUVFBSZXF1ZXN0OworICBtcyA6IFRNZW1vcnlTdHJlYW07CisgIGEgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICB4bWxodHRwIDo9IENyZWF0ZVJlcXVlc3Q7CisKKyAgbXMgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIHRyeQorICAgIGEgOj0gRk91dHB1dFN0cmVhbS5Ub0FycmF5OworICAgIGxlbiA6PSBMZW5ndGgoYSk7CisgICAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgICBtcy5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAYVswXSleLCBsZW4pOworICAgIGVuZDsKKyAgICBtcy5Qb3NpdGlvbiA6PSAwOworICAgIHhtbGh0dHAuc2VuZCggSVVua25vd24oIFRTdHJlYW1BZGFwdGVyLkNyZWF0ZSggbXMsIHNvUmVmZXJlbmNlICkpKTsKKyAgICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICAgIEZJbnB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5DcmVhdGUoIElVbmtub3duKCB4bWxodHRwLnJlc3BvbnNlU3RyZWFtKSBhcyBJU3RyZWFtKTsKKyAgZmluYWxseQorICAgIG1zLkZyZWU7CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7CitiZWdpbgorICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbik7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEV4Y2VwdGlvbiB9CisKK2Z1bmN0aW9uIFRUcmFuc3BvcnRFeGNlcHRpb24uR2V0VHlwZTogVEV4Y2VwdGlvblR5cGU7CitiZWdpbgorICBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLk5vdE9wZW4KKyAgZWxzZSBpZiBTZWxmIGlzIFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3BlbiB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbgorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0IHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlRpbWVkT3V0CisgIGVsc2UgaWYgU2VsZiBpcyBUVHJhbnNwb3J0RXhjZXB0aW9uRW5kT2ZGaWxlIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkVuZE9mRmlsZQorICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkJhZEFyZ3MgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQmFkQXJncworICBlbHNlIGlmIFNlbGYgaXMgVFRyYW5zcG9ydEV4Y2VwdGlvbkludGVycnVwdGVkIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludGVycnVwdGVkCisgIGVsc2UgUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRUcmFuc3BvcnRFeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2JlZ2luCisgIC8vbm8gaW5oZXJpdGVkOworeyRXQVJOIFNZTUJPTF9ERVBSRUNBVEVEIE9GRn0KKyAgUmVzdWx0IDo9IENyZWF0ZShBVHlwZSwgJycpCit7JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgREVGQVVMVH0KK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRyYW5zcG9ydEV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOworICBjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICBjYXNlIEFUeXBlIG9mCisgICAgVEV4Y2VwdGlvblR5cGUuTm90T3BlbjogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbjogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25BbHJlYWR5T3Blbi5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5UaW1lZE91dDogICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5FbmRPZkZpbGU6ICAgUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25FbmRPZkZpbGUuQ3JlYXRlKG1zZyk7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkQXJnczogICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uQmFkQXJncy5DcmVhdGUobXNnKTsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZDogUmVzdWx0IDo9IFRUcmFuc3BvcnRFeGNlcHRpb25JbnRlcnJ1cHRlZC5DcmVhdGUobXNnKTsKKyAgZWxzZQorICAgIFJlc3VsdCA6PSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUobXNnKTsKKyAgZW5kOworZW5kOworCitjbGFzcyBmdW5jdGlvbiBUVHJhbnNwb3J0RXhjZXB0aW9uLkNyZWF0ZShjb25zdCBtc2c6IHN0cmluZyk6IFRUcmFuc3BvcnRFeGNlcHRpb247CitiZWdpbgorICBSZXN1bHQgOj0gVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkIH0KKworY29uc3RydWN0b3IgVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CitlbmQ7CisKK3sgVFRyYW5zcG9ydEZhY3RvcnlJbXBsIH0KKworZnVuY3Rpb24gVFRyYW5zcG9ydEZhY3RvcnlJbXBsLkdldFRyYW5zcG9ydCggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTogSVRyYW5zcG9ydDsKK2JlZ2luCisgIFJlc3VsdCA6PSBBVHJhbnM7CitlbmQ7CisKK3sgVFNlcnZlclNvY2tldCB9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRUY3BTZXJ2ZXI7IEFDbGllbnRUaW1lb3V0OiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZTZXJ2ZXIgOj0gQVNlcnZlcjsKKyAgRkNsaWVudFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIGNvbnN0IEFTZXJ2ZXI6IFRTZXJ2ZXJTb2NrZXQ7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZCk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU2VydmVyIDo9IEFTZXJ2ZXI7CisgIEZTZXJ2ZXIuUmVjdlRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CisgIEZTZXJ2ZXIuU2VuZFRpbWVvdXQgOj0gQUNsaWVudFRpbWVvdXQ7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNlcnZlclNvY2tldEltcGwuQ3JlYXRlKEFQb3J0LCBBQ2xpZW50VGltZW91dDogSW50ZWdlcjsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoQVBvcnQ6IEludGVnZXI7IEFDbGllbnRUaW1lb3V0OiBMb25nd29yZDsgQVVzZUJ1ZmZlcmVkU29ja2V0czogQm9vbGVhbik7Cit7JEVORElGfQorYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZQb3J0IDo9IEFQb3J0OworICBGQ2xpZW50VGltZW91dCA6PSBBQ2xpZW50VGltZW91dDsKKyAgRlNlcnZlciA6PSBUVGNwU2VydmVyLkNyZWF0ZSggbmlsICk7CisgIEZTZXJ2ZXIuQmxvY2tNb2RlIDo9IGJtQmxvY2tpbmc7CisgIHskSUYgQ29tcGlsZXJWZXJzaW9uID49IDIxLjB9CisgIEZTZXJ2ZXIuTG9jYWxQb3J0IDo9IEFuc2lTdHJpbmcoIEludFRvU3RyKCBGUG9ydCkpOworICB7JEVMU0V9CisgIEZTZXJ2ZXIuTG9jYWxQb3J0IDo9IEludFRvU3RyKCBGUG9ydCk7CisgIHskSUZFTkR9Cit7JEVMU0V9CisgIEZTZXJ2ZXIgOj0gVFNlcnZlclNvY2tldC5DcmVhdGUoQVBvcnQsIEFDbGllbnRUaW1lb3V0LCBBQ2xpZW50VGltZW91dCk7Cit7JEVORElGfQorICBGVXNlQnVmZmVyZWRTb2NrZXQgOj0gQVVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgRk93bnNTZXJ2ZXIgOj0gVHJ1ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUU2VydmVyU29ja2V0SW1wbC5EZXN0cm95OworYmVnaW4KKyAgaWYgRk93bnNTZXJ2ZXIgdGhlbiBiZWdpbgorICAgIEZTZXJ2ZXIuRnJlZTsKKyAgICBGU2VydmVyIDo9IG5pbDsKKyAgZW5kOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRTZXJ2ZXJTb2NrZXRJbXBsLkFjY2VwdCggY29uc3QgZm5BY2NlcHRpbmc6IFRQcm9jKTogSVRyYW5zcG9ydDsKK3ZhcgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgY2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OworeyRFTFNFfQorICBjbGllbnQ6IFRTb2NrZXQ7Cit7JEVORElGfQorICB0cmFucyAgOiBJU3RyZWFtVHJhbnNwb3J0OworYmVnaW4KKyAgaWYgRlNlcnZlciA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQuJyk7CisgIGVuZDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgY2xpZW50IDo9IG5pbDsKKyAgdHJ5CisgICAgY2xpZW50IDo9IFRDdXN0b21JcENsaWVudC5DcmVhdGUobmlsKTsKKworICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQorICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKKworICAgIGlmIG5vdCBGU2VydmVyLkFjY2VwdCggY2xpZW50KSB0aGVuIGJlZ2luCisgICAgICBjbGllbnQuRnJlZTsKKyAgICAgIFJlc3VsdCA6PSBuaWw7CisgICAgICBFeGl0OworICAgIGVuZDsKKworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIGJlZ2luCisgICAgICBSZXN1bHQgOj0gbmlsOworICAgICAgRXhpdDsKKyAgICBlbmQ7CisKKyAgICB0cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIGNsaWVudCwgVFJVRSwgRkNsaWVudFRpbWVvdXQpOworICAgIGNsaWVudCA6PSBuaWw7ICAvLyB0cmFucyBvd25zIGl0IG5vdworCisgICAgaWYgRlVzZUJ1ZmZlcmVkU29ja2V0CisgICAgdGhlbiByZXN1bHQgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHRyYW5zKQorICAgIGVsc2UgcmVzdWx0IDo9IHRyYW5zOworCisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbyBiZWdpbgorICAgICAgY2xpZW50LkZyZWU7CisgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoRS5Ub1N0cmluZyk7CisgICAgZW5kOworICBlbmQ7Cit7JEVMU0V9CisgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKSB0aGVuCisgICAgZm5BY2NlcHRpbmcoKTsKKworICBjbGllbnQgOj0gRlNlcnZlci5BY2NlcHQ7CisgIHRyeQorICAgIHRyYW5zIDo9IFRTb2NrZXRJbXBsLkNyZWF0ZShjbGllbnQsIFRydWUpOworICAgIGNsaWVudCA6PSBuaWw7CisKKyAgICBpZiBGVXNlQnVmZmVyZWRTb2NrZXQgdGhlbgorICAgICAgUmVzdWx0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKHRyYW5zKQorICAgIGVsc2UKKyAgICAgIFJlc3VsdCA6PSB0cmFuczsKKyAgZXhjZXB0CisgICAgY2xpZW50LkZyZWU7CisgICAgcmFpc2U7CisgIGVuZDsKK3skRU5ESUZ9CitlbmQ7CisKK3Byb2NlZHVyZSBUU2VydmVyU29ja2V0SW1wbC5MaXN0ZW47CitiZWdpbgorICBpZiBGU2VydmVyIDw+IG5pbCB0aGVuCisgIGJlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICAgIHRyeQorICAgICAgRlNlcnZlci5BY3RpdmUgOj0gVHJ1ZTsKKyAgICBleGNlcHQKKyAgICAgIG9uIEU6IEV4Y2VwdGlvbgorICAgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICcgKyBFLk1lc3NhZ2UpOworICAgIGVuZDsKK3skRUxTRX0KKyAgICBGU2VydmVyLkxpc3RlbjsKK3skRU5ESUZ9CisgIGVuZDsKK2VuZDsKKworcHJvY2VkdXJlIFRTZXJ2ZXJTb2NrZXRJbXBsLkNsb3NlOworYmVnaW4KKyAgaWYgRlNlcnZlciA8PiBuaWwgdGhlbgoreyRJRkRFRiBPTERfU09DS0VUU30KKyAgICB0cnkKKyAgICAgIEZTZXJ2ZXIuQWN0aXZlIDo9IEZhbHNlOworICAgIGV4Y2VwdAorICAgICAgb24gRTogRXhjZXB0aW9uCisgICAgICBkbyByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ0Vycm9yIG9uIGNsb3Npbmcgc29ja2V0IDogJyArIEUuTWVzc2FnZSk7CisgICAgZW5kOworeyRFTFNFfQorICAgIEZTZXJ2ZXIuQ2xvc2U7Cit7JEVORElGfQorZW5kOworCit7IFRTb2NrZXQgfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorY29uc3RydWN0b3IgVFNvY2tldEltcGwuQ3JlYXRlKCBjb25zdCBBQ2xpZW50IDogVEN1c3RvbUlwQ2xpZW50OyBhT3duc0NsaWVudCA6IEJvb2xlYW47IEFUaW1lb3V0OiBJbnRlZ2VyID0gMCk7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQVRpbWVvdXQ7CisgIEZPd25zQ2xpZW50IDo9IGFPd25zQ2xpZW50OworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIGluaGVyaXRlZCBDcmVhdGUoIHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBQ2xpZW50OiBUU29ja2V0OyBhT3duc0NsaWVudDogQm9vbGVhbik7Cit2YXIgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIEZDbGllbnQgOj0gQUNsaWVudDsKKyAgRlRpbWVvdXQgOj0gQUNsaWVudC5SZWN2VGltZW91dDsKKyAgRk93bnNDbGllbnQgOj0gYU93bnNDbGllbnQ7CisgIHN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoRkNsaWVudCwgRlRpbWVvdXQpOworICBpbmhlcml0ZWQgQ3JlYXRlKHN0cmVhbSwgc3RyZWFtKTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUU29ja2V0SW1wbC5DcmVhdGUoY29uc3QgQUhvc3Q6IHN0cmluZzsgQVBvcnQsIEFUaW1lb3V0OiBJbnRlZ2VyKTsKK3skRUxTRX0KK2NvbnN0cnVjdG9yIFRTb2NrZXRJbXBsLkNyZWF0ZShjb25zdCBBSG9zdDogc3RyaW5nOyBBUG9ydDogSW50ZWdlcjsgQVRpbWVvdXQ6IExvbmd3b3JkKTsKK3skRU5ESUZ9CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlKG5pbCxuaWwpOworICBGSG9zdCA6PSBBSG9zdDsKKyAgRlBvcnQgOj0gQVBvcnQ7CisgIEZUaW1lb3V0IDo9IEFUaW1lb3V0OworICBJbml0U29ja2V0OworZW5kOworCitkZXN0cnVjdG9yIFRTb2NrZXRJbXBsLkRlc3Ryb3k7CitiZWdpbgorICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU29ja2V0SW1wbC5DbG9zZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDbG9zZTsKKworICBGSW5wdXRTdHJlYW0gOj0gbmlsOworICBGT3V0cHV0U3RyZWFtIDo9IG5pbDsKKworICBpZiBGT3duc0NsaWVudAorICB0aGVuIEZyZWVBbmROaWwoIEZDbGllbnQpCisgIGVsc2UgRkNsaWVudCA6PSBuaWw7CitlbmQ7CisKK2Z1bmN0aW9uIFRTb2NrZXRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCit7JElGREVGIE9MRF9TT0NLRVRTfQorICBSZXN1bHQgOj0gKEZDbGllbnQgPD4gbmlsKSBhbmQgRkNsaWVudC5Db25uZWN0ZWQ7Cit7JEVMU0V9CisgIFJlc3VsdCA6PSAoRkNsaWVudCA8PiBuaWwpIGFuZCBGQ2xpZW50LklzT3BlbgoreyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRTb2NrZXRJbXBsLkluaXRTb2NrZXQ7Cit2YXIKKyAgc3RyZWFtIDogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIGlmIEZPd25zQ2xpZW50CisgIHRoZW4gRnJlZUFuZE5pbCggRkNsaWVudCkKKyAgZWxzZSBGQ2xpZW50IDo9IG5pbDsKKworeyRJRkRFRiBPTERfU09DS0VUU30KKyAgRkNsaWVudCA6PSBUVGNwQ2xpZW50LkNyZWF0ZSggbmlsKTsKK3skRUxTRX0KKyAgRkNsaWVudCA6PSBUU29ja2V0LkNyZWF0ZShGSG9zdCwgRlBvcnQpOworeyRFTkRJRn0KKyAgRk93bnNDbGllbnQgOj0gVHJ1ZTsKKworICBzdHJlYW0gOj0gVFRjcFNvY2tldFN0cmVhbUltcGwuQ3JlYXRlKCBGQ2xpZW50LCBGVGltZW91dCk7CisgIEZJbnB1dFN0cmVhbSA6PSBzdHJlYW07CisgIEZPdXRwdXRTdHJlYW0gOj0gc3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFNvY2tldEltcGwuT3BlbjsKK2JlZ2luCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbkFscmVhZHlPcGVuLkNyZWF0ZSgnU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJyk7CisgIGVuZDsKKworICBpZiBGSG9zdCA9ICcnIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBvcGVuIG51bGwgaG9zdCcpOworICBlbmQ7CisKKyAgaWYgUG9ydCA8PSAwIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcpOworICBlbmQ7CisKKyAgaWYgRkNsaWVudCA9IG5pbAorICB0aGVuIEluaXRTb2NrZXQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIEZDbGllbnQuUmVtb3RlSG9zdCA6PSBUU29ja2V0SG9zdCggSG9zdCk7CisgIEZDbGllbnQuUmVtb3RlUG9ydCA6PSBUU29ja2V0UG9ydCggSW50VG9TdHIoIFBvcnQpKTsKKyAgRkNsaWVudC5Db25uZWN0OworeyRFTFNFfQorICBGQ2xpZW50Lk9wZW47Cit7JEVORElGfQorCisgIEZJbnB1dFN0cmVhbSA6PSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIEZDbGllbnQsIEZUaW1lb3V0KTsKKyAgRk91dHB1dFN0cmVhbSA6PSBGSW5wdXRTdHJlYW07CitlbmQ7CisKK3sgVEJ1ZmZlcmVkU3RyZWFtIH0KKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuQ2xvc2U7CitiZWdpbgorICBGbHVzaDsKKyAgRlN0cmVhbSA6PSBuaWw7CisKKyAgRlJlYWRCdWZmZXIuRnJlZTsKKyAgRlJlYWRCdWZmZXIgOj0gbmlsOworCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGV3JpdGVCdWZmZXIgOj0gbmlsOworZW5kOworCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggY29uc3QgQVN0cmVhbTogSVRocmlmdFN0cmVhbTsgQUJ1ZlNpemU6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlN0cmVhbSA6PSBBU3RyZWFtOworICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsKKyAgRlJlYWRCdWZmZXIgOj0gVE1lbW9yeVN0cmVhbS5DcmVhdGU7CisgIEZXcml0ZUJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKK2VuZDsKKworZGVzdHJ1Y3RvciBUQnVmZmVyZWRTdHJlYW1JbXBsLkRlc3Ryb3k7CitiZWdpbgorICBDbG9zZTsKKyAgaW5oZXJpdGVkOworZW5kOworCitwcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5GbHVzaDsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CitiZWdpbgorICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGV3JpdGVCdWZmZXIuU2l6ZTsKKyAgICBpZiBsZW4gPiAwIHRoZW4gYmVnaW4KKyAgICAgIFNldExlbmd0aCggYnVmLCBsZW4gKTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgICAgRldyaXRlQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZlswXSleLCBsZW4gKTsKKyAgICAgIEZTdHJlYW0uV3JpdGUoIGJ1ZiwgMCwgbGVuICk7CisgICAgZW5kOworICAgIEZXcml0ZUJ1ZmZlci5DbGVhcjsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLklzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKKyAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCisgICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpCisgICAgICAgIGFuZCBGU3RyZWFtLklzT3BlbjsKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuT3BlbjsKK2JlZ2luCisgIEZTdHJlYW0uT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgblJlYWQgOiBJbnRlZ2VyOworICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisgIFJlc3VsdCA6PSAwOworCisgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCisKKyAgICAgIGlmIEZSZWFkQnVmZmVyLlBvc2l0aW9uID49IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgorICAgICAgICBGUmVhZEJ1ZmZlci5DbGVhcjsKKyAgICAgICAgU2V0TGVuZ3RoKCB0ZW1wYnVmLCBGQnVmU2l6ZSk7CisgICAgICAgIG5SZWFkIDo9IEZTdHJlYW0uUmVhZCggdGVtcGJ1ZiwgMCwgRkJ1ZlNpemUgKTsKKyAgICAgICAgaWYgblJlYWQgPSAwIHRoZW4gQnJlYWs7IC8vIGF2b2lkIGluZmluaXRlIGxvb3AKKworICAgICAgICBGUmVhZEJ1ZmZlci5Xcml0ZUJ1ZmZlciggUG9pbnRlcihAdGVtcGJ1ZlswXSleLCBuUmVhZCApOworICAgICAgICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworICAgICAgZW5kOworCisgICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgorICAgICAgICBuUmVhZCA6PSBNaW4oIEZSZWFkQnVmZmVyLlNpemUgLSBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiwgY291bnQpOworICAgICAgICBwVG1wICA6PSBwQnVmOworICAgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICAgIEluYyggUmVzdWx0LCBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgblJlYWQpKTsKKyAgICAgICAgRGVjKCBjb3VudCwgblJlYWQpOworICAgICAgICBJbmMoIG9mZnNldCwgblJlYWQpOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisKKyAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KKyAgICBsZW4gOj0gRlJlYWRCdWZmZXIuU2l6ZTsKKyAgZW5kOworCisgIFNldExlbmd0aCggUmVzdWx0LCBsZW4pOworCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CisgICAgRlJlYWRCdWZmZXIuUmVhZCggUG9pbnRlcihAUmVzdWx0WzBdKV4sIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Cit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworICBpZiBjb3VudCA+IDAgdGhlbiBiZWdpbgorICAgIGlmIElzT3BlbiB0aGVuIGJlZ2luCisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBjb3VudCApOworICAgICAgaWYgRldyaXRlQnVmZmVyLlNpemUgPiBGQnVmU2l6ZSB0aGVuIGJlZ2luCisgICAgICAgIEZsdXNoOworICAgICAgZW5kOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCit7IFRTdHJlYW1UcmFuc3BvcnRJbXBsIH0KKworY29uc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOyBjb25zdCBBT3V0cHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbSk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGSW5wdXRTdHJlYW0gOj0gQUlucHV0U3RyZWFtOworICBGT3V0cHV0U3RyZWFtIDo9IEFPdXRwdXRTdHJlYW07CitlbmQ7CisKK2Rlc3RydWN0b3IgVFN0cmVhbVRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0Nhbm5vdCBmbHVzaCBudWxsIG91dHB1dHN0cmVhbScgKTsKKyAgZW5kOworCisgIEZPdXRwdXRTdHJlYW0uRmx1c2g7CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldElucHV0U3RyZWFtOiBJVGhyaWZ0U3RyZWFtOworYmVnaW4KKyAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbTsKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuR2V0SXNPcGVuOiBCb29sZWFuOworYmVnaW4KKyAgUmVzdWx0IDo9IFRydWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGT3V0cHV0U3RyZWFtOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuT3BlbjsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOworZW5kOworCitwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0nICk7CisgIGVuZDsKKworICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOworZW5kOworCit7IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwgfQorCitjb25zdHJ1Y3RvciBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zcG9ydDogSVN0cmVhbVRyYW5zcG9ydCk7CitiZWdpbgorICAvL25vIGluaGVyaXRlZDsKKyAgQ3JlYXRlKCBBVHJhbnNwb3J0LCAxMDI0ICk7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJU3RyZWFtVHJhbnNwb3J0OyAgQUJ1ZlNpemU6IEludGVnZXIpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRyYW5zcG9ydCA6PSBBVHJhbnNwb3J0OworICBGQnVmU2l6ZSA6PSBBQnVmU2l6ZTsKKyAgSW5pdEJ1ZmZlcnM7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRlRyYW5zcG9ydC5DbG9zZTsKKyAgRklucHV0QnVmZmVyIDo9IG5pbDsKKyAgRk91dHB1dEJ1ZmZlciA6PSBuaWw7ICAKK2VuZDsKKworcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuRmx1c2g7CitiZWdpbgorICBpZiBGT3V0cHV0QnVmZmVyIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgRk91dHB1dEJ1ZmZlci5GbHVzaDsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsKK2VuZDsKKworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5HZXRVbmRlcmx5aW5nVHJhbnNwb3J0OiBJVHJhbnNwb3J0OworYmVnaW4KKyAgUmVzdWx0IDo9IEZUcmFuc3BvcnQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkluaXRCdWZmZXJzOworYmVnaW4KKyAgaWYgRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZJbnB1dEJ1ZmZlciA6PSBUQnVmZmVyZWRTdHJlYW1JbXBsLkNyZWF0ZSggRlRyYW5zcG9ydC5JbnB1dFN0cmVhbSwgRkJ1ZlNpemUgKTsKKyAgZW5kOworICBpZiBGVHJhbnNwb3J0Lk91dHB1dFN0cmVhbSA8PiBuaWwgdGhlbiBiZWdpbgorICAgIEZPdXRwdXRCdWZmZXIgOj0gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQuT3V0cHV0U3RyZWFtLCBGQnVmU2l6ZSApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLk9wZW47CitiZWdpbgorICBGVHJhbnNwb3J0Lk9wZW47CisgIEluaXRCdWZmZXJzOyAgLy8gd2UgbmVlZCB0byBnZXQgdGhlIGJ1ZmZlcnMgdG8gbWF0Y2ggRlRyYW5zcG9ydCBzdWJzdHJlYW1zIGFnYWluCitlbmQ7CisKK2Z1bmN0aW9uIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSAwOworICBpZiBGSW5wdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBSZXN1bHQgOj0gRklucHV0QnVmZmVyLlJlYWQoIHBCdWYsYnVmbGVuLCBvZmYsIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KKyAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBwQnVmLCBvZmYsIGxlbiApOworICBlbmQ7CitlbmQ7CisKK3sgVEZyYW1lZFRyYW5zcG9ydEltcGwgfQorCit7JElGREVGIEhBVkVfQ0xBU1NfQ1RPUn0KK2NsYXNzIGNvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIFNldExlbmd0aCggRkhlYWRlcl9EdW1teSwgRkhlYWRlclNpemUpOworICBGaWxsQ2hhciggRkhlYWRlcl9EdW1teVswXSwgTGVuZ3RoKCBGSGVhZGVyX0R1bW15KSAqIFNpemVPZiggQnl0ZSApLCAwKTsKK2VuZDsKK3skRUxTRX0KK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbF9Jbml0aWFsaXplOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15LCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyU2l6ZSk7CisgIEZpbGxDaGFyKCBURnJhbWVkVHJhbnNwb3J0SW1wbC5GSGVhZGVyX0R1bW15WzBdLAorICAgIExlbmd0aCggVEZyYW1lZFRyYW5zcG9ydEltcGwuRkhlYWRlcl9EdW1teSkgKiBTaXplT2YoIEJ5dGUgKSwgMCk7CitlbmQ7Cit7JEVORElGfQorCitjb25zdHJ1Y3RvciBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBJbml0V3JpdGVCdWZmZXI7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUcmFuc3BvcnQuQ2xvc2U7CitlbmQ7CisKK2NvbnN0cnVjdG9yIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQVRyYW5zOiBJVHJhbnNwb3J0KTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEluaXRXcml0ZUJ1ZmZlcjsKKyAgRlRyYW5zcG9ydCA6PSBBVHJhbnM7CitlbmQ7CisKK2Rlc3RydWN0b3IgVEZyYW1lZFRyYW5zcG9ydEltcGwuRGVzdHJveTsKK2JlZ2luCisgIEZXcml0ZUJ1ZmZlci5GcmVlOworICBGUmVhZEJ1ZmZlci5GcmVlOworICBpbmhlcml0ZWQ7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5GbHVzaDsKK3ZhcgorICBidWYgOiBUQnl0ZXM7CisgIGxlbiA6IEludGVnZXI7CisgIGRhdGFfbGVuIDogSW50ZWdlcjsKKworYmVnaW4KKyAgbGVuIDo9IEZXcml0ZUJ1ZmZlci5TaXplOworICBTZXRMZW5ndGgoIGJ1ZiwgbGVuKTsKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgU3lzdGVtLk1vdmUoIEZXcml0ZUJ1ZmZlci5NZW1vcnleLCBidWZbMF0sIGxlbiApOworICBlbmQ7CisKKyAgZGF0YV9sZW4gOj0gbGVuIC0gRkhlYWRlclNpemU7CisgIGlmIChkYXRhX2xlbiA8IDApIHRoZW4gYmVnaW4KKyAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1RGcmFtZWRUcmFuc3BvcnQuRmx1c2g6IGRhdGFfbGVuIDwgMCcgKTsKKyAgZW5kOworCisgIEluaXRXcml0ZUJ1ZmZlcjsKKworICBidWZbMF0gOj0gQnl0ZSgkRkYgYW5kIChkYXRhX2xlbiBzaHIgMjQpKTsKKyAgYnVmWzFdIDo9IEJ5dGUoJEZGIGFuZCAoZGF0YV9sZW4gc2hyIDE2KSk7CisgIGJ1ZlsyXSA6PSBCeXRlKCRGRiBhbmQgKGRhdGFfbGVuIHNociA4KSk7CisgIGJ1ZlszXSA6PSBCeXRlKCRGRiBhbmQgZGF0YV9sZW4pOworCisgIEZUcmFuc3BvcnQuV3JpdGUoIGJ1ZiwgMCwgbGVuICk7CisgIEZUcmFuc3BvcnQuRmx1c2g7CitlbmQ7CisKK2Z1bmN0aW9uIFRGcmFtZWRUcmFuc3BvcnRJbXBsLkdldElzT3BlbjogQm9vbGVhbjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGVHJhbnNwb3J0LklzT3BlbjsKK2VuZDsKKwordHlwZQorICBUQWNjZXNzTWVtb3J5U3RyZWFtID0gY2xhc3MoVE1lbW9yeVN0cmVhbSkKKyAgZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuSW5pdFdyaXRlQnVmZmVyOworYmVnaW4KKyAgRldyaXRlQnVmZmVyLkZyZWU7CisgIEZXcml0ZUJ1ZmZlciA6PSBUTWVtb3J5U3RyZWFtLkNyZWF0ZTsKKyAgVEFjY2Vzc01lbW9yeVN0cmVhbShGV3JpdGVCdWZmZXIpLkNhcGFjaXR5IDo9IDEwMjQ7CisgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihARkhlYWRlcl9EdW1teVswXSleLCBGSGVhZGVyU2l6ZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5PcGVuOworYmVnaW4KKyAgRlRyYW5zcG9ydC5PcGVuOworZW5kOworCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIGxlbiA+IChidWZsZW4tb2ZmKQorICB0aGVuIGxlbiA6PSBidWZsZW4tb2ZmOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmYpOworCisgIGlmIChGUmVhZEJ1ZmZlciA8PiBuaWwpIGFuZCAobGVuID4gMCkgdGhlbiBiZWdpbgorICAgIHJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBwVG1wXiwgbGVuKTsKKyAgICBpZiByZXN1bHQgPiAwIHRoZW4gYmVnaW4KKyAgICAgIEV4aXQ7CisgICAgZW5kOworICBlbmQ7CisKKyAgUmVhZEZyYW1lOworICBpZiBsZW4gPiAwCisgIHRoZW4gUmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK3Byb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5SZWFkRnJhbWU7Cit2YXIKKyAgaTMycmQgOiBUQnl0ZXM7CisgIHNpemUgOiBJbnRlZ2VyOworICBidWZmIDogVEJ5dGVzOworYmVnaW4KKyAgU2V0TGVuZ3RoKCBpMzJyZCwgRkhlYWRlclNpemUgKTsKKyAgRlRyYW5zcG9ydC5SZWFkQWxsKCBpMzJyZCwgMCwgRkhlYWRlclNpemUpOworICBzaXplIDo9CisgICAgKChpMzJyZFswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCisgICAgKChpMzJyZFsxXSBhbmQgJEZGKSBzaGwgMTYpIG9yCisgICAgKChpMzJyZFsyXSBhbmQgJEZGKSBzaGwgOCkgb3IKKyAgICAgKGkzMnJkWzNdIGFuZCAkRkYpOworICBTZXRMZW5ndGgoIGJ1ZmYsIHNpemUgKTsKKyAgRlRyYW5zcG9ydC5SZWFkQWxsKCBidWZmLCAwLCBzaXplICk7CisgIEZSZWFkQnVmZmVyLkZyZWU7CisgIEZSZWFkQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOworICBpZiBMZW5ndGgoYnVmZikgPiAwCisgIHRoZW4gRlJlYWRCdWZmZXIuV3JpdGUoIFBvaW50ZXIoQGJ1ZmZbMF0pXiwgc2l6ZSApOworICBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA6PSAwOworZW5kOworCitwcm9jZWR1cmUgVEZyYW1lZFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbgorICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZik7CisKKyAgICBGV3JpdGVCdWZmZXIuV3JpdGUoIHBUbXBeLCBsZW4gKTsKKyAgZW5kOworZW5kOworCit7IFRGcmFtZWRUcmFuc3BvcnQuVEZhY3RvcnkgfQorCitmdW5jdGlvbiBURnJhbWVkVHJhbnNwb3J0SW1wbC5URmFjdG9yeS5HZXRUcmFuc3BvcnQoIGNvbnN0IEFUcmFuczogSVRyYW5zcG9ydCk6IElUcmFuc3BvcnQ7CitiZWdpbgorICBSZXN1bHQgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBBVHJhbnMgKTsKK2VuZDsKKworeyBUVGNwU29ja2V0U3RyZWFtSW1wbCB9CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUY3BDbGllbnQuQ2xvc2U7CitlbmQ7CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9Citjb25zdHJ1Y3RvciBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRDdXN0b21JcENsaWVudDsgY29uc3QgYVRpbWVvdXQgOiBJbnRlZ2VyKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZUY3BDbGllbnQgOj0gQVRjcENsaWVudDsKKyAgRlRpbWVvdXQgOj0gYVRpbWVvdXQ7CitlbmQ7Cit7JEVMU0V9Citjb25zdHJ1Y3RvciBUVGNwU29ja2V0U3RyZWFtSW1wbC5DcmVhdGUoIGNvbnN0IEFUY3BDbGllbnQ6IFRTb2NrZXQ7IGNvbnN0IGFUaW1lb3V0IDogTG9uZ3dvcmQpOworYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKKyAgRlRjcENsaWVudCA6PSBBVGNwQ2xpZW50OworICBpZiBhVGltZW91dCA9IDAgdGhlbgorICAgIEZUY3BDbGllbnQuUmVjdlRpbWVvdXQgOj0gU0xFRVBfVElNRQorICBlbHNlCisgICAgRlRjcENsaWVudC5SZWN2VGltZW91dCA6PSBhVGltZW91dDsKKyAgRlRjcENsaWVudC5TZW5kVGltZW91dCA6PSBhVGltZW91dDsKK2VuZDsKK3skRU5ESUZ9CisKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5GbHVzaDsKK2JlZ2luCisKK2VuZDsKKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuSXNPcGVuOiBCb29sZWFuOworYmVnaW4KK3skSUZERUYgT0xEX1NPQ0tFVFN9CisgIFJlc3VsdCA6PSBGVGNwQ2xpZW50LkFjdGl2ZTsKK3skRUxTRX0KKyAgUmVzdWx0IDo9IEZUY3BDbGllbnQuSXNPcGVuOworeyRFTkRJRn0KK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLk9wZW47CitiZWdpbgorICBGVGNwQ2xpZW50Lk9wZW47CitlbmQ7CisKKworeyRJRkRFRiBPTERfU09DS0VUU30KK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlNlbGVjdCggUmVhZFJlYWR5LCBXcml0ZVJlYWR5LCBFeGNlcHRGbGFnOiBQQm9vbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZU91dDogSW50ZWdlcjsgdmFyIHdzYUVycm9yIDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIKKyAgUmVhZEZkczogVEZEc2V0OworICBSZWFkRmRzcHRyOiBQRkRzZXQ7CisgIFdyaXRlRmRzOiBURkRzZXQ7CisgIFdyaXRlRmRzcHRyOiBQRkRzZXQ7CisgIEV4Y2VwdEZkczogVEZEc2V0OworICBFeGNlcHRGZHNwdHI6IFBGRHNldDsKKyAgdHY6IHRpbWV2YWw7CisgIFRpbWVwdHI6IFBUaW1ldmFsOworICBzb2NrZXQgOiBUU29ja2V0OworYmVnaW4KKyAgaWYgbm90IEZUY3BDbGllbnQuQWN0aXZlIHRoZW4gYmVnaW4KKyAgICB3c2FFcnJvciA6PSBXU0FFSU5WQUw7CisgICAgRXhpdCggU09DS0VUX0VSUk9SKTsKKyAgZW5kOworCisgIHNvY2tldCA6PSBGVGNwQ2xpZW50LkhhbmRsZTsKKworICBpZiBBc3NpZ25lZChSZWFkUmVhZHkpIHRoZW4gYmVnaW4KKyAgICBSZWFkRmRzcHRyIDo9IEBSZWFkRmRzOworICAgIEZEX1pFUk8oUmVhZEZkcyk7CisgICAgRkRfU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgUmVhZEZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChXcml0ZVJlYWR5KSB0aGVuIGJlZ2luCisgICAgV3JpdGVGZHNwdHIgOj0gQFdyaXRlRmRzOworICAgIEZEX1pFUk8oV3JpdGVGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIFdyaXRlRmRzKTsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBXcml0ZUZkc3B0ciA6PSBuaWw7CisgIGVuZDsKKworICBpZiBBc3NpZ25lZChFeGNlcHRGbGFnKSB0aGVuIGJlZ2luCisgICAgRXhjZXB0RmRzcHRyIDo9IEBFeGNlcHRGZHM7CisgICAgRkRfWkVSTyhFeGNlcHRGZHMpOworICAgIEZEX1NFVChzb2NrZXQsIEV4Y2VwdEZkcyk7CisgIGVuZAorICBlbHNlIGJlZ2luCisgICAgRXhjZXB0RmRzcHRyIDo9IG5pbDsKKyAgZW5kOworCisgIGlmIFRpbWVPdXQgPj0gMCB0aGVuIGJlZ2luCisgICAgdHYudHZfc2VjIDo9IFRpbWVPdXQgZGl2IDEwMDA7CisgICAgdHYudHZfdXNlYyA6PSAgMTAwMCAqIChUaW1lT3V0IG1vZCAxMDAwKTsKKyAgICBUaW1lcHRyIDo9IEB0djsKKyAgZW5kCisgIGVsc2UgYmVnaW4KKyAgICBUaW1lcHRyIDo9IG5pbDsgIC8vIHdhaXQgZm9yZXZlcgorICBlbmQ7CisKKyAgd3NhRXJyb3IgOj0gMDsKKyAgdHJ5CisgICAgeyRJRkRFRiBNU1dJTkRPV1N9CisgICAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgICAgcmVzdWx0IDo9IFdpblNvY2suc2VsZWN0KCAgICAgICAgc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgICB7JEVMU0V9CisgICAgICByZXN1bHQgOj0gV2luYXBpLldpblNvY2suc2VsZWN0KCBzb2NrZXQgKyAxLCBSZWFkRmRzcHRyLCBXcml0ZUZkc3B0ciwgRXhjZXB0RmRzcHRyLCBUaW1lcHRyKTsKKyAgICAgIHskRU5ESUZ9CisgICAgeyRFTkRJRn0KKyAgICB7JElGREVGIExJTlVYfQorICAgICAgcmVzdWx0IDo9IExpYmMuc2VsZWN0KCAgICAgICAgICAgc29ja2V0ICsgMSwgUmVhZEZkc3B0ciwgV3JpdGVGZHNwdHIsIEV4Y2VwdEZkc3B0ciwgVGltZXB0cik7CisgICAgeyRFTkRJRn0KKwkKKyAgICBpZiByZXN1bHQgPSBTT0NLRVRfRVJST1IKKyAgICB0aGVuIHdzYUVycm9yIDo9IFdTQUdldExhc3RFcnJvcjsKKworICBleGNlcHQKKyAgICByZXN1bHQgOj0gU09DS0VUX0VSUk9SOworICBlbmQ7CisKKyAgaWYgQXNzaWduZWQoUmVhZFJlYWR5KSB0aGVuCisgICBSZWFkUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgUmVhZEZkcyk7CisgICAKKyAgaWYgQXNzaWduZWQoV3JpdGVSZWFkeSkgdGhlbgorICAgIFdyaXRlUmVhZHleIDo9IEZEX0lTU0VUKHNvY2tldCwgV3JpdGVGZHMpOworICAKKyAgaWYgQXNzaWduZWQoRXhjZXB0RmxhZykgdGhlbgorICAgIEV4Y2VwdEZsYWdeIDo9IEZEX0lTU0VUKHNvY2tldCwgRXhjZXB0RmRzKTsKK2VuZDsKK3skRU5ESUZ9CisKK3skSUZERUYgT0xEX1NPQ0tFVFN9CitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5XYWl0Rm9yRGF0YSggVGltZU91dCA6IEludGVnZXI7IHBCdWYgOiBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2lyZWRCeXRlcyA6IEludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdzYUVycm9yLCBieXRlc1JlYWR5IDogSW50ZWdlcik6IFRXYWl0Rm9yRGF0YTsKK3ZhciBiQ2FuUmVhZCwgYkVycm9yIDogQm9vbGVhbjsKKyAgICByZXR2YWwgOiBJbnRlZ2VyOworY29uc3QgCisgIE1TR19QRUVLID0geyRJRkRFRiBPTERfVU5JVF9OQU1FU30gV2luU29jay5NU0dfUEVFSyAgeyRFTFNFfSBXaW5hcGkuV2luU29jay5NU0dfUEVFSyAgeyRFTkRJRn07CitiZWdpbgorICBieXRlc1JlYWR5IDo9IDA7CisKKyAgLy8gVGhlIHNlbGVjdCBmdW5jdGlvbiByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2Ygc29ja2V0IGhhbmRsZXMgdGhhdCBhcmUgcmVhZHkKKyAgLy8gYW5kIGNvbnRhaW5lZCBpbiB0aGUgZmRfc2V0IHN0cnVjdHVyZXMsIHplcm8gaWYgdGhlIHRpbWUgbGltaXQgZXhwaXJlZCwKKyAgLy8gb3IgU09DS0VUX0VSUk9SIGlmIGFuIGVycm9yIG9jY3VycmVkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIFNPQ0tFVF9FUlJPUiwKKyAgLy8gV1NBR2V0TGFzdEVycm9yIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgZXJyb3IgY29kZS4KKyAgcmV0dmFsIDo9IFNlbGYuU2VsZWN0KCBAYkNhblJlYWQsIG5pbCwgQGJFcnJvciwgVGltZU91dCwgd3NhRXJyb3IpOworICBpZiByZXR2YWwgPSBTT0NLRVRfRVJST1IKKyAgdGhlbiBFeGl0KCBUV2FpdEZvckRhdGEud2ZkX0Vycm9yKTsKKyAgaWYgKHJldHZhbCA9IDApIG9yIG5vdCBiQ2FuUmVhZAorICB0aGVuIEV4aXQoIFRXYWl0Rm9yRGF0YS53ZmRfVGltZW91dCk7CisKKyAgLy8gcmVjdigpIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgIC8vIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSAwIHdoZW4gdGhlIHBlZXIgaGFzIHBlcmZvcm1lZCBhbiBvcmRlcmx5IHNodXRkb3duLgorICAKKyAgcmV0dmFsIDo9IHJlY3YoIEZUY3BDbGllbnQuSGFuZGxlLCBwQnVmXiwgRGVzaXJlZEJ5dGVzLCBNU0dfUEVFSyk7CisgIGlmIHJldHZhbCA8PSAwCisgIHRoZW4gRXhpdCggVFdhaXRGb3JEYXRhLndmZF9FcnJvcik7CisKKyAgLy8gYXQgbGVhc3Qgd2UgaGF2ZSBzb21lIGRhdGEKKyAgYnl0ZXNSZWFkeSA6PSBNaW4oIHJldHZhbCwgRGVzaXJlZEJ5dGVzKTsKKyAgcmVzdWx0IDo9IFRXYWl0Rm9yRGF0YS53ZmRfSGF2ZURhdGE7CitlbmQ7Cit7JEVORElGfQorCit7JElGREVGIE9MRF9TT0NLRVRTfQorZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gb2xkIHNvY2tldHMgdmVyc2lvbgordmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKKyAgICB3c2FFcnJvciwKKyAgICBtc2VjcyA6IEludGVnZXI7CisgICAgbkJ5dGVzIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CitiZWdpbgorICBpbmhlcml0ZWQ7CisKKyAgaWYgRlRpbWVvdXQgPiAwCisgIHRoZW4gbXNlY3MgOj0gRlRpbWVvdXQKKyAgZWxzZSBtc2VjcyA6PSBERUZBVUxUX1RIUklGVF9USU1FT1VUOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKworICAgIHdoaWxlIFRSVUUgZG8gYmVnaW4KKyAgICAgIHdmZCA6PSBXYWl0Rm9yRGF0YSggbXNlY3MsIHBUbXAsIGNvdW50LCB3c2FFcnJvciwgbkJ5dGVzKTsKKyAgICAgIGNhc2Ugd2ZkIG9mCisgICAgICAgIFRXYWl0Rm9yRGF0YS53ZmRfRXJyb3IgICAgOiAgRXhpdDsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9IYXZlRGF0YSA6ICBCcmVhazsKKyAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9UaW1lb3V0ICA6ICBiZWdpbgorICAgICAgICAgIGlmIChGVGltZW91dCA9IDApCisgICAgICAgICAgdGhlbiBFeGl0CisgICAgICAgICAgZWxzZSBiZWdpbgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoQ2FyZGluYWwod3NhRXJyb3IpKSk7CisKKyAgICAgICAgICBlbmQ7CisgICAgICAgIGVuZDsKKyAgICAgIGVsc2UKKyAgICAgICAgQVNTRVJUKCBGQUxTRSk7CisgICAgICBlbmQ7CisgICAgZW5kOworCisgICAgLy8gcmVkdWNlIHRoZSB0aW1lb3V0IG9uY2Ugd2UgZ290IGRhdGEKKyAgICBpZiBGVGltZW91dCA+IDAKKyAgICB0aGVuIG1zZWNzIDo9IEZUaW1lb3V0IGRpdiAxMAorICAgIGVsc2UgbXNlY3MgOj0gREVGQVVMVF9USFJJRlRfVElNRU9VVCBkaXYgMTA7CisgICAgbXNlY3MgOj0gTWF4KCBtc2VjcywgMjAwKTsKKworICAgIEFTU0VSVCggbkJ5dGVzIDw9IGNvdW50KTsKKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWNlaXZlQnVmKCBwVG1wXiwgbkJ5dGVzKTsKKyAgICBJbmMoIHBUbXAsIG5CeXRlcyk7CisgICAgRGVjKCBjb3VudCwgbkJ5dGVzKTsKKyAgICBJbmMoIHJlc3VsdCwgbkJ5dGVzKTsKKyAgZW5kOworZW5kOworCitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5Ub0FycmF5OiBUQnl0ZXM7CisvLyBvbGQgc29ja2V0cyB2ZXJzaW9uCit2YXIgbGVuIDogSW50ZWdlcjsKK2JlZ2luCisgIGxlbiA6PSAwOworICBpZiBJc09wZW4gdGhlbiBiZWdpbgorICAgIGxlbiA6PSBGVGNwQ2xpZW50LkJ5dGVzUmVjZWl2ZWQ7CisgIGVuZDsKKworICBTZXRMZW5ndGgoIFJlc3VsdCwgbGVuICk7CisKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgRlRjcENsaWVudC5SZWNlaXZlQnVmKCBQb2ludGVyKEBSZXN1bHRbMF0pXiwgbGVuKTsKKyAgZW5kOworZW5kOworCitwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKKy8vIG9sZCBzb2NrZXRzIHZlcnNpb24KK3ZhciBiQ2FuV3JpdGUsIGJFcnJvciA6IEJvb2xlYW47CisgICAgcmV0dmFsLCB3c2FFcnJvciA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LkFjdGl2ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICAvLyBUaGUgc2VsZWN0IGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzb2NrZXQgaGFuZGxlcyB0aGF0IGFyZSByZWFkeQorICAvLyBhbmQgY29udGFpbmVkIGluIHRoZSBmZF9zZXQgc3RydWN0dXJlcywgemVybyBpZiB0aGUgdGltZSBsaW1pdCBleHBpcmVkLAorICAvLyBvciBTT0NLRVRfRVJST1IgaWYgYW4gZXJyb3Igb2NjdXJyZWQuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgU09DS0VUX0VSUk9SLAorICAvLyBXU0FHZXRMYXN0RXJyb3IgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBlcnJvciBjb2RlLgorICByZXR2YWwgOj0gU2VsZi5TZWxlY3QoIG5pbCwgQGJDYW5Xcml0ZSwgQGJFcnJvciwgRlRpbWVPdXQsIHdzYUVycm9yKTsKKyAgaWYgcmV0dmFsID0gU09DS0VUX0VSUk9SCisgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKFN5c0Vycm9yTWVzc2FnZShDYXJkaW5hbCh3c2FFcnJvcikpKTsKKworICBpZiAocmV0dmFsID0gMCkKKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVGltZWRPdXQuQ3JlYXRlKCd0aW1lZCBvdXQnKTsKKworICBpZiBiRXJyb3Igb3Igbm90IGJDYW5Xcml0ZQorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgndW5rbm93biBlcnJvcicpOworCisgIHBUbXAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICBGVGNwQ2xpZW50LlNlbmRCdWYoIHBUbXBeLCBjb3VudCk7CitlbmQ7CisKK3skRUxTRX0KKworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworLy8gbmV3IHNvY2tldHMgdmVyc2lvbgordmFyIG5CeXRlcyA6IEludGVnZXI7CisgICAgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIHJlc3VsdCA6PSAwOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOworICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KKyAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKCBwVG1wXiwgY291bnQpOworICAgIGlmIG5CeXRlcyA9IDAgdGhlbiBFeGl0OworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKKyAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOworICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOworICBlbmQ7CitlbmQ7CisKK2Z1bmN0aW9uIFRUY3BTb2NrZXRTdHJlYW1JbXBsLlRvQXJyYXk6IFRCeXRlczsKKy8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBsZW4gOiBJbnRlZ2VyOworYmVnaW4KKyAgbGVuIDo9IDA7CisgIHRyeQorICAgIGlmIEZUY3BDbGllbnQuUGVlayB0aGVuCisgICAgICByZXBlYXQKKyAgICAgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgKyAxMDI0KTsKKyAgICAgICAgbGVuIDo9IEZUY3BDbGllbnQuUmVhZChSZXN1bHRbTGVuZ3RoKFJlc3VsdCkgLSAxMDI0XSwgMTAyNCk7CisgICAgICB1bnRpbCBsZW4gPCAxMDI0OworICBleGNlcHQKKyAgICBvbiBUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luIHsgZG9uJ3QgYWxsb3cgZGVmYXVsdCBleGNlcHRpb25zIH0gZW5kOworICAgIGVsc2UgcmFpc2U7CisgIGVuZDsKKyAgaWYgbGVuID4gMCB0aGVuCisgICAgU2V0TGVuZ3RoKFJlc3VsdCwgTGVuZ3RoKFJlc3VsdCkgLSAxMDI0ICsgbGVuKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7CisvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCit2YXIgcFRtcCA6IFBCeXRlOworYmVnaW4KKyAgaW5oZXJpdGVkOworCisgIGlmIG5vdCBGVGNwQ2xpZW50LklzT3BlbgorICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnbm90IG9wZW4nKTsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgRlRjcENsaWVudC5Xcml0ZSggcFRtcF4sIGNvdW50KTsKK2VuZDsKKworeyRFTkRJRn0KKworCit7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIxLjB9Citpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgVEZyYW1lZFRyYW5zcG9ydEltcGxfSW5pdGlhbGl6ZTsKK2VuZDsKK3skSUZFTkR9CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThlOTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMKQEAgLTAsMCArMSw5NSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5UeXBlUmVnaXN0cnk7CisKK2ludGVyZmFjZQorCit1c2VzCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUeXBJbmZvLAorICBUaHJpZnQuUHJvdG9jb2w7CisKK3R5cGUKKyAgVEZhY3RvcnlNZXRob2Q8VD4gPSBmdW5jdGlvbjpUOworCisgIFR5cGVSZWdpc3RyeSA9IGNsYXNzCisgIHByaXZhdGUKKyAgICBjbGFzcyB2YXIgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwIDogVERpY3Rpb25hcnk8UG9pbnRlciwgUG9pbnRlcj47CisgIHB1YmxpYworICAgIGNsYXNzIGNvbnN0cnVjdG9yIENyZWF0ZTsKKyAgICBjbGFzcyBkZXN0cnVjdG9yIERlc3Ryb3k7CisgICAgY2xhc3MgcHJvY2VkdXJlIFJlZ2lzdGVyVHlwZUZhY3Rvcnk8Rj4oY29uc3QgYUZhY3RvcnlNZXRob2Q6IFRGYWN0b3J5TWV0aG9kPEY+KTsKKyAgICBjbGFzcyBmdW5jdGlvbiAgQ29uc3RydWN0PEY+OiBGOworICAgIGNsYXNzIGZ1bmN0aW9uICBDb25zdHJ1Y3RGcm9tVHlwZUluZm8oY29uc3QgYVR5cGVJbmZvOiBQVHlwZUluZm8pOiBJQmFzZTsKKyAgZW5kOworCitpbXBsZW1lbnRhdGlvbgorCisKK3sgVHlwZVJlZ2lzdHJhdGlvbiB9CisKK2NsYXNzIGNvbnN0cnVjdG9yIFR5cGVSZWdpc3RyeS5DcmVhdGU7CitiZWdpbgorICBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAgOj0gVERpY3Rpb25hcnk8UG9pbnRlciwgUG9pbnRlcj4uQ3JlYXRlOworZW5kOworCitjbGFzcyBkZXN0cnVjdG9yIFR5cGVSZWdpc3RyeS5EZXN0cm95OworYmVnaW4KKyAgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLkZyZWU7CitlbmQ7CisKK2NsYXNzIHByb2NlZHVyZSBUeXBlUmVnaXN0cnkuUmVnaXN0ZXJUeXBlRmFjdG9yeTxGPihjb25zdCBhRmFjdG9yeU1ldGhvZDogVEZhY3RvcnlNZXRob2Q8Rj4pOwordmFyCisgIFR5cGVJbmZvICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBUeXBlSW5mbyA6PSBTeXN0ZW0uVHlwZUluZm8oRik7CisKKyAgaWYgKFR5cGVJbmZvIDw+IG5pbCkgYW5kIChQVHlwZUluZm8oVHlwZUluZm8pLktpbmQgPSB0a0ludGVyZmFjZSkKKyAgdGhlbiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuQWRkT3JTZXRWYWx1ZShUeXBlSW5mbywgQGFGYWN0b3J5TWV0aG9kKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdDxGPjogRjsKK3ZhcgorICBUeXBlSW5mbyAgICAgOiBQVHlwZUluZm87CisgIEZhY3RvcnkgICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gZGVmYXVsdChGKTsKKworICBUeXBlSW5mbyA6PSBTeXN0ZW0uVHlwZUluZm8oRik7CisKKyAgaWYgQXNzaWduZWQoVHlwZUluZm8pIGFuZCAoVHlwZUluZm8uS2luZCA9IHRrSW50ZXJmYWNlKQorICB0aGVuIGJlZ2luCisgICAgaWYgRlR5cGVJbmZvVG9GYWN0b3J5TG9va3VwLlRyeUdldFZhbHVlKFR5cGVJbmZvLCBGYWN0b3J5KQorICAgIHRoZW4gUmVzdWx0IDo9IFRGYWN0b3J5TWV0aG9kPEY+KEZhY3RvcnkpKCk7CisgIGVuZDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVHlwZVJlZ2lzdHJ5LkNvbnN0cnVjdEZyb21UeXBlSW5mbyhjb25zdCBhVHlwZUluZm86IFBUeXBlSW5mbyk6IElCYXNlOwordmFyCisgIEZhY3RvcnkgICAgICA6IFBvaW50ZXI7CitiZWdpbgorICBSZXN1bHQgOj0gbmlsOworICBpZiBGVHlwZUluZm9Ub0ZhY3RvcnlMb29rdXAuVHJ5R2V0VmFsdWUoYVR5cGVJbmZvLCBGYWN0b3J5KQorICB0aGVuIFJlc3VsdCA6PSBJQmFzZShURmFjdG9yeU1ldGhvZDxJQmFzZT4oRmFjdG9yeSkoKSk7CitlbmQ7CisKKworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCmluZGV4IDcyYzBkYzEuLjdlNTc4NjMgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwpAQCAtMSwzNiArMSwyNTkgQEAKLSgqDQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqDQotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKg0KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqKQ0KLQ0KLXVuaXQgVGhyaWZ0LlV0aWxzOw0KLQ0KLWludGVyZmFjZQ0KLQ0KLWZ1bmN0aW9uIElmVmFsdWUoQjogQm9vbGVhbjsgY29uc3QgVHJ1ZVZhbHVlLCBGYWxzZVZhbHVlOiBXaWRlU3RyaW5nKTogc3RyaW5nOw0KLQ0KLWltcGxlbWVudGF0aW9uDQotDQotZnVuY3Rpb24gSWZWYWx1ZShCOiBCb29sZWFuOyBjb25zdCBUcnVlVmFsdWUsIEZhbHNlVmFsdWU6IFdpZGVTdHJpbmcpOiBzdHJpbmc7DQotYmVnaW4NCi0gIGlmIEIgdGhlbg0KLSAgICBSZXN1bHQgOj0gVHJ1ZVZhbHVlDQotICBlbHNlDQotICAgIFJlc3VsdCA6PSBGYWxzZVZhbHVlOw0KLWVuZDsNCi0NCi1lbmQuDQorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRocmlmdC5VdGlsczsKKworaW50ZXJmYWNlCisKK3skSSBUaHJpZnQuRGVmaW5lcy5pbmN9CisKK3VzZXMKKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIENoYXJhY3RlciwgU3luY09ianM7CisgIHskRUxTRX0KKyAgU3lzdGVtLkNsYXNzZXMsIFdpbmFwaS5XaW5kb3dzLCBTeXN0ZW0uU3lzVXRpbHMsIFN5c3RlbS5DaGFyYWN0ZXIsIFN5c3RlbS5TeW5jT2JqczsKKyAgeyRFTkRJRn0KKwordHlwZQorICBJT3ZlcmxhcHBlZEhlbHBlciA9IGludGVyZmFjZQorICAgIFsne0ExODMyRUZBLTJFMDItNDg4NC04RjA5LUYwQTAyNzcxNTdGQX0nXQorICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBPdmVybGFwcGVkUHRyIDogUE92ZXJsYXBwZWQ7CisgICAgZnVuY3Rpb24gV2FpdEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV2FpdEZvcihkd1RpbWVvdXQ6IERXT1JEKSA6IERXT1JEOworICBlbmQ7CisKKyAgVE92ZXJsYXBwZWRIZWxwZXJJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJT3ZlcmxhcHBlZEhlbHBlcikKKyAgc3RyaWN0IHByb3RlY3RlZAorICAgIEZPdmVybGFwcGVkIDogVE92ZXJsYXBwZWQ7CisgICAgRkV2ZW50ICAgICAgOiBURXZlbnQ7CisKKyAgICAvLyBJT3ZlcmxhcHBlZEhlbHBlcgorICAgIGZ1bmN0aW9uIE92ZXJsYXBwZWQgOiBUT3ZlcmxhcHBlZDsKKyAgICBmdW5jdGlvbiBPdmVybGFwcGVkUHRyIDogUE92ZXJsYXBwZWQ7CisgICAgZnVuY3Rpb24gV2FpdEhhbmRsZSA6IFRIYW5kbGU7CisgICAgZnVuY3Rpb24gV2FpdEZvcihkd1RpbWVvdXQ6IERXT1JEKSA6IERXT1JEOworICBwdWJsaWMKKyAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyAgb3ZlcnJpZGU7CisgIGVuZDsKKworCisgIEJhc2U2NFV0aWxzID0gY2xhc3Mgc2VhbGVkCisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIEVuY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOyBzdGF0aWM7CisgICAgY2xhc3MgZnVuY3Rpb24gRGVjb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7IHN0YXRpYzsKKyAgZW5kOworCisKKyAgQ2hhclV0aWxzID0gY2xhc3Mgc2VhbGVkCisgIHB1YmxpYworICAgIGNsYXNzIGZ1bmN0aW9uIElzSGlnaFN1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsgc3RhdGljOyBpbmxpbmU7CisgICAgY2xhc3MgZnVuY3Rpb24gSXNMb3dTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47IHN0YXRpYzsgaW5saW5lOworICBlbmQ7CisKKworeyRJRkRFRiBXaW42NH0KK2Z1bmN0aW9uIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggdmFyIEFkZGVuZCA6IEludDY0OyBWYWx1ZSA6IEludDY0KSA6IEludDY0OyAgCit7JEVORElGfQorCisKK2ltcGxlbWVudGF0aW9uCisKK3sgVE92ZXJsYXBwZWRIZWxwZXJJbXBsIH0KKworY29uc3RydWN0b3IgVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZpbGxDaGFyKCBGT3ZlcmxhcHBlZCwgU2l6ZU9mKEZPdmVybGFwcGVkKSwgMCk7CisgIEZFdmVudCA6PSBURXZlbnQuQ3JlYXRlKCBuaWwsIFRSVUUsIEZBTFNFLCAnJyk7ICAvLyBhbHdheXMgTWFudWFsUmVzZXQsIHNlZSBNU0ROCisgIEZPdmVybGFwcGVkLmhFdmVudCA6PSBGRXZlbnQuSGFuZGxlOworZW5kOworCisKKworZGVzdHJ1Y3RvciBUT3ZlcmxhcHBlZEhlbHBlckltcGwuRGVzdHJveTsKK2JlZ2luCisgIHRyeQorICAgIEZPdmVybGFwcGVkLmhFdmVudCA6PSAwOworICAgIEZyZWVBbmROaWwoIEZFdmVudCk7CisKKyAgZmluYWxseQorICAgIGluaGVyaXRlZCBEZXN0cm95OworICBlbmQ7CisKK2VuZDsKKworCitmdW5jdGlvbiBUT3ZlcmxhcHBlZEhlbHBlckltcGwuT3ZlcmxhcHBlZCA6IFRPdmVybGFwcGVkOworYmVnaW4KKyAgcmVzdWx0IDo9IEZPdmVybGFwcGVkOworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5PdmVybGFwcGVkUHRyIDogUE92ZXJsYXBwZWQ7CitiZWdpbgorICByZXN1bHQgOj0gQEZPdmVybGFwcGVkOworZW5kOworCisKK2Z1bmN0aW9uIFRPdmVybGFwcGVkSGVscGVySW1wbC5XYWl0SGFuZGxlIDogVEhhbmRsZTsKK2JlZ2luCisgIHJlc3VsdCA6PSBGT3ZlcmxhcHBlZC5oRXZlbnQ7CitlbmQ7CisKKworZnVuY3Rpb24gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLldhaXRGb3IoIGR3VGltZW91dCA6IERXT1JEKSA6IERXT1JEOworYmVnaW4KKyAgcmVzdWx0IDo9IFdhaXRGb3JTaW5nbGVPYmplY3QoIEZPdmVybGFwcGVkLmhFdmVudCwgZHdUaW1lb3V0KTsKK2VuZDsKKworCit7IEJhc2U2NFV0aWxzIH0KKworY2xhc3MgZnVuY3Rpb24gQmFzZTY0VXRpbHMuRW5jb2RlKCBjb25zdCBzcmMgOiBUQnl0ZXM7IHNyY09mZiwgbGVuIDogSW50ZWdlcjsgZHN0IDogVEJ5dGVzOyBkc3RPZmYgOiBJbnRlZ2VyKSA6IEludGVnZXI7Citjb25zdCBFTkNPREVfVEFCTEUgOiBQQW5zaUNoYXIgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7CitiZWdpbgorICBBU1NFUlQoIGxlbiBpbiBbMS4uM10pOworICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbIChzcmNbc3JjT2ZmXSBzaHIgMikgYW5kICQzRl0pOworICBjYXNlIGxlbiBvZgorICAgIDMgOiBiZWdpbgorICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZl0gc2hsIDQpIGFuZCAkMzApIG9yICgoc3JjW3NyY09mZiArIDFdIHNociA0KSBhbmQgJDBGKV0pOworICAgICAgSW5jKGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSBCeXRlKCBFTkNPREVfVEFCTEVbICgoc3JjW3NyY09mZiArIDFdIHNobCAyKSBhbmQgJDNDKSBvciAoKHNyY1tzcmNPZmYgKyAyXSBzaHIgNikgYW5kICQwMyldKTsKKyAgICAgIEluYyhkc3RPZmYpOworICAgICAgZHN0W2RzdE9mZl0gOj0gQnl0ZSggRU5DT0RFX1RBQkxFWyBzcmNbc3JjT2ZmICsgMl0gYW5kICQzRl0pOworICAgICAgcmVzdWx0IDo9IDQ7CisgICAgZW5kOworCisgICAgMiA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKChzcmNbc3JjT2ZmXSBzaGwgNCkgYW5kICQzMCkgb3IgKChzcmNbc3JjT2ZmICsgMV0gc2hyIDQpIGFuZCAkMEYpXSk7CisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmYgKyAxXSBzaGwgMikgYW5kICQzQ10pOworICAgICAgcmVzdWx0IDo9IDM7CisgICAgZW5kOworCisgICAgMSA6IGJlZ2luCisgICAgICBJbmMoZHN0T2ZmKTsKKyAgICAgIGRzdFtkc3RPZmZdIDo9IEJ5dGUoIEVOQ09ERV9UQUJMRVsgKHNyY1tzcmNPZmZdIHNobCA0KSBhbmQgJDMwXSk7CisgICAgICByZXN1bHQgOj0gMjsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIEFTU0VSVCggRkFMU0UpOworICAgIHJlc3VsdCA6PSAwOyAgLy8gYmVjYXVzZSBpbnZhbGlkIGNhbGwKKyAgZW5kOworZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIEJhc2U2NFV0aWxzLkRlY29kZSggY29uc3Qgc3JjIDogVEJ5dGVzOyBzcmNPZmYsIGxlbiA6IEludGVnZXI7IGRzdCA6IFRCeXRlczsgZHN0T2ZmIDogSW50ZWdlcikgOiBJbnRlZ2VyOworY29uc3QgREVDT0RFX1RBQkxFIDogYXJyYXlbMC4uJEZGXSBvZiBJbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgPSAoIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsNjIsLTEsLTEsLTEsNjMsCisgICAgICAgICAgICAgICAgICAgICAgIDUyLDUzLDU0LDU1LDU2LDU3LDU4LDU5LDYwLDYxLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5LDQwLAorICAgICAgICAgICAgICAgICAgICAgICA0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCw1MSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLAorICAgICAgICAgICAgICAgICAgICAgICAtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsLTEsCisgICAgICAgICAgICAgICAgICAgICAgIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xICApOworYmVnaW4KKyAgQVNTRVJUKCBsZW4gaW4gWzEuLjRdKTsKKyAgcmVzdWx0IDo9IDE7CisgIGRzdFtkc3RPZmZdIDo9ICgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmZdICAgICBhbmQgJDBGRl0gc2hsIDIpCisgICAgICAgICAgICAgIG9yICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSBhbmQgJDBGRl0gc2hyIDQpKTsKKworICBpZiAobGVuID4gMikgdGhlbiBiZWdpbgorICAgIEluYyggcmVzdWx0KTsKKyAgICBJbmMoIGRzdE9mZik7CisgICAgZHN0W2RzdE9mZl0gOj0gKCgoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAxXSBhbmQgJDBGRl0gc2hsIDQpIGFuZCAkRjApCisgICAgICAgICAgICAgICAgb3IgICAoREVDT0RFX1RBQkxFW3NyY1tzcmNPZmYgKyAyXSBhbmQgJDBGRl0gc2hyIDIpKTsKKworICAgIGlmIChsZW4gPiAzKSB0aGVuIGJlZ2luCisgICAgICBJbmMoIHJlc3VsdCk7CisgICAgICBJbmMoIGRzdE9mZik7CisgICAgICBkc3RbZHN0T2ZmXSA6PSAoKChERUNPREVfVEFCTEVbc3JjW3NyY09mZiArIDJdIGFuZCAkMEZGXSBzaGwgNikgYW5kICRDMCkKKyAgICAgICAgICAgICAgICAgIG9yICAgIERFQ09ERV9UQUJMRVtzcmNbc3JjT2ZmICsgM10gYW5kICQwRkZdKTsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZDsKKworCitjbGFzcyBmdW5jdGlvbiBDaGFyVXRpbHMuSXNIaWdoU3Vycm9nYXRlKCBjb25zdCBjIDogQ2hhcikgOiBCb29sZWFuOworYmVnaW4KKyAgeyRJRiBDb21waWxlclZlcnNpb24gPCAyNS4wfQorICAgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgICAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0hpZ2hTdXJyb2dhdGUoYyk7CisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBTeXN0ZW0uQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVORElGfQorICB7JEVMU0V9CisgIHJlc3VsdCA6PSBjLklzSGlnaFN1cnJvZ2F0ZSgpOworICB7JElGRU5EfQorZW5kOworCisKK2NsYXNzIGZ1bmN0aW9uIENoYXJVdGlscy5Jc0xvd1N1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsKK2JlZ2luCisgIHskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjUuMH0KKyAgICB7JElGREVGIE9MRF9VTklUX05BTUVTfQorICAgIHJlc3VsdCA6PSBDaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoYyk7CisgICAgeyRFTFNFfQorICAgIHJlc3VsdCA6PSBTeXN0ZW0uQ2hhcmFjdGVyLklzTG93U3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IGMuSXNMb3dTdXJyb2dhdGUoKTsKKyAgeyRJRkVORH0KK2VuZDsKKworCit7JElGREVGIFdpbjY0fQorCitmdW5jdGlvbiBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0KCB2YXIgVGFyZ2V0IDogSW50NjQ7IEV4Y2hhbmdlLCBDb21wYXJhbmQgOiBJbnQ2NCkgOiBJbnQ2NDsgIGlubGluZTsKK2JlZ2luCisgIHskSUZERUYgT0xEX1VOSVRfTkFNRVN9CisgIHJlc3VsdCA6PSBXaW5kb3dzLkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIFRhcmdldCwgRXhjaGFuZ2UsIENvbXBhcmFuZCk7CisgIHskRUxTRX0KKyAgcmVzdWx0IDo9IFdpbkFwaS5XaW5kb3dzLkludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIFRhcmdldCwgRXhjaGFuZ2UsIENvbXBhcmFuZCk7CisgIHskRU5ESUZ9CitlbmQ7CisKKworZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7Cit2YXIgb2xkIDogSW50NjQ7CitiZWdpbgorICByZXBlYXQKKyAgICBPbGQgOj0gQWRkZW5kOworICB1bnRpbCAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggQWRkZW5kLCBPbGQgKyBWYWx1ZSwgT2xkKSA9IE9sZCk7CisgIHJlc3VsdCA6PSBPbGQ7CitlbmQ7CisKK3skRU5ESUZ9CisKKworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKaW5kZXggNjhlMWY3ZC4uNjI0ODFlNyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCkBAIC0yMiwxOCArMjIsMTkgQEAKIGludGVyZmFjZQogCiB1c2VzCi0gIFN5c1V0aWxzLCBUaHJpZnQuUHJvdG9jb2w7CisgIFN5c1V0aWxzLAorICBUaHJpZnQuRXhjZXB0aW9uLAorICBUaHJpZnQuUHJvdG9jb2w7CiAKIGNvbnN0Ci0gIFZlcnNpb24gPSAnMC45LjAnOworICBWZXJzaW9uID0gJzEuMC4wJzsKIAogdHlwZQotICBJUHJvY2Vzc29yID0gaW50ZXJmYWNlCi0gICAgWyd7QjE1MzhBMDctNkNBQy00NDA2LThBNEMtQUZFRDA3QzcwQTg5fSddCi0gICAgZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3QgOklQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCk6IEJvb2xlYW47Ci0gIGVuZDsKKyAgVEV4Y2VwdGlvbiA9IFRocmlmdC5FeGNlcHRpb24uVEV4Y2VwdGlvbjsgLy8gY29tcGF0aWJpbGl0eSBhbGlhcwogCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24gKQorICBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzID0gY2xhc3Mgb2YgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQ7CisKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gY2xhc3MoIFRFeGNlcHRpb24pCiAgIHB1YmxpYwogICAgIHR5cGUKIHskU0NPUEVERU5VTVMgT059CkBAIC00Myw3MyArNDQsMTI0IEBACiAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKICAgICAgICAgV3JvbmdNZXRob2ROYW1lLAogICAgICAgICBCYWRTZXF1ZW5jZUlELAotICAgICAgICBNaXNzaW5nUmVzdWx0CisgICAgICAgIE1pc3NpbmdSZXN1bHQsCisgICAgICAgIEludGVybmFsRXJyb3IsCisgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgIEludmFsaWRUcmFuc2Zvcm0sCisgICAgICAgIEludmFsaWRQcm90b2NvbCwKKyAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCiAgICAgICApOwogeyRTQ09QRURFTlVNUyBPRkZ9CiAgIHByaXZhdGUKLSAgICBGVHlwZSA6IFRFeGNlcHRpb25UeXBlOworICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRFeGNlcHRpb25UeXBlOworICBwcm90ZWN0ZWQKKyAgICBjb25zdHJ1Y3RvciBIaWRkZW5DcmVhdGUoY29uc3QgTXNnOiBzdHJpbmcpOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTsgb3ZlcmxvYWQ7CisgICAgLy8gcHVycG9zZWZ1bGx5IGhpZGUgaW5oZXJpdGVkIGNvbnN0cnVjdG9yCisgICAgY2xhc3MgZnVuY3Rpb24gQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyBvdmVybG9hZDsgZGVwcmVjYXRlZCAnVXNlIHNwZWNpYWxpemVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0eXBlcyAob3IgcmVnZW5lcmF0ZSBmcm9tIElETCknOworICAgIGNsYXNzIGZ1bmN0aW9uIENyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlOyBjb25zdCBtc2c6IHN0cmluZyk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsgb3ZlcmxvYWQ7IGRlcHJlY2F0ZWQgJ1VzZSBzcGVjaWFsaXplZCBUQXBwbGljYXRpb25FeGNlcHRpb24gdHlwZXMgKG9yIHJlZ2VuZXJhdGUgZnJvbSBJREwpJzsKKworICAgIGNsYXNzIGZ1bmN0aW9uIEdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZTogVEV4Y2VwdGlvblR5cGUpOiBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZENsYXNzOwogCiAgICAgY2xhc3MgZnVuY3Rpb24gUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKICAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wgKTsKICAgZW5kOwogCi0gIC8vIGJhc2UgY2xhc3MgZm9yIElETC1nZW5lcmF0ZWQgZXhjZXB0aW9ucwotICBURXhjZXB0aW9uID0gY2xhc3MoIFN5c1V0aWxzLkV4Y2VwdGlvbikKKyAgLy8gTmVlZGVkIHRvIHJlbW92ZSBkZXByZWNhdGlvbiB3YXJuaW5nCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkID0gY2xhc3MgYWJzdHJhY3QgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKICAgcHVibGljCi0gICAgZnVuY3Rpb24gTWVzc2FnZSA6IHN0cmluZzsgICAgICAgIC8vIGhpZGUgaW5oZXJpdGVkIHByb3BlcnR5OiBhbGxvdyByZWFkLCBidXQgcHJldmVudCBhY2NpZGVudGFsIHdyaXRlcwotICAgIHByb2NlZHVyZSBVcGRhdGVNZXNzYWdlUHJvcGVydHk7ICAvLyB1cGRhdGUgaW5oZXJpdGVkIG1lc3NhZ2UgcHJvcGVydHkgd2l0aCB0b1N0cmluZygpCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKICAgZW5kOwogCisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24gPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZE1lc3NhZ2VUeXBlID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uV3JvbmdNZXRob2ROYW1lID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yID0gY2xhc3MgKFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkKTsKKyAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvciA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CisgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRUcmFuc2Zvcm0gPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworICBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGUgPSBjbGFzcyAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOworCisKIGltcGxlbWVudGF0aW9uCiAKLXsgVEV4Y2VwdGlvbiB9Ci0KLWZ1bmN0aW9uIFRFeGNlcHRpb24uTWVzc2FnZTsKLS8vIGFsbG93IHJlYWQgKGV4Y2VwdGlvbiBzdW1tYXJ5KSwgYnV0IHByZXZlbnQgYWNjaWRlbnRhbCB3cml0ZXMKLS8vIHJlYWQgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiBzdW1tYXJ5Ci1iZWdpbgotICByZXN1bHQgOj0gU2VsZi5Ub1N0cmluZzsKLWVuZDsKLQotcHJvY2VkdXJlIFRFeGNlcHRpb24uVXBkYXRlTWVzc2FnZVByb3BlcnR5OwotLy8gVXBkYXRlIHRoZSBpbmhlcml0ZWQgTWVzc2FnZSBwcm9wZXJ0eSB0byBiZXR0ZXIgY29uZm9ybSB0byBzdGFuZGFyZCBiZWhhdmlvdXIuCi0vLyBOaWNlIGJlbmVmaXQ6IFRoZSBJREUgaXMgbm93IGFibGUgdG8gc2hvdyB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgYWdhaW4uCi1iZWdpbgotICBpbmhlcml0ZWQgTWVzc2FnZSA6PSBTZWxmLlRvU3RyaW5nOyAgLy8gcHJvZHVjZXMgYSBzdW1tYXJ5IHRleHQKLWVuZDsKLQogeyBUQXBwbGljYXRpb25FeGNlcHRpb24gfQogCi1jb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlOworZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFR5cGU6IFRFeGNlcHRpb25UeXBlOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSggJycgKTsKKyAgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd25NZXRob2QKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkTWVzc2FnZVR5cGUKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbldyb25nTWV0aG9kTmFtZSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5Xcm9uZ01ldGhvZE5hbWUKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkJhZFNlcXVlbmNlSUQgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuQmFkU2VxdWVuY2VJRAorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdCB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0CisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yIHRoZW4gUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3IKKyAgZWxzZSBpZiBTZWxmIGlzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblByb3RvY29sRXJyb3IgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuUHJvdG9jb2xFcnJvcgorICBlbHNlIGlmIFNlbGYgaXMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW52YWxpZFRyYW5zZm9ybSB0aGVuIFJlc3VsdCA6PSBURXhjZXB0aW9uVHlwZS5JbnZhbGlkVHJhbnNmb3JtCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkUHJvdG9jb2wgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuSW52YWxpZFByb3RvY29sCisgIGVsc2UgaWYgU2VsZiBpcyBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGUgdGhlbiBSZXN1bHQgOj0gVEV4Y2VwdGlvblR5cGUuVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgIGVsc2UgUmVzdWx0IDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CiBlbmQ7CiAKLWNvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5DcmVhdGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlOwotICBjb25zdCBtc2c6IHN0cmluZyk7Citjb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb24uSGlkZGVuQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTsKIGJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGUoIG1zZyApOwotICBGVHlwZSA6PSBBVHlwZTsKKyAgaW5oZXJpdGVkIENyZWF0ZShNc2cpOwogZW5kOwogCi1jb25zdHJ1Y3RvciBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKEFUeXBlOiBURXhjZXB0aW9uVHlwZSk7CitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKGNvbnN0IE1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwogYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZSgnJyk7Ci0gIEZUeXBlIDo9IEFUeXBlOworICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoTXNnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCcnKTsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkNyZWF0ZSggQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPRkZ9CisgIFJlc3VsdCA6PSBDcmVhdGUoQVR5cGUsICcnKTsKK3skV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBERUZBVUxUfQorZW5kOworCitjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCBBVHlwZTogVEV4Y2VwdGlvblR5cGU7IGNvbnN0IG1zZzogc3RyaW5nKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOworYmVnaW4KKyAgUmVzdWx0IDo9IEdldFNwZWNpYWxpemVkRXhjZXB0aW9uVHlwZShBVHlwZSkuQ3JlYXRlKG1zZyk7CitlbmQ7CisKK2NsYXNzIGZ1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5HZXRTcGVjaWFsaXplZEV4Y2VwdGlvblR5cGUoQVR5cGU6IFRFeGNlcHRpb25UeXBlKTogVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzczsKK2JlZ2luCisgIGNhc2UgQVR5cGUgb2YKKyAgICBURXhjZXB0aW9uVHlwZS5Vbmtub3duTWV0aG9kOiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Vbmtub3duTWV0aG9kOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRNZXNzYWdlVHlwZTogICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRNZXNzYWdlVHlwZTsKKyAgICBURXhjZXB0aW9uVHlwZS5Xcm9uZ01ldGhvZE5hbWU6ICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25Xcm9uZ01ldGhvZE5hbWU7CisgICAgVEV4Y2VwdGlvblR5cGUuQmFkU2VxdWVuY2VJRDogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uQmFkU2VxdWVuY2VJRDsKKyAgICBURXhjZXB0aW9uVHlwZS5NaXNzaW5nUmVzdWx0OiAgICAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25NaXNzaW5nUmVzdWx0OworICAgIFRFeGNlcHRpb25UeXBlLkludGVybmFsRXJyb3I6ICAgICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludGVybmFsRXJyb3I7CisgICAgVEV4Y2VwdGlvblR5cGUuUHJvdG9jb2xFcnJvcjogICAgICAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uUHJvdG9jb2xFcnJvcjsKKyAgICBURXhjZXB0aW9uVHlwZS5JbnZhbGlkVHJhbnNmb3JtOiAgICAgIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnZhbGlkVHJhbnNmb3JtOworICAgIFRFeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbDogICAgICAgUmVzdWx0IDo9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbDsKKyAgICBURXhjZXB0aW9uVHlwZS5VbnN1cHBvcnRlZENsaWVudFR5cGU6IFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25VbnN1cHBvcnRlZENsaWVudFR5cGU7CisgIGVsc2UKKyAgICBSZXN1bHQgOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bjsKKyAgZW5kOwogZW5kOwogCiBjbGFzcyBmdW5jdGlvbiBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZCggY29uc3QgaXByb3Q6IElQcm90b2NvbCk6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKIHZhcgotICBmaWVsZCA6IElGaWVsZDsKKyAgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CiAgIG1zZyA6IHN0cmluZzsKICAgdHlwIDogVEV4Y2VwdGlvblR5cGU7CisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKIGJlZ2luCiAgIG1zZyA6PSAnJzsKICAgdHlwIDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CisgIHN0cnVjIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbjsKICAgd2hpbGUgKCBUcnVlICkgZG8KICAgYmVnaW4KICAgICBmaWVsZCA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbjsKQEAgLTE0NSwxNyArMTk3LDE2IEBACiAgICAgaXByb3QuUmVhZEZpZWxkRW5kOwogICBlbmQ7CiAgIGlwcm90LlJlYWRTdHJ1Y3RFbmQ7Ci0gIFJlc3VsdCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb24uQ3JlYXRlKCB0eXAsIG1zZyApOworICBSZXN1bHQgOj0gR2V0U3BlY2lhbGl6ZWRFeGNlcHRpb25UeXBlKHR5cCkuQ3JlYXRlKG1zZyk7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQXBwbGljYXRpb25FeGNlcHRpb24uV3JpdGUoIGNvbnN0IG9wcm90OiBJUHJvdG9jb2wpOwogdmFyCi0gIHN0cnVjIDogSVN0cnVjdDsKLSAgZmllbGQgOiBJRmllbGQ7Ci0KKyAgc3RydWMgOiBUVGhyaWZ0U3RydWN0OworICBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKIGJlZ2luCi0gIHN0cnVjIDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSggJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicgKTsKLSAgZmllbGQgOj0gVEZpZWxkSW1wbC5DcmVhdGU7CisgIEluaXQoc3RydWMsICdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKKyAgSW5pdChmaWVsZCk7CiAKICAgb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbiggc3RydWMgKTsKICAgaWYgTWVzc2FnZSA8PiAnJyB0aGVuCkBAIC0xNzIsMTAgKzIyMywxNyBAQAogICBmaWVsZC5UeXBlXyA6PSBUVHlwZS5JMzI7CiAgIGZpZWxkLklkIDo9IDI7CiAgIG9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZCk7Ci0gIG9wcm90LldyaXRlSTMyKEludGVnZXIoRlR5cGUpKTsKKyAgb3Byb3QuV3JpdGVJMzIoSW50ZWdlcihHZXRUeXBlKSk7CiAgIG9wcm90LldyaXRlRmllbGRFbmQoKTsKICAgb3Byb3QuV3JpdGVGaWVsZFN0b3AoKTsKICAgb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsKIGVuZDsKIAoreyBUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCB9CisKK2NvbnN0cnVjdG9yIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkLkNyZWF0ZShjb25zdCBNc2c6IHN0cmluZyk7CitiZWdpbgorICBpbmhlcml0ZWQgSGlkZGVuQ3JlYXRlKE1zZyk7CitlbmQ7CisKIGVuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9Db25zb2xlSGVscGVyLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9Db25zb2xlSGVscGVyLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYThkZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCkBAIC0wLDAgKzEsMTMyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3VuaXQgQ29uc29sZUhlbHBlcjsKKworaW50ZXJmYWNlCisKK3VzZXMgQ2xhc3NlczsKKwordHlwZQorICBUVGhyaWZ0Q29uc29sZSA9IGNsYXNzCisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICBlbmQ7CisKKyAgVEdVSUNvbnNvbGUgPSBjbGFzcyggVFRocmlmdENvbnNvbGUgKQorICBwcml2YXRlCisgICAgRkxpbmVCcmVhayA6IEJvb2xlYW47CisgICAgRk1lbW8gOiBUU3RyaW5nczsKKworICAgIHByb2NlZHVyZSBJbnRlcm5hbFdyaXRlKCBjb25zdCBTOiBzdHJpbmc7IGJXcml0ZUxpbmU6IEJvb2xlYW4pOworICBwdWJsaWMKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IG92ZXJyaWRlOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKKyAgZW5kOworCitmdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsKK3Byb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKKworaW1wbGVtZW50YXRpb24KKwordmFyCisgIEZEZWZhdWx0Q29uc29sZSA6IFRUaHJpZnRDb25zb2xlOworICBGQ29uc29sZSA6IFRUaHJpZnRDb25zb2xlOworCitmdW5jdGlvbiBDb25zb2xlOiBUVGhyaWZ0Q29uc29sZTsKK2JlZ2luCisgIFJlc3VsdCA6PSBGQ29uc29sZTsKK2VuZDsKKworeyBUVGhyaWZ0Q29uc29sZSB9CisKK3Byb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlKCBTICk7CitlbmQ7CisKK3Byb2NlZHVyZSBUVGhyaWZ0Q29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIFN5c3RlbS5Xcml0ZWxuKCBTICk7CitlbmQ7CisKK3Byb2NlZHVyZSBDaGFuZ2VDb25zb2xlKCBBQ29uc29sZTogVFRocmlmdENvbnNvbGUgKTsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEFDb25zb2xlOworZW5kOworCitwcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7CitiZWdpbgorICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK3sgVEdVSUNvbnNvbGUgfQorCitjb25zdHJ1Y3RvciBUR1VJQ29uc29sZS5DcmVhdGUoIEFNZW1vOiBUU3RyaW5ncyk7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTWVtbyA6PSBBTWVtbzsKKyAgRkxpbmVCcmVhayA6PSBUcnVlOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuSW50ZXJuYWxXcml0ZShjb25zdCBTOiBzdHJpbmc7IGJXcml0ZUxpbmU6IEJvb2xlYW4pOwordmFyCisgIGlkeCA6IEludGVnZXI7CitiZWdpbgorICBpZiBGTGluZUJyZWFrIHRoZW4KKyAgYmVnaW4KKyAgICBGTWVtby5BZGQoIFMgKTsKKyAgZW5kIGVsc2UKKyAgYmVnaW4KKyAgICBpZHggOj0gRk1lbW8uQ291bnQgLSAxOworICAgIGlmIGlkeCA8IDAgdGhlbgorICAgICAgRk1lbW8uQWRkKCBTICkKKyAgICBlbHNlCisgICAgICBGTWVtb1tpZHhdIDo9IEZNZW1vW2lkeF0gKyBTOworICBlbmQ7CisgIEZMaW5lQnJlYWsgOj0gYldyaXRlTGluZTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBJbnRlcm5hbFdyaXRlKCBTLCBGYWxzZSk7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5Xcml0ZUxpbmUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIFRydWUpOworZW5kOworCitpbml0aWFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlIDo9IFRUaHJpZnRDb25zb2xlLkNyZWF0ZTsKKyAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOworZW5kOworCitmaW5hbGl6YXRpb24KK2JlZ2luCisgIEZEZWZhdWx0Q29uc29sZS5GcmVlOworZW5kOworCitlbmQuCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzIGIvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCmluZGV4IGQzYTQ4OTUuLjBmYTQzYjAgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcworKysgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKQEAgLTEsNCArMSw0IEBACi0oKgor77u/KCoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTksMjIgKzE5LDM1IEBACiAKIHVuaXQgVGVzdENsaWVudDsKIAoreyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9CisKK3suJERFRklORSBTdHJlc3NUZXN0fSAgIC8vIGFjdGl2YXRlIHRvIHN0cmVzcy10ZXN0IHRoZSBzZXJ2ZXIgd2l0aCBmcmVxdWVudCBjb25uZWN0cy9kaXNjb25uZWN0cworey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKK3skREVGSU5FIEV4Y2VwdGlvbnN9ICAgIC8vIGFjdGl2YXRlIHRoZSBleGNlcHRpb25zIHRlc3QgKG9yIGRpc2FibGUgd2hpbGUgZGVidWdnaW5nKQorCit7JGlmIENvbXBpbGVyVmVyc2lvbiA+PSAyOH0KK3skREVGSU5FIFN1cHBvcnRzQXN5bmN9Cit7JGlmZW5kfQorCiBpbnRlcmZhY2UKIAogdXNlcwotICBXaW5kb3dzLCBTeXNVdGlscywgQ2xhc3NlcywKKyAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsIE1hdGgsIENvbU9iaiwgQWN0aXZlWCwKKyAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfSBTeXN0ZW0uVGhyZWFkaW5nLCB7JEVORElGfQogICBEYXRlVXRpbHMsCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUZXN0Q29uc3RhbnRzLAorICBDb25zb2xlSGVscGVyLAogICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKICAgVGhyaWZ0LlByb3RvY29sLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuU3RyZWFtLAogICBUaHJpZnQuVGVzdCwKLSAgVGhyaWZ0LkNvbGxlY3Rpb25zLAotICBUaHJpZnQuQ29uc29sZTsKKyAgVGhyaWZ0LlV0aWxzLAorICBUaHJpZnQuQ29sbGVjdGlvbnM7CiAKIHR5cGUKICAgVFRocmVhZENvbnNvbGUgPSBjbGFzcwpAQCAtNDYsOCArNTksMzggQEAKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFUaHJlYWQ6IFRUaHJlYWQpOwogICBlbmQ7CiAKKyAgVFRlc3RTZXR1cCA9IHJlY29yZAorICAgIHByb3RUeXBlICA6IFRLbm93blByb3RvY29sOworICAgIGVuZHBvaW50ICA6IFRFbmRwb2ludFRyYW5zcG9ydDsKKyAgICBsYXllcmVkICAgOiBUTGF5ZXJlZFRyYW5zcG9ydHM7CisgICAgdXNlU1NMICAgIDogQm9vbGVhbjsgLy8gaW5jbHVkZSB3aGVyZSBhcHByb3ByaWF0ZSAoVExheWVyZWRUcmFuc3BvcnQ/KQorICAgIGhvc3QgICAgICA6IHN0cmluZzsKKyAgICBwb3J0ICAgICAgOiBJbnRlZ2VyOworICAgIHNQaXBlTmFtZSA6IHN0cmluZzsKKyAgICBoQW5vblJlYWQsIGhBbm9uV3JpdGUgOiBUSGFuZGxlOworICBlbmQ7CisKICAgVENsaWVudFRocmVhZCA9IGNsYXNzKCBUVGhyZWFkICkKKyAgcHJpdmF0ZSB0eXBlCisgICAgVFRlc3RHcm91cCA9ICgKKyAgICAgIHRlc3RfVW5rbm93biwKKyAgICAgIHRlc3RfQmFzZVR5cGVzLAorICAgICAgdGVzdF9TdHJ1Y3RzLAorICAgICAgdGVzdF9Db250YWluZXJzLAorICAgICAgdGVzdF9FeGNlcHRpb25zCisgICAgICAvLyBuZXcgdmFsdWVzIGhlcmUKKyAgICApOworICAgIFRUZXN0R3JvdXBzID0gc2V0IG9mIFRUZXN0R3JvdXA7CisKKyAgICBUVGVzdFNpemUgPSAoCisgICAgICBFbXB0eSwgICAgICAgICAgIC8vIEVkZ2UgY2FzZTogdGhlIHplcm8tbGVuZ3RoIGVtcHR5IGJpbmFyeQorICAgICAgTm9ybWFsLCAgICAgICAgICAvLyBGYWlybHkgc21hbGwgYXJyYXkgb2YgdXN1YWwgc2l6ZSAoMjU2IGJ5dGVzKQorICAgICAgQnl0ZUFycmF5VGVzdCwgICAvLyBUSFJJRlQtNDQ1NCBMYXJnZSB3cml0ZXMvcmVhZHMgbWF5IGNhdXNlIHJhbmdlIGNoZWNrIGVycm9ycyBpbiBkZWJ1ZyBtb2RlCisgICAgICBQaXBlV3JpdGVMaW1pdCAgIC8vIFRIUklGVC00MzcyIFBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuCisgICAgKTsKKwogICBwcml2YXRlCisgICAgRlNldHVwIDogVFRlc3RTZXR1cDsKICAgICBGVHJhbnNwb3J0IDogSVRyYW5zcG9ydDsKICAgICBGUHJvdG9jb2wgOiBJUHJvdG9jb2w7CiAgICAgRk51bUl0ZXJhdGlvbiA6IEludGVnZXI7CkBAIC01NSwxOCArOTgsMzYgQEAKIAogICAgIC8vIHRlc3QgcmVwb3J0aW5nLCB3aWxsIGJlIHJlZmFjdG9yZWQgb3V0IGludG8gc2VwYXJhdGUgY2xhc3MgbGF0ZXIKICAgICBGVGVzdEdyb3VwIDogc3RyaW5nOworICAgIEZDdXJyZW50VGVzdCA6IFRUZXN0R3JvdXA7CiAgICAgRlN1Y2Nlc3NlcyA6IEludGVnZXI7CiAgICAgRkVycm9ycyA6IFRTdHJpbmdMaXN0OwotICAgIHByb2NlZHVyZSBTdGFydFRlc3RHcm91cCggY29uc3QgYUdyb3VwIDogc3RyaW5nKTsKKyAgICBGRmFpbGVkIDogVFRlc3RHcm91cHM7CisgICAgRkV4ZWN1dGVkIDogVFRlc3RHcm91cHM7CisgICAgcHJvY2VkdXJlIFN0YXJ0VGVzdEdyb3VwKCBjb25zdCBhR3JvdXAgOiBzdHJpbmc7IGNvbnN0IGFUZXN0IDogVFRlc3RHcm91cCk7CiAgICAgcHJvY2VkdXJlIEV4cGVjdCggYVRlc3RSZXN1bHQgOiBCb29sZWFuOyBjb25zdCBhVGVzdEluZm8gOiBzdHJpbmcpOwogICAgIHByb2NlZHVyZSBSZXBvcnRSZXN1bHRzOworICAgIGZ1bmN0aW9uICBDYWxjdWxhdGVFeGl0Q29kZSA6IEJ5dGU7CiAKICAgICBwcm9jZWR1cmUgQ2xpZW50VGVzdDsKKyAgICB7JElGREVGIFN1cHBvcnRzQXN5bmN9CisgICAgcHJvY2VkdXJlIENsaWVudEFzeW5jVGVzdDsKKyAgICB7JEVORElGfQorCisgICAgcHJvY2VkdXJlIEluaXRpYWxpemVQcm90b2NvbFRyYW5zcG9ydFN0YWNrOworICAgIHByb2NlZHVyZSBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CisKICAgICBwcm9jZWR1cmUgSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKKyAgICBmdW5jdGlvbiAgUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbjsgYVNpemUgOiBUVGVzdFNpemUpIDogVEJ5dGVzOworICAgIHskSUZERUYgU3RyZXNzVGVzdH0KKyAgICBwcm9jZWR1cmUgU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CisgICAgeyRFTkRJRn0KKyAgICB7JElGREVGIFdpbjY0fQorICAgIHByb2NlZHVyZSBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KICAgcHJvdGVjdGVkCiAgICAgcHJvY2VkdXJlIEV4ZWN1dGU7IG92ZXJyaWRlOwogICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7IGNvbnN0IEFQcm90b2NvbCA6IElQcm90b2NvbDsgQU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhU2V0dXAgOiBUVGVzdFNldHVwOyBjb25zdCBhTnVtSXRlcmF0aW9uOiBJbnRlZ2VyKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICBlbmQ7CiAKQEAgLTc1LDEyICsxMzYsMzQgQEAKICAgICBjbGFzcyB2YXIKICAgICAgIEZOdW1JdGVyYXRpb24gOiBJbnRlZ2VyOwogICAgICAgRk51bVRocmVhZCA6IEludGVnZXI7CisKKyAgICBjbGFzcyBwcm9jZWR1cmUgUHJpbnRDbWRMaW5lSGVscDsKKyAgICBjbGFzcyBwcm9jZWR1cmUgSW52YWxpZEFyZ3M7CiAgIHB1YmxpYwotICAgIGNsYXNzIHByb2NlZHVyZSBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICAgIGNsYXNzIGZ1bmN0aW9uIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZykgOiBCeXRlOwogICBlbmQ7CiAKKwogaW1wbGVtZW50YXRpb24KIAorY29uc3QKKyAgIEVYSVRDT0RFX1NVQ0NFU1MgICAgICAgICAgID0gJDAwOyAgLy8gbm8gZXJyb3JzIGJpdHMgc2V0CisgICAvLworICAgRVhJVENPREVfRkFJTEJJVF9CQVNFVFlQRVMgID0gJDAxOworICAgRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTICAgID0gJDAyOworICAgRVhJVENPREVfRkFJTEJJVF9DT05UQUlORVJTID0gJDA0OworICAgRVhJVENPREVfRkFJTEJJVF9FWENFUFRJT05TID0gJDA4OworCisgICBNQVBfRkFJTFVSRVNfVE9fRVhJVENPREVfQklUUyA6IGFycmF5W1RDbGllbnRUaHJlYWQuVFRlc3RHcm91cF0gb2YgQnl0ZSA9ICgKKyAgICAgRVhJVENPREVfU1VDQ0VTUywgIC8vIG5vIGJpdHMgaGVyZQorICAgICBFWElUQ09ERV9GQUlMQklUX0JBU0VUWVBFUywKKyAgICAgRVhJVENPREVfRkFJTEJJVF9TVFJVQ1RTLAorICAgICBFWElUQ09ERV9GQUlMQklUX0NPTlRBSU5FUlMsCisgICAgIEVYSVRDT0RFX0ZBSUxCSVRfRVhDRVBUSU9OUworICAgKTsKKworCisKIGZ1bmN0aW9uIEJvb2xUb1N0cmluZyggYiA6IEJvb2xlYW4pIDogc3RyaW5nOwogLy8gb3ZlcnJpZGVzIGdsb2JhbCBCb29sVG9TdHJpbmcoKQogYmVnaW4KQEAgLTk0LDE5NiArMTc3LDE5MCBAQAogCiB7IFRUZXN0Q2xpZW50IH0KIAotY2xhc3MgcHJvY2VkdXJlIFRUZXN0Q2xpZW50LkV4ZWN1dGUoY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK2NsYXNzIHByb2NlZHVyZSBUVGVzdENsaWVudC5QcmludENtZExpbmVIZWxwOworY29uc3QgSEVMUFRFWFQgPSAnIFtvcHRpb25zXScjMTAKKyAgICAgICAgICAgICAgICsgIzEwCisgICAgICAgICAgICAgICArICdBbGxvd2VkIG9wdGlvbnM6JyMxMAorICAgICAgICAgICAgICAgKyAnICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UnIzEwCisgICAgICAgICAgICAgICArICcgIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBjb25uZWN0JyMxMAorICAgICAgICAgICAgICAgKyAnICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSwnIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQnIzEwCisgICAgICAgICAgICAgICArICcgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wnIzEwCisgICAgICAgICAgICAgICArICcgIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMnIzEwCisgICAgICAgICAgICAgICArICcgIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzJyMxMAorICAgICAgICAgICAgICAgOworYmVnaW4KKyAgV3JpdGVsbiggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArIEhFTFBURVhUKTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0Q2xpZW50LkludmFsaWRBcmdzOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIGFyZ3MuJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgJyAtaCBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOworICBBYm9ydDsKK2VuZDsKKworY2xhc3MgZnVuY3Rpb24gVFRlc3RDbGllbnQuRXhlY3V0ZShjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKIHZhcgogICBpIDogSW50ZWdlcjsKLSAgaG9zdCA6IHN0cmluZzsKLSAgcG9ydCA6IEludGVnZXI7Ci0gIHVybCA6IHN0cmluZzsKLSAgYkJ1ZmZlcmVkIDogQm9vbGVhbjsKLSAgYkFub25QaXBlIDogQm9vbGVhbjsKLSAgYkZyYW1lZCA6IEJvb2xlYW47Ci0gIHNQaXBlTmFtZSA6IHN0cmluZzsKLSAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgdGhyZWFkRXhpdENvZGUgOiBCeXRlOwogICBzIDogc3RyaW5nOwotICBuIDogSW50ZWdlcjsKICAgdGhyZWFkcyA6IGFycmF5IG9mIFRUaHJlYWQ7CiAgIGR0U3RhcnQgOiBURGF0ZVRpbWU7CiAgIHRlc3QgOiBJbnRlZ2VyOwogICB0aHJlYWQgOiBUVGhyZWFkOwotICB0cmFucyA6IElUcmFuc3BvcnQ7Ci0gIHByb3QgOiBJUHJvdG9jb2w7Ci0gIHN0cmVhbXRyYW5zIDogSVN0cmVhbVRyYW5zcG9ydDsKLSAgaHR0cCA6IElIVFRQQ2xpZW50OwotICBwcm90VHlwZSwgcCA6IFRLbm93blByb3RvY29sOworICBzZXR1cCA6IFRUZXN0U2V0dXA7CiBiZWdpbgotICBiQnVmZmVyZWQgOj0gRmFsc2U7OwotICBiRnJhbWVkIDo9IEZhbHNlOwotICBwcm90VHlwZSA6PSBwcm90X0JpbmFyeTsKLSAgdHJ5Ci0gICAgaG9zdCA6PSAnbG9jYWxob3N0JzsKLSAgICBwb3J0IDo9IDkwOTA7Ci0gICAgdXJsIDo9ICcnOwotICAgIHNQaXBlTmFtZSA6PSAnJzsKLSAgICBiQW5vblBpcGUgOj0gRkFMU0U7Ci0gICAgaEFub25SZWFkIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAvLyBpbml0IHJlY29yZAorICB3aXRoIHNldHVwIGRvIGJlZ2luCisgICAgcHJvdFR5cGUgICA6PSBwcm90X0JpbmFyeTsKKyAgICBlbmRwb2ludCAgIDo9IHRybnNfU29ja2V0czsKKyAgICBsYXllcmVkICAgIDo9IFtdOworICAgIHVzZVNTTCAgICAgOj0gRkFMU0U7CisgICAgaG9zdCAgICAgICA6PSAnbG9jYWxob3N0JzsKKyAgICBwb3J0ICAgICAgIDo9IDkwOTA7CisgICAgc1BpcGVOYW1lICA6PSAnJzsKKyAgICBoQW5vblJlYWQgIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOwogICAgIGhBbm9uV3JpdGUgOj0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisgIGVuZDsKKworICB0cnkKICAgICBpIDo9IDA7Ci0gICAgdHJ5Ci0gICAgICB3aGlsZSAoIGkgPCBMZW5ndGgoYXJncykgKSBkbwotICAgICAgYmVnaW4KKyAgICB3aGlsZSAoIGkgPCBMZW5ndGgoYXJncykgKSBkbyBiZWdpbgorICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgSW5jKCBpKTsKIAotICAgICAgICB0cnkKLSAgICAgICAgICBpZiAoIGFyZ3NbaV0gPSAnLWgnKSB0aGVuCi0gICAgICAgICAgYmVnaW4KLSAgICAgICAgICAgIEluYyggaSApOwotICAgICAgICAgICAgcyA6PSBhcmdzW2ldOwotICAgICAgICAgICAgbiA6PSBQb3MoICc6Jywgcyk7Ci0gICAgICAgICAgICBpZiAoIG4gPiAwICkgdGhlbgotICAgICAgICAgICAgYmVnaW4KLSAgICAgICAgICAgICAgaG9zdCA6PSBDb3B5KCBzLCAxLCBuIC0gMSk7Ci0gICAgICAgICAgICAgIHBvcnQgOj0gU3RyVG9JbnQoIENvcHkoIHMsIG4gKyAxLCBNYXhJbnQpKTsKLSAgICAgICAgICAgIGVuZCBlbHNlCi0gICAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgICBob3N0IDo9IHM7Ci0gICAgICAgICAgICBlbmQ7Ci0gICAgICAgICAgZW5kCi0gICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9ICctdScpIHRoZW4KLSAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgSW5jKCBpICk7Ci0gICAgICAgICAgICB1cmwgOj0gYXJnc1tpXTsKLSAgICAgICAgICBlbmQKLSAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID0gJy1uJykgdGhlbgotICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBJbmMoIGkgKTsKLSAgICAgICAgICAgIEZOdW1JdGVyYXRpb24gOj0gU3RyVG9JbnQoIGFyZ3NbaV0gKTsKLSAgICAgICAgICBlbmQKLSAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID0gJy1iJykgdGhlbgotICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBiQnVmZmVyZWQgOj0gVHJ1ZTsKLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdCdWZmZXJlZCB0cmFuc3BvcnQnKTsKLSAgICAgICAgICBlbmQKLSAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID0gJy1mJyApIG9yICggYXJnc1tpXSA9ICctZnJhbWVkJykgdGhlbgotICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBiRnJhbWVkIDo9IFRydWU7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnRnJhbWVkIHRyYW5zcG9ydCcpOwotICAgICAgICAgIGVuZAotICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPSAnLXBpcGUnKSB0aGVuICAvLyAtcGlwZSA8bmFtZT4KLSAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ05hbWVkIHBpcGVzIHRyYW5zcG9ydCcpOwotICAgICAgICAgICAgSW5jKCBpICk7Ci0gICAgICAgICAgICBzUGlwZU5hbWUgOj0gYXJnc1tpXTsKLSAgICAgICAgICBlbmQKLSAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID0gJy1hbm9uJykgdGhlbiAgLy8gLWFub24gPGhSZWFkUGlwZT4gPGhXcml0ZVBpcGU+Ci0gICAgICAgICAgYmVnaW4KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdBbm9ueW1vdXMgcGlwZXMgdHJhbnNwb3J0Jyk7Ci0gICAgICAgICAgICBJbmMoIGkpOwotICAgICAgICAgICAgaEFub25SZWFkIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOwotICAgICAgICAgICAgSW5jKCBpKTsKLSAgICAgICAgICAgIGhBbm9uV3JpdGUgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7Ci0gICAgICAgICAgICBiQW5vblBpcGUgOj0gVFJVRTsKLSAgICAgICAgICBlbmQKLSAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID0gJy10JykgdGhlbgotICAgICAgICAgIGJlZ2luCi0gICAgICAgICAgICBJbmMoIGkgKTsKLSAgICAgICAgICAgIEZOdW1UaHJlYWQgOj0gU3RyVG9JbnQoIGFyZ3NbaV0gKTsKLSAgICAgICAgICBlbmQKLSAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID0gJy1wcm90JykgdGhlbiAgLy8gLXByb3QgSlNPTnxiaW5hcnkKLSAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgSW5jKCBpICk7Ci0gICAgICAgICAgICBzIDo9IGFyZ3NbaV07Ci0gICAgICAgICAgICBmb3IgcDo9IExvdyhUS25vd25Qcm90b2NvbCkgdG8gSGlnaChUS25vd25Qcm90b2NvbCkgZG8gYmVnaW4KLSAgICAgICAgICAgICAgaWYgU2FtZVRleHQoIHMsIEtOT1dOX1BST1RPQ09MU1twXSkgdGhlbiBiZWdpbgotICAgICAgICAgICAgICAgIHByb3RUeXBlIDo9IHA7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nICcrS05PV05fUFJPVE9DT0xTW3Byb3RUeXBlXSsnIHByb3RvY29sJyk7Ci0gICAgICAgICAgICAgICAgQnJlYWs7Ci0gICAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICBlbmQ7Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgICBJbmMoIGkgKTsKLSAgICAgICAgZW5kOworICAgICAgaWYgKHMgPSAnLWgnKSBvciAocyA9ICctLWhlbHAnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICBQcmludENtZExpbmVIZWxwOworICAgICAgICByZXN1bHQgOj0gJEZGOyAgIC8vIGFsbCB0ZXN0cyBmYWlsZWQKKyAgICAgICAgRXhpdDsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0taG9zdCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWhvc3QgYXJnICg9bG9jYWxob3N0KSAgICAgSG9zdCB0byBjb25uZWN0CisgICAgICAgIHNldHVwLmhvc3QgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tcG9ydCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyggaSk7CisgICAgICAgIHNldHVwLnBvcnQgOj0gU3RyVG9JbnREZWYocywwKTsKKyAgICAgICAgaWYgc2V0dXAucG9ydCA8PSAwIHRoZW4gSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWRvbWFpbi1zb2NrZXQnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydAorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdkb21haW4tc29ja2V0IG5vdCBzdXBwb3J0ZWQnKTsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tbmFtZWQtcGlwZScgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLW5hbWVkLXBpcGUgYXJnICAgICAgICAgICAgV2luZG93cyBOYW1lZCBQaXBlIChlLmcuIE15VGhyaWZ0UGlwZSkKKyAgICAgICAgc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19OYW1lZFBpcGVzOworICAgICAgICBzZXR1cC5zUGlwZU5hbWUgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIG5hbWVkIHBpcGUgKCcrc2V0dXAuc1BpcGVOYW1lKycpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLWFub24tcGlwZXMnIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1hbm9uLXBpcGVzIGhSZWFkIGhXcml0ZSAgIFdpbmRvd3MgQW5vbnltb3VzIFBpcGVzIHBhaXIgKGhhbmRsZXMpCisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfQW5vblBpcGVzOworICAgICAgICBzZXR1cC5oQW5vblJlYWQgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIHNldHVwLmhBbm9uV3JpdGUgOj0gVEhhbmRsZSggU3RyVG9JbnREZWYoIGFyZ3NbaV0sIEludGVnZXIoSU5WQUxJRF9IQU5ETEVfVkFMVUUpKSk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBhbm9ueW1vdXMgcGlwZXMgKCcrSW50VG9TdHIoSW50ZWdlcihzZXR1cC5oQW5vblJlYWQpKSsnIGFuZCAnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25Xcml0ZSkpKycpJyk7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXRyYW5zcG9ydCcgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXRzKSAgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAKKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoIGkpOwogCi0gICAgICBlbmQ7CisgICAgICAgIGlmICAgICAgcyA9ICdidWZmZXJlZCcgdGhlbiBJbmNsdWRlKCBzZXR1cC5sYXllcmVkLCB0cm5zX0J1ZmZlcmVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnZnJhbWVkJyAgIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19GcmFtZWQpCisgICAgICAgIGVsc2UgaWYgcyA9ICdodHRwJyAgICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0h0dHAKKyAgICAgICAgZWxzZSBpZiBzID0gJ2V2aHR0cCcgICB0aGVuIHNldHVwLmVuZHBvaW50IDo9IHRybnNfRXZIdHRwCisgICAgICAgIGVsc2UgSW52YWxpZEFyZ3M7CisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgcyA9ICctLXByb3RvY29sJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKCBpKTsKIAotICAgIGV4Y2VwdAotICAgICAgb24gRTogRXhjZXB0aW9uIGRvCi0gICAgICBiZWdpbgotICAgICAgICBDb25zb2xlLldyaXRlTGluZSggRS5NZXNzYWdlICk7CisgICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0JpbmFyeQorICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gc2V0dXAucHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0CisgICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiBzID0gJy0tc3NsJyB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgICBzZXR1cC51c2VTU0wgOj0gVFJVRTsKKworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS10ZXN0bG9vcHMnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1uIFsgLS10ZXN0bG9vcHMgXSBhcmcgKD0xKSBOdW1iZXIgb2YgVGVzdHMKKyAgICAgICAgRk51bUl0ZXJhdGlvbiA6PSBTdHJUb0ludERlZiggYXJnc1tpXSwgMCk7CisgICAgICAgIEluYyggaSk7CisgICAgICAgIGlmIEZOdW1JdGVyYXRpb24gPD0gMAorICAgICAgICB0aGVuIEludmFsaWRBcmdzOworCisgICAgICBlbmQKKyAgICAgIGVsc2UgaWYgKHMgPSAnLXQnKSBvciAocyA9ICctLXRocmVhZHMnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC10IFsgLS10aHJlYWRzIF0gYXJnICg9MSkgICBOdW1iZXIgb2YgVGVzdCB0aHJlYWRzCisgICAgICAgIEZOdW1UaHJlYWQgOj0gU3RyVG9JbnREZWYoIGFyZ3NbaV0sIDApOworICAgICAgICBJbmMoIGkpOworICAgICAgICBpZiBGTnVtVGhyZWFkIDw9IDAKKyAgICAgICAgdGhlbiBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBiZWdpbgorICAgICAgICBJbnZhbGlkQXJnczsKICAgICAgIGVuZDsKICAgICBlbmQ7CiAKKworICAgIC8vIEluIHRoZSBhbm9ueW1vdXMgcGlwZXMgbW9kZSB0aGUgY2xpZW50IGlzIGxhdW5jaGVkIGJ5IHRoZSB0ZXN0IHNlcnZlcgorICAgIC8vIC0+IGJlaGF2ZSBuaWNlbHkgYW5kIGFsbG93IGZvciBhdHRhY2hpbmcgYSBkZWJ1Z2dlciB0byB0aGlzIHByb2Nlc3MKKyAgICBpZiAoc2V0dXAuZW5kcG9pbnQgPSB0cm5zX0Fub25QaXBlcykgYW5kIG5vdCBJc0RlYnVnZ2VyUHJlc2VudAorICAgIHRoZW4gTWVzc2FnZUJveCggMCwgJ0F0dGFjaCBEZWJ1Z2dlciBhbmQvb3IgY2xpY2sgT0sgdG8gY29udGludWUuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdUaHJpZnQgVGVzdENsaWVudCAoRGVscGhpKScsCisgICAgICAgICAgICAgICAgICAgICAgICBNQl9PSyBvciBNQl9JQ09ORVhDTEFNQVRJT04pOworCiAgICAgU2V0TGVuZ3RoKCB0aHJlYWRzLCBGTnVtVGhyZWFkKTsKICAgICBkdFN0YXJ0IDo9IE5vdzsKIAotICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8KLSAgICBiZWdpbgotICAgICAgaWYgdXJsID0gJycgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgaWYgc1BpcGVOYW1lIDw+ICcnIHRoZW4gYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgbmFtZWQgcGlwZSAoJytzUGlwZU5hbWUrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUTmFtZWRQaXBlSW1wbC5DcmVhdGUoIHNQaXBlTmFtZSk7Ci0gICAgICAgIGVuZAotICAgICAgICBlbHNlIGlmIGJBbm9uUGlwZSB0aGVuIGJlZ2luCi0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGFub255bW91cyBwaXBlcyAoJytJbnRUb1N0cihJbnRlZ2VyKGhBbm9uUmVhZCkpKycgYW5kICcrSW50VG9TdHIoSW50ZWdlcihoQW5vbldyaXRlKSkrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZUltcGwuQ3JlYXRlKCBoQW5vblJlYWQsIGhBbm9uV3JpdGUsIEZBTFNFKTsKLSAgICAgICAgZW5kCi0gICAgICAgIGVsc2UgYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgc29ja2V0cyAoJytob3N0KycgcG9ydCAnK0ludFRvU3RyKHBvcnQpKycpJyk7Ci0gICAgICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBob3N0LCBwb3J0ICk7Ci0gICAgICAgIGVuZDsKKyAgICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgICBpZiAodHJuc19GcmFtZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQKKyAgICBlbHNlIGlmICh0cm5zX0J1ZmZlcmVkIGluIHNldHVwLmxheWVyZWQpIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBidWZmZXJlZCB0cmFuc3BvcnQnKTsKKyAgICBlbmQ7CiAKLSAgICAgICAgdHJhbnMgOj0gc3RyZWFtdHJhbnM7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoVEhSSUZUX1BST1RPQ09MU1tzZXR1cC5wcm90VHlwZV0rJyBwcm90b2NvbCcpOwogCi0gICAgICAgIGlmIGJCdWZmZXJlZCB0aGVuIGJlZ2luCi0gICAgICAgICAgdHJhbnMgOj0gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHN0cmVhbXRyYW5zKTsKLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYnVmZmVyZWQgdHJhbnNwb3J0Jyk7Ci0gICAgICAgIGVuZDsKLQotICAgICAgICBpZiBiRnJhbWVkIHRoZW4gYmVnaW4KLSAgICAgICAgICB0cmFucyA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIHRyYW5zICk7Ci0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKLSAgICAgICAgZW5kOwotCi0gICAgICBlbmQKLSAgICAgIGVsc2UgYmVnaW4KLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKLSAgICAgICAgaHR0cCA6PSBUSFRUUENsaWVudEltcGwuQ3JlYXRlKCB1cmwgKTsKLSAgICAgICAgdHJhbnMgOj0gaHR0cDsKLSAgICAgIGVuZDsKLQotICAgICAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCi0gICAgICBjYXNlIHByb3RUeXBlIG9mCi0gICAgICAgIHByb3RfQmluYXJ5OiAgcHJvdCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggdHJhbnMpOwotICAgICAgICBwcm90X0pTT04gIDogIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucyk7Ci0gICAgICBlbHNlCi0gICAgICAgIEFTU0VSVCggRkFMU0UpOyAgLy8gdW5oYW5kbGVkIGNhc2UhCi0gICAgICAgIHByb3QgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsgIC8vIHVzZSBkZWZhdWx0Ci0gICAgICBlbmQ7Ci0KLSAgICAgIHRocmVhZCA6PSBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggdHJhbnMsIHByb3QsIEZOdW1JdGVyYXRpb24pOworICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KKyAgICAgIHRocmVhZCA6PSBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggc2V0dXAsIEZOdW1JdGVyYXRpb24pOwogICAgICAgdGhyZWFkc1t0ZXN0XSA6PSB0aHJlYWQ7Ci17JFdBUk4gU1lNQk9MX0RFUFJFQ0FURUQgT0ZGfQotICAgICAgdGhyZWFkLlJlc3VtZTsKLXskV0FSTiBTWU1CT0xfREVQUkVDQVRFRCBPTn0KKyAgICAgIHRocmVhZC5TdGFydDsKICAgICBlbmQ7CiAKLSAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvCi0gICAgYmVnaW4KLSAgICAgIHRocmVhZHNbdGVzdF0uV2FpdEZvcjsKLSAgICBlbmQ7Ci0KLSAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvCi0gICAgYmVnaW4KKyAgICByZXN1bHQgOj0gMDsKKyAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCisgICAgICB0aHJlYWRFeGl0Q29kZSA6PSB0aHJlYWRzW3Rlc3RdLldhaXRGb3I7CisgICAgICByZXN1bHQgOj0gcmVzdWx0IG9yIHRocmVhZEV4aXRDb2RlOwogICAgICAgdGhyZWFkc1t0ZXN0XS5GcmVlOworICAgICAgdGhyZWFkc1t0ZXN0XSA6PSBuaWw7CiAgICAgZW5kOwogCiAgICAgQ29uc29sZS5Xcml0ZSgnVG90YWwgdGltZTogJyArIEludFRvU3RyKCBNaWxsaVNlY29uZHNCZXR3ZWVuKE5vdywgZHRTdGFydCkpKTsKIAogICBleGNlcHQKLSAgICBvbiBFOiBFeGNlcHRpb24gZG8KLSAgICBiZWdpbgotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIEUuTWVzc2FnZSArICcgU1Q6ICcgKyBFLlN0YWNrVHJhY2UgKTsKKyAgICBvbiBFOiBFQWJvcnQgZG8gcmFpc2U7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggRS5NZXNzYWdlICsgIzEwICsgRS5TdGFja1RyYWNlKTsKKyAgICAgIHJhaXNlOwogICAgIGVuZDsKICAgZW5kOwogCkBAIC0zMDAsNiArMzc3LDcgQEAKICAgaTggOiBTaG9ydEludDsKICAgaTMyIDogSW50ZWdlcjsKICAgaTY0IDogSW50NjQ7CisgIGJpbk91dCxiaW5JbiA6IFRCeXRlczsKICAgZHViIDogRG91YmxlOwogICBvIDogSVh0cnVjdDsKICAgbzIgOiBJWHRydWN0MjsKQEAgLTM0MSwyNCArNDE5LDMxIEBACiAgIGFyZzMgOiBJVGhyaWZ0RGljdGlvbmFyeTxTbWFsbEludCwgc3RyaW5nPjsKICAgYXJnNCA6IFROdW1iZXJ6OwogICBhcmc1IDogSW50NjQ7CisgIHskSUZERUYgUGVyZlRlc3R9CiAgIFN0YXJ0VGljayA6IENhcmRpbmFsOwogICBrIDogSW50ZWdlcjsKLSAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CisgIHskRU5ESUZ9CiAgIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKICAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKLQorICBwYWlyIDogVFBhaXI8VE51bWJlcnosIFRVc2VySWQ+OworICB0ZXN0c2l6ZSA6IFRUZXN0U2l6ZTsKIGJlZ2luCiAgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKICAgRlRyYW5zcG9ydC5PcGVuOwogCisgIHskSUZERUYgU3RyZXNzVGVzdH0KKyAgU3RyZXNzVGVzdCggY2xpZW50KTsKKyAgeyRFTkRJRiBTdHJlc3NUZXN0fQorCisgIHskSUZERUYgRXhjZXB0aW9uc30KICAgLy8gaW4tZGVwdGggZXhjZXB0aW9uIHRlc3QKICAgLy8gKDEpIGRvIHdlIGdldCBhbiBleGNlcHRpb24gYXQgYWxsPwogICAvLyAoMikgZG8gd2UgZ2V0IHRoZSByaWdodCBleGNlcHRpb24/CiAgIC8vICgzKSBkb2VzIHRoZSBleGNlcHRpb24gY29udGFpbiB0aGUgZXhwZWN0ZWQgZGF0YT8KLSAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0RXhjZXB0aW9uJyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdEV4Y2VwdGlvbicsIHRlc3RfRXhjZXB0aW9ucyk7CiAgIC8vIGNhc2UgMTogZXhjZXB0aW9uIHR5cGUgZGVjbGFyZWQgaW4gSURMIGF0IHRoZSBmdW5jdGlvbiBjYWxsCiAgIHRyeQogICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwpAQCAtMzcwLDcgKzQ1NSw3IEBACiAgICAgICBDb25zb2xlLldyaXRlTGluZSggJyA9ICcgKyBJbnRUb1N0cihlLkVycm9yQ29kZSkgKyAnLCAnICsgZS5NZXNzYWdlXyApOwogICAgIGVuZDsKICAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAgIC8vIGNhc2UgMjogZXhjZXB0aW9uIHR5cGUgTk9UIGRlY2xhcmVkIGluIElETCBhdCB0aGUgZnVuY3Rpb24gY2FsbApAQCAtMzgxLDMxICs0NjYsNTEgQEAKICAgZXhjZXB0CiAgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5DbGFzc05hbWUrJyA9ICcrZS5NZXNzYWdlKTsgLy8gdGhpcyBpcyB3aGF0IHdlIGdldAotICAgICAgaWYgRlRyYW5zcG9ydC5Jc09wZW4gdGhlbiBGVHJhbnNwb3J0LkNsb3NlOwotICAgICAgRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAogICAgIGVuZDsKLSAgICBvbiBlOlRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggZS5DbGFzc05hbWUrJyA9ICcrZS5NZXNzYWdlKTsgLy8gdGhpcyBpcyB3aGF0IHdlIGdldAorICAgIGVuZDsKKyAgICBvbiBlOlRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAorCisgIGlmIEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5DbG9zZTsKKyAgRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAorCisKICAgLy8gY2FzZSAzOiBubyBleGNlcHRpb24KICAgdHJ5CiAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ3NvbWV0aGluZycpOwogICAgIEV4cGVjdCggVFJVRSwgJ3Rlc3RFeGNlcHRpb24oJydzb21ldGhpbmcnJyk6IG11c3Qgbm90IHRyb3cgYW4gZXhjZXB0aW9uJyk7CiAgIGV4Y2VwdAogICAgIG9uIGU6VFRyYW5zcG9ydEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCA6ICInK2UuVG9TdHJpbmcrJyInKTsKLSAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOworICB7JEVORElGIEV4Y2VwdGlvbnN9CiAKIAogICAvLyBzaW1wbGUgdGhpbmdzCi0gIFN0YXJ0VGVzdEdyb3VwKCAnc2ltcGxlIFRocmlmdCBjYWxscycpOworICBTdGFydFRlc3RHcm91cCggJ3NpbXBsZSBUaHJpZnQgY2FsbHMnLCB0ZXN0X0Jhc2VUeXBlcyk7CiAgIGNsaWVudC50ZXN0Vm9pZCgpOwogICBFeHBlY3QoIFRSVUUsICd0ZXN0Vm9pZCgpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgogCisgIHMgOj0gQm9vbFRvU3RyaW5nKCBjbGllbnQudGVzdEJvb2woVFJVRSkpOworICBFeHBlY3QoIHMgPSBCb29sVG9TdHJpbmcoVFJVRSksICAndGVzdEJvb2woVFJVRSkgPSAnK3MpOworICBzIDo9IEJvb2xUb1N0cmluZyggY2xpZW50LnRlc3RCb29sKEZBTFNFKSk7CisgIEV4cGVjdCggcyA9IEJvb2xUb1N0cmluZyhGQUxTRSksICAndGVzdEJvb2woRkFMU0UpID0gJytzKTsKKwogICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCdUZXN0Jyk7CiAgIEV4cGVjdCggcyA9ICdUZXN0JywgJ3Rlc3RTdHJpbmcoJydUZXN0JycpID0gIicrcysnIicpOwogCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoJycpOyAgLy8gZW1wdHkgc3RyaW5nCisgIEV4cGVjdCggcyA9ICcnLCAndGVzdFN0cmluZygnJycnKSA9ICInK3MrJyInKTsKKworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKEhVR0VfVEVTVF9TVFJJTkcpOworICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKKyAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKKyAgICAgICAgICsnPT4gbGVuZ3RoKHJlc3VsdCkgPSAnK0ludFRvU3RyKExlbmd0aChzKSkpOworCiAgIGk4IDo9IGNsaWVudC50ZXN0Qnl0ZSgxKTsKICAgRXhwZWN0KCBpOCA9IDEsICd0ZXN0Qnl0ZSgxKSA9ICcgKyBJbnRUb1N0ciggaTggKSk7CiAKQEAgLTQxNiwxMiArNTIxLDI3IEBACiAgIGk2NCA6PSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogICBFeHBlY3QoIGk2NCA9IC0zNDM1OTczODM2OCwgJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KSA9ICcgKyBJbnRUb1N0ciggaTY0KSk7CiAKKyAgLy8gcmFuZG9tIGJpbmFyeSBzbWFsbAorICBmb3IgdGVzdHNpemUgOj0gTG93KFRUZXN0U2l6ZSkgdG8gSGlnaChUVGVzdFNpemUpIGRvIGJlZ2luCisgICAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFLCB0ZXN0c2l6ZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICB0cnkKKyAgICAgIGJpbkluIDo9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKKyAgICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKKyAgICAgIEV4cGVjdCggQ29tcGFyZU1lbSggYmluT3V0LCBiaW5JbiwgaTMyKSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJykgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd0ZXN0QmluYXJ5KCk6IFVuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CisKICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CiAgIGR1YiA6PSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CiAgIEV4cGVjdCggYWJzKGR1Yi01LjMyNTA5ODIzNSkgPCAxZS0xNCwgJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpID0gJyArIEZsb2F0VG9TdHIoIGR1YikpOwogCiAgIC8vIHN0cnVjdHMKLSAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U3RydWN0Jyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdFN0cnVjdCcsIHRlc3RfU3RydWN0cyk7CiAgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0U3RydWN0KHsnJ1plcm8nJywgMSwgLTMsIC01fSknKTsKICAgbyA6PSBUWHRydWN0SW1wbC5DcmVhdGU7CiAgIG8uU3RyaW5nX3RoaW5nIDo9ICdaZXJvJzsKQEAgLTQzOSw3ICs1NTksNyBAQAogICBFeHBlY3QoIGkuX19pc3NldF9JNjRfdGhpbmcsICdpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOwogCiAgIC8vIG5lc3RlZCBzdHJ1Y3RzCi0gIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE5lc3QnKTsKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TmVzdCcsIHRlc3RfU3RydWN0cyk7CiAgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0TmVzdCh7MSwgeycnWmVybycnLCAxLCAtMywgLTV9LCA1fSknKTsKICAgbzIgOj0gVFh0cnVjdDJJbXBsLkNyZWF0ZTsKICAgbzIuQnl0ZV90aGluZyA6PSAxOwpAQCAtNDYyLDcgKzU4Miw3IEBACiAKICAgLy8gbWFwPHR5cGUxLHR5cGUyPjogQSBtYXAgb2Ygc3RyaWN0bHkgdW5pcXVlIGtleXMgdG8gdmFsdWVzLgogICAvLyBUcmFuc2xhdGVzIHRvIGFuIFNUTCBtYXAsIEphdmEgSGFzaE1hcCwgUEhQIGFzc29jaWF0aXZlIGFycmF5LCBQeXRob24vUnVieSBkaWN0aW9uYXJ5LCBldGMuCi0gIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE1hcCcpOworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNYXAnLCB0ZXN0X0NvbnRhaW5lcnMpOwogICBtYXBvdXQgOj0gVFRocmlmdERpY3Rpb25hcnlJbXBsPEludGVnZXIsSW50ZWdlcj4uQ3JlYXRlOwogICBmb3IgaiA6PSAwIHRvIDQgZG8KICAgYmVnaW4KQEAgLTQ5NCw3ICs2MTQsNyBAQAogCiAgIC8vIG1hcDx0eXBlMSx0eXBlMj46IEEgbWFwIG9mIHN0cmljdGx5IHVuaXF1ZSBrZXlzIHRvIHZhbHVlcy4KICAgLy8gVHJhbnNsYXRlcyB0byBhbiBTVEwgbWFwLCBKYXZhIEhhc2hNYXAsIFBIUCBhc3NvY2lhdGl2ZSBhcnJheSwgUHl0aG9uL1J1YnkgZGljdGlvbmFyeSwgZXRjLgotICBTdGFydFRlc3RHcm91cCggJ3Rlc3RTdHJpbmdNYXAnKTsKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U3RyaW5nTWFwJywgdGVzdF9Db250YWluZXJzKTsKICAgc3RybWFwb3V0IDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsc3RyaW5nPi5DcmVhdGU7CiAgIGZvciBqIDo9IDAgdG8gNCBkbwogICBiZWdpbgpAQCAtNTI5LDcgKzY0OSw3IEBACiAgIC8vIHNldDx0eXBlPjogQW4gdW5vcmRlcmVkIHNldCBvZiB1bmlxdWUgZWxlbWVudHMuCiAgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIHNldCwgSmF2YSBIYXNoU2V0LCBzZXQgaW4gUHl0aG9uLCBldGMuCiAgIC8vIE5vdGU6IFBIUCBkb2VzIG5vdCBzdXBwb3J0IHNldHMsIHNvIGl0IGlzIHRyZWF0ZWQgc2ltaWxhciB0byBhIExpc3QKLSAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0U2V0Jyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdFNldCcsIHRlc3RfQ29udGFpbmVycyk7CiAgIHNldG91dCA6PSBUSGFzaFNldEltcGw8SW50ZWdlcj4uQ3JlYXRlOwogICBmb3IgaiA6PSAtMiB0byAyIGRvCiAgIGJlZ2luCkBAIC01NTYsNyArNjc2LDcgQEAKIAogICAvLyBsaXN0PHR5cGU+OiBBbiBvcmRlcmVkIGxpc3Qgb2YgZWxlbWVudHMuCiAgIC8vIFRyYW5zbGF0ZXMgdG8gYW4gU1RMIHZlY3RvciwgSmF2YSBBcnJheUxpc3QsIG5hdGl2ZSBhcnJheXMgaW4gc2NyaXB0aW5nIGxhbmd1YWdlcywgZXRjLgotICBTdGFydFRlc3RHcm91cCggJ3Rlc3RMaXN0Jyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdExpc3QnLCB0ZXN0X0NvbnRhaW5lcnMpOwogICBsaXN0b3V0IDo9IFRUaHJpZnRMaXN0SW1wbDxJbnRlZ2VyPi5DcmVhdGU7CiAgIGxpc3RvdXQuQWRkKCArMSk7CiAgIGxpc3RvdXQuQWRkKCAtMik7CkBAIC02MDYsNyArNzI2LDcgQEAKIAogCiAgIC8vIG1hcHMgb2YgbWFwcwotICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNYXBNYXAoMSknKTsKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TWFwTWFwKDEpJywgdGVzdF9Db250YWluZXJzKTsKICAgbW0gOj0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CiAgIENvbnNvbGUuV3JpdGUoJyA9IHsnKTsKICAgZm9yIGtleSBpbiBtbS5LZXlzIGRvCkBAIC02MzQsMTUgKzc1NCwxNSBAQAogCiAKICAgLy8gaW5zYW5pdHkKLSAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0SW5zYW5pdHknKTsKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0SW5zYW5pdHknLCB0ZXN0X1N0cnVjdHMpOwogICBpbnNhbmUgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CiAgIGluc2FuZS5Vc2VyTWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSW50NjQ+LkNyZWF0ZTsKICAgaW5zYW5lLlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRklWRSwgNTAwMCk7CiAgIHRydWNrIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKICAgdHJ1Y2suU3RyaW5nX3RoaW5nIDo9ICdUcnVjayc7Ci0gIHRydWNrLkJ5dGVfdGhpbmcgOj0gODsKLSAgdHJ1Y2suSTMyX3RoaW5nIDo9IDg7Ci0gIHRydWNrLkk2NF90aGluZyA6PSA4OworICB0cnVjay5CeXRlX3RoaW5nIDo9IC04OyAgLy8gYnl0ZSBpcyBzaWduZWQKKyAgdHJ1Y2suSTMyX3RoaW5nIDo9IDMyOworICB0cnVjay5JNjRfdGhpbmcgOj0gNjQ7CiAgIGluc2FuZS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7CiAgIGluc2FuZS5YdHJ1Y3RzLkFkZCggdHJ1Y2sgKTsKICAgd2hvYSA6PSBjbGllbnQudGVzdEluc2FuaXR5KCBpbnNhbmUgKTsKQEAgLTY5MSw2ICs4MTEsMTggQEAKICAgZW5kOwogICBDb25zb2xlLldyaXRlTGluZSgnfScpOwogCisgICgqKgorICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICoKKyAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICB9LAorICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAqICAgfQorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICopCisKICAgLy8gdmVyaWZ5IHJlc3VsdCBkYXRhCiAgIEV4cGVjdCggd2hvYS5Db3VudCA9IDIsICd3aG9hLkNvdW50ID0gJytJbnRUb1N0cih3aG9hLkNvdW50KSk7CiAgIC8vCkBAIC03MTEsMzYgKzg0MywyNSBAQAogICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9Vc2VyTWFwLCAnY3JhenkuX19pc3NldF9Vc2VyTWFwID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9Vc2VyTWFwKSk7CiAgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1h0cnVjdHMsICdjcmF6eS5fX2lzc2V0X1h0cnVjdHMgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1h0cnVjdHMpKTsKIAotICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IDIsICdjcmF6eS5Vc2VyTWFwLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwLkNvdW50KSk7Ci0gICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkZJVkVdID0gNSwgJ2NyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0gPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0pKTsKLSAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdID0gOCwgJ2NyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkVJR0hUXSkpOworICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IGluc2FuZS5Vc2VyTWFwLkNvdW50LCAnY3JhenkuVXNlck1hcC5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcC5Db3VudCkpOworICAgIGZvciBwYWlyIGluIGluc2FuZS5Vc2VyTWFwIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbcGFpci5LZXldID0gcGFpci5WYWx1ZSwgJ2NyYXp5LlVzZXJNYXBbJytJbnRUb1N0cihPcmQocGFpci5rZXkpKSsnXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtwYWlyLktleV0pKTsKKyAgICBlbmQ7CiAKLSAgICBFeHBlY3QoIGNyYXp5Llh0cnVjdHMuQ291bnQgPSAyLCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOwotICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1swXTsgIC8vIGxpc3RzIGFyZSBvcmRlcmVkLCBzbyB3ZSBhcmUgYWxsb3dlZCB0byBhc3N1bWUgdGhpcyBvcmRlcgotCSAgaGVsbG8gICA6PSBjcmF6eS5YdHJ1Y3RzWzFdOwotCi0gICAgRXhwZWN0KCBnb29kYnllLlN0cmluZ190aGluZyA9ICdHb29kYnllNCcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICInK2dvb2RieWUuU3RyaW5nX3RoaW5nKyciJyk7Ci0gICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuSTMyX3RoaW5nID0gNCwgJ2dvb2RieWUuSTMyX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkkzMl90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTY0X3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuX19pc3NldF9CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5fX2lzc2V0X0kzMl90aGluZywgJ2dvb2RieWUuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfSTY0X3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9JNjRfdGhpbmcpKTsKLQotICAgIEV4cGVjdCggaGVsbG8uU3RyaW5nX3RoaW5nID0gJ0hlbGxvMicsICdoZWxsby5TdHJpbmdfdGhpbmcgPSAiJytoZWxsby5TdHJpbmdfdGhpbmcrJyInKTsKLSAgICBFeHBlY3QoIGhlbGxvLkJ5dGVfdGhpbmcgPSAyLCAnaGVsbG8uQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uSTMyX3RoaW5nID0gMiwgJ2hlbGxvLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5JNjRfdGhpbmcgPSAyLCAnaGVsbG8uSTY0X3RoaW5nID0gJytJbnRUb1N0cihoZWxsby5JNjRfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnaGVsbG8uX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X1N0cmluZ190aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nLCAnaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5fX2lzc2V0X0kzMl90aGluZywgJ2hlbGxvLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9JMzJfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfSTY0X3RoaW5nLCAnaGVsbG8uX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X0k2NF90aGluZykpOworICAgIEV4cGVjdCggY3JhenkuWHRydWN0cy5Db3VudCA9IGluc2FuZS5YdHJ1Y3RzLkNvdW50LCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOworICAgIGZvciBhcmcwIDo9IDAgdG8gaW5zYW5lLlh0cnVjdHMuQ291bnQtMSBkbyBiZWdpbgorICAgICAgaGVsbG8gICA6PSBpbnNhbmUuWHRydWN0c1thcmcwXTsKKyAgICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1thcmcwXTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSBoZWxsby5TdHJpbmdfdGhpbmcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICcrZ29vZGJ5ZS5TdHJpbmdfdGhpbmcpOworICAgICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSBoZWxsby5CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JMzJfdGhpbmcgPSBoZWxsby5JMzJfdGhpbmcsICdnb29kYnllLkkzMl90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JMzJfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSBoZWxsby5JNjRfdGhpbmcsICdnb29kYnllLkk2NF90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JNjRfdGhpbmcpKTsKKyAgICBlbmQ7CiAgIGVuZDsKIAogCiAgIC8vIG11bHRpIGFyZ3MKLSAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGknKTsKKyAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGknLCB0ZXN0X0Jhc2VUeXBlcyk7CiAgIGFyZzAgOj0gMTsKICAgYXJnMSA6PSAyOwogICBhcmcyIDo9IEhpZ2goSW50NjQpOwpAQCAtNzY0LDE5ICs4ODUsMjEgQEAKICAgRXhwZWN0KCBpLl9faXNzZXRfSTY0X3RoaW5nLCAndGVzdE11bHRpOiBpLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0k2NF90aGluZykpOwogCiAgIC8vIG11bHRpIGV4Y2VwdGlvbgotICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbigxKScpOworICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbigxKScsIHRlc3RfRXhjZXB0aW9ucyk7CiAgIHRyeQogICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ25lZWQgbW9yZSBwaXp6YScsICdydW4gb3V0IG9mIGJlZXInKTsKICAgICBFeHBlY3QoIGkuU3RyaW5nX3RoaW5nID0gJ3J1biBvdXQgb2YgYmVlcicsICdpLlN0cmluZ190aGluZyA9ICInICtpLlN0cmluZ190aGluZysgJyInKTsKICAgICBFeHBlY3QoIGkuX19pc3NldF9TdHJpbmdfdGhpbmcsICdpLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X1N0cmluZ190aGluZykpOworICAgIHsgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSwgdGhlc2UgZmllbGRzIGFyZSBkZWZhdWx0LXNlcmlhbGl6ZWQKICAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfQnl0ZV90aGluZywgJ2kuX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaS5fX2lzc2V0X0J5dGVfdGhpbmcpKTsKICAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTMyX3RoaW5nLCAnaS5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JMzJfdGhpbmcpKTsKICAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTY0X3RoaW5nLCAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgICB9CiAgIGV4Y2VwdAotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKLSAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24pJyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKFhjZXB0aW9uKScsIHRlc3RfRXhjZXB0aW9ucyk7CiAgIHRyeQogICAgIGkgOj0gY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiggJ1hjZXB0aW9uJywgJ3NlY29uZCB0ZXN0Jyk7CiAgICAgRXhwZWN0KCBGQUxTRSwgJ3Rlc3RNdWx0aUV4Y2VwdGlvbignJ1hjZXB0aW9uJycpOiBtdXN0IHRyb3cgYW4gZXhjZXB0aW9uJyk7CkBAIC03ODcsMTAgKzkxMCwxMCBAQAogICAgICAgRXhwZWN0KCB4LkVycm9yQ29kZSA9IDEwMDEsICd4LkVycm9yQ29kZSA9ICcrSW50VG9TdHIoeC5FcnJvckNvZGUpKTsKICAgICAgIEV4cGVjdCggeC5NZXNzYWdlXyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJywgJ3guTWVzc2FnZSA9ICInK3guTWVzc2FnZV8rJyInKTsKICAgICBlbmQ7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAotICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbihYY2VwdGlvbjIpJyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAndGVzdE11bHRpRXhjZXB0aW9uKFhjZXB0aW9uMiknLCB0ZXN0X0V4Y2VwdGlvbnMpOwogICB0cnkKICAgICBpIDo9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oICdYY2VwdGlvbjInLCAndGhpcmQgdGVzdCcpOwogICAgIEV4cGVjdCggRkFMU0UsICd0ZXN0TXVsdGlFeGNlcHRpb24oJydYY2VwdGlvbjInJyk6IG11c3QgdHJvdyBhbiBleGNlcHRpb24nKTsKQEAgLTgwMSwzMyArOTI0LDEyNyBAQAogICAgICAgRXhwZWN0KCB4LkVycm9yQ29kZSA9IDIwMDIsICd4LkVycm9yQ29kZSA9ICcrSW50VG9TdHIoeC5FcnJvckNvZGUpKTsKICAgICAgIEV4cGVjdCggeC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJywgJ3guU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICInK3guU3RydWN0X3RoaW5nLlN0cmluZ190aGluZysnIicpOwogICAgICAgRXhwZWN0KCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X1N0cmluZ190aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfU3RyaW5nX3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKKyAgICAgIHsgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdHJ1ZSwgdGhlc2UgZmllbGRzIGFyZSBkZWZhdWx0LXNlcmlhbGl6ZWQKICAgICAgIEV4cGVjdCggbm90IHguU3RydWN0X3RoaW5nLl9faXNzZXRfQnl0ZV90aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfQnl0ZV90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfQnl0ZV90aGluZykpOwogICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JMzJfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0kzMl90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTMyX3RoaW5nKSk7CiAgICAgICBFeHBlY3QoIG5vdCB4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZywgJ3guU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nID0gJytCb29sVG9TdHJpbmcoeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcpKTsKKyAgICAgIH0KICAgICBlbmQ7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAogCiAgIC8vIG9uZXdheSBmdW5jdGlvbnMKLSAgU3RhcnRUZXN0R3JvdXAoICdUZXN0IE9uZXdheSgxKScpOworICBTdGFydFRlc3RHcm91cCggJ1Rlc3QgT25ld2F5KDEpJywgdGVzdF9Vbmtub3duKTsKICAgY2xpZW50LnRlc3RPbmV3YXkoMSk7CiAgIEV4cGVjdCggVFJVRSwgJ1Rlc3QgT25ld2F5KDEpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgogCiAgIC8vIGNhbGwgdGltZQorICB7JElGREVGIFBlcmZUZXN0fQogICBTdGFydFRlc3RHcm91cCggJ1Rlc3QgQ2FsbHRpbWUoKScpOwotICBTdGFydFRpY2sgOj0gR2V0VElja0NvdW50OworICBTdGFydFRpY2sgOj0gR2V0VGlja0NvdW50OwogICBmb3IgayA6PSAwIHRvIDEwMDAgLSAxIGRvCiAgIGJlZ2luCiAgICAgY2xpZW50LnRlc3RWb2lkKCk7CiAgIGVuZDsKICAgQ29uc29sZS5Xcml0ZUxpbmUoJyA9ICcgKyBGbG9hdFRvU3RyKCAoR2V0VGlja0NvdW50IC0gU3RhcnRUaWNrKSAvIDEwMDAgKSArICcgbXMgYSB0ZXN0Vm9pZCgpIGNhbGwnICk7CisgIHskRU5ESUYgUGVyZlRlc3R9CiAKICAgLy8gbm8gbW9yZSB0ZXN0cyBoZXJlCi0gIFN0YXJ0VGVzdEdyb3VwKCAnJyk7CisgIFN0YXJ0VGVzdEdyb3VwKCAnJywgdGVzdF9Vbmtub3duKTsKIGVuZDsKIAogCit7JElGREVGIFN1cHBvcnRzQXN5bmN9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5DbGllbnRBc3luY1Rlc3Q7Cit2YXIKKyAgY2xpZW50IDogVFRocmlmdFRlc3QuSUFzeW5jOworICBzIDogc3RyaW5nOworICBpOCA6IFNob3J0SW50OworYmVnaW4KKyAgU3RhcnRUZXN0R3JvdXAoICdBc3luYyBUZXN0cycsIHRlc3RfVW5rbm93bik7CisgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKKyAgRlRyYW5zcG9ydC5PcGVuOworCisgIC8vIG9uZXdheSB2b2lkIGZ1bmN0aW9ucworICBjbGllbnQudGVzdE9uZXdheUFzeW5jKDEpLldhaXQ7CisgIEV4cGVjdCggVFJVRSwgJ1Rlc3QgT25ld2F5KDEpJyk7ICAvLyBzdWNjZXNzIDo9IG5vIGV4Y2VwdGlvbgorCisgIC8vIG5vcm1hbCBmdW5jdGlvbnMKKyAgcyA6PSBjbGllbnQudGVzdFN0cmluZ0FzeW5jKEhVR0VfVEVTVF9TVFJJTkcpLlZhbHVlOworICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKKyAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKKyAgICAgICAgICsnPT4gbGVuZ3RoKHJlc3VsdCkgPSAnK0ludFRvU3RyKExlbmd0aChzKSkpOworCisgIGk4IDo9IGNsaWVudC50ZXN0Qnl0ZSgxKS5WYWx1ZTsKKyAgRXhwZWN0KCBpOCA9IDEsICd0ZXN0Qnl0ZSgxKSA9ICcgKyBJbnRUb1N0ciggaTggKSk7CitlbmQ7Cit7JEVORElGfQorCisKK3skSUZERUYgU3RyZXNzVGVzdH0KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOworYmVnaW4KKyAgd2hpbGUgVFJVRSBkbyBiZWdpbgorICAgIHRyeQorICAgICAgaWYgbm90IEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5PcGVuOyAgIC8vIHJlLW9wZW4gY29ubmVjdGlvbiwgc2VydmVyIGhhcyBhbHJlYWR5IGNsb3NlZAorICAgICAgdHJ5CisgICAgICAgIGNsaWVudC50ZXN0U3RyaW5nKCdUZXN0Jyk7CisgICAgICAgIFdyaXRlKCcuJyk7CisgICAgICBmaW5hbGx5CisgICAgICAgIGlmIEZUcmFuc3BvcnQuSXNPcGVuIHRoZW4gRlRyYW5zcG9ydC5DbG9zZTsKKyAgICAgIGVuZDsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIFdyaXRlbG4oIzEwK2UubWVzc2FnZSk7CisgICAgZW5kOworICBlbmQ7CitlbmQ7Cit7JEVORElGfQorCisKK2Z1bmN0aW9uIFRDbGllbnRUaHJlYWQuUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbjsgYVNpemUgOiBUVGVzdFNpemUpIDogVEJ5dGVzOwordmFyIGkgOiBJbnRlZ2VyOworYmVnaW4KKyAgY2FzZSBhU2l6ZSBvZgorICAgIEVtcHR5ICAgICAgICAgIDogU2V0TGVuZ3RoKCByZXN1bHQsIDApOworICAgIE5vcm1hbCAgICAgICAgIDogU2V0TGVuZ3RoKCByZXN1bHQsICQxMDApOworICAgIEJ5dGVBcnJheVRlc3QgIDogU2V0TGVuZ3RoKCByZXN1bHQsIFNpemVPZihUQnl0ZUFycmF5KSArIDEyOCk7CisgICAgUGlwZVdyaXRlTGltaXQgOiBTZXRMZW5ndGgoIHJlc3VsdCwgNjU1MzUgKyAxMjgpOworICBlbHNlCisgICAgcmFpc2UgRUFyZ3VtZW50RXhjZXB0aW9uLkNyZWF0ZSgnYVNpemUnKTsKKyAgZW5kOworCisgIEFTU0VSVCggTG93KHJlc3VsdCkgPSAwKTsKKyAgaWYgTGVuZ3RoKHJlc3VsdCkgPSAwIHRoZW4gRXhpdDsKKworICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICBpZiBub3QgYVJhbmRvbURpc3QgdGhlbiBiZWdpbgorICAgIGZvciBpIDo9IExvdyhyZXN1bHQpIHRvIEhpZ2gocmVzdWx0KSBkbyBiZWdpbgorICAgICAgcmVzdWx0W2ldIDo9IGkgbW9kICQxMDA7CisgICAgZW5kOworICAgIEV4aXQ7CisgIGVuZDsKKworICAvLyByYW5kb20gZGlzdHJpYnV0aW9uIG9mIGFsbCAyNTYgdmFsdWVzCisgIEZpbGxDaGFyKCByZXN1bHRbMF0sIExlbmd0aChyZXN1bHQpICogU2l6ZU9mKHJlc3VsdFswXSksICQwKTsKKyAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCisgICAgcmVzdWx0W2ldIDo9IEJ5dGUoIFJhbmRvbSgkMTAwKSk7CisgIGVuZDsKK2VuZDsKKworCit7JElGREVGIFdpbjY0fQorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OwordmFyIGEsYiA6IEludDY0OworYmVnaW4KKyAgYSA6PSAxOworICBiIDo9IDI7CisgIFRocmlmdC5VdGlscy5JbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIGEsYik7CisgIEV4cGVjdCggYSA9IDMsICdJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQnKTsKK2VuZDsKK3skRU5ESUZ9CisKKwogcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKIC8vIFRlc3RzIG9ubHkgdGhlbiByZWFkL3dyaXRlIHByb2NlZHVyZXMgb2YgdGhlIEpTT04gcHJvdG9jb2wKIC8vIEFsbCB0ZXN0cyBzdWNjZWVkLCBpZiB3ZSBjYW4gcmVhZCB3aGF0IHdlIHdyb3RlIGJlZm9yZQpAQCAtODM1LDggKzEwNTIsOCBAQAogLy8gb3RoZXIgY2xpZW50cyBvciBzZXJ2ZXJzIGV4cGVjdCBhcyB0aGUgcmVhbCBKU09OLiBUaGlzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyB0ZXN0LgogdmFyIHByb3QgICA6IElQcm90b2NvbDsKICAgICBzdG0gICAgOiBUU3RyaW5nU3RyZWFtOwotICAgIGxpc3QgICA6IElMaXN0OwotICAgIGJpbmFyeSwgYmluUmVhZCA6IFRCeXRlczsKKyAgICBsaXN0ICAgOiBUVGhyaWZ0TGlzdDsKKyAgICBiaW5hcnksIGJpblJlYWQsIGVtcHR5QmluYXJ5IDogVEJ5dGVzOwogICAgIGksaUVyciA6IEludGVnZXI7CiBjb25zdAogICBURVNUX1NIT1JUICAgPSBTaG9ydEludCggJEZFKTsKQEAgLTg0NiwxNCArMTA2MywyMCBAQAogICBURVNUX0RPVUJMRSAgPSAtMS4yMzRlLTU2OwogICBERUxUQV9ET1VCTEUgPSBURVNUX0RPVUJMRSAqIDFlLTE0OwogICBURVNUX1NUUklORyAgPSAnYWJjLScjJDAwRTQjJDAwZjYjJDAwZmM7IC8vIGdlcm1hbiB1bWxhdXRzIChlbi11czogImZ1bm55IGNoYXJzIikKKyAgLy8gVGVzdCBUSFJJRlQtMjMzNiBhbmQgVEhSSUZULTM0MDQgd2l0aCBVKzFEMTFFIChHIENsZWYgc3ltYm9sKSBhbmQgJ9Cg0YPRgdGB0LrQvtC1INCd0LDQt9Cy0LDQvdC40LUnOworICBHX0NMRUZfQU5EX0NZUklMTElDX1RFWFQgPSAjJDFkMTFlJyAnIyQwNDIwIyQwNDQzIyQwNDQxIyQwNDQxIyQwNDNhIyQwNDNlIyQwNDM1JyAnIyQwNDFkIyQwNDMwIyQwNDM3IyQwNDMyIyQwNDMwIyQwNDNkIyQwNDM4IyQwNDM1OworICBHX0NMRUZfQU5EX0NZUklMTElDX0pTT04gPSAnIlx1ZDgzNFx1ZGQxZSBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0M2VcdTA0MzUgXHUwNDFkXHUwNDMwXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDNkXHUwNDM4XHUwNDM1Iic7CisgIC8vIHRlc3QgYm90aCBwb3NzaWJsZSBzb2xpZHVzIGVuY29kaW5ncworICBTT0xJRFVTX0pTT05fREFUQSA9ICcib25lL3R3b1wvdGhyZWUiJzsKKyAgU09MSURVU19FWENQRUNURUQgPSAnb25lL3R3by90aHJlZSc7CiBiZWdpbgogICBzdG0gIDo9IFRTdHJpbmdTdHJlYW0uQ3JlYXRlOwogICB0cnkKLSAgICBTdGFydFRlc3RHcm91cCggJ0pzb25Qcm90b2NvbFRlc3QnKTsgIC8vIG5vIG1vcmUgdGVzdHMgaGVyZQorICAgIFN0YXJ0VGVzdEdyb3VwKCAnSnNvblByb3RvY29sVGVzdCcsIHRlc3RfVW5rbm93bik7CiAKICAgICAvLyBwcmVwYXJlIGJpbmFyeSBkYXRhCi0gICAgU2V0TGVuZ3RoKCBiaW5hcnksICQxMDApOwotICAgIGZvciBpIDo9IExvdyhiaW5hcnkpIHRvIEhpZ2goYmluYXJ5KSBkbyBiaW5hcnlbaV0gOj0gaTsKKyAgICBiaW5hcnkgOj0gUHJlcGFyZUJpbmFyeURhdGEoIEZBTFNFLCBOb3JtYWwpOworICAgIFNldExlbmd0aCggZW1wdHlCaW5hcnksIDApOyAvLyBlbXB0eSBiaW5hcnkgZGF0YSBibG9jawogCiAgICAgLy8gb3V0cHV0IHNldHVwCiAgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCkBAIC04NjEsNyArMTA4NCw4IEBACiAgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CiAKICAgICAvLyB3cml0ZQotICAgIHByb3QuV3JpdGVMaXN0QmVnaW4oIFRMaXN0SW1wbC5DcmVhdGUoIFRUeXBlLlN0cmluZ18sIDkpKTsKKyAgICBJbml0KCBsaXN0LCBUVHlwZS5TdHJpbmdfLCA5KTsKKyAgICBwcm90LldyaXRlTGlzdEJlZ2luKCBsaXN0KTsKICAgICBwcm90LldyaXRlQm9vbCggVFJVRSk7CiAgICAgcHJvdC5Xcml0ZUJvb2woIEZBTFNFKTsKICAgICBwcm90LldyaXRlQnl0ZSggVEVTVF9TSE9SVCk7CkBAIC04NzEsNiArMTA5NSw4IEBACiAgICAgcHJvdC5Xcml0ZURvdWJsZSggVEVTVF9ET1VCTEUpOwogICAgIHByb3QuV3JpdGVTdHJpbmcoIFRFU1RfU1RSSU5HKTsKICAgICBwcm90LldyaXRlQmluYXJ5KCBiaW5hcnkpOworICAgIHByb3QuV3JpdGVTdHJpbmcoICcnKTsgIC8vIGVtcHR5IHN0cmluZworICAgIHByb3QuV3JpdGVCaW5hcnkoIGVtcHR5QmluYXJ5KTsgLy8gZW1wdHkgYmluYXJ5IGRhdGEgYmxvY2sKICAgICBwcm90LldyaXRlTGlzdEVuZDsKIAogICAgIC8vIGlucHV0IHNldHVwCkBAIC04OTMsNiArMTExOSw4IEBACiAgICAgRXhwZWN0KCBhYnMocHJvdC5SZWFkRG91YmxlLVRFU1RfRE9VQkxFKSA8IGFicyhERUxUQV9ET1VCTEUpLCAnV3JpdGVEb3VibGUvUmVhZERvdWJsZScpOwogICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gVEVTVF9TVFJJTkcsICdXcml0ZVN0cmluZy9SZWFkU3RyaW5nJyk7CiAgICAgYmluUmVhZCA6PSBwcm90LlJlYWRCaW5hcnk7CisgICAgRXhwZWN0KCBMZW5ndGgocHJvdC5SZWFkU3RyaW5nKSA9IDAsICdXcml0ZVN0cmluZy9SZWFkU3RyaW5nIChlbXB0eSBzdHJpbmcpJyk7CisgICAgRXhwZWN0KCBMZW5ndGgocHJvdC5SZWFkQmluYXJ5KSA9IDAsICdlbXB0eSBXcml0ZUJpbmFyeS9SZWFkQmluYXJ5IChlbXB0eSBkYXRhIGJsb2NrKScpOwogICAgIHByb3QuUmVhZExpc3RFbmQ7CiAKICAgICAvLyB0ZXN0IGJpbmFyeSBkYXRhCkBAIC05MTAsMTcgKzExMzgsNTkgQEAKIAogICAgIEV4cGVjdCggc3RtLlBvc2l0aW9uID0gc3RtLlNpemUsICdTdHJlYW0gcG9zaXRpb24gYWZ0ZXIgcmVhZCcpOwogCisKKyAgICAvLyBTb2xpZHVzIGNhbiBiZSBlbmNvZGVkIGluIHR3byB3YXlzLiBNYWtlIHN1cmUgd2UgY2FuIHJlYWQgYm90aAorICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHN0bS5Xcml0ZVN0cmluZyhTT0xJRFVTX0pTT05fREFUQSk7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IFNPTElEVVNfRVhDUEVDVEVELCAnU29saWR1cyBlbmNvZGluZycpOworCisKKyAgICAvLyBXaWRlY2hhcnMgc2hvdWxkIHdvcmsgdG9vLiBEbyB0aGV5PworICAgIC8vIEFmdGVyIHdyaXRpbmcsIHdlIGVuc3VyZSB0aGF0IHdlIGFyZSBhYmxlIHRvIHJlYWQgaXQgYmFjaworICAgIC8vIFdlIGNhbid0IGFzc3VtZSBoZXgtZW5jb2RpbmcsIHNpbmNlIChuZWFybHkpIGFueSBVbmljb2RlIGNoYXIgaXMgdmFsaWQgSlNPTgorICAgIHN0bS5Qb3NpdGlvbiA6PSAwOworICAgIHN0bS5TaXplICAgICA6PSAwOworICAgIHByb3QgOj0gVEpTT05Qcm90b2NvbEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgICAgbmlsLCBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpKSk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggR19DTEVGX0FORF9DWVJJTExJQ19URVhUKTsKKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBwcm90IDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgVFN0cmVhbVRyYW5zcG9ydEltcGwuQ3JlYXRlKAorICAgICAgICAgICAgICAgIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggc3RtLCBGQUxTRSksIG5pbCkpOworICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gR19DTEVGX0FORF9DWVJJTExJQ19URVhULCAnV3JpdGluZyBKU09OIHdpdGggY2hhcnMgPiA4IGJpdCcpOworCisgICAgLy8gV2lkZWNoYXJzIHNob3VsZCB3b3JrIHdpdGggaGV4LWVuY29kaW5nIHRvby4gRG8gdGhleT8KKyAgICBzdG0uUG9zaXRpb24gOj0gMDsKKyAgICBzdG0uU2l6ZSAgICAgOj0gMDsKKyAgICBzdG0uV3JpdGVTdHJpbmcoIEdfQ0xFRl9BTkRfQ1lSSUxMSUNfSlNPTik7CisgICAgc3RtLlBvc2l0aW9uIDo9IDA7CisgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCisgICAgICAgICAgICAgIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSgKKyAgICAgICAgICAgICAgICBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIHN0bSwgRkFMU0UpLCBuaWwpKTsKKyAgICBFeHBlY3QoIHByb3QuUmVhZFN0cmluZyA9IEdfQ0xFRl9BTkRfQ1lSSUxMSUNfVEVYVCwgJ1JlYWRpbmcgSlNPTiB3aXRoIGNoYXJzID4gOCBiaXQnKTsKKworCiAgIGZpbmFsbHkKICAgICBzdG0uRnJlZTsKICAgICBwcm90IDo9IG5pbDsgIC8vLT4gUmVsZWFzZQotICAgIFN0YXJ0VGVzdEdyb3VwKCAnJyk7ICAvLyBubyBtb3JlIHRlc3RzIGhlcmUKKyAgICBTdGFydFRlc3RHcm91cCggJycsIHRlc3RfVW5rbm93bik7ICAvLyBubyBtb3JlIHRlc3RzIGhlcmUKICAgZW5kOwogZW5kOwogCiAKLXByb2NlZHVyZSBUQ2xpZW50VGhyZWFkLlN0YXJ0VGVzdEdyb3VwKCBjb25zdCBhR3JvdXAgOiBzdHJpbmcpOworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RhcnRUZXN0R3JvdXAoIGNvbnN0IGFHcm91cCA6IHN0cmluZzsgY29uc3QgYVRlc3QgOiBUVGVzdEdyb3VwKTsKIGJlZ2luCiAgIEZUZXN0R3JvdXAgOj0gYUdyb3VwOworICBGQ3VycmVudFRlc3QgOj0gYVRlc3Q7CisKKyAgSW5jbHVkZSggRkV4ZWN1dGVkLCBhVGVzdCk7CisKICAgaWYgRlRlc3RHcm91cCA8PiAnJyB0aGVuIGJlZ2luCiAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJycpOwogICAgIENvbnNvbGUuV3JpdGVMaW5lKCBhR3JvdXArJyB0ZXN0cycpOwpAQCAtOTM3LDEyICsxMjA3LDE0IEBACiAgIGVuZAogICBlbHNlIGJlZ2luCiAgICAgRkVycm9ycy5BZGQoIEZUZXN0R3JvdXArJzogJythVGVzdEluZm8pOworICAgIEluY2x1ZGUoIEZGYWlsZWQsIEZDdXJyZW50VGVzdCk7CiAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIGFUZXN0SW5mbysnOiAqKiogRkFJTEVEICoqKicpOwogCiAgICAgLy8gV2UgaGF2ZSBhIGZhaWxlZCB0ZXN0IQogICAgIC8vIC0+IGlzc3VlIERlYnVnQnJlYWsgT05MWSBpZiBhIGRlYnVnZ2VyIGlzIGF0dGFjaGVkLAogICAgIC8vIC0+IHVuaGFuZGxlZCBEZWJ1Z0JyZWFrcyB3b3VsZCBjYXVzZSBXaW5kb3dzIHRvIHRlcm1pbmF0ZSB0aGUgYXBwIG90aGVyd2lzZQotICAgIGlmIElzRGVidWdnZXJQcmVzZW50IHRoZW4gYXNtIGludCAzIGVuZDsKKyAgICBpZiBJc0RlYnVnZ2VyUHJlc2VudAorICAgIHRoZW4geyRJRkRFRiBDUFVYNjR9IERlYnVnQnJlYWsgeyRFTFNFfSBhc20gaW50IDMgZW5kIHskRU5ESUZ9OwogICBlbmQ7CiBlbmQ7CiAKQEAgLTk3NCwxOCArMTI0NiwzMSBAQAogZW5kOwogCiAKLWNvbnN0cnVjdG9yIFRDbGllbnRUaHJlYWQuQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJVHJhbnNwb3J0OyBjb25zdCBBUHJvdG9jb2wgOiBJUHJvdG9jb2w7IEFOdW1JdGVyYXRpb246IEludGVnZXIpOworZnVuY3Rpb24gVENsaWVudFRocmVhZC5DYWxjdWxhdGVFeGl0Q29kZSA6IEJ5dGU7Cit2YXIgdGVzdCA6IFRUZXN0R3JvdXA7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCBUcnVlICk7CisgIHJlc3VsdCA6PSBFWElUQ09ERV9TVUNDRVNTOworICBmb3IgdGVzdCA6PSBMb3coVFRlc3RHcm91cCkgdG8gSGlnaChUVGVzdEdyb3VwKSBkbyBiZWdpbgorICAgIGlmICh0ZXN0IGluIEZGYWlsZWQpIG9yIG5vdCAodGVzdCBpbiBGRXhlY3V0ZWQpCisgICAgdGhlbiByZXN1bHQgOj0gcmVzdWx0IG9yIE1BUF9GQUlMVVJFU19UT19FWElUQ09ERV9CSVRTW3Rlc3RdOworICBlbmQ7CitlbmQ7CisKKworY29uc3RydWN0b3IgVENsaWVudFRocmVhZC5DcmVhdGUoIGNvbnN0IGFTZXR1cCA6IFRUZXN0U2V0dXA7IGNvbnN0IGFOdW1JdGVyYXRpb246IEludGVnZXIpOworYmVnaW4KKyAgRlNldHVwIDo9IGFTZXR1cDsKICAgRk51bUl0ZXJhdGlvbiA6PSBBTnVtSXRlcmF0aW9uOwotICBGVHJhbnNwb3J0IDo9IEFUcmFuc3BvcnQ7Ci0gIEZQcm90b2NvbCA6PSBBUHJvdG9jb2w7CisKICAgRkNvbnNvbGUgOj0gVFRocmVhZENvbnNvbGUuQ3JlYXRlKCBTZWxmICk7CisgIEZDdXJyZW50VGVzdCA6PSB0ZXN0X1Vua25vd247CiAKICAgLy8gZXJyb3IgbGlzdDoga2VlcCBjb3JyZWN0IG9yZGVyLCBhbGxvdyBmb3IgZHVwbGljYXRlcwogICBGRXJyb3JzIDo9IFRTdHJpbmdMaXN0LkNyZWF0ZTsKICAgRkVycm9ycy5Tb3J0ZWQgOj0gRkFMU0U7CiAgIEZFcnJvcnMuRHVwbGljYXRlcyA6PSBkdXBBY2NlcHQ7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggVFJVRSk7CiBlbmQ7CiAKIGRlc3RydWN0b3IgVENsaWVudFRocmVhZC5EZXN0cm95OwpAQCAtOTk4LDM5ICsxMjgzLDE0NCBAQAogcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuRXhlY3V0ZTsKIHZhcgogICBpIDogSW50ZWdlcjsKLSAgcHJvYyA6IFRUaHJlYWRQcm9jZWR1cmU7CiBiZWdpbgogICAvLyBwZXJmb3JtIGFsbCB0ZXN0cwogICB0cnkKLSAgICBmb3IgaSA6PSAwIHRvIEZOdW1JdGVyYXRpb24gLSAxIGRvCi0gICAgYmVnaW4KLSAgICAgIENsaWVudFRlc3Q7Ci0gICAgICBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OworICAgIHskSUZERUYgV2luNjR9CisgICAgVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OworICAgIHskRU5ESUZ9CisgICAgSlNPTlByb3RvY29sUmVhZFdyaXRlVGVzdDsKKworICAgIC8vIG11c3QgYmUgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAgICBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICB0cnkKKyAgICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8gYmVnaW4KKyAgICAgICAgQ2xpZW50VGVzdDsKKyAgICAgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgICAgICBDbGllbnRBc3luY1Rlc3Q7CisgICAgICAgIHskRU5ESUZ9CisgICAgICBlbmQ7CisKKyAgICAgIC8vIHJlcG9ydCB0aGUgb3V0Y29tZQorICAgICAgUmVwb3J0UmVzdWx0czsKKyAgICAgIFNldFJldHVyblZhbHVlKCBDYWxjdWxhdGVFeGl0Q29kZSk7CisKKyAgICBmaW5hbGx5CisgICAgICBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CiAgICAgZW5kOworCiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIicrZS5tZXNzYWdlKyciJyk7CiAgIGVuZDsKK2VuZDsKIAotICAvLyByZXBvcnQgdGhlIG91dGNvbWUKLSAgUmVwb3J0UmVzdWx0czsKIAotICAvLyBzaHV0ZG93bgotICBwcm9jIDo9IHByb2NlZHVyZQotICBiZWdpbgotICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4KLSAgICBiZWdpbgorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7Cit2YXIKKyAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OworICBodHRwIDogSUhUVFBDbGllbnQ7CisgIHNVcmwgOiBzdHJpbmc7Citjb25zdAorICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7CisgIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgIFBJUEVfVElNRU9VVCAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgSFRUUF9USU1FT1VUUyAgID0gMTAgKiAxMDAwOworYmVnaW4KKyAgLy8gbmVlZGVkIGZvciBIVFRQIGNsaWVudHMgYXMgdGhleSB1dGlsaXplIHRoZSBNU1hNTCBDT00gY29tcG9uZW50cworICBPbGVDaGVjayggQ29Jbml0aWFsaXplKCBuaWwpKTsKKworICBjYXNlIEZTZXR1cC5lbmRwb2ludCBvZgorICAgIHRybnNfU29ja2V0czogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK0ZTZXR1cC5ob3N0KycgcG9ydCAnK0ludFRvU3RyKEZTZXR1cC5wb3J0KSsnKScpOworICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBGU2V0dXAuaG9zdCwgRlNldHVwLnBvcnQgKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19IdHRwOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKKyAgICAgIGlmIEZTZXR1cC51c2VTU0wKKyAgICAgIHRoZW4gc1VybCA6PSAnaHR0cDovLycKKyAgICAgIGVsc2Ugc1VybCA6PSAnaHR0cHM6Ly8nOworICAgICAgc1VybCA6PSBzVXJsICsgRlNldHVwLmhvc3Q7CisgICAgICBjYXNlIEZTZXR1cC5wb3J0IG9mCisgICAgICAgIDgwICA6IGlmIEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgICAgNDQzIDogaWYgbm90IEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgRlNldHVwLnBvcnQgPiAwIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbmQ7CisgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIHNVcmwpOworICAgICAgaHR0cC5EbnNSZXNvbHZlVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5Db25uZWN0aW9uVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5TZW5kVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5SZWFkVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgRlRyYW5zcG9ydCA6PSBodHRwOworICAgIGVuZDsKKworICAgIHRybnNfRXZIdHRwOiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW0ZTZXR1cC5lbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBGU2V0dXAuc1BpcGVOYW1lLCAwLCBuaWwsIFBJUEVfVElNRU9VVCwgUElQRV9USU1FT1VUKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGU2V0dXAuaEFub25SZWFkLCBGU2V0dXAuaEFub25Xcml0ZSwgRkFMU0UpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgZW5kOworICBBU1NFUlQoIEZUcmFuc3BvcnQgPD4gbmlsKTsKKworICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgaWYgKHRybnNfRnJhbWVkIGluIEZTZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbmQKKyAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBGU2V0dXAubGF5ZXJlZCkgYW5kIChzdHJlYW10cmFucyA8PiBuaWwpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCisgIGVuZDsKKworICBpZiBGU2V0dXAudXNlU1NMIHRoZW4gYmVnaW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wvVExTIG5vdCBpbXBsZW1lbnRlZCcpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgIGNhc2UgRlNldHVwLnByb3RUeXBlIG9mCisgICAgcHJvdF9CaW5hcnkgIDogIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCwgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICBwcm90X0pTT04gICAgOiAgRlByb3RvY29sIDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgICAgcHJvdF9Db21wYWN0IDogIEZQcm90b2NvbCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgIGVuZDsKKworICBBU1NFUlQoIChGVHJhbnNwb3J0IDw+IG5pbCkgYW5kIChGUHJvdG9jb2wgPD4gbmlsKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sIDo9IG5pbDsKKworICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4gYmVnaW4KICAgICAgIEZUcmFuc3BvcnQuQ2xvc2U7CiAgICAgICBGVHJhbnNwb3J0IDo9IG5pbDsKICAgICBlbmQ7Ci0gIGVuZDsKIAotICBTeW5jaHJvbml6ZSggcHJvYyApOworICBmaW5hbGx5CisgICAgQ29VbmluaXRpYWxpemU7CisgIGVuZDsKIGVuZDsKIAorCiB7IFRUaHJlYWRDb25zb2xlIH0KIAogY29uc3RydWN0b3IgVFRocmVhZENvbnNvbGUuQ3JlYXRlKEFUaHJlYWQ6IFRUaHJlYWQpOwogYmVnaW4KKyAgaW5oZXJpdGVkIENyZWF0ZTsKICAgRlRocmVhZCA6PSBBVGhyZWFkOwogZW5kOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENvbnN0YW50cy5wYXMKaW5kZXggOWNiODVhYi4uMzc5NjlkYyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDb25zdGFudHMucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q29uc3RhbnRzLnBhcwpAQCAtMjEsMTYgKzIxLDE0MiBAQAogCiBpbnRlcmZhY2UKIAordXNlcyBTeXNVdGlsczsKKwogdHlwZQotICBUS25vd25Qcm90b2NvbCA9ICggcHJvdF9CaW5hcnksICAvLyBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbAotICAgICAgICAgICAgICAgICAgICAgcHJvdF9KU09OICAgICAvLyBKU09OIHByb3RvY29sCi0gICAgICAgICAgICAgICAgICAgKTsKKyAgVEtub3duUHJvdG9jb2wgPSAoCisgICAgcHJvdF9CaW5hcnksICAvLyBkZWZhdWx0IGJpbmFyeSBwcm90b2NvbAorICAgIHByb3RfSlNPTiwgICAgLy8gSlNPTiBwcm90b2NvbAorICAgIHByb3RfQ29tcGFjdAorICApOworCisgIFRTZXJ2ZXJUeXBlID0gKAorICAgIHNydl9TaW1wbGUsCisgICAgc3J2X05vbmJsb2NraW5nLAorICAgIHNydl9UaHJlYWRwb29sLAorICAgIHNydl9UaHJlYWRlZAorICApOworCisgIFRFbmRwb2ludFRyYW5zcG9ydCA9ICgKKyAgICB0cm5zX1NvY2tldHMsCisgICAgdHJuc19IdHRwLAorICAgIHRybnNfTmFtZWRQaXBlcywKKyAgICB0cm5zX0Fub25QaXBlcywKKyAgICB0cm5zX0V2SHR0cCAgLy8gYXMgbGlzdGVkIG9uIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy90ZXN0CisgICk7CisKKyAgVExheWVyZWRUcmFuc3BvcnQgPSAoCisgICAgdHJuc19CdWZmZXJlZCwKKyAgICB0cm5zX0ZyYW1lZAorICApOworCisgIFRMYXllcmVkVHJhbnNwb3J0cyA9IHNldCBvZiBUTGF5ZXJlZFRyYW5zcG9ydDsKKwogY29uc3QKLSAgS05PV05fUFJPVE9DT0xTIDogYXJyYXlbVEtub3duUHJvdG9jb2xdIG9mIHN0cmluZwotICAgICAgICAgICAgICAgICAgPSAoJ2JpbmFyeScsICdKU09OJyk7CisgIFNFUlZFUl9UWVBFUyA6IGFycmF5W1RTZXJ2ZXJUeXBlXSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdTaW1wbGUnLCAnTm9uYmxvY2tpbmcnLCAnVGhyZWFkcG9vbCcsICdUaHJlYWRlZCcpOworCisgIFRIUklGVF9QUk9UT0NPTFMgOiBhcnJheVtUS25vd25Qcm90b2NvbF0gb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICA9ICgnQmluYXJ5JywgJ0pTT04nLCAnQ29tcGFjdCcpOworCisgIExBWUVSRURfVFJBTlNQT1JUUyA6IGFycmF5W1RMYXllcmVkVHJhbnNwb3J0XSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdCdWZmZXJlZCcsICdGcmFtZWQnKTsKKworICBFTkRQT0lOVF9UUkFOU1BPUlRTIDogYXJyYXlbVEVuZHBvaW50VHJhbnNwb3J0XSBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgID0gKCdTb2NrZXRzJywgJ0h0dHAnLCAnTmFtZWQgUGlwZXMnLCdBbm9uIFBpcGVzJywgJ0V2SHR0cCcpOworCisgIC8vIGRlZmF1bHRzIGFyZTogcmVhZD1mYWxzZSwgd3JpdGU9dHJ1ZQorICBCSU5BUllfU1RSSUNUX1JFQUQgID0gRkFMU0U7CisgIEJJTkFSWV9TVFJJQ1RfV1JJVEUgPSBGQUxTRTsKKworICBIVUdFX1RFU1RfU1RSSU5HID0gJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJworICAgICAgICAgICAgICAgICAgICsgJ0xvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtIG5vbnVteSAnCisgICAgICAgICAgICAgICAgICAgKyAnZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICd2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgJworICAgICAgICAgICAgICAgICAgICsgJ2FtZXQuIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZXRldHVyIHNhZGlwc2NpbmcgZWxpdHIsIHNlZCBkaWFtICcKKyAgICAgICAgICAgICAgICAgICArICdub251bXkgZWlybW9kIHRlbXBvciBpbnZpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1eWFtIGVyYXQsIHNlZCAnCisgICAgICAgICAgICAgICAgICAgKyAnZGlhbSB2b2x1cHR1YS4gQXQgdmVybyBlb3MgZXQgYWNjdXNhbSBldCBqdXN0byBkdW8gZG9sb3JlcyBldCBlYSByZWJ1bS4gU3RldCAnCisgICAgICAgICAgICAgICAgICAgKyAnY2xpdGEga2FzZCBndWJlcmdyZW4sIG5vIHNlYSB0YWtpbWF0YSBzYW5jdHVzIGVzdCBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldC4gJzsKKworCitmdW5jdGlvbiBCeXRlc1RvSGV4KCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBzdHJpbmc7CisKIAogaW1wbGVtZW50YXRpb24KIAotLy8gbm90aGluZworCitmdW5jdGlvbiBCeXRlc1RvSGV4KCBjb25zdCBieXRlcyA6IFRCeXRlcykgOiBzdHJpbmc7Cit2YXIgaSA6IEludGVnZXI7CitiZWdpbgorICByZXN1bHQgOj0gJyc7CisgIGZvciBpIDo9IExvdyhieXRlcykgdG8gSGlnaChieXRlcykgZG8gYmVnaW4KKyAgICByZXN1bHQgOj0gcmVzdWx0ICsgSW50VG9IZXgoYnl0ZXNbaV0sMik7CisgIGVuZDsKK2VuZDsKKwogCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKaW5kZXggNWQwMDNkYS4uNjljYjE3NSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpAQCAtMTksMjQgKzE5LDI5IEBACiAKIHVuaXQgVGVzdFNlcnZlcjsKIAoreyRJIC4uL3NyYy9UaHJpZnQuRGVmaW5lcy5pbmN9CiB7JFdBUk4gU1lNQk9MX1BMQVRGT1JNIE9GRn0KIAorey4kREVGSU5FIFJ1bkVuZGxlc3N9ICAgLy8gYWN0aXZhdGUgdG8gaW50ZXJhY3RpdmVseSBzdHJlc3MtdGVzdCB0aGUgc2VydmVyIHN0b3Agcm91dGluZXMgdmlhIEN0cmwrQworCiBpbnRlcmZhY2UKIAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCwKICAgVGhyaWZ0LkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVXRpbHMsCiAgIFRocmlmdC5UZXN0LAogICBUaHJpZnQsCiAgIFRlc3RDb25zdGFudHMsCisgIFRlc3RTZXJ2ZXJFdmVudHMsCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKQEAgLTQ2LDYgKzUxLDcgQEAKIAogICAgICAgSVRlc3RIYW5kbGVyID0gaW50ZXJmYWNlKCBUVGhyaWZ0VGVzdC5JZmFjZSApCiAgICAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CisgICAgICAgIHByb2NlZHVyZSBUZXN0U3RvcDsKICAgICAgIGVuZDsKIAogICAgICAgVFRlc3RIYW5kbGVySW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRlc3RIYW5kbGVyICkKQEAgLTUzLDExICs1OSwxMyBAQAogICAgICAgICBGU2VydmVyIDogSVNlcnZlcjsKICAgICAgIHByb3RlY3RlZAogICAgICAgICBwcm9jZWR1cmUgdGVzdFZvaWQoKTsKKyAgICAgICAgZnVuY3Rpb24gdGVzdEJvb2wodGhpbmc6IEJvb2xlYW4pOiBCb29sZWFuOwogICAgICAgICBmdW5jdGlvbiB0ZXN0U3RyaW5nKGNvbnN0IHRoaW5nOiBzdHJpbmcpOiBzdHJpbmc7CiAgICAgICAgIGZ1bmN0aW9uIHRlc3RCeXRlKHRoaW5nOiBTaG9ydEludCk6IFNob3J0SW50OwogICAgICAgICBmdW5jdGlvbiB0ZXN0STMyKHRoaW5nOiBJbnRlZ2VyKTogSW50ZWdlcjsKICAgICAgICAgZnVuY3Rpb24gdGVzdEk2NChjb25zdCB0aGluZzogSW50NjQpOiBJbnQ2NDsKICAgICAgICAgZnVuY3Rpb24gdGVzdERvdWJsZShjb25zdCB0aGluZzogRG91YmxlKTogRG91YmxlOworICAgICAgICBmdW5jdGlvbiB0ZXN0QmluYXJ5KGNvbnN0IHRoaW5nOiBUQnl0ZXMpOiBUQnl0ZXM7CiAgICAgICAgIGZ1bmN0aW9uIHRlc3RTdHJ1Y3QoY29uc3QgdGhpbmc6IElYdHJ1Y3QpOiBJWHRydWN0OwogICAgICAgICBmdW5jdGlvbiB0ZXN0TmVzdChjb25zdCB0aGluZzogSVh0cnVjdDIpOiBJWHRydWN0MjsKICAgICAgICAgZnVuY3Rpb24gdGVzdE1hcChjb25zdCB0aGluZzogSVRocmlmdERpY3Rpb25hcnk8SW50ZWdlciwgSW50ZWdlcj4pOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnRlZ2VyLCBJbnRlZ2VyPjsKQEAgLTczLDE3ICs4MSw0OCBAQAogICAgICAgICBmdW5jdGlvbiB0ZXN0TXVsdGlFeGNlcHRpb24oY29uc3QgYXJnMDogc3RyaW5nOyBjb25zdCBhcmcxOiBzdHJpbmcpOiBJWHRydWN0OwogICAgICAgICBwcm9jZWR1cmUgdGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDogSW50ZWdlcik7CiAKLSAgICAgICAgIHByb2NlZHVyZSB0ZXN0U3RvcDsKLQorICAgICAgICBwcm9jZWR1cmUgVGVzdFN0b3A7CiAgICAgICAgIHByb2NlZHVyZSBTZXRTZXJ2ZXIoIGNvbnN0IEFTZXJ2ZXIgOiBJU2VydmVyICk7CiAgICAgICBlbmQ7CiAKLSAgICAgIGNsYXNzIHByb2NlZHVyZSBMYXVuY2hBbm9uUGlwZUNoaWxkKCBjb25zdCBhcHAgOiBzdHJpbmc7IGNvbnN0IHRyYW5zcG9ydCA6IElQaXBlU2VydmVyKTsKKyAgICAgIGNsYXNzIHByb2NlZHVyZSBQcmludENtZExpbmVIZWxwOworICAgICAgY2xhc3MgcHJvY2VkdXJlIEludmFsaWRBcmdzOworCisgICAgICBjbGFzcyBwcm9jZWR1cmUgTGF1bmNoQW5vblBpcGVDaGlsZCggY29uc3QgYXBwIDogc3RyaW5nOyBjb25zdCB0cmFuc3BvcnQgOiBJQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydCk7CiAgICAgICBjbGFzcyBwcm9jZWR1cmUgRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKICAgZW5kOwogCiBpbXBsZW1lbnRhdGlvbgogCisKK3ZhciBnX0hhbmRsZXIgOiBUVGVzdFNlcnZlci5JVGVzdEhhbmRsZXIgPSBuaWw7CisKKworZnVuY3Rpb24gTXlDb25zb2xlRXZlbnRIYW5kbGVyKCBkd0N0cmxUeXBlIDogRFdPUkQpIDogQk9PTDsgIHN0ZGNhbGw7CisvLyBOb3RlIHRoYXQgdGhpcyBIYW5kbGVyIHByb2NlZHVyZSBpcyBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZAordmFyIGhhbmRsZXIgOiBUVGVzdFNlcnZlci5JVGVzdEhhbmRsZXI7CitiZWdpbgorICByZXN1bHQgOj0gVFJVRTsKKyAgdHJ5CisgICAgY2FzZSBkd0N0cmxUeXBlIG9mCisgICAgICBDVFJMX0NfRVZFTlQgICAgICAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnQ3RybCtDIHByZXNzZWQnKTsKKyAgICAgIENUUkxfQlJFQUtfRVZFTlQgICAgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdDdHJsK0JyZWFrIHByZXNzZWQnKTsKKyAgICAgIENUUkxfQ0xPU0VfRVZFTlQgICAgOiAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZWNlaXZlZCBDbG9zZVRhc2sgc2lnbmFsJyk7CisgICAgICBDVFJMX0xPR09GRl9FVkVOVCAgIDogIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgTG9nT2ZmIHNpZ25hbCcpOworICAgICAgQ1RSTF9TSFVURE9XTl9FVkVOVCA6ICBDb25zb2xlLldyaXRlTGluZSggJ1JlY2VpdmVkIFNodXRkb3duIHNpZ25hbCcpOworICAgIGVsc2UKKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCAnUmVjZWl2ZWQgY29uc29sZSBldmVudCAjJytJbnRUb1N0cihJbnRlZ2VyKGR3Q3RybFR5cGUpKSk7CisgICAgZW5kOworCisgICAgaGFuZGxlciA6PSBnX0hhbmRsZXI7CisgICAgaWYgaGFuZGxlciA8PiBuaWwgdGhlbiBoYW5kbGVyLlRlc3RTdG9wOworCisgIGV4Y2VwdAorICAgIC8vIGNhdGNoIGFsbAorICBlbmQ7CitlbmQ7CisKKwogeyBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsIH0KIAogcHJvY2VkdXJlIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwuU2V0U2VydmVyKCBjb25zdCBBU2VydmVyOiBJU2VydmVyKTsKQEAgLTEwMyw2ICsxNDIsMTIgQEAKICAgUmVzdWx0IDo9IHRoaW5nOwogZW5kOwogCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLnRlc3RCaW5hcnkoY29uc3QgdGhpbmc6IFRCeXRlcyk6IFRCeXRlczsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCInICsgQnl0ZXNUb0hleCggdGhpbmcgKSArICciKScpOworICBSZXN1bHQgOj0gdGhpbmc7CitlbmQ7CisKIGZ1bmN0aW9uIFRUZXN0U2VydmVyLlRUZXN0SGFuZGxlckltcGwudGVzdEVudW0odGhpbmc6IFROdW1iZXJ6KTogVE51bWJlcno7CiBiZWdpbgogICBDb25zb2xlLldyaXRlTGluZSgndGVzdEVudW0oJyArIEludFRvU3RyKCBJbnRlZ2VyKCB0aGluZykpICsgJyknKTsKQEAgLTExOSw3ICsxNjQsNyBAQAogCiAgIGlmIChhcmcgPSAnVEV4Y2VwdGlvbicpIHRoZW4KICAgYmVnaW4KLSAgICByYWlzZSBURXhjZXB0aW9uLkNyZWF0ZSgnJyk7CisgICAgcmFpc2UgVEV4Y2VwdGlvbi5DcmVhdGUoJ1RFeGNlcHRpb24nKTsKICAgZW5kOwogCiAgIC8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCkBAIC0xNDAsNDQgKzE4NSwzMyBAQAogZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0SW5zYW5pdHkoCiAgIGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OwogdmFyCi0gIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKLSAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKICAgaW5zYW5lIDogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKIAogYmVnaW4KLQogICBDb25zb2xlLldyaXRlTGluZSgndGVzdEluc2FuaXR5KCknKTsKLSAgaGVsbG8gOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBoZWxsby5TdHJpbmdfdGhpbmcgOj0gJ0hlbGxvMic7Ci0gIGhlbGxvLkJ5dGVfdGhpbmcgOj0gMjsKLSAgaGVsbG8uSTMyX3RoaW5nIDo9IDI7Ci0gIGhlbGxvLkk2NF90aGluZyA6PSAyOwogCi0gIGdvb2RieWUgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBnb29kYnllLlN0cmluZ190aGluZyA6PSAnR29vZGJ5ZTQnOwotICBnb29kYnllLkJ5dGVfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JMzJfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JNjRfdGhpbmcgOj0gNDsKLQotICBjcmF6eSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIEludDY0Pi5DcmVhdGU7Ci0gIGNyYXp5LlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRUlHSFQsIDgpOwotICBjcmF6eS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7Ci0gIGNyYXp5Llh0cnVjdHMuQWRkKGdvb2RieWUpOwotCi0gIGxvb25leSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5GSVZFLCA1KTsKLSAgY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQogCiAgIGZpcnN0X21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOwogICBzZWNvbmRfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CiAKLSAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgY3JhenkpOwotICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGNyYXp5KTsKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKIAorICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CiAgIHNlY29uZF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouU0lYLCBsb29uZXkpOwogCiAgIGluc2FuZSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+Pi5DcmVhdGU7CkBAIC0yODEsNyArMzE1LDcgQEAKICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKICAgaWYgKCBhcmcwID0gJ1hjZXB0aW9uJykgdGhlbgogICBiZWdpbgotICAgIHJhaXNlIFRYY2VwdGlvbi5DcmVhdGUoIDEwMDEsICdUaGlzIGlzIGFuIFhjZXB0aW9uJyk7ICAvLyB0ZXN0IHRoZSBuZXcgcmljaCBDVE9SIAorICAgIHJhaXNlIFRYY2VwdGlvbi5DcmVhdGUoIDEwMDEsICdUaGlzIGlzIGFuIFhjZXB0aW9uJyk7ICAvLyB0ZXN0IHRoZSBuZXcgcmljaCBDVE9SCiAgIGVuZCBlbHNlCiAgIGlmICggYXJnMCA9ICdYY2VwdGlvbjInKSB0aGVuCiAgIGJlZ2luCkBAIC0zNTEsNiArMzg1LDEyIEBACiAgIGVuZDsKIGVuZDsKIAorZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0Qm9vbCh0aGluZzogQm9vbGVhbik6IEJvb2xlYW47CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgndGVzdEJvb2woJyArIEJvb2xUb1N0cih0aGluZyx0cnVlKSArICcpJyk7CisgIFJlc3VsdCA6PSB0aGluZzsKK2VuZDsKKwogZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0U3RyaW5nKCBjb25zdCB0aGluZzogc3RyaW5nKTogc3RyaW5nOwogYmVnaW4KICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RzdHJpbmcoIicgKyB0aGluZyArICciKScpOwpAQCAtNDA1LDEzICs0NDUsNDEgQEAKIHsgVFRlc3RTZXJ2ZXIgfQogCiAKLWNsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5MYXVuY2hBbm9uUGlwZUNoaWxkKCBjb25zdCBhcHAgOiBzdHJpbmc7IGNvbnN0IHRyYW5zcG9ydCA6IElQaXBlU2VydmVyKTsKK2NsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5QcmludENtZExpbmVIZWxwOworY29uc3QgSEVMUFRFWFQgPSAnIFtvcHRpb25zXScjMTAKKyAgICAgICAgICAgICAgICsgIzEwCisgICAgICAgICAgICAgICArICdBbGxvd2VkIG9wdGlvbnM6JyMxMAorICAgICAgICAgICAgICAgKyAnICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2UnIzEwCisgICAgICAgICAgICAgICArICcgIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4nIzEwCisgICAgICAgICAgICAgICArICcgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCknIzEwCisgICAgICAgICAgICAgICArICcgIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCAic2ltcGxlIiwgInRocmVhZC1wb29sIiwnIzEwCisgICAgICAgICAgICAgICArICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciJyMxMAorICAgICAgICAgICAgICAgKyAnICAtLXRyYW5zcG9ydCBhcmcgKD1zb2NrZXQpICAgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBhbm9ucGlwZScjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIHByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24nIzEwCisgICAgICAgICAgICAgICArICcgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCcjMTAKKyAgICAgICAgICAgICAgICsgJyAgLS1wcm9jZXNzb3ItZXZlbnRzICAgICAgICAgIHByb2Nlc3Nvci1ldmVudHMnIzEwCisgICAgICAgICAgICAgICArICcgIC1uIFsgLS13b3JrZXJzIF0gYXJnICg9NCkgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yJyMxMAorICAgICAgICAgICAgICAgKyAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUnIzEwCisgICAgICAgICAgICAgICA7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggQ2hhbmdlRmlsZUV4dChFeHRyYWN0RmlsZU5hbWUoUGFyYW1TdHIoMCkpLCcnKSArIEhFTFBURVhUKTsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkludmFsaWRBcmdzOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIGFyZ3MuJyk7CisgIENvbnNvbGUuV3JpdGVMaW5lKCBDaGFuZ2VGaWxlRXh0KEV4dHJhY3RGaWxlTmFtZShQYXJhbVN0cigwKSksJycpICsgJyAtaCBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOworICBBYm9ydDsKK2VuZDsKKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkxhdW5jaEFub25QaXBlQ2hpbGQoIGNvbnN0IGFwcCA6IHN0cmluZzsgY29uc3QgdHJhbnNwb3J0IDogSUFub255bW91c1BpcGVTZXJ2ZXJUcmFuc3BvcnQpOwogLy9MYXVuY2ggY2hpbGQgcHJvY2VzcyBhbmQgcGFzcyBSL1cgYW5vbnltb3VzIHBpcGUgaGFuZGxlcyBvbiBjbWQgbGluZS4KIC8vVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGVsZXZhdGlvbiBvciBvdGhlcgogLy9hZHZhbmNlZCBmZWF0dXJlcy4KIHZhciBwaSA6IFBST0NFU1NfSU5GT1JNQVRJT047Ci0JCXNpIDogU1RBUlRVUElORk87Ci0JCXNBcmcsIHNIYW5kbGVzLCBzQ21kTGluZSA6IHN0cmluZzsKKyAgICAgICAgc2kgOiBTVEFSVFVQSU5GTzsKKyAgICAgICAgc0FyZywgc0hhbmRsZXMsIHNDbWRMaW5lIDogc3RyaW5nOwogICAgIGkgOiBJbnRlZ2VyOwogYmVnaW4KICAgR2V0U3RhcnR1cEluZm8oIHNpKTsgIC8vc2V0IHN0YXJ0dXBpbmZvIGZvciB0aGUgc3Bhd25lZCBwcm9jZXNzCkBAIC00NDIsODEgKzUxMCwxMjIgQEAKICAgV2luMzJDaGVjayggQ3JlYXRlUHJvY2VzcyggbmlsLCBQQ2hhcihzQ21kTGluZSksIG5pbCxuaWwsVFJVRSwwLG5pbCxuaWwsc2kscGkpKTsKIAogICBDbG9zZUhhbmRsZSggcGkuaFRocmVhZCk7Ci0JQ2xvc2VIYW5kbGUoIHBpLmhQcm9jZXNzKTsKKyAgICBDbG9zZUhhbmRsZSggcGkuaFByb2Nlc3MpOwogZW5kOwogCiAKIGNsYXNzIHByb2NlZHVyZSBUVGVzdFNlcnZlci5FeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOwogdmFyCi0gIFVzZUJ1ZmZlcmVkU29ja2V0cyA6IEJvb2xlYW47Ci0gIFVzZUZyYW1lZCA6IEJvb2xlYW47CiAgIFBvcnQgOiBJbnRlZ2VyOwotICBBbm9uUGlwZSA6IEJvb2xlYW47CisgIFNlcnZlckV2ZW50cyA6IEJvb2xlYW47CiAgIHNQaXBlTmFtZSA6IHN0cmluZzsKICAgdGVzdEhhbmRsZXIgOiBJVGVzdEhhbmRsZXI7CiAgIHRlc3RQcm9jZXNzb3IgOiBJUHJvY2Vzc29yOwogICBTZXJ2ZXJUcmFucyA6IElTZXJ2ZXJUcmFuc3BvcnQ7CiAgIFNlcnZlckVuZ2luZSA6IElTZXJ2ZXI7Ci0gIHBpcGVzZXJ2ZXIgOiBJUGlwZVNlcnZlcjsKKyAgYW5vbnltb3VzcGlwZSA6IElBbm9ueW1vdXNQaXBlU2VydmVyVHJhbnNwb3J0OworICBuYW1lZHBpcGUgOiBJTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0OwogICBUcmFuc3BvcnRGYWN0b3J5IDogSVRyYW5zcG9ydEZhY3Rvcnk7CiAgIFByb3RvY29sRmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7Ci0gIGkgOiBJbnRlZ2VyOworICBpLCBudW1Xb3JrZXIgOiBJbnRlZ2VyOwogICBzIDogc3RyaW5nOwotICBwcm90VHlwZSwgcCA6IFRLbm93blByb3RvY29sOworICBwcm90VHlwZSA6IFRLbm93blByb3RvY29sOworICBzZXJ2ZXJ0eXBlIDogVFNlcnZlclR5cGU7CisgIGVuZHBvaW50IDogVEVuZHBvaW50VHJhbnNwb3J0OworICBsYXllcmVkIDogVExheWVyZWRUcmFuc3BvcnRzOworICBVc2VTU0wgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCiBiZWdpbgogICB0cnkKLSAgICBVc2VCdWZmZXJlZFNvY2tldHMgOj0gRmFsc2U7Ci0gICAgVXNlRnJhbWVkIDo9IEZhbHNlOwotICAgIEFub25QaXBlIDo9IEZBTFNFOworICAgIFNlcnZlckV2ZW50cyA6PSBGQUxTRTsKICAgICBwcm90VHlwZSA6PSBwcm90X0JpbmFyeTsKKyAgICBzZXJ2ZXJ0eXBlIDo9IHNydl9TaW1wbGU7CisgICAgZW5kcG9pbnQgOj0gdHJuc19Tb2NrZXRzOworICAgIGxheWVyZWQgOj0gW107CisgICAgVXNlU1NMIDo9IEZBTFNFOwogICAgIFBvcnQgOj0gOTA5MDsKICAgICBzUGlwZU5hbWUgOj0gJyc7CisgICAgbnVtV29ya2VyIDo9IDQ7CiAKICAgICBpIDo9IDA7CiAgICAgd2hpbGUgKCBpIDwgTGVuZ3RoKGFyZ3MpICkgZG8gYmVnaW4KICAgICAgIHMgOj0gYXJnc1tpXTsKICAgICAgIEluYyhpKTsKIAotICAgICAgaWYgU3RyVG9JbnREZWYoIHMsIC0xKSA+IDAgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgUG9ydCA6PSAgU3RyVG9JbnREZWYoIHMsIFBvcnQpOworICAgICAgLy8gQWxsb3dlZCBvcHRpb25zOgorICAgICAgaWYgKHMgPSAnLWgnKSBvciAocyA9ICctLWhlbHAnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgICBQcmludENtZExpbmVIZWxwOworICAgICAgICBFeGl0OwogICAgICAgZW5kCi0gICAgICBlbHNlIGlmICggcyA9ICdyYXcnICkgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgLy8gYXMgZGVmYXVsdAorICAgICAgZWxzZSBpZiAocyA9ICctLXBvcnQnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcG9ydCBhcmcgKD05MDkwKSAgICAgICAgICBQb3J0IG51bWJlciB0byBsaXN0ZW4KKyAgICAgICAgcyA6PSBhcmdzW2ldOworICAgICAgICBJbmMoaSk7CisgICAgICAgIFBvcnQgOj0gU3RyVG9JbnREZWYoIHMsIFBvcnQpOwogICAgICAgZW5kCi0gICAgICBlbHNlIGlmICggcyA9ICdidWZmZXJlZCcgKSB0aGVuCi0gICAgICBiZWdpbgotICAgICAgICBVc2VCdWZmZXJlZFNvY2tldHMgOj0gVHJ1ZTsKKyAgICAgIGVsc2UgaWYgKHMgPSAnLS1kb21haW4tc29ja2V0JykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ2RvbWFpbi1zb2NrZXQgbm90IHN1cHBvcnRlZCcpOwogICAgICAgZW5kCi0gICAgICBlbHNlIGlmICggcyA9ICdmcmFtZWQnICkgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgVXNlRnJhbWVkIDo9IFRydWU7Ci0gICAgICBlbmQKLSAgICAgIGVsc2UgaWYgKHMgPSAnLXBpcGUnKSB0aGVuCi0gICAgICBiZWdpbgorICAgICAgZWxzZSBpZiAocyA9ICctLW5hbWVkLXBpcGUnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tbmFtZWQtcGlwZSBhcmcgICAgICAgICAgICBXaW5kb3dzIE5hbWVkIFBpcGUgKGUuZy4gTXlUaHJpZnRQaXBlKQorICAgICAgICBlbmRwb2ludCA6PSB0cm5zX05hbWVkUGlwZXM7CiAgICAgICAgIHNQaXBlTmFtZSA6PSBhcmdzW2ldOyAgLy8gLXBpcGUgPG5hbWU+CiAgICAgICAgIEluYyggaSApOwogICAgICAgZW5kCi0gICAgICBlbHNlIGlmIChzID0gJy1hbm9uJykgdGhlbgotICAgICAgYmVnaW4KLSAgICAgICAgQW5vblBpcGUgOj0gVFJVRTsKLSAgICAgIGVuZAotICAgICAgZWxzZSBpZiAocyA9ICctcHJvdCcpIHRoZW4gIC8vIC1wcm90IEpTT058YmluYXJ5Ci0gICAgICBiZWdpbgorICAgICAgZWxzZSBpZiAocyA9ICctLXNlcnZlci10eXBlJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsCisgICAgICAgIC8vIGFyZyA9ICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLCAidGhyZWFkZWQiLCBvciAibm9uYmxvY2tpbmciCiAgICAgICAgIHMgOj0gYXJnc1tpXTsKLSAgICAgICAgSW5jKCBpICk7Ci0gICAgICAgIGZvciBwOj0gTG93KFRLbm93blByb3RvY29sKSB0byBIaWdoKFRLbm93blByb3RvY29sKSBkbyBiZWdpbgotICAgICAgICAgIGlmIFNhbWVUZXh0KCBzLCBLTk9XTl9QUk9UT0NPTFNbcF0pIHRoZW4gYmVnaW4KLSAgICAgICAgICAgIHByb3RUeXBlIDo9IHA7Ci0gICAgICAgICAgICBCcmVhazsKLSAgICAgICAgICBlbmQ7Ci0gICAgICAgIGVuZDsKLSAgICAgIGVuZCBlbHNlCi0gICAgICBiZWdpbgotICAgICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIG9sZGVyIGJvb2xlYW4gc3ludGF4Ci0gICAgICAgIFVzZUJ1ZmZlcmVkU29ja2V0cyA6PSBTdHJUb0Jvb2xEZWYoIGFyZ3NbMV0sIFVzZUJ1ZmZlcmVkU29ja2V0cyk7CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnc2ltcGxlJyAgICAgIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfU2ltcGxlCisgICAgICAgIGVsc2UgaWYgcyA9ICd0aHJlYWQtcG9vbCcgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9UaHJlYWRwb29sCisgICAgICAgIGVsc2UgaWYgcyA9ICd0aHJlYWRlZCcgICAgdGhlbiBzZXJ2ZXJ0eXBlIDo9IHNydl9UaHJlYWRlZAorICAgICAgICBlbHNlIGlmIHMgPSAnbm9uYmxvY2tpbmcnIHRoZW4gc2VydmVydHlwZSA6PSBzcnZfTm9uYmxvY2tpbmcKKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKICAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXRyYW5zcG9ydCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cAorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIEluYyhpKTsKKworICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfRnJhbWVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19IdHRwCisgICAgICAgIGVsc2UgaWYgcyA9ICdhbm9ucGlwZScgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlcworICAgICAgICBlbHNlIEludmFsaWRBcmdzOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcHJvdG9jb2wnKSB0aGVuIGJlZ2luCisgICAgICAgIC8vIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uCisgICAgICAgIHMgOj0gYXJnc1tpXTsKKyAgICAgICAgSW5jKGkpOworCisgICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0JpbmFyeQorICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0CisgICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgZWxzZSBJbnZhbGlkQXJnczsKKyAgICAgIGVuZAorICAgICAgZWxzZSBpZiAocyA9ICctLXNzbCcpIHRoZW4gYmVnaW4KKyAgICAgICAgLy8gLS1zc2wgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAgIFVzZVNTTCA6PSBUUlVFOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy0tcHJvY2Vzc29yLWV2ZW50cycpIHRoZW4gYmVnaW4KKyAgICAgICAgIC8vIC0tcHJvY2Vzc29yLWV2ZW50cyAgICAgICAgICBwcm9jZXNzb3ItZXZlbnRzCisgICAgICAgIFNlcnZlckV2ZW50cyA6PSBUUlVFOworICAgICAgZW5kCisgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS13b3JrZXJzJykgdGhlbiBiZWdpbgorICAgICAgICAvLyAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLgorICAgICAgICAvLyBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZQorICAgICAgICBzIDo9IGFyZ3NbaV07CisgICAgICAgIG51bVdvcmtlciA6PSBTdHJUb0ludERlZihzLDApOworICAgICAgICBpZiBudW1Xb3JrZXIgPiAwCisgICAgICAgIHRoZW4gSW5jKGkpCisgICAgICAgIGVsc2UgbnVtV29ya2VyIDo9IDQ7CisgICAgICBlbmQKKyAgICAgIGVsc2UgYmVnaW4KKyAgICAgICAgSW52YWxpZEFyZ3M7CisgICAgICBlbmQ7CiAgICAgZW5kOwogCiAKQEAgLTUyNCwzNCArNjMzLDQ5IEBACiAKICAgICAvLyBjcmVhdGUgcHJvdG9jb2wgZmFjdG9yeSwgZGVmYXVsdCB0byBCaW5hcnlQcm90b2NvbAogICAgIGNhc2UgcHJvdFR5cGUgb2YKLSAgICAgIHByb3RfQmluYXJ5OiAgUHJvdG9jb2xGYWN0b3J5IDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOwotICAgICAgcHJvdF9KU09OICA6ICBQcm90b2NvbEZhY3RvcnkgOj0gVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICAgICAgcHJvdF9CaW5hcnkgIDogIFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZSggQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICAgIHByb3RfSlNPTiAgICA6ICBQcm90b2NvbEZhY3RvcnkgOj0gVEpTT05Qcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlOworICAgICAgcHJvdF9Db21wYWN0IDogIFByb3RvY29sRmFjdG9yeSA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5URmFjdG9yeS5DcmVhdGU7CiAgICAgZWxzZQotICAgICAgQVNTRVJUKCBGQUxTRSk7ICAvLyB1bmhhbmRsZWQgY2FzZSEKLSAgICAgIFByb3RvY29sRmFjdG9yeSA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLlRGYWN0b3J5LkNyZWF0ZTsKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBwcm90b2NvbCcpOwogICAgIGVuZDsKICAgICBBU1NFUlQoIFByb3RvY29sRmFjdG9yeSA8PiBuaWwpOwotICAgIENvbnNvbGUuV3JpdGVMaW5lKCctICcrS05PV05fUFJPVE9DT0xTW3Byb3RUeXBlXSsnIHByb3RvY29sJyk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gJytUSFJJRlRfUFJPVE9DT0xTW3Byb3RUeXBlXSsnIHByb3RvY29sJyk7CiAKKyAgICBjYXNlIGVuZHBvaW50IG9mCiAKLSAgICBpZiBzUGlwZU5hbWUgPD4gJycgdGhlbiBiZWdpbgotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gbmFtZWQgcGlwZSAoJytzUGlwZU5hbWUrJyknKTsKLSAgICAgIHBpcGVzZXJ2ZXIgIDo9IFRTZXJ2ZXJQaXBlSW1wbC5DcmVhdGUoIHNQaXBlTmFtZSk7Ci0gICAgICBzZXJ2ZXJ0cmFucyA6PSBwaXBlc2VydmVyOwotICAgIGVuZAotICAgIGVsc2UgaWYgQW5vblBpcGUgdGhlbiBiZWdpbgotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gYW5vbnltb3VzIHBpcGVzJyk7Ci0gICAgICBwaXBlc2VydmVyICA6PSBUU2VydmVyUGlwZUltcGwuQ3JlYXRlOwotICAgICAgc2VydmVydHJhbnMgOj0gcGlwZXNlcnZlcjsKLSAgICBlbmQKLSAgICBlbHNlIGJlZ2luCi0gICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBzb2NrZXRzIChwb3J0ICcrSW50VG9TdHIocG9ydCkrJyknKTsKLSAgICAgIGlmIFVzZUJ1ZmZlcmVkU29ja2V0cyB0aGVuIENvbnNvbGUuV3JpdGVMaW5lKCctIGJ1ZmZlcmVkIHNvY2tldHMnKTsKLSAgICAgIHNlcnZlcnRyYW5zIDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggUG9ydCwgMCwgVXNlQnVmZmVyZWRTb2NrZXRzKTsKKyAgICAgIHRybnNfU29ja2V0cyA6IGJlZ2luCisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIHNvY2tldHMgKHBvcnQgJytJbnRUb1N0cihwb3J0KSsnKScpOworICAgICAgICBpZiAodHJuc19CdWZmZXJlZCBpbiBsYXllcmVkKSB0aGVuIENvbnNvbGUuV3JpdGVMaW5lKCctIGJ1ZmZlcmVkJyk7CisgICAgICAgIHNlcnZlcnRyYW5zIDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggUG9ydCwgMCwgKHRybnNfQnVmZmVyZWQgaW4gbGF5ZXJlZCkpOworICAgICAgZW5kOworCisgICAgICB0cm5zX0h0dHAgOiBiZWdpbgorICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKEVORFBPSU5UX1RSQU5TUE9SVFNbZW5kcG9pbnRdKycgc2VydmVyIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKKyAgICAgIGVuZDsKKworICAgICAgdHJuc19OYW1lZFBpcGVzIDogYmVnaW4KKyAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJy0gbmFtZWQgcGlwZSAoJytzUGlwZU5hbWUrJyknKTsKKyAgICAgICAgbmFtZWRwaXBlICAgOj0gVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzUGlwZU5hbWUsIDQwOTYsIFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUyk7CisgICAgICAgIHNlcnZlcnRyYW5zIDo9IG5hbWVkcGlwZTsKKyAgICAgIGVuZDsKKworICAgICAgdHJuc19Bbm9uUGlwZXMgOiBiZWdpbgorICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBhbm9ueW1vdXMgcGlwZXMnKTsKKyAgICAgICAgYW5vbnltb3VzcGlwZSA6PSBUQW5vbnltb3VzUGlwZVNlcnZlclRyYW5zcG9ydEltcGwuQ3JlYXRlOworICAgICAgICBzZXJ2ZXJ0cmFucyAgIDo9IGFub255bW91c3BpcGU7CisgICAgICBlbmQKKworICAgIGVsc2UKKyAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKICAgICBlbmQ7CiAgICAgQVNTRVJUKCBzZXJ2ZXJ0cmFucyA8PiBuaWwpOwogCi0gICAgaWYgVXNlRnJhbWVkIHRoZW4gYmVnaW4KKyAgICBpZiBVc2VTU0wgdGhlbiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnU1NMIG5vdCBpbXBsZW1lbnRlZCcpOworICAgIGVuZDsKKworICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBsYXllcmVkKSB0aGVuIGJlZ2luCiAgICAgICBDb25zb2xlLldyaXRlTGluZSgnLSBmcmFtZWQgdHJhbnNwb3J0Jyk7CiAgICAgICBUcmFuc3BvcnRGYWN0b3J5IDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLlRGYWN0b3J5LkNyZWF0ZQogICAgIGVuZApAQCAtNTYzLDMwICs2ODcsNTkgQEAKICAgICB0ZXN0SGFuZGxlciAgIDo9IFRUZXN0SGFuZGxlckltcGwuQ3JlYXRlOwogICAgIHRlc3RQcm9jZXNzb3IgOj0gVFRocmlmdFRlc3QuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCB0ZXN0SGFuZGxlciApOwogCi0gICAgU2VydmVyRW5naW5lIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCB0ZXN0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyVHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xGYWN0b3J5KTsKKyAgICBjYXNlIHNlcnZlcnR5cGUgb2YKKyAgICAgIHNydl9TaW1wbGUgICAgICA6IGJlZ2luCisgICAgICAgIFNlcnZlckVuZ2luZSA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggdGVzdFByb2Nlc3NvciwgU2VydmVyVHJhbnMsIFRyYW5zcG9ydEZhY3RvcnksIFByb3RvY29sRmFjdG9yeSk7CisgICAgICBlbmQ7CisKKyAgICAgIHNydl9Ob25ibG9ja2luZyA6IGJlZ2luCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoU0VSVkVSX1RZUEVTW3NlcnZlcnR5cGVdKycgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgZW5kOworCisgICAgICBzcnZfVGhyZWFkcG9vbCwKKyAgICAgIHNydl9UaHJlYWRlZDogYmVnaW4KKyAgICAgICAgaWYgbnVtV29ya2VyID4gMSB0aGVuIHt1c2UgaGVyZX07CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoU0VSVkVSX1RZUEVTW3NlcnZlcnR5cGVdKycgc2VydmVyIG5vdCBpbXBsZW1lbnRlZCcpOworICAgICAgZW5kOworCisgICAgZWxzZQorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHNlcnZlciB0eXBlJyk7CisgICAgZW5kOworICAgIEFTU0VSVCggU2VydmVyRW5naW5lIDw+IG5pbCk7CiAKICAgICB0ZXN0SGFuZGxlci5TZXRTZXJ2ZXIoIFNlcnZlckVuZ2luZSk7CiAKLSAgICAvLyBzdGFydCB0aGUgY2xpZW50IG5vdyB3aGVuIHdlIGhhdmUgdGhlIGFub24gaGFuZGxlcywgYnV0IGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cwotICAgIGlmIEFub25QaXBlCi0gICAgdGhlbiBMYXVuY2hBbm9uUGlwZUNoaWxkKCBFeHRyYWN0RmlsZVBhdGgoUGFyYW1TdHIoMCkpKydjbGllbnQuZXhlJywgcGlwZXNlcnZlcik7CisgICAgLy8gdGVzdCBldmVudHM/CisgICAgaWYgU2VydmVyRXZlbnRzIHRoZW4gYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCctIHNlcnZlciBldmVudHMgdGVzdCBlbmFibGVkJyk7CisgICAgICBTZXJ2ZXJFbmdpbmUuU2VydmVyRXZlbnRzIDo9IFRTZXJ2ZXJFdmVudHNJbXBsLkNyZWF0ZTsKKyAgICBlbmQ7CiAKKyAgICAvLyBzdGFydCB0aGUgY2xpZW50IG5vdyB3aGVuIHdlIGhhdmUgdGhlIGFub24gaGFuZGxlcywgYnV0IGJlZm9yZSB0aGUgc2VydmVyIHN0YXJ0cworICAgIGlmIGVuZHBvaW50ID0gdHJuc19Bbm9uUGlwZXMKKyAgICB0aGVuIExhdW5jaEFub25QaXBlQ2hpbGQoIEV4dHJhY3RGaWxlUGF0aChQYXJhbVN0cigwKSkrJ2NsaWVudC5leGUnLCBhbm9ueW1vdXNwaXBlKTsKKworICAgIC8vIGluc3RhbGwgQ3RybCtDIGhhbmRsZXIgYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzCisgICAgZ19IYW5kbGVyIDo9IHRlc3RIYW5kbGVyOworICAgIFNldENvbnNvbGVDdHJsSGFuZGxlciggQE15Q29uc29sZUV2ZW50SGFuZGxlciwgVFJVRSk7CiAKICAgICBDb25zb2xlLldyaXRlTGluZSgnJyk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uJyk7Ci0gICAgc2VydmVyRW5naW5lLlNlcnZlOworICAgIHJlcGVhdAorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uJyk7CisgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmU7CisgICAgdW50aWwgeyRJRkRFRiBSdW5FbmRsZXNzfSBGQUxTRSB7JEVMU0V9IFRSVUUgeyRFTkRJRn07CisKICAgICB0ZXN0SGFuZGxlci5TZXRTZXJ2ZXIoIG5pbCk7CisgICAgZ19IYW5kbGVyIDo9IG5pbDsKIAogICBleGNlcHQKLSAgICBvbiBFOiBFeGNlcHRpb24gZG8KLSAgICBiZWdpbgotICAgICAgQ29uc29sZS5Xcml0ZSggRS5NZXNzYWdlKTsKKyAgICBvbiBFOiBFQWJvcnQgZG8gcmFpc2U7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSggRS5NZXNzYWdlICsgIzEwICsgRS5TdGFja1RyYWNlICk7CiAgICAgZW5kOwogICBlbmQ7CiAgIENvbnNvbGUuV3JpdGVMaW5lKCAnZG9uZS4nKTsKIGVuZDsKIAorCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwOGNkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwpAQCAtMCwwICsxLDE3NCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IFRlc3RTZXJ2ZXJFdmVudHM7CisKK2ludGVyZmFjZQorCit1c2VzCisgIFN5c1V0aWxzLAorICBUaHJpZnQsCisgIFRocmlmdC5Qcm90b2NvbCwKKyAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgVGhyaWZ0LlNlcnZlciwKKyAgQ29uc29sZUhlbHBlcjsKKwordHlwZQorICBUUmVxdWVzdEV2ZW50c0ltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElSZXF1ZXN0RXZlbnRzKQorICBwcm90ZWN0ZWQKKyAgICBGU3RhcnQgOiBURGF0ZVRpbWU7CisgICAgLy8gSVJlcXVlc3RQcm9jZXNzaW5nRXZlbnRzCisgICAgcHJvY2VkdXJlIFByZVJlYWQ7CisgICAgcHJvY2VkdXJlIFBvc3RSZWFkOworICAgIHByb2NlZHVyZSBQcmVXcml0ZTsKKyAgICBwcm9jZWR1cmUgUG9zdFdyaXRlOworICAgIHByb2NlZHVyZSBPbmV3YXlDb21wbGV0ZTsKKyAgICBwcm9jZWR1cmUgVW5oYW5kbGVkRXJyb3IoIGNvbnN0IGUgOiBFeGNlcHRpb24pOworICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKKworICBUUHJvY2Vzc29yRXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVByb2Nlc3NvckV2ZW50cykKKyAgcHJvdGVjdGVkCisgICAgRlJlcXMgOiBJbnRlZ2VyOworICAgIC8vIElQcm9jZXNzb3JFdmVudHMKKyAgICBwcm9jZWR1cmUgUHJvY2Vzc2luZyggY29uc3QgdHJhbnNwb3J0IDogSVRyYW5zcG9ydCk7CisgICAgZnVuY3Rpb24gIENyZWF0ZVJlcXVlc3RDb250ZXh0KCBjb25zdCBhRnVuY3Rpb25OYW1lIDogc3RyaW5nKSA6IElSZXF1ZXN0RXZlbnRzOworICAgIHByb2NlZHVyZSBDbGVhbnVwQ29udGV4dDsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlOworICBlbmQ7CisKKworICBUU2VydmVyRXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVNlcnZlckV2ZW50cykKKyAgcHJvdGVjdGVkCisgICAgLy8gSVNlcnZlckV2ZW50cworICAgIHByb2NlZHVyZSBQcmVTZXJ2ZTsKKyAgICBwcm9jZWR1cmUgUHJlQWNjZXB0OworICAgIGZ1bmN0aW9uICBDcmVhdGVQcm9jZXNzaW5nQ29udGV4dCggY29uc3QgaW5wdXQsIG91dHB1dCA6IElQcm90b2NvbCkgOiBJUHJvY2Vzc29yRXZlbnRzOworICBlbmQ7CisKKworaW1wbGVtZW50YXRpb24KKworeyBUU2VydmVyRXZlbnRzSW1wbCB9CisKK3Byb2NlZHVyZSBUU2VydmVyRXZlbnRzSW1wbC5QcmVTZXJ2ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdTZXJ2ZXJFdmVudHM6IFNlcnZlciBzdGFydGluZyB0byBzZXJ2ZSByZXF1ZXN0cycpOworZW5kOworCisKK3Byb2NlZHVyZSBUU2VydmVyRXZlbnRzSW1wbC5QcmVBY2NlcHQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnU2VydmVyRXZlbnRzOiBTZXJ2ZXIgdHJhbnNwb3J0IGlzIHJlYWR5IHRvIGFjY2VwdCBpbmNvbWluZyBjYWxscycpOworZW5kOworCisKK2Z1bmN0aW9uIFRTZXJ2ZXJFdmVudHNJbXBsLkNyZWF0ZVByb2Nlc3NpbmdDb250ZXh0KGNvbnN0IGlucHV0LCBvdXRwdXQ6IElQcm90b2NvbCk6IElQcm9jZXNzb3JFdmVudHM7CitiZWdpbgorICByZXN1bHQgOj0gVFByb2Nlc3NvckV2ZW50c0ltcGwuQ3JlYXRlOworZW5kOworCisKK3sgVFByb2Nlc3NvckV2ZW50c0ltcGwgfQorCitjb25zdHJ1Y3RvciBUUHJvY2Vzc29yRXZlbnRzSW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGUmVxcyA6PSAwOworICBDb25zb2xlLldyaXRlTGluZSgnUHJvY2Vzc29yRXZlbnRzOiBDbGllbnQgY29ubmVjdGVkLCBwcm9jZXNzaW5nIGJlZ2lucycpOworZW5kOworCitwcm9jZWR1cmUgVFByb2Nlc3NvckV2ZW50c0ltcGwuUHJvY2Vzc2luZyhjb25zdCB0cmFuc3BvcnQ6IElUcmFuc3BvcnQpOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1Byb2Nlc3NvckV2ZW50czogUHJvY2Vzc2luZyBvZiBpbmNvbWluZyByZXF1ZXN0IGJlZ2lucycpOworZW5kOworCisKK2Z1bmN0aW9uIFRQcm9jZXNzb3JFdmVudHNJbXBsLkNyZWF0ZVJlcXVlc3RDb250ZXh0KCBjb25zdCBhRnVuY3Rpb25OYW1lOiBzdHJpbmcpOiBJUmVxdWVzdEV2ZW50czsKK2JlZ2luCisgIHJlc3VsdCA6PSBUUmVxdWVzdEV2ZW50c0ltcGwuQ3JlYXRlOworICBJbmMoIEZSZXFzKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFByb2Nlc3NvckV2ZW50c0ltcGwuQ2xlYW51cENvbnRleHQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSggJ1Byb2Nlc3NvckV2ZW50czogY29tcGxldGVkIGFmdGVyIGhhbmRsaW5nICcrSW50VG9TdHIoRlJlcXMpKycgcmVxdWVzdHMuJyk7CitlbmQ7CisKKworeyBUUmVxdWVzdEV2ZW50c0ltcGwgfQorCisKK2NvbnN0cnVjdG9yIFRSZXF1ZXN0RXZlbnRzSW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGU3RhcnQgOj0gTm93OworICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogTmV3IHJlcXVlc3QnKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLlByZVJlYWQ7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogUmVhZGluZyByZXF1ZXN0IG1lc3NhZ2UgLi4uJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5Qb3N0UmVhZDsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBSZWFkaW5nIHJlcXVlc3QgbWVzc2FnZSBjb21wbGV0ZWQnKTsKK2VuZDsKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5QcmVXcml0ZTsKK2JlZ2luCisgIENvbnNvbGUuV3JpdGVMaW5lKCdSZXF1ZXN0RXZlbnRzOiBXcml0aW5nIHJlc3BvbnNlIG1lc3NhZ2UgLi4uJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5Qb3N0V3JpdGU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogV3JpdGluZyByZXNwb25zZSBtZXNzYWdlIGNvbXBsZXRlZCcpOworZW5kOworCisKK3Byb2NlZHVyZSBUUmVxdWVzdEV2ZW50c0ltcGwuT25ld2F5Q29tcGxldGU7CitiZWdpbgorICBDb25zb2xlLldyaXRlTGluZSgnUmVxdWVzdEV2ZW50czogT25ld2F5IG1lc3NhZ2UgcHJvY2Vzc2VkJyk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRSZXF1ZXN0RXZlbnRzSW1wbC5VbmhhbmRsZWRFcnJvcihjb25zdCBlOiBFeGNlcHRpb24pOworYmVnaW4KKyAgQ29uc29sZS5Xcml0ZUxpbmUoJ1JlcXVlc3RFdmVudHM6IFVuaGFuZGxlZCBleGNlcHRpb24gb2YgdHlwZSAnK2UuY2xhc3NuYW1lKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFJlcXVlc3RFdmVudHNJbXBsLkNsZWFudXBDb250ZXh0OwordmFyIG1pbGxpcyA6IERvdWJsZTsKK2JlZ2luCisgIG1pbGxpcyA6PSAoTm93IC0gRlN0YXJ0KSAqICgyNCo2MCo2MCoxMDAwKTsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdSZXF1ZXN0IHByb2Nlc3NpbmcgY29tcGxldGVkIGluICcrSW50VG9TdHIoUm91bmQobWlsbGlzKSkrJyBtcycpOworZW5kOworCisKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKaW5kZXggMjA5ZTI5ZC4uMDZkYmQzZCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NsaWVudC5kcHIKQEAgLTI4LDEzICsyOCwxNyBAQAogICBUaHJpZnQuVGVzdCwgLy8gaW4gJ2dlbi1kZWxwaGlcVGhyaWZ0LlRlc3QucGFzJywKICAgVGhyaWZ0IGluICcuLlxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0IGluICcuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CiAKIHZhcgpAQCAtNDIsMjQgKzQ2LDI2IEBACiAgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CiAgIGkgOiBJbnRlZ2VyOwogICBhcmcgOiBzdHJpbmc7Ci0gIHMgOiBzdHJpbmc7CiAKIGJlZ2luCiAgIHRyeQogICAgIFdyaXRlbG4oICdEZWxwaGkgVGVzdENsaWVudCAnK1RocmlmdC5WZXJzaW9uKTsKICAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OwogICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOwotICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8KLSAgICBiZWdpbgorICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8gYmVnaW4KICAgICAgIGFyZyA6PSBQYXJhbVN0ciggaSApOwogICAgICAgYXJnc1tpLTFdIDo9IGFyZzsKICAgICBlbmQ7Ci0gICAgVFRlc3RDbGllbnQuRXhlY3V0ZSggYXJncyApOwotICAgIFJlYWRsbjsKKworICAgIEV4aXRDb2RlIDo9IFRUZXN0Q2xpZW50LkV4ZWN1dGUoIGFyZ3MpOworCiAgIGV4Y2VwdAorICAgIG9uIEU6IEVBYm9ydCBkbyBiZWdpbgorICAgICAgRXhpdENvZGUgOj0gJEZGOworICAgIGVuZDsKICAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KICAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7Ci0gICAgICBFeGl0Q29kZSA6PSAkRkZGRjsKKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1JFQURNRS5tZCBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE0NTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjggQEAKK0hvdyB0byB1c2UgdGhlIHRlc3QgY2FzZToKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0gY29weSBhbmQgdGhlIHRlbXBsYXRlIGJhdGNoIGZpbGUKKy0gb3BlbiB0aGUgYmF0Y2ggZmlsZSBhbmQgYWRqdXN0IGNvbmZpZ3VyYXRpb24gYXMgbmVjZXNzYXJ5CistIHJ1biB0aGUgYmF0Y2gKKworCitDb25maWd1cmF0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU1ZOV09SS0RJUgorc2hvdWxkIHBvaW50IHRvIHRoZSBUaHJpZnQgd29ya2luZyBjb3B5IHJvb3QKKworTVlfVEhSSUZUX0ZJTEVTCitjYW4gYmUgc2V0IHRvIHBvaW50IHRvIGEgZm9sZGVyIHdpdGggbW9yZSB0aHJpZnQgSURMIGZpbGVzLgorSWYgeW91IGRvbid0IGhhdmUgYW55IHN1Y2ggZmlsZXMsIGp1c3QgbGVhdmUgdGhlIHNldHRpbmcgYmxhbmsuCisKK0JJTgorTG9jYWwgTVNZUyBiaW5hcnkgZm9sZGVyLiBZb3VyIFRIUklGVC5FWEUgaXMgaW5zdGFsbGVkIGhlcmUuCisKK01JTkdXX0JJTgorTG9jYWwgTWluR1cgYmluIGZvbGRlci4gQ29udGFpbnMgRExMIGZpbGVzIHJlcXVpcmVkIGJ5IFRIUklGVC5FWEUKKworRENDCitJZGVudGlmaWVzIHRoZSBEZWxwaGkgQ29tbWFuZCBMaW5lIGNvbXBpbGVyIChkY2MzMi5leGUpCitUbyBiZSBjb25maWd1aXJlZCBvbmx5LCBpZiB0aGUgZGVmYXVsdCBpcyBub3Qgc3VpdGFibGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKypFT0YqClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLnR4dCBiL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNDQ3YTEuLjAwMDAwMDAKLS0tIGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLUhvdyB0byB1c2UgdGhlIHRlc3QgY2FzZToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gY29weSBhbmQgdGhlIHRlbXBsYXRlIGJhdGNoIGZpbGUgCi0tIG9wZW4gdGhlIGJhdGNoIGZpbGUgYW5kIGFkanVzdCBjb25maWd1cmF0aW9uIGFzIG5lY2Vzc2FyeQotLSBydW4gdGhlIGJhdGNoCi0KLQotQ29uZmlndXJhdGlvbjoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNWTldPUktESVIgCi1zaG91bGQgcG9pbnQgdG8gdGhlIFRocmlmdCB3b3JraW5nIGNvcHkgcm9vdAotCi1NWV9USFJJRlRfRklMRVMgCi1jYW4gYmUgc2V0IHRvIHBvaW50IHRvIGEgZm9sZGVyIHdpdGggbW9yZSB0aHJpZnQgSURMIGZpbGVzLiAKLUlmIHlvdSBkb24ndCBoYXZlIGFueSBzdWNoIGZpbGVzLCBqdXN0IGxlYXZlIHRoZSBzZXR0aW5nIGJsYW5rLgotCi1CSU4KLUxvY2FsIE1TWVMgYmluYXJ5IGZvbGRlci4gWW91ciBUSFJJRlQuRVhFIGlzIGluc3RhbGxlZCBoZXJlLgotCi1NSU5HV19CSU4KLUxvY2FsIE1pbkdXIGJpbiBmb2xkZXIuIENvbnRhaW5zIERMTCBmaWxlcyByZXF1aXJlZCBieSBUSFJJRlQuRVhFCi0KLURDQwotSWRlbnRpZmllcyB0aGUgRGVscGhpIENvbW1hbmQgTGluZSBjb21waWxlciAoZGNjMzIuZXhlKQotVG8gYmUgY29uZmlndWlyZWQgb25seSwgaWYgdGhlIGRlZmF1bHQgaXMgbm90IHN1aXRhYmxlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qRU9GKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL1Jlc2VydmVkS2V5d29yZHMudGhyaWZ0IGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzE4MzYuLjAwMDAwMDAKLS0tIGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMgCi0KLQotCi10eXBlZGVmIGkzMiBDYXJkaW5hbAotdHlwZWRlZiBzdHJpbmcgbWVzc2FnZQotdHlwZWRlZiBsaXN0PCBtYXA8IENhcmRpbmFsLCBtZXNzYWdlPj4gcHJvZ3JhbQotCi1zdHJ1Y3QgdW5pdCB7Ci0gIDE6IENhcmRpbmFsIGRvd250bzsKLSAgMjogcHJvZ3JhbSBwcm9jZWR1cmU7Ci19Ci0KLXR5cGVkZWYgc2V0PCB1bml0PiB1bml0cwotCi1leGNlcHRpb24gZXhjZXB0aW9uMSB7Ci0gIDE6IHByb2dyYW0gbWVzc2FnZTsKLSAgMjogdW5pdCBhcnJheTsKLX0KLQotc2VydmljZSBjb25zdHJ1Y3RvciB7Ci0gIHVuaXQgQ3JlYXRlKDE6IENhcmRpbmFsIGFzbTsgMjogbWVzc2FnZSBpbmhlcml0ZWQpIHRocm93cyAoMTogZXhjZXB0aW9uMSBsYWJlbCk7Ci0gIHVuaXRzIERlc3Ryb3koKTsKLX0KLQotY29uc3QgQ2FyZGluYWwgZG93bnRvID0gKzEKLWNvbnN0IENhcmRpbmFsIHB1Ymxpc2hlZCA9IC0xCi0KLWVudW0ga2V5d29yZHMgewotICByZWNvcmQgPSAxLAotICByZXBlYXQgPSAyLAotICBkZXByZWNhdGVkID0gMwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vcnVuLVBhc2NhbC1Db2RlZ2VuLVRlc3RzLmJhdC50bXBsIGIvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vcnVuLVBhc2NhbC1Db2RlZ2VuLVRlc3RzLmJhdC50bXBsCmluZGV4IDhkMjVlYWUuLmRiYWIwYWUgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9jb2RlZ2VuL3J1bi1QYXNjYWwtQ29kZWdlbi1UZXN0cy5iYXQudG1wbAorKysgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9ydW4tUGFzY2FsLUNvZGVnZW4tVGVzdHMuYmF0LnRtcGwKQEAgLTEsMyArMSwyMSBAQAorUkVNIC8qCitSRU0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitSRU0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorUkVNICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK1JFTSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorUkVNICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorUkVNICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorUkVNICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CitSRU0gKgorUkVNICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTSAqCitSRU0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitSRU0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorUkVNICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitSRU0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorUkVNICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworUkVNICogdW5kZXIgdGhlIExpY2Vuc2UuCitSRU0gKi8KIEBlY2hvIG9mZgogaWYgIiI9PSIlMSIgZ290byBDT05GSUcKIGdvdG8gSEFORExFRElSCkBAIC00NCw3ICs2Miw3IEBACiByZW0gKiBjcmVhdGUgYW5kL29yIGVtcHR5IHRhcmdldCBkaXJzCiBpZiBub3QgZXhpc3QgIiVUQVJHRVQlIiAgICAgICAgICAgbWQgIiVUQVJHRVQlIgogaWYgbm90IGV4aXN0ICIlVEFSR0VUJVwlU1VCRElSJSIgIG1kICIlVEFSR0VUJVwlU1VCRElSJSIKLWlmIG5vdCBleGlzdCAiJU9VVERDVSUiIAkgICAgICBtZCAiJU9VVERDVSUiCitpZiBub3QgZXhpc3QgIiVPVVREQ1UlIiAgICAgICAgICAgbWQgIiVPVVREQ1UlIgogaWYgZXhpc3QgIiVUQVJHRVQlXCoudGhyaWZ0IiAgICAgIGRlbCAiJVRBUkdFVCVcKi50aHJpZnQiICAgICAgIC9RCiBpZiBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiVcKi4qIiAgZGVsICIlVEFSR0VUJVwlU1VCRElSJVwqLioiICAgL1EKIGlmIGV4aXN0ICIlT1VURENVJVwqLioiICAgICAgICAgICBkZWwgIiVPVVREQ1UlXCouKiIgICAgICAgICAgICAvUQpAQCAtNTgsNyArNzYsNyBAQAogZWNoby4KIGVjaG8gR2VuZXJhdGluZyBjb2RlLCBwbGVhc2Ugd2FpdCAuLi4KIGNkICIlVEFSR0VUJSIKLWZvciAlJWEgaW4gKCoudGhyaWZ0KSBkbyAiJUJJTiVcdGhyaWZ0LmV4ZSIgLXYgLS1nZW4gZGVscGhpOmFuc2lzdHJfYmluYXJ5ICIlJWEiID4+ICIlTE9HRklMRSUiCitmb3IgJSVhIGluICgqLnRocmlmdCkgZG8gIiVCSU4lXHRocmlmdC5leGUiIC12IC0tZ2VuIGRlbHBoaTpyZWdpc3Rlcl90eXBlcyxjb25zdHByZWZpeCxldmVudHMseG1sZG9jICIlJWEiIDI+PiAiJUxPR0ZJTEUlIgogUkVNICogZm9yICUlYSBpbiAoKi50aHJpZnQpIGRvICIlQklOJVx0aHJpZnQuZXhlIiAtdiAtLWdlbiBjcHAgIiUlYSIgPj4gTlVMOgogY21kIC9jIHN0YXJ0IG5vdGVwYWQgIiVMT0dGSUxFJSIKIGNkIC4uCkBAIC03MCwzMSArODgsMzEgQEAKIHJlbSAqIGdlbmVyYXRlIGEgbWluaW1hbCBEUFIgZmlsZSB0aGF0IHVzZXMgYWxsIGdlbmVyYXRlZCBwYXNjYWwgdW5pdHMKIGNkICIlVEFSR0VUJVwlU1VCRElSJVwiCiBpZiBleGlzdCBpbmhlcml0ZWQuKiAgcmVuIGluaGVyaXRlZC4qICBfaW5oZXJpdGVkLioKLWVjaG8gcHJvZ3JhbSAlVEVTVEFQUCU7ICAgIAkJCQkJPiAlVEVTVEFQUCUuZHByCi1lY2hvIHskQVBQVFlQRSBDT05TT0xFfSAgIAkJCQkJPj4gJVRFU1RBUFAlLmRwcgotZWNoby4gICAgCQkJCQkJCQkJPj4gJVRFU1RBUFAlLmRwcgotZWNobyB1c2VzIAkJCQkJCQkJCT4+ICVURVNUQVBQJS5kcHIKLWZvciAlJWEgaW4gKCoucGFzKSBkbyBlY2hvICAgJSV+bmEsCQkJPj4gJVRFU1RBUFAlLmRwcgotZWNobyAgIFdpbmRvd3MsIENsYXNzZXMsIFN5c1V0aWxzOwkJCT4+ICVURVNUQVBQJS5kcHIKLWVjaG8uICAgIAkJCQkJCQkJCT4+ICVURVNUQVBQJS5kcHIKLWVjaG8gYmVnaW4gCQkJCQkJCQkJPj4gJVRFU1RBUFAlLmRwcgotZWNobyAgIFdyaXRlbG4oJ1N1Y2Nlc3NmdWxseSBjb21waWxlZCEnKTsJPj4gJVRFU1RBUFAlLmRwcgotZWNobyAgIFdyaXRlbG4oJ0xpc3Qgb2YgdW5pdHM6Jyk7CT4+ICVURVNUQVBQJS5kcHIKLWZvciAlJWEgaW4gKCoucGFzKSBkbyBlY2hvICAgV3JpdGUoJyUlfm5hJzozMCwnJzoxMCk7ICA+PiAlVEVTVEFQUCUuZHByCi1lY2hvICAgV3JpdGVsbjsJPj4gJVRFU1RBUFAlLmRwcgotZWNobyBlbmQuIAkJCQkJCQkJCT4+ICVURVNUQVBQJS5kcHIKLWVjaG8uICAgIAkJCQkJCQkJCT4+ICVURVNUQVBQJS5kcHIKK2VjaG8gcHJvZ3JhbSAlVEVTVEFQUCU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gJVRFU1RBUFAlLmRwcgorZWNobyB7JEFQUFRZUEUgQ09OU09MRX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gdXNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZm9yICUlYSBpbiAoKi5wYXMpIGRvIGVjaG8gICAlJX5uYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV2luZG93cywgQ2xhc3NlcywgU3lzVXRpbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNobyBiZWdpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV3JpdGVsbignU3VjY2Vzc2Z1bGx5IGNvbXBpbGVkIScpOyAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gICBXcml0ZWxuKCdMaXN0IG9mIHVuaXRzOicpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZm9yICUlYSBpbiAoKi5wYXMpIGRvIGVjaG8gICBXcml0ZSgnJSV+bmEnOjMwLCcnOjEwKTsgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCitlY2hvICAgV3JpdGVsbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+ICVURVNUQVBQJS5kcHIKK2VjaG8gZW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gJVRFU1RBUFAlLmRwcgorZWNoby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiAlVEVTVEFQUCUuZHByCiBjZCAuLlwuLgogCiByZW0gKiB0cnkgdG8gY29tcGlsZSB0aGUgRFBSCiByZW0gKiB0aGlzIHNob3VsZCBub3QgdGhyb3cgYW55IGVycm9ycywgd2FybmluZ3Mgb3IgaGludHMKLSIlRENDJSIgIC1CICIlVEFSR0VUJVwlU1VCRElSJVwlVEVTVEFQUCUiIC1VIiVVTklUU0VBUkNIJSIgLUkiJVVOSVRTRUFSQ0glIiAtTiIlT1VURENVJSIgLUUiJVRBUkdFVCVcJVNVQkRJUiUiIAorIiVEQ0MlIiAgLUIgIiVUQVJHRVQlXCVTVUJESVIlXCVURVNUQVBQJSIgLVUiJVVOSVRTRUFSQ0glIiAtSSIlVU5JVFNFQVJDSCUiIC1OIiVPVVREQ1UlIiAtRSIlVEFSR0VUJVwlU1VCRElSJSIKIGRpciAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIKIGlmIG5vdCBleGlzdCAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIgIGdvdG8gQ09ERUdFTl9GQUlMRUQKIGVjaG8uCiBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBlY2hvIFRoZSBjb21waWxlZCBwcm9ncmFtIGlzIG5vdyBleGVjdXRlZC4gSWYgaXQgaGFuZ3Mgb3IgY3Jhc2hlcywgd2UKLWVjaG8gaGF2ZSBhIHNlcmlvdXMgcHJvYmxlbSB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZS4gRXhwZWN0ZWQgb3V0cHV0IAorZWNobyBoYXZlIGEgc2VyaW91cyBwcm9ibGVtIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlLiBFeHBlY3RlZCBvdXRwdXQKIGVjaG8gaXMgIlN1Y2Nlc3NmdWxseSBjb21waWxlZDoiIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBnZW5lcmF0ZWQgdW5pdHMuCiBlY2hvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiJVRBUkdFVCVcJVNVQkRJUiVcJVRFU1RBUFAlLmV4ZSIKQEAgLTEwNiwxMCArMTI0LDEwIEBACiBSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDpEWEVfTk9UX0ZPVU5ECiBSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWVjaG8gRGVscGhpIENvbXBpbGVyIChkY2MzMi5leGUpIG5vdCBmb3VuZC4gCitlY2hvIERlbHBoaSBDb21waWxlciAoZGNjMzIuZXhlKSBub3QgZm91bmQuCiBlY2hvIFBsZWFzZSBjaGVjayB0aGUgIkRDQyIgc2V0dGluZyBpbiB0aGlzIGJhdGNoLgogZWNoby4KLWNtZCAvYyBzdGFydCBub3RlcGFkIFJFQURNRS5UWFQKK2NtZCAvYyBzdGFydCBub3RlcGFkIFJFQURNRS5NRAogY21kIC9jIHN0YXJ0IG5vdGVwYWQgJTAKIHBhdXNlCiBHT1RPIEVPRgpAQCAtMTE5LDcgKzEzNyw3IEBACiA6Q09ORklHX0VSUk9SCiBSRU0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGVjaG8gTWlzc2luZywgaW5jb21wbGV0ZSBvciB3cm9uZyBjb25maWd1cmF0aW9uIHNldHRpbmdzIQotY21kIC9jIHN0YXJ0IG5vdGVwYWQgUkVBRE1FLlRYVAorY21kIC9jIHN0YXJ0IG5vdGVwYWQgUkVBRE1FLk1ECiBjbWQgL2Mgc3RhcnQgbm90ZXBhZCAlMAogcGF1c2UKIEdPVE8gRU9GCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRJbmNsdWRlZC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0N2E1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApAQCAtMCwwICsxLDI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIG1ha2Ugc3VyZSBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCBwcm9kdWNlIG5hbWUgY29sbGlzaW9ucyB3aXRoIHByZWRlZmluZWQga2V5d29yZHMKK25hbWVzcGFjZSBkZWxwaGkgU3lzVXRpbHMKKworY29uc3QgaTMyIGludGVnZXIgPSA0MgorCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjOGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCkBAIC0wLDAgKzEsMTUgQEAKK3Byb2dyYW0gUmVzZXJ2ZWRLZXl3b3JkczsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsIFN5c3RlbV87CisKK2JlZ2luCisgIHRyeQorICAgIHsgVE9ETyAtb1VzZXIgLWNDb25zb2xlIE1haW4gOiBDb2RlIGhpZXIgZWluZvxnZW4gfQorICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgIGVuZDsKK2VuZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkOTU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLmRwcm9qCkBAIC0wLDAgKzEsMTEyIEBACivvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+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+IFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RydWN0cyB7CisgIDE6IFN0cnVjdF9zaW1wbGUgaW5pdDsKKyAgMjogU3RydWN0X3NpbXBsZSBzdHJ1YzsKKyAgMzogU3RydWN0X3NpbXBsZSBmaWVsZDsKKyAgNDogU3RydWN0X3NpbXBsZSBmaWVsZF87CisgIDU6IFN0cnVjdF9zaW1wbGUgdHJhY2tlcjsKKyAgNjogU3RydWN0X3NpbXBsZSBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3NpbXBsZSB7CisgIDE6IGJvb2wgaW5pdDsKKyAgMjogYm9vbCBzdHJ1YzsKKyAgMzogYm9vbCBmaWVsZDsKKyAgNDogYm9vbCBmaWVsZF87CisgIDU6IGJvb2wgdHJhY2tlcjsKKyAgNjogYm9vbCBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X3N0cmluZ3MgeworICAxOiBzdHJpbmcgaW5pdDsKKyAgMjogc3RyaW5nIHN0cnVjOworICAzOiBzdHJpbmcgZmllbGQ7CisgIDQ6IHN0cmluZyBmaWVsZF87CisgIDU6IHN0cmluZyB0cmFja2VyOworICA2OiBzdHJpbmcgU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9iaW5hcnkgeworICAxOiBiaW5hcnkgaW5pdDsKKyAgMjogYmluYXJ5IHN0cnVjOworICAzOiBiaW5hcnkgZmllbGQ7CisgIDQ6IGJpbmFyeSBmaWVsZF87CisgIDU6IGJpbmFyeSB0cmFja2VyOworICA2OiBiaW5hcnkgU2VsZjsKK30KKworCit0eXBlZGVmIGkzMiBJUHJvdG9jb2wgCit0eXBlZGVmIGkzMiBJVHJhbnNwb3J0Cit0eXBlZGVmIGkzMiBJRmFjZQordHlwZWRlZiBpMzIgSUFzeW5jCit0eXBlZGVmIGkzMiBTeXN0ZW0KK3R5cGVkZWYgaTMyIFN5c1V0aWxzCit0eXBlZGVmIGkzMiBHZW5lcmljcwordHlwZWRlZiBpMzIgVGhyaWZ0CisKK3N0cnVjdCBTdHJ1Y3RfVGhyaWZ0X05hbWVzIHsKKyAgMTogSVByb3RvY29sICAgSVByb3RvY29sCisgIDI6IElUcmFuc3BvcnQgIElUcmFuc3BvcnQKKyAgMzogSUZhY2UgICAgICAgSUZhY2UKKyAgNDogSUFzeW5jICAgICAgSUFzeW5jCisgIDU6IFN5c3RlbSAgICAgIFN5c3RlbQorICA2OiBTeXNVdGlscyAgICBTeXNVdGlscworICA3OiBHZW5lcmljcyAgICBHZW5lcmljcworICA4OiBUaHJpZnQgICAgICBUaHJpZnQKK30KKworCitlbnVtIFRocmlmdDQ1NTRfRW51bSB7CisgIEZvbyA9IDAsCisgIEJhciA9IDEsCisgIEJheiA9IDIsCit9CisKK3N0cnVjdCBUaHJpZnQ0NTU0X1N0cnVjdCB7CisgIDEgOiBvcHRpb25hbCBkb3VibGUgTWluVmFsdWUKKyAgMiA6IG9wdGlvbmFsIGRvdWJsZSBNYXhWYWx1ZQorICAzIDogb3B0aW9uYWwgYm9vbCBJbnRlZ2VyICAvLyBjYXVzZXMgaXNzdWUKKyAgNCA6IG9wdGlvbmFsIFRocmlmdDQ1NTRfRW51bSBGb28KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaCBiL2xpYi9kZWxwaGkvdGVzdC9tYWtldGVzdC5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmRmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LkNsaWVudC5NYWluLnBhcwpAQCAtMCwwICsxLDEzMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IE11bHRpcGxleC5DbGllbnQuTWFpbjsKKworey4kREVGSU5FIFN0cmVzc1Rlc3R9ICAgLy8gYWN0aXZhdGUgdG8gc3RyZXNzLXRlc3QgdGhlIHNlcnZlciB3aXRoIGZyZXF1ZW50IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzCit7LiRERUZJTkUgUGVyZlRlc3R9ICAgICAvLyBhY3RpdmF0ZSB0byBhY3RpdmF0ZSB0aGUgcGVyZm9ybWFuY2UgdGVzdAorCitpbnRlcmZhY2UKKwordXNlcworICBXaW5kb3dzLCBTeXNVdGlscywgQ2xhc3NlcywKKyAgRGF0ZVV0aWxzLAorICBHZW5lcmljcy5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMsCisgIFRocmlmdC5UcmFuc3BvcnQsCisgIFRocmlmdC5TdHJlYW0sCisgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgQmVuY2htYXJrLCAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgQWdnciwgICAgICAgLy8gaW4gZ2VuLWRlbHBoaSBmb2xkZXIKKyAgTXVsdGlwbGV4LlRlc3QuQ29tbW9uOworCit0eXBlCisgIFRUZXN0Q2xpZW50ID0gY2xhc3MKKyAgcHJvdGVjdGVkCisgICAgRlByb3RvY29sIDogSVByb3RvY29sOworCisgICAgcHJvY2VkdXJlIFBhcnNlQXJncyggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKKyAgICBwcm9jZWR1cmUgU2V0dXA7CisgICAgcHJvY2VkdXJlIFJ1bjsKKyAgcHVibGljCisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICAgIGNsYXNzIHByb2NlZHVyZSBFeGVjdXRlKCBjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpOworICBlbmQ7CisKK2ltcGxlbWVudGF0aW9uCisKKwordHlwZQorICBJU2VydmljZUNsaWVudCA9IGludGVyZmFjZQorICAgIFsnezc3NDVDMUMyLUFCMjAtNDNCQS1CNkYwLTA4QkY5MkRFMEJBQ30nXQorICAgIHByb2NlZHVyZSBUZXN0OworICBlbmQ7CisKKy8vLS0tIFRUZXN0Q2xpZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBwcm9jZWR1cmUgVFRlc3RDbGllbnQuRXhlY3V0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK3ZhciBjbGllbnQgOiBUVGVzdENsaWVudDsKK2JlZ2luCisgIGNsaWVudCA6PSBUVGVzdENsaWVudC5DcmVhdGUoYXJncyk7CisgIHRyeQorICAgIGNsaWVudC5SdW47CisgIGZpbmFsbHkKKyAgICBjbGllbnQuRnJlZTsKKyAgZW5kOworZW5kOworCisKK2NvbnN0cnVjdG9yIFRUZXN0Q2xpZW50LkNyZWF0ZSggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIFBhcnNlQXJncyhhcmdzKTsKKyAgU2V0dXA7CitlbmQ7CisKKworcHJvY2VkdXJlIFRUZXN0Q2xpZW50LlBhcnNlQXJncyggY29uc3QgYXJnczogYXJyYXkgb2Ygc3RyaW5nKTsKK2JlZ2luCisgIGlmIExlbmd0aChhcmdzKSA8PiAwCisgIHRoZW4gcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnTm8gYXJncyBhY2NlcHRlZCBzbyBmYXInKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RDbGllbnQuU2V0dXA7Cit2YXIgdHJhbnMgOiBJVHJhbnNwb3J0OworYmVnaW4KKyAgdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCAnbG9jYWxob3N0JywgOTA5MCk7CisgIHRyYW5zIDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggdHJhbnMpOworICB0cmFucy5PcGVuOworICBGUHJvdG9jb2wgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zLCBUUlVFLCBUUlVFKTsKK2VuZDsKKworCitwcm9jZWR1cmUgVFRlc3RDbGllbnQuUnVuOwordmFyIGJlbmNoIDogVEJlbmNobWFya1NlcnZpY2UuSWZhY2U7CisgICAgYWdnciAgOiBUQWdnci5JZmFjZTsKKyAgICBtdWx0aXBsZXggOiBJUHJvdG9jb2w7CisgICAgaSAgICAgICAgIDogSW50ZWdlcjsKK2JlZ2luCisgIHRyeQorICAgIG11bHRpcGxleCA6PSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5DcmVhdGUoIEZQcm90b2NvbCwgTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICBiZW5jaCAgICAgOj0gVEJlbmNobWFya1NlcnZpY2UuVENsaWVudC5DcmVhdGUoIG11bHRpcGxleCk7CisKKyAgICBtdWx0aXBsZXggOj0gVE11bHRpcGxleGVkUHJvdG9jb2wuQ3JlYXRlKCBGUHJvdG9jb2wsIE5BTUVfQUdHUik7CisgICAgYWdnciAgICAgIDo9IFRBZ2dyLlRDbGllbnQuQ3JlYXRlKCBtdWx0aXBsZXgpOworCisgICAgZm9yIGkgOj0gMSB0byAxMAorICAgIGRvIGFnZ3IuYWRkVmFsdWUoIGJlbmNoLmZpYm9uYWNjaShpKSk7CisKKyAgICBmb3IgaSBpbiBhZ2dyLmdldFZhbHVlcworICAgIGRvIFdyaXRlKEludFRvU3RyKGkpKycgJyk7CisgICAgV3JpdGVMbjsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gV3JpdGVsbigjMTArZS5NZXNzYWdlKTsKKyAgZW5kOworZW5kOworCisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguU2VydmVyLk1haW4ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjBmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwpAQCAtMCwwICsxLDIwMSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IE11bHRpcGxleC5TZXJ2ZXIuTWFpbjsKKworeyRXQVJOIFNZTUJPTF9QTEFURk9STSBPRkZ9CisKK3suJERFRklORSBSdW5FbmRsZXNzfSAgIC8vIGFjdGl2YXRlIHRvIGludGVyYWN0aXZlbHkgc3RyZXNzLXRlc3QgdGhlIHNlcnZlciBzdG9wIHJvdXRpbmVzIHZpYSBDdHJsK0MKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgV2luZG93cywgU3lzVXRpbHMsCisgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAorICBUaHJpZnQuU2VydmVyLAorICBUaHJpZnQuVHJhbnNwb3J0LAorICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLAorICBUaHJpZnQuUHJvdG9jb2wsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXgsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LAorICBUaHJpZnQuQ29sbGVjdGlvbnMsCisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LAorICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgorICBNdWx0aXBsZXguVGVzdC5Db21tb24sCisgIENvbnNvbGVIZWxwZXIsCisgIENvbnRucnM7CisKK3R5cGUKKyAgVFRlc3RTZXJ2ZXIgPSBjbGFzcworICBwdWJsaWMgdHlwZQorICAgIElUZXN0SGFuZGxlciA9IGludGVyZmFjZQorICAgICAgWyd7Q0FFMDlBQUItODBGQi00OEU5LUIzQTgtN0Y5Qjk2RjU0MTlBfSddCisgICAgICBwcm9jZWR1cmUgU2V0U2VydmVyKCBjb25zdCBBU2VydmVyIDogSVNlcnZlciApOworICAgIGVuZDsKKworICBwcm90ZWN0ZWQgdHlwZQorICAgIFRUZXN0SGFuZGxlckltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElUZXN0SGFuZGxlcikKKyAgICBwcml2YXRlCisgICAgICBGU2VydmVyIDogSVNlcnZlcjsKKyAgICBwcm90ZWN0ZWQKKyAgICAgIC8vIElUZXN0SGFuZGxlcgorICAgICAgcHJvY2VkdXJlIFNldFNlcnZlciggY29uc3QgQVNlcnZlciA6IElTZXJ2ZXIgKTsKKworICAgICAgcHJvcGVydHkgU2VydmVyIDogSVNlcnZlciByZWFkIEZTZXJ2ZXIgd3JpdGUgU2V0U2VydmVyOworICAgIGVuZDsKKworICAgIFRCZW5jaG1hcmtTZXJ2aWNlSW1wbCA9IGNsYXNzKCBUVGVzdEhhbmRsZXJJbXBsLCBUQmVuY2htYXJrU2VydmljZS5JZmFjZSkKKyAgICBwcm90ZWN0ZWQKKyAgICAgIC8vIFRCZW5jaG1hcmtTZXJ2aWNlLklmYWNlCisgICAgICBmdW5jdGlvbiBmaWJvbmFjY2kobjogU2hvcnRJbnQpOiBJbnRlZ2VyOworICAgIGVuZDsKKworCisgICAgVEFnZ3JJbXBsID0gY2xhc3MoIFRUZXN0SGFuZGxlckltcGwsIFRBZ2dyLklmYWNlKQorICAgIHByb3RlY3RlZAorICAgICAgRkxpc3QgOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKKworICAgICAgLy8gVEFnZ3IuSWZhY2UKKyAgICAgIHByb2NlZHVyZSBhZGRWYWx1ZSh2YWx1ZTogSW50ZWdlcik7CisgICAgICBmdW5jdGlvbiBnZXRWYWx1ZXMoKTogSVRocmlmdExpc3Q8SW50ZWdlcj47CisgICAgcHVibGljCisgICAgICBjb25zdHJ1Y3RvciBDcmVhdGU7CisgICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7ICBvdmVycmlkZTsKKyAgICBlbmQ7CisKKyAgcHVibGljCisgICAgY2xhc3MgcHJvY2VkdXJlIEV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7CisgIGVuZDsKKworCitpbXBsZW1lbnRhdGlvbgorCisKK3sgVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbCB9CisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UVGVzdEhhbmRsZXJJbXBsLlNldFNlcnZlciggY29uc3QgQVNlcnZlcjogSVNlcnZlcik7CitiZWdpbgorICBGU2VydmVyIDo9IEFTZXJ2ZXI7CitlbmQ7CisKKworeyBUVGVzdFNlcnZlci5UQmVuY2htYXJrU2VydmljZUltcGwgfQorCitmdW5jdGlvbiBUVGVzdFNlcnZlci5UQmVuY2htYXJrU2VydmljZUltcGwuZmlib25hY2NpKG46IFNob3J0SW50KTogSW50ZWdlcjsKK3ZhciBwcmV2LCBuZXh0IDogSW50ZWdlcjsKK2JlZ2luCisgIHByZXYgICA6PSAwOworICByZXN1bHQgOj0gMTsKKyAgd2hpbGUgbiA+IDAgZG8gYmVnaW4KKyAgICBuZXh0ICAgOj0gcmVzdWx0ICsgcHJldjsKKyAgICBwcmV2ICAgOj0gcmVzdWx0OworICAgIHJlc3VsdCA6PSBuZXh0OworICAgIERlYyhuKTsKKyAgZW5kOworZW5kOworCit7IFRUZXN0U2VydmVyLlRBZ2dySW1wbCB9CisKK2NvbnN0cnVjdG9yIFRUZXN0U2VydmVyLlRBZ2dySW1wbC5DcmVhdGU7CitiZWdpbgorICBpbmhlcml0ZWQgQ3JlYXRlOworICBGTGlzdCA6PSBUVGhyaWZ0TGlzdEltcGw8SW50ZWdlcj4uQ3JlYXRlOworZW5kOworCisKK2Rlc3RydWN0b3IgVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLkRlc3Ryb3k7CitiZWdpbgorICB0cnkKKyAgICBGcmVlQW5kTmlsKCBGTGlzdCk7CisgIGZpbmFsbHkKKyAgICBpbmhlcml0ZWQgRGVzdHJveTsKKyAgZW5kOworZW5kOworCisKK3Byb2NlZHVyZSBUVGVzdFNlcnZlci5UQWdnckltcGwuYWRkVmFsdWUodmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRkxpc3QuQWRkKCB2YWx1ZSk7CitlbmQ7CisKKworZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVEFnZ3JJbXBsLmdldFZhbHVlcygpOiBJVGhyaWZ0TGlzdDxJbnRlZ2VyPjsKK2JlZ2luCisgIHJlc3VsdCA6PSBGTGlzdDsKK2VuZDsKKworCit7IFRUZXN0U2VydmVyIH0KKworY2xhc3MgcHJvY2VkdXJlIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGNvbnN0IGFyZ3M6IGFycmF5IG9mIHN0cmluZyk7Cit2YXIKKyAgVHJhbnNwb3J0RmFjdG9yeSA6IElUcmFuc3BvcnRGYWN0b3J5OworICBQcm90b2NvbEZhY3RvcnkgIDogSVByb3RvY29sRmFjdG9yeTsKKyAgU2VydmVyVHJhbnMgICAgICA6IElTZXJ2ZXJUcmFuc3BvcnQ7CisgIGJlbmNoSGFuZGxlciAgICAgOiBUQmVuY2htYXJrU2VydmljZS5JZmFjZTsKKyAgYWdnckhhbmRsZXIgICAgICA6IFRBZ2dyLklmYWNlOworICBiZW5jaFByb2Nlc3NvciAgIDogSVByb2Nlc3NvcjsKKyAgYWdnclByb2Nlc3NvciAgICA6IElQcm9jZXNzb3I7CisgIG11bHRpcGxleCAgICAgICAgOiBJTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisgIFNlcnZlckVuZ2luZSAgICAgOiBJU2VydmVyOworYmVnaW4KKyAgdHJ5CisgICAgLy8gY3JlYXRlIHByb3RvY29sIGZhY3RvcnksIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKKyAgICBQcm90b2NvbEZhY3RvcnkgIDo9IFRCaW5hcnlQcm90b2NvbEltcGwuVEZhY3RvcnkuQ3JlYXRlKCBUUlVFLCBUUlVFKTsKKyAgICBzZXJ2ZXJ0cmFucyAgICAgIDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggOTA5MCwgMCwgRkFMU0UpOworICAgIFRyYW5zcG9ydEZhY3RvcnkgOj0gVEZyYW1lZFRyYW5zcG9ydEltcGwuVEZhY3RvcnkuQ3JlYXRlOworCisgICAgYmVuY2hIYW5kbGVyICAgICA6PSBUQmVuY2htYXJrU2VydmljZUltcGwuQ3JlYXRlOworICAgIGJlbmNoUHJvY2Vzc29yICAgOj0gVEJlbmNobWFya1NlcnZpY2UuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBiZW5jaEhhbmRsZXIpOworCisgICAgYWdnckhhbmRsZXIgICAgICA6PSBUQWdnckltcGwuQ3JlYXRlOworICAgIGFnZ3JQcm9jZXNzb3IgICAgOj0gVEFnZ3IuVFByb2Nlc3NvckltcGwuQ3JlYXRlKCBhZ2dySGFuZGxlcik7CisKKyAgICBtdWx0aXBsZXggICAgICAgIDo9IFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuQ3JlYXRlOworICAgIG11bHRpcGxleC5SZWdpc3RlclByb2Nlc3NvciggTkFNRV9CRU5DSE1BUktTRVJWSUNFLCBiZW5jaFByb2Nlc3Nvcik7CisgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0FHR1IsICBhZ2dyUHJvY2Vzc29yKTsKKworICAgIFNlcnZlckVuZ2luZSA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggbXVsdGlwbGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyVHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xGYWN0b3J5KTsKKworICAgIChiZW5jaEhhbmRsZXIgYXMgSVRlc3RIYW5kbGVyKS5TZXRTZXJ2ZXIoIFNlcnZlckVuZ2luZSk7CisgICAgKGFnZ3JIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBTZXJ2ZXJFbmdpbmUpOworCisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIgLi4uJyk7CisgICAgU2VydmVyRW5naW5lLnNlcnZlKCk7CisKKyAgICAoYmVuY2hIYW5kbGVyIGFzIElUZXN0SGFuZGxlcikuU2V0U2VydmVyKCBuaWwpOworICAgIChhZ2dySGFuZGxlciBhcyBJVGVzdEhhbmRsZXIpLlNldFNlcnZlciggbmlsKTsKKworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZSggRS5NZXNzYWdlKTsKKyAgICBlbmQ7CisgIGVuZDsKKyAgQ29uc29sZS5Xcml0ZUxpbmUoICdkb25lLicpOworZW5kOworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjc4ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKQEAgLTAsMCArMSw2NyBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCisKK3Byb2dyYW0gTXVsdGlwbGV4LlRlc3QuQ2xpZW50OworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywKKyAgTXVsdGlwbGV4LkNsaWVudC5NYWluIGluICdNdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzJywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKKyAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcyc7CisKK3ZhcgorICBuUGFyYW1Db3VudCA6IEludGVnZXI7CisgIGFyZ3MgOiBhcnJheSBvZiBzdHJpbmc7CisgIGkgOiBJbnRlZ2VyOworICBhcmcgOiBzdHJpbmc7CisgIHMgOiBzdHJpbmc7CisKK2JlZ2luCisgIHRyeQorICAgIFdyaXRlbG4oICdNdWx0aXBsZXggVGVzdENsaWVudCAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBuUGFyYW1Db3VudCA6PSBQYXJhbUNvdW50OworICAgIFNldExlbmd0aCggYXJncywgblBhcmFtQ291bnQpOworICAgIGZvciBpIDo9IDEgdG8gblBhcmFtQ291bnQgZG8KKyAgICBiZWdpbgorICAgICAgYXJnIDo9IFBhcmFtU3RyKCBpICk7CisgICAgICBhcmdzW2ktMV0gOj0gYXJnOworICAgIGVuZDsKKyAgICBUVGVzdENsaWVudC5FeGVjdXRlKCBhcmdzICk7CisgICAgUmVhZGxuOworICBleGNlcHQKKyAgICBvbiBFOiBFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIFdyaXRlbG4oRS5DbGFzc05hbWUsICc6ICcsIEUuTWVzc2FnZSk7CisgICAgICBFeGl0Q29kZSA6PSAkRkZGRjsKKyAgICBlbmQ7CisgIGVuZDsKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNvbW1vbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuQ29tbW9uLnBhcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FmMDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNvbW1vbi5wYXMKQEAgLTAsMCArMSwzNSBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCit1bml0IE11bHRpcGxleC5UZXN0LkNvbW1vbjsKKworaW50ZXJmYWNlCisKK2NvbnN0CisgIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA9ICdCZW5jaG1hcmtTZXJ2aWNlJzsKKyAgTkFNRV9BR0dSICAgICAgICAgICAgID0gJ0FnZ3InOworCisKK2ltcGxlbWVudGF0aW9uCisKKy8vIG5peAorCitlbmQuCisKKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA0NjJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIKQEAgLTAsMCArMSw2OCBAQAorKCoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqKQorCitwcm9ncmFtIE11bHRpcGxleC5UZXN0LlNlcnZlcjsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgU3lzVXRpbHMsCisgIE11bHRpcGxleC5TZXJ2ZXIuTWFpbiBpbiAnTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcycsCisgIENvbnNvbGVIZWxwZXIgaW4gJy4uXENvbnNvbGVIZWxwZXIucGFzJywKKyAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCisgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCisgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4IGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMnLAorICBUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAorICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAorICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKKwordmFyCisgIG5QYXJhbUNvdW50IDogSW50ZWdlcjsKKyAgYXJncyA6IGFycmF5IG9mIHN0cmluZzsKKyAgaSA6IEludGVnZXI7CisgIGFyZyA6IHN0cmluZzsKKyAgcyA6IHN0cmluZzsKKworYmVnaW4KKyAgdHJ5CisgICAgV3JpdGVsbiggJ011bHRpcGxleCBUZXN0U2VydmVyICcrVGhyaWZ0LlZlcnNpb24pOworICAgIG5QYXJhbUNvdW50IDo9IFBhcmFtQ291bnQ7CisgICAgU2V0TGVuZ3RoKCBhcmdzLCBuUGFyYW1Db3VudCk7CisgICAgZm9yIGkgOj0gMSB0byBuUGFyYW1Db3VudCBkbworICAgIGJlZ2luCisgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKKyAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CisgICAgZW5kOworICAgIFRUZXN0U2VydmVyLkV4ZWN1dGUoIGFyZ3MgKTsKKyAgICBXcml0ZWxuKCdQcmVzcyBFTlRFUiB0byBjbG9zZSAuLi4gJyk7IFJlYWRsbjsKKyAgZXhjZXB0CisgICAgb24gRTogRXhjZXB0aW9uIGRvCisgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICBlbmQ7CitlbmQuCisKKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5EYXRhLnBhcyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzCmluZGV4IDM0YWQ0ZjYuLjVmYzAwNzAgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzCkBAIC0yMiw2ICsyMiw3IEBACiBpbnRlcmZhY2UKIAogdXNlcworICBTeXNVdGlscywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zLAogICBEZWJ1Z1Byb3RvVGVzdDsKIApAQCAtMTk0LDcgKzE5NSw3IEBACiAgIHskSUYgY0RlYnVnUHJvdG9UZXN0X09wdGlvbl9BbnNpU3RyX0JpbmFyeX0KICAgcmVzdWx0LlNldEJhc2U2NCgnYmFzZTY0Jyk7CiAgIHskRUxTRX0KLSAgbm90IHlldCBpbXBsCisgIHJlc3VsdC5TZXRCYXNlNjQoIFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCdiYXNlNjQnKSk7CiAgIHskSUZFTkR9CiAKICAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgpAQCAtMjgzLDY1ICsyODQsNjcgQEAKIC8vIHN1cGVyaHVnZSBjb21wYWN0IHByb3RvIHRlc3Qgc3RydWN0CiBiZWdpbgogICByZXN1bHQgOj0gVENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RJbXBsLkNyZWF0ZTsKLSAgcmVzdWx0LkFfYnl0ZSA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2J5dGU7Ci0gIHJlc3VsdC5BX2kxNiA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2kxNjsKLSAgcmVzdWx0LkFfaTMyIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkFfaTMyOwotICByZXN1bHQuQV9pNjQgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9pNjQ7Ci0gIHJlc3VsdC5BX2RvdWJsZSA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2RvdWJsZTsKLSAgcmVzdWx0LkFfc3RyaW5nIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkFfc3RyaW5nOwotICByZXN1bHQuQV9iaW5hcnkgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9iaW5hcnk7Ci0gIHJlc3VsdC5UcnVlX2ZpZWxkIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULlRydWVfZmllbGQ7Ci0gIHJlc3VsdC5GYWxzZV9maWVsZCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5GYWxzZV9maWVsZDsKLSAgcmVzdWx0LkVtcHR5X3N0cnVjdF9maWVsZCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5FbXB0eV9zdHJ1Y3RfZmllbGQ7Ci0gIHJlc3VsdC5CeXRlX2xpc3QgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9saXN0OwotICByZXN1bHQuSTE2X2xpc3QgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTE2X2xpc3Q7Ci0gIHJlc3VsdC5JMzJfbGlzdCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfbGlzdDsKLSAgcmVzdWx0Lkk2NF9saXN0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9saXN0OwotICByZXN1bHQuRG91YmxlX2xpc3QgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuRG91YmxlX2xpc3Q7Ci0gIHJlc3VsdC5TdHJpbmdfbGlzdCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfbGlzdDsKLSAgcmVzdWx0LkJpbmFyeV9saXN0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9saXN0OwotICByZXN1bHQuQm9vbGVhbl9saXN0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJvb2xlYW5fbGlzdDsKLSAgcmVzdWx0LlN0cnVjdF9saXN0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cnVjdF9saXN0OwotICByZXN1bHQuQnl0ZV9zZXQgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zZXQ7Ci0gIHJlc3VsdC5JMTZfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkkxNl9zZXQ7Ci0gIHJlc3VsdC5JMzJfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkkzMl9zZXQ7Ci0gIHJlc3VsdC5JNjRfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9zZXQ7Ci0gIHJlc3VsdC5Eb3VibGVfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkRvdWJsZV9zZXQ7Ci0gIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7Ci0gIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7Ci0gIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7Ci0gIHJlc3VsdC5CaW5hcnlfc2V0IDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9zZXQ7Ci0gIHJlc3VsdC5Cb29sZWFuX3NldCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX3NldDsKLSAgcmVzdWx0LlN0cnVjdF9zZXQgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RydWN0X3NldDsKLSAgcmVzdWx0LkJ5dGVfYnl0ZV9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9ieXRlX21hcDsKLSAgcmVzdWx0LkkxNl9ieXRlX21hcCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfYnl0ZV9tYXA7Ci0gIHJlc3VsdC5JMzJfYnl0ZV9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTMyX2J5dGVfbWFwOwotICByZXN1bHQuSTY0X2J5dGVfbWFwIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9ieXRlX21hcDsKLSAgcmVzdWx0LkRvdWJsZV9ieXRlX21hcCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfYnl0ZV9tYXA7Ci0gIHJlc3VsdC5TdHJpbmdfYnl0ZV9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX2J5dGVfbWFwOwotICByZXN1bHQuQmluYXJ5X2J5dGVfbWFwIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9ieXRlX21hcDsKLSAgcmVzdWx0LkJvb2xlYW5fYnl0ZV9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQm9vbGVhbl9ieXRlX21hcDsKLSAgcmVzdWx0LkJ5dGVfaTE2X21hcCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2kxNl9tYXA7Ci0gIHJlc3VsdC5CeXRlX2kzMl9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pMzJfbWFwOwotICByZXN1bHQuQnl0ZV9pNjRfbWFwIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfaTY0X21hcDsKLSAgcmVzdWx0LkJ5dGVfZG91YmxlX21hcCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2RvdWJsZV9tYXA7Ci0gIHJlc3VsdC5CeXRlX3N0cmluZ19tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zdHJpbmdfbWFwOwotICByZXN1bHQuQnl0ZV9iaW5hcnlfbWFwIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYmluYXJ5X21hcDsKLSAgcmVzdWx0LkJ5dGVfYm9vbGVhbl9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9ib29sZWFuX21hcDsKLSAgcmVzdWx0Lkxpc3RfYnl0ZV9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuTGlzdF9ieXRlX21hcDsKLSAgcmVzdWx0LlNldF9ieXRlX21hcCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TZXRfYnl0ZV9tYXA7Ci0gIHJlc3VsdC5NYXBfYnl0ZV9tYXAgOj0gVENvbnN0YW50cy5DT01QQUNUX1RFU1QuTWFwX2J5dGVfbWFwOwotICByZXN1bHQuQnl0ZV9tYXBfbWFwIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfbWFwX21hcDsKLSAgcmVzdWx0LkJ5dGVfc2V0X21hcCA6PSBUQ29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX3NldF9tYXA7Ci0gIHJlc3VsdC5CeXRlX2xpc3RfbWFwIDo9IFRDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfbGlzdF9tYXA7CisgIHJlc3VsdC5BX2J5dGUgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2J5dGU7CisgIHJlc3VsdC5BX2kxNiA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfaTE2OworICByZXN1bHQuQV9pMzIgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX2kzMjsKKyAgcmVzdWx0LkFfaTY0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9pNjQ7CisgIHJlc3VsdC5BX2RvdWJsZSA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkFfZG91YmxlOworICByZXN1bHQuQV9zdHJpbmcgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5BX3N0cmluZzsKKyAgcmVzdWx0LkFfYmluYXJ5IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQV9iaW5hcnk7CisgIHJlc3VsdC5UcnVlX2ZpZWxkIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuVHJ1ZV9maWVsZDsKKyAgcmVzdWx0LkZhbHNlX2ZpZWxkIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuRmFsc2VfZmllbGQ7CisgIHJlc3VsdC5FbXB0eV9zdHJ1Y3RfZmllbGQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5FbXB0eV9zdHJ1Y3RfZmllbGQ7CisgIHJlc3VsdC5CeXRlX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2xpc3Q7CisgIHJlc3VsdC5JMTZfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkxNl9saXN0OworICByZXN1bHQuSTMyX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMzJfbGlzdDsKKyAgcmVzdWx0Lkk2NF9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTY0X2xpc3Q7CisgIHJlc3VsdC5Eb3VibGVfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkRvdWJsZV9saXN0OworICByZXN1bHQuU3RyaW5nX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfbGlzdDsKKyAgcmVzdWx0LkJpbmFyeV9saXN0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQmluYXJ5X2xpc3Q7CisgIHJlc3VsdC5Cb29sZWFuX2xpc3QgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX2xpc3Q7CisgIHJlc3VsdC5TdHJ1Y3RfbGlzdCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cnVjdF9saXN0OworICByZXN1bHQuQnl0ZV9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX3NldDsKKyAgcmVzdWx0LkkxNl9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5JMTZfc2V0OworICByZXN1bHQuSTMyX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkzMl9zZXQ7CisgIHJlc3VsdC5JNjRfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuSTY0X3NldDsKKyAgcmVzdWx0LkRvdWJsZV9zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Eb3VibGVfc2V0OworICByZXN1bHQuU3RyaW5nX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19zZXQ7CisgIHJlc3VsdC5TdHJpbmdfc2V0IDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuU3RyaW5nX3NldDsKKyAgcmVzdWx0LlN0cmluZ19zZXQgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5TdHJpbmdfc2V0OworICByZXN1bHQuQmluYXJ5X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9zZXQ7CisgIHJlc3VsdC5Cb29sZWFuX3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJvb2xlYW5fc2V0OworICByZXN1bHQuU3RydWN0X3NldCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cnVjdF9zZXQ7CisgIHJlc3VsdC5CeXRlX2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9ieXRlX21hcDsKKyAgcmVzdWx0LkkxNl9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkxNl9ieXRlX21hcDsKKyAgcmVzdWx0LkkzMl9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkkzMl9ieXRlX21hcDsKKyAgcmVzdWx0Lkk2NF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkk2NF9ieXRlX21hcDsKKyAgcmVzdWx0LkRvdWJsZV9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkRvdWJsZV9ieXRlX21hcDsKKyAgcmVzdWx0LlN0cmluZ19ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlN0cmluZ19ieXRlX21hcDsKKyAgcmVzdWx0LkJpbmFyeV9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJpbmFyeV9ieXRlX21hcDsKKyAgcmVzdWx0LkJvb2xlYW5fYnl0ZV9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5Cb29sZWFuX2J5dGVfbWFwOworICByZXN1bHQuQnl0ZV9pMTZfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pMTZfbWFwOworICByZXN1bHQuQnl0ZV9pMzJfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pMzJfbWFwOworICByZXN1bHQuQnl0ZV9pNjRfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9pNjRfbWFwOworICByZXN1bHQuQnl0ZV9kb3VibGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9kb3VibGVfbWFwOworICByZXN1bHQuQnl0ZV9zdHJpbmdfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9zdHJpbmdfbWFwOworICByZXN1bHQuQnl0ZV9iaW5hcnlfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuQnl0ZV9iaW5hcnlfbWFwOworICByZXN1bHQuQnl0ZV9ib29sZWFuX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfYm9vbGVhbl9tYXA7CisgIHJlc3VsdC5MaXN0X2J5dGVfbWFwIDo9IFREZWJ1Z1Byb3RvVGVzdENvbnN0YW50cy5DT01QQUNUX1RFU1QuTGlzdF9ieXRlX21hcDsKKyAgcmVzdWx0LlNldF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULlNldF9ieXRlX21hcDsKKyAgcmVzdWx0Lk1hcF9ieXRlX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULk1hcF9ieXRlX21hcDsKKyAgcmVzdWx0LkJ5dGVfbWFwX21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfbWFwX21hcDsKKyAgcmVzdWx0LkJ5dGVfc2V0X21hcCA6PSBURGVidWdQcm90b1Rlc3RDb25zdGFudHMuQ09NUEFDVF9URVNULkJ5dGVfc2V0X21hcDsKKyAgcmVzdWx0LkJ5dGVfbGlzdF9tYXAgOj0gVERlYnVnUHJvdG9UZXN0Q29uc3RhbnRzLkNPTVBBQ1RfVEVTVC5CeXRlX2xpc3RfbWFwOwogCiAgIHskSUYgY0RlYnVnUHJvdG9UZXN0X09wdGlvbl9BbnNpU3RyX0JpbmFyeX0KICAgcmVzdWx0LkFfYmluYXJ5IDo9IEFuc2lTdHJpbmcoICMwIzEjMiMzIzQjNSM2IzcjOCk7CiAgIHskRUxTRX0KLSAgbm90IHlldCBpbXBsCisgIHJlc3VsdC5BX2JpbmFyeSA6PSBURW5jb2RpbmcuVVRGOC5HZXRCeXRlcyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKICAgeyRJRkVORH0KIGVuZDsKIAogCisKKwogZW5kLgogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKaW5kZXggNjBlNTVjMS4uNTFlMjJhNCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpAQCAtMTcsMjIgKzE3LDI1IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqKQogCi1wcm9ncmFtIHNraXB0ZXN0X3ZlcnNpb24xOworcHJvZ3JhbSBUZXN0U2VyaWFsaXplcjsKIAogeyRBUFBUWVBFIENPTlNPTEV9CiAKIHVzZXMKICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TZXJpYWxpemVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcmlhbGl6ZXIucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKKyAgU3lzdGVtXywKICAgRGVidWdQcm90b1Rlc3QsCiAgIFRlc3RTZXJpYWxpemVyLkRhdGE7CiAKQEAgLTQ4LDExICs1MSwxMyBAQAogICAgIGNsYXNzIHByb2NlZHVyZSBEZXNlcmlhbGl6ZSggY29uc3QgaW5wdXQgOiBUQnl0ZXM7IGNvbnN0IHRhcmdldCA6IElCYXNlOyBjb25zdCBmYWN0b3J5IDogSVByb3RvY29sRmFjdG9yeSk7ICBvdmVybG9hZDsKICAgICBjbGFzcyBwcm9jZWR1cmUgRGVzZXJpYWxpemUoIGNvbnN0IGlucHV0IDogVFN0cmVhbTsgY29uc3QgdGFyZ2V0IDogSUJhc2U7IGNvbnN0IGZhY3RvcnkgOiBJUHJvdG9jb2xGYWN0b3J5KTsgIG92ZXJsb2FkOwogCisgICAgcHJvY2VkdXJlIFRlc3RfU2VyaWFsaXplcl9EZXNlcmlhbGl6ZXI7CisKICAgcHVibGljCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlOwogICAgIGRlc3RydWN0b3IgRGVzdHJveTsgIG92ZXJyaWRlOwogCi0gICAgcHJvY2VkdXJlIFRlc3REZXNlcmlhbGl6ZTsKKyAgICBwcm9jZWR1cmUgUnVuVGVzdHM7CiAgIGVuZDsKIAogCkBAIC03OCw5ICs4MywxMCBAQAogICBlbmQ7CiBlbmQ7CiAKLQotcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5UZXN0RGVzZXJpYWxpemU7CiB0eXBlIFRNZXRob2QgPSAobXRfQnl0ZXMsIG10X1N0cmVhbSk7CisKKworcHJvY2VkdXJlIFRUZXN0U2VyaWFsaXplci5UZXN0X1NlcmlhbGl6ZXJfRGVzZXJpYWxpemVyOwogdmFyIGxldmVsM29vZSwgY29ycmVjdCA6IElPbmVPZkVhY2g7CiAgICAgZmFjdG9yeSA6IElQcm90b2NvbEZhY3Rvcnk7CiAgICAgYnl0ZXMgICA6IFRCeXRlczsKQEAgLTE1Myw2ICsxNTksMTkgQEAKIGVuZDsKIAogCitwcm9jZWR1cmUgVFRlc3RTZXJpYWxpemVyLlJ1blRlc3RzOworYmVnaW4KKyAgdHJ5CisgICAgVGVzdF9TZXJpYWxpemVyX0Rlc2VyaWFsaXplcjsKKyAgZXhjZXB0CisgICAgb24gZTpFeGNlcHRpb24gZG8gYmVnaW4KKyAgICAgIFdyaXRlbG4oIGUuTWVzc2FnZSk7CisgICAgICBXcml0ZSgnSGl0IEVOVEVSIHRvIGNsb3NlIC4uLiAnKTsgUmVhZGxuOworICAgIGVuZDsKKyAgZW5kOworZW5kOworCisKIGNsYXNzIGZ1bmN0aW9uIFRUZXN0U2VyaWFsaXplci5TZXJpYWxpemUoY29uc3QgaW5wdXQgOiBJQmFzZTsgY29uc3QgZmFjdG9yeSA6IElQcm90b2NvbEZhY3RvcnkpIDogVEJ5dGVzOwogdmFyIHNlcmlhbCA6IFRTZXJpYWxpemVyOwogYmVnaW4KQEAgLTIwNCw3ICsyMjMsNyBAQAogYmVnaW4KICAgdGVzdCA6PSBUVGVzdFNlcmlhbGl6ZXIuQ3JlYXRlOwogICB0cnkKLSAgICB0ZXN0LlRlc3REZXNlcmlhbGl6ZTsKKyAgICB0ZXN0LlJ1blRlc3RzOwogICBmaW5hbGx5CiAgICAgdGVzdC5GcmVlOwogICBlbmQ7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCmluZGV4IGE1NTY4YzQuLmI1ZTQ4YTYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCkBAIC0yNCwxNSArMjQsMjEgQEAKIHVzZXMKICAgU3lzVXRpbHMsCiAgIFRlc3RTZXJ2ZXIgaW4gJ1Rlc3RTZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LlRlc3QgaW4gJ2dlbi1kZWxwaGlcVGhyaWZ0LlRlc3QucGFzJywKKyAgVGVzdFNlcnZlckV2ZW50cyBpbiAnVGVzdFNlcnZlckV2ZW50cy5wYXMnLAorICBUaHJpZnQuVGVzdCwgIC8vIGluIGdlbi1kZWxwaGkgZm9sZGVyCiAgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAorICBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdCBpbiAnLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcycsCisgIFRocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4IGluICcuLlxzcmNcVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CiAKQEAgLTQxLDIzICs0NywyNyBAQAogICBhcmdzIDogYXJyYXkgb2Ygc3RyaW5nOwogICBpIDogSW50ZWdlcjsKICAgYXJnIDogc3RyaW5nOwotICBzIDogc3RyaW5nOwogCiBiZWdpbgogICB0cnkKICAgICBXcml0ZWxuKCAnRGVscGhpIFRlc3RTZXJ2ZXIgJytUaHJpZnQuVmVyc2lvbik7CiAgICAgblBhcmFtQ291bnQgOj0gUGFyYW1Db3VudDsKICAgICBTZXRMZW5ndGgoIGFyZ3MsIG5QYXJhbUNvdW50KTsKLSAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvCi0gICAgYmVnaW4KKyAgICBmb3IgaSA6PSAxIHRvIG5QYXJhbUNvdW50IGRvIGJlZ2luCiAgICAgICBhcmcgOj0gUGFyYW1TdHIoIGkgKTsKICAgICAgIGFyZ3NbaS0xXSA6PSBhcmc7CiAgICAgZW5kOworCiAgICAgVFRlc3RTZXJ2ZXIuRXhlY3V0ZSggYXJncyApOwotICAgIFJlYWRsbjsKKwogICBleGNlcHQKLSAgICBvbiBFOiBFeGNlcHRpb24gZG8KKyAgICBvbiBFOiBFQWJvcnQgZG8gYmVnaW4KKyAgICAgIEV4aXRDb2RlIDo9ICRGRjsKKyAgICBlbmQ7CisgICAgb24gRTogRXhjZXB0aW9uIGRvIGJlZ2luCiAgICAgICBXcml0ZWxuKEUuQ2xhc3NOYW1lLCAnOiAnLCBFLk1lc3NhZ2UpOworICAgICAgRXhpdENvZGUgOj0gJEZGOworICAgIGVuZDsKICAgZW5kOwogZW5kLgogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM0OTM2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS5tZApAQCAtMCwwICsxLDExIEBACitUaGVzZSB0d28gcHJvamVjdHMgYmVsb25nIHRvZ2V0aGVyLiBCb3RoIHByb2dyYW1zCitzaW11bGF0ZSBzZXJ2ZXIgYW5kIGNsaWVudCBmb3IgZGlmZmVyZW50IHZlcnNpb25zCitvZiB0aGUgc2FtZSBwcm90b2NvbC4KKworVGhlIGludGVudGlvbiBvZiB0aGlzIHRlc3QgaXMgdG8gZW5zdXJlIGZ1bGx5Cit3b3JraW5nIGNvbXBhdGliaWxpdHkgZmVhdHVyZXMgb2YgdGhlIERlbHBoaSBUaHJpZnQKK2ltcGxlbWVudGF0aW9uLgorCitUaGUgZXhwZWN0ZWQgdGVzdCByZXN1bHQgaXMsIHRoYXQgbm8gZXJyb3JzIG9jY3VyCit3aXRoIGJvdGggcHJvZ3JhbXMsIHJlZ2FyZGxlc3MgaW4gd2hpY2ggb3JkZXIgdGhleQorbWlnaHQgYmUgc3RhcnRlZC4KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS50eHQgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQ1ZmY1Li4wMDAwMDAwCi0tLSBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1UaGVzZSB0d28gcHJvamVjdHMgYmVsb25nIHRvZ2V0aGVyLiBCb3RoIHByb2dyYW1zIAotc2ltdWxhdGUgc2VydmVyIGFuZCBjbGllbnQgZm9yIGRpZmZlcmVudCB2ZXJzaW9ucyAKLW9mIHRoZSBzYW1lIHByb3RvY29sLgotCi1UaGUgaW50ZW50aW9uIG9mIHRoaXMgdGVzdCBpcyB0byBlbnN1cmUgZnVsbHkKLXdvcmtpbmcgY29tcGF0aWJpbHR5IGZlYXR1cmVzIG9mIHRoZSBEZWxwaGkgVGhyaWZ0IAotaW1wbGVtZW50YXRpb24uCi0KLVRoZSBleHBlY3RlZCB0ZXN0IHJlc3VsdCBpcywgdGhhdCBubyBlcnJvcnMgb2NjdXIgCi13aXRoIGJvdGggcHJvZ3JhbXMsIHJlZ2FyZGxlc3MgaW4gd2hpY2ggb3JkZXIgdGhleSAKLW1pZ2h0IGJlIHN0YXJ0ZWQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKaW5kZXggZTg3M2YyOS4uODAzZDZiZCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgpAQCAtMjUsMTMgKzI1LDE1IEBACiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAogICBTa2lwdGVzdC5PbmUsCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAorICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKKyAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKIAogY29uc3QKQEAgLTQyLDcgKzQ0LDcgQEAKIGZ1bmN0aW9uIENyZWF0ZVBpbmcgOiBJUGluZzsKIGJlZ2luCiAgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOwotICByZXN1bHQuVmVyc2lvbjEgIDo9IFNraXB0ZXN0Lk9uZS5UQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzFDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CiBlbmQ7CiAKIApAQCAtOTUsNyArOTcsNyBAQAogICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKICAgICBjbGlSZWYgOj0gbmlsOwogICAgIHN0bS5GcmVlOwotICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHJlc3NlZH07CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CiAgIGVuZDsKIAogICBEZWxldGVGaWxlKCBmbmFtZStSRVFVRVNUX0VYVCk7CkBAIC0xMjIsNyArMTI0LDcgQEAKICAgICBjbGllbnQgOj0gbmlsOyAgLy8gbm90IEZyZWUhCiAgICAgY2xpUmVmIDo9IG5pbDsKICAgICBzdG0uRnJlZTsKLSAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXByZXNzZWR9OworICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHByZXNzZWR9OwogICBlbmQ7CiBlbmQ7CiAKQEAgLTE0OSw3ICsxNTEsNyBAQAogICAgIHNlcnZlciA6PSBuaWw7ICAvLyBub3QgRnJlZSEKICAgICBzdG1Jbi5GcmVlOwogICAgIHN0bU91dC5GcmVlOwotICAgIGlmIHNlcnZlciA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHJlc3NlZH07CisgICAgaWYgc2VydmVyID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CiAgIGVuZDsKIAogICBEZWxldGVGaWxlKCBmbmFtZStSRVNQT05TRV9FWFQpOwpAQCAtMTc3LDcgKzE3OSw3IEBACiAgIEZJTEVfSlNPTiAgID0gJ3Bpbmdwb25nLmpzb24nOwogYmVnaW4KICAgdHJ5Ci0gICAgV3JpdGVsbiggJ0RlbHBoaSBTa2lwVGVzdCAnK0ludFRvU3RyKFRDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04pKycgdXNpbmcgJytUaHJpZnQuVmVyc2lvbik7CisgICAgV3JpdGVsbiggJ0RlbHBoaSBTa2lwVGVzdCAnK0ludFRvU3RyKFRza2lwdGVzdF92ZXJzaW9uXzFDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT04pKycgdXNpbmcgJytUaHJpZnQuVmVyc2lvbik7CiAKICAgICBXcml0ZWxuOwogICAgIFdyaXRlbG4oJ0JpbmFyeSBwcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCmluZGV4IDc2MTUyNTEuLjYzM2IyNDcgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKQEAgLTI1LDEzICsyNSwxNSBAQAogICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywKICAgU2tpcHRlc3QuVHdvLAogICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKICAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCiAgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCi0gIFRocmlmdC5Db25zb2xlIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlxzcmNcVGhyaWZ0LlV0aWxzLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyc7CiAKIGNvbnN0CkBAIC00Myw3ICs0NSw3IEBACiAgICAgc2V0XyA6IElIYXNoU2V0PHN0cmluZz47CiBiZWdpbgogICByZXN1bHQgOj0gVFBpbmdJbXBsLkNyZWF0ZTsKLSAgcmVzdWx0LlZlcnNpb24xICA6PSBTa2lwdGVzdC5Ud28uVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKKyAgcmVzdWx0LlZlcnNpb24xICA6PSBUc2tpcHRlc3RfdmVyc2lvbl8yQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOwogICByZXN1bHQuQm9vbFZhbCAgIDo9IFRSVUU7CiAgIHJlc3VsdC5CeXRlVmFsICAgOj0gMjsKICAgcmVzdWx0LkRiVmFsICAgICA6PSAzOwpAQCAtMTIxLDcgKzEyMyw3IEBACiAgICAgY2xpZW50IDo9IG5pbDsgIC8vIG5vdCBGcmVlIQogICAgIGNsaVJlZiA6PSBuaWw7CiAgICAgc3RtLkZyZWU7Ci0gICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcmVzc2VkfTsKKyAgICBpZiBjbGllbnQgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKICAgZW5kOwogCiAgIERlbGV0ZUZpbGUoIGZuYW1lK1JFUVVFU1RfRVhUKTsKQEAgLTE0OSw3ICsxNTEsNyBAQAogICAgIGNsaWVudCA6PSBuaWw7ICAvLyBub3QgRnJlZSEKICAgICBjbGlSZWYgOj0gbmlsOwogICAgIHN0bS5GcmVlOwotICAgIGlmIGNsaWVudCA9IG5pbCB0aGVuIHt3YXJuaW5nIHN1cHJlc3NlZH07CisgICAgaWYgY2xpZW50ID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcHJlc3NlZH07CiAgIGVuZDsKIGVuZDsKIApAQCAtMTc2LDcgKzE3OCw3IEBACiAgICAgc2VydmVyIDo9IG5pbDsgIC8vIG5vdCBGcmVlIQogICAgIHN0bUluLkZyZWU7CiAgICAgc3RtT3V0LkZyZWU7Ci0gICAgaWYgc2VydmVyID0gbmlsIHRoZW4ge3dhcm5pbmcgc3VwcmVzc2VkfTsKKyAgICBpZiBzZXJ2ZXIgPSBuaWwgdGhlbiB7d2FybmluZyBzdXBwcmVzc2VkfTsKICAgZW5kOwogCiAgIERlbGV0ZUZpbGUoIGZuYW1lK1JFU1BPTlNFX0VYVCk7CkBAIC0yMDQsNyArMjA2LDcgQEAKICAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CiBiZWdpbgogICB0cnkKLSAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMkNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKIAogICAgIFdyaXRlbG47CiAgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE3YzdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgpAQCAtMCwwICsxLDkwIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3Byb2dyYW0gVGVzdFR5cGVSZWdpc3RyeTsKKworeyRBUFBUWVBFIENPTlNPTEV9CisKK3VzZXMKKyAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsIEdlbmVyaWNzLkNvbGxlY3Rpb25zLCBUeXBJbmZvLAorICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKKyAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKKyAgVGhyaWZ0LlByb3RvY29sIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCisgIFRocmlmdC5Qcm90b2NvbC5KU09OIGluICcuLlwuLlxzcmNcVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzJywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcycsCisgIFRocmlmdC5TZXJ2ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VydmVyLnBhcycsCisgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAorICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCisgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCisgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIERlYnVnUHJvdG9UZXN0OworCit0eXBlCisgIFRlc3RlcjxUIDogSUludGVyZmFjZT4gPSBjbGFzcworICBwdWJsaWMKKyAgICBjbGFzcyBwcm9jZWR1cmUgVGVzdDsKKyAgZW5kOworCitjbGFzcyBwcm9jZWR1cmUgVGVzdGVyPFQ+LlRlc3Q7Cit2YXIgaW5zdGFuY2UgOiBUOworICAgIG5hbWUgOiBzdHJpbmc7CitiZWdpbgorICBpbnN0YW5jZSA6PSBUeXBlUmVnaXN0cnkuQ29uc3RydWN0PFQ+OworICBuYW1lIDo9IEdldFR5cGVOYW1lKFR5cGVJbmZvKFQpKTsKKyAgaWYgaW5zdGFuY2UgPD4gbmlsCisgIHRoZW4gV3JpdGVsbiggbmFtZSwgJyA9IG9rJykKKyAgZWxzZSBiZWdpbgorICAgIFdyaXRlbG4oIG5hbWUsICcgPSBmYWlsZWQnKTsKKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCAnVGVzdCB3aXRoICcrbmFtZSsnIGZhaWxlZCEnKTsKKyAgZW5kOworZW5kOworCitiZWdpbgorICBXcml0ZWxuKCdUZXN0aW5nIC4uLicpOworICBUZXN0ZXI8SURvdWJsZXM+LlRlc3Q7CisgIFRlc3RlcjxJT25lT2ZFYWNoPi5UZXN0OworICBUZXN0ZXI8SUJvbms+LlRlc3Q7CisgIFRlc3RlcjxJTmVzdGluZz4uVGVzdDsKKyAgVGVzdGVyPElIb2x5TW9sZXk+LlRlc3Q7CisgIFRlc3RlcjxJQmFja3dhcmRzPi5UZXN0OworICBUZXN0ZXI8SUVtcHR5Pi5UZXN0OworICBUZXN0ZXI8SVdyYXBwZXI+LlRlc3Q7CisgIFRlc3RlcjxJUmFuZG9tU3R1ZmY+LlRlc3Q7CisgIFRlc3RlcjxJQmFzZTY0Pi5UZXN0OworICBUZXN0ZXI8SUNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q+LlRlc3Q7CisgIFRlc3RlcjxJU2luZ2xlTWFwVGVzdFN0cnVjdD4uVGVzdDsKKyAgVGVzdGVyPElCbG93VXA+LlRlc3Q7CisgIFRlc3RlcjxJUmV2ZXJzZU9yZGVyU3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SVN0cnVjdFdpdGhTb21lRW51bT4uVGVzdDsKKyAgVGVzdGVyPElUZXN0VW5pb24+LlRlc3Q7CisgIFRlc3RlcjxJVGVzdFVuaW9uTWludXNTdHJpbmdGaWVsZD4uVGVzdDsKKyAgVGVzdGVyPElDb21wYXJhYmxlVW5pb24+LlRlc3Q7CisgIFRlc3RlcjxJU3RydWN0V2l0aEFVbmlvbj4uVGVzdDsKKyAgVGVzdGVyPElQcmltaXRpdmVUaGVuU3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SVN0cnVjdFdpdGhBU29tZW1hcD4uVGVzdDsKKyAgVGVzdGVyPElCaWdGaWVsZElkU3RydWN0Pi5UZXN0OworICBUZXN0ZXI8SUJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2w+LlRlc3Q7CisgIFRlc3RlcjxJVHVwbGVQcm90b2NvbFRlc3RTdHJ1Y3Q+LlRlc3Q7CisgIFdyaXRlbG4oJ0NvbXBsZXRlZC4nKTsKKworCitlbmQuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvTWFrZWZpbGUuYW0gYi9saWIvZXJsL01ha2VmaWxlLmFtCmluZGV4IDk1MDUwMjQuLjA2MzIzYjQgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvTWFrZWZpbGUuYW0KKysrIGIvbGliL2VybC9NYWtlZmlsZS5hbQpAQCAtMTgsMjEgKzE4LDQ0IEBACiAjCiAKIFRIUklGVCA9IC4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVF9GSUxFUyA9ICQod2lsZGNhcmQgLi4vLi4vdGVzdC8qLnRocmlmdCkgXAotCQkJICAgJCh3aWxkY2FyZCB0ZXN0LyoudGhyaWZ0KQorVEhSSUZUX09NSVRfRklMRSA9IHRlc3QvVGhyaWZ0X29taXRfd2l0aG91dC50aHJpZnQKK1RIUklGVF9GSUxFUyA9ICQod2lsZGNhcmQgdGVzdC8qLnRocmlmdCkgXAorCQkgICQoVEhSSUZUX09NSVRfRklMRSkgXAorCQkgIC4uLy4uL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgXAorCQkgIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAotLmdlbmVyYXRlZDogJChUSFJJRlRfRklMRVMpCitpZiBFUkxBTkdfT1RQMTYKK0VSTF9GTEFHID0gZXJsOm90cDE2CitFUkxfRkxBR19MRUdBQ1kgPSBlcmw6b3RwMTYsbGVnYWN5bmFtZXMKKyMgb3RwMTYgKyBtYXBzIGRvZXMgbm90IG1ha2Ugc2Vuc2UuIFdlIG5lZWQgdG8gZ2VuZXJhdGUgaXQgYW55d2F5IHRvIGF2b2lkIGluY2x1ZGUgZXJyb3IuCitFUkxfRkxBR19NQVBTID0gZXJsOm90cDE2CitlbHNlCitFUkxfRkxBRyA9IGVybAorRVJMX0ZMQUdfTEVHQUNZID0gZXJsOmxlZ2FjeW5hbWVzCitFUkxfRkxBR19NQVBTID0gZXJsOm1hcHMKK2VuZGlmCisKKyQoVEhSSUZUX09NSVRfRklMRSk6IHRlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKKwlncmVwIC12IG9taXQgJDwgPiRACisKKy5nZW5lcmF0ZWQ6ICQoVEhSSUZUKSAkKFRIUklGVF9GSUxFUykKIAlmb3IgZiBpbiAkKFRIUklGVF9GSUxFUykgOyBkbyBcCi0JICAkKFRIUklGVCkgLS1nZW4gZXJsIC1vdXQgdGVzdCAkJGYgOyBcCi0JZG9uZSA7IFwKKwkJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHRlc3QgJCRmIDsgXAorCWRvbmUKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19MRUdBQ1kpIC1vIHRlc3QgdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gJChFUkxfRkxBR19NQVBTKSAtbyB0ZXN0IHRlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKIAl0b3VjaCAuZ2VuZXJhdGVkCiAKIGFsbDogLmdlbmVyYXRlZAotCS4vcmViYXIgZ2V0LWRlcHMKLQkuL3JlYmFyIGNvbXBpbGUKKwkkKFJFQkFSKSBnZXQtZGVwcworCSQoUkVCQVIpIGNvbXBpbGUKIAogY2hlY2s6IC5nZW5lcmF0ZWQKLQkuL3JlYmFyIGV1bml0CisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgZ2V0LWRlcHMKKwkkKFJFQkFSKSAtQyByZWJhci50ZXN0LmNvbmZpZyBjb21waWxlCisJJChSRUJBUikgLUMgcmViYXIudGVzdC5jb25maWcgc2tpcF9kZXBzPXRydWUgZXVuaXQKIAogaW5zdGFsbDogYWxsCiAJbWtkaXIgLXAgJChERVNURElSKSQoRVJMQU5HX0lOU1RBTExfTElCX0RJUl90aHJpZnQpIDsgXApAQCAtNDcsMzcgKzcwLDIyIEBACiAJcm0gLXJmICQoREVTVERJUikkKEVSTEFOR19JTlNUQUxMX0xJQl9ESVJfdGhyaWZ0KQogCiBjbGVhbjoKLQkuL3JlYmFyIGNsZWFuCi0Jcm0gLmdlbmVyYXRlZAotCXJtIC1mIHRlc3Qvc2Vjb25kU2VydmljZV8qIFwKLQkJICB0ZXN0L2FTZXJ2aWNlXyogXAotCQkgIHRlc3Qvc2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwXyogXAotCQkgIHRlc3QvYW5ub3RhdGlvblRlc3RfKiBcCi0JCSAgdGVzdC9zZXJ2aWNlXyogXAotCQkgIHRlc3QvY29uc3RhbnRzRGVtb18qIFwKLQkJICB0ZXN0L3NtYWxsU2VydmljZV8qIFwKLQkJICB0ZXN0L3NtYWxsVGVzdF8qIFwKLQkJICB0ZXN0L2RlYnVnUHJvdG9UZXN0XyogXAotCQkgIHRlc3Qvc3J2XyogXAotCQkgIHRlc3QvZGVuc2VMaW5raW5nVGVzdF8qIFwKLQkJICB0ZXN0L3N0cmVzc1Rlc3RfKiBcCi0JCSAgdGVzdC9kb2NUZXN0XyogXAotCQkgIHRlc3QvZW1wdHlTZXJ2aWNlXyogXAotCQkgIHRlc3QvaW5oZXJpdGVkXyogXAotCQkgIHRlc3QvamF2YUJlYW5zVGVzdF8qIFwKLQkJICB0ZXN0L3RocmlmdDExNTFfKiBcCi0JCSAgdGVzdC9qYXZhQmVhbnNUZXN0XyogXAotCQkgIHRlc3QvbWFueVR5cGVkZWZzXyogXAotCQkgIHRlc3QvdGhyaWZ0VGVzdF8qIFwKLQkJICB0ZXN0L29wdGlvbmFsUmVxdWlyZWRUZXN0XyogXAotCQkgIHRlc3QveW93emFfKiBcCi0JCSAgdGVzdC9yZXZlcnNlT3JkZXJTZXJ2aWNlXyogXAotCQkgIHRlc3QvbWFueU9wdGlvbmFsc18qCi0JLi9yZWJhciBjbGVhbgorCXJtIC1mIC5nZW5lcmF0ZWQKKwlybSAtcmYgdGVzdC9nZW4tZXJsLworCXJtIC1mICQoVEhSSUZUX09NSVRfRklMRSkKKwkkKFJFQkFSKSBjbGVhbgogCiBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgogCXJtIC1yZiBlYmluCiAKLUVYVFJBX0RJU1QgPSBpbmNsdWRlIHNyYyByZWJhciByZWJhci5jb25maWcgdGVzdAorRVhUUkFfRElTVCA9IFwKKwlpbmNsdWRlIFwKKwlzcmMgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCXJlYmFyLmNvbmZpZyBcCisJcmViYXIuY29uZmlnLnNjcmlwdCBcCisJcmViYXIudGVzdC5jb25maWcgXAorCXRlc3QgXAorCVJFQURNRS5tZAogCiBNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9saWIvZXJsL1JFQURNRSBiL2xpYi9lcmwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzA4MGRhLi4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotVGhyaWZ0IEVybGFuZyBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUV4YW1wbGUKLT09PT09PT0KLQotRXhhbXBsZSBzZXNzaW9uIHVzaW5nIHRocmlmdF9jbGllbnQ6Ci0KLTE+IHtvaywgQzB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygibG9jYWxob3N0IiwgOTA5MCwgdGhyaWZ0VGVzdF90aHJpZnQsIFtdKSwgb2suCi1vawotMj4ge0MxLCBSMX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzAsIHRlc3RWb2lkLCBbXSksIFIxLgote29rLG9rfQotMz4ge0MyLCBSMn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQzEsIHRlc3RWb2lkLCBbYXNkZl0pLCBSMi4KLXtlcnJvcix7YmFkX2FyZ3MsdGVzdFZvaWQsW2FzZGZdfX0KLTQ+IHtDMywgUjN9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMyLCB0ZXN0STMyLCBbMTIzXSksIFIzLgote29rLDEyM30KLTU+IHtDNCwgUjR9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMzLCB0ZXN0T25ld2F5LCBbMV0pLCBSNC4KLXtvayxva30KLTY+IHtDNSwgUjV9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEM0LCB0ZXN0WGNlcHRpb24sIFsiZm9vIl0pLCBSNS4KLXtlcnJvcix7bm9fZnVuY3Rpb24sdGVzdFhjZXB0aW9ufX0KLTc+IHtDNiwgUjZ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEM1LCB0ZXN0RXhjZXB0aW9uLCBbImZvbyJdKSwgUjYuCi17b2ssb2t9Ci04PiB7QzcsIFI3fSA9IChjYXRjaCB0aHJpZnRfY2xpZW50OmNhbGwoQzYsIHRlc3RFeGNlcHRpb24sIFsiWGNlcHRpb24iXSkpLCBSNy4KLXtleGNlcHRpb24se3hjZXB0aW9uLDEwMDEsPDwiWGNlcHRpb24iPj59fQotCi1Ob3RlcwotPT09PT0KLVRvIHVzZSB0aGUgSlNPTiBwcm90b2NvbCBjbGllbnQsIHlvdSB3aWxsIG5lZWQganN4LiAgVGhpcyB3aWxsIGJlIHB1bGxlZCBpbgotdmlhIHJlYmFyIGZvciBidWlsZGluZyBidXQgbm90IGF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGJ5IG1ha2UgaW5zdGFsbC4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvUkVBRE1FLm1kIGIvbGliL2VybC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzZDA1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTEgQEAKKyMgVGhyaWZ0IEVybGFuZyBTb2Z0d2FyZSBMaWJyYXJ5ICMKKworIyMgTGljZW5zZSAjIworCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworIyMgUmVsZWFzZSBOb3RlcyAjIworCisjIyMgMC45LjIgIyMjCisKK2FzIG9mIDAuOS4yIHN0cnVjdCBhbmQgZnVuY3Rpb24gbmFtaW5nIGNvbnZlbnRpb25zIGhhdmUgY2hhbmdlZC4gdG8gcmV0YWluIHRoZQorb2xkIG5hbWluZyBjb252ZW50aW9ucyAoZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSB1c2UgdGhlIGNvbXBpbGVyIG9wdGlvbgorYGxlZ2FjeW5hbWVzYAorCisjIyBFeGFtcGxlICMjCisKK0V4YW1wbGUgc2Vzc2lvbiB1c2luZyB0aHJpZnRfY2xpZW50OgorCitgYGBlcmwKKzE+IHtvaywgQzB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygibG9jYWxob3N0IiwgOTA5MCwgdGhyaWZ0X3Rlc3RfdGhyaWZ0LCBbXSksIG9rLgorb2sKKzI+IHtDMSwgUjF9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMwLCB0ZXN0Vm9pZCwgW10pLCBSMS4KK3tvayxva30KKzM+IHtDMiwgUjJ9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKEMxLCB0ZXN0Vm9pZCwgW2FzZGZdKSwgUjIuCit7ZXJyb3Ise2JhZF9hcmdzLHRlc3RWb2lkLFthc2RmXX19Cis0PiB7QzMsIFIzfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMiwgdGVzdEkzMiwgWzEyM10pLCBSMy4KK3tvaywxMjN9Cis1PiB7QzQsIFI0fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDMywgdGVzdE9uZXdheSwgWzFdKSwgUjQuCit7b2ssb2t9Cis2PiB7QzUsIFI1fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDNCwgdGVzdFhjZXB0aW9uLCBbImZvbyJdKSwgUjUuCit7ZXJyb3Ise25vX2Z1bmN0aW9uLHRlc3RYY2VwdGlvbn19Cis3PiB7QzYsIFI2fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDNSwgdGVzdEV4Y2VwdGlvbiwgWyJmb28iXSksIFI2Lgore29rLG9rfQorOD4ge0M3LCBSN30gPSAoY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKEM2LCB0ZXN0RXhjZXB0aW9uLCBbIlhjZXB0aW9uIl0pKSwgUjcuCit7ZXhjZXB0aW9uLHt4Y2VwdGlvbiwxMDAxLDw8IlhjZXB0aW9uIj4+fX0KK2BgYApkaWZmIC0tZ2l0IGEvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzdkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSwzIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKworUGFydGljdWxhcmx5IGZvciBFcmxhbmcgcGxlYXNlIGZvbGxvdyB0aGUgRXJsYW5nIFtQcm9ncmFtbWluZyBSdWxlcyBhbmQgQ29udmVudGlvbnNdKGh0dHA6Ly93d3cuZXJsYW5nLnNlL2RvYy9wcm9ncmFtbWluZ19ydWxlcy5zaHRtbCkuIApkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsIGIvbGliL2VybC9pbmNsdWRlL3RocmlmdF9jb25zdGFudHMuaHJsCmluZGV4IDYxZDhlMWEuLjdjYjI5ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfY29uc3RhbnRzLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X2NvbnN0YW50cy5ocmwKQEAgLTIyLDYgKzIyLDcgQEAKIC1kZWZpbmUodFR5cGVfVk9JRCwgMSkuCiAtZGVmaW5lKHRUeXBlX0JPT0wsIDIpLgogLWRlZmluZSh0VHlwZV9CWVRFLCAzKS4KKy1kZWZpbmUodFR5cGVfSTgsIDMpLgogLWRlZmluZSh0VHlwZV9ET1VCTEUsIDQpLgogLWRlZmluZSh0VHlwZV9JMTYsIDYpLgogLWRlZmluZSh0VHlwZV9JMzIsIDgpLgpAQCAtNTMsNCArNTQsOSBAQAogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fTUlTU0lOR19SRVNVTFQsIDUpLgogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5URVJOQUxfRVJST1IsIDYpLgogLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fUFJPVE9DT0xfRVJST1IsIDcpLgorLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9UUkFOU0ZPUk0sIDgpLgorLWRlZmluZShUQXBwbGljYXRpb25FeGNlcHRpb25fSU5WQUxJRF9QUk9UT0NPTCwgOSkuCistZGVmaW5lKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbl9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRSwgMTApLgogCistZGVmaW5lIChNVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiwgIjoiKS4KKy1kZWZpbmUgKE1VTFRJUExFWEVEX0VSUk9SX0hBTkRMRVJfS0VZLCAiZXJyb3JfaGFuZGxlciIpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC9pbmNsdWRlL3RocmlmdF9wcm90b2NvbC5ocmwgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybAppbmRleCBmODVmNDU1Li5iYzBhY2M4IDEwMDY0NAotLS0gYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybAorKysgYi9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybApAQCAtMjAsMTIgKzIwLDEyIEBACiAtaWZuZGVmKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCkuCiAtZGVmaW5lKFRIUklGVF9QUk9UT0NPTF9JTkNMVURFRCwgdHJ1ZSkuCiAKLS1yZWNvcmQocHJvdG9jb2xfbWVzc2FnZV9iZWdpbiwge25hbWUsIHR5cGUsIHNlcWlkfSkuCi0tcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWV9KS4KLS1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lLCB0eXBlLCBpZH0pLgotLXJlY29yZChwcm90b2NvbF9tYXBfYmVnaW4sIHtrdHlwZSwgdnR5cGUsIHNpemV9KS4KLS1yZWNvcmQocHJvdG9jb2xfbGlzdF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCi0tcmVjb3JkKHByb3RvY29sX3NldF9iZWdpbiwge2V0eXBlLCBzaXplfSkuCistcmVjb3JkKHByb3RvY29sX21lc3NhZ2VfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgc2VxaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX3N0cnVjdF9iZWdpbiwge25hbWUgOjogc3RyaW5nKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfZmllbGRfYmVnaW4sIHtuYW1lIDo6IHN0cmluZygpLCB0eXBlIDo6IGludGVnZXIoKSwgaWQgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX21hcF9iZWdpbiwge2t0eXBlIDo6IGludGVnZXIoKSwgdnR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9saXN0X2JlZ2luLCB7ZXR5cGUgOjogaW50ZWdlcigpLCBzaXplIDo6IGludGVnZXIoKX0pLgorLXJlY29yZChwcm90b2NvbF9zZXRfYmVnaW4sIHtldHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCiAKIC10eXBlIHRwcm90X2hlYWRlcl92YWwoKSA6OiAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgI3Byb3RvY29sX3N0cnVjdF9iZWdpbnt9CmRpZmYgLS1naXQgYS9saWIvZXJsL3JlYmFyIGIvbGliL2VybC9yZWJhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTM0MTllYS4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3JlYmFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2VybC9yZWJhci5jb25maWcgYi9saWIvZXJsL3JlYmFyLmNvbmZpZwppbmRleCAyNzI4Y2IzLi4xZWExOGE0IDEwMDY0NAotLS0gYS9saWIvZXJsL3JlYmFyLmNvbmZpZworKysgYi9saWIvZXJsL3JlYmFyLmNvbmZpZwpAQCAtMSw1ICsxIEBACi17ZXJsX29wdHMsIFtkZWJ1Z19pbmZvXX0uCi17bGliX2RpcnMsIFsiZGVwcyJdfS4KLXtkZXBzLCBbCi0gICAgICAgICB7IGpzeCwgIjEuMi4xIiwge2dpdCwgImdpdDovL2dpdGh1Yi5jb20vdGFsZW50ZGVmaWNpdC9qc3guZ2l0Iiwge3RhZywgInYxLjIuMSJ9fX0KLSAgICAgICBdfS4KK3tlcmxfb3B0cywgW3twbGF0Zm9ybV9kZWZpbmUsICJeUi4qIiwgb3RwMTZfb3JfbGVzc30sIGRlYnVnX2luZm9dfS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdCBiL2xpYi9lcmwvcmViYXIuY29uZmlnLnNjcmlwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzMzODIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9yZWJhci5jb25maWcuc2NyaXB0CkBAIC0wLDAgKzEsNyBAQAorRGVmMCA9IGNhc2Ugbm90IGVybGFuZzppc19idWlsdGluKGVybGFuZywgbW9ub3RvbmljX3RpbWUsIDApIG9mCisgICAgICAgICAgIHRydWUgLT4gW107CisgICAgICAgICAgIGZhbHNlIC0+IFt7ZCwgdGltZV9jb3JyZWN0aW9ufV0KKyAgICAgICBlbmQsCitEZWZzID0gRGVmMCwKK2xpc3RzOmtleXN0b3JlKGVybF9vcHRzLCAxLCBDT05GSUcsCisgICAgICAgICAgICAgICB7ZXJsX29wdHMsIHByb3BsaXN0czpnZXRfdmFsdWUoZXJsX29wdHMsIENPTkZJRywgW10pICsrIERlZnN9KS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjJhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCkBAIC0wLDAgKzEsNSBAQAore2VybF9vcHRzLCBbe3BsYXRmb3JtX2RlZmluZSwgIl5SLioiLCBvdHAxNl9vcl9sZXNzfSwgZGVidWdfaW5mb119LgorCit7ZGVwcywgWworICB7bWVjaywgIiIsIHtnaXQsICJodHRwczovL2dpdGh1Yi5jb20vZXByb3h1cy9tZWNrLmdpdCIsIHt0YWcsICIwLjguOSJ9fX0KK119LgpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0LmFwcC5zcmMgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwppbmRleCBmZDU1NmI0Li5iM2IyMjVmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYworKysgYi9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYwpAQCAtMTcsMTcgKzE3LDM4IEBACiAlJSB1bmRlciB0aGUgTGljZW5zZS4KICUlCiAlJSUgLSotIG1vZGU6ZXJsYW5nIC0qLQote2FwcGxpY2F0aW9uLCB0aHJpZnQsCi0gWwore2FwcGxpY2F0aW9uLCB0aHJpZnQsIFsKICAgJSBBIHF1aWNrIGRlc2NyaXB0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KICAge2Rlc2NyaXB0aW9uLCAiVGhyaWZ0IGJpbmRpbmdzIn0sCiAKICAgJSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRvbgotICB7dnNuLCAiMC45LjAifSwKKyAge3ZzbiwgIjEuMC4wIn0sCiAKICAgJSBBbGwgbW9kdWxlcyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAge21vZHVsZXMsIFsKLSAgIF19LAorICAgIHRocmlmdF9iYXNlNjRfdHJhbnNwb3J0LAorICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2wsCisgICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfY2xpZW50X3V0aWwsCisgICAgdGhyaWZ0X2NsaWVudCwKKyAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0LAorICAgIHRocmlmdF9maWxlX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydCwKKyAgICB0aHJpZnRfaHR0cF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X2pzb25fcGFyc2VyLAorICAgIHRocmlmdF9qc29uX3Byb3RvY29sLAorICAgIHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0LAorICAgIHRocmlmdF9tZW1vcnlfYnVmZmVyLAorICAgIHRocmlmdF9wcm9jZXNzb3IsCisgICAgdGhyaWZ0X3Byb3RvY29sLAorICAgIHRocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LAorICAgIHRocmlmdF9zZXJ2ZXIsCisgICAgdGhyaWZ0X3NlcnZpY2UsCisgICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXIsCisgICAgdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQsCisgICAgdGhyaWZ0X3RyYW5zcG9ydF9zdGF0ZV90ZXN0LAorICAgIHRocmlmdF90cmFuc3BvcnQKKyAgXX0sCiAKICAgJSBBbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbmFtZXMgdGhlIGFwcGxpY2F0aW9uIHVzZXMuIFRoaXMgY2FuIGJlIGlnbm9yZWQuCiAgIHtyZWdpc3RlcmVkLCBbXX0sCkBAIC0zNSwxMSArNTYsNyBAQAogICAlIEFwcGxpY2F0aW9ucyB0aGF0IGFyZSB0byBiZSBzdGFydGVkIHByaW9yIHRvIHRoaXMgb25lLiBUaGlzIGNhbiBiZSBpZ25vcmVkCiAgICUgbGVhdmUgaXQgYWxvbmUgdW5sZXNzIHlvdSB1bmRlcnN0YW5kIGl0IHdlbGwgYW5kIGxldCB0aGUgLnJlbCBmaWxlcyBpbgogICAlIHlvdXIgcmVsZWFzZSBoYW5kbGUgdGhpcy4KLSAge2FwcGxpY2F0aW9ucywKLSAgIFsKLSAgICBrZXJuZWwsCi0gICAgc3RkbGliCi0gICBdfSwKKyAge2FwcGxpY2F0aW9ucywgW2tlcm5lbCwgc3RkbGliXX0sCiAKICAgJSBPVFAgYXBwbGljYXRpb24gbG9hZGVyIHdpbGwgbG9hZCwgYnV0IG5vdCBzdGFydCwgaW5jbHVkZWQgYXBwcy4gQWdhaW4KICAgJSB0aGlzIGNhbiBiZSBpZ25vcmVkIGFzIHdlbGwuICBUbyBsb2FkIGJ1dCBub3Qgc3RhcnQgYW4gYXBwbGljYXRpb24gaXQKQEAgLTQ5LDEwICs2Niw5IEBACiAgICUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIHNpbWlsYXIgdG8gdGhvc2UgaW4gdGhlIGNvbmZpZyBmaWxlIHNwZWNpZmllZAogICAlIG9uIHRoZSBjb21tYW5kIGxpbmUuIGNhbiBiZSBmZXRjaGVkIHdpdGggZ2FzOmdldF9lbnYKICAge2VudiwgWwotICAgICAgICAgJSBJZiBhbiBlcnJvci9jcmFzaCBvY2N1cnMgZHVyaW5nIHByb2Nlc3Npbmcgb2YgYSBmdW5jdGlvbiwKLSAgICAgICAgICUgc2hvdWxkIHRoZSBUQXBwbGljYXRpb25FeGNlcHRpb24gc2VyaWFsaXplZCBiYWNrIHRvIHRoZSBjbGllbnQKLSAgICAgICAgICUgaW5jbHVkZSB0aGUgZXJsYW5nIGJhY2t0cmFjZT8KLSAgICAgICAgIHtleGNlcHRpb25zX2luY2x1ZGVfdHJhY2VzLCB0cnVlfQorICAgICUgSWYgYW4gZXJyb3IvY3Jhc2ggb2NjdXJzIGR1cmluZyBwcm9jZXNzaW5nIG9mIGEgZnVuY3Rpb24sCisgICAgJSBzaG91bGQgdGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzZXJpYWxpemVkIGJhY2sgdG8gdGhlIGNsaWVudAorICAgICUgaW5jbHVkZSB0aGUgZXJsYW5nIGJhY2t0cmFjZT8KKyAgICB7ZXhjZXB0aW9uc19pbmNsdWRlX3RyYWNlcywgdHJ1ZX0KICAgXX0KLSBdCi19LgorXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuZXJsCmluZGV4IDgwMGZkOGUuLjg1YWJiNjIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuZXJsCkBAIC0zMzMsMTEgKzMzMywxNSBAQAogbmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgT3B0aW9ucykgLT4KICAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICN0YnBfb3B0c3t9KSwKICAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSBUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoCi0gICAgICAgICAgICAgICAgICBUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICBbe3N0cmljdF9yZWFkLCAgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3RfcmVhZH0sCi0gICAgICAgICAgICAgICAgICAge3N0cmljdF93cml0ZSwgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3Rfd3JpdGV9XSkKKyAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0RmFjdG9yeSgpIG9mCisgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7c3RyaWN0X3JlYWQsICBQYXJzZWRPcHRzI3RicF9vcHRzLnN0cmljdF9yZWFkfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmljdF93cml0ZSwgUGFyc2VkT3B0cyN0YnBfb3B0cy5zdHJpY3Rfd3JpdGV9XSk7CisgICAgICAgICAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQorICAgICAgICAgICAgICAgIGVuZAogICAgICAgICBlbmQsCiAgICAge29rLCBGfS4KIApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybAppbmRleCBkNGQ2MTRlLi5lOWQzZmZmIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmVybApAQCAtMjEsNTcgKzIxLDc4IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLSUlIEFQSQotLWV4cG9ydChbbmV3LzEsIG5ld190cmFuc3BvcnRfZmFjdG9yeS8xXSkuCislJSBjb25zdHJ1Y3RvcgorLWV4cG9ydChbbmV3LzFdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8xXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChidWZmZXJlZF90cmFuc3BvcnQsIHt3cmFwcGVkLCAlIGEgdGhyaWZ0X3RyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgJSBpb2xpc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgotLXR5cGUgc3RhdGUoKSA6OiAjYnVmZmVyZWRfdHJhbnNwb3J0e30uCistcmVjb3JkKHRfYnVmZmVyZWQsIHsKKyAgd3JhcHBlZCwKKyAgd3JpdGVfYnVmZmVyCit9KS4KKworLXR5cGUgc3RhdGUoKSA6OiAjdF9idWZmZXJlZHt9LgorCisKKy1zcGVjIG5ldyhUcmFuc3BvcnQ6OnRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKSkgLT4KKyAgdGhyaWZ0X3RyYW5zcG9ydDp0X3RyYW5zcG9ydCgpLgorCituZXcoV3JhcHBlZCkgLT4KKyAgU3RhdGUgPSAjdF9idWZmZXJlZHsKKyAgICB3cmFwcGVkID0gV3JhcHBlZCwKKyAgICB3cml0ZV9idWZmZXIgPSBbXQorICB9LAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisKKwogLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgogCiAKLW5ldyhXcmFwcGVkVHJhbnNwb3J0KSAtPgotICAgIFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnVmZmVyID0gW119LAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKyUlIHJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAorcmVhZChTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWQsIExlbiksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIFJlc3BvbnNlfS4KIAogCi0lJSBXcml0ZXMgZGF0YSBpbnRvIHRoZSBidWZmZXIKLXdyaXRlKFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cml0ZV9idWZmZXIgPSBXQnVmfSwgRGF0YSkgLT4KLSAgICB7U3RhdGUjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFtXQnVmLCBEYXRhXX0sIG9rfS4KKyUlIHJlYWRzIGRhdGEgdGhyb3VnaCBmcm9tIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2J1ZmZlcmVke3dyYXBwZWQgPSBXcmFwcGVkfSwgTGVuKQord2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgIHtOZXdTdGF0ZSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDpyZWFkX2V4YWN0KFdyYXBwZWQsIExlbiksCisgIHtTdGF0ZSN0X2J1ZmZlcmVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIFJlc3BvbnNlfS4KIAotJSUgRmx1c2hlcyB0aGUgYnVmZmVyIHRocm91Z2ggdG8gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1mbHVzaChTdGF0ZSA9ICNidWZmZXJlZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgotICAgIHtXcmFwcGVkMSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkMCwgV0J1ZiksCi0gICAge1dyYXBwZWQyLCBffSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JhcHBlZDEpLAotICAgIE5ld1N0YXRlID0gU3RhdGUjYnVmZmVyZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBXcmFwcGVkMn0sCi0gICAge05ld1N0YXRlLCBSZXNwb25zZX0uCiAKLSUlIENsb3NlcyB0aGUgdHJhbnNwb3J0IGFuZCB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWNsb3NlKFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgotICAgIHtXcmFwcGVkMSwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZDApLAotICAgIE5ld1N0YXRlID0gU3RhdGUjYnVmZmVyZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMX0sCi0gICAge05ld1N0YXRlLCBSZXN1bHR9Lgord3JpdGUoU3RhdGUgPSAjdF9idWZmZXJlZHt3cml0ZV9idWZmZXIgPSBCdWZmZXJ9LCBEYXRhKSAtPgorICB7U3RhdGUjdF9idWZmZXJlZHt3cml0ZV9idWZmZXIgPSBbQnVmZmVyLCBEYXRhXX0sIG9rfS4KIAotJSUgUmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1yZWFkKFN0YXRlID0gI2J1ZmZlcmVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDB9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAge1dyYXBwZWQxLCBSZXNwb25zZX0gPSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZDAsIExlbiksCi0gICAgTmV3U3RhdGUgPSBTdGF0ZSNidWZmZXJlZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxfSwKLSAgICB7TmV3U3RhdGUsIFJlc3BvbnNlfS4KKworZmx1c2goU3RhdGUgPSAjdF9idWZmZXJlZHt3cmFwcGVkID0gV3JhcHBlZCwgd3JpdGVfYnVmZmVyID0gQnVmZmVyfSkgLT4KKyAgY2FzZSBpb2xpc3Rfc2l6ZShCdWZmZXIpIG9mCisgICAgJSUgaWYgd3JpdGUgYnVmZmVyIGlzIGVtcHR5LCBkbyBub3RoaW5nCisgICAgMCAtPiB7U3RhdGUsIG9rfTsKKyAgICBfIC0+CisgICAgICB7V3JpdHRlbiwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkLCBCdWZmZXIpLAorICAgICAge0ZsdXNoZWQsIG9rfSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goV3JpdHRlbiksCisgICAgICB7U3RhdGUjdF9idWZmZXJlZHt3cmFwcGVkID0gRmx1c2hlZCwgd3JpdGVfYnVmZmVyID0gW119LCBSZXNwb25zZX0KKyAgZW5kLgorCisKK2Nsb3NlKFN0YXRlID0gI3RfYnVmZmVyZWR7d3JhcHBlZCA9IFdyYXBwZWR9KSAtPgorICB7Q2xvc2VkLCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShXcmFwcGVkKSwKKyAge1N0YXRlI3RfYnVmZmVyZWR7d3JhcHBlZCA9IENsb3NlZH0sIFJlc3VsdH0uCisKIAogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJSUlIEludGVybmFsIGZ1bmN0aW9ucwogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQogbmV3X3RyYW5zcG9ydF9mYWN0b3J5KFdyYXBGYWN0b3J5KSAtPgotICAgIEYgPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgIHtvaywgV3JhcHBlZH0gPSBXcmFwRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgIG5ldyhXcmFwcGVkKQotICAgICAgICBlbmQsCi0gICAge29rLCBGfS4KKyAgRiA9IGZ1bigpIC0+CisgICAge29rLCBXcmFwcGVkfSA9IFdyYXBGYWN0b3J5KCksCisgICAgbmV3KFdyYXBwZWQpCisgIGVuZCwKKyAge29rLCBGfS4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybAppbmRleCA1Yzc0YWRjLi4xYTljYjUwIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50LmVybApAQCAtMzYsMTMgKzM2LDEyIEBACiAKIC1zcGVjIGNhbGwoI3RjbGllbnR7fSwgYXRvbSgpLCBsaXN0KCkpIC0+IHsjdGNsaWVudHt9LCB7b2ssIGFueSgpfSB8IHtlcnJvciwgYW55KCl9fS4KIGNhbGwoQ2xpZW50ID0gI3RjbGllbnR7fSwgRnVuY3Rpb24sIEFyZ3MpCi0gIHdoZW4gaXNfYXRvbShGdW5jdGlvbiksIGlzX2xpc3QoQXJncykgLT4KLSAgICBjYXNlIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKSBvZgotICAgICAgICB7Q2xpZW50MSwgb2t9IC0+Ci0gICAgICAgICAgICByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdChDbGllbnQxLCBGdW5jdGlvbik7Ci0gICAgICAgIEVsc2UgLT4KLSAgICAgICAgICAgIEVsc2UKLSAgICBlbmQuCit3aGVuIGlzX2F0b20oRnVuY3Rpb24pLCBpc19saXN0KEFyZ3MpIC0+CisgIGNhc2Ugc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCwgRnVuY3Rpb24sIEFyZ3MpIG9mCisgICAge29rLCBDbGllbnQxfSAtPiByZWNlaXZlX2Z1bmN0aW9uX3Jlc3VsdChDbGllbnQxLCBGdW5jdGlvbik7CisgICAge3tlcnJvciwgWH0sIENsaWVudDF9IC0+IHtDbGllbnQxLCB7ZXJyb3IsIFh9fTsKKyAgICBFbHNlIC0+IEVsc2UKKyAgZW5kLgogCiAKICUlIFNlbmRzIGEgZnVuY3Rpb24gY2FsbCBidXQgZG9lcyBub3QgcmVhZCB0aGUgcmVzdWx0LiBUaGlzIGlzIHVzZWZ1bApAQCAtNTEsNyArNTAsMTAgQEAKIC1zcGVjIHNlbmRfY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4geyN0Y2xpZW50e30sIG9rfS4KIHNlbmRfY2FsbChDbGllbnQgPSAjdGNsaWVudHt9LCBGdW5jdGlvbiwgQXJncykKICAgd2hlbiBpc19hdG9tKEZ1bmN0aW9uKSwgaXNfbGlzdChBcmdzKSAtPgotICAgIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKS4KKyAgICBjYXNlIHNlbmRfZnVuY3Rpb25fY2FsbChDbGllbnQsIEZ1bmN0aW9uLCBBcmdzKSBvZgorICAgICAge29rLCBDbGllbnQxfSAtPiB7Q2xpZW50MSwgb2t9OworICAgICAgRWxzZSAtPiBFbHNlCisgICAgZW5kLgogCiAtc3BlYyBjbG9zZSgjdGNsaWVudHt9KSAtPiBvay4KIGNsb3NlKCN0Y2xpZW50e3Byb3RvY29sPVByb3RvY29sfSkgLT4KQEAgLTYxLDI4ICs2Myw0MCBAQAogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJSUlIEludGVybmFsIGZ1bmN0aW9ucwogJSUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLXNwZWMgc2VuZF9mdW5jdGlvbl9jYWxsKCN0Y2xpZW50e30sIGF0b20oKSwgbGlzdCgpKSAtPiB7I3RjbGllbnR7fSwgb2sgfCB7ZXJyb3IsIGFueSgpfX0uCi1zZW5kX2Z1bmN0aW9uX2NhbGwoQ2xpZW50ID0gI3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSAgPSBTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkICAgID0gU2VxSWR9LAotICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgIEFyZ3MpIC0+Ci0gICAgUGFyYW1zID0gU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCBwYXJhbXNfdHlwZSksCi0gICAgY2FzZSBQYXJhbXMgb2YKLSAgICAgICAgbm9fZnVuY3Rpb24gLT4KLSAgICAgICAgICAgIHtDbGllbnQsIHtlcnJvciwge25vX2Z1bmN0aW9uLCBGdW5jdGlvbn19fTsKLSAgICAgICAge3N0cnVjdCwgUExpc3R9IHdoZW4gbGVuZ3RoKFBMaXN0KSA9Lz0gbGVuZ3RoKEFyZ3MpIC0+Ci0gICAgICAgICAgICB7Q2xpZW50LCB7ZXJyb3IsIHtiYWRfYXJncywgRnVuY3Rpb24sIEFyZ3N9fX07Ci0gICAgICAgIHtzdHJ1Y3QsIF9QTGlzdH0gLT4KLSAgICAgICAgICAgIEJlZ2luID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSA/dE1lc3NhZ2VUeXBlX0NBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9LAotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMCwgQmVnaW4pLAotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvMSwge1BhcmFtcywgbGlzdF90b190dXBsZShbRnVuY3Rpb24gfCBBcmdzXSl9KSwKLSAgICAgICAgICAgIHtQcm90bzMsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90bzIsIG1lc3NhZ2VfZW5kKSwKLSAgICAgICAgICAgIHtQcm90bzQsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQoUHJvdG8zKSwKLSAgICAgICAgICAgIHtDbGllbnQjdGNsaWVudHtwcm90b2NvbCA9IFByb3RvNH0sIG9rfQotICAgIGVuZC4KKy1zcGVjIHNlbmRfZnVuY3Rpb25fY2FsbCgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSkgLT4ge29rIHwge2Vycm9yLCBhbnkoKX0sICN0Y2xpZW50e319Lgorc2VuZF9mdW5jdGlvbl9jYWxsKENsaWVudCA9ICN0Y2xpZW50e3NlcnZpY2UgPSBTZXJ2aWNlfSwgRnVuY3Rpb24sIEFyZ3MpIC0+CisgIHtQYXJhbXMsIFJlcGx5fSA9IHRyeQorICAgIHtTZXJ2aWNlOmZ1bmN0aW9uX2luZm8oRnVuY3Rpb24sIHBhcmFtc190eXBlKSwgU2VydmljZTpmdW5jdGlvbl9pbmZvKEZ1bmN0aW9uLCByZXBseV90eXBlKX0KKyAgY2F0Y2ggZXJyb3I6ZnVuY3Rpb25fY2xhdXNlIC0+IHtub19mdW5jdGlvbiwgMH0KKyAgZW5kLAorICBNc2dUeXBlID0gY2FzZSBSZXBseSBvZgorICAgIG9uZXdheV92b2lkIC0+ID90TWVzc2FnZVR5cGVfT05FV0FZOworICAgIF8gLT4gP3RNZXNzYWdlVHlwZV9DQUxMCisgIGVuZCwKKyAgY2FzZSBQYXJhbXMgb2YKKyAgICBub19mdW5jdGlvbiAtPgorICAgICAge3tlcnJvciwge25vX2Z1bmN0aW9uLCBGdW5jdGlvbn19LCBDbGllbnR9OworICAgIHtzdHJ1Y3QsIFBMaXN0fSB3aGVuIGxlbmd0aChQTGlzdCkgPS89IGxlbmd0aChBcmdzKSAtPgorICAgICAge3tlcnJvciwge2JhZF9hcmdzLCBGdW5jdGlvbiwgQXJnc319LCBDbGllbnR9OworICAgIHtzdHJ1Y3QsIF9QTGlzdH0gLT4gd3JpdGVfbWVzc2FnZShDbGllbnQsIEZ1bmN0aW9uLCBBcmdzLCBQYXJhbXMsIE1zZ1R5cGUpCisgIGVuZC4KKworLXNwZWMgd3JpdGVfbWVzc2FnZSgjdGNsaWVudHt9LCBhdG9tKCksIGxpc3QoKSwge3N0cnVjdCwgbGlzdCgpfSwgaW50ZWdlcigpKSAtPgorICB7b2sgfCB7ZXJyb3IsIGFueSgpfSwgI3RjbGllbnR7fX0uCit3cml0ZV9tZXNzYWdlKENsaWVudCA9ICN0Y2xpZW50e3Byb3RvY29sID0gUDAsIHNlcWlkID0gU2VxfSwgRnVuY3Rpb24sIEFyZ3MsIFBhcmFtcywgTXNnVHlwZSkgLT4KKyAgdHJ5CisgICAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgbmFtZSA9IGF0b21fdG9fbGlzdChGdW5jdGlvbiksCisgICAgICB0eXBlID0gTXNnVHlwZSwKKyAgICAgIHNlcWlkID0gU2VxCisgICAgfSksCisgICAge1AyLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDEsIHtQYXJhbXMsIGxpc3RfdG9fdHVwbGUoW0Z1bmN0aW9ufEFyZ3NdKX0pLAorICAgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCBtZXNzYWdlX2VuZCksCisgICAge1A0LCBva30gPSB0aHJpZnRfcHJvdG9jb2w6Zmx1c2hfdHJhbnNwb3J0KFAzKSwKKyAgICB7b2ssIENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUDR9fQorICBjYXRjaAorICAgIGVycm9yOntiYWRtYXRjaCwge18sIHtlcnJvciwgX30gPSBFcnJvcn19IC0+IHtFcnJvciwgQ2xpZW50fQorICBlbmQuCiAKIC1zcGVjIHJlY2VpdmVfZnVuY3Rpb25fcmVzdWx0KCN0Y2xpZW50e30sIGF0b20oKSkgLT4geyN0Y2xpZW50e30sIHtvaywgYW55KCl9IHwge2Vycm9yLCBhbnkoKX19LgogcmVjZWl2ZV9mdW5jdGlvbl9yZXN1bHQoQ2xpZW50ID0gI3RjbGllbnR7c2VydmljZSA9IFNlcnZpY2V9LCBGdW5jdGlvbikgLT4KQEAgLTk2LDE3ICsxMTAsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkICAgID0gU2VxSWR9LAogICAgICAgICAgICAgRnVuY3Rpb24sCiAgICAgICAgICAgICBSZXBseVR5cGUpIC0+Ci0gICAge1Byb3RvMSwgTWVzc2FnZUJlZ2lufSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFByb3RvMCwgbWVzc2FnZV9iZWdpbiksCi0gICAgTmV3Q2xpZW50ID0gQ2xpZW50I3RjbGllbnR7cHJvdG9jb2wgPSBQcm90bzF9LAotICAgIGNhc2UgTWVzc2FnZUJlZ2luIG9mCi0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3NlcWlkID0gUmV0U2VxSWR9IHdoZW4gUmV0U2VxSWQgPS89IFNlcUlkIC0+Ci0gICAgICAgICAgICB7TmV3Q2xpZW50LCB7ZXJyb3IsIHtiYWRfc2VxX2lkLCBTZXFJZH19fTsKLQotICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnt0eXBlID0gP3RNZXNzYWdlVHlwZV9FWENFUFRJT059IC0+Ci0gICAgICAgICAgICBoYW5kbGVfYXBwbGljYXRpb25fZXhjZXB0aW9uKE5ld0NsaWVudCk7Ci0KLSAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfUkVQTFl9IC0+Ci0gICAgICAgICAgICBoYW5kbGVfcmVwbHkoTmV3Q2xpZW50LCBGdW5jdGlvbiwgUmVwbHlUeXBlKQorICAgIGNhc2UgdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBtZXNzYWdlX2JlZ2luKSBvZgorICAgICAgICAge1Byb3RvMSwge2Vycm9yLCBSZWFzb259fSAtPgorICAgICAgICAgICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8xfSwKKyAgICAgICAgICAgICB7TmV3Q2xpZW50LCB7ZXJyb3IsIFJlYXNvbn19OworICAgICAgICAge1Byb3RvMSwgTWVzc2FnZUJlZ2lufSAtPgorICAgICAgICAgICAgIE5ld0NsaWVudCA9IENsaWVudCN0Y2xpZW50e3Byb3RvY29sID0gUHJvdG8xfSwKKyAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgorICAgICAgICAgICAgICAgICAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntzZXFpZCA9IFJldFNlcUlkfSB3aGVuIFJldFNlcUlkID0vPSBTZXFJZCAtPgorICAgICAgICAgICAgICAgICAgICAge05ld0NsaWVudCwge2Vycm9yLCB7YmFkX3NlcV9pZCwgU2VxSWR9fX07CisgICAgICAgICAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue3R5cGUgPSA/dE1lc3NhZ2VUeXBlX0VYQ0VQVElPTn0gLT4KKyAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9hcHBsaWNhdGlvbl9leGNlcHRpb24oTmV3Q2xpZW50KTsKKyAgICAgICAgICAgICAgICAgI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57dHlwZSA9ID90TWVzc2FnZVR5cGVfUkVQTFl9IC0+CisgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfcmVwbHkoTmV3Q2xpZW50LCBGdW5jdGlvbiwgUmVwbHlUeXBlKQorICAgICAgICAgICAgIGVuZAogICAgIGVuZC4KIAogCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2NsaWVudF91dGlsLmVybAppbmRleCBjNTJiYjhiLi4xZGJlNTFlIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfY2xpZW50X3V0aWwuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9jbGllbnRfdXRpbC5lcmwKQEAgLTIwLDYgKzIwLDExIEBACiAtbW9kdWxlKHRocmlmdF9jbGllbnRfdXRpbCkuCiAKIC1leHBvcnQoW25ldy80XSkuCistZXhwb3J0KFtuZXdfbXVsdGlwbGV4ZWQvMywgbmV3X211bHRpcGxleGVkLzRdKS4KKworLXR5cGUgc2VydmljZV9uYW1lKCkgICAgICAgICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIHNlcnZpY2VfbW9kdWxlKCkgICAgICAgICAgOjogYXRvbSgpLgorLXR5cGUgbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSA6OiBbe1NlcnZpY2VOYW1lOjpzZXJ2aWNlX25hbWUoKSwgU2VydmljZU1vZHVsZTo6c2VydmljZV9tb2R1bGUoKX1dLgogCiAlJQogJSUgU3BsaXRzIGNsaWVudCBvcHRpb25zIGludG8gY2xpZW50LCBwcm90b2NvbCwgYW5kIHRyYW5zcG9ydCBvcHRpb25zCkBAIC0zNCwyOCArMzksNzQgQEAKIAogc3BsaXRfb3B0aW9ucyhbT3B0ID0ge09wdEtleSwgX30gfCBSZXN0XSwgUHJvdG9JbiwgVHJhbnNJbikKICAgd2hlbiBPcHRLZXkgPTo9IHN0cmljdF9yZWFkOwotICAgICAgIE9wdEtleSA9Oj0gc3RyaWN0X3dyaXRlIC0+CisgICAgICAgT3B0S2V5ID06PSBzdHJpY3Rfd3JpdGU7CisgICAgICAgT3B0S2V5ID06PSBwcm90b2NvbCAtPgogICAgIHNwbGl0X29wdGlvbnMoUmVzdCwgW09wdCB8IFByb3RvSW5dLCBUcmFuc0luKTsKIAogc3BsaXRfb3B0aW9ucyhbT3B0ID0ge09wdEtleSwgX30gfCBSZXN0XSwgUHJvdG9JbiwgVHJhbnNJbikKICAgd2hlbiBPcHRLZXkgPTo9IGZyYW1lZDsKICAgICAgICBPcHRLZXkgPTo9IGNvbm5lY3RfdGltZW91dDsKLSAgICAgICBPcHRLZXkgPTo9IHNvY2tvcHRzIC0+CisgICAgICAgT3B0S2V5ID06PSByZWN2X3RpbWVvdXQ7CisgICAgICAgT3B0S2V5ID06PSBzb2Nrb3B0czsKKyAgICAgICBPcHRLZXkgPTo9IHNzbHRyYW5zcG9ydDsKKyAgICAgICBPcHRLZXkgPTo9IHNzbG9wdGlvbnMtPgogICAgIHNwbGl0X29wdGlvbnMoUmVzdCwgUHJvdG9JbiwgW09wdCB8IFRyYW5zSW5dKS4KIAogCiAlJSBDbGllbnQgY29uc3RydWN0b3IgZm9yIHRoZSBjb21tb24tY2FzZSBvZiBzb2NrZXQgdHJhbnNwb3J0cwotJSUgd2l0aCB0aGUgYmluYXJ5IHByb3RvY29sCiBuZXcoSG9zdCwgUG9ydCwgU2VydmljZSwgT3B0aW9ucykKICAgd2hlbiBpc19pbnRlZ2VyKFBvcnQpLCBpc19hdG9tKFNlcnZpY2UpLCBpc19saXN0KE9wdGlvbnMpIC0+Ci0gICAge1Byb3RvT3B0cywgVHJhbnNPcHRzfSA9IHNwbGl0X29wdGlvbnMoT3B0aW9ucyksCisgICAge1Byb3RvT3B0cywgVHJhbnNPcHRzMH0gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAogCisgICAge1RyYW5zcG9ydE1vZHVsZSwgVHJhbnNPcHRzMn0gPSBjYXNlIGxpc3RzOmtleXRha2Uoc3NsdHJhbnNwb3J0LCAxLCBUcmFuc09wdHMwKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt2YWx1ZSwge18sIHRydWV9LCBUcmFuc09wdHMxfSAtPiB7dGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQsIFRyYW5zT3B0czF9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHt0aHJpZnRfc29ja2V0X3RyYW5zcG9ydCwgVHJhbnNPcHRzMH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKworICAgIHtQcm90b2NvbE1vZHVsZSwgUHJvdG9PcHRzMX0gPSBjYXNlIGxpc3RzOmtleXRha2UocHJvdG9jb2wsIDEsIFByb3RvT3B0cykgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCBjb21wYWN0fSwgT3B0c30gLT4ge3RocmlmdF9jb21wYWN0X3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCBqc29ufSwgT3B0c30gLT4ge3RocmlmdF9qc29uX3Byb3RvY29sLCBPcHRzfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dmFsdWUsIHtfLCBiaW5hcnl9LCBPcHRzfSAtPiB7dGhyaWZ0X2JpbmFyeV9wcm90b2NvbCwgT3B0c307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4ge3RocmlmdF9iaW5hcnlfcHJvdG9jb2wsIFByb3RvT3B0c30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQotICAgICAgICB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgVHJhbnNPcHRzKSwKKyAgICAgICAgVHJhbnNwb3J0TW9kdWxlOm5ld190cmFuc3BvcnRfZmFjdG9yeShIb3N0LCBQb3J0LCBUcmFuc09wdHMyKSwKIAotICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRGYWN0b3J5LCBQcm90b09wdHMpLAorICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IFByb3RvY29sTW9kdWxlOm5ld19wcm90b2NvbF9mYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzMSksCisKKyAgICBjYXNlIFByb3RvY29sRmFjdG9yeSgpIG9mCisgICAgICAgIHtvaywgUHJvdG9jb2x9IC0+CisgICAgICAgICAgICB0aHJpZnRfY2xpZW50Om5ldyhQcm90b2NvbCwgU2VydmljZSk7CisgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgICB7ZXJyb3IsIEVycm9yfQorICAgIGVuZC4KKworLXNwZWMgbmV3X211bHRpcGxleGVkKEhvc3QsIFBvcnQsIFNlcnZpY2VzLCBPcHRpb25zKSAtPiB7b2ssIFNlcnZpY2VUaHJpZnRDbGllbnRMaXN0fSB3aGVuCisgICAgSG9zdCAgICAgICAgOjogbm9uZW1wdHlfc3RyaW5nKCksCisgICAgUG9ydCAgICAgICAgOjogbm9uX25lZ19pbnRlZ2VyKCksCisgICAgU2VydmljZXMgICAgOjogbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSwKKyAgICBPcHRpb25zICAgICA6OiBsaXN0KCksCisgICAgU2VydmljZVRocmlmdENsaWVudExpc3QgOjogW3tTZXJ2aWNlTmFtZTo6bGlzdCgpLCBUaHJpZnRDbGllbnQ6OnRlcm0oKX1dLgorbmV3X211bHRpcGxleGVkKEhvc3QsIFBvcnQsIFNlcnZpY2VzLCBPcHRpb25zKSB3aGVuIGlzX2ludGVnZXIoUG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChTZXJ2aWNlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbGlzdChPcHRpb25zKSAtPgorICAgIG5ld19tdWx0aXBsZXhlZCh0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucyksIFNlcnZpY2VzLCBPcHRpb25zKS4KKworLXNwZWMgbmV3X211bHRpcGxleGVkKFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwgU2VydmljZXMsIE9wdGlvbnMpIC0+IHtvaywgU2VydmljZVRocmlmdENsaWVudExpc3R9IHdoZW4KKyAgICBUcmFuc3BvcnRGYWN0b3J5VHVwbGUgICA6OiB7b2ssIFRyYW5zcG9ydEZhY3Rvcnk6OnRlcm0oKX0sCisgICAgU2VydmljZXMgICAgICAgICAgICAgICAgOjogbXVsdGlwbGV4ZWRfc2VydmljZV9tYXAoKSwKKyAgICBPcHRpb25zICAgICAgICAgICAgICAgICA6OiBsaXN0KCksCisgICAgU2VydmljZVRocmlmdENsaWVudExpc3QgOjogW3tTZXJ2aWNlTmFtZTo6c2VydmljZV9uYW1lKCksIFRocmlmdENsaWVudDo6dGVybSgpfV0uCituZXdfbXVsdGlwbGV4ZWQoVHJhbnNwb3J0RmFjdG9yeVR1cGxlLCBTZXJ2aWNlcywgT3B0aW9ucykgd2hlbiBpc19saXN0KFNlcnZpY2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xpc3QoT3B0aW9ucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc190dXBsZShUcmFuc3BvcnRGYWN0b3J5VHVwbGUpIC0+CisgICAge1Byb3RvT3B0cywgX30gPSBzcGxpdF9vcHRpb25zKE9wdGlvbnMpLAorCisgICAge29rLCBUcmFuc3BvcnRGYWN0b3J5fSA9IFRyYW5zcG9ydEZhY3RvcnlUdXBsZSwKKworICAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3X3Byb3RvY29sX2ZhY3RvcnkoVHJhbnNwb3J0RmFjdG9yeSwgUHJvdG9PcHRzKSwKIAogICAgIHtvaywgUHJvdG9jb2x9ID0gUHJvdG9jb2xGYWN0b3J5KCksCiAKLSAgICB0aHJpZnRfY2xpZW50Om5ldyhQcm90b2NvbCwgU2VydmljZSkuCisgICAge29rLCBbe1NlcnZpY2VOYW1lLCBlbGVtZW50KDIsIHRocmlmdF9jbGllbnQ6bmV3KGVsZW1lbnQoMiwgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sOm5ldyhQcm90b2NvbCwgU2VydmljZU5hbWUpKSwgU2VydmljZSkpfSB8fCB7U2VydmljZU5hbWUsIFNlcnZpY2V9IDwtIFNlcnZpY2VzXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNDIyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmVybApAQCAtMCwwICsxLDM5MCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wpLgorCistYmVoYXZpb3VyKHRocmlmdF9wcm90b2NvbCkuCisKKy1pbmNsdWRlKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgorLWluY2x1ZGUoInRocmlmdF9wcm90b2NvbC5ocmwiKS4KKworLWV4cG9ydChbbmV3LzEsIG5ldy8yLAorICAgICAgICAgcmVhZC8yLAorICAgICAgICAgd3JpdGUvMiwKKyAgICAgICAgIGZsdXNoX3RyYW5zcG9ydC8xLAorICAgICAgICAgY2xvc2VfdHJhbnNwb3J0LzEsCisgICAgICAgICBuZXdfcHJvdG9jb2xfZmFjdG9yeS8yCisgICAgICAgIF0pLgorCistZGVmaW5lKElEX05PTkUsIDE2IzEwMDAwKS4KKy1kZWZpbmUoQ0JPT0xfTk9ORSwgMCkuCistZGVmaW5lKENCT09MX1RSVUUsIDEpLgorLWRlZmluZShDQk9PTF9GQUxTRSwgMikuCisKKy1yZWNvcmQodF9jb21wYWN0LCB7dHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBzdGF0ZSBmb3IgcGVuZGluZyBib29sZWFuIGZpZWxkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zdGFjaz1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfdmFsdWU9P0NCT09MX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9zdGFjaz1bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2lkPT9JRF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgorLXR5cGUgc3RhdGUoKSA6OiAjdF9jb21wYWN0e30uCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWRlZmluZShQUk9UT0NPTF9JRCwgMTYjODIpLgorLWRlZmluZShWRVJTSU9OX01BU0ssIDE2IzFmKS4KKy1kZWZpbmUoVkVSU0lPTl8xLCAxNiMwMSkuCistZGVmaW5lKFRZUEVfTUFTSywgMTYjRTApLgorLWRlZmluZShUWVBFX0JJVFMsIDE2IzA3KS4KKy1kZWZpbmUoVFlQRV9TSElGVF9BTU9VTlQsIDUpLgorCit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RPUCkgLT4gMTYjMDsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9CT09MKSAtPiAxNiMyOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0k4KSAtPiAxNiMzOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0kxNikgLT4gMTYjNDsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9JMzIpIC0+IDE2IzU7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfSTY0KSAtPiAxNiM2OwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX0RPVUJMRSkgLT4gMTYjNzsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TVFJJTkcpIC0+IDE2Izg7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfU1RSVUNUKSAtPiAxNiNDOwordHlwZWlkX3RvX2NvbXBhY3QoP3RUeXBlX01BUCkgLT4gMTYjQjsKK3R5cGVpZF90b19jb21wYWN0KD90VHlwZV9TRVQpIC0+IDE2I0E7Cit0eXBlaWRfdG9fY29tcGFjdCg/dFR5cGVfTElTVCkgLT4gMTYjOS4KKworY29tcGFjdF90b190eXBlaWQoMTYjMCkgLT4gID90VHlwZV9TVE9QOworY29tcGFjdF90b190eXBlaWQoP0NCT09MX0ZBTFNFKSAtPiAgP3RUeXBlX0JPT0w7Citjb21wYWN0X3RvX3R5cGVpZCg/Q0JPT0xfVFJVRSkgLT4gID90VHlwZV9CT09MOworY29tcGFjdF90b190eXBlaWQoMTYjNykgLT4gID90VHlwZV9ET1VCTEU7Citjb21wYWN0X3RvX3R5cGVpZCgxNiMzKSAtPiAgP3RUeXBlX0k4OworY29tcGFjdF90b190eXBlaWQoMTYjNCkgLT4gID90VHlwZV9JMTY7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM1KSAtPiAgP3RUeXBlX0kzMjsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2IzYpIC0+ICA/dFR5cGVfSTY0OworY29tcGFjdF90b190eXBlaWQoMTYjOCkgLT4gID90VHlwZV9TVFJJTkc7Citjb21wYWN0X3RvX3R5cGVpZCgxNiNDKSAtPiAgP3RUeXBlX1NUUlVDVDsKK2NvbXBhY3RfdG9fdHlwZWlkKDE2I0IpIC0+ICA/dFR5cGVfTUFQOworY29tcGFjdF90b190eXBlaWQoMTYjQSkgLT4gID90VHlwZV9TRVQ7Citjb21wYWN0X3RvX3R5cGVpZCgxNiM5KSAtPiAgP3RUeXBlX0xJU1QuCisKK2Jvb2xfdG9fY2Jvb2woVmFsdWUpIHdoZW4gVmFsdWUgLT4gP0NCT09MX1RSVUU7Citib29sX3RvX2Nib29sKF8pIC0+ID9DQk9PTF9GQUxTRS4KK2Nib29sX3RvX2Jvb2woVmFsdWUpIC0+IFZhbHVlID06PSA/Q0JPT0xfVFJVRS4KKworbmV3KFRyYW5zcG9ydCkgLT4gbmV3KFRyYW5zcG9ydCwgX09wdGlvbnMgPSBbXSkuCisKK25ldyhUcmFuc3BvcnQsIF9PcHRpb25zKSAtPgorICBTdGF0ZSAgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zcG9ydH0sCisgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoVGhpcyA9ICN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gVHJhbnNwb3J0fSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Zmx1c2goVHJhbnNwb3J0KSwKKyAge1RoaXMjdF9jb21wYWN0e3RyYW5zcG9ydCA9IE5ld1RyYW5zcG9ydH0sIFJlc3VsdH0uCisKK2Nsb3NlX3RyYW5zcG9ydChUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc3BvcnR9KSAtPgorICB7TmV3VHJhbnNwb3J0LCBSZXN1bHR9ID0gdGhyaWZ0X3RyYW5zcG9ydDpjbG9zZShUcmFuc3BvcnQpLAorICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworJSUlCislJSUgaW5zdGFuY2UgbWV0aG9kcworJSUlCisKK3dyaXRlX2ZpZWxkX2JlZ2luKFRoaXMwID0gI3RfY29tcGFjdHt3cml0ZV9zdGFjaz1bTGFzdElkfFRdfSwgQ29tcGFjdFR5cGUsIElkKSAtPgorICBJZERpZmYgPSBJZCAtIExhc3RJZCwKKyAgVGhpczEgPSBUaGlzMCN0X2NvbXBhY3R7d3JpdGVfc3RhY2s9W0lkfFRdfSwKKyAgY2FzZSAoSWREaWZmID4gMCkgYW5kIChJZERpZmYgPCAxNikgb2YKKyAgICB0cnVlIC0+IHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKElkRGlmZiBic2wgNCkgYm9yIENvbXBhY3RUeXBlfSk7CisgICAgZmFsc2UgLT4KKyAgICAgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtieXRlLCBDb21wYWN0VHlwZX0pLAorICAgICAgd3JpdGUoVGhpczIsIHtpMTYsIElkfSkKKyAgZW5kLgorCistc3BlYyB0b196aWd6YWcoaW50ZWdlcigpKSAtPiBub25fbmVnX2ludGVnZXIoKS4KK3RvX3ppZ3phZyhWYWx1ZSkgLT4gMTYjRkZGRkZGRkZGRkZGRkZGRiBiYW5kICgoVmFsdWUgYnNsIDEpIGJ4b3IgKFZhbHVlIGJzciA2MykpLgorCistc3BlYyBmcm9tX3ppZ3phZyhub25fbmVnX2ludGVnZXIoKSkgLT4gaW50ZWdlcigpLgorZnJvbV96aWd6YWcoVmFsdWUpIC0+IChWYWx1ZSBic3IgMSkgYnhvciAtKFZhbHVlIGJhbmQgMSkuCisKKy1zcGVjIHRvX3ZhcmludChub25fbmVnX2ludGVnZXIoKSwgaW9saXN0KCkpIC0+IGlvbGlzdCgpLgordG9fdmFyaW50KFZhbHVlLCBBY2MpIHdoZW4gKFZhbHVlIDwgMTYjODApIC0+IFtBY2MsIFZhbHVlXTsKK3RvX3ZhcmludChWYWx1ZSwgQWNjKSAtPgorICB0b192YXJpbnQoVmFsdWUgYnNyIDcsIFtBY2MsICgoVmFsdWUgYmFuZCAxNiM3RikgYm9yIDE2IzgwKV0pLgorCistc3BlYyByZWFkX3ZhcmludCgjdF9jb21wYWN0e30sIG5vbl9uZWdfaW50ZWdlcigpLCBub25fbmVnX2ludGVnZXIoKSkgLT4gbm9uX25lZ19pbnRlZ2VyKCkuCityZWFkX3ZhcmludChUaGlzMCwgQWNjLCBDb3VudCkgLT4KKyAge1RoaXMxLCB7b2ssIEJ5dGV9fSA9IHJlYWQoVGhpczAsIGJ5dGUpLAorICBjYXNlIChCeXRlIGJhbmQgMTYjODApIG9mCisgICAgMCAtPiB7VGhpczEsIHtvaywgKEJ5dGUgYnNsICg3ICogQ291bnQpKSArIEFjY319OworICAgIF8gLT4gcmVhZF92YXJpbnQoVGhpczEsICgoQnl0ZSBiYW5kIDE2IzdmKSBic2wgKDcgKiBDb3VudCkpICsgQWNjLCBDb3VudCArIDEpCisgIGVuZC4KKword3JpdGUoVGhpczAsICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lueworICAgICAgICBuYW1lID0gTmFtZSwKKyAgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgIHNlcWlkID0gU2VxaWR9KSAtPgorICB7VGhpczEsIG9rfSA9IHdyaXRlKFRoaXMwLCB7Ynl0ZSwgP1BST1RPQ09MX0lEfSksCisgIHtUaGlzMiwgb2t9ID0gd3JpdGUoVGhpczEsIHtieXRlLCAoP1ZFUlNJT05fMSBiYW5kID9WRVJTSU9OX01BU0spIGJvciAoVHlwZSBic2wgP1RZUEVfU0hJRlRfQU1PVU5UKX0pLAorICB7VGhpczMsIG9rfSA9IHdyaXRlKFRoaXMyLCB7dWkzMiwgU2VxaWR9KSwKKyAge1RoaXM0LCBva30gPSB3cml0ZShUaGlzMywge3N0cmluZywgTmFtZX0pLAorICB7VGhpczQsIG9rfTsKKword3JpdGUoVGhpcywgbWVzc2FnZV9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57CisgICAgICAgbmFtZSA9IF9OYW1lLAorICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgIGlkID0gSWR9KQord2hlbiAoVHlwZSA9Oj0gP3RUeXBlX0JPT0wpIC0+IHtUaGlzMCN0X2NvbXBhY3R7d3JpdGVfaWQgPSBJZH0sIG9rfTsKKword3JpdGUoVGhpczAsICNwcm90b2NvbF9maWVsZF9iZWdpbnsKKyAgICAgICBuYW1lID0gX05hbWUsCisgICAgICAgdHlwZSA9IFR5cGUsCisgICAgICAgaWQgPSBJZH0pIC0+CisgIHdyaXRlX2ZpZWxkX2JlZ2luKFRoaXMwLCB0eXBlaWRfdG9fY29tcGFjdChUeXBlKSwgSWQpOworCit3cml0ZShUaGlzLCBmaWVsZF9zdG9wKSAtPiB3cml0ZShUaGlzLCB7Ynl0ZSwgP3RUeXBlX1NUT1B9KTsKKword3JpdGUoVGhpcywgZmllbGRfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX21hcF9iZWdpbnsKKyAgICAgIGt0eXBlID0gX0t0eXBlLAorICAgICAgdnR5cGUgPSBfVnR5cGUsCisgICAgICBzaXplID0gU2l6ZX0pCit3aGVuIFNpemUgPTo9IDAgLT4KKyAgd3JpdGUoVGhpczAsIHtieXRlLCAwfSk7CisKK3dyaXRlKFRoaXMwLCAjcHJvdG9jb2xfbWFwX2JlZ2lueworICAgICAgIGt0eXBlID0gS3R5cGUsCisgICAgICAgdnR5cGUgPSBWdHlwZSwKKyAgICAgICBzaXplID0gU2l6ZX0pIC0+CisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHt1aTMyLCBTaXplfSksCisgIHdyaXRlKFRoaXMxLCB7Ynl0ZSwgKHR5cGVpZF90b19jb21wYWN0KEt0eXBlKSBic2wgNCkgYm9yIHR5cGVpZF90b19jb21wYWN0KFZ0eXBlKX0pOworCit3cml0ZShUaGlzLCBtYXBfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkKK3doZW4gU2l6ZSA8IDE2I2YgLT4KKyAgd3JpdGUoVGhpczAsIHtieXRlLCAoU2l6ZSBic2wgNCkgYm9yIHR5cGVpZF90b19jb21wYWN0KEV0eXBlKX0pOworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57CisgICAgICAgIGV0eXBlID0gRXR5cGUsCisgICAgICAgIHNpemUgPSBTaXplfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZShUaGlzMCwge2J5dGUsIDE2I2YwIGJvciB0eXBlaWRfdG9fY29tcGFjdChFdHlwZSl9KSwKKyAgd3JpdGUoVGhpczEsIHt1aTMyLCBTaXplfSk7CisKK3dyaXRlKFRoaXMsIGxpc3RfZW5kKSAtPiB7VGhpcywgb2t9OworCit3cml0ZShUaGlzMCwgI3Byb3RvY29sX3NldF9iZWdpbnsKKyAgICAgICAgZXR5cGUgPSBFdHlwZSwKKyAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgorICB3cml0ZShUaGlzMCwgI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBFdHlwZSwgc2l6ZSA9ICBTaXplfSk7CisKK3dyaXRlKFRoaXMsIHNldF9lbmQpIC0+IHtUaGlzLCBva307CisKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gU3RhY2t9LCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30pIC0+CisgIHtUaGlzI3RfY29tcGFjdHt3cml0ZV9zdGFjayA9IFswfFN0YWNrXX0sIG9rfTsKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3dyaXRlX3N0YWNrID0gW198VF19LCBzdHJ1Y3RfZW5kKSAtPgorICB7VGhpcyN0X2NvbXBhY3R7d3JpdGVfc3RhY2sgPSBUfSwgb2t9OworCit3cml0ZShUaGlzID0gI3RfY29tcGFjdHt3cml0ZV9pZCA9ID9JRF9OT05FfSwge2Jvb2wsIFZhbHVlfSkgLT4KKyAgd3JpdGUoVGhpcywge2J5dGUsIGJvb2xfdG9fY2Jvb2woVmFsdWUpfSk7CisKK3dyaXRlKFRoaXMwID0gI3RfY29tcGFjdHt3cml0ZV9pZCA9IElkfSwge2Jvb2wsIFZhbHVlfSkgLT4KKyAge1RoaXMxLCBva30gPSB3cml0ZV9maWVsZF9iZWdpbihUaGlzMCwgYm9vbF90b19jYm9vbChWYWx1ZSksIElkKSwKKyAge1RoaXMxI3RfY29tcGFjdHt3cml0ZV9pZCA9ID9JRF9OT05FfSwgb2t9OworCit3cml0ZShUaGlzLCB7Ynl0ZSwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+CisgIHdyaXRlKFRoaXMsIDw8VmFsdWU6OC9iaWctc2lnbmVkPj4pOworCit3cml0ZShUaGlzLCB7aTE2LCBWYWx1ZX0pIHdoZW4gaXNfaW50ZWdlcihWYWx1ZSkgLT4gd3JpdGUoVGhpcywgdG9fdmFyaW50KHRvX3ppZ3phZyhWYWx1ZSksIFtdKSk7Cit3cml0ZShUaGlzLCB7dWkzMiwgVmFsdWV9KSB3aGVuIGlzX2ludGVnZXIoVmFsdWUpIC0+IHdyaXRlKFRoaXMsIHRvX3ZhcmludChWYWx1ZSwgW10pKTsKK3dyaXRlKFRoaXMsIHtpMzIsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPgorICB3cml0ZShUaGlzLCB0b192YXJpbnQodG9femlnemFnKFZhbHVlKSwgW10pKTsKK3dyaXRlKFRoaXMsIHtpNjQsIFZhbHVlfSkgd2hlbiBpc19pbnRlZ2VyKFZhbHVlKSAtPiB3cml0ZShUaGlzLCB0b192YXJpbnQodG9femlnemFnKFZhbHVlKSwgW10pKTsKKword3JpdGUoVGhpcywge2RvdWJsZSwgRG91YmxlfSkgLT4KKyAgd3JpdGUoVGhpcywgPDxEb3VibGU6NjQvZmxvYXQtc2lnbmVkLWxpdHRsZT4+KTsKKword3JpdGUoVGhpczAsIHtzdHJpbmcsIFN0cn0pIHdoZW4gaXNfbGlzdChTdHIpIC0+CisgICUgVE9ETzogbGltaXQgbGVuZ3RoCisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHt1aTMyLCBsZW5ndGgoU3RyKX0pLAorICB7VGhpczIsIG9rfSA9IHdyaXRlKFRoaXMxLCBsaXN0X3RvX2JpbmFyeShTdHIpKSwKKyAge1RoaXMyLCBva307CisKK3dyaXRlKFRoaXMwLCB7c3RyaW5nLCBCaW59KSB3aGVuIGlzX2JpbmFyeShCaW4pIC0+CisgICUgVE9ETzogbGltaXQgbGVuZ3RoCisgIHtUaGlzMSwgb2t9ID0gd3JpdGUoVGhpczAsIHt1aTMyLCBzaXplKEJpbil9KSwKKyAge1RoaXMyLCBva30gPSB3cml0ZShUaGlzMSwgQmluKSwKKyAge1RoaXMyLCBva307CisKKyUlIERhdGEgOjogaW9saXN0KCkKK3dyaXRlKFRoaXMgPSAjdF9jb21wYWN0e3RyYW5zcG9ydCA9IFRyYW5zfSwgRGF0YSkgLT4KKyAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoVHJhbnMsIERhdGEpLAorICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworJSUKKyUlCisKK3JlYWQoVGhpczAsIG1lc3NhZ2VfYmVnaW4pIC0+CisgIHtUaGlzMSwge29rLCA/UFJPVE9DT0xfSUR9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMyLCB7b2ssIFZlckFuZFR5cGV9fSA9IHJlYWQoVGhpczEsIHVieXRlKSwKKyAgP1ZFUlNJT05fMSA9IFZlckFuZFR5cGUgYmFuZCA/VkVSU0lPTl9NQVNLLAorICB7VGhpczMsIHtvaywgU2VxSWR9fSA9IHJlYWQoVGhpczIsIHVpMzIpLAorICB7VGhpczQsIHtvaywgTmFtZX19ID0gcmVhZChUaGlzMywgc3RyaW5nKSwKKyAge1RoaXM0LCAjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbnsKKyAgICAgICAgICAgICBuYW1lICA9IGJpbmFyeV90b19saXN0KE5hbWUpLAorICAgICAgICAgICAgIHR5cGUgID0gKFZlckFuZFR5cGUgYnNyID9UWVBFX1NISUZUX0FNT1VOVCkgYmFuZCA/VFlQRV9CSVRTLAorICAgICAgICAgICAgIHNlcWlkID0gU2VxSWR9fTsKKworcmVhZChUaGlzLCBtZXNzYWdlX2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzID0gI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gU3RhY2t9LCBzdHJ1Y3RfYmVnaW4pIC0+CisgIHtUaGlzI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gWzB8U3RhY2tdfSwgb2t9OworcmVhZChUaGlzID0gI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW19IfFRdfSwgc3RydWN0X2VuZCkgLT4KKyAge1RoaXMjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBUfSwgb2t9OworCityZWFkKFRoaXMwID0gI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0xhc3RJZHxUXX0sIGZpZWxkX2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgQnl0ZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICBjYXNlIEJ5dGUgYmFuZCAxNiNmIG9mCisgICAgQ29tcGFjdFR5cGUgPSA/dFR5cGVfU1RPUCAtPgorICAgICAge1RoaXMxLCAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IENvbXBhY3RUeXBlfX07CisgICAgQ29tcGFjdFR5cGUgLT4KKyAgICAgIHtUaGlzMiwge29rLCBJZH19ID0gY2FzZSBCeXRlIGJzciA0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAtPiByZWFkKFRoaXMxLCBpMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElkRGlmZiAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1RoaXMxLCB7b2ssIExhc3RJZCArIElkRGlmZn19CisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgIGNhc2UgY29tcGFjdF90b190eXBlaWQoQ29tcGFjdFR5cGUpIG9mCisgICAgICAgID90VHlwZV9CT09MIC0+CisgICAgICAgICAge1RoaXMyI3RfY29tcGFjdHtyZWFkX3N0YWNrID0gW0lkfFRdLCByZWFkX3ZhbHVlID0gY2Jvb2xfdG9fYm9vbChDb21wYWN0VHlwZSl9LAorICAgICAgICAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9ID90VHlwZV9CT09MLCBpZCA9IElkfX07CisgICAgICAgIFR5cGUgLT4KKyAgICAgICAgICB7VGhpczIjdF9jb21wYWN0e3JlYWRfc3RhY2sgPSBbSWR8VF19LAorICAgICAgICAgICAjcHJvdG9jb2xfZmllbGRfYmVnaW57dHlwZSA9IFR5cGUsIGlkID0gSWR9fQorICAgICAgZW5kCisgIGVuZDsKKworcmVhZChUaGlzLCBmaWVsZF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIG1hcF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemV9fSAgPSByZWFkKFRoaXMwLCB1aTMyKSwKKyAge1RoaXMyLCB7b2ssIEtWfX0gPSBjYXNlIFNpemUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLT4ge1RoaXMxLCB7b2ssIDB9fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gcmVhZChUaGlzMSwgdWJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9tYXBfYmVnaW57a3R5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChLViBic3IgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHlwZSA9IGNvbXBhY3RfdG9fdHlwZWlkKEtWIGJhbmQgMTYjZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX19OworcmVhZChUaGlzLCBtYXBfZW5kKSAtPiB7VGhpcywgb2t9OworCityZWFkKFRoaXMwLCBsaXN0X2JlZ2luKSAtPgorICB7VGhpczEsIHtvaywgU2l6ZUFuZFR5cGV9fSA9IHJlYWQoVGhpczAsIHVieXRlKSwKKyAge1RoaXMyLCB7b2ssIFNpemV9fSA9IGNhc2UgKFNpemVBbmRUeXBlIGJzciA0KSBiYW5kIDE2I2Ygb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTYjZiAtPiByZWFkKFRoaXMxLCB1aTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRWxzZSAtPiB7VGhpczEsIHtvaywgRWxzZX19CisgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgIHtUaGlzMiwgI3Byb3RvY29sX2xpc3RfYmVnaW57ZXR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChTaXplQW5kVHlwZSBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisKK3JlYWQoVGhpcywgbGlzdF9lbmQpIC0+IHtUaGlzLCBva307CisKK3JlYWQoVGhpczAsIHNldF9iZWdpbikgLT4KKyAge1RoaXMxLCB7b2ssIFNpemVBbmRUeXBlfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMiwge29rLCBTaXplfX0gPSBjYXNlIChTaXplQW5kVHlwZSBic3IgNCkgYmFuZCAxNiNmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgIDE2I2YgLT4gcmVhZChUaGlzMSwgdWkzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEVsc2UgLT4ge1RoaXMxLCB7b2ssIEVsc2V9fQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICB7VGhpczIsICNwcm90b2NvbF9zZXRfYmVnaW57ZXR5cGUgPSBjb21wYWN0X3RvX3R5cGVpZChTaXplQW5kVHlwZSBiYW5kIDE2I2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfX07CisKK3JlYWQoVGhpcywgc2V0X2VuZCkgLT4ge1RoaXMsIG9rfTsKKworcmVhZChUaGlzMCwgZmllbGRfc3RvcCkgLT4KKyAge1RoaXMxLCB7b2ssID90VHlwZV9TVE9QfX0gPSByZWFkKFRoaXMwLCB1Ynl0ZSksCisgIHtUaGlzMSwgb2t9OworCislJQorCityZWFkKFRoaXMwID0gI3RfY29tcGFjdHtyZWFkX3ZhbHVlID0gP0NCT09MX05PTkV9LCBib29sKSAtPgorICB7VGhpczEsIHtvaywgQnl0ZX19ID0gcmVhZChUaGlzMCwgdWJ5dGUpLAorICB7VGhpczEsIHtvaywgY2Jvb2xfdG9fYm9vbChCeXRlKX19OworCityZWFkKFRoaXMwID0gI3RfY29tcGFjdHtyZWFkX3ZhbHVlID0gQm9vbH0sIGJvb2wpIC0+CisgIHtUaGlzMCN0X2NvbXBhY3R7cmVhZF92YWx1ZSA9ID9DQk9PTF9OT05FfSwge29rLCBCb29sfX07CisKK3JlYWQoVGhpczAsIHVieXRlKSAtPgorICB7VGhpczEsIHtvaywgPDxWYWw6OC9pbnRlZ2VyLXVuc2lnbmVkLWJpZywgXy9iaW5hcnk+Pn19ID0gcmVhZF9kYXRhKFRoaXMwLCAxKSwKKyAge1RoaXMxLCB7b2ssIFZhbH19OworCityZWFkKFRoaXMwLCBieXRlKSAtPgorICB7VGhpczEsIEJ5dGVzfSA9IHJlYWRfZGF0YShUaGlzMCwgMSksCisgIGNhc2UgQnl0ZXMgb2YKKyAgICB7b2ssIDw8VmFsOjgvaW50ZWdlci1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fSAtPiB7VGhpczEsIHtvaywgVmFsfX07CisgICAgRWxzZSAtPiB7VGhpczEsIEVsc2V9CisgIGVuZDsKKworcmVhZChUaGlzMCwgaTE2KSAtPgorICB7VGhpczEsIHtvaywgWmlnemFnfX0gPSByZWFkX3ZhcmludChUaGlzMCwgMCwgMCksCisgIHtUaGlzMSwge29rLCBmcm9tX3ppZ3phZyhaaWd6YWcpfX07CisKK3JlYWQoVGhpczAsIHVpMzIpIC0+IHJlYWRfdmFyaW50KFRoaXMwLCAwLCAwKTsKKworcmVhZChUaGlzMCwgaTMyKSAtPgorICB7VGhpczEsIHtvaywgWmlnemFnfX0gPSByZWFkX3ZhcmludChUaGlzMCwgMCwgMCksCisgIHtUaGlzMSwge29rLCBmcm9tX3ppZ3phZyhaaWd6YWcpfX07CisKK3JlYWQoVGhpczAsIGk2NCkgLT4KKyAge1RoaXMxLCB7b2ssIFppZ3phZ319ID0gcmVhZF92YXJpbnQoVGhpczAsIDAsIDApLAorICB7VGhpczEsIHtvaywgZnJvbV96aWd6YWcoWmlnemFnKX19OworCityZWFkKFRoaXMwLCBkb3VibGUpIC0+CisgIHtUaGlzMSwgQnl0ZXN9ID0gcmVhZF9kYXRhKFRoaXMwLCA4KSwKKyAgY2FzZSBCeXRlcyBvZgorICAgIHtvaywgPDxWYWw6NjQvZmxvYXQtc2lnbmVkLWxpdHRsZSwgXy9iaW5hcnk+Pn0gLT4ge1RoaXMxLCB7b2ssIFZhbH19OworICAgIEVsc2UgLT4ge1RoaXMxLCBFbHNlfQorICBlbmQ7CisKKyUgcmV0dXJucyBhIGJpbmFyeSBkaXJlY3RseSwgY2FsbCBiaW5hcnlfdG9fbGlzdCBpZiBuZWNlc3NhcnkKK3JlYWQoVGhpczAsIHN0cmluZykgLT4KKyAge1RoaXMxLCB7b2ssIFN6fX0gID0gcmVhZChUaGlzMCwgdWkzMiksCisgIHJlYWRfZGF0YShUaGlzMSwgU3opLgorCistc3BlYyByZWFkX2RhdGEoI3RfY29tcGFjdHt9LCBub25fbmVnX2ludGVnZXIoKSkgLT4KKyAgICB7I3RfY29tcGFjdHt9LCB7b2ssIGJpbmFyeSgpfSB8IHtlcnJvciwgX1JlYXNvbn19LgorcmVhZF9kYXRhKFRoaXMsIDApIC0+IHtUaGlzLCB7b2ssIDw8Pj59fTsKK3JlYWRfZGF0YShUaGlzID0gI3RfY29tcGFjdHt0cmFuc3BvcnQgPSBUcmFuc30sIExlbikgd2hlbiBpc19pbnRlZ2VyKExlbikgYW5kYWxzbyBMZW4gPiAwIC0+CisgICAge05ld1RyYW5zcG9ydCwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6cmVhZChUcmFucywgTGVuKSwKKyAgICB7VGhpcyN0X2NvbXBhY3R7dHJhbnNwb3J0ID0gTmV3VHJhbnNwb3J0fSwgUmVzdWx0fS4KKworCislJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCisKKyUlIHJldHVybnMgYSAoZnVuKCkgLT4gdGhyaWZ0X3Byb3RvY29sKCkpCituZXdfcHJvdG9jb2xfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5LCBfT3B0aW9ucykgLT4KKyAgRiA9IGZ1bigpIC0+CisgICAgICAgICAgY2FzZSBUcmFuc3BvcnRGYWN0b3J5KCkgb2YKKyAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAtPgorICAgICAgICAgICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbDpuZXcoCisgICAgICAgICAgICAgICAgVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIFtdKTsKKyAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9IC0+CisgICAgICAgICAgICAgIHtlcnJvciwgRXJyb3J9CisgICAgICAgICAgZW5kCisgICAgICBlbmQsCisgIHtvaywgRn0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZpbGVfdHJhbnNwb3J0LmVybAppbmRleCBiYTNhYTg5Li4wNzExNTJiIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfZmlsZV90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9maWxlX3RyYW5zcG9ydC5lcmwKQEAgLTIxLDY5ICsyMSw5NSBAQAogCiAtYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgogCi0tZXhwb3J0KFtuZXdfcmVhZGVyLzEsCi0gICAgICAgICBuZXcvMSwKLSAgICAgICAgIG5ldy8yLAotICAgICAgICAgd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorJSUgbGVnYWN5IGFwaQorLWV4cG9ydChbbmV3X3JlYWRlci8xXSkuCiAKLS1yZWNvcmQodF9maWxlX3RyYW5zcG9ydCwge2RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZF9jbG9zZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gd3JpdGV9KS4KLS10eXBlIHN0YXRlKCkgOjogI3RfZmlsZV90cmFuc3BvcnR7fS4KLS1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAotJSUlJSBDT05TVFJVQ1RJT04gICAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCistcmVjb3JkKHRfZmlsZSwgeworICBkZXZpY2UsCisgIHNob3VsZF9jbG9zZSA9IHRydWUsCisgIG1vZGUgPSB3cml0ZQorfSkuCiAKLW5ld19yZWFkZXIoRmlsZW5hbWUpIC0+Ci0gICAgY2FzZSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyZWFkLCBiaW5hcnksIHtyZWFkX2FoZWFkLCAxMDI0KjEwMjR9XSkgb2YKLSAgICAgICAge29rLCBJT0RldmljZX0gLT4KLSAgICAgICAgICAgIG5ldyhJT0RldmljZSwgW3tzaG91bGRfY2xvc2UsIHRydWV9LCB7bW9kZSwgcmVhZH1dKTsKLSAgICAgICAgRXJyb3IgLT4gRXJyb3IKLSAgICBlbmQuCistdHlwZSBzdGF0ZSgpIDo6ICN0X2ZpbGV7fS4KIAotbmV3KERldmljZSkgLT4KLSAgICBuZXcoRGV2aWNlLCBbXSkuCiAKLSUlIERldmljZSA6OiBpb19kZXZpY2UoKQotJSUKKy1zcGVjIG5ldyhEZXZpY2U6OmZpbGU6aW9fZGV2aWNlKCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KERldmljZSkgLT4gbmV3KERldmljZSwgW10pLgorCistc3BlYyBuZXcoRGV2aWNlOjpmaWxlOmlvX2RldmljZSgpLCBPcHRzOjpsaXN0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKwogJSUgRGV2aWNlIHNob3VsZCBiZSBvcGVuZWQgaW4gcmF3IGFuZCBiaW5hcnkgbW9kZS4KIG5ldyhEZXZpY2UsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2V9KSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCisgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9maWxle2RldmljZSA9IERldmljZX0pLAorICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCiAKIAotJSUgUGFyc2Ugb3B0aW9ucwotcGFyc2Vfb3B0cyhbe3Nob3VsZF9jbG9zZSwgQm9vbH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgotICAgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxlX3RyYW5zcG9ydHtzaG91bGRfY2xvc2UgPSBCb29sfSk7Ci1wYXJzZV9vcHRzKFt7bW9kZSwgTW9kZX0gfCBSZXN0XSwgU3RhdGUpCi0gIHdoZW4gTW9kZSA9Oj0gd3JpdGU7Ci0gICAgICAgTW9kZSA9Oj0gcmVhZCAtPgotICAgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxlX3RyYW5zcG9ydHttb2RlID0gTW9kZX0pOworcGFyc2Vfb3B0cyhbe3Nob3VsZF9jbG9zZSwgQm9vbH18UmVzdF0sIFN0YXRlKQord2hlbiBpc19ib29sZWFuKEJvb2wpIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxle3Nob3VsZF9jbG9zZSA9IEJvb2x9KTsKK3BhcnNlX29wdHMoW3ttb2RlLCBNb2RlfXxSZXN0XSwgU3RhdGUpCit3aGVuIE1vZGUgPTo9IHdyaXRlOyBNb2RlID06PSByZWFkIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9maWxle21vZGUgPSBNb2RlfSk7CiBwYXJzZV9vcHRzKFtdLCBTdGF0ZSkgLT4KLSAgICAgU3RhdGUuCisgIFN0YXRlLgogCiAKLSUlJSUgVFJBTlNQT1JUIElNUEwgJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQotCi13cml0ZShUaGlzID0gI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gd3JpdGV9LCBEYXRhKSAtPgotICAgIHtUaGlzLCBmaWxlOndyaXRlKERldmljZSwgRGF0YSl9Owotd3JpdGUoVGhpcywgX0QpIC0+Ci0gICAge1RoaXMsIHtlcnJvciwgcmVhZF9tb2RlfX0uCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCiAKIAotcmVhZChUaGlzID0gI3RfZmlsZV90cmFuc3BvcnR7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gcmVhZH0sIExlbikKLSAgd2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+Ci0gICAge1RoaXMsIGZpbGU6cmVhZChEZXZpY2UsIExlbil9OwotcmVhZChUaGlzLCBfRCkgLT4KLSAgICB7VGhpcywge2Vycm9yLCByZWFkX21vZGV9fS4KK3JlYWQoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHJlYWR9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgY2FzZSBmaWxlOnJlYWQoRGV2aWNlLCBMZW4pIG9mCisgICAgZW9mIC0+IHtTdGF0ZSwge2Vycm9yLCBlb2Z9fTsKKyAgICB7b2ssIFJlc3VsdH0gLT4ge1N0YXRlLCB7b2ssIGlvbGlzdF90b19iaW5hcnkoUmVzdWx0KX19CisgIGVuZDsKK3JlYWQoU3RhdGUsIF8pIC0+CisgIHtTdGF0ZSwge2Vycm9yLCB3cml0ZV9tb2RlfX0uCiAKLWZsdXNoKFRoaXMgPSAjdF9maWxlX3RyYW5zcG9ydHtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0pIC0+Ci0gICAge1RoaXMsIGZpbGU6c3luYyhEZXZpY2UpfS4KIAotY2xvc2UoVGhpcyA9ICN0X2ZpbGVfdHJhbnNwb3J0e2RldmljZSA9IERldmljZSwgc2hvdWxkX2Nsb3NlID0gU0N9KSAtPgotICAgIGNhc2UgU0Mgb2YKLSAgICAgICAgdHJ1ZSAtPgotICAgICAgICAgICAge1RoaXMsIGZpbGU6Y2xvc2UoRGV2aWNlKX07Ci0gICAgICAgIGZhbHNlIC0+Ci0gICAgICAgICAgICB7VGhpcywgb2t9Ci0gICAgZW5kLgorcmVhZF9leGFjdChTdGF0ZSA9ICN0X2ZpbGV7ZGV2aWNlID0gRGV2aWNlLCBtb2RlID0gcmVhZH0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGZpbGU6cmVhZChEZXZpY2UsIExlbikgb2YKKyAgICBlb2YgLT4ge1N0YXRlLCB7ZXJyb3IsIGVvZn19OworICAgIHtvaywgUmVzdWx0fSAtPgorICAgICAgY2FzZSBpb2xpc3Rfc2l6ZShSZXN1bHQpIG9mCisgICAgICAgIFggd2hlbiBYIDwgTGVuIC0+IHtTdGF0ZSwge2Vycm9yLCBlb2Z9fTsKKyAgICAgICAgXyAtPiB7U3RhdGUsIHtvaywgaW9saXN0X3RvX2JpbmFyeShSZXN1bHQpfX0KKyAgICAgIGVuZAorICBlbmQ7CityZWFkX2V4YWN0KFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgd3JpdGVfbW9kZX19LgorCisKK3dyaXRlKFN0YXRlID0gI3RfZmlsZXtkZXZpY2UgPSBEZXZpY2UsIG1vZGUgPSB3cml0ZX0sIERhdGEpIC0+CisgIHtTdGF0ZSwgZmlsZTp3cml0ZShEZXZpY2UsIERhdGEpfTsKK3dyaXRlKFN0YXRlLCBfKSAtPgorICB7U3RhdGUsIHtlcnJvciwgcmVhZF9tb2RlfX0uCisKKworZmx1c2goU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgbW9kZSA9IHdyaXRlfSkgLT4KKyAge1N0YXRlLCBmaWxlOnN5bmMoRGV2aWNlKX0uCisKKworY2xvc2UoU3RhdGUgPSAjdF9maWxle2RldmljZSA9IERldmljZSwgc2hvdWxkX2Nsb3NlID0gU0N9KSAtPgorICBjYXNlIFNDIG9mCisgICAgdHJ1ZSAtPiB7U3RhdGUsIGZpbGU6Y2xvc2UoRGV2aWNlKX07CisgICAgZmFsc2UgLT4ge1N0YXRlLCBva30KKyAgZW5kLgorCisKKyUlIGxlZ2FjeSBhcGkuIGxlZnQgZm9yIGNvbXBhdGliaWxpdHkKK25ld19yZWFkZXIoRmlsZW5hbWUpIC0+CisgIGNhc2UgZmlsZTpvcGVuKEZpbGVuYW1lLCBbcmVhZCwgYmluYXJ5LCB7cmVhZF9haGVhZCwgMTAyNCoxMDI0fV0pIG9mCisgICAge29rLCBJT0RldmljZX0gLT4gbmV3KElPRGV2aWNlLCBbe3Nob3VsZF9jbG9zZSwgdHJ1ZX0sIHttb2RlLCByZWFkfV0pOworICAgIEVycm9yIC0+IEVycm9yCisgIGVuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCmluZGV4IGVjYTNjYmUuLjlhNWQ2YWYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKQEAgLTIxLDgzICsyMSwxMDYgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCislJSBjb25zdHJ1Y3RvcgogLWV4cG9ydChbbmV3LzFdKS4KKyUlIHByb3RvY29sIGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotJSUgdGhyaWZ0X3RyYW5zcG9ydCBjYWxsYmFja3MKLS1leHBvcnQoW3dyaXRlLzIsIHJlYWQvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgogCi0tcmVjb3JkKGZyYW1lZF90cmFuc3BvcnQsIHt3cmFwcGVkLCAlIGEgdGhyaWZ0X3RyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9idWZmZXIsICUgaW9saXN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2J1ZmZlciAlIGlvbGlzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLgotLXR5cGUgc3RhdGUoKSA6OiAjZnJhbWVkX3RyYW5zcG9ydHt9LgorLXJlY29yZCh0X2ZyYW1lZCwgeworICB3cmFwcGVkLAorICByZWFkX2J1ZmZlciwKKyAgd3JpdGVfYnVmZmVyCit9KS4KKworLXR5cGUgc3RhdGUoKSA6OiAjdF9mcmFtZWR7fS4KKworCistc3BlYyBuZXcoVHJhbnNwb3J0Ojp0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFdyYXBwZWQpIC0+CisgIFN0YXRlID0gI3RfZnJhbWVkeworICAgIHdyYXBwZWQgPSBXcmFwcGVkLAorICAgIHJlYWRfYnVmZmVyID0gW10sCisgICAgd3JpdGVfYnVmZmVyID0gW10KKyAgfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCisKIC1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KIAotbmV3KFdyYXBwZWRUcmFuc3BvcnQpIC0+Ci0gICAgU3RhdGUgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnVmZmVyID0gW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXIgPSBbXX0sCi0gICAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgogCi0lJSBXcml0ZXMgZGF0YSBpbnRvIHRoZSBidWZmZXIKLXdyaXRlKFN0YXRlID0gI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gV0J1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI2ZyYW1lZF90cmFuc3BvcnR7d3JpdGVfYnVmZmVyID0gW1dCdWYsIERhdGFdfSwgb2t9LgorcmVhZChTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZCwgcmVhZF9idWZmZXIgPSBCdWZmZXJ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWZmZXIpLAorICBjYXNlIEJpbmFyeSBvZgorICAgIDw8Pj4gd2hlbiBMZW4gPiAwIC0+CisgICAgICBjYXNlIG5leHRfZnJhbWUoV3JhcHBlZCkgb2YKKyAgICAgICAge05ld1N0YXRlLCB7b2ssIEZyYW1lfX0gLT4KKyAgICAgICAgICBOZXdCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KFtCaW5hcnksIEZyYW1lXSksCisgICAgICAgICAgR2l2ZSA9IG1pbihpb2xpc3Rfc2l6ZShOZXdCaW5hcnkpLCBMZW4pLAorICAgICAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoTmV3QmluYXJ5LCBHaXZlKSwKKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlLCByZWFkX2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgICAgIHtOZXdTdGF0ZSwgRXJyb3J9IC0+CisgICAgICAgICAge1N0YXRlI3RfZnJhbWVke3dyYXBwZWQgPSBOZXdTdGF0ZX0sIEVycm9yfQorICAgICAgZW5kOworICAgICUlIHJlYWQgb2YgemVybyBieXRlcworICAgIDw8Pj4gLT4ge1N0YXRlLCB7b2ssIDw8Pj59fTsKKyAgICAlJSByZWFkIGJ1ZmZlciBpcyBub25lbXB0eQorICAgIF8gLT4KKyAgICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHtyZWFkX2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0KKyAgZW5kLgogCi0lJSBGbHVzaGVzIHRoZSBidWZmZXIgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB0cmFuc3BvcnQKLWZsdXNoKFN0YXRlMCA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyaXRlX2J1ZmZlciA9IEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IFdyYXBwZWQwfSkgLT4KLSAgICBGcmFtZUxlbiA9IGlvbGlzdF9zaXplKEJ1ZmZlciksCi0gICAgRGF0YSAgICAgPSBbPDxGcmFtZUxlbjozMi9pbnRlZ2VyLXNpZ25lZC1iaWc+PiwgQnVmZmVyXSwKIAotICAgIHtXcmFwcGVkMSwgUmVzcG9uc2V9ID0gdGhyaWZ0X3RyYW5zcG9ydDp3cml0ZShXcmFwcGVkMCwgRGF0YSksCityZWFkX2V4YWN0KFN0YXRlID0gI3RfZnJhbWVke3dyYXBwZWQgPSBXcmFwcGVkLCByZWFkX2J1ZmZlciA9IEJ1ZmZlcn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZmZlciksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgICUlIHJlYWQgYnVmZmVyIGlzIGxhcmdlciB0aGFuIHJlcXVlc3RlZCByZWFkIHNpemUKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3RfZnJhbWVke3JlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICAlJSByZWFkIGJ1ZmZlciBpcyBpbnN1ZmZpY2llbnQgZm9yIHJlcXVlc3RlZCByZWFkIHNpemUKKyAgICBfIC0+CisgICAgICBjYXNlIG5leHRfZnJhbWUoV3JhcHBlZCkgb2YKKyAgICAgICAge05ld1N0YXRlLCB7b2ssIEZyYW1lfX0gLT4KKyAgICAgICAgICByZWFkX2V4YWN0KAorICAgICAgICAgICAgU3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlLCByZWFkX2J1ZmZlciA9IFtCdWZmZXIsIEZyYW1lXX0sCisgICAgICAgICAgICBMZW4KKyAgICAgICAgICApOworICAgICAgICB7TmV3U3RhdGUsIEVycm9yfSAtPgorICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGV9LCBFcnJvcn0KKyAgICAgIGVuZAorICBlbmQuCiAKLSAgICB7V3JhcHBlZDIsIF99ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcmFwcGVkMSksCituZXh0X2ZyYW1lKFRyYW5zcG9ydCkgLT4KKyAgY2FzZSB0aHJpZnRfdHJhbnNwb3J0OnJlYWRfZXhhY3QoVHJhbnNwb3J0LCA0KSBvZgorICAgIHtOZXdTdGF0ZSwge29rLCA8PEZyYW1lTGVuZ3RoOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+fX0gLT4KKyAgICAgIHRocmlmdF90cmFuc3BvcnQ6cmVhZF9leGFjdChOZXdTdGF0ZSwgRnJhbWVMZW5ndGgpOworICAgIEVycm9yIC0+IEVycm9yCisgIGVuZC4KIAotICAgIFN0YXRlMSA9IFN0YXRlMCNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMiwgd3JpdGVfYnVmZmVyID0gW119LAotICAgIHtTdGF0ZTEsIFJlc3BvbnNlfS4KIAotJSUgQ2xvc2VzIHRoZSB0cmFuc3BvcnQgYW5kIHRoZSB3cmFwcGVkIHRyYW5zcG9ydAotY2xvc2UoU3RhdGUgPSAjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDB9KSAtPgotICAgIHtXcmFwcGVkMSwgUmVzdWx0fSA9IHRocmlmdF90cmFuc3BvcnQ6Y2xvc2UoV3JhcHBlZDApLAotICAgIE5ld1N0YXRlID0gU3RhdGUjZnJhbWVkX3RyYW5zcG9ydHt3cmFwcGVkID0gV3JhcHBlZDF9LAotICAgIHtOZXdTdGF0ZSwgUmVzdWx0fS4KK3dyaXRlKFN0YXRlID0gI3RfZnJhbWVke3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcn0sIERhdGEpIC0+CisgIHtTdGF0ZSN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBbQnVmZmVyLCBEYXRhXX0sIG9rfS4KIAotJSUgUmVhZHMgZGF0YSB0aHJvdWdoIGZyb20gdGhlIHdyYXBwZWQgdHJhbnNwb3J0Ci1yZWFkKFN0YXRlMCA9ICNmcmFtZWRfdHJhbnNwb3J0e3dyYXBwZWQgPSBXcmFwcGVkMCwgcmVhZF9idWZmZXIgPSBSQnVmfSwKLSAgICAgTGVuKSB3aGVuIGlzX2ludGVnZXIoTGVuKSAtPgotICAgIHtXcmFwcGVkMSwge1JCdWYxLCBSQnVmMVNpemV9fSA9Ci0gICAgICAgICUlIGlmIHRoZSByZWFkIGJ1ZmZlciBpcyBlbXB0eSwgcmVhZCBhbm90aGVyIGZyYW1lCi0gICAgICAgICUlIG90aGVyd2lzZSwganVzdCByZWFkIGZyb20gd2hhdCdzIGxlZnQgaW4gdGhlIGJ1ZmZlcgotICAgICAgICBjYXNlIGlvbGlzdF9zaXplKFJCdWYpIG9mCi0gICAgICAgICAgICAwIC0+Ci0gICAgICAgICAgICAgICAgJSUgcmVhZCB0aGUgZnJhbWUgbGVuZ3RoCi0gICAgICAgICAgICAgICAgY2FzZSB0aHJpZnRfdHJhbnNwb3J0OnJlYWQoV3JhcHBlZDAsIDQpIG9mCi0gICAgICAgICAgICAgICAgICB7V3JhcHBlZFMxLAotICAgICAgICAgICAgICAgICAgICB7b2ssIDw8RnJhbWVMZW46MzIvaW50ZWdlci1zaWduZWQtYmlnLCBfL2JpbmFyeT4+fX0gLT4KLSAgICAgICAgICAgICAgICAgICAgJSUgdGhlbiByZWFkIHRoZSBkYXRhCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgdGhyaWZ0X3RyYW5zcG9ydDpyZWFkKFdyYXBwZWRTMSwgRnJhbWVMZW4pIG9mCi0gICAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMiwge29rLCBCaW59fSAtPgotICAgICAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMiwge0JpbiwgZXJsYW5nOmJ5dGVfc2l6ZShCaW4pfX07Ci0gICAgICAgICAgICAgICAgICAgICAge1dyYXBwZWRTMiwge2Vycm9yLCBSZWFzb24xfX0gLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzIsIHtlcnJvciwgUmVhc29uMX19Ci0gICAgICAgICAgICAgICAgICAgIGVuZDsKLSAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzEsIHtlcnJvciwgUmVhc29uMn19IC0+Ci0gICAgICAgICAgICAgICAgICAgIHtXcmFwcGVkUzEsIHtlcnJvciwgUmVhc29uMn19Ci0gICAgICAgICAgICAgICAgZW5kOwotICAgICAgICAgICAgU3ogLT4KLSAgICAgICAgICAgICAgICB7V3JhcHBlZDAsIHtSQnVmLCBTen19Ci0gICAgICAgIGVuZCwKIAotICAgICUlIHB1bGwgb2ZmIEdpdmUgYnl0ZXMsIHJldHVybiB0aGVtIHRvIHRoZSB1c2VyLCBsZWF2ZSB0aGUgcmVzdCBpbiB0aGUgYnVmZmVyCi0gICAgY2FzZSBSQnVmMSBvZgotICAgICAgZXJyb3IgLT4KLSAgICAgICAgeyBTdGF0ZTAjZnJhbWVkX3RyYW5zcG9ydCB7d3JhcHBlZCA9IFdyYXBwZWQxLCByZWFkX2J1ZmZlciA9IFtdIH0sCi0gICAgICAgICAge1JCdWYxLCBSQnVmMVNpemV9IH07Ci0gICAgICBfIC0+Ci0gICAgICAgIEdpdmUgPSBtaW4oUkJ1ZjFTaXplLCBMZW4pLAotICAgICAgICA8PERhdGE6R2l2ZS9iaW5hcnksIFJCdWYyL2JpbmFyeT4+ID0gaW9saXN0X3RvX2JpbmFyeShSQnVmMSksCitmbHVzaChTdGF0ZSA9ICN0X2ZyYW1lZHt3cml0ZV9idWZmZXIgPSBCdWZmZXIsIHdyYXBwZWQgPSBXcmFwcGVkfSkgLT4KKyAgY2FzZSBpb2xpc3Rfc2l6ZShCdWZmZXIpIG9mCisgICAgJSUgaWYgd3JpdGUgYnVmZmVyIGlzIGVtcHR5LCBkbyBub3RoaW5nCisgICAgMCAtPiB7U3RhdGUsIG9rfTsKKyAgICBGcmFtZUxlbiAtPgorICAgICAgRGF0YSA9IFs8PEZyYW1lTGVuOjMyL2ludGVnZXItc2lnbmVkLWJpZz4+LCBCdWZmZXJdLAorICAgICAge1dyaXR0ZW4sIFJlc3BvbnNlfSA9IHRocmlmdF90cmFuc3BvcnQ6d3JpdGUoV3JhcHBlZCwgRGF0YSksCisgICAgICB7Rmx1c2hlZCwgb2t9ID0gdGhyaWZ0X3RyYW5zcG9ydDpmbHVzaChXcml0dGVuKSwKKyAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gRmx1c2hlZCwgd3JpdGVfYnVmZmVyID0gW119LCBSZXNwb25zZX0KKyAgZW5kLgogCi0gICAgICAgIHsgU3RhdGUwI2ZyYW1lZF90cmFuc3BvcnR7d3JhcHBlZCA9IFdyYXBwZWQxLCByZWFkX2J1ZmZlcj1SQnVmMn0sCi0gICAgICAgICAge29rLCBEYXRhfSB9Ci0gICAgZW5kLgorCitjbG9zZShTdGF0ZSA9ICN0X2ZyYW1lZHt3cmFwcGVkID0gV3JhcHBlZH0pIC0+CisgIHtDbG9zZWQsIFJlc3VsdH0gPSB0aHJpZnRfdHJhbnNwb3J0OmNsb3NlKFdyYXBwZWQpLAorICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IENsb3NlZH0sIFJlc3VsdH0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3BhcnNlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wYXJzZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDdmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wYXJzZXIuZXJsCkBAIC0wLDAgKzEsNDE5IEBACislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorJSUgVGhlIGpzb24gcGFyc2VyIGltcGxlbWVudGF0aW9uIHdhcyBjcmVhdGVkIGJ5CislJSBhbGlzZGFpciBzdWxsaXZhbiA8YWxpc2RhaXJAaGFydGJyYWtlLmNvbT4gYmFzZWQgb24KKyUlIHRoZSBqc3gganNvbiBsaWJyYXJ5CisKKy1tb2R1bGUodGhyaWZ0X2pzb25fcGFyc2VyKS4KKy1leHBvcnQoW3BhcnNlci8wLCBoYW5kbGVfZXZlbnQvMl0pLgorCisKKy1yZWNvcmQoY29uZmlnLCB7c3RyaWN0X3V0ZjggPSBmYWxzZSA6OiBib29sZWFuKCl9KS4KKworCitwYXJzZXIoKSAtPiBmdW4oSlNPTikgLT4gc3RhcnQoSlNPTiwgez9NT0RVTEUsIFtdfSwgW10sICNjb25maWd7fSkgZW5kLgorCisKK2hhbmRsZV9ldmVudChFdmVudCwge0hhbmRsZXIsIFN0YXRlfSwgX0NvbmZpZykgLT4ge0hhbmRsZXIsIEhhbmRsZXI6aGFuZGxlX2V2ZW50KEV2ZW50LCBTdGF0ZSl9LgorCitoYW5kbGVfZXZlbnQoZW5kX2pzb24sIFN0YXRlKSAtPiBsaXN0czpyZXZlcnNlKFtlbmRfanNvbl0gKysgU3RhdGUpOworaGFuZGxlX2V2ZW50KEV2ZW50LCBTdGF0ZSkgLT4gW0V2ZW50XSArKyBTdGF0ZS4KKworCislJSB3aGl0ZXNwYWNlCistZGVmaW5lKHNwYWNlLCAxNiMyMCkuCistZGVmaW5lKHRhYiwgMTYjMDkpLgorLWRlZmluZShjciwgMTYjMEQpLgorLWRlZmluZShuZXdsaW5lLCAxNiMwQSkuCisKKyUlIG9iamVjdCBkZWxpbWl0ZXJzCistZGVmaW5lKHN0YXJ0X29iamVjdCwgMTYjN0IpLgorLWRlZmluZShlbmRfb2JqZWN0LCAxNiM3RCkuCisKKyUlIGFycmF5IGRlbGltaXRlcnMKKy1kZWZpbmUoc3RhcnRfYXJyYXksIDE2IzVCKS4KKy1kZWZpbmUoZW5kX2FycmF5LCAxNiM1RCkuCisKKyUlIGt2IHNlcGVyYXRvcgorLWRlZmluZShjb21tYSwgMTYjMkMpLgorLWRlZmluZShkb3VibGVxdW90ZSwgMTYjMjIpLgorLWRlZmluZShzaW5nbGVxdW90ZSwgMTYjMjcpLgorLWRlZmluZShjb2xvbiwgMTYjM0EpLgorCislJSBzdHJpbmcgZXNjYXBlIHNlcXVlbmNlcworLWRlZmluZShyc29saWR1cywgMTYjNUMpLgorLWRlZmluZShzb2xpZHVzLCAxNiMyRikuCisKKyUlIG1hdGgKKy1kZWZpbmUoemVybywgMTYjMzApLgorLWRlZmluZShkZWNpbWFscG9pbnQsIDE2IzJFKS4KKy1kZWZpbmUobmVnYXRpdmUsIDE2IzJEKS4KKy1kZWZpbmUocG9zaXRpdmUsIDE2IzJCKS4KKworJSUgY29tbWVudHMKKy1kZWZpbmUoc3RhciwgMTYjMkEpLgorCisKKyUlIHNvbWUgdXNlZnVsIGd1YXJkcworLWRlZmluZShpc19oZXgoU3ltYm9sKSwKKyAgICAoU3ltYm9sID49ICRhIGFuZGFsc28gU3ltYm9sID08ICRmKSBvcmVsc2UKKyAgICAoU3ltYm9sID49ICRBIGFuZGFsc28gU3ltYm9sID08ICRGKSBvcmVsc2UKKyAgICAoU3ltYm9sID49ICQwIGFuZGFsc28gU3ltYm9sID08ICQ5KQorKS4KKworLWRlZmluZShpc19ub256ZXJvKFN5bWJvbCksCisgICAgU3ltYm9sID49ICQxIGFuZGFsc28gU3ltYm9sID08ICQ5CispLgorCistZGVmaW5lKGlzX3doaXRlc3BhY2UoU3ltYm9sKSwKKyAgICBTeW1ib2wgPTo9ID9zcGFjZTsgU3ltYm9sID06PSA/dGFiOyBTeW1ib2wgPTo9ID9jcjsgU3ltYm9sID06PSA/bmV3bGluZQorKS4KKworCislJSBsaXN0cyBhcmUgYmVuY2htYXJrZWQgdG8gYmUgZmFzdGVyICh0aG8gaGlnaGVyIGluIG1lbW9yeSB1c2FnZSkgdGhhbiBiaW5hcmllcworbmV3X3NlcSgpIC0+IFtdLgorbmV3X3NlcShDKSAtPiBbQ10uCisKK2FjY19zZXEoU2VxLCBDKSB3aGVuIGlzX2xpc3QoQykgLT4gbGlzdHM6cmV2ZXJzZShDKSArKyBTZXE7CithY2Nfc2VxKFNlcSwgQykgLT4gW0NdICsrIFNlcS4KKworZW5kX3NlcShTZXEpIC0+IHVuaWNvZGU6Y2hhcmFjdGVyc190b19iaW5hcnkobGlzdHM6cmV2ZXJzZShTZXEpKS4KKworZW5kX3NlcShTZXEsIF8pIC0+IGVuZF9zZXEoU2VxKS4KKworCitzdGFydCg8PDE2I2VmLCAxNiNiYiwgMTYjYmYsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdmFsdWUoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CitzdGFydChCaW4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdmFsdWUoQmluLCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKS4KKworCit2YWx1ZSg8PD9kb3VibGVxdW90ZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgbmV3X3NlcSgpLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8JHQsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdHJ1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8JGYsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmFsc2UoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PCRuLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG51bGwoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PD9uZWdhdGl2ZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBuZWdhdGl2ZShSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCQtKSwgU3RhY2ssIENvbmZpZyk7Cit2YWx1ZSg8PD96ZXJvLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHplcm8oUmVzdCwgSGFuZGxlciwgbmV3X3NlcSgkMCksIFN0YWNrLCBDb25maWcpOwordmFsdWUoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc19ub256ZXJvKFMpIC0+CisgICAgaW50ZWdlcihSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKFMpLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKDw8P3N0YXJ0X29iamVjdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBvYmplY3QoUmVzdCwgaGFuZGxlX2V2ZW50KHN0YXJ0X29iamVjdCwgSGFuZGxlciwgQ29uZmlnKSwgW2tleXxTdGFja10sIENvbmZpZyk7Cit2YWx1ZSg8PD9zdGFydF9hcnJheSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBhcnJheShSZXN0LCBoYW5kbGVfZXZlbnQoc3RhcnRfYXJyYXksIEhhbmRsZXIsIENvbmZpZyksIFthcnJheXxTdGFja10sIENvbmZpZyk7Cit2YWx1ZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICB2YWx1ZShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK3ZhbHVlKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworb2JqZWN0KDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCksIFN0YWNrLCBDb25maWcpOworb2JqZWN0KDw8P2VuZF9vYmplY3QsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtrZXl8U3RhY2tdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX29iamVjdCwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7CitvYmplY3QoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc193aGl0ZXNwYWNlKFMpIC0+CisgICAgb2JqZWN0KFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworb2JqZWN0KF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworYXJyYXkoPDw/ZW5kX2FycmF5LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbYXJyYXl8U3RhY2tdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX2FycmF5LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK2FycmF5KDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGFycmF5KFJlc3QsIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpOworYXJyYXkoQmluLCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHZhbHVlKEJpbiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykuCisKKworY29sb24oPDw/Y29sb24sIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtrZXl8U3RhY2tdLCBDb25maWcpIC0+CisgICAgdmFsdWUoUmVzdCwgSGFuZGxlciwgW29iamVjdHxTdGFja10sIENvbmZpZyk7Citjb2xvbig8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBjb2xvbihSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK2NvbG9uKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKwora2V5KDw8P2RvdWJsZXF1b3RlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBuZXdfc2VxKCksIFN0YWNrLCBDb25maWcpOwora2V5KDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIGtleShSZXN0LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKTsKK2tleShfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKKyUlIG5vdGUgdGhhdCBpZiB5b3UgZW5jb3VudGVyIGFuIGVycm9yIGZyb20gc3RyaW5nIGFuZCB5b3UgY2FuJ3QgZmluZCB0aGUgY2xhdXNlIHRoYXQKKyUlICBjYXVzZWQgaXQgaGVyZSwgaXQgbWlnaHQgYmUgaW4gdW5lc2NhcGUgYmVsb3cKK3N0cmluZyg8PD9kb3VibGVxdW90ZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGRvdWJsZXF1b3RlKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDw/c29saWR1cywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgP3NvbGlkdXMpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PD9yc29saWR1cy91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgdW5lc2NhcGUoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMjAsIFggPCAxNiMyMDI4IC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID09IDE2IzIwMjg7IFggPT0gMTYjMjAyOSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+IDE2IzIwMjksIFggPCAxNiNkODAwIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID4gMTYjZGZmZiwgWCA8IDE2I2ZkZDAgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPiAxNiNmZGVmLCBYIDwgMTYjZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMxMDAwMCwgWCA8IDE2IzFmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzIwMDAwLCBYIDwgMTYjMmZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjMzAwMDAsIFggPCAxNiMzZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM0MDAwMCwgWCA8IDE2IzRmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzUwMDAwLCBYIDwgMTYjNWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjNjAwMDAsIFggPCAxNiM2ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiM3MDAwMCwgWCA8IDE2IzdmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2IzgwMDAwLCBYIDwgMTYjOGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjOTAwMDAsIFggPCAxNiM5ZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNhMDAwMCwgWCA8IDE2I2FmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2IwMDAwLCBYIDwgMTYjYmZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjYzAwMDAsIFggPCAxNiNjZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiNkMDAwMCwgWCA8IDE2I2RmZmZlIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBYKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoPDxYL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBYID49IDE2I2UwMDAwLCBYIDwgMTYjZWZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmluZyg8PFgvdXRmOCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFggPj0gMTYjZjAwMDAsIFggPCAxNiNmZmZmZSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWCksIFN0YWNrLCBDb25maWcpOworc3RyaW5nKDw8WC91dGY4LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gWCA+PSAxNiMxMDAwMDAsIFggPCAxNiMxMGZmZmUgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFgpLCBTdGFjaywgQ29uZmlnKTsKKyUlIHN1cnJvZ2F0ZXMKK3N0cmluZyg8PDIzNywgWCwgXywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPj0gMTYwIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CislJSB1K3hmZmZlLCB1K3hmZmZmLCBjb250cm9sIGNvZGVzIGFuZCBvdGhlciBub25jaGFyYWN0ZXJzCitzdHJpbmcoPDxfL3V0ZjgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKKyUlIHUrZmZmZSBhbmQgdStmZmZmIGZvciBSMTRCWFggKHN1YnNlcXVlbnQgcnVudGltZXMgd2lsbCBoYXBwaWx5IG1hdGNoIHRoZQorJSUgIHByZWNlZGluZyBjbGF1c2UKK3N0cmluZyg8PDIzOSwgMTkxLCBYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA9PSAxOTA7IFggPT0gMTkxIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CislJSBvdmVybG9uZyBlbmNvZGluZ3MgYW5kIG1pc3NpbmcgY29udGludWF0aW9ucyBvZiBhIDIgYnl0ZSBzZXF1ZW5jZQorc3RyaW5nKDw8WCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnPSNjb25maWd7c3RyaWN0X3V0Zjg9ZmFsc2V9KQorICAgICAgICB3aGVuIFggPj0gMTkyLCBYID08IDIyMyAtPgorICAgIHN0cmlwX2NvbnRpbnVhdGlvbnMoUmVzdCwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCAxKTsKKyUlIG92ZXJsb25nIGVuY29kaW5ncyBhbmQgbWlzc2luZyBjb250aW51YXRpb25zIG9mIGEgMyBieXRlIHNlcXVlbmNlCitzdHJpbmcoPDxYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pCisgICAgICAgIHdoZW4gWCA+PSAyMjQsIFggPTwgMjM5IC0+CisgICAgc3RyaXBfY29udGludWF0aW9ucyhSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIDIpOworJSUgb3ZlcmxvbmcgZW5jb2RpbmdzIGFuZCBtaXNzaW5nIGNvbnRpbnVhdGlvbnMgb2YgYSA0IGJ5dGUgc2VxdWVuY2UKK3N0cmluZyg8PFgsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZz0jY29uZmlne3N0cmljdF91dGY4PWZhbHNlfSkKKyAgICAgICAgd2hlbiBYID49IDI0MCwgWCA9PCAyNDcgLT4KKyAgICBzdHJpcF9jb250aW51YXRpb25zKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgMyk7CislJSBpbmNvbXBsZXRlcyBhbmQgdW5leHBlY3RlZCBieXRlcywgaW5jbHVkaW5nIG9ycGhhbiBjb250aW51YXRpb25zCitzdHJpbmcoPDxfLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWc9I2NvbmZpZ3tzdHJpY3RfdXRmOD1mYWxzZX0pIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAxNiNmZmZkKSwgU3RhY2ssIENvbmZpZyk7CitzdHJpbmcoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZG91YmxlcXVvdGUoUmVzdCwgSGFuZGxlciwgQWNjLCBba2V5fF9dID0gU3RhY2ssIENvbmZpZykgLT4KKyAgICBjb2xvbihSZXN0LCBoYW5kbGVfZXZlbnQoe2tleSwgZW5kX3NlcShBY2MsIENvbmZpZyl9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK2RvdWJsZXF1b3RlKFJlc3QsIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudCh7c3RyaW5nLCBlbmRfc2VxKEFjYywgQ29uZmlnKX0sIEhhbmRsZXIsIENvbmZpZyksIFN0YWNrLCBDb25maWcpLgorCisKKyUlIHN0cmlwcyBjb250aW51YXRpb24gYnl0ZXMgYWZ0ZXIgYmFkIHV0ZiBieXRlcywgZ3VhcmRzIGFnYWluc3QgYm90aCB0b28gc2hvcnQKKyUlICBhbmQgb3Zlcmxvbmcgc2VxdWVuY2VzLiBOIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdHJpcAorc3RyaXBfY29udGludWF0aW9ucyg8PFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZywgMCkgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKTsKK3N0cmlwX2NvbnRpbnVhdGlvbnMoPDxYLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIE4pIHdoZW4gWCA+PSAxMjgsIFggPTwgMTkxIC0+CisgICAgc3RyaXBfY29udGludWF0aW9ucyhSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcsIE4gLSAxKTsKKyUlIG5vdCBhIGNvbnRpbnVhdGlvbiBieXRlLCBpbnNlcnQgYSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgZm9yIHNlcXVlbmNlIHRodXMKKyUlICBmYXIgYW5kIGRpc3BhdGNoIGJhY2sgdG8gc3RyaW5nCitzdHJpcF9jb250aW51YXRpb25zKDw8UmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnLCBfKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgMTYjZmZmZCksIFN0YWNrLCBDb25maWcpLgorCisKKyUlIHRoaXMgYWxsIGdldHMgcmVhbGx5IGdyb3NzIGFuZCBzaG91bGQgcHJvYmFibHkgZXZlbnR1YWxseSBiZSBmb2xkZWQgaW50bworJSUgIGJ1dCBmb3Igbm93IGl0IGZha2VzIGJlaW5nIHBhcnQgb2Ygc3RyaW5nIG9uIGluY29tcGxldGVzIGFuZCBlcnJvcnMKK3VuZXNjYXBlKDw8JGIsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcYiksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkZiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxmKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCRuLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkXG4pLCBTdGFjaywgQ29uZmlnKTsKK3VuZXNjYXBlKDw8JHIsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsICRcciksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkdCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFx0KSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PD9kb3VibGVxdW90ZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFwiKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PD9yc29saWR1cywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJFxcKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PD9zb2xpZHVzLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgc3RyaW5nKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkLyksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkdSwgJGQsIEEsIEIsIEMsID9yc29saWR1cywgJHUsICRkLCBYLCBZLCBaLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpCisgICAgICAgIHdoZW4gKEEgPT0gJDggb3JlbHNlIEEgPT0gJDkgb3JlbHNlIEEgPT0gJGEgb3JlbHNlIEEgPT0gJGIpLAorICAgICAgICAgICAgIChYID09ICRjIG9yZWxzZSBYID09ICRkIG9yZWxzZSBYID09ICRlIG9yZWxzZSBYID09ICRmKSwKKyAgICAgICAgICAgICA/aXNfaGV4KEIpLCA/aXNfaGV4KEMpLCA/aXNfaGV4KFkpLCA/aXNfaGV4KFopCisgICAgICAgIC0+CisgICAgSGlnaCA9IGVybGFuZzpsaXN0X3RvX2ludGVnZXIoWyRkLCBBLCBCLCBDXSwgMTYpLAorICAgIExvdyA9IGVybGFuZzpsaXN0X3RvX2ludGVnZXIoWyRkLCBYLCBZLCBaXSwgMTYpLAorICAgIENvZGVwb2ludCA9IChIaWdoIC0gMTYjZDgwMCkgKiAxNiM0MDAgKyAoTG93IC0gMTYjZGMwMCkgKyAxNiMxMDAwMCwKKyAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIENvZGVwb2ludCksIFN0YWNrLCBDb25maWcpOwordW5lc2NhcGUoPDwkdSwgJGQsIEEsIEIsIEMsID9yc29saWR1cywgJHUsIFcsIFgsIFksIFosIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykKKyAgICAgICAgd2hlbiAoQSA9PSAkOCBvcmVsc2UgQSA9PSAkOSBvcmVsc2UgQSA9PSAkYSBvcmVsc2UgQSA9PSAkYiksCisgICAgICAgICAgICAgP2lzX2hleChCKSwgP2lzX2hleChDKSwgP2lzX2hleChXKSwgP2lzX2hleChYKSwgP2lzX2hleChZKSwgP2lzX2hleChaKQorICAgICAgICAtPgorICAgIHN0cmluZyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgWzE2I2ZmZmQsIDE2I2ZmZmRdKSwgU3RhY2ssIENvbmZpZyk7Cit1bmVzY2FwZSg8PCR1LCBBLCBCLCBDLCBELCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpCisgICAgICAgIHdoZW4gP2lzX2hleChBKSwgP2lzX2hleChCKSwgP2lzX2hleChDKSwgP2lzX2hleChEKSAtPgorICAgIGNhc2UgZXJsYW5nOmxpc3RfdG9faW50ZWdlcihbQSwgQiwgQywgRF0sIDE2KSBvZgorICAgICAgICBDb2RlcG9pbnQgd2hlbiBDb2RlcG9pbnQgPCAxNiNkODAwOyBDb2RlcG9pbnQgPiAxNiNkZmZmIC0+CisgICAgICAgICAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIENvZGVwb2ludCksIFN0YWNrLCBDb25maWcpOworICAgICAgICBfIC0+CisgICAgICAgICAgICBzdHJpbmcoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIDE2I2ZmZmQpLCBTdGFjaywgQ29uZmlnKQorICAgIGVuZDsKK3VuZXNjYXBlKF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworJSUgbGlrZSBpbiBzdHJpbmdzLCB0aGVyZSdzIHNvbWUgcHNldWRvIHN0YXRlcyBpbiBoZXJlIHRoYXQgd2lsbCBuZXZlcgorJSUgIHNob3cgdXAgaW4gZXJyb3JzIG9yIGluY29tcGxldGVzLiBzb21lIHNob3cgdXAgaW4gdmFsdWUsIHNvbWUgc2hvdworJSUgIHVwIGluIGludGVnZXIsIGRlY2ltYWwgb3IgZXhwCituZWdhdGl2ZSg8PCQwLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgemVybyhSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgJDApLCBTdGFjaywgQ29uZmlnKTsKK25lZ2F0aXZlKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuID9pc19ub256ZXJvKFMpIC0+CisgICAgaW50ZWdlcihSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworbmVnYXRpdmUoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCit6ZXJvKDw8P2RlY2ltYWxwb2ludCwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGRlY2ltYWwoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsID9kZWNpbWFscG9pbnQpLCBTdGFjaywgQ29uZmlnKTsKK3plcm8oPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gJGU7IFMgPTo9ICRFIC0+CisgICAgZShSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgIi4wZSIpLCBTdGFjaywgQ29uZmlnKTsKK3plcm8oQmluLCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmluaXNoX251bWJlcihCaW4sIEhhbmRsZXIsIHt6ZXJvLCBBY2N9LCBTdGFjaywgQ29uZmlnKS4KKworCitpbnRlZ2VyKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGludGVnZXIoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2ludGVnZXIoPDw/ZGVjaW1hbHBvaW50LCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgaW5pdGlhbGRlY2ltYWwoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsID9kZWNpbWFscG9pbnQpLCBTdGFjaywgQ29uZmlnKTsKK2ludGVnZXIoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gJGU7IFMgPTo9ICRFIC0+CisgICAgZShSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgIi4wZSIpLCBTdGFjaywgQ29uZmlnKTsKK2ludGVnZXIoQmluLCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgZmluaXNoX251bWJlcihCaW4sIEhhbmRsZXIsIHtpbnRlZ2VyLCBBY2N9LCBTdGFjaywgQ29uZmlnKS4KKworCitpbml0aWFsZGVjaW1hbCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBkZWNpbWFsKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7Citpbml0aWFsZGVjaW1hbChfQmluLCBfSGFuZGxlciwgX0FjYywgX1N0YWNrLCBfQ29uZmlnKSAtPgorICAgIGVybGFuZzplcnJvcihiYWRhcmcpLgorCisKK2RlY2ltYWwoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZGVjaW1hbChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworZGVjaW1hbCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSAkZTsgUyA9Oj0gJEUgLT4KKyAgICBlKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCAkZSksIFN0YWNrLCBDb25maWcpOworZGVjaW1hbChCaW4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgLT4KKyAgICBmaW5pc2hfbnVtYmVyKEJpbiwgSGFuZGxlciwge2RlY2ltYWwsIEFjY30sIFN0YWNrLCBDb25maWcpLgorCisKK2UoPDxTLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIHdoZW4gUyA9Oj0gP3plcm87ID9pc19ub256ZXJvKFMpIC0+CisgICAgZXhwKFJlc3QsIEhhbmRsZXIsIGFjY19zZXEoQWNjLCBTKSwgU3RhY2ssIENvbmZpZyk7CitlKDw8U2lnbiwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFNpZ24gPTo9ID9wb3NpdGl2ZTsgU2lnbiA9Oj0gP25lZ2F0aXZlIC0+CisgICAgZXgoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFNpZ24pLCBTdGFjaywgQ29uZmlnKTsKK2UoX0JpbiwgX0hhbmRsZXIsIF9BY2MsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCitleCg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIEFjYywgU3RhY2ssIENvbmZpZykgd2hlbiBTID06PSA/emVybzsgP2lzX25vbnplcm8oUykgLT4KKyAgICBleHAoUmVzdCwgSGFuZGxlciwgYWNjX3NlcShBY2MsIFMpLCBTdGFjaywgQ29uZmlnKTsKK2V4KF9CaW4sIF9IYW5kbGVyLCBfQWNjLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZXhwKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSB3aGVuIFMgPTo9ID96ZXJvOyA/aXNfbm9uemVybyhTKSAtPgorICAgIGV4cChSZXN0LCBIYW5kbGVyLCBhY2Nfc2VxKEFjYywgUyksIFN0YWNrLCBDb25maWcpOworZXhwKEJpbiwgSGFuZGxlciwgQWNjLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIGZpbmlzaF9udW1iZXIoQmluLCBIYW5kbGVyLCB7ZXhwLCBBY2N9LCBTdGFjaywgQ29uZmlnKS4KKworCitmaW5pc2hfbnVtYmVyKFJlc3QsIEhhbmRsZXIsIEFjYywgW10sIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudChmb3JtYXRfbnVtYmVyKEFjYyksIEhhbmRsZXIsIENvbmZpZyksIFtdLCBDb25maWcpOworZmluaXNoX251bWJlcihSZXN0LCBIYW5kbGVyLCBBY2MsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZm9ybWF0X251bWJlcihBY2MpLCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKS4KKworCitmb3JtYXRfbnVtYmVyKHt6ZXJvLCBBY2N9KSAtPiB7aW50ZWdlciwgbGlzdF90b19pbnRlZ2VyKGxpc3RzOnJldmVyc2UoQWNjKSl9OworZm9ybWF0X251bWJlcih7aW50ZWdlciwgQWNjfSkgLT4ge2ludGVnZXIsIGxpc3RfdG9faW50ZWdlcihsaXN0czpyZXZlcnNlKEFjYykpfTsKK2Zvcm1hdF9udW1iZXIoe2RlY2ltYWwsIEFjY30pIC0+IHtmbG9hdCwgbGlzdF90b19mbG9hdChsaXN0czpyZXZlcnNlKEFjYykpfTsKK2Zvcm1hdF9udW1iZXIoe2V4cCwgQWNjfSkgLT4ge2Zsb2F0LCBsaXN0X3RvX2Zsb2F0KGxpc3RzOnJldmVyc2UoQWNjKSl9LgorCisKK3RydWUoPDwkciwgJHUsICRlLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBTdGFjaywgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KHtsaXRlcmFsLCB0cnVlfSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7Cit0cnVlKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZmFsc2UoPDwkYSwgJGwsICRzLCAkZSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgLT4KKyAgICBtYXliZV9kb25lKFJlc3QsIGhhbmRsZV9ldmVudCh7bGl0ZXJhbCwgZmFsc2V9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK2ZhbHNlKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworbnVsbCg8PCR1LCAkbCwgJGwsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFN0YWNrLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoe2xpdGVyYWwsIG51bGx9LCBIYW5kbGVyLCBDb25maWcpLCBTdGFjaywgQ29uZmlnKTsKK251bGwoX0JpbiwgX0hhbmRsZXIsIF9TdGFjaywgX0NvbmZpZykgLT4KKyAgICBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KKworCittYXliZV9kb25lKDw8UmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW10sIENvbmZpZykgLT4KKyAgICBkb25lKFJlc3QsIGhhbmRsZV9ldmVudChlbmRfanNvbiwgSGFuZGxlciwgQ29uZmlnKSwgW10sIENvbmZpZyk7CittYXliZV9kb25lKDw8P2VuZF9vYmplY3QsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtvYmplY3R8U3RhY2tdLCBDb25maWcpIC0+CisgICAgbWF5YmVfZG9uZShSZXN0LCBoYW5kbGVfZXZlbnQoZW5kX29iamVjdCwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7CittYXliZV9kb25lKDw8P2VuZF9hcnJheSwgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgW2FycmF5fFN0YWNrXSwgQ29uZmlnKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgaGFuZGxlX2V2ZW50KGVuZF9hcnJheSwgSGFuZGxlciwgQ29uZmlnKSwgU3RhY2ssIENvbmZpZyk7CittYXliZV9kb25lKDw8P2NvbW1hLCBSZXN0L2JpbmFyeT4+LCBIYW5kbGVyLCBbb2JqZWN0fFN0YWNrXSwgQ29uZmlnKSAtPgorICAgIGtleShSZXN0LCBIYW5kbGVyLCBba2V5fFN0YWNrXSwgQ29uZmlnKTsKK21heWJlX2RvbmUoPDw/Y29tbWEsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFthcnJheXxfXSA9IFN0YWNrLCBDb25maWcpIC0+CisgICAgdmFsdWUoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CittYXliZV9kb25lKDw8UywgUmVzdC9iaW5hcnk+PiwgSGFuZGxlciwgU3RhY2ssIENvbmZpZykgd2hlbiA/aXNfd2hpdGVzcGFjZShTKSAtPgorICAgIG1heWJlX2RvbmUoUmVzdCwgSGFuZGxlciwgU3RhY2ssIENvbmZpZyk7CittYXliZV9kb25lKF9CaW4sIF9IYW5kbGVyLCBfU3RhY2ssIF9Db25maWcpIC0+CisgICAgZXJsYW5nOmVycm9yKGJhZGFyZykuCisKKworZG9uZSg8PFMsIFJlc3QvYmluYXJ5Pj4sIEhhbmRsZXIsIFtdLCBDb25maWcpIHdoZW4gP2lzX3doaXRlc3BhY2UoUykgLT4KKyAgICBkb25lKFJlc3QsIEhhbmRsZXIsIFtdLCBDb25maWcpOworZG9uZSg8PD4+LCB7X0hhbmRsZXIsIFN0YXRlfSwgW10sIF9Db25maWcpIC0+IFN0YXRlOworZG9uZShfQmluLCBfSGFuZGxlciwgX1N0YWNrLCBfQ29uZmlnKSAtPiBlcmxhbmc6ZXJyb3IoYmFkYXJnKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9qc29uX3Byb3RvY29sLmVybAppbmRleCBhYTRhZWQ4Li5jNWYzZGE4IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfanNvbl9wcm90b2NvbC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X2pzb25fcHJvdG9jb2wuZXJsCkBAIC01Niw2ICs1Niw3IEBACiB0eXBlaWRfdG9fanNvbig/dFR5cGVfQk9PTCkgLT4gInRmIjsKIHR5cGVpZF90b19qc29uKD90VHlwZV9CWVRFKSAtPiAiaTgiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0RPVUJMRSkgLT4gImRibCI7Cit0eXBlaWRfdG9fanNvbig/dFR5cGVfSTgpIC0+ICJpOCI7CiB0eXBlaWRfdG9fanNvbig/dFR5cGVfSTE2KSAtPiAiaTE2IjsKIHR5cGVpZF90b19qc29uKD90VHlwZV9JMzIpIC0+ICJpMzIiOwogdHlwZWlkX3RvX2pzb24oP3RUeXBlX0k2NCkgLT4gImk2NCI7CkBAIC02Niw4ICs2Nyw4IEBACiB0eXBlaWRfdG9fanNvbig/dFR5cGVfTElTVCkgLT4gImxzdCIuCiAKIGpzb25fdG9fdHlwZWlkKCJ0ZiIpIC0+ID90VHlwZV9CT09MOwotanNvbl90b190eXBlaWQoImk4IikgLT4gP3RUeXBlX0JZVEU7CiBqc29uX3RvX3R5cGVpZCgiZGJsIikgLT4gP3RUeXBlX0RPVUJMRTsKK2pzb25fdG9fdHlwZWlkKCJpOCIpIC0+ID90VHlwZV9JODsKIGpzb25fdG9fdHlwZWlkKCJpMTYiKSAtPiA/dFR5cGVfSTE2OwoganNvbl90b190eXBlaWQoImkzMiIpIC0+ID90VHlwZV9JMzI7CiBqc29uX3RvX3R5cGVpZCgiaTY0IikgLT4gP3RUeXBlX0k2NDsKQEAgLTI5NCw3ICsyOTUsNyBAQAogICAgICAgICB7Y29udGV4dF9wcmVfaXRlbSwgZmFsc2V9LAogICAgICAgICBjYXNlIGlzX2JpbmFyeShTdHIpIG9mCiAgICAgICAgICAgICB0cnVlIC0+IFN0cjsKLSAgICAgICAgICAgIGZhbHNlIC0+IGpzeDp0ZXJtX3RvX2pzb24obGlzdF90b19iaW5hcnkoU3RyKSwgW3tzdHJpY3QsIGZhbHNlfV0pCisgICAgICAgICAgICBmYWxzZSAtPiA8PCJcIiIsIChsaXN0X3RvX2JpbmFyeShTdHIpKS9iaW5hcnksICJcIiI+PgogICAgICAgICBlbmQsCiAgICAgICAgIHtjb250ZXh0X3Bvc3RfaXRlbSwgZmFsc2V9CiAgICAgXSk7CkBAIC0zMjUsMTAgKzMyNiwxMSBAQAogJSUgU3Vic2VxdWVudCBjYWxscyB0byByZWFkIGFjdHVhbGx5IG9wZXJhdGUgb24gdGhlIGV2ZW50cyByZXR1cm5lZCBieSBKU1guCiByZWFkX2FsbCgjanNvbl9wcm90b2NvbHt0cmFuc3BvcnQgPSBUcmFuc3BvcnQwfSA9IFN0YXRlKSAtPgogICAgIHtUcmFuc3BvcnQxLCBCaW59ID0gcmVhZF9hbGxfMShUcmFuc3BvcnQwLCBbXSksCi0gICAgUCA9IGpzeDpwYXJzZXIoKSwKKyAgICBQID0gdGhyaWZ0X2pzb25fcGFyc2VyOnBhcnNlcigpLAorICAgIFtGaXJzdHxSZXN0XSA9IFAoQmluKSwKICAgICBTdGF0ZSNqc29uX3Byb3RvY29sewogICAgICAgICB0cmFuc3BvcnQgPSBUcmFuc3BvcnQxLAotICAgICAgICBqc3ggPSBQKEJpbikKKyAgICAgICAganN4ID0ge2V2ZW50LCBGaXJzdCwgUmVzdH0KICAgICB9LgogCiByZWFkX2FsbF8xKFRyYW5zcG9ydDAsIElvTGlzdCkgLT4KQEAgLTM0Niw4ICszNDgsOCBAQAogJSB0eXBlIGFzIGlucHV0LiBDb21wYXJpbmcgdGhlIHJlYWQgZXZlbnQgZnJvbSB0aGUgb25lIGlzIHdhcyBwYXNzZWQsIGl0CiAlIHJldHVybnMgYW4gZXJyb3IgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGVuY291bnRlcmVkLgogJSBFeHBlY3QgYWxzbyBtYWludGFpbnMgdGhlIGNvbnRleHQgc3RhY2sgaW4gI2pzb25fcHJvdG9jb2wuCi1leHBlY3QoI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwge1R5cGUsIERhdGF9PUV2LCBOZXh0fX09U3RhdGUsIEV4cGVjdGVkVHlwZSkgLT4KLSAgICBOZXh0U3RhdGUgPSBTdGF0ZSNqc29uX3Byb3RvY29se2pzeD1OZXh0KCl9LAorZXhwZWN0KCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIHtUeXBlLCBEYXRhfT1FdiwgW05leHR8UmVzdF19fT1TdGF0ZSwgRXhwZWN0ZWRUeXBlKSAtPgorICAgIE5leHRTdGF0ZSA9IFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PXtldmVudCwgTmV4dCwgUmVzdH19LAogICAgIGNhc2UgVHlwZSA9PSBFeHBlY3RlZFR5cGUgb2YKICAgICAgICAgdHJ1ZSAtPiAKICAgICAgICAgICAgIHtOZXh0U3RhdGUsIHtvaywgY29udmVydF9kYXRhKFR5cGUsIERhdGEpfX07CkBAIC0zODUsOCArMzg3LDggQEAKICAgICAgICAgICAgIEVycm9yCiAgICAgZW5kLgogCi1yZWFkX2ZpZWxkKCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIEZpZWxkLCBOZXh0fX0gPSBTdGF0ZSkgLT4KLSAgICBOZXdTdGF0ZSA9IFN0YXRlI2pzb25fcHJvdG9jb2x7anN4PU5leHQoKX0sCityZWFkX2ZpZWxkKCNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIEZpZWxkLCBbTmV4dHxSZXN0XX19ID0gU3RhdGUpIC0+CisgICAgTmV3U3RhdGUgPSBTdGF0ZSNqc29uX3Byb3RvY29se2pzeD17ZXZlbnQsIE5leHQsIFJlc3R9fSwKICAgICB7TmV3U3RhdGUsIEZpZWxkfS4KIAogcmVhZChUaGlzMCwgbWVzc2FnZV9iZWdpbikgLT4KQEAgLTU2Myw0ICs1NjUsMyBAQAogICAgICAgICAgICAgICAgIHRocmlmdF9qc29uX3Byb3RvY29sOm5ldyhUcmFuc3BvcnQsIFtdKQogICAgICAgICBlbmQsCiAgICAge29rLCBGfS4KLQpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOWFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydC5lcmwKQEAgLTAsMCArMSw4MyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQpLgorCistYmVoYXZpb3VyKHRocmlmdF90cmFuc3BvcnQpLgorCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHJlYWRfZXhhY3QvMiwgd3JpdGUvMiwgZmx1c2gvMSwgY2xvc2UvMV0pLgorCisKKy1yZWNvcmQodF9tZW1idWZmZXIsIHsKKyAgYnVmZmVyID0gW10KK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X21lbWJ1ZmZlcnt9LgorCisKKy1zcGVjIG5ldygpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KCkgLT4gbmV3KFtdKS4KKworLXNwZWMgbmV3KEJ1Zjo6aW9kYXRhKCkpIC0+IHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KEJ1Zikgd2hlbiBpc19saXN0KEJ1ZikgLT4KKyAgU3RhdGUgPSAjdF9tZW1idWZmZXJ7YnVmZmVyID0gQnVmfSwKKyAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpOworbmV3KEJ1Zikgd2hlbiBpc19iaW5hcnkoQnVmKSAtPgorICBTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBbQnVmXX0sCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKworcmVhZChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBHaXZlKSwKKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX0uCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4KKyAgICAgIHtSZXN1bHQsIFJlbWFpbmluZ30gPSBzcGxpdF9iaW5hcnkoQmluYXJ5LCBMZW4pLAorICAgICAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFJlbWFpbmluZ30sIHtvaywgUmVzdWx0fX07CisgICAgXyAtPgorICAgICAge1N0YXRlLCB7ZXJyb3IsIGVvZn19CisgIGVuZC4KKworCit3cml0ZShTdGF0ZSA9ICN0X21lbWJ1ZmZlcntidWZmZXIgPSBCdWZ9LCBEYXRhKQord2hlbiBpc19saXN0KERhdGEpOyBpc19iaW5hcnkoRGF0YSkgLT4KKyAge1N0YXRlI3RfbWVtYnVmZmVye2J1ZmZlciA9IFtCdWYsIERhdGFdfSwgb2t9LgorCisKK2ZsdXNoKFN0YXRlKSAtPiB7U3RhdGUsIG9rfS4KKworCitjbG9zZShTdGF0ZSkgLT4ge1N0YXRlLCBva30uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9tZW1vcnlfYnVmZmVyLmVybAppbmRleCA1M2FiYmM0Li42YTU5ZWE1IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfbWVtb3J5X2J1ZmZlci5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X21lbW9yeV9idWZmZXIuZXJsCkBAIC0yMSw0MiArMjEsMjcgQEAKIAogLWJlaGF2aW91cih0aHJpZnRfdHJhbnNwb3J0KS4KIAotJSUgQVBJCi0tZXhwb3J0KFtuZXcvMCwgbmV3LzEsIG5ld190cmFuc3BvcnRfZmFjdG9yeS8wXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8wLCBuZXcvMV0pLgorJSUgcHJvdG9jb2wgY2FsbGJhY2tzCistZXhwb3J0KFtyZWFkLzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8wXSkuCiAKLSUlIHRocmlmdF90cmFuc3BvcnQgY2FsbGJhY2tzCi0tZXhwb3J0KFt3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLXJlY29yZChtZW1vcnlfYnVmZmVyLCB7YnVmZmVyfSkuCi0tdHlwZSBzdGF0ZSgpIDo6ICNtZW1vcnlfYnVmZmVye30uCi0taW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCislJSB3cmFwcGVyIGFyb3VuZCB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydCBmb3IgbGVnYWN5IHJlYXNvbnMKIAotbmV3KCkgLT4KLSAgICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfSwKLSAgICB0aHJpZnRfdHJhbnNwb3J0Om5ldyg/TU9EVUxFLCBTdGF0ZSkuCituZXcoKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKS4KIAotbmV3IChCdWYpIHdoZW4gaXNfbGlzdCAoQnVmKSAtPgotICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sCi0gIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKTsKLW5ldyAoQnVmKSAtPgotICBTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtCdWZdfSwKLSAgdGhyaWZ0X3RyYW5zcG9ydDpuZXcoP01PRFVMRSwgU3RhdGUpLgorbmV3KFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoU3RhdGUpLgogCi1uZXdfdHJhbnNwb3J0X2ZhY3RvcnkoKSAtPgotICAgIHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KK25ld190cmFuc3BvcnRfZmFjdG9yeSgpIC0+IHtvaywgZnVuKCkgLT4gbmV3KCkgZW5kfS4KIAotJSUgV3JpdGVzIGRhdGEgaW50byB0aGUgYnVmZmVyCi13cml0ZShTdGF0ZSA9ICNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IEJ1Zn0sIERhdGEpIC0+Ci0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gW0J1ZiwgRGF0YV19LCBva30uCit3cml0ZShTdGF0ZSwgRGF0YSkgLT4gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6d3JpdGUoU3RhdGUsIERhdGEpLgogCi1mbHVzaChTdGF0ZSA9ICNtZW1vcnlfYnVmZmVyIHtidWZmZXIgPSBCdWZ9KSAtPgotICAgIHtTdGF0ZSNtZW1vcnlfYnVmZmVye2J1ZmZlciA9IFtdfSwgQnVmfS4KK3JlYWQoU3RhdGUsIERhdGEpIC0+IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0OnJlYWQoU3RhdGUsIERhdGEpLgogCi1jbG9zZShTdGF0ZSkgLT4KLSAgICB7U3RhdGUsIG9rfS4KK2ZsdXNoKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpmbHVzaChTdGF0ZSkuCiAKLXJlYWQoU3RhdGUgPSAjbWVtb3J5X2J1ZmZlcntidWZmZXIgPSBCdWZ9LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAotICAgIEdpdmUgPSBtaW4oaW9saXN0X3NpemUoQmluYXJ5KSwgTGVuKSwKLSAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCi0gICAge1N0YXRlI21lbW9yeV9idWZmZXJ7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fS4KK2Nsb3NlKFN0YXRlKSAtPiB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpjbG9zZShTdGF0ZSkuCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzVlOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXIuZXJsCkBAIC0wLDAgKzEsNTcgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcikuCisKKy1leHBvcnQoWworICAgICAgICAgIG5ldy8wCisgICAgICAgICAsc3RvcmUvMworICAgICAgICAgLGZpbmQvMgorICAgICAgICAgLGZldGNoLzIKKyAgICAgICAgXSkuCisKKy10eXBlIHNlcnZpY2VfaGFuZGxlcigpICAgICA6OiBub25lbXB0eV9zdHJpbmcoKS4KKy10eXBlIG1vZHVsZV8oKSAgICAgICAgICAgICA6OiBhdG9tKCkuCistdHlwZSBzZXJ2aWNlX2hhbmRsZXJfbWFwKCkgOjogW3tTZXJ2aWNlSGFuZGxlcjo6c2VydmljZV9oYW5kbGVyKCksIE1vZHVsZTo6bW9kdWxlXygpfV0uCisKKy1zcGVjIG5ldygpIC0+IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK25ldygpIC0+CisgICAgb3JkZGljdDpuZXcoKS4KKworLXNwZWMgc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPiBOZXdNYXAgd2hlbgorICAgIFNlcnZpY2VIYW5kbGVyIDo6IHNlcnZpY2VfaGFuZGxlcigpLAorICAgIE1vZHVsZSAgICAgICAgIDo6IG1vZHVsZV8oKSwKKyAgICBNYXAgICAgICAgICAgICA6OiBzZXJ2aWNlX2hhbmRsZXJfbWFwKCksCisgICAgTmV3TWFwICAgICAgICAgOjogc2VydmljZV9oYW5kbGVyX21hcCgpLgorc3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKSAtPgorICAgIG9yZGRpY3Q6c3RvcmUoU2VydmljZUhhbmRsZXIsIE1vZHVsZSwgTWFwKS4KKworLXNwZWMgZmluZChTZXJ2aWNlSGFuZGxlciwgTWFwKSAtPiB7b2ssIE1vZHVsZX0gfCBlcnJvciB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkgLT4KKyAgICBvcmRkaWN0OmZpbmQoU2VydmljZUhhbmRsZXIsIE1hcCkuCisKKy1zcGVjIGZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+IE1vZHVsZSB3aGVuCisgICAgU2VydmljZUhhbmRsZXIgOjogc2VydmljZV9oYW5kbGVyKCksCisgICAgTW9kdWxlICAgICAgICAgOjogbW9kdWxlXygpLAorICAgIE1hcCAgICAgICAgICAgIDo6IHNlcnZpY2VfaGFuZGxlcl9tYXAoKS4KK2ZldGNoKFNlcnZpY2VIYW5kbGVyLCBNYXApIC0+CisgICAgb3JkZGljdDpmZXRjaChTZXJ2aWNlSGFuZGxlciwgTWFwKS4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2I3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZXJsCkBAIC0wLDAgKzEsODMgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbCkuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3Byb3RvY29sKS4KKworLWluY2x1ZGUoInRocmlmdF9jb25zdGFudHMuaHJsIikuCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sLmhybCIpLgorCistaW5jbHVkZSgidGhyaWZ0X3Byb3RvY29sX2JlaGF2aW91ci5ocmwiKS4KKworLWV4cG9ydChbbmV3LzIsCisgICAgICAgICByZWFkLzIsCisgICAgICAgICB3cml0ZS8yLAorICAgICAgICAgZmx1c2hfdHJhbnNwb3J0LzEsCisgICAgICAgICBjbG9zZV90cmFuc3BvcnQvMQorICAgICAgICBdKS4KKworLXJlY29yZChwcm90b2NvbCwge21vZHVsZSwgZGF0YX0pLgorLXR5cGUgcHJvdG9jb2woKSA6OiAjcHJvdG9jb2x7fS4KKworLXJlY29yZCAobXVsdGlwbGV4ZWRfcHJvdG9jb2wsIHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGU6OmF0b20oKSwKKwkJCQkJCQkJcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZTo6dGVybSgpLAorCQkJCQkJCQlzZXJ2aWNlX25hbWU6Om5vbmVtcHR5X3N0cmluZygpfSkuCisKKy10eXBlIHN0YXRlKCkgOjogI211bHRpcGxleGVkX3Byb3RvY29se30uCisKKy1zcGVjIG5ldyhQcm90b2NvbFRvRGVjb3JhdGU6OnByb3RvY29sKCksIFNlcnZpY2VOYW1lOjpub25lbXB0eV9zdHJpbmcoKSkgLT4ge29rLCBQcm90b2NvbDo6cHJvdG9jb2woKX0uCituZXcoUHJvdG9jb2xUb0RlY29yYXRlLCBTZXJ2aWNlTmFtZSkgd2hlbiBpc19yZWNvcmQoUHJvdG9jb2xUb0RlY29yYXRlLCBwcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19saXN0KFNlcnZpY2VOYW1lKSAtPgorICAgIFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sVG9EZWNvcmF0ZSNwcm90b2NvbC5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gUHJvdG9jb2xUb0RlY29yYXRlI3Byb3RvY29sLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZV9uYW1lID0gU2VydmljZU5hbWV9LAorICAgIHRocmlmdF9wcm90b2NvbDpuZXcoP01PRFVMRSwgU3RhdGUpLgorCitmbHVzaF90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmZsdXNoX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCitjbG9zZV90cmFuc3BvcnQoU3RhdGUgPSAjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfbW9kdWxlX3RvX2RlY29yYXRlID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0pIC0+CisgICAge1N0YXRlMSwgb2t9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOmNsb3NlX3RyYW5zcG9ydChTdGF0ZTApLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCit3cml0ZShTdGF0ZSA9ICNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9tb2R1bGVfdG9fZGVjb3JhdGUgPSBQcm90b2NvbE1vZHVsZVRvRGVjb3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX25hbWUgPSBTZXJ2aWNlTmFtZX0sCisgICAgICBNZXNzYWdlID0gI3Byb3RvY29sX21lc3NhZ2VfYmVnaW57bmFtZSA9IE5hbWV9KSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UjcHJvdG9jb2xfbWVzc2FnZV9iZWdpbntuYW1lPVNlcnZpY2VOYW1lICsrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID9NVUxUSVBMRVhFRF9TRVJWSUNFX1NFUEFSQVRPUiArKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lfSksCisgICAge1N0YXRlI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX2RhdGFfdG9fZGVjb3JhdGUgPSBTdGF0ZTF9LCBva307CisKK3dyaXRlKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMH0sCisgICAgICBNZXNzYWdlKSAtPgorICAgIHtTdGF0ZTEsIG9rfSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZTp3cml0ZShTdGF0ZTAsIE1lc3NhZ2UpLAorICAgIHtTdGF0ZSNtdWx0aXBsZXhlZF9wcm90b2NvbHtwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUxfSwgb2t9LgorCityZWFkKFN0YXRlID0gI211bHRpcGxleGVkX3Byb3RvY29se3Byb3RvY29sX21vZHVsZV90b19kZWNvcmF0ZSA9IFByb3RvY29sTW9kdWxlVG9EZWNvcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF9kYXRhX3RvX2RlY29yYXRlID0gU3RhdGUwfSwKKyAgICAgTWVzc2FnZSkgLT4KKyAgICB7U3RhdGUxLCBSZXN1bHR9ID0gUHJvdG9jb2xNb2R1bGVUb0RlY29yYXRlOnJlYWQoU3RhdGUwLCBNZXNzYWdlKSwKKyAgICB7U3RhdGUjbXVsdGlwbGV4ZWRfcHJvdG9jb2x7cHJvdG9jb2xfZGF0YV90b19kZWNvcmF0ZSA9IFN0YXRlMX0sIFJlc3VsdH0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvY2Vzc29yLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCmluZGV4IGQ0NzQyOTQuLjVjOWYyNmYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm9jZXNzb3IuZXJsCkBAIC0zMyw0MSArMzMsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyfSkuCiAKIGxvb3AoU3RhdGUwID0gI3RocmlmdF9wcm9jZXNzb3J7cHJvdG9jb2wgID0gUHJvdG8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gSGFuZGxlcn0pIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlID0gU2VydmljZX0pIC0+CisKICAgICB7UHJvdG8xLCBNZXNzYWdlQmVnaW59ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG8wLCBtZXNzYWdlX2JlZ2luKSwKICAgICBTdGF0ZTEgPSBTdGF0ZTAjdGhyaWZ0X3Byb2Nlc3Nvcntwcm90b2NvbCA9IFByb3RvMX0sCisKKyAgICBFcnJvckhhbmRsZXIgPSBmdW4KKyAgICAgICAgKEhhbmRsZXJNb2R1bGVzKSB3aGVuIGlzX2xpc3QoSGFuZGxlck1vZHVsZXMpIC0+IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaCg/TVVMVElQTEVYRURfRVJST1JfSEFORExFUl9LRVksIEhhbmRsZXJNb2R1bGVzKTsKKyAgICAgICAgKEhhbmRsZXJNb2R1bGUpIC0+IEhhbmRsZXJNb2R1bGUKKyAgICBlbmQsCisKICAgICBjYXNlIE1lc3NhZ2VCZWdpbiBvZgorCiAgICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfQ0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0gLT4KLSAgICAgICAgICAgIGNhc2UgaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgU2VxaWQpIG9mCi0gICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyKTsKLSAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcihsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb24pLAotICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCi0gICAgICAgICAgICAgICAgICAgIG9rCi0gICAgICAgICAgICBlbmQ7Ci0gICAgICAgICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue25hbWUgPSBGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ID90TWVzc2FnZVR5cGVfT05FV0FZLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxaWQgPSBTZXFpZH0gLT4KLSAgICAgICAgICAgIGNhc2UgaGFuZGxlX2Z1bmN0aW9uKFN0YXRlMSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgU2VxaWQpIG9mCi0gICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyKTsKLSAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgotICAgICAgICAgICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcihsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb24pLAotICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCi0gICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCA9IFNlcWlkfSB3aGVuIFR5cGUgPTo9ID90TWVzc2FnZVR5cGVfQ0FMTDsgVHlwZSA9Oj0gP3RNZXNzYWdlVHlwZV9PTkVXQVkgLT4KKyAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRva2VucyhGdW5jdGlvbiwgP01VTFRJUExFWEVEX1NFUlZJQ0VfU0VQQVJBVE9SKSBvZgorICAgICAgICAgICAgICAgIFtTZXJ2aWNlTmFtZSwgRnVuY3Rpb25OYW1lXSAtPgorICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTW9kdWxlICA9IHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmZXRjaChTZXJ2aWNlTmFtZSwgU2VydmljZSksCisgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIYW5kbGVyID0gdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOmZldGNoKFNlcnZpY2VOYW1lLCBIYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlTW9kdWxlLCBoYW5kbGVyPVNlcnZpY2VIYW5kbGVyfSwgbGlzdF90b19hdG9tKEZ1bmN0aW9uTmFtZSksIFNlcWlkKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAge1N0YXRlMiwgb2t9IC0+IGxvb3AoU3RhdGUyI3RocmlmdF9wcm9jZXNzb3J7c2VydmljZT1TZXJ2aWNlLCBoYW5kbGVyPUhhbmRsZXJ9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHtfU3RhdGUyLCB7ZXJyb3IsIFJlYXNvbn19IC0+CisJCQkJCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFtsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBSZWFzb25dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2sKKyAgICAgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgICAgIF8gLT4KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBoYW5kbGVfZnVuY3Rpb24oU3RhdGUxLCBsaXN0X3RvX2F0b20oRnVuY3Rpb24pLCBTZXFpZCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIHtTdGF0ZTIsIG9rfSAtPiBsb29wKFN0YXRlMik7CisgICAgICAgICAgICAgICAgICAgICAgICB7X1N0YXRlMiwge2Vycm9yLCBSZWFzb259fSAtPgorCQkJCQkJCWFwcGx5KEVycm9ySGFuZGxlcihIYW5kbGVyKSwgaGFuZGxlX2Vycm9yLCBbbGlzdF90b19hdG9tKEZ1bmN0aW9uKSwgUmVhc29uXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rCisgICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgZW5kOwogICAgICAgICB7ZXJyb3IsIHRpbWVvdXQgPSBSZWFzb259IC0+Ci0gICAgICAgICAgICBIYW5kbGVyOmhhbmRsZV9lcnJvcih1bmRlZmluZWQsIFJlYXNvbiksCisJCQlhcHBseShFcnJvckhhbmRsZXIoSGFuZGxlciksIGhhbmRsZV9lcnJvciwgW3VuZGVmaW5lZCwgUmVhc29uXSksCiAgICAgICAgICAgICB0aHJpZnRfcHJvdG9jb2w6Y2xvc2VfdHJhbnNwb3J0KFByb3RvMSksCiAgICAgICAgICAgICBvazsKICAgICAgICAge2Vycm9yLCBjbG9zZWQgPSBSZWFzb259IC0+CiAgICAgICAgICAgICAlJSBlcnJvcl9sb2dnZXI6aW5mb19tc2coIkNsaWVudCBkaXNjb25uZWN0ZWR+biIpLAotICAgICAgICAgICAgSGFuZGxlcjpoYW5kbGVfZXJyb3IodW5kZWZpbmVkLCBSZWFzb24pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAogICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bik7CiAgICAgICAgIHtlcnJvciwgUmVhc29ufSAtPgotICAgICAgICAgICAgSGFuZGxlcjpoYW5kbGVfZXJyb3IodW5kZWZpbmVkLCBSZWFzb24pLAorCQkJYXBwbHkoRXJyb3JIYW5kbGVyKEhhbmRsZXIpLCBoYW5kbGVfZXJyb3IsIFt1bmRlZmluZWQsIFJlYXNvbl0pLAogICAgICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOmNsb3NlX3RyYW5zcG9ydChQcm90bzEpLAogICAgICAgICAgICAgZXhpdChzaHV0ZG93bikKICAgICBlbmQuCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybAppbmRleCAxOTNiMDdhLi4yZmUxMGQ2IDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKQEAgLTYzLDggKzYzLDggQEAKIHR5cGVpZF90b19hdG9tKD90VHlwZV9TVE9QKSAtPiBmaWVsZF9zdG9wOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX1ZPSUQpIC0+IHZvaWQ7CiB0eXBlaWRfdG9fYXRvbSg/dFR5cGVfQk9PTCkgLT4gYm9vbDsKLXR5cGVpZF90b19hdG9tKD90VHlwZV9CWVRFKSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0RPVUJMRSkgLT4gZG91YmxlOwordHlwZWlkX3RvX2F0b20oP3RUeXBlX0k4KSAtPiBieXRlOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kxNikgLT4gaTE2OwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0kzMikgLT4gaTMyOwogdHlwZWlkX3RvX2F0b20oP3RUeXBlX0k2NCkgLT4gaTY0OwpAQCAtNzYsOCArNzYsOSBAQAogCiB0ZXJtX3RvX3R5cGVpZCh2b2lkKSAtPiA/dFR5cGVfVk9JRDsKIHRlcm1fdG9fdHlwZWlkKGJvb2wpIC0+ID90VHlwZV9CT09MOwotdGVybV90b190eXBlaWQoYnl0ZSkgLT4gP3RUeXBlX0JZVEU7Cit0ZXJtX3RvX3R5cGVpZChieXRlKSAtPiA/dFR5cGVfSTg7CiB0ZXJtX3RvX3R5cGVpZChkb3VibGUpIC0+ID90VHlwZV9ET1VCTEU7Cit0ZXJtX3RvX3R5cGVpZChpOCkgLT4gP3RUeXBlX0k4OwogdGVybV90b190eXBlaWQoaTE2KSAtPiA/dFR5cGVfSTE2OwogdGVybV90b190eXBlaWQoaTMyKSAtPiA/dFR5cGVfSTMyOwogdGVybV90b190eXBlaWQoaTY0KSAtPiA/dFR5cGVfSTY0OwpAQCAtMTQ4LDggKzE0OSwxMiBAQAogcmVhZChJUHJvdG8wLCB7bWFwLCBLZXlUeXBlLCBWYWxUeXBlfSkgLT4KICAgICB7SVByb3RvMSwgI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSwga3R5cGUgPSBLVHlwZSwgdnR5cGUgPSBWVHlwZX19ID0KICAgICAgICAgcmVhZChJUHJvdG8wLCBtYXBfYmVnaW4pLAotICAgIHtLVHlwZSwgS1R5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKEtleVR5cGUpLCBLVHlwZX0sCi0gICAge1ZUeXBlLCBWVHlwZX0gPSB7dGVybV90b190eXBlaWQoVmFsVHlwZSksIFZUeXBlfSwKKyAgICBfID0gY2FzZSBTaXplIG9mCisgICAgICAwIC0+IDA7CisgICAgICBfIC0+CisgICAgICAgIHtLVHlwZSwgS1R5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKEtleVR5cGUpLCBLVHlwZX0sCisgICAgICAgIHtWVHlwZSwgVlR5cGV9ID0ge3Rlcm1fdG9fdHlwZWlkKFZhbFR5cGUpLCBWVHlwZX0KKyAgICBlbmQsCiAgICAge0xpc3QsIElQcm90bzJ9ID0gbGlzdHM6bWFwZm9sZGwoZnVuKF8sIFByb3RvUzApIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMSwge29rLCBLZXl9fSA9IHJlYWQoUHJvdG9TMCwgS2V5VHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UHJvdG9TMiwge29rLCBWYWx9fSA9IHJlYWQoUHJvdG9TMSwgVmFsVHlwZSksCkBAIC0xOTEsNyArMTk2LDggQEAKICAgICAgICAgdGhyaWZ0X3Byb3RvY29sOnJlYWQoSVByb3RvMCwgZmllbGRfYmVnaW4pLAogICAgIGNhc2Uge0ZUeXBlLCBGaWR9IG9mCiAgICAgICAgIHs/dFR5cGVfU1RPUCwgX30gLT4KLSAgICAgICAgICAgIHtJUHJvdG8xLCBSVHVwbGV9OworICAgICAgICAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgc3RydWN0X2VuZCksCisgICAgICAgICAgICB7SVByb3RvMiwgUlR1cGxlfTsKICAgICAgICAgX0Vsc2UgLT4KICAgICAgICAgICAgIGNhc2UgZGljdDpmaW5kKEZpZCwgU0RpY3QpIG9mCiAgICAgICAgICAgICAgICAge29rLCB7VHlwZSwgSW5kZXh9fSAtPgpAQCAtMjA4LDE4ICsyMTQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2ZpZWxkKEZUeXBlLCBJUHJvdG8xLCBTRGljdCwgUlR1cGxlKQogICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgICAgX0Vsc2UyIC0+Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygiU2tpcHBpbmcgZmllbGQgfnAgd2l0aCB1bmtub3duIGZpZH5uIiwgW0ZpZF0pLAogICAgICAgICAgICAgICAgICAgICBza2lwX2ZpZWxkKEZUeXBlLCBJUHJvdG8xLCBTRGljdCwgUlR1cGxlKQogICAgICAgICAgICAgZW5kCiAgICAgZW5kLgogCiBza2lwX2ZpZWxkKEZUeXBlLCBJUHJvdG8wLCBTRGljdCwgUlR1cGxlKSAtPgotICAgIEZUeXBlQXRvbSA9IHRocmlmdF9wcm90b2NvbDp0eXBlaWRfdG9fYXRvbShGVHlwZSksCi0gICAge0lQcm90bzEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDpza2lwKElQcm90bzAsIEZUeXBlQXRvbSksCisgICAge0lQcm90bzEsIG9rfSA9IHNraXAoSVByb3RvMCwgdHlwZWlkX3RvX2F0b20oRlR5cGUpKSwKICAgICB7SVByb3RvMiwgb2t9ID0gcmVhZChJUHJvdG8xLCBmaWVsZF9lbmQpLAogICAgIHJlYWRfc3RydWN0X2xvb3AoSVByb3RvMiwgU0RpY3QsIFJUdXBsZSkuCiAKLS1zcGVjIHNraXAoI3Byb3RvY29se30sIGFueSgpKSAtPiB7I3Byb3RvY29se30sIG9rfS4KKy1zcGVjIHNraXAoI3Byb3RvY29se30sIGF0b20oKSkgLT4geyNwcm90b2NvbHt9LCBva30uCiAKIHNraXAoUHJvdG8wLCBzdHJ1Y3QpIC0+CiAgICAge1Byb3RvMSwgb2t9ID0gcmVhZChQcm90bzAsIHN0cnVjdF9iZWdpbiksCkBAIC0yNTYsNyArMjYwLDcgQEAKICAgICAgICAgP3RUeXBlX1NUT1AgLT4KICAgICAgICAgICAgIHtQcm90bzEsIG9rfTsKICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCBUeXBlKSwKKyAgICAgICAgICAgIHtQcm90bzIsIG9rfSA9IHNraXAoUHJvdG8xLCB0eXBlaWRfdG9fYXRvbShUeXBlKSksCiAgICAgICAgICAgICB7UHJvdG8zLCBva30gPSByZWFkKFByb3RvMiwgZmllbGRfZW5kKSwKICAgICAgICAgICAgIHNraXBfc3RydWN0X2xvb3AoUHJvdG8zKQogICAgIGVuZC4KQEAgLTI2Niw4ICsyNzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCBLdHlwZSksCi0gICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgVnR5cGUpLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEt0eXBlKSksCisgICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgdHlwZWlkX3RvX2F0b20oVnR5cGUpKSwKICAgICAgICAgICAgIHNraXBfbWFwX2xvb3AoUHJvdG8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfbWFwX2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwogICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQpAQCAtMjc3LDcgKzI4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gU2l6ZX0pIC0+CiAgICAgY2FzZSBTaXplIG9mCiAgICAgICAgIE4gd2hlbiBOID4gMCAtPgotICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIEV0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShFdHlwZSkpLAogICAgICAgICAgICAgc2tpcF9zZXRfbG9vcChQcm90bzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCNwcm90b2NvbF9zZXRfYmVnaW57c2l6ZSA9IFNpemUgLSAxfSk7CiAgICAgICAgIDAgLT4ge1Byb3RvMCwgb2t9CkBAIC0yODcsNyArMjkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCBFdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oRXR5cGUpKSwKICAgICAgICAgICAgIHNraXBfbGlzdF9sb29wKFByb3RvMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcCNwcm90b2NvbF9saXN0X2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwogICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCmluZGV4IDhmZjE5NDEuLjUzOGZkM2EgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwKQEAgLTM2LDE0ICszNiwxNCBAQAogICAgICAgICAgIHRlcm1pbmF0ZS8yLAogICAgICAgICAgIGNvZGVfY2hhbmdlLzMgXSkuCiAKLS1yZWNvcmQoIHN0YXRlLCB7IGNsaWVudCA9IG5pbCwgCistcmVjb3JkKCBzdGF0ZSwgeyBjbGllbnQgPSBuaWwsCiAgICAgICAgICAgICAgICAgICBob3N0LAogICAgICAgICAgICAgICAgICAgcG9ydCwKICAgICAgICAgICAgICAgICAgIHRocmlmdF9zdmMsCiAgICAgICAgICAgICAgICAgICB0aHJpZnRfb3B0cywKICAgICAgICAgICAgICAgICAgIHJlY29ubl9taW4sCiAgICAgICAgICAgICAgICAgICByZWNvbm5fbWF4LAotICAgICAgICAgICAgICAgICAgcmVjb25uX3RpbWUsCisgICAgICAgICAgICAgICAgICByZWNvbm5fdGltZSA9IDAsCiAgICAgICAgICAgICAgICAgICBvcF9jbnRfZGljdCwKICAgICAgICAgICAgICAgICAgIG9wX3RpbWVfZGljdCB9ICkuCiAKQEAgLTExNSw5ICsxMTUsOSBAQAogICAgICAgICAgICAgIF9Gcm9tLAogICAgICAgICAgICAgIFN0YXRlPSNzdGF0ZXsgY2xpZW50ID0gQ2xpZW50IH0gKSAtPgogCi0gIFN0YXJ0ID0gbm93KCksCisgIFRpbWVyID0gdGltZXJfZnVuKCksCiAgIFJlc3VsdCA9ICggY2F0Y2ggdGhyaWZ0X2NsaWVudDpjYWxsKCBDbGllbnQsIE9wLCBBcmdzKSApLAotICBUaW1lID0gdGltZXI6bm93X2RpZmYoIG5vdygpLCBTdGFydCApLAorICBUaW1lID0gVGltZXIoKSwKIAogICBjYXNlIFJlc3VsdCBvZgogICAgIHsgQywgeyBvaywgUmVwbHkgfSB9IC0+CkBAIC0xNTYsNiArMTU2LDkgQEAKICUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0b3AsIFJlYXNvbiwgU3RhdGV9CiAlJSBEZXNjcmlwdGlvbjogSGFuZGxpbmcgYWxsIG5vbiBjYWxsL2Nhc3QgbWVzc2FnZXMKICUlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2hhbmRsZV9pbmZvKCB0cnlfY29ubmVjdCwgU3RhdGUgKSAtPgorICB7IG5vcmVwbHksIHRyeV9jb25uZWN0KCBTdGF0ZSApIH07CisKIGhhbmRsZV9pbmZvKCBfSW5mbywgU3RhdGUgKSAtPgogICB7IG5vcmVwbHksIFN0YXRlIH0uCiAKQEAgLTIxNCw2ICsyMTcsMjEgQEAKICAgICBmYWxzZSAtPiBCYWNrb2ZmCiAgIGVuZC4KIAorLWlmZGVmKHRpbWVfY29ycmVjdGlvbikuCit0aW1lcl9mdW4oKSAtPgorICBUMSA9IGVybGFuZzptb25vdG9uaWNfdGltZSgpLAorICBmdW4oKSAtPgorICAgIFQyID0gZXJsYW5nOm1vbm90b25pY190aW1lKCksCisgICAgZXJsYW5nOmNvbnZlcnRfdGltZV91bml0KFQyIC0gVDEsIG5hdGl2ZSwgbWljcm9fc2Vjb25kcykKKyAgZW5kLgorLWVsc2UuCit0aW1lcl9mdW4oKSAtPgorICBUMSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgZnVuKCkgLT4KKyAgICBUMiA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgICB0aW1lcjpub3dfZGlmZihUMiwgVDEpCisgIGVuZC4KKy1lbmRpZi4KIAogaW5jcl9zdGF0cyggT3AsIFJlc3VsdCwgVGltZSwKICAgICAgICAgICAgIFN0YXRlID0gI3N0YXRleyBvcF9jbnRfZGljdCAgPSBPcENudERpY3QsCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3NlcnZlci5lcmwKaW5kZXggZjdjN2EwMi4uNGUzYzA1MiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfc2VydmVyLmVybApAQCAtMjEsMTIgKzIxLDE5IEBACiAKIC1iZWhhdmlvdXIoZ2VuX3NlcnZlcikuCiAKLS1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgorLWluY2x1ZGUgKCJ0aHJpZnRfY29uc3RhbnRzLmhybCIpLgogCi0tZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAotICAgICAgICAgaGFuZGxlX2luZm8vMl0pLgorLWlmZGVmKFRFU1QpLgorICAgIC1jb21waWxlKGV4cG9ydF9hbGwpLgorICAgIC1leHBvcnRfcmVjb3JkcyhbdGhyaWZ0X3NvY2tldF9zZXJ2ZXJdKS4KKy1lbHNlLgorICAgIC1leHBvcnQoW3N0YXJ0LzEsIHN0b3AvMV0pLgogCi0tZXhwb3J0KFthY2NlcHRvcl9sb29wLzFdKS4KKyAgICAtZXhwb3J0KFtpbml0LzEsIGhhbmRsZV9jYWxsLzMsIGhhbmRsZV9jYXN0LzIsIHRlcm1pbmF0ZS8yLCBjb2RlX2NoYW5nZS8zLAorICAgICAgICAgICAgIGhhbmRsZV9pbmZvLzJdKS4KKworICAgIC1leHBvcnQoW2FjY2VwdG9yX2xvb3AvMV0pLgorLWVuZGlmLgogCiAtcmVjb3JkKHRocmlmdF9zb2NrZXRfc2VydmVyLAogICAgICAgICB7cG9ydCwKQEAgLTM4LDcgKzQ1LDEwIEBACiAgICAgICAgICBsaXN0ZW49bnVsbCwKICAgICAgICAgIGFjY2VwdG9yPW51bGwsCiAgICAgICAgICBzb2NrZXRfb3B0cz1be3JlY3ZfdGltZW91dCwgNTAwfV0sCi0gICAgICAgICBmcmFtZWQ9ZmFsc2UKKyAgICAgICAgIHByb3RvY29sPWJpbmFyeSwKKyAgICAgICAgIGZyYW1lZD1mYWxzZSwKKyAgICAgICAgIHNzbHRyYW5zcG9ydD1mYWxzZSwKKyAgICAgICAgIHNzbG9wdGlvbnM9W10KICAgICAgICAgfSkuCiAKIHN0YXJ0KFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcnt9KSAtPgpAQCAtOTEsMTAgKzEwMSw0NiBAQAogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7aXA9UGFyc2VkSXB9KTsKIHBhcnNlX29wdGlvbnMoW3tzb2NrZXRfb3B0cywgTH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChMKSwgbGVuZ3RoKEwpID4gMCAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c29ja2V0X29wdHM9TH0pOwotcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIEhhbmRsZXJ9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IGFuIGVycm9yIGhhbmRsZXIgbXVzdCBiZSBkZWZpbmVkLiIpOworcGFyc2Vfb3B0aW9ucyhbe2hhbmRsZXIsIFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0fSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBpc19saXN0KFNlcnZpY2VIYW5kbGVyUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VIYW5kbGVyTWFwID0KKyAgICBjYXNlIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVyLmhhbmRsZXIgb2YKKyAgICAgICAgdW5kZWZpbmVkIC0+CisgICAgICAgICAgICBsaXN0czpmb2xkbCgKKyAgICAgICAgICAgICAgICBmdW4gKHtTZXJ2aWNlTmFtZSwgU2VydmljZUhhbmRsZXJ9LCBBY2MpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTmFtZSksIGlzX2F0b20oU2VydmljZUhhbmRsZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VIYW5kbGVyLCBBY2MpOworICAgICAgICAgICAgICAgICAgICAoXywgX0FjYykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICAgICAgICAgICAgICBlbmQsIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpuZXcoKSwgU2VydmljZUhhbmRsZXJQcm9wZXJ0eUxpc3QpOworICAgICAgICBfIC0+IHRocm93KCJFcnJvciB3aGlsZSBwYXJzaW5nIHRoZSBoYW5kbGVyIG9wdGlvbi4iKQorICAgIGVuZCwKKyAgICBjYXNlIHRocmlmdF9tdWx0aXBsZXhlZF9tYXBfd3JhcHBlcjpmaW5kKD9NVUxUSVBMRVhFRF9FUlJPUl9IQU5ETEVSX0tFWSwgU2VydmljZUhhbmRsZXJNYXApIG9mCisgICAgICAgIHtvaywgX0Vycm9ySGFuZGxlcn0gLT4gcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntoYW5kbGVyPVNlcnZpY2VIYW5kbGVyTWFwfSk7CisgICAgICAgIGVycm9yIC0+IHRocm93KCJUaGUgaGFuZGxlciBvcHRpb24gaXMgbm90IHByb3Blcmx5IGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzLiBJdCBzaG91bGQgYmUgYSBraW5kIG9mIFt7XCJlcnJvcl9oYW5kbGVyXCIsIE1vZHVsZTo6YXRvbSgpfSwge1NlcmljZU5hbWU6Omxpc3QoKSwgTW9kdWxlOjphdG9tKCl9LCAuLi5dIikKKyAgICBlbmQ7CitwYXJzZV9vcHRpb25zKFt7aGFuZGxlciwgSGFuZGxlcn0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuaGFuZGxlciA9PSB1bmRlZmluZWQsIGlzX2F0b20oSGFuZGxlcikgLT4KICAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2hhbmRsZXI9SGFuZGxlcn0pOwotcGFyc2Vfb3B0aW9ucyhbe3NlcnZpY2UsIFNlcnZpY2V9IHwgUmVzdF0sIFN0YXRlKSAtPgorCitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgW119IHwgX1Jlc3RdLCBfU3RhdGUpIC0+CisgICAgdGhyb3coIkF0IGxlYXN0IG9uZSBzZXJ2aWNlIG1vZHVsZSBtdXN0IGJlIGRlZmluZWQuIik7CitwYXJzZV9vcHRpb25zKFt7c2VydmljZSwgU2VydmljZU1vZHVsZVByb3BlcnR5TGlzdH0gfCBSZXN0XSwgU3RhdGUpIHdoZW4gaXNfbGlzdChTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KSAtPgorICAgIFNlcnZpY2VNb2R1bGVNYXAgPQorICAgIGNhc2UgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXIuc2VydmljZSBvZgorICAgICAgICB1bmRlZmluZWQgLT4KKyAgICAgICAgICAgIGxpc3RzOmZvbGRsKAorICAgICAgICAgICAgICAgIGZ1biAoe1NlcnZpY2VOYW1lLCBTZXJ2aWNlTW9kdWxlfSwgQWNjKSB3aGVuIGlzX2xpc3QoU2VydmljZU5hbWUpLCBpc19hdG9tKFNlcnZpY2VNb2R1bGUpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfbWFwX3dyYXBwZXI6c3RvcmUoU2VydmljZU5hbWUsIFNlcnZpY2VNb2R1bGUsIEFjYyk7CisgICAgICAgICAgICAgICAgICAgIChfLCBfQWNjKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3coIlRoZSBzZXJ2aWNlIG9wdGlvbiBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMuIEl0IHNob3VsZCBiZSBhIGtpbmQgb2YgW3tTZXJpY2VOYW1lOjpsaXN0KCksIFNlcnZpY2VNb2R1bGU6OmF0b20oKX0sIC4uLl0iKQorICAgICAgICAgICAgICAgIGVuZCwgdGhyaWZ0X211bHRpcGxleGVkX21hcF93cmFwcGVyOm5ldygpLCBTZXJ2aWNlTW9kdWxlUHJvcGVydHlMaXN0KTsKKyAgICAgICAgXyAtPiB0aHJvdygiRXJyb3Igd2hpbGUgcGFyc2luZyB0aGUgc2VydmljZSBvcHRpb24uIikKKyAgICBlbmQsCisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntzZXJ2aWNlPVNlcnZpY2VNb2R1bGVNYXB9KTsKK3BhcnNlX29wdGlvbnMoW3tzZXJ2aWNlLCBTZXJ2aWNlfSB8IFJlc3RdLCBTdGF0ZSkgd2hlbiBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlci5zZXJ2aWNlID09IHVuZGVmaW5lZCwgaXNfYXRvbShTZXJ2aWNlKSAtPgogICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c2VydmljZT1TZXJ2aWNlfSk7CisKIHBhcnNlX29wdGlvbnMoW3ttYXgsIE1heH0gfCBSZXN0XSwgU3RhdGUpIC0+CiAgICAgTWF4SW50ID0gY2FzZSBNYXggb2YKICAgICAgICAgICAgICAgICAgTWF4IHdoZW4gaXNfbGlzdChNYXgpIC0+CkBAIC0xMDMsOCArMTQ5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICBNYXgKICAgICAgICAgICAgICBlbmQsCiAgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcnttYXg9TWF4SW50fSk7CisKK3BhcnNlX29wdGlvbnMoW3twcm90b2NvbCwgUHJvdG99IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2F0b20oUHJvdG8pIC0+CisgICAgcGFyc2Vfb3B0aW9ucyhSZXN0LCBTdGF0ZSN0aHJpZnRfc29ja2V0X3NlcnZlcntwcm90b2NvbD1Qcm90b30pOworCiBwYXJzZV9vcHRpb25zKFt7ZnJhbWVkLCBGcmFtZWR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oRnJhbWVkKSAtPgotICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pLgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7ZnJhbWVkPUZyYW1lZH0pOworCitwYXJzZV9vcHRpb25zKFt7c3NsdHJhbnNwb3J0LCBTU0xUcmFuc3BvcnR9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2Jvb2xlYW4oU1NMVHJhbnNwb3J0KSAtPgorICAgIHBhcnNlX29wdGlvbnMoUmVzdCwgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7c3NsdHJhbnNwb3J0PVNTTFRyYW5zcG9ydH0pOworcGFyc2Vfb3B0aW9ucyhbe3NzbG9wdGlvbnMsIFNTTE9wdGlvbnN9IHwgUmVzdF0sIFN0YXRlKSB3aGVuIGlzX2xpc3QoU1NMT3B0aW9ucykgLT4KKyAgICBwYXJzZV9vcHRpb25zKFJlc3QsIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye3NzbG9wdGlvbnM9U1NMT3B0aW9uc30pLgogCiBzdGFydF9zZXJ2ZXIoU3RhdGU9I3RocmlmdF9zb2NrZXRfc2VydmVye25hbWU9TmFtZX0pIC0+CiAgICAgY2FzZSBOYW1lIG9mCkBAIC0xNjgsMjUgKzIyMywzMiBAQAogICAgIFN0YXRlI3RocmlmdF9zb2NrZXRfc2VydmVye2FjY2VwdG9yPW51bGx9OwogbmV3X2FjY2VwdG9yKFN0YXRlPSN0aHJpZnRfc29ja2V0X3NlcnZlcntsaXN0ZW49TGlzdGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlPVNlcnZpY2UsIGhhbmRsZXI9SGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0X29wdHM9T3B0cywgZnJhbWVkPUZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRfb3B0cz1PcHRzLCBmcmFtZWQ9RnJhbWVkLCBwcm90b2NvbD1Qcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsdHJhbnNwb3J0PVNzbFRyYW5zcG9ydCwgc3Nsb3B0aW9ucz1Tc2xPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgLT4KICAgICBQaWQgPSBwcm9jX2xpYjpzcGF3bl9saW5rKD9NT0RVTEUsIGFjY2VwdG9yX2xvb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWR9XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbe3NlbGYoKSwgTGlzdGVuLCBTZXJ2aWNlLCBIYW5kbGVyLCBPcHRzLCBGcmFtZWQsIFNzbFRyYW5zcG9ydCwgU3NsT3B0aW9ucywgUHJvdG99XSksCiAgICAgU3RhdGUjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7YWNjZXB0b3I9UGlkfS4KIAotYWNjZXB0b3JfbG9vcCh7U2VydmVyLCBMaXN0ZW4sIFNlcnZpY2UsIEhhbmRsZXIsIFNvY2tldE9wdHMsIEZyYW1lZH0pCithY2NlcHRvcl9sb29wKHtTZXJ2ZXIsIExpc3RlbiwgU2VydmljZSwgSGFuZGxlciwgU29ja2V0T3B0cywgRnJhbWVkLCBTc2xUcmFuc3BvcnQsIFNzbE9wdGlvbnMsIFByb3RvfSkKICAgd2hlbiBpc19waWQoU2VydmVyKSwgaXNfbGlzdChTb2NrZXRPcHRzKSAtPgogICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDphY2NlcHQoTGlzdGVuKSBvZiAlIGluZmluaXRlIHRpbWVvdXQKICAgICAgICAge29rLCBTb2NrZXR9IC0+CiAgICAgICAgICAgICBnZW5fc2VydmVyOmNhc3QoU2VydmVyLCB7YWNjZXB0ZWQsIHNlbGYoKX0pLAogICAgICAgICAgICAgUHJvdG9HZW4gPSBmdW4oKSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja2V0VHJhbnNwb3J0fSAgID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ICAgICAgICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFNvY2tldFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFByb3RvY29sfSAgICAgICAgICA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrZXRUcmFuc3BvcnR9ID0gY2FzZSBTc2xUcmFuc3BvcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2tldCwgU29ja2V0T3B0cywgU3NsT3B0aW9ucyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC0+IHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIFNvY2tldE9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgVHJhbnNwb3J0fSAgICAgICA9IGNhc2UgRnJhbWVkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgIC0+IHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAtPiB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Om5ldyhTb2NrZXRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9ICAgICAgICA9IGNhc2UgUHJvdG8gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgLT4gdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uIC0+IHRocmlmdF9qc29uX3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXyAtPiB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgUHJvdG9jb2x9CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgIHRocmlmdF9wcm9jZXNzb3I6aW5pdCh7U2VydmVyLCBQcm90b0dlbiwgU2VydmljZSwgSGFuZGxlcn0pOwpAQCAtMjE0LDggKzI3NiwxMSBAQAogaGFuZGxlX2Nhc3Qoc3RvcCwgU3RhdGUpIC0+CiAgICAge3N0b3AsIG5vcm1hbCwgU3RhdGV9LgogCi10ZXJtaW5hdGUoX1JlYXNvbiwgI3RocmlmdF9zb2NrZXRfc2VydmVye2xpc3Rlbj1MaXN0ZW4sIHBvcnQ9UG9ydH0pIC0+Cit0ZXJtaW5hdGUoUmVhc29uLCAjdGhyaWZ0X3NvY2tldF9zZXJ2ZXJ7bGlzdGVuPUxpc3RlbiwgcG9ydD1Qb3J0fSkgLT4KICAgICBnZW5fdGNwOmNsb3NlKExpc3RlbiksCisgICAge2JhY2t0cmFjZSwgQnR9ID0gZXJsYW5nOnByb2Nlc3NfaW5mbyhzZWxmKCksIGJhY2t0cmFjZSksCisgICAgZXJyb3JfbG9nZ2VyOmVycm9yX3JlcG9ydCh7P01PRFVMRSwgP0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NoaWxkX2Vycm9yLCBSZWFzb24sIEJ0fX0pLAogICAgIGNhc2UgUG9ydCA8IDEwMjQgb2YKICAgICAgICAgdHJ1ZSAtPgogICAgICAgICAgICAgY2F0Y2ggZmRzcnY6c3RvcCgpLApkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQuZXJsCmluZGV4IDVlMWVmMDIuLmZhMTBlZDAgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9zb2NrZXRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfc29ja2V0X3RyYW5zcG9ydC5lcmwKQEAgLTIxLDEwMiArMjEsMTU2IEBACiAKIC1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCiAKLS1leHBvcnQoW25ldy8xLAotICAgICAgICAgbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLCByZWFkLzIsIGZsdXNoLzEsIGNsb3NlLzEsCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KKyUlIGxlZ2FjeSBhcGkKKy1leHBvcnQoW25ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLSAgICAgICAgIG5ld190cmFuc3BvcnRfZmFjdG9yeS8zXSkuCiAKLS1yZWNvcmQoZGF0YSwge3NvY2tldCwKLSAgICAgICAgICAgICAgIHJlY3ZfdGltZW91dD1pbmZpbml0eX0pLgotLXR5cGUgc3RhdGUoKSA6OiAjZGF0YXt9LgotLWluY2x1ZGUoInRocmlmdF90cmFuc3BvcnRfYmVoYXZpb3VyLmhybCIpLgorLXJlY29yZCh0X3NvY2tldCwgeworICBzb2NrZXQsCisgIHJlY3ZfdGltZW91dD02MDAwMCwKKyAgYnVmZmVyID0gW10KK30pLgogCi1uZXcoU29ja2V0KSAtPgotICAgIG5ldyhTb2NrZXQsIFtdKS4KKy10eXBlIHN0YXRlKCkgOjogI3Rfc29ja2V0e30uCisKKworLXNwZWMgbmV3KFNvY2tldDo6YW55KCkpIC0+CisgIHRocmlmdF90cmFuc3BvcnQ6dF90cmFuc3BvcnQoKS4KKworbmV3KFNvY2tldCkgLT4gbmV3KFNvY2tldCwgW10pLgorCistc3BlYyBuZXcoU29ja2V0OjphbnkoKSwgT3B0czo6bGlzdCgpKSAtPgorICB0aHJpZnRfdHJhbnNwb3J0OnRfdHJhbnNwb3J0KCkuCiAKIG5ldyhTb2NrZXQsIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRzKSAtPgotICAgIFN0YXRlID0KLSAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBPcHRzKSBvZgotICAgICAgICAgICAge3ZhbHVlLCB7cmVjdl90aW1lb3V0LCBUaW1lb3V0fX0KLSAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KLSAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07Ci0gICAgICAgICAgICBfIC0+Ci0gICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNvY2tldH0KLSAgICAgICAgZW5kLAotICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KLQotJSUgRGF0YSA6OiBpb2xpc3QoKQotd3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+Ci0gICAge1RoaXMsIGdlbl90Y3A6c2VuZChTb2NrZXQsIERhdGEpfS4KLQotcmVhZChUaGlzID0gI2RhdGF7c29ja2V0PVNvY2tldCwgcmVjdl90aW1lb3V0PVRpbWVvdXR9LCBMZW4pCi0gIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgotICAgIGNhc2UgZ2VuX3RjcDpyZWN2KFNvY2tldCwgTGVuLCBUaW1lb3V0KSBvZgotICAgICAgICBFcnIgPSB7ZXJyb3IsIHRpbWVvdXR9IC0+Ci0gICAgICAgICAgICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInJlYWQgdGltZW91dDogcGVlciBjb25uIH5wIiwgW2luZXQ6cGVlcm5hbWUoU29ja2V0KV0pLAotICAgICAgICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAotICAgICAgICAgICAge1RoaXMsIEVycn07Ci0gICAgICAgIERhdGEgLT4KLSAgICAgICAgICAgIHtUaGlzLCBEYXRhfQotICAgIGVuZC4KLQotJSUgV2UgY2FuJ3QgcmVhbGx5IGZsdXNoIC0gZXZlcnl0aGluZyBpcyBmbHVzaGVkIHdoZW4gd2Ugd3JpdGUKLWZsdXNoKFRoaXMpIC0+Ci0gICAge1RoaXMsIG9rfS4KLQotY2xvc2UoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0pIC0+Ci0gICAge1RoaXMsIGdlbl90Y3A6Y2xvc2UoU29ja2V0KX0uCisgIFN0YXRlID0gcGFyc2Vfb3B0cyhPcHRzLCAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSksCisgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KIAogCi0lJSUlIEZBQ1RPUlkgR0VORVJBVElPTiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCitwYXJzZV9vcHRzKFt7cmVjdl90aW1lb3V0LCBUaW1lb3V0fXxSZXN0XSwgU3RhdGUpCit3aGVuIGlzX2ludGVnZXIoVGltZW91dCksIFRpbWVvdXQgPiAwIC0+CisgIHBhcnNlX29wdHMoUmVzdCwgU3RhdGUjdF9zb2NrZXR7cmVjdl90aW1lb3V0ID0gVGltZW91dH0pOworcGFyc2Vfb3B0cyhbe3JlY3ZfdGltZW91dCwgaW5maW5pdHl9fFJlc3RdLCBTdGF0ZSkgLT4KKyAgcGFyc2Vfb3B0cyhSZXN0LCBTdGF0ZSN0X3NvY2tldHtyZWN2X3RpbWVvdXQgPSBpbmZpbml0eX0pOworcGFyc2Vfb3B0cyhbXSwgU3RhdGUpIC0+CisgIFN0YXRlLgogCiAKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFN0YXRlID0gI3Rfc29ja2V0e2J1ZmZlciA9IEJ1Zn0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBCaW5hcnkgPSBpb2xpc3RfdG9fYmluYXJ5KEJ1ZiksCisgIGNhc2UgaW9saXN0X3NpemUoQmluYXJ5KSBvZgorICAgIFggd2hlbiBYID49IExlbiAtPgorICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShCaW5hcnksIExlbiksCisgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKKyAgICBfIC0+IHJlY3YoU3RhdGUsIExlbikKKyAgZW5kLgorCityZWN2KFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldCwgYnVmZmVyID0gQnVmfSwgTGVuKSAtPgorICBjYXNlIGdlbl90Y3A6cmVjdihTb2NrZXQsIDAsIFN0YXRlI3Rfc29ja2V0LnJlY3ZfdGltZW91dCkgb2YKKyAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAorICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAge29rLCBEYXRhfSAtPgorICAgICAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShbQnVmLCBEYXRhXSksCisgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKEJpbmFyeSksIExlbiksCisgICAgICB7UmVzdWx0LCBSZW1haW5pbmd9ID0gc3BsaXRfYmluYXJ5KEJpbmFyeSwgR2l2ZSksCisgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fQorICBlbmQuCisKKworcmVhZF9leGFjdChTdGF0ZSA9ICN0X3NvY2tldHtidWZmZXIgPSBCdWZ9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAgQmluYXJ5ID0gaW9saXN0X3RvX2JpbmFyeShCdWYpLAorICBjYXNlIGlvbGlzdF9zaXplKEJpbmFyeSkgb2YKKyAgICBYIHdoZW4gWCA+PSBMZW4gLT4gcmVhZChTdGF0ZSwgTGVuKTsKKyAgICBYIC0+CisgICAgICBjYXNlIGdlbl90Y3A6cmVjdihTdGF0ZSN0X3NvY2tldC5zb2NrZXQsIExlbiAtIFgsIFN0YXRlI3Rfc29ja2V0LnJlY3ZfdGltZW91dCkgb2YKKyAgICAgICAge2Vycm9yLCBFcnJvcn0gLT4KKyAgICAgICAgICBnZW5fdGNwOmNsb3NlKFN0YXRlI3Rfc29ja2V0LnNvY2tldCksCisgICAgICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAgICAgIHtvaywgRGF0YX0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gW119LCB7b2ssIDw8QmluYXJ5L2JpbmFyeSwgRGF0YS9iaW5hcnk+Pn19CisgICAgICBlbmQKKyAgZW5kLgorCisKK3dyaXRlKFN0YXRlID0gI3Rfc29ja2V0e3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+CisgIGNhc2UgZ2VuX3RjcDpzZW5kKFNvY2tldCwgRGF0YSkgb2YKKyAgICB7ZXJyb3IsIEVycm9yfSAtPgorICAgICAgZ2VuX3RjcDpjbG9zZShTb2NrZXQpLAorICAgICAge1N0YXRlLCB7ZXJyb3IsIEVycm9yfX07CisgICAgb2sgLT4ge1N0YXRlLCBva30KKyAgZW5kLgorCisKK2ZsdXNoKFN0YXRlKSAtPgorICB7U3RhdGUjdF9zb2NrZXR7YnVmZmVyID0gW119LCBva30uCisKKworY2xvc2UoU3RhdGUgPSAjdF9zb2NrZXR7c29ja2V0ID0gU29ja2V0fSkgLT4KKyAge1N0YXRlLCBnZW5fdGNwOmNsb3NlKFNvY2tldCl9LgorCisKKyUlIGxlZ2FjeSBhcGkuIGxlZnQgZm9yIGNvbXBhdGliaWxpdHkKKwogJSUgVGhlIGZvbGxvd2luZyAibG9jYWwiIHJlY29yZCBpcyBmaWxsZWQgaW4gYnkgcGFyc2VfZmFjdG9yeV9vcHRpb25zLzIKICUlIGJlbG93LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gbmV3X3Byb3RvY29sX2ZhY3RvcnkvMyBpbiBhCiAlJSBwcm9wbGlzdHMtc3R5bGUgb3B0aW9uIGxpc3QuIFRoZXkncmUgcGFyc2VkIGxpa2UgdGhpcyBzbyBpdCBpcyBhbiBPKG4pCiAlJSBvcGVyYXRpb24gaW5zdGVhZCBvZiBPKG5eMikKLS1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7Y29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCi0gICAgICAgICAgICAgICAgICAgICAgIHNvY2tvcHRzID0gW10sCi0gICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IGZhbHNlfSkuCistcmVjb3JkKGZhY3Rvcnlfb3B0cywgeworICBjb25uZWN0X3RpbWVvdXQgPSBpbmZpbml0eSwKKyAgc29ja29wdHMgPSBbXSwKKyAgZnJhbWVkID0gZmFsc2UKK30pLgogCi1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW10sIE9wdHMpIC0+Ci0gICAgT3B0czsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2ZyYW1lZCwgQm9vbH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19ib29sZWFuKEJvb2wpIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZD1Cb29sfSk7Ci1wYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzb2Nrb3B0cywgT3B0TGlzdH0gfCBSZXN0XSwgT3B0cykgd2hlbiBpc19saXN0KE9wdExpc3QpIC0+Ci0gICAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIE9wdHMjZmFjdG9yeV9vcHRze3NvY2tvcHRzPU9wdExpc3R9KTsKLXBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99IHwgUmVzdF0sIE9wdHMpIHdoZW4gVE8gPTo9IGluZmluaXR5OyBpc19pbnRlZ2VyKFRPKSAtPgotICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tjb25uZWN0X3RpbWVvdXQ9VE99KS4KK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbXSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykgLT4ge0ZhY3RvcnlPcHRzLCBUcmFuc09wdHN9OworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7ZnJhbWVkLCBCb29sfXxSZXN0XSwgRmFjdG9yeU9wdHMsIFRyYW5zT3B0cykKK3doZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgRmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRze2ZyYW1lZCA9IEJvb2x9LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBpc19saXN0KE9wdExpc3QpIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7c29ja29wdHMgPSBPcHRMaXN0fSwgVHJhbnNPcHRzKTsKK3BhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhbe2Nvbm5lY3RfdGltZW91dCwgVE99fFJlc3RdLCBGYWN0b3J5T3B0cywgVHJhbnNPcHRzKQord2hlbiBUTyA9Oj0gaW5maW5pdHk7IGlzX2ludGVnZXIoVE8pIC0+CisgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0ID0gVE99LCBUcmFuc09wdHMpOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7cmVjdl90aW1lb3V0LCBUT318UmVzdF0sIEZhY3RvcnlPcHRzLCBUcmFuc09wdHMpCit3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgcGFyc2VfZmFjdG9yeV9vcHRpb25zKFJlc3QsIEZhY3RvcnlPcHRzLCBbe3JlY3ZfdGltZW91dCwgVE99XSArKyBUcmFuc09wdHMpLgogCiAKLSUlCiAlJSBHZW5lcmF0ZXMgYSAidHJhbnNwb3J0IGZhY3RvcnkiIGZ1bmN0aW9uIC0gYSBmdW4gd2hpY2ggcmV0dXJucyBhIHRocmlmdF90cmFuc3BvcnQoKQogJSUgaW5zdGFuY2UuCi0lJSBUaGlzIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKKyUlIFN0YXRlIGNhbiBiZSBwYXNzZWQgaW50byBhIHByb3RvY29sIGZhY3RvcnkgdG8gZ2VuZXJhdGUgYSBjb25uZWN0aW9uIHRvIGEKICUlIHRocmlmdCBzZXJ2ZXIgb3ZlciBhIHNvY2tldC4KLSUlCiBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkoSG9zdCwgUG9ydCwgT3B0aW9ucykgLT4KLSAgICBQYXJzZWRPcHRzID0gcGFyc2VfZmFjdG9yeV9vcHRpb25zKE9wdGlvbnMsICNmYWN0b3J5X29wdHN7fSksCi0KLSAgICBGID0gZnVuKCkgLT4KLSAgICAgICAgICAgICAgICBTb2NrT3B0cyA9IFtiaW5hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhY2tldCwgMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge2FjdGl2ZSwgZmFsc2V9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtub2RlbGF5LCB0cnVlfSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VkT3B0cyNmYWN0b3J5X29wdHMuc29ja29wdHNdLAotICAgICAgICAgICAgICAgIGNhc2UgY2F0Y2ggZ2VuX3RjcDpjb25uZWN0KEhvc3QsIFBvcnQsIFNvY2tPcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmNvbm5lY3RfdGltZW91dCkgb2YKLSAgICAgICAgICAgICAgICAgICAge29rLCBTb2NrfSAtPgotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X3NvY2tldF90cmFuc3BvcnQ6bmV3KFNvY2spLAotICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKLSAgICAgICAgICAgICAgICAgICAgRXJyb3IgIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgotICAgICAgICAgICAgICAgIGVuZAorICB7RmFjdG9yeU9wdHMsIFRyYW5zT3B0c30gPSBwYXJzZV9mYWN0b3J5X29wdGlvbnMoT3B0aW9ucywgI2ZhY3Rvcnlfb3B0c3t9LCBbXSksCisgIHtvaywgZnVuKCkgLT4gU29ja09wdHMgPSBbYmluYXJ5LAorICAgICAge3BhY2tldCwgMH0sCisgICAgICB7YWN0aXZlLCBmYWxzZX0sCisgICAgICB7bm9kZWxheSwgdHJ1ZX18RmFjdG9yeU9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzCisgICAgXSwKKyAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdCgKKyAgICAgIEhvc3QsCisgICAgICBQb3J0LAorICAgICAgU29ja09wdHMsCisgICAgICBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuY29ubmVjdF90aW1lb3V0CisgICAgKSBvZgorICAgICAge29rLCBTb2NrfSAtPgorICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfc29ja2V0X3RyYW5zcG9ydDpuZXcoU29jaywgVHJhbnNPcHRzKSwKKyAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0gY2FzZSBGYWN0b3J5T3B0cyNmYWN0b3J5X29wdHMuZnJhbWVkIG9mCisgICAgICAgICAgdHJ1ZSAgLT4gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQ6bmV3KFRyYW5zcG9ydCk7CisgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQogICAgICAgICBlbmQsCi0gICAge29rLCBGfS4KKyAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9OworICAgICAgRXJyb3IgIC0+IEVycm9yCisgICAgZW5kCisgIGVuZH0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9zc2xzb2NrZXRfdHJhbnNwb3J0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTExNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQuZXJsCkBAIC0wLDAgKzEsMTQ3IEBACislJQorJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCislJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorJSUKKyUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCislJQorJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyUlIHVuZGVyIHRoZSBMaWNlbnNlLgorJSUKKy1tb2R1bGUodGhyaWZ0X3NzbHNvY2tldF90cmFuc3BvcnQpLgorCistaW5jbHVkZSgidGhyaWZ0X3RyYW5zcG9ydF9iZWhhdmlvdXIuaHJsIikuCisKKy1iZWhhdmlvdXIodGhyaWZ0X3RyYW5zcG9ydCkuCisKKy1leHBvcnQoW25ldy8zLAorICAgICAgICAgd3JpdGUvMiwgcmVhZC8yLCBmbHVzaC8xLCBjbG9zZS8xLAorCisgICAgICAgICBuZXdfdHJhbnNwb3J0X2ZhY3RvcnkvM10pLgorCislJSBFeHBvcnQgb25seSBmb3IgdGhlIHRyYW5zcG9ydCBmYWN0b3J5CistZXhwb3J0KFtuZXcvMl0pLgorCistcmVjb3JkKGRhdGEsIHtzb2NrZXQsCisgICAgICAgICAgICAgICByZWN2X3RpbWVvdXQ9aW5maW5pdHl9KS4KKy10eXBlIHN0YXRlKCkgOjogI2RhdGF7fS4KKworJSUgVGhlIGZvbGxvd2luZyAibG9jYWwiIHJlY29yZCBpcyBmaWxsZWQgaW4gYnkgcGFyc2VfZmFjdG9yeV9vcHRpb25zLzIKKyUlIGJlbG93LiBUaGVzZSBvcHRpb25zIGNhbiBiZSBwYXNzZWQgdG8gbmV3X3Byb3RvY29sX2ZhY3RvcnkvMyBpbiBhCislJSBwcm9wbGlzdHMtc3R5bGUgb3B0aW9uIGxpc3QuIFRoZXkncmUgcGFyc2VkIGxpa2UgdGhpcyBzbyBpdCBpcyBhbiBPKG4pCislJSBvcGVyYXRpb24gaW5zdGVhZCBvZiBPKG5eMikKKy1yZWNvcmQoZmFjdG9yeV9vcHRzLCB7Y29ubmVjdF90aW1lb3V0ID0gaW5maW5pdHksCisgICAgICAgICAgICAgICAgICAgICAgIHNvY2tvcHRzID0gW10sCisgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBzc2xvcHRpb25zID0gW119KS4KKworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFtdLCBPcHRzKSAtPgorICAgIE9wdHM7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tmcmFtZWQsIEJvb2x9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfYm9vbGVhbihCb29sKSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tmcmFtZWQ9Qm9vbH0pOworcGFyc2VfZmFjdG9yeV9vcHRpb25zKFt7c29ja29wdHMsIE9wdExpc3R9IHwgUmVzdF0sIE9wdHMpIHdoZW4gaXNfbGlzdChPcHRMaXN0KSAtPgorICAgIHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhSZXN0LCBPcHRzI2ZhY3Rvcnlfb3B0c3tzb2Nrb3B0cz1PcHRMaXN0fSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tjb25uZWN0X3RpbWVvdXQsIFRPfSB8IFJlc3RdLCBPcHRzKSB3aGVuIFRPID06PSBpbmZpbml0eTsgaXNfaW50ZWdlcihUTykgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7Y29ubmVjdF90aW1lb3V0PVRPfSk7CitwYXJzZV9mYWN0b3J5X29wdGlvbnMoW3tzc2xvcHRpb25zLCBTc2xPcHRpb25zfSB8IFJlc3RdLCBPcHRzKSB3aGVuIGlzX2xpc3QoU3NsT3B0aW9ucykgLT4KKyAgICBwYXJzZV9mYWN0b3J5X29wdGlvbnMoUmVzdCwgT3B0cyNmYWN0b3J5X29wdHN7c3Nsb3B0aW9ucz1Tc2xPcHRpb25zfSkuCisKK25ldyhTb2NrZXQsIFNvY2tPcHRzLCBTc2xPcHRpb25zKSB3aGVuIGlzX2xpc3QoU29ja09wdHMpLCBpc19saXN0KFNzbE9wdGlvbnMpIC0+CisgICAgaW5ldDpzZXRvcHRzKFNvY2tldCwgW3thY3RpdmUsIGZhbHNlfV0pLCAlJSA9PiBwcmV2ZW50IHRoZSBzc2wgaGFuZHNoYWtlIG1lc3NhZ2VzIGdldCBsb3N0CisKKyAgICAlJSB1cGdyYWRlIHRvIGFuIHNzbCBzb2NrZXQKKyAgICBjYXNlIGNhdGNoIHNzbDpzc2xfYWNjZXB0KFNvY2tldCwgU3NsT3B0aW9ucykgb2YgJSBpbmZpbml0ZSB0aW1lb3V0CisgICAgICAgIHtvaywgU3NsU29ja2V0fSAtPgorICAgICAgICAgICAgbmV3KFNzbFNvY2tldCwgU29ja09wdHMpOworICAgICAgICB7ZXJyb3IsIFJlYXNvbn0gLT4KKyAgICAgICAgICAgIGV4aXQoe2Vycm9yLCBSZWFzb259KTsKKyAgICAgICAgT3RoZXIgLT4KKyAgICAgICAgICAgIGVycm9yX2xvZ2dlcjplcnJvcl9yZXBvcnQoCisgICAgICAgICAgICAgIFt7YXBwbGljYXRpb24sIHRocmlmdH0sCisgICAgICAgICAgICAgICAiU1NMIGFjY2VwdCBmYWlsZWQgZXJyb3IiLAorICAgICAgICAgICAgICAgbGlzdHM6ZmxhdHRlbihpb19saWI6Zm9ybWF0KCJ+cCIsIFtPdGhlcl0pKV0pLAorICAgICAgICAgICAgZXhpdCh7ZXJyb3IsIHNzbF9hY2NlcHRfZmFpbGVkfSkKKyAgICBlbmQuCisKK25ldyhTc2xTb2NrZXQsIFNvY2tPcHRzKSAtPgorICAgIFN0YXRlID0KKyAgICAgICAgY2FzZSBsaXN0czprZXlzZWFyY2gocmVjdl90aW1lb3V0LCAxLCBTb2NrT3B0cykgb2YKKyAgICAgICAgICAgIHt2YWx1ZSwge3JlY3ZfdGltZW91dCwgVGltZW91dH19CisgICAgICAgICAgICAgIHdoZW4gaXNfaW50ZWdlcihUaW1lb3V0KSwgVGltZW91dCA+IDAgLT4KKyAgICAgICAgICAgICAgICAjZGF0YXtzb2NrZXQ9U3NsU29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH07CisgICAgICAgICAgICBfIC0+CisgICAgICAgICAgICAgICAgI2RhdGF7c29ja2V0PVNzbFNvY2tldH0KKyAgICAgICAgZW5kLAorICAgIHRocmlmdF90cmFuc3BvcnQ6bmV3KD9NT0RVTEUsIFN0YXRlKS4KKworJSUgRGF0YSA6OiBpb2xpc3QoKQord3JpdGUoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0sIERhdGEpIC0+CisgICAge1RoaXMsIHNzbDpzZW5kKFNvY2tldCwgRGF0YSl9LgorCityZWFkKFRoaXMgPSAjZGF0YXtzb2NrZXQ9U29ja2V0LCByZWN2X3RpbWVvdXQ9VGltZW91dH0sIExlbikKKyAgd2hlbiBpc19pbnRlZ2VyKExlbiksIExlbiA+PSAwIC0+CisgICAgY2FzZSBzc2w6cmVjdihTb2NrZXQsIExlbiwgVGltZW91dCkgb2YKKyAgICAgICAgRXJyID0ge2Vycm9yLCB0aW1lb3V0fSAtPgorICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJyZWFkIHRpbWVvdXQ6IHBlZXIgY29ubiB+cCIsIFtpbmV0OnBlZXJuYW1lKFNvY2tldCldKSwKKyAgICAgICAgICAgIHNzbDpjbG9zZShTb2NrZXQpLAorICAgICAgICAgICAge1RoaXMsIEVycn07CisgICAgICAgIERhdGEgLT4KKyAgICAgICAgICAgIHtUaGlzLCBEYXRhfQorICAgIGVuZC4KKworJSUgV2UgY2FuJ3QgcmVhbGx5IGZsdXNoIC0gZXZlcnl0aGluZyBpcyBmbHVzaGVkIHdoZW4gd2Ugd3JpdGUKK2ZsdXNoKFRoaXMpIC0+CisgICAge1RoaXMsIG9rfS4KKworY2xvc2UoVGhpcyA9ICNkYXRhe3NvY2tldCA9IFNvY2tldH0pIC0+CisgICAge1RoaXMsIHNzbDpjbG9zZShTb2NrZXQpfS4KKworJSUlJSBGQUNUT1JZIEdFTkVSQVRJT04gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCislJQorJSUgR2VuZXJhdGVzIGEgInRyYW5zcG9ydCBmYWN0b3J5IiBmdW5jdGlvbiAtIGEgZnVuIHdoaWNoIHJldHVybnMgYSB0aHJpZnRfdHJhbnNwb3J0KCkKKyUlIGluc3RhbmNlLgorJSUgVGhpcyBjYW4gYmUgcGFzc2VkIGludG8gYSBwcm90b2NvbCBmYWN0b3J5IHRvIGdlbmVyYXRlIGEgY29ubmVjdGlvbiB0byBhCislJSB0aHJpZnQgc2VydmVyIG92ZXIgYSBzb2NrZXQuCislJQorbmV3X3RyYW5zcG9ydF9mYWN0b3J5KEhvc3QsIFBvcnQsIE9wdGlvbnMpIC0+CisgICAgUGFyc2VkT3B0cyA9IHBhcnNlX2ZhY3Rvcnlfb3B0aW9ucyhPcHRpb25zLCAjZmFjdG9yeV9vcHRze30pLAorCisgICAgRiA9IGZ1bigpIC0+CisgICAgICAgICAgICAgICAgU29ja09wdHMgPSBbYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYWNrZXQsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmUsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bm9kZWxheSwgdHJ1ZX0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNvY2tvcHRzXSwKKyAgICAgICAgICAgICAgICBjYXNlIGNhdGNoIGdlbl90Y3A6Y29ubmVjdChIb3N0LCBQb3J0LCBTb2NrT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCisgICAgICAgICAgICAgICAgICAgIHtvaywgU29ja30gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFNzbFNvY2sgPSBjYXNlIGNhdGNoIHNzbDpjb25uZWN0KFNvY2ssIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLnNzbG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZWRPcHRzI2ZhY3Rvcnlfb3B0cy5jb25uZWN0X3RpbWVvdXQpIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgU3NsU29ja2V0fSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsU29ja2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlciAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJlcnJvciB3aGlsZSBjb25uZWN0aW5nIG92ZXIgc3NsIC0gcmVhc29uOiB+cH5uIiwgW090aGVyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCBnZW5fdGNwOmNsb3NlKFNvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdChlcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfc3Nsc29ja2V0X3RyYW5zcG9ydDpuZXcoU3NsU29jaywgU29ja09wdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAge29rLCBCdWZUcmFuc3BvcnR9ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBhcnNlZE9wdHMjZmFjdG9yeV9vcHRzLmZyYW1lZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlICAtPiB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLT4gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydDpuZXcoVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtvaywgQnVmVHJhbnNwb3J0fTsKKyAgICAgICAgICAgICAgICAgICAgRXJyb3IgIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcgorICAgICAgICAgICAgICAgIGVuZAorICAgICAgICBlbmQsCisgICAge29rLCBGfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnRfdHJhbnNwb3J0LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCmluZGV4IDM5ZjhjMDUuLjI0MTRiZGUgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsCkBAIC0yMCw1OSArMjAsMTA3IEBACiAtbW9kdWxlKHRocmlmdF90cmFuc3BvcnQpLgogCiAtZXhwb3J0KFtiZWhhdmlvdXJfaW5mby8xXSkuCislJSBjb25zdHJ1Y3RvcnMKKy1leHBvcnQoW25ldy8xLCBuZXcvMl0pLgorJSUgdHJhbnNwb3J0IGNhbGxiYWNrcworLWV4cG9ydChbcmVhZC8yLCByZWFkX2V4YWN0LzIsIHdyaXRlLzIsIGZsdXNoLzEsIGNsb3NlLzFdKS4KIAotLWV4cG9ydChbbmV3LzIsCi0gICAgICAgICB3cml0ZS8yLAotICAgICAgICAgcmVhZC8yLAotICAgICAgICAgZmx1c2gvMSwKLSAgICAgICAgIGNsb3NlLzEKLSAgICAgICAgXSkuCistZXhwb3J0X3R5cGUoW3RfdHJhbnNwb3J0LzBdKS4KKwogCiBiZWhhdmlvdXJfaW5mbyhjYWxsYmFja3MpIC0+Ci0gICAgW3tyZWFkLCAyfSwKLSAgICAge3dyaXRlLCAyfSwKLSAgICAge2ZsdXNoLCAxfSwKLSAgICAge2Nsb3NlLCAxfQotICAgIF0uCisgIFt7cmVhZCwgMn0sIHt3cml0ZSwgMn0sIHtmbHVzaCwgMX0sIHtjbG9zZSwgMX1dLgogCi0tcmVjb3JkKHRyYW5zcG9ydCwge21vZHVsZSwgZGF0YX0pLgorCistcmVjb3JkKHRfdHJhbnNwb3J0LCB7CisgIG1vZHVsZSwKKyAgc3RhdGUKK30pLgorCistdHlwZSBzdGF0ZSgpIDo6ICN0X3RyYW5zcG9ydHt9LgorLXR5cGUgdF90cmFuc3BvcnQoKSA6OiAjdF90cmFuc3BvcnR7fS4KKwogCiAtaWZkZWYodHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlKS4KIC1kZWZpbmUoZGVidWdfd3JhcChUcmFuc3BvcnQpLAotICAgICAgICBjYXNlIFRyYW5zcG9ydCN0cmFuc3BvcnQubW9kdWxlIG9mCi0gICAgICAgICAgICA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlIC0+Ci0gICAgICAgICAgICAgICAgVHJhbnNwb3J0OwotICAgICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICAgICAgICB7b2ssIFJlc3VsdH0gPSA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlOm5ldyhUcmFuc3BvcnQpLAotICAgICAgICAgICAgICAgIFJlc3VsdAotICAgICAgICBlbmQpLgorICBjYXNlIFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5tb2R1bGUgb2YKKyAgICA/dHJhbnNwb3J0X3dyYXBwZXJfbW9kdWxlIC0+IFRyYW5zcG9ydDsKKyAgICBfRWxzZSAtPgorICAgICAge29rLCBSZXN1bHR9ID0gP3RyYW5zcG9ydF93cmFwcGVyX21vZHVsZTpuZXcoVHJhbnNwb3J0KSwKKyAgICAgIFJlc3VsdAorICBlbmQKKykuCiAtZWxzZS4KIC1kZWZpbmUoZGVidWdfd3JhcChUcmFuc3BvcnQpLCBUcmFuc3BvcnQpLgogLWVuZGlmLgogCi1uZXcoTW9kdWxlLCBEYXRhKSB3aGVuIGlzX2F0b20oTW9kdWxlKSAtPgotICAgIFRyYW5zcG9ydDAgPSAjdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZSwgZGF0YSA9IERhdGF9LAotICAgIFRyYW5zcG9ydDEgPSA/ZGVidWdfd3JhcChUcmFuc3BvcnQwKSwKLSAgICB7b2ssIFRyYW5zcG9ydDF9LgogCi0tc3BlYyB3cml0ZSgjdHJhbnNwb3J0e30sIGlvbGlzdCgpIHwgYmluYXJ5KCkpIC0+IHsjdHJhbnNwb3J0e30sIG9rIHwge2Vycm9yLCBfUmVhc29ufX0uCi13cml0ZShUcmFuc3BvcnQsIERhdGEpIC0+Ci0gICAgTW9kdWxlID0gVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUsCi0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTp3cml0ZShUcmFuc3BvcnQjdHJhbnNwb3J0LmRhdGEsIERhdGEpLAotICAgIHtUcmFuc3BvcnQjdHJhbnNwb3J0e2RhdGEgPSBOZXdUcmFuc0RhdGF9LCBSZXN1bHR9LgorLXR5cGUgd3JhcHBhYmxlKCkgOjoKKyAgYmluYXJ5KCkgfAorICBsaXN0KCkgfAorICB7bWVtYnVmZmVyLCBiaW5hcnkoKSB8IGxpc3QoKX0gfAorICB7dGNwLCBwb3J0KCl9IHwKKyAge3RjcCwgcG9ydCgpLCBsaXN0KCl9IHwKKyAge2ZpbGUsIGZpbGU6aW9fZGV2aWNlKCl9IHwKKyAge2ZpbGUsIGZpbGU6aW9fZGV2aWNlKCksIGxpc3QoKX0gfAorICB7ZmlsZSwgZmlsZTpmaWxlbmFtZSgpfSB8CisgIHtmaWxlLCBmaWxlOmZpbGVuYW1lKCksIGxpc3QoKX0uCiAKLS1zcGVjIHJlYWQoI3RyYW5zcG9ydHt9LCBub25fbmVnX2ludGVnZXIoKSkgLT4geyN0cmFuc3BvcnR7fSwge29rLCBiaW5hcnkoKX0gfCB7ZXJyb3IsIF9SZWFzb259fS4KLXJlYWQoVHJhbnNwb3J0LCBMZW4pIHdoZW4gaXNfaW50ZWdlcihMZW4pIC0+Ci0gICAgTW9kdWxlID0gVHJhbnNwb3J0I3RyYW5zcG9ydC5tb2R1bGUsCi0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkKFRyYW5zcG9ydCN0cmFuc3BvcnQuZGF0YSwgTGVuKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KKy1zcGVjIG5ldyh3cmFwcGFibGUoKSkgLT4ge29rLCAjdF90cmFuc3BvcnR7fX0uCiAKLS1zcGVjIGZsdXNoKCN0cmFuc3BvcnR7fSkgLT4geyN0cmFuc3BvcnR7fSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KLWZsdXNoKFRyYW5zcG9ydCA9ICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0pIC0+Ci0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpmbHVzaChEYXRhKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KK25ldyh7bWVtYnVmZmVyLCBNZW1idWZmZXJ9KSB3aGVuIGlzX2JpbmFyeShNZW1idWZmZXIpOyBpc19saXN0KE1lbWJ1ZmZlcikgLT4KKyAgdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KE1lbWJ1ZmZlcik7CituZXcoe21lbWJ1ZmZlciwgTWVtYnVmZmVyLCBbXX0pIHdoZW4gaXNfYmluYXJ5KE1lbWJ1ZmZlcik7IGlzX2xpc3QoTWVtYnVmZmVyKSAtPgorICB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoTWVtYnVmZmVyKTsKK25ldyh7dGNwLCBTb2NrZXR9KSB3aGVuIGlzX3BvcnQoU29ja2V0KSAtPgorICBuZXcoe3RjcCwgU29ja2V0LCBbXX0pOworbmV3KHt0Y3AsIFNvY2tldCwgT3B0c30pIHdoZW4gaXNfcG9ydChTb2NrZXQpIC0+CisgIHRocmlmdF9zb2NrZXRfdHJhbnNwb3J0Om5ldyhTb2NrZXQsIE9wdHMpOworbmV3KHtmaWxlLCBGaWxlbmFtZX0pIHdoZW4gaXNfbGlzdChGaWxlbmFtZSk7IGlzX2JpbmFyeShGaWxlbmFtZSkgLT4KKyAgbmV3KHtmaWxlLCBGaWxlbmFtZSwgW119KTsKK25ldyh7ZmlsZSwgRmlsZW5hbWUsIE9wdHN9KSB3aGVuIGlzX2xpc3QoRmlsZW5hbWUpOyBpc19iaW5hcnkoRmlsZW5hbWUpIC0+CisgIHtvaywgRmlsZX0gPSBmaWxlOm9wZW4oRmlsZW5hbWUsIFtyYXcsIGJpbmFyeV0pLAorICBuZXcoe2ZpbGUsIEZpbGUsIE9wdHN9KTsKK25ldyh7ZmlsZSwgRmlsZSwgT3B0c30pIC0+CisgIHRocmlmdF9maWxlX3RyYW5zcG9ydDpuZXcoRmlsZSwgT3B0cykuCiAKLS1zcGVjIGNsb3NlKCN0cmFuc3BvcnR7fSkgLT4geyN0cmFuc3BvcnR7fSwgb2sgfCB7ZXJyb3IsIF9SZWFzb259fS4KLWNsb3NlKFRyYW5zcG9ydCA9ICN0cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBkYXRhID0gRGF0YX0pIC0+Ci0gICAge05ld1RyYW5zRGF0YSwgUmVzdWx0fSA9IE1vZHVsZTpjbG9zZShEYXRhKSwKLSAgICB7VHJhbnNwb3J0I3RyYW5zcG9ydHtkYXRhID0gTmV3VHJhbnNEYXRhfSwgUmVzdWx0fS4KKy1zcGVjIG5ldyhNb2R1bGU6Om1vZHVsZSgpLCBTdGF0ZTo6YW55KCkpIC0+IHtvaywgI3RfdHJhbnNwb3J0e319LgorCituZXcoTW9kdWxlLCBTdGF0ZSkgd2hlbiBpc19hdG9tKE1vZHVsZSkgLT4KKyAge29rLCA/ZGVidWdfd3JhcCgjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlLCBzdGF0ZSA9IFN0YXRlfSl9LgorCisKKy1pbmNsdWRlKCJ0aHJpZnRfdHJhbnNwb3J0X2JlaGF2aW91ci5ocmwiKS4KKworCityZWFkKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9LCBMZW4pCit3aGVuIGlzX2ludGVnZXIoTGVuKSwgTGVuID49IDAgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWQoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlLCBMZW4pLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK3JlYWRfZXhhY3QoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIExlbikKK3doZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgorICBjYXNlIGxpc3RzOmtleWZpbmQocmVhZF9leGFjdCwgMSwgTW9kdWxlOm1vZHVsZV9pbmZvKGV4cG9ydHMpKSBvZgorICAgIHtyZWFkX2V4YWN0LCAyfSAtPgorICAgICAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOnJlYWRfZXhhY3QoVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlLCBMZW4pLAorICAgICAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fTsKKyAgICBfIC0+CisgICAgICByZWFkKFRyYW5zcG9ydCwgTGVuKQorICBlbmQuCisKKword3JpdGUoVHJhbnNwb3J0ID0gI3RfdHJhbnNwb3J0e21vZHVsZSA9IE1vZHVsZX0sIERhdGEpIC0+CisgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTp3cml0ZShUcmFuc3BvcnQjdF90cmFuc3BvcnQuc3RhdGUsIERhdGEpLAorICB7VHJhbnNwb3J0I3RfdHJhbnNwb3J0e3N0YXRlID0gTmV3U3RhdGV9LCBSZXN1bHR9LgorCisKK2ZsdXNoKFRyYW5zcG9ydCA9ICN0X3RyYW5zcG9ydHttb2R1bGUgPSBNb2R1bGV9KSAtPgorICB7TmV3U3RhdGUsIFJlc3VsdH0gPSBNb2R1bGU6Zmx1c2goVHJhbnNwb3J0I3RfdHJhbnNwb3J0LnN0YXRlKSwKKyAge1RyYW5zcG9ydCN0X3RyYW5zcG9ydHtzdGF0ZSA9IE5ld1N0YXRlfSwgUmVzdWx0fS4KKworCitjbG9zZShUcmFuc3BvcnQgPSAjdF90cmFuc3BvcnR7bW9kdWxlID0gTW9kdWxlfSkgLT4KKyAge05ld1N0YXRlLCBSZXN1bHR9ID0gTW9kdWxlOmNsb3NlKFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSksCisgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH0uCisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdCBiL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZmYzdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0CkBAIC0wLDAgKzEsMjIgQEAKK3N0cnVjdCB0ZXN0MSB7CisgIDE6IGkzMiBvbmUKKyAgMjogaTMyIHR3byAgICAgICAgICAgICAgICAgICAgLy8gb21pdAorICAzOiBpMzIgdGhyZWUKK30KKworc3RydWN0IHRlc3QyIHsKKyAgMTogaTMyIG9uZQorICAyOiB0ZXN0MiB0d28gICAgICAgICAgICAgICAgICAvLyBvbWl0CisgIDM6IGkzMiB0aHJlZQorfQorCitzdHJ1Y3QgdGVzdDMgeworICAxOiBpMzIgb25lCisgIDI6IGxpc3Q8dGVzdDE+IHR3byAgICAgICAgICAgIC8vIG9taXQKK30KKworc3RydWN0IHRlc3Q0IHsKKyAgMTogaTMyIG9uZQorICAyOiBtYXA8aTMyLHRlc3QxPiB0d28gICAgICAgICAvLyBvbWl0Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9mbGFncy9MZWdhY3lOYW1lcy50aHJpZnQgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjI3MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvTGVnYWN5TmFtZXMudGhyaWZ0CkBAIC0wLDAgKzEsMzMgQEAKK2VudW0gTnVtYmVyegoreworICBPTkUgPSAxLAorICBUV08sCisgIFRIUkVFLAorICBGSVZFID0gNSwKKyAgU0lYLAorICBFSUdIVCA9IDgKK30KKworY29uc3QgTnVtYmVyeiBteU51bWJlcnogPSBOdW1iZXJ6Lk9ORTsKKworc3RydWN0IENhcGl0YWxpemVkU3RydWN0Cit7CisgIDE6IGkzMiBJZCwKKyAgMjogYmluYXJ5IG1lc3NhZ2UKK30KKworc3RydWN0IExpc3RDYXBpdGFsaXplZFN0cnVjdHMKK3sKKyAgMTogbGlzdDxDYXBpdGFsaXplZFN0cnVjdD4gc3RydWN0cworfQorCitleGNlcHRpb24gWGNlcHRpb24geworICAxOiBpMzIgZXJyb3JDb2RlLAorICAyOiBiaW5hcnkgbWVzc2FnZQorfQorCitzZXJ2aWNlIExlZ2FjeU5hbWVzCit7CisgIExpc3RDYXBpdGFsaXplZFN0cnVjdHMgTmFtZXMoMTogQ2FwaXRhbGl6ZWRTdHJ1Y3QgZm9vLCAyOiBDYXBpdGFsaXplZFN0cnVjdCBiYXIpCisgICAgdGhyb3dzKDE6IFhjZXB0aW9uIGVycikKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQgYi9saWIvZXJsL3Rlc3QvZmxhZ3MvVGhyaWZ0MzIxNC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMTBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9mbGFncy9UaHJpZnQzMjE0LnRocmlmdApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3N0cnVjdCBTdHJpbmdNYXAKK3sKKyAgMTogbWFwPGkzMiwgc3RyaW5nPiBkYXRhID0gezE6ICJhIiwgMjogImIifTsKK30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC9sZWdhY3lfbmFtZXNfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvbGVnYWN5X25hbWVzX3Rlc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNmFhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbGVnYWN5X25hbWVzX3Rlc3QuZXJsCkBAIC0wLDAgKzEsNjkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKGxlZ2FjeV9uYW1lc190ZXN0KS4KKy1jb21waWxlKGV4cG9ydF9hbGwpLgorCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKKy1pbmNsdWRlKCJnZW4tZXJsL2xlZ2FjeU5hbWVzX2NvbnN0YW50cy5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJjYXBpdGFsaXplZFN0cnVjdCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge2NhcGl0YWxpemVkU3RydWN0LCBfLCBffSwKKyAgICAgICNjYXBpdGFsaXplZFN0cnVjdHtpZD1udWxsLG1lc3NhZ2U9bnVsbH0KKyAgICApfQorICBdLgorCitzdHJ1Y3RfaW5mb190ZXN0XygpIC0+CisgIFsKKyAgICB7ImNhcGl0YWxpemVkU3RydWN0IGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBpMzIsICdpZCcsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHN0cmluZywgJ21lc3NhZ2UnLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3R5cGVzOnN0cnVjdF9pbmZvX2V4dChjYXBpdGFsaXplZFN0cnVjdCkKKyAgICApfSwKKyAgICB7Imxpc3RDYXBpdGFsaXplZFN0cnVjdHMgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtsaXN0LCB7c3RydWN0LCB7J2xlZ2FjeU5hbWVzX3R5cGVzJywgJ2NhcGl0YWxpemVkU3RydWN0J319fSwgJ3N0cnVjdHMnLCBbXX0KKyAgICAgIF19LAorICAgICAgbGVnYWN5TmFtZXNfdHlwZXM6c3RydWN0X2luZm9fZXh0KGxpc3RDYXBpdGFsaXplZFN0cnVjdHMpCisgICAgKX0KKyAgXS4KKworc2VydmljZV9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsibmFtZXMgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHtzdHJ1Y3QsIHsnbGVnYWN5TmFtZXNfdHlwZXMnLCAnY2FwaXRhbGl6ZWRTdHJ1Y3QnfX19LAorICAgICAgICB7Miwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdjYXBpdGFsaXplZFN0cnVjdCd9fX0KKyAgICAgIF19LAorICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsibmFtZXMgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICdsaXN0Q2FwaXRhbGl6ZWRTdHJ1Y3RzJ319LAorICAgICAgbGVnYWN5TmFtZXNfdGhyaWZ0OmZ1bmN0aW9uX2luZm8obmFtZXMsIHJlcGx5X3R5cGUpCisgICAgKX0sCisgICAgeyJuYW1lcyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwgeydsZWdhY3lOYW1lc190eXBlcycsICd4Y2VwdGlvbid9fX1dfSwKKyAgICAgIGxlZ2FjeU5hbWVzX3RocmlmdDpmdW5jdGlvbl9pbmZvKG5hbWVzLCBleGNlcHRpb25zKQorICAgICl9CisgIF0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nLnRocmlmdCBiL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzk5NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvbXVsdGlwbGV4aW5nLnRocmlmdApAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IgeworICAgIGkzMiBhZGQoMTogaTMyIHgsIDI6IGkzMiB5KQorfQorCitzZXJ2aWNlIE11bHRpcGxleGluZ19XZWF0aGVyUmVwb3J0IHsKKyAgICBkb3VibGUgZ2V0VGVtcGVyYXR1cmUoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L211bHRpcGxleGluZ190ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmdfdGVzdC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyZDYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9lcmwvdGVzdC9tdWx0aXBsZXhpbmdfdGVzdC5lcmwKQEAgLTAsMCArMSw1NyBAQAorLW1vZHVsZShtdWx0aXBsZXhpbmdfdGVzdCkuCisKKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWV4cG9ydChbCisgICAgIGhhbmRsZV9mdW5jdGlvbi8yCisgICAgLGhhbmRsZV9lcnJvci8yCitdKS4KKworc3RhcnRfbXVsdGlwbGV4ZWRfc2VydmVyX3Rlc3QoKSAtPgorCisgICAgUG9ydCA9IDkwOTAsCisgICAgU2VydmljZXMgPSBbCisgICAgICAgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfQ2FsY3VsYXRvciIsICAgIG11bHRpcGxleGluZ19fY2FsY3VsYXRvcl90aHJpZnR9LAorICAgICAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQiLCBtdWx0aXBsZXhpbmdfX3dlYXRoZXJfcmVwb3J0X3RocmlmdH0KKyAgICAgICAgICAgICAgIF0sCisKKyAgICB7b2ssIFBpZH0gPSB0aHJpZnRfc29ja2V0X3NlcnZlcjpzdGFydChbCisgICAgICAgIHtpcCwgIjEyNy4wLjAuMSJ9LAorICAgICAgICB7cG9ydCwgUG9ydH0sCisgICAgICAgIHtuYW1lLCA/TU9EVUxFfSwKKyAgICAgICAge3NlcnZpY2UsIFNlcnZpY2VzfSwKKyAgICAgICAge2hhbmRsZXIsIFsKKyAgICAgICAgICAgIHsiZXJyb3JfaGFuZGxlciIsICAgICAgICAgICAgICA/TU9EVUxFfSwKKyAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IiLCAgICA/TU9EVUxFfSwKKyAgICAgICAgICAgIHsiTXVsdGlwbGV4aW5nX1dlYXRoZXJSZXBvcnQiLCA/TU9EVUxFfQorICAgICAgICBdfQorICAgICBdKSwKKworICAgIHtvaywgW3siTXVsdGlwbGV4aW5nX0NhbGN1bGF0b3IiLCBDYWxjdWxhdG9yQ2xpZW50MH0sCisgICAgICAgICAgeyJNdWx0aXBsZXhpbmdfV2VhdGhlclJlcG9ydCIsIFdlYXRoZXJSZXBvcnRDbGllbnQwfV19ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ld19tdWx0aXBsZXhlZCgiMTI3LjAuMC4xIiwgUG9ydCwgU2VydmljZXMsIFtdKSwKKworICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7YmFkX2FyZ3MsIF8sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChXZWF0aGVyUmVwb3J0Q2xpZW50MCwgZ2V0VGVtcGVyYXR1cmUsIFsxXSkpLAorICAgID9hc3NlcnRNYXRjaCh7Xywge2Vycm9yLCB7YmFkX2FyZ3MsIF8sIF99fX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgYWRkLCBbMV0pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge2JhZF9hcmdzLCBfLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoQ2FsY3VsYXRvckNsaWVudDAsIGFkZCwgWzEsMSwxXSkpLAorCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7ZXJyb3IsIHtub19mdW5jdGlvbiwgX319fSwgdGhyaWZ0X2NsaWVudDpjYWxsKENhbGN1bGF0b3JDbGllbnQwLCBnZXRUZW1wZXJhdHVyZSwgW10pKSwKKyAgICA/YXNzZXJ0TWF0Y2goe18sIHtlcnJvciwge25vX2Z1bmN0aW9uLCBffX19LCB0aHJpZnRfY2xpZW50OmNhbGwoV2VhdGhlclJlcG9ydENsaWVudDAsIGFkZCwgWzQxLCAxXSkpLAorCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7b2ssIDQyfX0sIHRocmlmdF9jbGllbnQ6Y2FsbChDYWxjdWxhdG9yQ2xpZW50MCwgYWRkLCBbNDEsIDFdKSksCisgICAgP2Fzc2VydE1hdGNoKHtfLCB7b2ssIDQyLjB9fSwgdGhyaWZ0X2NsaWVudDpjYWxsKFdlYXRoZXJSZXBvcnRDbGllbnQwLCBnZXRUZW1wZXJhdHVyZSwgW10pKSwKKworICAgIHRocmlmdF9zb2NrZXRfc2VydmVyOnN0b3AoUGlkKS4KKworJSUgSEFORExFIEZVTkNUSU9OUworCislJSBDYWxjdWxhdG9yIGhhbmRsZXMKK2hhbmRsZV9mdW5jdGlvbihhZGQsIHtYLCBZfSkgLT4KKyAgICB7cmVwbHksIFggKyBZfTsKKworJSUgV2VhdGhlclJlcG9ydCBoYW5kbGVzCitoYW5kbGVfZnVuY3Rpb24oZ2V0VGVtcGVyYXR1cmUsIHt9KSAtPgorICAgIHtyZXBseSwgNDIuMH0uCisKK2hhbmRsZV9lcnJvcihfRiwgX1JlYXNvbikgLT4KKyUlICAgICA/ZGVidWdIZXJlLCA/ZGVidWdWYWwoe19GLCBfUmVhc29ufSksCisgICAgb2suClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L25hbWVfY29uZmxpY3RfdGVzdC5lcmwgYi9saWIvZXJsL3Rlc3QvbmFtZV9jb25mbGljdF90ZXN0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDFkZjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L25hbWVfY29uZmxpY3RfdGVzdC5lcmwKQEAgLTAsMCArMSwyOTkgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKG5hbWVfY29uZmxpY3RfdGVzdCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9uYW1lX2NvbmZsaWN0X3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCityZWNvcmRfZ2VuZXJhdGlvbl90ZXN0XygpIC0+CisgIFsKKyAgICB7InVzaW5nIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7dXNpbmcsIF8sIF99LAorICAgICAgI3VzaW5ne3NpbmdsZT1udWxsLGludGVnZXI9bnVsbH0KKyAgICApfSwKKyAgICB7ImRlbGVnYXRlIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7ZGVsZWdhdGUsIF8sIF99LAorICAgICAgI2RlbGVnYXRle3BhcnRpYWw9bnVsbCxkZWxlZ2F0ZT1udWxsfQorICAgICl9LAorICAgIHsiZ2V0IHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7Z2V0LCBffSwKKyAgICAgICNnZXR7c2J5dGU9bnVsbH0KKyAgICApfSwKKyAgICB7InBhcnRpYWwgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHtwYXJ0aWFsLCBfLCBfLCBffSwKKyAgICAgICNwYXJ0aWFse3VzaW5nPW51bGx9CisgICAgKX0sCisgICAgeyJDbGFzc0FuZFByb3AgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnQ2xhc3NBbmRQcm9wJywgXywgXywgXywgX30sCisgICAgICAjJ0NsYXNzQW5kUHJvcCd7CisgICAgICAgICdDbGFzc0FuZFByb3AnPW51bGwsCisgICAgICAgICdDbGFzc0FuZFByb3BfJz1udWxsLAorICAgICAgICAnQ2xhc3NBbmRQcm9wX18nPW51bGwsCisgICAgICAgICdDbGFzc0FuZFByb3Blcic9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsic2Vjb25kX2NoYW5jZSByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAge3NlY29uZF9jaGFuY2UsIF8sIF8sIF8sIF99LAorICAgICAgI3NlY29uZF9jaGFuY2V7CisgICAgICAgICdTRUNPTkRfQ0hBTkNFJz1udWxsLAorICAgICAgICAnU0VDT05EX0NIQU5DRV8nPW51bGwsCisgICAgICAgICdTRUNPTkRfQ0hBTkNFX18nPW51bGwsCisgICAgICAgICdTRUNPTkRfQ0hBTkNFUyc9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiTk9XX0VBVF9USElTIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J05PV19FQVRfVEhJUycsIF8sIF8sIF8sIF99LAorICAgICAgIydOT1dfRUFUX1RISVMneworICAgICAgICBub3dfZWF0X3RoaXM9bnVsbCwKKyAgICAgICAgbm93X2VhdF90aGlzXz1udWxsLAorICAgICAgICBub3dfZWF0X3RoaXNfXz1udWxsLAorICAgICAgICBub3dfZWF0X3RoaXNfYW5kX3RoaXM9bnVsbAorICAgICAgfQorICAgICl9LAorICAgIHsiVGhlRWRnZUNhc2UgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnVGhlRWRnZUNhc2UnLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMnVGhlRWRnZUNhc2UneworICAgICAgICB0aGVFZGdlQ2FzZT1udWxsLAorICAgICAgICB0aGVFZGdlQ2FzZV89bnVsbCwKKyAgICAgICAgdGhlRWRnZUNhc2VfXz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2UnPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZV8nPW51bGwsCisgICAgICAgICdUaGVFZGdlQ2FzZV9fJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJUcmlja3lfIHJlY29yZCIsID9fYXNzZXJ0TWF0Y2goCisgICAgICB7J1RyaWNreV8nLCBfLCBffSwKKyAgICAgICMnVHJpY2t5Xyd7dHJpY2t5PW51bGwsJ1RyaWNreSc9bnVsbH0KKyAgICApfSwKKyAgICB7Ik5lc3RlZCByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydOZXN0ZWQnLCBfLCBfLCBfLCBfLCBfLCBffSwKKyAgICAgICMnTmVzdGVkJ3sKKyAgICAgICAgJ0NsYXNzQW5kUHJvcCc9bnVsbCwKKyAgICAgICAgc2Vjb25kX2NoYW5jZT1udWxsLAorICAgICAgICAnTk9XX0VBVF9USElTJz1udWxsLAorICAgICAgICAnVGhlRWRnZUNhc2UnPW51bGwsCisgICAgICAgICdUcmlja3lfJz1udWxsLAorICAgICAgICAnTmVzdGVkJz1udWxsCisgICAgICB9CisgICAgKX0sCisgICAgeyJQcm9ibGVtXyByZWNvcmQiLCA/X2Fzc2VydE1hdGNoKAorICAgICAgeydQcm9ibGVtXycsIF8sIF99LAorICAgICAgIydQcm9ibGVtXyd7cHJvYmxlbT1udWxsLCdQcm9ibGVtJz1udWxsfQorICAgICl9CisgIF0uCisKK3N0cnVjdF9pbmZvX3Rlc3RfKCkgLT4KKyAgWworICAgIHsidXNpbmcgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGRvdWJsZX0sezIsIGRvdWJsZX1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyh1c2luZykKKyAgICApfSwKKyAgICB7ImRlbGVnYXRlIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgc3RyaW5nfSwKKyAgICAgICAgezIsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsIGRlbGVnYXRlfX19CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyhkZWxlZ2F0ZSkKKyAgICApfSwKKyAgICB7ImdldCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyhnZXQpCisgICAgKX0sCisgICAgeyJwYXJ0aWFsIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgdXNpbmd9fX0sCisgICAgICAgIHsyLCBib29sfSwKKyAgICAgICAgezMsIGJvb2x9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyhwYXJ0aWFsKQorICAgICl9LAorICAgIHsiQ2xhc3NBbmRQcm9wIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdDbGFzc0FuZFByb3AnKQorICAgICl9LAorICAgIHsic2Vjb25kX2NoYW5jZSBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9LHszLCBib29sfSx7NCwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbyhzZWNvbmRfY2hhbmNlKQorICAgICl9LAorICAgIHsiTk9XX0VBVF9USElTIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCBib29sfSx7MiwgYm9vbH0sezMsIGJvb2x9LHs0LCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdOT1dfRUFUX1RISVMnKQorICAgICl9LAorICAgIHsiVGhlRWRnZUNhc2UgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfSx7MywgYm9vbH0sezQsIGJvb2x9LHs1LCBib29sfSx7NiwgYm9vbH1dfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnVGhlRWRnZUNhc2UnKQorICAgICl9LAorICAgIHsiVHJpY2t5XyBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgYm9vbH0sezIsIGJvb2x9XX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm8oJ1RyaWNreV8nKQorICAgICl9LAorICAgIHsiTmVzdGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ0NsYXNzQW5kUHJvcCd9fX0sCisgICAgICAgIHsyLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBzZWNvbmRfY2hhbmNlfX19LAorICAgICAgICB7Mywge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05PV19FQVRfVEhJUyd9fX0sCisgICAgICAgIHs0LCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCAnVGhlRWRnZUNhc2UnfX19LAorICAgICAgICB7NSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1RyaWNreV8nfX19LAorICAgICAgICB7Niwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ05lc3RlZCd9fX0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdOZXN0ZWQnKQorICAgICl9LAorICAgIHsiUHJvYmxlbV8gZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIGJvb2x9LHsyLCBib29sfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdQcm9ibGVtXycpCisgICAgKX0sCisgICAgeyJ1c2luZyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgZG91YmxlLCBzaW5nbGUsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGRvdWJsZSwgaW50ZWdlciwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHVzaW5nKQorICAgICl9LAorICAgIHsiZGVsZWdhdGUgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHN0cmluZywgcGFydGlhbCwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgZGVsZWdhdGV9fSwgZGVsZWdhdGUsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChkZWxlZ2F0ZSkKKyAgICApfSwKKyAgICB7ImdldCBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwgdW5kZWZpbmVkLCBib29sLCBzYnl0ZSwgdW5kZWZpbmVkfV19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChnZXQpCisgICAgKX0sCisgICAgeyJwYXJ0aWFsIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCB1c2luZ319LCB1c2luZywgI3VzaW5ne319LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCByZWFkLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCB3cml0ZSwgdW5kZWZpbmVkfQorICAgICAgXX0sCisgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXM6c3RydWN0X2luZm9fZXh0KHBhcnRpYWwpCisgICAgKX0sCisgICAgeyJDbGFzc0FuZFByb3AgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3AnLCB1bmRlZmluZWR9LAorICAgICAgICB7MiwgdW5kZWZpbmVkLCBib29sLCAnQ2xhc3NBbmRQcm9wXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3BfXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsICdDbGFzc0FuZFByb3BlcicsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnQ2xhc3NBbmRQcm9wJykKKyAgICApfSwKKyAgICB7InNlY29uZF9jaGFuY2UgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0VfJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezMsIHVuZGVmaW5lZCwgYm9vbCwgJ1NFQ09ORF9DSEFOQ0VfXycsIHVuZGVmaW5lZH0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIGJvb2wsICdTRUNPTkRfQ0hBTkNFUycsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dChzZWNvbmRfY2hhbmNlKQorICAgICl9LAorICAgIHsiTk9XX0VBVF9USElTIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXMsIHVuZGVmaW5lZH0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpc18sIHVuZGVmaW5lZH0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIGJvb2wsIG5vd19lYXRfdGhpc19fLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCBub3dfZWF0X3RoaXNfYW5kX3RoaXMsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnTk9XX0VBVF9USElTJykKKyAgICApfSwKKyAgICB7IlRoZUVkZ2VDYXNlIGV4dGVuZGVkIGRlZmluaXRpb24iLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgWworICAgICAgICB7MSwgdW5kZWZpbmVkLCBib29sLCB0aGVFZGdlQ2FzZSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgdGhlRWRnZUNhc2VfLCB1bmRlZmluZWR9LAorICAgICAgICB7MywgdW5kZWZpbmVkLCBib29sLCB0aGVFZGdlQ2FzZV9fLCB1bmRlZmluZWR9LAorICAgICAgICB7NCwgdW5kZWZpbmVkLCBib29sLCAnVGhlRWRnZUNhc2UnLCB1bmRlZmluZWR9LAorICAgICAgICB7NSwgdW5kZWZpbmVkLCBib29sLCAnVGhlRWRnZUNhc2VfJywgdW5kZWZpbmVkfSwKKyAgICAgICAgezYsIHVuZGVmaW5lZCwgYm9vbCwgJ1RoZUVkZ2VDYXNlX18nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1RoZUVkZ2VDYXNlJykKKyAgICApfSwKKyAgICB7IlRyaWNreV8gZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIGJvb2wsIHRyaWNreSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ1RyaWNreScsIHVuZGVmaW5lZH0KKyAgICAgIF19LAorICAgICAgbmFtZV9jb25mbGljdF90ZXN0X3R5cGVzOnN0cnVjdF9pbmZvX2V4dCgnVHJpY2t5XycpCisgICAgKX0sCisgICAgeyJOZXN0ZWQgZXh0ZW5kZWQgZGVmaW5pdGlvbiIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbCisgICAgICAgIHsxLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsKKyAgICAgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsCisgICAgICAgICAgJ0NsYXNzQW5kUHJvcCcKKyAgICAgICAgfX0sICdDbGFzc0FuZFByb3AnLCAjJ0NsYXNzQW5kUHJvcCd7fX0sCisgICAgICAgIHsyLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsKKyAgICAgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsCisgICAgICAgICAgc2Vjb25kX2NoYW5jZQorICAgICAgICB9fSwgc2Vjb25kX2NoYW5jZSwgI3NlY29uZF9jaGFuY2V7fX0sCisgICAgICAgIHszLCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsKKyAgICAgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsCisgICAgICAgICAgJ05PV19FQVRfVEhJUycKKyAgICAgICAgfX0sICdOT1dfRUFUX1RISVMnLCAjJ05PV19FQVRfVEhJUyd7fX0sCisgICAgICAgIHs0LCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsKKyAgICAgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsCisgICAgICAgICAgJ1RoZUVkZ2VDYXNlJworICAgICAgICB9fSwgJ1RoZUVkZ2VDYXNlJywgIydUaGVFZGdlQ2FzZSd7fX0sCisgICAgICAgIHs1LCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsKKyAgICAgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsCisgICAgICAgICAgJ1RyaWNreV8nCisgICAgICAgIH19LCAnVHJpY2t5XycsICMnVHJpY2t5Xyd7fX0sCisgICAgICAgIHs2LCB1bmRlZmluZWQsIHtzdHJ1Y3QsIHsKKyAgICAgICAgICBuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsCisgICAgICAgICAgJ05lc3RlZCcKKyAgICAgICAgfX0sICdOZXN0ZWQnLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ05lc3RlZCcpCisgICAgKX0sCisgICAgeyJQcm9ibGVtXyBleHRlbmRlZCBkZWZpbml0aW9uIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFsKKyAgICAgICAgezEsIHVuZGVmaW5lZCwgYm9vbCwgcHJvYmxlbSwgdW5kZWZpbmVkfSwKKyAgICAgICAgezIsIHVuZGVmaW5lZCwgYm9vbCwgJ1Byb2JsZW0nLCB1bmRlZmluZWR9CisgICAgICBdfSwKKyAgICAgIG5hbWVfY29uZmxpY3RfdGVzdF90eXBlczpzdHJ1Y3RfaW5mb19leHQoJ1Byb2JsZW1fJykKKyAgICApfQorICBdLgorCitzZXJ2aWNlX2luZm9fdGVzdF8oKSAtPgorICBbCisgICAgeyJldmVudCBwYXJhbXMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW3sxLCB7c3RydWN0LCB7bmFtZV9jb25mbGljdF90ZXN0X3R5cGVzLCBwYXJ0aWFsfX19XX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oZXZlbnQsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsiZXZlbnQgcmVwbHkiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgZGVsZWdhdGV9fSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbyhldmVudCwgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7ImV2ZW50IGV4Y2VwdGlvbnMiLCA/X2Fzc2VydEVxdWFsKAorICAgICAge3N0cnVjdCwgW119LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKGV2ZW50LCBleGNlcHRpb25zKQorICAgICl9LAorICAgIHsiRm9vIHBhcmFtcyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbezEsIHtzdHJ1Y3QsIHtuYW1lX2NvbmZsaWN0X3Rlc3RfdHlwZXMsICdOZXN0ZWQnfX19XX0sCisgICAgICBleHRlcm5fdGhyaWZ0OmZ1bmN0aW9uX2luZm8oJ0ZvbycsIHBhcmFtc190eXBlKQorICAgICl9LAorICAgIHsiRm9vIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFtdfSwKKyAgICAgIGV4dGVybl90aHJpZnQ6ZnVuY3Rpb25faW5mbygnRm9vJywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7IkZvbyBleGNlcHRpb25zIiwgP19hc3NlcnRFcXVhbCgKKyAgICAgIHtzdHJ1Y3QsIFt7MSwge3N0cnVjdCwge25hbWVfY29uZmxpY3RfdGVzdF90eXBlcywgJ1Byb2JsZW1fJ319fV19LAorICAgICAgZXh0ZXJuX3RocmlmdDpmdW5jdGlvbl9pbmZvKCdGb28nLCBleGNlcHRpb25zKQorICAgICl9CisgIF0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3Rlc3QvdGVzdF9jbGllbnQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY2xpZW50LmVybApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmNTk2ZC4uMDAwMDAwMAotLS0gYS9saWIvZXJsL3Rlc3QvdGVzdF9jbGllbnQuZXJsCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSUlCi0lJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0lJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0lJQotJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSUlCi0lJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0lJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0lJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotJSUgdW5kZXIgdGhlIExpY2Vuc2UuCi0lJQotCi0tbW9kdWxlKHRlc3RfY2xpZW50KS4KLQotLWV4cG9ydChbc3RhcnQvMCwgc3RhcnQvMV0pLgotCi0taW5jbHVkZSgidGhyaWZ0VGVzdF90eXBlcy5ocmwiKS4KLQotLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCi0gICAgICAgICAgICAgICAgICBjbGllbnRfb3B0cyA9IFtdfSkuCi0KLXBhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KLXBhcnNlX2FyZ3MoW10sIE9wdHMpIC0+IE9wdHM7Ci1wYXJzZV9hcmdzKFtIZWFkIHwgUmVzdF0sIE9wdHMpIC0+Ci0gICAgTmV3T3B0cyA9Ci0gICAgICAgIGNhc2UgY2F0Y2ggbGlzdF90b19pbnRlZ2VyKEhlYWQpIG9mCi0gICAgICAgICAgICBQb3J0IHdoZW4gaXNfaW50ZWdlcihQb3J0KSAtPgotICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3twb3J0ID0gUG9ydH07Ci0gICAgICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAgICAgIGNhc2UgSGVhZCBvZgotICAgICAgICAgICAgICAgICAgICAiZnJhbWVkIiAtPgotICAgICAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3tmcmFtZWQsIHRydWV9IHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXX07Ci0gICAgICAgICAgICAgICAgICAgICIiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzOwotICAgICAgICAgICAgICAgICAgICBfRWxzZSAtPgotICAgICAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKLSAgICAgICAgICAgICAgICBlbmQKLSAgICAgICAgZW5kLAotICAgIHBhcnNlX2FyZ3MoUmVzdCwgTmV3T3B0cykuCi0KLQotc3RhcnQoKSAtPiBzdGFydChbXSkuCi1zdGFydChBcmdzKSAtPgotICAjb3B0aW9uc3twb3J0ID0gUG9ydCwgY2xpZW50X29wdHMgPSBDbGllbnRPcHRzfSA9IHBhcnNlX2FyZ3MoQXJncyksCi0gIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50X3V0aWw6bmV3KAotICAgICIxMjcuMC4wLjEiLCBQb3J0LCB0aHJpZnRUZXN0X3RocmlmdCwgQ2xpZW50T3B0cyksCi0KLSAgRGVtb1h0cnVjdCA9ICN4dHJ1Y3R7Ci0gICAgc3RyaW5nX3RoaW5nID0gPDwiWmVybyI+PiwKLSAgICBieXRlX3RoaW5nID0gMSwKLSAgICBpMzJfdGhpbmcgPSA5MTI4MzYxLAotICAgIGk2NF90aGluZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDd9LAotCi0gIERlbW9OZXN0ID0gI3h0cnVjdDJ7Ci0gICAgYnl0ZV90aGluZyA9IDcsCi0gICAgc3RydWN0X3RoaW5nID0gRGVtb1h0cnVjdCwKLSAgICAlIE5vdGUgdGhhdCB3ZSBkb24ndCBzZXQgaTMyX3RoaW5nLCBpdCB3aWxsIGNvbWUgYmFjayBhcyB1bmRlZmluZWQKLSAgICAlIGZyb20gdGhlIFB5dGhvbiBzZXJ2ZXIsIGJ1dCAwIGZyb20gdGhlIEMrKyBzZXJ2ZXIsIHNpbmNlIGl0IGlzIG5vdAotICAgICUgb3B0aW9uYWwKLSAgICBpMzJfdGhpbmcgPSAyfSwKLQotICAlIElzIGl0IHNhZmUgdG8gbWF0Y2ggdGhlc2UgdGhpbmdzPwotICBEZW1vRGljdCA9IGRpY3Q6ZnJvbV9saXN0KFsge0tleSwgS2V5LTEwfSB8fCBLZXkgPC0gbGlzdHM6c2VxKDAsMTApIF0pLAotICBEZW1vU2V0ID0gc2V0czpmcm9tX2xpc3QoWyBLZXkgfHwgS2V5IDwtIGxpc3RzOnNlcSgtMywzKSBdKSwKLQotICAlRGVtb0luc2FuZSA9ICNpbnNhbml0eXsKLSAgJSAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfRklWRSwgNTAwMH1dKSwKLSAgJSAgeHRydWN0cyA9IFsjeHRydWN0eyBzdHJpbmdfdGhpbmcgPSA8PCJUcnVjayI+PiwgYnl0ZV90aGluZyA9IDgsIGkzMl90aGluZyA9IDgsIGk2NF90aGluZyA9IDh9XX0sCi0KLSAge0NsaWVudDAxLCB7b2ssIG9rfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MCwgdGVzdFZvaWQsIFtdKSwKLQotICB7Q2xpZW50MDIsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDEsIHRlc3RTdHJpbmcsIFsiVGVzdCJdKSwKLSAge0NsaWVudDAzLCB7b2ssIDw8IlRlc3QiPj59fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDAyLCB0ZXN0U3RyaW5nLCBbPDwiVGVzdCI+Pl0pLAotICB7Q2xpZW50MDQsIHtvaywgNjN9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDMsIHRlc3RCeXRlLCBbNjNdKSwKLSAge0NsaWVudDA1LCB7b2ssIC0xfX0gICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA0LCB0ZXN0STMyLCBbLTFdKSwKLSAge0NsaWVudDA2LCB7b2ssIDB9fSAgICAgICAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA1LCB0ZXN0STMyLCBbMF0pLAotICB7Q2xpZW50MDcsIHtvaywgLTM0MzU5NzM4MzY4fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDYsIHRlc3RJNjQsIFstMzQzNTk3MzgzNjhdKSwKLSAge0NsaWVudDA4LCB7b2ssIC01LjIwOTg1MjN9fSAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA3LCB0ZXN0RG91YmxlLCBbLTUuMjA5ODUyM10pLAotICB7Q2xpZW50MDksIHtvaywgRGVtb1h0cnVjdH19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDgsIHRlc3RTdHJ1Y3QsIFtEZW1vWHRydWN0XSksCi0gIHtDbGllbnQxMCwge29rLCBEZW1vTmVzdH19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwOSwgdGVzdE5lc3QsIFtEZW1vTmVzdF0pLAotICB7Q2xpZW50MTEsIHtvaywgRGVtb0RpY3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTAsIHRlc3RNYXAsIFtEZW1vRGljdF0pLAotICB7Q2xpZW50MTIsIHtvaywgRGVtb1NldH19ICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTEsIHRlc3RTZXQsIFtEZW1vU2V0XSksCi0gIHtDbGllbnQxMywge29rLCBbLTEsMiwzXX19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMiwgdGVzdExpc3QsIFtbLTEsMiwzXV0pLAotICB7Q2xpZW50MTQsIHtvaywgMX19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTMsIHRlc3RFbnVtLCBbP3RocmlmdFRlc3RfTnVtYmVyel9PTkVdKSwKLSAge0NsaWVudDE1LCB7b2ssIDMwOTg1ODIzNTA4MjUyM319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE0LCB0ZXN0VHlwZWRlZiwgWzMwOTg1ODIzNTA4MjUyM10pLAotCi0gICUgTm8gcHl0aG9uIGltcGxlbWVudGF0aW9uLCBidXQgd29ya3Mgd2l0aCBDKysgYW5kIEVybGFuZy4KLSAgJXtDbGllbnQxNiwge29rLCBJbnNhbmVSZXN1bHR9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNSwgdGVzdEluc2FuaXR5LCBbRGVtb0luc2FuZV0pLAotICAlaW86Zm9ybWF0KCJ+cH5uIiwgW0luc2FuZVJlc3VsdF0pLAotICBDbGllbnQxNiA9IENsaWVudDE1LAotCi0gIHtDbGllbnQxNywge29rLCAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8Ik1lc3NhZ2UiPj59fX0gPQotICAgIHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNiwgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlNhZmUiLCAiTWVzc2FnZSJdKSwKLQotICBDbGllbnQxOCA9Ci0gICAgdHJ5Ci0gICAgICB7Q2xpZW50UzEsIFJlc3VsdDF9ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE3LCB0ZXN0TXVsdGlFeGNlcHRpb24sIFsiWGNlcHRpb24iLCAiTWVzc2FnZSJdKSwKLSAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0MV0pLAotICAgICAgQ2xpZW50UzEKLSAgICBjYXRjaAotICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBFeG5TMSA9ICN4Y2VwdGlvbnt9fX0gLT4KLSAgICAgICAgI3hjZXB0aW9ue2Vycm9yQ29kZSA9IDEwMDEsIG1lc3NhZ2UgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uIj4+fSA9IEV4blMxLAotICAgICAgICBDbGllbnRTMjsKLSAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgX0V4blMxID0gI3hjZXB0aW9uMnt9fX0gLT4KLSAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKLSAgICAgICAgQ2xpZW50UzIKLSAgICBlbmQsCi0KLSAgQ2xpZW50MTkgPQotICAgIHRyeQotICAgICAge0NsaWVudFMzLCBSZXN1bHQyfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOCwgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uMiIsICJNZXNzYWdlIl0pLAotICAgICAgaW86Zm9ybWF0KCJVbmV4cGVjdGVkIHJldHVybiEgfnB+biIsIFtSZXN1bHQyXSksCi0gICAgICBDbGllbnRTMwotICAgIGNhdGNoCi0gICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIF9FeG5TMiA9ICN4Y2VwdGlvbnt9fX0gLT4KLSAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKLSAgICAgICAgQ2xpZW50UzQ7Ci0gICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gI3hjZXB0aW9uMnt9fX0gLT4KLSAgICAgICAgI3hjZXB0aW9uMntlcnJvckNvZGUgPSAyMDAyLAotICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9ICN4dHJ1Y3R7Ci0gICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCi0gICAgICAgIENsaWVudFM0Ci0gICAgZW5kLAotCi0gIHRocmlmdF9jbGllbnQ6Y2xvc2UoQ2xpZW50MTkpLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfZGlza2xvZy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9kaXNrbG9nLmVybAppbmRleCAxN2EyN2IwLi5kY2I2ZmMxIDEwMDY0NAotLS0gYS9saWIvZXJsL3Rlc3QvdGVzdF9kaXNrbG9nLmVybAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9kaXNrbG9nLmVybApAQCAtMjYsMTIgKzI2LDEyIEBACiAgIHtvaywgVHJhbnNwb3J0RmFjdG9yeX0gPQogICAgIHRocmlmdF9kaXNrX2xvZ190cmFuc3BvcnQ6bmV3X3RyYW5zcG9ydF9mYWN0b3J5KAogICAgICAgdGVzdF9kaXNrbG9nLAotICAgICAgW3tmaWxlLCAiL3RtcC90ZXN0X2xvZyJ9LAorICAgICAgW3tmaWxlLCAiLi90ZXN0X2xvZyJ9LAogICAgICAgIHtzaXplLCB7MTAyNCoxMDI0LCAxMH19XSksCiAgIHtvaywgUHJvdG9jb2xGYWN0b3J5fSA9CiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXdfcHJvdG9jb2xfZmFjdG9yeSggVHJhbnNwb3J0RmFjdG9yeSwgW10pLAogICB7b2ssIFByb3RvfSA9IFByb3RvY29sRmFjdG9yeSgpLAotICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudDpuZXcoUHJvdG8sIHRocmlmdFRlc3RfdGhyaWZ0KSwKKyAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRfdGVzdF90aHJpZnQpLAogCiAgIGlvOmZvcm1hdCgiQ2xpZW50IHN0YXJ0ZWR+biIpLAogCkBAIC00Nyw2ICs0NywxMyBAQAogCiAgIHtfQ2xpZW50Mywgb2t9ID0gdGhyaWZ0X2NsaWVudDpjbG9zZShDbGllbnQyKSwKICAgaW86Zm9ybWF0KCJDbGllbnQgY2xvc2Vkfm4iKSwKKyAgCisgIGxpc3RzOmZvcmVhY2goZnVuKEZpbGUpIC0+IGZpbGU6ZGVsZXRlKEZpbGUpIGVuZCwgWworICAgICIuL3Rlc3RfbG9nLjEiLAorICAgICIuL3Rlc3RfbG9nLmlkeCIsCisgICAgIi4vdGVzdF9sb2cuc2l6IgorICBdKSwKKyAgaW86Zm9ybWF0KCJDbGVhbmluZyB1cCB0ZXN0IGZpbGVzfm4iKSwKIAogICBvay4KIApAQCAtNTQsNyArNjEsNyBAQAogICB7b2ssIFRyYW5zcG9ydEZhY3Rvcnl9ID0KICAgICB0aHJpZnRfZGlza19sb2dfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeSgKICAgICAgIHRlc3RfZGlza2xvZywKLSAgICAgIFt7ZmlsZSwgIi90bXAvdGVzdF9iNjRfbG9nIn0sCisgICAgICBbe2ZpbGUsICIuL3Rlc3RfYjY0X2xvZyJ9LAogICAgICAgIHtzaXplLCB7MTAyNCoxMDI0LCAxMH19XSksCiAgIHtvaywgQjY0RmFjdG9yeX0gPQogICAgIHRocmlmdF9iYXNlNjRfdHJhbnNwb3J0Om5ld190cmFuc3BvcnRfZmFjdG9yeShUcmFuc3BvcnRGYWN0b3J5KSwKQEAgLTYzLDcgKzcwLDcgQEAKICAge29rLCBQcm90b2NvbEZhY3Rvcnl9ID0KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ld19wcm90b2NvbF9mYWN0b3J5KEJ1ZkZhY3RvcnksIFtdKSwKICAge29rLCBQcm90b30gPSBQcm90b2NvbEZhY3RvcnkoKSwKLSAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnQ6bmV3KFByb3RvLCB0aHJpZnRUZXN0X3RocmlmdCksCisgIHtvaywgQ2xpZW50MH0gPSB0aHJpZnRfY2xpZW50Om5ldyhQcm90bywgdGhyaWZ0X3Rlc3RfdGhyaWZ0KSwKIAogICBpbzpmb3JtYXQoIkNsaWVudCBzdGFydGVkfm4iKSwKIApAQCAtODAsNiArODcsMTMgQEAKICAge19DbGllbnQzLCBva30gPSB0aHJpZnRfY2xpZW50OmNsb3NlKENsaWVudDIpLAogICBpbzpmb3JtYXQoIkNsaWVudCBjbG9zZWR+biIpLAogCisgIGxpc3RzOmZvcmVhY2goZnVuKEZpbGUpIC0+IGZpbGU6ZGVsZXRlKEZpbGUpIGVuZCwgWworICAgICIuL3Rlc3RfYjY0X2xvZy4xIiwKKyAgICAiLi90ZXN0X2I2NF9sb2cuaWR4IiwKKyAgICAiLi90ZXN0X2I2NF9sb2cuc2l6IgorICBdKSwKKyAgaW86Zm9ybWF0KCJDbGVhbmluZyB1cCB0ZXN0IGZpbGVzfm4iKSwKKwogICBvay4KIAogLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X21lbWJ1ZmZlci5lcmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDExNDMuLjAwMDAwMDAKLS0tIGEvbGliL2VybC90ZXN0L3Rlc3RfbWVtYnVmZmVyLmVybAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0lJQotJSUgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotJSUgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSUlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0lJSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSUlIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSUlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSUlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotJSUKLSUlICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0lJQotJSUgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotJSUgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSUlICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotJSUgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSUlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSUlIHVuZGVyIHRoZSBMaWNlbnNlLgotJSUKLQotLW1vZHVsZSh0ZXN0X21lbWJ1ZmZlcikuCi0KLS1pZmRlZihURVNUKS4KLS1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KLQotLWluY2x1ZGUoInRocmlmdFRlc3RfdHlwZXMuaHJsIikuCi0KLXRlc3RfZGF0YSgpIC0+Ci0gICN4dHJ1Y3QgewotICAgIHN0cmluZ190aGluZyA9IDw8ImZvb2JhciI+PiwKLSAgICBieXRlX3RoaW5nID0gMTIzLAotICAgIGkzMl90aGluZyA9IDEyMzQ1NjcsCi0gICAgaTY0X3RoaW5nID0gMTIzNDU2Nzg5MDAKLSAgfS4KLQotZW5jb2RlX2RlY29kZV8xX3Rlc3QoKSAtPgotICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgVGVzdERhdGEgPSB0ZXN0X2RhdGEoKSwKLSAge1Byb3RvY29sMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFByb3RvY29sMCwKLSAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotICAgICAgVGVzdERhdGF9KSwKLSAge19Qcm90b2NvbDIsIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbDEsCi0gICAge3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotICAgICd4dHJ1Y3QnKSwKLSAgUmVzdWx0ID0gVGVzdERhdGEuCi0KLWVuY29kZV9kZWNvZGVfMl90ZXN0KCkgLT4KLSAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCi0gIHtvaywgUHJvdG9jb2wwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gIHtfUHJvdG9jb2wyLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUHJvdG9jb2wxLAotICAgIHtzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0MycpKX0sCi0gICAgJ3h0cnVjdDMnKSwKLQotICBSZXN1bHQgPSAjeHRydWN0M3tzdHJpbmdfdGhpbmcgPSBUZXN0RGF0YSN4dHJ1Y3Quc3RyaW5nX3RoaW5nLAotICAgIGNoYW5nZWQgPSB1bmRlZmluZWQsCi0gICAgaTMyX3RoaW5nID0gVGVzdERhdGEjeHRydWN0LmkzMl90aGluZywKLSAgICBpNjRfdGhpbmcgPSBUZXN0RGF0YSN4dHJ1Y3QuaTY0X3RoaW5nfS4KLQotCi1lbmNvZGVfZGVjb2RlXzNfdGVzdCgpIC0+Ci0gIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldygpLAotICB7b2ssIFByb3RvY29sMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICBUZXN0RGF0YSA9ICNib29sc3tpbV90cnVlID0gdHJ1ZSwgaW1fZmFsc2UgPSBmYWxzZX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnYm9vbHMnKSl9LAotICAgICAgVGVzdERhdGF9KSwKLSAge19Qcm90b2NvbDIsIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbDEsCi0gICAge3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdib29scycpKX0sCi0gICAgJ2Jvb2xzJyksCi0KLSAgdHJ1ZSA9IFRlc3REYXRhI2Jvb2xzLmltX3RydWUgID06PSBSZXN1bHQjYm9vbHMuaW1fdHJ1ZSwKLSAgdHJ1ZSA9IFRlc3REYXRhI2Jvb2xzLmltX2ZhbHNlID06PSBSZXN1bHQjYm9vbHMuaW1fZmFsc2UuCi0KLQotZW5jb2RlX2RlY29kZV80X3Rlc3QoKSAtPgotICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgVGVzdERhdGEgPSAjaW5zYW5pdHl7eHRydWN0cz1bXX0sCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygnaW5zYW5pdHknKSl9LAotICAgICAgVGVzdERhdGF9KSwKLSAge19Qcm90b2NvbDIsIHtvaywgUmVzdWx0fX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQcm90b2NvbDEsCi0gICAge3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCdpbnNhbml0eScpKX0sCi0gICAgJ2luc2FuaXR5JyksCi0KLSAgVGVzdERhdGEgPSBSZXN1bHQuCi0KLWVuY29kZV9kZWNvZGVfNV90ZXN0KCkgLT4KLSAgJSB0ZXN0IHdyaXRpbmcgdG8gYSBidWZmZXIsIGdldHRpbmcgdGhlIGJ5dGVzIG91dCwgcHV0dGluZyB0aGVtCi0gICUgaW4gYSBuZXcgYnVmZmVyIGFuZCByZWFkaW5nIHRoZW0KLQotICAlIGhlcmUncyB0aGUgd3JpdGluZyBwYXJ0Ci0gIHtvaywgVHJhbnNwb3J0MH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKLSAge29rLCBQcm90b2NvbDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0MCksCi0gIFRlc3REYXRhID0gdGVzdF9kYXRhKCksCi0gIHtQcm90b2NvbDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQcm90b2NvbDAsCi0gICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0VGVzdF90eXBlczpzdHJ1Y3RfaW5mbygneHRydWN0JykpfSwKLSAgICAgIFRlc3REYXRhfSksCi0gICUgZmx1c2ggbm93IHJldHVybnMgdGhlIGJ1ZmZlcgotICB7X1Byb3RvY29sMiwgQnVmfSA9IHRocmlmdF9wcm90b2NvbDpmbHVzaF90cmFuc3BvcnQgKFByb3RvY29sMSksCi0KLSAgJSBub3cgdGhlIHJlYWRpbmcgcGFydAotICB7b2ssIFQyfSA9IHRocmlmdF9tZW1vcnlfYnVmZmVyOm5ldyAoQnVmKSwKLSAge29rLCBQMn0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUMiksCi0gIHtfLCB7b2ssIFJlc3VsdH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDIsCi0gICAge3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnRUZXN0X3R5cGVzOnN0cnVjdF9pbmZvKCd4dHJ1Y3QnKSl9LAotICAgICd4dHJ1Y3QnKSwKLQotICBSZXN1bHQgPSBUZXN0RGF0YS4KLQotLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwKQEAgLTAsMCArMSw3OSBAQAorLW1vZHVsZSh0ZXN0X29taXQpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfb21pdF93aXRoX3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKK29taXRfc3RydWN0MV90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgYmFzaWMgdHlwZSAoYW4gaTMyKS4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBBKX19LCBBfSksCisgIHtQMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/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/RVBTSUxPTikuCisKKy1lbmRpZi4gJSUgVEVTVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3NlcnZlci5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9zZXJ2ZXIuZXJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y3YjA4Li4wMDAwMDAwCi0tLSBhL2xpYi9lcmwvdGVzdC90ZXN0X3NlcnZlci5lcmwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotJSUKLSUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0lJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0lJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0lJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0lJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSUlCi0lJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotJSUKLSUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0lJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0lJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0lJSB1bmRlciB0aGUgTGljZW5zZS4KLSUlCi0KLS1tb2R1bGUodGVzdF9zZXJ2ZXIpLgotCi0tZXhwb3J0KFtnby8wLCBnby8xLCBzdGFydF9saW5rLzIsIGhhbmRsZV9mdW5jdGlvbi8yXSkuCi0KLS1pbmNsdWRlKCJ0aHJpZnRUZXN0X3R5cGVzLmhybCIpLgotCi0tcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKLSAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KLQotcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgotcGFyc2VfYXJncyhbXSwgT3B0cykgLT4gT3B0czsKLXBhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KLSAgICBOZXdPcHRzID0KLSAgICAgICAgY2FzZSBjYXRjaCBsaXN0X3RvX2ludGVnZXIoSGVhZCkgb2YKLSAgICAgICAgICAgIFBvcnQgd2hlbiBpc19pbnRlZ2VyKFBvcnQpIC0+Ci0gICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBQb3J0fTsKLSAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgY2FzZSBIZWFkIG9mCi0gICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7c2VydmVyX29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuc2VydmVyX29wdHNdfTsKLSAgICAgICAgICAgICAgICAgICAgIiIgLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIE9wdHM7Ci0gICAgICAgICAgICAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcmxhbmc6ZXJyb3Ioe2JhZF9hcmcsIEhlYWR9KQotICAgICAgICAgICAgICAgIGVuZAotICAgICAgICBlbmQsCi0gICAgcGFyc2VfYXJncyhSZXN0LCBOZXdPcHRzKS4KLQotZ28oKSAtPiBnbyhbXSkuCi1nbyhBcmdzKSAtPgotICAgICNvcHRpb25ze3BvcnQgPSBQb3J0LCBzZXJ2ZXJfb3B0cyA9IFNlcnZlck9wdHN9ID0gcGFyc2VfYXJncyhBcmdzKSwKLSAgICBzcGF3bihmdW4oKSAtPiBzdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpLCByZWNlaXZlIGFmdGVyIGluZmluaXR5IC0+IG9rIGVuZCBlbmQpLgotCi1zdGFydF9saW5rKFBvcnQsIFNlcnZlck9wdHMpIC0+Ci0gICAgdGhyaWZ0X3NvY2tldF9zZXJ2ZXI6c3RhcnQoW3toYW5kbGVyLCA/TU9EVUxFfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3NlcnZpY2UsIHRocmlmdFRlc3RfdGhyaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BvcnQsIFBvcnR9XSArKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlck9wdHMpLgotCi0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0Vm9pZCwge30pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0Vm9pZH5uIiksCi0gICAgb2s7Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0U3RyaW5nLCB7U30pIHdoZW4gaXNfYmluYXJ5KFMpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0U3RyaW5nOiB+cH5uIiwgW1NdKSwKLSAgICB7cmVwbHksIFN9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEJ5dGUsIHtJOH0pIHdoZW4gaXNfaW50ZWdlcihJOCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RCeXRlOiB+cH5uIiwgW0k4XSksCi0gICAge3JlcGx5LCBJOH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0STMyLCB7STMyfSkgd2hlbiBpc19pbnRlZ2VyKEkzMikgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RJMzI6IH5wfm4iLCBbSTMyXSksCi0gICAge3JlcGx5LCBJMzJ9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEk2NCwge0k2NH0pIHdoZW4gaXNfaW50ZWdlcihJNjQpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0STY0OiB+cH5uIiwgW0k2NF0pLAotICAgIHtyZXBseSwgSTY0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3REb3VibGUsIHtEb3VibGV9KSB3aGVuIGlzX2Zsb2F0KERvdWJsZSkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3REb3VibGU6IH5wfm4iLCBbRG91YmxlXSksCi0gICAge3JlcGx5LCBEb3VibGV9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFN0cnVjdCwKLSAgICAgICAgICAgICAgICB7U3RydWN0ID0gI3h0cnVjdHtzdHJpbmdfdGhpbmcgPSBTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nID0gQnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEkzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEk2NH19KQotd2hlbiBpc19iaW5hcnkoU3RyaW5nKSwKLSAgICAgaXNfaW50ZWdlcihCeXRlKSwKLSAgICAgaXNfaW50ZWdlcihJMzIpLAotICAgICBpc19pbnRlZ2VyKEk2NCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3RTdHJ1Y3Q6IH5wfm4iLCBbU3RydWN0XSksCi0gICAge3JlcGx5LCBTdHJ1Y3R9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE5lc3QsCi0gICAgICAgICAgICAgICAge05lc3R9KSB3aGVuIGlzX3JlY29yZChOZXN0LCB4dHJ1Y3QyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVjb3JkKE5lc3QjeHRydWN0Mi5zdHJ1Y3RfdGhpbmcsIHh0cnVjdCkgLT4KLSAgICBpbzpmb3JtYXQoInRlc3ROZXN0OiB+cH5uIiwgW05lc3RdKSwKLSAgICB7cmVwbHksIE5lc3R9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE1hcCwge01hcH0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TWFwOiB+cH5uIiwgW2RpY3Q6dG9fbGlzdChNYXApXSksCi0gICAge3JlcGx5LCBNYXB9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdFNldCwge1NldH0pIC0+Ci0gICAgdHJ1ZSA9IHNldHM6aXNfc2V0KFNldCksCi0gICAgaW86Zm9ybWF0KCJ0ZXN0U2V0OiB+cH5uIiwgW3NldHM6dG9fbGlzdChTZXQpXSksCi0gICAge3JlcGx5LCBTZXR9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdExpc3QsIHtMaXN0fSkgd2hlbiBpc19saXN0KExpc3QpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TGlzdDogfnB+biIsIFtMaXN0XSksCi0gICAge3JlcGx5LCBMaXN0fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RFbnVtLCB7RW51bX0pIHdoZW4gaXNfaW50ZWdlcihFbnVtKSAtPgotICAgIGlvOmZvcm1hdCgidGVzdEVudW06IH5wfm4iLCBbRW51bV0pLAotICAgIHtyZXBseSwgRW51bX07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0VHlwZWRlZiwge1VzZXJJRH0pIHdoZW4gaXNfaW50ZWdlcihVc2VySUQpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0VHlwZWRlZjogfnB+biIsIFtVc2VySURdKSwKLSAgICB7cmVwbHksIFVzZXJJRH07Ci0KLWhhbmRsZV9mdW5jdGlvbih0ZXN0TWFwTWFwLCB7SGVsbG99KSAtPgotICAgIGlvOmZvcm1hdCgidGVzdE1hcE1hcDogfnB+biIsIFtIZWxsb10pLAotCi0gICAgUG9zTGlzdCA9IFt7SSwgSX0gICB8fCBJIDwtIGxpc3RzOnNlcSgxLCA1KV0sCi0gICAgTmVnTGlzdCA9IFt7LUksIC1JfSB8fCBJIDwtIGxpc3RzOnNlcSgxLCA1KV0sCi0KLSAgICBNYXBNYXAgPSBkaWN0OmZyb21fbGlzdChbezQsICBkaWN0OmZyb21fbGlzdChQb3NMaXN0KX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstNCwgZGljdDpmcm9tX2xpc3QoTmVnTGlzdCl9XSksCi0gICAge3JlcGx5LCBNYXBNYXB9OwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdEluc2FuaXR5LCB7SW5zYW5pdHl9KSB3aGVuIGlzX3JlY29yZChJbnNhbml0eSwgaW5zYW5pdHkpIC0+Ci0gICAgSGVsbG8gPSAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDIsCi0gICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IDIsCi0gICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDJ9LAotCi0gICAgR29vZGJ5ZSA9ICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gPDwiR29vZGJ5ZTQiPj4sCi0gICAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IDQsCi0gICAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gNCwKLSAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmcgPSA0fSwKLSAgICBDcmF6eSA9ICNpbnNhbml0eXsKLSAgICAgIHVzZXJNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X051bWJlcnpfRUlHSFQsIDh9XSksCi0gICAgICB4dHJ1Y3RzID0gW0dvb2RieWVdCi0gICAgICB9LAotCi0gICAgTG9vbmV5ID0gI2luc2FuaXR5ewotICAgICAgdXNlck1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfTnVtYmVyel9GSVZFLCA1fV0pLAotICAgICAgeHRydWN0cyA9IFtIZWxsb10KLSAgICAgIH0sCi0KLSAgICBGaXJzdE1hcCA9IGRpY3Q6ZnJvbV9saXN0KFt7P3RocmlmdFRlc3RfTnVtYmVyel9UV08sIENyYXp5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7P3RocmlmdFRlc3RfTnVtYmVyel9USFJFRSwgQ3Jhenl9XSksCi0KLSAgICBTZWNvbmRNYXAgPSBkaWN0OmZyb21fbGlzdChbez90aHJpZnRUZXN0X051bWJlcnpfU0lYLCBMb29uZXl9XSksCi0KLSAgICBJbnNhbmUgPSBkaWN0OmZyb21fbGlzdChbezEsIEZpcnN0TWFwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsIFNlY29uZE1hcH1dKSwKLQotICAgIGlvOmZvcm1hdCgiUmV0dXJuID0gfnB+biIsIFtJbnNhbmVdKSwKLQotICAgIHtyZXBseSwgSW5zYW5lfTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RNdWx0aSwgQXJncyA9IHtBcmcwLCBBcmcxLCBBcmcyLCBfQXJnMywgQXJnNCwgQXJnNX0pCi0gIHdoZW4gaXNfaW50ZWdlcihBcmcwKSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzEpLAotICAgICAgIGlzX2ludGVnZXIoQXJnMiksCi0gICAgICAgaXNfaW50ZWdlcihBcmc0KSwKLSAgICAgICBpc19pbnRlZ2VyKEFyZzUpIC0+Ci0KLSAgICBpbzpmb3JtYXQoInRlc3RNdWx0aSh+cCl+biIsIFtBcmdzXSksCi0gICAge3JlcGx5LCAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8IkhlbGxvMiI+PiwKLSAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZyA9IEFyZzAsCi0gICAgICAgICAgICAgICAgICAgIGkzMl90aGluZyA9IEFyZzEsCi0gICAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IEFyZzJ9fTsKLQotaGFuZGxlX2Z1bmN0aW9uKHRlc3RFeGNlcHRpb24sIHtTdHJpbmd9KSB3aGVuIGlzX2JpbmFyeShTdHJpbmcpIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0RXhjZXB0aW9uKH5wKX5uIiwgW1N0cmluZ10pLAotICAgIGNhc2UgU3RyaW5nIG9mCi0gICAgICAgIDw8IlhjZXB0aW9uIj4+IC0+Ci0gICAgICAgICAgICB0aHJvdygjeGNlcHRpb257ZXJyb3JDb2RlID0gMTAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nfSk7Ci0gICAgICAgIF8gLT4KLSAgICAgICAgICAgIG9rCi0gICAgZW5kOwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE11bHRpRXhjZXB0aW9uLCB7QXJnMCwgQXJnMX0pIC0+Ci0gICAgaW86Zm9ybWF0KCJ0ZXN0TXVsdGlFeGNlcHRpb24ofnAsIH5wKX5uIiwgW0FyZzAsIEFyZzFdKSwKLSAgICBjYXNlIEFyZzAgb2YKLSAgICAgICAgPDwiWGNlcHRpb24iPj4gLT4KLSAgICAgICAgICAgIHRocm93KCN4Y2VwdGlvbntlcnJvckNvZGUgPSAxMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gPDwiVGhpcyBpcyBhbiBYY2VwdGlvbiI+Pn0pOwotICAgICAgICA8PCJYY2VwdGlvbjIiPj4gLT4KLSAgICAgICAgICAgIHRocm93KCN4Y2VwdGlvbjJ7ZXJyb3JDb2RlID0gMjAwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjeHRydWN0e3N0cmluZ190aGluZyA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24yIj4+fX0pOwotICAgICAgICBfIC0+Ci0gICAgICAgICAgICB7cmVwbHksICN4dHJ1Y3R7c3RyaW5nX3RoaW5nID0gQXJnMX19Ci0gICAgZW5kOwotCi1oYW5kbGVfZnVuY3Rpb24odGVzdE9uZXdheSwge1NlY29uZHN9KSAtPgotICAgIHRpbWVyOnNsZWVwKDEwMDAgKiBTZWNvbmRzKSwKLSAgICBvay4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8xMTUxLmVybCBiL2xpYi9lcmwvdGVzdC90ZXN0X3RocmlmdF8xMTUxLmVybAppbmRleCA5Y2VlNDg2Li5mNGE5MTBlIDEwMDY0NAotLS0gYS9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMTE1MS5lcmwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzExNTEuZXJsCkBAIC0xLDI0ICsxLDM0IEBACiAtbW9kdWxlKHRlc3RfdGhyaWZ0XzExNTEpLgogCi0taW5jbHVkZSgidGhyaWZ0MTE1MV90eXBlcy5ocmwiKS4KKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdDExNTFfdHlwZXMuaHJsIikuCiAKIC1pZmRlZihURVNUKS4KIC1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KIAogdW5tYXRjaGVkX3N0cnVjdF90ZXN0KCkgLT4KLSAgUzEgPSAjc3RydWN0Q3t4PSNzdHJ1Y3RCe3g9MX19LAorICBTMSA9ICMnU3RydWN0Qyd7eD0jJ1N0cnVjdEIne3g9MX19LAogICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtb3J5X2J1ZmZlcjpuZXcoKSwKICAge29rLCBQcm90b2NvbH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAotICA/YXNzZXJ0RXhjZXB0aW9uIChlcnJvciwgc3RydWN0X3VubWF0Y2hlZCwKLSAgICB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wsCi0gICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdzdHJ1Y3RDJykpfSwgUzF9KSkuCisgID9hc3NlcnRFeGNlcHRpb24oCisgICAgZXJyb3IsCisgICAgc3RydWN0X3VubWF0Y2hlZCwKKyAgICB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoCisgICAgICBQcm90b2NvbCwKKyAgICAgIHt7c3RydWN0LCBlbGVtZW50KDIsIHRocmlmdDExNTFfdHlwZXM6c3RydWN0X2luZm8oJ1N0cnVjdEMnKSl9LCBTMX0KKyAgICApCisgICkuCiAKIGJhZGFyZ190ZXN0KCkgLT4KLSAgUzIgPSAjc3RydWN0Q3t4PSNzdHJ1Y3RBe3g9IjEifX0sCisgIFMyID0gIydTdHJ1Y3RDJ3t4PSMnU3RydWN0QSd7eD0iMSJ9fSwKICAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbW9yeV9idWZmZXI6bmV3KCksCiAgIHtvaywgUHJvdG9jb2x9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKLSAgP2Fzc2VydEV4Y2VwdGlvbiAoZXJyb3IsIGJhZGFyZywKLSAgICB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUHJvdG9jb2wsCi0gICAgICB7e3N0cnVjdCwgZWxlbWVudCgyLCB0aHJpZnQxMTUxX3R5cGVzOnN0cnVjdF9pbmZvKCdzdHJ1Y3RDJykpfSwgUzJ9KSkuCisgID9hc3NlcnRFeGNlcHRpb24oCisgICAgZXJyb3IsCisgICAgYmFkYXJnLAorICAgIHRocmlmdF9wcm90b2NvbDp3cml0ZSgKKyAgICAgIFByb3RvY29sLAorICAgICAge3tzdHJ1Y3QsIGVsZW1lbnQoMiwgdGhyaWZ0MTE1MV90eXBlczpzdHJ1Y3RfaW5mbygnU3RydWN0QycpKX0sIFMyfQorICAgICkKKyAgKS4KIAogLWVuZGlmLgpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzMyMTQuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfdGhyaWZ0XzMyMTQuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTU0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF90aHJpZnRfMzIxNC5lcmwKQEAgLTAsMCArMSw2MCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfMzIxNCkuCistY29tcGlsZShleHBvcnRfYWxsKS4KKworLWluY2x1ZGUoImdlbi1lcmwvdGhyaWZ0MzIxNF90eXBlcy5ocmwiKS4KKworLWlmZGVmKFRFU1QpLgorLWlmbmRlZihvdHAxNl9vcl9sZXNzKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworcmVjb3JkX2dlbmVyYXRpb25fdGVzdF8oKSAtPgorICBbCisgICAgeyJTdHJpbmdNYXAgcmVjb3JkIiwgP19hc3NlcnRNYXRjaCgKKyAgICAgIHsnU3RyaW5nTWFwJywgX30sCisgICAgICAjJ1N0cmluZ01hcCd7ZGF0YT0jezUwID0+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/X2Fzc2VydEVxdWFsKAorICAgICAgc3RyaW5nLAorICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcmVwbHlfdHlwZSkKKyAgICApfSwKKyAgICB7InNlY29uZHRlc3RTdHJpbmcgZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCisgICAgICB7c3RydWN0LCBbXX0sCisgICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhzZWNvbmR0ZXN0U3RyaW5nLCBleGNlcHRpb25zKQorICAgICl9CisgIF0uCmRpZmYgLS1naXQgYS9saWIvZ28vTWFrZS5kZXBzIGIvbGliL2dvL01ha2UuZGVwcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlNzVkYS4uMDAwMDAwMAotLS0gYS9saWIvZ28vTWFrZS5kZXBzCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLXRocmlmdC8uaW5zdGFsbDogYnVmaW8uaW5zdGFsbCBieXRlcy5pbnN0YWxsIGNvbnRhaW5lci9saXN0Lmluc3RhbGwgY29udGFpbmVyL3ZlY3Rvci5pbnN0YWxsIGVuY29kaW5nL2Jhc2U2NC5pbnN0YWxsIGVuY29kaW5nL2JpbmFyeS5pbnN0YWxsIGZtdC5pbnN0YWxsIGh0dHAuaW5zdGFsbCBpby5pbnN0YWxsIGpzb24uaW5zdGFsbCBsb2cuaW5zdGFsbCBtYXRoLmluc3RhbGwgbmV0Lmluc3RhbGwgb3MuaW5zdGFsbCByZWZsZWN0Lmluc3RhbGwgc29ydC5pbnN0YWxsIHN0cmNvbnYuaW5zdGFsbCBzdHJpbmdzLmluc3RhbGwKLWFyY2hpdmUvdGFyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYXJjaGl2ZS90YXIuYQotYXJjaGl2ZS96aXAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9hcmNoaXZlL3ppcC5hCi1hc24xLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYXNuMS5hCi1iaWcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9iaWcuYQotYnVmaW8uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9idWZpby5hCi1ieXRlcy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2J5dGVzLmEKLWNtYXRoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY21hdGguYQotY29tcHJlc3MvYnppcDIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb21wcmVzcy9iemlwMi5hCi1jb21wcmVzcy9mbGF0ZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL2ZsYXRlLmEKLWNvbXByZXNzL2d6aXAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb21wcmVzcy9nemlwLmEKLWNvbXByZXNzL2x6dy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL2x6dy5hCi1jb21wcmVzcy96bGliLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29tcHJlc3MvemxpYi5hCi1jb250YWluZXIvaGVhcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbnRhaW5lci9oZWFwLmEKLWNvbnRhaW5lci9saXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29udGFpbmVyL2xpc3QuYQotY29udGFpbmVyL3JpbmcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb250YWluZXIvcmluZy5hCi1jb250YWluZXIvdmVjdG9yLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29udGFpbmVyL3ZlY3Rvci5hCi1jcnlwdG8uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8uYQotY3J5cHRvL2Flcy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9hZXMuYQotY3J5cHRvL2Jsb3dmaXNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Jsb3dmaXNoLmEKLWNyeXB0by9jYXN0NS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9jYXN0NS5hCi1jcnlwdG8vY2lwaGVyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2NpcGhlci5hCi1jcnlwdG8vZGVzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Rlcy5hCi1jcnlwdG8vZHNhLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2RzYS5hCi1jcnlwdG8vZWNkc2EuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vZWNkc2EuYQotY3J5cHRvL2VsbGlwdGljLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2VsbGlwdGljLmEKLWNyeXB0by9obWFjLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2htYWMuYQotY3J5cHRvL21kNC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9tZDQuYQotY3J5cHRvL21kNS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9tZDUuYQotY3J5cHRvL29jc3AuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vb2NzcC5hCi1jcnlwdG8vb3BlbnBncC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9vcGVucGdwLmEKLWNyeXB0by9vcGVucGdwL2FybW9yLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL29wZW5wZ3AvYXJtb3IuYQotY3J5cHRvL29wZW5wZ3AvZXJyb3IuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vb3BlbnBncC9lcnJvci5hCi1jcnlwdG8vb3BlbnBncC9wYWNrZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vb3BlbnBncC9wYWNrZXQuYQotY3J5cHRvL29wZW5wZ3AvczJrLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL29wZW5wZ3AvczJrLmEKLWNyeXB0by9yYW5kLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JhbmQuYQotY3J5cHRvL3JjNC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9yYzQuYQotY3J5cHRvL3JpcGVtZDE2MC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9yaXBlbWQxNjAuYQotY3J5cHRvL3JzYS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9yc2EuYQotY3J5cHRvL3NoYTEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc2hhMS5hCi1jcnlwdG8vc2hhMjU2Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3NoYTI1Ni5hCi1jcnlwdG8vc2hhNTEyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3NoYTUxMi5hCi1jcnlwdG8vc3VidGxlLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3N1YnRsZS5hCi1jcnlwdG8vdGxzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3Rscy5hCi1jcnlwdG8vdHdvZmlzaC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by90d29maXNoLmEKLWNyeXB0by94NTA5Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3g1MDkuYQotY3J5cHRvL3g1MDkvY3JsLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3g1MDkvY3JsLmEKLWNyeXB0by94dGVhLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3h0ZWEuYQotZGVidWcvZHdhcmYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9kd2FyZi5hCi1kZWJ1Zy9tYWNoby5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL21hY2hvLmEKLWRlYnVnL2VsZi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL2VsZi5hCi1kZWJ1Zy9nb3N5bS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL2dvc3ltLmEKLWRlYnVnL3BlLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvcGUuYQotZGVidWcvcHJvYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL3Byb2MuYQotZWJuZi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VibmYuYQotZW5jb2RpbmcvYXNjaWk4NS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2FzY2lpODUuYQotZW5jb2RpbmcvYmFzZTMyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvYmFzZTMyLmEKLWVuY29kaW5nL2Jhc2U2NC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2Jhc2U2NC5hCi1lbmNvZGluZy9iaW5hcnkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9iaW5hcnkuYQotZW5jb2RpbmcvZ2l0ODUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9naXQ4NS5hCi1lbmNvZGluZy9oZXguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9oZXguYQotZW5jb2RpbmcvbGluZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2xpbmUuYQotZW5jb2RpbmcvcGVtLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvcGVtLmEKLWV4ZWMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leGVjLmEKLWV4cC9kYXRhZm10Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZXhwL2RhdGFmbXQuYQotZXhwL2RyYXcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leHAvZHJhdy5hCi1leHAvZHJhdy94MTEuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leHAvZHJhdy94MTEuYQotZXhwL2V2YWwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leHAvZXZhbC5hCi1leHB2YXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9leHB2YXIuYQotZmxhZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ZsYWcuYQotZm10Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZm10LmEKLWdvL2FzdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL2FzdC5hCi1nby9kb2MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby9kb2MuYQotZ28vcGFyc2VyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vcGFyc2VyLmEKLWdvL3ByaW50ZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby9wcmludGVyLmEKLWdvL3NjYW5uZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby9zY2FubmVyLmEKLWdvL3Rva2VuLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vdG9rZW4uYQotZ28vdHlwZWNoZWNrZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby90eXBlY2hlY2tlci5hCi1nby90eXBlcy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3R5cGVzLmEKLWdvYi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvYi5hCi1oYXNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaGFzaC5hCi1oYXNoL2FkbGVyMzIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9oYXNoL2FkbGVyMzIuYQotaGFzaC9jcmMzMi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvY3JjMzIuYQotaGFzaC9jcmM2NC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvY3JjNjQuYQotaGFzaC9mbnYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9oYXNoL2Zudi5hCi1odG1sLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHRtbC5hCi1odHRwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC5hCi1odHRwL2NnaS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2h0dHAvY2dpLmEKLWh0dHAvZmNnaS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2h0dHAvZmNnaS5hCi1odHRwL3Bwcm9mLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC9wcHJvZi5hCi1odHRwL2h0dHB0ZXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC9odHRwdGVzdC5hCi1odHRwL3NwZHkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9odHRwL3NwZHkuYQotaW1hZ2UuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS5hCi1pbWFnZS9ibXAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS9ibXAuYQotaW1hZ2UvZ2lmLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW1hZ2UvZ2lmLmEKLWltYWdlL2pwZWcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS9qcGVnLmEKLWltYWdlL3BuZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlL3BuZy5hCi1pbWFnZS90aWZmLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW1hZ2UvdGlmZi5hCi1pbWFnZS95Y2Jjci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlL3ljYmNyLmEKLWluZGV4L3N1ZmZpeGFycmF5Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW5kZXgvc3VmZml4YXJyYXkuYQotaW8uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pby5hCi1pby9pb3V0aWwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pby9pb3V0aWwuYQotanNvbi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2pzb24uYQotbG9nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbG9nLmEKLW1hdGguaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9tYXRoLmEKLW1pbWUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9taW1lLmEKLW1pbWUvbXVsdGlwYXJ0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbWltZS9tdWx0aXBhcnQuYQotbmV0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbmV0LmEKLW5ldC9kaWN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbmV0L2RpY3QuYQotbmV0L3RleHRwcm90by5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L25ldC90ZXh0cHJvdG8uYQotbmV0Y2hhbi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L25ldGNoYW4uYQotb3MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9vcy5hCi1vcy9zaWduYWwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9vcy9zaWduYWwuYQotb3MvdXNlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L29zL3VzZXIuYQotcGF0Y2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9wYXRjaC5hCi1wYXRoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcGF0aC5hCi1wYXRoL2ZpbGVwYXRoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcGF0aC9maWxlcGF0aC5hCi1yYW5kLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcmFuZC5hCi1yZWZsZWN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcmVmbGVjdC5hCi1yZWdleHAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9yZWdleHAuYQotcnBjLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnBjLmEKLXJwYy9qc29ucnBjLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnBjL2pzb25ycGMuYQotcnVudGltZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3J1bnRpbWUuYQotcnVudGltZS9jZ28uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ydW50aW1lL2Nnby5hCi1ydW50aW1lL2RlYnVnLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnVudGltZS9kZWJ1Zy5hCi1ydW50aW1lL3Bwcm9mLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnVudGltZS9wcHJvZi5hCi1zY2FubmVyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc2Nhbm5lci5hCi1zbXRwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc210cC5hCi1zb3J0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc29ydC5hCi1zdHJjb252Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc3RyY29udi5hCi1zdHJpbmdzLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc3RyaW5ncy5hCi1zeW5jLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc3luYy5hCi1zeW5jL2F0b21pYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N5bmMvYXRvbWljLmEKLXN5c2NhbGwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9zeXNjYWxsLmEKLXN5c2xvZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N5c2xvZy5hCi10YWJ3cml0ZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90YWJ3cml0ZXIuYQotdGVtcGxhdGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZW1wbGF0ZS5hCi10ZXN0aW5nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGVzdGluZy5hCi10ZXN0aW5nL2lvdGVzdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3Rlc3RpbmcvaW90ZXN0LmEKLXRlc3RpbmcvcXVpY2suaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZXN0aW5nL3F1aWNrLmEKLXRlc3Rpbmcvc2NyaXB0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGVzdGluZy9zY3JpcHQuYQotdGltZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RpbWUuYQotdHJ5Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdHJ5LmEKLXVuaWNvZGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS91bmljb2RlLmEKLXV0ZjE2Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdXRmMTYuYQotdXRmOC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3V0ZjguYQotd2Vic29ja2V0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vd2Vic29ja2V0LmEKLXhtbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3htbC5hCi0uLi9jbWQvY2dvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2Nnby5hCi0uLi9jbWQvZWJuZmxpbnQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZWJuZmxpbnQuYQotLi4vY21kL2dvZG9jLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvZG9jLmEKLS4uL2NtZC9nb2ZpeC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb2ZpeC5hCi0uLi9jbWQvZ29mbXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ29mbXQuYQotLi4vY21kL2dvaW5zdGFsbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb2luc3RhbGwuYQotLi4vY21kL2dvdGVzdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb3Rlc3QuYQotLi4vY21kL2dvdHlwZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb3R5cGUuYQotLi4vY21kL2dvdmV0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvdmV0LmEKLS4uL2NtZC9nb3lhY2MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ295YWNjLmEKLS4uL2NtZC9oZ3BhdGNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2hncGF0Y2guYQpkaWZmIC0tZ2l0IGEvbGliL2dvL01ha2VmaWxlIGIvbGliL2dvL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTgxZDhkLi4wMDAwMDAwCi0tLSBhL2xpYi9nby9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCi0jIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotIyBBZnRlciBlZGl0aW5nIHRoZSBESVJTPSBsaXN0IG9yIGFkZGluZyBpbXBvcnRzIHRvIGFueSBHbyBmaWxlcwotIyBpbiBhbnkgb2YgdGhvc2UgZGlyZWN0b3JpZXMsIHJ1bjoKLSMKLSMJLi9kZXBzLmJhc2gKLSMKLSMgdG8gcmVidWlsZCB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpbiBNYWtlLmRlcHMuCi0KLQotaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuaW5jCi0KLWFsbDogTWFrZS5kZXBzIGluc3RhbGwKLQotRElSUz1cCi0gICAgIHRocmlmdC9cCi0KLVRFU1Q9XAotCSQoZmlsdGVyLW91dCAkKE5PVEVTVCksJChESVJTKSkKLQotCi1jbGVhbi5kaXJzOiAkKGFkZHN1ZmZpeCAuY2xlYW4sICQoRElSUykpCi1pbnN0YWxsLmRpcnM6ICQoYWRkc3VmZml4IC5pbnN0YWxsLCAkKERJUlMpKQotbnVrZS5kaXJzOiAkKGFkZHN1ZmZpeCAubnVrZSwgJChESVJTKSkKLXRlc3QuZGlyczogJChhZGRzdWZmaXggLnRlc3QsICQoRElSUykpCi1jaGVjay5kaXJzOiAkKGFkZHN1ZmZpeCAuY2hlY2ssICQoRElSUykpCi0KLSUuY2xlYW46Ci0JK2NkICQqICYmIGdvbWFrZSBjbGVhbgotCi0lLmluc3RhbGw6Ci0JK2NkICQqICYmIGdvbWFrZSBpbnN0YWxsCi0KLSUubnVrZToKLQkrY2QgJCogJiYgZ29tYWtlIG51a2UKLQotJS50ZXN0OgotCStjZCAkKiAmJiBnb21ha2UgdGVzdAotCi0lLmNoZWNrOgotCStjZCAkKiAmJiBnb21ha2UgY2hlY2sKLQotY2xlYW46IGNsZWFuLmRpcnMKLQotaW5zdGFsbDogaW5zdGFsbC5kaXJzCi0KLXRlc3Q6CXRlc3QuZGlycwotCi1jaGVjazoJY2hlY2suZGlycwotCi0jbnVrZTogbnVrZS5kaXJzCi0jCXJtIC1yZiAiJChHT1JPT1QpIi9wa2cvdGhyaWZ0LioKLQotZWNoby1kaXJzOgotCUBlY2hvICQoRElSUykKLQotTWFrZS5kZXBzOgotCS4vZGVwcy5iYXNoCi0KLWRlcHM6Ci0JLi9kZXBzLmJhc2gKLQpkaWZmIC0tZ2l0IGEvbGliL2dvL01ha2VmaWxlLmFtIGIvbGliL2dvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmE1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworaW5zdGFsbDoKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICdUaGUgR28gY2xpZW50IGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCB2aWEgImdvIGdldCIsIHBsZWFzZSBzZWUgL2xpYi9nby9SRUFETUUubWQnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKworY2hlY2stbG9jYWw6CisJR09QQVRIPWBwd2RgICQoR08pIHRlc3QgLXJhY2UgLi90aHJpZnQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIHBrZworCithbGwtbG9jYWw6CisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC4vdGhyaWZ0CisKK0VYVFJBX0RJU1QgPSBcCisJdGhyaWZ0IFwKKwljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9nby9SRUFETUUubWQgYi9saWIvZ28vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNmQ1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vUkVBRE1FLm1kCkBAIC0wLDAgKzEsODMgQEAKK1RocmlmdCBHbyBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKworVXNpbmcgVGhyaWZ0IHdpdGggR28KKz09PT09PT09PT09PT09PT09PT09CisKK1RocmlmdCBzdXBwb3J0cyBHbyAxLjcrCisKK0luIGZvbGxvd2luZyBHbyBjb252ZW50aW9ucywgd2UgcmVjb21tZW5kIHlvdSB1c2UgdGhlICdnbycgdG9vbCB0byBpbnN0YWxsCitUaHJpZnQgZm9yIGdvLgorCisgICAgJCBnbyBnZXQgZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQvLi4uCisKK1dpbGwgcmV0cmlldmUgYW5kIGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YgdGhlIHBhY2thZ2UuCisKKworQSBub3RlIGFib3V0IG9wdGlvbmFsIGZpZWxkcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgdGhyaWZ0LXRvLUdvIGNvbXBpbGVyIHRyaWVzIHRvIHJlcHJlc2VudCB0aHJpZnQgSURMIHN0cnVjdHMgYXMgR28gc3RydWN0cy4KK1dlIG11c3QgYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9wdGlvbmFsIGZpZWxkcyB0aGF0IGFyZSBzZXQgdG8gdGhlaXIKK2RlZmF1bHQgdmFsdWUgYW5kIG9wdGlvbmFsIHZhbHVlcyB3aGljaCBhcmUgYWN0dWFsbHkgdW5zZXQsIHNvIHRoZSBnZW5lcmF0ZWQKK2NvZGUgcmVwcmVzZW50cyBvcHRpb25hbCBmaWVsZHMgdmlhIHBvaW50ZXJzLgorCitUaGlzIGlzIGdlbmVyYWxseSBpbnR1aXRpdmUgYW5kIHdvcmtzIHdlbGwgbXVjaCBvZiB0aGUgdGltZSwgYnV0IEdvIGRvZXMgbm90CitoYXZlIGEgc3ludGF4IGZvciBjcmVhdGluZyBhIHBvaW50ZXIgdG8gYSBjb25zdGFudCBpbiBhIHNpbmdsZSBleHByZXNzaW9uLiBUaGF0CitpcywgZ2l2ZW4gYSBzdHJ1Y3QgbGlrZQorCisgICAgc3RydWN0IFNvbWVJRExUeXBlIHsKKyAgICAJT3B0aW9uYWxGaWVsZCAqaW50MzIKKyAgICB9CisKKywgdGhlIGZvbGxvd2luZyB3aWxsIG5vdCBjb21waWxlOgorCisgICAgeCA6PSAmU29tZUlETFR5cGV7CisgICAgCU9wdGlvbmFsRmllbGQ6ICYoMyksCisgICAgfQorCisoTm9yIGlzIHRoZXJlIGFueSBvdGhlciBzeW50YXggdGhhdCdzIGJ1aWx0IGluIHRvIHRoZSBsYW5ndWFnZSkKKworQXMgc3VjaCwgd2UgcHJvdmlkZSBzb21lIGhlbHBlcnMgdGhhdCBkbyBqdXN0IHRoaXMgdW5kZXIgbGliL2dvL3RocmlmdC8uIEUuZy4sCisKKyAgICB4IDo9ICZTb21lSURMVHlwZXsKKyAgICAJT3B0aW9uYWxGaWVsZDogdGhyaWZ0LkludDMyUHRyKDMpLAorICAgIH0KKworQW5kIHNvIG9uLiBUaGUgY29kZSBnZW5lcmF0b3IgYWxzbyBjcmVhdGVzIGFuYWxvZ291cyBoZWxwZXJzIGZvciB1c2VyLWRlZmluZWQKK3R5cGVkZWZzIGFuZCBlbnVtcy4KKworQWRkaW5nIGN1c3RvbSB0YWdzIHRvIGdlbmVyYXRlZCBUaHJpZnQgc3RydWN0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgY2FuIGFkZCB0YWdzIHRvIHRoZSBhdXRvLWdlbmVyYXRlZCB0aHJpZnQgc3RydWN0cyB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgIHN0cnVjdCBmb28geworICAgICAgMTogcmVxdWlyZWQgc3RyaW5nIEJhciAoZ28udGFnID0gInNvbWVfdGFnOlwic29tZV90YWdfdmFsdWVcIiIpCisgICAgfQorICAgIAord2hpY2ggd2lsbCBnZW5lcmF0ZToKKworICAgIHR5cGUgRm9vIHN0cnVjdCB7CisgICAgICBCYXIgc3RyaW5nIGB0aHJpZnQ6ImJhciwxLHJlcXVpcmVkIiBzb21lX3RhZzoic29tZV90YWdfdmFsdWUiYAorICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9nby9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2dvL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2dvL2RlcHMuYmFzaCBiL2xpYi9nby9kZXBzLmJhc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYmQ0MDQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL2RlcHMuYmFzaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IGJhc2gKLSMgQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCi0jIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotT1VUPSJNYWtlLmRlcHMiCi1UTVA9Ik1ha2UuZGVwcy50bXAiCi0KLWlmIFsgLWYgJE9VVCBdICYmICEgWyAtdyAkT1VUIF07IHRoZW4KLQllY2hvICIkMDogJE9VVCBpcyByZWFkLW9ubHk7IGFib3J0aW5nLiIgMT4mMgotCWV4aXQgMQotZmkKLQotIyBHZXQgbGlzdCBvZiBkaXJlY3RvcmllcyBmcm9tIE1ha2VmaWxlCi1kaXJzPSQoc2VkICcxLC9eRElSUz0vZDsgL14kLywkZDsgcy9cXC8vZycgTWFrZWZpbGUpCi1kaXJzMj0kKHNlZCAnMSwvXkRJUlM9L2Q7IC9eJC8sJGQ7IHMvXFwvL2cnICRHT1JPT1Qvc3JjL3BrZy9NYWtlZmlsZSkKLWRpcnBhdD0kKGVjaG8gJGRpcnMgJGRpcnMyIHwgc2VkICdzLyAvfC9nOyBzLy4qL14oJikkLycpCi0KLWZvciBkaXIgaW4gJGRpcnM7IGRvICgKLQljZCAkZGlyIHx8IGV4aXQgMQotCi0Jc291cmNlcz0kKHNlZCAtbiAncy9cLmdvXFwvLmdvL3AnIE1ha2VmaWxlKQotCXNvdXJjZXM9JChscyAkc291cmNlcyAyPiAvZGV2L251bGwpICAjIHJlbW92ZSAucywgLmMsIGV0Yy4KLQotCWRlcHM9JCgKLQkJc2VkIC1uICcvXmltcG9ydC4qIi9wOyAvXmltcG9ydFsgXHRdKigvLC9eKS9wJyAkc291cmNlcyAvZGV2L251bGwgfAotCQljdXQgLWQgJyInIC1mMiB8Ci0JCWVncmVwICIkZGlycGF0IiB8Ci0JCWdyZXAgLXYgIl4kZGlyXCQiIHwKLQkJc2VkICdzLyQvLmluc3RhbGwvJyB8Ci0JCXNvcnQgLXUKLQkpCi0KLQllY2hvICRkaXIuaW5zdGFsbDogJGRlcHMKLSkgZG9uZSA+ICRUTVAKLQotZm9yIGRpciBpbiAkZGlyczI7IGRvICgKLSAgZWNobyAkZGlyLmluc3RhbGw6IFwke0dPUk9PVH0vcGtnL1wke0dPT1N9X1wke0dPQVJDSH0vJHtkaXJ9LmEKLSkgZG9uZSA+PiAkVE1QCi0KLW12ICRUTVAgJE9VVApkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvQmluYXJ5S2V5VGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9CaW5hcnlLZXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNiNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvQmluYXJ5S2V5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhyaWZ0IHByb2R1Y2UgY29tcGlsYWJsZSBjb2RlIGZvciBiaW5hcnkga2V5CitzdHJ1Y3QgdGVzdFN0cnVjdCB7CisgIDE6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiBiaW5fdG9fc3RyaW5nCit9CisKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvRG9udEV4cG9ydFJXVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0RvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgSW5uZXJTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWQKK30KKworc3RydWN0IFRlc3RTdHJ1Y3QgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWQKKyAgMjogcmVxdWlyZWQgSW5uZXJTdHJ1Y3QgaW5uZXIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L0Vycm9yVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjY2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9FcnJvclRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCitzdHJ1Y3QgVGVzdFN0cnVjdCAKK3sKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiBtLAorICAyOiBsaXN0PHN0cmluZz4gbCwKKyAgMzogc2V0PHN0cmluZz4gcywKKyAgNDogaTMyIGkKK30KKworc2VydmljZSBFcnJvclRlc3QgCit7CisgIFRlc3RTdHJ1Y3QgICAgICAgICB0ZXN0U3RydWN0KDE6IFRlc3RTdHJ1Y3QgdGhpbmcpCisgIHN0cmluZyAgICAgICAgICAgICB0ZXN0U3RyaW5nKDE6IHN0cmluZyBzKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvR29UYWdUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4YjNiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0dvVGFnVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCB0YWdnZWQgeworICAgIDE6IHN0cmluZyBzdHJpbmdfdGhpbmcsCisgICAgMjogaTY0IGludF90aGluZyAoZ28udGFnID0gImpzb246XCJpbnRfdGhpbmcsc3RyaW5nXCIiKSwKKyAgICAzOiBvcHRpb25hbCBpNjQgb3B0aW9uYWxfaW50X3RoaW5nCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9JZ25vcmVJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMwZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IElnbm9yZUluaXRpYWxpc21zVGVzdCB7CisgICAgMTogaTY0IGlkLAorICAgIDI6IGk2NCBteV9pZCwKKyAgICAzOiBpNjQgbnVtX2NwdSwKKyAgICA0OiBpNjQgbnVtX2dwdSwKKyAgICA1OiBpNjQgbXlfSUQsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9JbmNsdWRlc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvSW5jbHVkZXNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjYwMzIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvSW5jbHVkZXNUZXN0LnRocmlmdApAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCitpbmNsdWRlICJOYW1lc3BhY2VkVGVzdC50aHJpZnQiCisKK2NvbnN0IFRocmlmdFRlc3QuVXNlcklkIFVTRVJJRCA9IDQyCitjb25zdCBOYW1lc3BhY2VkVGVzdC5Vc2VySWQgVVNFUklEMSA9IDQxCitjb25zdCBUaHJpZnRUZXN0Lk1hcFR5cGUgTUFQQ09OU1RBTlQgPSB7J2hlbGxvJzp7fSwgJ2dvb2RuaWdodCc6e319CisKK2NvbnN0IGkzMiBUV08gPSBOYW1lc3BhY2VkVGVzdC5TdHVmZi5UV08KK2NvbnN0IGkzMiBUSFJFRSA9IE5hbWVzcGFjZWRUZXN0LlRIUkVFCisKK3N0cnVjdCB0ZXN0U3RydWN0IHsKKyAgMTogbGlzdDxUaHJpZnRUZXN0Lk51bWJlcno+IGxpc3ROdW1iZXJzCit9CisKK3N0cnVjdCBUZXN0U3RydWN0MiB7CisgIDE6IHRlc3RTdHJ1Y3QgYmxhaCwKKyAgMjogVGhyaWZ0VGVzdC5Vc2VySWQgaWQsCisgIDM6IE5hbWVzcGFjZWRUZXN0LlN0dWZmIHN0dWZmLAorfQorCitzZXJ2aWNlIHRlc3RTZXJ2aWNlIGV4dGVuZHMgVGhyaWZ0VGVzdC5TZWNvbmRTZXJ2aWNlIHsKKyAgVGhyaWZ0VGVzdC5DcmF6eU5lc3RpbmcgZ2V0Q3JhenlOZXN0aW5nKAorICAgIDE6IFRocmlmdFRlc3QuU3RydWN0QSBhLAorICAgIDI6IFRocmlmdFRlc3QuTnVtYmVyeiBudW1iZXJzCisgICkgdGhyb3dzKDE6IFRocmlmdFRlc3QuWGNlcHRpb24gZXJyMSksCisKKyAgdm9pZCBnZXRTb21lVmFsdWVfRE9fTk9UX0NBTEwoKSwKK30KKworc2VydmljZSBFeHRlbmRlZFNlcnZpY2UgZXh0ZW5kcyB0ZXN0U2VydmljZSB7CisgIHZvaWQgZXh0ZW5kZWRNZXRob2QoKSwKKyAgTmFtZXNwYWNlZFRlc3QuU3R1ZmZTdHJ1Y3QgZXh0ZW5kZWRNZXRob2QyKCksCit9CisKK3NlcnZpY2UgRXh0ZW5kZWQyU2VydmljZSBleHRlbmRzIE5hbWVzcGFjZWRUZXN0Lk5hbWVzcGFjZWRTZXJ2aWNlIHsKKyAgdm9pZCBleHRlbmRlZE1ldGhvZDMoKSwKK30KKwordHlwZWRlZiBtYXA8VGhyaWZ0VGVzdC5Vc2VySWQsIG1hcDxOYW1lc3BhY2VkVGVzdC5Vc2VySWQsIGxpc3Q8VGVzdFN0cnVjdDI+ID4gPiBDb21wbGV4TWFwVHlwZQorCitzdHJ1Y3QgQ29tcGxleE1hcFN0cnVjdCB7CisgIDE6IENvbXBsZXhNYXBUeXBlIGNvbXBsZXgsCit9CisKK3NlcnZpY2UgQ29tcGxleE1hcFNlcnZpY2UgeworICBDb21wbGV4TWFwU3RydWN0IHRyYW5zZm9ybU1hcCgxOiBDb21wbGV4TWFwU3RydWN0IGlucHV0KSwKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4NmFjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L0luaXRpYWxpc21zVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBJbml0aWFsaXNtc1Rlc3QgeworICAgIDE6IHN0cmluZyB1c2VyX2lkLAorICAgIDI6IHN0cmluZyBzZXJ2ZXJfdXJsLAorICAgIDM6IHN0cmluZyBpZCwgCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9nby90ZXN0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDQ2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVEFSR1MgPSAtb3V0IGdvcGF0aC9zcmMvIC0tZ2VuIGdvOnRocmlmdF9pbXBvcnQ9dGhyaWZ0JChDT01QSUxFUl9FWFRSQUZMQUcpCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisKKyMgVGhyaWZ0IGZvciBHTyBoYXMgcHJvYmxlbXMgd2l0aCBjb21wbGV4IG1hcCBrZXlzOiBUSFJJRlQtMjA2MworZ29wYXRoOiAkKFRIUklGVCkgJChUSFJJRlRURVNUKSBcCisJCQkJSW5jbHVkZXNUZXN0LnRocmlmdCBcCisJCQkJTmFtZXNwYWNlZFRlc3QudGhyaWZ0IFwKKwkJCQlNdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQgXAorCQkJCU9uZXdheVRlc3QudGhyaWZ0IFwKKwkJCQlPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IFwKKwkJCQlSZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgXAorCQkJCVNlcnZpY2VzVGVzdC50aHJpZnQgXAorCQkJCUdvVGFnVGVzdC50aHJpZnQgXAorCQkJCVR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IFwKKwkJCQlSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgXAorCQkJCVVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgXAorCQkJCVVuaW9uQmluYXJ5VGVzdC50aHJpZnQgXAorCQkJCUVycm9yVGVzdC50aHJpZnQgXAorCQkJCU5hbWVzVGVzdC50aHJpZnQgXAorCQkJCUluaXRpYWxpc21zVGVzdC50aHJpZnQgXAorCQkJCURvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0IFwKKwkJCQlkb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbyBcCisJCQkJSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdAorCW1rZGlyIC1wIGdvcGF0aC9zcmMKKwlncmVwIC12IGxpc3QuKm1hcC4qbGlzdC4qbWFwICQoVEhSSUZUVEVTVCkgfCBncmVwIC12ICdzZXQ8SW5zYW5pdHk+JyA+IFRocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgLXIgSW5jbHVkZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEJpbmFyeUtleVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgT25ld2F5VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBPcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgU2VydmljZXNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEdvVGFnVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBUeXBlZGVmRmllbGRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBVbmlvbkJpbmFyeVRlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgRXJyb3JUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE5hbWVzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBJbml0aWFsaXNtc1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUykscmVhZF93cml0ZV9wcml2YXRlIERvbnRFeHBvcnRSV1Rlc3QudGhyaWZ0CisJJChUSFJJRlQpICQoVEhSSUZUQVJHUyksaWdub3JlX2luaXRpYWxpc21zIElnbm9yZUluaXRpYWxpc21zVGVzdC50aHJpZnQKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayB8fCB0cnVlCisJc2VkIC1pICdzL1wiY29udGV4dFwiL1wiZ29sYW5nLm9yZ1wveFwvbmV0XC9jb250ZXh0XCIvZycgZ29wYXRoL3NyYy9naXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jay9jb250cm9sbGVyLmdvIHx8IHRydWUKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jaworCWxuIC1uZnMgLi4vLi4vLi4vdGhyaWZ0IGdvcGF0aC9zcmMvdGhyaWZ0CisJbG4gLW5mcyAuLi8uLi90ZXN0cyBnb3BhdGgvc3JjL3Rlc3RzCisJY3AgLXIgLi9kb250ZXhwb3J0cnd0ZXN0IGdvcGF0aC9zcmMKKwl0b3VjaCBnb3BhdGgKKworY2hlY2s6IGdvcGF0aAorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgYnVpbGQgXAorCQkJCWluY2x1ZGVzdGVzdCBcCisJCQkJYmluYXJ5a2V5dGVzdCBcCisJCQkJc2VydmljZXN0ZXN0IFwKKwkJCQl0eXBlZGVmZmllbGR0ZXN0IFwKKwkJCQlyZWZhbm5vdGF0aW9uZmllbGRzdGVzdCBcCisJCQkJZXJyb3J0ZXN0CVwKKwkJCQluYW1lc3Rlc3QgXAorCQkJCWluaXRpYWxpc21zdGVzdCBcCisJCQkJZG9udGV4cG9ydHJ3dGVzdCBcCisJCQkJaWdub3JlaW5pdGlhbGlzbXN0ZXN0IFwKKwkJCQl1bmlvbmJpbmFyeXRlc3QKKwlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIHRlc3QgdGhyaWZ0IHRlc3RzIGRvbnRleHBvcnRyd3Rlc3QKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ29wYXRoIFRocmlmdFRlc3QudGhyaWZ0IGdlbi1nbworCitjbGllbnQ6IHN0dWJzCisJJChHTykgcnVuIFRlc3RDbGllbnQuZ28KKworRVhUUkFfRElTVCA9IFwKKwlkb250ZXhwb3J0cnd0ZXN0IFwKKwl0ZXN0cyBcCisJQmluYXJ5S2V5VGVzdC50aHJpZnQgXAorCUdvVGFnVGVzdC50aHJpZnQgXAorCUluY2x1ZGVzVGVzdC50aHJpZnQgXAorCU11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdCBcCisJTmFtZXNwYWNlZFRlc3QudGhyaWZ0IFwKKwlPbmV3YXlUZXN0LnRocmlmdCBcCisJT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdCBcCisJUmVxdWlyZWRGaWVsZFRlc3QudGhyaWZ0IFwKKwlSZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQgXAorCVVuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgXAorCVVuaW9uQmluYXJ5VGVzdC50aHJpZnQgXAorCVNlcnZpY2VzVGVzdC50aHJpZnQgXAorCVR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0IFwKKwlFcnJvclRlc3QudGhyaWZ0IFwKKwlOYW1lc1Rlc3QudGhyaWZ0IFwKKwlJbml0aWFsaXNtc1Rlc3QudGhyaWZ0IFwKKwlEb250RXhwb3J0UldUZXN0LnRocmlmdCBcCisJSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvTXVsdGlwbGV4ZWRQcm90b2NvbFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjNmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9NdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NlcnZpY2UgRmlyc3QgeworICAgIGk2NCByZXR1cm5PbmUoKTsKK30KKworc2VydmljZSBTZWNvbmQgeworICAgIGk2NCByZXR1cm5Ud28oKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTmFtZXNUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlOTU2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L05hbWVzVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzMiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBOYW1lc1Rlc3QgeworICAgIDE6IHJlcXVpcmVkIHN0cmluZyB0eXBlCit9CisKK3NlcnZpY2UgTmFtZUNvbGxpc2lvbk9uZQoreworICAgIHZvaWQgYmxhaEJsYWgoKQorfQorCitzZXJ2aWNlIE5hbWVDb2xsaXNpb25Ud28KK3sKKyAgICB2b2lkIGJsYWhCbGFoKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L05hbWVzcGFjZWRUZXN0LnRocmlmdCBiL2xpYi9nby90ZXN0L05hbWVzcGFjZWRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTEwMzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvTmFtZXNwYWNlZFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNDAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbmNsdWRlICJUaHJpZnRUZXN0LnRocmlmdCIKKworbmFtZXNwYWNlIGdvIGxpYi5nby50ZXN0Lm5hbWVzcGFjZWR0ZXN0CisKK2VudW0gU3R1ZmYgeworICBPTkUgPSAxLAorICBUV08gPSAyLAorfQorCitjb25zdCBpMzIgVEhSRUUgPSAzOworCit0eXBlZGVmIGk2NCBVc2VySWQKKworc3RydWN0IFN0dWZmU3RydWN0IHsKKyAgMjogU3R1ZmYgc3R1ZmYsCit9CisKK3NlcnZpY2UgTmFtZXNwYWNlZFNlcnZpY2UgeworICBUaHJpZnRUZXN0LlVzZXJJZCBnZXRVc2VySUQoKSwKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvT25ld2F5VGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9PbmV3YXlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQyZjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvT25ld2F5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3NlcnZpY2UgT25lV2F5IHsKKyAgICBvbmV3YXkgdm9pZCBoaSgxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgdm9pZCBlbXB0eWZ1bmMoKQorICAgIGk2NCBlY2hvX2ludCgxOiBpNjQgcGFyYW0pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9PcHRpb25hbEZpZWxkc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZjMTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvT3B0aW9uYWxGaWVsZHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3RydWN0IHN0cnVjdEEgeworIDE6IHJlcXVpcmVkIGk2NCBzYV9pCit9CisKK3N0cnVjdCBhbGxfb3B0aW9uYWwgeworIDE6IG9wdGlvbmFsIHN0cmluZyBzID0gIkRFRkFVTFQiLAorIDI6IG9wdGlvbmFsIGk2NCBpID0gNDIsCisgMzogb3B0aW9uYWwgYm9vbCBiID0gZmFsc2UsCisgNDogb3B0aW9uYWwgc3RyaW5nIHMyLAorIDU6IG9wdGlvbmFsIGk2NCBpMiwKKyA2OiBvcHRpb25hbCBib29sIGIyLAorIDc6IG9wdGlvbmFsIHN0cnVjdEEgYWEsCisgOTogb3B0aW9uYWwgbGlzdDxpNjQ+IGwsCisgMTA6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsMiA9IFsxLCAyXSwKKyAxMTogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtLAorIDEyOiBvcHRpb25hbCBtYXA8aTY0LCBpNjQ+IG0yID0gezE6MiwgMzo0fSwKKyAxMzogb3B0aW9uYWwgYmluYXJ5IGJpbiwKKyAxNDogb3B0aW9uYWwgYmluYXJ5IGJpbjIgPSAiYXNkZiIsCit9CisKK3N0cnVjdCBzdHJ1Y3RCIHsKKyAxOiByZXF1aXJlZCBzdHJ1Y3RBIHJlcXVpcmVkX3N0cnVjdF90aGluZworIDI6IG9wdGlvbmFsIHN0cnVjdEEgb3B0aW9uYWxfc3RydWN0X3RoaW5nCit9CisKK3N0cnVjdCBzdHJ1Y3RDIHsKKyAxOiBzdHJpbmcgcywKKyAyOiByZXF1aXJlZCBpMzIgaSwKKyAzOiBvcHRpb25hbCBib29sIGIsCisgNDogcmVxdWlyZWQgc3RyaW5nIHMyLAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjI4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9SZWZBbm5vdGF0aW9uRmllbGRzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw1OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3N0cnVjdCBzdHJ1Y3RBIHsKKyAxOiByZXF1aXJlZCBpNjQgc2FfaQorfQorCitzdHJ1Y3QgYWxsX3JlZmVyZW5jZWQgeworIDE6IG9wdGlvbmFsIHN0cmluZyBzID0gIkRFRkFVTFQiIChjcHAucmVmID0gIiIpLAorIDI6IG9wdGlvbmFsIGk2NCBpID0gNDIgKGNwcC5yZWYgPSAiIiksCisgMzogb3B0aW9uYWwgYm9vbCBiID0gZmFsc2UgKGNwcC5yZWYgPSAiIiksCisgNDogb3B0aW9uYWwgc3RyaW5nIHMyIChjcHAucmVmID0gIiIpLAorIDU6IG9wdGlvbmFsIGk2NCBpMiAoY3BwLnJlZiA9ICIiKSwKKyA2OiBvcHRpb25hbCBib29sIGIyIChjcHAucmVmID0gIiIpLAorIDc6IG9wdGlvbmFsIHN0cnVjdEEgYWEgKGNwcC5yZWYgPSAiIiksCisgOTogb3B0aW9uYWwgbGlzdDxpNjQ+IGwgKGNwcC5yZWYgPSAiIiksCisgMTA6IG9wdGlvbmFsIGxpc3Q8aTY0PiBsMiA9IFsxLCAyXSAoY3BwLnJlZiA9ICIiKSwKKyAxMTogb3B0aW9uYWwgbWFwPGk2NCwgaTY0PiBtIChjcHAucmVmID0gIiIpLAorIDEyOiBvcHRpb25hbCBtYXA8aTY0LCBpNjQ+IG0yID0gezE6MiwgMzo0fSAoY3BwLnJlZiA9ICIiKSwKKyAxMzogb3B0aW9uYWwgYmluYXJ5IGJpbiAoY3BwLnJlZiA9ICIiKSwKKyAxNDogb3B0aW9uYWwgYmluYXJ5IGJpbjIgPSAiYXNkZiIgKGNwcC5yZWYgPSAiIiksCisKKyAxNTogcmVxdWlyZWQgc3RyaW5nIHJlZl9zID0gIkRFRkFVTFQiIChjcHAucmVmID0gIiIpLAorIDE2OiByZXF1aXJlZCBpNjQgcmVmX2kgPSA0MiAoY3BwLnJlZiA9ICIiKSwKKyAxNzogcmVxdWlyZWQgYm9vbCByZWZfYiA9IGZhbHNlIChjcHAucmVmID0gIiIpLAorIDE4OiByZXF1aXJlZCBzdHJpbmcgcmVmX3MyIChjcHAucmVmID0gIiIpLAorIDE5OiByZXF1aXJlZCBpNjQgcmVmX2kyIChjcHAucmVmID0gIiIpLAorIDIwOiByZXF1aXJlZCBib29sIHJlZl9iMiAoY3BwLnJlZiA9ICIiKSwKKyAyMTogcmVxdWlyZWQgc3RydWN0QSByZWZfYWEgKGNwcC5yZWYgPSAiIiksCisgMjI6IHJlcXVpcmVkIGxpc3Q8aTY0PiByZWZfbCAoY3BwLnJlZiA9ICIiKSwKKyAyMzogcmVxdWlyZWQgbGlzdDxpNjQ+IHJlZl9sMiA9IFsxLCAyXSAoY3BwLnJlZiA9ICIiKSwKKyAyNDogcmVxdWlyZWQgbWFwPGk2NCwgaTY0PiByZWZfbSAoY3BwLnJlZiA9ICIiKSwKKyAyNTogcmVxdWlyZWQgbWFwPGk2NCwgaTY0PiByZWZfbTIgPSB7MToyLCAzOjR9IChjcHAucmVmID0gIiIpLAorIDI2OiByZXF1aXJlZCBiaW5hcnkgcmVmX2JpbiAoY3BwLnJlZiA9ICIiKSwKKyAyNzogcmVxdWlyZWQgYmluYXJ5IHJlZl9iaW4yID0gImFzZGYiIChjcHAucmVmID0gIiIpLAorCit9CisKK3N0cnVjdCBzdHJ1Y3RCIHsKKyAxOiByZXF1aXJlZCBzdHJ1Y3RBIHJlcXVpcmVkX3N0cnVjdF90aGluZworIDI6IG9wdGlvbmFsIHN0cnVjdEEgb3B0aW9uYWxfc3RydWN0X3RoaW5nCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApAQCAtMCwwICsxLDcgQEAKK3N0cnVjdCBSZXF1aXJlZEZpZWxkIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKK30KKworc3RydWN0IE90aGVyVGhpbmcgeworICAxOiByZXF1aXJlZCBpMTYgdmFsdWUKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1NlcnZpY2VzVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9TZXJ2aWNlc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9TZXJ2aWNlc1Rlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTExIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBXZSBhcmUgb25seSB0ZXN0aW5nIHRoYXQgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIG5vIGNvcnJlY3RuZXNzIGNoZWNraW5nIGlzIGRvbmUKKworZXhjZXB0aW9uIG1vZGVyYXRlX2Rpc2FzdGVyIHsKKyAgMTogaTMyIGVycm9yQ29kZSwKKyAgMjogc3RyaW5nIG1lc3NhZ2UKK30KKworZXhjZXB0aW9uIHRvdGFsX2Rpc2FzdGVyIHsKKyAgMTogc3RyaW5nIG1lc3NhZ2UKKyAgMjogb3B0aW9uYWwgYm9vbCBwcmVzaWRlbnRfd2FzX3dva2VuX3VwID0gZmFsc2UKK30KKworc3RydWN0IHN0cnVjdF9hIHsKKyAgMTogcmVxdWlyZWQgaTY0IHdoYXRldmVyCit9CisKK3NlcnZpY2UgYV9zZXJ2IHsKKyAgICB2b2lkIHZvaWRmdW5jKCksCisgICAgdm9pZCB2b2lkX3dpdGhfMWV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgdm9pZCB2b2lkX3dpdGhfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cmluZyBzdHJpbmdmdW5jKCkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJpbmcgc3RyaW5nZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgaTY0IGk2NGZ1bmMoKQorICAgIGk2NCBpNjRmdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGk2NCBpNjRmdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmMoKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMmV4KCkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuYygpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzFleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18yZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuYygpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xZXgoKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzJleCgpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICB2b2lkIHZvaWRmdW5jXzFpbnQoMTogaTY0IGkpLAorICAgIHZvaWQgdm9pZF93aXRoXzFleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICB2b2lkIHZvaWRfd2l0aF8yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cmluZyBzdHJpbmdmdW5jXzFpbnQoMTogaTY0IGkpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgaTY0IGk2NGZ1bmNfMWludCgxOiBpNjQgaSkKKyAgICBpNjQgaTY0ZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgaTY0IGk2NGZ1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWludCgxOiBpNjQgaSkKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIGxpc3Q8c3RyaW5nPiBsaXN0X29mX3N0cmluZ3NfZnVuY18yZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xaW50KDE6IGk2NCBpKQorICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xZXhfMWludCgxOiBpNjQgaSkgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbWFwPGk2NCxzdHJpbmc+IG1hcF9mdW5jXzJleF8xaW50KDE6IGk2NCBpKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xaW50KDE6IGk2NCBpKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMWV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHN0cnVjdF9hIHN0cnVjdF9hX2Z1bmNfMmV4XzFpbnQoMTogaTY0IGkpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICB2b2lkIHZvaWRmdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSwKKyAgICB2b2lkIHZvaWRfd2l0aF8xZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxKQorICAgIHZvaWQgdm9pZF93aXRoXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIHN0cmluZyBzdHJpbmdmdW5jXzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKQorICAgIHN0cmluZyBzdHJpbmdmdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RyaW5nIHN0cmluZ2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgaTY0IGk2NGZ1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgaTY0IGk2NGZ1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBpNjQgaTY0ZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBsaXN0PHN0cmluZz4gbGlzdF9vZl9zdHJpbmdzX2Z1bmNfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgbGlzdDxzdHJpbmc+IGxpc3Rfb2Zfc3RyaW5nc19mdW5jXzJleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEsIDI6dG90YWxfZGlzYXN0ZXIgZXJyMikKKworICAgIG1hcDxpNjQsc3RyaW5nPiBtYXBfZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMWV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSkKKyAgICBtYXA8aTY0LHN0cmluZz4gbWFwX2Z1bmNfMmV4XzFpbnRfMXMoMTogaTY0IGksIDI6IHN0cmluZyBzKSB0aHJvd3MoMTogbW9kZXJhdGVfZGlzYXN0ZXIgZXJyMSwgMjp0b3RhbF9kaXNhc3RlciBlcnIyKQorCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFleF8xaW50XzFzKDE6IGk2NCBpLCAyOiBzdHJpbmcgcykgdGhyb3dzKDE6IG1vZGVyYXRlX2Rpc2FzdGVyIGVycjEpCisgICAgc3RydWN0X2Egc3RydWN0X2FfZnVuY18yZXhfMWludF8xcygxOiBpNjQgaSwgMjogc3RyaW5nIHMpIHRocm93cygxOiBtb2RlcmF0ZV9kaXNhc3RlciBlcnIxLCAyOnRvdGFsX2Rpc2FzdGVyIGVycjIpCisKKyAgICBzdHJ1Y3RfYSBzdHJ1Y3RfYV9mdW5jXzFzdHJ1Y3RfYSgxOiBzdHJ1Y3RfYSBzdCkKKworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9UeXBlZGVmRmllbGRUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTBlOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQKQEAgLTAsMCArMSwzOSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgV2UgYXJlIG9ubHkgdGVzdGluZyB0aGF0IGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVzLCBubyBjb3JyZWN0bmVzcyBjaGVja2luZyBpcyBkb25lCisKK2VudW0gRGV0YWlscyB7CisgIEV2ZXJ5dGhpbmcgPSAwCisgIFN0YXRlT25seSA9IDEKKyAgU3RhdGVBbmRPcHRpb25zID0gMgorICBTb21ldGhpbmdFbHNlID0gMworfQorCit0eXBlZGVmIGxpc3Q8IERldGFpbHM+ICBEZXRhaWxzV2FudGVkCisKK3N0cnVjdCBCYXNlUmVxdWVzdCB7CisgIDEgOiBvcHRpb25hbCBzdHJpbmcgUmVxdWVzdElECit9CisKK3N0cnVjdCBHZXRNeURldGFpbHMgeworICAxIDogcmVxdWlyZWQgQmFzZVJlcXVlc3QgYmFzZV8KKyAgMiA6IHJlcXVpcmVkIHN0cmluZyBPYmplY3RJRAorICAzIDogb3B0aW9uYWwgRGV0YWlsc1dhbnRlZCBEZXRhaWxzV2FudGVkCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9VbmlvbkJpbmFyeVRlc3QudGhyaWZ0IGIvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzcxMTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvVW5pb25CaW5hcnlUZXN0LnRocmlmdApAQCAtMCwwICsxLDI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MwordW5pb24gU2FtcGxlIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB1MSwKKyAgMjogYmluYXJ5IHUyLAorICAzOiBsaXN0PHN0cmluZz4gdTMKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1VuaW9uRGVmYXVsdFZhbHVlVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTM0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9VbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzdHJ1Y3QgT3B0aW9uMSB7Cit9CisKK3N0cnVjdCBPcHRpb24yIHsKKyAgMTogb3B0aW9uYWwgc3RyaW5nIG5hbWUKK30KKwordW5pb24gRGVzY2VuZGFudCB7CisgIDE6IE9wdGlvbjEgb3B0aW9uMQorICAyOiBPcHRpb24yIG9wdGlvbjIKK30KKworc3RydWN0IFRlc3RTdHJ1Y3QgeworICAxOiBvcHRpb25hbCBEZXNjZW5kYW50IGRlc2NlbmRhbnQgPSB7ICJvcHRpb24xIjoge319Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbyBiL2xpYi9nby90ZXN0L2RvbnRleHBvcnRyd3Rlc3QvY29tcGlsZV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjc2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgZG9udGV4cG9ydHJ3dGVzdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCisvLyBNYWtlIHN1cmUgdGhhdCB0aHJpZnQgZ2VuZXJhdGVzIG5vbi1leHBvcnRlZCByZWFkL3dyaXRlIG1ldGhvZHMgaWYKKy8vIHJlYWRfd3JpdGVfcHJpdmF0ZSBvcHRpb24gaXMgc3BlY2lmaWVkCitmdW5jIFRlc3RSZWFkV3JpdGVNZXRob2RzQXJlUHJpdmF0ZSh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBUaGlzIHdpbGwgb25seSBjb21waWxlIGlmIHJlYWQvd3JpdGUgbWV0aG9kcyBleGlzdAorCXMgOj0gTmV3VGVzdFN0cnVjdCgpCisJXyA9IHMucmVhZAorCV8gPSBzLndyaXRlCisKKwlpcyA6PSBOZXdJbm5lclN0cnVjdCgpCisJXyA9IGlzLnJlYWQKKwlfID0gaXMud3JpdGUKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2JpbmFyeV9rZXlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2JpbmFyeV9rZXlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTk2MTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvYmluYXJ5X2tleV90ZXN0LmdvCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJiaW5hcnlrZXl0ZXN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RCaW5hcnlNYXBLZXlHZW5lcmF0ZXNTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJcyA6PSBiaW5hcnlrZXl0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCS8vVGhpcyB3aWxsIG9ubHkgY29tcGlsZSBpZiBCaW5Ub1N0cmluZyBoYXMgdHlwZSBvZiBtYXBbc3RyaW5nXXN0cmluZworCXMuQmluVG9TdHJpbmcgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGVjNGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28KQEAgLTAsMCArMSw4NzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImVycm9ydGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorKQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gU2V0dXAgbW9jayB0byBmYWlsIGF0IGEgY2VydGFpbiBwb3NpdGlvbi4gUmV0dXJuIHRydWUgaWYgcG9zaXRpb24gZXhpc3RzIG90aGVyd2lzZSBmYWxzZS4KK2Z1bmMgcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCAqTW9ja1RQcm90b2NvbCwgZmFpbEF0IGludCwgZmFpbFdpdGggZXJyb3IpIGJvb2wgeworCXZhciBlcnIgZXJyb3IgPSBuaWwKKworCWlmIGZhaWxBdCA9PSAwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA6PSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cnVjdCIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSkuUmV0dXJuKGVycikKKwlpZiBmYWlsQXQgPT0gMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJ1Y3RfYXJncyIpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInRoaW5nIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJVQ1QpLCBpbnQxNigxKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oIlRlc3RTdHJ1Y3QiKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJtIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5NQVApLCBpbnQxNigxKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWFwQmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIDApLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDUgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1hcEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDYgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigibCIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTElTVCksIGludDE2KDIpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDkgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVMaXN0QmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTGlzdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDExIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU0VUKSwgaW50MTYoMykpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDEyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEzIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU2V0QmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVNldEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkkzMiksIGludDE2KDQpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAxNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAxNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUkzMihpbnQzMigzKSkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMTggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDE4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDE5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjEgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjIgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyMiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyMyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDIzIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI0IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI1IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RydWN0IiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyNiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyNyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oInRlc3RTdHJ1Y3RfYXJncyIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjcgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMjggeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUlVDVCksIGludDE2KDApLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDI4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDI5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiVGVzdFN0cnVjdCIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMjkgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIm0iLCB0aHJpZnQuVFR5cGUodGhyaWZ0Lk1BUCksIGludDE2KDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDMwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMxIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNYXBCZWdpbigpLlJldHVybih0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzMiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWFwRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMzMgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMzQgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oImwiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LkxJU1QpLCBpbnQxNigyKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTGlzdEJlZ2luKCkuUmV0dXJuKHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgMCwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzNiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTGlzdEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM3IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM3IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDM4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TRVQpLCBpbnQxNigzKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAzOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAzOSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU2V0QmVnaW4oKS5SZXR1cm4odGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCAwLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDM5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTZXRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0MiB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiaSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoNCksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNDIgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNDMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMigzKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0MyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDUpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ1IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NiB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0NyB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0NyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0OCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQ4IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDQ5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA0OSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA1MCB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDUwIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJcmV0dXJuIGZhbHNlCit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQorCQl9CisKKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRyYW5zcG9ydEVycm9yIG9uIGZhaWwuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRSZXBvcnRUVHJhbnNwb3J0RXJyb3JzLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQorCQl9CisKKwkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCXQuRmF0YWwoIkV4cGVjdGVkIFRJTUVEX09VVCBlcnJvciIpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBDb21wcmVoZW5zaXZlIGNhbGwgYW5kIHJlcGx5IHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBFeHBlY3RpbmcgVFRQcm90b2NvbEVycm9ycyBvbiBmYWlsLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFByb3RvY29sRXJyb3JzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCisJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCisJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQlpZiAhcHJlcGFyZUNsaWVudENhbGxSZXBseShwcm90b2NvbCwgaSwgZXJyKSB7CisJCQlyZXR1cm4KKwkJfQorCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogY2FsbCBhbmQgcmVwbHkgd2l0aCBleGNlcHRpb24gd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIFNldHVwIG1vY2sgdG8gZmFpbCBhdCBhIGNlcnRhaW4gcG9zaXRpb24uIFJldHVybiB0cnVlIGlmIHBvc2l0aW9uIGV4aXN0cyBvdGhlcndpc2UgZmFsc2UuCitmdW5jIHByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sICpNb2NrVFByb3RvY29sLCBmYWlsQXQgaW50LCBmYWlsV2l0aCBlcnJvcikgYm9vbCB7CisJdmFyIGVyciBlcnJvciA9IG5pbAorCisJLy8gTm8gbmVlZCB0byB0ZXN0IGZhaWx1cmUgaW4gdGhpcyBibG9jaywgYmVjYXVzZSBpdCBpcyBjb3ZlcmVkIGluIG90aGVyIHRlc3QgY2FzZXMKKwlsYXN0IDo9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLkFmdGVyKGxhc3QpCisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLkFmdGVyKGxhc3QpCisKKwkvLyBSZWFkaW5nIHRoZSBleGNlcHRpb24sIG1pZ2h0IGZhaWwuCisJaWYgZmFpbEF0ID09IDAgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5FWENFUFRJT04sIGludDMyKDEpLCBlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gMSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJtZXNzYWdlIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSAyIHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDMgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cmluZygpLlJldHVybigidGVzdCIsIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA0IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCisJaWYgZmFpbEF0ID09IDQgeworCQlyZXR1cm4gdHJ1ZQorCX0KKwlpZiBmYWlsQXQgPT0gNSB7CisJCWVyciA9IGZhaWxXaXRoCisJfQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigidHlwZSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNSB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIodGhyaWZ0LlBST1RPQ09MX0VSUk9SKSwgZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA2IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDcgeworCQllcnIgPSBmYWlsV2l0aAorCX0KKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gNyB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA4IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJfIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVE9QKSwgaW50MTYoMiksIGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gOCB7CisJCXJldHVybiB0cnVlCisJfQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RFbmQoKS5SZXR1cm4oZXJyKS5BZnRlcihsYXN0KQorCWlmIGZhaWxBdCA9PSA5IHsKKwkJcmV0dXJuIHRydWUKKwl9CisJaWYgZmFpbEF0ID09IDEwIHsKKwkJZXJyID0gZmFpbFdpdGgKKwl9CisJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlRW5kKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlpZiBmYWlsQXQgPT0gMTAgeworCQlyZXR1cm4gdHJ1ZQorCX0KKworCXJldHVybiBmYWxzZQorfQorCisvLyBUZXN0Q2FzZTogY2FsbCBhbmQgcmVwbHkgd2l0aCBleGNlcHRpb24gd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb24odCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKworCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb25MZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCisJCWlmICF3aWxsQ29tcGxldGUgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIikKKwkJCX0KKwkJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LlRJTUVEX09VVCB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwkJCWlmICFvayB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuUFJPVE9DT0xfRVJST1IgeworCQkJCXQuRmF0YWwoIkV4cGVjdGVkIFBST1RPQ09MX0VSUk9SIGVycm9yIikKKwkJCX0KKwkJCWJyZWFrCisJCX0KKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2hMZWdlYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigyKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LkJBRF9TRVFVRU5DRV9JRCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIEJBRF9TRVFVRU5DRV9JRCBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInVua25vd24iLCB0aHJpZnQuUkVQTFksIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5XUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFdST05HX01FVEhPRF9OQU1FIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXRob2QgbmFtZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXRob2ROYW1lLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZUxlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidW5rbm93biIsIHRocmlmdC5SRVBMWSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5XUk9OR19NRVRIT0RfTkFNRSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFdST05HX01FVEhPRF9OQU1FIGVycm9yIikKKwl9Cit9CisKKy8vIFRlc3RDYXNlOiBXcm9uZyBtZXNzYWdlIHR5cGUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWVzc2FnZVR5cGUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LklOVkFMSURfVE1FU1NBR0VfVFlQRSwgaW50MzIoMSksIG5pbCksCisJKQorCisJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFdyb25nTWVzc2FnZVR5cGVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuSU5WQUxJRF9UTUVTU0FHRV9UWVBFLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCisJbW9ja0N0cmwuRmluaXNoKCkKKwlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBUQXBwbGljYXRpb25FeGNlcHRpb24iKQorCX0KKwlpZiBhcHBFcnIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiBlcnJvciIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvY29udGV4dC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzYTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28KQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJImNvbnRleHQiCispCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2VuY29kaW5nX2pzb25fdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL2VuY29kaW5nX2pzb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0NTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvZW5jb2RpbmdfanNvbl90ZXN0LmdvCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJlbmNvZGluZyIKKwkiZW5jb2RpbmcvanNvbiIKKwkidGVzdGluZyIKKwkidGhyaWZ0dGVzdCIKKykKKworZnVuYyBUZXN0RW51bUlzVGV4dE1hcnNoYWxsZXIodCAqdGVzdGluZy5UKSB7CisJb25lIDo9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUKKwl2YXIgdG0gZW5jb2RpbmcuVGV4dE1hcnNoYWxlciA9IG9uZQorCWIsIGVyciA6PSB0bS5NYXJzaGFsVGV4dCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGZyb20gTWFyc2hhbFRleHQ6ICVzIiwgZXJyKQorCX0KKwlpZiBzdHJpbmcoYikgIT0gb25lLlN0cmluZygpIHsKKwkJdC5FcnJvcmYoIk1hcnNoYWxUZXh0KCVzKSA9ICVzLCBleHBlY3RlZCA9ICVzIiwgb25lLCBiLCBvbmUpCisJfQorfQorCitmdW5jIFRlc3RFbnVtSXNUZXh0VW5tYXJzaGFsbGVyKHQgKnRlc3RpbmcuVCkgeworCXZhciB0bSBlbmNvZGluZy5UZXh0VW5tYXJzaGFsZXIgPSB0aHJpZnR0ZXN0Lk51bWJlcnpQdHIodGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykKKwllcnIgOj0gdG0uVW5tYXJzaGFsVGV4dChbXWJ5dGUoIlRXTyIpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIFVubWFyc2hhbFRleHQoVFdPKTogJXMiLCBlcnIpCisJfQorCWlmICoodG0uKCp0aHJpZnR0ZXN0Lk51bWJlcnopKSAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKKwkJdC5FcnJvcmYoIlVubWFyc2hhbFRleHQoVFdPKSA9ICVzIiwgdG0pCisJfQorCisJZXJyID0gdG0uVW5tYXJzaGFsVGV4dChbXWJ5dGUoIk5BTiIpKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiRXJyb3IgZnJvbSBVbm1hcnNoYWxUZXh0KE5BTikiKQorCX0KK30KKworZnVuYyBUZXN0SlNPTk1hcnNoYWxVbm1hcnNoYWwodCAqdGVzdGluZy5UKSB7CisJczEgOj0gdGhyaWZ0dGVzdC5TdHJ1Y3RCeworCQlBYTogJnRocmlmdHRlc3QuU3RydWN0QXtTOiAiQWEifSwKKwkJQWI6ICZ0aHJpZnR0ZXN0LlN0cnVjdEF7UzogIkFiIn0sCisJfQorCisJYiwgZXJyIDo9IGpzb24uTWFyc2hhbChzMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgZnJvbSBqc29uLk1hcnNoYWw6ICVzIiwgZXJyKQorCX0KKworCXMyIDo9IHRocmlmdHRlc3QuU3RydWN0Qnt9CisJZXJyID0ganNvbi5Vbm1hcnNoYWwoYiwgJnMyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBmcm9tIGpzb24uVW5tYXJzaGFsOiAlcyIsIGVycikKKwl9CisKKwlpZiAqczEuQWEgIT0gKnMyLkFhIHx8ICpzMS5BYiAhPSAqczIuQWIgeworCQl0LkxvZ2YoInMxID0gJSt2IiwgczEpCisJCXQuTG9nZigiczIgPSAlK3YiLCBzMikKKwkJdC5FcnJvcmYoImpzb246IFVubWFyc2hhbChNYXJzaGFsKHMpKSAhPSBzIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9nb3RhZ190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmYwNTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvZ290YWdfdGVzdC5nbwpAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiZ290YWd0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3REZWZhdWx0VGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlN0cmluZ1RoaW5nIikKKwlpZiAhb2sgfHwgZmllbGQuVGFnLkdldCgianNvbiIpICE9ICJzdHJpbmdfdGhpbmciIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBkZWZhdWx0IHRhZyB2YWx1ZSIpCisJfQorfQorCitmdW5jIFRlc3RDdXN0b21UYWcodCAqdGVzdGluZy5UKSB7CisJcyA6PSBnb3RhZ3Rlc3QuVGFnZ2Vke30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCWZpZWxkLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiSW50VGhpbmciKQorCWlmICFvayB8fCBmaWVsZC5UYWcuR2V0KCJqc29uIikgIT0gImludF90aGluZyxzdHJpbmciIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBjdXN0b20gdGFnIHZhbHVlIikKKwl9Cit9CisKK2Z1bmMgVGVzdE9wdGlvbmFsVGFnKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gZ290YWd0ZXN0LlRhZ2dlZHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlmaWVsZCwgb2sgOj0gc3QuRmllbGRCeU5hbWUoIk9wdGlvbmFsSW50VGhpbmciKQorCWlmICFvayB8fCBmaWVsZC5UYWcuR2V0KCJqc29uIikgIT0gIm9wdGlvbmFsX2ludF90aGluZyxvbWl0ZW1wdHkiIHsKKwkJdC5FcnJvcigiVW5leHBlY3RlZCBkZWZhdWx0IHRhZyB2YWx1ZSBmb3Igb3B0aW9uYWwgZmllbGQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2lnbm9yZWluaXRpYWxpc21zX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZDVmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9pZ25vcmVpbml0aWFsaXNtc190ZXN0LmdvCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJpZ25vcmVpbml0aWFsaXNtc3Rlc3QiCisJInJlZmxlY3QiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdElnbm9yZUluaXRpYWxpc21zRmxhZ0lzSG9ub3VyZWQodCAqdGVzdGluZy5UKSB7CisJcyA6PSBpZ25vcmVpbml0aWFsaXNtc3Rlc3QuSWdub3JlSW5pdGlhbGlzbXNUZXN0e30KKwlzdCA6PSByZWZsZWN0LlR5cGVPZihzKQorCV8sIG9rIDo9IHN0LkZpZWxkQnlOYW1lKCJJZCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiSWQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9CisJXywgb2sgPSBzdC5GaWVsZEJ5TmFtZSgiTXlJZCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTXlJZCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJOdW1DcHUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk51bUNwdSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJOdW1HcHUiKQorCWlmICFvayB7CisJCXQuRXJyb3IoIk51bUdwdSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KKwlfLCBvayA9IHN0LkZpZWxkQnlOYW1lKCJNeV9JRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiTXlfSUQgYXR0cmlidXRlIGlzIG1pc3NpbmchIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9pbml0aWFsaXNtc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDkyM2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvaW5pdGlhbGlzbXNfdGVzdC5nbwpAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiaW5pdGlhbGlzbXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUaGF0Q29tbW9uSW5pdGlhbGlzbXNBcmVGaXhlZCh0ICp0ZXN0aW5nLlQpIHsKKwlzIDo9IGluaXRpYWxpc21zdGVzdC5Jbml0aWFsaXNtc1Rlc3R7fQorCXN0IDo9IHJlZmxlY3QuVHlwZU9mKHMpCisJXywgb2sgOj0gc3QuRmllbGRCeU5hbWUoIlVzZXJJRCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiVXNlcklEIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIlNlcnZlclVSTCIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiU2VydmVyVVJMIGF0dHJpYnV0ZSBpcyBtaXNzaW5nISIpCisJfQorCV8sIG9rID0gc3QuRmllbGRCeU5hbWUoIklEIikKKwlpZiAhb2sgeworCQl0LkVycm9yKCJJRCBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYWM2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkibXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QiCisJIm5ldCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCitmdW5jIEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkgbmV0LkFkZHIgeworCWlmIGwsIGVyciA6PSBuZXQuTGlzdGVuKCJ0Y3AiLCAiMTI3LjAuMC4xOjAiKTsgZXJyICE9IG5pbCB7CisJCXBhbmljKCJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorCX0gZWxzZSB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCQlyZXR1cm4gbC5BZGRyKCkKKwl9Cit9CisKK3R5cGUgRmlyc3RJbXBsIHN0cnVjdHt9CisKK2Z1bmMgKGYgKkZpcnN0SW1wbCkgUmV0dXJuT25lKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gMSwgbmlsCit9CisKK3R5cGUgU2Vjb25kSW1wbCBzdHJ1Y3R7fQorCitmdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oY3R4IGNvbnRleHQuQ29udGV4dCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworCXJldHVybiAyLCBuaWwKK30KKworZnVuYyBjcmVhdGVUcmFuc3BvcnQoYWRkciBuZXQuQWRkcikgKHRocmlmdC5UVHJhbnNwb3J0LCBlcnJvcikgeworCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiB0cmFuc3BvcnQsIG5pbAorfQorCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sRmlyc3QodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiRmlyc3RTZXJ2aWNlIikKKworCWNsaWVudCA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuT25lKGRlZmF1bHRDdHgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGZpcnN0IHNlcnZlcjoiLCBlcnIpCisJfSBlbHNlIGlmIHJldCAhPSAxIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKKwl9Cit9CisKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xTZWNvbmQodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiU2Vjb25kU2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgc2Vjb25kIHNlcnZlcjoiLCBlcnIpCisJfSBlbHNlIGlmIHJldCAhPSAyIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKKwl9Cit9CisKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKKwkvL2V4cGVjdCBlcnJvciBzaW5jZSBkZWZhdWx0IHByb2Nlc3NvciBpcyBub3QgcmVnaXN0ZXJlZAorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RpbmcgZXJyb3IiKQorCX0KKworCS8vcmVnaXN0ZXIgZGVmYXVsdCBwcm9jZXNzb3IgYW5kIGNhbGwgYWdhaW4KKwlwcm9jZXNzb3IuUmVnaXN0ZXJEZWZhdWx0KG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZFByb2Nlc3NvcigmU2Vjb25kSW1wbHt9KSkKKwl0cmFuc3BvcnQsIGVyciA9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgbGVnYWN5IHNlcnZlcjoiLCBlcnIpCisJfQorCWlmIHJldCAhPSAyIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCByZXN1bHQgZnJvbSBzZXJ2ZXI6ICIsIHJldCkKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9uYW1lc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGI2M2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvbmFtZXNfdGVzdC5nbwpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkibmFtZXN0ZXN0IgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RUaGF0QXR0cmlidXRlTmFtZVN1YnN0aXR1aW9uRG9lc05vdE9jY3VyKHQgKnRlc3RpbmcuVCkgeworCXMgOj0gbmFtZXN0ZXN0Lk5hbWVzVGVzdHt9CisJc3QgOj0gcmVmbGVjdC5UeXBlT2YocykKKwlfLCBvayA6PSBzdC5GaWVsZEJ5TmFtZSgiVHlwZSIpCisJaWYgIW9rIHsKKwkJdC5FcnJvcigiVHlwZSBhdHRyaWJ1dGUgaXMgbWlzc2luZyEiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQwYmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbXQiCisJIm5ldCIKKwkib25ld2F5dGVzdCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCitmdW5jIGZpbmRQb3J0KCkgbmV0LkFkZHIgeworCWlmIGwsIGVyciA6PSBuZXQuTGlzdGVuKCJ0Y3AiLCAiMTI3LjAuMC4xOjAiKTsgZXJyICE9IG5pbCB7CisJCXBhbmljKCJDb3VsZCBub3QgZmluZCBhdmFpbGFibGUgc2VydmVyIHBvcnQiKQorCX0gZWxzZSB7CisJCWRlZmVyIGwuQ2xvc2UoKQorCQlyZXR1cm4gbC5BZGRyKCkKKwl9Cit9CisKK3R5cGUgaW1wbCBzdHJ1Y3R7fQorCitmdW5jIChpICppbXBsKSBIaShjdHggY29udGV4dC5Db250ZXh0LCBpbiBpbnQ2NCwgcyBzdHJpbmcpIChlcnIgZXJyb3IpICAgICAgICB7IGZtdC5QcmludGxuKCJIaSEiKTsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVtcHR5ZnVuYyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVjaG9JbnQoY3R4IGNvbnRleHQuQ29udGV4dCwgcGFyYW0gaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsgcmV0dXJuIHBhcmFtLCBuaWwgfQorCitjb25zdCBUSU1FT1VUID0gdGltZS5TZWNvbmQKKwordmFyIGFkZHIgbmV0LkFkZHIKK3ZhciBzZXJ2ZXIgKnRocmlmdC5UU2ltcGxlU2VydmVyCit2YXIgY2xpZW50ICpvbmV3YXl0ZXN0Lk9uZVdheUNsaWVudAorCitmdW5jIFRlc3RJbml0T25ld2F5KHQgKnRlc3RpbmcuVCkgeworCXZhciBlcnIgZXJyb3IKKwlhZGRyID0gZmluZFBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXByb2Nlc3NvciA6PSBvbmV3YXl0ZXN0Lk5ld09uZVdheVByb2Nlc3NvcigmaW1wbHt9KQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKKworCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCit9CisKK2Z1bmMgVGVzdEluaXRPbmV3YXlDbGllbnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50ID0gb25ld2F5dGVzdC5OZXdPbmVXYXlDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCWVyciA6PSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RDYWxsT25ld2F5U2VydmVyKHQgKnRlc3RpbmcuVCkgeworCS8vY2FsbCBvbmV3YXkgZnVuY3Rpb24KKwllcnIgOj0gY2xpZW50LkhpKGRlZmF1bHRDdHgsIDEsICIiKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yOiAiLCBlcnIpCisJfQorCS8vVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBwcm90b2NvbCBwcm9ibGVtcyB3aXRoIHNpbmdsZSBvbmV3YXkgY2FsbCBzbyB3ZSBjYWxsIGl0IHNlY29uZCB0aW1lCisJaSwgZXJyIDo9IGNsaWVudC5FY2hvSW50KGRlZmF1bHRDdHgsIDQyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yOiAiLCBlcnIpCisJfQorCWlmIGkgIT0gNDIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJldHVybmVkIHZhbHVlOiAiLCBpKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvb3B0aW9uYWxfZmllbGRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhZDY2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL29wdGlvbmFsX2ZpZWxkc190ZXN0LmdvCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJZ29tb2NrICJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKKwkib3B0aW9uYWxmaWVsZHN0ZXN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCispCisKK2Z1bmMgVGVzdElzU2V0UmV0dXJuRmFsc2VPbkNyZWF0aW9uKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJaWYgYW8uSXNTZXRTKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgUyBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEkoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBJIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRTMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIFMyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0STIoKSB7CisJCXQuRXJyb3JmKCJPcHRpb25hbCBmaWVsZCBJMiBpcyBzZXQgb24gaW5pdGlhbGl6YXRpb24iKQorCX0KKwlpZiBhby5Jc1NldEIyKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQjIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRBYSgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEFhIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TCgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEwgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRMMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEwyIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0TSgpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIE0gaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9CisJaWYgYW8uSXNTZXRNMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIE0yIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QmluKCkgeworCQl0LkVycm9yZigiT3B0aW9uYWwgZmllbGQgQmluIGlzIHNldCBvbiBpbml0aWFsaXphdGlvbiIpCisJfQorCWlmIGFvLklzU2V0QmluMigpIHsKKwkJdC5FcnJvcmYoIk9wdGlvbmFsIGZpZWxkIEJpbjIgaXMgc2V0IG9uIGluaXRpYWxpemF0aW9uIikKKwl9Cit9CisKK2Z1bmMgVGVzdERlZmF1bHRWYWx1ZXNPbkNyZWF0aW9uKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJaWYgYW8uR2V0UygpICE9ICJERUZBVUxUIiB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBTIiwgYW8uR2V0UygpKQorCX0KKwlpZiBhby5HZXRJKCkgIT0gNDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgSSIsIGFvLkdldEkoKSkKKwl9CisJaWYgYW8uR2V0QigpICE9IGZhbHNlIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIiLCBhby5HZXRCKCkpCisJfQorCWlmIGFvLkdldFMyKCkgIT0gIiIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgUzIiLCBhby5HZXRTMigpKQorCX0KKwlpZiBhby5HZXRJMigpICE9IDAgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgSTIiLCBhby5HZXRJMigpKQorCX0KKwlpZiBhby5HZXRCMigpICE9IGZhbHNlIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIyIiwgYW8uR2V0QjIoKSkKKwl9CisJaWYgbCA6PSBhby5HZXRMKCk7IGxlbihsKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwiLCBsKQorCX0KKwlpZiBsIDo9IGFvLkdldEwyKCk7IGxlbihsKSAhPSAyIHx8IGxbMF0gIT0gMSB8fCBsWzFdICE9IDIgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBkZWZhdWx0IHZhbHVlICUjdiBmb3IgZmllbGQgTDIiLCBsKQorCX0KKwkvL0ZJWE1FOiBzaG91bGQgd2UgcmV0dXJuIGVtcHR5IG1hcCBoZXJlPworCWlmIG0gOj0gYW8uR2V0TSgpOyBtICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBNIiwgbSkKKwl9CisJaWYgbSA6PSBhby5HZXRNMigpOyBsZW4obSkgIT0gMiB8fCBtWzFdICE9IDIgfHwgbVszXSAhPSA0IHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZGVmYXVsdCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0yIiwgbSkKKwl9CisJaWYgYnYgOj0gYW8uR2V0QmluKCk7IGJ2ICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4iLCBidikKKwl9CisJaWYgYnYgOj0gYW8uR2V0QmluMigpOyAhYnl0ZXMuRXF1YWwoYnYsIFtdYnl0ZSgiYXNkZiIpKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGRlZmF1bHQgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4yIiwgYnYpCisJfQorfQorCitmdW5jIFRlc3RJbml0aWFsVmFsdWVzT25DcmVhdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWlmIGFvLlMgIT0gIkRFRkFVTFQiIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIFMiLCBhby5TKQorCX0KKwlpZiBhby5JICE9IDQyIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkiLCBhby5JKQorCX0KKwlpZiBhby5CICE9IGZhbHNlIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEIiLCBhby5CKQorCX0KKwlpZiBhby5TMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgUzIiLCBhby5TMikKKwl9CisJaWYgYW8uSTIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEkyIiwgYW8uSTIpCisJfQorCWlmIGFvLkIyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCMiIsIGFvLkIyKQorCX0KKwlpZiBhby5MICE9IG5pbCB8fCBsZW4oYW8uTCkgIT0gMCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBMIiwgYW8uTCkKKwl9CisJaWYgYW8uTDIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEwyIiwgYW8uTDIpCisJfQorCWlmIGFvLk0gIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIE0iLCBhby5NKQorCX0KKwlpZiBhby5NMiAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBpbml0aWFsIHZhbHVlICUjdiBmb3IgZmllbGQgTTIiLCBhby5NMikKKwl9CisJaWYgYW8uQmluICE9IG5pbCB8fCBsZW4oYW8uQmluKSAhPSAwIHsKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgaW5pdGlhbCB2YWx1ZSAlI3YgZm9yIGZpZWxkIEJpbiIsIGFvLkJpbikKKwl9CisJaWYgIWJ5dGVzLkVxdWFsKGFvLkJpbjIsIFtdYnl0ZSgiYXNkZiIpKSB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGluaXRpYWwgdmFsdWUgJSN2IGZvciBmaWVsZCBCaW4yIiwgYW8uQmluMikKKwl9Cit9CisKK2Z1bmMgVGVzdElzU2V0UmV0dXJuVHJ1ZUFmdGVyVXBkYXRlKHQgKnRlc3RpbmcuVCkgeworCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uUyA9ICJzb21ldmFsdWUiCisJYW8uSSA9IDEyMworCWFvLkIgPSB0cnVlCisJYW8uQWEgPSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3U3RydWN0QSgpCisJaWYgIWFvLklzU2V0UygpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIFMgc2hvdWxkIGJlIHNldCIpCisJfQorCWlmICFhby5Jc1NldEkoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBJIHNob3VsZCBiZSBzZXQiKQorCX0KKwlpZiAhYW8uSXNTZXRCKCkgeworCQl0LkVycm9yZigiRmllbGQgQiBzaG91bGQgYmUgc2V0IikKKwl9CisJaWYgIWFvLklzU2V0QWEoKSB7CisJCXQuRXJyb3JmKCJGaWVsZCBhYSBzaG91bGQgYmUgc2V0IikKKwl9Cit9CisKK2Z1bmMgVGVzdExpc3ROb3RFbXB0eSh0ICp0ZXN0aW5nLlQpIHsKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkwgPSBbXWludDY0ezEsIDIsIDN9CisJaWYgIWFvLklzU2V0TCgpIHsKKwkJdC5FcnJvcmYoIkZpZWxkIEwgc2hvdWxkIGJlIHNldCIpCisJfQorfQorCisvL01ha2Ugc3VyZSB0aGF0IG9wdGlvbmFsIGZpZWxkcyBhcmUgbm90IGJlaW5nIHNlcmlhbGl6ZWQKK2Z1bmMgVGVzdE5vT3B0aW9uYWxVbnNldEZpZWxkc09uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE5vU2V0VG9EZWZhdWx0RmllbGRzT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5JID0gNDIKKwlhby5Xcml0ZShwcm90bykKK30KKworLy9NYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBmaWVsZCBpcyBiZWluZyBzZXJpYWxpemVkIHdoZW4gc2V0IHRvIG5vbi1kZWZhdWx0CitmdW5jIFRlc3RPbmVJU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImkiLCB0aHJpZnQuVFR5cGUodGhyaWZ0Lkk2NCksIGludDE2KDIpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVJNjQoaW50NjQoMTIzKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKS5SZXR1cm4obmlsKSwKKwkpCisJYW8gOj0gb3B0aW9uYWxmaWVsZHN0ZXN0Lk5ld0FsbE9wdGlvbmFsKCkKKwlhby5JID0gMTIzCisJYW8uV3JpdGUocHJvdG8pCit9CisKK2Z1bmMgVGVzdE9uZUxTZXRGaWVsZE9uV2lyZSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWRlZmVyIG1vY2tDdHJsLkZpbmlzaCgpCisJcHJvdG8gOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigiYWxsX29wdGlvbmFsIikuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigibCIsIHRocmlmdC5UVHlwZSh0aHJpZnQuTElTVCksIGludDE2KDkpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVMaXN0QmVnaW4odGhyaWZ0LlRUeXBlKHRocmlmdC5JNjQpLCAyKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVJNjQoaW50NjQoMSkpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUk2NChpbnQ2NCgyKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlTGlzdEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCWFvIDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdBbGxPcHRpb25hbCgpCisJYW8uTCA9IFtdaW50NjR7MSwgMn0KKwlhby5Xcml0ZShwcm90bykKK30KKworZnVuYyBUZXN0T25lQmluU2V0RmllbGRPbldpcmUodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlkZWZlciBtb2NrQ3RybC5GaW5pc2goKQorCXByb3RvIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oImFsbF9vcHRpb25hbCIpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oImJpbiIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMTMpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVCaW5hcnkoW11ieXRlKCJzb21lYnl0ZXN0cmluZyIpKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkJpbiA9IFtdYnl0ZSgic29tZWJ5dGVzdHJpbmciKQorCWFvLldyaXRlKHByb3RvKQorfQorCitmdW5jIFRlc3RPbmVFbXB0eUJpblNldEZpZWxkT25XaXJlKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJZGVmZXIgbW9ja0N0cmwuRmluaXNoKCkKKwlwcm90byA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJhbGxfb3B0aW9uYWwiKS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJiaW4iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEzKSkuUmV0dXJuKG5pbCksCisJCXByb3RvLkVYUEVDVCgpLldyaXRlQmluYXJ5KFtdYnl0ZXt9KS5SZXR1cm4obmlsKSwKKwkJcHJvdG8uRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLlJldHVybihuaWwpLAorCQlwcm90by5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKwlhbyA6PSBvcHRpb25hbGZpZWxkc3Rlc3QuTmV3QWxsT3B0aW9uYWwoKQorCWFvLkJpbiA9IFtdYnl0ZXt9CisJYW8uV3JpdGUocHJvdG8pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ3YTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbwpAQCAtMCwwICsxLDUxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBNb2NrR2VuLiBETyBOT1QgRURJVCEKKy8vIFNvdXJjZTogdGhyaWZ0IChpbnRlcmZhY2VzOiBUUHJvdG9jb2wpCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwl0aHJpZnQgInRocmlmdCIKKworCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCispCisKKy8vIE1vY2sgb2YgVFByb3RvY29sIGludGVyZmFjZQordHlwZSBNb2NrVFByb3RvY29sIHN0cnVjdCB7CisJY3RybCAgICAgKmdvbW9jay5Db250cm9sbGVyCisJcmVjb3JkZXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIKK30KKworLy8gUmVjb3JkZXIgZm9yIE1vY2tUUHJvdG9jb2wgKG5vdCBleHBvcnRlZCkKK3R5cGUgX01vY2tUUHJvdG9jb2xSZWNvcmRlciBzdHJ1Y3QgeworCW1vY2sgKk1vY2tUUHJvdG9jb2wKK30KKworZnVuYyBOZXdNb2NrVFByb3RvY29sKGN0cmwgKmdvbW9jay5Db250cm9sbGVyKSAqTW9ja1RQcm90b2NvbCB7CisJbW9jayA6PSAmTW9ja1RQcm90b2NvbHtjdHJsOiBjdHJsfQorCW1vY2sucmVjb3JkZXIgPSAmX01vY2tUUHJvdG9jb2xSZWNvcmRlcnttb2NrfQorCXJldHVybiBtb2NrCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBFWFBFQ1QoKSAqX01vY2tUUHJvdG9jb2xSZWNvcmRlciB7CisJcmV0dXJuIF9tLnJlY29yZGVyCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIkZsdXNoIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJGbHVzaCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEJpbmFyeSIpCisJcmV0MCwgXyA6PSByZXRbMF0uKFtdYnl0ZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkQmluYXJ5KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEJpbmFyeSIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkQm9vbCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGJvb2wpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEJvb2woKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkQm9vbCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkQnl0ZSgpIChpbnQ4LCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkQnl0ZSIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDgpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEJ5dGUoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkQnl0ZSIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkRG91YmxlKCkgKGZsb2F0NjQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWREb3VibGUiKQorCXJldDAsIF8gOj0gcmV0WzBdLihmbG9hdDY0KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWREb3VibGUoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkRG91YmxlIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgdGhyaWZ0LlRUeXBlLCBpbnQxNiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEZpZWxkQmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLihzdHJpbmcpCisJcmV0MSwgXyA6PSByZXRbMV0uKHRocmlmdC5UVHlwZSkKKwlyZXQyLCBfIDo9IHJldFsyXS4oaW50MTYpCisJcmV0MywgXyA6PSByZXRbM10uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyLCByZXQzCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEZpZWxkQmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkRmllbGRCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRGaWVsZEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEZpZWxkRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEZpZWxkRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRJMTYiKQorCXJldDAsIF8gOj0gcmV0WzBdLihpbnQxNikKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkSTE2KCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZEkxNiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkSTMyKCkgKGludDMyLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkSTMyIikKKwlyZXQwLCBfIDo9IHJldFswXS4oaW50MzIpCisJcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZEkzMigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRJMzIiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZEk2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZEk2NCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGludDY0KQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRJNjQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkSTY0IikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAodGhyaWZ0LlRUeXBlLCBpbnQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRMaXN0QmVnaW4iKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFR5cGUpCisJcmV0MSwgXyA6PSByZXRbMV0uKGludCkKKwlyZXQyLCBfIDo9IHJldFsyXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEsIHJldDIKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTGlzdEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZExpc3RCZWdpbiIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZExpc3RFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRMaXN0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZExpc3RFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKHRocmlmdC5UVHlwZSwgdGhyaWZ0LlRUeXBlLCBpbnQsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNYXBCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdC5UVHlwZSkKKwlyZXQxLCBfIDo9IHJldFsxXS4odGhyaWZ0LlRUeXBlKQorCXJldDIsIF8gOj0gcmV0WzJdLihpbnQpCisJcmV0MywgXyA6PSByZXRbM10uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyLCByZXQzCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1hcEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZE1hcEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNYXBFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRNYXBFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkTWFwRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAoc3RyaW5nLCB0aHJpZnQuVE1lc3NhZ2VUeXBlLCBpbnQzMiwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZE1lc3NhZ2VCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4odGhyaWZ0LlRNZXNzYWdlVHlwZSkKKwlyZXQyLCBfIDo9IHJldFsyXS4oaW50MzIpCisJcmV0MywgXyA6PSByZXRbM10uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyLCByZXQzCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZE1lc3NhZ2VCZWdpbigpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNZXNzYWdlQmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRNZXNzYWdlRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkTWVzc2FnZUVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRNZXNzYWdlRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpICh0aHJpZnQuVFR5cGUsIGludCwgZXJyb3IpIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFNldEJlZ2luIikKKwlyZXQwLCBfIDo9IHJldFswXS4odGhyaWZ0LlRUeXBlKQorCXJldDEsIF8gOj0gcmV0WzFdLihpbnQpCisJcmV0MiwgXyA6PSByZXRbMl0uKGVycm9yKQorCXJldHVybiByZXQwLCByZXQxLCByZXQyCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFNldEJlZ2luKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiUmVhZFNldEJlZ2luIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTZXRFbmQiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTZXRFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU2V0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAoc3RyaW5nLCBlcnJvcikgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJSZWFkU3RyaW5nIikKKwlyZXQwLCBfIDo9IHJldFswXS4oc3RyaW5nKQorCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKKwlyZXR1cm4gcmV0MCwgcmV0MQorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFJlYWRTdHJpbmcoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU3RyaW5nIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChzdHJpbmcsIGVycm9yKSB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlJlYWRTdHJ1Y3RCZWdpbiIpCisJcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKKwlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCisJcmV0dXJuIHJldDAsIHJldDEKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBSZWFkU3RydWN0QmVnaW4oKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJSZWFkU3RydWN0QmVnaW4iKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiUmVhZFN0cnVjdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgUmVhZFN0cnVjdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlJlYWRTdHJ1Y3RFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgU2tpcChfcGFyYW0wIHRocmlmdC5UVHlwZSkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJTa2lwIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBTa2lwKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlNraXAiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgVHJhbnNwb3J0KCkgdGhyaWZ0LlRUcmFuc3BvcnQgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUcmFuc3BvcnQiKQorCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnQuVFRyYW5zcG9ydCkKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFRyYW5zcG9ydCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRyYW5zcG9ydCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUJpbmFyeShfcGFyYW0wIFtdYnl0ZSkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUJpbmFyeSIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVCaW5hcnkoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVCaW5hcnkiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCb29sKF9wYXJhbTAgYm9vbCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUJvb2wiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlQm9vbChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUJvb2wiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVCeXRlKF9wYXJhbTAgaW50OCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUJ5dGUiLCBfcGFyYW0wKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlQnl0ZShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUJ5dGUiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVEb3VibGUoX3BhcmFtMCBmbG9hdDY0KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRG91YmxlIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZURvdWJsZShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZURvdWJsZSIsIGFyZzApCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4oX3BhcmFtMCBzdHJpbmcsIF9wYXJhbTEgdGhyaWZ0LlRUeXBlLCBfcGFyYW0yIGludDE2KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlRmllbGRCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEsIF9wYXJhbTIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVGaWVsZEJlZ2luKGFyZzAsIGFyZzEsIGFyZzIgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlRmllbGRCZWdpbiIsIGFyZzAsIGFyZzEsIGFyZzIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUZpZWxkRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUZpZWxkRW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVGaWVsZEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVGaWVsZFN0b3AiKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlRmllbGRTdG9wKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVGaWVsZFN0b3AiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVJMTYoX3BhcmFtMCBpbnQxNikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUkxNiIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVJMTYoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVJMTYiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVJMzIoX3BhcmFtMCBpbnQzMikgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUkzMiIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVJMzIoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVJMzIiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVJNjQoX3BhcmFtMCBpbnQ2NCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZUk2NCIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVJNjQoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVJNjQiLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oX3BhcmFtMCB0aHJpZnQuVFR5cGUsIF9wYXJhbTEgaW50KSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTGlzdEJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZUxpc3RCZWdpbihhcmcwLCBhcmcxIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZUxpc3RCZWdpbiIsIGFyZzAsIGFyZzEpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTGlzdEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVMaXN0RW5kKCkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVMaXN0RW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oX3BhcmFtMCB0aHJpZnQuVFR5cGUsIF9wYXJhbTEgdGhyaWZ0LlRUeXBlLCBfcGFyYW0yIGludCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZU1hcEJlZ2luIiwgX3BhcmFtMCwgX3BhcmFtMSwgX3BhcmFtMikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1hcEJlZ2luKGFyZzAsIGFyZzEsIGFyZzIgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWFwQmVnaW4iLCBhcmcwLCBhcmcxLCBhcmcyKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlTWFwRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1hcEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWFwRW5kIikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKF9wYXJhbTAgc3RyaW5nLCBfcGFyYW0xIHRocmlmdC5UTWVzc2FnZVR5cGUsIF9wYXJhbTIgaW50MzIpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNZXNzYWdlQmVnaW4iLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yKQorCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKKwlyZXR1cm4gcmV0MAorfQorCitmdW5jIChfbXIgKl9Nb2NrVFByb3RvY29sUmVjb3JkZXIpIFdyaXRlTWVzc2FnZUJlZ2luKGFyZzAsIGFyZzEsIGFyZzIgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlTWVzc2FnZUJlZ2luIiwgYXJnMCwgYXJnMSwgYXJnMikKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVNZXNzYWdlRW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZU1lc3NhZ2VFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZU1lc3NhZ2VFbmQiKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihfcGFyYW0wIHRocmlmdC5UVHlwZSwgX3BhcmFtMSBpbnQpIGVycm9yIHsKKwlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiV3JpdGVTZXRCZWdpbiIsIF9wYXJhbTAsIF9wYXJhbTEpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTZXRCZWdpbihhcmcwLCBhcmcxIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVNldEJlZ2luIiwgYXJnMCwgYXJnMSkKK30KKworZnVuYyAoX20gKk1vY2tUUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVNldEVuZCIpCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTZXRFbmQoKSAqZ29tb2NrLkNhbGwgeworCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJXcml0ZVNldEVuZCIpCit9CisKK2Z1bmMgKF9tICpNb2NrVFByb3RvY29sKSBXcml0ZVN0cmluZyhfcGFyYW0wIHN0cmluZykgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVN0cmluZyIsIF9wYXJhbTApCisJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQorCXJldHVybiByZXQwCit9CisKK2Z1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgV3JpdGVTdHJpbmcoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKKwlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiV3JpdGVTdHJpbmciLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihfcGFyYW0wIHN0cmluZykgZXJyb3IgeworCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJXcml0ZVN0cnVjdEJlZ2luIiwgX3BhcmFtMCkKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVN0cnVjdEJlZ2luKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU3RydWN0QmVnaW4iLCBhcmcwKQorfQorCitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIldyaXRlU3RydWN0RW5kIikKKwlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCisJcmV0dXJuIHJldDAKK30KKworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBXcml0ZVN0cnVjdEVuZCgpICpnb21vY2suQ2FsbCB7CisJcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIldyaXRlU3RydWN0RW5kIikKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmZDljMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ0aHJpZnQiCisJInRocmlmdHRlc3QiCispCisKK2Z1bmMgUnVuU29ja2V0VGVzdFN1aXRlKHQgKnRlc3RpbmcuVCwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LAorCXRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5KSB7CisJLy8gc2VydmVyCisJdmFyIGVyciBlcnJvcgorCWFkZHIgPSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJcHJvY2Vzc29yIDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdFByb2Nlc3NvcihOZXdUaHJpZnRUZXN0SGFuZGxlcigpKQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCXNlcnZlci5MaXN0ZW4oKQorCisJZ28gc2VydmVyLlNlcnZlKCkKKworCS8vIGNsaWVudAorCXZhciB0cmFuc3BvcnQgdGhyaWZ0LlRUcmFuc3BvcnQgPSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCwgZXJyID0gdHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnNwb3J0KQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXRocmlmdFRlc3RDbGllbnQgOj0gdGhyaWZ0dGVzdC5OZXdUaHJpZnRUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwllcnIgPSB0cmFuc3BvcnQuT3BlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBvcGVuIGNsaWVudCBzb2NrZXQiLCBlcnIpCisJfQorCisJZHJpdmVyIDo9IE5ld1RocmlmdFRlc3REcml2ZXIodCwgdGhyaWZ0VGVzdENsaWVudCkKKwlkcml2ZXIuU3RhcnQoKQorfQorCisvLyBSdW4gdGVzdCBzdWl0ZSB1c2luZyBUSlNPTlByb3RvY29sCitmdW5jIFRlc3RUSlNPTlByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRCaW5hcnlQcm90b2NvbAorZnVuYyBUZXN0VEJpbmFyeVByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKKwkJdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkpCisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAorCQl0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4OTEyKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCXRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkpCit9CisKKy8vIFJ1biB0ZXN0IHN1aXRlIHVzaW5nIFRDb21wYWN0QmluYXJ5UHJvdG9jb2wKK2Z1bmMgVGVzdFRDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUnVuU29ja2V0VGVzdFN1aXRlKHQsCisJCXRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLAorCQl0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSkKKwlSdW5Tb2NrZXRUZXN0U3VpdGUodCwKKwkJdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCksCisJCXRocmlmdC5OZXdUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KDg5MTIpKQorCVJ1blNvY2tldFRlc3RTdWl0ZSh0LAorCQl0aHJpZnQuTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKwkJdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhNDE0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3JlcXVpcmVkX2ZpZWxkc190ZXN0LmdvCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCisJIm9wdGlvbmFsZmllbGRzdGVzdCIKKwkicmVxdWlyZWRmaWVsZHRlc3QiCisJInRlc3RpbmciCisJInRocmlmdCIKKykKKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9TdWNlY3NzV2hlblNldCh0ICp0ZXN0aW5nLlQpIHsKKwkvLyBjcmVhdGUgYSBuZXcgUmVxdWlyZWRGaWVsZCBpbnN0YW5jZSB3aXRoIHRoZSByZXF1aXJlZCBmaWVsZCBzZXQKKwlzb3VyY2UgOj0gJnJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGR7TmFtZTogInRoaXMgaXMgYSB0ZXN0In0KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJZCA6PSB0aHJpZnQuTmV3VERlc2VyaWFsaXplcigpCisJZXJyID0gZC5SZWFkKCZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke30sIHNvdXJjZURhdGEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJEaWQgbm90IGV4cGVjdCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSB0aGUgcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZDogJXYiLCBlcnIpCisJfQorfQorCitmdW5jIFRlc3RSZXF1aXJlZEZpZWxkX0Vycm9yV2hlbk1pc3NpbmcodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IE90aGVyVGhpbmcgaW5zdGFuY2UsIHdpdGhvdXQgc2V0dGluZyB0aGUgcmVxdWlyZWQgZmllbGQKKwlzb3VyY2UgOj0gJnJlcXVpcmVkZmllbGR0ZXN0Lk90aGVyVGhpbmd7fQorCXNvdXJjZURhdGEsIGVyciA6PSB0aHJpZnQuTmV3VFNlcmlhbGl6ZXIoKS5Xcml0ZShjb250ZXh0LkJhY2tncm91bmQoKSwgc291cmNlKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiZmFpbGVkIHRvIHNlcmlhbGl6ZSAlVDogJXYiLCBzb3VyY2UsIGVycikKKwl9CisKKwkvLyBhdHRlbXB0IHRvIGRlc2VyaWFsaXplIGludG8gYSBkaWZmZXJlbnQgdHlwZSAod2hpY2ggc2hvdWxkIGZhaWwpCisJZCA6PSB0aHJpZnQuTmV3VERlc2VyaWFsaXplcigpCisJZXJyID0gZC5SZWFkKCZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke30sIHNvdXJjZURhdGEpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIGRlc2VyaWFsaXplIGFuIG9iamVjdCB3aGljaCBpcyBtaXNzaW5nIGEgcmVxdWlyZWQgZmllbGQiKQorCX0KK30KKworZnVuYyBUZXN0U3RydWN0UmVhZFJlcXVpcmVkRmllbGRzKHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwl0ZXN0U3RydWN0IDo9IG9wdGlvbmFsZmllbGRzdGVzdC5OZXdTdHJ1Y3RDKCkKKworCS8vIE5vbmUgb2YgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEJlZ2luKCkuUmV0dXJuKCJTdHJ1Y3RDIiwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA6PSB0ZXN0U3RydWN0LlJlYWQocHJvdG9jb2wpCisJbW9ja0N0cmwuRmluaXNoKCkKKwltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIHJlYWQgdG8gZmFpbCIpCisJfQorCWVycjIsIG9rIDo9IGVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKworCS8vIE9uZSBvZiB0aGUgcmVxdWlyZWQgZmllbGRzIGlzIHNldAorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0QmVnaW4oKS5SZXR1cm4oIlN0cnVjdEMiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiSSIsIHRocmlmdC5UVHlwZSh0aHJpZnQuSTMyKSwgaW50MTYoMiksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRJMzIoKS5SZXR1cm4oaW50MzIoMSksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEVuZCgpLlJldHVybihuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRCZWdpbigpLlJldHVybigiXyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RPUCksIGludDE2KDEpLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkU3RydWN0RW5kKCkuUmV0dXJuKG5pbCksCisJKQorCisJZXJyID0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQorCX0KKwllcnIyLCBvayA9IGVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIElOVkFMSURfREFUQSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCX0KKworCS8vIEJvdGggb2YgdGhlIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0CisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJ1Y3RCZWdpbigpLlJldHVybigiU3RydWN0QyIsIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJpIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5JMzIpLCBpbnQxNigyKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEkzMigpLlJldHVybihpbnQzMigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkRW5kKCkuUmV0dXJuKG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRGaWVsZEJlZ2luKCkuUmV0dXJuKCJzMiIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoNCksIG5pbCksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRTdHJpbmcoKS5SZXR1cm4oInRlc3QiLCBuaWwpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkRmllbGRFbmQoKS5SZXR1cm4obmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZEZpZWxkQmVnaW4oKS5SZXR1cm4oIl8iLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUT1ApLCBpbnQxNigxKSwgbmlsKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZFN0cnVjdEVuZCgpLlJldHVybihuaWwpLAorCSkKKworCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKKwltb2NrQ3RybC5GaW5pc2goKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIHN1Y2NlZWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWU5YjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCXN0ICJzZXJ2aWNlc3Rlc3QiCispCisKKy8vdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQsIGl0IHdpbGwgZmFpbCB0byBjb21waWxlIGlmIGNoZWNrIGlzIGZhaWxlZAorZnVuYyBzdGF0aWNDaGVja1N0cnVjdEFyZ3NSZXN1bHRzKCkgeworCS8vQ2hlY2sgdGhhdCBzdHJ1Y3QgYXJncyBhbmQgcmVzdWx0cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZQorCXZhciBzYSAqc3QuU3RydWN0QSA9ICZzdC5TdHJ1Y3RBe30KKwl2YXIgaWZhY2Ugc3QuQVNlcnYKKwl2YXIgZXJyIGVycm9yCisKKwlzYSwgZXJyID0gaWZhY2UuU3RydWN0QUZ1bmNfMXN0cnVjdEEoZGVmYXVsdEN0eCwgc2EpCisJXyA9IGVycgorCV8gPSBzYQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTU0Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28KQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorCSJ0aHJpZnR0ZXN0IgorKQorCit0eXBlIFRocmlmdFRlc3REcml2ZXIgc3RydWN0IHsKKwljbGllbnQgdGhyaWZ0dGVzdC5UaHJpZnRUZXN0CisJdCAgICAgICp0ZXN0aW5nLlQKK30KKworZnVuYyBOZXdUaHJpZnRUZXN0RHJpdmVyKHQgKnRlc3RpbmcuVCwgY2xpZW50IHRocmlmdHRlc3QuVGhyaWZ0VGVzdCkgKlRocmlmdFRlc3REcml2ZXIgeworCXJldHVybiAmVGhyaWZ0VGVzdERyaXZlcntjbGllbnQsIHR9Cit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3REcml2ZXIpIFN0YXJ0KCkgeworCWNsaWVudCA6PSBwLmNsaWVudAorCXQgOj0gcC50CisKKwlpZiBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCkgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFZvaWQgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIlRlc3QiKTsgciAhPSAiVGVzdCIgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBzaW1wbGUgdGV4dCBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAiIik7IHIgIT0gIiIgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTdHJpbmcgd2l0aCBlbXB0eSB0ZXh0IGZhaWxlZCIpCisJfQorCisJc3RyaW5nVGVzdCA6PSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworCQkiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworCQki0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKwkJIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisJCSJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworCQkiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKwkJIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisJCSJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworCQkiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisJCSJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKwkJIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisJCSLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworCQkiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKwkJIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworCQkiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworCQkiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisJCSJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworCQkiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworCQkiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworCQki0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKwkJIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisJCSJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworCQkiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisJCSJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKwkJIkLDom4tbMOibS1nw7osIOeyteiqniIKKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCBzdHJpbmdUZXN0KTsgciAhPSBzdHJpbmdUZXN0IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggYWxsIGxhbmd1YWdlcyBmYWlsZWQiKQorCX0KKworCXNwZWNpYWxDaGFyYWN0ZXJzIDo9ICJxdW90ZTogXCIgYmFja3NsYXNoOiIgKworCQkiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiICsKKwkJIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICdcXFxiXG5cclx0JyIgKworCQkiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKKwkJIiBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcXCIgfX19eyBbW1sgIgorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsIHNwZWNpYWxDaGFyYWN0ZXJzKTsgciAhPSBzcGVjaWFsQ2hhcmFjdGVycyB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNwZWNpYWxDaGFyYWN0ZXJzIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgxKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIDApOyByICE9IDAgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RCeXRlKDApIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoZGVmYXVsdEN0eCwgLTEpOyByICE9IC0xIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgtMSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAtMTI3KTsgciAhPSAtMTI3IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0Qnl0ZSgtMTI3KSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCAtMSk7IHIgIT0gLTEgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJMzIoLTEpIGZhaWxlZCIpCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCAxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STMyKDEpIGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIC01KTsgciAhPSAtNSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdEk2NCgtNSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDUpOyByICE9IDUgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RJNjQoNSkgZmFpbGVkIikKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIC0zNDM1OTczODM2OCk7IHIgIT0gLTM0MzU5NzM4MzY4IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0STY0KC0zNDM1OTczODM2OCkgZmFpbGVkIikKKwl9CisKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgLTUuMjA5ODUyMyk7IHIgIT0gLTUuMjA5ODUyMyB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdERvdWJsZSgtNS4yMDk4NTIzKSBmYWlsZWQiKQorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgLTcuMDEyMDUyMTc1MjE1MDQ0KTsgciAhPSAtNy4wMTIwNTIxNzUyMTUwNDQgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3REb3VibGUoLTcuMDEyMDUyMTc1MjE1MDQ0KSBmYWlsZWQiKQorCX0KKworCS8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCisJb3V0IDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlvdXQuU3RyaW5nVGhpbmcgPSAiWmVybyIKKwlvdXQuQnl0ZVRoaW5nID0gMQorCW91dC5JMzJUaGluZyA9IC0zCisJb3V0Lkk2NFRoaW5nID0gMTAwMDAwMAorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCBvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdFN0cnVjdCBmYWlsZWQiKQorCX0KKworCW91dDIgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QyKCkKKwlvdXQyLkJ5dGVUaGluZyA9IDEKKwlvdXQyLlN0cnVjdFRoaW5nID0gb3V0CisJb3V0Mi5JMzJUaGluZyA9IDUKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIG91dDIpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0MikgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3ROZXN0IGZhaWxlZCIpCisJfQorCisJbWFwb3V0IDo9IG1ha2UobWFwW2ludDMyXWludDMyKQorCWZvciBpIDo9IGludDMyKDApOyBpIDwgNTsgaSsrIHsKKwkJbWFwb3V0W2ldID0gaSAtIDEwCisJfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtYXBvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwb3V0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE1hcCBmYWlsZWQiKQorCX0KKworCW1hcFRlc3RJbnB1dCA6PSBtYXBbc3RyaW5nXXN0cmluZ3sKKwkJImEiOiAiMTIzIiwgImEgYiI6ICJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6ICJzYW1lIiwgIjAiOiAibnVtZXJpYyBrZXkiLAorCQkibG9uZ1ZhbHVlIjogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogImxvbmcga2V5IiwKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIG1hcFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0U3RyaW5nTWFwIGZhaWxlZCIpCisJfQorCisJc2V0VGVzdElucHV0IDo9IFtdaW50MzJ7MSwgMiwgM30KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgc2V0VGVzdElucHV0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIHNldFRlc3RJbnB1dCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RTZXQgZmFpbGVkIikKKwl9CisKKwlsaXN0VGVzdCA6PSBbXWludDMyezEsIDIsIDN9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TGlzdChkZWZhdWx0Q3R4LCBsaXN0VGVzdCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBsaXN0VGVzdCkgfHwgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RMaXN0IGZhaWxlZCIpCisJfQorCisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FKTsgciAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0RW51bSBmYWlsZWQiKQorCX0KKworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgNjkpOyByICE9IDY5IHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0VHlwZWRlZiBmYWlsZWQiKQorCX0KKworCW1hcE1hcFRlc3QgOj0gbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMnsKKwkJNDogIHsxOiAxLCAyOiAyLCAzOiAzLCA0OiA0fSwKKwkJLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorCX0KKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgMSk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBNYXBUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE1hcE1hcCBmYWlsZWQiKQorCX0KKworCWNyYXp5WDEgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQorCWNyYXp5WDEuU3RyaW5nVGhpbmcgPSAiR29vZGJ5ZTQiCisJY3JhenlYMS5CeXRlVGhpbmcgPSA0CisJY3JhenlYMS5JMzJUaGluZyA9IDQKKwljcmF6eVgxLkk2NFRoaW5nID0gNAorCisJY3JhenlYMiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJY3JhenlYMi5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJY3JhenlYMi5CeXRlVGhpbmcgPSAyCisJY3JhenlYMi5JMzJUaGluZyA9IDIKKwljcmF6eVgyLkk2NFRoaW5nID0gMgorCisJY3JhenkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWR7NTogNSwgODogOH0KKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7Y3JhenlYMSwgY3JhenlYMn0KKworCWNyYXp5RW1wdHkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJY3JhenlFbXB0eS5Vc2VyTWFwID0gbWFwW3RocmlmdHRlc3QuTnVtYmVyel10aHJpZnR0ZXN0LlVzZXJJZHt9CisJY3JhenlFbXB0eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7fQorCisJaW5zYW5pdHkgOj0gbWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHl7CisJCTE6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPOiBjcmF6eSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RIUkVFOiBjcmF6eX0sCisJCTI6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfU0lYOiBjcmF6eUVtcHR5fSwKKwl9CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoZGVmYXVsdEN0eCwgY3JhenkpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgaW5zYW5pdHkpIHx8IGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJUZXN0SW5zYW5pdHkgZmFpbGVkIikKKwl9CisKKwlpZiBlcnIgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKTsgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gVEV4Y2VwdGlvbiBmYWlsZWQiKQorCX0KKworCWlmIGVyciwgb2sgOj0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIikuKCp0aHJpZnR0ZXN0LlhjZXB0aW9uKTsgb2sgPT0gZmFsc2UgfHwgZXJyID09IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gWGNlcHRpb24gZmFpbGVkIikKKwl9IGVsc2UgaWYgZXJyLkVycm9yQ29kZSAhPSAxMDAxIHx8IGVyci5NZXNzYWdlICE9ICJYY2VwdGlvbiIgeworCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCisJfQorCisJaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJubyBFeGNlcHRpb24iKTsgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlRlc3RFeGNlcHRpb24gbm8gRXhjZXB0aW9uIGZhaWxlZCIpCisJfQorCisJaWYgZXJyIDo9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDApOyBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbCgiVGVzdE9uZXdheSBmYWlsZWQiKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI5ZWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGVzdHMKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJ0aHJpZnQiCisJInRocmlmdHRlc3QiCisJInRpbWUiCispCisKK3R5cGUgU2Vjb25kU2VydmljZUhhbmRsZXIgc3RydWN0IHsKK30KKworZnVuYyBOZXdTZWNvbmRTZXJ2aWNlSGFuZGxlcigpICpTZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisJcmV0dXJuICZTZWNvbmRTZXJ2aWNlSGFuZGxlcnt9Cit9CisKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBCbGFoQmxhaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgU2Vjb25kdGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKwordHlwZSBUaHJpZnRUZXN0SGFuZGxlciBzdHJ1Y3QgeworfQorCitmdW5jIE5ld1RocmlmdFRlc3RIYW5kbGVyKCkgKlRocmlmdFRlc3RIYW5kbGVyIHsKKwlyZXR1cm4gJlRocmlmdFRlc3RIYW5kbGVye30KK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RWb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJvb2woY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgYm9vbCkgKHIgYm9vbCwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCeXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0STMyKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdERvdWJsZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEJpbmFyeShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgKnRocmlmdHRlc3QuWHRydWN0KSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworCXJldHVybiB0aGluZywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TmVzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QyKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBtYXBbaW50MzJdaW50MzIpIChyIG1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdExpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHRoaW5nLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFbnVtKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHRocmlmdHRlc3QuTnVtYmVyeikgKHIgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5Vc2VySWQpIChyIHRocmlmdHRlc3QuVXNlcklkLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gdGhpbmcsIG5pbAorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CisJciA9IG1ha2UobWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKKwlwb3MgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCisJbmVnIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQorCisJZm9yIGkgOj0gaW50MzIoMSk7IGkgPCA1OyBpKysgeworCQlwb3NbaV0gPSBpCisJCW5lZ1staV0gPSAtaQorCX0KKwlyWzRdID0gcG9zCisJclstNF0gPSBuZWcKKworCXJldHVybiByLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJbnNhbml0eShjdHggY29udGV4dC5Db250ZXh0LCBhcmd1bWVudCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKHIgbWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHksIGVyciBlcnJvcikgeworCWhlbGxvIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwloZWxsby5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJaGVsbG8uQnl0ZVRoaW5nID0gMgorCWhlbGxvLkkzMlRoaW5nID0gMgorCWhlbGxvLkk2NFRoaW5nID0gMgorCisJZ29vZGJ5ZSA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJZ29vZGJ5ZS5TdHJpbmdUaGluZyA9ICJHb29kYnllNCIKKwlnb29kYnllLkJ5dGVUaGluZyA9IDQKKwlnb29kYnllLkkzMlRoaW5nID0gNAorCWdvb2RieWUuSTY0VGhpbmcgPSA0CisKKwljcmF6eSA6PSB0aHJpZnR0ZXN0Lk5ld0luc2FuaXR5KCkKKwljcmF6eS5Vc2VyTWFwID0gbWFrZShtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkKQorCWNyYXp5LlVzZXJNYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hUXSA9IDgKKwljcmF6eS5Vc2VyTWFwW3RocmlmdHRlc3QuTnVtYmVyel9GSVZFXSA9IDUKKwljcmF6eS5YdHJ1Y3RzID0gW10qdGhyaWZ0dGVzdC5YdHJ1Y3R7Z29vZGJ5ZSwgaGVsbG99CisKKwlmaXJzdF9tYXAgOj0gbWFrZShtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5KQorCXNlY29uZF9tYXAgOj0gbWFrZShtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5KQorCisJZmlyc3RfbWFwW3RocmlmdHRlc3QuTnVtYmVyel9UV09dID0gY3JhenkKKwlmaXJzdF9tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6X1RIUkVFXSA9IGNyYXp5CisKKwlsb29uZXkgOj0gdGhyaWZ0dGVzdC5OZXdJbnNhbml0eSgpCisJc2Vjb25kX21hcFt0aHJpZnR0ZXN0Lk51bWJlcnpfU0lYXSA9IGxvb25leQorCisJdmFyIGluc2FuZSA9IG1ha2UobWFwW3RocmlmdHRlc3QuVXNlcklkXW1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpdKnRocmlmdHRlc3QuSW5zYW5pdHkpCisJaW5zYW5lWzFdID0gZmlyc3RfbWFwCisJaW5zYW5lWzJdID0gc2Vjb25kX21hcAorCisJcmV0dXJuIGluc2FuZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TXVsdGkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBhcmc1IHRocmlmdHRlc3QuVXNlcklkKSAociAqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVyciBlcnJvcikgeworCXIgPSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCisJci5TdHJpbmdUaGluZyA9ICJIZWxsbzIiCisJci5CeXRlVGhpbmcgPSBhcmcwCisJci5JMzJUaGluZyA9IGFyZzEKKwlyLkk2NFRoaW5nID0gYXJnMgorCXJldHVybiByLCBuaWwKK30KKworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFeGNlcHRpb24oY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworCWlmIGFyZyA9PSAiWGNlcHRpb24iIHsKKwkJeCA6PSB0aHJpZnR0ZXN0Lk5ld1hjZXB0aW9uKCkKKwkJeC5FcnJvckNvZGUgPSAxMDAxCisJCXguTWVzc2FnZSA9IGFyZworCQlyZXR1cm4geAorCX0gZWxzZSBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHsKKwkJcmV0dXJuIHRocmlmdC5URXhjZXB0aW9uKGVycm9ycy5OZXcoYXJnKSkKKwl9IGVsc2UgeworCQlyZXR1cm4gbmlsCisJfQorfQorCitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKKwlpZiBhcmcwID09ICJYY2VwdGlvbiIgeworCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQorCQl4LkVycm9yQ29kZSA9IDEwMDEKKwkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisJCXJldHVybiBuaWwsIHgKKwl9IGVsc2UgaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB7CisJCXgyIDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24yKCkKKwkJeDIuRXJyb3JDb2RlID0gMjAwMgorCQl4Mi5TdHJ1Y3RUaGluZyA9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwkJeDIuU3RydWN0VGhpbmcuU3RyaW5nVGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisJCXJldHVybiBuaWwsIHgyCisJfQorCisJcmVzIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0KCkKKwlyZXMuU3RyaW5nVGhpbmcgPSBhcmcxCisJcmV0dXJuIHJlcywgbmlsCit9CisKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0T25ld2F5KGN0eCBjb250ZXh0LkNvbnRleHQsIHNlY29uZHNUb1NsZWVwIGludDMyKSAoZXJyIGVycm9yKSB7CisJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRhZTJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3VuaW9uX2JpbmFyeV90ZXN0LmdvCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorCSJ1bmlvbmJpbmFyeXRlc3QiCispCisKKworLy8gU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTQ1NzMKK2Z1bmMgVGVzdFVuaW9uQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXMgOj0gdW5pb25iaW5hcnl0ZXN0Lk5ld1NhbXBsZSgpCisJcy5VMSA9IG1hcFtzdHJpbmddc3RyaW5ne30KKwlzLlUyID0gW11ieXRle30KKwlpZiBuIDo9IHMuQ291bnRTZXRGaWVsZHNTYW1wbGUoKTsgbiAhPSAyIHsKKwkJdC5FcnJvcmYoIkV4cGVjdGVkIDIgc2V0IGZpZWxkcywgZ290ICVkISIsIG4pCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fZGVmYXVsdF92YWx1ZV90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fZGVmYXVsdF92YWx1ZV90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2JmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9kZWZhdWx0X3ZhbHVlX3Rlc3QuZ28KQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInVuaW9uZGVmYXVsdHZhbHVldGVzdCIKKykKKworZnVuYyBUZXN0VW5pb25EZWZhdWx0VmFsdWUodCAqdGVzdGluZy5UKSB7CisJcyA6PSB1bmlvbmRlZmF1bHR2YWx1ZXRlc3QuTmV3VGVzdFN0cnVjdCgpCisJZCA6PSBzLkdldERlc2NlbmRhbnQoKQorCWlmIGQgPT0gbmlsIHsKKwkJdC5FcnJvcigiRGVmYXVsdCBVbmlvbiB2YWx1ZSBub3Qgc2V0ISIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9NYWtlZmlsZSBiL2xpYi9nby90aHJpZnQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Zjc4NjIuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMDkgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCi0jIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UuaW5jCi0KLVRBUkc9dGhyaWZ0Ci1HT0ZJTEVTPVwKLSAgICAgICAgdGFwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nb1wKLSAgICAgICAgdGJhc2UuZ29cCi0gICAgICAgIHRiaW5hcnlfcHJvdG9jb2wuZ29cCi0gICAgICAgIHRjb21wYWN0X3Byb3RvY29sLmdvXAotICAgICAgICB0Y29tcGFyZS5nb1wKLSAgICAgICAgdGNvbnRhaW5lci5nb1wKLSAgICAgICAgdGV4Y2VwdGlvbi5nb1wKLSAgICAgICAgdGZpZWxkLmdvXAotICAgICAgICB0ZnJhbWVkX3RyYW5zcG9ydC5nb1wKLSAgICAgICAgdGh0dHBfY2xpZW50LmdvXAotICAgICAgICB0aW9zdHJlYW1fdHJhbnNwb3J0LmdvXAotICAgICAgICB0bGlzdC5nb1wKLSAgICAgICAgdGpzb25fcHJvdG9jb2wuZ29cCi0gICAgICAgIHRtYXAuZ29cCi0gICAgICAgIHRtZW1vcnlfYnVmZmVyLmdvXAotICAgICAgICB0bWVzc2FnZS5nb1wKLSAgICAgICAgdG1lc3NhZ2V0eXBlLmdvXAotICAgICAgICB0bm9uYmxvY2tpbmdfc2VydmVyLmdvXAotICAgICAgICB0bm9uYmxvY2tpbmdfc2VydmVyX3NvY2tldC5nb1wKLSAgICAgICAgdG5vbmJsb2NraW5nX3NvY2tldC5nb1wKLSAgICAgICAgdG5vbmJsb2NraW5nX3RyYW5zcG9ydC5nb1wKLSAgICAgICAgdG51bWVyaWMuZ29cCi0gICAgICAgIHRwcm9jZXNzb3IuZ29cCi0gICAgICAgIHRwcm9jZXNzb3JfZmFjdG9yeS5nb1wKLSAgICAgICAgdHByb3RvY29sLmdvXAotICAgICAgICB0cHJvdG9jb2xfZXhjZXB0aW9uLmdvXAotICAgICAgICB0cHJvdG9jb2xfZmFjdG9yeS5nb1wKLSAgICAgICAgdHNlcnZlci5nb1wKLSAgICAgICAgdHNlcnZlcl9zb2NrZXQuZ29cCi0gICAgICAgIHRzZXJ2ZXJfdHJhbnNwb3J0LmdvXAotICAgICAgICB0c2V0LmdvXAotICAgICAgICB0c2ltcGxlX3NlcnZlci5nb1wKLSAgICAgICAgdHNpbXBsZV9qc29uX3Byb3RvY29sLmdvXAotICAgICAgICB0c29ja2V0LmdvXAotICAgICAgICB0c3RydWN0LmdvXAotICAgICAgICB0dHJhbnNwb3J0LmdvXAotICAgICAgICB0dHJhbnNwb3J0X2V4Y2VwdGlvbi5nb1wKLSAgICAgICAgdHRyYW5zcG9ydF9mYWN0b3J5LmdvXAotICAgICAgICB0dHlwZS5nbwotCi1ESVJTPVwKLQotaW5jbHVkZSAkKEdPUk9PVCkvc3JjL01ha2UucGtnCi0KLWNoZWNrOgotCWdvbWFrZSB0ZXN0Ci0KLS1pbmNsdWRlIC4uL01ha2UuZGVwcwotCi0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvX3Rlc3RtYWluLmdvIGIvbGliL2dvL3RocmlmdC9fdGVzdG1haW4uZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMGFiZmIuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC9fdGVzdG1haW4uZ28KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1wYWNrYWdlIG1haW4KLQotaW1wb3J0ICIuL194dGVzdF8iCi1pbXBvcnQgInRlc3RpbmciCi1pbXBvcnQgX19yZWdleHBfXyAicmVnZXhwIgotCi12YXIgdGVzdHMgPSBbXXRlc3RpbmcuSW50ZXJuYWxUZXN0ewotCXsidGhyaWZ0X3Rlc3QuVGVzdFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIHRocmlmdF90ZXN0LlRlc3RUQXBwbGljYXRpb25FeGNlcHRpb259LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUJpbmFyeVByb3RvY29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUJpbmFyeVByb3RvY29sfSwKLQl7InRocmlmdF90ZXN0LlRlc3RSZWFkV3JpdGVDb21wYWN0UHJvdG9jb2wiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFdyaXRlQ29tcGFjdFByb3RvY29sfSwKLQl7InRocmlmdF90ZXN0LlRlc3RURXhjZXB0aW9uIiwgdGhyaWZ0X3Rlc3QuVGVzdFRFeGNlcHRpb259LAotCXsidGhyaWZ0X3Rlc3QuVGVzdEZyYW1lZFRyYW5zcG9ydCIsIHRocmlmdF90ZXN0LlRlc3RGcmFtZWRUcmFuc3BvcnR9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdEh0dHBDbGllbnQiLCB0aHJpZnRfdGVzdC5UZXN0SHR0cENsaWVudH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0SU9TdHJlYW1UcmFuc3BvcnQiLCB0aHJpZnRfdGVzdC5UZXN0SU9TdHJlYW1UcmFuc3BvcnR9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFdyaXRlSlNPTlByb3RvY29sQm9vbCIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEJvb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xCb29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xCb29sfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZUpTT05Qcm90b2NvbEJ5dGUiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xCeXRlfSwKLQl7InRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sQnl0ZSIsIHRocmlmdF90ZXN0LlRlc3RSZWFkSlNPTlByb3RvY29sQnl0ZX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xJMTYiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xJMTZ9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xJMTYiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEkxNn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xJMzIiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xJMzJ9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xJMzIiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEkzMn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xJNjQiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xJNjR9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xJNjQiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEk2NH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xEb3VibGUiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xEb3VibGV9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xEb3VibGUiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbERvdWJsZX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xTdHJpbmciLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xTdHJpbmd9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xTdHJpbmciLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbFN0cmluZ30sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xCaW5hcnkiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xCaW5hcnl9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRKU09OUHJvdG9jb2xCaW5hcnkiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZEpTT05Qcm90b2NvbEJpbmFyeX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xMaXN0IiwgdGhyaWZ0X3Rlc3QuVGVzdFdyaXRlSlNPTlByb3RvY29sTGlzdH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xTZXQiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVKU09OUHJvdG9jb2xTZXR9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFdyaXRlSlNPTlByb3RvY29sTWFwIiwgdGhyaWZ0X3Rlc3QuVGVzdFdyaXRlSlNPTlByb3RvY29sTWFwfSwKLQl7InRocmlmdF90ZXN0LlRlc3RSZWFkV3JpdGVKU09OU3RydWN0IiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUpTT05TdHJ1Y3R9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZUpTT05Qcm90b2NvbCIsIHRocmlmdF90ZXN0LlRlc3RSZWFkV3JpdGVKU09OUHJvdG9jb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdE1lbW9yeUJ1ZmZlciIsIHRocmlmdF90ZXN0LlRlc3RNZW1vcnlCdWZmZXJ9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdE5vbmJsb2NraW5nVHJhbnNwb3J0U2VydmVyVG9DbGllbnQiLCB0aHJpZnRfdGVzdC5UZXN0Tm9uYmxvY2tpbmdUcmFuc3BvcnRTZXJ2ZXJUb0NsaWVudH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0Tm9uYmxvY2tpbmdUcmFuc3BvcnRDbGllbnRUb1NlcnZlciIsIHRocmlmdF90ZXN0LlRlc3ROb25ibG9ja2luZ1RyYW5zcG9ydENsaWVudFRvU2VydmVyfSwKLQl7InRocmlmdF90ZXN0LlRlc3ROb3RoaW5nIiwgdGhyaWZ0X3Rlc3QuVGVzdE5vdGhpbmd9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQm9vbCIsIHRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJvb2x9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCb29sIiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCb29sfSwKLQl7InRocmlmdF90ZXN0LlRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJ5dGUiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCeXRlfSwKLQl7InRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQnl0ZSIsIHRocmlmdF90ZXN0LlRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQnl0ZX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMTYiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMTZ9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMTYiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkxNn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMzIiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMzJ9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMzIiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkzMn0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJNjQiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJNjR9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJNjQiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEk2NH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xEb3VibGV9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xEb3VibGUiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbERvdWJsZX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmciLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmd9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmciLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbFN0cmluZ30sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnl9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkiLCB0aHJpZnRfdGVzdC5UZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeX0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xMaXN0IiwgdGhyaWZ0X3Rlc3QuVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTGlzdH0sCi0JeyJ0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTZXQiLCB0aHJpZnRfdGVzdC5UZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTZXR9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTWFwIiwgdGhyaWZ0X3Rlc3QuVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTWFwfSwKLQl7InRocmlmdF90ZXN0LlRlc3RSZWFkV3JpdGVTaW1wbGVKU09OU3RydWN0IiwgdGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZVNpbXBsZUpTT05TdHJ1Y3R9LAotCXsidGhyaWZ0X3Rlc3QuVGVzdFJlYWRXcml0ZVNpbXBsZUpTT05Qcm90b2NvbCIsIHRocmlmdF90ZXN0LlRlc3RSZWFkV3JpdGVTaW1wbGVKU09OUHJvdG9jb2x9LAotfQotdmFyIGJlbmNobWFya3MgPSBbXXRlc3RpbmcuSW50ZXJuYWxCZW5jaG1hcmt7IC8vCi19Ci0KLWZ1bmMgbWFpbigpIHsKLQl0ZXN0aW5nLk1haW4oX19yZWdleHBfXy5NYXRjaFN0cmluZywgdGVzdHMpCi0JdGVzdGluZy5SdW5CZW5jaG1hcmtzKF9fcmVnZXhwX18uTWF0Y2hTdHJpbmcsIGJlbmNobWFya3MpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDdlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbwpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitjb25zdCAoCisJVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04gID0gMAorCVVOS05PV05fTUVUSE9EICAgICAgICAgICAgICAgICA9IDEKKwlJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gPSAyCisJV1JPTkdfTUVUSE9EX05BTUUgICAgICAgICAgICAgID0gMworCUJBRF9TRVFVRU5DRV9JRCAgICAgICAgICAgICAgICA9IDQKKwlNSVNTSU5HX1JFU1VMVCAgICAgICAgICAgICAgICAgPSA1CisJSU5URVJOQUxfRVJST1IgICAgICAgICAgICAgICAgID0gNgorCVBST1RPQ09MX0VSUk9SICAgICAgICAgICAgICAgICA9IDcKKykKKwordmFyIGRlZmF1bHRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1lc3NhZ2UgPSBtYXBbaW50MzJdc3RyaW5neworCVVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OOiAgInVua25vd24gYXBwbGljYXRpb24gZXhjZXB0aW9uIiwKKwlVTktOT1dOX01FVEhPRDogICAgICAgICAgICAgICAgICJ1bmtub3duIG1ldGhvZCIsCisJSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OOiAiaW52YWxpZCBtZXNzYWdlIHR5cGUiLAorCVdST05HX01FVEhPRF9OQU1FOiAgICAgICAgICAgICAgIndyb25nIG1ldGhvZCBuYW1lIiwKKwlCQURfU0VRVUVOQ0VfSUQ6ICAgICAgICAgICAgICAgICJiYWQgc2VxdWVuY2UgSUQiLAorCU1JU1NJTkdfUkVTVUxUOiAgICAgICAgICAgICAgICAgIm1pc3NpbmcgcmVzdWx0IiwKKwlJTlRFUk5BTF9FUlJPUjogICAgICAgICAgICAgICAgICJ1bmtub3duIGludGVybmFsIGVycm9yIiwKKwlQUk9UT0NPTF9FUlJPUjogICAgICAgICAgICAgICAgICJ1bmtub3duIHByb3RvY29sIGVycm9yIiwKK30KKworLy8gQXBwbGljYXRpb24gbGV2ZWwgVGhyaWZ0IGV4Y2VwdGlvbgordHlwZSBUQXBwbGljYXRpb25FeGNlcHRpb24gaW50ZXJmYWNlIHsKKwlURXhjZXB0aW9uCisJVHlwZUlkKCkgaW50MzIKKwlSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IKKwlXcml0ZShvcHJvdCBUUHJvdG9jb2wpIGVycm9yCit9CisKK3R5cGUgdEFwcGxpY2F0aW9uRXhjZXB0aW9uIHN0cnVjdCB7CisJbWVzc2FnZSBzdHJpbmcKKwl0eXBlXyAgIGludDMyCit9CisKK2Z1bmMgKGUgdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBFcnJvcigpIHN0cmluZyB7CisJaWYgZS5tZXNzYWdlICE9ICIiIHsKKwkJcmV0dXJuIGUubWVzc2FnZQorCX0KKwlyZXR1cm4gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtlLnR5cGVfXQorfQorCitmdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXyBpbnQzMiwgbWVzc2FnZSBzdHJpbmcpIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisJcmV0dXJuICZ0QXBwbGljYXRpb25FeGNlcHRpb257bWVzc2FnZSwgdHlwZV99Cit9CisKK2Z1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgVHlwZUlkKCkgaW50MzIgeworCXJldHVybiBwLnR5cGVfCit9CisKK2Z1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgUmVhZChpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwkvLyBUT0RPOiB0aGlzIHNob3VsZCByZWFsbHkgYmUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlcgorCV8sIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJbWVzc2FnZSA6PSAiIgorCXR5cGVfIDo9IGludDMyKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OKQorCisJZm9yIHsKKwkJXywgdHR5cGUsIGlkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlpZiB0dHlwZSA9PSBTVE9QIHsKKwkJCWJyZWFrCisJCX0KKwkJc3dpdGNoIGlkIHsKKwkJY2FzZSAxOgorCQkJaWYgdHR5cGUgPT0gU1RSSU5HIHsKKwkJCQlpZiBtZXNzYWdlLCBlcnIgPSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJCQlyZXR1cm4gZXJyCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgeworCQkJCQlyZXR1cm4gZXJyCisJCQkJfQorCQkJfQorCQljYXNlIDI6CisJCQlpZiB0dHlwZSA9PSBJMzIgeworCQkJCWlmIHR5cGVfLCBlcnIgPSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQkJCQlyZXR1cm4gZXJyCisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgeworCQkJCQlyZXR1cm4gZXJyCisJCQkJfQorCQkJfQorCQlkZWZhdWx0OgorCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJaWYgZXJyID0gaXByb3QuUmVhZEZpZWxkRW5kKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJfQorCWlmIGVyciA6PSBpcHJvdC5SZWFkU3RydWN0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcC5tZXNzYWdlID0gbWVzc2FnZQorCXAudHlwZV8gPSB0eXBlXworCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWVyciA9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJaWYgbGVuKHAuRXJyb3IoKSkgPiAwIHsKKwkJZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJtZXNzYWdlIiwgU1RSSU5HLCAxKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJCWVyciA9IG9wcm90LldyaXRlU3RyaW5nKHAuRXJyb3IoKSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCQllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInR5cGUiLCBJMzIsIDIpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZUkzMihwLnR5cGVfKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwllcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpCisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQzMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwpAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKKwlleGMgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiIikKKwlpZiBleGMuRXJyb3IoKSAhPSBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlW1VOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OXSB7CisJCXQuRmF0YWxmKCJFeHBlY3RlZCBlbXB0eSBzdHJpbmcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5FcnJvcigpKQorCX0KKwlpZiBleGMuVHlwZUlkKCkgIT0gVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04geworCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBVTktOT1dOIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCisJfQorCWV4YyA9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgImp1bmtfbWV0aG9kIikKKwlpZiBleGMuRXJyb3IoKSAhPSAianVua19tZXRob2QiIHsKKwkJdC5GYXRhbGYoIkV4cGVjdGVkICdqdW5rX21ldGhvZCcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5FcnJvcigpKQorCX0KKwlpZiBleGMuVHlwZUlkKCkgIT0gV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXYnIiwgZXhjLlR5cGVJZCgpKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY5MGJmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iaW5hcnkiCisJImVycm9ycyIKKwkiZm10IgorCSJpbyIKKwkibWF0aCIKKykKKwordHlwZSBUQmluYXJ5UHJvdG9jb2wgc3RydWN0IHsKKwl0cmFucyAgICAgICAgIFRSaWNoVHJhbnNwb3J0CisJb3JpZ1RyYW5zcG9ydCBUVHJhbnNwb3J0CisJcmVhZGVyICAgICAgICBpby5SZWFkZXIKKwl3cml0ZXIgICAgICAgIGlvLldyaXRlcgorCXN0cmljdFJlYWQgICAgYm9vbAorCXN0cmljdFdyaXRlICAgYm9vbAorCWJ1ZmZlciAgICAgICAgWzY0XWJ5dGUKK30KKwordHlwZSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHN0cnVjdCB7CisJc3RyaWN0UmVhZCAgYm9vbAorCXN0cmljdFdyaXRlIGJvb2wKK30KKworZnVuYyBOZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodCBUVHJhbnNwb3J0KSAqVEJpbmFyeVByb3RvY29sIHsKKwlyZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sKHQsIGZhbHNlLCB0cnVlKQorfQorCitmdW5jIE5ld1RCaW5hcnlQcm90b2NvbCh0IFRUcmFuc3BvcnQsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlIGJvb2wpICpUQmluYXJ5UHJvdG9jb2wgeworCXAgOj0gJlRCaW5hcnlQcm90b2NvbHtvcmlnVHJhbnNwb3J0OiB0LCBzdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZTogc3RyaWN0V3JpdGV9CisJaWYgZXQsIG9rIDo9IHQuKFRSaWNoVHJhbnNwb3J0KTsgb2sgeworCQlwLnRyYW5zID0gZXQKKwl9IGVsc2UgeworCQlwLnRyYW5zID0gTmV3VFJpY2hUcmFuc3BvcnQodCkKKwl9CisJcC5yZWFkZXIgPSBwLnRyYW5zCisJcC53cml0ZXIgPSBwLnRyYW5zCisJcmV0dXJuIHAKK30KKworZnVuYyBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpICpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeShmYWxzZSwgdHJ1ZSkKK30KKworZnVuYyBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KHN0cmljdFJlYWQsIHN0cmljdFdyaXRlIGJvb2wpICpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlRCaW5hcnlQcm90b2NvbEZhY3Rvcnl7c3RyaWN0UmVhZDogc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGU6IHN0cmljdFdyaXRlfQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0IFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RCaW5hcnlQcm90b2NvbCh0LCBwLnN0cmljdFJlYWQsIHAuc3RyaWN0V3JpdGUpCit9CisKKy8qKgorICogV3JpdGluZyBNZXRob2RzCisgKi8KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIGVycm9yIHsKKwlpZiBwLnN0cmljdFdyaXRlIHsKKwkJdmVyc2lvbiA6PSB1aW50MzIoVkVSU0lPTl8xKSB8IHVpbnQzMih0eXBlSWQpCisJCWUgOj0gcC5Xcml0ZUkzMihpbnQzMih2ZXJzaW9uKSkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIGUKKwkJfQorCQllID0gcC5Xcml0ZVN0cmluZyhuYW1lKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gZQorCQl9CisJCWUgPSBwLldyaXRlSTMyKHNlcUlkKQorCQlyZXR1cm4gZQorCX0gZWxzZSB7CisJCWUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKQorCQlpZiBlICE9IG5pbCB7CisJCQlyZXR1cm4gZQorCQl9CisJCWUgPSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXJldHVybiBlCisJCX0KKwkJZSA9IHAuV3JpdGVJMzIoc2VxSWQpCisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OCh0eXBlSWQpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVJMTYoaWQpCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKFNUT1ApCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllIDo9IHAuV3JpdGVCeXRlKGludDgoa2V5VHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUJ5dGUoaW50OCh2YWx1ZVR5cGUpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCisJcmV0dXJuIGUKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGVsZW1UeXBlKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQorCXJldHVybiBlCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWUgOj0gcC5Xcml0ZUJ5dGUoaW50OChlbGVtVHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwllID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKKwlyZXR1cm4gZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCWlmIHZhbHVlIHsKKwkJcmV0dXJuIHAuV3JpdGVCeXRlKDEpCisJfQorCXJldHVybiBwLldyaXRlQnl0ZSgwKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBpbnQ4KSBlcnJvciB7CisJZSA6PSBwLnRyYW5zLldyaXRlQnl0ZShieXRlKHZhbHVlKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIGVycm9yIHsKKwl2IDo9IHAuYnVmZmVyWzA6Ml0KKwliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQxNih2LCB1aW50MTYodmFsdWUpKQorCV8sIGUgOj0gcC53cml0ZXIuV3JpdGUodikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVJMzIodmFsdWUgaW50MzIpIGVycm9yIHsKKwl2IDo9IHAuYnVmZmVyWzA6NF0KKwliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMih2LCB1aW50MzIodmFsdWUpKQorCV8sIGUgOj0gcC53cml0ZXIuV3JpdGUodikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVJNjQodmFsdWUgaW50NjQpIGVycm9yIHsKKwl2IDo9IHAuYnVmZmVyWzA6OF0KKwliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQ2NCh2LCB1aW50NjQodmFsdWUpKQorCV8sIGVyciA6PSBwLndyaXRlci5Xcml0ZSh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRG91YmxlKHZhbHVlIGZsb2F0NjQpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUk2NChpbnQ2NChtYXRoLkZsb2F0NjRiaXRzKHZhbHVlKSkpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvciB7CisJZSA6PSBwLldyaXRlSTMyKGludDMyKGxlbih2YWx1ZSkpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJXywgZXJyIDo9IHAudHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCaW5hcnkodmFsdWUgW11ieXRlKSBlcnJvciB7CisJZSA6PSBwLldyaXRlSTMyKGludDMyKGxlbih2YWx1ZSkpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJXywgZXJyIDo9IHAud3JpdGVyLldyaXRlKHZhbHVlKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvKioKKyAqIFJlYWRpbmcgbWV0aG9kcworICovCisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBlcnJvcikgeworCXNpemUsIGUgOj0gcC5SZWFkSTMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAiIiwgdHlwZUlkLCAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgc2l6ZSA8IDAgeworCQl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoc2l6ZSAmIDB4MGZmKQorCQl2ZXJzaW9uIDo9IGludDY0KGludDY0KHNpemUpICYgVkVSU0lPTl9NQVNLKQorCQlpZiB2ZXJzaW9uICE9IFZFUlNJT05fMSB7CisJCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoQkFEX1ZFUlNJT04sIGZtdC5FcnJvcmYoIkJhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4iKSkKKwkJfQorCQluYW1lLCBlID0gcC5SZWFkU3RyaW5nKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQl9CisJCXNlcUlkLCBlID0gcC5SZWFkSTMyKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQl9CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKKwl9CisJaWYgcC5zdHJpY3RSZWFkIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKEJBRF9WRVJTSU9OLCBmbXQuRXJyb3JmKCJNaXNzaW5nIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiIpKQorCX0KKwluYW1lLCBlMiA6PSBwLnJlYWRTdHJpbmdCb2R5KHNpemUpCisJaWYgZTIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUyCisJfQorCWIsIGUzIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUzICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlMworCX0KKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYikKKwlzZXFJZCwgZTQgOj0gcC5SZWFkSTMyKCkKKwlpZiBlNCAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZTQKKwl9CisJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgZXJyb3IgeworCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCXJldHVybgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIHNlcUlkIGludDE2LCBlcnIgZXJyb3IpIHsKKwl0LCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJdHlwZUlkID0gVFR5cGUodCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiB0ICE9IFNUT1AgeworCQlzZXFJZCwgZXJyID0gcC5SZWFkSTE2KCkKKwl9CisJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK3ZhciBpbnZhbGlkRGF0YUxlbmd0aCA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyb3JzLk5ldygiSW52YWxpZCBkYXRhIGxlbmd0aCIpKQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrVHlwZSwgdlR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwlrLCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwlrVHlwZSA9IFRUeXBlKGspCisJdiwgZSA6PSBwLlJlYWRCeXRlKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJdlR5cGUgPSBUVHlwZSh2KQorCXNpemUzMiwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwlpZiBzaXplMzIgPCAwIHsKKwkJZXJyID0gaW52YWxpZERhdGFMZW5ndGgKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoc2l6ZTMyKQorCXJldHVybiBrVHlwZSwgdlR5cGUsIHNpemUsIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwliLCBlIDo9IHAuUmVhZEJ5dGUoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwllbGVtVHlwZSA9IFRUeXBlKGIpCisJc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisKKwlyZXR1cm4KK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJYiwgZSA6PSBwLlJlYWRCeXRlKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJZWxlbVR5cGUgPSBUVHlwZShiKQorCXNpemUzMiwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCXJldHVybgorCX0KKwlpZiBzaXplMzIgPCAwIHsKKwkJZXJyID0gaW52YWxpZERhdGFMZW5ndGgKKwkJcmV0dXJuCisJfQorCXNpemUgPSBpbnQoc2l6ZTMyKQorCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwliLCBlIDo9IHAuUmVhZEJ5dGUoKQorCXYgOj0gdHJ1ZQorCWlmIGIgIT0gMSB7CisJCXYgPSBmYWxzZQorCX0KKwlyZXR1cm4gdiwgZQorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAudHJhbnMuUmVhZEJ5dGUoKQorCXJldHVybiBpbnQ4KHYpLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgZXJyb3IpIHsKKwlidWYgOj0gcC5idWZmZXJbMDoyXQorCWVyciA9IHAucmVhZEFsbChidWYpCisJdmFsdWUgPSBpbnQxNihiaW5hcnkuQmlnRW5kaWFuLlVpbnQxNihidWYpKQorCXJldHVybiB2YWx1ZSwgZXJyCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzA6NF0KKwllcnIgPSBwLnJlYWRBbGwoYnVmKQorCXZhbHVlID0gaW50MzIoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoYnVmKSkKKwlyZXR1cm4gdmFsdWUsIGVycgorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjhdCisJZXJyID0gcC5yZWFkQWxsKGJ1ZikKKwl2YWx1ZSA9IGludDY0KGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGJ1ZikpCisJcmV0dXJuIHZhbHVlLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkRG91YmxlKCkgKHZhbHVlIGZsb2F0NjQsIGVyciBlcnJvcikgeworCWJ1ZiA6PSBwLmJ1ZmZlclswOjhdCisJZXJyID0gcC5yZWFkQWxsKGJ1ZikKKwl2YWx1ZSA9IG1hdGguRmxvYXQ2NGZyb21iaXRzKGJpbmFyeS5CaWdFbmRpYW4uVWludDY0KGJ1ZikpCisJcmV0dXJuIHZhbHVlLCBlcnIKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKSB7CisJc2l6ZSwgZSA6PSBwLlJlYWRJMzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBlCisJfQorCWlmIHNpemUgPCAwIHsKKwkJZXJyID0gaW52YWxpZERhdGFMZW5ndGgKKwkJcmV0dXJuCisJfQorCisJcmV0dXJuIHAucmVhZFN0cmluZ0JvZHkoc2l6ZSkKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwlzaXplLCBlIDo9IHAuUmVhZEkzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlCisJfQorCWlmIHNpemUgPCAwIHsKKwkJcmV0dXJuIG5pbCwgaW52YWxpZERhdGFMZW5ndGgKKwl9CisKKwlpc2l6ZSA6PSBpbnQoc2l6ZSkKKwlidWYgOj0gbWFrZShbXWJ5dGUsIGlzaXplKQorCV8sIGVyciA6PSBpby5SZWFkRnVsbChwLnRyYW5zLCBidWYpCisJcmV0dXJuIGJ1ZiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKGN0eCkpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCit9CisKK2Z1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAub3JpZ1RyYW5zcG9ydAorfQorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIHJlYWRBbGwoYnVmIFtdYnl0ZSkgZXJyb3IgeworCV8sIGVyciA6PSBpby5SZWFkRnVsbChwLnJlYWRlciwgYnVmKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitjb25zdCByZWFkTGltaXQgPSAzMjc2OAorCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIHJlYWRTdHJpbmdCb2R5KHNpemUgaW50MzIpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgeworCWlmIHNpemUgPCAwIHsKKwkJcmV0dXJuICIiLCBuaWwKKwl9CisKKwl2YXIgKAorCQlidWYgYnl0ZXMuQnVmZmVyCisJCWUgICBlcnJvcgorCQliICAgW11ieXRlCisJKQorCisJc3dpdGNoIHsKKwljYXNlIGludChzaXplKSA8PSBsZW4ocC5idWZmZXIpOgorCQliID0gcC5idWZmZXJbOnNpemVdIC8vIGF2b2lkcyBhbGxvY2F0aW9uIGZvciBzbWFsbCByZWFkcworCWNhc2UgaW50KHNpemUpIDwgcmVhZExpbWl0OgorCQliID0gbWFrZShbXWJ5dGUsIHNpemUpCisJZGVmYXVsdDoKKwkJYiA9IG1ha2UoW11ieXRlLCByZWFkTGltaXQpCisJfQorCisJZm9yIHNpemUgPiAwIHsKKwkJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGIpCisJCWJ1Zi5Xcml0ZShiKQorCQlpZiBlICE9IG5pbCB7CisJCQlicmVhaworCQl9CisJCXNpemUgLT0gcmVhZExpbWl0CisJCWlmIHNpemUgPCByZWFkTGltaXQgJiYgc2l6ZSA+IDAgeworCQkJYiA9IGJbOnNpemVdCisJCX0KKwl9CisJcmV0dXJuIGJ1Zi5TdHJpbmcoKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2JpbmFyeV9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDYyY2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFJlYWRXcml0ZUJpbmFyeVByb3RvY29sKHQgKnRlc3RpbmcuVCkgeworCVJlYWRXcml0ZVByb3RvY29sVGVzdCh0LCBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjcwMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28KQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJidWZpbyIKKwkiY29udGV4dCIKKykKKwordHlwZSBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CisJc2l6ZSBpbnQKK30KKwordHlwZSBUQnVmZmVyZWRUcmFuc3BvcnQgc3RydWN0IHsKKwlidWZpby5SZWFkV3JpdGVyCisJdHAgVFRyYW5zcG9ydAorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgcC5zaXplKSwgbmlsCit9CisKK2Z1bmMgTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShidWZmZXJTaXplIGludCkgKlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeXtzaXplOiBidWZmZXJTaXplfQorfQorCitmdW5jIE5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0LCBidWZmZXJTaXplIGludCkgKlRCdWZmZXJlZFRyYW5zcG9ydCB7CisJcmV0dXJuICZUQnVmZmVyZWRUcmFuc3BvcnR7CisJCVJlYWRXcml0ZXI6IGJ1ZmlvLlJlYWRXcml0ZXJ7CisJCQlSZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlclNpemUodHJhbnMsIGJ1ZmZlclNpemUpLAorCQkJV3JpdGVyOiBidWZpby5OZXdXcml0ZXJTaXplKHRyYW5zLCBidWZmZXJTaXplKSwKKwkJfSwKKwkJdHA6IHRyYW5zLAorCX0KK30KKworZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gcC50cC5Jc09wZW4oKQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIE9wZW4oKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIHAudHAuT3BlbigpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgQ2xvc2UoKSAoZXJyIGVycm9yKSB7CisJcmV0dXJuIHAudHAuQ2xvc2UoKQorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFJlYWQoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJbiwgZXJyIDo9IHAuUmVhZFdyaXRlci5SZWFkKGIpCisJaWYgZXJyICE9IG5pbCB7CisJCXAuUmVhZFdyaXRlci5SZWFkZXIuUmVzZXQocC50cCkKKwl9CisJcmV0dXJuIG4sIGVycgorfQorCitmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFdyaXRlKGIgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLlJlYWRXcml0ZXIuV3JpdGUoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5SZWFkV3JpdGVyLldyaXRlci5SZXNldChwLnRwKQorCX0KKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCWlmIGVyciA6PSBwLlJlYWRXcml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJCXAuUmVhZFdyaXRlci5Xcml0ZXIuUmVzZXQocC50cCkKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gcC50cC5GbHVzaChjdHgpCit9CisKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCXJldHVybiBwLnRwLlJlbWFpbmluZ0J5dGVzKCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZWMwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0QnVmZmVyZWRUcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgMTAyNDApCisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NsaWVudC5nbyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NzkxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NsaWVudC5nbwpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJmbXQiCispCisKK3R5cGUgVENsaWVudCBpbnRlcmZhY2UgeworCUNhbGwoY3R4IGNvbnRleHQuQ29udGV4dCwgbWV0aG9kIHN0cmluZywgYXJncywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yCit9CisKK3R5cGUgVFN0YW5kYXJkQ2xpZW50IHN0cnVjdCB7CisJc2VxSWQgICAgICAgIGludDMyCisJaXByb3QsIG9wcm90IFRQcm90b2NvbAorfQorCisvLyBUU3RhbmRhcmRDbGllbnQgaW1wbGVtZW50cyBUQ2xpZW50LCBhbmQgdXNlcyB0aGUgc3RhbmRhcmQgbWVzc2FnZSBmb3JtYXQgZm9yIFRocmlmdC4KKy8vIEl0IGlzIG5vdCBzYWZlIGZvciBjb25jdXJyZW50IHVzZS4KK2Z1bmMgTmV3VFN0YW5kYXJkQ2xpZW50KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sIFRQcm90b2NvbCkgKlRTdGFuZGFyZENsaWVudCB7CisJcmV0dXJuICZUU3RhbmRhcmRDbGllbnR7CisJCWlwcm90OiBpbnB1dFByb3RvY29sLAorCQlvcHJvdDogb3V0cHV0UHJvdG9jb2wsCisJfQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFNlbmQoY3R4IGNvbnRleHQuQ29udGV4dCwgb3Byb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgYXJncyBUU3RydWN0KSBlcnJvciB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luKG1ldGhvZCwgQ0FMTCwgc2VxSWQpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gYXJncy5Xcml0ZShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcmV0dXJuIG9wcm90LkZsdXNoKGN0eCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBSZWN2KGlwcm90IFRQcm90b2NvbCwgc2VxSWQgaW50MzIsIG1ldGhvZCBzdHJpbmcsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJck1ldGhvZCwgclR5cGVJZCwgclNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwlpZiBtZXRob2QgIT0gck1ldGhvZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oV1JPTkdfTUVUSE9EX05BTUUsIGZtdC5TcHJpbnRmKCIlczogd3JvbmcgbWV0aG9kIG5hbWUiLCBtZXRob2QpKQorCX0gZWxzZSBpZiBzZXFJZCAhPSByU2VxSWQgeworCQlyZXR1cm4gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKEJBRF9TRVFVRU5DRV9JRCwgZm10LlNwcmludGYoIiVzOiBvdXQgb2Ygb3JkZXIgc2VxdWVuY2UgcmVzcG9uc2UiLCBtZXRob2QpKQorCX0gZWxzZSBpZiByVHlwZUlkID09IEVYQ0VQVElPTiB7CisJCXZhciBleGNlcHRpb24gdEFwcGxpY2F0aW9uRXhjZXB0aW9uCisJCWlmIGVyciA6PSBleGNlcHRpb24uUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisKKwkJaWYgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisKKwkJcmV0dXJuICZleGNlcHRpb24KKwl9IGVsc2UgaWYgclR5cGVJZCAhPSBSRVBMWSB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oSU5WQUxJRF9NRVNTQUdFX1RZUEVfRVhDRVBUSU9OLCBmbXQuU3ByaW50ZigiJXM6IGludmFsaWQgbWVzc2FnZSB0eXBlIiwgbWV0aG9kKSkKKwl9CisKKwlpZiBlcnIgOj0gcmVzdWx0LlJlYWQoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCXJldHVybiBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpCit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IgeworCXAuc2VxSWQrKworCXNlcUlkIDo9IHAuc2VxSWQKKworCWlmIGVyciA6PSBwLlNlbmQoY3R4LCBwLm9wcm90LCBzZXFJZCwgbWV0aG9kLCBhcmdzKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisKKwkvLyBtZXRob2QgaXMgb25ld2F5CisJaWYgcmVzdWx0ID09IG5pbCB7CisJCXJldHVybiBuaWwKKwl9CisKKwlyZXR1cm4gcC5SZWN2KHAuaXByb3QsIHNlcUlkLCBtZXRob2QsIHJlc3VsdCkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbW1vbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNTk3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NvbW1vbl90ZXN0LmdvCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJjb250ZXh0IgorCit0eXBlIG1vY2tQcm9jZXNzb3Igc3RydWN0IHsKKwlQcm9jZXNzRnVuYyBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKK30KKworZnVuYyAobSAqbW9ja1Byb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwlyZXR1cm4gbS5Qcm9jZXNzRnVuYyhpbiwgb3V0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDBkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KQEAgLTAsMCArMSw4MTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmluYXJ5IgorCSJmbXQiCisJImlvIgorCSJtYXRoIgorKQorCitjb25zdCAoCisJQ09NUEFDVF9QUk9UT0NPTF9JRCAgICAgICA9IDB4MDgyCisJQ09NUEFDVF9WRVJTSU9OICAgICAgICAgICA9IDEKKwlDT01QQUNUX1ZFUlNJT05fTUFTSyAgICAgID0gMHgxZgorCUNPTVBBQ1RfVFlQRV9NQVNLICAgICAgICAgPSAweDBFMAorCUNPTVBBQ1RfVFlQRV9CSVRTICAgICAgICAgPSAweDA3CisJQ09NUEFDVF9UWVBFX1NISUZUX0FNT1VOVCA9IDUKKykKKwordHlwZSB0Q29tcGFjdFR5cGUgYnl0ZQorCitjb25zdCAoCisJQ09NUEFDVF9CT09MRUFOX1RSVUUgID0gMHgwMQorCUNPTVBBQ1RfQk9PTEVBTl9GQUxTRSA9IDB4MDIKKwlDT01QQUNUX0JZVEUgICAgICAgICAgPSAweDAzCisJQ09NUEFDVF9JMTYgICAgICAgICAgID0gMHgwNAorCUNPTVBBQ1RfSTMyICAgICAgICAgICA9IDB4MDUKKwlDT01QQUNUX0k2NCAgICAgICAgICAgPSAweDA2CisJQ09NUEFDVF9ET1VCTEUgICAgICAgID0gMHgwNworCUNPTVBBQ1RfQklOQVJZICAgICAgICA9IDB4MDgKKwlDT01QQUNUX0xJU1QgICAgICAgICAgPSAweDA5CisJQ09NUEFDVF9TRVQgICAgICAgICAgID0gMHgwQQorCUNPTVBBQ1RfTUFQICAgICAgICAgICA9IDB4MEIKKwlDT01QQUNUX1NUUlVDVCAgICAgICAgPSAweDBDCispCisKK3ZhciAoCisJdHR5cGVUb0NvbXBhY3RUeXBlIG1hcFtUVHlwZV10Q29tcGFjdFR5cGUKKykKKworZnVuYyBpbml0KCkgeworCXR0eXBlVG9Db21wYWN0VHlwZSA9IG1hcFtUVHlwZV10Q29tcGFjdFR5cGV7CisJCVNUT1A6ICAgU1RPUCwKKwkJQk9PTDogICBDT01QQUNUX0JPT0xFQU5fVFJVRSwKKwkJQllURTogICBDT01QQUNUX0JZVEUsCisJCUkxNjogICAgQ09NUEFDVF9JMTYsCisJCUkzMjogICAgQ09NUEFDVF9JMzIsCisJCUk2NDogICAgQ09NUEFDVF9JNjQsCisJCURPVUJMRTogQ09NUEFDVF9ET1VCTEUsCisJCVNUUklORzogQ09NUEFDVF9CSU5BUlksCisJCUxJU1Q6ICAgQ09NUEFDVF9MSVNULAorCQlTRVQ6ICAgIENPTVBBQ1RfU0VULAorCQlNQVA6ICAgIENPTVBBQ1RfTUFQLAorCQlTVFJVQ1Q6IENPTVBBQ1RfU1RSVUNULAorCX0KK30KKwordHlwZSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkgKlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5e30KK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7CisJcmV0dXJuIE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCit9CisKK3R5cGUgVENvbXBhY3RQcm90b2NvbCBzdHJ1Y3QgeworCXRyYW5zICAgICAgICAgVFJpY2hUcmFuc3BvcnQKKwlvcmlnVHJhbnNwb3J0IFRUcmFuc3BvcnQKKworCS8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisJLy8gc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKwlsYXN0RmllbGQgICBbXWludAorCWxhc3RGaWVsZElkIGludAorCisJLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisJLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorCWJvb2xlYW5GaWVsZE5hbWUgICAgc3RyaW5nCisJYm9vbGVhbkZpZWxkSWQgICAgICBpbnQxNgorCWJvb2xlYW5GaWVsZFBlbmRpbmcgYm9vbAorCisJLy8gSWYgd2UgcmVhZCBhIGZpZWxkIGhlYWRlciwgYW5kIGl0J3MgYSBib29sZWFuIGZpZWxkLCBzYXZlIHRoZSBib29sZWFuCisJLy8gdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCisJYm9vbFZhbHVlICAgICAgICAgIGJvb2wKKwlib29sVmFsdWVJc05vdE51bGwgYm9vbAorCWJ1ZmZlciAgICAgICAgICAgICBbNjRdYnl0ZQorfQorCisvLyBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sIGdpdmVuIGEgVFRyYW5zcG9ydAorZnVuYyBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpICpUQ29tcGFjdFByb3RvY29sIHsKKwlwIDo9ICZUQ29tcGFjdFByb3RvY29se29yaWdUcmFuc3BvcnQ6IHRyYW5zLCBsYXN0RmllbGQ6IFtdaW50e319CisJaWYgZXQsIG9rIDo9IHRyYW5zLihUUmljaFRyYW5zcG9ydCk7IG9rIHsKKwkJcC50cmFucyA9IGV0CisJfSBlbHNlIHsKKwkJcC50cmFucyA9IE5ld1RSaWNoVHJhbnNwb3J0KHRyYW5zKQorCX0KKworCXJldHVybiBwCisKK30KKworLy8KKy8vIFB1YmxpYyBXcml0aW5nIG1ldGhvZHMuCisvLworCisvLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisvLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMikgZXJyb3IgeworCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChDT01QQUNUX1BST1RPQ09MX0lEKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJZXJyID0gcC53cml0ZUJ5dGVEaXJlY3QoKENPTVBBQ1RfVkVSU0lPTiAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLKSB8ICgoYnl0ZSh0eXBlSWQpIDw8IENPTVBBQ1RfVFlQRV9TSElGVF9BTU9VTlQpICYgQ09NUEFDVF9UWVBFX01BU0spKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJXywgZXJyID0gcC53cml0ZVZhcmludDMyKHNlcWlkKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpCisJcmV0dXJuIGUKKworfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKy8vIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorLy8gc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBlcnJvciB7CisJcC5sYXN0RmllbGQgPSBhcHBlbmQocC5sYXN0RmllbGQsIHAubGFzdEZpZWxkSWQpCisJcC5sYXN0RmllbGRJZCA9IDAKKwlyZXR1cm4gbmlsCit9CisKKy8vIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisvLyB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIHBvcCB0aGUgbGFzdCBmaWVsZCBmcm9tIHRoZSBjdXJyZW50IHN0cnVjdCBvZmYKKy8vIG9mIHRoZSBmaWVsZCBzdGFjay4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCXAubGFzdEZpZWxkSWQgPSBwLmxhc3RGaWVsZFtsZW4ocC5sYXN0RmllbGQpLTFdCisJcC5sYXN0RmllbGQgPSBwLmxhc3RGaWVsZFs6bGVuKHAubGFzdEZpZWxkKS0xXQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvciB7CisJaWYgdHlwZUlkID09IEJPT0wgeworCQkvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgorCQlwLmJvb2xlYW5GaWVsZE5hbWUsIHAuYm9vbGVhbkZpZWxkSWQsIHAuYm9vbGVhbkZpZWxkUGVuZGluZyA9IG5hbWUsIGlkLCB0cnVlCisJCXJldHVybiBuaWwKKwl9CisJXywgZXJyIDo9IHAud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSwgdHlwZUlkLCBpZCwgMHhGRikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKKy8vICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisvLyBib29sZWFuIGZpZWxkIGNhc2UuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNiwgdHlwZU92ZXJyaWRlIGJ5dGUpIChpbnQsIGVycm9yKSB7CisJLy8gc2hvcnQgbGFzdEZpZWxkID0gbGFzdEZpZWxkXy5wb3AoKTsKKworCS8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKwl2YXIgdHlwZVRvV3JpdGUgYnl0ZQorCWlmIHR5cGVPdmVycmlkZSA9PSAweEZGIHsKKwkJdHlwZVRvV3JpdGUgPSBieXRlKHAuZ2V0Q29tcGFjdFR5cGUodHlwZUlkKSkKKwl9IGVsc2UgeworCQl0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZQorCX0KKwkvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKwlmaWVsZElkIDo9IGludChpZCkKKwl3cml0dGVuIDo9IDAKKwlpZiBmaWVsZElkID4gcC5sYXN0RmllbGRJZCAmJiBmaWVsZElkLXAubGFzdEZpZWxkSWQgPD0gMTUgeworCQkvLyB3cml0ZSB0aGVtIHRvZ2V0aGVyCisJCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChieXRlKChmaWVsZElkLXAubGFzdEZpZWxkSWQpPDw0KSB8IHR5cGVUb1dyaXRlKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCX0gZWxzZSB7CisJCS8vIHdyaXRlIHRoZW0gc2VwYXJhdGUKKwkJZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHR5cGVUb1dyaXRlKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiAwLCBlcnIKKwkJfQorCQllcnIgPSBwLldyaXRlSTE2KGlkKQorCQl3cml0dGVuID0gMSArIDIKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgZXJyCisJCX0KKwl9CisKKwlwLmxhc3RGaWVsZElkID0gZmllbGRJZAorCS8vIHAubGFzdEZpZWxkLlB1c2goZmllbGQuaWQpOworCXJldHVybiB3cml0dGVuLCBuaWwKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeworCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChTVE9QKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBzaXplID09IDAgeworCQllcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoMCkKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCV8sIGVyciA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIoc2l6ZSkpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwllcnIgPSBwLndyaXRlQnl0ZURpcmVjdChieXRlKHAuZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkpPDw0IHwgYnl0ZShwLmdldENvbXBhY3RUeXBlKHZhbHVlVHlwZSkpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFdyaXRlIGEgbGlzdCBoZWFkZXIuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gV3JpdGUgYSBzZXQgaGVhZGVyLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgZXJyb3IgeworCXYgOj0gYnl0ZShDT01QQUNUX0JPT0xFQU5fRkFMU0UpCisJaWYgdmFsdWUgeworCQl2ID0gYnl0ZShDT01QQUNUX0JPT0xFQU5fVFJVRSkKKwl9CisJaWYgcC5ib29sZWFuRmllbGRQZW5kaW5nIHsKKwkJLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisJCV8sIGVyciA6PSBwLndyaXRlRmllbGRCZWdpbkludGVybmFsKHAuYm9vbGVhbkZpZWxkTmFtZSwgQk9PTCwgcC5ib29sZWFuRmllbGRJZCwgdikKKwkJcC5ib29sZWFuRmllbGRQZW5kaW5nID0gZmFsc2UKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCS8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlLgorCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCh2KQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJ5dGUodmFsdWUgaW50OCkgZXJyb3IgeworCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChieXRlKHZhbHVlKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlSTE2KHZhbHVlIGludDE2KSBlcnJvciB7CisJXywgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihwLmludDMyVG9aaWd6YWcoaW50MzIodmFsdWUpKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYW4gaTMyIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvciB7CisJXywgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihwLmludDMyVG9aaWd6YWcodmFsdWUpKQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCisvLyBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJNjQodmFsdWUgaW50NjQpIGVycm9yIHsKKwlfLCBlcnIgOj0gcC53cml0ZVZhcmludDY0KHAuaW50NjRUb1ppZ3phZyh2YWx1ZSkpCisJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCit9CisKKy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBlcnJvciB7CisJYnVmIDo9IHAuYnVmZmVyWzA6OF0KKwliaW5hcnkuTGl0dGxlRW5kaWFuLlB1dFVpbnQ2NChidWYsIG1hdGguRmxvYXQ2NGJpdHModmFsdWUpKQorCV8sIGVyciA6PSBwLnRyYW5zLldyaXRlKGJ1ZikKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKK30KKworLy8gV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlU3RyaW5nKHZhbHVlIHN0cmluZykgZXJyb3IgeworCV8sIGUgOj0gcC53cml0ZVZhcmludDMyKGludDMyKGxlbih2YWx1ZSkpKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW4odmFsdWUpID4gMCB7CisJfQorCV8sIGUgPSBwLnRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQorCXJldHVybiBlCit9CisKKy8vIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVCaW5hcnkoYmluIFtdYnl0ZSkgZXJyb3IgeworCV8sIGUgOj0gcC53cml0ZVZhcmludDMyKGludDMyKGxlbihiaW4pKSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgbGVuKGJpbikgPiAwIHsKKwkJXywgZSA9IHAudHJhbnMuV3JpdGUoYmluKQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBuaWwKK30KKworLy8KKy8vIFJlYWRpbmcgbWV0aG9kcy4KKy8vCisKKy8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgZXJyb3IpIHsKKworCXByb3RvY29sSWQsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJaWYgcHJvdG9jb2xJZCAhPSBDT01QQUNUX1BST1RPQ09MX0lEIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBwcm90b2NvbCBpZCAlMDJ4IGJ1dCBnb3QgJTAyeCIsIENPTVBBQ1RfUFJPVE9DT0xfSUQsIHByb3RvY29sSWQpCisJCXJldHVybiAiIiwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoQkFEX1ZFUlNJT04sIGUpCisJfQorCisJdmVyc2lvbkFuZFR5cGUsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJdmVyc2lvbiA6PSB2ZXJzaW9uQW5kVHlwZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLCisJdHlwZUlkID0gVE1lc3NhZ2VUeXBlKCh2ZXJzaW9uQW5kVHlwZSA+PiBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9CSVRTKQorCWlmIHZlcnNpb24gIT0gQ09NUEFDVF9WRVJTSU9OIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCB2ZXJzaW9uICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9WRVJTSU9OLCB2ZXJzaW9uKQorCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShCQURfVkVSU0lPTiwgZSkKKwkJcmV0dXJuCisJfQorCXNlcUlkLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCWVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQlyZXR1cm4KKwl9CisJbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCkKKwlyZXR1cm4KK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKy8vIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbnRvIHRoZSBmaWVsZCBzdGFjay4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIGVycm9yKSB7CisJcC5sYXN0RmllbGQgPSBhcHBlbmQocC5sYXN0RmllbGQsIHAubGFzdEZpZWxkSWQpCisJcC5sYXN0RmllbGRJZCA9IDAKKwlyZXR1cm4KK30KKworLy8gRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKKy8vIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwkvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIHJlYWQgb2ZmIHRoZSB3aXJlLgorCXAubGFzdEZpZWxkSWQgPSBwLmxhc3RGaWVsZFtsZW4ocC5sYXN0RmllbGQpLTFdCisJcC5sYXN0RmllbGQgPSBwLmxhc3RGaWVsZFs6bGVuKHAubGFzdEZpZWxkKS0xXQorCXJldHVybiBuaWwKK30KKworLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNiwgZXJyIGVycm9yKSB7CisJdCwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwkvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisJaWYgKHQgJiAweDBmKSA9PSBTVE9QIHsKKwkJcmV0dXJuICIiLCBTVE9QLCAwLCBuaWwKKwl9CisKKwkvLyBtYXNrIG9mZiB0aGUgNCBNU0Igb2YgdGhlIHR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisJbW9kaWZpZXIgOj0gaW50MTYoKHQgJiAweGYwKSA+PiA0KQorCWlmIG1vZGlmaWVyID09IDAgeworCQkvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCisJCWlkLCBlcnIgPSBwLlJlYWRJMTYoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybgorCQl9CisJfSBlbHNlIHsKKwkJLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgcmVhZCBmaWVsZCBpZC4KKwkJaWQgPSBpbnQxNihwLmxhc3RGaWVsZElkKSArIG1vZGlmaWVyCisJfQorCXR5cGVJZCwgZSA6PSBwLmdldFRUeXBlKHRDb21wYWN0VHlwZSh0ICYgMHgwZikpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCisJLy8gaWYgdGhpcyBoYXBwZW5zIHRvIGJlIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUKKwlpZiBwLmlzQm9vbFR5cGUodCkgeworCQkvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KKwkJcC5ib29sVmFsdWUgPSAoYnl0ZSh0KSYweDBmID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFKQorCQlwLmJvb2xWYWx1ZUlzTm90TnVsbCA9IHRydWUKKwl9CisKKwkvLyBwdXNoIHRoZSBuZXcgZmllbGQgb250byB0aGUgZmllbGQgc3RhY2sgc28gd2UgY2FuIGtlZXAgdGhlIGRlbHRhcyBnb2luZy4KKwlwLmxhc3RGaWVsZElkID0gaW50KGlkKQorCXJldHVybgorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCisvLyBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgcmVhZGluZyB0aGUga2V5CisvLyBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorLy8gImNvcnJlY3QiIHR5cGVzLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCXNpemUzMiwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCWlmIHNpemUzMiA8IDAgeworCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQlyZXR1cm4KKwl9CisJc2l6ZSA9IGludChzaXplMzIpCisKKwlrZXlBbmRWYWx1ZVR5cGUgOj0gYnl0ZShTVE9QKQorCWlmIHNpemUgIT0gMCB7CisJCWtleUFuZFZhbHVlVHlwZSwgZXJyID0gcC5yZWFkQnl0ZURpcmVjdCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuCisJCX0KKwl9CisJa2V5VHlwZSwgXyA9IHAuZ2V0VFR5cGUodENvbXBhY3RUeXBlKGtleUFuZFZhbHVlVHlwZSA+PiA0KSkKKwl2YWx1ZVR5cGUsIF8gPSBwLmdldFRUeXBlKHRDb21wYWN0VHlwZShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKQorCXJldHVybgorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWFwRW5kKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworLy8gUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisvLyBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKy8vIHRydWUgc2l6ZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwlzaXplX2FuZF90eXBlLCBlcnIgOj0gcC5yZWFkQnl0ZURpcmVjdCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKwlzaXplID0gaW50KChzaXplX2FuZF90eXBlID4+IDQpICYgMHgwZikKKwlpZiBzaXplID09IDE1IHsKKwkJc2l6ZTIsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCQlpZiBlICE9IG5pbCB7CisJCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCXJldHVybgorCQl9CisJCWlmIHNpemUyIDwgMCB7CisJCQllcnIgPSBpbnZhbGlkRGF0YUxlbmd0aAorCQkJcmV0dXJuCisJCX0KKwkJc2l6ZSA9IGludChzaXplMikKKwl9CisJZWxlbVR5cGUsIGUgOj0gcC5nZXRUVHlwZSh0Q29tcGFjdFR5cGUoc2l6ZV9hbmRfdHlwZSkpCisJaWYgZSAhPSBuaWwgeworCQllcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJcmV0dXJuCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTGlzdEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBzZXQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNldCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCisvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisvLyB0cnVlIHNpemUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC5SZWFkTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFNldEVuZCgpIGVycm9yIHsgcmV0dXJuIG5pbCB9CisKKy8vIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKy8vIGFscmVhZHkgaGF2ZSBiZWVuIHJlYWQgZHVyaW5nIHJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisvLyBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIHJlYWQgYSBieXRlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEJvb2woKSAodmFsdWUgYm9vbCwgZXJyIGVycm9yKSB7CisJaWYgcC5ib29sVmFsdWVJc05vdE51bGwgeworCQlwLmJvb2xWYWx1ZUlzTm90TnVsbCA9IGZhbHNlCisJCXJldHVybiBwLmJvb2xWYWx1ZSwgbmlsCisJfQorCXYsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwlyZXR1cm4gdiA9PSBDT01QQUNUX0JPT0xFQU5fVFJVRSwgZXJyCit9CisKKy8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAucmVhZEJ5dGVEaXJlY3QoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJcmV0dXJuIGludDgodiksIGVycgorfQorCisvLyBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJMzIoKQorCXJldHVybiBpbnQxNih2KSwgZXJyCit9CisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKSB7CisJdiwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXZhbHVlID0gcC56aWd6YWdUb0ludDMyKHYpCisJcmV0dXJuIHZhbHVlLCBuaWwKK30KKworLy8gUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgZXJyb3IpIHsKKwl2LCBlIDo9IHAucmVhZFZhcmludDY0KCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJdmFsdWUgPSBwLnppZ3phZ1RvSW50NjQodikKKwlyZXR1cm4gdmFsdWUsIG5pbAorfQorCisvLyBObyBtYWdpYyBoZXJlIC0ganVzdCByZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIGVycm9yKSB7CisJbG9uZ0JpdHMgOj0gcC5idWZmZXJbMDo4XQorCV8sIGUgOj0gaW8uUmVhZEZ1bGwocC50cmFucywgbG9uZ0JpdHMpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gMC4wLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJcmV0dXJuIG1hdGguRmxvYXQ2NGZyb21iaXRzKHAuYnl0ZXNUb1VpbnQ2NChsb25nQml0cykpLCBuaWwKK30KKworLy8gUmVhZHMgYSBbXWJ5dGUgKHZpYSByZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlsZW5ndGgsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJaWYgbGVuZ3RoIDwgMCB7CisJCXJldHVybiAiIiwgaW52YWxpZERhdGFMZW5ndGgKKwl9CisKKwlpZiBsZW5ndGggPT0gMCB7CisJCXJldHVybiAiIiwgbmlsCisJfQorCXZhciBidWYgW11ieXRlCisJaWYgbGVuZ3RoIDw9IGludDMyKGxlbihwLmJ1ZmZlcikpIHsKKwkJYnVmID0gcC5idWZmZXJbMDpsZW5ndGhdCisJfSBlbHNlIHsKKwkJYnVmID0gbWFrZShbXWJ5dGUsIGxlbmd0aCkKKwl9CisJXywgZSA9IGlvLlJlYWRGdWxsKHAudHJhbnMsIGJ1ZikKKwlyZXR1cm4gc3RyaW5nKGJ1ZiksIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorfQorCisvLyBSZWFkIGEgW11ieXRlIGZyb20gdGhlIHdpcmUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIGVycm9yKSB7CisJbGVuZ3RoLCBlIDo9IHAucmVhZFZhcmludDMyKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBsZW5ndGggPT0gMCB7CisJCXJldHVybiBbXWJ5dGV7fSwgbmlsCisJfQorCWlmIGxlbmd0aCA8IDAgeworCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAorCX0KKworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuZ3RoKQorCV8sIGUgPSBpby5SZWFkRnVsbChwLnRyYW5zLCBidWYpCisJcmV0dXJuIGJ1ZiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goY3R4KSkKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgeworCXJldHVybiBwLm9yaWdUcmFuc3BvcnQKK30KKworLy8KKy8vIEludGVybmFsIHdyaXRpbmcgbWV0aG9kcworLy8KKworLy8gQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorLy8gdGhlIHdpcmUgZGlmZmVyIG9ubHkgYnkgdGhlIHR5cGUgaW5kaWNhdG9yLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSAoaW50LCBlcnJvcikgeworCWlmIHNpemUgPD0gMTQgeworCQlyZXR1cm4gMSwgcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShpbnQzMihzaXplPDw0KSB8IGludDMyKHAuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKSkpCisJfQorCWVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCgweGYwIHwgYnl0ZShwLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBlcnIKKwl9CisJbSwgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihzaXplKSkKKwlyZXR1cm4gMSArIG0sIGVycgorfQorCisvLyBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorLy8gVE9ETyhwb21hY2spOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIHdyaXRlVmFyaW50NjQ/CitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZVZhcmludDMyKG4gaW50MzIpIChpbnQsIGVycm9yKSB7CisJaTMyYnVmIDo9IHAuYnVmZmVyWzA6NV0KKwlpZHggOj0gMAorCWZvciB7CisJCWlmIChuICYgXjB4N0YpID09IDAgeworCQkJaTMyYnVmW2lkeF0gPSBieXRlKG4pCisJCQlpZHgrKworCQkJLy8gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZShuKSk7CisJCQlicmVhaworCQkJLy8gcmV0dXJuOworCQl9IGVsc2UgeworCQkJaTMyYnVmW2lkeF0gPSBieXRlKChuICYgMHg3RikgfCAweDgwKQorCQkJaWR4KysKKwkJCS8vIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoKChuICYgMHg3RikgfCAweDgwKSkpOworCQkJdSA6PSB1aW50MzIobikKKwkJCW4gPSBpbnQzMih1ID4+IDcpCisJCX0KKwl9CisJcmV0dXJuIHAudHJhbnMuV3JpdGUoaTMyYnVmWzA6aWR4XSkKK30KKworLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZVZhcmludDY0KG4gaW50NjQpIChpbnQsIGVycm9yKSB7CisJdmFyaW50NjRvdXQgOj0gcC5idWZmZXJbMDoxMF0KKwlpZHggOj0gMAorCWZvciB7CisJCWlmIChuICYgXjB4N0YpID09IDAgeworCQkJdmFyaW50NjRvdXRbaWR4XSA9IGJ5dGUobikKKwkJCWlkeCsrCisJCQlicmVhaworCQl9IGVsc2UgeworCQkJdmFyaW50NjRvdXRbaWR4XSA9IGJ5dGUoKG4gJiAweDdGKSB8IDB4ODApCisJCQlpZHgrKworCQkJdSA6PSB1aW50NjQobikKKwkJCW4gPSBpbnQ2NCh1ID4+IDcpCisJCX0KKwl9CisJcmV0dXJuIHAudHJhbnMuV3JpdGUodmFyaW50NjRvdXRbMDppZHhdKQorfQorCisvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisvLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpbnQ2NFRvWmlnemFnKGwgaW50NjQpIGludDY0IHsKKwlyZXR1cm4gKGwgPDwgMSkgXiAobCA+PiA2MykKK30KKworLy8gQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorLy8gcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgaW50MzJUb1ppZ3phZyhuIGludDMyKSBpbnQzMiB7CisJcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpCit9CisKK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIGZpeGVkVWludDY0VG9CeXRlcyhuIHVpbnQ2NCwgYnVmIFtdYnl0ZSkgeworCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgbikKK30KKworZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZml4ZWRJbnQ2NFRvQnl0ZXMobiBpbnQ2NCwgYnVmIFtdYnl0ZSkgeworCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgdWludDY0KG4pKQorfQorCisvLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byB3cml0ZSBhIGJ5dGUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZUJ5dGVEaXJlY3QoYiBieXRlKSBlcnJvciB7CisJcmV0dXJuIHAudHJhbnMuV3JpdGVCeXRlKGIpCit9CisKKy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVJbnRBc0J5dGVEaXJlY3QobiBpbnQpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIDEsIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUobikpCit9CisKKy8vCisvLyBJbnRlcm5hbCByZWFkaW5nIG1ldGhvZHMKKy8vCisKKy8vIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorLy8gaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgcmVhZFZhcmludDMyKCkgKGludDMyLCBlcnJvcikgeworCS8vIGlmIHRoZSB3aXJlIGNvbnRhaW5zIHRoZSByaWdodCBzdHVmZiwgdGhpcyB3aWxsIGp1c3QgdHJ1bmNhdGUgdGhlIGk2NCB3ZQorCS8vIHJlYWQgYW5kIGdldCB1cyB0aGUgcmlnaHQgc2lnbi4KKwl2LCBlcnIgOj0gcC5yZWFkVmFyaW50NjQoKQorCXJldHVybiBpbnQzMih2KSwgZXJyCit9CisKKy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKKy8vIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIHJlYWQgdXAgdG8gMTAgYnl0ZXMuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkVmFyaW50NjQoKSAoaW50NjQsIGVycm9yKSB7CisJc2hpZnQgOj0gdWludCgwKQorCXJlc3VsdCA6PSBpbnQ2NCgwKQorCWZvciB7CisJCWIsIGVyciA6PSBwLnJlYWRCeXRlRGlyZWN0KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgZXJyCisJCX0KKwkJcmVzdWx0IHw9IGludDY0KGImMHg3ZikgPDwgc2hpZnQKKwkJaWYgKGIgJiAweDgwKSAhPSAweDgwIHsKKwkJCWJyZWFrCisJCX0KKwkJc2hpZnQgKz0gNworCX0KKwlyZXR1cm4gcmVzdWx0LCBuaWwKK30KKworLy8gUmVhZCBhIGJ5dGUsIHVubGlrZSBSZWFkQnl0ZSB0aGF0IHJlYWRzIFRocmlmdC1ieXRlIHRoYXQgaXMgaTguCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkQnl0ZURpcmVjdCgpIChieXRlLCBlcnJvcikgeworCXJldHVybiBwLnRyYW5zLlJlYWRCeXRlKCkKK30KKworLy8KKy8vIGVuY29kaW5nIGhlbHBlcnMKKy8vCisKKy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KK2Z1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHppZ3phZ1RvSW50MzIobiBpbnQzMikgaW50MzIgeworCXUgOj0gdWludDMyKG4pCisJcmV0dXJuIGludDMyKHU+PjEpIF4gLShuICYgMSkKK30KKworLy8gQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB6aWd6YWdUb0ludDY0KG4gaW50NjQpIGludDY0IHsKKwl1IDo9IHVpbnQ2NChuKQorCXJldHVybiBpbnQ2NCh1Pj4xKSBeIC0obiAmIDEpCit9CisKKy8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorLy8gb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBieXRlc1RvSW50NjQoYiBbXWJ5dGUpIGludDY0IHsKKwlyZXR1cm4gaW50NjQoYmluYXJ5LkxpdHRsZUVuZGlhbi5VaW50NjQoYikpCit9CisKKy8vIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorLy8gb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKy8vIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBieXRlc1RvVWludDY0KGIgW11ieXRlKSB1aW50NjQgeworCXJldHVybiBiaW5hcnkuTGl0dGxlRW5kaWFuLlVpbnQ2NChiKQorfQorCisvLworLy8gdHlwZSB0ZXN0aW5nIGFuZCBjb252ZXJ0aW5nCisvLworCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpc0Jvb2xUeXBlKGIgYnl0ZSkgYm9vbCB7CisJcmV0dXJuIChiJjB4MGYpID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFIHx8IChiJjB4MGYpID09IENPTVBBQ1RfQk9PTEVBTl9GQUxTRQorfQorCisvLyBHaXZlbiBhIHRDb21wYWN0VHlwZSBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworLy8gVFR5cGUgdmFsdWUuCitmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBnZXRUVHlwZSh0IHRDb21wYWN0VHlwZSkgKFRUeXBlLCBlcnJvcikgeworCXN3aXRjaCBieXRlKHQpICYgMHgwZiB7CisJY2FzZSBTVE9QOgorCQlyZXR1cm4gU1RPUCwgbmlsCisJY2FzZSBDT01QQUNUX0JPT0xFQU5fRkFMU0UsIENPTVBBQ1RfQk9PTEVBTl9UUlVFOgorCQlyZXR1cm4gQk9PTCwgbmlsCisJY2FzZSBDT01QQUNUX0JZVEU6CisJCXJldHVybiBCWVRFLCBuaWwKKwljYXNlIENPTVBBQ1RfSTE2OgorCQlyZXR1cm4gSTE2LCBuaWwKKwljYXNlIENPTVBBQ1RfSTMyOgorCQlyZXR1cm4gSTMyLCBuaWwKKwljYXNlIENPTVBBQ1RfSTY0OgorCQlyZXR1cm4gSTY0LCBuaWwKKwljYXNlIENPTVBBQ1RfRE9VQkxFOgorCQlyZXR1cm4gRE9VQkxFLCBuaWwKKwljYXNlIENPTVBBQ1RfQklOQVJZOgorCQlyZXR1cm4gU1RSSU5HLCBuaWwKKwljYXNlIENPTVBBQ1RfTElTVDoKKwkJcmV0dXJuIExJU1QsIG5pbAorCWNhc2UgQ09NUEFDVF9TRVQ6CisJCXJldHVybiBTRVQsIG5pbAorCWNhc2UgQ09NUEFDVF9NQVA6CisJCXJldHVybiBNQVAsIG5pbAorCWNhc2UgQ09NUEFDVF9TVFJVQ1Q6CisJCXJldHVybiBTVFJVQ1QsIG5pbAorCX0KKwlyZXR1cm4gU1RPUCwgVEV4Y2VwdGlvbihmbXQuRXJyb3JmKCJkb24ndCBrbm93IHdoYXQgdHlwZTogJXYiLCB0JjB4MGYpKQorfQorCisvLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZ2V0Q29tcGFjdFR5cGUodCBUVHlwZSkgdENvbXBhY3RUeXBlIHsKKwlyZXR1cm4gdHR5cGVUb0NvbXBhY3RUeXBlW3RdCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Zjc3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RSZWFkV3JpdGVDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CisJUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCisKKwl0cmFuc3BvcnRzIDo9IFtdVFRyYW5zcG9ydHsKKwkJTmV3VE1lbW9yeUJ1ZmZlcigpLAorCQlOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDE2Mzg0KSkpLAorCQlOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksCisJfQorCisJemxpYjAsIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpLCAwKQorCXpsaWI2LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgNikKKwl6bGliOSwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdURnJhbWVkVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSksIDkpCisJdHJhbnNwb3J0cyA9IGFwcGVuZCh0cmFuc3BvcnRzLCB6bGliMCwgemxpYjYsIHpsaWI5KQorCisJZm9yIF8sIHRyYW5zIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQlwIDo9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJvb2wodCwgcCwgdHJhbnMpCisJCXAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTMyKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlU3RyaW5nKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvIGIvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNWMxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2NvbnRleHQuZ28KQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OTQzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImxvZyIKKykKKwordHlwZSBURGVidWdQcm90b2NvbCBzdHJ1Y3QgeworCURlbGVnYXRlICBUUHJvdG9jb2wKKwlMb2dQcmVmaXggc3RyaW5nCit9CisKK3R5cGUgVERlYnVnUHJvdG9jb2xGYWN0b3J5IHN0cnVjdCB7CisJVW5kZXJseWluZyBUUHJvdG9jb2xGYWN0b3J5CisJTG9nUHJlZml4ICBzdHJpbmcKK30KKworZnVuYyBOZXdURGVidWdQcm90b2NvbEZhY3RvcnkodW5kZXJseWluZyBUUHJvdG9jb2xGYWN0b3J5LCBsb2dQcmVmaXggc3RyaW5nKSAqVERlYnVnUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlREZWJ1Z1Byb3RvY29sRmFjdG9yeXsKKwkJVW5kZXJseWluZzogdW5kZXJseWluZywKKwkJTG9nUHJlZml4OiAgbG9nUHJlZml4LAorCX0KK30KKworZnVuYyAodCAqVERlYnVnUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiAmVERlYnVnUHJvdG9jb2x7CisJCURlbGVnYXRlOiAgdC5VbmRlcmx5aW5nLkdldFByb3RvY29sKHRyYW5zKSwKKwkJTG9nUHJlZml4OiB0LkxvZ1ByZWZpeCwKKwl9Cit9CisKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMikgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHlwZUlkLCBzZXFpZCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlTWVzc2FnZUJlZ2luKG5hbWU9JSN2LCB0eXBlSWQ9JSN2LCBzZXFpZD0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIHR5cGVJZCwgc2VxaWQsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1lc3NhZ2VFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVNZXNzYWdlRW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU3RydWN0QmVnaW4obmFtZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlU3RydWN0QmVnaW4obmFtZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlU3RydWN0RW5kKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlU3RydWN0RW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR5cGVJZCwgaWQpCisJbG9nLlByaW50ZigiJXNXcml0ZUZpZWxkQmVnaW4obmFtZT0lI3YsIHR5cGVJZD0lI3YsIGlkJSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCB0eXBlSWQsIGlkLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlRmllbGRFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVGaWVsZEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUZpZWxkU3RvcCgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlRmllbGRTdG9wKCkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlRmllbGRTdG9wKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVNYXBCZWdpbihrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUpCisJbG9nLlByaW50ZigiJXNXcml0ZU1hcEJlZ2luKGtleVR5cGU9JSN2LCB2YWx1ZVR5cGU9JSN2LCBzaXplPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVNYXBFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZU1hcEVuZCgpCisJbG9nLlByaW50ZigiJXNXcml0ZU1hcEVuZCgpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorCWxvZy5QcmludGYoIiVzV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGU9JSN2LCBzaXplPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZWxlbVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUxpc3RFbmQoKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUxpc3RFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVMaXN0RW5kKCkgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVNldEJlZ2luKGVsZW1UeXBlLCBzaXplKQorCWxvZy5QcmludGYoIiVzV3JpdGVTZXRCZWdpbihlbGVtVHlwZT0lI3YsIHNpemU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlbGVtVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVTZXRFbmQoKQorCWxvZy5QcmludGYoIiVzV3JpdGVTZXRFbmQoKSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVCb29sKHZhbHVlIGJvb2wpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlQm9vbCh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlQm9vbCh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVCeXRlKHZhbHVlIGludDgpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlQnl0ZSh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlQnl0ZSh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVJMTYodmFsdWUgaW50MTYpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlSTE2KHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVJMTYodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFdyaXRlSTMyKHZhbHVlIGludDMyKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZUkzMih2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlSTMyKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVJNjQodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZUk2NCh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgZXJyb3IgeworCWVyciA6PSB0ZHAuRGVsZWdhdGUuV3JpdGVEb3VibGUodmFsdWUpCisJbG9nLlByaW50ZigiJXNXcml0ZURvdWJsZSh2YWx1ZT0lI3YpID0+ICUjdiIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuIGVycgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBlcnJvciB7CisJZXJyIDo9IHRkcC5EZWxlZ2F0ZS5Xcml0ZVN0cmluZyh2YWx1ZSkKKwlsb2cuUHJpbnRmKCIlc1dyaXRlU3RyaW5nKHZhbHVlPSUjdikgPT4gJSN2IiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4gZXJyCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIGVycm9yIHsKKwllcnIgOj0gdGRwLkRlbGVnYXRlLldyaXRlQmluYXJ5KHZhbHVlKQorCWxvZy5QcmludGYoIiVzV3JpdGVCaW5hcnkodmFsdWU9JSN2KSA9PiAlI3YiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybiBlcnIKK30KKworZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIsIGVyciBlcnJvcikgeworCW5hbWUsIHR5cGVJZCwgc2VxaWQsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTWVzc2FnZUJlZ2luKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRNZXNzYWdlQmVnaW4oKSAobmFtZT0lI3YsIHR5cGVJZD0lI3YsIHNlcWlkPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBuYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZE1lc3NhZ2VFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZE1lc3NhZ2VFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwluYW1lLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFN0cnVjdEJlZ2luKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTdHJ1Y3RCZWdpbigpIChuYW1lJSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIG5hbWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRTdHJ1Y3RFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZFN0cnVjdEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNiwgZXJyIGVycm9yKSB7CisJbmFtZSwgdHlwZUlkLCBpZCwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRGaWVsZEJlZ2luKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRGaWVsZEJlZ2luKCkgKG5hbWU9JSN2LCB0eXBlSWQ9JSN2LCBpZD0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgbmFtZSwgdHlwZUlkLCBpZCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkRmllbGRFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZEZpZWxkRW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpIHsKKwlrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTWFwQmVnaW4oKQorCWxvZy5QcmludGYoIiVzUmVhZE1hcEJlZ2luKCkgKGtleVR5cGU9JSN2LCB2YWx1ZVR5cGU9JSN2LCBzaXplPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRNYXBFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRNYXBFbmQoKQorCWxvZy5QcmludGYoIiVzUmVhZE1hcEVuZCgpIGVycj0lI3YiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKSB7CisJZWxlbVR5cGUsIHNpemUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkTGlzdEJlZ2luKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGU9JSN2LCBzaXplPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBlbGVtVHlwZSwgc2l6ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZExpc3RFbmQoKSAoZXJyIGVycm9yKSB7CisJZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRMaXN0RW5kKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRMaXN0RW5kKCkgZXJyPSUjdiIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikgeworCWVsZW1UeXBlLCBzaXplLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFNldEJlZ2luKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTZXRCZWdpbigpIChlbGVtVHlwZT0lI3YsIHNpemU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVsZW1UeXBlLCBzaXplLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkU2V0RW5kKCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkU2V0RW5kKCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRTZXRFbmQoKSBlcnI9JSN2IiwgdGRwLkxvZ1ByZWZpeCwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEJvb2woKSAodmFsdWUgYm9vbCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkQm9vbCgpCisJbG9nLlByaW50ZigiJXNSZWFkQm9vbCgpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRCeXRlKCkgKHZhbHVlIGludDgsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEJ5dGUoKQorCWxvZy5QcmludGYoIiVzUmVhZEJ5dGUoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyID0gdGRwLkRlbGVnYXRlLlJlYWRJMTYoKQorCWxvZy5QcmludGYoIiVzUmVhZEkxNigpICh2YWx1ZT0lI3YsIGVycj0lI3YpIiwgdGRwLkxvZ1ByZWZpeCwgdmFsdWUsIGVycikKKwlyZXR1cm4KK30KK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIFJlYWRJMzIoKSAodmFsdWUgaW50MzIsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEkzMigpCisJbG9nLlByaW50ZigiJXNSZWFkSTMyKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIGVycm9yKSB7CisJdmFsdWUsIGVyciA9IHRkcC5EZWxlZ2F0ZS5SZWFkSTY0KCkKKwlsb2cuUHJpbnRmKCIlc1JlYWRJNjQoKSAodmFsdWU9JSN2LCBlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIHZhbHVlLCBlcnIpCisJcmV0dXJuCit9CitmdW5jICh0ZHAgKlREZWJ1Z1Byb3RvY29sKSBSZWFkRG91YmxlKCkgKHZhbHVlIGZsb2F0NjQsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZERvdWJsZSgpCisJbG9nLlByaW50ZigiJXNSZWFkRG91YmxlKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZFN0cmluZygpICh2YWx1ZSBzdHJpbmcsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZFN0cmluZygpCisJbG9nLlByaW50ZigiJXNSZWFkU3RyaW5nKCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgUmVhZEJpbmFyeSgpICh2YWx1ZSBbXWJ5dGUsIGVyciBlcnJvcikgeworCXZhbHVlLCBlcnIgPSB0ZHAuRGVsZWdhdGUuUmVhZEJpbmFyeSgpCisJbG9nLlByaW50ZigiJXNSZWFkQmluYXJ5KCkgKHZhbHVlPSUjdiwgZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCB2YWx1ZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuU2tpcChmaWVsZFR5cGUpCisJbG9nLlByaW50ZigiJXNTa2lwKGZpZWxkVHlwZT0lI3YpIChlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGZpZWxkVHlwZSwgZXJyKQorCXJldHVybgorfQorZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWVyciA9IHRkcC5EZWxlZ2F0ZS5GbHVzaChjdHgpCisJbG9nLlByaW50ZigiJXNGbHVzaCgpIChlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGVycikKKwlyZXR1cm4KK30KKworZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHRkcC5EZWxlZ2F0ZS5UcmFuc3BvcnQoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9kZXNlcmlhbGl6ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L2Rlc2VyaWFsaXplci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEwOTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9kZXNlcmlhbGl6ZXIuZ28KQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCit0eXBlIFREZXNlcmlhbGl6ZXIgc3RydWN0IHsKKwlUcmFuc3BvcnQgVFRyYW5zcG9ydAorCVByb3RvY29sICBUUHJvdG9jb2wKK30KKworZnVuYyBOZXdURGVzZXJpYWxpemVyKCkgKlREZXNlcmlhbGl6ZXIgeworCXZhciB0cmFuc3BvcnQgVFRyYW5zcG9ydAorCXRyYW5zcG9ydCA9IE5ld1RNZW1vcnlCdWZmZXJMZW4oMTAyNCkKKworCXByb3RvY29sIDo9IE5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisJcmV0dXJuICZURGVzZXJpYWxpemVyeworCQl0cmFuc3BvcnQsCisJCXByb3RvY29sfQorfQorCitmdW5jICh0ICpURGVzZXJpYWxpemVyKSBSZWFkU3RyaW5nKG1zZyBUU3RydWN0LCBzIHN0cmluZykgKGVyciBlcnJvcikgeworCWVyciA9IG5pbAorCWlmIF8sIGVyciA9IHQuVHJhbnNwb3J0LldyaXRlKFtdYnl0ZShzKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgZXJyID0gbXNnLlJlYWQodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHQgKlREZXNlcmlhbGl6ZXIpIFJlYWQobXNnIFRTdHJ1Y3QsIGIgW11ieXRlKSAoZXJyIGVycm9yKSB7CisJZXJyID0gbmlsCisJaWYgXywgZXJyID0gdC5UcmFuc3BvcnQuV3JpdGUoYik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgZXJyID0gbXNnLlJlYWQodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJcmV0dXJuCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOGQ2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2V4Y2VwdGlvbi5nbwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVycm9ycyIKKykKKworLy8gR2VuZXJpYyBUaHJpZnQgZXhjZXB0aW9uCit0eXBlIFRFeGNlcHRpb24gaW50ZXJmYWNlIHsKKwllcnJvcgorfQorCisvLyBQcmVwZW5kcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGFuIGVycm9yIHdpdGhvdXQgbG9zaW5nIHRoZSBUaHJpZnQgZXhjZXB0aW9uIGludGVyZmFjZQorZnVuYyBQcmVwZW5kRXJyb3IocHJlcGVuZCBzdHJpbmcsIGVyciBlcnJvcikgZXJyb3IgeworCWlmIHQsIG9rIDo9IGVyci4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24odC5UeXBlSWQoKSwgcHJlcGVuZCt0LkVycm9yKCkpCisJfQorCWlmIHQsIG9rIDo9IGVyci4oVFByb3RvY29sRXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodC5UeXBlSWQoKSwgZXJyb3JzLk5ldyhwcmVwZW5kK2Vyci5FcnJvcigpKSkKKwl9CisJaWYgdCwgb2sgOj0gZXJyLihUQXBwbGljYXRpb25FeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odC5UeXBlSWQoKSwgcHJlcGVuZCt0LkVycm9yKCkpCisJfQorCisJcmV0dXJuIGVycm9ycy5OZXcocHJlcGVuZCArIGVyci5FcnJvcigpKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9leGNlcHRpb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNWUyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZXhjZXB0aW9uX3Rlc3QuZ28KQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJlcnJvcnMiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFByZXBlbmRFcnJvcih0ICp0ZXN0aW5nLlQpIHsKKwllcnIgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKElOVEVSTkFMX0VSUk9SLCAib3JpZ2luYWwgZXJyb3IiKQorCWVycjIsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyKS4oVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgZXJyMi5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorCWlmIGVycjIuVHlwZUlkKCkgIT0gSU5URVJOQUxfRVJST1IgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHR5cGUgZXJyb3IiKQorCX0KKworCWVycjMgOj0gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJvcmlnaW5hbCBlcnJvciIpKQorCWVycjQsIG9rIDo9IFByZXBlbmRFcnJvcigiUHJlcGVuZDogIiwgZXJyMykuKFRQcm90b2NvbEV4Y2VwdGlvbikKKwlpZiAhb2sgeworCQl0LkZhdGFsKCJDb3VsZG4ndCBjYXN0IGVycm9yIFRQcm90b2NvbEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjQuRXJyb3IoKSAhPSAiUHJlcGVuZDogb3JpZ2luYWwgZXJyb3IiIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvciBzdHJpbmciKQorCX0KKwlpZiBlcnI0LlR5cGVJZCgpICE9IElOVkFMSURfREFUQSB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyNSA6PSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFRJTUVEX09VVCwgIm9yaWdpbmFsIGVycm9yIikKKwllcnI2LCBvayA6PSBQcmVwZW5kRXJyb3IoIlByZXBlbmQ6ICIsIGVycjUpLihUVHJhbnNwb3J0RXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkNvdWxkbid0IGNhc3QgZXJyb3IgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpCisJfQorCWlmIGVycjYuRXJyb3IoKSAhPSAiUHJlcGVuZDogb3JpZ2luYWwgZXJyb3IiIHsKKwkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvciBzdHJpbmciKQorCX0KKwlpZiBlcnI2LlR5cGVJZCgpICE9IFRJTUVEX09VVCB7CisJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgdHlwZSBlcnJvciIpCisJfQorCisJZXJyNyA6PSBlcnJvcnMuTmV3KCJvcmlnaW5hbCBlcnJvciIpCisJZXJyOCA6PSBQcmVwZW5kRXJyb3IoIlByZXBlbmQ6ICIsIGVycjcpCisJaWYgZXJyOC5FcnJvcigpICE9ICJQcmVwZW5kOiBvcmlnaW5hbCBlcnJvciIgeworCQl0LkZhdGFsKCJVbmV4cGVjdGVkIGVycm9yIHN0cmluZyIpCisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9maWVsZC5nbyBiL2xpYi9nby90aHJpZnQvZmllbGQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2NjUyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZmllbGQuZ28KQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgZmllbGQgbWV0YWRhdGEuCit0eXBlIGZpZWxkIHN0cnVjdCB7CisJbmFtZSAgIHN0cmluZworCXR5cGVJZCBUVHlwZQorCWlkICAgICBpbnQKK30KKworZnVuYyBuZXdGaWVsZChuIHN0cmluZywgdCBUVHlwZSwgaSBpbnQpICpmaWVsZCB7CisJcmV0dXJuICZmaWVsZHtuYW1lOiBuLCB0eXBlSWQ6IHQsIGlkOiBpfQorfQorCitmdW5jIChwICpmaWVsZCkgTmFtZSgpIHN0cmluZyB7CisJaWYgcCA9PSBuaWwgeworCQlyZXR1cm4gIiIKKwl9CisJcmV0dXJuIHAubmFtZQorfQorCitmdW5jIChwICpmaWVsZCkgVHlwZUlkKCkgVFR5cGUgeworCWlmIHAgPT0gbmlsIHsKKwkJcmV0dXJuIFRUeXBlKFZPSUQpCisJfQorCXJldHVybiBwLnR5cGVJZAorfQorCitmdW5jIChwICpmaWVsZCkgSWQoKSBpbnQgeworCWlmIHAgPT0gbmlsIHsKKwkJcmV0dXJuIC0xCisJfQorCXJldHVybiBwLmlkCit9CisKK2Z1bmMgKHAgKmZpZWxkKSBTdHJpbmcoKSBzdHJpbmcgeworCWlmIHAgPT0gbmlsIHsKKwkJcmV0dXJuICI8bmlsPiIKKwl9CisJcmV0dXJuICI8VEZpZWxkIG5hbWU6JyIgKyBwLm5hbWUgKyAiJyB0eXBlOiIgKyBzdHJpbmcocC50eXBlSWQpICsgIiBmaWVsZC1pZDoiICsgc3RyaW5nKHAuaWQpICsgIj4iCit9CisKK3ZhciBBTk9OWU1PVVNfRklFTEQgKmZpZWxkCisKK3R5cGUgZmllbGRTbGljZSBbXWZpZWxkCisKK2Z1bmMgKHAgZmllbGRTbGljZSkgTGVuKCkgaW50IHsKKwlyZXR1cm4gbGVuKHApCit9CisKK2Z1bmMgKHAgZmllbGRTbGljZSkgTGVzcyhpLCBqIGludCkgYm9vbCB7CisJcmV0dXJuIHBbaV0uSWQoKSA8IHBbal0uSWQoKQorfQorCitmdW5jIChwIGZpZWxkU2xpY2UpIFN3YXAoaSwgaiBpbnQpIHsKKwlwW2ldLCBwW2pdID0gcFtqXSwgcFtpXQorfQorCitmdW5jIGluaXQoKSB7CisJQU5PTllNT1VTX0ZJRUxEID0gbmV3RmllbGQoIiIsIFNUT1AsIDApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmYTY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJidWZpbyIKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImVuY29kaW5nL2JpbmFyeSIKKwkiZm10IgorCSJpbyIKKykKKworY29uc3QgREVGQVVMVF9NQVhfTEVOR1RIID0gMTYzODQwMDAKKwordHlwZSBURnJhbWVkVHJhbnNwb3J0IHN0cnVjdCB7CisJdHJhbnNwb3J0IFRUcmFuc3BvcnQKKwlidWYgICAgICAgYnl0ZXMuQnVmZmVyCisJcmVhZGVyICAgICpidWZpby5SZWFkZXIKKwlmcmFtZVNpemUgdWludDMyIC8vQ3VycmVudCByZW1haW5pbmcgc2l6ZSBvZiB0aGUgZnJhbWUuIGlmID09MCByZWFkIG5leHQgZnJhbWUgaGVhZGVyCisJYnVmZmVyICAgIFs0XWJ5dGUKKwltYXhMZW5ndGggdWludDMyCit9CisKK3R5cGUgdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlmYWN0b3J5ICAgVFRyYW5zcG9ydEZhY3RvcnkKKwltYXhMZW5ndGggdWludDMyCit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeSwgbWF4TGVuZ3RoOiBERUZBVUxUX01BWF9MRU5HVEh9Cit9CisKK2Z1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnlNYXhMZW5ndGgoZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgbWF4TGVuZ3RoIHVpbnQzMikgVFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9Cit9CisKK2Z1bmMgKHAgKnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQoYmFzZSBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwl0dCwgZXJyIDo9IHAuZmFjdG9yeS5HZXRUcmFuc3BvcnQoYmFzZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiBOZXdURnJhbWVkVHJhbnNwb3J0TWF4TGVuZ3RoKHR0LCBwLm1heExlbmd0aCksIG5pbAorfQorCitmdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0IFRUcmFuc3BvcnQpICpURnJhbWVkVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlRGcmFtZWRUcmFuc3BvcnR7dHJhbnNwb3J0OiB0cmFuc3BvcnQsIHJlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHRyYW5zcG9ydCksIG1heExlbmd0aDogREVGQVVMVF9NQVhfTEVOR1RIfQorfQorCitmdW5jIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHJhbnNwb3J0IFRUcmFuc3BvcnQsIG1heExlbmd0aCB1aW50MzIpICpURnJhbWVkVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlRGcmFtZWRUcmFuc3BvcnR7dHJhbnNwb3J0OiB0cmFuc3BvcnQsIHJlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHRyYW5zcG9ydCksIG1heExlbmd0aDogbWF4TGVuZ3RofQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBPcGVuKCkgZXJyb3IgeworCXJldHVybiBwLnRyYW5zcG9ydC5PcGVuKCkKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHAudHJhbnNwb3J0LklzT3BlbigpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIENsb3NlKCkgZXJyb3IgeworCXJldHVybiBwLnRyYW5zcG9ydC5DbG9zZSgpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFJlYWQoYnVmIFtdYnl0ZSkgKGwgaW50LCBlcnIgZXJyb3IpIHsKKwlpZiBwLmZyYW1lU2l6ZSA9PSAwIHsKKwkJcC5mcmFtZVNpemUsIGVyciA9IHAucmVhZEZyYW1lSGVhZGVyKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0KKwlpZiBwLmZyYW1lU2l6ZSA8IHVpbnQzMihsZW4oYnVmKSkgeworCQlmcmFtZVNpemUgOj0gcC5mcmFtZVNpemUKKwkJdG1wIDo9IG1ha2UoW11ieXRlLCBwLmZyYW1lU2l6ZSkKKwkJbCwgZXJyID0gcC5SZWFkKHRtcCkKKwkJY29weShidWYsIHRtcCkKKwkJaWYgZXJyID09IG5pbCB7CisJCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGZtdC5FcnJvcmYoIk5vdCBlbm91Z2ggZnJhbWUgc2l6ZSAlZCB0byByZWFkICVkIGJ5dGVzIiwgZnJhbWVTaXplLCBsZW4oYnVmKSkpCisJCQlyZXR1cm4KKwkJfQorCX0KKwlnb3QsIGVyciA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKKwlwLmZyYW1lU2l6ZSA9IHAuZnJhbWVTaXplIC0gdWludDMyKGdvdCkKKwkvL3Nhbml0eSBjaGVjaworCWlmIHAuZnJhbWVTaXplIDwgMCB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIk5lZ2F0aXZlIGZyYW1lIHNpemUiKQorCX0KKwlyZXR1cm4gZ290LCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVhZEJ5dGUoKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwlpZiBwLmZyYW1lU2l6ZSA9PSAwIHsKKwkJcC5mcmFtZVNpemUsIGVyciA9IHAucmVhZEZyYW1lSGVhZGVyKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4KKwkJfQorCX0KKwlpZiBwLmZyYW1lU2l6ZSA8IDEgeworCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihmbXQuRXJyb3JmKCJOb3QgZW5vdWdoIGZyYW1lIHNpemUgJWQgdG8gcmVhZCAlZCBieXRlcyIsIHAuZnJhbWVTaXplLCAxKSkKKwl9CisJYywgZXJyID0gcC5yZWFkZXIuUmVhZEJ5dGUoKQorCWlmIGVyciA9PSBuaWwgeworCQlwLmZyYW1lU2l6ZS0tCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCW4sIGVyciA6PSBwLmJ1Zi5Xcml0ZShidWYpCisJcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBXcml0ZUJ5dGUoYyBieXRlKSBlcnJvciB7CisJcmV0dXJuIHAuYnVmLldyaXRlQnl0ZShjKQorfQorCitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcC5idWYuV3JpdGVTdHJpbmcocykKK30KKworZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgeworCXNpemUgOj0gcC5idWYuTGVuKCkKKwlidWYgOj0gcC5idWZmZXJbOjRdCisJYmluYXJ5LkJpZ0VuZGlhbi5QdXRVaW50MzIoYnVmLCB1aW50MzIoc2l6ZSkpCisJXywgZXJyIDo9IHAudHJhbnNwb3J0LldyaXRlKGJ1ZikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC5idWYuVHJ1bmNhdGUoMCkKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlpZiBzaXplID4gMCB7CisJCWlmIG4sIGVyciA6PSBwLmJ1Zi5Xcml0ZVRvKHAudHJhbnNwb3J0KTsgZXJyICE9IG5pbCB7CisJCQlwcmludCgiRXJyb3Igd2hpbGUgZmx1c2hpbmcgd3JpdGUgYnVmZmVyIG9mIHNpemUgIiwgc2l6ZSwgIiB0byB0cmFuc3BvcnQsIG9ubHkgd3JvdGUgIiwgbiwgIiBieXRlczogIiwgZXJyLkVycm9yKCksICJcbiIpCisJCQlwLmJ1Zi5UcnVuY2F0ZSgwKQorCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCQl9CisJfQorCWVyciA9IHAudHJhbnNwb3J0LkZsdXNoKGN0eCkKKwlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIHJlYWRGcmFtZUhlYWRlcigpICh1aW50MzIsIGVycm9yKSB7CisJYnVmIDo9IHAuYnVmZmVyWzo0XQorCWlmIF8sIGVyciA6PSBpby5SZWFkRnVsbChwLnJlYWRlciwgYnVmKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBlcnIKKwl9CisJc2l6ZSA6PSBiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpCisJaWYgc2l6ZSA8IDAgfHwgc2l6ZSA+IHAubWF4TGVuZ3RoIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCBmbXQuU3ByaW50ZigiSW5jb3JyZWN0IGZyYW1lIHNpemUgKCVkKSIsIHNpemUpKQorCX0KKwlyZXR1cm4gc2l6ZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlyZXR1cm4gdWludDY0KHAuZnJhbWVTaXplKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY4M2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RGcmFtZWRUcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnMgOj0gTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpCisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgyYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbwpAQCAtMCwwICsxLDI0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJieXRlcyIKKwkiY29udGV4dCIKKwkiaW8iCisJImlvL2lvdXRpbCIKKwkibmV0L2h0dHAiCisJIm5ldC91cmwiCisJInN0cmNvbnYiCispCisKKy8vIERlZmF1bHQgdG8gdXNpbmcgdGhlIHNoYXJlZCBodHRwIGNsaWVudC4gTGlicmFyeSB1c2VycyBhcmUKKy8vIGZyZWUgdG8gY2hhbmdlIHRoaXMgZ2xvYmFsIGNsaWVudCBvciBzcGVjaWZ5IG9uZSB0aHJvdWdoCisvLyBUSHR0cENsaWVudE9wdGlvbnMuCit2YXIgRGVmYXVsdEh0dHBDbGllbnQgKmh0dHAuQ2xpZW50ID0gaHR0cC5EZWZhdWx0Q2xpZW50CisKK3R5cGUgVEh0dHBDbGllbnQgc3RydWN0IHsKKwljbGllbnQgICAgICAgICAgICAgKmh0dHAuQ2xpZW50CisJcmVzcG9uc2UgICAgICAgICAgICpodHRwLlJlc3BvbnNlCisJdXJsICAgICAgICAgICAgICAgICp1cmwuVVJMCisJcmVxdWVzdEJ1ZmZlciAgICAgICpieXRlcy5CdWZmZXIKKwloZWFkZXIgICAgICAgICAgICAgaHR0cC5IZWFkZXIKKwluc2VjQ29ubmVjdFRpbWVvdXQgaW50NjQKKwluc2VjUmVhZFRpbWVvdXQgICAgaW50NjQKK30KKwordHlwZSBUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucworCXVybCAgICAgc3RyaW5nCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHRyYW5zICE9IG5pbCB7CisJCXQsIG9rIDo9IHRyYW5zLigqVEh0dHBDbGllbnQpCisJCWlmIG9rICYmIHQudXJsICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh0LnVybC5TdHJpbmcoKSwgcC5vcHRpb25zKQorCQl9CisJfQorCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHAudXJsLCBwLm9wdGlvbnMpCit9CisKK3R5cGUgVEh0dHBDbGllbnRPcHRpb25zIHN0cnVjdCB7CisJLy8gSWYgbmlsLCBEZWZhdWx0SHR0cENsaWVudCBpcyB1c2VkCisJQ2xpZW50ICpodHRwLkNsaWVudAorfQorCitmdW5jIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSh1cmwgc3RyaW5nKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KKworZnVuYyBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnl7dXJsOiB1cmwsIG9wdGlvbnM6IG9wdGlvbnN9Cit9CisKK2Z1bmMgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcGFyc2VkVVJMLCBlcnIgOj0gdXJsLlBhcnNlKHVybHN0cikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgMTAyNCkKKwljbGllbnQgOj0gb3B0aW9ucy5DbGllbnQKKwlpZiBjbGllbnQgPT0gbmlsIHsKKwkJY2xpZW50ID0gRGVmYXVsdEh0dHBDbGllbnQKKwl9CisJaHR0cEhlYWRlciA6PSBtYXBbc3RyaW5nXVtdc3RyaW5neyJDb250ZW50LVR5cGUiOiB7ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In19CisJcmV0dXJuICZUSHR0cENsaWVudHtjbGllbnQ6IGNsaWVudCwgdXJsOiBwYXJzZWRVUkwsIHJlcXVlc3RCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBoZWFkZXI6IGh0dHBIZWFkZXJ9LCBuaWwKK30KKworZnVuYyBOZXdUSHR0cENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCisvLyBTZXQgdGhlIEhUVFAgSGVhZGVyIGZvciB0aGlzIHNwZWNpZmljIFRocmlmdCBUcmFuc3BvcnQKKy8vIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBmaXJzdCBhc3NlcnQgdGhlIFRUcmFuc3BvcnQgYXMgYSBUSHR0cENsaWVudCB0eXBlCisvLyBsaWtlIHNvOgorLy8KKy8vIGh0dHBUcmFucyA6PSB0cmFucy4oVEh0dHBDbGllbnQpCisvLyBodHRwVHJhbnMuU2V0SGVhZGVyKCJVc2VyLUFnZW50IiwiVGhyaWZ0IENsaWVudCAxLjAiKQorZnVuYyAocCAqVEh0dHBDbGllbnQpIFNldEhlYWRlcihrZXkgc3RyaW5nLCB2YWx1ZSBzdHJpbmcpIHsKKwlwLmhlYWRlci5BZGQoa2V5LCB2YWx1ZSkKK30KKworLy8gR2V0IHRoZSBIVFRQIEhlYWRlciByZXByZXNlbnRlZCBieSB0aGUgc3VwcGxpZWQgSGVhZGVyIEtleSBmb3IgdGhpcyBzcGVjaWZpYyBUaHJpZnQgVHJhbnNwb3J0CisvLyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZmlyc3QgYXNzZXJ0IHRoZSBUVHJhbnNwb3J0IGFzIGEgVEh0dHBDbGllbnQgdHlwZQorLy8gbGlrZSBzbzoKKy8vCisvLyBodHRwVHJhbnMgOj0gdHJhbnMuKFRIdHRwQ2xpZW50KQorLy8gaGRyVmFsdWUgOj0gaHR0cFRyYW5zLkdldEhlYWRlcigiVXNlci1BZ2VudCIpCitmdW5jIChwICpUSHR0cENsaWVudCkgR2V0SGVhZGVyKGtleSBzdHJpbmcpIHN0cmluZyB7CisJcmV0dXJuIHAuaGVhZGVyLkdldChrZXkpCit9CisKKy8vIERlbGV0ZXMgdGhlIEhUVFAgSGVhZGVyIGdpdmVuIGEgSGVhZGVyIEtleSBmb3IgdGhpcyBzcGVjaWZpYyBUaHJpZnQgVHJhbnNwb3J0CisvLyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgZmlyc3QgYXNzZXJ0IHRoZSBUVHJhbnNwb3J0IGFzIGEgVEh0dHBDbGllbnQgdHlwZQorLy8gbGlrZSBzbzoKKy8vCisvLyBodHRwVHJhbnMgOj0gdHJhbnMuKFRIdHRwQ2xpZW50KQorLy8gaHR0cFRyYW5zLkRlbEhlYWRlcigiVXNlci1BZ2VudCIpCitmdW5jIChwICpUSHR0cENsaWVudCkgRGVsSGVhZGVyKGtleSBzdHJpbmcpIHsKKwlwLmhlYWRlci5EZWwoa2V5KQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgT3BlbigpIGVycm9yIHsKKwkvLyBkbyBub3RoaW5nCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHAucmVzcG9uc2UgIT0gbmlsIHx8IHAucmVxdWVzdEJ1ZmZlciAhPSBuaWwKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIGNsb3NlUmVzcG9uc2UoKSBlcnJvciB7CisJdmFyIGVyciBlcnJvcgorCWlmIHAucmVzcG9uc2UgIT0gbmlsICYmIHAucmVzcG9uc2UuQm9keSAhPSBuaWwgeworCQkvLyBUaGUgZG9jcyBzcGVjaWZ5IHRoYXQgaWYga2VlcGFsaXZlIGlzIGVuYWJsZWQgYW5kIHRoZSByZXNwb25zZSBib2R5IGlzIG5vdAorCQkvLyByZWFkIHRvIGNvbXBsZXRpb24gdGhlIGNvbm5lY3Rpb24gd2lsbCBuZXZlciBiZSByZXR1cm5lZCB0byB0aGUgcG9vbCBhbmQKKwkJLy8gcmV1c2VkLiBFcnJvcnMgYXJlIGJlaW5nIGlnbm9yZWQgaGVyZSBiZWNhdXNlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGludmFsaWQKKwkJLy8gYW5kIHRoaXMgZmFpbHMgZm9yIHNvbWUgcmVhc29uLCB0aGUgQ2xvc2UoKSBtZXRob2Qgd2lsbCBkbyBhbnkgcmVtYWluaW5nCisJCS8vIGNsZWFudXAuCisJCWlvLkNvcHkoaW91dGlsLkRpc2NhcmQsIHAucmVzcG9uc2UuQm9keSkKKworCQllcnIgPSBwLnJlc3BvbnNlLkJvZHkuQ2xvc2UoKQorCX0KKworCXAucmVzcG9uc2UgPSBuaWwKKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBDbG9zZSgpIGVycm9yIHsKKwlpZiBwLnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKKwkJcC5yZXF1ZXN0QnVmZmVyLlJlc2V0KCkKKwkJcC5yZXF1ZXN0QnVmZmVyID0gbmlsCisJfQorCXJldHVybiBwLmNsb3NlUmVzcG9uc2UoKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgUmVhZChidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmIHAucmVzcG9uc2UgPT0gbmlsIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIikKKwl9CisJbiwgZXJyIDo9IHAucmVzcG9uc2UuQm9keS5SZWFkKGJ1ZikKKwlpZiBuID4gMCAmJiAoZXJyID09IG5pbCB8fCBlcnIgPT0gaW8uRU9GKSB7CisJCXJldHVybiBuLCBuaWwKKwl9CisJcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgUmVhZEJ5dGUoKSAoYyBieXRlLCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gcmVhZEJ5dGUocC5yZXNwb25zZS5Cb2R5KQorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC5yZXF1ZXN0QnVmZmVyLldyaXRlKGJ1ZikKKwlyZXR1cm4gbiwgZXJyCit9CisKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBXcml0ZUJ5dGUoYyBieXRlKSBlcnJvciB7CisJcmV0dXJuIHAucmVxdWVzdEJ1ZmZlci5Xcml0ZUJ5dGUoYykKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCXJldHVybiBwLnJlcXVlc3RCdWZmZXIuV3JpdGVTdHJpbmcocykKK30KKworZnVuYyAocCAqVEh0dHBDbGllbnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwkvLyBDbG9zZSBhbnkgcHJldmlvdXMgcmVzcG9uc2UgYm9keSB0byBhdm9pZCBsZWFraW5nIGNvbm5lY3Rpb25zLgorCXAuY2xvc2VSZXNwb25zZSgpCisKKwlyZXEsIGVyciA6PSBodHRwLk5ld1JlcXVlc3QoIlBPU1QiLCBwLnVybC5TdHJpbmcoKSwgcC5yZXF1ZXN0QnVmZmVyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJlcS5IZWFkZXIgPSBwLmhlYWRlcgorCWlmIGN0eCAhPSBuaWwgeworCQlyZXEgPSByZXEuV2l0aENvbnRleHQoY3R4KQorCX0KKwlyZXNwb25zZSwgZXJyIDo9IHAuY2xpZW50LkRvKHJlcSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlpZiByZXNwb25zZS5TdGF0dXNDb2RlICE9IGh0dHAuU3RhdHVzT0sgeworCQkvLyBDbG9zZSB0aGUgcmVzcG9uc2UgdG8gYXZvaWQgbGVha2luZyBmaWxlIGRlc2NyaXB0b3JzLiBjbG9zZVJlc3BvbnNlIGRvZXMKKwkJLy8gbW9yZSB0aGFuIGp1c3QgY2FsbCBDbG9zZSgpLCBzbyB0ZW1wb3JhcmlseSBhc3NpZ24gaXQgYW5kIHJldXNlIHRoZSBsb2dpYy4KKwkJcC5yZXNwb25zZSA9IHJlc3BvbnNlCisJCXAuY2xvc2VSZXNwb25zZSgpCisKKwkJLy8gVE9ETyhwb21hY2spIGxvZyBiYWQgcmVzcG9uc2UKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiSFRUUCBSZXNwb25zZSBjb2RlOiAiK3N0cmNvbnYuSXRvYShyZXNwb25zZS5TdGF0dXNDb2RlKSkKKwl9CisJcC5yZXNwb25zZSA9IHJlc3BvbnNlCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSHR0cENsaWVudCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgeworCWxlbiA6PSBwLnJlc3BvbnNlLkNvbnRlbnRMZW5ndGgKKwlpZiBsZW4gPj0gMCB7CisJCXJldHVybiB1aW50NjQobGVuKQorCX0KKworCWNvbnN0IG1heFNpemUgPSBedWludDY0KDApCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkodXJsIHN0cmluZykgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIG9wdGlvbnMpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zIGluc3RlYWQuCitmdW5jIE5ld1RIdHRwUG9zdENsaWVudFdpdGhPcHRpb25zKHVybHN0ciBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIsIG9wdGlvbnMpCit9CisKKy8vIERlcHJlY2F0ZWQ6IFVzZSBOZXdUSHR0cENsaWVudCBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM2ODBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudF90ZXN0LmdvCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJIm5ldC9odHRwIgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RIdHRwQ2xpZW50KHQgKnRlc3RpbmcuVCkgeworCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWlmIGwgIT0gbmlsIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJfQorCXRyYW5zLCBlcnIgOj0gTmV3VEh0dHBQb3N0Q2xpZW50KCJodHRwOi8vIiArIGFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCWwuQ2xvc2UoKQorCQl0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0SHR0cENsaWVudEhlYWRlcnModCAqdGVzdGluZy5UKSB7CisJbCwgYWRkciA6PSBIdHRwQ2xpZW50U2V0dXBGb3JUZXN0KHQpCisJaWYgbCAhPSBuaWwgeworCQlkZWZlciBsLkNsb3NlKCkKKwl9CisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RIdHRwQ3VzdG9tQ2xpZW50KHQgKnRlc3RpbmcuVCkgeworCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWlmIGwgIT0gbmlsIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJfQorCisJaHR0cFRyYW5zcG9ydCA6PSAmY3VzdG9tSHR0cFRyYW5zcG9ydHt9CisKKwl0cmFucywgZXJyIDo9IE5ld1RIdHRwUG9zdENsaWVudFdpdGhPcHRpb25zKCJodHRwOi8vIithZGRyLlN0cmluZygpLCBUSHR0cENsaWVudE9wdGlvbnN7CisJCUNsaWVudDogJmh0dHAuQ2xpZW50eworCQkJVHJhbnNwb3J0OiBodHRwVHJhbnNwb3J0LAorCQl9LAorCX0pCisJaWYgZXJyICE9IG5pbCB7CisJCWwuQ2xvc2UoKQorCQl0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCX0KKwlUcmFuc3BvcnRIZWFkZXJUZXN0KHQsIHRyYW5zLCB0cmFucykKKworCWlmICFodHRwVHJhbnNwb3J0LmhpdCB7CisJCXQuRmF0YWxmKCJDdXN0b20gY2xpZW50IHdhcyBub3QgdXNlZCIpCisJfQorfQorCitmdW5jIFRlc3RIdHRwQ3VzdG9tQ2xpZW50UGFja2FnZVNjb3BlKHQgKnRlc3RpbmcuVCkgeworCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWlmIGwgIT0gbmlsIHsKKwkJZGVmZXIgbC5DbG9zZSgpCisJfQorCWh0dHBUcmFuc3BvcnQgOj0gJmN1c3RvbUh0dHBUcmFuc3BvcnR7fQorCURlZmF1bHRIdHRwQ2xpZW50ID0gJmh0dHAuQ2xpZW50eworCQlUcmFuc3BvcnQ6IGh0dHBUcmFuc3BvcnQsCisJfQorCisJdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJbC5DbG9zZSgpCisJCXQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCB0byAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJfQorCVRyYW5zcG9ydEhlYWRlclRlc3QodCwgdHJhbnMsIHRyYW5zKQorCisJaWYgIWh0dHBUcmFuc3BvcnQuaGl0IHsKKwkJdC5GYXRhbGYoIkN1c3RvbSBjbGllbnQgd2FzIG5vdCB1c2VkIikKKwl9Cit9CisKK3R5cGUgY3VzdG9tSHR0cFRyYW5zcG9ydCBzdHJ1Y3QgeworCWhpdCBib29sCit9CisKK2Z1bmMgKGMgKmN1c3RvbUh0dHBUcmFuc3BvcnQpIFJvdW5kVHJpcChyZXEgKmh0dHAuUmVxdWVzdCkgKCpodHRwLlJlc3BvbnNlLCBlcnJvcikgeworCWMuaGl0ID0gdHJ1ZQorCXJldHVybiBodHRwLkRlZmF1bHRUcmFuc3BvcnQuUm91bmRUcmlwKHJlcSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjBmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29tcHJlc3MvZ3ppcCIKKwkiaW8iCisJIm5ldC9odHRwIgorCSJzdHJpbmdzIgorKQorCisvLyBOZXdUaHJpZnRIYW5kbGVyRnVuYyBpcyBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlIGEgcmVhZHkgdG8gdXNlIEFwYWNoZSBUaHJpZnQgSGFuZGxlciBmdW5jdGlvbgorZnVuYyBOZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IgVFByb2Nlc3NvciwKKwlpblBmYWN0b3J5LCBvdXRQZmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CisKKwlyZXR1cm4gZ3ooZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCQl3LkhlYWRlcigpLkFkZCgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKworCQl0cmFuc3BvcnQgOj0gTmV3U3RyZWFtVHJhbnNwb3J0KHIuQm9keSwgdykKKwkJcHJvY2Vzc29yLlByb2Nlc3Moci5Db250ZXh0KCksIGluUGZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KSwgb3V0UGZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KSkKKwl9KQorfQorCisvLyBneiB0cmFuc3BhcmVudGx5IGNvbXByZXNzZXMgdGhlIEhUVFAgcmVzcG9uc2UgaWYgdGhlIGNsaWVudCBzdXBwb3J0cyBpdC4KK2Z1bmMgZ3ooaGFuZGxlciBodHRwLkhhbmRsZXJGdW5jKSBodHRwLkhhbmRsZXJGdW5jIHsKKwlyZXR1cm4gZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCQlpZiAhc3RyaW5ncy5Db250YWlucyhyLkhlYWRlci5HZXQoIkFjY2VwdC1FbmNvZGluZyIpLCAiZ3ppcCIpIHsKKwkJCWhhbmRsZXIodywgcikKKwkJCXJldHVybgorCQl9CisJCXcuSGVhZGVyKCkuU2V0KCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKQorCQlneiA6PSBnemlwLk5ld1dyaXRlcih3KQorCQlkZWZlciBnei5DbG9zZSgpCisJCWd6dyA6PSBnemlwUmVzcG9uc2VXcml0ZXJ7V3JpdGVyOiBneiwgUmVzcG9uc2VXcml0ZXI6IHd9CisJCWhhbmRsZXIoZ3p3LCByKQorCX0KK30KKwordHlwZSBnemlwUmVzcG9uc2VXcml0ZXIgc3RydWN0IHsKKwlpby5Xcml0ZXIKKwlodHRwLlJlc3BvbnNlV3JpdGVyCit9CisKK2Z1bmMgKHcgZ3ppcFJlc3BvbnNlV3JpdGVyKSBXcml0ZShiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlyZXR1cm4gdy5Xcml0ZXIuV3JpdGUoYikKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9pb3N0cmVhbV90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhOTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ1ZmlvIgorCSJjb250ZXh0IgorCSJpbyIKKykKKworLy8gU3RyZWFtVHJhbnNwb3J0IGlzIGEgVHJhbnNwb3J0IG1hZGUgb2YgYW4gaW8uUmVhZGVyIGFuZC9vciBhbiBpby5Xcml0ZXIKK3R5cGUgU3RyZWFtVHJhbnNwb3J0IHN0cnVjdCB7CisJaW8uUmVhZGVyCisJaW8uV3JpdGVyCisJaXNSZWFkV3JpdGVyIGJvb2wKKwljbG9zZWQgICAgICAgYm9vbAorfQorCit0eXBlIFN0cmVhbVRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlSZWFkZXIgICAgICAgaW8uUmVhZGVyCisJV3JpdGVyICAgICAgIGlvLldyaXRlcgorCWlzUmVhZFdyaXRlciBib29sCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlpZiB0cmFucyAhPSBuaWwgeworCQl0LCBvayA6PSB0cmFucy4oKlN0cmVhbVRyYW5zcG9ydCkKKwkJaWYgb2sgeworCQkJaWYgdC5pc1JlYWRXcml0ZXIgeworCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyh0LlJlYWRlci4oaW8uUmVhZFdyaXRlcikpLCBuaWwKKwkJCX0KKwkJCWlmIHQuUmVhZGVyICE9IG5pbCAmJiB0LldyaXRlciAhPSBuaWwgeworCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQodC5SZWFkZXIsIHQuV3JpdGVyKSwgbmlsCisJCQl9CisJCQlpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgPT0gbmlsIHsKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0Uih0LlJlYWRlciksIG5pbAorCQkJfQorCQkJaWYgdC5SZWFkZXIgPT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7CisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcodC5Xcml0ZXIpLCBuaWwKKwkJCX0KKwkJCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAorCQl9CisJfQorCWlmIHAuaXNSZWFkV3JpdGVyIHsKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHAuUmVhZGVyLihpby5SZWFkV3JpdGVyKSksIG5pbAorCX0KKwlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydChwLlJlYWRlciwgcC5Xcml0ZXIpLCBuaWwKKwl9CisJaWYgcC5SZWFkZXIgIT0gbmlsICYmIHAuV3JpdGVyID09IG5pbCB7CisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHAuUmVhZGVyKSwgbmlsCisJfQorCWlmIHAuUmVhZGVyID09IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgeworCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0VyhwLldyaXRlciksIG5pbAorCX0KKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9LCBuaWwKK30KKworZnVuYyBOZXdTdHJlYW1UcmFuc3BvcnRGYWN0b3J5KHJlYWRlciBpby5SZWFkZXIsIHdyaXRlciBpby5Xcml0ZXIsIGlzUmVhZFdyaXRlciBib29sKSAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnRGYWN0b3J5e1JlYWRlcjogcmVhZGVyLCBXcml0ZXI6IHdyaXRlciwgaXNSZWFkV3JpdGVyOiBpc1JlYWRXcml0ZXJ9Cit9CisKK2Z1bmMgTmV3U3RyZWFtVHJhbnNwb3J0KHIgaW8uUmVhZGVyLCB3IGlvLldyaXRlcikgKlN0cmVhbVRyYW5zcG9ydCB7CisJcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7UmVhZGVyOiBidWZpby5OZXdSZWFkZXIociksIFdyaXRlcjogYnVmaW8uTmV3V3JpdGVyKHcpfQorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydFIociBpby5SZWFkZXIpICpTdHJlYW1UcmFuc3BvcnQgeworCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHIpfQorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydFcodyBpby5Xcml0ZXIpICpTdHJlYW1UcmFuc3BvcnQgeworCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e1dyaXRlcjogYnVmaW8uTmV3V3JpdGVyKHcpfQorfQorCitmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHJ3IGlvLlJlYWRXcml0ZXIpICpTdHJlYW1UcmFuc3BvcnQgeworCWJ1ZnJ3IDo9IGJ1ZmlvLk5ld1JlYWRXcml0ZXIoYnVmaW8uTmV3UmVhZGVyKHJ3KSwgYnVmaW8uTmV3V3JpdGVyKHJ3KSkKKwlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IGJ1ZnJ3LCBXcml0ZXI6IGJ1ZnJ3LCBpc1JlYWRXcml0ZXI6IHRydWV9Cit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuICFwLmNsb3NlZAorfQorCisvLyBpbXBsaWNpdGx5IG9wZW5lZCBvbiBjcmVhdGlvbiwgY2FuJ3QgYmUgcmVvcGVuZWQgb25jZSBjbG9zZWQKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgT3BlbigpIGVycm9yIHsKKwlpZiAhcC5jbG9zZWQgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTdHJlYW1UcmFuc3BvcnQgYWxyZWFkeSBvcGVuLiIpCisJfSBlbHNlIHsKKwkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJjYW5ub3QgcmVvcGVuIFN0cmVhbVRyYW5zcG9ydC4iKQorCX0KK30KKworLy8gQ2xvc2VzIGJvdGggdGhlIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4KK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgQ2xvc2UoKSBlcnJvciB7CisJaWYgcC5jbG9zZWQgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIlN0cmVhbVRyYW5zcG9ydCBhbHJlYWR5IGNsb3NlZC4iKQorCX0KKwlwLmNsb3NlZCA9IHRydWUKKwljbG9zZWRSZWFkZXIgOj0gZmFsc2UKKwlpZiBwLlJlYWRlciAhPSBuaWwgeworCQljLCBvayA6PSBwLlJlYWRlci4oaW8uQ2xvc2VyKQorCQlpZiBvayB7CisJCQllIDo9IGMuQ2xvc2UoKQorCQkJY2xvc2VkUmVhZGVyID0gdHJ1ZQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiBlCisJCQl9CisJCX0KKwkJcC5SZWFkZXIgPSBuaWwKKwl9CisJaWYgcC5Xcml0ZXIgIT0gbmlsICYmICghY2xvc2VkUmVhZGVyIHx8ICFwLmlzUmVhZFdyaXRlcikgeworCQljLCBvayA6PSBwLldyaXRlci4oaW8uQ2xvc2VyKQorCQlpZiBvayB7CisJCQllIDo9IGMuQ2xvc2UoKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiBlCisJCQl9CisJCX0KKwkJcC5Xcml0ZXIgPSBuaWwKKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlpZiBwLldyaXRlciA9PSBuaWwgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dFN0cmVhbSIpCisJfQorCWYsIG9rIDo9IHAuV3JpdGVyLihGbHVzaGVyKQorCWlmIG9rIHsKKwkJZXJyIDo9IGYuRmx1c2goKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwkJfQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgUmVhZChjIFtdYnl0ZSkgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwluLCBlcnIgPSBwLlJlYWRlci5SZWFkKGMpCisJaWYgZXJyICE9IG5pbCB7CisJCWVyciA9IE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorCX0KKwlyZXR1cm4KK30KKworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBSZWFkQnl0ZSgpIChjIGJ5dGUsIGVyciBlcnJvcikgeworCWYsIG9rIDo9IHAuUmVhZGVyLihpby5CeXRlUmVhZGVyKQorCWlmIG9rIHsKKwkJYywgZXJyID0gZi5SZWFkQnl0ZSgpCisJfSBlbHNlIHsKKwkJYywgZXJyID0gcmVhZEJ5dGUocC5SZWFkZXIpCisJfQorCWlmIGVyciAhPSBuaWwgeworCQllcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuCit9CisKK2Z1bmMgKHAgKlN0cmVhbVRyYW5zcG9ydCkgV3JpdGUoYyBbXWJ5dGUpIChuIGludCwgZXJyIGVycm9yKSB7CisJbiwgZXJyID0gcC5Xcml0ZXIuV3JpdGUoYykKKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFdyaXRlQnl0ZShjIGJ5dGUpIChlcnIgZXJyb3IpIHsKKwlmLCBvayA6PSBwLldyaXRlci4oaW8uQnl0ZVdyaXRlcikKKwlpZiBvayB7CisJCWVyciA9IGYuV3JpdGVCeXRlKGMpCisJfSBlbHNlIHsKKwkJZXJyID0gd3JpdGVCeXRlKHAuV3JpdGVyLCBjKQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFdyaXRlU3RyaW5nKHMgc3RyaW5nKSAobiBpbnQsIGVyciBlcnJvcikgeworCWYsIG9rIDo9IHAuV3JpdGVyLihzdHJpbmdXcml0ZXIpCisJaWYgb2sgeworCQluLCBlcnIgPSBmLldyaXRlU3RyaW5nKHMpCisJfSBlbHNlIHsKKwkJbiwgZXJyID0gcC5Xcml0ZXIuV3JpdGUoW11ieXRlKHMpKQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybgorfQorCitmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTYxMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFN0cmVhbVRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKKwl0cmFucyA6PSBOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKSkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KKworZnVuYyBUZXN0U3RyZWFtVHJhbnNwb3J0T3BlbkNsb3NlKHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1N0cmVhbVRyYW5zcG9ydFJXKGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpKQorCWlmICF0cmFucy5Jc09wZW4oKSB7CisJCXQuRmF0YWwoIlN0cmVhbVRyYW5zcG9ydCBzaG91bGQgYmUgYWxyZWFkeSBvcGVuIikKKwl9CisJaWYgdHJhbnMuT3BlbigpID09IG5pbCB7CisJCXQuRmF0YWwoIlN0cmVhbVRyYW5zcG9ydCBzaG91bGQgcmV0dXJuIGVycm9yIHdoZW4gb3BlbiB0d2ljZSIpCisJfQorCWlmIHRyYW5zLkNsb3NlKCkgIT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBub3QgcmV0dXJuIGVycm9yIHdoZW4gY2xvc2luZyBvcGVuIHRyYW5zcG9ydCIpCisJfQorCWlmIHRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCBub3QgYmUgb3BlbiBhZnRlciBjbG9zZSIpCisJfQorCWlmIHRyYW5zLkNsb3NlKCkgPT0gbmlsIHsKKwkJdC5GYXRhbCgiU3RyZWFtVHJhbnNwb3J0IHNob3VsZCByZXR1cm4gZXJyb3Igd2hlbiBjbG9zaW5nIGEgbm9uIG9wZW4gdHJhbnNwb3J0IikKKwl9CisJaWYgdHJhbnMuT3BlbigpID09IG5pbCB7CisJCXQuRmF0YWwoIlN0cmVhbVRyYW5zcG9ydCBzaG91bGQgbm90IGJlIGFibGUgdG8gcmVvcGVuIikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JlNjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iYXNlNjQiCisJImZtdCIKKykKKworY29uc3QgKAorCVRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04gPSAxCispCisKKy8vIGZvciByZWZlcmVuY2VzIHRvIF9QYXJzZUNvbnRleHQgc2VlIHRzaW1wbGVqc29uX3Byb3RvY29sLmdvCisKKy8vIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKy8vCisvLyBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKKy8vIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCisvLyBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCisvLwordHlwZSBUSlNPTlByb3RvY29sIHN0cnVjdCB7CisJKlRTaW1wbGVKU09OUHJvdG9jb2wKK30KKworLy8gQ29uc3RydWN0b3IKK2Z1bmMgTmV3VEpTT05Qcm90b2NvbCh0IFRUcmFuc3BvcnQpICpUSlNPTlByb3RvY29sIHsKKwl2IDo9ICZUSlNPTlByb3RvY29se1RTaW1wbGVKU09OUHJvdG9jb2w6IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodCl9CisJdi5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZCh2LnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQorCXYuZHVtcENvbnRleHQgPSBhcHBlbmQodi5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKKwlyZXR1cm4gdgorfQorCisvLyBGYWN0b3J5Cit0eXBlIFRKU09OUHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2xGYWN0b3J5KSBHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wgeworCXJldHVybiBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorfQorCitmdW5jIE5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkgKlRKU09OUHJvdG9jb2xGYWN0b3J5IHsKKwlyZXR1cm4gJlRKU09OUHJvdG9jb2xGYWN0b3J5e30KK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBlcnJvciB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUkzMihUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUkzMihzZXFJZCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dE9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IgeworCWlmIGUgOj0gcC5Xcml0ZUkxNihpZCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLk91dHB1dE9iamVjdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcywgZTEgOj0gcC5UeXBlSWRUb1N0cmluZyh0eXBlSWQpCisJaWYgZTEgIT0gbmlsIHsKKwkJcmV0dXJuIGUxCisJfQorCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhzKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBlcnJvciB7IHJldHVybiBuaWwgfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcywgZTEgOj0gcC5UeXBlSWRUb1N0cmluZyhrZXlUeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcocyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcywgZTEgPSBwLlR5cGVJZFRvU3RyaW5nKHZhbHVlVHlwZSkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUk2NChpbnQ2NChzaXplKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuT3V0cHV0T2JqZWN0QmVnaW4oKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0T2JqZWN0RW5kKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVNldEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCb29sKGIgYm9vbCkgZXJyb3IgeworCWlmIGIgeworCQlyZXR1cm4gcC5Xcml0ZUkzMigxKQorCX0KKwlyZXR1cm4gcC5Xcml0ZUkzMigwKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJ5dGUoYiBpbnQ4KSBlcnJvciB7CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoYikpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlSTE2KHYgaW50MTYpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMih2KSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJMzIodiBpbnQzMikgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEk2NChpbnQ2NCh2KSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJNjQodiBpbnQ2NCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEk2NChpbnQ2NCh2KSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVEb3VibGUodiBmbG9hdDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RjY0KHYpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlU3RyaW5nKHYgc3RyaW5nKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0U3RyaW5nKHYpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQmluYXJ5KHYgW11ieXRlKSBlcnJvciB7CisJLy8gSlNPTiBsaWJyYXJ5IG9ubHkgdGFrZXMgaW4gYSBzdHJpbmcsCisJLy8gbm90IGFuIGFyYml0cmFyeSBieXRlIGFycmF5LCB0byBlbnN1cmUgYnl0ZXMgYXJlIHRyYW5zbWl0dGVkCisJLy8gZWZmaWNpZW50bHkgd2UgbXVzdCBjb252ZXJ0IHRoaXMgaW50byBhIHZhbGlkIEpTT04gc3RyaW5nCisJLy8gdGhlcmVmb3JlIHdlIHVzZSBiYXNlNjQgZW5jb2RpbmcgdG8gYXZvaWQgZXhjZXNzaXZlIGVzY2FwaW5nL3F1b3RpbmcKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwl3cml0ZXIgOj0gYmFzZTY0Lk5ld0VuY29kZXIoYmFzZTY0LlN0ZEVuY29kaW5nLCBwLndyaXRlcikKKwlpZiBfLCBlIDo9IHdyaXRlci5Xcml0ZSh2KTsgZSAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGUgOj0gd3JpdGVyLkNsb3NlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCisvLyBSZWFkaW5nIG1ldGhvZHMuCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJdmVyc2lvbiwgZXJyIDo9IHAuUmVhZEkzMigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJaWYgdmVyc2lvbiAhPSBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJVbmtub3duIFByb3RvY29sIHZlcnNpb24gJWQsIGV4cGVjdGVkIHZlcnNpb24gJWQiLCB2ZXJzaW9uLCBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OKQorCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCisJfQorCWlmIG5hbWUsIGVyciA9IHAuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwliVHlwZUlkLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJdHlwZUlkID0gVE1lc3NhZ2VUeXBlKGJUeXBlSWQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJaWYgc2VxSWQsIGVyciA9IHAuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgbmlsCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlRW5kKCkgZXJyb3IgeworCWVyciA6PSBwLlBhcnNlTGlzdEVuZCgpCisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikgeworCV8sIGVyciA9IHAuUGFyc2VPYmplY3RTdGFydCgpCisJcmV0dXJuICIiLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKHN0cmluZywgVFR5cGUsIGludDE2LCBlcnJvcikgeworCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihiKSA8IDEgfHwgYlswXSA9PSBKU09OX1JCUkFDRVswXSB8fCBiWzBdID09IEpTT05fUkJSQUNLRVRbMF0geworCQlyZXR1cm4gIiIsIFNUT1AsIC0xLCBuaWwKKwl9CisJZmllbGRJZCwgZXJyIDo9IHAuUmVhZEkxNigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCisJfQorCWlmIF8sIGVyciA9IHAuUGFyc2VPYmplY3RTdGFydCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuICIiLCBTVE9QLCBmaWVsZElkLCBlcnIKKwl9CisJc1R5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIFNUT1AsIGZpZWxkSWQsIGVycgorCX0KKwlmVHlwZSwgZXJyIDo9IHAuU3RyaW5nVG9UeXBlSWQoc1R5cGUpCisJcmV0dXJuICIiLCBmVHlwZSwgZmllbGRJZCwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRGaWVsZEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZU9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIFZPSUQsIDAsIGUKKwl9CisKKwkvLyByZWFkIGtleVR5cGUKKwlzS2V5VHlwZSwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKwlrZXlUeXBlLCBlID0gcC5TdHJpbmdUb1R5cGVJZChzS2V5VHlwZSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisKKwkvLyByZWFkIHZhbHVlVHlwZQorCXNWYWx1ZVR5cGUsIGUgOj0gcC5SZWFkU3RyaW5nKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisJdmFsdWVUeXBlLCBlID0gcC5TdHJpbmdUb1R5cGVJZChzVmFsdWVUeXBlKQorCWlmIGUgIT0gbmlsIHsKKwkJcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQorCX0KKworCS8vIHJlYWQgc2l6ZQorCWlTaXplLCBlIDo9IHAuUmVhZEk2NCgpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCisJfQorCXNpemUgPSBpbnQoaVNpemUpCisKKwlfLCBlID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKKwlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNYXBFbmQoKSBlcnJvciB7CisJZSA6PSBwLlBhcnNlT2JqZWN0RW5kKCkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJcmV0dXJuIHAuUGFyc2VFbGVtTGlzdEJlZ2luKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZExpc3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCXJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgZXJyb3IpIHsKKwl2YWx1ZSwgZXJyIDo9IHAuUmVhZEkzMigpCisJcmV0dXJuICh2YWx1ZSAhPSAwKSwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDgodiksIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTE2KCkgKGludDE2LCBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJNjQoKQorCXJldHVybiBpbnQxNih2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJMzIoKSAoaW50MzIsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDMyKHYpLCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEk2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUk2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkRG91YmxlKCkgKGZsb2F0NjQsIGVycm9yKSB7CisJdiwgXywgZXJyIDo9IHAuUGFyc2VGNjQoKQorCXJldHVybiB2LCBlcnIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZFN0cmluZygpIChzdHJpbmcsIGVycm9yKSB7CisJdmFyIHYgc3RyaW5nCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIHYsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCisJCXYgPSB2YWx1ZQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBlcnIKKwkJfQorCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCX0KKwkJaWYgc3RyaW5nKGIpICE9IHN0cmluZyhKU09OX05VTEwpIHsKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoYikpCisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfSBlbHNlIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhmKSkKKwkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwl2YXIgdiBbXWJ5dGUKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fUVVPVEUgeworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXZhbHVlLCBlcnIgOj0gcC5QYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKworCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCWVyciA9IHAud3JpdGVyLkZsdXNoKCkKKwlpZiBlcnIgPT0gbmlsIHsKKwkJZXJyID0gcC50cmFucy5GbHVzaChjdHgpCisJfQorCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwRGVmYXVsdERlcHRoKHAsIGZpZWxkVHlwZSkKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgVHJhbnNwb3J0KCkgVFRyYW5zcG9ydCB7CisJcmV0dXJuIHAudHJhbnMKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcywgZTEgOj0gcC5UeXBlSWRUb1N0cmluZyhlbGVtVHlwZSkKKwlpZiBlMSAhPSBuaWwgeworCQlyZXR1cm4gZTEKKwl9CisJaWYgZSA6PSBwLldyaXRlU3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUk2NChpbnQ2NChzaXplKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBQYXJzZUVsZW1MaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIDAsIGUKKwl9CisJc0VsZW1UeXBlLCBlcnIgOj0gcC5SZWFkU3RyaW5nKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIHNpemUsIGVycgorCX0KKwllbGVtVHlwZSwgZXJyID0gcC5TdHJpbmdUb1R5cGVJZChzRWxlbVR5cGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyCisJfQorCW5TaXplLCBlcnIyIDo9IHAuUmVhZEk2NCgpCisJc2l6ZSA9IGludChuU2l6ZSkKKwlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycjIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgcmVhZEVsZW1MaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIDAsIGUKKwl9CisJc0VsZW1UeXBlLCBlcnIgOj0gcC5SZWFkU3RyaW5nKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIHNpemUsIGVycgorCX0KKwllbGVtVHlwZSwgZXJyID0gcC5TdHJpbmdUb1R5cGVJZChzRWxlbVR5cGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyCisJfQorCW5TaXplLCBlcnIyIDo9IHAuUmVhZEk2NCgpCisJc2l6ZSA9IGludChuU2l6ZSkKKwlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycjIKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgd3JpdGVFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlzLCBlMSA6PSBwLlR5cGVJZFRvU3RyaW5nKGVsZW1UeXBlKQorCWlmIGUxICE9IG5pbCB7CisJCXJldHVybiBlMQorCX0KKwlpZiBlIDo9IHAuT3V0cHV0U3RyaW5nKHMpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5PdXRwdXRJNjQoaW50NjQoc2l6ZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgVHlwZUlkVG9TdHJpbmcoZmllbGRUeXBlIFRUeXBlKSAoc3RyaW5nLCBlcnJvcikgeworCXN3aXRjaCBieXRlKGZpZWxkVHlwZSkgeworCWNhc2UgQk9PTDoKKwkJcmV0dXJuICJ0ZiIsIG5pbAorCWNhc2UgQllURToKKwkJcmV0dXJuICJpOCIsIG5pbAorCWNhc2UgSTE2OgorCQlyZXR1cm4gImkxNiIsIG5pbAorCWNhc2UgSTMyOgorCQlyZXR1cm4gImkzMiIsIG5pbAorCWNhc2UgSTY0OgorCQlyZXR1cm4gImk2NCIsIG5pbAorCWNhc2UgRE9VQkxFOgorCQlyZXR1cm4gImRibCIsIG5pbAorCWNhc2UgU1RSSU5HOgorCQlyZXR1cm4gInN0ciIsIG5pbAorCWNhc2UgU1RSVUNUOgorCQlyZXR1cm4gInJlYyIsIG5pbAorCWNhc2UgTUFQOgorCQlyZXR1cm4gIm1hcCIsIG5pbAorCWNhc2UgU0VUOgorCQlyZXR1cm4gInNldCIsIG5pbAorCWNhc2UgTElTVDoKKwkJcmV0dXJuICJsc3QiLCBuaWwKKwl9CisKKwllIDo9IGZtdC5FcnJvcmYoIlVua25vd24gZmllbGRUeXBlOiAlZCIsIGludChmaWVsZFR5cGUpKQorCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorfQorCitmdW5jIChwICpUSlNPTlByb3RvY29sKSBTdHJpbmdUb1R5cGVJZChmaWVsZFR5cGUgc3RyaW5nKSAoVFR5cGUsIGVycm9yKSB7CisJc3dpdGNoIGZpZWxkVHlwZSB7CisJY2FzZSAidGYiOgorCQlyZXR1cm4gVFR5cGUoQk9PTCksIG5pbAorCWNhc2UgImk4IjoKKwkJcmV0dXJuIFRUeXBlKEJZVEUpLCBuaWwKKwljYXNlICJpMTYiOgorCQlyZXR1cm4gVFR5cGUoSTE2KSwgbmlsCisJY2FzZSAiaTMyIjoKKwkJcmV0dXJuIFRUeXBlKEkzMiksIG5pbAorCWNhc2UgImk2NCI6CisJCXJldHVybiBUVHlwZShJNjQpLCBuaWwKKwljYXNlICJkYmwiOgorCQlyZXR1cm4gVFR5cGUoRE9VQkxFKSwgbmlsCisJY2FzZSAic3RyIjoKKwkJcmV0dXJuIFRUeXBlKFNUUklORyksIG5pbAorCWNhc2UgInJlYyI6CisJCXJldHVybiBUVHlwZShTVFJVQ1QpLCBuaWwKKwljYXNlICJtYXAiOgorCQlyZXR1cm4gVFR5cGUoTUFQKSwgbmlsCisJY2FzZSAic2V0IjoKKwkJcmV0dXJuIFRUeXBlKFNFVCksIG5pbAorCWNhc2UgImxzdCI6CisJCXJldHVybiBUVHlwZShMSVNUKSwgbmlsCisJfQorCisJZSA6PSBmbXQuRXJyb3JmKCJVbmtub3duIHR5cGUgaWRlbnRpZmllcjogJXMiLCBmaWVsZFR5cGUpCisJcmV0dXJuIFRUeXBlKFNUT1ApLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzRkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMCwwICsxLDY1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlbmNvZGluZy9iYXNlNjQiCisJImVuY29kaW5nL2pzb24iCisJImZtdCIKKwkibWF0aCIKKwkic3RyY29udiIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJvb2xlYW4iCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlleHBlY3RlZCA6PSAiIgorCQlpZiB2YWx1ZSB7CisJCQlleHBlY3RlZCA9ICIxIgorCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgPSAiMCIKKwkJfQorCQlpZiBzICE9IGV4cGVjdGVkIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyBleHBlY3RlZCIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gLTEKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8ICh2ICE9IDApICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJvb2xlYW4iCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJaWYgdmFsdWUgeworCQkJdHJhbnMuV3JpdGUoW11ieXRleycxJ30pIC8vIG5vdCBKU09OX1RSVUUKKwkJfSBlbHNlIHsKKwkJCXRyYW5zLldyaXRlKFtdYnl0ZXsnMCd9KSAvLyBub3QgSlNPTl9GQUxTRQorCQl9CisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXZ2IDo9IC0xCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2dik7IGVyciAhPSBuaWwgfHwgKHZ2ICE9IDApICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHZ2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50OCgwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJieXRlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRCeXRlKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sSTE2KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDE2IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTE2KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDE2KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRJMTYoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJMzIodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MzIiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMzIodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MzIoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkzMigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQ2NCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ2NCgwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEk2NCgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJkb3VibGUiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05BTikgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pKQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCQl2IDo9IGZsb2F0NjQoMCkKKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJCW4gOj0gTmV3TnVtZXJpY0Zyb21Eb3VibGUodmFsdWUpCisJCXRyYW5zLldyaXRlU3RyaW5nKG4uU3RyaW5nKCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIDEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiAhbWF0aC5Jc0luZih2LCAtMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgIW1hdGguSXNOYU4odikgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVTdHJpbmcodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzWzBdICE9ICciJyB8fCBzW2xlbihzKS0xXSAhPSAnIicgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJyV2Jywgd3JvdGUgJyV2JywgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGZtdC5TcHJpbnQoIlwiIiwgdmFsdWUsICJcIiIpKQorCQl9CisJCXYgOj0gbmV3KHN0cmluZykKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdik7IGVyciAhPSBuaWwgfHwgKnYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKHZhbHVlKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl2MSA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJpbmFyeSIKKwl2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQorCWI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKKwliYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKKwliNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJcyA6PSB0cmFucy5TdHJpbmcoKQorCWV4cGVjdGVkU3RyaW5nIDo9IGZtdC5TcHJpbnQoIlwiIiwgYjY0U3RyaW5nLCAiXCIiKQorCWlmIHMgIT0gZXhwZWN0ZWRTdHJpbmcgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldlxuICB3cm90ZTogIFwiJXZcIlxuZXhwZWN0ZWQ6IFwiJXZcIiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBleHBlY3RlZFN0cmluZykKKwl9CisJdjEsIGVyciA6PSBwLlJlYWRCaW5hcnkoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgYmluYXJ5OiAlcyIsIGVyci5FcnJvcigpKQorCX0KKwlpZiBsZW4odjEpICE9IGxlbih2YWx1ZSkgeworCQl0LkZhdGFsZigiSW52YWxpZCB2YWx1ZSBmb3IgYmluYXJ5XG5leHBlY3RlZDogXCIldlwiXG4gICByZWFkOiBcIiV2XCIiLCB2YWx1ZSwgdjEpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIHZhbHVlIHsKKwkJaWYgdjFba10gIT0gdiB7CisJCQl0LkZhdGFsZigiSW52YWxpZCB2YWx1ZSBmb3IgYmluYXJ5IGF0ICV2XG5leHBlY3RlZDogXCIldlwiXG4gICByZWFkOiBcIiV2XCIiLCBrLCB2LCB2MVtrXSkKKwkJfQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiYmluYXJ5IgorCXZhbHVlIDo9IHByb3RvY29sX2JkYXRhCisJYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQorCWJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQorCWI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCXRyYW5zLldyaXRlU3RyaW5nKGpzb25RdW90ZShiNjRTdHJpbmcpKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwl2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgbGVuZ3RoICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkIGxlbmd0aDogJXYiLCB0aGV0eXBlLCBsZW4odmFsdWUpLCBzLCBsZW4odikpCisJfQorCWZvciBpIDo9IDA7IGkgPCBsZW4odik7IGkrKyB7CisJCWlmIHZbaV0gIT0gdmFsdWVbaV0geworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJWQgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgaSwgdmFsdWVbaV0sIHMsIHZbaV0pCisJCX0KKwl9CisJdjEgOj0gbmV3KHN0cmluZykKKwlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IGI2NFN0cmluZyB7CisJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xMaXN0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImxpc3QiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVMaXN0QmVnaW4oVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCXN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQorCX0KKwlsIDo9ICpzdHIxCisJaWYgbGVuKGwpIDwgMiB7CisJCXQuRmF0YWxmKCJMaXN0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKKwl9CisJaWYgbFswXSAhPSAiZGJsIiB7CisJCXQuRmF0YWwoIkludmFsaWQgdHlwZSBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIFNUUklORywgIiwgYnV0IHdhczogIiwgbFswXSkKKwl9CisJaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgeworCQl0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbFNldCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzZXQiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVTZXRCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJfQorCXAuV3JpdGVTZXRFbmQoKQorCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQorCX0KKwlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKKwlzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQorCWVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKKwl9CisJbCA6PSAqc3RyMQorCWlmIGxlbihsKSA8IDIgeworCQl0LkZhdGFsZigiU2V0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKKwl9CisJaWYgbFswXSAhPSAiZGJsIiB7CisJCXQuRmF0YWwoIkludmFsaWQgdHlwZSBmb3Igc2V0LCBleHBlY3RlZDogIiwgRE9VQkxFLCAiLCBidXQgd2FzOiAiLCBsWzBdKQorCX0KKwlpZiBpbnQobFsxXS4oZmxvYXQ2NCkpICE9IGxlbihET1VCTEVfVkFMVUVTKSB7CisJCXQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXM6ICIsIGxbMV0pCisJfQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJcyA6PSBsW2srMl0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05BTiB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgcy4oZmxvYXQ2NCkgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xNYXAodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAibWFwIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKKwlwLldyaXRlTWFwQmVnaW4oVFR5cGUoSTMyKSwgVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTMyKGludDMyKGspKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBrZXkgaW50MzIgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlIGZsb2F0NjQgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwl9CisJcC5Xcml0ZU1hcEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCWlmIHN0clswXSAhPSAnWycgfHwgc3RyW2xlbihzdHIpLTFdICE9ICddJyB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzLCB3cm90ZTogJXYsIGluIGdvOiAldiIsIHRoZXR5cGUsIHN0ciwgRE9VQkxFX1ZBTFVFUykKKwl9CisJZXhwZWN0ZWRLZXlUeXBlLCBleHBlY3RlZFZhbHVlVHlwZSwgZXhwZWN0ZWRTaXplLCBlcnIgOj0gcC5SZWFkTWFwQmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRXJyb3Igd2hpbGUgcmVhZGluZyBtYXAgYmVnaW46ICVzIiwgZXJyLkVycm9yKCkpCisJfQorCWlmIGV4cGVjdGVkS2V5VHlwZSAhPSBJMzIgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAga2V5IHR5cGUgIiwgSTMyLCAiLCBidXQgd2FzICIsIGV4cGVjdGVkS2V5VHlwZSkKKwl9CisJaWYgZXhwZWN0ZWRWYWx1ZVR5cGUgIT0gRE9VQkxFIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHZhbHVlIHR5cGUgIiwgRE9VQkxFLCAiLCBidXQgd2FzICIsIGV4cGVjdGVkVmFsdWVUeXBlKQorCX0KKwlpZiBleHBlY3RlZFNpemUgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHNpemUgb2YgIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzICIsIGV4cGVjdGVkU2l6ZSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpaywgZXJyIDo9IHAuUmVhZEkzMigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5GYXRhbGYoIkJhZCBrZXkgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiwgZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgaWssIHN0cmluZyhrKSwgZXJyLkVycm9yKCkpCisJCX0KKwkJaWYgaW50KGlrKSAhPSBrIHsKKwkJCXQuRmF0YWxmKCJCYWQga2V5IGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCBpaywgaykKKwkJfQorCQlkdiwgZXJyIDo9IHAuUmVhZERvdWJsZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2LCBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBkdiwgdmFsdWUsIGVyci5FcnJvcigpKQorCQl9CisJCXMgOj0gc3RyY29udi5Gb3JtYXRGbG9hdChkdiwgJ2cnLCAxMCwgNjQpCisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmICFtYXRoLklzSW5mKGR2LCAxKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIDApIHsKKwkJCWlmICFtYXRoLklzSW5mKGR2LCAwKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmICFtYXRoLklzTmFOKGR2KSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgOj0gc3RyY29udi5Gb3JtYXRGbG9hdCh2YWx1ZSwgJ2cnLCAxMCwgNjQpCisJCQlpZiBzICE9IGV4cGVjdGVkIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZCAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBleHBlY3RlZCkKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwl9CisJZXJyID0gcC5SZWFkTWFwRW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIkVycm9yIHdoaWxlIHJlYWRpbmcgbWFwIGVuZDogJXMiLCBlcnIuRXJyb3IoKSkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2xvd2xldmVsX2JlbmNobWFya3NfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTczNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KQEAgLTAsMCArMSw1NDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJInRlc3RpbmciCispCisKK3ZhciBiaW5hcnlQcm90b0YgPSBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCit2YXIgY29tcGFjdFByb3RvRiA9IE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwordmFyIGJ1ZiA9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpCisKK3ZhciB0ZnYgPSBbXVRUcmFuc3BvcnRGYWN0b3J5eworCU5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpLAorCU5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkoYnVmLCBidWYsIHRydWUpLAorCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCb29sXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJvb2woYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STE2XzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5STMyXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qnl0ZV8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCeXRlKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5STY0XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0JpbmFyeUkzMl8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVJMzIoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlJNjRfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQmluYXJ5RG91YmxlXzIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZURvdWJsZShiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0JpbmFyeVN0cmluZ18yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtCaW5hcnlCaW5hcnlfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJ5dGVfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RJMTZfMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkzMl8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEk2NF8wKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdERvdWJsZTAoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0U3RyaW5nMChiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RCaW5hcnkwKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJ5dGVfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RJMTZfMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkzMl8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEk2NF8xKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdERvdWJsZTEoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0U3RyaW5nMShiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RCaW5hcnkxKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KKworZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCisJfQorfQorCitmdW5jIEJlbmNobWFya0NvbXBhY3RJMTZfMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKKwl9Cit9CisKK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEkzMl8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdEk2NF8yKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlSTY0KGIsIHAsIHRyYW5zKQorCX0KK30KK2Z1bmMgQmVuY2htYXJrQ29tcGFjdERvdWJsZTIoYiAqdGVzdGluZy5CKSB7CisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQorCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKKwlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgeworCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCisJfQorfQorZnVuYyBCZW5jaG1hcmtDb21wYWN0U3RyaW5nMihiICp0ZXN0aW5nLkIpIHsKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CisJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQorCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CisJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKKwl9Cit9CitmdW5jIEJlbmNobWFya0NvbXBhY3RCaW5hcnkyKGIgKnRlc3RpbmcuQikgeworCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KKwlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCisJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKKwkJUmVhZFdyaXRlQmluYXJ5KGIsIHAsIHRyYW5zKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTM2ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiYnl0ZXMiCisJImNvbnRleHQiCispCisKKy8vIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgordHlwZSBUTWVtb3J5QnVmZmVyIHN0cnVjdCB7CisJKmJ5dGVzLkJ1ZmZlcgorCXNpemUgaW50Cit9CisKK3R5cGUgVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKKwlzaXplIGludAorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHRyYW5zICE9IG5pbCB7CisJCXQsIG9rIDo9IHRyYW5zLigqVE1lbW9yeUJ1ZmZlcikKKwkJaWYgb2sgJiYgdC5zaXplID4gMCB7CisJCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpLCBuaWwKKwkJfQorCX0KKwlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbihwLnNpemUpLCBuaWwKK30KKworZnVuYyBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeShzaXplIGludCkgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gJlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5e3NpemU6IHNpemV9Cit9CisKK2Z1bmMgTmV3VE1lbW9yeUJ1ZmZlcigpICpUTWVtb3J5QnVmZmVyIHsKKwlyZXR1cm4gJlRNZW1vcnlCdWZmZXJ7QnVmZmVyOiAmYnl0ZXMuQnVmZmVye30sIHNpemU6IDB9Cit9CisKK2Z1bmMgTmV3VE1lbW9yeUJ1ZmZlckxlbihzaXplIGludCkgKlRNZW1vcnlCdWZmZXIgeworCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgc2l6ZSkKKwlyZXR1cm4gJlRNZW1vcnlCdWZmZXJ7QnVmZmVyOiBieXRlcy5OZXdCdWZmZXIoYnVmKSwgc2l6ZTogc2l6ZX0KK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgSXNPcGVuKCkgYm9vbCB7CisJcmV0dXJuIHRydWUKK30KKworZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgT3BlbigpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIENsb3NlKCkgZXJyb3IgeworCXAuQnVmZmVyLlJlc2V0KCkKKwlyZXR1cm4gbmlsCit9CisKKy8vIEZsdXNoaW5nIGEgbWVtb3J5IGJ1ZmZlciBpcyBhIG5vLW9wCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUTWVtb3J5QnVmZmVyKSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CisJcmV0dXJuIHVpbnQ2NChwLkJ1ZmZlci5MZW4oKSkKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyZThiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0TWVtb3J5QnVmZmVyKHQgKnRlc3RpbmcuVCkgeworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXJMZW4oMTAyNCkKKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbWVzc2FnZXR5cGUuZ28gYi9saWIvZ28vdGhyaWZ0L21lc3NhZ2V0eXBlLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWIyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L21lc3NhZ2V0eXBlLmdvCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gTWVzc2FnZSB0eXBlIGNvbnN0YW50cyBpbiB0aGUgVGhyaWZ0IHByb3RvY29sLgordHlwZSBUTWVzc2FnZVR5cGUgaW50MzIKKworY29uc3QgKAorCUlOVkFMSURfVE1FU1NBR0VfVFlQRSBUTWVzc2FnZVR5cGUgPSAwCisJQ0FMTCAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDEKKwlSRVBMWSAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlID0gMgorCUVYQ0VQVElPTiAgICAgICAgICAgICBUTWVzc2FnZVR5cGUgPSAzCisJT05FV0FZICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDQKKykKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjhhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKwkic3RyaW5ncyIKKykKKworLyoKK1RNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yCit0aGF0IGFsbG93cyBhIFRocmlmdCBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLAorYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKworTk9URTogVEhJUyBJUyBOT1QgVVNFRCBCWSBTRVJWRVJTLiAgT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdAorZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisKK1RoaXMgZXhhbXBsZSB1c2VzIGEgc2luZ2xlIHNvY2tldCB0cmFuc3BvcnQgdG8gaW52b2tlIHR3byBzZXJ2aWNlczoKKworc29ja2V0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCit0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQorcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisKK21wIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKQorc2VydmljZSA6PSBDYWxjdWxhdG9yLk5ld0NhbGN1bGF0b3JDbGllbnQobXApCisKK21wMiA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0IikKK3NlcnZpY2UyIDo9IFdlYXRoZXJSZXBvcnQuTmV3V2VhdGhlclJlcG9ydENsaWVudChtcDIpCisKK2VyciA6PSB0cmFuc3BvcnQuT3BlbigpCitpZiBlcnIgIT0gbmlsIHsKKwl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorfQorCitmbXQuUHJpbnRsbihzZXJ2aWNlLkFkZCgyLDIpKQorZm10LlByaW50bG4oc2VydmljZTIuR2V0VGVtcGVyYXR1cmUoKSkKKyovCisKK3R5cGUgVE11bHRpcGxleGVkUHJvdG9jb2wgc3RydWN0IHsKKwlUUHJvdG9jb2wKKwlzZXJ2aWNlTmFtZSBzdHJpbmcKK30KKworY29uc3QgTVVMVElQTEVYRURfU0VQQVJBVE9SID0gIjoiCisKK2Z1bmMgTmV3VE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wgVFByb3RvY29sLCBzZXJ2aWNlTmFtZSBzdHJpbmcpICpUTXVsdGlwbGV4ZWRQcm90b2NvbCB7CisJcmV0dXJuICZUTXVsdGlwbGV4ZWRQcm90b2NvbHsKKwkJVFByb3RvY29sOiAgIHByb3RvY29sLAorCQlzZXJ2aWNlTmFtZTogc2VydmljZU5hbWUsCisJfQorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvciB7CisJaWYgdHlwZUlkID09IENBTEwgfHwgdHlwZUlkID09IE9ORVdBWSB7CisJCXJldHVybiB0LlRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbih0LnNlcnZpY2VOYW1lK01VTFRJUExFWEVEX1NFUEFSQVRPUituYW1lLCB0eXBlSWQsIHNlcWlkKQorCX0gZWxzZSB7CisJCXJldHVybiB0LlRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlSWQsIHNlcWlkKQorCX0KK30KKworLyoKK1RNdWx0aXBsZXhlZFByb2Nlc3NvciBpcyBhIFRQcm9jZXNzb3IgYWxsb3dpbmcKK2Egc2luZ2xlIFRTZXJ2ZXIgdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKworVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKK3Byb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCit2YXIgcHJvY2Vzc29yID0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb2Nlc3NvcigpCisKK2ZpcnN0UHJvY2Vzc29yIDo9Citwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIkZpcnN0U2VydmljZSIsIGZpcnN0UHJvY2Vzc29yKQorCitwcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoCisgICJDYWxjdWxhdG9yIiwKKyAgQ2FsY3VsYXRvci5OZXdDYWxjdWxhdG9yUHJvY2Vzc29yKCZDYWxjdWxhdG9ySGFuZGxlcnt9KSwKKykKKworcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAiV2VhdGhlclJlcG9ydCIsCisgIFdlYXRoZXJSZXBvcnQuTmV3V2VhdGhlclJlcG9ydFByb2Nlc3NvcigmV2VhdGhlclJlcG9ydEhhbmRsZXJ7fSksCispCisKK3NlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLCBUSU1FT1VUKQoraWYgZXJyICE9IG5pbCB7CisgIHQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKK30KK3NlcnZlciA6PSB0aHJpZnQuTmV3VFNpbXBsZVNlcnZlcjIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCitzZXJ2ZXIuU2VydmUoKTsKKyovCisKK3R5cGUgVE11bHRpcGxleGVkUHJvY2Vzc29yIHN0cnVjdCB7CisJc2VydmljZVByb2Nlc3Nvck1hcCBtYXBbc3RyaW5nXVRQcm9jZXNzb3IKKwlEZWZhdWx0UHJvY2Vzc29yICAgIFRQcm9jZXNzb3IKK30KKworZnVuYyBOZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSAqVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKwlyZXR1cm4gJlRNdWx0aXBsZXhlZFByb2Nlc3NvcnsKKwkJc2VydmljZVByb2Nlc3Nvck1hcDogbWFrZShtYXBbc3RyaW5nXVRQcm9jZXNzb3IpLAorCX0KK30KKworZnVuYyAodCAqVE11bHRpcGxleGVkUHJvY2Vzc29yKSBSZWdpc3RlckRlZmF1bHQocHJvY2Vzc29yIFRQcm9jZXNzb3IpIHsKKwl0LkRlZmF1bHRQcm9jZXNzb3IgPSBwcm9jZXNzb3IKK30KKworZnVuYyAodCAqVE11bHRpcGxleGVkUHJvY2Vzc29yKSBSZWdpc3RlclByb2Nlc3NvcihuYW1lIHN0cmluZywgcHJvY2Vzc29yIFRQcm9jZXNzb3IpIHsKKwlpZiB0LnNlcnZpY2VQcm9jZXNzb3JNYXAgPT0gbmlsIHsKKwkJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwID0gbWFrZShtYXBbc3RyaW5nXVRQcm9jZXNzb3IpCisJfQorCXQuc2VydmljZVByb2Nlc3Nvck1hcFtuYW1lXSA9IHByb2Nlc3NvcgorfQorCitmdW5jICh0ICpUTXVsdGlwbGV4ZWRQcm9jZXNzb3IpIFByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKSB7CisJbmFtZSwgdHlwZUlkLCBzZXFpZCwgZXJyIDo9IGluLlJlYWRNZXNzYWdlQmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycgorCX0KKwlpZiB0eXBlSWQgIT0gQ0FMTCAmJiB0eXBlSWQgIT0gT05FV0FZIHsKKwkJcmV0dXJuIGZhbHNlLCBmbXQuRXJyb3JmKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSAldiIsIHR5cGVJZCkKKwl9CisJLy9leHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUKKwl2IDo9IHN0cmluZ3MuU3BsaXROKG5hbWUsIE1VTFRJUExFWEVEX1NFUEFSQVRPUiwgMikKKwlpZiBsZW4odikgIT0gMiB7CisJCWlmIHQuRGVmYXVsdFByb2Nlc3NvciAhPSBuaWwgeworCQkJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgbmFtZSwgdHlwZUlkLCBzZXFpZCkKKwkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNtYiwgb3V0KQorCQl9CisJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIsIG5hbWUpCisJfQorCWFjdHVhbFByb2Nlc3Nvciwgb2sgOj0gdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW3ZbMF1dCisJaWYgIW9rIHsKKwkJcmV0dXJuIGZhbHNlLCBmbXQuRXJyb3JmKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAlcy4gIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iLCB2WzBdKQorCX0KKwlzbWIgOj0gTmV3U3RvcmVkTWVzc2FnZVByb3RvY29sKGluLCB2WzFdLCB0eXBlSWQsIHNlcWlkKQorCXJldHVybiBhY3R1YWxQcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNtYiwgb3V0KQorfQorCisvL1Byb3RvY29sIHRoYXQgdXNlIHN0b3JlZCBtZXNzYWdlIGZvciBSZWFkTWVzc2FnZUJlZ2luCit0eXBlIHN0b3JlZE1lc3NhZ2VQcm90b2NvbCBzdHJ1Y3QgeworCVRQcm90b2NvbAorCW5hbWUgICBzdHJpbmcKKwl0eXBlSWQgVE1lc3NhZ2VUeXBlCisJc2VxaWQgIGludDMyCit9CisKK2Z1bmMgTmV3U3RvcmVkTWVzc2FnZVByb3RvY29sKHByb3RvY29sIFRQcm90b2NvbCwgbmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSAqc3RvcmVkTWVzc2FnZVByb3RvY29sIHsKKwlyZXR1cm4gJnN0b3JlZE1lc3NhZ2VQcm90b2NvbHtwcm90b2NvbCwgbmFtZSwgdHlwZUlkLCBzZXFpZH0KK30KKworZnVuYyAocyAqc3RvcmVkTWVzc2FnZVByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHMubmFtZSwgcy50eXBlSWQsIHMuc2VxaWQsIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9udW1lcmljLmdvIGIvbGliL2dvL3RocmlmdC9udW1lcmljLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGRhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L251bWVyaWMuZ28KQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkibWF0aCIKKwkic3RyY29udiIKKykKKwordHlwZSBOdW1lcmljIGludGVyZmFjZSB7CisJSW50NjQoKSBpbnQ2NAorCUludDMyKCkgaW50MzIKKwlJbnQxNigpIGludDE2CisJQnl0ZSgpIGJ5dGUKKwlJbnQoKSBpbnQKKwlGbG9hdDY0KCkgZmxvYXQ2NAorCUZsb2F0MzIoKSBmbG9hdDMyCisJU3RyaW5nKCkgc3RyaW5nCisJaXNOdWxsKCkgYm9vbAorfQorCit0eXBlIG51bWVyaWMgc3RydWN0IHsKKwlpVmFsdWUgaW50NjQKKwlkVmFsdWUgZmxvYXQ2NAorCXNWYWx1ZSBzdHJpbmcKKwlpc05pbCAgYm9vbAorfQorCit2YXIgKAorCUlORklOSVRZICAgICAgICAgIE51bWVyaWMKKwlORUdBVElWRV9JTkZJTklUWSBOdW1lcmljCisJTkFOICAgICAgICAgICAgICAgTnVtZXJpYworCVpFUk8gICAgICAgICAgICAgIE51bWVyaWMKKwlOVU1FUklDX05VTEwgICAgICBOdW1lcmljCispCisKK2Z1bmMgTmV3TnVtZXJpY0Zyb21Eb3VibGUoZFZhbHVlIGZsb2F0NjQpIE51bWVyaWMgeworCWlmIG1hdGguSXNJbmYoZFZhbHVlLCAxKSB7CisJCXJldHVybiBJTkZJTklUWQorCX0KKwlpZiBtYXRoLklzSW5mKGRWYWx1ZSwgLTEpIHsKKwkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZCisJfQorCWlmIG1hdGguSXNOYU4oZFZhbHVlKSB7CisJCXJldHVybiBOQU4KKwl9CisJaVZhbHVlIDo9IGludDY0KGRWYWx1ZSkKKwlzVmFsdWUgOj0gc3RyY29udi5Gb3JtYXRGbG9hdChkVmFsdWUsICdnJywgMTAsIDY0KQorCWlzTmlsIDo9IGZhbHNlCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KK30KKworZnVuYyBOZXdOdW1lcmljRnJvbUk2NChpVmFsdWUgaW50NjQpIE51bWVyaWMgeworCWRWYWx1ZSA6PSBmbG9hdDY0KGlWYWx1ZSkKKwlzVmFsdWUgOj0gc3RyaW5nKGlWYWx1ZSkKKwlpc05pbCA6PSBmYWxzZQorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGlWYWx1ZSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOaWx9Cit9CisKK2Z1bmMgTmV3TnVtZXJpY0Zyb21JMzIoaVZhbHVlIGludDMyKSBOdW1lcmljIHsKKwlkVmFsdWUgOj0gZmxvYXQ2NChpVmFsdWUpCisJc1ZhbHVlIDo9IHN0cmluZyhpVmFsdWUpCisJaXNOaWwgOj0gZmFsc2UKKwlyZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpbnQ2NChpVmFsdWUpLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KK30KKworZnVuYyBOZXdOdW1lcmljRnJvbVN0cmluZyhzVmFsdWUgc3RyaW5nKSBOdW1lcmljIHsKKwlpZiBzVmFsdWUgPT0gSU5GSU5JVFkuU3RyaW5nKCkgeworCQlyZXR1cm4gSU5GSU5JVFkKKwl9CisJaWYgc1ZhbHVlID09IE5FR0FUSVZFX0lORklOSVRZLlN0cmluZygpIHsKKwkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZCisJfQorCWlmIHNWYWx1ZSA9PSBOQU4uU3RyaW5nKCkgeworCQlyZXR1cm4gTkFOCisJfQorCWlWYWx1ZSwgXyA6PSBzdHJjb252LlBhcnNlSW50KHNWYWx1ZSwgMTAsIDY0KQorCWRWYWx1ZSwgXyA6PSBzdHJjb252LlBhcnNlRmxvYXQoc1ZhbHVlLCA2NCkKKwlpc05pbCA6PSBsZW4oc1ZhbHVlKSA9PSAwCisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KK30KKworZnVuYyBOZXdOdW1lcmljRnJvbUpTT05TdHJpbmcoc1ZhbHVlIHN0cmluZywgaXNOdWxsIGJvb2wpIE51bWVyaWMgeworCWlmIGlzTnVsbCB7CisJCXJldHVybiBOZXdOdWxsTnVtZXJpYygpCisJfQorCWlmIHNWYWx1ZSA9PSBKU09OX0lORklOSVRZIHsKKwkJcmV0dXJuIElORklOSVRZCisJfQorCWlmIHNWYWx1ZSA9PSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKKwkJcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZCisJfQorCWlmIHNWYWx1ZSA9PSBKU09OX05BTiB7CisJCXJldHVybiBOQU4KKwl9CisJaVZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoc1ZhbHVlLCAxMCwgNjQpCisJZFZhbHVlLCBfIDo9IHN0cmNvbnYuUGFyc2VGbG9hdChzVmFsdWUsIDY0KQorCXJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGlWYWx1ZSwgZFZhbHVlOiBkVmFsdWUsIHNWYWx1ZTogc1ZhbHVlLCBpc05pbDogaXNOdWxsfQorfQorCitmdW5jIE5ld051bGxOdW1lcmljKCkgTnVtZXJpYyB7CisJcmV0dXJuICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiAwLjAsIHNWYWx1ZTogIiIsIGlzTmlsOiB0cnVlfQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQ2NCgpIGludDY0IHsKKwlyZXR1cm4gcC5pVmFsdWUKK30KKworZnVuYyAocCAqbnVtZXJpYykgSW50MzIoKSBpbnQzMiB7CisJcmV0dXJuIGludDMyKHAuaVZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBJbnQxNigpIGludDE2IHsKKwlyZXR1cm4gaW50MTYocC5pVmFsdWUpCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEJ5dGUoKSBieXRlIHsKKwlyZXR1cm4gYnl0ZShwLmlWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgSW50KCkgaW50IHsKKwlyZXR1cm4gaW50KHAuaVZhbHVlKQorfQorCitmdW5jIChwICpudW1lcmljKSBGbG9hdDY0KCkgZmxvYXQ2NCB7CisJcmV0dXJuIHAuZFZhbHVlCit9CisKK2Z1bmMgKHAgKm51bWVyaWMpIEZsb2F0MzIoKSBmbG9hdDMyIHsKKwlyZXR1cm4gZmxvYXQzMihwLmRWYWx1ZSkKK30KKworZnVuYyAocCAqbnVtZXJpYykgU3RyaW5nKCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5zVmFsdWUKK30KKworZnVuYyAocCAqbnVtZXJpYykgaXNOdWxsKCkgYm9vbCB7CisJcmV0dXJuIHAuaXNOaWwKK30KKworZnVuYyBpbml0KCkgeworCUlORklOSVRZID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguSW5mKDEpLCBzVmFsdWU6ICJJbmZpbml0eSIsIGlzTmlsOiBmYWxzZX0KKwlORUdBVElWRV9JTkZJTklUWSA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLkluZigtMSksIHNWYWx1ZTogIi1JbmZpbml0eSIsIGlzTmlsOiBmYWxzZX0KKwlOQU4gPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5OYU4oKSwgc1ZhbHVlOiAiTmFOIiwgaXNOaWw6IGZhbHNlfQorCVpFUk8gPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogMCwgc1ZhbHVlOiAiMCIsIGlzTmlsOiBmYWxzZX0KKwlOVU1FUklDX05VTEwgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogMCwgc1ZhbHVlOiAiMCIsIGlzTmlsOiB0cnVlfQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wb2ludGVyaXplLmdvIGIvbGliL2dvL3RocmlmdC9wb2ludGVyaXplLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNmIyYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3BvaW50ZXJpemUuZ28KQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBUaGlzIGZpbGUgaXMgaG9tZSB0byBoZWxwZXJzIHRoYXQgY29udmVydCBmcm9tIHZhcmlvdXMgYmFzZSB0eXBlcyB0bworLy8gcmVzcGVjdGl2ZSBwb2ludGVyIHR5cGVzLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEdvIGRvZXMgbm90IHBlcm1pdAorLy8gcmVmZXJlbmNlcyB0byBjb25zdGFudHMsIG5vciBjYW4gYSBwb2ludGVyIHR5cGUgdG8gYmFzZSB0eXBlIGJlIGFsbG9jYXRlZAorLy8gYW5kIGluaXRpYWxpemVkIGluIGEgc2luZ2xlIGV4cHJlc3Npb24uCisvLworLy8gRS5nLiwgdGhpcyBpcyBub3QgYWxsb3dlZDoKKy8vCisvLyAgICB2YXIgaXAgKmludCA9ICY1CisvLworLy8gQnV0IHRoaXMgKmlzKiBhbGxvd2VkOgorLy8KKy8vICAgIGZ1bmMgSW50UHRyKGkgaW50KSAqaW50IHsgcmV0dXJuICZpIH0KKy8vICAgIHZhciBpcCAqaW50ID0gSW50UHRyKDUpCisvLworLy8gU2luY2UgcG9pbnRlcnMgdG8gYmFzZSB0eXBlcyBhcmUgY29tbW9ucGxhY2UgYXMgW29wdGlvbmFsXSBmaWVsZHMgaW4KKy8vIGV4cG9ydGVkIHRocmlmdCBzdHJ1Y3RzLCB3ZSBmYWN0b3Igc3VjaCBoZWxwZXJzIGhlcmUuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Z1bmMgRmxvYXQzMlB0cih2IGZsb2F0MzIpICpmbG9hdDMyIHsgcmV0dXJuICZ2IH0KK2Z1bmMgRmxvYXQ2NFB0cih2IGZsb2F0NjQpICpmbG9hdDY0IHsgcmV0dXJuICZ2IH0KK2Z1bmMgSW50UHRyKHYgaW50KSAqaW50ICAgICAgICAgICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgSW50MzJQdHIodiBpbnQzMikgKmludDMyICAgICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgSW50NjRQdHIodiBpbnQ2NCkgKmludDY0ICAgICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgU3RyaW5nUHRyKHYgc3RyaW5nKSAqc3RyaW5nICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgVWludDMyUHRyKHYgdWludDMyKSAqdWludDMyICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgVWludDY0UHRyKHYgdWludDY0KSAqdWludDY0ICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgQm9vbFB0cih2IGJvb2wpICpib29sICAgICAgICAgIHsgcmV0dXJuICZ2IH0KK2Z1bmMgQnl0ZVNsaWNlUHRyKHYgW11ieXRlKSAqW11ieXRlIHsgcmV0dXJuICZ2IH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28gYi9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YjEzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJjb250ZXh0IgorCisvLyBBIHByb2Nlc3NvciBpcyBhIGdlbmVyaWMgb2JqZWN0IHdoaWNoIG9wZXJhdGVzIHVwb24gYW4gaW5wdXQgc3RyZWFtIGFuZAorLy8gd3JpdGVzIHRvIHNvbWUgb3V0cHV0IHN0cmVhbS4KK3R5cGUgVFByb2Nlc3NvciBpbnRlcmZhY2UgeworCVByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCit0eXBlIFRQcm9jZXNzb3JGdW5jdGlvbiBpbnRlcmZhY2UgeworCVByb2Nlc3MoY3R4IGNvbnRleHQuQ29udGV4dCwgc2VxSWQgaW50MzIsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKK30KKworLy8gVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGZhY3RvcnkganVzdCByZXR1cm5zIGEgc2luZ2xldG9uCisvLyBpbnN0YW5jZS4KK3R5cGUgVFByb2Nlc3NvckZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRQcm9jZXNzb3IodHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvcgorfQorCit0eXBlIHRQcm9jZXNzb3JGYWN0b3J5IHN0cnVjdCB7CisJcHJvY2Vzc29yIFRQcm9jZXNzb3IKK30KKworZnVuYyBOZXdUUHJvY2Vzc29yRmFjdG9yeShwIFRQcm9jZXNzb3IpIFRQcm9jZXNzb3JGYWN0b3J5IHsKKwlyZXR1cm4gJnRQcm9jZXNzb3JGYWN0b3J5e3Byb2Nlc3NvcjogcH0KK30KKworZnVuYyAocCAqdFByb2Nlc3NvckZhY3RvcnkpIEdldFByb2Nlc3Nvcih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yIHsKKwlyZXR1cm4gcC5wcm9jZXNzb3IKK30KKworLyoqCisgKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KKyAqIGluc3RhbmNlLgorICovCit0eXBlIFRQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRQcm9jZXNzb3JGdW5jdGlvbih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yRnVuY3Rpb24KK30KKwordHlwZSB0UHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5IHN0cnVjdCB7CisJcHJvY2Vzc29yIFRQcm9jZXNzb3JGdW5jdGlvbgorfQorCitmdW5jIE5ld1RQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkocCBUUHJvY2Vzc29yRnVuY3Rpb24pIFRQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkgeworCXJldHVybiAmdFByb2Nlc3NvckZ1bmN0aW9uRmFjdG9yeXtwcm9jZXNzb3I6IHB9Cit9CisKK2Z1bmMgKHAgKnRQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkpIEdldFByb2Nlc3NvckZ1bmN0aW9uKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3JGdW5jdGlvbiB7CisJcmV0dXJuIHAucHJvY2Vzc29yCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTViN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJlcnJvcnMiCisJImZtdCIKKykKKworY29uc3QgKAorCVZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKKwlWRVJTSU9OXzEgICAgPSAweDgwMDEwMDAwCispCisKK3R5cGUgVFByb3RvY29sIGludGVyZmFjZSB7CisJV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBlcnJvcgorCVdyaXRlTWVzc2FnZUVuZCgpIGVycm9yCisJV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgZXJyb3IKKwlXcml0ZVN0cnVjdEVuZCgpIGVycm9yCisJV3JpdGVGaWVsZEJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2KSBlcnJvcgorCVdyaXRlRmllbGRFbmQoKSBlcnJvcgorCVdyaXRlRmllbGRTdG9wKCkgZXJyb3IKKwlXcml0ZU1hcEJlZ2luKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yCisJV3JpdGVNYXBFbmQoKSBlcnJvcgorCVdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IKKwlXcml0ZUxpc3RFbmQoKSBlcnJvcgorCVdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvcgorCVdyaXRlU2V0RW5kKCkgZXJyb3IKKwlXcml0ZUJvb2wodmFsdWUgYm9vbCkgZXJyb3IKKwlXcml0ZUJ5dGUodmFsdWUgaW50OCkgZXJyb3IKKwlXcml0ZUkxNih2YWx1ZSBpbnQxNikgZXJyb3IKKwlXcml0ZUkzMih2YWx1ZSBpbnQzMikgZXJyb3IKKwlXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgZXJyb3IKKwlXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBlcnJvcgorCVdyaXRlU3RyaW5nKHZhbHVlIHN0cmluZykgZXJyb3IKKwlXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIGVycm9yCisKKwlSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMiwgZXJyIGVycm9yKQorCVJlYWRNZXNzYWdlRW5kKCkgZXJyb3IKKwlSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBlcnJvcikKKwlSZWFkU3RydWN0RW5kKCkgZXJyb3IKKwlSZWFkRmllbGRCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNiwgZXJyIGVycm9yKQorCVJlYWRGaWVsZEVuZCgpIGVycm9yCisJUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBlcnJvcikKKwlSZWFkTWFwRW5kKCkgZXJyb3IKKwlSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIGVycm9yKQorCVJlYWRMaXN0RW5kKCkgZXJyb3IKKwlSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgZXJyb3IpCisJUmVhZFNldEVuZCgpIGVycm9yCisJUmVhZEJvb2woKSAodmFsdWUgYm9vbCwgZXJyIGVycm9yKQorCVJlYWRCeXRlKCkgKHZhbHVlIGludDgsIGVyciBlcnJvcikKKwlSZWFkSTE2KCkgKHZhbHVlIGludDE2LCBlcnIgZXJyb3IpCisJUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIGVycm9yKQorCVJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBlcnJvcikKKwlSZWFkRG91YmxlKCkgKHZhbHVlIGZsb2F0NjQsIGVyciBlcnJvcikKKwlSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIGVycm9yKQorCVJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpCisKKwlTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikKKwlGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKQorCisJVHJhbnNwb3J0KCkgVFRyYW5zcG9ydAorfQorCisvLyBUaGUgbWF4aW11bSByZWN1cnNpdmUgZGVwdGggdGhlIHNraXAoKSBmdW5jdGlvbiB3aWxsIHRyYXZlcnNlCitjb25zdCBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCA9IDY0CisKKy8vIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCitmdW5jIFNraXBEZWZhdWx0RGVwdGgocHJvdCBUUHJvdG9jb2wsIHR5cGVJZCBUVHlwZSkgKGVyciBlcnJvcikgeworCXJldHVybiBTa2lwKHByb3QsIHR5cGVJZCwgREVGQVVMVF9SRUNVUlNJT05fREVQVEgpCit9CisKKy8vIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCitmdW5jIFNraXAoc2VsZiBUUHJvdG9jb2wsIGZpZWxkVHlwZSBUVHlwZSwgbWF4RGVwdGggaW50KSAoZXJyIGVycm9yKSB7CisKKwlpZiBtYXhEZXB0aCA8PSAwIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKERFUFRIX0xJTUlULCBlcnJvcnMuTmV3KCJEZXB0aCBsaW1pdCBleGNlZWRlZCIpKQorCX0KKworCXN3aXRjaCBmaWVsZFR5cGUgeworCWNhc2UgU1RPUDoKKwkJcmV0dXJuCisJY2FzZSBCT09MOgorCQlfLCBlcnIgPSBzZWxmLlJlYWRCb29sKCkKKwkJcmV0dXJuCisJY2FzZSBCWVRFOgorCQlfLCBlcnIgPSBzZWxmLlJlYWRCeXRlKCkKKwkJcmV0dXJuCisJY2FzZSBJMTY6CisJCV8sIGVyciA9IHNlbGYuUmVhZEkxNigpCisJCXJldHVybgorCWNhc2UgSTMyOgorCQlfLCBlcnIgPSBzZWxmLlJlYWRJMzIoKQorCQlyZXR1cm4KKwljYXNlIEk2NDoKKwkJXywgZXJyID0gc2VsZi5SZWFkSTY0KCkKKwkJcmV0dXJuCisJY2FzZSBET1VCTEU6CisJCV8sIGVyciA9IHNlbGYuUmVhZERvdWJsZSgpCisJCXJldHVybgorCWNhc2UgU1RSSU5HOgorCQlfLCBlcnIgPSBzZWxmLlJlYWRTdHJpbmcoKQorCQlyZXR1cm4KKwljYXNlIFNUUlVDVDoKKwkJaWYgXywgZXJyID0gc2VsZi5SZWFkU3RydWN0QmVnaW4oKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJZm9yIHsKKwkJCV8sIHR5cGVJZCwgXywgXyA6PSBzZWxmLlJlYWRGaWVsZEJlZ2luKCkKKwkJCWlmIHR5cGVJZCA9PSBTVE9QIHsKKwkJCQlicmVhaworCQkJfQorCQkJZXJyIDo9IFNraXAoc2VsZiwgdHlwZUlkLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQkJc2VsZi5SZWFkRmllbGRFbmQoKQorCQl9CisJCXJldHVybiBzZWxmLlJlYWRTdHJ1Y3RFbmQoKQorCWNhc2UgTUFQOgorCQlrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGVyciA6PSBzZWxmLlJlYWRNYXBCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCWZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgeworCQkJZXJyIDo9IFNraXAoc2VsZiwga2V5VHlwZSwgbWF4RGVwdGgtMSkKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJCXNlbGYuU2tpcCh2YWx1ZVR5cGUpCisJCX0KKwkJcmV0dXJuIHNlbGYuUmVhZE1hcEVuZCgpCisJY2FzZSBTRVQ6CisJCWVsZW1UeXBlLCBzaXplLCBlcnIgOj0gc2VsZi5SZWFkU2V0QmVnaW4oKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJCWVyciA6PSBTa2lwKHNlbGYsIGVsZW1UeXBlLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQl9CisJCXJldHVybiBzZWxmLlJlYWRTZXRFbmQoKQorCWNhc2UgTElTVDoKKwkJZWxlbVR5cGUsIHNpemUsIGVyciA6PSBzZWxmLlJlYWRMaXN0QmVnaW4oKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJCWVyciA6PSBTa2lwKHNlbGYsIGVsZW1UeXBlLCBtYXhEZXB0aC0xKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQl9CisJCXJldHVybiBzZWxmLlJlYWRMaXN0RW5kKCkKKwlkZWZhdWx0OgorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmtub3duIGRhdGEgdHlwZSAlZCIsIGZpZWxkVHlwZSkpKQorCX0KKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZXhjZXB0aW9uLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YWI3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwpAQCAtMCwwICsxLDc3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImVuY29kaW5nL2Jhc2U2NCIKKykKKworLy8gVGhyaWZ0IFByb3RvY29sIGV4Y2VwdGlvbgordHlwZSBUUHJvdG9jb2xFeGNlcHRpb24gaW50ZXJmYWNlIHsKKwlURXhjZXB0aW9uCisJVHlwZUlkKCkgaW50Cit9CisKK2NvbnN0ICgKKwlVTktOT1dOX1BST1RPQ09MX0VYQ0VQVElPTiA9IDAKKwlJTlZBTElEX0RBVEEgICAgICAgICAgICAgICA9IDEKKwlORUdBVElWRV9TSVpFICAgICAgICAgICAgICA9IDIKKwlTSVpFX0xJTUlUICAgICAgICAgICAgICAgICA9IDMKKwlCQURfVkVSU0lPTiAgICAgICAgICAgICAgICA9IDQKKwlOT1RfSU1QTEVNRU5URUQgICAgICAgICAgICA9IDUKKwlERVBUSF9MSU1JVCAgICAgICAgICAgICAgICA9IDYKKykKKwordHlwZSB0UHJvdG9jb2xFeGNlcHRpb24gc3RydWN0IHsKKwl0eXBlSWQgIGludAorCW1lc3NhZ2Ugc3RyaW5nCit9CisKK2Z1bmMgKHAgKnRQcm90b2NvbEV4Y2VwdGlvbikgVHlwZUlkKCkgaW50IHsKKwlyZXR1cm4gcC50eXBlSWQKK30KKworZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBTdHJpbmcoKSBzdHJpbmcgeworCXJldHVybiBwLm1lc3NhZ2UKK30KKworZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBFcnJvcigpIHN0cmluZyB7CisJcmV0dXJuIHAubWVzc2FnZQorfQorCitmdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIgZXJyb3IpIFRQcm90b2NvbEV4Y2VwdGlvbiB7CisJaWYgZXJyID09IG5pbCB7CisJCXJldHVybiBuaWwKKwl9CisJaWYgZSwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIG9rIDo9IGVyci4oYmFzZTY0LkNvcnJ1cHRJbnB1dEVycm9yKTsgb2sgeworCQlyZXR1cm4gJnRQcm90b2NvbEV4Y2VwdGlvbntJTlZBTElEX0RBVEEsIGVyci5FcnJvcigpfQorCX0KKwlyZXR1cm4gJnRQcm90b2NvbEV4Y2VwdGlvbntVTktOT1dOX1BST1RPQ09MX0VYQ0VQVElPTiwgZXJyLkVycm9yKCl9Cit9CisKK2Z1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoZXJyVHlwZSBpbnQsIGVyciBlcnJvcikgVFByb3RvY29sRXhjZXB0aW9uIHsKKwlpZiBlcnIgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlyZXR1cm4gJnRQcm90b2NvbEV4Y2VwdGlvbntlcnJUeXBlLCBlcnIuRXJyb3IoKX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfZmFjdG9yeS5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBmNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF9mYWN0b3J5LmdvCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gRmFjdG9yeSBpbnRlcmZhY2UgZm9yIGNvbnN0cnVjdGluZyBwcm90b2NvbCBpbnN0YW5jZXMuCit0eXBlIFRQcm90b2NvbEZhY3RvcnkgaW50ZXJmYWNlIHsKKwlHZXRQcm90b2NvbCh0cmFucyBUVHJhbnNwb3J0KSBUUHJvdG9jb2wKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDQwNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJjb250ZXh0IgorCSJpby9pb3V0aWwiCisJIm1hdGgiCisJIm5ldCIKKwkibmV0L2h0dHAiCisJInRlc3RpbmciCispCisKK2NvbnN0IFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkUgPSAxNTUKKwordmFyICgKKwlwcm90b2NvbF9iZGF0YSBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKKwlCT09MX1ZBTFVFUyAgICBbXWJvb2wKKwlCWVRFX1ZBTFVFUyAgICBbXWludDgKKwlJTlQxNl9WQUxVRVMgICBbXWludDE2CisJSU5UMzJfVkFMVUVTICAgW11pbnQzMgorCUlOVDY0X1ZBTFVFUyAgIFtdaW50NjQKKwlET1VCTEVfVkFMVUVTICBbXWZsb2F0NjQKKwlTVFJJTkdfVkFMVUVTICBbXXN0cmluZworKQorCitmdW5jIGluaXQoKSB7CisJcHJvdG9jb2xfYmRhdGEgPSBtYWtlKFtdYnl0ZSwgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSkKKwlmb3IgaSA6PSAwOyBpIDwgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKKwkJcHJvdG9jb2xfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKKwl9CisJQk9PTF9WQUxVRVMgPSBbXWJvb2x7ZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0KKwlCWVRFX1ZBTFVFUyA9IFtdaW50OHsxMTcsIDAsIDEsIDMyLCAxMjcsIC0xMjgsIC0xfQorCUlOVDE2X1ZBTFVFUyA9IFtdaW50MTZ7NDU5LCAwLCAxLCAtMSwgLTEyOCwgMTI3LCAzMjc2NywgLTMyNzY4fQorCUlOVDMyX1ZBTFVFUyA9IFtdaW50MzJ7NDU5LCAwLCAxLCAtMSwgLTEyOCwgMTI3LCAzMjc2NywgMjE0NzQ4MzY0NywgLTIxNDc0ODM1MzV9CisJSU5UNjRfVkFMVUVTID0gW11pbnQ2NHs0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzUzNSwgMzQzNTk3Mzg0ODEsIC0zNTE4NDM3MjA4ODcxOSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsIDkyMjMzNzIwMzY4NTQ3NzU4MDd9CisJRE9VQkxFX1ZBTFVFUyA9IFtdZmxvYXQ2NHs0NTkuMywgMC4wLCAtMS4wLCAxLjAsIDAuNSwgMC4zMzMzLCAzLjE0MTU5LCAxLjUzN2UtMzgsIDEuNjczZTI1LCA2LjAyMjE0MTc5ZTIzLCAtNi4wMjIxNDE3OWUyMywgSU5GSU5JVFkuRmxvYXQ2NCgpLCBORUdBVElWRV9JTkZJTklUWS5GbG9hdDY0KCksIE5BTi5GbG9hdDY0KCl9CisJU1RSSU5HX1ZBTFVFUyA9IFtdc3RyaW5neyIiLCAiYSIsICJzdFt1Zl1mIiwgInN0LHU6ZmYgd2l0aCBzcGFjZXMiLCAic3R1ZmZcdHdpdGhcbmVzY2FwZVxcY2hhcmFjdGVycycuLi5cImxvdHN7b2Z9ZnVuPC94bWw+In0KK30KKwordHlwZSBIVFRQRWNob1NlcnZlciBzdHJ1Y3R7fQordHlwZSBIVFRQSGVhZGVyRWNob1NlcnZlciBzdHJ1Y3R7fQorCitmdW5jIChwICpIVFRQRWNob1NlcnZlcikgU2VydmVIVFRQKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgcmVxICpodHRwLlJlcXVlc3QpIHsKKwlidWYsIGVyciA6PSBpb3V0aWwuUmVhZEFsbChyZXEuQm9keSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c0JhZFJlcXVlc3QpCisJCXcuV3JpdGUoYnVmKQorCX0gZWxzZSB7CisJCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKKwkJdy5Xcml0ZShidWYpCisJfQorfQorCitmdW5jIChwICpIVFRQSGVhZGVyRWNob1NlcnZlcikgU2VydmVIVFRQKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgcmVxICpodHRwLlJlcXVlc3QpIHsKKwlidWYsIGVyciA6PSBpb3V0aWwuUmVhZEFsbChyZXEuQm9keSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdy5Xcml0ZUhlYWRlcihodHRwLlN0YXR1c0JhZFJlcXVlc3QpCisJCXcuV3JpdGUoYnVmKQorCX0gZWxzZSB7CisJCXcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKKwkJdy5Xcml0ZShidWYpCisJfQorfQorCitmdW5jIEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCAqdGVzdGluZy5UKSAobmV0Lkxpc3RlbmVyLCBuZXQuQWRkcikgeworCWFkZHIsIGVyciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCg0MDAwMCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBmaW5kIGF2YWlsYWJsZSB0Y3AgcG9ydCBhZGRyOiAlcyIsIGVycikKKwkJcmV0dXJuIG5pbCwgYWRkcgorCX0KKwlsLCBlcnIgOj0gbmV0Lkxpc3RlbihhZGRyLk5ldHdvcmsoKSwgYWRkci5TdHJpbmcoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlVuYWJsZSB0byBzZXR1cCB0Y3AgbGlzdGVuZXIgb24gJXM6ICVzIiwgYWRkci5TdHJpbmcoKSwgZXJyKQorCQlyZXR1cm4gbCwgYWRkcgorCX0KKwlnbyBodHRwLlNlcnZlKGwsICZIVFRQRWNob1NlcnZlcnt9KQorCXJldHVybiBsLCBhZGRyCit9CisKK2Z1bmMgSHR0cENsaWVudFNldHVwRm9ySGVhZGVyVGVzdCh0ICp0ZXN0aW5nLlQpIChuZXQuTGlzdGVuZXIsIG5ldC5BZGRyKSB7CisJYWRkciwgZXJyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KDQwMDAwKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGZpbmQgYXZhaWxhYmxlIHRjcCBwb3J0IGFkZHI6ICVzIiwgZXJyKQorCQlyZXR1cm4gbmlsLCBhZGRyCisJfQorCWwsIGVyciA6PSBuZXQuTGlzdGVuKGFkZHIuTmV0d29yaygpLCBhZGRyLlN0cmluZygpKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIHRjcCBsaXN0ZW5lciBvbiAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCisJCXJldHVybiBsLCBhZGRyCisJfQorCWdvIGh0dHAuU2VydmUobCwgJkhUVFBIZWFkZXJFY2hvU2VydmVye30pCisJcmV0dXJuIGwsIGFkZHIKK30KKworZnVuYyBSZWFkV3JpdGVQcm90b2NvbFRlc3QodCAqdGVzdGluZy5ULCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgeworCWJ1ZiA6PSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKQorCWwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQorCWRlZmVyIGwuQ2xvc2UoKQorCXRyYW5zcG9ydHMgOj0gW11UVHJhbnNwb3J0RmFjdG9yeXsKKwkJTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCksCisJCU5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkoYnVmLCBidWYsIHRydWUpLAorCQlOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDAsIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoNiwgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSg5LCBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSkpLAorCQlOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCJodHRwOi8vIiArIGFkZHIuU3RyaW5nKCkpLAorCX0KKwlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7CisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KKwkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJvb2wodCwgcCwgdHJhbnMpCisJCXRyYW5zLkNsb3NlKCkKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTE2KHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTMyKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlRG91YmxlKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlU3RyaW5nKHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKQorCQl0cmFucy5DbG9zZSgpCisJfQorCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQorCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKQorCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCisJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKKwkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVCb29sKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEJPT0wpCisJdGhlbGVuIDo9IGxlbihCT09MX1ZBTFVFUykKKwllcnIgOj0gcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgdGhldHlwZSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQllcnIgPSBwLldyaXRlQm9vbCh2KQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgRXJyb3Igd3JpdGluZyBib29sIGluIGxpc3QgYXQgaW5kZXggJXY6ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCisJfQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRCb29sKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgYm9vbCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6IGluZGV4ICV2ICV2ICV2ICV2ICE9ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBrLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJZXJyID0gcC5SZWFkTGlzdEVuZCgpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVCeXRlKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEJZVEUpCisJdGhlbGVuIDo9IGxlbihCWVRFX1ZBTFVFUykKKwllcnIgOj0gcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgdGhldHlwZSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgQllURV9WQUxVRVMgeworCQllcnIgPSBwLldyaXRlQnl0ZSh2KQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBieXRlIGluIGxpc3QgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJfQorCWVyciA9IHAuV3JpdGVMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCisJfQorCWVyciA9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgZmx1c2hpbmcgbGlzdCBvZiBieXRlczogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQorCX0KKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgQllURV9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEJ5dGUoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBieXRlIGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwllcnIgPSBwLlJlYWRMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZUkxNih0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShJMTYpCisJdGhlbGVuIDo9IGxlbihJTlQxNl9WQUxVRVMpCisJcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCisJZm9yIF8sIHYgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJcC5Xcml0ZUkxNih2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyLCBJTlQxNl9WQUxVRVMpCisJfQorCV8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQorCWlmICFvayB7CisJCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQorCQl9CisJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICV2ICE9IGxlbiAldiIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQl9CisJfQorCWZvciBrLCB2IDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CisJCXZhbHVlLCBlcnIgOj0gcC5SZWFkSTE2KCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50MTYgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwllcnIgPSBwLlJlYWRMaXN0RW5kKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlSTMyKHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl0aGV0eXBlIDo9IFRUeXBlKEkzMikKKwl0aGVsZW4gOj0gbGVuKElOVDMyX1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQlwLldyaXRlSTMyKHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIsIElOVDMyX1ZBTFVFUykKKwl9CisJXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCisJaWYgIW9rIHsKKwkJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJCX0KKwkJaWYgdGhlbGVuICE9IHRoZWxlbjIgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCX0KKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRJMzIoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQzMiBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVJNjQodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoSTY0KQorCXRoZWxlbiA6PSBsZW4oSU5UNjRfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCXAuV3JpdGVJNjQodikKKwl9CisJcC5Xcml0ZUxpc3RFbmQoKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVyciwgSU5UNjRfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZEk2NCgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGludDY0IGF0IGluZGV4ICVkOiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSAhPSAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCX0KKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCBlcnIpCisJfQorfQorCitmdW5jIFJlYWRXcml0ZURvdWJsZSh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CisJdGhldHlwZSA6PSBUVHlwZShET1VCTEUpCisJdGhlbGVuIDo9IGxlbihET1VCTEVfVkFMVUVTKQorCXAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQorCWZvciBfLCB2IDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlwLldyaXRlRG91YmxlKHYpCisJfQorCXAuV3JpdGVMaXN0RW5kKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCXRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciByZWFkaW5nIGxpc3Q6ICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIERPVUJMRV9WQUxVRVMpCisJfQorCWlmIHRoZXR5cGUgIT0gdGhldHlwZTIgeworCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCisJfQorCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZERvdWJsZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGRvdWJsZSBhdCBpbmRleCAlZDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJfQorCQlpZiBtYXRoLklzTmFOKHYpIHsKKwkJCWlmICFtYXRoLklzTmFOKHZhbHVlKSB7CisJCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBtYXRoLklzTmFOKCV2KSAhPSBtYXRoLklzTmFOKCV2KSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCQl9CisJCX0gZWxzZSBpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQl9CisJfQorCWVyciA9IHAuUmVhZExpc3RFbmQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyKQorCX0KK30KKworZnVuYyBSZWFkV3JpdGVTdHJpbmcodCB0ZXN0aW5nLlRCLCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgeworCXRoZXR5cGUgOj0gVFR5cGUoU1RSSU5HKQorCXRoZWxlbiA6PSBsZW4oU1RSSU5HX1ZBTFVFUykKKwlwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKKwlmb3IgXywgdiA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKKwkJcC5Xcml0ZVN0cmluZyh2KQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyLCBTVFJJTkdfVkFMVUVTKQorCX0KKwlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKKwlpZiAhb2sgeworCQlpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKKwkJfQorCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJfQorCX0KKwlmb3IgaywgdiA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKKwkJdmFsdWUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBzdHJpbmcgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2ICE9ICV2IiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJfQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVycikKKwl9Cit9CisKK2Z1bmMgUmVhZFdyaXRlQmluYXJ5KHQgdGVzdGluZy5UQiwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKKwl2IDo9IHByb3RvY29sX2JkYXRhCisJcC5Xcml0ZUJpbmFyeSh2KQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJdmFsdWUsIGVyciA6PSBwLlJlYWRCaW5hcnkoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGJpbmFyeTogJXMiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIGVyci5FcnJvcigpKQorCX0KKwlpZiBsZW4odikgIT0gbGVuKHZhbHVlKSB7CisJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuKHYpICE9IGxlbih2YWx1ZSkuLi4gJWQgIT0gJWQiLCAiUmVhZFdyaXRlQmluYXJ5IiwgcCwgdHJhbnMsIGxlbih2KSwgbGVuKHZhbHVlKSkKKwl9IGVsc2UgeworCQlmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgeworCQkJaWYgdltpXSAhPSB2YWx1ZVtpXSB7CisJCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcyAhPSAlcyIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI1YmViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAiaW8iCisKK3R5cGUgUmljaFRyYW5zcG9ydCBzdHJ1Y3QgeworCVRUcmFuc3BvcnQKK30KKworLy8gV3JhcHMgVHJhbnNwb3J0IHRvIHByb3ZpZGUgVFJpY2hUcmFuc3BvcnQgaW50ZXJmYWNlCitmdW5jIE5ld1RSaWNoVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpICpSaWNoVHJhbnNwb3J0IHsKKwlyZXR1cm4gJlJpY2hUcmFuc3BvcnR7dHJhbnN9Cit9CisKK2Z1bmMgKHIgKlJpY2hUcmFuc3BvcnQpIFJlYWRCeXRlKCkgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJcmV0dXJuIHJlYWRCeXRlKHIuVFRyYW5zcG9ydCkKK30KKworZnVuYyAociAqUmljaFRyYW5zcG9ydCkgV3JpdGVCeXRlKGMgYnl0ZSkgZXJyb3IgeworCXJldHVybiB3cml0ZUJ5dGUoci5UVHJhbnNwb3J0LCBjKQorfQorCitmdW5jIChyICpSaWNoVHJhbnNwb3J0KSBXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpIHsKKwlyZXR1cm4gci5Xcml0ZShbXWJ5dGUocykpCit9CisKK2Z1bmMgKHIgKlJpY2hUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwlyZXR1cm4gci5UVHJhbnNwb3J0LlJlbWFpbmluZ0J5dGVzKCkKK30KKworZnVuYyByZWFkQnl0ZShyIGlvLlJlYWRlcikgKGMgYnl0ZSwgZXJyIGVycm9yKSB7CisJdiA6PSBbMV1ieXRlezB9CisJbiwgZXJyIDo9IHIuUmVhZCh2WzA6MV0pCisJaWYgbiA+IDAgJiYgKGVyciA9PSBuaWwgfHwgZXJyID09IGlvLkVPRikgeworCQlyZXR1cm4gdlswXSwgbmlsCisJfQorCWlmIG4gPiAwICYmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gdlswXSwgZXJyCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCXJldHVybiB2WzBdLCBuaWwKK30KKworZnVuYyB3cml0ZUJ5dGUodyBpby5Xcml0ZXIsIGMgYnl0ZSkgZXJyb3IgeworCXYgOj0gWzFdYnl0ZXtjfQorCV8sIGVyciA6PSB3LldyaXRlKHZbMDoxXSkKKwlyZXR1cm4gZXJyCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVjM2ZkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImJ5dGVzIgorCSJlcnJvcnMiCisJImlvIgorCSJyZWZsZWN0IgorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3RFbnN1cmVUcmFuc3BvcnRzQXJlUmljaCh0ICp0ZXN0aW5nLlQpIHsKKwlidWYgOj0gYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxMDI0KSkKKworCXRyYW5zcG9ydHMgOj0gW11UVHJhbnNwb3J0RmFjdG9yeXsKKwkJTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCksCisJCU5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkoYnVmLCBidWYsIHRydWUpLAorCQlOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeShOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8xMjcuMC4wLjEiKSwKKwl9CisJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgeworCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CisJCV8sIG9rIDo9IHRyYW5zLihUUmljaFRyYW5zcG9ydCkKKwkJaWYgIW9rIHsKKwkJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJXMgZG9lcyBub3QgaW1wbGVtZW50IFRSaWNoVHJhbnNwb3J0IGludGVyZmFjZSIsIHJlZmxlY3QuVmFsdWVPZih0cmFucykpCisJCX0KKwl9Cit9CisKKy8vIFRlc3RSZWFkQnl0ZSB0ZXN0cyB3aGV0aGVyIHJlYWRCeXRlIGhhbmRsZXMgZXJyb3IgY2FzZXMgY29ycmVjdGx5LgorZnVuYyBUZXN0UmVhZEJ5dGUodCAqdGVzdGluZy5UKSB7CisJZm9yIGksIHRlc3QgOj0gcmFuZ2UgcmVhZEJ5dGVUZXN0cyB7CisJCXYsIGVyciA6PSByZWFkQnl0ZSh0ZXN0LnIpCisJCWlmIHYgIT0gdGVzdC52IHsKKwkJCXQuRmF0YWxmKCJUZXN0UmVhZEJ5dGUgJWQ6IHZhbHVlIGRpZmZlcnMuIEV4cGVjdGVkICVkLCBnb3QgJWQiLCBpLCB0ZXN0LnYsIHRlc3Quci52KQorCQl9CisJCWlmIGVyciAhPSB0ZXN0LmVyciB7CisJCQl0LkZhdGFsZigiVGVzdFJlYWRCeXRlICVkOiBlcnJvciBkaWZmZXJzLiBFeHBlY3RlZCAlcywgZ290ICVzIiwgaSwgdGVzdC5lcnIsIHRlc3Quci5lcnIpCisJCX0KKwl9Cit9CisKK3ZhciBzb21lRXJyb3IgPSBlcnJvcnMuTmV3KCJTb21lIGVycm9yIikKK3ZhciByZWFkQnl0ZVRlc3RzID0gW11zdHJ1Y3QgeworCXIgICAqbW9ja1JlYWRlcgorCXYgICBieXRlCisJZXJyIGVycm9yCit9eworCXsmbW9ja1JlYWRlcnswLCA1NSwgaW8uRU9GfSwgMCwgaW8uRU9GfSwgICAgICAgIC8vIHJlYWRlciBzZW5kcyBFT0Ygdy9vIGRhdGEKKwl7Jm1vY2tSZWFkZXJ7MCwgNTUsIHNvbWVFcnJvcn0sIDAsIHNvbWVFcnJvcn0sICAvLyByZWFkZXIgc2VuZHMgc29tZSBvdGhlciBlcnJvcgorCXsmbW9ja1JlYWRlcnsxLCA1NSwgbmlsfSwgNTUsIG5pbH0sICAgICAgICAgICAgIC8vIHJlYWRlciBzZW5kcyBkYXRhIHcvbyBlcnJvcgorCXsmbW9ja1JlYWRlcnsxLCA1NSwgaW8uRU9GfSwgNTUsIG5pbH0sICAgICAgICAgIC8vIHJlYWRlciBzZW5kcyBkYXRhIHdpdGggRU9GCisJeyZtb2NrUmVhZGVyezEsIDU1LCBzb21lRXJyb3J9LCA1NSwgc29tZUVycm9yfSwgLy8gcmVhZGVyIHNlbmRzIGRhdGEgd2l0aHNvbWUgZXJyb3IKK30KKwordHlwZSBtb2NrUmVhZGVyIHN0cnVjdCB7CisJbiAgIGludAorCXYgICBieXRlCisJZXJyIGVycm9yCit9CisKK2Z1bmMgKHIgKm1vY2tSZWFkZXIpIFJlYWQocCBbXWJ5dGUpIChuIGludCwgZXJyIGVycm9yKSB7CisJaWYgci5uID4gMCB7CisJCXBbMF0gPSByLnYKKwl9CisJcmV0dXJuIHIubiwgci5lcnIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY0ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKykKKwordHlwZSBUU2VyaWFsaXplciBzdHJ1Y3QgeworCVRyYW5zcG9ydCAqVE1lbW9yeUJ1ZmZlcgorCVByb3RvY29sICBUUHJvdG9jb2wKK30KKwordHlwZSBUU3RydWN0IGludGVyZmFjZSB7CisJV3JpdGUocCBUUHJvdG9jb2wpIGVycm9yCisJUmVhZChwIFRQcm90b2NvbCkgZXJyb3IKK30KKworZnVuYyBOZXdUU2VyaWFsaXplcigpICpUU2VyaWFsaXplciB7CisJdHJhbnNwb3J0IDo9IE5ld1RNZW1vcnlCdWZmZXJMZW4oMTAyNCkKKwlwcm90b2NvbCA6PSBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLkdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCXJldHVybiAmVFNlcmlhbGl6ZXJ7CisJCXRyYW5zcG9ydCwKKwkJcHJvdG9jb2x9Cit9CisKK2Z1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwl0LlRyYW5zcG9ydC5SZXNldCgpCisKKwlpZiBlcnIgPSBtc2cuV3JpdGUodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlpZiBlcnIgPSB0LlByb3RvY29sLkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisJaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybgorCX0KKworCXJldHVybiB0LlRyYW5zcG9ydC5TdHJpbmcoKSwgbmlsCit9CisKK2Z1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZShjdHggY29udGV4dC5Db250ZXh0LCBtc2cgVFN0cnVjdCkgKGIgW11ieXRlLCBlcnIgZXJyb3IpIHsKKwl0LlRyYW5zcG9ydC5SZXNldCgpCisKKwlpZiBlcnIgPSBtc2cuV3JpdGUodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlpZiBlcnIgPSB0LlByb3RvY29sLkZsdXNoKGN0eCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4KKwl9CisKKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuCisJfQorCisJYiA9IGFwcGVuZChiLCB0LlRyYW5zcG9ydC5CeXRlcygpLi4uKQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjIyN2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3Rlc3QuZ28KQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJmbXQiCisJInRlc3RpbmciCispCisKK3R5cGUgUHJvdG9jb2xGYWN0b3J5IGludGVyZmFjZSB7CisJR2V0UHJvdG9jb2wodCBUVHJhbnNwb3J0KSBUUHJvdG9jb2wKK30KKworZnVuYyBjb21wYXJlU3RydWN0cyhtLCBtMSBNeVRlc3RTdHJ1Y3QpIChib29sLCBlcnJvcikgeworCXN3aXRjaCB7CisJY2FzZSBtLk9uICE9IG0xLk9uOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkJvb2xlYW4gbm90IGVxdWFsIikKKwljYXNlIG0uQiAhPSBtMS5COgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkJ5dGUgbm90IGVxdWFsIikKKwljYXNlIG0uSW50MTYgIT0gbTEuSW50MTY6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiSW50MTYgbm90IGVxdWFsIikKKwljYXNlIG0uSW50MzIgIT0gbTEuSW50MzI6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiSW50MzIgbm90IGVxdWFsIikKKwljYXNlIG0uSW50NjQgIT0gbTEuSW50NjQ6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiSW50NjQgbm90IGVxdWFsIikKKwljYXNlIG0uRCAhPSBtMS5EOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkRvdWJsZSBub3QgZXF1YWwiKQorCWNhc2UgbS5TdCAhPSBtMS5TdDoKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJTdHJpbmcgbm90IGVxdWFsIikKKworCWNhc2UgbGVuKG0uQmluKSAhPSBsZW4obTEuQmluKToKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KCJCaW5hcnkgc2l6ZSBub3QgZXF1YWwiKQorCWNhc2UgbGVuKG0uQmluKSA9PSBsZW4obTEuQmluKToKKwkJZm9yIGkgOj0gcmFuZ2UgbS5CaW4geworCQkJaWYgbS5CaW5baV0gIT0gbTEuQmluW2ldIHsKKwkJCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIkJpbmFyeSBub3QgZXF1YWwiKQorCQkJfQorCQl9CisJY2FzZSBsZW4obS5TdHJpbmdNYXApICE9IGxlbihtMS5TdHJpbmdNYXApOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIlN0cmluZ01hcCBzaXplIG5vdCBlcXVhbCIpCisJY2FzZSBsZW4obS5TdHJpbmdMaXN0KSAhPSBsZW4obTEuU3RyaW5nTGlzdCk6CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldygiU3RyaW5nTGlzdCBzaXplIG5vdCBlcXVhbCIpCisJY2FzZSBsZW4obS5TdHJpbmdTZXQpICE9IGxlbihtMS5TdHJpbmdTZXQpOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIlN0cmluZ1NldCBzaXplIG5vdCBlcXVhbCIpCisKKwljYXNlIG0uRSAhPSBtMS5FOgorCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoIk15VGVzdEVudW0gbm90IGVxdWFsIikKKworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlLCBuaWwKKworCX0KKwlyZXR1cm4gdHJ1ZSwgbmlsCit9CisKK2Z1bmMgUHJvdG9jb2xUZXN0MSh0ZXN0ICp0ZXN0aW5nLlQsIHBmIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKSB7CisJdCA6PSBOZXdUU2VyaWFsaXplcigpCisJdC5Qcm90b2NvbCA9IHBmLkdldFByb3RvY29sKHQuVHJhbnNwb3J0KQorCXZhciBtID0gTXlUZXN0U3RydWN0e30KKwltLk9uID0gdHJ1ZQorCW0uQiA9IGludDgoMCkKKwltLkludDE2ID0gMQorCW0uSW50MzIgPSAyCisJbS5JbnQ2NCA9IDMKKwltLkQgPSA0LjEKKwltLlN0ID0gIlRlc3QiCisJbS5CaW4gPSBtYWtlKFtdYnl0ZSwgMTApCisJbS5TdHJpbmdNYXAgPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nLCA1KQorCW0uU3RyaW5nTGlzdCA9IG1ha2UoW11zdHJpbmcsIDUpCisJbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30sIDUpCisJbS5FID0gMgorCisJcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoY29udGV4dC5CYWNrZ3JvdW5kKCksICZtKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBTZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCisJfQorCisJdDEgOj0gTmV3VERlc2VyaWFsaXplcigpCisJdDEuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0MS5UcmFuc3BvcnQpCisJdmFyIG0xID0gTXlUZXN0U3RydWN0e30KKwlpZiBlcnIgPSB0MS5SZWFkU3RyaW5nKCZtMSwgcyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBEZXNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKworCX0KKworCXJldHVybiBjb21wYXJlU3RydWN0cyhtLCBtMSkKKworfQorCitmdW5jIFByb3RvY29sVGVzdDIodGVzdCAqdGVzdGluZy5ULCBwZiBQcm90b2NvbEZhY3RvcnkpIChib29sLCBlcnJvcikgeworCXQgOj0gTmV3VFNlcmlhbGl6ZXIoKQorCXQuUHJvdG9jb2wgPSBwZi5HZXRQcm90b2NvbCh0LlRyYW5zcG9ydCkKKwl2YXIgbSA9IE15VGVzdFN0cnVjdHt9CisJbS5PbiA9IGZhbHNlCisJbS5CID0gaW50OCgwKQorCW0uSW50MTYgPSAxCisJbS5JbnQzMiA9IDIKKwltLkludDY0ID0gMworCW0uRCA9IDQuMQorCW0uU3QgPSAiVGVzdCIKKwltLkJpbiA9IG1ha2UoW11ieXRlLCAxMCkKKwltLlN0cmluZ01hcCA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcsIDUpCisJbS5TdHJpbmdMaXN0ID0gbWFrZShbXXN0cmluZywgNSkKKwltLlN0cmluZ1NldCA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgNSkKKwltLkUgPSAyCisKKwlzLCBlcnIgOj0gdC5Xcml0ZVN0cmluZyhjb250ZXh0LkJhY2tncm91bmQoKSwgJm0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5hYmxlIHRvIFNlcmlhbGl6ZSBzdHJ1Y3Rcblx0ICVzIiwgZXJyKSkKKworCX0KKworCXQxIDo9IE5ld1REZXNlcmlhbGl6ZXIoKQorCXQxLlByb3RvY29sID0gcGYuR2V0UHJvdG9jb2wodDEuVHJhbnNwb3J0KQorCXZhciBtMSA9IE15VGVzdFN0cnVjdHt9CisJaWYgZXJyID0gdDEuUmVhZFN0cmluZygmbTEsIHMpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnJvcnMuTmV3KGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gRGVzZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCisKKwl9CisKKwlyZXR1cm4gY29tcGFyZVN0cnVjdHMobSwgbTEpCisKK30KKworZnVuYyBUZXN0U2VyaWFsaXplcih0ICp0ZXN0aW5nLlQpIHsKKworCXZhciBwcm90b2NvbF9mYWN0b3JpZXMgbWFwW3N0cmluZ11Qcm90b2NvbEZhY3RvcnkKKwlwcm90b2NvbF9mYWN0b3JpZXMgPSBtYWtlKG1hcFtzdHJpbmddUHJvdG9jb2xGYWN0b3J5KQorCXByb3RvY29sX2ZhY3Rvcmllc1siQmluYXJ5Il0gPSBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCisJcHJvdG9jb2xfZmFjdG9yaWVzWyJDb21wYWN0Il0gPSBOZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCisJLy9wcm90b2NvbF9mYWN0b3JpZXNbIlNpbXBsZUpTT04iXSA9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkgLSB3cml0ZSBvbmx5LCBjYW4ndCBiZSByZWFkIGJhY2sgYnkgZGVzaWduCisJcHJvdG9jb2xfZmFjdG9yaWVzWyJKU09OIl0gPSBOZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCisKKwl2YXIgdGVzdHMgbWFwW3N0cmluZ11mdW5jKCp0ZXN0aW5nLlQsIFByb3RvY29sRmFjdG9yeSkgKGJvb2wsIGVycm9yKQorCXRlc3RzID0gbWFrZShtYXBbc3RyaW5nXWZ1bmMoKnRlc3RpbmcuVCwgUHJvdG9jb2xGYWN0b3J5KSAoYm9vbCwgZXJyb3IpKQorCXRlc3RzWyJUZXN0IDEiXSA9IFByb3RvY29sVGVzdDEKKwl0ZXN0c1siVGVzdCAyIl0gPSBQcm90b2NvbFRlc3QyCisJLy90ZXN0c1siVGVzdCAzIl0gPSBQcm90b2NvbFRlc3QzIC8vIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhZGRpdGlvbmFsIHRlc3RzCisKKwlmb3IgbmFtZSwgcGYgOj0gcmFuZ2UgcHJvdG9jb2xfZmFjdG9yaWVzIHsKKworCQlmb3IgdGVzdCwgZiA6PSByYW5nZSB0ZXN0cyB7CisKKwkJCWlmIHMsIGVyciA6PSBmKHQsIHBmKTsgIXMgfHwgZXJyICE9IG5pbCB7CisJCQkJdC5FcnJvcmYoIiVzIEZhaWxlZCBmb3IgJXMgcHJvdG9jb2xcblx0ICVzIiwgdGVzdCwgbmFtZSwgZXJyKQorCQkJfQorCisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU0NzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvCkBAIC0wLDAgKzEsNjMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyIChGSVhNRSkKKy8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKworLyogVEhFIEZPTExPV0lORyBUSFJJRlQgRklMRSBXQVMgVVNFRCBUTyBDUkVBVEUgVEhJUworCitlbnVtIE15VGVzdEVudW0geworCUZJUlNUID0gMSwKKwlTRUNPTkQgPSAyLAorCVRISVJEID0gMywKKwlGT1VSVEggPSA0LAorfQorCitzdHJ1Y3QgTXlUZXN0U3RydWN0IHsKKwkxOiBib29sIG9uLAorCTI6IGJ5dGUgYiwKKwkzOiBpMTYgaW50MTYsCisJNDogaTMyIGludDMyLAorCTU6IGk2NCBpbnQ2NCwKKwk2OiBkb3VibGUgZCwKKwk3OiBzdHJpbmcgc3QsCisJODogYmluYXJ5IGJpbiwKKwk5OiBtYXA8c3RyaW5nLCBzdHJpbmc+IHN0cmluZ01hcCwKKwkxMDogbGlzdDxzdHJpbmc+IHN0cmluZ0xpc3QsCisJMTE6IHNldDxzdHJpbmc+IHN0cmluZ1NldCwKKwkxMjogTXlUZXN0RW51bSBlLAorfQorKi8KKworaW1wb3J0ICgKKwkiZm10IgorKQorCisvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKQordmFyIF8gPSBaRVJPCit2YXIgXyA9IGZtdC5QcmludGYKKwordmFyIEdvVW51c2VkUHJvdGVjdGlvbl9fIGludAorCit0eXBlIE15VGVzdEVudW0gaW50NjQKKworY29uc3QgKAorCU15VGVzdEVudW1fRklSU1QgIE15VGVzdEVudW0gPSAxCisJTXlUZXN0RW51bV9TRUNPTkQgTXlUZXN0RW51bSA9IDIKKwlNeVRlc3RFbnVtX1RISVJEICBNeVRlc3RFbnVtID0gMworCU15VGVzdEVudW1fRk9VUlRIIE15VGVzdEVudW0gPSA0CispCisKK2Z1bmMgKHAgTXlUZXN0RW51bSkgU3RyaW5nKCkgc3RyaW5nIHsKKwlzd2l0Y2ggcCB7CisJY2FzZSBNeVRlc3RFbnVtX0ZJUlNUOgorCQlyZXR1cm4gIkZJUlNUIgorCWNhc2UgTXlUZXN0RW51bV9TRUNPTkQ6CisJCXJldHVybiAiU0VDT05EIgorCWNhc2UgTXlUZXN0RW51bV9USElSRDoKKwkJcmV0dXJuICJUSElSRCIKKwljYXNlIE15VGVzdEVudW1fRk9VUlRIOgorCQlyZXR1cm4gIkZPVVJUSCIKKwl9CisJcmV0dXJuICI8VU5TRVQ+IgorfQorCitmdW5jIE15VGVzdEVudW1Gcm9tU3RyaW5nKHMgc3RyaW5nKSAoTXlUZXN0RW51bSwgZXJyb3IpIHsKKwlzd2l0Y2ggcyB7CisJY2FzZSAiRklSU1QiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9GSVJTVCwgbmlsCisJY2FzZSAiU0VDT05EIjoKKwkJcmV0dXJuIE15VGVzdEVudW1fU0VDT05ELCBuaWwKKwljYXNlICJUSElSRCI6CisJCXJldHVybiBNeVRlc3RFbnVtX1RISVJELCBuaWwKKwljYXNlICJGT1VSVEgiOgorCQlyZXR1cm4gTXlUZXN0RW51bV9GT1VSVEgsIG5pbAorCX0KKwlyZXR1cm4gTXlUZXN0RW51bSgwKSwgZm10LkVycm9yZigibm90IGEgdmFsaWQgTXlUZXN0RW51bSBzdHJpbmciKQorfQorCitmdW5jIE15VGVzdEVudW1QdHIodiBNeVRlc3RFbnVtKSAqTXlUZXN0RW51bSB7IHJldHVybiAmdiB9CisKK3R5cGUgTXlUZXN0U3RydWN0IHN0cnVjdCB7CisJT24gICAgICAgICBib29sICAgICAgICAgICAgICAgIGB0aHJpZnQ6Im9uLDEiIGpzb246Im9uImAKKwlCICAgICAgICAgIGludDggICAgICAgICAgICAgICAgYHRocmlmdDoiYiwyIiBqc29uOiJiImAKKwlJbnQxNiAgICAgIGludDE2ICAgICAgICAgICAgICAgYHRocmlmdDoiaW50MTYsMyIganNvbjoiaW50MTYiYAorCUludDMyICAgICAgaW50MzIgICAgICAgICAgICAgICBgdGhyaWZ0OiJpbnQzMiw0IiBqc29uOiJpbnQzMiJgCisJSW50NjQgICAgICBpbnQ2NCAgICAgICAgICAgICAgIGB0aHJpZnQ6ImludDY0LDUiIGpzb246ImludDY0ImAKKwlEICAgICAgICAgIGZsb2F0NjQgICAgICAgICAgICAgYHRocmlmdDoiZCw2IiBqc29uOiJkImAKKwlTdCAgICAgICAgIHN0cmluZyAgICAgICAgICAgICAgYHRocmlmdDoic3QsNyIganNvbjoic3QiYAorCUJpbiAgICAgICAgW11ieXRlICAgICAgICAgICAgICBgdGhyaWZ0OiJiaW4sOCIganNvbjoiYmluImAKKwlTdHJpbmdNYXAgIG1hcFtzdHJpbmddc3RyaW5nICAgYHRocmlmdDoic3RyaW5nTWFwLDkiIGpzb246InN0cmluZ01hcCJgCisJU3RyaW5nTGlzdCBbXXN0cmluZyAgICAgICAgICAgIGB0aHJpZnQ6InN0cmluZ0xpc3QsMTAiIGpzb246InN0cmluZ0xpc3QiYAorCVN0cmluZ1NldCAgbWFwW3N0cmluZ11zdHJ1Y3R7fSBgdGhyaWZ0OiJzdHJpbmdTZXQsMTEiIGpzb246InN0cmluZ1NldCJgCisJRSAgICAgICAgICBNeVRlc3RFbnVtICAgICAgICAgIGB0aHJpZnQ6ImUsMTIiIGpzb246ImUiYAorfQorCitmdW5jIE5ld015VGVzdFN0cnVjdCgpICpNeVRlc3RTdHJ1Y3QgeworCXJldHVybiAmTXlUZXN0U3RydWN0e30KK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRPbigpIGJvb2wgeworCXJldHVybiBwLk9uCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0QigpIGludDggeworCXJldHVybiBwLkIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXRJbnQxNigpIGludDE2IHsKKwlyZXR1cm4gcC5JbnQxNgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEludDMyKCkgaW50MzIgeworCXJldHVybiBwLkludDMyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0SW50NjQoKSBpbnQ2NCB7CisJcmV0dXJuIHAuSW50NjQKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBHZXREKCkgZmxvYXQ2NCB7CisJcmV0dXJuIHAuRAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0KCkgc3RyaW5nIHsKKwlyZXR1cm4gcC5TdAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEJpbigpIFtdYnl0ZSB7CisJcmV0dXJuIHAuQmluCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgR2V0U3RyaW5nTWFwKCkgbWFwW3N0cmluZ11zdHJpbmcgeworCXJldHVybiBwLlN0cmluZ01hcAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ0xpc3QoKSBbXXN0cmluZyB7CisJcmV0dXJuIHAuU3RyaW5nTGlzdAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldFN0cmluZ1NldCgpIG1hcFtzdHJpbmddc3RydWN0e30geworCXJldHVybiBwLlN0cmluZ1NldAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIEdldEUoKSBNeVRlc3RFbnVtIHsKKwlyZXR1cm4gcC5FCit9CitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIFJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgcmVhZCBlcnJvcjogIiwgcCksIGVycikKKwl9CisJZm9yIHsKKwkJXywgZmllbGRUeXBlSWQsIGZpZWxkSWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgZmllbGQgJWQgcmVhZCBlcnJvcjogIiwgcCwgZmllbGRJZCksIGVycikKKwkJfQorCQlpZiBmaWVsZFR5cGVJZCA9PSBTVE9QIHsKKwkJCWJyZWFrCisJCX0KKwkJc3dpdGNoIGZpZWxkSWQgeworCQljYXNlIDE6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDI6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQyKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDM6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQzKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDQ6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ0KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDU6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ1KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDY6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ2KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDc6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ3KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDg6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ4KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDk6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQ5KGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQljYXNlIDEwOgorCQkJaWYgZXJyIDo9IHAucmVhZEZpZWxkMTAoaXByb3QpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCWNhc2UgMTE6CisJCQlpZiBlcnIgOj0gcC5yZWFkRmllbGQxMShpcHJvdCk7IGVyciAhPSBuaWwgeworCQkJCXJldHVybiBlcnIKKwkJCX0KKwkJY2FzZSAxMjoKKwkJCWlmIGVyciA6PSBwLnJlYWRGaWVsZDEyKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGVycgorCQkJfQorCQlkZWZhdWx0OgorCQkJaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwkJaWYgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgcmVhZCBzdHJ1Y3QgZW5kIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEJvb2woKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMTogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuT24gPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQyKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQnl0ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAyOiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJdGVtcCA6PSBpbnQ4KHYpCisJCXAuQiA9IHRlbXAKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDMoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRJMTYoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMzogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuSW50MTYgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ0KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDQ6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkludDMyID0gdgorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkNShpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEk2NCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCA1OiAiLCBlcnIpCisJfSBlbHNlIHsKKwkJcC5JbnQ2NCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDYoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWREb3VibGUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNjogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuRCA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDcoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgNzogIiwgZXJyKQorCX0gZWxzZSB7CisJCXAuU3QgPSB2CisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQ4KGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkQmluYXJ5KCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDg6ICIsIGVycikKKwl9IGVsc2UgeworCQlwLkJpbiA9IHYKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDkoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRNYXBCZWdpbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbWFwIGJlZ2luOiAiLCBlcnIpCisJfQorCXRNYXAgOj0gbWFrZShtYXBbc3RyaW5nXXN0cmluZywgc2l6ZSkKKwlwLlN0cmluZ01hcCA9IHRNYXAKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9rZXkwIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX2tleTAgPSB2CisJCX0KKwkJdmFyIF92YWwxIHN0cmluZworCQlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgZmllbGQgMDogIiwgZXJyKQorCQl9IGVsc2UgeworCQkJX3ZhbDEgPSB2CisJCX0KKwkJcC5TdHJpbmdNYXBbX2tleTBdID0gX3ZhbDEKKwl9CisJaWYgZXJyIDo9IGlwcm90LlJlYWRNYXBFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbWFwIGVuZDogIiwgZXJyKQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgcmVhZEZpZWxkMTAoaXByb3QgVFByb3RvY29sKSBlcnJvciB7CisJXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGxpc3QgYmVnaW46ICIsIGVycikKKwl9CisJdFNsaWNlIDo9IG1ha2UoW11zdHJpbmcsIDAsIHNpemUpCisJcC5TdHJpbmdMaXN0ID0gdFNsaWNlCisJZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7CisJCXZhciBfZWxlbTIgc3RyaW5nCisJCWlmIHYsIGVyciA6PSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAwOiAiLCBlcnIpCisJCX0gZWxzZSB7CisJCQlfZWxlbTIgPSB2CisJCX0KKwkJcC5TdHJpbmdMaXN0ID0gYXBwZW5kKHAuU3RyaW5nTGlzdCwgX2VsZW0yKQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZExpc3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHJlYWRpbmcgbGlzdCBlbmQ6ICIsIGVycikKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHJlYWRGaWVsZDExKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCV8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogIiwgZXJyKQorCX0KKwl0U2V0IDo9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSwgc2l6ZSkKKwlwLlN0cmluZ1NldCA9IHRTZXQKKwlmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKKwkJdmFyIF9lbGVtMyBzdHJpbmcKKwkJaWYgdiwgZXJyIDo9IGlwcm90LlJlYWRTdHJpbmcoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciByZWFkaW5nIGZpZWxkIDA6ICIsIGVycikKKwkJfSBlbHNlIHsKKwkJCV9lbGVtMyA9IHYKKwkJfQorCQlwLlN0cmluZ1NldFtfZWxlbTNdID0gc3RydWN0e317fQorCX0KKwlpZiBlcnIgOj0gaXByb3QuUmVhZFNldEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBzZXQgZW5kOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSByZWFkRmllbGQxMihpcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiB2LCBlcnIgOj0gaXByb3QuUmVhZEkzMigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3IgcmVhZGluZyBmaWVsZCAxMjogIiwgZXJyKQorCX0gZWxzZSB7CisJCXRlbXAgOj0gTXlUZXN0RW51bSh2KQorCQlwLkUgPSB0ZW1wCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbigiTXlUZXN0U3RydWN0Iik7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBzdHJ1Y3QgYmVnaW4gZXJyb3I6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDIob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkMyhvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ0KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDUob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkNihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQ3KG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IHAud3JpdGVGaWVsZDgob3Byb3QpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpZiBlcnIgOj0gcC53cml0ZUZpZWxkOShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxMChvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxMShvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBwLndyaXRlRmllbGQxMihvcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigid3JpdGUgZmllbGQgc3RvcCBlcnJvcjogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoIndyaXRlIHN0cnVjdCBzdG9wIGVycm9yOiAiLCBlcnIpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJvbiIsIEJPT0wsIDEpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTpvbjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlQm9vbChib29sKHAuT24pKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULm9uICgxKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxOm9uOiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDIob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiYiIsIEJZVEUsIDIpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMjpiOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCeXRlKGludDgocC5CKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5iICgyKSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAyOmI6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMyhvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQxNiIsIEkxNiwgMyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAzOmludDE2OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMTYoaW50MTYocC5JbnQxNikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuaW50MTYgKDMpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDM6aW50MTY6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQzMiIsIEkzMiwgNCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA0OmludDMyOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5JbnQzMikpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuaW50MzIgKDQpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDQ6aW50MzI6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJpbnQ2NCIsIEk2NCwgNSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA1OmludDY0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVJNjQoaW50NjQocC5JbnQ2NCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuaW50NjQgKDUpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDU6aW50NjQ6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNihvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJkIiwgRE9VQkxFLCA2KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDY6ZDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRG91YmxlKGZsb2F0NjQocC5EKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC5kICg2KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA2OmQ6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkNyhvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdCIsIFNUUklORywgNyk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA3OnN0OiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKHAuU3QpKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULnN0ICg3KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA3OnN0OiAiLCBwKSwgZXJyKQorCX0KKwlyZXR1cm4gZXJyCit9CisKK2Z1bmMgKHAgKk15VGVzdFN0cnVjdCkgd3JpdGVGaWVsZDgob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiYmluIiwgU1RSSU5HLCA4KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGJlZ2luIGVycm9yIDg6YmluOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVCaW5hcnkocC5CaW4pOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuYmluICg4KSBmaWVsZCB3cml0ZSBlcnJvcjogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA4OmJpbjogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQ5KG9wcm90IFRQcm90b2NvbCkgKGVyciBlcnJvcikgeworCWlmIGVyciA6PSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN0cmluZ01hcCIsIE1BUCwgOSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciA5OnN0cmluZ01hcDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwQmVnaW4oU1RSSU5HLCBTVFJJTkcsIGxlbihwLlN0cmluZ01hcCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBtYXAgYmVnaW46ICIsIGVycikKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgcC5TdHJpbmdNYXAgeworCQlpZiBlcnIgOj0gb3Byb3QuV3JpdGVTdHJpbmcoc3RyaW5nKGspKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVC4gKDApIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCQl9CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWFwRW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIG1hcCBlbmQ6ICIsIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciA5OnN0cmluZ01hcDogIiwgcCksIGVycikKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIChwICpNeVRlc3RTdHJ1Y3QpIHdyaXRlRmllbGQxMChvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJzdHJpbmdMaXN0IiwgTElTVCwgMTApOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTA6c3RyaW5nTGlzdDogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEJlZ2luKFNUUklORywgbGVuKHAuU3RyaW5nTGlzdCkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiAiLCBlcnIpCisJfQorCWZvciBfLCB2IDo9IHJhbmdlIHAuU3RyaW5nTGlzdCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTGlzdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcigiZXJyb3Igd3JpdGluZyBsaXN0IGVuZDogIiwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDEwOnN0cmluZ0xpc3Q6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMTEob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigic3RyaW5nU2V0IiwgU0VULCAxMSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKGZtdC5TcHJpbnRmKCIlVCB3cml0ZSBmaWVsZCBiZWdpbiBlcnJvciAxMTpzdHJpbmdTZXQ6ICIsIHApLCBlcnIpCisJfQorCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVNldEJlZ2luKFNUUklORywgbGVuKHAuU3RyaW5nU2V0KSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIHNldCBiZWdpbjogIiwgZXJyKQorCX0KKwlmb3IgdiA6PSByYW5nZSBwLlN0cmluZ1NldCB7CisJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCisJCX0KKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0RW5kKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gUHJlcGVuZEVycm9yKCJlcnJvciB3cml0aW5nIHNldCBlbmQ6ICIsIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRFbmQoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVUIHdyaXRlIGZpZWxkIGVuZCBlcnJvciAxMTpzdHJpbmdTZXQ6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSB3cml0ZUZpZWxkMTIob3Byb3QgVFByb3RvY29sKSAoZXJyIGVycm9yKSB7CisJaWYgZXJyIDo9IG9wcm90LldyaXRlRmllbGRCZWdpbigiZSIsIEkzMiwgMTIpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgYmVnaW4gZXJyb3IgMTI6ZTogIiwgcCksIGVycikKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlSTMyKGludDMyKHAuRSkpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQuZSAoMTIpIGZpZWxkIHdyaXRlIGVycm9yOiAiLCBwKSwgZXJyKQorCX0KKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIFByZXBlbmRFcnJvcihmbXQuU3ByaW50ZigiJVQgd3JpdGUgZmllbGQgZW5kIGVycm9yIDEyOmU6ICIsIHApLCBlcnIpCisJfQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqTXlUZXN0U3RydWN0KSBTdHJpbmcoKSBzdHJpbmcgeworCWlmIHAgPT0gbmlsIHsKKwkJcmV0dXJuICI8bmlsPiIKKwl9CisJcmV0dXJuIGZtdC5TcHJpbnRmKCJNeVRlc3RTdHJ1Y3QoJSt2KSIsICpwKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlci5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODEzZmEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXIuZ28KQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCit0eXBlIFRTZXJ2ZXIgaW50ZXJmYWNlIHsKKwlQcm9jZXNzb3JGYWN0b3J5KCkgVFByb2Nlc3NvckZhY3RvcnkKKwlTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0CisJSW5wdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkKKwlPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KCkgVFRyYW5zcG9ydEZhY3RvcnkKKwlJbnB1dFByb3RvY29sRmFjdG9yeSgpIFRQcm90b2NvbEZhY3RvcnkKKwlPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5CisKKwkvLyBTdGFydHMgdGhlIHNlcnZlcgorCVNlcnZlKCkgZXJyb3IKKwkvLyBTdG9wcyB0aGUgc2VydmVyLiBUaGlzIGlzIG9wdGlvbmFsIG9uIGEgcGVyLWltcGxlbWVudGF0aW9uIGJhc2lzLiBOb3QKKwkvLyBhbGwgc2VydmVycyBhcmUgcmVxdWlyZWQgdG8gYmUgY2xlYW5seSBzdG9wcGFibGUuCisJU3RvcCgpIGVycm9yCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkMjRhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJuZXQiCisJInN5bmMiCisJInRpbWUiCispCisKK3R5cGUgVFNlcnZlclNvY2tldCBzdHJ1Y3QgeworCWxpc3RlbmVyICAgICAgbmV0Lkxpc3RlbmVyCisJYWRkciAgICAgICAgICBuZXQuQWRkcgorCWNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbgorCisJLy8gUHJvdGVjdHMgdGhlIGludGVycnVwdGVkIHZhbHVlIHRvIG1ha2UgaXQgdGhyZWFkIHNhZmUuCisJbXUgICAgICAgICAgc3luYy5SV011dGV4CisJaW50ZXJydXB0ZWQgYm9vbAorfQorCitmdW5jIE5ld1RTZXJ2ZXJTb2NrZXQobGlzdGVuQWRkciBzdHJpbmcpICgqVFNlcnZlclNvY2tldCwgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFNlcnZlclNvY2tldFRpbWVvdXQobGlzdGVuQWRkciwgMCkKK30KKworZnVuYyBOZXdUU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyIHN0cmluZywgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJYWRkciwgZXJyIDo9IG5ldC5SZXNvbHZlVENQQWRkcigidGNwIiwgbGlzdGVuQWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0fSwgbmlsCit9CisKKy8vIENyZWF0ZXMgYSBUU2VydmVyU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU2VydmVyU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIGNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTZXJ2ZXJTb2NrZXQgeworCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0fQorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBMaXN0ZW4oKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJaWYgcC5Jc0xpc3RlbmluZygpIHsKKwkJcmV0dXJuIG5pbAorCX0KKwlsLCBlcnIgOj0gbmV0Lkxpc3RlbihwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcC5saXN0ZW5lciA9IGwKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXAubXUuUkxvY2soKQorCWludGVycnVwdGVkIDo9IHAuaW50ZXJydXB0ZWQKKwlwLm11LlJVbmxvY2soKQorCisJaWYgaW50ZXJydXB0ZWQgeworCQlyZXR1cm4gbmlsLCBlcnJUcmFuc3BvcnRJbnRlcnJ1cHRlZAorCX0KKworCXAubXUuTG9jaygpCisJbGlzdGVuZXIgOj0gcC5saXN0ZW5lcgorCXAubXUuVW5sb2NrKCkKKwlpZiBsaXN0ZW5lciA9PSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0IikKKwl9CisKKwljb25uLCBlcnIgOj0gbGlzdGVuZXIuQWNjZXB0KCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJfQorCXJldHVybiBOZXdUU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4sIHAuY2xpZW50VGltZW91dCksIG5pbAorfQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGxpc3RlbmluZy4KK2Z1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIElzTGlzdGVuaW5nKCkgYm9vbCB7CisJcmV0dXJuIHAubGlzdGVuZXIgIT0gbmlsCit9CisKKy8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgorZnVuYyAocCAqVFNlcnZlclNvY2tldCkgT3BlbigpIGVycm9yIHsKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTZXJ2ZXIgc29ja2V0IGFscmVhZHkgb3BlbiIpCisJfQorCWlmIGwsIGVyciA6PSBuZXQuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfSBlbHNlIHsKKwkJcC5saXN0ZW5lciA9IGwKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2VydmVyU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgeworCWlmIHAubGlzdGVuZXIgIT0gbmlsIHsKKwkJcmV0dXJuIHAubGlzdGVuZXIuQWRkcigpCisJfQorCXJldHVybiBwLmFkZHIKK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJdmFyIGVyciBlcnJvcgorCXAubXUuTG9jaygpCisJaWYgcC5Jc0xpc3RlbmluZygpIHsKKwkJZXJyID0gcC5saXN0ZW5lci5DbG9zZSgpCisJCXAubGlzdGVuZXIgPSBuaWwKKwl9CisJcC5tdS5VbmxvY2soKQorCXJldHVybiBlcnIKK30KKworZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJcC5pbnRlcnJ1cHRlZCA9IHRydWUKKwlwLm11LlVubG9jaygpCisJcC5DbG9zZSgpCisKKwlyZXR1cm4gbmlsCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxZTE5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbwpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImZtdCIKKwkidGVzdGluZyIKKykKKworZnVuYyBUZXN0U29ja2V0SXNudExpc3RlbmluZ0FmdGVySW50ZXJydXB0KHQgKnRlc3RpbmcuVCkgeworCWhvc3QgOj0gIjEyNy4wLjAuMSIKKwlwb3J0IDo9IDkwOTAKKwlhZGRyIDo9IGZtdC5TcHJpbnRmKCIlczolZCIsIGhvc3QsIHBvcnQpCisKKwlzb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJc29ja2V0Lkxpc3RlbigpCisJc29ja2V0LkludGVycnVwdCgpCisKKwluZXdTb2NrZXQgOj0gQ3JlYXRlU2VydmVyU29ja2V0KHQsIGFkZHIpCisJZXJyIDo9IG5ld1NvY2tldC5MaXN0ZW4oKQorCWRlZmVyIG5ld1NvY2tldC5JbnRlcnJ1cHQoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRmFpbGVkIHRvIHJlYmluZHM6ICVzIiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0U29ja2V0Q29uY3VycmVuY3kodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlnbyBmdW5jKCkgeyBzb2NrZXQuTGlzdGVuKCkgfSgpCisJZ28gZnVuYygpIHsgc29ja2V0LkludGVycnVwdCgpIH0oKQorfQorCitmdW5jIENyZWF0ZVNlcnZlclNvY2tldCh0ICp0ZXN0aW5nLlQsIGFkZHIgc3RyaW5nKSAqVFNlcnZlclNvY2tldCB7CisJc29ja2V0LCBlcnIgOj0gTmV3VFNlcnZlclNvY2tldChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0OiAlcyIsIGVycikKKwl9CisJcmV0dXJuIHNvY2tldAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJ2ZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhZjQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3Rlc3QuZ28KQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJ0ZXN0aW5nIgorKQorCitmdW5jIFRlc3ROb3RoaW5nKHQgKnRlc3RpbmcuVCkgeworCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcnZlcl90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjNDBiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3RyYW5zcG9ydC5nbwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKKy8vIFNlcnZlciB0cmFuc3BvcnQuIE9iamVjdCB3aGljaCBwcm92aWRlcyBjbGllbnQgdHJhbnNwb3J0cy4KK3R5cGUgVFNlcnZlclRyYW5zcG9ydCBpbnRlcmZhY2UgeworCUxpc3RlbigpIGVycm9yCisJQWNjZXB0KCkgKFRUcmFuc3BvcnQsIGVycm9yKQorCUNsb3NlKCkgZXJyb3IKKworCS8vIE9wdGlvbmFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBzaWduYWxzIHRvIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0CisJLy8gdGhhdCBpdCBzaG91bGQgYnJlYWsgb3V0IG9mIGFueSBhY2NlcHQoKSBvciBsaXN0ZW4oKSB0aGF0IGl0IGlzIGN1cnJlbnRseQorCS8vIGJsb2NrZWQgb24uIFRoaXMgbWV0aG9kLCBpZiBpbXBsZW1lbnRlZCwgTVVTVCBiZSB0aHJlYWQgc2FmZSwgYXMgaXQgbWF5CisJLy8gYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIGNvbnRleHQgdGhhbiB0aGUgb3RoZXIgVFNlcnZlclRyYW5zcG9ydAorCS8vIG1ldGhvZHMuCisJSW50ZXJydXB0KCkgZXJyb3IKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOGE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvCkBAIC0wLDAgKzEsMTMzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJidWZpbyIKKwkiYnl0ZXMiCisJImNvbnRleHQiCisJImVuY29kaW5nL2Jhc2U2NCIKKwkiZW5jb2RpbmcvanNvbiIKKwkiZm10IgorCSJpbyIKKwkibWF0aCIKKwkic3RyY29udiIKKykKKwordHlwZSBfUGFyc2VDb250ZXh0IGludAorCitjb25zdCAoCisJX0NPTlRFWFRfSU5fVE9QTEVWRUwgICAgICAgICAgX1BhcnNlQ29udGV4dCA9IDEKKwlfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUICAgICAgICBfUGFyc2VDb250ZXh0ID0gMgorCV9DT05URVhUX0lOX0xJU1QgICAgICAgICAgICAgIF9QYXJzZUNvbnRleHQgPSAzCisJX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUICAgICAgX1BhcnNlQ29udGV4dCA9IDQKKwlfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkgICBfUGFyc2VDb250ZXh0ID0gNQorCV9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFIF9QYXJzZUNvbnRleHQgPSA2CispCisKK2Z1bmMgKHAgX1BhcnNlQ29udGV4dCkgU3RyaW5nKCkgc3RyaW5nIHsKKwlzd2l0Y2ggcCB7CisJY2FzZSBfQ09OVEVYVF9JTl9UT1BMRVZFTDoKKwkJcmV0dXJuICJUT1BMRVZFTCIKKwljYXNlIF9DT05URVhUX0lOX0xJU1RfRklSU1Q6CisJCXJldHVybiAiTElTVC1GSVJTVCIKKwljYXNlIF9DT05URVhUX0lOX0xJU1Q6CisJCXJldHVybiAiTElTVCIKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVDoKKwkJcmV0dXJuICJPQkpFQ1QtRklSU1QiCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXJldHVybiAiT0JKRUNULU5FWFQtS0VZIgorCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6CisJCXJldHVybiAiT0JKRUNULU5FWFQtVkFMVUUiCisJfQorCXJldHVybiAiVU5LTk9XTi1QQVJTRS1DT05URVhUIgorfQorCisvLyBKU09OIHByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvciB0aHJpZnQuCisvLworLy8gVGhpcyBwcm90b2NvbCBwcm9kdWNlcy9jb25zdW1lcyBhIHNpbXBsZSBvdXRwdXQgZm9ybWF0CisvLyBzdWl0YWJsZSBmb3IgcGFyc2luZyBieSBzY3JpcHRpbmcgbGFuZ3VhZ2VzLiAgSXQgc2hvdWxkIG5vdCBiZQorLy8gY29uZnVzZWQgd2l0aCB0aGUgZnVsbC1mZWF0dXJlZCBUSlNPTlByb3RvY29sLgorLy8KK3R5cGUgVFNpbXBsZUpTT05Qcm90b2NvbCBzdHJ1Y3QgeworCXRyYW5zIFRUcmFuc3BvcnQKKworCXBhcnNlQ29udGV4dFN0YWNrIFtdaW50CisJZHVtcENvbnRleHQgICAgICAgW11pbnQKKworCXdyaXRlciAqYnVmaW8uV3JpdGVyCisJcmVhZGVyICpidWZpby5SZWFkZXIKK30KKworLy8gQ29uc3RydWN0b3IKK2Z1bmMgTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0IFRUcmFuc3BvcnQpICpUU2ltcGxlSlNPTlByb3RvY29sIHsKKwl2IDo9ICZUU2ltcGxlSlNPTlByb3RvY29se3RyYW5zOiB0LAorCQl3cml0ZXI6IGJ1ZmlvLk5ld1dyaXRlcih0KSwKKwkJcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodCksCisJfQorCXYucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQodi5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX1RPUExFVkVMKSkKKwl2LmR1bXBDb250ZXh0ID0gYXBwZW5kKHYuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCisJcmV0dXJuIHYKK30KKworLy8gRmFjdG9yeQordHlwZSBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSBzdHJ1Y3R7fQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKKwlyZXR1cm4gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKK30KKworZnVuYyBOZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpICpUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuICZUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeXt9Cit9CisKK3ZhciAoCisJSlNPTl9DT01NQSAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0NPTE9OICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fTEJSQUNFICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9SQlJBQ0UgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0xCUkFDS0VUICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fUkJSQUNLRVQgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9RVU9URSAgICAgICAgICAgICAgICAgICBieXRlCisJSlNPTl9RVU9URV9CWVRFUyAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX05VTEwgICAgICAgICAgICAgICAgICAgIFtdYnl0ZQorCUpTT05fVFJVRSAgICAgICAgICAgICAgICAgICAgW11ieXRlCisJSlNPTl9GQUxTRSAgICAgICAgICAgICAgICAgICBbXWJ5dGUKKwlKU09OX0lORklOSVRZICAgICAgICAgICAgICAgIHN0cmluZworCUpTT05fTkVHQVRJVkVfSU5GSU5JVFkgICAgICAgc3RyaW5nCisJSlNPTl9OQU4gICAgICAgICAgICAgICAgICAgICBzdHJpbmcKKwlKU09OX0lORklOSVRZX0JZVEVTICAgICAgICAgIFtdYnl0ZQorCUpTT05fTkVHQVRJVkVfSU5GSU5JVFlfQllURVMgW11ieXRlCisJSlNPTl9OQU5fQllURVMgICAgICAgICAgICAgICBbXWJ5dGUKKwlqc29uX25vbmJhc2VfbWFwX2VsZW1fYnl0ZXMgIFtdYnl0ZQorKQorCitmdW5jIGluaXQoKSB7CisJSlNPTl9DT01NQSA9IFtdYnl0ZXsnLCd9CisJSlNPTl9DT0xPTiA9IFtdYnl0ZXsnOid9CisJSlNPTl9MQlJBQ0UgPSBbXWJ5dGV7J3snfQorCUpTT05fUkJSQUNFID0gW11ieXRleyd9J30KKwlKU09OX0xCUkFDS0VUID0gW11ieXRleydbJ30KKwlKU09OX1JCUkFDS0VUID0gW11ieXRleyddJ30KKwlKU09OX1FVT1RFID0gJyInCisJSlNPTl9RVU9URV9CWVRFUyA9IFtdYnl0ZXsnIid9CisJSlNPTl9OVUxMID0gW11ieXRleyduJywgJ3UnLCAnbCcsICdsJ30KKwlKU09OX1RSVUUgPSBbXWJ5dGV7J3QnLCAncicsICd1JywgJ2UnfQorCUpTT05fRkFMU0UgPSBbXWJ5dGV7J2YnLCAnYScsICdsJywgJ3MnLCAnZSd9CisJSlNPTl9JTkZJTklUWSA9ICJJbmZpbml0eSIKKwlKU09OX05FR0FUSVZFX0lORklOSVRZID0gIi1JbmZpbml0eSIKKwlKU09OX05BTiA9ICJOYU4iCisJSlNPTl9JTkZJTklUWV9CWVRFUyA9IFtdYnl0ZXsnSScsICduJywgJ2YnLCAnaScsICduJywgJ2knLCAndCcsICd5J30KKwlKU09OX05FR0FUSVZFX0lORklOSVRZX0JZVEVTID0gW11ieXRleyctJywgJ0knLCAnbicsICdmJywgJ2knLCAnbicsICdpJywgJ3QnLCAneSd9CisJSlNPTl9OQU5fQllURVMgPSBbXWJ5dGV7J04nLCAnYScsICdOJ30KKwlqc29uX25vbmJhc2VfbWFwX2VsZW1fYnl0ZXMgPSBbXWJ5dGV7J10nLCAnLCcsICdbJ30KK30KKworZnVuYyBqc29uUXVvdGUocyBzdHJpbmcpIHN0cmluZyB7CisJYiwgXyA6PSBqc29uLk1hcnNoYWwocykKKwlzMSA6PSBzdHJpbmcoYikKKwlyZXR1cm4gczEKK30KKworZnVuYyBqc29uVW5xdW90ZShzIHN0cmluZykgKHN0cmluZywgYm9vbCkgeworCXMxIDo9IG5ldyhzdHJpbmcpCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgczEpCisJcmV0dXJuICpzMSwgZXJyID09IG5pbAorfQorCitmdW5jIG1pc21hdGNoKGV4cGVjdGVkLCBhY3R1YWwgc3RyaW5nKSBlcnJvciB7CisJcmV0dXJuIGZtdC5FcnJvcmYoIkV4cGVjdGVkICclcycgYnV0IGZvdW5kICclcycgd2hpbGUgcGFyc2luZyBKU09OLiIsIGV4cGVjdGVkLCBhY3R1YWwpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgZXJyb3IgeworCXAucmVzZXRDb250ZXh0U3RhY2soKSAvLyBUSFJJRlQtMzczNQorCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHR5cGVJZCkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUkzMihzZXFJZCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dE9iamVjdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgZXJyb3IgeworCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBlcnJvciB7CisJLy9yZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRTdG9wKCkgZXJyb3IgeyByZXR1cm4gbmlsIH0KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIGUgOj0gcC5Xcml0ZUJ5dGUoaW50OChrZXlUeXBlKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KHZhbHVlVHlwZSkpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBwLldyaXRlSTMyKGludDMyKHNpemUpKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZU1hcEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVMaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dExpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJvb2woYiBib29sKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0Qm9vbChiKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJ5dGUoYiBpbnQ4KSBlcnJvciB7CisJcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoYikpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlSTE2KHYgaW50MTYpIGVycm9yIHsKKwlyZXR1cm4gcC5Xcml0ZUkzMihpbnQzMih2KSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVJMzIodiBpbnQzMikgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEk2NChpbnQ2NCh2KSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVJNjQodiBpbnQ2NCkgZXJyb3IgeworCXJldHVybiBwLk91dHB1dEk2NChpbnQ2NCh2KSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVEb3VibGUodiBmbG9hdDY0KSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0RjY0KHYpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU3RyaW5nKHYgc3RyaW5nKSBlcnJvciB7CisJcmV0dXJuIHAuT3V0cHV0U3RyaW5nKHYpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQmluYXJ5KHYgW11ieXRlKSBlcnJvciB7CisJLy8gSlNPTiBsaWJyYXJ5IG9ubHkgdGFrZXMgaW4gYSBzdHJpbmcsCisJLy8gbm90IGFuIGFyYml0cmFyeSBieXRlIGFycmF5LCB0byBlbnN1cmUgYnl0ZXMgYXJlIHRyYW5zbWl0dGVkCisJLy8gZWZmaWNpZW50bHkgd2UgbXVzdCBjb252ZXJ0IHRoaXMgaW50byBhIHZhbGlkIEpTT04gc3RyaW5nCisJLy8gdGhlcmVmb3JlIHdlIHVzZSBiYXNlNjQgZW5jb2RpbmcgdG8gYXZvaWQgZXhjZXNzaXZlIGVzY2FwaW5nL3F1b3RpbmcKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwl3cml0ZXIgOj0gYmFzZTY0Lk5ld0VuY29kZXIoYmFzZTY0LlN0ZEVuY29kaW5nLCBwLndyaXRlcikKKwlpZiBfLCBlIDo9IHdyaXRlci5Xcml0ZSh2KTsgZSAhPSBuaWwgeworCQlwLndyaXRlci5SZXNldChwLnRyYW5zKSAvLyBUSFJJRlQtMzczNQorCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWlmIGUgOj0gd3JpdGVyLkNsb3NlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9RVU9URV9CWVRFUyk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCisvLyBSZWFkaW5nIG1ldGhvZHMuCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIGVycm9yKSB7CisJcC5yZXNldENvbnRleHRTdGFjaygpIC8vIFRIUklGVC0zNzM1CisJaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CisJCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKKwl9CisJaWYgbmFtZSwgZXJyID0gcC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCWJUeXBlSWQsIGVyciA6PSBwLlJlYWRCeXRlKCkKKwl0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYlR5cGVJZCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgorCX0KKwlpZiBzZXFJZCwgZXJyID0gcC5SZWFkSTMyKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCisJfQorCXJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgZXJyb3IpIHsKKwlfLCBlcnIgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQorCXJldHVybiAiIiwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RFbmQoKSBlcnJvciB7CisJcmV0dXJuIHAuUGFyc2VPYmplY3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChzdHJpbmcsIFRUeXBlLCBpbnQxNiwgZXJyb3IpIHsKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIFNUT1AsIDAsIGVycgorCX0KKwliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oYikgPiAwIHsKKwkJc3dpdGNoIGJbMF0geworCQljYXNlIEpTT05fUkJSQUNFWzBdOgorCQkJcmV0dXJuICIiLCBTVE9QLCAwLCBuaWwKKwkJY2FzZSBKU09OX1FVT1RFOgorCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJbmFtZSwgZXJyIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKKwkJCS8vIHNpbXBsZWpzb24gaXMgbm90IG1lYW50IHRvIGJlIHJlYWQgYmFjayBpbnRvIHRocmlmdAorCQkJLy8gLSBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0VXNhZ2VKYXZhCisJCQkvLyAtIHVzZSBKU09OIGluc3RlYWQKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBuYW1lLCBTVE9QLCAwLCBlcnIKKwkJCX0KKwkJCXJldHVybiBuYW1lLCBTVE9QLCAtMSwgcC5QYXJzZVBvc3RWYWx1ZSgpCisJCQkvKgorCQkJICAgaWYgZXJyID0gcC5QYXJzZVBvc3RWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJCSAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgorCQkJICAgfQorCQkJICAgaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CisJCQkgICAgIHJldHVybiBuYW1lLCBTVE9QLCAwLCBlcnIKKwkJCSAgIH0KKwkJCSAgIGJUeXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJCQkgICB0aGV0eXBlIDo9IFRUeXBlKGJUeXBlKQorCQkJICAgaWYgZXJyICE9IG5pbCB7CisJCQkgICAgIHJldHVybiBuYW1lLCB0aGV0eXBlLCAwLCBlcnIKKwkJCSAgIH0KKwkJCSAgIGlkLCBlcnIgOj0gcC5SZWFkSTE2KCkKKwkJCSAgIHJldHVybiBuYW1lLCB0aGV0eXBlLCBpZCwgZXJyCisJCQkqLworCQl9CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJ9XCIgb3IgJ1wiJywgYnV0IGZvdW5kOiAnJXMnIiwgc3RyaW5nKGIpKQorCQlyZXR1cm4gIiIsIFNUT1AsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuICIiLCBTVE9QLCAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oaW8uRU9GKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBlcnJvciB7CisJcmV0dXJuIG5pbAorCS8vcmV0dXJuIHAuUGFyc2VMaXN0RW5kKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgeworCQlyZXR1cm4gVk9JRCwgVk9JRCwgMCwgZQorCX0KKworCS8vIHJlYWQga2V5VHlwZQorCWJLZXlUeXBlLCBlIDo9IHAuUmVhZEJ5dGUoKQorCWtleVR5cGUgPSBUVHlwZShiS2V5VHlwZSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisKKwkvLyByZWFkIHZhbHVlVHlwZQorCWJWYWx1ZVR5cGUsIGUgOj0gcC5SZWFkQnl0ZSgpCisJdmFsdWVUeXBlID0gVFR5cGUoYlZhbHVlVHlwZSkKKwlpZiBlICE9IG5pbCB7CisJCXJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKKwl9CisKKwkvLyByZWFkIHNpemUKKwlpU2l6ZSwgZXJyIDo9IHAuUmVhZEk2NCgpCisJc2l6ZSA9IGludChpU2l6ZSkKKwlyZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1hcEVuZCgpIGVycm9yIHsKKwlyZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZSBlcnJvcikgeworCXJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRMaXN0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgZXJyb3IpIHsKKwlyZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU2V0RW5kKCkgZXJyb3IgeworCXJldHVybiBwLlBhcnNlTGlzdEVuZCgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCb29sKCkgKGJvb2wsIGVycm9yKSB7CisJdmFyIHZhbHVlIGJvb2wKKworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiB2YWx1ZSwgZXJyCisJfQorCWYsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCWlmIGxlbihmKSA+IDAgeworCQlzd2l0Y2ggZlswXSB7CisJCWNhc2UgSlNPTl9UUlVFWzBdOgorCQkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fVFJVRSkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQorCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX1RSVUUpIHsKKwkJCQl2YWx1ZSA9IHRydWUKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcInRydWVcIiBidXQgZm91bmQ6ICVzIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJYnJlYWsKKwkJY2FzZSBKU09OX0ZBTFNFWzBdOgorCQkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fRkFMU0UpKQorCQkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJCWlmIGVyciAhPSBuaWwgeworCQkJCXJldHVybiBmYWxzZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJCX0KKwkJCWlmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9GQUxTRSkgeworCQkJCXZhbHVlID0gZmFsc2UKKwkJCX0gZWxzZSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBcImZhbHNlXCIgYnV0IGZvdW5kOiAlcyIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCWJyZWFrCisJCWNhc2UgSlNPTl9OVUxMWzBdOgorCQkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCQlfLCBlcnIgOj0gcC5yZWFkZXIuUmVhZChiKQorCQkJaWYgZXJyICE9IG5pbCB7CisJCQkJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCQkJfQorCQkJaWYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX05VTEwpIHsKKwkJCQl2YWx1ZSA9IGZhbHNlCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJudWxsXCIgYnV0IGZvdW5kOiAlcyIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgb3IgXCJudWxsXCIgYnV0IGZvdW5kOiAlcyIsIHN0cmluZyhmKSkKKwkJCXJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfQorCXJldHVybiB2YWx1ZSwgcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRCeXRlKCkgKGludDgsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDgodiksIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTE2KCkgKGludDE2LCBlcnJvcikgeworCXYsIGVyciA6PSBwLlJlYWRJNjQoKQorCXJldHVybiBpbnQxNih2KSwgZXJyCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJMzIoKSAoaW50MzIsIGVycm9yKSB7CisJdiwgZXJyIDo9IHAuUmVhZEk2NCgpCisJcmV0dXJuIGludDMyKHYpLCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEk2NCgpIChpbnQ2NCwgZXJyb3IpIHsKKwl2LCBfLCBlcnIgOj0gcC5QYXJzZUk2NCgpCisJcmV0dXJuIHYsIGVycgorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkRG91YmxlKCkgKGZsb2F0NjQsIGVycm9yKSB7CisJdiwgXywgZXJyIDo9IHAuUGFyc2VGNjQoKQorCXJldHVybiB2LCBlcnIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFN0cmluZygpIChzdHJpbmcsIGVycm9yKSB7CisJdmFyIHYgc3RyaW5nCisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIHYsIGVycgorCX0KKwlmLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJdmFsdWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCisJCXYgPSB2YWx1ZQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiB2LCBlcnIKKwkJfQorCX0gZWxzZSBpZiBsZW4oZikgPiAwICYmIGZbMF0gPT0gSlNPTl9OVUxMWzBdIHsKKwkJYiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpCisJCV8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGIpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCX0KKwkJaWYgc3RyaW5nKGIpICE9IHN0cmluZyhKU09OX05VTEwpIHsKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgdW5xdW90ZWQgZGF0YSBzdGFydGVkIHdpdGggJXMiLCBzdHJpbmcoYikpCisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfSBlbHNlIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhmKSkKKwkJcmV0dXJuIHYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwl9CisJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQmluYXJ5KCkgKFtdYnl0ZSwgZXJyb3IpIHsKKwl2YXIgdiBbXWJ5dGUKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJZiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGYpID4gMCAmJiBmWzBdID09IEpTT05fUVVPVEUgeworCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCXZhbHVlLCBlcnIgOj0gcC5QYXJzZUJhc2U2NEVuY29kZWRCb2R5KCkKKwkJdiA9IHZhbHVlCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIHYsIGVycgorCQl9CisJfSBlbHNlIGlmIGxlbihmKSA+IDAgJiYgZlswXSA9PSBKU09OX05VTExbMF0geworCQliIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYikKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwkJfQorCQlpZiBzdHJpbmcoYikgIT0gc3RyaW5nKEpTT05fTlVMTCkgeworCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCB1bnF1b3RlZCBkYXRhIHN0YXJ0ZWQgd2l0aCAlcyIsIHN0cmluZyhiKSkKKwkJCXJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCX0KKwl9IGVsc2UgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIGEgSlNPTiBzdHJpbmcsIGZvdW5kIHVucXVvdGVkIGRhdGEgc3RhcnRlZCB3aXRoICVzIiwgc3RyaW5nKGYpKQorCQlyZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKworCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC53cml0ZXIuRmx1c2goKSkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgeworCXJldHVybiBwLnRyYW5zCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFByZVZhbHVlKCkgZXJyb3IgeworCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKQorCXN3aXRjaCBjeHQgeworCWNhc2UgX0NPTlRFWFRfSU5fTElTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9DT01NQSk7IGUgIT0gbmlsIHsKKwkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJfQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6CisJCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0NPTE9OKTsgZSAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQl9CisJCWJyZWFrCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0UG9zdFZhbHVlKCkgZXJyb3IgeworCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHRbbGVuKHAuZHVtcENvbnRleHQpLTFdKQorCXN3aXRjaCBjeHQgeworCWNhc2UgX0NPTlRFWFRfSU5fTElTVF9GSVJTVDoKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9MSVNUKSkKKwkJYnJlYWsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVDoKKwkJcC5kdW1wQ29udGV4dCA9IHAuZHVtcENvbnRleHRbOmxlbihwLmR1bXBDb250ZXh0KS0xXQorCQlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwkJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6CisJCXAuZHVtcENvbnRleHQgPSBwLmR1bXBDb250ZXh0WzpsZW4ocC5kdW1wQ29udGV4dCktMV0KKwkJcC5kdW1wQ29udGV4dCA9IGFwcGVuZChwLmR1bXBDb250ZXh0LCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZKSkKKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRCb29sKHZhbHVlIGJvb2wpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwl2YXIgdiBzdHJpbmcKKwlpZiB2YWx1ZSB7CisJCXYgPSBzdHJpbmcoSlNPTl9UUlVFKQorCX0gZWxzZSB7CisJCXYgPSBzdHJpbmcoSlNPTl9GQUxTRSkKKwl9CisJc3dpdGNoIF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pIHsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQl2ID0ganNvblF1b3RlKHYpCisJZGVmYXVsdDoKKwl9CisJaWYgZSA6PSBwLk91dHB1dFN0cmluZ0RhdGEodik7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0TnVsbCgpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9OVUxMKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dEY2NCh2YWx1ZSBmbG9hdDY0KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJdmFyIHYgc3RyaW5nCisJaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQl2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgSlNPTl9OQU4gKyBzdHJpbmcoSlNPTl9RVU9URSkKKwl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQl2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgSlNPTl9JTkZJTklUWSArIHN0cmluZyhKU09OX1FVT1RFKQorCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgeworCQl2ID0gc3RyaW5nKEpTT05fUVVPVEUpICsgSlNPTl9ORUdBVElWRV9JTkZJTklUWSArIHN0cmluZyhKU09OX1FVT1RFKQorCX0gZWxzZSB7CisJCXYgPSBzdHJjb252LkZvcm1hdEZsb2F0KHZhbHVlLCAnZycsIC0xLCA2NCkKKwkJc3dpdGNoIF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pIHsKKwkJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKKwkJCXYgPSBzdHJpbmcoSlNPTl9RVU9URSkgKyB2ICsgc3RyaW5nKEpTT05fUVVPVEUpCisJCWRlZmF1bHQ6CisJCX0KKwl9CisJaWYgZSA6PSBwLk91dHB1dFN0cmluZ0RhdGEodik7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0STY0KHZhbHVlIGludDY0KSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJdiA6PSBzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApCisJc3dpdGNoIF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dFtsZW4ocC5kdW1wQ29udGV4dCktMV0pIHsKKwljYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgorCQl2ID0ganNvblF1b3RlKHYpCisJZGVmYXVsdDoKKwl9CisJaWYgZSA6PSBwLk91dHB1dFN0cmluZ0RhdGEodik7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0U3RyaW5nKHMgc3RyaW5nKSBlcnJvciB7CisJaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLk91dHB1dFN0cmluZ0RhdGEoanNvblF1b3RlKHMpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRTdHJpbmdEYXRhKHMgc3RyaW5nKSBlcnJvciB7CisJXywgZSA6PSBwLndyaXRlKFtdYnl0ZShzKSkKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dE9iamVjdEJlZ2luKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0xCUkFDRSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlwLmR1bXBDb250ZXh0ID0gYXBwZW5kKHAuZHVtcENvbnRleHQsIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QpKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0RW5kKCkgZXJyb3IgeworCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX1JCUkFDRSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJaWYgZSA6PSBwLk91dHB1dFBvc3RWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0TGlzdEJlZ2luKCkgZXJyb3IgeworCWlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCWlmIF8sIGUgOj0gcC53cml0ZShKU09OX0xCUkFDS0VUKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCXAuZHVtcENvbnRleHQgPSBhcHBlbmQocC5kdW1wQ29udGV4dCwgaW50KF9DT05URVhUX0lOX0xJU1RfRklSU1QpKQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0TGlzdEVuZCgpIGVycm9yIHsKKwlpZiBfLCBlIDo9IHAud3JpdGUoSlNPTl9SQlJBQ0tFVCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCX0KKwlwLmR1bXBDb250ZXh0ID0gcC5kdW1wQ29udGV4dFs6bGVuKHAuZHVtcENvbnRleHQpLTFdCisJaWYgZSA6PSBwLk91dHB1dFBvc3RWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBlCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIGVycm9yIHsKKwlpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlQnl0ZShpbnQ4KGVsZW1UeXBlKSk7IGUgIT0gbmlsIHsKKwkJcmV0dXJuIGUKKwl9CisJaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gZQorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUHJlVmFsdWUoKSBlcnJvciB7CisJaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJfQorCWN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2tbbGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdKQorCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCXN3aXRjaCBjeHQgeworCWNhc2UgX0NPTlRFWFRfSU5fTElTVDoKKwkJaWYgbGVuKGIpID4gMCB7CisJCQlzd2l0Y2ggYlswXSB7CisJCQljYXNlIEpTT05fUkJSQUNLRVRbMF06CisJCQkJcmV0dXJuIG5pbAorCQkJY2FzZSBKU09OX0NPTU1BWzBdOgorCQkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCQlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJcmV0dXJuIG5pbAorCQkJZGVmYXVsdDoKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwiXVwiIG9yIFwiLFwiIGluIGxpc3QgY29udGV4dCwgYnV0IGZvdW5kIFwiJXNcIiIsIHN0cmluZyhiKSkKKwkJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQl9CisJCWJyZWFrCisJY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCWlmIGxlbihiKSA+IDAgeworCQkJc3dpdGNoIGJbMF0geworCQkJY2FzZSBKU09OX1JCUkFDRVswXToKKwkJCQlyZXR1cm4gbmlsCisJCQljYXNlIEpTT05fQ09NTUFbMF06CisJCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJCWlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJCX0KKwkJCQlyZXR1cm4gbmlsCisJCQlkZWZhdWx0OgorCQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgXCJ9XCIgb3IgXCIsXCIgaW4gb2JqZWN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiVzXCIiLCBzdHJpbmcoYikpCisJCQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJfQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6CisJCWlmIGxlbihiKSA+IDAgeworCQkJc3dpdGNoIGJbMF0geworCQkJY2FzZSBKU09OX0NPTE9OWzBdOgorCQkJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwkJCQlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJcmV0dXJuIG5pbAorCQkJZGVmYXVsdDoKKwkJCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwiOlwiIGluIG9iamVjdCBjb250ZXh0LCBidXQgZm91bmQgXCIlc1wiIiwgc3RyaW5nKGIpKQorCQkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCX0KKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVBvc3RWYWx1ZSgpIGVycm9yIHsKKwlpZiBlIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pCisJc3dpdGNoIGN4dCB7CisJY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gcC5wYXJzZUNvbnRleHRTdGFja1s6bGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdCisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX0xJU1QpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6CisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUpKQorCQlicmVhaworCWNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6CisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwkJcC5wYXJzZUNvbnRleHRTdGFjayA9IGFwcGVuZChwLnBhcnNlQ29udGV4dFN0YWNrLCBpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZKSkKKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCkgZXJyb3IgeworCWZvciB7CisJCWIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQorCQlpZiBsZW4oYikgPCAxIHsKKwkJCXJldHVybiBuaWwKKwkJfQorCQlzd2l0Y2ggYlswXSB7CisJCWNhc2UgJyAnLCAnXHInLCAnXG4nLCAnXHQnOgorCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJY29udGludWUKKwkJZGVmYXVsdDoKKwkJCWJyZWFrCisJCX0KKwkJYnJlYWsKKwl9CisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVN0cmluZ0JvZHkoKSAoc3RyaW5nLCBlcnJvcikgeworCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUVVPVEUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJbCA6PSBsZW4obGluZSkKKwkvLyBjb3VudCBudW1iZXIgb2YgZXNjYXBlcyB0byBzZWUgaWYgd2UgbmVlZCB0byBrZWVwIGdvaW5nCisJaSA6PSAxCisJZm9yIDsgaSA8IGw7IGkrKyB7CisJCWlmIGxpbmVbbC1pLTFdICE9ICdcXCcgeworCQkJYnJlYWsKKwkJfQorCX0KKwlpZiBpJjB4MDEgPT0gMSB7CisJCXYsIG9rIDo9IGpzb25VbnF1b3RlKHN0cmluZyhKU09OX1FVT1RFKSArIGxpbmUpCisJCWlmICFvayB7CisJCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCX0KKwkJcmV0dXJuIHYsIG5pbAorCX0KKwlzLCBlcnIgOj0gcC5QYXJzZVF1b3RlZFN0cmluZ0JvZHkoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCXN0ciA6PSBzdHJpbmcoSlNPTl9RVU9URSkgKyBsaW5lICsgcworCXYsIG9rIDo9IGpzb25VbnF1b3RlKHN0cikKKwlpZiAhb2sgeworCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBhcyBKU09OIHN0cmluZyAlcyIsIHN0cikKKwkJcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCXJldHVybiB2LCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkgKHN0cmluZywgZXJyb3IpIHsKKwlsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1FVT1RFKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJfQorCWwgOj0gbGVuKGxpbmUpCisJLy8gY291bnQgbnVtYmVyIG9mIGVzY2FwZXMgdG8gc2VlIGlmIHdlIG5lZWQgdG8ga2VlcCBnb2luZworCWkgOj0gMQorCWZvciA7IGkgPCBsOyBpKysgeworCQlpZiBsaW5lW2wtaS0xXSAhPSAnXFwnIHsKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgaSYweDAxID09IDEgeworCQlyZXR1cm4gbGluZSwgbmlsCisJfQorCXMsIGVyciA6PSBwLlBhcnNlUXVvdGVkU3RyaW5nQm9keSgpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJdiA6PSBsaW5lICsgcworCXJldHVybiB2LCBuaWwKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpIChbXWJ5dGUsIGVycm9yKSB7CisJbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRCeXRlcyhKU09OX1FVT1RFKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbGluZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJbGluZTIgOj0gbGluZVswIDogbGVuKGxpbmUpLTFdCisJbCA6PSBsZW4obGluZTIpCisJaWYgKGwgJSA0KSAhPSAwIHsKKwkJcGFkIDo9IDQgLSAobCAlIDQpCisJCWZpbGwgOj0gWy4uLl1ieXRleyc9JywgJz0nLCAnPSd9CisJCWxpbmUyID0gYXBwZW5kKGxpbmUyLCBmaWxsWzpwYWRdLi4uKQorCQlsID0gbGVuKGxpbmUyKQorCX0KKwlvdXRwdXQgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5EZWNvZGVkTGVuKGwpKQorCW4sIGVyciA6PSBiYXNlNjQuU3RkRW5jb2RpbmcuRGVjb2RlKG91dHB1dCwgbGluZTIpCisJcmV0dXJuIG91dHB1dFswOm5dLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUk2NCgpIChpbnQ2NCwgYm9vbCwgZXJyb3IpIHsKKwlpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZmFsc2UsIGVycgorCX0KKwl2YXIgdmFsdWUgaW50NjQKKwl2YXIgaXNudWxsIGJvb2wKKwlpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXAucmVhZGVyLlJlYWQobWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKSkKKwkJaXNudWxsID0gdHJ1ZQorCX0gZWxzZSB7CisJCW51bSwgZXJyIDo9IHAucmVhZE51bWVyaWMoKQorCQlpc251bGwgPSAobnVtID09IG5pbCkKKwkJaWYgIWlzbnVsbCB7CisJCQl2YWx1ZSA9IG51bS5JbnQ2NCgpCisJCX0KKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgZXJyCisJCX0KKwl9CisJcmV0dXJuIHZhbHVlLCBpc251bGwsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUY2NCgpIChmbG9hdDY0LCBib29sLCBlcnJvcikgeworCWlmIGVyciA6PSBwLlBhcnNlUHJlVmFsdWUoKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBmYWxzZSwgZXJyCisJfQorCXZhciB2YWx1ZSBmbG9hdDY0CisJdmFyIGlzbnVsbCBib29sCisJaWYgcC5zYWZlUGVla0NvbnRhaW5zKEpTT05fTlVMTCkgeworCQlwLnJlYWRlci5SZWFkKG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkpCisJCWlzbnVsbCA9IHRydWUKKwl9IGVsc2UgeworCQludW0sIGVyciA6PSBwLnJlYWROdW1lcmljKCkKKwkJaXNudWxsID0gKG51bSA9PSBuaWwpCisJCWlmICFpc251bGwgeworCQkJdmFsdWUgPSBudW0uRmxvYXQ2NCgpCisJCX0KKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gdmFsdWUsIGlzbnVsbCwgZXJyCisJCX0KKwl9CisJcmV0dXJuIHZhbHVlLCBpc251bGwsIHAuUGFyc2VQb3N0VmFsdWUoKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZU9iamVjdFN0YXJ0KCkgKGJvb2wsIGVycm9yKSB7CisJaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnIKKwl9CisJdmFyIGIgW11ieXRlCisJYiwgZXJyIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlLCBlcnIKKwl9CisJaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fTEJSQUNFWzBdIHsKKwkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQlwLnBhcnNlQ29udGV4dFN0YWNrID0gYXBwZW5kKHAucGFyc2VDb250ZXh0U3RhY2ssIGludChfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QpKQorCQlyZXR1cm4gZmFsc2UsIG5pbAorCX0gZWxzZSBpZiBwLnNhZmVQZWVrQ29udGFpbnMoSlNPTl9OVUxMKSB7CisJCXJldHVybiB0cnVlLCBuaWwKKwl9CisJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCAneycgb3IgbnVsbCwgYnV0IGZvdW5kICclcyciLCBzdHJpbmcoYikpCisJcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlT2JqZWN0RW5kKCkgZXJyb3IgeworCWlmIGlzTnVsbCwgZXJyIDo9IHAucmVhZElmTnVsbCgpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pCisJaWYgKGN4dCAhPSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QpICYmIChjeHQgIT0gX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZKSB7CisJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIE9iamVjdCBDb250ZXh0LCBidXQgbm90IGluIE9iamVjdCBDb250ZXh0ICglZCkiLCBjeHQpCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUkJSQUNFWzBdKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKGVycikKKwl9CisJZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7CisJCXN3aXRjaCBjaGFyIHsKKwkJZGVmYXVsdDoKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBvYmplY3QgXCJ9XCIsIGJ1dCBmb3VuZDogXCIlc1wiIiwgbGluZSkKKwkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCWNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnLCAnfSc6CisJCQlicmVhaworCQl9CisJfQorCXAucGFyc2VDb250ZXh0U3RhY2sgPSBwLnBhcnNlQ29udGV4dFN0YWNrWzpsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0KKwlyZXR1cm4gcC5QYXJzZVBvc3RWYWx1ZSgpCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlTGlzdEJlZ2luKCkgKGlzTnVsbCBib29sLCBlcnIgZXJyb3IpIHsKKwlpZiBlIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZQorCX0KKwl2YXIgYiBbXWJ5dGUKKwliLCBlcnIgPSBwLnJlYWRlci5QZWVrKDEpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBmYWxzZSwgZXJyCisJfQorCWlmIGxlbihiKSA+PSAxICYmIGJbMF0gPT0gSlNPTl9MQlJBQ0tFVFswXSB7CisJCXAucGFyc2VDb250ZXh0U3RhY2sgPSBhcHBlbmQocC5wYXJzZUNvbnRleHRTdGFjaywgaW50KF9DT05URVhUX0lOX0xJU1RfRklSU1QpKQorCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCWlzTnVsbCA9IGZhbHNlCisJfSBlbHNlIGlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJaXNOdWxsID0gdHJ1ZQorCX0gZWxzZSB7CisJCWVyciA9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIFwibnVsbFwiIG9yIFwiW1wiLCByZWNlaXZlZCAlcSIsIGIpCisJfQorCXJldHVybiBpc051bGwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyKQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUVsZW1MaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIGVycm9yKSB7CisJaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKKwkJcmV0dXJuIFZPSUQsIDAsIGUKKwl9CisJYkVsZW1UeXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCisJZWxlbVR5cGUgPSBUVHlwZShiRWxlbVR5cGUpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyCisJfQorCW5TaXplLCBlcnIyIDo9IHAuUmVhZEk2NCgpCisJc2l6ZSA9IGludChuU2l6ZSkKKwlyZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycjIKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VMaXN0RW5kKCkgZXJyb3IgeworCWlmIGlzTnVsbCwgZXJyIDo9IHAucmVhZElmTnVsbCgpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJY3h0IDo9IF9QYXJzZUNvbnRleHQocC5wYXJzZUNvbnRleHRTdGFja1tsZW4ocC5wYXJzZUNvbnRleHRTdGFjayktMV0pCisJaWYgY3h0ICE9IF9DT05URVhUX0lOX0xJU1QgeworCQllIDo9IGZtdC5FcnJvcmYoIkV4cGVjdGVkIHRvIGJlIGluIHRoZSBMaXN0IENvbnRleHQsIGJ1dCBub3QgaW4gTGlzdCBDb250ZXh0ICglZCkiLCBjeHQpCisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJfQorCWxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUkJSQUNLRVRbMF0pCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQorCX0KKwlmb3IgXywgY2hhciA6PSByYW5nZSBsaW5lIHsKKwkJc3dpdGNoIGNoYXIgeworCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RpbmcgZW5kIG9mIGxpc3QgXCJdXCIsIGJ1dCBmb3VuZDogXCIldlwiIiwgbGluZSkKKwkJCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCWNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnLCBydW5lKEpTT05fUkJSQUNLRVRbMF0pOgorCQkJYnJlYWsKKwkJfQorCX0KKwlwLnBhcnNlQ29udGV4dFN0YWNrID0gcC5wYXJzZUNvbnRleHRTdGFja1s6bGVuKHAucGFyc2VDb250ZXh0U3RhY2spLTFdCisJaWYgX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrW2xlbihwLnBhcnNlQ29udGV4dFN0YWNrKS0xXSkgPT0gX0NPTlRFWFRfSU5fVE9QTEVWRUwgeworCQlyZXR1cm4gbmlsCisJfQorCXJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZFNpbmdsZVZhbHVlKCkgKGludGVyZmFjZXt9LCBUVHlwZSwgZXJyb3IpIHsKKwllIDo9IHAucmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpCisJaWYgZSAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwl9CisJYiwgZSA6PSBwLnJlYWRlci5QZWVrKDEpCisJaWYgbGVuKGIpID4gMCB7CisJCWMgOj0gYlswXQorCQlzd2l0Y2ggYyB7CisJCWNhc2UgSlNPTl9OVUxMWzBdOgorCQkJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9OVUxMKSkKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWYpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQl9CisJCQlpZiBzdHJpbmcoSlNPTl9OVUxMKSAhPSBzdHJpbmcoYnVmKSB7CisJCQkJZSA9IG1pc21hdGNoKHN0cmluZyhKU09OX05VTEwpLCBzdHJpbmcoYnVmKSkKKwkJCQlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQl9CisJCQlyZXR1cm4gbmlsLCBWT0lELCBuaWwKKwkJY2FzZSBKU09OX1FVT1RFOgorCQkJcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJdiwgZSA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCisJCQlpZiBlICE9IG5pbCB7CisJCQkJcmV0dXJuIHYsIFVURjgsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQkJfQorCQkJaWYgdiA9PSBKU09OX0lORklOSVRZIHsKKwkJCQlyZXR1cm4gSU5GSU5JVFksIERPVUJMRSwgbmlsCisJCQl9IGVsc2UgaWYgdiA9PSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKKwkJCQlyZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFksIERPVUJMRSwgbmlsCisJCQl9IGVsc2UgaWYgdiA9PSBKU09OX05BTiB7CisJCQkJcmV0dXJuIE5BTiwgRE9VQkxFLCBuaWwKKwkJCX0KKwkJCXJldHVybiB2LCBVVEY4LCBuaWwKKwkJY2FzZSBKU09OX1RSVUVbMF06CisJCQlidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX1RSVUUpKQorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKKwkJCWlmIGUgIT0gbmlsIHsKKwkJCQlyZXR1cm4gdHJ1ZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQl9CisJCQlpZiBzdHJpbmcoSlNPTl9UUlVFKSAhPSBzdHJpbmcoYnVmKSB7CisJCQkJZSA6PSBtaXNtYXRjaChzdHJpbmcoSlNPTl9UUlVFKSwgc3RyaW5nKGJ1ZikpCisJCQkJcmV0dXJuIHRydWUsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCXJldHVybiB0cnVlLCBCT09MLCBuaWwKKwkJY2FzZSBKU09OX0ZBTFNFWzBdOgorCQkJYnVmIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9GQUxTRSkpCisJCQlfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmKQorCQkJaWYgZSAhPSBuaWwgeworCQkJCXJldHVybiBmYWxzZSwgQk9PTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQl9CisJCQlpZiBzdHJpbmcoSlNPTl9GQUxTRSkgIT0gc3RyaW5nKGJ1ZikgeworCQkJCWUgOj0gbWlzbWF0Y2goc3RyaW5nKEpTT05fRkFMU0UpLCBzdHJpbmcoYnVmKSkKKwkJCQlyZXR1cm4gZmFsc2UsIEJPT0wsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCXJldHVybiBmYWxzZSwgQk9PTCwgbmlsCisJCWNhc2UgSlNPTl9MQlJBQ0tFVFswXToKKwkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZEJ5dGUoKQorCQkJcmV0dXJuIG1ha2UoW11pbnRlcmZhY2V7fSwgMCksIExJU1QsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlKQorCQljYXNlIEpTT05fTEJSQUNFWzBdOgorCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQlyZXR1cm4gbWFrZShtYXBbc3RyaW5nXWludGVyZmFjZXt9KSwgU1RSVUNULCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJY2FzZSAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdlJywgJ0UnLCAnLicsICcrJywgJy0nLCBKU09OX0lORklOSVRZWzBdLCBKU09OX05BTlswXToKKwkJCS8vIGFzc3VtZSBudW1lcmljCisJCQl2LCBlIDo9IHAucmVhZE51bWVyaWMoKQorCQkJcmV0dXJuIHYsIERPVUJMRSwgZQorCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJFeHBlY3RlZCBlbGVtZW50IGluIGxpc3QgYnV0IGZvdW5kICclcycgd2hpbGUgcGFyc2luZyBKU09OLiIsIHN0cmluZyhjKSkKKwkJCXJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJfQorCX0KKwllID0gZm10LkVycm9yZigiQ2Fubm90IHJlYWQgYSBzaW5nbGUgZWxlbWVudCB3aGlsZSBwYXJzaW5nIEpTT04uIikKKwlyZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisKK30KKworZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZElmTnVsbCgpIChib29sLCBlcnJvcikgeworCWNvbnQgOj0gdHJ1ZQorCWZvciBjb250IHsKKwkJYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCisJCWlmIGxlbihiKSA8IDEgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfQorCQlzd2l0Y2ggYlswXSB7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2UsIG5pbAorCQljYXNlIEpTT05fTlVMTFswXToKKwkJCWNvbnQgPSBmYWxzZQorCQkJYnJlYWsKKwkJY2FzZSAnICcsICdcbicsICdccicsICdcdCc6CisJCQlwLnJlYWRlci5SZWFkQnl0ZSgpCisJCQlicmVhaworCQl9CisJfQorCWlmIHAuc2FmZVBlZWtDb250YWlucyhKU09OX05VTEwpIHsKKwkJcC5yZWFkZXIuUmVhZChtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTlVMTCkpKQorCQlyZXR1cm4gdHJ1ZSwgbmlsCisJfQorCXJldHVybiBmYWxzZSwgbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWRRdW90ZUlmTmV4dCgpIHsKKwliLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKKwlpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9RVU9URSB7CisJCXAucmVhZGVyLlJlYWRCeXRlKCkKKwl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlYWROdW1lcmljKCkgKE51bWVyaWMsIGVycm9yKSB7CisJaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCkKKwlpZiBpc051bGwgfHwgZXJyICE9IG5pbCB7CisJCXJldHVybiBOVU1FUklDX05VTEwsIGVycgorCX0KKwloYXNEZWNpbWFsUG9pbnQgOj0gZmFsc2UKKwluZXh0Q2FuQmVTaWduIDo9IHRydWUKKwloYXNFIDo9IGZhbHNlCisJTUFYX0xFTiA6PSA0MAorCWJ1ZiA6PSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIE1BWF9MRU4pKQorCWNvbnRpbnVlRm9yIDo9IHRydWUKKwlpblF1b3RlcyA6PSBmYWxzZQorCWZvciBjb250aW51ZUZvciB7CisJCWMsIGVyciA6PSBwLnJlYWRlci5SZWFkQnl0ZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJaWYgZXJyID09IGlvLkVPRiB7CisJCQkJYnJlYWsKKwkJCX0KKwkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCisJCX0KKwkJc3dpdGNoIGMgeworCQljYXNlICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JzoKKwkJCWJ1Zi5Xcml0ZUJ5dGUoYykKKwkJCW5leHRDYW5CZVNpZ24gPSBmYWxzZQorCQljYXNlICcuJzoKKwkJCWlmIGhhc0RlY2ltYWxQb2ludCB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHdpdGggbXVsdGlwbGUgZGVjaW1hbCBwb2ludHMgJyVzLiciLCBidWYuU3RyaW5nKCkpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQkJaWYgaGFzRSB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHdpdGggZGVjaW1hbCBwb2ludHMgaW4gdGhlIGV4cG9uZW50ICclcy4nIiwgYnVmLlN0cmluZygpKQorCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCWJ1Zi5Xcml0ZUJ5dGUoYykKKwkJCWhhc0RlY2ltYWxQb2ludCwgbmV4dENhbkJlU2lnbiA9IHRydWUsIGZhbHNlCisJCWNhc2UgJ2UnLCAnRSc6CisJCQlpZiBoYXNFIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgd2l0aCBtdWx0aXBsZSBleHBvbmVudHMgJyVzJWMnIiwgYnVmLlN0cmluZygpLCBjKQorCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCWJ1Zi5Xcml0ZUJ5dGUoYykKKwkJCWhhc0UsIG5leHRDYW5CZVNpZ24gPSB0cnVlLCB0cnVlCisJCWNhc2UgJy0nLCAnKyc6CisJCQlpZiAhbmV4dENhbkJlU2lnbiB7CisJCQkJZSA6PSBmbXQuRXJyb3JmKCJOZWdhdGl2ZSBzaWduIHdpdGhpbiBudW1iZXIiKQorCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCX0KKwkJCWJ1Zi5Xcml0ZUJ5dGUoYykKKwkJCW5leHRDYW5CZVNpZ24gPSBmYWxzZQorCQljYXNlICcgJywgMCwgJ1x0JywgJ1xuJywgJ1xyJywgSlNPTl9SQlJBQ0VbMF0sIEpTT05fUkJSQUNLRVRbMF0sIEpTT05fQ09NTUFbMF0sIEpTT05fQ09MT05bMF06CisJCQlwLnJlYWRlci5VbnJlYWRCeXRlKCkKKwkJCWNvbnRpbnVlRm9yID0gZmFsc2UKKwkJY2FzZSBKU09OX05BTlswXToKKwkJCWlmIGJ1Zi5MZW4oKSA9PSAwIHsKKwkJCQlidWZmZXIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05BTikpCisJCQkJYnVmZmVyWzBdID0gYworCQkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWZmZXJbMTpdKQorCQkJCWlmIGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCWlmIEpTT05fTkFOICE9IHN0cmluZyhidWZmZXIpIHsKKwkJCQkJZSA6PSBtaXNtYXRjaChKU09OX05BTiwgc3RyaW5nKGJ1ZmZlcikpCisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCQl9CisJCQkJaWYgaW5RdW90ZXMgeworCQkJCQlwLnJlYWRRdW90ZUlmTmV4dCgpCisJCQkJfQorCQkJCXJldHVybiBOQU4sIG5pbAorCQkJfSBlbHNlIHsKKwkJCQllIDo9IGZtdC5FcnJvcmYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyIsIGMpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQljYXNlIEpTT05fSU5GSU5JVFlbMF06CisJCQlpZiBidWYuTGVuKCkgPT0gMCB8fCAoYnVmLkxlbigpID09IDEgJiYgYnVmLkJ5dGVzKClbMF0gPT0gJysnKSB7CisJCQkJYnVmZmVyIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9JTkZJTklUWSkpCisJCQkJYnVmZmVyWzBdID0gYworCQkJCV8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWZmZXJbMTpdKQorCQkJCWlmIGUgIT0gbmlsIHsKKwkJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCisJCQkJfQorCQkJCWlmIEpTT05fSU5GSU5JVFkgIT0gc3RyaW5nKGJ1ZmZlcikgeworCQkJCQllIDo9IG1pc21hdGNoKEpTT05fSU5GSU5JVFksIHN0cmluZyhidWZmZXIpKQorCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZShJTlZBTElEX0RBVEEsIGUpCisJCQkJfQorCQkJCWlmIGluUXVvdGVzIHsKKwkJCQkJcC5yZWFkUXVvdGVJZk5leHQoKQorCQkJCX0KKwkJCQlyZXR1cm4gSU5GSU5JVFksIG5pbAorCQkJfSBlbHNlIGlmIGJ1Zi5MZW4oKSA9PSAxICYmIGJ1Zi5CeXRlcygpWzBdID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFlbMF0geworCQkJCWJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQorCQkJCWJ1ZmZlclswXSA9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFlbMF0KKwkJCQlidWZmZXJbMV0gPSBjCisJCQkJXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZmZlclsyOl0pCisJCQkJaWYgZSAhPSBuaWwgeworCQkJCQlyZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZSkKKwkJCQl9CisJCQkJaWYgSlNPTl9ORUdBVElWRV9JTkZJTklUWSAhPSBzdHJpbmcoYnVmZmVyKSB7CisJCQkJCWUgOj0gbWlzbWF0Y2goSlNPTl9ORUdBVElWRV9JTkZJTklUWSwgc3RyaW5nKGJ1ZmZlcikpCisJCQkJCXJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZSkKKwkJCQl9CisJCQkJaWYgaW5RdW90ZXMgeworCQkJCQlwLnJlYWRRdW90ZUlmTmV4dCgpCisJCQkJfQorCQkJCXJldHVybiBORUdBVElWRV9JTkZJTklUWSwgbmlsCisJCQl9IGVsc2UgeworCQkJCWUgOj0gZm10LkVycm9yZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciBzdGFydGluZyB3aXRoIGNoYXJhY3RlciAnJWMnIGR1ZSB0byBleGlzdGluZyBidWZmZXIgJXMiLCBjLCBidWYuU3RyaW5nKCkpCisJCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQkJfQorCQljYXNlIEpTT05fUVVPVEU6CisJCQlpZiAhaW5RdW90ZXMgeworCQkJCWluUXVvdGVzID0gdHJ1ZQorCQkJfSBlbHNlIHsKKwkJCQlicmVhaworCQkJfQorCQlkZWZhdWx0OgorCQkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYyciLCBjKQorCQkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCQl9CisJfQorCWlmIGJ1Zi5MZW4oKSA9PSAwIHsKKwkJZSA6PSBmbXQuRXJyb3JmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIGZyb20gZW1wdHkgc3RyaW5nICcnIikKKwkJcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQorCX0KKwlyZXR1cm4gTmV3TnVtZXJpY0Zyb21KU09OU3RyaW5nKGJ1Zi5TdHJpbmcoKSwgZmFsc2UpLCBuaWwKK30KKworLy8gU2FmZWx5IHBlZWtzIGludG8gdGhlIGJ1ZmZlciwgcmVhZGluZyBvbmx5IHdoYXQgaXMgbmVjZXNzYXJ5CitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBzYWZlUGVla0NvbnRhaW5zKGIgW11ieXRlKSBib29sIHsKKwlmb3IgaSA6PSAwOyBpIDwgbGVuKGIpOyBpKysgeworCQlhLCBfIDo9IHAucmVhZGVyLlBlZWsoaSArIDEpCisJCWlmIGxlbihhKSA9PSAwIHx8IGFbaV0gIT0gYltpXSB7CisJCQlyZXR1cm4gZmFsc2UKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZQorfQorCisvLyBSZXNldCB0aGUgY29udGV4dCBzdGFjayB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIHJlc2V0Q29udGV4dFN0YWNrKCkgeworCXAucGFyc2VDb250ZXh0U3RhY2sgPSBbXWludHtpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpfQorCXAuZHVtcENvbnRleHQgPSBbXWludHtpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpfQorfQorCitmdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSB3cml0ZShiIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwluLCBlcnIgOj0gcC53cml0ZXIuV3JpdGUoYikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcC53cml0ZXIuUmVzZXQocC50cmFucykgLy8gVEhSSUZULTM3MzUKKwl9CisJcmV0dXJuIG4sIGVycgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTgwODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvYmFzZTY0IgorCSJlbmNvZGluZy9qc29uIgorCSJmbXQiCisJIm1hdGgiCisJInN0cmNvbnYiCisJInN0cmluZ3MiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQm9vbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJib29sZWFuIgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVCb29sKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGZhbHNlCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJvb2xlYW4iCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJaWYgdmFsdWUgeworCQkJdHJhbnMuV3JpdGUoSlNPTl9UUlVFKQorCQl9IGVsc2UgeworCQkJdHJhbnMuV3JpdGUoSlNPTl9GQUxTRSkKKwkJfQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEJvb2woKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImJ5dGUiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50OCgwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJieXRlIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRCeXRlKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sSTE2KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDE2IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlSTE2KHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJfQorCQl2IDo9IGludDE2KDApCisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MTYiCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDE2X1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRJMTYoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwkJdHJhbnMuQ2xvc2UoKQorCX0KK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xJMzIodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAiaW50MzIiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMzIodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQl9CisJCXYgOj0gaW50MzIoMCkKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEkzMigpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTMyTnVsbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRJMzIoKQorCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gMCB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQ2NCIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIElOVDY0X1ZBTFVFUyB7CisJCWlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCWlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCX0KKwkJdiA6PSBpbnQ2NCgwKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTY0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImludDY0IgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgeworCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQl2LCBlIDo9IHAuUmVhZEk2NCgpCisJCWlmIGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQl9CisJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCQl0cmFucy5DbG9zZSgpCisJfQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sSTY0TnVsbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJpbnQzMiIKKwl2YWx1ZSA6PSAibnVsbCIKKworCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlzIDo9IHRyYW5zLlN0cmluZygpCisJdiwgZSA6PSBwLlJlYWRJNjQoKQorCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gMCB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJkb3VibGUiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05BTikgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pKQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCisJCQl9CisJCQl2IDo9IGZsb2F0NjQoMCkKKwkJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKKwkJCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImRvdWJsZSIKKwlmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7CisJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJCW4gOj0gTmV3TnVtZXJpY0Zyb21Eb3VibGUodmFsdWUpCisJCXRyYW5zLldyaXRlU3RyaW5nKG4uU3RyaW5nKCkpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQorCQlzIDo9IHRyYW5zLlN0cmluZygpCisJCXYsIGUgOj0gcC5SZWFkRG91YmxlKCkKKwkJaWYgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKKwkJCWlmICFtYXRoLklzSW5mKHYsIDEpIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7CisJCQlpZiAhbWF0aC5Jc0luZih2LCAtMSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgIW1hdGguSXNOYU4odikgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CisKK2Z1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gInN0cmluZyIKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJZm9yIF8sIHZhbHVlIDo9IHJhbmdlIFNUUklOR19WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVTdHJpbmcodmFsdWUpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJcyA6PSB0cmFucy5TdHJpbmcoKQorCQlpZiBzWzBdICE9ICciJyB8fCBzW2xlbihzKS0xXSAhPSAnIicgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJyV2Jywgd3JvdGUgJyV2JywgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIGZtdC5TcHJpbnQoIlwiIiwgdmFsdWUsICJcIiIpKQorCQl9CisJCXYgOj0gbmV3KHN0cmluZykKKwkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdik7IGVyciAhPSBuaWwgfHwgKnYgIT0gdmFsdWUgeworCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYpCisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CisKK2Z1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xTdHJpbmcodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic3RyaW5nIgorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKKwkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwkJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKHZhbHVlKSkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwkJdiwgZSA6PSBwLlJlYWRTdHJpbmcoKQorCQlpZiBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJCX0KKwkJaWYgdiAhPSB2YWx1ZSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwkJfQorCQl2MSA6PSBuZXcoc3RyaW5nKQorCQlpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IHZhbHVlIHsKKwkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKKwkJfQorCQl0cmFucy5SZXNldCgpCisJCXRyYW5zLkNsb3NlKCkKKwl9Cit9CitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sU3RyaW5nTnVsbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJzdHJpbmciCisJdmFsdWUgOj0gIm51bGwiCisKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgdiAhPSAiIiB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKKwliNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCisJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCisJYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJaWYgZSA6PSBwLldyaXRlQmluYXJ5KHZhbHVlKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQorCX0KKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCXMgOj0gdHJhbnMuU3RyaW5nKCkKKwlpZiBzICE9IGZtdC5TcHJpbnQoIlwiIiwgYjY0U3RyaW5nLCAiXCIiKSB7CisJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2XG4gIHdyb3RlOiAldlxuZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsICJcIiIrYjY0U3RyaW5nKyJcIiIpCisJfQorCXYxIDo9IG5ldyhzdHJpbmcpCisJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgeworCQl0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKKwliNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCisJYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCisJYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKKwlpZiBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwl9CisJaWYgbGVuKHYpICE9IGxlbih2YWx1ZSkgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSBsZW5ndGggJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQgbGVuZ3RoOiAldiIsIHRoZXR5cGUsIGxlbih2YWx1ZSksIHMsIGxlbih2KSkKKwl9CisJZm9yIGkgOj0gMDsgaSA8IGxlbih2KTsgaSsrIHsKKwkJaWYgdltpXSAhPSB2YWx1ZVtpXSB7CisJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAlZCB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCBpLCB2YWx1ZVtpXSwgcywgdltpXSkKKwkJfQorCX0KKwl2MSA6PSBuZXcoc3RyaW5nKQorCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKKwkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQorCX0KKwl0cmFucy5SZXNldCgpCisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5TnVsbCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJiaW5hcnkiCisJdmFsdWUgOj0gIm51bGwiCisKKwl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCisJdHJhbnMuV3JpdGVTdHJpbmcodmFsdWUpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJcyA6PSB0cmFucy5TdHJpbmcoKQorCWIsIGUgOj0gcC5SZWFkQmluYXJ5KCkKKwl2IDo9IHN0cmluZyhiKQorCisJaWYgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCisJfQorCWlmIHYgIT0gIiIgeworCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKKwl9CisJdHJhbnMuUmVzZXQoKQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xMaXN0KHQgKnRlc3RpbmcuVCkgeworCXRoZXR5cGUgOj0gImxpc3QiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVMaXN0QmVnaW4oVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlTGlzdEVuZCgpCisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLkVycm9yKCkpCisJfQorCXN0ciA6PSB0cmFucy5TdHJpbmcoKQorCXN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCisJZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzdHIpLCBzdHIxKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiVW5hYmxlIHRvIGRlY29kZSAlcywgd3JvdGU6ICVzIiwgdGhldHlwZSwgc3RyKQorCX0KKwlsIDo9ICpzdHIxCisJaWYgbGVuKGwpIDwgMiB7CisJCXQuRmF0YWxmKCJMaXN0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKKwl9CisJaWYgaW50KGxbMF0uKGZsb2F0NjQpKSAhPSBET1VCTEUgeworCQl0LkZhdGFsKCJJbnZhbGlkIHR5cGUgZm9yIGxpc3QsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCisJfQorCWlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIGxpc3QsIGV4cGVjdGVkOiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXM6ICIsIGxbMV0pCisJfQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJcyA6PSBsW2srMl0KKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgeworCQkJaWYgcy4oc3RyaW5nKSAhPSBKU09OX05BTiB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgcy4oZmxvYXQ2NCkgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKKwkJCX0KKwkJfQorCQl0cmFucy5SZXNldCgpCisJfQorCXRyYW5zLkNsb3NlKCkKK30KKworZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTZXQodCAqdGVzdGluZy5UKSB7CisJdGhldHlwZSA6PSAic2V0IgorCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQorCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKKwlwLldyaXRlU2V0QmVnaW4oVFR5cGUoRE9VQkxFKSwgbGVuKERPVUJMRV9WQUxVRVMpKQorCWZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgeworCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlU2V0RW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJc3RyMSA6PSBuZXcoW11pbnRlcmZhY2V7fSkKKwllcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCisJfQorCWwgOj0gKnN0cjEKKwlpZiBsZW4obCkgPCAyIHsKKwkJdC5GYXRhbGYoIlNldCBtdXN0IGJlIGF0IGxlYXN0IG9mIGxlbmd0aCB0d28gdG8gaW5jbHVkZSBtZXRhZGF0YSIpCisJfQorCWlmIGludChsWzBdLihmbG9hdDY0KSkgIT0gRE9VQkxFIHsKKwkJdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCisJfQorCWlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiSW52YWxpZCBsZW5ndGggZm9yIHNldCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKKwl9CisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlzIDo9IGxbaysyXQorCQlpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywganNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpLCBzdHIpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7CisJCQlpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pLCBzdHIpCisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7CisJCQkJdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJyIsIHRoZXR5cGUsIHZhbHVlLCBzKQorCQkJfQorCQl9CisJCXRyYW5zLlJlc2V0KCkKKwl9CisJdHJhbnMuQ2xvc2UoKQorfQorCitmdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbE1hcCh0ICp0ZXN0aW5nLlQpIHsKKwl0aGV0eXBlIDo9ICJtYXAiCisJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQorCXAuV3JpdGVNYXBCZWdpbihUVHlwZShJMzIpLCBUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCisJZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgeworCQlpZiBlIDo9IHAuV3JpdGVJMzIoaW50MzIoaykpOyBlICE9IG5pbCB7CisJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGtleSBpbnQzMiB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZS5FcnJvcigpKQorCQl9CisJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKKwkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgZmxvYXQ2NCB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKKwkJfQorCX0KKwlwLldyaXRlTWFwRW5kKCkKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CisJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKKwl9CisJc3RyIDo9IHRyYW5zLlN0cmluZygpCisJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKKwkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAldiwgaW4gZ286ICV2IiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCX0KKwlsIDo9IHN0cmluZ3MuU3BsaXQoc3RyWzE6bGVuKHN0ciktMV0sICIsIikKKwlpZiBsZW4obCkgPCAzIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbGlzdCBvZiBhdCBsZWFzdCBsZW5ndGggMyBmb3IgbWFwIGZvciBtZXRhZGF0YSwgYnV0IHdhcyBvZiBsZW5ndGggIiwgbGVuKGwpKQorCX0KKwlleHBlY3RlZEtleVR5cGUsIF8gOj0gc3RyY29udi5BdG9pKGxbMF0pCisJZXhwZWN0ZWRWYWx1ZVR5cGUsIF8gOj0gc3RyY29udi5BdG9pKGxbMV0pCisJZXhwZWN0ZWRTaXplLCBfIDo9IHN0cmNvbnYuQXRvaShsWzJdKQorCWlmIGV4cGVjdGVkS2V5VHlwZSAhPSBJMzIgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBtYXAga2V5IHR5cGUgIiwgSTMyLCAiLCBidXQgd2FzICIsIGxbMF0pCisJfQorCWlmIGV4cGVjdGVkVmFsdWVUeXBlICE9IERPVUJMRSB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIG1hcCB2YWx1ZSB0eXBlICIsIERPVUJMRSwgIiwgYnV0IHdhcyAiLCBsWzFdKQorCX0KKwlpZiBleHBlY3RlZFNpemUgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHNpemUgb2YgIiwgbGVuKERPVUJMRV9WQUxVRVMpLCAiLCBidXQgd2FzICIsIGxbMl0pCisJfQorCWZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKKwkJc3RyayA6PSBsW2sqMiszXQorCQlzdHJ2IDo9IGxbayoyKzRdCisJCWlrLCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmspCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2LCBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBzdHJrLCBzdHJpbmcoayksIGVyci5FcnJvcigpKQorCQl9CisJCWlmIGlrICE9IGsgeworCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgc3RyaywgaykKKwkJfQorCQlzIDo9IHN0cnYKKwkJaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgeworCQkJaWYgcyAhPSBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkgeworCQkJCXQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9JTkZJTklUWSkpCisJCQl9CisJCX0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7CisJCQlpZiBzICE9IGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKKwkJCX0KKwkJfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKKwkJCWlmIHMgIT0ganNvblF1b3RlKEpTT05fTkFOKSB7CisJCQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBqc29uUXVvdGUoSlNPTl9OQU4pKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXhwZWN0ZWQgOj0gc3RyY29udi5Gb3JtYXRGbG9hdCh2YWx1ZSwgJ2cnLCAxMCwgNjQpCisJCQlpZiBzICE9IGV4cGVjdGVkIHsKKwkJCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZCAldiIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBleHBlY3RlZCkKKwkJCX0KKwkJCXYgOj0gZmxvYXQ2NCgwKQorCQkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgeworCQkJCXQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCisJCQl9CisJCX0KKwkJdHJhbnMuUmVzZXQoKQorCX0KKwl0cmFucy5DbG9zZSgpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzNTgwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJsb2ciCisJInJ1bnRpbWUvZGVidWciCisJInN5bmMiCisJInN5bmMvYXRvbWljIgorKQorCisvKgorICogVGhpcyBpcyBub3QgYSB0eXBpY2FsIFRTaW1wbGVTZXJ2ZXIgYXMgaXQgaXMgbm90IGJsb2NrZWQgYWZ0ZXIgYWNjZXB0IGEgc29ja2V0LgorICogSXQgaXMgbW9yZSBsaWtlIGEgVFRocmVhZGVkU2VydmVyIHRoYXQgY2FuIGhhbmRsZSBkaWZmZXJlbnQgY29ubmVjdGlvbnMgaW4gZGlmZmVyZW50IGdvcm91dGluZXMuCisgKiBUaGlzIHdpbGwgd29yayBpZiBnb2xhbmcgdXNlciBpbXBsZW1lbnRzIGEgY29ubi1wb29sIGxpa2UgdGhpbmcgaW4gY2xpZW50IHNpZGUuCisgKi8KK3R5cGUgVFNpbXBsZVNlcnZlciBzdHJ1Y3QgeworCWNsb3NlZCBpbnQzMgorCXdnICAgICBzeW5jLldhaXRHcm91cAorCW11ICAgICBzeW5jLk11dGV4CisKKwlwcm9jZXNzb3JGYWN0b3J5ICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5CisJc2VydmVyVHJhbnNwb3J0ICAgICAgICBUU2VydmVyVHJhbnNwb3J0CisJaW5wdXRUcmFuc3BvcnRGYWN0b3J5ICBUVHJhbnNwb3J0RmFjdG9yeQorCW91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKKwlpbnB1dFByb3RvY29sRmFjdG9yeSAgIFRQcm90b2NvbEZhY3RvcnkKKwlvdXRwdXRQcm90b2NvbEZhY3RvcnkgIFRQcm90b2NvbEZhY3RvcnkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3RvcnkyKE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCkKK30KKworZnVuYyBOZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5NChOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLAorCQlzZXJ2ZXJUcmFuc3BvcnQsCisJCXRyYW5zcG9ydEZhY3RvcnksCisJCXByb3RvY29sRmFjdG9yeSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlcjYocHJvY2Vzc29yIFRQcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5NihOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLAorCQlzZXJ2ZXJUcmFuc3BvcnQsCisJCWlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKwkJaW5wdXRQcm90b2NvbEZhY3RvcnksCisJCW91dHB1dFByb3RvY29sRmFjdG9yeSwKKwkpCit9CisKK2Z1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3RvcnkyKHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0KSAqVFNpbXBsZVNlcnZlciB7CisJcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5LAorCQlzZXJ2ZXJUcmFuc3BvcnQsCisJCU5ld1RUcmFuc3BvcnRGYWN0b3J5KCksCisJCU5ld1RUcmFuc3BvcnRGYWN0b3J5KCksCisJCU5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJCU5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCksCisJKQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5NChwcm9jZXNzb3JGYWN0b3J5IFRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKKwlyZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCisJCXNlcnZlclRyYW5zcG9ydCwKKwkJdHJhbnNwb3J0RmFjdG9yeSwKKwkJdHJhbnNwb3J0RmFjdG9yeSwKKwkJcHJvdG9jb2xGYWN0b3J5LAorCQlwcm90b2NvbEZhY3RvcnksCisJKQorfQorCitmdW5jIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5IFRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgeworCXJldHVybiAmVFNpbXBsZVNlcnZlcnsKKwkJcHJvY2Vzc29yRmFjdG9yeTogICAgICAgcHJvY2Vzc29yRmFjdG9yeSwKKwkJc2VydmVyVHJhbnNwb3J0OiAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorCQlpbnB1dFRyYW5zcG9ydEZhY3Rvcnk6ICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisJCW91dHB1dFRyYW5zcG9ydEZhY3Rvcnk6IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisJCWlucHV0UHJvdG9jb2xGYWN0b3J5OiAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorCQlvdXRwdXRQcm90b2NvbEZhY3Rvcnk6ICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisJfQorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBQcm9jZXNzb3JGYWN0b3J5KCkgVFByb2Nlc3NvckZhY3RvcnkgeworCXJldHVybiBwLnByb2Nlc3NvckZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgU2VydmVyVHJhbnNwb3J0KCkgVFNlcnZlclRyYW5zcG9ydCB7CisJcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gcC5pbnB1dFRyYW5zcG9ydEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIElucHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuIHAuaW5wdXRQcm90b2NvbEZhY3RvcnkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgT3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeSB7CisJcmV0dXJuIHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIExpc3RlbigpIGVycm9yIHsKKwlyZXR1cm4gcC5zZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCkKK30KKworZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgaW5uZXJBY2NlcHQoKSAoaW50MzIsIGVycm9yKSB7CisJY2xpZW50LCBlcnIgOj0gcC5zZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkKKwlwLm11LkxvY2soKQorCWRlZmVyIHAubXUuVW5sb2NrKCkKKwljbG9zZWQgOj0gYXRvbWljLkxvYWRJbnQzMigmcC5jbG9zZWQpCisJaWYgY2xvc2VkICE9IDAgeworCQlyZXR1cm4gY2xvc2VkLCBuaWwKKwl9CisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiAwLCBlcnIKKwl9CisJaWYgY2xpZW50ICE9IG5pbCB7CisJCXAud2cuQWRkKDEpCisJCWdvIGZ1bmMoKSB7CisJCQlkZWZlciBwLndnLkRvbmUoKQorCQkJaWYgZXJyIDo9IHAucHJvY2Vzc1JlcXVlc3RzKGNsaWVudCk7IGVyciAhPSBuaWwgeworCQkJCWxvZy5QcmludGxuKCJlcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6IiwgZXJyKQorCQkJfQorCQl9KCkKKwl9CisJcmV0dXJuIDAsIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBBY2NlcHRMb29wKCkgZXJyb3IgeworCWZvciB7CisJCWNsb3NlZCwgZXJyIDo9IHAuaW5uZXJBY2NlcHQoKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQlpZiBjbG9zZWQgIT0gMCB7CisJCQlyZXR1cm4gbmlsCisJCX0KKwl9Cit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFNlcnZlKCkgZXJyb3IgeworCWVyciA6PSBwLkxpc3RlbigpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcC5BY2NlcHRMb29wKCkKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFN0b3AoKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJaWYgYXRvbWljLkxvYWRJbnQzMigmcC5jbG9zZWQpICE9IDAgeworCQlyZXR1cm4gbmlsCisJfQorCWF0b21pYy5TdG9yZUludDMyKCZwLmNsb3NlZCwgMSkKKwlwLnNlcnZlclRyYW5zcG9ydC5JbnRlcnJ1cHQoKQorCXAud2cuV2FpdCgpCisJcmV0dXJuIG5pbAorfQorCitmdW5jIChwICpUU2ltcGxlU2VydmVyKSBwcm9jZXNzUmVxdWVzdHMoY2xpZW50IFRUcmFuc3BvcnQpIGVycm9yIHsKKwlwcm9jZXNzb3IgOj0gcC5wcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpCisJaW5wdXRUcmFuc3BvcnQsIGVyciA6PSBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCW91dHB1dFRyYW5zcG9ydCwgZXJyIDo9IHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlucHV0UHJvdG9jb2wgOj0gcC5pbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkKKwlvdXRwdXRQcm90b2NvbCA6PSBwLm91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpCisJZGVmZXIgZnVuYygpIHsKKwkJaWYgZSA6PSByZWNvdmVyKCk7IGUgIT0gbmlsIHsKKwkJCWxvZy5QcmludGYoInBhbmljIGluIHByb2Nlc3NvcjogJXM6ICVzIiwgZSwgZGVidWcuU3RhY2soKSkKKwkJfQorCX0oKQorCisJaWYgaW5wdXRUcmFuc3BvcnQgIT0gbmlsIHsKKwkJZGVmZXIgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKQorCX0KKwlpZiBvdXRwdXRUcmFuc3BvcnQgIT0gbmlsIHsKKwkJZGVmZXIgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCkKKwl9CisJZm9yIHsKKwkJaWYgYXRvbWljLkxvYWRJbnQzMigmcC5jbG9zZWQpICE9IDAgeworCQkJcmV0dXJuIG5pbAorCQl9CisKKwkJb2ssIGVyciA6PSBwcm9jZXNzb3IuUHJvY2VzcyhkZWZhdWx0Q3R4LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkKKwkJaWYgZXJyLCBvayA6PSBlcnIuKFRUcmFuc3BvcnRFeGNlcHRpb24pOyBvayAmJiBlcnIuVHlwZUlkKCkgPT0gRU5EX09GX0ZJTEUgeworCQkJcmV0dXJuIG5pbAorCQl9IGVsc2UgaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJaWYgZXJyLCBvayA6PSBlcnIuKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7IG9rICYmIGVyci5UeXBlSWQoKSA9PSBVTktOT1dOX01FVEhPRCB7CisJCQljb250aW51ZQorCQl9CisJCWlmICFvayB7CisJCQlicmVhaworCQl9CisJfQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNDlhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJImVycm9ycyIKKwkicnVudGltZSIKKykKKwordHlwZSBtb2NrU2VydmVyVHJhbnNwb3J0IHN0cnVjdCB7CisJTGlzdGVuRnVuYyAgICBmdW5jKCkgZXJyb3IKKwlBY2NlcHRGdW5jICAgIGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2VGdW5jICAgICBmdW5jKCkgZXJyb3IKKwlJbnRlcnJ1cHRGdW5jIGZ1bmMoKSBlcnJvcgorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBMaXN0ZW4oKSBlcnJvciB7CisJcmV0dXJuIG0uTGlzdGVuRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBtLkFjY2VwdEZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbS5DbG9zZUZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcmV0dXJuIG0uSW50ZXJydXB0RnVuYygpCit9CisKK3R5cGUgbW9ja1RUcmFuc3BvcnQgc3RydWN0IHsKKwlUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKG0gKm1vY2tUVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgVGVzdE11bHRpcGxlU3RvcCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jIDo9ICZtb2NrUHJvY2Vzc29yeworCQlQcm9jZXNzRnVuYzogZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0sCisJfQorCisJdmFyIGludGVycnVwdENhbGxlZCBib29sCisJYyA6PSBtYWtlKGNoYW4gc3RydWN0e30pCisJdHJhbnMgOj0gJm1vY2tTZXJ2ZXJUcmFuc3BvcnR7CisJCUxpc3RlbkZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUFjY2VwdEZ1bmM6IGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwkJCTwtYworCQkJcmV0dXJuIG5pbCwgbmlsCisJCX0sCisJCUNsb3NlRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCWMgPC0gc3RydWN0e317fQorCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJaW50ZXJydXB0Q2FsbGVkID0gdHJ1ZQorCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJc2Vydi5TdG9wKCkKKwlpZiAhaW50ZXJydXB0Q2FsbGVkIHsKKwkJdC5FcnJvcigiZmlyc3Qgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9CisKKwlzZXJ2ID0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJaW50ZXJydXB0Q2FsbGVkID0gZmFsc2UKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJzZWNvbmQgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9Cit9CisKK2Z1bmMgVGVzdFdhaXRSYWNlKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuICZtb2NrVFRyYW5zcG9ydHt9LCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQorCitmdW5jIFRlc3ROb0hhbmdEdXJpbmdTdG9wRnJvbURhbmdsaW5nTG9ja0FjcXVpcmVEdXJpbmdBY2NlcHRMb29wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygibm8gc2lyIikKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU0Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9zb2NrZXQuZ28KQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkibmV0IgorCSJ0aW1lIgorKQorCit0eXBlIFRTb2NrZXQgc3RydWN0IHsKKwljb25uICAgIG5ldC5Db25uCisJYWRkciAgICBuZXQuQWRkcgorCXRpbWVvdXQgdGltZS5EdXJhdGlvbgorfQorCisvLyBOZXdUU29ja2V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0CisvLworLy8gRXhhbXBsZToKKy8vIAl0cmFucywgZXJyIDo9IHRocmlmdC5OZXdUU29ja2V0KCJsb2NhbGhvc3Q6OTA5MCIpCitmdW5jIE5ld1RTb2NrZXQoaG9zdFBvcnQgc3RyaW5nKSAoKlRTb2NrZXQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RTb2NrZXRUaW1lb3V0KGhvc3RQb3J0LCAwKQorfQorCisvLyBOZXdUU29ja2V0VGltZW91dCBjcmVhdGVzIGEgbmV0LkNvbm4tYmFja2VkIFRUcmFuc3BvcnQsIGdpdmVuIGEgaG9zdCBhbmQgcG9ydAorLy8gaXQgYWxzbyBhY2NlcHRzIGEgdGltZW91dCBhcyBhIHRpbWUuRHVyYXRpb24KK2Z1bmMgTmV3VFNvY2tldFRpbWVvdXQoaG9zdFBvcnQgc3RyaW5nLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICgqVFNvY2tldCwgZXJyb3IpIHsKKwkvL2Nvbm4sIGVyciA6PSBuZXQuRGlhbFRpbWVvdXQobmV0d29yaywgYWRkcmVzcywgdGltZW91dCkKKwlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBob3N0UG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiBOZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIHRpbWVvdXQpLCBuaWwKK30KKworLy8gQ3JlYXRlcyBhIFRTb2NrZXQgZnJvbSBhIG5ldC5BZGRyCitmdW5jIE5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNvY2tldCB7CisJcmV0dXJuICZUU29ja2V0e2FkZHI6IGFkZHIsIHRpbWVvdXQ6IHRpbWVvdXR9Cit9CisKKy8vIENyZWF0ZXMgYSBUU29ja2V0IGZyb20gYW4gZXhpc3RpbmcgbmV0LkNvbm4KK2Z1bmMgTmV3VFNvY2tldEZyb21Db25uVGltZW91dChjb25uIG5ldC5Db25uLCB0aW1lb3V0IHRpbWUuRHVyYXRpb24pICpUU29ja2V0IHsKKwlyZXR1cm4gJlRTb2NrZXR7Y29ubjogY29ubiwgYWRkcjogY29ubi5SZW1vdGVBZGRyKCksIHRpbWVvdXQ6IHRpbWVvdXR9Cit9CisKKy8vIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0CitmdW5jIChwICpUU29ja2V0KSBTZXRUaW1lb3V0KHRpbWVvdXQgdGltZS5EdXJhdGlvbikgZXJyb3IgeworCXAudGltZW91dCA9IHRpbWVvdXQKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIHB1c2hEZWFkbGluZShyZWFkLCB3cml0ZSBib29sKSB7CisJdmFyIHQgdGltZS5UaW1lCisJaWYgcC50aW1lb3V0ID4gMCB7CisJCXQgPSB0aW1lLk5vdygpLkFkZCh0aW1lLkR1cmF0aW9uKHAudGltZW91dCkpCisJfQorCWlmIHJlYWQgJiYgd3JpdGUgeworCQlwLmNvbm4uU2V0RGVhZGxpbmUodCkKKwl9IGVsc2UgaWYgcmVhZCB7CisJCXAuY29ubi5TZXRSZWFkRGVhZGxpbmUodCkKKwl9IGVsc2UgaWYgd3JpdGUgeworCQlwLmNvbm4uU2V0V3JpdGVEZWFkbGluZSh0KQorCX0KK30KKworLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCitmdW5jIChwICpUU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCWlmIHAuSXNPcGVuKCkgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuIikKKwl9CisJaWYgcC5hZGRyID09IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gbmlsIGFkZHJlc3MuIikKKwl9CisJaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIGJhZCBuZXR3b3JrIG5hbWUuIikKKwl9CisJaWYgbGVuKHAuYWRkci5TdHJpbmcoKSkgPT0gMCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIGFkZHJlc3MuIikKKwl9CisJdmFyIGVyciBlcnJvcgorCWlmIHAuY29ubiwgZXJyID0gbmV0LkRpYWxUaW1lb3V0KHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC50aW1lb3V0KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKKwl9CisJcmV0dXJuIG5pbAorfQorCisvLyBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBuZXQuQ29ubgorZnVuYyAocCAqVFNvY2tldCkgQ29ubigpIG5ldC5Db25uIHsKKwlyZXR1cm4gcC5jb25uCit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBvcGVuCitmdW5jIChwICpUU29ja2V0KSBJc09wZW4oKSBib29sIHsKKwlpZiBwLmNvbm4gPT0gbmlsIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCXJldHVybiB0cnVlCit9CisKKy8vIENsb3NlcyB0aGUgc29ja2V0LgorZnVuYyAocCAqVFNvY2tldCkgQ2xvc2UoKSBlcnJvciB7CisJLy8gQ2xvc2UgdGhlIHNvY2tldAorCWlmIHAuY29ubiAhPSBuaWwgeworCQllcnIgOj0gcC5jb25uLkNsb3NlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwkJcC5jb25uID0gbmlsCisJfQorCXJldHVybiBuaWwKK30KKworLy9SZXR1cm5zIHRoZSByZW1vdGUgYWRkcmVzcyBvZiB0aGUgc29ja2V0LgorZnVuYyAocCAqVFNvY2tldCkgQWRkcigpIG5ldC5BZGRyIHsKKwlyZXR1cm4gcC5hZGRyCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiAhcC5Jc09wZW4oKSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCisJfQorCXAucHVzaERlYWRsaW5lKHRydWUsIGZhbHNlKQorCW4sIGVyciA6PSBwLmNvbm4uUmVhZChidWYpCisJcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpUU29ja2V0KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUoZmFsc2UsIHRydWUpCisJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIEludGVycnVwdCgpIGVycm9yIHsKKwlpZiAhcC5Jc09wZW4oKSB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuIHAuY29ubi5DbG9zZSgpCit9CisKK2Z1bmMgKHAgKlRTb2NrZXQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2FmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNyeXB0by90bHMiCisJIm5ldCIKKwkidGltZSIKKykKKwordHlwZSBUU1NMU2VydmVyU29ja2V0IHN0cnVjdCB7CisJbGlzdGVuZXIgICAgICBuZXQuTGlzdGVuZXIKKwlhZGRyICAgICAgICAgIG5ldC5BZGRyCisJY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uCisJaW50ZXJydXB0ZWQgICBib29sCisJY2ZnICAgICAgICAgICAqdGxzLkNvbmZpZworfQorCitmdW5jIE5ld1RTU0xTZXJ2ZXJTb2NrZXQobGlzdGVuQWRkciBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZykgKCpUU1NMU2VydmVyU29ja2V0LCBlcnJvcikgeworCXJldHVybiBOZXdUU1NMU2VydmVyU29ja2V0VGltZW91dChsaXN0ZW5BZGRyLCBjZmcsIDApCit9CisKK2Z1bmMgTmV3VFNTTFNlcnZlclNvY2tldFRpbWVvdXQobGlzdGVuQWRkciBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZywgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTU0xTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJaWYgY2ZnLk1pblZlcnNpb24gPT0gMCB7CisJCWNmZy5NaW5WZXJzaW9uID0gdGxzLlZlcnNpb25UTFMxMAorCX0KKwlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBsaXN0ZW5BZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuICZUU1NMU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIGNsaWVudFRpbWVvdXQ6IGNsaWVudFRpbWVvdXQsIGNmZzogY2ZnfSwgbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIExpc3RlbigpIGVycm9yIHsKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gbmlsCisJfQorCWwsIGVyciA6PSB0bHMuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC5jZmcpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcC5saXN0ZW5lciA9IGwKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCWlmIHAuaW50ZXJydXB0ZWQgeworCQlyZXR1cm4gbmlsLCBlcnJUcmFuc3BvcnRJbnRlcnJ1cHRlZAorCX0KKwlpZiBwLmxpc3RlbmVyID09IG5pbCB7CisJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQorCX0KKwljb25uLCBlcnIgOj0gcC5saXN0ZW5lci5BY2NlcHQoKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKKwl9CisJcmV0dXJuIE5ld1RTU0xTb2NrZXRGcm9tQ29ublRpbWVvdXQoY29ubiwgcC5jZmcsIHAuY2xpZW50VGltZW91dCksIG5pbAorfQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGxpc3RlbmluZy4KK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIElzTGlzdGVuaW5nKCkgYm9vbCB7CisJcmV0dXJuIHAubGlzdGVuZXIgIT0gbmlsCit9CisKKy8vIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgorZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgT3BlbigpIGVycm9yIHsKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTZXJ2ZXIgc29ja2V0IGFscmVhZHkgb3BlbiIpCisJfQorCWlmIGwsIGVyciA6PSB0bHMuTGlzdGVuKHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0gZWxzZSB7CisJCXAubGlzdGVuZXIgPSBsCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgQWRkcigpIG5ldC5BZGRyIHsKKwlyZXR1cm4gcC5hZGRyCit9CisKK2Z1bmMgKHAgKlRTU0xTZXJ2ZXJTb2NrZXQpIENsb3NlKCkgZXJyb3IgeworCWRlZmVyIGZ1bmMoKSB7CisJCXAubGlzdGVuZXIgPSBuaWwKKwl9KCkKKwlpZiBwLklzTGlzdGVuaW5nKCkgeworCQlyZXR1cm4gcC5saXN0ZW5lci5DbG9zZSgpCisJfQorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgeworCXAuaW50ZXJydXB0ZWQgPSB0cnVlCisJcmV0dXJuIG5pbAorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjMzNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiY3J5cHRvL3RscyIKKwkibmV0IgorCSJ0aW1lIgorKQorCit0eXBlIFRTU0xTb2NrZXQgc3RydWN0IHsKKwljb25uIG5ldC5Db25uCisJLy8gaG9zdFBvcnQgY29udGFpbnMgaG9zdDpwb3J0IChlLmcuICJhc2RmLmNvbToxMjM0NSIpLiBUaGUgZmllbGQgaXMKKwkvLyBvbmx5IHZhbGlkIGlmIGFkZHIgaXMgbmlsLgorCWhvc3RQb3J0IHN0cmluZworCS8vIGFkZHIgaXMgbmlsIHdoZW4gaG9zdFBvcnQgaXMgbm90ICIiLCBhbmQgaXMgb25seSB1c2VkIHdoZW4gdGhlCisJLy8gVFNTTFNvY2tldCBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgbmV0LkFkZHIuCisJYWRkciAgICBuZXQuQWRkcgorCXRpbWVvdXQgdGltZS5EdXJhdGlvbgorCWNmZyAgICAgKnRscy5Db25maWcKK30KKworLy8gTmV3VFNTTFNvY2tldCBjcmVhdGVzIGEgbmV0LkNvbm4tYmFja2VkIFRUcmFuc3BvcnQsIGdpdmVuIGEgaG9zdCBhbmQgcG9ydCBhbmQgdGxzIENvbmZpZ3VyYXRpb24KKy8vCisvLyBFeGFtcGxlOgorLy8gCXRyYW5zLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTU0xTb2NrZXQoImxvY2FsaG9zdDo5MDkwIiwgbmlsKQorZnVuYyBOZXdUU1NMU29ja2V0KGhvc3RQb3J0IHN0cmluZywgY2ZnICp0bHMuQ29uZmlnKSAoKlRTU0xTb2NrZXQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RTU0xTb2NrZXRUaW1lb3V0KGhvc3RQb3J0LCBjZmcsIDApCit9CisKKy8vIE5ld1RTU0xTb2NrZXRUaW1lb3V0IGNyZWF0ZXMgYSBuZXQuQ29ubi1iYWNrZWQgVFRyYW5zcG9ydCwgZ2l2ZW4gYSBob3N0IGFuZCBwb3J0CisvLyBpdCBhbHNvIGFjY2VwdHMgYSB0bHMgQ29uZmlndXJhdGlvbiBhbmQgYSB0aW1lb3V0IGFzIGEgdGltZS5EdXJhdGlvbgorZnVuYyBOZXdUU1NMU29ja2V0VGltZW91dChob3N0UG9ydCBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTU0xTb2NrZXQsIGVycm9yKSB7CisJaWYgY2ZnLk1pblZlcnNpb24gPT0gMCB7CisJCWNmZy5NaW5WZXJzaW9uID0gdGxzLlZlcnNpb25UTFMxMAorCX0KKwlyZXR1cm4gJlRTU0xTb2NrZXR7aG9zdFBvcnQ6IGhvc3RQb3J0LCB0aW1lb3V0OiB0aW1lb3V0LCBjZmc6IGNmZ30sIG5pbAorfQorCisvLyBDcmVhdGVzIGEgVFNTTFNvY2tldCBmcm9tIGEgbmV0LkFkZHIKK2Z1bmMgTmV3VFNTTFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyIG5ldC5BZGRyLCBjZmcgKnRscy5Db25maWcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTU0xTb2NrZXQgeworCXJldHVybiAmVFNTTFNvY2tldHthZGRyOiBhZGRyLCB0aW1lb3V0OiB0aW1lb3V0LCBjZmc6IGNmZ30KK30KKworLy8gQ3JlYXRlcyBhIFRTU0xTb2NrZXQgZnJvbSBhbiBleGlzdGluZyBuZXQuQ29ubgorZnVuYyBOZXdUU1NMU29ja2V0RnJvbUNvbm5UaW1lb3V0KGNvbm4gbmV0LkNvbm4sIGNmZyAqdGxzLkNvbmZpZywgdGltZW91dCB0aW1lLkR1cmF0aW9uKSAqVFNTTFNvY2tldCB7CisJcmV0dXJuICZUU1NMU29ja2V0e2Nvbm46IGNvbm4sIGFkZHI6IGNvbm4uUmVtb3RlQWRkcigpLCB0aW1lb3V0OiB0aW1lb3V0LCBjZmc6IGNmZ30KK30KKworLy8gU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIFNldFRpbWVvdXQodGltZW91dCB0aW1lLkR1cmF0aW9uKSBlcnJvciB7CisJcC50aW1lb3V0ID0gdGltZW91dAorCXJldHVybiBuaWwKK30KKworZnVuYyAocCAqVFNTTFNvY2tldCkgcHVzaERlYWRsaW5lKHJlYWQsIHdyaXRlIGJvb2wpIHsKKwl2YXIgdCB0aW1lLlRpbWUKKwlpZiBwLnRpbWVvdXQgPiAwIHsKKwkJdCA9IHRpbWUuTm93KCkuQWRkKHRpbWUuRHVyYXRpb24ocC50aW1lb3V0KSkKKwl9CisJaWYgcmVhZCAmJiB3cml0ZSB7CisJCXAuY29ubi5TZXREZWFkbGluZSh0KQorCX0gZWxzZSBpZiByZWFkIHsKKwkJcC5jb25uLlNldFJlYWREZWFkbGluZSh0KQorCX0gZWxzZSBpZiB3cml0ZSB7CisJCXAuY29ubi5TZXRXcml0ZURlYWRsaW5lKHQpCisJfQorfQorCisvLyBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIE9wZW4oKSBlcnJvciB7CisJdmFyIGVyciBlcnJvcgorCS8vIElmIHdlIGhhdmUgYSBob3N0bmFtZSwgd2UgbmVlZCB0byBwYXNzIHRoZSBob3N0bmFtZSB0byB0bHMuRGlhbCBmb3IKKwkvLyBjZXJ0aWZpY2F0ZSBob3N0bmFtZSBjaGVja3MuCisJaWYgcC5ob3N0UG9ydCAhPSAiIiB7CisJCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWxXaXRoRGlhbGVyKCZuZXQuRGlhbGVyeworCQkJVGltZW91dDogcC50aW1lb3V0fSwgInRjcCIsIHAuaG9zdFBvcnQsIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCisJCX0KKwl9IGVsc2UgeworCQlpZiBwLklzT3BlbigpIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKQorCQl9CisJCWlmIHAuYWRkciA9PSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBuaWwgYWRkcmVzcy4iKQorCQl9CisJCWlmIGxlbihwLmFkZHIuTmV0d29yaygpKSA9PSAwIHsKKwkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQorCQl9CisJCWlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQorCQl9CisJCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWxXaXRoRGlhbGVyKCZuZXQuRGlhbGVyeworCQkJVGltZW91dDogcC50aW1lb3V0fSwgcC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5FcnJvcigpKQorCQl9CisJfQorCXJldHVybiBuaWwKK30KKworLy8gUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgbmV0LkNvbm4KK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIENvbm4oKSBuZXQuQ29ubiB7CisJcmV0dXJuIHAuY29ubgorfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbgorZnVuYyAocCAqVFNTTFNvY2tldCkgSXNPcGVuKCkgYm9vbCB7CisJaWYgcC5jb25uID09IG5pbCB7CisJCXJldHVybiBmYWxzZQorCX0KKwlyZXR1cm4gdHJ1ZQorfQorCisvLyBDbG9zZXMgdGhlIHNvY2tldC4KK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIENsb3NlKCkgZXJyb3IgeworCS8vIENsb3NlIHRoZSBzb2NrZXQKKwlpZiBwLmNvbm4gIT0gbmlsIHsKKwkJZXJyIDo9IHAuY29ubi5DbG9zZSgpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIGVycgorCQl9CisJCXAuY29ubiA9IG5pbAorCX0KKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgZXJyb3IpIHsKKwlpZiAhcC5Jc09wZW4oKSB7CisJCXJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCisJfQorCXAucHVzaERlYWRsaW5lKHRydWUsIGZhbHNlKQorCW4sIGVyciA6PSBwLmNvbm4uUmVhZChidWYpCisJcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQorfQorCitmdW5jIChwICpUU1NMU29ja2V0KSBXcml0ZShidWYgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmICFwLklzT3BlbigpIHsKKwkJcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKKwl9CisJcC5wdXNoRGVhZGxpbmUoZmFsc2UsIHRydWUpCisJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIEludGVycnVwdCgpIGVycm9yIHsKKwlpZiAhcC5Jc09wZW4oKSB7CisJCXJldHVybiBuaWwKKwl9CisJcmV0dXJuIHAuY29ubi5DbG9zZSgpCit9CisKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKKwljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGFwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvdGFwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4YmYyZS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RhcHBsaWNhdGlvbl9leGNlcHRpb24uZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAib3MiCi0pCi0KLWNvbnN0ICgKLSAgVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04gID0gMAotICBVTktOT1dOX01FVEhPRCAgICAgICAgICAgICAgICAgPSAxCi0gIElOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiA9IDIKLSAgV1JPTkdfTUVUSE9EX05BTUUgICAgICAgICAgICAgID0gMwotICBCQURfU0VRVUVOQ0VfSUQgICAgICAgICAgICAgICAgPSA0Ci0gIE1JU1NJTkdfUkVTVUxUICAgICAgICAgICAgICAgICA9IDUKLSAgSU5URVJOQUxfRVJST1IgICAgICAgICAgICAgICAgID0gNgotICBQUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA3Ci0pCi0KLQotLyoqCi0gKiBBcHBsaWNhdGlvbiBsZXZlbCBleGNlcHRpb24KLSAqCi0gKi8KLXR5cGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGludGVyZmFjZSB7Ci0gIFRFeGNlcHRpb24KLSAgVHlwZUlkKCkgaW50MzIKLSAgUmVhZChpcHJvdCBUUHJvdG9jb2wpIChUQXBwbGljYXRpb25FeGNlcHRpb24sIG9zLkVycm9yKQotICBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIG9zLkVycm9yCi19Ci0KLXR5cGUgdEFwcGxpY2F0aW9uRXhjZXB0aW9uIHN0cnVjdCB7Ci0gIFRFeGNlcHRpb24KLSAgdHlwZV8gaW50MzIKLX0KLQotZnVuYyBOZXdUQXBwbGljYXRpb25FeGNlcHRpb25EZWZhdWx0KCkgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgIlVOS05PV04iKQotfQotCi1mdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUodHlwZV8gaW50MzIpIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7Ci0gIHJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8sICJVTktOT1dOIikKLX0KLQotZnVuYyBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8gaW50MzIsIG1lc3NhZ2Ugc3RyaW5nKSBUQXBwbGljYXRpb25FeGNlcHRpb24gewotICByZXR1cm4gJnRBcHBsaWNhdGlvbkV4Y2VwdGlvbntURXhjZXB0aW9uOiBOZXdURXhjZXB0aW9uKG1lc3NhZ2UpLCB0eXBlXzogdHlwZV99Ci19Ci0KLWZ1bmMgTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZShtZXNzYWdlIHN0cmluZykgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTiwgbWVzc2FnZSkKLX0KLQotZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQzMiB7Ci0gIHJldHVybiBwLnR5cGVfCi19Ci0KLWZ1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgUmVhZChpcHJvdCBUUHJvdG9jb2wpIChlcnJvciBUQXBwbGljYXRpb25FeGNlcHRpb24sIGVyciBvcy5FcnJvcikgewotICBfLCBlcnIgPSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotCi0gIG1lc3NhZ2UgOj0gIiIKLSAgdHlwZV8gOj0gaW50MzIoVU5LTk9XTl9BUFBMSUNBVElPTl9FWENFUFRJT04pCi0KLSAgZm9yIHsKLSAgICBfLCB0dHlwZSwgaWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gICAgaWYgdHR5cGUgPT0gU1RPUCB7Ci0gICAgICBicmVhawotICAgIH0KLSAgICBzd2l0Y2ggaWQgewotICAgIGNhc2UgMToKLSAgICAgIGlmIHR0eXBlID09IFNUUklORyB7Ci0gICAgICAgIG1lc3NhZ2UsIGVyciA9IGlwcm90LlJlYWRTdHJpbmcoKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhawotICAgIGNhc2UgMjoKLSAgICAgIGlmIHR0eXBlID09IEkzMiB7Ci0gICAgICAgIHR5cGVfLCBlcnIgPSBpcHJvdC5SZWFkSTMyKCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWsKLSAgICBkZWZhdWx0OgotICAgICAgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuCi0gICAgICB9Ci0gICAgICBicmVhawotICAgIH0KLSAgICBlcnIgPSBpcHJvdC5SZWFkRmllbGRFbmQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICB9Ci0gIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RFbmQoKQotICBlcnJvciA9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXywgbWVzc2FnZSkKLSAgcmV0dXJuCi19Ci0KLWZ1bmMgKHAgKnRBcHBsaWNhdGlvbkV4Y2VwdGlvbikgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIG9zLkVycm9yKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCi0gIGlmIGxlbihwLlN0cmluZygpKSA+IDAgewotICAgIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigibWVzc2FnZSIsIFNUUklORywgMSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybgotICAgIH0KLSAgICBlcnIgPSBvcHJvdC5Xcml0ZVN0cmluZyhwLlN0cmluZygpKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICAgIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigidHlwZSIsIEkzMiwgMikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVJMzIocC50eXBlXykKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybgotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKQotICByZXR1cm4KLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGFwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90YXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTcyZjQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90YXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSkKLQotZnVuYyBUZXN0VEFwcGxpY2F0aW9uRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgewotICBleGMgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiIikKLSAgaWYgZXhjLlN0cmluZygpICE9ICIiIHsKLSAgICB0LkZhdGFsZigiRXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuU3RyaW5nKCkpCi0gIH0KLSAgaWYgZXhjLlR5cGVJZCgpICE9IFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OIHsKLSAgICB0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBVTktOT1dOIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuVHlwZUlkKCkpCi0gIH0KLSAgZXhjID0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFdST05HX01FVEhPRF9OQU1FLCAianVua19tZXRob2QiKQotICBpZiBleGMuU3RyaW5nKCkgIT0gImp1bmtfbWV0aG9kIiB7Ci0gICAgdC5GYXRhbGYoIkV4cGVjdGVkICdqdW5rX21ldGhvZCcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5TdHJpbmcoKSkKLSAgfQotICBpZiBleGMuVHlwZUlkKCkgIT0gV1JPTkdfTUVUSE9EX05BTUUgewotICAgIHQuRmF0YWxmKCJFeHBlY3RlZCB0eXBlIFdST05HX01FVEhPRF9OQU1FIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuVHlwZUlkKCkpCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGJhc2UuZ28gYi9saWIvZ28vdGhyaWZ0L3RiYXNlLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGM1MmQwLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGJhc2UuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8qKgotICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgotICoKLSAqLwotdHlwZSBUQmFzZSBpbnRlcmZhY2UgewotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbAotICAgKgotICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKLSAgICovCi0gIFJlYWQoaXByb3QgVFByb3RvY29sKSAoZXJyIFRFeGNlcHRpb24pCi0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sCi0gICAqCi0gICAqIEBwYXJhbSBvcHJvdCBPdXRwdXQgcHJvdG9jb2wKLSAgICovCi0gIFdyaXRlKG9wcm90IFRQcm90b2NvbCkgKGVyciBURXhjZXB0aW9uKQotCi0gIC8qKgotICAgKiBDaGVjayBpZiBhIGZpZWxkIGlzIGN1cnJlbnRseSBzZXQgb3IgdW5zZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZAotICAgKi8KLSAgSXNTZXQoZmllbGQgVEZpZWxkKSBib29sCi0KLSAgLyoqCi0gICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gCi0gICAqIHRoZSBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgotICAgKgotICAgKiBAcGFyYW0gZmllbGQKLSAgICovCi0gIEZpZWxkVmFsdWUoZmllbGQgVEZpZWxkKSBpbnRlcmZhY2V7fQotCi0gIC8qKgotICAgKiBTZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIHZhcmlhYmxlLiBQcmltaXRpdmUgdHlwZXMgbXVzdCBiZSAiYm94ZWQiIGluCi0gICAqIHRoZSBhcHByb3ByaWF0ZSBvYmplY3Qgd3JhcHBlciB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gZmllbGQKLSAgICovCi0gIFNldEZpZWxkVmFsdWUoZmllbGQgVEZpZWxkLCB2YWx1ZSBpbnRlcmZhY2V7fSkKLQotICBEZWVwQ29weSgpIFRCYXNlCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RiaW5hcnlfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3RiaW5hcnlfcHJvdG9jb2wuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODhkYTYuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90YmluYXJ5X3Byb3RvY29sLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgImVuY29kaW5nL2JpbmFyeSIKLSAgIm1hdGgiCi0gICJzdHJpbmdzIgotICAiaW8iCi0pCi0KLXR5cGUgVEJpbmFyeVByb3RvY29sIHN0cnVjdCB7Ci0gIC8vVFByb3RvY29sQmFzZTsKLSAgdHJhbnMgICAgICAgICAgICBUVHJhbnNwb3J0Ci0gIF9TdHJpY3RSZWFkICAgICAgYm9vbAotICBfU3RyaWN0V3JpdGUgICAgIGJvb2wKLSAgX1JlYWRMZW5ndGggICAgICBpbnQKLSAgX0NoZWNrUmVhZExlbmd0aCBib29sCi19Ci0KLXR5cGUgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBzdHJ1Y3QgewotICBfU3RyaWN0UmVhZCAgYm9vbAotICBfU3RyaWN0V3JpdGUgYm9vbAotfQotCi1mdW5jIE5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0IFRUcmFuc3BvcnQpICpUQmluYXJ5UHJvdG9jb2wgewotICByZXR1cm4gTmV3VEJpbmFyeVByb3RvY29sKHQsIGZhbHNlLCB0cnVlKQotfQotCi1mdW5jIE5ld1RCaW5hcnlQcm90b2NvbCh0IFRUcmFuc3BvcnQsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlIGJvb2wpICpUQmluYXJ5UHJvdG9jb2wgewotICAvL3JldHVybiAmVEJpbmFyeVByb3RvY29se1RQcm90b2NvbEJhc2U6VFByb3RvY29sQmFzZXt0cmFuczp0fSwgX1N0cmljdFJlYWQ6c3RyaWN0UmVhZCwgX1N0cmljdFdyaXRlOnN0cmljdFdyaXRlLCBfUmVhZExlbmd0aDowLCBfQ2hlY2tSZWFkTGVuZ3RoOmZhbHNlfTsKLSAgcmV0dXJuICZUQmluYXJ5UHJvdG9jb2x7dHJhbnM6IHQsIF9TdHJpY3RSZWFkOiBzdHJpY3RSZWFkLCBfU3RyaWN0V3JpdGU6IHN0cmljdFdyaXRlLCBfUmVhZExlbmd0aDogMCwgX0NoZWNrUmVhZExlbmd0aDogZmFsc2V9Ci19Ci0KLWZ1bmMgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSAqVEJpbmFyeVByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KGZhbHNlLCB0cnVlKQotfQotCi1mdW5jIE5ld1RCaW5hcnlQcm90b2NvbEZhY3Rvcnkoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUgYm9vbCkgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkgewotICByZXR1cm4gJlRCaW5hcnlQcm90b2NvbEZhY3Rvcnl7X1N0cmljdFJlYWQ6IHN0cmljdFJlYWQsIF9TdHJpY3RXcml0ZTogc3RyaWN0V3JpdGV9Ci19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHQgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKLSAgcmV0dXJuIE5ld1RCaW5hcnlQcm90b2NvbCh0LCBwLl9TdHJpY3RSZWFkLCBwLl9TdHJpY3RXcml0ZSkKLX0KLQotLyoqCi0gKiBXcml0aW5nIE1ldGhvZHMKLSAqLwotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWVzc2FnZUJlZ2luKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgcC5fU3RyaWN0V3JpdGUgewotICAgIHZlcnNpb24gOj0gdWludDMyKFZFUlNJT05fMSkgfCB1aW50MzIodHlwZUlkKQotICAgIGUgOj0gcC5Xcml0ZUkzMihpbnQzMih2ZXJzaW9uKSkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gZQotICAgIH0KLSAgICBlID0gcC5Xcml0ZVN0cmluZyhuYW1lKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlCi0gICAgfQotICAgIGUgPSBwLldyaXRlSTMyKHNlcUlkKQotICAgIHJldHVybiBlCi0gIH0gZWxzZSB7Ci0gICAgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgcmV0dXJuIGUKLSAgICB9Ci0gICAgZSA9IHAuV3JpdGVCeXRlKGJ5dGUodHlwZUlkKSkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gZQotICAgIH0KLSAgICBlID0gcC5Xcml0ZUkzMihzZXFJZCkKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgZSA6PSBwLldyaXRlQnl0ZShieXRlKHR5cGVJZCkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGUgPSBwLldyaXRlSTE2KGlkKQotICByZXR1cm4gZQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuV3JpdGVCeXRlKFNUT1ApCi0gIHJldHVybiBlCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUoa2V5VHlwZSkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGUgPSBwLldyaXRlQnl0ZShieXRlKHZhbHVlVHlwZSkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGUgPSBwLldyaXRlSTMyKGludDMyKHNpemUpKQotICByZXR1cm4gZQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgZSA6PSBwLldyaXRlQnl0ZShieXRlKGVsZW1UeXBlKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgZSA9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCi0gIHJldHVybiBlCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUoZWxlbVR5cGUpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBlID0gcC5Xcml0ZUkzMihpbnQzMihzaXplKSkKLSAgcmV0dXJuIGUKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZVNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgdmFsdWUgewotICAgIHJldHVybiBwLldyaXRlQnl0ZSgxKQotICB9Ci0gIHJldHVybiBwLldyaXRlQnl0ZSgwKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlQnl0ZSh2YWx1ZSBieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICB2IDo9IFtdYnl0ZXt2YWx1ZX0KLSAgXywgZSA6PSBwLnRyYW5zLldyaXRlKHYpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlSTE2KHZhbHVlIGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBoIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiA4KSkKLSAgbCA6PSBieXRlKDB4ZmYgJiB2YWx1ZSkKLSAgdiA6PSBbXWJ5dGV7aCwgbH0KLSAgXywgZSA6PSBwLnRyYW5zLldyaXRlKHYpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlSTMyKHZhbHVlIGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBhIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiAyNCkpCi0gIGIgOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDE2KSkKLSAgYyA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gOCkpCi0gIGQgOj0gYnl0ZSgweGZmICYgdmFsdWUpCi0gIHYgOj0gW11ieXRle2EsIGIsIGMsIGR9Ci0gIF8sIGUgOj0gcC50cmFucy5Xcml0ZSh2KQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUk2NCh2YWx1ZSBpbnQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgYSA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gNTYpKQotICBiIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiA0OCkpCi0gIGMgOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDQwKSkKLSAgZCA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gMzIpKQotICBlIDo9IGJ5dGUoMHhmZiAmICh2YWx1ZSA+PiAyNCkpCi0gIGYgOj0gYnl0ZSgweGZmICYgKHZhbHVlID4+IDE2KSkKLSAgZyA6PSBieXRlKDB4ZmYgJiAodmFsdWUgPj4gOCkpCi0gIGggOj0gYnl0ZSgweGZmICYgdmFsdWUpCi0gIHYgOj0gW11ieXRle2EsIGIsIGMsIGQsIGUsIGYsIGcsIGh9Ci0gIF8sIGVyciA6PSBwLnRyYW5zLldyaXRlKHYpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVEb3VibGUodmFsdWUgZmxvYXQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVJNjQoaW50NjQobWF0aC5GbG9hdDY0Yml0cyh2YWx1ZSkpKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFdyaXRlU3RyaW5nKHZhbHVlIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVCaW5hcnlGcm9tUmVhZGVyKHN0cmluZ3MuTmV3UmVhZGVyKHZhbHVlKSwgbGVuKHZhbHVlKSkKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBXcml0ZUJpbmFyeSh2YWx1ZSBbXWJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGUgOj0gcC5Xcml0ZUkzMihpbnQzMihsZW4odmFsdWUpKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgXywgZXJyIDo9IHAudHJhbnMuV3JpdGUodmFsdWUpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgV3JpdGVCaW5hcnlGcm9tUmVhZGVyKHJlYWRlciBpby5SZWFkZXIsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlIDo9IHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIF8sIGVyciA6PSBpby5Db3B5bihwLnRyYW5zLCByZWFkZXIsIGludDY0KHNpemUpKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0KLS8qKgotICogUmVhZGluZyBtZXRob2RzCi0gKi8KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFJZCBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBzaXplLCBlIDo9IHAuUmVhZEkzMigpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gIiIsIHR5cGVJZCwgMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBpZiBzaXplIDwgMCB7Ci0gICAgdHlwZUlkID0gVE1lc3NhZ2VUeXBlKHNpemUgJiAweDBmZikKLSAgICB2ZXJzaW9uIDo9IGludDY0KGludDY0KHNpemUpICYgVkVSU0lPTl9NQVNLKQotICAgIGlmIHZlcnNpb24gIT0gVkVSU0lPTl8xIHsKLSAgICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luIikKLSAgICB9Ci0gICAgbmFtZSwgZSA9IHAuUmVhZFN0cmluZygpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgfQotICAgIHNlcUlkLCBlID0gcC5SZWFkSTMyKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIG5pbAotICB9Ci0gIGlmIHAuX1N0cmljdFJlYWQgewotICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oQkFEX1ZFUlNJT04sICJNaXNzaW5nIHZlcnNpb24gaW4gUmVhZE1lc3NhZ2VCZWdpbiIpCi0gIH0KLSAgbmFtZSwgZTIgOj0gcC5yZWFkU3RyaW5nQm9keShpbnQoc2l6ZSkpCi0gIGlmIGUyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUyCi0gIH0KLSAgYiwgZTMgOj0gcC5SZWFkQnl0ZSgpCi0gIGlmIGUzICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGUzCi0gIH0KLSAgdHlwZUlkID0gVE1lc3NhZ2VUeXBlKGIpCi0gIHNlcUlkLCBlNCA6PSBwLlJlYWRJMzIoKQotICBpZiBlNCAhPSBuaWwgewotICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlNAotICB9Ci0gIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBzZXFJZCBpbnQxNiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB0LCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIHR5cGVJZCA9IFRUeXBlKHQpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKLSAgfQotICBpZiB0ICE9IFNUT1AgewotICAgIHNlcUlkLCBlcnIgPSBwLlJlYWRJMTYoKQotICB9Ci0gIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtUeXBlLCB2VHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaywgZSA6PSBwLlJlYWRCeXRlKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgcmV0dXJuCi0gIH0KLSAga1R5cGUgPSBUVHlwZShrKQotICB2LCBlIDo9IHAuUmVhZEJ5dGUoKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICB2VHlwZSA9IFRUeXBlKHYpCi0gIHNpemUzMiwgZSA6PSBwLlJlYWRJMzIoKQotICBzaXplID0gaW50KHNpemUzMikKLSAgaWYgZSAhPSBuaWwgewotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgcmV0dXJuCi0gIH0KLSAgcmV0dXJuIGtUeXBlLCB2VHlwZSwgc2l6ZSwgbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZE1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBiLCBlIDo9IHAuUmVhZEJ5dGUoKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICBlbGVtVHlwZSA9IFRUeXBlKGIpCi0gIHNpemUzMiwgZSA6PSBwLlJlYWRJMzIoKQotICBzaXplID0gaW50KHNpemUzMikKLSAgaWYgZSAhPSBuaWwgewotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgcmV0dXJuCi0gIH0KLSAgcmV0dXJuIGVsZW1UeXBlLCBzaXplLCBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU2V0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGIsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIGVsZW1UeXBlID0gVFR5cGUoYikKLSAgc2l6ZTMyLCBlIDo9IHAuUmVhZEkzMigpCi0gIHNpemUgPSBpbnQoc2l6ZTMyKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICByZXR1cm4gZWxlbVR5cGUsIHNpemUsIG5pbAotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJvb2woKSAoYm9vbCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGIsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gIHYgOj0gdHJ1ZQotICBpZiBiICE9IDEgewotICAgIHYgPSBmYWxzZQotICB9Ci0gIHJldHVybiB2LCBlCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJ5dGUoKSAodmFsdWUgYnl0ZSwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBidWYgOj0gW11ieXRlezB9Ci0gIGVyciA9IHAucmVhZEFsbChidWYpCi0gIHJldHVybiBidWZbMF0sIGVycgotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWRJMTYoKSAodmFsdWUgaW50MTYsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgYnVmIDo9IFtdYnl0ZXswLCAwfQotICBlcnIgPSBwLnJlYWRBbGwoYnVmKQotICB2YWx1ZSA9IGludDE2KGJpbmFyeS5CaWdFbmRpYW4uVWludDE2KGJ1ZikpCi0gIHJldHVybiB2YWx1ZSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBidWYgOj0gW11ieXRlezAsIDAsIDAsIDB9Ci0gIGVyciA9IHAucmVhZEFsbChidWYpCi0gIHZhbHVlID0gaW50MzIoYmluYXJ5LkJpZ0VuZGlhbi5VaW50MzIoYnVmKSkKLSAgcmV0dXJuIHZhbHVlLCBlcnIKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkSTY0KCkgKHZhbHVlIGludDY0LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGJ1ZiA6PSBbXWJ5dGV7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KLSAgZXJyID0gcC5yZWFkQWxsKGJ1ZikKLSAgdmFsdWUgPSBpbnQ2NChiaW5hcnkuQmlnRW5kaWFuLlVpbnQ2NChidWYpKQotICByZXR1cm4gdmFsdWUsIGVycgotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFJlYWREb3VibGUoKSAodmFsdWUgZmxvYXQ2NCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBidWYgOj0gW11ieXRlezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9Ci0gIGVyciA9IHAucmVhZEFsbChidWYpCi0gIHZhbHVlID0gbWF0aC5GbG9hdDY0ZnJvbWJpdHMoYmluYXJ5LkJpZ0VuZGlhbi5VaW50NjQoYnVmKSkKLSAgcmV0dXJuIHZhbHVlLCBlcnIKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBzaXplLCBlIDo9IHAuUmVhZEkzMigpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gIiIsIGUKLSAgfQotICByZXR1cm4gcC5yZWFkU3RyaW5nQm9keShpbnQoc2l6ZSkpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBzaXplLCBlIDo9IHAuUmVhZEkzMigpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gbmlsLCBlCi0gIH0KLSAgaXNpemUgOj0gaW50KHNpemUpCi0gIGUgPSBwLmNoZWNrUmVhZExlbmd0aChpc2l6ZSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIGUKLSAgfQotICBidWYgOj0gbWFrZShbXWJ5dGUsIGlzaXplKQotICBfLCBlcnIgOj0gcC50cmFucy5SZWFkQWxsKGJ1ZikKLSAgcmV0dXJuIGJ1ZiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKHAudHJhbnMuRmx1c2goKSkKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIFNraXBEZWZhdWx0RGVwdGgocCwgZmllbGRUeXBlKQotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgewotICByZXR1cm4gcC50cmFucwotfQotCi1mdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIHJlYWRBbGwoYnVmIFtdYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgZSA6PSBwLmNoZWNrUmVhZExlbmd0aChsZW4oYnVmKSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgXywgZXJyIDo9IHAudHJhbnMuUmVhZEFsbChidWYpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgc2V0UmVhZExlbmd0aChyZWFkTGVuZ3RoIGludCkgewotICBwLl9SZWFkTGVuZ3RoID0gcmVhZExlbmd0aAotICBwLl9DaGVja1JlYWRMZW5ndGggPSB0cnVlCi19Ci0KLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgY2hlY2tSZWFkTGVuZ3RoKGxlbmd0aCBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIHAuX0NoZWNrUmVhZExlbmd0aCB7Ci0gICAgcC5fUmVhZExlbmd0aCA9IHAuX1JlYWRMZW5ndGggLSBsZW5ndGgKLSAgICBpZiBwLl9SZWFkTGVuZ3RoIDwgMCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKFVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OLCAiTWVzc2FnZSBsZW5ndGggZXhjZWVkZWQ6ICIrc3RyaW5nKGxlbmd0aCkpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSByZWFkU3RyaW5nQm9keShzaXplIGludCkgKHZhbHVlIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBzaXplIDwgMCB7Ci0gICAgcmV0dXJuICIiLCBuaWwKLSAgfQotICBlcnIgPSBwLmNoZWNrUmVhZExlbmd0aChzaXplKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gIiIsIGVycgotICB9Ci0gIGlzaXplIDo9IGludChzaXplKQotICBidWYgOj0gbWFrZShbXWJ5dGUsIGlzaXplKQotICBfLCBlIDo9IHAudHJhbnMuUmVhZEFsbChidWYpCi0gIHJldHVybiBzdHJpbmcoYnVmKSwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGJpbmFyeV9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90YmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWIyNDguLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90YmluYXJ5X3Byb3RvY29sX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSAgLy8iYnl0ZXMiOwotKQotCi0KLWZ1bmMgVGVzdFJlYWRXcml0ZUJpbmFyeVByb3RvY29sKHQgKnRlc3RpbmcuVCkgewotICBSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGNvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3Rjb21wYWN0X3Byb3RvY29sLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjc4MGY3Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGNvbXBhY3RfcHJvdG9jb2wuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw4NTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiY29udGFpbmVyL3ZlY3RvciIKLSAgImVuY29kaW5nL2JpbmFyeSIKLSAgImZtdCIKLSAgIm1hdGgiCi0gICJvcyIKLSAgInN0cmluZ3MiCi0pCi0KLWNvbnN0ICgKLSAgQ09NUEFDVF9QUk9UT0NPTF9JRCAgICAgICA9IDB4MDgyCi0gIENPTVBBQ1RfVkVSU0lPTiAgICAgICAgICAgPSAxCi0gIENPTVBBQ1RfVkVSU0lPTl9NQVNLICAgICAgPSAweDFmCi0gIENPTVBBQ1RfVFlQRV9NQVNLICAgICAgICAgPSAweDBFMAotICBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UID0gNQotKQotCi10eXBlIFRDb21wYWN0VHlwZSBieXRlCi0KLWNvbnN0ICgKLSAgQ09NUEFDVF9CT09MRUFOX1RSVUUgID0gMHgwMQotICBDT01QQUNUX0JPT0xFQU5fRkFMU0UgPSAweDAyCi0gIENPTVBBQ1RfQllURSAgICAgICAgICA9IDB4MDMKLSAgQ09NUEFDVF9JMTYgICAgICAgICAgID0gMHgwNAotICBDT01QQUNUX0kzMiAgICAgICAgICAgPSAweDA1Ci0gIENPTVBBQ1RfSTY0ICAgICAgICAgICA9IDB4MDYKLSAgQ09NUEFDVF9ET1VCTEUgICAgICAgID0gMHgwNwotICBDT01QQUNUX0JJTkFSWSAgICAgICAgPSAweDA4Ci0gIENPTVBBQ1RfTElTVCAgICAgICAgICA9IDB4MDkKLSAgQ09NUEFDVF9TRVQgICAgICAgICAgID0gMHgwQQotICBDT01QQUNUX01BUCAgICAgICAgICAgPSAweDBCCi0gIENPTVBBQ1RfU1RSVUNUICAgICAgICA9IDB4MEMKLSkKLQotdmFyICgKLSAgX1RUeXBlVG9Db21wYWN0VHlwZSBbXVRDb21wYWN0VHlwZQotICBfVFNUT1AgICAgICAgICAgICAgIFRGaWVsZAotKQotCi1mdW5jIGluaXQoKSB7Ci0gIF9UU1RPUCA9IE5ld1RGaWVsZCgiIiwgU1RPUCwgMCkKLSAgX1RUeXBlVG9Db21wYWN0VHlwZSA9IG1ha2UoW11UQ29tcGFjdFR5cGUsIGludChVVEYxNikrMSkKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoU1RPUCldID0gU1RPUAotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChCT09MKV0gPSBDT01QQUNUX0JPT0xFQU5fVFJVRQotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChCWVRFKV0gPSBDT01QQUNUX0JZVEUKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoSTE2KV0gPSBDT01QQUNUX0kxNgotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChJMzIpXSA9IENPTVBBQ1RfSTMyCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KEk2NCldID0gQ09NUEFDVF9JNjQKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoRE9VQkxFKV0gPSBDT01QQUNUX0RPVUJMRQotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChTVFJJTkcpXSA9IENPTVBBQ1RfQklOQVJZCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KExJU1QpXSA9IENPTVBBQ1RfTElTVAotICBfVFR5cGVUb0NvbXBhY3RUeXBlW2ludChTRVQpXSA9IENPTVBBQ1RfU0VUCi0gIF9UVHlwZVRvQ29tcGFjdFR5cGVbaW50KE1BUCldID0gQ09NUEFDVF9NQVAKLSAgX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQoU1RSVUNUKV0gPSBDT01QQUNUX1NUUlVDVAotfQotCi10eXBlIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IHN0cnVjdHt9Ci0KLWZ1bmMgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSAqVENvbXBhY3RQcm90b2NvbEZhY3RvcnkgewotICByZXR1cm4gJlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5e30KLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbEZhY3RvcnkpIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbCB7Ci0gIHJldHVybiBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQotfQotCi10eXBlIFRDb21wYWN0UHJvdG9jb2wgc3RydWN0IHsKLSAgdHJhbnMgVFRyYW5zcG9ydAotCi0gIC8qKiAKLSAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKLSAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KLSAgICovCi0gIGxhc3RGaWVsZCAgICp2ZWN0b3IuSW50VmVjdG9yCi0gIGxhc3RGaWVsZElkIGludAotCi0gIC8qKiAKLSAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuIAotICAgKiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAqLwotICBib29sZWFuRmllbGQgVEZpZWxkCi0KLSAgLyoqCi0gICAqIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbiAKLSAgICogdmFsdWUgaGVyZSBzbyB0aGF0IHJlYWRCb29sIGNhbiB1c2UgaXQuCi0gICAqLwotICBib29sVmFsdWUgICAgICAgICAgYm9vbAotICBib29sVmFsdWVJc05vdE51bGwgYm9vbAotfQotCi0vKioKLSAqIENyZWF0ZSBhIFRDb21wYWN0UHJvdG9jb2wuCi0gKgotICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgVFRyYW5zcG9ydCBvYmplY3QgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvLgotICovCi1mdW5jIE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgKlRDb21wYWN0UHJvdG9jb2wgewotICByZXR1cm4gJlRDb21wYWN0UHJvdG9jb2x7dHJhbnM6IHRyYW5zLCBsYXN0RmllbGQ6ICZ2ZWN0b3IuSW50VmVjdG9ye319Ci19Ci0KLQotLy8KLS8vIFB1YmxpYyBXcml0aW5nIG1ldGhvZHMuCi0vLwotCi0vKioKLSAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKLSAqIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxaWQgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdChDT01QQUNUX1BST1RPQ09MX0lEKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIF8sIGVyciA9IHAud3JpdGVCeXRlRGlyZWN0KChDT01QQUNUX1ZFUlNJT04gJiBDT01QQUNUX1ZFUlNJT05fTUFTSykgfCAoKGJ5dGUodHlwZUlkKSA8PCBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIENPTVBBQ1RfVFlQRV9NQVNLKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBfLCBlcnIgPSBwLndyaXRlVmFyaW50MzIoc2VxaWQpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpCi0gIHJldHVybiBlCi0KLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNZXNzYWdlRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsgcmV0dXJuIG5pbCB9Ci0KLS8qKgotICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIAotICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCi0gKiBzdGFjayBzbyB3ZSBjYW4gZ2V0IHRoZSBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcC5sYXN0RmllbGQuUHVzaChwLmxhc3RGaWVsZElkKQotICBwLmxhc3RGaWVsZElkID0gMAotICByZXR1cm4gbmlsCi19Ci0KLS8qKgotICogV3JpdGUgYSBzdHJ1Y3QgZW5kLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UKLSAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgotICogb2YgdGhlIGZpZWxkIHN0YWNrLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHAubGFzdEZpZWxkSWQgPSBwLmxhc3RGaWVsZC5Qb3AoKQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgdHlwZUlkID09IEJPT0wgewotICAgIC8vIHdlIHdhbnQgdG8gcG9zc2libHkgaW5jbHVkZSB0aGUgdmFsdWUsIHNvIHdlJ2xsIHdhaXQuCi0gICAgcC5ib29sZWFuRmllbGQgPSBOZXdURmllbGQobmFtZSwgdHlwZUlkLCBpbnQoaWQpKQotICAgIHJldHVybiBuaWwKLSAgfQotICBfLCBlcnIgOj0gcC53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlSWQsIGlkLCAweEZGKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0KLS8qKgotICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgCi0gKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZSAKLSAqIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYsIHR5cGVPdmVycmlkZSBieXRlKSAoaW50LCBvcy5FcnJvcikgewotICAvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLnBvcCgpOwotCi0gIC8vIGlmIHRoZXJlJ3MgYSB0eXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KLSAgdmFyIHR5cGVUb1dyaXRlIGJ5dGUKLSAgaWYgdHlwZU92ZXJyaWRlID09IDB4RkYgewotICAgIHR5cGVUb1dyaXRlID0gYnl0ZShwLmdldENvbXBhY3RUeXBlKHR5cGVJZCkpCi0gIH0gZWxzZSB7Ci0gICAgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUKLSAgfQotICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKLSAgZmllbGRJZCA6PSBpbnQoaWQpCi0gIHdyaXR0ZW4gOj0gMAotICBpZiBmaWVsZElkID4gcC5sYXN0RmllbGRJZCAmJiBmaWVsZElkLXAubGFzdEZpZWxkSWQgPD0gMTUgewotICAgIC8vIHdyaXRlIHRoZW0gdG9nZXRoZXIKLSAgICB3cml0dGVuLCBlcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoYnl0ZSgoZmllbGRJZC1wLmxhc3RGaWVsZElkKTw8NCkgfCB0eXBlVG9Xcml0ZSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB3cml0dGVuLCBlcnIKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gd3JpdGUgdGhlbSBzZXBhcmF0ZQotICAgIG4sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBuLCBlcnIKLSAgICB9Ci0gICAgZXJyID0gcC5Xcml0ZUkxNihpZCkKLSAgICB3cml0dGVuID0gbiArIDIKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB3cml0dGVuLCBlcnIKLSAgICB9Ci0gIH0KLQotICBwLmxhc3RGaWVsZElkID0gZmllbGRJZAotICAvLyBwLmxhc3RGaWVsZC5QdXNoKGZpZWxkLmlkKTsKLSAgcmV0dXJuIHdyaXR0ZW4sIG5pbAotfQotCi0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24geyByZXR1cm4gbmlsIH0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBfLCBlcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QoU1RPUCkKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBzaXplID09IDAgewotICAgIF8sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCgwKQotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgXywgZXJyIDo9IHAud3JpdGVWYXJpbnQzMihpbnQzMihzaXplKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBfLCBlcnIgPSBwLndyaXRlQnl0ZURpcmVjdChieXRlKHAuZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkpPDw0IHwgYnl0ZShwLmdldENvbXBhY3RUeXBlKHZhbHVlVHlwZSkpKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZU1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKioKLSAqIFdyaXRlIGEgbGlzdCBoZWFkZXIuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZXJyIDo9IHAud3JpdGVDb2xsZWN0aW9uQmVnaW4oZWxlbVR5cGUsIHNpemUpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKioKLSAqIFdyaXRlIGEgc2V0IGhlYWRlci4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTZXRCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGVyciA6PSBwLndyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlLCBzaXplKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZVNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJvb2wodmFsdWUgYm9vbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgdiA6PSBieXRlKENPTVBBQ1RfQk9PTEVBTl9GQUxTRSkKLSAgaWYgdmFsdWUgewotICAgIHYgPSBieXRlKENPTVBBQ1RfQk9PTEVBTl9UUlVFKQotICB9Ci0gIGlmIHAuYm9vbGVhbkZpZWxkICE9IG5pbCB7Ci0gICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0Ci0gICAgXywgZXJyIDo9IHAud3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwocC5ib29sZWFuRmllbGQuTmFtZSgpLCBwLmJvb2xlYW5GaWVsZC5UeXBlSWQoKSwgaW50MTYocC5ib29sZWFuRmllbGQuSWQoKSksIHYpCi0gICAgcC5ib29sZWFuRmllbGQgPSBuaWwKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3Qgd3JpdGUgdGhlIHZhbHVlLgotICBfLCBlcnIgOj0gcC53cml0ZUJ5dGVEaXJlY3QodikKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotLyoqIAotICogV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZUJ5dGUodmFsdWUgYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZXJyIDo9IHAud3JpdGVCeXRlRGlyZWN0KHZhbHVlKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0vKioKLSAqIFdyaXRlIGFuIEkxNiBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlSTE2KHZhbHVlIGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyhpbnQzMih2YWx1ZSkpKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0vKioKLSAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFdyaXRlSTMyKHZhbHVlIGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBfLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKHAuaW50MzJUb1ppZ3phZyh2YWx1ZSkpCi0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLS8qKgotICogV3JpdGUgYW4gaTY0IGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVJNjQodmFsdWUgaW50NjQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGVyciA6PSBwLndyaXRlVmFyaW50NjQocC5pbnQ2NFRvWmlnemFnKHZhbHVlKSkKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotLyoqCi0gKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBidWYgOj0gbWFrZShbXWJ5dGUsIDgpCi0gIGJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgbWF0aC5GbG9hdDY0Yml0cyh2YWx1ZSkpCi0gIF8sIGVyciA6PSBwLnRyYW5zLldyaXRlKGJ1ZikKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotLyoqCi0gKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VlZGluZy4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBidWYgOj0gbWFrZShbXWJ5dGUsIGxlbih2YWx1ZSkpCi0gIHN0cmluZ3MuTmV3UmVhZGVyKHZhbHVlKS5SZWFkKGJ1ZikKLSAgcmV0dXJuIHAuV3JpdGVCaW5hcnkoYnVmKQotfQotCi0vKioKLSAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLiAKLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgV3JpdGVCaW5hcnkoYmluIFtdYnl0ZSkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgXywgZSA6PSBwLndyaXRlVmFyaW50MzIoaW50MzIobGVuKGJpbikpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgaWYgbGVuKGJpbikgPiAwIHsKLSAgICBfLCBlID0gcC50cmFucy5Xcml0ZShiaW4pCi0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0KLS8vIAotLy8gUmVhZGluZyBtZXRob2RzLgotLy8gCi0KLS8qKgotICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLiAKLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcHJvdG9jb2xJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICBpZiBwcm90b2NvbElkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgewotICAgIHMgOj0gZm10LlNwcmludGYoIkV4cGVjdGVkIHByb3RvY29sIGlkICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9QUk9UT0NPTF9JRCwgcHJvdG9jb2xJZCkKLSAgICByZXR1cm4gIiIsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgcykKLSAgfQotICB2ZXJzaW9uQW5kVHlwZSwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICB2ZXJzaW9uIDo9IHZlcnNpb25BbmRUeXBlICYgQ09NUEFDVF9WRVJTSU9OX01BU0sKLSAgdHlwZUlkID0gVE1lc3NhZ2VUeXBlKCh2ZXJzaW9uQW5kVHlwZSA+PiBDT01QQUNUX1RZUEVfU0hJRlRfQU1PVU5UKSAmIDB4MDMpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybgotICB9Ci0gIGlmIHZlcnNpb24gIT0gQ09NUEFDVF9WRVJTSU9OIHsKLSAgICBzIDo9IGZtdC5TcHJpbnRmKCJFeHBlY3RlZCB2ZXJzaW9uICUwMnggYnV0IGdvdCAlMDJ4IiwgQ09NUEFDVF9WRVJTSU9OLCB2ZXJzaW9uKQotICAgIGVyciA9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgcykKLSAgICByZXR1cm4KLSAgfQotICBzZXFJZCwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIG5hbWUsIGVyciA9IHAuUmVhZFN0cmluZygpCi0gIHJldHVybgotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKioKLSAqIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgotICogb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcC5sYXN0RmllbGQuUHVzaChwLmxhc3RGaWVsZElkKQotICBwLmxhc3RGaWVsZElkID0gMAotICByZXR1cm4KLX0KLQotLyoqCi0gKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvciAKLSAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSByZWFkIG9mZiB0aGUgd2lyZS4KLSAgcC5sYXN0RmllbGRJZCA9IHAubGFzdEZpZWxkLlBvcCgpCi0gIHJldHVybiBuaWwKLX0KLQotLyoqCi0gKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHQsIGVyciA6PSBwLlJlYWRCeXRlKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuCi0gIH0KLQotICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCi0gIGlmICh0ICYgMHgwZikgPT0gU1RPUCB7Ci0gICAgcmV0dXJuIF9UU1RPUC5OYW1lKCksIF9UU1RPUC5UeXBlSWQoKSwgaW50MTYoX1RTVE9QLklkKCkpLCBuaWwKLSAgfQotCi0gIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KLSAgbW9kaWZpZXIgOj0gaW50MTYoKHQgJiAweGYwKSA+PiA0KQotICBpZiBtb2RpZmllciA9PSAwIHsKLSAgICAvLyBub3QgYSBkZWx0YS4gbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQuCi0gICAgaWQsIGVyciA9IHAuUmVhZEkxNigpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gaGFzIGEgZGVsdGEuIGFkZCB0aGUgZGVsdGEgdG8gdGhlIGxhc3QgcmVhZCBmaWVsZCBpZC4KLSAgICBpZCA9IGludDE2KHAubGFzdEZpZWxkSWQpICsgbW9kaWZpZXIKLSAgfQotICB0eXBlSWQsIGUgOj0gcC5nZXRUVHlwZShUQ29tcGFjdFR5cGUodCAmIDB4MGYpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotCi0gIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCi0gIGlmIHAuaXNCb29sVHlwZSh0KSB7Ci0gICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCi0gICAgcC5ib29sVmFsdWUgPSAoYnl0ZSh0KSYweDBmID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFKQotICAgIHAuYm9vbFZhbHVlSXNOb3ROdWxsID0gdHJ1ZQotICB9Ci0KLSAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCi0gIHAubGFzdEZpZWxkSWQgPSBpbnQoaWQpCi0gIHJldHVybgotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24geyByZXR1cm4gbmlsIH0KLQotLyoqIAotICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQotICogYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKLSAqICJjb3JyZWN0IiB0eXBlcy4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgc2l6ZTMyLCBlIDo9IHAucmVhZFZhcmludDMyKCkKLSAgc2l6ZSA9IGludChzaXplMzIpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICBlcnIgPSBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIHJldHVybgotICB9Ci0gIGtleUFuZFZhbHVlVHlwZSA6PSBieXRlKFNUT1ApCi0gIGlmIHNpemUgIT0gMCB7Ci0gICAga2V5QW5kVmFsdWVUeXBlLCBlcnIgPSBwLlJlYWRCeXRlKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybgotICAgIH0KLSAgfQotICBrZXlUeXBlLCBfID0gcC5nZXRUVHlwZShUQ29tcGFjdFR5cGUoa2V5QW5kVmFsdWVUeXBlID4+IDQpKQotICB2YWx1ZVR5cGUsIF8gPSBwLmdldFRUeXBlKFRDb21wYWN0VHlwZShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKQotICByZXR1cm4KLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZE1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKioKLSAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbCAKLSAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgotICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICogdHJ1ZSBzaXplLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkTGlzdEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBzaXplX2FuZF90eXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybgotICB9Ci0gIHNpemUgPSBpbnQoKHNpemVfYW5kX3R5cGUgPj4gNCkgJiAweDBmKQotICBpZiBzaXplID09IDE1IHsKLSAgICBzaXplMiwgZSA6PSBwLnJlYWRWYXJpbnQzMigpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgIHJldHVybgotICAgIH0KLSAgICBzaXplID0gaW50KHNpemUyKQotICB9Ci0gIGVsZW1UeXBlLCBlIDo9IHAuZ2V0VFR5cGUoVENvbXBhY3RUeXBlKHNpemVfYW5kX3R5cGUpKQotICBpZiBlICE9IG5pbCB7Ci0gICAgZXJyID0gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICByZXR1cm4KLSAgfQotICByZXR1cm4KLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZExpc3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24geyByZXR1cm4gbmlsIH0KLQotLyoqCi0gKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAotICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKLSAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKLSAqIHRydWUgc2l6ZS4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFNldEJlZ2luKCkgKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gcC5SZWFkTGlzdEJlZ2luKCkKLX0KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZFNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7IHJldHVybiBuaWwgfQotCi0vKioKLSAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKLSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlYWQgZHVyaW5nIHJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCi0gKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIHJlYWQgYSBieXRlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQm9vbCgpICh2YWx1ZSBib29sLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIHAuYm9vbFZhbHVlSXNOb3ROdWxsIHsKLSAgICBwLmJvb2xWYWx1ZUlzTm90TnVsbCA9IGZhbHNlCi0gICAgcmV0dXJuIHAuYm9vbFZhbHVlLCBuaWwKLSAgfQotICB2LCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIHJldHVybiB2ID09IENPTVBBQ1RfQk9PTEVBTl9UUlVFLCBlcnIKLX0KLQotLyoqCi0gKiBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRCeXRlKCkgKHZhbHVlIGJ5dGUsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgYnVmIDo9IFtdYnl0ZXswfQotICBfLCBlIDo9IHAudHJhbnMuUmVhZEFsbChidWYpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICByZXR1cm4gYnVmWzBdLCBuaWwKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGkxNiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBlcnIgOj0gcC5SZWFkSTMyKCkKLSAgcmV0dXJuIGludDE2KHYpLCBlcnIKLX0KLQotLyoqCi0gKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBlIDo9IHAucmVhZFZhcmludDMyKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiAwLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHZhbHVlID0gcC56aWd6YWdUb0ludDMyKHYpCi0gIHJldHVybiB2YWx1ZSwgbmlsCi19Ci0KLS8qKgotICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRJNjQoKSAodmFsdWUgaW50NjQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgZSA6PSBwLnJlYWRWYXJpbnQ2NCgpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4gMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICB2YWx1ZSA9IHAuemlnemFnVG9JbnQ2NCh2KQotICByZXR1cm4gdmFsdWUsIG5pbAotfQotCi0vKioKLSAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkRG91YmxlKCkgKHZhbHVlIGZsb2F0NjQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgbG9uZ0JpdHMgOj0gbWFrZShbXWJ5dGUsIDgpCi0gIF8sIGUgOj0gcC50cmFucy5SZWFkQWxsKGxvbmdCaXRzKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIDAuMCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICByZXR1cm4gbWF0aC5GbG9hdDY0ZnJvbWJpdHMocC5ieXRlc1RvVWludDY0KGxvbmdCaXRzKSksIG5pbAotfQotCi0vKioKLSAqIFJlYWRzIGEgW11ieXRlICh2aWEgcmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFJlYWRTdHJpbmcoKSAodmFsdWUgc3RyaW5nLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKLSAgcmV0dXJuIHN0cmluZyh2KSwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLX0KLQotLyoqCi0gKiBSZWFkIGEgW11ieXRlIGZyb20gdGhlIHdpcmUuIAotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBSZWFkQmluYXJ5KCkgKHZhbHVlIFtdYnl0ZSwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBsZW5ndGgsIGUgOj0gcC5yZWFkVmFyaW50MzIoKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIFtdYnl0ZXt9LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIGlmIGxlbmd0aCA9PSAwIHsKLSAgICByZXR1cm4gW11ieXRle30sIG5pbAotICB9Ci0KLSAgYnVmIDo9IG1ha2UoW11ieXRlLCBsZW5ndGgpCi0gIHAudHJhbnMuUmVhZEFsbChidWYpCi0gIHJldHVybiBidWYsIG5pbAotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBGbHVzaCgpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihwLnRyYW5zLkZsdXNoKCkpCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCi19Ci0KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgewotICByZXR1cm4gcC50cmFucwotfQotCi0vLwotLy8gSW50ZXJuYWwgd3JpdGluZyBtZXRob2RzCi0vLwotCi0vKioKLSAqIEFic3RyYWN0IG1ldGhvZCBmb3Igd3JpdGluZyB0aGUgc3RhcnQgb2YgbGlzdHMgYW5kIHNldHMuIExpc3QgYW5kIHNldHMgb24gCi0gKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgc2l6ZSA8PSAxNCB7Ci0gICAgcmV0dXJuIHAud3JpdGVCeXRlRGlyZWN0KGJ5dGUoaW50MzIoc2l6ZTw8NCkgfCBpbnQzMihwLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkpKQotICB9Ci0gIG4sIGVyciA6PSBwLndyaXRlQnl0ZURpcmVjdCgweGYwIHwgYnl0ZShwLmdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBuLCBlcnIKLSAgfQotICBtLCBlcnIgOj0gcC53cml0ZVZhcmludDMyKGludDMyKHNpemUpKQotICByZXR1cm4gbiArIG0sIGVycgotfQotCi0vKioKLSAqIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTUgYnl0ZXMgb24gdGhlIHdpcmUuCi0gKiBUT0RPKHBvbWFjayk6IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2Ugd3JpdGVWYXJpbnQ2ND8KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVWYXJpbnQzMihuIGludDMyKSAoaW50LCBvcy5FcnJvcikgewotICBpMzJidWYgOj0gbWFrZShbXWJ5dGUsIDUpCi0gIGlkeCA6PSAwCi0gIGZvciB7Ci0gICAgaWYgKG4gJiBeMHg3RikgPT0gMCB7Ci0gICAgICBpMzJidWZbaWR4XSA9IGJ5dGUobikKLSAgICAgIGlkeCsrCi0gICAgICAvLyBwLndyaXRlQnl0ZURpcmVjdChieXRlKG4pKTsKLSAgICAgIGJyZWFrCi0gICAgICAvLyByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGkzMmJ1ZltpZHhdID0gYnl0ZSgobiAmIDB4N0YpIHwgMHg4MCkKLSAgICAgIGlkeCsrCi0gICAgICAvLyBwLndyaXRlQnl0ZURpcmVjdChieXRlKCgobiAmIDB4N0YpIHwgMHg4MCkpKTsKLSAgICAgIHUgOj0gdWludDMyKG4pCi0gICAgICBuID0gaW50MzIodSA+PiA3KQotICAgIH0KLSAgfQotICByZXR1cm4gcC50cmFucy5Xcml0ZShpMzJidWZbMDppZHhdKQotfQotCi0vKioKLSAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB3cml0ZVZhcmludDY0KG4gaW50NjQpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHZhcmludDY0b3V0IDo9IG1ha2UoW11ieXRlLCAxMCkKLSAgaWR4IDo9IDAKLSAgZm9yIHsKLSAgICBpZiAobiAmIF4weDdGKSA9PSAwIHsKLSAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBieXRlKG4pCi0gICAgICBpZHgrKwotICAgICAgYnJlYWsKLSAgICB9IGVsc2UgewotICAgICAgdmFyaW50NjRvdXRbaWR4XSA9IGJ5dGUoKG4gJiAweDdGKSB8IDB4ODApCi0gICAgICBpZHgrKwotICAgICAgdSA6PSB1aW50NjQobikKLSAgICAgIG4gPSBpbnQ2NCh1ID4+IDcpCi0gICAgfQotICB9Ci0gIHJldHVybiBwLnRyYW5zLldyaXRlKHZhcmludDY0b3V0WzA6aWR4XSkKLX0KLQotLyoqCi0gKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAotICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBpbnQ2NFRvWmlnemFnKGwgaW50NjQpIGludDY0IHsKLSAgcmV0dXJuIChsIDw8IDEpIF4gKGwgPj4gNjMpCi19Ci0KLS8qKgotICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSAKLSAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgaW50MzJUb1ppZ3phZyhuIGludDMyKSBpbnQzMiB7Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBmaXhlZFVpbnQ2NFRvQnl0ZXMobiB1aW50NjQsIGJ1ZiBbXWJ5dGUpIHsKLSAgYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50NjQoYnVmLCBuKQotfQotCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBmaXhlZEludDY0VG9CeXRlcyhuIGludDY0LCBidWYgW11ieXRlKSB7Ci0gIGJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDY0KGJ1ZiwgdWludDY0KG4pKQotfQotCi0vKiogCi0gKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLiAKLSAqIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byB3cml0ZSBhIGJ5dGUuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHdyaXRlQnl0ZURpcmVjdChiIGJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBwLnRyYW5zLldyaXRlKFtdYnl0ZXtifSkKLX0KLQotLyoqIAotICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgd3JpdGVJbnRBc0J5dGVEaXJlY3QobiBpbnQpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBwLndyaXRlQnl0ZURpcmVjdChieXRlKG4pKQotfQotCi0KLS8vCi0vLyBJbnRlcm5hbCByZWFkaW5nIG1ldGhvZHMKLS8vCi0KLS8qKgotICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDUgYnl0ZXMuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHJlYWRWYXJpbnQzMigpIChpbnQzMiwgb3MuRXJyb3IpIHsKLSAgLy8gaWYgdGhlIHdpcmUgY29udGFpbnMgdGhlIHJpZ2h0IHN0dWZmLCB0aGlzIHdpbGwganVzdCB0cnVuY2F0ZSB0aGUgaTY0IHdlCi0gIC8vIHJlYWQgYW5kIGdldCB1cyB0aGUgcmlnaHQgc2lnbi4KLSAgdiwgZXJyIDo9IHAucmVhZFZhcmludDY0KCkKLSAgcmV0dXJuIGludDMyKHYpLCBlcnIKLX0KLQotCi0vKioKLSAqIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSBwcm9wZXIgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQgCi0gKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSByZWFkVmFyaW50NjQoKSAoaW50NjQsIG9zLkVycm9yKSB7Ci0gIHNoaWZ0IDo9IHVpbnQoMCkKLSAgcmVzdWx0IDo9IGludDY0KDApCi0gIGZvciB7Ci0gICAgYiwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIDAsIGVycgotICAgIH0KLSAgICByZXN1bHQgfD0gaW50NjQoYiYweDdmKSA8PCBzaGlmdAotICAgIGlmIChiICYgMHg4MCkgIT0gMHg4MCB7Ci0gICAgICBicmVhawotICAgIH0KLSAgICBzaGlmdCArPSA3Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdCwgbmlsCi19Ci0KLQotLy8KLS8vIGVuY29kaW5nIGhlbHBlcnMKLS8vCi0KLS8qKgotICogQ29udmVydCBmcm9tIHppZ3phZyBpbnQgdG8gaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSB6aWd6YWdUb0ludDMyKG4gaW50MzIpIGludDMyIHsKLSAgdSA6PSB1aW50MzIobikKLSAgcmV0dXJuIGludDMyKHU+PjEpIF4gLShuICYgMSkKLX0KLQotLyoqIAotICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCi0gKi8KLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIHppZ3phZ1RvSW50NjQobiBpbnQ2NCkgaW50NjQgewotICB1IDo9IHVpbnQ2NChuKQotICByZXR1cm4gaW50NjQodT4+MSkgXiAtKG4gJiAxKQotfQotCi0vKioKLSAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLCAKLSAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCi0gKiB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBieXRlc1RvSW50NjQoYiBbXWJ5dGUpIGludDY0IHsKLSAgcmV0dXJuIGludDY0KGJpbmFyeS5MaXR0bGVFbmRpYW4uVWludDY0KGIpKQotfQotCi0vKioKLSAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLCAKLSAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCi0gKiB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBieXRlc1RvVWludDY0KGIgW11ieXRlKSB1aW50NjQgewotICByZXR1cm4gYmluYXJ5LkxpdHRsZUVuZGlhbi5VaW50NjQoYikKLX0KLQotLy8KLS8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZwotLy8KLQotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgaXNCb29sVHlwZShiIGJ5dGUpIGJvb2wgewotICByZXR1cm4gKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX1RSVUUgfHwgKGImMHgwZikgPT0gQ09NUEFDVF9CT09MRUFOX0ZBTFNFCi19Ci0KLS8qKgotICogR2l2ZW4gYSBUQ29tcGFjdFR5cGUgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgCi0gKiBUVHlwZSB2YWx1ZS4KLSAqLwotZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgZ2V0VFR5cGUodCBUQ29tcGFjdFR5cGUpIChUVHlwZSwgb3MuRXJyb3IpIHsKLSAgc3dpdGNoIGJ5dGUodCkgJiAweDBmIHsKLSAgY2FzZSBTVE9QOgotICAgIHJldHVybiBTVE9QLCBuaWwKLSAgY2FzZSBDT01QQUNUX0JPT0xFQU5fRkFMU0U6Ci0gIGNhc2UgQ09NUEFDVF9CT09MRUFOX1RSVUU6Ci0gICAgcmV0dXJuIEJPT0wsIG5pbAotICBjYXNlIENPTVBBQ1RfQllURToKLSAgICByZXR1cm4gQllURSwgbmlsCi0gIGNhc2UgQ09NUEFDVF9JMTY6Ci0gICAgcmV0dXJuIEkxNiwgbmlsCi0gIGNhc2UgQ09NUEFDVF9JMzI6Ci0gICAgcmV0dXJuIEkzMiwgbmlsCi0gIGNhc2UgQ09NUEFDVF9JNjQ6Ci0gICAgcmV0dXJuIEk2NCwgbmlsCi0gIGNhc2UgQ09NUEFDVF9ET1VCTEU6Ci0gICAgcmV0dXJuIERPVUJMRSwgbmlsCi0gIGNhc2UgQ09NUEFDVF9CSU5BUlk6Ci0gICAgcmV0dXJuIFNUUklORywgbmlsCi0gIGNhc2UgQ09NUEFDVF9MSVNUOgotICAgIHJldHVybiBMSVNULCBuaWwKLSAgY2FzZSBDT01QQUNUX1NFVDoKLSAgICByZXR1cm4gU0VULCBuaWwKLSAgY2FzZSBDT01QQUNUX01BUDoKLSAgICByZXR1cm4gTUFQLCBuaWwKLSAgY2FzZSBDT01QQUNUX1NUUlVDVDoKLSAgICByZXR1cm4gU1RSVUNULCBuaWwKLSAgfQotICByZXR1cm4gU1RPUCwgTmV3VEV4Y2VwdGlvbigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICIgKyBzdHJpbmcodCYweDBmKSkKLX0KLQotLyoqCi0gKiBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgotICovCi1mdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBnZXRDb21wYWN0VHlwZSh0IFRUeXBlKSBUQ29tcGFjdFR5cGUgewotICByZXR1cm4gX1RUeXBlVG9Db21wYWN0VHlwZVtpbnQodCldCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rjb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3Rjb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMGUzOWMuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90Y29tcGFjdF9wcm90b2NvbF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgInRlc3RpbmciCi0gIC8vImJ5dGVzIjsKLSkKLQotZnVuYyBUZXN0UmVhZFdyaXRlQ29tcGFjdFByb3RvY29sKHQgKnRlc3RpbmcuVCkgewotICBSZWFkV3JpdGVQcm90b2NvbFRlc3QodCwgTmV3VENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKLSAgLyoKLSAgICAgdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnR7Ci0gICAgICAgTmV3VE1lbW9yeUJ1ZmZlcigpLCAKLSAgICAgICBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDE2Mzg0KSkpLAotICAgICAgIE5ld1RGcmFtZWRUcmFuc3BvcnQoTmV3VE1lbW9yeUJ1ZmZlcigpKSwKLSAgICAgfQotICAgICBmb3IgXywgdHJhbnMgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0gICAgICAgcCA6PSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLSAgICAgICBSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKTsKLSAgICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucyk7Ci0gICAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZUkxNih0LCBwLCB0cmFucyk7Ci0gICAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZUkzMih0LCBwLCB0cmFucyk7Ci0gICAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucyk7Ci0gICAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucyk7Ci0gICAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucyk7Ci0gICAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotICAgICAgIFJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucyk7Ci0gICAgICAgdHJhbnMuQ2xvc2UoKTsKLSAgICAgfQotICAqLwotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90Y29tcGFyZS5nbyBiL2xpYi9nby90aHJpZnQvdGNvbXBhcmUuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmVmNDQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90Y29tcGFyZS5nbworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB0aHJpZnQKLQotZnVuYyBDb21wYXJlSW50KGksIGogaW50KSBpbnQgewotICBpZiBpID4gaiB7Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBpIDwgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlSW50MTYoaSwgaiBpbnQxNikgaW50IHsKLSAgaWYgaSA+IGogewotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaSA8IGogewotICAgIHJldHVybiAtMQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZUludDMyKGksIGogaW50MzIpIGludCB7Ci0gIGlmIGkgPiBqIHsKLSAgICByZXR1cm4gMQotICB9Ci0gIGlmIGkgPCBqIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICByZXR1cm4gMAotfQotCi1mdW5jIENvbXBhcmVJbnQ2NChpLCBqIGludDMyKSBpbnQgewotICBpZiBpID4gaiB7Ci0gICAgcmV0dXJuIDEKLSAgfQotICBpZiBpIDwgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KLQotZnVuYyBDb21wYXJlU3RyaW5nQXJyYXkoaSwgaiBbXXN0cmluZykgaW50IHsKLSAgaWYgY21wIDo9IENvbXBhcmVJbnQobGVuKGkpLCBsZW4oaikpOyBjbXAgIT0gMCB7Ci0gICAgcmV0dXJuIGNtcAotICB9Ci0gIHNpemUgOj0gbGVuKGkpCi0gIGZvciBrIDo9IDA7IGsgPCBzaXplOyBrKysgewotICAgIGlmIGNtcCA6PSBDb21wYXJlU3RyaW5nKGlba10sIGpba10pOyBjbXAgIT0gMCB7Ci0gICAgICByZXR1cm4gY21wCi0gICAgfQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZVN0cmluZyhpLCBqIHN0cmluZykgaW50IHsKLSAgaWYgaSA+IGogewotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaSA8IGogewotICAgIHJldHVybiAtMQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZUZsb2F0KGksIGogZmxvYXQzMikgaW50IHsKLSAgaWYgaSA+IGogewotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaSA8IGogewotICAgIHJldHVybiAtMQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZURvdWJsZShpLCBqIGZsb2F0NjQpIGludCB7Ci0gIGlmIGkgPiBqIHsKLSAgICByZXR1cm4gMQotICB9Ci0gIGlmIGkgPCBqIHsKLSAgICByZXR1cm4gLTEKLSAgfQotICByZXR1cm4gMAotfQotCi1mdW5jIENvbXBhcmVCeXRlKGksIGogYnl0ZSkgaW50IHsKLSAgaWYgaSA+IGogewotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaSA8IGogewotICAgIHJldHVybiAtMQotICB9Ci0gIHJldHVybiAwCi19Ci0KLWZ1bmMgQ29tcGFyZUJvb2woaSwgaiBib29sKSBpbnQgewotICBpZiBpIHsKLSAgICBpZiBqIHsKLSAgICAgIHJldHVybiAwCi0gICAgfQotICAgIHJldHVybiAxCi0gIH0KLSAgaWYgaiB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIDAKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGNvbnRhaW5lci5nbyBiL2xpYi9nby90aHJpZnQvdGNvbnRhaW5lci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhM2NiYS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rjb250YWluZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB0aHJpZnQKLQotdHlwZSBUQ29udGFpbmVyIGludGVyZmFjZSB7Ci0gIExlbigpIGludAotICBDb250YWlucyhkYXRhIGludGVyZmFjZXt9KSBib29sCi0gIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbAotICBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RleGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3RleGNlcHRpb24uZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmNiZDUuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90ZXhjZXB0aW9uLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAib3MiCi0pCi0KLS8qKgotICogR2VuZXJpYyBleGNlcHRpb24gY2xhc3MgZm9yIFRocmlmdC4KLSAqCi0gKi8KLQotdHlwZSBURXhjZXB0aW9uIGludGVyZmFjZSB7Ci0gIFN0cmluZygpIHN0cmluZwotfQotCi10eXBlIHRFeGNlcHRpb24gc3RydWN0IHsKLSAgbWVzc2FnZSBzdHJpbmcKLX0KLQotZnVuYyAocCAqdEV4Y2VwdGlvbikgU3RyaW5nKCkgc3RyaW5nIHsKLSAgcmV0dXJuIHAubWVzc2FnZQotfQotCi1mdW5jIE5ld1RFeGNlcHRpb24obSBzdHJpbmcpIFRFeGNlcHRpb24gewotICByZXR1cm4gJnRFeGNlcHRpb257bWVzc2FnZTogbX0KLX0KLQotZnVuYyBOZXdURXhjZXB0aW9uRnJvbU9zRXJyb3IoZSBvcy5FcnJvcikgVEV4Y2VwdGlvbiB7Ci0gIGlmIGUgPT0gbmlsIHsKLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgdCwgb2sgOj0gZS4oVEV4Y2VwdGlvbikKLSAgaWYgb2sgewotICAgIHJldHVybiB0Ci0gIH0KLSAgcmV0dXJuIE5ld1RFeGNlcHRpb24oZS5TdHJpbmcoKSkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGV4Y2VwdGlvbl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90ZXhjZXB0aW9uX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjNjZGQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90ZXhjZXB0aW9uX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAib3MiCi0gICJ0ZXN0aW5nIgotKQotCi0KLWZ1bmMgVGVzdFRFeGNlcHRpb24odCAqdGVzdGluZy5UKSB7Ci0gIGV4YyA6PSBOZXdURXhjZXB0aW9uKCIiKQotICBpZiBleGMuU3RyaW5nKCkgIT0gIiIgewotICAgIHQuRmF0YWxmKCJFeHBlY3RlZCBlbXB0eSBzdHJpbmcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5TdHJpbmcoKSkKLSAgfQotICBleGMgPSBOZXdURXhjZXB0aW9uRnJvbU9zRXJyb3Iob3MuRU9GKQotICBpZiBleGMuU3RyaW5nKCkgIT0gb3MuRU9GLlN0cmluZygpIHsKLSAgICB0LkZhdGFsZigiRXhwZWN0ZWQgJyVzJywgYnV0IGZvdW5kICclcyciLCBvcy5FT0YuU3RyaW5nKCksIGV4Yy5TdHJpbmcoKSkKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90ZmllbGQuZ28gYi9saWIvZ28vdGhyaWZ0L3RmaWVsZC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkOWI4OS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RmaWVsZC5nbworKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJzb3J0IgotKQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyBmaWVsZCBtZXRhZGF0YS4KLSAqCi0gKi8KLXR5cGUgVEZpZWxkIGludGVyZmFjZSB7Ci0gIE5hbWUoKSBzdHJpbmcKLSAgVHlwZUlkKCkgVFR5cGUKLSAgSWQoKSBpbnQKLSAgU3RyaW5nKCkgc3RyaW5nCi0gIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkKLSAgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sCi19Ci0KLXR5cGUgdEZpZWxkIHN0cnVjdCB7Ci0gIG5hbWUgICBzdHJpbmcKLSAgdHlwZUlkIFRUeXBlCi0gIGlkICAgICBpbnQKLX0KLQotZnVuYyBOZXdURmllbGREZWZhdWx0KCkgVEZpZWxkIHsKLSAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRAotfQotCi1mdW5jIE5ld1RGaWVsZChuIHN0cmluZywgdCBUVHlwZSwgaSBpbnQpIFRGaWVsZCB7Ci0gIHJldHVybiAmdEZpZWxke25hbWU6IG4sIHR5cGVJZDogdCwgaWQ6IGl9Ci19Ci0KLWZ1bmMgKHAgKnRGaWVsZCkgTmFtZSgpIHN0cmluZyB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gIiIKLSAgfQotICByZXR1cm4gcC5uYW1lCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZCkgVHlwZUlkKCkgVFR5cGUgewotICBpZiBwID09IG5pbCB7Ci0gICAgcmV0dXJuIFRUeXBlKFZPSUQpCi0gIH0KLSAgcmV0dXJuIHAudHlwZUlkCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZCkgSWQoKSBpbnQgewotICBpZiBwID09IG5pbCB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgcmV0dXJuIHAuaWQKLX0KLQotZnVuYyAocCAqdEZpZWxkKSBTdHJpbmcoKSBzdHJpbmcgewotICBpZiBwID09IG5pbCB7Ci0gICAgcmV0dXJuICI8bmlsPiIKLSAgfQotICByZXR1cm4gIjxURmllbGQgbmFtZTonIiArIHAubmFtZSArICInIHR5cGU6IiArIHN0cmluZyhwLnR5cGVJZCkgKyAiIGZpZWxkLWlkOiIgKyBzdHJpbmcocC5pZCkgKyAiPiIKLX0KLQotZnVuYyAocCAqdEZpZWxkKSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIGRhdGEsIG9rIDo9IG90aGVyLihURmllbGQpOyBvayB7Ci0gICAgaWYgcC5JZCgpICE9IGRhdGEuSWQoKSB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChwLklkKCksIGRhdGEuSWQoKSksIHRydWUKLSAgICB9Ci0gICAgaWYgcC5UeXBlSWQoKSAhPSBkYXRhLlR5cGVJZCgpIHsKLSAgICAgIHJldHVybiBDb21wYXJlQnl0ZShieXRlKHAuVHlwZUlkKCkpLCBieXRlKGRhdGEuVHlwZUlkKCkpKSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gQ29tcGFyZVN0cmluZyhwLk5hbWUoKSwgZGF0YS5OYW1lKCkpLCB0cnVlCi0gIH0KLSAgcmV0dXJuIDAsIGZhbHNlCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZCkgRXF1YWxzKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgaWYgcCA9PSBuaWwgewotICAgIHJldHVybiBvdGhlciA9PSBuaWwKLSAgfQotICBpZiBvdGhlciA9PSBuaWwgewotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIGlmIGRhdGEsIG9rIDo9IG90aGVyLihURmllbGQpOyBvayB7Ci0gICAgcmV0dXJuIHAuVHlwZUlkKCkgPT0gZGF0YS5UeXBlSWQoKSAmJiBwLklkKCkgPT0gZGF0YS5JZCgpCi0gIH0KLSAgcmV0dXJuIGZhbHNlCi19Ci0KLXZhciBBTk9OWU1PVVNfRklFTEQgVEZpZWxkCi0KLXR5cGUgdEZpZWxkQXJyYXkgW11URmllbGQKLQotZnVuYyAocCB0RmllbGRBcnJheSkgTGVuKCkgaW50IHsKLSAgcmV0dXJuIGxlbihwKQotfQotCi1mdW5jIChwIHRGaWVsZEFycmF5KSBMZXNzKGksIGogaW50KSBib29sIHsKLSAgcmV0dXJuIHBbaV0uSWQoKSA8IHBbal0uSWQoKQotfQotCi1mdW5jIChwIHRGaWVsZEFycmF5KSBTd2FwKGksIGogaW50KSB7Ci0gIHBbaV0sIHBbal0gPSBwW2pdLCBwW2ldCi19Ci0KLXR5cGUgVEZpZWxkQ29udGFpbmVyIGludGVyZmFjZSB7Ci0gIFRDb250YWluZXIKLSAgRmllbGROYW1lRnJvbUZpZWxkSWQoaWQgaW50KSBzdHJpbmcKLSAgRmllbGRJZEZyb21GaWVsZE5hbWUobmFtZSBzdHJpbmcpIGludAotICBGaWVsZEZyb21GaWVsZElkKGlkIGludCkgVEZpZWxkCi0gIEZpZWxkRnJvbUZpZWxkTmFtZShuYW1lIHN0cmluZykgVEZpZWxkCi0gIEF0KGkgaW50KSBURmllbGQKLSAgSXRlcigpIDwtY2hhbiBURmllbGQKLX0KLQotdHlwZSB0RmllbGRDb250YWluZXIgc3RydWN0IHsKLSAgZmllbGRzICAgICAgICAgW11URmllbGQKLSAgbmFtZVRvRmllbGRNYXAgbWFwW3N0cmluZ11URmllbGQKLSAgaWRUb0ZpZWxkTWFwICAgbWFwW2ludF1URmllbGQKLX0KLQotZnVuYyBOZXdURmllbGRDb250YWluZXIoZmllbGRzIFtdVEZpZWxkKSBURmllbGRDb250YWluZXIgewotICBzb3J0ZWRGaWVsZHMgOj0gbWFrZShbXVRGaWVsZCwgbGVuKGZpZWxkcykpCi0gIG5hbWVUb0ZpZWxkTWFwIDo9IG1ha2UobWFwW3N0cmluZ11URmllbGQpCi0gIGlkVG9GaWVsZE1hcCA6PSBtYWtlKG1hcFtpbnRdVEZpZWxkKQotICBmb3IgaSwgZmllbGQgOj0gcmFuZ2UgZmllbGRzIHsKLSAgICBzb3J0ZWRGaWVsZHNbaV0gPSBmaWVsZAotICAgIGlkVG9GaWVsZE1hcFtmaWVsZC5JZCgpXSA9IGZpZWxkCi0gICAgaWYgZmllbGQuTmFtZSgpICE9ICIiIHsKLSAgICAgIG5hbWVUb0ZpZWxkTWFwW2ZpZWxkLk5hbWUoKV0gPSBmaWVsZAotICAgIH0KLSAgfQotICBzb3J0LlNvcnQodEZpZWxkQXJyYXkoc29ydGVkRmllbGRzKSkKLSAgcmV0dXJuICZ0RmllbGRDb250YWluZXJ7Ci0gICAgZmllbGRzOiAgICAgICAgIGZpZWxkcywKLSAgICBuYW1lVG9GaWVsZE1hcDogbmFtZVRvRmllbGRNYXAsCi0gICAgaWRUb0ZpZWxkTWFwOiAgIGlkVG9GaWVsZE1hcCwKLSAgfQotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIEZpZWxkTmFtZUZyb21GaWVsZElkKGlkIGludCkgc3RyaW5nIHsKLSAgaWYgZmllbGQsIG9rIDo9IHAuaWRUb0ZpZWxkTWFwW2lkXTsgb2sgewotICAgIHJldHVybiBmaWVsZC5OYW1lKCkKLSAgfQotICByZXR1cm4gIiIKLX0KLQotZnVuYyAocCAqdEZpZWxkQ29udGFpbmVyKSBGaWVsZElkRnJvbUZpZWxkTmFtZShuYW1lIHN0cmluZykgaW50IHsKLSAgaWYgZmllbGQsIG9rIDo9IHAubmFtZVRvRmllbGRNYXBbbmFtZV07IG9rIHsKLSAgICByZXR1cm4gZmllbGQuSWQoKQotICB9Ci0gIHJldHVybiAtMQotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIEZpZWxkRnJvbUZpZWxkSWQoaWQgaW50KSBURmllbGQgewotICBpZiBmaWVsZCwgb2sgOj0gcC5pZFRvRmllbGRNYXBbaWRdOyBvayB7Ci0gICAgcmV0dXJuIGZpZWxkCi0gIH0KLSAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRAotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIEZpZWxkRnJvbUZpZWxkTmFtZShuYW1lIHN0cmluZykgVEZpZWxkIHsKLSAgaWYgZmllbGQsIG9rIDo9IHAubmFtZVRvRmllbGRNYXBbbmFtZV07IG9rIHsKLSAgICByZXR1cm4gZmllbGQKLSAgfQotICByZXR1cm4gQU5PTllNT1VTX0ZJRUxECi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgTGVuKCkgaW50IHsKLSAgcmV0dXJuIGxlbihwLmZpZWxkcykKLX0KLQotZnVuYyAocCAqdEZpZWxkQ29udGFpbmVyKSBBdChpIGludCkgVEZpZWxkIHsKLSAgcmV0dXJuIHAuRmllbGRGcm9tRmllbGRJZChpKQotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIENvbnRhaW5zKGRhdGEgaW50ZXJmYWNle30pIGJvb2wgewotICBpZiBpLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgZm9yIF8sIGZpZWxkIDo9IHJhbmdlIHAuZmllbGRzIHsKLSAgICAgIGlmIGZpZWxkLklkKCkgPT0gaSB7Ci0gICAgICAgIHJldHVybiB0cnVlCi0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgaSwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgZm9yIF8sIGZpZWxkIDo9IHJhbmdlIHAuZmllbGRzIHsKLSAgICAgIGlmIGZpZWxkLklkKCkgPT0gaW50KGkpIHsKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiBzLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgZm9yIF8sIGZpZWxkIDo9IHJhbmdlIHAuZmllbGRzIHsKLSAgICAgIGlmIGZpZWxkLk5hbWUoKSA9PSBzIHsKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiBmLCBvayA6PSBkYXRhLihURmllbGQpOyBvayB7Ci0gICAgZm9yIF8sIGZpZWxkIDo9IHJhbmdlIHAuZmllbGRzIHsKLSAgICAgIGlmIGZpZWxkLkVxdWFscyhmKSB7Ci0gICAgICAgIHJldHVybiB0cnVlCi0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGlmIG90aGVyID09IG5pbCB7Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgaWYgZGF0YSwgb2sgOj0gb3RoZXIuKFRGaWVsZENvbnRhaW5lcik7IG9rIHsKLSAgICBpZiBwLkxlbigpICE9IGRhdGEuTGVuKCkgewotICAgICAgcmV0dXJuIGZhbHNlCi0gICAgfQotICAgIGZvciBfLCBmaWVsZCA6PSByYW5nZSBwLmZpZWxkcyB7Ci0gICAgICBpZiAhZGF0YS5Db250YWlucyhmaWVsZCkgewotICAgICAgICByZXR1cm4gZmFsc2UKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWUKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCAqdEZpZWxkQ29udGFpbmVyKSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIGRhdGEsIG9rIDo9IG90aGVyLihURmllbGRDb250YWluZXIpOyBvayB7Ci0gICAgY29udCwgb2syIDo9IGRhdGEuKCp0RmllbGRDb250YWluZXIpCi0gICAgaWYgb2syICYmIHAgPT0gY29udCB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICBpZiBjbXAgOj0gQ29tcGFyZUludChwLkxlbigpLCBkYXRhLkxlbigpKTsgY21wICE9IDAgewotICAgICAgcmV0dXJuIGNtcCwgdHJ1ZQotICAgIH0KLSAgICBmb3IgXywgZmllbGQgOj0gcmFuZ2UgcC5maWVsZHMgewotICAgICAgaWYgY21wLCBvazMgOj0gZmllbGQuQ29tcGFyZVRvKGRhdGEuQXQoZmllbGQuSWQoKSkpOyAhb2szIHx8IGNtcCAhPSAwIHsKLSAgICAgICAgcmV0dXJuIGNtcCwgb2szCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwLCB0cnVlCi0gIH0KLSAgcmV0dXJuIDAsIGZhbHNlCi19Ci0KLWZ1bmMgKHAgKnRGaWVsZENvbnRhaW5lcikgSXRlcigpIDwtY2hhbiBURmllbGQgewotICBjIDo9IG1ha2UoY2hhbiBURmllbGQpCi0gIGdvIHAuaXRlcmF0ZShjKQotICByZXR1cm4gYwotfQotCi1mdW5jIChwICp0RmllbGRDb250YWluZXIpIGl0ZXJhdGUoYyBjaGFuPC0gVEZpZWxkKSB7Ci0gIGZvciBfLCB2IDo9IHJhbmdlIHAuZmllbGRzIHsKLSAgICBjIDwtIHYKLSAgfQotICBjbG9zZShjKQotfQotCi1mdW5jIGluaXQoKSB7Ci0gIEFOT05ZTU9VU19GSUVMRCA9IE5ld1RGaWVsZCgiIiwgU1RPUCwgMCkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGZyYW1lZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RmcmFtZWRfdHJhbnNwb3J0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA0OWNiLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGZyYW1lZF90cmFuc3BvcnQuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiZW5jb2RpbmcvYmluYXJ5IgotICAiYnl0ZXMiCi0gICJvcyIKLSkKLQotCi10eXBlIFRGcmFtZWRUcmFuc3BvcnQgc3RydWN0IHsKLSAgdHJhbnNwb3J0ICAgVFRyYW5zcG9ydAotICB3cml0ZUJ1ZmZlciAqYnl0ZXMuQnVmZmVyCi0gIHJlYWRCdWZmZXIgICpieXRlcy5CdWZmZXIKLX0KLQotdHlwZSB0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewotICBmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5Ci19Ci0KLWZ1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgVFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5e2ZhY3Rvcnk6IGZhY3Rvcnl9Ci19Ci0KLWZ1bmMgKHAgKnRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQoYmFzZSBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnQocC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKSkKLX0KLQotZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCBUVHJhbnNwb3J0KSAqVEZyYW1lZFRyYW5zcG9ydCB7Ci0gIHdyaXRlQnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQotICByZWFkQnVmIDo9IG1ha2UoW11ieXRlLCAwLCAxMDI0KQotICByZXR1cm4gJlRGcmFtZWRUcmFuc3BvcnR7dHJhbnNwb3J0OiB0cmFuc3BvcnQsIHdyaXRlQnVmZmVyOiBieXRlcy5OZXdCdWZmZXIod3JpdGVCdWYpLCByZWFkQnVmZmVyOiBieXRlcy5OZXdCdWZmZXIocmVhZEJ1Zil9Ci19Ci0KLWZ1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIE9wZW4oKSBvcy5FcnJvciB7Ci0gIHJldHVybiBwLnRyYW5zcG9ydC5PcGVuKCkKLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7Ci0gIHJldHVybiBwLnRyYW5zcG9ydC5Jc09wZW4oKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLnRyYW5zcG9ydC5QZWVrKCkKLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgQ2xvc2UoKSBvcy5FcnJvciB7Ci0gIHJldHVybiBwLnRyYW5zcG9ydC5DbG9zZSgpCi19Ci0KLWZ1bmMgKHAgKlRGcmFtZWRUcmFuc3BvcnQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgcC5yZWFkQnVmZmVyLkxlbigpID4gMCB7Ci0gICAgZ290LCBlcnIgOj0gcC5yZWFkQnVmZmVyLlJlYWQoYnVmKQotICAgIGlmIGdvdCA+IDAgewotICAgICAgcmV0dXJuIGdvdCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gIH0KLQotICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQotICBwLnJlYWRGcmFtZSgpCi0KLSAgZ290LCBlcnIgOj0gcC5yZWFkQnVmZmVyLlJlYWQoYnVmKQotICByZXR1cm4gZ290LCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi1mdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBSZWFkQWxsKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBSZWFkQWxsVHJhbnNwb3J0KHAsIGJ1ZikKLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgbiwgZXJyIDo9IHAud3JpdGVCdWZmZXIuV3JpdGUoYnVmKQotICByZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgRmx1c2goKSBvcy5FcnJvciB7Ci0gIHNpemUgOj0gcC53cml0ZUJ1ZmZlci5MZW4oKQotICBidWYgOj0gW11ieXRlezAsIDAsIDAsIDB9Ci0gIGJpbmFyeS5CaWdFbmRpYW4uUHV0VWludDMyKGJ1ZiwgdWludDMyKHNpemUpKQotICBfLCBlcnIgOj0gcC50cmFuc3BvcnQuV3JpdGUoYnVmKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBpZiBzaXplID4gMCB7Ci0gICAgbiwgZXJyIDo9IHAud3JpdGVCdWZmZXIuV3JpdGVUbyhwLnRyYW5zcG9ydCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHByaW50KCJFcnJvciB3aGlsZSBmbHVzaGluZyB3cml0ZSBidWZmZXIgb2Ygc2l6ZSAiLCBzaXplLCAiIHRvIHRyYW5zcG9ydCwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gIH0KLSAgZXJyID0gcC50cmFuc3BvcnQuRmx1c2goKQotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgcmVhZEZyYW1lKCkgKGludCwgb3MuRXJyb3IpIHsKLSAgYnVmIDo9IFtdYnl0ZXswLCAwLCAwLCAwfQotICBfLCBlcnIgOj0gcC50cmFuc3BvcnQuUmVhZEFsbChidWYpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAwLCBlcnIKLSAgfQotICBzaXplIDo9IGludChiaW5hcnkuQmlnRW5kaWFuLlVpbnQzMihidWYpKQotICBpZiBzaXplIDwgMCB7Ci0gICAgLy8gVE9ETyhwb21hY2spIGxvZyBlcnJvcgotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiK3N0cmluZyhzaXplKSsiKSIpCi0gIH0KLSAgaWYgc2l6ZSA9PSAwIHsKLSAgICByZXR1cm4gMCwgbmlsCi0gIH0KLSAgYnVmMiA6PSBtYWtlKFtdYnl0ZSwgc2l6ZSkKLSAgbiwgZXJyIDo9IHAudHJhbnNwb3J0LlJlYWRBbGwoYnVmMikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG4sIGVycgotICB9Ci0gIHAucmVhZEJ1ZmZlciA9IGJ5dGVzLk5ld0J1ZmZlcihidWYyKQotICByZXR1cm4gc2l6ZSwgbmlsCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RmcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RmcmFtZWRfdHJhbnNwb3J0X3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjMxOGMuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90ZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgInRlc3RpbmciCi0pCi0KLWZ1bmMgVGVzdEZyYW1lZFRyYW5zcG9ydCh0ICp0ZXN0aW5nLlQpIHsKLSAgdHJhbnMgOj0gTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpCi0gIFRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90aHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RodHRwX2NsaWVudC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNGIyOC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RodHRwX2NsaWVudC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJieXRlcyIKLSAgImh0dHAiCi0gICJvcyIKLSAgInN0cmNvbnYiCi0gICJ1cmwiCi0pCi0KLQotdHlwZSBUSHR0cENsaWVudCBzdHJ1Y3QgewotICByZXNwb25zZSAgICAgICAgICAgKmh0dHAuUmVzcG9uc2UKLSAgdXJsICAgICAgICAgICAgICAgICp1cmwuVVJMCi0gIHJlcXVlc3RCdWZmZXIgICAgICAqYnl0ZXMuQnVmZmVyCi0gIG5zZWNDb25uZWN0VGltZW91dCBpbnQ2NAotICBuc2VjUmVhZFRpbWVvdXQgICAgaW50NjQKLX0KLQotdHlwZSBUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0IHsKLSAgdXJsICAgIHN0cmluZwotICBpc1Bvc3QgYm9vbAotfQotCi1mdW5jIChwICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgaWYgdHJhbnMgIT0gbmlsIHsKLSAgICB0LCBvayA6PSB0cmFucy4oKlRIdHRwQ2xpZW50KQotICAgIGlmIG9rICYmIHQudXJsICE9IG5pbCB7Ci0gICAgICBpZiB0LnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKLSAgICAgICAgdDIsIF8gOj0gTmV3VEh0dHBQb3N0Q2xpZW50KHQudXJsLlN0cmluZygpKQotICAgICAgICByZXR1cm4gdDIKLSAgICAgIH0KLSAgICAgIHQyLCBfIDo9IE5ld1RIdHRwQ2xpZW50KHQudXJsLlN0cmluZygpKQotICAgICAgcmV0dXJuIHQyCi0gICAgfQotICB9Ci0gIGlmIHAuaXNQb3N0IHsKLSAgICBzLCBfIDo9IE5ld1RIdHRwUG9zdENsaWVudChwLnVybCkKLSAgICByZXR1cm4gcwotICB9Ci0gIHMsIF8gOj0gTmV3VEh0dHBDbGllbnQocC51cmwpCi0gIHJldHVybiBzCi19Ci0KLWZ1bmMgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgaXNQb3N0OiBmYWxzZX0KLX0KLQotZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotICByZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgaXNQb3N0OiB0cnVlfQotfQotCi0KLWZ1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIG9zLkVycm9yKSB7Ci0gIHBhcnNlZFVSTCwgZXJyIDo9IHVybC5QYXJzZSh1cmxzdHIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIGVycgotICB9Ci0gIHJlc3BvbnNlLCBlcnIgOj0gaHR0cC5HZXQodXJsc3RyKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmlsLCBlcnIKLSAgfQotICByZXR1cm4gJlRIdHRwQ2xpZW50e3Jlc3BvbnNlOiByZXNwb25zZSwgdXJsOiBwYXJzZWRVUkx9LCBuaWwKLX0KLQotZnVuYyBOZXdUSHR0cFBvc3RDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIG9zLkVycm9yKSB7Ci0gIHBhcnNlZFVSTCwgZXJyIDo9IHVybC5QYXJzZSh1cmxzdHIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIGVycgotICB9Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgMTAyNCkKLSAgcmV0dXJuICZUSHR0cENsaWVudHt1cmw6IHBhcnNlZFVSTCwgcmVxdWVzdEJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKGJ1Zil9LCBuaWwKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIE9wZW4oKSBvcy5FcnJvciB7Ci0gIC8vIGRvIG5vdGhpbmcKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUSHR0cENsaWVudCkgSXNPcGVuKCkgYm9vbCB7Ci0gIHJldHVybiBwLnJlc3BvbnNlICE9IG5pbCB8fCBwLnJlcXVlc3RCdWZmZXIgIT0gbmlsCi19Ci0KLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBDbG9zZSgpIG9zLkVycm9yIHsKLSAgaWYgcC5yZXNwb25zZSAhPSBuaWwgJiYgcC5yZXNwb25zZS5Cb2R5ICE9IG5pbCB7Ci0gICAgZXJyIDo9IHAucmVzcG9uc2UuQm9keS5DbG9zZSgpCi0gICAgcC5yZXNwb25zZSA9IG5pbAotICAgIHJldHVybiBlcnIKLSAgfQotICBpZiBwLnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKLSAgICBwLnJlcXVlc3RCdWZmZXIuUmVzZXQoKQotICAgIHAucmVxdWVzdEJ1ZmZlciA9IG5pbAotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgcC5yZXNwb25zZSA9PSBuaWwgewotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LiIpCi0gIH0KLSAgbiwgZXJyIDo9IHAucmVzcG9uc2UuQm9keS5SZWFkKGJ1ZikKLSAgcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBSZWFkQWxsKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBSZWFkQWxsVHJhbnNwb3J0KHAsIGJ1ZikKLX0KLQotZnVuYyAocCAqVEh0dHBDbGllbnQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIG4sIGVyciA6PSBwLnJlcXVlc3RCdWZmZXIuV3JpdGUoYnVmKQotICByZXR1cm4gbiwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgcmVzcG9uc2UsIGVyciA6PSBodHRwLlBvc3QocC51cmwuU3RyaW5nKCksICJhcHBsaWNhdGlvbi94LXRocmlmdCIsIHAucmVxdWVzdEJ1ZmZlcikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgaWYgcmVzcG9uc2UuU3RhdHVzQ29kZSAhPSBodHRwLlN0YXR1c09LIHsKLSAgICAvLyBUT0RPKHBvbWFjaykgbG9nIGJhZCByZXNwb25zZQotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIkhUVFAgUmVzcG9uc2UgY29kZTogIisgc3RyY29udi5JdG9hKHJlc3BvbnNlLlN0YXR1c0NvZGUpKQotICB9Ci0gIHAucmVzcG9uc2UgPSByZXNwb25zZQotICByZXR1cm4gbmlsCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RodHRwX2NsaWVudF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90aHR0cF9jbGllbnRfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRkMmY1MC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RodHRwX2NsaWVudF90ZXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgInRlc3RpbmciCi0pCi0KLWZ1bmMgVGVzdEh0dHBDbGllbnQodCAqdGVzdGluZy5UKSB7Ci0gIGwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQotICBpZiBsICE9IG5pbCB7Ci0gICAgZGVmZXIgbC5DbG9zZSgpCi0gIH0KLSAgdHJhbnMsIGVyciA6PSBOZXdUSHR0cFBvc3RDbGllbnQoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgbC5DbG9zZSgpCi0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBjb25uZWN0IHRvICVzOiAlcyIsIGFkZHIuU3RyaW5nKCksIGVycikKLSAgfQotICBUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdGlvc3RyZWFtX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvdGlvc3RyZWFtX3RyYW5zcG9ydC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0YmVlYS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rpb3N0cmVhbV90cmFuc3BvcnQuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiYnVmaW8iCi0gICJpbyIKLSAgIm9zIgotKQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBiYXNlIHRyYW5zcG9ydC4gSXQgdGFrZXMgYW4gSW5wdXRTdHJlYW0KLSAqIGFuZCBhbiBPdXRwdXRTdHJlYW0gYW5kIHVzZXMgdGhvc2UgdG8gcGVyZm9ybSBhbGwgdHJhbnNwb3J0IG9wZXJhdGlvbnMuCi0gKiBUaGlzIGFsbG93cyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCB0aGUgbmljZSBjb25zdHJ1Y3RzIEphdmEgYWxyZWFkeQotICogaGFzIHRvIHByb3ZpZGUgYSB2YXJpZXR5IG9mIHR5cGVzIG9mIHN0cmVhbXMuCi0gKgotICovCi10eXBlIFRJT1N0cmVhbVRyYW5zcG9ydCBzdHJ1Y3QgewotICBSZWFkZXIgICAgICAgaW8uUmVhZGVyCi0gIFdyaXRlciAgICAgICBpby5Xcml0ZXIKLSAgSXNSZWFkV3JpdGVyIGJvb2wKLX0KLQotdHlwZSBUSU9TdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0gIFJlYWRlciAgICAgICBpby5SZWFkZXIKLSAgV3JpdGVyICAgICAgIGlvLldyaXRlcgotICBJc1JlYWRXcml0ZXIgYm9vbAotfQotCi1mdW5jIChwICpUSU9TdHJlYW1UcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0gIGlmIHRyYW5zICE9IG5pbCB7Ci0gICAgdCwgb2sgOj0gdHJhbnMuKCpUSU9TdHJlYW1UcmFuc3BvcnQpCi0gICAgaWYgb2sgewotICAgICAgaWYgdC5Jc1JlYWRXcml0ZXIgewotICAgICAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0UlcodC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKQotICAgICAgfQotICAgICAgaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSQW5kVyh0LlJlYWRlciwgdC5Xcml0ZXIpCi0gICAgICB9Ci0gICAgICBpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgPT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFIodC5SZWFkZXIpCi0gICAgICB9Ci0gICAgICBpZiB0LlJlYWRlciA9PSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFcodC5Xcml0ZXIpCi0gICAgICB9Ci0gICAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0RGVmYXVsdCgpCi0gICAgfQotICB9Ci0gIGlmIHAuSXNSZWFkV3JpdGVyIHsKLSAgICByZXR1cm4gTmV3VElPU3RyZWFtVHJhbnNwb3J0UlcocC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKQotICB9Ci0gIGlmIHAuUmVhZGVyICE9IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSQW5kVyhwLlJlYWRlciwgcC5Xcml0ZXIpCi0gIH0KLSAgaWYgcC5SZWFkZXIgIT0gbmlsICYmIHAuV3JpdGVyID09IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpCi0gIH0KLSAgaWYgcC5SZWFkZXIgPT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFcocC5Xcml0ZXIpCi0gIH0KLSAgcmV0dXJuIE5ld1RJT1N0cmVhbVRyYW5zcG9ydERlZmF1bHQoKQotfQotCi1mdW5jIE5ld1RJT1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkocmVhZGVyIGlvLlJlYWRlciwgd3JpdGVyIGlvLldyaXRlciwgaXNSZWFkV3JpdGVyIGJvb2wpICpUSU9TdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuICZUSU9TdHJlYW1UcmFuc3BvcnRGYWN0b3J5e1JlYWRlcjogcmVhZGVyLCBXcml0ZXI6IHdyaXRlciwgSXNSZWFkV3JpdGVyOiBpc1JlYWRXcml0ZXJ9Ci19Ci0KLQotLyoqCi0gKiBTdWJjbGFzc2VzIGNhbiBpbnZva2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIHRoZW4gYXNzaWduIHRoZSBpbnB1dAotICogc3RyZWFtcyBpbiB0aGUgb3BlbiBtZXRob2QuCi0gKi8KLWZ1bmMgTmV3VElPU3RyZWFtVHJhbnNwb3J0RGVmYXVsdCgpICpUSU9TdHJlYW1UcmFuc3BvcnQgewotICByZXR1cm4gJlRJT1N0cmVhbVRyYW5zcG9ydHt9Ci19Ci0KLS8qKgotICogSW5wdXQgc3RyZWFtIGNvbnN0cnVjdG9yLgotICoKLSAqIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCi0gKi8KLWZ1bmMgTmV3VElPU3RyZWFtVHJhbnNwb3J0UihyIGlvLlJlYWRlcikgKlRJT1N0cmVhbVRyYW5zcG9ydCB7Ci0gIHJldHVybiAmVElPU3RyZWFtVHJhbnNwb3J0e1JlYWRlcjogYnVmaW8uTmV3UmVhZGVyKHIpfQotfQotCi0vKioKLSAqIE91dHB1dCBzdHJlYW0gY29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIG9zIE91dHB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCi0gKi8KLWZ1bmMgTmV3VElPU3RyZWFtVHJhbnNwb3J0Vyh3IGlvLldyaXRlcikgKlRJT1N0cmVhbVRyYW5zcG9ydCB7Ci0gIHJldHVybiAmVElPU3RyZWFtVHJhbnNwb3J0e1dyaXRlcjogYnVmaW8uTmV3V3JpdGVyKHcpfQotfQotCi0vKioKLSAqIFR3by13YXkgc3RyZWFtIGNvbnN0cnVjdG9yLgotICoKLSAqIEBwYXJhbSBpcyBJbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tCi0gKiBAcGFyYW0gb3MgT3V0cHV0IHN0cmVhbSB0byByZWFkIGZyb20KLSAqLwotZnVuYyBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSQW5kVyhyIGlvLlJlYWRlciwgdyBpby5Xcml0ZXIpICpUSU9TdHJlYW1UcmFuc3BvcnQgewotICByZXR1cm4gJlRJT1N0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IGJ1ZmlvLk5ld1JlYWRlcihyKSwgV3JpdGVyOiBidWZpby5OZXdXcml0ZXIodyl9Ci19Ci0KLS8qKgotICogVHdvLXdheSBzdHJlYW0gY29uc3RydWN0b3IuCi0gKgotICogQHBhcmFtIGlzIElucHV0IHN0cmVhbSB0byByZWFkIGZyb20KLSAqIEBwYXJhbSBvcyBPdXRwdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQotICovCi1mdW5jIE5ld1RJT1N0cmVhbVRyYW5zcG9ydFJXKHJ3IGlvLlJlYWRXcml0ZXIpICpUSU9TdHJlYW1UcmFuc3BvcnQgewotICAvLyBidWZpbyBoYXMgYSBidWcgd2hlcmUgb25jZSBhIFJlYWRlciBoaXRzIEVPRiwgYSBuZXcgV3JpdGUgbmV2ZXIgYnJpbmdzIHRoZSByZWFkZXIgb3V0IG9mIEVPRgotICAvLyBldmVuIGlmIHJlYWRlciBhbmQgd3JpdGVyIHVzZSB0aGUgc2FtZSB1bmRlcmxpZXIKLSAgLy9idWZydyA6PSBidWZpby5OZXdSZWFkV3JpdGVyKGJ1ZmlvLk5ld1JlYWRlcihydyksIGJ1ZmlvLk5ld1dyaXRlcihydykpOwotICByZXR1cm4gJlRJT1N0cmVhbVRyYW5zcG9ydHtSZWFkZXI6IHJ3LCBXcml0ZXI6IHJ3LCBJc1JlYWRXcml0ZXI6IHRydWV9Ci19Ci0KLS8qKgotICogVGhlIHN0cmVhbXMgbXVzdCBhbHJlYWR5IGJlIG9wZW4gYXQgY29uc3RydWN0aW9uIHRpbWUsIHNvIHRoaXMgc2hvdWxkCi0gKiBhbHdheXMgcmV0dXJuIHRydWUuCi0gKgotICogQHJldHVybiB0cnVlCi0gKi8KLWZ1bmMgKHAgKlRJT1N0cmVhbVRyYW5zcG9ydCkgSXNPcGVuKCkgYm9vbCB7Ci0gIHJldHVybiB0cnVlCi19Ci0KLS8qKgotICogVGhlIHN0cmVhbXMgbXVzdCBhbHJlYWR5IGJlIG9wZW4uIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KLSAqLwotZnVuYyAocCAqVElPU3RyZWFtVHJhbnNwb3J0KSBPcGVuKCkgb3MuRXJyb3IgewotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRJT1N0cmVhbVRyYW5zcG9ydCkgUGVlaygpIGJvb2wgewotICByZXR1cm4gcC5Jc09wZW4oKQotfQotCi0vKioKLSAqIENsb3NlcyBib3RoIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuCi0gKi8KLWZ1bmMgKHAgKlRJT1N0cmVhbVRyYW5zcG9ydCkgQ2xvc2UoKSBvcy5FcnJvciB7Ci0gIGNsb3NlZFJlYWRlciA6PSBmYWxzZQotICBpZiBwLlJlYWRlciAhPSBuaWwgewotICAgIGMsIG9rIDo9IHAuUmVhZGVyLihpby5DbG9zZXIpCi0gICAgaWYgb2sgewotICAgICAgZSA6PSBjLkNsb3NlKCkKLSAgICAgIGNsb3NlZFJlYWRlciA9IHRydWUKLSAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgTE9HR0VSLlByaW50KCJFcnJvciBjbG9zaW5nIGlucHV0IHN0cmVhbS4iLCBlKQotICAgICAgfQotICAgIH0KLSAgICBwLlJlYWRlciA9IG5pbAotICB9Ci0gIGlmIHAuV3JpdGVyICE9IG5pbCAmJiAoIWNsb3NlZFJlYWRlciB8fCAhcC5Jc1JlYWRXcml0ZXIpIHsKLSAgICBjLCBvayA6PSBwLldyaXRlci4oaW8uQ2xvc2VyKQotICAgIGlmIG9rIHsKLSAgICAgIGUgOj0gYy5DbG9zZSgpCi0gICAgICBpZiBlICE9IG5pbCB7Ci0gICAgICAgIExPR0dFUi5QcmludCgiRXJyb3IgY2xvc2luZyBvdXRwdXQgc3RyZWFtLiIsIGUpCi0gICAgICB9Ci0gICAgfQotICAgIHAuV3JpdGVyID0gbmlsCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0vKioKLSAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotICovCi1mdW5jIChwICpUSU9TdHJlYW1UcmFuc3BvcnQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgcC5SZWFkZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCByZWFkIGZyb20gbnVsbCBpbnB1dFN0cmVhbSIpCi0gIH0KLSAgbiwgZXJyIDo9IHAuUmVhZGVyLlJlYWQoYnVmKQotICByZXR1cm4gbiwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVElPU3RyZWFtVHJhbnNwb3J0KSBSZWFkQWxsKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBSZWFkQWxsVHJhbnNwb3J0KHAsIGJ1ZikKLX0KLQotCi0vKioKLSAqIFdyaXRlcyB0byB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotICovCi1mdW5jIChwICpUSU9TdHJlYW1UcmFuc3BvcnQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIGlmIHAuV3JpdGVyID09IG5pbCB7Ci0gICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3Qgd3JpdGUgdG8gaW9zdHJlYW0gYXMgV3JpdGVyIGlzIG51bGxcbiIpCi0gICAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRTdHJlYW0iKQotICB9Ci0gIG4sIGVyciA6PSBwLldyaXRlci5Xcml0ZShidWYpCi0gIGlmIG4gPT0gMCB8fCBlcnIgIT0gbmlsIHsKLSAgICBMT0dHRVIuUHJpbnQoIkVycm9yIHdyaXRpbmcgdG8gaW9zdHJlYW0sIG9ubHkgd3JvdGUgIiwgbiwgIiBieXRlczogIiwgZXJyLlN0cmluZygpLCAiXG4iKQotICB9Ci0gIHJldHVybiBuLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotfQotCi0vKioKLSAqIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KLSAqLwotZnVuYyAocCAqVElPU3RyZWFtVHJhbnNwb3J0KSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgaWYgcC5Xcml0ZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBmbHVzaCBudWxsIG91dHB1dFN0cmVhbSIpCi0gIH0KLSAgZiwgb2sgOj0gcC5Xcml0ZXIuKEZsdXNoZXIpCi0gIGlmIG9rIHsKLSAgICBlcnIgOj0gZi5GbHVzaCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90aW9zdHJlYW1fdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3Rpb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc0MjVjNy4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rpb3N0cmVhbV90cmFuc3BvcnRfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJ0ZXN0aW5nIgotICAiYnl0ZXMiCi0pCi0KLWZ1bmMgVGVzdElPU3RyZWFtVHJhbnNwb3J0KHQgKnRlc3RpbmcuVCkgewotICB0cmFucyA6PSBOZXdUSU9TdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDEwMjQpKSkKLSAgVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rqc29uX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC90anNvbl9wcm90b2NvbC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhYjcwMC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rqc29uX3Byb3RvY29sLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNTM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgImVuY29kaW5nL2Jhc2U2NCIKLSAgImZtdCIKLSkKLQotY29uc3QgKAotICBUSFJJRlRfSlNPTl9QUk9UT0NPTF9WRVJTSU9OID0gMQotKQotCi0vLyBmb3IgcmVmZXJlbmNlcyB0byBfUGFyc2VDb250ZXh0IHNlZSB0c2ltcGxlanNvbl9wcm90b2NvbC5nbwotCi0vKioKLSAqIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KLSAqCi0gKiBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKLSAqIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCi0gKiBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCi0gKgotICovCi10eXBlIFRKU09OUHJvdG9jb2wgc3RydWN0IHsKLSAgKlRTaW1wbGVKU09OUHJvdG9jb2wKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RvcgotICovCi1mdW5jIE5ld1RKU09OUHJvdG9jb2wodCBUVHJhbnNwb3J0KSAqVEpTT05Qcm90b2NvbCB7Ci0gIHYgOj0gJlRKU09OUHJvdG9jb2x7VFNpbXBsZUpTT05Qcm90b2NvbDogTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0KX0KLSAgdi5wYXJzZUNvbnRleHRTdGFjay5QdXNoKGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCi0gIHYuZHVtcENvbnRleHQuUHVzaChpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQotICByZXR1cm4gdgotfQotCi0vKioKLSAqIEZhY3RvcnkKLSAqLwotdHlwZSBUSlNPTlByb3RvY29sRmFjdG9yeSBzdHJ1Y3R7fQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKLSAgcmV0dXJuIE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi19Ci0KLWZ1bmMgTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSAqVEpTT05Qcm90b2NvbEZhY3RvcnkgewotICByZXR1cm4gJlRKU09OUHJvdG9jb2xGYWN0b3J5e30KLX0KLQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlSTMyKFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04pOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVTdHJpbmcobmFtZSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZSh0eXBlSWQpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlSTMyKHNlcUlkKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RCZWdpbihuYW1lIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dE9iamVjdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTdHJ1Y3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRPYmplY3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5Xcml0ZUkxNihpZCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5PdXRwdXRPYmplY3RCZWdpbigpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVTdHJpbmcocC5UeXBlSWRUb1N0cmluZyh0eXBlSWQpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUZpZWxkRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0T2JqZWN0RW5kKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBUUHJvdG9jb2xFeGNlcHRpb24geyByZXR1cm4gbmlsIH0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZVN0cmluZyhwLlR5cGVJZFRvU3RyaW5nKGtleVR5cGUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlU3RyaW5nKHAuVHlwZUlkVG9TdHJpbmcodmFsdWVUeXBlKSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBwLldyaXRlSTY0KGludDY0KHNpemUpKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZU1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dExpc3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUxpc3RCZWdpbihlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dEVsZW1MaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dExpc3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVTZXRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRMaXN0RW5kKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVCb29sKGIgYm9vbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0Qm9vbChiKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZUJ5dGUoYiBieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUkzMihpbnQzMihiKSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJMTYodiBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIodikpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlSTMyKHYgaW50MzIpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dEk2NChpbnQ2NCh2KSkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgV3JpdGVJNjQodiBpbnQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZURvdWJsZSh2IGZsb2F0NjQpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dEY2NCh2KQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBXcml0ZVN0cmluZyh2IHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0U3RyaW5nKHYpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFdyaXRlQmluYXJ5KHYgW11ieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICAvLyBKU09OIGxpYnJhcnkgb25seSB0YWtlcyBpbiBhIHN0cmluZywgCi0gIC8vIG5vdCBhbiBhcmJpdHJhcnkgYnl0ZSBhcnJheSwgdG8gZW5zdXJlIGJ5dGVzIGFyZSB0cmFuc21pdHRlZAotICAvLyBlZmZpY2llbnRseSB3ZSBtdXN0IGNvbnZlcnQgdGhpcyBpbnRvIGEgdmFsaWQgSlNPTiBzdHJpbmcKLSAgLy8gdGhlcmVmb3JlIHdlIHVzZSBiYXNlNjQgZW5jb2RpbmcgdG8gYXZvaWQgZXhjZXNzaXZlIGVzY2FwaW5nL3F1b3RpbmcKLSAgaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpCi0gIHdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQotICBpZiBfLCBlIDo9IHdyaXRlci5Xcml0ZSh2KTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHdyaXRlci5DbG9zZSgpCi0gIHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpCi0gIHJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCi19Ci0KLS8qKgotICogUmVhZGluZyBtZXRob2RzLgotICovCi0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRNZXNzYWdlQmVnaW4oKSAobmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGlzTnVsbCwgZXJyIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgewotICAgIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBlcnIKLSAgfQotICB2ZXJzaW9uLCBlcnIgOj0gcC5SZWFkSTMyKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIGlmIHZlcnNpb24gIT0gVEhSSUZUX0pTT05fUFJPVE9DT0xfVkVSU0lPTiB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIlVua25vd24gUHJvdG9jb2wgdmVyc2lvbiAiLCB2ZXJzaW9uLCAiLCBleHBlY3RlZCB2ZXJzaW9uICIsIFRIUklGVF9KU09OX1BST1RPQ09MX1ZFUlNJT04sICJcbiIpKQotICB9Ci0gIGlmIG5hbWUsIGVyciA9IHAuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgYlR5cGVJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICB0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYlR5cGVJZCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIGlmIHNlcUlkLCBlcnIgPSBwLlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBlcnIgOj0gcC5QYXJzZUxpc3RFbmQoKQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTdHJ1Y3RCZWdpbigpIChuYW1lIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBfLCBlcnIgPSBwLlBhcnNlT2JqZWN0U3RhcnQoKQotICByZXR1cm4gIiIsIGVycgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VPYmplY3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkRmllbGRCZWdpbigpIChzdHJpbmcsIFRUeXBlLCBpbnQxNiwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPCAxIHsKLSAgICByZXR1cm4gIiIsIFNUT1AsIC0xLCBuaWwKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKLSAgaWYgbGVuKGIpIDwgMSB8fCBiWzBdID09IEpTT05fUkJSQUNFWzBdIHx8IGJbMF0gPT0gSlNPTl9SQlJBQ0tFVFswXSB7Ci0gICAgcmV0dXJuICIiLCBTVE9QLCAtMSwgbmlsCi0gIH0KLSAgZmllbGRJZCwgZXJyIDo9IHAuUmVhZEkxNigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCi0gIH0KLSAgaWYgXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgU1RPUCwgZmllbGRJZCwgZXJyCi0gIH0KLSAgc1R5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQotICBmVHlwZSA6PSBwLlN0cmluZ1RvVHlwZUlkKHNUeXBlKQotICByZXR1cm4gIiIsIGZUeXBlLCBmaWVsZElkLCBlcnIKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUGFyc2VPYmplY3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTWFwQmVnaW4oKSAoa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCwgZSBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgaXNOdWxsLCBlIDo9IHAuUGFyc2VMaXN0QmVnaW4oKTsgaXNOdWxsIHx8IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gVk9JRCwgVk9JRCwgMCwgZQotICB9Ci0KLSAgLy8gcmVhZCBrZXlUeXBlCi0gIHNLZXlUeXBlLCBlIDo9IHAuUmVhZFN0cmluZygpCi0gIGtleVR5cGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNLZXlUeXBlKQotICBpZiBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSwgZQotICB9Ci0KLSAgLy8gcmVhZCB2YWx1ZVR5cGUKLSAgc1ZhbHVlVHlwZSwgZSA6PSBwLlJlYWRTdHJpbmcoKQotICB2YWx1ZVR5cGUgPSBwLlN0cmluZ1RvVHlwZUlkKHNWYWx1ZVR5cGUpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCi0gIH0KLQotICAvLyByZWFkIHNpemUKLSAgaVNpemUsIGVyciA6PSBwLlJlYWRJNjQoKQotICBzaXplID0gaW50KGlTaXplKQotICByZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZE1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdmFyIHZhbHVlIGJvb2wKLSAgaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gdmFsdWUsIGVycgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9GQUxTRSkpCi0gIGlmIGxlbihiKSA+IDAgewotICAgIHN3aXRjaCBiWzBdIHsKLSAgICBjYXNlIEpTT05fVFJVRVswXToKLSAgICAgIGlmIHN0cmluZyhiWzA6bGVuKEpTT05fVFJVRSldKSA9PSBzdHJpbmcoSlNPTl9UUlVFKSB7Ci0gICAgICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX1RSVUUpXSkKLSAgICAgICAgdmFsdWUgPSB0cnVlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcInRydWVcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgICAgfQotICAgICAgYnJlYWsKLSAgICBjYXNlIEpTT05fRkFMU0VbMF06Ci0gICAgICBpZiBzdHJpbmcoYlswOmxlbihKU09OX0ZBTFNFKV0pID09IHN0cmluZyhKU09OX0ZBTFNFKSB7Ci0gICAgICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX0ZBTFNFKV0pCi0gICAgICAgIHZhbHVlID0gZmFsc2UKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkIFwiZmFsc2VcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgICAgfQotICAgICAgYnJlYWsKLSAgICBjYXNlIEpTT05fTlVMTFswXToKLSAgICAgIGlmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICAgICAgdmFsdWUgPSBmYWxzZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCJudWxsXCIgYnV0IGZvdW5kOiAiK3N0cmluZyhiKSkKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgb3IgXCJudWxsXCIgYnV0IGZvdW5kOiAiK3N0cmluZyhiKSkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlLCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoYnl0ZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJNjQoKQotICByZXR1cm4gYnl0ZSh2KSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBlcnIgOj0gcC5SZWFkSTY0KCkKLSAgcmV0dXJuIGludDE2KHYpLCBlcnIKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJNjQoKQotICByZXR1cm4gaW50MzIodiksIGVycgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgXywgZXJyIDo9IHAuUGFyc2VJNjQoKQotICByZXR1cm4gdiwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIF8sIGVyciA6PSBwLlBhcnNlRjY0KCkKLSAgcmV0dXJuIHYsIGVycgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHZhciB2IHN0cmluZwotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiB2LCBlcnIKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKLSAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgdmFsdWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCi0gICAgdiA9IHZhbHVlCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdiwgZXJyCi0gICAgfQotICB9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCAiLCBzdHJpbmcoYikpKQotICB9Ci0gIHJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2YXIgdiBbXWJ5dGUKLSAgaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmlsLCBlcnIKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKLSAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQotICAgIHYgPSB2YWx1ZQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHYsIGVycgotICAgIH0KLSAgfSBlbHNlIGlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYlswOmxlbihKU09OX05VTEwpXSkgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotICAgIF8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgIiwgc3RyaW5nKGIpKSkKLSAgfQotICByZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIEZsdXNoKCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKHAud3JpdGVyLkZsdXNoKCkpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCi19Ci0KLWZ1bmMgKHAgKlRKU09OUHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgewotICByZXR1cm4gcC50cmFucwotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSByZWFkRWxlbUxpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIGlzTnVsbCwgZSA6PSBwLlBhcnNlTGlzdEJlZ2luKCk7IGlzTnVsbCB8fCBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIFZPSUQsIDAsIGUKLSAgfQotICBzRWxlbVR5cGUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQotICBlbGVtVHlwZSA9IHAuU3RyaW5nVG9UeXBlSWQoc0VsZW1UeXBlKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycgotICB9Ci0gIG5TaXplLCBlcnIyIDo9IHAuUmVhZEk2NCgpCi0gIHNpemUgPSBpbnQoblNpemUpCi0gIHJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSB3cml0ZUVsZW1MaXN0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5PdXRwdXRTdHJpbmcocC5UeXBlSWRUb1N0cmluZyhlbGVtVHlwZSkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuT3V0cHV0STY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBUeXBlSWRUb1N0cmluZyhmaWVsZFR5cGUgVFR5cGUpIHN0cmluZyB7Ci0gIHN3aXRjaCBieXRlKGZpZWxkVHlwZSkgewotICBjYXNlIFNUT1A6Ci0gICAgcmV0dXJuICJzdHAiCi0gIGNhc2UgVk9JRDoKLSAgICByZXR1cm4gInYiCi0gIGNhc2UgQk9PTDoKLSAgICByZXR1cm4gInRmIgotICBjYXNlIEJZVEU6Ci0gICAgcmV0dXJuICJpOCIKLSAgY2FzZSBET1VCTEU6Ci0gICAgcmV0dXJuICJkYmwiCi0gIGNhc2UgSTE2OgotICAgIHJldHVybiAiaTE2IgotICBjYXNlIEkzMjoKLSAgICByZXR1cm4gImkzMiIKLSAgY2FzZSBJNjQ6Ci0gICAgcmV0dXJuICJpNjQiCi0gIGNhc2UgU1RSSU5HOgotICAgIHJldHVybiAic3RyIgotICBjYXNlIFNUUlVDVDoKLSAgICByZXR1cm4gInJlYyIKLSAgY2FzZSBNQVA6Ci0gICAgcmV0dXJuICJtYXAiCi0gIGNhc2UgU0VUOgotICAgIHJldHVybiAic2V0IgotICBjYXNlIExJU1Q6Ci0gICAgcmV0dXJuICJsc3QiCi0gIGNhc2UgRU5VTToKLSAgICByZXR1cm4gImkzMiIKLSAgY2FzZSBVVEYxNjoKLSAgICByZXR1cm4gInN0ciIKLSAgY2FzZSBHRU5FUklDOgotICAgIHJldHVybiAiZ2VuIgotICB9Ci0gIHJldHVybiAiIgotfQotCi1mdW5jIChwICpUSlNPTlByb3RvY29sKSBTdHJpbmdUb1R5cGVJZChmaWVsZFR5cGUgc3RyaW5nKSBUVHlwZSB7Ci0gIHN3aXRjaCBmaWVsZFR5cGUgewotICBjYXNlICJzdHAiOgotICAgIHJldHVybiBUVHlwZShTVE9QKQotICBjYXNlICJ2IjoKLSAgICByZXR1cm4gVFR5cGUoVk9JRCkKLSAgY2FzZSAidGYiOgotICAgIHJldHVybiBUVHlwZShCT09MKQotICBjYXNlICJpOCI6Ci0gICAgcmV0dXJuIFRUeXBlKEJZVEUpCi0gIGNhc2UgImRibCI6Ci0gICAgcmV0dXJuIFRUeXBlKERPVUJMRSkKLSAgY2FzZSAiMTYiOgotICAgIHJldHVybiBUVHlwZShJMTYpCi0gIGNhc2UgImkzMiI6Ci0gICAgcmV0dXJuIFRUeXBlKEkzMikKLSAgY2FzZSAiaTY0IjoKLSAgICByZXR1cm4gVFR5cGUoSTY0KQotICBjYXNlICJzdHIiOgotICAgIHJldHVybiBUVHlwZShTVFJJTkcpCi0gIGNhc2UgInJlYyI6Ci0gICAgcmV0dXJuIFRUeXBlKFNUUlVDVCkKLSAgY2FzZSAibWFwIjoKLSAgICByZXR1cm4gVFR5cGUoTUFQKQotICBjYXNlICJzZXQiOgotICAgIHJldHVybiBUVHlwZShTRVQpCi0gIGNhc2UgImxzdCI6Ci0gICAgcmV0dXJuIFRUeXBlKExJU1QpCi0gIGNhc2UgImVubSI6Ci0gICAgcmV0dXJuIFRUeXBlKEVOVU0pCi0gIGNhc2UgInUxNiI6Ci0gICAgcmV0dXJuIFRUeXBlKFVURjE2KQotICBjYXNlICJnZW4iOgotICAgIHJldHVybiBUVHlwZShHRU5FUklDKQotICB9Ci0gIHJldHVybiBUVHlwZShTVE9QKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90anNvbl9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90anNvbl9wcm90b2NvbF90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGYwZjJlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdGpzb25fcHJvdG9jb2xfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDY3NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAiZW5jb2RpbmcvYmFzZTY0IgotICAiZm10IgotICAianNvbiIKLSAgIm1hdGgiCi0gICJzdHJjb252IgotICAidGVzdGluZyIKLSkKLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJib29sZWFuIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICB9Ci0gICAgdiA6PSBmYWxzZQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCb29sKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJib29sZWFuIgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgICBpZiB2YWx1ZSB7Ci0gICAgICB0cmFucy5Xcml0ZShKU09OX1RSVUUpCi0gICAgfSBlbHNlIHsKLSAgICAgIHRyYW5zLldyaXRlKEpTT05fRkFMU0UpCi0gICAgfQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWRCb29sKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sQnl0ZSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYnl0ZSIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVCeXRlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgfQotICAgIHYgOj0gYnl0ZSgwKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJieXRlIgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEJ5dGUoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImludDE2IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICB9Ci0gICAgdiA6PSBpbnQxNigwKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJMTYodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImludDE2IgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWRJMTYoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJMzIodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImludDMyIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVJMzIodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICB9Ci0gICAgdiA6PSBpbnQzMigwKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJMzIodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImludDMyIgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWRJMzIoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImludDY0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVJNjQodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICB9Ci0gICAgdiA6PSBpbnQ2NCgwKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xJNjQodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImludDY0IgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgSU5UNjRfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hNjQodmFsdWUpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWRJNjQoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xEb3VibGUodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImRvdWJsZSIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiBzICE9IEpzb25RdW90ZShKU09OX0lORklOSVRZKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9JTkZJTklUWSkpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7Ci0gICAgICBpZiBzICE9IEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fTkFOKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9OQU4pKQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXY6ICVzIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgICB9Ci0gICAgICB2IDo9IGZsb2F0NjQoMCkKLSAgICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiZG91YmxlIgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICAgIG4gOj0gTmV3TnVtZXJpY0Zyb21Eb3VibGUodmFsdWUpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcobi5TdHJpbmcoKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkRG91YmxlKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiAhbWF0aC5Jc0luZih2LCAxKSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAtMSkgewotICAgICAgaWYgIW1hdGguSXNJbmYodiwgLTEpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNOYU4odmFsdWUpIHsKLSAgICAgIGlmICFtYXRoLklzTmFOKHYpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic3RyaW5nIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlU3RyaW5nKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIHNbMF0gIT0gJyInIHx8IHNbbGVuKHMpLTFdICE9ICciJyB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAnJXYnLCB3cm90ZSAnJXYnLCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgZm10LlNwcmludCgiXCIiLCB2YWx1ZSwgIlwiIikpCi0gICAgfQotICAgIHYgOj0gbmV3KHN0cmluZykKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2KTsgZXJyICE9IG5pbCB8fCAqdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZEpTT05Qcm90b2NvbFN0cmluZyh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic3RyaW5nIgotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKEpzb25RdW90ZSh2YWx1ZSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZFN0cmluZygpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdjEgOj0gbmV3KHN0cmluZykKLSAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCB2MSk7IGVyciAhPSBuaWwgfHwgKnYxICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZUpTT05Qcm90b2NvbEJpbmFyeSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiYmluYXJ5IgotICB2YWx1ZSA6PSBwcm90b2NvbF9iZGF0YQotICBiNjR2YWx1ZSA6PSBtYWtlKFtdYnl0ZSwgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZWRMZW4obGVuKHByb3RvY29sX2JkYXRhKSkpCi0gIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGUoYjY0dmFsdWUsIHZhbHVlKQotICBiNjRTdHJpbmcgOj0gc3RyaW5nKGI2NHZhbHVlKQotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgfQotICBzIDo9IHRyYW5zLlN0cmluZygpCi0gIGV4cGVjdGVkU3RyaW5nIDo9IGZtdC5TcHJpbnQoIlwiIiwgYjY0U3RyaW5nLCAiXCIiKQotICBpZiBzICE9IGV4cGVjdGVkU3RyaW5nIHsKLSAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldlxuICB3cm90ZTogIFwiJXZcIlxuZXhwZWN0ZWQ6IFwiJXZcIiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBleHBlY3RlZFN0cmluZykKLSAgfQotICB2MSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgZXJyLlN0cmluZygpKQotICB9Ci0gIGlmIGxlbih2MSkgIT0gbGVuKHZhbHVlKSB7Ci0gICAgdC5GYXRhbGYoIkludmFsaWQgdmFsdWUgZm9yIGJpbmFyeVxuZXhwZWN0ZWQ6IFwiJXZcIlxuICAgcmVhZDogXCIldlwiIiwgdmFsdWUsIHYxKQotICB9Ci0gIGZvciBrLCB2IDo9IHJhbmdlIHZhbHVlIHsKLSAgICBpZiB2MVtrXSAhPSB2IHsKLSAgICAgIHQuRmF0YWxmKCJJbnZhbGlkIHZhbHVlIGZvciBiaW5hcnkgYXQgJXZcbmV4cGVjdGVkOiBcIiV2XCJcbiAgIHJlYWQ6IFwiJXZcIiIsIGssIHYsIHYxW2tdKQotICAgIH0KLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJpbmFyeSIKLSAgdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKLSAgYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQotICBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKLSAgYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgdHJhbnMuV3JpdGVTdHJpbmcoSnNvblF1b3RlKGI2NFN0cmluZykpCi0gIHRyYW5zLkZsdXNoKCkKLSAgcyA6PSB0cmFucy5TdHJpbmcoKQotICB2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICB9Ci0gIGlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKLSAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSBsZW5ndGggJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQgbGVuZ3RoOiAldiIsIHRoZXR5cGUsIGxlbih2YWx1ZSksIHMsIGxlbih2KSkKLSAgfQotICBmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgewotICAgIGlmIHZbaV0gIT0gdmFsdWVbaV0gewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJWQgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgaSwgdmFsdWVbaV0sIHMsIHZbaV0pCi0gICAgfQotICB9Ci0gIHYxIDo9IG5ldyhzdHJpbmcpCi0gIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKLSAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCi0gIH0KLSAgdHJhbnMuUmVzZXQoKQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sTGlzdCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAibGlzdCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gIH0KLSAgcC5Xcml0ZUxpc3RFbmQoKQotICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgc3RyIDo9IHRyYW5zLlN0cmluZygpCi0gIHN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCi0gIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKLSAgfQotICBsIDo9ICpzdHIxCi0gIGlmIGxlbihsKSA8IDIgewotICAgIHQuRmF0YWxmKCJMaXN0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKLSAgfQotICBpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7Ci0gICAgdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBsaXN0LCBleHBlY3RlZDogIiwgRE9VQkxFLCAiLCBidXQgd2FzOiAiLCBsWzBdKQotICB9Ci0gIGlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKLSAgICB0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKLSAgfQotICBmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgcyA6PSBsW2srMl0KLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0V3JpdGVKU09OUHJvdG9jb2xTZXQodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gInNldCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKLSAgcC5Xcml0ZVNldEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgfQotICBwLldyaXRlU2V0RW5kKCkKLSAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLlN0cmluZygpKQotICB9Ci0gIHN0ciA6PSB0cmFucy5TdHJpbmcoKQotICBzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQotICBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCi0gIH0KLSAgbCA6PSAqc3RyMQotICBpZiBsZW4obCkgPCAyIHsKLSAgICB0LkZhdGFsZigiU2V0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKLSAgfQotICBpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7Ci0gICAgdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCi0gIH0KLSAgaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXM6ICIsIGxbMV0pCi0gIH0KLSAgZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIHMgOj0gbFtrKzJdCi0gICAgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgewotICAgICAgaWYgcy4oc3RyaW5nKSAhPSBKU09OX0lORklOSVRZIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgewotICAgICAgaWYgcy4oc3RyaW5nKSAhPSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgaWYgcy4oc3RyaW5nKSAhPSBKU09OX05BTiB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTiksIHN0cikKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgcy4oZmxvYXQ2NCkgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFdyaXRlSlNPTlByb3RvY29sTWFwKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJtYXAiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCi0gIHAuV3JpdGVNYXBCZWdpbihUVHlwZShJMzIpLCBUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCi0gIGZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVJMzIoaW50MzIoaykpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGtleSBpbnQzMiB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSBmbG9hdDY0IHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gIH0KLSAgcC5Xcml0ZU1hcEVuZCgpCi0gIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5TdHJpbmcoKSkKLSAgfQotICBzdHIgOj0gdHJhbnMuU3RyaW5nKCkKLSAgaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKLSAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICVxLCBpbiBnbzogJXEiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCi0gIH0KLSAgZXhwZWN0ZWRLZXlUeXBlLCBleHBlY3RlZFZhbHVlVHlwZSwgZXhwZWN0ZWRTaXplLCBlcnIgOj0gcC5SZWFkTWFwQmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiRXJyb3Igd2hpbGUgcmVhZGluZyBtYXAgYmVnaW46ICVzIiwgZXJyLlN0cmluZygpKQotICB9Ci0gIGlmIGV4cGVjdGVkS2V5VHlwZSAhPSBJMzIgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgZXhwZWN0ZWRLZXlUeXBlKQotICB9Ci0gIGlmIGV4cGVjdGVkVmFsdWVUeXBlICE9IERPVUJMRSB7Ci0gICAgdC5GYXRhbCgiRXhwZWN0ZWQgbWFwIHZhbHVlIHR5cGUgIiwgRE9VQkxFLCAiLCBidXQgd2FzICIsIGV4cGVjdGVkVmFsdWVUeXBlKQotICB9Ci0gIGlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCBzaXplIG9mICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhcyAiLCBleHBlY3RlZFNpemUpCi0gIH0KLSAgZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlrLCBlcnIgOj0gcC5SZWFkSTMyKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQga2V5IGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIGlrLCBzdHJpbmcoayksIGVyci5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgaW50KGlrKSAhPSBrIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQga2V5IGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCBpaywgaykKLSAgICB9Ci0gICAgZHYsIGVyciA6PSBwLlJlYWREb3VibGUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgaW5kZXggJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2LCBlcnJvcjogJXMiLCB0aGV0eXBlLCBrLCBkdiwgdmFsdWUsIGVyci5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSBzdHJjb252LkZ0b2E2NChkdiwgJ2cnLCAxMCkKLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiAhbWF0aC5Jc0luZihkdiwgMSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7Ci0gICAgICBpZiAhbWF0aC5Jc0luZihkdiwgMCkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiAhbWF0aC5Jc05hTihkdikgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTikpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4cGVjdGVkIDo9IHN0cmNvbnYuRnRvYTY0KHZhbHVlLCAnZycsIDEwKQotICAgICAgaWYgcyAhPSBleHBlY3RlZCB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQotICAgICAgfQotICAgICAgdiA6PSBmbG9hdDY0KDApCi0gICAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLQotZnVuYyBUZXN0UmVhZFdyaXRlSlNPTlN0cnVjdCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic3RydWN0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQotICBvcmlnIDo9IE5ld1dvcmsoKQotICBvcmlnLk51bTEgPSAyNQotICBvcmlnLk51bTIgPSAxMDIKLSAgb3JpZy5PcCA9IEFERAotICBvcmlnLkNvbW1lbnQgPSAiQWRkOiAyNSArIDEwMiIKLSAgaWYgZSA6PSBvcmlnLldyaXRlKHApOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAlI3YgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIG9yaWcsIGUuU3RyaW5nKCkpCi0gIH0KLSAgcC5GbHVzaCgpCi0gIHQuTG9nKCJNZW1vcnkgYnVmZmVyIGNvbnRlbnRzOiAiLCB0cmFucy5TdHJpbmcoKSkKLSAgZXhwZWN0ZWRTdHJpbmcgOj0gIntcIjFcIjp7XCJpMzJcIjoyNX0sXCIyXCI6e1wiaTMyXCI6MTAyfSxcIjNcIjp7XCJpMzJcIjoxfSxcIjRcIjp7XCJzdHJcIjpcIkFkZDogMjUgKyAxMDJcIn19IgotICBpZiBleHBlY3RlZFN0cmluZyAhPSB0cmFucy5TdHJpbmcoKSB7Ci0gICAgdC5GYXRhbGYoIkV4cGVjdGVkIEpTT04gU3RydWN0IHdpdGggdmFsdWUgJSN2IGJ1dCBoYXZlICUjdiIsIGV4cGVjdGVkU3RyaW5nLCB0cmFucy5TdHJpbmcoKSkKLSAgfQotICByZWFkIDo9IE5ld1dvcmsoKQotICBlIDo9IHJlYWQuUmVhZChwKQotICB0LkxvZ2YoIlJlYWQgJXMgdmFsdWU6ICUjdiIsIHRoZXR5cGUsIHJlYWQpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgaWYgIW9yaWcuRXF1YWxzKHJlYWQpIHsKLSAgICB0LkZhdGFsZigiT3JpZ2luYWwgV3JpdGUgIT0gUmVhZDogJSN2ICE9ICUjdiAiLCBvcmlnLCByZWFkKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFJlYWRXcml0ZUpTT05Qcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKLSAgUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RsaXN0LmdvIGIvbGliL2dvL3RocmlmdC90bGlzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4ZmMzYi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RsaXN0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgImNvbnRhaW5lci92ZWN0b3IiCi0pCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIGxpc3QgbWV0YWRhdGEuCi0gKgotICovCi10eXBlIFRMaXN0IGludGVyZmFjZSB7Ci0gIFRDb250YWluZXIKLSAgRWxlbVR5cGUoKSBUVHlwZQotICBBdChpIGludCkgaW50ZXJmYWNle30KLSAgU2V0KGkgaW50LCBkYXRhIGludGVyZmFjZXt9KQotICBQdXNoKGRhdGEgaW50ZXJmYWNle30pCi0gIFBvcCgpIGludGVyZmFjZXt9Ci0gIFN3YXAoaSwgaiBpbnQpCi0gIEluc2VydChpIGludCwgZGF0YSBpbnRlcmZhY2V7fSkKLSAgRGVsZXRlKGkgaW50KQotICBMZXNzKGksIGogaW50KSBib29sCi0gIEl0ZXIoKSA8LWNoYW4gaW50ZXJmYWNle30KLX0KLQotdHlwZSB0TGlzdCBzdHJ1Y3QgewotICBlbGVtVHlwZSBUVHlwZQotICBsICAgICAgICAqdmVjdG9yLlZlY3RvcgotfQotCi1mdW5jIE5ld1RMaXN0KHQgVFR5cGUsIHMgaW50KSBUTGlzdCB7Ci0gIHZhciB2IHZlY3Rvci5WZWN0b3IKLSAgcmV0dXJuICZ0TGlzdHtlbGVtVHlwZTogdCwgbDogdi5SZXNpemUocywgcyl9Ci19Ci0KLWZ1bmMgTmV3VExpc3REZWZhdWx0KCkgVExpc3QgewotICB2YXIgdiB2ZWN0b3IuVmVjdG9yCi0gIHJldHVybiAmdExpc3R7ZWxlbVR5cGU6IFRUeXBlKFNUT1ApLCBsOiAmdn0KLX0KLQotZnVuYyAocCAqdExpc3QpIEVsZW1UeXBlKCkgVFR5cGUgewotICByZXR1cm4gcC5lbGVtVHlwZQotfQotCi1mdW5jIChwICp0TGlzdCkgTGVuKCkgaW50IHsKLSAgcmV0dXJuIHAubC5MZW4oKQotfQotCi1mdW5jIChwICp0TGlzdCkgQXQoaSBpbnQpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIHAubC5BdChpKQotfQotCi1mdW5jIChwICp0TGlzdCkgU2V0KGkgaW50LCBkYXRhIGludGVyZmFjZXt9KSB7Ci0gIGlmIHAuZWxlbVR5cGUuSXNFbXB0eVR5cGUoKSB7Ci0gICAgcC5lbGVtVHlwZSA9IFR5cGVGcm9tVmFsdWUoZGF0YSkKLSAgfQotICBpZiBkYXRhLCBvayA6PSBwLmVsZW1UeXBlLkNvZXJjZURhdGEoZGF0YSk7IG9rIHsKLSAgICBwLmwuU2V0KGksIGRhdGEpCi0gIH0KLX0KLQotZnVuYyAocCAqdExpc3QpIFB1c2goZGF0YSBpbnRlcmZhY2V7fSkgewotICBpZiBwLmVsZW1UeXBlLklzRW1wdHlUeXBlKCkgewotICAgIHAuZWxlbVR5cGUgPSBUeXBlRnJvbVZhbHVlKGRhdGEpCi0gIH0KLSAgZGF0YSwgb2sgOj0gcC5lbGVtVHlwZS5Db2VyY2VEYXRhKGRhdGEpCi0gIGlmIG9rIHsKLSAgICBwLmwuUHVzaChkYXRhKQotICB9Ci19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBQb3AoKSBpbnRlcmZhY2V7fSB7Ci0gIHJldHVybiBwLmwuUG9wKCkKLX0KLQotZnVuYyAocCAqdExpc3QpIFN3YXAoaSwgaiBpbnQpIHsKLSAgcC5sLlN3YXAoaSwgaikKLX0KLQotZnVuYyAocCAqdExpc3QpIEluc2VydChpIGludCwgZGF0YSBpbnRlcmZhY2V7fSkgewotICBwLmwuSW5zZXJ0KGksIGRhdGEpCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBEZWxldGUoaSBpbnQpIHsKLSAgcC5sLkRlbGV0ZShpKQotfQotCi1mdW5jIChwICp0TGlzdCkgQ29udGFpbnMoZGF0YSBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIHJldHVybiBwLmluZGV4T2YoZGF0YSkgPj0gMAotfQotCi1mdW5jIChwICp0TGlzdCkgTGVzcyhpLCBqIGludCkgYm9vbCB7Ci0gIHJldHVybiBwLmwuTGVzcyhpLCBqKQotfQotCi1mdW5jIChwICp0TGlzdCkgSXRlcigpIDwtY2hhbiBpbnRlcmZhY2V7fSB7Ci0gIGMgOj0gbWFrZShjaGFuIGludGVyZmFjZXt9KQotICBnbyBwLml0ZXJhdGUoYykKLSAgcmV0dXJuIGMKLX0KLQotZnVuYyAocCAqdExpc3QpIGl0ZXJhdGUoYyBjaGFuPC0gaW50ZXJmYWNle30pIHsKLSAgZm9yIF8sIGVsZW0gOj0gcmFuZ2UgKnAubCB7Ci0gICAgYyA8LSBlbGVtCi0gIH0KLSAgY2xvc2UoYykKLX0KLQotZnVuYyAocCAqdExpc3QpIGluZGV4T2YoZGF0YSBpbnRlcmZhY2V7fSkgaW50IHsKLSAgaWYgZGF0YSA9PSBuaWwgewotICAgIHNpemUgOj0gcC5sLkxlbigpCi0gICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICBpZiBwLmwuQXQoaSkgPT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGkKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgZGF0YSwgb2sgOj0gcC5lbGVtVHlwZS5Db2VyY2VEYXRhKGRhdGEpCi0gIGlmIGRhdGEgPT0gbmlsIHx8ICFvayB7Ci0gICAgcmV0dXJuIC0xCi0gIH0KLSAgc2l6ZSA6PSBwLmwuTGVuKCkKLSAgaWYgcC5lbGVtVHlwZS5Jc0Jhc2VUeXBlKCkgfHwgcC5lbGVtVHlwZS5Jc0VudW0oKSB7Ci0gICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICBpZiBkYXRhID09IHAubC5BdChpKSB7Ci0gICAgICAgIHJldHVybiBpCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAtMQotICB9Ci0gIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzT3RoZXJJbnRlcmZhY2UpOyBvayB7Ci0gICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICBpZiBjbXAuRXF1YWxzKHAubC5BdChpKSkgewotICAgICAgICByZXR1cm4gaQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLTEKLSAgfQotICBzd2l0Y2ggcC5lbGVtVHlwZSB7Ci0gIGNhc2UgTUFQOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzTWFwKTsgb2sgewotICAgICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICAgIHYgOj0gcC5sLkF0KGkpCi0gICAgICAgIGlmIHYgPT0gbmlsIHsKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICB9Ci0gICAgICAgIGlmIGNtcC5FcXVhbHModi4oVE1hcCkpIHsKLSAgICAgICAgICByZXR1cm4gaQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTEKLSAgICB9Ci0gIGNhc2UgU0VUOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzU2V0KTsgb2sgewotICAgICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICAgIHYgOj0gcC5sLkF0KGkpCi0gICAgICAgIGlmIHYgPT0gbmlsIHsKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICB9Ci0gICAgICAgIGlmIGNtcC5FcXVhbHModi4oVFNldCkpIHsKLSAgICAgICAgICByZXR1cm4gaQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTEKLSAgICB9Ci0gIGNhc2UgTElTVDoKLSAgICBpZiBjbXAsIG9rIDo9IGRhdGEuKEVxdWFsc0xpc3QpOyBvayB7Ci0gICAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgICAgdiA6PSBwLmwuQXQoaSkKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUTGlzdCkpIHsKLSAgICAgICAgICByZXR1cm4gaQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTEKLSAgICB9Ci0gIGNhc2UgU1RSVUNUOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzU3RydWN0KTsgb2sgewotICAgICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICAgIHYgOj0gcC5sLkF0KGkpCi0gICAgICAgIGlmIHYgPT0gbmlsIHsKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICB9Ci0gICAgICAgIGlmIGNtcC5FcXVhbHModi4oVFN0cnVjdCkpIHsKLSAgICAgICAgICByZXR1cm4gaQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTEKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIC0xCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wgewotICBjLCBjb2sgOj0gcC5Db21wYXJlVG8ob3RoZXIpCi0gIHJldHVybiBjb2sgJiYgYyA9PSAwCi19Ci0KLWZ1bmMgKHAgKnRMaXN0KSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgcmV0dXJuIFRUeXBlKExJU1QpLkNvbXBhcmUocCwgb3RoZXIpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RtYXAuZ28gYi9saWIvZ28vdGhyaWZ0L3RtYXAuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDJmMDUuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bWFwLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgImNvbnRhaW5lci9saXN0IgotICAicmVmbGVjdCIKLSkKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgbWFwIG1ldGFkYXRhLgotICoKLSAqLwotdHlwZSBUTWFwIGludGVyZmFjZSB7Ci0gIEtleVR5cGUoKSBUVHlwZQotICBWYWx1ZVR5cGUoKSBUVHlwZQotICBMZW4oKSBpbnQKLSAgU2V0KGtleSwgdmFsdWUgaW50ZXJmYWNle30pCi0gIEdldChrZXkgaW50ZXJmYWNle30pIChpbnRlcmZhY2V7fSwgYm9vbCkKLSAgQ29udGFpbnMoa2V5IGludGVyZmFjZXt9KSBib29sCi0gIEl0ZXIoKSA8LWNoYW4gVE1hcEVsZW0KLSAgS2V5SXRlcigpIDwtY2hhbiBpbnRlcmZhY2V7fQotICBWYWx1ZUl0ZXIoKSA8LWNoYW4gaW50ZXJmYWNle30KLSAgS2V5cygpIFtdaW50ZXJmYWNle30KLSAgVmFsdWVzKCkgW11pbnRlcmZhY2V7fQotICBMZXNzKG90aGVyIGludGVyZmFjZXt9KSBib29sCi0gIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbAotICBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpCi19Ci0KLXR5cGUgVE1hcEVsZW0gaW50ZXJmYWNlIHsKLSAgS2V5KCkgaW50ZXJmYWNle30KLSAgVmFsdWUoKSBpbnRlcmZhY2V7fQotfQotCi10eXBlIHRNYXAgc3RydWN0IHsKLSAga2V5VHlwZSAgIFRUeXBlCi0gIHZhbHVlVHlwZSBUVHlwZQotICBzaXplICAgICAgaW50Ci0gIGwgICAgICAgICAqbGlzdC5MaXN0Ci0gIGIgICAgICAgICBtYXBbYm9vbF1pbnRlcmZhY2V7fQotICBpMDggICAgICAgbWFwW2J5dGVdaW50ZXJmYWNle30KLSAgaTE2ICAgICAgIG1hcFtpbnQxNl1pbnRlcmZhY2V7fQotICBpMzIgICAgICAgbWFwW2ludDMyXWludGVyZmFjZXt9Ci0gIGk2NCAgICAgICBtYXBbaW50NjRdaW50ZXJmYWNle30KLSAgZjY0ICAgICAgIG1hcFtmbG9hdDY0XWludGVyZmFjZXt9Ci0gIHMgICAgICAgICBtYXBbc3RyaW5nXWludGVyZmFjZXt9Ci19Ci0KLXR5cGUgdE1hcEVsZW0gc3RydWN0IHsKLSAga2V5ICAgaW50ZXJmYWNle30KLSAgdmFsdWUgaW50ZXJmYWNle30KLX0KLQotZnVuYyAocCAqdE1hcEVsZW0pIEtleSgpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIHAua2V5Ci19Ci0KLWZ1bmMgKHAgKnRNYXBFbGVtKSBWYWx1ZSgpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIHAudmFsdWUKLX0KLQotZnVuYyBOZXdUTWFwRWxlbShrLCB2IGludGVyZmFjZXt9KSBUTWFwRWxlbSB7Ci0gIHJldHVybiAmdE1hcEVsZW17a2V5OiBrLCB2YWx1ZTogdn0KLX0KLQotZnVuYyBOZXdUTWFwKGssIHYgVFR5cGUsIHMgaW50KSBUTWFwIHsKLSAgcmV0dXJuICZ0TWFwe2tleVR5cGU6IGssIHZhbHVlVHlwZTogdiwgc2l6ZTogcywgbDogbGlzdC5OZXcoKX0KLX0KLQotZnVuYyBOZXdUTWFwRGVmYXVsdCgpIFRNYXAgewotICByZXR1cm4gTmV3VE1hcChTVE9QLCBTVE9QLCAwKQotfQotCi1mdW5jIChwICp0TWFwKSBLZXlUeXBlKCkgVFR5cGUgewotICByZXR1cm4gcC5rZXlUeXBlCi19Ci0KLWZ1bmMgKHAgKnRNYXApIFZhbHVlVHlwZSgpIFRUeXBlIHsKLSAgcmV0dXJuIHAudmFsdWVUeXBlCi19Ci0KLWZ1bmMgKHAgKnRNYXApIExlbigpIGludCB7Ci0gIGlmIHAubC5MZW4oKSAhPSAwIHsKLSAgICByZXR1cm4gcC5sLkxlbigpCi0gIH0KLSAgc3dpdGNoIHAuS2V5VHlwZSgpIHsKLSAgY2FzZSBTVE9QLCBWT0lEOgotICAgIHJldHVybiAwCi0gIGNhc2UgQk9PTDoKLSAgICByZXR1cm4gbGVuKHAuYikKLSAgY2FzZSBCWVRFOgotICAgIHJldHVybiBsZW4ocC5pMDgpCi0gIGNhc2UgSTE2OgotICAgIHJldHVybiBsZW4ocC5pMTYpCi0gIGNhc2UgSTMyOgotICAgIHJldHVybiBsZW4ocC5pMzIpCi0gIGNhc2UgSTY0OgotICAgIHJldHVybiBsZW4ocC5pNjQpCi0gIGNhc2UgRE9VQkxFOgotICAgIHJldHVybiBsZW4ocC5mNjQpCi0gIGNhc2UgU1RSSU5HLCBVVEY4LCBVVEYxNjoKLSAgICByZXR1cm4gbGVuKHAucykKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gcC5zaXplCi0gIH0KLSAgcmV0dXJuIHAuc2l6ZQotfQotCi1mdW5jIChwICp0TWFwKSBHZXQoa2V5IGludGVyZmFjZXt9KSAoaW50ZXJmYWNle30sIGJvb2wpIHsKLSAgaWYgcC5LZXlUeXBlKCkuSXNFbXB0eVR5cGUoKSB7Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgfQotICBpZiBrZXkgPT0gbmlsIHsKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBlIDo9IGVsZW0uVmFsdWUuKFRNYXBFbGVtKQotICAgICAgayA6PSBlLktleSgpCi0gICAgICBpZiBrID09IG5pbCB7Ci0gICAgICAgIHJldHVybiBlLlZhbHVlKCksIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgfQotICB1c2VLZXksIG9rIDo9IHAuS2V5VHlwZSgpLkNvZXJjZURhdGEoa2V5KQotICBpZiAhb2sgewotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIH0KLSAgc3dpdGNoIHAuS2V5VHlwZSgpIHsKLSAgY2FzZSBTVE9QLCBWT0lEOgotICAgIC8vIGlmIGhlcmUsIHRoZW4gd2UgZG9uJ3QgaGF2ZSBhIGtleSB0eXBlIHlldCBhbmQga2V5IGlzIG5vdCBuaWwKLSAgICAvLyBzbyB0aGlzIGlzIHByZXR0eSBtdWNoIGFuIGVtcHR5IG1hcAotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgQk9PTDoKLSAgICBtIDo9IHAuYgotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBuaWwsIGZhbHNlCi0gICAgfQotICAgIGlmIHYsIG9rIDo9IG1bdXNlS2V5Lihib29sKV07IG9rIHsKLSAgICAgIHJldHVybiB2LCB0cnVlCi0gICAgfQotICAgIHJldHVybiBuaWwsIHRydWUKLSAgY2FzZSBCWVRFOgotICAgIG0gOj0gcC5pMDgKLSAgICBpZiB2LCBvayA6PSBtW3VzZUtleS4oYnl0ZSldOyBvayB7Ci0gICAgICByZXR1cm4gdiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIERPVUJMRToKLSAgICBtIDo9IHAuZjY0Ci0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgICB9Ci0gICAgaWYgdiwgb2sgOj0gbVt1c2VLZXkuKGZsb2F0NjQpXTsgb2sgewotICAgICAgcmV0dXJuIHYsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgY2FzZSBJMTY6Ci0gICAgbSA6PSBwLmkxNgotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBuaWwsIGZhbHNlCi0gICAgfQotICAgIGlmIHYsIG9rIDo9IG1bdXNlS2V5LihpbnQxNildOyBvayB7Ci0gICAgICByZXR1cm4gdiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIEkzMjoKLSAgICBtIDo9IHAuaTMyCi0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgICB9Ci0gICAgaWYgdiwgb2sgOj0gbVt1c2VLZXkuKGludDMyKV07IG9rIHsKLSAgICAgIHJldHVybiB2LCB0cnVlCi0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgSTY0OgotICAgIG0gOj0gcC5pNjQKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gbmlsLCBmYWxzZQotICAgIH0KLSAgICBpZiB2LCBvayA6PSBtW3VzZUtleS4oaW50NjQpXTsgb2sgewotICAgICAgcmV0dXJuIHYsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIC8vIFRPRE8ocG9tYWNrKSBwcm9wZXJseSBoYW5kbGUgRU5VTQotICAgIG0gOj0gcC5zCi0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgICB9Ci0gICAgaWYgdiwgb2sgOj0gbVt1c2VLZXkuKHN0cmluZyldOyBvayB7Ci0gICAgICByZXR1cm4gdiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIFNUUlVDVDoKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBlIDo9IGVsZW0uVmFsdWUuKFRNYXBFbGVtKQotICAgICAgayA6PSBlLktleSgpCi0gICAgICBpZiBrID09IG5pbCB7Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBzdHJ1Y3RrZXksIG9rIDo9IGsuKFRTdHJ1Y3QpCi0gICAgICBpZiBvayB7Ci0gICAgICAgIGlmIHN0cnVjdGtleS5FcXVhbHModXNlS2V5LihUU3RydWN0KSkgewotICAgICAgICAgIHJldHVybiBlLlZhbHVlKCksIHRydWUKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgaWYgcmVmbGVjdC5EZWVwRXF1YWwodXNlS2V5LCBrKSB7Ci0gICAgICAgIHJldHVybiBlLlZhbHVlKCksIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5pbCwgZmFsc2UKLSAgY2FzZSBNQVA6Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgZSA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkKLSAgICAgIGsgOj0gZS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgbWFwa2V5LCBvayA6PSBrLihUTWFwKQotICAgICAgaWYgb2sgewotICAgICAgICBpZiBtYXBrZXkuRXF1YWxzKHVzZUtleS4oVE1hcCkpIHsKLSAgICAgICAgICByZXR1cm4gZS5WYWx1ZSgpLCB0cnVlCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIGlmIHJlZmxlY3QuRGVlcEVxdWFsKHVzZUtleSwgaykgewotICAgICAgICByZXR1cm4gZS5WYWx1ZSgpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuaWwsIGZhbHNlCi0gIGNhc2UgU0VUOgotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIHNldGtleSwgb2sgOj0gay4oVFNldCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgc2V0a2V5LkVxdWFscyh1c2VLZXkuKFRTZXQpKSB7Ci0gICAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBpZiByZWZsZWN0LkRlZXBFcXVhbCh1c2VLZXksIGspIHsKLSAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBjYXNlIExJU1Q6Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgZSA6PSBlbGVtLlZhbHVlLihUTWFwRWxlbSkKLSAgICAgIGsgOj0gZS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgICAgbGlzdGtleSwgb2sgOj0gay4oVExpc3QpCi0gICAgICBpZiBvayB7Ci0gICAgICAgIGlmIGxpc3RrZXkuRXF1YWxzKHVzZUtleS4oVExpc3QpKSB7Ci0gICAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBpZiByZWZsZWN0LkRlZXBFcXVhbCh1c2VLZXksIGspIHsKLSAgICAgICAgcmV0dXJuIGUuVmFsdWUoKSwgdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbmlsLCBmYWxzZQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIFRocmlmdCBlbGVtZW50IHR5cGUiKQotICB9Ci0gIHJldHVybiBuaWwsIGZhbHNlCi19Ci0KLQotZnVuYyAocCAqdE1hcCkgU2V0KGtleSwgdmFsdWUgaW50ZXJmYWNle30pIHsKLSAgaWYgcC5LZXlUeXBlKCkgPT0gU1RPUCB8fCBwLktleVR5cGUoKSA9PSBWT0lEIHsKLSAgICBwLmtleVR5cGUgPSBUeXBlRnJvbVZhbHVlKGtleSkKLSAgfQotICBjb2VyY2VkS2V5LCBvayA6PSBwLktleVR5cGUoKS5Db2VyY2VEYXRhKGtleSkKLSAgaWYgIW9rIHsKLSAgICByZXR1cm4KLSAgfQotICBpZiBwLlZhbHVlVHlwZSgpID09IFNUT1AgfHwgcC5WYWx1ZVR5cGUoKSA9PSBWT0lEIHsKLSAgICBwLnZhbHVlVHlwZSA9IFR5cGVGcm9tVmFsdWUodmFsdWUpCi0gIH0KLSAgY29lcmNlZFZhbHVlLCBvayA6PSBwLlZhbHVlVHlwZSgpLkNvZXJjZURhdGEodmFsdWUpCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuCi0gIH0KLSAgbmV3RWxlbSA6PSBOZXdUTWFwRWxlbShjb2VyY2VkS2V5LCBjb2VyY2VkVmFsdWUpCi0gIGlmICFwLktleVR5cGUoKS5Jc0Jhc2VUeXBlKCkgewotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGsgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pLktleSgpCi0gICAgICBpZiBjbXAsIG9rIDo9IHAuS2V5VHlwZSgpLkNvbXBhcmUoY29lcmNlZEtleSwgayk7IG9rICYmIGNtcCA+PSAwIHsKLSAgICAgICAgaWYgY21wID09IDAgewotICAgICAgICAgIHAubC5JbnNlcnRBZnRlcihuZXdFbGVtLCBlbGVtKQotICAgICAgICAgIHAubC5SZW1vdmUoZWxlbSkKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgfQotICAgICAgICBwLmwuSW5zZXJ0QmVmb3JlKG5ld0VsZW0sIGVsZW0pCi0gICAgICAgIHJldHVybgotICAgICAgfQotICAgIH0KLSAgICBwLmwuUHVzaEJhY2sobmV3RWxlbSkKLSAgICByZXR1cm4KLSAgfQotICBpZiBrZXkgPT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotICBzd2l0Y2ggcC5LZXlUeXBlKCkgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgLy8gaWYgaGVyZSwgdGhlbiB3ZSBkb24ndCBoYXZlIGEga2V5IHR5cGUgeWV0IGFuZCBrZXkgaXMgbm90IG5pbAotICAgIC8vIHNvIHRoaXMgaXMgcHJldHR5IG11Y2ggYW4gZW1wdHkgbWFwCi0gICAgcmV0dXJuCi0gIGNhc2UgQk9PTDoKLSAgICBpZiBwLmIgPT0gbmlsIHsKLSAgICAgIHAuYiA9IG1ha2UobWFwW2Jvb2xdaW50ZXJmYWNle30pCi0gICAgfQotICAgIGIgOj0gY29lcmNlZEtleS4oYm9vbCkKLSAgICBwLmJbYl0gPSB2YWx1ZQotICBjYXNlIEJZVEU6Ci0gICAgaWYgcC5pMDggPT0gbmlsIHsKLSAgICAgIHAuaTA4ID0gbWFrZShtYXBbYnl0ZV1pbnRlcmZhY2V7fSkKLSAgICB9Ci0gICAgYiA6PSBjb2VyY2VkS2V5LihieXRlKQotICAgIHAuaTA4W2JdID0gdmFsdWUKLSAgY2FzZSBET1VCTEU6Ci0gICAgaWYgcC5mNjQgPT0gbmlsIHsKLSAgICAgIHAuZjY0ID0gbWFrZShtYXBbZmxvYXQ2NF1pbnRlcmZhY2V7fSkKLSAgICB9Ci0gICAgYiA6PSBjb2VyY2VkS2V5LihmbG9hdDY0KQotICAgIHAuZjY0W2JdID0gdmFsdWUKLSAgY2FzZSBJMTY6Ci0gICAgaWYgcC5pMTYgPT0gbmlsIHsKLSAgICAgIHAuaTE2ID0gbWFrZShtYXBbaW50MTZdaW50ZXJmYWNle30pCi0gICAgfQotICAgIGIgOj0gY29lcmNlZEtleS4oaW50MTYpCi0gICAgcC5pMTZbYl0gPSB2YWx1ZQotICBjYXNlIEkzMjoKLSAgICBpZiBwLmkzMiA9PSBuaWwgewotICAgICAgcC5pMzIgPSBtYWtlKG1hcFtpbnQzMl1pbnRlcmZhY2V7fSkKLSAgICB9Ci0gICAgYiA6PSBjb2VyY2VkS2V5LihpbnQzMikKLSAgICBwLmkzMltiXSA9IHZhbHVlCi0gIGNhc2UgSTY0OgotICAgIGlmIHAuaTY0ID09IG5pbCB7Ci0gICAgICBwLmk2NCA9IG1ha2UobWFwW2ludDY0XWludGVyZmFjZXt9KQotICAgIH0KLSAgICBiIDo9IGNvZXJjZWRLZXkuKGludDY0KQotICAgIHAuaTY0W2JdID0gdmFsdWUKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIGlmIHAucyA9PSBuaWwgewotICAgICAgcC5zID0gbWFrZShtYXBbc3RyaW5nXWludGVyZmFjZXt9KQotICAgIH0KLSAgICBiIDo9IGNvZXJjZWRLZXkuKHN0cmluZykKLSAgICBwLnNbYl0gPSB2YWx1ZQotICBjYXNlIFNUUlVDVCwgTUFQLCBTRVQsIExJU1Q6Ci0gICAgcGFuaWMoIlNob3VsZCBuZXZlciBiZSBoZXJlIikKLSAgZGVmYXVsdDoKLSAgICBwYW5pYygiU2hvdWxkIG5ldmVyIGJlIGhlcmUiKQotICB9Ci19Ci0KLWZ1bmMgKHAgKnRNYXApIENvbnRhaW5zKGtleSBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGNvZXJjZWRLZXksIG9rIDo9IHAuS2V5VHlwZSgpLkNvZXJjZURhdGEoa2V5KQotICBpZiAhb2sgewotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIGlmIGNvZXJjZWRLZXkgPT0gbmlsIHsKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBrIDo9IGVsZW0uVmFsdWUuKFRNYXBFbGVtKS5LZXkoKQotICAgICAgaWYgayA9PSBuaWwgewotICAgICAgICByZXR1cm4gdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICBpZiAhb2sgewotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHN3aXRjaCBwLktleVR5cGUoKSB7Ci0gIGNhc2UgU1RPUDoKLSAgICAvLyBpZiBoZXJlLCB0aGVuIHdlIGRvbid0IGhhdmUgYSBrZXkgdHlwZSB5ZXQgYW5kIGtleSBpcyBub3QgbmlsCi0gICAgLy8gc28gdGhpcyBpcyBwcmV0dHkgbXVjaCBhbiBlbXB0eSBtYXAKLSAgICByZXR1cm4gZmFsc2UKLSAgY2FzZSBWT0lEOgotICAgIC8vIGlmIGhlcmUsIHRoZW4gd2UgZG9uJ3QgaGF2ZSBhIGtleSB0eXBlIHlldCBhbmQga2V5IGlzIG5vdCBuaWwKLSAgICAvLyBzbyB0aGlzIGlzIHByZXR0eSBtdWNoIGFuIGVtcHR5IG1hcAotICAgIHJldHVybiBmYWxzZQotICBjYXNlIEJPT0w6Ci0gICAgbSA6PSBwLmIKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gICAgXywgb2sgOj0gbVtjb2VyY2VkS2V5Lihib29sKV0KLSAgICByZXR1cm4gb2sKLSAgY2FzZSBCWVRFOgotICAgIG0gOj0gcC5pMDgKLSAgICBfLCBvayA6PSBtW2NvZXJjZWRLZXkuKGJ5dGUpXQotICAgIHJldHVybiBvawotICBjYXNlIERPVUJMRToKLSAgICBtIDo9IHAuZjY0Ci0gICAgaWYgbSA9PSBuaWwgewotICAgICAgcmV0dXJuIGZhbHNlCi0gICAgfQotICAgIF8sIG9rIDo9IG1bY29lcmNlZEtleS4oZmxvYXQ2NCldCi0gICAgcmV0dXJuIG9rCi0gIGNhc2UgSTE2OgotICAgIG0gOj0gcC5pMTYKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gICAgXywgb2sgOj0gbVtjb2VyY2VkS2V5LihpbnQxNildCi0gICAgcmV0dXJuIG9rCi0gIGNhc2UgSTMyOgotICAgIG0gOj0gcC5pMzIKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gICAgXywgb2sgOj0gbVtjb2VyY2VkS2V5LihpbnQzMildCi0gICAgcmV0dXJuIG9rCi0gIGNhc2UgSTY0OgotICAgIG0gOj0gcC5pNjQKLSAgICBpZiBtID09IG5pbCB7Ci0gICAgICByZXR1cm4gZmFsc2UKLSAgICB9Ci0gICAgXywgb2sgOj0gbVtjb2VyY2VkS2V5LihpbnQ2NCldCi0gICAgcmV0dXJuIG9rCi0gIGNhc2UgU1RSSU5HLCBVVEY4LCBVVEYxNjoKLSAgICAvLyBUT0RPKHBvbWFjaykgcHJvcGVybHkgaGFuZGxlIEVOVU0KLSAgICBtIDo9IHAucwotICAgIGlmIG0gPT0gbmlsIHsKLSAgICAgIHJldHVybiBmYWxzZQotICAgIH0KLSAgICBfLCBvayA6PSBtW2NvZXJjZWRLZXkuKHN0cmluZyldCi0gICAgcmV0dXJuIG9rCi0gIGNhc2UgU1RSVUNUOgotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIHN0cnVjdGtleSwgb2sgOj0gay4oVFN0cnVjdCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgc3RydWN0a2V5LkVxdWFscyhjb2VyY2VkS2V5LihUU3RydWN0KSkgewotICAgICAgICAgIHJldHVybiB0cnVlCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIGlmIHJlZmxlY3QuRGVlcEVxdWFsKGNvZXJjZWRLZXksIGspIHsKLSAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlCi0gIGNhc2UgTUFQOgotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIG1hcGtleSwgb2sgOj0gay4oVE1hcCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgbWFwa2V5LkVxdWFscyhjb2VyY2VkS2V5LihUTWFwKSkgewotICAgICAgICAgIHJldHVybiB0cnVlCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlCi0gIGNhc2UgU0VUOgotICAgIGZvciBlbGVtIDo9IHAubC5Gcm9udCgpOyBlbGVtICE9IG5pbDsgZWxlbSA9IGVsZW0uTmV4dCgpIHsKLSAgICAgIGUgOj0gZWxlbS5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgICBrIDo9IGUuS2V5KCkKLSAgICAgIGlmIGsgPT0gbmlsIHsKLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICAgIHNldGtleSwgb2sgOj0gay4oVFNldCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgc2V0a2V5LkVxdWFscyhjb2VyY2VkS2V5LihUU2V0KSkgewotICAgICAgICAgIHJldHVybiB0cnVlCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWUKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlCi0gIGNhc2UgTElTVDoKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBlIDo9IGVsZW0uVmFsdWUuKFRNYXBFbGVtKQotICAgICAgayA6PSBlLktleSgpCi0gICAgICBpZiBrID09IG5pbCB7Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICB9Ci0gICAgICBsaXN0a2V5LCBvayA6PSBrLihUTGlzdCkKLSAgICAgIGlmIG9rIHsKLSAgICAgICAgaWYgbGlzdGtleS5FcXVhbHMoY29lcmNlZEtleS4oVExpc3QpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWUKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2UKLSAgZGVmYXVsdDoKLSAgICBwYW5pYygiSW52YWxpZCBUaHJpZnQgZWxlbWVudCB0eXBlIikKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotLy8gSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50czsgZHJpdmVyIGZvciByYW5nZQotZnVuYyAocCAqdE1hcCkgaXRlcmF0ZShjIGNoYW48LSBUTWFwRWxlbSkgewotICBzd2l0Y2ggcC5LZXlUeXBlKCkgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBCT09MOgotICAgIGZvciBrLCB2IDo9IHJhbmdlIHAuYiB7Ci0gICAgICBjIDwtIE5ld1RNYXBFbGVtKGssIHYpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgQllURToKLSAgICBmb3IgaywgdiA6PSByYW5nZSBwLmkwOCB7Ci0gICAgICBjIDwtIE5ld1RNYXBFbGVtKGssIHYpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgSTE2OgotICAgIGZvciBrLCB2IDo9IHJhbmdlIHAuaTE2IHsKLSAgICAgIGMgPC0gTmV3VE1hcEVsZW0oaywgdikKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBJMzI6Ci0gICAgZm9yIGssIHYgOj0gcmFuZ2UgcC5pMzIgewotICAgICAgYyA8LSBOZXdUTWFwRWxlbShrLCB2KQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIEk2NDoKLSAgICBmb3IgaywgdiA6PSByYW5nZSBwLmk2NCB7Ci0gICAgICBjIDwtIE5ld1RNYXBFbGVtKGssIHYpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgRE9VQkxFOgotICAgIGZvciBrLCB2IDo9IHJhbmdlIHAuZjY0IHsKLSAgICAgIGMgPC0gTmV3VE1hcEVsZW0oaywgdikKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIGZvciBrLCB2IDo9IHJhbmdlIHAucyB7Ci0gICAgICBjIDwtIE5ld1RNYXBFbGVtKGssIHYpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU1RSVUNUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgTElTVDoKLSAgICBmb3IgdiA6PSBwLmwuRnJvbnQoKTsgdiAhPSBuaWw7IHYgPSB2Lk5leHQoKSB7Ci0gICAgICBjIDwtIHYuVmFsdWUuKFRNYXBFbGVtKQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIFNFVDoKLSAgICBmb3IgdiA6PSBwLmwuRnJvbnQoKTsgdiAhPSBuaWw7IHYgPSB2Lk5leHQoKSB7Ci0gICAgICBjIDwtIHYuVmFsdWUuKFRNYXBFbGVtKQotICAgIH0KLSAgICBjbG9zZShjKQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIFRocmlmdCB0eXBlIikKLSAgfQotfQotCi0vLyBDaGFubmVsIGl0ZXJhdG9yIGZvciByYW5nZS4KLWZ1bmMgKHAgKnRNYXApIEl0ZXIoKSA8LWNoYW4gVE1hcEVsZW0gewotICBjIDo9IG1ha2UoY2hhbiBUTWFwRWxlbSkKLSAgZ28gcC5pdGVyYXRlKGMpCi0gIHJldHVybiBjCi19Ci0KLS8vIEl0ZXJhdGUgb3ZlciBhbGwga2V5czsgZHJpdmVyIGZvciByYW5nZQotZnVuYyAocCAqdE1hcCkgaXRlcmF0ZUtleXMoYyBjaGFuPC0gaW50ZXJmYWNle30pIHsKLSAgc3dpdGNoIHAuS2V5VHlwZSgpIHsKLSAgY2FzZSBTVE9QLCBWT0lEOgotICAgIGNsb3NlKGMpCi0gIGNhc2UgQk9PTDoKLSAgICBmb3IgaywgXyA6PSByYW5nZSBwLmIgewotICAgICAgYyA8LSBrCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgQllURToKLSAgICBmb3IgaywgXyA6PSByYW5nZSBwLmkwOCB7Ci0gICAgICBjIDwtIGsKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBJMTY6Ci0gICAgZm9yIGssIF8gOj0gcmFuZ2UgcC5pMTYgewotICAgICAgYyA8LSBrCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgSTMyOgotICAgIGZvciBrLCBfIDo9IHJhbmdlIHAuaTMyIHsKLSAgICAgIGMgPC0gawotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIEk2NDoKLSAgICBmb3IgaywgXyA6PSByYW5nZSBwLmk2NCB7Ci0gICAgICBjIDwtIGsKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBET1VCTEU6Ci0gICAgZm9yIGssIF8gOj0gcmFuZ2UgcC5mNjQgewotICAgICAgYyA8LSBrCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU1RSSU5HLCBVVEY4LCBVVEYxNjoKLSAgICBmb3IgaywgXyA6PSByYW5nZSBwLnMgewotICAgICAgYyA8LSBrCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU1RSVUNUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pLktleSgpCi0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgTElTVDoKLSAgICBmb3IgdiA6PSBwLmwuRnJvbnQoKTsgdiAhPSBuaWw7IHYgPSB2Lk5leHQoKSB7Ci0gICAgICBjIDwtIHYuVmFsdWUuKFRNYXBFbGVtKS5LZXkoKQotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIFNFVDoKLSAgICBmb3IgdiA6PSBwLmwuRnJvbnQoKTsgdiAhPSBuaWw7IHYgPSB2Lk5leHQoKSB7Ci0gICAgICBjIDwtIHYuVmFsdWUuKFRNYXBFbGVtKS5LZXkoKQotICAgIH0KLSAgICBjbG9zZShjKQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIFRocmlmdCB0eXBlIikKLSAgfQotfQotCi1mdW5jIChwICp0TWFwKSBLZXlJdGVyKCkgPC1jaGFuIGludGVyZmFjZXt9IHsKLSAgYyA6PSBtYWtlKGNoYW4gaW50ZXJmYWNle30pCi0gIGdvIHAuaXRlcmF0ZUtleXMoYykKLSAgcmV0dXJuIGMKLX0KLQotLy8gSXRlcmF0ZSBvdmVyIGFsbCB2YWx1ZXM7IGRyaXZlciBmb3IgcmFuZ2UKLWZ1bmMgKHAgKnRNYXApIGl0ZXJhdGVWYWx1ZXMoYyBjaGFuPC0gaW50ZXJmYWNle30pIHsKLSAgc3dpdGNoIHAuS2V5VHlwZSgpIHsKLSAgY2FzZSBTVE9QLCBWT0lEOgotICAgIGNsb3NlKGMpCi0gIGNhc2UgQk9PTDoKLSAgICBmb3IgXywgdiA6PSByYW5nZSBwLmIgewotICAgICAgYyA8LSB2Ci0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgQllURToKLSAgICBmb3IgXywgdiA6PSByYW5nZSBwLmkwOCB7Ci0gICAgICBjIDwtIHYKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBJMTY6Ci0gICAgZm9yIF8sIHYgOj0gcmFuZ2UgcC5pMTYgewotICAgICAgYyA8LSB2Ci0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgSTMyOgotICAgIGZvciBfLCB2IDo9IHJhbmdlIHAuaTMyIHsKLSAgICAgIGMgPC0gdgotICAgIH0KLSAgICBjbG9zZShjKQotICBjYXNlIEk2NDoKLSAgICBmb3IgXywgdiA6PSByYW5nZSBwLmk2NCB7Ci0gICAgICBjIDwtIHYKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBET1VCTEU6Ci0gICAgZm9yIF8sIHYgOj0gcmFuZ2UgcC5mNjQgewotICAgICAgYyA8LSB2Ci0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU1RSSU5HLCBVVEY4LCBVVEYxNjoKLSAgICBmb3IgXywgdiA6PSByYW5nZSBwLnMgewotICAgICAgYyA8LSB2Ci0gICAgfQotICAgIGNsb3NlKGMpCi0gIGNhc2UgU1RSVUNUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pLlZhbHVlKCkKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBMSVNUOgotICAgIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICAgIGMgPC0gdi5WYWx1ZS4oVE1hcEVsZW0pLlZhbHVlKCkKLSAgICB9Ci0gICAgY2xvc2UoYykKLSAgY2FzZSBTRVQ6Ci0gICAgZm9yIHYgOj0gcC5sLkZyb250KCk7IHYgIT0gbmlsOyB2ID0gdi5OZXh0KCkgewotICAgICAgYyA8LSB2LlZhbHVlLihUTWFwRWxlbSkuVmFsdWUoKQotICAgIH0KLSAgICBjbG9zZShjKQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIFRocmlmdCB0eXBlIikKLSAgfQotfQotCi1mdW5jIChwICp0TWFwKSBWYWx1ZUl0ZXIoKSA8LWNoYW4gaW50ZXJmYWNle30gewotICBjIDo9IG1ha2UoY2hhbiBpbnRlcmZhY2V7fSkKLSAgZ28gcC5pdGVyYXRlVmFsdWVzKGMpCi0gIHJldHVybiBjCi19Ci0KLQotZnVuYyAocCAqdE1hcCkgTGVzcyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGNtcCwgb2sgOj0gcC5Db21wYXJlVG8ob3RoZXIpCi0gIHJldHVybiBvayAmJiBjbXAgPiAwCi19Ci0KLWZ1bmMgKHAgKnRNYXApIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGMsIGNvayA6PSBwLkNvbXBhcmVUbyhvdGhlcikKLSAgcmV0dXJuIGNvayAmJiBjID09IDAKLX0KLQotZnVuYyAocCAqdE1hcCkgQ29tcGFyZVRvKG90aGVyIGludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIHJldHVybiBUVHlwZShNQVApLkNvbXBhcmUocCwgb3RoZXIpCi19Ci0KLWZ1bmMgKHAgKnRNYXApIEtleXMoKSBbXWludGVyZmFjZXt9IHsKLSAgc2l6ZSA6PSBwLkxlbigpCi0gIHZhbHVlcyA6PSBtYWtlKFtdaW50ZXJmYWNle30sIHNpemUsIHNpemUpCi0gIGkgOj0gMAotICBmb3IgayA6PSByYW5nZSBwLktleUl0ZXIoKSB7Ci0gICAgdmFsdWVzW2ldID0gawotICAgIGkrKwotICB9Ci0gIHJldHVybiB2YWx1ZXMKLX0KLQotZnVuYyAocCAqdE1hcCkgVmFsdWVzKCkgW11pbnRlcmZhY2V7fSB7Ci0gIHNpemUgOj0gcC5MZW4oKQotICB2YWx1ZXMgOj0gbWFrZShbXWludGVyZmFjZXt9LCBzaXplLCBzaXplKQotICBpIDo9IDAKLSAgZm9yIHYgOj0gcmFuZ2UgcC5WYWx1ZUl0ZXIoKSB7Ci0gICAgdmFsdWVzW2ldID0gdgotICAgIGkrKwotICB9Ci0gIHJldHVybiB2YWx1ZXMKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdG1lbW9yeV9idWZmZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3RtZW1vcnlfYnVmZmVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWI3OTRlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG1lbW9yeV9idWZmZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiYnl0ZXMiCi0gICJpbyIKLSAgIm9zIgotKQotCi0vKioKLSAqIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgotICoKLSAqLwotdHlwZSBUTWVtb3J5QnVmZmVyIHN0cnVjdCB7Ci0gIGJ1ZiAgKmJ5dGVzLkJ1ZmZlcgotICBzaXplIGludAotfQotCi10eXBlIFRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0gIHNpemUgaW50Ci19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0gIGlmIHRyYW5zICE9IG5pbCB7Ci0gICAgdCwgb2sgOj0gdHJhbnMuKCpUTWVtb3J5QnVmZmVyKQotICAgIGlmIG9rICYmIHQuc2l6ZSA+IDAgewotICAgICAgcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4odC5zaXplKQotICAgIH0KLSAgfQotICByZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbihwLnNpemUpCi19Ci0KLWZ1bmMgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkoc2l6ZSBpbnQpICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiAmVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnl7c2l6ZTogc2l6ZX0KLX0KLQotZnVuYyBOZXdUTWVtb3J5QnVmZmVyKCkgKlRNZW1vcnlCdWZmZXIgewotICByZXR1cm4gJlRNZW1vcnlCdWZmZXJ7YnVmOiAmYnl0ZXMuQnVmZmVye30sIHNpemU6IDB9Ci19Ci0KLWZ1bmMgTmV3VE1lbW9yeUJ1ZmZlckxlbihzaXplIGludCkgKlRNZW1vcnlCdWZmZXIgewotICBidWYgOj0gbWFrZShbXWJ5dGUsIDAsIHNpemUpCi0gIHJldHVybiAmVE1lbW9yeUJ1ZmZlcntidWY6IGJ5dGVzLk5ld0J1ZmZlcihidWYpLCBzaXplOiBzaXplfQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHRydWUKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgT3BlbigpIG9zLkVycm9yIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIENsb3NlKCkgb3MuRXJyb3IgewotICBwLmJ1Zi5SZXNldCgpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgUmVhZChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gcC5idWYuUmVhZChidWYpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIFJlYWRBbGxUcmFuc3BvcnQocCwgYnVmKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBSZWFkQnl0ZSgpIChieXRlLCBvcy5FcnJvcikgewotICByZXR1cm4gcC5idWYuUmVhZEJ5dGUoKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBSZWFkRnJvbShyIGlvLlJlYWRlcikgKGludDY0LCBvcy5FcnJvcikgewotICByZXR1cm4gcC5idWYuUmVhZEZyb20ocikKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIHAuYnVmLldyaXRlKGJ1ZikKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgV3JpdGVTdHJpbmcoYnVmIHN0cmluZykgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIHAuYnVmLldyaXRlU3RyaW5nKGJ1ZikKLX0KLQotZnVuYyAocCAqVE1lbW9yeUJ1ZmZlcikgV3JpdGVUbyh3IGlvLldyaXRlcikgKGludDY0LCBvcy5FcnJvcikgewotICByZXR1cm4gcC5idWYuV3JpdGVUbyh3KQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBSZXNldCgpIHsKLSAgcC5idWYuUmVzZXQoKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBCeXRlcygpIFtdYnl0ZSB7Ci0gIHJldHVybiBwLmJ1Zi5CeXRlcygpCi19Ci0KLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIExlbigpIGludCB7Ci0gIHJldHVybiBwLmJ1Zi5MZW4oKQotfQotCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5idWYuU3RyaW5nKCkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdG1lbW9yeV9idWZmZXJfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdG1lbW9yeV9idWZmZXJfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxNzg2NC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RtZW1vcnlfYnVmZmVyX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSkKLQotZnVuYyBUZXN0TWVtb3J5QnVmZmVyKHQgKnRlc3RpbmcuVCkgewotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyTGVuKDEwMjQpCi0gIFRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bWVzc2FnZS5nbyBiL2xpYi9nby90aHJpZnQvdG1lc3NhZ2UuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjhjYjQuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bWVzc2FnZS5nbworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc3RydWN0IG1ldGFkYXRhLgotICoKLSAqLwotdHlwZSBUTWVzc2FnZSBpbnRlcmZhY2UgewotICBOYW1lKCkgc3RyaW5nCi0gIFR5cGVJZCgpIFRNZXNzYWdlVHlwZQotICBTZXFJZCgpIGludAotICBFcXVhbHMob3RoZXIgVE1lc3NhZ2UpIGJvb2wKLX0KLXR5cGUgdE1lc3NhZ2Ugc3RydWN0IHsKLSAgbmFtZSAgIHN0cmluZwotICB0eXBlSWQgVE1lc3NhZ2VUeXBlCi0gIHNlcWlkICBpbnQKLX0KLQotZnVuYyBOZXdUTWVzc2FnZURlZmF1bHQoKSBUTWVzc2FnZSB7Ci0gIHJldHVybiBOZXdUTWVzc2FnZSgiIiwgU1RPUCwgMCkKLX0KLQotZnVuYyBOZXdUTWVzc2FnZShuIHN0cmluZywgdCBUTWVzc2FnZVR5cGUsIHMgaW50KSBUTWVzc2FnZSB7Ci0gIHJldHVybiAmdE1lc3NhZ2V7bmFtZTogbiwgdHlwZUlkOiB0LCBzZXFpZDogc30KLX0KLQotZnVuYyAocCAqdE1lc3NhZ2UpIE5hbWUoKSBzdHJpbmcgewotICByZXR1cm4gcC5uYW1lCi19Ci0KLWZ1bmMgKHAgKnRNZXNzYWdlKSBUeXBlSWQoKSBUTWVzc2FnZVR5cGUgewotICByZXR1cm4gcC50eXBlSWQKLX0KLQotZnVuYyAocCAqdE1lc3NhZ2UpIFNlcUlkKCkgaW50IHsKLSAgcmV0dXJuIHAuc2VxaWQKLX0KLQotZnVuYyAocCAqdE1lc3NhZ2UpIFN0cmluZygpIHN0cmluZyB7Ci0gIHJldHVybiAiPFRNZXNzYWdlIG5hbWU6JyIgKyBwLm5hbWUgKyAiJyB0eXBlOiAiICsgc3RyaW5nKHAudHlwZUlkKSArICIgc2VxaWQ6IiArIHN0cmluZyhwLnNlcWlkKSArICI+IgotfQotCi1mdW5jIChwICp0TWVzc2FnZSkgRXF1YWxzKG90aGVyIFRNZXNzYWdlKSBib29sIHsKLSAgcmV0dXJuIHAubmFtZSA9PSBvdGhlci5OYW1lKCkgJiYgcC50eXBlSWQgPT0gb3RoZXIuVHlwZUlkKCkgJiYgcC5zZXFpZCA9PSBvdGhlci5TZXFJZCgpCi19Ci0KLXZhciBFTVBUWV9NRVNTQUdFIFRNZXNzYWdlCi0KLWZ1bmMgaW5pdCgpIHsKLSAgRU1QVFlfTUVTU0FHRSA9IE5ld1RNZXNzYWdlRGVmYXVsdCgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RtZXNzYWdldHlwZS5nbyBiL2xpYi9nby90aHJpZnQvdG1lc3NhZ2V0eXBlLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzFjNjZjLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG1lc3NhZ2V0eXBlLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vKioKLSAqIE1lc3NhZ2UgdHlwZSBjb25zdGFudHMgaW4gdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLXR5cGUgVE1lc3NhZ2VUeXBlIGludDMyCi0KLWNvbnN0ICgKLSAgSU5WQUxJRF9UTUVTU0FHRV9UWVBFIFRNZXNzYWdlVHlwZSA9IDAKLSAgQ0FMTCAgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDEKLSAgUkVQTFkgICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDIKLSAgRVhDRVBUSU9OICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDMKLSAgT05FV0FZICAgICAgICAgICAgICAgIFRNZXNzYWdlVHlwZSA9IDQKLSkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NlcnZlci5nbyBiL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NlcnZlci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzNGM1YS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ19zZXJ2ZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAib3MiCi0pCi0KLS8qKgotICogQSBub25ibG9ja2luZyBUU2VydmVyIGltcGxlbWVudGF0aW9uLiBUaGlzIGFsbG93cyBmb3IgZmFpcm5lc3MgYW1vbmdzdCBhbGwKLSAqIGNvbm5lY3RlZCBjbGllbnRzIGluIHRlcm1zIG9mIGludm9jYXRpb25zLgotICoKLSAqIFRoaXMgc2VydmVyIGlzIGluaGVyZW50bHkgc2luZ2xlLXRocmVhZGVkLiBJZiB5b3Ugd2FudCBhIGxpbWl0ZWQgdGhyZWFkIHBvb2wKLSAqIGNvdXBsZWQgd2l0aCBpbnZvY2F0aW9uLWZhaXJuZXNzLCBzZWUgVEhzSGFTZXJ2ZXIuCi0gKgotICogVG8gdXNlIHRoaXMgc2VydmVyLCB5b3UgTVVTVCB1c2UgYSBURnJhbWVkVHJhbnNwb3J0IGF0IHRoZSBvdXRlcm1vc3QKLSAqIHRyYW5zcG9ydCwgb3RoZXJ3aXNlIHRoaXMgc2VydmVyIHdpbGwgYmUgdW5hYmxlIHRvIGRldGVybWluZSB3aGVuIGEgd2hvbGUKLSAqIG1ldGhvZCBjYWxsIGhhcyBiZWVuIHJlYWQgb2ZmIHRoZSB3aXJlLiBDbGllbnRzIG11c3QgYWxzbyB1c2UgVEZyYW1lZFRyYW5zcG9ydC4KLSAqLwotdHlwZSBUTm9uYmxvY2tpbmdTZXJ2ZXIgc3RydWN0IHsKLSAgLyoqIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIgKi8KLSAgc3RvcHBlZCBib29sCi0KLSAgcHJvY2Vzc29yRmFjdG9yeSAgICAgICBUUHJvY2Vzc29yRmFjdG9yeQotICBzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKLSAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5ICBUVHJhbnNwb3J0RmFjdG9yeQotICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5Ci0gIGlucHV0UHJvdG9jb2xGYWN0b3J5ICAgVFByb3RvY29sRmFjdG9yeQotICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgIFRQcm90b2NvbEZhY3RvcnkKLX0KLQotCi1mdW5jIE5ld1ROb25ibG9ja2luZ1NlcnZlcjIocHJvY2Vzc29yIFRQcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0KSAqVE5vbmJsb2NraW5nU2VydmVyIHsKLSAgcmV0dXJuIE5ld1ROb25ibG9ja2luZ1NlcnZlckZhY3RvcnkyKE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCkKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXI0KHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUTm9uYmxvY2tpbmdTZXJ2ZXIgewotICByZXR1cm4gTmV3VE5vbmJsb2NraW5nU2VydmVyRmFjdG9yeTQoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXI2KHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBpbnB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlROb25ibG9ja2luZ1NlcnZlciB7Ci0gIHJldHVybiBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJGYWN0b3J5NihOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJGYWN0b3J5Mihwcm9jZXNzb3JGYWN0b3J5IFRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlROb25ibG9ja2luZ1NlcnZlciB7Ci0gIHJldHVybiBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5LAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgIE5ld1RUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKLSAgICBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAotICApCi19Ci0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU2VydmVyRmFjdG9yeTQocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVE5vbmJsb2NraW5nU2VydmVyIHsKLSAgcmV0dXJuIE5ld1ROb25ibG9ja2luZ1NlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCi0gICAgc2VydmVyVHJhbnNwb3J0LAotICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgcHJvdG9jb2xGYWN0b3J5LAotICApCi19Ci0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU2VydmVyRmFjdG9yeTYocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUTm9uYmxvY2tpbmdTZXJ2ZXIgewotICByZXR1cm4gJlROb25ibG9ja2luZ1NlcnZlcntwcm9jZXNzb3JGYWN0b3J5OiBwcm9jZXNzb3JGYWN0b3J5LAotICAgIHNlcnZlclRyYW5zcG9ydDogICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk6ICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeTogICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk6ICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gIH0KLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBQcm9jZXNzb3JGYWN0b3J5KCkgVFByb2Nlc3NvckZhY3RvcnkgewotICByZXR1cm4gcC5wcm9jZXNzb3JGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgU2VydmVyVHJhbnNwb3J0KCkgVFNlcnZlclRyYW5zcG9ydCB7Ci0gIHJldHVybiBwLnNlcnZlclRyYW5zcG9ydAotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXIpIElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuIHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuIHAub3V0cHV0VHJhbnNwb3J0RmFjdG9yeQotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXIpIElucHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiBwLmlucHV0UHJvdG9jb2xGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgT3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiBwLm91dHB1dFByb3RvY29sRmFjdG9yeQotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXIpIFNlcnZlKCkgb3MuRXJyb3IgewotICBwLnN0b3BwZWQgPSBmYWxzZQotICBlcnIgOj0gcC5zZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGZvciAhcC5zdG9wcGVkIHsKLSAgICBjbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIGVycgotICAgIH0KLSAgICBpZiBjbGllbnQgIT0gbmlsIHsKLSAgICAgIGdvIHAucHJvY2Vzc1JlcXVlc3QoY2xpZW50KQotICAgIH0KLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgU3RvcCgpIG9zLkVycm9yIHsKLSAgcC5zdG9wcGVkID0gdHJ1ZQotICBwLnNlcnZlclRyYW5zcG9ydC5JbnRlcnJ1cHQoKQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlcikgSXNTdG9wcGVkKCkgYm9vbCB7Ci0gIHJldHVybiBwLnN0b3BwZWQKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyKSBwcm9jZXNzUmVxdWVzdChjbGllbnQgVFRyYW5zcG9ydCkgewotICBwcm9jZXNzb3IgOj0gcC5wcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpCi0gIGlucHV0VHJhbnNwb3J0IDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCi0gIG91dHB1dFRyYW5zcG9ydCA6PSBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgaW5wdXRQcm90b2NvbCA6PSBwLmlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KQotICBvdXRwdXRQcm90b2NvbCA6PSBwLm91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpCi0gIGlmIGlucHV0VHJhbnNwb3J0ICE9IG5pbCB7Ci0gICAgZGVmZXIgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKQotICB9Ci0gIGlmIG91dHB1dFRyYW5zcG9ydCAhPSBuaWwgewotICAgIGRlZmVyIG91dHB1dFRyYW5zcG9ydC5DbG9zZSgpCi0gIH0KLSAgZm9yIHsKLSAgICBvaywgZSA6PSBwcm9jZXNzb3IuUHJvY2VzcyhpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICBpZiAhcC5zdG9wcGVkIHsKLSAgICAgICAgLy8gVE9ETyhwb21hY2spIGxvZyBlcnJvcgotICAgICAgICBicmVhawotICAgICAgfQotICAgIH0KLSAgICBpZiAhb2sgewotICAgICAgYnJlYWsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NlcnZlcl9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ19zZXJ2ZXJfc29ja2V0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzlkYmFhLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NlcnZlcl9zb2NrZXQuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAibmV0IgotICAib3MiCi0pCi0KLS8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCi0gKi8KLXR5cGUgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHN0cnVjdCB7Ci0gIGxpc3RlbmVyIG5ldC5MaXN0ZW5lcgotICBhZGRyICAgICBuZXQuQWRkcgotICAvKioKLSAgICogU29ja2V0IHRpbWVvdXQKLSAgICovCi0gIG5zZWNUaW1lb3V0IGludDY0Ci19Ci0KLXR5cGUgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewotICBhZGRyIG5ldC5BZGRyCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgaWYgdHJhbnMgIT0gbmlsIHsKLSAgICB0LCBvayA6PSB0cmFucy4oKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkKLSAgICBpZiBvayAmJiB0LmFkZHIgIT0gbmlsIHsKLSAgICAgIHMsIF8gOj0gTmV3VE5vbmJsb2NraW5nU2VydmVyU29ja2V0QWRkcih0LmFkZHIpCi0gICAgICBzLlNldFRpbWVvdXQodC5uc2VjVGltZW91dCkKLSAgICAgIHJldHVybiBzCi0gICAgfQotICB9Ci0gIHMsIF8gOj0gTmV3VE5vbmJsb2NraW5nU2VydmVyU29ja2V0QWRkcihwLmFkZHIpCi0gIHJldHVybiBzCi19Ci0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeShhZGRyIG5ldC5BZGRyKSAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiAmVE5vbmJsb2NraW5nU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeXthZGRyOiBhZGRyfQotfQotCi0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU2VydmVyU29ja2V0TGlzdGVuZXIobGlzdGVuZXIgbmV0Lkxpc3RlbmVyKSAoKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCwgVFRyYW5zcG9ydEV4Y2VwdGlvbikgewotICBzIDo9ICZUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXR7bGlzdGVuZXI6IGxpc3RlbmVyLCBhZGRyOiBsaXN0ZW5lci5BZGRyKCl9Ci0gIHJldHVybiBzLCBuaWwKLX0KLQotZnVuYyBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRBZGRyKGFkZHIgbmV0LkFkZHIpICgqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIHMgOj0gJlROb25ibG9ja2luZ1NlcnZlclNvY2tldHthZGRyOiBhZGRyfQotICByZXR1cm4gcywgbmlsCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgTGlzdGVuKCkgb3MuRXJyb3IgewotICByZXR1cm4gcC5PcGVuKCkKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBzb2NrZXQgdGltZW91dAotICoKLSAqIEBwYXJhbSB0aW1lb3V0IE5hbm9zZWNvbmRzIHRpbWVvdXQKLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBTZXRUaW1lb3V0KG5zZWNUaW1lb3V0IGludDY0KSBvcy5FcnJvciB7Ci0gIHAubnNlY1RpbWVvdXQgPSBuc2VjVGltZW91dAotICByZXR1cm4gbmlsCi19Ci0KLS8qKgotICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCi0gKi8KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgSXNPcGVuKCkgYm9vbCB7Ci0gIHJldHVybiBwLmxpc3RlbmVyICE9IG5pbAotfQotCi0vKioKLSAqIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIE9wZW4oKSBvcy5FcnJvciB7Ci0gIGlmICFwLklzT3BlbigpIHsKLSAgICBsLCBlcnIgOj0gbmV0Lkxpc3RlbihwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCkpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gZXJyCi0gICAgfQotICAgIHAubGlzdGVuZXIgPSBsCi0gICAgcmV0dXJuIG5pbAotICB9Ci0gIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgcmVhZCBpbnRvIGJ1ZmZlci4KLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldC5SZWFkKFtdYnl0ZSkgaXMgbm90IGltcGxlbWVudGVkIikKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBSZWFkQWxsKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBSZWFkQWxsVHJhbnNwb3J0KHAsIGJ1ZikKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgd3JpdGUgb2YgdGhlIGRhdGEgaW4gYnVmZmVyOwotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKFVOS05PV05fVFJBTlNQT1JUX0VYQ0VQVElPTiwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Xcml0ZShbXWJ5dGUpIGlzIG5vdCBpbXBsZW1lbnRlZCIpCi19Ci0KLS8qKgotICogRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIEZsdXNoKCkgb3MuRXJyb3IgewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sICJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuRmx1c2goKSBpcyBub3QgaW1wbGVtZW50ZWQiKQotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7Ci0gIHJldHVybiBwLmFkZHIKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBBY2NlcHQoKSAoVFRyYW5zcG9ydCwgb3MuRXJyb3IpIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQotICB9Ci0gIGNvbm4sIGVyciA6PSBwLmxpc3RlbmVyLkFjY2VwdCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgY29ubi5TZXRUaW1lb3V0KHAubnNlY1RpbWVvdXQpCi0gIHJldHVybiBOZXdUU29ja2V0Q29ubihjb25uKQotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpIFBlZWsoKSBib29sIHsKLSAgcmV0dXJuIHAuSXNPcGVuKCkKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHNvY2tldC4KLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KSBDbG9zZSgpIChlcnIgb3MuRXJyb3IpIHsKLSAgaWYgcC5Jc09wZW4oKSB7Ci0gICAgZXJyIDo9IHAubGlzdGVuZXIuQ2xvc2UoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICAgIHAubGlzdGVuZXIgPSBuaWwKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgb3MuRXJyb3IgewotICAvLyBwcm9iYWJseSBub3QgcmlnaHQKLSAgcmV0dXJuIHAuQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfc29ja2V0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjE3NWI4Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3NvY2tldC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJuZXQiCi0gICJvcyIKLSkKLQotLyoqCi0gKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBUbyBiZSBjb21tZW50ZWQgc29vbiEKLSAqLwotdHlwZSBUTm9uYmxvY2tpbmdTb2NrZXQgc3RydWN0IHsKLSAgY29ubiBuZXQuQ29ubgotICBhZGRyIG5ldC5BZGRyCi0gIC8qKgotICAgKiBTb2NrZXQgdGltZW91dAotICAgKi8KLSAgbnNlY1RpbWVvdXQgaW50NjQKLX0KLQotdHlwZSBUTm9uYmxvY2tpbmdTb2NrZXRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0gIGFkZHIgbmV0LkFkZHIKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotICBpZiB0cmFucyAhPSBuaWwgewotICAgIHQsIG9rIDo9IHRyYW5zLigqVE5vbmJsb2NraW5nU29ja2V0KQotICAgIGlmIG9rIHsKLSAgICAgIHMsIF8gOj0gTmV3VE5vbmJsb2NraW5nU29ja2V0QWRkcih0LmFkZHIpCi0gICAgICBzLlNldFRpbWVvdXQodC5uc2VjVGltZW91dCkKLSAgICAgIHJldHVybiBzCi0gICAgfQotICB9Ci0gIHMsIF8gOj0gTmV3VE5vbmJsb2NraW5nU29ja2V0QWRkcihwLmFkZHIpCi0gIHJldHVybiBzCi19Ci0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU29ja2V0VHJhbnNwb3J0RmFjdG9yeShhZGRyIG5ldC5BZGRyKSAqVE5vbmJsb2NraW5nU29ja2V0VHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiAmVE5vbmJsb2NraW5nU29ja2V0VHJhbnNwb3J0RmFjdG9yeXthZGRyOiBhZGRyfQotfQotCi1mdW5jIE5ld1ROb25ibG9ja2luZ1NvY2tldENvbm4oY29ubiBuZXQuQ29ubikgKCpUTm9uYmxvY2tpbmdTb2NrZXQsIFRUcmFuc3BvcnRFeGNlcHRpb24pIHsKLSAgcyA6PSAmVE5vbmJsb2NraW5nU29ja2V0e2Nvbm46IGNvbm4sIGFkZHI6IGNvbm4uUmVtb3RlQWRkcigpfQotICByZXR1cm4gcywgbmlsCi19Ci0KLWZ1bmMgTmV3VE5vbmJsb2NraW5nU29ja2V0QWRkcihhZGRyIG5ldC5BZGRyKSAoKlROb25ibG9ja2luZ1NvY2tldCwgVFRyYW5zcG9ydEV4Y2VwdGlvbikgewotICBzIDo9ICZUTm9uYmxvY2tpbmdTb2NrZXR7YWRkcjogYWRkcn0KLSAgcmV0dXJuIHMsIG5pbAotfQotCi0vKioKLSAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0Ci0gKgotICogQHBhcmFtIG5zZWNUaW1lb3V0IE5hbm9zZWNvbmRzIHRpbWVvdXQKLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBTZXRUaW1lb3V0KG5zZWNUaW1lb3V0IGludDY0KSBvcy5FcnJvciB7Ci0gIHAubnNlY1RpbWVvdXQgPSBuc2VjVGltZW91dAotICBpZiBwLklzT3BlbigpIHsKLSAgICBpZiBlcnIgOj0gcC5jb25uLlNldFRpbWVvdXQobnNlY1RpbWVvdXQpOyBlcnIgIT0gbmlsIHsKLSAgICAgIExPR0dFUi5QcmludCgiQ291bGQgbm90IHNldCBzb2NrZXQgdGltZW91dC4iLCBlcnIpCi0gICAgICByZXR1cm4gZXJyCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotLyoqCi0gKiBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC4KLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIHAuY29ubiAhPSBuaWwKLX0KLQotLyoqCi0gKiBDb25uZWN0cyB0aGUgc29ja2V0LCBjcmVhdGluZyBhIG5ldyBzb2NrZXQgb2JqZWN0IGlmIG5lY2Vzc2FyeS4KLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBPcGVuKCkgb3MuRXJyb3IgewotICBpZiBwLklzT3BlbigpIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuIikKLSAgfQotICBpZiBwLmFkZHIgPT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCi0gIH0KLSAgaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQotICB9Ci0gIGlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIGFkZHJlc3MuIikKLSAgfQotCi0gIHZhciBlcnIgb3MuRXJyb3IKLSAgaWYgcC5jb25uLCBlcnIgPSBuZXQuRGlhbChwLmFkZHIuTmV0d29yaygpLCBwLmFkZHIuU3RyaW5nKCkpOyBlcnIgIT0gbmlsIHsKLSAgICBMT0dHRVIuUHJpbnQoIkNvdWxkIG5vdCBvcGVuIHNvY2tldCIsIGVyci5TdHJpbmcoKSkKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLlN0cmluZygpKQotICB9Ci0gIGlmIHAuY29ubiAhPSBuaWwgewotICAgIHAuY29ubi5TZXRUaW1lb3V0KHAubnNlY1RpbWVvdXQpCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0vKioKLSAqIFBlcmZvcm0gYSBub25ibG9ja2luZyByZWFkIGludG8gYnVmZmVyLgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCi0gIH0KLSAgbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKLSAgcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBSZWFkQWxsKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiBSZWFkQWxsVHJhbnNwb3J0KHAsIGJ1ZikKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGEgbm9uYmxvY2tpbmcgd3JpdGUgb2YgdGhlIGRhdGEgaW4gYnVmZmVyOwotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIGlmICFwLklzT3BlbigpIHsKLSAgICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQotICB9Ci0gIHJldHVybiBwLmNvbm4uV3JpdGUoYnVmKQotfQotCi0vKioKLSAqIEZsdXNoZXMgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBpZiBub3QgbnVsbC4KLSAqLwotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCi0gIH0KLSAgZiwgb2sgOj0gcC5jb25uLihGbHVzaGVyKQotICBpZiBvayB7Ci0gICAgZXJyIDo9IGYuRmx1c2goKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVE5vbmJsb2NraW5nU29ja2V0KSBBZGRyKCkgbmV0LkFkZHIgewotICByZXR1cm4gcC5hZGRyCi19Ci0KLWZ1bmMgKHAgKlROb25ibG9ja2luZ1NvY2tldCkgUGVlaygpIGJvb2wgewotICByZXR1cm4gcC5Jc09wZW4oKQotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgc29ja2V0LgotICovCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIENsb3NlKCkgb3MuRXJyb3IgewotICBpZiBwLmNvbm4gIT0gbmlsIHsKLSAgICBpZiBlcnIgOj0gcC5jb25uLkNsb3NlKCk7IGVyciAhPSBuaWwgewotICAgICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3QgY2xvc2Ugc29ja2V0LiIsIGVyci5TdHJpbmcoKSkKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gICAgcC5jb25uID0gbmlsCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUTm9uYmxvY2tpbmdTb2NrZXQpIEludGVycnVwdCgpIG9zLkVycm9yIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiBuaWwKLSAgfQotICAvLyBUT0RPKHBvbWFjaykgZml4IEludGVycnVwdCBhcyBpdCBpcyBwcm9iYWJseSBub3QgcmlnaHQKLSAgcmV0dXJuIHAuQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfdHJhbnNwb3J0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTljMjZkLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdG5vbmJsb2NraW5nX3RyYW5zcG9ydC5nbworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotdHlwZSBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgaW50ZXJmYWNlIHsKLSAgVFRyYW5zcG9ydAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bm9uYmxvY2tpbmdfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ190cmFuc3BvcnRfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwMTlkYi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rub25ibG9ja2luZ190cmFuc3BvcnRfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAuICJ0aHJpZnQiCi0gICJ0ZXN0aW5nIgotICAibmV0IgotKQotCi1mdW5jIFRlc3ROb25ibG9ja2luZ1RyYW5zcG9ydFNlcnZlclRvQ2xpZW50KHQgKnRlc3RpbmcuVCkgewotCi0gIGFkZHIsIGVyciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCg0MDAwMCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBmaW5kIGF2YWlsYWJsZSB0Y3AgcG9ydCBhZGRyOiAlcyIsIGVycikKLSAgfQotICB0cmFuczEsIGVyciA6PSBOZXdUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXRBZGRyKGFkZHIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgc2VydmVyIHNvY2tldCBsaXN0ZW5lcjogJXMiLCBlcnIpCi0gIH0KLSAgdHJhbnMxLk9wZW4oKQotICB0cmFuczIsIGVyciA6PSBOZXdUTm9uYmxvY2tpbmdTb2NrZXRBZGRyKGFkZHIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gc2V0dXAgY2xpZW50IHNvY2tldDogJXMiLCBlcnIpCi0gIH0KLSAgdHJhbnMxLlNldFRpbWVvdXQoMTApCi0gIHRyYW5zMi5TZXRUaW1lb3V0KDEwKQotICBlcnIgPSB0cmFuczIuT3BlbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gY29ubmVjdCBjbGllbnQgdG8gc2VydmVyOiAlcyIsIGVycikKLSAgfQotICBzLCBlcnIgOj0gdHJhbnMxLkFjY2VwdCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gYWNjZXB0IGNsaWVudCBjb25uZWN0aW9uIGZyb20gc2VydmVyOiAlcyIsIGVycikKLSAgfQotICAvL3MuU2V0VGltZW91dCgxMCkKLSAgVHJhbnNwb3J0VGVzdCh0LCBOZXdURnJhbWVkVHJhbnNwb3J0KHMpLCBOZXdURnJhbWVkVHJhbnNwb3J0KHRyYW5zMikpCi0gIHRyYW5zMS5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdE5vbmJsb2NraW5nVHJhbnNwb3J0Q2xpZW50VG9TZXJ2ZXIodCAqdGVzdGluZy5UKSB7Ci0gIGFkZHIsIGVyciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCg0MDAwMCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBmaW5kIGF2YWlsYWJsZSB0Y3AgcG9ydCBhZGRyOiAlcyIsIGVycikKLSAgfQotICBsLCBlcnIgOj0gbmV0Lkxpc3RlbihhZGRyLk5ldHdvcmsoKSwgYWRkci5TdHJpbmcoKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBzZXR1cCBsaXN0ZW5lcjogJXMiLCBlcnIpCi0gIH0KLSAgdHJhbnMxLCBlcnIgOj0gTmV3VE5vbmJsb2NraW5nU2VydmVyU29ja2V0TGlzdGVuZXIobCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBzZXR1cCBzZXJ2ZXIgc29ja2V0IGxpc3RlbmVyOiAlcyIsIGVycikKLSAgfQotICB0cmFuczIsIGVyciA6PSBOZXdUTm9uYmxvY2tpbmdTb2NrZXRBZGRyKGwuQWRkcigpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIGNsaWVudCBzb2NrZXQ6ICVzIiwgZXJyKQotICB9Ci0gIHRyYW5zMS5TZXRUaW1lb3V0KDEwKQotICB0cmFuczIuU2V0VGltZW91dCgxMCkKLSAgZXJyID0gdHJhbnMyLk9wZW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGNvbm5lY3QgY2xpZW50IHRvIHNlcnZlcjogJXMiLCBlcnIpCi0gIH0KLSAgcywgZXJyIDo9IHRyYW5zMS5BY2NlcHQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIGFjY2VwdCBjbGllbnQgY29ubmVjdGlvbiBmcm9tIHNlcnZlcjogJXMiLCBlcnIpCi0gIH0KLSAgLy9zLlNldFRpbWVvdXQoMTApCi0gIFRyYW5zcG9ydFRlc3QodCwgTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFuczIpLCBOZXdURnJhbWVkVHJhbnNwb3J0KHMpKQotICB0cmFuczEuQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90bnVtZXJpYy5nbyBiL2xpYi9nby90aHJpZnQvdG51bWVyaWMuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjY1MDguLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90bnVtZXJpYy5nbworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm1hdGgiCi0gICJzdHJjb252IgotKQotCi10eXBlIE51bWVyaWMgaW50ZXJmYWNlIHsKLSAgSW50NjQoKSBpbnQ2NAotICBJbnQzMigpIGludDMyCi0gIEludDE2KCkgaW50MTYKLSAgQnl0ZSgpIGJ5dGUKLSAgSW50KCkgaW50Ci0gIEZsb2F0NjQoKSBmbG9hdDY0Ci0gIEZsb2F0MzIoKSBmbG9hdDMyCi0gIFN0cmluZygpIHN0cmluZwotICBpc051bGwoKSBib29sCi19Ci0KLXR5cGUgbnVtZXJpYyBzdHJ1Y3QgewotICBpVmFsdWUgaW50NjQKLSAgZFZhbHVlIGZsb2F0NjQKLSAgc1ZhbHVlIHN0cmluZwotICBpc05pbCAgYm9vbAotfQotCi12YXIgKAotICBJTkZJTklUWSAgICAgICAgICBOdW1lcmljCi0gIE5FR0FUSVZFX0lORklOSVRZIE51bWVyaWMKLSAgTkFOICAgICAgICAgICAgICAgTnVtZXJpYwotICBaRVJPICAgICAgICAgICAgICBOdW1lcmljCi0gIE5VTUVSSUNfTlVMTCAgICAgIE51bWVyaWMKLSkKLQotZnVuYyBOZXdOdW1lcmljRnJvbURvdWJsZShkVmFsdWUgZmxvYXQ2NCkgTnVtZXJpYyB7Ci0gIGlmIG1hdGguSXNJbmYoZFZhbHVlLCAxKSB7Ci0gICAgcmV0dXJuIElORklOSVRZCi0gIH0KLSAgaWYgbWF0aC5Jc0luZihkVmFsdWUsIC0xKSB7Ci0gICAgcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZCi0gIH0KLSAgaWYgbWF0aC5Jc05hTihkVmFsdWUpIHsKLSAgICByZXR1cm4gTkFOCi0gIH0KLSAgaVZhbHVlIDo9IGludDY0KGRWYWx1ZSkKLSAgc1ZhbHVlIDo9IHN0cmNvbnYuRnRvYTY0KGRWYWx1ZSwgJ2cnLCAxMCkKLSAgaXNOaWwgOj0gZmFsc2UKLSAgcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KLX0KLQotZnVuYyBOZXdOdW1lcmljRnJvbUk2NChpVmFsdWUgaW50NjQpIE51bWVyaWMgewotICBkVmFsdWUgOj0gZmxvYXQ2NChpVmFsdWUpCi0gIHNWYWx1ZSA6PSBzdHJpbmcoaVZhbHVlKQotICBpc05pbCA6PSBmYWxzZQotICByZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQotfQotCi1mdW5jIE5ld051bWVyaWNGcm9tSTMyKGlWYWx1ZSBpbnQzMikgTnVtZXJpYyB7Ci0gIGRWYWx1ZSA6PSBmbG9hdDY0KGlWYWx1ZSkKLSAgc1ZhbHVlIDo9IHN0cmluZyhpVmFsdWUpCi0gIGlzTmlsIDo9IGZhbHNlCi0gIHJldHVybiAmbnVtZXJpY3tpVmFsdWU6IGludDY0KGlWYWx1ZSksIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTmlsfQotfQotCi1mdW5jIE5ld051bWVyaWNGcm9tU3RyaW5nKHNWYWx1ZSBzdHJpbmcpIE51bWVyaWMgewotICBpZiBzVmFsdWUgPT0gSU5GSU5JVFkuU3RyaW5nKCkgewotICAgIHJldHVybiBJTkZJTklUWQotICB9Ci0gIGlmIHNWYWx1ZSA9PSBORUdBVElWRV9JTkZJTklUWS5TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZCi0gIH0KLSAgaWYgc1ZhbHVlID09IE5BTi5TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIE5BTgotICB9Ci0gIGlWYWx1ZSwgXyA6PSBzdHJjb252LkF0b2k2NChzVmFsdWUpCi0gIGRWYWx1ZSwgXyA6PSBzdHJjb252LkF0b2Y2NChzVmFsdWUpCi0gIGlzTmlsIDo9IGxlbihzVmFsdWUpID09IDAKLSAgcmV0dXJuICZudW1lcmlje2lWYWx1ZTogaVZhbHVlLCBkVmFsdWU6IGRWYWx1ZSwgc1ZhbHVlOiBzVmFsdWUsIGlzTmlsOiBpc05pbH0KLX0KLQotZnVuYyBOZXdOdW1lcmljRnJvbUpTT05TdHJpbmcoc1ZhbHVlIHN0cmluZywgaXNOdWxsIGJvb2wpIE51bWVyaWMgewotICBpZiBpc051bGwgewotICAgIHJldHVybiBOZXdOdWxsTnVtZXJpYygpCi0gIH0KLSAgaWYgc1ZhbHVlID09IEpTT05fSU5GSU5JVFkgewotICAgIHJldHVybiBJTkZJTklUWQotICB9Ci0gIGlmIHNWYWx1ZSA9PSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKLSAgICByZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFkKLSAgfQotICBpZiBzVmFsdWUgPT0gSlNPTl9OQU4gewotICAgIHJldHVybiBOQU4KLSAgfQotICBpVmFsdWUsIF8gOj0gc3RyY29udi5BdG9pNjQoc1ZhbHVlKQotICBkVmFsdWUsIF8gOj0gc3RyY29udi5BdG9mNjQoc1ZhbHVlKQotICByZXR1cm4gJm51bWVyaWN7aVZhbHVlOiBpVmFsdWUsIGRWYWx1ZTogZFZhbHVlLCBzVmFsdWU6IHNWYWx1ZSwgaXNOaWw6IGlzTnVsbH0KLX0KLQotZnVuYyBOZXdOdWxsTnVtZXJpYygpIE51bWVyaWMgewotICByZXR1cm4gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAuMCwgc1ZhbHVlOiAiIiwgaXNOaWw6IHRydWV9Ci19Ci0KLWZ1bmMgKHAgKm51bWVyaWMpIEludDY0KCkgaW50NjQgewotICByZXR1cm4gcC5pVmFsdWUKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgSW50MzIoKSBpbnQzMiB7Ci0gIHJldHVybiBpbnQzMihwLmlWYWx1ZSkKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgSW50MTYoKSBpbnQxNiB7Ci0gIHJldHVybiBpbnQxNihwLmlWYWx1ZSkKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgQnl0ZSgpIGJ5dGUgewotICByZXR1cm4gYnl0ZShwLmlWYWx1ZSkKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgSW50KCkgaW50IHsKLSAgcmV0dXJuIGludChwLmlWYWx1ZSkKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgRmxvYXQ2NCgpIGZsb2F0NjQgewotICByZXR1cm4gcC5kVmFsdWUKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgRmxvYXQzMigpIGZsb2F0MzIgewotICByZXR1cm4gZmxvYXQzMihwLmRWYWx1ZSkKLX0KLQotZnVuYyAocCAqbnVtZXJpYykgU3RyaW5nKCkgc3RyaW5nIHsKLSAgcmV0dXJuIHAuc1ZhbHVlCi19Ci0KLWZ1bmMgKHAgKm51bWVyaWMpIGlzTnVsbCgpIGJvb2wgewotICByZXR1cm4gcC5pc05pbAotfQotCi1mdW5jIGluaXQoKSB7Ci0gIElORklOSVRZID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IG1hdGguSW5mKDEpLCBzVmFsdWU6ICJJbmZpbml0eSIsIGlzTmlsOiBmYWxzZX0KLSAgTkVHQVRJVkVfSU5GSU5JVFkgPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogbWF0aC5JbmYoLTEpLCBzVmFsdWU6ICItSW5maW5pdHkiLCBpc05pbDogZmFsc2V9Ci0gIE5BTiA9ICZudW1lcmlje2lWYWx1ZTogMCwgZFZhbHVlOiBtYXRoLk5hTigpLCBzVmFsdWU6ICJOYU4iLCBpc05pbDogZmFsc2V9Ci0gIFpFUk8gPSAmbnVtZXJpY3tpVmFsdWU6IDAsIGRWYWx1ZTogMCwgc1ZhbHVlOiAiMCIsIGlzTmlsOiBmYWxzZX0KLSAgTlVNRVJJQ19OVUxMID0gJm51bWVyaWN7aVZhbHVlOiAwLCBkVmFsdWU6IDAsIHNWYWx1ZTogIjAiLCBpc05pbDogdHJ1ZX0KLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHByb2Nlc3Nvci5nbyBiL2xpYi9nby90aHJpZnQvdHByb2Nlc3Nvci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiYjVlNC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rwcm9jZXNzb3IuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8qKgotICogQSBwcm9jZXNzb3IgaXMgYSBnZW5lcmljIG9iamVjdCB3aGljaCBvcGVyYXRlcyB1cG9uIGFuIGlucHV0IHN0cmVhbSBhbmQKLSAqIHdyaXRlcyB0byBzb21lIG91dHB1dCBzdHJlYW0uCi0gKgotICovCi10eXBlIFRQcm9jZXNzb3IgaW50ZXJmYWNlIHsKLSAgUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCi19Ci0KLXR5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7Ci0gIFByb2Nlc3Moc2VxSWQgaW50MzIsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHByb2Nlc3Nvcl9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC90cHJvY2Vzc29yX2ZhY3RvcnkuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjgxYWIuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90cHJvY2Vzc29yX2ZhY3RvcnkuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KLSAqIGluc3RhbmNlLgotICovCi10eXBlIFRQcm9jZXNzb3JGYWN0b3J5IGludGVyZmFjZSB7Ci0gIEdldFByb2Nlc3Nvcih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yCi19Ci0KLXR5cGUgdFByb2Nlc3NvckZhY3Rvcnkgc3RydWN0IHsKLSAgcHJvY2Vzc29yIFRQcm9jZXNzb3IKLX0KLQotZnVuYyBOZXdUUHJvY2Vzc29yRmFjdG9yeShwIFRQcm9jZXNzb3IpIFRQcm9jZXNzb3JGYWN0b3J5IHsKLSAgcmV0dXJuICZ0UHJvY2Vzc29yRmFjdG9yeXtwcm9jZXNzb3I6IHB9Ci19Ci0KLWZ1bmMgKHAgKnRQcm9jZXNzb3JGYWN0b3J5KSBHZXRQcm9jZXNzb3IodHJhbnMgVFRyYW5zcG9ydCkgVFByb2Nlc3NvciB7Ci0gIHJldHVybiBwLnByb2Nlc3NvcgotfQotCi0KLS8qKgotICogVGhlIGRlZmF1bHQgcHJvY2Vzc29yIGZhY3RvcnkganVzdCByZXR1cm5zIGEgc2luZ2xldG9uCi0gKiBpbnN0YW5jZS4KLSAqLwotdHlwZSBUUHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5IGludGVyZmFjZSB7Ci0gIEdldFByb2Nlc3NvckZ1bmN0aW9uKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm9jZXNzb3JGdW5jdGlvbgotfQotCi10eXBlIHRQcm9jZXNzb3JGdW5jdGlvbkZhY3Rvcnkgc3RydWN0IHsKLSAgcHJvY2Vzc29yIFRQcm9jZXNzb3JGdW5jdGlvbgotfQotCi1mdW5jIE5ld1RQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkocCBUUHJvY2Vzc29yRnVuY3Rpb24pIFRQcm9jZXNzb3JGdW5jdGlvbkZhY3RvcnkgewotICByZXR1cm4gJnRQcm9jZXNzb3JGdW5jdGlvbkZhY3Rvcnl7cHJvY2Vzc29yOiBwfQotfQotCi1mdW5jIChwICp0UHJvY2Vzc29yRnVuY3Rpb25GYWN0b3J5KSBHZXRQcm9jZXNzb3JGdW5jdGlvbih0cmFucyBUVHJhbnNwb3J0KSBUUHJvY2Vzc29yRnVuY3Rpb24gewotICByZXR1cm4gcC5wcm9jZXNzb3IKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHByb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC90cHJvdG9jb2wuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjI3YTguLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90cHJvdG9jb2wuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0KLWNvbnN0ICgKLSAgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMAotICBWRVJTSU9OXzEgICAgPSAweDgwMDEwMDAwCi0pCi0KLXR5cGUgRW1wdHlJbnRlcmZhY2UgaW50ZXJmYWNle30KLQotdHlwZSBUUHJvdG9jb2wgaW50ZXJmYWNlIHsKLSAgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcWlkIGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVNZXNzYWdlRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlU3RydWN0QmVnaW4obmFtZSBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZVN0cnVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZUZpZWxkQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUVHlwZSwgaWQgaW50MTYpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZUZpZWxkRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlRmllbGRTdG9wKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlTWFwQmVnaW4oa2V5VHlwZSBUVHlwZSwgdmFsdWVUeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZVNldEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlU2V0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlQm9vbCh2YWx1ZSBib29sKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVCeXRlKHZhbHVlIGJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZUkxNih2YWx1ZSBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uCi0gIFdyaXRlSTMyKHZhbHVlIGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVJNjQodmFsdWUgaW50NjQpIFRQcm90b2NvbEV4Y2VwdGlvbgotICBXcml0ZURvdWJsZSh2YWx1ZSBmbG9hdDY0KSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVTdHJpbmcodmFsdWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgV3JpdGVCaW5hcnkodmFsdWUgW11ieXRlKSBUUHJvdG9jb2xFeGNlcHRpb24KLQotICBSZWFkTWVzc2FnZUJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVE1lc3NhZ2VUeXBlLCBzZXFpZCBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZE1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgUmVhZFN0cnVjdEJlZ2luKCkgKG5hbWUgc3RyaW5nLCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkU3RydWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFJlYWRGaWVsZEJlZ2luKCkgKG5hbWUgc3RyaW5nLCB0eXBlSWQgVFR5cGUsIGlkIGludDE2LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkRmllbGRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgUmVhZE1hcEJlZ2luKCkgKGtleVR5cGUgVFR5cGUsIHZhbHVlVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIFJlYWRNYXBFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgUmVhZExpc3RCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIFJlYWRMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uCi0gIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0gIFJlYWRTZXRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24KLSAgUmVhZEJvb2woKSAodmFsdWUgYm9vbCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZEJ5dGUoKSAodmFsdWUgYnl0ZSwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZEkxNigpICh2YWx1ZSBpbnQxNiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZEkzMigpICh2YWx1ZSBpbnQzMiwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZEk2NCgpICh2YWx1ZSBpbnQ2NCwgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZERvdWJsZSgpICh2YWx1ZSBmbG9hdDY0LCBlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBSZWFkU3RyaW5nKCkgKHZhbHVlIHN0cmluZywgZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikKLSAgUmVhZEJpbmFyeSgpICh2YWx1ZSBbXWJ5dGUsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pCi0KLSAgU2tpcChmaWVsZFR5cGUgVFR5cGUpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotICBGbHVzaCgpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKQotCi0gIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQKLX0KLQotLyoqCi0gKiBUaGUgbWF4aW11bSByZWN1cnNpdmUgZGVwdGggdGhlIHNraXAoKSBmdW5jdGlvbiB3aWxsIHRyYXZlcnNlIGJlZm9yZQotICogdGhyb3dpbmcgYSBURXhjZXB0aW9uLgotICovCi12YXIgKAotICBNYXhTa2lwRGVwdGggPSAxPDwzMSAtIDEKLSkKLQotLyoqCi0gKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gcmVjdXJzaXZlIGRlcHRoIHRoYXQgdGhlIHNraXAgZnVuY3Rpb24gd2lsbAotICogdHJhdmVyc2UgYmVmb3JlIHRocm93aW5nIGEgVEV4Y2VwdGlvbi4gIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZywgc28KLSAqIGFueSBjYWxsIHRvIHNraXAgaW4gdGhpcyBKVk0gd2lsbCBlbmZvcmNlIHRoaXMgdmFsdWUuCi0gKgotICogQHBhcmFtIGRlcHRoICB0aGUgbWF4aW11bSByZWN1cnNpdmUgZGVwdGguICBBIHZhbHVlIG9mIDIgd291bGQgYWxsb3cKLSAqICAgIHRoZSBza2lwIGZ1bmN0aW9uIHRvIHNraXAgYSBzdHJ1Y3R1cmUgb3IgY29sbGVjdGlvbiB3aXRoIGJhc2ljIGNoaWxkcmVuLAotICogICAgYnV0IGl0IHdvdWxkIG5vdCBwZXJtaXQgc2tpcHBpbmcgYSBzdHJ1Y3QgdGhhdCBoYWQgYSBmaWVsZCBjb250YWluaW5nCi0gKiAgICBhIGNoaWxkIHN0cnVjdC4gIEEgdmFsdWUgb2YgMSB3b3VsZCBvbmx5IGFsbG93IHNraXBwaW5nIG9mIHNpbXBsZQotICogICAgdHlwZXMgYW5kIGVtcHR5IHN0cnVjdHMvY29sbGVjdGlvbnMuCi0gKi8KLWZ1bmMgU2V0TWF4U2tpcERlcHRoKGRlcHRoIGludCkgewotICBNYXhTa2lwRGVwdGggPSBkZXB0aAotfQotCi0vKioKLSAqIFNraXBzIG92ZXIgdGhlIG5leHQgZGF0YSBlbGVtZW50IGZyb20gdGhlIHByb3ZpZGVkIGlucHV0IFRQcm90b2NvbCBvYmplY3QuCi0gKgotICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCi0gKiBAcGFyYW0gdHlwZSAgdGhlIG5leHQgdmFsdWUgd2lsbCBiZSBpbnRlcHJldGVkIGFzIHRoaXMgVFR5cGUgdmFsdWUuCi0gKi8KLWZ1bmMgU2tpcERlZmF1bHREZXB0aChwcm90IFRQcm90b2NvbCwgdHlwZUlkIFRUeXBlKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gU2tpcChwcm90LCB0eXBlSWQsIE1heFNraXBEZXB0aCkKLX0KLQotLyoqCi0gKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgotICoKLSAqIEBwYXJhbSBwcm90ICB0aGUgcHJvdG9jb2wgb2JqZWN0IHRvIHJlYWQgZnJvbQotICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgotICogQHBhcmFtIG1heERlcHRoICB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBza2lwIGNvbXBsZXggb2JqZWN0cyB0byB0aGlzCi0gKiAgIHJlY3Vyc2l2ZSBkZXB0aCwgdG8gcHJldmVudCBKYXZhIHN0YWNrIG92ZXJmbG93LgotICovCi1mdW5jIFNraXAoc2VsZiBUUHJvdG9jb2wsIGZpZWxkVHlwZSBUVHlwZSwgbWF4RGVwdGggaW50KSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBzd2l0Y2ggZmllbGRUeXBlIHsKLSAgY2FzZSBTVE9QOgotICAgIHJldHVybgotICBjYXNlIEJPT0w6Ci0gICAgXywgZXJyID0gc2VsZi5SZWFkQm9vbCgpCi0gICAgcmV0dXJuCi0gIGNhc2UgQllURToKLSAgICBfLCBlcnIgPSBzZWxmLlJlYWRCeXRlKCkKLSAgICByZXR1cm4KLSAgY2FzZSBJMTY6Ci0gICAgXywgZXJyID0gc2VsZi5SZWFkSTE2KCkKLSAgICByZXR1cm4KLSAgY2FzZSBJMzI6Ci0gICAgXywgZXJyID0gc2VsZi5SZWFkSTMyKCkKLSAgICByZXR1cm4KLSAgY2FzZSBJNjQ6Ci0gICAgXywgZXJyID0gc2VsZi5SZWFkSTY0KCkKLSAgICByZXR1cm4KLSAgY2FzZSBET1VCTEU6Ci0gICAgXywgZXJyID0gc2VsZi5SZWFkRG91YmxlKCkKLSAgICByZXR1cm4KLSAgY2FzZSBTVFJJTkc6Ci0gICAgXywgZXJyID0gc2VsZi5SZWFkU3RyaW5nKCkKLSAgICByZXR1cm4KLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgewotICAgICAgXywgZXJyID0gc2VsZi5SZWFkU3RydWN0QmVnaW4oKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybgotICAgICAgfQotICAgICAgZm9yIHsKLSAgICAgICAgXywgdHlwZUlkLCBfLCBfIDo9IHNlbGYuUmVhZEZpZWxkQmVnaW4oKQotICAgICAgICBpZiB0eXBlSWQgPT0gU1RPUCB7Ci0gICAgICAgICAgYnJlYWsKLSAgICAgICAgfQotICAgICAgICBTa2lwKHNlbGYsIHR5cGVJZCwgbWF4RGVwdGgtMSkKLSAgICAgICAgc2VsZi5SZWFkRmllbGRFbmQoKQotICAgICAgfQotICAgICAgcmV0dXJuIHNlbGYuUmVhZFN0cnVjdEVuZCgpCi0gICAgfQotICBjYXNlIE1BUDoKLSAgICB7Ci0gICAgICBrZXlUeXBlLCB2YWx1ZVR5cGUsIGwsIGVyciA6PSBzZWxmLlJlYWRNYXBCZWdpbigpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGVycgotICAgICAgfQotICAgICAgc2l6ZSA6PSBpbnQobCkKLSAgICAgIGZvciBpIDo9IDA7IGkgPCBzaXplOyBpKysgewotICAgICAgICBTa2lwKHNlbGYsIGtleVR5cGUsIG1heERlcHRoLTEpCi0gICAgICAgIHNlbGYuU2tpcCh2YWx1ZVR5cGUpCi0gICAgICB9Ci0gICAgICByZXR1cm4gc2VsZi5SZWFkTWFwRW5kKCkKLSAgICB9Ci0gIGNhc2UgU0VUOgotICAgIHsKLSAgICAgIGVsZW1UeXBlLCBsLCBlcnIgOj0gc2VsZi5SZWFkU2V0QmVnaW4oKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBlcnIKLSAgICAgIH0KLSAgICAgIHNpemUgOj0gaW50KGwpCi0gICAgICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICAgICAgU2tpcChzZWxmLCBlbGVtVHlwZSwgbWF4RGVwdGgtMSkKLSAgICAgIH0KLSAgICAgIHJldHVybiBzZWxmLlJlYWRTZXRFbmQoKQotICAgIH0KLSAgY2FzZSBMSVNUOgotICAgIHsKLSAgICAgIGVsZW1UeXBlLCBsLCBlcnIgOj0gc2VsZi5SZWFkTGlzdEJlZ2luKCkKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gZXJyCi0gICAgICB9Ci0gICAgICBzaXplIDo9IGludChsKQotICAgICAgZm9yIGkgOj0gMDsgaSA8IHNpemU7IGkrKyB7Ci0gICAgICAgIFNraXAoc2VsZiwgZWxlbVR5cGUsIG1heERlcHRoLTEpCi0gICAgICB9Ci0gICAgICByZXR1cm4gc2VsZi5SZWFkTGlzdEVuZCgpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHByb3RvY29sX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvdHByb3RvY29sX2V4Y2VwdGlvbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRhYzk3ZS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbF9leGNlcHRpb24uZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiZW5jb2RpbmcvYmFzZTY0IgotICAib3MiCi0pCi0KLS8qKgotICogUHJvdG9jb2wgZXhjZXB0aW9ucy4KLSAqCi0gKi8KLXR5cGUgVFByb3RvY29sRXhjZXB0aW9uIGludGVyZmFjZSB7Ci0gIFRFeGNlcHRpb24KLSAgVHlwZUlkKCkgaW50Ci19Ci0KLWNvbnN0ICgKLSAgVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04gPSAwCi0gIElOVkFMSURfREFUQSAgICAgICAgICAgICAgID0gMQotICBORUdBVElWRV9TSVpFICAgICAgICAgICAgICA9IDIKLSAgU0laRV9MSU1JVCAgICAgICAgICAgICAgICAgPSAzCi0gIEJBRF9WRVJTSU9OICAgICAgICAgICAgICAgID0gNAotICBOT1RfSU1QTEVNRU5URUQgICAgICAgICAgICA9IDUKLSkKLQotdHlwZSB0UHJvdG9jb2xFeGNlcHRpb24gc3RydWN0IHsKLSAgdHlwZUlkICBpbnQKLSAgbWVzc2FnZSBzdHJpbmcKLX0KLQotZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQgewotICByZXR1cm4gcC50eXBlSWQKLX0KLQotZnVuYyAocCAqdFByb3RvY29sRXhjZXB0aW9uKSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5tZXNzYWdlCi19Ci0KLWZ1bmMgTmV3VFByb3RvY29sRXhjZXB0aW9uRGVmYXVsdCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25EZWZhdWx0VHlwZShVTktOT1dOX1BST1RPQ09MX0VYQ0VQVElPTikKLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25EZWZhdWx0VHlwZSh0IGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbih0LCAiIikKLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25EZWZhdWx0U3RyaW5nKG0gc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKFVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OLCBtKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbih0IGludCwgbSBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiAmdFByb3RvY29sRXhjZXB0aW9ue3R5cGVJZDogdCwgbWVzc2FnZTogbX0KLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoZmllbGRJZCBpbnQsIGZpZWxkTmFtZSBzdHJpbmcsIHN0cnVjdE5hbWUgc3RyaW5nLCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgdCA6PSBlLlR5cGVJZCgpCi0gIGlmIHQgPT0gVU5LTk9XTl9QUk9UT0NPTF9FWENFUFRJT04gewotICAgIHQgPSBJTlZBTElEX0RBVEEKLSAgfQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHQsICJVbmFibGUgdG8gcmVhZCBmaWVsZCAiK3N0cmluZyhmaWVsZElkKSsiICgiK2ZpZWxkTmFtZSsiKSBpbiAiK3N0cnVjdE5hbWUrIiBkdWUgdG86ICIrZS5TdHJpbmcoKSkKLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKGZpZWxkSWQgaW50LCBmaWVsZE5hbWUgc3RyaW5nLCBzdHJ1Y3ROYW1lIHN0cmluZywgZSBUUHJvdG9jb2xFeGNlcHRpb24pIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHQgOj0gZS5UeXBlSWQoKQotICBpZiB0ID09IFVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OIHsKLSAgICB0ID0gSU5WQUxJRF9EQVRBCi0gIH0KLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbih0LCAiVW5hYmxlIHRvIHdyaXRlIGZpZWxkICIrc3RyaW5nKGZpZWxkSWQpKyIgKCIrZmllbGROYW1lKyIpIGluICIrc3RydWN0TmFtZSsiIGR1ZSB0bzogIitlLlN0cmluZygpKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3Qoc3RydWN0TmFtZSBzdHJpbmcsIGUgVFByb3RvY29sRXhjZXB0aW9uKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICB0IDo9IGUuVHlwZUlkKCkKLSAgaWYgdCA9PSBVTktOT1dOX1BST1RPQ09MX0VYQ0VQVElPTiB7Ci0gICAgdCA9IElOVkFMSURfREFUQQotICB9Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24odCwgIlVuYWJsZSB0byByZWFkIHN0cnVjdCAiK3N0cnVjdE5hbWUrIiBkdWUgdG86ICIrZS5TdHJpbmcoKSkKLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdChzdHJ1Y3ROYW1lIHN0cmluZywgZSBUUHJvdG9jb2xFeGNlcHRpb24pIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHQgOj0gZS5UeXBlSWQoKQotICBpZiB0ID09IFVOS05PV05fUFJPVE9DT0xfRVhDRVBUSU9OIHsKLSAgICB0ID0gSU5WQUxJRF9EQVRBCi0gIH0KLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbih0LCAiVW5hYmxlIHRvIHdyaXRlIHN0cnVjdCAiK3N0cnVjdE5hbWUrIiBkdWUgdG86ICIrZS5TdHJpbmcoKSkKLX0KLQotZnVuYyBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlIG9zLkVycm9yKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlID09IG5pbCB7Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIGlmIHQsIG9rIDo9IGUuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKLSAgICByZXR1cm4gdAotICB9Ci0gIGlmIHRlLCBvayA6PSBlLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tVHJhbnNwb3J0RXhjZXB0aW9uKHRlKQotICB9Ci0gIGlmIF8sIG9rIDo9IGUuKGJhc2U2NC5Db3JydXB0SW5wdXRFcnJvcik7IG9rIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZS5TdHJpbmcoKSkKLSAgfQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRGVmYXVsdFN0cmluZyhlLlN0cmluZygpKQotfQotCi1mdW5jIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21UcmFuc3BvcnRFeGNlcHRpb24oZSBUVHJhbnNwb3J0RXhjZXB0aW9uKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlID09IG5pbCB7Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIGlmIHQsIG9rIDo9IGUuKFRQcm90b2NvbEV4Y2VwdGlvbik7IG9rIHsKLSAgICByZXR1cm4gdAotICB9Ci0gIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25EZWZhdWx0U3RyaW5nKGUuU3RyaW5nKCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbF9mYWN0b3J5LmdvIGIvbGliL2dvL3RocmlmdC90cHJvdG9jb2xfZmFjdG9yeS5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlZDJjMi4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3Rwcm90b2NvbF9mYWN0b3J5LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIGZvciBjb25zdHJ1Y3RpbmcgcHJvdG9jb2wgaW5zdGFuY2VzLgotICoKLSAqLwotdHlwZSBUUHJvdG9jb2xGYWN0b3J5IGludGVyZmFjZSB7Ci0gIEdldFByb3RvY29sKHRyYW5zIFRUcmFuc3BvcnQpIFRQcm90b2NvbAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cHJvdG9jb2xfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdHByb3RvY29sX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZWY4ZTkuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90cHJvdG9jb2xfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE4MjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgInRlc3RpbmciCi0gICJodHRwIgotICAibWF0aCIKLSAgIm5ldCIKLSAgImlvL2lvdXRpbCIKLSAgIm9zIgotICAiYnl0ZXMiCi0gICJmbXQiCi0pCi0KLWNvbnN0IFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkUgPSAxNTUKLQotdmFyICgKLSAgZGF0YSAgICAgICAgICAgc3RyaW5nIC8vIHRlc3QgZGF0YSBmb3Igd3JpdGluZwotICBwcm90b2NvbF9iZGF0YSBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKLSAgQk9PTF9WQUxVRVMgICAgW11ib29sCi0gIEJZVEVfVkFMVUVTICAgIFtdYnl0ZQotICBJTlQxNl9WQUxVRVMgICBbXWludDE2Ci0gIElOVDMyX1ZBTFVFUyAgIFtdaW50MzIKLSAgSU5UNjRfVkFMVUVTICAgW11pbnQ2NAotICBET1VCTEVfVkFMVUVTICBbXWZsb2F0NjQKLSAgU1RSSU5HX1ZBTFVFUyAgW11zdHJpbmcKLSkKLQotCi1mdW5jIGluaXQoKSB7Ci0gIHByb3RvY29sX2JkYXRhID0gbWFrZShbXWJ5dGUsIFBST1RPQ09MX0JJTkFSWV9EQVRBX1NJWkUpCi0gIGZvciBpIDo9IDA7IGkgPCBQUk9UT0NPTF9CSU5BUllfREFUQV9TSVpFOyBpKysgewotICAgIHByb3RvY29sX2JkYXRhW2ldID0gYnl0ZSgoaSArICdhJykgJSAyNTUpCi0gIH0KLSAgZGF0YSA9IHN0cmluZyhwcm90b2NvbF9iZGF0YSkKLSAgQk9PTF9WQUxVRVMgPSBbXWJvb2x7ZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZX0KLSAgQllURV9WQUxVRVMgPSBbXWJ5dGV7MTE3LCAwLCAxLCAzMiwgMTI3LCAxMjgsIDI1NX0KLSAgSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9Ci0gIElOVDMyX1ZBTFVFUyA9IFtdaW50MzJ7NDU5LCAwLCAxLCAtMSwgLTEyOCwgMTI3LCAzMjc2NywgMjE0NzQ4MzY0NywgLTIxNDc0ODM1MzV9Ci0gIElOVDY0X1ZBTFVFUyA9IFtdaW50NjR7NDU5LCAwLCAxLCAtMSwgLTEyOCwgMTI3LCAzMjc2NywgMjE0NzQ4MzY0NywgLTIxNDc0ODM1MzUsIDM0MzU5NzM4NDgxLCAtMzUxODQzNzIwODg3MTksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCA5MjIzMzcyMDM2ODU0Nzc1ODA3fQotICBET1VCTEVfVkFMVUVTID0gW11mbG9hdDY0ezQ1OS4zLCAwLjAsIC0xLjAsIDEuMCwgMC41LCAwLjMzMzMsIDMuMTQxNTksIDEuNTM3ZS0zOCwgMS42NzNlMjUsIDYuMDIyMTQxNzllMjMsIC02LjAyMjE0MTc5ZTIzLCBJTkZJTklUWS5GbG9hdDY0KCksIE5FR0FUSVZFX0lORklOSVRZLkZsb2F0NjQoKSwgTkFOLkZsb2F0NjQoKX0KLSAgU1RSSU5HX1ZBTFVFUyA9IFtdc3RyaW5neyIiLCAiYSIsICJzdFt1Zl1mIiwgInN0LHU6ZmYgd2l0aCBzcGFjZXMiLCAic3R1ZmZcdHdpdGhcbmVzY2FwZVxcY2hhcmFjdGVycycuLi5cImxvdHN7b2Z9ZnVuPC94bWw+In0KLX0KLQotdHlwZSBIVFRQRWNob1NlcnZlciBzdHJ1Y3R7fQotCi1mdW5jIChwICpIVFRQRWNob1NlcnZlcikgU2VydmVIVFRQKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgcmVxICpodHRwLlJlcXVlc3QpIHsKLSAgYnVmLCBlcnIgOj0gaW91dGlsLlJlYWRBbGwocmVxLkJvZHkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNCYWRSZXF1ZXN0KQotICAgIHcuV3JpdGUoYnVmKQotICB9IGVsc2UgewotICAgIHcuV3JpdGVIZWFkZXIoaHR0cC5TdGF0dXNPSykKLSAgICB3LldyaXRlKGJ1ZikKLSAgfQotfQotCi1mdW5jIEh0dHBDbGllbnRTZXR1cEZvclRlc3QodCAqdGVzdGluZy5UKSAobmV0Lkxpc3RlbmVyLCBuZXQuQWRkcikgewotICBhZGRyLCBlcnIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoNDAwMDApCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gZmluZCBhdmFpbGFibGUgdGNwIHBvcnQgYWRkcjogJXMiLCBlcnIpCi0gICAgcmV0dXJuIG5pbCwgYWRkcgotICB9Ci0gIGwsIGVyciA6PSBuZXQuTGlzdGVuKGFkZHIuTmV0d29yaygpLCBhZGRyLlN0cmluZygpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHNldHVwIHRjcCBsaXN0ZW5lciBvbiAlczogJXMiLCBhZGRyLlN0cmluZygpLCBlcnIpCi0gICAgcmV0dXJuIGwsIGFkZHIKLSAgfQotICBnbyBodHRwLlNlcnZlKGwsICZIVFRQRWNob1NlcnZlcnt9KQotICByZXR1cm4gbCwgYWRkcgotfQotCi0KLWZ1bmMgUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQgKnRlc3RpbmcuVCwgcHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpIHsKLSAgYnVmIDo9IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgMTAyNCkpCi0gIGwsIGFkZHIgOj0gSHR0cENsaWVudFNldHVwRm9yVGVzdCh0KQotICBkZWZlciBsLkNsb3NlKCkKLSAgdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnRGYWN0b3J5ewotICAgIE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpLAotICAgIE5ld1RJT1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkoYnVmLCBidWYsIHRydWUpLAotICAgIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKLSAgICBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCJodHRwOi8vIiArIGFkZHIuU3RyaW5nKCkpLAotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZUJvb2wodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlSTMyKHQsIHAsIHRyYW5zKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotICBmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0gICAgdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKLSAgICBwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKLSAgICBSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLSAgZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotICAgIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gICAgcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCi0gICAgUmVhZFdyaXRlU3RyaW5nKHQsIHAsIHRyYW5zKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotICBmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0gICAgdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKLSAgICBwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKLSAgICBSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZVdvcmsodCwgcCwgdHJhbnMpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci0gIGZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgICB0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQotICAgIHAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQotICAgIFJlYWRXcml0ZUNhbGN1bGF0ZSh0LCBwLCB0cmFucykKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLQotICAvLyB0aGlzIHRlc3QgZG9lc24ndCB3b3JrIGluIGFsbCBjYXNlcyBkdWUgdG8gRU9GIGlzc3VlcyBiZXR3ZWVuCi0gIC8vIGJ1ZmZlciByZWFkIGFuZCBidWZmZXIgd3JpdGUgd2hlbiB1c2luZyB0aGUgc2FtZSBidWZpbyBmb3IgYm90aAotICAvL2ZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLSAgLy8gIHRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCi0gIC8vICBwIDo9IEdldFByb3RvY29sKHRyYW5zKTsKLSAgLy8gIFJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucyk7Ci0gIC8vICBSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpOwotICAvLyAgUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKTsKLSAgLy8gIFJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpOwotICAvLyAgdHJhbnMuQ2xvc2UoKQotICAvL30KLQotfQotCi1mdW5jIFJlYWRXcml0ZUJvb2wodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9IFRUeXBlKEJPT0wpCi0gIHRoZWxlbiA6PSBsZW4oQk9PTF9WQUxVRVMpCi0gIGVyciA6PSBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgYmVnaW46ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCB0aGV0eXBlKQotICB9Ci0gIGZvciBrLCB2IDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKLSAgICBlcnIgPSBwLldyaXRlQm9vbCh2KQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICB9Ci0gIHAuV3JpdGVMaXN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCi0gIH0KLSAgcC5GbHVzaCgpCi0gIHRoZXR5cGUyLCB0aGVsZW4yLCBlcnIgOj0gcC5SZWFkTGlzdEJlZ2luKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGxpc3Q6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKLSAgfQotICBfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKLSAgaWYgIW9rIHsKLSAgICBpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gICAgfQotICAgIGlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKLSAgICB9Ci0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewotICAgIHZhbHVlLCBlcnIgOj0gcC5SZWFkQm9vbCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgYm9vbCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5FcnJvcmYoIiVzOiBpbmRleCAlZCAlcSAlcSAlcSAhPSAlcSIsICJSZWFkV3JpdGVCb29sIiwgaywgcCwgdHJhbnMsIHYsIHZhbHVlKQotICAgIH0KLSAgfQotICBlcnIgPSBwLlJlYWRMaXN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIpCi0gIH0KLX0KLQotZnVuYyBSZWFkV3JpdGVCeXRlKHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgdGhldHlwZSA6PSBUVHlwZShCWVRFKQotICB0aGVsZW4gOj0gbGVuKEJZVEVfVkFMVUVTKQotICBlcnIgOj0gcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGJlZ2luOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgdGhldHlwZSkKLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7Ci0gICAgZXJyID0gcC5Xcml0ZUJ5dGUodikKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBieXRlIGluIGxpc3QgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQotICAgIH0KLSAgfQotICBlcnIgPSBwLldyaXRlTGlzdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQotICB9Ci0gIGVyciA9IHAuRmx1c2goKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIGZsdXNoaW5nIGxpc3Qgb2YgYnl0ZXM6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBCWVRFX1ZBTFVFUykKLSAgfQotICB0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCi0gIH0KLSAgXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCi0gIGlmICFvayB7Ci0gICAgaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQotICAgIH0KLSAgICBpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCi0gICAgfQotICB9Ci0gIGZvciBrLCB2IDo9IHJhbmdlIEJZVEVfVkFMVUVTIHsKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGJ5dGUgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyLCBrLCB2KQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJWQgIT0gJWQiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICB9Ci0gIH0KLSAgZXJyID0gcC5SZWFkTGlzdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJ5dGUiLCBwLCB0cmFucywgZXJyKQotICB9Ci19Ci0KLWZ1bmMgUmVhZFdyaXRlSTE2KHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgdGhldHlwZSA6PSBUVHlwZShJMTYpCi0gIHRoZWxlbiA6PSBsZW4oSU5UMTZfVkFMVUVTKQotICBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKLSAgZm9yIF8sIHYgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKLSAgICBwLldyaXRlSTE2KHYpCi0gIH0KLSAgcC5Xcml0ZUxpc3RFbmQoKQotICBwLkZsdXNoKCkKLSAgdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgSU5UMTZfVkFMVUVTKQotICB9Ci0gIF8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQotICBpZiAhb2sgewotICAgIGlmIHRoZXR5cGUgIT0gdGhldHlwZTIgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQotICAgIH0KLSAgICBpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKLSAgICB9Ci0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgSU5UMTZfVkFMVUVTIHsKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUmVhZEkxNigpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50MTYgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdiwgdmFsdWUpCi0gICAgfQotICB9Ci0gIGVyciA9IHAuUmVhZExpc3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgZXJyKQotICB9Ci19Ci0KLWZ1bmMgUmVhZFdyaXRlSTMyKHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgdGhldHlwZSA6PSBUVHlwZShJMzIpCi0gIHRoZWxlbiA6PSBsZW4oSU5UMzJfVkFMVUVTKQotICBwLldyaXRlTGlzdEJlZ2luKHRoZXR5cGUsIHRoZWxlbikKLSAgZm9yIF8sIHYgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKLSAgICBwLldyaXRlSTMyKHYpCi0gIH0KLSAgcC5Xcml0ZUxpc3RFbmQoKQotICBwLkZsdXNoKCkKLSAgdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgSU5UMzJfVkFMVUVTKQotICB9Ci0gIF8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQotICBpZiAhb2sgewotICAgIGlmIHRoZXR5cGUgIT0gdGhldHlwZTIgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQotICAgIH0KLSAgICBpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKLSAgICB9Ci0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgSU5UMzJfVkFMVUVTIHsKLSAgICB2YWx1ZSwgZXJyIDo9IHAuUmVhZEkzMigpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgaW50MzIgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlZCAhPSAlZCIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdiwgdmFsdWUpCi0gICAgfQotICB9Ci0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCBlcnIpCi0gIH0KLX0KLQotZnVuYyBSZWFkV3JpdGVJNjQodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9IFRUeXBlKEk2NCkKLSAgdGhlbGVuIDo9IGxlbihJTlQ2NF9WQUxVRVMpCi0gIHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQotICBmb3IgXywgdiA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewotICAgIHAuV3JpdGVJNjQodikKLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIHAuRmx1c2goKQotICB0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgZXJyLCBJTlQ2NF9WQUxVRVMpCi0gIH0KLSAgXywgb2sgOj0gcC4oKlRTaW1wbGVKU09OUHJvdG9jb2wpCi0gIGlmICFvayB7Ci0gICAgaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gICAgfQotICAgIGlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQotICAgIH0KLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewotICAgIHZhbHVlLCBlcnIgOj0gcC5SZWFkSTY0KCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBpbnQ2NCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVxICE9ICVxIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICB9Ci0gIH0KLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVycikKLSAgfQotfQotCi1mdW5jIFJlYWRXcml0ZURvdWJsZSh0ICp0ZXN0aW5nLlQsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7Ci0gIHRoZXR5cGUgOj0gVFR5cGUoRE9VQkxFKQotICB0aGVsZW4gOj0gbGVuKERPVUJMRV9WQUxVRVMpCi0gIHAuV3JpdGVMaXN0QmVnaW4odGhldHlwZSwgdGhlbGVuKQotICBmb3IgXywgdiA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBwLldyaXRlRG91YmxlKHYpCi0gIH0KLSAgcC5Xcml0ZUxpc3RFbmQoKQotICBwLkZsdXNoKCkKLSAgd3JvdGVidWZmZXIgOj0gIiIKLSAgaWYgbWVtdHJhbnMsIG9rIDo9IHRyYW5zLigqVE1lbW9yeUJ1ZmZlcik7IG9rIHsKLSAgICB3cm90ZWJ1ZmZlciA9IG1lbXRyYW5zLlN0cmluZygpCi0gIH0KLSAgdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEsIHdyb3RlOiAldiIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBET1VCTEVfVkFMVUVTLCB3cm90ZWJ1ZmZlcikKLSAgfQotICBpZiB0aGV0eXBlICE9IHRoZXR5cGUyIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCi0gIH0KLSAgaWYgdGhlbGVuICE9IHRoZWxlbjIgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQotICB9Ci0gIGZvciBrLCB2IDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIHZhbHVlLCBlcnIgOj0gcC5SZWFkRG91YmxlKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBkb3VibGUgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCi0gICAgfQotICAgIGlmIG1hdGguSXNOYU4odikgewotICAgICAgaWYgIW1hdGguSXNOYU4odmFsdWUpIHsKLSAgICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBtYXRoLklzTmFOKCVxKSAhPSBtYXRoLklzTmFOKCVxKSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAldiAhPSAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgdiwgdmFsdWUpCi0gICAgfQotICB9Ci0gIGVyciA9IHAuUmVhZExpc3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyKQotICB9Ci19Ci0KLWZ1bmMgUmVhZFdyaXRlU3RyaW5nKHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgdGhldHlwZSA6PSBUVHlwZShTVFJJTkcpCi0gIHRoZWxlbiA6PSBsZW4oU1RSSU5HX1ZBTFVFUykKLSAgcC5Xcml0ZUxpc3RCZWdpbih0aGV0eXBlLCB0aGVsZW4pCi0gIGZvciBfLCB2IDo9IHJhbmdlIFNUUklOR19WQUxVRVMgewotICAgIHAuV3JpdGVTdHJpbmcodikKLSAgfQotICBwLldyaXRlTGlzdEVuZCgpCi0gIHAuRmx1c2goKQotICB0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgZXJyLCBTVFJJTkdfVkFMVUVTKQotICB9Ci0gIF8sIG9rIDo9IHAuKCpUU2ltcGxlSlNPTlByb3RvY29sKQotICBpZiAhb2sgewotICAgIGlmIHRoZXR5cGUgIT0gdGhldHlwZTIgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQotICAgIH0KLSAgICBpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKLSAgICB9Ci0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7Ci0gICAgdmFsdWUsIGVyciA6PSBwLlJlYWRTdHJpbmcoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIHN0cmluZyBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgaywgdikKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICB9Ci0gIH0KLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBsaXN0IGVuZDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVycikKLSAgfQotfQotCi0KLWZ1bmMgUmVhZFdyaXRlQmluYXJ5KHQgKnRlc3RpbmcuVCwgcCBUUHJvdG9jb2wsIHRyYW5zIFRUcmFuc3BvcnQpIHsKLSAgdiA6PSBwcm90b2NvbF9iZGF0YQotICBwLldyaXRlQmluYXJ5KHYpCi0gIHAuRmx1c2goKQotICB2YWx1ZSwgZXJyIDo9IHAuUmVhZEJpbmFyeSgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgYmluYXJ5OiAlcyIsICJSZWFkV3JpdGVCaW5hcnkiLCBwLCB0cmFucywgZXJyLlN0cmluZygpKQotICB9Ci0gIGlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIGxlbih2KSAhPSBsZW4odmFsdWUpLi4uICVkICE9ICVkIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCBsZW4odiksIGxlbih2YWx1ZSkpCi0gIH0gZWxzZSB7Ci0gICAgZm9yIGkgOj0gMDsgaSA8IGxlbih2KTsgaSsrIHsKLSAgICAgIGlmIHZbaV0gIT0gdmFsdWVbaV0gewotICAgICAgICB0LkVycm9yZigiJXM6ICVUICVUICVzICE9ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1mdW5jIFJlYWRXcml0ZVdvcmsodCAqdGVzdGluZy5ULCBwIFRQcm90b2NvbCwgdHJhbnMgVFRyYW5zcG9ydCkgewotICB0aGV0eXBlIDo9ICJzdHJ1Y3QiCi0gIG9yaWcgOj0gTmV3V29yaygpCi0gIG9yaWcuTnVtMSA9IDI1Ci0gIG9yaWcuTnVtMiA9IDEwMgotICBvcmlnLk9wID0gQURECi0gIG9yaWcuQ29tbWVudCA9ICJBZGQ6IDI1ICsgMTAyIgotICByZXR1cm4KLSAgaWYgZSA6PSBvcmlnLldyaXRlKHApOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAlI3YgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIG9yaWcsIGUuU3RyaW5nKCkpCi0gIH0KLSAgcmVhZCA6PSBOZXdXb3JrKCkKLSAgZSA6PSByZWFkLlJlYWQocCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgZS5TdHJpbmcoKSkKLSAgfQotICBpZiAhb3JpZy5FcXVhbHMocmVhZCkgewotICAgIHQuRmF0YWxmKCJPcmlnaW5hbCBXcml0ZSAhPSBSZWFkOiAlI3YgIT0gJSN2ICIsIG9yaWcsIHJlYWQpCi0gIH0KLX0KLQotCi1mdW5jIFJlYWRXcml0ZUNhbGN1bGF0ZSh0ICp0ZXN0aW5nLlQsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7Ci0gIG1lc3NhZ2VOYW1lIDo9ICJjYWxjdWxhdGUiCi0gIGxvZ2lkIDo9IGludDMyKDEyKQotICBzZXFJZCA6PSBpbnQzMigzNSkKLSAgdyA6PSBOZXdXb3JrKCkKLSAgdy5OdW0xID0gMjUKLSAgdy5OdW0yID0gMTAyCi0gIHcuT3AgPSBBREQKLSAgdy5Db21tZW50ID0gIkFkZDogMjUgKyAxMDIiCi0KLSAgYXJnczMxIDo9IE5ld0NhbGN1bGF0ZUFyZ3MoKQotICBhcmdzMzEuTG9naWQgPSBsb2dpZAotICBhcmdzMzEuVyA9IHcKLSAgcC5Xcml0ZU1lc3NhZ2VCZWdpbihtZXNzYWdlTmFtZSwgQ0FMTCwgc2VxSWQpCi0gIGlmIGVyciA6PSBhcmdzMzEuV3JpdGUocCk7IGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCIlczogJVQgJVQgVW5hYmxlIHRvIHdyaXRlIG1lc3NhZ2U6ICVzIiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBlcnIuU3RyaW5nKCkpCi0gIH0KLSAgcC5Xcml0ZU1lc3NhZ2VFbmQoKQotICBwLlRyYW5zcG9ydCgpLkZsdXNoKCkKLQotICBuYW1lLCB0dHlwZSwgc2VxaWQsIGVycjEgOj0gcC5SZWFkTWVzc2FnZUJlZ2luKCkKLSAgaWYgZXJyMSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbWVzc2FnZSBiZWdpbjogJXMiLCBtZXNzYWdlTmFtZSwgcCwgdHJhbnMsIGVycjEuU3RyaW5nKCkpCi0gIH0KLSAgaWYgbmFtZSAhPSBtZXNzYWdlTmFtZSB7Ci0gICAgdC5FcnJvcmYoIiVzOiAlVCAlVCBFeHBlY3RlZCBtZXNzYWdlIG5hbWVkIFwiJXNcIiwgYnV0IHdhczogXCIlc1wiIiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBtZXNzYWdlTmFtZSwgbmFtZSkKLSAgfQotICBpZiB0dHlwZSAhPSBDQUxMIHsKLSAgICB0LkVycm9yZigiJXM6ICVUICVUIEV4cGVjdGVkIG1lc3NhZ2UgdHlwZSBcIiVzXCIsIGJ1dCB3YXM6IFwiJXNcIiIsIG1lc3NhZ2VOYW1lLCBwLCB0cmFucywgQ0FMTCwgdHR5cGUpCi0gIH0KLSAgaWYgc2VxaWQgIT0gc2VxSWQgewotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgRXhwZWN0ZWQgbWVzc2FnZSB0eXBlIFwiJXNcIiwgYnV0IHdhczogXCIlc1wiIiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBzZXFJZCwgc2VxaWQpCi0gIH0KLSAgY2FsY0FyZ3MgOj0gTmV3Q2FsY3VsYXRlQXJncygpCi0gIGVycjIgOj0gY2FsY0FyZ3MuUmVhZChwKQotICBpZiAhYXJnczMxLkVxdWFscyhjYWxjQXJncykgewotICAgIC8vY21wMSwgXyA6PSBhcmdzMzEuVy5Db21wYXJlVG8oY2FsY0FyZ3MuVykKLSAgICBjbXAyLCBvayA6PSBhcmdzMzEuQ29tcGFyZVRvKGNhbGNBcmdzKQotICAgIHQuRXJyb3JmKCIlczogJVQgJVQgQ2FsY3VsYXRlIGFyZ3Mgbm90IGFzIGV4cGVjdGVkLCAlVCB2cyAlVCwgY21wOiAlI3YsIG9rOiAlI3YsIGVxdWFsczogJSN2IiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBhcmdzMzEsIGNhbGNBcmdzLCBjbXAyLCBvaywgYXJnczMxLkVxdWFscyhjYWxjQXJncykpCi0gIH0KLSAgaWYgZXJyMiAhPSBuaWwgewotICAgIHQuRmF0YWxmKCIlczogJVQgJVQgVW5hYmxlIHRvIHJlYWQgbWVzc2FnZSBlbmQ6ICVzIiwgbWVzc2FnZU5hbWUsIHAsIHRyYW5zLCBlcnIyLlN0cmluZygpKQotICB9Ci0gIGVycjMgOj0gcC5SZWFkTWVzc2FnZUVuZCgpCi0gIGlmIGVycjMgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiJXM6ICVUICVUIFVuYWJsZSB0byByZWFkIG1lc3NhZ2UgZW5kOiAlcyIsIG1lc3NhZ2VOYW1lLCBwLCB0cmFucywgZXJyMy5TdHJpbmcoKSkKLSAgfQotfQotCi0KLS8qKgotICpZb3UgY2FuIGRlZmluZSBlbnVtcywgd2hpY2ggYXJlIGp1c3QgMzIgYml0IGludGVnZXJzLiBWYWx1ZXMgYXJlIG9wdGlvbmFsCi0gKmFuZCBzdGFydCBhdCAxIGlmIG5vdCBzdXBwbGllZCwgQyBzdHlsZSBhZ2Fpbi4KLSAqLwotdHlwZSBPcGVyYXRpb24gaW50Ci0KLWNvbnN0ICgKLSAgQUREICAgICAgT3BlcmF0aW9uID0gMQotICBTVUJUUkFDVCBPcGVyYXRpb24gPSAyCi0gIE1VTFRJUExZIE9wZXJhdGlvbiA9IDMKLSAgRElWSURFICAgT3BlcmF0aW9uID0gNAotKQotCi1mdW5jIChwIE9wZXJhdGlvbikgU3RyaW5nKCkgc3RyaW5nIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIEFERDoKLSAgICByZXR1cm4gIkFERCIKLSAgY2FzZSBTVUJUUkFDVDoKLSAgICByZXR1cm4gIlNVQlRSQUNUIgotICBjYXNlIE1VTFRJUExZOgotICAgIHJldHVybiAiTVVMVElQTFkiCi0gIGNhc2UgRElWSURFOgotICAgIHJldHVybiAiRElWSURFIgotICB9Ci0gIHJldHVybiAiIgotfQotCi1mdW5jIEZyb21PcGVyYXRpb25TdHJpbmcocyBzdHJpbmcpIE9wZXJhdGlvbiB7Ci0gIHN3aXRjaCBzIHsKLSAgY2FzZSAiQUREIjoKLSAgICByZXR1cm4gQURECi0gIGNhc2UgIlNVQlRSQUNUIjoKLSAgICByZXR1cm4gU1VCVFJBQ1QKLSAgY2FzZSAiTVVMVElQTFkiOgotICAgIHJldHVybiBNVUxUSVBMWQotICBjYXNlICJESVZJREUiOgotICAgIHJldHVybiBESVZJREUKLSAgfQotICByZXR1cm4gT3BlcmF0aW9uKC0xMDAwMCkKLX0KLQotZnVuYyAocCBPcGVyYXRpb24pIFZhbHVlKCkgaW50IHsKLSAgcmV0dXJuIGludChwKQotfQotCi1mdW5jIChwIE9wZXJhdGlvbikgSXNFbnVtKCkgYm9vbCB7Ci0gIHJldHVybiB0cnVlCi19Ci0KLS8qKgotICpUaHJpZnQgbGV0cyB5b3UgZG8gdHlwZWRlZnMgdG8gZ2V0IHByZXR0eSBuYW1lcyBmb3IgeW91ciB0eXBlcy4gU3RhbmRhcmQKLSAqQyBzdHlsZSBoZXJlLgotICovCi10eXBlIE15SW50ZWdlciBpbnQzMgotCi1jb25zdCBJTlQzMkNPTlNUQU5UID0gOTg1MwotCi12YXIgTUFQQ09OU1RBTlQgVE1hcAotLyoqCi0gKiBTdHJ1Y3RzIGFyZSB0aGUgYmFzaWMgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMuIFRoZXkgYXJlIGNvbXByaXNlZCBvZiBmaWVsZHMKLSAqIHdoaWNoIGVhY2ggaGF2ZSBhbiBpbnRlZ2VyIGlkZW50aWZpZXIsIGEgdHlwZSwgYSBzeW1ib2xpYyBuYW1lLCBhbmQgYW4KLSAqIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUuCi0gKiAKLSAqIEZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgIm9wdGlvbmFsIiwgd2hpY2ggZW5zdXJlcyB0aGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkCi0gKiBpbiB0aGUgc2VyaWFsaXplZCBvdXRwdXQgaWYgdGhleSBhcmVuJ3Qgc2V0LiAgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgc29tZQotICogbWFudWFsIG1hbmFnZW1lbnQgaW4gc29tZSBsYW5ndWFnZXMuCi0gKiAKLSAqIEF0dHJpYnV0ZXM6Ci0gKiAgLSBOdW0xCi0gKiAgLSBOdW0yCi0gKiAgLSBPcAotICogIC0gQ29tbWVudAotICovCi10eXBlIFdvcmsgc3RydWN0IHsKLSAgVFN0cnVjdAotICBfICAgICAgIGludGVyZmFjZXt9ICJudW0xIiAgICAvLyBuaWwgIyAwCi0gIE51bTEgICAgaW50MzIgICAgICAgIm51bTEiICAgIC8vIDEKLSAgTnVtMiAgICBpbnQzMiAgICAgICAibnVtMiIgICAgLy8gMgotICBPcCAgICAgIE9wZXJhdGlvbiAgICJvcCIgICAgICAvLyAzCi0gIENvbW1lbnQgc3RyaW5nICAgICAgImNvbW1lbnQiIC8vIDQKLX0KLQotZnVuYyBOZXdXb3JrKCkgKldvcmsgewotICBvdXRwdXQgOj0gJldvcmt7Ci0gICAgVFN0cnVjdDogTmV3VFN0cnVjdCgiV29yayIsIFtdVEZpZWxkewotICAgICAgTmV3VEZpZWxkKCJudW0xIiwgSTMyLCAxKSwKLSAgICAgIE5ld1RGaWVsZCgibnVtMiIsIEkzMiwgMiksCi0gICAgICBOZXdURmllbGQoIm9wIiwgSTMyLCAzKSwKLSAgICAgIE5ld1RGaWVsZCgiY29tbWVudCIsIFNUUklORywgNCksCi0gICAgfSksCi0gIH0KLSAgewotICAgIG91dHB1dC5OdW0xID0gMAotICB9Ci0gIHJldHVybiBvdXRwdXQKLX0KLQotZnVuYyAocCAqV29yaykgUmVhZChpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIF8sIGVyciA9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZm9yIHsKLSAgICBmaWVsZE5hbWUsIGZpZWxkVHlwZUlkLCBmaWVsZElkLCBlcnIgOj0gaXByb3QuUmVhZEZpZWxkQmVnaW4oKQotICAgIGlmIGZpZWxkSWQgPCAwIHsKLSAgICAgIGZpZWxkSWQgPSBpbnQxNihwLkZpZWxkSWRGcm9tRmllbGROYW1lKGZpZWxkTmFtZSkpCi0gICAgfSBlbHNlIGlmIGZpZWxkTmFtZSA9PSAiIiB7Ci0gICAgICBmaWVsZE5hbWUgPSBwLkZpZWxkTmFtZUZyb21GaWVsZElkKGludChmaWVsZElkKSkKLSAgICB9Ci0gICAgaWYgZmllbGRUeXBlSWQgPT0gR0VORVJJQyB7Ci0gICAgICBmaWVsZFR5cGVJZCA9IHAuRmllbGRGcm9tRmllbGRJZChpbnQoZmllbGRJZCkpLlR5cGVJZCgpCi0gICAgfQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gICAgaWYgZmllbGRUeXBlSWQgPT0gU1RPUCB7Ci0gICAgICBicmVhawotICAgIH0KLSAgICBpZiBmaWVsZElkID09IDEgfHwgZmllbGROYW1lID09ICJudW0xIiB7Ci0gICAgICBpZiBmaWVsZFR5cGVJZCA9PSBJMzIgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDEoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiBmaWVsZFR5cGVJZCA9PSBWT0lEIHsKLSAgICAgICAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQxKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIGZpZWxkSWQgPT0gMiB8fCBmaWVsZE5hbWUgPT0gIm51bTIiIHsKLSAgICAgIGlmIGZpZWxkVHlwZUlkID09IEkzMiB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMihpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIGZpZWxkVHlwZUlkID09IFZPSUQgewotICAgICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDIoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgZmllbGRJZCA9PSAzIHx8IGZpZWxkTmFtZSA9PSAib3AiIHsKLSAgICAgIGlmIGZpZWxkVHlwZUlkID09IEkzMiB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMyhpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIGZpZWxkVHlwZUlkID09IFZPSUQgewotICAgICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDMoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgZmllbGRJZCA9PSA0IHx8IGZpZWxkTmFtZSA9PSAiY29tbWVudCIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gU1RSSU5HIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQ0KGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkNChpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICB9Ci0gICAgfQotICAgIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgfQotICBlcnIgPSBpcHJvdC5SZWFkU3RydWN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFJlYWRGaWVsZDEoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2NCwgZXJyNSA6PSBpcHJvdC5SZWFkSTMyKCkKLSAgaWYgZXJyNSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoMSwgIm51bTEiLCBwLlRocmlmdE5hbWUoKSwgZXJyNSkKLSAgfQotICBwLk51bTEgPSB2NAotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFJlYWRGaWVsZE51bTEoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQxKGlwcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBSZWFkRmllbGQyKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdjYsIGVycjcgOj0gaXByb3QuUmVhZEkzMigpCi0gIGlmIGVycjcgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKDIsICJudW0yIiwgcC5UaHJpZnROYW1lKCksIGVycjcpCi0gIH0KLSAgcC5OdW0yID0gdjYKLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpXb3JrKSBSZWFkRmllbGROdW0yKGlwcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUmVhZEZpZWxkMihpcHJvdCkKLX0KLQotZnVuYyAocCAqV29yaykgUmVhZEZpZWxkMyhpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHY4LCBlcnI5IDo9IGlwcm90LlJlYWRJMzIoKQotICBpZiBlcnI5ICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgzLCAib3AiLCBwLlRocmlmdE5hbWUoKSwgZXJyOSkKLSAgfQotICBwLk9wID0gT3BlcmF0aW9uKHY4KQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFJlYWRGaWVsZE9wKGlwcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUmVhZEZpZWxkMyhpcHJvdCkKLX0KLQotZnVuYyAocCAqV29yaykgUmVhZEZpZWxkNChpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYxMCwgZXJyMTEgOj0gaXByb3QuUmVhZFN0cmluZygpCi0gIGlmIGVycjExICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCg0LCAiY29tbWVudCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIxMSkKLSAgfQotICBwLkNvbW1lbnQgPSB2MTAKLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpXb3JrKSBSZWFkRmllbGRDb21tZW50KGlwcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuUmVhZEZpZWxkNChpcHJvdCkKLX0KLQotZnVuYyAocCAqV29yaykgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJXb3JrIikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMShvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IHAuV3JpdGVGaWVsZDIob3Byb3QpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQzKG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkNChvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoLTEsICJTVE9QIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqV29yaykgV3JpdGVGaWVsZDEob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIm51bTEiLCBJMzIsIDEpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJudW0xIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLk51bTEpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgxLCAibnVtMSIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJudW0xIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKldvcmspIFdyaXRlRmllbGROdW0xKG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDEob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKldvcmspIFdyaXRlRmllbGQyKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJudW0yIiwgSTMyLCAyKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgyLCAibnVtMiIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5OdW0yKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMiwgIm51bTIiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgyLCAibnVtMiIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZUZpZWxkTnVtMihvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQyKG9wcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZUZpZWxkMyhvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigib3AiLCBJMzIsIDMpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDMsICJvcCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVJMzIoaW50MzIocC5PcCkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDMsICJvcCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDMsICJvcCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZUZpZWxkT3Aob3Byb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUZpZWxkMyhvcHJvdCkKLX0KLQotZnVuYyAocCAqV29yaykgV3JpdGVGaWVsZDQob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oImNvbW1lbnQiLCBTVFJJTkcsIDQpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDQsICJjb21tZW50IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcocC5Db21tZW50KSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoNCwgImNvbW1lbnQiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCg0LCAiY29tbWVudCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpXb3JrKSBXcml0ZUZpZWxkQ29tbWVudChvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQ0KG9wcm90KQotfQotCi1mdW5jIChwICpXb3JrKSBUU3RydWN0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiV29yayIKLX0KLQotZnVuYyAocCAqV29yaykgVGhyaWZ0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiV29yayIKLX0KLQotZnVuYyAocCAqV29yaykgU3RyaW5nKCkgc3RyaW5nIHsKLSAgaWYgcCA9PSBuaWwgewotICAgIHJldHVybiAiPG5pbD4iCi0gIH0KLSAgcmV0dXJuIGZtdC5TcHJpbnRmKCJXb3JrKCUrdikiLCAqcCkKLX0KLQotZnVuYyAocCAqV29yaykgQ29tcGFyZVRvKG90aGVyIGludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIGlmIG90aGVyID09IG5pbCB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBkYXRhLCBvayA6PSBvdGhlci4oKldvcmspCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuIDAsIGZhbHNlCi0gIH0KLSAgaWYgcC5OdW0xICE9IGRhdGEuTnVtMSB7Ci0gICAgaWYgcC5OdW0xIDwgZGF0YS5OdW0xIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIHAuTnVtMiAhPSBkYXRhLk51bTIgewotICAgIGlmIHAuTnVtMiA8IGRhdGEuTnVtMiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBpZiBwLk9wICE9IGRhdGEuT3AgewotICAgIGlmIHAuT3AgPCBkYXRhLk9wIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGlmIHAuQ29tbWVudCAhPSBkYXRhLkNvbW1lbnQgewotICAgIGlmIHAuQ29tbWVudCA8IGRhdGEuQ29tbWVudCB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICByZXR1cm4gMCwgdHJ1ZQotfQotCi1mdW5jIChwICpXb3JrKSBBdHRyaWJ1dGVCeUZpZWxkSWQoaWQgaW50KSBpbnRlcmZhY2V7fSB7Ci0gIHN3aXRjaCBpZCB7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIG5pbAotICBjYXNlIDE6Ci0gICAgcmV0dXJuIHAuTnVtMQotICBjYXNlIDI6Ci0gICAgcmV0dXJuIHAuTnVtMgotICBjYXNlIDM6Ci0gICAgcmV0dXJuIHAuT3AKLSAgY2FzZSA0OgotICAgIHJldHVybiBwLkNvbW1lbnQKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKldvcmspIFRTdHJ1Y3RGaWVsZHMoKSBURmllbGRDb250YWluZXIgewotICByZXR1cm4gTmV3VEZpZWxkQ29udGFpbmVyKFtdVEZpZWxkewotICAgIE5ld1RGaWVsZCgibnVtMSIsIEkzMiwgMSksCi0gICAgTmV3VEZpZWxkKCJudW0yIiwgSTMyLCAyKSwKLSAgICBOZXdURmllbGQoIm9wIiwgSTMyLCAzKSwKLSAgICBOZXdURmllbGQoImNvbW1lbnQiLCBTVFJJTkcsIDQpLAotICB9KQotfQotCi0KLXR5cGUgSUNhbGN1bGF0b3IgaW50ZXJmYWNlIHsKLSAgLyoqCi0gICAqIFBhcmFtZXRlcnM6Ci0gICAqICAtIEtleQotICAgKi8KLSAgQ2FsY3VsYXRlKGxvZ2lkIGludDMyLCB3ICpXb3JrKSAocmV0dmFsMzAgaW50MzIsIG91Y2ggKkludmFsaWRPcGVyYXRpb24sIGVyciBvcy5FcnJvcikKLX0KLQotdHlwZSBDYWxjdWxhdG9yQ2xpZW50IHN0cnVjdCB7Ci0gIFRyYW5zcG9ydCAgICAgICBUVHJhbnNwb3J0Ci0gIFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5Ci0gIElucHV0UHJvdG9jb2wgICBUUHJvdG9jb2wKLSAgT3V0cHV0UHJvdG9jb2wgIFRQcm90b2NvbAotICBTZXFJZCAgICAgICAgICAgaW50MzIKLX0KLQotZnVuYyBOZXdDYWxjdWxhdG9yQ2xpZW50RmFjdG9yeSh0IFRUcmFuc3BvcnQsIGYgVFByb3RvY29sRmFjdG9yeSkgKkNhbGN1bGF0b3JDbGllbnQgewotICByZXR1cm4gJkNhbGN1bGF0b3JDbGllbnR7VHJhbnNwb3J0OiB0LAotICAgIFByb3RvY29sRmFjdG9yeTogZiwKLSAgICBJbnB1dFByb3RvY29sOiAgIGYuR2V0UHJvdG9jb2wodCksCi0gICAgT3V0cHV0UHJvdG9jb2w6ICBmLkdldFByb3RvY29sKHQpLAotICAgIFNlcUlkOiAgICAgICAgICAgMCwKLSAgfQotfQotCi1mdW5jIE5ld0NhbGN1bGF0b3JDbGllbnRQcm90b2NvbCh0IFRUcmFuc3BvcnQsIGlwcm90IFRQcm90b2NvbCwgb3Byb3QgVFByb3RvY29sKSAqQ2FsY3VsYXRvckNsaWVudCB7Ci0gIHJldHVybiAmQ2FsY3VsYXRvckNsaWVudHtUcmFuc3BvcnQ6IHQsCi0gICAgUHJvdG9jb2xGYWN0b3J5OiBuaWwsCi0gICAgSW5wdXRQcm90b2NvbDogICBpcHJvdCwKLSAgICBPdXRwdXRQcm90b2NvbDogIG9wcm90LAotICAgIFNlcUlkOiAgICAgICAgICAgMCwKLSAgfQotfQotCi0KLS8qKgotICogUGFyYW1ldGVyczoKLSAqICAtIExvZ2lkCi0gKiAgLSBXCi0gKi8KLWZ1bmMgKHAgKkNhbGN1bGF0b3JDbGllbnQpIENhbGN1bGF0ZShsb2dpZCBpbnQzMiwgdyAqV29yaykgKHJldHZhbDMwIGludDMyLCBvdWNoICpJbnZhbGlkT3BlcmF0aW9uLCBlcnIgb3MuRXJyb3IpIHsKLSAgZXJyID0gcC5TZW5kQ2FsY3VsYXRlKGxvZ2lkLCB3KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotICByZXR1cm4gcC5SZWN2Q2FsY3VsYXRlKCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRvckNsaWVudCkgU2VuZENhbGN1bGF0ZShsb2dpZCBpbnQzMiwgdyAqV29yaykgKGVyciBvcy5FcnJvcikgewotICBvcHJvdCA6PSBwLk91dHB1dFByb3RvY29sCi0gIGlmIG9wcm90ICE9IG5pbCB7Ci0gICAgb3Byb3QgPSBwLlByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChwLlRyYW5zcG9ydCkKLSAgICBwLk91dHB1dFByb3RvY29sID0gb3Byb3QKLSAgfQotICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbigiY2FsY3VsYXRlIiwgQ0FMTCwgcC5TZXFJZCkKLSAgYXJnczMxIDo9IE5ld0NhbGN1bGF0ZUFyZ3MoKQotICBhcmdzMzEuTG9naWQgPSBsb2dpZAotICBhcmdzMzEuVyA9IHcKLSAgZXJyID0gYXJnczMxLldyaXRlKG9wcm90KQotICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKQotICBvcHJvdC5UcmFuc3BvcnQoKS5GbHVzaCgpCi0gIHJldHVybgotfQotCi0KLWZ1bmMgKHAgKkNhbGN1bGF0b3JDbGllbnQpIFJlY3ZDYWxjdWxhdGUoKSAodmFsdWUgaW50MzIsIG91Y2ggKkludmFsaWRPcGVyYXRpb24sIGVyciBvcy5FcnJvcikgewotICBpcHJvdCA6PSBwLklucHV0UHJvdG9jb2wKLSAgaWYgaXByb3QgPT0gbmlsIHsKLSAgICBpcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KQotICAgIHAuSW5wdXRQcm90b2NvbCA9IGlwcm90Ci0gIH0KLSAgXywgbVR5cGVJZCwgXywgZXJyIDo9IGlwcm90LlJlYWRNZXNzYWdlQmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4KLSAgfQotICBpZiBtVHlwZUlkID09IEVYQ0VQVElPTiB7Ci0gICAgZXJyb3IzMyA6PSBOZXdUQXBwbGljYXRpb25FeGNlcHRpb25EZWZhdWx0KCkKLSAgICBlcnJvcjM0LCBlcnIgOj0gZXJyb3IzMy5SZWFkKGlwcm90KQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICAgIGlmIGVyciA9IGlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuCi0gICAgfQotICAgIGVyciA9IGVycm9yMzQKLSAgICByZXR1cm4KLSAgfQotICByZXN1bHQzMiA6PSBOZXdDYWxjdWxhdGVSZXN1bHQoKQotICBlcnIgPSByZXN1bHQzMi5SZWFkKGlwcm90KQotICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpCi0gIHZhbHVlID0gcmVzdWx0MzIuU3VjY2VzcwotICBpZiByZXN1bHQzMi5PdWNoICE9IG5pbCB7Ci0gICAgb3VjaCA9IHJlc3VsdDMyLk91Y2gKLSAgfQotICByZXR1cm4KLX0KLQotCi0vKioKLSAqIEF0dHJpYnV0ZXM6Ci0gKiAgLSBMb2dpZAotICogIC0gVwotICovCi10eXBlIENhbGN1bGF0ZUFyZ3Mgc3RydWN0IHsKLSAgVFN0cnVjdAotICBfICAgICBpbnRlcmZhY2V7fSAibG9naWQiIC8vIG5pbCAjIDAKLSAgTG9naWQgaW50MzIgICAgICAgImxvZ2lkIiAvLyAxCi0gIFcgICAgICpXb3JrICAgICAgICJ3IiAgICAgLy8gMgotfQotCi1mdW5jIE5ld0NhbGN1bGF0ZUFyZ3MoKSAqQ2FsY3VsYXRlQXJncyB7Ci0gIG91dHB1dCA6PSAmQ2FsY3VsYXRlQXJnc3sKLSAgICBUU3RydWN0OiBOZXdUU3RydWN0KCJjYWxjdWxhdGVfYXJncyIsIFtdVEZpZWxkewotICAgICAgTmV3VEZpZWxkKCJsb2dpZCIsIEkzMiwgMSksCi0gICAgICBOZXdURmllbGQoInciLCBTVFJVQ1QsIDIpLAotICAgIH0pLAotICB9Ci0gIHsKLSAgfQotICByZXR1cm4gb3V0cHV0Ci19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFJlYWQoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBfLCBlcnIgPSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGZvciB7Ci0gICAgZmllbGROYW1lLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKLSAgICBpZiBmaWVsZElkIDwgMCB7Ci0gICAgICBmaWVsZElkID0gaW50MTYocC5GaWVsZElkRnJvbUZpZWxkTmFtZShmaWVsZE5hbWUpKQotICAgIH0gZWxzZSBpZiBmaWVsZE5hbWUgPT0gIiIgewotICAgICAgZmllbGROYW1lID0gcC5GaWVsZE5hbWVGcm9tRmllbGRJZChpbnQoZmllbGRJZCkpCi0gICAgfQotICAgIGlmIGZpZWxkVHlwZUlkID09IEdFTkVSSUMgewotICAgICAgZmllbGRUeXBlSWQgPSBwLkZpZWxkRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKS5UeXBlSWQoKQotICAgIH0KLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgfQotICAgIGlmIGZpZWxkVHlwZUlkID09IFNUT1AgewotICAgICAgYnJlYWsKLSAgICB9Ci0gICAgaWYgZmllbGRJZCA9PSAxIHx8IGZpZWxkTmFtZSA9PSAibG9naWQiIHsKLSAgICAgIGlmIGZpZWxkVHlwZUlkID09IEkzMiB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMShpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIGZpZWxkVHlwZUlkID09IFZPSUQgewotICAgICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDEoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgZmllbGRJZCA9PSAyIHx8IGZpZWxkTmFtZSA9PSAidyIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gU1RSVUNUIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQyKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMihpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICB9Ci0gICAgfQotICAgIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgfQotICBlcnIgPSBpcHJvdC5SZWFkU3RydWN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFJlYWRGaWVsZDEoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2NDcsIGVycjQ4IDo9IGlwcm90LlJlYWRJMzIoKQotICBpZiBlcnI0OCAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoMSwgImxvZ2lkIiwgcC5UaHJpZnROYW1lKCksIGVycjQ4KQotICB9Ci0gIHAuTG9naWQgPSB2NDcKLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBSZWFkRmllbGRMb2dpZChpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDEoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFJlYWRGaWVsZDIoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBwLlcgPSBOZXdXb3JrKCkKLSAgZXJyNTEgOj0gcC5XLlJlYWQoaXByb3QpCi0gIGlmIGVycjUxICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QoInAuV1dvcmsiLCBlcnI1MSkKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFJlYWRGaWVsZFcoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQyKGlwcm90KQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oImNhbGN1bGF0ZV9hcmdzIikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMShvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IHAuV3JpdGVGaWVsZDIob3Byb3QpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKC0xLCAiU1RPUCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFdyaXRlRmllbGQxKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJsb2dpZCIsIEkzMiwgMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgImxvZ2lkIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLkxvZ2lkKSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgImxvZ2lkIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoMSwgImxvZ2lkIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFdyaXRlRmllbGRMb2dpZChvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQxKG9wcm90KQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBXcml0ZUZpZWxkMihvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIHAuVyAhPSBuaWwgewotICAgIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigidyIsIFNUUlVDVCwgMikKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJ3IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gICAgZXJyID0gcC5XLldyaXRlKG9wcm90KQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KCJXb3JrIiwgZXJyKQotICAgIH0KLSAgICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJ3IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBXcml0ZUZpZWxkVyhvcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlRmllbGQyKG9wcm90KQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBUU3RydWN0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiQ2FsY3VsYXRlQXJncyIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlQXJncykgVGhyaWZ0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiAiY2FsY3VsYXRlX2FyZ3MiCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFN0cmluZygpIHN0cmluZyB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gIjxuaWw+IgotICB9Ci0gIHJldHVybiBmbXQuU3ByaW50ZigiQ2FsY3VsYXRlQXJncyglK3YpIiwgKnApCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgewotICBpZiBvdGhlciA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgZGF0YSwgb2sgOj0gb3RoZXIuKCpDYWxjdWxhdGVBcmdzKQotICBpZiAhb2sgewotICAgIHJldHVybiAwLCBmYWxzZQotICB9Ci0gIGlmIHAuTG9naWQgIT0gZGF0YS5Mb2dpZCB7Ci0gICAgaWYgcC5Mb2dpZCA8IGRhdGEuTG9naWQgewotICAgICAgcmV0dXJuIC0xLCB0cnVlCi0gICAgfQotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgaWYgY21wLCBvayA6PSBwLlcuQ29tcGFyZVRvKGRhdGEuVyk7ICFvayB8fCBjbXAgIT0gMCB7Ci0gICAgcmV0dXJuIGNtcCwgb2sKLSAgfQotICByZXR1cm4gMCwgdHJ1ZQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVBcmdzKSBBdHRyaWJ1dGVCeUZpZWxkSWQoaWQgaW50KSBpbnRlcmZhY2V7fSB7Ci0gIHN3aXRjaCBpZCB7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIG5pbAotICBjYXNlIDE6Ci0gICAgcmV0dXJuIHAuTG9naWQKLSAgY2FzZSAyOgotICAgIHJldHVybiBwLlcKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZUFyZ3MpIFRTdHJ1Y3RGaWVsZHMoKSBURmllbGRDb250YWluZXIgewotICByZXR1cm4gTmV3VEZpZWxkQ29udGFpbmVyKFtdVEZpZWxkewotICAgIE5ld1RGaWVsZCgibG9naWQiLCBJMzIsIDEpLAotICAgIE5ld1RGaWVsZCgidyIsIFNUUlVDVCwgMiksCi0gIH0pCi19Ci0KLS8qKgotICogQXR0cmlidXRlczoKLSAqICAtIFN1Y2Nlc3MKLSAqICAtIE91Y2gKLSAqLwotdHlwZSBDYWxjdWxhdGVSZXN1bHQgc3RydWN0IHsKLSAgVFN0cnVjdAotICBTdWNjZXNzIGludDMyICAgICAgICAgICAgICJzdWNjZXNzIiAvLyAwCi0gIE91Y2ggICAgKkludmFsaWRPcGVyYXRpb24gIm91Y2giICAgIC8vIDEKLX0KLQotZnVuYyBOZXdDYWxjdWxhdGVSZXN1bHQoKSAqQ2FsY3VsYXRlUmVzdWx0IHsKLSAgb3V0cHV0IDo9ICZDYWxjdWxhdGVSZXN1bHR7Ci0gICAgVFN0cnVjdDogTmV3VFN0cnVjdCgiY2FsY3VsYXRlX3Jlc3VsdCIsIFtdVEZpZWxkewotICAgICAgTmV3VEZpZWxkKCJzdWNjZXNzIiwgSTMyLCAwKSwKLSAgICAgIE5ld1RGaWVsZCgib3VjaCIsIFNUUlVDVCwgMSksCi0gICAgfSksCi0gIH0KLSAgewotICB9Ci0gIHJldHVybiBvdXRwdXQKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBSZWFkKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgXywgZXJyID0gaXByb3QuUmVhZFN0cnVjdEJlZ2luKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBmb3IgewotICAgIGZpZWxkTmFtZSwgZmllbGRUeXBlSWQsIGZpZWxkSWQsIGVyciA6PSBpcHJvdC5SZWFkRmllbGRCZWdpbigpCi0gICAgaWYgZmllbGRJZCA8IDAgewotICAgICAgZmllbGRJZCA9IGludDE2KHAuRmllbGRJZEZyb21GaWVsZE5hbWUoZmllbGROYW1lKSkKLSAgICB9IGVsc2UgaWYgZmllbGROYW1lID09ICIiIHsKLSAgICAgIGZpZWxkTmFtZSA9IHAuRmllbGROYW1lRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKQotICAgIH0KLSAgICBpZiBmaWVsZFR5cGVJZCA9PSBHRU5FUklDIHsKLSAgICAgIGZpZWxkVHlwZUlkID0gcC5GaWVsZEZyb21GaWVsZElkKGludChmaWVsZElkKSkuVHlwZUlkKCkKLSAgICB9Ci0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgICBpZiBmaWVsZFR5cGVJZCA9PSBTVE9QIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICAgIGlmIGZpZWxkSWQgPT0gMCB8fCBmaWVsZE5hbWUgPT0gInN1Y2Nlc3MiIHsKLSAgICAgIGlmIGZpZWxkVHlwZUlkID09IEkzMiB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMChpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIGZpZWxkVHlwZUlkID09IFZPSUQgewotICAgICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDAoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgZmllbGRJZCA9PSAxIHx8IGZpZWxkTmFtZSA9PSAib3VjaCIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gU1RSVUNUIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQxKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMShpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICB9Ci0gICAgfQotICAgIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgIH0KLSAgfQotICBlcnIgPSBpcHJvdC5SZWFkU3RydWN0RW5kKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgUmVhZEZpZWxkMChpcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHY1MiwgZXJyNTMgOj0gaXByb3QuUmVhZEkzMigpCi0gIGlmIGVycjUzICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZCgwLCAic3VjY2VzcyIsIHAuVGhyaWZ0TmFtZSgpLCBlcnI1MykKLSAgfQotICBwLlN1Y2Nlc3MgPSB2NTIKLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFJlYWRGaWVsZFN1Y2Nlc3MoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQwKGlwcm90KQotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFJlYWRGaWVsZDEoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBwLk91Y2ggPSBOZXdJbnZhbGlkT3BlcmF0aW9uKCkKLSAgZXJyNTYgOj0gcC5PdWNoLlJlYWQoaXByb3QpCi0gIGlmIGVycjU2ICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRTdHJ1Y3QoInAuT3VjaEludmFsaWRPcGVyYXRpb24iLCBlcnI1NikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgUmVhZEZpZWxkT3VjaChpcHJvdCBUUHJvdG9jb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlJlYWRGaWVsZDEoaXByb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgV3JpdGUob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luKCJjYWxjdWxhdGVfcmVzdWx0IikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMChvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IHAuV3JpdGVGaWVsZDEob3Byb3QpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkU3RvcCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKC0xLCAiU1RPUCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVTdHJ1Y3RFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgV3JpdGVGaWVsZDAob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oInN1Y2Nlc3MiLCBJMzIsIDApCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDAsICJzdWNjZXNzIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLlN1Y2Nlc3MpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgwLCAic3VjY2VzcyIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDAsICJzdWNjZXNzIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgV3JpdGVGaWVsZFN1Y2Nlc3Mob3Byb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUZpZWxkMChvcHJvdCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBXcml0ZUZpZWxkMShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGlmIHAuT3VjaCAhPSBuaWwgewotICAgIGVyciA9IG9wcm90LldyaXRlRmllbGRCZWdpbigib3VjaCIsIFNUUlVDVCwgMSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJvdWNoIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gICAgZXJyID0gcC5PdWNoLldyaXRlKG9wcm90KQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlU3RydWN0KCJJbnZhbGlkT3BlcmF0aW9uIiwgZXJyKQotICAgIH0KLSAgICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkRW5kKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJvdWNoIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFdyaXRlRmllbGRPdWNoKG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDEob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgVFN0cnVjdE5hbWUoKSBzdHJpbmcgewotICByZXR1cm4gIkNhbGN1bGF0ZVJlc3VsdCIKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBUaHJpZnROYW1lKCkgc3RyaW5nIHsKLSAgcmV0dXJuICJjYWxjdWxhdGVfcmVzdWx0IgotfQotCi1mdW5jIChwICpDYWxjdWxhdGVSZXN1bHQpIFN0cmluZygpIHN0cmluZyB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gIjxuaWw+IgotICB9Ci0gIHJldHVybiBmbXQuU3ByaW50ZigiQ2FsY3VsYXRlUmVzdWx0KCUrdikiLCAqcCkKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRlUmVzdWx0KSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gMSwgdHJ1ZQotICB9Ci0gIGRhdGEsIG9rIDo9IG90aGVyLigqQ2FsY3VsYXRlUmVzdWx0KQotICBpZiAhb2sgewotICAgIHJldHVybiAwLCBmYWxzZQotICB9Ci0gIGlmIHAuU3VjY2VzcyAhPSBkYXRhLlN1Y2Nlc3MgewotICAgIGlmIHAuU3VjY2VzcyA8IGRhdGEuU3VjY2VzcyB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBpZiBjbXAsIG9rIDo9IHAuT3VjaC5Db21wYXJlVG8oZGF0YS5PdWNoKTsgIW9rIHx8IGNtcCAhPSAwIHsKLSAgICByZXR1cm4gY21wLCBvawotICB9Ci0gIHJldHVybiAwLCB0cnVlCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgQXR0cmlidXRlQnlGaWVsZElkKGlkIGludCkgaW50ZXJmYWNle30gewotICBzd2l0Y2ggaWQgewotICBkZWZhdWx0OgotICAgIHJldHVybiBuaWwKLSAgY2FzZSAwOgotICAgIHJldHVybiBwLlN1Y2Nlc3MKLSAgY2FzZSAxOgotICAgIHJldHVybiBwLk91Y2gKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0ZVJlc3VsdCkgVFN0cnVjdEZpZWxkcygpIFRGaWVsZENvbnRhaW5lciB7Ci0gIHJldHVybiBOZXdURmllbGRDb250YWluZXIoW11URmllbGR7Ci0gICAgTmV3VEZpZWxkKCJzdWNjZXNzIiwgSTMyLCAwKSwKLSAgICBOZXdURmllbGQoIm91Y2giLCBTVFJVQ1QsIDEpLAotICB9KQotfQotCi0KLS8qKgotICogU3RydWN0cyBjYW4gYWxzbyBiZSBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBuYXN0eS4KLSAqIAotICogQXR0cmlidXRlczoKLSAqICAtIFdoYXQKLSAqICAtIFdoeQotICovCi10eXBlIEludmFsaWRPcGVyYXRpb24gc3RydWN0IHsKLSAgVFN0cnVjdAotICBfICAgIGludGVyZmFjZXt9ICJ3aGF0IiAvLyBuaWwgIyAwCi0gIFdoYXQgaW50MzIgICAgICAgIndoYXQiIC8vIDEKLSAgV2h5ICBzdHJpbmcgICAgICAid2h5IiAgLy8gMgotfQotCi1mdW5jIE5ld0ludmFsaWRPcGVyYXRpb24oKSAqSW52YWxpZE9wZXJhdGlvbiB7Ci0gIG91dHB1dCA6PSAmSW52YWxpZE9wZXJhdGlvbnsKLSAgICBUU3RydWN0OiBOZXdUU3RydWN0KCJJbnZhbGlkT3BlcmF0aW9uIiwgW11URmllbGR7Ci0gICAgICBOZXdURmllbGQoIndoYXQiLCBJMzIsIDEpLAotICAgICAgTmV3VEZpZWxkKCJ3aHkiLCBTVFJJTkcsIDIpLAotICAgIH0pLAotICB9Ci0gIHsKLSAgfQotICByZXR1cm4gb3V0cHV0Ci19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFJlYWQoaXByb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBfLCBlcnIgPSBpcHJvdC5SZWFkU3RydWN0QmVnaW4oKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZFN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGZvciB7Ci0gICAgZmllbGROYW1lLCBmaWVsZFR5cGVJZCwgZmllbGRJZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKLSAgICBpZiBmaWVsZElkIDwgMCB7Ci0gICAgICBmaWVsZElkID0gaW50MTYocC5GaWVsZElkRnJvbUZpZWxkTmFtZShmaWVsZE5hbWUpKQotICAgIH0gZWxzZSBpZiBmaWVsZE5hbWUgPT0gIiIgewotICAgICAgZmllbGROYW1lID0gcC5GaWVsZE5hbWVGcm9tRmllbGRJZChpbnQoZmllbGRJZCkpCi0gICAgfQotICAgIGlmIGZpZWxkVHlwZUlkID09IEdFTkVSSUMgewotICAgICAgZmllbGRUeXBlSWQgPSBwLkZpZWxkRnJvbUZpZWxkSWQoaW50KGZpZWxkSWQpKS5UeXBlSWQoKQotICAgIH0KLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgfQotICAgIGlmIGZpZWxkVHlwZUlkID09IFNUT1AgewotICAgICAgYnJlYWsKLSAgICB9Ci0gICAgaWYgZmllbGRJZCA9PSAxIHx8IGZpZWxkTmFtZSA9PSAid2hhdCIgewotICAgICAgaWYgZmllbGRUeXBlSWQgPT0gSTMyIHsKLSAgICAgICAgZXJyID0gcC5SZWFkRmllbGQxKGlwcm90KQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgZmllbGRUeXBlSWQgPT0gVk9JRCB7Ci0gICAgICAgIGVyciA9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMShpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiBmaWVsZElkID09IDIgfHwgZmllbGROYW1lID09ICJ3aHkiIHsKLSAgICAgIGlmIGZpZWxkVHlwZUlkID09IFNUUklORyB7Ci0gICAgICAgIGVyciA9IHAuUmVhZEZpZWxkMihpcHJvdCkKLSAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIGZpZWxkVHlwZUlkID09IFZPSUQgewotICAgICAgICBlcnIgPSBpcHJvdC5Ta2lwKGZpZWxkVHlwZUlkKQotICAgICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlcnIgPSBwLlJlYWRGaWVsZDIoaXByb3QpCi0gICAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkRmllbGQoaW50KGZpZWxkSWQpLCBmaWVsZE5hbWUsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZXJyID0gaXByb3QuU2tpcChmaWVsZFR5cGVJZCkKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKGludChmaWVsZElkKSwgZmllbGROYW1lLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICAgICAgfQotICAgIH0KLSAgICBlcnIgPSBpcHJvdC5SZWFkRmllbGRFbmQoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvblJlYWRGaWVsZChpbnQoZmllbGRJZCksIGZpZWxkTmFtZSwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgICB9Ci0gIH0KLSAgZXJyID0gaXByb3QuUmVhZFN0cnVjdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25SZWFkU3RydWN0KHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBSZWFkRmllbGQxKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdjEyLCBlcnIxMyA6PSBpcHJvdC5SZWFkSTMyKCkKLSAgaWYgZXJyMTMgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKDEsICJ3aGF0IiwgcC5UaHJpZnROYW1lKCksIGVycjEzKQotICB9Ci0gIHAuV2hhdCA9IHYxMgotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFJlYWRGaWVsZFdoYXQoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQxKGlwcm90KQotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBSZWFkRmllbGQyKGlwcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdjE0LCBlcnIxNSA6PSBpcHJvdC5SZWFkU3RyaW5nKCkKLSAgaWYgZXJyMTUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uUmVhZEZpZWxkKDIsICJ3aHkiLCBwLlRocmlmdE5hbWUoKSwgZXJyMTUpCi0gIH0KLSAgcC5XaHkgPSB2MTQKLSAgcmV0dXJuIGVycgotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBSZWFkRmllbGRXaHkoaXByb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5SZWFkRmllbGQyKGlwcm90KQotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGVyciA9IG9wcm90LldyaXRlU3RydWN0QmVnaW4oIkludmFsaWRPcGVyYXRpb24iKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVTdHJ1Y3QocC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBwLldyaXRlRmllbGQxKG9wcm90KQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgZXJyID0gcC5Xcml0ZUZpZWxkMihvcHJvdCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIGVycgotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRTdG9wKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldyaXRlRmllbGQoLTEsICJTVE9QIiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZVN0cnVjdEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZVN0cnVjdChwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIHJldHVybiBlcnIKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgV3JpdGVGaWVsZDEob3Byb3QgVFByb3RvY29sKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBlcnIgPSBvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oIndoYXQiLCBJMzIsIDEpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJ3aGF0IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICBlcnIgPSBvcHJvdC5Xcml0ZUkzMihpbnQzMihwLldoYXQpKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgxLCAid2hhdCIsIHAuVGhyaWZ0TmFtZSgpLCBlcnIpCi0gIH0KLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEVuZCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDEsICJ3aGF0IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFdyaXRlRmllbGRXaGF0KG9wcm90IFRQcm90b2NvbCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuV3JpdGVGaWVsZDEob3Byb3QpCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFdyaXRlRmllbGQyKG9wcm90IFRQcm90b2NvbCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgZXJyID0gb3Byb3QuV3JpdGVGaWVsZEJlZ2luKCJ3aHkiLCBTVFJJTkcsIDIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJ3aHkiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlU3RyaW5nKHN0cmluZyhwLldoeSkpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Xcml0ZUZpZWxkKDIsICJ3aHkiLCBwLlRocmlmdE5hbWUoKSwgZXJyKQotICB9Ci0gIGVyciA9IG9wcm90LldyaXRlRmllbGRFbmQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV3JpdGVGaWVsZCgyLCAid2h5IiwgcC5UaHJpZnROYW1lKCksIGVycikKLSAgfQotICByZXR1cm4gZXJyCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFdyaXRlRmllbGRXaHkob3Byb3QgVFByb3RvY29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUZpZWxkMihvcHJvdCkKLX0KLQotZnVuYyAocCAqSW52YWxpZE9wZXJhdGlvbikgVFN0cnVjdE5hbWUoKSBzdHJpbmcgewotICByZXR1cm4gIkludmFsaWRPcGVyYXRpb24iCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFRocmlmdE5hbWUoKSBzdHJpbmcgewotICByZXR1cm4gIkludmFsaWRPcGVyYXRpb24iCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIFN0cmluZygpIHN0cmluZyB7Ci0gIGlmIHAgPT0gbmlsIHsKLSAgICByZXR1cm4gIjxuaWw+IgotICB9Ci0gIHJldHVybiBmbXQuU3ByaW50ZigiSW52YWxpZE9wZXJhdGlvbiglK3YpIiwgKnApCi19Ci0KLWZ1bmMgKHAgKkludmFsaWRPcGVyYXRpb24pIENvbXBhcmVUbyhvdGhlciBpbnRlcmZhY2V7fSkgKGludCwgYm9vbCkgewotICBpZiBvdGhlciA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgZGF0YSwgb2sgOj0gb3RoZXIuKCpJbnZhbGlkT3BlcmF0aW9uKQotICBpZiAhb2sgewotICAgIHJldHVybiAwLCBmYWxzZQotICB9Ci0gIGlmIHAuV2hhdCAhPSBkYXRhLldoYXQgewotICAgIGlmIHAuV2hhdCA8IGRhdGEuV2hhdCB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBpZiBwLldoeSAhPSBkYXRhLldoeSB7Ci0gICAgaWYgcC5XaHkgPCBkYXRhLldoeSB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICByZXR1cm4gMCwgdHJ1ZQotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBBdHRyaWJ1dGVCeUZpZWxkSWQoaWQgaW50KSBpbnRlcmZhY2V7fSB7Ci0gIHN3aXRjaCBpZCB7Ci0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIG5pbAotICBjYXNlIDE6Ci0gICAgcmV0dXJuIHAuV2hhdAotICBjYXNlIDI6Ci0gICAgcmV0dXJuIHAuV2h5Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpJbnZhbGlkT3BlcmF0aW9uKSBUU3RydWN0RmllbGRzKCkgVEZpZWxkQ29udGFpbmVyIHsKLSAgcmV0dXJuIE5ld1RGaWVsZENvbnRhaW5lcihbXVRGaWVsZHsKLSAgICBOZXdURmllbGQoIndoYXQiLCBJMzIsIDEpLAotICAgIE5ld1RGaWVsZCgid2h5IiwgU1RSSU5HLCAyKSwKLSAgfSkKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyNzM4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZXJyb3JzIgorCSJpbyIKKykKKwordmFyIGVyclRyYW5zcG9ydEludGVycnVwdGVkID0gZXJyb3JzLk5ldygiVHJhbnNwb3J0IEludGVycnVwdGVkIikKKwordHlwZSBGbHVzaGVyIGludGVyZmFjZSB7CisJRmx1c2goKSAoZXJyIGVycm9yKQorfQorCit0eXBlIENvbnRleHRGbHVzaGVyIGludGVyZmFjZSB7CisJRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikKK30KKwordHlwZSBSZWFkU2l6ZVByb3ZpZGVyIGludGVyZmFjZSB7CisJUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkKK30KKworLy8gRW5jYXBzdWxhdGVzIHRoZSBJL08gbGF5ZXIKK3R5cGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgeworCWlvLlJlYWRXcml0ZUNsb3NlcgorCUNvbnRleHRGbHVzaGVyCisJUmVhZFNpemVQcm92aWRlcgorCisJLy8gT3BlbnMgdGhlIHRyYW5zcG9ydCBmb3IgY29tbXVuaWNhdGlvbgorCU9wZW4oKSBlcnJvcgorCisJLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbgorCUlzT3BlbigpIGJvb2wKK30KKwordHlwZSBzdHJpbmdXcml0ZXIgaW50ZXJmYWNlIHsKKwlXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpCit9CisKKy8vIFRoaXMgaXMgImVuY2hhbmNlZCIgdHJhbnNwb3J0IHdpdGggZXh0cmEgY2FwYWJpbGl0aWVzLiBZb3UgbmVlZCB0byB1c2Ugb25lIG9mIHRoZXNlCisvLyB0byBjb25zdHJ1Y3QgcHJvdG9jb2wuCisvLyBOb3RhYmx5LCBUU29ja2V0IGRvZXMgbm90IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYW5kIGl0IGlzIGFsd2F5cyBhIG1pc3Rha2UgdG8gdXNlCisvLyBUU29ja2V0IGRpcmVjdGx5IGluIHByb3RvY29sLgordHlwZSBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UgeworCWlvLlJlYWRXcml0ZXIKKwlpby5CeXRlUmVhZGVyCisJaW8uQnl0ZVdyaXRlcgorCXN0cmluZ1dyaXRlcgorCUNvbnRleHRGbHVzaGVyCisJUmVhZFNpemVQcm92aWRlcgorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZXhjZXB0aW9uLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDViNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb24uZ28KQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJlcnJvcnMiCisJImlvIgorKQorCit0eXBlIHRpbWVvdXRhYmxlIGludGVyZmFjZSB7CisJVGltZW91dCgpIGJvb2wKK30KKworLy8gVGhyaWZ0IFRyYW5zcG9ydCBleGNlcHRpb24KK3R5cGUgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpbnRlcmZhY2UgeworCVRFeGNlcHRpb24KKwlUeXBlSWQoKSBpbnQKKwlFcnIoKSBlcnJvcgorfQorCitjb25zdCAoCisJVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OID0gMAorCU5PVF9PUEVOICAgICAgICAgICAgICAgICAgICA9IDEKKwlBTFJFQURZX09QRU4gICAgICAgICAgICAgICAgPSAyCisJVElNRURfT1VUICAgICAgICAgICAgICAgICAgID0gMworCUVORF9PRl9GSUxFICAgICAgICAgICAgICAgICA9IDQKKykKKwordHlwZSB0VHJhbnNwb3J0RXhjZXB0aW9uIHN0cnVjdCB7CisJdHlwZUlkIGludAorCWVyciAgICBlcnJvcgorfQorCitmdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBUeXBlSWQoKSBpbnQgeworCXJldHVybiBwLnR5cGVJZAorfQorCitmdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBFcnJvcigpIHN0cmluZyB7CisJcmV0dXJuIHAuZXJyLkVycm9yKCkKK30KKworZnVuYyAocCAqdFRyYW5zcG9ydEV4Y2VwdGlvbikgRXJyKCkgZXJyb3IgeworCXJldHVybiBwLmVycgorfQorCitmdW5jIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24odCBpbnQsIGUgc3RyaW5nKSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlyZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiB0LCBlcnI6IGVycm9ycy5OZXcoZSl9Cit9CisKK2Z1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlIGVycm9yKSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlpZiBlID09IG5pbCB7CisJCXJldHVybiBuaWwKKwl9CisKKwlpZiB0LCBvayA6PSBlLihUVHJhbnNwb3J0RXhjZXB0aW9uKTsgb2sgeworCQlyZXR1cm4gdAorCX0KKworCXN3aXRjaCB2IDo9IGUuKHR5cGUpIHsKKwljYXNlIFRUcmFuc3BvcnRFeGNlcHRpb246CisJCXJldHVybiB2CisJY2FzZSB0aW1lb3V0YWJsZToKKwkJaWYgdi5UaW1lb3V0KCkgeworCQkJcmV0dXJuICZ0VHJhbnNwb3J0RXhjZXB0aW9ue3R5cGVJZDogVElNRURfT1VULCBlcnI6IGV9CisJCX0KKwl9CisKKwlpZiBlID09IGlvLkVPRiB7CisJCXJldHVybiAmdFRyYW5zcG9ydEV4Y2VwdGlvbnt0eXBlSWQ6IEVORF9PRl9GSUxFLCBlcnI6IGV9CisJfQorCisJcmV0dXJuICZ0VHJhbnNwb3J0RXhjZXB0aW9ue3R5cGVJZDogVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCBlcnI6IGV9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2V4Y2VwdGlvbl90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDMxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9leGNlcHRpb25fdGVzdC5nbwpAQCAtMCwwICsxLDYwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImZtdCIKKwkiaW8iCisKKwkidGVzdGluZyIKKykKKwordHlwZSB0aW1lb3V0IHN0cnVjdHsgdGltZWRvdXQgYm9vbCB9CisKK2Z1bmMgKHQgKnRpbWVvdXQpIFRpbWVvdXQoKSBib29sIHsKKwlyZXR1cm4gdC50aW1lZG91dAorfQorCitmdW5jICh0ICp0aW1lb3V0KSBFcnJvcigpIHN0cmluZyB7CisJcmV0dXJuIGZtdC5TcHJpbnRmKCJUaW1lb3V0OiAldiIsIHQudGltZWRvdXQpCit9CisKK2Z1bmMgVGVzdFRFeGNlcHRpb25UaW1lb3V0KHQgKnRlc3RpbmcuVCkgeworCXRpbWVvdXQgOj0gJnRpbWVvdXR7dHJ1ZX0KKwlleGNlcHRpb24gOj0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcih0aW1lb3V0KQorCWlmIHRpbWVvdXQuRXJyb3IoKSAhPSBleGNlcHRpb24uRXJyb3IoKSB7CisJCXQuRmF0YWxmKCJFcnJvciBkaWQgbm90IG1hdGNoOiBleHBlY3RlZCAlcSwgZ290ICVxIiwgdGltZW91dC5FcnJvcigpLCBleGNlcHRpb24uRXJyb3IoKSkKKwl9CisKKwlpZiBleGNlcHRpb24uVHlwZUlkKCkgIT0gVElNRURfT1VUIHsKKwkJdC5GYXRhbGYoIlR5cGVJZCB3YXMgbm90IFRJTUVEX09VVDogZXhwZWN0ZWQgJXYsIGdvdCAldiIsIFRJTUVEX09VVCwgZXhjZXB0aW9uLlR5cGVJZCgpKQorCX0KK30KKworZnVuYyBUZXN0VEV4Y2VwdGlvbkVPRih0ICp0ZXN0aW5nLlQpIHsKKwlleGNlcHRpb24gOj0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihpby5FT0YpCisJaWYgaW8uRU9GLkVycm9yKCkgIT0gZXhjZXB0aW9uLkVycm9yKCkgeworCQl0LkZhdGFsZigiRXJyb3IgZGlkIG5vdCBtYXRjaDogZXhwZWN0ZWQgJXEsIGdvdCAlcSIsIGlvLkVPRi5FcnJvcigpLCBleGNlcHRpb24uRXJyb3IoKSkKKwl9CisKKwlpZiBleGNlcHRpb24uVHlwZUlkKCkgIT0gRU5EX09GX0ZJTEUgeworCQl0LkZhdGFsZigiVHlwZUlkIHdhcyBub3QgRU5EX09GX0ZJTEU6IGV4cGVjdGVkICV2LCBnb3QgJXYiLCBFTkRfT0ZfRklMRSwgZXhjZXB0aW9uLlR5cGVJZCgpKQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDU4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworLy8gRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisvLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKy8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQordHlwZSBUVHJhbnNwb3J0RmFjdG9yeSBpbnRlcmZhY2UgeworCUdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpCit9CisKK3R5cGUgdFRyYW5zcG9ydEZhY3Rvcnkgc3RydWN0e30KKworLy8gUmV0dXJuIGEgd3JhcHBlZCBpbnN0YW5jZSBvZiB0aGUgYmFzZSBUcmFuc3BvcnQuCitmdW5jIChwICp0VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiB0cmFucywgbmlsCit9CisKK2Z1bmMgTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZ0VHJhbnNwb3J0RmFjdG9yeXt9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI3ODAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgKAorCSJjb250ZXh0IgorCSJpbyIKKwkibmV0IgorCSJzdHJjb252IgorCSJ0ZXN0aW5nIgorKQorCitjb25zdCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSA9IDQwOTYKKwordmFyICgKKwl0cmFuc3BvcnRfYmRhdGEgIFtdYnl0ZSAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmc7IHNhbWUgYXMgZGF0YQorCXRyYW5zcG9ydF9oZWFkZXIgbWFwW3N0cmluZ11zdHJpbmcKKykKKworZnVuYyBpbml0KCkgeworCXRyYW5zcG9ydF9iZGF0YSA9IG1ha2UoW11ieXRlLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwlmb3IgaSA6PSAwOyBpIDwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkU7IGkrKyB7CisJCXRyYW5zcG9ydF9iZGF0YVtpXSA9IGJ5dGUoKGkgKyAnYScpICUgMjU1KQorCX0KKwl0cmFuc3BvcnRfaGVhZGVyID0gbWFwW3N0cmluZ11zdHJpbmd7ImtleSI6ICJVc2VyLUFnZW50IiwKKwkJInZhbHVlIjogIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMjsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzMyLjAuMTY2Ny4wIFNhZmFyaS81MzcuMzYifQorfQorCitmdW5jIFRyYW5zcG9ydFRlc3QodCAqdGVzdGluZy5ULCB3cml0ZVRyYW5zIFRUcmFuc3BvcnQsIHJlYWRUcmFucyBUVHJhbnNwb3J0KSB7CisJYnVmIDo9IG1ha2UoW11ieXRlLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwlpZiAhd3JpdGVUcmFucy5Jc09wZW4oKSB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgbm90IG9wZW46ICVzIiwgd3JpdGVUcmFucywgd3JpdGVUcmFucykKKwl9CisJaWYgIXJlYWRUcmFucy5Jc09wZW4oKSB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgbm90IG9wZW46ICVzIiwgcmVhZFRyYW5zLCByZWFkVHJhbnMpCisJfQorCV8sIGVyciA6PSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCisJfQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKKwl9CisJbiwgZXJyIDo9IGlvLlJlYWRGdWxsKHJlYWRUcmFucywgYnVmKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBlcnIpCisJfQorCWlmIG4gIT0gVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIHJlYWQgb25seSAlZCBpbnN0ZWFkIG9mICVkIGJ5dGVzIG9mIGJpbmFyeSBkYXRhIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwl9CisJZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKKwkJaWYgdiAhPSB0cmFuc3BvcnRfYmRhdGFba10geworCQkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCByZWFkICVkIGluc3RlYWQgb2YgJWQgZm9yIGluZGV4ICVkIG9mIGJpbmFyeSBkYXRhIDIiLCByZWFkVHJhbnMsIHYsIHRyYW5zcG9ydF9iZGF0YVtrXSwgaykKKwkJfQorCX0KKwlfLCBlcnIgPSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgMiBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKKwl9CisJZXJyID0gd3JpdGVUcmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgYmluYXJ5IGRhdGEgMjogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCisJfQorCWJ1ZiA9IG1ha2UoW11ieXRlLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKKwlyZWFkIDo9IDEKKwlmb3IgbiA9IDA7IG4gPCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSAmJiByZWFkICE9IDA7IHsKKwkJcmVhZCwgZXJyID0gcmVhZFRyYW5zLlJlYWQoYnVmW246XSkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIDIgb2YgdG90YWwgbGVuZ3RoICVkIGZyb20gb2Zmc2V0ICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIG4sIGVycikKKwkJfQorCQluICs9IHJlYWQKKwl9CisJaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgcmVhZCBvbmx5ICVkIGluc3RlYWQgb2YgJWQgYnl0ZXMgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgbiwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIGJ1ZiB7CisJCWlmIHYgIT0gdHJhbnNwb3J0X2JkYXRhW2tdIHsKKwkJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgcmVhZCAlZCBpbnN0ZWFkIG9mICVkIGZvciBpbmRleCAlZCBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCB2LCB0cmFuc3BvcnRfYmRhdGFba10sIGspCisJCX0KKwl9Cit9CisKK2Z1bmMgVHJhbnNwb3J0SGVhZGVyVGVzdCh0ICp0ZXN0aW5nLlQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQpIHsKKwlidWYgOj0gbWFrZShbXWJ5dGUsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFKQorCWlmICF3cml0ZVRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCB3cml0ZVRyYW5zLCB3cml0ZVRyYW5zKQorCX0KKwlpZiAhcmVhZFRyYW5zLklzT3BlbigpIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBub3Qgb3BlbjogJXMiLCByZWFkVHJhbnMsIHJlYWRUcmFucykKKwl9CisJLy8gTmVlZCB0byBhc3NlcnQgdHlwZSBvZiBUVHJhbnNwb3J0IHRvIFRIdHRwQ2xpZW50IHRvIGV4cG9zZSB0aGUgU2V0dGVyCisJaHR0cFdQb3N0VHJhbnMgOj0gd3JpdGVUcmFucy4oKlRIdHRwQ2xpZW50KQorCWh0dHBXUG9zdFRyYW5zLlNldEhlYWRlcih0cmFuc3BvcnRfaGVhZGVyWyJrZXkiXSwgdHJhbnNwb3J0X2hlYWRlclsidmFsdWUiXSkKKworCV8sIGVyciA6PSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCisJfQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKKwl9CisJLy8gTmVlZCB0byBhc3NlcnQgdHlwZSBvZiBUVHJhbnNwb3J0IHRvIFRIdHRwQ2xpZW50IHRvIGV4cG9zZSB0aGUgR2V0dGVyCisJaHR0cFJQb3N0VHJhbnMgOj0gcmVhZFRyYW5zLigqVEh0dHBDbGllbnQpCisJcmVhZEhlYWRlciA6PSBodHRwUlBvc3RUcmFucy5HZXRIZWFkZXIodHJhbnNwb3J0X2hlYWRlclsia2V5Il0pCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHJlYWQgSFRUUCBIZWFkZXIgVmFsdWUiLCBodHRwUlBvc3RUcmFucykKKwl9CisKKwlpZiB0cmFuc3BvcnRfaGVhZGVyWyJ2YWx1ZSJdICE9IHJlYWRIZWFkZXIgeworCQl0LkVycm9yZigiRXhwZWN0ZWQgSFRUUCBIZWFkZXIgVmFsdWUgJXMsIGdvdCAlcyIsIHRyYW5zcG9ydF9oZWFkZXJbInZhbHVlIl0sIHJlYWRIZWFkZXIpCisJfQorCW4sIGVyciA6PSBpby5SZWFkRnVsbChyZWFkVHJhbnMsIGJ1ZikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgcmVhZCBiaW5hcnkgZGF0YSBvZiBsZW5ndGggJWQ6ICVzIiwgcmVhZFRyYW5zLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSwgZXJyKQorCX0KKwlpZiBuICE9IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFIHsKKwkJdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSIsIHJlYWRUcmFucywgbiwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCisJfQorCWZvciBrLCB2IDo9IHJhbmdlIGJ1ZiB7CisJCWlmIHYgIT0gdHJhbnNwb3J0X2JkYXRhW2tdIHsKKwkJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgcmVhZCAlZCBpbnN0ZWFkIG9mICVkIGZvciBpbmRleCAlZCBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCB2LCB0cmFuc3BvcnRfYmRhdGFba10sIGspCisJCX0KKwl9Cit9CisKK2Z1bmMgQ2xvc2VUcmFuc3BvcnRzKHQgKnRlc3RpbmcuVCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCkgeworCWVyciA6PSByZWFkVHJhbnMuQ2xvc2UoKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBjbG9zZSByZWFkIHRyYW5zcG9ydDogJXMiLCByZWFkVHJhbnMsIGVycikKKwl9CisJaWYgd3JpdGVUcmFucyAhPSByZWFkVHJhbnMgeworCQllcnIgPSB3cml0ZVRyYW5zLkNsb3NlKCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBjbG9zZSB3cml0ZSB0cmFuc3BvcnQ6ICVzIiwgd3JpdGVUcmFucywgZXJyKQorCQl9CisJfQorfQorCitmdW5jIEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KHN0YXJ0UG9ydCBpbnQpIChuZXQuQWRkciwgZXJyb3IpIHsKKwlmb3IgaSA6PSBzdGFydFBvcnQ7IGkgPCA2NTUzNTsgaSsrIHsKKwkJcyA6PSAiMTI3LjAuMC4xOiIgKyBzdHJjb252Lkl0b2EoaSkKKwkJbCwgZXJyIDo9IG5ldC5MaXN0ZW4oInRjcCIsIHMpCisJCWlmIGVyciA9PSBuaWwgeworCQkJbC5DbG9zZSgpCisJCQlyZXR1cm4gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBzKQorCQl9CisJfQorCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKK30KKworZnVuYyB2YWx1ZUluU2xpY2UodmFsdWUgc3RyaW5nLCBzbGljZSBbXXN0cmluZykgYm9vbCB7CisJZm9yIF8sIHYgOj0gcmFuZ2Ugc2xpY2UgeworCQlpZiB2YWx1ZSA9PSB2IHsKKwkJCXJldHVybiB0cnVlCisJCX0KKwl9CisJcmV0dXJuIGZhbHNlCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXIuZ28gYi9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXIuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYzMxNjcuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90c2VydmVyLmdvCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAib3MiCi0pCi0KLXR5cGUgVFNlcnZlciBpbnRlcmZhY2UgewotICAvKioKLSAgICogQ29yZSBwcm9jZXNzb3IKLSAgICovCi0gIFByb2Nlc3NvckZhY3RvcnkoKSBUUHJvY2Vzc29yRmFjdG9yeQotICAvKioKLSAgICogU2VydmVyIHRyYW5zcG9ydAotICAgKi8KLSAgU2VydmVyVHJhbnNwb3J0KCkgVFNlcnZlclRyYW5zcG9ydAotICAvKioKLSAgICogSW5wdXQgVHJhbnNwb3J0IEZhY3RvcnkKLSAgICovCi0gIElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5Ci0gIC8qKgotICAgKiBPdXRwdXQgVHJhbnNwb3J0IEZhY3RvcnkKLSAgICovCi0gIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeQotICAvKioKLSAgICogSW5wdXQgUHJvdG9jb2wgRmFjdG9yeQotICAgKi8KLSAgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5Ci0gIC8qKgotICAgKiBPdXRwdXQgUHJvdG9jb2wgRmFjdG9yeQotICAgKi8KLSAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeQotCi0gIC8qKgotICAgKiBUaGUgcnVuIG1ldGhvZCBmaXJlcyB1cCB0aGUgc2VydmVyIGFuZCBnZXRzIHRoaW5ncyBnb2luZy4KLSAgICovCi0gIFNlcnZlKCkgb3MuRXJyb3IKLSAgLyoqCi0gICAqIFN0b3AgdGhlIHNlcnZlci4gVGhpcyBpcyBvcHRpb25hbCBvbiBhIHBlci1pbXBsZW1lbnRhdGlvbiBiYXNpcy4gTm90Ci0gICAqIGFsbCBzZXJ2ZXJzIGFyZSByZXF1aXJlZCB0byBiZSBjbGVhbmx5IHN0b3BwYWJsZS4KLSAgICovCi0gIFN0b3AoKSBvcy5FcnJvcgotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvdHNlcnZlcl9zb2NrZXQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2U3NDguLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90c2VydmVyX3NvY2tldC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJuZXQiCi0gICJvcyIKLSkKLQotCi10eXBlIFRTZXJ2ZXJTb2NrZXQgc3RydWN0IHsKLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgc29ja2V0IGNvbmVjdGlvbiBvYmplY3QKLSAgICovCi0gIGNvbm4gbmV0LkNvbm4KLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgc29ja2V0IGNvbmVjdGlvbiBvYmplY3QKLSAgICovCi0gIGxpc3RlbmVyIG5ldC5MaXN0ZW5lcgotCi0gIC8qKgotICAgKiBBZGRyZXNzIHRvIGxpc3RlbiBvbgotICAgKi8KLSAgYWRkciBuZXQuQWRkcgotCi0gIC8qKgotICAgKiBDbGllbnQgdGltZW91dCBpbiBuYW5vc2Vjb25kcwotICAgKi8KLSAgbnNlY0NsaWVudFRpbWVvdXQgaW50NjQKLX0KLQotdHlwZSBUU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgewotICBhZGRyICAgICAgICAgICAgICBuZXQuQWRkcgotICBuc2VjQ2xpZW50VGltZW91dCBpbnQ2NAotfQotCi1mdW5jIChwICpUU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotICBpZiB0cmFucyAhPSBuaWwgewotICAgIHQsIG9rIDo9IHRyYW5zLigqVFNlcnZlclNvY2tldCkKLSAgICBpZiBvayAmJiB0LmFkZHIgIT0gbmlsIHsKLSAgICAgIHMsIF8gOj0gTmV3VFNlcnZlclNvY2tldEFkZHJUaW1lb3V0KHQuYWRkciwgdC5uc2VjQ2xpZW50VGltZW91dCkKLSAgICAgIHJldHVybiBzCi0gICAgfQotICB9Ci0gIHMsIF8gOj0gTmV3VFNlcnZlclNvY2tldEFkZHJUaW1lb3V0KHAuYWRkciwgcC5uc2VjQ2xpZW50VGltZW91dCkKLSAgcmV0dXJuIHMKLX0KLQotZnVuYyBOZXdUU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeShhZGRyIG5ldC5BZGRyLCBuc2VjQ2xpZW50VGltZW91dCBpbnQ2NCkgKlRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuICZUU2VydmVyU29ja2V0VHJhbnNwb3J0RmFjdG9yeXthZGRyOiBhZGRyLCBuc2VjQ2xpZW50VGltZW91dDogbnNlY0NsaWVudFRpbWVvdXR9Ci19Ci0KLWZ1bmMgTmV3VFNlcnZlclNvY2tldENvbm4oY29ubiBuZXQuQ29ubikgKlRTZXJ2ZXJTb2NrZXQgewotICByZXR1cm4gTmV3VFNlcnZlclNvY2tldENvbm5UaW1lb3V0KGNvbm4sIDApCi19Ci0KLWZ1bmMgTmV3VFNlcnZlclNvY2tldENvbm5UaW1lb3V0KGNvbm4gbmV0LkNvbm4sIG5zZWNDbGllbnRUaW1lb3V0IGludDY0KSAqVFNlcnZlclNvY2tldCB7Ci0gIHYgOj0gJlRTZXJ2ZXJTb2NrZXR7Y29ubjogY29ubiwgYWRkcjogY29ubi5Mb2NhbEFkZHIoKSwgbnNlY0NsaWVudFRpbWVvdXQ6IG5zZWNDbGllbnRUaW1lb3V0fQotICBjb25uLlNldFRpbWVvdXQobnNlY0NsaWVudFRpbWVvdXQpCi0gIHJldHVybiB2Ci19Ci0KLWZ1bmMgTmV3VFNlcnZlclNvY2tldEFkZHIoYWRkciBuZXQuQWRkcikgKCpUU2VydmVyU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIHJldHVybiBOZXdUU2VydmVyU29ja2V0QWRkclRpbWVvdXQoYWRkciwgMCkKLX0KLQotZnVuYyBOZXdUU2VydmVyU29ja2V0QWRkclRpbWVvdXQoYWRkciBuZXQuQWRkciwgbnNlY0NsaWVudFRpbWVvdXQgaW50NjQpICgqVFNlcnZlclNvY2tldCwgVFRyYW5zcG9ydEV4Y2VwdGlvbikgewotICBzIDo9ICZUU2VydmVyU29ja2V0e2FkZHI6IGFkZHIsIG5zZWNDbGllbnRUaW1lb3V0OiBuc2VjQ2xpZW50VGltZW91dH0KLSAgcmV0dXJuIHMsIG5pbAotfQotCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBMaXN0ZW4oKSAoZXJyIG9zLkVycm9yKSB7Ci0gIGlmIHAubGlzdGVuZXIgPT0gbmlsIHsKLSAgICBpZiBwLmxpc3RlbmVyLCBlcnIgPSBuZXQuTGlzdGVuKCJ0Y3AiLCBwLmFkZHIuU3RyaW5nKCkpOyBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBBY2NlcHQoKSAoVFRyYW5zcG9ydCwgb3MuRXJyb3IpIHsKLSAgaWYgcC5saXN0ZW5lciA9PSBuaWwgewotICAgIGlmIGVyciA6PSBwLkxpc3RlbigpOyBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICAgIGlmIHAubGlzdGVuZXIgPT0gbmlsIHsKLSAgICAgIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQotICAgIH0KLSAgfQotICBjb25uLCBlcnIgOj0gcC5saXN0ZW5lci5BY2NlcHQoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmlsLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIGNvbm4uU2V0VGltZW91dChwLm5zZWNDbGllbnRUaW1lb3V0KQotICByZXR1cm4gTmV3VFNvY2tldENvbm4oY29ubikKLX0KLQotLyoqCi0gKiBDaGVja3Mgd2hldGhlciB0aGUgc29ja2V0IGlzIGNvbm5lY3RlZC4KLSAqLwotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSXNPcGVuKCkgYm9vbCB7Ci0gIHJldHVybiBwLmxpc3RlbmVyICE9IG5pbAotfQotCi0vKioKLSAqIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICovCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBPcGVuKCkgb3MuRXJyb3IgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgbCwgZXJyIDo9IG5ldC5MaXN0ZW4ocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIGVycgotICAgIH0KLSAgICBwLmxpc3RlbmVyID0gbAotICAgIHJldHVybiBuaWwKLSAgfQotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTZXJ2ZXIgc29ja2V0IGFscmVhZHkgb3BlbiIpCi19Ci0KLS8qKgotICogUGVyZm9ybSBhIG5vbmJsb2NraW5nIHJlYWQgaW50byBidWZmZXIuCi0gKi8KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiVFNlcnZlclNvY2tldC5SZWFkKFtdYnl0ZSkgaXMgbm90IGltcGxlbWVudGVkIikKLX0KLQotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgUmVhZEFsbChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gUmVhZEFsbFRyYW5zcG9ydChwLCBidWYpCi19Ci0KLS8qKgotICogUGVyZm9ybSBhIG5vbmJsb2NraW5nIHdyaXRlIG9mIHRoZSBkYXRhIGluIGJ1ZmZlcjsKLSAqLwotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgV3JpdGUoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgcmV0dXJuIDAsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiVFNlcnZlclNvY2tldC5Xcml0ZShbXWJ5dGUpIGlzIG5vdCBpbXBsZW1lbnRlZCIpCi19Ci0KLS8qKgotICogRmx1c2hlcyB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtIGlmIG5vdCBudWxsLgotICovCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiVFNlcnZlclNvY2tldC5GbHVzaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpCi19Ci0KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEFkZHIoKSBuZXQuQWRkciB7Ci0gIHJldHVybiBwLmFkZHIKLX0KLQotZnVuYyAocCAqVFNlcnZlclNvY2tldCkgUGVlaygpIGJvb2wgewotICByZXR1cm4gcC5Jc09wZW4oKQotfQotCi0vKioKLSAqIENsb3NlcyB0aGUgc29ja2V0LgotICovCi1mdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIChlcnIgb3MuRXJyb3IpIHsKLSAgaWYgcC5Jc09wZW4oKSB7Ci0gICAgZXJyIDo9IHAubGlzdGVuZXIuQ2xvc2UoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICAgIHAubGlzdGVuZXIgPSBuaWwKLSAgfQotICBpZiBwLmNvbm4gIT0gbmlsIHsKLSAgICBlcnIgOj0gcC5jb25uLkNsb3NlKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgICBwLmNvbm4gPSBuaWwKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTZXJ2ZXJTb2NrZXQpIEludGVycnVwdCgpIG9zLkVycm9yIHsKLSAgLy8gVE9ETyhwb21hY2spIGZpeCBJbnRlcnJ1cHQgYXMgaXQgaXMgcHJvYmFibHkgbm90IHJpZ2h0Ci0gIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbU9zRXJyb3IocC5DbG9zZSgpKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c2VydmVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiZTg3OS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzZXJ2ZXJfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnRfdGVzdAotCi1pbXBvcnQgKAotICAidGVzdGluZyIKLSkKLQotZnVuYyBUZXN0Tm90aGluZyh0ICp0ZXN0aW5nLlQpIHsKLQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c2VydmVyX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvdHNlcnZlcl90cmFuc3BvcnQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmM2E0NjIuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90c2VydmVyX3RyYW5zcG9ydC5nbworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICJvcyIKLQotLyoqCi0gKiBTZXJ2ZXIgdHJhbnNwb3J0LiBPYmplY3Qgd2hpY2ggcHJvdmlkZXMgY2xpZW50IHRyYW5zcG9ydHMuCi0gKgotICovCi10eXBlIFRTZXJ2ZXJUcmFuc3BvcnQgaW50ZXJmYWNlIHsKLSAgTGlzdGVuKCkgb3MuRXJyb3IKLSAgQWNjZXB0KCkgKFRUcmFuc3BvcnQsIG9zLkVycm9yKQotICBDbG9zZSgpIG9zLkVycm9yCi0KLSAgLyoqCi0gICAqIE9wdGlvbmFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBzaWduYWxzIHRvIHRoZSBzZXJ2ZXIgdHJhbnNwb3J0Ci0gICAqIHRoYXQgaXQgc2hvdWxkIGJyZWFrIG91dCBvZiBhbnkgYWNjZXB0KCkgb3IgbGlzdGVuKCkgdGhhdCBpdCBpcyBjdXJyZW50bHkKLSAgICogYmxvY2tlZCBvbi4gVGhpcyBtZXRob2QsIGlmIGltcGxlbWVudGVkLCBNVVNUIGJlIHRocmVhZCBzYWZlLCBhcyBpdCBtYXkKLSAgICogYmUgY2FsbGVkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIGNvbnRleHQgdGhhbiB0aGUgb3RoZXIgVFNlcnZlclRyYW5zcG9ydAotICAgKiBtZXRob2RzLgotICAgKi8KLSAgSW50ZXJydXB0KCkgb3MuRXJyb3IKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHNldC5nbyBiL2xpYi9nby90aHJpZnQvdHNldC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2ODEwOS4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzZXQuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiY29udGFpbmVyL2xpc3QiCi0pCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHNldCBtZXRhZGF0YS4KLSAqCi0gKi8KLXR5cGUgVFNldCBpbnRlcmZhY2UgewotICBUQ29udGFpbmVyCi0gIEVsZW1UeXBlKCkgVFR5cGUKLSAgQWRkKGRhdGEgaW50ZXJmYWNle30pCi0gIFJlbW92ZShkYXRhIGludGVyZmFjZXt9KQotICBMZXNzKG90aGVyIGludGVyZmFjZXt9KSBib29sCi0gIEZyb250KCkgKmxpc3QuRWxlbWVudAotICBCYWNrKCkgKmxpc3QuRWxlbWVudAotICBWYWx1ZXMoKSBbXWludGVyZmFjZXt9Ci19Ci0KLXR5cGUgdFNldCBzdHJ1Y3QgewotICBlbGVtVHlwZSBUVHlwZQotICBzaXplICAgICBpbnQKLSAgbCAgICAgICAgKmxpc3QuTGlzdAotfQotCi1mdW5jIE5ld1RTZXQodCBUVHlwZSwgcyBpbnQpIFRTZXQgewotICByZXR1cm4gJnRTZXR7ZWxlbVR5cGU6IHQsIHNpemU6IHMsIGw6IGxpc3QuTmV3KCl9Ci19Ci0KLWZ1bmMgTmV3VFNldERlZmF1bHQoKSBUU2V0IHsKLSAgcmV0dXJuIE5ld1RTZXQoU1RPUCwgMCkKLX0KLQotZnVuYyAocCAqdFNldCkgRWxlbVR5cGUoKSBUVHlwZSB7Ci0gIHJldHVybiBwLmVsZW1UeXBlCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIEZyb250KCkgKmxpc3QuRWxlbWVudCB7Ci0gIHJldHVybiBwLmwuRnJvbnQoKQotfQotCi1mdW5jIChwICp0U2V0KSBCYWNrKCkgKmxpc3QuRWxlbWVudCB7Ci0gIHJldHVybiBwLmwuQmFjaygpCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIExlbigpIGludCB7Ci0gIGlmIHAubC5MZW4oKSAhPSAwIHsKLSAgICByZXR1cm4gcC5sLkxlbigpCi0gIH0KLSAgcmV0dXJuIHAuc2l6ZQotfQotCi1mdW5jIChwICp0U2V0KSBDb250YWlucyhkYXRhIGludGVyZmFjZXt9KSBib29sIHsKLSAgcmV0dXJuIHAuZmluZChkYXRhKSAhPSBuaWwKLX0KLQotZnVuYyAocCAqdFNldCkgQWRkKG90aGVyIGludGVyZmFjZXt9KSB7Ci0gIGlmIGRhdGEsIG9rIDo9IHAuZWxlbVR5cGUuQ29lcmNlRGF0YShvdGhlcik7IG9rIHsKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBpZiBjbXAsIG9rIDo9IHAuZWxlbVR5cGUuQ29tcGFyZShkYXRhLCBlbGVtLlZhbHVlKTsgb2sgJiYgY21wID49IDAgewotICAgICAgICBpZiBjbXAgPiAwIHsKLSAgICAgICAgICBwLmwuSW5zZXJ0QmVmb3JlKGRhdGEsIGVsZW0pCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuCi0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWZ1bmMgKHAgKnRTZXQpIFJlbW92ZShkYXRhIGludGVyZmFjZXt9KSB7Ci0gIGVsZW0gOj0gcC5maW5kKGRhdGEpCi0gIGlmIGVsZW0gIT0gbmlsIHsKLSAgICBwLmwuUmVtb3ZlKGVsZW0pCi0gIH0KLX0KLQotZnVuYyAocCAqdFNldCkgTGVzcyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGNtcCwgb2sgOj0gcC5Db21wYXJlVG8ob3RoZXIpCi0gIHJldHVybiBvayAmJiBjbXAgPiAwCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGMsIGNvayA6PSBwLkNvbXBhcmVUbyhvdGhlcikKLSAgcmV0dXJuIGNvayAmJiBjID09IDAKLX0KLQotZnVuYyAocCAqdFNldCkgQ29tcGFyZVRvKG90aGVyIGludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIHJldHVybiBUVHlwZShTRVQpLkNvbXBhcmUocCwgb3RoZXIpCi19Ci0KLWZ1bmMgKHAgKnRTZXQpIGZpbmQoZGF0YSBpbnRlcmZhY2V7fSkgKmxpc3QuRWxlbWVudCB7Ci0gIGlmIGRhdGEgPT0gbmlsIHsKLSAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICBpZiBlbGVtLlZhbHVlID09IG5pbCB7Ci0gICAgICAgIHJldHVybiBlbGVtCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuaWwKLSAgfQotICBkYXRhLCBvayA6PSBwLmVsZW1UeXBlLkNvZXJjZURhdGEoZGF0YSkKLSAgaWYgZGF0YSA9PSBuaWwgfHwgIW9rIHsKLSAgICByZXR1cm4gbmlsCi0gIH0KLSAgaWYgcC5lbGVtVHlwZS5Jc0Jhc2VUeXBlKCkgfHwgcC5lbGVtVHlwZS5Jc0VudW0oKSB7Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgaWYgZGF0YSA9PSBlbGVtLlZhbHVlIHsKLSAgICAgICAgcmV0dXJuIGVsZW0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzT3RoZXJJbnRlcmZhY2UpOyBvayB7Ci0gICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgaWYgY21wLkVxdWFscyhlbGVtLlZhbHVlKSB7Ci0gICAgICAgIHJldHVybiBlbGVtCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuaWwKLSAgfQotICBzd2l0Y2ggcC5lbGVtVHlwZSB7Ci0gIGNhc2UgTUFQOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzTWFwKTsgb2sgewotICAgICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgICB2IDo9IGVsZW0uVmFsdWUKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUTWFwKSkgewotICAgICAgICAgIHJldHVybiBlbGVtCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuaWwKLSAgICB9Ci0gIGNhc2UgU0VUOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzU2V0KTsgb2sgewotICAgICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgICB2IDo9IGVsZW0uVmFsdWUKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUU2V0KSkgewotICAgICAgICAgIHJldHVybiBlbGVtCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuaWwKLSAgICB9Ci0gIGNhc2UgTElTVDoKLSAgICBpZiBjbXAsIG9rIDo9IGRhdGEuKEVxdWFsc0xpc3QpOyBvayB7Ci0gICAgICBmb3IgZWxlbSA6PSBwLmwuRnJvbnQoKTsgZWxlbSAhPSBuaWw7IGVsZW0gPSBlbGVtLk5leHQoKSB7Ci0gICAgICAgIHYgOj0gZWxlbS5WYWx1ZQotICAgICAgICBpZiB2ID09IG5pbCB7Ci0gICAgICAgICAgY29udGludWUKLSAgICAgICAgfQotICAgICAgICBpZiBjbXAuRXF1YWxzKHYuKFRMaXN0KSkgewotICAgICAgICAgIHJldHVybiBlbGVtCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuaWwKLSAgICB9Ci0gIGNhc2UgU1RSVUNUOgotICAgIGlmIGNtcCwgb2sgOj0gZGF0YS4oRXF1YWxzU3RydWN0KTsgb2sgewotICAgICAgZm9yIGVsZW0gOj0gcC5sLkZyb250KCk7IGVsZW0gIT0gbmlsOyBlbGVtID0gZWxlbS5OZXh0KCkgewotICAgICAgICB2IDo9IGVsZW0uVmFsdWUKLSAgICAgICAgaWYgdiA9PSBuaWwgewotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIH0KLSAgICAgICAgaWYgY21wLkVxdWFscyh2LihUU3RydWN0KSkgewotICAgICAgICAgIHJldHVybiBlbGVtCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuaWwKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICp0U2V0KSBWYWx1ZXMoKSBbXWludGVyZmFjZXt9IHsKLSAgc2l6ZSA6PSBwLmwuTGVuKCkKLSAgdmFsdWVzIDo9IG1ha2UoW11pbnRlcmZhY2V7fSwgc2l6ZSwgc2l6ZSkKLSAgaSA6PSAwCi0gIGZvciB2IDo9IHAubC5Gcm9udCgpOyB2ICE9IG5pbDsgdiA9IHYuTmV4dCgpIHsKLSAgICB2YWx1ZXNbaV0gPSB2LlZhbHVlCi0gICAgaSsrCi0gIH0KLSAgcmV0dXJuIHZhbHVlcwotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c2ltcGxlX2pzb25fcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfanNvbl9wcm90b2NvbC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5ZGQ5Yy4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfanNvbl9wcm90b2NvbC5nbworKysgL2Rldi9udWxsCkBAIC0xLDEyODEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAiYnVmaW8iCi0gICJieXRlcyIKLSAgImNvbnRhaW5lci92ZWN0b3IiCi0gICJlbmNvZGluZy9iYXNlNjQiCi0gICJmbXQiCi0gICJpbyIKLSAgImpzb24iCi0gICJtYXRoIgotICAib3MiCi0gICJzdHJjb252IgotICAic3RyaW5ncyIKLSkKLQotdHlwZSBfUGFyc2VDb250ZXh0IGludAotCi1jb25zdCAoCi0gIF9DT05URVhUX0lOX1RPUExFVkVMICAgICAgICAgIF9QYXJzZUNvbnRleHQgPSAxCi0gIF9DT05URVhUX0lOX0xJU1RfRklSU1QgICAgICAgIF9QYXJzZUNvbnRleHQgPSAyCi0gIF9DT05URVhUX0lOX0xJU1QgICAgICAgICAgICAgIF9QYXJzZUNvbnRleHQgPSAzCi0gIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCAgICAgIF9QYXJzZUNvbnRleHQgPSA0Ci0gIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWSAgIF9QYXJzZUNvbnRleHQgPSA1Ci0gIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFIF9QYXJzZUNvbnRleHQgPSA2Ci0pCi0KLWZ1bmMgKHAgX1BhcnNlQ29udGV4dCkgU3RyaW5nKCkgc3RyaW5nIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIF9DT05URVhUX0lOX1RPUExFVkVMOgotICAgIHJldHVybiAiVE9QTEVWRUwiCi0gIGNhc2UgX0NPTlRFWFRfSU5fTElTVF9GSVJTVDoKLSAgICByZXR1cm4gIkxJU1QtRklSU1QiCi0gIGNhc2UgX0NPTlRFWFRfSU5fTElTVDoKLSAgICByZXR1cm4gIkxJU1QiCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgotICAgIHJldHVybiAiT0JKRUNULUZJUlNUIgotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKLSAgICByZXR1cm4gIk9CSkVDVC1ORVhULUtFWSIKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLSAgICByZXR1cm4gIk9CSkVDVC1ORVhULVZBTFVFIgotICB9Ci0gIHJldHVybiAiVU5LTk9XTi1QQVJTRS1DT05URVhUIgotfQotCi0vKioKLSAqIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KLSAqCi0gKiBUaGlzIHByb3RvY29sIHByb2R1Y2VzL2NvbnN1bWVzIGEgc2ltcGxlIG91dHB1dCBmb3JtYXQKLSAqIHN1aXRhYmxlIGZvciBwYXJzaW5nIGJ5IHNjcmlwdGluZyBsYW5ndWFnZXMuICBJdCBzaG91bGQgbm90IGJlCi0gKiBjb25mdXNlZCB3aXRoIHRoZSBmdWxsLWZlYXR1cmVkIFRKU09OUHJvdG9jb2wuCi0gKgotICovCi10eXBlIFRTaW1wbGVKU09OUHJvdG9jb2wgc3RydWN0IHsKLSAgLy9UUHJvdG9jb2xCYXNlOwotICB0cmFucyBUVHJhbnNwb3J0Ci0KLSAgLyoqCi0gICAqIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbi4KLSAgICovCi0gIHBhcnNlQ29udGV4dFN0YWNrIHZlY3Rvci5JbnRWZWN0b3IKLSAgLyoqCi0gICAqIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbi4KLSAgICovCi0gIGR1bXBDb250ZXh0IHZlY3Rvci5JbnRWZWN0b3IKLQotICAvKioKLSAgICogQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCi0gICAqLwotICB3cml0ZXIgVFRyYW5zcG9ydAotICByZWFkZXIgKmJ1ZmlvLlJlYWRlcgotfQotCi0vKioKLSAqIENvbnN0cnVjdG9yCi0gKi8KLWZ1bmMgTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0IFRUcmFuc3BvcnQpICpUU2ltcGxlSlNPTlByb3RvY29sIHsKLSAgdiA6PSAmVFNpbXBsZUpTT05Qcm90b2NvbHt0cmFuczogdCwKLSAgICB3cml0ZXI6IHQsCi0gICAgcmVhZGVyOiBidWZpby5OZXdSZWFkZXIodCksCi0gIH0KLSAgdi5wYXJzZUNvbnRleHRTdGFjay5QdXNoKGludChfQ09OVEVYVF9JTl9UT1BMRVZFTCkpCi0gIHYuZHVtcENvbnRleHQuUHVzaChpbnQoX0NPTlRFWFRfSU5fVE9QTEVWRUwpKQotICByZXR1cm4gdgotfQotCi0vKioKLSAqIEZhY3RvcnkKLSAqLwotdHlwZSBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSBzdHJ1Y3R7fQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSkgR2V0UHJvdG9jb2wodHJhbnMgVFRyYW5zcG9ydCkgVFByb3RvY29sIHsKLSAgcmV0dXJuIE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi19Ci0KLWZ1bmMgTmV3VFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKSAqVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkgewotICByZXR1cm4gJlRTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5e30KLX0KLQotdmFyICgKLSAgSlNPTl9DT01NQSAgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9DT0xPTiAgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9MQlJBQ0UgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9SQlJBQ0UgICAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9MQlJBQ0tFVCAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9SQlJBQ0tFVCAgICAgICAgICAgICAgICBbXWJ5dGUKLSAgSlNPTl9RVU9URSAgICAgICAgICAgICAgICAgICBieXRlCi0gIEpTT05fUVVPVEVfQllURVMgICAgICAgICAgICAgW11ieXRlCi0gIEpTT05fTlVMTCAgICAgICAgICAgICAgICAgICAgW11ieXRlCi0gIEpTT05fVFJVRSAgICAgICAgICAgICAgICAgICAgW11ieXRlCi0gIEpTT05fRkFMU0UgICAgICAgICAgICAgICAgICAgW11ieXRlCi0gIEpTT05fSU5GSU5JVFkgICAgICAgICAgICAgICAgc3RyaW5nCi0gIEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgICAgICAgc3RyaW5nCi0gIEpTT05fTkFOICAgICAgICAgICAgICAgICAgICAgc3RyaW5nCi0gIEpTT05fSU5GSU5JVFlfQllURVMgICAgICAgICAgW11ieXRlCi0gIEpTT05fTkVHQVRJVkVfSU5GSU5JVFlfQllURVMgW11ieXRlCi0gIEpTT05fTkFOX0JZVEVTICAgICAgICAgICAgICAgW11ieXRlCi0gIGpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyAgW11ieXRlCi0pCi0KLWZ1bmMgaW5pdCgpIHsKLSAgSlNPTl9DT01NQSA9IFtdYnl0ZXsnLCd9Ci0gIEpTT05fQ09MT04gPSBbXWJ5dGV7JzonfQotICBKU09OX0xCUkFDRSA9IFtdYnl0ZXsneyd9Ci0gIEpTT05fUkJSQUNFID0gW11ieXRleyd9J30KLSAgSlNPTl9MQlJBQ0tFVCA9IFtdYnl0ZXsnWyd9Ci0gIEpTT05fUkJSQUNLRVQgPSBbXWJ5dGV7J10nfQotICBKU09OX1FVT1RFID0gJyInCi0gIEpTT05fUVVPVEVfQllURVMgPSBbXWJ5dGV7JyInfQotICBKU09OX05VTEwgPSBbXWJ5dGV7J24nLCAndScsICdsJywgJ2wnfQotICBKU09OX1RSVUUgPSBbXWJ5dGV7J3QnLCAncicsICd1JywgJ2UnfQotICBKU09OX0ZBTFNFID0gW11ieXRleydmJywgJ2EnLCAnbCcsICdzJywgJ2UnfQotICBKU09OX0lORklOSVRZID0gIkluZmluaXR5IgotICBKU09OX05FR0FUSVZFX0lORklOSVRZID0gIi1JbmZpbml0eSIKLSAgSlNPTl9OQU4gPSAiTmFOIgotICBKU09OX0lORklOSVRZX0JZVEVTID0gW11ieXRleydJJywgJ24nLCAnZicsICdpJywgJ24nLCAnaScsICd0JywgJ3knfQotICBKU09OX05FR0FUSVZFX0lORklOSVRZX0JZVEVTID0gW11ieXRleyctJywgJ0knLCAnbicsICdmJywgJ2knLCAnbicsICdpJywgJ3QnLCAneSd9Ci0gIEpTT05fTkFOX0JZVEVTID0gW11ieXRleydOJywgJ2EnLCAnTid9Ci0gIGpzb25fbm9uYmFzZV9tYXBfZWxlbV9ieXRlcyA9IFtdYnl0ZXsnXScsICcsJywgJ1snfQotfQotCi1mdW5jIEpzb25RdW90ZShzIHN0cmluZykgc3RyaW5nIHsKLSAgYiwgXyA6PSBqc29uLk1hcnNoYWwocykKLSAgczEgOj0gc3RyaW5nKGIpCi0gIHJldHVybiBzMQotfQotCi1mdW5jIEpzb25VbnF1b3RlKHMgc3RyaW5nKSAoc3RyaW5nLCBib29sKSB7Ci0gIHMxIDo9IG5ldyhzdHJpbmcpCi0gIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHMxKQotICByZXR1cm4gKnMxLCBlcnIgPT0gbmlsCi19Ci0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNZXNzYWdlQmVnaW4obmFtZSBzdHJpbmcsIHR5cGVJZCBUTWVzc2FnZVR5cGUsIHNlcUlkIGludDMyKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZVN0cmluZyhuYW1lKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKHR5cGVJZCkpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVJMzIoc2VxSWQpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWVzc2FnZUVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dExpc3RFbmQoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEJlZ2luKG5hbWUgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0T2JqZWN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVN0cnVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dE9iamVjdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlRmllbGRCZWdpbihuYW1lIHN0cmluZywgdHlwZUlkIFRUeXBlLCBpZCBpbnQxNikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLldyaXRlU3RyaW5nKG5hbWUpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICByZXR1cm4gbmlsCi0gIC8qCi0gICAgCWlmIGUgOj0gcC5PdXRwdXRMaXN0QmVnaW4oKTsgZSAhPSBuaWwgewotICAgICAgICByZXR1cm4gZQotICAgICAgfQotICAgICAgaWYgZSA6PSBwLldyaXRlQnl0ZShieXRlKHR5cGVJZCkpOyBlICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBlCi0gICAgICB9Ci0gICAgICByZXR1cm4gcC5Xcml0ZUkxNihpZCkKLSAgKi8KLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIC8vcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVGaWVsZFN0b3AoKSBUUHJvdG9jb2xFeGNlcHRpb24geyByZXR1cm4gbmlsIH0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVNYXBCZWdpbihrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0TGlzdEJlZ2luKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZShrZXlUeXBlKSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5Xcml0ZUJ5dGUoYnl0ZSh2YWx1ZVR5cGUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIHAuV3JpdGVJMzIoaW50MzIoc2l6ZSkpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTWFwRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0RWxlbUxpc3RCZWdpbihlbGVtVHlwZSwgc2l6ZSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVMaXN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0TGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU2V0QmVnaW4oZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZVNldEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLk91dHB1dExpc3RFbmQoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUJvb2woYiBib29sKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRCb29sKGIpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlQnl0ZShiIGJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLldyaXRlSTMyKGludDMyKGIpKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUkxNih2IGludDE2KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5Xcml0ZUkzMihpbnQzMih2KSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVJMzIodiBpbnQzMikgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0STY0KGludDY0KHYpKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBXcml0ZUk2NCh2IGludDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRJNjQoaW50NjQodikpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlRG91YmxlKHYgZmxvYXQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIHAuT3V0cHV0RjY0KHYpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFdyaXRlU3RyaW5nKHYgc3RyaW5nKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5PdXRwdXRTdHJpbmcodikKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgV3JpdGVCaW5hcnkodiBbXWJ5dGUpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIC8vIEpTT04gbGlicmFyeSBvbmx5IHRha2VzIGluIGEgc3RyaW5nLCAKLSAgLy8gbm90IGFuIGFyYml0cmFyeSBieXRlIGFycmF5LCB0byBlbnN1cmUgYnl0ZXMgYXJlIHRyYW5zbWl0dGVkCi0gIC8vIGVmZmljaWVudGx5IHdlIG11c3QgY29udmVydCB0aGlzIGludG8gYSB2YWxpZCBKU09OIHN0cmluZwotICAvLyB0aGVyZWZvcmUgd2UgdXNlIGJhc2U2NCBlbmNvZGluZyB0byBhdm9pZCBleGNlc3NpdmUgZXNjYXBpbmcvcXVvdGluZwotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1FVT1RFX0JZVEVTKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHdyaXRlciA6PSBiYXNlNjQuTmV3RW5jb2RlcihiYXNlNjQuU3RkRW5jb2RpbmcsIHAud3JpdGVyKQotICBpZiBfLCBlIDo9IHdyaXRlci5Xcml0ZSh2KTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIGlmIGUgOj0gd3JpdGVyLkNsb3NlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fUVVPVEVfQllURVMpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKLX0KLQotLyoqCi0gKiBSZWFkaW5nIG1ldGhvZHMuCi0gKi8KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VCZWdpbigpIChuYW1lIHN0cmluZywgdHlwZUlkIFRNZXNzYWdlVHlwZSwgc2VxSWQgaW50MzIsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIGlmIG5hbWUsIGVyciA9IHAuUmVhZFN0cmluZygpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmFtZSwgdHlwZUlkLCBzZXFJZCwgZXJyCi0gIH0KLSAgYlR5cGVJZCwgZXJyIDo9IHAuUmVhZEJ5dGUoKQotICB0eXBlSWQgPSBUTWVzc2FnZVR5cGUoYlR5cGVJZCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIGlmIHNlcUlkLCBlcnIgPSBwLlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7Ci0gICAgcmV0dXJuIG5hbWUsIHR5cGVJZCwgc2VxSWQsIGVycgotICB9Ci0gIHJldHVybiBuYW1lLCB0eXBlSWQsIHNlcUlkLCBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1lc3NhZ2VFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RydWN0QmVnaW4oKSAobmFtZSBzdHJpbmcsIGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgXywgZXJyID0gcC5QYXJzZU9iamVjdFN0YXJ0KCkKLSAgcmV0dXJuICIiLCBlcnIKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZFN0cnVjdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlT2JqZWN0RW5kKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEZpZWxkQmVnaW4oKSAoc3RyaW5nLCBUVHlwZSwgaW50MTYsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgU1RPUCwgMCwgZXJyCi0gIH0KLSAgaWYgcC5yZWFkZXIuQnVmZmVyZWQoKSA8IDEgewotICAgIHJldHVybiAiIiwgU1RPUCwgMCwgbmlsCi0gIH0KLSAgYiwgXyA6PSBwLnJlYWRlci5QZWVrKDEpCi0gIGlmIGxlbihiKSA+IDAgewotICAgIHN3aXRjaCBiWzBdIHsKLSAgICBjYXNlIEpTT05fUkJSQUNFWzBdOgotICAgICAgcmV0dXJuICIiLCBTVE9QLCAwLCBuaWwKLSAgICBjYXNlIEpTT05fUVVPVEU6Ci0gICAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgICBuYW1lLCBlcnIgOj0gcC5QYXJzZVN0cmluZ0JvZHkoKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBuYW1lLCBTVE9QLCAwLCBlcnIKLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lLCBHRU5FUklDLCAtMSwgcC5QYXJzZVBvc3RWYWx1ZSgpCi0gICAgICAvKgotICAgICAgICAgaWYgZXJyID0gcC5QYXJzZVBvc3RWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKLSAgICAgICAgICAgcmV0dXJuIG5hbWUsIFNUT1AsIDAsIGVycgotICAgICAgICAgfQotICAgICAgICAgaWYgaXNOdWxsLCBlcnIgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgIHJldHVybiBuYW1lLCBTVE9QLCAwLCBlcnIKLSAgICAgICAgIH0KLSAgICAgICAgIGJUeXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gICAgICAgICB0aGV0eXBlIDo9IFRUeXBlKGJUeXBlKQotICAgICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgICAgIHJldHVybiBuYW1lLCB0aGV0eXBlLCAwLCBlcnIKLSAgICAgICAgIH0KLSAgICAgICAgIGlkLCBlcnIgOj0gcC5SZWFkSTE2KCkKLSAgICAgICAgIHJldHVybiBuYW1lLCB0aGV0eXBlLCBpZCwgZXJyCi0gICAgICAqLwotICAgIH0KLSAgICByZXR1cm4gIiIsIFNUT1AsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGVkIFwifVwiIG9yICdcIicsIGJ1dCBmb3VuZDogJyIsIHN0cmluZyhiKSwgIiciKSkKLSAgfQotICByZXR1cm4gIiIsIFNUT1AsIDAsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKG9zLkVPRikKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEZpZWxkRW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgcmV0dXJuIG5pbAotICAvL3JldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRNYXBCZWdpbigpIChrZXlUeXBlIFRUeXBlLCB2YWx1ZVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgewotICAgIHJldHVybiBWT0lELCBWT0lELCAwLCBlCi0gIH0KLQotICAvLyByZWFkIGtleVR5cGUKLSAgYktleVR5cGUsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gIGtleVR5cGUgPSBUVHlwZShiS2V5VHlwZSkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBrZXlUeXBlLCB2YWx1ZVR5cGUsIHNpemUsIGUKLSAgfQotCi0gIC8vIHJlYWQgdmFsdWVUeXBlCi0gIGJWYWx1ZVR5cGUsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gIHZhbHVlVHlwZSA9IFRUeXBlKGJWYWx1ZVR5cGUpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICByZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlCi0gIH0KLQotICAvLyByZWFkIHNpemUKLSAgaVNpemUsIGVyciA6PSBwLlJlYWRJNjQoKQotICBzaXplID0gaW50KGlTaXplKQotICByZXR1cm4ga2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplLCBlcnIKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZE1hcEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRMaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gcC5QYXJzZUVsZW1MaXN0QmVnaW4oKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkTGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBwLlBhcnNlTGlzdEVuZCgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTZXRCZWdpbigpIChlbGVtVHlwZSBUVHlwZSwgc2l6ZSBpbnQsIGUgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHJldHVybiBwLlBhcnNlRWxlbUxpc3RCZWdpbigpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRTZXRFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICByZXR1cm4gcC5QYXJzZUxpc3RFbmQoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkQm9vbCgpIChib29sLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdmFyIHZhbHVlIGJvb2wKLSAgaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gdmFsdWUsIGVycgotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9GQUxTRSkpCi0gIGlmIGxlbihiKSA+IDAgewotICAgIHN3aXRjaCBiWzBdIHsKLSAgICBjYXNlIEpTT05fVFJVRVswXToKLSAgICAgIGlmIHN0cmluZyhiWzA6bGVuKEpTT05fVFJVRSldKSA9PSBzdHJpbmcoSlNPTl9UUlVFKSB7Ci0gICAgICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX1RSVUUpXSkKLSAgICAgICAgdmFsdWUgPSB0cnVlCi0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdmFsdWUsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCBcInRydWVcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgICAgfQotICAgICAgYnJlYWsKLSAgICBjYXNlIEpTT05fRkFMU0VbMF06Ci0gICAgICBpZiBzdHJpbmcoYlswOmxlbihKU09OX0ZBTFNFKV0pID09IHN0cmluZyhKU09OX0ZBTFNFKSB7Ci0gICAgICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX0ZBTFNFKV0pCi0gICAgICAgIHZhbHVlID0gZmFsc2UKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZSwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkIFwiZmFsc2VcIiBidXQgZm91bmQ6ICIrc3RyaW5nKGIpKQotICAgICAgfQotICAgICAgYnJlYWsKLSAgICBjYXNlIEpTT05fTlVMTFswXToKLSAgICAgIGlmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICAgICAgdmFsdWUgPSBmYWxzZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCJudWxsXCIgYnV0IGZvdW5kOiAiK3N0cmluZyhiKSkKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHZhbHVlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgb3IgXCJudWxsXCIgYnV0IGZvdW5kOiAiK3N0cmluZyhiKSkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlLCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJ5dGUoKSAoYnl0ZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJNjQoKQotICByZXR1cm4gYnl0ZSh2KSwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWRJMTYoKSAoaW50MTYsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2LCBlcnIgOj0gcC5SZWFkSTY0KCkKLSAgcmV0dXJuIGludDE2KHYpLCBlcnIKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEkzMigpIChpbnQzMiwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIGVyciA6PSBwLlJlYWRJNjQoKQotICByZXR1cm4gaW50MzIodiksIGVycgotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkSTY0KCkgKGludDY0LCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgdiwgXywgZXJyIDo9IHAuUGFyc2VJNjQoKQotICByZXR1cm4gdiwgZXJyCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFJlYWREb3VibGUoKSAoZmxvYXQ2NCwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHYsIF8sIGVyciA6PSBwLlBhcnNlRjY0KCkKLSAgcmV0dXJuIHYsIGVycgotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBSZWFkU3RyaW5nKCkgKHN0cmluZywgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIHZhciB2IHN0cmluZwotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiB2LCBlcnIKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKLSAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgdmFsdWUsIGVyciA6PSBwLlBhcnNlU3RyaW5nQm9keSgpCi0gICAgdiA9IHZhbHVlCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdiwgZXJyCi0gICAgfQotICB9IGVsc2UgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiWzA6bGVuKEpTT05fTlVMTCldKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgXywgZXJyIDo9IHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gICAgfQotICB9IGVsc2UgewotICAgIHJldHVybiB2LCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBhIEpTT04gc3RyaW5nLCBmb3VuZCAiLCBzdHJpbmcoYikpKQotICB9Ci0gIHJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUmVhZEJpbmFyeSgpIChbXWJ5dGUsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICB2YXIgdiBbXWJ5dGUKLSAgaWYgZXJyIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gbmlsLCBlcnIKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGxlbihiKSA+IDAgJiYgYlswXSA9PSBKU09OX1FVT1RFIHsKLSAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgdmFsdWUsIGVyciA6PSBwLlBhcnNlQmFzZTY0RW5jb2RlZEJvZHkoKQotICAgIHYgPSB2YWx1ZQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHYsIGVycgotICAgIH0KLSAgfSBlbHNlIGlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYlswOmxlbihKU09OX05VTEwpXSkgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotICAgIF8sIGVyciA6PSBwLnJlYWRlci5SZWFkKGJbMDpsZW4oSlNPTl9OVUxMKV0pCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICByZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0ZWQgYSBKU09OIHN0cmluZywgZm91bmQgIiwgc3RyaW5nKGIpKSkKLSAgfQotICByZXR1cm4gdiwgcC5QYXJzZVBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIEZsdXNoKCkgKGVyciBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKHAud3JpdGVyLkZsdXNoKCkpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFNraXAoZmllbGRUeXBlIFRUeXBlKSAoZXJyIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICByZXR1cm4gU2tpcERlZmF1bHREZXB0aChwLCBmaWVsZFR5cGUpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFRyYW5zcG9ydCgpIFRUcmFuc3BvcnQgewotICByZXR1cm4gcC50cmFucwotfQotCi0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFByZVZhbHVlKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgY3h0IDo9IF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dC5MYXN0KCkpCi0gIHN3aXRjaCBjeHQgewotICBjYXNlIF9DT05URVhUX0lOX0xJU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKLSAgICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fQ09NTUEpOyBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICB9Ci0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLSAgICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fQ09MT04pOyBlICE9IG5pbCB7Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICB9Ci0gICAgYnJlYWsKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFBvc3RWYWx1ZSgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGN4dCA6PSBfUGFyc2VDb250ZXh0KHAuZHVtcENvbnRleHQuTGFzdCgpKQotICBzd2l0Y2ggY3h0IHsKLSAgY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgotICAgIHAuZHVtcENvbnRleHQuUG9wKCkKLSAgICBwLmR1bXBDb250ZXh0LlB1c2goaW50KF9DT05URVhUX0lOX0xJU1QpKQotICAgIGJyZWFrCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNUOgotICAgIHAuZHVtcENvbnRleHQuUG9wKCkKLSAgICBwLmR1bXBDb250ZXh0LlB1c2goaW50KF9DT05URVhUX0lOX09CSkVDVF9ORVhUX1ZBTFVFKSkKLSAgICBicmVhawotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKLSAgICBwLmR1bXBDb250ZXh0LlBvcCgpCi0gICAgcC5kdW1wQ29udGV4dC5QdXNoKGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRSkpCi0gICAgYnJlYWsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9WQUxVRToKLSAgICBwLmR1bXBDb250ZXh0LlBvcCgpCi0gICAgcC5kdW1wQ29udGV4dC5QdXNoKGludChfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVkpKQotICAgIGJyZWFrCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRCb29sKHZhbHVlIGJvb2wpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICB2YXIgdiBzdHJpbmcKLSAgaWYgdmFsdWUgewotICAgIHYgPSBzdHJpbmcoSlNPTl9UUlVFKQotICB9IGVsc2UgewotICAgIHYgPSBzdHJpbmcoSlNPTl9GQUxTRSkKLSAgfQotICBzd2l0Y2ggX1BhcnNlQ29udGV4dChwLmR1bXBDb250ZXh0Lkxhc3QoKSkgewotICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgIHYgPSBKc29uUXVvdGUodikKLSAgZGVmYXVsdDoKLSAgfQotICBpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0TnVsbCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIGUgOj0gcC5PdXRwdXRQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBfLCBlIDo9IHAud3JpdGVyLldyaXRlKEpTT05fTlVMTCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICByZXR1cm4gcC5PdXRwdXRQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRGNjQodmFsdWUgZmxvYXQ2NCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHZhciB2IHN0cmluZwotICBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIEpTT05fTkFOICsgc3RyaW5nKEpTT05fUVVPVEUpCi0gIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIEpTT05fSU5GSU5JVFkgKyBzdHJpbmcoSlNPTl9RVU9URSkKLSAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7Ci0gICAgdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgKyBzdHJpbmcoSlNPTl9RVU9URSkKLSAgfSBlbHNlIHsKLSAgICB2ID0gc3RyY29udi5GdG9hNjQodmFsdWUsICdnJywgLTEpCi0gICAgc3dpdGNoIF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dC5MYXN0KCkpIHsKLSAgICBjYXNlIF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCwgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgICAgdiA9IHN0cmluZyhKU09OX1FVT1RFKSArIHYgKyBzdHJpbmcoSlNPTl9RVU9URSkKLSAgICBkZWZhdWx0OgotICAgIH0KLSAgfQotICBpZiBlIDo9IHAuT3V0cHV0U3RyaW5nRGF0YSh2KTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIHAuT3V0cHV0UG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0STY0KHZhbHVlIGludDY0KSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgdiA6PSBzdHJjb252Lkl0b2E2NCh2YWx1ZSkKLSAgc3dpdGNoIF9QYXJzZUNvbnRleHQocC5kdW1wQ29udGV4dC5MYXN0KCkpIHsKLSAgY2FzZSBfQ09OVEVYVF9JTl9PQkpFQ1RfRklSU1QsIF9DT05URVhUX0lOX09CSkVDVF9ORVhUX0tFWToKLSAgICB2ID0gSnNvblF1b3RlKHYpCi0gIGRlZmF1bHQ6Ci0gIH0KLSAgaWYgZSA6PSBwLk91dHB1dFN0cmluZ0RhdGEodik7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZyhzIHN0cmluZykgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dFByZVZhbHVlKCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIGlmIGUgOj0gcC5PdXRwdXRTdHJpbmdEYXRhKEpzb25RdW90ZShzKSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gZQotICB9Ci0gIHJldHVybiBwLk91dHB1dFBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIE91dHB1dFN0cmluZ0RhdGEocyBzdHJpbmcpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIF8sIGUgOj0gaW8uQ29weW4ocC53cml0ZXIsIHN0cmluZ3MuTmV3UmVhZGVyKHMpLCBpbnQ2NChsZW4ocykpKQotICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0QmVnaW4oKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0xCUkFDRSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBwLmR1bXBDb250ZXh0LlB1c2goaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0T2JqZWN0RW5kKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX1JCUkFDRSk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBwLmR1bXBDb250ZXh0LlBvcCgpCi0gIGlmIGUgOj0gcC5PdXRwdXRQb3N0VmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRMaXN0QmVnaW4oKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBlIDo9IHAuT3V0cHV0UHJlVmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgXywgZSA6PSBwLndyaXRlci5Xcml0ZShKU09OX0xCUkFDS0VUKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIHAuZHVtcENvbnRleHQuUHVzaChpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgT3V0cHV0TGlzdEVuZCgpIFRQcm90b2NvbEV4Y2VwdGlvbiB7Ci0gIGlmIF8sIGUgOj0gcC53cml0ZXIuV3JpdGUoSlNPTl9SQlJBQ0tFVCk7IGUgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgfQotICBwLmR1bXBDb250ZXh0LlBvcCgpCi0gIGlmIGUgOj0gcC5PdXRwdXRQb3N0VmFsdWUoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBPdXRwdXRFbGVtTGlzdEJlZ2luKGVsZW1UeXBlIFRUeXBlLCBzaXplIGludCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLk91dHB1dExpc3RCZWdpbigpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGUKLSAgfQotICBpZiBlIDo9IHAuV3JpdGVCeXRlKGJ5dGUoZWxlbVR5cGUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgaWYgZSA6PSBwLldyaXRlSTY0KGludDY0KHNpemUpKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBlCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZVByZVZhbHVlKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIGN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2suTGFzdCgpKQotICBpZiBwLnJlYWRlci5CdWZmZXJlZCgpIDwgMSB7Ci0gICAgcmV0dXJuIG5pbAotICB9Ci0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlaygxKQotICBzd2l0Y2ggY3h0IHsKLSAgY2FzZSBfQ09OVEVYVF9JTl9MSVNUOgotICAgIGlmIGxlbihiKSA+IDAgewotICAgICAgc3dpdGNoIGJbMF0gewotICAgICAgY2FzZSBKU09OX1JCUkFDS0VUWzBdOgotICAgICAgICByZXR1cm4gbmlsCi0gICAgICBjYXNlIEpTT05fQ09NTUFbMF06Ci0gICAgICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgICAgaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuaWwKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBcIl1cIiBvciBcIixcIiBpbiBsaXN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiIsIHN0cmluZyhiKSwgIlwiIikpCi0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZOgotICAgIGlmIGxlbihiKSA+IDAgewotICAgICAgc3dpdGNoIGJbMF0gewotICAgICAgY2FzZSBKU09OX1JCUkFDRVswXToKLSAgICAgICAgcmV0dXJuIG5pbAotICAgICAgY2FzZSBKU09OX0NPTU1BWzBdOgotICAgICAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgICAgIGlmIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCk7IGUgIT0gbmlsIHsKLSAgICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmlsCi0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0ZWQgXCJ9XCIgb3IgXCIsXCIgaW4gb2JqZWN0IGNvbnRleHQsIGJ1dCBmb3VuZCBcIiIsIHN0cmluZyhiKSwgIlwiIikpCi0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6Ci0gICAgaWYgbGVuKGIpID4gMCB7Ci0gICAgICBzd2l0Y2ggYlswXSB7Ci0gICAgICBjYXNlIEpTT05fQ09MT05bMF06Ci0gICAgICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgICAgaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuaWwKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJFeHBlY3RlZCBcIjpcIiBpbiBvYmplY3QgY29udGV4dCwgYnV0IGZvdW5kIFwiIiwgc3RyaW5nKGIpLCAiXCIiKSkKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWsKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlUG9zdFZhbHVlKCkgVFByb3RvY29sRXhjZXB0aW9uIHsKLSAgaWYgZSA6PSBwLnJlYWROb25TaWduaWZpY2FudFdoaXRlc3BhY2UoKTsgZSAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICB9Ci0gIGN4dCA6PSBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2suTGFzdCgpKQotICBzd2l0Y2ggY3h0IHsKLSAgY2FzZSBfQ09OVEVYVF9JTl9MSVNUX0ZJUlNUOgotICAgIHAucGFyc2VDb250ZXh0U3RhY2suUG9wKCkKLSAgICBwLnBhcnNlQ29udGV4dFN0YWNrLlB1c2goaW50KF9DT05URVhUX0lOX0xJU1QpKQotICAgIGJyZWFrCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX0ZJUlNULCBfQ09OVEVYVF9JTl9PQkpFQ1RfTkVYVF9LRVk6Ci0gICAgcC5wYXJzZUNvbnRleHRTdGFjay5Qb3AoKQotICAgIHAucGFyc2VDb250ZXh0U3RhY2suUHVzaChpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUUpKQotICAgIGJyZWFrCi0gIGNhc2UgX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfVkFMVUU6Ci0gICAgcC5wYXJzZUNvbnRleHRTdGFjay5Qb3AoKQotICAgIHAucGFyc2VDb250ZXh0U3RhY2suUHVzaChpbnQoX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZKSkKLSAgICBicmVhawotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZE5vblNpZ25pZmljYW50V2hpdGVzcGFjZSgpIG9zLkVycm9yIHsKLSAgZm9yIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPiAwIHsKLSAgICBiLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKLSAgICBpZiBsZW4oYikgPCAxIHsKLSAgICAgIHJldHVybiBuaWwKLSAgICB9Ci0gICAgc3dpdGNoIGJbMF0gewotICAgIGNhc2UgJyAnLCAnXHInLCAnXG4nLCAnXHQnOgotICAgICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgICAgY29udGludWUKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWsKLSAgICB9Ci0gICAgYnJlYWsKLSAgfQotICByZXR1cm4gbmlsCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlU3RyaW5nQm9keSgpIChzdHJpbmcsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1FVT1RFKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICBsIDo9IGxlbihsaW5lKQotICAvLyBjb3VudCBudW1iZXIgb2YgZXNjYXBlcyB0byBzZWUgaWYgd2UgbmVlZCB0byBrZWVwIGdvaW5nCi0gIGkgOj0gMQotICBmb3IgOyBpIDwgbDsgaSsrIHsKLSAgICBpZiBsaW5lW2wtaS0xXSAhPSAnXFwnIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICB9Ci0gIGlmIGkmMHgwMSA9PSAxIHsKLSAgICB2LCBvayA6PSBKc29uVW5xdW90ZShzdHJpbmcoSlNPTl9RVU9URSkgKyBsaW5lKQotICAgIGlmICFvayB7Ci0gICAgICByZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgICB9Ci0gICAgcmV0dXJuIHYsIG5pbAotICB9Ci0gIHMsIGVyciA6PSBwLlBhcnNlUXVvdGVkU3RyaW5nQm9keSgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIHN0ciA6PSBzdHJpbmcoSlNPTl9RVU9URSkgKyBsaW5lICsgcwotICB2LCBvayA6PSBKc29uVW5xdW90ZShzdHIpCi0gIGlmICFvayB7Ci0gICAgcmV0dXJuICIiLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiVW5hYmxlIHRvIHBhcnNlIGFzIEpTT04gc3RyaW5nICIrc3RyKQotICB9Ci0gIHJldHVybiB2LCBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VRdW90ZWRTdHJpbmdCb2R5KCkgKHN0cmluZywgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGxpbmUsIGVyciA6PSBwLnJlYWRlci5SZWFkU3RyaW5nKEpTT05fUVVPVEUpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiAiIiwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIGwgOj0gbGVuKGxpbmUpCi0gIC8vIGNvdW50IG51bWJlciBvZiBlc2NhcGVzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGtlZXAgZ29pbmcKLSAgaSA6PSAxCi0gIGZvciA7IGkgPCBsOyBpKysgewotICAgIGlmIGxpbmVbbC1pLTFdICE9ICdcXCcgewotICAgICAgYnJlYWsKLSAgICB9Ci0gIH0KLSAgaWYgaSYweDAxID09IDEgewotICAgIHJldHVybiBsaW5lLCBuaWwKLSAgfQotICBzLCBlcnIgOj0gcC5QYXJzZVF1b3RlZFN0cmluZ0JvZHkoKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gIiIsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLSAgfQotICB2IDo9IGxpbmUgKyBzCi0gIHJldHVybiB2LCBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VCYXNlNjRFbmNvZGVkQm9keSgpIChbXWJ5dGUsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZEJ5dGVzKEpTT05fUVVPVEUpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBsaW5lLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgbGluZTIgOj0gbGluZVswIDogbGVuKGxpbmUpLTFdCi0gIGwgOj0gbGVuKGxpbmUyKQotICBvdXRwdXQgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5EZWNvZGVkTGVuKGwpKQotICBuLCBlcnIgOj0gYmFzZTY0LlN0ZEVuY29kaW5nLkRlY29kZShvdXRwdXQsIGxpbmUyKQotICByZXR1cm4gb3V0cHV0WzA6bl0sIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGVycikKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VJNjQoKSAoaW50NjQsIGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiAwLCBmYWxzZSwgZXJyCi0gIH0KLSAgdmFyIHZhbHVlIGludDY0Ci0gIHZhciBpc251bGwgYm9vbAotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYikgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotICAgIHAucmVhZGVyLlJlYWQoYlswOmxlbihKU09OX05VTEwpXSkKLSAgICBpc251bGwgPSB0cnVlCi0gIH0gZWxzZSB7Ci0gICAgbnVtLCBlcnIgOj0gcC5yZWFkTnVtZXJpYygpCi0gICAgaXNudWxsID0gKG51bSA9PSBuaWwpCi0gICAgaWYgIWlzbnVsbCB7Ci0gICAgICB2YWx1ZSA9IG51bS5JbnQ2NCgpCi0gICAgfQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgcmV0dXJuIHZhbHVlLCBpc251bGwsIGVycgotICAgIH0KLSAgfQotICByZXR1cm4gdmFsdWUsIGlzbnVsbCwgcC5QYXJzZVBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlRjY0KCkgKGZsb2F0NjQsIGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiAwLCBmYWxzZSwgZXJyCi0gIH0KLSAgdmFyIHZhbHVlIGZsb2F0NjQKLSAgdmFyIGlzbnVsbCBib29sCi0gIGIsIF8gOj0gcC5yZWFkZXIuUGVlayhsZW4oSlNPTl9OVUxMKSkKLSAgaWYgbGVuKGIpID49IGxlbihKU09OX05VTEwpICYmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgIGlzbnVsbCA9IHRydWUKLSAgfSBlbHNlIHsKLSAgICBudW0sIGVyciA6PSBwLnJlYWROdW1lcmljKCkKLSAgICBpc251bGwgPSAobnVtID09IG5pbCkKLSAgICBpZiAhaXNudWxsIHsKLSAgICAgIHZhbHVlID0gbnVtLkZsb2F0NjQoKQotICAgIH0KLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiB2YWx1ZSwgaXNudWxsLCBlcnIKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlLCBpc251bGwsIHAuUGFyc2VQb3N0VmFsdWUoKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZU9iamVjdFN0YXJ0KCkgKGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBlcnIgOj0gcC5QYXJzZVByZVZhbHVlKCk7IGVyciAhPSBuaWwgewotICAgIHJldHVybiBmYWxzZSwgZXJyCi0gIH0KLSAgYiwgXyA6PSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQotICBpZiBsZW4oYikgPiAwICYmIGJbMF0gPT0gSlNPTl9MQlJBQ0VbMF0gewotICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICBwLnBhcnNlQ29udGV4dFN0YWNrLlB1c2goaW50KF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCkpCi0gICAgcmV0dXJuIGZhbHNlLCBuaWwKLSAgfSBlbHNlIGlmIGxlbihiKSA+PSBsZW4oSlNPTl9OVUxMKSAmJiBzdHJpbmcoYlswOmxlbihKU09OX05VTEwpXSkgPT0gc3RyaW5nKEpTT05fTlVMTCkgewotICAgIHJldHVybiB0cnVlLCBuaWwKLSAgfQotICByZXR1cm4gZmFsc2UsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGVkICd7JyBvciBudWxsLCBidXQgZm91bmQgJyIsIHN0cmluZyhiKSwgIiciKSkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgUGFyc2VPYmplY3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBjeHQgOj0gX1BhcnNlQ29udGV4dChwLnBhcnNlQ29udGV4dFN0YWNrLkxhc3QoKSkKLSAgaWYgY3h0ICE9IF9DT05URVhUX0lOX09CSkVDVF9GSVJTVCAmJiBjeHQgIT0gX0NPTlRFWFRfSU5fT0JKRUNUX05FWFRfS0VZIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0ZWQgdG8gYmUgaW4gdGhlIE9iamVjdCBDb250ZXh0LCBidXQgbm90IGluIE9iamVjdCBDb250ZXh0IikpCi0gIH0KLSAgbGluZSwgZXJyIDo9IHAucmVhZGVyLlJlYWRTdHJpbmcoSlNPTl9SQlJBQ0VbMF0pCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi0gIH0KLSAgZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7Ci0gICAgc3dpdGNoIGNoYXIgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludCgiRXhwZWN0aW5nIGVuZCBvZiBvYmplY3QgXCJ9XCIsIGJ1dCBmb3VuZDogXCIiLCBsaW5lLCAiXCIiKSkKLSAgICBjYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JywgJ30nOgotICAgICAgYnJlYWsKLSAgICB9Ci0gIH0KLSAgcC5wYXJzZUNvbnRleHRTdGFjay5Qb3AoKQotICByZXR1cm4gcC5QYXJzZVBvc3RWYWx1ZSgpCi19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIFBhcnNlTGlzdEJlZ2luKCkgKGJvb2wsIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBlIDo9IHAuUGFyc2VQcmVWYWx1ZSgpOyBlICE9IG5pbCB7Ci0gICAgcmV0dXJuIGZhbHNlLCBlCi0gIH0KLSAgYiwgZSA6PSBwLnJlYWRlci5QZWVrKGxlbihKU09OX05VTEwpKQotICBpZiBlID09IG5pbCAmJiBsZW4oYikgPj0gMSAmJiBiWzBdID09IEpTT05fTEJSQUNLRVRbMF0gewotICAgIHAucGFyc2VDb250ZXh0U3RhY2suUHVzaChpbnQoX0NPTlRFWFRfSU5fTElTVF9GSVJTVCkpCi0gICAgcC5yZWFkZXIuUmVhZEJ5dGUoKQotICAgIHJldHVybiBmYWxzZSwgbmlsCi0gIH0gZWxzZSBpZiBlID09IG5pbCAmJiBsZW4oYikgPj0gbGVuKEpTT05fTlVMTCkgJiYgc3RyaW5nKGIpID09IHN0cmluZyhKU09OX05VTEwpIHsKLSAgICByZXR1cm4gdHJ1ZSwgbmlsCi0gIH0KLSAgcmV0dXJuIGZhbHNlLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50ZigiRXhwZWN0ZWQgJ251bGwnIG9yICd7JywgcmVjZWl2ZWQgJyVxJyIsIGIpKQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUVsZW1MaXN0QmVnaW4oKSAoZWxlbVR5cGUgVFR5cGUsIHNpemUgaW50LCBlIFRQcm90b2NvbEV4Y2VwdGlvbikgewotICBpZiBpc051bGwsIGUgOj0gcC5QYXJzZUxpc3RCZWdpbigpOyBpc051bGwgfHwgZSAhPSBuaWwgewotICAgIHJldHVybiBWT0lELCAwLCBlCi0gIH0KLSAgYkVsZW1UeXBlLCBlcnIgOj0gcC5SZWFkQnl0ZSgpCi0gIGVsZW1UeXBlID0gVFR5cGUoYkVsZW1UeXBlKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gZWxlbVR5cGUsIHNpemUsIGVycgotICB9Ci0gIG5TaXplLCBlcnIyIDo9IHAuUmVhZEk2NCgpCi0gIHNpemUgPSBpbnQoblNpemUpCi0gIHJldHVybiBlbGVtVHlwZSwgc2l6ZSwgZXJyMgotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBQYXJzZUxpc3RFbmQoKSBUUHJvdG9jb2xFeGNlcHRpb24gewotICBpZiBpc051bGwsIGVyciA6PSBwLnJlYWRJZk51bGwoKTsgaXNOdWxsIHx8IGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBpZiBfUGFyc2VDb250ZXh0KHAucGFyc2VDb250ZXh0U3RhY2suTGFzdCgpKSAhPSBfQ09OVEVYVF9JTl9MSVNUIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkIHRvIGJlIGluIHRoZSBMaXN0IENvbnRleHQsIGJ1dCBub3QgaW4gTGlzdCBDb250ZXh0IikKLSAgfQotICBsaW5lLCBlcnIgOj0gcC5yZWFkZXIuUmVhZFN0cmluZyhKU09OX1JCUkFDS0VUWzBdKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICB9Ci0gIGZvciBfLCBjaGFyIDo9IHJhbmdlIGxpbmUgewotICAgIHN3aXRjaCBjaGFyIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIkV4cGVjdGluZyBlbmQgb2YgbGlzdCBcIl1cIiwgYnV0IGZvdW5kOiBcIiIsIGxpbmUsICJcIiIpKQotICAgIGNhc2UgJyAnLCAnXG4nLCAnXHInLCAnXHQnLCBpbnQoSlNPTl9SQlJBQ0tFVFswXSk6Ci0gICAgICBicmVhawotICAgIH0KLSAgfQotICBwLnBhcnNlQ29udGV4dFN0YWNrLlBvcCgpCi0gIHJldHVybiBwLlBhcnNlUG9zdFZhbHVlKCkKLX0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZFNpbmdsZVZhbHVlKCkgKGludGVyZmFjZXt9LCBUVHlwZSwgVFByb3RvY29sRXhjZXB0aW9uKSB7Ci0gIGUgOj0gcC5yZWFkTm9uU2lnbmlmaWNhbnRXaGl0ZXNwYWNlKCkKLSAgaWYgZSAhPSBuaWwgewotICAgIHJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gIH0KLSAgYiwgZSA6PSBwLnJlYWRlci5QZWVrKDEwKQotICBpZiBsZW4oYikgPiAwIHsKLSAgICBjIDo9IGJbMF0KLSAgICBzd2l0Y2ggYyB7Ci0gICAgY2FzZSBKU09OX05VTExbMF06Ci0gICAgICBidWYgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05VTEwpKQotICAgICAgXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKLSAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIG5pbCwgVk9JRCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgIH0KLSAgICAgIGlmIHN0cmluZyhKU09OX05VTEwpICE9IHN0cmluZyhidWYpIHsKLSAgICAgICAgZSA6PSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgJyIrc3RyaW5nKEpTT05fTlVMTCkrIicgYnV0IGZvdW5kICciK3N0cmluZyhidWYpKyInIHdoaWxlIHBhcnNpbmcgSlNPTi4iKQotICAgICAgICByZXR1cm4gbmlsLCBWT0lELCBlCi0gICAgICB9Ci0gICAgICByZXR1cm4gbmlsLCBWT0lELCBuaWwKLSAgICBjYXNlIEpTT05fUVVPVEU6Ci0gICAgICBwLnJlYWRlci5SZWFkQnl0ZSgpCi0gICAgICB2LCBlIDo9IHAuUGFyc2VTdHJpbmdCb2R5KCkKLSAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIHYsIFVURjgsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICB9Ci0gICAgICBpZiB2ID09IEpTT05fSU5GSU5JVFkgewotICAgICAgICByZXR1cm4gSU5GSU5JVFksIERPVUJMRSwgbmlsCi0gICAgICB9IGVsc2UgaWYgdiA9PSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKLSAgICAgICAgcmV0dXJuIE5FR0FUSVZFX0lORklOSVRZLCBET1VCTEUsIG5pbAotICAgICAgfSBlbHNlIGlmIHYgPT0gSlNPTl9OQU4gewotICAgICAgICByZXR1cm4gTkFOLCBET1VCTEUsIG5pbAotICAgICAgfQotICAgICAgcmV0dXJuIHYsIFVURjgsIG5pbAotICAgIGNhc2UgSlNPTl9UUlVFWzBdOgotICAgICAgYnVmIDo9IG1ha2UoW11ieXRlLCBsZW4oSlNPTl9UUlVFKSkKLSAgICAgIF8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWYpCi0gICAgICBpZiBlICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiB0cnVlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgfQotICAgICAgaWYgc3RyaW5nKEpTT05fVFJVRSkgIT0gc3RyaW5nKGJ1ZikgewotICAgICAgICBlIDo9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCAnIitzdHJpbmcoSlNPTl9UUlVFKSsiJyBidXQgZm91bmQgJyIrc3RyaW5nKGJ1ZikrIicgd2hpbGUgcGFyc2luZyBKU09OLiIpCi0gICAgICAgIHJldHVybiB0cnVlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWUsIEJPT0wsIG5pbAotICAgIGNhc2UgSlNPTl9GQUxTRVswXToKLSAgICAgIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fRkFMU0UpKQotICAgICAgXywgZSA6PSBwLnJlYWRlci5SZWFkKGJ1ZikKLSAgICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgfQotICAgICAgaWYgc3RyaW5nKEpTT05fRkFMU0UpICE9IHN0cmluZyhidWYpIHsKLSAgICAgICAgZSA6PSBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgJyIrc3RyaW5nKEpTT05fRkFMU0UpKyInIGJ1dCBmb3VuZCAnIitzdHJpbmcoYnVmKSsiJyB3aGlsZSBwYXJzaW5nIEpTT04uIikKLSAgICAgICAgcmV0dXJuIGZhbHNlLCBCT09MLCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlLCBCT09MLCBuaWwKLSAgICBjYXNlIEpTT05fTEJSQUNLRVRbMF06Ci0gICAgICBfLCBlIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgIHJldHVybiBtYWtlKFtdaW50ZXJmYWNle30sIDApLCBMSVNULCBOZXdUUHJvdG9jb2xFeGNlcHRpb25Gcm9tT3NFcnJvcihlKQotICAgIGNhc2UgSlNPTl9MQlJBQ0VbMF06Ci0gICAgICBfLCBlIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgIHJldHVybiBtYWtlKG1hcFtzdHJpbmddaW50ZXJmYWNle30pLCBTVFJVQ1QsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgY2FzZSAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICdlJywgJ0UnLCAnLicsICcrJywgJy0nLCBKU09OX0lORklOSVRZWzBdLCBKU09OX05BTlswXToKLSAgICAgIC8vIGFzc3VtZSBudW1lcmljCi0gICAgICB2LCBlIDo9IHAucmVhZE51bWVyaWMoKQotICAgICAgcmV0dXJuIHYsIERPVUJMRSwgZQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gbmlsLCBWT0lELCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgZWxlbWVudCBpbiBsaXN0IGJ1dCBmb3VuZCAnIitzdHJpbmcoYykrIicgd2hpbGUgcGFyc2luZyBKU09OLiIpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwsIFZPSUQsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJDYW5ub3QgcmVhZCBhIHNpbmdsZSBlbGVtZW50IHdoaWxlIHBhcnNpbmcgSlNPTi4iKQotCi19Ci0KLQotZnVuYyAocCAqVFNpbXBsZUpTT05Qcm90b2NvbCkgcmVhZElmTnVsbCgpIChib29sLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgY29udCA6PSB0cnVlCi0gIGZvciBwLnJlYWRlci5CdWZmZXJlZCgpID4gMCAmJiBjb250IHsKLSAgICBiLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKLSAgICBpZiBsZW4oYikgPCAxIHsKLSAgICAgIHJldHVybiBmYWxzZSwgbmlsCi0gICAgfQotICAgIHN3aXRjaCBiWzBdIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlLCBuaWwKLSAgICBjYXNlIEpTT05fTlVMTFswXToKLSAgICAgIGNvbnQgPSBmYWxzZQotICAgICAgYnJlYWsKLSAgICBjYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JzoKLSAgICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICAgIGJyZWFrCi0gICAgfQotICB9Ci0gIGlmIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPT0gMCB7Ci0gICAgcmV0dXJuIGZhbHNlLCBuaWwKLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsobGVuKEpTT05fTlVMTCkpCi0gIGlmIHN0cmluZyhiKSA9PSBzdHJpbmcoSlNPTl9OVUxMKSB7Ci0gICAgcC5yZWFkZXIuUmVhZChiWzA6bGVuKEpTT05fTlVMTCldKQotICAgIHJldHVybiB0cnVlLCBuaWwKLSAgfQotICByZXR1cm4gZmFsc2UsIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkUXVvdGVJZk5leHQoKSB7Ci0gIGlmIHAucmVhZGVyLkJ1ZmZlcmVkKCkgPCAxIHsKLSAgICByZXR1cm4KLSAgfQotICBiLCBfIDo9IHAucmVhZGVyLlBlZWsoMSkKLSAgaWYgbGVuKGIpID4gMCAmJiBiWzBdID09IEpTT05fUVVPVEUgewotICAgIHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgfQotfQotCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSByZWFkTnVtZXJpYygpIChOdW1lcmljLCBUUHJvdG9jb2xFeGNlcHRpb24pIHsKLSAgaXNOdWxsLCBlcnIgOj0gcC5yZWFkSWZOdWxsKCkKLSAgaWYgaXNOdWxsIHx8IGVyciAhPSBuaWwgewotICAgIHJldHVybiBOVU1FUklDX05VTEwsIGVycgotICB9Ci0gIGhhc0RlY2ltYWxQb2ludCA6PSBmYWxzZQotICBuZXh0Q2FuQmVTaWduIDo9IHRydWUKLSAgaGFzRSA6PSBmYWxzZQotICBNQVhfTEVOIDo9IDQwCi0gIGJ1ZiA6PSBieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIE1BWF9MRU4pKQotICBjb250aW51ZUZvciA6PSB0cnVlCi0gIGluUXVvdGVzIDo9IGZhbHNlCi0gIGZvciBjb250aW51ZUZvciB7Ci0gICAgYywgZXJyIDo9IHAucmVhZGVyLlJlYWRCeXRlKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIGlmIGVyciA9PSBvcy5FT0YgewotICAgICAgICBicmVhawotICAgICAgfQotICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZXJyKQotICAgIH0KLSAgICBzd2l0Y2ggYyB7Ci0gICAgY2FzZSAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOSc6Ci0gICAgICBidWYuV3JpdGVCeXRlKGMpCi0gICAgICBuZXh0Q2FuQmVTaWduID0gZmFsc2UKLSAgICBjYXNlICcuJzoKLSAgICAgIGlmIGhhc0RlY2ltYWxQb2ludCB7Ci0gICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHdpdGggbXVsdGlwbGUgZGVjaW1hbCBwb2ludHMgJyVzLiciLCBidWYuU3RyaW5nKCkpKQotICAgICAgfQotICAgICAgaWYgaGFzRSB7Ci0gICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHdpdGggZGVjaW1hbCBwb2ludHMgaW4gdGhlIGV4cG9uZW50ICclcy4nIiwgYnVmLlN0cmluZygpKSkKLSAgICAgIH0KLSAgICAgIGJ1Zi5Xcml0ZUJ5dGUoYykKLSAgICAgIGhhc0RlY2ltYWxQb2ludCwgbmV4dENhbkJlU2lnbiA9IHRydWUsIGZhbHNlCi0gICAgY2FzZSAnZScsICdFJzoKLSAgICAgIGlmIGhhc0UgewotICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50ZigiVW5hYmxlIHRvIHBhcnNlIG51bWJlciB3aXRoIG11bHRpcGxlIGV4cG9uZW50cyAnJXMlYyciLCBidWYuU3RyaW5nKCksIGMpKQotICAgICAgfQotICAgICAgYnVmLldyaXRlQnl0ZShjKQotICAgICAgaGFzRSwgbmV4dENhbkJlU2lnbiA9IHRydWUsIHRydWUKLSAgICBjYXNlICctJywgJysnOgotICAgICAgaWYgIW5leHRDYW5CZVNpZ24gewotICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBOZXdUUHJvdG9jb2xFeGNlcHRpb24oSU5WQUxJRF9EQVRBLCBmbXQuU3ByaW50KCJOZWdhdGl2ZSBzaWduIHdpdGhpbiBudW1iZXIiKSkKLSAgICAgIH0KLSAgICAgIGJ1Zi5Xcml0ZUJ5dGUoYykKLSAgICAgIG5leHRDYW5CZVNpZ24gPSBmYWxzZQotICAgIGNhc2UgJyAnLCAwLCAnXHQnLCAnXG4nLCAnXHInLCBKU09OX1JCUkFDRVswXSwgSlNPTl9SQlJBQ0tFVFswXSwgSlNPTl9DT01NQVswXSwgSlNPTl9DT0xPTlswXToKLSAgICAgIHAucmVhZGVyLlVucmVhZEJ5dGUoKQotICAgICAgY29udGludWVGb3IgPSBmYWxzZQotICAgIGNhc2UgSlNPTl9OQU5bMF06Ci0gICAgICBpZiBidWYuTGVuKCkgPT0gMCB7Ci0gICAgICAgIGJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fTkFOKSkKLSAgICAgICAgYnVmZmVyWzBdID0gYwotICAgICAgICBfLCBlIDo9IHAucmVhZGVyLlJlYWQoYnVmZmVyWzE6XSkKLSAgICAgICAgaWYgZSAhPSBuaWwgewotICAgICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbkZyb21Pc0Vycm9yKGUpCi0gICAgICAgIH0KLSAgICAgICAgaWYgSlNPTl9OQU4gIT0gc3RyaW5nKGJ1ZmZlcikgewotICAgICAgICAgIGUgOj0gTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgIkV4cGVjdGVkICciK0pTT05fTkFOKyInIGJ1dCBmb3VuZCAnIitzdHJpbmcoYnVmZmVyKSsiJyB3aGlsZSBwYXJzaW5nIEpTT04uIikKLSAgICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBlCi0gICAgICAgIH0KLSAgICAgICAgaWYgaW5RdW90ZXMgewotICAgICAgICAgIHAucmVhZFF1b3RlSWZOZXh0KCkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTkFOLCBuaWwKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYyciLCBjKSkKLSAgICAgIH0KLSAgICBjYXNlIEpTT05fSU5GSU5JVFlbMF06Ci0gICAgICBpZiBidWYuTGVuKCkgPT0gMCB8fCAoYnVmLkxlbigpID09IDEgJiYgYnVmLkJ5dGVzKClbMF0gPT0gJysnKSB7Ci0gICAgICAgIGJ1ZmZlciA6PSBtYWtlKFtdYnl0ZSwgbGVuKEpTT05fSU5GSU5JVFkpKQotICAgICAgICBidWZmZXJbMF0gPSBjCi0gICAgICAgIF8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWZmZXJbMTpdKQotICAgICAgICBpZiBlICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgICAgfQotICAgICAgICBpZiBKU09OX0lORklOSVRZICE9IHN0cmluZyhidWZmZXIpIHsKLSAgICAgICAgICBlIDo9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCAnIitKU09OX0lORklOSVRZKyInIGJ1dCBmb3VuZCAnIitzdHJpbmcoYnVmZmVyKSsiJyB3aGlsZSBwYXJzaW5nIEpTT04uIikKLSAgICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBlCi0gICAgICAgIH0KLSAgICAgICAgaWYgaW5RdW90ZXMgewotICAgICAgICAgIHAucmVhZFF1b3RlSWZOZXh0KCkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSU5GSU5JVFksIG5pbAotICAgICAgfSBlbHNlIGlmIGJ1Zi5MZW4oKSA9PSAxICYmIGJ1Zi5CeXRlcygpWzBdID09IEpTT05fTkVHQVRJVkVfSU5GSU5JVFlbMF0gewotICAgICAgICBidWZmZXIgOj0gbWFrZShbXWJ5dGUsIGxlbihKU09OX05FR0FUSVZFX0lORklOSVRZKSkKLSAgICAgICAgYnVmZmVyWzBdID0gSlNPTl9ORUdBVElWRV9JTkZJTklUWVswXQotICAgICAgICBidWZmZXJbMV0gPSBjCi0gICAgICAgIF8sIGUgOj0gcC5yZWFkZXIuUmVhZChidWZmZXJbMjpdKQotICAgICAgICBpZiBlICE9IG5pbCB7Ci0gICAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uRnJvbU9zRXJyb3IoZSkKLSAgICAgICAgfQotICAgICAgICBpZiBKU09OX05FR0FUSVZFX0lORklOSVRZICE9IHN0cmluZyhidWZmZXIpIHsKLSAgICAgICAgICBlIDo9IE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsICJFeHBlY3RlZCAnIitKU09OX05FR0FUSVZFX0lORklOSVRZKyInIGJ1dCBmb3VuZCAnIitzdHJpbmcoYnVmZmVyKSsiJyB3aGlsZSBwYXJzaW5nIEpTT04uIikKLSAgICAgICAgICByZXR1cm4gTlVNRVJJQ19OVUxMLCBlCi0gICAgICAgIH0KLSAgICAgICAgaWYgaW5RdW90ZXMgewotICAgICAgICAgIHAucmVhZFF1b3RlSWZOZXh0KCkKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTkVHQVRJVkVfSU5GSU5JVFksIG5pbAotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTUVSSUNfTlVMTCwgTmV3VFByb3RvY29sRXhjZXB0aW9uKElOVkFMSURfREFUQSwgZm10LlNwcmludGYoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgc3RhcnRpbmcgd2l0aCBjaGFyYWN0ZXIgJyVjJyBkdWUgdG8gZXhpc3RpbmcgYnVmZmVyICVzIiwgYywgYnVmLlN0cmluZygpKSkKLSAgICAgIH0KLSAgICBjYXNlIEpTT05fUVVPVEU6Ci0gICAgICBpZiAhaW5RdW90ZXMgewotICAgICAgICBpblF1b3RlcyA9IHRydWUKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrCi0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnRmKCJVbmFibGUgdG8gcGFyc2UgbnVtYmVyIHN0YXJ0aW5nIHdpdGggY2hhcmFjdGVyICclYyciLCBjKSkKLSAgICB9Ci0gIH0KLSAgaWYgYnVmLkxlbigpID09IDAgewotICAgIHJldHVybiBOVU1FUklDX05VTEwsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihJTlZBTElEX0RBVEEsIGZtdC5TcHJpbnQoIlVuYWJsZSB0byBwYXJzZSBudW1iZXIgZnJvbSBlbXB0eSBzdHJpbmcgJyciKSkKLSAgfQotICByZXR1cm4gTmV3TnVtZXJpY0Zyb21KU09OU3RyaW5nKGJ1Zi5TdHJpbmcoKSwgZmFsc2UpLCBuaWwKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHNpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmY1ZjQ4Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHNpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdF90ZXN0Ci0KLWltcG9ydCAoCi0gIC4gInRocmlmdCIKLSAgImVuY29kaW5nL2Jhc2U2NCIKLSAgImZtdCIKLSAgImpzb24iCi0gICJtYXRoIgotICAic3RyY29udiIKLSAgInN0cmluZ3MiCi0gICJ0ZXN0aW5nIgotKQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJvb2xlYW4iCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlQm9vbCh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGZhbHNlCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJvb2wodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJvb2xlYW4iCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCT09MX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICAgIGlmIHZhbHVlIHsKLSAgICAgIHRyYW5zLldyaXRlKEpTT05fVFJVRSkKLSAgICB9IGVsc2UgewotICAgICAgdHJhbnMuV3JpdGUoSlNPTl9GQUxTRSkKLSAgICB9Ci0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEJvb2woKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksICZ2KTsgZXJyICE9IG5pbCB8fCB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgICB0cmFucy5DbG9zZSgpCi0gIH0KLX0KLQotZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xCeXRlKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJieXRlIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgQllURV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgcyAhPSBmbXQuU3ByaW50KHZhbHVlKSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICB9Ci0gICAgdiA6PSBieXRlKDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEJ5dGUodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJ5dGUiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBCWVRFX1ZBTFVFUyB7Ci0gICAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gICAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICAgIHRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkQnl0ZSgpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MTYiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUkxNih2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGludDE2KDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkxNih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MTYiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEkxNigpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MzIiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUkzMih2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGludDMyKDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEkzMih0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50MzIiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEkzMigpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50NjQiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICBpZiBzICE9IGZtdC5TcHJpbnQodmFsdWUpIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2OiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBzKQotICAgIH0KLSAgICB2IDo9IGludDY0KDApCi0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0UmVhZFNpbXBsZUpTT05Qcm90b2NvbEk2NCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiaW50NjQiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewotICAgIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICAgIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2E2NCh2YWx1ZSkpCi0gICAgdHJhbnMuRmx1c2goKQotICAgIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgICB2LCBlIDo9IHAuUmVhZEk2NCgpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byByZWFkICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICAgIHRyYW5zLkNsb3NlKCkKLSAgfQotfQotCi1mdW5jIFRlc3RXcml0ZVNpbXBsZUpTT05Qcm90b2NvbERvdWJsZSh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAiZG91YmxlIgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICBmb3IgXywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgLTEpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgaWYgcyAhPSBKc29uUXVvdGUoSlNPTl9OQU4pIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTikpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIHMgIT0gZm10LlNwcmludCh2YWx1ZSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICAgIH0KLSAgICAgIHYgOj0gZmxvYXQ2NCgwKQotICAgICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sRG91YmxlKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJkb3VibGUiCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgbiA6PSBOZXdOdW1lcmljRnJvbURvdWJsZSh2YWx1ZSkKLSAgICB0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQotICAgIHRyYW5zLkZsdXNoKCkKLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgdiwgZSA6PSBwLlJlYWREb3VibGUoKQotICAgIGlmIGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gcmVhZCAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuU3RyaW5nKCkpCi0gICAgfQotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmICFtYXRoLklzSW5mKHYsIDEpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfSBlbHNlIGlmIG1hdGguSXNJbmYodmFsdWUsIC0xKSB7Ci0gICAgICBpZiAhbWF0aC5Jc0luZih2LCAtMSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgaWYgIW1hdGguSXNOYU4odikgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICV2LCByZWNlaXZlZDogJXYiLCB0aGV0eXBlLCB2YWx1ZSwgcywgdikKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgICAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgJnYpOyBlcnIgIT0gbmlsIHx8IHYgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgICAgfQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJzdHJpbmciCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVTdHJpbmcodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBzIDo9IHRyYW5zLlN0cmluZygpCi0gICAgaWYgc1swXSAhPSAnIicgfHwgc1tsZW4ocyktMV0gIT0gJyInIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICcldicsIHdyb3RlICcldicsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCBmbXQuU3ByaW50KCJcIiIsIHZhbHVlLCAiXCIiKSkKLSAgICB9Ci0gICAgdiA6PSBuZXcoc3RyaW5nKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYpOyBlcnIgIT0gbmlsIHx8ICp2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2KQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gIH0KLSAgdHJhbnMuQ2xvc2UoKQotfQotCi1mdW5jIFRlc3RSZWFkU2ltcGxlSlNPTlByb3RvY29sU3RyaW5nKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJzdHJpbmciCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBTVFJJTkdfVkFMVUVTIHsKLSAgICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gICAgdHJhbnMuV3JpdGVTdHJpbmcoSnNvblF1b3RlKHZhbHVlKSkKLSAgICB0cmFucy5GbHVzaCgpCi0gICAgcyA6PSB0cmFucy5TdHJpbmcoKQotICAgIHYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKLSAgICBpZiBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgICBpZiB2ICE9IHZhbHVlIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIHZhbHVlICV2LCB3cm90ZTogJXYsIHJlY2VpdmVkOiAldiIsIHRoZXR5cGUsIHZhbHVlLCBzLCB2KQotICAgIH0KLSAgICB2MSA6PSBuZXcoc3RyaW5nKQotICAgIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gdmFsdWUgewotICAgICAgdC5GYXRhbGYoIkJhZCBqc29uLWRlY29kZWQgdmFsdWUgZm9yICVzICV2LCB3cm90ZTogJyVzJywgZXhwZWN0ZWQ6ICcldiciLCB0aGV0eXBlLCB2YWx1ZSwgcywgKnYxKQotICAgIH0KLSAgICB0cmFucy5SZXNldCgpCi0gICAgdHJhbnMuQ2xvc2UoKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sQmluYXJ5KHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJiaW5hcnkiCi0gIHZhbHVlIDo9IHByb3RvY29sX2JkYXRhCi0gIGI2NHZhbHVlIDo9IG1ha2UoW11ieXRlLCBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlZExlbihsZW4ocHJvdG9jb2xfYmRhdGEpKSkKLSAgYmFzZTY0LlN0ZEVuY29kaW5nLkVuY29kZShiNjR2YWx1ZSwgdmFsdWUpCi0gIGI2NFN0cmluZyA6PSBzdHJpbmcoYjY0dmFsdWUpCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIGlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgfQotICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICB9Ci0gIHMgOj0gdHJhbnMuU3RyaW5nKCkKLSAgaWYgcyAhPSBmbXQuU3ByaW50KCJcIiIsIGI2NFN0cmluZywgIlwiIikgewotICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzICV2XG4gIHdyb3RlOiAldlxuZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgdmFsdWUsIHMsICJcIiIrYjY0U3RyaW5nKyJcIiIpCi0gIH0KLSAgdjEgOj0gbmV3KHN0cmluZykKLSAgaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKFtdYnl0ZShzKSwgdjEpOyBlcnIgIT0gbmlsIHx8ICp2MSAhPSBiNjRTdHJpbmcgewotICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsICp2MSkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFJlYWRTaW1wbGVKU09OUHJvdG9jb2xCaW5hcnkodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gImJpbmFyeSIKLSAgdmFsdWUgOj0gcHJvdG9jb2xfYmRhdGEKLSAgYjY0dmFsdWUgOj0gbWFrZShbXWJ5dGUsIGJhc2U2NC5TdGRFbmNvZGluZy5FbmNvZGVkTGVuKGxlbihwcm90b2NvbF9iZGF0YSkpKQotICBiYXNlNjQuU3RkRW5jb2RpbmcuRW5jb2RlKGI2NHZhbHVlLCB2YWx1ZSkKLSAgYjY0U3RyaW5nIDo9IHN0cmluZyhiNjR2YWx1ZSkKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgdHJhbnMuV3JpdGVTdHJpbmcoSnNvblF1b3RlKGI2NFN0cmluZykpCi0gIHRyYW5zLkZsdXNoKCkKLSAgcyA6PSB0cmFucy5TdHJpbmcoKQotICB2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICB9Ci0gIGlmIGxlbih2KSAhPSBsZW4odmFsdWUpIHsKLSAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyB2YWx1ZSBsZW5ndGggJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQgbGVuZ3RoOiAldiIsIHRoZXR5cGUsIGxlbih2YWx1ZSksIHMsIGxlbih2KSkKLSAgfQotICBmb3IgaSA6PSAwOyBpIDwgbGVuKHYpOyBpKysgewotICAgIGlmIHZbaV0gIT0gdmFsdWVbaV0gewotICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJWQgdmFsdWUgJXYsIHdyb3RlOiAldiwgcmVjZWl2ZWQ6ICV2IiwgdGhldHlwZSwgaSwgdmFsdWVbaV0sIHMsIHZbaV0pCi0gICAgfQotICB9Ci0gIHYxIDo9IG5ldyhzdHJpbmcpCi0gIGlmIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUocyksIHYxKTsgZXJyICE9IG5pbCB8fCAqdjEgIT0gYjY0U3RyaW5nIHsKLSAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnLCBleHBlY3RlZDogJyV2JyIsIHRoZXR5cGUsIHZhbHVlLCBzLCAqdjEpCi0gIH0KLSAgdHJhbnMuUmVzZXQoKQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTGlzdCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAibGlzdCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgcC5Xcml0ZUxpc3RCZWdpbihUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCi0gIGZvciBfLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVEb3VibGUodmFsdWUpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gIH0KLSAgcC5Xcml0ZUxpc3RFbmQoKQotICBpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgc3RyIDo9IHRyYW5zLlN0cmluZygpCi0gIHN0cjEgOj0gbmV3KFtdaW50ZXJmYWNle30pCi0gIGVyciA6PSBqc29uLlVubWFyc2hhbChbXWJ5dGUoc3RyKSwgc3RyMSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byBkZWNvZGUgJXMsIHdyb3RlOiAlcyIsIHRoZXR5cGUsIHN0cikKLSAgfQotICBsIDo9ICpzdHIxCi0gIGlmIGxlbihsKSA8IDIgewotICAgIHQuRmF0YWxmKCJMaXN0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKLSAgfQotICBpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7Ci0gICAgdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBsaXN0LCBleHBlY3RlZDogIiwgRE9VQkxFLCAiLCBidXQgd2FzOiAiLCBsWzBdKQotICB9Ci0gIGlmIGludChsWzFdLihmbG9hdDY0KSkgIT0gbGVuKERPVUJMRV9WQUxVRVMpIHsKLSAgICB0LkZhdGFsKCJJbnZhbGlkIGxlbmd0aCBmb3IgbGlzdCwgZXhwZWN0ZWQ6ICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhczogIiwgbFsxXSkKLSAgfQotICBmb3IgaywgdmFsdWUgOj0gcmFuZ2UgRE9VQkxFX1ZBTFVFUyB7Ci0gICAgcyA6PSBsW2srMl0KLSAgICBpZiBtYXRoLklzSW5mKHZhbHVlLCAxKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzSW5mKHZhbHVlLCAwKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkVHQVRJVkVfSU5GSU5JVFkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05FR0FUSVZFX0lORklOSVRZKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzLihzdHJpbmcpICE9IEpTT05fTkFOIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgICV2LCB3cm90ZTogJXEsIGV4cGVjdGVkOiAlcSwgb3JpZ2luYWxseSB3cm90ZTogJXEiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkFOKSwgc3RyKQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiBzLihmbG9hdDY0KSAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcyciLCB0aGV0eXBlLCB2YWx1ZSwgcykKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJhbnMuUmVzZXQoKQotICB9Ci0gIHRyYW5zLkNsb3NlKCkKLX0KLQotZnVuYyBUZXN0V3JpdGVTaW1wbGVKU09OUHJvdG9jb2xTZXQodCAqdGVzdGluZy5UKSB7Ci0gIHRoZXR5cGUgOj0gInNldCIKLSAgdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCi0gIHAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKLSAgcC5Xcml0ZVNldEJlZ2luKFRUeXBlKERPVUJMRSksIGxlbihET1VCTEVfVkFMVUVTKSkKLSAgZm9yIF8sIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIGlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLlN0cmluZygpKQotICAgIH0KLSAgfQotICBwLldyaXRlU2V0RW5kKCkKLSAgaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCBlLlN0cmluZygpKQotICB9Ci0gIHN0ciA6PSB0cmFucy5TdHJpbmcoKQotICBzdHIxIDo9IG5ldyhbXWludGVyZmFjZXt9KQotICBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHN0ciksIHN0cjEpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJVbmFibGUgdG8gZGVjb2RlICVzLCB3cm90ZTogJXMiLCB0aGV0eXBlLCBzdHIpCi0gIH0KLSAgbCA6PSAqc3RyMQotICBpZiBsZW4obCkgPCAyIHsKLSAgICB0LkZhdGFsZigiU2V0IG11c3QgYmUgYXQgbGVhc3Qgb2YgbGVuZ3RoIHR3byB0byBpbmNsdWRlIG1ldGFkYXRhIikKLSAgfQotICBpZiBpbnQobFswXS4oZmxvYXQ2NCkpICE9IERPVUJMRSB7Ci0gICAgdC5GYXRhbCgiSW52YWxpZCB0eXBlIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBET1VCTEUsICIsIGJ1dCB3YXM6ICIsIGxbMF0pCi0gIH0KLSAgaWYgaW50KGxbMV0uKGZsb2F0NjQpKSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkludmFsaWQgbGVuZ3RoIGZvciBzZXQsIGV4cGVjdGVkOiAiLCBsZW4oRE9VQkxFX1ZBTFVFUyksICIsIGJ1dCB3YXM6ICIsIGxbMV0pCi0gIH0KLSAgZm9yIGssIHZhbHVlIDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewotICAgIHMgOj0gbFtrKzJdCi0gICAgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMSkgewotICAgICAgaWYgcy4oc3RyaW5nKSAhPSBKU09OX0lORklOSVRZIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9JTkZJTklUWSksIHN0cikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgewotICAgICAgaWYgcy4oc3RyaW5nKSAhPSBKU09OX05FR0FUSVZFX0lORklOSVRZIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAlcSwgZXhwZWN0ZWQ6ICVxLCBvcmlnaW5hbGx5IHdyb3RlOiAlcSIsIHRoZXR5cGUsIGssIHZhbHVlLCBzLCBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSksIHN0cikKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc05hTih2YWx1ZSkgewotICAgICAgaWYgcy4oc3RyaW5nKSAhPSBKU09OX05BTiB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICAldiwgd3JvdGU6ICVxLCBleHBlY3RlZDogJXEsIG9yaWdpbmFsbHkgd3JvdGU6ICVxIiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTiksIHN0cikKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgcy4oZmxvYXQ2NCkgIT0gdmFsdWUgewotICAgICAgICB0LkZhdGFsZigiQmFkIGpzb24tZGVjb2RlZCB2YWx1ZSBmb3IgJXMgJXYsIHdyb3RlOiAnJXMnIiwgdGhldHlwZSwgdmFsdWUsIHMpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLWZ1bmMgVGVzdFdyaXRlU2ltcGxlSlNPTlByb3RvY29sTWFwKHQgKnRlc3RpbmcuVCkgewotICB0aGV0eXBlIDo9ICJtYXAiCi0gIHRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQotICBwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCi0gIHAuV3JpdGVNYXBCZWdpbihUVHlwZShJMzIpLCBUVHlwZShET1VCTEUpLCBsZW4oRE9VQkxFX1ZBTFVFUykpCi0gIGZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBpZiBlIDo9IHAuV3JpdGVJMzIoaW50MzIoaykpOyBlICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIGtleSBpbnQzMiB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgaywgZS5TdHJpbmcoKSkKLSAgICB9Ci0gICAgaWYgZSA6PSBwLldyaXRlRG91YmxlKHZhbHVlKTsgZSAhPSBuaWwgewotICAgICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSBmbG9hdDY0IHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5TdHJpbmcoKSkKLSAgICB9Ci0gIH0KLSAgcC5Xcml0ZU1hcEVuZCgpCi0gIGlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5TdHJpbmcoKSkKLSAgfQotICBzdHIgOj0gdHJhbnMuU3RyaW5nKCkKLSAgaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKLSAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICVxLCBpbiBnbzogJXEiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCi0gIH0KLSAgbCA6PSBzdHJpbmdzLlNwbGl0KHN0clsxOmxlbihzdHIpLTFdLCAiLCIpCi0gIGlmIGxlbihsKSA8IDMgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIGxpc3Qgb2YgYXQgbGVhc3QgbGVuZ3RoIDMgZm9yIG1hcCBmb3IgbWV0YWRhdGEsIGJ1dCB3YXMgb2YgbGVuZ3RoICIsIGxlbihsKSkKLSAgfQotICBleHBlY3RlZEtleVR5cGUsIF8gOj0gc3RyY29udi5BdG9pKGxbMF0pCi0gIGV4cGVjdGVkVmFsdWVUeXBlLCBfIDo9IHN0cmNvbnYuQXRvaShsWzFdKQotICBleHBlY3RlZFNpemUsIF8gOj0gc3RyY29udi5BdG9pKGxbMl0pCi0gIGlmIGV4cGVjdGVkS2V5VHlwZSAhPSBJMzIgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCBrZXkgdHlwZSAiLCBJMzIsICIsIGJ1dCB3YXMgIiwgbFswXSkKLSAgfQotICBpZiBleHBlY3RlZFZhbHVlVHlwZSAhPSBET1VCTEUgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCB2YWx1ZSB0eXBlICIsIERPVUJMRSwgIiwgYnV0IHdhcyAiLCBsWzFdKQotICB9Ci0gIGlmIGV4cGVjdGVkU2l6ZSAhPSBsZW4oRE9VQkxFX1ZBTFVFUykgewotICAgIHQuRmF0YWwoIkV4cGVjdGVkIG1hcCBzaXplIG9mICIsIGxlbihET1VCTEVfVkFMVUVTKSwgIiwgYnV0IHdhcyAiLCBsWzJdKQotICB9Ci0gIGZvciBrLCB2YWx1ZSA6PSByYW5nZSBET1VCTEVfVkFMVUVTIHsKLSAgICBzdHJrIDo9IGxbayoyKzNdCi0gICAgc3RydiA6PSBsW2sqMis0XQotICAgIGlrLCBlcnIgOj0gc3RyY29udi5BdG9pKHN0cmspCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBpbmRleCAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYsIGVycm9yOiAlcyIsIHRoZXR5cGUsIGssIHN0cmssIHN0cmluZyhrKSwgZXJyLlN0cmluZygpKQotICAgIH0KLSAgICBpZiBpayAhPSBrIHsKLSAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGluZGV4ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkOiAldiIsIHRoZXR5cGUsIGssIHN0cmssIGspCi0gICAgfQotICAgIHMgOj0gc3RydgotICAgIGlmIG1hdGguSXNJbmYodmFsdWUsIDEpIHsKLSAgICAgIGlmIHMgIT0gSnNvblF1b3RlKEpTT05fSU5GSU5JVFkpIHsKLSAgICAgICAgdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMgYXQgaW5kZXggJXYgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX0lORklOSVRZKSkKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgbWF0aC5Jc0luZih2YWx1ZSwgMCkgewotICAgICAgaWYgcyAhPSBKc29uUXVvdGUoSlNPTl9ORUdBVElWRV9JTkZJTklUWSkgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAldiwgd3JvdGU6ICV2LCBleHBlY3RlZDogJXYiLCB0aGV0eXBlLCBrLCB2YWx1ZSwgcywgSnNvblF1b3RlKEpTT05fTkVHQVRJVkVfSU5GSU5JVFkpKQotICAgICAgfQotICAgIH0gZWxzZSBpZiBtYXRoLklzTmFOKHZhbHVlKSB7Ci0gICAgICBpZiBzICE9IEpzb25RdW90ZShKU09OX05BTikgewotICAgICAgICB0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcyBhdCBpbmRleCAldiAgJXYsIHdyb3RlOiAldiwgZXhwZWN0ZWQ6ICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIEpzb25RdW90ZShKU09OX05BTikpCi0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4cGVjdGVkIDo9IHN0cmNvbnYuRnRvYTY0KHZhbHVlLCAnZycsIDEwKQotICAgICAgaWYgcyAhPSBleHBlY3RlZCB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQgdmFsdWUgZm9yICVzIGF0IGluZGV4ICV2ICV2LCB3cm90ZTogJXYsIGV4cGVjdGVkICV2IiwgdGhldHlwZSwgaywgdmFsdWUsIHMsIGV4cGVjdGVkKQotICAgICAgfQotICAgICAgdiA6PSBmbG9hdDY0KDApCi0gICAgICBpZiBlcnIgOj0ganNvbi5Vbm1hcnNoYWwoW11ieXRlKHMpLCAmdik7IGVyciAhPSBuaWwgfHwgdiAhPSB2YWx1ZSB7Ci0gICAgICAgIHQuRmF0YWxmKCJCYWQganNvbi1kZWNvZGVkIHZhbHVlIGZvciAlcyAldiwgd3JvdGU6ICclcycsIGV4cGVjdGVkOiAnJXYnIiwgdGhldHlwZSwgdmFsdWUsIHMsIHYpCi0gICAgICB9Ci0gICAgfQotICAgIHRyYW5zLlJlc2V0KCkKLSAgfQotICB0cmFucy5DbG9zZSgpCi19Ci0KLQotZnVuYyBUZXN0UmVhZFdyaXRlU2ltcGxlSlNPTlN0cnVjdCh0ICp0ZXN0aW5nLlQpIHsKLSAgdGhldHlwZSA6PSAic3RydWN0IgotICB0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKLSAgcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQotICBvcmlnIDo9IE5ld1dvcmsoKQotICBvcmlnLk51bTEgPSAyNQotICBvcmlnLk51bTIgPSAxMDIKLSAgb3JpZy5PcCA9IEFERAotICBvcmlnLkNvbW1lbnQgPSAiQWRkOiAyNSArIDEwMiIKLSAgaWYgZSA6PSBvcmlnLldyaXRlKHApOyBlICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAlI3YgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIG9yaWcsIGUuU3RyaW5nKCkpCi0gIH0KLSAgdC5Mb2coIk1lbW9yeSBidWZmZXIgY29udGVudHM6ICIsIHRyYW5zLlN0cmluZygpKQotICByZWFkIDo9IE5ld1dvcmsoKQotICBlIDo9IHJlYWQuUmVhZChwKQotICB0LkxvZ2YoIlJlYWQgJXMgdmFsdWU6ICUjdiIsIHRoZXR5cGUsIHJlYWQpCi0gIGlmIGUgIT0gbmlsIHsKLSAgICB0LkZhdGFsZigiVW5hYmxlIHRvIHJlYWQgJXMgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgaWYgIW9yaWcuRXF1YWxzKHJlYWQpIHsKLSAgICB0LkZhdGFsZigiT3JpZ2luYWwgV3JpdGUgIT0gUmVhZDogJSN2ICE9ICUjdiAiLCBvcmlnLCByZWFkKQotICB9Ci19Ci0KLWZ1bmMgVGVzdFJlYWRXcml0ZVNpbXBsZUpTT05Qcm90b2NvbCh0ICp0ZXN0aW5nLlQpIHsKLSAgUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC90c2ltcGxlX3NlcnZlci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ZDY1Ni4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3RzaW1wbGVfc2VydmVyLmdvCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm9zIgotKQotCi0KLS8qKgotICogU2ltcGxlIHNpbmdsZXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZy4KLSAqCi0gKi8KLXR5cGUgVFNpbXBsZVNlcnZlciBzdHJ1Y3QgewotICBzdG9wcGVkIGJvb2wKLQotICBwcm9jZXNzb3JGYWN0b3J5ICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5Ci0gIHNlcnZlclRyYW5zcG9ydCAgICAgICAgVFNlcnZlclRyYW5zcG9ydAotICBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgIFRUcmFuc3BvcnRGYWN0b3J5Ci0gIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnkKLSAgaW5wdXRQcm90b2NvbEZhY3RvcnkgICBUUHJvdG9jb2xGYWN0b3J5Ci0gIG91dHB1dFByb3RvY29sRmFjdG9yeSAgVFByb3RvY29sRmFjdG9yeQotfQotCi1mdW5jIE5ld1RTaW1wbGVTZXJ2ZXIyKHByb2Nlc3NvciBUUHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQgVFNlcnZlclRyYW5zcG9ydCkgKlRTaW1wbGVTZXJ2ZXIgewotICByZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3RvcnkyKE5ld1RQcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCkKLX0KLQotZnVuYyBOZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7Ci0gIHJldHVybiBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTQoTmV3VFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwKLSAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUU2ltcGxlU2VydmVyNihwcm9jZXNzb3IgVFByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSwgaW5wdXRQcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnkpICpUU2ltcGxlU2VydmVyIHsKLSAgcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5NihOZXdUUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICkKLX0KLQotZnVuYyBOZXdUU2ltcGxlU2VydmVyRmFjdG9yeTIocHJvY2Vzc29yRmFjdG9yeSBUUHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0IFRTZXJ2ZXJUcmFuc3BvcnQpICpUU2ltcGxlU2VydmVyIHsKLSAgcmV0dXJuIE5ld1RTaW1wbGVTZXJ2ZXJGYWN0b3J5Nihwcm9jZXNzb3JGYWN0b3J5LAotICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBOZXdUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgIE5ld1RUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKSwKLSAgICBOZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpLAotICApCi19Ci0KLWZ1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk0KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgVFByb3RvY29sRmFjdG9yeSkgKlRTaW1wbGVTZXJ2ZXIgewotICByZXR1cm4gTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnksCi0gICAgc2VydmVyVHJhbnNwb3J0LAotICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgcHJvdG9jb2xGYWN0b3J5LAotICApCi19Ci0KLWZ1bmMgTmV3VFNpbXBsZVNlcnZlckZhY3Rvcnk2KHByb2Nlc3NvckZhY3RvcnkgVFByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCBUU2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgVFRyYW5zcG9ydEZhY3RvcnksIGlucHV0UHJvdG9jb2xGYWN0b3J5IFRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSAqVFNpbXBsZVNlcnZlciB7Ci0gIHJldHVybiAmVFNpbXBsZVNlcnZlcntwcm9jZXNzb3JGYWN0b3J5OiBwcm9jZXNzb3JGYWN0b3J5LAotICAgIHNlcnZlclRyYW5zcG9ydDogICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk6ICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICBpbnB1dFByb3RvY29sRmFjdG9yeTogICBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk6ICBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gIH0KLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgUHJvY2Vzc29yRmFjdG9yeSgpIFRQcm9jZXNzb3JGYWN0b3J5IHsKLSAgcmV0dXJuIHAucHJvY2Vzc29yRmFjdG9yeQotfQotCi1mdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZXJUcmFuc3BvcnQoKSBUU2VydmVyVHJhbnNwb3J0IHsKLSAgcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Ci19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgcmV0dXJuIHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci19Ci0KLWZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkKLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgSW5wdXRQcm90b2NvbEZhY3RvcnkoKSBUUHJvdG9jb2xGYWN0b3J5IHsKLSAgcmV0dXJuIHAuaW5wdXRQcm90b2NvbEZhY3RvcnkKLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgT3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkgVFByb3RvY29sRmFjdG9yeSB7Ci0gIHJldHVybiBwLm91dHB1dFByb3RvY29sRmFjdG9yeQotfQotCi1mdW5jIChwICpUU2ltcGxlU2VydmVyKSBTZXJ2ZSgpIG9zLkVycm9yIHsKLSAgcC5zdG9wcGVkID0gZmFsc2UKLSAgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHJldHVybiBlcnIKLSAgfQotICBmb3IgIXAuc3RvcHBlZCB7Ci0gICAgY2xpZW50LCBlcnIgOj0gcC5zZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gICAgaWYgY2xpZW50ICE9IG5pbCB7Ci0gICAgICBwLnByb2Nlc3NSZXF1ZXN0KGNsaWVudCkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICpUU2ltcGxlU2VydmVyKSBTdG9wKCkgb3MuRXJyb3IgewotICBwLnN0b3BwZWQgPSB0cnVlCi0gIHAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgcHJvY2Vzc1JlcXVlc3QoY2xpZW50IFRUcmFuc3BvcnQpIHsKLSAgcHJvY2Vzc29yIDo9IHAucHJvY2Vzc29yRmFjdG9yeS5HZXRQcm9jZXNzb3IoY2xpZW50KQotICBpbnB1dFRyYW5zcG9ydCA6PSBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQotICBvdXRwdXRUcmFuc3BvcnQgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCi0gIGlucHV0UHJvdG9jb2wgOj0gcC5pbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCkKLSAgb3V0cHV0UHJvdG9jb2wgOj0gcC5vdXRwdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KQotICBpZiBpbnB1dFRyYW5zcG9ydCAhPSBuaWwgewotICAgIGRlZmVyIGlucHV0VHJhbnNwb3J0LkNsb3NlKCkKLSAgfQotICBpZiBvdXRwdXRUcmFuc3BvcnQgIT0gbmlsIHsKLSAgICBkZWZlciBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKQotICB9Ci0gIGZvciB7Ci0gICAgb2ssIGUgOj0gcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpCi0gICAgaWYgZSAhPSBuaWwgewotICAgICAgaWYgIXAuc3RvcHBlZCB7Ci0gICAgICAgIC8vIFRPRE8ocG9tYWNrKSBsb2cgZXJyb3IKLSAgICAgICAgYnJlYWsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgIW9rIHsKLSAgICAgIGJyZWFrCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3Rzb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3Rzb2NrZXQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzYyNTMuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC90c29ja2V0LmdvCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotaW1wb3J0ICgKLSAgIm5ldCIKLSAgIm9zIgotICAiYnl0ZXMiCi0pCi0KLS8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVG8gYmUgY29tbWVudGVkIHNvb24hCi0gKgotICovCi10eXBlIFRTb2NrZXQgc3RydWN0IHsKLSAgd3JpdGVCdWZmZXIgKmJ5dGVzLkJ1ZmZlcgotICAvKioKLSAgICogV3JhcHBlZCBTb2NrZXQgb2JqZWN0Ci0gICAqLwotICBjb25uIG5ldC5Db25uCi0gIC8qKgotICAgKiBSZW1vdGUgQWRkcgotICAgKi8KLSAgYWRkciBuZXQuQWRkcgotICAvKioKLSAgICogU29ja2V0IHRpbWVvdXQgaW4gbmFub3NlY29uZHMKLSAgICovCi0gIG5zZWNUaW1lb3V0IGludDY0Ci19Ci0KLS8qKgotICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQgc29ja2V0LgotICoKLSAqIEBwYXJhbSBzb2NrZXQgQWxyZWFkeSBjcmVhdGVkIHNvY2tldCBvYmplY3QKLSAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBzZXR0aW5nIHVwIHRoZSBzdHJlYW1zCi0gKi8KLWZ1bmMgTmV3VFNvY2tldENvbm4oY29ubmVjdGlvbiBuZXQuQ29ubikgKCpUU29ja2V0LCBUVHJhbnNwb3J0RXhjZXB0aW9uKSB7Ci0gIGFkZHJlc3MgOj0gY29ubmVjdGlvbi5SZW1vdGVBZGRyKCkKLSAgaWYgYWRkcmVzcyA9PSBuaWwgewotICAgIGFkZHJlc3MgPSBjb25uZWN0aW9uLkxvY2FsQWRkcigpCi0gIH0KLSAgcCA6PSAmVFNvY2tldHtjb25uOiBjb25uZWN0aW9uLCBhZGRyOiBhZGRyZXNzLCBuc2VjVGltZW91dDogMCwgd3JpdGVCdWZmZXI6IGJ5dGVzLk5ld0J1ZmZlcihtYWtlKFtdYnl0ZSwgMCwgNDA5NikpfQotICByZXR1cm4gcCwgbmlsCi19Ci0KLS8qKgotICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKLSAqIG9uIHRoZSBnaXZlbiBwb3J0LgotICoKLSAqIEBwYXJhbSBob3N0IFJlbW90ZSBob3N0Ci0gKiBAcGFyYW0gcG9ydCBSZW1vdGUgcG9ydAotICovCi1mdW5jIE5ld1RTb2NrZXRBZGRyKGFkZHJlc3MgbmV0LkFkZHIpICpUU29ja2V0IHsKLSAgcmV0dXJuIE5ld1RTb2NrZXQoYWRkcmVzcywgMCkKLX0KLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IHVuY29ubmVjdGVkIHNvY2tldCB0aGF0IHdpbGwgY29ubmVjdCB0byB0aGUgZ2l2ZW4gaG9zdAotICogb24gdGhlIGdpdmVuIHBvcnQuCi0gKgotICogQHBhcmFtIGhvc3QgICAgUmVtb3RlIGhvc3QKLSAqIEBwYXJhbSBwb3J0ICAgIFJlbW90ZSBwb3J0Ci0gKiBAcGFyYW0gbnNlY1RpbWVvdXQgU29ja2V0IHRpbWVvdXQKLSAqLwotZnVuYyBOZXdUU29ja2V0KGFkZHJlc3MgbmV0LkFkZHIsIG5zZWNUaW1lb3V0IGludDY0KSAqVFNvY2tldCB7Ci0gIHNvY2sgOj0gJlRTb2NrZXR7YWRkcjogYWRkcmVzcywgbnNlY1RpbWVvdXQ6IG5zZWNUaW1lb3V0LCB3cml0ZUJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCA0MDk2KSl9Ci0gIHJldHVybiBzb2NrCi19Ci0KLS8qKgotICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQKLSAqCi0gKiBAcGFyYW0gdGltZW91dCBOYW5vc2Vjb25kcyB0aW1lb3V0Ci0gKi8KLWZ1bmMgKHAgKlRTb2NrZXQpIFNldFRpbWVvdXQobnNlY1RpbWVvdXQgaW50NjQpIG9zLkVycm9yIHsKLSAgcC5uc2VjVGltZW91dCA9IG5zZWNUaW1lb3V0Ci0gIGlmIHAuSXNPcGVuKCkgewotICAgIGlmIGVyciA6PSBwLmNvbm4uU2V0VGltZW91dChuc2VjVGltZW91dCk7IGVyciAhPSBuaWwgewotICAgICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3Qgc2V0IHNvY2tldCB0aW1lb3V0LiIsIGVycikKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0vKioKLSAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0LgotICovCi1mdW5jIChwICpUU29ja2V0KSBDb25uKCkgbmV0LkNvbm4gewotICByZXR1cm4gcC5jb25uCi19Ci0KLS8qKgotICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCi0gKi8KLWZ1bmMgKHAgKlRTb2NrZXQpIElzT3BlbigpIGJvb2wgewotICBpZiBwLmNvbm4gPT0gbmlsIHsKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gdHJ1ZQotfQotCi0vKioKLSAqIENvbm5lY3RzIHRoZSBzb2NrZXQsIGNyZWF0aW5nIGEgbmV3IHNvY2tldCBvYmplY3QgaWYgbmVjZXNzYXJ5LgotICovCi1mdW5jIChwICpUU29ja2V0KSBPcGVuKCkgb3MuRXJyb3IgewotICBpZiBwLklzT3BlbigpIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihBTFJFQURZX09QRU4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQuIikKLSAgfQotICBpZiBwLmFkZHIgPT0gbmlsIHsKLSAgICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNhbm5vdCBvcGVuIG5pbCBhZGRyZXNzLiIpCi0gIH0KLSAgaWYgbGVuKHAuYWRkci5OZXR3b3JrKCkpID09IDAgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIG5ldHdvcmsgbmFtZS4iKQotICB9Ci0gIGlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgewotICAgIHJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gYmFkIGFkZHJlc3MuIikKLSAgfQotICB2YXIgZXJyIG9zLkVycm9yCi0gIGlmIHAuY29ubiwgZXJyID0gbmV0LkRpYWwocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpKTsgZXJyICE9IG5pbCB7Ci0gICAgTE9HR0VSLlByaW50KCJDb3VsZCBub3Qgb3BlbiBzb2NrZXQiLCBlcnIuU3RyaW5nKCkpCi0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sIGVyci5TdHJpbmcoKSkKLSAgfQotICBpZiBwLmNvbm4gIT0gbmlsIHsKLSAgICBwLmNvbm4uU2V0VGltZW91dChwLm5zZWNUaW1lb3V0KQotICB9Ci0gIHJldHVybiBuaWwKLX0KLQotLyoqCi0gKiBDbG9zZXMgdGhlIHNvY2tldC4KLSAqLwotZnVuYyAocCAqVFNvY2tldCkgQ2xvc2UoKSBvcy5FcnJvciB7Ci0gIC8vIENsb3NlIHRoZSBzb2NrZXQKLSAgaWYgcC5jb25uICE9IG5pbCB7Ci0gICAgZXJyIDo9IHAuY29ubi5DbG9zZSgpCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICBMT0dHRVIuUHJpbnQoIkNvdWxkIG5vdCBjbG9zZSBzb2NrZXQuICIsIGVyci5TdHJpbmcoKSkKLSAgICAgIHJldHVybiBlcnIKLSAgICB9Ci0gICAgcC5jb25uID0gbmlsCi0gIH0KLSAgcmV0dXJuIG5pbAotfQotCi0KLWZ1bmMgKHAgKlRTb2NrZXQpIFJlYWQoYnVmIFtdYnl0ZSkgKGludCwgb3MuRXJyb3IpIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCAiQ29ubmVjdGlvbiBub3Qgb3BlbiIpCi0gIH0KLSAgbiwgZXJyIDo9IHAuY29ubi5SZWFkKGJ1ZikKLSAgcmV0dXJuIG4sIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLQotZnVuYyAocCAqVFNvY2tldCkgUmVhZEFsbChidWYgW11ieXRlKSAoaW50LCBvcy5FcnJvcikgewotICByZXR1cm4gUmVhZEFsbFRyYW5zcG9ydChwLCBidWYpCi19Ci0KLWZ1bmMgKHAgKlRTb2NrZXQpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIGlmICFwLklzT3BlbigpIHsKLSAgICByZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgIkNvbm5lY3Rpb24gbm90IG9wZW4iKQotICB9Ci0gIHAud3JpdGVCdWZmZXIuV3JpdGUoYnVmKQotICByZXR1cm4gbGVuKGJ1ZiksIG5pbAotfQotCi1mdW5jIChwICpUU29ja2V0KSBQZWVrKCkgYm9vbCB7Ci0gIHJldHVybiBwLklzT3BlbigpCi19Ci0KLWZ1bmMgKHAgKlRTb2NrZXQpIEZsdXNoKCkgb3MuRXJyb3IgewotICBpZiAhcC5Jc09wZW4oKSB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDb25uZWN0aW9uIG5vdCBvcGVuIikKLSAgfQotICBfLCBlcnIgOj0gcC53cml0ZUJ1ZmZlci5Xcml0ZVRvKHAuY29ubikKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlcnIpCi19Ci0KLWZ1bmMgKHAgKlRTb2NrZXQpIEludGVycnVwdCgpIG9zLkVycm9yIHsKLSAgaWYgIXAuSXNPcGVuKCkgewotICAgIHJldHVybiBuaWwKLSAgfQotICAvLyBUT0RPKHBvbWFjaykgZml4IEludGVycnVwdCBhcyB0aGlzIGlzIHByb2JhYmx5IHdyb25nCi0gIHJldHVybiBwLmNvbm4uQ2xvc2UoKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90c3RydWN0LmdvIGIvbGliL2dvL3RocmlmdC90c3RydWN0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFmZmFlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHN0cnVjdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSB0aHJpZnQKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBlbmNhcHN1bGF0ZXMgc3RydWN0IG1ldGFkYXRhLgotICoKLSAqLwotdHlwZSBUU3RydWN0IGludGVyZmFjZSB7Ci0gIFRGaWVsZENvbnRhaW5lcgotICBUU3RydWN0TmFtZSgpIHN0cmluZwotICBUaHJpZnROYW1lKCkgc3RyaW5nCi0gIFRTdHJ1Y3RGaWVsZHMoKSBURmllbGRDb250YWluZXIKLSAgU3RyaW5nKCkgc3RyaW5nCi0gIEF0dHJpYnV0ZUZyb21GaWVsZElkKGZpZWxkSWQgaW50KSBpbnRlcmZhY2V7fQotICBBdHRyaWJ1dGVGcm9tRmllbGROYW1lKGZpZWxkTmFtZSBzdHJpbmcpIGludGVyZmFjZXt9Ci19Ci0KLXR5cGUgdFN0cnVjdCBzdHJ1Y3QgewotICBURmllbGRDb250YWluZXIKLSAgbmFtZSBzdHJpbmcKLX0KLQotZnVuYyBOZXdUU3RydWN0RW1wdHkobmFtZSBzdHJpbmcpIFRTdHJ1Y3QgewotICByZXR1cm4gJnRTdHJ1Y3R7Ci0gICAgbmFtZTogICAgICAgICAgICBuYW1lLAotICAgIFRGaWVsZENvbnRhaW5lcjogTmV3VEZpZWxkQ29udGFpbmVyKG1ha2UoW11URmllbGQsIDAsIDApKSwKLSAgfQotfQotCi1mdW5jIE5ld1RTdHJ1Y3QobmFtZSBzdHJpbmcsIGZpZWxkcyBbXVRGaWVsZCkgVFN0cnVjdCB7Ci0gIHJldHVybiAmdFN0cnVjdHsKLSAgICBuYW1lOiAgICAgICAgICAgIG5hbWUsCi0gICAgVEZpZWxkQ29udGFpbmVyOiBOZXdURmllbGRDb250YWluZXIoZmllbGRzKSwKLSAgfQotfQotCi1mdW5jIChwICp0U3RydWN0KSBUU3RydWN0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiBwLm5hbWUKLX0KLQotZnVuYyAocCAqdFN0cnVjdCkgVGhyaWZ0TmFtZSgpIHN0cmluZyB7Ci0gIHJldHVybiBwLm5hbWUKLX0KLQotZnVuYyAocCAqdFN0cnVjdCkgVFN0cnVjdEZpZWxkcygpIFRGaWVsZENvbnRhaW5lciB7Ci0gIHJldHVybiBwLlRGaWVsZENvbnRhaW5lcgotfQotCi1mdW5jIChwICp0U3RydWN0KSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5uYW1lCi19Ci0KLWZ1bmMgKHAgKnRTdHJ1Y3QpIEVxdWFscyhvdGhlciBpbnRlcmZhY2V7fSkgYm9vbCB7Ci0gIGNtcCwgb2sgOj0gcC5Db21wYXJlVG8ob3RoZXIpCi0gIHJldHVybiBvayAmJiBjbXAgPT0gMAotfQotCi1mdW5jIChwICp0U3RydWN0KSBDb21wYXJlVG8ob3RoZXIgaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgcmV0dXJuIFRUeXBlKFNUUlVDVCkuQ29tcGFyZShwLCBvdGhlcikKLX0KLQotZnVuYyAocCAqdFN0cnVjdCkgQXR0cmlidXRlRnJvbUZpZWxkSWQoZmllbGRJZCBpbnQpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIG5pbAotfQotCi1mdW5jIChwICp0U3RydWN0KSBBdHRyaWJ1dGVGcm9tRmllbGROYW1lKGZpZWxkTmFtZSBzdHJpbmcpIGludGVyZmFjZXt9IHsKLSAgcmV0dXJuIHAuQXR0cmlidXRlRnJvbUZpZWxkSWQocC5GaWVsZElkRnJvbUZpZWxkTmFtZShmaWVsZE5hbWUpKQotfQotCi0KLXZhciBBTk9OWU1PVVNfU1RSVUNUIFRTdHJ1Y3QKLQotZnVuYyBpbml0KCkgewotICBBTk9OWU1PVVNfU1RSVUNUID0gTmV3VFN0cnVjdEVtcHR5KCIiKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjliMGI0Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHRyYW5zcG9ydC5nbworKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJvcyIKLSAgImxvZyIKLSAgInN0cmNvbnYiCi0pCi0KLXR5cGUgRmx1c2hlciBpbnRlcmZhY2UgewotICBGbHVzaCgpIChlcnIgb3MuRXJyb3IpCi19Ci0KLS8qKgotICogR2VuZXJpYyBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgSS9PIGxheWVyLiBUaGlzIGlzIGJhc2ljYWxseSBhIHRoaW4KLSAqIHdyYXBwZXIgYXJvdW5kIHRoZSBjb21iaW5lZCBmdW5jdGlvbmFsaXR5IG9mIEphdmEgaW5wdXQvb3V0cHV0IHN0cmVhbXMuCi0gKgotICovCi10eXBlIFRUcmFuc3BvcnQgaW50ZXJmYWNlIHsKLSAgLyoqCi0gICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqLwotICBJc09wZW4oKSBib29sCi0KLSAgLyoqCi0gICAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZy4KLSAgICoKLSAgICogQHJldHVybnMgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGUgdHJhbnNwb3J0IGNvdWxkIG5vdCBiZSBvcGVuZWQKLSAgICovCi0gIE9wZW4oKSAoZXJyIG9zLkVycm9yKQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIENsb3NlKCkgKGVyciBvcy5FcnJvcikKLQotICAvKioKLSAgICogUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCi0gICAqCi0gICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCi0gICAqIEBwYXJhbSBvZmYgSW5kZXggdG8gc3RhcnQgcmVhZGluZyBhdAotICAgKiBAcGFyYW0gbGVuIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKLSAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQKLSAgICogQHJldHVybiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKLSAgICovCi0gIFJlYWQoYnVmIFtdYnl0ZSkgKG4gaW50LCBlcnIgb3MuRXJyb3IpCi0KLSAgLyoqCi0gICAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSBhY3R1YWxseSByZWFkIG9mZiB0aGUgdHJhbnNwb3J0LgotICAgKgotICAgKiBAcGFyYW0gYnVmIEFycmF5IHRvIHJlYWQgaW50bwotICAgKiBAcGFyYW0gb2ZmIEluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgYXQKLSAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLCB3aGljaCBtdXN0IGJlIGVxdWFsIHRvIGxlbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQotICAgKi8KLSAgUmVhZEFsbChidWYgW11ieXRlKSAobiBpbnQsIGVyciBvcy5FcnJvcikKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBidWZmZXIgdG8gdGhlIG91dHB1dAotICAgKgotICAgKiBAcGFyYW0gYnVmIFRoZSBvdXRwdXQgZGF0YSBidWZmZXIKLSAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgZGF0YQotICAgKi8KLSAgV3JpdGUoYnVmIFtdYnl0ZSkgKG4gaW50LCBlcnIgb3MuRXJyb3IpCi0KLSAgLyoqCi0gICAqIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIG91dCBkYXRhLgotICAgKi8KLSAgRmx1c2goKSAoZXJyIG9zLkVycm9yKQotCi0gIC8qKgotICAgKiBJcyB0aGVyZSBtb3JlIGRhdGEgdG8gYmUgcmVhZD8KLSAgICoKLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSByZW1vdGUgc2lkZSBpcyBzdGlsbCBhbGl2ZSBhbmQgZmVlZGluZyB1cwotICAgKi8KLSAgUGVlaygpIGJvb2wKLX0KLS8qCi10eXBlIFRUcmFuc3BvcnRCYXNlIHN0cnVjdCB7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBJc09wZW4oKSBib29sIHsKLSAgcmV0dXJuIGZhbHNlOwotfTsKLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIFBlZWsoKSBib29sIHsKLSAgcmV0dXJuIHAuSXNPcGVuKCk7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBPcGVuKCkgb3MuRXJyb3IgewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOLCAiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5PcGVuKCkiKTsKLX0KLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIENsb3NlKCkgb3MuRXJyb3IgewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOLCAiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5DbG9zZSgpIik7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBSZWFkKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRGVmYXVsdFN0cmluZygiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5SZWFkKCkiKTsKLX0KLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIFJlYWRBbGwoYnVmIFtdYnl0ZSkgKG4gaW50LCBlcnIgb3MuRXJyb3IpewotICByZXQgOj0gMDsKLSAgc2l6ZSA6PSBsZW4oYnVmKTsKLSAgZm9yIChuIDwgc2l6ZSkgewotICAgIHJldCwgZXJyID0gcC5SZWFkKGJ1ZltuOl0pOwotICAgIGlmIHJldCA8PSAwIHsKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICBlcnIgPSBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRGVmYXVsdFN0cmluZygiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIFRyaWVkIHRvIHJlYWQgIiArIHN0cmluZyhzaXplKSArICIgYnl0ZXMsIGJ1dCBvbmx5IGdvdCAiICsgc3RyaW5nKG4pICsgIiBieXRlcy4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXQsIGVycjsKLSAgICB9Ci0gICAgbiArPSByZXQ7Ci0gIH0KLSAgcmV0dXJuIG4sIGVycjsKLX0KLQotZnVuYyAocCogVFRyYW5zcG9ydEJhc2UpIFdyaXRlKGJ1ZiBbXWJ5dGUpIChpbnQsIG9zLkVycm9yKSB7Ci0gIHJldHVybiAwLCBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRGVmYXVsdFN0cmluZygiU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCBUVHJhbnNwb3J0QmFzZS5Xcml0ZSgpIik7Ci19Ci0KLWZ1bmMgKHAqIFRUcmFuc3BvcnRCYXNlKSBGbHVzaCgpIG9zLkVycm9yIHsKLSAgcmV0dXJuIG5pbDsKLX0KLSovCi0vKioKLSAqIEd1YXJhbnRlZXMgdGhhdCBhbGwgb2YgbGVuIGJ5dGVzIGFyZSBhY3R1YWxseSByZWFkIG9mZiB0aGUgdHJhbnNwb3J0LgotICoKLSAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCi0gKiBAcGFyYW0gb2ZmIEluZGV4IHRvIHN0YXJ0IHJlYWRpbmcgYXQKLSAqIEBwYXJhbSBsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAotICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCi0gKiBAcmV0dXJuIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgZGF0YQotICovCi1mdW5jIFJlYWRBbGxUcmFuc3BvcnQocCBUVHJhbnNwb3J0LCBidWYgW11ieXRlKSAobiBpbnQsIGVyciBvcy5FcnJvcikgewotICByZXQgOj0gMAotICBzaXplIDo9IGxlbihidWYpCi0gIGZvciBuIDwgc2l6ZSB7Ci0gICAgcmV0LCBlcnIgPSBwLlJlYWQoYnVmW246XSkKLSAgICBpZiByZXQgPD0gMCB7Ci0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgZXJyID0gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHRTdHJpbmcoIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiBUcmllZCB0byByZWFkICIgKyBzdHJjb252Lkl0b2Eoc2l6ZSkgKyAiIGJ5dGVzLCBidXQgb25seSBnb3QgIiArIHN0cmNvbnYuSXRvYShuKSArICIgYnl0ZXMuIikKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXQsIGVycgotICAgIH0KLSAgICBuICs9IHJldAotICB9Ci0gIHJldHVybiBuLCBlcnIKLX0KLQotCi12YXIgKAotICBMT0dHRVIgKmxvZy5Mb2dnZXIKLSkKLQotZnVuYyBpbml0KCkgewotICBMT0dHRVIgPSBsb2cuTmV3KG9zLlN0ZGVyciwgIiIsIGxvZy5MZGF0ZXxsb2cuTHRpbWV8bG9nLkxzaG9ydGZpbGUpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfZXhjZXB0aW9uLmdvIGIvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0X2V4Y2VwdGlvbi5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmYWUxNy4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfZXhjZXB0aW9uLmdvCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi1pbXBvcnQgKAotICAib3MiCi0pCi0KLS8qKgotICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMuCi0gKgotICovCi10eXBlIFRUcmFuc3BvcnRFeGNlcHRpb24gaW50ZXJmYWNlIHsKLSAgVEV4Y2VwdGlvbgotICBUeXBlSWQoKSBpbnQKLX0KLQotY29uc3QgKAotICBVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04gPSAwCi0gIE5PVF9PUEVOICAgICAgICAgICAgICAgICAgICA9IDEKLSAgQUxSRUFEWV9PUEVOICAgICAgICAgICAgICAgID0gMgotICBUSU1FRF9PVVQgICAgICAgICAgICAgICAgICAgPSAzCi0gIEVORF9PRl9GSUxFICAgICAgICAgICAgICAgICA9IDQKLSkKLQotdHlwZSB0VHJhbnNwb3J0RXhjZXB0aW9uIHN0cnVjdCB7Ci0gIHR5cGVJZCAgaW50Ci0gIG1lc3NhZ2Ugc3RyaW5nCi19Ci0KLWZ1bmMgKHAgKnRUcmFuc3BvcnRFeGNlcHRpb24pIFR5cGVJZCgpIGludCB7Ci0gIHJldHVybiBwLnR5cGVJZAotfQotCi1mdW5jIChwICp0VHJhbnNwb3J0RXhjZXB0aW9uKSBTdHJpbmcoKSBzdHJpbmcgewotICByZXR1cm4gcC5tZXNzYWdlCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHQoKSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25EZWZhdWx0VHlwZShVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04pCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHRUeXBlKHQgaW50KSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24odCwgIiIpCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkRlZmF1bHRTdHJpbmcobSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICByZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihVTktOT1dOX1RSQU5TUE9SVF9FWENFUFRJT04sIG0pCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0IGludCwgbSBzdHJpbmcpIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICByZXR1cm4gJnRUcmFuc3BvcnRFeGNlcHRpb257dHlwZUlkOiB0LCBtZXNzYWdlOiBtfQotfQotCi1mdW5jIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tT3NFcnJvcihlIG9zLkVycm9yKSBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgaWYgZSA9PSBuaWwgewotICAgIHJldHVybiBuaWwKLSAgfQotICB0LCBvayA6PSBlLihUVHJhbnNwb3J0RXhjZXB0aW9uKQotICBpZiBvayB7Ci0gICAgcmV0dXJuIHQKLSAgfQotICBpZiBlID09IG9zLkVPRiB7Ci0gICAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oRU5EX09GX0ZJTEUsIGUuU3RyaW5nKCkpCi0gIH0KLSAgcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25EZWZhdWx0U3RyaW5nKGUuU3RyaW5nKCkpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHRyYW5zcG9ydF9mYWN0b3J5LmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWI0ZGJlLi4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHRyYW5zcG9ydF9mYWN0b3J5LmdvCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIHRocmlmdAotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgotICogVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCi0gKiBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKLSAqIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKLSAqCi0gKi8KLXR5cGUgVFRyYW5zcG9ydEZhY3RvcnkgaW50ZXJmYWNlIHsKLSAgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQKLX0KLQotdHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQotCi0vKioKLSAqIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgotICoKLSAqIEBwYXJhbSB0cmFucyBUaGUgYmFzZSB0cmFuc3BvcnQKLSAqIEByZXR1cm4gV3JhcHBlZCBUcmFuc3BvcnQKLSAqLwotZnVuYyAocCAqdFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLSAgcmV0dXJuIHRyYW5zCi19Ci0KLWZ1bmMgTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gIHJldHVybiAmdFRyYW5zcG9ydEZhY3Rvcnl7fQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90dHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfdGVzdC5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1OGE3NC4uMDAwMDAwMAotLS0gYS9saWIvZ28vdGhyaWZ0L3R0cmFuc3BvcnRfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0X3Rlc3QKLQotaW1wb3J0ICgKLSAgLiAidGhyaWZ0IgotICAidGVzdGluZyIKLSAgIm5ldCIKLSAgIm9zIgotICAic3RyY29udiIKLSkKLQotY29uc3QgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUgPSA0MDk2Ci0KLXZhciAoCi0gIHRyYW5zcG9ydF9iZGF0YSBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKLSkKLQotZnVuYyBpbml0KCkgewotICB0cmFuc3BvcnRfYmRhdGEgPSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCi0gIGZvciBpIDo9IDA7IGkgPCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKLSAgICB0cmFuc3BvcnRfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKLSAgfQotfQotCi1mdW5jIFRyYW5zcG9ydFRlc3QodCAqdGVzdGluZy5ULCB3cml0ZVRyYW5zIFRUcmFuc3BvcnQsIHJlYWRUcmFucyBUVHJhbnNwb3J0KSB7Ci0gIGJ1ZiA6PSBtYWtlKFtdYnl0ZSwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCi0gIGlmICF3cml0ZVRyYW5zLklzT3BlbigpIHsKLSAgICBlcnIgOj0gd3JpdGVUcmFucy5PcGVuKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IG9wZW4gd3JpdGUgdHJhbnNwb3J0OiAlcyIsIHdyaXRlVHJhbnMsIGVycikKLSAgICB9Ci0gIH0KLSAgaWYgIXJlYWRUcmFucy5Jc09wZW4oKSB7Ci0gICAgZXJyIDo9IHJlYWRUcmFucy5PcGVuKCkKLSAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IG9wZW4gcmVhZCB0cmFuc3BvcnQ6ICVzIiwgcmVhZFRyYW5zLCBlcnIpCi0gICAgfQotICB9Ci0gIF8sIGVyciA6PSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCi0gIH0KLSAgZXJyID0gd3JpdGVUcmFucy5GbHVzaCgpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKLSAgfQotICBuLCBlcnIgOj0gcmVhZFRyYW5zLlJlYWRBbGwoYnVmKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICB0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCByZWFkVHJhbnMsIFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFLCBlcnIpCi0gIH0KLSAgaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSIsIHJlYWRUcmFucywgbiwgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUpCi0gIH0KLSAgZm9yIGssIHYgOj0gcmFuZ2UgYnVmIHsKLSAgICBpZiB2ICE9IHRyYW5zcG9ydF9iZGF0YVtrXSB7Ci0gICAgICB0LkZhdGFsZigiVHJhbnNwb3J0ICVUIHJlYWQgJWQgaW5zdGVhZCBvZiAlZCBmb3IgaW5kZXggJWQgb2YgYmluYXJ5IGRhdGEgMiIsIHJlYWRUcmFucywgdiwgdHJhbnNwb3J0X2JkYXRhW2tdLCBrKQotICAgIH0KLSAgfQotICBfLCBlcnIgPSB3cml0ZVRyYW5zLldyaXRlKHRyYW5zcG9ydF9iZGF0YSkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgMiBvZiBsZW5ndGggJWQ6ICVzIiwgd3JpdGVUcmFucywgbGVuKHRyYW5zcG9ydF9iZGF0YSksIGVycikKLSAgfQotICBlcnIgPSB3cml0ZVRyYW5zLkZsdXNoKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgZmx1c2ggd3JpdGUgYmluYXJ5IGRhdGEgMjogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCi0gIH0KLSAgYiA6PSByZWFkVHJhbnMuUGVlaygpCi0gIGlmIGIgIT0gdHJ1ZSB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZXR1cm5lZCAlcyBmb3IgUGVlaygpIiwgcmVhZFRyYW5zLCBiKQotICB9Ci0gIGJ1ZiA9IG1ha2UoW11ieXRlLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKLSAgcmVhZCA6PSAxCi0gIGZvciBuID0gMDsgbiA8IFRSQU5TUE9SVF9CSU5BUllfREFUQV9TSVpFICYmIHJlYWQgIT0gMDsgewotICAgIHJlYWQsIGVyciA9IHJlYWRUcmFucy5SZWFkKGJ1ZltuOl0pCi0gICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICB0LkVycm9yZigiVHJhbnNwb3J0ICVUIGNhbm5vdCByZWFkIGJpbmFyeSBkYXRhIDIgb2YgdG90YWwgbGVuZ3RoICVkIGZyb20gb2Zmc2V0ICVkOiAlcyIsIHJlYWRUcmFucywgVFJBTlNQT1JUX0JJTkFSWV9EQVRBX1NJWkUsIG4sIGVycikKLSAgICB9Ci0gICAgbiArPSByZWFkCi0gIH0KLSAgaWYgbiAhPSBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCByZWFkIG9ubHkgJWQgaW5zdGVhZCBvZiAlZCBieXRlcyBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCBuLCBUUkFOU1BPUlRfQklOQVJZX0RBVEFfU0laRSkKLSAgfQotICBmb3IgaywgdiA6PSByYW5nZSBidWYgewotICAgIGlmIHYgIT0gdHJhbnNwb3J0X2JkYXRhW2tdIHsKLSAgICAgIHQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgcmVhZCAlZCBpbnN0ZWFkIG9mICVkIGZvciBpbmRleCAlZCBvZiBiaW5hcnkgZGF0YSAyIiwgcmVhZFRyYW5zLCB2LCB0cmFuc3BvcnRfYmRhdGFba10sIGspCi0gICAgfQotICB9Ci19Ci0KLWZ1bmMgQ2xvc2VUcmFuc3BvcnRzKHQgKnRlc3RpbmcuVCwgcmVhZFRyYW5zIFRUcmFuc3BvcnQsIHdyaXRlVHJhbnMgVFRyYW5zcG9ydCkgewotICBlcnIgOj0gcmVhZFRyYW5zLkNsb3NlKCkKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgY2xvc2UgcmVhZCB0cmFuc3BvcnQ6ICVzIiwgcmVhZFRyYW5zLCBlcnIpCi0gIH0KLSAgaWYgd3JpdGVUcmFucyAhPSByZWFkVHJhbnMgewotICAgIGVyciA9IHdyaXRlVHJhbnMuQ2xvc2UoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgdC5FcnJvcmYoIlRyYW5zcG9ydCAlVCBjYW5ub3QgY2xvc2Ugd3JpdGUgdHJhbnNwb3J0OiAlcyIsIHdyaXRlVHJhbnMsIGVycikKLSAgICB9Ci0gIH0KLX0KLQotZnVuYyBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydChzdGFydFBvcnQgaW50KSAobmV0LkFkZHIsIG9zLkVycm9yKSB7Ci0gIGZvciBpIDo9IHN0YXJ0UG9ydDsgaSA8IDY1NTM1OyBpKysgewotICAgIHMgOj0gIjEyNy4wLjAuMToiICsgc3RyY29udi5JdG9hKGkpCi0gICAgbCwgZXJyIDo9IG5ldC5MaXN0ZW4oInRjcCIsIHMpCi0gICAgaWYgZXJyID09IG5pbCB7Ci0gICAgICBsLkNsb3NlKCkKLSAgICAgIHJldHVybiBuZXQuUmVzb2x2ZVRDUEFkZHIoInRjcCIsIHMpCi0gICAgfQotICB9Ci0gIHJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oVU5LTk9XTl9UUkFOU1BPUlRfRVhDRVBUSU9OLCAiQ291bGQgbm90IGZpbmQgYXZhaWxhYmxlIHNlcnZlciBwb3J0IikKLX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvdHR5cGUuZ28gYi9saWIvZ28vdGhyaWZ0L3R0eXBlLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI0YjM5Li4wMDAwMDAwCi0tLSBhL2xpYi9nby90aHJpZnQvdHR5cGUuZ28KKysrIC9kZXYvbnVsbApAQCAtMSw5NzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLWltcG9ydCAoCi0gICJjb250YWluZXIvbGlzdCIKLSAgImNvbnRhaW5lci92ZWN0b3IiCi0gICJzdHJjb252IgotKQotCi0vKioKLSAqIFR5cGUgY29uc3RhbnRzIGluIHRoZSBUaHJpZnQgcHJvdG9jb2wuCi0gKi8KLXR5cGUgVFR5cGUgYnl0ZQotCi1jb25zdCAoCi0gIFNUT1AgICAgPSAwCi0gIFZPSUQgICAgPSAxCi0gIEJPT0wgICAgPSAyCi0gIEJZVEUgICAgPSAzCi0gIEkwOCAgICAgPSAzCi0gIERPVUJMRSAgPSA0Ci0gIEkxNiAgICAgPSA2Ci0gIEkzMiAgICAgPSA4Ci0gIEk2NCAgICAgPSAxMAotICBTVFJJTkcgID0gMTEKLSAgVVRGNyAgICA9IDExCi0gIFNUUlVDVCAgPSAxMgotICBNQVAgICAgID0gMTMKLSAgU0VUICAgICA9IDE0Ci0gIExJU1QgICAgPSAxNQotICBFTlVNICAgID0gMTYKLSAgVVRGOCAgICA9IDE2Ci0gIFVURjE2ICAgPSAxNwotICBHRU5FUklDID0gMTI3Ci0pCi0KLWZ1bmMgKHAgVFR5cGUpIFN0cmluZygpIHN0cmluZyB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBTVE9QOgotICAgIHJldHVybiAiU1RPUCIKLSAgY2FzZSBWT0lEOgotICAgIHJldHVybiAiVk9JRCIKLSAgY2FzZSBCT09MOgotICAgIHJldHVybiAiQk9PTCIKLSAgY2FzZSBCWVRFOgotICAgIHJldHVybiAiQllURSIKLSAgY2FzZSBET1VCTEU6Ci0gICAgcmV0dXJuICJET1VCTEUiCi0gIGNhc2UgSTE2OgotICAgIHJldHVybiAiSTE2IgotICBjYXNlIEkzMjoKLSAgICByZXR1cm4gIkkzMiIKLSAgY2FzZSBJNjQ6Ci0gICAgcmV0dXJuICJJNjQiCi0gIGNhc2UgU1RSSU5HOgotICAgIHJldHVybiAiU1RSSU5HIgotICBjYXNlIFNUUlVDVDoKLSAgICByZXR1cm4gIlNUUlVDVCIKLSAgY2FzZSBNQVA6Ci0gICAgcmV0dXJuICJNQVAiCi0gIGNhc2UgU0VUOgotICAgIHJldHVybiAiU0VUIgotICBjYXNlIExJU1Q6Ci0gICAgcmV0dXJuICJMSVNUIgotICBjYXNlIEVOVU06Ci0gICAgcmV0dXJuICJFTlVNIgotICBjYXNlIFVURjE2OgotICAgIHJldHVybiAiVVRGMTYiCi0gIGNhc2UgR0VORVJJQzoKLSAgICByZXR1cm4gIkdFTkVSSUMiCi0gIH0KLSAgcmV0dXJuICJVbmtub3duIgotfQotCi1mdW5jIChwIFRUeXBlKSBJc0Jhc2VUeXBlKCkgYm9vbCB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBCT09MLCBCWVRFLCBET1VCTEUsIEkxNiwgSTMyLCBJNjQsIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNFbXB0eVR5cGUoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNFbnVtKCkgYm9vbCB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBFTlVNOgotICAgIHJldHVybiB0cnVlCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgcmV0dXJuIGZhbHNlCi19Ci0KLWZ1bmMgKHAgVFR5cGUpIElzTnVtZXJpY1R5cGUoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIEVOVU0sIEJPT0wsIEJZVEUsIERPVUJMRSwgSTE2LCBJMzIsIEk2NDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBJc1N0cmluZ1R5cGUoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIFNUUklORywgVVRGOCwgVVRGMTY6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNDb250YWluZXIoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIE1BUCwgU0VULCBMSVNUOgotICAgIHJldHVybiB0cnVlCi0gIGRlZmF1bHQ6Ci0gICAgcmV0dXJuIGZhbHNlCi0gIH0KLSAgcmV0dXJuIGZhbHNlCi19Ci0KLWZ1bmMgKHAgVFR5cGUpIElzU3RydWN0KCkgYm9vbCB7Ci0gIHN3aXRjaCBwIHsKLSAgY2FzZSBTVFJVQ1Q6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNNYXAoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIE1BUDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBJc0xpc3QoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIExJU1Q6Ci0gICAgcmV0dXJuIHRydWUKLSAgZGVmYXVsdDoKLSAgICByZXR1cm4gZmFsc2UKLSAgfQotICByZXR1cm4gZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgSXNTZXQoKSBib29sIHsKLSAgc3dpdGNoIHAgewotICBjYXNlIFNFVDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBJc0ludCgpIGJvb2wgewotICBzd2l0Y2ggcCB7Ci0gIGNhc2UgQllURSwgSTE2LCBJMzIsIEk2NDoKLSAgICByZXR1cm4gdHJ1ZQotICBkZWZhdWx0OgotICAgIHJldHVybiBmYWxzZQotICB9Ci0gIHJldHVybiBmYWxzZQotfQotCi1mdW5jIChwIFRUeXBlKSBDb2VyY2Uob3RoZXIgaW50ZXJmYWNle30pIFRUeXBlIHsKLSAgaWYgb3RoZXIgPT0gbmlsIHsKLSAgICByZXR1cm4gVFR5cGUoU1RPUCkKLSAgfQotICBzd2l0Y2ggYiA6PSBvdGhlci4odHlwZSkgewotICBkZWZhdWx0OgotICAgIHJldHVybiBUVHlwZShTVE9QKQotICBjYXNlIG5pbDoKLSAgICByZXR1cm4gVFR5cGUoU1RPUCkKLSAgY2FzZSBUVHlwZToKLSAgICByZXR1cm4gYgotICBjYXNlIGJ5dGU6Ci0gICAgcmV0dXJuIFRUeXBlKGIpCi0gIGNhc2UgaW50OgotICAgIHJldHVybiBUVHlwZShieXRlKGIpKQotICBjYXNlIGludDg6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgaW50MzI6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgaW50NjQ6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgdWludDoKLSAgICByZXR1cm4gVFR5cGUoYnl0ZShiKSkKLSAgY2FzZSB1aW50MzI6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoYikpCi0gIGNhc2UgdWludDY0OgotICAgIHJldHVybiBUVHlwZShieXRlKGIpKQotICBjYXNlIGZsb2F0MzI6Ci0gICAgcmV0dXJuIFRUeXBlKGJ5dGUoaW50KGIpKSkKLSAgY2FzZSBmbG9hdDY0OgotICAgIHJldHVybiBUVHlwZShieXRlKGludChiKSkpCi0gIH0KLSAgcmV0dXJuIFRUeXBlKFNUT1ApCi19Ci0KLWZ1bmMgKHAgVFR5cGUpIExlc3NUeXBlKG90aGVyIGludGVyZmFjZXt9KSBib29sIHsKLSAgcmV0dXJuIHAgPCBwLkNvZXJjZShvdGhlcikKLX0KLQotZnVuYyAocCBUVHlwZSkgTGVzcyhpLCBqIGludGVyZmFjZXt9KSBib29sIHsKLSAgY21wLCBvayA6PSBwLkNvbXBhcmUoaSwgaikKLSAgcmV0dXJuIG9rICYmIGNtcCA+IDAKLX0KLQotCi1mdW5jIChwIFRUeXBlKSBDb21wYXJlKGksIGogaW50ZXJmYWNle30pIChpbnQsIGJvb2wpIHsKLSAgaWYgaSA9PSBqIHsKLSAgICByZXR1cm4gMCwgdHJ1ZQotICB9Ci0gIGlmIGkgPT0gbmlsIHsKLSAgICBpZiBqID09IG5pbCB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gLTEsIHRydWUKLSAgfQotICBpZiBqID09IG5pbCB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBjaSwgaW9rIDo9IHAuQ29lcmNlRGF0YShpKQotICBjaiwgam9rIDo9IHAuQ29lcmNlRGF0YShqKQotICBpZiBpb2sgJiYgIWpvayB7Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgfQotICBpZiAhaW9rICYmIGpvayB7Ci0gICAgcmV0dXJuIC0xLCB0cnVlCi0gIH0KLSAgLy8gaG9wZWZ1bGx5IHRoaXMgZG9lc24ndCBoYXBwZW4gYXMgQ29tcGFyZSgpIHdvdWxkIGNvbnRpbnVvdXNseSByZXR1cm4gMCwgZmFsc2UKLSAgaWYgIWlvayAmJiAham9rIHsKLSAgICByZXR1cm4gMCwgZmFsc2UKLSAgfQotICBpZiBjaSA9PSBjaiB7Ci0gICAgcmV0dXJuIDAsIHRydWUKLSAgfQotICBpZiBjaSA9PSBuaWwgewotICAgIGlmIGNqID09IG5pbCB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gLTEsIHRydWUKLSAgfQotICBpZiBjaiA9PSBuaWwgewotICAgIHJldHVybiAxLCB0cnVlCi0gIH0KLSAgc3dpdGNoIHAgewotICBjYXNlIFNUT1AsIFZPSUQ6Ci0gICAgLy8gaG9wZWZ1bGx5IHRoaXMgZG9lc24ndCBoYXBwZW4gYXMgQ29tcGFyZSgpIHdvdWxkIGNvbnRpbnVvdXNseSByZXR1cm4gMCwgZmFsc2UKLSAgICByZXR1cm4gMCwgZmFsc2UKLSAgY2FzZSBCT09MOgotICAgIHZpIDo9IGNpLihib29sKQotICAgIHZqIDo9IGNqLihib29sKQotICAgIGlmIHZpID09IHZqIHsKLSAgICAgIHJldHVybiAwLCB0cnVlCi0gICAgfQotICAgIGlmIHZpID09IGZhbHNlIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICBjYXNlIEJZVEU6Ci0gICAgdmkgOj0gY2kuKGJ5dGUpCi0gICAgdmogOj0gY2ouKGJ5dGUpCi0gICAgaWYgdmkgPT0gdmogewotICAgICAgcmV0dXJuIDAsIHRydWUKLSAgICB9Ci0gICAgaWYgdmkgPCB2aiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgY2FzZSBET1VCTEU6Ci0gICAgdmkgOj0gY2kuKGZsb2F0NjQpCi0gICAgdmogOj0gY2ouKGZsb2F0NjQpCi0gICAgaWYgdmkgPT0gdmogewotICAgICAgcmV0dXJuIDAsIHRydWUKLSAgICB9Ci0gICAgaWYgdmkgPCB2aiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgY2FzZSBJMTY6Ci0gICAgdmkgOj0gY2kuKGludDE2KQotICAgIHZqIDo9IGNqLihpbnQxNikKLSAgICBpZiB2aSA9PSB2aiB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICBpZiB2aSA8IHZqIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICBjYXNlIEkzMjoKLSAgICB2aSA6PSBjaS4oaW50MzIpCi0gICAgdmogOj0gY2ouKGludDMyKQotICAgIGlmIHZpID09IHZqIHsKLSAgICAgIHJldHVybiAwLCB0cnVlCi0gICAgfQotICAgIGlmIHZpIDwgdmogewotICAgICAgcmV0dXJuIC0xLCB0cnVlCi0gICAgfQotICAgIHJldHVybiAxLCB0cnVlCi0gIGNhc2UgSTY0OgotICAgIHZpIDo9IGNpLihpbnQ2NCkKLSAgICB2aiA6PSBjai4oaW50NjQpCi0gICAgaWYgdmkgPT0gdmogewotICAgICAgcmV0dXJuIDAsIHRydWUKLSAgICB9Ci0gICAgaWYgdmkgPCB2aiB7Ci0gICAgICByZXR1cm4gLTEsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIDEsIHRydWUKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIHZpIDo9IGNpLihzdHJpbmcpCi0gICAgdmogOj0gY2ouKHN0cmluZykKLSAgICBpZiB2aSA9PSB2aiB7Ci0gICAgICByZXR1cm4gMCwgdHJ1ZQotICAgIH0KLSAgICBpZiB2aSA8IHZqIHsKLSAgICAgIHJldHVybiAtMSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gMSwgdHJ1ZQotICBjYXNlIFNUUlVDVDoKLSAgICBzaSA6PSBjaS4oVFN0cnVjdCkKLSAgICBzaiA6PSBjai4oVFN0cnVjdCkKLSAgICBpZiBjbXAgOj0gQ29tcGFyZVN0cmluZyhzaS5UaHJpZnROYW1lKCksIHNqLlRocmlmdE5hbWUoKSk7IGNtcCAhPSAwIHsKLSAgICAgIHJldHVybiBjbXAsIHRydWUKLSAgICB9Ci0gICAgaWYgY21wLCBvayA6PSBzaS5UU3RydWN0RmllbGRzKCkuQ29tcGFyZVRvKHNqLlRTdHJ1Y3RGaWVsZHMoKSk7ICFvayB8fCBjbXAgIT0gMCB7Ci0gICAgICByZXR1cm4gY21wLCBvawotICAgIH0KLSAgICBmb3IgZmllbGQgOj0gcmFuZ2Ugc2kuVFN0cnVjdEZpZWxkcygpLkl0ZXIoKSB7Ci0gICAgICBhIDo9IHNpLkF0dHJpYnV0ZUZyb21GaWVsZElkKGZpZWxkLklkKCkpCi0gICAgICBiIDo9IHNqLkF0dHJpYnV0ZUZyb21GaWVsZElkKGZpZWxkLklkKCkpCi0gICAgICBpZiBjbXAsIG9rIDo9IGZpZWxkLlR5cGVJZCgpLkNvbXBhcmUoYSwgYik7ICFvayB8fCBjbXAgIT0gMCB7Ci0gICAgICAgIHJldHVybiBjbXAsIG9rCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwLCB0cnVlCi0gIGNhc2UgTUFQOgotICAgIG1pIDo9IGNpLihUTWFwKQotICAgIG1qIDo9IGNqLihUTWFwKQotICAgIGVpIDo9IG1pLktleVR5cGUoKQotICAgIGlmIGVqIDo9IG1qLktleVR5cGUoKTsgZWkgIT0gZWogewotICAgICAgcmV0dXJuIENvbXBhcmVJbnQoaW50KGVpKSwgaW50KGVqKSksIHRydWUKLSAgICB9Ci0gICAgaWYgc2l6ZSA6PSBtaS5MZW4oKTsgc2l6ZSAhPSBtai5MZW4oKSB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChzaXplLCBtai5MZW4oKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYywgY29rIDo9IGVpLkNvbXBhcmUobWkuS2V5cygpLCBtai5LZXlzKCkpOyBjICE9IDAgfHwgIWNvayB7Ci0gICAgICByZXR1cm4gYywgY29rCi0gICAgfQotICAgIHJldHVybiBlaS5Db21wYXJlKG1pLlZhbHVlcygpLCBtai5WYWx1ZXMoKSkKLSAgY2FzZSBMSVNUOgotICAgIGxpIDo9IGNpLihUTGlzdCkKLSAgICBsaiA6PSBjai4oVExpc3QpCi0gICAgZWkgOj0gbGkuRWxlbVR5cGUoKQotICAgIGVqIDo9IGxqLkVsZW1UeXBlKCkKLSAgICBpZiBlaSAhPSBlaiB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChpbnQoZWkpLCBpbnQoZWopKSwgdHJ1ZQotICAgIH0KLSAgICBzaXplIDo9IGxpLkxlbigpCi0gICAgaWYgc2l6ZSAhPSBsai5MZW4oKSB7Ci0gICAgICByZXR1cm4gQ29tcGFyZUludChzaXplLCBsai5MZW4oKSksIHRydWUKLSAgICB9Ci0gICAgZm9yIGsgOj0gMDsgayA8IHNpemU7IGsrKyB7Ci0gICAgICB2aSA6PSBsaS5BdChrKQotICAgICAgdmogOj0gbGouQXQoaykKLSAgICAgIGMsIGNvayA6PSBlaS5Db21wYXJlKHZpLCB2aikKLSAgICAgIGlmIGMgIT0gMCB8fCAhY29rIHsKLSAgICAgICAgcmV0dXJuIGMsIGNvawotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMCwgdHJ1ZQotICBjYXNlIFNFVDoKLSAgICBsaSA6PSBjaS4oVFNldCkKLSAgICBsaiA6PSBjai4oVFNldCkKLSAgICBlaSA6PSBsaS5FbGVtVHlwZSgpCi0gICAgZWogOj0gbGouRWxlbVR5cGUoKQotICAgIGlmIGVpICE9IGVqIHsKLSAgICAgIHJldHVybiBDb21wYXJlSW50KGludChlaSksIGludChlaikpLCB0cnVlCi0gICAgfQotICAgIHNpemUgOj0gbGkuTGVuKCkKLSAgICBpZiBzaXplICE9IGxqLkxlbigpIHsKLSAgICAgIHJldHVybiBDb21wYXJlSW50KHNpemUsIGxqLkxlbigpKSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gZWkuQ29tcGFyZShsaS5WYWx1ZXMoKSwgbGouVmFsdWVzKCkpCi0gIGRlZmF1bHQ6Ci0gICAgcGFuaWMoIkludmFsaWQgdGhyaWZ0IHR5cGUgdG8gY29lcmNlIikKLSAgfQotICByZXR1cm4gMCwgZmFsc2UKLX0KLQotZnVuYyAocCBUVHlwZSkgQ29tcGFyZVZhbHVlQXJyYXlzKGxpLCBsaiBbXWludGVyZmFjZXt9KSAoaW50LCBib29sKSB7Ci0gIHNpemUgOj0gbGVuKGxpKQotICBpZiBjbXAgOj0gQ29tcGFyZUludChzaXplLCBsZW4obGopKTsgY21wICE9IDAgewotICAgIHJldHVybiBjbXAsIHRydWUKLSAgfQotICBmb3IgaSA6PSAwOyBpIDwgc2l6ZTsgaSsrIHsKLSAgICB2aSA6PSBsaVtpXQotICAgIHZqIDo9IGxqW2ldCi0gICAgYywgY29rIDo9IHAuQ29tcGFyZSh2aSwgdmopCi0gICAgaWYgYyAhPSAwIHx8ICFjb2sgewotICAgICAgcmV0dXJuIGMsIGNvawotICAgIH0KLSAgfQotICByZXR1cm4gMCwgdHJ1ZQotfQotCi1mdW5jIChwIFRUeXBlKSBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wgewotICByZXR1cm4gcCA9PSBwLkNvZXJjZShvdGhlcikKLX0KLQotdHlwZSBTdHJpbmdlciBpbnRlcmZhY2UgewotICBTdHJpbmcoKSBzdHJpbmcKLX0KLQotdHlwZSBFbnVtZXIgaW50ZXJmYWNlIHsKLSAgU3RyaW5nKCkgc3RyaW5nCi0gIFZhbHVlKCkgaW50Ci0gIElzRW51bSgpIGJvb2wKLX0KLQotZnVuYyBUeXBlRnJvbVZhbHVlKGRhdGEgaW50ZXJmYWNle30pIFRUeXBlIHsKLSAgc3dpdGNoIGkgOj0gZGF0YS4odHlwZSkgewotICBkZWZhdWx0OgotICAgIHJldHVybiBTVE9QCi0gIGNhc2UgbmlsOgotICAgIHJldHVybiBWT0lECi0gIGNhc2UgYm9vbDoKLSAgICByZXR1cm4gQk9PTAotICBjYXNlIGZsb2F0MzIsIGZsb2F0NjQ6Ci0gICAgcmV0dXJuIERPVUJMRQotICBjYXNlIGludCwgaW50MzI6Ci0gICAgcmV0dXJuIEkzMgotICBjYXNlIGJ5dGU6Ci0gICAgcmV0dXJuIEJZVEUKLSAgY2FzZSBpbnQ4OgotICAgIHJldHVybiBJMDgKLSAgY2FzZSBpbnQxNjoKLSAgICByZXR1cm4gSTE2Ci0gIGNhc2UgaW50NjQ6Ci0gICAgcmV0dXJuIEk2NAotICBjYXNlIHN0cmluZzoKLSAgICByZXR1cm4gU1RSSU5HCi0gIGNhc2UgVFN0cnVjdDoKLSAgICByZXR1cm4gU1RSVUNUCi0gIGNhc2UgVE1hcDoKLSAgICByZXR1cm4gTUFQCi0gIGNhc2UgVFNldDoKLSAgICByZXR1cm4gU0VUCi0gIGNhc2UgW11pbnRlcmZhY2V7fSwgKmxpc3QuTGlzdCwgKnZlY3Rvci5WZWN0b3IsIFRMaXN0OgotICAgIHJldHVybiBMSVNUCi0gIH0KLSAgcmV0dXJuIFNUT1AKLX0KLQotZnVuYyAocCBUVHlwZSkgQ29lcmNlRGF0YShkYXRhIGludGVyZmFjZXt9KSAoaW50ZXJmYWNle30sIGJvb2wpIHsKLSAgaWYgZGF0YSA9PSBuaWwgewotICAgIHN3aXRjaCBwIHsKLSAgICBjYXNlIFNUT1A6Ci0gICAgICByZXR1cm4gbmlsLCB0cnVlCi0gICAgY2FzZSBWT0lEOgotICAgICAgcmV0dXJuIG5pbCwgdHJ1ZQotICAgIGNhc2UgQk9PTDoKLSAgICAgIHJldHVybiBmYWxzZSwgdHJ1ZQotICAgIGNhc2UgQllURToKLSAgICAgIHJldHVybiBieXRlKDApLCB0cnVlCi0gICAgY2FzZSBET1VCTEU6Ci0gICAgICByZXR1cm4gZmxvYXQ2NCgwKSwgdHJ1ZQotICAgIGNhc2UgSTE2OgotICAgICAgcmV0dXJuIGludDE2KDApLCB0cnVlCi0gICAgY2FzZSBJMzI6Ci0gICAgICByZXR1cm4gaW50MzIoMCksIHRydWUKLSAgICBjYXNlIEk2NDoKLSAgICAgIHJldHVybiBpbnQ2NCgwKSwgdHJ1ZQotICAgIGNhc2UgU1RSSU5HLCBVVEY4LCBVVEYxNjoKLSAgICAgIHJldHVybiAiIiwgdHJ1ZQotICAgIGNhc2UgU1RSVUNUOgotICAgICAgcmV0dXJuIE5ld1RTdHJ1Y3RFbXB0eSgiIiksIHRydWUKLSAgICBjYXNlIE1BUDoKLSAgICAgIHJldHVybiBOZXdUTWFwRGVmYXVsdCgpLCB0cnVlCi0gICAgY2FzZSBMSVNUOgotICAgICAgcmV0dXJuIE5ld1RMaXN0RGVmYXVsdCgpLCB0cnVlCi0gICAgY2FzZSBTRVQ6Ci0gICAgICByZXR1cm4gTmV3VFNldERlZmF1bHQoKSwgdHJ1ZQotICAgIGRlZmF1bHQ6Ci0gICAgICBwYW5pYygiSW52YWxpZCB0aHJpZnQgdHlwZSB0byBjb2VyY2UiKQotICAgIH0KLSAgfQotICBzd2l0Y2ggcCB7Ci0gIGNhc2UgU1RPUDoKLSAgICByZXR1cm4gbmlsLCB0cnVlCi0gIGNhc2UgVk9JRDoKLSAgICByZXR1cm4gbmlsLCB0cnVlCi0gIGNhc2UgQk9PTDoKLSAgICBzd2l0Y2ggYiA6PSBkYXRhLih0eXBlKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZSwgZmFsc2UKLSAgICBjYXNlIGJvb2w6Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIGNhc2UgTnVtZXJpYzoKLSAgICAgIHJldHVybiBib29sKGIuSW50KCkgIT0gMCksIHRydWUKLSAgICBjYXNlIGludDoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIGJ5dGU6Ci0gICAgICByZXR1cm4gYiAhPSAwLCB0cnVlCi0gICAgY2FzZSBpbnQ4OgotICAgICAgcmV0dXJuIGIgIT0gMCwgdHJ1ZQotICAgIGNhc2UgaW50MTY6Ci0gICAgICByZXR1cm4gYiAhPSAwLCB0cnVlCi0gICAgY2FzZSBpbnQzMjoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIGludDY0OgotICAgICAgcmV0dXJuIGIgIT0gMCwgdHJ1ZQotICAgIGNhc2UgdWludDoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIHVpbnQxNjoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIHVpbnQzMjoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIHVpbnQ2NDoKLSAgICAgIHJldHVybiBiICE9IDAsIHRydWUKLSAgICBjYXNlIGZsb2F0MzI6Ci0gICAgICByZXR1cm4gYiAhPSAwLCB0cnVlCi0gICAgY2FzZSBmbG9hdDY0OgotICAgICAgcmV0dXJuIGIgIT0gMCwgdHJ1ZQotICAgIGNhc2UgU3RyaW5nZXI6Ci0gICAgICB2IDo9IGIuU3RyaW5nKCkKLSAgICAgIGlmIHYgPT0gImZhbHNlIiB8fCB2ID09ICIwIiB8fCBsZW4odikgPT0gMCB7Ci0gICAgICAgIHJldHVybiBmYWxzZSwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWUsIHRydWUKLSAgICBjYXNlIHN0cmluZzoKLSAgICAgIGlmIGIgPT0gImZhbHNlIiB8fCBiID09ICIwIiB8fCBsZW4oYikgPT0gMCB7Ci0gICAgICAgIHJldHVybiBmYWxzZSwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWUsIHRydWUKLSAgICB9Ci0gIGNhc2UgQllURToKLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGIsIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBiLkJ5dGUoKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihib29sKTsgb2sgewotICAgICAgaWYgYiB7Ci0gICAgICAgIHJldHVybiBieXRlKDEpLCB0cnVlCi0gICAgICB9Ci0gICAgICByZXR1cm4gYnl0ZSgwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gYnl0ZShiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQ4KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gYnl0ZShiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQzMik7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDY0KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ4KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDE2KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDY0KTsgb2sgewotICAgICAgcmV0dXJuIGJ5dGUoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQzMik7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBieXRlKGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oU3RyaW5nZXIpOyBvayB7Ci0gICAgICBkYXRhID0gYi5TdHJpbmcoKQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgICBpMSwgZXJyIDo9IHN0cmNvbnYuQXRvaShiKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBieXRlKGludChpMSkpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBieXRlKDApLCBmYWxzZQotICBjYXNlIERPVUJMRToKLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGZsb2F0NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBiLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKE51bWVyaWMpOyBvayB7Ci0gICAgICByZXR1cm4gYm9vbChiLkZsb2F0NjQoKSAhPSAwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJ5dGUpOyBvayB7Ci0gICAgICByZXR1cm4gZmxvYXQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihib29sKTsgb2sgewotICAgICAgaWYgYiB7Ci0gICAgICAgIHJldHVybiBmbG9hdDY0KDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBmbG9hdDY0KDAuMCksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50KTsgb2sgewotICAgICAgcmV0dXJuIGZsb2F0NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDE2KTsgb2sgewotICAgICAgcmV0dXJuIGZsb2F0NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MzIpOyBvayB7Ci0gICAgICByZXR1cm4gZmxvYXQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gZmxvYXQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQxNik7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQzMik7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBmbG9hdDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFN0cmluZ2VyKTsgb2sgewotICAgICAgZGF0YSA9IGIuU3RyaW5nKCkKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oc3RyaW5nKTsgb2sgewotICAgICAgZDEsIGVyciA6PSBzdHJjb252LkF0b2Y2NChiKQotICAgICAgaWYgZXJyICE9IG5pbCB7Ci0gICAgICAgIHJldHVybiBkMSwgdHJ1ZQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmxvYXQ2NCgwKSwgZmFsc2UKLSAgY2FzZSBJMTY6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBib29sKGIuSW50MTYoKSAhPSAwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGludDE2KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuIGludDE2KDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbnQxNigwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDgpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MzIpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MTYoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDE2KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDE2KGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQxNihpbnQoYikpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFN0cmluZ2VyKTsgb2sgewotICAgICAgZGF0YSA9IGIuU3RyaW5nKCkKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oc3RyaW5nKTsgb2sgewotICAgICAgaTEsIGVyciA6PSBzdHJjb252LkF0b2koYikKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gaW50MTYoaTEpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnQxNigwKSwgZmFsc2UKLSAgY2FzZSBJMzI6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MzIpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBib29sKGIuSW50MzIoKSAhPSAwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGludDMyKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuIGludDMyKDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbnQzMigwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDgpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50MzIoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDMyKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDMyKGludChiKSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQzMihpbnQoYikpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFN0cmluZ2VyKTsgb2sgewotICAgICAgZGF0YSA9IGIuU3RyaW5nKCkKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oc3RyaW5nKTsgb2sgewotICAgICAgaTEsIGVyciA6PSBzdHJjb252LkF0b2koYikKLSAgICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgICByZXR1cm4gaW50MzIoaTEpLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnQzMigwKSwgZmFsc2UKLSAgY2FzZSBJNjQ6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQzMik7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oTnVtZXJpYyk7IG9rIHsKLSAgICAgIHJldHVybiBib29sKGIuSW50NjQoKSAhPSAwKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihieXRlKTsgb2sgewotICAgICAgcmV0dXJuIGludDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuIGludDY0KDEuMCksIHRydWUKLSAgICAgIH0KLSAgICAgIHJldHVybiBpbnQ2NCgwLjApLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDgpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBpbnQ2NChiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihmbG9hdDMyKTsgb2sgewotICAgICAgcmV0dXJuIGludDY0KGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGZsb2F0NjQpOyBvayB7Ci0gICAgICByZXR1cm4gaW50NjQoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oU3RyaW5nZXIpOyBvayB7Ci0gICAgICBkYXRhID0gYi5TdHJpbmcoKQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgICBpMSwgZXJyIDo9IHN0cmNvbnYuQXRvaTY0KGIpCi0gICAgICBpZiBlcnIgIT0gbmlsIHsKLSAgICAgICAgcmV0dXJuIGkxLCB0cnVlCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbnQ2NCgwKSwgZmFsc2UKLSAgY2FzZSBTVFJJTkcsIFVURjgsIFVURjE2OgotICAgIGlmIGIsIG9rIDo9IGRhdGEuKEVudW1lcik7IG9rIHsKLSAgICAgIGlmIGkxLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICAgIHJldHVybiBpMSwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuIGIuU3RyaW5nKCksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oU3RyaW5nZXIpOyBvayB7Ci0gICAgICByZXR1cm4gYi5TdHJpbmcoKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihzdHJpbmcpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJ5dGUpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGJvb2wpOyBvayB7Ci0gICAgICBpZiBiIHsKLSAgICAgICAgcmV0dXJuICJ0cnVlIiwgdHJ1ZQotICAgICAgfQotICAgICAgcmV0dXJuICJmYWxzZSIsIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50OCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oaW50MTYpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGludDMyKTsgb2sgewotICAgICAgcmV0dXJuIHN0cmluZyhiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLihpbnQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDgpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKHVpbnQxNik7IG9rIHsKLSAgICAgIHJldHVybiBzdHJpbmcoYiksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4odWludDMyKTsgb2sgewotICAgICAgcmV0dXJuIHN0cmluZyhiKSwgdHJ1ZQotICAgIH0KLSAgICBpZiBiLCBvayA6PSBkYXRhLih1aW50NjQpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyaW5nKGIpLCB0cnVlCi0gICAgfQotICAgIGlmIGIsIG9rIDo9IGRhdGEuKGZsb2F0MzIpOyBvayB7Ci0gICAgICByZXR1cm4gc3RyY29udi5GdG9hMzIoYiwgJ2cnLCAtMSksIHRydWUKLSAgICB9Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oZmxvYXQ2NCk7IG9rIHsKLSAgICAgIHJldHVybiBzdHJjb252LkZ0b2E2NChiLCAnZycsIC0xKSwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gIiIsIGZhbHNlCi0gIGNhc2UgU1RSVUNUOgotICAgIGlmIGIsIG9rIDo9IGRhdGEuKFRTdHJ1Y3QpOyBvayB7Ci0gICAgICByZXR1cm4gYiwgdHJ1ZQotICAgIH0KLSAgICByZXR1cm4gTmV3VFN0cnVjdEVtcHR5KCIiKSwgdHJ1ZQotICBjYXNlIE1BUDoKLSAgICBpZiBiLCBvayA6PSBkYXRhLihUTWFwKTsgb2sgewotICAgICAgcmV0dXJuIGIsIHRydWUKLSAgICB9Ci0gICAgcmV0dXJuIE5ld1RNYXBEZWZhdWx0KCksIGZhbHNlCi0gIGNhc2UgTElTVDoKLSAgICBpZiBiLCBvayA6PSBkYXRhLihUTGlzdCk7IG9rIHsKLSAgICAgIHJldHVybiBiLCB0cnVlCi0gICAgfQotICAgIHJldHVybiBOZXdUTGlzdERlZmF1bHQoKSwgZmFsc2UKLSAgY2FzZSBTRVQ6Ci0gICAgaWYgYiwgb2sgOj0gZGF0YS4oVFNldCk7IG9rIHsKLSAgICAgIHJldHVybiBiLCB0cnVlCi0gICAgfQotICAgIHJldHVybiBOZXdUU2V0RGVmYXVsdCgpLCBmYWxzZQotICBkZWZhdWx0OgotICAgIHBhbmljKCJJbnZhbGlkIHRocmlmdCB0eXBlIHRvIGNvZXJjZSIpCi0gIH0KLSAgcmV0dXJuIG5pbCwgZmFsc2UKLX0KLQotdHlwZSBFcXVhbHNPdGhlckludGVyZmFjZSBpbnRlcmZhY2UgewotICBFcXVhbHMob3RoZXIgaW50ZXJmYWNle30pIGJvb2wKLX0KLQotdHlwZSBFcXVhbHNNYXAgaW50ZXJmYWNlIHsKLSAgRXF1YWxzKG90aGVyIFRNYXApIGJvb2wKLX0KLQotdHlwZSBFcXVhbHNTZXQgaW50ZXJmYWNlIHsKLSAgRXF1YWxzKG90aGVyIFRTZXQpIGJvb2wKLX0KLQotdHlwZSBFcXVhbHNMaXN0IGludGVyZmFjZSB7Ci0gIEVxdWFscyhvdGhlciBUTGlzdCkgYm9vbAotfQotCi10eXBlIEVxdWFsc1N0cnVjdCBpbnRlcmZhY2UgewotICBFcXVhbHMob3RoZXIgVFN0cnVjdCkgYm9vbAotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90eXBlLmdvIGIvbGliL2dvL3RocmlmdC90eXBlLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTJmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3R5cGUuZ28KQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCisvLyBUeXBlIGNvbnN0YW50cyBpbiB0aGUgVGhyaWZ0IHByb3RvY29sCit0eXBlIFRUeXBlIGJ5dGUKKworY29uc3QgKAorCVNUT1AgICA9IDAKKwlWT0lEICAgPSAxCisJQk9PTCAgID0gMgorCUJZVEUgICA9IDMKKwlJMDggICAgPSAzCisJRE9VQkxFID0gNAorCUkxNiAgICA9IDYKKwlJMzIgICAgPSA4CisJSTY0ICAgID0gMTAKKwlTVFJJTkcgPSAxMQorCVVURjcgICA9IDExCisJU1RSVUNUID0gMTIKKwlNQVAgICAgPSAxMworCVNFVCAgICA9IDE0CisJTElTVCAgID0gMTUKKwlVVEY4ICAgPSAxNgorCVVURjE2ICA9IDE3CisJLy9CSU5BUlkgPSAxOCAgIHdyb25nIGFuZCB1bnVzdWVkCispCisKK3ZhciB0eXBlTmFtZXMgPSBtYXBbaW50XXN0cmluZ3sKKwlTVE9QOiAgICJTVE9QIiwKKwlWT0lEOiAgICJWT0lEIiwKKwlCT09MOiAgICJCT09MIiwKKwlCWVRFOiAgICJCWVRFIiwKKwlET1VCTEU6ICJET1VCTEUiLAorCUkxNjogICAgIkkxNiIsCisJSTMyOiAgICAiSTMyIiwKKwlJNjQ6ICAgICJJNjQiLAorCVNUUklORzogIlNUUklORyIsCisJU1RSVUNUOiAiU1RSVUNUIiwKKwlNQVA6ICAgICJNQVAiLAorCVNFVDogICAgIlNFVCIsCisJTElTVDogICAiTElTVCIsCisJVVRGODogICAiVVRGOCIsCisJVVRGMTY6ICAiVVRGMTYiLAorfQorCitmdW5jIChwIFRUeXBlKSBTdHJpbmcoKSBzdHJpbmcgeworCWlmIHMsIG9rIDo9IHR5cGVOYW1lc1tpbnQocCldOyBvayB7CisJCXJldHVybiBzCisJfQorCXJldHVybiAiVW5rbm93biIKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDQyNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCkBAIC0wLDAgKzEsMTMyIEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICgKKwkiY29tcHJlc3MvemxpYiIKKwkiY29udGV4dCIKKwkiaW8iCisJImxvZyIKKykKKworLy8gVFpsaWJUcmFuc3BvcnRGYWN0b3J5IGlzIGEgZmFjdG9yeSBmb3IgVFpsaWJUcmFuc3BvcnQgaW5zdGFuY2VzCit0eXBlIFRabGliVHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3QgeworCWxldmVsICAgaW50CisJZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeQorfQorCisvLyBUWmxpYlRyYW5zcG9ydCBpcyBhIFRUcmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCBtYWtlcyB1c2Ugb2YgemxpYiBjb21wcmVzc2lvbi4KK3R5cGUgVFpsaWJUcmFuc3BvcnQgc3RydWN0IHsKKwlyZWFkZXIgICAgaW8uUmVhZENsb3NlcgorCXRyYW5zcG9ydCBUVHJhbnNwb3J0CisJd3JpdGVyICAgICp6bGliLldyaXRlcgorfQorCisvLyBHZXRUcmFuc3BvcnQgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOZXdUWmxpYlRyYW5zcG9ydAorZnVuYyAocCAqVFpsaWJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJaWYgcC5mYWN0b3J5ICE9IG5pbCB7CisJCS8vIHdyYXAgb3RoZXIgZmFjdG9yeQorCQl2YXIgZXJyIGVycm9yCisJCXRyYW5zLCBlcnIgPSBwLmZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXJldHVybiBuaWwsIGVycgorCQl9CisJfQorCXJldHVybiBOZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgcC5sZXZlbCkKK30KKworLy8gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5IGNvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeShsZXZlbCBpbnQpICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogbmlsfQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydEZhY3RvcnkKKy8vIGFzIGEgd3JhcHBlciBvdmVyIGV4aXN0aW5nIHRyYW5zcG9ydCBmYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KGxldmVsIGludCwgZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsLCBmYWN0b3J5OiBmYWN0b3J5fQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFRabGliVHJhbnNwb3J0CitmdW5jIE5ld1RabGliVHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQsIGxldmVsIGludCkgKCpUWmxpYlRyYW5zcG9ydCwgZXJyb3IpIHsKKwl3LCBlcnIgOj0gemxpYi5OZXdXcml0ZXJMZXZlbCh0cmFucywgbGV2ZWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWxvZy5QcmludGxuKGVycikKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydHsKKwkJd3JpdGVyOiAgICB3LAorCQl0cmFuc3BvcnQ6IHRyYW5zLAorCX0sIG5pbAorfQorCisvLyBDbG9zZSBjbG9zZXMgdGhlIHJlYWRlciBhbmQgd3JpdGVyIChmbHVzaGluZyBhbnkgdW53cml0dGVuIGRhdGEpIGFuZCBjbG9zZXMKKy8vIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlpZiB6LnJlYWRlciAhPSBuaWwgeworCQlpZiBlcnIgOj0gei5yZWFkZXIuQ2xvc2UoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKwl9CisJaWYgZXJyIDo9IHoud3JpdGVyLkNsb3NlKCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCXJldHVybiB6LnRyYW5zcG9ydC5DbG9zZSgpCit9CisKKy8vIEZsdXNoIGZsdXNoZXMgdGhlIHdyaXRlciBhbmQgaXRzIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKKwlpZiBlcnIgOj0gei53cml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJcmV0dXJuIHoudHJhbnNwb3J0LkZsdXNoKGN0eCkKK30KKworLy8gSXNPcGVuIHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBJc09wZW4oKSBib29sIHsKKwlyZXR1cm4gei50cmFuc3BvcnQuSXNPcGVuKCkKK30KKworLy8gT3BlbiBvcGVucyB0aGUgdHJhbnNwb3J0IGZvciBjb21tdW5pY2F0aW9uCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgT3BlbigpIGVycm9yIHsKKwlyZXR1cm4gei50cmFuc3BvcnQuT3BlbigpCit9CisKK2Z1bmMgKHogKlRabGliVHJhbnNwb3J0KSBSZWFkKHAgW11ieXRlKSAoaW50LCBlcnJvcikgeworCWlmIHoucmVhZGVyID09IG5pbCB7CisJCXIsIGVyciA6PSB6bGliLk5ld1JlYWRlcih6LnRyYW5zcG9ydCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gMCwgTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCisJCX0KKwkJei5yZWFkZXIgPSByCisJfQorCisJcmV0dXJuIHoucmVhZGVyLlJlYWQocCkKK30KKworLy8gUmVtYWluaW5nQnl0ZXMgcmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZGF0YSB0aGF0IGlzIHN0aWxsIHRvIGJlCisvLyByZWFkLgorZnVuYyAoeiAqVFpsaWJUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgdWludDY0IHsKKwlyZXR1cm4gei50cmFuc3BvcnQuUmVtYWluaW5nQnl0ZXMoKQorfQorCitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgV3JpdGUocCBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIHoud3JpdGVyLldyaXRlKHApCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M2ZjExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbXByZXNzL3psaWIiCisJInRlc3RpbmciCispCisKK2Z1bmMgVGVzdFpsaWJUcmFuc3BvcnQodCAqdGVzdGluZy5UKSB7CisJdHJhbnMsIGVyciA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIHpsaWIuQmVzdENvbXByZXNzaW9uKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCit9CisKK3R5cGUgRHVtbXlUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKkR1bW15VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyKCksIG5pbAorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoCisJCXpsaWIuQmVzdENvbXByZXNzaW9uLAorCQkmRHVtbXlUcmFuc3BvcnRGYWN0b3J5e30sCisJKQorCWJ1ZmZlciA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwl0cmFucywgZXJyIDo9IGZhY3RvcnkuR2V0VHJhbnNwb3J0KGJ1ZmZlcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhvdXRGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24sIG5pbCkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL1JFQURNRS5tZCBiL2xpYi9oYXhlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzRiNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTY0IEBACitUaHJpZnQgSGF4ZSBTb2Z0d2FyZSBMaWJyYXJ5CisKK0xpY2Vuc2UKKz09PT09PT0KKworTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKK1VzaW5nIFRocmlmdCB3aXRoIEhheGUKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitIYXhlIHNldHVwCistLS0tLS0tLS0tLS0tLS0KKworVGhyaWZ0IHJlcXVpcmVzIEhheGUgMy4xLjMuIEluc3RhbGxlcnMgZm9yIFdpbmRvd3MgYW5kIE9TWAorcGxhdGZvcm1zIGFyZSBhdmFpbGFibGUgYXQgYGh0dHA6Ly9oYXhlLm9yZy9kb3dubG9hZGAuIAorCitEZXBlbmRpbmcgb24gdGhlIGRlc2lyZWQgdGFyZ2V0cywgeW91IG1heSBoYXZlIHRvIGluc3RhbGwgdGhlIGFwcHJvcHJpYXRlIEhheGVMaWJzIAorYWZ0ZXIgaW5zdGFsbGluZyBIYXhlIGl0c2VsZi4gRm9yIGV4YW1wbGUsIGlmIHlvdSBwbGFuIHRvIHRhcmdldCBDIywgSmF2YSBhbmQgQysrLAorZW50ZXIgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBhZnRlciBpbnN0YWxsaW5nIEhheGU6CisKKyAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKKyAgICBoYXhlbGliIGluc3RhbGwgaHhqYXZhCisgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3MKKworRm9yIG90aGVyIHRhcmdldHMsIHBsZWFzZSBjb25zdWx0IHRoZSBIYXhlIGRvY3VtZW50YXRpb24gd2hldGhlciBvciBub3QgYW55IGFkZGl0aW9uYWwKK3RhcmdldCBsaWJyYXJpZXMgbmVlZCB0byBiZSBpbnN0YWxsZWQgYW5kIGhvdyB0byBhY2hpZXZlIHRoaXMuCisKKworSGF4ZSBvbiBMaW51eCAKKy0tLS0tLS0tLS0tLS0tLQorCitGb3IgTGludXggcGxhdGZvcm1zIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZGlzdHJvLXNwZWNpZmljIHBhY2thZ2UKK21hbmFnZXIsIHdoZXJlIHBvc3NpYmxlLiBNb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCB0aGUgCitIYXhlIExpbnV4IGRvd25sb2FkIHNlY3Rpb246IGh0dHA6Ly9oYXhlLm9yZy9kb3dubG9hZC9saW51eAorCitJZiB5b3UgcnVuIGludG8gdGhlIGVycm9yIG1lc3NhZ2UgCisKKyAgICBVbmNhdWdodCBleGNlcHRpb24gLSBsb2FkLmMoMjM3KSA6IEZhaWxlZCB0byBsb2FkIGxpYnJhcnkgOiAvdXNyL2xpYi9uZWtvL3JlZ2V4cC5uZGxsICAKKwkobGlicGNyZS5zby4zOiBjYW5ub3Qgb3BlbiBzaGFyZWQgb2JqZWN0IGZpbGU6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkpCisKK3RoaXMgY2FuIGJlIHNvbHZlZCBkZXBlbmRpbmcgb24geW91ciBPU2VzIGJpdG5lc3MgYnkgZWl0aGVyCisKKyAgICBzdWRvIGxuIC1zZiAvdXNyL2xpYi9saWJwY3JlLnNvLjEgL3Vzci9saWIvbGlicGNyZS5zby4zCisgICAgc3VkbyBsZGNvbmZpZworCQorb3IKKworICAgIHN1ZG8gbG4gLXNmIC91c3IvbGliNjQvbGlicGNyZS5zby4xIC91c3IvbGliNjQvbGlicGNyZS5zby4zCisgICAgc3VkbyBsZGNvbmZpZworCitUaHJpZnQgSGF4ZSBiaW5kaW5ncworLS0tLS0tLS0tLS0tLS0tLS0tLQorCQorVGhyaWZ0IEhheGUgYmluZGluZ3MgY2FuIGJlIHNldCB1cCB2aWEgdGhlIGBoYXhlbGliYCB0b29sICAKK2VpdGhlciBmcm9tIHRoZSBvZmZpY2lhbCBBU0YgcmVwbywgb3IgdmlhIHRoZSBnaXRodWIgbWlycm9yLgorCistIFRvIHNldCB1cCBhbnkgKipzdGFibGUgdmVyc2lvbioqLCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaCAoZS5nLiBgMS4wLjBgLCBldGMuKToKKworICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCAxLjAuMCBsaWIvaGF4ZWAKKworLSBUbyBzZXQgdXAgdGhlIGN1cnJlbnQgKipkZXZlbG9wbWVudCB2ZXJzaW9uKiosIHVzZSB0aGUgYG1hc3RlcmAgYnJhbmNoOgorICAKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IG1hc3RlciBsaWIvaGF4ZWAJCisgICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCBtYXN0ZXIgbGliL2hheGVgCisKK0FzIHVzdWFsLCB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgY2FuIGJlIHVwZGF0ZWQgdXNpbmcgYGhheGVsaWIgdXBncmFkZWAgCitvciBgaGF4ZWxpYiB1cGRhdGUgdGhyaWZ0YC4KKworSW4gb3JkZXIgdG8gd29yayB3aXRoIFRocmlmdCwgeW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgCitvciBidWlsZCBmcm9tIHNvdXJjZSwgZGVwZW5kaW5nIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gQXBwcm9wcmlhdGUgCitkb3dubG9hZHMgYW5kIG1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCQorVG8gZ2V0IHN0YXJ0ZWQsIHZpc2l0IHRoZSAvdHV0b3JpYWwvaGF4ZSBhbmQgL3Rlc3QvaGF4ZSBkaXJzIGZvciBleGFtcGxlcy4gCitJZiB5b3UgYXJlIHVzaW5nIEhJREUgb3IgdGhlIEZsYXNoRGV2ZWxvcCBJREUsIHlvdSdsbCBmaW5kIGFwcHJvcHJpYXRlIAorcHJvamVjdCBmaWxlcyBpbiB0aGVzZSBmb2xkZXJzLgorCisKK0N1cnJlbnQgc3RhdHVzCis9PT09PT09PT09PT09PT09PT09PT09PT0KKy0gdGVzdGVkIHdpdGggSGF4ZSBDKysgdGFyZ2V0CistIHRlc3RlZCB3aXRoIEhheGUgUEhQIHRhcmdldCAoY29uc29sZS93ZWIgc2VydmVyLCBiaW5hcnkgcHJvdG9jb2xzKQorLSB0cmFuc3BvcnRzOiBTb2NrZXQsIEhUVFAgKHNlcnZlcnMgcnVuIGluc2lkZSBQSFAgc2VydmVyL1BIUCB0YXJnZXQgb25seSksIFN0cmVhbQorLSBwcm90b2NvbHM6IEJpbmFyeSwgSlNPTiwgTXVsdGlwbGV4LCBDb21wYWN0CistIHR1dG9yaWFsIGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZQorLSBjcm9zcy10ZXN0IGNsaWVudCBhbmQgc2VydmVyIGF2YWlsYWJsZSAKKworCitGdXJ0aGVyIGRldmVsb3BtZW50cworPT09PT09PT09PT09PT09PT09PT09PT09CistIGltcHJvdmUgdG8gd29yayB3aXRoIEMjLCBKYXZhIGFuZCBKYXZhU2NyaXB0IEhheGUvT3BlbkZMIHRhcmdldHMKKy0gaW1wcm92ZSB0byB3b3JrIHdpdGggbW9yZSAoaWRlYWxseSBhbGwpIEhheGUvT3BlbkZMIHRhcmdldHMKKy0gYWRkIEhUVFAgc2VydmVyLCB1cGRhdGUgdHV0b3JpYWwgYW5kIHRlc3RzIGFjY29yZGluZ2x5CisKKworS25vd24gcmVzdHJpY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PT0KKworQWx0aG91Z2ggZGVzaWduZWQgd2l0aCBtYXhpbXVtIHBvcnRhYmlsaXR5IGluIG1pbmQsIGZvciB0ZWNobmljYWwgcmVhc29ucyBzb21lIHBsYXRmb3JtcworbWF5IG9ubHkgc3VwcG9ydCBwYXJ0cyBvZiB0aGUgbGlicmFyeSwgb3Igbm90IGJlIGNvbXBhdGlibGUgYXQgYWxsLgorCitKYXZhc2NyaXB0OgorLSB0dXRvcmlhbCBmYWlscyB0byBidWlsZCBiZWNhdXNlIG9mIHVuc3VwcG9ydGVkIFN5cy5hcmdzCisKK1BIUCBIVFRQIFNlcnZlciBub3RlcworPT09PT09PT09PT09PT09PT09PT09PT09CisKKy0geW91IGhhdmUgdG8gaW1wb3J0IFBIUCBmaWxlcyBnZW5lcmF0ZWQgYnkgaGF4ZSBpbnRvIFBIUAorYGBgcGhwCityZXF1aXJlX29uY2UgIGRpcm5hbWUoX19GSUxFX18pIC4gJy9iaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAnOworYGBgCisKKy0gdHJhY2UoKSBieSBkZWZhdWx0IG91dHB1dHMgaW50byBzdGRvdXQgKGh0dHAgcmVzcG9uc2UpLCBzbyB5b3UgaGF2ZSB0byByZWRpcmVjdCBpdCB0byBzdGRlcnIgb3IgeW91IG93biBsb2dzLCBzb21ldGhpbmcgbGlrZQorYGBgaGF4ZQorLy9yZW1hcCB0cmFjZSB0byBlcnJvciBsb2cKK2hheGUuTG9nLnRyYWNlID0gZnVuY3Rpb24odjpEeW5hbWljLCA/aW5mb3M6aGF4ZS5Qb3NJbmZvcykgCit7IAorCS8vc2ltdWxhdGUgbm9ybWFsIHRyYWNlIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2Jsb2IvZGV2ZWxvcG1lbnQvc3RkL2hheGUvTG9nLmh4CisJdmFyIG5ld1ZhbHVlIDogRHluYW1pYzsKKwlpZiAoaW5mb3MgIT0gbnVsbCAmJiBpbmZvcy5jdXN0b21QYXJhbXMhPW51bGwpIHsKKwkJdmFyIGV4dHJhOlN0cmluZyA9ICIiOworCQlmb3IoIHYgaW4gaW5mb3MuY3VzdG9tUGFyYW1zICkKKwkJCWV4dHJhICs9ICIsIiArIHY7CisJCW5ld1ZhbHVlID0gdiArIGV4dHJhOworCX0KKwllbHNlIHsKKwkJbmV3VmFsdWUgPSB2OworCX0KKwl2YXIgbXNnID0gaW5mb3MgIT0gbnVsbCA/IGluZm9zLmZpbGVOYW1lICsgJzonICsgaW5mb3MubGluZU51bWJlciArICc6ICcgOiAnJzsKKwlTeXMuc3RkZXJyKCkud3JpdGVTdHJpbmcoJyR7bXNnfSR7bmV3VmFsdWV9XG4nKTsKK30KK2BgYAorCistIHRvIGFsbG93IHRocmlmdCBzZXJ2ZXIgdG8gcmVhZC93cml0ZSBIVFRQIHJlcXVlc3QvcmVzcG9uc2UsIGl0IHNob3VsZCBiZSBwb2ludGVkIG91dCB0byBwaHAgc3RyZWFtcworYGBgaGF4ZQordHJhbnNwb3J0ID0JbmV3IFRXcmFwcGluZ1NlcnZlclRyYW5zcG9ydCgKKwkJCQluZXcgVFN0cmVhbVRyYW5zcG9ydCgKKwkJCQkJbmV3IFRGaWxlU3RyZWFtKCJwaHA6Ly9pbnB1dCIsIFJlYWQpLAorCQkJCQluZXcgVEZpbGVTdHJlYW0oInBocDovL291dHB1dCIsIEFwcGVuZCkKKwkJCQkJKQorCQkJCSk7CitgYGAKKworLSBUU2ltcGxlU2VydmVyIGRvZXNuJ3Qgc3RvcCBhZnRlciBmaXJzdCBjYWxsLCBzbyBwcm9jZXNzb3IucHJvY2VzcygpIHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCwgb3IgdXNlIHJ1bk9uY2UgcHJvcGVydHkgCitgYGBoYXhlCit2YXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoIHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc2ZhY3RvcnksIHByb3RmYWN0b3J5KTsKK3NlcnZlci5ydW5PbmNlID0gdHJ1ZTsKK2BgYAorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL2hheGVsaWIuanNvbiBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTJhZDkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvaGF4ZWxpYi5qc29uCkBAIC0wLDAgKzEsMTIgQEAKK3sKKwkibmFtZSI6ICJ0aHJpZnQiLAorCSJ1cmwiIDogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCisJImxpY2Vuc2UiOiAiQXBhY2hlIiwKKwkidGFncyI6IFsidGhyaWZ0IiwgInJwYyIsICJzZXJpYWxpemF0aW9uIiwgImNyb3NzIiwgImZyYW1ld29yayJdLAorCSJkZXNjcmlwdGlvbiI6ICJIYXhlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgYW5kIHNlcmlhbGl6YXRpb24gZnJhbWV3b3JrIiwKKwkidmVyc2lvbiI6ICIxLjAuMCIsCisJInJlbGVhc2Vub3RlIjogIkxpY2Vuc2VkIHVuZGVyIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gVGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkuIiwKKwkiY29udHJpYnV0b3JzIjogWyJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSJdLAorCSJkZXBlbmRlbmNpZXMiOiB7IH0sCisJImNsYXNzUGF0aCI6ICJzcmMiCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9BYnN0cmFjdE1ldGhvZEVycm9yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjgxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQWJzdHJhY3RNZXRob2RFcnJvci5oeApAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyNpZiBmbGFzaAoraW1wb3J0IGZsYXNoLmVycm9ycy5JbGxlZ2FsT3BlcmF0aW9uRXJyb3I7CisjZWxzZQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisjZW5kCisKK2NsYXNzIEFic3RyYWN0TWV0aG9kRXJyb3IKKyNpZiBmbGFzaAorZXh0ZW5kcyBJbGxlZ2FsT3BlcmF0aW9uRXJyb3IKKyNlbHNlCitleHRlbmRzIFRFeGNlcHRpb24KKyNlbmQKK3sKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobWVzc2FnZSA6IFN0cmluZz0iIikgeworICAgICAgICAgIHN1cGVyKCJBdHRlbXB0IHRvIGNhbGwgYW4gYWJzdHJhY3QgbWV0aG9kIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bcmd1bWVudEVycm9yLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTA0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXJndW1lbnRFcnJvci5oeApAQCAtMCwwICsxLDI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyNpZiAhIGZsYXNoCisvLyBwcmVkZWZpbmVkIGZvciBmbGFzaCBvbmx5CitjbGFzcyBBcmd1bWVudEVycm9yIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtc2cgOiBTdHJpbmcgPSAiIikgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KK30KKyNlbmQKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9MaW1pdHMuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWVjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvTGltaXRzLmh4CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworY2xhc3MgTGltaXRzIHsKKworICAgIC8vIEhheGUgbGltaXRzIGFyZSBub3QgZml4ZWQgdmFsdWVzLCB0aGV5IGRlcGVuZCBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtCisgICAgLy8gRm9yIGV4YW1wbGUsIG5la28gbGltaXRzIGFuIGludCB0byAzMSBiaXRzIGluc3RlYWQgb2YgMzIuIFNvIHdlIGRldGVjdAorICAgIC8vIHRoZSB2YWx1ZXMgb25jZSBkdXJpbmcgaW50aWFsaXNhdGlvbiBpbiBvcmRlciB0bworICAgIC8vIChhKSBnZXQgdGhlIHJpZ2h0IHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgIHBsYXRmb3JtLCBhbmQKKyAgICAvLyAoYikgcHJldmVudCB1cyBmcm9tIGRlcGVuZGVjaWVzIHRvIGEgYnVuY2ggb2YgZGVmaW5lcworCisgICAgcHVibGljIHN0YXRpYyB2YXIgSTMyX01BWCA9IHsKKyAgICAgICAgdmFyIGxhc3QgOiBJbnQgPSAwOworICAgICAgICB2YXIgbmV4dCA6IEludCA9IDA7CisgICAgICAgIGZvcihiaXQgaW4gMCAuLi4gMzIpIHsKKyAgICAgICAgICAgIGxhc3QgPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IGxhc3QgfCAoMSA8PCBiaXQpOworICAgICAgICAgICAgaWYobmV4dCA8IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsYXN0OyAvLyBmaW5hbCB2YWx1ZQorICAgIH0KKworICAgIC8vIGFkZCB3aGF0ZXZlciB5b3UgbmVlZAorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTg0NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmh4CkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZTsKKworICAvKioKKyAgICogQXBwbGljYXRpb24gbGV2ZWwgZXhjZXB0aW9uCisgICAqLworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgVEFQUExJQ0FUSU9OX0VYQ0VQVElPTl9TVFJVQ1QgPSB7IG5ldyBUU3RydWN0KCJUQXBwbGljYXRpb25FeGNlcHRpb24iKTsgfTsKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgTUVTU0FHRV9GSUVMRCA9IHsgbmV3IFRGaWVsZCgibWVzc2FnZSIsIFRUeXBlLlNUUklORywgMSk7IH07CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRZUEVfRklFTEQgPSB7IG5ldyBURmllbGQoInR5cGUiLCBUVHlwZS5JMzIsIDIpOyB9OworCisgICAgLy8gV0FSTklORzogVGhlc2UgYXJlIHN1YmplY3QgdG8gYmUgZXh0ZW5kZWQgaW4gdGhlIGZ1dHVyZSwgc28gd2UgY2FuJ3QgdXNlIGVudW1zCisgICAgLy8gd2l0aCBIYXhlIDMuMS4zIGJlY2F1c2Ugb2YgaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvaXNzdWVzLzM2NDkKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgVU5LTk9XTiA6IEludCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV05fTUVUSE9EIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9NRVNTQUdFX1RZUEUgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBXUk9OR19NRVRIT0RfTkFNRSA6IEludCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJBRF9TRVFVRU5DRV9JRCA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1JU1NJTkdfUkVTVUxUIDogSW50ID0gNTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5URVJOQUxfRVJST1IgOiBJbnQgPSA2OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBQUk9UT0NPTF9FUlJPUiA6IEludCA9IDc7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIElOVkFMSURfVFJBTlNGT1JNIDogSW50ID0gODsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9QUk9UT0NPTCA6IEludCA9IDk7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFIDogSW50ID0gMTA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHR5cGUgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIHR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgIHZhciBmaWVsZDpURmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKworICAgICAgdmFyIG1lc3NhZ2UgOiBTdHJpbmcgPSBudWxsOworICAgICAgdmFyIHR5cGUgOiBJbnQgPSBVTktOT1dOOworCisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBmaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBmaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgdHlwZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCk7CisgICAgICAgIGlmIChlcnJvck1zZyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfRklFTEQpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGVycm9yTXNnKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRZUEVfRklFTEQpOworICAgICAgICBvcHJvdC53cml0ZUkzMihlcnJvcklEKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTBiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuaHgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisvLyBNYWtlIHN1cmUgd2UgdXNlIGF0IGxlYXN0IDMuMS4zCisvLyBTb21lIExpbnV4IHBsYXRmb3JtcyBoYXZlIHdhYWFheSB0b28gb2xkIHBhY2thZ2VzIGluIHRoZWlyIHJlcG9zCisvLyBQcm8gVGlwOiBMb29rIGF0IGh0dHA6Ly9vcGVuZmwuY29tIGZvciBhIGdvb2QgTGludXggaW5zdGFsbCBzY3JpcHQKKyNpZiggaGF4ZV92ZXIgPCAzLjEwMykKKyNlcnJvciBIYXhlIDMuMS4zIG9yIG5ld2VyIHJlcXVpcmVkLCBzb3JyeSEKKyNlbmQKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKKworICAvKioKKyAgICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgorICAgKgorICAgKi8KK2ludGVyZmFjZSBUQmFzZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgVE9iamVjdCBmcm9tIHRoZSBnaXZlbiBpbnB1dCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAorICAgICAqLworICAgIGZ1bmN0aW9uIHJlYWQoaXByb3Q6VFByb3RvY29sKSA6IFZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAorICAgICAqCisgICAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgICAqLworICAgIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgYSBmaWVsZCBpcyBjdXJyZW50bHkgc2V0IG9yIHVuc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gaXNTZXQoZmllbGRJZCA6IEludCkgOiBCb29sOworCisgICAgLyoqCisgICAgICogR2V0IGEgZmllbGQncyB2YWx1ZSBieSBpZC4gUHJpbWl0aXZlIHR5cGVzIHdpbGwgYmUgd3JhcHBlZCBpbiB0aGUKKyAgICAgKiBhcHByb3ByaWF0ZSAiYm94ZWQiIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkSWQgVGhlIGZpZWxkJ3MgaWQgdGFnIGFzIGZvdW5kIGluIHRoZSBJREwuCisgICAgICovCisgICAgZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShmaWVsZElkIDogSW50KSA6IER5bmFtaWM7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBmaWVsZCdzIHZhbHVlIGJ5IGlkLiBQcmltaXRpdmUgdHlwZXMgbXVzdCBiZSAiYm94ZWQiIGluIHRoZQorICAgICAqIGFwcHJvcHJpYXRlIG9iamVjdCB3cmFwcGVyIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGRJZCBUaGUgZmllbGQncyBpZCB0YWcgYXMgZm91bmQgaW4gdGhlIElETC4KKyAgICAgKi8KKyAgICBmdW5jdGlvbiBzZXRGaWVsZFZhbHVlKGZpZWxkSWQgOiBJbnQsIHZhbHVlIDogRHluYW1pYykgOiBWb2lkOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEV4Y2VwdGlvbi5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGZhMWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFeGNlcHRpb24uaHgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitjbGFzcyBURXhjZXB0aW9uIHsKKworICAgIEA6aXNWYXIKKyAgICBwdWJsaWMgdmFyIGVycm9ySUQoZGVmYXVsdCxudWxsKSA6IEludDsKKyAgICBAOmlzVmFyCisgICAgcHVibGljIHZhciBlcnJvck1zZyhkZWZhdWx0LG51bGwpIDogU3RyaW5nOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG1zZyA6IFN0cmluZyA9ICIiLCBpZCA6IEludCA9IDApIHsKKyAgICAgICAgZXJyb3JJRCA9IGlkOworICAgICAgICBlcnJvck1zZyA9IG1zZzsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEZpZWxkUmVxdWlyZW1lbnRUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzlhMmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RGaWVsZFJlcXVpcmVtZW50VHlwZS5oeApAQCAtMCwwICsxLDMxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKKyAgLyoqCisgICAqIFJlcXVpcmVtZW50IHR5cGUgY29uc3RhbnRzLgorICAgKgorICAgKi8KK0A6ZW51bQorYWJzdHJhY3QgVEZpZWxkUmVxdWlyZW1lbnRUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBSRVFVSVJFRCA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE9QVElPTkFMIDogSW50ID0gMjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgREVGQVVMVCAgOiBJbnQgPSAzOworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFByb2Nlc3Nvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2I2ZjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3IuaHgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisgKiB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgorICovCitpbnRlcmZhY2UgVFByb2Nlc3NvciB7CisgICAgZnVuY3Rpb24gcHJvY2VzcyhpbnB1dDpUUHJvdG9jb2wsIG91dHB1dDpUUHJvdG9jb2wpIDogQm9vbDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9CaXRDb252ZXJ0ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUwYWFhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvQml0Q29udmVydGVyLmh4CkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CisKK2NsYXNzIEJpdENvbnZlcnRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIERvdWJsZVRvSW50NjRCaXRzKCBkYiA6IEZsb2F0KSA6IEludDY0IHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBidWYuYWRkRG91YmxlKCBkYik7CisgICAgICAgIHJldHVybiBieXRlc1RvTG9uZyggYnVmLmdldEJ5dGVzKCkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBJbnQ2NEJpdHNUb0RvdWJsZSggaTY0IDogSW50NjQpIDogRmxvYXQgeworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hZGQoIGZpeGVkTG9uZ1RvQnl0ZXMoIGk2NCkpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCkuZ2V0RG91YmxlKDApOworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgbG9uZyBpbnRvIGxpdHRsZS1lbmRpYW4gYnl0ZXMgaW4gYnVmIHN0YXJ0aW5nIGF0IG9mZiBhbmQgZ29pbmcKKyAgICAgKiB1bnRpbCBvZmYrNy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpeGVkTG9uZ1RvQnl0ZXMoIG4gOiBJbnQ2NCkgIDogQnl0ZXMgeworICAgICAgICB2YXIgYnVmID0gQnl0ZXMuYWxsb2MoOCk7CisgICAgICAgICNpZiggaGF4ZV92ZXIgPCAzLjIpCisgICAgICAgIGJ1Zi5zZXQoIDAsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBuLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCAxLCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA4KSwgIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDIsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDE2KSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggMywgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgMjQpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA0LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCAzMiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgIGJ1Zi5zZXQoIDUsIEludDY0LmdldExvdyggSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQwKSwgSW50NjQubWFrZSgwLCAweGZmKSkpKTsKKyAgICAgICAgYnVmLnNldCggNiwgSW50NjQuZ2V0TG93KCBJbnQ2NC5hbmQoIEludDY0LnNociggbiwgNDgpLCBJbnQ2NC5tYWtlKDAsIDB4ZmYpKSkpOworICAgICAgICBidWYuc2V0KCA3LCBJbnQ2NC5nZXRMb3coIEludDY0LmFuZCggSW50NjQuc2hyKCBuLCA1NiksIEludDY0Lm1ha2UoMCwgMHhmZikpKSk7CisgICAgICAgICNlbHNlCisgICAgICAgIGJ1Zi5zZXQoIDAsIEludDY0LmFuZCggbiwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMSwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDgpLCAgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMiwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDE2KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggMywgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDI0KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNCwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDMyKSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNSwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQwKSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNiwgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDQ4KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgYnVmLnNldCggNywgSW50NjQuYW5kKCBJbnQ2NC5zaHIoIG4sIDU2KSwgSW50NjQubWFrZSgwLCAweGZmKSkubG93KTsKKyAgICAgICAgI2VuZAorICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisgICAgICogeW91IGp1c3QgZ2V0IGEgbWVzc2VkIHVwIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ5dGVzVG9Mb25nKCBieXRlcyA6IEJ5dGVzKSA6IEludDY0IHsKKyAgICAgICAgdmFyIHJlc3VsdCA6IEludDY0ID0gSW50NjQubWFrZSgwLCAwKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDcpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCg2KSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoNSkpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDQpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgzKSkpOworICAgICAgICByZXN1bHQgPSBJbnQ2NC5vciggSW50NjQuc2hsKCByZXN1bHQsIDgpLCBJbnQ2NC5tYWtlKCAwLCBieXRlcy5nZXQoMikpKTsKKyAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIEludDY0LnNobCggcmVzdWx0LCA4KSwgSW50NjQubWFrZSggMCwgYnl0ZXMuZ2V0KDEpKSk7CisgICAgICAgIHJlc3VsdCA9IEludDY0Lm9yKCBJbnQ2NC5zaGwoIHJlc3VsdCwgOCksIEludDY0Lm1ha2UoIDAsIGJ5dGVzLmdldCgwKSkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdEJUTCggdGVzdCA6IEludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYnVmIDogQnl0ZXMgPSBmaXhlZExvbmdUb0J5dGVzKCB0ZXN0KTsKKyAgICAgICAgdmFyIGVyZyA9IGJ5dGVzVG9Mb25nKGJ1Zik7CisgICAgICAgIGlmICggSW50NjQuY29tcGFyZSggZXJnLCB0ZXN0KSAhPSAwKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlci5ieXRlc1RvTG9uZ1Rlc3QoJHRlc3QpIGZhaWxlZDogJGVyZyc7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdFBhaXIoIGEgOiBGbG9hdCwgYiA6IEludDY0KSA6IFZvaWQgeworICAgICAgICB2YXIgYnggPSBEb3VibGVUb0ludDY0Qml0cyhhKTsKKyAgICAgICAgaWYgKCBJbnQ2NC5jb21wYXJlKCBieCwgYikgIT0gMCkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIuVGVzdFBhaXI6IERvdWJsZVRvSW50NjRCaXRzKCRhKTogZXhwZWN0ZWQgJGIsIGdvdCAkYngnOworICAgICAgICB2YXIgYXggPSBJbnQ2NEJpdHNUb0RvdWJsZShiKTsKKyAgICAgICAgaWYoIGF4ICE9IGEpCisgICAgICAgICAgICB0aHJvdyAnQml0Q29udmVydGVyLlRlc3RQYWlyOiBJbnQ2NEJpdHNUb0RvdWJsZSgkYjogZXhwZWN0ZWQgJGEsIGdvdCAgJGF4JzsKKyAgICB9CisgICAgI2VuZAorCisKKyAgICAjaWYgZGVidWcKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFVuaXRUZXN0KCkgOiBWb2lkIHsKKworICAgICAgICAvLyBieXRlc1RvTG9uZygpCisgICAgICAgIHZhciBpIDogSW50OworICAgICAgICBUZXN0QlRMKCBJbnQ2NC5tYWtlKDAsMCkpOworICAgICAgICBmb3IgKCBpIGluIDAgLi4uIDYyKSB7CisgICAgICAgICAgICBUZXN0QlRMKCBJbnQ2NC5zaGwoIEludDY0Lm1ha2UoMCwxKSwgaSkpOworICAgICAgICAgICAgVGVzdEJUTCggSW50NjQuc3ViKCBJbnQ2NC5tYWtlKDAsMCksIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSkpOworICAgICAgICB9CisgICAgICAgIFRlc3RCVEwoIEludDY0Lm1ha2UoMHg3RkZGRkZGRiwweEZGRkZGRkZGKSk7CisgICAgICAgIFRlc3RCVEwoIEludDY0Lm1ha2UoY2FzdCgweDgwMDAwMDAwLEludCksMHgwMDAwMDAwMCkpOworCisgICAgICAgIC8vIERvdWJsZVRvSW50NjRCaXRzOworICAgICAgICBUZXN0UGFpciggMS4wMDAwMDAwMDAwMDAwMDAwRSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjUwMDAwMDAwMDAwMDAwMDBFKzAwMSwgIEludDY0Lm1ha2UoY2FzdCgweDQwMkUwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDIuNTUwMDAwMDAwMDAwMDAwMEUrMDAyLCAgSW50NjQubWFrZShjYXN0KDB4NDA2RkUwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggNC4yOTQ5NjcyOTUwMDAwMDAwRSswMDksICBJbnQ2NC5tYWtlKGNhc3QoMHg0MUVGRkZGRixJbnQpLGNhc3QoMHhGRkUwMDAwMCxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAzLjkwNjI1MDAwMDAwMDAwMDBFLTAwMywgIEludDY0Lm1ha2UoY2FzdCgweDNGNzAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDIuMzI4MzA2NDM2NTM4Njk2M0UtMDEwLCAgSW50NjQubWFrZShjYXN0KDB4M0RGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjMwMDAwRS0zMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMUFBNzRGRSxJbnQpLGNhc3QoMHgxQzFFN0U0NSxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1MDBFLTE1MCwgIEludDY0Lm1ha2UoY2FzdCgweDIwRDAyQTM2LEludCksY2FzdCgweDU4NkRCNEJCLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2NUUrMDAwLCAgSW50NjQubWFrZShjYXN0KDB4M0ZGM0MwQ0EsSW50KSxjYXN0KDB4NDI4QzU5RkEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY3RSswMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHgzRkYzQzBDQSxJbnQpLGNhc3QoMHg0MjhDNTlGQixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjIzNDU2Nzg5MDEyMzQ1NjlFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDNGRjNDMENBLEludCksY2FzdCgweDQyOEM1OUZDLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuMjM0NTY3ODkwMTIzNDU2OUUrMTUwLCAgSW50NjQubWFrZShjYXN0KDB4NUYxODIzNDQsSW50KSxjYXN0KDB4Q0QzQ0RGOUYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMS4yMzQ1Njc4OTAxMjM0NTY5RSszMDAsICBJbnQ2NC5tYWtlKGNhc3QoMHg3RTNEN0VFOCxJbnQpLGNhc3QoMHhCQ0JCRDM1MixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIEludDY0Lm1ha2UoY2FzdCgweEZGRUZGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAgSW50NjQubWFrZShjYXN0KDB4N0ZFRkZGRkYsSW50KSxjYXN0KDB4RkZGRkZGRkYsSW50KSkpOworICAgICAgICBUZXN0UGFpciggNC45NDA2NTY0NTg0MTI0NjU0RS0zMjQsICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMSxJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAwLjAwMDAwMDAwMDAwMDAwMDBFKzAwMCwgIEludDY0Lm1ha2UoY2FzdCgweDAwMDAwMDAwLEludCksY2FzdCgweDAwMDAwMDAwLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIDQuOTQwNjU2NDU4NDEyNDdFLTMyNCwgICAgSW50NjQubWFrZShjYXN0KDB4MDAwMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDEsSW50KSkpOworICAgICAgICBUZXN0UGFpciggMy4yMzc4NTkyMTAwMjA2MDkyRS0zMTksICBJbnQ2NC5tYWtlKGNhc3QoMHgwMDAwMDAwMCxJbnQpLGNhc3QoMHgwMDAwRkZGRixJbnQpKSk7CisgICAgICAgIFRlc3RQYWlyKCAxLjM5MDY3MTE2MTU2Njk5NTlFLTMwOSwgIEludDY0Lm1ha2UoY2FzdCgweDAwMDBGRkZGLEludCksY2FzdCgweEZGRkZGRkZGLEludCkpKTsKKyAgICAgICAgVGVzdFBhaXIoIE1hdGguTkVHQVRJVkVfSU5GSU5JVFksICAgSW50NjQubWFrZShjYXN0KDB4RkZGMDAwMDAsSW50KSxjYXN0KDB4MDAwMDAwMDAsSW50KSkpOworICAgICAgICBUZXN0UGFpciggTWF0aC5QT1NJVElWRV9JTkZJTklUWSwgICBJbnQ2NC5tYWtlKGNhc3QoMHg3RkYwMDAwMCxJbnQpLGNhc3QoMHgwMDAwMDAwMCxJbnQpKSk7CisKKyAgICAgICAgLy8gTmFOIGlzIHNwZWNpYWwKKyAgICAgICAgdmFyIGk2NG5hbiA9IERvdWJsZVRvSW50NjRCaXRzKCBNYXRoLk5hTik7CisgICAgICAgIHZhciBpNjRjbXAgPSBJbnQ2NC5tYWtlKGNhc3QoMHhGRkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgaWYgKCAhIE1hdGguaXNOYU4oIEludDY0Qml0c1RvRG91YmxlKCBpNjRjbXApKSkKKyAgICAgICAgICAgIHRocm93ICdCaXRDb252ZXJ0ZXIgTmFOLVRlc3QgIzE6IGV4cGVjdGVkIE5hTic7CisKKyAgICAgICAgLy8gRm9yIGRvdWJsZXMsIGEgcXVpZXQgTmFOIGlzIGEgYml0IHBhdHRlcm4KKyAgICAgICAgLy8gYmV0d2VlbiA3RkY4MDAwMDAwMDAwMDAwIGFuZCA3RkZGRkZGRkZGRkZGRkZGCisgICAgICAgIC8vICAgICAgb3IgRkZGODAwMDAwMDAwMDAwMCBhbmQgRkZGRkZGRkZGRkZGRkZGRgorICAgICAgICB2YXIgbWluMSA9IEludDY0Lm1ha2UoIGNhc3QoMHg3RkY4MDAwMCwgSW50KSwgY2FzdCgweDAwMDAwMDAwLCBJbnQpKTsKKyAgICAgICAgdmFyIG1heDEgPSBJbnQ2NC5tYWtlKCBjYXN0KDB4N0ZGRkZGRkYsIEludCksIGNhc3QoMHhGRkZGRkZGRiwgSW50KSk7CisgICAgICAgIHZhciBtaW4yID0gSW50NjQubWFrZSggY2FzdCgweEZGRjgwMDAwLCBJbnQpLCBjYXN0KDB4MDAwMDAwMDAsIEludCkpOworICAgICAgICB2YXIgbWF4MiA9IEludDY0Lm1ha2UoIGNhc3QoMHhGRkZGRkZGRiwgSW50KSwgY2FzdCgweEZGRkZGRkZGLCBJbnQpKTsKKyAgICAgICAgdmFyIG9rMSA9ICAoSW50NjQuY29tcGFyZSggbWluMSwgaTY0bmFuKSA8PSAwKSAmJiAoSW50NjQuY29tcGFyZSggaTY0bmFuLCBtYXgxKSA8PSAwKTsKKyAgICAgICAgdmFyIG9rMiA9ICAoSW50NjQuY29tcGFyZSggbWluMiwgaTY0bmFuKSA8PSAwKSAmJiAoSW50NjQuY29tcGFyZSggaTY0bmFuLCBtYXgyKSA8PSAwKTsKKyAgICAgICAgaWYoICEgKG9rMSB8fCBvazIpKQorICAgICAgICAgICAgdGhyb3cgJ0JpdENvbnZlcnRlciBOYU4tVGVzdCAjMjogZmFpbGVkJzsKKyAgICB9CisgICAgI2VuZAorCit9CisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9JbnQ2NE1hcC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg0NWZkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50NjRNYXAuaHgKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLmRzLkludE1hcDsKKworCisvLyBJbnQ2NE1hcCBhbGxvd3MgbWFwcGluZyBvZiBJbnQ2NCBrZXlzIHRvIGFyYml0cmFyeSB2YWx1ZXMuCisvLyBPYmplY3RNYXA8PiBjYW5ub3QgYmUgdXNlZCwgc2luY2Ugd2Ugd2FudCB0byBjb21wYXJlIGJ5IHZhbHVlLCBub3QgYWRkcmVzcworCitjbGFzcyBJbnQ2NE1hcDxUPiBpbXBsZW1lbnRzIElNYXA8IEludDY0LCBUPiB7CisKKyAgICBwcml2YXRlIHZhciBTdWJNYXBzIDogSW50TWFwPCBJbnRNYXA8IFQ+PjsgIC8vIEhpIC0+IExvIC0+IFZhbHVlCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgOiBWb2lkIHsKKyAgICAgICAgU3ViTWFwcyA9IG5ldyBJbnRNYXA8IEludE1hcDwgVD4+KCk7CisgICAgfTsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gR2V0U3ViTWFwKCBoaSA6IGhheGUuSW50MzIsIGNhbkNyZWF0ZSA6IEJvb2wpIDogSW50TWFwPCBUPiB7CisgICAgICAgIGlmKCBTdWJNYXBzLmV4aXN0cyhoaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJNYXBzLmdldChoaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiggISBjYW5DcmVhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gbmV3IEludE1hcDwgVD4oKTsKKyAgICAgICAgU3ViTWFwcy5zZXQoIGhpLCBsb21hcCk7CisgICAgICAgIHJldHVybiBsb21hcDsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gR2V0TG93TWFwKCBrZXkgOiBoYXhlLkludDY0LCBjYW5DcmVhdGUgOiBCb29sKSA6IEludE1hcDwgVD4geworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICByZXR1cm4gR2V0U3ViTWFwKCBJbnQ2NC5nZXRIaWdoKGtleSksIGNhbkNyZWF0ZSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiBHZXRTdWJNYXAoIGtleS5oaWdoLCBjYW5DcmVhdGUpOworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEdldExvd0luZGV4KCBrZXkgOiBoYXhlLkludDY0KSA6IGhheGUuSW50MzIgeworICAgICAgICAjaWYoIGhheGVfdmVyIDwgMy4yKQorICAgICAgICByZXR1cm4gSW50NjQuZ2V0TG93KGtleSk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiBrZXkubG93OworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIE51bGxDaGVjaygga2V5IDogaGF4ZS5JbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCk7CisgICAgICAgICNlbHNlCisgICAgICAgIHJldHVybiB0cnVlOyAgLy8gSW50NjQgaXMgbm90IG51bGxhYmxlIGFueW1vcmUgKGl0IG5ldmVyIHJlYWxseSB3YXMpCisgICAgICAgICNlbmQKKyAgICB9OworCisKKworICAgIC8qKgorICAgICAgICBNYXBzIGBrZXlgIHRvIGB2YWx1ZWAuCisgICAgICAgIElmIGBrZXlgIGFscmVhZHkgaGFzIGEgbWFwcGluZywgdGhlIHByZXZpb3VzIHZhbHVlIGRpc2FwcGVhcnMuCisgICAgICAgIElmIGBrZXlgIGlzIG51bGwsIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldCgga2V5IDogSW50NjQsIHZhbHVlIDogVCApIDogVm9pZCB7CisgICAgICAgIGlmKCAhIE51bGxDaGVjayhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB2YXIgbG9tYXAgPSBHZXRMb3dNYXAoIGtleSwgdHJ1ZSk7CisgICAgICAgIGxvbWFwLnNldCggR2V0TG93SW5kZXgoa2V5KSwgdmFsdWUpOworICAgIH0KKworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnQgbWFwcGluZyBvZiBga2V5YC4KKyAgICAgICAgSWYgbm8gc3VjaCBtYXBwaW5nIGV4aXN0cywgbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgICAgSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKworICAgICAgICBOb3RlIHRoYXQgYSBjaGVjayBsaWtlIGBtYXAuZ2V0KGtleSkgPT0gbnVsbGAgY2FuIGhvbGQgZm9yIHR3byByZWFzb25zOgorCisgICAgICAgICAgICAxLiB0aGUgbWFwIGhhcyBubyBtYXBwaW5nIGZvciBga2V5YAorICAgICAgICAgICAgMi4gdGhlIG1hcCBoYXMgYSBtYXBwaW5nIHdpdGggYSB2YWx1ZSBvZiBgbnVsbGAKKworICAgICAgICBJZiBpdCBpcyBpbXBvcnRhbnQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMsIGBleGlzdHMoKWAgc2hvdWxkIGJlCisgICAgICAgIHVzZWQuCisKKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KCBrZXkgOiBJbnQ2NCkgOiBOdWxsPFQ+IHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBpZiggbG9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9tYXAuZ2V0KCBHZXRMb3dJbmRleChrZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIGBrZXlgIGhhcyBhIG1hcHBpbmcsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgSWYgYGtleWAgaXMgbnVsbCwgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZXhpc3RzKCBrZXkgOiBJbnQ2NCkgOiBCb29sIHsKKyAgICAgICAgaWYoICEgTnVsbENoZWNrKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBsb21hcCA9IEdldExvd01hcCgga2V5LCB0cnVlKTsKKyAgICAgICAgaWYoIGxvbWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb21hcC5leGlzdHMoIEdldExvd0luZGV4KGtleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZW1vdmVzIHRoZSBtYXBwaW5nIG9mIGBrZXlgIGFuZCByZXR1cm5zIHRydWUgaWYgc3VjaCBhIG1hcHBpbmcgZXhpc3RlZCwKKyAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLiBJZiBga2V5YCBpcyBudWxsLCB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUoIGtleSA6IEludDY0KSA6IEJvb2wgeworICAgICAgICBpZiggISBOdWxsQ2hlY2soa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGxvbWFwID0gR2V0TG93TWFwKCBrZXksIHRydWUpOworICAgICAgICBpZiggbG9tYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxvbWFwLnJlbW92ZSggR2V0TG93SW5kZXgoa2V5KSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyBhbiBJdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGB0aGlzYCBNYXAuCisgICAgICAgIFRoZSBvcmRlciBvZiBrZXlzIGlzIHVuZGVmaW5lZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cygpIDogSXRlcmF0b3I8SW50NjQ+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NEtleUl0ZXJhdG9yPFQ+KFN1Yk1hcHMpOworICAgIH0KKworICAgIC8qKgorICAgICAgICBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBgdGhpc2AgTWFwLgorICAgICAgICBUaGUgb3JkZXIgb2YgdmFsdWVzIGlzIHVuZGVmaW5lZC4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKSA6IEl0ZXJhdG9yPFQ+IHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnQ2NFZhbHVlSXRlcmF0b3I8VD4oU3ViTWFwcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICAgIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYHRoaXNgIE1hcC4KKyAgICAgICAgVGhlIGV4YWN0IHJlcHJlc2VudGF0aW9uIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtIGFuZCBrZXktdHlwZS4KKyAgICAqKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciByZXN1bHQgOiBTdHJpbmcgPSAieyI7CisKKyAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yKCBrZXkgaW4gdGhpcy5rZXlzKCkpIHsKKyAgICAgICAgICAgIGlmKCBmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCArPSAiICI7CisgICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmdldChrZXkpOworICAgICAgICAgICAgcmVzdWx0ICs9IEludDY0LnRvU3RyKGtleSkgKyAnID0+ICR2YWx1ZSc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0ICsgIn0iOworICAgIH0KKworfQorCisKKy8vIGludGVybmFsIGhlbHBlciBjbGFzcyBmb3IgSW50NjRNYXA8VD4KKy8vIGFsbCBjbGFzcyB3aXRoIG1hdGNoaW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgYXMgaXRlcmF0b3IgKGR1Y2sgdHlwaW5nKQorcHJpdmF0ZSBjbGFzcyBJbnQ2NE1hcEl0ZXJhdG9yQmFzZTxUPiB7CisKKyAgICBwcml2YXRlIHZhciBTdWJNYXBzIDogSW50TWFwPCBJbnRNYXA8IFQ+PjsgIC8vIEhpIC0+IExvIC0+IFZhbHVlCisKKyAgICBwcml2YXRlIHZhciBIaUl0ZXJhdG9yIDogSXRlcmF0b3I8IEludD4gPSBudWxsOworICAgIHByaXZhdGUgdmFyIExvSXRlcmF0b3IgOiBJdGVyYXRvcjwgSW50PiA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgQ3VycmVudEhpIDogSW50ID0gMDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGRhdGEgOiBJbnRNYXA8IEludE1hcDwgVD4+KSA6IFZvaWQgeworICAgICAgICBTdWJNYXBzID0gZGF0YTsKKyAgICAgICAgSGlJdGVyYXRvciA9IFN1Yk1hcHMua2V5cygpOworICAgICAgICBMb0l0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgQ3VycmVudEhpID0gMDsKKyAgICB9OworCisgICAgLyoqCisgICAgICAgIFJldHVybnMgZmFsc2UgaWYgdGhlIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZSwgdHJ1ZSBvdGhlcndpc2UuCisKKyAgICAgICAgVXN1YWxseSBpdGVyYXRpb24gaXMgY29uc2lkZXJlZCB0byBiZSBjb21wbGV0ZSBpZiBhbGwgZWxlbWVudHMgb2YgdGhlCisgICAgICAgIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUgd2VyZSBoYW5kbGVkIHRocm91Z2ggY2FsbHMgdG8gbmV4dCgpLiBIb3dldmVyLAorICAgICAgICBpbiBjdXN0b20gaXRlcmF0b3JzIGFueSBsb2dpYyBtYXkgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgc3RhdGUuCisgICAgKiovCisgICAgcHVibGljIGZ1bmN0aW9uIGhhc05leHQoKSA6IEJvb2wgeworCisgICAgICAgIGlmKCAoTG9JdGVyYXRvciAhPSBudWxsKSAmJiBMb0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSggKEhpSXRlcmF0b3IgIT0gbnVsbCkgJiYgSGlJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEN1cnJlbnRIaSA9IEhpSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgTG9JdGVyYXRvciA9IFN1Yk1hcHMuZ2V0KEN1cnJlbnRIaSkua2V5cygpOworICAgICAgICAgICAgaWYoIChMb0l0ZXJhdG9yICE9IG51bGwpICYmIExvSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBIaUl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgTG9JdGVyYXRvciA9IG51bGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRLZXlJdGVyYXRvcjxUPmV4dGVuZHMgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggZGF0YSA6IEludE1hcDwgSW50TWFwPCBUPj4pIDogVm9pZCB7CisgICAgICAgIHN1cGVyKGRhdGEpOworICAgIH07CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBpdGVtIG9mIHRoZSBJdGVyYXRvciBhbmQgYWR2YW5jZXMgdG8gdGhlIG5leHQgb25lLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBjaGVjayBoYXNOZXh0KCkgZmlyc3QuIEEgY2FsbCB0byB0aGlzCisgICAgICAgIG1ldGhvZCB3aGlsZSBoYXNOZXh0KCkgaXMgZmFsc2UgeWllbGRzIHVuc3BlY2lmaWVkIGJlaGF2aW9yLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgOiBJbnQ2NCB7CisgICAgICAgIGlmKCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnQ2NC5tYWtlKCBDdXJyZW50SGksIExvSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJubyBtb3JlIGVsZW1lbnRzIjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBpbnRlcm5hbCBoZWxwZXIgY2xhc3MgZm9yIEludDY0TWFwPFQ+CisvLyBhbGwgY2xhc3Mgd2l0aCBtYXRjaGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIGFzIGl0ZXJhdG9yIChkdWNrIHR5cGluZykKK3ByaXZhdGUgY2xhc3MgSW50NjRWYWx1ZUl0ZXJhdG9yPFQ+IGV4dGVuZHMgSW50NjRNYXBJdGVyYXRvckJhc2U8VD4geworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggZGF0YSA6IEludE1hcDwgSW50TWFwPCBUPj4pIDogVm9pZCB7CisgICAgICAgIHN1cGVyKGRhdGEpOworICAgIH07CisKKyAgICAvKioKKyAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBpdGVtIG9mIHRoZSBJdGVyYXRvciBhbmQgYWR2YW5jZXMgdG8gdGhlIG5leHQgb25lLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBjaGVjayBoYXNOZXh0KCkgZmlyc3QuIEEgY2FsbCB0byB0aGlzCisgICAgICAgIG1ldGhvZCB3aGlsZSBoYXNOZXh0KCkgaXMgZmFsc2UgeWllbGRzIHVuc3BlY2lmaWVkIGJlaGF2aW9yLgorICAgICoqLworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXh0KCkgOiBUIHsKKyAgICAgICAgaWYoIGhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFN1Yk1hcHMuZ2V0KEN1cnJlbnRIaSkuZ2V0KExvSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93ICJubyBtb3JlIGVsZW1lbnRzIjsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBFT0YKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9JbnRTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvSW50U2V0Lmh4CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CisKKworY2xhc3MgSW50U2V0IHsKKworICAgIHByaXZhdGUgdmFyIF9lbGVtZW50cyA9IG5ldyBoYXhlLmRzLkludE1hcDxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8SW50PiA9IG51bGwpIHsKKyAgICAgICAgaWYgKCB2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggdmFsdWUgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKTpJdGVyYXRvcjxJbnQ+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogSW50KSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMuZXhpc3RzKG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9zaXplID09IDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZShvIDogSW50KSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8SW50PiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxJbnQ+ID0gbmV3IEFycmF5PEludD4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvT2JqZWN0U2V0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZjcyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL09iamVjdFNldC5oeApAQCAtMCwwICsxLDk2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyOworCitpbXBvcnQgTWFwOworCisKK2NsYXNzIE9iamVjdFNldDxLPiB7CisKKyAgICBwcml2YXRlIHZhciBfZWxlbWVudHMgPSBuZXcgaGF4ZS5kcy5PYmplY3RNYXA8SyxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8Sz4gPSBudWxsKSB7CisgICAgICAgIGlmICggdmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoIHZhbHVlIGluIHZhbHVlcykgeworICAgICAgICAgICAgICAgICBhZGQodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGl0ZXJhdG9yKCk6SXRlcmF0b3I8Sz4geworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmtleXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdHJhY2VBbGwoKSA6IFZvaWQgeworICAgICAgICB0cmFjZSgnJF9zaXplIGVudHJpZXMnKTsKKyAgICAgICAgZm9yKGVudHJ5IGluIHRoaXMpIHsKKyAgICAgICAgICAgIHZhciB5ZXMgPSBjb250YWlucyhlbnRyeSk7CisgICAgICAgICAgICB0cmFjZSgnLSAkZW50cnksIGNvbnRhaW5zKCkgPSAkeWVzJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKG8gOiBLKSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBLKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gX2VsZW1lbnRzLmV4aXN0cyhvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfc2l6ZSA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUobyA6IEspIDogQm9vbCB7CisgICAgICAgIGlmIChjb250YWlucyhvKSkgeworICAgICAgICAgICAgX2VsZW1lbnRzLnJlbW92ZShvKTsKKyAgICAgICAgICAgIF9zaXplLS07CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0b0FycmF5KCkgOiBBcnJheTxLPiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxLPiA9IG5ldyBBcnJheTxLPigpOworICAgICAgICBmb3IgKGtleSBpbiBfZWxlbWVudHMua2V5cygpKSB7CisgICAgICAgICAgICByZXQucHVzaChrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldF9zaXplKCkgOiBJbnQgeworICAgICAgICByZXR1cm4gX3NpemU7CisgICAgfQorfQorICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2hlbHBlci9TdHJpbmdTZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjMGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvU3RyaW5nU2V0Lmh4CkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5oZWxwZXI7CisKK2ltcG9ydCBNYXA7CisKKworY2xhc3MgU3RyaW5nU2V0IHsKKworICAgIHByaXZhdGUgdmFyIF9lbGVtZW50cyA9IG5ldyBoYXhlLmRzLlN0cmluZ01hcDxJbnQ+KCk7CisgICAgcHJpdmF0ZSB2YXIgX3NpemUgOiBJbnQgPSAwOworICAgIHB1YmxpYyB2YXIgc2l6ZShnZXQsbmV2ZXIpIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggdmFsdWVzIDogQXJyYXk8U3RyaW5nPiA9IG51bGwpIHsKKyAgICAgICAgaWYgKCB2YWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yICggdmFsdWUgaW4gdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXRlcmF0b3IoKTpJdGVyYXRvcjxTdHJpbmc+IHsKKyAgICAgICAgcmV0dXJuIF9lbGVtZW50cy5rZXlzKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRyYWNlQWxsKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhY2UoJyRfc2l6ZSBlbnRyaWVzJyk7CisgICAgICAgIGZvcihlbnRyeSBpbiB0aGlzKSB7CisgICAgICAgICAgICB2YXIgeWVzID0gY29udGFpbnMoZW50cnkpOworICAgICAgICAgICAgdHJhY2UoJy0gJGVudHJ5LCBjb250YWlucygpID0gJHllcycpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZChvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICBpZiggX2VsZW1lbnRzLmV4aXN0cyhvKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIF9zaXplKys7CisgICAgICAgIF9lbGVtZW50cy5zZXQobyxfc2l6ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhcigpIDogVm9pZCB7CisgICAgICAgIHdoaWxlKCBfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJlbW92ZSggX2VsZW1lbnRzLmtleXMoKS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKG8gOiBTdHJpbmcpIDogQm9vbCB7CisgICAgICAgIHJldHVybiBfZWxlbWVudHMuZXhpc3RzKG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIF9zaXplID09IDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlbW92ZShvIDogU3RyaW5nKSA6IEJvb2wgeworICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgIF9lbGVtZW50cy5yZW1vdmUobyk7CisgICAgICAgICAgICBfc2l6ZS0tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9BcnJheSgpIDogQXJyYXk8U3RyaW5nPiB7CisgICAgICAgIHZhciByZXQgOiBBcnJheTxTdHJpbmc+ID0gbmV3IEFycmF5PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChrZXkgaW4gX2VsZW1lbnRzLmtleXMoKSkgeworICAgICAgICAgICAgcmV0LnB1c2goa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRfc2l6ZSgpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIF9zaXplOworICAgIH0KK30KKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9oZWxwZXIvWmlnWmFnLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODYwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvaGVscGVyL1ppZ1phZy5oeApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlcjsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKKworY2xhc3MgWmlnWmFnIHsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEZyb21JbnQoIG4gOiBJbnQpIDogVUludCAgICB7CisgICAgICAgICNpZiBwaHAKKworICAgICAgICByZXR1cm4gY2FzdChjYXN0KGNhc3QobixJbnQzMikgPDwgMSxJbnQzMikgXiBjYXN0KGNhc3QobixJbnQzMikgPj4gMzEsSW50MzIpLFVJbnQpOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgcmV0dXJuIGNhc3QobiA8PCAxLFVJbnQpIF4gY2FzdChuID4+IDMxLFVJbnQpOworCisgICAgICAgICNlbmQKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRvSW50KCBuIDogVUludCkgOiBJbnQgeworICAgICAgICAjaWYgcGhwCisKKyAgICAgICAgdmFyIGEgPSAoMHg3RkZGRkZGRiAmIGNhc3QobiA+PiAxLEludCkpOworICAgICAgICB2YXIgYiA9IChjYXN0KG4gJiAxLEludCkpOworICAgICAgICBiID0gLWI7ICAvLyB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvNTI4OAorICAgICAgICByZXR1cm4gYSBeIGI7CisKKyAgICAgICAgI2Vsc2UKKworICAgICAgICByZXR1cm4gKDB4N0ZGRkZGRkYgJiBjYXN0KG4gPj4gMSxJbnQpKSBeICgtY2FzdChuICYgMSxJbnQpKTsKKworICAgICAgICAjZW5kCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gRnJvbUxvbmcoIG4gOiBJbnQ2NCkgOiBJbnQ2NCB7CisgICAgICAgIHJldHVybiBJbnQ2NC54b3IoIEludDY0LnNobChuLCAxKSwgSW50NjQuc2hyKG4sIDYzKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFRvTG9uZyggbiA6IEludDY0KSA6IEludDY0IHsKKyAgICAgICAgcmV0dXJuIEludDY0LnhvcigKKyAgICAgICAgICAgIEludDY0LmFuZCgKKyAgICAgICAgICAgICAgICBJbnQ2NC5zaHIobiwgMSksCisgICAgICAgICAgICAgICAgSW50NjQubWFrZSgweDdGRkZGRkZGLCAweEZGRkZGRkZGKSksCisgICAgICAgICAgICBJbnQ2NC5zdWIoCisgICAgICAgICAgICAgICAgSW50NjQubWFrZSgwLCAwKSwKKyAgICAgICAgICAgICAgICBJbnQ2NC5hbmQobiwgSW50NjQubWFrZSgwLDEpKSkpOworICAgIH0KKworCisgICAgI2lmIGRlYnVnCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gVGVzdDMyKCB0ZXN0IDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgYSA6IFVJbnQgPSBaaWdaYWcuRnJvbUludCggdGVzdCk7CisgICAgICAgIHZhciBiIDogSW50ID0gWmlnWmFnLlRvSW50KGEpOworICAgICAgICAjaWYgcGhwCisgICAgICAgIHRlc3QgPSB0ZXN0ICYgMHhGRkZGRkZGRjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg5CisgICAgICAgICNlbmQKKyAgICAgICAgaWYoIHRlc3QgIT0gYikKKyAgICAgICAgICAgIHRocm93ICdaaWdaYWcuVGVzdDMyKCR0ZXN0KSBmYWlsZWQ6IGEgPSAkYSwgYiA9ICRiJzsKKyAgICB9CisgICAgI2VuZAorCisKKworICAgICNpZiBkZWJ1ZworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIFRlc3Q2NCggdGVzdCA6IGhheGUuSW50NjQpIDogVm9pZCB7CisgICAgICAgIHZhciBhIDogSW50NjQgPSBaaWdaYWcuRnJvbUxvbmcoIHRlc3QpOworICAgICAgICB2YXIgYiA6IEludDY0ID0gWmlnWmFnLlRvTG9uZyhhKTsKKyAgICAgICAgaWYoIEludDY0LmNvbXBhcmUoIHRlc3QsIGIpICE9IDApCisgICAgICAgICAgICB0aHJvdyAnWmlnWmFnLlRlc3Q2NCgkdGVzdCkgZmFpbGVkOiBhID0gJGEsIGIgPSAkYic7CisgICAgfQorICAgICNlbmQKKworCisgICAgI2lmIGRlYnVnCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBVbml0VGVzdCgpIDogVm9pZCB7CisgICAgICB2YXIgdTEgOiBVSW50ID0gMHhGRkZGRkZGRTsKKyAgICAgIHZhciB1MiA6IFVJbnQgPSAweEZGRkZGRkZGOworICAgICAgdmFyIGkxIDogSW50ID0gMjE0NzQ4MzY0NzsKKyAgICAgIHZhciBpMiA6IEludCA9IC0yMTQ3NDgzNjQ4OworCisgICAgICAjaWYgcGhwCisgICAgICBpMiA9IGkyICYgMHhGRkZGRkZGRjsgIC8vIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy81Mjg5CisgICAgICAjZW5kCisKKyAgICAgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICAgICAgaWYoIEZyb21JbnQoMCkgICE9IDApIHRocm93ICdwYiAjMSB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoLTEpICE9IDEpIHRocm93ICdwYiAjMiB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoMSkgICE9IDIpIHRocm93ICdwYiAjMyB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoLTIpICE9IDMpIHRocm93ICdwYiAjNCB0byBaaWdaYWcnOworICAgICAgaWYoIEZyb21JbnQoaTEpICE9IHUxKSB0aHJvdyAncGIgIzUgdG8gWmlnWmFnJzsKKyAgICAgIGlmKCBGcm9tSW50KGkyKSAhPSB1MikgdGhyb3cgJ3BiICM2IHRvIFppZ1phZyc7CisKKyAgICAgIC8vIHByb3RvYnVmIHRlc3RjYXNlcworICAgICAgaWYoIFRvSW50KDApICE9IDApIHRocm93ICdwYiAjMSBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMSkgIT0gLTEpIHRocm93ICdwYiAjMiBmcm9tIFppZ1phZyc7CisgICAgICBpZiggVG9JbnQoMikgIT0gMSkgdGhyb3cgJ3BiICMzIGZyb20gWmlnWmFnJzsKKyAgICAgIGlmKCBUb0ludCgzKSAhPSAtMikgdGhyb3cgJ3BiICM0IGZyb20gWmlnWmFnJzsKKyAgICAgIGlmKCBUb0ludCh1MSkgIT0gaTEpIHRocm93ICdwYiAjNSBmcm9tIFppZ1phZywgZ290ICR7VG9JbnQodTEpfSBleHBlY3RlZCAkaTEnOworICAgICAgaWYoIFRvSW50KHUyKSAhPSBpMikgdGhyb3cgJ3BiICM2IGZyb20gWmlnWmFnLCBnb3QgJHtUb0ludCh1Mil9IGV4cGVjdGVkICRpMic7CisKKyAgICAgIC8vIGJhY2sgYW5kIGZvcnRoIDMyCisgICAgICBUZXN0MzIoIDApOworICAgICAgZm9yKCBpIGluIDAgLi4uIDMwKSB7CisgICAgICAgIFRlc3QzMiggMSA8PCBpKTsKKyAgICAgICAgVGVzdDMyKCAtKDEgIDw8IGkpKTsKKyAgICAgIH0KKyAgICAgIFRlc3QzMiggMHg3RkZGRkZGRik7CisgICAgICBUZXN0MzIoIGNhc3QoMHg4MDAwMDAwMCxJbnQpKTsKKworICAgICAgLy8gYmFjayBhbmQgZm9ydGggNjQKKyAgICAgIFRlc3Q2NCggSW50NjQubWFrZSgwLDApKTsKKyAgICAgIGZvciggaSBpbiAwIC4uLiA2MikgeworICAgICAgICBUZXN0NjQoIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSk7CisgICAgICAgIFRlc3Q2NCggSW50NjQuc3ViKCBJbnQ2NC5tYWtlKDAsMCksIEludDY0LnNobCggSW50NjQubWFrZSgwLDEpLCBpKSkpOworICAgICAgfQorICAgICAgVGVzdDY0KCBJbnQ2NC5tYWtlKDB4N0ZGRkZGRkYsMHhGRkZGRkZGRikpOworICAgICAgVGVzdDY0KCBJbnQ2NC5tYWtlKGNhc3QoMHg4MDAwMDAwMCxJbnQpLDB4MDAwMDAwMDApKTsKKyAgICB9CisgICAgI2VuZAorfQorCisgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkYjExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5oeApAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhOworCitpbXBvcnQgZmxhc2gudXRpbHMuRGljdGlvbmFyeTsKKworLyoqCisqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBtZXRhIGRhdGEgYWJvdXQgdGhyaWZ0IGZpZWxkcy4gRXZlcnkgZmllbGQgaW4gYQorKiBhIHN0cnVjdCBzaG91bGQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBkZXNjcmliaW5nIGl0LgorKgorKi8KK2NsYXNzIEZpZWxkTWV0YURhdGEgeworCisgIHB1YmxpYyB2YXIgZmllbGROYW1lIDogU3RyaW5nOworICBwdWJsaWMgdmFyIHJlcXVpcmVtZW50VHlwZSA6IEludDsKKyAgcHVibGljIHZhciB2YWx1ZU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKworICBwcml2YXRlIHN0YXRpYyB2YXIgc3RydWN0TWFwOkRpY3Rpb25hcnkgPSBuZXcgRGljdGlvbmFyeSgpOworCisgIHB1YmxpYyBmdW5jdGlvbiBGaWVsZE1ldGFEYXRhKG5hbWUgOiBTdHJpbmcsIHJlcSA6IEludCwgdk1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgIHRoaXMuZmllbGROYW1lID0gbmFtZTsKKyAgICB0aGlzLnJlcXVpcmVtZW50VHlwZSA9IHJlcTsKKyAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZFN0cnVjdE1ldGFEYXRhTWFwKHNDbGFzczpDbGFzcywgbWFwOkRpY3Rpb25hcnkpIDogVm9pZHsKKyAgICBzdHJ1Y3RNYXBbc0NsYXNzXSA9IG1hcDsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIGEgbWFwIHdpdGggbWV0YWRhdGEgKGkuZS4gaW5zdGFuY2VzIG9mIEZpZWxkTWV0YURhdGEpIHRoYXQKKyAgICogZGVzY3JpYmUgdGhlIGZpZWxkcyBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBzQ2xhc3MgVGhlIFRCYXNlIGNsYXNzIGZvciB3aGljaCB0aGUgbWV0YWRhdGEgbWFwIGlzIHJlcXVlc3RlZAorICAgKi8KKyAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChzQ2xhc3M6Q2xhc3MpOkRpY3Rpb25hcnkgeworICAgIHJldHVybiBzdHJ1Y3RNYXBbc0NsYXNzXTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkVmFsdWVNZXRhRGF0YS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc5ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZFZhbHVlTWV0YURhdGEuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOworCisvKioKKyAqIEZpZWxkVmFsdWVNZXRhRGF0YSBhbmQgY29sbGVjdGlvbiBvZiBzdWJjbGFzc2VzIHRvIHN0b3JlIG1ldGFkYXRhIGFib3V0CisgKiB0aGUgdmFsdWUocykgb2YgYSBmaWVsZAorICovCitjbGFzcyBGaWVsZFZhbHVlTWV0YURhdGEgeworCisgIHB1YmxpYyB2YXIgdHlwZSA6IEludDsKKworICBwdWJsaWMgZnVuY3Rpb24gRmllbGRWYWx1ZU1ldGFEYXRhKHR5cGUgOiBJbnQpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CisKKyAgcHVibGljIGZ1bmN0aW9uIGlzU3RydWN0KCkgOiBCb29sIHsKKyAgICByZXR1cm4gdHlwZSA9PSBUVHlwZS5TVFJVQ1Q7CisgIH0KKworICBwdWJsaWMgZnVuY3Rpb24gaXNDb250YWluZXIoKSA6IEJvb2wgeworICAgIHJldHVybiB0eXBlID09IFRUeXBlLkxJU1QgfHwgdHlwZSA9PSBUVHlwZS5NQVAgfHwgdHlwZSA9PSBUVHlwZS5TRVQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9MaXN0TWV0YURhdGEuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjYTMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTGlzdE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIExpc3RNZXRhRGF0YSBleHRlbmRzIEZpZWxkVmFsdWVNZXRhRGF0YSB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1NZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gTGlzdE1ldGFEYXRhKHR5cGUgOiBJbnQsIGVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGEpIHsKKyAgICAgIHN1cGVyKHR5cGUpOworICAgICAgdGhpcy5lbGVtTWV0YURhdGEgPSBlTWV0YURhdGE7CisgICAgfQorfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvTWFwTWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjNlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL01hcE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIE1hcE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIga2V5TWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhOworICAgIHB1YmxpYyB2YXIgdmFsdWVNZXRhRGF0YTpGaWVsZFZhbHVlTWV0YURhdGE7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gTWFwTWV0YURhdGEodHlwZSA6IEludCwga01ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSwgdk1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YSkgeworICAgICAgc3VwZXIodHlwZSk7CisgICAgICB0aGlzLmtleU1ldGFEYXRhID0ga01ldGFEYXRhOworICAgICAgdGhpcy52YWx1ZU1ldGFEYXRhID0gdk1ldGFEYXRhOworICAgIH0KK30KKyAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU2V0TWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMzY3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1NldE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIFNldE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIgZWxlbU1ldGFEYXRhOkZpZWxkVmFsdWVNZXRhRGF0YTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBTZXRNZXRhRGF0YSh0eXBlIDogSW50LCBlTWV0YURhdGE6RmllbGRWYWx1ZU1ldGFEYXRhKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuZWxlbU1ldGFEYXRhID0gZU1ldGFEYXRhOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvU3RydWN0TWV0YURhdGEuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MjJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL1N0cnVjdE1ldGFEYXRhLmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGE7CisKK2NsYXNzIFN0cnVjdE1ldGFEYXRhIGV4dGVuZHMgRmllbGRWYWx1ZU1ldGFEYXRhIHsKKworICAgIHB1YmxpYyB2YXIgc3RydWN0Q2xhc3M6Q2xhc3M7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RydWN0TWV0YURhdGEodHlwZSA6IEludCwgc0NsYXNzOkNsYXNzKSB7CisgICAgICBzdXBlcih0eXBlKTsKKyAgICAgIHRoaXMuc3RydWN0Q2xhc3MgPSBzQ2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMjkxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaHgKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLkludDY0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworLyoqCisqIEJpbmFyeSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRSZWN1cnNpb25UcmFja2VyIGltcGxlbWVudHMgVFByb3RvY29sIHsKKworICAgIHByaXZhdGUgc3RhdGljIHZhciBBTk9OWU1PVVNfU1RSVUNUOlRTdHJ1Y3QgPSBuZXcgVFN0cnVjdCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBWRVJTSU9OX01BU0sgOiBoYXhlLkludDMyID0gMHhmZmZmMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT05fMSA6IGhheGUuSW50MzIgPSAweDgwMDEwMDAwOworCisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0UmVhZF8gOiBCb29sID0gZmFsc2U7CisgICAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGVfIDogQm9vbCA9IHRydWU7CisgICAgcHJpdmF0ZSB2YXIgdHJhbnNfIDogVFRyYW5zcG9ydDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0cmFuczpUVHJhbnNwb3J0LCBzdHJpY3RSZWFkIDogQm9vbD1mYWxzZSwgc3RyaWN0V3JpdGUgOiBCb29sPXRydWUpIHsKKyAgICAgIHRyYW5zXyA9IHRyYW5zOworICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpOlRUcmFuc3BvcnQgeworICAgICAgcmV0dXJuIHRyYW5zXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZTpUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgaWYgKHN0cmljdFdyaXRlXykgeworICAgICAgICAgIHZhciB2ZXJzaW9uIDogSW50ID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOworICAgICAgICAgIHdyaXRlSTMyKHZlcnNpb24pOworICAgICAgICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CisgICAgICAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3JpdGVTdHJpbmcobWVzc2FnZS5uYW1lKTsKKyAgICAgICAgICB3cml0ZUJ5dGUobWVzc2FnZS50eXBlKTsKKyAgICAgICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKHN0cnVjdDpUU3RydWN0KSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CisgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUoVFR5cGUuU1RPUCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOworICAgICAgd3JpdGVCeXRlKG1hcC52YWx1ZVR5cGUpOworICAgICAgd3JpdGVJMzIobWFwLnNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKGxpc3Q6VExpc3QpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbihzZXQ6VFNldCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CisgICAgICAgIHdyaXRlSTMyKHNldC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQge30KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woYiA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIHdyaXRlQnl0ZShiID8gMSA6IDApOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZShiIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVCeXRlKGIpOworICAgICAgICB0cmFuc18ud3JpdGUob3V0LmdldEJ5dGVzKCksIDAsIDEpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBvdXQgPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgb3V0LmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIG91dC53cml0ZUludDE2KGkxNik7CisgICAgICAgIHRyYW5zXy53cml0ZShvdXQuZ2V0Qnl0ZXMoKSwgMCwgMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaTMyKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIG91dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICBvdXQuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgdmFyIGhpID0gSW50NjQuZ2V0SGlnaChpNjQpOworICAgICAgICB2YXIgbG8gPSBJbnQ2NC5nZXRMb3coaTY0KTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaGkpOworICAgICAgICBvdXQud3JpdGVJbnQzMihsbyk7CisgICAgICAgICNlbHNlCisgICAgICAgIG91dC53cml0ZUludDMyKGk2NC5oaWdoKTsKKyAgICAgICAgb3V0LndyaXRlSW50MzIoaTY0Lmxvdyk7CisgICAgICAgICNlbmQKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoZHViOkZsb2F0KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVEb3VibGUoZHViKTsKKyAgICAgICAgdHJhbnNfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVTdHJpbmcoc3RyKTsKKyAgICAgICAgdmFyIGJ5dGVzID0gb3V0LmdldEJ5dGVzKCk7CisgICAgICAgIHdyaXRlSTMyKCBieXRlcy5sZW5ndGgpOworICAgICAgICB0cmFuc18ud3JpdGUoIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJpbmFyeShiaW46Qnl0ZXMpIDogVm9pZCB7CisgICAgICAgIHdyaXRlSTMyKGJpbi5sZW5ndGgpOworICAgICAgICB0cmFuc18ud3JpdGUoYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSByZWFkSTMyKCk7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdmFyIHZlcnNpb24gOiBJbnQgPSBzaXplICYgVkVSU0lPTl9NQVNLOworICAgICAgICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKHJlYWRTdHJpbmcoKSwgc2l6ZSAmIDB4MDAwMDAwZmYsIHJlYWRJMzIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyaWN0UmVhZF8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwgIk1pc3NpbmcgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luLCBvbGQgY2xpZW50PyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShyZWFkU3RyaW5nQm9keShzaXplKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCkgOiBURmllbGQgeworICAgICAgICB2YXIgdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisgICAgICAgIHZhciBpZCA6IEludCA9IDA7CisgICAgICAgIGlmICh0eXBlICE9IFRUeXBlLlNUT1ApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkID0gcmVhZEkxNigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigpIDogVE1hcCB7CisgICAgICAgIHJldHVybiBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHt9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpOlRMaXN0IHsKKyAgICAgICAgcmV0dXJuIG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigpIDogVFNldCB7CisgICAgICByZXR1cm4gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7fQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOworICAgIH0KKworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCkgOiBJbnQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCAxKTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgMSk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoKSA6IEludCB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdmFyIGxlbiA9IHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIDIpOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCAyKTsKKyAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIHJldHVybiBpbnAucmVhZEludDE2KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdmFyIGxlbiA9IHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIDQpOworICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgIHJldHVybiBpbnAucmVhZEludDMyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA4KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICB2YXIgaGkgPSBpbnAucmVhZEludDMyKCk7CisgICAgICAgIHZhciBsbyA9IGlucC5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIEludDY0Lm1ha2UoaGksbG8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCk6RmxvYXQgeworICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHZhciBsZW4gPSB0cmFuc18ucmVhZEFsbCggYnVmZmVyLCAwLCA4KTsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgOCk7CisgICAgICAgIGlucC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICByZXR1cm4gaW5wLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KCByZWFkSTMyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nQm9keShsZW4gOiBJbnQpIDogU3RyaW5nIHsKKyAgICAgICAgaWYoIGxlbiA+IDApIHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHRyYW5zXy5yZWFkQWxsKCBidWZmZXIsIDAsIGxlbik7CisgICAgICAgICAgICB2YXIgaW5wID0gbmV3IEJ5dGVzSW5wdXQoIGJ1ZmZlci5nZXRCeXRlcygpLCAwLCBsZW4pOworICAgICAgICAgICAgaW5wLmJpZ0VuZGlhbiA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gaW5wLnJlYWRTdHJpbmcobGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHZhciBsZW4gOiBJbnQgPSByZWFkSTMyKCk7CisgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5nZXRCeXRlcygpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTliZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5oeApAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKKyovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHZhciBzdHJpY3RSZWFkXyA6IEJvb2wgPSBmYWxzZTsKKyAgICBwcml2YXRlIHZhciBzdHJpY3RXcml0ZV8gOiBCb29sID0gdHJ1ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHN0cmljdFJlYWQgOiBCb29sID0gZmFsc2UsIHN0cmljdFdyaXRlIDogQm9vbCA9IHRydWUpIHsKKyAgICAgICAgc3RyaWN0UmVhZF8gID0gc3RyaWN0UmVhZDsKKyAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCB0cmFucyA6IFRUcmFuc3BvcnQpIDogVFByb3RvY29sICB7CisgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCB0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CisgICAgfQorfQorCisKKworICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMTNlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmh4CkBAIC0wLDAgKzEsNzE4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuZHMuR2VuZXJpY1N0YWNrOworaW1wb3J0IGhheGUuSW50MzI7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBoYXhlLlV0Zjg7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci5aaWdaYWc7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuaGVscGVyLkJpdENvbnZlcnRlcjsKKworCisvKioKKyogQ29tcGFjdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgorKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgQU5PTllNT1VTX1NUUlVDVCA6IFRTdHJ1Y3QgPSBuZXcgVFN0cnVjdCgiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIFRTVE9QIDogVEZpZWxkID0gbmV3IFRGaWVsZCgiIiwgVFR5cGUuU1RPUCwgMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFBST1RPQ09MX0lEIDogSW50ID0gMHg4MjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFZFUlNJT04gOiBJbnQgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVkVSU0lPTl9NQVNLIDogSW50ID0gMHgxZjsgLy8gMDAwMSAxMTExCisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBUWVBFX01BU0sgOiBJbnQgPSAweEUwOyAvLyAxMTEwIDAwMDAKKyAgICBwcml2YXRlIHN0YXRpYyBpbmxpbmUgdmFyIFRZUEVfQklUUyA6IEludCA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgIHByaXZhdGUgc3RhdGljIGlubGluZSB2YXIgVFlQRV9TSElGVF9BTU9VTlQgOiBJbnQgPSA1OworCisKKyAgICBwcml2YXRlIHN0YXRpYyB2YXIgdHR5cGVUb0NvbXBhY3RUeXBlID0gWworICAgICAgICBUVHlwZS5TVE9QICAgID0+IFRDb21wYWN0VHlwZXMuU1RPUCwKKyAgICAgICAgVFR5cGUuQk9PTCAgICA9PiBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSwKKyAgICAgICAgVFR5cGUuQllURSAgICA9PiBUQ29tcGFjdFR5cGVzLkJZVEUsCisgICAgICAgIFRUeXBlLkRPVUJMRSAgPT4gVENvbXBhY3RUeXBlcy5ET1VCTEUsCisgICAgICAgIFRUeXBlLkkxNiAgICAgPT4gVENvbXBhY3RUeXBlcy5JMTYsCisgICAgICAgIFRUeXBlLkkzMiAgICAgPT4gVENvbXBhY3RUeXBlcy5JMzIsCisgICAgICAgIFRUeXBlLkk2NCAgICAgPT4gVENvbXBhY3RUeXBlcy5JNjQsCisgICAgICAgIFRUeXBlLlNUUklORyAgPT4gVENvbXBhY3RUeXBlcy5CSU5BUlksCisgICAgICAgIFRUeXBlLlNUUlVDVCAgPT4gVENvbXBhY3RUeXBlcy5TVFJVQ1QsCisgICAgICAgIFRUeXBlLk1BUCAgICAgPT4gVENvbXBhY3RUeXBlcy5NQVAsCisgICAgICAgIFRUeXBlLlNFVCAgICAgPT4gVENvbXBhY3RUeXBlcy5TRVQsCisgICAgICAgIFRUeXBlLkxJU1QgICAgPT4gVENvbXBhY3RUeXBlcy5MSVNUCisgICAgXTsKKworICAgIHByaXZhdGUgc3RhdGljIHZhciB0Y29tcGFjdFR5cGVUb1R5cGUgPSBbCisgICAgICAgIFRDb21wYWN0VHlwZXMuU1RPUCAgICAgICAgICA9PiBUVHlwZS5TVE9QLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSAgPT4gVFR5cGUuQk9PTCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFID0+IFRUeXBlLkJPT0wsCisgICAgICAgIFRDb21wYWN0VHlwZXMuQllURSAgICAgICAgICA9PiBUVHlwZS5CWVRFLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkkxNiAgICAgICAgICAgPT4gVFR5cGUuSTE2LAorICAgICAgICBUQ29tcGFjdFR5cGVzLkkzMiAgICAgICAgICAgPT4gVFR5cGUuSTMyLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkk2NCAgICAgICAgICAgPT4gVFR5cGUuSTY0LAorICAgICAgICBUQ29tcGFjdFR5cGVzLkRPVUJMRSAgICAgICAgPT4gVFR5cGUuRE9VQkxFLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkJJTkFSWSAgICAgICAgPT4gVFR5cGUuU1RSSU5HLAorICAgICAgICBUQ29tcGFjdFR5cGVzLkxJU1QgICAgICAgICAgPT4gVFR5cGUuTElTVCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5TRVQgICAgICAgICAgID0+IFRUeXBlLlNFVCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5NQVAgICAgICAgICAgID0+IFRUeXBlLk1BUCwKKyAgICAgICAgVENvbXBhY3RUeXBlcy5TVFJVQ1QgICAgICAgID0+IFRUeXBlLlNUUlVDVAorICAgIF07CisKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBmaWVsZCBmb3IgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN0cnVjdHMsCisgICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBsYXN0RmllbGRfIDogR2VuZXJpY1N0YWNrPEludD4gPSBuZXcgR2VuZXJpY1N0YWNrPEludD4oKTsKKyAgICBwcml2YXRlIHZhciBsYXN0RmllbGRJZF8gOiBJbnQgPSAwOworCisgICAgLyoqCisgICAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCisgICAgICogaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdmFyIGJvb2xlYW5GaWVsZF8gOiBOdWxsPFRGaWVsZD47CisKKyAgICAvKioKKyAgICAgKiBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KKyAgICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZhciBib29sVmFsdWVfIDogTnVsbDxCb29sPjsKKworCisgICAgLy8gd2hldGhlciB0aGUgdW5kZXJseWluZyBzeXN0ZW0gaG9sZHMgU3RyaW5ncyBhcyBVVEYtOAorICAgIC8vIGh0dHA6Ly9vbGQuaGF4ZS5vcmcvbWFudWFsL2VuY29kaW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIHV0ZjhTdHJpbmdzID0gaGF4ZS5VdGY4LnZhbGlkYXRlKCLDhy3Dny3Dhi3Qri3QqCIpOworCisgICAgLy8gdGhlIHRyYW5zcG9ydCB1c2VkCisgICAgcHVibGljIHZhciB0cmFucyhkZWZhdWx0LG51bGwpIDogVFRyYW5zcG9ydDsKKworCisgICAgLy8gVENvbXBhY3RQcm90b2NvbCBDb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHRyYW5zIDogVFRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gdHJhbnM7CisgICAgfQorCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVzZXQoKSA6IFZvaWR7CisgICAgICAgIHdoaWxlICggISBsYXN0RmllbGRfLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgbGFzdEZpZWxkXy5wb3AoKTsKKyAgICAgICAgfQorICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIH0KKworCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCisgICAgICogVXNlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHdyaXRpbmcgbWV0aG9kcyB0aGF0IGtub3cgdGhleSBuZWVkIHRvIFdyaXRlIGEgYnl0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlQnl0ZURpcmVjdCggYiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA9IEJ5dGVzLmFsbG9jKDEpOworICAgICAgICBidWYuc2V0KCAwLCBiKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIGJ1ZiwgMCwgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlVmFyaW50MzIoIG4gOiBVSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgaTMyYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG4gJiB+MHg3RikgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpMzJidWYuYWRkQnl0ZSggbiAmIDB4RkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkzMmJ1Zi5hZGRCeXRlKCAobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBpMzJidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisgICAgKiBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbiggbWVzc2FnZSA6IFRNZXNzYWdlKSA6IFZvaWQgeworICAgICAgICBSZXNldCgpOworCisgICAgICAgIHZhciB2ZXJzaW9uQW5kVHlwZSA6IEludCA9ICAoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spOworICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoIFBST1RPQ09MX0lEKTsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCB2ZXJzaW9uQW5kVHlwZSk7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIGNhc3QoIG1lc3NhZ2Uuc2VxaWQsIFVJbnQpKTsKKyAgICAgICAgd3JpdGVTdHJpbmcoIG1lc3NhZ2UubmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICogdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIGxhc3RGaWVsZF8uYWRkKCBsYXN0RmllbGRJZF8pOworICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCisgICAgICogdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgICAgICogb2YgdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIGxhc3RGaWVsZElkXyA9IGxhc3RGaWVsZF8ucG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQorICAgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCisgICAgICogZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKGZpZWxkOlRGaWVsZCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQk9PTCkKKyAgICAgICAgICAgIGJvb2xlYW5GaWVsZF8gPSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoZmllbGQsIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3b3JraG9yc2Ugb2YgV3JpdGVGaWVsZEJlZ2luLiBJdCBoYXMgdGhlIG9wdGlvbiBvZiBkb2luZyBhCisgICAgICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKKyAgICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggZmllbGQgOiBURmllbGQsIHR5cGVPdmVycmlkZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgLy8gaWYgdGhlcmUncyBhIHR5cGUgb3ZlcnJpZGUsIHVzZSB0aGF0LgorICAgICAgICB2YXIgdHlwZVRvV3JpdGUgOiBJbnQ7CisgICAgICAgIGlmICggdHlwZU92ZXJyaWRlID09IDB4RkYpCisgICAgICAgICAgICB0eXBlVG9Xcml0ZSA9IGdldENvbXBhY3RUeXBlKCBmaWVsZC50eXBlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHVzZSBkZWx0YSBlbmNvZGluZyBmb3IgdGhlIGZpZWxkIGlkCisgICAgICAgIGlmIChmaWVsZC5pZCA+IGxhc3RGaWVsZElkXyAmJiBmaWVsZC5pZCAtIGxhc3RGaWVsZElkXyA8PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KChmaWVsZC5pZCAtIGxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZW0gc2VwYXJhdGUKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCh0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICB3cml0ZUkxNihmaWVsZC5pZCk7CisgICAgICAgIH0KKworICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgU1RPUCBzeW1ib2wgc28gd2Uga25vdyB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBjYXN0KFRDb21wYWN0VHlwZXMuU1RPUCwgSW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKKyAgICAgKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICAgIGlmIChtYXAuc2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoMCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2YXIga3Z0eXBlID0gKGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0KSB8IGdldENvbXBhY3RUeXBlKG1hcC52YWx1ZVR5cGUpOworICAgICAgICAgICAgV3JpdGVWYXJpbnQzMiggY2FzdCggbWFwLnNpemUsIFVJbnQpKTsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgga3Z0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgbGlzdCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCBsaXN0IDogVExpc3QpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBsaXN0LmVsZW1UeXBlLCBsaXN0LnNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgc2V0IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbiggc2V0IDogVFNldCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIHNldC5lbGVtVHlwZSwgc2V0LnNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4gUG90ZW50aWFsbHksIHRoaXMgY291bGQgYmUgYSBib29sZWFuIGZpZWxkLCBpbgorICAgICAqIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgorICAgICAqIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICB2YXIgYmN0IDogSW50ID0gYiA/IFRDb21wYWN0VHlwZXMuQk9PTEVBTl9UUlVFIDogVENvbXBhY3RUeXBlcy5CT09MRUFOX0ZBTFNFOworCisgICAgICAgIGlmIChib29sZWFuRmllbGRfICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUgZmllbGQgaGVhZGVyIHlldAorICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGJvb2xlYW5GaWVsZF8sIGJjdCk7CisgICAgICAgICAgICBib29sZWFuRmllbGRfID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgZmllbGQsIHNvIGp1c3QgV3JpdGUgdGhlIHZhbHVlLgorICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KCBiY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBieXRlLiBOb3RoaW5nIHRvIHNlZSBoZXJlIQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoIGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoIGkxNiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQzMiggWmlnWmFnLkZyb21JbnQoIGkxNikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCBpMzIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlVmFyaW50MzIoIFppZ1phZy5Gcm9tSW50KCBpMzIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCggaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVWYXJpbnQ2NCggIFppZ1phZy5Gcm9tTG9uZyggaTY0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoIGR1YiA6IEZsb2F0KSA6IFZvaWQgeworICAgICAgICB2YXIgZGF0YSA9IEJpdENvbnZlcnRlci5maXhlZExvbmdUb0J5dGVzKCBCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZHViKSk7CisgICAgICAgIHRyYW5zLndyaXRlKCBkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoc3RyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIHN0cik7ICAvLyBubyBuZWVkIHRvIGVuY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIFV0ZjguZW5jb2RlKCBzdHIpKTsKKyAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB3cml0ZUJpbmFyeSggdG1wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkoIGJpbiA6IEJ5dGVzKSA6IFZvaWQgeworICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KGJpbi5sZW5ndGgsVUludCkpOworICAgICAgICB0cmFucy53cml0ZSggYmluLCAwLCBiaW4ubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBzdHJ1Y3RzLCBidXQgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkgd2lyZQorICAgIC8vIG91dHB1dCBvciBwdXJwb3NlLgorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsgfQorCisgICAgLy8KKyAgICAvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlQ29sbGVjdGlvbkJlZ2luKCBlbGVtVHlwZSA6IEludCwgc2l6ZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKHNpemUgPD0gMTQpICAgIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggc2l6ZSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCggMHhmMCB8IGdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSk7CisgICAgICAgICAgICBXcml0ZVZhcmludDMyKCBjYXN0KHNpemUsIFVJbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVWYXJpbnQ2NChuIDogaGF4ZS5JbnQ2NCkgOiBWb2lkICAgIHsKKyAgICAgICAgdmFyIHZhcmludDY0b3V0ID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggSW50NjQuaXNaZXJvKCBJbnQ2NC5hbmQoIG4sIEludDY0Lm5lZyhJbnQ2NC5tYWtlKDAsMHg3RikpKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgI2lmKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCBJbnQ2NC5nZXRMb3cobikpOworICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgdmFyaW50NjRvdXQuYWRkQnl0ZSggbi5sb3cpOworICAgICAgICAgICAgICAgICNlbmQKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjaWYgKCBoYXhlX3ZlciA8IDMuMikKKyAgICAgICAgICAgICAgICB2YXJpbnQ2NG91dC5hZGRCeXRlKCAoSW50NjQuZ2V0TG93KG4pICYgMHg3RikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIHZhcmludDY0b3V0LmFkZEJ5dGUoIChuLmxvdyAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgICAgIG4gPSBJbnQ2NC5zaHIoIG4sIDcpOworICAgICAgICAgICAgICAgIG4gPSBJbnQ2NC5hbmQoIG4sIEludDY0Lm1ha2UoMHgwMUZGRkZGRiwweEZGRkZGRkZGKSk7ICAvLyBjbGVhbiBvdXQgdGhlIHNoaWZ0ZWQgNyBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmFyIHRtcCA9IHZhcmludDY0b3V0LmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCk6VE1lc3NhZ2UgeworICAgICAgICBSZXNldCgpOworCisgICAgICAgIHZhciBwcm90b2NvbElkIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgaWYgKHByb3RvY29sSWQgIT0gUFJPVE9DT0xfSUQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBwcm90b2NvbCBpZCAiICsgU3RyaW5nVG9vbHMuaGV4KFBST1RPQ09MX0lELDIpICsgIiBidXQgZ290ICIgKyBTdHJpbmdUb29scy5oZXgocHJvdG9jb2xJZCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlIDogSW50ID0gcmVhZEJ5dGUoKTsKKyAgICAgICAgdmFyIHZlcnNpb24gOiBJbnQgPSAodmVyc2lvbkFuZFR5cGUgJiBWRVJTSU9OX01BU0spOworICAgICAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA6IEludCA9ICgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTKTsKKyAgICAgICAgdmFyIHNlcWlkIDogSW50ID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIHZhciBtc2dObSA6IFN0cmluZyA9IHJlYWRTdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZSggbXNnTm0sIHR5cGUsIHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAgICAgKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3QgeworICAgICAgICBsYXN0RmllbGRfLmFkZChsYXN0RmllbGRJZF8pOworICAgICAgICBsYXN0RmllbGRJZF8gPSAwOworICAgICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAqIHRoaXMgc3RydWN0IGZyb20gdGhlIGZpZWxkIHN0YWNrLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSBSZWFkIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5wb3AoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oKSA6IFRGaWVsZCB7CisgICAgICAgIHZhciB0eXBlIDogSW50ID0gcmVhZEJ5dGUoKTsKKworICAgICAgICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCisgICAgICAgIGlmICh0eXBlID09IGNhc3QoVENvbXBhY3RUeXBlcy5TVE9QLEludCkpIHsKKyAgICAgICAgICAgIHJldHVybiBUU1RPUDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBmaWVsZElkIDogSW50OworCisgICAgICAgIC8vIG1hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuIGl0IGNvdWxkIGNvbnRhaW4gYSBmaWVsZCBpZCBkZWx0YS4KKyAgICAgICAgdmFyIG1vZGlmaWVyIDogSW50ID0gKCh0eXBlICYgMHhmMCkgPj4gNCk7CisgICAgICAgIGlmIChtb2RpZmllciA9PSAwKQorICAgICAgICAgICAgZmllbGRJZCA9IHJlYWRJMTYoKTsgIC8vIG5vdCBhIGRlbHRhLiBsb29rIGFoZWFkIGZvciB0aGUgemlnemFnIHZhcmludCBmaWVsZCBpZC4KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmllbGRJZCA9IGxhc3RGaWVsZElkXyArIG1vZGlmaWVyOyAvLyBhZGQgdGhlIGRlbHRhIHRvIHRoZSBsYXN0IFJlYWQgZmllbGQgaWQuCisKKyAgICAgICAgdmFyIGZpZWxkIDogVEZpZWxkICA9IG5ldyBURmllbGQoICIiLCBjYXN0KGdldFRUeXBlKHR5cGUgJiAweDBmKSxJbnQpLCBmaWVsZElkKTsKKworICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkgeworICAgICAgICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCisgICAgICAgICAgICBib29sVmFsdWVfID0gKCh0eXBlICYgMHgwZikgPT0gY2FzdChUQ29tcGFjdFR5cGVzLkJPT0xFQU5fVFJVRSxJbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICBsYXN0RmllbGRJZF8gPSBmaWVsZC5pZDsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBtYXAgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIHNpemUgaXMgemVybywgc2tpcCBSZWFkaW5nIHRoZSBrZXkKKyAgICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAqICJjb3JyZWN0IiB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKyAgICAgICAgdmFyIGtleUFuZFZhbHVlVHlwZSA6IEludCA9ICgoc2l6ZSA9PSAwKSAgPyAgMCAgOiAgcmVhZEJ5dGUoKSk7CisgICAgICAgIHZhciBrZXkgOiBJbnQgPSBjYXN0KCBnZXRUVHlwZSggKGtleUFuZFZhbHVlVHlwZSAmIDB4RjApID4+IDQpLCBJbnQpOworICAgICAgICB2YXIgdmFsIDogSW50ID0gY2FzdCggZ2V0VFR5cGUoIGtleUFuZFZhbHVlVHlwZSAmIDB4MEYpLCBJbnQpOworICAgICAgICByZXR1cm4gbmV3IFRNYXAoIGtleSwgdmFsLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICogdHJ1ZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3QgeworICAgICAgICB2YXIgc2l6ZV9hbmRfdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSAoKHNpemVfYW5kX3R5cGUgJiAweEYwKSA+PiA0KSAmIDB4MEY7CisgICAgICAgIGlmIChzaXplID09IDE1KSB7CisgICAgICAgICAgICBzaXplID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICByZXR1cm4gbmV3IFRMaXN0KCB0eXBlLCBzaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCisgICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAgICAgKiBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICogdHJ1ZSBzaXplLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgICB2YXIgc2l6ZV9hbmRfdHlwZSA6IEludCA9IHJlYWRCeXRlKCk7CisKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSAoKHNpemVfYW5kX3R5cGUgJiAweEYwKSA+PiA0KSAmIDB4MEY7CisgICAgICAgIGlmIChzaXplID09IDE1KSB7CisgICAgICAgICAgICBzaXplID0gY2FzdCggUmVhZFZhcmludDMyKCksIEludCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdHlwZSA9IGdldFRUeXBlKHNpemVfYW5kX3R5cGUpOworICAgICAgICByZXR1cm4gbmV3IFRTZXQoIHR5cGUsIHNpemUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgKiBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQorICAgICAqIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCkgOiBCb29sIHsKKyAgICAgICAgaWYgKGJvb2xWYWx1ZV8gIT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA6IEJvb2wgPSBib29sVmFsdWVfOworICAgICAgICAgICAgYm9vbFZhbHVlXyA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IGNhc3QoVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUUsSW50KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgdmFyIGJ5dGVSYXdCdWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnl0ZVJhd0J1ZiwgMCwgMSk7CisgICAgICAgIHJldHVybiBieXRlUmF3QnVmLmdldEJ5dGVzKCkuZ2V0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gWmlnWmFnLlRvSW50KCBSZWFkVmFyaW50MzIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiBaaWdaYWcuVG9JbnQoIFJlYWRWYXJpbnQzMigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiBaaWdaYWcuVG9Mb25nKCBSZWFkVmFyaW50NjQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoKTpGbG9hdCB7CisgICAgICAgIHZhciBsb25nQml0cyA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICB0cmFucy5yZWFkQWxsKCBsb25nQml0cywgMCwgOCk7CisgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoIEJpdENvbnZlcnRlci5ieXRlc1RvTG9uZyggbG9uZ0JpdHMuZ2V0Qnl0ZXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICAgIHZhciBsZW5ndGggOiBJbnQgPSBjYXN0KCBSZWFkVmFyaW50MzIoKSwgSW50KTsKKworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnVmLCAwLCBsZW5ndGgpOworCisgICAgICAgIGxlbmd0aCA9IGJ1Zi5sZW5ndGg7CisgICAgICAgIHZhciBpbnAgPSBuZXcgQnl0ZXNJbnB1dCggYnVmLmdldEJ5dGVzKCkpOworICAgICAgICB2YXIgc3RyID0gaW5wLnJlYWRTdHJpbmcoIGxlbmd0aCk7CisgICAgICAgIGlmKCB1dGY4U3RyaW5ncykKKyAgICAgICAgICAgIHJldHVybiBzdHI7ICAvLyBubyBuZWVkIHRvIGRlY29kZSBvbiBVVEY4IHRhcmdldHMsIHRoZSBzdHJpbmcgaXMganVzdCBmaW5lCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBVdGY4LmRlY29kZSggc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGxlbmd0aCA6IEludCA9IGNhc3QoIFJlYWRWYXJpbnQzMigpLCBJbnQpOworICAgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlcy5hbGxvYygwKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgdHJhbnMucmVhZEFsbCggYnVmLCAwLCBsZW5ndGgpOworICAgICAgICByZXR1cm4gYnVmLmdldEJ5dGVzKCk7CisgICAgfQorCisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSBoZXJlIGZvciB0aGUgc3RydWN0IHRvIGNhbGwsIGJ1dCBkb24ndCBoYXZlIGFueSB3aXJlCisgICAgLy8gZW5jb2RpbmcuCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSA6IFZvaWQgeyB9CisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgOiBWb2lkIHsgfQorCisgICAgLy8KKyAgICAvLyBJbnRlcm5hbCBSZWFkaW5nIG1ldGhvZHMKKyAgICAvLworCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZFZhcmludDMyKCkgOiBVSW50IHsKKyAgICAgICAgdmFyIHJlc3VsdCA6IFVJbnQgPSAwOworICAgICAgICB2YXIgc2hpZnQgOiBJbnQgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdmFyIGIgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgcmVzdWx0IHw9IGNhc3QoKGIgJiAweDdmKSA8PCBzaGlmdCwgVUludCk7CisgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaGlmdCArPSA3OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkVmFyaW50NjQoKSA6IEludDY0IHsKKyAgICAgICAgdmFyIHNoaWZ0IDogSW50ID0gMDsKKyAgICAgICAgdmFyIHJlc3VsdCA6IEludDY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdmFyIGIgOiBJbnQgPSByZWFkQnl0ZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gSW50NjQub3IoIHJlc3VsdCwgSW50NjQuc2hsKCBJbnQ2NC5tYWtlKDAsYiAmIDB4N2YpLCBzaGlmdCkpOworICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgIT0gMHg4MCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisKKyAgICAvLworICAgIC8vIHR5cGUgdGVzdGluZyBhbmQgY29udmVydGluZworICAgIC8vCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGlzQm9vbFR5cGUoIGIgOiBJbnQpIDogQm9vbCB7CisgICAgICAgIHZhciBsb3dlck5pYmJsZSA6IEludCA9IGIgJiAweDBmOworICAgICAgICBzd2l0Y2gobG93ZXJOaWJibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVENvbXBhY3RUeXBlcy5CT09MRUFOX1RSVUU6IHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSBUQ29tcGFjdFR5cGVzLkJPT0xFQU5fRkFMU0U6IHJldHVybiB0cnVlOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RUeXBlcyBjb25zdGFudCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAqIFRUeXBlIHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VFR5cGUoIHR5cGUgOiBJbnQpIDogSW50IHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0Y29tcGFjdFR5cGVUb1R5cGVbdHlwZV07CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHR0IDogSW50ID0gKHR5cGUgJiAweDBmKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAnZG9uXCd0IGtub3cgd2hhdCB0eXBlOiAkdHQgKCRlKScpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFR5cGVzIGNvbnN0YW50LgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0Q29tcGFjdFR5cGUoIHR0eXBlIDogSW50KSA6IEludAorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhc3QoIHR0eXBlVG9Db21wYWN0VHlwZVt0dHlwZV0sIEludCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NjczYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIENvbXBhY3QgUHJvdG9jb2wgRmFjdG9yeQorKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2woIHRyYW5zKTsKKyAgICB9Cit9CisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RUeXBlcy5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQzZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0VHlwZXMuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworLyoqCisgKiBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KKyAqLworQDplbnVtCithYnN0cmFjdCBUQ29tcGFjdFR5cGVzKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVE9QICAgICAgICAgID0gMHgwMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgQk9PTEVBTl9UUlVFICA9IDB4MDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0xFQU5fRkFMU0UgPSAweDAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCWVRFICAgICAgICAgID0gMHgwMzsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSTE2ICAgICAgICAgICA9IDB4MDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkzMiAgICAgICAgICAgPSAweDA1OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBJNjQgICAgICAgICAgID0gMHgwNjsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgRE9VQkxFICAgICAgICA9IDB4MDc7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJJTkFSWSAgICAgICAgPSAweDA4OworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBMSVNUICAgICAgICAgID0gMHgwOTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VUICAgICAgICAgICA9IDB4MEE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BUCAgICAgICAgICAgPSAweDBCOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVFJVQ1QgICAgICAgID0gMHgwQzsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1NDk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuaHgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBURmllbGQgeworCisgICAgcHVibGljIHZhciBuYW1lIDogU3RyaW5nOworICAgIHB1YmxpYyB2YXIgdHlwZSA6IEludDsKKyAgICBwdWJsaWMgdmFyIGlkIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhuIDogU3RyaW5nID0gIiIsIHQgOiBJbnQgPSAwLCBpIDogSW50ID0gMCkgeworICAgICAgbmFtZSA9IG47CisgICAgICB0eXBlID0gdDsKKyAgICAgIGlkID0gaTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKSA6IFN0cmluZyB7CisgICAgICByZXR1cm4gJzxURmllbGQgbmFtZToiJG5hbWUiIHR5cGU6IiR0eXBlIiBmaWVsZC1pZDoiJGlkIj4nOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoIG90aGVyRmllbGQgOiBURmllbGQpIDogQm9vbCB7CisgICAgICByZXR1cm4gKHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlKQorICAgICAgICAgICYmIChpZCA9PSBvdGhlckZpZWxkLmlkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwZmYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmh4CkBAIC0wLDAgKzEsMTA3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuZHMuR2VuZXJpY1N0YWNrOworaW1wb3J0IGhheGUuVXRmODsKK2ltcG9ydCBoYXhlLmNyeXB0by5CYXNlNjQ7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisKKy8qIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyogIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisqCisqICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSB3aXJlIGZvcm1hdC4KKyoKKyogIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorKi8KK2NsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUmVjdXJzaW9uVHJhY2tlciBpbXBsZW1lbnRzIFRQcm90b2NvbCB7CisKKyAgICBwdWJsaWMgdmFyIHRyYW5zKGRlZmF1bHQsbnVsbCkgOiBUVHJhbnNwb3J0OworCisgICAgLy8gU3RhY2sgb2YgbmVzdGVkIGNvbnRleHRzIHRoYXQgd2UgbWF5IGJlIGluCisgICAgcHJpdmF0ZSB2YXIgY29udGV4dFN0YWNrIDogR2VuZXJpY1N0YWNrPEpTT05CYXNlQ29udGV4dD4gPSBuZXcgR2VuZXJpY1N0YWNrPEpTT05CYXNlQ29udGV4dD4oKTsKKworICAgIC8vIEN1cnJlbnQgY29udGV4dCB0aGF0IHdlIGFyZSBpbgorICAgIHByaXZhdGUgdmFyIGNvbnRleHQgOiBKU09OQmFzZUNvbnRleHQ7CisKKyAgICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgorICAgIHByaXZhdGUgdmFyIHJlYWRlciA6IExvb2thaGVhZFJlYWRlcjsKKworICAgIC8vIHdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3lzdGVtIGhvbGRzIFN0cmluZ3MgYXMgVVRGLTgKKyAgICAvLyBodHRwOi8vb2xkLmhheGUub3JnL21hbnVhbC9lbmNvZGluZworICAgIHByaXZhdGUgc3RhdGljIHZhciB1dGY4U3RyaW5ncyA9IGhheGUuVXRmOC52YWxpZGF0ZSgiw4ctw58tw4Yt0K4t0KgiKTsKKworICAgIC8vIFRKU09OUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFucyA6IFRUcmFuc3BvcnQpCisgICAgeworICAgICAgICB0aGlzLnRyYW5zID0gdHJhbnM7CisgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgIHRoaXMucmVhZGVyID0gbmV3IExvb2thaGVhZFJlYWRlcih0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiB0cmFuczsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4obWVzc2FnZTpUTWVzc2FnZSkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBKU09OQ29uc3RhbnRzLlZFUlNJT04pOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyhtZXNzYWdlLm5hbWUpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWVzc2FnZS50eXBlKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWVzc2FnZS5zZXFpZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oc3RydWN0OlRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGZpZWxkLmlkICk7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBmaWVsZC50eXBlKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC5rZXlUeXBlKSkpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggbWFwLnZhbHVlVHlwZSkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbWFwLnNpemUpOworICAgICAgICBXcml0ZUpTT05PYmplY3RTdGFydCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTk9iamVjdEVuZCgpOworICAgICAgICBXcml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQgeworICAgICAgICBXcml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIFdyaXRlSlNPTlN0cmluZyggQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLkdldFR5cGVOYW1lRm9yVHlwZUlEKCBsaXN0LmVsZW1UeXBlICkpKTsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggbGlzdC5zaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbihzZXQ6VFNldCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICBXcml0ZUpTT05TdHJpbmcoIEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5HZXRUeXBlTmFtZUZvclR5cGVJRCggc2V0LmVsZW1UeXBlKSkpOworICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCBzZXQuc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKGIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICBpZiggYikKKyAgICAgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBXcml0ZUpTT05JbnRlZ2VyKCAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKGIgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNihpMTYgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIFdyaXRlSlNPTkludGVnZXIoIGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OSW50ZWdlciggaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoaTY0IDogaGF4ZS5JbnQ2NCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OSW50NjQoIGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKGR1YjpGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OU3RyaW5nKCBCeXRlc0Zyb21TdHJpbmcoc3RyKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KGJpbjpCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgV3JpdGVKU09OQmFzZTY0KGJpbik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKTpUTWVzc2FnZSB7CisgICAgICAgIHZhciBtZXNzYWdlIDogVE1lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoKTsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIGlmIChSZWFkSlNPTkludGVnZXIoKSAhPSBKU09OQ29uc3RhbnRzLlZFUlNJT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgICAgIH0KKworICAgICAgICBtZXNzYWdlLm5hbWUgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgIG1lc3NhZ2UudHlwZSA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICBtZXNzYWdlLnNlcWlkID0gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCk6VFN0cnVjdCB7CisgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUU3RydWN0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgdmFyIGZpZWxkIDogVEZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICB2YXIgY2ggPSByZWFkZXIuUGVlaygpOworICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSA9PSBKU09OQ29uc3RhbnRzLlJCUkFDRSkKKyAgICAgICAgeworICAgICAgICAgICAgZmllbGQudHlwZSA9IFRUeXBlLlNUT1A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmaWVsZC5pZCA9IFJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAgICAgUmVhZEpTT05PYmplY3RTdGFydCgpOworICAgICAgICAgICAgZmllbGQudHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTk9iamVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oKSA6IFRNYXAgeworICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgdmFyIEtleVR5cGUgPSBKU09OQ29uc3RhbnRzLkdldFR5cGVJREZvclR5cGVOYW1lKCBSZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB2YXIgVmFsdWVUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIENvdW50IDogSW50ID0gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgIFJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICAgICAgICB2YXIgbWFwID0gbmV3IFRNYXAoIEtleVR5cGUsIFZhbHVlVHlwZSwgQ291bnQpOworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgUmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCk6VExpc3QgeworICAgICAgICBSZWFkSlNPTkFycmF5U3RhcnQoKTsKKyAgICAgICAgdmFyIEVsZW1lbnRUeXBlID0gSlNPTkNvbnN0YW50cy5HZXRUeXBlSURGb3JUeXBlTmFtZSggUmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgdmFyIENvdW50IDogSW50ID0gUmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgdmFyIGxpc3QgPSBuZXcgVExpc3QoIEVsZW1lbnRUeXBlLCBDb3VudCk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCkgOiBUU2V0IHsKKyAgICAgICAgUmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgIHZhciBFbGVtZW50VHlwZSA9IEpTT05Db25zdGFudHMuR2V0VHlwZUlERm9yVHlwZU5hbWUoIFJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgIHZhciBDb3VudCA6IEludCA9IFJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHZhciBzZXQgPSBuZXcgVFNldCggRWxlbWVudFR5cGUsIENvdW50KTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIFJlYWRKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gKFJlYWRKU09OSW50ZWdlcigpICE9IDApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIFJlYWRKU09OSW50ZWdlcigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQgeworICAgICAgICByZXR1cm4gUmVhZEpTT05JbnRlZ2VyKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoKSA6IEludCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludGVnZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgpIDogaGF4ZS5JbnQ2NCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkludDY0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoKTpGbG9hdCB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkRvdWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgICByZXR1cm4gUmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHJldHVybiBSZWFkSlNPTkJhc2U2NCgpOworICAgIH0KKworICAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgIHByaXZhdGUgZnVuY3Rpb24gIFB1c2hDb250ZXh0KGMgOiBKU09OQmFzZUNvbnRleHQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHRTdGFjay5hZGQoY29udGV4dCk7CisgICAgICAgIGNvbnRleHQgPSBjOworICAgIH0KKworICAgIC8vIFBvcCB0aGUgbGFzdCBKU09OIGNvbnRleHQgb2ZmIHRoZSBzdGFjaworICAgIHByaXZhdGUgZnVuY3Rpb24gIFBvcENvbnRleHQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0ID0gY29udGV4dFN0YWNrLnBvcCgpOworICAgIH0KKworCisgICAgLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05TdHJpbmcoIGIgOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKworICAgICAgICBmb3IgKGkgaW4gMCAuLi4gYi5sZW5ndGgpIHsKKyAgICAgICAgICAgIHZhciB2YWx1ZSA9IGIuZ2V0KGkpOworCisgICAgICAgICAgICBpZiAoKHZhbHVlICYgMHgwMEZGKSA+PSAweDMwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpbmcuZnJvbUNoYXJDb2RlKHZhbHVlKSA9PSBKU09OQ29uc3RhbnRzLkJBQ0tTTEFTSC5jaGFyQXQoMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuQkFDS1NMQVNIICsgSlNPTkNvbnN0YW50cy5CQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIGIsIGksIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbnVtID0gSlNPTkNvbnN0YW50cy5KU09OX0NIQVJfVEFCTEVbdmFsdWVdOworICAgICAgICAgICAgICAgIGlmIChudW0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCBiLCBpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVtID4gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5CQUNLU0xBU0gpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZSggbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVmID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEpTT05Db25zdGFudHMuRVNDU0VRKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHhGRjAwMDAwMCkgPj4gMTIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSGV4Q2hhciggKHZhbHVlICYgMHgwMEZGMDAwMCkgPj4gOCkpOworICAgICAgICAgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBIZXhDaGFyKCAodmFsdWUgJiAweDAwMDBGRjAwKSA+PiA0KSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEhleENoYXIoIHZhbHVlICYgMHgwMDAwMDBGRikpOworICAgICAgICAgICAgICAgICAgICB0bXAgPSBidWYuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdG1wID0gQnl0ZXNGcm9tU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLAorICAgIC8vIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05JbnRlZ2VyKCBudW0gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIHZhciBlc2NhcGVOdW0gOiBCb29sID0gY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gU3RkLnN0cmluZyhudW0pOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggc3RyKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLAorICAgIC8vIGl0IHdpbGwgYmUgd3JhcHBlZCBpbiBxdW90ZXMgdG8gb3V0cHV0IGFzIGEgSlNPTiBzdHJpbmcuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05JbnQ2NCggbnVtIDogSW50NjQpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIHZhciBlc2NhcGVOdW0gOiBCb29sID0gY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gU3RkLnN0cmluZyhudW0pOworCisgICAgICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgICAgICAgIHN0ciArPSBKU09OQ29uc3RhbnRzLlFVT1RFOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggc3RyKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgfQorCisgICAgLy8gV3JpdGUgb3V0IGEgZG91YmxlIGFzIGEgSlNPTiB2YWx1ZS4gSWYgaXQgaXMgTmFOIG9yIGluZmluaXR5IG9yIGlmIHRoZQorICAgIC8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkRvdWJsZShudW0gOiBGbG9hdCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisKKyAgICAgICAgdmFyIHNwZWNpYWwgOiBCb29sID0gZmFsc2U7CisgICAgICAgIHZhciByZW5kZXJlZCA6IFN0cmluZyA9ICIiOworICAgICAgICBpZiggTWF0aC5pc05hTihudW0pKSB7CisgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgIHJlbmRlcmVkID0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19OQU47CisgICAgICAgIH0gZWxzZSBpZiAoISBNYXRoLmlzRmluaXRlKG51bSkpIHsKKyAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgaWYoIG51bSA+IDApIHsKKyAgICAgICAgICAgICAgICByZW5kZXJlZCA9IEpTT05Db25zdGFudHMuRkxPQVRfSVNfUE9TX0lORjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQgPSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX05FR19JTkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW5kZXJlZCA9IFN0ZC5zdHJpbmcobnVtKTsgIC8vIHBsYWluIGFuZCBzaW1wbGUgZmxvYXQgbnVtYmVyCisgICAgICAgIH0KKworICAgICAgICAvLyBjb21wb3NlIG91dHB1dAorICAgICAgICB2YXIgZXNjYXBlTnVtIDogQm9vbCA9IHNwZWNpYWwgfHwgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCk7CisgICAgICAgIHZhciBzdHIgOiBTdHJpbmcgPSAiIjsKKyAgICAgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgICAgICAgc3RyICs9IEpTT05Db25zdGFudHMuUVVPVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RyICs9IHJlbmRlcmVkOworICAgICAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICAgICAgICBzdHIgKz0gSlNPTkNvbnN0YW50cy5RVU9URTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIHN0cik7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIC8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZCBkYXRhCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBXcml0ZUpTT05CYXNlNjQoIGIgOiBCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5Xcml0ZSgpOworCisgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIEJhc2U2NC5lbmNvZGUoYikpOworICAgICAgICBidWYuYWRkU3RyaW5nKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKworICAgICAgICB2YXIgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgIHRyYW5zLndyaXRlKCB0bXAsIDAsIHRtcC5sZW5ndGgpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OT2JqZWN0U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuTEJSQUNFKTsKKyAgICAgICAgdHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIFB1c2hDb250ZXh0KCBuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTk9iamVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgdmFyIHRtcCA9IEJ5dGVzRnJvbVN0cmluZyggSlNPTkNvbnN0YW50cy5SQlJBQ0UpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFdyaXRlSlNPTkFycmF5U3RhcnQoKSA6IFZvaWQgeworICAgICAgICBjb250ZXh0LldyaXRlKCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuTEJSQUNLRVQpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgUHVzaENvbnRleHQoIG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gV3JpdGVKU09OQXJyYXlFbmQoKSA6IFZvaWQgeworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIHZhciB0bXAgPSBCeXRlc0Zyb21TdHJpbmcoIEpTT05Db25zdGFudHMuUkJSQUNLRVQpOworICAgICAgICB0cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKworICAgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBjaGFyLCBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVhZEpTT05TeW50YXhDaGFyKCBjaGFyIDogU3RyaW5nKSA6IFZvaWQgeworICAgICAgICB2YXIgYiA9IEJ5dGVzRnJvbVN0cmluZyggY2hhcik7CisKKyAgICAgICAgdmFyIGNoID0gcmVhZGVyLlJlYWQoKTsKKyAgICAgICAgaWYgKGNoLmdldCgwKSAhPSBiLmdldCgwKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICRjaCcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLgorICAgIC8vIFNraXAgUmVhZGluZyBmcm9tIHRoZSBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTlN0cmluZyhza2lwQ29udGV4dCA6IEJvb2wpIDogU3RyaW5nCisgICAgeworICAgICAgICBpZiAoIXNraXBDb250ZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBidWZmZXIgOiBCeXRlc0J1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworCisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY2ggPSByZWFkZXIuUmVhZCgpOworCisgICAgICAgICAgICAvLyBlbmQgb2Ygc3RyaW5nPworICAgICAgICAgICAgaWYgKFN0cmluZ0Zyb21CeXRlcyhjaCkgPT0gSlNPTkNvbnN0YW50cy5RVU9URSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZXNjYXBlZD8KKyAgICAgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMoY2gpICE9IEpTT05Db25zdGFudHMuRVNDU0VRLmNoYXJBdCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkQnl0ZSggY2guZ2V0KDApKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggKGhleCB1bmljb2RlKSBhbmQgXFggKGNvbnRyb2wgY2hhcnMpCisgICAgICAgICAgICBjaCA9IHJlYWRlci5SZWFkKCk7CisgICAgICAgICAgICBpZiAoU3RyaW5nRnJvbUJ5dGVzKGNoKSAhPSBKU09OQ29uc3RhbnRzLkVTQ1NFUS5jaGFyQXQoMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gSlNPTkNvbnN0YW50cy5FU0NBUEVfQ0hBUlNfVE9fVkFMVUVTW2NoLmdldCgwKV07CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiRXhwZWN0ZWQgY29udHJvbCBjaGFyIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGRCeXRlKCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgIHZhciBoZXhidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHZhciBoZXhsZW4gPSB0cmFucy5yZWFkQWxsKCBoZXhidWYsIDAsIDQpOworICAgICAgICAgICAgaWYoIGhleGxlbiAhPSA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOb3QgZW5vdWdoIGRhdGEgZm9yIFxcdU5OTk4gc2VxdWVuY2UiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGhleGRpZ2l0cyA9IGhleGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgdmFyIGNoYXJjb2RlID0gMDsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMCkpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMSkpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMikpKTsKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDQpICsgSGV4VmFsKCBTdHJpbmcuZnJvbUNoYXJDb2RlKGhleGRpZ2l0cy5nZXQoMykpKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hZGRTdHJpbmcoIFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhcmNvZGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTdHJpbmdGcm9tQnl0ZXMoIGJ1ZmZlci5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIElzSlNPTk51bWVyaWMoYiA6IEludCkgOiBCb29sIHsKKyAgICAgICAgc3dpdGNoIChiKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICIrIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICItIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIuIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIwIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIxIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIyIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICIzIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI0Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI1Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI2Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI3Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI4Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICI5Ii5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJFIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBjYXNlICJlIi5jb2RlOiAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAvLyBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk51bWVyaWNDaGFycygpIDogU3RyaW5nCisgICAgeworICAgICAgICB2YXIgYnVmZmVyIDogQnl0ZXNCdWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IHJlYWRlci5QZWVrKCk7CisgICAgICAgICAgICBpZiggISBJc0pTT05OdW1lcmljKCBjaC5nZXQoMCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLmFkZEJ5dGUoIHJlYWRlci5SZWFkKCkuZ2V0KDApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nRnJvbUJ5dGVzKCBidWZmZXIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgorICAgIHByaXZhdGUgZnVuY3Rpb24gUmVhZEpTT05JbnRlZ2VyKCkgOiBJbnQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKworICAgICAgICBpZiAoY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpIHsKKyAgICAgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5RVU9URSk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgdmFsdWUgPSBTdGQucGFyc2VJbnQoc3RyKTsKKyAgICAgICAgaWYoIHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkludDY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuRXNjYXBlTnVtYmVycygpKSB7CisgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHN0ciA6IFN0cmluZyA9IFJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisgICAgICAgIGlmKCBzdHIubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgeworICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3Mgc2lnbgorICAgICAgICB2YXIgYk1pbnVzID0gZmFsc2U7CisgICAgICAgIHZhciBzdGFydEF0ID0gMDsKKyAgICAgICAgaWYoIChzdHIuY2hhckF0KDApID09ICIrIikgfHwgKHN0ci5jaGFyQXQoMCkgPT0gIi0iKSkgeworICAgICAgICAgICAgYk1pbnVzID0gKHN0ci5jaGFyQXQoMCkgPT0gIi0iKTsKKyAgICAgICAgICAgIHN0YXJ0QXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgZGlnaXRzCisgICAgICAgIHZhciB2YWx1ZSA6IEludDY0ID0gSW50NjQubWFrZSgwLDApOworICAgICAgICB2YXIgYkdvdERpZ2l0cyA9IGZhbHNlOworICAgICAgICBmb3IoIGkgaW4gc3RhcnRBdCAuLi4gc3RyLmxlbmd0aCkgeworICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsKKyAgICAgICAgICAgIHZhciBkaWdpdCA9IEpTT05Db25zdGFudHMuREVDSU1BTF9ESUdJVFNbY2hdOworICAgICAgICAgICAgaWYoIGRpZ2l0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICdCYWQgbnVtZXJpYyBkYXRhOiAkc3RyJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiR290RGlnaXRzID0gdHJ1ZTsKKworICAgICAgICAgICAgLy8gdGhlc2UgYXJlIGRlY2ltYWwgZGlnaXRzCisgICAgICAgICAgICB2YWx1ZSA9IEludDY0Lm11bCggdmFsdWUsIEludDY0Lm1ha2UoMCwxMCkpOworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5hZGQoIHZhbHVlLCBJbnQ2NC5tYWtlKDAsZGlnaXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgcGVuZGluZyBtaW51cyBzaWduLCBpZiBhcHBsaWNhYmxlCisgICAgICAgIC8vIHRoaXMgc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBlZGdlIGNhc2UgTUlOX0lOVDY0IGNvcnJlY3RseQorICAgICAgICBpZiggYk1pbnVzICYmIChJbnQ2NC5jb21wYXJlKHZhbHVlLEludDY0Lm1ha2UoMCwwKSkgPiAwKSkgeworICAgICAgICAgICAgdmFsdWUgPSBJbnQ2NC5uZWcoIHZhbHVlKTsKKyAgICAgICAgICAgIGJNaW51cyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEgYkdvdERpZ2l0cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAnQmFkIG51bWVyaWMgZGF0YTogJHN0cicpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgIC8vIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTkRvdWJsZSgpIDogRmxvYXQgeworICAgICAgICBjb250ZXh0LlJlYWQoKTsKKworICAgICAgICB2YXIgc3RyIDogU3RyaW5nID0gIiI7CisgICAgICAgIGlmIChTdHJpbmdGcm9tQnl0ZXMocmVhZGVyLlBlZWsoKSkgPT0gSlNPTkNvbnN0YW50cy5RVU9URSkgeworICAgICAgICAgICAgc3RyID0gUmVhZEpTT05TdHJpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZXMKKyAgICAgICAgICAgIGlmKCBzdHIgPT0gSlNPTkNvbnN0YW50cy5GTE9BVF9JU19OQU4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5OYU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggc3RyID09IEpTT05Db25zdGFudHMuRkxPQVRfSVNfUE9TX0lORikgeworICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLlBPU0lUSVZFX0lORklOSVRZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIHN0ciA9PSBKU09OQ29uc3RhbnRzLkZMT0FUX0lTX05FR19JTkYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5ORUdBVElWRV9JTkZJTklUWTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICEgY29udGV4dC5Fc2NhcGVOdW1iZXJzKCkpICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aHJvdyAtIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIEVzY2FwZU51bWJlcnMoKSA9PSB0cnVlCisgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlFVT1RFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RyID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnNlIGFuZCBjaGVjayAtIHdlIHNob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSB2YWxpZCBkaWdpdAorICAgICAgICB2YXIgZHViID0gU3RkLnBhcnNlRmxvYXQoIHN0cik7CisgICAgICAgIGlmKCAoc3RyLmxlbmd0aCA9PSAwKSB8fCBNYXRoLmlzTmFOKGR1YikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0JhZCBudW1lcmljIGRhdGE6ICRzdHInKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkdWI7CisgICAgfQorCisgICAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYmFzZS02NCBlbmNvZGVkIGRhdGEgYW5kIGRlY29kZSBpdC4KKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQmFzZTY0KCkgOiBCeXRlcworICAgIHsKKyAgICAgICAgdmFyIHN0ciA9IFJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUoIHN0cik7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBSZWFkSlNPTk9iamVjdFN0YXJ0KCkgOiBWb2lkIHsKKyAgICAgICAgY29udGV4dC5SZWFkKCk7CisgICAgICAgIFJlYWRKU09OU3ludGF4Q2hhciggSlNPTkNvbnN0YW50cy5MQlJBQ0UpOworICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTlBhaXJDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OT2JqZWN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLlJCUkFDRSk7CisgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQXJyYXlTdGFydCgpIDogVm9pZCB7CisgICAgICAgIGNvbnRleHQuUmVhZCgpOworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuTEJSQUNLRVQpOworICAgICAgICBQdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIFJlYWRKU09OQXJyYXlFbmQoKSA6IFZvaWQgeworICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoIEpTT05Db25zdGFudHMuUkJSQUNLRVQpOworICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEJ5dGVzRnJvbVN0cmluZyggc3RyIDogU3RyaW5nKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICBpZiggdXRmOFN0cmluZ3MpCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBzdHIpOyAgLy8gbm8gbmVlZCB0byBlbmNvZGUgb24gVVRGOCB0YXJnZXRzLCB0aGUgc3RyaW5nIGlzIGp1c3QgZmluZQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWYuYWRkU3RyaW5nKCBVdGY4LmVuY29kZSggc3RyKSk7CisgICAgICAgIHJldHVybiBidWYuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFN0cmluZ0Zyb21CeXRlcyggYnVmIDogQnl0ZXMpIDogU3RyaW5nIHsKKyAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWYpOworICAgICAgICBpZiggYnVmLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuICIiOyAgLy8gcmVhZFN0cmluZygpIHdvdWxkIHJldHVybiBudWxsIGluIHRoYXQgY2FzZSwgd2hpY2ggaXMgd3JvbmcKKyAgICAgICAgdmFyIHN0ciA9IGlucC5yZWFkU3RyaW5nKCBidWYubGVuZ3RoKTsKKyAgICAgICAgaWYoIHV0ZjhTdHJpbmdzKQorICAgICAgICAgICAgcmV0dXJuIHN0cjsgIC8vIG5vIG5lZWQgdG8gZGVjb2RlIG9uIFVURjggdGFyZ2V0cywgdGhlIHN0cmluZyBpcyBqdXN0IGZpbmUKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFV0ZjguZGVjb2RlKCBzdHIpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIEhleFZhbChjaGFyIDogU3RyaW5nKSA6IEludCB7CisgICAgICAgIHZhciB2YWx1ZSA9IEpTT05Db25zdGFudHMuSEVYX0RJR0lUU1tjaGFyXTsKKyAgICAgICAgaWYoIHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJ0V4cGVjdGVkIGhleCBjaGFyYWN0ZXI6ICRjaGFyJyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggbmliYmxlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGhleCBjaGFyYWN0ZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBIZXhDaGFyKG5pYmJsZSA6IEludCkgOiBTdHJpbmcKKyAgICB7CisgICAgICAgIHJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiIuY2hhckF0KG5pYmJsZSAmIDB4MEYpOworICAgIH0KKworCit9CisKKworQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkNvbnN0YW50cyB7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQ09NTUEgPSAiLCI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQ09MT04gPSAiOiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTEJSQUNFID0gInsiOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIFJCUkFDRSA9ICJ9IjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBMQlJBQ0tFVCA9ICJbIjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBSQlJBQ0tFVCA9ICJdIjsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBRVU9URSA9ICJcIiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgQkFDS1NMQVNIID0gIlxcIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ1NFUSA9ICJcXHUiOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfTkFOID0gIk5hTiI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfUE9TX0lORiA9ICJJbmZpbml0eSI7CisgICAgcHVibGljIHN0YXRpYyB2YXIgRkxPQVRfSVNfTkVHX0lORiA9ICItSW5maW5pdHkiOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgVkVSU0lPTiA9IDE7CisgICAgcHVibGljIHN0YXRpYyB2YXIgSlNPTl9DSEFSX1RBQkxFID0gWworICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgImIiLmNvZGUsICJ0Ii5jb2RlLCAibiIuY29kZSwgIDAsICJmIi5jb2RlLCAiciIuY29kZSwgIDAsICAwLAorICAgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAgIDEsICAxLCAiXCIiLmNvZGUsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgXTsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ0FQRV9DSEFSUyAgICAgPSBbJyInLCdcXCcsJy8nLCdiJywnZicsJ24nLCdyJywndCddOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIEVTQ0FQRV9DSEFSU19UT19WQUxVRVMgPSBbCisgICAgICAgICJcIiIuY29kZSA9PiAweDIyLAorICAgICAgICAiXFwiLmNvZGUgPT4gMHg1QywKKyAgICAgICAgIi8iLmNvZGUgID0+IDB4MkYsCisgICAgICAgICJiIi5jb2RlICA9PiAweDA4LAorICAgICAgICAiZiIuY29kZSAgPT4gMHgwQywKKyAgICAgICAgIm4iLmNvZGUgID0+IDB4MEEsCisgICAgICAgICJyIi5jb2RlICA9PiAweDBELAorICAgICAgICAidCIuY29kZSAgPT4gMHgwOQorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBERUNJTUFMX0RJR0lUUyA9IFsKKyAgICAgICAgIjAiID0+IDAsCisgICAgICAgICIxIiA9PiAxLAorICAgICAgICAiMiIgPT4gMiwKKyAgICAgICAgIjMiID0+IDMsCisgICAgICAgICI0IiA9PiA0LAorICAgICAgICAiNSIgPT4gNSwKKyAgICAgICAgIjYiID0+IDYsCisgICAgICAgICI3IiA9PiA3LAorICAgICAgICAiOCIgPT4gOCwKKyAgICAgICAgIjkiID0+IDkKKyAgICBdOworCisgICAgcHVibGljIHN0YXRpYyB2YXIgSEVYX0RJR0lUUyA9IFsKKyAgICAgICAgIjAiID0+IDAsCisgICAgICAgICIxIiA9PiAxLAorICAgICAgICAiMiIgPT4gMiwKKyAgICAgICAgIjMiID0+IDMsCisgICAgICAgICI0IiA9PiA0LAorICAgICAgICAiNSIgPT4gNSwKKyAgICAgICAgIjYiID0+IDYsCisgICAgICAgICI3IiA9PiA3LAorICAgICAgICAiOCIgPT4gOCwKKyAgICAgICAgIjkiID0+IDksCisgICAgICAgICJBIiA9PiAxMCwKKyAgICAgICAgImEiID0+IDEwLAorICAgICAgICAiQiIgPT4gMTEsCisgICAgICAgICJiIiA9PiAxMSwKKyAgICAgICAgIkMiID0+IDEyLAorICAgICAgICAiYyIgPT4gMTIsCisgICAgICAgICJEIiA9PiAxMywKKyAgICAgICAgImQiID0+IDEzLAorICAgICAgICAiRSIgPT4gMTQsCisgICAgICAgICJlIiA9PiAxNCwKKyAgICAgICAgIkYiID0+IDE1LAorICAgICAgICAiZiIgPT4gMTUKKyAgICBdOworCisKKyAgICBwdWJsaWMgc3RhdGljIHZhciBERUZfU1RSSU5HX1NJWkUgPSAxNjsKKworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfQk9PTCAgID0gJ3RmJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0JZVEUgICA9ICdpOCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9JMTYgICAgPSAnaTE2JzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0kzMiAgICA9ICdpMzInOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfSTY0ICAgID0gJ2k2NCc7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9ET1VCTEUgPSAnZGJsJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX1NUUlVDVCA9ICdyZWMnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfU1RSSU5HID0gJ3N0cic7CisgICAgcHVibGljIHN0YXRpYyB2YXIgTkFNRV9NQVAgICAgPSAnbWFwJzsKKyAgICBwdWJsaWMgc3RhdGljIHZhciBOQU1FX0xJU1QgICA9ICdsc3QnOworICAgIHB1YmxpYyBzdGF0aWMgdmFyIE5BTUVfU0VUICAgID0gJ3NldCc7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFR5cGVOYW1lRm9yVHlwZUlEKHR5cGVJRCA6IEludCkgOiBTdHJpbmcgeworICAgICAgICBzd2l0Y2ggKHR5cGVJRCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOiAgICAgcmV0dXJuIE5BTUVfQk9PTDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuQllURTogICAgIHJldHVybiBOQU1FX0JZVEU7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjogICAgICAgICByZXR1cm4gTkFNRV9JMTY7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjogICAgICAgICByZXR1cm4gTkFNRV9JMzI7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDogICAgICAgICByZXR1cm4gTkFNRV9JNjQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRTogICAgIHJldHVybiBOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOiAgICAgcmV0dXJuIE5BTUVfU1RSSU5HOworICAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6ICAgICByZXR1cm4gTkFNRV9TVFJVQ1Q7CisgICAgICAgICAgICBjYXNlIFRUeXBlLk1BUDogICAgICAgICByZXR1cm4gTkFNRV9NQVA7CisgICAgICAgICAgICBjYXNlIFRUeXBlLlNFVDogICAgICAgICByZXR1cm4gTkFNRV9TRVQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlLkxJU1Q6ICAgICByZXR1cm4gTkFNRV9MSVNUOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5PVF9JTVBMRU1FTlRFRCwgIlVucmVjb2duaXplZCB0eXBlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdmFyIE5BTUVTX1RPX1RZUEVTID0gWworICAgICAgICBOQU1FX0JPT0wgICA9PiBUVHlwZS5CT09MLAorICAgICAgICBOQU1FX0JZVEUgICA9PiBUVHlwZS5CWVRFLAorICAgICAgICBOQU1FX0kxNiAgICA9PiBUVHlwZS5JMTYsCisgICAgICAgIE5BTUVfSTMyICAgID0+IFRUeXBlLkkzMiwKKyAgICAgICAgTkFNRV9JNjQgICAgPT4gVFR5cGUuSTY0LAorICAgICAgICBOQU1FX0RPVUJMRSA9PiBUVHlwZS5ET1VCTEUsCisgICAgICAgIE5BTUVfU1RSSU5HID0+IFRUeXBlLlNUUklORywKKyAgICAgICAgTkFNRV9TVFJVQ1QgPT4gVFR5cGUuU1RSVUNULAorICAgICAgICBOQU1FX01BUCAgICA9PiBUVHlwZS5NQVAsCisgICAgICAgIE5BTUVfU0VUICAgID0+IFRUeXBlLlNFVCwKKyAgICAgICAgTkFNRV9MSVNUICAgPT4gVFR5cGUuTElTVAorICAgIF07CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIEdldFR5cGVJREZvclR5cGVOYW1lKG5hbWUgOiBTdHJpbmcpIDogSW50CisgICAgeworICAgICAgICB2YXIgdHlwZSA9IE5BTUVTX1RPX1RZUEVTW25hbWVdOworICAgICAgICBpZiggbnVsbCAhPSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKworfQorCisKKy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZSBpbnNlcnRpbmcvUmVhZGluZworLy8gYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzLiBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCitAOmFsbG93KFRKU09OUHJvdG9jb2wpCitjbGFzcyBKU09OQmFzZUNvbnRleHQKK3sKKyAgICBwcml2YXRlIHZhciBwcm90byA6IFRKU09OUHJvdG9jb2w7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHByb3RvIDogVEpTT05Qcm90b2NvbCApCisgICAgeworICAgICAgICB0aGlzLnByb3RvID0gcHJvdG87CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFdyaXRlKCkgOiBWb2lkIHsgfQorICAgIHB1YmxpYyBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMoKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisKKy8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuCisvLyBXaWxsIGluc2VydC9SZWFkIGNvbW1hcyBiZWZvcmUgZWFjaCBpdGVtIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IG9uZQorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgSlNPTkxpc3RDb250ZXh0IGV4dGVuZHMgSlNPTkJhc2VDb250ZXh0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG8gOiBUSlNPTlByb3RvY29sKSB7CisgICAgICAgIHN1cGVyKHByb3RvKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZhciBmaXJzdCA6IEJvb2wgPSB0cnVlOworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFdyaXRlKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgYnVmLmFkZFN0cmluZyggSlNPTkNvbnN0YW50cy5DT01NQSk7CisgICAgICAgICAgICB2YXIgdG1wID0gYnVmLmdldEJ5dGVzKCk7CisgICAgICAgICAgICBwcm90by50cmFucy53cml0ZSggdG1wLCAwLCB0bXAubGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKCBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuCisvLyBXaWxsIGluc2VydC9SZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24gb2YgZWFjaCByZWNvcmQKKy8vIHBhaXIsIGFuZCBjb21tYXMgYmVmb3JlIGVhY2gga2V5IGV4Y2VwdCB0aGUgZmlyc3QuIEluIGFkZGl0aW9uLAorLy8gd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlIGVzY2FwZWQKKy8vIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCitAOmFsbG93KFRKU09OUHJvdG9jb2wpCitjbGFzcyBKU09OUGFpckNvbnRleHQgZXh0ZW5kcyBKU09OQmFzZUNvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90byA6IFRKU09OUHJvdG9jb2wgKSB7CisgICAgICAgIHN1cGVyKCBwcm90byk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2YXIgZmlyc3QgOiBCb29sID0gdHJ1ZTsKKyAgICBwcml2YXRlIHZhciBjb2xvbiA6IEJvb2wgID0gdHJ1ZTsKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBXcml0ZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbG9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRTdHJpbmcoIGNvbG9uID8gSlNPTkNvbnN0YW50cy5DT0xPTiA6IEpTT05Db25zdGFudHMuQ09NTUEpOworICAgICAgICAgICAgdmFyIHRtcCA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICAgICAgcHJvdG8udHJhbnMud3JpdGUoIHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgICAgICBjb2xvbiA9ICFjb2xvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBSZWFkKCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgY29sb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdG8uUmVhZEpTT05TeW50YXhDaGFyKCBjb2xvbiA/IEpTT05Db25zdGFudHMuQ09MT04gOiBKU09OQ29uc3RhbnRzLkNPTU1BKTsKKyAgICAgICAgICAgIGNvbG9uID0gIWNvbG9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIEVzY2FwZU51bWJlcnMoKSA6IEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiBjb2xvbjsKKyAgICB9Cit9CisKKy8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorQDphbGxvdyhUSlNPTlByb3RvY29sKQorY2xhc3MgTG9va2FoZWFkUmVhZGVyIHsKKworICAgIHByaXZhdGUgdmFyIHByb3RvIDogVEpTT05Qcm90b2NvbDsKKyAgICBwcml2YXRlIHZhciBkYXRhIDogQnl0ZXM7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90byA6IFRKU09OUHJvdG9jb2wgKSB7CisgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgfQorCisKKyAgICAvLyBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgLy8gZGF0YSBidWZmZXIgaWYgcHJlc2VudCBvciBnZXR0aW5nIGl0IGZyb20gdGhlIHRyYW5zcG9ydCBvdGhlcndpc2UuCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWQoKSA6IEJ5dGVzIHsKKyAgICAgICAgdmFyIHJldHZhbCA9IFBlZWsoKTsKKyAgICAgICAgZGF0YSA9IG51bGw7CisgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgUmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgIC8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgcHVibGljIGZ1bmN0aW9uIFBlZWsoKSA6IEJ5dGVzIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgcHJvdG8udHJhbnMucmVhZEFsbChidWYsIDAsIDEpOworICAgICAgICAgICAgZGF0YSA9IGJ1Zi5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MzU1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbEZhY3RvcnkuaHgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKworLyoqCisqIEpTT04gUHJvdG9jb2wgRmFjdG9yeQorKi8KK2NsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCggdHJhbnMgOiBUVHJhbnNwb3J0KSA6IFRQcm90b2NvbCAgeworICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woIHRyYW5zKTsKKyAgICB9Cit9CisKKworCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RMaXN0Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWZiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVExpc3QuaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUTGlzdCB7CisKKyAgICBwdWJsaWMgdmFyIGVsZW1UeXBlIDogSW50OworICAgIHB1YmxpYyB2YXIgc2l6ZSA6IEludDsKKworICAgICAgcHVibGljIGZ1bmN0aW9uIG5ldyh0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgICAgZWxlbVR5cGUgPSB0OworICAgICAgICBzaXplID0gczsKKyAgICAgIH0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNYXAuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlNjI4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWFwLmh4CkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVE1hcCB7CisKKyAgICBwdWJsaWMgdmFyIGtleVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciB2YWx1ZVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzaXplIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhrIDogSW50ID0gMCwgdiA6IEludCA9IDAsIHMgOiBJbnQgPSAwKSB7CisgICAgICBrZXlUeXBlID0gazsKKyAgICAgIHZhbHVlVHlwZSA9IHY7CisgICAgICBzaXplID0gczsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2UuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MjY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5oeApAQCAtMCwwICsxLDQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2NsYXNzIFRNZXNzYWdlIHsKKworICAgIHB1YmxpYyB2YXIgbmFtZSA6IFN0cmluZzsKKyAgICBwdWJsaWMgdmFyIHR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzZXFpZCA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcobiA6IFN0cmluZyA9ICIiLCB0IDogSW50ID0gMCwgcyA6IEludCA9IDApIHsKKyAgICAgIG5hbWUgPSBuOworICAgICAgdHlwZSA9IHQ7CisgICAgICBzZXFpZCA9IHM7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCkgOiBTdHJpbmcgeworICAgICAgcmV0dXJuICI8VE1lc3NhZ2UgbmFtZTonIiArIG5hbWUgKyAiJyB0eXBlOiAiICsgdHlwZSArICIgc2VxaWQ6IiArIHNlcWlkICsgIj4iOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob3RoZXI6VE1lc3NhZ2UpIDogQm9vbCB7CisgICAgICByZXR1cm4gbmFtZSA9PSBvdGhlci5uYW1lICYmIHR5cGUgPT0gb3RoZXIudHlwZSAmJiBzZXFpZCA9PSBvdGhlci5zZXFpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE1lc3NhZ2VUeXBlLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZkMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlVHlwZS5oeApAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK0A6ZW51bQorYWJzdHJhY3QgVE1lc3NhZ2VUeXBlKEludCkgIGZyb20gSW50IHRvIEludCAgeworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBDQUxMICAgICAgOiBJbnQgPSAxOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBSRVBMWSAgICAgOiBJbnQgPSAyOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBFWENFUFRJT04gOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBPTkVXQVkgICAgOiBJbnQgPSA0OworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhYTNjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaHgKQEAgLTAsMCArMSwxNzcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmRzLlN0cmluZ01hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorICogVE11bHRpcGxleGVkUHJvY2Vzc29yIGlzIGEgVFByb2Nlc3NvciBhbGxvd2luZyBhIHNpbmdsZSBUU2VydmVyIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKiBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCisgKiBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICovCitjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaW1wbGVtZW50cyBUUHJvY2Vzc29yCit7CisgICAgcHJpdmF0ZSB2YXIgc2VydmljZVByb2Nlc3Nvck1hcCA6IFN0cmluZ01hcDxUUHJvY2Vzc29yPiA9IG5ldyBTdHJpbmdNYXA8VFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIHZhciBkZWZhdWx0UHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG51bGw7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgorICAgICAqIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICoKKyAgICAgKiBBcmdzOgorICAgICAqIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAorICAgICAqICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gUmVnaXN0ZXJQcm9jZXNzb3Ioc2VydmljZU5hbWUgOiBTdHJpbmcsIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsIGFzRGVmYXVsdCA6IEJvb2wgPSBmYWxzZSkgOiBWb2lkIHsKKyAgICAgICAgc2VydmljZVByb2Nlc3Nvck1hcC5zZXQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIGlmICggYXNEZWZhdWx0KSB7CisgICAgICAgICAgICBpZiggZGVmYXVsdFByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV04sICJDYW4ndCBoYXZlIG11bHRpcGxlIGRlZmF1bHQgcHJvY2Vzc29ycyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEZhaWwoIG9wcm90IDogVFByb3RvY29sLCBtZXNzYWdlIDogVE1lc3NhZ2UsIGV4dHlwZSA6IEludCwgZXR4dCA6IFN0cmluZykgOiBWb2lkIHsKKyAgICAgICAgdmFyIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggZXh0eXBlLCBldHh0KTsKKworICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1lc3NhZ2Uuc2VxaWQpOworCisgICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ld01lc3NhZ2UpOworICAgICAgICBhcHBleC53cml0ZSggb3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcyBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAqCisgICAgICogLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICogLSBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS4KKyAgICAgKiAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCisgICAgICogLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLgorICAgICAqCisgICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgorICAgICAqIC0gdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksCisgICAgICogLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICogLSB0aGUgc2VydmljZSBuYW1lIGhhcyBub3QgYmVlbiBSZWdpc3RlclByb2Nlc3NvcigpZWQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoIGlwcm90IDogVFByb3RvY29sLCBvcHJvdCA6IFRQcm90b2NvbCkgOiBCb29sIHsKKyAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQorICAgICAgICAgICAgbWVzc2FnZSBoZWFkZXIuICBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuICovCisKKyAgICAgICAgdmFyIG1lc3NhZ2UgOiBUTWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgdmFyIG1ldGhvZE5hbWUgOiBTdHJpbmcgPSAiIjsKKworICAgICAgICBpZiAoKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCkgJiYgKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSkKKyAgICAgICAgeworICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX01FU1NBR0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgQ0FMTCBvciBPTkVXQVkgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAgICAgICB2YXIgYWN0dWFsUHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG51bGw7CisgICAgICAgIHZhciBpbmRleCA9IG1lc3NhZ2UubmFtZS5pbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIGRlZmF1bHQgcHJvY2Vzc29yCisgICAgICAgICAgICBtZXRob2ROYW1lID0gbWVzc2FnZS5uYW1lOworICAgICAgICAgICAgYWN0dWFsUHJvY2Vzc29yID0gZGVmYXVsdFByb2Nlc3NvcjsKKyAgICAgICAgICAgIGlmKCBhY3R1YWxQcm9jZXNzb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEZhaWwob3Byb3QsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVkFMSURfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiAiICsgbWVzc2FnZS5uYW1lICsgIiBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3IgZGVmaW5lZC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgIkRpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNlcnZpY2UgbmFtZSBnaXZlbgorICAgICAgICAgICAgdmFyIHNlcnZpY2VOYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CisgICAgICAgICAgICBtZXRob2ROYW1lID0gbWVzc2FnZS5uYW1lLnN1YnN0cmluZyggc2VydmljZU5hbWUubGVuZ3RoICsgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLmxlbmd0aCk7CisgICAgICAgICAgICBhY3R1YWxQcm9jZXNzb3IgPSBzZXJ2aWNlUHJvY2Vzc29yTWFwLmdldCggc2VydmljZU5hbWUpOworICAgICAgICAgICAgaWYoIGFjdHVhbFByb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmFpbChvcHJvdCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuICIgKworICAgICAgICAgICAgICAgICAgICAgICJEaWQgeW91IGZvcmdldCB0byBjYWxsIFJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IFRNZXNzYWdlLCByZW1vdmluZyB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBuZXcgVE1lc3NhZ2UoIG1ldGhvZE5hbWUsIG1lc3NhZ2UudHlwZSwgbWVzc2FnZS5zZXFpZCk7CisgICAgICAgIHZhciBzdG9yZWRNc2cgPSBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCBpcHJvdCwgbmV3TWVzc2FnZSk7CisgICAgICAgIHJldHVybiBhY3R1YWxQcm9jZXNzb3IucHJvY2Vzcyggc3RvcmVkTXNnLCBvcHJvdCk7CisgICAgfQorfQorCisKKy8qKgorICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAqLworY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCit7CisgICAgcHJpdmF0ZSB2YXIgbWVzc2FnZUJlZ2luIDogVE1lc3NhZ2U7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCBwcm90b2NvbCA6IFRQcm90b2NvbCwgbWVzc2FnZUJlZ2luIDogVE1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIoIHByb3RvY29sKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oKSA6IFRNZXNzYWdlIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VCZWdpbjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNkMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmh4CkBAIC0wLDAgKzEsOTcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworCisvKioKKyAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0CisgKiBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAqIHRvIHRoZSBmdW5jdGlvbiBuYW1lIGR1cmluZyBmdW5jdGlvbiBjYWxscy4KKyAqCisgKiBOT1RFOiBUSElTIElTIE5PVCBUTyBCRSBVU0VEIEJZIFNFUlZFUlMuCisgKiBPbiB0aGUgc2VydmVyLCB1c2UgVE11bHRpcGxleGVkUHJvY2Vzc29yIHRvIGhhbmRsZSByZXF1ZXN0cyBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAqCisgKiBUaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgKgorICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgKgorICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICoKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICoKKyAqLworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IgeworCisgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU0VQQVJBVE9SIDogU3RyaW5nID0gIjoiOworCisgICAgcHJpdmF0ZSB2YXIgc2VydmljZSA6IFN0cmluZzsKKworICAgIC8qKgorICAgICAqIFdyYXAgdGhlIHNwZWNpZmllZCBwcm90b2NvbCwgYWxsb3dpbmcgaXQgdG8gYmUgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIGEKKyAgICAgKiBtdWx0aXBsZXhpbmcgc2VydmVyLiAgVGhlIDxjb2RlPnNlcnZpY2VOYW1lPC9jb2RlPiBpcyByZXF1aXJlZCBhcyBpdCBpcworICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICogdGhlIGZ1bmN0aW9uIGNhbGwgdG8gdGhlIHByb3BlciBzZXJ2aWNlLgorICAgICAqCisgICAgICogQXJnczoKKyAgICAgKiAgcHJvdG9jb2wgICAgICAgIFlvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gVEJpbmFyeVByb3RvY29sCisgICAgICogIHNlcnZpY2VOYW1lICAgICBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wsIHNlcnZpY2VOYW1lIDogU3RyaW5nKSAgICB7CisgICAgICAgIHN1cGVyKCBwcm90b2NvbCk7CisgICAgICAgIHNlcnZpY2UgPSBzZXJ2aWNlTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgorICAgICAqIEFyZ3M6CisgICAgICogICB0TWVzc2FnZSAgICAgVGhlIG9yaWdpbmFsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCBtZXNzYWdlIDogVE1lc3NhZ2UpIDogVm9pZCB7CisgICAgICAgIHN3aXRjaCggbWVzc2FnZS50eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DQUxMOgorICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSArIFNFUEFSQVRPUiArIG1lc3NhZ2UubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlcWlkKSk7CisKKyAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9ORVdBWToKKyAgICAgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UgKyBTRVBBUkFUT1IgKyBtZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZCkpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YzODQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oeApAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CisKKy8qKgorKiBQcm90b2NvbCBpbnRlcmZhY2UgZGVmaW5pdGlvbgorKi8KK2ludGVyZmFjZSBUUHJvdG9jb2wgeworCisgICAgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KCkgOiBUVHJhbnNwb3J0OworCisgICAgLyoqCisgICAgICogV3JpdGluZyBtZXRob2RzLgorICAgICAqLworICAgIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKG1lc3NhZ2U6VE1lc3NhZ2UpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Y3Q6VFN0cnVjdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbihmaWVsZDpURmllbGQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4obWFwOlRNYXApIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbihsaXN0OlRMaXN0KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oc2V0OlRTZXQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZVNldEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJvb2woYiA6IEJvb2wpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZUJ5dGUoYiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTE2KGkxNiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTMyKGkzMiA6IEludCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlSTY0KGk2NCA6IGhheGUuSW50NjQpIDogVm9pZDsKKyAgICBmdW5jdGlvbiB3cml0ZURvdWJsZShkdWIgOiBGbG9hdCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKHN0ciA6IFN0cmluZykgOiBWb2lkOworICAgIGZ1bmN0aW9uIHdyaXRlQmluYXJ5KGJpbiA6IEJ5dGVzKSA6IFZvaWQ7CisKKyAgICAvKioKKyAgICAgKiBSZWFkaW5nIG1ldGhvZHMuCisgICAgICovCisgICAgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpOlRNZXNzYWdlOworICAgIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigpOlRTdHJ1Y3Q7CisgICAgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpOlRGaWVsZDsKKyAgICBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCk6VE1hcDsKKyAgICBmdW5jdGlvbiByZWFkTWFwRW5kKCkgOiBWb2lkOworICAgIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oKTpUTGlzdDsKKyAgICBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIDogVm9pZDsKKyAgICBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKTpUU2V0OworICAgIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gcmVhZEJvb2woKSA6IEJvb2w7CisgICAgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludDsKKyAgICBmdW5jdGlvbiByZWFkSTE2KCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gcmVhZEkzMigpIDogSW50OworICAgIGZ1bmN0aW9uIHJlYWRJNjQoKSA6IGhheGUuSW50NjQ7CisgICAgZnVuY3Rpb24gcmVhZERvdWJsZSgpIDogRmxvYXQ7CisgICAgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nOworICAgIGZ1bmN0aW9uIHJlYWRCaW5hcnkoKSA6IEJ5dGVzOworCisgICAgLy8gcmVjdXJzaW9uIHRyYWNraW5nCisgICAgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjllOTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oeApAQCAtMCwwICsxLDIyNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5JbnQ2NDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisKKy8qKgorICogVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgKiBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMKKyAqIG5vIGFic3RyYWN0IG1ldGhvZHMsIGl0IGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLAorICogaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIFRQcm90b2NvbC4KKyAqCisgKiBTZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pCisgKiBTZWUgVE11bHRpcGxleGVkUHJvdG9jb2wKKyAqLworY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGltcGxlbWVudHMgVFByb3RvY29sCit7CisgICAgcHJpdmF0ZSB2YXIgd3JhcHBlZCA6IFRQcm90b2NvbDsKKworICAgIC8qKgorICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIG5ldyggcHJvdG9jb2wgOiBUUHJvdG9jb2wpICAvLyBub3QgdG8gYmUgaW5zdGFudGlhdGVkLCBtdXN0IGRlcml2ZSBhIGNsYXNzCisgICAgeworICAgICAgICB3cmFwcGVkID0gcHJvdG9jb2w7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIDogVFRyYW5zcG9ydCB7CisgICAgICByZXR1cm4gd3JhcHBlZC5nZXRUcmFuc3BvcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oIHZhbHVlIDogVE1lc3NhZ2UpIDogVm9pZCAgICB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNZXNzYWdlQmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbih2YWx1ZSA6IFRTdHJ1Y3QpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJ1Y3RCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKHZhbHVlIDogVEZpZWxkKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlRmllbGRCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUZpZWxkU3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCB2YWx1ZSA6IFRNYXApIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNYXBCZWdpbiggdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oIHZhbHVlIDogVExpc3QpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVMaXN0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUxpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbiggdmFsdWUgOiBUU2V0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU2V0QmVnaW4oIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlU2V0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCh2YWx1ZSA6IEJvb2wpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCb29sKCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSh2YWx1ZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC53cml0ZUJ5dGUoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVJMTYoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIodmFsdWUgOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVJMzIoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQodmFsdWUgOiBoYXhlLkludDY0KSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLndyaXRlSTY0KCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKHZhbHVlIDogRmxvYXQpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVEb3VibGUoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcodmFsdWUgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVTdHJpbmcoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCaW5hcnkodmFsdWUgOiBCeXRlcyApIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQud3JpdGVCaW5hcnkoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigpIDogVE1lc3NhZ2UgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oKSA6IFRTdHJ1Y3QgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZFN0cnVjdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigpIDogVEZpZWxkIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCkgOiBUTWFwIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZE1hcEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSA6IFZvaWQgeworICAgICAgICB3cmFwcGVkLnJlYWRNYXBFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigpIDogVExpc3QgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkTGlzdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgOiBWb2lkIHsKKyAgICAgICAgd3JhcHBlZC5yZWFkTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oKSA6IFRTZXQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5yZWFkU2V0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpIDogVm9pZCB7CisgICAgICAgIHdyYXBwZWQucmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgpIDogQm9vbAorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEJvb2woKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCeXRlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoKSA6IEludCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRJMTYoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigpIDogSW50IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEkzMigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCkgOiBoYXhlLkludDY0IHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZEk2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCkgOiBGbG9hdCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWREb3VibGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygpIDogU3RyaW5nIHsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQucmVhZFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQmluYXJ5KCkgOiBCeXRlcyB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLnJlYWRCaW5hcnkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZCB7CisgICAgICAgIHJldHVybiB3cmFwcGVkLkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiMzdhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7CisKKyAgICAvLyBXQVJOSU5HOiBUaGVzZSBhcmUgc3ViamVjdCB0byBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlLCBzbyB3ZSBjYW4ndCB1c2UgZW51bXMKKyAgICAvLyB3aXRoIEhheGUgMy4xLjMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vSGF4ZUZvdW5kYXRpb24vaGF4ZS9pc3N1ZXMvMzY0OQorICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBVTktOT1dOIDogSW50ID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgSU5WQUxJRF9EQVRBIDogSW50ID0gMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTkVHQVRJVkVfU0laRSA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNJWkVfTElNSVQgOiBJbnQgPSAzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBCQURfVkVSU0lPTiA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE5PVF9JTVBMRU1FTlRFRCA6IEludCA9IDU7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFUFRIX0xJTUlUIDogSW50ID0gNjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZXJyb3IgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yKTsKKyAgICB9CisKKworfSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMmQ2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRmFjdG9yeS5oeApAQCAtMCwwICsxLDI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKKworaW50ZXJmYWNlIFRQcm90b2NvbEZhY3RvcnkgeworICAgICBmdW5jdGlvbiBnZXRQcm90b2NvbCh0cmFuczpUVHJhbnNwb3J0KTpUUHJvdG9jb2w7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFlNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHgKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CisKKyAgLyoqCisgICAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBwcm90b2NvbCBkYXRhCisgICAqIHN0cmVhbXMuCisgICAqCisgICAqLworY2xhc3MgVFByb3RvY29sVXRpbCB7CisKKyAgICAvKioKKyAgICAgKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGRhdGEgZWxlbWVudCBmcm9tIHRoZSBwcm92aWRlZCBpbnB1dCBUUHJvdG9jb2wgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3QgIHRoZSBwcm90b2NvbCBvYmplY3QgdG8gcmVhZCBmcm9tCisgICAgICogQHBhcmFtIHR5cGUgIHRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgaW50ZXByZXRlZCBhcyB0aGlzIFRUeXBlIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcChwcm90OlRQcm90b2NvbCwgdHlwZSA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CT09MOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCb29sKCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6CisgICAgICAgICAgICAgICAgICAgIHByb3QucmVhZEJ5dGUoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMTYoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJMzIoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRJNjQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWREb3VibGUoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRCaW5hcnkoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkOlRGaWVsZCA9IHByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUT1ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBza2lwKHByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTUFQOgorICAgICAgICAgICAgICAgICAgICB2YXIgbWFwOlRNYXAgPSBwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgaW4gMCAuLi4gbWFwLnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgbWFwLmtleVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBtYXAudmFsdWVUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRNYXBFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU0VUOgorICAgICAgICAgICAgICAgICAgICB2YXIgc2V0OlRTZXQgPSBwcm90LnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogaW4gMCAuLi4gc2V0LnNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXAocHJvdCwgc2V0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRTZXRFbmQoKTsKKworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTElTVDoKKyAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3Q6VExpc3QgPSBwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrIGluIDAgLi4uIGxpc3Quc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcChwcm90LCBsaXN0LmVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorCQkJCQl0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5VTktOT1dOLCAiVW5rbm93biBmaWVsZCB0eXBlICR7dHlwZX0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGU6RHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RSZWN1cnNpb25UcmFja2VyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDIxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFJlY3Vyc2lvblRyYWNrZXIuaHgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKKworCitjbGFzcyBUUmVjdXJzaW9uVHJhY2tlciB7CisKKyAgICAvLyBkZWZhdWx0CisgICAgcHJpdmF0ZSBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSCA6IEludCA9IDY0OworCisgICAgLy8gbGltaXQgYW5kIGFjdHVhbCB2YWx1ZQorICAgIHB1YmxpYyB2YXIgcmVjdXJzaW9uTGltaXQgOiBJbnQgPSBERUZBVUxUX1JFQ1VSU0lPTl9ERVBUSDsKKyAgICBwcml2YXRlIHZhciByZWN1cnNpb25EZXB0aCA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSA6IFZvaWQKKyAgICB7CisgICAgICAgIGlmIChyZWN1cnNpb25EZXB0aCA8IHJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgKytyZWN1cnNpb25EZXB0aDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIDogVm9pZAorICAgIHsKKyAgICAgICAgLS1yZWN1cnNpb25EZXB0aDsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVhYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTZXQuaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitjbGFzcyBUU2V0IHsKKworICAgIHB1YmxpYyB2YXIgZWxlbVR5cGUgOiBJbnQ7CisgICAgcHVibGljIHZhciBzaXplIDogSW50OworCisgICAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KHQgOiBJbnQgPSAwLCBzIDogSW50ID0gMCkgeworICAgICAgICBlbGVtVHlwZSA9IHQ7CisgICAgICAgIHNpemUgPSBzOworICAgICAgfQorCit9ICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTdHJ1Y3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwYjdkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU3RydWN0Lmh4CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworY2xhc3MgVFN0cnVjdCB7CisKKyAgICBwdWJsaWMgdmFyIG5hbWUgOiBTdHJpbmc7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KG4gOiBTdHJpbmcgPSAiIikgeworICAgICAgbmFtZSA9IG47CisgICAgfQorCit9ICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFR5cGUuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiYmM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UVHlwZS5oeApAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK0A6ZW51bQorYWJzdHJhY3QgVFR5cGUoSW50KSAgZnJvbSBJbnQgdG8gSW50ICB7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFNUT1AgOiBJbnQgICA9IDA7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFZPSUQgOiBJbnQgICA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJPT0wgOiBJbnQgICA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEJZVEUgOiBJbnQgICA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERPVUJMRSA6IEludCA9IDQ7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkxNiA6IEludCAgICA9IDY7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEkzMiA6IEludCAgICA9IDg7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEk2NCA6IEludCAgICA9IDEwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTVFJJTkcgOiBJbnQgPSAxMTsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgU1RSVUNUIDogSW50ID0gMTI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIE1BUCA6IEludCAgICA9IDEzOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBTRVQgOiBJbnQgICAgPSAxNDsKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTElTVCA6IEludCAgID0gMTU7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlZWUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oeApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworY2xhc3MgVFNlcnZlcgoreworICAgIHByaXZhdGUgdmFyIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHNlcnZlclRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGlucHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGw7CisKKyAgICAvLyBzZXJ2ZXIgZXZlbnRzCisgICAgcHVibGljIHZhciBzZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKKworICAgIC8vIExvZyBkZWxlZ2F0aW9uCisgICAgcHJpdmF0ZSB2YXIgX2xvZ0RlbGVnYXRlIDogRHluYW1pYy0+Vm9pZCAgPSBudWxsOworICAgIHB1YmxpYyB2YXIgbG9nRGVsZWdhdGUoZ2V0LHNldCkgOiBEeW5hbWljLT5Wb2lkOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyggcHJvY2Vzc29yIDogVFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA6IFRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IDogVFByb3RvY29sRmFjdG9yeSA9IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUgOiBEeW5hbWljLT5Wb2lkID0gbnVsbCkKKyAgICB7CisgICAgICB0aGlzLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gbG9nRGVsZWdhdGU7CisKKyAgICAgIEFwcGx5TWlzc2luZ0RlZmF1bHRzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBBcHBseU1pc3NpbmdEZWZhdWx0cygpIHsKKyAgICAgICAgaWYoIHByb2Nlc3NvciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHByb2Nlc3NvciBtaXNzaW5nIjsKKyAgICAgICAgaWYoIHNlcnZlclRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgIkludmFsaWQgc2VydmVyIGNvbmZpZ3VyYXRpb246IHNlcnZlclRyYW5zcG9ydCBtaXNzaW5nIjsKKyAgICAgICAgaWYoIGlucHV0VHJhbnNwb3J0RmFjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisgICAgICAgIGlmKCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5ICA9PSBudWxsKQorICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgICBpZiggaW5wdXRQcm90b2NvbEZhY3RvcnkgID09IG51bGwpCisgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCk7CisgICAgICAgIGlmKCBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKTsKKyAgICAgICAgaWYoIGxvZ0RlbGVnYXRlID09IG51bGwpCisgICAgICAgICAgICBsb2dEZWxlZ2F0ZSA9IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gc2V0X2xvZ0RlbGVnYXRlKHZhbHVlIDogRHluYW1pYy0+Vm9pZCkgOiBEeW5hbWljLT5Wb2lkIHsKKyAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgX2xvZ0RlbGVnYXRlID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfbG9nRGVsZWdhdGUgPSBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0X2xvZ0RlbGVnYXRlKCkgOiBEeW5hbWljLT5Wb2lkIHsKKyAgICAgICAgcmV0dXJuIF9sb2dEZWxlZ2F0ZTsKKyAgICB9CisKKworICAgIHByaXZhdGUgZnVuY3Rpb24gRGVmYXVsdExvZ0RlbGVnYXRlKHZhbHVlIDogRHluYW1pYykgOiBWb2lkICB7CisgICAgICAgIHRyYWNlKCB2YWx1ZSk7CisgICAgfQorCisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBTZXJ2ZSgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gU3RvcCgpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzk5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuaHgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKKworCisvLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgc2VydmVyIHVzZXJzIHRvIGhhbmRsZSBldmVudHMgZnJvbSB0aGUgc2VydmVyCitpbnRlcmZhY2UgVFNlcnZlckV2ZW50SGFuZGxlciB7CisKKyAgICAvLyBDYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgYmVnaW5zCisgICAgZnVuY3Rpb24gcHJlU2VydmUoKSA6IFZvaWQ7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZworICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoIGlucHV0IDogVFByb3RvY29sLCBvdXRwdXQgOiBUUHJvdG9jb2wpIDogRHluYW1pYzsKKworICAgIC8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dAorICAgIGZ1bmN0aW9uIGRlbGV0ZUNvbnRleHQoIHNlcnZlckNvbnRleHQgOiBEeW5hbWljLCBpbnB1dCA6IFRQcm90b2NvbCwgb3V0cHV0IDogVFByb3RvY29sKSA6IFZvaWQ7CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IKKyAgICBmdW5jdGlvbiBwcm9jZXNzQ29udGV4dCggc2VydmVyQ29udGV4dCA6IER5bmFtaWMsIHRyYW5zcG9ydCA6IFRUcmFuc3BvcnQpIDogVm9pZDsKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjAwNzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmh4CkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCisvLyBTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciBmb3IgdGVzdGluZworY2xhc3MgVFNpbXBsZVNlcnZlciBleHRlbmRzIFRTZXJ2ZXIgIHsKKworICAgIHByaXZhdGUgdmFyIHN0b3AgOiBCb29sID0gZmFsc2U7CisKKyAgICAvL3N0b3BzIGp1c3QgYWZ0ZXIgaW5wdXQgdHJhbnNwb3J0IHJldHVybnMgRU9GCisgICAgLy91c2VmdWwgZm9yIGxpbWl0ZWQgc2NlbmFyaW9zLCBsaWtlIGVtYmVkaW5nIGludG8gcGhwIHNlcnZlcgorICAgIHB1YmxpYyB2YXIgcnVuT25jZSA6IEJvb2wgPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHByb2Nlc3NvciA6IFRQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkgPSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlciA6IER5bmFtaWMtPlZvaWQgPSBudWxsKSB7CisgICAgICBzdXBlciggcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBsb2dnZXIpOworICAgIH0KKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFNlcnZlKCkgOiBWb2lkCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoICh0dHggOiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh0dHgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwLAorICAgICAgICAvLyBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKKyAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlKCAhIHN0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjbGllbnQgOiBUVHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBpbnB1dFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgdmFyIG91dHB1dFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgdmFyIGlucHV0UHJvdG9jb2wgOiBUUHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgdmFyIG91dHB1dFByb3RvY29sIDogVFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIHZhciBjb25uZWN0aW9uQ29udGV4dCA6IER5bmFtaWMgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoIGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KCBjbGllbnQpOworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woIG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IHNlcnZlckV2ZW50SGFuZGxlci5jcmVhdGVDb250ZXh0KGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cworICAgICAgICAgICAgICAgICAgICB3aGlsZSggdHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCBpcyB0byBzYXkgaXQgbWF5IGJlIG1hbnkgbWludXRlcyBiZXR3ZWVuIHRoZSBldmVudCBmaXJpbmcgYW5kIHRoZSBjbGllbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEgcHJvY2Vzc29yLnByb2Nlc3MoIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIHR0eCA6IFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmKHJ1bk9uY2UgJiYgdHR4LmVycm9ySUQgPT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSkgeworICAgICAgICAgICAgICAgICAgLy9pbnB1dCByZXR1cm5zIGVvZiwgZXhpdAorICAgICAgICAgICAgICAgICAgLy9mb2xsb3dzIGxpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKyAgICAgICAgICAgICAgICAgIFN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggcGV4IDogVFByb3RvY29sRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCckcGV4ICR7cGV4LmVycm9ySUR9ICR7cGV4LmVycm9yTXNnfScpOyAvLyBVbmV4cGVjdGVkCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggZSA6IER5bmFtaWMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUoZSk7IC8vIFVuZXhwZWN0ZWQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoY2xpZW50ICE9IG51bGwgJiYgIXJ1bk9uY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIFN0b3AoKSA6IFZvaWQKKyAgICB7CisgICAgICBzdG9wID0gdHJ1ZTsKKyAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzM2ZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0Lmh4CkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CisKK2ltcG9ydCBoYXhlLmlvLkVvZjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGhheGUuaW8uQnl0ZXNCdWZmZXI7CitpbXBvcnQgaGF4ZS5pby5CeXRlc091dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzSW5wdXQ7CisKKworY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8vIGNvbnN0YW50cworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBERUZBVUxUX0JVRlNJWkUgOiBJbnQgPSAweDEwMDA7ICAgIC8vIDQwOTYgQnl0ZXMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTUlOX0JVRlNJWkUgOiBJbnQgPSAweDEwMDsgICAgICAgICAvLyAyNTYgQnl0ZXMKKyAgICBwdWJsaWMgc3RhdGljIGlubGluZSB2YXIgTUFYX0JVRlNJWkUgOiBJbnQgPSAweDEwMDAwMDsgICAgICAvLyAxIE1CCisKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgIHB1YmxpYyB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiAgVFRyYW5zcG9ydCA9IG51bGw7CisKKyAgICAvLyBCdWZmZXIgZm9yIGlucHV0L291dHB1dAorICAgIHByaXZhdGUgdmFyIHJlYWRCdWZmZXJfIDogQnl0ZXNJbnB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgd3JpdGVCdWZmZXJfIDogQnl0ZXNPdXRwdXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIGJ1ZlNpemUgOiBJbnQ7CisKKyAgICAvLyBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBidWZTaXplIDogSW50ID0gREVGQVVMVF9CVUZTSVpFKSB7CisKKyAgICAgICAgLy8gZW5zdXJlIGJ1ZmZlciBzaXplIGlzIGluIHRoZSByYW5nZQorICAgICAgICBpZiAoIGJ1ZlNpemUgPCBNSU5fQlVGU0laRSkKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBNSU5fQlVGU0laRTsKKyAgICAgICAgZWxzZSBpZiggYnVmU2l6ZSA+IE1BWF9CVUZTSVpFKQorICAgICAgICAgICAgYnVmU2l6ZSA9IE1BWF9CVUZTSVpFOworCisgICAgICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICAgICAgICB0aGlzLmJ1ZlNpemUgPSBidWZTaXplOworICAgICAgICB0aGlzLndyaXRlQnVmZmVyXyA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICB0aGlzLndyaXRlQnVmZmVyXy5iaWdFbmRpYW4gPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgOiBCb29sIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gQnl0ZXMuYWxsb2MobGVuKTsKKworICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlYWRCdWZmZXJfICE9IG51bGwpICYmIChyZWFkQnVmZmVyXy5wb3NpdGlvbiA8IHJlYWRCdWZmZXJfLmxlbmd0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGdvdCA9IHJlYWRCdWZmZXJfLnJlYWRCeXRlcyhkYXRhLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ290OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gcG9pbnQgaW4gYnVmZmVyaW5nIHdoZW5ldmVyIHRoZQorICAgICAgICAgICAgICAgIC8vIHJlbWFpbmluZyBsZW5ndGggZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoIGxlbiA+PSBidWZTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBnb3QgPSB0cmFuc3BvcnQucmVhZCggYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYWRkQnl0ZXMoZGF0YSwgMCwgZ290KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmaWxsIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBpZiAoIHJlYWRDaHVuaygpIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmN0aW9uIHJlYWRDaHVuaygpIDogSW50IHsKKyAgICAgICAgdmFyIHNpemUgPSBidWZTaXplOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCeXRlc0J1ZmZlcigpOworICAgICAgICAgICAgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkKCBidWZmZXIsIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCggYnVmZmVyLmdldEJ5dGVzKCksIDAsIHNpemUpOworICAgICAgICAgICAgcmVhZEJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRzaXplIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUNodW5rKGZvcmNlV3JpdGUgOiBCb29sKSA6IFZvaWQgeworICAgICAgICBpZiggd3JpdGVCdWZmZXJfLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGlmICggZm9yY2VXcml0ZSB8fCAod3JpdGVCdWZmZXJfLmxlbmd0aCA+PSBidWZTaXplKSkgeworICAgICAgICAgICAgICAgIHZhciBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0Qnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICB3cml0ZUJ1ZmZlcl8uYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWYgOiBCeXRlcywgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogVm9pZCB7CisgICAgICAgIHZhciBoYWxmU2l6ZSA6IEludCA9IFN0ZC5pbnQoYnVmU2l6ZSAvIDIpOworCisgICAgICAgIC8vIE5vIHBvaW50IGluIGJ1ZmZlcmluZyBpZiBsZW4gZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUuCisgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoZSBidWZmZXIgaXMgbGVzcyB0aGFuIGhhbGYgZnVsbCB3ZSBzaG91bGQgc3RpbGwgY29uc2lkZXIKKyAgICAgICAgLy8gc3F1YXNoaW5nIGFsbCBpbnRvIG9uZSB3cml0ZSwgZXhjZXB0IHdoZW4gdGhlIGFjdHVhbCB3cml0ZSBsZW4gaXMgdmVyeSBsYXJnZS4KKyAgICAgICAgdmFyIGh1Z2Vfd3JpdGUgOiBCb29sID0gKGxlbiA+PSAoMiAqIGJ1ZlNpemUpKTsKKyAgICAgICAgdmFyIGV4Y2VlZHNfYnVmIDogQm9vbCA9IGh1Z2Vfd3JpdGUgfHwgKGxlbiA+PSBidWZTaXplKTsKKyAgICAgICAgdmFyIHdyaXRlX3RocnUgOiBCb29sID0gZXhjZWVkc19idWYgJiYgKHdyaXRlQnVmZmVyXy5sZW5ndGggPj0gaGFsZlNpemUpOworICAgICAgICBpZiAoIHdyaXRlX3RocnUpIHsKKyAgICAgICAgICAgIHdyaXRlQ2h1bmsodHJ1ZSk7IC8vIGZvcmNlIHNlbmQgd2hhdGV2ZXIgd2UgaGF2ZSBpbiB0aGVyZQorICAgICAgICAgICAgdHJhbnNwb3J0LndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOyAgLy8gd3JpdGUgdGhydQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd3JpdGVCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICB3cml0ZUNodW5rKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaCggY2FsbGJhY2sgOiBEeW5hbWljLT5Wb2lkID1udWxsKSA6IFZvaWQgeworICAgICAgICB3cml0ZUNodW5rKHRydWUpOworICAgICAgICB0cmFuc3BvcnQuZmx1c2goY2FsbGJhY2spOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzllNzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGV4dGVuZHMgVFRyYW5zcG9ydEZhY3RvcnkgeworCisgICAgcHJpdmF0ZSB2YXIgYnVmU2l6ZSA6IEludDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoYnVmU2l6ZSA6IEludCA9IFRCdWZmZXJlZFRyYW5zcG9ydC5ERUZBVUxUX0JVRlNJWkUpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5idWZTaXplID0gYnVmU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KGJhc2UgOiBUVHJhbnNwb3J0KSA6IFRUcmFuc3BvcnQgeworICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChiYXNlLCBidWZTaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlU3RyZWFtLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDhhZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVN0cmVhbS5oeApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLklucHV0OworaW1wb3J0IGhheGUuaW8uT3V0cHV0OworCisKK2VudW0gVEZpbGVNb2RlIHsKKyAgICBDcmVhdGVOZXc7CisgICAgQXBwZW5kOworICAgIFJlYWQ7Cit9CisKKworY2xhc3MgVEZpbGVTdHJlYW0gaW1wbGVtZW50cyBUU3RyZWFtIHsKKworICAgIHB1YmxpYyB2YXIgRmlsZU5hbWUoZGVmYXVsdCxudWxsKSA6IFN0cmluZzsKKworICAgIHByaXZhdGUgdmFyIElucHV0ICA6IHN5cy5pby5GaWxlSW5wdXQ7CisgICAgcHJpdmF0ZSB2YXIgT3V0cHV0IDogc3lzLmlvLkZpbGVPdXRwdXQ7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGZuYW1lIDogU3RyaW5nLCBtb2RlIDogVEZpbGVNb2RlKSB7CisgICAgICAgIEZpbGVOYW1lID0gZm5hbWU7CisgICAgICAgIHN3aXRjaCAoIG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgVEZpbGVNb2RlLkNyZWF0ZU5ldzoKKyAgICAgICAgICAgICAgICBPdXRwdXQgPSBzeXMuaW8uRmlsZS53cml0ZSggZm5hbWUsIHRydWUpOworCisgICAgICAgICAgICBjYXNlIFRGaWxlTW9kZS5BcHBlbmQ6CisgICAgICAgICAgICAgICAgT3V0cHV0ID0gc3lzLmlvLkZpbGUuYXBwZW5kKCBmbmFtZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGNhc2UgVEZpbGVNb2RlLlJlYWQ6CisgICAgICAgICAgICAgICAgSW5wdXQgPSBzeXMuaW8uRmlsZS5yZWFkKCBmbmFtZSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG1vZGUiKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIElucHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIElucHV0LmNsb3NlKCk7CisgICAgICAgICAgICBJbnB1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYoIE91dHB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBPdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIE91dHB1dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gUGVlaygpIDogQm9vbCB7CisgICAgICAgIGlmKCBJbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBpbnB1dCIpOworCisgICAgICAgIHJldHVybiAoISBJbnB1dC5lb2YoKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFJlYWQoIGJ1ZiA6IEJ5dGVzLCBvZmZzZXQgOiBJbnQsIGNvdW50IDogSW50KSA6IEludCB7CisgICAgICAgIGlmKCBJbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBpbnB1dCIpOworCisgICAgICAgIHJldHVybiBJbnB1dC5yZWFkQnl0ZXMoIGJ1Ziwgb2Zmc2V0LCBjb3VudCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIFdyaXRlKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYoIE91dHB1dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJGaWxlIG5vdCBvcGVuIGZvciBvdXRwdXQiKTsKKworICAgICAgICBPdXRwdXQud3JpdGVCeXRlcyggYnVmLCBvZmZzZXQsIGNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gRmx1c2goKSA6IFZvaWQgeworICAgICAgICBpZiggT3V0cHV0ICE9IG51bGwpCisgICAgICAgICAgICBPdXRwdXQuZmx1c2goKTsKKyAgICB9CisKK30KKyAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmODJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworCitpbXBvcnQgaGF4ZS5pby5Fb2Y7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKKy8qKgorICogVEZyYW1lZFRyYW5zcG9ydCBpcyBhIGJ1ZmZlcmVkIFRUcmFuc3BvcnQgdGhhdCBlbnN1cmVzIGEgZnVsbHkgcmVhZCBtZXNzYWdlCisgKiBldmVyeSB0aW1lIGJ5IHByZWNlZGluZyBtZXNzYWdlcyB3aXRoIGEgNC1ieXRlIGZyYW1lIHNpemUuCisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIERFRkFVTFRfTUFYX0xFTkdUSCA9IDE2Mzg0MDAwOworCisgICAgdmFyIG1heExlbmd0aF8gOiAgSW50OworCisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICB2YXIgdHJhbnNwb3J0XyA6ICBUVHJhbnNwb3J0ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3Igb3V0cHV0CisgICAgICovCisgICAgdmFyIHdyaXRlQnVmZmVyXyA6IEJ5dGVzT3V0cHV0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIGlucHV0CisgICAgICovCisgICAgdmFyIHJlYWRCdWZmZXJfIDogQnl0ZXNJbnB1dCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB3cmFwcyBhcm91bmQgYW5vdGhlciB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KCB0cmFuc3BvcnQgOiBUVHJhbnNwb3J0LCBtYXhMZW5ndGggOiBJbnQgPSBERUZBVUxUX01BWF9MRU5HVEgpIHsKKyAgICAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKKyAgICAgICAgbWF4TGVuZ3RoXyA9IG1heExlbmd0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gb3BlbigpIDogVm9pZCB7CisgICAgICAgIHRyYW5zcG9ydF8ub3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gdHJhbnNwb3J0Xy5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgICAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmIDogQnl0ZXNCdWZmZXIsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisKKyAgICAgICAgICAgIGlmICgocmVhZEJ1ZmZlcl8gIT0gbnVsbCkgJiYgKHJlYWRCdWZmZXJfLnBvc2l0aW9uIDwgcmVhZEJ1ZmZlcl8ubGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHZhciBnb3QgOiBJbnQgPSByZWFkQnVmZmVyXy5yZWFkQnl0ZXMoZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGlmIChnb3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsZ290KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIHJlYWRGcmFtZSgpOworCisgICAgICAgICAgICB2YXIgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgIGJ1Zi5hZGRCeXRlcyhkYXRhLDAsZ290KTsKKyAgICAgICAgICAgIHJldHVybiBnb3Q7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRsZW4gYnl0ZXMhJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGZ1bmN0aW9uIHJlYWRGcmFtZVNpemUoKSA6IEludCB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgYnVmZmVyID0gbmV3IEJ5dGVzQnVmZmVyKCk7CisgICAgICAgICAgICB2YXIgbGVuID0gdHJhbnNwb3J0Xy5yZWFkQWxsKCBidWZmZXIsIDAsIDQpOworICAgICAgICAgICAgdmFyIGlucCA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgNCk7CisgICAgICAgICAgICBpbnAuYmlnRW5kaWFuID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBpbnAucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgNCBieXRlcyEnKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgZnVuY3Rpb24gcmVhZEZyYW1lKCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIHNpemUgOiBJbnQgPSByZWFkRnJhbWVTaXplKCk7CisKKyAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoJHNpemUpIScpOworICAgICAgICB9OworICAgICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aF8pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0ZyYW1lIHNpemUgKCRzaXplKSBsYXJnZXIgdGhhbiBtYXggbGVuZ3RoICgkbWF4TGVuZ3RoXykhJyk7CisgICAgICAgIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhciBidWZmZXIgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemUgPSB0cmFuc3BvcnRfLnJlYWRBbGwoIGJ1ZmZlciwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyXyA9IG5ldyBCeXRlc0lucHV0KCBidWZmZXIuZ2V0Qnl0ZXMoKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICByZWFkQnVmZmVyXy5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNhdGNoKGVvZiA6IEVvZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwgJ0NhblwndCByZWFkICRzaXplIGJ5dGVzIScpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHdyaXRlKGJ1ZiA6IEJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgd3JpdGVCdWZmZXJfLndyaXRlQnl0ZXMoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgZnVuY3Rpb24gd3JpdGVGcmFtZVNpemUobGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB2YXIgb3V0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgICAgIG91dC5iaWdFbmRpYW4gPSB0cnVlOworICAgICAgICBvdXQud3JpdGVJbnQzMihsZW4pOworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKG91dC5nZXRCeXRlcygpLCAwLCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goIGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZiA6IEJ5dGVzID0gd3JpdGVCdWZmZXJfLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBsZW4gOiBJbnQgPSBidWYubGVuZ3RoOworICAgICAgICB3cml0ZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNPdXRwdXQoKTsKKworICAgICAgICB3cml0ZUZyYW1lU2l6ZShsZW4pOworICAgICAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICAgICAgdHJhbnNwb3J0Xy5mbHVzaChjYWxsYmFjayk7CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNDVhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKKworCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKKworICAgIHZhciBtYXhMZW5ndGhfIDogSW50OworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldyhtYXhMZW5ndGggOiBJbnQgPSBURnJhbWVkVHJhbnNwb3J0LkRFRkFVTFRfTUFYX0xFTkdUSCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBtYXhMZW5ndGhfID0gbWF4TGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoYmFzZSA6IFRUcmFuc3BvcnQpIDogVFRyYW5zcG9ydCB7CisgICAgICAgIHJldHVybiBuZXcgVEZyYW1lZFRyYW5zcG9ydChiYXNlLCBtYXhMZW5ndGhfKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZ1bGxEdXBsZXhIdHRwQ2xpZW50Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NzI4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGdWxsRHVwbGV4SHR0cENsaWVudC5oeApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGZsYXNoLmVycm9ycy5FT0ZFcnJvcjsKK2ltcG9ydCBmbGFzaC5ldmVudHMuRXZlbnQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLklPRXJyb3JFdmVudDsKK2ltcG9ydCBmbGFzaC5ldmVudHMuUHJvZ3Jlc3NFdmVudDsKK2ltcG9ydCBmbGFzaC5ldmVudHMuU2VjdXJpdHlFcnJvckV2ZW50OworaW1wb3J0IGZsYXNoLm5ldC5VUkxMb2FkZXI7CitpbXBvcnQgZmxhc2gubmV0LlVSTExvYWRlckRhdGFGb3JtYXQ7CitpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3Q7CitpbXBvcnQgZmxhc2gubmV0LlVSTFJlcXVlc3RNZXRob2Q7CitpbXBvcnQgZmxhc2gudXRpbHMuSURhdGFJbnB1dDsKK2ltcG9ydCBmbGFzaC51dGlscy5JRGF0YU91dHB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzOworaW1wb3J0IGZsYXNoLm5ldC5Tb2NrZXQ7CitpbXBvcnQgZmxhc2guZXZlbnRzLkV2ZW50RGlzcGF0Y2hlcjsKKworCisgICAgLyoqCisgICAgICogSFRUUCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuIFVzZWQgZm9yIHdvcmtpbmcgd2l0aCBhCisgICAgICogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBVbmxpa2UgSHR0cCBDbGllbnQsIGl0IHVzZXMgYSBzaW5nbGUgUE9TVCwgYW5kIGNodW5rLWVuY29kaW5nIHRvIHRyYW5zZmVyIGFsbCBtZXNzYWdlcy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBjbGFzcyBURnVsbER1cGxleEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBTb2NrZXQgPSBudWxsOworICAgICAgICBwcml2YXRlIHZhciBob3N0ICA6ICBTdHJpbmc7CisgICAgICAgIHByaXZhdGUgdmFyIHBvcnQgIDogIEludDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgcmVzb3VyY2UgIDogIFN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSB2YXIgc3RyaXBwZWQgIDogIEJvb2wgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlciA6IEJ5dGVzID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIHByaXZhdGUgdmFyIGlucHV0IDogSURhdGFJbnB1dDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogSURhdGFPdXRwdXQ7CisgICAgICAgIHByaXZhdGUgdmFyIGJ5dGVzSW5DaHVuayAgOiAgSW50ID0gMDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgQ1JMRiA6IEJ5dGVzID0gbmV3IEJ5dGVzKCk7CisgICAgICAgIHByaXZhdGUgdmFyIGlvQ2FsbGJhY2sgOiBURXhjZXB0aW9uLT5Wb2lkID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSB2YXIgZXZlbnREaXNwYXRjaGVyIDogRXZlbnREaXNwYXRjaGVyID0gbmV3IEV2ZW50RGlzcGF0Y2hlcigpOworCisgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoaG9zdCAgOiAgU3RyaW5nLCBwb3J0ICA6ICBJbnQsIHJlc291cmNlICA6ICBTdHJpbmcpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIENSTEYud3JpdGVCeXRlKDEzKTsKKyAgICAgICAgICAgIENSTEYud3JpdGVCeXRlKDEwKTsKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGNsb3NlKCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLm91dHB1dCA9IG51bGw7CisgICAgICAgICAgICB0aGlzLnN0cmlwcGVkID0gZmFsc2U7CisgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSAgOiAgQm9vbAorICAgICAgICB7CisgICAgICAgICAgICBpZihzb2NrZXQuY29ubmVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCJCeXRlcyByZW1haW5lZDoiICsgc29ja2V0LmJ5dGVzQXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc29ja2V0LmJ5dGVzQXZhaWxhYmxlPjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcmVhZChidWYgOiBCeXRlcywgb2ZmICA6ICBJbnQsIGxlbiAgOiAgSW50KSAgOiAgSW50CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuMSAgOiAgSW50ID0gMCwgbjIgIDogIEludCA9IDAsIG4zICA6ICBJbnQgPSAwLCBuNCAgOiAgSW50ID0gMCwgY2lkeCAgOiAgSW50ID0gMjsKKyAgICAgICAgICAgIHZhciBjaHVua1NpemUgOiBCeXRlcyA9IG5ldyBCeXRlcygpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXN0cmlwcGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbjEgPSBuMjsKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBuMzsKKyAgICAgICAgICAgICAgICAgICAgbjMgPSBuNDsKKyAgICAgICAgICAgICAgICAgICAgbjQgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoKG4xID09IDEzKSAmJiAobjIgPT0gMTApICYmIChuMyA9PSAxMykgJiYgKG40ID09IDEwKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVhZCBjaHVuayBzaXplCisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzSW5DaHVuayA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbjEgPSBpbnB1dC5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgICAgICBuMiA9IGlucHV0LnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplLndyaXRlQnl0ZShuMSk7CisgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZS53cml0ZUJ5dGUobjIpOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghKChuMSA9PSAxMykgJiYgKG4yID09IDEwKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4xID0gbjI7CisgICAgICAgICAgICAgICAgICAgICAgICBuMiA9IGlucHV0LnJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua1NpemUud3JpdGVCeXRlKG4yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzSW5DaHVuayA9IHBhcnNlSW50KGNodW5rU2l6ZS50b1N0cmluZygpLCAxNik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW5wdXQucmVhZEJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICAgICAgICAgIGRlYnVnQnVmZmVyKGJ1Zik7CisgICAgICAgICAgICAgICAgYnl0ZXNJbkNodW5rIC09IGxlbjsKKworICAgICAgICAgICAgICAgIGlmIChieXRlc0luQ2h1bmsgPT0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgdGhlICA6ICAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQucmVhZFVURkJ5dGVzKDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBFT0ZFcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICJObyBtb3JlIGRhdGEgYXZhaWxhYmxlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlJyk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChlIDogRXJyb3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2UoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yOiAkZScpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0JhZCBJTyBlcnJvcjogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGRlYnVnQnVmZmVyKGJ1ZiA6IEJ5dGVzKSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZGVidWcgIDogIFN0cmluZyA9ICJCVUZGRVIgPj4iOworICAgICAgICAgICAgdmFyIGkgIDogIEludDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVidWcgKz0gYnVmW2ldIGFzIGludDsKKyAgICAgICAgICAgICAgICBkZWJ1ZyArPSAiICI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNlKGRlYnVnICsgIjw8Iik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgb2J1ZmZlci53cml0ZUJ5dGVzKGJ1Ziwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIodHlwZSAgOiAgU3RyaW5nLCBsaXN0ZW5lciA6IEZ1bmN0aW9uLCB1c2VDYXB0dXJlICA6ICBCb29sID0gZmFsc2UsIHByaW9yaXR5ICA6ICBJbnQgPSAwLCB1c2VXZWFrUmVmZXJlbmNlICA6ICBCb29sID0gZmFsc2UpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUsIHByaW9yaXR5LCB1c2VXZWFrUmVmZXJlbmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTk5FQ1QsIHNvY2tldENvbm5lY3RlZCk7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgc29ja2V0RXJyb3IpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihTZWN1cml0eUVycm9yRXZlbnQuU0VDVVJJVFlfRVJST1IsIHNvY2tldFNlY3VyaXR5RXJyb3IpOworICAgICAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihQcm9ncmVzc0V2ZW50LlNPQ0tFVF9EQVRBLCBzb2NrZXREYXRhSGFuZGxlcik7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldENvbm5lY3RlZChldmVudCA6IEV2ZW50KSAgOiAgVm9pZAorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm91dHB1dCA9IHRoaXMuc29ja2V0OworICAgICAgICAgICAgdGhpcy5pbnB1dCA9IHRoaXMuc29ja2V0OworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYoICJDT05ORUNUICIgKyByZXNvdXJjZSArICIgSFRUUC8xLjFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSG9zdCA6ICAiICsgaG9zdCArICI6IiArIHBvcnQgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVXNlci1BZ2VudCA6ICBUaHJpZnQvSGF4ZVxyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRyYW5zZmVyLUVuY29kaW5nIDogIGNodW5rZWRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb250ZW50LXR5cGUgOiAgYXBwbGljYXRpb24veC10aHJpZnRcclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJBY2NlcHQgOiAgKi8qXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiIpOworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0RXJyb3IoZXZlbnQgOiBJT0Vycm9yRXZlbnQpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJFcnJvciBDb25uZWN0aW5nOiIgKyBldmVudCk7CisgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAoaW9DYWxsYmFjayA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiSU9FcnJvciA6ICAiICsgZXZlbnQudGV4dCkpOworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc29ja2V0U2VjdXJpdHlFcnJvcihldmVudCA6IFNlY3VyaXR5RXJyb3JFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoIlNlY3VyaXR5IEVycm9yIENvbm5lY3Rpbmc6IiArIGV2ZW50KTsKKyAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKKyAgICAgICAgICAgIHRoaXMuZXZlbnREaXNwYXRjaGVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZ1bmN0aW9uIHNvY2tldERhdGFIYW5kbGVyKGV2ZW50IDogUHJvZ3Jlc3NFdmVudCkgIDogIFZvaWQKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoIkdvdCBEYXRhIGNhbGw6IiAraW9DYWxsYmFjayk7CisgICAgICAgICAgICBpZiAoaW9DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2sobnVsbCk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdGhpcy5ldmVudERpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2sgOiBFcnJvci0+Vm9pZCA9IG51bGwpICA6ICBWb2lkCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCJzZXQgY2FsbGJhY2s6IiArIGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHRoaXMuaW9DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVVVEYodGhpcy5vYnVmZmVyLmxlbmd0aC50b1N0cmluZygxNikpOworICAgICAgICAgICAgdGhpcy5vdXRwdXQud3JpdGVCeXRlcyhDUkxGKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXModGhpcy5vYnVmZmVyKTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0LndyaXRlQnl0ZXMoQ1JMRik7CisgICAgICAgICAgICB0aGlzLnNvY2tldC5mbHVzaCgpOworICAgICAgICAgICAgLy8gd2FpdGluZyBmb3IgIG5ldyBGbGV4IHNkayAzLjUKKyAgICAgICAgICAgIC8vdGhpcy5vYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICB0aGlzLm9idWZmZXIgPSBuZXcgQnl0ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSAgOiAgQm9vbAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKHRoaXMuc29ja2V0ID09IG51bGwgPyBmYWxzZSAgOiAgdGhpcy5zb2NrZXQuY29ubmVjdGVkKTsKKyAgICAgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmODY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaHgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKKworaW1wb3J0IGhheGUuSHR0cDsKKworCisKKy8qKgorKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKKyogVGhyaWZ0IHdlYiBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbi4KKyovCisKK2NsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBwcml2YXRlIHZhciByZXF1ZXN0QnVmZmVyXyAgOiBCeXRlc091dHB1dCA9IG5ldyBCeXRlc091dHB1dCgpOworICAgIHByaXZhdGUgdmFyIHJlc3BvbnNlQnVmZmVyXyA6IEJ5dGVzSW5wdXQgPSBudWxsOworCisgICAgcHJpdmF0ZSB2YXIgcmVxdWVzdF8gICAgICAgIDogSHR0cCA9IG51bGw7CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIHJlcXVlc3RVcmwgOiBTdHJpbmcpIDogVm9pZCB7CisgICAgICAgICAgcmVxdWVzdF8gPSBuZXcgSHR0cChyZXF1ZXN0VXJsKTsKKyAgICAgICAgcmVxdWVzdF8uYWRkSGVhZGVyKCAiY29udGVudFR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgOiBWb2lkIHsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gY2xvc2UoKSA6IFZvaWQgeworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoYnVmOkJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICBpZiAocmVzcG9uc2VCdWZmZXJfID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIlJlc3BvbnNlIGJ1ZmZlciBpcyBlbXB0eSwgbm8gcmVxdWVzdC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBkYXRhID1CeXRlcy5hbGxvYyhsZW4pOworICAgICAgICBsZW4gPSByZXNwb25zZUJ1ZmZlcl8ucmVhZEJ5dGVzKGRhdGEsIG9mZiwgbGVuKTsKKyAgICAgICAgYnVmLmFkZEJ5dGVzKGRhdGEsMCxsZW4pOworICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgcmVxdWVzdEJ1ZmZlcl8ud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBmbHVzaChjYWxsYmFjazpEeW5hbWljLT5Wb2lkID0gbnVsbCkgOiBWb2lkIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IHJlcXVlc3RCdWZmZXJfOworICAgICAgICByZXF1ZXN0QnVmZmVyXyA9IG5ldyBCeXRlc091dHB1dCgpOworICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBudWxsOworCisgICAgICAgIHJlcXVlc3RfLm9uRGF0YSA9IGZ1bmN0aW9uKGRhdGEgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHZhciB0bXAgPSBuZXcgQnl0ZXNCdWZmZXIoKTsKKyAgICAgICAgICAgIHRtcC5hZGRTdHJpbmcoZGF0YSk7CisgICAgICAgICAgICByZXNwb25zZUJ1ZmZlcl8gPSBuZXcgQnl0ZXNJbnB1dCh0bXAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBpZiggY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlcXVlc3RfLm9uRXJyb3IgPSBmdW5jdGlvbihtc2cgOiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGlmKCBjYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiSU9FcnJvcjogIiArIG1zZykpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlcXVlc3RfLnNldFBvc3REYXRhKGJ1ZmZlci5nZXRCeXRlcygpLnRvU3RyaW5nKCkpOworICAgICAgICByZXF1ZXN0Xy5yZXF1ZXN0KHRydWUvKlBPU1QqLyk7CisgICAgfQorCit9CisKKyAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhZGIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oeApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUucmVtb3RpbmcuU29ja2V0UHJvdG9jb2w7CitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5PdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5Fb2Y7CisKKy8vaW1wb3J0IGZsYXNoLm5ldC5TZXJ2ZXJTb2NrZXQ7IC0gbm90IHlldCBhdmFpbGFibGUgb24gSGF4ZSAzLjEuMworI2lmICEgKGZsYXNoIHx8IGh0bWw1KQorCitpbXBvcnQgc3lzLm5ldC5Ib3N0OworCisKK2NsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICAgIC8vIFVuZGVybHlpbmcgc2VydmVyIHdpdGggc29ja2V0CisgICAgcHJpdmF0ZSB2YXIgX3NvY2tldCA6IFNvY2tldD0gbnVsbDsKKworICAgIC8vIFRpbWVvdXQgZm9yIGNsaWVudCBzb2NrZXRzIGZyb20gYWNjZXB0CisgICAgcHJpdmF0ZSB2YXIgX2NsaWVudFRpbWVvdXQgOiBGbG9hdCA9IDU7CisKKyAgICAvLyBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKKyAgICBwcml2YXRlIHZhciBfdXNlQnVmZmVyZWRTb2NrZXRzIDogQm9vbCA9IGZhbHNlOworCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KD9hZGRyZXNzIDogU3RyaW5nID0gJ2xvY2FsaG9zdCcsICBwb3J0IDogSW50LCBjbGllbnRUaW1lb3V0IDogRmxvYXQgPSA1LCB1c2VCdWZmZXJlZFNvY2tldHMgOiBCb29sID0gZmFsc2UpCisgICAgeworICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIF91c2VCdWZmZXJlZFNvY2tldHMgPSB1c2VCdWZmZXJlZFNvY2tldHM7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIF9zb2NrZXQgPSBuZXcgU29ja2V0KCk7CisgICAgICAgICAgICBfc29ja2V0LmJpbmQoIG5ldyBIb3N0KGFkZHJlc3MpLCBwb3J0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zb2NrZXQgPSBudWxsOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgJ0NvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIHBvcnQgJHBvcnQ6ICRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBMaXN0ZW4oKSA6IFZvaWQKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgb24gYWNjZXB0CisgICAgICAgIGlmIChfc29ja2V0ICE9IG51bGwpICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICNpZiAhcGhwCisgICAgICAgICAgICAgICAgX3NvY2tldC5saXN0ZW4oMSk7CisgICAgICAgICAgICAgICAgI2VuZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICRlJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIG92ZXJyaWRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIGlmIChfc29ja2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBhY2NlcHRlZCA9IF9zb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVFNvY2tldC5mcm9tU29ja2V0KGFjY2VwdGVkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRUaW1lb3V0KCBfY2xpZW50VGltZW91dCk7CisKKyAgICAgICAgICAgIGlmKCBfdXNlQnVmZmVyZWRTb2NrZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93ICJidWZmZXJlZCB0cmFuc3BvcnQgbm90IHlldCBzdXBwb3J0ZWQiOyAgLy8gVE9ETworICAgICAgICAgICAgICAgIC8vcmVzdWx0ID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydChyZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0Vycm9yICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnJGUnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBDbG9zZSgpIDogVm9pZAorICAgIHsKKyAgICAgICAgaWYgKF9zb2NrZXQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdFcnJvciAkZScpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdXQVJOSU5HOiBDb3VsZCBub3QgY2xvc2Ugc2VydmVyIHNvY2tldDogJGUnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9zb2NrZXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorfQorCisjZW5kCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4OTk4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBBY2NlcHQoKSA6IFRUcmFuc3BvcnQgeworICAgICAgICB2YXIgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOworICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIExpc3RlbigpIDogVm9pZCB7CisgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIENsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgdGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeCBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTQxYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmh4CkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCisjaWYgZmxhc2gKK2ltcG9ydCBmbGFzaC5uZXQuU29ja2V0OworI2Vsc2VpZiBqcworaW1wb3J0IGpzLmh0bWwuV2ViU29ja2V0OworI2Vsc2UKK2ltcG9ydCBoYXhlLnJlbW90aW5nLlNvY2tldFByb3RvY29sOworI2VuZAorCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNJbnB1dDsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzT3V0cHV0OworaW1wb3J0IGhheGUuaW8uSW5wdXQ7CitpbXBvcnQgaGF4ZS5pby5PdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5Fb2Y7CisKKworI2lmICEgKGZsYXNoIHx8IGpzKQoraW1wb3J0IHN5cy5uZXQuSG9zdDsKKyNlbmQKKworCisgIC8qKgorICAgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLiBVc2VkIGZvciB3b3JraW5nIHdpdGggYQorICAgKiBUaHJpZnQgU29ja2V0IFNlcnZlciBiYXNlZCBpbXBsZW1lbnRhdGlvbnMuCisgICAqLworCitjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydCAgeworCisgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICBwcml2YXRlIHZhciBob3N0ICA6ICBTdHJpbmc7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBob3N0ICA6ICBIb3N0OworICAgICNlbmQKKworICAgIHByaXZhdGUgdmFyIHBvcnQgIDogIEludDsKKworICAgICNpZiBqcworICAgIHByaXZhdGUgdmFyIHNvY2tldCA6IFdlYlNvY2tldCA9IG51bGw7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBzb2NrZXQgOiBTb2NrZXQgPSBudWxsOworICAgICNlbmQKKworICAgICNpZiBqcworICAgIHByaXZhdGUgdmFyIGlucHV0IDogRHluYW1pYyA9IG51bGw7CisgICAgcHJpdmF0ZSB2YXIgb3V0cHV0IDogV2ViU29ja2V0ID0gbnVsbDsKKyAgICAjZWxzZWlmIGZsYXNoCisgICAgcHJpdmF0ZSB2YXIgaW5wdXQgOiBTb2NrZXQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIG91dHB1dCA6IFNvY2tldCA9IG51bGw7CisgICAgI2Vsc2UKKyAgICBwcml2YXRlIHZhciBpbnB1dCA6IElucHV0ID0gbnVsbDsKKyAgICBwcml2YXRlIHZhciBvdXRwdXQgOiBPdXRwdXQgPSBudWxsOworICAgICNlbmQKKworICAgIHByaXZhdGUgdmFyIHRpbWVvdXQgOiBGbG9hdCA9IDMwOworCisgICAgcHJpdmF0ZSB2YXIgb2J1ZmZlciA6IEJ5dGVzT3V0cHV0ID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisgICAgcHJpdmF0ZSB2YXIgaW9DYWxsYmFjayA6IFRFeGNlcHRpb24tPlZvaWQgPSBudWxsOworICAgIHByaXZhdGUgdmFyIHJlYWRDb3VudCA6IEludCA9IDA7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gbmV3KGhvc3QgOiBTdHJpbmcsIHBvcnQgIDogIEludCkgIDogIFZvaWQgIHsKKyAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgdGhpcy5ob3N0ID0gbmV3IEhvc3QoaG9zdCk7CisgICAgICAgICNlbmQKKworICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OworICAgIH0KKworICAgICNpZiAhIChmbGFzaCB8fCBqcykKKyAgICAvLyB1c2VkIGJ5IFRTb2NrZXRTZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Tb2NrZXQoIHNvY2tldCA6IFNvY2tldCkgOiBUU29ja2V0ICB7CisgICAgICAgIHZhciBzb2NrZXRIb3N0ID0gc29ja2V0Lmhvc3QoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBUU29ja2V0KHNvY2tldEhvc3QuaG9zdC50b1N0cmluZygpLCBzb2NrZXRIb3N0LnBvcnQpOworICAgICAgICByZXN1bHQuYXNzaWduU29ja2V0KHNvY2tldCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgICNlbmQKKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpICA6ICBWb2lkICB7CisgICAgICAgIGlucHV0ID0gbnVsbDsKKyAgICAgICAgb3V0cHV0ID0gbnVsbDsKKyAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHBlZWsoKSAgOiAgQm9vbCAgeworICAgICAgICBpZiggKGlucHV0ID09IG51bGwpIHx8IChzb2NrZXQgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICNpZiBmbGFzaAorICAgICAgICAgICAgcmV0dXJuIChpbnB1dC5ieXRlc0F2YWlsYWJsZSA+IDApOworICAgICAgICAgICAgI2Vsc2VpZiBqcworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgdmFyIHJlYWR5ID0gU29ja2V0LnNlbGVjdCggW3NvY2tldF0sIG51bGwsIG51bGwsIDApOworICAgICAgICAgICAgcmV0dXJuIChyZWFkeS5yZWFkLmxlbmd0aCA+IDApOworICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVhZHMgdXAgdG8gbGVuIGJ5dGVzIGludG8gYnVmZmVyIGJ1Ziwgc3RhcnRpbmcgYXR0IG9mZnNldCBvZmYuCisgICAgLy8gTWF5IHJldHVybiBsZXNzIGJ5dGVzIHRoYW4gbGVuIHJlcXVpcmVkCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoIGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICAjaWYgZmxhc2gKKworICAgICAgICAgICAgdmFyIHJlbWFpbmluZyA9IGxlbjsKKyAgICAgICAgICAgIHdoaWxlKCByZW1haW5pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIGlucHV0LnJlYWRCeXRlKCkpOworICAgICAgICAgICAgICAgIC0tcmVtYWluaW5nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKworICAgICAgICAgICAgI2Vsc2VpZiBqcworCisgICAgICAgICAgICBpZiggaW5wdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwgIlN0aWxsIG5vIGRhdGEgIik7ICAvLyBkb24ndCBibG9jaworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIG5yID0gbGVuOworICAgICAgICAgICAgd2hpbGUoIG5yIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgYnVmLmFkZEJ5dGUoIGlucHV0LmdldChvZmYrbnIpKTsKKyAgICAgICAgICAgICAgICArK25yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlbjsKKworICAgICAgICAgICAgI2Vsc2UKKworICAgICAgICAgICAgLy9zb2NrZXQud2FpdEZvclJlYWQoKTsgIC0gIG5vLCB0aGlzIGlnbm9yZXMgdGltZW91dCBhbmQgYmxvY2tzIGluZmluaXRlbHkKKyAgICAgICAgICAgIGlmKHJlYWRDb3VudCA8IG9mZikgeworICAgICAgICAgICAgICAgIGlucHV0LnJlYWQob2ZmLXJlYWRDb3VudCk7CisgICAgICAgICAgICAgICAgcmVhZENvdW50ID0gb2ZmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZGF0YSA9IEJ5dGVzLmFsbG9jKGxlbik7CisgICAgICAgICAgICB2YXIgZ290ID0gaW5wdXQucmVhZEJ5dGVzKGRhdGEsIDAsIGxlbik7CisgICAgICAgICAgICBidWYuYWRkQnl0ZXMoIGRhdGEsIDAsIGdvdCk7CisgICAgICAgICAgICByZWFkQ291bnQgKz0gZ290OworICAgICAgICAgICAgcmV0dXJuIGdvdDsKKworICAgICAgICAgICAgI2VuZAorICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRW9mKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnRW9mICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYWNlKCdURXhjZXB0aW9uICRlJyk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJ0Vycm9yICRlJyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sICdCYWQgSU8gZXJyb3IgOiAkZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmIDogQnl0ZXMsIG9mZiAgOiAgSW50LCBsZW4gIDogIEludCkgIDogIFZvaWQKKyAgICB7CisgICAgICAgIG9idWZmZXIud3JpdGVCeXRlcyhidWYsIG9mZiwgbGVuKTsKKyAgICB9CisKKworCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrIDogRHluYW1pYy0+Vm9pZCA9IG51bGwpICA6ICBWb2lkCisgICAgeworICAgICAgICBpZiggISBpc09wZW4oKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBub3Qgb3BlbiIpOworICAgICAgICB9CisKKyAgICAgICAgI2lmIGZsYXNoCisKKyAgICAgICAgdmFyIGJ5dGVzID0gbmV3IGZsYXNoLnV0aWxzLkJ5dGVBcnJheSgpOworICAgICAgICB2YXIgZGF0YSA9IG9idWZmZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgdmFyIGxlbiA9IDA7CisgICAgICAgIHdoaWxlKCBsZW4gPCBkYXRhLmxlbmd0aCkgeworICAgICAgICAgICAgYnl0ZXMud3JpdGVCeXRlKGRhdGEuZ2V0KGxlbikpOworICAgICAgICAgICAgKytsZW47CisgICAgICAgIH0KKworICAgICAgICAjZWxzZWlmIGpzCisKKyAgICAgICAgdmFyIGRhdGEgPSBvYnVmZmVyLmdldEJ5dGVzKCk7CisgICAgICAgIHZhciBvdXRidWYgPSBuZXcganMuaHRtbC5JbnQ4QXJyYXkoZGF0YS5sZW5ndGgpOworICAgICAgICB2YXIgbGVuID0gMDsKKyAgICAgICAgd2hpbGUoIGxlbiA8IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBvdXRidWYuc2V0KCBbZGF0YS5nZXQobGVuKV0sIGxlbik7CisgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgfQorICAgICAgICB2YXIgYnl0ZXMgPSBvdXRidWYuYnVmZmVyOworCisgICAgICAgICNlbHNlCisKKyAgICAgICAgdmFyIGJ5dGVzID0gb2J1ZmZlci5nZXRCeXRlcygpOworICAgICAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoOworCisgICAgICAgICNlbmQKKworICAgICAgICBvYnVmZmVyID0gbmV3IEJ5dGVzT3V0cHV0KCk7CisKKworICAgICAgICBpb0NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZWFkQ291bnQgPSAwOworCisgICAgICAgICAgICAjaWYganMKKyAgICAgICAgICAgIG91dHB1dC5zZW5kKCBieXRlcyk7CisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgb3V0cHV0LndyaXRlQnl0ZXMoIGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOworICAgICAgICAgICAgI2VuZAorCisgICAgICAgICAgICBpZihpb0NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpb0NhbGxiYWNrKG51bGwpOyAgLy8gc3VjY2VzcyBjYWxsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cmFjZSgnVEV4Y2VwdGlvbiAkZSwgbWVzc2FnZSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgICAgIGlmKGlvQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2soZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBEeW5hbWljKSB7CisgICAgICAgICAgICB0cmFjZShlKTsKKyAgICAgICAgICAgIGlmKGlvQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlvQ2FsbGJhY2sobmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCAnQmFkIElPIGVycm9yIDogJGUnKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gaXNPcGVuKCkgIDogIEJvb2wKKyAgICB7CisgICAgICAgIHJldHVybiAoc29ja2V0ICE9IG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBvcGVuKCkgIDogIFZvaWQKKyAgICB7CisgICAgICAgICNpZiBqcworICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFdlYlNvY2tldCgpOworICAgICAgICBzb2NrZXQub25tZXNzYWdlID0gZnVuY3Rpb24oIGV2ZW50IDoganMuaHRtbC5NZXNzYWdlRXZlbnQpIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBldmVudC5kYXRhOworICAgICAgICB9CisKKyAgICAgICAgI2Vsc2VpZiBmbGFzaAorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKworICAgICAgICAjZWxzZWlmIHBocAorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuY29ubmVjdChob3N0LCBwb3J0KTsKKyAgICAgICAgc29ja2V0LnNldEJsb2NraW5nKHRydWUpOworICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTsKKworICAgICAgICAjZWxzZQorICAgICAgICB2YXIgc29ja2V0ID0gbmV3IFNvY2tldCgpOworICAgICAgICBzb2NrZXQuc2V0QmxvY2tpbmcodHJ1ZSk7CisgICAgICAgIHNvY2tldC5zZXRGYXN0U2VuZCh0cnVlKTsKKyAgICAgICAgc29ja2V0LnNldFRpbWVvdXQodGltZW91dCk7CisgICAgICAgIHNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworCisgICAgICAgICNlbmQKKworICAgICAgICBhc3NpZ25Tb2NrZXQoIHNvY2tldCk7CisgICAgfQorCisgICAgI2lmIGpzCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBhc3NpZ25Tb2NrZXQoIHNvY2tldCA6IFdlYlNvY2tldCkgIDogIFZvaWQKKyAgICAjZWxzZQorICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzaWduU29ja2V0KCBzb2NrZXQgOiBTb2NrZXQpICA6ICBWb2lkCisgICAgI2VuZAorICAgIHsKKyAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7CisKKyAgICAgICAgI2lmIChmbGFzaCB8fCBqcykKKyAgICAgICAgb3V0cHV0ID0gc29ja2V0OworICAgICAgICBpbnB1dCA9IHNvY2tldDsKKworICAgICAgICAjZWxzZQorICAgICAgICBvdXRwdXQgPSBzb2NrZXQub3V0cHV0OworICAgICAgICBpbnB1dCA9IHNvY2tldC5pbnB1dDsKKworICAgICAgICAjZW5kCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXQoIHRpbWVvdXQgOiBGbG9hdCApIDogVm9pZCB7CisgICAgICAgIGlmKGlzT3BlbigpKSB7CisgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU3RyZWFtLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjNlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW0uaHgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKKworCitpbnRlcmZhY2UgVFN0cmVhbSB7CisgICAgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gUGVlaygpIDogQm9vbDsKKyAgICBmdW5jdGlvbiBSZWFkKCBidWYgOiBCeXRlcywgb2Zmc2V0IDogSW50LCBjb3VudCA6IEludCkgOiBJbnQ7CisgICAgZnVuY3Rpb24gV3JpdGUoIGJ1ZiA6IEJ5dGVzLCBvZmZzZXQgOiBJbnQsIGNvdW50IDogSW50KSA6IFZvaWQ7CisgICAgZnVuY3Rpb24gRmx1c2goKSA6IFZvaWQ7Cit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhN2MxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFN0cmVhbVRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmhlbHBlci4qOworCitpbXBvcnQgaGF4ZS5pby5CeXRlczsKK2ltcG9ydCBoYXhlLmlvLkJ5dGVzQnVmZmVyOworaW1wb3J0IGhheGUuaW8uQnl0ZXNPdXRwdXQ7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0lucHV0OworCisKK2NsYXNzIFRTdHJlYW1UcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKKworICAgIHB1YmxpYyB2YXIgSW5wdXRTdHJlYW0oZGVmYXVsdCxudWxsKSA6IFRTdHJlYW07CisgICAgcHVibGljIHZhciBPdXRwdXRTdHJlYW0oZGVmYXVsdCxudWxsKSA6IFRTdHJlYW07CisKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoIGlucHV0IDogVFN0cmVhbSwgb3V0cHV0IDogVFN0cmVhbSkgeworICAgICAgICB0aGlzLklucHV0U3RyZWFtID0gaW5wdXQ7CisgICAgICAgIHRoaXMuT3V0cHV0U3RyZWFtID0gb3V0cHV0OworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gcGVlaygpIDogQm9vbCB7CisgICAgICAgIHJldHVybiAoSW5wdXRTdHJlYW0gIT0gbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBmdW5jdGlvbiBjbG9zZSgpIDogVm9pZCB7CisgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbS5DbG9zZSgpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkNsb3NlKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIHJlYWQoIGJ1ZiA6IEJ5dGVzQnVmZmVyLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBJbnQgeworICAgICAgICBpZiAoSW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgZnJvbSBudWxsIElucHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZGF0YSA6IEJ5dGVzID0gIEJ5dGVzLmFsbG9jKGxlbik7CisgICAgICAgIHZhciBzaXplID0gSW5wdXRTdHJlYW0uUmVhZCggZGF0YSwgb2ZmLCBsZW4pOworICAgICAgICBidWYuYWRkQnl0ZXMoIGRhdGEsIDAsIHNpemUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gd3JpdGUoYnVmOkJ5dGVzLCBvZmYgOiBJbnQsIGxlbiA6IEludCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKE91dHB1dFN0cmVhbSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbiggVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIG51bGwgT3V0cHV0U3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICBPdXRwdXRTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIGZsdXNoKGNhbGxiYWNrOkR5bmFtaWMtPlZvaWQgPW51bGwpIDogVm9pZCB7CisgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGVyciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZsdXNoIG51bGwgT3V0cHV0U3RyZWFtIik7CisgICAgICAgICAgICBpZihjYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKGVycik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9CisKKyAgICAgICAgT3V0cHV0U3RyZWFtLkZsdXNoKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiMzE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oeApAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGhheGUuaW8uRW9mOworaW1wb3J0IGhheGUuaW8uQnl0ZXM7CitpbXBvcnQgaGF4ZS5pby5CeXRlc0J1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5BYnN0cmFjdE1ldGhvZEVycm9yOworCitjbGFzcyBUVHJhbnNwb3J0IHsKKworICAgIC8qKgorICAgICAqIFF1ZXJpZXMgd2hldGhlciB0aGUgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSA6IEJvb2wgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXMgdGhlcmUgbW9yZSBkYXRhIHRvIGJlIHJlYWQ/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlbW90ZSBzaWRlIGlzIHN0aWxsIGFsaXZlIGFuZCBmZWVkaW5nIHVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHBlZWsoKSA6IEJvb2wgeworICAgICAgICAgIHJldHVybiBpc09wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIHRyYW5zcG9ydCBjb3VsZCBub3QgYmUgb3BlbmVkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSA6IFZvaWQgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgOiBWb2lkIHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgaW50byBidWZmZXIgYnVmLCBzdGFydGluZyBhdHQgb2Zmc2V0IG9mZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgYnl0ZXMgY291bnQgYWN0dWFsbHkgcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBkYXRhCisgICAgICovCisgICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCBidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgICB9CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgYWxsIG9mIGxlbiBieXRlcyBhcmUgYWN0dWFsbHkgcmVhZCBvZmYgdGhlIHRyYW5zcG9ydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgQXJyYXkgdG8gcmVhZCBpbnRvCisgICAgICogQHBhcmFtIG9mZiBJbmRleCB0byBzdGFydCByZWFkaW5nIGF0CisgICAgICogQHBhcmFtIGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQsIHdoaWNoIG11c3QgYmUgZXF1YWwgdG8gbGVuCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbChidWYgOiBCeXRlc0J1ZmZlciwgb2ZmIDogSW50LCBsZW4gOiBJbnQpIDogSW50IHsKKyAgICAgICAgdmFyIGdvdCA6IEludCA9IDA7CisgICAgICAgIHZhciByZXQgOiBJbnQgPSAwOworICAgICAgICB3aGlsZSAoZ290IDwgbGVuKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldCA9IHJlYWQoYnVmLCBvZmYrZ290LCBsZW4tZ290KTsKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgeworICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZC4gUmVtb3RlIHNpZGUgaGFzIGNsb3NlZC4gVHJpZWQgdG8gcmVhZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGVuICsgIiBieXRlcywgYnV0IG9ubHkgZ290ICIgKyBnb3QgKyAiIGJ5dGVzLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBjYXRjaCAoZW9mIDogRW9mKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLCAnQ2FuXCd0IHJlYWQgJGxlbiBieXRlcyEnKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZ290ICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ290OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgYnVmZmVyIHRvIHRoZSBvdXRwdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQWxsKGJ1ZjpCeXRlcykgOiBWb2lkIHsKKyAgICAgICAgd3JpdGUoYnVmLCAwLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdXAgdG8gbGVuIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYgVGhlIG91dHB1dCBkYXRhIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBvZmYgVGhlIG9mZnNldCB0byBzdGFydCB3cml0aW5nIGZyb20KKyAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShidWY6Qnl0ZXMsIG9mZiA6IEludCwgbGVuIDogSW50KSA6IFZvaWQgeworICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZsdXNoIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgdHJhbnNwb3J0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyBvdXQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goY2FsbGJhY2s6RHluYW1pYy0+Vm9pZCA9bnVsbCkgOiBWb2lkIHsKKyAgICAgICAgaWYoY2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIGNhbGxiYWNrKG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4IGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDI4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaHgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKK2NsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKworICAgIC8vIFdBUk5JTkc6IFRoZXNlIGFyZSBzdWJqZWN0IHRvIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUsIHNvIHdlIGNhbid0IHVzZSBlbnVtcworICAgIC8vIHdpdGggSGF4ZSAzLjEuMyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9IYXhlRm91bmRhdGlvbi9oYXhlL2lzc3Vlcy8zNjQ5CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFVOS05PV04gOiBJbnQgPSAwOworICAgIHB1YmxpYyBzdGF0aWMgaW5saW5lIHZhciBOT1RfT1BFTiA6IEludCA9IDE7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEFMUkVBRFlfT1BFTiA6IEludCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIFRJTUVEX09VVCA6IEludCA9IDM7CisgICAgcHVibGljIHN0YXRpYyBpbmxpbmUgdmFyIEVORF9PRl9GSUxFIDogSW50ID0gNDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoZXJyb3IgOiBJbnQgPSBVTktOT1dOLCBtZXNzYWdlIDogU3RyaW5nID0gIiIpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgZXJyb3IpOworICAgIH0KKworfQorIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5Lmh4CkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qKgorICogRmFjdG9yeSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB3cmFwcGVkIGluc3RhbmNlIG9mIFRyYW5zcG9ydHMuCisgKiBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IGluIHNlcnZlcnMsIHdoaWNoIGdldCBUcmFuc3BvcnRzIGZyb20KKyAqIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQorICogYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQorICoKKyAqLworY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnkgeworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFJldHVybiBhIHdyYXBwZWQgaW5zdGFuY2Ugb2YgdGhlIGJhc2UgVHJhbnNwb3J0LgorICAgICoKKyAgICAqIEBwYXJhbSB0cmFucyBUaGUgYmFzZSB0cmFuc3BvcnQKKyAgICAqIEByZXR1cm4gV3JhcHBlZCBUcmFuc3BvcnQKKyAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoIHRyYW5zIDogVFRyYW5zcG9ydCkgOiBUVHJhbnNwb3J0IHsKKyAgICAgICAgcmV0dXJuIHRyYW5zOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RXcmFwcGluZ1NlcnZlclRyYW5zcG9ydC5oeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UV3JhcHBpbmdTZXJ2ZXJUcmFuc3BvcnQuaHgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworCisvKgorICAgd3JhcHMgcmVhbCB0cmFuc3BvcnQsIHByb3ZpZGVkIGJ5IGNvbnN0cnVjdG9yCisqLworY2xhc3MgVFdyYXBwaW5nU2VydmVyVHJhbnNwb3J0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSB2YXIgdHJhbnNwb3J0KGRlZmF1bHQsbnVsbCkgOiBUVHJhbnNwb3J0OworCisgIHB1YmxpYyBmdW5jdGlvbiBuZXcodHJhbnNwb3J0IDogVFRyYW5zcG9ydCkgeworICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGZ1bmN0aW9uIExpc3RlbigpIDogVm9pZAorICB7CisgIH0KKworICBwcml2YXRlIG92ZXJyaWRlIGZ1bmN0aW9uIEFjY2VwdEltcGwoKSA6IFRUcmFuc3BvcnQKKyAgeworICAgIHJldHVybiB0cmFuc3BvcnQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgZnVuY3Rpb24gQ2xvc2UoKSA6IFZvaWQKKyAgeworCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvaiBiL2xpYi9oYXhlL3Rlc3QvSGF4ZVRlc3RzLmh4cHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVlZDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9IYXhlVGVzdHMuaHhwcm9qCkBAIC0wLDAgKzEsNjkgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8cHJvamVjdCB2ZXJzaW9uPSIyIj4KKyAgPCEtLSBPdXRwdXQgU1dGIG9wdGlvbnMgLS0+CisgIDxvdXRwdXQ+CisgICAgPG1vdmllIG91dHB1dFR5cGU9IkFwcGxpY2F0aW9uIiAvPgorICAgIDxtb3ZpZSBpbnB1dD0iIiAvPgorICAgIDxtb3ZpZSBwYXRoPSJiaW4vSGF4ZVRlc3RzIiAvPgorICAgIDxtb3ZpZSBmcHM9IjMwIiAvPgorICAgIDxtb3ZpZSB3aWR0aD0iODAwIiAvPgorICAgIDxtb3ZpZSBoZWlnaHQ9IjYwMCIgLz4KKyAgICA8bW92aWUgdmVyc2lvbj0iMSIgLz4KKyAgICA8bW92aWUgbWlub3JWZXJzaW9uPSIwIiAvPgorICAgIDxtb3ZpZSBwbGF0Zm9ybT0iQysrIiAvPgorICAgIDxtb3ZpZSBiYWNrZ3JvdW5kPSIjRkZGRkZGIiAvPgorICA8L291dHB1dD4KKyAgPCEtLSBPdGhlciBjbGFzc2VzIHRvIGJlIGNvbXBpbGVkIGludG8geW91ciBTV0YgLS0+CisgIDxjbGFzc3BhdGhzPgorICAgIDxjbGFzcyBwYXRoPSJzcmMiIC8+CisgICAgPGNsYXNzIHBhdGg9Imdlbi1oYXhlIiAvPgorICAgIDxjbGFzcyBwYXRoPSIuLi9zcmMiIC8+CisgIDwvY2xhc3NwYXRocz4KKyAgPCEtLSBCdWlsZCBvcHRpb25zIC0tPgorICA8YnVpbGQ+CisgICAgPG9wdGlvbiBkaXJlY3RpdmVzPSIiIC8+CisgICAgPG9wdGlvbiBmbGFzaFN0cmljdD0iRmFsc2UiIC8+CisgICAgPG9wdGlvbiBub0lubGluZU9uRGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gbWFpbkNsYXNzPSJNYWluIiAvPgorICAgIDxvcHRpb24gZW5hYmxlZGVidWc9IkZhbHNlIiAvPgorICAgIDxvcHRpb24gYWRkaXRpb25hbD0iIiAvPgorICA8L2J1aWxkPgorICA8IS0tIGhheGVsaWIgbGlicmFyaWVzIC0tPgorICA8aGF4ZWxpYj4KKyAgICA8IS0tIGV4YW1wbGU6IDxsaWJyYXJ5IG5hbWU9Ii4uLiIgLz4gLS0+CisgIDwvaGF4ZWxpYj4KKyAgPCEtLSBDbGFzcyBmaWxlcyB0byBjb21waWxlIChvdGhlciByZWZlcmVuY2VkIGNsYXNzZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluY2x1ZGVkKSAtLT4KKyAgPGNvbXBpbGVUYXJnZXRzPgorICAgIDwhLS0gZXhhbXBsZTogPGNvbXBpbGUgcGF0aD0iLi4uIiAvPiAtLT4KKyAgPC9jb21waWxlVGFyZ2V0cz4KKyAgPCEtLSBQYXRocyB0byBleGNsdWRlIGZyb20gdGhlIFByb2plY3QgRXhwbG9yZXIgdHJlZSAtLT4KKyAgPGhpZGRlblBhdGhzPgorICAgIDxoaWRkZW4gcGF0aD0ib2JqIiAvPgorICAgIDxoaWRkZW4gcGF0aD0iY3BwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJjc2hhcnAuaHhtbCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9ImZsYXNoLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJqYXZhc2NyaXB0Lmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5iYXQiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJtYWtlX2FsbC5zaCIgLz4KKyAgICA8aGlkZGVuIHBhdGg9Ik1ha2VmaWxlLmFtIiAvPgorICAgIDxoaWRkZW4gcGF0aD0ibmVrby5oeG1sIiAvPgorICAgIDxoaWRkZW4gcGF0aD0icGhwLmh4bWwiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJwcm9qZWN0LmhpZGUiIC8+CisgICAgPGhpZGRlbiBwYXRoPSJweXRob24uaHhtbCIgLz4KKyAgPC9oaWRkZW5QYXRocz4KKyAgPCEtLSBFeGVjdXRlZCBiZWZvcmUgYnVpbGQgLS0+CisgIDxwcmVCdWlsZENvbW1hbmQ+dGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi4vLi4vLi4vY29udHJpYi9hc3luYy10ZXN0L2FnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9saWIvcmIvYmVuY2htYXJrL0JlbmNobWFyay50aHJpZnQ8L3ByZUJ1aWxkQ29tbWFuZD4KKyAgPCEtLSBFeGVjdXRlZCBhZnRlciBidWlsZCAtLT4KKyAgPHBvc3RCdWlsZENvbW1hbmQgYWx3YXlzUnVuPSJGYWxzZSIgLz4KKyAgPCEtLSBPdGhlciBwcm9qZWN0IG9wdGlvbnMgLS0+CisgIDxvcHRpb25zPgorICAgIDxvcHRpb24gc2hvd0hpZGRlblBhdGhzPSJGYWxzZSIgLz4KKyAgICA8b3B0aW9uIHRlc3RNb3ZpZT0iQ3VzdG9tIiAvPgorICAgIDxvcHRpb24gdGVzdE1vdmllQ29tbWFuZD0iYmluL0hheGVUZXN0cy9NYWluLmV4ZSBzZXJ2ZXIgbXVsdGlwbGV4IiAvPgorICA8L29wdGlvbnM+CisgIDwhLS0gUGx1Z2luIHN0b3JhZ2UgLS0+CisgIDxzdG9yYWdlIC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4YjI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCitUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitBR0dSID0gJCh0b3Bfc3JjZGlyKS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKK0JFTkNITUFSSyA9ICQodG9wX3NyY2RpcikvbGliL3JiL2JlbmNobWFyay9CZW5jaG1hcmsudGhyaWZ0CisKK0JJTl9DUFAgPSBiaW4vTWFpbi1kZWJ1ZworQklOX1BIUCA9IGJpbi9waHAvTWFpbi1kZWJ1Zy5waHAKKworZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeDogJChUSFJJRlRURVNUKQorCSQoVEhSSUZUQ01EKSAkKFRIUklGVFRFU1QpCisKK2dlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHg6ICQoQUdHUikKKwkkKFRIUklGVENNRCkgJChBR0dSKQorCitnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4OiAkKEJFTkNITUFSSykKKwkkKFRIUklGVENNRCkgJChCRU5DSE1BUkspCisKK2FsbC1sb2NhbDogJChCSU5fQ1BQKSAkKEJJTl9QSFApCisKKyQoQklOX0NQUCk6IFwKKwkJc3JjLyouaHggXAorCQkuLi9zcmMvb3JnL2FwYWNoZS90aHJpZnQvKiovKi5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L1RocmlmdFRlc3QuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9BZ2dyLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvQmVuY2htYXJrU2VydmljZS5oeAorCSQoSEFYRSkgLS1jd2QgLiAgY3BwLmh4bWwKKworJChCSU5fUEhQKTogXAorCQlzcmMvKi5oeCBcCisJCS4uL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdGhyaWZ0L3Rlc3QvVGhyaWZ0VGVzdC5oeCBcCisJCWdlbi1oYXhlL3RocmlmdC90ZXN0L0FnZ3IuaHggXAorCQlnZW4taGF4ZS90aHJpZnQvdGVzdC9CZW5jaG1hcmtTZXJ2aWNlLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCisKKyNUT0RPOiBvdGhlciBoYXhlIHRhcmdldHMKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgY3NoYXJwCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGZsYXNoCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIGphdmEKKyMgICAgJChIQVhFKSAgLS1jd2QgLiAgamF2YXNjcmlwdAorIyAgICAkKEhBWEUpICAtLWN3ZCAuICBuZWtvCisjICAgICQoSEFYRSkgIC0tY3dkIC4gIHB5dGhvbiAgIyBuZWVkcyBIYXhlIDMuMi4wCisKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWhheGUgYmluCisKK2NoZWNrOiAkKEJJTl9DUFApICQoQklOX1BIUCkKKwkkKEJJTl9DUFApCisJcGhwIC1mICQoQklOX1BIUCkKKworRVhUUkFfRElTVCA9IFwKKyAgICAgICAgICAgICBzcmMgXAorICAgICAgICAgICAgIGNwcC5oeG1sIFwKKyAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCisgICAgICAgICAgICAgZmxhc2guaHhtbCBcCisgICAgICAgICAgICAgamF2YS5oeG1sIFwKKyAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAorICAgICAgICAgICAgIG5la28uaHhtbCBcCisgICAgICAgICAgICAgcGhwLmh4bWwgXAorICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKKyAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAorICAgICAgICAgICAgIEhheGVUZXN0cy5oeHByb2ogXAorICAgICAgICAgICAgIG1ha2VfYWxsLmJhdCBcCisgICAgICAgICAgICAgbWFrZV9hbGwuc2gKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvY3BwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODQ4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2NwcC5oeG1sCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNDUFAgdGFyZ2V0CistY3BwIGJpbgorCisjVG8gcHJvZHVjZSA2NCBiaXQgYmluYXJpZXMgdGhlIGZpbGUgc2hvdWxkIGRlZmluZSB0aGUgSFhDUFBfTTY0IGNvbXBpbGUgdmFyaWFibGU6CisjLUQgSFhDUFBfTTY0CisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2NzaGFycC5oeG1sIGIvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzM0YjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9jc2hhcnAuaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjQ1NIQVJQIHRhcmdldAorLWNzIGJpbi9UZXN0LmV4ZQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sIGIvbGliL2hheGUvdGVzdC9mbGFzaC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTc2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2ZsYXNoLmh4bWwKQEAgLTAsMCArMSwzOCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisgCisjaW50ZWdyYXRlIGZpbGVzIHRvIGNsYXNzcGF0aAorLWNwIHNyYworLWNwIC4uL3NyYworLWNwIGdlbi1oYXhlCisKKyN0aGlzIGNsYXNzIHdpbCBiZSB1c2VkIGFzIGVudHJ5IHBvaW50IGZvciB5b3VyIGFwcC4KKy1tYWluIE1haW4KKworI0ZsYXNoIHRhcmdldAorLXN3ZiBiaW4vVGVzdC5zd2YKKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sIGIvbGliL2hheGUvdGVzdC9qYXZhLmh4bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0NzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvamF2YS5oeG1sCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNKYXZhIHRhcmdldAorLWphdmEgYmluL1Rlc3QuamFyCisKKyNBZGQgZGVidWcgaW5mb3JtYXRpb24KKy1kZWJ1ZworCisjZGVhZCBjb2RlIGVsaW1pbmF0aW9uIDogcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugbm8iIDogZG8gbm90IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIHN0ZCIgOiByZW1vdmUgdW51c2VkIGNvZGUgaW4gdGhlIHN0ZCBsaWIgKGRlZmF1bHQpCisjIi1kY2UgZnVsbCIgOiByZW1vdmUgYWxsIHVudXNlZCBjb2RlCistZGNlIGZ1bGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbCBiL2xpYi9oYXhlL3Rlc3QvamF2YXNjcmlwdC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDk5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L2phdmFzY3JpcHQuaHhtbApAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjSmF2YVNjcmlwdCB0YXJnZXQKKy1qcyBiaW4vVGVzdC5qcworCisjWW91IGNhbiB1c2UgLUQgc291cmNlLW1hcC1jb250ZW50IChyZXF1aXJlcyBIYXhlIDMuMSspIHRvIGhhdmUgdGhlIC5oeCAKKyNmaWxlcyBkaXJlY3RseSBlbWJlZGRlZCBpbnRvIHRoZSBtYXAgZmlsZSwgdGhpcyB3YXkgeW91IG9ubHkgaGF2ZSB0byAKKyN1cGxvYWQgaXQsIGFuZCBpdCB3aWxsIGJlIGFsd2F5cyBpbiBzeW5jIHdpdGggdGhlIGNvbXBpbGVkIC5qcyBldmVuIGlmIAorI3lvdSBtb2RpZnkgeW91ciAuaHggZmlsZXMuCistRCBzb3VyY2UtbWFwLWNvbnRlbnQKKworI0dlbmVyYXRlIHNvdXJjZSBtYXAgYW5kIGFkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0IGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNGUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3QvbWFrZV9hbGwuYmF0CkBAIC0wLDAgKzEsNzAgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworCitzZXRsb2NhbAoraWYgIiVIT01FRFJJVkUlIj09IiIgZ290byBNSVNTSU5HVkFSUworaWYgIiVIT01FUEFUSCUiPT0iIiBnb3RvIE1JU1NJTkdWQVJTCitpZiAiJUhBWEVQQVRIJSI9PSIiIGdvdG8gTk9USU5TVEFMTEVECisKK3NldCBwYXRoPSVIQVhFUEFUSCU7JUhBWEVQQVRIJVwuLlxuZWtvOyVwYXRoJQorCityZW0gIyBpbnZva2UgVGhyaWZ0IGNvbW5waWxlcgordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cdGVzdFxUaHJpZnRUZXN0LnRocmlmdAordGhyaWZ0IC1yIC1nZW4gaGF4ZSAgLi5cLi5cLi5cY29udHJpYlxhc3luYy10ZXN0XGFnZ3IudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLlwuLlwuLlxsaWJccmJcYmVuY2htYXJrXEJlbmNobWFyay50aHJpZnQKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIFNUT1AKKworcmVtICMgaW52b2tlIEhheGUgY29tcGlsZXIgZm9yIGFsbCB0YXJnZXRzCitmb3IgJSVhIGluICgqLmh4bWwpIGRvICgKKwlyZW0gKiBmaWx0ZXIgUHl0aG9uLCBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IEhheGUgMy4xLjMgKGJ1dCB3aWxsIGJlIGluIDMuMS40KQorCWlmIG5vdCAiJSVhIj09InB5dGhvbi5oeG1sIiAoCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJZWNobyBCdWlsZGluZyAlJWEgLi4uCisJCWVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJaGF4ZSAgLS1jd2QgLiAgJSVhCisJKQorKQorCisKK2VjaG8uCitlY2hvIGRvbmUuCitwYXVzZQorZ290byBlb2YKKworOk5PVElOU1RBTExFRAorZWNobyBGQVRBTDogRWl0aGVyIEhheGUgaXMgbm90IGluc3RhbGxlZCwgb3IgdGhlIEhBWEVQQVRIIHZhcmlhYmxlIGlzIG5vdCBzZXQuCitwYXVzZQorZ290byBlb2YKKworOk1JU1NJTkdWQVJTCitlY2hvIEZBVEFMOiBVbmFibGUgdG8gbG9jYXRlIGhvbWUgZm9sZGVyLgorZWNoby4KK2VjaG8gQm90aCBIT01FRFJJVkUgYW5kIEhPTUVQQVRIIG5lZWQgdG8gYmUgc2V0IHRvIHBvaW50IHRvIHlvdXIgSG9tZSBmb2xkZXIuCitlY2hvIFRoZSBjdXJyZW50IHZhbHVlcyBhcmU6CitlY2hvIEhPTUVEUklWRT0lSE9NRURSSVZFJQorZWNobyBIT01FUEFUSD0lSE9NRVBBVEglCitwYXVzZQorZ290byBlb2YKKworOlNUT1AKK3BhdXNlCitnb3RvIGVvZgorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L21ha2VfYWxsLnNoIGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJmNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9tYWtlX2FsbC5zaApAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Cit0aHJpZnQgLXIgLWdlbiBoYXhlICAuLi8uLi8uLi9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKK3RocmlmdCAtciAtZ2VuIGhheGUgIC4uLy4uLy4uL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorCisjIG91dHB1dCBmb2xkZXIKK2lmIFsgISAtZCBiaW4gXTsgdGhlbgorICBta2RpciAgYmluCitmaQorCisjIGludm9rZSBIYXhlIGNvbXBpbGVyCitmb3IgdGFyZ2V0IGluICouaHhtbDsgZG8gCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgZWNobyBCdWlsZGluZyAke3RhcmdldH0gLi4uCisgIGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgaWYgWyAhIC1kIGJpbi8ke3RhcmdldH0gXTsgdGhlbgorICAgIG1rZGlyICBiaW4vJHt0YXJnZXR9CisgIGZpCisgIGhheGUgIC0tY3dkIC4gICR7dGFyZ2V0fSAKK2RvbmUKKworCisjZW9mCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L25la28uaHhtbCBiL2xpYi9oYXhlL3Rlc3QvbmVrby5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjcwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L25la28uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjbmVrbyB0YXJnZXQKKy1uZWtvIGJpbi9UZXN0Lm4KKworI0FkZCBkZWJ1ZyBpbmZvcm1hdGlvbgorLWRlYnVnCisKKyNkZWFkIGNvZGUgZWxpbWluYXRpb24gOiByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBubyIgOiBkbyBub3QgcmVtb3ZlIHVudXNlZCBjb2RlCisjIi1kY2Ugc3RkIiA6IHJlbW92ZSB1bnVzZWQgY29kZSBpbiB0aGUgc3RkIGxpYiAoZGVmYXVsdCkKKyMiLWRjZSBmdWxsIiA6IHJlbW92ZSBhbGwgdW51c2VkIGNvZGUKKy1kY2UgZnVsbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvcGhwLmh4bWwgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZjJiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3BocC5oeG1sCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworIAorI2ludGVncmF0ZSBmaWxlcyB0byBjbGFzc3BhdGgKKy1jcCBzcmMKKy1jcCAuLi9zcmMKKy1jcCBnZW4taGF4ZQorCisjdGhpcyBjbGFzcyB3aWwgYmUgdXNlZCBhcyBlbnRyeSBwb2ludCBmb3IgeW91ciBhcHAuCistbWFpbiBNYWluCisKKyNQSFAgdGFyZ2V0CistcGhwIGJpbi9waHAvCistLXBocC1mcm9udCBNYWluLWRlYnVnLnBocAorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZSBiL2xpYi9oYXhlL3Rlc3QvcHJvamVjdC5oaWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWY5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3Byb2plY3QuaGlkZQpAQCAtMCwwICsxLDY3IEBACit7CisgICAgICJ0eXBlIiA6IDAKKyAgICAsInRhcmdldCIgOiA0CisgICAgLCJuYW1lIiA6ICJUZXN0IgorICAgICwibWFpbiIgOiBudWxsCisgICAgLCJwcm9qZWN0UGFja2FnZSIgOiAiIgorICAgICwiY29tcGFueSIgOiAiIgorICAgICwibGljZW5zZSIgOiAiIgorICAgICwidXJsIiA6ICIiCisgICAgLCJ0YXJnZXREYXRhIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAiZmxhc2guaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAxCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogImJpbi9UZXN0LnN3ZiIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJqYXZhc2NyaXB0Lmh4bWwiCisgICAgICAgICAgICAsInJ1bkFjdGlvblR5cGUiIDogMQorICAgICAgICAgICAgLCJydW5BY3Rpb25UZXh0IiA6ICJiaW5cXGluZGV4Lmh0bWwiCisgICAgICAgIH0KKyAgICAgICAgLHsKKyAgICAgICAgICAgICAicGF0aFRvSHhtbCIgOiAibmVrby5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAibmVrbyBiaW4vVGVzdC5uIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogInBocC5oeG1sIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImNwcC5oeG1sIgorICAgICAgICAgICAgLCJydW5BY3Rpb25UeXBlIiA6IDIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVGV4dCIgOiAiYmluL01haW4tZGVidWcuZXhlIgorICAgICAgICB9CisgICAgICAgICx7CisgICAgICAgICAgICAgInBhdGhUb0h4bWwiIDogImphdmEuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJjc2hhcnAuaHhtbCIKKyAgICAgICAgfQorICAgICAgICAseworICAgICAgICAgICAgICJwYXRoVG9IeG1sIiA6ICJweXRob24uaHhtbCIKKyAgICAgICAgICAgICwicnVuQWN0aW9uVHlwZSIgOiAyCisgICAgICAgICAgICAsInJ1bkFjdGlvblRleHQiIDogInB5dGhvbiBiaW4vVGVzdC5weSIKKyAgICAgICAgfQorICAgIF0KKyAgICAsImZpbGVzIiA6IFsKKyAgICAgICAgIHsKKyAgICAgICAgICAgICAicGF0aCIgOiAic3JjXFxNYWluLmh4IgorICAgICAgICAgICAgLCJ1c2VUYWJzIiA6IHRydWUKKyAgICAgICAgICAgICwiaW5kZW50U2l6ZSIgOiA0CisgICAgICAgICAgICAsImZvbGRlZFJlZ2lvbnMiIDogWworCisgICAgICAgICAgICBdCisgICAgICAgICAgICAsImFjdGl2ZUxpbmUiIDogMTMKKyAgICAgICAgfQorICAgIF0KKyAgICAsImFjdGl2ZUZpbGUiIDogInNyY1xcTWFpbi5oeCIKKyAgICAsIm9wZW5GTFRhcmdldCIgOiBudWxsCisgICAgLCJvcGVuRkxCdWlsZE1vZGUiIDogIkRlYnVnIgorICAgICwicnVuQWN0aW9uVHlwZSIgOiBudWxsCisgICAgLCJydW5BY3Rpb25UZXh0IiA6IG51bGwKKyAgICAsImJ1aWxkQWN0aW9uQ29tbWFuZCIgOiBudWxsCisgICAgLCJoaWRkZW5JdGVtcyIgOiBbCisKKyAgICBdCisgICAgLCJzaG93SGlkZGVuSXRlbXMiIDogZmFsc2UKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3B5dGhvbi5oeG1sIGIvbGliL2hheGUvdGVzdC9weXRob24uaHhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZhMTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hheGUvdGVzdC9weXRob24uaHhtbApAQCAtMCwwICsxLDM4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyAKKyNpbnRlZ3JhdGUgZmlsZXMgdG8gY2xhc3NwYXRoCistY3Agc3JjCistY3AgLi4vc3JjCistY3AgZ2VuLWhheGUKKworI3RoaXMgY2xhc3Mgd2lsIGJlIHVzZWQgYXMgZW50cnkgcG9pbnQgZm9yIHlvdXIgYXBwLgorLW1haW4gTWFpbgorCisjUHl0aG9uIHRhcmdldAorLXB5dGhvbiBiaW4vVGVzdC5weQorCisjQWRkIGRlYnVnIGluZm9ybWF0aW9uCistZGVidWcKKworI2RlYWQgY29kZSBlbGltaW5hdGlvbiA6IHJlbW92ZSB1bnVzZWQgY29kZQorIyItZGNlIG5vIiA6IGRvIG5vdCByZW1vdmUgdW51c2VkIGNvZGUKKyMiLWRjZSBzdGQiIDogcmVtb3ZlIHVudXNlZCBjb2RlIGluIHRoZSBzdGQgbGliIChkZWZhdWx0KQorIyItZGNlIGZ1bGwiIDogcmVtb3ZlIGFsbCB1bnVzZWQgY29kZQorLWRjZSBmdWxsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvTWFpbi5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyNjJkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL01haW4uaHgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS4qOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuKjsgIC8vIGdlbmVyYXRlZCBjb2RlCisKKworZW51bSBXaGF0VGVzdHMgeworICAgIE5vcm1hbDsKKyAgICBNdWx0aXBsZXg7Cit9CisKK2NsYXNzIE1haW4KK3sKKyAgICBzdGF0aWMgcHJpdmF0ZSB2YXIgdGVzdHMgOiBXaGF0VGVzdHMgPSBOb3JtYWw7CisgICAgc3RhdGljIHByaXZhdGUgdmFyIHNlcnZlciA6IEJvb2wgPSBmYWxzZTsKKworICAgIHN0YXRpYyBwcml2YXRlIGlubGluZSB2YXIgQ01ETElORUhFTFAgOiBTdHJpbmcKKyAgICAgICAgPSAiXG5IYXhlVGVzdHMgIFtjbGllbnR8c2VydmVyXSAgW211bHRpcGxleF1cbiIKKyAgICAgICAgKyAiICBjbGllbnR8c2VydmVyICAuLi4gZGV0ZXJtaW5lcyBydW4gbW9kZSBmb3Igc29tZSB0ZXN0cywgZGVmYXVsdCBpcyBjbGllbnRcbiIKKyAgICAgICAgKyAiICBtdWx0aXBsZXggLi4uLi4uLi4gcnVuIG11bHRpcGxleCB0ZXN0IHNlcnZlciBvciBjbGllbnRcbiI7CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBmdW5jdGlvbiBQYXJzZUFyZ3MoKSB7CisgICAgICAgICNpZiBzeXMKKworICAgICAgICB2YXIgYXJncyA9IFN5cy5hcmdzKCk7CisgICAgICAgIGlmICggYXJncyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKCBhcmcgaW4gYXJncykgeworICAgICAgICAgICAgICAgIHN3aXRjaChhcmcudG9Mb3dlckNhc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJjbGllbnQiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciIgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibXVsdGlwbGV4IiA6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IE11bHRpcGxleDsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAnSW52YWxpZCBhcmd1bWVudCAiJGFyZyJcbicrQ01ETElORUhFTFA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI2VuZAorICAgIH0KKworICAgIHN0YXRpYyBwdWJsaWMgZnVuY3Rpb24gbWFpbigpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUGFyc2VBcmdzKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggdGVzdHMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vcm1hbDoKKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtVGVzdC5SdW4oc2VydmVyKTsKKyAgICAgICAgICAgICAgICBjYXNlIE11bHRpcGxleDoKKyAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGV4VGVzdC5SdW4oc2VydmVyKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyAiVW5oYW5kbGVkIHRlc3QgbW9kZSAkdGVzdHMiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmFjZSgiQWxsIHRlc3RzIGNvbXBsZXRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZTogRHluYW1pYykKKyAgICAgICAgeworICAgICAgICAgICAgdHJhY2UoJyRlJyk7CisgICAgICAgICAgICAjaWYgc3lzCisgICAgICAgICAgICBTeXMuZXhpdCgxKTsgIC8vIGluZGljYXRlIGVycm9yCisgICAgICAgICAgICAjZW5kCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvTXVsdGlwbGV4VGVzdC5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxOGI2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL011bHRpcGxleFRlc3QuaHgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZTsKKworaW1wb3J0IGhheGUuSW50NjQ7CitpbXBvcnQgaGF4ZS5JbnQzMjsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworLy8gZGVidWcgb25seQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbERlY29yYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKKy8vIGdlbmVyYXRlZCBjb2RlIGltcG9ydHMKK2ltcG9ydCBBZ2dyOworaW1wb3J0IEFnZ3JJbXBsOworaW1wb3J0IEFnZ3JQcm9jZXNzb3I7CitpbXBvcnQgQmVuY2htYXJrU2VydmljZTsKK2ltcG9ydCBCZW5jaG1hcmtTZXJ2aWNlSW1wbDsKK2ltcG9ydCBCZW5jaG1hcmtTZXJ2aWNlUHJvY2Vzc29yOworaW1wb3J0IEVycm9yOworCisKK2NsYXNzIEJlbmNobWFya1NlcnZpY2VIYW5kbGVyIGltcGxlbWVudHMgQmVuY2htYXJrU2VydmljZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBuZXcoKSB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGZpYm9uYWNjaShuIDogaGF4ZS5JbnQzMikgOiBoYXhlLkludDMyIHsKKyAgICAgICAgdHJhY2UoJ0JlbmNobWFyay5maWJvbmFjY2koJG4pJyk7CisgICAgICAgIHZhciBuZXh0IDogSW50OworICAgICAgICB2YXIgcHJldiAgID0gMDsKKyAgICAgICAgdmFyIHJlc3VsdCA9IDE7CisgICAgICAgIHdoaWxlKCBuID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dCAgID0gcmVzdWx0ICsgcHJldjsKKyAgICAgICAgICAgIHByZXYgICA9IHJlc3VsdDsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5leHQ7CisgICAgICAgICAgICAtLW47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKKworY2xhc3MgQWdnclNlcnZpY2VIYW5kbGVyIGltcGxlbWVudHMgQWdncgoreworICAgIHByaXZhdGUgdmFyIHZhbHVlcyA6IExpc3Q8aGF4ZS5JbnQzMj4gPSBuZXcgTGlzdDxoYXhlLkludDMyPigpOworCisgICAgcHVibGljIGZ1bmN0aW9uIG5ldygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkVmFsdWUodmFsdWUgOiBoYXhlLkludDMyKSA6IFZvaWQgICAgeworICAgICAgICB0cmFjZSgnQWdnci5hZGRWYWx1ZSgkdmFsdWUpJyk7CisgICAgICAgIHZhbHVlcy5hZGQoIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkgOiBMaXN0PCBoYXhlLkludDMyPiB7CisgICAgICAgIHRyYWNlKCdBZ2dyLmdldFZhbHVlcygpJyk7CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorfQorCisKKworY2xhc3MgTXVsdGlwbGV4VGVzdCBleHRlbmRzIFRlc3RCYXNlIHsKKworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgTkFNRV9CRU5DSE1BUktTRVJWSUNFIDogU3RyaW5nID0gIkJlbmNobWFya1NlcnZpY2UiOworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgTkFNRV9BR0dSICAgICAgICAgICAgIDogU3RyaW5nICA9ICJBZ2dyIjsKKworCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW4oc2VydmVyIDogQm9vbCkgOiBWb2lkIHsKKyAgICAgICAgaWYgKCBzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJ1bk11bHRpcGxleFNlcnZlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUnVuTXVsdGlwbGV4Q2xpZW50KCk7CisgICAgICAgICAgICBSdW5EZWZhdWx0Q2xpZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHJ1biB0aGUgbXVsdGlwbGV4IHNlcnZlcgorICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgZnVuY3Rpb24gUnVuTXVsdGlwbGV4U2VydmVyKCkgOiBWb2lkICB7CisgICAgICAgdHJ5CisgICAgICAgeworICAgICAgICAgICAgdmFyIGJlbmNoSGFuZGxlciA6IEJlbmNobWFya1NlcnZpY2UgPSBuZXcgQmVuY2htYXJrU2VydmljZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBiZW5jaFByb2Nlc3NvciA6IFRQcm9jZXNzb3IgPSBuZXcgQmVuY2htYXJrU2VydmljZVByb2Nlc3NvciggYmVuY2hIYW5kbGVyKTsKKworICAgICAgICAgICAgdmFyIGFnZ3JIYW5kbGVyIDogQWdnciA9IG5ldyBBZ2dyU2VydmljZUhhbmRsZXIoKTsKKyAgICAgICAgICAgIHZhciBhZ2dyUHJvY2Vzc29yIDogVFByb2Nlc3NvciA9IG5ldyBBZ2dyUHJvY2Vzc29yKCBhZ2dySGFuZGxlcik7CisKKyAgICAgICAgICAgIHZhciBtdWx0aXBsZXggOiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICAgICAgICBtdWx0aXBsZXguUmVnaXN0ZXJQcm9jZXNzb3IoIE5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgYmVuY2hQcm9jZXNzb3IsIHRydWUpOyAgLy8gZGVmYXVsdAorICAgICAgICAgICAgbXVsdGlwbGV4LlJlZ2lzdGVyUHJvY2Vzc29yKCBOQU1FX0FHR1IsIGFnZ3JQcm9jZXNzb3IpOworCisgICAgICAgICAgICAvLyBwcm90b2NvbCt0cmFuc3BvcnQgc3RhY2sKKyAgICAgICAgICAgIHZhciBwcm90ZmFjdCA6IFRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSh0cnVlLHRydWUpOworICAgICAgICAgICAgdmFyIHNlcnZlcnRyYW5zIDogVFNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0KCA5MDkwLCA1LCBmYWxzZSk7CisgICAgICAgICAgICB2YXIgdHJhbnNmYWN0IDogVFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKTsKKworICAgICAgICAgICAgdmFyIHNlcnZlciA6IFRTZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlciggbXVsdGlwbGV4LCBzZXJ2ZXJ0cmFucywgdHJhbnNmYWN0LCBwcm90ZmFjdCk7CisKKyAgICAgICAgICAgIHRyYWNlKCJTdGFydGluZyB0aGUgc2VydmVyIC4uLiIpOworICAgICAgICAgICAgc2VydmVyLlNlcnZlKCk7CisgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBydW4gbXVsdGlwbGV4IGNsaWVudCBhZ2FpbnN0IG11bHRpcGxleCBzZXJ2ZXIKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bk11bHRpcGxleENsaWVudCgpIDogVm9pZCAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICB0cmFucy5vcGVuKCk7CisKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA6IFRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsdHJ1ZSx0cnVlKTsKKyAgICAgICAgICAgIHZhciBtdWx0aXBsZXggOiBUTXVsdGlwbGV4ZWRQcm90b2NvbDsKKworICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBwcm90b2NvbCwgTkFNRV9CRU5DSE1BUktTRVJWSUNFKTsKKyAgICAgICAgICAgIHZhciBiZW5jaCA9IG5ldyBCZW5jaG1hcmtTZXJ2aWNlSW1wbCggbXVsdGlwbGV4KTsKKworICAgICAgICAgICAgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKCBwcm90b2NvbCwgTkFNRV9BR0dSKTsKKyAgICAgICAgICAgIHZhciBhZ2dyID0gbmV3IEFnZ3JJbXBsKCBtdWx0aXBsZXgpOworCisgICAgICAgICAgICB0cmFjZSgnY2FsbGluZyBhZ2dyLmFkZCggYmVuY2guZmlibygpKS4uLicpOworICAgICAgICAgICAgZm9yKCBpIGluIDEgLi4uIDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCckaScpOworICAgICAgICAgICAgICAgIGFnZ3IuYWRkVmFsdWUoIGJlbmNoLmZpYm9uYWNjaShpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYWNlKCdjYWxsaW5nIGFnZ3IgLi4uJyk7CisgICAgICAgICAgICB2YXIgaSA9IDE7CisgICAgICAgICAgICB2YXIgdmFsdWVzID0gYWdnci5nZXRWYWx1ZXMoKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCh2YWx1ZXMgIT0gbnVsbCwnYWdnci5nZXRWYWx1ZXMoKSA9PSBudWxsJyk7CisgICAgICAgICAgICBmb3IoIGsgaW4gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNlKCdmaWIoJGkpID0gJGsnKTsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCk7CisgICAgICAgICAgICB0cmFjZSgnZG9uZS4nKTsKKworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoZmFsc2UsJyR7ZS5lcnJvcklEfSAke2UuZXJyb3JNc2d9Jyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoZmFsc2UsJyRlJyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIHJ1biBub24tbXVsdGlwbGV4IGNsaWVudCBhZ2FpbnN0IG11bHRpcGxleCBzZXJ2ZXIgdG8gdGVzdCBkZWZhdWx0IGZhbGxiYWNrCisgICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBmdW5jdGlvbiBSdW5EZWZhdWx0Q2xpZW50KCkgOiBWb2lkICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnMgOiBUVHJhbnNwb3J0OworICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgOTA5MCk7CisgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgIHRyYW5zLm9wZW4oKTsKKworICAgICAgICAgICAgdmFyIHByb3RvY29sIDogVFByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyx0cnVlLHRydWUpOworCisgICAgICAgICAgICB2YXIgYmVuY2ggPSBuZXcgQmVuY2htYXJrU2VydmljZUltcGwoIHByb3RvY29sKTsKKworICAgICAgICAgICAgdHJhY2UoJ2NhbGxpbmcgYmVuY2ggKHZpYSBkZWZhdWx0KSAuLi4nKTsKKyAgICAgICAgICAgIGZvciggaSBpbiAxIC4uLiAxMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgayA9IGJlbmNoLmZpYm9uYWNjaShpKTsKKyAgICAgICAgICAgICAgICB0cmFjZSgnZmliKCRpKSA9ICRrJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyYW5zLmNsb3NlKCk7CisgICAgICAgICAgICB0cmFjZSgnZG9uZS4nKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCggZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCcke2UuZXJyb3JJRH0gJHtlLmVycm9yTXNnfScpOworICAgICAgICB9CisgICAgICAgIGNhdGNoKCBlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KGZhbHNlLCckZScpOworICAgICAgICB9CisgICAgfQorCit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL2hheGUvdGVzdC9zcmMvU3RyZWFtVGVzdC5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ0ZjFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1N0cmVhbVRlc3QuaHgKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlOworCitpbXBvcnQgaGF4ZS5JbnQ2NDsKK2ltcG9ydCBzeXMuRmlsZVN5c3RlbTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuKjsKKworaW1wb3J0IHRocmlmdC50ZXN0Lio7ICAvLyBnZW5lcmF0ZWQgY29kZQorCisKK2NsYXNzIFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKworICAgIHByaXZhdGUgaW5saW5lIHN0YXRpYyB2YXIgdG1wZmlsZSA6IFN0cmluZyA9ICJkYXRhLnRtcCI7CisKKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIE1ha2VUZXN0RGF0YSgpIDogWHRydWN0IHsKKyAgICAgICAgdmFyIGRhdGEgOiBYdHJ1Y3QgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGRhdGEuc3RyaW5nX3RoaW5nID0gIlN0cmVhbXRlc3QiOworICAgICAgICBkYXRhLmJ5dGVfdGhpbmcgPSAtMTI4OworICAgICAgICBkYXRhLmkzMl90aGluZyA9IDQ3MTE7CisgICAgICAgIGRhdGEuaTY0X3RoaW5nID0gSW50NjQubWFrZSgweDEyMzQ1Njc4LDB4OUFCQ0RFRjApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFdyaXRlRGF0YSgpIDogWHRydWN0CisgICAgeworICAgICAgICB2YXIgc3RyZWFtIDogVFN0cmVhbSA9IG5ldyBURmlsZVN0cmVhbSggdG1wZmlsZSwgQ3JlYXRlTmV3KTsKKyAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KCBudWxsLCBzdHJlYW0pOworICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisKKyAgICAgICAgdmFyIGRhdGEgPSBNYWtlVGVzdERhdGEoKTsKKyAgICAgICAgZGF0YS53cml0ZShwcm90KTsKKyAgICAgICAgdHJhbnMuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJlYWREYXRhKCkgOiBYdHJ1Y3QKKyAgICB7CisgICAgICAgIHZhciBzdHJlYW0gOiBUU3RyZWFtID0gbmV3IFRGaWxlU3RyZWFtKCB0bXBmaWxlLCBSZWFkKTsKKyAgICAgICAgdmFyIHRyYW5zIDogVFRyYW5zcG9ydCA9IG5ldyBUU3RyZWFtVHJhbnNwb3J0KCBzdHJlYW0sIG51bGwpOworICAgICAgICB2YXIgcHJvdCA9IG5ldyBUSlNPTlByb3RvY29sKCB0cmFucyk7CisKKyAgICAgICAgdmFyIGRhdGEgOiBYdHJ1Y3QgPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGRhdGEucmVhZChwcm90KTsKKyAgICAgICAgdHJhbnMuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIGZ1bmN0aW9uIFJ1bihzZXJ2ZXIgOiBCb29sKSA6IFZvaWQKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB2YXIgd3JpdHRlbiA9IFdyaXRlRGF0YSgpOworICAgICAgICAgICAgdmFyIHJlYWQgPSBSZWFkRGF0YSgpOworICAgICAgICAgICAgRmlsZVN5c3RlbS5kZWxldGVGaWxlKHRtcGZpbGUpOworCisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIHJlYWQuc3RyaW5nX3RoaW5nID09IHdyaXR0ZW4uc3RyaW5nX3RoaW5nLCAic3RyaW5nIGRhdGEiKTsKKyAgICAgICAgICAgIFRlc3RCYXNlLkV4cGVjdCggcmVhZC5ieXRlX3RoaW5nID09IHdyaXR0ZW4uYnl0ZV90aGluZywgImJ5dGUgZGF0YSIpOworICAgICAgICAgICAgVGVzdEJhc2UuRXhwZWN0KCByZWFkLmkzMl90aGluZyA9PSB3cml0dGVuLmkzMl90aGluZywgImkzMiBkYXRhIik7CisgICAgICAgICAgICBUZXN0QmFzZS5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHJlYWQuaTY0X3RoaW5nLCB3cml0dGVuLmk2NF90aGluZykgPT0gMCwgImk2NCBkYXRhIik7CisKKyAgICAgICAgfSBjYXRjaChlOkR5bmFtaWMpIHsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW0uZGVsZXRlRmlsZSh0bXBmaWxlKTsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeCBiL2xpYi9oYXhlL3Rlc3Qvc3JjL1Rlc3RCYXNlLmh4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMzI3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGF4ZS90ZXN0L3NyYy9UZXN0QmFzZS5oeApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC4qOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0Lio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLio7CisKKworY2xhc3MgVGVzdEJhc2UgeworCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBuZXcoKSB7CisgICAgICAgIC8vIG92ZXJyaWRlLCBpZiBuZWNlc3NhcnkKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIFJ1bihzZXJ2ZXIgOiBCb29sKSA6IFZvaWQgeworICAgICAgICAgIHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBFeHBlY3QoIGV4cHIgOiBCb29sLCBpbmZvIDogU3RyaW5nLCA/cG9zIDogaGF4ZS5Qb3NJbmZvcykgOiBWb2lkIHsKKyAgICAgICAgaWYoICEgZXhwcikgeworICAgICAgICAgICAgdGhyb3cgKCdUZXN0ICIkaW5mbyIgZmFpbGVkIGF0ICcrcG9zLm1ldGhvZE5hbWUrJyBpbiAnK3Bvcy5maWxlTmFtZSsnOicrcG9zLmxpbmVOdW1iZXIpOworICAgICAgICB9CisgICAgfQorCit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2hzL0NNYWtlTGlzdHMudHh0IGIvbGliL2hzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGEzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgUmVidWlsZCB3aGVuIGFueSBvZiB0aGVzZSBmaWxlcyBjaGFuZ2VzCitzZXQoaGFza2VsbF9zb3VyY2VzCisgICAgc3JjL1RocmlmdC5ocworICAgIHNyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisgICAgc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKKyAgICBzcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKKyAgICBzcmMvVGhyaWZ0L1NlcnZlci5ocworICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvRW1wdHkuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKKyAgICBzcmMvVGhyaWZ0L1RyYW5zcG9ydC9IdHRwQ2xpZW50LmhzCisgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSU9CdWZmZXIuaHMKKyAgICBzcmMvVGhyaWZ0L1R5cGVzLmhzCisgICAgdGhyaWZ0LmNhYmFsCispCisKK2lmKEJVSUxEX1RFU1RJTkcpCisgICAgbGlzdChBUFBFTkQgaGFza2VsbF9zb3J1Y2VzCisgICAgICAgIHRlc3QvU3BlYy5ocworICAgICAgICB0ZXN0L0JpbmFyeVNwZWMuaHMKKyAgICAgICAgdGVzdC9Db21wYWN0U3BlYy5ocworICAgICAgICB0ZXN0L0pTT05TcGVjLmhzCisgICAgKQorICAgIHNldChoc19lbmFibGVfdGVzdCAiLS1lbmFibGUtdGVzdHMiKQorZW5kaWYoKQorCitzZXQoaGFza2VsbF9hcnRpZmFjdHMgdGhyaWZ0X2NhYmFsLnN0YW1wKQorIyBBZGRpbmcgKi5oaSBmaWxlcyBzbyB0aGF0IGFueSBtaXNzaW5nIGZpbGUgdHJpZ2dlcnMgdGhlIGJ1aWxkCitmb3JlYWNoKFNSQyAke2hhc2tlbGxfc291cmNlc30pCisgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChFWCAke1NSQ30gRVhUKQorICAgIGlmKCR7RVh9IFNUUkVRVUFMICIuaHMiKQorICAgICAgICBmaWxlKFJFTEFUSVZFX1BBVEggUkVMICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7U1JDfSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChESVIgJHtSRUx9IERJUkVDVE9SWSkKKyAgICAgICAgZ2V0X2ZpbGVuYW1lX2NvbXBvbmVudChCQVNFICR7UkVMfSBOQU1FX1dFKQorICAgICAgICBsaXN0KEFQUEVORCBoYXNrZWxsX2FydGlmYWN0cyBkaXN0L2J1aWxkLyR7RElSfS8ke0JBU0V9LmhpKQorICAgIGVuZGlmKCkKK2VuZGZvcmVhY2goKQorCitpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJEZWJ1ZyIpCisgICAgc2V0KGhzX29wdGltaXplIC1PMCkKK2Vsc2VpZihDTUFLRV9CVUlMRF9UWVBFIFNUUkVRVUFMICJSZWxlYXNlIikKKyAgICBzZXQoaHNfb3B0aW1pemUgLU8xKQorZW5kaWYoKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7aGFza2VsbF9hcnRpZmFjdHN9CisgICAgQ09NTUFORCAke0NBQkFMfSB1cGRhdGUKKyAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBmaXJzdCB3aXRob3V0IC0tYnVpbGRkaXIsIG90aGVyd2lzZSBpdCBmYWlscy4KKyAgICBDT01NQU5EICR7Q0FCQUx9IGluc3RhbGwgLS1vbmx5LWRlcGVuZGVuY2llcyAke2hzX2VuYWJsZV90ZXN0fQorICAgIENPTU1BTkQgJHtDQUJBTH0gY29uZmlndXJlICR7aHNfb3B0aW1pemV9ICR7aHNfZW5hYmxlX3Rlc3R9IC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q0FCQUx9IGJ1aWxkIC0tYnVpbGRkaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2Rpc3QKKyAgICBDT01NQU5EICR7Q0FCQUx9IGluc3RhbGwgLS1idWlsZGRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZGlzdAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0X2NhYmFsLnN0YW1wCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgREVQRU5EUyAke2hhc2tlbGxfc291cmNlc30KKyAgICBDT01NRU5UICJCdWlsZGluZyBIYXNrZWxsIGxpYnJhcnkiKQorCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX2xpYnJhcnkgQUxMCisgICAgREVQRU5EUyAke2hhc2tlbGxfYXJ0aWZhY3RzfSkKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxDYWJhbENoZWNrCisgICAgICAgICAgICBDT01NQU5EICR7Q0FCQUx9IGNoZWNrCisgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCisgICAgYWRkX3Rlc3QoTkFNRSBIYXNrZWxsQ2FiYWxUZXN0CisgICAgICAgICAgICAjIENhYmFsIGZhaWxzIHRvIGZpbmQgYnVpbHQgZXhlY3V0YWJsZSB3aGVuIC0tYnVpbGRkaXIgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgIyBTbyB3ZSBpbnZva2UgdGhlIGV4ZWN1dGFibGUgZGlyZWN0bHkuCisgICAgICAgICAgICAjIENPTU1BTkQgJHtDQUJBTH0gdGVzdCAtLWJ1aWxkZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9kaXN0CisgICAgICAgICAgICAjIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICAgICAgICAgIENPTU1BTkQgZGlzdC9idWlsZC9zcGVjL3NwZWMpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvaHMvTWFrZWZpbGUuYW0gYi9saWIvaHMvTWFrZWZpbGUuYW0KaW5kZXggMzQ2NGE0Zi4uM2NkOGI1NyAxMDA2NDQKLS0tIGEvbGliL2hzL01ha2VmaWxlLmFtCisrKyBiL2xpYi9ocy9NYWtlZmlsZS5hbQpAQCAtMTgsMjYgKzE4LDMzIEBACiAjCiAKIEVYVFJBX0RJU1QgPSBcCi0gIExJQ0VOU0UgXAotICBSRUFETUUgXAotICBTZXR1cC5saHMgXAotICBUT0RPIFwKLSAgVGhyaWZ0LmNhYmFsIFwKLSAgc3JjCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJQ01ha2VMaXN0cy50eHQgXAorCUxJQ0VOU0UgXAorCVJFQURNRS5tZCBcCisJU2V0dXAubGhzIFwKKwlUT0RPIFwKKwl0aHJpZnQuY2FiYWwgXAorCXNyYyBcCisJdGVzdAogCiBhbGwtbG9jYWw6Ci0JJChSVU5IQVNLRUxMKSBTZXR1cC5saHMgY29uZmlndXJlICQoQ0FCQUxfQ09ORklHVVJFX0ZMQUdTKQotCSQoUlVOSEFTS0VMTCkgU2V0dXAubGhzIGJ1aWxkCisJJChDQUJBTCkgdXBkYXRlCisJJChDQUJBTCkgaW5zdGFsbAogCiBpbnN0YWxsLWV4ZWMtaG9vazoKLQkkKFJVTkhBU0tFTEwpIFNldHVwLmxocyBpbnN0YWxsCisJJChDQUJBTCkgaW5zdGFsbAogCiAjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBIYXNrZWxsIGlzIG5vdCBjb25maWd1cmVkLgogY2xlYW4tbG9jYWw6Ci0JJChSVU5IQVNLRUxMKSBTZXR1cC5saHMgY2xlYW4KKwkkKENBQkFMKSBjbGVhbgogCiBtYWludGFpbmVyLWNsZWFuLWxvY2FsOgotCSQoUlVOSEFTS0VMTCkgU2V0dXAubGhzIGNsZWFuCisJJChDQUJBTCkgY2xlYW4KIAogY2hlY2stbG9jYWw6CiAJJChDQUJBTCkgY2hlY2sKKwkkKENBQkFMKSBpbnN0YWxsIC0tb25seS1kZXBlbmRlbmNpZXMgLS1lbmFibGUtdGVzdHMKKwkkKENBQkFMKSBjb25maWd1cmUgLS1lbmFibGUtdGVzdHMKKwkkKENBQkFMKSBidWlsZAorCSQoQ0FCQUwpIHRlc3QKZGlmZiAtLWdpdCBhL2xpYi9ocy9SRUFETUUgYi9saWIvaHMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTUyNWJkLi4wMDAwMDAwCi0tLSBhL2xpYi9ocy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1IYXNrZWxsIFRocmlmdCBCaW5kaW5ncwotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Db21waWxlCi09PT09PT09Ci0KLVVzZSBDYWJhbCB0byBjb21waWxlIGFuZCBpbnN0YWxsOyAuL2NvbmZpZ3VyZSB1c2VzIENhYmFsIHVuZGVybmVhdGgsIGFuZCB0aGF0Ci1wYXRoIGlzIG5vdCB5ZXQgd2VsbCB0ZXN0ZWQuIFRocmlmdCdzIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBjb21waWxlCi13aXRoIHByZXR0eSBtdWNoIGFueSBHSEMgZXh0ZW5zaW9ucyBvciB3YXJuaW5ncyB5b3UgZW5hYmxlIChvciBkaXNhYmxlKS4KLVBsZWFzZSByZXBvcnQgdGhpcyBub3QgYmVpbmcgdGhlIGNhc2UgYXMgYSBidWcgb24KLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvQ3JlYXRlSXNzdWUhZGVmYXVsdC5qc3BhCi0KLUNoYW5jZXMgeW91J2xsIG5lZWQgdG8gbXVjayBhIGJpdCB3aXRoIENhYmFsIGZsYWdzIHRvIGluc3RhbGwgVGhyaWZ0OgotCi1DQUJBTF9DT05GSUdVUkVfRkxBR1M9Ii0tdXNlciIgLi9jb25maWd1cmUKLQotQmFzZSBUeXBlcwotPT09PT09PT09PQotCi1UaGUgbWFwcGluZyBmcm9tIFRocmlmdCB0eXBlcyB0byBIYXNrZWxsJ3MgaXM6Ci0KLSAqIGRvdWJsZSAtPiBEb3VibGUKLSAqIGJ5dGUgLT4gRGF0YS5Xb3JkLldvcmQ4Ci0gKiBpMTYgLT4gRGF0YS5JbnQuSW50MTYKLSAqIGkzMiAtPiBEYXRhLkludC5JbnQzMgotICogaTY0IC0+IERhdGEuSW50LkludDY0Ci0gKiBzdHJpbmcgLT4gVGV4dAotICogYmluYXJ5IC0+IERhdGEuQnl0ZVN0cmluZy5MYXp5Ci0gKiBib29sIC0+IEJvb2xlYW4KLQotRW51bXMKLT09PT09Ci0KLUJlY29tZSBIYXNrZWxsICdkYXRhJyB0eXBlcy4gVXNlIGZyb21FbnVtIHRvIGdldCBvdXQgdGhlIGludCB2YWx1ZS4KLQotTGlzdHMKLT09PT09Ci0KLUJlY29tZSBEYXRhLlZlY3Rvci5WZWN0b3IgZnJvbSB0aGUgdmVjdG9yIHBhY2thZ2UuCi0KLU1hcHMgYW5kIFNldHMKLT09PT09PT09PT09PT0KLQotQmVjb21lIERhdGEuSGFzaE1hcC5TdHJpY3QuTWFwIGFuZCBEYXRhLkhhc2hTZXQuU2V0IGZyb20gdGhlCi11bm9yZGVyZWQtY29udGFpbmVycyBwYWNrYWdlLgotCi1TdHJ1Y3RzCi09PT09PT09Ci0KLUJlY29tZSByZWNvcmRzLiBGaWVsZCBsYWJlbHMgYXJlIHVnbHksIG9mIHRoZSBmb3JtIGZfU1RSVUNUTkFNRV9GSUVMRE5BTUUuIEFsbAotZmllbGRzIGFyZSBNYXliZSB0eXBlcy4KLQotRXhjZXB0aW9ucwotPT09PT09PT09PQotCi1JZGVudGljYWwgdG8gc3RydWN0cy4gVXNlIHRoZW0gd2l0aCB0aHJvdyBhbmQgY2F0Y2ggZnJvbSBDb250cm9sLkV4Y2VwdGlvbi4KLQotQ2xpZW50Ci09PT09PT0KLQotSnVzdCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucy4gWW91IG1heSBoYXZlIHRvIGltcG9ydCBhIGJ1bmNoIG9mIGNsaWVudCBmaWxlcyB0bwotZGVhbCB3aXRoIGluaGVyaXRhbmNlLgotCi1JbnRlcmZhY2UKLT09PT09PT09PQotCi1Zb3Ugc2hvdWxkIG9ubHkgaGF2ZSB0byBpbXBvcnQgdGhlIGxhc3Qgb25lIGluIHRoZSBjaGFpbiBvZiBpbmhlcml0b3JzLiBUbyBtYWtlCi1hbiBpbnRlcmZhY2UsIGRlY2xhcmUgYSBsYWJlbDoKLQotICBkYXRhIE15SWZhY2UgPSBNeUlmYWNlCi0KLWFuZCB0aGVuIGRlY2xhcmUgaXQgYW4gaW5zdGFuY2Ugb2YgZWFjaCBpZmFjZSBjbGFzcywgc3RhcnRpbmcgd2l0aCB0aGUgc3VwZXJlc3QKLWNsYXNzIGFuZCBwcm9jZWRpbmcgZG93biAoYWxsIHRoZSB3aGlsZSBkZWZpbmluZyB0aGUgbWV0aG9kcykuICBUaGVuIHBhc3MgeW91cgotbGFiZWwgdG8gcHJvY2VzcyBhcyB0aGUgaGFuZGxlci4KLQotUHJvY2Vzc29yCi09PT09PT09PT0KLQotSnVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBoYW5kbGVyIGxhYmVsLCBwcm90b2NvbHMuIEl0IGNhbGxzIHRoZQotc3VwZXJjbGFzc2VzIHByb2Nlc3MgaWYgdGhlcmUgaXMgYSBzdXBlcmNsYXNzLgpkaWZmIC0tZ2l0IGEvbGliL2hzL1JFQURNRS5tZCBiL2xpYi9ocy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMGE3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9SRUFETUUubWQKQEAgLTAsMCArMSw5OSBAQAorSGFza2VsbCBUaHJpZnQgQmluZGluZ3MKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworQ29tcGlsZQorPT09PT09PQorCitVc2UgQ2FiYWwgdG8gY29tcGlsZSBhbmQgaW5zdGFsbDsgLi9jb25maWd1cmUgdXNlcyBDYWJhbCB1bmRlcm5lYXRoLCBhbmQgdGhhdAorcGF0aCBpcyBub3QgeWV0IHdlbGwgdGVzdGVkLiBUaHJpZnQncyBsaWJyYXJ5IGFuZCBnZW5lcmF0ZWQgY29kZSBzaG91bGQgY29tcGlsZQord2l0aCBwcmV0dHkgbXVjaCBhbnkgR0hDIGV4dGVuc2lvbnMgb3Igd2FybmluZ3MgeW91IGVuYWJsZSAob3IgZGlzYWJsZSkuCitQbGVhc2UgcmVwb3J0IHRoaXMgbm90IGJlaW5nIHRoZSBjYXNlIGFzIGEgYnVnIG9uCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvc2VjdXJlL0NyZWF0ZUlzc3VlIWRlZmF1bHQuanNwYQorCitDaGFuY2VzIHlvdSdsbCBuZWVkIHRvIG11Y2sgYSBiaXQgd2l0aCBDYWJhbCBmbGFncyB0byBpbnN0YWxsIFRocmlmdDoKKworQ0FCQUxfQ09ORklHVVJFX0ZMQUdTPSItLXVzZXIiIC4vY29uZmlndXJlCisKK0Jhc2UgVHlwZXMKKz09PT09PT09PT0KKworVGhlIG1hcHBpbmcgZnJvbSBUaHJpZnQgdHlwZXMgdG8gSGFza2VsbCdzIGlzOgorCisgKiBkb3VibGUgLT4gRG91YmxlCisgKiBieXRlIC0+IERhdGEuSW50LkludDgKKyAqIGkxNiAtPiBEYXRhLkludC5JbnQxNgorICogaTMyIC0+IERhdGEuSW50LkludDMyCisgKiBpNjQgLT4gRGF0YS5JbnQuSW50NjQKKyAqIHN0cmluZyAtPiBUZXh0CisgKiBiaW5hcnkgLT4gRGF0YS5CeXRlU3RyaW5nLkxhenkKKyAqIGJvb2wgLT4gQm9vbGVhbgorCitFbnVtcworPT09PT0KKworQmVjb21lIEhhc2tlbGwgJ2RhdGEnIHR5cGVzLiBVc2UgZnJvbUVudW0gdG8gZ2V0IG91dCB0aGUgaW50IHZhbHVlLgorCitMaXN0cworPT09PT0KKworQmVjb21lIERhdGEuVmVjdG9yLlZlY3RvciBmcm9tIHRoZSB2ZWN0b3IgcGFja2FnZS4KKworTWFwcyBhbmQgU2V0cworPT09PT09PT09PT09PQorCitCZWNvbWUgRGF0YS5IYXNoTWFwLlN0cmljdC5NYXAgYW5kIERhdGEuSGFzaFNldC5TZXQgZnJvbSB0aGUKK3Vub3JkZXJlZC1jb250YWluZXJzIHBhY2thZ2UuCisKK1N0cnVjdHMKKz09PT09PT0KKworQmVjb21lIHJlY29yZHMuIEZpZWxkIGxhYmVscyBhcmUgdWdseSwgb2YgdGhlIGZvcm0gZl9TVFJVQ1ROQU1FX0ZJRUxETkFNRS4gQWxsCitmaWVsZHMgYXJlIE1heWJlIHR5cGVzLgorCitFeGNlcHRpb25zCis9PT09PT09PT09CisKK0lkZW50aWNhbCB0byBzdHJ1Y3RzLiBVc2UgdGhlbSB3aXRoIHRocm93IGFuZCBjYXRjaCBmcm9tIENvbnRyb2wuRXhjZXB0aW9uLgorCitDbGllbnQKKz09PT09PQorCitKdXN0IGEgYnVuY2ggb2YgZnVuY3Rpb25zLiBZb3UgbWF5IGhhdmUgdG8gaW1wb3J0IGEgYnVuY2ggb2YgY2xpZW50IGZpbGVzIHRvCitkZWFsIHdpdGggaW5oZXJpdGFuY2UuCisKK0ludGVyZmFjZQorPT09PT09PT09CisKK1lvdSBzaG91bGQgb25seSBoYXZlIHRvIGltcG9ydCB0aGUgbGFzdCBvbmUgaW4gdGhlIGNoYWluIG9mIGluaGVyaXRvcnMuIFRvIG1ha2UKK2FuIGludGVyZmFjZSwgZGVjbGFyZSBhIGxhYmVsOgorCisgIGRhdGEgTXlJZmFjZSA9IE15SWZhY2UKKworYW5kIHRoZW4gZGVjbGFyZSBpdCBhbiBpbnN0YW5jZSBvZiBlYWNoIGlmYWNlIGNsYXNzLCBzdGFydGluZyB3aXRoIHRoZSBzdXBlcmVzdAorY2xhc3MgYW5kIHByb2NlZWRpbmcgZG93biAoYWxsIHRoZSB3aGlsZSBkZWZpbmluZyB0aGUgbWV0aG9kcykuICBUaGVuIHBhc3MgeW91cgorbGFiZWwgdG8gcHJvY2VzcyBhcyB0aGUgaGFuZGxlci4KKworUHJvY2Vzc29yCis9PT09PT09PT0KKworSnVzdCBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBoYW5kbGVyIGxhYmVsLCBwcm90b2NvbHMuIEl0IGNhbGxzIHRoZQorc3VwZXJjbGFzc2VzIHByb2Nlc3MgaWYgdGhlcmUgaXMgYSBzdXBlcmNsYXNzLgpkaWZmIC0tZ2l0IGEvbGliL2hzL1NldHVwLmxocyBiL2xpYi9ocy9TZXR1cC5saHMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvbGliL2hzL1RocmlmdC5jYWJhbCBiL2xpYi9ocy9UaHJpZnQuY2FiYWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTkyZTEuLjAwMDAwMDAKLS0tIGEvbGliL2hzL1RocmlmdC5jYWJhbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS0tCi0tLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0tLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLS0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0tLQotLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS0tCi0tLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0tLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0tLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotLS0gdW5kZXIgdGhlIExpY2Vuc2UuCi0tLQotCi1OYW1lOiAgICAgICAgICAgdGhyaWZ0Ci1WZXJzaW9uOiAgICAgICAgMC45LjAKLUNhYmFsLVZlcnNpb246ICA+PSAxLjQKLUxpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKLUNhdGVnb3J5OiAgICAgICBGb3JlaWduCi1CdWlsZC1UeXBlOiAgICAgU2ltcGxlCi1TeW5vcHNpczogICAgICAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQotSG9tZXBhZ2U6ICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwotQnVnLVJlcG9ydHM6ICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUCi1NYWludGFpbmVyOiAgICAgZGV2QHRocmlmdC5hcGFjaGUub3JnCi1MaWNlbnNlLUZpbGU6ICAgTElDRU5TRQotCi1EZXNjcmlwdGlvbjoKLSAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgotCi1MaWJyYXJ5Ci0gIEhzLVNvdXJjZS1EaXJzOgotICAgIHNyYwotICBCdWlsZC1EZXBlbmRzOgotICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIG5ldHdvcmssIGdoYy1wcmltLCBiaW5hcnksIGJ5dGVzdHJpbmcsIGhhc2hhYmxlLCBIVFRQLCB0ZXh0LCB1bm9yZGVyZWQtY29udGFpbmVycywgdmVjdG9yCi0gIEV4cG9zZWQtTW9kdWxlczoKLSAgICBUaHJpZnQsCi0gICAgVGhyaWZ0LlByb3RvY29sLAotICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCi0gICAgVGhyaWZ0LlNlcnZlciwKLSAgICBUaHJpZnQuVHJhbnNwb3J0LAotICAgIFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkLAotICAgIFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlLAotICAgIFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudCwKLSAgICBUaHJpZnQuVHlwZXMKLSAgRXh0ZW5zaW9uczoKLSAgICBEZXJpdmVEYXRhVHlwZWFibGUsCi0gICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKLSAgICBGbGV4aWJsZUluc3RhbmNlcywKLSAgICBLaW5kU2lnbmF0dXJlcywKLSAgICBNYWdpY0hhc2gsCi0gICAgUmFua05UeXBlcywKLSAgICBTY29wZWRUeXBlVmFyaWFibGVzLAotICAgIFR5cGVTeW5vbnltSW5zdGFuY2VzCmRpZmYgLS1naXQgYS9saWIvaHMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ocy9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0LmhzIGIvbGliL2hzL3NyYy9UaHJpZnQuaHMKaW5kZXggNDJmNWQzMi4uNjU4MDIwOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQuaHMKQEAgLTEsNSArMSw0IEBACiB7LSMgTEFOR1VBR0UgRGVyaXZlRGF0YVR5cGVhYmxlICMtfQotey0jIExBTkdVQUdFIEtpbmRTaWduYXR1cmVzICMtfQogey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQogey0jIExBTkdVQUdFIFJhbmtOVHlwZXMgIy19CiAtLQpAQCAtMzEsMTUgKzMwLDE3IEBACiAgICAgLCBUaHJpZnRFeGNlcHRpb24oLi4pCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIHdoZW4gKQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCiAKLWltcG9ydCBEYXRhLlRleHQuTGF6eSAoIHBhY2ssIHVucGFjayApCitpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLlRleHQuTGF6eSAoIFRleHQsIHBhY2ssIHVucGFjayApCitpbXBvcnQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcKIGltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAogCi1pbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAogaW1wb3J0IFRocmlmdC5Qcm90b2NvbAotCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UeXBlcwogCiBkYXRhIFRocmlmdEV4Y2VwdGlvbiA9IFRocmlmdEV4Y2VwdGlvbgogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKQEAgLTU0LDYgKzU1LDkgQEAKICAgICB8IEFFX01JU1NJTkdfUkVTVUxUCiAgICAgfCBBRV9JTlRFUk5BTF9FUlJPUgogICAgIHwgQUVfUFJPVE9DT0xfRVJST1IKKyAgICB8IEFFX0lOVkFMSURfVFJBTlNGT1JNCisgICAgfCBBRV9JTlZBTElEX1BST1RPQ09MCisgICAgfCBBRV9VTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdywgVHlwZWFibGUgKQogCiBpbnN0YW5jZSBFbnVtIEFwcEV4blR5cGUgd2hlcmUKQEAgLTY1LDYgKzY5LDkgQEAKICAgICB0b0VudW0gNSA9IEFFX01JU1NJTkdfUkVTVUxUCiAgICAgdG9FbnVtIDYgPSBBRV9JTlRFUk5BTF9FUlJPUgogICAgIHRvRW51bSA3ID0gQUVfUFJPVE9DT0xfRVJST1IKKyAgICB0b0VudW0gOCA9IEFFX0lOVkFMSURfVFJBTlNGT1JNCisgICAgdG9FbnVtIDkgPSBBRV9JTlZBTElEX1BST1RPQ09MCisgICAgdG9FbnVtIDEwID0gQUVfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUKICAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgQXBwRXhuVHlwZSAiICsrIHNob3cgdAogCiAgICAgZnJvbUVudW0gQUVfVU5LTk9XTiA9IDAKQEAgLTc1LDUwICs4MiwzMyBAQAogICAgIGZyb21FbnVtIEFFX01JU1NJTkdfUkVTVUxUID0gNQogICAgIGZyb21FbnVtIEFFX0lOVEVSTkFMX0VSUk9SID0gNgogICAgIGZyb21FbnVtIEFFX1BST1RPQ09MX0VSUk9SID0gNworICAgIGZyb21FbnVtIEFFX0lOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIGZyb21FbnVtIEFFX0lOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgZnJvbUVudW0gQUVfVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCiBkYXRhIEFwcEV4biA9IEFwcEV4biB7IGFlX3R5cGUgOjogQXBwRXhuVHlwZSwgYWVfbWVzc2FnZSA6OiBTdHJpbmcgfQogICBkZXJpdmluZyAoIFNob3csIFR5cGVhYmxlICkKIGluc3RhbmNlIEV4Y2VwdGlvbiBBcHBFeG4KIAotd3JpdGVBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gQXBwRXhuIC0+IElPICgpCi13cml0ZUFwcEV4biBwdCBhZSA9IGRvCi0gICAgd3JpdGVTdHJ1Y3RCZWdpbiBwdCAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgord3JpdGVBcHBFeG4gOjogUHJvdG9jb2wgcCA9PiBwIC0+IEFwcEV4biAtPiBJTyAoKQord3JpdGVBcHBFeG4gcHQgYWUgPSB3cml0ZVZhbCBwdCAkIFRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QKKyAgICAgICAgICAgICAgICAgICAgWyAoMSwgKCJtZXNzYWdlIiwgVFN0cmluZyAkIGVuY29kZVV0ZjggJCBwYWNrICQgYWVfbWVzc2FnZSBhZSkpCisgICAgICAgICAgICAgICAgICAgICwgKDIsICgidHlwZSIsIFRJMzIgJCBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAoYWVfdHlwZSBhZSkpKQorICAgICAgICAgICAgICAgICAgICBdCiAKLSAgICB3aGVuIChhZV9tZXNzYWdlIGFlIC89ICIiKSAkIGRvCi0gICAgICAgIHdyaXRlRmllbGRCZWdpbiBwdCAoIm1lc3NhZ2UiLCBUX1NUUklORyAsIDEpCi0gICAgICAgIHdyaXRlU3RyaW5nIHB0IChwYWNrICQgYWVfbWVzc2FnZSBhZSkKLSAgICAgICAgd3JpdGVGaWVsZEVuZCBwdAotCi0gICAgd3JpdGVGaWVsZEJlZ2luIHB0ICgidHlwZSIsIFRfSTMyLCAyKTsKLSAgICB3cml0ZUkzMiBwdCAoZnJvbUludGVncmFsICQgZnJvbUVudW0gKGFlX3R5cGUgYWUpKQotICAgIHdyaXRlRmllbGRFbmQgcHQKLSAgICB3cml0ZUZpZWxkU3RvcCBwdAotICAgIHdyaXRlU3RydWN0RW5kIHB0Ci0KLXJlYWRBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gQXBwRXhuCityZWFkQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBJTyBBcHBFeG4KIHJlYWRBcHBFeG4gcHQgPSBkbwotICAgIF8gPC0gcmVhZFN0cnVjdEJlZ2luIHB0Ci0gICAgcmVjb3JkIDwtIHJlYWRBcHBFeG5GaWVsZHMgcHQgKEFwcEV4biB7YWVfdHlwZSA9IHVuZGVmaW5lZCwgYWVfbWVzc2FnZSA9IHVuZGVmaW5lZH0pCi0gICAgcmVhZFN0cnVjdEVuZCBwdAotICAgIHJldHVybiByZWNvcmQKKyAgICBsZXQgdHlwZW1hcCA9IE1hcC5mcm9tTGlzdCBbKDEsKCJtZXNzYWdlIixUX1NUUklORykpLCgyLCgidHlwZSIsVF9JMzIpKV0KKyAgICBUU3RydWN0IGZpZWxkcyA8LSByZWFkVmFsIHB0ICQgVF9TVFJVQ1QgdHlwZW1hcAorICAgIHJldHVybiAkIHJlYWRBcHBFeG5GaWVsZHMgZmllbGRzCiAKLXJlYWRBcHBFeG5GaWVsZHMgOjogZm9yYWxsIChhIDo6ICogLT4gKikgdC4gKFByb3RvY29sIGEsIFRyYW5zcG9ydCB0KSA9PiBhIHQgLT4gQXBwRXhuIC0+IElPIEFwcEV4biAKLXJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3JkID0gZG8KLSAgICAoXywgZnQsIHRhZykgPC0gcmVhZEZpZWxkQmVnaW4gcHQKLSAgICBpZiBmdCA9PSBUX1NUT1AKLSAgICAgICAgdGhlbiByZXR1cm4gcmVjb3JkCi0gICAgICAgIGVsc2UgY2FzZSB0YWcgb2YKLSAgICAgICAgICAgICAgICAgMSAtPiBpZiBmdCA9PSBUX1NUUklORyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHMgPC0gcmVhZFN0cmluZyBwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQXBwRXhuRmllbGRzIHB0IHJlY29yZHthZV9tZXNzYWdlID0gdW5wYWNrIHN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZG8gc2tpcCBwdCBmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3JkCi0gICAgICAgICAgICAgICAgIDIgLT4gaWYgZnQgPT0gVF9JMzIgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICBkbyBpIDwtIHJlYWRJMzIgcHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEFwcEV4bkZpZWxkcyBwdCByZWNvcmR7YWVfdHlwZSA9ICh0b0VudW0gJCBmcm9tSW50ZWdyYWwgaSl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZG8gc2tpcCBwdCBmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3JkCi0gICAgICAgICAgICAgICAgIF8gLT4gZG8gc2tpcCBwdCBmdAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRGaWVsZEVuZCBwdAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRBcHBFeG5GaWVsZHMgcHQgcmVjb3JkCi0KK3JlYWRBcHBFeG5GaWVsZHMgOjogTWFwLkhhc2hNYXAgSW50MTYgKFRleHQsIFRocmlmdFZhbCkgLT4gQXBwRXhuCityZWFkQXBwRXhuRmllbGRzIGZpZWxkcyA9IEFwcEV4bnsKKyAgYWVfbWVzc2FnZSA9IG1heWJlIHVuZGVmaW5lZCB1bndyYXBNZXNzYWdlICQgTWFwLmxvb2t1cCAxIGZpZWxkcywKKyAgYWVfdHlwZSAgICA9IG1heWJlIHVuZGVmaW5lZCB1bndyYXBUeXBlICQgTWFwLmxvb2t1cCAyIGZpZWxkcworICB9CisgIHdoZXJlCisgICAgdW53cmFwTWVzc2FnZSAoXywgVFN0cmluZyBzKSA9IHVucGFjayAkIGRlY29kZVV0ZjggcworICAgIHVud3JhcE1lc3NhZ2UgXyA9IHVuZGVmaW5lZAorICAgIHVud3JhcFR5cGUgKF8sIFRJMzIgaSkgPSB0b0VudW0gJCBmcm9tSW50ZWdyYWwgaQorICAgIHVud3JhcFR5cGUgXyA9IHVuZGVmaW5lZApkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9BcmJpdHJhcmllcy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWMwZmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvQXJiaXRyYXJpZXMuaHMKQEAgLTAsMCArMSw1NSBAQAorey0jIE9QVElPTlNfR0hDIC1mbm8td2Fybi1vcnBoYW5zICMtfQorCittb2R1bGUgVGhyaWZ0LkFyYml0cmFyaWVzIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJpdHMoKQorCitpbXBvcnQgVGVzdC5RdWlja0NoZWNrLkFyYml0cmFyeQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZSAoKDwkPikpCitpbXBvcnQgRGF0YS5NYXAgKE1hcCkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlZlY3RvciBhcyBWZWN0b3IKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgVGV4dAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgSFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIEhNYXAKK2ltcG9ydCBEYXRhLkhhc2hhYmxlIChIYXNoYWJsZSkKKworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5IChCeXRlU3RyaW5nKQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBCUworCistLSBTdHJpbmcgaGFzIGFuIEFyYml0cmFyeSBpbnN0YW5jZSBhbHJlYWR5CistLSBCb29sIGhhcyBhbiBBcmJpdHJhcnkgaW5zdGFuY2UgYWxyZWFkeQorLS0gQSBUaHJpZnQgJ2xpc3QnIGlzIGEgVmVjdG9yLgorCitpbnN0YW5jZSBBcmJpdHJhcnkgQnl0ZVN0cmluZyB3aGVyZQorICBhcmJpdHJhcnkgPSBCUy5wYWNrIC4gZmlsdGVyICgvPSAwKSA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIChBcmJpdHJhcnkgaykgPT4gQXJiaXRyYXJ5IChWZWN0b3IuVmVjdG9yIGspIHdoZXJlCisgIGFyYml0cmFyeSA9IFZlY3Rvci5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIEFyYml0cmFyeSBUZXh0LlRleHQgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gVGV4dC5wYWNrIC4gZmlsdGVyICgvPSAnXDAnKSA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIChFcSBrLCBIYXNoYWJsZSBrLCBBcmJpdHJhcnkgaykgPT4gQXJiaXRyYXJ5IChIU2V0Lkhhc2hTZXQgaykgd2hlcmUKKyAgYXJiaXRyYXJ5ID0gSFNldC5mcm9tTGlzdCA8JD4gYXJiaXRyYXJ5CisKK2luc3RhbmNlIChFcSBrLCBIYXNoYWJsZSBrLCBBcmJpdHJhcnkgaywgQXJiaXRyYXJ5IHYpID0+CisgICAgQXJiaXRyYXJ5IChITWFwLkhhc2hNYXAgayB2KSB3aGVyZQorICBhcmJpdHJhcnkgPSBITWFwLmZyb21MaXN0IDwkPiBhcmJpdHJhcnkKKworey0KKyAgIFRvIGhhbmRsZSBUaHJpZnQgJ2VudW0nIHdlIHdvdWxkIGlkZWFsbHkgdXNlIHNvbWV0aGluZyBsaWtlOgorCitpbnN0YW5jZSAoRW51bSBhLCBCb3VuZGVkIGEpID0+IEFyYml0cmFyeSBhCisgICAgd2hlcmUgYXJiaXRyYXJ5ID0gZWxlbWVudHMgKGVudW1Gcm9tVG8gbWluQm91bmQgbWF4Qm91bmQpCisKK1VuZm9ydHVuYXRlbHkgdGhpcyBkb2Vzbid0IHBsYXkgbmljZWx5IHdpdGggdGhlIHR5cGUgc3lzdGVtLgorSW5zdGVhZCB3ZSdsbCBnZW5lcmF0ZSBhbiBhcmJpdHJhcnkgaW5zdGFuY2UgYWxvbmcgd2l0aCB0aGUgY29kZS4KKy19CisKK3stCisgICAgVGhlcmUgbWlnaHQgYmUgc29tZSB3YXkgdG8gaW50cm9zcGVjdCBvbiB0aGUgSGFza2VsbCBzdHJ1Y3R1cmUgb2YgYQorICAgIFRocmlmdCAnc3RydWN0JyBvciAnZXhjZXB0aW9uJyBidXQgZ2VuZXJhdGluZyB0aGUgY29kZSBkaXJlY3RseSBpcyBzaW1wbGVyLgorLX0KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKaW5kZXggZjNiMzQyYS4uNjdhOTE3NSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wuaHMKQEAgLTEsNCArMSw2IEBACit7LSMgTEFOR1VBR0UgQ1BQICMtfQogey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX0KK3stIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KIC0tCiAtLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAtLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjAsMTY3ICsyMiw0NiBAQAogCiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCiAgICAgKCBQcm90b2NvbCguLikKLSAgICAsIHNraXAKLSAgICAsIE1lc3NhZ2VUeXBlKC4uKQotICAgICwgVGhyaWZ0VHlwZSguLikKKyAgICAsIFN0YXRlbGVzc1Byb3RvY29sKC4uKQogICAgICwgUHJvdG9jb2xFeG4oLi4pCiAgICAgLCBQcm90b2NvbEV4blR5cGUoLi4pCisgICAgLCBnZXRUeXBlT2YKKyAgICAsIHJ1blBhcnNlcgorICAgICwgYnNUb0RvdWJsZQorICAgICwgYnNUb0RvdWJsZUxFCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIHJlcGxpY2F0ZU1fLCB1bmxlc3MgKQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCi1pbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkxhenkKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZworaW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5VbnNhZmUKK2ltcG9ydCBEYXRhLkZ1bmN0b3IgKCg8JD4pKQogaW1wb3J0IERhdGEuSW50Ci1pbXBvcnQgRGF0YS5UZXh0LkxhenkgKCBUZXh0ICkKLWltcG9ydCBEYXRhLlR5cGVhYmxlICggVHlwZWFibGUgKQoraW1wb3J0IERhdGEuTW9ub2lkIChtZW1wdHkpCitpbXBvcnQgRGF0YS5UZXh0LkxhenkgKFRleHQpCitpbXBvcnQgRGF0YS5UeXBlYWJsZSAoVHlwZWFibGUpCitpbXBvcnQgRGF0YS5Xb3JkCitpbXBvcnQgRm9yZWlnbi5QdHIgKGNhc3RQdHIpCitpbXBvcnQgRm9yZWlnbi5TdG9yYWJsZSAocGVlaywgcG9rZSkKK2ltcG9ydCBTeXN0ZW0uSU8uVW5zYWZlCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKIAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKLQotCi1kYXRhIFRocmlmdFR5cGUKLSAgICA9IFRfU1RPUAotICAgIHwgVF9WT0lECi0gICAgfCBUX0JPT0wKLSAgICB8IFRfQllURQotICAgIHwgVF9ET1VCTEUKLSAgICB8IFRfSTE2Ci0gICAgfCBUX0kzMgotICAgIHwgVF9JNjQKLSAgICB8IFRfU1RSSU5HCi0gICAgfCBUX1NUUlVDVAotICAgIHwgVF9NQVAKLSAgICB8IFRfU0VUCi0gICAgfCBUX0xJU1QKLSAgICAgIGRlcml2aW5nICggRXEgKQotCi1pbnN0YW5jZSBFbnVtIFRocmlmdFR5cGUgd2hlcmUKLSAgICBmcm9tRW51bSBUX1NUT1AgICA9IDAKLSAgICBmcm9tRW51bSBUX1ZPSUQgICA9IDEKLSAgICBmcm9tRW51bSBUX0JPT0wgICA9IDIKLSAgICBmcm9tRW51bSBUX0JZVEUgICA9IDMKLSAgICBmcm9tRW51bSBUX0RPVUJMRSA9IDQKLSAgICBmcm9tRW51bSBUX0kxNiAgICA9IDYKLSAgICBmcm9tRW51bSBUX0kzMiAgICA9IDgKLSAgICBmcm9tRW51bSBUX0k2NCAgICA9IDEwCi0gICAgZnJvbUVudW0gVF9TVFJJTkcgPSAxMQotICAgIGZyb21FbnVtIFRfU1RSVUNUID0gMTIKLSAgICBmcm9tRW51bSBUX01BUCAgICA9IDEzCi0gICAgZnJvbUVudW0gVF9TRVQgICAgPSAxNAotICAgIGZyb21FbnVtIFRfTElTVCAgID0gMTUKLQotICAgIHRvRW51bSAwICA9IFRfU1RPUAotICAgIHRvRW51bSAxICA9IFRfVk9JRAotICAgIHRvRW51bSAyICA9IFRfQk9PTAotICAgIHRvRW51bSAzICA9IFRfQllURQotICAgIHRvRW51bSA0ICA9IFRfRE9VQkxFCi0gICAgdG9FbnVtIDYgID0gVF9JMTYKLSAgICB0b0VudW0gOCAgPSBUX0kzMgotICAgIHRvRW51bSAxMCA9IFRfSTY0Ci0gICAgdG9FbnVtIDExID0gVF9TVFJJTkcKLSAgICB0b0VudW0gMTIgPSBUX1NUUlVDVAotICAgIHRvRW51bSAxMyA9IFRfTUFQCi0gICAgdG9FbnVtIDE0ID0gVF9TRVQKLSAgICB0b0VudW0gMTUgPSBUX0xJU1QKLSAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgVGhyaWZ0VHlwZSAiICsrIHNob3cgdAotCi1kYXRhIE1lc3NhZ2VUeXBlCi0gICAgPSBNX0NBTEwKLSAgICB8IE1fUkVQTFkKLSAgICB8IE1fRVhDRVBUSU9OCi0gICAgICBkZXJpdmluZyAoIEVxICkKLQotaW5zdGFuY2UgRW51bSBNZXNzYWdlVHlwZSB3aGVyZQotICAgIGZyb21FbnVtIE1fQ0FMTCAgICAgID0gIDEKLSAgICBmcm9tRW51bSBNX1JFUExZICAgICA9ICAyCi0gICAgZnJvbUVudW0gTV9FWENFUFRJT04gPSAgMwotCi0gICAgdG9FbnVtIDEgPSBNX0NBTEwKLSAgICB0b0VudW0gMiA9IE1fUkVQTFkKLSAgICB0b0VudW0gMyA9IE1fRVhDRVBUSU9OCi0gICAgdG9FbnVtIHQgPSBlcnJvciAkICJJbnZhbGlkIE1lc3NhZ2VUeXBlICIgKysgc2hvdyB0Ci0KK2ltcG9ydCBUaHJpZnQuVHlwZXMKIAogY2xhc3MgUHJvdG9jb2wgYSB3aGVyZQotICAgIGdldFRyYW5zcG9ydCA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gdAorICByZWFkQnl0ZSA6OiBhIC0+IElPIExCUy5CeXRlU3RyaW5nCisgIHJlYWRWYWwgOjogYSAtPiBUaHJpZnRUeXBlIC0+IElPIFRocmlmdFZhbAorICByZWFkTWVzc2FnZSA6OiBhIC0+ICgoVGV4dCwgTWVzc2FnZVR5cGUsIEludDMyKSAtPiBJTyBiKSAtPiBJTyBiCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gKCkKLSAgICB3cml0ZU1lc3NhZ2VFbmQgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKKyAgd3JpdGVWYWwgOjogYSAtPiBUaHJpZnRWYWwgLT4gSU8gKCkKKyAgd3JpdGVNZXNzYWdlIDo6IGEgLT4gKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gKCkgLT4gSU8gKCkKIAotICAgIHdyaXRlU3RydWN0QmVnaW4gOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRleHQgLT4gSU8gKCkKLSAgICB3cml0ZVN0cnVjdEVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRCZWdpbiAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IChUZXh0LCBUaHJpZnRUeXBlLCBJbnQxNikgLT4gSU8gKCkKLSAgICB3cml0ZUZpZWxkRW5kICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHdyaXRlRmllbGRTdG9wICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVNYXBCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIFRocmlmdFR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlTWFwRW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVMaXN0QmVnaW4gICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlTGlzdEVuZCAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgd3JpdGVTZXRCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRocmlmdFR5cGUsIEludDMyKSAtPiBJTyAoKQotICAgIHdyaXRlU2V0RW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0KLSAgICB3cml0ZUJvb2wgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gQm9vbCAtPiBJTyAoKQotICAgIHdyaXRlQnl0ZSAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJbnQ4IC0+IElPICgpCi0gICAgd3JpdGVJMTYgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDE2IC0+IElPICgpCi0gICAgd3JpdGVJMzIgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDMyIC0+IElPICgpCi0gICAgd3JpdGVJNjQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEludDY0IC0+IElPICgpCi0gICAgd3JpdGVEb3VibGUgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IERvdWJsZSAtPiBJTyAoKQotICAgIHdyaXRlU3RyaW5nIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBUZXh0IC0+IElPICgpCi0gICAgd3JpdGVCaW5hcnkgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IEJ5dGVTdHJpbmcgLT4gSU8gKCkKLQotCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikKLSAgICByZWFkTWVzc2FnZUVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotCi0gICAgcmVhZFN0cnVjdEJlZ2luIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBUZXh0Ci0gICAgcmVhZFN0cnVjdEVuZCAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRGaWVsZEJlZ2luICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRleHQsIFRocmlmdFR5cGUsIEludDE2KQotICAgIHJlYWRGaWVsZEVuZCAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLSAgICByZWFkTWFwQmVnaW4gICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIChUaHJpZnRUeXBlLCBUaHJpZnRUeXBlLCBJbnQzMikKLSAgICByZWFkTWFwRW5kICAgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gICAgcmVhZExpc3RCZWdpbiAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoVGhyaWZ0VHlwZSwgSW50MzIpCi0gICAgcmVhZExpc3RFbmQgICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICAgIHJlYWRTZXRCZWdpbiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRocmlmdFR5cGUsIEludDMyKQotICAgIHJlYWRTZXRFbmQgICAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKCkKLQotICAgIHJlYWRCb29sICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEJvb2wKLSAgICByZWFkQnl0ZSAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBJbnQ4Ci0gICAgcmVhZEkxNiAgICA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gSW50MTYKLSAgICByZWFkSTMyICAgIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyBJbnQzMgotICAgIHJlYWRJNjQgICAgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEludDY0Ci0gICAgcmVhZERvdWJsZSA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gRG91YmxlCi0gICAgcmVhZFN0cmluZyA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gVGV4dAotICAgIHJlYWRCaW5hcnkgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPIEJ5dGVTdHJpbmcKLQotCi1za2lwIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IFRocmlmdFR5cGUgLT4gSU8gKCkKLXNraXAgXyBUX1NUT1AgPSByZXR1cm4gKCkKLXNraXAgXyBUX1ZPSUQgPSByZXR1cm4gKCkKLXNraXAgcCBUX0JPT0wgPSByZWFkQm9vbCBwID4+IHJldHVybiAoKQotc2tpcCBwIFRfQllURSA9IHJlYWRCeXRlIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JMTYgPSByZWFkSTE2IHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JMzIgPSByZWFkSTMyIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9JNjQgPSByZWFkSTY0IHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9ET1VCTEUgPSByZWFkRG91YmxlIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9TVFJJTkcgPSByZWFkU3RyaW5nIHAgPj4gcmV0dXJuICgpCi1za2lwIHAgVF9TVFJVQ1QgPSBkbyBfIDwtIHJlYWRTdHJ1Y3RCZWdpbiBwCi0gICAgICAgICAgICAgICAgICAgICBza2lwRmllbGRzIHAKLSAgICAgICAgICAgICAgICAgICAgIHJlYWRTdHJ1Y3RFbmQgcAotc2tpcCBwIFRfTUFQID0gZG8gKGssIHYsIHMpIDwtIHJlYWRNYXBCZWdpbiBwCi0gICAgICAgICAgICAgICAgICByZXBsaWNhdGVNXyAoZnJvbUludGVncmFsIHMpIChza2lwIHAgayA+PiBza2lwIHAgdikKLSAgICAgICAgICAgICAgICAgIHJlYWRNYXBFbmQgcAotc2tpcCBwIFRfU0VUID0gZG8gKHQsIG4pIDwtIHJlYWRTZXRCZWdpbiBwCi0gICAgICAgICAgICAgICAgICByZXBsaWNhdGVNXyAoZnJvbUludGVncmFsIG4pIChza2lwIHAgdCkKLSAgICAgICAgICAgICAgICAgIHJlYWRTZXRFbmQgcAotc2tpcCBwIFRfTElTVCA9IGRvICh0LCBuKSA8LSByZWFkTGlzdEJlZ2luIHAKLSAgICAgICAgICAgICAgICAgICByZXBsaWNhdGVNXyAoZnJvbUludGVncmFsIG4pIChza2lwIHAgdCkKLSAgICAgICAgICAgICAgICAgICByZWFkTGlzdEVuZCBwCi0KLQotc2tpcEZpZWxkcyA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBJTyAoKQotc2tpcEZpZWxkcyBwID0gZG8KLSAgICAoXywgdCwgXykgPC0gcmVhZEZpZWxkQmVnaW4gcAotICAgIHVubGVzcyAodCA9PSBUX1NUT1ApIChza2lwIHAgdCA+PiByZWFkRmllbGRFbmQgcCA+PiBza2lwRmllbGRzIHApCi0KK2NsYXNzIFByb3RvY29sIGEgPT4gU3RhdGVsZXNzUHJvdG9jb2wgYSB3aGVyZQorICBzZXJpYWxpemVWYWwgOjogYSAtPiBUaHJpZnRWYWwgLT4gTEJTLkJ5dGVTdHJpbmcKKyAgZGVzZXJpYWxpemVWYWwgOjogYSAtPiBUaHJpZnRUeXBlIC0+IExCUy5CeXRlU3RyaW5nIC0+IFRocmlmdFZhbAogCiBkYXRhIFByb3RvY29sRXhuVHlwZQogICAgID0gUEVfVU5LTk9XTgpAQCAtMTg4LDggKzY5LDY4IEBACiAgICAgfCBQRV9ORUdBVElWRV9TSVpFCiAgICAgfCBQRV9TSVpFX0xJTUlUCiAgICAgfCBQRV9CQURfVkVSU0lPTgorICAgIHwgUEVfTk9UX0lNUExFTUVOVEVECisgICAgfCBQRV9NSVNTSU5HX1JFUVVJUkVEX0ZJRUxECiAgICAgICBkZXJpdmluZyAoIEVxLCBTaG93LCBUeXBlYWJsZSApCiAKIGRhdGEgUHJvdG9jb2xFeG4gPSBQcm90b2NvbEV4biBQcm90b2NvbEV4blR5cGUgU3RyaW5nCiAgIGRlcml2aW5nICggU2hvdywgVHlwZWFibGUgKQogaW5zdGFuY2UgRXhjZXB0aW9uIFByb3RvY29sRXhuCisKK2dldFR5cGVPZiA6OiBUaHJpZnRWYWwgLT4gVGhyaWZ0VHlwZQorZ2V0VHlwZU9mIHYgPSAgY2FzZSB2IG9mCisgIFRTdHJ1Y3R7fSAtPiBUX1NUUlVDVCBNYXAuZW1wdHkKKyAgVE1hcHt9IC0+IFRfTUFQIFRfVk9JRCBUX1ZPSUQKKyAgVExpc3R7fSAtPiBUX0xJU1QgVF9WT0lECisgIFRTZXR7fSAtPiBUX1NFVCBUX1ZPSUQKKyAgVEJvb2x7fSAtPiBUX0JPT0wKKyAgVEJ5dGV7fSAtPiBUX0JZVEUKKyAgVEkxNnt9IC0+IFRfSTE2CisgIFRJMzJ7fSAtPiBUX0kzMgorICBUSTY0e30gLT4gVF9JNjQKKyAgVFN0cmluZ3t9IC0+IFRfU1RSSU5HCisgIFRCaW5hcnl7fSAtPiBUX0JJTkFSWQorICBURG91Ymxle30gLT4gVF9ET1VCTEUKKworcnVuUGFyc2VyIDo6IChQcm90b2NvbCBwLCBTaG93IGEpID0+IHAgLT4gUGFyc2VyIGEgLT4gSU8gYQorcnVuUGFyc2VyIHByb3QgcCA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gcGFyc2UgcAorICB3aGVyZQorICAgIHJlZmlsbCA9IGhhbmRsZSBoYW5kbGVFT0YgJCBMQlMudG9TdHJpY3QgPCQ+IHJlYWRCeXRlIHByb3QKKyAgICBnZXRSZXN1bHQgKERvbmUgXyBhKSA9IHJldHVybiBhCisgICAgZ2V0UmVzdWx0IChQYXJ0aWFsIGspID0gcmVmaWxsID4+PSBnZXRSZXN1bHQgLiBrCisgICAgZ2V0UmVzdWx0IGYgPSB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0lOVkFMSURfREFUQSAoc2hvdyBmKQorCitoYW5kbGVFT0YgOjogU29tZUV4Y2VwdGlvbiAtPiBJTyBCUy5CeXRlU3RyaW5nCitoYW5kbGVFT0YgPSBjb25zdCAkIHJldHVybiBtZW1wdHkKKworLS0gfCBDb252ZXJ0cyBhIEJ5dGVTdHJpbmcgdG8gYSBGbG9hdGluZyBwb2ludCBudW1iZXIKKy0tIFRoZSBCeXRlU3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUgZW5jb2RlZCBpbiBuZXR3b3JrIG9yZGVyIChCaWcgRW5kaWFuKQorLS0gdGhlcmVmb3JlIHRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIHZhcmllcyBiYXNlZCBvbiB3aGV0aGVyIHRoZSBsb2NhbAorLS0gbWFjaGluZSBpcyBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4uCitic1RvRG91YmxlIDo6IEJTLkJ5dGVTdHJpbmcgLT4gRG91YmxlCitic1RvRG91YmxlTEUgOjogQlMuQnl0ZVN0cmluZyAtPiBEb3VibGUKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCitic1RvRG91YmxlIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCitic1RvRG91YmxlTEUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcworI2Vsc2UKK2JzVG9Eb3VibGUgYnMgPSB1bnNhZmVEdXBhYmxlUGVyZm9ybUlPICQgdW5zYWZlVXNlQXNDU3RyaW5nIGJzIGNhc3RCcworYnNUb0RvdWJsZUxFIGJzID0gdW5zYWZlRHVwYWJsZVBlcmZvcm1JTyAkIHVuc2FmZVVzZUFzQ1N0cmluZyBicyBjYXN0QnNTd2FwcGVkCisjZW5kaWYKKworCitjYXN0QnNTd2FwcGVkIGNoclB0ciA9IGRvCisgIHcgPC0gcGVlayAoY2FzdFB0ciBjaHJQdHIpCisgIHBva2UgKGNhc3RQdHIgY2hyUHRyKSAoYnl0ZVN3YXAgdykKKyAgcGVlayAoY2FzdFB0ciBjaHJQdHIpCitjYXN0QnMgPSBwZWVrIC4gY2FzdFB0cgorCistLSB8IFN3YXAgZW5kaWFubmVzcyBvZiBhIDY0LWJpdCB3b3JkCitieXRlU3dhcCA6OiBXb3JkNjQgLT4gV29yZDY0CitieXRlU3dhcCB3ID0gKHcgYHNoaWZ0TGAgNTYgLiYuIDB4RkYwMDAwMDAwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0TGAgNDAgLiYuIDB4MDBGRjAwMDAwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0TGAgMjQgLiYuIDB4MDAwMEZGMDAwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0TGAgOCAgLiYuIDB4MDAwMDAwRkYwMDAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgOCAgLiYuIDB4MDAwMDAwMDBGRjAwMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgMjQgLiYuIDB4MDAwMDAwMDAwMEZGMDAwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNDAgLiYuIDB4MDAwMDAwMDAwMDAwRkYwMCkgLnwuCisgICAgICAgICAgICAgKHcgYHNoaWZ0UmAgNTYgLiYuIDB4MDAwMDAwMDAwMDAwMDBGRikKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocwppbmRleCAxYmM5YWRkLi43YjBhY2Q5IDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCkBAIC0xLDYgKzEsMyBAQAotey0jIExBTkdVQUdFIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24gIy19Ci17LSMgTEFOR1VBR0UgTWFnaWNIYXNoICMtfQotey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMCwxNDUgKzE3LDE5NiBAQAogLS0gdW5kZXIgdGhlIExpY2Vuc2UuCiAtLQogCit7LSMgTEFOR1VBR0UgQ1BQICMtfQorey0jIExBTkdVQUdFIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24gIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19Cit7LSMgTEFOR1VBR0UgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KKwogbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIEJpbmFyeVByb3RvY29sKC4uKQorICAgICwgdmVyc2lvbk1hc2sKKyAgICAsIHZlcnNpb24xCiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoIGxpZnRNICkKLQotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeQoraW1wb3J0IENvbnRyb2wuTW9uYWQKIGltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCiBpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLk1vbm9pZAogaW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCi0KLWltcG9ydCBHSEMuRXh0cwotaW1wb3J0IEdIQy5Xb3JkCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZy5MYXp5IGFzIExQCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQmluYXJ5IGFzIEJpbmFyeQogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKIAotdmVyc2lvbl9tYXNrIDo6IEludDMyCi12ZXJzaW9uX21hc2sgPSAweGZmZmYwMDAwCit2ZXJzaW9uTWFzayA6OiBJbnQzMgordmVyc2lvbk1hc2sgPSBmcm9tSW50ZWdyYWwgKDB4ZmZmZjAwMDAgOjogV29yZDMyKQogCi12ZXJzaW9uXzEgOjogSW50MzIKLXZlcnNpb25fMSAgICA9IDB4ODAwMTAwMDAKK3ZlcnNpb24xIDo6IEludDMyCit2ZXJzaW9uMSA9IGZyb21JbnRlZ3JhbCAoMHg4MDAxMDAwMCA6OiBXb3JkMzIpCiAKIGRhdGEgQmluYXJ5UHJvdG9jb2wgYSA9IFRyYW5zcG9ydCBhID0+IEJpbmFyeVByb3RvY29sIGEKIAorZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEJpbmFyeVByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKIAotaW5zdGFuY2UgUHJvdG9jb2wgQmluYXJ5UHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKEJpbmFyeVByb3RvY29sIHQpID0gdAotCi0gICAgd3JpdGVNZXNzYWdlQmVnaW4gcCAobiwgdCwgcykgPSBkbwotICAgICAgICB3cml0ZUkzMiBwICh2ZXJzaW9uXzEgLnwuIChmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSB0KSkKLSAgICAgICAgd3JpdGVTdHJpbmcgcCBuCi0gICAgICAgIHdyaXRlSTMyIHAgcwotICAgIHdyaXRlTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCi0KLSAgICB3cml0ZVN0cnVjdEJlZ2luIF8gXyA9IHJldHVybiAoKQotICAgIHdyaXRlU3RydWN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUZpZWxkQmVnaW4gcCAoXywgdCwgaSkgPSB3cml0ZVR5cGUgcCB0ID4+IHdyaXRlSTE2IHAgaQotICAgIHdyaXRlRmllbGRFbmQgXyA9IHJldHVybiAoKQotICAgIHdyaXRlRmllbGRTdG9wIHAgPSB3cml0ZVR5cGUgcCBUX1NUT1AKLSAgICB3cml0ZU1hcEJlZ2luIHAgKGssIHYsIG4pID0gd3JpdGVUeXBlIHAgayA+PiB3cml0ZVR5cGUgcCB2ID4+IHdyaXRlSTMyIHAgbgotICAgIHdyaXRlTWFwRW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZUxpc3RCZWdpbiBwICh0LCBuKSA9IHdyaXRlVHlwZSBwIHQgPj4gd3JpdGVJMzIgcCBuCi0gICAgd3JpdGVMaXN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICB3cml0ZVNldEJlZ2luIHAgKHQsIG4pID0gd3JpdGVUeXBlIHAgdCA+PiB3cml0ZUkzMiBwIG4KLSAgICB3cml0ZVNldEVuZCBfID0gcmV0dXJuICgpCi0KLSAgICB3cml0ZUJvb2wgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgJCBMQlMuc2luZ2xldG9uICQgdG9FbnVtICQgaWYgYiB0aGVuIDEgZWxzZSAwCi0gICAgd3JpdGVCeXRlIHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgRGF0YS5CaW5hcnkuZW5jb2RlIGIKLSAgICB3cml0ZUkxNiBwIGIgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAkIERhdGEuQmluYXJ5LmVuY29kZSBiCi0gICAgd3JpdGVJMzIgcCBiID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgJCBEYXRhLkJpbmFyeS5lbmNvZGUgYgotICAgIHdyaXRlSTY0IHAgYiA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgRGF0YS5CaW5hcnkuZW5jb2RlIGIKLSAgICB3cml0ZURvdWJsZSBwIGQgPSB3cml0ZUk2NCBwIChmcm9tSW50ZWdyYWwgJCBmbG9hdEJpdHMgZCkKLSAgICB3cml0ZVN0cmluZyBwIHMgPSB3cml0ZUkzMiBwIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHMnKSA+PiB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSBzJworLS0gTk9URTogUmVhZGluZyBhbmQgV3JpdGluZyBmdW5jdGlvbnMgcmVseSBvbiBCdWlsZGVycyBhbmQgRGF0YS5CaW5hcnkgdG8KKy0tIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEuICBEYXRhLkJpbmFyeSBhc3N1bWVzIHRoYXQgdGhlIGJpbmFyeSB2YWx1ZXMgaXQgaXMKKy0tIGVuY29kaW5nIHRvIGFuZCBkZWNvZGluZyBmcm9tIGFyZSBpbiBCSUcgRU5ESUFOIGZvcm1hdCwgYW5kIGNvbnZlcnRzIHRoZQorLS0gZW5kaWFubmVzcyBhcyBuZWNlc3NhcnkgdG8gbWF0Y2ggdGhlIGxvY2FsIG1hY2hpbmUuCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgLS0gZmx1c2hUcmFuc3BvcnQgcCA9IHRGbHVzaCAoZ2V0VHJhbnNwb3J0IHApCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAogICAgICAgd2hlcmUKLSAgICAgICAgcycgPSBlbmNvZGVVdGY4IHMKLSAgICB3cml0ZUJpbmFyeSBwIHMgPSB3cml0ZUkzMiBwIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHMpID4+IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIHMKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiAodmVyc2lvbjEgLnwuIGZyb21JbnRlZ3JhbCAoZnJvbUVudW0gdCkpKSA8PgorICAgICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQogCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gZG8KLSAgICAgICAgdmVyIDwtIHJlYWRJMzIgcAotICAgICAgICBpZiAodmVyIC4mLiB2ZXJzaW9uX21hc2sgLz0gdmVyc2lvbl8xKQorICAgIHJlYWRNZXNzYWdlIHAgPSAocmVhZE1lc3NhZ2VCZWdpbiBwID4+PSkKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KKyAgICAgICAgICBUSTMyIHZlciA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgaWYgdmVyIC4mLiB2ZXJzaW9uTWFzayAvPSB2ZXJzaW9uMQogICAgICAgICAgICAgdGhlbiB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0JBRF9WRVJTSU9OICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIKICAgICAgICAgICAgIGVsc2UgZG8KLSAgICAgICAgICAgICAgcyA8LSByZWFkU3RyaW5nIHAKLSAgICAgICAgICAgICAgc3ogPC0gcmVhZEkzMiBwCi0gICAgICAgICAgICAgIHJldHVybiAocywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKLSAgICByZWFkTWVzc2FnZUVuZCBfID0gcmV0dXJuICgpCi0gICAgcmVhZFN0cnVjdEJlZ2luIF8gPSByZXR1cm4gIiIKLSAgICByZWFkU3RydWN0RW5kIF8gPSByZXR1cm4gKCkKLSAgICByZWFkRmllbGRCZWdpbiBwID0gZG8KLSAgICAgICAgdCA8LSByZWFkVHlwZSBwCi0gICAgICAgIG4gPC0gaWYgdCAvPSBUX1NUT1AgdGhlbiByZWFkSTE2IHAgZWxzZSByZXR1cm4gMAotICAgICAgICByZXR1cm4gKCIiLCB0LCBuKQotICAgIHJlYWRGaWVsZEVuZCBfID0gcmV0dXJuICgpCi0gICAgcmVhZE1hcEJlZ2luIHAgPSBkbwotICAgICAgICBrdCA8LSByZWFkVHlwZSBwCi0gICAgICAgIHZ0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgbiA8LSByZWFkSTMyIHAKLSAgICAgICAgcmV0dXJuIChrdCwgdnQsIG4pCi0gICAgcmVhZE1hcEVuZCBfID0gcmV0dXJuICgpCi0gICAgcmVhZExpc3RCZWdpbiBwID0gZG8KLSAgICAgICAgdCA8LSByZWFkVHlwZSBwCi0gICAgICAgIG4gPC0gcmVhZEkzMiBwCi0gICAgICAgIHJldHVybiAodCwgbikKLSAgICByZWFkTGlzdEVuZCBfID0gcmV0dXJuICgpCi0gICAgcmVhZFNldEJlZ2luIHAgPSBkbwotICAgICAgICB0IDwtIHJlYWRUeXBlIHAKLSAgICAgICAgbiA8LSByZWFkSTMyIHAKLSAgICAgICAgcmV0dXJuICh0LCBuKQotICAgIHJlYWRTZXRFbmQgXyA9IHJldHVybiAoKQorICAgICAgICAgICAgICBUU3RyaW5nIHMgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX1NUUklORworICAgICAgICAgICAgICBUSTMyIHN6IDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKKyAgICAgICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IHMsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHZlciAuJi4gMHhGRiwgc3opCiAKLSAgICByZWFkQm9vbCBwID0gKD09IDEpIGBmbWFwYCByZWFkQnl0ZSBwCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQmluYXJ5VmFsdWUKKyAgICByZWFkVmFsIHAgPSBydW5QYXJzZXIgcCAuIHBhcnNlQmluYXJ5VmFsdWUKIAotICAgIHJlYWRCeXRlIHAgPSBkbwotICAgICAgICBicyA8LSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKLSAgICAgICAgcmV0dXJuICQgRGF0YS5CaW5hcnkuZGVjb2RlIGJzCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEJpbmFyeVZhbHVlCisgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CisgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUJpbmFyeVZhbHVlIHR5KSBicyBvZgorICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcworICAgICAgICBSaWdodCB2YWwgLT4gdmFsCiAKLSAgICByZWFkSTE2IHAgPSBkbwotICAgICAgICBicyA8LSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDIKLSAgICAgICAgcmV0dXJuICQgRGF0YS5CaW5hcnkuZGVjb2RlIGJzCistLSB8IFdyaXRpbmcgRnVuY3Rpb25zCitidWlsZEJpbmFyeVZhbHVlIDo6IFRocmlmdFZhbCAtPiBCdWlsZGVyCitidWlsZEJpbmFyeVZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBidWlsZEJpbmFyeVN0cnVjdCBmaWVsZHMgPD4gYnVpbGRUeXBlIFRfU1RPUAorYnVpbGRCaW5hcnlWYWx1ZSAoVE1hcCBreSB2dCBlbnRyaWVzKSA9CisgIGJ1aWxkVHlwZSBreSA8PgorICBidWlsZFR5cGUgdnQgPD4KKyAgaW50MzJCRSAoZnJvbUludGVncmFsIChsZW5ndGggZW50cmllcykpIDw+CisgIGJ1aWxkQmluYXJ5TWFwIGVudHJpZXMKK2J1aWxkQmluYXJ5VmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpID0KKyAgYnVpbGRUeXBlIHR5IDw+CisgIGludDMyQkUgKGZyb21JbnRlZ3JhbCAobGVuZ3RoIGVudHJpZXMpKSA8PgorICBidWlsZEJpbmFyeUxpc3QgZW50cmllcworYnVpbGRCaW5hcnlWYWx1ZSAoVFNldCB0eSBlbnRyaWVzKSA9CisgIGJ1aWxkVHlwZSB0eSA8PgorICBpbnQzMkJFIChmcm9tSW50ZWdyYWwgKGxlbmd0aCBlbnRyaWVzKSkgPD4KKyAgYnVpbGRCaW5hcnlMaXN0IGVudHJpZXMKK2J1aWxkQmluYXJ5VmFsdWUgKFRCb29sIGIpID0KKyAgd29yZDggJCB0b0VudW0gJCBpZiBiIHRoZW4gMSBlbHNlIDAKK2J1aWxkQmluYXJ5VmFsdWUgKFRCeXRlIGIpID0gaW50OCBiCitidWlsZEJpbmFyeVZhbHVlIChUSTE2IGkpID0gaW50MTZCRSBpCitidWlsZEJpbmFyeVZhbHVlIChUSTMyIGkpID0gaW50MzJCRSBpCitidWlsZEJpbmFyeVZhbHVlIChUSTY0IGkpID0gaW50NjRCRSBpCitidWlsZEJpbmFyeVZhbHVlIChURG91YmxlIGQpID0gZG91YmxlQkUgZAorYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyBzKSA9IGludDMyQkUgbGVuIDw+IGxhenlCeXRlU3RyaW5nIHMKKyAgd2hlcmUKKyAgICBsZW4gOjogSW50MzIgPSBmcm9tSW50ZWdyYWwgKExCUy5sZW5ndGggcykKK2J1aWxkQmluYXJ5VmFsdWUgKFRCaW5hcnkgcykgPSBidWlsZEJpbmFyeVZhbHVlIChUU3RyaW5nIHMpCiAKLSAgICByZWFkSTMyIHAgPSBkbwotICAgICAgICBicyA8LSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDQKLSAgICAgICAgcmV0dXJuICQgRGF0YS5CaW5hcnkuZGVjb2RlIGJzCitidWlsZEJpbmFyeVN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZEJpbmFyeVN0cnVjdCA9IE1hcC5mb2xkcldpdGhLZXkgY29tYmluZSBtZW1wdHkKKyAgd2hlcmUKKyAgICBjb21iaW5lIGZpZCAoXyx2YWwpIHMgPQorICAgICAgYnVpbGRUeXBlT2YgdmFsIDw+IGludDE2QkUgZmlkIDw+IGJ1aWxkQmluYXJ5VmFsdWUgdmFsIDw+IHMKIAotICAgIHJlYWRJNjQgcCA9IGRvCi0gICAgICAgIGJzIDwtIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgOAotICAgICAgICByZXR1cm4gJCBEYXRhLkJpbmFyeS5kZWNvZGUgYnMKK2J1aWxkQmluYXJ5TWFwIDo6IFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXSAtPiBCdWlsZGVyCitidWlsZEJpbmFyeU1hcCA9IGZvbGRsIGNvbWJpbmUgbWVtcHR5CisgIHdoZXJlCisgICAgY29tYmluZSBzIChrZXksIHZhbCkgPSBzIDw+IGJ1aWxkQmluYXJ5VmFsdWUga2V5IDw+IGJ1aWxkQmluYXJ5VmFsdWUgdmFsCiAKLSAgICByZWFkRG91YmxlIHAgPSBkbwotICAgICAgICBicyA8LSByZWFkSTY0IHAKLSAgICAgICAgcmV0dXJuICQgZmxvYXRPZkJpdHMgJCBmcm9tSW50ZWdyYWwgYnMKK2J1aWxkQmluYXJ5TGlzdCA6OiBbVGhyaWZ0VmFsXSAtPiBCdWlsZGVyCitidWlsZEJpbmFyeUxpc3QgPSBmb2xkciAobWFwcGVuZCAuIGJ1aWxkQmluYXJ5VmFsdWUpIG1lbXB0eQogCi0gICAgcmVhZFN0cmluZyBwID0gZG8KLSAgICAgICAgaSA8LSByZWFkSTMyIHAKLSAgICAgICAgZGVjb2RlVXRmOCBgbGlmdE1gIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgKGZyb21JbnRlZ3JhbCBpKQorLS0gfCBSZWFkaW5nIEZ1bmN0aW9ucworcGFyc2VCaW5hcnlWYWx1ZSA6OiBUaHJpZnRUeXBlIC0+IFAuUGFyc2VyIFRocmlmdFZhbAorcGFyc2VCaW5hcnlWYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPSBUU3RydWN0IDwkPiBwYXJzZUJpbmFyeVN0cnVjdCB0bWFwCitwYXJzZUJpbmFyeVZhbHVlIChUX01BUCBfIF8pID0gZG8KKyAga3QgPC0gcGFyc2VUeXBlCisgIHZ0IDwtIHBhcnNlVHlwZQorICBuIDwtIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKKyAgVE1hcCBrdCB2dCA8JD4gcGFyc2VCaW5hcnlNYXAga3QgdnQgbgorcGFyc2VCaW5hcnlWYWx1ZSAoVF9MSVNUIF8pID0gZG8KKyAgdCA8LSBwYXJzZVR5cGUKKyAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIFRMaXN0IHQgPCQ+IHBhcnNlQmluYXJ5TGlzdCB0IG4KK3BhcnNlQmluYXJ5VmFsdWUgKFRfU0VUIF8pID0gZG8KKyAgdCA8LSBwYXJzZVR5cGUKKyAgbiA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIFRTZXQgdCA8JD4gcGFyc2VCaW5hcnlMaXN0IHQgbgorcGFyc2VCaW5hcnlWYWx1ZSBUX0JPT0wgPSBUQm9vbCAuICgvPTApIDwkPiBQLmFueVdvcmQ4CitwYXJzZUJpbmFyeVZhbHVlIFRfQllURSA9IFRCeXRlIC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMQorcGFyc2VCaW5hcnlWYWx1ZSBUX0kxNiA9IFRJMTYgLiBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCitwYXJzZUJpbmFyeVZhbHVlIFRfSTMyID0gVEkzMiAuIEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKK3BhcnNlQmluYXJ5VmFsdWUgVF9JNjQgPSBUSTY0IC4gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgOAorcGFyc2VCaW5hcnlWYWx1ZSBUX0RPVUJMRSA9IFREb3VibGUgLiBic1RvRG91YmxlIDwkPiBQLnRha2UgOAorcGFyc2VCaW5hcnlWYWx1ZSBUX1NUUklORyA9IHBhcnNlQmluYXJ5U3RyaW5nIFRTdHJpbmcKK3BhcnNlQmluYXJ5VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUJpbmFyeVN0cmluZyBUQmluYXJ5CitwYXJzZUJpbmFyeVZhbHVlIHR5ID0gZXJyb3IgJCAiQ2Fubm90IHJlYWQgdmFsdWUgb2YgdHlwZSAiICsrIHNob3cgdHkKIAotICAgIHJlYWRCaW5hcnkgcCA9IGRvCi0gICAgICAgIGkgPC0gcmVhZEkzMiBwCi0gICAgICAgIHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgKGZyb21JbnRlZ3JhbCBpKQorcGFyc2VCaW5hcnlTdHJpbmcgdHkgPSBkbworICBpIDo6IEludDMyICA8LSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CisgIHR5IC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAoZnJvbUludGVncmFsIGkpCisKK3BhcnNlQmluYXJ5U3RydWN0IDo6IFR5cGVNYXAgLT4gUC5QYXJzZXIgKE1hcC5IYXNoTWFwIEludDE2IChMVC5UZXh0LCBUaHJpZnRWYWwpKQorcGFyc2VCaW5hcnlTdHJ1Y3QgdG1hcCA9IE1hcC5mcm9tTGlzdCA8JD4gUC5tYW55VGlsbCBwYXJzZUZpZWxkIChtYXRjaFR5cGUgVF9TVE9QKQorICB3aGVyZQorICAgIHBhcnNlRmllbGQgPSBkbworICAgICAgdCA8LSBwYXJzZVR5cGUKKyAgICAgIG4gPC0gQmluYXJ5LmRlY29kZSAuIExCUy5mcm9tU3RyaWN0IDwkPiBQLnRha2UgMgorICAgICAgdiA8LSBjYXNlICh0LCBNYXAubG9va3VwIG4gdG1hcCkgb2YKKyAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VCaW5hcnlWYWx1ZSBUX0JJTkFSWQorICAgICAgICAgICAgIF8gLT4gcGFyc2VCaW5hcnlWYWx1ZSB0CisgICAgICByZXR1cm4gKG4sICgiIiwgdikpCisKK3BhcnNlQmluYXJ5TWFwIDo6IFRocmlmdFR5cGUgLT4gVGhyaWZ0VHlwZSAtPiBJbnQzMiAtPiBQLlBhcnNlciBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0KK3BhcnNlQmluYXJ5TWFwIGt0IHZ0IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBkbworICBrIDwtIHBhcnNlQmluYXJ5VmFsdWUga3QKKyAgdiA8LSBwYXJzZUJpbmFyeVZhbHVlIHZ0CisgICgoayx2KSA6KSA8JD4gcGFyc2VCaW5hcnlNYXAga3QgdnQgKG4tMSkKKworcGFyc2VCaW5hcnlMaXN0IDo6IFRocmlmdFR5cGUgLT4gSW50MzIgLT4gUC5QYXJzZXIgW1RocmlmdFZhbF0KK3BhcnNlQmluYXJ5TGlzdCB0eSBuIHwgbiA8PSAwID0gcmV0dXJuIFtdCisgICAgICAgICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGxpZnRNMiAoOikgKHBhcnNlQmluYXJ5VmFsdWUgdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJzZUJpbmFyeUxpc3QgdHkgKG4tMSkpCisKIAogCiAtLSB8IFdyaXRlIGEgdHlwZSBhcyBhIGJ5dGUKLXdyaXRlVHlwZSA6OiAoUHJvdG9jb2wgcCwgVHJhbnNwb3J0IHQpID0+IHAgdCAtPiBUaHJpZnRUeXBlIC0+IElPICgpCi13cml0ZVR5cGUgcCB0ID0gd3JpdGVCeXRlIHAgKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpCitidWlsZFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBCdWlsZGVyCitidWlsZFR5cGUgdCA9IHdvcmQ4ICQgZnJvbUludGVncmFsICQgZnJvbUVudW0gdAorCistLSB8IFdyaXRlIHR5cGUgb2YgYSBUaHJpZnRWYWwgYXMgYSBieXRlCitidWlsZFR5cGVPZiA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgorYnVpbGRUeXBlT2YgPSBidWlsZFR5cGUgLiBnZXRUeXBlT2YKIAogLS0gfCBSZWFkIGEgYnl0ZSBhcyB0aG91Z2ggaXQgd2VyZSBhIFRocmlmdFR5cGUKLXJlYWRUeXBlIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IElPIFRocmlmdFR5cGUKLXJlYWRUeXBlIHAgPSBkbwotICAgIGIgPC0gcmVhZEJ5dGUgcAotICAgIHJldHVybiAkIHRvRW51bSAkIGZyb21JbnRlZ3JhbCBiCitwYXJzZVR5cGUgOjogUC5QYXJzZXIgVGhyaWZ0VHlwZQorcGFyc2VUeXBlID0gdG9FbnVtIC4gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CiAKLWZsb2F0Qml0cyA6OiBEb3VibGUgLT4gV29yZDY0Ci1mbG9hdEJpdHMgKEQjIGQjKSA9IFc2NCMgKHVuc2FmZUNvZXJjZSMgZCMpCi0KLWZsb2F0T2ZCaXRzIDo6IFdvcmQ2NCAtPiBEb3VibGUKLWZsb2F0T2ZCaXRzIChXNjQjIGIjKSA9IEQjICh1bnNhZmVDb2VyY2UjIGIjKQotCittYXRjaFR5cGUgOjogVGhyaWZ0VHlwZSAtPiBQLlBhcnNlciBUaHJpZnRUeXBlCittYXRjaFR5cGUgdCA9IHQgPCQgUC53b3JkOCAoZnJvbUludGVncmFsICQgZnJvbUVudW0gdCkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzk3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCkBAIC0wLDAgKzEsMzExIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19CisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgQ29tcGFjdFByb3RvY29sKC4uKQorICAgICwgcGFyc2VWYXJpbnQKKyAgICAsIGJ1aWxkVmFyaW50CisgICAgKSB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAoraW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5MYXp5LkJ1aWxkZXIgYXMgQgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5MaXN0IGFzIExpc3QKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAoraW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlR5cGVzCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAorCistLSB8IHRoZSBDb21wYWN0IFByb3RvY29sIGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIFRocmlmdCAnVENvbXBhY3RQcm9jb3RvbCcKKy0tIHdoaWNoIGlzIHNpbWlsYXIgdG8gdGhlICdUQmluYXJ5UHJvdG9jb2wnLCBidXQgdGFrZXMgbGVzcyBzcGFjZSBvbiB0aGUgd2lyZS4KKy0tIEludGVncmFsIHR5cGVzIGFyZSBlbmNvZGVkIHVzaW5nIGFzIHZhcmludHMuCitkYXRhIENvbXBhY3RQcm90b2NvbCBhID0gQ29tcGFjdFByb3RvY29sIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0dWN0IGEgJ0NvbXBhY3RQcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCisKK3Byb3RvY29sSUQsIHZlcnNpb24sIHZlcnNpb25NYXNrLCB0eXBlTWFzaywgdHlwZUJpdHMgOjogV29yZDgKK3Byb3RvY29sSUQgID0gMHg4MiAtLSAxMDAwIDAwMTAKK3ZlcnNpb24gICAgID0gMHgwMQordmVyc2lvbk1hc2sgPSAweDFmIC0tIDAwMDEgMTExMQordHlwZU1hc2sgICAgPSAweGUwIC0tIDExMTAgMDAwMAordHlwZUJpdHMgICAgPSAweDA3IC0tIDAwMDAgMDExMQordHlwZVNoaWZ0QW1vdW50IDo6IEludAordHlwZVNoaWZ0QW1vdW50ID0gNQorCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gQ29tcGFjdFByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChDb21wYWN0UHJvdG9jb2wgdCkgPSB0CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi53b3JkOCBwcm90b2NvbElEIDw+CisgICAgICAgICAgQi53b3JkOCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KKyAgICAgICAgICAgICAgICAgICgoKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpIGBzaGlmdExgCisgICAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+CisgICAgICAgICAgYnVpbGRWYXJpbnQgKGkzMlRvWmlnWmFnIHMpIDw+CisgICAgICAgICAgYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pCisKKyAgICByZWFkTWVzc2FnZSBwIGYgPSByZWFkTWVzc2FnZUJlZ2luID4+PSBmCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBkbworICAgICAgICAgIHBpZCA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKKyAgICAgICAgICB3aGVuIChwaWQgLz0gcHJvdG9jb2xJRCkgJCBlcnJvciAiQmFkIFByb3RvY29sIElEIgorICAgICAgICAgIHcgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgbGV0IHZlciA9IHcgLiYuIHZlcnNpb25NYXNrCisgICAgICAgICAgd2hlbiAodmVyIC89IHZlcnNpb24pICQgZXJyb3IgIkJhZCBQcm90b2NvbCB2ZXJzaW9uIgorICAgICAgICAgIGxldCB0eXAgPSAodyBgc2hpZnRSYCB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlQml0cworICAgICAgICAgIHNlcUlkIDwtIHBhcnNlVmFyaW50IHppZ1phZ1RvSTMyCisgICAgICAgICAgVFN0cmluZyBuYW1lIDwtIHBhcnNlQ29tcGFjdFZhbHVlIFRfU1RSSU5HCisgICAgICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IG5hbWUsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHR5cCwgc2VxSWQpCisKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKKyAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHBhcnNlQ29tcGFjdFZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZENvbXBhY3RWYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VDb21wYWN0VmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gfCBXcml0aW5nIEZ1bmN0aW9ucworYnVpbGRDb21wYWN0VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkQ29tcGFjdFZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBidWlsZENvbXBhY3RTdHJ1Y3QgZmllbGRzCitidWlsZENvbXBhY3RWYWx1ZSAoVE1hcCBrdCB2dCBlbnRyaWVzKSA9CisgIGxldCBsZW4gPSBmcm9tSW50ZWdyYWwgJCBsZW5ndGggZW50cmllcyA6OiBXb3JkMzIgaW4KKyAgaWYgbGVuID09IDAKKyAgdGhlbiBCLndvcmQ4IDB4MDAKKyAgZWxzZSBidWlsZFZhcmludCBsZW4gPD4KKyAgICAgICBCLndvcmQ4IChmcm9tVFR5cGUga3QgYHNoaWZ0TGAgNCAufC4gZnJvbVRUeXBlIHZ0KSA8PgorICAgICAgIGJ1aWxkQ29tcGFjdE1hcCBlbnRyaWVzCitidWlsZENvbXBhY3RWYWx1ZSAoVExpc3QgdHkgZW50cmllcykgPQorICBsZXQgbGVuID0gbGVuZ3RoIGVudHJpZXMgaW4KKyAgKGlmIGxlbiA8IDE1CisgICB0aGVuIEIud29yZDggJCAoZnJvbUludGVncmFsIGxlbiBgc2hpZnRMYCA0KSAufC4gZnJvbVRUeXBlIHR5CisgICBlbHNlIEIud29yZDggKDB4RjAgLnwuIGZyb21UVHlwZSB0eSkgPD4KKyAgICAgICAgYnVpbGRWYXJpbnQgKGZyb21JbnRlZ3JhbCBsZW4gOjogV29yZDMyKSkgPD4KKyAgYnVpbGRDb21wYWN0TGlzdCBlbnRyaWVzCitidWlsZENvbXBhY3RWYWx1ZSAoVFNldCB0eSBlbnRyaWVzKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIChUTGlzdCB0eSBlbnRyaWVzKQorYnVpbGRDb21wYWN0VmFsdWUgKFRCb29sIGIpID0KKyAgQi53b3JkOCAkIHRvRW51bSAkIGlmIGIgdGhlbiAxIGVsc2UgMAorYnVpbGRDb21wYWN0VmFsdWUgKFRCeXRlIGIpID0gaW50OCBiCitidWlsZENvbXBhY3RWYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkVmFyaW50ICQgaTE2VG9aaWdaYWcgaQorYnVpbGRDb21wYWN0VmFsdWUgKFRJMzIgaSkgPSBidWlsZFZhcmludCAkIGkzMlRvWmlnWmFnIGkKK2J1aWxkQ29tcGFjdFZhbHVlIChUSTY0IGkpID0gYnVpbGRWYXJpbnQgJCBpNjRUb1ppZ1phZyBpCitidWlsZENvbXBhY3RWYWx1ZSAoVERvdWJsZSBkKSA9IGRvdWJsZUxFIGQKK2J1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nIHMpID0gYnVpbGRWYXJpbnQgbGVuIDw+IGxhenlCeXRlU3RyaW5nIHMKKyAgd2hlcmUKKyAgICBsZW4gPSBmcm9tSW50ZWdyYWwgKExCUy5sZW5ndGggcykgOjogV29yZDMyCitidWlsZENvbXBhY3RWYWx1ZSAoVEJpbmFyeSBzKSA9IGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RyaW5nIHMpCisKK2J1aWxkQ29tcGFjdFN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RTdHJ1Y3QgPSBmbGlwIChsb29wIDApIG1lbXB0eSAuIE1hcC50b0xpc3QKKyAgd2hlcmUKKyAgICBsb29wIF8gW10gYWNjID0gYWNjIDw+IEIud29yZDggKGZyb21UVHlwZSBUX1NUT1ApCisgICAgbG9vcCBsYXN0SWQgKChmaWQsIChfLHZhbCkpIDogZmllbGRzKSBhY2MgPSBsb29wIGZpZCBmaWVsZHMgJCBhY2MgPD4KKyAgICAgIChpZiBmaWQgPiBsYXN0SWQgJiYgZmlkIC0gbGFzdElkIDw9IDE1CisgICAgICAgdGhlbiBCLndvcmQ4ICQgZnJvbUludGVncmFsICgoZmlkIC0gbGFzdElkKSBgc2hpZnRMYCA0KSAufC4gdHlwZU9mIHZhbAorICAgICAgIGVsc2UgQi53b3JkOCAodHlwZU9mIHZhbCkgPD4gYnVpbGRWYXJpbnQgKGkxNlRvWmlnWmFnIGZpZCkpIDw+CisgICAgICAoaWYgdHlwZU9mIHZhbCA+IDB4MDIgLS0gTm90IGEgVF9CT09MCisgICAgICAgdGhlbiBidWlsZENvbXBhY3RWYWx1ZSB2YWwKKyAgICAgICBlbHNlIG1lbXB0eSkgLS0gVF9CT09McyBhcmUgZW5jb2RlZCBpbiB0aGUgdHlwZQorYnVpbGRDb21wYWN0TWFwIDo6IFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXSAtPiBCdWlsZGVyCitidWlsZENvbXBhY3RNYXAgPSBmb2xkbCBjb21iaW5lIG1lbXB0eQorICB3aGVyZQorICAgIGNvbWJpbmUgcyAoa2V5LCB2YWwpID0gYnVpbGRDb21wYWN0VmFsdWUga2V5IDw+IGJ1aWxkQ29tcGFjdFZhbHVlIHZhbCA8PiBzCisKK2J1aWxkQ29tcGFjdExpc3QgOjogW1RocmlmdFZhbF0gLT4gQnVpbGRlcgorYnVpbGRDb21wYWN0TGlzdCA9IGZvbGRyIChtYXBwZW5kIC4gYnVpbGRDb21wYWN0VmFsdWUpIG1lbXB0eQorCistLSB8IFJlYWRpbmcgRnVuY3Rpb25zCitwYXJzZUNvbXBhY3RWYWx1ZSA6OiBUaHJpZnRUeXBlIC0+IFBhcnNlciBUaHJpZnRWYWwKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NUUlVDVCB0bWFwKSA9IFRTdHJ1Y3QgPCQ+IHBhcnNlQ29tcGFjdFN0cnVjdCB0bWFwCitwYXJzZUNvbXBhY3RWYWx1ZSAoVF9NQVAga3QnIHZ0JykgPSBkbworICBuIDwtIHBhcnNlVmFyaW50IGlkCisgIGlmIG4gPT0gMAorICAgIHRoZW4gcmV0dXJuICQgVE1hcCBrdCcgdnQnIFtdCisgICAgZWxzZSBkbworICAgIHcgPC0gUC5hbnlXb3JkOAorICAgIGxldCBrdCA9IHR5cGVGcm9tICQgdyBgc2hpZnRSYCA0CisgICAgICAgIHZ0ID0gdHlwZUZyb20gJCB3IC4mLiAweDBGCisgICAgVE1hcCBrdCB2dCA8JD4gcGFyc2VDb21wYWN0TWFwIGt0IHZ0IG4KK3BhcnNlQ29tcGFjdFZhbHVlIChUX0xJU1QgdHkpID0gVExpc3QgdHkgPCQ+IHBhcnNlQ29tcGFjdExpc3QKK3BhcnNlQ29tcGFjdFZhbHVlIChUX1NFVCB0eSkgPSBUU2V0IHR5IDwkPiBwYXJzZUNvbXBhY3RMaXN0CitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JPT0wgPSBUQm9vbCAuICgvPTApIDwkPiBQLmFueVdvcmQ4CitwYXJzZUNvbXBhY3RWYWx1ZSBUX0JZVEUgPSBUQnl0ZSAuIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0VmFsdWUgVF9JMTYgPSBUSTE2IDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0kxNgorcGFyc2VDb21wYWN0VmFsdWUgVF9JMzIgPSBUSTMyIDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgorcGFyc2VDb21wYWN0VmFsdWUgVF9JNjQgPSBUSTY0IDwkPiBwYXJzZVZhcmludCB6aWdaYWdUb0k2NAorcGFyc2VDb21wYWN0VmFsdWUgVF9ET1VCTEUgPSBURG91YmxlIC4gYnNUb0RvdWJsZUxFIDwkPiBQLnRha2UgOAorcGFyc2VDb21wYWN0VmFsdWUgVF9TVFJJTkcgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVFN0cmluZworcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkgPSBwYXJzZUNvbXBhY3RTdHJpbmcgVEJpbmFyeQorcGFyc2VDb21wYWN0VmFsdWUgdHkgPSBlcnJvciAkICJDYW5ub3QgcmVhZCB2YWx1ZSBvZiB0eXBlICIgKysgc2hvdyB0eQorCitwYXJzZUNvbXBhY3RTdHJpbmcgdHkgPSBkbworICBsZW4gOjogV29yZDMyIDwtIHBhcnNlVmFyaW50IGlkCisgIHR5IC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAoZnJvbUludGVncmFsIGxlbikKKworcGFyc2VDb21wYWN0U3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlQ29tcGFjdFN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IDwkPiBwYXJzZUZpZWxkcyAwCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZHMgOjogSW50MTYgLT4gUGFyc2VyIFsoSW50MTYsIChMVC5UZXh0LCBUaHJpZnRWYWwpKV0KKyAgICBwYXJzZUZpZWxkcyBsYXN0SWQgPSBkbworICAgICAgdyA8LSBQLmFueVdvcmQ4CisgICAgICBpZiB3ID09IDB4MDAKKyAgICAgICAgdGhlbiByZXR1cm4gW10KKyAgICAgICAgZWxzZSBkbworICAgICAgICAgIGxldCB0eSA9IHR5cGVGcm9tICh3IC4mLiAweDBGKQorICAgICAgICAgICAgICBtb2RpZmllciA9ICh3IC4mLiAweEYwKSBgc2hpZnRSYCA0CisgICAgICAgICAgZmlkIDwtIGlmIG1vZGlmaWVyIC89IDAKKyAgICAgICAgICAgICAgICAgdGhlbiByZXR1cm4gKGxhc3RJZCArIGZyb21JbnRlZ3JhbCBtb2RpZmllcikKKyAgICAgICAgICAgICAgICAgZWxzZSBwYXJzZVZhcmludCB6aWdaYWdUb0kxNgorICAgICAgICAgIHZhbCA8LSBpZiB0eSA9PSBUX0JPT0wKKyAgICAgICAgICAgICAgICAgdGhlbiByZXR1cm4gKFRCb29sICQgKHcgLiYuIDB4MEYpID09IDB4MDEpCisgICAgICAgICAgICAgICAgIGVsc2UgY2FzZSAodHksIE1hcC5sb29rdXAgZmlkIHRtYXApIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAoVF9TVFJJTkcsIEp1c3QgKF8sIFRfQklOQVJZKSkgLT4gcGFyc2VDb21wYWN0VmFsdWUgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gcGFyc2VDb21wYWN0VmFsdWUgdHkKKyAgICAgICAgICAoKGZpZCwgKExULmVtcHR5LCB2YWwpKSA6ICkgPCQ+IHBhcnNlRmllbGRzIGZpZAorCitwYXJzZUNvbXBhY3RNYXAgOjogVGhyaWZ0VHlwZSAtPiBUaHJpZnRUeXBlIC0+IEludDMyIC0+CisgICAgICAgICAgICAgICAgICAgUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VDb21wYWN0TWFwIGt0IHZ0IG4gfCBuIDw9IDAgPSByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gZG8KKyAgayA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBrdAorICB2IDwtIHBhcnNlQ29tcGFjdFZhbHVlIHZ0CisgICgoayx2KSA6KSA8JD4gcGFyc2VDb21wYWN0TWFwIGt0IHZ0IChuLTEpCisKK3BhcnNlQ29tcGFjdExpc3QgOjogUGFyc2VyIFtUaHJpZnRWYWxdCitwYXJzZUNvbXBhY3RMaXN0ID0gZG8KKyAgdyA8LSBQLmFueVdvcmQ4CisgIGxldCB0eSA9IHR5cGVGcm9tICQgdyAuJi4gMHgwRgorICAgICAgbHNpemUgPSB3IGBzaGlmdFJgIDQKKyAgc2l6ZSA8LSBpZiBsc2l6ZSA9PSAweEYKKyAgICAgICAgICB0aGVuIHBhcnNlVmFyaW50IGlkCisgICAgICAgICAgZWxzZSByZXR1cm4gJCBmcm9tSW50ZWdyYWwgbHNpemUKKyAgbG9vcCB0eSBzaXplCisgIHdoZXJlCisgICAgbG9vcCA6OiBUaHJpZnRUeXBlIC0+IEludDMyIC0+IFBhcnNlciBbVGhyaWZ0VmFsXQorICAgIGxvb3AgdHkgbiB8IG4gPD0gMCA9IHJldHVybiBbXQorICAgICAgICAgICAgICB8IG90aGVyd2lzZSA9IGxpZnRNMiAoOikgKHBhcnNlQ29tcGFjdFZhbHVlIHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIHR5IChuLTEpKQorCistLSBTaWduZWQgbnVtYmVycyBtdXN0IGJlIGNvbnZlcnRlZCB0byAiWmlnIFphZyIgZm9ybWF0IGJlZm9yZSB0aGV5IGNhbiBiZQorLS0gc2VyaWFsaXplZCBpbiB0aGUgVmFyaW50IGZvcm1hdAoraTE2VG9aaWdaYWcgOjogSW50MTYgLT4gV29yZDE2CitpMTZUb1ppZ1phZyBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0TGAgMSkgYHhvcmAgKG4gYHNoaWZ0UmAgMTUpCisKK3ppZ1phZ1RvSTE2IDo6IFdvcmQxNiAtPiBJbnQxNgoremlnWmFnVG9JMTYgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdFJgIDEpIGB4b3JgIG5lZ2F0ZSAobiAuJi4gMHgxKQorCitpMzJUb1ppZ1phZyA6OiBJbnQzMiAtPiBXb3JkMzIKK2kzMlRvWmlnWmFnIG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRMYCAxKSBgeG9yYCAobiBgc2hpZnRSYCAzMSkKKworemlnWmFnVG9JMzIgOjogV29yZDMyIC0+IEludDMyCit6aWdaYWdUb0kzMiBuID0gZnJvbUludGVncmFsICQgKG4gYHNoaWZ0UmAgMSkgYHhvcmAgbmVnYXRlIChuIC4mLiAweDEpCisKK2k2NFRvWmlnWmFnIDo6IEludDY0IC0+IFdvcmQ2NAoraTY0VG9aaWdaYWcgbiA9IGZyb21JbnRlZ3JhbCAkIChuIGBzaGlmdExgIDEpIGB4b3JgIChuIGBzaGlmdFJgIDYzKQorCit6aWdaYWdUb0k2NCA6OiBXb3JkNjQgLT4gSW50NjQKK3ppZ1phZ1RvSTY0IG4gPSBmcm9tSW50ZWdyYWwgJCAobiBgc2hpZnRSYCAxKSBgeG9yYCBuZWdhdGUgKG4gLiYuIDB4MSkKKworYnVpbGRWYXJpbnQgOjogKEJpdHMgYSwgSW50ZWdyYWwgYSkgID0+IGEgLT4gQnVpbGRlcgorYnVpbGRWYXJpbnQgbiB8IG4gLiYuIGNvbXBsZW1lbnQgMHg3RiA9PSAwID0gQi53b3JkOCAkIGZyb21JbnRlZ3JhbCBuCisgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gQi53b3JkOCAoMHg4MCAufC4gKGZyb21JbnRlZ3JhbCBuIC4mLiAweDdGKSkgPD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFZhcmludCAobiBgc2hpZnRSYCA3KQorCitwYXJzZVZhcmludCA6OiAoQml0cyBhLCBJbnRlZ3JhbCBhLCBPcmQgYSkgPT4gKGEgLT4gYikgLT4gUGFyc2VyIGIKK3BhcnNlVmFyaW50IGZyb21aaWdaYWcgPSBkbworICBieXRlc3RlbXAgPC0gQlMudW5wYWNrIDwkPiBQLnRha2VUaWxsIChub3QgLiBmbGlwIHRlc3RCaXQgNykKKyAgbHNiIDwtIFAuYW55V29yZDgKKyAgbGV0IGJ5dGVzID0gbHNiIDogTGlzdC5yZXZlcnNlIGJ5dGVzdGVtcAorICByZXR1cm4gJCBmcm9tWmlnWmFnICQgTGlzdC5mb2xkbCcgY29tYmluZSAweDAwIGJ5dGVzCisgIHdoZXJlIGNvbWJpbmUgYSBiID0gKGEgYHNoaWZ0TGAgNykgLnwuIChmcm9tSW50ZWdyYWwgYiAuJi4gMHg3ZikKKworLS0gfCBDb21wdXRlIHRoZSBDb21wYWN0IFR5cGUKK2Zyb21UVHlwZSA6OiBUaHJpZnRUeXBlIC0+IFdvcmQ4Citmcm9tVFR5cGUgdHkgPSBjYXNlIHR5IG9mCisgIFRfU1RPUCAtPiAweDAwCisgIFRfQk9PTCAtPiAweDAxCisgIFRfQllURSAtPiAweDAzCisgIFRfSTE2IC0+IDB4MDQKKyAgVF9JMzIgLT4gMHgwNQorICBUX0k2NCAtPiAweDA2CisgIFRfRE9VQkxFIC0+IDB4MDcKKyAgVF9TVFJJTkcgLT4gMHgwOAorICBUX0JJTkFSWSAtPiAweDA4CisgIFRfTElTVHt9IC0+IDB4MDkKKyAgVF9TRVR7fSAtPiAweDBBCisgIFRfTUFQe30gLT4gMHgwQgorICBUX1NUUlVDVHt9IC0+IDB4MEMKKyAgVF9WT0lEIC0+IGVycm9yICJObyBDb21wYWN0IHR5cGUgZm9yIFRfVk9JRCIKKwordHlwZU9mIDo6IFRocmlmdFZhbCAtPiBXb3JkOAordHlwZU9mIHYgPSBjYXNlIHYgb2YKKyAgVEJvb2wgVHJ1ZSAtPiAweDAxCisgIFRCb29sIEZhbHNlIC0+IDB4MDIKKyAgVEJ5dGUgXyAtPiAweDAzCisgIFRJMTYgXyAtPiAweDA0CisgIFRJMzIgXyAtPiAweDA1CisgIFRJNjQgXyAtPiAweDA2CisgIFREb3VibGUgXyAtPiAweDA3CisgIFRTdHJpbmcgXyAtPiAweDA4CisgIFRCaW5hcnkgXyAtPiAweDA4CisgIFRMaXN0e30gLT4gMHgwOQorICBUU2V0e30gLT4gMHgwQQorICBUTWFwe30gLT4gMHgwQgorICBUU3RydWN0e30gLT4gMHgwQworCit0eXBlRnJvbSA6OiBXb3JkOCAtPiBUaHJpZnRUeXBlCit0eXBlRnJvbSB3ID0gY2FzZSB3IG9mCisgIDB4MDEgLT4gVF9CT09MCisgIDB4MDIgLT4gVF9CT09MCisgIDB4MDMgLT4gVF9CWVRFCisgIDB4MDQgLT4gVF9JMTYKKyAgMHgwNSAtPiBUX0kzMgorICAweDA2IC0+IFRfSTY0CisgIDB4MDcgLT4gVF9ET1VCTEUKKyAgMHgwOCAtPiBUX1NUUklORworICAweDA5IC0+IFRfTElTVCBUX1ZPSUQKKyAgMHgwQSAtPiBUX1NFVCBUX1ZPSUQKKyAgMHgwQiAtPiBUX01BUCBUX1ZPSUQgVF9WT0lECisgIDB4MEMgLT4gVF9TVFJVQ1QgTWFwLmVtcHR5CisgIG4gLT4gZXJyb3IgJCAidHlwZUZyb206ICIgKysgc2hvdyBuICsrICIgaXMgbm90IGEgY29tcGFjdCB0eXBlIgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNDJkYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9IZWFkZXIuaHMKQEAgLTAsMCArMSwxNDEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCisKK21vZHVsZSBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBIZWFkZXJQcm90b2NvbCguLikKKyAgICAsIGdldFByb3RvY29sVHlwZQorICAgICwgc2V0UHJvdG9jb2xUeXBlCisgICAgLCBnZXRIZWFkZXJzCisgICAgLCBnZXRXcml0ZUhlYWRlcnMKKyAgICAsIHNldEhlYWRlcgorICAgICwgc2V0SGVhZGVycworICAgICwgY3JlYXRlSGVhZGVyUHJvdG9jb2wKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sMQorICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IHF1YWxpZmllZCBEYXRhLk1hcCBhcyBNYXAKKworZGF0YSBQcm90b2NvbFdyYXAgPSBmb3JhbGwgYS4gKFByb3RvY29sIGEpID0+IFByb3RvY29sV3JhcChhKQorCitpbnN0YW5jZSBQcm90b2NvbCBQcm90b2NvbFdyYXAgd2hlcmUKKyAgcmVhZEJ5dGUgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRCeXRlIHAKKyAgcmVhZFZhbCAoUHJvdG9jb2xXcmFwIHApID0gcmVhZFZhbCBwCisgIHJlYWRNZXNzYWdlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkTWVzc2FnZSBwCisgIHdyaXRlVmFsIChQcm90b2NvbFdyYXAgcCkgPSB3cml0ZVZhbCBwCisgIHdyaXRlTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVNZXNzYWdlIHAKKworZGF0YSBIZWFkZXJQcm90b2NvbCBpIG8gPSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCB7CisgICAgdHJhbnMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbywKKyAgICB3cmFwcGVkUHJvdG8gOjogSU9SZWYgUHJvdG9jb2xXcmFwCisgIH0KKworY3JlYXRlUHJvdG9jb2xXcmFwIDo6IFRyYW5zcG9ydCB0ID0+IFByb3RvY29sVHlwZSAtPiB0IC0+IFByb3RvY29sV3JhcAorY3JlYXRlUHJvdG9jb2xXcmFwIHR5cCB0ID0KKyAgY2FzZSB0eXAgb2YKKyAgICBUQmluYXJ5IC0+IFByb3RvY29sV3JhcCAkIEJpbmFyeVByb3RvY29sIHQKKyAgICBUQ29tcGFjdCAtPiBQcm90b2NvbFdyYXAgJCBDb21wYWN0UHJvdG9jb2wgdAorICAgIFRKU09OIC0+IFByb3RvY29sV3JhcCAkIEpTT05Qcm90b2NvbCB0CisKK2NyZWF0ZUhlYWRlclByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyhIZWFkZXJQcm90b2NvbCBpIG8pCitjcmVhdGVIZWFkZXJQcm90b2NvbCBpIG8gPSBkbworICB0IDwtIG9wZW5IZWFkZXJUcmFuc3BvcnQgaSBvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBwcm90byA8LSBuZXdJT1JlZiAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgdAorICByZXR1cm4gJCBIZWFkZXJQcm90b2NvbCB7IHRyYW5zID0gdCwgd3JhcHBlZFByb3RvID0gcHJvdG8gfQorCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgOjogVHJhbnNwb3J0IHQgPT4gdCAtPiBJTyhIZWFkZXJQcm90b2NvbCB0IHQpCitjcmVhdGVIZWFkZXJQcm90b2NvbDEgdCA9IGNyZWF0ZUhlYWRlclByb3RvY29sIHQgdAorCityZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBJTyAoKQorcmVzZXRQcm90b2NvbCBwID0gZG8KKyAgcGlkIDwtIHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKyAgd3JpdGVJT1JlZiAod3JhcHBlZFByb3RvIHApICQgY3JlYXRlUHJvdG9jb2xXcmFwIHBpZCAkIHRyYW5zIHAKKworZ2V0V3JhcHBlZCA9IHJlYWRJT1JlZiAuIHdyYXBwZWRQcm90bworCitzZXRUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc3BvcnQgcCB0ID0gcCB7IHRyYW5zID0gdCB9CisKK3VwZGF0ZVRyYW5zcG9ydCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gKEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSGVhZGVyVHJhbnNwb3J0IGkgbyktPiBIZWFkZXJQcm90b2NvbCBpIG8KK3VwZGF0ZVRyYW5zcG9ydCBwIGYgPSBzZXRUcmFuc3BvcnQgcCAoZiAkIHRyYW5zIHApCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCistLSBUT0RPOiB3ZSB3YW50IHRvIHNldCBoZWFkZXJzIHdpdGhvdXQgcmVjcmVhdGluZyBjbGllbnQuLi4KK3NldEhlYWRlciA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gU3RyaW5nIC0+IFN0cmluZyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlciBwIGsgdiA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlSGVhZGVycyA9IE1hcC5pbnNlcnQgayB2ICQgd3JpdGVIZWFkZXJzIHQgfQorCitzZXRIZWFkZXJzIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJzIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0SGVhZGVycyBwIGggPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBoIH0KKworLS0gVE9ETzogbWFrZSBpdCBwdWJsaWMgb25jZSB3ZSBoYXZlIGZpcnN0IHRyYW5zZm9ybSBpbXBsZW1lbnRhdGlvbiBmb3IgSGFza2VsbAorc2V0VHJhbnNmb3JtcyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gW1RyYW5zZm9ybVR5cGVdIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNmb3JtcyBwIHRycyA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRycyB9CisKK3NldFRyYW5zZm9ybSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gVHJhbnNmb3JtVHlwZSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybSBwIHRyID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVUcmFuc2Zvcm1zID0gdHI6KHdyaXRlVHJhbnNmb3JtcyB0KSB9CisKK2dldFdyaXRlSGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycworZ2V0V3JpdGVIZWFkZXJzID0gd3JpdGVIZWFkZXJzIC4gdHJhbnMKKworZ2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gWyhTdHJpbmcsIFN0cmluZyldCitnZXRIZWFkZXJzID0gcmVhZElPUmVmIC4gaGVhZGVycyAuIHRyYW5zCisKK2dldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbFR5cGUgcCA9IHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSAkIHRyYW5zIHAKKworc2V0UHJvdG9jb2xUeXBlIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBQcm90b2NvbFR5cGUgLT4gSU8gKCkKK3NldFByb3RvY29sVHlwZSBwIHR5cCA9IGRvCisgIHR5cDAgPC0gZ2V0UHJvdG9jb2xUeXBlIHAKKyAgaWYgdHlwID09IHR5cDAKKyAgICB0aGVuIHJldHVybiAoKQorICAgIGVsc2UgZG8KKyAgICAgIHRTZXRQcm90b2NvbCAodHJhbnMgcCkgdHlwCisgICAgICByZXNldFByb3RvY29sIHAKKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gUHJvdG9jb2wgKEhlYWRlclByb3RvY29sIGkgbykgd2hlcmUKKyAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsICh0cmFucyBwKSAxCisKKyAgcmVhZFZhbCBwIHRwID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkVmFsIHByb3RvIHRwCisKKyAgcmVhZE1lc3NhZ2UgcCBmID0gZG8KKyAgICB0UmVzZXRQcm90b2NvbCAodHJhbnMgcCkKKyAgICByZXNldFByb3RvY29sIHAKKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICByZWFkTWVzc2FnZSBwcm90byBmCisKKyAgd3JpdGVWYWwgcCB2ID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZVZhbCBwcm90byB2CisKKyAgd3JpdGVNZXNzYWdlIHAgeCBmID0gZG8KKyAgICBwcm90byA8LSBnZXRXcmFwcGVkIHAKKyAgICB3cml0ZU1lc3NhZ2UgcHJvdG8geCBmCisKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWVkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCkBAIC0wLDAgKzEsMzYyIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworey0jIExBTkdVQUdFIENQUCAjLX0KK3stIyBMQU5HVUFHRSBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uICMtfQorey0jIExBTkdVQUdFIE92ZXJsb2FkZWRTdHJpbmdzICMtfQorey0jIExBTkdVQUdFIFNjb3BlZFR5cGVWYXJpYWJsZXMgIy19Cit7LSMgTEFOR1VBR0UgVHVwbGVTZWN0aW9ucyAjLX0KKworbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5KU09OCisgICAgKCBtb2R1bGUgVGhyaWZ0LlByb3RvY29sCisgICAgLCBKU09OUHJvdG9jb2woLi4pCisgICAgKSB3aGVyZQorCitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uIChicmFja2V0KQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZyBhcyBQCitpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuQ2hhcjggYXMgUEMKK2ltcG9ydCBEYXRhLkF0dG9wYXJzZWMuQnl0ZVN0cmluZy5MYXp5IGFzIExQCitpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkJhc2U2NC5MYXp5IGFzIEI2NEMKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydywgdzJjKQoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSW50CitpbXBvcnQgRGF0YS5MaXN0CitpbXBvcnQgRGF0YS5NYXliZSAoY2F0TWF5YmVzKQoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5UZXh0LkxhenkuRW5jb2RpbmcKK2ltcG9ydCBEYXRhLldvcmQKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKKworaW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHlwZXMKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgTEJTQworaW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBMVAorCistLSB8IFRoZSBKU09OIFByb3RvY29sIGRhdGEgdXNlcyB0aGUgc3RhbmRhcmQgJ1RKU09OUHJvdG9jb2wnLiAgRGF0YSBpcworLS0gZW5jb2RlZCBhcyBhIEpTT04gJ0J5dGVTdHJpbmcnCitkYXRhIEpTT05Qcm90b2NvbCB0ID0gSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAtLSBeIENvbnN0cnVjdCBhICdKU09OUHJvdG9jb2wnIHdpdGggYSAnVHJhbnNwb3J0JworZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IEpTT05Qcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbCAoSlNPTlByb3RvY29sIHQpIHdoZXJlCisgICAgcmVhZEJ5dGUgcCA9IHRSZWFkQWxsIChnZXRUcmFuc3BvcnQgcCkgMQorCisgICAgd3JpdGVNZXNzYWdlIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSBicmFja2V0IHJlYWRNZXNzYWdlQmVnaW4gcmVhZE1lc3NhZ2VFbmQgLiBjb25zdAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHRXcml0ZSB0ICQgdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KKyAgICAgICAgICBCLnN0cmluZzggIixcIiIgPD4gZXNjYXBlIChlbmNvZGVVdGY4IHMpIDw+IEIuY2hhcjggJ1wiJyA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGZyb21FbnVtIHR5KSA8PgorICAgICAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KKyAgICAgICAgICBCLmNoYXI4ICcsJworICAgICAgICByZWFkTWVzc2FnZUVuZCBfID0gZG8KKyAgICAgICAgICB0V3JpdGUgdCAiXSIKKyAgICAgICAgICB0Rmx1c2ggdAorCisgICAgcmVhZE1lc3NhZ2UgcCA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZAorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IGRvCisgICAgICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICBicyA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGVzY2FwZWRTdHJpbmcKKyAgICAgICAgICBjYXNlIGRlY29kZVV0ZjgnIGJzIG9mCisgICAgICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKKyAgICAgICAgICAgIFJpZ2h0IHN0ciAtPiBkbworICAgICAgICAgICAgICB0eSA8LSB0b0VudW0gPCQ+IChsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkpCisgICAgICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKKyAgICAgICAgICAgICAgXyA8LSBQQy5jaGFyOCAnLCcKKyAgICAgICAgICAgICAgcmV0dXJuIChzdHIsIHR5LCBzZXFOdW0pCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKworICAgIHdyaXRlVmFsIHAgPSB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSAuIHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIHJlYWRWYWwgcCB0eSA9IHJ1blBhcnNlciBwICQgc2tpcFNwYWNlICo+IHBhcnNlSlNPTlZhbHVlIHR5CisKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFN0YXRlbGVzc1Byb3RvY29sIChKU09OUHJvdG9jb2wgdCkgd2hlcmUKKyAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEpTT05WYWx1ZQorICAgIGRlc2VyaWFsaXplVmFsIF8gdHkgYnMgPQorICAgICAgY2FzZSBMUC5laXRoZXJSZXN1bHQgJCBMUC5wYXJzZSAocGFyc2VKU09OVmFsdWUgdHkpIGJzIG9mCisgICAgICAgIExlZnQgcyAtPiBlcnJvciBzCisgICAgICAgIFJpZ2h0IHZhbCAtPiB2YWwKKworLS0gV3JpdGluZyBGdW5jdGlvbnMKKworYnVpbGRKU09OVmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKK2J1aWxkSlNPTlZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBCLmNoYXI4ICd7JyA8PiBidWlsZEpTT05TdHJ1Y3QgZmllbGRzIDw+IEIuY2hhcjggJ30nCitidWlsZEpTT05WYWx1ZSAoVE1hcCBrdCB2dCBlbnRyaWVzKSA9CisgIEIuY2hhcjggJ1snIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIGt0IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IEIuY2hhcjggJyInIDw+IGdldFR5cGVOYW1lIHZ0IDw+IEIuY2hhcjggJyInIDw+CisgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgKGxlbmd0aCBlbnRyaWVzKSA8PgorICBCLmNoYXI4ICcsJyA8PiBCLmNoYXI4ICd7JyA8PiBidWlsZEpTT05NYXAgZW50cmllcyA8PiBCLmNoYXI4ICd9JyA8PgorICBCLmNoYXI4ICddJworYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpID0KKyAgQi5jaGFyOCAnWycgPD4gQi5jaGFyOCAnIicgPD4gZ2V0VHlwZU5hbWUgdHkgPD4gQi5jaGFyOCAnIicgPD4KKyAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAobGVuZ3RoIGVudHJpZXMpIDw+CisgIChpZiBsZW5ndGggZW50cmllcyA+IDAKKyAgIHRoZW4gQi5jaGFyOCAnLCcgPD4gYnVpbGRKU09OTGlzdCBlbnRyaWVzCisgICBlbHNlIG1lbXB0eSkgPD4KKyAgQi5jaGFyOCAnXScKK2J1aWxkSlNPTlZhbHVlIChUU2V0IHR5IGVudHJpZXMpID0gYnVpbGRKU09OVmFsdWUgKFRMaXN0IHR5IGVudHJpZXMpCitidWlsZEpTT05WYWx1ZSAoVEJvb2wgYikgPSBpZiBiIHRoZW4gQi5jaGFyOCAnMScgZWxzZSBCLmNoYXI4ICcwJworYnVpbGRKU09OVmFsdWUgKFRCeXRlIGIpID0gYnVpbGRTaG93YWJsZSBiCitidWlsZEpTT05WYWx1ZSAoVEkxNiBpKSA9IGJ1aWxkU2hvd2FibGUgaQorYnVpbGRKU09OVmFsdWUgKFRJMzIgaSkgPSBidWlsZFNob3dhYmxlIGkKK2J1aWxkSlNPTlZhbHVlIChUSTY0IGkpID0gYnVpbGRTaG93YWJsZSBpCitidWlsZEpTT05WYWx1ZSAoVERvdWJsZSBkKSA9IGJ1aWxkU2hvd2FibGUgZAorYnVpbGRKU09OVmFsdWUgKFRTdHJpbmcgcykgPSBCLmNoYXI4ICdcIicgPD4gZXNjYXBlIHMgPD4gQi5jaGFyOCAnXCInCitidWlsZEpTT05WYWx1ZSAoVEJpbmFyeSBzKSA9IEIuY2hhcjggJ1wiJyA8PiAoQi5sYXp5Qnl0ZVN0cmluZyAuIEI2NEMuZW5jb2RlICQgcykgPD4gQi5jaGFyOCAnXCInCisKK2J1aWxkSlNPTlN0cnVjdCA6OiBNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSAtPiBCdWlsZGVyCitidWlsZEpTT05TdHJ1Y3QgPSBtY29uY2F0IC4gaW50ZXJzcGVyc2UgKEIuY2hhcjggJywnKSAuIE1hcC5mb2xkcldpdGhLZXkgYnVpbGRGaWVsZCBbXQorICB3aGVyZSAKKyAgICBidWlsZEZpZWxkIGZpZCAoXyx2YWwpID0gKDopICQKKyAgICAgIEIuY2hhcjggJyInIDw+IGJ1aWxkU2hvd2FibGUgZmlkIDw+IEIuc3RyaW5nOCAiXCI6IiA8PiAKKyAgICAgIEIuY2hhcjggJ3snIDw+CisgICAgICBCLmNoYXI4ICciJyA8PiBnZXRUeXBlTmFtZSAoZ2V0VHlwZU9mIHZhbCkgPD4gQi5zdHJpbmc4ICJcIjoiIDw+CisgICAgICBidWlsZEpTT05WYWx1ZSB2YWwgPD4KKyAgICAgIEIuY2hhcjggJ30nCisKK2J1aWxkSlNPTk1hcCA6OiBbKFRocmlmdFZhbCwgVGhyaWZ0VmFsKV0gLT4gQnVpbGRlcgorYnVpbGRKU09OTWFwID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBtYXAgYnVpbGRLVgorICB3aGVyZQorICAgIGJ1aWxkS1YgKGtleUAoVFN0cmluZyBfKSwgdmFsKSA9CisgICAgICBidWlsZEpTT05WYWx1ZSBrZXkgPD4gQi5jaGFyOCAnOicgPD4gYnVpbGRKU09OVmFsdWUgdmFsCisgICAgYnVpbGRLViAoa2V5LCB2YWwpID0KKyAgICAgIEIuY2hhcjggJ1wiJyA8PiBidWlsZEpTT05WYWx1ZSBrZXkgPD4gQi5zdHJpbmc4ICJcIjoiIDw+IGJ1aWxkSlNPTlZhbHVlIHZhbAorYnVpbGRKU09OTGlzdCA6OiBbVGhyaWZ0VmFsXSAtPiBCdWlsZGVyCitidWlsZEpTT05MaXN0ID0gbWNvbmNhdCAuIGludGVyc3BlcnNlIChCLmNoYXI4ICcsJykgLiBtYXAgYnVpbGRKU09OVmFsdWUKKworYnVpbGRTaG93YWJsZSA6OiBTaG93IGEgPT4gYSAtPiAgQnVpbGRlcgorYnVpbGRTaG93YWJsZSA9IEIuc3RyaW5nOCAuIHNob3cKKworLS0gUmVhZGluZyBGdW5jdGlvbnMKKworcGFyc2VKU09OVmFsdWUgOjogVGhyaWZ0VHlwZSAtPiBQYXJzZXIgVGhyaWZ0VmFsCitwYXJzZUpTT05WYWx1ZSAoVF9TVFJVQ1QgdG1hcCkgPQorICBUU3RydWN0IDwkPiAobGV4ZW1lIChQQy5jaGFyOCAneycpICo+IHBhcnNlSlNPTlN0cnVjdCB0bWFwIDwqIFBDLmNoYXI4ICd9JykKK3BhcnNlSlNPTlZhbHVlIChUX01BUCBrdCB2dCkgPSBmbWFwIChUTWFwIGt0IHZ0KSAkCisgIGJldHdlZW4gJ1snICddJyAkCisgICAgbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgbGV4ZW1lIGVzY2FwZWRTdHJpbmcgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgbGV4ZW1lIGRlY2ltYWwgKj4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+CisgICAgYmV0d2VlbiAneycgJ30nIChwYXJzZUpTT05NYXAga3QgdnQpCitwYXJzZUpTT05WYWx1ZSAoVF9MSVNUIHR5KSA9IGZtYXAgKFRMaXN0IHR5KSAkCisgIGJldHdlZW4gJ1snICddJyAkIGRvCisgICAgbGVuIDwtIGxleGVtZSBlc2NhcGVkU3RyaW5nICo+IGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZGVjaW1hbAorICAgIGlmIGxlbiA+IDAKKyAgICAgIHRoZW4gbGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IHBhcnNlSlNPTkxpc3QgdHkKKyAgICAgIGVsc2UgcmV0dXJuIFtdCitwYXJzZUpTT05WYWx1ZSAoVF9TRVQgdHkpID0gZm1hcCAoVFNldCB0eSkgJAorICBiZXR3ZWVuICdbJyAnXScgJCBkbworICAgIGxlbiA8LSBsZXhlbWUgZXNjYXBlZFN0cmluZyAqPiBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIGRlY2ltYWwKKyAgICBpZiBsZW4gPiAwCisgICAgICB0aGVuICBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gcGFyc2VKU09OTGlzdCB0eQorICAgICAgZWxzZSByZXR1cm4gW10KK3BhcnNlSlNPTlZhbHVlIFRfQk9PTCA9CisgIChUQm9vbCBUcnVlIDwkIFBDLmNoYXI4ICcxJykgPHw+IChUQm9vbCBGYWxzZSA8JCBQQy5jaGFyOCAnMCcpCitwYXJzZUpTT05WYWx1ZSBUX0JZVEUgPSBUQnl0ZSA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTE2ID0gVEkxNiA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTMyID0gVEkzMiA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfSTY0ID0gVEk2NCA8JD4gc2lnbmVkIGRlY2ltYWwKK3BhcnNlSlNPTlZhbHVlIFRfRE9VQkxFID0gVERvdWJsZSA8JD4gZG91YmxlCitwYXJzZUpTT05WYWx1ZSBUX1NUUklORyA9IFRTdHJpbmcgPCQ+IGVzY2FwZWRTdHJpbmcKK3BhcnNlSlNPTlZhbHVlIFRfQklOQVJZID0gVEJpbmFyeSA8JD4gYmFzZTY0U3RyaW5nCitwYXJzZUpTT05WYWx1ZSBUX1NUT1AgPSBmYWlsICJwYXJzZUpTT05WYWx1ZTogY2Fubm90IHBhcnNlIHR5cGUgVF9TVE9QIgorcGFyc2VKU09OVmFsdWUgVF9WT0lEID0gZmFpbCAicGFyc2VKU09OVmFsdWU6IGNhbm5vdCBwYXJzZSB0eXBlIFRfVk9JRCIKKworcGFyc2VBbnlWYWx1ZSA6OiBQYXJzZXIgKCkKK3BhcnNlQW55VmFsdWUgPSBjaG9pY2UgJAorICAgICAgICAgICAgICAgIHNraXBCZXR3ZWVuICd7JyAnfScgOgorICAgICAgICAgICAgICAgIHNraXBCZXR3ZWVuICdbJyAnXScgOgorICAgICAgICAgICAgICAgIG1hcCAodm9pZCAuIHBhcnNlSlNPTlZhbHVlKQorICAgICAgICAgICAgICAgICAgWyBUX0JPT0wKKyAgICAgICAgICAgICAgICAgICwgVF9JMTYKKyAgICAgICAgICAgICAgICAgICwgVF9JMzIKKyAgICAgICAgICAgICAgICAgICwgVF9JNjQKKyAgICAgICAgICAgICAgICAgICwgVF9ET1VCTEUKKyAgICAgICAgICAgICAgICAgICwgVF9TVFJJTkcKKyAgICAgICAgICAgICAgICAgICwgVF9CSU5BUlkKKyAgICAgICAgICAgICAgICAgIF0KKyAgd2hlcmUKKyAgICBza2lwQmV0d2VlbiA6OiBDaGFyIC0+IENoYXIgLT4gUGFyc2VyICgpCisgICAgc2tpcEJldHdlZW4gYSBiID0gYmV0d2VlbiBhIGIgJCB2b2lkIChQQy5zYXRpc2Z5IChcYyAtPiBjIC89IGEgJiYgYyAvPSBiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx8PiBza2lwQmV0d2VlbiBhIGIKKworcGFyc2VKU09OU3RydWN0IDo6IFR5cGVNYXAgLT4gUGFyc2VyIChNYXAuSGFzaE1hcCBJbnQxNiAoTFQuVGV4dCwgVGhyaWZ0VmFsKSkKK3BhcnNlSlNPTlN0cnVjdCB0bWFwID0gTWFwLmZyb21MaXN0IC4gY2F0TWF5YmVzIDwkPiBwYXJzZUZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgIGBzZXBCeWAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisgIHdoZXJlCisgICAgcGFyc2VGaWVsZCA9IGRvCisgICAgICBmaWQgPC0gbGV4ZW1lIChiZXR3ZWVuICciJyAnIicgZGVjaW1hbCkgPCogbGV4ZW1lIChQQy5jaGFyOCAnOicpCisgICAgICBjYXNlIE1hcC5sb29rdXAgZmlkIHRtYXAgb2YKKyAgICAgICAgSnVzdCAoc3RyLCBmdHlwZSkgLT4gYmV0d2VlbiAneycgJ30nICQgZG8KKyAgICAgICAgICBfIDwtIGxleGVtZSAoZXNjYXBlZFN0cmluZykgKj4gbGV4ZW1lIChQQy5jaGFyOCAnOicpCisgICAgICAgICAgdmFsIDwtIGxleGVtZSAocGFyc2VKU09OVmFsdWUgZnR5cGUpCisgICAgICAgICAgcmV0dXJuICQgSnVzdCAoZmlkLCAoc3RyLCB2YWwpKQorICAgICAgICBOb3RoaW5nIC0+IGxleGVtZSBwYXJzZUFueVZhbHVlICo+IHJldHVybiBOb3RoaW5nCisKK3BhcnNlSlNPTk1hcCA6OiBUaHJpZnRUeXBlIC0+IFRocmlmdFR5cGUgLT4gUGFyc2VyIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorcGFyc2VKU09OTWFwIGt0IHZ0ID0KKyAgKCgsKSA8JD4gbGV4ZW1lIChwYXJzZUpTT05LZXkga3QpIDwqPgorICAgKGxleGVtZSAoUEMuY2hhcjggJzonKSAqPiBsZXhlbWUgKHBhcnNlSlNPTlZhbHVlIHZ0KSkpIGBzZXBCeWAKKyAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisgIHdoZXJlCisgICAgcGFyc2VKU09OS2V5IFRfU1RSSU5HID0gcGFyc2VKU09OVmFsdWUgVF9TVFJJTkcKKyAgICBwYXJzZUpTT05LZXkgVF9CSU5BUlkgPSBwYXJzZUpTT05WYWx1ZSBUX0JJTkFSWQorICAgIHBhcnNlSlNPTktleSBrdCA9IFBDLmNoYXI4ICciJyAqPiBwYXJzZUpTT05WYWx1ZSBrdCA8KiBQQy5jaGFyOCAnIicKKworcGFyc2VKU09OTGlzdCA6OiBUaHJpZnRUeXBlIC0+IFBhcnNlciBbVGhyaWZ0VmFsXQorcGFyc2VKU09OTGlzdCB0eSA9IGxleGVtZSAocGFyc2VKU09OVmFsdWUgdHkpIGBzZXBCeWAgbGV4ZW1lIChQQy5jaGFyOCAnLCcpCisKK2VzY2FwZWRTdHJpbmcgOjogUGFyc2VyIExCUy5CeXRlU3RyaW5nCitlc2NhcGVkU3RyaW5nID0gUEMuY2hhcjggJyInICo+CisgICAgICAgICAgICAgICAgKExCUy5wYWNrIDwkPiBQLm1hbnknIChlc2NhcGVkQ2hhciA8fD4gbm90Q2hhcjggJyInKSkgPCoKKyAgICAgICAgICAgICAgICBQQy5jaGFyOCAnIicKKworYmFzZTY0U3RyaW5nIDo6IFBhcnNlciBMQlMuQnl0ZVN0cmluZworYmFzZTY0U3RyaW5nID0gUEMuY2hhcjggJyInICo+CisgICAgICAgICAgICAgICAoZGVjb2RlQmFzZTY0IC4gTEJTQy5wYWNrIDwkPiBQLm1hbnknIChQQy5ub3RDaGFyICciJykpIDwqCisgICAgICAgICAgICAgICBQQy5jaGFyOCAnIicKKyAgICAgICAgICAgICAgIHdoZXJlCisgICAgICAgICAgICAgICAgIGRlY29kZUJhc2U2NCBiID0KKyAgICAgICAgICAgICAgICAgICBsZXQgcGFkZGVkID0gY2FzZSAoTEJTLmxlbmd0aCBiKSBgbW9kYCA0IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAtPiBMQlMuYXBwZW5kIGIgIj09IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgLT4gTEJTLmFwcGVuZCBiICI9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gLT4gYiBpbgorICAgICAgICAgICAgICAgICAgIGNhc2UgQjY0Qy5kZWNvZGUgcGFkZGVkIG9mCisgICAgICAgICAgICAgICAgICAgICBSaWdodCBzIC0+IHMKKyAgICAgICAgICAgICAgICAgICAgIExlZnQgeCAtPiBlcnJvciB4CisKK2VzY2FwZWRDaGFyIDo6IFBhcnNlciBXb3JkOAorZXNjYXBlZENoYXIgPSBQQy5jaGFyOCAnXFwnICo+IChjMncgPCQ+IGNob2ljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICdcU09IJyA8JCBQLnN0cmluZyAidTAwMDEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTVFgnIDwkIFAuc3RyaW5nICJ1MDAwMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVUWCcgPCQgUC5zdHJpbmcgInUwMDAzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRU9UJyA8JCBQLnN0cmluZyAidTAwMDQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFTlEnIDwkIFAuc3RyaW5nICJ1MDAwNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEFDSycgPCQgUC5zdHJpbmcgInUwMDA2IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQkVMJyA8JCBQLnN0cmluZyAidTAwMDciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xCUycgIDwkIFAuc3RyaW5nICJ1MDAwOCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFZUJyAgPCQgUC5zdHJpbmcgInUwMDBiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRkYnICA8JCBQLnN0cmluZyAidTAwMGMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xDUicgIDwkIFAuc3RyaW5nICJ1MDAwZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNPJyAgPCQgUC5zdHJpbmcgInUwMDBlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcU0knICA8JCBQLnN0cmluZyAidTAwMGYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xETEUnIDwkIFAuc3RyaW5nICJ1MDAxMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDMScgPCQgUC5zdHJpbmcgInUwMDExIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcREMyJyA8JCBQLnN0cmluZyAidTAwMTIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xEQzMnIDwkIFAuc3RyaW5nICJ1MDAxMyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERDNCcgPCQgUC5zdHJpbmcgInUwMDE0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcTkFLJyA8JCBQLnN0cmluZyAidTAwMTUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xTWU4nIDwkIFAuc3RyaW5nICJ1MDAxNiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEVUQicgPCQgUC5zdHJpbmcgInUwMDE3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcQ0FOJyA8JCBQLnN0cmluZyAidTAwMTgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xFTScgIDwkIFAuc3RyaW5nICJ1MDAxOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXFNVQicgPCQgUC5zdHJpbmcgInUwMDFhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcRVNDJyA8JCBQLnN0cmluZyAidTAwMWIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xGUycgIDwkIFAuc3RyaW5nICJ1MDAxYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXEdTJyAgPCQgUC5zdHJpbmcgInUwMDFkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcUlMnICA8JCBQLnN0cmluZyAidTAwMWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xVUycgIDwkIFAuc3RyaW5nICJ1MDAxZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXERFTCcgPCQgUC5zdHJpbmcgInUwMDdmIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcMCcgPCQgUEMuY2hhciAnMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXGEnIDwkIFBDLmNoYXIgJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xiJyA8JCBQQy5jaGFyICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcZicgPCQgUEMuY2hhciAnZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXG4nIDwkIFBDLmNoYXIgJ24nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xyJyA8JCBQQy5jaGFyICdyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcdCcgPCQgUEMuY2hhciAndCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnXHYnIDwkIFBDLmNoYXIgJ3YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1wiJyA8JCBQQy5jaGFyICciJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICdcJycgPCQgUEMuY2hhciAnXCcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgJ1xcJyA8JCBQQy5jaGFyICdcXCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAnLycgIDwkIFBDLmNoYXIgJy8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKK2VzY2FwZSA6OiBMQlMuQnl0ZVN0cmluZyAtPiBCdWlsZGVyCitlc2NhcGUgPSBMQlMuZm9sZGwnIGVzY2FwZUNoYXIgbWVtcHR5CisgIHdoZXJlCisgICAgZXNjYXBlQ2hhciBiIHcgPSBiIDw+IChCLmxhenlCeXRlU3RyaW5nICQgY2FzZSB3MmMgdyBvZgorICAgICAgJ1wwJyAtPiAiXFwwIgorICAgICAgJ1xiJyAtPiAiXFxiIgorICAgICAgJ1xmJyAtPiAiXFxmIgorICAgICAgJ1xuJyAtPiAiXFxuIgorICAgICAgJ1xyJyAtPiAiXFxyIgorICAgICAgJ1x0JyAtPiAiXFx0IgorICAgICAgJ1wiJyAtPiAiXFxcIiIKKyAgICAgICdcXCcgLT4gIlxcXFwiCisgICAgICAnXFNPSCcgLT4gIlxcdTAwMDEiCisgICAgICAnXFNUWCcgLT4gIlxcdTAwMDIiCisgICAgICAnXEVUWCcgLT4gIlxcdTAwMDMiCisgICAgICAnXEVPVCcgLT4gIlxcdTAwMDQiCisgICAgICAnXEVOUScgLT4gIlxcdTAwMDUiCisgICAgICAnXEFDSycgLT4gIlxcdTAwMDYiCisgICAgICAnXEJFTCcgLT4gIlxcdTAwMDciCisgICAgICAnXFZUJyAgLT4gIlxcdTAwMGIiCisgICAgICAnXFNPJyAgLT4gIlxcdTAwMGUiCisgICAgICAnXFNJJyAgLT4gIlxcdTAwMGYiCisgICAgICAnXERMRScgLT4gIlxcdTAwMTAiCisgICAgICAnXERDMScgLT4gIlxcdTAwMTEiCisgICAgICAnXERDMicgLT4gIlxcdTAwMTIiCisgICAgICAnXERDMycgLT4gIlxcdTAwMTMiCisgICAgICAnXERDNCcgLT4gIlxcdTAwMTQiCisgICAgICAnXE5BSycgLT4gIlxcdTAwMTUiCisgICAgICAnXFNZTicgLT4gIlxcdTAwMTYiCisgICAgICAnXEVUQicgLT4gIlxcdTAwMTciCisgICAgICAnXENBTicgLT4gIlxcdTAwMTgiCisgICAgICAnXEVNJyAgLT4gIlxcdTAwMTkiCisgICAgICAnXFNVQicgLT4gIlxcdTAwMWEiCisgICAgICAnXEVTQycgLT4gIlxcdTAwMWIiCisgICAgICAnXEZTJyAgLT4gIlxcdTAwMWMiCisgICAgICAnXEdTJyAgLT4gIlxcdTAwMWQiCisgICAgICAnXFJTJyAgLT4gIlxcdTAwMWUiCisgICAgICAnXFVTJyAgLT4gIlxcdTAwMWYiCisgICAgICAnXERFTCcgLT4gIlxcdTAwN2YiCisgICAgICBfIC0+IExCUy5zaW5nbGV0b24gdykKKworbGV4ZW1lIDo6IFBhcnNlciBhIC0+IFBhcnNlciBhCitsZXhlbWUgPSAoPCogc2tpcFNwYWNlKQorCitub3RDaGFyOCA6OiBDaGFyIC0+IFBhcnNlciBXb3JkOAorbm90Q2hhcjggYyA9IFAuc2F0aXNmeSAoLz0gYzJ3IGMpCisKK2JldHdlZW4gOjogQ2hhciAtPiBDaGFyIC0+IFBhcnNlciBhIC0+IFBhcnNlciBhCitiZXR3ZWVuIGEgYiBwID0gbGV4ZW1lIChQQy5jaGFyOCBhKSAqPiBsZXhlbWUgcCA8KiBsZXhlbWUgKFBDLmNoYXI4IGIpCisKK2dldFR5cGVOYW1lIDo6IFRocmlmdFR5cGUgLT4gQnVpbGRlcgorZ2V0VHlwZU5hbWUgdHkgPSBCLnN0cmluZzggJCBjYXNlIHR5IG9mCisgIFRfU1RSVUNUIF8gLT4gInJlYyIKKyAgVF9NQVAgXyBfICAtPiAibWFwIgorICBUX0xJU1QgXyAgIC0+ICJsc3QiCisgIFRfU0VUIF8gICAgLT4gInNldCIKKyAgVF9CT09MICAgICAtPiAidGYiCisgIFRfQllURSAgICAgLT4gImk4IgorICBUX0kxNiAgICAgIC0+ICJpMTYiCisgIFRfSTMyICAgICAgLT4gImkzMiIKKyAgVF9JNjQgICAgICAtPiAiaTY0IgorICBUX0RPVUJMRSAgIC0+ICJkYmwiCisgIFRfU1RSSU5HICAgLT4gInN0ciIKKyAgVF9CSU5BUlkgICAtPiAic3RyIgorICBfIC0+IGVycm9yICJVbnJlY29nbml6ZWQgVHlwZSIKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCmluZGV4IGVkNzRjZWIuLjU0M2YzMzggMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKQEAgLTM4LDEwICszOCwxMCBAQAogCiAtLSB8IEEgdGhyZWFkZWQgc2V2ZXIgdGhhdCBpcyBjYXBhYmxlIG9mIHVzaW5nIGFueSBUcmFuc3BvcnQgb3IgUHJvdG9jb2wKIC0tIGluc3RhbmNlcy4KLXJ1blRocmVhZGVkU2VydmVyIDo6IChUcmFuc3BvcnQgdCwgUHJvdG9jb2wgaSwgUHJvdG9jb2wgbykKLSAgICAgICAgICAgICAgICAgID0+IChTb2NrZXQgLT4gSU8gKGkgdCwgbyB0KSkKK3J1blRocmVhZGVkU2VydmVyIDo6IChQcm90b2NvbCBpLCBQcm90b2NvbCBvKQorICAgICAgICAgICAgICAgICAgPT4gKFNvY2tldCAtPiBJTyAoaSwgbykpCiAgICAgICAgICAgICAgICAgICAtPiBoCi0gICAgICAgICAgICAgICAgICAtPiAoaCAtPiAoaSB0LCBvIHQpIC0+IElPIEJvb2wpCisgICAgICAgICAgICAgICAgICAtPiAoaCAtPiAoaSwgbykgLT4gSU8gQm9vbCkKICAgICAgICAgICAgICAgICAgIC0+IFBvcnRJRAogICAgICAgICAgICAgICAgICAgLT4gSU8gYQogcnVuVGhyZWFkZWRTZXJ2ZXIgYWNjZXB0ZXIgaGFuZCBwcm9jXyBwb3J0ID0gZG8KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC5ocwppbmRleCAzZTVmMThiLi4zMDZlZGMyIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0LmhzCkBAIC0xLDQgKzEsNSBAQAogey0jIExBTkdVQUdFIERlcml2ZURhdGFUeXBlYWJsZSAjLX0KK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19CiAtLQogLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTI2LDggKzI3LDkgQEAKIAogaW1wb3J0IENvbnRyb2wuTW9uYWQgKCB3aGVuICkKIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIEV4Y2VwdGlvbiwgdGhyb3cgKQotCitpbXBvcnQgRGF0YS5GdW5jdG9yICggKDwkPikgKQogaW1wb3J0IERhdGEuVHlwZWFibGUgKCBUeXBlYWJsZSApCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiBpbXBvcnQgRGF0YS5Nb25vaWQKQEAgLTM2LDYgKzM4LDcgQEAKICAgICB0SXNPcGVuIDo6IGEgLT4gSU8gQm9vbAogICAgIHRDbG9zZSAgOjogYSAtPiBJTyAoKQogICAgIHRSZWFkICAgOjogYSAtPiBJbnQgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKKyAgICB0UGVlayAgIDo6IGEgLT4gSU8gKE1heWJlIFdvcmQ4KQogICAgIHRXcml0ZSAgOjogYSAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQogICAgIHRGbHVzaCAgOjogYSAtPiBJTyAoKQogICAgIHRSZWFkQWxsIDo6IGEgLT4gSW50IC0+IElPIExCUy5CeXRlU3RyaW5nCkBAIC00Niw4ICs0OSw4IEBACiAgICAgICAgIGxldCBybGVuID0gZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCByZXN1bHQKICAgICAgICAgd2hlbiAocmxlbiA9PSAwKSAodGhyb3cgJCBUcmFuc3BvcnRFeG4gIkNhbm5vdCByZWFkLiBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkLiIgVEVfVU5LTk9XTikKICAgICAgICAgaWYgbGVuIDw9IHJsZW4KLSAgICAgICAgICAgIHRoZW4gcmV0dXJuIHJlc3VsdAotICAgICAgICAgICAgZWxzZSAocmVzdWx0IGBtYXBwZW5kYCkgYGZtYXBgICh0UmVhZEFsbCBhIChsZW4gLSBybGVuKSkKKyAgICAgICAgICB0aGVuIHJldHVybiByZXN1bHQKKyAgICAgICAgICBlbHNlIChyZXN1bHQgYG1hcHBlbmRgKSA8JD4gdFJlYWRBbGwgYSAobGVuIC0gcmxlbikKIAogZGF0YSBUcmFuc3BvcnRFeG4gPSBUcmFuc3BvcnRFeG4gU3RyaW5nIFRyYW5zcG9ydEV4blR5cGUKICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCkBAIC02MCw0ICs2MywzIEBACiAgICAgfCBURV9USU1FRF9PVVQKICAgICB8IFRFX0VORF9PRl9GSUxFCiAgICAgICBkZXJpdmluZyAoIEVxLCBTaG93LCBUeXBlYWJsZSApCi0KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9FbXB0eS5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FmNWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0VtcHR5LmhzCkBAIC0wLDAgKzEsMzYgQEAKK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19Cit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MgIy19CistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuRW1wdHkKKyAgICAgICAoIEVtcHR5VHJhbnNwb3J0KC4uKQorICAgICAgICkgd2hlcmUKKworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKKworZGF0YSBFbXB0eVRyYW5zcG9ydCA9IEVtcHR5VHJhbnNwb3J0CisKK2luc3RhbmNlIFRyYW5zcG9ydCBFbXB0eVRyYW5zcG9ydCB3aGVyZQorICAgIHRJc09wZW4gPSBjb25zdCAkIHJldHVybiBGYWxzZQorICAgIHRDbG9zZSAgPSBjb25zdCAkIHJldHVybiAoKQorICAgIHRSZWFkIF8gXyA9IHJldHVybiAiIgorICAgIHRQZWVrID0gY29uc3QgJCByZXR1cm4gTm90aGluZworICAgIHRXcml0ZSBfIF8gPSByZXR1cm4gKCkKKyAgICB0Rmx1c2ggPSBjb25zdCQgcmV0dXJuICgpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0ZyYW1lZC5ocwppbmRleCBkNGZlYWMwLi40MmZjNDNmIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvRnJhbWVkLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9GcmFtZWQuaHMKQEAgLTEsNCArMSw1IEBACiB7LSMgTEFOR1VBR0UgRmxleGlibGVJbnN0YW5jZXMgIy19Cit7LSMgTEFOR1VBR0UgTXVsdGlQYXJhbVR5cGVDbGFzc2VzICMtfQogLS0KIC0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIC0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yNSwxMyArMjYsMTAgQEAKICAgICApIHdoZXJlCiAKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlcgogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAobGlmdE0pCiBpbXBvcnQgRGF0YS5JbnQgKEludDMyKQotaW1wb3J0IERhdGEuTW9ub2lkIChtYXBwZW5kLCBtZW1wdHkpCi1pbXBvcnQgQ29udHJvbC5Db25jdXJyZW50Lk1WYXIKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkgYXMgQgotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeS5CdWlsZGVyIGFzIEJCCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUwogCiAKQEAgLTY1LDggKzYzLDE3IEBACiAgICAgICAgICAgICAgICAgIHRoZW4gdFJlYWQgdHJhbnMgbgogICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiBicwogICAgICAgICAgZWxzZSByZXR1cm4gYnMKKyAgICB0UGVlayB0cmFucyA9IGRvCisgICAgICBtdyA8LSBwZWVrQnVmIChyZWFkQnVmZmVyIHRyYW5zKQorICAgICAgY2FzZSBtdyBvZgorICAgICAgICBKdXN0IF8gLT4gcmV0dXJuIG13CisgICAgICAgIE5vdGhpbmcgLT4gZG8KKyAgICAgICAgICBsZW4gPC0gcmVhZEZyYW1lIHRyYW5zCisgICAgICAgICAgaWYgbGVuID4gMAorICAgICAgICAgICAgIHRoZW4gdFBlZWsgdHJhbnMKKyAgICAgICAgICAgICBlbHNlIHJldHVybiBOb3RoaW5nCiAKLSAgICB0V3JpdGUgdHJhbnMgPSB3cml0ZUJ1ZiAod3JpdGVCdWZmZXIgdHJhbnMpCisgICAgdFdyaXRlID0gd3JpdGVCdWYgLiB3cml0ZUJ1ZmZlcgogCiAgICAgdEZsdXNoIHRyYW5zID0gZG8KICAgICAgIGJzIDwtIGZsdXNoQnVmICh3cml0ZUJ1ZmZlciB0cmFucykKQEAgLTg0LDM3ICs5MSw5IEBACiAgIGxldCBzeiA9IGZyb21JbnRlZ3JhbCAoQi5kZWNvZGUgc3pCcyA6OiBJbnQzMikKIAogICAtLSBSZWFkIHRoZSBmcmFtZSBhbmQgc3R1ZmYgaXQgaW50byB0aGUgcmVhZCBidWZmZXIuCi0gIGJzICAgPC0gdFJlYWQgKHdyYXBwZWRUcmFucyB0cmFucykgc3oKKyAgYnMgPC0gdFJlYWQgKHdyYXBwZWRUcmFucyB0cmFucykgc3oKICAgZmlsbEJ1ZiAocmVhZEJ1ZmZlciB0cmFucykgYnMKIAogICAtLSBSZXR1cm4gdGhlIGZyYW1lIHNpemUgc28gdGhhdCB0aGUgY2FsbGVyIGtub3dzIHdoZXRoZXIgdG8gZXhwZWN0CiAgIC0tIHNvbWV0aGluZyBpbiB0aGUgcmVhZCBidWZmZXIgb3Igbm90LgogICByZXR1cm4gc3oKLQotCi0tLSBNaW5pIElPIGJ1ZmZlcnMgKHN0b2xlbiBmcm9tIEh0dHBDbGllbnQuaHMpCi0KLXR5cGUgV3JpdGVCdWZmZXIgPSBNVmFyIChCQi5CdWlsZGVyKQotCi1uZXdXcml0ZUJ1ZmZlciA6OiBJTyBXcml0ZUJ1ZmZlcgotbmV3V3JpdGVCdWZmZXIgPSBuZXdNVmFyIG1lbXB0eQotCi13cml0ZUJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQotd3JpdGVCdWYgdyBzID0gbW9kaWZ5TVZhcl8gdyAkIHJldHVybiAuIChcYnVpbGRlciAtPgotICAgICAgICAgICAgICAgICBidWlsZGVyIGBtYXBwZW5kYCAoQkIuZnJvbUxhenlCeXRlU3RyaW5nIHMpKQotCi1mbHVzaEJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBJTyAoTEJTLkJ5dGVTdHJpbmcpCi1mbHVzaEJ1ZiB3ID0gQkIudG9MYXp5Qnl0ZVN0cmluZyBgbGlmdE1gIHN3YXBNVmFyIHcgbWVtcHR5Ci0KLQotdHlwZSBSZWFkQnVmZmVyID0gTVZhciAoTEJTLkJ5dGVTdHJpbmcpCi0KLW5ld1JlYWRCdWZmZXIgOjogSU8gUmVhZEJ1ZmZlcgotbmV3UmVhZEJ1ZmZlciA9IG5ld01WYXIgbWVtcHR5Ci0KLWZpbGxCdWYgOjogUmVhZEJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQotZmlsbEJ1ZiByIHMgPSBzd2FwTVZhciByIHMgPj4gcmV0dXJuICgpCi0KLXJlYWRCdWYgOjogUmVhZEJ1ZmZlciAtPiBJbnQgLT4gSU8gKExCUy5CeXRlU3RyaW5nKQotcmVhZEJ1ZiByIG4gPSBtb2RpZnlNVmFyIHIgJCByZXR1cm4gLiBmbGlwUGFpciAuIExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikKLSAgICB3aGVyZSBmbGlwUGFpciAoYSwgYikgPSAoYiwgYSkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCmluZGV4IGNmNDgyMmIuLmZmNjI5NWIgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocwpAQCAtMSw1ICsxLDUgQEAKIHstIyBMQU5HVUFHRSBGbGV4aWJsZUluc3RhbmNlcyAjLX0KLXstIyBMQU5HVUFHRSBLaW5kU2lnbmF0dXJlcyAjLX0KK3stIyBMQU5HVUFHRSBNdWx0aVBhcmFtVHlwZUNsYXNzZXMgIy19CiB7LSMgTEFOR1VBR0UgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KIHstIyBMQU5HVUFHRSBUeXBlU3lub255bUluc3RhbmNlcyAjLX0KIHstIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tb3JwaGFucyAjLX0KQEAgLTI3LDEwICsyNyw5IEBACiAgICAgLCBIYW5kbGVTb3VyY2UoLi4pCiAgICAgKSB3aGVyZQogCi1pbXBvcnQgUHJlbHVkZSBoaWRpbmcgKCBjYXRjaCApCi0KIGltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIGNhdGNoLCB0aHJvdyApCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAoKQoraW1wb3J0IERhdGEuQnl0ZVN0cmluZy5JbnRlcm5hbCAoYzJ3KQoraW1wb3J0IERhdGEuRnVuY3RvcgogCiBpbXBvcnQgTmV0d29yawogCkBAIC00NCw5ICs0MywxNiBAQAogCiBpbnN0YW5jZSBUcmFuc3BvcnQgSGFuZGxlIHdoZXJlCiAgICAgdElzT3BlbiA9IGhJc09wZW4KLSAgICB0Q2xvc2UgaCAgICA9IGhDbG9zZSBoCi0gICAgdFJlYWQgIGggbiAgPSBMQlMuaEdldCBoIG4gYGNhdGNoYCBoYW5kbGVFT0YKLSAgICB0V3JpdGUgaCBzICA9IExCUy5oUHV0IGggcworICAgIHRDbG9zZSA9IGhDbG9zZQorICAgIHRSZWFkIGggbiA9IHJlYWQgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgbWVtcHR5CisgICAgICB3aGVyZQorICAgICAgICByZWFkID0gZG8KKyAgICAgICAgICBoTG9va0FoZWFkIGgKKyAgICAgICAgICBMQlMuaEdldE5vbkJsb2NraW5nIGggbgorICAgIHRSZWFkQWxsIF8gMCA9IHJldHVybiBtZW1wdHkKKyAgICB0UmVhZEFsbCBoIG4gPSBMQlMuaEdldCBoIG4gYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCB0aHJvd1RyYW5zcG9ydEV4bgorICAgIHRQZWVrIGggPSAoSnVzdCAuIGMydyA8JD4gaExvb2tBaGVhZCBoKSBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBOb3RoaW5nCisgICAgdFdyaXRlID0gTEJTLmhQdXQKICAgICB0Rmx1c2ggPSBoRmx1c2gKIAogCkBAIC02MSw4ICs2NywxMiBAQAogaW5zdGFuY2UgSGFuZGxlU291cmNlIChIb3N0TmFtZSwgUG9ydElEKSB3aGVyZQogICAgIGhPcGVuID0gdW5jdXJyeSBjb25uZWN0VG8KIAordGhyb3dUcmFuc3BvcnRFeG4gOjogSU9FcnJvciAtPiBJTyBhCit0aHJvd1RyYW5zcG9ydEV4biBlID0gaWYgaXNFT0ZFcnJvciBlCisgICAgdGhlbiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIiBURV9VTktOT1dOCisgICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGFuZGxlIHRSZWFkQWxsOiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgogCi1oYW5kbGVFT0YgOjogZm9yYWxsIGEgKG0gOjogKiAtPiAqKS4oTW9ub2lkIGEsIE1vbmFkIG0pID0+IElPRXJyb3IgLT4gbSBhCi1oYW5kbGVFT0YgZSA9IGlmIGlzRU9GRXJyb3IgZQotICAgIHRoZW4gcmV0dXJuIG1lbXB0eQotICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIlRDaGFubmVsVHJhbnNwb3J0OiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgoraGFuZGxlRU9GIDo6IGEgLT4gSU9FcnJvciAtPiBJTyBhCitoYW5kbGVFT0YgYSBlID0gaWYgaXNFT0ZFcnJvciBlCisgICAgdGhlbiByZXR1cm4gYQorICAgIGVsc2UgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhhbmRsZTogQ291bGQgbm90IHJlYWQiIFRFX1VOS05PV04KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWNhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMzU0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyCisgICggbW9kdWxlIFRocmlmdC5UcmFuc3BvcnQKKyAgLCBIZWFkZXJUcmFuc3BvcnQoLi4pCisgICwgb3BlbkhlYWRlclRyYW5zcG9ydAorICAsIFByb3RvY29sVHlwZSguLikKKyAgLCBUcmFuc2Zvcm1UeXBlKC4uKQorICAsIENsaWVudFR5cGUoLi4pCisgICwgdFJlc2V0UHJvdG9jb2wKKyAgLCB0U2V0UHJvdG9jb2wKKyAgKSB3aGVyZQorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgQ29udHJvbC5BcHBsaWNhdGl2ZQoraW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICggdGhyb3cgKQoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkJpdHMKK2ltcG9ydCBEYXRhLklPUmVmCitpbXBvcnQgRGF0YS5JbnQKK2ltcG9ydCBEYXRhLk1vbm9pZAoraW1wb3J0IERhdGEuV29yZAorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nIGFzIFAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CaW5hcnkgYXMgQmluYXJ5CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZyBhcyBCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuQ2hhcjggYXMgQworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQnVpbGRlciBhcyBCCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuTWFwIGFzIE1hcAorCitkYXRhIFByb3RvY29sVHlwZSA9IFRCaW5hcnkgfCBUQ29tcGFjdCB8IFRKU09OIGRlcml2aW5nIChFbnVtLCBFcSkKK2RhdGEgQ2xpZW50VHlwZSA9IEhlYWRlckNsaWVudCB8IEZyYW1lZCB8IFVuZnJhbWVkIGRlcml2aW5nIChFbnVtLCBFcSkKKworaW5mb0lkS2V5VmFsdWUgPSAxCisKK3R5cGUgSGVhZGVycyA9IE1hcC5NYXAgU3RyaW5nIFN0cmluZworCitkYXRhIFRyYW5zZm9ybVR5cGUgPSBabGliVHJhbnNmb3JtIGRlcml2aW5nIChFbnVtLCBFcSkKKworZnJvbVRyYW5zcG9ydFR5cGUgOjogVHJhbnNmb3JtVHlwZSAtPiBJbnQxNgorZnJvbVRyYW5zcG9ydFR5cGUgWmxpYlRyYW5zZm9ybSA9IDEKKwordG9UcmFuc3BvcnRUeXBlIDo6IEludDE2IC0+IFRyYW5zZm9ybVR5cGUKK3RvVHJhbnNwb3J0VHlwZSAxID0gWmxpYlRyYW5zZm9ybQordG9UcmFuc3BvcnRUeXBlIF8gPSAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0gSUQiIFRFX1VOS05PV04KKworZGF0YSBIZWFkZXJUcmFuc3BvcnQgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0CisgICAgeyByZWFkQnVmZmVyIDo6IElPUmVmIExCUy5CeXRlU3RyaW5nCisgICAgLCB3cml0ZUJ1ZmZlciA6OiBJT1JlZiBCLkJ1aWxkZXIKKyAgICAsIGluVHJhbnMgOjogaQorICAgICwgb3V0VHJhbnMgOjogbworICAgICwgY2xpZW50VHlwZSA6OiBJT1JlZiBDbGllbnRUeXBlCisgICAgLCBwcm90b2NvbFR5cGUgOjogSU9SZWYgUHJvdG9jb2xUeXBlCisgICAgLCBoZWFkZXJzIDo6IElPUmVmIFsoU3RyaW5nLCBTdHJpbmcpXQorICAgICwgd3JpdGVIZWFkZXJzIDo6IEhlYWRlcnMKKyAgICAsIHRyYW5zZm9ybXMgOjogSU9SZWYgW1RyYW5zZm9ybVR5cGVdCisgICAgLCB3cml0ZVRyYW5zZm9ybXMgOjogW1RyYW5zZm9ybVR5cGVdCisgICAgfQorCitvcGVuSGVhZGVyVHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IGkgLT4gbyAtPiBJTyAoSGVhZGVyVHJhbnNwb3J0IGkgbykKK29wZW5IZWFkZXJUcmFuc3BvcnQgaSBvID0gZG8KKyAgcGlkIDwtIG5ld0lPUmVmIFRDb21wYWN0CisgIHJCdWYgPC0gbmV3SU9SZWYgTEJTLmVtcHR5CisgIHdCdWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIGNUeXBlIDwtIG5ld0lPUmVmIEhlYWRlckNsaWVudAorICBoIDwtIG5ld0lPUmVmIFtdCisgIHRyYW5zIDwtIG5ld0lPUmVmIFtdCisgIHJldHVybiBIZWFkZXJUcmFuc3BvcnQKKyAgICAgIHsgcmVhZEJ1ZmZlciA9IHJCdWYKKyAgICAgICwgd3JpdGVCdWZmZXIgPSB3QnVmCisgICAgICAsIGluVHJhbnMgPSBpCisgICAgICAsIG91dFRyYW5zID0gbworICAgICAgLCBjbGllbnRUeXBlID0gY1R5cGUKKyAgICAgICwgcHJvdG9jb2xUeXBlID0gcGlkCisgICAgICAsIGhlYWRlcnMgPSBoCisgICAgICAsIHdyaXRlSGVhZGVycyA9IE1hcC5lbXB0eQorICAgICAgLCB0cmFuc2Zvcm1zID0gdHJhbnMKKyAgICAgICwgd3JpdGVUcmFuc2Zvcm1zID0gW10KKyAgICAgIH0KKworaXNGcmFtZWQgdCA9ICgvPSBVbmZyYW1lZCkgPCQ+IHJlYWRJT1JlZiAoY2xpZW50VHlwZSB0KQorCityZWFkRnJhbWUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCb29sCityZWFkRnJhbWUgdCA9IGRvCisgIGxldCBpbnB1dCA9IGluVHJhbnMgdAorICBsZXQgckJ1ZiA9IHJlYWRCdWZmZXIgdAorICBsZXQgY1R5cGUgPSBjbGllbnRUeXBlIHQKKyAgbHN6IDwtIHRSZWFkIGlucHV0IDQKKyAgbGV0IHN6ID0gTEJTLnRvU3RyaWN0IGxzegorICBjYXNlIFAucGFyc2VPbmx5IFAuZW5kT2ZJbnB1dCBzeiBvZgorICAgIFJpZ2h0IF8gLT4gZG8gcmV0dXJuIEZhbHNlCisgICAgTGVmdCBfIC0+IGRvCisgICAgICBjYXNlIHBhcnNlQmluYXJ5TWFnaWMgc3ogb2YKKyAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIGxzegorICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgVW5mcmFtZWQKKyAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVEJpbmFyeQorICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgIGNhc2UgcGFyc2VDb21wYWN0TWFnaWMgc3ogb2YKKyAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgbHN6CisgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgVW5mcmFtZWQKKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRDb21wYWN0CisgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgbGV0IGxlbiA9IEJpbmFyeS5kZWNvZGUgbHN6IDo6IEludDMyCisgICAgICAgICAgICAgIGxidWYgPC0gdFJlYWRBbGwgaW5wdXQgJCBmcm9tSW50ZWdyYWwgbGVuCisgICAgICAgICAgICAgIGxldCBidWYgPSBMQlMudG9TdHJpY3QgbGJ1ZgorICAgICAgICAgICAgICBjYXNlIHBhcnNlQmluYXJ5TWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBGcmFtZWQKKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQmluYXJ5CisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgbGJ1ZgorICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VDb21wYWN0TWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgICAgIFJpZ2h0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEZyYW1lZAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQ29tcGFjdAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiBsYnVmCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZUhlYWRlck1hZ2ljIGJ1ZiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQgZmxhZ3MgLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IChmbGFncywgc2VxTnVtLCBoZWFkZXIsIGJvZHkpID0gZXh0cmFjdEhlYWRlciBidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBIZWFkZXJDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSGVhZGVyIHQgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPC0gdW50cmFuc2Zvcm0gdCBib2R5CisgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiAkIExCUy5mcm9tU3RyaWN0ICQgcGF5bG9hZAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgTGVmdCBfIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IHVua29ud24gY2xpZW50IHR5cGUiIFRFX1VOS05PV04KKworcGFyc2VCaW5hcnlNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDgwICo+IFAud29yZDggMHgwMSAqPiBQLndvcmQ4IDB4MDAgKj4gUC5hbnlXb3JkOAorcGFyc2VDb21wYWN0TWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHg4MiAqPiBQLnNhdGlzZnkgKFxiIC0+IGIgLiYuIDB4MWYgPT0gMHgwMSkKK3BhcnNlSGVhZGVyTWFnaWMgPSBQLnBhcnNlT25seSAkIFAud29yZDggMHgwZiAqPiBQLndvcmQ4IDB4ZmYgKj4gKFAuY291bnQgMiBQLmFueVdvcmQ4KQorCitwYXJzZUkzMiA6OiBQLlBhcnNlciBJbnQzMgorcGFyc2VJMzIgPSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSA0CitwYXJzZUkxNiA6OiBQLlBhcnNlciBJbnQxNgorcGFyc2VJMTYgPSBCaW5hcnkuZGVjb2RlIC4gTEJTLmZyb21TdHJpY3QgPCQ+IFAudGFrZSAyCisKK2V4dHJhY3RIZWFkZXIgOjogQlMuQnl0ZVN0cmluZyAtPiAoSW50MTYsIEludDMyLCBCUy5CeXRlU3RyaW5nLCBCUy5CeXRlU3RyaW5nKQorZXh0cmFjdEhlYWRlciBicyA9CisgIGNhc2UgUC5wYXJzZSBleHRyYWN0SGVhZGVyXyBicyBvZgorICAgIFAuRG9uZSByZW1haW4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlcikgLT4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlciwgcmVtYWluKQorICAgIF8gLT4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogSW52YWxpZCBoZWFkZXIiIFRFX1VOS05PV04KKyAgd2hlcmUKKyAgICBleHRyYWN0SGVhZGVyXyA9IGRvCisgICAgICBtYWdpYyA8LSBQLndvcmQ4IDB4MGYgKj4gUC53b3JkOCAweGZmCisgICAgICBmbGFncyA8LSBwYXJzZUkxNgorICAgICAgc2VxTnVtIDwtIHBhcnNlSTMyCisgICAgICAoaGVhZGVyU2l6ZSA6OiBJbnQpIDwtICgqIDQpIC4gZnJvbUludGVncmFsIDwkPiBwYXJzZUkxNgorICAgICAgaGVhZGVyIDwtIFAudGFrZSBoZWFkZXJTaXplCisgICAgICByZXR1cm4gKGZsYWdzLCBzZXFOdW0sIGhlYWRlcikKKworaGFuZGxlSGVhZGVyIHQgaGVhZGVyID0KKyAgY2FzZSBQLnBhcnNlT25seSBwYXJzZUhlYWRlciBoZWFkZXIgb2YKKyAgICBSaWdodCAocFR5cGUsIHRyYW5zLCBpbmZvKSAtPiBkbworICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIHBUeXBlCisgICAgICB3cml0ZUlPUmVmICh0cmFuc2Zvcm1zIHQpIHRyYW5zCisgICAgICB3cml0ZUlPUmVmIChoZWFkZXJzIHQpIGluZm8KKyAgICBfIC0+IHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IEludmFsaWQgaGVhZGVyIiBURV9VTktOT1dOCisKKworaXcxNiA6OiBJbnQxNiAtPiBXb3JkMTYKK2l3MTYgPSBmcm9tSW50ZWdyYWwKK2l3MzIgOjogSW50MzIgLT4gV29yZDMyCitpdzMyID0gZnJvbUludGVncmFsCit3aTE2IDo6IFdvcmQxNiAtPiBJbnQxNgord2kxNiA9IGZyb21JbnRlZ3JhbAord2kzMiA6OiBXb3JkMzIgLT4gSW50MzIKK3dpMzIgPSBmcm9tSW50ZWdyYWwKKworcGFyc2VIZWFkZXIgOjogUC5QYXJzZXIgKFByb3RvY29sVHlwZSwgW1RyYW5zZm9ybVR5cGVdLCBbKFN0cmluZywgU3RyaW5nKV0pCitwYXJzZUhlYWRlciA9IGRvCisgIHByb3RvY29sVHlwZSA8LSB0b1Byb3RvY29sVHlwZSA8JD4gcGFyc2VWYXJpbnQgd2kxNgorICBudW1UcmFucyA8LSBmcm9tSW50ZWdyYWwgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKyAgdHJhbnMgPC0gcmVwbGljYXRlTSBudW1UcmFucyBwYXJzZVRyYW5zZm9ybQorICBpbmZvIDwtIHBhcnNlSW5mbworICByZXR1cm4gKHByb3RvY29sVHlwZSwgdHJhbnMsIGluZm8pCisKK3RvUHJvdG9jb2xUeXBlIDo6IEludDE2IC0+IFByb3RvY29sVHlwZQordG9Qcm90b2NvbFR5cGUgMCA9IFRCaW5hcnkKK3RvUHJvdG9jb2xUeXBlIDEgPSBUSlNPTgordG9Qcm90b2NvbFR5cGUgMiA9IFRDb21wYWN0CisKK2Zyb21Qcm90b2NvbFR5cGUgOjogUHJvdG9jb2xUeXBlIC0+IEludDE2Citmcm9tUHJvdG9jb2xUeXBlIFRCaW5hcnkgPSAwCitmcm9tUHJvdG9jb2xUeXBlIFRKU09OID0gMQorZnJvbVByb3RvY29sVHlwZSBUQ29tcGFjdCA9IDIKKworcGFyc2VUcmFuc2Zvcm0gOjogUC5QYXJzZXIgVHJhbnNmb3JtVHlwZQorcGFyc2VUcmFuc2Zvcm0gPSB0b1RyYW5zcG9ydFR5cGUgPCQ+IHBhcnNlVmFyaW50IHdpMTYKKworcGFyc2VJbmZvIDo6IFAuUGFyc2VyIFsoU3RyaW5nLCBTdHJpbmcpXQorcGFyc2VJbmZvID0gZG8KKyAgbiA8LSBQLmVpdGhlclAgUC5lbmRPZklucHV0IChwYXJzZVZhcmludCB3aTMyKQorICBjYXNlIG4gb2YKKyAgICBMZWZ0IF8gLT4gcmV0dXJuIFtdCisgICAgUmlnaHQgbjAgLT4KKyAgICAgIHJlcGxpY2F0ZU0gKGZyb21JbnRlZ3JhbCBuMCkgJCBkbworICAgICAgICBrbGVuIDwtIHBhcnNlVmFyaW50IHdpMTYKKyAgICAgICAgayA8LSBQLnRha2UgJCBmcm9tSW50ZWdyYWwga2xlbgorICAgICAgICB2bGVuIDwtIHBhcnNlVmFyaW50IHdpMTYKKyAgICAgICAgdiA8LSBQLnRha2UgJCBmcm9tSW50ZWdyYWwgdmxlbgorICAgICAgICByZXR1cm4gKEMudW5wYWNrIGssIEMudW5wYWNrIHYpCisKK3BhcnNlU3RyaW5nIDo6IFAuUGFyc2VyIEJTLkJ5dGVTdHJpbmcKK3BhcnNlU3RyaW5nID0gcGFyc2VWYXJpbnQgd2kzMiA+Pj0gKFAudGFrZSAuIGZyb21JbnRlZ3JhbCkKKworYnVpbGRIZWFkZXIgOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCLkJ1aWxkZXIKK2J1aWxkSGVhZGVyIHQgPSBkbworICBwVHlwZSA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgdAorICBsZXQgcElkID0gYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbVByb3RvY29sVHlwZSBwVHlwZQorICBsZXQgaGVhZGVyQ29udGVudCA9IHBJZCA8PiAoYnVpbGRUcmFuc2Zvcm1zIHQpIDw+IChidWlsZEluZm8gdCkKKyAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggJCBCLnRvTGF6eUJ5dGVTdHJpbmcgaGVhZGVyQ29udGVudAorICAtLSBUT0RPOiBsZW5ndGggbGltaXQgY2hlY2sKKyAgbGV0IHBhZGRpbmcgPSBtY29uY2F0ICQgcmVwbGljYXRlIChtb2QgbGVuIDQpICQgQi53b3JkOCAwCisgIGxldCBjb2RlZExlbiA9IEIuaW50MTZCRSAoZnJvbUludGVncmFsICQgKHF1b3QgKGxlbiAtIDEpIDQpICsgMSkKKyAgbGV0IGZsYWdzID0gMAorICBsZXQgc2VxTnVtID0gMAorICByZXR1cm4gJCBCLmludDE2QkUgMHgwZmZmIDw+IEIuaW50MTZCRSBmbGFncyA8PiBCLmludDMyQkUgc2VxTnVtIDw+IGNvZGVkTGVuIDw+IGhlYWRlckNvbnRlbnQgPD4gcGFkZGluZworCitidWlsZFRyYW5zZm9ybXMgOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCLkJ1aWxkZXIKKy0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorYnVpbGRUcmFuc2Zvcm1zIHQgPQorICBsZXQgdHJhbnMgPSB3cml0ZVRyYW5zZm9ybXMgdCBpbgorICAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuZ3RoIHRyYW5zKSA8PgorICAobWNvbmNhdCAkIG1hcCAoYnVpbGRWYXJpbnQgLiBpdzE2IC4gZnJvbVRyYW5zcG9ydFR5cGUpIHRyYW5zKQorCitidWlsZEluZm8gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCLkJ1aWxkZXIKK2J1aWxkSW5mbyB0ID0KKyAgbGV0IGggPSBNYXAuYXNzb2NzICQgd3JpdGVIZWFkZXJzIHQgaW4KKyAgLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CisgIGNhc2UgbGVuZ3RoIGggb2YKKyAgICAwIC0+IG1lbXB0eQorICAgIGxlbiAtPiAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuKSA8PiAobWNvbmNhdCAkIG1hcCBidWlsZEluZm9FbnRyeSBoKQorICB3aGVyZQorICAgIGJ1aWxkSW5mb0VudHJ5IChrLCB2KSA9IGJ1aWxkVmFyU3RyIGsgPD4gYnVpbGRWYXJTdHIgdgorICAgIC0tIFRPRE86IGNoZWNrIGxlbmd0aCBsaW1pdAorICAgIGJ1aWxkVmFyU3RyIHMgPSAoYnVpbGRWYXJpbnQgJCBpdzE2ICQgZnJvbUludGVncmFsICQgbGVuZ3RoIHMpIDw+IEIuc3RyaW5nOCBzCisKK3RSZXNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gSU8gQm9vbAordFJlc2V0UHJvdG9jb2wgdCA9IGRvCisgIHJCdWYgPC0gcmVhZElPUmVmICQgcmVhZEJ1ZmZlciB0CisgIHdyaXRlSU9SZWYgKGNsaWVudFR5cGUgdCkgSGVhZGVyQ2xpZW50CisgIHJlYWRGcmFtZSB0CisKK3RTZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IFByb3RvY29sVHlwZSAtPiBJTyAoKQordFNldFByb3RvY29sIHQgPSB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkKKwordHJhbnNmb3JtIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gTEJTLkJ5dGVTdHJpbmcgLT4gTEJTLkJ5dGVTdHJpbmcKK3RyYW5zZm9ybSB0IGJzID0KKyAgZm9sZHIgYXBwbHlUcmFuc2Zvcm0gYnMgJCB3cml0ZVRyYW5zZm9ybXMgdAorICB3aGVyZQorICAgIC0tIGFwcGx5VHJhbnNmb3JtIGJzIFpsaWJUcmFuc2Zvcm0gPQorICAgIC0tICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogbm90IGltcGxlbWVudGVkOiBabGliVHJhbnNmb3JtICAiIFRFX1VOS05PV04KKyAgICBhcHBseVRyYW5zZm9ybSBicyBfID0KKyAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJIZWFkZXJUcmFuc3BvcnQ6IFVua25vd24gdHJhbnNmb3JtIiBURV9VTktOT1dOCisKK3VudHJhbnNmb3JtIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gQlMuQnl0ZVN0cmluZyAtPiBJTyBCUy5CeXRlU3RyaW5nCit1bnRyYW5zZm9ybSB0IGJzID0gZG8KKyAgdHJhbnMgPC0gcmVhZElPUmVmICQgdHJhbnNmb3JtcyB0CisgIHJldHVybiAkIGZvbGRsIHVuYXBwbHlUcmFuc2Zvcm0gYnMgdHJhbnMKKyAgd2hlcmUKKyAgICAtLSB1bmFwcGx5VHJhbnNmb3JtIGJzIFpsaWJUcmFuc2Zvcm0gPQorICAgIC0tICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogbm90IGltcGxlbWVudGVkOiBabGliVHJhbnNmb3JtICAiIFRFX1VOS05PV04KKyAgICB1bmFwcGx5VHJhbnNmb3JtIGJzIF8gPQorICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0iIFRFX1VOS05PV04KKworaW5zdGFuY2UgKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gVHJhbnNwb3J0IChIZWFkZXJUcmFuc3BvcnQgaSBvKSB3aGVyZQorICB0SXNPcGVuIHQgPSBkbworICAgIHRJc09wZW4gKGluVHJhbnMgdCkKKyAgICB0SXNPcGVuIChvdXRUcmFucyB0KQorCisgIHRDbG9zZSB0ID0gZG8KKyAgICB0Q2xvc2Uob3V0VHJhbnMgdCkKKyAgICB0Q2xvc2UoaW5UcmFucyB0KQorCisgIHRSZWFkIHQgbGVuID0gZG8KKyAgICByQnVmIDwtIHJlYWRJT1JlZiAkIHJlYWRCdWZmZXIgdAorICAgIGlmIG5vdCAkIExCUy5udWxsIHJCdWYKKyAgICAgIHRoZW4gZG8KKyAgICAgICAgbGV0IChjb25zdW1lZCwgcmVtYWluKSA9IExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbGVuKSByQnVmCisgICAgICAgIHdyaXRlSU9SZWYgKHJlYWRCdWZmZXIgdCkgcmVtYWluCisgICAgICAgIHJldHVybiBjb25zdW1lZAorICAgICAgZWxzZSBkbworICAgICAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgICAgICBpZiBub3QgZnJhbWVkCisgICAgICAgICAgdGhlbiB0UmVhZCAoaW5UcmFucyB0KSBsZW4KKyAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICBvayA8LSByZWFkRnJhbWUgdAorICAgICAgICAgICAgaWYgb2sKKyAgICAgICAgICAgICAgdGhlbiB0UmVhZCB0IGxlbgorICAgICAgICAgICAgICBlbHNlIHJldHVybiBMQlMuZW1wdHkKKworICB0UGVlayB0ID0gZG8KKyAgICByQnVmIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0KQorICAgIGlmIG5vdCAkIExCUy5udWxsIHJCdWYKKyAgICAgIHRoZW4gcmV0dXJuICQgSnVzdCAkIExCUy5oZWFkIHJCdWYKKyAgICAgIGVsc2UgZG8KKyAgICAgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICAgICAgaWYgbm90IGZyYW1lZAorICAgICAgICAgIHRoZW4gdFBlZWsgKGluVHJhbnMgdCkKKyAgICAgICAgICBlbHNlIGRvCisgICAgICAgICAgICBvayA8LSByZWFkRnJhbWUgdAorICAgICAgICAgICAgaWYgb2sKKyAgICAgICAgICAgICAgdGhlbiB0UGVlayB0CisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIE5vdGhpbmcKKworICB0V3JpdGUgdCBidWYgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdAorICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgaWYgZnJhbWVkCisgICAgICB0aGVuIG1vZGlmeUlPUmVmIHdCdWYgKDw+IEIubGF6eUJ5dGVTdHJpbmcgYnVmKQorICAgICAgZWxzZQorICAgICAgICAtLSBUT0RPOiB3aGF0IHNob3VsZCB3ZSBkbyB3aGVuIHN3aXRjaGVkIHRvIHVuZnJhbWVkIGluIHRoZSBtaWRkbGUgPworICAgICAgICB0V3JpdGUob3V0VHJhbnMgdCkgYnVmCisKKyAgdEZsdXNoIHQgPSBkbworICAgIGNUeXBlIDwtIHJlYWRJT1JlZiAkIGNsaWVudFR5cGUgdAorICAgIGNhc2UgY1R5cGUgb2YKKyAgICAgIFVuZnJhbWVkIC0+IHRGbHVzaCAkIG91dFRyYW5zIHQKKyAgICAgIEZyYW1lZCAtPiBmbHVzaEJ1ZmZlciB0IGlkIG1lbXB0eQorICAgICAgSGVhZGVyQ2xpZW50IC0+IGJ1aWxkSGVhZGVyIHQgPj49IGZsdXNoQnVmZmVyIHQgKHRyYW5zZm9ybSB0KQorICAgIHdoZXJlCisgICAgICBmbHVzaEJ1ZmZlciB0IGYgaGVhZGVyID0gZG8KKyAgICAgICAgd0J1ZiA8LSByZWFkSU9SZWYgJCB3cml0ZUJ1ZmZlciB0CisgICAgICAgIHdyaXRlSU9SZWYgKHdyaXRlQnVmZmVyIHQpIG1lbXB0eQorICAgICAgICBsZXQgcGF5bG9hZCA9IEIudG9MYXp5Qnl0ZVN0cmluZyAoaGVhZGVyIDw+IHdCdWYpCisgICAgICAgIHRXcml0ZSAob3V0VHJhbnMgdCkgJCBCaW5hcnkuZW5jb2RlIChmcm9tSW50ZWdyYWwgJCBMQlMubGVuZ3RoIHBheWxvYWQgOjogSW50MzIpCisgICAgICAgIHRXcml0ZSAob3V0VHJhbnMgdCkgJCBmIHBheWxvYWQKKyAgICAgICAgdEZsdXNoIChvdXRUcmFucyB0KQpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0h0dHBDbGllbnQuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocwppbmRleCBiMWIwOTgyLi5lZGViMzIwIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocwpAQCAtMjIsMTggKzIyLDE2IEBACiAgICAgKCBtb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydAogICAgICwgSHR0cENsaWVudCAoLi4pCiAgICAgLCBvcGVuSHR0cENsaWVudAotICAgICkgd2hlcmUKKykgd2hlcmUKIAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyCiBpbXBvcnQgTmV0d29yay5VUkkKIGltcG9ydCBOZXR3b3JrLkhUVFAgaGlkaW5nIChwb3J0LCBob3N0KQogCi1pbXBvcnQgQ29udHJvbC5Nb25hZCAobGlmdE0pCiBpbXBvcnQgRGF0YS5NYXliZSAoZnJvbUp1c3QpCi1pbXBvcnQgRGF0YS5Nb25vaWQgKG1hcHBlbmQsIG1lbXB0eSkKK2ltcG9ydCBEYXRhLk1vbm9pZCAobWVtcHR5KQogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uICh0aHJvdykKLWltcG9ydCBDb250cm9sLkNvbmN1cnJlbnQuTVZhcgotaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeS5CdWlsZGVyIGFzIEIKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiAKIApAQCAtNzMsMTEgKzcxLDEzIEBACiAKIGluc3RhbmNlIFRyYW5zcG9ydCBIdHRwQ2xpZW50IHdoZXJlCiAKLSAgICB0Q2xvc2UgID0gY2xvc2UgLiBoc3RyZWFtCisgICAgdENsb3NlID0gY2xvc2UgLiBoc3RyZWFtCiAKLSAgICB0UmVhZCBoY2xpZW50IG4gPSByZWFkQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIG4KKyAgICB0UGVlayA9IHBlZWtCdWYgLiByZWFkQnVmZmVyCiAKLSAgICB0V3JpdGUgaGNsaWVudCA9IHdyaXRlQnVmICh3cml0ZUJ1ZmZlciBoY2xpZW50KQorICAgIHRSZWFkID0gcmVhZEJ1ZiAuIHJlYWRCdWZmZXIKKworICAgIHRXcml0ZSA9IHdyaXRlQnVmIC4gd3JpdGVCdWZmZXIKIAogICAgIHRGbHVzaCBoY2xpZW50ID0gZG8KICAgICAgIGJvZHkgPC0gZmx1c2hCdWYgJCB3cml0ZUJ1ZmZlciBoY2xpZW50CkBAIC05MiwzNiArOTIsMTAgQEAKIAogICAgICAgcmVzIDwtIHNlbmRIVFRQIChoc3RyZWFtIGhjbGllbnQpIHJlcXVlc3QKICAgICAgIGNhc2UgcmVzIG9mCi0gICAgICAgIFJpZ2h0IHJlc3BvbnNlIC0+IGRvCi0gICAgICAgICAgICBmaWxsQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIChyc3BCb2R5IHJlc3BvbnNlKQotICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgUmlnaHQgcmVzcG9uc2UgLT4KKyAgICAgICAgICBmaWxsQnVmIChyZWFkQnVmZmVyIGhjbGllbnQpIChyc3BCb2R5IHJlc3BvbnNlKQorICAgICAgICBMZWZ0IF8gLT4KICAgICAgICAgICAgIHRocm93ICQgVHJhbnNwb3J0RXhuICJUSHR0cENvbm5lY3Rpb246IEhUVFAgZmFpbHVyZSBmcm9tIHNlcnZlciIgVEVfVU5LTk9XTgogICAgICAgcmV0dXJuICgpCiAKICAgICB0SXNPcGVuIF8gPSByZXR1cm4gVHJ1ZQotLS0gTWluaSBJTyBidWZmZXJzCi0KLXR5cGUgV3JpdGVCdWZmZXIgPSBNVmFyIChCLkJ1aWxkZXIpCi0KLW5ld1dyaXRlQnVmZmVyIDo6IElPIFdyaXRlQnVmZmVyCi1uZXdXcml0ZUJ1ZmZlciA9IG5ld01WYXIgbWVtcHR5Ci0KLXdyaXRlQnVmIDo6IFdyaXRlQnVmZmVyIC0+IExCUy5CeXRlU3RyaW5nIC0+IElPICgpCi13cml0ZUJ1ZiB3IHMgPSBtb2RpZnlNVmFyXyB3ICQgcmV0dXJuIC4gKFxidWlsZGVyIC0+Ci0gICAgICAgICAgICAgICAgIGJ1aWxkZXIgYG1hcHBlbmRgIChCLmZyb21MYXp5Qnl0ZVN0cmluZyBzKSkKLQotZmx1c2hCdWYgOjogV3JpdGVCdWZmZXIgLT4gSU8gKExCUy5CeXRlU3RyaW5nKQotZmx1c2hCdWYgdyA9IEIudG9MYXp5Qnl0ZVN0cmluZyBgbGlmdE1gIHN3YXBNVmFyIHcgbWVtcHR5Ci0KLQotdHlwZSBSZWFkQnVmZmVyID0gTVZhciAoTEJTLkJ5dGVTdHJpbmcpCi0KLW5ld1JlYWRCdWZmZXIgOjogSU8gUmVhZEJ1ZmZlcgotbmV3UmVhZEJ1ZmZlciA9IG5ld01WYXIgbWVtcHR5Ci0KLWZpbGxCdWYgOjogUmVhZEJ1ZmZlciAtPiBMQlMuQnl0ZVN0cmluZyAtPiBJTyAoKQotZmlsbEJ1ZiByIHMgPSBzd2FwTVZhciByIHMgPj4gcmV0dXJuICgpCi0KLXJlYWRCdWYgOjogUmVhZEJ1ZmZlciAtPiBJbnQgLT4gSU8gKExCUy5CeXRlU3RyaW5nKQotcmVhZEJ1ZiByIG4gPSBtb2RpZnlNVmFyIHIgJCByZXR1cm4gLiBmbGlwUGFpciAuIExCUy5zcGxpdEF0IChmcm9tSW50ZWdyYWwgbikKLSAgICB3aGVyZSBmbGlwUGFpciAoYSwgYikgPSAoYiwgYSkKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9JT0J1ZmZlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJkN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCkBAIC0wLDAgKzEsNjkgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5JT0J1ZmZlcgorICAgICAgICggV3JpdGVCdWZmZXIKKyAgICAgICAsIG5ld1dyaXRlQnVmZmVyCisgICAgICAgLCB3cml0ZUJ1ZgorICAgICAgICwgZmx1c2hCdWYKKyAgICAgICAsIFJlYWRCdWZmZXIKKyAgICAgICAsIG5ld1JlYWRCdWZmZXIKKyAgICAgICAsIGZpbGxCdWYKKyAgICAgICAsIHJlYWRCdWYKKyAgICAgICAsIHBlZWtCdWYKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5Xb3JkCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCisKK3R5cGUgV3JpdGVCdWZmZXIgPSBJT1JlZiBCdWlsZGVyCit0eXBlIFJlYWRCdWZmZXIgPSBJT1JlZiBMQlMuQnl0ZVN0cmluZworCituZXdXcml0ZUJ1ZmZlciA6OiBJTyBXcml0ZUJ1ZmZlcgorbmV3V3JpdGVCdWZmZXIgPSBuZXdJT1JlZiBtZW1wdHkKKword3JpdGVCdWYgOjogV3JpdGVCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKK3dyaXRlQnVmIHcgcyA9IG1vZGlmeUlPUmVmIHcgKCA8PiBsYXp5Qnl0ZVN0cmluZyBzKQorCitmbHVzaEJ1ZiA6OiBXcml0ZUJ1ZmZlciAtPiBJTyBMQlMuQnl0ZVN0cmluZworZmx1c2hCdWYgdyA9IGRvCisgIGJ1ZiA8LSByZWFkSU9SZWYgdworICB3cml0ZUlPUmVmIHcgbWVtcHR5CisgIHJldHVybiAkIHRvTGF6eUJ5dGVTdHJpbmcgYnVmCisKK25ld1JlYWRCdWZmZXIgOjogSU8gUmVhZEJ1ZmZlcgorbmV3UmVhZEJ1ZmZlciA9IG5ld0lPUmVmIG1lbXB0eQorCitmaWxsQnVmIDo6IFJlYWRCdWZmZXIgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gSU8gKCkKK2ZpbGxCdWYgPSB3cml0ZUlPUmVmCisKK3JlYWRCdWYgOjogUmVhZEJ1ZmZlciAtPiBJbnQgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKK3JlYWRCdWYgciBuID0gZG8KKyAgYnMgPC0gcmVhZElPUmVmIHIKKyAgbGV0IChoZCwgdGwpID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKSBicworICB3cml0ZUlPUmVmIHIgdGwKKyAgcmV0dXJuIGhkCisKK3BlZWtCdWYgOjogUmVhZEJ1ZmZlciAtPiBJTyAoTWF5YmUgV29yZDgpCitwZWVrQnVmIHIgPSAoZm1hcCBmc3QgLiBMQlMudW5jb25zKSA8JD4gcmVhZElPUmVmIHIKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9NZW1vcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvTWVtb3J5LmhzCkBAIC0wLDAgKzEsNzcgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKKyAgICAgICAoIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAsIE1lbW9yeUJ1ZmZlciguLikKKyAgICAgICApIHdoZXJlCisKK2ltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyCitpbXBvcnQgRGF0YS5GdW5jdG9yCitpbXBvcnQgRGF0YS5JT1JlZgoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAorCisKK2RhdGEgTWVtb3J5QnVmZmVyID0gTWVtb3J5QnVmZmVyIHsKKyAgd3JpdGVCdWZmZXIgOjogSU9SZWYgQnVpbGRlciwKKyAgcmVhZEJ1ZmZlciA6OiBJT1JlZiBMQlMuQnl0ZVN0cmluZworfQorCitvcGVuTWVtb3J5QnVmZmVyIDo6IElPIE1lbW9yeUJ1ZmZlcgorb3Blbk1lbW9yeUJ1ZmZlciA9IGRvCisgIHdidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJidWYgPC0gbmV3SU9SZWYgbWVtcHR5CisgIHJldHVybiBNZW1vcnlCdWZmZXIgeworICAgIHdyaXRlQnVmZmVyID0gd2J1ZiwKKyAgICByZWFkQnVmZmVyID0gcmJ1ZgorICB9CisKK2luc3RhbmNlIFRyYW5zcG9ydCBNZW1vcnlCdWZmZXIgd2hlcmUKKyAgdElzT3BlbiA9IGNvbnN0ICQgcmV0dXJuIEZhbHNlCisgIHRDbG9zZSAgPSBjb25zdCAkIHJldHVybiAoKQorICB0Rmx1c2ggdHJhbnMgPSBkbworICAgIGxldCB3QnVmID0gd3JpdGVCdWZmZXIgdHJhbnMKKyAgICB3YiA8LSByZWFkSU9SZWYgd0J1ZgorICAgIG1vZGlmeUlPUmVmIChyZWFkQnVmZmVyIHRyYW5zKSAkIFxyYiAtPiBtYXBwZW5kIHJiICQgdG9MYXp5Qnl0ZVN0cmluZyB3YgorICAgIHdyaXRlSU9SZWYgd0J1ZiBtZW1wdHkKKworICB0UmVhZCBfIDAgPSByZXR1cm4gbWVtcHR5CisgIHRSZWFkIHRyYW5zIG4gPSBkbworICAgIGxldCByYnVmID0gcmVhZEJ1ZmZlciB0cmFucworICAgIHJiIDwtIHJlYWRJT1JlZiByYnVmCisgICAgbGV0IGxlbiA9IGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIKKyAgICBpZiBsZW4gPT0gMAorICAgICAgdGhlbiBkbworICAgICAgICB0Rmx1c2ggdHJhbnMKKyAgICAgICAgcmIyIDwtIHJlYWRJT1JlZiAocmVhZEJ1ZmZlciB0cmFucykKKyAgICAgICAgaWYgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcmIyKSA9PSAwCisgICAgICAgICAgdGhlbiByZXR1cm4gbWVtcHR5CisgICAgICAgICAgZWxzZSB0UmVhZCB0cmFucyBuCisgICAgICBlbHNlIGRvCisgICAgICAgIGxldCAocmV0LCByZW1haW4pID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBuKSByYgorICAgICAgICB3cml0ZUlPUmVmIHJidWYgcmVtYWluCisgICAgICAgIHJldHVybiByZXQKKworICB0UGVlayB0cmFucyA9IChmbWFwIGZzdCAuIExCUy51bmNvbnMpIDwkPiByZWFkSU9SZWYgKHJlYWRCdWZmZXIgdHJhbnMpCisKKyAgdFdyaXRlIHRyYW5zIHYgPSBkbworICAgIG1vZGlmeUlPUmVmICh3cml0ZUJ1ZmZlciB0cmFucykgKDw+IGxhenlCeXRlU3RyaW5nIHYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9UeXBlcy5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCmluZGV4IGU5MTdlMzkuLjJhMjAwMjUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1R5cGVzLmhzCkBAIC0xNiwxOSArMTYsMTE1IEBACiAtLSB1bmRlciB0aGUgTGljZW5zZS4KIC0tCiAKK3stIyBPUFRJT05TX0dIQyAtZm5vLXdhcm4tb3JwaGFucyAjLX0KKwogbW9kdWxlIFRocmlmdC5UeXBlcyB3aGVyZQogCiBpbXBvcnQgRGF0YS5Gb2xkYWJsZSAoZm9sZGwnKQogaW1wb3J0IERhdGEuSGFzaGFibGUgKCBIYXNoYWJsZSwgaGFzaFdpdGhTYWx0ICkKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IFRlc3QuUXVpY2tDaGVjay5BcmJpdHJhcnkKK2ltcG9ydCBUZXN0LlF1aWNrQ2hlY2suR2VuIChlbGVtZW50cykKK2ltcG9ydCBEYXRhLlRleHQuTGF6eSAoVGV4dCkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaE1hcC5TdHJpY3QgYXMgTWFwCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuSGFzaFNldCBhcyBTZXQKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5WZWN0b3IgYXMgVmVjdG9yCiAKLWluc3RhbmNlIChIYXNoYWJsZSBrLCBIYXNoYWJsZSB2KSA9PiBIYXNoYWJsZSAoTWFwLkhhc2hNYXAgayB2KSB3aGVyZQotICBoYXNoV2l0aFNhbHQgc2FsdCA9IGZvbGRsJyBoYXNoV2l0aFNhbHQgc2FsdCAuIE1hcC50b0xpc3QKLQotaW5zdGFuY2UgKEhhc2hhYmxlIGEpID0+IEhhc2hhYmxlIChTZXQuSGFzaFNldCBhKSB3aGVyZQotICBoYXNoV2l0aFNhbHQgc2FsdCA9IGZvbGRsJyBoYXNoV2l0aFNhbHQgc2FsdAotCiBpbnN0YW5jZSAoSGFzaGFibGUgYSkgPT4gSGFzaGFibGUgKFZlY3Rvci5WZWN0b3IgYSkgd2hlcmUKLSAgaGFzaFdpdGhTYWx0IHNhbHQgPSBWZWN0b3IuZm9sZGwnIGhhc2hXaXRoU2FsdCBzYWx0CisgIGhhc2hXaXRoU2FsdCA9IFZlY3Rvci5mb2xkbCcgaGFzaFdpdGhTYWx0CisKKwordHlwZSBUeXBlTWFwID0gTWFwLkhhc2hNYXAgSW50MTYgKFRleHQsIFRocmlmdFR5cGUpCisKK2RhdGEgVGhyaWZ0VmFsID0gVFN0cnVjdCAoTWFwLkhhc2hNYXAgSW50MTYgKFRleHQsIFRocmlmdFZhbCkpCisgICAgICAgICAgICAgICB8IFRNYXAgVGhyaWZ0VHlwZSBUaHJpZnRUeXBlIFsoVGhyaWZ0VmFsLCBUaHJpZnRWYWwpXQorICAgICAgICAgICAgICAgfCBUTGlzdCBUaHJpZnRUeXBlIFtUaHJpZnRWYWxdCisgICAgICAgICAgICAgICB8IFRTZXQgVGhyaWZ0VHlwZSBbVGhyaWZ0VmFsXQorICAgICAgICAgICAgICAgfCBUQm9vbCBCb29sCisgICAgICAgICAgICAgICB8IFRCeXRlIEludDgKKyAgICAgICAgICAgICAgIHwgVEkxNiBJbnQxNgorICAgICAgICAgICAgICAgfCBUSTMyIEludDMyCisgICAgICAgICAgICAgICB8IFRJNjQgSW50NjQKKyAgICAgICAgICAgICAgIHwgVFN0cmluZyBMQlMuQnl0ZVN0cmluZworICAgICAgICAgICAgICAgfCBUQmluYXJ5IExCUy5CeXRlU3RyaW5nCisgICAgICAgICAgICAgICB8IFREb3VibGUgRG91YmxlCisgICAgICAgICAgICAgICAgIGRlcml2aW5nIChFcSwgU2hvdykKKworLS0gSW5mb3JtYXRpb24gaXMgbmVlZGVkIGhlcmUgZm9yIGNvbGxlY3Rpb24gdHlwZXMgKGllIFRfU1RSVUNULCBUX01BUCwKKy0tIFRfTElTVCwgYW5kIFRfU0VUKSBzbyB0aGF0IHdlIGtub3cgd2hhdCB0eXBlcyB0aG9zZSBjb2xsZWN0aW9ucyBhcmUKKy0tIHBhcmFtZXRlcml6ZWQgYnkuICBJbiBtb3N0IHByb3RvY29scywgdGhpcyBjYW5ub3QgYmUgZGlzY2VybmVkIGRpcmVjdGx5CistLSBmcm9tIHRoZSBkYXRhIGJlaW5nIHJlYWQuCitkYXRhIFRocmlmdFR5cGUKKyAgICA9IFRfU1RPUAorICAgIHwgVF9WT0lECisgICAgfCBUX0JPT0wKKyAgICB8IFRfQllURQorICAgIHwgVF9ET1VCTEUKKyAgICB8IFRfSTE2CisgICAgfCBUX0kzMgorICAgIHwgVF9JNjQKKyAgICB8IFRfU1RSSU5HCisgICAgfCBUX0JJTkFSWQorICAgIHwgVF9TVFJVQ1QgVHlwZU1hcAorICAgIHwgVF9NQVAgVGhyaWZ0VHlwZSBUaHJpZnRUeXBlCisgICAgfCBUX1NFVCBUaHJpZnRUeXBlCisgICAgfCBUX0xJU1QgVGhyaWZ0VHlwZQorICAgICAgZGVyaXZpbmcgKCBFcSwgU2hvdyApCisKKy0tIE5PVEU6IHdoZW4gdXNpbmcgdG9FbnVtIGluZm9ybWF0aW9uIGFib3V0IHBhcmFtZXRpemVkIHR5cGVzIGlzIE5PVCBwcmVzZXJ2ZWQuCistLSBUaGlzIGRlc2lnbiBjaG9pY2UgaXMgY29uc2lzdGVudCB3b3RoIHRoZSBUaHJpZnQgaW1wbGVtZW50YXRpb24gaW4gb3RoZXIKKy0tIGxhbmd1YWdlcworaW5zdGFuY2UgRW51bSBUaHJpZnRUeXBlIHdoZXJlCisgICAgZnJvbUVudW0gVF9TVE9QICAgICAgID0gMAorICAgIGZyb21FbnVtIFRfVk9JRCAgICAgICA9IDEKKyAgICBmcm9tRW51bSBUX0JPT0wgICAgICAgPSAyCisgICAgZnJvbUVudW0gVF9CWVRFICAgICAgID0gMworICAgIGZyb21FbnVtIFRfRE9VQkxFICAgICA9IDQKKyAgICBmcm9tRW51bSBUX0kxNiAgICAgICAgPSA2CisgICAgZnJvbUVudW0gVF9JMzIgICAgICAgID0gOAorICAgIGZyb21FbnVtIFRfSTY0ICAgICAgICA9IDEwCisgICAgZnJvbUVudW0gVF9TVFJJTkcgICAgID0gMTEKKyAgICBmcm9tRW51bSBUX0JJTkFSWSAgICAgPSAxMQorICAgIGZyb21FbnVtIChUX1NUUlVDVCBfKSA9IDEyCisgICAgZnJvbUVudW0gKFRfTUFQIF8gXykgID0gMTMKKyAgICBmcm9tRW51bSAoVF9TRVQgXykgICAgPSAxNAorICAgIGZyb21FbnVtIChUX0xJU1QgXykgICA9IDE1CisKKyAgICB0b0VudW0gMCAgPSBUX1NUT1AKKyAgICB0b0VudW0gMSAgPSBUX1ZPSUQKKyAgICB0b0VudW0gMiAgPSBUX0JPT0wKKyAgICB0b0VudW0gMyAgPSBUX0JZVEUKKyAgICB0b0VudW0gNCAgPSBUX0RPVUJMRQorICAgIHRvRW51bSA2ICA9IFRfSTE2CisgICAgdG9FbnVtIDggID0gVF9JMzIKKyAgICB0b0VudW0gMTAgPSBUX0k2NAorICAgIHRvRW51bSAxMSA9IFRfU1RSSU5HCisgICAgLS0gdG9FbnVtIDExID0gVF9CSU5BUlkKKyAgICB0b0VudW0gMTIgPSBUX1NUUlVDVCBNYXAuZW1wdHkKKyAgICB0b0VudW0gMTMgPSBUX01BUCBUX1ZPSUQgVF9WT0lECisgICAgdG9FbnVtIDE0ID0gVF9TRVQgVF9WT0lECisgICAgdG9FbnVtIDE1ID0gVF9MSVNUIFRfVk9JRAorICAgIHRvRW51bSB0ID0gZXJyb3IgJCAiSW52YWxpZCBUaHJpZnRUeXBlICIgKysgc2hvdyB0CisKK2RhdGEgTWVzc2FnZVR5cGUKKyAgICA9IE1fQ0FMTAorICAgIHwgTV9SRVBMWQorICAgIHwgTV9FWENFUFRJT04KKyAgICB8IE1fT05FV0FZCisgICAgICBkZXJpdmluZyAoIEVxLCBTaG93ICkKKworaW5zdGFuY2UgRW51bSBNZXNzYWdlVHlwZSB3aGVyZQorICAgIGZyb21FbnVtIE1fQ0FMTCAgICAgID0gIDEKKyAgICBmcm9tRW51bSBNX1JFUExZICAgICA9ICAyCisgICAgZnJvbUVudW0gTV9FWENFUFRJT04gPSAgMworICAgIGZyb21FbnVtIE1fT05FV0FZICAgID0gIDQKKworICAgIHRvRW51bSAxID0gTV9DQUxMCisgICAgdG9FbnVtIDIgPSBNX1JFUExZCisgICAgdG9FbnVtIDMgPSBNX0VYQ0VQVElPTgorICAgIHRvRW51bSA0ID0gTV9PTkVXQVkKKyAgICB0b0VudW0gdCA9IGVycm9yICQgIkludmFsaWQgTWVzc2FnZVR5cGUgIiArKyBzaG93IHQKKworaW5zdGFuY2UgQXJiaXRyYXJ5IE1lc3NhZ2VUeXBlIHdoZXJlCisgIGFyYml0cmFyeSA9IGVsZW1lbnRzIFtNX0NBTEwsIE1fUkVQTFksIE1fRVhDRVBUSU9OLCBNX09ORVdBWV0KZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0JpbmFyeVNwZWMuaHMgYi9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTJmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaHMvdGVzdC9CaW5hcnlTcGVjLmhzCkBAIC0wLDAgKzEsOTEgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgQmluYXJ5U3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkuQ2hhcjggYXMgQworCitpbXBvcnQgVGhyaWZ0LlR5cGVzCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQorCitzcGVjIDo6IFNwZWMKK3NwZWMgPSBkbworICBkZXNjcmliZSAiQmluYXJ5UHJvdG9jb2wiICQgZG8KKyAgICBkZXNjcmliZSAiZG91YmxlIiAkIGRvCisgICAgICBpdCAid3JpdGVzIGluIGJpZyBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IDIgKiogNTMKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVERvdWJsZSB2YWwpCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyA4CisgICAgICAgIChMQlMudW5wYWNrIGJpbikgYHNob3VsZEJlYFs2NywgNjQsIDAsIDAsIDAsIDAsIDAsIDBdCisKKyAgICAgIGl0ICJyZWFkcyBpbiBiaWcgZW5kaWFuIG9yZGVyIiAkIGRvCisgICAgICAgIGxldCBiaW4gPSBMQlMucGFjayBbNjcsIDY0LCAwLCAwLCAwLCAwLCAwLCAwXQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEJpbmFyeVByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyBiaW4KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gVF9ET1VCTEUKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFREb3VibGUgJCAyICoqIDUzKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFREb3VibGUgdmFsCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFREb3VibGUgdmFsKQorCisgICAgZGVzY3JpYmUgInN0cmluZyIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICBsZXQgdmFsID0gQy5wYWNrICJhYWEiCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgNworICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzAsIDAsIDAsIDMsIDk3LCA5NywgOTddCisKKyAgICBkZXNjcmliZSAiYmluYXJ5IiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbNDIsIDQzLCA0NF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKExCUy51bnBhY2sgYmluKSBgc2hvdWxkQmVgIFswLCAwLCAwLCAzLCA0MiwgNDMsIDQ0XQorCisgICAgICBpdCAicmVhZHMiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBCaW5hcnlQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBMQlMucGFjayBbMCwgMCwgMCwgMywgNDIsIDQzLCA0NF0KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQmluYXJ5UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAoVF9CSU5BUlkpCisgICAgICAgIHZhbDIgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIHZhbCkKKwpkaWZmIC0tZ2l0IGEvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMgYi9saWIvaHMvdGVzdC9Db21wYWN0U3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQwZTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvQ29tcGFjdFNwZWMuaHMKQEAgLTAsMCArMSw4MSBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK21vZHVsZSBDb21wYWN0U3BlYyB3aGVyZQorCitpbXBvcnQgVGVzdC5Ic3BlYworaW1wb3J0IFRlc3QuSHNwZWMuUXVpY2tDaGVjayAocHJvcCkKKworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSBhcyBMQlMKKworaW1wb3J0IFRocmlmdC5UeXBlcworaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lk1lbW9yeQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJDb21wYWN0UHJvdG9jb2wiICQgZG8KKyAgICBkZXNjcmliZSAiZG91YmxlIiAkIGRvCisgICAgICBpdCAid3JpdGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IDIgKiogNTMKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFREb3VibGUgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWRBbGwgdHJhbnMgOAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWBbMCwgMCwgMCwgMCwgMCwgMCwgNjQsIDY3XQorCisgICAgICBpdCAicmVhZHMgaW4gbGl0dGxlIGVuZGlhbiBvcmRlciIgJCBkbworICAgICAgICBsZXQgYmluID0gTEJTLnBhY2sgWzAsIDAsIDAsIDAsIDAsIDAsIDY0LCA2N10KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBDb21wYWN0UHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIGJpbgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVERvdWJsZSAkIDIgKiogNTMpCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIFREb3VibGUgdmFsCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byBUX0RPVUJMRQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFREb3VibGUgdmFsKQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKyAgICAgICAgYmluIDwtIHRSZWFkIHRyYW5zIDEwMAorICAgICAgICAoTEJTLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWzMsIDQyLCA0MywgNDRdCisKKyAgICAgIGl0ICJyZWFkcyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IENvbXBhY3RQcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBMQlMucGFjayBbMywgNDIsIDQzLCA0NF0KKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFs0MiwgNDMsIDQ0XSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gQ29tcGFjdFByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKZGlmZiAtLWdpdCBhL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzIGIvbGliL2hzL3Rlc3QvSlNPTlNwZWMuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIyYzgyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90ZXN0L0pTT05TcGVjLmhzCkBAIC0wLDAgKzEsMjI1IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworbW9kdWxlIEpTT05TcGVjIHdoZXJlCisKK2ltcG9ydCBUZXN0LkhzcGVjCitpbXBvcnQgVGVzdC5Ic3BlYy5RdWlja0NoZWNrIChwcm9wKQorCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5DaGFyOCBhcyBDCisKK2ltcG9ydCBUaHJpZnQuVHlwZXMKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgorCit0U3RyaW5nIDo6IFtDaGFyXSAtPiBUaHJpZnRWYWwKK3RTdHJpbmcgPSBUU3RyaW5nIC4gQy5wYWNrCisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJKU09OUHJvdG9jb2wiICQgZG8KKyAgICBkZXNjcmliZSAiYm9vbCIgJCBkbworICAgICAgaXQgIndyaXRlcyB0cnVlIGFzIDEiICQgZG8KKyAgICAgICAgbGV0IHZhbCA9IFRydWUKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCb29sIHZhbCkKKyAgICAgICAgYmluIDwtdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWycxJ10KKworICAgICAgaXQgIndyaXRlcyBmYWxzZSBhcyAwIiAkIGRvCisgICAgICAgIGxldCB2YWwgPSBGYWxzZQorICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVEJvb2wgdmFsKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgWycwJ10KKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvICQgVEJvb2wgdmFsCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byBUX0JPT0wKKyAgICAgICAgdmFsMiBgc2hvdWxkQmVgIChUQm9vbCB2YWwpCisKKyAgICBkZXNjcmliZSAic3RyaW5nIiAkIGRvCisgICAgICBpdCAid3JpdGVzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUU3RyaW5nICQgQy5wYWNrICJcImEiKQorICAgICAgICBiaW4gPC0gdFJlYWQgdHJhbnMgMTAwCisgICAgICAgIChDLnVucGFjayBiaW4pIGBzaG91bGRCZWAgIlwiXFxcImFcIiIKKworICAgICAgaXQgInJlYWRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAkIEMucGFjayAiXCJcXFwiYVwiIgorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TVFJJTkcpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU3RyaW5nICQgQy5wYWNrICJcImEiKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRTdHJpbmcgJCBDLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfU1RSSU5HKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRTdHJpbmcgJCBDLnBhY2sgdmFsKQorCisgICAgZGVzY3JpYmUgImJpbmFyeSIgJCBkbworICAgICAgaXQgIndyaXRlcyB3aXRoIHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRCaW5hcnkgJCBMQlMucGFjayBbMV0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiXCJBUT09XCIiCisKKyAgICAgIGl0ICJyZWFkcyB3aXRoIHBhZGRpbmciICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zICQgQy5wYWNrICJcIkFRPT1cIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKworICAgICAgaXQgInJlYWRzIHdpdGhvdXQgcGFkZGluZyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgJCBDLnBhY2sgIlwiQVFcIiIKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVEJpbmFyeSAkIExCUy5wYWNrIFsxXSkKKworICAgICAgcHJvcCAicm91bmQgdHJpcCIgJCBcdmFsIC0+IGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUQmluYXJ5ICQgTEJTLnBhY2sgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gKFRfQklOQVJZKQorICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRCaW5hcnkgJCBMQlMucGFjayB2YWwpCisKKyAgICBkZXNjcmliZSAibGlzdCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSBsaXN0IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTGlzdCBUX0JZVEUgW10pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiW1wiaThcIiwwXSIKKworICAgICAgaXQgInJlYWRzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfTElTVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUTGlzdCBUX0JZVEUgW10pCisKKyAgICAgIGl0ICJ3cml0ZXMgc2luZ2xlIGVsZW1lbnQiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gKFRMaXN0IFRfQllURSBbVEJ5dGUgMF0pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiW1wiaThcIiwxLDBdIgorCisgICAgICBpdCAicmVhZHMgc2luZ2xlIGVsZW1lbnQiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMSwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtUQnl0ZSAwXSkKKworICAgICAgaXQgInJlYWRzIGVsZW1lbnRzIiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDIsNDIsIDQzXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX0xJU1QgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVExpc3QgVF9CWVRFIFtUQnl0ZSA0MiwgVEJ5dGUgNDNdKQorCisgICAgICBwcm9wICJyb3VuZCB0cmlwIiAkIFx2YWwgLT4gZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgd3JpdGVWYWwgcHJvdG8gJCAoVExpc3QgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisgICAgICAgIHZhbDIgPC0gcmVhZFZhbCBwcm90byAkIFRfTElTVCBUX1NUUklORworICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRMaXN0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorCisgICAgZGVzY3JpYmUgInNldCIgJCBkbworICAgICAgaXQgIndyaXRlcyBlbXB0eSIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAoVFNldCBUX0JZVEUgW10pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCAiW1wiaThcIiwwXSIKKworICAgICAgaXQgInJlYWRzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLDBdIikKKyAgICAgICAgdmFsIDwtIHJlYWRWYWwgcHJvdG8gKFRfU0VUIFRfQllURSkKKyAgICAgICAgdmFsIGBzaG91bGRCZWAgKFRTZXQgVF9CWVRFIFtdKQorCisgICAgICBpdCAicmVhZHMgc2luZ2xlIGVsZW1lbnQiICQgZG8KKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgIltcImk4XCIsMSwwXSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX1NFVCBUX0JZVEUpCisgICAgICAgIHZhbCBgc2hvdWxkQmVgIChUU2V0IFRfQllURSBbVEJ5dGUgMF0pCisKKyAgICAgIGl0ICJyZWFkcyBlbGVtZW50cyIgJCBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB0V3JpdGUgdHJhbnMgKEMucGFjayAiW1wiaThcIiwyLDQyLCA0M10iKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9TRVQgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVFNldCBUX0JZVEUgW1RCeXRlIDQyLCBUQnl0ZSA0M10pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUU2V0IFRfU1RSSU5HICQgbWFwIHRTdHJpbmcgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX1NFVCBUX1NUUklORworICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRTZXQgVF9TVFJJTkcgJCBtYXAgdFN0cmluZyB2YWwpCisKKyAgICBkZXNjcmliZSAibWFwIiAkIGRvCisgICAgICBpdCAid3JpdGVzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHdyaXRlVmFsIHByb3RvIChUTWFwIFRfQllURSBUX0JZVEUgW10pCisgICAgICAgIGJpbiA8LSB0UmVhZCB0cmFucyAxMDAKKyAgICAgICAgKEMudW5wYWNrIGJpbikgYHNob3VsZEJlYCJbXCJpOFwiLFwiaThcIiwwLHt9XSIKKworICAgICAgaXQgInJlYWRzIGVtcHR5IiAkIGRvCisgICAgICAgIHRyYW5zIDwtIG9wZW5NZW1vcnlCdWZmZXIKKyAgICAgICAgbGV0IHByb3RvID0gSlNPTlByb3RvY29sIHRyYW5zCisgICAgICAgIHRXcml0ZSB0cmFucyAoQy5wYWNrICJbXCJpOFwiLFwiaThcIiwwLHt9XSIpCisgICAgICAgIHZhbCA8LSByZWFkVmFsIHByb3RvIChUX01BUCBUX0JZVEUgVF9CWVRFKQorICAgICAgICB2YWwgYHNob3VsZEJlYCAoVE1hcCBUX0JZVEUgVF9CWVRFIFtdKQorCisgICAgICBpdCAicmVhZHMgc3RyaW5nLXN0cmluZyIgJCBkbworICAgICAgICBsZXQgYmluID0gIltcInN0clwiLFwic3RyXCIsMix7XCJhXCI6XCIyXCIsXCJiXCI6XCJibGFoXCJ9XSIKKyAgICAgICAgdHJhbnMgPC0gb3Blbk1lbW9yeUJ1ZmZlcgorICAgICAgICBsZXQgcHJvdG8gPSBKU09OUHJvdG9jb2wgdHJhbnMKKyAgICAgICAgdFdyaXRlIHRyYW5zIChDLnBhY2sgYmluKQorICAgICAgICB2YWwgPC0gcmVhZFZhbCBwcm90byAoVF9NQVAgVF9TVFJJTkcgVF9TVFJJTkcpCisgICAgICAgIHZhbGBzaG91bGRCZWAgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgWyh0U3RyaW5nICJhIiwgdFN0cmluZyAiMiIpLCAodFN0cmluZyAiYiIsIHRTdHJpbmcgImJsYWgiKV0pCisKKyAgICAgIHByb3AgInJvdW5kIHRyaXAiICQgXHZhbCAtPiBkbworICAgICAgICB0cmFucyA8LSBvcGVuTWVtb3J5QnVmZmVyCisgICAgICAgIGxldCBwcm90byA9IEpTT05Qcm90b2NvbCB0cmFucworICAgICAgICB3cml0ZVZhbCBwcm90byAkIChUTWFwIFRfU1RSSU5HIFRfU1RSSU5HICQgbWFwIHRvS1YgdmFsKQorICAgICAgICB2YWwyIDwtIHJlYWRWYWwgcHJvdG8gJCBUX01BUCBUX1NUUklORyBUX1NUUklORworICAgICAgICB2YWwyIGBzaG91bGRCZWAgKFRNYXAgVF9TVFJJTkcgVF9TVFJJTkcgJCBtYXAgdG9LViB2YWwpCisgICAgICAgIHdoZXJlCisgICAgICAgICAgdG9LViB2ID0gKHRTdHJpbmcgdiwgdFN0cmluZyB2KQorCmRpZmYgLS1naXQgYS9saWIvaHMvdGVzdC9TcGVjLmhzIGIvbGliL2hzL3Rlc3QvU3BlYy5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWM5YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3Rlc3QvU3BlYy5ocwpAQCAtMCwwICsxLDM4IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworLS0gT3VyIENJIGRvZXMgbm90IHdvcmsgd2VsbCB3aXRoIGF1dG8gZGlzY292ZXIuCistLSBOZWVkIHRvIGFkZCBidWlsZC10aW1lIFBBVEggdmFyaWFibGUgdG8gaHNwZWMtZGlzY292ZXIgZGlyIGZyb20gQ01ha2UKKy0tIG9yIGluc3RhbGwgaHNwZWMgc3lzdGVtLXdpZGUgZm9yIHRoZSBmb2xsb3dpbmcgdG8gd29yay4KKy0tIHstIyBPUFRJT05TX0dIQyAtRiAtcGdtRiBoc3BlYy1kaXNjb3ZlciAjLX0KKworaW1wb3J0IFRlc3QuSHNwZWMKKworaW1wb3J0IHF1YWxpZmllZCBCaW5hcnlTcGVjCitpbXBvcnQgcXVhbGlmaWVkIENvbXBhY3RTcGVjCitpbXBvcnQgcXVhbGlmaWVkIEpTT05TcGVjCisKK21haW4gOjogSU8gKCkKK21haW4gPSBoc3BlYyBzcGVjCisKK3NwZWMgOjogU3BlYworc3BlYyA9IGRvCisgIGRlc2NyaWJlICJCaW5hcnkiIEJpbmFyeVNwZWMuc3BlYworICBkZXNjcmliZSAiQ29tcGFjdCIgQ29tcGFjdFNwZWMuc3BlYworICBkZXNjcmliZSAiSlNPTiIgSlNPTlNwZWMuc3BlYwpkaWZmIC0tZ2l0IGEvbGliL2hzL3RocmlmdC5jYWJhbCBiL2xpYi9ocy90aHJpZnQuY2FiYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxNTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy90aHJpZnQuY2FiYWwKQEAgLTAsMCArMSw4NCBAQAorLS0KKy0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCistLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCistLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCistLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCistLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy0tCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLS0KKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKy0tCisKK05hbWU6ICAgICAgICAgICB0aHJpZnQKK1ZlcnNpb246ICAgICAgICAxLjAuMAorQ2FiYWwtVmVyc2lvbjogIDEuMjQKK0xpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKK0NhdGVnb3J5OiAgICAgICBGb3JlaWduCitCdWlsZC1UeXBlOiAgICAgU2ltcGxlCitTeW5vcHNpczogICAgICAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQorSG9tZXBhZ2U6ICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworQnVnLVJlcG9ydHM6ICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUCitNYWludGFpbmVyOiAgICAgZGV2QHRocmlmdC5hcGFjaGUub3JnCitMaWNlbnNlLUZpbGU6ICAgTElDRU5TRQorCitEZXNjcmlwdGlvbjoKKyAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgorCitmbGFnIG5ldHdvcmstdXJpCisgICBkZXNjcmlwdGlvbjogR2V0IE5ldHdvcmsuVVJJIGZyb20gdGhlIG5ldHdvcmstdXJpIHBhY2thZ2UKKyAgIGRlZmF1bHQ6IFRydWUKKworTGlicmFyeQorICBIcy1Tb3VyY2UtRGlyczoKKyAgICBzcmMKKyAgQnVpbGQtRGVwZW5kczoKKyAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBjb250YWluZXJzLCBnaGMtcHJpbSwgYXR0b3BhcnNlYywgYmluYXJ5LCBieXRlc3RyaW5nID49IDAuMTAsIGJhc2U2NC1ieXRlc3RyaW5nLCBoYXNoYWJsZSwgSFRUUCwgdGV4dCwgaHNwZWMtY29yZSA+IDIuNC4wLCB1bm9yZGVyZWQtY29udGFpbmVycyA+PSAwLjIuNiwgdmVjdG9yID49IDAuMTAuMTIuMiwgUXVpY2tDaGVjayA+PSAyLjguMiwgc3BsaXQKKyAgaWYgZmxhZyhuZXR3b3JrLXVyaSkKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNgorICBlbHNlCisgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgPCAyLjYKKyAgRXhwb3NlZC1Nb2R1bGVzOgorICAgIFRocmlmdCwKKyAgICBUaHJpZnQuQXJiaXRyYXJpZXMKKyAgICBUaHJpZnQuUHJvdG9jb2wsCisgICAgVGhyaWZ0LlByb3RvY29sLkhlYWRlciwKKyAgICBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5LAorICAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAorICAgIFRocmlmdC5Qcm90b2NvbC5KU09OLAorICAgIFRocmlmdC5TZXJ2ZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LkVtcHR5LAorICAgIFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSGVhZGVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQuSHR0cENsaWVudCwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LklPQnVmZmVyLAorICAgIFRocmlmdC5UcmFuc3BvcnQuTWVtb3J5LAorICAgIFRocmlmdC5UeXBlcworICBEZWZhdWx0LUxhbmd1YWdlOiBIYXNrZWxsMjAxMAorICBEZWZhdWx0LUV4dGVuc2lvbnM6CisgICAgRGVyaXZlRGF0YVR5cGVhYmxlLAorICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCisgICAgRmxleGlibGVJbnN0YW5jZXMsCisgICAgS2luZFNpZ25hdHVyZXMsCisgICAgTWFnaWNIYXNoLAorICAgIFJhbmtOVHlwZXMsCisgICAgUmVjb3JkV2lsZENhcmRzLAorICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCisgICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKKworVGVzdC1TdWl0ZSBzcGVjCisgIFR5cGU6IGV4aXRjb2RlLXN0ZGlvLTEuMAorICBIcy1Tb3VyY2UtRGlyczogdGVzdAorICBHaGMtT3B0aW9uczogLVdhbGwKKyAgbWFpbi1pczogU3BlYy5ocworICBCdWlsZC1EZXBlbmRzOiBiYXNlLCB0aHJpZnQsIGhzcGVjLCBRdWlja0NoZWNrID49IDIuOC4yLCBieXRlc3RyaW5nID49IDAuMTAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42CisgIERlZmF1bHQtTGFuZ3VhZ2U6IEhhc2tlbGwyMDEwCmRpZmYgLS1naXQgYS9saWIvamF2YS9DTWFrZUxpc3RzLnR4dCBiL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDY0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDg3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaWYoQU5EUk9JRCkKKyAgICBzZXQoVEhSSUZUX0FBUiBvdXRwdXRzL2Fhci90aHJpZnQtZGVidWcuYWFyIG91dHB1dHMvYWFyL3RocmlmdC1yZWxlYXNlLmFhcikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAke1RIUklGVF9BQVJ9CisgICAgICAgIENPTU1BTkQgJHtHUkFETEVfRVhFQ1VUQUJMRX0KKyAgICAgICAgICAgIC1wICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYW5kcm9pZCIKKyAgICAgICAgICAgICItUGJ1aWxkRGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9hbmRyb2lkL2J1aWxkIiBhc3NlbWJsZQorICAgICkKKyAgICBhZGRfY3VzdG9tX3RhcmdldCh0aHJpZnRfYWFyIEFMTCBERVBFTkRTICR7VEhSSUZUX0FBUn0pCisKK2Vsc2UoQU5EUk9JRCkKKworICAgIGlmKElTX0FCU09MVVRFICIke0xJQl9JTlNUQUxMX0RJUn0iKQorICAgICAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVsc2UoKQorICAgICAgICBzZXQoSkFWQV9JTlNUQUxMX0RJUiAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vJHtMSUJfSU5TVEFMTF9ESVJ9L2phdmEiKQorICAgIGVuZGlmKCkKKworICAgIGlmKElTX0FCU09MVVRFICIke0RPQ19JTlNUQUxMX0RJUn0iKQorICAgICAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKKyAgICBlbHNlKCkKKyAgICAgICAgc2V0KEpBVkFfRE9DX0lOU1RBTExfRElSICIke0NNQUtFX0lOU1RBTExfUFJFRklYfS8ke0RPQ19JTlNUQUxMX0RJUn0vamF2YSIpCisgICAgZW5kaWYoKQorCisgICAgYWRkX2N1c3RvbV90YXJnZXQoVGhyaWZ0SmF2YSBBTEwKKyAgICAgICAgQ09NTUVOVCAiQnVpbGRpbmcgSmF2YSBsaWJyYXJ5IHVzaW5nIEdyYWRsZSBXcmFwcGVyIgorICAgICAgICBDT01NQU5EICR7R1JBRExFV19FWEVDVVRBQkxFfSAke0dSQURMRV9PUFRTfSBhc3NlbWJsZQorICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAtUHJlbGVhc2U9dHJ1ZQorICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgKQorCisgICAgIyBFbmFibGUgcHVibGlzaGluZyBmcm9tIENNYWtlIGlmIHRoZSBwdWJsaXNoaW5nIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkCisgICAgYWRkX2N1c3RvbV90YXJnZXQoTWF2ZW5QdWJsaXNoCisgICAgICAgIENPTU1FTlQgIlB1Ymxpc2hpbmcgSmF2YSBMaWJyYXJ5IHRvIEFwYWNoZSBNYXZlbiBzdGFnaW5nIgorICAgICAgICBDT01NQU5EICR7R1JBRExFV19FWEVDVVRBQkxFfSAke0dSQURMRV9PUFRTfSBjbGVhbiB1cGxvYWRBcmNoaXZlcworICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAtUHJlbGVhc2U9dHJ1ZQorICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CisgICAgKQorCisgICAgIyBIb29rIHRoZSBDTWFrZSBpbnN0YWxsIHByb2Nlc3MgdG8gdGhlIHJlc3VsdHMgZnJvbSBtYWtlIEFMTC4KKyAgICAjIFRoaXMgd29ya3MgYmVzdCB3aGVuICdtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0JyBpcyB1c2VkLgorICAgICMgVXNpbmcgc2xhc2ggdG8gZW5kIHRoZSBzb3VyY2UgbG9jYXRpb24gdG8gYXZvaWQgY29weWluZyB0aGUgZGlyZWN0b3J5IHBhdGguCisgICAgaW5zdGFsbChESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkL2xpYnMvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfSU5TVEFMTF9ESVJ9CisgICAgICAgICAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICJsaWJ0aHJpZnQtJHt0aHJpZnRfVkVSU0lPTn0uamFyIikKKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvZGVwcy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9JTlNUQUxMX0RJUn0KKyAgICAgICAgICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gIiouamFyIikKKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvZG9jcy9qYXZhZG9jLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0RPQ19JTlNUQUxMX0RJUn0pCisKKyAgICBpZihCVUlMRF9URVNUSU5HKQorICAgICAgICBhZGRfdGVzdChOQU1FIEphdmFUZXN0CisgICAgICAgICAgICAgICAgQ09NTUFORCAke0dSQURMRVdfRVhFQ1VUQUJMRX0gJHtHUkFETEVfT1BUU30gdGVzdAorICAgICAgICAgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgICAgICAgICAgLVByZWxlYXNlPXRydWUKKyAgICAgICAgICAgICAgICAgICAgLVB0aHJpZnQudmVyc2lvbj0ke3RocmlmdF9WRVJTSU9OfQorICAgICAgICAgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgICAgICAgICAgICAgICAiLVB0aHJpZnQuY29tcGlsZXI9JHtUSFJJRlRfQ09NUElMRVJ9IgorICAgICAgICAgICAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKKyAgICBlbmRpZigpCitlbmRpZihBTkRST0lEKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvTWFrZWZpbGUuYW0gYi9saWIvamF2YS9NYWtlZmlsZS5hbQppbmRleCBlYTAxOTc4Li42NTk4MWNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9NYWtlZmlsZS5hbQorKysgYi9saWIvamF2YS9NYWtlZmlsZS5hbQpAQCAtMTcsMjIgKzE3LDU2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1FWFRSQV9ESVNUID0gYnVpbGQueG1sIGJ1aWxkLnByb3BlcnRpZXMgc3JjIHRlc3QKLQogZXhwb3J0IENMQVNTUEFUSAogCiBhbGwtbG9jYWw6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBhc3NlbWJsZSBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAogaW5zdGFsbC1leGVjLWhvb2s6Ci0JJChBTlQpICQoQU5UX0ZMQUdTKSBpbnN0YWxsIC1EaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCi0JCS1EaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGluc3RhbGwgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QaW5zdGFsbC5wYXRoPSQoREVTVERJUikkKEpBVkFfUFJFRklYKSBcCisJCS1QaW5zdGFsbC5qYXZhZG9jLnBhdGg9JChERVNURElSKSQoZG9jZGlyKS9qYXZhIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAotIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgogY2xlYW4tbG9jYWw6Ci0JQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKLQkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgY2xlYW4gLS1jb25zb2xlPXBsYWluCiAKLWNoZWNrLWxvY2FsOiBhbGwKLQkkKEFOVCkgJChBTlRfRkxBR1MpIHRlc3QKK3ByZWNyb3NzOiAkKFRIUklGVCkKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgc2hhZG93SmFyIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgogCitjaGVjay1sb2NhbDogJChUSFJJRlQpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHRlc3QgXAorCQktUHJlbGVhc2U9dHJ1ZSBcCisJCS1QdGhyaWZ0LnZlcnNpb249JChQQUNLQUdFX1ZFUlNJT04pIFwKKwkJLVB0aHJpZnQuY29tcGlsZXI9JChUSFJJRlQpIFwKKwkJLS1jb25zb2xlPXBsYWluCisKK21hdmVuLXB1Ymxpc2g6CisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHVwbG9hZEFyY2hpdmVzIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgorCitFWFRSQV9ESVNUID0gXAorCWJ1aWxkLmdyYWRsZSBcCisJZ3JhZGxlLnByb3BlcnRpZXMgXAorCXNldHRpbmdzLmdyYWRsZSBcCisJZ3JhZGxlIFwKKwlncmFkbGV3IFwKKwlncmFkbGV3LmJhdCBcCisJQ01ha2VMaXN0cy50eHQgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCWFuZHJvaWQgXAorCXNyYyBcCisJdGVzdCBcCisJY29kZV9xdWFsaXR5X3Rvb2xzIFwKKwlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL1JFQURNRSBiL2xpYi9qYXZhL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiM2FmZS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1UaHJpZnQgSmF2YSBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIEphdmEKLT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIFRocmlmdCBKYXZhIHNvdXJjZSBpcyBub3QgYnVpbGQgdXNpbmcgdGhlIEdOVSB0b29scywgYnV0IHJhdGhlciB1c2VzCi10aGUgQXBhY2hlIEFudCBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQotZGV2ZWxvcGVycy4KLQotVG8gY29tcGlsZSB0aGUgSmF2YSBUaHJpZnQgbGlicmFyaWVzLCBzaW1wbHkgZG8gdGhlIGZvbGxvd2luZzoKLQotYW50Ci0KLVllcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC5qYXIgaW4gdGhlIGJhc2UgZGlyZWN0b3J5LgotCi1UbyBpbmNsdWRlIFRocmlmdCBpbiB5b3VyIGFwcGxpY2F0aW9ucyBzaW1wbHkgYWRkIGxpYnRocmlmdC5qYXIgdG8geW91cgotY2xhc3NwYXRoLCBvciBpbnN0YWxsIGlmIGluIHlvdXIgZGVmYXVsdCBzeXN0ZW0gY2xhc3NwYXRoIG9mIGNob2ljZS4KLQotCi1CdWlsZCBUaHJpZnQgYmVoaW5kIGEgcHJveHk6Ci0KLWFudCAtRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldAotCi1vciB2aWEKLQotLi9jb25maWd1cmUgLS13aXRoLWphdmEgQU5UX0ZMQUdTPSctRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldCcKLQotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1BcGFjaGUgQW50Ci1odHRwOi8vYW50LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS9saWIvamF2YS9SRUFETUUubWQgYi9saWIvamF2YS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ZjBkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL1JFQURNRS5tZApAQCAtMCwwICsxLDE3NiBAQAorVGhyaWZ0IEphdmEgU29mdHdhcmUgTGlicmFyeQorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitCdWlsZGluZyBhbmQgaW5zdGFsbGluZyBmcm9tIHNvdXJjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hlbiB1c2luZyBhIENNYWtlIGJ1aWxkIGZyb20gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb24gTGludXggdGhlCitlYXNpZXN0IHdheSB0byBidWlsZCBhbmQgaW5zdGFsbCBpcyB0aGlzIHNpbXBsZSBjb21tYW5kIGxpbmU6CisKKyAgICBtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0CisKK0l0IGlzIGltcG9ydGFudCB0byB1c2UgdGhlIGluc3RhbGwvZmFzdCBvcHRpb24gdG8gZWxpbWluYXRlCit0aGUgYXV0b21hdGljIHJlYnVpbGQgYnkgZGVwZW5kZW5jeSB0aGF0IGNhdXNlcyBpc3N1ZXMgYmVjYXVzZQordGhlIGJ1aWxkIHRvb2xpbmcgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGNhY2hlZCBmaWxlcyBpbiB0aGUKK3VzZXIgaG9tZSBkaXJlY3RvcnkgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiBJbnN0ZWFkIHRoaXMgYnVpbGRzCit0aGUgY29kZSBpbiB0aGUgZXhwZWN0ZWQgbG9jYWwgYnVpbGQgdHJlZSBhbmQgdGhlbiB1c2VzIENNYWtlCitpbnN0YWxsIGNvZGUgdG8gY29weSB0byB0aGUgdGFyZ2V0IGRlc3RpbmF0aW9uLgorCitCdWlsZGluZyBUaHJpZnQgd2l0aCBHcmFkbGUgd2l0aG91dCBDTWFrZS9BdXRvY29uZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIFRocmlmdCBKYXZhIHNvdXJjZSBpcyBub3QgYnVpbGQgdXNpbmcgdGhlIEdOVSB0b29scywgYnV0IHJhdGhlciB1c2VzCit0aGUgR3JhZGxlIGJ1aWxkIHN5c3RlbSwgd2hpY2ggdGVuZHMgdG8gYmUgcHJlZG9taW5hbnQgYW1vbmdzdCBKYXZhCitkZXZlbG9wZXJzLgorCitUbyBjb21waWxlIHRoZSBKYXZhIFRocmlmdCBsaWJyYXJpZXMsIHNpbXBseSBkbyB0aGUgZm9sbG93aW5nOgorCisgICAgLi9ncmFkbGV3CisKK1llcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC08dmVyc2lvbj4uamFyIGluIHRoZSBidWlsZC9saWJzIGRpcmVjdG9yeS4KKworVGhlIGRlZmF1bHQgYnVpbGQgd2lsbCBydW4gdGhlIHVuaXQgdGVzdHMgd2hpY2ggZXhwZWN0IGEgdXNhYmxlCitUaHJpZnQgY29tcGlsZXIgdG8gZXhpc3Qgb24gdGhlIHN5c3RlbS4gWW91IGhhdmUgdHdvIGNob2ljZXMgZm9yCit0aGF0LgorCisqIEJ1aWxkIHRoZSBUaHJpZnQgZXhlY3V0YWJsZSBmcm9tIHNvdXJjZSBhdCB0aGUgZGVmYXVsdAorICBsb2NhdGlvbiBpbiB0aGUgc291cmNlIHRyZWUuIFRoZSBwcm9qZWN0IGlzIGNvbmZpZ3VyZWQKKyAgdG8gbG9vayBmb3IgaXQgdGhlcmUuCisqIEluc3RhbGwgdGhlIHB1Ymxpc2hlZCBiaW5hcnkgZGlzdHJpYnV0aW9uIHRvIGhhdmUgVGhyaWZ0CisgIGV4ZWN1dGFibGUgaW4gYSBrbm93biBsb2NhdGlvbiBhbmQgYWRkIHRoZSBwYXRoIHRvIHRoZQorICB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSB1c2luZyB0aGUgcHJvcGVydHkgbmFtZQorICAidGhyaWZ0LmNvbXBpbGVyIi4gRm9yIGV4YW1wbGUgdGhpcyB3b3VsZCBzZXQgdGhlIHBhdGggaW4KKyAgYSBXaW5kb3dzIGJveCBpZiBUaHJpZnQgd2FzIGluc3RhbGxlZCB1bmRlciBDOlxUaHJpZnQKKworICAgIHRocmlmdC5jb21waWxlcj1DOi9UaHJpZnQvdGhyaWZ0LmV4ZQorCitUbyBqdXN0IGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGhvdXQgcnVubmluZyB1bml0IHRlc3RzIHlvdSBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBhc3NlbWJsZQorCitUbyBpbnN0YWxsIHRoZSBsaWJyYXJ5IGluIHRoZSBsb2NhbCBNYXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uCit3aGVyZSBvdGhlciBNYXZlbiBvciBHcmFkbGUgYnVpbGRzIGNhbiByZWZlcmVuY2UgaXQgc2ltcGx5IGRvIHRoaXMuCisKKyAgICAuL2dyYWRsZXcgaW5zdGFsbAorCitUaGUgbGlicmFyeSB3aWxsIGJlIHBsYWNlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IHVuZGVyIC5tMi9yZXBvc2l0b3J5CisKK1RvIGluY2x1ZGUgVGhyaWZ0IGluIHlvdXIgYXBwbGljYXRpb25zIHNpbXBseSBhZGQgbGlidGhyaWZ0LmphciB0byB5b3VyCitjbGFzc3BhdGgsIG9yIGluc3RhbGwgaWYgaW4geW91ciBkZWZhdWx0IHN5c3RlbSBjbGFzc3BhdGggb2YgY2hvaWNlLgorCisKK0J1aWxkIFRocmlmdCBiZWhpbmQgYSBwcm94eToKKworICAgIC4vZ3JhZGxldyAtRGh0dHAucHJveHlIb3N0PW15cHJveHlob3N0IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCAtRGh0dHAucHJveHlVc2VyPXRocmlmdHVzZXIgLURodHRwLnByb3h5UGFzc3dvcmQ9dG9wc2VjcmV0CisKK29yIHZpYQorCisgICAgLi9jb25maWd1cmUgLS13aXRoLWphdmEgR1JBRExFX09QVFM9Jy1EaHR0cC5wcm94eUhvc3Q9bXlwcm94eWhvc3QgLURodHRwLnByb3h5UG9ydD04MDgwIC1EaHR0cC5wcm94eVVzZXI9dGhyaWZ0dXNlciAtRGh0dHAucHJveHlQYXNzd29yZD10b3BzZWNyZXQnCisKKworVW5pdCBUZXN0IEhUTUwgUmVwb3J0cworPT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYnVpbGQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGFuIEhUTUwgVW5pdCBUZXN0IHJlcG9ydC4gVGhpcyBjYW4gYmUgZm91bmQKK3VuZGVyIGJ1aWxkL3JlcG9ydHMvdGVzdHMvdGVzdC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uCisKKworQ2xvdmVyIENvZGUgQ292ZXJhZ2UgZm9yIFRocmlmdAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgYnVpbGQgd2lsbCBvcHRpb25hbGx5IGdlbmVyYXRlIENsb3ZlciBDb2RlIGNvdmVyYWdlIGlmIHRoZSBHcmFkbGUgcHJvcGVydHkKK2BjbG92ZXJFbmFibGVkPXRydWVgIGlzIHNldCBpbiB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgb3Igb24gdGhlIGNvbW1hbmQgbGluZQordmlhIGAtUGNsb3ZlckVuYWJsZWQ9dHJ1ZWAuIFRoZSBnZW5lcmF0ZWQgcmVwb3J0IGNhbiBiZSBmb3VuZCB1bmRlciB0aGUgbG9jYXRpb24KK2J1aWxkL3JlcG9ydHMvY2xvdmVyL2h0bWwvaW5kZXguaHRtbC4gSXQgY2FuIGJlIHZpZXdlZCB3aXRoIGEgYnJvd3NlcgorZGlyZWN0bHkgZnJvbSB0aGF0IGxvY2F0aW9uLiBBZGRpdGlvbmFsbHksIGEgUERGIHJlcG9ydCBpcyBnZW5lcmF0ZWQgYW5kIGlzIGZvdW5kCit1bmRlciB0aGUgbG9jYXRpb24gYnVpbGQvcmVwb3J0cy9jbG92ZXIvY2xvdmVyLnBkZi4KKworVGhlIGZvbGxvd2luZyBjb21tYW5kIHdpbGwgYnVpbGQsIHVuaXQgdGVzdCwgYW5kIGdlbmVyYXRlIENsb3ZlciByZXBvcnRzOgorCisgICAgLi9ncmFkbGV3IC1QY2xvdmVyRW5hYmxlZD10cnVlCisKKworUHVibGlzaGluZyBNYXZlbiBBcnRpZmFjdHMgdG8gTWF2ZW4gQ2VudHJhbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgQXV0b21ha2UgYnVpbGQgZ2VuZXJhdGVzIGEgTWFrZWZpbGUgdGhhdCBwcm92aWRlcyB0aGUgY29ycmVjdCBwYXJhbWV0ZXJzCit3aGVuIHlvdSBydW4gdGhlIGJ1aWxkIHByb3ZpZGVkIHRoZSBjb25maWd1cmUuYWMgaGFzIGJlZW4gc2V0IHdpdGggdGhlIGNvcnJlY3QKK3ZlcnNpb24gbnVtYmVyLiBUaGUgR3JhZGxlIGJ1aWxkIHdpbGwgcmVjZWl2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIGJ1aWxkLgorVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgQ01ha2UgYnVpbGQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmUuYWMgZmlsZSB3aWxsCitiZSB1c2VkIGlmIHlvdSBleGVjdXRlIHRoZXNlIGNvbW1hbmRzOgorCisgICAgbWFrZSBtYXZlbi1wdWJsaXNoICAgLS0gVGhpcyBpcyBmb3IgYW4gQXV0b21ha2UgTGludXggYnVpbGQKKyAgICBtYWtlIE1hdmVuUHVibGlzaCAgICAtLSBUaGlzIGlzIGZvciBhIENNYWtlIGdlbmVyYXRlZCBidWlsZAorCitUaGUgdXBsb2FkQXJjaGl2ZXMgdGFzayBpbiBHcmFkbGUgaXMgcHJlY29uZmlndXJlZCB3aXRoIGFsbCBuZWNlc3NhcnkgZGV0YWlscwordG8gc2lnbiBhbmQgcHVibGlzaCB0aGUgYXJ0aWZhY3RzIGZyb20gdGhlIGJ1aWxkIHRvIHRoZSBBcGFjaGUgTWF2ZW4gc3RhZ2luZworcmVwb3NpdG9yeS4gVGhlIHRhc2sgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBleHRlcm5hbGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgdG8KK2F1dGhlbnRpY2F0ZSB0byB0aGUgcmVwb3NpdG9yeSBhbmQgc2lnbiB0aGUgYXJ0aWZhY3RzLiBUaGUgcHJlZmVycmVkIGFwcHJvYWNoCitpcyB0byBjcmVhdGUgb3IgZWRpdCB0aGUgfi8uZ3JhZGxlL2dyYWRsZS5wcm9wZXJ0aWVzIGZpbGUgYW5kIGFkZCB0aGUgZm9sbG93aW5nCitwcm9wZXJ0aWVzIHRvIGl0LgorCisgICAgIyBTaWduaW5nIGtleSBpbmZvcm1hdGlvbiBmb3IgYXJ0aWZhY3RzIFBHUCBzaWduYXR1cmUgKHZhbHVlcyBhcmUgZXhhbXBsZXMpCisgICAgc2lnbmluZy5rZXlJZD0yNDg3NUQ3MworICAgIHNpZ25pbmcucGFzc3dvcmQ9c2VjcmV0CisgICAgc2lnbmluZy5zZWNyZXRLZXlSaW5nRmlsZT0vVXNlcnMvbWUvLmdudXBnL3NlY3JpbmcuZ3BnCisKKyAgICAjIEFwYWNoZSBNYXZlbiBzdGFnaW5nIHJlcG9zaXRvcnkgdXNlciBjcmVkZW50aWFscworICAgIG1hdmVuVXNlcj1tZU15c2VsZkFuZEkKKyAgICBtYXZlblBhc3N3b3JkPU15U3VwZXJBd2Vzb21lU2VjcmV0UGFzc3dvcmQKKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBtYW51YWxseSBwdWJsaXNoIHVzaW5nIHRoZSBHcmFkbGUgYnVpbGQgZGlyZWN0bHkuCitXaXRoIHRoZSBrZXkgaW5mb3JtYXRpb24gYW5kIGNyZWRlbnRpYWxzIGluIHBsYWNlIHRoZSBmb2xsb3dpbmcgd2lsbCBnZW5lcmF0ZQoraWYgbmVlZGVkIHRoZSBidWlsZCBhcnRpZmFjdHMgYW5kIHByb2NlZWQgdG8gcHVibGlzaCB0aGUgcmVzdWx0cy4KKworICAgIC4vZ3JhZGxldyAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcworCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSB0YXJnZXQgcmVwb3NpdG9yeSBmb3IgdGhlIE1hdmVuIFB1YmxpY2F0aW9uCitieSB1c2luZyBhIEdyYWRsZSBwcm9wZXJ0eSwgZm9yIGV4YW1wbGUgeW91IGNhbiBwdWJsaXNoIHNpZ25lZCBKQVIgZmlsZXMgdG8geW91cgorY29tcGFueSBpbnRlcm5hbCBzZXJ2ZXIgaWYgeW91IGFkZCB0aGlzIHRvIHRoZSBjb21tYW5kIGxpbmUgb3IgaW4gdGhlCit+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZS4gVGhlIFVSTCBiZWxvdyBhc3N1bWVzIGEgTmV4dXMgUmVwb3NpdG9yeS4KKworICAgIG1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vbXkuY29tcGFueS5jb20vc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIKKworT3IgdGhlIHNhbWUgb24gdGhlIGNvbW1hbmQgbGluZToKKworICAgIC4vZ3JhZGxldyAtUG1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vbXkuY29tcGFueS5jb20vc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIgLVByZWxlYXNlPXRydWUgLVB0aHJpZnQudmVyc2lvbj0wLjExLjAgdXBsb2FkQXJjaGl2ZXMKKworCitEZXBlbmRlbmNpZXMKKz09PT09PT09PT09PQorCitHcmFkbGUKK2h0dHA6Ly9ncmFkbGUub3JnLworCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMi4wCisKK1RoZSBhY2Nlc3MgbW9kaWZpZXIgb2YgdGhlIEF1dG9FeHBhbmRpbmdCdWZmZXIgY2xhc3MgaGFzIGJlZW4gY2hhbmdlZCBmcm9tCitwdWJsaWMgdG8gZGVmYXVsdCAocGFja2FnZSkgYW5kIHdpbGwgbm8gbG9uZ2VyIGJlIGFjY2Vzc2libGUgYnkgdGhpcmQtcGFydHkKK2xpYnJhcmllcy4KKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgU2hvcnRTdGFjayBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTg0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDUwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2FwcGx5IHBsdWdpbjogJ2NvbS5hbmRyb2lkLmxpYnJhcnknCisKK2FuZHJvaWQgeworICAgIGNvbXBpbGVTZGtWZXJzaW9uIDIzCisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjIzLjAuMSIKKyAgICB1c2VMaWJyYXJ5ICdvcmcuYXBhY2hlLmh0dHAubGVnYWN5JworICAgIHNvdXJjZVNldHMubWFpbi5qYXZhIHsKKyAgICAgICAgc3JjRGlyICcuLi9zcmMnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YScKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEnCisgICAgfQorfQorCityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuQ2VudHJhbCgpCit9CitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgJ29yZy5zbGY0ajpzbGY0ai1hcGk6MS43LjEzJworICAgIGNvbXBpbGUgJ2phdmF4LnNlcnZsZXQ6c2VydmxldC1hcGk6Mi41JworICAgIGNvbXBpbGUgJ29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6NC40LjQnCit9CisKK2J1aWxkc2NyaXB0IHsKKyAgICByZXBvc2l0b3JpZXMgeworICAgICAgICBtYXZlbkNlbnRyYWwoKQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZToxLjUuMCcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZSBiL2xpYi9qYXZhL2FuZHJvaWQvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZTk3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9hbmRyb2lkL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxIEBACityb290UHJvamVjdC5uYW1lPSd0aHJpZnQnCmRpZmYgLS1naXQgYS9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9saWIvamF2YS9hbmRyb2lkL3NyYy9tYWluL0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhYmRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2FuZHJvaWQvc3JjL21haW4vQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8bWFuaWZlc3QgcGFja2FnZT0ib3JnLmFwYWNoZS50aHJpZnQiPgorICA8YXBwbGljYXRpb24gLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC5ncmFkbGUgYi9saWIvamF2YS9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwMmY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDY0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVzaW5nIHRoZSBsZWdhY3kgcGx1Z2luIGNsYXNzcGF0aCBmb3IgQ2xvdmVyIHNvIGl0IGNhbiBiZSBsb2FkZWQgb3B0aW9uYWxseQorYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIGdvb2dsZSgpCisgICAgICAgIGpjZW50ZXIoKQorICAgICAgICBncmFkbGVQbHVnaW5Qb3J0YWwoKQorICAgIH0KKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmJtdXNjaGtvOmdyYWRsZS1jbG92ZXItcGx1Z2luOjIuMi4wJworICAgIH0KK30KKworcGx1Z2lucyB7CisgICAgaWQgJ2phdmEnCisgICAgaWQgJ21hdmVuJworICAgIGlkICdzaWduaW5nJworICAgIGlkICdjb20uZ2l0aHViLmpvaG5yZW5nZWxtYW4uc2hhZG93JyB2ZXJzaW9uICcyLjAuMicKK30KKworZGVzY3JpcHRpb24gPSAnQXBhY2hlIFRocmlmdCBKYXZhIExpYnJhcnknCisKK2RlZmF1bHRUYXNrcyAnYnVpbGQnCisKKy8vIFZlcnNpb24gY29tcG9uZW50cyBmb3IgdGhpcyBwcm9qZWN0Citncm91cCA9IHByb3BlcnR5KCd0aHJpZnQuZ3JvdXBpZCcpCisKKy8vIERyb3AgdGhlIC1kZXYgc3VmZml4LCB3ZSB1c2UgdGhlIFNOQVBTSE9UIHN1ZmZpeCBmb3Igbm9uLXJlbGVhc2UgdmVyc2lvbnMKK2RlZiBwYXJzZWRWZXJzaW9uID0gcHJvcGVydHkoJ3RocmlmdC52ZXJzaW9uJykudG9TdHJpbmcoKS5yZXBsYWNlKCctZGV2JywgJycpCitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5yZWxlYXNlKSkgeworICAgIHZlcnNpb24gPSBwYXJzZWRWZXJzaW9uCit9IGVsc2UgeworICAgIHZlcnNpb24gPSBwYXJzZWRWZXJzaW9uICsgJy1TTkFQU0hPVCcKK30KKworLy8gS2VlcGluZyB0aGUgcmVzdCBvZiB0aGUgYnVpbGQgbG9naWMgaW4gZnVuY3Rpb25hbCBuYW1lZCBzY3JpcHRzIGZvciBjbGFyaXR5CithcHBseSBmcm9tOiAnZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUnCmRpZmYgLS1naXQgYS9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2phdmEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzZjk5MC4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotdGhyaWZ0LnZlcnNpb249MC45LjAKLXRocmlmdC5ncm91cGlkPW9yZy5hcGFjaGUudGhyaWZ0Ci1yZWxlYXNlPXRydWUKLQotIyBKYXIgVmVyc2lvbnMgCi1tdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMwotCi0jIExvY2FsIEluc3RhbGwgcGF0aHMKLWluc3RhbGwucGF0aD0vdXNyL2xvY2FsL2xpYgotaW5zdGFsbC5qYXZhZG9jLnBhdGg9JHtpbnN0YWxsLnBhdGh9Ci0KLSMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKLW12bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCi1hcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcwotbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQotbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCi0KLSMgQXBhY2hlIE1hdmVuIHB1Ymxpc2ggCi1saWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKLW1hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCi1tYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcwotCi0jIEphciBWZXJzaW9ucyAKLW12bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCi0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLnhtbCBiL2xpYi9qYXZhL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxNTFjNS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIAotIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotPHByb2plY3QgbmFtZT0ibGlidGhyaWZ0IiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIgotICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KLSAgCi0gIDxkZXNjcmlwdGlvbj5UaHJpZnQgQnVpbGQgRmlsZTwvZGVzY3JpcHRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQucm9vdCIgbG9jYXRpb249Ii4uLy4uLyIvPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmFydGlmYWN0aWQiIHZhbHVlPSJsaWJ0aHJpZnQiLz4KLQotICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgcHJvcGVydGllcyBmaWxlIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHtiYXNlZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgotCi0gIDxwcm9wZXJ0eSBlbnZpcm9ubWVudD0iZW52Ii8+Ci0KLSAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259Ij4KLSAgICA8aXNzZXQgcHJvcGVydHk9InJlbGVhc2UiLz4KLSAgPC9jb25kaXRpb24+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0tc25hcHNob3QiLz4gCi0KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSIke3RocmlmdC5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2J1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rvb2xzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMudGVzdCIgbG9jYXRpb249InRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2phdmFkb2MiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3QuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGhyaWZ0LmhvbWUiIGxvY2F0aW9uPSIke3RocmlmdC5yb290fS90ZXN0Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Imdlbi1qYXZhIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW5iZWFuIiBsb2NhdGlvbj0iZ2VuLWphdmFiZWFuIi8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9Imphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0uamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Lmphci5maWxlIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9LyR7ZmluYWwubmFtZX0tdGVzdC5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS1qYXZhZG9jLmphciIvPgotICA8cHJvcGVydHkgbmFtZT0ic291cmNlLnRhci5neiIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXNyYy50YXIuZ3oiLz4KLQotICA8IS0tIEp1bml0IHByb3BlcnRpZXMgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Lmp1bml0Lm91dHB1dC5mb3JtYXQiIHZhbHVlPSJwbGFpbiIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC50aW1lb3V0IiB2YWx1ZT0iMjAwMDAwMCIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5zcmMuZGlyIiBsb2NhdGlvbj0iJHtiYXNlZGlyfS90ZXN0Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmxvZy5kaXIiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfS9sb2ciLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QucG9ydCIgdmFsdWU9IjkwOTAiLz4gCi0KLSAgPCEtLSBtYXZlbiBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0icG9tLnhtbCIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LnBvbSIvPgotCi0gIDxwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ij4gCi0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPHBhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7ZW52LkNMQVNTUEFUSH0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phci5maWxlfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Lmphci5maWxlfSIvPgotICA8L3BhdGg+Ci0KLSAgPCEtLSBUYXNrcyAtLT4gCi0gIDx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0ic2V0dXAuaW5pdCxtdm4uaW5pdCIgdW5sZXNzPSJpbml0LmZpbmlzaGVkIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5pdC5maW5pc2hlZCIgdmFsdWU9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmxpYi5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50b29scy5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIgc291cmNlPSIxLjUiIHRhcmdldD0iMS41IiAKLSAgICBkZWJ1Zz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJjb21waWxlLmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmRlcHJlY2F0aW9uIi8+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWRvYyBzb3VyY2VwYXRoPSIke3NyY30iIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IgotICAgICAgdmVyc2lvbj0idHJ1ZSIgd2luZG93dGl0bGU9IlRocmlmdCBKYXZhIEFQSSIgZG9jdGl0bGU9IlRocmlmdCBKYXZhIEFQSSIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgotICAgIDwvamF2YWRvYz4KLSAgICA8amFyIGphcmZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIGJhc2VkaXI9IiR7amF2YWRvYy5kaXJ9Ij4KLSAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYiLz4KLSAgICA8Y29weSBmaWxlPSIke3RocmlmdC5yb290fS9MSUNFTlNFIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9NRVRBLUlORi9MSUNFTlNFLnR4dCIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L05PVElDRSIgdG9maWxlPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYvTk9USUNFLnR4dCIvPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIgdmFsdWU9IjIiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtU3ltYm9saWNOYW1lIiB2YWx1ZT0iJHt0aHJpZnQuZ3JvdXBpZH0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTmFtZSIgdmFsdWU9IkFwYWNoZSBUaHJpZnQiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtRGVzY3JpcHRpb24iIHZhbHVlPSJBcGFjaGUgVGhyaWZ0IGxpYnJhcnkiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTGljZW5zZSIgdmFsdWU9IiR7bGljZW5zZX0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtQWN0aXZhdGlvblBvbGljeSIgdmFsdWU9ImxhenkiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHBvcnQtUGFja2FnZSIgdmFsdWU9IiR7dGhyaWZ0Lmdyb3VwaWR9O3ZlcnNpb249JHt2ZXJzaW9ufSIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXJ9Ij4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90aHJpZnQvKiovKi5jbGFzcyIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSJNRVRBLUlORi8qLnR4dCIvPgotICAgICAgPC9maWxlc2V0PgotICAgICAgPGZpbGVzZXQgZGlyPSJzcmMiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwYWNrLnNyYyI+Ci0gICAgPHRhciBkZXN0ZmlsZT0iJHtzb3VyY2UudGFyLmd6fSIgYmFzZWRpcj0iJHtzcmN9IiBjb21wcmVzc2lvbj0iZ3ppcCIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imluc3RhbGwiIGRlcGVuZHM9ImRpc3QsamF2YWRvYyI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbC5wYXRofSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSIgaW5jbHVkZXM9IiouamFyIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQubGliLmRpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgIDwvY29weT4KLSAgICA8Y29weSB0b2Rpcj0iJHtpbnN0YWxsLmphdmFkb2MucGF0aH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmFkb2MuZGlyfSIgaW5jbHVkZXM9IioqLyoiLz4KLSAgICA8L2NvcHk+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VuYmVhbn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3QiIGRlc2NyaXB0aW9uPSJCdWlsZCB0aGUgdGVzdCBzdWl0ZSBjbGFzc2VzIiBkZXBlbmRzPSJnZW5lcmF0ZSxkaXN0Ij4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICA8L2phdmFjPiAgCi0gICAgPGphdmFjIGRlYnVnPSJ0cnVlIiBzcmNkaXI9IiR7Z2VuYmVhbn0iIGRlc3RkaXI9IiR7YnVpbGQudGVzdC5kaXJ9IiBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiPgotICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDpkZXByZWNhdGlvbiIvPiAgCi0gICAgPC9qYXZhYz4gIAotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke3NyYy50ZXN0fSIgZGVzdGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSI+Ci0gICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmRlcHJlY2F0aW9uIi8+Ci0gICAgPC9qYXZhYz4gIAotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLnRlc3QuZGlyfSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLnRlc3R9IiBpbmNsdWRlcz0ibG9nNGoucHJvcGVydGllcyIvPgotICAgIDwvY29weT4KLSAgICA8amFyIGphcmZpbGU9IiR7dGVzdC5qYXIuZmlsZX0iIGJhc2VkaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ianVuaXQtdGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgSlVuaXQgdGVzdCBzdWl0ZSIgZGVwZW5kcz0iY29tcGlsZS10ZXN0Ij4KLSAgICA8bWtkaXIgZGlyPSIke3Rlc3QubG9nLmRpcn0iLz4KLSAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ0cnVlIiBzaG93b3V0cHV0PSIke3Rlc3Qub3V0cHV0fSIgdGltZW91dD0iJHt0ZXN0LnRpbWVvdXR9IiAKLSAgICAgIGhhbHRvbmZhaWx1cmU9InRydWUiIGVycm9yUHJvcGVydHk9InRlc3RzLmZhaWxlZCIgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0cy5mYWlsZWQiCi0gICAgICBmb3JrPSJ0cnVlIiBmb3JrbW9kZT0icGVyVGVzdCIgbWF4bWVtb3J5PSI1MTJtIgotICAgID4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJ1aWxkLnRlc3QiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0idGVzdC5wb3J0IiB2YWx1ZT0iJHt0ZXN0LnBvcnR9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8udHJ1c3RzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiIHZhbHVlPSJ0aHJpZnQiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8ua2V5c3RvcmUiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHt0ZXN0Lmp1bml0Lm91dHB1dC5mb3JtYXR9Ii8+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QubG9nLmRpcn0iIHVubGVzcz0idGVzdGNhc2UiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSIvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3RDbGllbnQuamF2YSIvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3RTZXJ2ZXIuamF2YSIvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0LmxvZy5kaXJ9IiBpZj0idGVzdGNhc2UiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSIgaW5jbHVkZXM9IioqLyR7dGVzdGNhc2V9LmphdmEiLz4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gICAgPGZhaWwgaWY9InRlc3RzLmZhaWxlZCI+VGVzdHMgZmFpbGVkITwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkZXByZWNhdGVkLXRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5FcXVhbGl0eVRlc3QiIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIi8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QiIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgZnVsbCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJqdW5pdC10ZXN0LGRlcHJlY2F0ZWQtdGVzdCIvPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3QgY2xpZW50IiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Q2xpZW50IgotICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSIke3Rlc3RhcmdzfSIvPgotICAgIDwvamF2YT4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0c2VydmVyIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3Rub25ibG9ja2luZ3NlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgbm9uYmxvY2tpbmcgc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9IiR7dGVzdGFyZ3N9Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KLSAgICA8IS0tIEdlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmEgc291cmNlIC0tPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L1RocmlmdFRlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpoYXNoY29kZSAke3Rlc3QudGhyaWZ0LmhvbWV9L0RlYnVnUHJvdG9UZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhOmJlYW5zLG5vY2FtZWwgJHt0ZXN0LnRocmlmdC5ob21lfS9KYXZhQmVhbnNUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6aGFzaGNvZGUgJHt0ZXN0LnRocmlmdC5ob21lfS9NYW55T3B0aW9uYWxzLnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwcm94eSIgaWY9InByb3h5LmVuYWJsZWQiPgotICAgIDxzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKLSAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayxwcm94eSIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KLSAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4gCi0KLSAgPHRhcmdldCBuYW1lPSJtdm4uaW5pdCIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgotICAgIDwhLS0gRG93bmxvYWQgbXZuIGFudCB0YXNrcywgZG93bmxvYWQgZGVwZW5kZW5jaWVzLCBhbmQgc2V0dXAgcG9tIGZpbGUgLS0+Ci0gICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aD0iJHtidWlsZC50b29scy5kaXJ9LyR7bXZuLmFudC50YXNrLmphcn0iLz4KLQotICAgIDwhLS0gcmVtb3RlIHJlcG9zaXRvcmllcyB1c2VkIHRvIGRvd25sb2FkIGRlcGVuZGVuY2llcyBmcm9tIC0tPgotICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJjZW50cmFsIiB1cmw9IiR7bXZuLnJlcG99Ii8+Ci0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImFwYWNoZSIgdXJsPSIke2FwYWNoZS5yZXBvfSIvPgotCi0gICAgPCEtLSBQb20gZmlsZSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iIAotICAgICAgZ3JvdXBJZD0iJHt0aHJpZnQuZ3JvdXBpZH0iIAotICAgICAgYXJ0aWZhY3RJZD0iJHt0aHJpZnQuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKLSAgICAgIHVybD0iaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgotICAgICAgbmFtZT0iQXBhY2hlIFRocmlmdCIKLSAgICAgIGRlc2NyaXB0aW9uPSJUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LiIKLSAgICAgIHBhY2thZ2luZz0icG9tIgotICAgID4KLSAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+Ci0gICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+Ci0gICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iIAotICAgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0L3RydW5rLyIKLSAgICAgICAgdXJsPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvdGhyaWZ0IgotICAgICAgLz4KLSAgICAgIDwhLS0gVGhyaWZ0IERldmVsb3BlcnMgLS0+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtY3NsZWUiIG5hbWU9Ik1hcmsgU2xlZSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iZHJlaXNzIiBuYW1lPSJEYXZpZCBSZWlzcyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYWRpdHlhIiBuYW1lPSJBZGl0eWEgQWdhcndhbCIvPgotICAgICAgPGRldmVsb3BlciBpZD0ibWFyY2siIG5hbWU9Ik1hcmMgS3dpYXRrb3dza2kiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Imp3YW5nIiBuYW1lPSJKYW1lcyBXYW5nIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJjcGlybyIgbmFtZT0iQ2hyaXMgUGlybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYm1hdXJlciIgbmFtZT0iQmVuIE1hdXJlciIvPgotICAgICAgPGRldmVsb3BlciBpZD0ia2NsYXJrIiBuYW1lPSJLZXZpbiBDbGFyayIvPgotICAgICAgPGRldmVsb3BlciBpZD0iamFrZSIgbmFtZT0iSmFrZSBMdWNpYW5pIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJicnlhbmR1eGJ1cnkiIG5hbWU9IkJyeWFuIER1eGJ1cnkiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImVzdGV2ZSIgbmFtZT0iRXN0ZXZlIEZlcm5hbmRleiIvPgotICAgICAgPGRldmVsb3BlciBpZD0idG9kZCIgbmFtZT0iVG9kZCBMaXBjb24iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImdlZWNob3JhbWEiIG5hbWU9IkFuZHJldyBNY0dlYWNoaWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1vbGluYXJvIiBuYW1lPSJBbnRob255IE1vbGluYXJvIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJyb2dlciIgbmFtZT0iUm9nZXIgTWVpZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImpmYXJyZWxsIiBuYW1lPSJKYWtlIEZhcnJlbGwiLz4KLQotICAgICAgPCEtLSBUaHJpZnQgZGVwZW5kZW5jaWVzIGxpc3QgLS0+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWFwaSIgdmVyc2lvbj0iMS41LjgiLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbW1vbnMtbGFuZyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1sYW5nIiB2ZXJzaW9uPSIyLjUiLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImphdmF4LnNlcnZsZXQiIGFydGlmYWN0SWQ9InNlcnZsZXQtYXBpIiB2ZXJzaW9uPSIyLjUiIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5odHRwY29tcG9uZW50cyIgYXJ0aWZhY3RJZD0iaHR0cGNsaWVudCIgdmVyc2lvbj0iNC4xLjMiLz4gICAgICAKLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjb3JlIiB2ZXJzaW9uPSI0LjEuMyIvPgotICAgIDwvYXJ0aWZhY3Q6cG9tPgotCi0gICAgPCEtLSBHZW5lcmF0ZSB0aGUgcG9tIGZpbGUgLS0+Ci0gICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJwb20iIGZpbGU9IiR7cG9tLnhtbH0iLz4KLQotICAgIDwhLS0gRG93bmxvYWQgdGhlIGRlcGVuZGVuY2llcyAtLT4KLSAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0iYnVpbGQtZGVwZW5kZW5jeS1qYXJzIiBwb21SZWZJZD0icG9tIi8+Ci0KLSAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2xpYiI+Ci0gICAgICA8ZmlsZXNldCByZWZpZD0iYnVpbGQtZGVwZW5kZW5jeS1qYXJzIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8IS0tIERlcGVuZGVuY2llcyBuZWVkZWQgZm9yIHRlc3RpbmcgLS0+Ci0gICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9InRlc3QtZGVwZW5kZW5jeS1qYXJzIiB1c2VTY29wZT0icnVudGltZSI+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWxvZzRqMTIiIHZlcnNpb249IjEuNS44Ii8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJqdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQiIHZlcnNpb249IjQuNCIvPgotICAgIDwvYXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzPgotCi0gICAgPCEtLSBDb3B5IHRoZSB0ZXN0IGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5kaXJ9L2xpYiI+Ci0gICAgICA8ZmlsZXNldCByZWZpZD0idGVzdC1kZXBlbmRlbmN5LWphcnMiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgotICAgIDwvY29weT4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJtdm4uZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDxtYWNyb2RlZiBuYW1lPSJzaWduQW5kRGVwbG95Ij4KLSAgICA8IS0tIFNpZ24gYW5kIGRlcGxveSBqYXJzIHRvIGFwYWNoZSByZXBvIC0tPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmlsZSIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3NpZmllciIgZGVmYXVsdD0iIi8+Ci0gICAgPGF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdpbmciIGRlZmF1bHQ9ImphciIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tIiBkZWZhdWx0PSIiLz4KLSAgICA8c2VxdWVudGlhbD4KLSAgICAgIDxhcnRpZmFjdDptdm4gZm9yaz0idHJ1ZSI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1ncGctcGx1Z2luOjEuMTpzaWduLWFuZC1kZXBsb3ktZmlsZSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHJlcG9zaXRvcnlJZD0ke21hdmVuLXJlcG9zaXRvcnktaWR9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EdXJsPSR7bWF2ZW4tcmVwb3NpdG9yeS11cmx9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcG9tRmlsZT1Ae3BvbX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURmaWxlPUB7ZmlsZX0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURjbGFzc2lmaWVyPUB7Y2xhc3NpZmllcn0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURwYWNrYWdpbmc9QHtwYWNrYWdpbmd9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1QZ3BnIi8+Ci0gICAgICA8L2FydGlmYWN0Om12bj4KLSAgICA8L3NlcXVlbnRpYWw+Ci0gIDwvbWFjcm9kZWY+Ci0KLSAgPHRhcmdldCBuYW1lPSJwdWJsaXNoIiBkZXBlbmRzPSJjbGVhbixpbml0LHRlc3QsZGlzdCxqYXZhZG9jLHBhY2suc3JjIj4KLSAgICA8IS0tIENvbXBpbGUsIHBhY2thZ2UsIHRlc3QgYW5kIHRoZW4gc2VuZCByZWxlYXNlIHRvIGFwYWNoZSBtYXZlbiByZXBvIC0tPgotICAgIDwhLS0gcnVuIHdpdGg6IGFudCAtRHJlbGVhc2U9dHJ1ZSBwdWJsaXNoLS0+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtwb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gICAgPHNpZ25BbmREZXBsb3kgZmlsZT0iJHtqYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtwb20ueG1sfSIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIHBhY2thZ2luZz0iamFyIiBjbGFzc2lmaWVyPSJqYXZhZG9jIiBwb209IiR7cG9tLnhtbH0iLz4KLSAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke3NvdXJjZS50YXIuZ3p9IiBwYWNrYWdpbmc9InNyYyIgY2xhc3NpZmllcj0idGFyLmd6IiBwb209IiR7cG9tLnhtbH0iLz4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCBiL2xpYi9qYXZhL2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhOTNiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApAQCAtMCwwICsxLDUxIEBACis8RmluZEJ1Z3NGaWx0ZXI+CisgICAgPCEtLQorICAgICAgICBUaGlzIGZpbGUgY29udHJvbHMgZmlsdGVyaW5nIHNvbWUgb2YgdGhlIG1vcmUgb2Jub3hpb3VzIGZpbmRidWdzIHJlcG9ydHMuCisgICAgICAgIFNvbWUgbWF5IGJlIHdvcnRoeSBvZiBleGFtaW5hdGlvbiBhbmQgcmVzb2x1dGlvbiwgb3RoZXJzIGFyZSB0b28gbml0LXBpY2t5LgorICAgIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPE9yPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgdGhlIG1pc3Npbmcgc2VyaWFsVmVyc2lvblVJRCBlcnJvcnMgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNuVkkiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBNYWxpY2lvdXMgY29kZSB2dWxuZXJhYmlsaXR5IFdhcm5pbmdzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJFSSxFSTIiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBVbmNoZWNrZWQvdW5jb25maXJtZWQgY2FzdCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iQkMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTaG91bGQgcmV0dXJuIGEgemVybyBsZW5ndGggYXJyYXkgcmF0aGVyIHRoYW4gbnVsbD8gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlBaTEEiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBSZWR1bmRhbnQgbnVsbGNoZWNrIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSQ04iIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBFeGNlcHRpb24gaXMgY2F1Z2h0IHdoZW4gRXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlJFQyIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFN3aXRjaCBzdGF0ZW1lbnQgZm91bmQgd2hlcmUgZGVmYXVsdCBjYXNlIGlzIG1pc3NpbmcgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlNGIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5yZWFkIHB1YmxpYy9wcm90ZWN0ZWQgZmllbGQgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IlVyRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIEZpZWxkIG5vdCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvciBhbmQgZGVyZWZlcmVuY2VkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVd0YiIC8+CisgICAgICAgIDwvT3I+CisgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgaW52b2tlcyBTeXN0ZW0uZXhpdCguLi4pLCB3aGljaCBzaHV0cyBkb3duIHRoZSBlbnRpcmUgdmlydHVhbCBtYWNoaW5lIC0tPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgICA8TWV0aG9kIG5hbWU9InByaW50VXNhZ2UiIC8+CisgICAgICAgIDxCdWcgY29kZT0iRG0iIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIG1pZ2h0IGlnbm9yZSBqYXZhLmxhbmcuRXhjZXB0aW9uIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNpbXBsZUZpbGVUcmFuc3BvcnQiIC8+CisgICAgICAgPE1ldGhvZCBuYW1lPSJjbG9zZSIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQuVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudCRNdWx0aUZldGNoIiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0icnVuIiAvPgorICAgICAgIDxCdWcgY29kZT0iREUiIC8+CisgICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgQ2xhc3MgZGVmaW5lcyBub24tdHJhbnNpZW50IG5vbi1zZXJpYWxpemFibGUgaW5zdGFuY2UgZmllbGQgLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmxldCIgLz4KKyAgICAgICA8QnVnIGNvZGU9IlNlIiAvPgorICAgICA8L01hdGNoPgorPC9GaW5kQnVnc0ZpbHRlcj4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTZhOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorIyBUaGlzIGZpbGUgaXMgc2hhcmVkIGN1cnJlbnRseSBiZXR3ZWVuIHRoaXMgR3JhZGxlIGJ1aWxkIGFuZCB0aGUKKyMgQW50IGJ1aWxkcyBmb3IgZmQzMDMgYW5kIEphdmFTY3JpcHQuIEtlZXAgdGhlIGRvdHRlZCBub3RhdGlvbiBmb3IKKyMgdGhlIHByb3BlcnRpZXMgdG8gbWluaW1pemUgdGhlIGNoYW5nZXMgaW4gdGhlIGRlcGVuZGVuY2llcy4KK3RocmlmdC52ZXJzaW9uPTEuMC4wCit0aHJpZnQuZ3JvdXBpZD1vcmcuYXBhY2hlLnRocmlmdAorcmVsZWFzZT10cnVlCisKKyMgTG9jYWwgSW5zdGFsbCBwYXRocworaW5zdGFsbC5wYXRoPS91c3IvbG9jYWwvbGliCitpbnN0YWxsLmphdmFkb2MucGF0aD0vdXNyL2xvY2FsL2xpYgorCisjIFRlc3QgZXhlY3V0aW9uIHByb3BlcnRpZXMKK3Rlc3RQb3J0PTkwOTAKKworIyBUZXN0IHdpdGggQ2xvdmVyIENvZGUgY292ZXJhZ2UgKGRpc2FibGVkIGJ5IGRlZmF1bHQpCitjbG92ZXJFbmFibGVkPWZhbHNlCisKKyMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCithcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcworCisjIEFwYWNoZSBNYXZlbiBwdWJsaXNoCitsaWNlbnNlPWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC50eHQKK21hdmVuLXJlcG9zaXRvcnktdXJsPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL3NlcnZpY2UvbG9jYWwvc3RhZ2luZy9kZXBsb3kvbWF2ZW4yCittYXZlbi1yZXBvc2l0b3J5LWlkPWFwYWNoZS5yZWxlYXNlcy5odHRwcworCisjIERlcGVuZGVuY3kgdmVyc2lvbnMKK2h0dHBjbGllbnQudmVyc2lvbj00LjQuMQoraHR0cGNvcmUudmVyc2lvbj00LjQuMQorc2xmNGoudmVyc2lvbj0xLjcuMTIKK3NlcnZsZXQudmVyc2lvbj0yLjUKK2p1bml0LnZlcnNpb249NC4xMgorbW9ja2l0by52ZXJzaW9uPTEuOS41CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNDY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpAQCAtMCwwICsxLDQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBtYWluIEphdmEgc291cmNlcy4nCisKKyAgICBjbGFzc2lmaWVyICdzb3VyY2VzJworICAgIGZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCit0YXNrIGphdmFkb2NKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGphdmFkb2MsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgSmF2YURvYy4nCisKKyAgICBjbGFzc2lmaWVyICdqYXZhZG9jJworICAgIGZyb20gamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCithcnRpZmFjdHMgeworICAgIGFyY2hpdmVzIHNvdXJjZXNKYXIKKyAgICBhcmNoaXZlcyBqYXZhZG9jSmFyCit9CisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjBlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY2xvdmVyQ292ZXJhZ2UuZ3JhZGxlCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBLZWVwIHRoaXMgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBmb3Igbm93LCBkaXNhYmxlZCBieSBkZWZhdWx0CitpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvamVjdC5jbG92ZXJFbmFibGVkKSkgeworICAgIGFwcGx5IHBsdWdpbjogJ2NvbS5ibXVzY2hrby5jbG92ZXInCisKKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbG92ZXIgJ29yZy5vcGVuY2xvdmVyOmNsb3Zlcjo0LjIuKycKKyAgICB9CisKKyAgICBjbG92ZXIgeworCisgICAgICAgIHRlc3RJbmNsdWRlcyA9IFsnKiovVGVzdCouamF2YSddCisgICAgICAgIC8vIEV4Y2x1ZGUgdGhlIGdlbmVyYXRlZCB0ZXN0IGNvZGUgZnJvbSBjb2RlIGNvdmVyYWdlCisgICAgICAgIHRlc3RFeGNsdWRlcyA9IFsndGhyaWZ0L3Rlc3QvVGVzdCouamF2YSddCisKKyAgICAgICAgY29tcGlsZXIgeworICAgICAgICAgICAgZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgICAgICAgICBkZWJ1ZyA9IHRydWUKKyAgICAgICAgfQorCisgICAgICAgIHJlcG9ydCB7CisgICAgICAgICAgICBodG1sID0gdHJ1ZQorICAgICAgICAgICAgcGRmID0gdHJ1ZQorICAgICAgICB9CisgICAgfQorCisgICAgYnVpbGQuZGVwZW5kc09uIGNsb3ZlckdlbmVyYXRlUmVwb3J0Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmYxYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZQpAQCAtMCwwICsxLDM5IEBACisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBDb25maWd1cmUgdGhlIEdyYWRsZSBjb2RlIHF1YWxpdHkgcGx1Z2lucyBoZXJlLgorLy8KKworYXBwbHkgcGx1Z2luOiAnZmluZGJ1Z3MnCisKK2ZpbmRidWdzIHsKKyAgICBpZ25vcmVGYWlsdXJlcyA9IHRydWUKKyAgICB0b29sVmVyc2lvbiA9ICczLjAuMScKKyAgICBzb3VyY2VTZXRzID0gWyBzb3VyY2VTZXRzLm1haW4gXQorICAgIGVmZm9ydCA9ICdtYXgnCisgICAgcmVwb3J0TGV2ZWwgPSAnbG93JworICAgIGV4Y2x1ZGVGaWx0ZXIgPSBmaWxlKCdjb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbCcpCit9CisKK3Rhc2tzLndpdGhUeXBlKEZpbmRCdWdzKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIHRleHQuZW5hYmxlZCA9IGZhbHNlCisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KKworYXBwbHkgcGx1Z2luOiAncG1kJworCitwbWQgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzYuMC4wJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgcnVsZVNldHMgPSBbICdqYXZhLWJhc2ljJyBdCit9CisKK3Rhc2tzLndpdGhUeXBlKFBtZCkgeworICAgIHJlcG9ydHMgeworICAgICAgICBodG1sLmVuYWJsZWQgPSB0cnVlCisgICAgICAgIHhtbC5lbmFibGVkID0gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdlYjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2Vudmlyb25tZW50LmdyYWRsZQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gT3ZlcnJpZGUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpZiBDTWFrZSBpcyB1c2VkIChhbGxvd3MgZm9yIG91dC1vZi10cmVlLWJ1aWxkcykKK2lmIChoYXNQcm9wZXJ0eSgnYnVpbGQuZGlyJykpIHsKKyAgICBidWlsZERpciA9IGZpbGUocHJvcGVydHkoJ2J1aWxkLmRpcicpKQorfQorCisvLyBJbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIG90aGVyIEFudCBiYXNlZCBidWlsZHMgaW4gdGhlIHN5c3RlbQorLy8gd2UgY29udmVydCB0aGUgZ3JhZGxlLnByb3BlcnRpZXMgaW50byBEU0wgZnJpZW5kbHkgY2FtZWxDYXNlZCBwcm9wZXJ0aWVzCitleHQuaW5zdGFsbFBhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5wYXRoJykKK2V4dC5pbnN0YWxsSmF2YWRvY1BhdGggPSBwcm9wZXJ0eSgnaW5zdGFsbC5qYXZhZG9jLnBhdGgnKQorCitleHQudGhyaWZ0Um9vdCA9IGZpbGUoJy4uLy4uJykKKworaWYgKGhhc1Byb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKSkgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9IHByb3BlcnR5KCd0aHJpZnQuY29tcGlsZXInKQorfSBlbHNlIHsKKyAgICBleHQudGhyaWZ0Q29tcGlsZXIgPSAiJHRocmlmdFJvb3QvY29tcGlsZXIvY3BwL3RocmlmdCIKK30KKworZXh0Lm12blJlcG8gPSBwcm9wZXJ0eSgnbXZuLnJlcG8nKQorZXh0LmFwYWNoZVJlcG8gPSBwcm9wZXJ0eSgnYXBhY2hlLnJlcG8nKQorZXh0Lm1hdmVuUmVwb3NpdG9yeVVybCA9IHByb3BlcnR5KCdtYXZlbi1yZXBvc2l0b3J5LXVybCcpCisKKy8vIFZlcnNpb25zIHVzZWQgaW4gdGhpcyBwcm9qZWN0CitleHQuaHR0cGNsaWVudFZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNsaWVudC52ZXJzaW9uJykKK2V4dC5odHRwY29yZVZlcnNpb24gPSBwcm9wZXJ0eSgnaHR0cGNvcmUudmVyc2lvbicpCitleHQuc2VydmxldFZlcnNpb24gPSBwcm9wZXJ0eSgnc2VydmxldC52ZXJzaW9uJykKK2V4dC5zbGY0alZlcnNpb24gPSBwcm9wZXJ0eSgnc2xmNGoudmVyc2lvbicpCitleHQuanVuaXRWZXJzaW9uID0gcHJvcGVydHkoJ2p1bml0LnZlcnNpb24nKQorZXh0Lm1vY2tpdG9WZXJzaW9uID0gcHJvcGVydHkoJ21vY2tpdG8udmVyc2lvbicpCisKKy8vIEluIHRoaXMgc2VjdGlvbiB5b3UgZGVjbGFyZSB3aGVyZSB0byBmaW5kIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0CityZXBvc2l0b3JpZXMgeworICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnTWF2ZW4gQ2VudHJhbCBSZXBvc2l0b3J5JworICAgICAgICB1cmwgbXZuUmVwbworICAgIH0KKyAgICBtYXZlbiB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBNYXZlbiBSZXBvc2l0b3J5JworICAgICAgICB1cmwgYXBhY2hlUmVwbworICAgIH0KK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICBjb21waWxlICJvcmcuc2xmNGo6c2xmNGotYXBpOiR7c2xmNGpWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjbGllbnQ6JHtodHRwY2xpZW50VmVyc2lvbn0iCisgICAgY29tcGlsZSAib3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZToke2h0dHBjb3JlVmVyc2lvbn0iCisgICAgY29tcGlsZSAiamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToke3NlcnZsZXRWZXJzaW9ufSIKKworICAgIHRlc3RDb21waWxlICJqdW5pdDpqdW5pdDoke2p1bml0VmVyc2lvbn0iCisgICAgdGVzdENvbXBpbGUgIm9yZy5tb2NraXRvOm1vY2tpdG8tYWxsOiR7bW9ja2l0b1ZlcnNpb259IgorICAgIHRlc3RSdW50aW1lICJvcmcuc2xmNGo6c2xmNGotbG9nNGoxMjoke3NsZjRqVmVyc2lvbn0iCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjBkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZ1bmN0aW9uYWwgdGVzdGluZyBoYXJuZXNzIGNyZWF0aW9uLiBUaGlzIGhlbHBzIHJ1biB0aGUgY3Jvc3MtY2hlY2sgdGVzdHMuCisvLyBUaGUgTWFrZWZpbGUgcHJlY3Jvc3MgdGFyZ2V0IGludm9rZXMgdGhlIHNoYWRvd0phciB0YXNrIGFuZCB0aGUgdGVzdHMuanNvbgorLy8gY29kZSBpcyBjaGFuZ2VkIHRvIGNhbGwgcnVuY2xpZW50IG9yIHJ1bnNlcnZlciBhcyBuZWVkZWQuCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3NzIFRlc3Qgc291cmNlcyBhcmUgc2VwYXJhdGVkIGluIHRoZWlyIG93biBzb3VyY2VTZXQKKy8vCitzb3VyY2VTZXRzIHsKKyAgICBjcm9zc1Rlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdENsaWVudC5qYXZhJworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0U2VydmVyLmphdmEnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhJworICAgICAgICB9CisgICAgfQorfQorCitjb25maWd1cmF0aW9ucyB7CisgICAgY3Jvc3NUZXN0Q29tcGlsZSB7IGV4dGVuZHNGcm9tIHRlc3RDb21waWxlIH0KKyAgICBjcm9zc1Rlc3RSdW50aW1lIHsgZXh0ZW5kc0Zyb20gY3Jvc3NUZXN0Q29tcGlsZSwgdGVzdFJ1bnRpbWUgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy5tYWluLm91dHB1dAorICAgIGNyb3NzVGVzdENvbXBpbGUgc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyBJIGFtIHVzaW5nIHNoYWRvdyBwbHVnaW4gdG8gbWFrZSBhIHNlbGYgY29udGFpbmVkIGZ1bmN0aW9uYWwgdGVzdCBVYmVyIEpBUiB0aGF0CisvLyBlbGltaW5hdGVzIHN0YXJ0dXAgcHJvYmxlbXMgd2l0aCB3cmFwcGluZyB0aGUgY3Jvc3MtY2hlY2sgaGFybmVzcyBpbiBHcmFkbGUuCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHJ1bm5lciBzY3JpcHRzIGFzIHRoZSBzaW5nbGUgY2xhc3NwYXRoIGVudHJ5IHdoaWNoCisvLyBhbGxvd3MgdGhlIHByb2Nlc3MgdG8gYmUgYXMgbGlnaHR3ZWlnaHQgYXMgaXQgY2FuLgorc2hhZG93SmFyIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZSBhIHRlc3QgSkFSIGZpbGUgZm9yIGNyb3NzLWNoZWNrIGV4ZWN1dGlvbicKKyAgICAvLyBtYWtlIHN1cmUgdGhlIHJ1bm5lcnMgYXJlIGNyZWF0ZWQgd2hlbiB0aGlzIHJ1bnMKKyAgICBkZXBlbmRzT24gJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yQ2xpZW50JywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yU2VydmVyJywgJ2dlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXInCisKKyAgICBiYXNlTmFtZSA9ICdmdW5jdGlvbmFsVGVzdCcKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiRidWlsZERpci9mdW5jdGlvbmFsVGVzdEphciIpCisgICAgY2xhc3NpZmllciA9IG51bGwKKworICAgIC8vIFdlIGRvIG5vdCBuZWVkIGEgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgaW50ZXJuYWwgamFyCisgICAgdmVyc2lvbiA9IG51bGwKKworICAgIC8vIEJ1bmRsZSB0aGUgY29tcGxldGUgc2V0IG9mIHVuaXQgdGVzdCBjbGFzc2VzIGluY2x1ZGluZyBnZW5lcmF0ZWQgY29kZQorICAgIC8vIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gb25lIEpBUiB0byBleHBlZGl0ZSBleGVjdXRpb24uCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0CisgICAgZnJvbSBzb3VyY2VTZXRzLmNyb3NzVGVzdC5vdXRwdXQKKyAgICBjb25maWd1cmF0aW9ucyA9IFtwcm9qZWN0LmNvbmZpZ3VyYXRpb25zLnRlc3RSdW50aW1lXQorfQorCisvLyBDb21tb24gc2NyaXB0IHJ1bm5lciBjb25maWd1cmF0aW9uIGVsZW1lbnRzCitkZWYgc2NyaXB0RXh0ID0gJycKK2RlZiBleGVjRXh0ID0gJycKK2RlZiBzY3JpcHRIZWFkID0gJyMhL2Jpbi9iYXNoJworZGVmIGFyZ3MgPSAnJConCisKKy8vIEFsdGhvdWdoIHRoaXMgaXMgbWFya2VkIGludGVybmFsIGl0IGlzIGFuIGF2YWlsYWJsZSBhbmQgc3RhYmxlIGludGVyZmFjZQoraWYgKG9yZy5ncmFkbGUuaW50ZXJuYWwub3MuT3BlcmF0aW5nU3lzdGVtLmN1cnJlbnQoKS53aW5kb3dzKSB7CisgICAgc2NyaXB0RXh0ID0gJy5iYXQnCisgICAgZXhlY0V4dCA9ICcuZXhlJworICAgIHNjcmlwdEhlYWQgPSAnQGVjaG8gb2ZmJworICAgIGFyZ3MgPSAnJSonCit9CisKKy8vIFRoZSBKYXZhIGV4ZWN1dGFibGUgdG8gdXNlIHdpdGggdGhlIHJ1bm5lciBzY3JpcHRzCitkZWYgamF2YUV4ZSA9IGZpbGUoIiR7U3lzdGVtLmdldFByb3BlcnR5KCdqYXZhLmhvbWUnKX0vYmluL2phdmEke2V4ZWNFeHR9IikuY2Fub25pY2FsUGF0aAorLy8gVGhlIGNvbW1vbiBVYmVyIGphciBwYXRoCitkZWYgamFyUGF0aCA9IHNoYWRvd0phci5hcmNoaXZlUGF0aC5jYW5vbmljYWxQYXRoCitkZWYgdHJ1c3RTdG9yZSA9IGZpbGUoJ3Rlc3QvLnRydXN0c3RvcmUnKS5jYW5vbmljYWxQYXRoCitkZWYga2V5U3RvcmUgPSBmaWxlKCd0ZXN0Ly5rZXlzdG9yZScpLmNhbm9uaWNhbFBhdGgKKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvckNsaWVudChncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0Q2xpZW50JworCisgICAgZGVmIGNsaWVudEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuY2xpZW50JHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5DbGllbnRUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlPSR0cnVzdFN0b3JlIiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQgJGFyZ3MKKyIiIgorICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuQ2xpZW50VGV4dCcsIHJ1bkNsaWVudFRleHQKKyAgICBvdXRwdXRzLmZpbGUgY2xpZW50RmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgY2xpZW50RmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIGNsaWVudEZpbGUudGV4dCA9IHJ1bkNsaWVudFRleHQKKyAgICAgICAgY2xpZW50RmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KKwordGFzayBnZW5lcmF0ZVJ1bm5lclNjcmlwdEZvclNlcnZlcihncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0U2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVuc2VydmVyJHtzY3JpcHRFeHR9IikKKworICAgIGRlZiBydW5TZXJ2ZXJUZXh0ID0gIiIiXAorJHtzY3JpcHRIZWFkfQorCisiJHtqYXZhRXhlfSIgLWNwICIkamFyUGF0aCIgIi1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0ka2V5U3RvcmUiIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkPXRocmlmdCBvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIgJGFyZ3MKKyIiIgorCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5TZXJ2ZXJUZXh0JywgcnVuU2VydmVyVGV4dAorICAgIG91dHB1dHMuZmlsZSBzZXJ2ZXJGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBzZXJ2ZXJGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgc2VydmVyRmlsZS50ZXh0ID0gcnVuU2VydmVyVGV4dAorICAgICAgICBzZXJ2ZXJGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yTm9uYmxvY2tpbmdTZXJ2ZXIoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhIHJ1bm5lciBzY3JpcHQgZm9yIGNyb3NzLWNoZWNrIHRlc3RzIHdpdGggVGVzdE5vbmJsb2NraW5nU2VydmVyJworCisgICAgZGVmIHNlcnZlckZpbGUgPSBmaWxlKCIkYnVpbGREaXIvcnVubm9uYmxvY2tpbmdzZXJ2ZXIke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1blNlcnZlclRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSRrZXlTdG9yZSIgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdE5vbmJsb2NraW5nU2VydmVyICRhcmdzCisiIiIKKworICAgIGlucHV0cy5wcm9wZXJ0eSAncnVuU2VydmVyVGV4dCcsIHJ1blNlcnZlclRleHQKKyAgICBvdXRwdXRzLmZpbGUgc2VydmVyRmlsZQorCisgICAgZG9MYXN0IHsKKyAgICAgICAgc2VydmVyRmlsZS5wYXJlbnRGaWxlLm1rZGlycygpCisgICAgICAgIHNlcnZlckZpbGUudGV4dCA9IHJ1blNlcnZlclRleHQKKyAgICAgICAgc2VydmVyRmlsZS5zZXRFeGVjdXRhYmxlKHRydWUsIGZhbHNlKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1MzczOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9nZW5lcmF0ZVRlc3RUaHJpZnQuZ3JhZGxlCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gR2VuZXJhdGVkIGNvZGUgbG9jYXRpb25zIGZvciBVbml0IHRlc3RzCitleHQuZ2VuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhIikKK2V4dC5nZW5CZWFuU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1qYXZhYmVhbiIpCitleHQuZ2VuUmV1c2VTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmFyZXVzZSIpCitleHQuZ2VuRnVsbENhbWVsU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi1mdWxsY2FtZWwiKQorZXh0LmdlblVuc2FmZVNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tdW5zYWZlIikKKworLy8gQWRkIHRoZSBnZW5lcmF0ZWQgY29kZSBkaXJlY3RvcmllcyB0byB0aGUgdGVzdCBzb3VyY2Ugc2V0Citzb3VyY2VTZXRzIHsKKyAgICB0ZXN0LmphdmEuc3JjRGlycyBnZW5TcmMsIGdlbkJlYW5TcmMsIGdlblJldXNlU3JjLCBnZW5GdWxsQ2FtZWxTcmMsIGdlblVuc2FmZVNyYworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGdlbmVyYXRpb24gZm9yIFVuaXQgVGVzdGluZworCisvLyBBIGNhbGxhYmxlIGNsb3N1cmUgdG8gbWFrZSB0aGlzIGVhc2llcgorZXh0LnRocmlmdENvbXBpbGUgPSB7IFRhc2sgdGFzaywgU3RyaW5nIHRocmlmdEZpbGVOYW1lLCBTdHJpbmcgZ2VuZXJhdG9yID0gJ2phdmEnLCBGaWxlIG91dHB1dERpciA9IGdlblNyYyAtPgorICAgIGRlZiB0aHJpZnRGaWxlID0gZmlsZSgiJHRocmlmdFJvb3QvdGVzdC8kdGhyaWZ0RmlsZU5hbWUiKQorICAgIGFzc2VydCB0aHJpZnRGaWxlLmV4aXN0cygpCisKKyAgICB0YXNrLmlucHV0cy5maWxlIHRocmlmdEZpbGUKKyAgICB0YXNrLm91dHB1dHMuZGlyIG91dHB1dERpcgorCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBvdXRwdXREaXIubWtkaXJzKCkKKyAgICAgICAgZGVmIHJlc3VsdCA9IGV4ZWMgeworICAgICAgICAgICAgZXhlY3V0YWJsZSBmaWxlKHRocmlmdENvbXBpbGVyKQorICAgICAgICAgICAgYXJncyAnLS1nZW4nLCBnZW5lcmF0b3IKKyAgICAgICAgICAgIGFyZ3MgJy1vdXQnLCBvdXRwdXREaXIKKyAgICAgICAgICAgIGFyZ3MgdGhyaWZ0RmlsZQorICAgICAgICAgICAgc3RhbmRhcmRPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgZXJyb3JPdXRwdXQgPSB0YXNrLm91dHB1dEJ1ZmZlcgorICAgICAgICAgICAgaWdub3JlRXhpdFZhbHVlID0gdHJ1ZQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN1bHQuZXhpdFZhbHVlICE9IDApIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc2hvdyB0aGUgVGhyaWZ0IGNvbXBpbGVyIG91dHB1dCBvbiBmYWlsdXJlcywgY3V0cyBkb3duIG9uIG5vaXNlIQorICAgICAgICAgICAgcHJpbnRsbiB0YXNrLm91dHB1dEJ1ZmZlci50b1N0cmluZygpCisgICAgICAgICAgICByZXN1bHQucmV0aHJvd0ZhaWx1cmUoKQorICAgICAgICB9CisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYWxsIHVuaXQgdGVzdCBUaHJpZnQgc291cmNlcycKKyAgICBjb21waWxlVGVzdEphdmEuZGVwZW5kc09uIGl0Cit9CisKK3Rhc2sgZ2VuZXJhdGVKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVGhyaWZ0VGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhVHlwZXMudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRGVidWdQcm90b1Rlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdPcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdNYW55T3B0aW9uYWxzLnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFEZWVwQ29weVRlc3QudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnRW51bUNvbnRhaW5lcnNUZXN0LnRocmlmdCcpCit9CisKK3Rhc2sgZ2VuZXJhdGVCZWFuSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWphdmFiZWFuIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdKYXZhQmVhbnNUZXN0LnRocmlmdCcsICdqYXZhOmJlYW5zLG5vY2FtZWwnLCBnZW5CZWFuU3JjKQorfQorCit0YXNrIGdlbmVyYXRlUmV1c2VKYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YXJldXNlIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdGdWxsQ2FtZWxUZXN0LnRocmlmdCcsICdqYXZhOmZ1bGxjYW1lbCcsIGdlbkZ1bGxDYW1lbFNyYykKK30KKwordGFzayBnZW5lcmF0ZUZ1bGxDYW1lbEphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1mdWxsY2FtZWwgc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ1JldXNlT2JqZWN0cy50aHJpZnQnLCAnamF2YTpyZXVzZS1vYmplY3RzJywgZ2VuUmV1c2VTcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVVbnNhZmVCaW5hcmllc0phdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi11bnNhZmViaW5hcmllcyBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnVW5zYWZlVHlwZXMudGhyaWZ0JywgJ2phdmE6dW5zYWZlX2JpbmFyaWVzJywgZ2VuVW5zYWZlU3JjKQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3B1Ymxpc2hpbmcuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDQwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnN0YWxsYXRpb24gc3VidGFza3MsIG5vdCB1c2VkIGN1cnJlbnRseSwgd2UgdXNlICJtYWtlIGluc3RhbGwvZmFzdCIKK3Rhc2sgaW5zdGFsbERpc3QodHlwZTogQ29weSwgZ3JvdXA6ICdJbnN0YWxsJykgeworICAgIGRlc2NyaXB0aW9uID0gIkNvcHkgVGhyaWZ0IEpBUiBhbmQgZGVwZW5kZW5jaWVzIGludG8gJGluc3RhbGxQYXRoIGxvY2F0aW9uIgorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKGluc3RhbGxQYXRoKQorCisgICAgZnJvbSBqYXIKKyAgICBmcm9tIGNvbmZpZ3VyYXRpb25zLmNvbXBpbGUKK30KKwordGFzayBpbnN0YWxsSmF2YWRvYyh0eXBlOiBDb3B5LCBncm91cDogJ0luc3RhbGwnLCBkZXBlbmRzT246IGphdmFkb2MpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIFRocmlmdCBKYXZhRG9jIGludG8gJGluc3RhbGxKYXZhZG9jUGF0aCBsb2NhdGlvbiIKKworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZShpbnN0YWxsSmF2YWRvY1BhdGgpCisKKyAgICBmcm9tIGphdmFkb2MuZGVzdGluYXRpb25EaXIKK30KKworLy8gVGhpcyBpcyBub3QgbmVlZGVkIGJ5IEdyYWRsZSBidWlsZHMgYnV0IHRoZSByZW1haW5pbmcgQW50IGJ1aWxkcyBzZWVtIHRvCisvLyBuZWVkIGFjY2VzcyB0byB0aGUgZ2VuZXJhdGVkIHRlc3QgY2xhc3NlcyBmb3IgVGhyaWZ0IHVuaXQgdGVzdHMgc28gd2UKKy8vIGFzc2lzdCB0aGVtIHRvIHVzZSBpdCB0aGlzIHdheS4KK3Rhc2sgY29weURlcGVuZGVuY2llcyh0eXBlOiBDb3B5LCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0NvcHkgcnVudGltZSBkZXBlbmRlbmNpZXMgaW4gYSBjb21tb24gbG9jYXRpb24gZm9yIG90aGVyIEFudCBiYXNlZCBwcm9qZWN0cycKKyAgICBwcm9qZWN0LmFzc2VtYmxlLmRlcGVuZHNPbiBpdAorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKCIkYnVpbGREaXIvZGVwcyIpCisgICAgZnJvbSBjb25maWd1cmF0aW9ucy50ZXN0UnVudGltZQorICAgIC8vIGV4Y2x1ZGUgc29tZSB2ZXJ5IHNwZWNpZmljIHVuaXQgdGVzdCBkZXBlbmRlbmNpZXMKKyAgICBleGNsdWRlICcqKi9qdW5pdCouamFyJywgJyoqL21vY2tpdG8qLmphcicsICcqKi9oYW1jcmVzdCouamFyJworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbGxvdyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYmUgc2hhcmVkIGJldHdlZW4gaW5zdGFsbCBhbmQgdXBsb2FkQXJjaGl2ZXMgdGFza3MKK2RlZiBjb25maWd1cmVQb20ocG9tKSB7CisgICAgcG9tLnByb2plY3QgeworICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0JworICAgICAgICBkZXNjcmlwdGlvbiAnVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nCisgICAgICAgIHBhY2thZ2luZyAnamFyJworICAgICAgICB1cmwgJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKKworICAgICAgICBzY20geworICAgICAgICAgICAgdXJsICdodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgICAgICBjb25uZWN0aW9uICdzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGRldmVsb3BlckNvbm5lY3Rpb24gJ3NjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICB9CisKKyAgICAgICAgbGljZW5zZXMgeworICAgICAgICAgICAgbGljZW5zZSB7CisgICAgICAgICAgICAgICAgbmFtZSAnVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcKKyAgICAgICAgICAgICAgICB1cmwgIiR7cHJvamVjdC5saWNlbnNlfSIKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gJ3JlcG8nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkZXZlbG9wZXJzIHsKKyAgICAgICAgICAgIGRldmVsb3BlciB7CisgICAgICAgICAgICAgICAgaWQgJ2RldicKKyAgICAgICAgICAgICAgICBuYW1lICdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnCisgICAgICAgICAgICAgICAgZW1haWwgJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBvbS53aGVuQ29uZmlndXJlZCB7CisgICAgICAgIC8vIEZpeHVwIHRoZSBzY29wZSBmb3Igc2VydmxldC1hcGkgdG8gYmUgJ3Byb3ZpZGVkJyBpbnN0ZWFkIG9mICdjb21waWxlJworICAgICAgICBkZXBlbmRlbmNpZXMuZmluZCB7IGRlcCAtPiBkZXAuZ3JvdXBJZCA9PSAnamF2YXguc2VydmxldCcgJiYgZGVwLmFydGlmYWN0SWQgPT0gJ3NlcnZsZXQtYXBpJyB9LndpdGggeworICAgICAgICAgICAgLy8gaXQub3B0aW9uYWwgPSB0cnVlCisgICAgICAgICAgICBpdC5zY29wZSA9ICdwcm92aWRlZCcKKyAgICAgICAgfQorICAgIH0KK30KKworaW5zdGFsbCB7CisgICAgcmVwb3NpdG9yaWVzLm1hdmVuSW5zdGFsbGVyIHsKKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKK3VwbG9hZEFyY2hpdmVzIHsKKyAgICBkZXBlbmRzT24gdGVzdCAvLyBtYWtlIHN1cmUgd2UgcnVuIHVuaXQgdGVzdHMgd2hlbiBwdWJsaXNoaW5nCisgICAgcmVwb3NpdG9yaWVzLm1hdmVuRGVwbG95ZXIgeworICAgICAgICAvLyBzaWduUG9tIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyB3aGVuIG5vIHNpZ25pbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICAgICAgYmVmb3JlRGVwbG95bWVudCB7IE1hdmVuRGVwbG95bWVudCBkZXBsb3ltZW50IC0+IHNpZ25pbmcuc2lnblBvbShkZXBsb3ltZW50KSB9CisgICAgICAgIHJlcG9zaXRvcnkodXJsOiBwcm9qZWN0Lm1hdmVuUmVwb3NpdG9yeVVybCkgeworICAgICAgICAgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuVXNlcicpICYmIHByb2plY3QuaGFzUHJvcGVydHkoJ21hdmVuUGFzc3dvcmQnKSkgeworICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uKHVzZXJOYW1lOiBtYXZlblVzZXIsIHBhc3N3b3JkOiBtYXZlblBhc3N3b3JkKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbmZpZ3VyZVBvbShwb20pCisgICAgfQorfQorCisvLyBTaWduaW5nIGNvbmZpZ3VyYXRpb24sIG9wdGlvbmFsLCBvbmx5IHdoZW4gcmVsZWFzZSBhbmQgdXBsb2FkQXJjaGl2ZXMgaXMgYWN0aXZhdGVkCitzaWduaW5nIHsKKyAgICByZXF1aXJlZCB7ICF2ZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpICYmIGdyYWRsZS50YXNrR3JhcGguaGFzVGFzaygidXBsb2FkQXJjaGl2ZXMiKSB9CisgICAgc2lnbiBjb25maWd1cmF0aW9ucy5hcmNoaXZlcworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3NvdXJjZUNvbmZpZ3VyYXRpb24uZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDAzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNvdXJjZSBzZXRzIGZvciBtYWluIGFuZCB0ZXN0IHNvdXJjZXMKK3NvdXJjZVNldHMgeworICAgIG1haW4geworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAnc3JjJworICAgICAgICB9CisgICAgfQorICAgIHRlc3QgeworICAgICAgICBqYXZhIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIC8vIHNlZSBmdW5jdGlvbmFsVGVzdHMuZ3JhZGxlIGZvciB0aGVzZSBmaWxlcworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Q2xpZW50LmphdmEnCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RTZXJ2ZXIuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEnCisgICAgICAgIH0KKyAgICAgICAgcmVzb3VyY2VzIHsKKyAgICAgICAgICAgIHNyY0RpciAndGVzdCcKKyAgICAgICAgICAgIGluY2x1ZGUgJ2xvZzRqLnByb3BlcnRpZXMnCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZGV0YWlscworCitzb3VyY2VDb21wYXRpYmlsaXR5ID0gJzEuOCcKK3RhcmdldENvbXBhdGliaWxpdHkgPSAnMS44JworCit0YXNrcy53aXRoVHlwZShKYXZhQ29tcGlsZSkgeworICAgIG9wdGlvbnMuZW5jb2RpbmcgPSAnVVRGLTgnCisgICAgb3B0aW9ucy5kZWJ1ZyA9IHRydWUKKyAgICBvcHRpb25zLmRlcHJlY2F0aW9uID0gdHJ1ZQorICAgIC8vIG9wdGlvbnMuY29tcGlsZXJBcmdzLmFkZEFsbCgnLVhsaW50OnVuY2hlY2tlZCcpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEphciBwYWNrYWdpbmcgZGV0YWlscworcHJvY2Vzc1Jlc291cmNlcyB7CisgICAgaW50bygnTUVUQS1JTkYnKSB7CisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L0xJQ0VOU0UiCisgICAgICAgIGZyb20gIiR0aHJpZnRSb290L05PVElDRSIKKyAgICAgICAgcmVuYW1lKCcoLispJywgJyQxLnR4dCcpCisgICAgfQorfQorCitqYXIgeworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKyAgICBtYW5pZmVzdCB7CisgICAgICAgIGF0dHJpYnV0ZXMoWworICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtTWFuaWZlc3RWZXJzaW9uIjogIjIiLAorICAgICAgICAgICAgIkJ1bmRsZS1TeW1ib2xpY05hbWUiOiAiJHtwcm9qZWN0Lmdyb3VwfSIsCisgICAgICAgICAgICAiQnVuZGxlLU5hbWUiOiAiQXBhY2hlIFRocmlmdCIsCisgICAgICAgICAgICAiQnVuZGxlLVZlcnNpb24iOiAiJHtwcm9qZWN0LnZlcnNpb259IiwKKyAgICAgICAgICAgICJCdW5kbGUtRGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBsaWJyYXJ5IiwKKyAgICAgICAgICAgICJCdW5kbGUtTGljZW5zZSI6ICIke3Byb2plY3QubGljZW5zZX0iLAorICAgICAgICAgICAgIkJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5IjogImxhenkiLAorICAgICAgICAgICAgIkV4cG9ydC1QYWNrYWdlIjogIiR7cHJvamVjdC5ncm91cH0uYXN5bmM7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LG9yZy5zbGY0aiwke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsJHtwcm9qZWN0Lmdyb3VwfSwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXI7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydDt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50LG9yZy5hcGFjaGUuaHR0cC5wYXJhbXMsb3JnLmFwYWNoZS5odHRwLmVudGl0eSxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5odHRwLG9yZy5zbGY0aixqYXZheC5uZXQuc3NsLGphdmF4Lm5ldCxqYXZheC5zZWN1cml0eS5zYXNsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2tcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH07dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH0uYXN5bmMsJHtwcm9qZWN0Lmdyb3VwfS5zZXJ2ZXIsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLG9yZy5hcGFjaGUubG9nNGosJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWVcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ubWV0YV9kYXRhO3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5zY2hlbWU7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnByb3RvY29sLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiIiwKKyAgICAgICAgICAgICJJbXBvcnQtUGFja2FnZSI6ICJqYXZheC5uZXQsamF2YXgubmV0LnNzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VydmxldDtyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5zZXJ2bGV0Lmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLnNsZjRqO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249XCJbMS40LDIpXCIsb3JnLmFwYWNoZS5odHRwLmNsaWVudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHk7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCIKKyAgICAgICAgXSkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjJmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvdW5pdFRlc3RzLmdyYWRsZQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gQnVuZGxlIHRoZSB0ZXN0IGNsYXNzZXMgaW4gYSBKQVIgZm9yIG90aGVyIEFudCBiYXNlZCBidWlsZHMKK3Rhc2sgdGVzdEphcih0eXBlOiBKYXIsIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQXNzZW1ibGVzIGEgamFyIGFyY2hpdmUgY29udGFpbmluZyB0aGUgdGVzdCBjbGFzc2VzLicKKyAgICBwcm9qZWN0LnRlc3QuZGVwZW5kc09uIGl0CisKKyAgICBjbGFzc2lmaWVyICd0ZXN0JworICAgIGZyb20gc291cmNlU2V0cy50ZXN0Lm91dHB1dAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVbml0IHRlc3QgdGFza3MgYW5kIGNvbmZpZ3VyYXRpb25zCisKKy8vIEhlbHAgdGhlIHVwIHRvIGRhdGUgYWxnb3JpdGhtIHRvIG1ha2UgdGhlc2UgdGVzdHMgZG9uZQorZXh0Lm1hcmtUYXNrRG9uZSA9IHsgdGFzayAtPgorICAgIGRlZiBidWlsZEZpbGUgPSBmaWxlKCIkYnVpbGREaXIvJHt0YXNrLm5hbWV9LmZsYWciKQorICAgIHRhc2suaW5wdXRzLmZpbGVzIHRhc2suY2xhc3NwYXRoCisgICAgdGFzay5vdXRwdXRzLmZpbGUgYnVpbGRGaWxlCisgICAgdGFzay5kb0xhc3QgeworICAgICAgICBidWlsZEZpbGUudGV4dCA9ICdQYXNzZWQhJworICAgIH0KK30KKwordGFzayBkZXByZWNhdGVkRXF1YWxpdHlUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuRXF1YWxpdHlUZXN0JworICAgIG1hcmtUYXNrRG9uZShpdCkKK30KKwordGFzayBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdCh0eXBlOiBKYXZhRXhlYywgZ3JvdXA6ICdWZXJpZmljYXRpb24nKSB7CisgICAgZGVzY3JpcHRpb24gPSAnUnVuIHRoZSBub24tSlVuaXQgdGVzdCBzdWl0ZSAnCisgICAgY2xhc3NwYXRoID0gc291cmNlU2V0cy50ZXN0LnJ1bnRpbWVDbGFzc3BhdGgKKyAgICBtYWluICdvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCisvLyBNYWluIFVuaXQgVGVzdCB0YXNrIGNvbmZpZ3VyYXRpb24KK3Rlc3QgeworICAgIGRlc2NyaXB0aW9uPSJSdW4gdGhlIGZ1bGwgdGVzdCBzdWl0ZSIKKyAgICBkZXBlbmRzT24gZGVwcmVjYXRlZEVxdWFsaXR5VGVzdCwgZGVwcmVjYXRlZEphdmFCZWFuc1Rlc3QKKworICAgIC8vIEFsbG93IHJlcGVhdGluZyB0ZXN0cyBldmVuIGFmdGVyIHN1Y2Nlc3NmdWwgZXhlY3V0aW9uCisgICAgaWYgKHByb2plY3QuaGFzUHJvcGVydHkoJ3JlcnVuVGVzdHMnKSkgeworICAgICAgICBvdXRwdXRzLnVwVG9EYXRlV2hlbiB7IGZhbHNlIH0KKyAgICB9CisKKyAgICBpbmNsdWRlICcqKi9UZXN0Ki5jbGFzcycKKyAgICBleGNsdWRlICcqKi9UZXN0KlwkKi5jbGFzcycKKworICAgIG1heEhlYXBTaXplID0gJzUxMm0nCisgICAgZm9ya0V2ZXJ5ID0gMQorCisgICAgc3lzdGVtUHJvcGVydGllcyA9IFsKKyAgICAgICAgJ2J1aWxkLnRlc3QnOiAiJHtjb21waWxlVGVzdEphdmEuZGVzdGluYXRpb25EaXJ9IiwKKyAgICAgICAgJ3Rlc3QucG9ydCc6ICIke3Rlc3RQb3J0fSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly50cnVzdHN0b3JlIiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlJzogIiR7cHJvamVjdERpcn0vdGVzdC8ua2V5c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkJzogJ3RocmlmdCcKKyAgICBdCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDBiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzJiYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuNC4xLWJpbi56aXAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcgYi9saWIvamF2YS9ncmFkbGV3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjY2RkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZXcuYmF0IGIvbGliL2phdmEvZ3JhZGxldy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1NTMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitAcmVtCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MKK0ByZW0KK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBzZXRsb2NhbAorCitzZXQgRElSTkFNRT0lfmRwMAoraWYgIiVESVJOQU1FJSIgPT0gIiIgc2V0IERJUk5BTUU9Lgorc2V0IEFQUF9CQVNFX05BTUU9JX5uMAorc2V0IEFQUF9IT01FPSVESVJOQU1FJQorCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lgorc2V0IERFRkFVTFRfSlZNX09QVFM9CisKK0ByZW0gRmluZCBqYXZhLmV4ZQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQorCitzZXQgSkFWQV9FWEU9amF2YS5leGUKKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxCitpZiAiJUVSUk9STEVWRUwlIiA9PSAiMCIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6ZmluZEphdmFGcm9tSmF2YUhvbWUKK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUKK3NldCBKQVZBX0VYRT0lSkFWQV9IT01FJS9iaW4vamF2YS5leGUKKworaWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdAorCitlY2hvLgorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUKK2VjaG8uCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLgorCitnb3RvIGZhaWwKKworOmluaXQKK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMKKworaWYgbm90ICIlT1MlIiA9PSAiV2luZG93c19OVCIgZ290byB3aW45eE1FX2FyZ3MKKworOndpbjl4TUVfYXJncworQHJlbSBTbHVycCB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KK3NldCBDTURfTElORV9BUkdTPQorc2V0IF9TS0lQPTIKKworOndpbjl4TUVfYXJnc19zbHVycAoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUKKworc2V0IENNRF9MSU5FX0FSR1M9JSoKKworOmV4ZWN1dGUKK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQorCitzZXQgQ0xBU1NQQVRIPSVBUFBfSE9NRSVcZ3JhZGxlXHdyYXBwZXJcZ3JhZGxlLXdyYXBwZXIuamFyCisKK0ByZW0gRXhlY3V0ZSBHcmFkbGUKKyIlSkFWQV9FWEUlIiAlREVGQVVMVF9KVk1fT1BUUyUgJUpBVkFfT1BUUyUgJUdSQURMRV9PUFRTJSAiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JUFQUF9CQVNFX05BTUUlIiAtY2xhc3NwYXRoICIlQ0xBU1NQQVRIJSIgb3JnLmdyYWRsZS53cmFwcGVyLkdyYWRsZVdyYXBwZXJNYWluICVDTURfTElORV9BUkdTJQorCis6ZW5kCitAcmVtIEVuZCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kCisKKzpmYWlsCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YKK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQoraWYgIG5vdCAiIiA9PSAiJUdSQURMRV9FWElUX0NPTlNPTEUlIiBleGl0IDEKK2V4aXQgL2IgMQorCis6bWFpbkVuZAoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwKKworOm9tZWdhCmRpZmYgLS1naXQgYS9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUgYi9saWIvamF2YS9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZDhiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnbGlidGhyaWZ0JwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNjOGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L0FzeW5jUHJvY2Vzc0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgVCBleHRlbmRzIFRCYXNlLCBSPiB7CisgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWU7CisKKyAgICBwdWJsaWMgQXN5bmNQcm9jZXNzRnVuY3Rpb24oU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc09uZXdheSgpOworCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc3RhcnQoSSBpZmFjZSwgVCBhcmdzLCBBc3luY01ldGhvZENhbGxiYWNrPFI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uOworCisgICAgcHVibGljIGFic3RyYWN0IFQgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKTsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBBc3luY01ldGhvZENhbGxiYWNrPFI+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBpbnQgc2VxaWQpOworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kUmVzcG9uc2UoZmluYWwgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBUU2VyaWFsaXphYmxlIHJlc3VsdCwgZmluYWwgYnl0ZSB0eXBlLCBmaW5hbCBpbnQgc2VxaWQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgVFByb3RvY29sIG9wcm90ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKKworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCB0eXBlLCBzZXFpZCkpOworICAgICAgICByZXN1bHQud3JpdGUob3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKworICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2QzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvT3B0aW9uLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgT3B0aW9uIHR5cGUgcGF0dGVybgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3B0aW9uPFQ+IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3B0aW9uIE5PTkUgPSBuZXcgTm9uZSgpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgT3B0aW9uIGlzIGRlZmluZWQgb3Igbm90CisgICAgICogQHJldHVybgorICAgICAqICAgICAgICAgdHJ1ZSBpZiB0aGUgT3B0aW9uIGlzIGRlZmluZWQgKG9mIHR5cGUgU29tZSkKKyAgICAgKiAgICAgICAgIGZhbHNlIGlmIHRoZSBPcHRpb24gaXMgbm90IGRlZmluZWQgKG9mIHR5cGUgTm9uZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0RlZmluZWQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIE9wdGlvbiAoaWYgaXQgaXMgZGVmaW5lZCkKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGNhbGxlZCBvbiBhIE5vbmUKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgVCBnZXQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGFpbmVkIHZhbHVlIChpZiBkZWZpbmVkKSBvciBlbHNlIHJldHVybiBhIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBAcGFyYW0gb3RoZXIgd2hhdCB0byByZXR1cm4gaWYgdGhlIHZhbHVlIGlzIG5vdCBkZWZpbmVkIChhIE5vbmUpCisgICAgICogQHJldHVybiBlaXRoZXIgdGhlIHZhbHVlLCBvciBvdGhlciBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmluZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgVCBvcihUIG90aGVyKSB7CisgICAgICAgIGlmIChpc0RlZmluZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG90aGVyOworICAgICAgICB9CisgICAgfQorICAgIC8qKgorICAgICAqIFRoZSBOb25lIHR5cGUsIHJlcHJlc2VudGluZyBhbiBhYnNlbnQgdmFsdWUgKGluc3RlYWQgb2YgIm51bGwiKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uZTxUPiBleHRlbmRzIE9wdGlvbjxUPiB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmaW5lZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUIGdldCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBjYWxsIGdldCgpIG9uIE5vbmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIk5vbmUiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIFNvbWUgdHlwZSwgcmVwcmVzZW50aW5nIGFuIGV4aXN0ZW5jZSBvZiBzb21lIHZhbHVlCisgICAgICogQHBhcmFtIDxUPiBUaGUgdHlwZSBvZiB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU29tZTxUPiBleHRlbmRzIE9wdGlvbjxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKyAgICAgICAgcHVibGljIFNvbWUoVCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZpbmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJTb21lKCIgKyB2YWx1ZSArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBzIHZhbHVlIGluIGFuIE9wdGlvbiB0eXBlLCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdmFsdWUgaXMgbnVsbAorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqIEBwYXJhbSA8VD4gdHlwZSBvZiB2YWx1ZQorICAgICAqIEByZXR1cm4gU29tZSh2YWx1ZSkgaWYgdmFsdWUgaXMgbm90IG51bGwsIE5vbmUgaWYgdmFsdWUgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE9wdGlvbjxUPiBmcm9tTnVsbGFibGUoVCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNvbWUodmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5vbmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgdmFsdWUgaW4gYSBTb21lIHR5cGUgKE5CISB2YWx1ZSBtdXN0IG5vdCBiZSBudWxsISkKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdmFsdWUKKyAgICAgKiBAcmV0dXJuIGEgbmV3IFNvbWUodmFsdWUpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU29tZTxUPiBzb21lKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTb21lPFQ+KHZhbHVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBOb25lPFQ+IG5vbmUoKSB7CisgICAgICAgIHJldHVybiAoTm9uZTxUPikgTk9ORTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCmluZGV4IDJiYTM1MjcuLmU2MjEzZGYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKQEAgLTEsMTIgKzEsMTAgQEAKLS8qKgotICogCi0gKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC0zMywyNyArMzEsNDkgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKTsKLSAgICBUQmFzZSByZXN1bHQgPSBudWxsOworICAgIFRTZXJpYWxpemFibGUgcmVzdWx0ID0gbnVsbDsKKyAgICBieXRlIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFk7CiAKICAgICB0cnkgewogICAgICAgcmVzdWx0ID0gZ2V0UmVzdWx0KGlmYWNlLCBhcmdzKTsKLSAgICB9IGNhdGNoKFRocm93YWJsZSB0aCkgewotICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIHRoKTsKLSAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIAorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiVHJhbnNwb3J0IGVycm9yIHdoaWxlIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSwgZXgpOworICAgICAgdGhyb3cgZXg7CisgICAgfSBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICBMT0dHRVIuZXJyb3IoIkludGVybmFsIGFwcGxpY2F0aW9uIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSwgZXgpOworICAgICAgcmVzdWx0ID0gZXg7CisgICAgICBtc2dUeXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICBpZihyZXRocm93VW5oYW5kbGVkRXhjZXB0aW9ucygpKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsKKyAgICAgIGlmKCFpc09uZXdheSgpKSB7CisgICAgICAgIHJlc3VsdCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAorICAgICAgICAgICAgIkludGVybmFsIGVycm9yIHByb2Nlc3NpbmcgIiArIGdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgICAgfQorICAgIH0KKworICAgIGlmKCFpc09uZXdheSgpKSB7CisgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBtc2dUeXBlLCBzZXFpZCkpOworICAgICAgcmVzdWx0LndyaXRlKG9wcm90KTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKGludCBzZXFpZCwgVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09uZXdheSgpKSB7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLAogICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIHNlcWlkKSk7CiAgICAgICB4LndyaXRlKG9wcm90KTsKICAgICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpOwogICAgICAgb3Byb3QuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKLSAgICAgIHJldHVybjsKICAgICB9CisgIH0KIAotICAgIGlmKCFpc09uZXdheSgpKSB7Ci0gICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSk7Ci0gICAgICByZXN1bHQud3JpdGUob3Byb3QpOwotICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOwotICAgIH0KKyAgcHJvdGVjdGVkIGJvb2xlYW4gcmV0aHJvd1VuaGFuZGxlZEV4Y2VwdGlvbnMoKXsKKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc09uZXdheSgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Nob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9TaG9ydFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NTdkMWMuLjAwMDAwMDAKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Nob3J0U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7Ci0KLS8qKgotICogU2hvcnRTdGFjayBpcyBhIHNob3J0LXNwZWNpZmljIFN0YWNrIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gZm9yIHRoZSBleHByZXNzCi0gKiBwdXJwb3NlIG9mIHZlcnkgZmFzdCBvcGVyYXRpb25zIG9uIFRDb21wYWN0UHJvdG9jb2wncyBmaWVsZCBpZCBzdGFjay4gVGhpcwotICogaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgYXQgbGVhc3QgMTB4IGZhc3RlciB0aGFuIGphdmEudXRpbC5TdGFjay4KLSAqLwotcHVibGljIGNsYXNzIFNob3J0U3RhY2sgewotCi0gIHByaXZhdGUgc2hvcnRbXSB2ZWN0b3I7Ci0gIHByaXZhdGUgaW50IHRvcCA9IC0xOwotCi0gIHB1YmxpYyBTaG9ydFN0YWNrKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLSAgICB2ZWN0b3IgPSBuZXcgc2hvcnRbaW5pdGlhbENhcGFjaXR5XTsKLSAgfQotCi0gIHB1YmxpYyBzaG9ydCBwb3AoKSB7Ci0gICAgcmV0dXJuIHZlY3Rvclt0b3AtLV07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwdXNoKHNob3J0IHB1c2hlZCkgewotICAgIGlmICh2ZWN0b3IubGVuZ3RoID09IHRvcCArIDEpIHsKLSAgICAgIGdyb3coKTsKLSAgICB9Ci0gICAgdmVjdG9yWysrdG9wXSA9IHB1c2hlZDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBncm93KCkgewotICAgIHNob3J0W10gbmV3VmVjdG9yID0gbmV3IHNob3J0W3ZlY3Rvci5sZW5ndGggKiAyXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHZlY3RvciwgMCwgbmV3VmVjdG9yLCAwLCB2ZWN0b3IubGVuZ3RoKTsKLSAgICB2ZWN0b3IgPSBuZXdWZWN0b3I7Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgcGVlaygpIHsKLSAgICByZXR1cm4gdmVjdG9yW3RvcF07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICB0b3AgPSAtMTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHNiLmFwcGVuZCgiPFNob3J0U3RhY2sgdmVjdG9yOlsiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICBzYi5hcHBlbmQoIiAiKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGkgPT0gdG9wKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiPj4iKTsKLSAgICAgIH0KLQotICAgICAgc2IuYXBwZW5kKHZlY3RvcltpXSk7Ci0KLSAgICAgIGlmIChpID09IHRvcCkgewotICAgICAgICBzYi5hcHBlbmQoIjw8Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIHNiLmFwcGVuZCgiXT4iKTsKLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IGMyOTRmYzMuLjRkNjkzZDkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKICAqIEFwcGxpY2F0aW9uIGxldmVsIGV4Y2VwdGlvbgogICoKICAqLwotcHVibGljIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworcHVibGljIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBUU2VyaWFsaXphYmxlIHsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IFRBUFBMSUNBVElPTl9FWENFUFRJT05fU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBURmllbGQgTUVTU0FHRV9GSUVMRCA9IG5ldyBURmllbGQoIm1lc3NhZ2UiLCBUVHlwZS5TVFJJTkcsIChzaG9ydCkxKTsKQEAgLTQ1LDggKzQ1LDEyIEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfUkVTVUxUID0gNTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfRVJST1IgPSA2OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUk9UT0NPTF9FUlJPUiA9IDc7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBTlNGT1JNID0gODsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0gMTA7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CisgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VfID0gbnVsbDsKIAogICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgewogICAgIHN1cGVyKCk7CkBAIC03MCw3ICs3NCwxOCBAQAogICAgIHJldHVybiB0eXBlXzsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgaWYgKG1lc3NhZ2VfID09IG51bGwpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgcmV0dXJuIG1lc3NhZ2VfOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CiAgICAgVEZpZWxkIGZpZWxkOwogICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOwogCkBAIC04MywzMiArOTgsNDMgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBzd2l0Y2ggKGZpZWxkLmlkKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7CisgICAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKLSAgICAgICAgICB0eXBlID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOwotICAgICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKTsKKyAgICB0eXBlXyA9IHR5cGU7CisgICAgbWVzc2FnZV8gPSBtZXNzYWdlOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZCBmb3IgY29uc3RydWN0aW5nIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGdpdmVuIGEgVFByb3RvY29sIGlucHV0CisgICAqLworICBwdWJsaWMgc3RhdGljIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiByZWFkRnJvbShUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uCisgIHsKKyAgICBUQXBwbGljYXRpb25FeGNlcHRpb24gcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgIHJlc3VsdC5yZWFkKGlwcm90KTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbgorICB7CiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihUQVBQTElDQVRJT05fRVhDRVBUSU9OX1NUUlVDVCk7CiAgICAgaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsKSB7CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTUVTU0FHRV9GSUVMRCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzZTc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuQXN5bmNGcmFtZUJ1ZmZlcjsKKworcHVibGljIGludGVyZmFjZSBUQXN5bmNQcm9jZXNzb3IgeworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9ucyBtdXN0IGNhbGwgZmIucmVzcG9uc2VSZWFkeSgpIG9uY2UgcHJvY2Vzc2luZyBpcyBjb21wbGV0ZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYikgdGhyb3dzIFRFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2UuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCmluZGV4IGIzZWQxYmMuLmUxNDg5ZDUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZS5qYXZhCkBAIC0yNywyMSArMjcsNyBAQAogICogR2VuZXJpYyBiYXNlIGludGVyZmFjZSBmb3IgZ2VuZXJhdGVkIFRocmlmdCBvYmplY3RzLgogICoKICAqLwotcHVibGljIGludGVyZmFjZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8Pyw/PiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgU2VyaWFsaXphYmxlIHsKLQotICAvKioKLSAgICogUmVhZHMgdGhlIFRPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wuCi0gICAqCi0gICAqIEBwYXJhbSBpcHJvdCBJbnB1dCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVhZChUUHJvdG9jb2wgaXByb3QpIHRocm93cyBURXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG9iamVjdHMgb3V0IHRvIHRoZSBwcm90b2NvbAotICAgKgotICAgKiBAcGFyYW0gb3Byb3QgT3V0cHV0IHByb3RvY29sCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uOworcHVibGljIGludGVyZmFjZSBUQmFzZTxUIGV4dGVuZHMgVEJhc2U8VCxGPiwgRiBleHRlbmRzIFRGaWVsZElkRW51bT4gZXh0ZW5kcyBDb21wYXJhYmxlPFQ+LCAgVFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlIHsKIAogICAvKioKICAgICogR2V0IHRoZSBGIGluc3RhbmNlIHRoYXQgY29ycmVzcG9uZHMgdG8gZmllbGRJZC4KQEAgLTU2LDcgKzQyLDcgQEAKICAgcHVibGljIGJvb2xlYW4gaXNTZXQoRiBmaWVsZCk7CiAKICAgLyoqCi0gICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4gCisgICAqIEdldCBhIGZpZWxkJ3MgdmFsdWUgYnkgZmllbGQgdmFyaWFibGUuIFByaW1pdGl2ZSB0eXBlcyB3aWxsIGJlIHdyYXBwZWQgaW4KICAgICogdGhlIGFwcHJvcHJpYXRlICJib3hlZCIgdHlwZXMuCiAgICAqCiAgICAqIEBwYXJhbSBmaWVsZApAQCAtNzEsNyArNTcsNyBAQAogICAgKi8KICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShGIGZpZWxkLCBPYmplY3QgdmFsdWUpOwogCi0gIHB1YmxpYyBUQmFzZTxULCBGPiBkZWVwQ29weSgpOworICBwdWJsaWMgVCBkZWVwQ29weSgpOwogCiAgIC8qKgogICAgKiBSZXR1cm4gdG8gdGhlIHN0YXRlIG9mIGhhdmluZyBqdXN0IGJlZW4gaW5pdGlhbGl6ZWQsIGFzIHRob3VnaCB5b3UgaGFkIGp1c3QKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYjE4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUQmFzZUFzeW5jUHJvY2Vzc29yPEk+IGltcGxlbWVudHMgVEFzeW5jUHJvY2Vzc29yLCBUUHJvY2Vzc29yIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgIGZpbmFsIEkgaWZhY2U7CisgICAgZmluYWwgTWFwPFN0cmluZyxBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2UsPz4+IHByb2Nlc3NNYXA7CisKKyAgICBwdWJsaWMgVEJhc2VBc3luY1Byb2Nlc3NvcihJIGlmYWNlLCBNYXA8U3RyaW5nLCBBc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCA/IGV4dGVuZHMgVEJhc2UsPz4+IHByb2Nlc3NNYXApIHsKKyAgICAgICAgdGhpcy5pZmFjZSA9IGlmYWNlOworICAgICAgICB0aGlzLnByb2Nlc3NNYXAgPSBwcm9jZXNzTWFwOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLEFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksID8gZXh0ZW5kcyBUQmFzZSw/Pj4gZ2V0UHJvY2Vzc01hcFZpZXcoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvY2Vzc01hcCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgVFByb3RvY29sIGluID0gZmIuZ2V0SW5wdXRQcm90b2NvbCgpOworICAgICAgICBmaW5hbCBUUHJvdG9jb2wgb3V0ID0gZmIuZ2V0T3V0cHV0UHJvdG9jb2woKTsKKworICAgICAgICAvL0ZpbmQgcHJvY2Vzc2luZyBmdW5jdGlvbgorICAgICAgICBmaW5hbCBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICAgIEFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZuID0gcHJvY2Vzc01hcC5nZXQobXNnLm5hbWUpOworICAgICAgICBpZiAoZm4gPT0gbnVsbCkgeworICAgICAgICAgICAgVFByb3RvY29sVXRpbC5za2lwKGluLCBUVHlwZS5TVFJVQ1QpOworICAgICAgICAgICAgaW4ucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5VTktOT1dOX01FVEhPRCwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBtZXRob2QgbmFtZTogJyIgKyBtc2cubmFtZSArICInIik7CisgICAgICAgICAgICBMT0dHRVIuZGVidWcoIkludmFsaWQgbWV0aG9kIG5hbWUiLCB4KTsKKworICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpdCBpcyBhIHR3by13YXkgcmVxdWVzdCwgc28gd2UgY2FuIHNlbmQgYSByZXBseQorICAgICAgICAgICAgaWYgKG1zZy50eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMKSB7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobXNnLm5hbWUsIFRNZXNzYWdlVHlwZS5FWENFUFRJT04sIG1zZy5zZXFpZCkpOworICAgICAgICAgICAgICB4LndyaXRlKG91dCk7CisgICAgICAgICAgICAgIG91dC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgICAgICAgICAgb3V0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vR2V0IEFyZ3MKKyAgICAgICAgVEJhc2UgYXJncyA9IGZuLmdldEVtcHR5QXJnc0luc3RhbmNlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFyZ3MucmVhZChpbik7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiQ291bGQgbm90IHJldHJpZXZlIGZ1bmN0aW9uIGFyZ3VtZW50cyIsIHgpOworCisgICAgICAgICAgICBpZiAoIWZuLmlzT25ld2F5KCkpIHsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CisgICAgICAgICAgICAgIHgud3JpdGUob3V0KTsKKyAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgICAgICAgICBvdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZiLnJlc3BvbnNlUmVhZHkoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGluLnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgICAgaWYgKGZuLmlzT25ld2F5KCkpIHsKKyAgICAgICAgICBmYi5yZXNwb25zZVJlYWR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvL3N0YXJ0IG9mZiBwcm9jZXNzaW5nIGZ1bmN0aW9uCisgICAgICAgIEFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlciA9IGZuLmdldFJlc3VsdEhhbmRsZXIoZmIsIG1zZy5zZXFpZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgZm4uc3RhcnQoaWZhY2UsIGFyZ3MsIHJlc3VsdEhhbmRsZXIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5kZWJ1ZygiRXhjZXB0aW9uIGhhbmRsaW5nIGZ1bmN0aW9uIiwgZSk7CisgICAgICAgICAgcmVzdWx0SGFuZGxlci5vbkVycm9yKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VIZWxwZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCmluZGV4IGVlYzY0OGIuLjZmNmM2ZWIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTI0LDkgKzI1LDExIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgVEJhc2VIZWxwZXIgewogCkBAIC01MSw1NyArNTQsMjcgQEAKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhib29sZWFuIGEsIGJvb2xlYW4gYikgewotICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoYSkuY29tcGFyZVRvKGIpOworICAgIHJldHVybiBCb29sZWFuLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZSBhLCBieXRlIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBCeXRlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oc2hvcnQgYSwgc2hvcnQgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIFNob3J0LmNvbXBhcmUoYSxiKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhpbnQgYSwgaW50IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8obG9uZyBhLCBsb25nIGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBMb25nLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oZG91YmxlIGEsIGRvdWJsZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUoYSwgYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU3RyaW5nIGEsIFN0cmluZyBiKSB7CkBAIC0xMDksMTcgKzgyLDE2IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0gICAgaW50IHNpemVDb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7Ci0gICAgaWYgKHNpemVDb21wYXJlICE9IDApIHsKLSAgICAgIHJldHVybiBzaXplQ29tcGFyZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpbnQgYnl0ZUNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7Ci0gICAgICBpZiAoYnl0ZUNvbXBhcmUgIT0gMCkgewotICAgICAgICByZXR1cm4gYnl0ZUNvbXBhcmU7CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmVUbyhhW2ldLCBiW2ldKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKENvbXBhcmFibGUgYSwgQ29tcGFyYWJsZSBiKSB7CkBAIC0xMjcsNDEgKzk5LDM5IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTGlzdCBhLCBMaXN0IGIpIHsKLSAgICBpbnQgbGFzdENvbXBhcmlzb24gPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKLSAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGxhc3RDb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlKGEuZ2V0KGkpLCBiLmdldChpKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgaW50IGNvbXBhcmUgPSBjb21wYXJlVG8oYS5zaXplKCksIGIuc2l6ZSgpKTsKKyAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29tcGFyZSA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oU2V0IGEsIFNldCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgU29ydGVkU2V0IHNvcnRlZEEgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRBLmFkZEFsbChhKTsKLSAgICBTb3J0ZWRTZXQgc29ydGVkQiA9IG5ldyBUcmVlU2V0KGNvbXBhcmF0b3IpOwotICAgIHNvcnRlZEIuYWRkQWxsKGIpOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgQXJyYXlMaXN0IHNvcnRlZEEgPSBuZXcgQXJyYXlMaXN0KGEpOworICAgICAgQXJyYXlMaXN0IHNvcnRlZEIgPSBuZXcgQXJyYXlMaXN0KGIpOwogCi0gICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7Ci0gICAgSXRlcmF0b3IgaXRlckIgPSBzb3J0ZWRCLml0ZXJhdG9yKCk7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZEEsIGNvbXBhcmF0b3IpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRCLCBjb21wYXJhdG9yKTsKIAotICAgIC8vIENvbXBhcmUgZWFjaCBpdGVtLgotICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShpdGVyQS5uZXh0KCksIGl0ZXJCLm5leHQoKSk7Ci0gICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgewotICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICBJdGVyYXRvciBpdGVyQSA9IHNvcnRlZEEuaXRlcmF0b3IoKTsKKyAgICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworCisgICAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KKyAgICAgIHdoaWxlIChpdGVyQS5oYXNOZXh0KCkgJiYgaXRlckIuaGFzTmV4dCgpKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOworICAgICAgICBpZiAoY29tcGFyZSAhPSAwKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhNYXAgYSwgTWFwIGIpIHsKQEAgLTE5OCw3ICsxNjgsNyBAQAogICAvKioKICAgICogQ29tcGFyYXRvciB0byBjb21wYXJlIGl0ZW1zIGluc2lkZSBhIHN0cnVjdHVyZSAoZS5nLiBhIGxpc3QsIHNldCwgb3IgbWFwKS4KICAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZFN0cnVjdHVyZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmVzdGVkU3RydWN0dXJlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IsIFNlcmlhbGl6YWJsZSB7CiAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvQSwgT2JqZWN0IG9CKSB7CiAgICAgICBpZiAob0EgPT0gbnVsbCAmJiBvQiA9PSBudWxsKSB7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMjIwLDYgKzE5MCwyNSBAQAogICAgIH0KICAgfQogCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB0b1N0cmluZyhDb2xsZWN0aW9uPEJ5dGVCdWZmZXI+IGJicywgU3RyaW5nQnVpbGRlciBzYikgeworICAgIEl0ZXJhdG9yPEJ5dGVCdWZmZXI+IGl0ID0gYmJzLml0ZXJhdG9yKCk7CisgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHsKKyAgICAgIHNiLmFwcGVuZCgiW10iKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKCJbIik7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBCeXRlQnVmZmVyIGJiID0gaXQubmV4dCgpOworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyhiYiwgc2IpOworICAgICAgICBpZiAoIWl0Lmhhc05leHQoKSkgeworICAgICAgICAgIHNiLmFwcGVuZCgiXSIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKwogICBwdWJsaWMgc3RhdGljIHZvaWQgdG9TdHJpbmcoQnl0ZUJ1ZmZlciBiYiwgU3RyaW5nQnVpbGRlciBzYikgewogICAgIGJ5dGVbXSBidWYgPSBiYi5hcnJheSgpOwogCkBAIC0yOTUsMTIgKzI4NCwxNCBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBieXRlW10gY29weUJpbmFyeShmaW5hbCBieXRlW10gb3JpZykgewotICAgIGlmIChvcmlnID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KKyAgICByZXR1cm4gKG9yaWcgPT0gbnVsbCkgPyBudWxsIDogQXJyYXlzLmNvcHlPZihvcmlnLCBvcmlnLmxlbmd0aCk7CisgIH0KIAotICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbb3JpZy5sZW5ndGhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgY29weSwgMCwgb3JpZy5sZW5ndGgpOwotICAgIHJldHVybiBjb3B5OworICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShsb25nIHZhbHVlKSB7CisgICAgcmV0dXJuIExvbmcuaGFzaENvZGUodmFsdWUpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoZG91YmxlIHZhbHVlKSB7CisgICAgcmV0dXJuIERvdWJsZS5oYXNoQ29kZSh2YWx1ZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDllZDgzYzAuLjNhMmQ1NmMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBDbGFzcyB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgYnVmIHdpdGhvdXQgZG9pbmcgZGVlcApAQCAtMjcsMTkgKzI4LDM0IEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbFNpemU7CisKICAgcHVibGljIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW50IHNpemUpIHsKICAgICBzdXBlcihzaXplKTsKKyAgICB0aGlzLmluaXRpYWxTaXplID0gc2l6ZTsKICAgfQogCiAgIHB1YmxpYyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgewotICAgIHN1cGVyKCk7CisgICAgdGhpcygzMik7CiAgIH0KIAogICBwdWJsaWMgYnl0ZVtdIGdldCgpIHsKICAgICByZXR1cm4gYnVmOwogICB9CiAKKyAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgc3VwZXIucmVzZXQoKTsKKyAgICBpZiAoYnVmLmxlbmd0aCA+IGluaXRpYWxTaXplKSB7CisgICAgICBidWYgPSBuZXcgYnl0ZVtpbml0aWFsU2l6ZV07CisgICAgfQorICB9CisKICAgcHVibGljIGludCBsZW4oKSB7CiAgICAgcmV0dXJuIGNvdW50OwogICB9CisKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGNvdW50LCBjaGFyc2V0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKaW5kZXggODAzZDljNi4uZDFkMzk2NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCkBAIC02NCw4ICs2NCwyMCBAQAogICAgKiBAcGFyYW0gYnl0ZXMgVGhlIGFycmF5IHRvIHJlYWQgZnJvbQogICAgKi8KICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemUoVEJhc2UgYmFzZSwgYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBkZXNlcmlhbGl6ZShiYXNlLCBieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKKyAgfQorCisgIC8qKgorICAgKiBEZXNlcmlhbGl6ZSB0aGUgVGhyaWZ0IG9iamVjdCBmcm9tIGEgYnl0ZSBhcnJheS4KKyAgICoKKyAgICogQHBhcmFtIGJhc2UgVGhlIG9iamVjdCB0byByZWFkIGludG8KKyAgICogQHBhcmFtIGJ5dGVzIFRoZSBhcnJheSB0byByZWFkIGZyb20KKyAgICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGludG8ge0Bjb2RlIGJ5dGVzfQorICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggdG8gcmVhZCBmcm9tIHtAY29kZSBieXRlc30KKyAgICovCisgIHB1YmxpYyB2b2lkIGRlc2VyaWFsaXplKFRCYXNlIGJhc2UsIGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICB0cmFuc18ucmVzZXQoYnl0ZXMpOworICAgICAgdHJhbnNfLnJlc2V0KGJ5dGVzLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICBiYXNlLnJlYWQocHJvdG9jb2xfKTsKICAgICB9IGZpbmFsbHkgewogICAgICAgdHJhbnNfLmNsZWFyKCk7CkBAIC0yMzksNDggKzI1MSwzMSBAQAogICAgIHRyeSB7CiAgICAgICBURmllbGQgZmllbGQgPSBsb2NhdGVGaWVsZChieXRlcywgZmllbGRJZFBhdGhGaXJzdCwgZmllbGRJZFBhdGhSZXN0KTsKICAgICAgIGlmIChmaWVsZCAhPSBudWxsKSB7Ci0gICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZmllbGQuCi0gICAgICAgIHN3aXRjaCh0dHlwZSl7CisgICAgICAgIGlmICh0dHlwZSA9PSBmaWVsZC50eXBlKSB7CisgICAgICAgICAgLy8gaWYgdGhpcyBwb2ludCBpcyByZWFjaGVkLCBpcHJvdCB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mCisgICAgICAgICAgLy8gdGhlIGZpZWxkCisgICAgICAgICAgc3dpdGNoICh0dHlwZSkgewogICAgICAgICAgIGNhc2UgVFR5cGUuQk9PTDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkJPT0wpewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJvb2woKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkJZVEU6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CWVRFKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQnl0ZSgpOwogICAgICAgICAgIGNhc2UgVFR5cGUuRE9VQkxFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuRE9VQkxFKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkkxNjoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkkxNikgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMTYoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMzI6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMzIpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTY0OgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTY0KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEk2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLlNUUklORzoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTAwOiAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJpbmFyeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGhhY2sgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHN0cmluZyBhbmQgYmluYXJ5CisgICAgICAgIGlmICh0dHlwZSA9PSAxMDAgJiYgZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgcmV0dXJuIG51bGw7CkBAIC0yOTUsMTEgKzI5MCw5IEBACiAgIHByaXZhdGUgVEZpZWxkIGxvY2F0ZUZpZWxkKGJ5dGVbXSBieXRlcywgVEZpZWxkSWRFbnVtIGZpZWxkSWRQYXRoRmlyc3QsIFRGaWVsZElkRW51bSAuLi4gZmllbGRJZFBhdGhSZXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgdHJhbnNfLnJlc2V0KGJ5dGVzKTsKIAotICAgIFRGaWVsZElkRW51bVtdIGZpZWxkSWRQYXRoPSBuZXcgVEZpZWxkSWRFbnVtW2ZpZWxkSWRQYXRoUmVzdC5sZW5ndGggKyAxXTsKKyAgICBURmllbGRJZEVudW1bXSBmaWVsZElkUGF0aCA9IG5ldyBURmllbGRJZEVudW1bZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCArIDFdOwogICAgIGZpZWxkSWRQYXRoWzBdID0gZmllbGRJZFBhdGhGaXJzdDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkSWRQYXRoUmVzdC5sZW5ndGg7IGkrKyl7Ci0gICAgICBmaWVsZElkUGF0aFtpICsgMV0gPSBmaWVsZElkUGF0aFJlc3RbaV07Ci0gICAgfQorICAgIFN5c3RlbS5hcnJheWNvcHkoZmllbGRJZFBhdGhSZXN0LCAwLCBmaWVsZElkUGF0aCwgMSwgZmllbGRJZFBhdGhSZXN0Lmxlbmd0aCk7CiAKICAgICAvLyBpbmRleCBpbnRvIGZpZWxkIElEIHBhdGggYmVpbmcgY3VycmVudGx5IHNlYXJjaGVkIGZvcgogICAgIGludCBjdXJQYXRoSW5kZXggPSAwOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQppbmRleCBjMTdkNjYxLi5mYmM3Nzg3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEVudW1IZWxwZXIuamF2YQpAQCAtMTksNyArMTksNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCi1pbXBvcnQgamF2YS5sYW5nLkluc3RhbnRpYXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcuSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYzU2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSA8Y29kZT5UUHJvY2Vzc29yPC9jb2RlPiBhbGxvd2luZworICogYSBzaW5nbGUgPGNvZGU+VFNlcnZlcjwvY29kZT4gdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KKyAqCisgKiA8cD5UbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbAorICogcHJvY2Vzc29ycyB3aXRoIGl0LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PC9wPgorICoKKyAqIDxibG9ja3F1b3RlPjxjb2RlPgorICogICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgKgorICogICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAqICAgICAgICAgIkNhbGN1bGF0b3IiLAorICogICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAqCisgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBXZWF0aGVyUmVwb3J0LlByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdCk7CisgKgorICogICAgIHNlcnZlci5zZXJ2ZSgpOworICogPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAqLworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFRQcm9jZXNzb3I+IFNFUlZJQ0VfUFJPQ0VTU09SX01BUAorICAgICAgICAgICAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIFRQcm9jZXNzb3IgZGVmYXVsdFByb2Nlc3NvcjsKKworICAgIC8qKgorICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+LiAgVGhpcworICAgICAqIGFsbG93cyB1cyB0byBicm9rZXIgcmVxdWVzdHMgdG8gaW5kaXZpZHVhbCBzZXJ2aWNlcyBieSB1c2luZyB0aGUgc2VydmljZQorICAgICAqIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCisgICAgICogZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAqIEBwYXJhbSBwcm9jZXNzb3IgSW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLCB1c3VhbGx5IHJlZmVycmVkIHRvCisgICAgICogYXMgImhhbmRsZXJzIiwgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlclByb2Nlc3NvcihTdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgICAgIFNFUlZJQ0VfUFJPQ0VTU09SX01BUC5wdXQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBzZXJ2aWNlIHRvIGJlIGNhbGxlZCB0byBwcm9jZXNzIHF1ZXJpZXMgd2l0aG91dCBzZXJ2aWNlIG5hbWUKKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEZWZhdWx0KFRQcm9jZXNzb3IgcHJvY2Vzc29yKSB7CisgICAgICAgIGRlZmF1bHRQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorICAgICAqCisgICAgICogPG9sPgorICAgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgorICAgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgorICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKKyAgICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIFRNZXNzYWdlLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBJZiB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwgaWYKKyAgICAgKiB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCisgICAgICogbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4gIFlvdSBjYWxsZWQge0BsaW5rICNyZWdpc3RlclByb2Nlc3NvcihTdHJpbmcsIFRQcm9jZXNzb3IpIHJlZ2lzdGVyUHJvY2Vzc29yfQorICAgICAqIGR1cmluZyBpbml0aWFsaXphdGlvbiwgcmlnaHQ/IDopCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgICAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgICAgICAgICBkZWFsIHdpdGggYXQgdGhlIGVuZCBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKi8KKyAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKTsKKworICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9IFRNZXNzYWdlVHlwZS5DQUxMICYmIG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UubmFtZS5pbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICBpZiAoZGVmYXVsdFByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yLnByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbWVzc2FnZSksIG9wcm90KTsKKyAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBtZXNzYWdlLm5hbWUgKyAiLiAgRGlkIHlvdSAiICsKKyAgICAgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICBUUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvciA9IFNFUlZJQ0VfUFJPQ0VTU09SX01BUC5nZXQoc2VydmljZU5hbWUpOworICAgICAgICBpZiAoYWN0dWFsUHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAiICsgc2VydmljZU5hbWUgKyAiLiAgRGlkIHlvdSBmb3JnZXQgIiArCisgICAgICAgICAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgVE1lc3NhZ2Ugc3RhbmRhcmRNZXNzYWdlID0gbmV3IFRNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UubmFtZS5zdWJzdHJpbmcoc2VydmljZU5hbWUubGVuZ3RoKCkrVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXFpZAorICAgICAgICApOworCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5wcm9jZXNzKG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woaXByb3QsIHN0YW5kYXJkTWVzc2FnZSksIG9wcm90KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuICBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKKyAgICAgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICAgICAqICB0aGUgc3RhbmRhcmQgZm9ybWF0LCB3aXRob3V0IHRoZSBzZXJ2aWNlIG5hbWUgcHJlcGVuZGVkIHRvIFRNZXNzYWdlLm5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKyAgICAgICAgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luOworICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKSB7CisgICAgICAgICAgICBzdXBlcihwcm90b2NvbCk7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2VCZWdpbiA9IG1lc3NhZ2VCZWdpbjsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZUJlZ2luOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJkOTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuamF2YQpAQCAtMCwwICsxLDM5OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgdXNlcyBhIHNpbmdsZSB0aHJlYWQgdG8gc2V0IHVwIG5vbi1ibG9ja2luZyBzb2NrZXRzIHRvIGEgc2V0CisgKiBvZiByZW1vdGUgc2VydmVycyAoaG9zdG5hbWUgYW5kIHBvcnQgcGFpcnMpLCBhbmQgc2VuZHMgYSBzYW1lIHJlcXVlc3QgdG8KKyAqIGFsbCB0aGVzZSBzZXJ2ZXJzLiBJdCB0aGVuIGZldGNoZXMgcmVzcG9uc2VzIGZyb20gc2VydmVycy4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICBpbnQgbWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyIC0gYW4gdXBwZXIgbGltaXQgZm9yIHJlY2VpdmUgYnVmZmVyIHNpemUKKyAqIHBlciBzZXJ2ZXIgKGluIGJ5dGUpLiBJZiBhIHJlc3BvbnNlIGZyb20gYSBzZXJ2ZXIgZXhjZWVkcyB0aGlzIGxpbWl0LCB0aGUKKyAqIGNsaWVudCB3aWxsIG5vdCBhbGxvY2F0ZSBtZW1vcnkgb3IgcmVhZCByZXNwb25zZSBkYXRhIGZvciBpdC4KKyAqCisgKiAgIGludCBmZXRjaFRpbWVvdXRTZWNvbmRzIC0gdGltZSBsaW1pdCBmb3IgZmV0Y2hpbmcgcmVzcG9uc2VzIGZyb20gYWxsCisgKiBzZXJ2ZXJzIChpbiBzZWNvbmQpLiBBZnRlciB0aGUgdGltZW91dCwgdGhlIGZldGNoIGpvYiBpcyBzdG9wcGVkIGFuZAorICogYXZhaWxhYmxlIHJlc3BvbnNlcyBhcmUgcmV0dXJuZWQuCisgKgorICogICBCeXRlQnVmZmVyIHJlcXVlc3RCdWYgLSByZXF1ZXN0IG1lc3NhZ2UgdGhhdCBpcyBzZW50IHRvIGFsbCBzZXJ2ZXJzLgorICoKKyAqIE91dHB1dDoKKyAqICAgUmVzcG9uc2VzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgb2YgQnl0ZUJ1ZmZlcnMuIEluZGV4IG9mIGVsZW1lbnRzIGluCisgKiB0aGlzIGFycmF5IGNvcnJlc3BvbmRzIHRvIGluZGV4IG9mIHNlcnZlcnMgaW4gdGhlIHNlcnZlciBsaXN0LiBDb250ZW50IGluCisgKiBhIEJ5dGVCdWZmZXIgbWF5IGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgorICogICAxLiBGaXJzdCA0IGJ5dGVzIGZvcm0gYW4gaW50ZWdlciBpbmRpY2F0aW5nIGxlbmd0aCBvZiBmb2xsb3dpbmcgZGF0YSwKKyAqIHRoZW4gZm9sbG93ZWQgYnkgdGhlIGRhdGEuCisgKiAgIDIuIEZpcnN0IDQgYnl0ZXMgZm9ybSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgbGVuZ3RoIG9mIGZvbGxvd2luZyBkYXRhLAorICogdGhlbiBmb2xsb3dlZCBieSBub3RoaW5nIC0gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIHJlc3BvbnNlIGRhdGEgc2l6ZQorICogZXhjZWVkcyBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIsIGFuZCB0aGUgY2xpZW50IHdpbGwgbm90IHJlYWQgYW55CisgKiByZXNwb25zZSBkYXRhLgorICogICAzLiBObyBkYXRhIGluIHRoZSBCeXRlQnVmZmVyIC0gdGhpcyBoYXBwZW5zIHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdAorICogcmV0dXJuIGFueSByZXNwb25zZSB3aXRoaW4gZmV0Y2hUaW1lb3V0U2Vjb25kcy4KKyAqCisgKiAgIEluIHNvbWUgc3BlY2lhbCBjYXNlcyAobm8gc2VydmVycyBhcmUgZ2l2ZW4sIGZldGNoVGltZW91dFNlY29uZHMgbGVzcworICogdGhhbiBvciBlcXVhbCB0byAwLCByZXF1ZXN0QnVmIGlzIG51bGwpLCB0aGUgcmV0dXJuIGlzIG51bGwuCisgKgorICogTm90ZToKKyAqICAgSXQgYXNzdW1lcyBhbGwgcmVtb3RlIHNlcnZlcnMgYXJlIFROb25ibG9ja2luZ1NlcnZlcnMgYW5kIHVzZQorICogVEZyYW1lZFRyYW5zcG9ydC4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50IHsKKyAgCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigKKyAgICBUTm9uYmxvY2tpbmdNdWx0aUZldGNoQ2xpZW50LmNsYXNzLmdldE5hbWUoKQorICApOworCisgIC8vIGlmIHRoZSBzaXplIG9mIHRoZSByZXNwb25zZSBtc2cgZXhjZWVkcyB0aGlzIGxpbWl0IChpbiBieXRlKSwgd2Ugd2lsbAorICAvLyBub3QgcmVhZCB0aGUgbXNnCisgIHByaXZhdGUgaW50IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcjsKKworICAvLyB0aW1lIGxpbWl0IGZvciBmZXRjaGluZyBkYXRhIGZyb20gYWxsIHNlcnZlcnMgKGluIHNlY29uZCkKKyAgcHJpdmF0ZSBpbnQgZmV0Y2hUaW1lb3V0U2Vjb25kczsKKworICAvLyBzdG9yZSByZXF1ZXN0IHRoYXQgd2lsbCBiZSBzZW50IHRvIHNlcnZlcnMgIAorICBwcml2YXRlIEJ5dGVCdWZmZXIgcmVxdWVzdEJ1ZjsKKyAgcHJpdmF0ZSBCeXRlQnVmZmVyIHJlcXVlc3RCdWZEdXBsaWNhdGlvbjsKKworICAvLyBhIGxpc3Qgb2YgcmVtb3RlIHNlcnZlcnMKKyAgcHJpdmF0ZSBMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBzZXJ2ZXJzOworCisgIC8vIHN0b3JlIGZldGNoIHJlc3VsdHMKKyAgcHJpdmF0ZSBUTm9uYmxvY2tpbmdNdWx0aUZldGNoU3RhdHMgc3RhdHM7CisgIHByaXZhdGUgQnl0ZUJ1ZmZlcltdIHJlY3ZCdWY7CisKKyAgcHVibGljIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQoaW50IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciwKKyAgICBpbnQgZmV0Y2hUaW1lb3V0U2Vjb25kcywgQnl0ZUJ1ZmZlciByZXF1ZXN0QnVmLAorICAgIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IHNlcnZlcnMpIHsKKyAgICB0aGlzLm1heFJlY3ZCdWZCeXRlc1BlclNlcnZlciA9IG1heFJlY3ZCdWZCeXRlc1BlclNlcnZlcjsKKyAgICB0aGlzLmZldGNoVGltZW91dFNlY29uZHMgPSBmZXRjaFRpbWVvdXRTZWNvbmRzOworICAgIHRoaXMucmVxdWVzdEJ1ZiA9IHJlcXVlc3RCdWY7CisgICAgdGhpcy5zZXJ2ZXJzID0gc2VydmVyczsKKyAgICAgIAorICAgIHN0YXRzID0gbmV3IFROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cygpOworICAgIHJlY3ZCdWYgPSBudWxsOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0TWF4UmVjdkJ1ZkJ5dGVzUGVyU2VydmVyKCkgeworICAgIHJldHVybiBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXI7CisgIH0KKworICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRGZXRjaFRpbWVvdXRTZWNvbmRzKCkgeworICAgIHJldHVybiBmZXRjaFRpbWVvdXRTZWNvbmRzOworICB9CisKKyAgLyoqCisgICAqIHJldHVybiBhIGR1cGxpY2F0aW9uIG9mIHJlcXVlc3RCdWYsIHNvIHRoYXQgcmVxdWVzdEJ1ZiB3aWxsIG5vdAorICAgKiBiZSBtb2RpZmllZCBieSBvdGhlcnMuCisgICAqLworICBwdWJsaWMgc3luY2hyb25pemVkIEJ5dGVCdWZmZXIgZ2V0UmVxdWVzdEJ1ZigpIHsKKyAgICBpZiAocmVxdWVzdEJ1ZiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHJlcXVlc3RCdWZEdXBsaWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgIHJlcXVlc3RCdWZEdXBsaWNhdGlvbiA9IHJlcXVlc3RCdWYuZHVwbGljYXRlKCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmVxdWVzdEJ1ZkR1cGxpY2F0aW9uOyAgCisgICAgfQorICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBnZXRTZXJ2ZXJMaXN0KCkgeworICAgIGlmIChzZXJ2ZXJzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChzZXJ2ZXJzKTsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzIGdldEZldGNoU3RhdHMoKSB7CisgICAgcmV0dXJuIHN0YXRzOworICB9CisKKyAgLyoqCisgICAqIG1haW4gZW50cnkgZnVuY3Rpb24gZm9yIGZldGNoaW5nIGZyb20gc2VydmVycworICAgKi8KKyAgcHVibGljIHN5bmNocm9uaXplZCBCeXRlQnVmZmVyW10gZmV0Y2goKSB7CisgICAgLy8gY2xlYXIgcHJldmlvdXMgcmVzdWx0cworICAgIHJlY3ZCdWYgPSBudWxsOworICAgIHN0YXRzLmNsZWFyKCk7CisKKyAgICBpZiAoc2VydmVycyA9PSBudWxsIHx8IHNlcnZlcnMuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgcmVxdWVzdEJ1ZiA9PSBudWxsIHx8IGZldGNoVGltZW91dFNlY29uZHMgPD0gMCkgeworICAgICAgcmV0dXJuIHJlY3ZCdWY7CisgICAgfQorCisgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgTXVsdGlGZXRjaCBtdWx0aUZldGNoID0gbmV3IE11bHRpRmV0Y2goKTsKKyAgICBGdXR1cmVUYXNrPD8+IHRhc2sgPSBuZXcgRnV0dXJlVGFzayhtdWx0aUZldGNoLCBudWxsKTsKKyAgICBleGVjdXRvci5leGVjdXRlKHRhc2spOworICAgIHRyeSB7CisgICAgICB0YXNrLmdldChmZXRjaFRpbWVvdXRTZWNvbmRzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCBleGVjdXRpb24gb2YgdGhlIHRhc2suCisgICAgICB0YXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgIExPR0dFUi5lcnJvcigiaW50ZXJydXB0ZWQgZHVyaW5nIGZldGNoOiAiK2llLnRvU3RyaW5nKCkpOworICAgIH0gY2F0Y2goRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7CisgICAgICAvLyBhdHRlbXB0IHRvIGNhbmNlbCBleGVjdXRpb24gb2YgdGhlIHRhc2suCisgICAgICB0YXNrLmNhbmNlbCh0cnVlKTsKKyAgICAgIExPR0dFUi5lcnJvcigiZXhjZXB0aW9uIGR1cmluZyBmZXRjaDogIitlZS50b1N0cmluZygpKTsKKyAgICB9IGNhdGNoKFRpbWVvdXRFeGNlcHRpb24gdGUpIHsKKyAgICAgIC8vIGF0dGVtcHQgdG8gY2FuY2VsIGV4ZWN1dGlvbiBvZiB0aGUgdGFzay4gIAorICAgICAgdGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICBMT0dHRVIuZXJyb3IoInRpbWVvdXQgZm9yIGZldGNoOiAiK3RlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgbXVsdGlGZXRjaC5jbG9zZSgpOworICAgIHJldHVybiByZWN2QnVmOworICB9CisKKyAgLyoqCisgICAqIFByaXZhdGUgY2xhc3MgdGhhdCBkb2VzIHJlYWwgZmV0Y2ggam9iLgorICAgKiBVc2VycyBhcmUgbm90IGFsbG93ZWQgdG8gZGlyZWN0bHkgdXNlIHRoaXMgY2xhc3MsIGFzIGl0cyBydW4oKQorICAgKiBmdW5jdGlvbiBtYXkgcnVuIGZvcmV2ZXIuCisgICAqLworICBwcml2YXRlIGNsYXNzIE11bHRpRmV0Y2ggaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgcHJpdmF0ZSBTZWxlY3RvciBzZWxlY3RvcjsKKworICAgIC8qKgorICAgICAqIG1haW4gZW50cnkgZnVuY3Rpb24gZm9yIGZldGNoaW5nLgorICAgICAqCisgICAgICogU2VydmVyIHJlc3BvbnNlcyBhcmUgc3RvcmVkIGluIFROb25ibG9jaW5nTXVsdGlGZXRjaENsaWVudC5yZWN2QnVmLAorICAgICAqIGFuZCBmZXRjaCBzdGF0aXN0aWNzIGlzIGluIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQuc3RhdHMuCisgICAgICoKKyAgICAgKiBTYW5pdHkgY2hlY2sgZm9yIHBhcmFtZXRlcnMgaGFzIGJlZW4gZG9uZSBpbgorICAgICAqIFROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICBsb25nIHQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgIGludCBudW1Ub3RhbFNlcnZlcnMgPSBzZXJ2ZXJzLnNpemUoKTsKKyAgICAgIHN0YXRzLnNldE51bVRvdGFsU2VydmVycyhudW1Ub3RhbFNlcnZlcnMpOworCisgICAgICAvLyBidWZmZXIgZm9yIHJlY2VpdmluZyByZXNwb25zZSBmcm9tIHNlcnZlcnMKKyAgICAgIHJlY3ZCdWYgICAgICAgICAgICAgICAgICAgICA9IG5ldyBCeXRlQnVmZmVyW251bVRvdGFsU2VydmVyc107CisgICAgICAvLyBidWZmZXIgZm9yIHNlbmRpbmcgcmVxdWVzdAorICAgICAgQnl0ZUJ1ZmZlciBzZW5kQnVmW10gICAgICAgID0gbmV3IEJ5dGVCdWZmZXJbbnVtVG90YWxTZXJ2ZXJzXTsKKyAgICAgIGxvbmcgbnVtQnl0ZXNSZWFkW10gICAgICAgICA9IG5ldyBsb25nW251bVRvdGFsU2VydmVyc107CisgICAgICBpbnQgZnJhbWVTaXplW10gICAgICAgICAgICAgPSBuZXcgaW50W251bVRvdGFsU2VydmVyc107CisgICAgICBib29sZWFuIGhhc1JlYWRGcmFtZVNpemVbXSAgPSBuZXcgYm9vbGVhbltudW1Ub3RhbFNlcnZlcnNdOworCisgICAgICB0cnkgeworICAgICAgICBzZWxlY3RvciA9IFNlbGVjdG9yLm9wZW4oKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJzZWxlY3RvciBvcGVucyBlcnJvcjogIitlLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG90YWxTZXJ2ZXJzOyBpKyspIHsKKyAgICAgICAgLy8gY3JlYXRlIGJ1ZmZlciB0byBzZW5kIHJlcXVlc3QgdG8gc2VydmVyLgorICAgICAgICBzZW5kQnVmW2ldID0gcmVxdWVzdEJ1Zi5kdXBsaWNhdGUoKTsKKyAgICAgICAgLy8gY3JlYXRlIGJ1ZmZlciB0byByZWFkIHJlc3BvbnNlJ3MgZnJhbWUgc2l6ZSBmcm9tIHNlcnZlcgorICAgICAgICByZWN2QnVmW2ldID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKyAgICAgICAgc3RhdHMuaW5jVG90YWxSZWN2QnVmQnl0ZXMoNCk7CisKKyAgICAgICAgSW5ldFNvY2tldEFkZHJlc3Mgc2VydmVyID0gc2VydmVycy5nZXQoaSk7CisgICAgICAgIFNvY2tldENoYW5uZWwgcyA9IG51bGw7CisgICAgICAgIFNlbGVjdGlvbktleSBrZXkgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgIHMgPSBTb2NrZXRDaGFubmVsLm9wZW4oKTsKKyAgICAgICAgICBzLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTsKKyAgICAgICAgICAvLyBub3cgdGhpcyBtZXRob2QgaXMgbm9uLWJsb2NraW5nCisgICAgICAgICAgcy5jb25uZWN0KHNlcnZlcik7CisgICAgICAgICAga2V5ID0gcy5yZWdpc3RlcihzZWxlY3Rvciwgcy52YWxpZE9wcygpKTsKKyAgICAgICAgICAvLyBhdHRhY2ggaW5kZXggb2YgdGhlIGtleQorICAgICAgICAgIGtleS5hdHRhY2goaSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgc3RhdHMuaW5jTnVtQ29ubmVjdEVycm9yU2VydmVycygpOyAgCisgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNldCB1cCBzb2NrZXQgdG8gc2VydmVyICVzIGVycm9yOiAlcyIsCisgICAgICAgICAgICBzZXJ2ZXIudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAvLyBmcmVlIHJlc291cmNlCisgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHtzLmNsb3NlKCk7fSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7fQorICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICBrZXkuY2FuY2VsKCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIHdhaXQgZm9yIGV2ZW50cworICAgICAgd2hpbGUgKHN0YXRzLmdldE51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCkgKworICAgICAgICBzdGF0cy5nZXROdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCkgPCBzdGF0cy5nZXROdW1Ub3RhbFNlcnZlcnMoKSkgeworICAgICAgICAvLyBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkIChlLmcuLCB0YXNrIGlzIGNhbmNlbGxlZCkgIAorICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnl7CisgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgTE9HR0VSLmVycm9yKCJzZWxlY3RvciBzZWxlY3RzIGVycm9yOiAiK2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvcjxTZWxlY3Rpb25LZXk+IGl0ID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgIFNlbGVjdGlvbktleSBzZWxLZXkgPSBpdC5uZXh0KCk7CisgICAgICAgICAgaXQucmVtb3ZlKCk7CisKKyAgICAgICAgICAvLyBnZXQgcHJldmlvdXNseSBhdHRhY2hlZCBpbmRleAorICAgICAgICAgIGludCBpbmRleCA9IChJbnRlZ2VyKXNlbEtleS5hdHRhY2htZW50KCk7CisKKyAgICAgICAgICBpZiAoc2VsS2V5LmlzVmFsaWQoKSAmJiBzZWxLZXkuaXNDb25uZWN0YWJsZSgpKSB7CisgICAgICAgICAgICAvLyBpZiB0aGlzIHNvY2tldCB0aHJvd3MgYW4gZXhjZXB0aW9uIChlLmcuLCBjb25uZWN0aW9uIHJlZnVzZWQpLAorICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgbXNnIGFuZCBza2lwIGl0LgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICAgIHNDaGFubmVsLmZpbmlzaENvbm5lY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHN0YXRzLmluY051bUNvbm5lY3RFcnJvclNlcnZlcnMoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoInNvY2tldCAlZCBjb25uZWN0cyB0byBzZXJ2ZXIgJXMgIiArCisgICAgICAgICAgICAgICAgImVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgaW5kZXgsIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoc2VsS2V5LmlzVmFsaWQoKSAmJiBzZWxLZXkuaXNXcml0YWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoc2VuZEJ1ZltpbmRleF0uaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgLy8gaWYgdGhpcyBzb2NrZXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcHJpbnQgZXJyb3IgbXNnIGFuZAorICAgICAgICAgICAgICAvLyBza2lwIGl0LgorICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc0NoYW5uZWwgPSAoU29ja2V0Q2hhbm5lbClzZWxLZXkuY2hhbm5lbCgpOworICAgICAgICAgICAgICAgIHNDaGFubmVsLndyaXRlKHNlbmRCdWZbaW5kZXhdKTsKKyAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZXJyID0gU3RyaW5nLmZvcm1hdCgic29ja2V0ICVkIHdyaXRlcyB0byBzZXJ2ZXIgJXMgIiArCisgICAgICAgICAgICAgICAgICAiZXJyb3I6ICVzIiwKKyAgICAgICAgICAgICAgICAgIGluZGV4LCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChzZWxLZXkuaXNWYWxpZCgpICYmIHNlbEtleS5pc1JlYWRhYmxlKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgc29ja2V0IHRocm93cyBhbiBleGNlcHRpb24sIHByaW50IGVycm9yIG1zZyBhbmQKKyAgICAgICAgICAgIC8vIHNraXAgaXQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBTb2NrZXRDaGFubmVsIHNDaGFubmVsID0gKFNvY2tldENoYW5uZWwpc2VsS2V5LmNoYW5uZWwoKTsKKyAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHNDaGFubmVsLnJlYWQocmVjdkJ1ZltpbmRleF0pOworCisgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgbnVtQnl0ZXNSZWFkW2luZGV4XSArPSBieXRlc1JlYWQ7CisKKyAgICAgICAgICAgICAgICBpZiAoIWhhc1JlYWRGcmFtZVNpemVbaW5kZXhdICYmCisgICAgICAgICAgICAgICAgICAgIHJlY3ZCdWZbaW5kZXhdLnJlbWFpbmluZygpPT0wKSB7CisgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZnJhbWUgc2l6ZSBoYXMgYmVlbiByZWFkIGNvbXBsZXRlbHksIHRoZW4gcHJlcGFyZQorICAgICAgICAgICAgICAgICAgLy8gdG8gcmVhZCB0aGUgYWN0dWFsIGZyYW1lLgorICAgICAgICAgICAgICAgICAgZnJhbWVTaXplW2luZGV4XSA9IHJlY3ZCdWZbaW5kZXhdLmdldEludCgwKTsKKworICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZVtpbmRleF0gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGF0cy5pbmNOdW1JbnZhbGlkRnJhbWVTaXplKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJSZWFkIGFuIGludmFsaWQgZnJhbWUgc2l6ZSAlZCIKKyAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSAlcy4gRG9lcyB0aGUgc2VydmVyIHVzZSBURnJhbWVkVHJhbnNwb3J0PyAiLAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZVtpbmRleF0sIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgIHNDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplW2luZGV4XSArIDQgPiBzdGF0cy5nZXRNYXhSZXNwb25zZUJ5dGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuc2V0TWF4UmVzcG9uc2VCeXRlcyhmcmFtZVNpemVbaW5kZXhdKzQpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVTaXplW2luZGV4XSArIDQgPiBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtT3ZlcmZsb3dlZFJlY3ZCdWYoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVyciA9IFN0cmluZy5mb3JtYXQoIlJlYWQgZnJhbWUgc2l6ZSAlZCBmcm9tICVzLCIKKyAgICAgICAgICAgICAgICAgICAgICArICIgdG90YWwgYnVmZmVyIHNpemUgd291bGQgZXhjZWVkIGxpbWl0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemVbaW5kZXhdLCBzZXJ2ZXJzLmdldChpbmRleCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICBtYXhSZWN2QnVmQnl0ZXNQZXJTZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHNDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIGJ1ZmZlciBmb3IgYWN0dWFsIGZyYW1lIGRhdGEKKyAgICAgICAgICAgICAgICAgIHJlY3ZCdWZbaW5kZXhdID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShmcmFtZVNpemVbaW5kZXhdICsgNCk7CisgICAgICAgICAgICAgICAgICByZWN2QnVmW2luZGV4XS5wdXRJbnQoZnJhbWVTaXplW2luZGV4XSk7CisKKyAgICAgICAgICAgICAgICAgIHN0YXRzLmluY1RvdGFsUmVjdkJ1ZkJ5dGVzKGZyYW1lU2l6ZVtpbmRleF0pOworICAgICAgICAgICAgICAgICAgaGFzUmVhZEZyYW1lU2l6ZVtpbmRleF0gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChoYXNSZWFkRnJhbWVTaXplW2luZGV4XSAmJgorICAgICAgICAgICAgICAgICAgbnVtQnl0ZXNSZWFkW2luZGV4XSA+PSBmcmFtZVNpemVbaW5kZXhdKzQpIHsKKyAgICAgICAgICAgICAgICAgIC8vIGhhcyByZWFkIGFsbCBkYXRhCisgICAgICAgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgc3RhdHMuaW5jTnVtUmVhZENvbXBsZXRlZFNlcnZlcnMoKTsKKyAgICAgICAgICAgICAgICAgIGxvbmcgdDIgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgICAgICAgIHN0YXRzLnNldFJlYWRUaW1lKHQyLXQxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBTdHJpbmcuZm9ybWF0KCJzb2NrZXQgJWQgcmVhZHMgZnJvbSBzZXJ2ZXIgJXMgIiArCisgICAgICAgICAgICAgICAgImVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgaW5kZXgsIHNlcnZlcnMuZ2V0KGluZGV4KS50b1N0cmluZygpLCBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkaXNwb3NlIGFueSByZXNvdXJjZSBhbGxvY2F0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChzZWxlY3Rvci5pc09wZW4oKSkgeworICAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gaXQgPSBzZWxlY3Rvci5rZXlzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBTZWxlY3Rpb25LZXkgc2VsS2V5ID0gaXQubmV4dCgpOworICAgICAgICAgICAgU29ja2V0Q2hhbm5lbCBzQ2hhbm5lbCA9IChTb2NrZXRDaGFubmVsKXNlbEtleS5jaGFubmVsKCk7CisgICAgICAgICAgICBzQ2hhbm5lbC5jbG9zZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJmcmVlIHJlc291cmNlIGVycm9yOiAiK2UudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cy5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1ROb25ibG9ja2luZ011bHRpRmV0Y2hTdGF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjg2MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCisvKioKKyAqIFRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2Ygc3RhdGlzdGljcyBmb3IgVE5vbmJsb2NraW5NdWx0aUZldGNoQ2xpZW50LgorICovCitwdWJsaWMgY2xhc3MgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzIHsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtVG90YWxTZXJ2ZXJzOworICBwcml2YXRlIGludCAgICBudW1SZWFkQ29tcGxldGVkU2VydmVyczsKKyAgcHJpdmF0ZSBpbnQgICAgbnVtQ29ubmVjdEVycm9yU2VydmVyczsKKyAgcHJpdmF0ZSBpbnQgICAgdG90YWxSZWN2QnVmQnl0ZXM7CisgIHByaXZhdGUgaW50ICAgIG1heFJlc3BvbnNlQnl0ZXM7CisgIHByaXZhdGUgaW50ICAgIG51bU92ZXJmbG93ZWRSZWN2QnVmOworICBwcml2YXRlIGludCAgICBudW1JbnZhbGlkRnJhbWVTaXplOworICAvLyB0aW1lIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmZXRjaCgpIGZ1bmN0aW9uIHRvIHRoZSByZWFkaW5nIGZpbmlzaAorICAvLyB0aW1lIG9mIHRoZSBsYXN0IHNvY2tldCAoaW4gbWlsbGktc2Vjb25kKQorICBwcml2YXRlIGxvbmcgICByZWFkVGltZTsKKworICBwdWJsaWMgVE5vbmJsb2NraW5nTXVsdGlGZXRjaFN0YXRzKCkgeworICAgIGNsZWFyKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICBudW1Ub3RhbFNlcnZlcnMgPSAwOworICAgIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzID0gMDsKKyAgICBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzID0gMDsKKyAgICB0b3RhbFJlY3ZCdWZCeXRlcyA9IDA7CisgICAgbWF4UmVzcG9uc2VCeXRlcyA9IDA7CisgICAgbnVtT3ZlcmZsb3dlZFJlY3ZCdWYgPSAwOworICAgIG51bUludmFsaWRGcmFtZVNpemUgPSAwOworICAgIHJlYWRUaW1lID0gMDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nIHN0YXRzID0gU3RyaW5nLmZvcm1hdCgibnVtVG90YWxTZXJ2ZXJzPSVkLCAiICsKKyAgICAgICJudW1SZWFkQ29tcGxldGVkU2VydmVycz0lZCwgbnVtQ29ubmVjdEVycm9yU2VydmVycz0lZCwgIiArCisgICAgICAibnVtVW5yZXNwb25zaXZlU2VydmVycz0lZCwgdG90YWxSZWN2QnVmQnl0ZXM9JWZNLCAiICsKKyAgICAgICJtYXhSZXNwb25zZUJ5dGVzPSVkLCBudW1PdmVyZmxvd2VkUmVjdkJ1Zj0lZCwgIiArCisgICAgICAibnVtSW52YWxpZEZyYW1lU2l6ZT0lZCwgcmVhZFRpbWU9JWRtcyIsCisgICAgICBudW1Ub3RhbFNlcnZlcnMsIG51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzLCBudW1Db25uZWN0RXJyb3JTZXJ2ZXJzLAorICAgICAgKG51bVRvdGFsU2VydmVycy1udW1SZWFkQ29tcGxldGVkU2VydmVycy1udW1Db25uZWN0RXJyb3JTZXJ2ZXJzKSwKKyAgICAgIHRvdGFsUmVjdkJ1ZkJ5dGVzLzEwMjQuMC8xMDI0LCBtYXhSZXNwb25zZUJ5dGVzLCBudW1PdmVyZmxvd2VkUmVjdkJ1ZiwKKyAgICAgIG51bUludmFsaWRGcmFtZVNpemUsIHJlYWRUaW1lKTsKKyAgICByZXR1cm4gc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXROdW1Ub3RhbFNlcnZlcnMoaW50IHZhbCkgICAgeyBudW1Ub3RhbFNlcnZlcnMgPSB2YWw7IH0KKyAgcHVibGljIHZvaWQgc2V0TWF4UmVzcG9uc2VCeXRlcyhpbnQgdmFsKSAgIHsgbWF4UmVzcG9uc2VCeXRlcyA9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBzZXRSZWFkVGltZShsb25nIHZhbCkgICAgICAgICAgeyByZWFkVGltZSA9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1SZWFkQ29tcGxldGVkU2VydmVycygpICAgeyBudW1SZWFkQ29tcGxldGVkU2VydmVycysrOyB9CisgIHB1YmxpYyB2b2lkIGluY051bUNvbm5lY3RFcnJvclNlcnZlcnMoKSAgICB7IG51bUNvbm5lY3RFcnJvclNlcnZlcnMrKzsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1PdmVyZmxvd2VkUmVjdkJ1ZigpICAgICAgeyBudW1PdmVyZmxvd2VkUmVjdkJ1ZisrOyB9CisgIHB1YmxpYyB2b2lkIGluY1RvdGFsUmVjdkJ1ZkJ5dGVzKGludCB2YWwpICB7IHRvdGFsUmVjdkJ1ZkJ5dGVzICs9IHZhbDsgfQorICBwdWJsaWMgdm9pZCBpbmNOdW1JbnZhbGlkRnJhbWVTaXplKCkgICAgICAgeyBudW1JbnZhbGlkRnJhbWVTaXplKys7IH0KKworICBwdWJsaWMgaW50IGdldE1heFJlc3BvbnNlQnl0ZXMoKSAgICAgICAgeyByZXR1cm4gbWF4UmVzcG9uc2VCeXRlczsgfQorICBwdWJsaWMgaW50IGdldE51bVJlYWRDb21wbGV0ZWRTZXJ2ZXJzKCkgeyByZXR1cm4gbnVtUmVhZENvbXBsZXRlZFNlcnZlcnM7IH0KKyAgcHVibGljIGludCBnZXROdW1Db25uZWN0RXJyb3JTZXJ2ZXJzKCkgIHsgcmV0dXJuIG51bUNvbm5lY3RFcnJvclNlcnZlcnM7IH0KKyAgcHVibGljIGludCBnZXROdW1Ub3RhbFNlcnZlcnMoKSAgICAgICAgIHsgcmV0dXJuIG51bVRvdGFsU2VydmVyczsgfQorICBwdWJsaWMgaW50IGdldE51bU92ZXJmbG93ZWRSZWN2QnVmKCkgICAgeyByZXR1cm4gbnVtT3ZlcmZsb3dlZFJlY3ZCdWY7fQorICBwdWJsaWMgaW50IGdldFRvdGFsUmVjdkJ1ZkJ5dGVzKCkgICAgICAgeyByZXR1cm4gdG90YWxSZWN2QnVmQnl0ZXM7fQorICBwdWJsaWMgaW50IGdldE51bUludmFsaWRGcmFtZVNpemUoKSAgICAgeyByZXR1cm4gbnVtSW52YWxpZEZyYW1lU2l6ZTsgfQorICBwdWJsaWMgbG9uZyBnZXRSZWFkVGltZSgpICAgICAgICAgICAgICAgeyByZXR1cm4gcmVhZFRpbWU7IH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UUHJvY2Vzc29yRmFjdG9yeS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKaW5kZXggYmNkOGEzOC4uODE5MzNhMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RQcm9jZXNzb3JGYWN0b3J5LmphdmEKQEAgLTM2LDQgKzM2LDggQEAKICAgcHVibGljIFRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKFRUcmFuc3BvcnQgdHJhbnMpIHsKICAgICByZXR1cm4gcHJvY2Vzc29yXzsKICAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNQcm9jZXNzb3IoKSB7CisgICAgICByZXR1cm4gcHJvY2Vzc29yXyBpbnN0YW5jZW9mIFRBc3luY1Byb2Nlc3NvcjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJpYWxpemFibGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAwMDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VyaWFsaXphYmxlLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworCisvKioKKyAqIEdlbmVyaWMgYmFzZSBpbnRlcmZhY2UgZm9yIGdlbmVyYXRlZCBUaHJpZnQgb2JqZWN0cy4KKyAqCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVFNlcmlhbGl6YWJsZSB7CisKKyAgLyoqCisgICAqIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gaXByb3QgSW5wdXQgcHJvdG9jb2wKKyAgICovCisgIHB1YmxpYyB2b2lkIHJlYWQoVFByb3RvY29sIGlwcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKKyAgICoKKyAgICogQHBhcmFtIG9wcm90IE91dHB1dCBwcm90b2NvbAorICAgKi8KKyAgcHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQppbmRleCAxNTcxNWYxLi4wMGEzNmVlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFNlcnZpY2VDbGllbnQuamF2YQpAQCAtNTgsMjIgKzU4LDMyIEBACiAgICAgcmV0dXJuIHRoaXMub3Byb3RfOwogICB9CiAKLSAgcHJvdGVjdGVkIHZvaWQgc2VuZEJhc2UoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlIGFyZ3MpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBvcHJvdF8ud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1ldGhvZE5hbWUsIFRNZXNzYWdlVHlwZS5DQUxMLCArK3NlcWlkXykpOworICBwcm90ZWN0ZWQgdm9pZCBzZW5kQmFzZShTdHJpbmcgbWV0aG9kTmFtZSwgVEJhc2U8Pyw/PiBhcmdzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc2VuZEJhc2UobWV0aG9kTmFtZSwgYXJncywgVE1lc3NhZ2VUeXBlLkNBTEwpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgc2VuZEJhc2VPbmV3YXkoU3RyaW5nIG1ldGhvZE5hbWUsIFRCYXNlPD8sPz4gYXJncykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHNlbmRCYXNlKG1ldGhvZE5hbWUsIGFyZ3MsIFRNZXNzYWdlVHlwZS5PTkVXQVkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRCYXNlKFN0cmluZyBtZXRob2ROYW1lLCBUQmFzZTw/LD8+IGFyZ3MsIGJ5dGUgdHlwZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIG9wcm90Xy53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UobWV0aG9kTmFtZSwgdHlwZSwgKytzZXFpZF8pKTsKICAgICBhcmdzLndyaXRlKG9wcm90Xyk7CiAgICAgb3Byb3RfLndyaXRlTWVzc2FnZUVuZCgpOwogICAgIG9wcm90Xy5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOwogICB9CiAKLSAgcHJvdGVjdGVkIHZvaWQgcmVjZWl2ZUJhc2UoVEJhc2UgcmVzdWx0LCBTdHJpbmcgbWV0aG9kTmFtZSkgdGhyb3dzIFRFeGNlcHRpb24geworICBwcm90ZWN0ZWQgdm9pZCByZWNlaXZlQmFzZShUQmFzZTw/LD8+IHJlc3VsdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBUTWVzc2FnZSBtc2cgPSBpcHJvdF8ucmVhZE1lc3NhZ2VCZWdpbigpOwogICAgIGlmIChtc2cudHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OKSB7Ci0gICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5yZWFkKGlwcm90Xyk7CisgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgIHgucmVhZChpcHJvdF8pOwogICAgICAgaXByb3RfLnJlYWRNZXNzYWdlRW5kKCk7CiAgICAgICB0aHJvdyB4OwogICAgIH0KICAgICBpZiAobXNnLnNlcWlkICE9IHNlcWlkXykgewotICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELCBtZXRob2ROYW1lICsgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZSIpOworICAgICAgdGhyb3cgbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uQkFEX1NFUVVFTkNFX0lELAorICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGZhaWxlZDogb3V0IG9mIHNlcXVlbmNlIHJlc3BvbnNlOiBleHBlY3RlZCAlZCBidXQgZ290ICVkIiwgbWV0aG9kTmFtZSwgc2VxaWRfLCBtc2cuc2VxaWQpKTsKICAgICB9CiAgICAgcmVzdWx0LnJlYWQoaXByb3RfKTsKICAgICBpcHJvdF8ucmVhZE1lc3NhZ2VFbmQoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQppbmRleCAzMDUyZWUxLi4xZWYxMWRmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPD8sPz4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4geworcHVibGljIGFic3RyYWN0IGNsYXNzIFRVbmlvbjxUIGV4dGVuZHMgVFVuaW9uPFQsRj4sIEYgZXh0ZW5kcyBURmllbGRJZEVudW0+IGltcGxlbWVudHMgVEJhc2U8VCwgRj4gewogCiAgIHByb3RlY3RlZCBPYmplY3QgdmFsdWVfOwogICBwcm90ZWN0ZWQgRiBzZXRGaWVsZF87CkBAIC03OSw3ICs3OSw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBNYXAgZGVlcENvcHlNYXAoTWFwPE9iamVjdCwgT2JqZWN0PiBtYXApIHsKLSAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKCk7CisgICAgTWFwIGNvcHkgPSBuZXcgSGFzaE1hcChtYXAuc2l6ZSgpKTsKICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgewogICAgICAgY29weS5wdXQoZGVlcENvcHlPYmplY3QoZW50cnkuZ2V0S2V5KCkpLCBkZWVwQ29weU9iamVjdChlbnRyeS5nZXRWYWx1ZSgpKSk7CiAgICAgfQpAQCAtODcsNyArODcsNyBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgU2V0IGRlZXBDb3B5U2V0KFNldCBzZXQpIHsKLSAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KCk7CisgICAgU2V0IGNvcHkgPSBuZXcgSGFzaFNldChzZXQuc2l6ZSgpKTsKICAgICBmb3IgKE9iamVjdCBvIDogc2V0KSB7CiAgICAgICBjb3B5LmFkZChkZWVwQ29weU9iamVjdChvKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0YjAxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hbm5vdGF0aW9uL051bGxhYmxlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKKy8qKgorICogQW5ub3RhdGlvbiBpbmRpY2F0aW5nIGEgZmllbGQsIG1ldGhvZCByZXR1cm4sIG9yIG1ldGhvZCBwYXJhbWV0ZXIgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAqIFdlIHBhY2thZ2Ugb3VyIG93biBhbm5vdGF0aW9uIHRvIGF2b2lkIGEgbWFuZGF0b3J5IHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LkNMQVNTKQorcHVibGljIEBpbnRlcmZhY2UgTnVsbGFibGUgeworCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL0FzeW5jTWV0aG9kQ2FsbGJhY2suamF2YQppbmRleCAwMDAwNGI3Li40ZWJkZTA3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvQXN5bmNNZXRob2RDYWxsYmFjay5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9Bc3luY01ldGhvZENhbGxiYWNrLmphdmEKQEAgLTE4LDIyICsxOCwzNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jOwogCi0KKy8qKgorICogQSBoYW5kbGVyIGludGVyZmFjZSBhc3luY2hyb25vdXMgY2xpZW50cyBjYW4gaW1wbGVtZW50IHRvIHJlY2VpdmUgZnV0dXJlCisgKiBub3RpY2Ugb2YgdGhlIHJlc3VsdHMgb2YgYW4gYXN5bmNocm9ub3VzIG1ldGhvZCBjYWxsLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBhc3luY2hyb25vdXNseSBpbnZva2VkIG1ldGhvZC4KKyAqLwogcHVibGljIGludGVyZmFjZSBBc3luY01ldGhvZENhbGxiYWNrPFQ+IHsKICAgLyoqCiAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlbW90ZSBzaWRlIGhhcyBjb21wbGV0ZWQgaW52b2tpbmcKLSAgICogeW91ciBtZXRob2QgY2FsbCBhbmQgdGhlIHJlc3VsdCBpcyBmdWxseSByZWFkLiBGb3Igb25ld2F5IG1ldGhvZCBjYWxscywKLSAgICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB3ZSBoYXZlIGNvbXBsZXRlZCB3cml0aW5nIG91dCB0aGUKLSAgICogcmVxdWVzdC4KLSAgICogQHBhcmFtIHJlc3BvbnNlCisgICAqIHlvdXIgbWV0aG9kIGNhbGwgYW5kIHRoZSByZXN1bHQgaXMgZnVsbHkgcmVhZC4gRm9yIHtAY29kZSBvbmV3YXl9IG1ldGhvZAorICAgKiBjYWxscywgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXMgc29vbiBhcyB3ZSBoYXZlIGNvbXBsZXRlZCB3cml0aW5nIG91dAorICAgKiB0aGUgcmVxdWVzdC4KKyAgICoKKyAgICogQHBhcmFtIHJlc3BvbnNlIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGFzeW5jaHJvbm91c2x5IGludm9rZWQgbWV0aG9kOworICAgKiAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IGZvciB2b2lkIG1ldGhvZHMgd2hpY2ggaW5jbHVkZXMKKyAgICogICAgICAgICAgICAgICAgIHtAY29kZSBvbmV3YXl9IG1ldGhvZHMuCiAgICAqLwotICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFQgcmVzcG9uc2UpOworICB2b2lkIG9uQ29tcGxldGUoVCByZXNwb25zZSk7CiAKICAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYW4gdW5leHBlY3RlZCBjbGllbnRzaWRlCi0gICAqIGV4Y2VwdGlvbi4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFwcGxpY2F0aW9uLWRlZmluZWQgZXhjZXB0aW9ucyB0aGF0Ci0gICAqIGFwcGVhciBpbiB0aGUgSURMLCBidXQgcmF0aGVyIHRoaW5ncyBsaWtlIElPRXhjZXB0aW9ucy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbgorICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGVpdGhlciBhbiB1bmV4cGVjdGVkIGNsaWVudC1zaWRlCisgICAqIGV4Y2VwdGlvbiBsaWtlIGFuIElPRXhjZXB0aW9uIG9yIGVsc2Ugd2hlbiB0aGUgcmVtb3RlIG1ldGhvZCByYWlzZXMgYW4KKyAgICogZXhjZXB0aW9uLCBlaXRoZXIgZGVjbGFyZWQgaW4gdGhlIElETCBvciBkdWUgdG8gYW4gdW5leHBlY3RlZCBzZXJ2ZXItc2lkZQorICAgKiBlcnJvci4KKyAgICoKKyAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgdGhlIHRoZSBhc3luY2hyb25vdXMKKyAgICogICAgICAgICAgICAgICAgICBtZXRob2QgY2FsbCwgbWF5IGJlIGEgbG9jYWwgZXhjZXB0aW9uIG9yIGFuIHVubWFyc2hhbGxlZAorICAgKiAgICAgICAgICAgICAgICAgIHJlbW90ZSBleGNlcHRpb24uCiAgICAqLwotICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pOworICB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbik7CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50LmphdmEKaW5kZXggOWEyMjcxNy4uMDA1MDE4YSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnQuamF2YQpAQCAtNjYsNyArNjYsNyBAQAogCiAgIC8qKgogICAgKiBHZXQgdGhlIGNsaWVudCdzIGVycm9yIC0gcmV0dXJucyBudWxsIGlmIG5vIGVycm9yCi0gICAqIEByZXR1cm4gR2V0IHRoZSBjbGllbnQncyBlcnJvci4gPGJyIC8+IHJldHVybnMgbnVsbCBpZiBubyBlcnJvcgorICAgKiBAcmV0dXJuIEdldCB0aGUgY2xpZW50J3MgZXJyb3IuIDxwPiByZXR1cm5zIG51bGwgaWYgbm8gZXJyb3IKICAgICovCiAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3IoKSB7CiAgICAgcmV0dXJuIF9fX2Vycm9yOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudE1hbmFnZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKaW5kZXggOThmNzE5NC4uYzA3Y2NkNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY0NsaWVudE1hbmFnZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRTZWxlY3RvckV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7CkBAIC0xMTYsNiArMTE3LDEyIEBACiAgICAgICAgICAgTE9HR0VSLmVycm9yKCJJZ25vcmluZyB1bmNhdWdodCBleGNlcHRpb24gaW4gU2VsZWN0VGhyZWFkIiwgZXhjZXB0aW9uKTsKICAgICAgICAgfQogICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBzZWxlY3Rvci5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBjbG9zZSBzZWxlY3Rvci4gVGhpcyBtYXkgcmVzdWx0IGluIGxlYWtlZCByZXNvdXJjZXMhIiwgZXgpOworICAgICAgfQogICAgIH0KIAogICAgIC8vIFRyYW5zaXRpb24gbWV0aG9kcyBmb3IgcmVhZHkga2V5cwpAQCAtMTgyLDcgKzE4OSw3IEBACiAgIH0KIAogICAvKiogQ29tcGFyYXRvciB1c2VkIGluIFRyZWVTZXQgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbFRpbWVvdXRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxUQXN5bmNNZXRob2RDYWxsPiB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRBc3luY01ldGhvZENhbGxUaW1lb3V0Q29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8VEFzeW5jTWV0aG9kQ2FsbD4sIFNlcmlhbGl6YWJsZSB7CiAgICAgcHVibGljIGludCBjb21wYXJlKFRBc3luY01ldGhvZENhbGwgbGVmdCwgVEFzeW5jTWV0aG9kQ2FsbCByaWdodCkgewogICAgICAgaWYgKGxlZnQuZ2V0VGltZW91dFRpbWVzdGFtcCgpID09IHJpZ2h0LmdldFRpbWVvdXRUaW1lc3RhbXAoKSkgewogICAgICAgICByZXR1cm4gKGludCkobGVmdC5nZXRTZXF1ZW5jZUlkKCkgLSByaWdodC5nZXRTZXF1ZW5jZUlkKCkpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UQXN5bmNNZXRob2RDYWxsLmphdmEKaW5kZXggZmNkNTBlYS4uM2JmMTc0NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1RBc3luY01ldGhvZENhbGwuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVEFzeW5jTWV0aG9kQ2FsbC5qYXZhCkBAIC0zMywxMSArMzMsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIAogLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYW4gYXN5bmMgbWV0aG9kIGNhbGwKKyAqIEVuY2Fwc3VsYXRlcyBhbiBhc3luYyBtZXRob2QgY2FsbC4KKyAqIDxwPgogICogTmVlZCB0byBnZW5lcmF0ZToKLSAqICAgLSBwcml2YXRlIHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpCi0gKiAgIC0gcHVibGljIFQgZ2V0UmVzdWx0KCkgdGhyb3dzIDxFeGNlcHRpb25fMT4sIDxFeGNlcHRpb25fMj4sIC4uLgotICogQHBhcmFtIDxUPgorICogPHVsPgorICogICA8bGk+cHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpPC9saT4KKyAqICAgPGxpPnByb3RlY3RlZCBhYnN0cmFjdCBUIGdldFJlc3VsdCgpIHRocm93cyAmbHQ7RXhjZXB0aW9uXzEmZ3Q7LCAmbHQ7RXhjZXB0aW9uXzImZ3Q7LCAuLi48L2xpPgorICogPC91bD4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZW5jYXBzdWxhdGVkIG1ldGhvZCBjYWxsLgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVEFzeW5jTWV0aG9kQ2FsbDxUPiB7CiAKQEAgLTY1LDcgKzY5LDggQEAKICAgcHJpdmF0ZSBmaW5hbCBBc3luY01ldGhvZENhbGxiYWNrPFQ+IGNhbGxiYWNrOwogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNPbmV3YXk7CiAgIHByaXZhdGUgbG9uZyBzZXF1ZW5jZUlkOwotICAKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVvdXQ7CisKICAgcHJpdmF0ZSBCeXRlQnVmZmVyIHNpemVCdWZmZXI7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHNpemVCdWZmZXJBcnJheSA9IG5ldyBieXRlWzRdOwogICBwcml2YXRlIEJ5dGVCdWZmZXIgZnJhbWVCdWZmZXI7CkBAIC03OSw2ICs4NCw3IEBACiAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CiAgICAgdGhpcy5pc09uZXdheSA9IGlzT25ld2F5OwogICAgIHRoaXMuc2VxdWVuY2VJZCA9IFRBc3luY01ldGhvZENhbGwuc2VxdWVuY2VJZENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgdGhpcy50aW1lb3V0ID0gY2xpZW50LmdldFRpbWVvdXQoKTsKICAgfQogCiAgIHByb3RlY3RlZCBTdGF0ZSBnZXRTdGF0ZSgpIHsKQEAgLTEwMiwxNSArMTA4LDE3IEBACiAgIH0KICAgCiAgIHB1YmxpYyBib29sZWFuIGhhc1RpbWVvdXQoKSB7Ci0gICAgcmV0dXJuIGNsaWVudC5oYXNUaW1lb3V0KCk7CisgICAgcmV0dXJuIHRpbWVvdXQgPiAwOwogICB9CiAgIAogICBwdWJsaWMgbG9uZyBnZXRUaW1lb3V0VGltZXN0YW1wKCkgewotICAgIHJldHVybiBjbGllbnQuZ2V0VGltZW91dCgpICsgc3RhcnRUaW1lOworICAgIHJldHVybiB0aW1lb3V0ICsgc3RhcnRUaW1lOwogICB9CiAKICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVfYXJncyhUUHJvdG9jb2wgcHJvdG9jb2wpIHRocm93cyBURXhjZXB0aW9uOwogCisgIHByb3RlY3RlZCBhYnN0cmFjdCBUIGdldFJlc3VsdCgpIHRocm93cyBFeGNlcHRpb247CisKICAgLyoqCiAgICAqIEluaXRpYWxpemUgYnVmZmVycy4KICAgICogQHRocm93cyBURXhjZXB0aW9uIGlmIGJ1ZmZlciBpbml0aWFsaXphdGlvbiBmYWlscwpAQCAtMTY1LDcgKzE3Myw3IEBACiAgICAqIHNlbGVjdCBpbnRlcmVzdHMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBjb25jdXJyZW5jeS4KICAgICogQHBhcmFtIGtleQogICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CisgIHZvaWQgdHJhbnNpdGlvbihTZWxlY3Rpb25LZXkga2V5KSB7CiAgICAgLy8gRW5zdXJlIGtleSBpcyB2YWxpZAogICAgIGlmICgha2V5LmlzVmFsaWQoKSkgewogICAgICAga2V5LmNhbmNlbCgpOwpAQCAtMjIzLDggKzIzMSwxNCBAQAogICAgIGtleS5pbnRlcmVzdE9wcygwKTsKICAgICAvLyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgVEFzeW5jTWV0aG9kIGluc3RhbmNlIGRvZXNuJ3QgaGFuZyBhcm91bmQKICAgICBrZXkuYXR0YWNoKG51bGwpOwotICAgIGNsaWVudC5vbkNvbXBsZXRlKCk7Ci0gICAgY2FsbGJhY2sub25Db21wbGV0ZSgoVCl0aGlzKTsKKyAgICB0cnkgeworICAgICAgVCByZXN1bHQgPSB0aGlzLmdldFJlc3VsdCgpOworICAgICAgY2xpZW50Lm9uQ29tcGxldGUoKTsKKyAgICAgIGNhbGxiYWNrLm9uQ29tcGxldGUocmVzdWx0KTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAga2V5LmNhbmNlbCgpOworICAgICAgb25FcnJvcihlKTsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9SZWFkaW5nUmVzcG9uc2VTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKaW5kZXggYjYzNDI5MS4uNDQ1ZjdlNCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcywgTWFwPD8gZXh0ZW5kcyBURmllbGRJZEVudW0sIEZpZWxkTWV0YURhdGE+IG1hcCl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgYWRkU3RydWN0TWV0YURhdGFNYXAoQ2xhc3M8PyBleHRlbmRzIFRCYXNlPiBzQ2xhc3MsIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBtYXApewogICAgIHN0cnVjdE1hcC5wdXQoc0NsYXNzLCBtYXApOwogICB9CiAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICoKICAgICogQHBhcmFtIHNDbGFzcyBUaGUgVEJhc2UgY2xhc3MgZm9yIHdoaWNoIHRoZSBtZXRhZGF0YSBtYXAgaXMgcmVxdWVzdGVkCiAgICAqLwotICBwdWJsaWMgc3RhdGljIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcyl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1hcDw/IGV4dGVuZHMgVEZpZWxkSWRFbnVtLCBGaWVsZE1ldGFEYXRhPiBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzczw/IGV4dGVuZHMgVEJhc2U+IHNDbGFzcyl7CiAgICAgaWYgKCFzdHJ1Y3RNYXAuY29udGFpbnNLZXkoc0NsYXNzKSl7IC8vIExvYWQgY2xhc3MgaWYgaXQgaGFzbid0IGJlZW4gbG9hZGVkCiAgICAgICB0cnl7CiAgICAgICAgIHNDbGFzcy5uZXdJbnN0YW5jZSgpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Nob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NTkzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogU2hvcnRTdGFjayBpcyBhIHNob3J0LXNwZWNpZmljIFN0YWNrIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gZm9yIHRoZSBleHByZXNzCisgKiBwdXJwb3NlIG9mIHZlcnkgZmFzdCBvcGVyYXRpb25zIG9uIFRDb21wYWN0UHJvdG9jb2wncyBmaWVsZCBpZCBzdGFjay4gVGhpcworICogaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgYXQgbGVhc3QgMTB4IGZhc3RlciB0aGFuIGphdmEudXRpbC5TdGFjay4KKyAqLworY2xhc3MgU2hvcnRTdGFjayB7CisKKyAgcHJpdmF0ZSBzaG9ydFtdIHZlY3RvcjsKKworICAvKiogQWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCBsb2NhdGlvbiAqLworICBwcml2YXRlIGludCB0b3AgPSAwOworCisgIHB1YmxpYyBTaG9ydFN0YWNrKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICB2ZWN0b3IgPSBuZXcgc2hvcnRbaW5pdGlhbENhcGFjaXR5XTsKKyAgfQorCisgIHB1YmxpYyBzaG9ydCBwb3AoKSB7CisgICAgcmV0dXJuIHZlY3RvclstLXRvcF07CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXNoKHNob3J0IHB1c2hlZCkgeworICAgIGlmICh2ZWN0b3IubGVuZ3RoID09IHRvcCkgeworICAgICAgZ3JvdygpOworICAgIH0KKyAgICB2ZWN0b3JbdG9wKytdID0gcHVzaGVkOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7CisgICAgdmVjdG9yID0gQXJyYXlzLmNvcHlPZih2ZWN0b3IsIHZlY3Rvci5sZW5ndGggPDwgMSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0b3AgPSAwOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgc2IuYXBwZW5kKCI8U2hvcnRTdGFjayB2ZWN0b3I6WyIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLmxlbmd0aDsgaSsrKSB7CisgICAgICBib29sZWFuIGlzVG9wID0gKGkgPT0gKHRvcCAtIDEpKTsKKyAgICAgIHNob3J0IHZhbHVlID0gdmVjdG9yW2ldOworICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgIH0KKyAgICAgIGlmIChpc1RvcCkgeworICAgICAgICBzYi5hcHBlbmQoIj4+IikuYXBwZW5kKHZhbHVlKS5hcHBlbmQoIjw8Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBzYi5hcHBlbmQoIl0+Iik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQppbmRleCAwYzIwZmE5Li43OTI0ZTJmIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwpAQCAtMzEsNDQgKzMxLDU5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU3RydWN0IEFOT05ZTU9VU19TVFJVQ1QgPSBuZXcgVFN0cnVjdCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5PX0xFTkdUSF9MSU1JVCA9IC0xOwogCiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7CiAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7CiAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgorICAgKiB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXRfOwogCi0gIHByb3RlY3RlZCBpbnQgcmVhZExlbmd0aF87Ci0gIHByb3RlY3RlZCBib29sZWFuIGNoZWNrUmVhZExlbmd0aF8gPSBmYWxzZTsKKyAgLyoqCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byByZWFkIGZyb20gdGhlIG5ldHdvcmsgZm9yCisgICAqIGNvbnRhaW5lcnMgKG1hcHMsIHNldHMsIGxpc3RzKSwgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvciB1bmxpbWl0ZWQuCisgICAqLworICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOworCisgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfOworICBwcm90ZWN0ZWQgYm9vbGVhbiBzdHJpY3RXcml0ZV87CisKKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gaW5vdXRUZW1wID0gbmV3IGJ5dGVbOF07CiAKICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICAgIHByb3RlY3RlZCBib29sZWFuIHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLSAgICBwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOworICAgIHByb3RlY3RlZCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKyAgICBwcm90ZWN0ZWQgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF87CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfOwogCiAgICAgcHVibGljIEZhY3RvcnkoKSB7CiAgICAgICB0aGlzKGZhbHNlLCB0cnVlKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmFjdG9yeShib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMoc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUsIDApOworICAgICAgdGhpcyhzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSwgTk9fTEVOR1RIX0xJTUlULCBOT19MRU5HVEhfTElNSVQpOwogICAgIH0KIAotICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgaW50IHJlYWRMZW5ndGgpIHsKKyAgICBwdWJsaWMgRmFjdG9yeShsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgICB0aGlzKGZhbHNlLCB0cnVlLCBzdHJpbmdMZW5ndGhMaW1pdCwgY29udGFpbmVyTGVuZ3RoTGltaXQpOworICAgIH0KKworICAgIHB1YmxpYyBGYWN0b3J5KGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSwgbG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICAgIHN0cmljdFJlYWRfID0gc3RyaWN0UmVhZDsKICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwotICAgICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwogICAgIH0KIAogICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewotICAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7Ci0gICAgICBpZiAocmVhZExlbmd0aF8gIT0gMCkgewotICAgICAgICBwcm90by5zZXRSZWFkTGVuZ3RoKHJlYWRMZW5ndGhfKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwcm90bzsKKyAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdF8sIGNvbnRhaW5lckxlbmd0aExpbWl0Xywgc3RyaWN0UmVhZF8sIHN0cmljdFdyaXRlXyk7CiAgICAgfQogICB9CiAKQEAgLTgwLDExICs5NSwyMiBAQAogICB9CiAKICAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIHN0cmljdFJlYWQsIGJvb2xlYW4gc3RyaWN0V3JpdGUpIHsKKyAgICB0aGlzKHRyYW5zLCBOT19MRU5HVEhfTElNSVQsIE5PX0xFTkdUSF9MSU1JVCwgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpOworICB9CisKKyAgcHVibGljIFRCaW5hcnlQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CisgICAgdGhpcyh0cmFucywgc3RyaW5nTGVuZ3RoTGltaXQsIGNvbnRhaW5lckxlbmd0aExpbWl0LCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXQsIGJvb2xlYW4gc3RyaWN0UmVhZCwgYm9vbGVhbiBzdHJpY3RXcml0ZSkgewogICAgIHN1cGVyKHRyYW5zKTsKKyAgICBzdHJpbmdMZW5ndGhMaW1pdF8gPSBzdHJpbmdMZW5ndGhMaW1pdDsKKyAgICBjb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CiAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmIChzdHJpY3RXcml0ZV8pIHsKICAgICAgIGludCB2ZXJzaW9uID0gVkVSU0lPTl8xIHwgbWVzc2FnZS50eXBlOwpAQCAtOTgsOTggKzEyNCwxMTAgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUoZmllbGQudHlwZSk7CiAgICAgd3JpdGVJMTYoZmllbGQuaWQpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKFRUeXBlLlNUT1ApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUobWFwLmtleVR5cGUpOwogICAgIHdyaXRlQnl0ZShtYXAudmFsdWVUeXBlKTsKICAgICB3cml0ZUkzMihtYXAuc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IGxpc3QpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGUobGlzdC5lbGVtVHlwZSk7CiAgICAgd3JpdGVJMzIobGlzdC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKHNldC5lbGVtVHlwZSk7CiAgICAgd3JpdGVJMzIoc2V0LnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGUgW10gYm91dCA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJvdXRbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShib3V0LCAwLCAxKTsKKyAgICBpbm91dFRlbXBbMF0gPSBiOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDEpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2b3V0ID0gbmV3IGJ5dGVbMl07CisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUkxNihzaG9ydCBpMTYpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpMTZvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMTYgPj4gOCkpOwotICAgIGkxNm91dFsxXSA9IChieXRlKSgweGZmICYgKGkxNikpOwotICAgIHRyYW5zXy53cml0ZShpMTZvdXQsIDAsIDIpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgMik7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJvdXQgPSBuZXcgYnl0ZVs0XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpMzIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpMzJvdXRbMF0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMjQpKTsKLSAgICBpMzJvdXRbMV0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gMTYpKTsKLSAgICBpMzJvdXRbMl0gPSAoYnl0ZSkoMHhmZiAmIChpMzIgPj4gOCkpOwotICAgIGkzMm91dFszXSA9IChieXRlKSgweGZmICYgKGkzMikpOwotICAgIHRyYW5zXy53cml0ZShpMzJvdXQsIDAsIDQpOworICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOworICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOworICAgIGlub3V0VGVtcFsyXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiA4KSk7CisgICAgaW5vdXRUZW1wWzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTMyKSk7CisgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgNCk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpNjRvdXQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaTY0b3V0WzBdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDU2KSk7Ci0gICAgaTY0b3V0WzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQ4KSk7Ci0gICAgaTY0b3V0WzJdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDQwKSk7Ci0gICAgaTY0b3V0WzNdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDMyKSk7Ci0gICAgaTY0b3V0WzRdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDI0KSk7Ci0gICAgaTY0b3V0WzVdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDE2KSk7Ci0gICAgaTY0b3V0WzZdID0gKGJ5dGUpKDB4ZmYgJiAoaTY0ID4+IDgpKTsKLSAgICBpNjRvdXRbN10gPSAoYnl0ZSkoMHhmZiAmIChpNjQpKTsKLSAgICB0cmFuc18ud3JpdGUoaTY0b3V0LCAwLCA4KTsKKyAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICBpbm91dFRlbXBbMl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICBpbm91dFRlbXBbM10gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICBpbm91dFRlbXBbNF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICBpbm91dFRlbXBbNV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICBpbm91dFRlbXBbNl0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gOCkpOworICAgIGlub3V0VGVtcFs3XSA9IChieXRlKSgweGZmICYgKGk2NCkpOworICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUk2NChEb3VibGUuZG91YmxlVG9Mb25nQml0cyhkdWIpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBkYXQgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKLSAgICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGRhdCA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUkzMihkYXQubGVuZ3RoKTsKKyAgICB0cmFuc18ud3JpdGUoZGF0LCAwLCBkYXQubGVuZ3RoKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJpbmFyeShCeXRlQnVmZmVyIGJpbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSBiaW4ubGltaXQoKSAtIGJpbi5wb3NpdGlvbigpOwogICAgIHdyaXRlSTMyKGxlbmd0aCk7CkBAIC0yMDAsNiArMjM4LDcgQEAKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAgICAgaWYgKHNpemUgPCAwKSB7CkBAIC0yMTYsNTggKzI1NSw3NiBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGUgdHlwZSA9IHJlYWRCeXRlKCk7CiAgICAgc2hvcnQgaWQgPSB0eXBlID09IFRUeXBlLlNUT1AgPyAwIDogcmVhZEkxNigpOwogICAgIHJldHVybiBuZXcgVEZpZWxkKCIiLCB0eXBlLCBpZCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIFRNYXAgbWFwID0gbmV3IFRNYXAocmVhZEJ5dGUoKSwgcmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobWFwLnNpemUpOworICAgIHJldHVybiBtYXA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IFRMaXN0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgVExpc3QgbGlzdCA9IG5ldyBUTGlzdChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChsaXN0LnNpemUpOworICAgIHJldHVybiBsaXN0OwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBUU2V0KHJlYWRCeXRlKCksIHJlYWRJMzIoKSk7CisgICAgVFNldCBzZXQgPSBuZXcgVFNldChyZWFkQnl0ZSgpLCByZWFkSTMyKCkpOworICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChzZXQuc2l6ZSk7CisgICAgcmV0dXJuIHNldDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCi0gIHByaXZhdGUgYnl0ZVtdIGJpbiA9IG5ldyBieXRlWzFdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMSkgewogICAgICAgYnl0ZSBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDEpOwogICAgICAgcmV0dXJuIGI7CiAgICAgfQotICAgIHJlYWRBbGwoYmluLCAwLCAxKTsKLSAgICByZXR1cm4gYmluWzBdOworICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAxKTsKKyAgICByZXR1cm4gaW5vdXRUZW1wWzBdOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTE2cmQgPSBuZXcgYnl0ZVsyXTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMTZyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMikgewpAQCAtMjc1LDcgKzMzMiw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkxNnJkLCAwLCAyKTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCAyKTsKICAgICB9CiAKICAgICByZXR1cm4KQEAgLTI4NCw5ICszNDEsOSBAQAogICAgICAgICgoYnVmW29mZisxXSAmIDB4ZmYpKSk7CiAgIH0KIAotICBwcml2YXRlIGJ5dGVbXSBpMzJyZCA9IG5ldyBieXRlWzRdOworICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBidWYgPSBpMzJyZDsKKyAgICBieXRlW10gYnVmID0gaW5vdXRUZW1wOwogICAgIGludCBvZmYgPSAwOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gNCkgewpAQCAtMjk0LDcgKzM1MSw3IEBACiAgICAgICBvZmYgPSB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKTsKICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKDQpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZWFkQWxsKGkzMnJkLCAwLCA0KTsKKyAgICAgIHJlYWRBbGwoaW5vdXRUZW1wLCAwLCA0KTsKICAgICB9CiAgICAgcmV0dXJuCiAgICAgICAoKGJ1ZltvZmZdICYgMHhmZikgPDwgMjQpIHwKQEAgLTMwMyw5ICszNjAsOSBAQAogICAgICAgKChidWZbb2ZmKzNdICYgMHhmZikpOwogICB9CiAKLSAgcHJpdmF0ZSBieXRlW10gaTY0cmQgPSBuZXcgYnl0ZVs4XTsKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ1ZiA9IGk2NHJkOworICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSA4KSB7CkBAIC0zMTMsNyArMzcwLDcgQEAKICAgICAgIG9mZiA9IHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoOCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJlYWRBbGwoaTY0cmQsIDAsIDgpOworICAgICAgcmVhZEFsbChpbm91dFRlbXAsIDAsIDgpOwogICAgIH0KIAogICAgIHJldHVybgpAQCAtMzI3LDQwICszODQsMzkgQEAKICAgICAgICgobG9uZykoYnVmW29mZis3XSAmIDB4ZmYpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRJNjQoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBzaXplID0gcmVhZEkzMigpOwogCisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOworCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIHNpemUsICJVVEYtOCIpOwotICAgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihzaXplKTsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgICB9CisgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBzaXplLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKHNpemUpOworICAgICAgcmV0dXJuIHM7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlYWRTdHJpbmdCb2R5KHNpemUpOwogICB9CiAKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBjaGVja1JlYWRMZW5ndGgoc2l6ZSk7Ci0gICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGNoZWNrU3RyaW5nUmVhZExlbmd0aChzaXplKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOworCisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOwogCiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gc2l6ZSkgewogICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIud3JhcCh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLCBzaXplKTsKQEAgLTM3MywyNiArNDI5LDI5IEBACiAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChidWYpOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKICAgcHJpdmF0ZSBpbnQgcmVhZEFsbChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKGxlbik7CiAgICAgcmV0dXJuIHRyYW5zXy5yZWFkQWxsKGJ1Ziwgb2ZmLCBsZW4pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UmVhZExlbmd0aChpbnQgcmVhZExlbmd0aCkgewotICAgIHJlYWRMZW5ndGhfID0gcmVhZExlbmd0aDsKLSAgICBjaGVja1JlYWRMZW5ndGhfID0gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxlbmd0aCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7Ci0gICAgfQotICAgIGlmIChjaGVja1JlYWRMZW5ndGhfKSB7Ci0gICAgICByZWFkTGVuZ3RoXyAtPSBsZW5ndGg7Ci0gICAgICBpZiAocmVhZExlbmd0aF8gPCAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgbGVuZ3RoIGV4Y2VlZGVkOiAiICsgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKaW5kZXggN2IyNzNjNS4uZWUwNTg2OSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCkBAIC0yMiwyMSArMjIsMjUgQEAKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlNob3J0U3RhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKIAogLyoqCiAgKiBUQ29tcGFjdFByb3RvY29sMiBpcyB0aGUgSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcGFjdCBwcm90b2NvbCBzcGVjaWZpZWQKLSAqIGluIFRIUklGVC0xMTAuIFRoZSBmdW5kYW1lbnRhbCBhcHByb2FjaCB0byByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2YgCisgKiBpbiBUSFJJRlQtMTEwLiBUaGUgZnVuZGFtZW50YWwgYXBwcm9hY2ggdG8gcmVkdWNpbmcgdGhlIG92ZXJoZWFkIG9mCiAgKiBzdHJ1Y3R1cmVzIGlzIGEpIHVzZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMgYWxsIG92ZXIgdGhlIHBsYWNlIGFuZCBiKSBtYWtlCi0gKiB1c2Ugb2YgdW51c2VkIGJpdHMgd2hlcmV2ZXIgcG9zc2libGUuIFlvdXIgc2F2aW5ncyB3aWxsIG9idmlvdXNseSB2YXJ5IAotICogYmFzZWQgb24gdGhlIHNwZWNpZmljIG1ha2V1cCBvZiB5b3VyIHN0cnVjdHMsIGJ1dCBpbiBnZW5lcmFsLCB0aGUgbW9yZSAKKyAqIHVzZSBvZiB1bnVzZWQgYml0cyB3aGVyZXZlciBwb3NzaWJsZS4gWW91ciBzYXZpbmdzIHdpbGwgb2J2aW91c2x5IHZhcnkKKyAqIGJhc2VkIG9uIHRoZSBzcGVjaWZpYyBtYWtldXAgb2YgeW91ciBzdHJ1Y3RzLCBidXQgaW4gZ2VuZXJhbCwgdGhlIG1vcmUKICAqIGZpZWxkcywgbmVzdGVkIHN0cnVjdHVyZXMsIHNob3J0IHN0cmluZ3MgYW5kIGNvbGxlY3Rpb25zLCBhbmQgbG93LXZhbHVlIGkzMgogICogYW5kIGk2NCBmaWVsZHMgeW91IGhhdmUsIHRoZSBtb3JlIGJlbmVmaXQgeW91J2xsIHNlZS4KICAqLwogcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlW10gRU1QVFlfQllURVMgPSBuZXcgYnl0ZVswXTsKKyAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQnl0ZUJ1ZmZlciBFTVBUWV9CVUZGRVIgPSBCeXRlQnVmZmVyLndyYXAoRU1QVFlfQllURVMpOworCisgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgTk9fTEVOR1RIX0xJTUlUID0gLTE7CiAKICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoIiIpOwogICBwcml2YXRlIGZpbmFsIHN0YXRpYyBURmllbGQgVFNUT1AgPSBuZXcgVEZpZWxkKCIiLCBUVHlwZS5TVE9QLCAoc2hvcnQpMCk7CkBAIC02MiwxOCArNjYsMjQgQEAKICAgICogVFByb3RvY29sRmFjdG9yeSB0aGF0IHByb2R1Y2VzIFRDb21wYWN0UHJvdG9jb2xzLgogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1heE5ldHdvcmtCeXRlc187CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgY29udGFpbmVyTGVuZ3RoTGltaXRfOwogCiAgICAgcHVibGljIEZhY3RvcnkoKSB7Ci0gICAgICBtYXhOZXR3b3JrQnl0ZXNfID0gLTE7CisgICAgICB0aGlzKE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRmFjdG9yeShpbnQgbWF4TmV0d29ya0J5dGVzKSB7Ci0gICAgICBtYXhOZXR3b3JrQnl0ZXNfID0gbWF4TmV0d29ya0J5dGVzOworICAgIHB1YmxpYyBGYWN0b3J5KGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQpIHsKKyAgICAgIHRoaXMoc3RyaW5nTGVuZ3RoTGltaXQsIE5PX0xFTkdUSF9MSU1JVCk7CisgICAgfQorCisgICAgcHVibGljIEZhY3RvcnkobG9uZyBzdHJpbmdMZW5ndGhMaW1pdCwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdCkgeworICAgICAgdGhpcy5jb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKKyAgICAgIHRoaXMuc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CiAgICAgfQogCiAgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMsIG1heE5ldHdvcmtCeXRlc18pOworICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zLCBzdHJpbmdMZW5ndGhMaW1pdF8sIGNvbnRhaW5lckxlbmd0aExpbWl0Xyk7CiAgICAgfQogICB9CiAKQEAgLTgxLDYgKzkxLDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OID0gMTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBWRVJTSU9OX01BU0sgPSAweDFmOyAvLyAwMDAxIDExMTEKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFX01BU0sgPSAoYnl0ZSkweEUwOyAvLyAxMTEwIDAwMDAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CiAKICAgLyoqCkBAIC0xMDEsNyArMTEyLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgU1RSVUNUICAgICAgICAgPSAweDBDOwogICB9CiAKLSAgLyoqIAorICAvKioKICAgICogVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKICAgICogc28gd2UgY2FuIGRvIHRoZSBkZWx0YSBzdHVmZi4KICAgICovCkBAIC0xMTAsMzQgKzEyMSw2MiBAQAogICBwcml2YXRlIHNob3J0IGxhc3RGaWVsZElkXyA9IDA7CiAKICAgLyoqCi0gICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbiAKKyAgICogSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCiAgICAqIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KICAgICovCiAgIHByaXZhdGUgVEZpZWxkIGJvb2xlYW5GaWVsZF8gPSBudWxsOwogCiAgIC8qKgotICAgKiBJZiB3ZSByZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4gCisgICAqIElmIHdlIHJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgogICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgcmVhZEJvb2wgY2FuIHVzZSBpdC4KICAgICovCiAgIHByaXZhdGUgQm9vbGVhbiBib29sVmFsdWVfID0gbnVsbDsKIAogICAvKioKLSAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgbmV0d29yayBmb3IKLSAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3IgLTEgZm9yCisgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBmb3IKKyAgICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkcyAoc3VjaCBhcyBzdHJpbmdzIG9yIGJpbmFyeSkgb3Ige0BsaW5rICNOT19MRU5HVEhfTElNSVR9IGZvcgogICAgKiB1bmxpbWl0ZWQuCiAgICAqLwotICBwcml2YXRlIGZpbmFsIGxvbmcgbWF4TmV0d29ya0J5dGVzXzsKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0cmluZ0xlbmd0aExpbWl0XzsKKworICAvKioKKyAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQgZnJvbSB0aGUgbmV0d29yayBmb3IKKyAgICogY29udGFpbmVycyAobWFwcywgc2V0cywgbGlzdHMpLCBvciB7QGxpbmsgI05PX0xFTkdUSF9MSU1JVH0gZm9yIHVubGltaXRlZC4KKyAgICovCisgIHByaXZhdGUgZmluYWwgbG9uZyBjb250YWluZXJMZW5ndGhMaW1pdF87CisKKyAgLyoqCisgICAqIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgdmFyaW91cyBvcGVyYXRpb25zIHRoYXQgd291bGQgb3RoZXJ3aXNlIHJlcXVpcmUgYQorICAgKiBzbWFsbCBhbGxvY2F0aW9uLgorICAgKi8KKyAgcHJpdmF0ZSBmaW5hbCBieXRlW10gdGVtcCA9IG5ldyBieXRlWzEwXTsKIAogICAvKioKICAgICogQ3JlYXRlIGEgVENvbXBhY3RQcm90b2NvbC4KICAgICoKICAgICogQHBhcmFtIHRyYW5zcG9ydCB0aGUgVFRyYW5zcG9ydCBvYmplY3QgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvLgotICAgKiBAcGFyYW0gbWF4TmV0d29ya0J5dGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZvcgorICAgKiBAcGFyYW0gc3RyaW5nTGVuZ3RoTGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZm9yCiAgICAqICAgICB2YXJpYWJsZS1sZW5ndGggZmllbGRzLgorICAgKiBAcGFyYW0gY29udGFpbmVyTGVuZ3RoTGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHJlYWQKKyAgICogICAgIGZvciBjb250YWluZXJzLgogICAgKi8KLSAgcHVibGljIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGxvbmcgbWF4TmV0d29ya0J5dGVzKSB7CisgIHB1YmxpYyBUQ29tcGFjdFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBsb25nIHN0cmluZ0xlbmd0aExpbWl0LCBsb25nIGNvbnRhaW5lckxlbmd0aExpbWl0KSB7CiAgICAgc3VwZXIodHJhbnNwb3J0KTsKLSAgICBtYXhOZXR3b3JrQnl0ZXNfID0gbWF4TmV0d29ya0J5dGVzOworICAgIHRoaXMuc3RyaW5nTGVuZ3RoTGltaXRfID0gc3RyaW5nTGVuZ3RoTGltaXQ7CisgICAgdGhpcy5jb250YWluZXJMZW5ndGhMaW1pdF8gPSBjb250YWluZXJMZW5ndGhMaW1pdDsKKyAgfQorCisgIC8qKgorICAgKiBDcmVhdGUgYSBUQ29tcGFjdFByb3RvY29sLgorICAgKgorICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCisgICAqIEBwYXJhbSBzdHJpbmdMZW5ndGhMaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmb3IKKyAgICogICAgIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMuCisgICAqIEBkZXByZWNhdGVkIFVzZSBjb25zdHJ1Y3RvciBzcGVjaWZ5aW5nIGJvdGggc3RyaW5nIGxpbWl0IGFuZCBjb250YWluZXIgbGltaXQgaW5zdGVhZAorICAgKi8KKyAgQERlcHJlY2F0ZWQKKyAgcHVibGljIFRDb21wYWN0UHJvdG9jb2woVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGxvbmcgc3RyaW5nTGVuZ3RoTGltaXQpIHsKKyAgICB0aGlzKHRyYW5zcG9ydCwgc3RyaW5nTGVuZ3RoTGltaXQsIE5PX0xFTkdUSF9MSU1JVCk7CiAgIH0KIAogICAvKioKQEAgLTE0Niw3ICsxODUsNyBAQAogICAgKiBAcGFyYW0gdHJhbnNwb3J0IHRoZSBUVHJhbnNwb3J0IG9iamVjdCB0byByZWFkIGZyb20gb3Igd3JpdGUgdG8uCiAgICAqLwogICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zcG9ydCkgewotICAgIHRoaXModHJhbnNwb3J0LCAtMSk7CisgICAgdGhpcyh0cmFuc3BvcnQsIE5PX0xFTkdUSF9MSU1JVCwgTk9fTEVOR1RIX0xJTUlUKTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTYzLDYgKzIwMiw3IEBACiAgICAqIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKICAgICogcHJvdG9jb2wgdmVyc2lvbiBzbyB3ZSBjYW4gbWlncmF0ZSBmb3J3YXJkcyBpbiB0aGUgZnV0dXJlIGlmIG5lZWQgYmUuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZURpcmVjdChQUk9UT0NPTF9JRCk7CiAgICAgd3JpdGVCeXRlRGlyZWN0KChWRVJTSU9OICYgVkVSU0lPTl9NQVNLKSB8ICgobWVzc2FnZS50eXBlIDw8IFRZUEVfU0hJRlRfQU1PVU5UKSAmIFRZUEVfTUFTSykpOwpAQCAtMTcxLDEwICsyMTEsMTEgQEAKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgCisgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQogICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwogICAgIGxhc3RGaWVsZElkXyA9IDA7CkBAIC0xOTEsMTAgKzIzMiwxMCBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKKyAgICogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAogICAgKiB0aGVuIHRoZSBmaWVsZCBpZCB3aWxsIGJlIGVuY29kZWQgaW4gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlCiAgICAqIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAqLyAKKyAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKSB7CiAgICAgICAvLyB3ZSB3YW50IHRvIHBvc3NpYmx5IGluY2x1ZGUgdGhlIHZhbHVlLCBzbyB3ZSdsbCB3YWl0LgpAQCAtMjA1LDggKzI0Niw4IEBACiAgIH0KIAogICAvKioKLSAgICogVGhlIHdvcmtob3JzZSBvZiB3cml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEgCi0gICAqICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIAorICAgKiBUaGUgd29ya2hvcnNlIG9mIHdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYQorICAgKiAndHlwZSBvdmVycmlkZScgb2YgdGhlIHR5cGUgaGVhZGVyLiBUaGlzIGlzIHVzZWQgc3BlY2lmaWNhbGx5IGluIHRoZQogICAgKiBib29sZWFuIGZpZWxkIGNhc2UuCiAgICAqLwogICBwcml2YXRlIHZvaWQgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjM3LDcgKzI3OCw3IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUgCisgICAqIFdyaXRlIGEgbWFwIGhlYWRlci4gSWYgdGhlIG1hcCBpcyBlbXB0eSwgb21pdCB0aGUga2V5IGFuZCB2YWx1ZSB0eXBlCiAgICAqIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KICAgICovCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCBtYXApIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTI0OCw4ICsyODksOCBAQAogICAgICAgd3JpdGVCeXRlRGlyZWN0KGdldENvbXBhY3RUeXBlKG1hcC5rZXlUeXBlKSA8PCA0IHwgZ2V0Q29tcGFjdFR5cGUobWFwLnZhbHVlVHlwZSkpOwogICAgIH0KICAgfQotICAKLSAgLyoqIAorCisgIC8qKgogICAgKiBXcml0ZSBhIGxpc3QgaGVhZGVyLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtMjY0LDkgKzMwNSw5IEBACiAgIH0KIAogICAvKioKLSAgICogV3JpdGUgYSBib29sZWFuIHZhbHVlLiBQb3RlbnRpYWxseSwgdGhpcyBjb3VsZCBiZSBhIGJvb2xlYW4gZmllbGQsIGluIAorICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KICAgICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLiAKKyAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiB3cml0ZSB0aGUgZmllbGQgaGVhZGVyLgogICAgKiBPdGhlcndpc2UsIHdyaXRlIGEgc2luZ2xlIGJ5dGUuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0yODAsNyArMzIxLDcgQEAKICAgICB9CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBXcml0ZSBhIGJ5dGUuIE5vdGhpbmcgdG8gc2VlIGhlcmUhCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGUoYnl0ZSBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0zMTAsMjcgKzM1MSwyMiBAQAogCiAgIC8qKgogICAgKiBXcml0ZSBhIGRvdWJsZSB0byB0aGUgd2lyZSBhcyA4IGJ5dGVzLgotICAgKi8gCisgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdezAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgZGF0YSwgMCk7Ci0gICAgdHJhbnNfLndyaXRlKGRhdGEpOworICAgIGZpeGVkTG9uZ1RvQnl0ZXMoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZHViKSwgdGVtcCwgMCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIDgpOwogICB9CiAKICAgLyoqCiAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQorICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKICAgfQogCiAgIC8qKgotICAgKiBXcml0ZSBhIGJ5dGUgYXJyYXksIHVzaW5nIGEgdmFyaW50IGZvciB0aGUgc2l6ZS4gCisgICAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgogICAgKi8KICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKTsKQEAgLTM0Myw5ICszNzksOSBAQAogICB9CiAKICAgLy8KLSAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIGJ5IHN0cnVjdHMsIGJ1dCBkb24ndCBhY3R1YWxseSBoYXZlIGFueSB3aXJlIAorICAvLyBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgYnkgc3RydWN0cywgYnV0IGRvbid0IGFjdHVhbGx5IGhhdmUgYW55IHdpcmUKICAgLy8gb3V0cHV0IG9yIHB1cnBvc2UuCi0gIC8vIAorICAvLwogCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KQEAgLTM1OCw3ICszOTQsNyBAQAogICAvLwogCiAgIC8qKgotICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uIAorICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCiAgICAqIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSB0eXBlIGluZGljYXRvci4KICAgICovCiAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ29sbGVjdGlvbkJlZ2luKGJ5dGUgZWxlbVR5cGUsIGludCBzaXplKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC0zNzQsNDQgKzQxMCw0MiBAQAogICAgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgogICAgKiBUT0RPOiBtYWtlIGEgcGVybWFuZW50IGJ1ZmZlciBsaWtlIHdyaXRlVmFyaW50NjQ/CiAgICAqLwotICBieXRlW10gaTMyYnVmID0gbmV3IGJ5dGVbNV07CiAgIHByaXZhdGUgdm9pZCB3cml0ZVZhcmludDMyKGludCBuKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGlkeCA9IDA7CiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSluOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKW47CiAgICAgICAgIC8vIHdyaXRlQnl0ZURpcmVjdCgoYnl0ZSluKTsKICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8vIHJldHVybjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGkzMmJ1ZltpZHgrK10gPSAoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICB0ZW1wW2lkeCsrXSA9IChieXRlKSgobiAmIDB4N0YpIHwgMHg4MCk7CiAgICAgICAgIC8vIHdyaXRlQnl0ZURpcmVjdCgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKICAgICAgICAgbiA+Pj49IDc7CiAgICAgICB9CiAgICAgfQotICAgIHRyYW5zXy53cml0ZShpMzJidWYsIDAsIGlkeCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIGlkeCk7CiAgIH0KIAogICAvKioKICAgICogV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCiAgICAqLwotICBieXRlW10gdmFyaW50NjRvdXQgPSBuZXcgYnl0ZVsxMF07CiAgIHByaXZhdGUgdm9pZCB3cml0ZVZhcmludDY0KGxvbmcgbikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBpZHggPSAwOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICBpZiAoKG4gJiB+MHg3RkwpID09IDApIHsKLSAgICAgICAgdmFyaW50NjRvdXRbaWR4KytdID0gKGJ5dGUpbjsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoYnl0ZSluOwogICAgICAgICBicmVhazsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZhcmludDY0b3V0W2lkeCsrXSA9ICgoYnl0ZSkoKG4gJiAweDdGKSB8IDB4ODApKTsKKyAgICAgICAgdGVtcFtpZHgrK10gPSAoKGJ5dGUpKChuICYgMHg3RikgfCAweDgwKSk7CiAgICAgICAgIG4gPj4+PSA3OwogICAgICAgfQogICAgIH0KLSAgICB0cmFuc18ud3JpdGUodmFyaW50NjRvdXQsIDAsIGlkeCk7CisgICAgdHJhbnNfLndyaXRlKHRlbXAsIDAsIGlkeCk7CiAgIH0KIAogICAvKioKLSAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSAKKyAgICogQ29udmVydCBsIGludG8gYSB6aWd6YWcgbG9uZy4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQogICAgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCiAgICAqLwogICBwcml2YXRlIGxvbmcgbG9uZ1RvWmlnemFnKGxvbmcgbCkgewpAQCAtNDE5LDcgKzQ1Myw3IEBACiAgIH0KIAogICAvKioKLSAgICogQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIAorICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgogICAgKi8KICAgcHJpdmF0ZSBpbnQgaW50VG9aaWdaYWcoaW50IG4pIHsKQEAgLTQyNyw3ICs0NjEsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZyAKKyAgICogQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nCiAgICAqIHVudGlsIG9mZis3LgogICAgKi8KICAgcHJpdmF0ZSB2b2lkIGZpeGVkTG9uZ1RvQnl0ZXMobG9uZyBuLCBieXRlW10gYnVmLCBpbnQgb2ZmKSB7CkBAIC00NDEsMTcgKzQ3NSwxNiBAQAogICAgIGJ1ZltvZmYrN10gPSAoYnl0ZSkoKG4gPj4gNTYpICYgMHhmZik7CiAgIH0KIAotICAvKiogCi0gICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLiAKKyAgLyoqCisgICAqIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgogICAgKiBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gd3JpdGUgYSBieXRlLgogICAgKi8KLSAgcHJpdmF0ZSBieXRlW10gYnl0ZURpcmVjdEJ1ZmZlciA9IG5ldyBieXRlWzFdOwogICBwcml2YXRlIHZvaWQgd3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVEaXJlY3RCdWZmZXJbMF0gPSBiOwotICAgIHRyYW5zXy53cml0ZShieXRlRGlyZWN0QnVmZmVyKTsKKyAgICB0ZW1wWzBdID0gYjsKKyAgICB0cmFuc18ud3JpdGUodGVtcCwgMCwgMSk7CiAgIH0KIAotICAvKiogCisgIC8qKgogICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KICAgICovCiAgIHByaXZhdGUgdm9pZCB3cml0ZUJ5dGVEaXJlY3QoaW50IG4pIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQ1OSwxMiArNDkyLDEyIEBACiAgIH0KIAogCi0gIC8vIAorICAvLwogICAvLyBSZWFkaW5nIG1ldGhvZHMuCi0gIC8vIAorICAvLwogCiAgIC8qKgotICAgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuIAorICAgKiBSZWFkIGEgbWVzc2FnZSBoZWFkZXIuCiAgICAqLwogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHByb3RvY29sSWQgPSByZWFkQnl0ZSgpOwpAQCAtNDc2LDcgKzUwOSw3IEBACiAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTikgewogICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgdmVyc2lvbiAiICsgVkVSU0lPTiArICIgYnV0IGdvdCAiICsgdmVyc2lvbik7CiAgICAgfQotICAgIGJ5dGUgdHlwZSA9IChieXRlKSgodmVyc2lvbkFuZFR5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMyk7CisgICAgYnl0ZSB0eXBlID0gKGJ5dGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOwogICAgIGludCBzZXFpZCA9IHJlYWRWYXJpbnQzMigpOwogICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IHJlYWRTdHJpbmcoKTsKICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC00OTMsMTYgKzUyNiwxNiBAQAogICB9CiAKICAgLyoqCi0gICAqIERvZXNuJ3QgYWN0dWFsbHkgY29uc3VtZSBhbnkgd2lyZSBkYXRhLCBqdXN0IHJlbW92ZXMgdGhlIGxhc3QgZmllbGQgZm9yIAorICAgKiBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgogICAgKiB0aGlzIHN0cnVjdCBmcm9tIHRoZSBmaWVsZCBzdGFjay4KICAgICovCiAgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gY29uc3VtZSB0aGUgbGFzdCBmaWVsZCB3ZSByZWFkIG9mZiB0aGUgd2lyZS4KICAgICBsYXN0RmllbGRJZF8gPSBsYXN0RmllbGRfLnBvcCgpOwogICB9Ci0gIAorCiAgIC8qKgotICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4gCisgICAqIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIFRGaWVsZCByZWFkRmllbGRCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBieXRlIHR5cGUgPSByZWFkQnl0ZSgpOwpAQCAtNTMwLDI2ICs1NjMsMjcgQEAKICAgICBpZiAoaXNCb29sVHlwZSh0eXBlKSkgewogICAgICAgLy8gc2F2ZSB0aGUgYm9vbGVhbiB2YWx1ZSBpbiBhIHNwZWNpYWwgaW5zdGFuY2UgdmFyaWFibGUuCiAgICAgICBib29sVmFsdWVfID0gKGJ5dGUpKHR5cGUgJiAweDBmKSA9PSBUeXBlcy5CT09MRUFOX1RSVUUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0gCisgICAgfQogCiAgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcuCiAgICAgbGFzdEZpZWxkSWRfID0gZmllbGQuaWQ7CiAgICAgcmV0dXJuIGZpZWxkOwogICB9CiAKLSAgLyoqIAorICAvKioKICAgICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIHJlYWRpbmcgdGhlIGtleQogICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQogICAgKiAiY29ycmVjdCIgdHlwZXMuCiAgICAqLwogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkVmFyaW50MzIoKTsKKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2l6ZSk7CiAgICAgYnl0ZSBrZXlBbmRWYWx1ZVR5cGUgPSBzaXplID09IDAgPyAwIDogcmVhZEJ5dGUoKTsKICAgICByZXR1cm4gbmV3IFRNYXAoZ2V0VFR5cGUoKGJ5dGUpKGtleUFuZFZhbHVlVHlwZSA+PiA0KSksIGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgJiAweGYpKSwgc2l6ZSk7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGxpc3QgaGVhZGVyIG9mZiB0aGUgd2lyZS4gSWYgdGhlIGxpc3Qgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAorICAgKiBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKICAgICogYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgbGlzdCwgdGhlIDQgTVNCCiAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKICAgICogdHJ1ZSBzaXplLgpAQCAtNTYwLDEyICs1OTQsMTMgQEAKICAgICBpZiAoc2l6ZSA9PSAxNSkgewogICAgICAgc2l6ZSA9IHJlYWRWYXJpbnQzMigpOwogICAgIH0KKyAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2l6ZSk7CiAgICAgYnl0ZSB0eXBlID0gZ2V0VFR5cGUoc2l6ZV9hbmRfdHlwZSk7CiAgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBzaXplKTsKICAgfQogCiAgIC8qKgotICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsIAorICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCiAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCiAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKICAgICogdHJ1ZSBzaXplLgpAQCAtNTg4LDcgKzYyMyw2IEBACiAgICAgcmV0dXJuIHJlYWRCeXRlKCkgPT0gVHlwZXMuQk9PTEVBTl9UUlVFOwogICB9CiAKLSAgYnl0ZVtdIGJ5dGVSYXdCdWYgPSBuZXcgYnl0ZVsxXTsKICAgLyoqCiAgICAqIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KICAgICovCkBAIC01OTgsOCArNjMyLDggQEAKICAgICAgIGIgPSB0cmFuc18uZ2V0QnVmZmVyKClbdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCldOwogICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHRyYW5zXy5yZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOwotICAgICAgYiA9IGJ5dGVSYXdCdWZbMF07CisgICAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCAxKTsKKyAgICAgIGIgPSB0ZW1wWzBdOwogICAgIH0KICAgICByZXR1cm4gYjsKICAgfQpAQCAtNjI5LDkgKzY2Myw4IEBACiAgICAqIE5vIG1hZ2ljIGhlcmUgLSBqdXN0IHJlYWQgYSBkb3VibGUgb2ZmIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIGJ5dGVbXSBsb25nQml0cyA9IG5ldyBieXRlWzhdOwotICAgIHRyYW5zXy5yZWFkQWxsKGxvbmdCaXRzLCAwLCA4KTsKLSAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcobG9uZ0JpdHMpKTsKKyAgICB0cmFuc18ucmVhZEFsbCh0ZW1wLCAwLCA4KTsKKyAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUoYnl0ZXNUb0xvbmcodGVtcCkpOwogICB9CiAKICAgLyoqCkBAIC02MzksMzIgKzY3MiwzNiBAQAogICAgKi8KICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGludCBsZW5ndGggPSByZWFkVmFyaW50MzIoKTsKLSAgICBjaGVja1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKIAogICAgIGlmIChsZW5ndGggPT0gMCkgewogICAgICAgcmV0dXJuICIiOwogICAgIH0KIAotICAgIHRyeSB7Ci0gICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoLCAiVVRGLTgiKTsKLSAgICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgIlVURi04Iik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCEiKTsKKyAgICBmaW5hbCBTdHJpbmcgc3RyOworICAgIGlmICh0cmFuc18uZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpID49IGxlbmd0aCkgeworICAgICAgc3RyID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLAorICAgICAgICAgIGxlbmd0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0cmFuc18uY29uc3VtZUJ1ZmZlcihsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICBzdHIgPSBuZXcgU3RyaW5nKHJlYWRCaW5hcnkobGVuZ3RoKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgfQorICAgIHJldHVybiBzdHI7CiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLiAKKyAgICogUmVhZCBhIGJ5dGVbXSBmcm9tIHRoZSB3aXJlLgogICAgKi8KICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgbGVuZ3RoID0gcmVhZFZhcmludDMyKCk7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKGxlbmd0aCk7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKTsKKyAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgobGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CVUZGRVI7CisKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgbGVuZ3RoKTsKKyAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7CisgICAgICByZXR1cm4gYmI7CisgICAgfQogCiAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CiAgICAgdHJhbnNfLnJlYWRBbGwoYnVmLCAwLCBsZW5ndGgpOwpAQCAtNjcyLDI3ICs3MDksNDAgQEAKICAgfQogCiAgIC8qKgotICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuIAorICAgKiBSZWFkIGEgYnl0ZVtdIG9mIGEga25vd24gbGVuZ3RoIGZyb20gdGhlIHdpcmUuCiAgICAqLwogICBwcml2YXRlIGJ5dGVbXSByZWFkQmluYXJ5KGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBFTVBUWV9CWVRFUzsKIAogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtsZW5ndGhdOwogICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgbGVuZ3RoKTsKICAgICByZXR1cm4gYnVmOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3RyaW5nUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKICAgICBpZiAobGVuZ3RoIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTmVnYXRpdmUgbGVuZ3RoOiAiICsgbGVuZ3RoKTsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBsZW5ndGg6ICIgKyBsZW5ndGgpOwogICAgIH0KLSAgICBpZiAobWF4TmV0d29ya0J5dGVzXyAhPSAtMSAmJiBsZW5ndGggPiBtYXhOZXR3b3JrQnl0ZXNfKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJMZW5ndGggZXhjZWVkZWQgbWF4IGFsbG93ZWQ6ICIgKyBsZW5ndGgpOworICAgIGlmIChzdHJpbmdMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IHN0cmluZ0xlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChpbnQgbGVuZ3RoKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKKyAgICBpZiAobGVuZ3RoIDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIGxlbmd0aDogIiArIGxlbmd0aCk7CisgICAgfQorICAgIGlmIChjb250YWluZXJMZW5ndGhMaW1pdF8gIT0gTk9fTEVOR1RIX0xJTUlUICYmIGxlbmd0aCA+IGNvbnRhaW5lckxlbmd0aExpbWl0XykgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uU0laRV9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlbmd0aCBleGNlZWRlZCBtYXggYWxsb3dlZDogIiArIGxlbmd0aCk7CiAgICAgfQogICB9CiAKICAgLy8KLSAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZSAKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgaGVyZSBmb3IgdGhlIHN0cnVjdCB0byBjYWxsLCBidXQgZG9uJ3QgaGF2ZSBhbnkgd2lyZQogICAvLyBlbmNvZGluZy4KICAgLy8KICAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQpAQCAtNzM2LDcgKzc4Niw3IEBACiAgIH0KIAogICAvKioKLSAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldCAKKyAgICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAogICAgKiBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiByZWFkIHVwIHRvIDEwIGJ5dGVzLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHJlYWRWYXJpbnQ2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTc3Niw3ICs4MjYsNyBAQAogICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKICAgfQogCi0gIC8qKiAKKyAgLyoqCiAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgogICAgKi8KICAgcHJpdmF0ZSBsb25nIHppZ3phZ1RvTG9uZyhsb25nIG4pIHsKQEAgLTc4NCw3ICs4MzQsNyBAQAogICB9CiAKICAgLyoqCi0gICAqIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLCAKKyAgICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCiAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCiAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCiAgICAqLwpAQCAtODEwLDcgKzg2MCw3IEBACiAgIH0KIAogICAvKioKLSAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIAorICAgKiBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcKICAgICogVFR5cGUgdmFsdWUuCiAgICAqLwogICBwcml2YXRlIGJ5dGUgZ2V0VFR5cGUoYnl0ZSB0eXBlKSB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9URmllbGQuamF2YQppbmRleCAwM2FmZmRhLi4zMTMzMWJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEZpZWxkLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RGaWVsZC5qYXZhCkBAIC00Miw3ICs0MiwyNSBAQAogICAgIHJldHVybiAiPFRGaWVsZCBuYW1lOiciICsgbmFtZSArICInIHR5cGU6IiArIHR5cGUgKyAiIGZpZWxkLWlkOiIgKyBpZCArICI+IjsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhURmllbGQgb3RoZXJGaWVsZCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICBpbnQgcmVzdWx0ID0gMTsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIGlkOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB0eXBlOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgVEZpZWxkIG90aGVyRmllbGQgPSAoVEZpZWxkKSBvYmo7CiAgICAgcmV0dXJuIHR5cGUgPT0gb3RoZXJGaWVsZC50eXBlICYmIGlkID09IG90aGVyRmllbGQuaWQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCmluZGV4IGYwN2E0YTcuLmQzN2M0OTMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTQyLDkgKzQ0LDE2IEBACiAgICAqIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cwogICAgKi8KICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCisgICAgcHVibGljIEZhY3RvcnkoKSB7fQorCisgICAgcHVibGljIEZhY3RvcnkoYm9vbGVhbiBmaWVsZE5hbWVzQXNTdHJpbmcpIHsKKyAgICAgIGZpZWxkTmFtZXNBc1N0cmluZ18gPSBmaWVsZE5hbWVzQXNTdHJpbmc7CisgICAgfQogCiAgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zLCBmaWVsZE5hbWVzQXNTdHJpbmdfKTsKICAgICB9CiAKICAgfQpAQCAtNzAsMTAgKzc5LDEwIEBACiAgICAgMSwgIDEsJyInLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgLy8gMgogICB9OwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVfQ0hBUlMgPSAiXCJcXGJmbnJ0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRV9DSEFSUyA9ICJcIlxcL2JmbnJ0IjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRVNDQVBFX0NIQVJfVkFMUyA9IHsKLSAgICAnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCisgICAgJyInLCAnXFwnLCAnLycsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsCiAgIH07CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50ICBERUZfU1RSSU5HX1NJWkUgPSAxNjsKQEAgLTI4NSw2ICsyOTQsOSBAQAogICAvLyBSZWFkZXIgdGhhdCBtYW5hZ2VzIGEgMS1ieXRlIGJ1ZmZlcgogICBwcml2YXRlIExvb2thaGVhZFJlYWRlciByZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigpOwogCisgIC8vIFdyaXRlIG91dCB0aGUgVEZpZWxkIG5hbWVzIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgaW50ZWdlciB2YWx1ZQorICBwcml2YXRlIGJvb2xlYW4gZmllbGROYW1lc0FzU3RyaW5nXyA9IGZhbHNlOworCiAgIC8vIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgogICBwcml2YXRlIHZvaWQgcHVzaENvbnRleHQoSlNPTkJhc2VDb250ZXh0IGMpIHsKICAgICBjb250ZXh0U3RhY2tfLnB1c2goY29udGV4dF8pOwpAQCAtMjk2LDYgKzMwOCwxMyBAQAogICAgIGNvbnRleHRfID0gY29udGV4dFN0YWNrXy5wb3AoKTsKICAgfQogCisgIC8vIFJlc2V0IHRoZSBjb250ZXh0IHN0YWNrIHRvIGl0cyBpbml0aWFsIHN0YXRlCisgIHByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7CisgICAgd2hpbGUgKCFjb250ZXh0U3RhY2tfLmlzRW1wdHkoKSkgeworICAgICAgcG9wQ29udGV4dCgpOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KQEAgLTMwMyw2ICszMjIsMTEgQEAKICAgICBzdXBlcih0cmFucyk7CiAgIH0KIAorICBwdWJsaWMgVEpTT05Qcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zLCBib29sZWFuIGZpZWxkTmFtZXNBc1N0cmluZykgeworICAgIHN1cGVyKHRyYW5zKTsKKyAgICBmaWVsZE5hbWVzQXNTdHJpbmdfID0gZmllbGROYW1lc0FzU3RyaW5nOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgIGNvbnRleHRTdGFja18uY2xlYXIoKTsKQEAgLTM5NCwxMiArNDE4LDggQEAKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShidWYpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYnVmKTsKICAgICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOwogICAgIH0KQEAgLTQyMSwxOCArNDQxLDE2IEBACiAgICAgICAgIHNwZWNpYWwgPSB0cnVlOwogICAgICAgfQogICAgICAgYnJlYWs7Ci0gICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQogCiAgICAgYm9vbGVhbiBlc2NhcGVOdW0gPSBzcGVjaWFsIHx8IGNvbnRleHRfLmVzY2FwZU51bSgpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNDg0LDE0ICs1MDIsMTEgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOwotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKICAgfQpAQCAtNTEzLDcgKzUyOCwxMSBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVKU09OSW50ZWdlcihmaWVsZC5pZCk7CisgICAgaWYgKGZpZWxkTmFtZXNBc1N0cmluZ18pIHsKKyAgICAgIHdyaXRlU3RyaW5nKGZpZWxkLm5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUpTT05JbnRlZ2VyKGZpZWxkLmlkKTsKKyAgICB9CiAgICAgd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKICAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoZmllbGQudHlwZSkpOwogICB9CkBAIC01OTcsMTIgKzYxNiw4IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICB3cml0ZUpTT05TdHJpbmcoYik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUpTT05TdHJpbmcoYik7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTYxOSw2ICs2MzQsNyBAQAogICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVhZEpTT05TdHJpbmcoYm9vbGVhbiBza2lwQ29udGV4dCkKICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbShERUZfU1RSSU5HX1NJWkUpOworICAgIEFycmF5TGlzdDxDaGFyYWN0ZXI+IGNvZGV1bml0cyA9IG5ldyBBcnJheUxpc3Q8Q2hhcmFjdGVyPigpOwogICAgIGlmICghc2tpcENvbnRleHQpIHsKICAgICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICB9CkBAIC02MzEsMTAgKzY0Nyw0MSBAQAogICAgICAgaWYgKGNoID09IEVTQ1NFUVswXSkgewogICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOwogICAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzFdKSB7Ci0gICAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKFpFUk8pOwotICAgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihaRVJPKTsKLSAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCAyKTsKLSAgICAgICAgICBjaCA9IChieXRlKSgoaGV4VmFsKChieXRlKXRtcGJ1Zl9bMF0pIDw8IDQpICsgaGV4VmFsKHRtcGJ1Zl9bMV0pKTsKKyAgICAgICAgICB0cmFuc18ucmVhZEFsbCh0bXBidWZfLCAwLCA0KTsKKyAgICAgICAgICBzaG9ydCBjdSA9IChzaG9ydCkoCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMF0pIDw8IDEyKSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgKChzaG9ydCloZXhWYWwodG1wYnVmX1syXSkgPDwgNCkgKworICAgICAgICAgICAgICAoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bM10pKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0hpZ2hTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChjb2RldW5pdHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvZGV1bml0cy5hZGQoKGNoYXIpY3UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoQ2hhcmFjdGVyLmlzTG93U3Vycm9nYXRlKChjaGFyKWN1KSkgeworICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY29kZXVuaXRzLmFkZCgoY2hhciljdSk7CisgICAgICAgICAgICAgIGFyci53cml0ZSgKKyAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGNvZGV1bml0cy5nZXQoMCksIGNvZGV1bml0cy5nZXQoMSkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyKSkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBhcnIud3JpdGUoKG5ldyBTdHJpbmcobmV3IGludFtdIHsgY3UgfSwgMCwgMSkpCisgICAgICAgICAgICAgICAgICAuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB1bmljb2RlIHNlcXVlbmNlIik7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgIGludCBvZmYgPSBFU0NBUEVfQ0hBUlMuaW5kZXhPZihjaCk7CkBAIC03MTIsMTkgKzc1OSwxNCBAQAogICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKICAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICB0cnkgewotICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKTsKLSAgICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikgJiYKLSAgICAgICAgICAgICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7Ci0gICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikKKyAgICAgICAgICAmJiAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgeworICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CiAgICAgICB9Ci0gICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICAgIH0KKyAgICAgIHJldHVybiBkdWI7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CkBAIC03NDgsNiArNzkwLDExIEBACiAgICAgaW50IGxlbiA9IGFyci5sZW4oKTsKICAgICBpbnQgb2ZmID0gMDsKICAgICBpbnQgc2l6ZSA9IDA7CisgICAgLy8gSWdub3JlIHBhZGRpbmcKKyAgICBpbnQgYm91bmQgPSBsZW4gPj0gMiA/IGxlbiAtIDIgOiAwOworICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKKyAgICAgIC0tbGVuOworICAgIH0KICAgICB3aGlsZSAobGVuID49IDQpIHsKICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQogICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIDQsIGIsIHNpemUpOyAvLyBOQjogZGVjb2RlZCBpbiBwbGFjZQpAQCAtNzkyLDE4ICs4MzksMTMgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRDb250ZXh0KCk7IC8vIFRIUklGVC0zNzQzCiAgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CiAgICAgaWYgKHJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT04pIHsKICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CiAgICAgfQotICAgIFN0cmluZyBuYW1lOwotICAgIHRyeSB7Ci0gICAgICBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIFN0cmluZyBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIGJ5dGUgdHlwZSA9IChieXRlKSByZWFkSlNPTkludGVnZXIoKTsKICAgICBpbnQgc2VxaWQgPSAoaW50KSByZWFkSlNPTkludGVnZXIoKTsKICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG5hbWUsIHR5cGUsIHNlcWlkKTsKQEAgLTkyMCwxMiArOTYyLDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOwotICAgIH0KLSAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIHJldHVybiByZWFkSlNPTlN0cmluZyhmYWxzZSkudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UTWVzc2FnZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEKaW5kZXggMTQzOGIxMS4uZjEzYjhjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNZXNzYWdlLmphdmEKQEAgLTQ0LDE0ICs0NCwzMyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLSAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBUTWVzc2FnZSkgewotICAgICAgcmV0dXJuIGVxdWFscygoVE1lc3NhZ2UpIG90aGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIGZpbmFsIGludCBwcmltZSA9IDMxOworICAgIGludCByZXN1bHQgPSAxOworICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBzZXFpZDsKKyAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHR5cGU7CisgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhUTWVzc2FnZSBvdGhlcikgewotICAgIHJldHVybiBuYW1lLmVxdWFscyhvdGhlci5uYW1lKSAmJiB0eXBlID09IG90aGVyLnR5cGUgJiYgc2VxaWQgPT0gb3RoZXIuc2VxaWQ7CisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgIGlmICh0aGlzID09IG9iaikKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChvYmogPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBUTWVzc2FnZSBvdGhlciA9IChUTWVzc2FnZSkgb2JqOworICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5uYW1lICE9IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhvdGhlci5uYW1lKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc2VxaWQgIT0gb3RoZXIuc2VxaWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWE1NjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworLyoqCisgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKKyAqIHRoYXQgYWxsb3dzIGEgVGhyaWZ0IGNsaWVudCB0byBjb21tdW5pY2F0ZSB3aXRoIGEgbXVsdGlwbGV4aW5nIFRocmlmdCBzZXJ2ZXIsCisgKiBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICoKKyAqIDxwPk5PVEU6IFRISVMgSVMgTk9UIFVTRUQgQlkgU0VSVkVSUy4gIE9uIHRoZSBzZXJ2ZXIsIHVzZSB7QGxpbmsgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yIFRNdWx0aXBsZXhlZFByb2Nlc3Nvcn0gdG8gaGFuZGxlIHJlcXVlc3RzCisgKiBmcm9tIGEgbXVsdGlwbGV4aW5nIGNsaWVudC4KKyAqCisgKiA8cD5UaGlzIGV4YW1wbGUgdXNlcyBhIHNpbmdsZSBzb2NrZXQgdHJhbnNwb3J0IHRvIGludm9rZSB0d28gc2VydmljZXM6CisgKgorICogPHByZT4KKyAqIHtAY29kZQorICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICogICAgIHRyYW5zcG9ydC5vcGVuKCk7CisgKgorICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAqCisgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJDYWxjdWxhdG9yIik7CisgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgKgorICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wMiA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIldlYXRoZXJSZXBvcnQiKTsKKyAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICoKKyAqICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc2VydmljZS5hZGQoMiwyKSk7CisgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICogfQorICogPC9wcmU+CisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xEZWNvcmF0b3IKKyAqLworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yIHsKKworICAgIC8qKiBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIjoiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VSVklDRV9OQU1FOworCisgICAgLyoqCisgICAgICogV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICogcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlIGhlYWRlciBzbyB0aGF0IHRoZSBtdWx0aXBsZXhpbmcgc2VydmVyIGNhbiBicm9rZXIKKyAgICAgKiB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2wgWW91ciBjb21tdW5pY2F0aW9uIHByb3RvY29sIG9mIGNob2ljZSwgZS5nLiA8Y29kZT5UQmluYXJ5UHJvdG9jb2w8L2NvZGU+LgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgc2VydmljZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGNvbW11bmljYXRpbmcgdmlhIHRoaXMgcHJvdG9jb2wuCisgICAgICovCisgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7CisgICAgICAgIHN1cGVyKHByb3RvY29sKTsKKyAgICAgICAgU0VSVklDRV9OQU1FID0gc2VydmljZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0TWVzc2FnZSBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gUGFzc2VkIHRocm91Z2ggZnJvbSB3cmFwcGVkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgdE1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRNZXNzYWdlLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgfHwgdE1lc3NhZ2UudHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgICAgICBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfTkFNRSArIFNFUEFSQVRPUiArIHRNZXNzYWdlLm5hbWUsCisgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIHRNZXNzYWdlLnNlcWlkCisgICAgICAgICAgICApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLndyaXRlTWVzc2FnZUJlZ2luKHRNZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI5Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5qYXZhCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZAorICogPGNvZGU+VFByb3RvY29sPC9jb2RlPiBpbnN0YW5jZSwgcHJvdmlkaW5nIGEgd2F5IHRvIGF1dGhvciBjb25jaXNlCisgKiBjb25jcmV0ZSBkZWNvcmF0b3Igc3ViY2xhc3Nlcy4gIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAorICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQorICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KKyAqCisgKiA8cD5TZWUgcC4xNzUgb2YgRGVzaWduIFBhdHRlcm5zIChieSBHYW1tYSBldCBhbC4pPC9wPgorICogCisgKiBAc2VlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgZXh0ZW5kcyBUUHJvdG9jb2wgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUUHJvdG9jb2wgY29uY3JldGVQcm90b2NvbDsKKworICAgIC8qKgorICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yKFRQcm90b2NvbCBwcm90b2NvbCkgeworICAgICAgICBzdXBlcihwcm90b2NvbC5nZXRUcmFuc3BvcnQoKSk7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSB0TWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKHRNZXNzYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHRTdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKHRTdHJ1Y3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCB0RmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkQmVnaW4odEZpZWxkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTWFwQmVnaW4oVE1hcCB0TWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVNYXBCZWdpbih0TWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEJlZ2luKFRMaXN0IHRMaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0QmVnaW4odExpc3QpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgdFNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0QmVnaW4odFNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVCb29sKGIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZUJ5dGUoYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlSTE2KGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlSTMyKGludCBpKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVJMzIoaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBsKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVJNjQobCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIHYpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC53cml0ZURvdWJsZSh2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLndyaXRlU3RyaW5nKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYnVmKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wud3JpdGVCaW5hcnkoYnVmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBjb25jcmV0ZVByb3RvY29sLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZE1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkTGlzdEJlZ2luKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRTZXRCZWdpbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmNyZXRlUHJvdG9jb2wucmVhZFNldEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkQm9vbCgpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkQnl0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkSTE2KCk7CisgICAgfQorCisgICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY29uY3JldGVQcm90b2NvbC5yZWFkSTMyKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZEk2NCgpOworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZERvdWJsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnJlYWRCaW5hcnkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmphdmEKaW5kZXggMjQ4ODE1Yi4uODcwZjFiOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uamF2YQpAQCAtMzUsNiArMzUsNyBAQAogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSVpFX0xJTUlUID0gMzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFEX1ZFUlNJT04gPSA0OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfSU1QTEVNRU5URUQgPSA1OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVBUSF9MSU1JVCA9IDY7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCmluZGV4IDc1MjUyMGEuLmNkYWEzMGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQpAQCAtMTQxLDcgKzE0MSw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIHR5cGUgIiArIHR5cGUpOwogICAgIH0KICAgfQogCkBAIC0xNTIsNyArMTUzLDcgQEAKICAgICogSW4gc29tZSBjYXNlcywgbm8gZ3Vlc3MgY2FuIGJlIGRvbmUsIGluIHRoYXQgY2FzZSB3ZSByZXR1cm4gdGhlCiAgICAqIGZhbGxiYWNrIFRQcm90b2NvbEZhY3RvcnkuCiAgICAqIFRvIGJlIGNlcnRhaW4gdG8gY29ycmVjdGx5IGRldGVjdCB0aGUgcHJvdG9jb2wsIHRoZSBmaXJzdCBlbmNvZGVkCi0gICAqIGZpZWxkIHNob3VsZCBoYXZlIGEgZmllbGQgaWQgPCAyNTYKKyAgICogZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCAmbHQ7IDI1NgogICAgKgogICAgKiBAcGFyYW0gZGF0YSBUaGUgc2VyaWFsaXplZCBkYXRhIHRvIGd1ZXNzIHRoZSBwcm90b2NvbCBmb3IuCiAgICAqIEBwYXJhbSBmYWxsYmFjayBUaGUgVFByb3RvY29sIHRvIHJldHVybiBpZiBubyBndWVzcyBjYW4gYmUgbWFkZS4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCmluZGV4IDMzY2FkMjQuLmViN2UyM2IgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC00NSwxMyArNDUsMTMgQEAKICAgICB9CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT01NQSA9IG5ldyBieXRlW10geycsJ307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7JzonfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNFID0gbmV3IGJ5dGVbXSB7J3snfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNFID0gbmV3IGJ5dGVbXSB7J30nfTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnWyd9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBSQlJBQ0tFVCA9IG5ldyBieXRlW10geyddJ307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBRVU9URSA9ICciJzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTU1BID0gbmV3IGJ5dGVbXSB7JywnfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENPTE9OID0gbmV3IGJ5dGVbXSB7JzonfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIExCUkFDRSA9IG5ldyBieXRlW10geyd7J307CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBSQlJBQ0UgPSBuZXcgYnl0ZVtdIHsnfSd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gTEJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnWyd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gUkJSQUNLRVQgPSBuZXcgYnl0ZVtdIHsnXSd9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJyInOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRTdHJ1Y3QgQU5PTllNT1VTX1NUUlVDVCA9IG5ldyBUU3RydWN0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRGaWVsZCBBTk9OWU1PVVNfRklFTEQgPSBuZXcgVEZpZWxkKCk7CkBAIC01OSw5ICs1OSwxNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUU2V0IEVNUFRZX1NFVCA9IG5ldyBUU2V0KCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRMaXN0IEVNUFRZX0xJU1QgPSBuZXcgVExpc3QoKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVE1hcCBFTVBUWV9NQVAgPSBuZXcgVE1hcCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVCA9ICJsaXN0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVCA9ICJzZXQiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQID0gIm1hcCI7CiAKICAgcHJvdGVjdGVkIGNsYXNzIENvbnRleHQgewogICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGtleSBpbiBhIG1hcAorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzTWFwS2V5KCkgeyByZXR1cm4gIGZhbHNlOyB9CiAgIH0KIAogICBwcm90ZWN0ZWQgY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0IHsKQEAgLTkxLDYgKzk5LDIyIEBACiAgICAgfQogICB9CiAKKyAgcHJvdGVjdGVkIGNsYXNzIE1hcENvbnRleHQgZXh0ZW5kcyBTdHJ1Y3RDb250ZXh0IHsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleSA9IHRydWU7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHN1cGVyLndyaXRlKCk7CisgICAgICBpc0tleSA9ICFpc0tleTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc01hcEtleSgpIHsKKyAgICAgIC8vIHdlIHdhbnQgdG8gY29lcmNlIG1hcCBrZXlzIHRvIGpzb24gc3RyaW5ncyByZWdhcmRsZXNzCisgICAgICAvLyBvZiB0aGVpciB0eXBlCisgICAgICByZXR1cm4gaXNLZXk7CisgICAgfQorICB9CisKICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgQkFTRV9DT05URVhUID0gbmV3IENvbnRleHQoKTsKIAogICAvKioKQEAgLTExOSwxMyArMTQzLDMzIEBACiAgIH0KIAogICAvKioKKyAgICogUmVzZXQgdGhlIHdyaXRlIGNvbnRleHQgc3RhY2sgdG8gaXRzIGluaXRpYWwgc3RhdGUuCisgICAqLworICBwcm90ZWN0ZWQgdm9pZCByZXNldFdyaXRlQ29udGV4dCgpIHsKKyAgICB3aGlsZSAoIXdyaXRlQ29udGV4dFN0YWNrXy5pc0VtcHR5KCkpIHsKKyAgICAgIHBvcFdyaXRlQ29udGV4dCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBVc2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZW5jb3VudGVyaW5nIGEgbWFwIHdob3NlIGtleXMgYXJlIGNvbnRhaW5lcnMKKyAgICovCisgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTdHJpbmcgaW52YWxpZEtleVR5cGUpIHRocm93cyBDb2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uIHsKKyAgICBpZiAod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CisgICAgICB0aHJvdyBuZXcgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbigiQ2Fubm90IHNlcmlhbGl6ZSBhIG1hcCB3aXRoIGtleXMgdGhhdCBhcmUgb2YgdHlwZSAiICsgaW52YWxpZEtleVR5cGUpOworICAgIH0KKyAgfQorCisgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgogICAgKi8KICAgcHVibGljIFRTaW1wbGVKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykgewogICAgIHN1cGVyKHRyYW5zKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVzZXRXcml0ZUNvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCkpOwogICAgIHdyaXRlU3RyaW5nKG1lc3NhZ2UubmFtZSk7CkBAIC0xMzMsMTAzICsxNzcsMTMzIEBACiAgICAgd3JpdGVJMzIobWVzc2FnZS5zZXFpZCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0UpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRCZWdpbihURmllbGQgZmllbGQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBOb3RlIHRoYXQgZXh0cmEgdHlwZSBpbmZvcm1hdGlvbiBpcyBvbWl0dGVkIGluIEpTT04hCiAgICAgd3JpdGVTdHJpbmcoZmllbGQubmFtZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShNQVApOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICB0cmFuc18ud3JpdGUoTEJSQUNFKTsKLSAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCkpOworICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IE1hcENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShMSVNUKTsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKICAgICBwdXNoV3JpdGVDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgpKTsKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVNldEJlZ2luKFRTZXQgc2V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KFNFVCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0tFVCk7CiAgICAgcHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoKSk7CiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGIpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGkxNik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewotICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKLSAgICBfd3JpdGVTdHJpbmdEYXRhKEludGVnZXIudG9TdHJpbmcoaTMyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBfd3JpdGVTdHJpbmdEYXRhKFN0cmluZyBzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgaWYod3JpdGVDb250ZXh0Xy5pc01hcEtleSgpKSB7CisgICAgICB3cml0ZVN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGkzMikpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CisgICAgICBfd3JpdGVTdHJpbmdEYXRhKEludGVnZXIudG9TdHJpbmcoaTMyKSk7CiAgICAgfQogICB9CiAKKyAgcHVibGljIHZvaWQgX3dyaXRlU3RyaW5nRGF0YShTdHJpbmcgcykgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYik7CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7Ci0gICAgX3dyaXRlU3RyaW5nRGF0YShMb25nLnRvU3RyaW5nKGk2NCkpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoTG9uZy50b1N0cmluZyhpNjQpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOworICAgICAgX3dyaXRlU3RyaW5nRGF0YShMb25nLnRvU3RyaW5nKGk2NCkpOworICAgIH0KICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZURvdWJsZShkb3VibGUgZHViKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwotICAgIF93cml0ZVN0cmluZ0RhdGEoRG91YmxlLnRvU3RyaW5nKGR1YikpOworICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgeworICAgICAgd3JpdGVTdHJpbmcoRG91YmxlLnRvU3RyaW5nKGR1YikpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CisgICAgICBfd3JpdGVTdHJpbmdEYXRhKERvdWJsZS50b1N0cmluZyhkdWIpKTsKKyAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKICAgICBpbnQgbGVuZ3RoID0gc3RyLmxlbmd0aCgpOwpAQCAtMjgzLDkwICszNTcsMTA4IEBACiAgICAgX3dyaXRlU3RyaW5nRGF0YShlc2NhcGUudG9TdHJpbmcoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoQnl0ZUJ1ZmZlciBiaW4pIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcwotICAgICAgd3JpdGVTdHJpbmcobmV3IFN0cmluZyhiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwgYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKSAtIGJpbi5hcnJheU9mZnNldCgpLCAiVVRGLTgiKSk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICAvLyBUT0RPKG1jc2xlZSk6IEZpeCB0aGlzCisgICAgd3JpdGVTdHJpbmcobmV3IFN0cmluZyhiaW4uYXJyYXkoKSwgYmluLnBvc2l0aW9uKCkgKyBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKSAtIGJpbi5hcnJheU9mZnNldCgpLAorICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAgIH0KIAogICAvKioKICAgICogUmVhZGluZyBtZXRob2RzLgogICAgKi8KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRNZXNzYWdlIHJlYWRNZXNzYWdlQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUVTU0FHRTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAotICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgVFN0cnVjdCByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gQU5PTllNT1VTX0ZJRUxEOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZEZpZWxkRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWFwIHJlYWRNYXBCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9NQVA7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVExpc3QgcmVhZExpc3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiBFTVBUWV9MSVNUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVFNldCByZWFkU2V0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfU0VUOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gcmVhZEJvb2woKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIChyZWFkQnl0ZSgpID09IDEpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWRJMzIoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gMDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuICIiOwpAQCAtMzc3LDkgKzQ2OSwxNSBAQAogICAgIHJldHVybiAiIjsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVswXSk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCmluZGV4IGU1ZTI2YjIuLjhjMjA2ZTQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0xOSwxNSArMTksNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKLQoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwpAQCAtNDEsNiArMzMsMTUgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCiAvKioKICAqIFByb3ZpZGVzIGNvbW1vbiBtZXRob2RzIGFuZCBjbGFzc2VzIHVzZWQgYnkgbm9uYmxvY2tpbmcgVFNlcnZlcgogICogaW1wbGVtZW50YXRpb25zLgpAQCAtNDksNyArNTAsNyBAQAogICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKIAogICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPFQgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxUPj4gZXh0ZW5kcyBBYnN0cmFjdFNlcnZlckFyZ3M8VD4gewotICAgIHB1YmxpYyBsb25nIG1heFJlYWRCdWZmZXJCeXRlcyA9IExvbmcuTUFYX1ZBTFVFOworICAgIHB1YmxpYyBsb25nIG1heFJlYWRCdWZmZXJCeXRlcyA9IDI1NiAqIDEwMjQgKiAxMDI0OwogCiAgICAgcHVibGljIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKICAgICAgIHN1cGVyKHRyYW5zcG9ydCk7CkBAIC02MiwxMiArNjMsMTIgQEAKICAgICogdGltZS4gV2l0aG91dCB0aGlzIGxpbWl0LCB0aGUgc2VydmVyIHdpbGwgZ2xhZGx5IGFsbG9jYXRlIGNsaWVudCBidWZmZXJzCiAgICAqIHJpZ2h0IGludG8gYW4gb3V0IG9mIG1lbW9yeSBleGNlcHRpb24sIHJhdGhlciB0aGFuIHdhaXRpbmcuCiAgICAqLwotICBwcml2YXRlIGZpbmFsIGxvbmcgTUFYX1JFQURfQlVGRkVSX0JZVEVTOworICBmaW5hbCBsb25nIE1BWF9SRUFEX0JVRkZFUl9CWVRFUzsKIAogICAvKioKICAgICogSG93IG1hbnkgYnl0ZXMgYXJlIGN1cnJlbnRseSBhbGxvY2F0ZWQgdG8gcmVhZCBidWZmZXJzLgogICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCA9IG5ldyBBdG9taWNMb25nKDApOworICBmaW5hbCBBdG9taWNMb25nIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZCA9IG5ldyBBdG9taWNMb25nKDApOwogCiAgIHB1YmxpYyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyKEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzIGFyZ3MpIHsKICAgICBzdXBlcihhcmdzKTsKQEAgLTEwMSw3ICsxMDIsNyBAQAogCiAgIC8qKgogICAgKiBTdGFydHMgYW55IHRocmVhZHMgcmVxdWlyZWQgZm9yIHNlcnZpbmcuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB0aHJlYWRzIGNvdWxkIG5vdCBiZSBzdGFydGVkLgogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRUaHJlYWRzKCk7CkBAIC0xMTQsNyArMTE1LDcgQEAKIAogICAvKioKICAgICogSGF2ZSB0aGUgc2VydmVyIHRyYW5zcG9ydCBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc3RhcnRlZCBsaXN0ZW5pbmcgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBzb21ldGhpbmcgd2VudAogICAgKiAgICAgICAgIHdyb25nLgogICAgKi8KQEAgLTEzOCw3ICsxMzksNyBAQAogICAvKioKICAgICogUGVyZm9ybSBhbiBpbnZvY2F0aW9uLiBUaGlzIG1ldGhvZCBjb3VsZCBiZWhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyAtCiAgICAqIGludm9rZSBpbW1lZGlhdGVseSBpbmxpbmUsIHF1ZXVlIGZvciBzZXBhcmF0ZSBleGVjdXRpb24sIGV0Yy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnZvY2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkLCB3aGljaCBpcyBub3QgYQogICAgKiAgICAgICAgIGd1YXJhbnRlZSB0aGF0IGludm9jYXRpb24gaGFzIGNvbXBsZXRlZC4gRmFsc2UgaWYgdGhlIHJlcXVlc3QKICAgICogICAgICAgICBmYWlsZWQuCkBAIC0xNTEsNyArMTUyLDcgQEAKICAgICogY29ycmVzcG9uZGluZyB0byByZXF1ZXN0cy4KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworICAgIHByb3RlY3RlZCBTZWxlY3RvciBzZWxlY3RvcjsKIAogICAgIC8vIExpc3Qgb2YgRnJhbWVCdWZmZXJzIHRoYXQgd2FudCB0byBjaGFuZ2UgdGhlaXIgc2VsZWN0aW9uIGludGVyZXN0cy4KICAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PEZyYW1lQnVmZmVyPiBzZWxlY3RJbnRlcmVzdENoYW5nZXMgPSBuZXcgSGFzaFNldDxGcmFtZUJ1ZmZlcj4oKTsKQEAgLTI2NSwyMyArMjY2LDQyIEBACiAgICAqIHJlc3BvbnNlIGRhdGEgYmFjayB0byB0aGUgY2xpZW50LiBJbiB0aGUgcHJvY2VzcyBpdCBtYW5hZ2VzIGZsaXBwaW5nIHRoZQogICAgKiByZWFkIGFuZCB3cml0ZSBiaXRzIG9uIHRoZSBzZWxlY3Rpb24ga2V5IGZvciBpdHMgY2xpZW50LgogICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIEZyYW1lQnVmZmVyIHsKKyAgIHB1YmxpYyBjbGFzcyBGcmFtZUJ1ZmZlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworCiAgICAgLy8gdGhlIGFjdHVhbCB0cmFuc3BvcnQgaG9va2VkIHVwIHRvIHRoZSBjbGllbnQuCi0gICAgcHVibGljIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc187CisgICAgcHJvdGVjdGVkIGZpbmFsIFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc187CiAKICAgICAvLyB0aGUgU2VsZWN0aW9uS2V5IHRoYXQgY29ycmVzcG9uZHMgdG8gb3VyIHRyYW5zcG9ydAotICAgIHByaXZhdGUgZmluYWwgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleV87CisgICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXlfOwogCiAgICAgLy8gdGhlIFNlbGVjdFRocmVhZCB0aGF0IG93bnMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBvdXIgdHJhbnNwb3J0Ci0gICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWRfOworICAgIHByb3RlY3RlZCBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWRfOwogCiAgICAgLy8gd2hlcmUgaW4gdGhlIHByb2Nlc3Mgb2YgcmVhZGluZy93cml0aW5nIGFyZSB3ZT8KLSAgICBwcml2YXRlIEZyYW1lQnVmZmVyU3RhdGUgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FX1NJWkU7CisgICAgcHJvdGVjdGVkIEZyYW1lQnVmZmVyU3RhdGUgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FX1NJWkU7CiAKICAgICAvLyB0aGUgQnl0ZUJ1ZmZlciB3ZSdsbCBiZSB1c2luZyB0byB3cml0ZSBhbmQgcmVhZCwgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZQotICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBidWZmZXJfOworICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGJ1ZmZlcl87CiAKLSAgICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzcG9uc2VfOworICAgIHByb3RlY3RlZCBmaW5hbCBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3BvbnNlXzsKKworICAgIC8vIHRoZSBmcmFtZSB0aGF0IHRoZSBUVHJhbnNwb3J0IHNob3VsZCB3cmFwLgorICAgIHByb3RlY3RlZCBmaW5hbCBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgZnJhbWVUcmFuc187CisKKyAgICAvLyB0aGUgdHJhbnNwb3J0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY29ubmVjdCB0byBjbGllbnRzCisgICAgcHJvdGVjdGVkIGZpbmFsIFRUcmFuc3BvcnQgaW5UcmFuc187CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBvdXRUcmFuc187CisKKyAgICAvLyB0aGUgaW5wdXQgcHJvdG9jb2wgdG8gdXNlIG9uIGZyYW1lcworICAgIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2wgaW5Qcm90XzsKKworICAgIC8vIHRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gdXNlIG9uIGZyYW1lcworICAgIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2wgb3V0UHJvdF87CisKKyAgICAvLyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2VydmVyQ29udGV4dCBjb250ZXh0XzsKIAogICAgIHB1YmxpYyBGcmFtZUJ1ZmZlcihmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnMsCiAgICAgICAgIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXksCkBAIC0yOTAsMTIgKzMxMCwyNSBAQAogICAgICAgc2VsZWN0aW9uS2V5XyA9IHNlbGVjdGlvbktleTsKICAgICAgIHNlbGVjdFRocmVhZF8gPSBzZWxlY3RUaHJlYWQ7CiAgICAgICBidWZmZXJfID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KTsKKworICAgICAgZnJhbWVUcmFuc18gPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KCk7CisgICAgICByZXNwb25zZV8gPSBuZXcgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgaW5UcmFuc18gPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChmcmFtZVRyYW5zXyk7CisgICAgICBvdXRUcmFuc18gPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChyZXNwb25zZV8pKTsKKyAgICAgIGluUHJvdF8gPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5UcmFuc18pOworICAgICAgb3V0UHJvdF8gPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dFRyYW5zXyk7CisKKyAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgY29udGV4dF8gPSBldmVudEhhbmRsZXJfLmNyZWF0ZUNvbnRleHQoaW5Qcm90Xywgb3V0UHJvdF8pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dF8gID0gbnVsbDsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBHaXZlIHRoaXMgRnJhbWVCdWZmZXIgYSBjaGFuY2UgdG8gcmVhZC4gVGhlIHNlbGVjdG9yIGxvb3Agc2hvdWxkIGhhdmUKICAgICAgKiByZWNlaXZlZCBhIHJlYWQgZXZlbnQgZm9yIHRoaXMgRnJhbWVCdWZmZXIuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGxpdmUgb24sIGZhbHNlIGlmIGl0IHNob3VsZCBiZQogICAgICAqICAgICAgICAgY2xvc2VkCiAgICAgICovCkBAIC00MDIsMTcgKzQzNSwyMyBAQAogICAgICAqIGhhcyBjb21lIGluLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoYW5nZVNlbGVjdEludGVyZXN0cygpIHsKLSAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9XUklURSkgeworICAgICAgc3dpdGNoIChzdGF0ZV8pIHsKKyAgICAgIGNhc2UgQVdBSVRJTkdfUkVHSVNURVJfV1JJVEU6CiAgICAgICAgIC8vIHNldCB0aGUgT1BfV1JJVEUgaW50ZXJlc3QKICAgICAgICAgc2VsZWN0aW9uS2V5Xy5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOwogICAgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLldSSVRJTkc7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX1JFR0lTVEVSX1JFQUQpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1JFQUQ6CiAgICAgICAgIHByZXBhcmVSZWFkKCk7Ci0gICAgICB9IGVsc2UgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19DTE9TRToKICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgc2VsZWN0aW9uS2V5Xy5jYW5jZWwoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKCIgKyBzdGF0ZV8gKyAiKSIpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0dFUi5lcnJvcigKKyAgICAgICAgICAgICJjaGFuZ2VTZWxlY3RJbnRlcmVzdCB3YXMgY2FsbGVkLCBidXQgc3RhdGUgaXMgaW52YWxpZCAoe30pIiwKKyAgICAgICAgICAgIHN0YXRlXyk7CiAgICAgICB9CiAgICAgfQogCkBAIC00MjIsMTAgKzQ2MSwxNSBAQAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgLy8gaWYgd2UncmUgYmVpbmcgY2xvc2VkIGR1ZSB0byBhbiBlcnJvciwgd2UgbWlnaHQgaGF2ZSBhbGxvY2F0ZWQgYQogICAgICAgLy8gYnVmZmVyIHRoYXQgd2UgbmVlZCB0byBzdWJ0cmFjdCBmb3Igb3VyIG1lbW9yeSBhY2NvdW50aW5nLgotICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUUgfHwgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURSkgeworICAgICAgaWYgKHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLlJFQURJTkdfRlJBTUUgfHwKKyAgICAgICAgICBzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFEX0ZSQU1FX0NPTVBMRVRFIHx8CisgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfQ0xPU0UpIHsKICAgICAgICAgcmVhZEJ1ZmZlckJ5dGVzQWxsb2NhdGVkLmFkZEFuZEdldCgtYnVmZmVyXy5hcnJheSgpLmxlbmd0aCk7CiAgICAgICB9CiAgICAgICB0cmFuc18uY2xvc2UoKTsKKyAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgZXZlbnRIYW5kbGVyXy5kZWxldGVDb250ZXh0KGNvbnRleHRfLCBpblByb3RfLCBvdXRQcm90Xyk7CisgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzAsMTIgKzUxNCwxNCBAQAogICAgICAqIEFjdHVhbGx5IGludm9rZSB0aGUgbWV0aG9kIHNpZ25pZmllZCBieSB0aGlzIEZyYW1lQnVmZmVyLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGludm9rZSgpIHsKLSAgICAgIFRUcmFuc3BvcnQgaW5UcmFucyA9IGdldElucHV0VHJhbnNwb3J0KCk7Ci0gICAgICBUUHJvdG9jb2wgaW5Qcm90ID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGluVHJhbnMpOwotICAgICAgVFByb3RvY29sIG91dFByb3QgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGdldE91dHB1dFRyYW5zcG9ydCgpKTsKKyAgICAgIGZyYW1lVHJhbnNfLnJlc2V0KGJ1ZmZlcl8uYXJyYXkoKSk7CisgICAgICByZXNwb25zZV8ucmVzZXQoKTsKIAogICAgICAgdHJ5IHsKLSAgICAgICAgcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluVHJhbnMpLnByb2Nlc3MoaW5Qcm90LCBvdXRQcm90KTsKKyAgICAgICAgaWYgKGV2ZW50SGFuZGxlcl8gIT0gbnVsbCkgeworICAgICAgICAgIGV2ZW50SGFuZGxlcl8ucHJvY2Vzc0NvbnRleHQoY29udGV4dF8sIGluVHJhbnNfLCBvdXRUcmFuc18pOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpblRyYW5zXykucHJvY2VzcyhpblByb3RfLCBvdXRQcm90Xyk7CiAgICAgICAgIHJlc3BvbnNlUmVhZHkoKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgewpAQCAtNDg5LDI0ICs1MzUsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFdyYXAgdGhlIHJlYWQgYnVmZmVyIGluIGEgbWVtb3J5LWJhc2VkIHRyYW5zcG9ydCBzbyBhIHByb2Nlc3NvciBjYW4gcmVhZAotICAgICAqIHRoZSBkYXRhIGl0IG5lZWRzIHRvIGhhbmRsZSBhbiBpbnZvY2F0aW9uLgotICAgICAqLwotICAgIHByaXZhdGUgVFRyYW5zcG9ydCBnZXRJbnB1dFRyYW5zcG9ydCgpIHsKLSAgICAgIHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KGJ1ZmZlcl8uYXJyYXkoKSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHJhbnNwb3J0IHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGludm9rZXIgZm9yIHJlc3BvbmRpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUVHJhbnNwb3J0IGdldE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICAgIHJlc3BvbnNlXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQocmVzcG9uc2VfKSk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCiAgICAgICogICAgICAgICBjb25uZWN0aW9uIGNsb3NlZC4KICAgICAgKi8KQEAgLTU0Miw3ICs1NzIsNyBAQAogICAgICAqIGN1cnJlbnQgdGhyZWFkIGlzIHRoaXMgRnJhbWVCdWZmZXIncyBzZWxlY3QgdGhyZWFkLCB0aGVuIGl0IGp1c3QgZG9lcyB0aGUKICAgICAgKiBpbnRlcmVzdCBjaGFuZ2UgaW1tZWRpYXRlbHkuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RTZWxlY3RJbnRlcmVzdENoYW5nZSgpIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXF1ZXN0U2VsZWN0SW50ZXJlc3RDaGFuZ2UoKSB7CiAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSA9PSB0aGlzLnNlbGVjdFRocmVhZF8pIHsKICAgICAgICAgY2hhbmdlU2VsZWN0SW50ZXJlc3RzKCk7CiAgICAgICB9IGVsc2UgewpAQCAtNTUxLDEyICs1ODEsMzggQEAKICAgICB9CiAgIH0gLy8gRnJhbWVCdWZmZXIKIAotICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJFdmVudEhhbmRsZXIoVFNlcnZlckV2ZW50SGFuZGxlciBldmVudEhhbmRsZXIpIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOwotICB9CisgIHB1YmxpYyBjbGFzcyBBc3luY0ZyYW1lQnVmZmVyIGV4dGVuZHMgRnJhbWVCdWZmZXIgeworICAgIHB1YmxpYyBBc3luY0ZyYW1lQnVmZmVyKFROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFucywgU2VsZWN0aW9uS2V5IHNlbGVjdGlvbktleSwgQWJzdHJhY3RTZWxlY3RUaHJlYWQgc2VsZWN0VGhyZWFkKSB7CisgICAgICBzdXBlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpOworICAgIH0KIAotICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBnZXRFdmVudEhhbmRsZXIoKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKLSAgfQorICAgIHB1YmxpYyBUUHJvdG9jb2wgZ2V0SW5wdXRQcm90b2NvbCgpIHsKKyAgICAgIHJldHVybiAgaW5Qcm90XzsKKyAgICB9CiAKKyAgICBwdWJsaWMgVFByb3RvY29sIGdldE91dHB1dFByb3RvY29sKCkgeworICAgICAgcmV0dXJuIG91dFByb3RfOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgaW52b2tlKCkgeworICAgICAgZnJhbWVUcmFuc18ucmVzZXQoYnVmZmVyXy5hcnJheSgpKTsKKyAgICAgIHJlc3BvbnNlXy5yZXNldCgpOworCisgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcm9jZXNzQ29udGV4dChjb250ZXh0XywgaW5UcmFuc18sIG91dFRyYW5zXyk7CisgICAgICAgIH0KKyAgICAgICAgKChUQXN5bmNQcm9jZXNzb3IpcHJvY2Vzc29yRmFjdG9yeV8uZ2V0UHJvY2Vzc29yKGluVHJhbnNfKSkucHJvY2Vzcyh0aGlzKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICBMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoaWxlIGludm9raW5nISIsIHRlKTsKKyAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiVW5leHBlY3RlZCB0aHJvd2FibGUgd2hpbGUgaW52b2tpbmchIiwgdCk7CisgICAgICB9CisgICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlcmUgaXMgYSB0aHJvd2FibGUuCisgICAgICBzdGF0ZV8gPSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFOworICAgICAgcmVxdWVzdFNlbGVjdEludGVyZXN0Q2hhbmdlKCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YQppbmRleCBkMzI4ZGQ2Li43NTA4MmMwIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKICAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIFRQcm9jZXNzb3J9LiBUaGlzIHdpbGwgYmUgY2FsbGVkIDxiPm9uY2U8L2I+IGp1c3QKICAgICogYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKICAgICogCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIFRQcm9jZXNzb3J9CiAgICAqLwogICBwcm90ZWN0ZWQgYWJzdHJhY3QgVFByb2Nlc3NvciBnZXRQcm9jZXNzb3IoKTsKIApAQCAtNzEsNyArNzEsNyBAQAogICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBpbiB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0uIFRoaXMgd2lsbCBiZSBjYWxsZWQKICAgICogPGI+b25jZTwvYj4ganVzdCBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAogICAgKiAKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBpbiB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBUUHJvdG9jb2xGYWN0b3J5IGdldEluUHJvdG9jb2xGYWN0b3J5KCk7CiAKQEAgLTc5LDcgKzc5LDcgQEAKICAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgb3V0IHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fS4gVGhpcyB3aWxsIGJlIGNhbGxlZAogICAgKiA8Yj5vbmNlPC9iPiBqdXN0IGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCiAgICAqIAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG91dCB7QGxpbmsgVFByb3RvY29sRmFjdG9yeX0KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBUUHJvdG9jb2xGYWN0b3J5IGdldE91dFByb3RvY29sRmFjdG9yeSgpOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKaW5kZXggMzU0MTE1NC4uNGM1ZDdiNSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQpAQCAtMzUsNyArMzUsOCBAQAogcHVibGljIGNsYXNzIFRIc0hhU2VydmVyIGV4dGVuZHMgVE5vbmJsb2NraW5nU2VydmVyIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEFyZ3MgZXh0ZW5kcyBBYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyQXJnczxBcmdzPiB7Ci0gICAgcHJpdmF0ZSBpbnQgd29ya2VyVGhyZWFkcyA9IDU7CisgICAgcHVibGljIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gNTsKKyAgICBwdWJsaWMgaW50IG1heFdvcmtlclRocmVhZHMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKICAgICBwcml2YXRlIGludCBzdG9wVGltZW91dFZhbCA9IDYwOwogICAgIHByaXZhdGUgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gVGltZVVuaXQuU0VDT05EUzsKICAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBudWxsOwpAQCAtNDQsMTMgKzQ1LDQ0IEBACiAgICAgICBzdXBlcih0cmFuc3BvcnQpOwogICAgIH0KIAotICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IGkpIHsKLSAgICAgIHdvcmtlclRocmVhZHMgPSBpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWluIGFuZCBtYXggdGhyZWFkcy4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI21pbldvcmtlclRocmVhZHMoaW50KX0gYW5kIHtAbGluayAjbWF4V29ya2VyVGhyZWFkcyhpbnQpfSAgaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBBcmdzIHdvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoYXQgdGhlIG1pbiB0aHJlYWRzIHdhcyBzZXQgdG8uCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0TWluV29ya2VyVGhyZWFkcygpfSBhbmQge0BsaW5rICNnZXRNYXhXb3JrZXJUaHJlYWRzKCl9IGluc3RlYWQuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFdvcmtlclRocmVhZHMoKSB7Ci0gICAgICByZXR1cm4gd29ya2VyVGhyZWFkczsKKyAgICAgIHJldHVybiBtaW5Xb3JrZXJUaHJlYWRzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIG1pbldvcmtlclRocmVhZHMoaW50IG4pIHsKKyAgICAgIG1pbldvcmtlclRocmVhZHMgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3MgbWF4V29ya2VyVGhyZWFkcyhpbnQgbikgeworICAgICAgbWF4V29ya2VyVGhyZWFkcyA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1pbldvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWluV29ya2VyVGhyZWFkczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE1heFdvcmtlclRocmVhZHMoKSB7CisgICAgICByZXR1cm4gbWF4V29ya2VyVGhyZWFkczsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFN0b3BUaW1lb3V0VmFsKCkgewpAQCAtOTksNyArMTMxLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiBAaW5oZXJpdERvYworICAgKiB7QGluaGVyaXREb2N9CiAgICAqLwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgd2FpdEZvclNodXRkb3duKCkgewpAQCAtMTExLDE3ICsxNDMsMjEgQEAKICAgICogSGVscGVyIHRvIGNyZWF0ZSBhbiBpbnZva2VyIHBvb2wKICAgICovCiAgIHByb3RlY3RlZCBzdGF0aWMgRXhlY3V0b3JTZXJ2aWNlIGNyZWF0ZUludm9rZXJQb29sKEFyZ3Mgb3B0aW9ucykgewotICAgIGludCB3b3JrZXJUaHJlYWRzID0gb3B0aW9ucy53b3JrZXJUaHJlYWRzOworICAgIGludCBtaW5Xb3JrZXJUaHJlYWRzID0gb3B0aW9ucy5taW5Xb3JrZXJUaHJlYWRzOworICAgIGludCBtYXhXb3JrZXJUaHJlYWRzID0gb3B0aW9ucy5tYXhXb3JrZXJUaHJlYWRzOwogICAgIGludCBzdG9wVGltZW91dFZhbCA9IG9wdGlvbnMuc3RvcFRpbWVvdXRWYWw7CiAgICAgVGltZVVuaXQgc3RvcFRpbWVvdXRVbml0ID0gb3B0aW9ucy5zdG9wVGltZW91dFVuaXQ7CiAKICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPiBxdWV1ZSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPFJ1bm5hYmxlPigpOwotICAgIEV4ZWN1dG9yU2VydmljZSBpbnZva2VyID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcih3b3JrZXJUaHJlYWRzLAotICAgICAgd29ya2VyVGhyZWFkcywgc3RvcFRpbWVvdXRWYWwsIHN0b3BUaW1lb3V0VW5pdCwgcXVldWUpOworICAgIEV4ZWN1dG9yU2VydmljZSBpbnZva2VyID0gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihtaW5Xb3JrZXJUaHJlYWRzLAorICAgICAgbWF4V29ya2VyVGhyZWFkcywgc3RvcFRpbWVvdXRWYWwsIHN0b3BUaW1lb3V0VW5pdCwgcXVldWUpOwogCiAgICAgcmV0dXJuIGludm9rZXI7CiAgIH0KIAorICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGdldEludm9rZXIoKSB7CisgICAgcmV0dXJuIGludm9rZXI7CisgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBncmFjZWZ1bGx5U2h1dGRvd25JbnZva2VyUG9vbCgpIHsKICAgICAvLyB0cnkgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gdGhlIGV4ZWN1dG9yIHNlcnZpY2UKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5qYXZhCmluZGV4IGRjY2FlNTIuLmZlMDM2NWEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQpAQCAtNDcsOSArNDcsNiBAQAogICAgIH0KICAgfQogCi0gIC8vIEZsYWcgZm9yIHN0b3BwaW5nIHRoZSBzZXJ2ZXIKLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gdHJ1ZTsKLQogICBwcml2YXRlIFNlbGVjdEFjY2VwdFRocmVhZCBzZWxlY3RBY2NlcHRUaHJlYWRfOwogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXIoQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3MgYXJncykgewpAQCAtNjgsNyArNjUsNiBAQAogICAgIC8vIHN0YXJ0IHRoZSBzZWxlY3RvcgogICAgIHRyeSB7CiAgICAgICBzZWxlY3RBY2NlcHRUaHJlYWRfID0gbmV3IFNlbGVjdEFjY2VwdFRocmVhZCgoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0KXNlcnZlclRyYW5zcG9ydF8pOwotICAgICAgc3RvcHBlZF8gPSBmYWxzZTsKICAgICAgIHNlbGVjdEFjY2VwdFRocmVhZF8uc3RhcnQoKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTE1MCw2ICsxNDYsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICB0cnkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CisgICAgICAgICAgZXZlbnRIYW5kbGVyXy5wcmVTZXJ2ZSgpOworICAgICAgICB9CisKICAgICAgICAgd2hpbGUgKCFzdG9wcGVkXykgewogICAgICAgICAgIHNlbGVjdCgpOwogICAgICAgICAgIHByb2Nlc3NJbnRlcmVzdENoYW5nZXMoKTsKQEAgLTE2MCw2ICsxNjAsMTEgQEAKICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKICAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgc2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3Npbmcgc2VsZWN0b3IhIiwgZSk7CisgICAgICAgIH0KICAgICAgICAgc3RvcHBlZF8gPSB0cnVlOwogICAgICAgfQogICAgIH0KQEAgLTIwOCw2ICsyMTMsMTQgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgRnJhbWVCdWZmZXIgY3JlYXRlRnJhbWVCdWZmZXIoZmluYWwgVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zLAorICAgICAgICBmaW5hbCBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5LAorICAgICAgICBmaW5hbCBBYnN0cmFjdFNlbGVjdFRocmVhZCBzZWxlY3RUaHJlYWQpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NvckZhY3RvcnlfLmlzQXN5bmNQcm9jZXNzb3IoKSA/CisgICAgICAgICAgICAgICAgICBuZXcgQXN5bmNGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpIDoKKyAgICAgICAgICAgICAgICAgIG5ldyBGcmFtZUJ1ZmZlcih0cmFucywgc2VsZWN0aW9uS2V5LCBzZWxlY3RUaHJlYWQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEFjY2VwdCBhIG5ldyBjb25uZWN0aW9uLgogICAgICAqLwpAQCAtMjIwLDkgKzIzMyw5IEBACiAgICAgICAgIGNsaWVudEtleSA9IGNsaWVudC5yZWdpc3RlclNlbGVjdG9yKHNlbGVjdG9yLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CiAKICAgICAgICAgLy8gYWRkIHRoaXMga2V5IHRvIHRoZSBtYXAKLSAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBuZXcgRnJhbWVCdWZmZXIoY2xpZW50LCBjbGllbnRLZXksCi0gICAgICAgICAgU2VsZWN0QWNjZXB0VGhyZWFkLnRoaXMpOwotICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKKyAgICAgICAgICBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyKGNsaWVudCwgY2xpZW50S2V5LCBTZWxlY3RBY2NlcHRUaHJlYWQudGhpcyk7CisKKyAgICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHRlKSB7CiAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nIGFjY2VwdGluZy4KICAgICAgICAgTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gYWNjZXB0ISIsIHR0ZSk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCmluZGV4IGE4NWE0MjkuLmJhYzA2YjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5qYXZhCkBAIC0xMjMsMTAgKzEyMywxNCBAQAogICAgKi8KICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKIAotICBwcml2YXRlIGJvb2xlYW4gaXNTZXJ2aW5nOworICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNTZXJ2aW5nOwogCiAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIGV2ZW50SGFuZGxlcl87CiAKKyAgLy8gRmxhZyBmb3Igc3RvcHBpbmcgdGhlIHNlcnZlcgorICAvLyBQbGVhc2Ugc2VlIFRIUklGVC0xNzk1IGZvciB0aGUgdXNhZ2Ugb2YgdGhpcyBmbGFnCisgIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWRfID0gZmFsc2U7CisKICAgcHJvdGVjdGVkIFRTZXJ2ZXIoQWJzdHJhY3RTZXJ2ZXJBcmdzIGFyZ3MpIHsKICAgICBwcm9jZXNzb3JGYWN0b3J5XyA9IGFyZ3MucHJvY2Vzc29yRmFjdG9yeTsKICAgICBzZXJ2ZXJUcmFuc3BvcnRfID0gYXJncy5zZXJ2ZXJUcmFuc3BvcnQ7CkBAIC0xNjIsNCArMTY2LDEyIEBACiAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpIHsKICAgICByZXR1cm4gZXZlbnRIYW5kbGVyXzsKICAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFNob3VsZFN0b3AoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RvcHBlZF87CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRTaG91bGRTdG9wKGJvb2xlYW4gc2hvdWxkU3RvcCkgeworICAgIHRoaXMuc3RvcHBlZF8gPSBzaG91bGRTdG9wOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCmluZGV4IDZlOTI4MDEuLmU4MTViMmMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5qYXZhCkBAIC0zNSwxNCArMzUsMTEgQEAKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVFNpbXBsZVNlcnZlci5jbGFzcy5nZXROYW1lKCkpOwogCi0gIHByaXZhdGUgYm9vbGVhbiBzdG9wcGVkXyA9IGZhbHNlOwotCiAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKEFic3RyYWN0U2VydmVyQXJncyBhcmdzKSB7CiAgICAgc3VwZXIoYXJncyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICBzdG9wcGVkXyA9IGZhbHNlOwogICAgIHRyeSB7CiAgICAgICBzZXJ2ZXJUcmFuc3BvcnRfLmxpc3RlbigpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKaW5kZXggOWE2OGM3Ni4uMTY5N2FkNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQpAQCAtMTksNyArMTksOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAoraW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlN5bmNocm9ub3VzUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtMjcsNiArMjksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2VydmVyVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwpAQCAtNDgsNiArNTEsMTAgQEAKICAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZTsKICAgICBwdWJsaWMgaW50IHN0b3BUaW1lb3V0VmFsID0gNjA7CiAgICAgcHVibGljIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7CisgICAgcHVibGljIGludCByZXF1ZXN0VGltZW91dCA9IDIwOworICAgIHB1YmxpYyBUaW1lVW5pdCByZXF1ZXN0VGltZW91dFVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTOworICAgIHB1YmxpYyBpbnQgYmVCYWNrb2ZmU2xvdExlbmd0aCA9IDEwMDsKKyAgICBwdWJsaWMgVGltZVVuaXQgYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiAKICAgICBwdWJsaWMgQXJncyhUU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgICAgc3VwZXIodHJhbnNwb3J0KTsKQEAgLTYzLDYgKzcwLDM3IEBACiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFZhbChpbnQgbikgeworICAgICAgc3RvcFRpbWVvdXRWYWwgPSBuOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEFyZ3Mgc3RvcFRpbWVvdXRVbml0KFRpbWVVbml0IHR1KSB7CisgICAgICBzdG9wVGltZW91dFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBcmdzIHJlcXVlc3RUaW1lb3V0KGludCBuKSB7CisgICAgICByZXF1ZXN0VGltZW91dCA9IG47CisgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXJncyByZXF1ZXN0VGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHJlcXVlc3RUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIC8vQmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xvdCBsZW5ndGgKKyAgICBwdWJsaWMgQXJncyBiZUJhY2tvZmZTbG90TGVuZ3RoKGludCBuKSB7CisgICAgICBiZUJhY2tvZmZTbG90TGVuZ3RoID0gbjsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8vQmluYXJ5IGV4cG9uZW50aWFsIGJhY2tvZmYgc2xvdCB0aW1lIHVuaXQKKyAgICBwdWJsaWMgQXJncyBiZUJhY2tvZmZTbG90TGVuZ3RoVW5pdChUaW1lVW5pdCB0dSkgeworICAgICAgYmVCYWNrb2ZmU2xvdExlbmd0aFVuaXQgPSB0dTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIHB1YmxpYyBBcmdzIGV4ZWN1dG9yU2VydmljZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CiAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKICAgICAgIHJldHVybiB0aGlzOwpAQCAtNzIsMTggKzExMCwyNiBAQAogICAvLyBFeGVjdXRvciBzZXJ2aWNlIGZvciBoYW5kbGluZyBjbGllbnQgY29ubmVjdGlvbnMKICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlXzsKIAotICAvLyBGbGFnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXzsKLQogICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHN0b3BUaW1lb3V0VW5pdDsKIAogICBwcml2YXRlIGZpbmFsIGxvbmcgc3RvcFRpbWVvdXRWYWw7CiAKKyAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCByZXF1ZXN0VGltZW91dFVuaXQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlcXVlc3RUaW1lb3V0OworCisgIHByaXZhdGUgZmluYWwgbG9uZyBiZUJhY2tvZmZTbG90SW5NaWxsaXM7CisKKyAgcHJpdmF0ZSBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisKICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKEFyZ3MgYXJncykgewogICAgIHN1cGVyKGFyZ3MpOwogCiAgICAgc3RvcFRpbWVvdXRVbml0ID0gYXJncy5zdG9wVGltZW91dFVuaXQ7CiAgICAgc3RvcFRpbWVvdXRWYWwgPSBhcmdzLnN0b3BUaW1lb3V0VmFsOworICAgIHJlcXVlc3RUaW1lb3V0VW5pdCA9IGFyZ3MucmVxdWVzdFRpbWVvdXRVbml0OworICAgIHJlcXVlc3RUaW1lb3V0ID0gYXJncy5yZXF1ZXN0VGltZW91dDsKKyAgICBiZUJhY2tvZmZTbG90SW5NaWxsaXMgPSBhcmdzLmJlQmFja29mZlNsb3RMZW5ndGhVbml0LnRvTWlsbGlzKGFyZ3MuYmVCYWNrb2ZmU2xvdExlbmd0aCk7CiAKICAgICBleGVjdXRvclNlcnZpY2VfID0gYXJncy5leGVjdXRvclNlcnZpY2UgIT0gbnVsbCA/CiAgICAgICAgIGFyZ3MuZXhlY3V0b3JTZXJ2aWNlIDogY3JlYXRlRGVmYXVsdEV4ZWN1dG9yU2VydmljZShhcmdzKTsKQEAgLTk0LDMzICsxNDAsOTAgQEAKICAgICAgIG5ldyBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPigpOwogICAgIHJldHVybiBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKGFyZ3MubWluV29ya2VyVGhyZWFkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLm1heFdvcmtlclRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRVbml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yUXVldWUpOwogICB9CiAKLQotICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKLSAgICB0cnkgeworICBwcm90ZWN0ZWQgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlXzsKKyAgfQorICAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlU2VydmUoKSB7CisgIAl0cnkgewogICAgICAgc2VydmVyVHJhbnNwb3J0Xy5saXN0ZW4oKTsKICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewogICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgbGlzdGVuaW5nLiIsIHR0eCk7Ci0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLy8gUnVuIHRoZSBwcmVTZXJ2ZSBldmVudAogICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKICAgICAgIGV2ZW50SGFuZGxlcl8ucHJlU2VydmUoKTsKICAgICB9Ci0KICAgICBzdG9wcGVkXyA9IGZhbHNlOwogICAgIHNldFNlcnZpbmcodHJ1ZSk7CisgICAgCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXJ2ZSgpIHsKKyAgCWlmICghcHJlU2VydmUoKSkgeworICAJCXJldHVybjsKKyAgCX0KKworICAJZXhlY3V0ZSgpOworICAJd2FpdEZvclNodXRkb3duKCk7CisgICAgCisgICAgc2V0U2VydmluZyhmYWxzZSk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoKSB7CisgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgd2hpbGUgKCFzdG9wcGVkXykgewotICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CiAgICAgICB0cnkgewogICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydF8uYWNjZXB0KCk7CiAgICAgICAgIFdvcmtlclByb2Nlc3Mgd3AgPSBuZXcgV29ya2VyUHJvY2VzcyhjbGllbnQpOwotICAgICAgICBleGVjdXRvclNlcnZpY2VfLmV4ZWN1dGUod3ApOworCisgICAgICAgIGludCByZXRyeUNvdW50ID0gMDsKKyAgICAgICAgbG9uZyByZW1haW5UaW1lSW5NaWxsaXMgPSByZXF1ZXN0VGltZW91dFVuaXQudG9NaWxsaXMocmVxdWVzdFRpbWVvdXQpOworICAgICAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZV8uZXhlY3V0ZSh3cCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9IGNhdGNoKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgIHJldHJ5Q291bnQrKzsKKyAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluVGltZUluTWlsbGlzID4gMCkgeworICAgICAgICAgICAgICAgICAgLy9kbyBhIHRydW5jYXRlZCAyMCBiaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiBzbGVlcAorICAgICAgICAgICAgICAgICAgbG9uZyBzbGVlcFRpbWVJbk1pbGxpcyA9ICgobG9uZykgKHJhbmRvbS5uZXh0RG91YmxlKCkgKgorICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCBNYXRoLm1pbihyZXRyeUNvdW50LCAyMCkpKSkgKiBiZUJhY2tvZmZTbG90SW5NaWxsaXM7CisgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVJbk1pbGxpcyA9IE1hdGgubWluKHNsZWVwVGltZUluTWlsbGlzLCByZW1haW5UaW1lSW5NaWxsaXMpOworICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKHNsZWVwVGltZUluTWlsbGlzKTsKKyAgICAgICAgICAgICAgICAgIHJlbWFpblRpbWVJbk1pbGxpcyA9IHJlbWFpblRpbWVJbk1pbGxpcyAtIHNsZWVwVGltZUluTWlsbGlzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgIHdwID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJUYXNrIGhhcyBiZWVuIHJlamVjdGVkIGJ5IEV4ZWN1dG9yU2VydmljZSAiICsgcmV0cnlDb3VudAorICAgICAgICAgICAgICAgICAgICAgICsgIiB0aW1lcyB0aWxsIHRpbWVkb3V0LCByZWFzb246ICIgKyB0KTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi53YXJuKCJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvIHBsYWNlIGNsaWVudCBvbiBleGVjdXRvciBxdWV1ZS4iKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBFcnJvcikgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4ZWN1dG9yU2VydmljZSB0aHJldyBlcnJvcjogIiArIHQsIHQpOworICAgICAgICAgICAgICB0aHJvdyAoRXJyb3IpdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vZm9yIG90aGVyIHBvc3NpYmxlIHJ1bnRpbWUgZXJyb3JzIGZyb20gRXhlY3V0b3JTZXJ2aWNlLCBzaG91bGQgYWxzbyBub3Qga2lsbCBzZXJ2ZQorICAgICAgICAgICAgICBMT0dHRVIud2FybigiRXhlY3V0b3JTZXJ2aWNlIHRocmV3IGVycm9yOiAiICsgdCwgdCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgICAgaWYgKCFzdG9wcGVkXykgewogICAgICAgICAgICsrZmFpbHVyZUNvdW50OwpAQCAtMTI4LDggKzIzMSwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgZXhlY3V0b3JTZXJ2aWNlXy5zaHV0ZG93bigpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCB3YWl0Rm9yU2h1dGRvd24oKSB7CisgIAlleGVjdXRvclNlcnZpY2VfLnNodXRkb3duKCk7CiAKICAgICAvLyBMb29wIHVudGlsIGF3YWl0VGVybWluYXRpb24gZmluYWxseSBkb2VzIHJldHVybiB3aXRob3V0IGEgaW50ZXJydXB0ZWQKICAgICAvLyBleGNlcHRpb24uIElmIHdlIGRvbid0IGRvIHRoaXMsIHRoZW4gd2UnbGwgc2h1dCBkb3duIHByZW1hdHVyZWx5LiBXZSB3YW50CkBAIC0xNDcsNyArMjUyLDYgQEAKICAgICAgICAgbm93ID0gbmV3bm93OwogICAgICAgfQogICAgIH0KLSAgICBzZXRTZXJ2aW5nKGZhbHNlKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CkBAIC0xODksNyArMjkzLDcgQEAKICAgICAgICAgaW5wdXRUcmFuc3BvcnQgPSBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChjbGllbnRfKTsKICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CSAgCisgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy5nZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwogCiAgICAgICAgIGV2ZW50SGFuZGxlciA9IGdldEV2ZW50SGFuZGxlcigpOwogICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKQEAgLTIwNywyNCArMzExLDM1IEBACiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICAvLyBBc3N1bWUgdGhlIGNsaWVudCBkaWVkIGFuZCBjb250aW51ZSBzaWxlbnRseQogICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiB0eCkgewogICAgICAgICBMT0dHRVIuZXJyb3IoIlRocmlmdCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHR4KTsKICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7Ci0gICAgICAgIGV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7Ci0gICAgICAgIGlucHV0VHJhbnNwb3J0LmNsb3NlKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvdXRwdXRUcmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgLy8gV2UnbGwgdXN1YWxseSByZWNlaXZlIFJ1bnRpbWVFeGNlcHRpb24gdHlwZXMgaGVyZQorICAgICAgICAvLyBOZWVkIHRvIHVud3JhcCB0byBhc2NlcnRhaW4gcmVhbCBjYXVzaW5nIGV4Y2VwdGlvbiBiZWZvcmUgd2UgY2hvb3NlIHRvIGlnbm9yZQorICAgICAgICBUaHJvd2FibGUgcmVhbENhdXNlID0geC5nZXRDYXVzZSgpOworICAgICAgICAvLyBJZ25vcmUgZXJyLWxvZ2dpbmcgYWxsIHRyYW5zcG9ydC1sZXZlbC90eXBlIGV4Y2VwdGlvbnMKKyAgICAgICAgaWYgKChyZWFsQ2F1c2UgIT0gbnVsbCAmJiByZWFsQ2F1c2UgaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgfHwgKHggaW5zdGFuY2VvZiBUVHJhbnNwb3J0RXhjZXB0aW9uKSkgeworICAgICAgICAgIExPR0dFUi5kZWJ1ZygKKyAgICAgICAgICAgICAgIlJlY2VpdmVkIFRUcmFuc3BvcnRFeGNlcHRpb24gZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4gSWdub3JpbmcuIiwKKyAgICAgICAgICAgICAgeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gTG9nIHRoZSBleGNlcHRpb24gYXQgZXJyb3IgbGV2ZWwgYW5kIGNvbnRpbnVlCisgICAgICAgICAgTE9HR0VSLmVycm9yKCJFcnJvciBvY2N1cnJlZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiBtZXNzYWdlLiIsIHgpOworICAgICAgICB9CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBpZiAoZXZlbnRIYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50Xy5pc09wZW4oKSkgeworICAgICAgICAgIGNsaWVudF8uY2xvc2UoKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCmluZGV4IDA0MTc5ZTYuLjAzODUwN2UgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKQEAgLTE5LDcgKzE5LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0YWJsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOwpAQCAtMzcsMjQgKzQ1LDE4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqCiAgKiBBIEhhbGYtU3luYy9IYWxmLUFzeW5jIHNlcnZlciB3aXRoIGEgc2VwYXJhdGUgcG9vbCBvZiB0aHJlYWRzIHRvIGhhbmRsZQogICogbm9uLWJsb2NraW5nIEkvTy4gQWNjZXB0cyBhcmUgaGFuZGxlZCBvbiBhIHNpbmdsZSB0aHJlYWQsIGFuZCBhIGNvbmZpZ3VyYWJsZQogICogbnVtYmVyIG9mIG5vbmJsb2NraW5nIHNlbGVjdG9yIHRocmVhZHMgbWFuYWdlIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YgY2xpZW50CiAgKiBjb25uZWN0aW9ucy4gQSBzeW5jaHJvbm91cyB3b3JrZXIgdGhyZWFkIHBvb2wgaGFuZGxlcyBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzLgotICogCisgKgogICogUGVyZm9ybXMgYmV0dGVyIHRoYW4gVE5vbmJsb2NraW5nU2VydmVyL1RIc0hhU2VydmVyIGluIG11bHRpLWNvcmUKICAqIGVudmlyb25tZW50cyB3aGVuIHRoZSB0aGUgYm90dGxlbmVjayBpcyBDUFUgb24gdGhlIHNpbmdsZSBzZWxlY3RvciB0aHJlYWQKICAqIGhhbmRsaW5nIEkvTy4gSW4gYWRkaXRpb24sIGJlY2F1c2UgdGhlIGFjY2VwdCBoYW5kbGluZyBpcyBkZWNvdXBsZWQgZnJvbQogICogcmVhZHMvd3JpdGVzIGFuZCBpbnZvY2F0aW9uLCB0aGUgc2VydmVyIGhhcyBiZXR0ZXIgYWJpbGl0eSB0byBoYW5kbGUgYmFjay0KICAqIHByZXNzdXJlIGZyb20gbmV3IGNvbm5lY3Rpb25zIChlLmcuIHN0b3AgYWNjZXB0aW5nIHdoZW4gYnVzeSkuCi0gKiAKKyAqCiAgKiBMaWtlIFROb25ibG9ja2luZ1NlcnZlciwgaXQgcmVsaWVzIG9uIHRoZSB1c2Ugb2YgVEZyYW1lZFRyYW5zcG9ydC4KICAqLwogcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyIGV4dGVuZHMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlciB7CkBAIC0xODAsOSArMTgyLDYgQEAKICAgICB9CiAgIH0KIAotICAvLyBGbGFnIGZvciBzdG9wcGluZyB0aGUgc2VydmVyCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkXyA9IHRydWU7Ci0KICAgLy8gVGhlIHRocmVhZCBoYW5kbGluZyBhbGwgYWNjZXB0cwogICBwcml2YXRlIEFjY2VwdFRocmVhZCBhY2NlcHRUaHJlYWQ7CiAKQEAgLTIwOCw3ICsyMDcsNyBAQAogCiAgIC8qKgogICAgKiBTdGFydCB0aGUgYWNjZXB0IGFuZCBzZWxlY3RvciB0aHJlYWRzIHJ1bm5pbmcgdG8gZGVhbCB3aXRoIGNsaWVudHMuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB3ZSBjb3VsZG4ndCBzdGFydCBmb3Igc29tZQogICAgKiAgICAgICAgIHJlYXNvbi4KICAgICovCkBAIC0yMjAsNyArMjE5LDYgQEAKICAgICAgIH0KICAgICAgIGFjY2VwdFRocmVhZCA9IG5ldyBBY2NlcHRUaHJlYWQoKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCkgc2VydmVyVHJhbnNwb3J0XywKICAgICAgICAgY3JlYXRlU2VsZWN0b3JUaHJlYWRMb2FkQmFsYW5jZXIoc2VsZWN0b3JUaHJlYWRzKSk7Ci0gICAgICBzdG9wcGVkXyA9IGZhbHNlOwogICAgICAgZm9yIChTZWxlY3RvclRocmVhZCB0aHJlYWQgOiBzZWxlY3RvclRocmVhZHMpIHsKICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CiAgICAgICB9CkBAIC0zNTMsNyArMzUxLDcgQEAKIAogICAgIC8qKgogICAgICAqIFNldCB1cCB0aGUgQWNjZXB0VGhlYWQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgQWNjZXB0VGhyZWFkKFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCkBAIC0zNzEsMTIgKzM2OSwyMSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgIHRyeSB7CisgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKKyAgICAgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CisgICAgICAgIH0KKwogICAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CiAgICAgICAgICAgc2VsZWN0KCk7CiAgICAgICAgIH0KICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIExPR0dFUi5lcnJvcigicnVuKCkgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKKyAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBvbiBBY2NlcHRUaHJlYWQgZXhpdGluZyBkdWUgdG8gdW5jYXVnaHQgZXJyb3IiLCB0KTsKICAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYWNjZXB0U2VsZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiR290IGFuIElPRXhjZXB0aW9uIHdoaWxlIGNsb3NpbmcgYWNjZXB0IHNlbGVjdG9yISIsIGUpOworICAgICAgICB9CiAgICAgICAgIC8vIFRoaXMgd2lsbCB3YWtlIHVwIHRoZSBzZWxlY3RvciB0aHJlYWRzCiAgICAgICAgIFRUaHJlYWRlZFNlbGVjdG9yU2VydmVyLnRoaXMuc3RvcCgpOwogICAgICAgfQpAQCAtNDczLDEwICs0ODAsMTMgQEAKIAogICAgIC8vIEFjY2VwdGVkIGNvbm5lY3Rpb25zIGFkZGVkIGJ5IHRoZSBhY2NlcHQgdGhyZWFkLgogICAgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxUTm9uYmxvY2tpbmdUcmFuc3BvcnQ+IGFjY2VwdGVkUXVldWU7CisgICAgcHJpdmF0ZSBpbnQgU0VMRUNUT1JfQVVUT19SRUJVSUxEX1RIUkVTSE9MRCA9IDUxMjsKKyAgICBwcml2YXRlIGxvbmcgTU9OSVRPUl9QRVJJT0QgPSAxMDAwTDsKKyAgICBwcml2YXRlIGludCBqdm1CdWcgPSAwOwogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIHVuYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAogICAgICAqLwpAQCAtNDg2LDcgKzQ5Niw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYW4gYm91bmRlZCBxdWV1ZSBmb3IgaW5jb21pbmcgYWNjZXB0cy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgaWYgYSBzZWxlY3RvciBjYW5ub3QgYmUgY3JlYXRlZAogICAgICAqLwpAQCAtNDk2LDcgKzUwNiw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIFNlbGVjdG9yVGhyZWFkIHdpdGggYSBzcGVjaWZpZWQgcXVldWUgZm9yIGNvbm5lY3Rpb25zLgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFjY2VwdGVkUXVldWUKICAgICAgKiAgICAgICAgICBUaGUgQmxvY2tpbmdRdWV1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgaG9sZGluZyBpbmNvbWluZyBhY2NlcHRlZAogICAgICAqICAgICAgICAgIGNvbm5lY3Rpb25zLgpAQCAtNTEwLDcgKzUyMCw3IEBACiAgICAgLyoqCiAgICAgICogSGFuZHMgb2ZmIGFuIGFjY2VwdGVkIGNvbm5lY3Rpb24gdG8gYmUgaGFuZGxlZCBieSB0aGlzIHRocmVhZC4gVGhpcwogICAgICAqIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHRoZSBxdWV1ZSBmb3IgbmV3IGNvbm5lY3Rpb25zIGlzIGF0IGNhcGFjaXR5LgotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIGFjY2VwdGVkCiAgICAgICogICAgICAgICAgVGhlIGNvbm5lY3Rpb24gdGhhdCBoYXMgYmVlbiBhY2NlcHRlZC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFkZGVkLgpAQCAtNTQxLDggKzU1MSwxMyBAQAogICAgICAgICAgIGNsZWFudXBTZWxlY3Rpb25LZXkoc2VsZWN0aW9uS2V5KTsKICAgICAgICAgfQogICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKLSAgICAgICAgTE9HR0VSLmVycm9yKCJydW4oKSBleGl0aW5nIGR1ZSB0byB1bmNhdWdodCBlcnJvciIsIHQpOworICAgICAgICBMT0dHRVIuZXJyb3IoInJ1bigpIG9uIFNlbGVjdG9yVGhyZWFkIGV4aXRpbmcgZHVlIHRvIHVuY2F1Z2h0IGVycm9yIiwgdCk7CiAgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHNlbGVjdG9yLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZXJyb3IoIkdvdCBhbiBJT0V4Y2VwdGlvbiB3aGlsZSBjbG9zaW5nIHNlbGVjdG9yISIsIGUpOworICAgICAgICB9CiAgICAgICAgIC8vIFRoaXMgd2lsbCB3YWtlIHVwIHRoZSBhY2NlcHQgdGhyZWFkIGFuZCB0aGUgb3RoZXIgc2VsZWN0b3IgdGhyZWFkcwogICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci50aGlzLnN0b3AoKTsKICAgICAgIH0KQEAgLTU1Niw4ICs1NzEsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZWxlY3QoKSB7CiAgICAgICB0cnkgewotICAgICAgICAvLyB3YWl0IGZvciBpbyBldmVudHMuCi0gICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOworCisgICAgICAgIGRvU2VsZWN0KCk7CiAKICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW8gZXZlbnRzIHdlIHJlY2VpdmVkCiAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gc2VsZWN0ZWRLZXlzID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKQEAgLTU4Niw2ICs2MDEsNzcgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEbyBzZWxlY3QgYW5kIGp1ZGdlIGVwb2xsIGJ1ZyBoYXBwZW4uCisgICAgICogU2VlIDogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1MQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBsb25nIGJlZm9yZVNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgaW50IHNlbGVjdGVkTnVtcyA9IHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgbG9uZyBhZnRlclNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICBpZiAoc2VsZWN0ZWROdW1zID09IDApIHsKKyAgICAgICAganZtQnVnKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgICBsb25nIHNlbGVjdGVkVGltZSA9IGFmdGVyU2VsZWN0IC0gYmVmb3JlU2VsZWN0OworICAgICAgaWYgKHNlbGVjdGVkVGltZSA+PSBNT05JVE9SX1BFUklPRCkgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfSBlbHNlIGlmIChqdm1CdWcgPiBTRUxFQ1RPUl9BVVRPX1JFQlVJTERfVEhSRVNIT0xEKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJJbiB7fSBtcyBoYXBwZW4ge30gdGltZXMganZtIGJ1ZzsgcmVidWlsZGluZyBzZWxlY3Rvci4iLCBNT05JVE9SX1BFUklPRCwganZtQnVnKTsKKyAgICAgICAgcmVidWlsZFNlbGVjdG9yKCk7CisgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgU2VsZWN0b3Igb2YgdGhpcyBTZWxlY3RvclRocmVhZCB3aXRoIG5ld2x5IGNyZWF0ZWQgU2VsZWN0b3IgdG8gd29yaworICAgICAqIGFyb3VuZCB0aGUgaW5mYW1vdXMgZXBvbGwgMTAwJSBDUFUgYnVnLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVidWlsZFNlbGVjdG9yKCkgeworICAgICAgZmluYWwgU2VsZWN0b3Igb2xkU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgIGlmIChvbGRTZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFNlbGVjdG9yIG5ld1NlbGVjdG9yID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIG5ld1NlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgICBMT0dHRVIud2FybigiQ3JlYXRlZCBuZXcgU2VsZWN0b3IuIik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiQ3JlYXRlIG5ldyBTZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKworICAgICAgZm9yIChTZWxlY3Rpb25LZXkga2V5IDogb2xkU2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkpIHsKKyAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpICYmIGtleS5yZWFkeU9wcygpID09IDApCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgICAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIobmV3U2VsZWN0b3IsIGtleS5yZWFkeU9wcygpLCBhdHRhY2htZW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVnaXN0ZXIgbmV3IHNlbGVjdG9yIGtleSBlcnJvci4iLCBlKTsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIHNlbGVjdG9yID0gbmV3U2VsZWN0b3I7CisgICAgICB0cnkgeworICAgICAgICBvbGRTZWxlY3Rvci5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNsb3NlIG9sZCBzZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKyAgICAgIExPR0dFUi53YXJuKCJSZXBsYWNlIG5ldyBzZWxlY3RvciBzdWNjZXNzLiIpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQWNjZXB0ZWRDb25uZWN0aW9ucygpIHsKICAgICAgIC8vIFJlZ2lzdGVyIGFjY2VwdGVkIGNvbm5lY3Rpb25zCiAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CkBAIC01OTcsMTIgKzY4MywyMSBAQAogICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCBGcmFtZUJ1ZmZlciBjcmVhdGVGcmFtZUJ1ZmZlcihmaW5hbCBUTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnMsCisgICAgICAgIGZpbmFsIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXksCisgICAgICAgIGZpbmFsIEFic3RyYWN0U2VsZWN0VGhyZWFkIHNlbGVjdFRocmVhZCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV8uaXNBc3luY1Byb2Nlc3NvcigpID8KKyAgICAgICAgICAgICAgICAgIG5ldyBBc3luY0ZyYW1lQnVmZmVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCkgOgorICAgICAgICAgICAgICAgICAgbmV3IEZyYW1lQnVmZmVyKHRyYW5zLCBzZWxlY3Rpb25LZXksIHNlbGVjdFRocmVhZCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQWNjZXB0ZWQoVE5vbmJsb2NraW5nVHJhbnNwb3J0IGFjY2VwdGVkKSB7CiAgICAgICBTZWxlY3Rpb25LZXkgY2xpZW50S2V5ID0gbnVsbDsKICAgICAgIHRyeSB7CiAgICAgICAgIGNsaWVudEtleSA9IGFjY2VwdGVkLnJlZ2lzdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIFNlbGVjdGlvbktleS5PUF9SRUFEKTsKIAotICAgICAgICBGcmFtZUJ1ZmZlciBmcmFtZUJ1ZmZlciA9IG5ldyBGcmFtZUJ1ZmZlcihhY2NlcHRlZCwgY2xpZW50S2V5LCBTZWxlY3RvclRocmVhZC50aGlzKTsKKyAgICAgICAgRnJhbWVCdWZmZXIgZnJhbWVCdWZmZXIgPSBjcmVhdGVGcmFtZUJ1ZmZlcihhY2NlcHRlZCwgY2xpZW50S2V5LCBTZWxlY3RvclRocmVhZC50aGlzKTsKKwogICAgICAgICBjbGllbnRLZXkuYXR0YWNoKGZyYW1lQnVmZmVyKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgTE9HR0VSLndhcm4oIkZhaWxlZCB0byByZWdpc3RlciBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIHNlbGVjdG9yISIsIGUpOwpAQCAtNjI2LDcgKzcyMSw3IEBACiAgICAqIEEgcm91bmQgcm9iaW4gbG9hZCBiYWxhbmNlciBmb3IgY2hvb3Npbmcgc2VsZWN0b3IgdGhyZWFkcyBmb3IgbmV3CiAgICAqIGNvbm5lY3Rpb25zLgogICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFNlbGVjdG9yVGhyZWFkTG9hZEJhbGFuY2VyIHsKKyAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTZWxlY3RvclRocmVhZExvYWRCYWxhbmNlciB7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gdGhyZWFkczsKICAgICBwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBTZWxlY3RvclRocmVhZD4gbmV4dFRocmVhZEl0ZXJhdG9yOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IGIwMjkwNWYuLmZjM2FhOTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgdGhhdCB3cmFwcyBhIGJ5dGVbXSBzbyB0aGF0IGl0IGNhbiBleHBhbmQgYW5kIGJlIHJldXNlZC4gVXNlcnMKICAqIHNob3VsZCBjYWxsIHJlc2l6ZUlmTmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGhhcyBzdWl0YWJsZSBjYXBhY2l0eSwKQEAgLTI1LDI4ICsyNywyNCBAQAogICogcmF0ZSBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5IHdpdGggdGhlICh1bnRlc3RlZCkKICAqIG9iamVjdGl2ZSBvZiBhdm9pZGluZyBleHBlbnNpdmUgYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBjb3BpZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKK2NsYXNzIEF1dG9FeHBhbmRpbmdCdWZmZXIgewogICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKIAotICBwcml2YXRlIGZpbmFsIGRvdWJsZSBncm93dGhDb2VmZmljaWVudDsKLQotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICBpZiAoZ3Jvd3RoQ29lZmZpY2llbnQgPCAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdyb3d0aCBjb2VmZmljaWVudCBtdXN0IGJlID49IDEuMCIpOwotICAgIH0KLSAgICBhcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07Ci0gICAgdGhpcy5ncm93dGhDb2VmZmljaWVudCA9IGdyb3d0aENvZWZmaWNpZW50OworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5hcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNpemVJZk5lY2Vzc2FyeShpbnQgc2l6ZSkgewotICAgIGlmIChhcnJheS5sZW5ndGggPCBzaXplKSB7Ci0gICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbKGludCkoc2l6ZSAqIGdyb3d0aENvZWZmaWNpZW50KV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdCdWYsIDAsIGFycmF5Lmxlbmd0aCk7Ci0gICAgICBhcnJheSA9IG5ld0J1ZjsKKyAgICBmaW5hbCBpbnQgY3VycmVudENhcGFjaXR5ID0gdGhpcy5hcnJheS5sZW5ndGg7CisgICAgaWYgKGN1cnJlbnRDYXBhY2l0eSA8IHNpemUpIHsKKyAgICAgIC8vIEluY3JlYXNlIGJ5IGEgZmFjdG9yIG9mIDEuNXgKKyAgICAgIGludCBncm93Q2FwYWNpdHkgPSBjdXJyZW50Q2FwYWNpdHkgKyAoY3VycmVudENhcGFjaXR5ID4+IDEpOworICAgICAgaW50IG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgoZ3Jvd0NhcGFjaXR5LCBzaXplKTsKKyAgICAgIHRoaXMuYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdDYXBhY2l0eSk7CiAgICAgfQogICB9CiAKICAgcHVibGljIGJ5dGVbXSBhcnJheSgpIHsKLSAgICByZXR1cm4gYXJyYXk7CisgICAgcmV0dXJuIHRoaXMuYXJyYXk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCBkMjlkNjBiLi5hMjhkMjU0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247Ci0KIC8qKgogICogVFRyYW5zcG9ydCBmb3IgcmVhZGluZyBmcm9tIGFuIEF1dG9FeHBhbmRpbmdCdWZmZXIuCiAgKi8KQEAgLTMwLDggKzI4LDggQEAKICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKICAgcHJpdmF0ZSBpbnQgbGltaXQgPSAwOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgb3Zlcmdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIG92ZXJncm93dGhDb2VmZmljaWVudCk7CisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOwogICB9CiAKICAgcHVibGljIHZvaWQgZmlsbChUVHJhbnNwb3J0IGluVHJhbnMsIGludCBsZW5ndGgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKQEAgLTYwLDcgKzU4LDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCAyMzc2Y2YzLi5lYzdlN2Q0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTE4LDggKzE4LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5Ob3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjsKLQogLyoqCiAgKiBUVHJhbnNwb3J0IGZvciB3cml0aW5nIHRvIGFuIEF1dG9FeHBhbmRpbmdCdWZmZXIuCiAgKi8KQEAgLTI3LDEwICsyNSwyOSBAQAogCiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlciBidWY7CiAgIHByaXZhdGUgaW50IHBvczsKKyAgcHJpdmF0ZSBpbnQgcmVzOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIGdyb3d0aENvZWZmaWNpZW50KTsKLSAgICB0aGlzLnBvcyA9IDA7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAqIEBwYXJhbSBmcm9udFJlc2VydmUgc3BhY2UsIGlmIGFueSwgdG8gcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIHN1Y2gKKyAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBmaXJzdCB3cml0ZSBpcyBhZnRlciB0aGlzIHJlc2VydmUuCisgICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZnJhbWVkIHRyYW5zcG9ydCB0byByZXNlcnZlIHNwYWNlCisgICAqICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmcmFtZSBidWZmZXIgbGVuZ3RoLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgbGVzcyB0aGFuIHplcm8KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGdyZWF0ZXIgdGhhbiBpbml0aWFsQ2FwYWNpdHkKKyAgICovCisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgaW50IGZyb250UmVzZXJ2ZSkgeworICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsQ2FwYWNpdHkiKTsKKyAgICB9CisgICAgaWYgKGZyb250UmVzZXJ2ZSA8IDAgfHwgaW5pdGlhbENhcGFjaXR5IDwgZnJvbnRSZXNlcnZlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcm9udFJlc2VydmUiKTsKKyAgICB9CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIHRoaXMucG9zID0gZnJvbnRSZXNlcnZlOworICAgIHRoaXMucmVzID0gZnJvbnRSZXNlcnZlOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC00NCw3ICs2MSw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTU4LDExICs3NSwxNCBAQAogICAgIHJldHVybiBidWY7CiAgIH0KIAotICBwdWJsaWMgaW50IGdldFBvcygpIHsKKyAgLyoqCisgICAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBidWZmZXIsIGluY2x1ZGluZyBhbnkgZnJvbnQgcmVzZXJ2ZQorICAgKi8KKyAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CiAgICAgcmV0dXJuIHBvczsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgIHBvcyA9IDA7CisgICAgcG9zID0gcmVzOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiMDY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQpAQCAtMCwwICsxLDg3IEBACitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEJ5dGVCdWZmZXItYmFja2VkIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUQnl0ZUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgeworICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcjsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBUQnl0ZUJ1ZmZlciB3cmFwcGluZyBhIGdpdmVuIE5JTyBCeXRlQnVmZmVyLgorICAgKi8KKyAgcHVibGljIFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgeworICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IGJ5dGVCdWZmZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9wZW4oKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBpbnQgbiA9IE1hdGgubWluKGJ5dGVCdWZmZXIucmVtYWluaW5nKCksIGxlbik7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICB0cnkgeworICAgICAgICBieXRlQnVmZmVyLmdldChidWYsIG9mZiwgbik7CisgICAgICB9IGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgYnVmZmVyIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgYnl0ZUJ1ZmZlci5wdXQoYnVmLCBvZmYsIGxlbik7CisgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEJ5dGVCdWZmZXIoKSB7CisgICAgcmV0dXJuIGJ5dGVCdWZmZXI7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgY2xlYXIoKSBvbiB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlci4KKyAgICovCisgIHB1YmxpYyBUQnl0ZUJ1ZmZlciBjbGVhcigpIHsKKyAgICBieXRlQnVmZmVyLmNsZWFyKCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNhbGwgZmxpcCgpIG9uIHRoZSB1bmRlcmx5aW5nIE5JTyBCeXRlQnVmZmVyLgorICAgICAqLworICBwdWJsaWMgVEJ5dGVCdWZmZXIgZmxpcCgpIHsKKyAgICBieXRlQnVmZmVyLmZsaXAoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8qKgorICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCB0aGUgdW5kZXJseWluZyBOSU8gQnl0ZUJ1ZmZlciB0byBhCisgICAqIHBsYWluIG9sZCBieXRlIGFycmF5LgorICAgKi8KKyAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlW2J5dGVCdWZmZXIucmVtYWluaW5nKCldOworICAgIGJ5dGVCdWZmZXIuc2xpY2UoKS5nZXQoZGF0YSk7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBlMzJiN2RiLi5hMWZkMjQ5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiAvKioKLSAqIFRoaXMgdHJhbnNwb3J0IGlzIHdpcmUgY29tcGF0aWJsZSB3aXRoIHtAbGluayBURnJhbWVkVHJhbnNwb3J0fSwgYnV0IG1ha2VzIAorICogVGhpcyB0cmFuc3BvcnQgaXMgd2lyZSBjb21wYXRpYmxlIHdpdGgge0BsaW5rIFRGcmFtZWRUcmFuc3BvcnR9LCBidXQgbWFrZXMKICAqIHVzZSBvZiByZXVzYWJsZSwgZXhwYW5kaW5nIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgaW4gb3JkZXIgdG8gYXZvaWQKICAqIGFsbG9jYXRpbmcgbmV3IGJ5dGVbXXMgYWxsIHRoZSB0aW1lLiBTaW5jZSB0aGUgYnVmZmVycyBvbmx5IGV4cGFuZCwgeW91CiAgKiBzaG91bGQgcHJvYmFibHkgb25seSB1c2UgdGhpcyB0cmFuc3BvcnQgaWYgeW91ciBtZXNzYWdlcyBhcmUgbm90IHRvbyB2YXJpYWJseQogICogbGFyZ2UsIHVubGVzcyB0aGUgcGVyc2lzdGVudCBtZW1vcnkgY29zdCBpcyBub3QgYW4gaXNzdWUuCi0gKiAKKyAqCiAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIE5PVCB0aHJlYWRzYWZlLgogICovCiBwdWJsaWMgY2xhc3MgVEZhc3RGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKQEAgLTY1LDcgKzY1LDggQEAKIAogICBwcml2YXRlIGZpbmFsIFRUcmFuc3BvcnQgdW5kZXJseWluZzsKICAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgd3JpdGVCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogICBwcml2YXRlIGZpbmFsIGludCBtYXhMZW5ndGg7CiAKQEAgLTkxLDcgKzkyLDcgQEAKICAgfQogCiAgIC8qKgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHVuZGVybHlpbmcgVHJhbnNwb3J0IHRoYXQgcmVhbCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZ28gdGhyb3VnaCB0by4KICAgICogQHBhcmFtIGluaXRpYWxCdWZmZXJDYXBhY2l0eSBUaGUgaW5pdGlhbCBzaXplIG9mIHRoZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgogICAgKiBJbiBwcmFjdGljZSwgaXQncyBub3QgY3JpdGljYWwgdG8gc2V0IHRoaXMgdW5sZXNzIHlvdSBrbm93IGluIGFkdmFuY2UgdGhhdApAQCAtMTA0LDggKzEwNSw5IEBACiAgIHB1YmxpYyBURmFzdEZyYW1lZFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHksIGludCBtYXhMZW5ndGgpIHsKICAgICB0aGlzLnVuZGVybHlpbmcgPSB1bmRlcmx5aW5nOwogICAgIHRoaXMubWF4TGVuZ3RoID0gbWF4TGVuZ3RoOwotICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7Ci0gICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDEuNSk7CisgICAgdGhpcy5pbml0aWFsQnVmZmVyQ2FwYWNpdHkgPSBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICAgIHdyaXRlQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHksIDQpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0xNDEsMTEgKzE0MywxNCBAQAogICAgIGludCBzaXplID0gVEZyYW1lZFRyYW5zcG9ydC5kZWNvZGVGcmFtZVNpemUoaTMyYnVmKTsKIAogICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsICJSZWFkIGEgbmVnYXRpdmUgZnJhbWUgc2l6ZSAoIiArIHNpemUgKyAiKSEiKTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IG1heExlbmd0aCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uQ09SUlVQVEVEX0RBVEEsCisgICAgICAgICAgIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aCArICIpISIpOwogICAgIH0KIAogICAgIHJlYWRCdWZmZXIuZmlsbCh1bmRlcmx5aW5nLCBzaXplKTsKQEAgLTE2MSwxMiArMTY2LDE5IEBACiAgICAgcmVhZEJ1ZmZlci5jb25zdW1lQnVmZmVyKGxlbik7CiAgIH0KIAorICAvKioKKyAgICogT25seSBjbGVhcnMgdGhlIHJlYWQgYnVmZmVyIQorICAgKi8KKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgcmVhZEJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydChpbml0aWFsQnVmZmVyQ2FwYWNpdHkpOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIGludCBsZW5ndGggPSB3cml0ZUJ1ZmZlci5nZXRQb3MoKTsKLSAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShsZW5ndGgsIGkzMmJ1Zik7Ci0gICAgdW5kZXJseWluZy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHVuZGVybHlpbmcud3JpdGUod3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgbGVuZ3RoKTsKKyAgICBpbnQgcGF5bG9hZExlbmd0aCA9IHdyaXRlQnVmZmVyLmdldExlbmd0aCgpIC0gNDsgICAgICAgIAorICAgIGJ5dGVbXSBkYXRhID0gd3JpdGVCdWZmZXIuZ2V0QnVmKCkuYXJyYXkoKTsKKyAgICBURnJhbWVkVHJhbnNwb3J0LmVuY29kZUZyYW1lU2l6ZShwYXlsb2FkTGVuZ3RoLCBkYXRhKTsKKyAgICB1bmRlcmx5aW5nLndyaXRlKGRhdGEsIDAsIHBheWxvYWRMZW5ndGggKyA0KTsKICAgICB3cml0ZUJ1ZmZlci5yZXNldCgpOwogICAgIHVuZGVybHlpbmcuZmx1c2goKTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVByb2Nlc3Nvci5qYXZhCmluZGV4IDE5ZGI4OTYuLjk2MDg3ZDEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVQcm9jZXNzb3IuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlUHJvY2Vzc29yLmphdmEKQEAgLTI0LDIxICsyNCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CiAKLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiAvKioKICAqIEZpbGVQcm9jZXNzb3I6IGhlbHBzIGluIHByb2Nlc3NpbmcgZmlsZXMgZ2VuZXJhdGVkIGJ5IFRGaWxlVHJhbnNwb3J0LgogICogUG9ydCBvZiBvcmlnaW5hbCBjcHAgaW1wbGVtZW50YXRpb24KLSAqCi0gKiBAYXV0aG9yIEpveWRlZXAgU2VuIFNhcm1hIDxqc3Nhcm1hQGZhY2Vib29rLmNvbT4KICAqLwogcHVibGljIGNsYXNzIFRGaWxlUHJvY2Vzc29yIHsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCmluZGV4IGY1YWJlNTMuLmMwMTFjNTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTMzLDE5ICszMywxNyBAQAogICogSXQgbWF5IG1ha2UgYmV0dGVyIHNlbnNlIHRvIHByb3ZpZGUgYSBiYXNpYyBzdHJlYW0gYWNjZXNzIG9uIHRvcCBvZiB0aGUgZnJhbWVkIGZpbGUgZm9ybWF0CiAgKiBUaGUgRmlsZVRyYW5zcG9ydCBjYW4gdGhlbiBiZSBhIHVzZXIgb2YgdGhpcyBmcmFtZWQgZmlsZSBmb3JtYXQgd2l0aCBzb21lIGFkZGl0aW9uYWwgbG9naWMKICAqIGZvciBjaHVua2luZy4KLSAqCi0gKiBAYXV0aG9yIEpveWRlZXAgU2VuIFNhcm1hIDxqc3Nhcm1hQGZhY2Vib29rLmNvbT4KICAqLwogcHVibGljIGNsYXNzIFRGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CiAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyB0cnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewogICAgIHB1YmxpYyB2b2lkIHRydW5jKCkgewogICAgICAgcG9zID0gY291bnQgPSAwOwogICAgIH0gICAgICAgIAotICAgIHB1YmxpYyB0cnVuY2FibGVCdWZmZXJlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7CisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsKICAgICAgIHN1cGVyKGluKTsKICAgICB9Ci0gICAgcHVibGljIHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBzaXplKSB7CisgICAgcHVibGljIFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBzaXplKSB7CiAgICAgICBzdXBlcihpbiwgc2l6ZSk7CiAgICAgfQogICB9CkBAIC04Nyw3ICs4NSw3IEBACiAgICAgfQogICB9OwogCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgY2h1bmtTdGF0ZSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2h1bmtTdGF0ZSB7CiAgICAgLyoqCiAgICAgICogQ2h1bmsgU2l6ZS4gTXVzdCBiZSBzYW1lIGFjcm9zcyBhbGwgaW1wbGVtZW50YXRpb25zCiAgICAgICovCkBAIC05Niw4ICs5NCw4IEBACiAgICAgcHJpdmF0ZSBpbnQgY2h1bmtfc2l6ZV8gPSBERUZBVUxUX0NIVU5LX1NJWkU7CiAgICAgcHJpdmF0ZSBsb25nIG9mZnNldF8gPSAwOwogCi0gICAgcHVibGljIGNodW5rU3RhdGUoKSB7fQotICAgIHB1YmxpYyBjaHVua1N0YXRlKGludCBjaHVua19zaXplKSB7IGNodW5rX3NpemVfID0gY2h1bmtfc2l6ZTsgfQorICAgIHB1YmxpYyBDaHVua1N0YXRlKCkge30KKyAgICBwdWJsaWMgQ2h1bmtTdGF0ZShpbnQgY2h1bmtfc2l6ZSkgeyBjaHVua19zaXplXyA9IGNodW5rX3NpemU7IH0KIAogICAgIHB1YmxpYyB2b2lkIHNraXAoaW50IHNpemUpIHtvZmZzZXRfICs9IHNpemU7IH0KICAgICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB7b2Zmc2V0XyA9IG9mZnNldDt9CkBAIC0xMDgsNyArMTA2LDcgQEAKICAgICBwdWJsaWMgbG9uZyBnZXRPZmZzZXQoKSB7IHJldHVybiAob2Zmc2V0Xyk7fQogICB9CiAKLSAgcHVibGljIHN0YXRpYyBlbnVtIHRhaWxQb2xpY3kgeworICBwdWJsaWMgc3RhdGljIGVudW0gVGFpbFBvbGljeSB7CiAKICAgICBOT1dBSVQoMCwgMCksCiAgICAgICBXQUlUX0ZPUkVWRVIoNTAwLCAtMSk7CkBAIC0xMzMsNyArMTMxLDcgQEAKICAgICAgKiBAcGFyYW0gcmV0cmllcyBudW1iZXIgb2YgcmV0cmllcwogICAgICAqLwogCi0gICAgdGFpbFBvbGljeShpbnQgdGltZW91dCwgaW50IHJldHJpZXMpIHsKKyAgICBUYWlsUG9saWN5KGludCB0aW1lb3V0LCBpbnQgcmV0cmllcykgewogICAgICAgdGltZW91dF8gPSB0aW1lb3V0OwogICAgICAgcmV0cmllc18gPSByZXRyaWVzOwogICAgIH0KQEAgLTE0Miw3ICsxNDAsNyBAQAogICAvKioKICAgICogQ3VycmVudCB0YWlsaW5nIHBvbGljeQogICAgKi8KLSAgdGFpbFBvbGljeSBjdXJyZW50UG9saWN5XyA9IHRhaWxQb2xpY3kuTk9XQUlUOworICBUYWlsUG9saWN5IGN1cnJlbnRQb2xpY3lfID0gVGFpbFBvbGljeS5OT1dBSVQ7CiAKIAogICAvKiogCkBAIC0xNjksMTIgKzE2Nyw3IEBACiAgIC8qKgogICAgKiBjdXJyZW50IENodW5rIHN0YXRlCiAgICAqLwotICBjaHVua1N0YXRlIGNzID0gbnVsbDsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0Ci0gICAqLwotICBwcml2YXRlIGludCByZWFkVGltZW91dF8gPSAwOworICBDaHVua1N0YXRlIGNzID0gbnVsbDsKIAogICAvKioKICAgICogaXMgcmVhZCBvbmx5PwpAQCAtMTg2LDcgKzE3OSw3IEBACiAgICAqIAogICAgKiBAcmV0dXJuIGN1cnJlbnQgcmVhZCBwb2xpY3kKICAgICovCi0gIHB1YmxpYyB0YWlsUG9saWN5IGdldFRhaWxQb2xpY3koKSB7CisgIHB1YmxpYyBUYWlsUG9saWN5IGdldFRhaWxQb2xpY3koKSB7CiAgICAgcmV0dXJuIChjdXJyZW50UG9saWN5Xyk7CiAgIH0KIApAQCAtMTk2LDggKzE4OSw4IEBACiAgICAqIEBwYXJhbSBwb2xpY3kgTmV3IHBvbGljeSB0byBzZXQKICAgICogQHJldHVybiBPbGQgcG9saWN5CiAgICAqLwotICBwdWJsaWMgdGFpbFBvbGljeSBzZXRUYWlsUG9saWN5KHRhaWxQb2xpY3kgcG9saWN5KSB7Ci0gICAgdGFpbFBvbGljeSBvbGQgPSBjdXJyZW50UG9saWN5XzsKKyAgcHVibGljIFRhaWxQb2xpY3kgc2V0VGFpbFBvbGljeShUYWlsUG9saWN5IHBvbGljeSkgeworICAgIFRhaWxQb2xpY3kgb2xkID0gY3VycmVudFBvbGljeV87CiAgICAgY3VycmVudFBvbGljeV8gPSBwb2xpY3k7CiAgICAgcmV0dXJuIChvbGQpOwogICB9CkBAIC0yMTIsMTAgKzIwNSwxMCBAQAogICAgIElucHV0U3RyZWFtIGlzOwogICAgIHRyeSB7CiAgICAgICBpZihpbnB1dFN0cmVhbV8gIT0gbnVsbCkgewotICAgICAgICAoKHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0paW5wdXRTdHJlYW1fKS50cnVuYygpOworICAgICAgICAoKFRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0paW5wdXRTdHJlYW1fKS50cnVuYygpOwogICAgICAgICBpcyA9IGlucHV0U3RyZWFtXzsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlzID0gbmV3IHRydW5jYWJsZUJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgaXMgPSBuZXcgVHJ1bmNhYmxlQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dEZpbGVfLmdldElucHV0U3RyZWFtKCkpOwogICAgICAgfQogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJjcmVhdGVJbnB1dFN0cmVhbTogIitpb3guZ2V0TWVzc2FnZSgpKTsKQEAgLTIzNiw3ICsyMjksNyBAQAogICAgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkCiAgICAqLwogICBwcml2YXRlIGludCB0YWlsUmVhZChJbnB1dFN0cmVhbSBpcywgYnl0ZVtdIGJ1ZiwgCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBvZmYsIGludCBsZW4sIHRhaWxQb2xpY3kgdHApIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZiwgaW50IGxlbiwgVGFpbFBvbGljeSB0cCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIGludCBvcmlnX2xlbiA9IGxlbjsKICAgICB0cnkgewogICAgICAgaW50IHJldHJpZXMgPSAwOwpAQCAtMzY5LDExICszNjIsMTEgQEAKIAogICAgIHRyeSB7CiAgICAgICBpbnB1dFN0cmVhbV8gPSBjcmVhdGVJbnB1dFN0cmVhbSgpOwotICAgICAgY3MgPSBuZXcgY2h1bmtTdGF0ZSgpOworICAgICAgY3MgPSBuZXcgQ2h1bmtTdGF0ZSgpOwogICAgICAgY3VycmVudEV2ZW50XyA9IG5ldyBFdmVudChuZXcgYnl0ZSBbMjU2XSk7CiAKICAgICAgIGlmKCFyZWFkT25seV8pCi0gICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRPdXRwdXRTdHJlYW0oKSwgODE5Mik7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oaW5wdXRGaWxlXy5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW94KSB7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwogICAgIH0KQEAgLTU0NSw3ICs1MzgsNyBAQAogICAgIGlmKHNlZWtUb0VuZCkgewogICAgICAgLy8gd2FpdGluZyBmb3JldmVyIGhlcmUgLSBvdGhlcndpc2Ugd2UgY2FuIGhpdCBFT0YgYW5kIGVuZCB1cAogICAgICAgLy8gaGF2aW5nIGNvbnN1bWVkIHBhcnRpYWwgZGF0YSBmcm9tIHRoZSBkYXRhIHN0cmVhbS4KLSAgICAgIHRhaWxQb2xpY3kgb2xkID0gc2V0VGFpbFBvbGljeSh0YWlsUG9saWN5LldBSVRfRk9SRVZFUik7CisgICAgICBUYWlsUG9saWN5IG9sZCA9IHNldFRhaWxQb2xpY3koVGFpbFBvbGljeS5XQUlUX0ZPUkVWRVIpOwogICAgICAgd2hpbGUoY3MuZ2V0T2Zmc2V0KCkgPCBlb2ZPZmZzZXQpIHsgcmVhZEV2ZW50KCk7IH0KICAgICAgIGN1cnJlbnRFdmVudF8uc2V0QXZhaWxhYmxlKDApOwogICAgICAgc2V0VGFpbFBvbGljeShvbGQpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBjOTQ4YWE0Li5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtNDUsNyArNDUsOCBAQAogICAvKioKICAgICogQnVmZmVyIGZvciBpbnB1dAogICAgKi8KLSAgcHJpdmF0ZSBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKKyAgcHJpdmF0ZSBmaW5hbCBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlcl8gPQorICAgIG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQobmV3IGJ5dGVbMF0pOwogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKICAgICBwcml2YXRlIGludCBtYXhMZW5ndGhfOwpAQCAtNjUsMTYgKzY2LDI1IEBACiAgIH0KIAogICAvKioKKyAgICogU29tZXRoaW5nIHRvIGZpbGwgaW4gdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIGJ1ZmZlcgorICAgKiB0byBtYWtlIHJvb20gZm9yIHRoZSBmcmFtZSBzaXplLiAgVGhpcyBhbGxvd3MgdGhlCisgICAqIGltcGxlbWVudGF0aW9uIHRvIHdyaXRlIG9uY2UgaW5zdGVhZCBvZiB0d2ljZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzaXplRmlsbGVyXyA9IG5ldyBieXRlW10geyAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKyAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5zcG9ydAogICAgKi8KICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBtYXhMZW5ndGgpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKICAgICBtYXhMZW5ndGhfID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC05MCwxMSArMTAwLDkgQEAKICAgfQogCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlYWRCdWZmZXJfICE9IG51bGwpIHsKLSAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgaWYgKGdvdCA+IDApIHsKLSAgICAgICAgcmV0dXJuIGdvdDsKLSAgICAgIH0KKyAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICBpZiAoZ290ID4gMCkgeworICAgICAgcmV0dXJuIGdvdDsKICAgICB9CiAKICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQpAQCAtMTIzLDYgKzEzMSwxMCBAQAogICAgIHJlYWRCdWZmZXJfLmNvbnN1bWVCdWZmZXIobGVuKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXJfLmNsZWFyKCk7CisgIH0KKwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs0XTsKIAogICBwcml2YXRlIHZvaWQgcmVhZEZyYW1lKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtMTMwLDExICsxNDIsMTQgQEAKICAgICBpbnQgc2l6ZSA9IGRlY29kZUZyYW1lU2l6ZShpMzJidWYpOwogCiAgICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKCIgKyBzaXplICsgIikhIik7CisgICAgICBjbG9zZSgpOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplICgiICsgc2l6ZSArICIpISIpOwogICAgIH0KIAogICAgIGlmIChzaXplID4gbWF4TGVuZ3RoXykgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkZyYW1lIHNpemUgKCIgKyBzaXplICsgIikgbGFyZ2VyIHRoYW4gbWF4IGxlbmd0aCAoIiArIG1heExlbmd0aF8gKyAiKSEiKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICJGcmFtZSBzaXplICgiICsgc2l6ZSArICIpIGxhcmdlciB0aGFuIG1heCBsZW5ndGggKCIgKyBtYXhMZW5ndGhfICsgIikhIik7CiAgICAgfQogCiAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtzaXplXTsKQEAgLTE0OSwxMiArMTY0LDEyIEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICBieXRlW10gYnVmID0gd3JpdGVCdWZmZXJfLmdldCgpOwotICAgIGludCBsZW4gPSB3cml0ZUJ1ZmZlcl8ubGVuKCk7CisgICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKSAtIDQ7ICAgICAgIC8vIGFjY291bnQgZm9yIHRoZSBwcmVwZW5kZWQgZnJhbWUgc2l6ZQogICAgIHdyaXRlQnVmZmVyXy5yZXNldCgpOworICAgIHdyaXRlQnVmZmVyXy53cml0ZShzaXplRmlsbGVyXywgMCwgNCk7ICAvLyBtYWtlIHJvb20gZm9yIHRoZSBuZXh0IGZyYW1lJ3Mgc2l6ZSBkYXRhCiAKLSAgICBlbmNvZGVGcmFtZVNpemUobGVuLCBpMzJidWYpOwotICAgIHRyYW5zcG9ydF8ud3JpdGUoaTMyYnVmLCAwLCA0KTsKLSAgICB0cmFuc3BvcnRfLndyaXRlKGJ1ZiwgMCwgbGVuKTsKKyAgICBlbmNvZGVGcmFtZVNpemUobGVuLCBidWYpOyAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZnJhbWUgbGVuZ3RoIHdpdGhvdXQgdGhlIGZpbGxlcgorICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4gKyA0KTsgICAgICAvLyB3ZSBoYXZlIHRvIHdyaXRlIHRoZSBmcmFtZSBzaXplIGFuZCBmcmFtZSBkYXRhCiAgICAgdHJhbnNwb3J0Xy5mbHVzaCgpOwogICB9CiAKQEAgLTE2Niw3ICsxODEsNyBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZGVjb2RlRnJhbWVTaXplKGZpbmFsIGJ5dGVbXSBidWYpIHsKLSAgICByZXR1cm4gCisgICAgcmV0dXJuCiAgICAgICAoKGJ1ZlswXSAmIDB4ZmYpIDw8IDI0KSB8CiAgICAgICAoKGJ1ZlsxXSAmIDB4ZmYpIDw8IDE2KSB8CiAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8ICA4KSB8CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKaW5kZXggMzBmNTllZS4uYzMwNjNmZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKIGltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKIGltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKQEAgLTM2LDcgKzM3LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5CeXRlQXJyYXlFbnRpdHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5Db3JlQ29ubmVjdGlvblBOYW1lczsKLWltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5FbnRpdHlVdGlsczsKIAogLyoqCiAgKiBIVFRQIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4gVXNlZCBmb3Igd29ya2luZyB3aXRoIGEKQEAgLTE5Nyw2ICsxOTcsMjIgQEAKICAgICByZXF1ZXN0QnVmZmVyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKICAgfQogCisgIC8qKgorICAgKiBjb3B5IGZyb20gb3JnLmFwYWNoZS5odHRwLnV0aWwuRW50aXR5VXRpbHMjY29uc3VtZS4gQW5kcm9pZCBoYXMgaXQncyBvd24gaHR0cGNvcmUKKyAgICogdGhhdCBkb2Vzbid0IGhhdmUgYSBjb25zdW1lLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb25zdW1lKGZpbmFsIEh0dHBFbnRpdHkgZW50aXR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgaWYgKGVudGl0eSA9PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKGVudGl0eS5pc1N0cmVhbWluZygpKSB7CisgICAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgIGlmIChpbnN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisKICAgcHJpdmF0ZSB2b2lkIGZsdXNoVXNpbmdIdHRwQ2xpZW50KCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIAogICAgIGlmIChudWxsID09IHRoaXMuY2xpZW50KSB7CkBAIC0yNjYsNyArMjgyLDcgQEAKICAgICAgIAogICAgICAgdHJ5IHsKICAgICAgICAgLy8gSW5kaWNhdGUgd2UncmUgZG9uZSB3aXRoIHRoZSBjb250ZW50LgotICAgICAgICBFbnRpdHlVdGlscy5jb25zdW1lKHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgY29uc3VtZShyZXNwb25zZS5nZXRFbnRpdHkoKSk7CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgLy8gV2UgaWdub3JlIHRoaXMgZXhjZXB0aW9uLCBpdCBtaWdodCBvbmx5IG1lYW4gdGhlIHNlcnZlciBoYXMgbm8KICAgICAgICAgLy8ga2VlcC1hbGl2ZSBjYXBhYmlsaXR5LgpAQCAtMjg4LDYgKzMwNCw5IEBACiAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgaWYgKHBvc3QgIT0gbnVsbCkgeworICAgICAgICBwb3N0LnJlbGVhc2VDb25uZWN0aW9uKCk7CisgICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKaW5kZXggNTMzNTRhZi4uYjE5YWM4NiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKQEAgLTIwLDcgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgpAQCAtMzAsNiArMzAsOCBAQAogICAgKiBDcmVhdGUgYSBUTWVtb3J5QnVmZmVyIHdpdGggYW4gaW5pdGlhbCBidWZmZXIgc2l6ZSBvZiA8aT5zaXplPC9pPi4gVGhlCiAgICAqIGludGVybmFsIGJ1ZmZlciB3aWxsIGdyb3cgYXMgbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBzaXplIG9mIHRoZSBkYXRhCiAgICAqIGJlaW5nIHdyaXR0ZW4gdG8gaXQuCisgICAqCisgICAqIEBwYXJhbSBzaXplIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlcgogICAgKi8KICAgcHVibGljIFRNZW1vcnlCdWZmZXIoaW50IHNpemUpIHsKICAgICBhcnJfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc2l6ZSk7CkBAIC02OSwyMCArNzEsMjAgQEAKICAgLyoqCiAgICAqIE91dHB1dCB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcsIHVzaW5nIHRoZSBzdXBwbGllZAogICAgKiBlbmNvZGluZwotICAgKiBAcGFyYW0gZW5jICB0aGUgZW5jb2RpbmcgdG8gdXNlCisgICAqIEBwYXJhbSBjaGFyc2V0IHRoZSBlbmNvZGluZyB0byB1c2UKICAgICogQHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgYSBTdHJpbmcKICAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGVuYyk7CisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIGFycl8udG9TdHJpbmcoY2hhcnNldCk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGluc3BlY3QoKSB7Ci0gICAgU3RyaW5nIGJ1ZiA9ICIiOworICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICBieXRlW10gYnl0ZXMgPSBhcnJfLnRvQnl0ZUFycmF5KCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgYnVmICs9IChwb3NfID09IGkgPyAiPT0+IiA6ICIiICkgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhmZikgKyAiICI7CisgICAgICBidWYuYXBwZW5kKHBvc18gPT0gaSA/ICI9PT4iIDogIiIgKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhieXRlc1tpXSAmIDB4ZmYpKS5hcHBlbmQoIiAiKTsKICAgICB9Ci0gICAgcmV0dXJuIGJ1ZjsKKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CiAgIH0KIAogICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKaW5kZXggMjViNDg3ZS4uZWY4MmFjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCkBAIC0zNyw3ICszNyw3IEBACiAgKiBXcmFwcGVyIGFyb3VuZCBTZXJ2ZXJTb2NrZXRDaGFubmVsCiAgKi8KIHB1YmxpYyBjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmNsYXNzLmdldE5hbWUoKSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY2xhc3MuZ2V0TmFtZSgpKTsKIAogICAvKioKICAgICogVGhpcyBjaGFubmVsIGlzIHdoZXJlIGFsbCB0aGUgbm9uYmxvY2tpbmcgbWFnaWMgaGFwcGVucy4KQEAgLTU0LDYgKzU0LDkgQEAKICAgICovCiAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXRfID0gMDsKIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzIGV4dGVuZHMKKyAgICAgIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncz4ge30KKwogICAvKioKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAogICAgKi8KQEAgLTY1LDcgKzY4LDcgQEAKICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAogICAgKi8KICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICB0aGlzKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwb3J0KSwgY2xpZW50VGltZW91dCk7CisgICAgdGhpcyhuZXcgTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOwogICB9CiAKICAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtNzMsNyArNzYsMTEgQEAKICAgfQogCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoSW5ldFNvY2tldEFkZHJlc3MgYmluZEFkZHIsIGludCBjbGllbnRUaW1lb3V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICAgIHRoaXMobmV3IE5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkuYmluZEFkZHIoYmluZEFkZHIpLmNsaWVudFRpbWVvdXQoY2xpZW50VGltZW91dCkpOworICB9CisKKyAgcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChOb25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncyBhcmdzKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgY2xpZW50VGltZW91dF8gPSBhcmdzLmNsaWVudFRpbWVvdXQ7CiAgICAgdHJ5IHsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTsKICAgICAgIHNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOwpAQCAtODMsMTAgKzkwLDEwIEBACiAgICAgICAvLyBQcmV2ZW50IDJNU0wgZGVsYXkgcHJvYmxlbSBvbiBzZXJ2ZXIgcmVzdGFydHMKICAgICAgIHNlcnZlclNvY2tldF8uc2V0UmV1c2VBZGRyZXNzKHRydWUpOwogICAgICAgLy8gQmluZCB0byBsaXN0ZW5pbmcgcG9ydAotICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGJpbmRBZGRyKTsKKyAgICAgIHNlcnZlclNvY2tldF8uYmluZChhcmdzLmJpbmRBZGRyLCBhcmdzLmJhY2tsb2cpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgc2VydmVyU29ja2V0XyA9IG51bGw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCkBAIC0xNDcsNCArMTU0LDEwIEBACiAgICAgY2xvc2UoKTsKICAgfQogCisgIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKKyAgICBpZiAoc2VydmVyU29ja2V0XyA9PSBudWxsKQorICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBzZXJ2ZXJTb2NrZXRfLmdldExvY2FsUG9ydCgpOworICB9CisKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NvY2tldC5qYXZhCmluZGV4IDQ4MmJkMTQuLmY4NmE0OGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTb2NrZXQuamF2YQpAQCAtNTUsNyArNTUsNiBAQAogICAgKiBDcmVhdGUgYSBuZXcgbm9uYmxvY2tpbmcgc29ja2V0IHRyYW5zcG9ydCB0aGF0IHdpbGwgYmUgY29ubmVjdGVkIHRvIGhvc3Q6cG9ydC4KICAgICogQHBhcmFtIGhvc3QKICAgICogQHBhcmFtIHBvcnQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICovCiAgIHB1YmxpYyBUTm9uYmxvY2tpbmdTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTg1LDYgKzg0LDcgQEAKICAgICBTb2NrZXQgc29ja2V0ID0gc29ja2V0Q2hhbm5lbC5zb2NrZXQoKTsKICAgICBzb2NrZXQuc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgIHNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSk7CiAgICAgc2V0VGltZW91dCh0aW1lb3V0KTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggMjVkZjk3Zi4uMjIzMmEzMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMjAsOCArMjAsMTQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQgamF2YXgubmV0LnNzbC5LZXlNYW5hZ2VyRmFjdG9yeTsKIGltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CkBAIC0zMiw3ICszOCw3IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5OwogCiAvKioKLSAqICBBIEZhY3RvcnkgZm9yIHByb3ZpZGluZyBhbmQgc2V0dGluZyB1cCBDbGllbnQgYW5kIFNlcnZlciBTU0wgd3JhcHBlZCAKKyAqICBBIEZhY3RvcnkgZm9yIHByb3ZpZGluZyBhbmQgc2V0dGluZyB1cCBDbGllbnQgYW5kIFNlcnZlciBTU0wgd3JhcHBlZAogICogIFRTb2NrZXQgYW5kIFRTZXJ2ZXJTb2NrZXQKICAqLwogcHVibGljIGNsYXNzIFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKQEAgLTQxLDI0ICs0NywyNCBAQAogICAgKiBHZXQgYSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydC4gSW4gdGhpcwogICAgKiBjb25maWd1cmF0aW9uIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZSB1c2VkLiBEZWZhdWx0IHNldHRpbmdzIGFyZSByZXRyaWV2ZWQKICAgICogZnJvbSBTeXN0ZW0gcHJvcGVydGllcyB0aGF0IGFyZSBzZXQuCi0gICAqIAorICAgKgogICAgKiBFeGFtcGxlIHN5c3RlbSBwcm9wZXJ0aWVzOgotICAgKiAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT08dHJ1c3RzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9Jmx0O3RydXN0c3RvcmUgbG9jYXRpb24mZ3Q7CiAgICAqIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KKyAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSZsdDtrZXlzdG9yZSBsb2NhdGlvbiZndDsKICAgICogLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9cGFzc3dvcmQKLSAgICogCisgICAqCiAgICAqIEBwYXJhbSBwb3J0CiAgICAqIEByZXR1cm4gQSBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0CiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHN0YXRpYyBUU2VydmVyU29ja2V0IGdldFNlcnZlclNvY2tldChpbnQgcG9ydCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewotICAgIHJldHVybiBnZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7IAorICAgIHJldHVybiBnZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7CiAgIH0KIAogICAvKioKICAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydAotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHBvcnQKICAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKICAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQKQEAgLTcwLDcgKzc2LDcgQEAKIAogICAvKioKICAgICogR2V0IGEgZGVmYXVsdCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gY2xpZW50VGltZW91dAogICAgKiBAcGFyYW0gaWZBZGRyZXNzCkBAIC03OSwxNCArODUsMTQgQEAKICAgICovCiAgIHB1YmxpYyBzdGF0aWMgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsIGludCBjbGllbnRUaW1lb3V0LCBib29sZWFuIGNsaWVudEF1dGgsIEluZXRBZGRyZXNzIGlmQWRkcmVzcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTFNlcnZlclNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IChTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5KSBTU0xTZXJ2ZXJTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICByZXR1cm4gY3JlYXRlU2VydmVyKGZhY3RvcnksIHBvcnQsIGNsaWVudFRpbWVvdXQsIGNsaWVudEF1dGgsIGlmQWRkcmVzcywgbnVsbCk7IAorICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIoZmFjdG9yeSwgcG9ydCwgY2xpZW50VGltZW91dCwgY2xpZW50QXV0aCwgaWZBZGRyZXNzLCBudWxsKTsKICAgfQogCiAgIC8qKgotICAgKiBHZXQgYSBjb25maWd1cmVkIFNTTCB3cmFwcGVkIFRTZXJ2ZXJTb2NrZXQgYm91bmQgdG8gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBpbnRlcmZhY2UuIAotICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLCAKKyAgICogR2V0IGEgY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU2VydmVyU29ja2V0IGJvdW5kIHRvIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgaW50ZXJmYWNlLgorICAgKiBIZXJlIHRoZSBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgdGhlIHZhbHVlcyBmb3IgdGhlIGFsZ29yaXRobXMsIGtleXN0b3JlLAogICAgKiB0cnVzdHN0b3JlIGFuZCBvdGhlciBzZXR0aW5ncwotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHBvcnQKICAgICogQHBhcmFtIGNsaWVudFRpbWVvdXQKICAgICogQHBhcmFtIGlmQWRkcmVzcwpAQCAtMTEyLDcgKzExOCw4IEBACiAgICAgICBpZiAocGFyYW1zICE9IG51bGwgJiYgcGFyYW1zLmNpcGhlclN1aXRlcyAhPSBudWxsKSB7CiAgICAgICAgIHNlcnZlclNvY2tldC5zZXRFbmFibGVkQ2lwaGVyU3VpdGVzKHBhcmFtcy5jaXBoZXJTdWl0ZXMpOwogICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBUU2VydmVyU29ja2V0KHNlcnZlclNvY2tldCwgdGltZW91dCk7CisgICAgICByZXR1cm4gbmV3IFRTZXJ2ZXJTb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQuU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLgorICAgICAgICBzZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KS5jbGllbnRUaW1lb3V0KHRpbWVvdXQpKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBiaW5kIHRvIHBvcnQgIiArIHBvcnQsIGUpOwogICAgIH0KQEAgLTEyMCw5ICsxMjcsOSBAQAogCiAgIC8qKgogICAgKiBHZXQgYSBkZWZhdWx0IFNTTCB3cmFwcGVkIFRTb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBhbmQgcG9ydC4gQWxsCi0gICAqIHRoZSBjbGllbnQgbWV0aG9kcyByZXR1cm4gYSBib3VuZCBjb25uZWN0aW9uLiBTbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGwgb3BlbigpIG9uIHRoZSAKKyAgICogdGhlIGNsaWVudCBtZXRob2RzIHJldHVybiBhIGJvdW5kIGNvbm5lY3Rpb24uIFNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsbCBvcGVuKCkgb24gdGhlCiAgICAqIFRUcmFuc3BvcnQuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gdGltZW91dApAQCAtMTM2LDcgKzE0Myw3IEBACiAKICAgLyoqCiAgICAqIEdldCBhIGRlZmF1bHQgU1NMIHdyYXBwZWQgVFNvY2tldCBjb25uZWN0ZWQgdG8gdGhlIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIGhvc3QKICAgICogQHBhcmFtIHBvcnQKICAgICogQHJldHVybiBBIFNTTCB3cmFwcGVkIFRTb2NrZXQKQEAgLTE0Nyw5ICsxNTQsOSBAQAogICB9CiAKICAgLyoqCi0gICAqIEdldCBhIGN1c3RvbSBjb25maWd1cmVkIFNTTCB3cmFwcGVkIFRTb2NrZXQuIFRoZSBTU0wgc2V0dGluZ3MgYXJlIG9idGFpbmVkIGZyb20gdGhlIAorICAgKiBHZXQgYSBjdXN0b20gY29uZmlndXJlZCBTU0wgd3JhcHBlZCBUU29ja2V0LiBUaGUgU1NMIHNldHRpbmdzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZQogICAgKiBwYXNzZWQgaW4gVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMuCi0gICAqIAorICAgKgogICAgKiBAcGFyYW0gaG9zdAogICAgKiBAcGFyYW0gcG9ydAogICAgKiBAcGFyYW0gdGltZW91dApAQCAtMTY4LDYgKzE3NSw5IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgU1NMQ29udGV4dCBjcmVhdGVTU0xDb250ZXh0KFRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIFNTTENvbnRleHQgY3R4OworICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKKyAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CisKICAgICB0cnkgewogICAgICAgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZShwYXJhbXMucHJvdG9jb2wpOwogICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0bWYgPSBudWxsOwpAQCAtMTc2LDE0ICsxODYsMjUgQEAKICAgICAgIGlmIChwYXJhbXMuaXNUcnVzdFN0b3JlU2V0KSB7CiAgICAgICAgIHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0TWFuYWdlclR5cGUpOwogICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKHBhcmFtcy50cnVzdFN0b3JlVHlwZSk7Ci0gICAgICAgIHRzLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSksIHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSk7CisgICAgICAgIGlmIChwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgaW4gPSBwYXJhbXMudHJ1c3RTdG9yZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbiA9IGdldFN0b3JlQXNTdHJlYW0ocGFyYW1zLnRydXN0U3RvcmUpOworICAgICAgICB9CisgICAgICAgIHRzLmxvYWQoaW4sCisgICAgICAgICAgICAgICAgKHBhcmFtcy50cnVzdFBhc3MgIT0gbnVsbCA/IHBhcmFtcy50cnVzdFBhc3MudG9DaGFyQXJyYXkoKSA6IG51bGwpKTsKICAgICAgICAgdG1mLmluaXQodHMpOwogICAgICAgfQogCiAgICAgICBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKICAgICAgICAga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLmtleU1hbmFnZXJUeXBlKTsKICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShwYXJhbXMua2V5U3RvcmVUeXBlKTsKLSAgICAgICAga3MubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHBhcmFtcy5rZXlTdG9yZSksIHBhcmFtcy5rZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBpZiAocGFyYW1zLmtleVN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgCWlzID0gcGFyYW1zLmtleVN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAJaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIH0KKyAgICAgICAga3MubG9hZChpcywgcGFyYW1zLmtleVBhc3MudG9DaGFyQXJyYXkoKSk7CiAgICAgICAgIGttZi5pbml0KGtzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgIH0KIApAQCAtMTk5LDEwICsyMjAsNTAgQEAKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGhlIHRyYW5zcG9ydCIsIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoaXMgIT0gbnVsbCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorCiAgICAgcmV0dXJuIGN0eDsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFN0b3JlQXNTdHJlYW0oU3RyaW5nIHN0b3JlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShzdG9yZSk7CisgICAgfSBjYXRjaChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgIH0KKworICAgIElucHV0U3RyZWFtIHN0b3JlU3RyZWFtID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgc3RvcmVTdHJlYW0gPSBuZXcgVVJMKHN0b3JlKS5vcGVuU3RyZWFtKCk7CisgICAgICBpZiAoc3RvcmVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gc3RvcmVTdHJlYW07CisgICAgICB9CisgICAgfSBjYXRjaChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgIH0KKworICAgIHN0b3JlU3RyZWFtID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHN0b3JlKTsKKworICAgIGlmIChzdG9yZVN0cmVhbSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gc3RvcmVTdHJlYW07CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgZmlsZTogIiArIHN0b3JlKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBUU29ja2V0IGNyZWF0ZUNsaWVudChTU0xTb2NrZXRGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewogICAgICAgU1NMU29ja2V0IHNvY2tldCA9IChTU0xTb2NrZXQpIGZhY3RvcnkuY3JlYXRlU29ja2V0KGhvc3QsIHBvcnQpOwpAQCAtMjIwLDEwICsyODEsMTIgQEAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyB7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9ICJUTFMiOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5UGFzczsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleU1hbmFnZXJUeXBlID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmVUeXBlID0gIkpLUyI7CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFN0b3JlOworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RQYXNzOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUgPSAiSktTIjsKQEAgLTIzNiw3ICsyOTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIHBhcmFtZXRlcnMgc3BlY2lmeWluZyB0aGUgcHJvdG9jb2wgYW5kIGNpcGhlciBzdWl0ZXMKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBwcm90b2NvbCBUaGUgc3BlY2lmaWMgcHJvdG9jb2wgKFRMUy9TU0wpIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB2ZXJzaW9ucwogICAgICAqIEBwYXJhbSBjaXBoZXJTdWl0ZXMKICAgICAgKi8KQEAgLTI0Nyw3ICszMTAsNyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIHByb3RvY29sLCBjaXBoZXIgc3VpdGVzIGFuZCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24KICAgICAgKiBpcyByZXF1aXJlZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHByb3RvY29sIFRoZSBzcGVjaWZpYyBwcm90b2NvbCAoVExTL1NTTCkgY2FuIGJlIHNwZWNpZmllZCB3aXRoIHZlcnNpb25zCiAgICAgICogQHBhcmFtIGNpcGhlclN1aXRlcwogICAgICAqIEBwYXJhbSBjbGllbnRBdXRoCkBAIC0yNTYsMTMgKzMxOSwxMyBAQAogICAgICAgaWYgKHByb3RvY29sICE9IG51bGwpIHsKICAgICAgICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sOwogICAgICAgfQotICAgICAgdGhpcy5jaXBoZXJTdWl0ZXMgPSBjaXBoZXJTdWl0ZXM7CisgICAgICB0aGlzLmNpcGhlclN1aXRlcyA9IGNpcGhlclN1aXRlcyAhPSBudWxsID8gQXJyYXlzLmNvcHlPZihjaXBoZXJTdWl0ZXMsIGNpcGhlclN1aXRlcy5sZW5ndGgpIDogbnVsbDsKICAgICAgIHRoaXMuY2xpZW50QXV0aCA9IGNsaWVudEF1dGg7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCi0gICAgICogCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5U3RvcmUgTG9jYXRpb24gb2YgdGhlIEtleXN0b3JlIG9uIGRpc2sKICAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAogICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CkBAIC0yNzksMjAgKzM0Miw0MyBAQAogICAgICAgfQogICAgICAgaXNLZXlTdG9yZVNldCA9IHRydWU7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSBrZXlNYW5hZ2VyVHlwZSBUaGUgZGVmYXVsdCBpcyBYNTA5CisgICAgICogQHBhcmFtIGtleVN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShJbnB1dFN0cmVhbSBrZXlTdG9yZVN0cmVhbSwgU3RyaW5nIGtleVBhc3MsIFN0cmluZyBrZXlNYW5hZ2VyVHlwZSwgU3RyaW5nIGtleVN0b3JlVHlwZSkgeworICAgIAl0aGlzLmtleVN0b3JlU3RyZWFtID0ga2V5U3RvcmVTdHJlYW07CisgICAgCXNldEtleVN0b3JlKCIiLCBrZXlQYXNzLCBrZXlNYW5hZ2VyVHlwZSwga2V5U3RvcmVUeXBlKTsKKyAgICB9CisgICAgCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBrZXlTdG9yZSBMb2NhdGlvbiBvZiB0aGUgS2V5c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoU3RyaW5nIGtleVN0b3JlLCBTdHJpbmcga2V5UGFzcykgewogICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmUsIGtleVBhc3MsIG51bGwsIG51bGwpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVTdHJlYW0gS2V5c3RvcmUgY29udGVudCBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0ga2V5UGFzcyBLZXlzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEtleVN0b3JlKElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtLCBTdHJpbmcga2V5UGFzcykgeworICAgICAgc2V0S2V5U3RvcmUoa2V5U3RvcmVTdHJlYW0sIGtleVBhc3MsIG51bGwsIG51bGwpOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRydXN0U3RvcmUgTG9jYXRpb24gb2YgdGhlIFRydXN0c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAogICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKQEAgLTMwOSwyNCArMzk1LDQ3IEBACiAgICAgICB9CiAgICAgICBpc1RydXN0U3RvcmVTZXQgPSB0cnVlOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqIEBwYXJhbSB0cnVzdE1hbmFnZXJUeXBlIFRoZSBkZWZhdWx0IGlzIFg1MDkKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVR5cGUgVGhlIGRlZmF1bHQgaXMgSktTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzLCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSwgU3RyaW5nIHRydXN0U3RvcmVUeXBlKSB7CisgICAgICB0aGlzLnRydXN0U3RvcmVTdHJlYW0gPSB0cnVzdFN0b3JlU3RyZWFtOworICAgICAgc2V0VHJ1c3RTdG9yZSgiIiwgdHJ1c3RQYXNzLCB0cnVzdE1hbmFnZXJUeXBlLCB0cnVzdFN0b3JlVHlwZSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAotICAgICAqIAorICAgICAqCiAgICAgICogQHBhcmFtIHRydXN0U3RvcmUgTG9jYXRpb24gb2YgdGhlIFRydXN0c3RvcmUgb24gZGlzawogICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoU3RyaW5nIHRydXN0U3RvcmUsIFN0cmluZyB0cnVzdFBhc3MpIHsKICAgICAgIHNldFRydXN0U3RvcmUodHJ1c3RTdG9yZSwgdHJ1c3RQYXNzLCBudWxsLCBudWxsKTsKICAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSB0cnVzdHN0b3JlIGFuZCBwYXNzd29yZAorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVTdHJlYW0gVHJ1c3RzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSB0cnVzdFBhc3MgVHJ1c3RzdG9yZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRydXN0U3RvcmUoSW5wdXRTdHJlYW0gdHJ1c3RTdG9yZVN0cmVhbSwgU3RyaW5nIHRydXN0UGFzcykgeworICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlU3RyZWFtLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldCBpZiBjbGllbnQgYXV0aGVudGljYXRpb24gaXMgcmVxdWlyZWQKLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBjbGllbnRBdXRoCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVxdWlyZUNsaWVudEF1dGgoYm9vbGVhbiBjbGllbnRBdXRoKSB7CiAgICAgICB0aGlzLmNsaWVudEF1dGggPSBjbGllbnRBdXRoOwotICAgIH0KLSAgfQorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCmluZGV4IDVhYTBjY2QuLjRiMWNhMGEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOwpAQCAtOTYsNyArOTcsNyBAQAogICAgIExPR0dFUi5kZWJ1ZygiU2VuZGluZyBtZWNoYW5pc20gbmFtZSB7fSBhbmQgaW5pdGlhbCByZXNwb25zZSBvZiBsZW5ndGgge30iLCBtZWNoYW5pc20sCiAgICAgICAgIGluaXRpYWxSZXNwb25zZS5sZW5ndGgpOwogCi0gICAgYnl0ZVtdIG1lY2hhbmlzbUJ5dGVzID0gbWVjaGFuaXNtLmdldEJ5dGVzKCk7CisgICAgYnl0ZVtdIG1lY2hhbmlzbUJ5dGVzID0gbWVjaGFuaXNtLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIHNlbmRTYXNsTWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5TVEFSVCwKICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtQnl0ZXMpOwogICAgIC8vIFNlbmQgaW5pdGlhbCByZXNwb25zZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCmluZGV4IDFhNzRkNTMuLjM5YjgxY2EgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTEyNiwxNiArMTI3LDE2IEBACiAKICAgICBMT0dHRVIuZGVidWcoIlJlY2VpdmVkIHN0YXJ0IG1lc3NhZ2Ugd2l0aCBzdGF0dXMge30iLCBtZXNzYWdlLnN0YXR1cyk7CiAgICAgaWYgKG1lc3NhZ2Uuc3RhdHVzICE9IE5lZ290aWF0aW9uU3RhdHVzLlNUQVJUKSB7Ci0gICAgICBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiRXhwZWN0aW5nIFNUQVJUIHN0YXR1cywgcmVjZWl2ZWQgIiArIG1lc3NhZ2Uuc3RhdHVzKTsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuRVJST1IsICJFeHBlY3RpbmcgU1RBUlQgc3RhdHVzLCByZWNlaXZlZCAiICsgbWVzc2FnZS5zdGF0dXMpOwogICAgIH0KIAogICAgIC8vIEdldCB0aGUgbWVjaGFuaXNtIG5hbWUuCi0gICAgU3RyaW5nIG1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCk7CisgICAgU3RyaW5nIG1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgVFNhc2xTZXJ2ZXJEZWZpbml0aW9uIHNlcnZlckRlZmluaXRpb24gPSBzZXJ2ZXJEZWZpbml0aW9uTWFwLmdldChtZWNoYW5pc21OYW1lKTsKICAgICBMT0dHRVIuZGVidWcoIlJlY2VpdmVkIG1lY2hhbmlzbSBuYW1lICd7fSciLCBtZWNoYW5pc21OYW1lKTsKIAogICAgIGlmIChzZXJ2ZXJEZWZpbml0aW9uID09IG51bGwpIHsKLSAgICAgIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuQkFELCAiVW5zdXBwb3J0ZWQgbWVjaGFuaXNtIHR5cGUgIiArIG1lY2hhbmlzbU5hbWUpOworICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5CQUQsICJVbnN1cHBvcnRlZCBtZWNoYW5pc20gdHlwZSAiICsgbWVjaGFuaXNtTmFtZSk7CiAgICAgfQogICAgIFNhc2xTZXJ2ZXIgc2FzbFNlcnZlciA9IFNhc2wuY3JlYXRlU2FzbFNlcnZlcihzZXJ2ZXJEZWZpbml0aW9uLm1lY2hhbmlzbSwKICAgICAgICAgc2VydmVyRGVmaW5pdGlvbi5wcm90b2NvbCwgc2VydmVyRGVmaW5pdGlvbi5zZXJ2ZXJOYW1lLCBzZXJ2ZXJEZWZpbml0aW9uLnByb3BzLApAQCAtMTQ1LDcgKzE0Niw3IEBACiAKICAgLyoqCiAgICAqIDxjb2RlPlRUcmFuc3BvcnRGYWN0b3J5PC9jb2RlPiB0byBjcmVhdGUKLSAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnRzPGMvb2RlPi4gRW5zdXJlcyB0aGF0IGEgZ2l2ZW4KKyAgICogPGNvZGU+VFNhc2xTZXJ2ZXJUcmFuc3BvcnRzPC9jb2RlPi4gRW5zdXJlcyB0aGF0IGEgZ2l2ZW4KICAgICogdW5kZXJseWluZyA8Y29kZT5UVHJhbnNwb3J0PC9jb2RlPiBpbnN0YW5jZSByZWNlaXZlcyB0aGUgc2FtZQogICAgKiA8Y29kZT5UU2FzbFNlcnZlclRyYW5zcG9ydDwvY29kZT4uIFRoaXMgaXMga2luZCBvZiBhbiBhd2Z1bCBoYWNrIHRvIHdvcmsKICAgICogYXJvdW5kIHRoZSBmYWN0IHRoYXQgVGhyaWZ0IGlzIGRlc2lnbmVkIGFzc3VtaW5nIHRoYXQKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQppbmRleCBiNTQ3NDZjLi5iZWQzYjM5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0zNSw3ICszNSw3IEBACiAKIC8qKgogICogQSBzdXBlcmNsYXNzIGZvciBTQVNMIGNsaWVudC9zZXJ2ZXIgdGhyaWZ0IHRyYW5zcG9ydHMuIEEgc3ViY2xhc3MgbmVlZCBvbmx5Ci0gKiBpbXBsZW1lbnQgdGhlIDxjb2RlPm9wZW48L29wZW4+IG1ldGhvZC4KKyAqIGltcGxlbWVudCB0aGUgPGNvZGU+b3BlbjwvY29kZT4gbWV0aG9kLgogICovCiBhYnN0cmFjdCBjbGFzcyBUU2FzbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgLyoqCiAgICAqIENyZWF0ZSBhIFRTYXNsVHJhbnNwb3J0LiBJdCdzIGFzc3VtZWQgdGhhdCBzZXRTYXNsU2VydmVyIHdpbGwgYmUgY2FsbGVkCiAgICAqIGxhdGVyIHRvIGluaXRpYWxpemUgdGhlIFNBU0wgZW5kcG9pbnQgdW5kZXJseWluZyB0aGlzIHRyYW5zcG9ydC4KLSAgICogCisgICAqCiAgICAqIEBwYXJhbSB1bmRlcmx5aW5nVHJhbnNwb3J0CiAgICAqICAgICAgICAgIFRoZSB0aHJpZnQgdHJhbnNwb3J0IHdoaWNoIHRoaXMgdHJhbnNwb3J0IGlzIHdyYXBwaW5nLgogICAgKi8KQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAgIC8qKgogICAgKiBDcmVhdGUgYSBUU2FzbFRyYW5zcG9ydCB3aGljaCBhY3RzIGFzIGEgY2xpZW50LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHNhc2xDbGllbnQKICAgICogICAgICAgICAgVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+IHdoaWNoIHRoaXMgdHJhbnNwb3J0IHdpbGwgdXNlIGZvciBTQVNMCiAgICAqICAgICAgICAgIG5lZ290aWF0aW9uLgpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKICAgLyoqCiAgICAqIFNlbmQgYSBjb21wbGV0ZSBUaHJpZnQgU0FTTCBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHN0YXR1cwogICAgKiAgICAgICAgICBUaGUgc3RhdHVzIHRvIHNlbmQuCiAgICAqIEBwYXJhbSBwYXlsb2FkCkBAIC0xNTgsOSArMTU4LDkgQEAKICAgICBtZXNzYWdlSGVhZGVyWzBdID0gc3RhdHVzLmdldFZhbHVlKCk7CiAgICAgRW5jb2RpbmdVdGlscy5lbmNvZGVCaWdFbmRpYW4ocGF5bG9hZC5sZW5ndGgsIG1lc3NhZ2VIZWFkZXIsIFNUQVRVU19CWVRFUyk7CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKG1lc3NhZ2VIZWFkZXIpOwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQud3JpdGUocGF5bG9hZCk7CiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5mbHVzaCgpOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAKICAgLyoqCiAgICAqIFJlYWQgYSBjb21wbGV0ZSBUaHJpZnQgU0FTTCBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHJldHVybiBUaGUgU0FTTCBzdGF0dXMgYW5kIHBheWxvYWQgZnJvbSB0aGlzIG1lc3NhZ2UuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiAgICAgICAgICAgVGhyb3duIGlmIHRoZXJlIGlzIGEgZmFpbHVyZSByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcKQEAgLTE3OCwyNCArMTc4LDI3IEBACiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5yZWFkQWxsKG1lc3NhZ2VIZWFkZXIsIDAsIG1lc3NhZ2VIZWFkZXIubGVuZ3RoKTsKIAogICAgIGJ5dGUgc3RhdHVzQnl0ZSA9IG1lc3NhZ2VIZWFkZXJbMF07Ci0gICAgYnl0ZVtdIHBheWxvYWQgPSBuZXcgYnl0ZVtFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpXTsKLSAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOwogCiAgICAgTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzID0gTmVnb3RpYXRpb25TdGF0dXMuYnlWYWx1ZShzdGF0dXNCeXRlKTsKICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMuRVJST1IsICJJbnZhbGlkIHN0YXR1cyAiICsgc3RhdHVzQnl0ZSk7Ci0gICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQkFEIHx8IHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5FUlJPUikgewotICAgICAgdHJ5IHsKLSAgICAgICAgU3RyaW5nIHJlbW90ZU1lc3NhZ2UgPSBuZXcgU3RyaW5nKHBheWxvYWQsICJVVEYtOCIpOwotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotICAgICAgfQorICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZShOZWdvdGlhdGlvblN0YXR1cy5FUlJPUiwgIkludmFsaWQgc3RhdHVzICIgKyBzdGF0dXNCeXRlKTsKICAgICB9CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAotICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOworICAgIGludCBwYXlsb2FkQnl0ZXMgPSBFbmNvZGluZ1V0aWxzLmRlY29kZUJpZ0VuZGlhbihtZXNzYWdlSGVhZGVyLCBTVEFUVVNfQllURVMpOworICAgIGlmIChwYXlsb2FkQnl0ZXMgPCAwIHx8IHBheWxvYWRCeXRlcyA+IDEwNDg1NzYwMCAvKiAxMDAgTUIgKi8pIHsKKyAgICAgIHRocm93IHNlbmRBbmRUaHJvd01lc3NhZ2UoCisgICAgICAgIE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SLCAiSW52YWxpZCBwYXlsb2FkIGhlYWRlciBsZW5ndGg6ICIgKyBwYXlsb2FkQnl0ZXMpOworICAgIH0KKworICAgIGJ5dGVbXSBwYXlsb2FkID0gbmV3IGJ5dGVbcGF5bG9hZEJ5dGVzXTsKKyAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOworCisgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOworICAgIH0KKyAgICBMT0dHRVIuZGVidWcoInt9OiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CiAgICAgcmV0dXJuIG5ldyBTYXNsUmVzcG9uc2Uoc3RhdHVzLCBwYXlsb2FkKTsKICAgfQogCkBAIC0yMDMsMTcgKzIwNiwxOSBAQAogICAgKiBTZW5kIGEgVGhyaWZ0IFNBU0wgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgKHVzdWFsbHkgQkFEIG9yIEVSUk9SKSBhbmQKICAgICogc3RyaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHRocm93IGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbgogICAgKiBtZXNzYWdlLgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIHN0YXR1cwogICAgKiAgICAgICAgICBUaGUgVGhyaWZ0IFNBU0wgc3RhdHVzIGNvZGUgdG8gc2VuZC4gVXN1YWxseSBCQUQgb3IgRVJST1IuCiAgICAqIEBwYXJhbSBtZXNzYWdlCiAgICAqICAgICAgICAgIFRoZSBvcHRpb25hbCBtZXNzYWdlIHRvIHNlbmQgdG8gdGhlIG90aGVyIHNpZGUuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiAgICAgICAgICAgQWx3YXlzIHRocm93biB3aXRoIHRoZSBtZXNzYWdlIHByb3ZpZGVkLgorICAgKiBAcmV0dXJuIGFsd2F5cyB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBidXQgZGVjbGFyZXMgcmV0dXJuIHR5cGUgdG8gYWxsb3cKKyAgICogICAgICAgICAgdGhyb3cgc2VuZEFuZFRocm93TWVzc2FnZSguLi4pIHRvIGluZm9ybSBjb21waWxlciBjb250cm9sIGZsb3cKICAgICovCi0gIHByb3RlY3RlZCB2b2lkIHNlbmRBbmRUaHJvd01lc3NhZ2UoTmVnb3RpYXRpb25TdGF0dXMgc3RhdHVzLCBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgc2VuZFNhc2xNZXNzYWdlKHN0YXR1cywgbWVzc2FnZS5nZXRCeXRlcygpKTsKKyAgICAgIHNlbmRTYXNsTWVzc2FnZShzdGF0dXMsIG1lc3NhZ2UuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IHNlbmQgZmFpbHVyZSByZXNwb25zZSIsIGUpOwogICAgICAgbWVzc2FnZSArPSAiXG5BbHNvLCBjb3VsZCBub3Qgc2VuZCByZXNwb25zZTogIiArIGUudG9TdHJpbmcoKTsKQEAgLTIyNSw3ICsyMzAsNyBAQAogICAgKiBJbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHN0YXJ0IHRoZSBUaHJpZnQgU0FTTCBoYW5kc2hha2UgcHJvY2Vzcy4gV2hlbgogICAgKiB0aGlzIG1ldGhvZCBjb21wbGV0ZXMsIHRoZSA8Y29kZT5TYXNsUGFydGljaXBhbnQ8L2NvZGU+IGluIHRoaXMgY2xhc3MgaXMKICAgICogYXNzdW1lZCB0byBiZSBpbml0aWFsaXplZC4KLSAgICogCisgICAqCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KICAgICovCkBAIC0yNDAsNiArMjQ1LDEzIEBACiAgICAqLwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAvKgorICAgICAqIHJlYWRTYXNsSGVhZGVyIGlzIHVzZWQgdG8gdGFnIHdoZXRoZXIgdGhlIFNBU0wgaGVhZGVyIGhhcyBiZWVuIHJlYWQgcHJvcGVybHkuCisgICAgICogSWYgdGhlcmUgaXMgYSBwcm9ibGVtIGluIHJlYWRpbmcgdGhlIGhlYWRlciwgdGhlcmUgbWlnaHQgbm90IGJlIGFueQorICAgICAqIGRhdGEgaW4gdGhlIHN0cmVhbSwgcG9zc2libHkgYSBUQ1AgaGVhbHRoIGNoZWNrIGZyb20gbG9hZCBiYWxhbmNlci4KKyAgICAgKi8KKyAgICBib29sZWFuIHJlYWRTYXNsSGVhZGVyID0gZmFsc2U7CisKICAgICBMT0dHRVIuZGVidWcoIm9wZW5pbmcgdHJhbnNwb3J0IHt9IiwgdGhpcyk7CiAgICAgaWYgKHNhc2wgIT0gbnVsbCAmJiBzYXNsLmlzQ29tcGxldGUoKSkKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJTQVNMIHRyYW5zcG9ydCBhbHJlYWR5IG9wZW4iKTsKQEAgLTI1MSw2ICsyNjMsNyBAQAogICAgICAgLy8gTmVnb3RpYXRlIGEgU0FTTCBtZWNoYW5pc20uIFRoZSBjbGllbnQgYWxzbyBzZW5kcyBpdHMKICAgICAgIC8vIGluaXRpYWwgcmVzcG9uc2UsIG9yIGFuIGVtcHR5IG9uZS4KICAgICAgIGhhbmRsZVNhc2xTdGFydE1lc3NhZ2UoKTsKKyAgICAgIHJlYWRTYXNsSGVhZGVyID0gdHJ1ZTsKICAgICAgIExPR0dFUi5kZWJ1Zygie306IFN0YXJ0IG1lc3NhZ2UgaGFuZGxlZCIsIGdldFJvbGUoKSk7CiAKICAgICAgIFNhc2xSZXNwb25zZSBtZXNzYWdlID0gbnVsbDsKQEAgLTI2OCw3ICsyODEsNyBAQAogICAgICAgICBpZiAobWVzc2FnZS5zdGF0dXMgPT0gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgJiYKICAgICAgICAgICAgIGdldFJvbGUoKSA9PSBTYXNsUm9sZS5DTElFTlQpIHsKICAgICAgICAgICBMT0dHRVIuZGVidWcoInt9OiBBbGwgZG9uZSEiLCBnZXRSb2xlKCkpOwotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgc2VuZFNhc2xNZXNzYWdlKHNhc2wuaXNDb21wbGV0ZSgpID8gTmVnb3RpYXRpb25TdGF0dXMuQ09NUExFVEUgOiBOZWdvdGlhdGlvblN0YXR1cy5PSywKQEAgLTI3Niw4ICsyODksNiBAQAogICAgICAgfQogICAgICAgTE9HR0VSLmRlYnVnKCJ7fTogTWFpbiBuZWdvdGlhdGlvbiBsb29wIGNvbXBsZXRlIiwgZ2V0Um9sZSgpKTsKIAotICAgICAgYXNzZXJ0IHNhc2wuaXNDb21wbGV0ZSgpOwotCiAgICAgICAvLyBJZiB3ZSdyZSB0aGUgY2xpZW50LCBhbmQgd2UncmUgY29tcGxldGUsIGJ1dCB0aGUgc2VydmVyIGlzbid0CiAgICAgICAvLyBjb21wbGV0ZSB5ZXQsIHdlIG5lZWQgdG8gd2FpdCBmb3IgaXRzIHJlc3BvbnNlLiBUaGlzIHdpbGwgb2NjdXIKICAgICAgIC8vIHdpdGggQU5PTllNT1VTIGF1dGgsIGZvciBleGFtcGxlLCB3aGVyZSB3ZSBzZW5kIGFuIGluaXRpYWwgcmVzcG9uc2UKQEAgLTI5NCwxMCArMzA1LDIxIEBACiAgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0cnkgewogICAgICAgICBMT0dHRVIuZXJyb3IoIlNBU0wgbmVnb3RpYXRpb24gZmFpbHVyZSIsIGUpOwotICAgICAgICBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkJBRCwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB0aHJvdyBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLkJBRCwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5jbG9zZSgpOwogICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLyoKKyAgICAgICAqIElmIHRoZXJlIGlzIG5vLWRhdGEgb3Igbm8tc2FzbCBoZWFkZXIgaW4gdGhlIHN0cmVhbSwgdGhyb3cgYSBkaWZmZXJlbnQKKyAgICAgICAqIHR5cGUgb2YgZXhjZXB0aW9uIHNvIHdlIGNhbiBoYW5kbGUgdGhpcyBzY2VuYXJpbyBkaWZmZXJlbnRseS4KKyAgICAgICAqLworICAgICAgaWYgKCFyZWFkU2FzbEhlYWRlciAmJiBlLmdldFR5cGUoKSA9PSBUVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFKSB7CisgICAgICAgIHVuZGVybHlpbmdUcmFuc3BvcnQuY2xvc2UoKTsKKyAgICAgICAgTE9HR0VSLmRlYnVnKCJObyBkYXRhIG9yIG5vIHNhc2wgZGF0YSBpbiB0aGUgc3RyZWFtIik7CisgICAgICAgIHRocm93IG5ldyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbigiTm8gZGF0YSBvciBubyBzYXNsIGRhdGEgaW4gdGhlIHN0cmVhbSIpOworICAgICAgfQorICAgICAgdGhyb3cgZTsKICAgICB9CiAKICAgICBTdHJpbmcgcW9wID0gKFN0cmluZykgc2FzbC5nZXROZWdvdGlhdGVkUHJvcGVydHkoU2FzbC5RT1ApOwpAQCAtMzA3LDcgKzMyOSw3IEBACiAKICAgLyoqCiAgICAqIEdldCB0aGUgdW5kZXJseWluZyA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gVGhlIDxjb2RlPlNhc2xDbGllbnQ8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHRyYW5zcG9ydAogICAgKiAgICAgICAgIGlzIGJhY2tlZCBieSBhIDxjb2RlPlNhc2xTZXJ2ZXI8L2NvZGU+LgogICAgKi8KQEAgLTMyNSw3ICszNDcsNyBAQAogCiAgIC8qKgogICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgPGNvZGU+U2FzbFNlcnZlcjwvY29kZT4uCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSA8Y29kZT5TYXNsU2VydmVyPC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyB0cmFuc3BvcnQKICAgICogICAgICAgICBpcyBiYWNrZWQgYnkgYSA8Y29kZT5TYXNsQ2xpZW50PC9jb2RlPi4KICAgICovCkBAIC0zMzYsNyArMzU4LDcgQEAKICAgLyoqCiAgICAqIFJlYWQgYSA0LWJ5dGUgd29yZCBmcm9tIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBhbmQgaW50ZXJwcmV0IGl0IGFzIGFuCiAgICAqIGludGVnZXIuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIFRoZSBsZW5ndGggcHJlZml4IG9mIHRoZSBuZXh0IFNBU0wgbWVzc2FnZSB0byByZWFkLgogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KICAgICogICAgICAgICAgIFRocm93biBpZiByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGZhaWxzLgpAQCAtMzQ5LDcgKzM3MSw3IEBACiAKICAgLyoqCiAgICAqIFdyaXRlIHRoZSBnaXZlbiBpbnRlZ2VyIGFzIDQgYnl0ZXMgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgotICAgKiAKKyAgICoKICAgICogQHBhcmFtIGxlbmd0aAogICAgKiAgICAgICAgICBUaGUgbGVuZ3RoIHByZWZpeCBvZiB0aGUgbmV4dCBTQVNMIG1lc3NhZ2UgdG8gd3JpdGUuCiAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgpAQCAtNDEzLDcgKzQzNSw3IEBACiAgIC8qKgogICAgKiBSZWFkIGEgc2luZ2xlIGZyYW1lIG9mIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHVud3JhcHBpbmcgaWYKICAgICogbmVjZXNzYXJ5LgotICAgKiAKKyAgICoKICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCiAgICAqICAgICAgICAgICBUaHJvd24gaWYgdGhlcmUncyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgogICAgKiBAdGhyb3dzIFNhc2xFeGNlcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDE4OWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKKy8qCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB1c2VkIHRvIHRyYWNrIGV4Y2VwdGlvbnMgaW4gVFNhc2xUcmFuc3BvcnQKKyAqIHRoYXQgZG9lcyBub3QgaGF2ZSBTYXNsIHNpZ25hdHVyZSBpbiB0aGVpciBzdHJlYW0uCisgKi8KK3B1YmxpYyBjbGFzcyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRUcmFuc3BvcnRFeGNlcHRpb24geworCisgIHB1YmxpYyBUU2FzbFRyYW5zcG9ydEV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgIH0KKworICBwdWJsaWMgVFNhc2xUcmFuc3BvcnRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICB9CisKKyAgcHVibGljIFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKaW5kZXggMTQ3MDc0YS4uNzlmN2I3ZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmphdmEKQEAgLTQ2LDE5ICs0NiwyNyBAQAogICAgKi8KICAgcHJpdmF0ZSBpbnQgY2xpZW50VGltZW91dF8gPSAwOwogCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncyBleHRlbmRzIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzPiB7CisgICAgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKworICAgIHB1YmxpYyBTZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzIHNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldCA9IHNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAogICAgKi8KLSAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoU2VydmVyU29ja2V0IHNlcnZlclNvY2tldCkgeworICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAgICAgdGhpcyhzZXJ2ZXJTb2NrZXQsIDApOwogICB9CiAKICAgLyoqCiAgICAqIENyZWF0ZXMgYSBzZXJ2ZXIgc29ja2V0IGZyb20gdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0CiAgICAqLwotICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBpbnQgY2xpZW50VGltZW91dCkgewotICAgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJTb2NrZXQ7Ci0gICAgY2xpZW50VGltZW91dF8gPSBjbGllbnRUaW1lb3V0OworICBwdWJsaWMgVFNlcnZlclNvY2tldChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0LCBpbnQgY2xpZW50VGltZW91dCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRoaXMobmV3IFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS5zZXJ2ZXJTb2NrZXQoc2VydmVyU29ja2V0KS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKICAgfQogCiAgIC8qKgpAQCAtODAsMjIgKzg4LDMwIEBACiAgIH0KIAogICBwdWJsaWMgVFNlcnZlclNvY2tldChJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkciwgaW50IGNsaWVudFRpbWVvdXQpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICBjbGllbnRUaW1lb3V0XyA9IGNsaWVudFRpbWVvdXQ7CisgICAgdGhpcyhuZXcgU2VydmVyU29ja2V0VHJhbnNwb3J0QXJncygpLmJpbmRBZGRyKGJpbmRBZGRyKS5jbGllbnRUaW1lb3V0KGNsaWVudFRpbWVvdXQpKTsKKyAgfQorCisgIHB1YmxpYyBUU2VydmVyU29ja2V0KFNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MgYXJncykgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGNsaWVudFRpbWVvdXRfID0gYXJncy5jbGllbnRUaW1lb3V0OworICAgIGlmIChhcmdzLnNlcnZlclNvY2tldCAhPSBudWxsKSB7CisgICAgICB0aGlzLnNlcnZlclNvY2tldF8gPSBhcmdzLnNlcnZlclNvY2tldDsKKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgdHJ5IHsKICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAogICAgICAgc2VydmVyU29ja2V0XyA9IG5ldyBTZXJ2ZXJTb2NrZXQoKTsKICAgICAgIC8vIFByZXZlbnQgMk1TTCBkZWxheSBwcm9ibGVtIG9uIHNlcnZlciByZXN0YXJ0cwogICAgICAgc2VydmVyU29ja2V0Xy5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7CiAgICAgICAvLyBCaW5kIHRvIGxpc3RlbmluZyBwb3J0Ci0gICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYmluZEFkZHIpOworICAgICAgc2VydmVyU29ja2V0Xy5iaW5kKGFyZ3MuYmluZEFkZHIsIGFyZ3MuYmFja2xvZyk7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXRfID0gbnVsbDsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBhZGRyZXNzICIgKyBiaW5kQWRkci50b1N0cmluZygpICsgIi4iKTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggMTdmZjg2Yi4uNDI0ZTRmYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmphdmEKQEAgLTE5LDExICsxOSw0MCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworCiAvKioKICAqIFNlcnZlciB0cmFuc3BvcnQuIE9iamVjdCB3aGljaCBwcm92aWRlcyBjbGllbnQgdHJhbnNwb3J0cy4KICAqCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2VydmVyVHJhbnNwb3J0QXJnczxUIGV4dGVuZHMgQWJzdHJhY3RTZXJ2ZXJUcmFuc3BvcnRBcmdzPFQ+PiB7CisgICAgaW50IGJhY2tsb2cgPSAwOyAvLyBBIHZhbHVlIG9mIDAgbWVhbnMgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkIChjdXJyZW50bHkgc2V0IGF0IDUwKQorICAgIGludCBjbGllbnRUaW1lb3V0ID0gMDsKKyAgICBJbmV0U29ja2V0QWRkcmVzcyBiaW5kQWRkcjsKKworICAgIHB1YmxpYyBUIGJhY2tsb2coaW50IGJhY2tsb2cpIHsKKyAgICAgIHRoaXMuYmFja2xvZyA9IGJhY2tsb2c7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFQgY2xpZW50VGltZW91dChpbnQgY2xpZW50VGltZW91dCkgeworICAgICAgdGhpcy5jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBwb3J0KGludCBwb3J0KSB7CisgICAgICB0aGlzLmJpbmRBZGRyID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKHBvcnQpOworICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBUIGJpbmRBZGRyKEluZXRTb2NrZXRBZGRyZXNzIGJpbmRBZGRyKSB7CisgICAgICB0aGlzLmJpbmRBZGRyID0gYmluZEFkZHI7CisgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorICB9CiAKICAgcHVibGljIGFic3RyYWN0IHZvaWQgbGlzdGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb247CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjEwMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworCisKKy8qKgorICogQmFzaWMgZmlsZSBzdXBwb3J0IGZvciB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRTaW1wbGVGaWxlVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgcHJpdmF0ZSBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBudWxsOyAgIAorICBwcml2YXRlIGJvb2xlYW4gcmVhZGFibGU7ICAgICAgICAgICAgICAgCisgIHByaXZhdGUgYm9vbGVhbiB3cml0YWJsZTsgICAgICAgICAgICAgICAKKyAgcHJpdmF0ZSBTdHJpbmcgcGF0aF87ICAgICAgICAgICAgICAgCisKKworICAvKioKKyAgICogQ3JlYXRlIGEgdHJhbnNwb3J0IGJhY2tlZCBieSBhIHNpbXBsZSBmaWxlIAorICAgKiAKKyAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gb3Blbi9jcmVhdGUKKyAgICogQHBhcmFtIHJlYWQgdHJ1ZSB0byBzdXBwb3J0IHJlYWQgb3BlcmF0aW9ucworICAgKiBAcGFyYW0gd3JpdGUgdHJ1ZSB0byBzdXBwb3J0IHdyaXRlIG9wZXJhdGlvbnMKKyAgICogQHBhcmFtIG9wZW5GaWxlIHRydWUgdG8gb3BlbiB0aGUgZmlsZSBvbiBjb25zdHJ1Y3Rpb24KKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgb3BlbiBmYWlscworICAgKi8KKyAgcHVibGljIFRTaW1wbGVGaWxlVHJhbnNwb3J0KFN0cmluZyBwYXRoLCBib29sZWFuIHJlYWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3cml0ZSwgYm9vbGVhbiBvcGVuRmlsZSkKKyAgICAgICAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKHBhdGgubGVuZ3RoKCkgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIk5vIHBhdGggc3BlY2lmaWVkIik7CisgICAgfQorICAgIGlmICghcmVhZCAmJiAhd3JpdGUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJOZWl0aGVyIFJFQUQgbm9yIFdSSVRFIHNwZWNpZmllZCIpOworICAgIH0KKyAgICByZWFkYWJsZSA9IHJlYWQ7CisgICAgd3JpdGFibGUgPSB3cml0ZTsKKyAgICBwYXRoXyA9IHBhdGg7CisgICAgaWYgKG9wZW5GaWxlKSB7CisgICAgICBvcGVuKCk7CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogQ3JlYXRlIGEgdHJhbnNwb3J0IGJhY2tlZCBieSBhIHNpbXBsZSBmaWxlIAorICAgKiBJbXBsaWNpdGx5IG9wZW5zIGZpbGUgdG8gY29uZm9ybSB0byBDKysgYmVoYXZpb3IuCisgICAqIAorICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBvcGVuL2NyZWF0ZQorICAgKiBAcGFyYW0gcmVhZCB0cnVlIHRvIHN1cHBvcnQgcmVhZCBvcGVyYXRpb25zCisgICAqIEBwYXJhbSB3cml0ZSB0cnVlIHRvIHN1cHBvcnQgd3JpdGUgb3BlcmF0aW9ucworICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBvcGVuIGZhaWxzCisgICAqLworICBwdWJsaWMgVFNpbXBsZUZpbGVUcmFuc3BvcnQoU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVhZCwgYm9vbGVhbiB3cml0ZSkKKyAgICAgICAgICB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhpcyhwYXRoLCByZWFkLCB3cml0ZSwgdHJ1ZSk7CisgIH0KKyAgCisgIC8qKgorICAgKiBDcmVhdGUgYSB0cmFuc3BvcnQgYmFja2VkIGJ5IGEgc2ltcGxlIHJlYWQgb25seSBkaXNrIGZpbGUgKGltcGxpY2l0bHkgb3BlbnMKKyAgICogZmlsZSkKKyAgICoKKyAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gb3Blbi9jcmVhdGUKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGZpbGUgb3BlbiBmYWlscworICAgKi8KKyAgcHVibGljIFRTaW1wbGVGaWxlVHJhbnNwb3J0KFN0cmluZyBwYXRoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdGhpcyhwYXRoLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKworICAvKioKKyAgICogVGVzdCBmaWxlIHN0YXR1cworICAgKgorICAgKiBAcmV0dXJuIHRydWUgaWYgb3Blbiwgb3RoZXJ3aXNlIGZhbHNlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgIHJldHVybiAoZmlsZSAhPSBudWxsKTsKKyAgfQorCisgIC8qKgorICAgKiBPcGVuIGZpbGUgaWYgbm90IHByZXZpb3VzbHkgb3BlbmVkLiAKKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIG9wZW4gZmFpbHMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmIChmaWxlID09IG51bGwpeworICAgICAgdHJ5IHsKKyAgICAgICAgU3RyaW5nIGFjY2VzcyA9ICJyIjsgICAgICAgLy9SYW5kb21BY2Nlc3NGaWxlIG9iamVjdHMgbXVzdCBiZSByZWFkYWJsZQorICAgICAgICBpZiAod3JpdGFibGUpIHsKKyAgICAgICAgICBhY2Nlc3MgKz0gInciOworICAgICAgICB9CisgICAgICAgIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwYXRoXywgYWNjZXNzKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICBmaWxlID0gbnVsbDsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICB9ICAgICAgCisgICAgfQorICB9CisKKyAgLyoqCisgICAqIENsb3NlIGZpbGUsIHN1YnNlcXVlbnQgcmVhZC93cml0ZSBhY3Rpdml0eSB3aWxsIHRocm93IGV4Y2VwdGlvbnMKKyAgICovCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICBmaWxlLmNsb3NlKCk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAvL05vdGhpbmcgdG8gZG8KKyAgICAgIH0KKyAgICAgIGZpbGUgPSBudWxsOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZWFkIHVwIHRvIGxlbiBtYW55IGJ5dGVzIGludG8gYnVmIGF0IG9mZnNldCAKKyAgICoKKyAgICogQHBhcmFtIGJ1ZiBob3VzZXMgYnl0ZXMgcmVhZAorICAgKiBAcGFyYW0gb2ZmIG9mZnNldCBpbnRvIGJ1ZmYgdG8gYmVnaW4gd3JpdGluZyB0bworICAgKiBAcGFyYW0gbGVuIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAgICogQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZAorICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gb24gcmVhZCBmYWlsdXJlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBpZiAoIXJlYWRhYmxlKSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUmVhZCBvcGVyYXRpb24gb24gd3JpdGUgb25seSBmaWxlIik7CisgICAgfQorICAgIGludCBpQnl0ZXNSZWFkID0gMDsKKyAgICB0cnkgeworICAgICAgaUJ5dGVzUmVhZCA9IGZpbGUucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgIGZpbGUgPSBudWxsOworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiBpQnl0ZXNSZWFkOworICB9CisKKyAgLyoqCisgICAqIFdyaXRlIGxlbiBtYW55IGJ5dGVzIGZyb20gYnVmZiBzdGFydGluZyBhdCBvZmZzZXQgCisgICAqCisgICAqIEBwYXJhbSBidWYgYnVmZmVyIGNvbnRhaW5pbmcgYnl0ZXMgdG8gd3JpdGUKKyAgICogQHBhcmFtIG9mZiBvZmZzZXQgaW50byBidWZmZXIgdG8gYmVnaW4gd3JpdGluZyBmcm9tCisgICAqIEBwYXJhbSBsZW4gbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvbiB3cml0ZSBmYWlsdXJlCisgICAqLworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBmaWxlLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgZmlsZSA9IG51bGw7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogTW92ZSBmaWxlIHBvaW50ZXIgdG8gc3BlY2lmaWVkIG9mZnNldCwgbmV3IHJlYWQvd3JpdGUgY2FsbHMgd2lsbCBhY3QgaGVyZQorICAgKgorICAgKiBAcGFyYW0gb2Zmc2V0IGJ5dGVzIGZyb20gYmVnaW5uaW5nIG9mIGZpbGUgdG8gbW92ZSBwb2ludGVyIHRvCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBzZWVrIGZhaWxzCisgICAqLworICBwdWJsaWMgdm9pZCBzZWVrKGxvbmcgb2Zmc2V0KSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbGUuc2VlayhvZmZzZXQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcworICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgZmlsZSBhY2Nlc3MgZmFpbHMKKyAgICovCisgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGZpbGUubGVuZ3RoKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIFJldHVybiBjdXJyZW50IGZpbGUgcG9pbnRlciBwb3NpdGlvbiBpbiBieXRlcyBmcm9tIGJlZ2lubmluZyBvZiBmaWxlCisgICAqCisgICAqIEByZXR1cm4gZmlsZSBwb2ludGVyIHBvc2l0aW9uCisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBmaWxlIGFjY2VzcyBmYWlscworICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQppbmRleCA2MDZlOGE5Li5iMjBiMzJiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuamF2YQpAQCAtNDAsMjIgKzQwLDI3IEBACiAgIC8qKgogICAgKiBXcmFwcGVkIFNvY2tldCBvYmplY3QKICAgICovCi0gIHByaXZhdGUgU29ja2V0IHNvY2tldF8gPSBudWxsOworICBwcml2YXRlIFNvY2tldCBzb2NrZXRfOwogCiAgIC8qKgogICAgKiBSZW1vdGUgaG9zdAogICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgaG9zdF8gID0gbnVsbDsKKyAgcHJpdmF0ZSBTdHJpbmcgaG9zdF87CiAKICAgLyoqCiAgICAqIFJlbW90ZSBwb3J0CiAgICAqLwotICBwcml2YXRlIGludCBwb3J0XyA9IDA7CisgIHByaXZhdGUgaW50IHBvcnRfOwogCiAgIC8qKgotICAgKiBTb2NrZXQgdGltZW91dAorICAgKiBTb2NrZXQgdGltZW91dCAtIHJlYWQgdGltZW91dCBvbiB0aGUgc29ja2V0CiAgICAqLwotICBwcml2YXRlIGludCB0aW1lb3V0XyA9IDA7CisgIHByaXZhdGUgaW50IHNvY2tldFRpbWVvdXRfOworCisgIC8qKgorICAgKiBDb25uZWN0aW9uIHRpbWVvdXQKKyAgICovCisgIHByaXZhdGUgaW50IGNvbm5lY3RUaW1lb3V0XzsKIAogICAvKioKICAgICogQ29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBhbHJlYWR5IGNyZWF0ZWQgc29ja2V0LgpAQCAtNjgsMTQgKzczLDE1IEBACiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOworICAgICAgc29ja2V0Xy5zZXRLZWVwQWxpdmUodHJ1ZSk7CiAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KSB7CiAgICAgICBMT0dHRVIud2FybigiQ291bGQgbm90IGNvbmZpZ3VyZSBzb2NrZXQuIiwgc3gpOwogICAgIH0KIAogICAgIGlmIChpc09wZW4oKSkgewogICAgICAgdHJ5IHsKLSAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpLCAxMDI0KTsKLSAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpLCAxMDI0KTsKKyAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgICBjbG9zZSgpOwogICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwpAQCAtMTAwLDEyICsxMDYsMjcgQEAKICAgICoKICAgICogQHBhcmFtIGhvc3QgICAgUmVtb3RlIGhvc3QKICAgICogQHBhcmFtIHBvcnQgICAgUmVtb3RlIHBvcnQKLSAgICogQHBhcmFtIHRpbWVvdXQgU29ja2V0IHRpbWVvdXQKKyAgICogQHBhcmFtIHRpbWVvdXQgU29ja2V0IHRpbWVvdXQgYW5kIGNvbm5lY3Rpb24gdGltZW91dAogICAgKi8KICAgcHVibGljIFRTb2NrZXQoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgeworICAgIHRoaXMoaG9zdCwgcG9ydCwgdGltZW91dCwgdGltZW91dCk7CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyB1bmNvbm5lY3RlZCBzb2NrZXQgdGhhdCB3aWxsIGNvbm5lY3QgdG8gdGhlIGdpdmVuIGhvc3QKKyAgICogb24gdGhlIGdpdmVuIHBvcnQsIHdpdGggYSBzcGVjaWZpYyBjb25uZWN0aW9uIHRpbWVvdXQgYW5kIGEKKyAgICogc3BlY2lmaWMgc29ja2V0IHRpbWVvdXQuCisgICAqCisgICAqIEBwYXJhbSBob3N0ICAgICAgICAgICAgUmVtb3RlIGhvc3QKKyAgICogQHBhcmFtIHBvcnQgICAgICAgICAgICBSZW1vdGUgcG9ydAorICAgKiBAcGFyYW0gc29ja2V0VGltZW91dCAgIFNvY2tldCB0aW1lb3V0CisgICAqIEBwYXJhbSBjb25uZWN0VGltZW91dCAgQ29ubmVjdGlvbiB0aW1lb3V0CisgICAqLworICBwdWJsaWMgVFNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGludCBzb2NrZXRUaW1lb3V0LCBpbnQgY29ubmVjdFRpbWVvdXQpIHsKICAgICBob3N0XyA9IGhvc3Q7CiAgICAgcG9ydF8gPSBwb3J0OwotICAgIHRpbWVvdXRfID0gdGltZW91dDsKKyAgICBzb2NrZXRUaW1lb3V0XyA9IHNvY2tldFRpbWVvdXQ7CisgICAgY29ubmVjdFRpbWVvdXRfID0gY29ubmVjdFRpbWVvdXQ7CiAgICAgaW5pdFNvY2tldCgpOwogICB9CiAKQEAgLTExNywxOSArMTM4LDM5IEBACiAgICAgdHJ5IHsKICAgICAgIHNvY2tldF8uc2V0U29MaW5nZXIoZmFsc2UsIDApOwogICAgICAgc29ja2V0Xy5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgc29ja2V0Xy5zZXRTb1RpbWVvdXQodGltZW91dF8pOworICAgICAgc29ja2V0Xy5zZXRLZWVwQWxpdmUodHJ1ZSk7CisgICAgICBzb2NrZXRfLnNldFNvVGltZW91dChzb2NrZXRUaW1lb3V0Xyk7CiAgICAgfSBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KSB7CiAgICAgICBMT0dHRVIuZXJyb3IoIkNvdWxkIG5vdCBjb25maWd1cmUgc29ja2V0LiIsIHN4KTsKICAgICB9CiAgIH0KIAogICAvKioKKyAgICogU2V0cyB0aGUgc29ja2V0IHRpbWVvdXQgYW5kIGNvbm5lY3Rpb24gdGltZW91dC4KKyAgICoKKyAgICogQHBhcmFtIHRpbWVvdXQgTWlsbGlzZWNvbmRzIHRpbWVvdXQKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICB0aGlzLnNldENvbm5lY3RUaW1lb3V0KHRpbWVvdXQpOworICAgIHRoaXMuc2V0U29ja2V0VGltZW91dCh0aW1lb3V0KTsKKyAgfQorCisgIC8qKgorICAgKiBTZXRzIHRoZSB0aW1lIGFmdGVyIHdoaWNoIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbCB0aW1lIG91dAorICAgKgorICAgKiBAcGFyYW0gdGltZW91dCBNaWxsaXNlY29uZHMgdGltZW91dAorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29ubmVjdFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICBjb25uZWN0VGltZW91dF8gPSB0aW1lb3V0OworICB9CisKKyAgLyoqCiAgICAqIFNldHMgdGhlIHNvY2tldCB0aW1lb3V0CiAgICAqCiAgICAqIEBwYXJhbSB0aW1lb3V0IE1pbGxpc2Vjb25kcyB0aW1lb3V0CiAgICAqLwotICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7Ci0gICAgdGltZW91dF8gPSB0aW1lb3V0OworICBwdWJsaWMgdm9pZCBzZXRTb2NrZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgc29ja2V0VGltZW91dF8gPSB0aW1lb3V0OwogICAgIHRyeSB7CiAgICAgICBzb2NrZXRfLnNldFNvVGltZW91dCh0aW1lb3V0KTsKICAgICB9IGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpIHsKQEAgLTE2NSwxMSArMjA2LDExIEBACiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkFMUkVBRFlfT1BFTiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZC4iKTsKICAgICB9CiAKLSAgICBpZiAoaG9zdF8ubGVuZ3RoKCkgPT0gMCkgeworICAgIGlmIChob3N0XyA9PSBudWxsIHx8IGhvc3RfLmxlbmd0aCgpID09IDApIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QuIik7CiAgICAgfQotICAgIGlmIChwb3J0XyA8PSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCAiQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0LiIpOworICAgIGlmIChwb3J0XyA8PSAwIHx8IHBvcnRfID4gNjU1MzUpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJJbnZhbGlkIHBvcnQgIiArIHBvcnRfKTsKICAgICB9CiAKICAgICBpZiAoc29ja2V0XyA9PSBudWxsKSB7CkBAIC0xNzcsOSArMjE4LDkgQEAKICAgICB9CiAKICAgICB0cnkgewotICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCB0aW1lb3V0Xyk7Ci0gICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCksIDEwMjQpOwotICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpLCAxMDI0KTsKKyAgICAgIHNvY2tldF8uY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MoaG9zdF8sIHBvcnRfKSwgY29ubmVjdFRpbWVvdXRfKTsKKyAgICAgIGlucHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2tldF8uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICBvdXRwdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldF8uZ2V0T3V0cHV0U3RyZWFtKCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgY2xvc2UoKTsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCmluZGV4IDZlYWIzYjAuLjczYWQ3MzAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMiArMTksMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKKwogLyoqCiAgKiBHZW5lcmljIGNsYXNzIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBJL08gbGF5ZXIuIFRoaXMgaXMgYmFzaWNhbGx5IGEgdGhpbgogICogd3JhcHBlciBhcm91bmQgdGhlIGNvbWJpbmVkIGZ1bmN0aW9uYWxpdHkgb2YgSmF2YSBpbnB1dC9vdXRwdXQgc3RyZWFtcy4KICAqCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKIAogICAvKioKICAgICogUXVlcmllcyB3aGV0aGVyIHRoZSB0cmFuc3BvcnQgaXMgb3Blbi4KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKaW5kZXggZDA4ZjNiMC4uYjg4NmJjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxSRUFEWV9PUEVOID0gMjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRURfT1VUID0gMzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5EX09GX0ZJTEUgPSA0OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT1JSVVBURURfREFUQSA9IDU7CiAKICAgcHJvdGVjdGVkIGludCB0eXBlXyA9IFVOS05PV047CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzU1YWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyOworaW1wb3J0IGphdmEudXRpbC56aXAuRGVmbGF0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKKy8qKgorICogVFpsaWJUcmFuc3BvcnQgZGVmbGF0ZXMgb24gd3JpdGUgYW5kIGluZmxhdGVzIG9uIHJlYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBUWmxpYlRyYW5zcG9ydCBleHRlbmRzIFRJT1N0cmVhbVRyYW5zcG9ydCB7CisKKyAgICBwcml2YXRlIFRUcmFuc3BvcnQgdHJhbnNwb3J0XyA9IG51bGw7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBUVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IGJhc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFpsaWJUcmFuc3BvcnQoYmFzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRabGliVHJhbnNwb3J0IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSAgdHJhbnNwb3J0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkIGZyb20gYW5kIHdyaXRlIHRvCisgICAgICovCisgICAgcHVibGljIFRabGliVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CisgICAgICAgIHRoaXModHJhbnNwb3J0LCBEZWZsYXRlci5CRVNUX0NPTVBSRVNTSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFRabGliVHJhbnNwb3J0IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSAgdHJhbnNwb3J0IHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkIGZyb20gYW5kIHdyaXRlIHRvCisgICAgICogQHBhcmFtICBjb21wcmVzc2lvbkxldmVsIDAgZm9yIG5vIGNvbXByZXNzaW9uLCA5IGZvciBtYXhpbXVtIGNvbXByZXNzaW9uCisgICAgICovCisgICAgcHVibGljIFRabGliVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0LCBpbnQgY29tcHJlc3Npb25MZXZlbCkgeworICAgICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OworICAgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShuZXcgVFRyYW5zcG9ydElucHV0U3RyZWFtKHRyYW5zcG9ydF8pLCBuZXcgSW5mbGF0ZXIoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0obmV3IFRUcmFuc3BvcnRPdXRwdXRTdHJlYW0odHJhbnNwb3J0XyksIG5ldyBEZWZsYXRlcihjb21wcmVzc2lvbkxldmVsLCBmYWxzZSksIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9ydF8uaXNPcGVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICAgICAgdHJhbnNwb3J0Xy5vcGVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIGlmICh0cmFuc3BvcnRfLmlzT3BlbigpKSB7CisgICAgICAgICAgICB0cmFuc3BvcnRfLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFRUcmFuc3BvcnRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuc3BvcnQgPSBudWxsOworCisgICAgcHVibGljIFRUcmFuc3BvcnRJbnB1dFN0cmVhbShUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgdHJhbnNwb3J0LnJlYWQoYnVmLCAwLCAxKTsKKyAgICAgICAgICAgIHJldHVybiBidWZbMF07CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFRUcmFuc3BvcnRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICBwdWJsaWMgVFRyYW5zcG9ydE91dHB1dFN0cmVhbShUVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC53cml0ZShuZXcgYnl0ZVtdeyhieXRlKSBifSk7CisgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc3BvcnQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRyYW5zcG9ydC5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC8ua2V5c3RvcmUgYi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQppbmRleCAwYzg1MTExLi40ZGQ2NmFjIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQorKysgYi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIGIvbGliL2phdmEvdGVzdC8udHJ1c3RzdG9yZQppbmRleCBjMjRiNGEyLi4yNmZiZDE5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlCisrKyBiL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzIGIvbGliL2phdmEvdGVzdC9sb2c0ai5wcm9wZXJ0aWVzCmluZGV4IDg3OGIyZmMuLmFiOWJlYmEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3QvbG9nNGoucHJvcGVydGllcworKysgYi9saWIvamF2YS90ZXN0L2xvZzRqLnByb3BlcnRpZXMKQEAgLTEsNiArMSw2IEBACiAjIGxvZzRqIGNvbmZpZ3VyYXRpb24gdXNlZCBkdXJpbmcgYnVpbGQgYW5kIHVuaXQgdGVzdHMKIGxvZzRqLnJvb3RMb2dnZXI9ZGVidWcsc3Rkb3V0Ci1sb2c0ai50aHJlc2hob2xkPUFMTAorbG9nNGoudGhyZXNob2xkPUFMTAogbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCiBsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAogbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lZHtJU084NjAxfSAlLTVwICVjezJ9ICglRjolTSglTCkpIC0gJW0lbgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCmluZGV4IDlmMjgxMjQuLjYxZjQwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMjY3LDcgKzI2OCw3IEBACiAgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjY0KChsb25nKSA2MDAwICogMTAwMCAqIDEwMDApOwogICAgICAgb25lT2ZFYWNoLnNldERvdWJsZV9wcmVjaXNpb24oTWF0aC5QSSk7CiAgICAgICBvbmVPZkVhY2guc2V0U29tZV9jaGFyYWN0ZXJzKCJKU09OIFRISVMhIFwiXDEiKTsKLSAgICAgIG9uZU9mRWFjaC5zZXRab21nX3VuaWNvZGUobmV3IFN0cmluZyhrVW5pY29kZUJ5dGVzLCAiVVRGLTgiKSk7CisgICAgICBvbmVPZkVhY2guc2V0Wm9tZ191bmljb2RlKG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgb25lT2ZFYWNoLnNldEJhc2U2NChCeXRlQnVmZmVyLndyYXAoImJhc2U2NCIuZ2V0Qnl0ZXMoKSkpOwogICAgICAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgogCkBAIC0yNzcsNyArMjc4LDcgQEAKICAgICAgIG5lc3RpbmcgPSBuZXcgTmVzdGluZyhib25rLCBvbmVPZkVhY2gpOwogCiAgICAgICBob2x5TW9sZXkgPSBuZXcgSG9seU1vbGV5KCk7Ci0gICAgICBBcnJheUxpc3QgYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CisgICAgICBMaXN0PE9uZU9mRWFjaD4gYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CiAgICAgICBiaWcuYWRkKG5ldyBPbmVPZkVhY2gob25lT2ZFYWNoKSk7CiAgICAgICBiaWcuYWRkKG5lc3RpbmcubXlfb29lKTsKICAgICAgIGhvbHlNb2xleS5zZXRCaWcoYmlnKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWZhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRGVlcENvcHlCYXI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRGVlcENvcHlGb287CisKK3B1YmxpYyBjbGFzcyBUZXN0RGVlcENvcHkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdERlZXBDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRGVlcENvcHlGb28gZm9vID0gbmV3IERlZXBDb3B5Rm9vKCk7CisKKyAgICBmb28uYWRkVG9MKG5ldyBEZWVwQ29weUJhcigpKTsKKyAgICBmb28uYWRkVG9TKG5ldyBEZWVwQ29weUJhcigpKTsKKyAgICBmb28ucHV0VG9NKCJ0ZXN0IDMiLCBuZXcgRGVlcENvcHlCYXIoKSk7CisKKyAgICBmb28uYWRkVG9MaShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworICAgIGZvby5hZGRUb1NpKG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisgICAgZm9vLnB1dFRvTWkoInRlc3QgMyIsIG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisKKyAgICBmb28uc2V0QmFyKG5ldyBEZWVwQ29weUJhcigpKTsKKworICAgIGZpbmFsIERlZXBDb3B5Rm9vIGRlZXBDb3B5Rm9vID0gZm9vLmRlZXBDb3B5KCk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRCYXIoKSwgZGVlcENvcHlGb28uZ2V0QmFyKCkpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TCgpLmdldCgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldEwoKS5nZXQoMCkpOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldFMoKS50b0FycmF5KG5ldyBEZWVwQ29weUJhclswXSlbMF0sICBkZWVwQ29weUZvby5nZXRTKCkudG9BcnJheShuZXcgRGVlcENvcHlCYXJbMF0pWzBdKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRNKCkuZ2V0KCJ0ZXN0IDMiKSwgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TSgpLmdldCgidGVzdCAzIikpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TGkoKS5nZXQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TGkoKS5nZXQoMCkpOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldFNpKCkudG9BcnJheShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0WzBdKVswXSwgIGRlZXBDb3B5Rm9vLmdldFNpKCkudG9BcnJheShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0WzBdKVswXSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TWkoKS5nZXQoInRlc3QgMyIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TWkoKS5nZXQoInRlc3QgMyIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzMjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkVudW1Db250YWluZXJzVGVzdENvbnN0YW50czsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5Hb2RCZWFuOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkdyZWVrR29kR29kZGVzczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitwdWJsaWMgY2xhc3MgVGVzdEVudW1Db250YWluZXJzIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEVudW1Db250YWluZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjEgPSBuZXcgR29kQmVhbigpOworICAgICAgICBiMS5hZGRUb0dvZGRlc3MoR3JlZWtHb2RHb2RkZXNzLkhFUkEpOworICAgICAgICBiMS5nZXRHb2RkZXNzKCkuYWRkKEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUpOworICAgICAgICBiMS5wdXRUb1Bvd2VyKEdyZWVrR29kR29kZGVzcy5aRVVTLCAxMDAwKTsKKyAgICAgICAgYjEuZ2V0UG93ZXIoKS5wdXQoR3JlZWtHb2RHb2RkZXNzLkhFUkEsIDMzMyk7CisgICAgICAgIGIxLnB1dFRvQnlBbGlhcygiTXIuIFoiLCBHcmVla0dvZEdvZGRlc3MuWkVVUyk7CisgICAgICAgIGIxLmFkZFRvSW1hZ2VzKCJCYXRocyBvZiBBcGhyb2RpdGUgMDEuanBlZyIpOworCisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjIgPSBuZXcgR29kQmVhbihiMSk7CisKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMyA9IG5ldyBHb2RCZWFuKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gc2VyaWFsaXplci5zZXJpYWxpemUoYjEpOworICAgICAgICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKGIzLCBieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldEdvZGRlc3MoKSAhPSBiMi5nZXRHb2RkZXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldFBvd2VyKCkgIT0gYjIuZ2V0UG93ZXIoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRHb2RkZXNzKCkgIT0gYjMuZ2V0R29kZGVzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRQb3dlcigpICE9IGIzLmdldFBvd2VyKCkpOworCisgICAgICAgIGZvciAoR29kQmVhbiBlYWNoIDogbmV3IEdvZEJlYW5bXXtiMSwgYjIsIGIzfSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEdvZGRlc3MoKS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuSEVSQSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZWFjaC5nZXRHb2RkZXNzKCkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLlBPU0VJRE9OKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0R29kZGVzcygpIGluc3RhbmNlb2YgRW51bVNldCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwMCksIGVhY2guZ2V0UG93ZXIoKS5nZXQoR3JlZWtHb2RHb2RkZXNzLlpFVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMzMzKSwgZWFjaC5nZXRQb3dlcigpLmdldChHcmVla0dvZEdvZGRlc3MuSEVSQSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldFBvd2VyKCkgaW5zdGFuY2VvZiBFbnVtTWFwKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEJ5QWxpYXMoKSBpbnN0YW5jZW9mIEhhc2hNYXApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEltYWdlcygpIGluc3RhbmNlb2YgSGFzaFNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUNvbnN0YW50cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWdodG5pbmcgYm9sdCIsIEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5BVFRSSUJVVEVTLmdldChHcmVla0dvZEdvZGRlc3MuWkVVUykpOworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5BVFRSSUJVVEVTIGluc3RhbmNlb2YgRW51bU1hcCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQkVBVVRZLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQkVBVVRZIGluc3RhbmNlb2YgRW51bVNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RGdWxsQ2FtZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk4ODk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RnVsbENhbWVsLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGU7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5mdWxsY2FtZWwuT25lT2ZFYWNoWlo7CitpbXBvcnQgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsLlVuZGVyc2NvcmVTcnY7CisKKy8vIFNhbml0eSBjaGVjayBmb3IgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5ICdmdWxsY2FtZWwnLgorLy8KK3B1YmxpYyBjbGFzcyBUZXN0RnVsbENhbWVsIGV4dGVuZHMgVGVzdENhc2UgeworCisgIHB1YmxpYyB2b2lkIHRlc3RDYW1lbENhc2VTeW50YXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU2VyaWFsaXplciAgIGJpbmFyeVNlcmlhbGl6ZXIgICA9IG5ldyAgIFRTZXJpYWxpemVyKG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBURGVzZXJpYWxpemVyIGJpbmFyeURlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKworICAgIE9uZU9mRWFjaFpaIG9iaiA9IG5ldyBPbmVPZkVhY2haWigpOworICAgIG9iai5zZXRBQml0ZSgoYnl0ZSkgMHhhZSk7CisgICAgb2JqLnNldEltRmFsc2UodHJ1ZSk7CisgICAgYnl0ZVtdIHNlckJ5dGVzID0gYmluYXJ5U2VyaWFsaXplci5zZXJpYWxpemUob2JqKTsKKyAgICBiaW5hcnlEZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUob2JqLCBzZXJCeXRlcyk7CisgICAgYXNzZXJ0VHJ1ZSggb2JqLmdldEFCaXRlKCkgPT0gKGJ5dGUpIDB4YWUgKTsKKyAgICBhc3NlcnRUcnVlKCBvYmouaXNJbUZhbHNlKCkgPT0gdHJ1ZSApOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENhbWVsQ2FzZVJwY01ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBVbmRlcnNjb3JlU3J2LklmYWNlIHNydiA9IG5ldyBVbmRlcnNjb3JlU3J2LklmYWNlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgbG9uZyBzb21lUnBjQ2FsbChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gMWw7CisgICAgICB9CisgICAgfTsKKyAgICBhc3NlcnRUcnVlKDFsID09IHNydi5zb21lUnBjQ2FsbCgidGVzdCIpKTsKKyAgfQorfQorCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc3NmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICBwcml2YXRlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtcDsKKyAgcHJpdmF0ZSBUUHJvdG9jb2wgaXByb3Q7CisgIHByaXZhdGUgVFByb3RvY29sIG9wcm90OworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICBpcHJvdCA9IG1vY2soVFByb3RvY29sLmNsYXNzKTsKKyAgICBvcHJvdCA9IG1vY2soVFByb3RvY29sLmNsYXNzKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gVEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFdyb25nTWVzc2FnZVR5cGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbiAoaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCA0MikpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gVEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdE5vU3VjaFNlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBTdHViUHJvY2Vzc29yIGltcGxlbWVudHMgVFByb2Nlc3NvciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHJvY2VzcyhUUHJvdG9jb2wgaW4sIFRQcm90b2NvbCBvdXQpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIFRNZXNzYWdlIG1zZyA9IGluLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIGlmICghImZ1bmMiLmVxdWFscyhtc2cubmFtZSkgfHwgbXNnLnR5cGUhPVRNZXNzYWdlVHlwZS5DQUxMIHx8IG1zZy5zZXFpZCE9NDIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oImluY29ycmVjdCBwYXJhbWV0ZXJzIik7CisgICAgICB9CisgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKCJmdW5jIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCA0MikpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEV4aXN0aW5nU2VydmljZSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3aGVuKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworICAgIG1wLnJlZ2lzdGVyUHJvY2Vzc29yKCJzZXJ2aWNlIiwgbmV3IFN0dWJQcm9jZXNzb3IoKSk7CisgICAgbXAucHJvY2VzcyhpcHJvdCwgb3Byb3QpOworICAgIHZlcmlmeShvcHJvdCkud3JpdGVNZXNzYWdlQmVnaW4oYW55KFRNZXNzYWdlLmNsYXNzKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFNlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisgICAgbXAucmVnaXN0ZXJEZWZhdWx0KG5ldyBTdHViUHJvY2Vzc29yKCkpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgICB2ZXJpZnkob3Byb3QpLndyaXRlTWVzc2FnZUJlZ2luKGFueShUTWVzc2FnZS5jbGFzcykpOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvblR5cGUuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE9wdGlvblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAyODVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0T3B0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5PcHRpb247CisKKy8vIFRlc3RzIGFuZCBkb2N1bWVudHMgYmVoYXZpb3IgZm9yIHRoZSAiT3B0aW9uPFQ+IiB0eXBlCitwdWJsaWMgY2xhc3MgVGVzdE9wdGlvblR5cGUgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHVibGljIHZvaWQgdGVzdFNvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiQ2h1Y2sgTm9ycmlzIjsKKyAgICAgICAgT3B0aW9uPFN0cmluZz4gb3B0aW9uID0gT3B0aW9uLmZyb21OdWxsYWJsZShuYW1lKTsKKworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbiBpbnN0YW5jZW9mIE9wdGlvbi5Tb21lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcHRpb24uaXNEZWZpbmVkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNvbWUoQ2h1Y2sgTm9ycmlzKSIsIG9wdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdGlvbi5vcigiZGVmYXVsdCB2YWx1ZSIpLCAiQ2h1Y2sgTm9ycmlzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhvcHRpb24uZ2V0KCksIkNodWNrIE5vcnJpcyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICAgICAgT3B0aW9uPFN0cmluZz4gb3B0aW9uID0gT3B0aW9uLmZyb21OdWxsYWJsZShuYW1lKTsKKworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbiBpbnN0YW5jZW9mIE9wdGlvbi5Ob25lKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uob3B0aW9uLmlzRGVmaW5lZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb25lIiwgb3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3B0aW9uLm9yKCJkZWZhdWx0IHZhbHVlIiksICJkZWZhdWx0IHZhbHVlIik7CisgICAgICAgIC8vIEV4cGVjdCBleGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9wdGlvbi5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgZ290IG5vIGV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKworICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBnb3Qgc29tZSBvdGhlciBleGNlcHRpb246ICIrZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZVNvbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3B0aW9uPFN0cmluZz4gc29tZSA9IE9wdGlvbi5zb21lKCJ3ZWUiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzb21lIGluc3RhbmNlb2YgT3B0aW9uLlNvbWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPcHRpb248SW50ZWdlcj4gbm9uZSA9IE9wdGlvbi5ub25lKCk7CisgICAgICAgIGFzc2VydFRydWUobm9uZSBpbnN0YW5jZW9mIE9wdGlvbi5Ob25lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkxZmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50czsKKworcHVibGljIGNsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRVBTSUxPTiA9IDAuMDAwMDAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgZG91YmxlIGNvbnN0YW50IGdlbmVyYXRlZCBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID0KKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBsaXN0IGl0ZW0gYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgPQorICAgICAgICAidGhlIHJlbmRlcmVkIHZhcmlhYmxlIHdpdGggbmFtZSAlcyBpcyBub3Qgb2YgZG91YmxlIHR5cGUiOworCisgICAgLy8gdG8gbWFrZSBzdXJlIGxpc3RzIGNvbnRhaW5pbmcgZG91YmxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlZERvdWJsZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZG91YmxlW10gRVhQRUNURURfTElTVCA9CisgICAgICAgICAgICB7MWQsLTEwMGQsMTAwZCw5MjIzMzcyMDM2ODU0Nzc1ODA3ZCwtOTIyMzM3MjAzNjg1NDc3NTgwN2QsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwKKyAgICAgICAgICAgICAtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M307CisgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9MSVNULmxlbmd0aCwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRVhQRUNURURfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNULAorICAgICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9MSVNUW2ldLAorICAgICAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QuZ2V0KGkpKSwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9MSVNUW2ldLCBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QuZ2V0KGkpLCBFUFNJTE9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgKKyAgICAgICAgLy8gICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgLy8gICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGFiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuUmV1c2U7CisKKy8vIFRlc3RzIHJldXNpbmcgb2JqZWN0cyBmb3IgZGVzZXJpYWxpemF0aW9uLgorLy8KK3B1YmxpYyBjbGFzcyBUZXN0UmV1c2UgZXh0ZW5kcyBUZXN0U3RydWN0IHsKKworICBwdWJsaWMgdm9pZCB0ZXN0UmV1c2VPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU2VyaWFsaXplciAgIGJpbmFyeVNlcmlhbGl6ZXIgICA9IG5ldyAgIFRTZXJpYWxpemVyKG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKyAgICBURGVzZXJpYWxpemVyIGJpbmFyeURlc2VyaWFsaXplciA9IG5ldyBURGVzZXJpYWxpemVyKG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpKTsKKworICAgIFJldXNlIHJ1MSA9IG5ldyBSZXVzZSgpOworICAgIEhhc2hTZXQ8U3RyaW5nPiBoczEgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgYnl0ZVtdIHNlckJ5dGVzOyAgICAKKyAgICBTdHJpbmcgc3QxID0gbmV3IFN0cmluZygic3RyaW5nMSIpOworICAgIFN0cmluZyBzdDIgPSBuZXcgU3RyaW5nKCJzdHJpbmcyIik7CisKKyAgICBydTEuc2V0VmFsMSgxMSk7CisgICAgcnUxLnNldFZhbDIoaHMxKTsKKyAgICBydTEuYWRkVG9WYWwyKHN0MSk7CisgICAgCisgICAgc2VyQnl0ZXMgPSBiaW5hcnlTZXJpYWxpemVyLnNlcmlhbGl6ZShydTEpOworCisgICAgLy8gdXBkYXRlIGhhc2ggc2V0IGFmdGVyIHNlcmlhbGl6YXRpb24KKyAgICBoczEuYWRkKHN0Mik7CisKKyAgICBiaW5hcnlEZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocnUxLCBzZXJCeXRlcyk7CisgICAKKyAgICBhc3NlcnRUcnVlKCBydTEuZ2V0VmFsMigpID09IGhzMSApOworICAgIGFzc2VydFRydWUoIGhzMS5zaXplKCkgPT0gMiApOworICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4MzFlNS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RTaG9ydFN0YWNrIGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RSSUFMUyA9IDU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUkVQUyA9IDEwMDAwMDAwOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxMCk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMCk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMik7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBvcCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTExLCBzLnBvcCgpKTsKLSAgICBzLnB1c2goKHNob3J0KTQwKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucG9wKCkpOwotICAgIHRyeSB7Ci0gICAgICBzLnBlZWsoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBzLnBvcCgpOwotICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8geWF5Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdyb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKGludCB0cmlhbCA9IDA7IHRyaWFsIDwgTlVNX1RSSUFMUzsgdHJpYWwrKykgewotICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgTlVNX1JFUFM7IHJlcCsrKSB7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExMSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTUpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgfQotICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2hvcnRTdGFjazogIiArIChlbmQtc3RhcnQpKTsKLQotICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN0YWNrPFNob3J0PiBzdGRTdGFjayA9IG5ldyBTdGFjazxTaG9ydD4oKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTUpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICB9Ci0gICAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbHQtaW4gc3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTdHJ1Y3QuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhCmluZGV4IGIwZGZmYzguLjMzNzllZDEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFN0cnVjdC5qYXZhCkBAIC0zMDgsMTIgKzMwOCw0MCBAQAogICAgICAgICBvYmplY3QudG9TdHJpbmcoKSk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFycmF5RXF1YWxzKGJ5dGVbXSBleHBlY3RlZCwgYnl0ZVtdIGFjdHVhbCkgeworICAgIGlmICghamF2YS51dGlsLkFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpIHsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGJ5dGUgYXJyYXkgZGlkIG5vdCBtYXRjaCBhY3R1YWwuIik7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBKYXZhVGVzdEhlbHBlciBvID0gbmV3IEphdmFUZXN0SGVscGVyKCk7CisgICAgCisgICAgZmluYWwgU3RyaW5nIHRlc3RTdHJpbmcgPSAidGVzdEJ5dGVzQnVmZmVyRmVhdHVyZXMiOworICAgIGZpbmFsIEphdmFUZXN0SGVscGVyIG8gPSBuZXcgSmF2YVRlc3RIZWxwZXIoKTsKKwogICAgIG8uc2V0UmVxX2JpbigoQnl0ZUJ1ZmZlciludWxsKTsKICAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2JpbihCeXRlQnVmZmVyLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CisKICAgICBvLnNldFJlcV9iaW4oKGJ5dGVbXSludWxsKTsKICAgICBhc3NlcnROdWxsKG8uZ2V0UmVxX2JpbigpKTsKKworICAgIG8uc2V0UmVxX2Jpbih0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCB0ZXN0U3RyaW5nLmdldEJ5dGVzKCkpOworICAgIGFzc2VydEFycmF5RXF1YWxzKHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoKSwgby5nZXRSZXFfYmluKCkpOworCisgICAgby5zZXRGaWVsZFZhbHVlKEphdmFUZXN0SGVscGVyLl9GaWVsZHMuUkVRX0JJTiwgbnVsbCk7CisgICAgYXNzZXJ0TnVsbChvLmdldFJlcV9iaW4oKSk7CisKKyAgICBvLnNldEZpZWxkVmFsdWUoSmF2YVRlc3RIZWxwZXIuX0ZpZWxkcy5SRVFfQklOLCBCeXRlQnVmZmVyLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcygpKSk7CisgICAgYXNzZXJ0QXJyYXlFcXVhbHModGVzdFN0cmluZy5nZXRCeXRlcygpLCBvLmdldFJlcV9iaW4oKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmYzIxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFVuc2FmZUJpbmFyaWVzLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IHRocmlmdC50ZXN0LlNhZmVCeXRlczsKK2ltcG9ydCB0aHJpZnQudGVzdC5VbnNhZmVCeXRlczsKKworLy8gIHRlc3QgZ2VuZXJhdGluZyB0eXBlcyB3aXRoIHVuLWNvcGllZCBieXRlW10vQnl0ZUJ1ZmZlciBpbnB1dC9vdXRwdXQKKy8vCitwdWJsaWMgY2xhc3MgVGVzdFVuc2FmZUJpbmFyaWVzIGV4dGVuZHMgVGVzdFN0cnVjdCB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGlucHV0KCkgeworICAgIHJldHVybiBuZXcgYnl0ZVtdezEsIDF9OworICB9CisKKyAgLy8KKyAgLy8gIHZlcmlmeSB0aGF0IHRoZSB1bnNhZmVfYmluYXJpZXMgb3B0aW9uIG1vZGlmaWVzIGJlaGF2aW9yCisgIC8vCisKKyAgLy8gIGNvbnN0cnVjdG9yIGRvZXNuJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgZ2V0dGVyIGRvZXNuJ3QgY29weQorICAvLyAgbm90ZTogdGhpcyBiZWhhdmlvciBpcyB0aGUgc2FtZSB3aXRoL3dpdGhvdXQgdGhlIGZsYWcsIGJ1dCBpZiB0aGlzIGRlZmF1bHQgZXZlciBjaGFuZ2VzLCB0aGUgY3VycmVudCBiZWhhdmlvcgorICAvLyAgICAgICAgc2hvdWxkIGJlIHJldGFpbmVkIHdoZW4gdXNpbmcgdGhpcyBmbGFnCisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVHZXR0ZXIoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIGJ5dGVbXSB2YWwgPSBzdHJ1Y3QuZ2V0Qnl0ZXMoKTsKKyAgICB2YWxbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLyAgc2V0dGVyIGRvZXNuJ3QgY29weQorICBwdWJsaWMgdm9pZCB0ZXN0VW5zYWZlU2V0dGVyKCl7CisgICAgVW5zYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFVuc2FmZUJ5dGVzKCk7CisKKyAgICBieXRlW10gdmFsID0gaW5wdXQoKTsKKyAgICBzdHJ1Y3Quc2V0Qnl0ZXModmFsKTsKKworICAgIHZhbFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBidWZmZXIgZG9lbnMndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVCdWZmZXJGb3IoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIEJ5dGVCdWZmZXIgdmFsID0gc3RydWN0LmJ1ZmZlckZvckJ5dGVzKCk7CisgICAgdmFsLmFycmF5KClbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezIsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICAvLworICAvLyAgdmVyaWZ5IHRoYXQgdGhlIGRlZmF1bHQgZ2VuZXJhdG9yIGRvZXMgbm90IGNoYW5nZSBiZWhhdmlvcgorICAvLworCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQ29uc3RydWN0b3IoKSB7CisKKyAgICBieXRlW10gaW5wdXQgPSBpbnB1dCgpOworICAgIFNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgU2FmZUJ5dGVzKEJ5dGVCdWZmZXIud3JhcChpbnB1dCkpOworCisgICAgaW5wdXRbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0U2FmZVNldHRlcigpIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQnVmZmVyRm9yKCl7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KCkpKTsKKworICAgIEJ5dGVCdWZmZXIgdmFsID0gc3RydWN0LmJ1ZmZlckZvckJ5dGVzKCk7CisgICAgdmFsLmFycmF5KClbMF0gPSAyOworCisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAorICAgICAgICBuZXcgYnl0ZVtdezEsIDF9LAorICAgICAgICBzdHJ1Y3QuZ2V0Qnl0ZXMoKSkKKyAgICApOworCisgIH0KKworfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9hc3luYy9UZXN0VEFzeW5jQ2xpZW50TWFuYWdlci5qYXZhCmluZGV4IGQ4OGI4YTUuLmM0ODNjZjIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvYXN5bmMvVGVzdFRBc3luY0NsaWVudE1hbmFnZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L2FzeW5jL1Rlc3RUQXN5bmNDbGllbnRNYW5hZ2VyLmphdmEKQEAgLTIyLDExICsyMiwxMyBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKQEAgLTM5LDEyICs0MSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NvY2tldDsKIAogaW1wb3J0IHRocmlmdC50ZXN0LkNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRXhjZXB0aW9uV2l0aEFNYXA7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuU3J2OwogaW1wb3J0IHRocmlmdC50ZXN0LlNydi5JZmFjZTsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnYuQXN5bmNDbGllbnQub25ld2F5TWV0aG9kX2NhbGw7Ci1pbXBvcnQgdGhyaWZ0LnRlc3QuU3J2LkFzeW5jQ2xpZW50LnByaW1pdGl2ZU1ldGhvZF9jYWxsOwotaW1wb3J0IHRocmlmdC50ZXN0LlNydi5Bc3luY0NsaWVudC52b2lkTWV0aG9kX2NhbGw7CiAKIHB1YmxpYyBjbGFzcyBUZXN0VEFzeW5jQ2xpZW50TWFuYWdlciBleHRlbmRzIFRlc3RDYXNlIHsKIApAQCAtNTMsNyArNTIsOSBAQAogICBwcml2YXRlIFRBc3luY0NsaWVudE1hbmFnZXIgY2xpZW50TWFuYWdlcl87CiAKICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBzZXJ2ZXJfID0gbmV3IFRIc0hhU2VydmVyKG5ldyBBcmdzKG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoU2VydmVyVGVzdEJhc2UuUE9SVCkpLnByb2Nlc3NvcihuZXcgU3J2LlByb2Nlc3NvcihuZXcgU3J2SGFuZGxlcigpKSkpOworICAgIHNlcnZlcl8gPSBuZXcgVEhzSGFTZXJ2ZXIobmV3IEFyZ3MobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldCgKKyAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKSkuCisgICAgICBwcm9jZXNzb3IobmV3IFNydi5Qcm9jZXNzb3IobmV3IFNydkhhbmRsZXIoKSkpKTsKICAgICBzZXJ2ZXJUaHJlYWRfID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHNlcnZlcl8uc2VydmUoKTsKQEAgLTc5LDgyICs4MCwxMzYgQEAKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CiAgICAgY2xpZW50LnNldFRpbWVvdXQoNTAwMCk7CiAgICAgYmFzaWNDYWxsKGNsaWVudCk7Ci0gIH0gCi0gIAorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRXJyb3JDYWxsVGVzdDxDIGV4dGVuZHMgVEFzeW5jQ2xpZW50LCBSPiB7CisgICAgZmluYWwgdm9pZCBydW5UZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+IGVycm9yID0gbmV3IEF0b21pY1JlZmVyZW5jZTxFeGNlcHRpb24+KCk7CisgICAgICBDIGNsaWVudCA9IGV4ZWN1dGVFcnJvcmluZ0NhbGwobmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8Uj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFIgcmVzcG9uc2UpIHsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICBlcnJvci5zZXQoZXhjZXB0aW9uKTsKKyAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgICBsYXRjaC5hd2FpdCgyLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOworICAgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGVycm9yLmdldCgpOworICAgICAgYXNzZXJ0Tm90TnVsbChleGNlcHRpb24pOworICAgICAgYXNzZXJ0U2FtZShleGNlcHRpb24sIGNsaWVudC5nZXRFcnJvcigpKTsKKyAgICAgIHZhbGlkYXRlRXJyb3IoY2xpZW50LCBleGNlcHRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGEgY2FsbCB0aGF0IGlzIGV4cGVjdGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdGVzdGluZyBjYWxsYmFjayB0aGF0IHNob3VsZCBiZSBpbnN0YWxsZWQuCisgICAgICogQHJldHVybiBUaGUgY2xpZW50IHRoZSBjYWxsIHdhcyBtYWRlIGFnYWluc3QuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbSBzZXR0aW5nIHVwIHRoZSBjbGllbnQgb3IgbWFraW5nIHRoZSBjYWxsLgorICAgICAqLworICAgIGFic3RyYWN0IEMgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPFI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogRnVydGhlciB2YWxpZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVycm9yIHJhaXNlZCBpbiB0aGUgcmVtb3RlIGNhbGwgYW5kIHRoZSBzdGF0ZSBvZiB0aGUKKyAgICAgKiBjbGllbnQgYWZ0ZXIgdGhhdCBjYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCBUaGUgY2xpZW50IHJldHVybmVkIGZyb20ge0BsaW5rICNleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2spfS4KKyAgICAgKiBAcGFyYW0gZXJyb3IgVGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgdGhlIHJlbW90ZSBjYWxsLgorICAgICAqLworICAgIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVFcnJvcihDIGNsaWVudCwgRXhjZXB0aW9uIGVycm9yKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmV4cGVjdGVkUmVtb3RlRXhjZXB0aW9uQ2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIG5ldyBFcnJvckNhbGxUZXN0PFNydi5Bc3luY0NsaWVudCwgQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIFNydi5Bc3luY0NsaWVudCBleGVjdXRlRXJyb3JpbmdDYWxsKEFzeW5jTWV0aG9kQ2FsbGJhY2s8Qm9vbGVhbj4gY2FsbGJhY2spIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgIGNsaWVudC5kZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZChmYWxzZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZXJyb3IgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0KKyAgICB9LnJ1blRlc3QoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFJlbW90ZUV4Y2VwdGlvbkNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEJvb2xlYW4+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuZGVjbGFyZWRFeGNlcHRpb25NZXRob2QodHJ1ZSwgY2FsbGJhY2spOworICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc1RpbWVvdXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25XaXRoQU1hcC5jbGFzcywgZXJyb3IuZ2V0Q2xhc3MoKSk7CisgICAgICAgIEV4Y2VwdGlvbldpdGhBTWFwIGV4Y2VwdGlvbldpdGhBTWFwID0gKEV4Y2VwdGlvbldpdGhBTWFwKSBlcnJvcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibGFoIiwgZXhjZXB0aW9uV2l0aEFNYXAuZ2V0QmxhaCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBleGNlcHRpb25XaXRoQU1hcC5nZXRNYXBfZmllbGQoKSk7CisgICAgICB9CisgICAgfS5ydW5UZXN0KCk7CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50LnNldFRpbWVvdXQoMTAwKTsKLSAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKG5ldyBBc3luY01ldGhvZENhbGxiYWNrPHByaW1pdGl2ZU1ldGhvZF9jYWxsPigpIHsKKyAgICBuZXcgRXJyb3JDYWxsVGVzdDxTcnYuQXN5bmNDbGllbnQsIEludGVnZXI+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKSkgewotICAgICAgICAgICAgU3RyaW5nV3JpdGVyIHNpbmsgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzaW5rLCB0cnVlKSk7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBUaW1lb3V0RXhjZXB0aW9uIGJ1dCBnb3QgIiArIHNpbmsudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICB9CisgICAgICBTcnYuQXN5bmNDbGllbnQgZXhlY3V0ZUVycm9yaW5nQ2FsbChBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IGNhbGxiYWNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3J2LkFzeW5jQ2xpZW50IGNsaWVudCA9IGdldENsaWVudCgpOworICAgICAgICBjbGllbnQuc2V0VGltZW91dCgxMDApOworICAgICAgICBjbGllbnQucHJpbWl0aXZlTWV0aG9kKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUocHJpbWl0aXZlTWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmYWlsKCJTaG91bGQgbm90IGhhdmUgZmluaXNoZWQgdGltZWQgb3V0IGNhbGwuIik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHZvaWQgdmFsaWRhdGVFcnJvcihTcnYuQXN5bmNDbGllbnQgY2xpZW50LCBFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbGllbnQuaGFzVGltZW91dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciBpbnN0YW5jZW9mIFRpbWVvdXRFeGNlcHRpb24pOwogICAgICAgfQotICAgIH0pOwotICAgIGxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOwotICAgIGFzc2VydFRydWUoY2xpZW50Lmhhc0Vycm9yKCkpOwotICAgIGFzc2VydFRydWUoY2xpZW50LmdldEVycm9yKCkgaW5zdGFuY2VvZiBUaW1lb3V0RXhjZXB0aW9uKTsKLSAgfSAKLSAgCisgICAgfS5ydW5UZXN0KCk7CisgIH0KKwogICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogICAgIFNydi5Bc3luY0NsaWVudCBjbGllbnQgPSBnZXRDbGllbnQoKTsKLSAgICBjbGllbnQudm9pZE1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQudm9pZE1ldGhvZF9jYWxsPigpIHsKKyAgICBjbGllbnQudm9pZE1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxWb2lkPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSh2b2lkTWV0aG9kX2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXNwb25zZS5nZXRSZXN1bHQoKTsKLSAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgIH0KKyAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVm9pZCByZXNwb25zZSkgeworICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7CisgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwogICAgICAgfQogICAgIH0pOwogICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOwogICAgIGFzc2VydFRydWUocmV0dXJuZWQuZ2V0KCkpOwotICB9IAotICAKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXlDYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKICAgICBTcnYuQXN5bmNDbGllbnQgY2xpZW50ID0gZ2V0Q2xpZW50KCk7Ci0gICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxvbmV3YXlNZXRob2RfY2FsbD4oKSB7CisgICAgY2xpZW50Lm9uZXdheU1ldGhvZChuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxWb2lkPigpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShvbmV3YXlNZXRob2RfY2FsbCByZXNwb25zZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3BvbnNlLmdldFJlc3VsdCgpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKKyAgICAgICAgbGF0Y2guY291bnREb3duKCk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgYXNzZXJ0VHJ1ZShyZXR1cm5lZC5nZXQoKSk7Ci0gIH0gCi0gIAorICB9CisKICAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsQ2FsbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBtYWtlIG11bHRpcGxlIGNhbGxzIHdpdGggZGVzZXJpYWxpemF0aW9uIGluIHRoZSBzZWxlY3RvciB0aHJlYWQgKHJlcHJvIEVyaWMncyBpc3N1ZSkKICAgICBpbnQgbnVtVGhyZWFkcyA9IDUwOwpAQCAtMTc2LDI5ICsyMzEsMjQgQEAKICAgICAgIG51bVN1Y2Nlc3NlcyArPSBydW5uYWJsZS5nZXROdW1TdWNjZXNzZXMoKTsKICAgICB9CiAgICAgYXNzZXJ0RXF1YWxzKG51bVRocmVhZHMgKiBudW1DYWxsc1BlclRocmVhZCwgbnVtU3VjY2Vzc2VzKTsKLSAgfSAgCi0gIAorICB9CisKICAgcHJpdmF0ZSBTcnYuQXN5bmNDbGllbnQgZ2V0Q2xpZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBUTm9uYmxvY2tpbmdTb2NrZXQgY2xpZW50U29ja2V0ID0gbmV3IFROb25ibG9ja2luZ1NvY2tldChTZXJ2ZXJUZXN0QmFzZS5IT1NULCBTZXJ2ZXJUZXN0QmFzZS5QT1JUKTsKICAgICByZXR1cm4gbmV3IFNydi5Bc3luY0NsaWVudChuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgY2xpZW50TWFuYWdlcl8sIGNsaWVudFNvY2tldCk7CiAgIH0KLSAgCisKICAgcHJpdmF0ZSB2b2lkIGJhc2ljQ2FsbChTcnYuQXN5bmNDbGllbnQgY2xpZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICBmaW5hbCBBdG9taWNCb29sZWFuIHJldHVybmVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwotICAgIGNsaWVudC5KYW5reSgxLCBuZXcgRmFpbHVyZUxlc3NDYWxsYmFjazxTcnYuQXN5bmNDbGllbnQuSmFua3lfY2FsbD4oKSB7CisgICAgY2xpZW50Lkphbmt5KDEsIG5ldyBGYWlsdXJlTGVzc0NhbGxiYWNrPEludGVnZXI+KCkgewogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKEphbmt5X2NhbGwgcmVzcG9uc2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0UmVzdWx0KCkpOwotICAgICAgICAgIHJldHVybmVkLnNldCh0cnVlKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgZmFpbChlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKLSAgICAgICAgfQorICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShJbnRlZ2VyIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNwb25zZS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgICB0cnkgewpAQCAtMjEzLDcgKzI2Myw3IEBACiAgICAgbGF0Y2guYXdhaXQoMTAwLCBUaW1lVW5pdC5TRUNPTkRTKTsKICAgICBhc3NlcnRUcnVlKHJldHVybmVkLmdldCgpKTsKICAgfQotICAKKwogICBwdWJsaWMgY2xhc3MgU3J2SGFuZGxlciBpbXBsZW1lbnRzIElmYWNlIHsKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgZm9yIGEgc3RhbmRhcmQgY2FsbCB0ZXN0aW5nCiAgICAgQE92ZXJyaWRlCkBAIC0yMzIsNyArMjgyLDcgQEAKICAgICAgIH0KICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1ldGhvZFdpdGhEZWZhdWx0QXJncyhpbnQgc29tZXRoaW5nKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IH0KIApAQCAtMjQ4LDIxICsyOTgsMzAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbmV3YXlNZXRob2QoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZGVjbGFyZWRFeGNlcHRpb25NZXRob2QoYm9vbGVhbiBzaG91bGRUaHJvd0RlY2xhcmVkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoc2hvdWxkVGhyb3dEZWNsYXJlZCkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uV2l0aEFNYXAoImJsYWgiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVW5leHBlY3RlZCEiKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhaWx1cmVMZXNzQ2FsbGJhY2s8VCBleHRlbmRzIFRBc3luY01ldGhvZENhbGw+IGltcGxlbWVudHMgQXN5bmNNZXRob2RDYWxsYmFjazxUPiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFpbHVyZUxlc3NDYWxsYmFjazxUPiBpbXBsZW1lbnRzIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VD4gewogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgICAgZmFpbChleGNlcHRpb24pOwogICAgIH0KICAgfQotICAKKwogICBwcml2YXRlIHN0YXRpYyB2b2lkIGZhaWwoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewogICAgIFN0cmluZ1dyaXRlciBzaW5rID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHNpbmssIHRydWUpKTsKICAgICBmYWlsKCJ1bmV4cGVjdGVkIGVycm9yICIgKyBzaW5rLnRvU3RyaW5nKCkpOwogICB9Ci0gIAorCiAgIHByaXZhdGUgY2xhc3MgSmFua3lSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKICAgICBwcml2YXRlIGludCBudW1DYWxsc187CiAgICAgcHJpdmF0ZSBpbnQgbnVtU3VjY2Vzc2VzXyA9IDA7CkBAIC0yODUsMTggKzM0NCwxMyBAQAogICAgICAgICAgIC8vIGNvbm5lY3QgYW4gYXN5bmMgY2xpZW50CiAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CiAgICAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiByZXR1cm5lZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKLSAgICAgICAgICBjbGllbnRfLkphbmt5KDEsIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFNydi5Bc3luY0NsaWVudC5KYW5reV9jYWxsPigpIHsKLSAgICAgICAgICAgIAorICAgICAgICAgIGNsaWVudF8uSmFua3koMSwgbmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8SW50ZWdlcj4oKSB7CisKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShKYW5reV9jYWxsIHJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3BvbnNlLmdldFJlc3VsdCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm5lZC5zZXQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7Ci0gICAgICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOwotICAgICAgICAgICAgICAgIGZhaWwoZSk7Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoSW50ZWdlciByZXN1bHQpIHsKKyAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3VsdC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgcmV0dXJuZWQuc2V0KHRydWUpOworICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0zMjEsNCArMzc1LDQgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Byb3RvY29sVGVzdEJhc2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhCmluZGV4IDJhYzAyMTEuLjAzODZkODMgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvUHJvdG9jb2xUZXN0QmFzZS5qYXZhCkBAIC0zMjcsNiArMzI3LDExIEBACiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uZXdheU1ldGhvZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgYm9vbGVhbiBkZWNsYXJlZEV4Y2VwdGlvbk1ldGhvZChib29sZWFuIHNob3VsZFRocm93KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzaG91bGRUaHJvdzsKKyAgICAgIH0KICAgICB9OwogCiAgICAgU3J2LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFNydi5Qcm9jZXNzb3IoaGFuZGxlcik7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlNzhlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFNob3J0U3RhY2sgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdE9wcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEpOworICAgIHMucHVzaCgoc2hvcnQpMTApOworICAgIHMucHVzaCgoc2hvcnQpMTEpOworICAgIHMucHVzaCgoc2hvcnQpMTIpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucG9wKCkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTEsIHMucG9wKCkpOworICAgIHMucHVzaCgoc2hvcnQpNDApOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucG9wKCkpOworICAgIHRyeSB7CisgICAgICBzLnBvcCgpOworICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgLy8geWF5CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUQmluYXJ5UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmY3OWQ3Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRCaW5hcnlQcm90b2NvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotCi1pbXBvcnQgdGhyaWZ0LnRlc3QuQm9uazsKLQotcHVibGljIGNsYXNzIFRlc3RUQmluYXJ5UHJvdG9jb2wgZXh0ZW5kcyBQcm90b2NvbFRlc3RCYXNlIHsKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBUUHJvdG9jb2xGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBib29sZWFuIGNhbkJlVXNlZE5ha2VkKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9PTURlbmlhbE9mU2VydmljZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFREZXNlcmlhbGl6ZXIgZGVzZXIgPSBuZXcgVERlc2VyaWFsaXplcihuZXcgVEJpbmFyeVByb3RvY29sCi0JCQkJCSAgICAuRmFjdG9yeShmYWxzZSwgZmFsc2UsIDEwMDApKTsKLSAgICBCb25rIGJvbmsgPSBuZXcgQm9uaygpOwotICAgIHRyeSB7Ci0gICAgICAvLyBJbnZhbGlkIHJlYWQgbGVuZ3RoIHNwZWNpZmllZCBoZXJlLiBXb3VsZCBjYXVzZSBhbiBPT00KLSAgICAgIC8vIHdpdGhvdXQgdGhlIGxpbWl0IG9uIHRoZSByZWFkIGxlbmd0aAotICAgICAgZGVzZXIuZGVzZXJpYWxpemUoYm9uaywgbmV3IGJ5dGVbXXsxMSwgMCwgMSwgMTI3LCAtMSwgLTEsIC0xfSk7Ci0gICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBJZ25vcmUgYXMgd2UgYXJlIG9ubHkgY2hlY2tpbmcgZm9yIE9PTSBpbiB0aGUgZmFpbHVyZSBjYXNlCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKaW5kZXggZDczNzZhYy4uYzJjYTFmYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQpAQCAtMTgsNiArMTgsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAoraW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcjsKKwogcHVibGljIGNsYXNzIFRlc3RUSlNPTlByb3RvY29sIGV4dGVuZHMgUHJvdG9jb2xUZXN0QmFzZSB7CiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBnZXRGYWN0b3J5KCkgewpAQCAtMjgsNCArMzQsMTUgQEAKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVVc2VkTmFrZWQoKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdEVzY2FwZWRVbmljb2RlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFN0cmluZyBqc29uU3RyaW5nID0gIlwiaGVsbG8gdW5pY29kZSBcXHUwZTAxXFx1ZDgzNFxcdWRkMWUgd29ybGRcIiI7CisgICAgU3RyaW5nIGV4cGVjdGVkU3RyaW5nID0gImhlbGxvIHVuaWNvZGUgXHUwZTAxXHVkODM0XHVkZDFlIHdvcmxkIjsKKworICAgIFRNZW1vcnlCdWZmZXIgYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXIoMTAwMCk7CisgICAgVEpTT05Qcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcik7CisgICAgYnVmZmVyLndyaXRlKGpzb25TdHJpbmcuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworCisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBwcm90b2NvbC5yZWFkU3RyaW5nKCkpOworICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKaW5kZXggMTk5YzcwNy4uODljZjUzNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQpAQCAtMTgsMjQgKzE4LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5GaXh0dXJlczsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URGVzZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CiAKLWltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OwotaW1wb3J0IHRocmlmdC50ZXN0LkhvbHlNb2xleTsKLWltcG9ydCB0aHJpZnQudGVzdC5OZXN0aW5nOwotaW1wb3J0IHRocmlmdC50ZXN0Lk9uZU9mRWFjaDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnY7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdDsKIAogcHVibGljIGNsYXNzIFRlc3RUUHJvdG9jb2xVdGlsIGV4dGVuZHMgVGVzdENhc2UgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTI1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkZpeHR1cmVzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CisKK2ltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OworaW1wb3J0IHRocmlmdC50ZXN0LkhvbHlNb2xleTsKKworcHVibGljIGNsYXNzIFRlc3RUU2ltcGxlSlNPTlByb3RvY29sIGV4dGVuZHMgVGVzdENhc2UgeworICBwcml2YXRlIFRNZW1vcnlCdWZmZXIgYnVmOworICBwcml2YXRlIFRTaW1wbGVKU09OUHJvdG9jb2wgcHJvdG87CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMTAwMCk7CisgICAgcHJvdG8gPSBuZXcgVFNpbXBsZUpTT05Qcm90b2NvbChidWYpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgYnVmVG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIGJ1Zi50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RIb2x5TW9sZXkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgZmluYWwgSG9seU1vbGV5IGhvbHlNb2xleSA9IEZpeHR1cmVzLmhvbHlNb2xleS5kZWVwQ29weSgpOworICAgIC8vIHVuc2V0IHNldHMgdGhhdCBwcm9kdWNlIGluY29uc2lzdGVudCBvcmRlcmluZyBiZXR3ZWVuIEpESzcvOAorICAgIGhvbHlNb2xleS51bnNldEJvbmtzKCk7CisgICAgaG9seU1vbGV5LnVuc2V0Q29udGFpbigpOworICAgIGhvbHlNb2xleS53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJiaWdcIjpbe1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjozNSxcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfSx7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOi00MixcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfV19IiwgYnVmVG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGluZygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBGaXh0dXJlcy5uZXN0aW5nLndyaXRlKHByb3RvKTsKKyAgICBhc3NlcnRFcXVhbHMoIntcIm15X2JvbmtcIjp7XCJ0eXBlXCI6MzEzMzcsXCJtZXNzYWdlXCI6XCJJIGFtIGEgYm9uay4uLiB4b3IhXCJ9LFwibXlfb29lXCI6e1wiaW1fdHJ1ZVwiOjEsXCJpbV9mYWxzZVwiOjAsXCJhX2JpdGVcIjotNDIsXCJpbnRlZ2VyMTZcIjoyNzAwMCxcImludGVnZXIzMlwiOjE2Nzc3MjE2LFwiaW50ZWdlcjY0XCI6NjAwMDAwMDAwMCxcImRvdWJsZV9wcmVjaXNpb25cIjozLjE0MTU5MjY1MzU4OTc5MyxcInNvbWVfY2hhcmFjdGVyc1wiOlwiSlNPTiBUSElTISBcXFwiXFx1MDAwMVwiLFwiem9tZ191bmljb2RlXCI6XCLTgOKFrs6dINCdzr/ihb/Qvsmh0LPQsM+B4oSOIM6RdHTOseKFvc6677+94oC8XCIsXCJ3aGF0X3dob1wiOjAsXCJiYXNlNjRcIjpcImJhc2U2NFwiLFwiYnl0ZV9saXN0XCI6WzEsMiwzXSxcImkxNl9saXN0XCI6WzEsMiwzXSxcImk2NF9saXN0XCI6WzEsMiwzXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0T25lT2ZFYWNoKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIEZpeHR1cmVzLm9uZU9mRWFjaC53cml0ZShwcm90byk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJpbV90cnVlXCI6MSxcImltX2ZhbHNlXCI6MCxcImFfYml0ZVwiOi00MixcImludGVnZXIxNlwiOjI3MDAwLFwiaW50ZWdlcjMyXCI6MTY3NzcyMTYsXCJpbnRlZ2VyNjRcIjo2MDAwMDAwMDAwLFwiZG91YmxlX3ByZWNpc2lvblwiOjMuMTQxNTkyNjUzNTg5NzkzLFwic29tZV9jaGFyYWN0ZXJzXCI6XCJKU09OIFRISVMhIFxcXCJcXHUwMDAxXCIsXCJ6b21nX3VuaWNvZGVcIjpcItOA4oWuzp0g0J3Ov+KFv9C+yaHQs9Cwz4HihI4gzpF0dM6x4oW9zrrvv73igLxcIixcIndoYXRfd2hvXCI6MCxcImJhc2U2NFwiOlwiYmFzZTY0XCIsXCJieXRlX2xpc3RcIjpbMSwyLDNdLFwiaTE2X2xpc3RcIjpbMSwyLDNdLFwiaTY0X2xpc3RcIjpbMSwyLDNdfSIsIGJ1ZlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhbmVQYXJ0c09mQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAvLyB1bnNldCBhbGwgdGhlIG1hcHMgd2l0aCBjb250YWluZXIga2V5cworICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qgc3RydWN0ID0gRml4dHVyZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdC5kZWVwQ29weSgpOworICAgIHN0cnVjdC51bnNldExpc3RfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3QudW5zZXRTZXRfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3QudW5zZXRNYXBfYnl0ZV9tYXAoKTsKKyAgICAvLyB1bnNldCBzZXRzIGFuZCBtYXBzIHRoYXQgcHJvZHVjZSBpbmNvbnNpc3RlbnQgb3JkZXJpbmcgYmV0d2VlbiBKREs3LzgKKyAgICBzdHJ1Y3QudW5zZXRCeXRlX3NldCgpOworICAgIHN0cnVjdC51bnNldEkxNl9zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRJNjRfc2V0KCk7CisgICAgc3RydWN0LnVuc2V0RG91YmxlX3NldCgpOworICAgIHN0cnVjdC51bnNldFN0cmluZ19zZXQoKTsKKyAgICBzdHJ1Y3QudW5zZXRJMTZfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3QudW5zZXRJMzJfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3QudW5zZXRJNjRfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3QudW5zZXREb3VibGVfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3QudW5zZXRTdHJpbmdfYnl0ZV9tYXAoKTsKKyAgICBzdHJ1Y3Qud3JpdGUocHJvdG8pOworICAgIGFzc2VydEVxdWFscygie1wiYV9ieXRlXCI6MTI3LFwiYV9pMTZcIjozMjAwMCxcImFfaTMyXCI6MTAwMDAwMDAwMCxcImFfaTY0XCI6MTA5OTUxMTYyNzc3NSxcImFfZG91YmxlXCI6NS42Nzg5LFwiYV9zdHJpbmdcIjpcIm15IHN0cmluZ1wiLFwiYV9iaW5hcnlcIjpcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXCIsXCJ0cnVlX2ZpZWxkXCI6MSxcImZhbHNlX2ZpZWxkXCI6MCxcImVtcHR5X3N0cnVjdF9maWVsZFwiOnt9LFwiYnl0ZV9saXN0XCI6Wy0xMjcsLTEsMCwxLDEyN10sXCJpMTZfbGlzdFwiOlstMSwwLDEsMzI3NjddLFwiaTMyX2xpc3RcIjpbLTEsMCwyNTUsNjU1MzUsMTY3NzcyMTUsMjE0NzQ4MzY0N10sXCJpNjRfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSw0Mjk0OTY3Mjk1LDEwOTk1MTE2Mjc3NzUsMjgxNDc0OTc2NzEwNjU1LDcyMDU3NTk0MDM3OTI3OTM1LDkyMjMzNzIwMzY4NTQ3NzU4MDddLFwiZG91YmxlX2xpc3RcIjpbMC4xLDAuMiwwLjNdLFwic3RyaW5nX2xpc3RcIjpbXCJmaXJzdFwiLFwic2Vjb25kXCIsXCJ0aGlyZFwiXSxcImJvb2xlYW5fbGlzdFwiOlsxLDEsMSwwLDAsMF0sXCJzdHJ1Y3RfbGlzdFwiOlt7fSx7fV0sXCJpMzJfc2V0XCI6WzEsMiwzXSxcImJvb2xlYW5fc2V0XCI6WzAsMV0sXCJzdHJ1Y3Rfc2V0XCI6W3t9XSxcImJ5dGVfYnl0ZV9tYXBcIjp7XCIxXCI6Mn0sXCJib29sZWFuX2J5dGVfbWFwXCI6e1wiMFwiOjAsXCIxXCI6MX0sXCJieXRlX2kxNl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjozMjc2N30sXCJieXRlX2kzMl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjoyMTQ3NDgzNjQ3fSxcImJ5dGVfaTY0X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjkyMjMzNzIwMzY4NTQ3NzU4MDd9LFwiYnl0ZV9kb3VibGVfbWFwXCI6e1wiMVwiOjAuMSxcIjJcIjotMC4xLFwiM1wiOjEwMDAwMDAuMX0sXCJieXRlX3N0cmluZ19tYXBcIjp7XCIxXCI6XCJcIixcIjJcIjpcImJsYWhcIixcIjNcIjpcImxvb29vb29vb29vb29vb25nIHN0cmluZ1wifSxcImJ5dGVfYm9vbGVhbl9tYXBcIjp7XCIxXCI6MSxcIjJcIjowfSxcImJ5dGVfbWFwX21hcFwiOntcIjBcIjp7fSxcIjFcIjp7XCIxXCI6MX0sXCIyXCI6e1wiMVwiOjEsXCIyXCI6Mn19LFwiYnl0ZV9zZXRfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX0sXCJieXRlX2xpc3RfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VGhyb3dzT25Db2xsZWN0aW9uS2V5cygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgRml4dHVyZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdC53cml0ZShwcm90byk7CisgICAgICBmYWlsKCJ0aGlzIHNob3VsZCB0aHJvdyBhIENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24iKTsKKyAgICB9IGNhdGNoIChUU2ltcGxlSlNPTlByb3RvY29sLkNvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24gZSkgeworICAgICAgLy8KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCmluZGV4IDA4YjU3ZTIuLjFkZWUyMmQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQpAQCAtMjYsMTAgKzI2LDEzIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKQEAgLTUxLDM4ICs1NCw1NCBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcnZlclRlc3RCYXNlIGV4dGVuZHMgVGVzdENhc2UgewogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEhhbmRsZXIgaW1wbGVtZW50cyBUaHJpZnRUZXN0LklmYWNlIHsKLSAgCisKICAgICBwdWJsaWMgVGVzdEhhbmRsZXIoKSB7fQotICAKKwogICAgIHB1YmxpYyB2b2lkIHRlc3RWb2lkKCkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFZvaWQoKVxuIik7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN0cmluZyhTdHJpbmcgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCisgICAgcHVibGljIGJvb2xlYW4gdGVzdEJvb2woYm9vbGVhbiB0aGluZykgeworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJvb2woIiArIHRoaW5nICsgIilcbiIpOworICAgICAgcmV0dXJuIHRoaW5nOworICAgIH0KKwogICAgIHB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCeXRlKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEkzMigiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBsb25nIHRlc3RJNjQobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEk2NCgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3REb3VibGUoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB0ZXN0QmluYXJ5KEJ5dGVCdWZmZXIgdGhpbmcpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih0aGluZy5yZW1haW5pbmcoKSAqIDMpOworICAgICAgdGhpbmcubWFyaygpOworICAgICAgd2hpbGUgKHRoaW5nLnJlbWFpbmluZygpID4gMCkgeworICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTAyWCAiLCB0aGluZy5nZXQoKSkpOworICAgICAgfQorICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgiICsgc2IudG9TdHJpbmcoKSArICIpXG4iKTsKKyAgICAgIHRoaW5nLnJlc2V0KCk7CisgICAgICByZXR1cm4gdGhpbmc7CisgICAgfQorCiAgICAgcHVibGljIFh0cnVjdCB0ZXN0U3RydWN0KFh0cnVjdCB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFN0cnVjdCh7IiArCiAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyB0aGluZy5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKwpAQCAtOTEsNyArMTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuaTY0X3RoaW5nICsgIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KSB7CiAgICAgICBYdHJ1Y3QgdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3ROZXN0KHsiICsKQEAgLTEwMyw3ICsxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmkzMl90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gbmVzdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxJbnRlZ2VyLEludGVnZXI+IHRlc3RNYXAoTWFwPEludGVnZXIsSW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXAoeyIpOwogICAgICAgU3lzdGVtLm91dC5wcmludCh0aGluZyk7CkBAIC0xMTcsNyArMTM2LDcgQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFNldDxJbnRlZ2VyPiB0ZXN0U2V0KFNldDxJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFNldCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTEzMiw3ICsxNTEsNyBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiB0ZXN0TGlzdChMaXN0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TGlzdCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTE0Nyw3OCArMTY2LDU4IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IHRlc3RNYXBNYXAoaW50IGhlbGxvKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpXG4iKTsKICAgICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IHBvcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgICBwb3MucHV0KGksIGkpOwogICAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgICB9Ci0gIAorCiAgICAgICBtYXBtYXAucHV0KDQsIHBvcyk7CiAgICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwotICAKKwogICAgICAgcmV0dXJuIG1hcG1hcDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+IHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KClcbiIpOwotICAKLSAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgICAgaGVsbG8uaTY0X3RoaW5nID0gMjsKLSAgCi0gICAgICBYdHJ1Y3QgZ29vZGJ5ZSA9IG5ldyBYdHJ1Y3QoKTsKLSAgICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7Ci0gICAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgICBnb29kYnllLmk2NF90aGluZyA9IChsb25nKTQ7Ci0gIAotICAgICAgSW5zYW5pdHkgY3JhenkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgIGNyYXp5LnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwotICAgICAgY3JhenkudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7Ci0gICAgICBjcmF6eS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUpOwotICAgICAgY3JhenkueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOwotICAgICAgY3JhenkueHRydWN0cy5hZGQoZ29vZGJ5ZSk7Ci0gICAgICBjcmF6eS54dHJ1Y3RzLmFkZChoZWxsbyk7Ci0gIAorCiAgICAgICBIYXNoTWFwPE51bWJlcnosSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIEluc2FuaXR5PigpOwogICAgICAgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PiBzZWNvbmRfbWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgSW5zYW5pdHk+KCk7OwotICAKLSAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5UV08sIGNyYXp5KTsKLSAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5USFJFRSwgY3JhenkpOwotICAKKworICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICAgICAgZmlyc3RfbWFwLnB1dChOdW1iZXJ6LlRIUkVFLCBhcmd1bWVudCk7CisKICAgICAgIEluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwogICAgICAgc2Vjb25kX21hcC5wdXQoTnVtYmVyei5TSVgsIGxvb25leSk7Ci0gIAorCiAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IGluc2FuZSA9CiAgICAgICAgIG5ldyBIYXNoTWFwPExvbmcsIE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4oKTsKICAgICAgIGluc2FuZS5wdXQoKGxvbmcpMSwgZmlyc3RfbWFwKTsKICAgICAgIGluc2FuZS5wdXQoKGxvbmcpMiwgc2Vjb25kX21hcCk7Ci0gIAorCiAgICAgICByZXR1cm4gaW5zYW5lOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aShieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIE1hcDxTaG9ydCxTdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1KSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TXVsdGkoKVxuIik7Ci0gIAorCiAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7OwogICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CiAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKQEAgLTIyNiwyMyArMjI1LDI0IEBACiAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOwogICAgICAgcmV0dXJuIGhlbGxvOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcpIHRocm93cyBYY2VwdGlvbiwgVEV4Y2VwdGlvbiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RXhjZXB0aW9uKCIrYXJnKyIpXG4iKTsKLSAgICAgIGlmIChhcmcuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgewogICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CiAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKICAgICAgICAgeC5tZXNzYWdlID0gYXJnOwogICAgICAgICB0aHJvdyB4OwotICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKGFyZyk7CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwogICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnOwogICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYY2VwdGlvbiwgWGNlcHRpb24yIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIilcbiIpOwogICAgICAgaWYgKGFyZzAuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CkBAIC0yNTcsMTcgKzI1NywxNyBAQAogICAgICAgICB4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgICAgICB0aHJvdyB4OwogICAgICAgfQotICAKKwogICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdE9uZXdheSgiICsgSW50ZWdlci50b1N0cmluZyhzbGVlcEZvcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICIpID0+IHNsZWVwaW5nLi4uIik7CiAgICAgICB0cnkgewotICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBGb3IgKiAxMDAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogU0xFRVBfREVMQVkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgc2xlZXBpbmchIik7CiAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CkBAIC0yODIsNyArMjgyLDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUID0gSW50ZWdlci52YWx1ZU9mKAogICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5wb3J0IiwgIjkwOTAiKSk7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNPQ0tFVF9USU1FT1VUID0gMTAwMDsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU0xFRVBfREVMQVkgPSAxMDAwOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTT0NLRVRfVElNRU9VVCA9IDE1MDA7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFh0cnVjdCBYU1RSVUNUID0gbmV3IFh0cnVjdCgiWmVybyIsIChieXRlKSAxLCAtMywgLTUpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYdHJ1Y3QyIFhTVFJVQ1QyID0gbmV3IFh0cnVjdDIoKGJ5dGUpMSwgWFNUUlVDVCwgNSk7CiAKQEAgLTI5Niw2ICsyOTcsMTMgQEAKIAogICBwdWJsaWMgYWJzdHJhY3QgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KSB0aHJvd3MgRXhjZXB0aW9uOwogCisgIHByaXZhdGUgdm9pZCB0ZXN0Qm9vbChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYm9vbGVhbiB0ID0gdGVzdENsaWVudC50ZXN0Qm9vbCh0cnVlKTsKKyAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdCk7CisgICAgYm9vbGVhbiBmID0gdGVzdENsaWVudC50ZXN0Qm9vbChmYWxzZSk7CisgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBmKTsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCB0ZXN0Qnl0ZShUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSBpOCA9IHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpMSk7CiAgICAgYXNzZXJ0RXF1YWxzKDEsIGk4KTsKQEAgLTMyNyw3ICszMzUsNyBAQAogICAvLyB0b2RvOiBhZGQgYXNzZXJ0aW9ucwogICBwcml2YXRlIHZvaWQgdGVzdEluc2FuaXR5KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBJbnNhbml0eSBpbnNhbmU7Ci0gIAorCiAgICAgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CiAgICAgaW5zYW5lLnVzZXJNYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBMb25nPigpOwogICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUwMDApOwpAQCAtMzQ1LDcgKzM1Myw3IEBACiAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKICAgICAgIE1hcDxOdW1iZXJ6LEluc2FuaXR5PiB2YWwgPSB3aG9hLmdldChrZXkpOwogICAgICAgU3lzdGVtLm91dC5wcmludChrZXkgKyAiID0+IHsiKTsKLSAgCisKICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgewogICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CkBAIC0zNTcsNyArMzY1LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7Ci0gIAorCiAgICAgICAgIExpc3Q8WHRydWN0PiB4dHJ1Y3RzID0gdjIueHRydWN0czsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwogICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKSB7CkBAIC0zNjYsNyArMzc0LDcgQEAKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOwotICAKKwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgIH0KICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwpAQCAtMzc0LDExICszODIsMTQgQEAKICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIHVzZUFzeW5jUHJvY2Vzc29yKCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogZ2V0UHJvdG9jb2xzKCkpIHsKLSAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLSAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gdXNlQXN5bmNQcm9jZXNzb3IoKSA/IG5ldyBUaHJpZnRUZXN0LkFzeW5jUHJvY2Vzc29yPEFzeW5jVGVzdEhhbmRsZXI+KG5ldyBBc3luY1Rlc3RIYW5kbGVyKCkpIDogbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPihuZXcgVGVzdEhhbmRsZXIoKSk7CiAKICAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5KTsKIApAQCAtMzkyLDYgKzQwMyw3IEBACiAgICAgICBvcGVuKHRyYW5zcG9ydCk7CiAgICAgICB0ZXN0Vm9pZCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RTdHJpbmcodGVzdENsaWVudCk7CisgICAgICB0ZXN0Qm9vbCh0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RCeXRlKHRlc3RDbGllbnQpOwogICAgICAgdGVzdEkzMih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3RJNjQodGVzdENsaWVudCk7CkBAIC00MDYsOSArNDE4LDExIEBACiAgICAgICB0ZXN0VHlwZWRlZih0ZXN0Q2xpZW50KTsKICAgICAgIHRlc3ROZXN0ZWRNYXAodGVzdENsaWVudCk7CiAgICAgICB0ZXN0SW5zYW5pdHkodGVzdENsaWVudCk7Ci0gICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOwogICAgICAgdGVzdEV4Y2VwdGlvbih0ZXN0Q2xpZW50KTsKKyAgICAgIHRlc3RPbmV3YXkodGVzdENsaWVudCk7CisgICAgICB0ZXN0STMyKHRlc3RDbGllbnQpOwogICAgICAgdHJhbnNwb3J0LmNsb3NlKCk7CisgICAgICBzb2NrZXQuY2xvc2UoKTsKIAogICAgICAgc3RvcFNlcnZlcigpOwogICAgIH0KQEAgLTQxOSw3ICs0MzMsNyBAQAogICB9CiAKICAgcHVibGljIExpc3Q8VFByb3RvY29sRmFjdG9yeT4gZ2V0UHJvdG9jb2xzKCkgewotICAgIHJldHVybiBQUk9UT0NPTFM7ICAKKyAgICByZXR1cm4gUFJPVE9DT0xTOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RMaXN0KFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTQ1NSwxNCArNDY5LDE0IEBACiAgICAgICB0ZXN0Q2xpZW50LnRlc3RNYXBNYXAoMSk7CiAgICAgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IG1hcG1hcCA9CiAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBwb3MgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IG5lZyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgcG9zLnB1dChpLCBpKTsKICAgICAgIG5lZy5wdXQoLWksIC1pKTsKICAgICB9Ci0gIAorCiAgICAgbWFwbWFwLnB1dCg0LCBwb3MpOwogICAgIG1hcG1hcC5wdXQoLTQsIG5lZyk7CiAgICAgYXNzZXJ0RXF1YWxzKG1hcG1hcCwgbW0pOwpAQCAtNDc0LDcgKzQ4OCwxMCBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RPbmV3YXkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDMpOworICAgIGxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSk7CisgICAgbG9uZyBlbGFwc2VkID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbjsKKyAgICBhc3NlcnRUcnVlKGVsYXBzZWQgPCA1MDApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHRlc3RTZXQoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewpAQCAtNTE5LDQyICs1MzYsMTc2IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAogICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgewogICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpOwotICAKKyAgICAgIFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPiBwcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+KGhhbmRsZXIpOworCiAgICAgICBmaW5hbCBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQ2FsbENvdW50aW5nVHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOwotICAKKwogICAgICAgc3RhcnRTZXJ2ZXIocHJvY2Vzc29yLCBwcm90b0ZhY3RvcnksIGZhY3RvcnkpOwogICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZhY3RvcnkuY291bnQpOwotICAKKwogICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChIT1NULCBQT1JUKTsKICAgICAgIHNvY2tldC5zZXRUaW1lb3V0KFNPQ0tFVF9USU1FT1VUKTsKICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gZ2V0Q2xpZW50VHJhbnNwb3J0KHNvY2tldCk7CiAgICAgICBvcGVuKHRyYW5zcG9ydCk7Ci0gIAorCiAgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwcm90b0ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKICAgICAgIFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpOwogICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRlc3RDbGllbnQudGVzdEJ5dGUoKGJ5dGUpIDApKTsKICAgICAgIGFzc2VydEVxdWFscygyLCBmYWN0b3J5LmNvdW50KTsKKyAgICAgIHNvY2tldC5jbG9zZSgpOwogICAgICAgc3RvcFNlcnZlcigpOwogICAgIH0KICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0RXhjZXB0aW9uKFRocmlmdFRlc3QuQ2xpZW50IHRlc3RDbGllbnQpIHRocm93cyBURXhjZXB0aW9uLCBYY2VwdGlvbiB7Ci0gICAgLy9AVE9ETyB0ZXN0RXhjZXB0aW9uCi0gICAgLy90ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpOwotICAgIC8qdHJ5IHsKLSAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOworICAgIHRyeSB7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICBhc3NlcnQgZmFsc2U7CiAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7Ci0gICAgCWFzc2VydEVxdWFscyhlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOwotICAgIH0qLwotICAgIC8qdHJ5IHsKLSAgICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgYXNzZXJ0RXF1YWxzKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7CisgICAgICBhc3NlcnRFcXVhbHMoZS5lcnJvckNvZGUsIDEwMDEpOworICAgIH0KKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICBhc3NlcnQgZmFsc2U7CiAgICAgfSBjYXRjaChURXhjZXB0aW9uIGUpIHsKLSAgICAJYXNzZXJ0RXF1YWxzKGUubWVzc2FnZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7Ci0gICAgfSovCisgICAgfQorICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7CisgIH0KKworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNUZXN0SGFuZGxlciBpbXBsZW1lbnRzIFRocmlmdFRlc3QuQXN5bmNJZmFjZSB7CisKKyAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZChBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKFN0cmluZyB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxTdHJpbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RTdHJpbmcodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbChib29sZWFuIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEJvb2xlYW4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RCb29sKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGUoYnl0ZSB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0Qnl0ZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RJMzIoaW50IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPEludGVnZXI+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RJMzIodGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0STY0KGxvbmcgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9uZz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEk2NCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoZG91YmxlIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPERvdWJsZT4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdERvdWJsZSh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnkoQnl0ZUJ1ZmZlciB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxCeXRlQnVmZmVyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0QmluYXJ5KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RydWN0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE5lc3QoWHRydWN0MiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxYdHJ1Y3QyPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TmVzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoTWFwPEludGVnZXIsIEludGVnZXI+IHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdE1hcCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdNYXAoTWFwPFN0cmluZywgU3RyaW5nPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxNYXA8U3RyaW5nLCBTdHJpbmc+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U3RyaW5nTWFwKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFNldChTZXQ8SW50ZWdlcj4gdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8U2V0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0U2V0KHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdExpc3QoTGlzdDxJbnRlZ2VyPiB0aGluZywgQXN5bmNNZXRob2RDYWxsYmFjazxMaXN0PEludGVnZXI+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TGlzdCh0aGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtKE51bWJlcnogdGhpbmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TnVtYmVyej4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKGhhbmRsZXIudGVzdEVudW0odGhpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZWRlZihsb25nIHRoaW5nLCBBc3luY01ldGhvZENhbGxiYWNrPExvbmc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIHJlc3VsdEhhbmRsZXIub25Db21wbGV0ZShoYW5kbGVyLnRlc3RUeXBlZGVmKHRoaW5nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdE1hcE1hcChpbnQgaGVsbG8sIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TWFwTWFwKGhlbGxvKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50LCBBc3luY01ldGhvZENhbGxiYWNrPE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0SW5zYW5pdHkoYXJndW1lbnQpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGkoYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBNYXA8U2hvcnQsIFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUoaGFuZGxlci50ZXN0TXVsdGkoYXJnMCxhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Vm9pZD4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEV4Y2VwdGlvbigiK2FyZysiKVxuIik7CisgICAgICBpZiAoIlhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHRocm93IHg7CisgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcih4KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIGlmICgiVEV4Y2VwdGlvbiIuZXF1YWxzKGFyZykpIHsKKyAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgorICAgICAgICAvLyByZXN1bHRIYW5kbGVyLm9uRXJyb3IobmV3IFRFeGNlcHRpb24oYXJnKSk7CisgICAgICAgIC8vIHJldHVybjsKKyAgICAgICAgLy8gVW5zcGVjaWZpZWQgZXhjZXB0aW9uIHNob3VsZCB5aWVsZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBvbiBjbGllbnQgc2lkZQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihhcmcpOworICAgICAgfQorICAgICAgcmVzdWx0SGFuZGxlci5vbkNvbXBsZXRlKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEsIEFzeW5jTWV0aG9kQ2FsbGJhY2s8WHRydWN0PiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAvL1RvIGNoYW5nZSBib2R5IG9mIGltcGxlbWVudGVkIG1ldGhvZHMgdXNlIEZpbGUgfCBTZXR0aW5ncyB8IEZpbGUgVGVtcGxhdGVzLgorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IHNlY29uZHNUb1NsZWVwLCBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGhhbmRsZXIudGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CisgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgfQogICB9CiAKIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RBc3luY1NlcnZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVGVzdEFzeW5jU2VydmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNTRjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3RBc3luY1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyOworCitwdWJsaWMgY2xhc3MgVGVzdEFzeW5jU2VydmVyIGV4dGVuZHMgVGVzdE5vbmJsb2NraW5nU2VydmVyIHsKKworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgYm9vbGVhbiB1c2VBc3luY1Byb2Nlc3NvcigpeworICAgICAgIHJldHVybiB0cnVlOworICAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCmluZGV4IDc4Mzc2OTUuLjNkZjNiZDggMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgLy8gVHJhbnNwb3J0CiAgICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQobmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5Ob25ibG9ja2luZ0Fic3RyYWN0U2VydmVyU29ja2V0QXJncygpLnBvcnQoUE9SVCkpOwogCiAgICAgICAgICAgc2VydmVyID0gZ2V0U2VydmVyKHByb2Nlc3NvciwgdFNlcnZlclNvY2tldCwgcHJvdG9GYWN0b3J5LCBmYWN0b3J5KTsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKaW5kZXggNDUzNjliYS4uZmVhYTk3MiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCkBAIC0xOSwyNiArMTksNDAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50ZXN0OwogCi0vLyBHZW5lcmF0ZWQgY29kZQotaW1wb3J0IHRocmlmdC50ZXN0Lio7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USHR0cENsaWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2ltcGxlSlNPTlByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmFzdEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTU0xUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU29ja2V0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisvLyBHZW5lcmF0ZWQgY29kZQoraW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OworaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZTsKK2ltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OworaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uOworaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uMjsKK2ltcG9ydCB0aHJpZnQudGVzdC5YdHJ1Y3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuWHRydWN0MjsKIAogLyoqCiAgKiBUZXN0IEphdmEgY2xpZW50IGZvciB0aHJpZnQuIEVzc2VudGlhbGx5IGp1c3QgYSBjb3B5IG9mIHRoZSBDKysgdmVyc2lvbiwKQEAgLTQ3LDcwICs2MSwxNTEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50IHsKKworICBwcml2YXRlIHN0YXRpYyBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfU1RSVUNUUyA9IDI7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfQ09OVEFJTkVSUyA9IDQ7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfUFJPVE9DT0xTID0gMTY7CisgIHByaXZhdGUgc3RhdGljIGludCBFUlJfVU5LTk9XTiA9IDY0OworCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBbXSBhcmdzKSB7CisgICAgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKyAgICBpbnQgcG9ydCA9IDkwOTA7CisgICAgaW50IG51bVRlc3RzID0gMTsKKyAgICBTdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOworICAgIFN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CisgICAgYm9vbGVhbiBzc2wgPSBmYWxzZTsKKworICAgIGludCBzb2NrZXRUaW1lb3V0ID0gMTAwMDsKKwogICAgIHRyeSB7Ci0gICAgICBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwotICAgICAgaW50IHBvcnQgPSA5MDkwOwotICAgICAgU3RyaW5nIHVybCA9IG51bGw7Ci0gICAgICBpbnQgbnVtVGVzdHMgPSAxOwotICAgICAgYm9vbGVhbiBmcmFtZWQgPSBmYWxzZTsKLQotICAgICAgaW50IHNvY2tldFRpbWVvdXQgPSAxMDAwOwotCi0gICAgICB0cnkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1oIikpIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGhvc3Rwb3J0ID0gKGFyZ3NbKytpXSkuc3BsaXQoIjoiKTsKLSAgICAgICAgICAgIGhvc3QgPSBob3N0cG9ydFswXTsKLSAgICAgICAgICAgIHBvcnQgPSBJbnRlZ2VyLnZhbHVlT2YoaG9zdHBvcnRbMV0pOwotICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1mIikgfHwgYXJnc1tpXS5lcXVhbHMoIi1mcmFtZWQiKSkgewotICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdSIpKSB7Ci0gICAgICAgICAgICB1cmwgPSBhcmdzWysraV07Ci0gICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW4iKSkgewotICAgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1srK2ldKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItdGltZW91dCIpKSB7Ci0gICAgICAgICAgICBzb2NrZXRUaW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbKytpXSk7Ci0gICAgICAgICAgfQorICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0taG9zdCIpKSB7CisgICAgICAgICAgaG9zdCA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICBob3N0LnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcG9ydCIpKSB7CisgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1uIikgfHwKKyAgICAgICAgICAgIGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10ZXN0bG9vcHMiKSl7CisgICAgICAgICAgbnVtVGVzdHMgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS10aW1lb3V0IikpIHsKKyAgICAgICAgICBzb2NrZXRUaW1lb3V0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXByb3RvY29sIikpIHsKKyAgICAgICAgICBwcm90b2NvbF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHByb3RvY29sX3R5cGUudHJpbSgpOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS10cmFuc3BvcnQiKSkgeworICAgICAgICAgIHRyYW5zcG9ydF90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1zc2wiKSkgeworICAgICAgICAgIHNzbCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi0taGVscCIpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvd2VkIG9wdGlvbnM6Iik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taG9zdD1hcmcgKD0iICsgaG9zdCArICIpXHRIb3N0IHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkLCBodHRwIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcHJvdG9jb2w9YXJnICg9IiArIHByb3RvY29sX3R5cGUgKyAiKVx0UHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGlqIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10ZXN0bG9vcHNbLS1uXT1hcmcgKD0iICsgbnVtVGVzdHMgKyAiKVx0TnVtYmVyIG9mIFRlc3RzIik7CisgICAgICAgICAgU3lzdGVtLmV4aXQoMCk7CiAgICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuIG5vdCBwYXJzZSBhcmd1bWVudHMhIFNlZSAtLWhlbHAiKTsKKyAgICAgIFN5c3RlbS5leGl0KEVSUl9VTktOT1dOKTsKKyAgICB9CiAKLSAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgIHRyeSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHByb3RvY29sIHR5cGUhICIgKyBwcm90b2NvbF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZhc3RmcmFtZWQiKSkgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biB0cmFuc3BvcnQgdHlwZSEgIiArIHRyYW5zcG9ydF90eXBlKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImh0dHAiKSAmJiBzc2wgPT0gdHJ1ZSkgeworICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTU0wgaXMgbm90IHN1cHBvcnRlZCBvdmVyIGh0dHAuIik7CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgfQogCi0gICAgICBpZiAodXJsICE9IG51bGwpIHsKKyAgICBUVHJhbnNwb3J0IHRyYW5zcG9ydCA9IG51bGw7CisKKyAgICB0cnkgeworICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiaHR0cCIpKSB7CisgICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovLyIgKyBob3N0ICsgIjoiICsgcG9ydCArICIvc2VydmljZSI7CiAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBUSHR0cENsaWVudCh1cmwpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgVFNvY2tldCBzb2NrZXQgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgVFNvY2tldCBzb2NrZXQgPSBudWxsOworICAgICAgICBpZiAoc3NsID09IHRydWUpIHsKKyAgICAgICAgICBzb2NrZXQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoaG9zdCwgcG9ydCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc29ja2V0ID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7CisgICAgICAgIH0KICAgICAgICAgc29ja2V0LnNldFRpbWVvdXQoc29ja2V0VGltZW91dCk7CiAgICAgICAgIHRyYW5zcG9ydCA9IHNvY2tldDsKLSAgICAgICAgaWYgKGZyYW1lZCkgeworICAgICAgICBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJidWZmZXJlZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmcmFtZWQiKSkgewogICAgICAgICAgIHRyYW5zcG9ydCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zcG9ydCk7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodHJhbnNwb3J0KTsKICAgICAgICAgfQogICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CisgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgU3lzdGVtLmV4aXQoRVJSX1VOS05PV04pOworICAgIH0KIAotICAgICAgVEJpbmFyeVByb3RvY29sIGJpbmFyeVByb3RvY29sID0KLSAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9Ci0gICAgICAgIG5ldyBUaHJpZnRUZXN0LkNsaWVudChiaW5hcnlQcm90b2NvbCk7Ci0gICAgICBJbnNhbml0eSBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICBUUHJvdG9jb2wgdFByb3RvY29sID0gbnVsbDsKKyAgICBUUHJvdG9jb2wgdFByb3RvY29sMiA9IG51bGw7CisgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICB0UHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGljIikpIHsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICB9CiAKLSAgICAgIGxvbmcgdGltZU1pbiA9IDA7Ci0gICAgICBsb25nIHRpbWVNYXggPSAwOwotICAgICAgbG9uZyB0aW1lVG90ID0gMDsKKyAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICB0UHJvdG9jb2wyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHRQcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJUaHJpZnRUZXN0Iik7CisgICAgfQogCi0gICAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRlc3RzOyArK3Rlc3QpIHsKKyAgICBUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHRQcm90b2NvbCk7CisgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CiAKKyAgICBsb25nIHRpbWVNaW4gPSAwOworICAgIGxvbmcgdGltZU1heCA9IDA7CisgICAgbG9uZyB0aW1lVG90ID0gMDsKKworICAgIGludCByZXR1cm5Db2RlID0gMDsKKyAgICBmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRlc3RzOyArK3Rlc3QpIHsKKyAgICAgIHRyeSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBDT05ORUNUIFRFU1QKICAgICAgICAgICovCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGVzdCAjIiArICh0ZXN0KzEpICsgIiwgIiArICJjb25uZWN0ICIgKyBob3N0ICsgIjoiICsgcG9ydCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKLSAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHRyYW5zcG9ydC5pc09wZW4oKSA9PSBmYWxzZSkgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7CisgICAgICAgICAgICB0dHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChFUlJfVU5LTk9XTik7CisgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOwpAQCAtMTI0LDYgKzIxOSw3IEBACiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gdm9pZFxuIik7CiAgICAgICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB0YXgpIHsKICAgICAgICAgICB0YXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMzIsMTMgKzIyOCwzNCBAQAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOwogICAgICAgICBTdHJpbmcgcyA9IHRlc3RDbGllbnQudGVzdFN0cmluZygiVGVzdCIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgaWYgKCFzLmVxdWFscygiVGVzdCIpKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBNdWx0aXBsZXhlZCB0ZXN0CisgICAgICAgICAqLworICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICAgICAgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kQ2xpZW50ID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KHRQcm90b2NvbDIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInNlY29uZHRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgIHMgPSBzZWNvbmRDbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgICBpZiAoIXMuZXF1YWxzKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfUFJPVE9DT0xTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKICAgICAgICAgICogQllURSBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgxKSIpOwogICAgICAgICBieXRlIGk4ID0gdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkxKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGk4ICsgIlxuIik7CisgICAgICAgIGlmIChpOCAhPSAxKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJMzIgVEVTVApAQCAtMTQ2LDYgKzI2MywxMCBAQAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STMyKC0xKSIpOwogICAgICAgICBpbnQgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIGkzMiArICJcbiIpOworICAgICAgICBpZiAoaTMyICE9IC0xKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBJNjQgVEVTVApAQCAtMTUzLDEzICsyNzQsNTIgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CiAgICAgICAgIGxvbmcgaTY0ID0gdGVzdENsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OEwpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgaTY0ICsgIlxuIik7CisgICAgICAgIGlmIChpNjQgIT0gLTM0MzU5NzM4MzY4TCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogRE9VQkxFIFRFU1QKICAgICAgICAgICovCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7Ci0gICAgICAgIGRvdWJsZSBkdWIgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoNS4zMjUwOTgyMzUpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RG91YmxlKC01LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgZG91YmxlIGR1YiA9IHRlc3RDbGllbnQudGVzdERvdWJsZSgtNS4zMjUwOTgyMzUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgZHViICsgIlxuIik7CisgICAgICAgIGlmIChNYXRoLmFicyhkdWIgLSAoLTUuMzI1MDk4MjM1KSkgPiAwLjAwMSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQklOQVJZIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJpbmFyeSgtMTI4Li4uMTI3KSA9ICIpOworICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LCAtOTgsIC05NywgLTk2LCAtOTUsIC05NCwgLTkzLCAtOTIsIC05MSwgLTkwLCAtODksIC04OCwgLTg3LCAtODYsIC04NSwgLTg0LCAtODMsIC04MiwgLTgxLCAtODAsIC03OSwgLTc4LCAtNzcsIC03NiwgLTc1LCAtNzQsIC03MywgLTcyLCAtNzEsIC03MCwgLTY5LCAtNjgsIC02NywgLTY2LCAtNjUsIC02NCwgLTYzLCAtNjIsIC02MSwgLTYwLCAtNTksIC01OCwgLTU3LCAtNTYsIC01NSwgLTU0LCAtNTMsIC01MiwgLTUxLCAtNTAsIC00OSwgLTQ4LCAtNDcsIC00NiwgLTQ1LCAtNDQsIC00MywgLTQyLCAtNDEsIC00MCwgLTM5LCAtMzgsIC0zNywgLTM2LCAtMzUsIC0zNCwgLTMzLCAtMzIsIC0zMSwgLTMwLCAtMjksIC0yOCwgLTI3LCAtMjYsIC0yNSwgLTI0LCAtMjMsIC0yMiwgLTIxLCAtMjAsIC0xOSwgLTE4LCAtMTcsIC0xNiwgLTE1LCAtMTQsIC0xMywgLTEyLCAtMTEsIC0xMCwgLTksIC04LCAtNywgLTYsIC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3fTsKKyAgICAgICAgICBCeXRlQnVmZmVyIGJpbiA9IHRlc3RDbGllbnQudGVzdEJpbmFyeShCeXRlQnVmZmVyLndyYXAoZGF0YSkpOworICAgICAgICAgIGJpbi5tYXJrKCk7CisgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYmluLmxpbWl0KCkgLSBiaW4ucG9zaXRpb24oKV07CisgICAgICAgICAgYmluLmdldChieXRlcyk7CisgICAgICAgICAgYmluLnJlc2V0KCk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoYnl0ZXNbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgICBpZiAoIUJ5dGVCdWZmZXIud3JhcChkYXRhKS5lcXVhbHMoYmluKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTVFJVQ1QgVEVTVApAQCAtMTcxLDcgKzMzMSwxNSBAQAogICAgICAgICBvdXQuaTMyX3RoaW5nID0gLTM7CiAgICAgICAgIG91dC5pNjRfdGhpbmcgPSAtNTsKICAgICAgICAgWHRydWN0IGluID0gdGVzdENsaWVudC50ZXN0U3RydWN0KG91dCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiICsgIlwiIiArIGluLnN0cmluZ190aGluZyArICJcIiwgIiArIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsgaW4uaTMyX3RoaW5nICsgIiwgIiArIGluLmk2NF90aGluZyArICJ9XG4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIgKyAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4uYnl0ZV90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmkzMl90aGluZyArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmk2NF90aGluZyArICJ9XG4iKTsKKyAgICAgICAgaWYgKCFpbi5lcXVhbHMob3V0KSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIE5FU1RFRCBTVFJVQ1QgVEVTVApAQCAtMTgzLDcgKzM1MSwxNiBAQAogICAgICAgICBvdXQyLmkzMl90aGluZyA9IDU7CiAgICAgICAgIFh0cnVjdDIgaW4yID0gdGVzdENsaWVudC50ZXN0TmVzdChvdXQyKTsKICAgICAgICAgaW4gPSBpbjIuc3RydWN0X3RoaW5nOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArIGluMi5ieXRlX3RoaW5nICsgIiwgeyIgKyAiXCIiICsgaW4uc3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaW4uYnl0ZV90aGluZyArICIsICIgKyBpbi5pMzJfdGhpbmcgKyAiLCAiICsgaW4uaTY0X3RoaW5nICsgIn0sICIgKyBpbjIuaTMyX3RoaW5nICsgIn1cbiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSB7IiArIGluMi5ieXRlX3RoaW5nICsgIiwgeyIgKyAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIGluLmJ5dGVfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pMzJfdGhpbmcgKyAiLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbi5pNjRfdGhpbmcgKyAifSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4yLmkzMl90aGluZyArICJ9XG4iKTsKKyAgICAgICAgaWYgKCFpbjIuZXF1YWxzKG91dDIpKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogTUFQIFRFU1QKQEAgLTIxNSw2ICszOTIsNDkgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4gIiArIG1hcG91dC5nZXQoa2V5KSk7CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmICghbWFwb3V0LmVxdWFscyhtYXBpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTVFJJTkcgTUFQIFRFU1QKKyAgICAgICAgICovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzbWFwb3V0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgc21hcG91dC5wdXQoImEiLCAiMiIpOworICAgICAgICAgIHNtYXBvdXQucHV0KCJiIiwgImJsYWgiKTsKKyAgICAgICAgICBzbWFwb3V0LnB1dCgic29tZSIsICJ0aGluZyIpOworICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IHNtYXBvdXQua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgc21hcG91dC5nZXQoa2V5KSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pIik7CisgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzbWFwaW4gPSB0ZXN0Q2xpZW50LnRlc3RTdHJpbmdNYXAoc21hcG91dCk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBzbWFwaW4ua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiAiICsgc21hcG91dC5nZXQoa2V5KSk7CisgICAgICAgICAgfQorICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICAgIGlmICghc21hcG91dC5lcXVhbHMoc21hcGluKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTRVQgVEVTVApAQCAtMjQ2LDYgKzQ2NiwxMCBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoZWxlbSk7CiAgICAgICAgIH0KICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifVxuIik7CisgICAgICAgIGlmICghc2V0b3V0LmVxdWFscyhzZXRpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBMSVNUIFRFU1QKQEAgLTI3Nyw2ICs1MDEsMTAgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGVsZW0pOwogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoIWxpc3RvdXQuZXF1YWxzKGxpc3RpbikpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBFTlVNIFRFU1QKQEAgLTI4NCwyMiArNTEyLDQyIEBACiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKE9ORSkiKTsKICAgICAgICAgTnVtYmVyeiByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouT05FKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShUV08pIik7CiAgICAgICAgIHJldCA9IHRlc3RDbGllbnQudGVzdEVudW0oTnVtYmVyei5UV08pOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5UV08pIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOwogICAgICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5USFJFRSkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICB9CiAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEVudW0oRklWRSkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkZJVkUpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSAiICsgcmV0ICsgIlxuIik7CisgICAgICAgIGlmIChyZXQgIT0gTnVtYmVyei5GSVZFKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0KIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RW51bShFSUdIVCkiKTsKICAgICAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0gIiArIHJldCArICJcbiIpOworICAgICAgICBpZiAocmV0ICE9IE51bWJlcnouRUlHSFQpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUWVBFREVGIFRFU1QKQEAgLTMwNyw2ICs1NTUsMTAgQEAKICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOwogICAgICAgICBsb25nIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9ICIgKyB1aWQgKyAiXG4iKTsKKyAgICAgICAgaWYgKHVpZCAhPSAzMDk4NTgyMzUwODI1MjNMKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBORVNURUQgTUFQIFRFU1QKQEAgLTMyNCwxMTUgKzU3NiwxNzQgQEAKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9XG4iKTsKKyAgICAgICAgaWYgKG1tLnNpemUoKSAhPSAyIHx8ICFtbS5jb250YWluc0tleSg0KSB8fCAhbW0uY29udGFpbnNLZXkoLTQpKSB7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG0xID0gbW0uZ2V0KDQpOworICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtMiA9IG1tLmdldCgtNCk7CisgICAgICAgICAgaWYgKG0xLmdldCgxKSAhPSAxIHx8IG0xLmdldCgyKSAhPSAyIHx8IG0xLmdldCgzKSAhPSAzIHx8IG0xLmdldCg0KSAhPSA0IHx8CisgICAgICAgICAgICAgIG0yLmdldCgtMSkgIT0gLTEgfHwgbTIuZ2V0KC0yKSAhPSAtMiB8fCBtMi5nZXQoLTMpICE9IC0zIHx8IG0yLmdldCgtNCkgIT0gLTQpIHsKKyAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIElOU0FOSVRZIFRFU1QKICAgICAgICAgICovCi0gICAgICAgIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICBpbnNhbmUudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7Ci0gICAgICAgIGluc2FuZS51c2VyTWFwLnB1dChOdW1iZXJ6LkZJVkUsIChsb25nKTUwMDApOwotICAgICAgICBYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJUcnVjayI7Ci0gICAgICAgIHRydWNrLmJ5dGVfdGhpbmcgPSAoYnl0ZSk4OwotICAgICAgICB0cnVjay5pMzJfdGhpbmcgPSA4OwotICAgICAgICB0cnVjay5pNjRfdGhpbmcgPSA4OwotICAgICAgICBpbnNhbmUueHRydWN0cyA9IG5ldyBBcnJheUxpc3Q8WHRydWN0PigpOwotICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQodHJ1Y2spOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0SW5zYW5pdHkoKSIpOwotICAgICAgICBNYXA8TG9uZyxNYXA8TnVtYmVyeixJbnNhbml0eT4+IHdob2EgPQotICAgICAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiA9IHsiKTsKLSAgICAgICAgZm9yIChsb25nIGtleSA6IHdob2Eua2V5U2V0KCkpIHsKLSAgICAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4geyIpOwogCi0gICAgICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMiArICIgPT4geyIpOwotICAgICAgICAgICAgTWFwPE51bWJlcnosIExvbmc+IHVzZXJNYXAgPSB2Mi51c2VyTWFwOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOwotICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICBmb3IgKE51bWJlcnogazMgOiB1c2VyTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICBib29sZWFuIGluc2FuaXR5RmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7CisgICAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gMjsKKyAgICAgICAgICBoZWxsby5pNjRfdGhpbmcgPSAyOworCisgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOworICAgICAgICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IChieXRlKTQ7CisgICAgICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OworICAgICAgICAgIGdvb2RieWUuaTY0X3RoaW5nID0gKGxvbmcpNDsKKworICAgICAgICAgIGluc2FuZS51c2VyTWFwID0gbmV3IEhhc2hNYXA8TnVtYmVyeiwgTG9uZz4oKTsKKyAgICAgICAgICBpbnNhbmUudXNlck1hcC5wdXQoTnVtYmVyei5FSUdIVCwgKGxvbmcpOCk7CisgICAgICAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMgPSBuZXcgQXJyYXlMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICBpbnNhbmUueHRydWN0cy5hZGQoZ29vZGJ5ZSk7CisgICAgICAgICAgaW5zYW5lLnh0cnVjdHMuYWRkKGhlbGxvKTsKKworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RJbnNhbml0eSgpIik7CisgICAgICAgICAgTWFwPExvbmcsTWFwPE51bWJlcnosSW5zYW5pdHk+PiB3aG9hID0KKyAgICAgICAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KGluc2FuZSk7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiID0geyIpOworICAgICAgICAgIGZvciAobG9uZyBrZXkgOiB3aG9hLmtleVNldCgpKSB7CisgICAgICAgICAgICBNYXA8TnVtYmVyeixJbnNhbml0eT4gdmFsID0gd2hvYS5nZXQoa2V5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgIGZvciAoTnVtYmVyeiBrMiA6IHZhbC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbC5nZXQoazIpOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBMb25nPiB1c2VyTWFwID0gdjIudXNlck1hcDsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIpOworICAgICAgICAgICAgICBpZiAodXNlck1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChOdW1iZXJ6IGszIDogdXNlck1hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludChrMyArICIgPT4gIiArIHVzZXJNYXAuZ2V0KGszKSArICIsICIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogCi0gICAgICAgICAgICBMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLnh0cnVjdHM7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7Ci0gICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGZvciAoWHRydWN0IHggOiB4dHJ1Y3RzKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIgKyAiXCIiICsgeC5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LmJ5dGVfdGhpbmcgKyAiLCAiICsgeC5pMzJfdGhpbmcgKyAiLCAiKyB4Lmk2NF90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi54dHJ1Y3RzOworICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CisgICAgICAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFh0cnVjdCB4IDogeHRydWN0cykgeworICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgieyIgKyAiXCIiICsgeC5zdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LmJ5dGVfdGhpbmcgKyAiLCAiICsgeC5pMzJfdGhpbmcgKyAiLCAiKyB4Lmk2NF90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0iKTsKKyAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSIpOwogCisgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CiAgICAgICAgICAgfQotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICAgIGlmICh3aG9hLnNpemUoKSA9PSAyICYmIHdob2EuY29udGFpbnNLZXkoMUwpICYmIHdob2EuY29udGFpbnNLZXkoMkwpKSB7CisgICAgICAgICAgICBNYXA8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IHdob2EuZ2V0KDFMKTsKKyAgICAgICAgICAgIE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4gc2Vjb25kX21hcCA9IHdob2EuZ2V0KDJMKTsKKyAgICAgICAgICAgIGlmIChmaXJzdF9tYXAuc2l6ZSgpID09IDIgJiYKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5UV08pICYmCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwLmNvbnRhaW5zS2V5KE51bWJlcnouVEhSRUUpICYmCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcC5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgIHNlY29uZF9tYXAuY29udGFpbnNLZXkoTnVtYmVyei5TSVgpICYmCisgICAgICAgICAgICAgICAgaW5zYW5lLmVxdWFscyhmaXJzdF9tYXAuZ2V0KE51bWJlcnouVFdPKSkgJiYKKyAgICAgICAgICAgICAgICBpbnNhbmUuZXF1YWxzKGZpcnN0X21hcC5nZXQoTnVtYmVyei5USFJFRSkpKSB7CisgICAgICAgICAgICAgIEluc2FuaXR5IHNpeCA9c2Vjb25kX21hcC5nZXQoTnVtYmVyei5TSVgpOworICAgICAgICAgICAgICAvLyBDYW5ub3QgdXNlICJuZXcgSW5zYW5pdHkoKS5lcXVhbHMoc2l4KSIgYmVjYXVzZSBhcyBvZiBub3csIHN0cnVjdC9jb250YWluZXIKKyAgICAgICAgICAgICAgLy8gZmllbGRzIHdpdGggZGVmYXVsdCByZXF1aXJlZG5lc3MgaGF2ZSBpc3NldD1mYWxzZSBmb3IgbG9jYWwgaW5zdGFuY2VzIGFuZCB5ZXQKKyAgICAgICAgICAgICAgLy8gcmVjZWl2ZWQgZW1wdHkgdmFsdWVzIGZyb20gb3RoZXIgbGFuZ3VhZ2VzIGxpa2UgQysrIGhhdmUgaXNzZXQ9dHJ1ZSAuCisgICAgICAgICAgICAgIGlmIChzaXguZ2V0VXNlck1hcFNpemUoKSA9PSAwICYmIHNpeC5nZXRYdHJ1Y3RzU2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgICAgIGluc2FuaXR5RmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICBpbnNhbml0eUZhaWxlZCA9IGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn1cbiIpOworICAgICAgICBpZiAoaW5zYW5pdHlGYWlsZWQpIHsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgfQogCi0gICAgICAgIAogICAgICAgICAvKioKICAgICAgICAgICogRVhFQ1BUSU9OIFRFU1QKICAgICAgICAgICovCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iKTsKICAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG5GQUlMVVJFXG4iKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIiAgdm9pZFxuRkFJTFVSRVxuIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICB2b2lkXG4qKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAgICAgICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAge1wiJXNcIn1cbiIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICB0cnkgewogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcInN1Y2Nlc3NcIikgPT4iKTsKICAgICAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHZvaWRcbiIpOwogICAgICAgICB9Y2F0Y2goRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbkZBSUxVUkVcbiIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIGV4Y2VwdGlvblxuKioqIEZBSUxVUkUgKioqXG4iKTsKKyAgICAgICAgICByZXR1cm5Db2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKKworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBNVUxUSSBFWENFUFRJT04gVEVTVAogICAgICAgICAgKi8KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOwogICAgICAgICAgIHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbiIsICJ0ZXN0IDEiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChYY2VwdGlvbiBlKSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CiAgICAgICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJ0ZXN0IDIiKTsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiICByZXN1bHRcbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfSBjYXRjaChYY2VwdGlvbjIgZSkgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHsldSwge1wiJXNcIn19XG4iLCBlLmVycm9yQ29kZSwgZS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICB7JWQsIHtcIiVzXCJ9fVxuIiwgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKICAgICAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgICAgIHJlc3VsdCA9IHRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJzdWNjZXNzIiwgInRlc3QgMyIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIHt7XCIlc1wifX1cbiIsIHJlc3VsdC5zdHJpbmdfdGhpbmcpOwogICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBleGNlcHRpb25cbioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICAgICAgfQogCiAKLSAgICAgICAgCisKICAgICAgICAgLyoqCiAgICAgICAgICAqIE9ORVdBWSBURVNUCiAgICAgICAgICAqLwpAQCAtNDQxLDkgKzc1MiwxMSBAQAogICAgICAgICB0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMyk7CiAgICAgICAgIGxvbmcgb25ld2F5RWxhcHNlZE1pbGxpcyA9IChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0T25ld2F5KSAvIDEwMDAwMDA7CiAgICAgICAgIGlmIChvbmV3YXlFbGFwc2VkTWlsbGlzID4gMjAwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiT25ld2F5IHRlc3QgZmFpbGVkOiB0b29rICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXMiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk9uZXdheSB0ZXN0IGZhaWxlZDogdG9vayAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy50b1N0cmluZyhvbmV3YXlFbGFwc2VkTWlsbGlzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtcyIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN1Y2Nlc3MgLSB0b29rICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLnRvU3RyaW5nKG9uZXdheUVsYXBzZWRNaWxsaXMpICsKQEAgLTQ2NSwyMiArNzc4LDI5IEBACiAgICAgICAgIHRpbWVUb3QgKz0gdG90OwogCiAgICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIioqKiBGQUlMVVJFICoqKlxuIik7CisgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIHJldHVybkNvZGUgfD0gRVJSX1VOS05PV047CiAgICAgICB9Ci0KLSAgICAgIGxvbmcgdGltZUF2ZyA9IHRpbWVUb3QgLyBudW1UZXN0czsKLQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNaW4gdGltZTogIiArIHRpbWVNaW4vMTAwMCArICJ1cyIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNYXggdGltZTogIiArIHRpbWVNYXgvMTAwMCArICJ1cyIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdmcgdGltZTogIiArIHRpbWVBdmcvMTAwMCArICJ1cyIpOwotCi0gICAgICBTdHJpbmcganNvbiA9IChuZXcgVFNlcmlhbGl6ZXIobmV3IFRTaW1wbGVKU09OUHJvdG9jb2wuRmFjdG9yeSgpKSkudG9TdHJpbmcoaW5zYW5lKTsKLQotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkZvciBnb29kIG1lYXVzcmUgaGVyZSBpcyBzb21lIEpTT046XG4iICsganNvbik7Ci0KLSAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKICAgICB9CiAKLSAgfQorICAgIGxvbmcgdGltZUF2ZyA9IHRpbWVUb3QgLyBudW1UZXN0czsKIAorICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWluIHRpbWU6ICIgKyB0aW1lTWluLzEwMDAgKyAidXMiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk1heCB0aW1lOiAiICsgdGltZU1heC8xMDAwICsgInVzIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdmcgdGltZTogIiArIHRpbWVBdmcvMTAwMCArICJ1cyIpOworCisgICAgdHJ5IHsKKyAgICAgIFN0cmluZyBqc29uID0gKG5ldyBUU2VyaWFsaXplcihuZXcgVFNpbXBsZUpTT05Qcm90b2NvbC5GYWN0b3J5KCkpKS50b1N0cmluZyhpbnNhbmUpOworICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNhbXBsZSBUU2ltcGxlSlNPTlByb3RvY29sIG91dHB1dDpcbiIgKyBqc29uKTsKKyAgICB9IGNhdGNoIChURXhjZXB0aW9uIHgpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiKioqIEZBSUxVUkUgKioqIik7CisgICAgICB4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgIH0KKworCisgICAgU3lzdGVtLmV4aXQocmV0dXJuQ29kZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YQppbmRleCAxODM0M2IwLi40MWM0YjY1IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICAgIC8vIFRyYW5zcG9ydAogICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpOworICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpKTsKIAogICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmU7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCmluZGV4IDkwNzc4ODIuLjFmM2U1NTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQpAQCAtMjYsMjAgKzI2LDMyIEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlckNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlRTZXJ2ZXIuQXJnczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNpbXBsZVNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLlNlcnZlclRlc3RCYXNlLlRlc3RIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UU2VydmVyRXZlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5UVGhyZWFkZWRTZWxlY3RvclNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVE5vbmJsb2NraW5nU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmFzdEZyYW1lZFRyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNlcnZlclNvY2tldDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNTTFRyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVE11bHRpcGxleGVkUHJvY2Vzc29yOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuSW5zYW5pdHk7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuTnVtYmVyejsKK2ltcG9ydCB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlOwogaW1wb3J0IHRocmlmdC50ZXN0LlRocmlmdFRlc3Q7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb247CiBpbXBvcnQgdGhyaWZ0LnRlc3QuWGNlcHRpb24yOwpAQCAtNDgsNiArNjAsMjQgQEAKIAogcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIgewogCisgIC8vIE11bHRpcGxleGVkIFByb3RvY29sIFN1cHBvcnQgRGV0YWlsczoKKyAgLy8KKyAgLy8gRm9yIG11bHRpcGxleGVkIHRlc3Rpbmcgd2UgYWx3YXlzIHVzZSBiaW5hcnkgcHJvdG9jb2wgdW5kZXJuZWF0aC4KKyAgLy8KKyAgLy8gIlRocmlmdFRlc3QiIG5hbWVkIHNlcnZpY2UgaW1wbGVtZW50cyAiVGhyaWZ0VGVzdCIgZnJvbSBUaHJpZnRUZXN0LnRocmlmdAorICAvLyAiU2Vjb25kU2VydmljZSIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJTZWNvbmRTZXJ2aWNlIiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vIEluIGFkZGl0aW9uLCB0byBzdXBwb3J0IG9sZGVyIG5vbi1tdWx0aXBsZXhlZCBjbGllbnRzIHVzaW5nIHRoZSBzYW1lIGNvbmNyZXRlIHByb3RvY29sCisgIC8vIHRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgaXMgdGF1Z2h0IHRvIHVzZSAiVGhyaWZ0VGVzdCIgaWYgdGhlIGluY29taW5nIHJlcXVlc3QgaGFzIG5vCisgIC8vIG11bHRpcGxleGVkIGNhbGwgbmFtZSBkZWNvcmF0aW9uLgorCisgIHN0YXRpYyBjbGFzcyBTZWNvbmRIYW5kbGVyIGltcGxlbWVudHMgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZS5JZmFjZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKGphdmEubGFuZy5TdHJpbmcgdGhpbmcpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeyByZXR1cm4gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsgfQorCisgIH0KKwogICBzdGF0aWMgY2xhc3MgVGVzdFNlcnZlckNvbnRleHQgaW1wbGVtZW50cyBTZXJ2ZXJDb250ZXh0IHsKIAogICAgICAgICBpbnQgY29ubmVjdGlvbklkOwpAQCAtOTYsMzggKzEyNiwxODAgQEAKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKICAgICB0cnkgewogICAgICAgaW50IHBvcnQgPSA5MDkwOwotICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgewotICAgICAgICBwb3J0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbMF0pOworICAgICAgYm9vbGVhbiBzc2wgPSBmYWxzZTsKKyAgICAgIFN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CisgICAgICBTdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOworICAgICAgU3RyaW5nIHNlcnZlcl90eXBlID0gInRocmVhZC1wb29sIjsKKyAgICAgIFN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgICAgICBpbnQgc3RyaW5nX2xpbWl0ID0gLTE7CisgICAgICBpbnQgY29udGFpbmVyX2xpbWl0ID0gLTE7CisgICAgICB0cnkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXBvcnQiKSkgeworICAgICAgICAgICAgcG9ydCA9IEludGVnZXIudmFsdWVPZihhcmdzW2ldLnNwbGl0KCI9IilbMV0pOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXNlcnZlci10eXBlIikpIHsKKyAgICAgICAgICAgIHNlcnZlcl90eXBlID0gYXJnc1tpXS5zcGxpdCgiPSIpWzFdOworICAgICAgICAgICAgc2VydmVyX3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXBvcnQiKSkgeworICAgICAgICAgICAgcG9ydD1JbnRlZ2VyLnBhcnNlSW50KGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLnN0YXJ0c1dpdGgoIi0tcHJvdG9jb2wiKSkgeworICAgICAgICAgICAgcHJvdG9jb2xfdHlwZSA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICAgIHByb3RvY29sX3R5cGUudHJpbSgpOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXRyYW5zcG9ydCIpKSB7CisgICAgICAgICAgICB0cmFuc3BvcnRfdHlwZSA9IGFyZ3NbaV0uc3BsaXQoIj0iKVsxXTsKKyAgICAgICAgICAgIHRyYW5zcG9ydF90eXBlLnRyaW0oKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLXNzbCIpKSB7CisgICAgICAgICAgICBzc2wgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5zdGFydHNXaXRoKCItLXN0cmluZy1saW1pdCIpKSB7CisgICAgICAgICAgICBzdHJpbmdfbGltaXQgPSBJbnRlZ2VyLnZhbHVlT2YoYXJnc1tpXS5zcGxpdCgiPSIpWzFdKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uc3RhcnRzV2l0aCgiLS1jb250YWluZXItbGltaXQiKSkgeworICAgICAgICAgICAgY29udGFpbmVyX2xpbWl0ID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbaV0uc3BsaXQoIj0iKVsxXSk7CisgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1oZWxwIikpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWxsb3dlZCBvcHRpb25zOiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0taGVscFx0XHRcdFByb2R1Y2UgaGVscCBtZXNzYWdlIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wb3J0PWFyZyAoPSIgKyBwb3J0ICsgIilcdFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRyYW5zcG9ydD1hcmcgKD0iICsgdHJhbnNwb3J0X3R5cGUgKyAiKVxuXHRcdFx0XHRUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGZhc3RmcmFtZWQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByb3RvY29sPWFyZyAoPSIgKyBwcm90b2NvbF90eXBlICsgIilcdFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaiIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3NsXHRcdFx0RW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNlcnZlci10eXBlPWFyZyAoPSIgKyBzZXJ2ZXJfdHlwZSArIilcblx0XHRcdFx0VHlwZSBvZiBzZXJ2ZXI6IHNpbXBsZSwgdGhyZWFkLXBvb2wsIG5vbmJsb2NraW5nLCB0aHJlYWRlZC1zZWxlY3RvciIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tc3RyaW5nLWxpbWl0PWFyZyAoPSIgKyBzdHJpbmdfbGltaXQgKyAiKVx0U3RyaW5nIHJlYWQgbGVuZ3RoIGxpbWl0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1jb250YWluZXItbGltaXQ9YXJnICg9IiArIGNvbnRhaW5lcl9saW1pdCArICIpXHRDb250YWluZXIgcmVhZCBsZW5ndGggbGltaXQiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYW4gbm90IHBhcnNlIGFyZ3VtZW50cyEgU2VlIC0taGVscCIpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgIH0KLSAgICAgIC8vQFRPRE8gYWRkIG90aGVyIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgdHlwZXMKIAotICAgICAgLy8gUHJvY2Vzc29yCi0gICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9Ci0gICAgICAgIG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgdGVzdFByb2Nlc3NvciA9Ci0gICAgICAgIG5ldyBUaHJpZnRUZXN0LlByb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICB0cnkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuZXF1YWxzKCJzaW1wbGUiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkLXBvb2wiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICAgIGlmIChzc2wgPT0gdHJ1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU1NMIGlzIG5vdCBzdXBwb3J0ZWQgb3ZlciBub25ibG9ja2luZyBzZXJ2ZXJzISIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikpIHsKKyAgICAgICAgICBpZiAoc3NsID09IHRydWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlNTTCBpcyBub3Qgc3VwcG9ydGVkIG92ZXIgbm9uYmxvY2tpbmcgc2VydmVycyEiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBzZXJ2ZXIgdHlwZSEgIiArIHNlcnZlcl90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImJpbmFyeSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGkiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgeworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gcHJvdG9jb2wgdHlwZSEgIiArIHByb3RvY29sX3R5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImJ1ZmZlcmVkIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZS5lcXVhbHMoImZyYW1lZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuZXF1YWxzKCJmYXN0ZnJhbWVkIikpIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbmtub3duIHRyYW5zcG9ydCB0eXBlISAiICsgdHJhbnNwb3J0X3R5cGUpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgIH0KIAotICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICBUU2VydmVyU29ja2V0IHRTZXJ2ZXJTb2NrZXQgPQotICAgICAgICBuZXcgVFNlcnZlclNvY2tldChwb3J0KTsKKyAgICAgIC8vIFByb2Nlc3NvcnMKKyAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKworICAgICAgU2Vjb25kSGFuZGxlciBzZWNvbmRIYW5kbGVyID0gbmV3IFNlY29uZEhhbmRsZXIoKTsKKyAgICAgIFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yIHNlY29uZFByb2Nlc3NvciA9IG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKTsKIAogICAgICAgLy8gUHJvdG9jb2wgZmFjdG9yeQotICAgICAgVFByb3RvY29sRmFjdG9yeSB0UHJvdG9jb2xGYWN0b3J5ID0KLSAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICBUUHJvdG9jb2xGYWN0b3J5IHRQcm90b2NvbEZhY3RvcnkgPSBudWxsOworICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpTT05Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KHN0cmluZ19saW1pdCwgY29udGFpbmVyX2xpbWl0KTsKKyAgICAgIH0gZWxzZSB7IC8vIGFsc28gY292ZXJzIG11bHRpCisgICAgICAgIHRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3Rvcnkoc3RyaW5nX2xpbWl0LCBjb250YWluZXJfbGltaXQpOworICAgICAgfQogCi0gICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKyAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRUcmFuc3BvcnRGYWN0b3J5ID0gbnVsbDsKIAotICAgICAgLy8gU2ltcGxlIFNlcnZlcgotICAgICAgLy9zZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcihuZXcgQXJncyh0U2VydmVyU29ja2V0KS5wcm9jZXNzb3IodGVzdFByb2Nlc3NvcikpOworICAgICAgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZnJhbWVkIikpIHsKKyAgICAgICAgdFRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCk7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmVxdWFscygiZmFzdGZyYW1lZCIpKSB7CisgICAgICAgIHRUcmFuc3BvcnRGYWN0b3J5ID0gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKTsKKyAgICAgIH0gZWxzZSB7IC8vIC5lcXVhbHMoImJ1ZmZlcmVkIikgPT4gZGVmYXVsdCB2YWx1ZQorICAgICAgICB0VHJhbnNwb3J0RmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOworICAgICAgfQogCi0gICAgICAvLyBUaHJlYWRQb29sIFNlcnZlcgotICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRUaHJlYWRQb29sU2VydmVyKG5ldyBUVGhyZWFkUG9vbFNlcnZlci5BcmdzKHRTZXJ2ZXJTb2NrZXQpLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKS5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSkpOworICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOwogCi0gICAgICAvL1NldCBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgLy8gSWYgd2UgYXJlIG11bHRpcGxleGluZyBzZXJ2aWNlcyBpbiBvbmUgc2VydmVyLi4uCisgICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5yZWdpc3RlckRlZmF1bHQgICh0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJUaHJpZnRUZXN0IiwgdGVzdFByb2Nlc3Nvcik7CisgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3Nvcik7CisKKyAgICAgIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoIm5vbmJsb2NraW5nIikgfHwKKyAgICAgICAgICBzZXJ2ZXJfdHlwZS5lcXVhbHMoInRocmVhZGVkLXNlbGVjdG9yIikpIHsKKyAgICAgICAgLy8gTm9uYmxvY2tpbmcgc2VydmVycworICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgdE5vbmJsb2NraW5nU2VydmVyU29ja2V0ID0KKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuTm9uYmxvY2tpbmdBYnN0cmFjdFNlcnZlclNvY2tldEFyZ3MoKS5wb3J0KHBvcnQpKTsKKworICAgICAgICBpZiAoc2VydmVyX3R5cGUuY29udGFpbnMoIm5vbmJsb2NraW5nIikpIHsKKyAgICAgICAgICAvLyBOb25ibG9ja2luZyBTZXJ2ZXIKKyAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIuQXJncyB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzCisgICAgICAgICAgICAgID0gbmV3IFROb25ibG9ja2luZ1NlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7CisgICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIodE5vbmJsb2NraW5nU2VydmVyQXJncyk7CisgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKQorICAgICAgICAgIC8vIFRocmVhZGVkU2VsZWN0b3IgU2VydmVyCisgICAgICAgICAgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuQXJncyB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MKKyAgICAgICAgICAgICAgPSBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuQXJncyh0Tm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQpOworICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKKyAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIodFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQmxvY2tpbmcgc2VydmVycworCisgICAgICAgIC8vIFNTTCBzb2NrZXQKKyAgICAgICAgVFNlcnZlclNvY2tldCB0U2VydmVyU29ja2V0ID0gbnVsbDsKKyAgICAgICAgaWYgKHNzbCkgeworICAgICAgICAgIHRTZXJ2ZXJTb2NrZXQgPSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQocG9ydCwgMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdFNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS5wb3J0KHBvcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInNpbXBsZSIpKSB7CisgICAgICAgICAgLy8gU2ltcGxlIFNlcnZlcgorICAgICAgICAgIFRTZXJ2ZXIuQXJncyB0U2VydmVyQXJncyA9IG5ldyBUU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7CisgICAgICAgICAgdFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdFNlcnZlckFyZ3MucHJvdG9jb2xGYWN0b3J5KHRQcm90b2NvbEZhY3RvcnkpOworICAgICAgICAgIHRTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRTZXJ2ZXJBcmdzKTsKKyAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRwb29sIikKKyAgICAgICAgICAvLyBUaHJlYWRQb29sIFNlcnZlcgorICAgICAgICAgIFRUaHJlYWRQb29sU2VydmVyLkFyZ3MgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzCisgICAgICAgICAgICAgID0gbmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7CisgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRUaHJlYWRQb29sU2VydmVyQXJncy5wcm90b2NvbEZhY3RvcnkodFByb3RvY29sRmFjdG9yeSk7CisgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcih0VGhyZWFkUG9vbFNlcnZlckFyZ3MpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIFNldCBzZXJ2ZXIgZXZlbnQgaGFuZGxlcgogICAgICAgc2VydmVyRW5naW5lLnNldFNlcnZlckV2ZW50SGFuZGxlcihuZXcgVGVzdFNlcnZlckV2ZW50SGFuZGxlcigpKTsKIAogICAgICAgLy8gUnVuIGl0Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiICsgcG9ydCArICIuLi4iKTsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnRpbmcgdGhlICIgKyAoc3NsID8gInNzbCBzZXJ2ZXIiIDogInNlcnZlciIpICsKKyAgICAgICAgIiBbIiArIHByb3RvY29sX3R5cGUgKyAiLyIgKyB0cmFuc3BvcnRfdHlwZSArICIvIiArIHNlcnZlcl90eXBlICsgIl0gb24gIiArCisgICAgICAgICgoZG9tYWluX3NvY2tldCA9PSAiIikgPyAoInBvcnQgIiArIHBvcnQpIDogKCJ1bml4IHNvY2tldCAiICsgZG9tYWluX3NvY2tldCkpKTsKICAgICAgIHNlcnZlckVuZ2luZS5zZXJ2ZSgpOwogCiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1JlYWRDb3VudGluZ1RyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKaW5kZXggODQ3NDE4OC4uM2M3NDlmOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvUmVhZENvdW50aW5nVHJhbnNwb3J0LmphdmEKQEAgLTIyLDI2ICsyMiw0MCBAQAogcHVibGljIGNsYXNzIFJlYWRDb3VudGluZ1RyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewogICBwdWJsaWMgaW50IHJlYWRDb3VudCA9IDA7CiAgIHByaXZhdGUgVFRyYW5zcG9ydCB0cmFuczsKKyAgcHJpdmF0ZSBib29sZWFuIG9wZW4gPSB0cnVlOwogCiAgIHB1YmxpYyBSZWFkQ291bnRpbmdUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nKSB7CiAgICAgdHJhbnMgPSB1bmRlcmx5aW5nOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKyAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgb3BlbiA9IGZhbHNlOworICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHtyZXR1cm4gdHJ1ZTt9CisgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICByZXR1cm4gb3BlbjsKKyAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKyAgcHVibGljIHZvaWQgb3BlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBvcGVuID0gdHJ1ZTsKKyAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIGlmICghaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sICJUcmFuc3BvcnQgaXMgY2xvc2VkIik7CisgICAgfQogICAgIHJlYWRDb3VudCsrOwogICAgIHJldHVybiB0cmFucy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaWYgKCFpc09wZW4oKSkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgIlRyYW5zcG9ydCBpcyBjbG9zZWQiKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IDMzN2RjZjguLmMzNTM0ODkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQpAQCAtMjMsNyArMjMsNyBAQAogcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyIGV4dGVuZHMgVGVzdENhc2UgewogICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kcygpIHRocm93cyBFeGNlcHRpb24gewogICAgIC8vIGhhcyBleHBlY3RlZCBpbml0aWFsIGNhcGFjaXR5Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlciBiID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoMTAsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlciBiID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoMTApOwogICAgIGFzc2VydEVxdWFscygxMCwgYi5hcnJheSgpLmxlbmd0aCk7CiAKICAgICAvLyBkb2Vzbid0IHNocmluawpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCAyZTFmOTQ3Li44M2ViYzJkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQpAQCAtMzIsNyArMzIsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCgxNTAsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCgxNTApOwogCiAgICAgVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbWJ1ZiA9IG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQoSFVORFJFRF9CWVRFUyk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCBkNWYyMzlkLi44NmI1YjBkIDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCkBAIC0xOSwyNiArMTksNTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgewogCi1wdWJsaWMgY2xhc3MgVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKLQorICBAVGVzdAogICBwdWJsaWMgdm9pZCB0ZXN0SXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoMSwgMS41KTsKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoMSwgMCk7CisgICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydEVxdWFscygxLCB0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKICAgICBieXRlW10gYjEgPSBuZXcgYnl0ZVtdezEsMiwzfTsKICAgICB0LndyaXRlKGIxKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgdC5nZXRQb3MoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydFRydWUodC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCA+PSAzKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMykpOwogCiAgICAgdC5yZXNldCgpOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0UG9zKCkpOwogICAgIGJ5dGVbXSBiMiA9IG5ldyBieXRlW117NCw1fTsKICAgICB0LndyaXRlKGIyKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgdC5nZXRQb3MoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0TGVuZ3RoKCkpOwogICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjIpLCBCeXRlQnVmZmVyLndyYXAodC5nZXRCdWYoKS5hcnJheSgpLCAwLCAyKSk7CisKKyAgICBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgdXV0ID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg4LCA0KTsKKyAgICBhc3NlcnRFcXVhbHMoNCwgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICB1dXQud3JpdGUoYjEpOworICAgIGFzc2VydEVxdWFscyg3LCB1dXQuZ2V0TGVuZ3RoKCkpOworICAgIGFzc2VydEVxdWFscyg4LCB1dXQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGgpOworICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyLndyYXAoYjEpLCBCeXRlQnVmZmVyLndyYXAodXV0LmdldEJ1ZigpLmFycmF5KCksIDQsIDMpKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkSW5pdGlhbFNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDAsIDApOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RCYWRGcm9udFJlc2VydmVTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCg0LCAtMSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdFRvb1NtYWxsRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgNSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRCeXRlQnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMDc1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUQnl0ZUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5DaGFyc2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIFRlc3RUQnl0ZUJ1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdFJlYWRXcml0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxNikpOworICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQiLCBuZXcgU3RyaW5nKGJ5dGVCdWZmZXIuZmxpcCgpLnRvQnl0ZUFycmF5KCksIENoYXJzZXRzLlVURl84KSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmV1c2VSZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gbmV3IFRCeXRlQnVmZmVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTYpKTsKKyAgICBieXRlQnVmZmVyLndyaXRlKCJIZWxsbyBXb3JsZCIuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgbmV3IFN0cmluZyhieXRlQnVmZmVyLmZsaXAoKS50b0J5dGVBcnJheSgpLCBDaGFyc2V0cy5VVEZfOCkpOworCisgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworCisgICAgYnl0ZUJ1ZmZlci53cml0ZSgiR29vZGJ5ZSBIb3JzZXMiLmdldEJ5dGVzKENoYXJzZXRzLlVURl84KSk7CisgICAgYXNzZXJ0RXF1YWxzKCJHb29kYnllIEhvcnNlcyIsIG5ldyBTdHJpbmcoYnl0ZUJ1ZmZlci5mbGlwKCkudG9CeXRlQXJyYXkoKSwgQ2hhcnNldHMuVVRGXzgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RPdmVyZmxvdygpIHRocm93cyBFeGNlcHRpb24geworICAgIGZpbmFsIFRCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBuZXcgVEJ5dGVCdWZmZXIoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg0KSk7CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVCdWZmZXIud3JpdGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgd3JpdGUgb3BlcmF0aW9uIHRvIGZhaWwgd2l0aCBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoIk5vdCBlbm91Z2ggcm9vbSBpbiBvdXRwdXQgYnVmZmVyIiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBlMDI0MDQ5Li4wNmVlMjA2IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMTksOCArMTksMTUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVGVzdFRGcmFtZWRUcmFuc3BvcnQgeworICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBJTklUSUFMX0NBUEFDSVRZID0gNTA7CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKLSAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIDUwLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIElOSVRJQUxfQ0FQQUNJVFksIDEwICogMTAyNCAqIDEwMjQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBtYXhMZW5ndGgpIHsKKyAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIElOSVRJQUxfQ0FQQUNJVFksIG1heExlbmd0aCk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IDc4ZjU4ZWMuLmUzMGQ3NGIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtMzQsNiArMzQsMTAgQEAKICAgICByZXR1cm4gbmV3IFRGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZyk7CiAgIH0KIAorICBwcm90ZWN0ZWQgVFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgbWF4TGVuZ3RoKSB7CisgICAgcmV0dXJuIG5ldyBURnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIG1heExlbmd0aCk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuZC1zdGFydCsxXTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8PSAoZW5kLXN0YXJ0KTsgaSsrKSB7CkBAIC03NSw2ICs3OSw0MCBAQAogICAgIGFzc2VydEVxdWFscyg0LCBjb3VudFRyYW5zLnJlYWRDb3VudCk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZyYW1lU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgaW50IG1heExlbmd0aCA9IDEyODsKKworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgZG9zLndyaXRlSW50KDEzMCk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAxMjkpKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMsIG1heExlbmd0aCk7CisKKyAgICBieXRlW10gcmVhZEJ1ZiA9IG5ldyBieXRlWzEwXTsKKyAgICB0cnkgeworICAgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCA0KTsKKyAgICAgIGZhaWwoIkV4cGVjdGVkIGEgVFRyYW5zcG9ydEV4Y2VwdGlvbiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uIGJlY2F1c2UgdGhlIGZyYW1lIHdlJ3JlIHRyeWluZyB0byByZWFkIGlzIGxhcmdlciB0aGFuIG91ciBtYXggZnJhbWUgbGVuZ3RoCisgICAgICBhc3NlcnRFcXVhbHMoVFRyYW5zcG9ydEV4Y2VwdGlvbi5DT1JSVVBURURfREFUQSwgZS5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGFzc2VydEZhbHNlKHRyYW5zLmlzT3BlbigpKTsKKworICAgIHRyeSB7CisgICAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDQpOworICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBUVHJhbnNwb3J0RXhjZXB0aW9uIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBUaGlzIHRpbWUgd2UgZ2V0IGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQKKyAgICAgIGFzc2VydEVxdWFscyhUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBlLmdldFR5cGUoKSk7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgdGVzdFdyaXRlKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICBXcml0ZUNvdW50aW5nVHJhbnNwb3J0IGNvdW50aW5nVHJhbnMgPSBuZXcgV3JpdGVDb3VudGluZ1RyYW5zcG9ydChuZXcgVElPU3RyZWFtVHJhbnNwb3J0KG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShiYW9zKSkpOwpAQCAtODcsMTEgKzEyNSwxMSBAQAogICAgIGFzc2VydEVxdWFscygwLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKICAgICB0cmFucy5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFscyg0LCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIGFzc2VydEVxdWFscygyLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgRGF0YUlucHV0U3RyZWFtIGRpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogICAgIGFzc2VydEVxdWFscygyNTYsIGRpbi5yZWFkSW50KCkpOwpAQCAtMTQ1LDQgKzE4MywzMiBAQAogICAgIGFzc2VydEVxdWFscyg2NSwgdHJhbnMuZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIHRyYW5zLmdldEJ1ZmZlclBvc2l0aW9uKCkpOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgyMjApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zKTsKKworICAgIGJ5dGVbXSByZWFkQnVmID0gbmV3IGJ5dGVbMjIwXTsKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDIyMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLDIxOSkpKTsKKworICAgIGFzc2VydFRydWUodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0IHx8IHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpOworICAgIGlmICh0cmFucyBpbnN0YW5jZW9mIFRGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkgIT0gbnVsbCAmJiB0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPiAwKTsKKyAgICAgICgoVEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpID09IG51bGwpOworICAgIH0gZWxzZSBpZiAodHJhbnMgaW5zdGFuY2VvZiBURmFzdEZyYW1lZFRyYW5zcG9ydCkgeworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPiBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgICAoKFRGYXN0RnJhbWVkVHJhbnNwb3J0KSB0cmFucykuY2xlYXIoKTsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID09IFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5JTklUSUFMX0NBUEFDSVRZKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggNDc4NDA3YS4uMDMyYzJlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgIHRocm93cyBFeGNlcHRpb24gewogICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgIH0KKyAgCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBmaW5hbCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KQpAQCAtNTIsMTEgKzU2LDExIEBACiAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IGdldFNlcnZlclRyYW5zcG9ydCgpOwogICAgICAgICAgIGZpbmFsIEFyZ3MgYXJncyA9IG5ldyBBcmdzKHNlcnZlclRyYW5zcG9ydCkucHJvY2Vzc29yKHByb2Nlc3Nvcik7CiAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoYXJncyk7CiAgICAgICAgICAgc2VydmVyLnNlcnZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICB9CkBAIC02NCw3ICs2OCw3IEBACiAgICAgfTsKIAogICAgIHNlcnZlclRocmVhZC5zdGFydCgpOwotICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICBUaHJlYWQuc2xlZXAoU0xFRVBfREVMQVkpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNjU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDEuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50MSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiksCisgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldENsaWVudFNvY2tldChIT1NULCBQT1JULCAwLyp0aW1lb3V0Ki8sIHBhcmFtcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeUN1c3RvbUNsaWVudDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVkNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5Q3VzdG9tQ2xpZW50Mi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlDdXN0b21DbGllbnQyIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRUcmFuc3BvcnQgZ2V0Q2xpZW50VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZ1RyYW5zcG9ydCkKKyAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3CisgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworCisgICAgcGFyYW1zLnNldFRydXN0U3RvcmUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiKSwgbnVsbCk7CisKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmY1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworCitwdWJsaWMgY2xhc3MgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSBleHRlbmRzIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeSB7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBrZXlTdG9yZUxvY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIik7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cnVzdFN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIpOworICAKKyAgcHVibGljIFRlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUoKSB7CisgICAgc3VwZXIoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiAgT3ZlcnJpZGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgYWJsZSB0byB0ZXN0IHBhc3NpbmcKKyAgICAgKiAgdGhlIHRydXN0U3RvcmUgYW5kIGtleVN0b3JlIGFzIGlucHV0IHN0cmVhbQorICAgICAqLworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIiwgIiIpOworICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsICIiKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgVFRyYW5zcG9ydCBnZXRDbGllbnRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nVHJhbnNwb3J0KQorICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzKCk7CisKKyAgICBwYXJhbXMuc2V0VHJ1c3RTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIpKTsKKyAgICAKKyAgICByZXR1cm4gVFNTTFRyYW5zcG9ydEZhY3RvcnkuZ2V0Q2xpZW50U29ja2V0KEhPU1QsIFBPUlQsIDAvKnRpbWVvdXQqLywgcGFyYW1zKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgVFNlcnZlclNvY2tldCBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycyBwYXJhbXMgPSBuZXcKKyAgICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKyAgICAKKyAgICBwYXJhbXMuc2V0S2V5U3RvcmUobmV3IEZpbGVJbnB1dFN0cmVhbShrZXlTdG9yZUxvY2F0aW9uKSwgCisgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCwgMC8qdGltZW91dCovLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoSE9TVCksIHBhcmFtcyk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKaW5kZXggNDFkMDhmNi4uMzZhMDZlOSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC03Myw3ICs3NCw3IEBACiAgICAgICArICJzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdvIG91ciBmYXRoZXJzIGJyb3VnaHQgZm9ydGggb24gdGhpcyAiCiAgICAgICArICJjb250aW5lbnQgYSBuZXcgbmF0aW9uLCBjb25jZWl2ZWQgaW4gbGliZXJ0eSwgYW5kIGRlZGljYXRlZCB0byB0aGUgIgogICAgICAgKyAicHJvcG9zaXRpb24gdGhhdCBhbGwgbWVuIGFyZSBjcmVhdGVkIGVxdWFsLiI7Ci0gIAorCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0TWVzc2FnZTIgPSAiSSBoYXZlIGEgZHJlYW0gdGhhdCBvbmUgZGF5ICIKICAgICAgICsgInRoaXMgbmF0aW9uIHdpbGwgcmlzZSB1cCBhbmQgbGl2ZSBvdXQgdGhlIHRydWUgbWVhbmluZyBvZiBpdHMgY3JlZWQ6ICIKICAgICAgICsgIidXZSBob2xkIHRoZXNlIHRydXRocyB0byBiZSBzZWxmLWV2aWRlbnQsIHRoYXQgYWxsIG1lbiBhcmUgY3JlYXRlZCBlcXVhbC4nIjsKQEAgLTEyMyw3ICsxMjQsOSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBpbnRlcm5hbFJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgVFNlcnZlclNvY2tldCBzZXJ2ZXJTb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChTZXJ2ZXJUZXN0QmFzZS5QT1JUKTsKKyAgICAgIFRTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoCisgICAgICAgIG5ldyBUU2VydmVyU29ja2V0LlNlcnZlclNvY2tldFRyYW5zcG9ydEFyZ3MoKS4KKyAgICAgICAgICBwb3J0KFNlcnZlclRlc3RCYXNlLlBPUlQpKTsKICAgICAgIHRyeSB7CiAgICAgICAgIGFjY2VwdEFuZFdyaXRlKHNlcnZlclNvY2tldCk7CiAgICAgICB9IGZpbmFsbHkgewpAQCAtMjgwLDcgKzI4Myw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gVHJhbnNwb3J0Ci0gICAgICAgICAgICBUU2VydmVyU29ja2V0IHNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KFBPUlQpOworICAgICAgICAgICAgVFNlcnZlclNvY2tldCBzb2NrZXQgPSBuZXcgVFNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldC5TZXJ2ZXJTb2NrZXRUcmFuc3BvcnRBcmdzKCkucG9ydChQT1JUKSk7CiAKICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuRmFjdG9yeSgKICAgICAgICAgICAgICAgV1JBUFBFRF9NRUNIQU5JU00sIFNFUlZJQ0UsIEhPU1QsIFdSQVBQRURfUFJPUFMsCkBAIC0zMzAsMTIgKzMzMyw4IEBACiAgICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKCJBbHJlYWR5IGNvbXBsZXRlISIpOwogICAgICAgfQogCi0gICAgICB0cnkgewotICAgICAgICBoYXNQcm92aWRlZEluaXRpYWxSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLSAgICAgIH0KKyAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgIHJldHVybiB1c2VybmFtZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlOyB9CiAgICAgcHVibGljIGJ5dGVbXSB1bndyYXAoYnl0ZVtdIGluY29taW5nLCBpbnQgb2Zmc2V0LCBpbnQgbGVuKSB7CkBAIC0zNTIsMTEgKzM1MSw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKICAgICBwdWJsaWMgU3RyaW5nIGdldE1lY2hhbmlzbU5hbWUoKSB7IHJldHVybiAiQU5PTllNT1VTIjsgfQogICAgIHB1YmxpYyBieXRlW10gZXZhbHVhdGVSZXNwb25zZShieXRlW10gcmVzcG9uc2UpIHRocm93cyBTYXNsRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHRoaXMudXNlciA9IG5ldyBTdHJpbmcocmVzcG9uc2UsICJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsgcmV0dXJuIHVzZXIgIT0gbnVsbDsgfQpAQCAtNDEwLDQgKzQwNSw2NyBAQAogICAgICAgcHV0KCJTYXNsU2VydmVyRmFjdG9yeS5BTk9OWU1PVVMiLCBTYXNsQW5vbnltb3VzRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwogICAgIH0KICAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2tUVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7CisKKyAgICBieXRlW10gYmFkSGVhZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCByZWFkQnVmZmVyID0gbmV3IFRNZW1vcnlJbnB1dFRyYW5zcG9ydCgpOworCisgICAgcHVibGljIE1vY2tUVHJhbnNwb3J0KGludCBtb2RlKSB7CisgICAgICBpZiAobW9kZT09MSkgeworICAgICAgICAvLyBJbnZhbGlkIHN0YXR1cyBieXRlCisgICAgICAgIGJhZEhlYWRlciA9IG5ldyBieXRlW10geyAoYnl0ZSkweEZGLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDAwLCAoYnl0ZSkweDA1IH07CisgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMikgeworICAgICAgICAvLyBWYWxpZCBzdGF0dXMgYnl0ZSwgbmVnYXRpdmUgcGF5bG9hZCBsZW5ndGgKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4MDEsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYsIChieXRlKTB4RkYgfTsKKyAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSAzKSB7CisgICAgICAgIC8vIFZhbGlkIHN0YXR1cyBieXRlLCBleGNlc3NpdmVseSBsYXJnZSwgYm9ndXMgcGF5bG9hZCBsZW5ndGgKKyAgICAgICAgYmFkSGVhZGVyID0gbmV3IGJ5dGVbXSB7IChieXRlKTB4MDEsIChieXRlKTB4NjQsIChieXRlKTB4MDAsIChieXRlKTB4MDAsIChieXRlKTB4MDAgfTsKKyAgICAgIH0KKyAgICAgIHJlYWRCdWZmZXIucmVzZXQoYmFkSGVhZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24ge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkge30KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gcmVhZEJ1ZmZlci5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHt9CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0QmFkSGVhZGVyKCkgeworICAgIFRTYXNsVHJhbnNwb3J0IHNhc2xUcmFuc3BvcnQgPSBuZXcgVFNhc2xTZXJ2ZXJUcmFuc3BvcnQobmV3IE1vY2tUVHJhbnNwb3J0KDEpKTsKKyAgICB0cnkgeworICAgICAgc2FzbFRyYW5zcG9ydC5yZWNlaXZlU2FzbE1lc3NhZ2UoKTsKKyAgICAgIGZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBhbiBlcnJvciBkdWUgdG8gaW5jb3JyZWN0IHN0YXR1cyBieXRlIHZhbHVlLiIpOworICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgYXNzZXJ0RXF1YWxzKGUuZ2V0TWVzc2FnZSgpLCAiSW52YWxpZCBzdGF0dXMgLTEiKTsKKyAgICB9CisgICAgc2FzbFRyYW5zcG9ydCA9IG5ldyBUU2FzbFNlcnZlclRyYW5zcG9ydChuZXcgTW9ja1RUcmFuc3BvcnQoMikpOworICAgIHRyeSB7CisgICAgICBzYXNsVHJhbnNwb3J0LnJlY2VpdmVTYXNsTWVzc2FnZSgpOworICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIGFuIGVycm9yIGR1ZSB0byBuZWdhdGl2ZSBwYXlsb2FkIGxlbmd0aC4iKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGUpIHsKKyAgICAgIGFzc2VydEVxdWFscyhlLmdldE1lc3NhZ2UoKSwgIkludmFsaWQgcGF5bG9hZCBoZWFkZXIgbGVuZ3RoOiAtMSIpOworICAgIH0KKyAgICBzYXNsVHJhbnNwb3J0ID0gbmV3IFRTYXNsU2VydmVyVHJhbnNwb3J0KG5ldyBNb2NrVFRyYW5zcG9ydCgzKSk7CisgICAgdHJ5IHsKKyAgICAgIHNhc2xUcmFuc3BvcnQucmVjZWl2ZVNhc2xNZXNzYWdlKCk7CisgICAgICBmYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3IgZHVlIHRvIGJvZ3VzIChsYXJnZSkgcGF5bG9hZCBsZW5ndGguIik7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRNZXNzYWdlKCksICJJbnZhbGlkIHBheWxvYWQgaGVhZGVyIGxlbmd0aDogMTY3NzcyMTYwMCIpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg4MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTaW1wbGVGaWxlVHJhbnNwb3J0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFRlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgcHVibGljIHZvaWQgdGVzdEZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy9UZXN0IHdyaXRlIHNpZGUKKyAgICBQYXRoIHRlbXBGaWxlUGF0aE5hbWUgPSBGaWxlcy5jcmVhdGVUZW1wRmlsZSgiVFNpbXBsZUZpbGVUcmFuc3BvcnRUZXN0IiwgbnVsbCk7CisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOworICAgIGJ5dGVbXSBpbnB1dF9idWYgPSBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKKyAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFuc193cml0ZSA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksZmFsc2UsIHRydWUsIGZhbHNlKTsKKyAgICBhc3NlcnQgKCF0cmFuc193cml0ZS5pc09wZW4oKSk7CisgICAgdHJhbnNfd3JpdGUub3BlbigpOworICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7CisgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmKTsKKyAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYsMiwyKTsKKyAgICB0cmFuc193cml0ZS5mbHVzaCgpOworICAgIHRyYW5zX3dyaXRlLmNsb3NlKCk7CisKKyAgICAvL1Rlc3QgcmVhZCBzaWRlCisgICAgVFNpbXBsZUZpbGVUcmFuc3BvcnQgdHJhbnMgPSBuZXcgVFNpbXBsZUZpbGVUcmFuc3BvcnQodGVtcEZpbGVQYXRoTmFtZS50b1N0cmluZygpLHRydWUsIGZhbHNlKTsKKyAgICBhc3NlcnQodHJhbnMuaXNPcGVuKCkpOworCisgICAgLy9TaW1wbGUgZmlsZSB0cmFucyBwcm92aWRlcyBubyBidWZmZXIgYWNjZXNzCisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CisgICAgYXNzZXJ0KG51bGwgPT0gdHJhbnMuZ2V0QnVmZmVyKCkpOworICAgIGFzc2VydCgtMSA9PSB0cmFucy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkpOworCisgICAgLy9UZXN0IGZpbGUgcG9pbnRlciBvcGVyYXRpb25zCisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgYXNzZXJ0KDEyID09IHRyYW5zLmxlbmd0aCgpKTsKKworICAgIGZpbmFsIGludCBCVUZTSVogPSA0OworICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbQlVGU0laXTsKKyAgICB0cmFucy5yZWFkQWxsKGJ1ZjEsIDAsIEJVRlNJWik7CisgICAgYXNzZXJ0KEJVRlNJWiA9PSB0cmFucy5nZXRGaWxlUG9pbnRlcigpKTsKKyAgICBhc3NlcnQoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdezEsIDIsIDMsIDR9LCBidWYxKSk7CisKKyAgICBpbnQgYnl0ZXNSZWFkID0gdHJhbnMucmVhZChidWYxLCAwLCBCVUZTSVopOworICAgIGFzc2VydChieXRlc1JlYWQgPiAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzUmVhZDsgKytpKSB7CisgICAgICBhc3NlcnQoYnVmMVtpXSA9PSBpKzUpOworICAgIH0KKworICAgIHRyYW5zLnNlZWsoMCk7CisgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOworICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKKyAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOworICAgIHRyYW5zLmNsb3NlKCk7CisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUWmxpYlRyYW5zcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkN2Y5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFpsaWJUcmFuc3BvcnQuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRhdGFGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFpsaWJUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHJvdGVjdGVkIFRUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgdW5kZXJseWluZykgeworICAgIHJldHVybiBuZXcgVFpsaWJUcmFuc3BvcnQodW5kZXJseWluZyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBieXRlU2VxdWVuY2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7CisgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2VuZC1zdGFydCsxXTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSAoZW5kLXN0YXJ0KTsgaSsrKSB7CisgICAgICByZXN1bHRbaV0gPSAoYnl0ZSkoc3RhcnQraSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0KKyAgICAgICAgKGJhb3MpKSk7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudGluZ1RyYW5zKTsKKyAgICB0cmFucy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjQ1KSk7CisgICAgY291bnRpbmdUcmFucy5jbG9zZSgpOworICAgIHRyYW5zLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VPcGVuKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIFRUcmFuc3BvcnQgdHJhbnMgPSBnZXRUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChiYW9zKSk7CisgICAgYnl0ZVtdIHVuY29tcHJlc3NlZCA9IGJ5dGVTZXF1ZW5jZSgwLCAyNDUpOworICAgIHRyYW5zLndyaXRlKHVuY29tcHJlc3NlZCk7CisgICAgdHJhbnMuY2xvc2UoKTsKKyAgICBmaW5hbCBieXRlW10gY29tcHJlc3NlZCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKworICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyNTVdOworICAgIFRUcmFuc3BvcnQgdHJhbnNSZWFkID0gZ2V0VHJhbnNwb3J0KG5ldyBUSU9TdHJlYW1UcmFuc3BvcnQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbXByZXNzZWQpKSk7CisgICAgaW50IHJlYWRCeXRlcyA9IHRyYW5zUmVhZC5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgYXNzZXJ0RXF1YWxzKHVuY29tcHJlc3NlZC5sZW5ndGgsIHJlYWRCeXRlcyk7CisgICAgdHJhbnNSZWFkLmNsb3NlKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0UmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgRGVmbGF0ZXJPdXRwdXRTdHJlYW0gZGVmbGF0ZXJPdXRwdXRTdHJlYW0gPSBuZXcgRGVmbGF0ZXJPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgRGF0YU91dHB1dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShkZWZsYXRlck91dHB1dFN0cmVhbSk7CisgICAgZG9zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCA0OSkpOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKKyAgICBkZWZsYXRlck91dHB1dFN0cmVhbS5maW5pc2goKTsKKworICAgIFRNZW1vcnlCdWZmZXIgbWVtYnVmID0gbmV3IFRNZW1vcnlCdWZmZXIoMCk7CisgICAgbWVtYnVmLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7CisKKyAgICBSZWFkQ291bnRpbmdUcmFuc3BvcnQgY291bnRUcmFucyA9IG5ldyBSZWFkQ291bnRpbmdUcmFuc3BvcnQobWVtYnVmKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50VHJhbnMpOworCisgICAgYnl0ZVtdIHJlYWRCdWYgPSBuZXcgYnl0ZVsxMF07CisgICAgdHJhbnMucmVhZChyZWFkQnVmLCAwLCAxMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLDkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMTApOworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZWFkQnVmLCBieXRlU2VxdWVuY2UoMTAsMTkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIGFzc2VydEVxdWFscygzMCwgdHJhbnMucmVhZChuZXcgYnl0ZVszMF0sIDAsIDMwKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKworICAgIHJlYWRCdWYgPSBuZXcgYnl0ZVsyMjBdOworICAgIGFzc2VydEVxdWFscygyMjAsIHRyYW5zLnJlYWQocmVhZEJ1ZiwgMCwgMjIwKSk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLCAyMTkpKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIGNvdW50VHJhbnMucmVhZENvdW50KTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZSgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRGF0YUZvcm1hdEV4Y2VwdGlvbiB7CisgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgV3JpdGVDb3VudGluZ1RyYW5zcG9ydCBjb3VudGluZ1RyYW5zID0gbmV3IFdyaXRlQ291bnRpbmdUcmFuc3BvcnQobmV3IFRJT1N0cmVhbVRyYW5zcG9ydChuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oYmFvcykpKTsKKyAgICBUVHJhbnNwb3J0IHRyYW5zID0gZ2V0VHJhbnNwb3J0KGNvdW50aW5nVHJhbnMpOworCisgICAgdHJhbnMud3JpdGUoYnl0ZVNlcXVlbmNlKDAsIDEwMCkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgxMDEsIDIwMCkpOworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgyMDEsIDI1NSkpOworICAgIGFzc2VydEVxdWFscygxLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgdHJhbnMuZmx1c2goKTsKKyAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKworICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKKyAgICB0cmFucy5mbHVzaCgpOworICAgIGFzc2VydEVxdWFscygzLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworCisgICAgRGF0YUlucHV0U3RyZWFtIGRpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEluZmxhdGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpKTsKKyAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjU2XTsKKyAgICBpbnQgbiA9IGRpbi5yZWFkKGJ1ZiwgMCwgMjU2KTsKKyAgICBhc3NlcnRFcXVhbHMobiwgMjU2KTsKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZVNlcXVlbmNlKDAsIDI1NSksIGJ1ZikpOworCisgICAgYnVmID0gbmV3IGJ5dGVbMjQ2XTsKKyAgICBuID0gZGluLnJlYWQoYnVmLCAwLCAyNDYpOworICAgIGFzc2VydEVxdWFscyhuLCAyNDYpOworICAgIGZvciAoaW50IGkgPSAwOyBpPGJ1Zi5sZW5ndGg7IGkrKykgeworICAgICAgYXNzZXJ0RXF1YWxzKCJmb3IgIitpLCBieXRlU2VxdWVuY2UoMCwyNDUpW2ldLCBidWZbaV0pOworICAgIH0KKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhieXRlU2VxdWVuY2UoMCwyNDUpLCBidWYpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvamF2YW1lL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggZGU5YTE2Mi4uMmY4NjEyYSAxMDA2NDQKLS0tIGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTQxLDcgKzQxLDkgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlTU0lOR19SRVNVTFQgPSA1OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDY7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBST1RPQ09MX0VSUk9SID0gNzsKLQorICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfUFJPVE9DT0wgPSA5OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwogCiAgIHByb3RlY3RlZCBpbnQgdHlwZV8gPSBVTktOT1dOOwogCmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvbWV0YV9kYXRhL0ZpZWxkTWV0YURhdGEuamF2YQppbmRleCAxMWE1YTA4Li5iY2UwMmM3IDEwMDY0NAotLS0gYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9tZXRhX2RhdGEvRmllbGRNZXRhRGF0YS5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L21ldGFfZGF0YS9GaWVsZE1ldGFEYXRhLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAKICAgICB0aGlzLnZhbHVlTWV0YURhdGEgPSB2TWV0YURhdGE7CiAgIH0KICAgCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MsIEhhc2h0YWJsZSBtYXApeworICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcywgSGFzaHRhYmxlIG1hcCl7CiAgICAgc3RydWN0TWFwLnB1dChzQ2xhc3MsIG1hcCk7CiAgIH0KIApAQCAtNzMsNyArNzMsNyBAQAogICAgKgogICAgKiBAcGFyYW0gc0NsYXNzIFRoZSBUQmFzZSBjbGFzcyBmb3Igd2hpY2ggdGhlIG1ldGFkYXRhIG1hcCBpcyByZXF1ZXN0ZWQKICAgICovCi0gIHB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFN0cnVjdE1ldGFEYXRhTWFwKENsYXNzIHNDbGFzcyl7CisgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEhhc2h0YWJsZSBnZXRTdHJ1Y3RNZXRhRGF0YU1hcChDbGFzcyBzQ2xhc3MpewogICAgIGlmICghc3RydWN0TWFwLmNvbnRhaW5zS2V5KHNDbGFzcykpeyAvLyBMb2FkIGNsYXNzIGlmIGl0IGhhc24ndCBiZWVuIGxvYWRlZAogICAgICAgdHJ5ewogICAgICAgICBzQ2xhc3MubmV3SW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKaW5kZXggMWQxNjg4OS4uZjZmZTc2NSAxMDA2NDQKLS0tIGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKKysrIGIvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKQEAgLTEsNCArMSw0IEBACi0vKgorIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTM2LDkgKzM2LDYgQEAKICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0UmVhZF8gPSBmYWxzZTsKICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RyaWN0V3JpdGVfID0gdHJ1ZTsKIAotICBwcm90ZWN0ZWQgaW50IHJlYWRMZW5ndGhfOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1JlYWRMZW5ndGhfID0gZmFsc2U7Ci0KICAgLyoqCiAgICAqIEZhY3RvcnkKICAgICovCkBAIC0zMTEsNyArMzA4LDYgQEAKIAogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmdCb2R5KGludCBzaXplKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKLSAgICAgIGNoZWNrUmVhZExlbmd0aChzaXplKTsKICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKICAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7CiAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsICJVVEYtOCIpOwpAQCAtMzIyLDI5ICszMTgsMTIgQEAKIAogICBwdWJsaWMgYnl0ZVtdIHJlYWRCaW5hcnkoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7Ci0gICAgY2hlY2tSZWFkTGVuZ3RoKHNpemUpOwogICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKICAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOwogICAgIHJldHVybiBidWY7CiAgIH0KIAogICBwcml2YXRlIGludCByZWFkQWxsKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBjaGVja1JlYWRMZW5ndGgobGVuKTsKICAgICByZXR1cm4gdHJhbnNfLnJlYWRBbGwoYnVmLCBvZmYsIGxlbik7CiAgIH0KLQotICBwdWJsaWMgdm9pZCBzZXRSZWFkTGVuZ3RoKGludCByZWFkTGVuZ3RoKSB7Ci0gICAgcmVhZExlbmd0aF8gPSByZWFkTGVuZ3RoOwotICAgIGNoZWNrUmVhZExlbmd0aF8gPSB0cnVlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgY2hlY2tSZWFkTGVuZ3RoKGludCBsZW5ndGgpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICBpZiAoY2hlY2tSZWFkTGVuZ3RoXykgewotICAgICAgcmVhZExlbmd0aF8gLT0gbGVuZ3RoOwotICAgICAgaWYgKHJlYWRMZW5ndGhfIDwgMCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTWVzc2FnZSBsZW5ndGggZXhjZWVkZWQ6ICIgKyBsZW5ndGgpOwotICAgICAgfQotICAgIH0KLSAgfQotCiB9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MTY4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQpAQCAtMCwwICsxLDk3MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OworCisvKioKKyAqIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAqIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgd3JpdGUgYW5kIHJlYWQuCisgKiBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICogcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAqLworcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgeworCisgIC8qKgorICAgKiBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICovCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgeworCisgICAgcHVibGljIFRQcm90b2NvbCBnZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7CisgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2wodHJhbnMpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBDT01NQSAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICcsJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIENPTE9OICAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJzonIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTEJSQUNFICAgICAgICAgICA9IG5ldyBieXRlW10geyAneycgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBSQlJBQ0UgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICd9JyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIExCUkFDS0VUICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ1snIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgUkJSQUNLRVQgICAgICAgICA9IG5ldyBieXRlW10geyAnXScgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBRVU9URSAgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICciJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIEJBQ0tTTEFTSCAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ1xcJyB9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIFpFUk8gICAgICAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJzAnIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBFU0NTRVEgICAgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdcXCcsICd1JywgJzAnLCAnMCcgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nICAgIFZFUlNJT04gICAgICAgICAgPSAxOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgSlNPTl9DSEFSX1RBQkxFICA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgMSAyIDMgNCA1IDYgNyA4IDkgQSBCIEMgRCBFIEYgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICdiJywgJ3QnLCAnbicsIDAsICdmJywgJ3InLCAwLCAwLCAvLyAwCisgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAvLyAxCisgICAgICAxLCAxLCAnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nICBFU0NBUEVfQ0hBUlMgICAgID0gIlwiXFwvYmZucnQiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgRVNDQVBFX0NIQVJfVkFMUyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJywgJ1xcJywgJy8nLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgICAgIERFRl9TVFJJTkdfU0laRSAgPSAxNjsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gIE5BTUVfQk9PTCAgICAgICAgPSBuZXcgYnl0ZVtdIHsgJ3QnLCAnZicgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdICBOQU1FX0JZVEUgICAgICAgID0gbmV3IGJ5dGVbXSB7ICdpJywgJzgnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9JMTYgICAgICAgICA9IG5ldyBieXRlW10geyAnaScsICcxJywgJzYnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9JMzIgICAgICAgICA9IG5ldyBieXRlW10geyAnaScsICczJywgJzInIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9JNjQgICAgICAgICA9IG5ldyBieXRlW10geyAnaScsICc2JywgJzQnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9ET1VCTEUgICAgICA9IG5ldyBieXRlW10geyAnZCcsICdiJywgJ2wnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9TVFJVQ1QgICAgICA9IG5ldyBieXRlW10geyAncicsICdlJywgJ2MnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9TVFJJTkcgICAgICA9IG5ldyBieXRlW10geyAncycsICd0JywgJ3InIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9NQVAgICAgICAgICA9IG5ldyBieXRlW10geyAnbScsICdhJywgJ3AnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9MSVNUICAgICAgICA9IG5ldyBieXRlW10geyAnbCcsICdzJywgJ3QnIH07CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSAgTkFNRV9TRVQgICAgICAgICA9IG5ldyBieXRlW10geyAncycsICdlJywgJ3QnIH07CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBBTk9OWU1PVVNfU1RSVUNUID0gbmV3IFRTdHJ1Y3QoKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoYnl0ZSB0eXBlSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgc3dpdGNoICh0eXBlSUQpIHsKKyAgICBjYXNlIFRUeXBlLkJPT0w6CisgICAgICByZXR1cm4gTkFNRV9CT09MOworICAgIGNhc2UgVFR5cGUuQllURToKKyAgICAgIHJldHVybiBOQU1FX0JZVEU7CisgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICByZXR1cm4gTkFNRV9JMTY7CisgICAgY2FzZSBUVHlwZS5JMzI6CisgICAgICByZXR1cm4gTkFNRV9JMzI7CisgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICByZXR1cm4gTkFNRV9JNjQ7CisgICAgY2FzZSBUVHlwZS5ET1VCTEU6CisgICAgICByZXR1cm4gTkFNRV9ET1VCTEU7CisgICAgY2FzZSBUVHlwZS5TVFJJTkc6CisgICAgICByZXR1cm4gTkFNRV9TVFJJTkc7CisgICAgY2FzZSBUVHlwZS5TVFJVQ1Q6CisgICAgICByZXR1cm4gTkFNRV9TVFJVQ1Q7CisgICAgY2FzZSBUVHlwZS5NQVA6CisgICAgICByZXR1cm4gTkFNRV9NQVA7CisgICAgY2FzZSBUVHlwZS5TRVQ6CisgICAgICByZXR1cm4gTkFNRV9TRVQ7CisgICAgY2FzZSBUVHlwZS5MSVNUOgorICAgICAgcmV0dXJuIE5BTUVfTElTVDsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgZ2V0VHlwZUlERm9yVHlwZU5hbWUoYnl0ZVtdIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGUgcmVzdWx0ID0gVFR5cGUuU1RPUDsKKyAgICBpZiAobmFtZS5sZW5ndGggPiAxKSB7CisgICAgICBzd2l0Y2ggKG5hbWVbMF0pIHsKKyAgICAgIGNhc2UgJ2QnOgorICAgICAgICByZXN1bHQgPSBUVHlwZS5ET1VCTEU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnaSc6CisgICAgICAgIHN3aXRjaCAobmFtZVsxXSkgeworICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CWVRFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICcxJzoKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMTY7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkzMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnNic6CisgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbCc6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLkxJU1Q7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnbSc6CisgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1BUDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdyJzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuU1RSVUNUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOgorICAgICAgICBpZiAobmFtZVsxXSA9PSAndCcpIHsKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TVFJJTkc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobmFtZVsxXSA9PSAnZScpIHsKKyAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TRVQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd0JzoKKyAgICAgICAgcmVzdWx0ID0gVFR5cGUuQk9PTDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gVFR5cGUuU1RPUCkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAorICAgICAgICAgICJVbnJlY29nbml6ZWQgdHlwZSIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8gQmFzZSBjbGFzcyBmb3IgdHJhY2tpbmcgSlNPTiBjb250ZXh0cyB0aGF0IG1heSByZXF1aXJlIGluc2VydGluZy9yZWFkaW5nCisgIC8vIGFkZGl0aW9uYWwgSlNPTiBzeW50YXggY2hhcmFjdGVycworICAvLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQgeworICAgIC8qKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KKworICAgIC8qKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlYWQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZXNjYXBlTnVtKCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuIFdpbGwgaW5zZXJ0L3JlYWQgY29tbWFzIGJlZm9yZSBlYWNoIGl0ZW0gZXhjZXB0CisgIC8vIGZvciB0aGUgZmlyc3Qgb25lCisgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgZXh0ZW5kcyBKU09OQmFzZUNvbnRleHQgeworICAgIHByaXZhdGUgYm9vbGVhbiBmaXJzdF8gPSB0cnVlOworCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhbnNfLndyaXRlKENPTU1BKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZWFkKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgaWYgKGZpcnN0XykgeworICAgICAgICBmaXJzdF8gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihDT01NQSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29udGV4dCBmb3IgSlNPTiByZWNvcmRzLiBXaWxsIGluc2VydC9yZWFkIGNvbG9ucyBiZWZvcmUgdGhlIHZhbHVlIHBvcnRpb24KKyAgLy8gb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgLy8gYWRkaXRpb24sIHdpbGwgaW5kaWNhdGUgdGhhdCBudW1iZXJzIGluIHRoZSBrZXkgcG9zaXRpb24gbmVlZCB0byBiZQorICAvLyBlc2NhcGVkIGluIHF1b3RlcyAoc2luY2UgSlNPTiBrZXlzIG11c3QgYmUgc3RyaW5ncykuCisgIHByb3RlY3RlZCBjbGFzcyBKU09OUGFpckNvbnRleHQgZXh0ZW5kcyBKU09OQmFzZUNvbnRleHQgeworICAgIHByaXZhdGUgYm9vbGVhbiBmaXJzdF8gPSB0cnVlOworICAgIHByaXZhdGUgYm9vbGVhbiBjb2xvbl8gPSB0cnVlOworCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdHJhbnNfLndyaXRlKGNvbG9uXyA/IENPTE9OIDogQ09NTUEpOworICAgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHJlYWQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoZmlyc3RfKSB7CisgICAgICAgIGZpcnN0XyA9IGZhbHNlOworICAgICAgICBjb2xvbl8gPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZEpTT05TeW50YXhDaGFyKGNvbG9uXyA/IENPTE9OIDogQ09NTUEpOworICAgICAgICBjb2xvbl8gPSAhY29sb25fOworICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGVzY2FwZU51bSgpIHsKKyAgICAgIHJldHVybiBjb2xvbl87CisgICAgfQorICB9CisKKyAgLy8gSG9sZHMgdXAgdG8gb25lIGJ5dGUgZnJvbSB0aGUgdHJhbnNwb3J0CisgIHByb3RlY3RlZCBjbGFzcyBMb29rYWhlYWRSZWFkZXIgeworCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0RhdGFfOworICAgIHByaXZhdGUgYnl0ZVtdICBkYXRhXyA9IG5ldyBieXRlWzFdOworCisgICAgLy8gUmV0dXJuIGFuZCBjb25zdW1lIHRoZSBuZXh0IGJ5dGUgdG8gYmUgcmVhZCwgZWl0aGVyIHRha2luZyBpdCBmcm9tIHRoZQorICAgIC8vIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgIHByb3RlY3RlZCBieXRlIHJlYWQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBpZiAoaGFzRGF0YV8pIHsKKyAgICAgICAgaGFzRGF0YV8gPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0cmFuc18ucmVhZEFsbChkYXRhXywgMCwgMSk7CisgICAgICB9CisgICAgICByZXR1cm4gZGF0YV9bMF07CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBuZXh0IGJ5dGUgdG8gYmUgcmVhZCB3aXRob3V0IGNvbnN1bWluZywgZmlsbGluZyB0aGUgZGF0YQorICAgIC8vIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFscmVhZHkuCisgICAgcHJvdGVjdGVkIGJ5dGUgcGVlaygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgIGlmICghaGFzRGF0YV8pIHsKKyAgICAgICAgdHJhbnNfLnJlYWRBbGwoZGF0YV8sIDAsIDEpOworICAgICAgfQorICAgICAgaGFzRGF0YV8gPSB0cnVlOworICAgICAgcmV0dXJuIGRhdGFfWzBdOworICAgIH0KKyAgfQorCisgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyBvZiB0eXBlIEpTT05CYXNlQ29udGV4dCB0aGF0IHdlIG1heSBiZSBpbgorICBwcml2YXRlIFN0YWNrICAgICAgICAgICBjb250ZXh0U3RhY2tfID0gbmV3IFN0YWNrKCk7CisKKyAgLy8gQ3VycmVudCBjb250ZXh0IHRoYXQgd2UgYXJlIGluCisgIHByaXZhdGUgSlNPTkJhc2VDb250ZXh0IGNvbnRleHRfICAgICAgPSBuZXcgSlNPTkJhc2VDb250ZXh0KCk7CisKKyAgLy8gUmVhZGVyIHRoYXQgbWFuYWdlcyBhIDEtYnl0ZSBidWZmZXIKKyAgcHJpdmF0ZSBMb29rYWhlYWRSZWFkZXIgcmVhZGVyXyAgICAgICA9IG5ldyBMb29rYWhlYWRSZWFkZXIoKTsKKworICAvLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KKyAgcHJpdmF0ZSB2b2lkIHB1c2hDb250ZXh0KEpTT05CYXNlQ29udGV4dCBjKSB7CisgICAgY29udGV4dFN0YWNrXy5wdXNoKGNvbnRleHRfKTsKKyAgICBjb250ZXh0XyA9IGM7CisgIH0KKworICAvLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgcHJpdmF0ZSB2b2lkIHBvcENvbnRleHQoKSB7CisgICAgY29udGV4dF8gPSAoSlNPTkJhc2VDb250ZXh0KWNvbnRleHRTdGFja18ucG9wKCk7CisgIH0KKworICAvKioKKyAgICogQ29uc3RydWN0b3IKKyAgICovCisgIHB1YmxpYyBUSlNPTlByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpIHsKKyAgICBzdXBlcih0cmFucyk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICBjb250ZXh0U3RhY2tfLmNsZWFyKCk7CisgICAgY29udGV4dF8gPSBuZXcgSlNPTkJhc2VDb250ZXh0KCk7CisgICAgcmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIoKTsKKyAgfQorCisgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKKyAgcHJpdmF0ZSBieXRlW10gdG1wYnVmXyA9IG5ldyBieXRlWzRdOworCisgIC8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgLy8gTWFya2VkIHByb3RlY3RlZCB0byBhdm9pZCBzeW50aGV0aWMgYWNjZXNzb3IgaW4gSlNPTkxpc3RDb250ZXh0LnJlYWQKKyAgLy8gYW5kIEpTT05QYWlyQ29udGV4dC5yZWFkCisgIHByb3RlY3RlZCB2b2lkIHJlYWRKU09OU3ludGF4Q2hhcihieXRlW10gYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGJ5dGUgY2ggPSByZWFkZXJfLnJlYWQoKTsKKyAgICBpZiAoY2ggIT0gYlswXSkgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlcjoiICsgKGNoYXIpY2gpOworICAgIH0KKyAgfQorCisgIC8vIENvbnZlcnQgYSBieXRlIGNvbnRhaW5pbmcgYSBoZXggY2hhciAoJzAnLSc5JyBvciAnYSctJ2YnKSBpbnRvIGl0cworICAvLyBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGhleFZhbChieXRlIGNoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKSB7CisgICAgICByZXR1cm4gKGJ5dGUpKChjaGFyKWNoIC0gJzAnKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIHsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScgKyAxMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgfQorICB9CisKKyAgLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgaGV4Q2hhcihieXRlIHZhbCkgeworICAgIHZhbCAmPSAweDBGOworICAgIGlmICh2YWwgPCAxMCkgeworICAgICAgcmV0dXJuIChieXRlKSgoY2hhcil2YWwgKyAnMCcpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpKHZhbCAtIDEwKSArICdhJyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0hpZ2hTdXJyb2dhdGUoY2hhciBjKSB7CisgICAgcmV0dXJuIGMgPj0gJ1x1RDgwMCcgJiYgYyA8PSAnXHVEQkZGJzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb3dTdXJyb2dhdGUoY2hhciBjKSB7CisgICAgcmV0dXJuIGMgPj0gJ1x1REMwMCcgJiYgYyA8PSAnXHVERkZGJzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSB0b1VURjgoaW50IGNvZGVwb2ludCkgeworICAgIGZpbmFsIGludFtdIEZJUlNUX0JZVEVfTUFTSyA9IHsgMCwgMHhjMCwgMHhlMCwgMHhmMCB9OworICAgIGludCBsZW5ndGggPSAwOworICAgIGlmIChjb2RlcG9pbnQgPD0gMHg3ZikgbGVuZ3RoID0gMTsKKyAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHg3ZmYpIGxlbmd0aCA9IDI7CisgICAgZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4ZmZmZikgbGVuZ3RoID0gMzsKKyAgICBlbHNlIGlmIChjb2RlcG9pbnQgPD0gMHgxZmZmZmYpIGxlbmd0aCA9IDQ7CisgICAgZWxzZSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ29kZSBwb2ludCBvdmVyIFUrMUZGRkZGIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKworICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgc3dpdGNoIChsZW5ndGgpIHsKKyAgICBjYXNlIDQ6CisgICAgICBieXRlc1szXSA9IChieXRlKSgoY29kZXBvaW50ICYgMHgzZikgfCAweDgwKTsKKyAgICAgIGNvZGVwb2ludCA+Pj0gNjsKKyAgICBjYXNlIDM6CisgICAgICBieXRlc1syXSA9IChieXRlKSgoY29kZXBvaW50ICYgMHgzZikgfCAweDgwKTsKKyAgICAgIGNvZGVwb2ludCA+Pj0gNjsKKyAgICBjYXNlIDI6CisgICAgICBieXRlc1sxXSA9IChieXRlKSgoY29kZXBvaW50ICYgMHgzZikgfCAweDgwKTsKKyAgICAgIGNvZGVwb2ludCA+Pj0gNjsKKyAgICBjYXNlIDE6CisgICAgICBieXRlc1swXSA9IChieXRlKShjb2RlcG9pbnQgfCBGSVJTVF9CWVRFX01BU0tbbGVuZ3RoIC0gMV0pOworICAgIH0KKworICAgIHJldHVybiBieXRlczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSB0b1VURjgoaW50IGhpZ2gsIGludCBsb3cpIHsKKyAgICBpbnQgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKTsKKyAgICBjb2RlcG9pbnQgKz0gbG93ICYgMHgzZmY7CisgICAgcmV0dXJuIHRvVVRGOChjb2RlcG9pbnQpOworICB9CisKKyAgLy8gV3JpdGUgdGhlIGJ5dGVzIGluIGFycmF5IGJ1ZiBhcyBhIEpTT04gY2hhcmFjdGVycywgZXNjYXBpbmcgYXMgbmVlZGVkCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05TdHJpbmcoYnl0ZVtdIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgaW50IGxlbiA9IGIubGVuZ3RoOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgIGlmICgoYltpXSAmIDB4MDBGRikgPj0gMHgzMCkgeworICAgICAgICBpZiAoYltpXSA9PSBCQUNLU0xBU0hbMF0pIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoQkFDS1NMQVNIKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICB0cmFuc18ud3JpdGUoYiwgaSwgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICB0bXBidWZfWzBdID0gSlNPTl9DSEFSX1RBQkxFW2JbaV1dOworICAgICAgICBpZiAodG1wYnVmX1swXSA9PSAxKSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKGIsIGksIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRtcGJ1Zl9bMF0gPiAxKSB7CisgICAgICAgICAgdHJhbnNfLndyaXRlKEJBQ0tTTEFTSCk7CisgICAgICAgICAgdHJhbnNfLndyaXRlKHRtcGJ1Zl8sIDAsIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIHRyYW5zXy53cml0ZShFU0NTRVEpOworICAgICAgICAgIHRtcGJ1Zl9bMF0gPSBoZXhDaGFyKChieXRlKShiW2ldID4+IDQpKTsKKyAgICAgICAgICB0bXBidWZfWzFdID0gaGV4Q2hhcihiW2ldKTsKKyAgICAgICAgICB0cmFuc18ud3JpdGUodG1wYnVmXywgMCwgMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgfQorCisgIC8vIFdyaXRlIG91dCBudW1iZXIgYXMgYSBKU09OIHZhbHVlLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcyBzbywgaXQgd2lsbCBiZQorICAvLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTkludGVnZXIobG9uZyBudW0pIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIFN0cmluZyBzdHIgPSBMb25nLnRvU3RyaW5nKG51bSk7CisgICAgYm9vbGVhbiBlc2NhcGVOdW0gPSBjb250ZXh0Xy5lc2NhcGVOdW0oKTsKKyAgICBpZiAoZXNjYXBlTnVtKSB7CisgICAgICB0cmFuc18ud3JpdGUoUVVPVEUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgYnl0ZVtdIGJ1ZiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHRyYW5zXy53cml0ZShidWYpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7CisgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKKyAgICB9CisgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZSBvdXQgYSBkb3VibGUgYXMgYSBKU09OIHZhbHVlLiBJZiBpdCBpcyBOYU4gb3IgaW5maW5pdHkgb3IgaWYgdGhlCisgIC8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIHdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTkRvdWJsZShkb3VibGUgbnVtKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ud3JpdGUoKTsKKyAgICBTdHJpbmcgc3RyID0gRG91YmxlLnRvU3RyaW5nKG51bSk7CisgICAgYm9vbGVhbiBzcGVjaWFsID0gZmFsc2U7CisgICAgc3dpdGNoIChzdHIuY2hhckF0KDApKSB7CisgICAgY2FzZSAnTic6IC8vIE5hTgorICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlICctJzoKKyAgICAgIGlmIChzdHIuY2hhckF0KDEpID09ICdJJykgeyAvLyAtSW5maW5pdHkKKyAgICAgICAgc3BlY2lhbCA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBib29sZWFuIGVzY2FwZU51bSA9IHNwZWNpYWwgfHwgY29udGV4dF8uZXNjYXBlTnVtKCk7CisgICAgaWYgKGVzY2FwZU51bSkgeworICAgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgdHJhbnNfLndyaXRlKGIsIDAsIGIubGVuZ3RoKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICAgIGlmIChlc2NhcGVOdW0pIHsKKyAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CisgICAgfQorICB9CisKKyAgLy8gV3JpdGUgb3V0IGNvbnRlbnRzIG9mIGJ5dGUgYXJyYXkgYiBhcyBhIEpTT04gc3RyaW5nIHdpdGggYmFzZS02NCBlbmNvZGVkCisgIC8vIGRhdGEKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTkJhc2U2NChieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgICBpbnQgbGVuID0gbGVuZ3RoOworICAgIGludCBvZmYgPSBvZmZzZXQ7CisgICAgd2hpbGUgKGxlbiA+PSAzKSB7CisgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKKyAgICAgIFRCYXNlNjRVdGlscy5lbmNvZGUoYiwgb2ZmLCAzLCB0bXBidWZfLCAwKTsKKyAgICAgIHRyYW5zXy53cml0ZSh0bXBidWZfLCAwLCA0KTsKKyAgICAgIG9mZiArPSAzOworICAgICAgbGVuIC09IDM7CisgICAgfQorICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAvLyBFbmNvZGUgcmVtYWluZGVyCisgICAgICBUQmFzZTY0VXRpbHMuZW5jb2RlKGIsIG9mZiwgbGVuLCB0bXBidWZfLCAwKTsKKyAgICAgIHRyYW5zXy53cml0ZSh0bXBidWZfLCAwLCBsZW4gKyAxKTsKKyAgICB9CisgICAgdHJhbnNfLndyaXRlKFFVT1RFKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05PYmplY3RTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy53cml0ZSgpOworICAgIHRyYW5zXy53cml0ZShMQlJBQ0UpOworICAgIHB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVKU09OT2JqZWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHBvcENvbnRleHQoKTsKKyAgICB0cmFuc18ud3JpdGUoUkJSQUNFKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUpTT05BcnJheVN0YXJ0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLndyaXRlKCk7CisgICAgdHJhbnNfLndyaXRlKExCUkFDS0VUKTsKKyAgICBwdXNoQ29udGV4dChuZXcgSlNPTkxpc3RDb250ZXh0KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlSlNPTkFycmF5RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHBvcENvbnRleHQoKTsKKyAgICB0cmFuc18ud3JpdGUoUkJSQUNLRVQpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOworICAgIHRyeSB7CisgICAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICAgIHdyaXRlSlNPTkludGVnZXIobWVzc2FnZS50eXBlKTsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2Uuc2VxaWQpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTk9iamVjdEVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoZmllbGQuaWQpOworICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGdldFR5cGVOYW1lRm9yVHlwZUlEKGZpZWxkLnR5cGUpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OT2JqZWN0RW5kKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkU3RvcCgpIHt9CisKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBCZWdpbihUTWFwIG1hcCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLmtleVR5cGUpKTsKKyAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQobWFwLnZhbHVlVHlwZSkpOworICAgIHdyaXRlSlNPTkludGVnZXIobWFwLnNpemUpOworICAgIHdyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICB3cml0ZUpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0QmVnaW4oVExpc3QgbGlzdCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQobGlzdC5lbGVtVHlwZSkpOworICAgIHdyaXRlSlNPTkludGVnZXIobGlzdC5zaXplKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlTGlzdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKKyAgICB3cml0ZUpTT05TdHJpbmcoZ2V0VHlwZU5hbWVGb3JUeXBlSUQoc2V0LmVsZW1UeXBlKSk7CisgICAgd3JpdGVKU09OSW50ZWdlcihzZXQuc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZVNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoYiA/IChsb25nKTEgOiAobG9uZykwKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICB3cml0ZUpTT05JbnRlZ2VyKGIpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVJMTYoc2hvcnQgaTE2KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihpMTYpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkludGVnZXIoaTMyKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlSTY0KGxvbmcgaTY0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd3JpdGVKU09OSW50ZWdlcihpNjQpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkRvdWJsZShkdWIpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHN0cikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKKyAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKKyAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgeworICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGVCaW5hcnkoYnl0ZVtdIGJpbikgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdyaXRlSlNPTkJhc2U2NChiaW4sIDAsIGJpbi5sZW5ndGgpOworICB9CisKKyAgLyoqCisgICAqIFJlYWRpbmcgbWV0aG9kcy4KKyAgICovCisKKyAgLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCByZWFkaW5nIGZyb20gdGhlCisgIC8vIGNvbnRleHQgaWYgc2tpcENvbnRleHQgaXMgdHJ1ZS4KKyAgcHJpdmF0ZSBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlYWRKU09OU3RyaW5nKGJvb2xlYW4gc2tpcENvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFyciA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKERFRl9TVFJJTkdfU0laRSk7CisgICAgaW50IGhpZ2hTdXJyb2dhdGUgPSAwOworICAgIGlmICghc2tpcENvbnRleHQpIHsKKyAgICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICB9CisgICAgcmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgYnl0ZSBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgICAgaWYgKGNoID09IFFVT1RFWzBdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKGNoID09IEVTQ1NFUVswXSkgeworICAgICAgICBjaCA9IHJlYWRlcl8ucmVhZCgpOworICAgICAgICBpZiAoY2ggPT0gRVNDU0VRWzFdKSB7CisgICAgICAgICAgdHJhbnNfLnJlYWRBbGwodG1wYnVmXywgMCwgNCk7CisgICAgICAgICAgc2hvcnQgY3UgPSAoc2hvcnQpKAorICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAoKHNob3J0KWhleFZhbCh0bXBidWZfWzFdKSA8PCA4KSArCisgICAgICAgICAgICAgICgoc2hvcnQpaGV4VmFsKHRtcGJ1Zl9bMl0pIDw8IDQpICsKKyAgICAgICAgICAgICAgKHNob3J0KWhleFZhbCh0bXBidWZfWzNdKSk7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChpc0hpZ2hTdXJyb2dhdGUoKGNoYXIpY3UpKSB7CisgICAgICAgICAgICAgIGlmIChoaWdoU3Vycm9nYXRlICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gY3U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpc0xvd1N1cnJvZ2F0ZSgoY2hhciljdSkpIHsKKyAgICAgICAgICAgICAgaWYgKGhpZ2hTdXJyb2dhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgIGFyci53cml0ZSh0b1VURjgoaGlnaFN1cnJvZ2F0ZSwgY3UpKTsKKyAgICAgICAgICAgICAgaGlnaFN1cnJvZ2F0ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKHRvVVRGOChjdSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5OT1RfSU1QTEVNRU5URUQsCisgICAgICAgICAgICAgICAgIkpWTSBkb2VzIG5vdCBzdXBwb3J0IFVURi04Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgaW50IG9mZiA9IEVTQ0FQRV9DSEFSUy5pbmRleE9mKGNoKTsKKyAgICAgICAgICBpZiAob2ZmID09IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgIH0KKyAgICAgICAgICBjaCA9IEVTQ0FQRV9DSEFSX1ZBTFNbb2ZmXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYXJyLndyaXRlKGNoKTsKKyAgICB9CisKKyAgICBpZiAoaGlnaFN1cnJvZ2F0ZSAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgIH0KKyAgICByZXR1cm4gYXJyOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCisgIHByaXZhdGUgYm9vbGVhbiBpc0pTT05OdW1lcmljKGJ5dGUgYikgeworICAgIHN3aXRjaCAoYikgeworICAgIGNhc2UgJysnOgorICAgIGNhc2UgJy0nOgorICAgIGNhc2UgJy4nOgorICAgIGNhc2UgJzAnOgorICAgIGNhc2UgJzEnOgorICAgIGNhc2UgJzInOgorICAgIGNhc2UgJzMnOgorICAgIGNhc2UgJzQnOgorICAgIGNhc2UgJzUnOgorICAgIGNhc2UgJzYnOgorICAgIGNhc2UgJzcnOgorICAgIGNhc2UgJzgnOgorICAgIGNhc2UgJzknOgorICAgIGNhc2UgJ0UnOgorICAgIGNhc2UgJ2UnOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgLy8gbm90IGRvIGEgY29tcGxldGUgcmVnZXggY2hlY2sgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgbnVtYmVyLgorICBwcml2YXRlIFN0cmluZyByZWFkSlNPTk51bWVyaWNDaGFycygpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBTdHJpbmdCdWZmZXIgc3RyYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBieXRlIGNoID0gcmVhZGVyXy5wZWVrKCk7CisgICAgICBpZiAoIWlzSlNPTk51bWVyaWMoY2gpKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3RyYnVmLmFwcGVuZCgoY2hhcilyZWFkZXJfLnJlYWQoKSk7CisgICAgfQorICAgIHJldHVybiBzdHJidWYudG9TdHJpbmcoKTsKKyAgfQorCisgIC8vIFJlYWQgaW4gYSBKU09OIG51bWJlci4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMsIHJlYWQgaW4gZW5jbG9zaW5nIHF1b3Rlcy4KKyAgcHJpdmF0ZSBsb25nIHJlYWRKU09OSW50ZWdlcigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICByZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOworICAgIH0KKyAgICBTdHJpbmcgc3RyID0gcmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKKyAgICBpZiAoY29udGV4dF8uZXNjYXBlTnVtKCkpIHsKKyAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgfQorICAgIHRyeSB7CisgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKHN0cikubG9uZ1ZhbHVlKCk7CisgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICB9CisgIH0KKworICAvLyBSZWFkIGluIGEgSlNPTiBkb3VibGUgdmFsdWUuIFRocm93IGlmIHRoZSB2YWx1ZSBpcyBub3Qgd3JhcHBlZCBpbiBxdW90ZXMKKyAgLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KKyAgcHJpdmF0ZSBkb3VibGUgcmVhZEpTT05Eb3VibGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgY29udGV4dF8ucmVhZCgpOworICAgIGlmIChyZWFkZXJfLnBlZWsoKSA9PSBRVU9URVswXSkgeworICAgICAgVEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnIgPSByZWFkSlNPTlN0cmluZyh0cnVlKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoIlVURi04IikpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgIGlmICghY29udGV4dF8uZXNjYXBlTnVtKCkgJiYgIURvdWJsZS5pc05hTihkdWIpICYmCisgICAgICAgICAgICAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgeworICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7CisgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CisgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyAtIHdlIHNob3VsZCBoYXZlIGhhZCBhIHF1b3RlIGlmIGVzY2FwZU51bSA9PSB0cnVlCisgICAgICAgIHJlYWRKU09OU3ludGF4Q2hhcihRVU9URSk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2YocmVhZEpTT05OdW1lcmljQ2hhcnMoKSkuZG91YmxlVmFsdWUoKTsKKyAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFJlYWQgaW4gYSBKU09OIHN0cmluZyBjb250YWluaW5nIGJhc2UtNjQgZW5jb2RlZCBkYXRhIGFuZCBkZWNvZGUgaXQuCisgIHByaXZhdGUgYnl0ZVtdIHJlYWRKU09OQmFzZTY0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgIGJ5dGVbXSBiID0gYXJyLmdldCgpOworICAgIGludCBsZW4gPSBhcnIubGVuKCk7CisgICAgaW50IG9mZiA9IDA7CisgICAgaW50IHNpemUgPSAwOworICAgIC8vIElnbm9yZSBwYWRkaW5nCisgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKKyAgICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSBib3VuZCAmJiBiW2ldID09ICc9JzsgLS1pKSB7CisgICAgICAtLWxlbjsKKyAgICB9CisgICAgd2hpbGUgKGxlbiA+PSA0KSB7CisgICAgICAvLyBEZWNvZGUgNCBieXRlcyBhdCBhIHRpbWUKKyAgICAgIFRCYXNlNjRVdGlscy5kZWNvZGUoYiwgb2ZmLCA0LCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgIG9mZiArPSA0OworICAgICAgbGVuIC09IDQ7CisgICAgICBzaXplICs9IDM7CisgICAgfQorICAgIC8vIERvbid0IGRlY29kZSBpZiB3ZSBoaXQgdGhlIGVuZCBvciBnb3QgYSBzaW5nbGUgbGVmdG92ZXIgYnl0ZSAoaW52YWxpZAorICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgdHlwZSkKKyAgICBpZiAobGVuID4gMSkgeworICAgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgICAgVEJhc2U2NFV0aWxzLmRlY29kZShiLCBvZmYsIGxlbiwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgfQorICAgIC8vIFNhZGx5IHdlIG11c3QgY29weSB0aGUgYnl0ZVtdIChhbnkgd2F5IGFyb3VuZCB0aGlzPykKKyAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgU3lzdGVtLmFycmF5Y29weShiLCAwLCByZXN1bHQsIDAsIHNpemUpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEpTT05PYmplY3RTdGFydCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBjb250ZXh0Xy5yZWFkKCk7CisgICAgcmVhZEpTT05TeW50YXhDaGFyKExCUkFDRSk7CisgICAgcHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkSlNPTk9iamVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKTsKKyAgICBwb3BDb250ZXh0KCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEpTT05BcnJheVN0YXJ0KCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIGNvbnRleHRfLnJlYWQoKTsKKyAgICByZWFkSlNPTlN5bnRheENoYXIoTEJSQUNLRVQpOworICAgIHB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQoKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZEpTT05BcnJheUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpOworICAgIHBvcENvbnRleHQoKTsKKyAgfQorCisgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOworICAgIGlmIChyZWFkSlNPTkludGVnZXIoKSAhPSBWRVJTSU9OKSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24uIik7CisgICAgfQorICAgIFN0cmluZyBuYW1lOworICAgIHRyeSB7CisgICAgICBuYW1lID0gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgICBieXRlIHR5cGUgPSAoYnl0ZSlyZWFkSlNPTkludGVnZXIoKTsKKyAgICBpbnQgc2VxaWQgPSAoaW50KXJlYWRKU09OSW50ZWdlcigpOworICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobmFtZSwgdHlwZSwgc2VxaWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKyAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05PYmplY3RFbmQoKTsKKyAgfQorCisgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgYnl0ZSBjaCA9IHJlYWRlcl8ucGVlaygpOworICAgIGJ5dGUgdHlwZTsKKyAgICBzaG9ydCBpZCA9IDA7CisgICAgaWYgKGNoID09IFJCUkFDRVswXSkgeworICAgICAgdHlwZSA9IFRUeXBlLlNUT1A7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWQgPSAoc2hvcnQpcmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICB0eXBlID0gZ2V0VHlwZUlERm9yVHlwZU5hbWUocmVhZEpTT05TdHJpbmcoZmFsc2UpLmdldCgpKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBURmllbGQoIiIsIHR5cGUsIGlkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTk9iamVjdEVuZCgpOworICB9CisKKyAgcHVibGljIFRNYXAgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOworICAgIGJ5dGUga2V5VHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgYnl0ZSB2YWx1ZVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGludCBzaXplID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgcmV0dXJuIG5ldyBUTWFwKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgcmVhZEpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgYnl0ZSBlbGVtVHlwZSA9IGdldFR5cGVJREZvclR5cGVOYW1lKHJlYWRKU09OU3RyaW5nKGZhbHNlKS5nZXQoKSk7CisgICAgaW50IHNpemUgPSAoaW50KXJlYWRKU09OSW50ZWdlcigpOworICAgIHJldHVybiBuZXcgVExpc3QoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZExpc3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmVhZEpTT05BcnJheUVuZCgpOworICB9CisKKyAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJlYWRKU09OQXJyYXlTdGFydCgpOworICAgIGJ5dGUgZWxlbVR5cGUgPSBnZXRUeXBlSURGb3JUeXBlTmFtZShyZWFkSlNPTlN0cmluZyhmYWxzZSkuZ2V0KCkpOworICAgIGludCBzaXplID0gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgICByZXR1cm4gbmV3IFRTZXQoZWxlbVR5cGUsIHNpemUpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZWFkSlNPTkFycmF5RW5kKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKHJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWUpOworICB9CisKKyAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChieXRlKXJlYWRKU09OSW50ZWdlcigpOworICB9CisKKyAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIChzaG9ydClyZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgcmVhZEkzMigpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gKGludClyZWFkSlNPTkludGVnZXIoKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIHJlYWRJNjQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHJlYWRKU09OSW50ZWdlcigpOworICB9CisKKyAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHJldHVybiByZWFkSlNPTkRvdWJsZSgpOworICB9CisKKyAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKCJVVEYtOCIpOworICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBieXRlW10gcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcmVhZEpTT05CYXNlNjQoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YW1lL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCmluZGV4IDQ1MWEyZTUuLmU2ZmZiYTQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCkBAIC00Miw2ICs0Miw4IEBACiAKICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbV8gPSBudWxsOwogCisgIHByaXZhdGUgSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG51bGw7CisKICAgcHJpdmF0ZSBpbnQgY29ubmVjdFRpbWVvdXRfID0gMDsKIAogICBwcml2YXRlIGludCByZWFkVGltZW91dF8gPSAwOwpAQCAtNDksNyArNTEsNyBAQAogICBwcml2YXRlIEhhc2h0YWJsZSBjdXN0b21IZWFkZXJzXyA9IG51bGw7CiAKICAgcHVibGljIFRIdHRwQ2xpZW50KFN0cmluZyB1cmwpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICB1cmxfID0gdXJsOworICAgIHVybF8gPSB1cmw7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBzZXRDb25uZWN0VGltZW91dChpbnQgdGltZW91dCkgewpAQCAtODEsNiArODMsMTQgQEAKICAgICAgIH0KICAgICAgIGlucHV0U3RyZWFtXyA9IG51bGw7CiAgICAgfQorCisgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICB9CisgICAgICBjb25uZWN0aW9uID0gbnVsbDsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CkBAIC0xMDYsNjIgKzExNiw0OCBAQAogICAgIHJlcXVlc3RCdWZmZXJfLndyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwogICB9CiAgIAotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24geworICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICAvLyBFeHRyYWN0IHJlcXVlc3QgYW5kIHJlc2V0IGJ1ZmZlcgotICAgICAgICBieXRlW10gZGF0YSA9IHJlcXVlc3RCdWZmZXJfLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIHJlcXVlc3RCdWZmZXJfLnJlc2V0KCk7CisgICAgYnl0ZVtdIGRhdGEgPSByZXF1ZXN0QnVmZmVyXy50b0J5dGVBcnJheSgpOworICAgIHJlcXVlc3RCdWZmZXJfLnJlc2V0KCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uIG9iamVjdAotICAgICAgICAgICAgSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwQ29ubmVjdGlvbilDb25uZWN0b3Iub3Blbih1cmxfKTsKLSAgICAKLSAgICAgICAgICAgIC8vIFRpbWVvdXRzLCBvbmx5IGlmIGV4cGxpY2l0bHkgc2V0Ci0gICAgICAgICAgICBpZiAoY29ubmVjdFRpbWVvdXRfID4gMCkgewotICAgICAgICAgICAgLy8gIFhYWDogbm90IGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gIGNvbm5lY3Rpb24uc2V0Q29ubmVjdFRpbWVvdXQoY29ubmVjdFRpbWVvdXRfKTsKLSAgICAgICAgICAgIH0gICAKLSAgICAgICAgICAgIGlmIChyZWFkVGltZW91dF8gPiAwKSB7Ci0gICAgICAgICAgICAvLyAgWFhYOiBub3QgYXZhaWxhYmxlCi0gICAgICAgICAgICAvLyAgY29ubmVjdGlvbi5zZXRSZWFkVGltZW91dChyZWFkVGltZW91dF8pOwotICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdAotICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0Iik7Ci0gICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiVXNlci1BZ2VudCIsICJKYXZhTUUvVEh0dHBDbGllbnQiKTsKKyAgICB0cnkgeworICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24gb2JqZWN0CisgICAgICBjb25uZWN0aW9uID0gKEh0dHBDb25uZWN0aW9uKUNvbm5lY3Rvci5vcGVuKHVybF8pOworICAKKyAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3QKKyAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUE9TVCIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIlVzZXItQWdlbnQiLCAiSmF2YU1FL1RIdHRwQ2xpZW50Iik7CiAKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb25uZWN0aW9uIiwgIktlZXAtQWxpdmUiKTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJLZWVwLUFsaXZlIiwgIjUwMDAiKTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJIdHRwLXZlcnNpb24iLCAiSFRUUC8xLjEiKTsKLSAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDYWNoZS1Db250cm9sIiwgIm5vLXRyYW5zZm9ybSIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbm5lY3Rpb24iLCAiS2VlcC1BbGl2ZSIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIktlZXAtQWxpdmUiLCAiNTAwMCIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkh0dHAtdmVyc2lvbiIsICJIVFRQLzEuMSIpOworICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkNhY2hlLUNvbnRyb2wiLCAibm8tdHJhbnNmb3JtIik7CiAKLQotICAgICAgICAgICAgaWYgKGN1c3RvbUhlYWRlcnNfICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBjdXN0b21IZWFkZXJzXy5rZXlzKCkgOyBlLmhhc01vcmVFbGVtZW50cygpIDspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWN1c3RvbUhlYWRlcnNfLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOwotICAgICAgICAgICAgLy8gIGNvbm5lY3Rpb24uY29ubmVjdCgpOwotICAgIAotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gY29ubmVjdGlvbi5vcGVuT3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBvcy53cml0ZShkYXRhKTsKLSAgICAgICAgICAgIG9zLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIGludCByZXNwb25zZUNvZGUgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOwotICAgICAgICAgICAgaWYgKHJlc3BvbnNlQ29kZSAhPSBIdHRwQ29ubmVjdGlvbi5IVFRQX09LKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkhUVFAgUmVzcG9uc2UgY29kZTogIiArIHJlc3BvbnNlQ29kZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlcwotICAgICAgICAgICAgaW5wdXRTdHJlYW1fID0gY29ubmVjdGlvbi5vcGVuSW5wdXRTdHJlYW0oKTsKLQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpb3gudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3gpOworICAgICAgaWYgKGN1c3RvbUhlYWRlcnNfICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gY3VzdG9tSGVhZGVyc18ua2V5cygpIDsgZS5oYXNNb3JlRWxlbWVudHMoKSA7KSB7CisgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpY3VzdG9tSGVhZGVyc18uZ2V0KGtleSk7CisgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CiAgICAgICAgIH0KKyAgICAgIH0KKyAgCisgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBjb25uZWN0aW9uLm9wZW5PdXRwdXRTdHJlYW0oKTsKKyAgICAgIG9zLndyaXRlKGRhdGEpOworICAgICAgb3MuY2xvc2UoKTsKKworICAgICAgaW50IHJlc3BvbnNlQ29kZSA9IGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgICBpZiAocmVzcG9uc2VDb2RlICE9IEh0dHBDb25uZWN0aW9uLkhUVFBfT0spIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkhUVFAgUmVzcG9uc2UgY29kZTogIiArIHJlc3BvbnNlQ29kZSk7CisgICAgICB9CisKKyAgICAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlcworICAgICAgaW5wdXRTdHJlYW1fID0gY29ubmVjdGlvbi5vcGVuSW5wdXRTdHJlYW0oKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpb3gudG9TdHJpbmcoKSk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3gpOwogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmFtZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YSBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlMWFiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhbWUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCisvKioKKyAqIE1lbW9yeSBidWZmZXItYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICovCitwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQgeworICAvKioKKyAgICogQ3JlYXRlIGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgYnVmZmVyIHNpemUgb2YgPGk+c2l6ZTwvaT4uIFRoZQorICAgKiBpbnRlcm5hbCBidWZmZXIgd2lsbCBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICAgKiBiZWluZyB3cml0dGVuIHRvIGl0LgorICAgKi8KKyAgcHVibGljIFRNZW1vcnlCdWZmZXIoaW50IHNpemUpIHsKKyAgICBhcnJfID0gbmV3IFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc2l6ZSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBvcGVuKCkgeworICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIC8qIERvIG5vdGhpbmcgKi8KKyAgfQorCisgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgYnl0ZVtdIHNyYyA9IGFycl8uZ2V0KCk7CisgICAgaW50IGFtdFRvUmVhZCA9IChsZW4gPiBhcnJfLmxlbigpIC0gcG9zXyA/IGFycl8ubGVuKCkgLSBwb3NfIDogbGVuKTsKKyAgICBpZiAoYW10VG9SZWFkID4gMCkgeworICAgICAgU3lzdGVtLmFycmF5Y29weShzcmMsIHBvc18sIGJ1Ziwgb2ZmLCBhbXRUb1JlYWQpOworICAgICAgcG9zXyArPSBhbXRUb1JlYWQ7CisgICAgfQorICAgIHJldHVybiBhbXRUb1JlYWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgYXJyXy53cml0ZShidWYsIG9mZiwgbGVuKTsKKyAgfQorCisgIC8qKgorICAgKiBPdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICogZW5jb2RpbmcKKyAgICogCisgICAqIEBwYXJhbSBlbmMgdGhlIGVuY29kaW5nIHRvIHVzZQorICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBhIFN0cmluZworICAgKi8KKyAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgZW5jKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFycl8udG9TdHJpbmcoZW5jKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgaW5zcGVjdCgpIHsKKyAgICBTdHJpbmcgYnVmID0gIiI7CisgICAgYnl0ZVtdIGJ5dGVzID0gYXJyXy50b0J5dGVBcnJheSgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGJ1ZiArPSAocG9zXyA9PSBpID8gIj09PiIgOiAiIikgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2ldICYgMHhmZikgKyAiICI7CisgICAgfQorICAgIHJldHVybiBidWY7CisgIH0KKworICAvLyBUaGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlcgorICBwcml2YXRlIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyXzsKKworICAvLyBQb3NpdGlvbiB0byByZWFkIG5leHQgYnl0ZSBmcm9tCisgIHByaXZhdGUgaW50ICAgICAgICAgICAgICAgICAgICBwb3NfOworCisgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgeworICAgIHJldHVybiBhcnJfLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBieXRlW10gZ2V0QXJyYXkoKSB7CisgICAgcmV0dXJuIGFycl8uZ2V0KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9HcnVudGZpbGUuanMgYi9saWIvanMvR3J1bnRmaWxlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMmEwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvR3J1bnRmaWxlLmpzCkBAIC0wLDAgKzEsMjkzIEBACisvL1RvIGJ1aWxkIGRpc3QvdGhyaWZ0LmpzLCBkaXN0L3RocmlmdC5taW4uanMgYW5kIGRvYy8qCisvL3J1biBncnVudCBhdCB0aGUgY29tbWFuZCBsaW5lIGluIHRoaXMgZGlyZWN0b3J5LgorLy9QcmVyZXF1aXNpdGVzOgorLy8gTm9kZSBTZXR1cCAtICAgbm9kZWpzLm9yZworLy8gR3J1bnQgU2V0dXAgLSAgbnBtIGluc3RhbGwgIC8vcmVhZHMgdGhlIC4vcGFja2FnZS5qc29uIGFuZCBpbnN0YWxscyBwcm9qZWN0IGRlcGVuZGVuY2llcworLy8gUnVuIGdydW50IC0gICAgbnB4IGdydW50ICAvLyB1c2VzIHByb2plY3QtbG9jYWwgaW5zdGFsbGVkIHZlcnNpb24gb2YgZ3J1bnQgKGZyb20gcGFja2FnZS5qc29uKQorCittb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGdydW50KSB7CisgICd1c2Ugc3RyaWN0JzsKKworICBncnVudC5pbml0Q29uZmlnKHsKKyAgICBwa2c6IGdydW50LmZpbGUucmVhZEpTT04oJ3BhY2thZ2UuanNvbicpLAorICAgIGNvbmNhdDogeworICAgICAgb3B0aW9uczogeworICAgICAgICBzZXBhcmF0b3I6ICc7JworICAgICAgfSwKKyAgICAgIGRpc3Q6IHsKKyAgICAgICAgc3JjOiBbJ3NyYy8qKi8qLmpzJ10sCisgICAgICAgIGRlc3Q6ICdkaXN0LzwlPSBwa2cubmFtZSAlPi5qcycKKyAgICAgIH0KKyAgICB9LAorICAgIGpzZG9jIDogeworICAgICAgICBkaXN0IDogeworICAgICAgICAgICAgc3JjOiBbJ3NyYy8qLmpzJywgJy4vUkVBRE1FLm1kJ10sCisgICAgICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnZG9jJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB1Z2xpZnk6IHsKKyAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgYmFubmVyOiAnLyohIDwlPSBwa2cubmFtZSAlPiA8JT0gZ3J1bnQudGVtcGxhdGUudG9kYXkoImRkLW1tLXl5eXkiKSAlPiAqL1xuJworICAgICAgfSwKKyAgICAgIGRpc3Q6IHsKKyAgICAgICAgZmlsZXM6IHsKKyAgICAgICAgICAnZGlzdC88JT0gcGtnLm5hbWUgJT4ubWluLmpzJzogWyc8JT0gY29uY2F0LmRpc3QuZGVzdCAlPiddCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIHNoZWxsOiB7CisgICAgICBJbnN0YWxsVGhyaWZ0SlM6IHsKKyAgICAgICAgY29tbWFuZDogJ21rZGlyIC1wIHRlc3QvYnVpbGQvanMvbGliOyBjcCBzcmMvdGhyaWZ0LmpzIHRlc3QvYnVpbGQvanMvdGhyaWZ0LmpzJworICAgICAgfSwKKyAgICAgIEluc3RhbGxUaHJpZnROb2RlSlNEZXA6IHsKKyAgICAgICAgY29tbWFuZDogJ2NkIC4uLy4uOyBucG0gaW5zdGFsbCcKKyAgICAgIH0sCisgICAgICBJbnN0YWxsVGVzdExpYnM6IHsKKyAgICAgICAgY29tbWFuZDogJ2NkIHRlc3Q7IGFudCBkb3dubG9hZF9qc2xpYnMnCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuOiB7CisgICAgICAgIGNvbW1hbmQ6IFsKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtLW91dCB0ZXN0L2dlbi1qcyAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcy1qcXVlcnknLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC0tb3V0IHRlc3QvZ2VuLWpzLWpxdWVyeSAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tbm9kZWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOm5vZGUgLS1vdXQgdGVzdC9nZW4tbm9kZWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICdta2RpciAtcCB0ZXN0L2dlbi1qcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6ZXM2IC0tb3V0IHRlc3QvZ2VuLWpzLWVzNiAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tbm9kZWpzLWVzNicsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlLGVzNiAtLW91dCAuL3Rlc3QvZ2VuLW5vZGVqcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgIF0uam9pbignICYmICcpCisgICAgICB9LAorICAgICAgVGhyaWZ0R2VuSlE6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpqcXVlcnkgLWdlbiBqczpub2RlIC1vIHRlc3QgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcKKyAgICAgIH0sCisgICAgICBUaHJpZnRHZW5EZWVwQ29uc3RydWN0b3I6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdCcKKyAgICAgIH0sCisgICAgICBUaHJpZnRHZW5Eb3VibGVDb25zdGFudHM6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlcjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyAtLWVzNiIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlcl9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHBzLmpzIiwKKyAgICAgIH0sCisgICAgICBUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cHMuanMgLS1lczYiLAorICAgICAgfSwKKyAgICB9LAorICAgIHF1bml0OiB7CisgICAgICBUaHJpZnRKUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU0pROiB7CisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICB1cmxzOiBbCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU19Eb3VibGVSZW5kZXJpbmc6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRXUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0d3MuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU19UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3Qtbm9qcS5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0SlNKUV9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgICAgaWdub3JlSFRUUFNFcnJvcnM6IHRydWUsCisgICAgICAgICAgfSwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIFRocmlmdFdTX1RMUzogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwOTEvdGVzdHdzLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnREZWVwQ29uc3RydWN0b3I6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICB9LAorICAgICAgICB9CisgICAgICB9LAorICAgICAgVGhyaWZ0V1NFUzY6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC1lczYuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgIGpzaGludDogeworICAgICAgLy8gVGhlIG1haW4gdGhyaWZ0IGxpYnJhcnkgZmlsZS4gbm90IGVzNiB5ZXQgOigKKyAgICAgIGxpYjogeworICAgICAgICBzcmM6IFsnc3JjLyoqLyouanMnXSwKKyAgICAgIH0sCisgICAgICAvLyBUaGUgdGVzdCBmaWxlcyB1c2UgZXM2CisgICAgICB0ZXN0OiB7CisgICAgICAgIHNyYzogWydHcnVudGZpbGUuanMnLCAndGVzdC8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fanNfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tanMvKi5qcycsICd0ZXN0L2dlbi1qcy1qcXVlcnkvKi5qcyddLAorICAgICAgfSwKKyAgICAgIGdlbl9lczZfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGVzdmVyc2lvbjogNiwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLW5vZGVqcy8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBub2RlOiB0cnVlLAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX25vZGVfZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLW5vZGVqcy1lczYvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICB9KTsKKworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWNvbnRyaWItdWdsaWZ5Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1qc2hpbnQnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLXF1bml0Jyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1jb25jYXQnKTsKKyAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1qc2RvYycpOworICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LXNoZWxsLXNwYXduJyk7CisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCd3YWl0JywgJ1dhaXQganVzdCBvbmUgc2Vjb25kIGZvciBzZXJ2ZXIgdG8gc3RhcnQnLCBmdW5jdGlvbiAoKSB7CisgICAgdmFyIGRvbmUgPSB0aGlzLmFzeW5jKCk7CisgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKKyAgICAgIGRvbmUodHJ1ZSk7CisgICAgfSwgMTAwMCk7CisgIH0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygnaW5zdGFsbEFuZEdlbmVyYXRlJywgWworICAgICdzaGVsbDpJbnN0YWxsVGhyaWZ0SlMnLCAnc2hlbGw6SW5zdGFsbFRocmlmdE5vZGVKU0RlcCcsICdzaGVsbDpUaHJpZnRHZW4nLAorICAgICdzaGVsbDpUaHJpZnRHZW5EZWVwQ29uc3RydWN0b3InLCAnc2hlbGw6VGhyaWZ0R2VuRG91YmxlQ29uc3RhbnRzJywKKyAgICAnc2hlbGw6SW5zdGFsbFRlc3RMaWJzJywKKyAgXSk7CisKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCd0ZXN0JywgWworICAgICdpbnN0YWxsQW5kR2VuZXJhdGUnLAorICAgICdqc2hpbnQnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyJywgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJfVExTJywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUycsCisgICAgJ3dhaXQnLAorICAgICdxdW5pdDpUaHJpZnREZWVwQ29uc3RydWN0b3InLAorICAgICdxdW5pdDpUaHJpZnRKUycsICdxdW5pdDpUaHJpZnRKU19UTFMnLAorICAgICdxdW5pdDpUaHJpZnRKU19Eb3VibGVSZW5kZXJpbmcnLAorICAgICdxdW5pdDpUaHJpZnRXUycsCisgICAgJ3F1bml0OlRocmlmdEpTSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUV9UTFMnLAorICAgICdxdW5pdDpUaHJpZnRXU0VTNicsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXI6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUzpraWxsJywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNjpraWxsJywgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzZfVExTOmtpbGwnLAorICBdKTsKKyAgZ3J1bnQucmVnaXN0ZXJUYXNrKCdkZWZhdWx0JywgWyd0ZXN0JywgJ2NvbmNhdCcsICd1Z2xpZnknLCAnanNkb2MnXSk7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL2pzL01ha2VmaWxlLmFtIGIvbGliL2pzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYTIwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KKyMgV2UgY2FsbCBpbnN0YWxsIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKKyMKK2lmIEhBVkVfTlBNCitTVUJESVJTID0gdGVzdAorCitjaGVjay1sb2NhbDogYWxsCisJJChOUE0pIGluc3RhbGwgfHwgJChOUE0pIGluc3RhbGwKKwkkKE5QTSkgbGlzdAorCS4vbm9kZV9tb2R1bGVzLy5iaW4vZ3J1bnQKK2VuZGlmCmRpZmYgLS1naXQgYS9saWIvanMvUkVBRE1FIGIvbGliL2pzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmZGM0My4uMDAwMDAwMAotLS0gYS9saWIvanMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotVGhyaWZ0IEphdmFzY3JpcHQgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBKYXZhc2NyaXB0Ci09PT09PT09PT09PT09PT09PT09PT0KLQotQWxsb3dzIGphdmFzY3JpcHQgY2xpZW50IGludGVyZmFjZXMgdG8gVGhyaWZ0IHNlcnZpY2VzLgotVGhpcyBpcyBnZWFyZWQgZm9yIHVzZSBpbiBhIHdlYiBicm93c2VyLgotCi1UaGlzIGNsaWVudCBjYW4gb25seSBzcGVhayB0aGUgSlNPTiBQcm90b2NvbCBhbmQgdGhlIG9ubHkgc3VwcG9ydGVkCi10cmFuc3BvcnQgaXMgQUpBWC4KLQotVGhlcmUgaXMgYSB0ZXN0IGh0dHBkIHNlcnZpY2UgaW4gdGhlIHRlc3QgZGlyIHRoYXQgcmVxdWlyZXMKLWh0dHA6Ly9oYy5hcGFjaGUub3JnIHVuZGVyIHRlc3QgZGlyCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci1BIEphdmFTY3JpcHQgZW5hYmxlZCBicm93c2VyLiBUZXN0ZWQgd2l0aDoKLSAqSUUgNiw3LDgKLSAqRkYgMiwzCi0gKlNhZmFyaSAzICYgNApkaWZmIC0tZ2l0IGEvbGliL2pzL1JFQURNRS5tZCBiL2xpYi9qcy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MWUyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9SRUFETUUubWQKQEAgLTAsMCArMSwxNDAgQEAKK1RocmlmdCBKYXZhc2NyaXB0IExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoaXMgYnJvd3NlciBiYXNlZCBBcGFjaGUgVGhyaWZ0IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzCitSUEMgY2xpZW50cyB1c2luZyB0aGUgSlNPTiBwcm90b2NvbCBvdmVyIEh0dHBbc10gd2l0aCBYSFIKK2FuZCBXZWJTb2NrZXQuCisKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitHcnVudCBCdWlsZAorLS0tLS0tLS0tLS0tCitUaGlzIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdAorbGlicmFyeS4gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYSBHcnVudGZpbGUuanMgYW5kIGEKK3BhY2thZ2UuanNvbi4gTWFueSBvZiB0aGUgYnVpbGQgYW5kIHRlc3QgdG9vbHMgdXNlZCBoZXJlCityZXF1aXJlIGEgcmVjZW50IHZlcnNpb24gb2YgTm9kZS5qcyB0byBiZSBpbnN0YWxsZWQuIFRvIAoraW5zdGFsbCB0aGUgc3VwcG9ydCBmaWxlcyBmb3IgdGhlIEdydW50IGJ1aWxkIHRvb2wgZXhlY3V0ZQordGhlIGNvbW1hbmQ6CisKKyAgICBucG0gaW5zdGFsbAorICAgIAorVGhpcyByZWFkcyB0aGUgcGFja2FnZS5qc29uIGFuZCBwdWxscyBpbiB0aGUgYXBwcm9wcmlhdGUKK3NvdXJjZXMgZnJvbSB0aGUgaW50ZXJuZXQuIFRvIGJ1aWxkIHRoZSBKYXZhU2NyaXB0IGJyYW5jaAorb2YgQXBhY2hlIFRocmlmdCBleGVjdXRlIHRoZSBjb21tYW5kOgorCisgICAgbnB4IGdydW50CisgICAgCitUaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wgKGZyb20gd2l0aGluIGAuL25vZGVfbW9kdWxlcy8uYmluL2ApLAorbGludGluZyBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcywgc2V0dGluZyB1cCBhbmQgcnVubmluZyB0aGUKK3Rlc3RzLCBjb25jYXRlbmF0aW5nIGFuZCBtaW5pZnlpbmcgdGhlIG1haW4gbGlicmFyaWVzIGFuZAorZ2VuZXJhdGluZyB0aGUgaHRtbCBkb2N1bWVudGF0aW9uLgorCitUcmVlCistLS0tCitUaGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIGFyZSBwcmVzZW50IChzb21lIG9ubHkgYWZ0ZXIgdGhlCitncnVudCBidWlsZCk6CisgIC9zcmMgIC0gVGhlIEphdmFTY3JpcHQgQXBhY2hlIFRocmlmdCBzb3VyY2UKKyAgL2RvYyAgLSBIVE1MIGRvY3VtZW50YXRpb24KKyAgL2Rpc3QgLSBEaXN0cmlidXRpb24gZmlsZXMgKHRocmlmdC5qcyBhbmQgdGhyaWZ0Lm1pbi5qcykKKyAgL3Rlc3QgLSBWYXJpb3VzIHRlc3RzLCB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byBsb29rIGZvcgorICAgICAgICAgIGV4YW1wbGUgY29kZQorICAvbm9kZV9tb2R1bGVzIC0gQnVpbGQgc3VwcG9ydCBmaWxlcyBpbnN0YWxsZWQgYnkgbnBtCisKKworRXhhbXBsZSBKYXZhU2NyaXB0IENsaWVudCBhbmQgU2VydmVyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBsaXN0aW5nIGJlbG93IGRlbW9uc3RyYXRlcyBhIHNpbXBsZSBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQKK1RocmlmdCBjbGllbnQgYW5kIE5vZGUuanMgSmF2YVNjcmlwdCBzZXJ2ZXIgZm9yIHRoZSBoZWxsb19zdmMgCitzZXJ2aWNlLiAKKworIyMjIGhlbGxvLnRocmlmdCAtIFNlcnZpY2UgSURMIAorIyMjIGJ1aWxkIHdpdGg6ICQgdGhyaWZ0IC1nZW4ganMgLWdlbiBqczpub2RlIGhlbGxvLnRocmlmdAorICAgIHNlcnZpY2UgaGVsbG9fc3ZjIHsKKyAgICAgIHN0cmluZyBnZXRfbWVzc2FnZSgxOiBzdHJpbmcgbmFtZSkKKyAgICB9CisKKyMjIyBoZWxsby5odG1sIC0gQnJvd3NlciBDbGllbnQKKyAgICA8IURPQ1RZUEUgaHRtbD4KKyAgICA8aHRtbCBsYW5nPSJlbiI+CisgICAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgICAgICA8dGl0bGU+SGVsbG8gVGhyaWZ0PC90aXRsZT4KKyAgICAgIDwvaGVhZD4KKyAgICAgIDxib2R5PgorICAgICAgICBOYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Im5hbWVfaW4iPgorICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiBpZD0iZ2V0X21zZyIgdmFsdWU9IkdldCBNZXNzYWdlIiA+CisgICAgICAgIDxkaXYgaWQ9Im91dHB1dCI+PC9kaXY+CisgIAorICAgICAgICA8c2NyaXB0IHNyYz0idGhyaWZ0LmpzIj48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9oZWxsb19zdmMuanMiPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0PgorICAgICAgICAgIChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoIi9oZWxsbyIpOworICAgICAgICAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgdmFyIGNsaWVudCAgICA9IG5ldyBoZWxsb19zdmNDbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgdmFyIG5hbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hbWVfaW4iKTsKKyAgICAgICAgICAgIHZhciBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpOworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdldF9tc2ciKQorICAgICAgICAgICAgICAuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbigpeworICAgICAgICAgICAgICAgIGNsaWVudC5nZXRfbWVzc2FnZShuYW1lRWxlbWVudC52YWx1ZSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICBvdXRwdXRFbGVtZW50LmlubmVySFRNTCA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgfSkoKTsKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICA8L2JvZHk+CisgICAgPC9odG1sPgorCisjIyMgaGVsbG8uanMgLSBOb2RlIFNlcnZlcgorICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKKyAgICB2YXIgaGVsbG9fc3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2hlbGxvX3N2Yy5qcycpOworICAgIAorICAgIHZhciBoZWxsb19oYW5kbGVyID0geworICAgICAgZ2V0X21lc3NhZ2U6IGZ1bmN0aW9uKG5hbWUsIHJlc3VsdCkgeworICAgICAgICB2YXIgbXNnID0gIkhlbGxvICIgKyBuYW1lICsgIiEiOworICAgICAgICByZXN1bHQobnVsbCwgbXNnKTsKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmFyIGhlbGxvX3N2Y19vcHQgPSB7CisgICAgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgICAgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgICAgICBwcm9jZXNzb3I6IGhlbGxvX3N2YywKKyAgICAgIGhhbmRsZXI6IGhlbGxvX2hhbmRsZXIKKyAgICB9OworICAgIAorICAgIHZhciBzZXJ2ZXJfb3B0ID0geworICAgICAgc3RhdGljRmlsZVBhdGg6ICIuIiwKKyAgICAgIHNlcnZpY2VzOiB7CisgICAgICAgICIvaGVsbG8iOiBoZWxsb19zdmNfb3B0CisgICAgICB9CisgICAgfQorICAgIAorICAgIHZhciBzZXJ2ZXIgPSBUaHJpZnQuY3JlYXRlV2ViU2VydmVyKHNlcnZlcl9vcHQpOworICAgIHZhciBwb3J0ID0gOTA5OTsKKyAgICBzZXJ2ZXIubGlzdGVuKHBvcnQpOworICAgIGNvbnNvbGUubG9nKCJIdHRwL1RocmlmdCBTZXJ2ZXIgcnVubmluZyBvbiBwb3J0OiAiICsgcG9ydCk7CisKKworVHlwZVNjcmlwdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUeXBlU2NyaXB0IGRlZmluaXRpb24gZmlsZXMgY2FuIGFsc28gYmUgZ2VuZXJhdGVkIGJ5IHJ1bm5pbmc6CisKKyAgICB0aHJpZnQgLS1nZW4ganM6dHMgZmlsZS50aHJpZnQKKwpkaWZmIC0tZ2l0IGEvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvanMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL2NvZGluZ19zdGFuZGFyZHMubWQKQEAgLTAsMCArMSBAQAorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCmRpZmYgLS1naXQgYS9saWIvanMvcGFja2FnZS1sb2NrLmpzb24gYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkODFjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDM3NzcgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbm5lOS9JaVEvaHpJaFk2cGREbmJCdHo3RGpQVEtyWTAwUC96dlBTbTVwT0ZrbDZ4dUdyR25Ybi9WdFROTmZOdEFmWjkvMVJ0ZWhrc3pVOXFjVGlpMFE9PSIKKyAgICB9LAorICAgICJhZ2VudC1iYXNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FnZW50LWJhc2UvLS9hZ2VudC1iYXNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KVndYTXI5bkhZVFVYc0JGS1VxaEp3dmxjWVUvYmxyZU9FVWtoTlIyZVhaSXZ3ZCtjK281VjRNZ0RQS1duTVMvNTZhd04zVFJ6SVArS29Qbityb1F0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2lmeSI6ICJeNS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWp2IjogeworICAgICAgInZlcnNpb24iOiAiNS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi01LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWM3WHV5aityWlQ0OVA1UWlzMEd0UWlCZHlXVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY28iOiAiXjQuNi4wIiwKKyAgICAgICAgImZhc3QtZGVlcC1lcXVhbCI6ICJeMS4wLjAiLAorICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogIl4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbGlnbi10ZXh0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FsaWduLXRleHQvLS9hbGlnbi10ZXh0LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRE5rS1ZoQ1Q4MTBLbVNWc0lyY0dsRFA2MFJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIiwKKyAgICAgICAgImxvbmdlc3QiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYXJyLWRpZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWRpZmYvLS9hcnItZGlmZi00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFrWVFkUDYvN0hIbjRWSTFkaG95bWwzSHhTQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnItZmxhdHRlbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItZmxhdHRlbi8tL2Fyci1mbGF0dGVuLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MM2hLVjVSL3A1bzgxUjdPMDJJR253cERta3A2RTk4MlhodGJ1d1NlM080cU90TU1NdG9kaWNBU0ExQ255MlUrYUNYY05wbWwrbTRkUHN2c0ozamF0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci11bmlvbi8tL2Fyci11bmlvbi0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTQ1c0pycW5lK0dhbzhnYmlpSzlqa1p1dU9jUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1lYWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWVhY2gvLS9hcnJheS1lYWNoLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDVTdkRBV3JGMUtFYnVkVG9mSVJvRnVneEU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LWZpbmQtaW5kZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktZmluZC1pbmRleC8tL2FycmF5LWZpbmQtaW5kZXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zd0VLb1NoK0ZrdTlwdmx5T3dxV29leEJoNkU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktc2xpY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktc2xpY2UvLS9hcnJheS1zbGljZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQjFxTUQzUkJQN084bzBIMkticlhEeUIwSWNjZWpNRjE1Kzg3THZsb3IxMk9OUFJIUDZnVGpYTU5rdC9kM1p1T0diQWU2NmhGbWFDZkVDSTI0VWZwNnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXVuaXF1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxdWUvLS9hcnJheS11bmlxdWUtMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSlMzWFV2RTlzMW5udk1rU3AvWTlHcmkxQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNuMSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc24xLy0vYXNuMS0wLjIuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanh3elFwTFFqU21XWGd3YUNaRTlOeitnbEFHMDF5RjFRbldnYmhHd0hJNUE2RlJJRVk2SVZxdEhoSWVwSHFJNy9reUV5UUVhZ0JDNW1CRUZsSVl2ZGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAifjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydC1wbHVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2VydC1wbHVzLy0vYXNzZXJ0LXBsdXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04UzRQUEYxM3NMSE4yUlJwUXVUcGJCNU4xU1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNzaWduLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzaWduLXN5bWJvbHMvLS9hc3NpZ24tc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdXWi9RZnJkVHlETXZDdTVhNDFQZjNqc0EyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5ja2l0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5ja2l0Ly0vYXN5bmNraXQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14NTdaZjM4MHk0OHJvYnlYa0x6RFprZExTM2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImF0b2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXRvYi8tL2F0b2ItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdtNnVrb2FPR0ppLzczcC9jbDJHdkxqVEk1Sk0xay9PMTRpc0Q3M1lNTDhTdHJILzcvbFJGZ21nOG5JQ1pnRDNiWlp2andDR3h0TU9EM3dXTkF1OGNnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3Mtc2lnbjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzLXNpZ24yLy0vYXdzLXNpZ24yLTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdEc2SkNUU3BXUjh0TDIrRzErYXA4YlArZHFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhd3M0IjogeworICAgICAgInZlcnNpb24iOiAiMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3czQvLS9hd3M0LTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZVp4dk5ISU92ODhGbFQ3cnhjWElJQzBmUHQ0S1pxWmJPbGl2eVd0WEx0OEVTeDg0emQza01DNmlLNWpWZVMycXQrZzdmdFM3eWU0ZmkwNlg1cnRSUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IgorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZS8tL2Jhc2UtMC4xMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01VDZQNHhQZ3BwMFlERnZTV3dFWjROb0UzYU00UUJRWER6bVZicmFDa0ZqOHpITSttYmE4U3lxQjVEYlpXeVI3bVlIbzZZN0JkUW8zTW9BNG0wVGVRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FjaGUtYmFzZSI6ICJeMS4wLjEiLAorICAgICAgICAiY2xhc3MtdXRpbHMiOiAiXjAuMy41IiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJtaXhpbi1kZWVwIjogIl4xLjIuMCIsCisgICAgICAgICJwYXNjYWxjYXNlIjogIl4wLjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYmNyeXB0LXBia2RmIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JjcnlwdC1wYmtkZi8tL2JjcnlwdC1wYmtkZi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBEQWRPSnRxUS9tMmYvUEtFYVAyWTM0MkRwND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidHdlZXRuYWNsIjogIl4wLjE0LjMiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIKKyAgICB9LAorICAgICJicmFjZS1leHBhbnNpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi0xLjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlDdVBIREZnckhYN0gydkVJLzV4cHowN3pTSEIwMFRwdWdxaG1ZdFZtTU82NTE4bUN1Uk1vT1lGbGRFQmwwZzE4N3Vmb3pkYUhnV0tjWUZiNjFxR2lBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWxhbmNlZC1tYXRjaCI6ICJeMS4wLjAiLAorICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJicmFjZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2VzLy0vYnJhY2VzLTIuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hTmRibmo5UDhQamRYVTR5YmFXTEsySUYzamMvRW9EWWJDN0Fhelc2dG8zVFJzZlh4c2NDOVVYT0I1aURpRVFya3lJYldwMlNMUWRhNCtRQWE3bmMzdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWZsYXR0ZW4iOiAiXjEuMS4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZpbGwtcmFuZ2UiOiAiXjQuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJyZXBlYXQtZWxlbWVudCI6ICJeMS4xLjIiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAic25hcGRyYWdvbi1ub2RlIjogIl4yLjAuMSIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4yIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXpsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS16bGliLy0vYnJvd3NlcmlmeS16bGliLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdXpYNHBSbjJBT0Q2YTRTRkpCeVhuUUZCK3kwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBha28iOiAifjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1mcm9tLy0vYnVmZmVyLWZyb20tMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1RY1hFVWJDS3RFbzdiaHFFczY1NjBIeWQ0WGFvdlpsTy9rOVYzaGpWVUYvendXN0tCVmRTSzRnSXQvYnp3UzlNYlI1cW9iK0Y1anVzWnNiMFlRSzJBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItc2hpbXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLXNoaW1zLy0vYnVmZmVyLXNoaW1zLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbVhqT01YT0l4a210aDVNQ2pEUjM3d1JLaTFFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1aWx0aW4tbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWlsdGluLW1vZHVsZXMvLS9idWlsdGluLW1vZHVsZXMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KdzhIYkZweXdDOWJaYVI5K1V4ZjQ2SjRpUzg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FjaGUtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWNoZS1iYXNlLy0vY2FjaGUtYmFzZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUtjZFRuRlNXQVRkNS9HQ1BSeHIyQ2h3SUo4NUNleXJFeWpSSGxLeFE1NmQ0WEpNR3ltMHVBaUtuMHhiTE9HT2wzK3lScE9UaTQ4NGRWQ0VjNUFVelE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbGxlY3Rpb24tdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMi4wLjAiLAorICAgICAgICAidG8tb2JqZWN0LXBhdGgiOiAiXjAuMy4wIiwKKyAgICAgICAgInVuaW9uLXZhbHVlIjogIl4xLjAuMCIsCisgICAgICAgICJ1bnNldC12YWx1ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FtZWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZCMFcxbm1odStXY29DeXM3UHNCSGlBZldoOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYW1lbGNhc2Uta2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS1rZXlzLy0vY2FtZWxjYXNlLWtleXMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NSXZ1ci8zeWdSa0ZIdm9ka3lJVHlSdVBrdWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4yLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYXNlbGVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FzZWxlc3MvLS9jYXNlbGVzcy0wLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMmdjSWYrRUF6eUNaVU1KQm9sQ0RSaHhVZHc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2VudGVyLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NlbnRlci1hbGlnbi8tL2NlbnRlci1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFnMHlZcHR1NlhJZ0JCSEwxRVlja0h2Q3Q2MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMyIsCisgICAgICAgICJsYXp5LWNhY2hlIjogIl4xLjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xhc3MtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xhc3MtdXRpbHMvLS9jbGFzcy11dGlscy0wLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcU9oUGEvRmo3czZUWThIOGVzR3U1UU5wTU1ReHo3OWgrdXJ6ck5ZTjZtbis5Qm54bERHZjVRWitYZUNEc3hTalBxc1NSNTZYT1pPSm1wZXVybkxNZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci11bmlvbiI6ICJeMy4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RhdGljLWV4dGVuZCI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS8tL2NsaS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlvRjFOUEpMK2tsUXcwMVRMVWpzdkdJYmpCUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleGl0IjogIjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjcuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12Y2Z1aUl4b2dMVjREbEdCSElVT3dJMElicko4SFdQYzRNVTdIenZpR2VOaG8vVUpEZmk2QjVwM3NIZVdJUTBLR0lVMEpweGk1Wkh4ZW1RZkxra0F3UT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJjbGl1aSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGl1aS8tL2NsaXVpLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzBkWFlQK0FKa3gyTERvWEdRTXVrY2Yrb05FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNlbnRlci1hbGlnbiI6ICJeMC4xLjEiLAorICAgICAgICAicmlnaHQtYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIjAuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImNvIjogeworICAgICAgInZlcnNpb24iOiAiNC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvLy0vY28tNC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1icWE5ODloVHJsVE11T1I3K2d2eitRTWZzWVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNvZmZlZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29mZmVlc2NyaXB0Ly0vY29mZmVlc2NyaXB0LTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTU2cURBWkYrOWlHelhZbzU4MGpjM1IyMzR6ND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xsZWN0aW9uLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbGxlY3Rpb24tdmlzaXQvLS9jb2xsZWN0aW9uLXZpc2l0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzhBM1BCWkx3eWtiVFRhTWdwenhxQXBaM0tBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1hcC12aXNpdCI6ICJeMS4wLjAiLAorICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9ycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvcnMvLS9jb2xvcnMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Gb3BIQVhWcmFuOVJvU3pneVh2NktNQ0U3V009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tYmluZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbWJpbmVkLXN0cmVhbS8tL2NvbWJpbmVkLXN0cmVhbS0xLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYnJXbDl5NnZPQjF4WVBaY3BaZGUzTjl6REJ5WFRvc0FlTURvNHAxd3pvNlVNT1g0dnVtQitUUDFSWjc2c2ZFNk1kNjhRME5KU3JFL2diZXpkNFVsK3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGF5ZWQtc3RyZWFtIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb21wb25lbnQtZW1pdHRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21wb25lbnQtZW1pdHRlci8tL2NvbXBvbmVudC1lbWl0dGVyLTEuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRTNrWTF0ZUNnL2ZmZW10OFdtUGhRT2FVSmVZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtc3RyZWFtLy0vY29uY2F0LXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMjdIQmdoSnhqaVp0SWszWWN2bi80a2JKay8xdVp1SkZmdVBFbnM2TGFFdnB2RzFmMGhUZWE4bGlscm91eW85bVZjMkdXZGNFWjhPTG9HbVNBRGxyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1mcm9tIjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjMiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjIuMiIsCisgICAgICAgICJ0eXBlZGFycmF5IjogIl4wLjAuNiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnNvbGUtYnJvd3NlcmlmeS8tL2NvbnNvbGUtYnJvd3NlcmlmeS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThDUWNSWE1LbjhZeU95QnR2emp0eDBIUXV4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkYXRlLW5vdyI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiY29weS1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcHktZGVzY3JpcHRvci8tL2NvcHktZGVzY3JpcHRvci0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVoyOXVzOE9abDhMdUdzT3BKUDFoSkhTUFY0MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jdXJyZW50bHktdW5oYW5kbGVkLy0vY3VycmVudGx5LXVuaGFuZGxlZC0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1JM3pQK3F4a2U5NW1tRTJuZGRzRjYzNVYrbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1maW5kLWluZGV4IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjeWNsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jeWNsZS8tL2N5Y2xlLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSWVnTEsraFlENWkwYVBONVF3WmlzRWJEU3RJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJkYXNoZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGFzaGRhc2gvLS9kYXNoZGFzaC0xLjE0LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oVHo2RDN5K0wrMWQ0Z01tdU4xWUVEWDI0dkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkYXRlLW5vdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlLW5vdy8tL2RhdGUtbm93LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnZRNS9VMUlTSzEwNWN4OXZ2SUFaeXVlTkZzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRhdGVmb3JtYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RhdGVmb3JtYXQvLS9kYXRlZm9ybWF0LTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW54SkxaMWxNazMvM0JwTXVTbVFzeW8yNy91az0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlYnVnIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMi42LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJDN0VscmRKYUpuUGJBUCsxRW90WXZxWnNiM2VjbDV3aTZCZmk2QkpUVWNOb3dwNmN2c3BnMGpYem5SVEtEam0vRTdBZGdGQlZlQVBWTU5jS0dzSE1BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtcyI6ICIyLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWNhbWVsaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY2FtZWxpemUvLS9kZWNhbWVsaXplLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWxOTkZSU0NhYklEVXVlKzRtOVFINW9aRXBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlY29kZS11cmktY29tcG9uZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY29kZS11cmktY29tcG9uZW50Ly0vZGVjb2RlLXVyaS1jb21wb25lbnQtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02emtUTXpSWWQxeTRUTkdoK3VCaUVHdTRkVVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItandLMlVWNGNuUHBiY0c3K1ZSQVJLVFpQVVdvd3dYQThiekg1TlA2dWQwb2VBeHlZUHVHWlVBQzdoTXVncENkejRCZVNabDJEbDlrNjZDSEovNDZaWVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4yIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImRlbGF5ZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGF5ZWQtc3RyZWFtLy0vZGVsYXllZC1zdHJlYW0tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zenJobWF5dCszMUVDcXJnc3A0aWNySk94aGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0LWZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0LWZpbGUvLS9kZXRlY3QtZmlsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThOWnRBMmNxZ2x5eHR6dmJQK1lqRU1qbFVyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb20tc2VyaWFsaXplciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb20tc2VyaWFsaXplci8tL2RvbS1zZXJpYWxpemVyLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQnp4cGRVYk9CNERPSTc1S0tPS1Q1QXZERElJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIn4xLjEuMSIsCisgICAgICAgICJlbnRpdGllcyI6ICJ+MS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12U2gzUGlaQ2lCcnNVVlJKSkNtY1hOZ2lHRnM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZW50aXRpZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWJsd3RDbFlodGRyYTdPK0F1UTdmdGMxM2N2QT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21lbGVtZW50dHlwZS8tL2RvbWVsZW1lbnR0eXBlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc1hydGd1aXJXZVV0MmNHYkYxYmcvQmh5Qk1JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvbWhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9taGFuZGxlci8tL2RvbWhhbmRsZXItMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MZVdhQ0NMVkFuK3IvMjhETENzbG9xaXI1emc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkb211dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb211dGlscy8tL2RvbXV0aWxzLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM05oSWlpYjFZOVlRZWVTTW4zdCtNamMyZ3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbS1zZXJpYWxpemVyIjogIjAiLAorICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVudGl0aWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VudGl0aWVzLy0vZW50aXRpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcGg2bzRJVFIvemVaQ3NrL2Z5ZVQ3Y1N2eVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXJyb3ItZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXJyb3ItZXgvLS9lcnJvci1leC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN2RGSE5tcWVGU0V0MlpCc0NyaW9yS25uM1oycGorZmQ5a21JNlFvV3c0Ly9ETCtpY0VCZmMwVTdxSkNpc3FyVHNLVGp3NGZORnkycFc5T3FTdEQ4NGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFycmF5aXNoIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlczYtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzZS8tL2VzNi1wcm9taXNlLTQuMi41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uNnd2cGRFNDNWRnRKcStsVURZREJGVXdWOFRaYnVHWExWNEQ2d0thZmcxM2xkem5Lc3lFdmF0dWJubVVlMzF6Y3ZlbFN6T0hGK1hiYVQrQmw5T2JEZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXM2LXByb21pc2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VzNi1wcm9taXNpZnkvLS9lczYtcHJvbWlzaWZ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVVFuV0x6NVc2cFo4UzJOUVd1OElLUnlLVWdNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIKKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2ZW50ZW1pdHRlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMTQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItMC40LjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtajJHM1hONEJLeTZlc29UVVZGV0R0V1E3WWFzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhpdC8tL2V4aXQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CakpqajQySGZNZ2hCOU1LRC84YUY4dWh6UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXhwYW5kLWJyYWNrZXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC1icmFja2V0cy8tL2V4cGFuZC1icmFja2V0cy0yLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXQzYzE0eFhPTVBhMjcvRDRPd1FWR2lKRWxpST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMi4zLjMiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiAiXjAuMS4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXhwYW5kLXRpbGRlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC10aWxkZS8tL2V4cGFuZC10aWxkZS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwrZ0JxZ1V0OENSVTNrYXdLL1loWkN6Y2hRST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJleHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLy0vZXh0ZW5kLTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1manF1QzU5Y0Q3Q3lXNnVyTlhLMEZCdWZrWmNvaUdHODB3VHVQdWpYNTkwY0I1VHRsbjIwRTJVQjRTL1dBUlZxaFhmZlpsMkxOZ1MrZ1FkUElJaW0vZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpxY2Fyd2M3T2ZzaEp4Y25SaE1jSndRQ2piZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NpZ24tc3ltYm9scyI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0Z2xvYi8tL2V4dGdsb2ItMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5tYjZRWGtFTHN1QnIyNENKU2tpbG82VUhIZ2Jla0s1VWlaZ2ZFNlVIRDNFYjI3WUM2b0QrYmhjVCt0SjZjbDhkbXNnZFF4bldsY3J5OGtzQklCTHB3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiZXhwYW5kLWJyYWNrZXRzIjogIl4yLjEuNCIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dHJhY3QtemlwIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dHJhY3QtemlwLy0vZXh0cmFjdC16aXAtMS42LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xRUMwdUs5a0F5Wk1qYlYvVHhwME16NzRIK2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICIxLjYuMiIsCisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJta2RpcnAiOiAiMC41LjEiLAorICAgICAgICAieWF1emwiOiAiMi40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0c3ByaW50ZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRzcHJpbnRmLy0vZXh0c3ByaW50Zi0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxwR0VRT01FR25wQlQ0eFM0OFYwNnp3K0hnVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleWVzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V5ZXMvLS9leWVzLTAuMS44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXM4U0FqVEdnM2hka0NOSXFBRHZQZ3pDQzhBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd0ZOSGVCZklhMUhhcUZQSUhnV2JjejBDTmhRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmZC1zbGljZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmQtc2xpY2VyLy0vZmQtc2xpY2VyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaTF2TDJld3lmRkJCdjVxd0kvMW5VUEVYZm1VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBlbmQiOiAifjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpZ3VyZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlndXJlcy8tL2ZpZ3VyZXMtMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS15K0hqci96eHpVUzRESzMrMG8zSGs2bHdIUzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpbGwtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlsbC1yYW5nZS8tL2ZpbGwtcmFuZ2UtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xVVNCSFVLUG1Pc0dwajNFQXRKQVBES01PUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiLAorICAgICAgICAidG8tcmVnZXgtcmFuZ2UiOiAiXjIuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmQtdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZC11cC8tL2ZpbmQtdXAtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1heTZZSXJHaXpncGdxMlRXRU96SzFUeXlUUTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1leGlzdHMiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kdXAtc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTjVNS3BkZ1d0M2ZBTkVYaGxtekdlUXBNQ3hZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAifjUuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZmluZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZWQvLS9maW5lZC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMzM0lSTGRxTDE1d2dlaUU5OEN1TkU4Vk5IWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHBhbmQtdGlsZGUiOiAiXjIuMC4yIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAib2JqZWN0LmRlZmF1bHRzIjogIl4xLjEuMCIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4yLjAiLAorICAgICAgICAicGFyc2UtZmlsZXBhdGgiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZsYWdnZWQtcmVzcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGFnZ2VkLXJlc3Bhd24vLS9mbGFnZ2VkLXJlc3Bhd24tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Ubm11bXk2emkvaHJPN1ZyOCtDbGFxWDhxOWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLWluIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1pbi8tL2Zvci1pbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdRYU5LVnFCUXV3S3h5Ykc0aUFNTVB0dFhvQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmb3Itb3duIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1vd24vLS9mb3Itb3duLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGpNeTlCWE8zRXNFMi81d3o0TmtsTVU4dEVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yZXZlci1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JldmVyLWFnZW50Ly0vZm9yZXZlci1hZ2VudC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSs4Y2ZERUd0NnpmNWJGZDYwZTFDMlAyc3lwRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZm9ybS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvcm0tZGF0YS8tL2Zvcm0tZGF0YS0yLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMWxMS0IyTXUzYUdQMVEvMmVDT3gwZk5iUk1lN1hkd2t0d09ydWhmcXFkMHJJSld3TjREaCtFM2hyUFNsRENYblNSN1V0WjFOMzhyVlhtKzYrTUVoSlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luY2tpdCI6ICJeMC40LjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIl4xLjAuNiIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIl4yLjEuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZnJhZ21lbnQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnJhZ21lbnQtY2FjaGUvLS9mcmFnbWVudC1jYWNoZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFwRDYwbjhUNkp2bjh6ZVp4cnhhQ3IvL0RSaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWV4dHJhIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWV4dHJhLy0vZnMtZXh0cmEtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16VHpsOStmTFlVV0lQOHJqR1I2WWQvaFllVkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJqc29uZmlsZSI6ICJeMi4xLjAiLAorICAgICAgICAia2xhdyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtsYXciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0xLjMuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RSWhETzBhenNib2xuWGg0WFk2Vzl6dWdKRGs9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtc3RkaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXN0ZGluLy0vZ2V0LXN0ZGluLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdVdqR3NLQkRoREpKQXVpL0dsM3pKWG1rVVA0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtdmFsdWUvLS9nZXQtdmFsdWUtMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zQlhLSEdjamg4cDJ2VGVzQ2psYm9nUXFMQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0b2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldG9iamVjdC8tL2dldG9iamVjdC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJIcEVsNG42RmcwQmoxU0c3WkV5QzI3SGlGdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRwYXNzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldHBhc3MvLS9nZXRwYXNzLTAuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWHYrT1BtaE5WcHJreXlzU2dtQk9pNlloU2ZvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlSdXZyMG5sSmJqTmt5WU5GS3NUWVZLejlYbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuMiIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWwtbW9kdWxlcy8tL2dsb2JhbC1tb2R1bGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zS3pwRWtmMTFHcE9GdXcwWnpqem10NEI0VVp3ak9jRzc1N1BQdnJmaHhjTEZicTB3cHNncE9xeHB4dHhGaUNHNER0RzkzTTZYUlZiRjJvR2RldjdiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmFsLXByZWZpeCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiLAorICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbC1wcmVmaXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLXByZWZpeC8tL2dsb2JhbC1wcmVmaXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yL2REeHNGSmtsazhaVlZveTJidE1zQVNMcjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIsCisgICAgICAgICJpbmkiOiAiXjEuMy40IiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuMTQiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRG92ZjVOSGR1SVZOWk9CT3A4QU9LZ0p1VmxnPSIKKyAgICB9LAorICAgICJncnVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC8tL2dydW50LTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vSnptWk5QZktvcmxDcnJteFdxUU80SlZvZE8rRFZkNVhYNERrb2NMLzFXbExsS1ZMRTkrU2RFSWVtcE9BeERoV1B5c0xsZTZhZnZuL2hnN0NrMms5Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29mZmVlc2NyaXB0IjogIn4xLjEwLjAiLAorICAgICAgICAiZGF0ZWZvcm1hdCI6ICJ+MS4wLjEyIiwKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAifjAuNC4xMyIsCisgICAgICAgICJleGl0IjogIn4wLjEuMSIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4wLjAiLAorICAgICAgICAiZ3J1bnQtY2xpIjogIn4xLjIuMCIsCisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nIjogIn4yLjAuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktdXRpbCI6ICJ+MS4xLjEiLAorICAgICAgICAiaWNvbnYtbGl0ZSI6ICJ+MC40LjEzIiwKKyAgICAgICAgImpzLXlhbWwiOiAifjMuNS4yIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIn4xLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAifjIuNi4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJncnVudC1jbGkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmlzUm5yc0duZHRHU3M0b1JWQWI2WHMxdHFnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZpbmR1cC1zeW5jIjogIn4wLjMuMCIsCisgICAgICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAgICAgIm5vcHQiOiAifjMuMC42IiwKKyAgICAgICAgICAgICJyZXNvbHZlIjogIn4xLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJub3B0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVV3QlJ1L1FwQWpEYzUzRFJMRWt5aWxGZEwwemVucHh1K2ZkZFRJbHNGL0tKcWROY0hhUW12eXUxVzNjRGVzWjlycXFaZEtLNUE4K1FESXlMVUVXb1pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJpbnRlcnByZXQiOiAifjEuMS4wIiwKKyAgICAgICAgImxpZnRvZmYiOiAifjIuNS4wIiwKKyAgICAgICAgIm5vcHQiOiAifjQuMC4xIiwKKyAgICAgICAgInY4ZmxhZ3MiOiAifjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItY29uY2F0Ly0vZ3J1bnQtY29udHJpYi1jb25jYXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZVkNZWXdoT2h4MStodDVJd0JVbG50bDNSYjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWpzaGludC8tL2dydW50LWNvbnRyaWItanNoaW50LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnAyUW15V1R4QTZMNTVsQXNoTkFoUXg1T2F3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjEuMSIsCisgICAgICAgICJob29rZXIiOiAiXjAuMi4zIiwKKyAgICAgICAgImpzaGludCI6ICJ+Mi45LjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXF1bml0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItcXVuaXQvLS9ncnVudC1jb250cmliLXF1bml0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zOTk0K2lwS3djK29VVUlXYUdJdzFzb3lJRDRwRXhTR01kL2NIUU41aDBwOEtiSWpSMUxlM1pDM2dpU0RES1h0WkZFMGkrT2JmMHVJak52amZ0WDJDdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJeNS4wLjEiLAorICAgICAgICAicC1lYWNoLXNlcmllcyI6ICJeMS4wLjAiLAorICAgICAgICAicHVwcGV0ZWVyIjogIjEuNy4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItNS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVplZ2xkWDdhMWZvbEM5djErcXRZNkNjbEZJPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi11Z2xpZnkvLS9ncnVudC1jb250cmliLXVnbGlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJtZWtiNUZUN2RUTEVZRTZWZXRweHcxOXN2cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjAuMSIsCisgICAgICAgICJtYXhtaW4iOiAiXjEuMS4wIiwKKyAgICAgICAgInVnbGlmeS1qcyI6ICJ+Mi42LjIiLAorICAgICAgICAidXJpLXBhdGgiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtanNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtanNkb2MvLS9ncnVudC1qc2RvYy0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0M2NlRDUlhlUU1qM0hJeXFWU0JKbTh6ZFV6NDNlNXZhRy9QTE8vNjI3QTFlZGJKbnp4aEpWN25GMEtxTHdNTTBSRE51MWlzdEM2ZnZmbllxRktpM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNyb3NzLXNwYXduIjogIl42LjAuNSIsCisgICAgICAgICJqc2RvYyI6ICJ+My41LjUiLAorICAgICAgICAibWFya2VkIjogIl4wLjUuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWFya2VkIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuNS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItaVVrQlplZ0Nab3U0QWR3YktUd1NXL2xORGN6NU91UlNsM3FkY2wzMUlhMEIyUVBHMEpuK3RLYmxoLzkvZVA5LzYrNGgyN3Zwb2g4d2VsL3ZRT1Ywdnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWtub3duLW9wdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQta25vd24tb3B0aW9ucy8tL2dydW50LWtub3duLW9wdGlvbnMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNId3NMcW9pZ2hwdTdUdVlqNVJvbm5FdXhHVkZuenRjVXFUcXA1clhGR1lMNE91UEZvZndDNFljZzduOWZZd3ZLNkY1V2JZZ2VWT3dwaDlDcnMyZnNRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2cvLS9ncnVudC1sZWdhY3ktbG9nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbTMrNVF2RFlmUjFsdHI4aGppYWlOamRkeEdkUVdjSDBydzFpS0tpUW5GMCt4dGdUYXppclNUR3U2OFJjaFB5aDFPQm5nMWJCVWpMbVg4cTlOcG9Ddz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3JzIjogIn4xLjEuMiIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogIn4yLjAuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy41IgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS1sb2ctdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtbGVnYWN5LWxvZy11dGlscy8tL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW83dUh5Ty9KK2kydFhHOHIyYlpObFZrMjB2bElGSjlJRVl5SE1DUUdmV1lydThKdjN3VHFLWnp2VjMwWVc5cldFanEwZVAzY2ZsUTFxV29qSWU5VkZBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJ+Mi40LjEiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS11dGlsLy0vZ3J1bnQtbGVnYWN5LXV0aWwtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTl6eUEyOXcvZkJlNkJJZmpHRU5uZHdvZTFVeTMxQklYeFRIM3M4bWdhMFo1QnoyU3A0VUNqa2V5djJ0STQ0OXlta3gzeDI2Qis0NkZWNGZYRWRkbDVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS41LjIiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0b2JqZWN0IjogIn4wLjEuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJ1bmRlcnNjb3JlLnN0cmluZyI6ICJ+My4zLjQiLAorICAgICAgICAid2hpY2giOiAifjEuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LXNoZWxsLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1zaGVsbC1zcGF3bi8tL2dydW50LXNoZWxsLXNwYXduLTAuMy4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdidU5SWDdFZlRHQ3FIMWpDTytFWGQrNVNJOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudCI6ICI+PTAuNC54IiwKKyAgICAgICAgInN5bmMtZXhlYyI6ICJ+MC42LjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3ppcC1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2d6aXAtc2l6ZS8tL2d6aXAtc2l6ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpzK0xFQkJISW51VnVzNXVvZG9NRjM3VndpOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LXpsaWIiOiAiXjAuMS40IiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhci1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXNjaGVtYS8tL2hhci1zY2hlbWEtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xVXdpSk92S3dFZUNvTmtEVlNIeVJ6VzM3Skk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImhhci12YWxpZGF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXZhbGlkYXRvci8tL2hhci12YWxpZGF0b3ItNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLStxbm1Oakk0T2ZIMmlwUTlWUU93MjNiQmQvaWJ0ZmJWZEsyZlliWTRhY1REcUtUVy9ZRHA5TWNpbVpkRGJHOGlWOWZaaXpVcVFNRDV4dnJpQjE0NlRBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl41LjMuMCIsCisgICAgICAgICJoYXItc2NoZW1hIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtYW5zaS8tL2hhcy1hbnNpLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlBVRW5PSHMzeXNHU2E4KzhrNUY3VFZCYlpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZS8tL2hhcy12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUdMS0IybGhiSEZ4UjN2Sk1rdzdTbWd2bXNYYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtdmFsdWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZXMvLS9oYXMtdmFsdWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbGJDMlArd2hSbUdhYitWLzUxWW8xYU9lL2s4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAia2luZC1vZiI6ICJeNC4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi00LjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JSUU5ODljU2tvc2djM2hwR2tVR2I2NXkzVmM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoYS8tL2hhc2hhLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZU5mTC9CNXRaakEvNTVnM05sbUVVWHN2YnVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1zdHJlYW0iOiAiXjEuMC4xIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJob21lZGlyLXBvbHlmaWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvbWVkaXItcG9seWZpbGwvLS9ob21lZGlyLXBvbHlmaWxsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVEN1OGluV0ptUDdyOWUxb1dBOTIxR2RvdEx3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhcnNlLXBhc3N3ZCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9va2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvb2tlci8tL2hvb2tlci0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVEVDNJOHhLSkNxbVdXTkZuZmJaaE1YVDJWaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJob3N0ZWQtZ2l0LWluZm8iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9zdGVkLWdpdC1pbmZvLy0vaG9zdGVkLWdpdC1pbmZvLTIuNy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03VC9CeEgxOXpiY0NUYThYa01sYks1bFRvMVd0Z2tGaTNHdmRXRXlOdWM0VmV4Ny85RHFibnBzZjRKTXlkY2ZqOUhDZzR6VVdGVEwzWmE2bGFwZzUvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaHRtbHBhcnNlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbHBhcnNlcjIvLS9odG1scGFyc2VyMi0zLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Xd29zWkZSYW92b1pRR24xNWRYNWNjTUVHZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIiwKKyAgICAgICAgImRvbWhhbmRsZXIiOiAiMi4zIiwKKyAgICAgICAgImRvbXV0aWxzIjogIjEuNSIsCisgICAgICAgICJlbnRpdGllcyI6ICIxLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwLXNpZ25hdHVyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwLXNpZ25hdHVyZS8tL2h0dHAtc2lnbmF0dXJlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXV6WkpSRkhjdlBaVzJXbUNydVBmQmo3ck9FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAianNwcmltIjogIl4xLjIuMiIsCisgICAgICAgICJzc2hwayI6ICJeMS43LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cHMtcHJveHktYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cHMtcHJveHktYWdlbnQvLS9odHRwcy1wcm94eS1hZ2VudC0yLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFBDVFMxTFc1MWJjeU1ZYnhVSU9PNEhFT2xRMS8xcVJhRldjeXh2d2FxVVM5VFk4OGFvRXVIVVkzM2t1QWgxWWhWVmFEUWhMWnNuUGQrWE5BUldabFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFnZW50LWJhc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTMuMi42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWVsK2pmN25ydEVsNVBuMVF4NDZ6QVJYS0RwQmJ2emV6c2U3cDdMcUlObWRvSWs4UFlQNVN5U2F4RW1ZdjZUWjBKeUVLQTFoc0NJZDZESWhnSVR0V1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmRlbnQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZGVudC1zdHJpbmcvLS9pbmRlbnQtc3RyaW5nLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamkxSU5JZENFaHRLZ2hpM29UZnBwU0JKM0lBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlcGVhdGluZyI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnRlcnByZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW50ZXJwcmV0Ly0vaW50ZXJwcmV0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZnRHeFFReHFEZzk0ejVYVHVFUU1ZL2VMaGhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFic29sdXRlLy0vaXMtYWJzb2x1dGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRPV29xZmx2Y3lkQVJhMzYwR3Z2MThEWi9nUnVIS2kyTlUvd1U1WDFaRnpkWWZIMjlua2lOWnNGM21wNE9KM0g0eW85TXg4QS91QUdOenB6UE4zeUJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1yZWxhdGl2ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFlRXNzNjZOaDJjbjd1ODRRL2lnaVh0Y21OWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWFycmF5aXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFycmF5aXNoLy0vaXMtYXJyYXlpc2gtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kOG1ZUUZKNnFPeXhxTHBwZTRCa1ducVNhcDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1ZmZlci8tL2lzLWJ1ZmZlci0xLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTmNkQUx3cFhrVG01WnZ2Yms3b3dPVVN2VnZCS0RnS1A1L2V3ZlhFem5tUUZmczRaUm1hbk9lS0JUalJWamthM1FGb042WEorOUYzVVNxZkhxVGFVNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1aWx0aW4tbW9kdWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYnVpbHRpbi1tb2R1bGUvLS9pcy1idWlsdGluLW1vZHVsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZBVnkwMDk2d3hHZmozYkRETHdiSGdONi83ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWlsdGluLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DMTdtU0RpT0xJWUNndWVUOFlWdjdEOHdHMVk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTAuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hdkRZcjBTQjNEd085enNNb3YwZ0tDRVNGWXFDbkU0aHEvNHozVGRVbHVrRXk1dDlDMFlScTdITHJzTjUyTkFjcVhLYWVwZUNEMG4rQjBhcm5WRzNIZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMC4xLjYiLAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4wLjEuNCIsCisgICAgICAgICJraW5kLW9mIjogIl41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTUuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkdFRXJuSDZGMnZVdVhEaCtPbGJjS1c3L3dPY2ZkUkhhWjdWV3RxQ3p0ZkhyaS8rK1lLbVA1MU9kV2VHUHVxQ09iYTZrazJPVGU1ZDAyVm1UQjgwUHc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZckVRNG9ta2NVR09Qc05xWVgxSExqQWQvSWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFJd0NVMWVSOEM3VGZIYWh1ZXFYYzhneitNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1maW5pdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZmluaXRlLy0vaXMtZmluaXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtekdaM2FWWUN2bFVPOFI2TFNxWXdVMEsyMEtvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZ2xvYi8tL2lzLWdsb2ItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lNld1SkNGNEJLeHdjSHVXa2lWblNHekQ2RW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtbnVtYmVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpQMWlBYVI0TFBVRlljZ1FKMnI4ZlJMWEVaVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLXBsYWluLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wbGFpbi1vYmplY3QvLS9pcy1wbGFpbi1vYmplY3QtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWg1UHBnWGtXaXRjMzhCQk1ZYXdUWU1XSkhGWkpWbkJxdUZFNTd4RnBqQjhwSkZpRjZnWitiVStXeUkveXFYaUZSNW1kTHNnWU5hUGU4dWFvNlV2OU9nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVsYXRpdmUvLS9pcy1yZWxhdGl2ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS3cvUmVLMGlxd0tldTBNSVRMRnVqMGpiUEFtRWlPc0l3eUlYdnZiZmE2UWZtTjlwa0QxTSs4cGRrN1JsL2RUS2JIMzQvWEJGTWJnRDRpTUpoTFFiR0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXVuYy1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3RyZWFtLy0vaXMtc3RyZWFtLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXRTajNVNW80TGVjNjQyOGhCYzY2QTJSeWtRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy10eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXR5cGVkYXJyYXkvLS9pcy10eXBlZGFycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNUhuSUNGamZEQnNSM2RwcFFQbGdFZnphU3BvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy11bmMtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy11bmMtcGF0aC8tL2lzLXVuYy1wYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tckdwVmQwZnM3V1dMZlZzU3R2Z0Y2aUVKbmJqREZaaDkvZW1oUkRjR1dUZHVUZk5IZDlDSGVVd0gzZ1lJamRid280T242aHVua3p0d09hQXcweWxsUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5jLXBhdGgtcmVnZXgiOiAiXjAuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXV0ZjgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdXRmOC8tL2lzLXV0ZjgtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TdzJoUkNFRTBiTTJOQTZBZVg2R1hQT2ZmWEk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtd2luZG93cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy13aW5kb3dzLy0vaXMtd2luZG93cy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVhLMVVJbnEyYlBtanlYNmUzVkhJek1Mb2JjNEo5NGk0QVduK0hwcTNPVTVLa3JSQzk2T0FjUjNQUkovcEd1Nm04VFJuQkhQOWRrWFFWc1QvQ09WSUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc29iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGtNZWtyRWFsekZqYXFINXlOSE12UDJyZU44PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzc3RyZWFtLy0vaXNzdHJlYW0tMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SK1kvZXZWYSttK1M0VkFPYVE2NHVGS2NDWm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzZkRnQmZLdkhNaXNOSDd6U1dra1dRZkw3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjIiLAorICAgICAgICAiZXNwcmltYSI6ICJeMi42LjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2JuIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzYm4vLS9qc2JuLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGVaVXd1V2kzclh5QWRsczc3eW9EQTd5OVJNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi45LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzaGludC8tL2pzaGludC0yLjkuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS085U0lBS1RsSlFPTTRsRTY0R1FVdEdCUnBUT3V2YnJSclNadzNBaFV4TU5HMjY2blg5aEsyY0tBNFNCaFhPajBpckpHeU55R1NMVDYySEdPVkRFT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNsaSI6ICJ+MS4wLjAiLAorICAgICAgICAiY29uc29sZS1icm93c2VyaWZ5IjogIjEuMS54IiwKKyAgICAgICAgImV4aXQiOiAiMC4xLngiLAorICAgICAgICAiaHRtbHBhcnNlcjIiOiAiMy44LngiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAicGhhbnRvbSI6ICJ+NC4wLjEiLAorICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIn4yLjEuNyIsCisgICAgICAgICJzaGVsbGpzIjogIjAuMy54IiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiMS4wLngiLAorICAgICAgICAidW5pY29kZS01LjIuMCI6ICJeMC43LjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0xLjAuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1IaFg3eXNsOVB1bWI4dGM3VEdWckNDdTYrNUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2xpbnQvLS9qc2xpbnQtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Sb0NzeUlDY0tBKzZURnNieXM5RHBLVGZQVmFDNzFNbTVRU2p2cldBMGxEVk4rTEl2eDZhcGE0MkZGaXNNcW1DVHZKOER4a2NvUUdKMGo3bTNrVFZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICJ+MC4xLjIiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIn4yLjEuNSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMS4wLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlE0Z3QxWlpDdFA1RUpQeVdrOHEyTC96QzZNPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMS41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVp2cUxjZzRVT0xOa2FCOHEwYVk4WVlSSXlkQT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJidWZmZXItc2hpbXMiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+MS4wLjYiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4wLjEwLngiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXNjaGVtYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS8tL2pzb24tc2NoZW1hLTAuMi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdElESWt1V2FMd1dWVE9jbnZUOHFUb2d2bmhNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTAuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTkpwdFJNVTZVZDZKdEFnRnhkWGxtMEY5TTBBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RyaW5naWZ5LXNhZmUvLS9qc29uLXN0cmluZ2lmeS1zYWZlLTUuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXBhaTFZL1VYeG1nOXM0QjFsY0I0c2MxdHVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25maWxlLy0vanNvbmZpbGUtMi40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OemFpdENpNGU3Mmd6SU8xUDZQV002TmNLdWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc3ByaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNwcmltLy0vanNwcmltLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTVQ1bXZCNWN3RzVEaThHM1Nad3VYRmFzdHFJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICIxLjAuMCIsCisgICAgICAgICJleHRzcHJpbnRmIjogIjEuMy4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hIjogIjAuMi4zIiwKKyAgICAgICAgInZlcnJvciI6ICIxLjEwLjAiCisgICAgICB9CisgICAgfSwKKyAgICAia2V3IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tldy8tL2tldy0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVkazlMVE0yUFcvZEtYQ3pOZGtVR3RXUjE1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAia2luZC1vZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczVrTE9jbkgwWHFETytGdnVhTFg4RERqWjE4Q0dGazdWeWdINDBRb0tQVVFoVzRlMnJ2TTByd1VxMHQ4SVFET3dZU2VMSzAxVTkwT2p6QlRtZTJRcUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImtsYXciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XY0VvNE54YzVCQWdFVkVaVHV1Y3Y0V0dVUFk9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsYXp5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xhenktY2FjaGUvLS9sYXp5LWNhY2hlLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtb2RlUHc2VUVkTXVBaEYwN08yNGRwSnBFYm80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxpZnRvZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlmdG9mZi8tL2xpZnRvZmYtMi41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JQWtwRzdNYzZvWWJ2eENud1Zvb3l2ZGNNZXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kIjogIl4zLjAuMCIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJeMi4wLjAiLAorICAgICAgICAiZmluZWQiOiAiXjEuMC4xIiwKKyAgICAgICAgImZsYWdnZWQtcmVzcGF3biI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIsCisgICAgICAgICJvYmplY3QubWFwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWNob2lyIjogIl4wLjYuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjEuNyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWt5YXhTSXdpMGFZSWhsQ29hUUd5MmFrS0xMdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJkZXRlY3QtZmlsZSI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWdsb2IiOiAiXjMuMS4wIiwKKyAgICAgICAgICAgICJtaWNyb21hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImxvYWQtanNvbi1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9hZC1qc29uLWZpbGUvLS9sb2FkLWpzb24tZmlsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxXa0ZjSTFZdExxMHdpWWJCUFdmTWNtVGRNQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGFyc2UtanNvbiI6ICJeMi4yLjAiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWJvbSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb25nZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvbmdlc3QvLS9sb25nZXN0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUtDeTJqajNOM0RvS1VvTkl1WmlYdGQ5QUpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxvdWQtcmVqZWN0aW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvdWQtcmVqZWN0aW9uLy0vbG91ZC1yZWplY3Rpb24tMS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XMGI0QVVmdDdsZUljUENHMEVnaHo1bU9WUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6ICJeMC40LjEiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1ha2UtaXRlcmF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFrZS1pdGVyYXRvci8tL21ha2UtaXRlcmF0b3ItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXB4aXVYaDBpVkVxN1ZNN0tNSWhzNWd4c2Z4Q3V4MlVScHRVUWFYbzRpWlpKeEJBelRQT0xFMkJ1bU81ZGJmVllxL2hCSkZCUi9hMW1GRG1PeDVBR213PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXAtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLWNhY2hlLy0vbWFwLWNhY2hlLTAuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd3lxOUM5WlNYWnNGRmtXN1R5YXNYY21LRGI4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC1vYmoiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLW9iai8tL21hcC1vYmotMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yVFBPdVNCZGdyM1BTSWIyZEN2Y0swM3FGRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFwLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC12aXNpdC8tL21hcC12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdOeW84VEZFNW1EeHRiMUI4UzgwZWRtTis0OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvYmplY3QtdmlzaXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IgorICAgIH0sCisgICAgIm1heG1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXhtaW4vLS9tYXhtaW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jVFplaEttZDJQaXo5OVg5NHZBTkhuOXp2bUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImd6aXAtc2l6ZSI6ICJeMS4wLjAiLAorICAgICAgICAicHJldHR5LWJ5dGVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1lb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tZW93Ly0vbWVvdy0zLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNzdG1pMEpTS0NrS3UvcUZhSkpZY3dpb0Fmcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2Uta2V5cyI6ICJeMi4wLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4xLjIiLAorICAgICAgICAibG91ZC1yZWplY3Rpb24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1hcC1vYmoiOiAiXjEuMC4xIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjEuMyIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuNCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJyZWFkLXBrZy11cCI6ICJeMS4wLjEiLAorICAgICAgICAicmVkZW50IjogIl4xLjAuMCIsCisgICAgICAgICJ0cmltLW5ld2xpbmVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1pY3JvbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pY3JvbWF0Y2gvLS9taWNyb21hdGNoLTMuMS4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTVdpa2dsOW45TTN3K2Jwc1kzSGU4TCt3OWVGOTMzOHhSbDhJQU81dmlEaXp3U3p6aUZFeVV6bzJ4cnJsb0I2NEFEYlRmOHVBOHZScXF0dERUT21jY2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImJyYWNlcyI6ICJeMi4zLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAiZXh0Z2xvYiI6ICJeMi4wLjQiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIiwKKyAgICAgICAgIm5hbm9tYXRjaCI6ICJeMS4yLjkiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS8tL21pbWUtMi4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FVWxsY1ZveWRCSEdOMXo4NHlmUURpbW41OHBaTk5OWGdabEhYU2JveE1sRnZnSTZNWFNXcFdLcEZScmE3SDFIeHBWaEhUa3JnaGZSVzQ5azZ5amVnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLWRiIjogeworICAgICAgInZlcnNpb24iOiAiMS4zNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLWRiLy0vbWltZS1kYi0xLjM3LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVIzQzRkYjZiZ1FobEloUFU0OGZVdGRWbUtuZmxxK2hSZGFkN0l5S2h0RmowNlZQTlZkazJSaGlZTDNValFJbHNvOEwrWXhBdEZrb2JUMFZLK1MveWJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLXR5cGVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLXR5cGVzLy0vbWltZS10eXBlcy0yLjEuMjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNpTDZEYndweUx6alIzeEhTRk5GZWI5TnovTThXRGtYMzN0MUdGUW5GT2xsV2s4cE9yaC9MU3JCNU9YbG5sVzVQOUxINzNYNmxvVy9lb2djK0Y1bEpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1lLWRiIjogIn4xLjM3LjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYXRjaC8tL21pbmltYXRjaC0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUpIVlFFaHlxUExVVGd0OUI4M1BYdTZXM3J4NE12dkh2U1V2VG9vZ3B3b0dET1VRK3lEclIwSFJvdCt5T0NkQ083dTRoWDNwV2Z0NmtXQkJjcWgwVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeMS4xLjciCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTAuMC44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFgvS3Y4TTVmU1lsdUNLQ1l1aHFwNkFSc0YwPSIKKyAgICB9LAorICAgICJtaXhpbi1kZWVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21peGluLWRlZXAvLS9taXhpbi1kZWVwLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04Wkl0TEhlRWdhcUV2ZDVsWUJYZm00RVpTRkNYMjlKYjlLK2xBSGhES3pSZUtCUUtqM1IrN05PRjZ0anFZaTl0NG9JOFZVZmFXSVRKUW04NnduWEdOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLWluIjogIl4xLjAuMiIsCisgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4xLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTEuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXJuWE14VDFoaG9LbzlrMUxaZG1sTnlKZEREZnkydjBmWGpGbG1vazQraTh1bC82V2xiVmdlOWJoTTc0T3BOUFFQTUdVVG9EdHorS1hhMVBuZUp4T0E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICIwLjAuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmdpdXJmd0F2bXdwQWQ5Zm1HRjRqZURWbDhnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hbm9tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFub21hdGNoLy0vbmFub21hdGNoLTEuMi4xMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZnBvZTJUMFJiSHdCVEJVT2Z0QWZCUGFERWkwNnVmYVVhaTBtRTZZbjFrYWNjM1NuVEVyZmIvaCtYOTRWWHpJNjRyS0ZIWUltWFN2ZHdHR0Ntd09xQ0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMiIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4zLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wTlJvV3YxVUZSazhqSFVGWUMwTkY4MWtSMDA9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIiwKKyAgICAgICAgIm9zZW52IjogIl4wLjEuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcm1hbGl6ZS1wYWNrYWdlLWRhdGEvLS9ub3JtYWxpemUtcGFja2FnZS1kYXRhLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05ampVRmJUUGZFeTNSL2FkLzJvTmJLdFc5SGdvdmw1TzFGdkZXS2tLYmxOWG9OL09vdTYrOStLS29oUEsxM1ljMy9UeXVueVdoSnA2Z3ZSTlIvUFBBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9zdGVkLWdpdC1pbmZvIjogIl4yLjEuNCIsCisgICAgICAgICJpcy1idWlsdGluLW1vZHVsZSI6ICJeMS4wLjAiLAorICAgICAgICAic2VtdmVyIjogIjIgfHwgMyB8fCA0IHx8IDUiLAorICAgICAgICAidmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZSI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYXV0aC1zaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC45LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29hdXRoLXNpZ24vLS9vYXV0aC1zaWduLTAuOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mZXhoVUZGUFRHVjh5YkF0U0lHYlY2Z09rU3Y4VXRSYkRCbkF5TFF3NFFQS2tnTmxzSDJCeVBHdE1VcWRXa29zNllDUm1BcVZpd2dackpjL21SRHpaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWNvcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWNvcHkvLS9vYmplY3QtY29weS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZuMkZpM2diMThtUnBCdXBkZTA0RW5WT21Zdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb3B5LWRlc2NyaXB0b3IiOiAiXjAuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAia2luZC1vZiI6ICJeMy4wLjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtdmlzaXQvLS9vYmplY3QtdmlzaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05NXhFazY4TVUzZTFuK09kT1Y1QkJDM1FSYnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5kZWZhdWx0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QuZGVmYXVsdHMvLS9vYmplY3QuZGVmYXVsdHMtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PbitHZ3pTMEI5NmdiYUZ0aU5YTktlUTEvczg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZWFjaCI6ICJeMS4wLjEiLAorICAgICAgICAiYXJyYXktc2xpY2UiOiAiXjEuMC4wIiwKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QubWFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5tYXAvLS9vYmplY3QubWFwLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtejRQbG5jajh3SzFmUWxEaDk0czdnYjJBSFRjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1ha2UtaXRlcmF0b3IiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5waWNrIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5waWNrLy0vb2JqZWN0LnBpY2stMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNkVLeE1GcFM5TGh5L1Uxa2FaaFFmdGQxMGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm9uY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25jZS8tL29uY2UtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XRHNhcDNXV0hVc1JPc0Y5bkZDNjc1M1hhOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iCisgICAgfSwKKyAgICAib3NlbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3NlbnYvLS9vc2Vudi0wLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMENXY0NFQ2RNVmMyUnczVTV3OVpqcVg2Z2E2dWJrMXhEVkt4dEJRUEs3d2lzLzBGMnI5VDZrNHlkR1loZWNsN1lVQnhCVnhoTDVvaXNQc054QVBlMmc9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMCIsCisgICAgICAgICJvcy10bXBkaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtZWFjaC1zZXJpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcC1lYWNoLXNlcmllcy8tL3AtZWFjaC1zZXJpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rdzg5RXQwZlVPZERSRmVpTE5id1NzYXRmM0U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicC1yZWR1Y2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtcmVkdWNlLy0vcC1yZWR1Y2UtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTUt3M1pOcVJwQ2xLZmdqSDFpZy9iYWtmZm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFrbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYWtvLy0vcGFrby0wLjIuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTgvZFNMMDczZ2pTTnFCWWJyWjdQMVJ2NE9uVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXJzZS1maWxlcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1maWxlcGF0aC8tL3BhcnNlLWZpbGVwYXRoLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGpJU2YxT3E4OUZZZHZXSEx6LzZ4MlBXeUpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFic29sdXRlIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4wIiwKKyAgICAgICAgInBhdGgtcm9vdCI6ICJeMC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1qc29uLy0vcGFyc2UtanNvbi0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlJRDBCRFR2Z0hRZmhHa0puNDNxR1BWYVRjaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcnJvci1leCI6ICJeMS4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtcGFzc3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNlLXBhc3N3ZC8tL3BhcnNlLXBhc3N3ZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJWdVRTa1ZwazdJOU4vUUtPQzF2Rm1hbzVjWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXNjYWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bhc2NhbGNhc2UvLS9wYXNjYWxjYXNlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczJQbFhvQUd5bS9pRjRUUzJ5SzlGZGVSZnhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtZXhpc3RzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtZXhpc3RzLy0vcGF0aC1leGlzdHMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EK3RzWlBEOFVZMmFkVTNWNzdZc2NDSjJIMHM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1hYnNvbHV0ZS8tL3BhdGgtaXMtYWJzb2x1dGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXJvb3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1yb290Ly0vcGF0aC1yb290LTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWtwb0ZNckJ3TTF6TmdxVjh5Q0R5T3BIUmJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcm9vdC1yZWdleCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1yb290LXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC1yZWdleC8tL3BhdGgtcm9vdC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXY4emNqZld4TGNVc2kwUHNPTkdOY3NCTHFXMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC10eXBlLy0vcGF0aC10eXBlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NSUGZ1U1IybkJOcEJYYVdrQnd1aytQNUVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZW5kLy0vcGVuZC0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVsZnJWUXBuZy9rUlV6SDg5R1k5WEk0QWVsQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwZXJmb3JtYW5jZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVyZm9ybWFuY2Utbm93Ly0vcGVyZm9ybWFuY2Utbm93LTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXduMDRPWDZrVDdCeHBNSHJqWkxTemQ4bm5zPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJwaGFudG9tIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waGFudG9tLy0vcGhhbnRvbS00LjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVR6ODJYaHRQbXdDazFGRlBtZWN5N3lSR1pHMmJ0cHpZMktJOWZjb1BUN3pUOWRldDBDY015ZkJGUHAxUzhEcXpzblFubThaWUVmZHk1Mjhtd1Z0a3NBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIl4yLjEuMTYiLAorICAgICAgICAic3BsaXQiOiAiXjEuMC4xIiwKKyAgICAgICAgIndpbnN0b24iOiAiXjIuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBoYW50b21qcy1wcmVidWlsdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbWpzLXByZWJ1aWx0Ly0vcGhhbnRvbWpzLXByZWJ1aWx0LTIuMS4xNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTc5SVNwS09XYlRaSGFFNm91bmlGU2I0cTcrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2UiOiAiXjQuMC4zIiwKKyAgICAgICAgImV4dHJhY3QtemlwIjogIl4xLjYuNSIsCisgICAgICAgICJmcy1leHRyYSI6ICJeMS4wLjAiLAorICAgICAgICAiaGFzaGEiOiAiXjIuMi4wIiwKKyAgICAgICAgImtldyI6ICJeMC43LjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjEuMS44IiwKKyAgICAgICAgInJlcXVlc3QiOiAiXjIuODEuMCIsCisgICAgICAgICJyZXF1ZXN0LXByb2dyZXNzIjogIl4yLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjEwIgorICAgICAgfQorICAgIH0sCisgICAgInBpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlmeS8tL3BpZnktMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UlFhYXNCRHFFbnFXSVNZNTl5b3NWTXc2UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS8tL3BpbmtpZS0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNsVnJnTStnMUlxWFRvRG5ja2pvRHRUMytIQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUtcHJvbWlzZS8tL3BpbmtpZS1wcm9taXNlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVRYVzM2ZWpXTUJwckpzWGgzWW9naWhGRC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMvLS9wb3NpeC1jaGFyYWN0ZXItY2xhc3Nlcy0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUFlckEvanRhOXhvcWJBTCtxN2pCL3ZmZ0Rxcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dHktYnl0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHR5LWJ5dGVzLy0vcHJldHR5LWJ5dGVzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2lMb0lRWUpyVFZVTDR5TlhTRlpyL0IxSElRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0xLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTRtREhqMkZoemRtdzVXekQ0S2hkNFh4NlY3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHJveHktZnJvbS1lbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJveHktZnJvbS1lbnYvLS9wcm94eS1mcm9tLWVudi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU04VURtUGNPcCt1VzBoOTdnWFl3cFZlUngrND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BzbC8tL3BzbC0xLjEuMjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFlVW1RMG9MTjAyZmxWSFhXaDlzU0pGN21jZEZxMHBwaWQvSmtFcnVmYzNoR0lWL0FNYThGbzlWZ0RvL2NUMmpGZE9Xb0Z2SHA5MHFxQkg1NFcrZ2pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVueWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdOV21PeWNZZ0FyWTRlc1BwU2FjaE4xQmhGND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVwcGV0ZWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1cHBldGVlci8tL3B1cHBldGVlci0xLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZisxRHhLSFBxY2U2Q1hVQnoyZVZPMldjQVRlVmVRU09QRzlHWWFHT2JFWkRDaUNFVXdHK2dvZ2pNc3J2bjdoZTJ3SFRxTlZiNXA2UlVyd21yOFhGQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjYiLAorICAgICAgICAiaHR0cHMtcHJveHktYWdlbnQiOiAiXjIuMi4xIiwKKyAgICAgICAgIm1pbWUiOiAiXjIuMC4zIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4yLjAuMCIsCisgICAgICAgICJwcm94eS1mcm9tLWVudiI6ICJeMS4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjYuMSIsCisgICAgICAgICJ3cyI6ICJeNS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInByb2dyZXNzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FK2E2dnpxYXpjK0s2THhKclg1VVB5S0Z2R25MNUNZbXEyakZHTklCV0hwYzRReUU0OS9ZT3VtY3JwUUZKcGZlam12UnRiSnpnTzF6UG1NQ3FsYkJnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJxcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xcy8tL3FzLTYuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ONVpBWDQvTHhKbUYrN3dONzRwVUQ2cUFoOS93bnZkUWNqcTlUWmpldnZYelNVbzdiZm13OTFzYXFNanpHUzJ4cTkxL29kTjJkVy9XT2w3cVFITkRHQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInJlYWQtcGtnIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLy0vcmVhZC1wa2ctMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZitxWHMwcHl6SEFSMHZLZlhWcmE3S2VQeWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibG9hZC1qc29uLWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy4yIiwKKyAgICAgICAgInBhdGgtdHlwZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZC1wa2ctdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZC1wa2ctdXAvLS9yZWFkLXBrZy11cC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5XUEJNbmJBWlpHTlYvQUNwWDlBb2JaRCt3ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmaW5kLXVwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkLXBrZyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0xLjEuMTQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mUFRGVHZaSTQ0RXdoTVkyM1NCNTRXYkFnZGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAiaXNhcnJheSI6ICIwLjAuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpc2FycmF5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMC4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWhpcy9LbW85QmQrQ2F2OFlEaVRtd1hSN3Q4PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlY2hvaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaG9pci8tL3JlY2hvaXItMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oU0JMVk51b0xWZEM0b3lXZFc3ME92VU9NNFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAicmVkZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZGVudC8tL3JlZGVudC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo1RnFzZjFmSHhiZnNnZ2kzVzdIOXpEQ3I5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmRlbnQtc3RyaW5nIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1pbmRlbnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4LW5vdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleC1ub3QvLS9yZWdleC1ub3QtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo2U0RqVWdEeFFqNU51c25PdGRGeER3Ti8rSFd5a1I4R0VMd2N0SjdtZHFoY3l5MXhFYzRTUkZIVVh2eFRwNjYxWWFWS0FqZlJMWjljQ3FTNnRuMzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVwZWF0LWVsZW1lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LWVsZW1lbnQvLS9yZXBlYXQtZWxlbWVudC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWhHcTBablY1bTVYdFpMTWIrdlA3NmtjQU01bmtMcWswbHBxQXVvalNLR2dRdG40ZVJpNFpaR20yb2xvMnpLRkgrc01zV2FxT0NXMWRxQW5PcnU3Mmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LXN0cmluZy8tL3JlcGVhdC1zdHJpbmctMS42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qY3JrY09ISWlyd3RZQS8vU25kaWh0cDE1amM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVwZWF0aW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdGluZy8tL3JlcGVhdGluZy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVoVEZPcEp0TlZKd2RTZjdxMEZkdkFqUWJkbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1maW5pdGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjg4LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QvLS9yZXF1ZXN0LTIuODguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkFxQlNyaWpHTFpkTTBXWk5zSW5MSnBrSm9rTDcyWFlqVXBuQjBpd3NSZ3hoN2RCNkNPckhuVEJOd04wRStsSERBSnp1N2tMQWtEZVkwOHoyL0EwaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhd3Mtc2lnbjIiOiAifjAuNy4wIiwKKyAgICAgICAgImF3czQiOiAiXjEuOC4wIiwKKyAgICAgICAgImNhc2VsZXNzIjogIn4wLjEyLjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIn4xLjAuNiIsCisgICAgICAgICJleHRlbmQiOiAifjMuMC4yIiwKKyAgICAgICAgImZvcmV2ZXItYWdlbnQiOiAifjAuNi4xIiwKKyAgICAgICAgImZvcm0tZGF0YSI6ICJ+Mi4zLjIiLAorICAgICAgICAiaGFyLXZhbGlkYXRvciI6ICJ+NS4xLjAiLAorICAgICAgICAiaHR0cC1zaWduYXR1cmUiOiAifjEuMi4wIiwKKyAgICAgICAgImlzLXR5cGVkYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgImlzc3RyZWFtIjogIn4wLjEuMiIsCisgICAgICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogIn41LjAuMSIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIn4yLjEuMTkiLAorICAgICAgICAib2F1dGgtc2lnbiI6ICJ+MC45LjAiLAorICAgICAgICAicGVyZm9ybWFuY2Utbm93IjogIl4yLjEuMCIsCisgICAgICAgICJxcyI6ICJ+Ni41LjIiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIiwKKyAgICAgICAgInRvdWdoLWNvb2tpZSI6ICJ+Mi40LjMiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ1dWlkIjogIl4zLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0LXByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QtcHJvZ3Jlc3MvLS9yZXF1ZXN0LXByb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWFRhN1Y1WWNaenFsdDRqYnlCUWYzeU8wVGdnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdHRsZWl0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZGlyLy0vcmVzb2x2ZS1kaXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYVFHUk1OaXZvTHlidi9uT2NtN1U0SUViME09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMCIsCisgICAgICAgICJnbG9iYWwtbW9kdWxlcyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZS11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS11cmwvLS9yZXNvbHZlLXVybC0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxHTi81M3lKT3YwcVpqL2lHcWtJQUdqaUJTbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JldC8tL3JldC0wLjEuMTUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRUbFlwYStPTCt2TU1ORzI0eFNsUUdFSjNCL1J6RWZVbExjdDdiNUcveXRhdit3UHJwbENwVk1GdXd6WGJrZWNKcmI2SVlvMWlGYjBTOXYzNzc1NG1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyaWdodC1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaWdodC1hbGlnbi8tL3JpZ2h0LWFsaWduLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVRPYmNpL21vMUZXaVNFTkpPRk1saFNHRSs4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFsaWduLXRleHQiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLXJlZ2V4Ly0vc2FmZS1yZWdleC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFLTm1uenNIZlI2VVBVUmluaFY5MUlBanZ5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXQiOiAifjAuMS4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWh3MHl4azlHVC9IcjV5SkVZbkhOS1lYa0lBOG1WSmdkOWRpdFlaQ2UxNlpjemNhRUxZWWNmdmFYZXNOQUNrMk84TzBuVGlQUWNRaEdVUWo4Skx6ZWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuMyIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGVsbGpzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWxsanMvLS9zaGVsbGpzLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlpibU1IcDRGVVQxa2ZOOXBoZzJEekhiVjdFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic25hcGRyYWdvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLy0vc25hcGRyYWdvbi0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRnR5T25XTi93Q0hUVlhPTXd2U3YyNmQra281dldsSURENnpvVUo3TFc4dmgrWkJDOFFkbGp2ZVJQK2NyTnJ0Qndpb0VVV3kvNGRNdGJCakE0aW9ObGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhc2UiOiAiXjAuMTEuMSIsCisgICAgICAgICJkZWJ1ZyI6ICJeMi4yLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuNiIsCisgICAgICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiAiXjAuNS4wIiwKKyAgICAgICAgInVzZSI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uLW5vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi1ub2RlLy0vc25hcGRyYWdvbi1ub2RlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PMjdsNHhhTVl0L1JTUTVUUjN2cFdDQUI1S2IvY3pJY3FVRk9NL0M0ZlljTG5iWlVjMVBralRBTWpvZjJwQldhU1R3T1VkNnFVSGNGR1ZHajdhSXdudz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic25hcGRyYWdvbi11dGlsIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tdXRpbC8tL3NuYXBkcmFnb24tdXRpbC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWJLa01kUUtzalg0QkFMNGJSWVRqMjFlZE9mOGNON1hIZFlVSkVlK1puOTloVkVZY012S1BjdDFJcU5lNytBWlBpcm44QkNET1FCSFFaa25xbUtsWlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjUuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWlnT2RMUkFoMGkwZW9VeUEyT3BHaTZMdlA4dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC1yZXNvbHZlLy0vc291cmNlLW1hcC1yZXNvbHZlLTAuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NanFzdk53eXoxczBrODFHb3ovOXZSQmU5U1pkQjA5QmR3Ky96WXlPKzNDdVBrNmZvdVRheHNjSGtndEU4akt2ZjAxa1ZmbDhyaUh6RVJRL2tlZmFTQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXRvYiI6ICJeMi4xLjEiLAorICAgICAgICAiZGVjb2RlLXVyaS1jb21wb25lbnQiOiAiXjAuMi4wIiwKKyAgICAgICAgInJlc29sdmUtdXJsIjogIl4wLjIuMSIsCisgICAgICAgICJzb3VyY2UtbWFwLXVybCI6ICJeMC40LjAiLAorICAgICAgICAidXJpeCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcC11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC11cmwvLS9zb3VyY2UtbWFwLXVybC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBwTmRmZDF6WXh1WFpabFcxVkVvNkh0UWhLTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGR4LWNvcnJlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1jb3JyZWN0Ly0vc3BkeC1jb3JyZWN0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xOWhlZHR6eVhIcjVTMEExdkVQb0svN2w4TnBma0ZZVHE2aUNZK1BubzJaYmRaUjZXZXhaRnRxZVZHa0d4VzNURUpNTjkxNFo1NUVuQUdNbWVubElRUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGR4LWV4Y2VwdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1leGNlcHRpb25zLy0vc3BkeC1leGNlcHRpb25zLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yWFFBQ2ZFbEtpOVNsVmIxQ1lhZEtEWHZvYWpQZ0JWUG4vZ09RTHJUdkhkRWxhVmhyN1pFYnFKYVJuSkxWTmVhSTRjTUVBZ1ZDZUJNS0Y2TVdSRENSQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS8tL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWWc2RDNYcFJENGtrT21UcGRnYlVpRUpGS2doSkgwM2ZpQzFPUGxsNWgvMHNPNm5laDJqcVJEVkhPUTRvL0xNZWEwdGdDa2JNZ2VhNWlwL2UrTWtXeWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhjZXB0aW9ucyI6ICJeMi4xLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1saWNlbnNlLWlkcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWxpY2Vuc2UtaWRzLy0vc3BkeC1saWNlbnNlLWlkcy0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVGZPZlBjWUdCQjVzRHVQbjNkZUJ5eFBobWZlZ0FocERZS1NPWFpRTjgxT3lycmlmOFpDb2RPTHpLM0Flc0VMbkN4MDNraWtoeUR3aDBwZnZ2UXZGOHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwbGl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0Ly0vc3BsaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UeU9vUGJyaXZ0WG53bkl4WlJGWVJyUE50RUZLbHBCMmZ2alNuQ1FVaUFBNnFBWnpxd25hNWVudks0dWs2T0llUDE3Q3NkRjNyU0JHWVZCc1UwVGtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICIyIgorICAgICAgfQorICAgIH0sCisgICAgInNwbGl0LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC1zdHJpbmcvLS9zcGxpdC1zdHJpbmctMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU56TlZoSkRZcHdjZVZWaWk4L0h1NkRLZkQyRytOclFIbFMvVi9xZ3Y3NjNFWXVkVndFY01RTnhkMmxoKzBWclVCeVhOL29Ka2w1Z3JPaFlXdlFVWWl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5yNTRNZ3IrV0FIMnpxUHVlTGJscXJsQTZndz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzc2hwayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NocGsvLS9zc2hway0xLjE1LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1TZGdOVWFpZGsrZFJVNU1oWXROOXplYmR6RjJpRzBjTlBXeThIRytXOHkrZlQxSm5Ta2gwZnp6cGpPYTBMN1A4aTFSc2N6Mzh0MGg0Z1BjS3o0M3hBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNuMSI6ICJ+MC4yLjMiLAorICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImJjcnlwdC1wYmtkZiI6ICJeMS4wLjAiLAorICAgICAgICAiZGFzaGRhc2giOiAiXjEuMTIuMCIsCisgICAgICAgICJlY2MtanNibiI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0cGFzcyI6ICJeMC4xLjEiLAorICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjAuMiIsCisgICAgICAgICJ0d2VldG5hY2wiOiAifjAuMTQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdGFjay10cmFjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhY2stdHJhY2UvLS9zdGFjay10cmFjZS0wLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WSHh3czBmbzB5dE9FSTZob3FGWjVmM2VHY0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInN0YXRpYy1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhdGljLWV4dGVuZC8tL3N0YXRpYy1leHRlbmQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZSUNjT2N2L1ZUTnlKdjFlQzFJUE5COGZ0Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJvYmplY3QtY29weSI6ICJeMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEwLjMxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTAuMTAuMzEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZdUlEdkVGMmJHd295ZnlFTUIyckhGTVErcFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1ib20vLS9zdHJpcC1ib20tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZaG1vVmhaU0JKSHpWNGk5dnhSSHFaeCthdzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtdXRmOCI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtaW5kZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWluZGVudC8tL3N0cmlwLWluZGVudC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURIbGlwcTN2cDd2VXJEWmtZS1k0VlNyaG9LST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IgorICAgIH0sCisgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFqVmp3ZFhJdDQwOE1JaUFxQ1g0b1VLc2dVMkVxQUd6czJQcGttNGFRWWJqbStaRVdFY1c0U2ZGTlRyNHVNTlptYTBleTRmNWxnTHJrQjBhWDBRTW93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtZmxhZyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3luYy1leGVjIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N5bmMtZXhlYy8tL3N5bmMtZXhlYy0wLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNYMGl6RlB3emgzdlZaUTJMenFKb3V1NUVRVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIKKyAgICB9LAorICAgICJ0aHJvdHRsZWl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm90dGxlaXQvLS90aHJvdHRsZWl0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbm5oWU50cjBaME1VV2xtRXRpYU5nb1Vvckd3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInRvLW9iamVjdC1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLW9iamVjdC1wYXRoLy0vdG8tb2JqZWN0LXBhdGgtMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1LWFdJdDdEbjRLd0k0RTVuTDRYQjlKbWVGNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC8tL3RvLXJlZ2V4LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GV3RsZU5BdFovS2kycXRxZWoyQ1hUT2F5T0g5YkhEUUYrUTQ4VnBXeURYamJZeEE0WXo4aURCMzF6WE9CVWxPSEhLaWREYnFHVnJUVXZRTVBtQkdCdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMiIsCisgICAgICAgICJzYWZlLXJlZ2V4IjogIl4xLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleC1yYW5nZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC1yYW5nZS8tL3RvLXJlZ2V4LXJhbmdlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZklEQmU1Myt2bG1lSnpaK0RVM1ZXUUZCMnpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidG91Z2gtY29va2llIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvdWdoLWNvb2tpZS8tL3RvdWdoLWNvb2tpZS0yLjQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUTVzcmsvNHZETTU0V0pzSmlvM1hObjZLMnNDRytDUThHNVd6NmJaaFJab0FlLytUeGpXQi9HbEZBbllFYmtZVmxPTjlGTWsvZkUzaDJSTHBQWG80bFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwc2wiOiAiXjEuMS4yNCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHJpbS1uZXdsaW5lcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmltLW5ld2xpbmVzLy0vdHJpbS1uZXdsaW5lcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJZVdhN1dDcEZBNlFldFNUMzAxQVJnVnBoTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dW5uZWwtYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHVubmVsLWFnZW50Ly0vdHVubmVsLWFnZW50LTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjZYZW9HczJzRW9LbVdaM1N5a0lhUEQ4UVAwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHdlZXRuYWNsIjogeworICAgICAgInZlcnNpb24iOiAiMC4xNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90d2VldG5hY2wvLS90d2VldG5hY2wtMC4xNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV3VhQmQvR1MxRVZpYWRFSXI2ay8rSFEvVDJRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR5cGVkYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZWRhcnJheS8tL3R5cGVkYXJyYXktMC4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1obnJIVGpoa0dIc2RQVWZabHFlT3hjaURCM2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidWdsaWZ5LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTIuNi40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmVvdnN3V2NrNVJwTHhYKzJId3JOc0ZybXQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4wLjIuNiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjUuMSIsCisgICAgICAgICJ1Z2xpZnktdG8tYnJvd3NlcmlmeSI6ICJ+MS4wLjAiLAorICAgICAgICAieWFyZ3MiOiAifjMuMTAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjEwIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTAuMi4xMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10cnZnc0dkTG5YR1hDTW80M293amZMVW13OUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LXRvLWJyb3dzZXJpZnkvLS91Z2xpZnktdG8tYnJvd3NlcmlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJna2sxcjJtdGEvalNlT2FiV01vVUtENGdyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmMtcGF0aC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmMtcGF0aC1yZWdleC8tL3VuYy1wYXRoLXJlZ2V4LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNXozVDE3RFh4ZTJHKzZ4ckN1Zll4cWFkVVBvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IgorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZS5zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS5zdHJpbmcvLS91bmRlcnNjb3JlLnN0cmluZy0zLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZytkcG1nbitYQm5lTG1YWG8rc0dsVzV4UUV0NEVya1MzbWdlTjJHRmJyZW1ZZU1CU0pLcjlXZjJLSnBsUVZhaVBZL2Y3Rk42YXRvc1dZTm05b3ZyWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAiXjEuMC4zIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmljb2RlLTUuMi4wIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaWNvZGUtNS4yLjAvLS91bmljb2RlLTUuMi4wLTAuNy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LVkdMVzFCcmkzMHgwMHl2NEhOTThrQnhvcUZYcjBTYm81NTczNW52cmxzeDRQWUJab2wzVXRvV2dPNDkyZlN3bXNldHpQRVp6eTczcmJVOE9HWEpjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5pb24tdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5pb24tdmFsdWUvLS91bmlvbi12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhISERUTFc2MWR6cjQrb00wSUlIdWxxaHJxUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAic2V0LXZhbHVlIjogIl4wLjQuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC40LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMC40LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmJDUG5UMGkzSDk0NVRyenc3OUdadXpmelBFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjEiLAorICAgICAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnNldC12YWx1ZS8tL3Vuc2V0LXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZzNhSFAzMGpOUmVmK3g1dnc2anREZnlLdFZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMC4zLjEiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMC4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXg5WXV0cGl5b0ord0tJSGdDVmxTRVdaWGg4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjMiLAorICAgICAgICAgICAgImhhcy12YWx1ZXMiOiAiXjAuMS40IiwKKyAgICAgICAgICAgICJpc29iamVjdCI6ICJeMi4wLjAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAgICAgImlzb2JqZWN0IjogeworICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTIuMS4wLnRneiIsCisgICAgICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04R1ZXRUphajhkb3U5R0p5K0JYSVFOaCtESWs9IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAiaXNhcnJheSI6ICIxLjAuMCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iV0hlbGRrZC9LbTVvQ0NKclRoTC80OWl0M0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXJpLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLXBhdGgvLS91cmktcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwwZndHRFdKTThNZDRQelAyQzBUam1jbUxqST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cml4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaXgvLS91cml4LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnBOL2VtTGlIK3dmMFkxSnMxd3BOUVo2YkhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91c2UvLS91c2UtMy4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWN3RVNWWGxPM3VybDlZV2xGVy9UQTljc2hDRWh0dTdJS0ovcDVzb0ovZ0dwajd2YnZGckFZL2VJaW9RNkR3MjNLalpoWWdpSW84SE9zMW5RMnZyL29RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlsLWRlcHJlY2F0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLWRlcHJlY2F0ZS8tL3V0aWwtZGVwcmVjYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUlExTnlmcHczbk1uWXZ2UzFLS0pnVUdhRE04PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV1aWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXVpZC8tL3V1aWQtMy4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlYSm1lTmF3M0RubktBT0tKRTUxc0wvWmFZZldKUmwxcEs5ZHIxOVlGQ3UwT2JTMjMxQUIxL0xicVRLUkFRNWt3OEE5MHJBNmZyNHJpT1VwVFp2UVpBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidjhmbGFncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92OGZsYWdzLy0vdjhmbGFncy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNnNnU0tvRncxVXBVUGQzY0ZkRjdRR25ySDZ0RGVCZ1cxRjN2OWd5OGdMWTBtbGJpQlhxOHNveThhUXBZNnhlZUNqSDVLK0p2QzYyQWNwN2d0bDd3V0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvbWVkaXItcG9seWZpbGwiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZS8tL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURwS20yVWkveE43L0hRS0N0cFp4b1JXQmhaOVowa3F0eWdHOFhDZ05ROFpsRG54dVFtV2hqNTY2ajhmTjRDdTMvSm1iaHNEbzdmY0FKcTRzOWgyN0V3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWNvcnJlY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidmVycm9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92ZXJyb3IvLS92ZXJyb3ItMS4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT2hCY29YQlRyMVhXNG5EQitDaUdndUdOcEFBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiY29yZS11dGlsLWlzIjogIjEuMC4yIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2luZG93LXNpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2luZG93LXNpemUvLS93aW5kb3ctc2l6ZS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZEak5McWs3SUM3Nk9obitpSWV1NThsUG5KMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aW5zdG9uIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbnN0b24vLS93aW5zdG9uLTIuNC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OQm8yUGVwbjRoSzRWMDFVZmNXY0RsbWlWVHM3VlRCMWg3YmduQjByZ1AxNDZiWWhNeFgweXBDejNsQk9mTnhDTzRadWVrN3llVCt5L3pNMU9mTXc0UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4xLjAuMCIsCisgICAgICAgICJjb2xvcnMiOiAiMS4wLngiLAorICAgICAgICAiY3ljbGUiOiAiMS4wLngiLAorICAgICAgICAiZXllcyI6ICIwLjEueCIsCisgICAgICAgICJpc3N0cmVhbSI6ICIwLjEueCIsCisgICAgICAgICJzdGFjay10cmFjZSI6ICIwLjAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1B3RXlqb1RlRXJlbmhaQnI1aFhqUHZXUjZrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY29sb3JzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUJEUDBUWUNXZ1AzcllPMG1EeHNNSmk2Q3BBcz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10NVpwdTBMc3RBbjRQVmc4clZMS0YrcWhaRDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTUuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYUhGRDZQRnY2VWdvSVZkYTZxWmxscHRRc01sREVKa1RRY3lienpYRFlNMVhPOVk4ZW02OTFGR01QbU00NldHeUxVNHo5S01nUU4rcXJ1eC9uaGxIQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iCisgICAgfSwKKyAgICAieWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWFyZ3MvLS95YXJncy0zLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05KzU3MkZmZGZCMHRPTURuVHZ2V2dkRkRIOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4xLjAuMiIsCisgICAgICAgICJjbGl1aSI6ICJeMi4xLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4wLjAiLAorICAgICAgICAid2luZG93LXNpemUiOiAiMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0xLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tN1V3VFM0TFZtbUxMSFdMQ0tQcXFkcWxpams9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAieWF1emwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWF1emwvLS95YXV6bC0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxTajBRdHF4c2loT1dMUTNtN0dVNGk0TVFBVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmZC1zbGljZXIiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UuanNvbiBiL2xpYi9qcy9wYWNrYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5Y2RjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9wYWNrYWdlLmpzb24KQEAgLTAsMCArMSwxOSBAQAoreworICAibmFtZSI6ICJ0aHJpZnQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJkZXZEZXBlbmRlbmNpZXMiOiB7CisgICAgImdydW50IjogIl4xLjAuMiIsCisgICAgImdydW50LWNsaSI6ICJeMS4yLjAiLAorICAgICJncnVudC1jb250cmliLWNvbmNhdCI6ICJeMS4wLjEiLAorICAgICJncnVudC1jb250cmliLWpzaGludCI6ICJeMS4wLjAiLAorICAgICJncnVudC1jb250cmliLXF1bml0IjogIl4zLjAuMSIsCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogIl4xLjAuMSIsCisgICAgImdydW50LWpzZG9jIjogIl4yLjIuMSIsCisgICAgImdydW50LXNoZWxsLXNwYXduIjogIl4wLjMuMTAiLAorICAgICJqc2xpbnQiOiAiXjAuMTIuMCIKKyAgfSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAianNkb2MiOiAiXjMuNS41IiwKKyAgICAibm9wdCI6ICJeNC4wLjEiCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qcy9zcmMvdGhyaWZ0LmpzIGIvbGliL2pzL3NyYy90aHJpZnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmODEyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCkBAIC0wLDAgKzEsMTU2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKmpzaGludCBldmlsOnRydWUqLworCisvKioKKyAqIFRoZSBUaHJpZnQgbmFtZXNwYWNlIGhvdXNlcyB0aGUgQXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnkKKyAqIGVsZW1lbnRzIHByb3ZpZGluZyBKYXZhU2NyaXB0IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMKKyAqIHN5c3RlbS4gRW5kIHVzZXJzIHdpbGwgdHlwaWNhbGx5IG9ubHkgZGlyZWN0bHkgbWFrZSB1c2Ugb2YgdGhlCisgKiBUcmFuc3BvcnQgKFRYSFJUcmFuc3BvcnQvVFdlYlNvY2tldFRyYW5zcG9ydCkgYW5kIFByb3RvY29sCisgKiAoVEpTT05QUm90b2NvbC9UQmluYXJ5UHJvdG9jb2wpIGNvbnN0cnVjdG9ycy4KKyAqCisgKiBPYmplY3QgbWV0aG9kcyBiZWdpbm5pbmcgd2l0aCBhIF9fIChlLmcuIF9fb25PcGVuKCkpIGFyZSBpbnRlcm5hbAorICogYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgdGhlIG9iamVjdCdzIG93biBtZXRob2RzLgorICoKKyAqIFRoaXMgbGlicmFyeSBjcmVhdGVzIG9uZSBnbG9iYWwgb2JqZWN0OiBUaHJpZnQKKyAqIENvZGUgaW4gdGhpcyBsaWJyYXJ5IG11c3QgbmV2ZXIgY3JlYXRlIGFkZGl0aW9uYWwgZ2xvYmFsIGlkZW50aWZpZXJzLAorICogYWxsIGZlYXR1cmVzIG11c3QgYmUgc2NvcGVkIHdpdGhpbiB0aGUgVGhyaWZ0IG5hbWVzcGFjZS4KKyAqIEBuYW1lc3BhY2UKKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCdodHRwOi8vbG9jYWxob3N0Ojg1ODUnKTsKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICogICAgIHZhciBjbGllbnQgPSBuZXcgTXlUaHJpZnRTdmNDbGllbnQocHJvdG9jb2wpOworICogICAgIHZhciByZXN1bHQgPSBjbGllbnQuTXlNZXRob2QoKTsKKyAqLwordmFyIFRocmlmdCA9IHsKKyAgICAvKioKKyAgICAgKiBUaHJpZnQgSmF2YVNjcmlwdCBsaWJyYXJ5IHZlcnNpb24uCisgICAgICogQHJlYWRvbmx5CisgICAgICogQGNvbnN0IHtzdHJpbmd9IFZlcnNpb24KKyAgICAgKiBAbWVtYmVyb2YgVGhyaWZ0CisgICAgICovCisgICAgVmVyc2lvbjogJzEuMC4wJywKKworICAgIC8qKgorICAgICAqIFRocmlmdCBJREwgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUT1AgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBWT0lEICAgLSBObyB2YWx1ZSAob25seSBsZWdhbCBmb3IgcmV0dXJuIHR5cGVzKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJPT0wgICAtIFRydWUvRmFsc2UgaW50ZWdlci4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIEJZVEUgICAtIFNpZ25lZCA4IGJpdCBpbnRlZ2VyLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSTA4ICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBET1VCTEUgLSA2NCBiaXQgSUVFRSA4NTQgZmxvYXRpbmcgcG9pbnQuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMTYgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJMzIgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBJNjQgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBTVFJJTkcgLSBBcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFVURjcgICAtIEFycmF5IG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHN0cmluZyBvZiBVVEY3IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNUUlVDVCAtIEEgbXVsdGlmaWVsZCB0eXBlLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgTUFQICAgIC0gQSBjb2xsZWN0aW9uIHR5cGUgKG1hcC9hc3NvY2lhdGl2ZS1hcnJheS9kaWN0aW9uYXJ5KS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIFNFVCAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIExJU1QgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQpLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGOCAgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjggZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGMTYgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjE2IGVuY29kZWQgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBUeXBlOiB7CisgICAgICAgIFNUT1A6IDAsCisgICAgICAgIFZPSUQ6IDEsCisgICAgICAgIEJPT0w6IDIsCisgICAgICAgIEJZVEU6IDMsCisgICAgICAgIEkwODogMywKKyAgICAgICAgRE9VQkxFOiA0LAorICAgICAgICBJMTY6IDYsCisgICAgICAgIEkzMjogOCwKKyAgICAgICAgSTY0OiAxMCwKKyAgICAgICAgU1RSSU5HOiAxMSwKKyAgICAgICAgVVRGNzogMTEsCisgICAgICAgIFNUUlVDVDogMTIsCisgICAgICAgIE1BUDogMTMsCisgICAgICAgIFNFVDogMTQsCisgICAgICAgIExJU1Q6IDE1LAorICAgICAgICBVVEY4OiAxNiwKKyAgICAgICAgVVRGMTY6IDE3CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFRocmlmdCBSUEMgbWVzc2FnZSB0eXBlIHN0cmluZyB0byBJZCBtYXBwaW5nLgorICAgICAqIEByZWFkb25seQorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ0FMTCAgICAgIC0gUlBDIGNhbGwgc2VudCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIuCisgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBSRVBMWSAgICAgLSBSUEMgY2FsbCBub3JtYWwgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50LgorICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgRVhDRVBUSU9OIC0gUlBDIGNhbGwgZXhjZXB0aW9uIHJlc3BvbnNlIGZyb20gc2VydmVyIHRvIGNsaWVudC4KKyAgICAgKiBAcHJvcGVydHkge251bWJlcn0gIE9ORVdBWSAgICAtIE9uZXdheSBSUEMgY2FsbCBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgd2l0aCBubyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBNZXNzYWdlVHlwZTogeworICAgICAgICBDQUxMOiAxLAorICAgICAgICBSRVBMWTogMiwKKyAgICAgICAgRVhDRVBUSU9OOiAzLAorICAgICAgICBPTkVXQVk6IDQKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGNvdW50IG9mIGFuIG9iamVjdCdzIG93biBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvYmogLSBPYmplY3QgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBudW1iZXIgb2Ygb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBvYmplY3RMZW5ndGg6IGZ1bmN0aW9uKG9iaikgeworICAgICAgICB2YXIgbGVuZ3RoID0gMDsKKyAgICAgICAgZm9yICh2YXIgayBpbiBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGVuZ3RoOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVzdGFibGlzaCBwcm90b3R5cGUgaW5oZXJpdGFuY2UuCisgICAgICogQHNlZSB7QGxpbmsgaHR0cDovL2phdmFzY3JpcHQuY3JvY2tmb3JkLmNvbS9wcm90b3R5cGFsLmh0bWx8UHJvdG90eXBhbCBJbmhlcml0YW5jZX0KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb25zdHJ1Y3RvciAtIENvbnRzdHJ1Y3RvciBmdW5jdGlvbiB0byBzZXQgYXMgZGVyaXZlZC4KKyAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckNvbnN0cnVjdG9yIC0gQ29udHN0cnVjdG9yIGZ1bmN0aW9uIHRvIHNldCBhcyBiYXNlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gLSBUeXBlIG5hbWUgdG8gc2V0IGFzIG5hbWUgcHJvcGVydHkgaW4gZGVyaXZlZCBwcm90b3R5cGUuCisgICAgICovCisgICAgaW5oZXJpdHM6IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yLCBuYW1lKSB7CisgICAgICBmdW5jdGlvbiBGKCkge30KKyAgICAgIEYucHJvdG90eXBlID0gc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGU7CisgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBuZXcgRigpOworICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLm5hbWUgPSBuYW1lIHx8ICcnOworICAgIH0KK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgVEV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQGF1Z21lbnRzIEVycm9yCisgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIFRoZSBURXhjZXB0aW9uIG1lc3NhZ2UgKGRpc3RpbmN0IGZyb20gdGhlIEVycm9yIG1lc3NhZ2UpLgorICogQGNsYXNzZGVzYyBURXhjZXB0aW9uIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgVGhyaWZ0IGV4Y2VwdGlvbnMgdHlwZXMuCisgKi8KK1RocmlmdC5URXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSkgeworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5URXhjZXB0aW9uLCBFcnJvciwgJ1RFeGNlcHRpb24nKTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHNldCBvbiB0aGUgZXhjZXB0aW9uLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBleGNlcHRpb24gbWVzc2FnZQorICovCitUaHJpZnQuVEV4Y2VwdGlvbi5wcm90b3R5cGUuZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7Cit9OworCisvKioKKyAqIFRocmlmdCBBcHBsaWNhdGlvbiBFeGNlcHRpb24gdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOICAgICAgICAgICAgICAgICAtIFVua25vd24vdW5kZWZpbmVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTktOT1dOX01FVEhPRCAgICAgICAgICAtIENsaWVudCBhdHRlbXB0ZWQgdG8gY2FsbCBhIG1ldGhvZCB1bmtub3duIHRvIHRoZSBzZXJ2ZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfTUVTU0FHRV9UWVBFICAgIC0gQ2xpZW50IHBhc3NlZCBhbiB1bmtub3duL3Vuc3VwcG9ydGVkIE1lc3NhZ2VUeXBlLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBXUk9OR19NRVRIT0RfTkFNRSAgICAgICAtIFVudXNlZC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgLSBVbnVzZWQgaW4gVGhyaWZ0IFJQQywgdXNlZCB0byBmbGFnIHByb3ByaWV0YXJ5IHNlcXVlbmNlIG51bWJlciBlcnJvcnMuCisgKiBAcHJvcGVydHkge251bWJlcn0gIE1JU1NJTkdfUkVTVUxUICAgICAgICAgIC0gUmFpc2VkIGJ5IGEgc2VydmVyIHByb2Nlc3NvciBpZiBhIGhhbmRsZXIgZmFpbHMgdG8gc3VwcGx5IHRoZSByZXF1aXJlZCByZXR1cm4gcmVzdWx0LgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBJTlRFUk5BTF9FUlJPUiAgICAgICAgICAtIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIFBST1RPQ09MX0VSUk9SICAgICAgICAgIC0gVGhlIHByb3RvY29sIGxheWVyIGZhaWxlZCB0byBzZXJpYWxpemUgb3IgZGVzZXJpYWxpemUgZGF0YS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgLSBVbnVzZWQuCisgKiBAcHJvcGVydHkge251bWJlcn0gIElOVkFMSURfUFJPVE9DT0wgICAgICAgIC0gVGhlIHByb3RvY29sIChvciB2ZXJzaW9uKSBpcyBub3Qgc3VwcG9ydGVkLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSAtIFVudXNlZC4KKyAqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7CisgICAgVU5LTk9XTjogMCwKKyAgICBVTktOT1dOX01FVEhPRDogMSwKKyAgICBJTlZBTElEX01FU1NBR0VfVFlQRTogMiwKKyAgICBXUk9OR19NRVRIT0RfTkFNRTogMywKKyAgICBCQURfU0VRVUVOQ0VfSUQ6IDQsCisgICAgTUlTU0lOR19SRVNVTFQ6IDUsCisgICAgSU5URVJOQUxfRVJST1I6IDYsCisgICAgUFJPVE9DT0xfRVJST1I6IDcsCisgICAgSU5WQUxJRF9UUkFOU0ZPUk06IDgsCisgICAgSU5WQUxJRF9QUk9UT0NPTDogOSwKKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogMTAKK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGluc3RhbmNlLgorICogQGNvbnN0cnVjdG9yCisgKiBAYXVnbWVudHMgVGhyaWZ0LlRFeGNlcHRpb24KKyAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gVGhlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBtZXNzYWdlIChkaXN0aW5jdCBmcm9tIHRoZSBFcnJvciBtZXNzYWdlKS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGV9IFtjb2RlXSAtIFRoZSBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlIGNvZGUuCisgKiBAY2xhc3NkZXNjIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGNsYXNzIHVzZWQgdG8gcHJvcGFnYXRlIGV4Y2VwdGlvbnMgZnJvbSBhbiBSUEMgc2VydmVyIGJhY2sgdG8gYSBjYWxsaW5nIGNsaWVudC4KKyovCitUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSkgeworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5jb2RlID0gdHlwZW9mIGNvZGUgPT09ICdudW1iZXInID8gY29kZSA6IDA7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisKKy8qKgorICogUmVhZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBwcm90b2NvbC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dCAtIFRoZSBpbnB1dCBwcm90b2NvbCB0byByZWFkIGZyb20uCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihpbnB1dCkgeworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHZhciByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworCisgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RPUCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZmlkID0gcmV0LmZpZDsKKworICAgICAgICBzd2l0Y2ggKGZpZCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gcmV0LnZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKHJldC5mdHlwZSA9PSBUaHJpZnQuVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZEkzMigpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvZGUgPSByZXQudmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpbnB1dC5yZWFkU3RydWN0RW5kKCk7Cit9OworCisvKioKKyAqIFdpdGUgYSBUQXBwbGljYXRpb25FeGNlcHRpb24gdG8gdGhlIHN1cHBsaWVkIHByb3RvY29sLgorICogQHBhcmFtIHtvYmplY3R9IG91dHB1dCAtIFRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gd3JpdGUgdG8uCisgKi8KK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24ob3V0cHV0KSB7CisgICAgb3V0cHV0LndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgICAgaWYgKHRoaXMubWVzc2FnZSkgeworICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0LlR5cGUuU1RSSU5HLCAxKTsKKyAgICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKHRoaXMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpZiAodGhpcy5jb2RlKSB7CisgICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQuVHlwZS5JMzIsIDIpOworICAgICAgICBvdXRwdXQud3JpdGVJMzIodGhpcy5jb2RlKTsKKyAgICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBvdXRwdXQud3JpdGVGaWVsZFN0b3AoKTsKKyAgICBvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIGNvZGUgc2V0IG9uIHRoZSBleGNlcHRpb24uCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZX0gZXhjZXB0aW9uIGNvZGUKKyAqLworVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmNvZGU7Cit9OworCitUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZSA9IHsKKyAgICBVTktOT1dOOiAwLAorICAgIElOVkFMSURfREFUQTogMSwKKyAgICBORUdBVElWRV9TSVpFOiAyLAorICAgIFNJWkVfTElNSVQ6IDMsCisgICAgQkFEX1ZFUlNJT046IDQsCisgICAgTk9UX0lNUExFTUVOVEVEOiA1LAorICAgIERFUFRIX0xJTUlUOiA2Cit9OworCitUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uID0gZnVuY3Rpb24gVFByb3RvY29sRXhjZXB0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKKyAgICBFcnJvci5jYWxsKHRoaXMpOworICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OworVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVFByb3RvY29sRXhjZXB0aW9uJyk7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBYSFIgdHJhbnNwb3J0LgorICogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgdXJsIHRoZW4geW91IG11c3QgaGFuZGxlIFhIUiBvcGVyYXRpb25zIG9uCisgKiB5b3VyIG93bi4gVGhpcyB0eXBlIGNhbiBhbHNvIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBUcmFuc3BvcnQgYWxpYXMKKyAqIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTworICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFhIUlRyYW5zcG9ydCBvYmplY3QKKyAqIHVzZXMgSHR0cFtzXS9YSFIuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IHRoZSBodHRwW3NdIHRyYW5zcG9ydAorICogKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcl9odHRwLmpzKS4KKyAqIEBleGFtcGxlCisgKiAgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFhIUlRyYW5zcG9ydCgiaHR0cDovL2xvY2FsaG9zdDo4NTg1Iik7CisgKi8KK1RocmlmdC5UcmFuc3BvcnQgPSBUaHJpZnQuVFhIUlRyYW5zcG9ydCA9IGZ1bmN0aW9uKHVybCwgb3B0aW9ucykgeworICAgIHRoaXMudXJsID0gdXJsOworICAgIHRoaXMud3BvcyA9IDA7CisgICAgdGhpcy5ycG9zID0gMDsKKyAgICB0aGlzLnVzZUNPUlMgPSAob3B0aW9ucyAmJiBvcHRpb25zLnVzZUNPUlMpOworICAgIHRoaXMuY3VzdG9tSGVhZGVycyA9IG9wdGlvbnMgPyAob3B0aW9ucy5jdXN0b21IZWFkZXJzID8gb3B0aW9ucy5jdXN0b21IZWFkZXJzIDoge30pOiB7fTsKKyAgICB0aGlzLnNlbmRfYnVmID0gJyc7CisgICAgdGhpcy5yZWN2X2J1ZiA9ICcnOworfTsKKworVGhyaWZ0LlRYSFJUcmFuc3BvcnQucHJvdG90eXBlID0geworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJyb3dzZXIgc3BlY2lmaWMgWG1sSHR0cFJlcXVlc3QgT2JqZWN0LgorICAgICAqIEByZXR1cm5zIHtvYmplY3R9IHRoZSBicm93c2VyIFhIUiBpbnRlcmZhY2Ugb2JqZWN0CisgICAgICovCisgICAgZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3Q6IGZ1bmN0aW9uKCkgeworICAgICAgICB0cnkgeyByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7IH0gY2F0Y2ggKGUxKSB7IH0KKyAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1MSFRUUCcpOyB9IGNhdGNoIChlMikgeyB9CisgICAgICAgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTEhUVFAnKTsgfSBjYXRjaCAoZTMpIHsgfQorCisgICAgICAgIHRocm93ICJZb3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IFhIUi4iOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZW5kcyB0aGUgY3VycmVudCBYUkggcmVxdWVzdCBpZiB0aGUgdHJhbnNwb3J0IHdhcyBjcmVhdGVkIHdpdGggYSBVUkwKKyAgICAgKiBhbmQgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBmYWxzZS4gSWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGNyZWF0ZWQgd2l0aAorICAgICAqIGEgVVJMLCBvciB0aGUgYXN5bmMgcGFyYW1ldGVyIGlzIFRydWUgYW5kIG5vIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBvcgorICAgICAqIHRoZSBVUkwgaXMgYW4gZW1wdHkgc3RyaW5nLCB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlciBpcyByZXR1cm5lZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIE9wdGlvbmFsIGFzeW5jIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyBvciB0aGUgY3VycmVudCBzZW5kIGJ1ZmZlci4KKyAgICAgKiBAdGhyb3dzIHtzdHJpbmd9IElmIFhIUiBmYWlscy4KKyAgICAgKi8KKyAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMsIGNhbGxiYWNrKSB7CisgICAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgICAgaWYgKChhc3luYyAmJiAhY2FsbGJhY2spIHx8IHRoaXMudXJsID09PSB1bmRlZmluZWQgfHwgdGhpcy51cmwgPT09ICcnKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciB4cmVxID0gdGhpcy5nZXRYbWxIdHRwUmVxdWVzdE9iamVjdCgpOworCisgICAgICAgIGlmICh4cmVxLm92ZXJyaWRlTWltZVR5cGUpIHsKKyAgICAgICAgICAgIHhyZXEub3ZlcnJpZGVNaW1lVHlwZSgnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgICAvL0lnbm9yZSBYSFIgY2FsbGJhY2tzIHVudGlsIHRoZSBkYXRhIGFycml2ZXMsIHRoZW4gY2FsbCB0aGUKKyAgICAgICAgICAgIC8vICBjbGllbnQncyBjYWxsYmFjaworICAgICAgICAgICAgeHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPQorICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgeworICAgICAgICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIodGhpcy5yZXNwb25zZVRleHQpOworICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgIH0oKSk7CisKKyAgICAgICAgICAgIC8vIGRldGVjdCBuZXQ6OkVSUl9DT05ORUNUSU9OX1JFRlVTRUQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrLgorICAgICAgICAgICAgeHJlcS5vbmVycm9yID0KKyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9KCkpOworCisgICAgICAgIH0KKworICAgICAgICB4cmVxLm9wZW4oJ1BPU1QnLCB0aGlzLnVybCwgISFhc3luYyk7CisKKyAgICAgICAgLy8gYWRkIGN1c3RvbSBoZWFkZXJzCisgICAgICAgIE9iamVjdC5rZXlzKHNlbGYuY3VzdG9tSGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7CisgICAgICAgICAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIocHJvcCwgc2VsZi5jdXN0b21IZWFkZXJzW3Byb3BdKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgKHhyZXEuc2V0UmVxdWVzdEhlYWRlcikgeworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICAgICAgeHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS50aHJpZnQuanNvbjsgY2hhcnNldD11dGYtOCcpOworICAgICAgICB9CisKKyAgICAgICAgeHJlcS5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgICAgICBpZiAoYXN5bmMgJiYgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4cmVxLnJlYWR5U3RhdGUgIT0gNCkgeworICAgICAgICAgICAgdGhyb3cgJ2VuY291bnRlcmVkIGFuIHVua25vd24gYWpheCByZWFkeSBzdGF0ZTogJyArIHhyZXEucmVhZHlTdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh4cmVxLnN0YXR1cyAhPSAyMDApIHsKKyAgICAgICAgICAgIHRocm93ICdlbmNvdW50ZXJlZCBhIHVua25vd24gcmVxdWVzdCBzdGF0dXM6ICcgKyB4cmVxLnN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVjdl9idWYgPSB4cmVxLnJlc3BvbnNlVGV4dDsKKyAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy5ycG9zID0gMDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGpRdWVyeSBYSFIgb2JqZWN0IHRvIGJlIHVzZWQgZm9yIGEgVGhyaWZ0IHNlcnZlciBjYWxsLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjbGllbnQgLSBUaGUgVGhyaWZ0IFNlcnZpY2UgY2xpZW50IG9iamVjdCBnZW5lcmF0ZWQgYnkgdGhlIElETCBjb21waWxlci4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gcG9zdERhdGEgLSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCisgICAgICogQHBhcmFtIHtmdW5jdGlvbn0gYXJncyAtIFRoZSBvcmlnaW5hbCBjYWxsIGFyZ3VtZW50cyB3aXRoIHRoZSBzdWNjZXNzIGNhbGwgYmFjayBhdCB0aGUgZW5kLgorICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHJlY3ZfbWV0aG9kIC0gVGhlIFRocmlmdCBTZXJ2aWNlIENsaWVudCByZWNlaXZlIG1ldGhvZCBmb3IgdGhlIGNhbGwuCisgICAgICogQHJldHVybnMge29iamVjdH0gQSBuZXcgalF1ZXJ5IFhIUiBvYmplY3QuCisgICAgICogQHRocm93cyB7c3RyaW5nfSBJZiB0aGUgalF1ZXJ5IHZlcnNpb24gaXMgcHJpb3IgdG8gMS41IG9yIGlmIGpRdWVyeSBpcyBub3QgZm91bmQuCisgICAgICovCisgICAganFSZXF1ZXN0OiBmdW5jdGlvbihjbGllbnQsIHBvc3REYXRhLCBhcmdzLCByZWN2X21ldGhvZCkgeworICAgICAgICBpZiAodHlwZW9mIGpRdWVyeSA9PT0gJ3VuZGVmaW5lZCcgfHwKKyAgICAgICAgICAgIHR5cGVvZiBqUXVlcnkuRGVmZXJyZWQgPT09ICd1bmRlZmluZWQnKSB7CisgICAgICAgICAgICB0aHJvdyAnVGhyaWZ0LmpzIHJlcXVpcmVzIGpRdWVyeSAxLjUrIHRvIHVzZSBhc3luY2hyb25vdXMgcmVxdWVzdHMnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHRocmlmdFRyYW5zcG9ydCA9IHRoaXM7CisKKyAgICAgICAgdmFyIGpxWEhSID0galF1ZXJ5LmFqYXgoeworICAgICAgICAgICAgdXJsOiB0aGlzLnVybCwKKyAgICAgICAgICAgIGRhdGE6IHBvc3REYXRhLAorICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAorICAgICAgICAgICAgY2FjaGU6IGZhbHNlLAorICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnRocmlmdC5qc29uOyBjaGFyc2V0PXV0Zi04JywKKyAgICAgICAgICAgIGRhdGFUeXBlOiAndGV4dCB0aHJpZnQnLAorICAgICAgICAgICAgY29udmVydGVyczogeworICAgICAgICAgICAgICAgICd0ZXh0IHRocmlmdCcgOiBmdW5jdGlvbihyZXNwb25zZURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyaWZ0VHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzcG9uc2VEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVjdl9tZXRob2QuY2FsbChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGNvbnRleHQ6IGNsaWVudCwKKyAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5tYWtlQXJyYXkoYXJncykucG9wKCkKKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIGpxWEhSOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdG8gcHJvdmlkZSB0aGUgcHJvdG9jb2wgd2hlbiBkZXNlcmlhbGl6aW5nLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHN1cHBseSB0aGUgcHJvdG9jb2wuCisgICAgICovCisgICAgc2V0UmVjdkJ1ZmZlcjogZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRoaXMucmVjdl9idWYgPSBidWY7CisgICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgICAgICAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMucnBvcyA9IDA7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4sIFhIUiBhbHdheXMgcmV0dXJucyB0cnVlLgorICAgICAqIEByZWFkb25seQorICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgVHJ1ZS4KKyAgICAgKi8KKyAgICBpc09wZW46IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICAgICAqLworICAgIG9wZW46IGZ1bmN0aW9uKCkge30sCisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uLCB3aXRoIFhIUiB0aGlzIGlzIGEgbm9wLgorICAgICAqLworICAgIGNsb3NlOiBmdW5jdGlvbigpIHt9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHJlc3BvbnNlCisgICAgICogYnVmZmVyLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWQ6IGZ1bmN0aW9uKGxlbikgeworICAgICAgICB2YXIgYXZhaWwgPSB0aGlzLndwb3MgLSB0aGlzLnJwb3M7CisKKyAgICAgICAgaWYgKGF2YWlsID09PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJyc7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZ2l2ZSA9IGxlbjsKKworICAgICAgICBpZiAoYXZhaWwgPCBsZW4pIHsKKyAgICAgICAgICAgIGdpdmUgPSBhdmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOworICAgICAgICB0aGlzLnJwb3MgKz0gZ2l2ZTsKKworICAgICAgICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPworICAgICAgICByZXR1cm4gcmV0OworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IENoYXJhY3RlcnMgc2VudCBieSB0aGUgc2VydmVyLgorICAgICAqLworICAgIHJlYWRBbGw6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWN2X2J1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCBidWZmZXIgdG8gYnVmLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgICAgICovCisgICAgd3JpdGU6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnNlbmRfYnVmID0gYnVmOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZW5kIGJ1ZmZlci4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgICAgICovCisgICAgZ2V0U2VuZEJ1ZmZlcjogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOworICAgIH0KKworfTsKKworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBUcmFuc3BvcnQgbGF5ZXIgcGVyZm9ybXMgYnl0ZSBsZXZlbCBJL08KKyAqIGJldHdlZW4gUlBDIGNsaWVudHMgYW5kIHNlcnZlcnMuIFRoZSBKYXZhU2NyaXB0IFRXZWJTb2NrZXRUcmFuc3BvcnQgb2JqZWN0CisgKiB1c2VzIHRoZSBXZWJTb2NrZXQgcHJvdG9jb2wuIFRhcmdldCBzZXJ2ZXJzIG11c3QgaW1wbGVtZW50IFdlYlNvY2tldC4KKyAqIChzZWU6IG5vZGUuanMgZXhhbXBsZSBzZXJ2ZXJfaHR0cC5qcykuCisgKiBAZXhhbXBsZQorICogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0KCJodHRwOi8vbG9jYWxob3N0Ojg1ODUiKTsKKyAqLworVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQgPSBmdW5jdGlvbih1cmwpIHsKKyAgICB0aGlzLl9fcmVzZXQodXJsKTsKK307CisKK1RocmlmdC5UV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKKyAgICBfX3Jlc2V0OiBmdW5jdGlvbih1cmwpIHsKKyAgICAgIHRoaXMudXJsID0gdXJsOyAgICAgICAgICAgICAvL1doZXJlIHRvIGNvbm5lY3QKKyAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDsgICAgICAgICAvL1RoZSB3ZWIgc29ja2V0CisgICAgICB0aGlzLmNhbGxiYWNrcyA9IFtdOyAgICAgICAgLy9QZW5kaW5nIGNhbGxiYWNrcworICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgICAgIC8vQnVmZmVycy9DYWxsYmFjayBwYWlycyB3YWl0aW5nIHRvIGJlIHNlbnQKKyAgICAgIHRoaXMuc2VuZF9idWYgPSAnJzsgICAgICAgICAvL091dGJvdW5kIGRhdGEsIGltbXV0YWJsZSB1bnRpbCBzZW50CisgICAgICB0aGlzLnJlY3ZfYnVmID0gJyc7ICAgICAgICAgLy9JbmJvdW5kIGRhdGEKKyAgICAgIHRoaXMucmJfd3BvcyA9IDA7ICAgICAgICAgICAvL05ldHdvcmsgd3JpdGUgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKKyAgICAgIHRoaXMucmJfcnBvcyA9IDA7ICAgICAgICAgICAvL0NsaWVudCByZWFkIHBvc2l0aW9uIGluIHJlY2VpdmUgYnVmZmVyCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlbmRzIHRoZSBjdXJyZW50IFdTIHJlcXVlc3QgYW5kIHJlZ2lzdGVycyBjYWxsYmFjay4gVGhlIGFzeW5jCisgICAgICogcGFyYW1ldGVyIGlzIGlnbm9yZWQgKFdTIGZsdXNoIGlzIGFsd2F5cyBhc3luYykgYW5kIHRoZSBjYWxsYmFjaworICAgICAqIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAgICAgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZ25vcmVkLgorICAgICAqIEBwYXJhbSB7b2JqZWN0fSBjYWxsYmFjayAtIFRoZSBjbGllbnQgY29tcGxldGlvbiBjYWxsYmFjay4KKyAgICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKQorICAgICAqLworICAgIGZsdXNoOiBmdW5jdGlvbihhc3luYywgY2FsbGJhY2spIHsKKyAgICAgIHZhciBzZWxmID0gdGhpczsKKyAgICAgIGlmICh0aGlzLmlzT3BlbigpKSB7CisgICAgICAgIC8vU2VuZCBkYXRhIGFuZCByZWdpc3RlciBhIGNhbGxiYWNrIHRvIGludm9rZSB0aGUgY2xpZW50IGNhbGxiYWNrCisgICAgICAgIHRoaXMuc29ja2V0LnNlbmQodGhpcy5zZW5kX2J1Zik7CisgICAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9KCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vUXVldWUgdGhlIHNlbmQgdG8gZ28gb3V0IF9fb25PcGVuCisgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goeworICAgICAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKKyAgICAgICAgICBjYjogY2FsbGJhY2sKKyAgICAgICAgfSk7CisgICAgICB9CisgICAgfSwKKworICAgIF9fb25PcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICB2YXIgc2VsZiA9IHRoaXM7CisgICAgICAgaWYgKHRoaXMuc2VuZF9wZW5kaW5nLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQorICAgICAgICAgIC8vb3Blbiwgc2VuZCB0aGVtIG5vdworICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24oZWxlbSkgeworICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKKyAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKKyAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOworICAgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgfSgpKSk7CisgICAgICAgICAgfSk7CisgICAgICAgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgICAgICB9CisgICAgfSwKKworICAgIF9fb25DbG9zZTogZnVuY3Rpb24oZXZ0KSB7CisgICAgICB0aGlzLl9fcmVzZXQodGhpcy51cmwpOworICAgIH0sCisKKyAgICBfX29uTWVzc2FnZTogZnVuY3Rpb24oZXZ0KSB7CisgICAgICBpZiAodGhpcy5jYWxsYmFja3MubGVuZ3RoKSB7CisgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNoaWZ0KCkoZXZ0LmRhdGEpOworICAgICAgfQorICAgIH0sCisKKyAgICBfX29uRXJyb3I6IGZ1bmN0aW9uKGV2dCkgeworICAgICAgY29uc29sZS5sb2coJ1RocmlmdCBXZWJTb2NrZXQgRXJyb3I6ICcgKyBldnQudG9TdHJpbmcoKSk7CisgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBidWZmZXIgdG8gdXNlIHdoZW4gcmVjZWl2aW5nIHNlcnZlciByZXNwb25zZXMuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBzZXJ2ZXIgcmVzcG9uc2VzLgorICAgICAqLworICAgIHNldFJlY3ZCdWZmZXI6IGZ1bmN0aW9uKGJ1ZikgeworICAgICAgICB0aGlzLnJlY3ZfYnVmID0gYnVmOworICAgICAgICB0aGlzLnJlY3ZfYnVmX3N6ID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgICAgICAgIHRoaXMud3BvcyA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICAgICAgICB0aGlzLnJwb3MgPSAwOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge2Jvb2xlYW59CisgICAgICovCisgICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0ICYmIHRoaXMuc29ja2V0LnJlYWR5U3RhdGUgPT0gdGhpcy5zb2NrZXQuT1BFTjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogT3BlbnMgdGhlIHRyYW5zcG9ydCBjb25uZWN0aW9uCisgICAgICovCisgICAgb3BlbjogZnVuY3Rpb24oKSB7CisgICAgICAvL0lmIE9QRU4vQ09OTkVDVElORy9DTE9TSU5HIGlnbm9yZSBhZGRpdGlvbmFsIG9wZW5zCisgICAgICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodGhpcy51cmwpOworICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25tZXNzYWdlID0gdGhpcy5fX29uTWVzc2FnZS5iaW5kKHRoaXMpOworICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcyk7CisgICAgICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICAgICAqLworICAgIGNsb3NlOiBmdW5jdGlvbigpIHsKKyAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSByZXNwb25zZQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0ge251bWJlcn0gbGVuIC0gVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkOiBmdW5jdGlvbihsZW4pIHsKKyAgICAgICAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgICAgICAgIGlmIChhdmFpbCA9PT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICcnOworICAgICAgICB9CisKKyAgICAgICAgdmFyIGdpdmUgPSBsZW47CisKKyAgICAgICAgaWYgKGF2YWlsIDwgbGVuKSB7CisgICAgICAgICAgICBnaXZlID0gYXZhaWw7CisgICAgICAgIH0KKworICAgICAgICB2YXIgcmV0ID0gdGhpcy5yZWFkX2J1Zi5zdWJzdHIodGhpcy5ycG9zLCBnaXZlKTsKKyAgICAgICAgdGhpcy5ycG9zICs9IGdpdmU7CisKKyAgICAgICAgLy9jbGVhciBidWYgd2hlbiBjb21wbGV0ZT8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW50aXJlIHJlc3BvbnNlIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaGFyYWN0ZXJzIHNlbnQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICByZWFkQWxsOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWY7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gYnVmIC0gVGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqLworICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgICAgICogQHJlYWRvbmx5CisgICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHNlbmQgYnVmZmVyLgorICAgICAqLworICAgIGdldFNlbmRCdWZmZXI6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgICB9CisKK307CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHNlcmlhbGl6ZSB0by9mcm9tLgorICogQGNsYXNzZGVzYyBBcGFjaGUgVGhyaWZ0IFByb3RvY29scyBwZXJmb3JtIHNlcmlhbGl6YXRpb24gd2hpY2ggZW5hYmxlcyBjcm9zcworICogbGFuZ3VhZ2UgUlBDLiBUaGUgUHJvdG9jb2wgdHlwZSBpcyB0aGUgSmF2YVNjcmlwdCBicm93c2VyIGltcGxlbWVudGF0aW9uCisgKiBvZiB0aGUgQXBhY2hlIFRocmlmdCBUSlNPTlByb3RvY29sLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICovCitUaHJpZnQuVEpTT05Qcm90b2NvbCA9IFRocmlmdC5Qcm90b2NvbCA9IGZ1bmN0aW9uKHRyYW5zcG9ydCkgeworICAgIHRoaXMudHN0YWNrID0gW107CisgICAgdGhpcy50cG9zID0gW107CisgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Cit9OworCisvKioKKyAqIFRocmlmdCBJREwgdHlwZSBJZCB0byBzdHJpbmcgbWFwcGluZy4KKyAqIEByZWFkb25seQorICogQHNlZSB7QGxpbmsgVGhyaWZ0LlR5cGV9CisgKi8KK1RocmlmdC5Qcm90b2NvbC5UeXBlID0ge307CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5CT09MXSA9ICcidGYiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkJZVEVdID0gJyJpOCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTE2XSA9ICciaTE2Iic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JMzJdID0gJyJpMzIiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkk2NF0gPSAnImk2NCInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuRE9VQkxFXSA9ICciZGJsIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TVFJVQ1RdID0gJyJyZWMiJzsKK1RocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLlNUUklOR10gPSAnInN0ciInOworVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuTUFQXSA9ICcibWFwIic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5MSVNUXSA9ICcibHN0Iic7CitUaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5TRVRdID0gJyJzZXQiJzsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUaHJpZnQuUHJvdG9jb2wuUlR5cGUgPSB7fTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS50ZiA9IFRocmlmdC5UeXBlLkJPT0w7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTggPSBUaHJpZnQuVHlwZS5CWVRFOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmkxNiA9IFRocmlmdC5UeXBlLkkxNjsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5pMzIgPSBUaHJpZnQuVHlwZS5JMzI7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTY0ID0gVGhyaWZ0LlR5cGUuSTY0OworVGhyaWZ0LlByb3RvY29sLlJUeXBlLmRibCA9IFRocmlmdC5UeXBlLkRPVUJMRTsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5yZWMgPSBUaHJpZnQuVHlwZS5TVFJVQ1Q7CitUaHJpZnQuUHJvdG9jb2wuUlR5cGUuc3RyID0gVGhyaWZ0LlR5cGUuU1RSSU5HOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLm1hcCA9IFRocmlmdC5UeXBlLk1BUDsKK1RocmlmdC5Qcm90b2NvbC5SVHlwZS5sc3QgPSBUaHJpZnQuVHlwZS5MSVNUOworVGhyaWZ0LlByb3RvY29sLlJUeXBlLnNldCA9IFRocmlmdC5UeXBlLlNFVDsKKworLyoqCisgKiBUaGUgVEpTT05Qcm90b2NvbCB2ZXJzaW9uIG51bWJlci4KKyAqIEByZWFkb25seQorICogQGNvbnN0IHtudW1iZXJ9IFZlcnNpb24KKyAqIEBtZW1iZXJvZiBUaHJpZnQuUHJvdG9jb2wKKyAqLworIFRocmlmdC5Qcm90b2NvbC5WZXJzaW9uID0gMTsKKworVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZSA9IHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAgICAgKiBAcmVhZG9ubHkKKyAgICAgKiBAcmV0dXJucyB7VGhyaWZ0LlRyYW5zcG9ydH0gVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LgorICAgICAqLworICAgIGdldFRyYW5zcG9ydDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydDsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuCisgICAgICogQHBhcmFtIHtUaHJpZnQuTWVzc2FnZVR5cGV9IG1lc3NhZ2VUeXBlIC0gVGhlIHR5cGUgb2YgbWV0aG9kIGNhbGwuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUJlZ2luOiBmdW5jdGlvbihuYW1lLCBtZXNzYWdlVHlwZSwgc2VxaWQpIHsKKyAgICAgICAgdGhpcy50c3RhY2sgPSBbXTsKKyAgICAgICAgdGhpcy50cG9zID0gW107CisKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlZlcnNpb24sICciJyArCisgICAgICAgICAgICBuYW1lICsgJyInLCBtZXNzYWdlVHlwZSwgc2VxaWRdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICAgICAqLworICAgIHdyaXRlTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBvYmogPSB0aGlzLnRzdGFjay5wb3AoKTsKKworICAgICAgICB0aGlzLndvYmogPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICAgICAgdGhpcy53b2JqLnB1c2gob2JqKTsKKworICAgICAgICB0aGlzLndidWYgPSAnWycgKyB0aGlzLndvYmouam9pbignLCcpICsgJ10nOworCisgICAgICAgIHRoaXMudHJhbnNwb3J0LndyaXRlKHRoaXMud2J1Zik7CisgICAgIH0sCisKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdC4KKyAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgICAgICovCisgICAgd3JpdGVTdHJ1Y3RCZWdpbjogZnVuY3Rpb24obmFtZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKHt9KTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LgorICAgICAqLworICAgIHdyaXRlU3RydWN0RW5kOiBmdW5jdGlvbigpIHsKKworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKyAgICAgICAgdmFyIHN0cnVjdCA9IHRoaXMudHN0YWNrW3BdOworICAgICAgICB2YXIgc3RyID0gJ3snOworICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3RydWN0KSB7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHIgKz0gJywnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHIgKz0ga2V5ICsgJzonICsgc3RydWN0W2tleV07CisgICAgICAgIH0KKworICAgICAgICBzdHIgKz0gJ30nOworICAgICAgICB0aGlzLnRzdGFja1twXSA9IHN0cjsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgc3RydWN0IGZpZWxkLgorICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlByb3RvY29sLlR5cGV9IGZpZWxkVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGZpZWxkLgorICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZElkIC0gVGhlIGZpZWxkJ3MgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgICovCisgICAgd3JpdGVGaWVsZEJlZ2luOiBmdW5jdGlvbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpIHsKKyAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh7ICdmaWVsZElkJzogJyInICsKKyAgICAgICAgICAgIGZpZWxkSWQgKyAnIicsICdmaWVsZFR5cGUnOiBUaHJpZnQuUHJvdG9jb2wuVHlwZVtmaWVsZFR5cGVdCisgICAgICAgIH0pOworCisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLgorICAgICAqLworICAgIHdyaXRlRmllbGRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICAgICAgdmFyIGZpZWxkSW5mbyA9IHRoaXMudHN0YWNrLnBvcCgpOworCisgICAgICAgIHRoaXMudHN0YWNrW3RoaXMudHN0YWNrLmxlbmd0aCAtIDFdW2ZpZWxkSW5mby5maWVsZElkXSA9ICd7JyArCisgICAgICAgICAgICBmaWVsZEluZm8uZmllbGRUeXBlICsgJzonICsgdmFsdWUgKyAnfSc7CisgICAgICAgIHRoaXMudHBvcy5wb3AoKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgZmllbGRzIGZvciBhIHN0cnVjdC4KKyAgICAgKi8KKyAgICB3cml0ZUZpZWxkU3RvcDogZnVuY3Rpb24oKSB7CisgICAgICAgIC8vbmEKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHtUaHJpZnQuVHlwZX0ga2V5VHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGtleS4KKyAgICAgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSB2YWxUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcCAoaWdub3JlZCkuCisgICAgICovCisgICAgd3JpdGVNYXBCZWdpbjogZnVuY3Rpb24oa2V5VHlwZSwgdmFsVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtrZXlUeXBlXSwKKyAgICAgICAgICAgIFRocmlmdC5Qcm90b2NvbC5UeXBlW3ZhbFR5cGVdLCAwXSk7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICAgKi8KKyAgICB3cml0ZU1hcEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgICAgICAgIGlmIChwID09IHRoaXMudHN0YWNrLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh0aGlzLnRzdGFjay5sZW5ndGggLSBwIC0gMSkgJSAyICE9PSAwKSB7CisgICAgICAgICAgICB0aGlzLnRzdGFjay5wdXNoKCcnKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzaXplID0gKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAvIDI7CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF1bdGhpcy50c3RhY2tbcF0ubGVuZ3RoIC0gMV0gPSBzaXplOworCisgICAgICAgIHZhciBtYXAgPSAnfSc7CisgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgICAgICAgICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICAgICAgICAgIHZhciBrID0gdGhpcy50c3RhY2sucG9wKCk7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXAgPSAnLCcgKyBtYXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghIGlzTmFOKGspKSB7IGsgPSAnIicgKyBrICsgJyInOyB9IC8vanNvbiAia2V5cyIgbmVlZCB0byBiZSBzdHJpbmdzCisgICAgICAgICAgICBtYXAgPSBrICsgJzonICsgdiArIG1hcDsKKyAgICAgICAgfQorICAgICAgICBtYXAgPSAneycgKyBtYXA7CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaChtYXApOworICAgICAgICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbGlzdCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlTGlzdEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtlbGVtVHlwZV0sIHNpemVdKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICAgKi8KKyAgICB3cml0ZUxpc3RFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldCBjb2xsZWN0aW9uLgorICAgICAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgICAqLworICAgIHdyaXRlU2V0QmVnaW46IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goW1RocmlmdC5Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgICovCisgICAgd3JpdGVTZXRFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgcCA9IHRoaXMudHBvcy5wb3AoKTsKKworICAgICAgICB3aGlsZSAodGhpcy50c3RhY2subGVuZ3RoID4gcCArIDEpIHsKKyAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisgICAgfSwKKworICAgIC8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLworICAgIHdyaXRlQm9vbDogZnVuY3Rpb24odmFsdWUpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaCh2YWx1ZSA/IDEgOiAwKTsKKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KKyAgICB3cml0ZUJ5dGU6IGZ1bmN0aW9uKGk4KSB7CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTgpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTE2OiBmdW5jdGlvbihpMTYpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMTYpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTMyOiBmdW5jdGlvbihpMzIpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMzIpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlSTY0OiBmdW5jdGlvbihpNjQpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChpNjQpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbihkYmwpIHsKKyAgICAgICAgdGhpcy50c3RhY2sucHVzaChkYmwpOworICAgIH0sCisKKyAgICAvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworICAgIHdyaXRlU3RyaW5nOiBmdW5jdGlvbihzdHIpIHsKKyAgICAgICAgLy8gV2UgZG8gbm90IGVuY29kZSB1cmkgY29tcG9uZW50cyBmb3Igd2lyZSB0cmFuc2ZlcjoKKyAgICAgICAgaWYgKHN0ciA9PT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaChudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgorICAgICAgICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaAorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzIGRvdWJsZSBiYWNrc2xhc2gKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGInKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzcGFjZTogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcYic7ICAvLyB3cml0ZSBvdXQgYXM6IFxiIgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcZicpIHsgICAgLy8gYSBzaW5nbGUgZm9ybWZlZWQ6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGYnOyAgLy8gd3JpdGUgb3V0IGFzOiBcZiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXG4nKSB7ICAgIC8vIGEgc2luZ2xlIG5ld2xpbmU6IGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXG4nOyAgLy8gd3JpdGUgb3V0IGFzOiBcbiIKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHInKSB7ICAgIC8vIGEgc2luZ2xlIHJldHVybjogaW52aXNpYmxlCisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xccic7ICAvLyB3cml0ZSBvdXQgYXM6IFxyIgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcdCcpIHsgICAgLy8gYSBzaW5nbGUgdGFiOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFx0JzsgIC8vIHdyaXRlIG91dCBhczogXHQiCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSBjaDsgICAgIC8vIEVsc2UgaXQgbmVlZCBub3QgYmUgZXNjYXBlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2goJyInICsgZXNjYXBlZFN0cmluZyArICciJyk7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgLyoqIFNlcmlhbGl6ZXMgYSBzdHJpbmcgKi8KKyAgICB3cml0ZUJpbmFyeTogZnVuY3Rpb24oYmluYXJ5KSB7CisgICAgICAgIHZhciBzdHIgPSAnJzsKKyAgICAgICAgaWYgKHR5cGVvZiBiaW5hcnkgPT0gJ3N0cmluZycpIHsKKyAgICAgICAgICAgIHN0ciA9IGJpbmFyeTsKKyAgICAgICAgfSBlbHNlIGlmIChiaW5hcnkgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7CisgICAgICAgICAgICB2YXIgYXJyID0gYmluYXJ5OworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBzdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShhcnJbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignd3JpdGVCaW5hcnkgb25seSBhY2NlcHRzIFN0cmluZyBvciBVaW50OEFycmF5LicpOworICAgICAgICB9CisgICAgICAgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnRvYShzdHIpICsgJyInKTsKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZSBtZXRob2QuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuTWVzc2FnZVR5cGV9IG10eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSBjYWxsLgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgorICAgICAqLworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1lc3NhZ2VCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHRoaXMucnN0YWNrID0gW107CisgICAgICAgIHRoaXMucnBvcyA9IFtdOworCisgICAgICAgIGlmICh0eXBlb2YgSlNPTiAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEpTT04ucGFyc2UgPT09ICdmdW5jdGlvbicpIHsKKyAgICAgICAgICAgIHRoaXMucm9iaiA9IEpTT04ucGFyc2UodGhpcy50cmFuc3BvcnQucmVhZEFsbCgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgalF1ZXJ5ICE9PSAndW5kZWZpbmVkJykgeworICAgICAgICAgICAgdGhpcy5yb2JqID0galF1ZXJ5LnBhcnNlSlNPTih0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5yb2JqID0gZXZhbCh0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKyAgICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKTsKKworICAgICAgICBpZiAodmVyc2lvbiAhPSBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbikgeworICAgICAgICAgICAgdGhyb3cgJ1dyb25nIHRocmlmdCBwcm90b2NvbCB2ZXJzaW9uOiAnICsgdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIHIuZm5hbWUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgICAgICAgci5tdHlwZSA9IHRoaXMucm9iai5zaGlmdCgpOworICAgICAgICByLnJzZXFpZCA9IHRoaXMucm9iai5zaGlmdCgpOworCisKKyAgICAgICAgLy9nZXQgdG8gdGhlIG1haW4gb2JqCisgICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yb2JqLnNoaWZ0KCkpOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtZXNzYWdlLiAqLworICAgIHJlYWRNZXNzYWdlRW5kOiBmdW5jdGlvbigpIHsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgICAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QgKGlnbm9yZWQpCisgICAgICogQHJldHVybnMge29iamVjdH0gLSBBbiBvYmplY3Qgd2l0aCBhbiBlbXB0eSBzdHJpbmcgZm5hbWUgcHJvcGVydHkKKyAgICAgKi8KKyAgICByZWFkU3RydWN0QmVnaW46IGZ1bmN0aW9uKG5hbWUpIHsKKyAgICAgICAgdmFyIHIgPSB7fTsKKyAgICAgICAgci5mbmFtZSA9ICcnOworCisgICAgICAgIC8vaW5jYXNlIHRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RydWN0cworICAgICAgICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0gaW5zdGFuY2VvZiBBcnJheSkgeworICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXS5zaGlmdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuICovCisgICAgcmVhZFN0cnVjdEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAyXSBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAgICAgICBAcHJvcGVydHkge3N0cmluZ30gZm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGFsd2F5cyAnJykuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZnR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgICBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLgorICAgICAqIEByZXR1cm5zIHtBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZEZpZWxkQmVnaW46IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgciA9IHt9OworCisgICAgICAgIHZhciBmaWQgPSAtMTsKKyAgICAgICAgdmFyIGZ0eXBlID0gVGhyaWZ0LlR5cGUuU1RPUDsKKworICAgICAgICAvL2dldCBhIGZpZWxkSWQKKyAgICAgICAgZm9yICh2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgICAgICAgICBpZiAoZiA9PT0gbnVsbCkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlkID0gcGFyc2VJbnQoZiwgMTApOworICAgICAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKworICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgICAgICAgICAgLy9yZW1vdmUgc28gd2UgZG9uJ3Qgc2VlIGl0IGFnYWluCisgICAgICAgICAgICBkZWxldGUgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmaWVsZCk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpZCAhPSAtMSkgeworCisgICAgICAgICAgICAvL3Nob3VsZCBvbmx5IGJlIDEgb2YgdGhlc2UgYnV0IHRoaXMgaXMgdGhlIG9ubHkKKyAgICAgICAgICAgIC8vd2F5IHRvIG1hdGNoIGEga2V5CisgICAgICAgICAgICBmb3IgKHZhciBpIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ldID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ldOworICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdID0KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByLmZuYW1lID0gJyc7CisgICAgICAgIHIuZnR5cGUgPSBmdHlwZTsKKyAgICAgICAgci5maWQgPSBmaWQ7CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLiAqLworICAgIHJlYWRGaWVsZEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCk7CisKKyAgICAgICAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCisgICAgICAgIHdoaWxlICh0aGlzLnJzdGFjay5sZW5ndGggPiBwb3MpIHsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB9CisKKyAgICB9LAorCisgICAgLyoqCisgICAgICAgQGNsYXNzCisgICAgICAgQG5hbWUgQW5vblJlYWRNYXBCZWdpblJldHVybgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGt0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICAgICAgIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IHZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFsdWUuCisgICAgICAgQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCisgICAgICovCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgICAgICogQHJldHVybnMge0Fub25SZWFkTWFwQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZE1hcEJlZ2luOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIG1hcCA9IHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB2YXIgZmlyc3QgPSBtYXAuc2hpZnQoKTsKKyAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcCk7CisgICAgICAgICAgbWFwID0gZmlyc3Q7CisgICAgICAgICAgZmlyc3QgPSBtYXAuc2hpZnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByID0ge307CisgICAgICAgIHIua3R5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbZmlyc3RdOworICAgICAgICByLnZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKKyAgICAgICAgci5zaXplID0gbWFwLnNoaWZ0KCk7CisKKworICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworICAgICAgICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKKworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbWFwLiAqLworICAgIHJlYWRNYXBFbmQ6IGZ1bmN0aW9uKCkgeworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgIH0sCisKKyAgICAvKioKKyAgICAgICBAY2xhc3MKKyAgICAgICBAbmFtZSBBbm9uUmVhZENvbEJlZ2luUmV0dXJuCisgICAgICAgQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0gZXR5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBlbGVtZW50LgorICAgICAgIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCisgICAgICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgICAgICovCisgICAgcmVhZExpc3RCZWdpbjogZnVuY3Rpb24oKSB7CisgICAgICAgIHZhciBsaXN0ID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisKKyAgICAgICAgdmFyIHIgPSB7fTsKKyAgICAgICAgci5ldHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOworICAgICAgICByLnNpemUgPSBsaXN0LnNoaWZ0KCk7CisKKyAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgICAgICAgdGhpcy5yc3RhY2sucHVzaChsaXN0LnNoaWZ0KCkpOworCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LiAqLworICAgIHJlYWRMaXN0RW5kOiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKSAtIDI7CisgICAgICAgIHZhciBzdCA9IHRoaXMucnN0YWNrOworICAgICAgICBzdC5wb3AoKTsKKyAgICAgICAgaWYgKHN0IGluc3RhbmNlb2YgQXJyYXkgJiYgc3QubGVuZ3RoID4gcG9zICYmIHN0W3Bvc10ubGVuZ3RoID4gMCkgeworICAgICAgICAgIHN0LnB1c2goc3RbcG9zXS5zaGlmdCgpKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHNldC4KKyAgICAgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAgICAgKi8KKyAgICByZWFkU2V0QmVnaW46IGZ1bmN0aW9uKGVsZW1UeXBlLCBzaXplKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oZWxlbVR5cGUsIHNpemUpOworICAgIH0sCisKKyAgICAvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuICovCisgICAgcmVhZFNldEVuZDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvCisgICAgICogIEZhbHNlIHVubGVzcyB0aGUgbmV4dCBudW1iZXIgaW4gdGhlIHByb3RvY29sIGJ1ZmZlcgorICAgICAqICBpcyAxLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyBUcnVlICovCisgICAgcmVhZEJvb2w6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOworCisgICAgICAgIGlmIChyICE9PSBudWxsICYmIHIudmFsdWUgPT0gJzEnKSB7CisgICAgICAgICAgICByLnZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHIudmFsdWUgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRCeXRlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRJMTY6IGZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEkzMjogZnVuY3Rpb24oZikgeworICAgICAgICBpZiAoZiA9PT0gdW5kZWZpbmVkKSB7CisgICAgICAgICAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisgICAgICAgIH0KKworICAgICAgICB2YXIgciA9IHt9OworCisgICAgICAgIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChmLmxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghZi5pc1JldmVyc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGYucmV2ZXJzZSgpOworICAgICAgICAgICAgICAgICAgICBmLmlzUmV2ZXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByLnZhbHVlID0gZi5wb3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgICAgICAgICAgIGZvciAodmFyIGkgaW4gZikgeworICAgICAgICAgICAgICAgIGlmIChpID09PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmW2ldKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgZltpXTsKKworICAgICAgICAgICAgICAgIHIudmFsdWUgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByLnZhbHVlID0gZjsKKyAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfSwKKworICAgIC8qKiBSZXR1cm5zIHRoZSBhbiBvYmplY3Qgd2l0aCBhIHZhbHVlIHByb3BlcnR5IHNldCB0byB0aGUKKyAgICAgICAgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCisgICAgcmVhZEk2NDogZnVuY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkRG91YmxlOiBmdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworICAgIH0sCisKKyAgICAvKiogUmV0dXJucyB0aGUgYW4gb2JqZWN0IHdpdGggYSB2YWx1ZSBwcm9wZXJ0eSBzZXQgdG8gdGhlCisgICAgICAgIG5leHQgdmFsdWUgZm91bmQgaW4gdGhlIHByb3RvY29sIGJ1ZmZlciAqLworICAgIHJlYWRTdHJpbmc6IGZ1bmN0aW9uKCkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEkzMigpOworICAgICAgICByZXR1cm4gcjsKKyAgICB9LAorCisgICAgLyoqIFJldHVybnMgdGhlIGFuIG9iamVjdCB3aXRoIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZQorICAgICAgICBuZXh0IHZhbHVlIGZvdW5kIGluIHRoZSBwcm90b2NvbCBidWZmZXIgKi8KKyAgICByZWFkQmluYXJ5OiBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKKyAgICAgICAgci52YWx1ZSA9IGF0b2Ioci52YWx1ZSk7CisgICAgICAgIHJldHVybiByOworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEgKi8KKyAgICBza2lwOiBmdW5jdGlvbih0eXBlKSB7CisgICAgICAgIHZhciByZXQsIGk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEJvb2woKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5CWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRCeXRlKCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuSTE2OgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRJMTYoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5JMzI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLkk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTY0KCk7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWREb3VibGUoKTsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldC5mdHlwZSA9PSBUaHJpZnQuVHlwZS5TVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0LmZ0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGNhc2UgVGhyaWZ0LlR5cGUuTUFQOgorICAgICAgICAgICAgICAgIHJldCA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJldC5zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yc3RhY2subGVuZ3RoID4gdGhpcy5ycG9zW3RoaXMucnBvcy5sZW5ndGggLSAxXSArIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXAocmV0Lmt0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHJldC52dHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBjYXNlIFRocmlmdC5UeXBlLlNFVDoKKyAgICAgICAgICAgICAgICByZXQgPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQuZXR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgY2FzZSBUaHJpZnQuVHlwZS5MSVNUOgorICAgICAgICAgICAgICAgIHJldCA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcChyZXQuZXR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKworLyoqCisgKiBJbml0aWFsaXplcyBhIE11dGlscGxleFByb3RvY29sIEltcGxlbWVudGF0aW9uIGFzIGEgV3JhcHBlciBmb3IgVGhyaWZ0LlByb3RvY29sCisgKiBAY29uc3RydWN0b3IKKyAqLworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sID0gZnVuY3Rpb24oc3J2TmFtZSwgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKSB7CisgICAgVGhyaWZ0LlByb3RvY29sLmNhbGwodGhpcywgdHJhbnMsIHN0cmljdFJlYWQsIHN0cmljdFdyaXRlKTsKKyAgICB0aGlzLnNlcnZpY2VOYW1lID0gc3J2TmFtZTsKK307CitUaHJpZnQuaW5oZXJpdHMoVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLCBUaHJpZnQuUHJvdG9jb2wsICdtdWx0aXBsZXhQcm90b2NvbCcpOworCisvKiogT3ZlcnJpZGUgd3JpdGVNZXNzYWdlQmVnaW4gbWV0aG9kIG9mIHByb3RvdHlwZSovCitUaHJpZnQuTXVsdGlwbGV4UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgc2VxaWQpIHsKKworICAgIGlmICh0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCB8fCB0eXBlID09PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCB0aGlzLnNlcnZpY2VOYW1lICsgJzonICsgbmFtZSwgdHlwZSwgc2VxaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCBuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgfQorfTsKKworVGhyaWZ0Lk11bHRpcGxleGVyID0gZnVuY3Rpb24oKSB7CisgICAgdGhpcy5zZXFpZCA9IDA7Cit9OworCisvKiogSW5zdGFudGlhdGVzIGEgbXVsdGlwbGV4ZWQgY2xpZW50IGZvciBhIHNwZWNpZmljIHNlcnZpY2UKKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtTdHJpbmd9IHNlcnZpY2VOYW1lIC0gVGhlIHRyYW5zcG9ydCB0byBzZXJpYWxpemUgdG8vZnJvbS4KKyAqIEBwYXJhbSB7VGhyaWZ0LlNlcnZpY2VDbGllbnR9IFNDbCAtIFRoZSBTZXJ2aWNlIENsaWVudCBDbGFzcworICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUaHJpZnQuVHJhbnNwb3J0IGluc3RhbmNlIHdoaWNoIHByb3ZpZGVzIHJlbW90ZSBob3N0OnBvcnQKKyAqIEBleGFtcGxlCisgKiAgICB2YXIgbXAgPSBuZXcgVGhyaWZ0Lk11bHRpcGxleGVyKCk7CisgKiAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MC9mb28udGhyaWZ0Iik7CisgKiAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgKiAgICB2YXIgY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KCdBdXRoU2VydmljZScsIEF1dGhTZXJ2aWNlQ2xpZW50LCB0cmFuc3BvcnQpOworKi8KK1RocmlmdC5NdWx0aXBsZXhlci5wcm90b3R5cGUuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oc2VydmljZU5hbWUsIFNDbCwgdHJhbnNwb3J0KSB7CisgICAgaWYgKFNDbC5DbGllbnQpIHsKKyAgICAgICAgU0NsID0gU0NsLkNsaWVudDsKKyAgICB9CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIFNDbC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7CisgICAgICAgIHNlbGYuc2VxaWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxaWQ7CisgICAgfTsKKyAgICB2YXIgY2xpZW50ID0gbmV3IFNDbChuZXcgVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sKHNlcnZpY2VOYW1lLCB0cmFuc3BvcnQpKTsKKworICAgIHJldHVybiBjbGllbnQ7Cit9OworCisKKwordmFyIGNvcHlMaXN0LCBjb3B5TWFwOworCitjb3B5TGlzdCA9IGZ1bmN0aW9uKGxzdCwgdHlwZXMpIHsKKworICBpZiAoIWxzdCkge3JldHVybiBsc3Q7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciBsZW4gPSBsc3QubGVuZ3RoLCByZXN1bHQgPSBbXSwgaSwgdmFsOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICB2YWwgPSBsc3RbaV07CisgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHZhbCk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgIHJlc3VsdC5wdXNoKHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlKHZhbCkpOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpIHsKKworICBpZiAoIW9iaikge3JldHVybiBvYmo7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciByZXN1bHQgPSB7fSwgdmFsOworICBmb3IgKHZhciBwcm9wIGluIG9iaikgeworICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHsKKyAgICAgIHZhbCA9IG9ialtwcm9wXTsKKyAgICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHZhbDsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKHR5cGUgPT09IGNvcHlNYXAgfHwgdHlwZSA9PT0gY29weUxpc3QpIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gdHlwZSh2YWwsIHR5cGVzLnNsaWNlKDEpKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICByZXN1bHRbcHJvcF0gPSBuZXcgVHlwZSh2YWwpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfTsKKworVGhyaWZ0LmNvcHlNYXAgPSBjb3B5TWFwOworVGhyaWZ0LmNvcHlMaXN0ID0gY29weUxpc3Q7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9SRUFETUUubWQgYi9saWIvanMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMTQwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDY4IEBACitUaHJpZnQgSmF2YXNjcmlwdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cworUlBDIGNsaWVudHMgdXNpbmcgdGhlIEpTT04gcHJvdG9jb2wgb3ZlciBIdHRwW3NdIHdpdGggWEhSCithbmQgV2ViU29ja2V0LgorCitMaWNlbnNlCistLS0tLS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworVGVzdCBTZXJ2ZXJzCistLS0tLS0tLS0tLS0KK2Ryd3hyLXhyLXggMiByYW5keSByYW5keSAgNDA5NiBGZWIgIDggMTU6NDQgc2VjCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDIxODMgRmViICA5IDA0OjAxIHNlcnZlcl9odHRwLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDIzODYgRmViICA5IDA1OjM5IHNlcnZlcl9odHRwcy5qcworCitzZXJ2ZXJfaHR0cC5qcyBpcyBhIE5vZGUuanMgd2ViIHNlcnZlciB3aGljaCBzdXBwb3J0IHRoZQorc3RhbmRhcmQgQXBhY2hlIFRocmlmdCB0ZXN0IHN1aXRlICh0aHJpZnQvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCkuCitUaGUgc2VydmVyIHN1cHBvcnRzIEFwYWNoZSBUaHJpZnQgWEhSIGFuZCBXZWJTb2NrZXQgY2xpZW50cy4KKworc2VydmVyX2h0dHBzLmpzIGlzIHRoZSBzYW1lIGJ1dCB1c2VzIFNTTC9UTFMuIFRoZSBzZXJ2ZXIga2V5IAorYW5kIGNlcnQgYXJlIHB1bGxlZCBmcm9tIHRoZSB0aHJpZnQvdGVzdC9rZXlzIGZvbGRlci4KKworQm90aCBvZiB0aGVzZSBzZXJ2ZXJzIHN1cHBvcnQgV2ViU29ja2V0ICh0aGUgaHR0cDogc3VwcG9ydHMgd3M6LAorYW5kIHRoZSBodHRwczogc3VwcG9ydCB3c3M6KS4KKworVG8gcnVuIHRoZSBjbGllbnQgdGVzdCB3aXRoIHRoZSBKYXZhIHRlc3Qgc2VydmVyIHVzZTogCiskIG1ha2UgY2hlY2sgKHJlcXVpcmVzIHRoZSBBcGFjaGUgVGhyaWZ0IEphdmEgYnJhbmNoIAorYW5kIG1ha2UgY2hlY2sgbXVzdCBoYXZlIGJlZW4gcnVuIGluIHRocmlmdC9saWIvamF2YSAKK3ByZXZpb3VzbHkpLgorCitUbyBydW4gdGhlIGNsaWVudCB0ZXN0cyB3aXRoIHRoZSBOb2RlIHNlcnZlcnMgcnVuIHRoZSBncnVudAorIGJ1aWxkIGluIHRoZSBwYXJlbnQganMgZGlyZWN0b3J5IChzZWUgUkVBRE1FIHRoZXJlKS4KKyAKK1Rlc3QgQ2xpZW50cworLS0tLS0tLS0tLS0tCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgMTM1NTggRmViICA5IDA3OjE4IHRlc3QtYXN5bmMuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgNTcyNCBGZWIgIDkgMDM6NDUgdGVzdF9oYW5kbGVyLmpzCistcnd4ci14ci14IDEgcmFuZHkgcmFuZHkgIDI3MTkgRmViICA5IDA2OjA0IHRlc3QuaHRtbAorLXJ3LXItLXItLSAxIHJhbmR5IHJhbmR5ICA0NjExIEZlYiAgOSAwNjowNSB0ZXN0LWpxLmpzCistcnd4ci14ci14IDEgcmFuZHkgcmFuZHkgMTIxNTMgRmViICA5IDA2OjA0IHRlc3QuanMKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMjU5MyBGZWIgIDkgMDY6MTYgdGVzdC1ub2pxLmh0bWwKKy1ydy1yLS1yLS0gMSByYW5keSByYW5keSAgMTQ1MCBGZWIgIDkgMDY6MTQgdGVzdC1ub2pxLmpzCistcnctci0tci0tIDEgcmFuZHkgcmFuZHkgIDI4NDcgRmViICA5IDA2OjMxIHRlc3R3cy5odG1sCisKK1RoZXJlIGFyZSB0aHJlZSBodG1sIHRlc3QgZHJpdmVyIGZpbGVzLCBhbGwgb2Ygd2hpY2ggYXJlCitRVW5pdCBiYXNlZC4gdGVzdC5odG1sIHRlc3RzIHRoZSBBcGFjaGUgVGhyaWZ0IGpRdWVyeQorZ2VuZXJhdGVkIGNvZGUgKHRocmlmdCAtZ2VuIGpzOmpxdWVyeSkuIFRoZSB0ZXN0LW5vanEuaHRtbAorcnVucyBhbG1vc3QgaWRlbnRpY2FsIHRlc3RzIGFnYWluc3Qgbm9ybWFsIEphdmFTY3JpcHQgYnVpbGRzCisodGhyaWZ0IC1nZW4ganMpLiBCb3RoIG9mIHRoZSBwcmV2aW91cyB0ZXN0cyB1c2UgdGhlIFhIUiAKK3RyYW5zcG9ydC4gVGhlIHRlc3R3cy5odG1sIHJ1bnMgc2ltaWxhciB0ZXN0cyB1c2luZyB0aGUKK1dlYlNvY2tldCB0cmFuc3BvcnQuIFRoZSB0ZXN0Ki5qcyBmaWxlcyBhcmUgbG9hZGVkIGJ5IHRoZQoraHRtbCBkcml2ZXJzIGFuZCBjb250YWluIHRoZSBhY3R1YWwgQXBhY2hlIFRocmlmdCB0ZXN0cy4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorIyBNYXZlbiBBbnQgdGFza3MgSmFyIGRldGFpbHMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCittdm4ucmVwbz1odHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMgorbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQorbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9idWlsZC54bWwgYi9saWIvanMvdGVzdC9idWlsZC54bWwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3ZjkzZDBlLi4wNGMxMzYwCi0tLSBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbAorKysgYi9saWIvanMvdGVzdC9idWlsZC54bWwKQEAgLTMxLDE3ICszMSwyMSBAQAogICA8IS0tIHRoZSByb290IGRpcmVjdG9yeSwgd2hlcmUgeW91IHVucGFjayB0aHJpZnQgZGlzdGlidXRpb24gKGUuZy4gdGhyaWZ0LTAueC54LnRhci5neikgLS0+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vIiAvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9saWIvamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIvPgogCiAgIDwhLS0gSW5jbHVkZSB0aGUgYmFzZSBqYXZhIHByb3BlcnRpZXMgZmlsZSAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC5wcm9wZXJ0aWVzIiAvPgorICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2dyYWRsZS5wcm9wZXJ0aWVzIiAvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnQuY29tcGlsZXIiIGxvY2F0aW9uPSIke3RocmlmdC5kaXJ9L2NvbXBpbGVyL2NwcC90aHJpZnQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC8iPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGR9L2xpYiI+CkBAIC01OSwxNSArNjMsMTYgQEAKICAgICAgIDxjb25kaXRpb24+CiAgICAgICAgIDxub3Q+CiAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjIiPgotICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZCI+CisgICAgICAgICAgICA8ZmlsZXNldCBpZD0iZnMiIGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgogICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgICAgICAgICA8L2ZpbGVzZXQ+CiAgICAgICAgICAgPC9yZXNvdXJjZWNvdW50PgogICAgICAgICA8L25vdD4KICAgICAgIDwvY29uZGl0aW9uPgogICAgICAgWW91IG5lZWQgbGlidGhyaWZ0Ki5qYXIgYW5kIGxpYnRocmlmdCp0ZXN0LmphciBsb2NhdGVkIGF0Ci0gICAgICAke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQKKyAgICAgICR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzCiAgICAgICBEaWQgeW91IGNvbXBpbGUgVGhyaWZ0IEphdmEgbGlicmFyeSBhbmQgaXRzIHRlc3Qgc3VpdGUgYnkgImFudCBjb21waWxlLXRlc3QiPwogICAgIDwvZmFpbD4KICAgICA8ZmFpbD4KQEAgLTg0LDYgKzg5LDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9ImRlcGVuZGVuY2llcyI+CiAgICAgPHRzdGFtcCAvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vanMvbGliIi8+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vbGliIi8+CkBAIC05MiwyMSArOTgsMTkgQEAKICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfS90ZXN0L2xvZyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImpzbGlicyIgZGVwZW5kcz0iaW5pdCwgcHJveHkiPgotICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjcuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2pzLXRlc3QtZHJpdmVyLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay9Kc1Rlc3REcml2ZXIvY29udHJpYi9xdW5pdC9zcmMvZXF1aXYuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYiIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9qcy10ZXN0LWRyaXZlci5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsvSnNUZXN0RHJpdmVyL2NvbnRyaWIvcXVuaXQvc3JjL1FVbml0QWRhcHRlci5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZF9qc2xpYnMiPgorICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjMubWluLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvanF1ZXJ5LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0yLjYuMi5jc3MiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5jc3MiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgorICA8L3RhcmdldD4KIAotICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL3F1bml0L2dpdC9xdW5pdC5qcyIgZGVzdD0iJHtidWlsZH0vanMvbGliIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9naXQvcXVuaXQuY3NzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIiIHVzZXRpbWVzdGFtcD0idHJ1ZSIvPgotICAgIDwhLS0ganMtdGVzdC1kcml2ZXIgaGFzIGlzc3VlcyB3aXRoIHJlbGF0aXZlIHBhdGguLi5zbyB3ZSBuZWVkIGEgY29weSAtLT4KLSAgICA8Y29weSBmaWxlPSIuLi90aHJpZnQuanMiIHRvZGlyPSIke2J1aWxkfS9qcy8iLz4KKyAgPHRhcmdldCBuYW1lPSJqc2xpYnMiIGRlcGVuZHM9ImluaXQsIHByb3h5LCBkb3dubG9hZF9qc2xpYnMiPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIHRoZSB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSwgcmVzb2x2ZSI+CiAgICAgPCEtLSAvL1RPRE8gZW5hYmxlIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50Ii8+LS0+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbmphdmF9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImpzdGVzdCIgZGVzY3JpcHRpb249ImNyZWF0ZSB0aGUgdGVzdCBzdWl0ZSBqYXIgZmlsZSIgZGVwZW5kcz0iY29tcGlsZSI+CkBAIC0xNTksNDEgKzE2Myw2IEBACiAgICAgPC9wYXJhbGxlbD4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqc3Rlc3Rkcml2ZXItc2VydmVyIiBkZXNjcmlwdGlvbj0ic3RhcnQgdGhlIGpzLXRlc3QtZHJpdmVyIHNlcnZlciIgZGVwZW5kcz0iaW5pdCwgcmVzb2x2ZSI+Ci0gICAgPGVjaG8+U3RhcnRpbmcganMtdGVzdC1kcml2ZXIgU2VydmVyLi4uPC9lY2hvPgotICAgIDxqYXZhIGphcj0iJHtidWlsZH0vbGliL2pzdGVzdGRyaXZlci0xLjMuMi5qYXIiIGRpcj0iLiIgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy9qc3Rlc3Rkcml2ZXItc2VydmVyLmxvZyI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tcG9ydCA5ODc2Ii8+Ci0gICAgPC9qYXZhPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImpzdGVzdGRyaXZlciIgZGVzY3JpcHRpb249ImRvIHVuaXQgdGVzdHMgd2l0aCBqcy10ZXN0LWRyaXZlciIgZGVwZW5kcz0iaW5pdCwganN0ZXN0LCBqc2xpYnMiPgotICAgIDxwYXJhbGxlbD4KLSAgICAgIDxqYXZhIGNsYXNzbmFtZT0idGVzdC5IdHRwZCIgZm9yaz0idHJ1ZSIgdGltZW91dD0iMTAwMDAiCi0gICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJmYWxzZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvdW5pdHRlc3QubG9nIj4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLi4vIiAvPgotICAgICAgPC9qYXZhPgotICAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICAgIDxzbGVlcCBzZWNvbmRzPSIyIi8+Ci0gICAgICAgIDxlY2hvPlJ1bm5pbmcgVW5pdCBUZXN0cyB3aXRoIGpzLXRlc3QtZHJpdmVyPC9lY2hvPgotICAgICAgICAgIDxqYXZhIGphcj0iJHtidWlsZH0vbGliL2pzdGVzdGRyaXZlci0xLjMuMi5qYXIiIGRpcj0iLiIgZm9yaz0idHJ1ZSIgCi0gICAgICAgICAgICBmYWlsb25lcnJvcj0idHJ1ZSIgb3V0cHV0PSIke2J1aWxkfS9sb2cvanN0ZXN0ZHJpdmVyLmxvZyI+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLWNvbmZpZyIgLz4KLSAgICAgICAgICAgIDxhcmcgdmFsdWU9ImpzVGVzdERyaXZlci5jb25mIiAvPgotCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXJlc2V0IiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS12ZXJib3NlIiAvPgotCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXRlc3RzIiAvPgotICAgICAgICAgICAgPGFyZyB2YWx1ZT0iYWxsIiAvPgotCi0gICAgICAgICAgICA8YXJnIHZhbHVlPSItLXRlc3RPdXRwdXQiIC8+Ci0gICAgICAgICAgICA8YXJnIHZhbHVlPSIke2J1aWxkfS90ZXN0L2xvZy8iIC8+Ci0gICAgICAgIDwvamF2YT4KLSAgICAgIDwvc2VxdWVudGlhbD4KLSAgICA8L3BhcmFsbGVsPgotICA8L3RhcmdldD4KLQogICA8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlIj4KICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YSAke3RocmlmdC5kaXJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CkBAIC0yMDEsNiArMTcwLDkgQEAKICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KICAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzOmpxdWVyeSAke3RocmlmdC5kaXJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQiIC8+CisgICAgPC9leGVjPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGVzdCBzdWl0ZSAobGludCwgdW5pdHRlc3QpIiBkZXBlbmRzPSJsaW50LCB1bml0dGVzdCIvPgpAQCAtMjE2LDcgKzE4OCw3IEBACiAgICAgPGpzbDpqc2xpbnQgb3B0aW9ucz0iZXZpbCxmb3Jpbixicm93c2VyLGJpdHdpc2UscmVnZXhwLG5ld2NhcCxpbW1lZCIgZW5jb2Rpbmc9IlVURi04Ij4KICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0icGxhaW4iIC8+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7Z2VuanN9IiBpbmNsdWRlcz0iKiovKi5qcyIgLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iLi4iIGluY2x1ZGVzPSJ0aHJpZnQuanMiIC8+CisgICAgICA8ZmlsZXNldCBkaXI9Ii4uL3NyYyIgaW5jbHVkZXM9InRocmlmdC5qcyIgLz4KIAogICAgICAgPCEtLSBpc3N1ZXMgd2l0aCB1bnNhZmUgY2hhcmFjdGVyIC0tPgogICAgICAgPCEtLSBmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9Iip0ZXN0Ki5qcyIgLz4gLS0+CkBAIC0yMzQsNyArMjA2LDcgQEAKICAgICA8ZXhlYyBleGVjdXRhYmxlPSJnanNsaW50IiBmYWlsaWZleGVjdXRpb25mYWlscz0ibm8iPgogICAgICAgPGFyZyBsaW5lPSItLW5vanNkb2MiLz4KICAgICAgIDxhcmcgbGluZT0iJHtnZW5qc30vKi5qcyIvPgotICAgICAgPGFyZyBsaW5lPSIuLi90aHJpZnQuanMiLz4KKyAgICAgIDxhcmcgbGluZT0iLi4vc3JjL3RocmlmdC5qcyIvPgogCiAgICAgICA8IS0tIGlzc3VlcyB3aXRoIHVuc2FmZSBjaGFyYWN0ZXIsIGV0Yy4gLS0+CiAgICAgICA8IS0tIDxhcmcgbGluZT0iKnRlc3QqLmpzIi8+IC0tPgpAQCAtMjQ3LDE2ICsyMTksMjMgQEAKICAgICA8ZGVsZXRlIGRpcj0iJHtnZW5qc30iIC8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgorICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9ImluaXQsbXZuLmFudC50YXNrcy5jaGVjayIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+CisgICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlc29sdmUiIGRlcGVuZHM9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIHVubGVzcz0ibXZuLmZpbmlzaGVkIj4KICAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvJHttdm4uYW50LnRhc2suamFyfSIvPgogCiAgICAgPGFydGlmYWN0OmRlcGVuZGVuY2llcyBmaWxlc2V0SWQ9ImpzLnRlc3QuZGVwZW5kZW5jeS5qYXJzIj4KICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjbGllbnQiIHZlcnNpb249IjQuMC4xIi8+CiAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5qc2xpbnQ0amF2YSIgYXJ0aWZhY3RJZD0ianNsaW50NGphdmEtYW50IiB2ZXJzaW9uPSIxLjQuNiIvPgogICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iZXUubWVkc2VhLm1pbWV1dGlsIiBhcnRpZmFjdElkPSJtaW1lLXV0aWwiIHZlcnNpb249IjIuMS4zIi8+Ci0gICAgICA8IS0tIGdldCBqc3Rlc3Rkcml2ZXIuamFyIHZpYSBtYXZlbi0tPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgaWQ9ImpzdGQtbWF2ZW4tcGx1Z2luIGdvb2dsZSBjb2RlIHJlcG8iIHVybD0iaHR0cDovL2pzdGQtbWF2ZW4tcGx1Z2luLmdvb2dsZWNvZGUuY29tL3N2bi9tYXZlbjIiLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGUuanN0ZXN0ZHJpdmVyIiBhcnRpZmFjdElkPSJtYXZlbi1qc3Rlc3Rkcml2ZXItcGx1Z2luIiB2ZXJzaW9uPSIxLjMuMi4zIi8+CiAgICAgPC9hcnRpZmFjdDpkZXBlbmRlbmNpZXM+CiAKICAgICA8IS0tIENvcHkgdGhlIGRlcGVuZGVuY2llcyB0byB0aGUgYnVpbGQvbGliIGRpciAtLT4KQEAgLTI2NCw4ICsyNDMsNyBAQAogICAgICAgPGZpbGVzZXQgcmVmaWQ9ImpzLnRlc3QuZGVwZW5kZW5jeS5qYXJzIi8+CiAgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KICAgICA8L2NvcHk+Ci0gICAgCisKICAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgogICA8L3RhcmdldD4KIDwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZDNhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKQEAgLTAsMCArMSwyMTMgQEAKK2Z1bmN0aW9uIHNlcmlhbGl6ZShkYXRhKSB7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oJycsIDAsIDApOworICBkYXRhLndyaXRlKHByb3RvY29sKTsKKyAgcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCk7CisgIHJldHVybiB0cmFuc3BvcnQuc2VuZF9idWY7Cit9CisKK2Z1bmN0aW9uIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWQsIHR5cGUpIHsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CisgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHNlcmlhbGl6ZWQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOworICBjb25zdCBkYXRhID0gbmV3IHR5cGUoKTsKKyAgZGF0YS5yZWFkKHByb3RvY29sKTsKKyAgcHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKTsKKyAgcmV0dXJuIGRhdGE7Cit9CisKKworZnVuY3Rpb24gY3JlYXRlVGhyaWZ0T2JqKCkgeworCisgIHJldHVybiBuZXcgQ29tcGxleCh7CisKKyAgICBzdHJ1Y3RfZmllbGQ6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnYSd9KSwKKworICAgIHN0cnVjdF9saXN0X2ZpZWxkOiBbCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2InfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2MnfSkKKyAgICBdLAorCisgICAgc3RydWN0X3NldF9maWVsZDogWworICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdkJ30pLAorICAgICAgbmV3IFNpbXBsZSh7dmFsdWU6ICdlJ30pCisgICAgXSwKKworICAgIHN0cnVjdF9tYXBfZmllbGQ6IHsKKyAgICAgIEE6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnZid9KSwKKyAgICAgIEI6IG5ldyBTaW1wbGUoe3ZhbHVlOiAnZyd9KQorICAgIH0sCisKKyAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKKyAgICAgIFsKKyAgICAgICAgeworICAgICAgICAgIEM6IFsKKyAgICAgICAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnaCd9KSwKKyAgICAgICAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnaSd9KQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIF0sCisKKworICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKKyAgICAgIEQ6IFsKKyAgICAgICAgeworICAgICAgICAgIERBOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2onfSkKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgIERCOiBuZXcgU2ltcGxlKHt2YWx1ZTogJ2snfSkKKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgICBbJ29uZScsICd0d28nXSwKKyAgICAgICBbJ3RocmVlJywgJ2ZvdXInXSwKKyAgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgICBdCisgIH0KKyAgKTsKK30KKworCitmdW5jdGlvbiBjcmVhdGVKc09iaigpIHsKKworICByZXR1cm4geworCisgICAgc3RydWN0X2ZpZWxkOiB7dmFsdWU6ICdhJ30sCisKKyAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWworICAgICAge3ZhbHVlOiAnYid9LAorICAgICAge3ZhbHVlOiAnYyd9CisgICAgXSwKKworICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKKyAgICAgIHt2YWx1ZTogJ2QnfSwKKyAgICAgIHt2YWx1ZTogJ2UnfQorICAgIF0sCisKKyAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CisgICAgICBBOiB7dmFsdWU6ICdmJ30sCisgICAgICBCOiB7dmFsdWU6ICdnJ30KKyAgICB9LAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCisgICAgICBbCisgICAgICAgIHsKKyAgICAgICAgICBDOiBbCisgICAgICAgICAgICB7dmFsdWU6ICdoJ30sCisgICAgICAgICAgICB7dmFsdWU6ICdpJ30KKyAgICAgICAgICBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICBdLAorCisgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogeworICAgICAgRDogWworICAgICAgICB7CisgICAgICAgICAgREE6IHt2YWx1ZTogJ2onfQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgREI6IHt2YWx1ZTogJ2snfQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgWydvbmUnLCAndHdvJ10sCisgICAgICBbJ3RocmVlJywgJ2ZvdXInXSwKKyAgICAgIFsnZml2ZScsICdzaXgnXQorICAgXQorICB9OworfQorCisKK2Z1bmN0aW9uIGFzc2VydFZhbHVlcyhvYmosIGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X2ZpZWxkLnZhbHVlLCAnYScpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X2xpc3RfZmllbGRbMF0udmFsdWUsICdiJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgJ2MnKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9zZXRfZmllbGRbMF0udmFsdWUsICdkJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzFdLnZhbHVlLCAnZScpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAnZicpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X21hcF9maWVsZC5CLnZhbHVlLCAnZycpOworICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkWzBdWzBdLkNbMF0udmFsdWUsICdoJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgJ2knKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFswXS5EQS52YWx1ZSwgJ2onKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIuRFsxXS5EQi52YWx1ZSwgJ2snKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgJ29uZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdLCAndHdvJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMF0sICd0aHJlZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdLCAnZm91cicpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdLCAnZml2ZScpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdLCAnc2l4Jyk7Cit9CisKK2NvbnN0IGNhc2VzID0geworCisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2ltcGxlIHN0cnVjdCBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIFNpbXBsZSk7CisgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKKyAgfSwKKworCisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIENvbXBsZXgpOworICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChyZWNlaXZlZCwgdE9iaik7CisgIH0sCisKKyAgJ05lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7CisgICAgY29uc3QgdE9iajIgPSBuZXcgQ29tcGxleChjcmVhdGVKc09iaigpKTsKKyAgICBhc3NlcnRWYWx1ZXModE9iajIsIGFzc2VydCk7CisgICAgYXNzZXJ0LmVxdWFsKHNlcmlhbGl6ZSh0T2JqMiksIHNlcmlhbGl6ZSh0T2JqMSkpOworICB9LAorCisgICdNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QnOiBmdW5jdGlvbihhc3NlcnQpIHsKKworICAgIGNvbnN0IGFyZ3MgPSBjcmVhdGVKc09iaigpOworICAgIGFzc2VydFZhbHVlcyhhcmdzLCBhc3NlcnQpOworCisgICAgY29uc3QgdE9iaiA9IG5ldyBDb21wbGV4KGFyZ3MpOworICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworCisgICAgYXJncy5zdHJ1Y3RfZmllbGQudmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUgPSAnWlpaJzsKKyAgICBhcmdzLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICdaWlonOworICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBID0gJ1paWic7CisgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREIgPSAnWlpaJzsKKworICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOworICB9LAorCisgICdudWxscyBhcmUgb2snOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoeworICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IG51bGwsCisgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLAorICAgICAgc3RydWN0X21hcF9maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDogbnVsbCwKKyAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IG51bGwKKyAgICB9KTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CisgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKKyAgfQorCit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICBRVW5pdC50ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZiBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCmluZGV4IDIyZTYyZWEuLmViMTU4OGMgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCisrKyBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCkBAIC01LDggKzUsOSBAQAogICAtIGJ1aWxkL2pzL2xpYi9lcXVpdi5qcwogICAtIGJ1aWxkL2pzL2xpYi9RVW5pdEFkYXB0ZXIuanMKICMgZGVwZW5kZW5jaWVzCi0gIC0gYnVpbGQvanMvbGliL2pxdWVyeS0xLjUuMi5qcworICAtIGJ1aWxkL2pzL2xpYi9qcXVlcnkuanMKICAgLSBidWlsZC9qcy90aHJpZnQuanMKKyAgLSBnZW4tanMvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuanMKICAgLSBnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcwogICAtIGdlbi1qcy9UaHJpZnRUZXN0LmpzCiAjIHRoZSB0ZXN0IHN1aXRlCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcyBiL2xpYi9qcy90ZXN0L3BoYW50b20tY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTdlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisoZnVuY3Rpb24oKSB7CisgICd1c2Ugc3RyaWN0JzsKKworICAvLyBSdWRpbWVudGFyeSB0ZXN0IGhlbHBlciBmdW5jdGlvbnMKKyAgLy8gVE9ETzogUmV0dXJuIGVycm9yIGNvZGUgYmFzZWQgb24ga2luZCBvZiBlcnJvcnMgcmF0aGVyIHRoYW4gdGhyb3cKKyAgdmFyIG9rID0gZnVuY3Rpb24odCwgbXNnKSB7CisgICAgaWYgKCF0KSB7CisgICAgICBjb25zb2xlLmxvZygnKioqIEZBSUxFRCAqKionKTsKKyAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOworICAgIH0KKyAgfTsKKyAgdmFyIGVxdWFsID0gZnVuY3Rpb24oYSwgYikgeworICAgIGlmIChhICE9PSBiKSB7CisgICAgICBjb25zb2xlLmxvZygnKioqIEZBSUxFRCAqKionKTsKKyAgICAgIHRocm93IG5ldyBFcnJvcigpOworICAgIH0KKyAgfTsKKyAgdmFyIHRlc3QgPSBmdW5jdGlvbihuYW1lLCBmKSB7CisgICAgY29uc29sZS5sb2coJ1RFU1QgOiAnICsgbmFtZSk7CisgICAgZigpOworICAgIGNvbnNvbGUubG9nKCdPS1xuJyk7CisgIH07CisKKyAgdmFyIHBhcnNlQXJncyA9IGZ1bmN0aW9uKGFyZ3MpIHsKKyAgICB2YXIgc2tpcHMgPSBbCisgICAgICAnLS10cmFuc3BvcnQ9aHR0cCcsCisgICAgICAnLS1wcm90b2NvbD1qc29uJworICAgIF07CisgICAgdmFyIG9wdHMgPSB7CisgICAgICBwb3J0OiAnOTA5MCcKKyAgICAgIC8vIHByb3RvY29sOiAnanNvbicsCisgICAgfTsKKyAgICB2YXIga2V5cyA9IHt9OworICAgIGZvciAodmFyIGtleSBpbiBvcHRzKSB7CisgICAgICBrZXlzWyctLScgKyBrZXkgKyAnPSddID0ga2V5OworICAgIH0KKyAgICBmb3IgKHZhciBpIGluIGFyZ3MpIHsKKyAgICAgIHZhciBhcmcgPSBhcmdzW2ldOworICAgICAgaWYgKHNraXBzLmluZGV4T2YoYXJnKSAhPSAtMSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHZhciBoaXQgPSBmYWxzZTsKKyAgICAgIGZvciAodmFyIGsgaW4ga2V5cykgeworICAgICAgICBpZiAoYXJnLnNsaWNlKDAsIGsubGVuZ3RoKSA9PT0gaykgeworICAgICAgICAgIG9wdHNba2V5c1trXV0gPSBhcmcuc2xpY2Uoay5sZW5ndGgpOworICAgICAgICAgIGhpdCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghaGl0KSB7CisgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICB9CisgICAgfQorICAgIG9wdHMucG9ydCA9IHBhcnNlSW50KG9wdHMucG9ydCwgMTApOworICAgIGlmICghb3B0cy5wb3J0IHx8IG9wdHMucG9ydCA8IDEgfHwgb3B0cy5wb3J0ID4gNjU1MzUpIHsKKyAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwb3J0IG51bWJlcicpOworICAgIH0KKyAgICByZXR1cm4gb3B0czsKKyAgfTsKKworICB2YXIgZXhlY3V0ZSA9IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCcjIyMgQXBhY2hlIFRocmlmdCBKYXZhc2NyaXB0IHN0YW5kYWxvbmUgdGVzdCBjbGllbnQnKTsKKyAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7CisKKyAgICBwaGFudG9tLnBhZ2UuaW5qZWN0SnMoJ3NyYy90aHJpZnQuanMnKTsKKyAgICBwaGFudG9tLnBhZ2UuaW5qZWN0SnMoJ3Rlc3QvZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMnKTsKKyAgICBwaGFudG9tLnBhZ2UuaW5qZWN0SnMoJ3Rlc3QvZ2VuLWpzL1RocmlmdFRlc3QuanMnKTsKKworICAgIHZhciBzeXN0ZW0gPSByZXF1aXJlKCdzeXN0ZW0nKTsKKyAgICB2YXIgb3B0cyA9IHBhcnNlQXJncyhzeXN0ZW0uYXJncy5zbGljZSgxKSk7CisgICAgdmFyIHBvcnQgPSBvcHRzLnBvcnQ7CisgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCdodHRwOi8vbG9jYWxob3N0OicgKyBwb3J0ICsgJy9zZXJ2aWNlJyk7CisgICAgdmFyIHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIHZhciBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworCisgICAgLy8gVE9ETzogUmVtb3ZlIGR1cGxpY2F0ZSBjb2RlIHdpdGggdGVzdC5qcy4KKyAgICAvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04CisgICAgdmFyIHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKKyAgICBmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpIHsKKyAgICAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgeworICAgICAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgICAgZXF1YWwobWFwMSwgbWFwMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKKyAgICAgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkobWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHRlc3QoJ1ZvaWQnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICAgIH0pOworICAgIHRlc3QoJ0JpbmFyeSAoU3RyaW5nKScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGJpbmFyeSA9ICcnOworICAgICAgZm9yICh2YXIgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CisgICAgICB9CisgICAgICBlcXVhbChjbGllbnQudGVzdEJpbmFyeShiaW5hcnkpLCBiaW5hcnkpOworICAgIH0pOworICAgIHRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBiaW5hcnkgPSAnJzsKKyAgICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgICAgfQorICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJpbmFyeS5sZW5ndGgpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoKTsKKyAgICAgIH0KKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGFyciksIGJpbmFyeSk7CisgICAgfSk7CisgICAgdGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZygnJyksICcnKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKKworICAgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKworICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKworICAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKKyAgICAgICAgICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMpLCBzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgfSk7CisgICAgdGVzdCgnRG91YmxlJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgwKSwgMCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSksIE1hdGgucG93KDIsIDYwKSk7CisgICAgfSk7CisgICAgdGVzdCgnQm9vbCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKHRydWUpLCB0cnVlKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qm9vbChmYWxzZSksIGZhbHNlKTsKKyAgICB9KTsKKyAgICB0ZXN0KCdJOCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CisgICAgfSk7CisgICAgdGVzdCgnSTMyJywgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSksIC1NYXRoLnBvdygyLCAzMCkpOworICAgIH0pOworICAgIHRlc3QoJ0k2NCcsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoMCksIDApOworICAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpKSwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CisKKyAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisKKyAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ05lc3QnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CisgICAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOworCisgICAgICB2YXIgbmVzdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCk7CisKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOworICAgICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKKworICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgfSk7CisKKyAgICB0ZXN0KCdNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CisKKyAgICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICAgIH07CisKKyAgICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKworICAgICAgZm9yICh2YXIga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdTZXQnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgICBvayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOworICAgIH0pOworCisgICAgdGVzdCgnTGlzdCcsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgICBvayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOworICAgIH0pOworCisgICAgdGVzdCgnRW51bScsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKKyAgICB9KTsKKworICAgIHRlc3QoJ1NraXAnLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICAgIHZhciBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworCisgICAgICBtb2RpZmllZENsaWVudC5yZWN2X3Rlc3RTdHJ1Y3QgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgdmFyIGlucHV0ID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7CisgICAgICAgIHZhciB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOworCisgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgICAgaW5wdXQucmVhZFN0cnVjdEJlZ2luKCk7CisKKyAgICAgICAgLy8gcmVhZCBYdHJ1Y3QgZGF0YSB3aXRoIFh0cnVjdDMKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgeHRydWN0My5yZWFkKGlucHV0KTsKKyAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIC8vIHJlYWQgVGhyaWZ0LlR5cGUuU1RPUCBtZXNzYWdlCisgICAgICAgIGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOworCisgICAgICAgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2VFbmQoKTsKKworICAgICAgICByZXR1cm4geHRydWN0MzsKKyAgICAgIH07CisKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgICB2YXIgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dCBpbnN0YW5jZW9mIFRocmlmdFRlc3QuWHRydWN0MywgdHJ1ZSk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgIH0pOworCisgICAgdGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0geworICAgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgICB9OworCisgICAgICB2YXIgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworCisKKyAgICAgIGZvciAodmFyIGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7CisgICAgICAgIGZvciAodmFyIGtleTIgaW4gbWFwTWFwVGVzdE91dHB1dFtrZXldKSB7CisgICAgICAgICAgZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgY2hlY2tSZWN1cnNpdmVseShtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgIH0pOworCisgICAgdGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgICBvayhmYWxzZSk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ25vIEV4Y2VwdGlvbicpOworICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICBvayhmYWxzZSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICB0ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CisgICAgICB0cnkgeworICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpOworICAgICAgICBvayhmYWxzZSk7CisgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgIG9rKG9rKTsKKyAgICAgIH0KKyAgICB9KTsKKworICAgIHZhciBjcmF6eSA9IHsKKyAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgJ3h0cnVjdHMnOiBbeworICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgICAnaTMyX3RoaW5nJzogNCwKKyAgICAgICAgJ2k2NF90aGluZyc6IDQKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgJ2k2NF90aGluZyc6IDIKKyAgICAgIH1dCisgICAgfTsKKyAgICB0ZXN0KCdJbnNhbml0eScsIGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGluc2FuaXR5ID0geworICAgICAgICAnMSc6IHsKKyAgICAgICAgICAnMic6IGNyYXp5LAorICAgICAgICAgICczJzogY3JhenkKKyAgICAgICAgfSwKKyAgICAgICAgJzInOiB7ICc2JzogeyAndXNlck1hcCc6IG51bGwsICd4dHJ1Y3RzJzogbnVsbCB9IH0KKyAgICAgIH07CisgICAgICB2YXIgcmVzID0gY2xpZW50LnRlc3RJbnNhbml0eShuZXcgVGhyaWZ0VGVzdC5JbnNhbml0eShjcmF6eSkpOworICAgICAgb2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIG9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworCisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOworICAgIH0pOworCisgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpOworICAgIGNvbnNvbGUubG9nKCcjIyMgQWxsIHRlc3RzIHN1Y2NlZWRlZC4nKTsKKyAgICByZXR1cm4gMDsKKyAgfTsKKworICB0cnkgeworICAgIHZhciByZXQgPSBleGVjdXRlKCk7CisgICAgcGhhbnRvbS5leGl0KHJldCk7CisgIH0gY2F0Y2ggKGVycikgeworICAgIC8vIENhdGNoIGFsbCBhbmQgZXhpdCB0byBhdm9pZCBoYW5nLgorICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKKyAgICBwaGFudG9tLmV4aXQoMSk7CisgIH0KK30pKCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMgYi9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKaW5kZXggZDUyYjUyMi4uYzFkN2E1YiAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCisrKyBiL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcwpAQCAtMSwzICsxLDUgQEAKKy8qanNoaW50IGV2aWw6dHJ1ZSovCisKIC8qIFRoaXMgZmlsZSBpcyBvbmx5IHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUuCiAgKgogICogT3JpZ2luOiAgaHR0cHM6Ly9naXRodWIuY29tL2FyaXlhL3BoYW50b21qcy9ibG9iL21hc3Rlci9leGFtcGxlcy9ydW4tcXVuaXQuanMKQEAgLTYsNiArOCw4IEBACiAgKiBJbmNsdXNpb24gaW50byBBcGFjaGUgcHJvZHVjdHMgaXMgYWxsb3dlZCBhY2NvcmRpbmcgdG8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xlZ2FsLzNwYXJ0eS5odG1sCiAgKi8KIAordmFyIHN5c3RlbSA9IHJlcXVpcmUoJ3N5c3RlbScpOworCiAKIC8qKgogICogV2FpdCB1bnRpbCB0aGUgdGVzdCBjb25kaXRpb24gaXMgdHJ1ZSBvciBhIHRpbWVvdXQgb2NjdXJzLiBVc2VmdWwgZm9yIHdhaXRpbmcKQEAgLTI0LDI2ICsyOCwzMCBAQAogICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICBjb25kaXRpb24gPSBmYWxzZSwKICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGlmICggKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQgPCBtYXh0aW1lT3V0TWlsbGlzKSAmJiAhY29uZGl0aW9uICkgeworICAgICAgICAgICAgaWYgKChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgIC8vIElmIG5vdCB0aW1lLW91dCB5ZXQgYW5kIGNvbmRpdGlvbiBub3QgeWV0IGZ1bGZpbGxlZAotICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gInN0cmluZyIgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gJ3N0cmluZycgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZighY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29uZGl0aW9uIHN0aWxsIG5vdCBmdWxmaWxsZWQgKHRpbWVvdXQgYnV0IGNvbmRpdGlvbiBpcyAnZmFsc2UnKQogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJ3dhaXRGb3IoKScgdGltZW91dCIpOwogICAgICAgICAgICAgICAgICAgICBwaGFudG9tLmV4aXQoMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uIGZ1bGZpbGxlZCAodGltZW91dCBhbmQvb3IgY29uZGl0aW9uIGlzICd0cnVlJykKLSAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIGZpbmlzaGVkIGluICIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCkgKyAibXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVvZihvblJlYWR5KSA9PT0gInN0cmluZyIgPyBldmFsKG9uUmVhZHkpIDogb25SZWFkeSgpOyAvLzwgRG8gd2hhdCBpdCdzIHN1cHBvc2VkIHRvIGRvIG9uY2UgdGhlIGNvbmRpdGlvbiBpcyBmdWxmaWxsZWQKKyAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIGZpbmlzaGVkIGluICIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCkgKyAnbXMuJyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob25SZWFkeSkgPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmFsKG9uUmVhZHkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb25SZWFkeSgpOyAvLzwgRG8gd2hhdCBpdCdzIHN1cHBvc2VkIHRvIGRvIG9uY2UgdGhlIGNvbmRpdGlvbiBpcyBmdWxmaWxsZWQKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTsgLy88IFN0b3AgdGhpcyBpbnRlcnZhbAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSwgMTAwKTsgLy88IHJlcGVhdCBjaGVjayBldmVyeSAyNTBtcwotfTsKK30KIAogCi1pZiAocGhhbnRvbS5hcmdzLmxlbmd0aCA9PT0gMCB8fCBwaGFudG9tLmFyZ3MubGVuZ3RoID4gMikgeworaWYgKHN5c3RlbS5hcmdzLmxlbmd0aCA9PT0gMSB8fCBzeXN0ZW0uYXJncy5sZW5ndGggPiAzKSB7CiAgICAgY29uc29sZS5sb2coJ1VzYWdlOiBwaGFudG9tanMgcGhhbnRvbWpzLXF1bml0LmpzIFVSTCcpOwogICAgIHBoYW50b20uZXhpdCgxKTsKIH0KQEAgLTU1LDIxICs2MywyMSBAQAogICAgIGNvbnNvbGUubG9nKG1zZyk7CiB9OwogCi1wYWdlLm9wZW4ocGhhbnRvbS5hcmdzWzBdLCBmdW5jdGlvbihzdGF0dXMpewotICAgIGlmIChzdGF0dXMgIT09ICJzdWNjZXNzIikgewotICAgICAgICBjb25zb2xlLmxvZygiVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrIik7CitwYWdlLm9wZW4oc3lzdGVtLmFyZ3NbMV0sIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgeworICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrJyk7CiAgICAgICAgIHBoYW50b20uZXhpdCgxKTsKICAgICB9IGVsc2UgewotICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKICAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWwuaW5uZXJUZXh0Lm1hdGNoKCdjb21wbGV0ZWQnKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0sIGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICB2YXIgZmFpbGVkTnVtID0gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBmYWlsZWROdW0gPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWwuaW5uZXJUZXh0KTsKICAgICAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzgwYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAgVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZSB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgorLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKKy8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKKy8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKKy8vICByZXNwZWN0aXZlbHkpLgorLy8KKy8vICBVc2luZyB0aGUgY29tbWFuZCBmbGFnIC0tZXM2LCB0aGlzIHNlcnZlciBjYW4gYmUgcnVuIHVzaW5nIG5vZGVqcyBjb2RlIGJ1aWx0CisvLyAgZm9yIHRoZSBlczYgZW52aXJvbm1lbnQgb3IgZm9yIHByZS1lczYgZW52aXJvbm1lbnQuCisvLworCitjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKKworY29uc3QgVGhyaWZ0VGVzdFN2Y09wdCA9IHsKKwl0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisJcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorCXByb2Nlc3NvcjogVGhyaWZ0VGVzdFN2YywKKwloYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgorfTsKKworY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogX19kaXJuYW1lLAorCXNlcnZpY2VzOiB7CisJCScvc2VydmljZSc6IFRocmlmdFRlc3RTdmNPcHQKKwl9Cit9OworCitjb25zdCBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOworY29uc3QgcG9ydCA9IGVzNk1vZGUgPyA4MDg4IDogODA4OTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZyhgU2VydmluZyBmaWxlcyBmcm9tOiAke19fZGlybmFtZX1gKTsKK2NvbnNvbGUubG9nKGBIdHRwL1RocmlmdCBTZXJ2ZXIgKEVTNiBtb2RlICR7ZXM2TW9kZX0pIHJ1bm5pbmcgb24gcG9ydDogJHtwb3J0fWApOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMTcxZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmVyIHRoZSB0ZXN0Lmh0bWwgYnJvd3NlcgorLy8gIGJhc2VkIEphdmFTY3JpcHQgdGVzdCBwYWdlICh3aGljaCBtdXN0IGJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSkuCisvLyAgVGhpcyBzZXJ2ZXIgYWxzbyBzdXBwbGllcyB0aGUgVGhyaWZ0IGJhc2VkIHRlc3Qgc2VydmljZSwgd2hpY2ggZGVwZW5kcworLy8gIG9uIHRoZSBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBJREwgc2VydmljZSAod2hpY2ggbXVzdCBiZSBjb21waWxlZAorLy8gIGZvciBOb2RlIGFuZCBicm93c2VyIGJhc2VkIEphdmFTY3JpcHQgaW4gLi9nZW4tbm9kZWpzIGFuZCAuL2dlbi1qcworLy8gIHJlc3BlY3RpdmVseSkuIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBtdXN0IGFsc28gaW5jbHVkZSB0aGUgYnJvd3NlcgorLy8gIHN1cHBvcnQgbGlicmFyaWVzIGZvciB0ZXN0Lmh0bWwgKGpxdWVyeS5qcywgcXVuaXQuanMgYW5kIHF1bml0LmNzcworLy8gIGluIC4vYnVpbGQvanMvbGliKS4KKworY29uc3QgZnMgPSByZXF1aXJlKCdmcycpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKGAuLyR7Z2VuRm9sZGVyfS9UaHJpZnRUZXN0LmpzYCk7Citjb25zdCBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7CisKKy8vU2V0dXAgdGhlIEkvTyBzdGFjayBvcHRpb25zIGZvciB0aGUgVGhyaWZ0VGVzdCBzZXJ2aWNlCitjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0geworICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAgcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAorICBoYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgorfTsKKworY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKyAgZmlsZXM6IF9fZGlybmFtZSwKKyAgdGxzOiB7CisgICAgIGtleTogZnMucmVhZEZpbGVTeW5jKCcuLi8uLi8uLi90ZXN0L2tleXMvc2VydmVyLmtleScpLAorICAgICBjZXJ0OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0JykKKyAgfSwKKyAgc2VydmljZXM6IHsKKyAgICAnL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CisgIH0KK307CisKK2NvbnN0IHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIoVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyk7Citjb25zdCBwb3J0ID0gZXM2TW9kZSA/IDgwOTAgOiA4MDkxOworc2VydmVyLmxpc3Rlbihwb3J0KTsKK2NvbnNvbGUubG9nKGBTZXJ2aW5nIGZpbGVzIGZyb206ICR7X19kaXJuYW1lfWApOworY29uc29sZS5sb2coYEh0dHAvVGhyaWZ0IFNlcnZlciAoRVM2IG1vZGUgJHtlczZNb2RlfSkgcnVubmluZyBvbiBwb3J0OiAke3BvcnR9YCk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhIGIvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvSHR0cGQuamF2YQppbmRleCBmMTI5MWQ4Li5lNGZjMGNjIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zcmMvdGVzdC9IdHRwZC5qYXZhCisrKyBiL2xpYi9qcy90ZXN0L3NyYy90ZXN0L0h0dHBkLmphdmEKQEAgLTE4MywxNiArMTgzLDE4IEBACiAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogCi0JCSAgICBTdHJpbmcgbWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKLQkJICAgIE1pbWVVdGlsMiBtaW1lVXRpbCA9IG5ldyBNaW1lVXRpbDIoKTsKLQkJICAgIG1pbWVVdGlsLnJlZ2lzdGVyTWltZURldGVjdG9yKEV4dGVuc2lvbk1pbWVEZXRlY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCQkgICAgQ29sbGVjdGlvbjxNaW1lVHlwZT4gY29sbGVjdGlvbiA9IG1pbWVVdGlsLmdldE1pbWVUeXBlcyhmaWxlKTsKLQkJICAgIEl0ZXJhdG9yPE1pbWVUeXBlPiBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTWltZVR5cGUgbXQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQltaW1lVHlwZSA9ICBtdC5nZXRNZWRpYVR5cGUoKSArICIvIiArIG10LmdldFN1YlR5cGUoKTsKLQkJCWJyZWFrOwotCQkgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyAgICAgICAgICAgICAgICAgICAgTWltZVV0aWwyIG1pbWVVdGlsID0gbmV3IE1pbWVVdGlsMigpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVVdGlsLnJlZ2lzdGVyTWltZURldGVjdG9yKEV4dGVuc2lvbk1pbWVEZXRlY3Rvci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248TWltZVR5cGU+IGNvbGxlY3Rpb24gPSBtaW1lVXRpbC5nZXRNaW1lVHlwZXMoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1pbWVUeXBlPiBpdGVyYXRvciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaW1lVHlwZSBtdCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlID0gIG10LmdldE1lZGlhVHlwZSgpICsgIi8iICsgbXQuZ2V0U3ViVHlwZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXNDb2RlKEh0dHBTdGF0dXMuU0NfT0spOwogICAgICAgICAgICAgICAgICAgICBGaWxlRW50aXR5IGJvZHkgPSBuZXcgRmlsZUVudGl0eShmaWxlLCBtaW1lVHlwZSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzZiMTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpAQCAtMCwwICsxLDM3MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KKyAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAorICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KKyAqCisgKiBUbyBjb21waWxlIGNsaWVudCBjb2RlIGZvciB0aGlzIHRlc3QgdXNlOgorICogICAgICAkIHRocmlmdCAtZ2VuIGpzIFRocmlmdFRlc3QudGhyaWZ0CisgKi8KKworCisKKy8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+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+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgorICAtLT4KKzwvYm9keT4KKzwvaHRtbD4KKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODAxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKKyAqIHdpbGwgcnVuIG9ubHkgd2l0aCBub3JtYWwgIi1nZW4ganMiIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KKyAqIFRvIGNyZWF0ZSBjbGllbnQgY29kZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIFNlZSBhbHNvOgorICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cworICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCisgKi8KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL0FzeW5jIGV4Y2VwdGlvbiB0ZXN0cworCitRVW5pdC5tb2R1bGUoJ05valEgQXN5bmMnKTsKKworUVVuaXQudGVzdCgnWGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbAppbmRleCA5Mzk2ZmQ1Li44YjY3MDE0IDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC90ZXN0Lmh0bWwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC5odG1sCkBAIC0xLDQgKzEsNCBAQAot77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgogPCEtLQogICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMiwzMCArMjIsMzMgQEAKICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CiAgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KIAotICA8c2NyaXB0IHNyYz0iL3RocmlmdC5qcyIgICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCiAgIDwhLS0galF1ZXJ5IC0tPgotICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LTEuNy4yLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Ci0gIAorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKICAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KLSAgCisKICAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0L3RydW5rL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CiAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgotICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PiAKKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KICAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CiAgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CisgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KICAgPHA+CiAgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCiAgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgogICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KICAgPC9wPgorICAtLT4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QuanMgYi9saWIvanMvdGVzdC90ZXN0LmpzCmluZGV4IGMzMDI4N2YuLmE4NmE1MDkgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwpAQCAtMTYsMzkyICsxNiw0MDAgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0gCi0gCisgLyoganNoaW50IC1XMTAwICovCisKIC8qCi0gKiBKYXZhU2NyaXB0IHRlc3Qgc3VpdGUKKyAqIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzCisgKiB3aWxsIHJ1biBhZ2FpbnN0IE5vcm1hbCAoLWdlbiBqcykgYW5kIGpRdWVyeSAoLWdlbiBqczpqcXVlcnkpCisgKiBBcGFjaGUgVGhyaWZ0IGludGVyZmFjZXMuCisgKgorICogU3luY2hyb25vdXMgYmxvY2tpbmcgY2FsbHMgc2hvdWxkIGJlIGlkZW50aWNhbCBpbiBib3RoCisgKiBOb3JtYWwgYW5kIGpRdWVyeSBpbnRlcmZhY2VzLiBBbGwgc3luY2hyb25vdXMgdGVzdHMgYmVsb25nCisgKiBoZXJlLgorICoKKyAqIEFzeW5jaHJvbm91cyBzdWNjZXNzIGNhbGxiYWNrcyBwYXNzZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyCisgKiBvZiBhbiBSUEMgY2FsbCBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGggTm9ybWFsIGFuZCBqUXVlcnkKKyAqIGludGVyZmFjZXMuIEFzeW5jIHN1Y2Nlc3MgdGVzdHMgYmVsb25nIGhlcmUuCisgKgorICogQXN5bmNocm9ub3VzIGV4Y2VwdGlvbiBwcm9jZXNzaW5nIGlzIGRpZmZlcmVudCBpbiBOb3JtYWwKKyAqIGFuZCBqUXVlcnkgaW50ZXJmYWNlcy4gU3VjaCB0ZXN0cyBiZWxvbmcgaW4gdGhlIHRlc3Qtbm9qcS5qcworICogb3IgdGVzdC1qcS5qcyBmaWxlcyByZXNwZWN0aXZlbHkuIGpRdWVyeSBzcGVjaWZpYyBYSFIgb2JqZWN0CisgKiB0ZXN0cyBhbHNvIGJlbG9uZyBpbiB0ZXN0LWpxLmpzLiBEbyBub3QgY3JlYXRlIGFueSBqUXVlcnkKKyAqIGRlcGVuZGVuY2llcyBpbiB0aGlzIGZpbGUgb3IgaW4gdGVzdC1ub2pxLmpzCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAorICogICAgICAtLSBvciAtLQorICogICAgICAkIHRocmlmdCAtZ2VuIGpzOmpxdWVyeSBUaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIFNlZSBhbHNvOgorICogKysgdGVzdC1ub2pxLmpzIGZvciAiLWdlbiBqcyIgb25seSB0ZXN0cworICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCiAgKi8KIAotdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLXZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKK2NvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Citjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CiAKIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKLXZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwotICAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgdGVzdCgiVm9pZCIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOwogICB9KTsKLSAgdGVzdCgiU3RyaW5nIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCksIHN0cmluZ1Rlc3QpOworICBRVW5pdC50ZXN0KCdCaW5hcnkgKFN0cmluZyknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgIH0KKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYmluYXJ5KSwgYmluYXJ5KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKKyAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOworICAgIH0KKyAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgeworICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoKTsKKyAgICB9CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGFyciksIGJpbmFyeSk7CisgIH0pOworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKIAotICAgIHZhciBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKworICAgIGNvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCiAgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCiAgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCiAgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOwotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSxzcGVjaWFsQ2hhcmFjdGVycyk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKSwgc3BlY2lhbENoYXJhY3RlcnMpOwogICB9KTsKLSAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMCksIDApOwotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLDYwKSksIE1hdGgucG93KDIsNjApKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoLTEpLCAtMSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpLCAzLjE0KTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKSwgTWF0aC5wb3coMiwgNjApKTsKICAgfSk7Ci0gIHRlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMCksIDApOwotICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CisgIFFVbml0LnRlc3QoJ0J5dGUnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCeXRlKDB4MDEpLCAweDAxKTsKICAgfSk7Ci0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSksIE1hdGgucG93KDIsMzApKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwzMCkpLCAtTWF0aC5wb3coMiwzMCkpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLCAzMCkpLCBNYXRoLnBvdygyLCAzMCkpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKSwgLU1hdGgucG93KDIsIDMwKSk7CiAgIH0pOwotICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NCgwKSwgMCk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw2MCkpLCBNYXRoLnBvdygyLDYwKSk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsNjApKSwgLU1hdGgucG93KDIsNjApKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KDApLCAwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLCA1MikpLCAtTWF0aC5wb3coMiwgNTIpKTsKICAgfSk7CiAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CitRVW5pdC5tb2R1bGUoJ1N0cnVjdHVyZWQgVHlwZXMnKTsKIAotICB0ZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDYwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgdmFyIHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOwogCi0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7Ci0gICAgCi0gICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKworICAgIGFzc2VydC5lcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk5lc3QiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgIFFVbml0LnRlc3QoJ05lc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICB4dHJUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CiAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKLSAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw2MCk7Ci0gICAgCi0gICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNvbnN0IG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CiAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKICAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKLSAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMTUpOwotICAgIAotICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKLSAgICAKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmJ5dGVfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nKTsKLSAgICAKLSAgICBlcXVhbChKU09OLnN0cmluZ2lmeShuZXN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNvbnN0IG5lc3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQpOworCisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICBhc3NlcnQuZXF1YWwobmVzdFRlc3RPdXRwdXQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CiAgIH0pOwogCi0gIHRlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiU3RyaW5nTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcFRlc3RJbnB1dCA9IHsKLSAgICAgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAotICAgICAgImxvbmdWYWx1ZSI6c3RyaW5nVGVzdCwgc3RyaW5nVGVzdDoibG9uZyBrZXkiCisgIFFVbml0LnRlc3QoJ1N0cmluZ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHsKKyAgICAgICdhJzogJzEyMycsICdhIGInOiAnd2l0aCBzcGFjZXMgJywgJ3NhbWUnOiAnc2FtZScsICcwJzogJ251bWVyaWMga2V5JywKKyAgICAgICdsb25nVmFsdWUnOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAnbG9uZyBrZXknCiAgICAgfTsKIAotICAgIHZhciBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKKyAgICBjb25zdCBtYXBUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBlcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBmb3IgKGxldCBrZXkgaW4gbWFwVGVzdE91dHB1dCkgeworICAgICAgYXNzZXJ0LmVxdWFsKG1hcFRlc3RPdXRwdXRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiU2V0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLDIsM107Ci0gICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3Qgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQpLCBzZXRUZXN0SW5wdXQpOwogICB9KTsKIAotICB0ZXN0KCJMaXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGxpc3RUZXN0SW5wdXQgPSBbMSwyLDNdOwotICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGFzc2VydC5vayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOwogICB9KTsKIAotICB0ZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwogICB9KTsKIAotICB0ZXN0KCJUeXBlRGVmIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RUeXBlZGVmKDY5KSwgNjkpOworICBRVW5pdC50ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKICAgfSk7CiAKKyAgUVVuaXQudGVzdCgnU2tpcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIGNvbnN0IG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CiAKLW1vZHVsZSgiZGVlcGVyISIpOworICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgeworICAgICAgY29uc3QgaW5wdXQgPSBtb2RpZmllZENsaWVudC5pbnB1dDsKKyAgICAgIGNvbnN0IHh0cnVjdDMgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QzKCk7CiAKLSAgdGVzdCgiTWFwTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKLSAgICAgICI0Ijp7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9LAotICAgICAgIi00Ijp7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KKyAgICAgIGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIGlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOworCisgICAgICAvLyByZWFkIFh0cnVjdCBkYXRhIHdpdGggWHRydWN0MworICAgICAgaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgIHh0cnVjdDMucmVhZChpbnB1dCk7CisgICAgICBpbnB1dC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIC8vIHJlYWQgVGhyaWZ0LlR5cGUuU1RPUCBtZXNzYWdlCisgICAgICBpbnB1dC5yZWFkRmllbGRCZWdpbigpOworICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7CisKKyAgICAgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGlucHV0LnJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICAgIHJldHVybiB4dHJ1Y3QzOwogICAgIH07CiAKLSAgICB2YXIgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3Qgc3RydWN0VGVzdE91dHB1dCA9IG1vZGlmaWVkQ2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKKyAgfSk7CiAKIAotICAgIGZvciAodmFyIGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7Ci0gICAgICBmb3IgKHZhciBrZXkyIGluIG1hcE1hcFRlc3RPdXRwdXRba2V5XSkgewotICAgICAgICBlcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOworCisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNvbnN0IG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKKworCisgICAgZm9yIChsZXQga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGZvciAobGV0IGtleTIgaW4gbWFwTWFwVGVzdE91dHB1dFtrZXldKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXBNYXBUZXN0T3V0cHV0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgY2hlY2tSZWN1cnNpdmVseShtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworCisgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CiAgIH0pOwogCiAKLW1vZHVsZSgiRXhjZXB0aW9uIik7CitRVW5pdC5tb2R1bGUoJ0V4Y2VwdGlvbicpOwogCi0gIHRlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgIH1jYXRjaChlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7CisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOworICAgICAgYXNzZXJ0Lm9rKGZhbHNlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5lcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7CisgICAgICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnWGNlcHRpb24nKTsKKyAgICAgIGRvbmUoKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIm5vIEV4Y2VwdGlvbiIsIDAsIGZ1bmN0aW9uKCkgewotICAgIHRyeXsKLSAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKLSAgICB9Y2F0Y2goZSl7Ci0gICAgICBvayhmYWxzZSk7CisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKKyAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICB9Y2F0Y2ggKGUpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJ1bmV4cGVjdGVkIEFwcGxpY2F0aW9uIEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCgxKTsKLSAgICB0cnl7Ci0gICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiQXBwbGljYXRpb25FeGNlcHRpb24iKTsKLSAgICB9IGNhdGNoKGUpIHsKLSAgICAgIG9rKHRydWUpOyAvL0BIQUNLOiBpZ25vcmUgZmF1bHR5IGphdmEgc2VydmVyIHJlc3BvbnNlIGZvciBleGNlcHRpb25zCi0gICAgICAvL2VxdWFsKGUubWVzc2FnZSwgIkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgIFFVbml0LnRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAvL1RocmlmdFRlc3QgZG9lcyBub3QgbGlzdCBURXhjZXB0aW9uIGFzIGEgbGVnYWwgZXhjZXB0aW9uIHNvIGl0IHdpbGwKKyAgICAvLyBnZW5lcmF0ZSBhbiBleGNlcHRpb24gb24gdGhlIHNlcnZlciB0aGF0IGRvZXMgbm90IHByb3BhZ2F0ZSBiYWNrIHRvCisgICAgLy8gdGhlIGNsaWVudC4gVGhpcyB0ZXN0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVxdWF0ZSB0byAibm8gZXhjZXB0aW9uIgorICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgLy9hc3NlcnQub2soZmFsc2UpOwogICAgIH0KKyAgICBhc3NlcnQub2sodHJ1ZSk7CiAgIH0pOwogCiAKLW1vZHVsZSgiSW5zYW5pdHkiKTsKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKIAotICB0ZXN0KCJ0ZXN0SW5zYW5pdHkiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgaW5zYW5pdHkgPSB7Ci0gICAgICAiMSI6ewotICAgICAgICAiMiI6ewotICAgICAgICAgICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAotICAgICAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6NAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9LAotICAgICAgICAiMyI6ewotICAgICAgICAgICJ1c2VyTWFwIjp7ICI1Ijo1LCAiOCI6OCB9LAotICAgICAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgICAgICAgImk2NF90aGluZyI6NAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgXQotICAgICAgICB9CisgIGNvbnN0IGNyYXp5ID0geworICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgJ2J5dGVfdGhpbmcnOiA0LAorICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAnaTY0X3RoaW5nJzogNAorICAgIH0sCisgICAgeworICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAnaTY0X3RoaW5nJzogMgorICAgIH1dCisgIH07CisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogY3JhenksCisgICAgICAgICczJzogY3JhenkKICAgICAgIH0sCi0gICAgICAiMiI6eyAiNiI6eyAidXNlck1hcCI6bnVsbCwgInh0cnVjdHMiOm51bGwgfSB9CisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQogICAgIH07Ci0gICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoKSk7Ci0gICAgb2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKLSAgICBvayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgICBjb25zdCByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CisgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgYXNzZXJ0Lm9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOwogCi0gICAgY2hlY2tSZWN1cnNpdmVseShyZXMsIGluc2FuaXR5KTsKKyAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CiAgIH0pOwogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vUnVuIHNhbWUgdGVzdHMgYXN5bmNocm9ub3VzbHkKLWpRdWVyeS5hamF4U2V0dXAoeyB0aW1lb3V0OiAwIH0pOwotJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgUVVuaXQuc3RhcnQoKTsgfSApOwogCi1tb2R1bGUoIkFzeW5jIE1hbnVhbCIpOworUVVuaXQubW9kdWxlKCdBc3luYycpOwogCi0gIHRlc3QoInRlc3RJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CiAKLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKLQotICAgIHZhciBqcXhociA9IGpRdWVyeS5hamF4KHsKLSAgICAgIHVybDogIi9zZXJ2aWNlIiwKLSAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJMzIoTWF0aC5wb3coLTIsMzEpKSwKLSAgICAgIHR5cGU6ICJQT1NUIiwKLSAgICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgIGRhdGFUeXBlOiAidGV4dCIsCi0gICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpewotICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICk7Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKLSAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0pOwotCi0KLSAgdGVzdCgidGVzdEk2NCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMiApOwotICAgIFFVbml0LnN0b3AoKTsKLQotICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwotCi0gICAgalF1ZXJ5LmFqYXgoewotICAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEk2NChNYXRoLnBvdygtMiw2MSkpLAotICAgICAgdHlwZTogIlBPU1QiLAotICAgICAgY2FjaGU6IGZhbHNlLAotICAgICAgZGF0YVR5cGU6ICJ0ZXh0IiwKLSAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcyl7Ci0gICAgICAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKCByZXMgKTsKLSAgICAgICAgZXF1YWwoY2xpZW50LnJlY3ZfdGVzdEk2NCgpLCBNYXRoLnBvdygtMiw2MSkpOwotICAgICAgfSwKLSAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgb2soZmFsc2UpOyB9LAotICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgewotICAgICAgICBvayh0cnVlKTsKLSAgICAgICAgUVVuaXQuc3RhcnQoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfSk7Ci0KLQotbW9kdWxlKCJBc3luYyIpOwotCi0gIHRlc3QoIkRvdWJsZSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotCi0gICAgUVVuaXQuc3RvcCgpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKICAgICBjbGllbnQudGVzdERvdWJsZSgzLjE0MTU5MjY1LCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgMy4xNDE1OTI2NSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMy4xNDE1OTI2NSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIHRlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOwogICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgMHgwMSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMHgwMSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwzMCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIHZhciBqcXhociA9IGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDMxKSk7Ci0gICAgfSk7Ci0KLSAgICBqcXhoci5zdWNjZXNzKGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwzMSkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDQgKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKIAotICAgIFFVbml0LnN0b3AoKTsKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDYwKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsNjApKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coLTIsNjEpLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsNjEpKTsKLSAgICB9KQotICAgIC5lcnJvciggZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGUpIHsgIG9rKGZhbHNlLCBlLm1lc3NhZ2UpOyB9ICkKLSAgICAuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsNjEpKTsKLSAgICB9KQotICAgIC5jb21wbGV0ZShmdW5jdGlvbigpIHsKLSAgICAgIG9rKHRydWUpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKLSAgICB9KTsKLSAgfSk7Ci0KLSAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLQotICAgIFFVbml0LnN0b3AoKTsKLQotICAgIHZhciBkZmQgPSBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIG9rKGZhbHNlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7Ci0gICAgfSkKLSAgICAuZXJyb3IoZnVuY3Rpb24oeGhyLCBzdGF0dXMsIGUpewotICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQorICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNWY3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogJ0xpY2Vuc2UnKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogJ0FTIElTJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy9UaGlzIGlzIHRoZSBzZXJ2ZXIgc2lkZSBOb2RlIHRlc3QgaGFuZGxlciBmb3IgdGhlIHN0YW5kYXJkCisvLyAgQXBhY2hlIFRocmlmdCB0ZXN0IHNlcnZpY2UuCisKK2NvbnN0IGVzNk1vZGUgPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXM2Jyk7Citjb25zdCBnZW5Gb2xkZXIgPSBlczZNb2RlID8gJ2dlbi1ub2RlanMtZXM2JyA6ICdnZW4tbm9kZWpzJzsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpLlRFeGNlcHRpb247CisKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSB7CisgIHRlc3RWb2lkOiBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFZvaWQoKScpOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKyAgdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nKFwnJyArIHRoaW5nICsgJ1wnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RCeXRlOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RCeXRlKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEkzMjogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0STMyKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEk2NDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0STY0KCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdERvdWJsZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RG91YmxlKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdEJpbmFyeTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0QmluYXJ5KFwnJyArIHRoaW5nICsgJ1wnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTdHJ1Y3Q6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFN0cnVjdCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0TmVzdDogZnVuY3Rpb24obmVzdCwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3ROZXN0KCcpOworICAgIGNvbnNvbGUubG9nKG5lc3QpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIG5lc3QpOworICB9LAorICB0ZXN0TWFwOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RNYXAoJyk7CisgICAgY29uc29sZS5sb2codGhpbmcpOworICAgIGNvbnNvbGUubG9nKCcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdFN0cmluZ01hcDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0U3RyaW5nTWFwKCcpOworICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKKyAgICBjb25zb2xlLmxvZygnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RTZXQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdFNldCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0TGlzdDogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TGlzdCgnKTsKKyAgICBjb25zb2xlLmxvZyh0aGluZyk7CisgICAgY29uc29sZS5sb2coJyknKTsKKyAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICB9LAorICB0ZXN0RW51bTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0RW51bSgnICsgdGhpbmcgKyAnKScpOworICAgIHJlc3VsdChudWxsLCB0aGluZyk7CisgIH0sCisgIHRlc3RUeXBlZGVmOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RUeXBlZGVmKCcgKyB0aGluZyArICcpJyk7CisgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKKyAgfSwKKyAgdGVzdE1hcE1hcDogZnVuY3Rpb24oaGVsbG8sIHJlc3VsdCkgeworICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CisKKyAgICBjb25zdCBtYXBtYXAgPSBbXTsKKyAgICBjb25zdCBwb3MgPSBbXTsKKyAgICBjb25zdCBuZWcgPSBbXTsKKyAgICBmb3IgKGxldCBpID0gMTsgaSA8IDU7IGkrKykgeworICAgICAgcG9zW2ldID0gaTsKKyAgICAgIG5lZ1staV0gPSAtaTsKKyAgICB9CisgICAgbWFwbWFwWzRdID0gcG9zOworICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICByZXN1bHQobnVsbCwgbWFwbWFwKTsKKyAgfSwKKyAgdGVzdEluc2FuaXR5OiBmdW5jdGlvbihhcmd1bWVudCwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RJbnNhbml0eSgnKTsKKyAgICBjb25zb2xlLmxvZyhhcmd1bWVudCk7CisgICAgY29uc29sZS5sb2coJyknKTsKKworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSAyOworICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CisKKyAgICBjb25zdCBnb29kYnllID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICdHb29kYnllNCc7CisgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKKyAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7CisgICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OworCisgICAgY29uc3QgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KCk7CisgICAgY3JhenkudXNlck1hcCA9IFtdOworICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRUlHSFRdID0gODsKKyAgICBjcmF6eS51c2VyTWFwW3R0eXBlcy5OdW1iZXJ6LkZJVkVdID0gNTsKKyAgICBjcmF6eS54dHJ1Y3RzID0gW2dvb2RieWUsIGhlbGxvXTsKKworICAgIGNvbnN0IGZpcnN0X21hcCA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXAgPSBbXTsKKworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gY3Jhenk7CisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OworCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKworICAgIGNvbnN0IGluc2FuZSA9IFtdOworICAgIGluc2FuZVsxXSA9IGZpcnN0X21hcDsKKyAgICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOworCisgICAgY29uc29sZS5sb2coJ2luc2FuZSByZXN1bHQ6Jyk7CisgICAgY29uc29sZS5sb2coaW5zYW5lKTsKKyAgICByZXN1bHQobnVsbCwgaW5zYW5lKTsKKyAgfSwKKyAgdGVzdE11bHRpOiBmdW5jdGlvbihhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKKworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgcmVzdWx0KG51bGwsIGhlbGxvKTsKKyAgfSwKKyAgdGVzdEV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKKyAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnID09PSAnVEV4Y2VwdGlvbicpIHsKKyAgICAgIHJlc3VsdChuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgfSwKKyAgdGVzdE11bHRpRXhjZXB0aW9uOiBmdW5jdGlvbihhcmcwLCBhcmcxLCByZXN1bHQpIHsKKyAgICBjb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICBjb25zdCB4MiA9IG5ldyB0dHlwZXMuWGNlcHRpb24yKCk7CisgICAgICB4Mi5lcnJvckNvZGUgPSAyMDAyOworICAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHgyLnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbjInOworICAgICAgcmVzdWx0KHgyKTsKKyAgICB9CisKKyAgICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgIHJlc3VsdChudWxsLCByZXMpOworICB9LAorICB0ZXN0T25ld2F5OiBmdW5jdGlvbihzbGVlcEZvciwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coJ3Rlc3RPbmV3YXkoJyArIHNsZWVwRm9yICsgJykgPT4gSmF2YVNjcmlwdCAobGlrZSBSdXN0KSBuZXZlciBzbGVlcHMhJyk7CisgIH0KK307ICAgLy9UaHJpZnRUZXN0U3ZjSGFuZGxlcgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0d3MuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODQ1MDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdHdzLmh0bWwKQEAgLTAsMCArMSw2MiBAQAor77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0galF1ZXJ5IC0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBRVW5pdCBUZXN0IGZyYW1ld29yay0tPgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CisgIDxzY3JpcHQ+CisgICAgY29uc3QgbG9jID0gd2luZG93LmxvY2F0aW9uOworICAgIGNvbnN0IHdzX3VyaSA9ICgobG9jLnByb3RvY29sID09PSAiaHR0cHM6IikgPyAid3NzOi8vIiA6ICJ3czovLyIpICsKKyAgICAgICAgICAgICAgICAgICBsb2MuaG9zdG5hbWUgKyAiOiIgKyBsb2MucG9ydCArIGxvYy5wYXRobmFtZTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQod3NfdXJpKTsKKyAgICBjb25zdCBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgY29uc3QgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgPC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InRlc3QtYXN5bmMuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3RocmlmdC5qcyBiL2xpYi9qcy90aHJpZnQuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDM2YjkuLjAwMDAwMDAKLS0tIGEvbGliL2pzL3RocmlmdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi12YXIgVGhyaWZ0ID0gewotICAgIFZlcnNpb246ICcwLjkuMCcsCi0vKgotICAgIERlc2NyaXB0aW9uOiAnSmF2YVNjcmlwdCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbScsCi0gICAgTGljZW5zZTogJ2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCcsCi0gICAgSG9tZXBhZ2U6ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAotICAgIEJ1Z1JlcG9ydHM6ICdodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCcsCi0gICAgTWFpbnRhaW5lcjogJ2RldkB0aHJpZnQuYXBhY2hlLm9yZycsCi0qLwotCi0gICAgVHlwZTogewotICAgICAgICAnU1RPUCcgOiAwLAotICAgICAgICAnVk9JRCcgOiAxLAotICAgICAgICAnQk9PTCcgOiAyLAotICAgICAgICAnQllURScgOiAzLAotICAgICAgICAnSTA4JyA6IDMsCi0gICAgICAgICdET1VCTEUnIDogNCwKLSAgICAgICAgJ0kxNicgOiA2LAotICAgICAgICAnSTMyJyA6IDgsCi0gICAgICAgICdJNjQnIDogMTAsCi0gICAgICAgICdTVFJJTkcnIDogMTEsCi0gICAgICAgICdVVEY3JyA6IDExLAotICAgICAgICAnU1RSVUNUJyA6IDEyLAotICAgICAgICAnTUFQJyA6IDEzLAotICAgICAgICAnU0VUJyA6IDE0LAotICAgICAgICAnTElTVCcgOiAxNSwKLSAgICAgICAgJ1VURjgnIDogMTYsCi0gICAgICAgICdVVEYxNicgOiAxNwotICAgIH0sCi0KLSAgICBNZXNzYWdlVHlwZTogewotICAgICAgICAnQ0FMTCcgOiAxLAotICAgICAgICAnUkVQTFknIDogMiwKLSAgICAgICAgJ0VYQ0VQVElPTicgOiAzCi0gICAgfSwKLQotICAgIG9iamVjdExlbmd0aDogZnVuY3Rpb24ob2JqKSB7Ci0gICAgICAgIHZhciBsZW5ndGggPSAwOwotICAgICAgICBmb3IgKHZhciBrIGluIG9iaikgewotICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrKSkgewotICAgICAgICAgICAgICAgIGxlbmd0aCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSAgICB9LAotCi0gICAgaW5oZXJpdHM6IGZ1bmN0aW9uKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKSB7Ci0gICAgICAvL1Byb3RvdHlwYWwgSW5oZXJpdGFuY2UgaHR0cDovL2phdmFzY3JpcHQuY3JvY2tmb3JkLmNvbS9wcm90b3R5cGFsLmh0bWwKLSAgICAgIGZ1bmN0aW9uIEYoKSB7fQotICAgICAgRi5wcm90b3R5cGUgPSBzdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZTsKLSAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG5ldyBGKCk7Ci0gICAgfQotfTsKLQotCi0KLVRocmlmdC5URXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSkgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci19OwotVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5URXhjZXB0aW9uLCBFcnJvcik7Ci1UaHJpZnQuVEV4Y2VwdGlvbi5wcm90b3R5cGUubmFtZSA9ICdURXhjZXB0aW9uJzsKLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7Ci0gICAgJ1VOS05PV04nIDogMCwKLSAgICAnVU5LTk9XTl9NRVRIT0QnIDogMSwKLSAgICAnSU5WQUxJRF9NRVNTQUdFX1RZUEUnIDogMiwKLSAgICAnV1JPTkdfTUVUSE9EX05BTUUnIDogMywKLSAgICAnQkFEX1NFUVVFTkNFX0lEJyA6IDQsCi0gICAgJ01JU1NJTkdfUkVTVUxUJyA6IDUsCi0gICAgJ0lOVEVSTkFMX0VSUk9SJyA6IDYsCi0gICAgJ1BST1RPQ09MX0VSUk9SJyA6IDcKLX07Ci0KLVRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBmdW5jdGlvbihtZXNzYWdlLCBjb2RlKSB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB0aGlzLmNvZGUgPSAoY29kZSA9PT0gbnVsbCkgPyAwIDogY29kZTsKLX07Ci1UaHJpZnQuaW5oZXJpdHMoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgVGhyaWZ0LlRFeGNlcHRpb24pOwotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUubmFtZSA9ICdUQXBwbGljYXRpb25FeGNlcHRpb24nOwotCi1UaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsKLSAgICB3aGlsZSAoMSkgewotICAgICAgICB2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsKLQotICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIGZpZCA9IHJldC5maWQ7Ci0KLSAgICAgICAgc3dpdGNoIChmaWQpIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICBpZiAocmV0LmZ0eXBlID09IFRocmlmdC5UeXBlLlNUUklORykgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IHJldC52YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGlmIChyZXQuZnR5cGUgPT0gVGhyaWZ0LlR5cGUuSTMyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2RlID0gcmV0LnZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgaW5wdXQucmVhZFN0cnVjdEVuZCgpOwotfTsKLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpIHsKLSAgICB2YXIgeGZlciA9IDA7Ci0KLSAgICBvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0KLSAgICBpZiAodGhpcy5tZXNzYWdlKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUaHJpZnQuVHlwZS5TVFJJTkcsIDEpOwotICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmcodGhpcy5nZXRNZXNzYWdlKCkpOwotICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIGlmICh0aGlzLmNvZGUpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbigndHlwZScsIFRocmlmdC5UeXBlLkkzMiwgMik7Ci0gICAgICAgIG91dHB1dC53cml0ZUkzMih0aGlzLmNvZGUpOwotICAgICAgICBvdXRwdXQud3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIG91dHB1dC53cml0ZUZpZWxkU3RvcCgpOwotICAgIG91dHB1dC53cml0ZVN0cnVjdEVuZCgpOwotfTsKLQotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUuZ2V0Q29kZSA9IGZ1bmN0aW9uKCkgewotICAgIHJldHVybiB0aGlzLmNvZGU7Ci19OwotCi1UaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS5nZXRNZXNzYWdlID0gZnVuY3Rpb24oKSB7Ci0gICAgcmV0dXJuIHRoaXMubWVzc2FnZTsKLX07Ci0KLS8qKgotICpJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB1cmwgdGhlbiB5b3UgbXVzdCBoYW5kbGUgYWpheCBvbiB5b3VyIG93bi4KLSAqVGhpcyBpcyBob3cgdG8gdXNlIGpzIGJpbmRpbmdzIGluIGEgYXN5bmMgZmFzaGlvbi4KLSAqLwotVGhyaWZ0LlRyYW5zcG9ydCA9IGZ1bmN0aW9uKHVybCkgewotICAgIHRoaXMudXJsID0gdXJsOwotICAgIHRoaXMud3BvcyA9IDA7Ci0gICAgdGhpcy5ycG9zID0gMDsKLQotICAgIHRoaXMuc2VuZF9idWYgPSAnJzsKLSAgICB0aGlzLnJlY3ZfYnVmID0gJyc7Ci19OwotCi1UaHJpZnQuVHJhbnNwb3J0LnByb3RvdHlwZSA9IHsKLQotICAgIC8vR2V0cyB0aGUgYnJvd3NlciBzcGVjaWZpYyBYbWxIdHRwUmVxdWVzdCBPYmplY3QKLSAgICBnZXRYbWxIdHRwUmVxdWVzdE9iamVjdDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7IHJldHVybiBuZXcgWE1MSHR0cFJlcXVlc3QoKTsgfSBjYXRjaCAoZTEpIHsgfQotICAgICAgICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01zeG1sMi5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUyKSB7IH0KLSAgICAgICAgdHJ5IHsgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpOyB9IGNhdGNoIChlMykgeyB9Ci0KLSAgICAgICAgdGhyb3cgIllvdXIgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIFhtbEh0dHBSZXF1ZXN0IG9iamVjdC4iOwotICAgIH0sCi0KLSAgICBmbHVzaDogZnVuY3Rpb24oYXN5bmMpIHsKLSAgICAgICAgLy9hc3luYyBtb2RlCi0gICAgICAgIGlmIChhc3luYyB8fCB0aGlzLnVybCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudXJsID09PSAnJykgewotICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgeHJlcSA9IHRoaXMuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QoKTsKLQotICAgICAgICBpZiAoeHJlcS5vdmVycmlkZU1pbWVUeXBlKSB7Ci0gICAgICAgICAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHhyZXEub3BlbignUE9TVCcsIHRoaXMudXJsLCBmYWxzZSk7Ci0gICAgICAgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKTsKLQotICAgICAgICBpZiAoeHJlcS5yZWFkeVN0YXRlICE9IDQpIHsKLSAgICAgICAgICAgIHRocm93ICdlbmNvdW50ZXJlZCBhbiB1bmtub3duIGFqYXggcmVhZHkgc3RhdGU6ICcgKyB4cmVxLnJlYWR5U3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeHJlcS5zdGF0dXMgIT0gMjAwKSB7Ci0gICAgICAgICAgICB0aHJvdyAnZW5jb3VudGVyZWQgYSB1bmtub3duIHJlcXVlc3Qgc3RhdHVzOiAnICsgeHJlcS5zdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnJlY3ZfYnVmID0geHJlcS5yZXNwb25zZVRleHQ7Ci0gICAgICAgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKLSAgICAgICAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7Ci0gICAgICAgIHRoaXMucnBvcyA9IDA7Ci0gICAgfSwKLQotICAgIGpxUmVxdWVzdDogZnVuY3Rpb24oY2xpZW50LCBwb3N0RGF0YSwgYXJncywgcmVjdl9tZXRob2QpIHsKLSAgICAgICAgaWYgKHR5cGVvZiBqUXVlcnkgPT09ICd1bmRlZmluZWQnIHx8Ci0gICAgICAgICAgICB0eXBlb2YgalF1ZXJ5LkRlZmVycmVkID09PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICAgdGhyb3cgJ1RocmlmdC5qcyByZXF1aXJlcyBqUXVlcnkgMS41KyB0byB1c2UgYXN5bmNocm9ub3VzIHJlcXVlc3RzJzsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciB0aHJpZnRUcmFuc3BvcnQgPSB0aGlzOwotCi0gICAgICAgIHZhciBqcVhIUiA9IGpRdWVyeS5hamF4KHsKLSAgICAgICAgICAgIHVybDogdGhpcy51cmwsCi0gICAgICAgICAgICBkYXRhOiBwb3N0RGF0YSwKLSAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKLSAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgICAgICAgIGRhdGFUeXBlOiAndGV4dCB0aHJpZnQnLAotICAgICAgICAgICAgY29udmVydGVyczogewotICAgICAgICAgICAgICAgICd0ZXh0IHRocmlmdCcgOiBmdW5jdGlvbihyZXNwb25zZURhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyaWZ0VHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzcG9uc2VEYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gcmVjdl9tZXRob2QuY2FsbChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIGNvbnRleHQ6IGNsaWVudCwKLSAgICAgICAgICAgIHN1Y2Nlc3M6IGpRdWVyeS5tYWtlQXJyYXkoYXJncykucG9wKCkKLSAgICAgICAgfSk7Ci0KLSAgICAgICAgcmV0dXJuIGpxWEhSOwotICAgIH0sCi0KLSAgICBzZXRSZWN2QnVmZmVyOiBmdW5jdGlvbihidWYpIHsKLSAgICAgICAgdGhpcy5yZWN2X2J1ZiA9IGJ1ZjsKLSAgICAgICAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOwotICAgICAgICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKLSAgICAgICAgdGhpcy5ycG9zID0gMDsKLSAgICB9LAotCi0gICAgaXNPcGVuOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSwKLQotICAgIG9wZW46IGZ1bmN0aW9uKCkge30sCi0KLSAgICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKLQotICAgIHJlYWQ6IGZ1bmN0aW9uKGxlbikgewotICAgICAgICB2YXIgYXZhaWwgPSB0aGlzLndwb3MgLSB0aGlzLnJwb3M7Ci0KLSAgICAgICAgaWYgKGF2YWlsID09PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gJyc7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXIgZ2l2ZSA9IGxlbjsKLQotICAgICAgICBpZiAoYXZhaWwgPCBsZW4pIHsKLSAgICAgICAgICAgIGdpdmUgPSBhdmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOwotICAgICAgICB0aGlzLnJwb3MgKz0gZ2l2ZTsKLQotICAgICAgICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0sCi0KLSAgICByZWFkQWxsOiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVjdl9idWY7Ci0gICAgfSwKLQotICAgIHdyaXRlOiBmdW5jdGlvbihidWYpIHsKLSAgICAgICAgdGhpcy5zZW5kX2J1ZiA9IGJ1ZjsKLSAgICB9LAotCi0gICAgZ2V0U2VuZEJ1ZmZlcjogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnNlbmRfYnVmOwotICAgIH0KLQotfTsKLQotCi0KLVRocmlmdC5Qcm90b2NvbCA9IGZ1bmN0aW9uKHRyYW5zcG9ydCkgewotICAgIHRoaXMudHJhbnNwb3J0ID0gdHJhbnNwb3J0OwotfTsKLQotVGhyaWZ0LlByb3RvY29sLlR5cGUgPSB7fTsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkJPT0xdID0gJyJ0ZiInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuQllURV0gPSAnImk4Iic7Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5JMTZdID0gJyJpMTYiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkkzMl0gPSAnImkzMiInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuSTY0XSA9ICciaTY0Iic7Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5ET1VCTEVdID0gJyJkYmwiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLlNUUlVDVF0gPSAnInJlYyInOwotVGhyaWZ0LlByb3RvY29sLlR5cGVbVGhyaWZ0LlR5cGUuU1RSSU5HXSA9ICcic3RyIic7Ci1UaHJpZnQuUHJvdG9jb2wuVHlwZVtUaHJpZnQuVHlwZS5NQVBdID0gJyJtYXAiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLkxJU1RdID0gJyJsc3QiJzsKLVRocmlmdC5Qcm90b2NvbC5UeXBlW1RocmlmdC5UeXBlLlNFVF0gPSAnInNldCInOwotCi0KLVRocmlmdC5Qcm90b2NvbC5SVHlwZSA9IHt9OwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLnRmID0gVGhyaWZ0LlR5cGUuQk9PTDsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5pOCA9IFRocmlmdC5UeXBlLkJZVEU7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUuaTE2ID0gVGhyaWZ0LlR5cGUuSTE2OwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLmkzMiA9IFRocmlmdC5UeXBlLkkzMjsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5pNjQgPSBUaHJpZnQuVHlwZS5JNjQ7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUuZGJsID0gVGhyaWZ0LlR5cGUuRE9VQkxFOwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLnJlYyA9IFRocmlmdC5UeXBlLlNUUlVDVDsKLVRocmlmdC5Qcm90b2NvbC5SVHlwZS5zdHIgPSBUaHJpZnQuVHlwZS5TVFJJTkc7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUubWFwID0gVGhyaWZ0LlR5cGUuTUFQOwotVGhyaWZ0LlByb3RvY29sLlJUeXBlLmxzdCA9IFRocmlmdC5UeXBlLkxJU1Q7Ci1UaHJpZnQuUHJvdG9jb2wuUlR5cGUuc2V0ID0gVGhyaWZ0LlR5cGUuU0VUOwotCi1UaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiA9IDE7Ci0KLVRocmlmdC5Qcm90b2NvbC5wcm90b3R5cGUgPSB7Ci0KLSAgICBnZXRUcmFuc3BvcnQ6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy50cmFuc3BvcnQ7Ci0gICAgfSwKLQotICAgIC8vV3JpdGUgZnVuY3Rpb25zCi0gICAgd3JpdGVNZXNzYWdlQmVnaW46IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCkgewotICAgICAgICB0aGlzLnRzdGFjayA9IFtdOwotICAgICAgICB0aGlzLnRwb3MgPSBbXTsKLQotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbiwgJyInICsKLSAgICAgICAgICAgIG5hbWUgKyAnIicsIG1lc3NhZ2VUeXBlLCBzZXFpZF0pOwotICAgIH0sCi0KLSAgICB3cml0ZU1lc3NhZ2VFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7Ci0KLSAgICAgICAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7Ci0gICAgICAgIHRoaXMud29iai5wdXNoKG9iaik7Ci0KLSAgICAgICAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKLQotICAgICAgICB0aGlzLnRyYW5zcG9ydC53cml0ZSh0aGlzLndidWYpOwotICAgICB9LAotCi0KLSAgICB3cml0ZVN0cnVjdEJlZ2luOiBmdW5jdGlvbihuYW1lKSB7Ci0gICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goe30pOwotICAgIH0sCi0KLSAgICB3cml0ZVN0cnVjdEVuZDogZnVuY3Rpb24oKSB7Ci0KLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7Ci0gICAgICAgIHZhciBzdHJ1Y3QgPSB0aGlzLnRzdGFja1twXTsKLSAgICAgICAgdmFyIHN0ciA9ICd7JzsKLSAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgZm9yICh2YXIga2V5IGluIHN0cnVjdCkgewotICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyICs9ICcsJzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RyICs9ICd9JzsKLSAgICAgICAgdGhpcy50c3RhY2tbcF0gPSBzdHI7Ci0gICAgfSwKLQotICAgIHdyaXRlRmllbGRCZWdpbjogZnVuY3Rpb24obmFtZSwgZmllbGRUeXBlLCBmaWVsZElkKSB7Ci0gICAgICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goeyAnZmllbGRJZCc6ICciJyArCi0gICAgICAgICAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVGhyaWZ0LlByb3RvY29sLlR5cGVbZmllbGRUeXBlXQotICAgICAgICB9KTsKLQotICAgIH0sCi0KLSAgICB3cml0ZUZpZWxkRW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHZhbHVlID0gdGhpcy50c3RhY2sucG9wKCk7Ci0gICAgICAgIHZhciBmaWVsZEluZm8gPSB0aGlzLnRzdGFjay5wb3AoKTsKLQotICAgICAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKwotICAgICAgICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOwotICAgICAgICB0aGlzLnRwb3MucG9wKCk7Ci0gICAgfSwKLQotICAgIHdyaXRlRmllbGRTdG9wOiBmdW5jdGlvbigpIHsKLSAgICAgICAgLy9uYQotICAgIH0sCi0KLSAgICB3cml0ZU1hcEJlZ2luOiBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7Ci0gICAgICAgIC8vc2l6ZSBpcyBpbnZhbGlkLCB3ZSdsbCBzZXQgaXQgb24gZW5kLgotICAgICAgICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOwotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKFtUaHJpZnQuUHJvdG9jb2wuVHlwZVtrZXlUeXBlXSwKLSAgICAgICAgICAgIFRocmlmdC5Qcm90b2NvbC5UeXBlW3ZhbFR5cGVdLCAwXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlTWFwRW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7Ci0KLSAgICAgICAgaWYgKHAgPT0gdGhpcy50c3RhY2subGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHRoaXMudHN0YWNrLmxlbmd0aCAtIHAgLSAxKSAlIDIgIT09IDApIHsKLSAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2goJycpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHNpemUgPSAodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpIC8gMjsKLQotICAgICAgICB0aGlzLnRzdGFja1twXVt0aGlzLnRzdGFja1twXS5sZW5ndGggLSAxXSA9IHNpemU7Ci0KLSAgICAgICAgdmFyIG1hcCA9ICd9JzsKLSAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7Ci0gICAgICAgICAgICB2YXIgdiA9IHRoaXMudHN0YWNrLnBvcCgpOwotICAgICAgICAgICAgdmFyIGsgPSB0aGlzLnRzdGFjay5wb3AoKTsKLSAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hcCA9ICcsJyArIG1hcDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCEgaXNOYU4oaykpIHsgayA9ICciJyArIGsgKyAnIic7IH0gLy9qc29uICJrZXlzIiBuZWVkIHRvIGJlIHN0cmluZ3MKLSAgICAgICAgICAgIG1hcCA9IGsgKyAnOicgKyB2ICsgbWFwOwotICAgICAgICB9Ci0gICAgICAgIG1hcCA9ICd7JyArIG1hcDsKLQotICAgICAgICB0aGlzLnRzdGFja1twXS5wdXNoKG1hcCk7Ci0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOwotICAgIH0sCi0KLSAgICB3cml0ZUxpc3RCZWdpbjogZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLCBzaXplXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlTGlzdEVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOwotCi0gICAgICAgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgewotICAgICAgICAgICAgdmFyIHRtcFZhbCA9IHRoaXMudHN0YWNrW3AgKyAxXTsKLSAgICAgICAgICAgIHRoaXMudHN0YWNrLnNwbGljZShwICsgMSwgMSk7Ci0gICAgICAgICAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKLSAgICB9LAotCi0gICAgd3JpdGVTZXRCZWdpbjogZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKLSAgICAgICAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChbVGhyaWZ0LlByb3RvY29sLlR5cGVbZWxlbVR5cGVdLCBzaXplXSk7Ci0gICAgfSwKLQotICAgIHdyaXRlU2V0RW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7Ci0KLSAgICAgICAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7Ci0gICAgICAgICAgICB2YXIgdG1wVmFsID0gdGhpcy50c3RhY2tbcCArIDFdOwotICAgICAgICAgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKLSAgICAgICAgICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOwotICAgIH0sCi0KLSAgICB3cml0ZUJvb2w6IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2godmFsdWUgPyAxIDogMCk7Ci0gICAgfSwKLQotICAgIHdyaXRlQnl0ZTogZnVuY3Rpb24oaTgpIHsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpOCk7Ci0gICAgfSwKLQotICAgIHdyaXRlSTE2OiBmdW5jdGlvbihpMTYpIHsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChpMTYpOwotICAgIH0sCi0KLSAgICB3cml0ZUkzMjogZnVuY3Rpb24oaTMyKSB7Ci0gICAgICAgIHRoaXMudHN0YWNrLnB1c2goaTMyKTsKLSAgICB9LAotCi0gICAgd3JpdGVJNjQ6IGZ1bmN0aW9uKGk2NCkgewotICAgICAgICB0aGlzLnRzdGFjay5wdXNoKGk2NCk7Ci0gICAgfSwKLQotICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbihkYmwpIHsKLSAgICAgICAgdGhpcy50c3RhY2sucHVzaChkYmwpOwotICAgIH0sCi0KLSAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7Ci0gICAgICAgIC8vIFdlIGRvIG5vdCBlbmNvZGUgdXJpIGNvbXBvbmVudHMgZm9yIHdpcmUgdHJhbnNmZXI6Ci0gICAgICAgIGlmIChzdHIgPT09IG51bGwpIHsKLSAgICAgICAgICAgIHRoaXMudHN0YWNrLnB1c2gobnVsbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBjb25jYXQgbWF5IGJlIHNsb3dlciB0aGFuIGJ1aWxkaW5nIGEgYnl0ZSBidWZmZXIKLSAgICAgICAgICAgIHZhciBlc2NhcGVkU3RyaW5nID0gJyc7Ci0gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHZhciBjaCA9IHN0ci5jaGFyQXQoaSk7ICAgICAgLy8gYSBzaW5nbGUgZG91YmxlIHF1b3RlOiAiCi0gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXCInKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcXCInOyAvLyB3cml0ZSBvdXQgYXM6IFwiCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc2xhc2g6IFwKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcXCc7IC8vIHdyaXRlIG91dCBhczogXFwKLSAgICAgICAgICAgICAgICAvKiBDdXJyZW50bHkgZXNjYXBlZCBmb3J3YXJkIHNsYXNoZXMgYnJlYWsgVEpTT05Qcm90b2NvbC4KLSAgICAgICAgICAgICAgICAgKiBBcyBpdCBzdGFuZHMsIHdlIGNhbiBzaW1wbHkgcGFzcyBmb3J3YXJkIHNsYXNoZXMgaW50bwotICAgICAgICAgICAgICAgICAqIG91ciBzdHJpbmdzIGFjcm9zcyB0aGUgd2lyZSB3aXRob3V0IGJlaW5nIGVzY2FwZWQuCi0gICAgICAgICAgICAgICAgICogSSB0aGluayB0aGlzIGlzIHRoZSBwcm90b2NvbCdzIGJ1Zywgbm90IHRocmlmdC5qcwotICAgICAgICAgICAgICAgICAqIH0gZWxzZSBpZihjaCA9PT0gJy8nKSB7ICAgLy8gYSBzaW5nbGUgZm9yd2FyZCBzbGFzaDogLwotICAgICAgICAgICAgICAgICAqICBlc2NhcGVkU3RyaW5nICs9ICdcXC8nOyAgLy8gd3JpdGUgb3V0IGFzIFwvCi0gICAgICAgICAgICAgICAgICogfQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcYicpIHsgICAgLy8gYSBzaW5nbGUgYmFja3NwYWNlOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxiJzsgIC8vIHdyaXRlIG91dCBhczogXGIiCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xmJykgeyAgICAvLyBhIHNpbmdsZSBmb3JtZmVlZDogaW52aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcZic7ICAvLyB3cml0ZSBvdXQgYXM6IFxmIgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdcbicpIHsgICAgLy8gYSBzaW5nbGUgbmV3bGluZTogaW52aXNpYmxlCi0gICAgICAgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcbic7ICAvLyB3cml0ZSBvdXQgYXM6IFxuIgotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICdccicpIHsgICAgLy8gYSBzaW5nbGUgcmV0dXJuOiBpbnZpc2libGUKLSAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxyJzsgIC8vIHdyaXRlIG91dCBhczogXHIiCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1x0JykgeyAgICAvLyBhIHNpbmdsZSB0YWI6IGludmlzaWJsZQotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHQnOyAgLy8gd3JpdGUgb3V0IGFzOiBcdCIKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9IGNoOyAgICAgLy8gRWxzZSBpdCBuZWVkIG5vdCBiZSBlc2NhcGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhpcy50c3RhY2sucHVzaCgnIicgKyBlc2NhcGVkU3RyaW5nICsgJyInKTsKLSAgICAgICAgfQotICAgIH0sCi0KLSAgICB3cml0ZUJpbmFyeTogZnVuY3Rpb24oc3RyKSB7Ci0gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTsKLSAgICB9LAotCi0KLQotICAgIC8vIFJlYWRpbmcgZnVuY3Rpb25zCi0gICAgcmVhZE1lc3NhZ2VCZWdpbjogZnVuY3Rpb24obmFtZSwgbWVzc2FnZVR5cGUsIHNlcWlkKSB7Ci0gICAgICAgIHRoaXMucnN0YWNrID0gW107Ci0gICAgICAgIHRoaXMucnBvcyA9IFtdOwotCi0gICAgICAgIGlmICh0eXBlb2YgalF1ZXJ5ICE9PSAndW5kZWZpbmVkJykgewotICAgICAgICAgICAgdGhpcy5yb2JqID0galF1ZXJ5LnBhcnNlSlNPTih0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5yb2JqID0gZXZhbCh0aGlzLnRyYW5zcG9ydC5yZWFkQWxsKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHIgPSB7fTsKLSAgICAgICAgdmFyIHZlcnNpb24gPSB0aGlzLnJvYmouc2hpZnQoKTsKLQotICAgICAgICBpZiAodmVyc2lvbiAhPSBUaHJpZnQuUHJvdG9jb2wuVmVyc2lvbikgewotICAgICAgICAgICAgdGhyb3cgJ1dyb25nIHRocmlmdCBwcm90b2NvbCB2ZXJzaW9uOiAnICsgdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHIuZm5hbWUgPSB0aGlzLnJvYmouc2hpZnQoKTsKLSAgICAgICAgci5tdHlwZSA9IHRoaXMucm9iai5zaGlmdCgpOwotICAgICAgICByLnJzZXFpZCA9IHRoaXMucm9iai5zaGlmdCgpOwotCi0KLSAgICAgICAgLy9nZXQgdG8gdGhlIG1haW4gb2JqCi0gICAgICAgIHRoaXMucnN0YWNrLnB1c2godGhpcy5yb2JqLnNoaWZ0KCkpOwotCi0gICAgICAgIHJldHVybiByOwotICAgIH0sCi0KLSAgICByZWFkTWVzc2FnZUVuZDogZnVuY3Rpb24oKSB7Ci0gICAgfSwKLQotICAgIHJlYWRTdHJ1Y3RCZWdpbjogZnVuY3Rpb24obmFtZSkgewotICAgICAgICB2YXIgciA9IHt9OwotICAgICAgICByLmZuYW1lID0gJyc7Ci0KLSAgICAgICAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCi0gICAgICAgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEFycmF5KSB7Ci0gICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdLnNoaWZ0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRTdHJ1Y3RFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICBpZiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMl0gaW5zdGFuY2VvZiBBcnJheSkgewotICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7Ci0gICAgICAgIH0KLSAgICB9LAotCi0gICAgcmVhZEZpZWxkQmVnaW46IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgciA9IHt9OwotCi0gICAgICAgIHZhciBmaWQgPSAtMTsKLSAgICAgICAgdmFyIGZ0eXBlID0gVGhyaWZ0LlR5cGUuU1RPUDsKLQotICAgICAgICAvL2dldCBhIGZpZWxkSWQKLSAgICAgICAgZm9yICh2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7Ci0gICAgICAgICAgICBpZiAoZiA9PT0gbnVsbCkgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlkID0gcGFyc2VJbnQoZiwgMTApOwotICAgICAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKLQotICAgICAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKLQotICAgICAgICAgICAgLy9yZW1vdmUgc28gd2UgZG9uJ3Qgc2VlIGl0IGFnYWluCi0gICAgICAgICAgICBkZWxldGUgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKLQotICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmaWVsZCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpZCAhPSAtMSkgewotCi0gICAgICAgICAgICAvL3Nob3VsZCBvbmx5IGJlIDEgb2YgdGhlc2UgYnV0IHRoaXMgaXMgdGhlIG9ubHkKLSAgICAgICAgICAgIC8vd2F5IHRvIG1hdGNoIGEga2V5Ci0gICAgICAgICAgICBmb3IgKHZhciBpIGluICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ldID09PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZ0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW2ldOwotICAgICAgICAgICAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdID0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1baV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByLmZuYW1lID0gJyc7Ci0gICAgICAgIHIuZnR5cGUgPSBmdHlwZTsKLSAgICAgICAgci5maWQgPSBmaWQ7Ci0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRGaWVsZEVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCk7Ci0KLSAgICAgICAgLy9nZXQgYmFjayB0byB0aGUgcmlnaHQgcGxhY2UgaW4gdGhlIHN0YWNrCi0gICAgICAgIHdoaWxlICh0aGlzLnJzdGFjay5sZW5ndGggPiBwb3MpIHsKLSAgICAgICAgICAgIHRoaXMucnN0YWNrLnBvcCgpOwotICAgICAgICB9Ci0KLSAgICB9LAotCi0gICAgcmVhZE1hcEJlZ2luOiBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7Ci0gICAgICAgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKLQotICAgICAgICB2YXIgciA9IHt9OwotICAgICAgICByLmt0eXBlID0gVGhyaWZ0LlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKLSAgICAgICAgci52dHlwZSA9IFRocmlmdC5Qcm90b2NvbC5SVHlwZVttYXAuc2hpZnQoKV07Ci0gICAgICAgIHIuc2l6ZSA9IG1hcC5zaGlmdCgpOwotCi0KLSAgICAgICAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKLSAgICAgICAgdGhpcy5yc3RhY2sucHVzaChtYXAuc2hpZnQoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRNYXBFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOwotICAgIH0sCi0KLSAgICByZWFkTGlzdEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewotICAgICAgICB2YXIgbGlzdCA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOwotCi0gICAgICAgIHZhciByID0ge307Ci0gICAgICAgIHIuZXR5cGUgPSBUaHJpZnQuUHJvdG9jb2wuUlR5cGVbbGlzdC5zaGlmdCgpXTsKLSAgICAgICAgci5zaXplID0gbGlzdC5zaGlmdCgpOwotCi0gICAgICAgIHRoaXMucnBvcy5wdXNoKHRoaXMucnN0YWNrLmxlbmd0aCk7Ci0gICAgICAgIHRoaXMucnN0YWNrLnB1c2gobGlzdCk7Ci0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfSwKLQotICAgIHJlYWRMaXN0RW5kOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKLSAgICB9LAotCi0gICAgcmVhZFNldEJlZ2luOiBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkTGlzdEJlZ2luKGVsZW1UeXBlLCBzaXplKTsKLSAgICB9LAotCi0gICAgcmVhZFNldEVuZDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRMaXN0RW5kKCk7Ci0gICAgfSwKLQotICAgIHJlYWRCb29sOiBmdW5jdGlvbigpIHsKLSAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRJMzIoKTsKLQotICAgICAgICBpZiAociAhPT0gbnVsbCAmJiByLnZhbHVlID09ICcxJykgewotICAgICAgICAgICAgci52YWx1ZSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByLnZhbHVlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZEJ5dGU6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Ci0gICAgfSwKLQotICAgIHJlYWRJMTY6IGZ1bmN0aW9uKCkgewotICAgICAgICByZXR1cm4gdGhpcy5yZWFkSTMyKCk7Ci0gICAgfSwKLQotICAgIHJlYWRJMzI6IGZ1bmN0aW9uKGYpIHsKLSAgICAgICAgaWYgKGYgPT09IHVuZGVmaW5lZCkgewotICAgICAgICAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFyIHIgPSB7fTsKLQotICAgICAgICBpZiAoZiBpbnN0YW5jZW9mIEFycmF5KSB7Ci0gICAgICAgICAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKLSAgICAgICAgICAgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByLnZhbHVlID0gZi5zaGlmdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBPYmplY3QpIHsKLSAgICAgICAgICAgZm9yICh2YXIgaSBpbiBmKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGZbaV0pOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBmW2ldOwotCi0gICAgICAgICAgICAgICAgci52YWx1ZSA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHIudmFsdWUgPSBmOwotICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcjsKLSAgICB9LAotCi0gICAgcmVhZEk2NDogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKLSAgICB9LAotCi0gICAgcmVhZERvdWJsZTogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKLSAgICB9LAotCi0gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciByID0gdGhpcy5yZWFkSTMyKCk7Ci0gICAgICAgIHJldHVybiByOwotICAgIH0sCi0KLSAgICByZWFkQmluYXJ5OiBmdW5jdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpOwotICAgIH0sCi0KLQotICAgIC8vTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhLgotICAgIHNraXA6IGZ1bmN0aW9uKHR5cGUpIHsKLSAgICAgICAgdGhyb3cgJ3NraXAgbm90IHN1cHBvcnRlZCB5ZXQnOwotICAgIH0KLX07CmRpZmYgLS1naXQgYS9saWIvanNvbi9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTFiOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9CisKK2lmIFdJVEhfSkFWQQorIyBTY2hlbWEgdmFsaWRhdGlvbiB0ZXN0IGRlcGVuZHMgb24gamF2YQorU1VCRElSUyArPSB0ZXN0CitlbmRpZgorCitFWFRSQV9ESVNUID0gXAorICAgIHNjaGVtYS5qc29uIFwKKyAgICB0ZXN0CmRpZmYgLS1naXQgYS9saWIvanNvbi9zY2hlbWEuanNvbiBiL2xpYi9qc29uL3NjaGVtYS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNThhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi9zY2hlbWEuanNvbgpAQCAtMCwwICsxLDM0NCBAQAoreworICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAorCisgICJpZCI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvc2NoZW1hLmpzb24jIiwKKyAgImRlc2NyaXB0aW9uIjogIlNjaGVtYSBmb3IgQXBhY2hlIFRocmlmdCBwcm90b2NvbCBkZXNjcmlwdG9ycyIsCisKKyAgImRlZmluaXRpb25zIjogeworICAgICJ0eXBlLWlkIjogeworICAgICAgInRpdGxlIjogIkFueSB0eXBlIGlkIChuYW1lKSIsCisgICAgICAiZW51bSI6IFsKKyAgICAgICAgInZvaWQiLAorICAgICAgICAic3RyaW5nIiwKKyAgICAgICAgImJvb2wiLAorICAgICAgICAiYnl0ZSIsCisgICAgICAgICJpOCIsCisgICAgICAgICJpMTYiLAorICAgICAgICAiaTMyIiwKKyAgICAgICAgImk2NCIsCisgICAgICAgICJkb3VibGUiLAorICAgICAgICAibGlzdCIsCisgICAgICAgICJzZXQiLAorICAgICAgICAibWFwIiwKKyAgICAgICAgInVuaW9uIiwKKyAgICAgICAgInN0cnVjdCIsCisgICAgICAgICJiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAiYmFzZS10eXBlIjogeworICAgICAgInRpdGxlIjogIkJhc2UgdHlwZSBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyJ2b2lkIiwgInN0cmluZyIsICJib29sIiwgImJ5dGUiLCAiaTgiLCAiaTE2IiwgImkzMiIsICJpNjQiLCAiZG91YmxlIiwgImJpbmFyeSIgXQorICAgICAgICB9CisgICAgICB9LAorICAgICAgInJlcXVpcmVkIjogWyAidHlwZUlkIiBdCisgICAgfSwKKyAgICAibGlzdC10eXBlIjogeworICAgICAgInRpdGxlIjogIkxpc3QgYW5kIHNldCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibGlzdCIsICJzZXQiIF0KKyAgICAgICAgfSwKKyAgICAgICAgImVsZW1UeXBlSWQiOiAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtaWQiIH0sCisgICAgICAgICJlbGVtVHlwZSI6ICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWRlc2MiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiLCAiZWxlbVR5cGVJZCIgXQorICAgIH0sCisgICAgIm1hcC10eXBlIjogeworICAgICAgInRpdGxlIjogIk1hcCBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAidHlwZUlkIjogeworICAgICAgICAgICJlbnVtIjogWyAibWFwIiBdCisgICAgICAgIH0sCisgICAgICAgICJrZXlUeXBlSWQiOiAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAia2V5VHlwZSI6ICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICAidmFsdWVUeXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgInZhbHVlVHlwZSI6ICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJrZXlUeXBlSWQiLCAidmFsdWVUeXBlSWQiIF0KKyAgICB9LAorICAgICJzdHJ1Y3QtdHlwZSI6IHsKKyAgICAgICJ0aXRsZSI6ICJTdHJ1Y3QsIHVuaW9uIGFuZCBleGNlcHRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgInR5cGVJZCI6IHsKKyAgICAgICAgICAiZW51bSI6IFsgInVuaW9uIiwgInN0cnVjdCIsICJleGNlcHRpb24iIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgInR5cGVJZCIsICJjbGFzcyIgXQorICAgIH0sCisgICAgInR5cGUtZGVzYyI6IHsKKyAgICAgICJ0aXRsZSI6ICJUeXBlIGRlc2NyaXB0b3Igc2NoZW1hIiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeworICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgICAgICJ0eXBlSWQiOiAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9LAorICAgICAgICAgICAgICAgICJjbGFzcyI6ICAgICAgIHsgInR5cGUiOiAic3RyaW5nIiB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAib25lT2YiOgorICAgICAgICAgIFsKKyAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9iYXNlLXR5cGUiIH0sCisgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbGlzdC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL21hcC10eXBlIiB9LAorICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdC10eXBlIiB9CisgICAgICAgICAgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAibmFtZS1hbmQtZG9jIjogeworICAgICAgInRpdGxlIjogIk5hbWUgYW5kIGRvY3VtZW50YXRpb24gc3ViLXNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICJkb2MiOiB7ICJ0eXBlIjogInN0cmluZyIgfQorICAgICAgfSwKKyAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiIF0KKyAgICB9LAorICAgICJlbnVtIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCAnZW51bScgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm1lbWJlcnMiIF0sCisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAibWVtYmVycyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgICAidmFsdWUiOiB7ICJ0eXBlIjogImludGVnZXIiIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiLCAidmFsdWUiIF0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInR5cGVkZWYiOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IHR5cGVkZWYgZGVmaW5pdGlvbiBzY2hlbWEiLAorICAgICAgInR5cGUiOiAib2JqZWN0IiwKKyAgICAgICJhbGxPZiI6IFsKKyAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25hbWUtYW5kLWRvYyIgfSwKKyAgICAgICAgeworICAgICAgICAgICJwcm9wZXJ0aWVzIjogeworICAgICAgICAgICAgInR5cGVJZCI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy90eXBlLWlkIiB9LAorICAgICAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJ0eXBlSWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgImNvbnN0YW50IjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBjb25zdGFudCBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1kZXNjIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAidmFsdWUiOiB7CisgICAgICAgICAgICAgICJvbmVPZiI6IFsKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm51bWJlciIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogImFycmF5IiB9LAorICAgICAgICAgICAgICAgIHsgInR5cGUiOiAib2JqZWN0IiB9CisgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgInZhbHVlIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJmaWVsZCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGZpZWxkIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAorICAgICAgICAgICAgICAibWluaW11bSI6IDEsCisgICAgICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAicmVxdWlyZWQiOiB7CisgICAgICAgICAgICAgICJlbnVtIjogWyAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCAicmVxX291dCIgXQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJ0eXBlSWQiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdHlwZS1pZCIgfSwKKyAgICAgICAgICAgICJ0eXBlIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIgfSwKKyAgICAgICAgICAgICJkZWZhdWx0IjogeworICAgICAgICAgICAgICAib25lT2YiOiBbCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJzdHJpbmciIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJudW1iZXIiIH0sCisgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJhcnJheSIgfSwKKyAgICAgICAgICAgICAgICB7ICJ0eXBlIjogIm9iamVjdCIgfQorICAgICAgICAgICAgICBdCisgICAgICAgICAgICB9CisgICAgICAgICAgfSwKKyAgICAgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAicmVxdWlyZWQiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInN0cnVjdCI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc3RydWN0IGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJpc0V4Y2VwdGlvbiI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKKyAgICAgICAgICAgICJpc1VuaW9uIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAorICAgICAgICAgICAgImZpZWxkcyI6IHsKKyAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgICAgICAgICAiaXRlbXMiOiB7CisgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9maWVsZCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAiaXNFeGNlcHRpb24iLCAiaXNVbmlvbiIsICJmaWVsZHMiIF0KKyAgICAgICAgfQorICAgICAgXQorICAgIH0sCisgICAgInVuaW9uIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCB1bmlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cnVjdCIKKyAgICB9LAorICAgICJleGNlcHRpb24iOiB7CisgICAgICAidGl0bGUiOiAiVGhyaWZ0IGV4Y2VwdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICJrZXkiOiB7CisgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCisgICAgICAgICAgIm1pbmltdW0iOiAxLAorICAgICAgICAgICJtYXhpbXVtIjogNjU1MzUKKyAgICAgICAgfSwKKyAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKKyAgICAgICAgInR5cGVJZCI6IHsgImVudW0iOiBbICJleGNlcHRpb24iIF0gfSwKKyAgICAgICAgInR5cGUiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RydWN0LXR5cGUiIH0KKyAgICAgIH0sCisgICAgICAicmVxdWlyZWQiOiBbICJrZXkiLCAibmFtZSIsICJ0eXBlSWQiIF0KKyAgICB9LAorICAgICJmdW5jdGlvbiI6IHsKKyAgICAgICJ0aXRsZSI6ICJUaHJpZnQgc2VydmljZSBmdW5jdGlvbiBkZWZpbml0aW9uIHNjaGVtYSIsCisgICAgICAidHlwZSI6ICJvYmplY3QiLAorICAgICAgImFsbE9mIjogWworICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbmFtZS1hbmQtZG9jIiB9LAorICAgICAgICB7CisgICAgICAgICAgInByb3BlcnRpZXMiOiB7CisgICAgICAgICAgICAib25ld2F5IjogeworICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJyZXR1cm5UeXBlIjogeworICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGUtZGVzYyIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiYXJndW1lbnRzIjogeworICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAgICAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2ZpZWxkIgorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImV4Y2VwdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4Y2VwdGlvbiIgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgInJlcXVpcmVkIjogWyAib25ld2F5IiwgImFyZ3VtZW50cyIsICJleGNlcHRpb25zIiBdCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgICJzZXJ2aWNlIjogeworICAgICAgInRpdGxlIjogIlRocmlmdCBzZXJ2aWNlIGRlZmluaXRpb24gc2NoZW1hIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWxsT2YiOiBbCisgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9uYW1lLWFuZC1kb2MiIH0sCisgICAgICAgIHsKKyAgICAgICAgICAicHJvcGVydGllcyI6IHsKKyAgICAgICAgICAgICJmdW5jdGlvbnMiOiB7CisgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICAgICAgICAgIml0ZW1zIjogeworICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZnVuY3Rpb24iCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJyZXF1aXJlZCI6IFsgImZ1bmN0aW9ucyIgXQorICAgICAgICB9CisgICAgICBdCisgICAgfSwKKyAgICAiYW5ub3RhdGlvbnMiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIG9mIGFubm90YXRpb24gbmFtZXMgdG8gdmFsdWVzIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9CisgIH0sCisKKyAgInR5cGUiOiAib2JqZWN0IiwKKyAgInJlcXVpcmVkIjogWworICAgICJuYW1lIiwKKyAgICAiZW51bXMiLAorICAgICJ0eXBlZGVmcyIsCisgICAgInN0cnVjdHMiLAorICAgICJjb25zdGFudHMiLAorICAgICJzZXJ2aWNlcyIKKyAgXSwKKyAgInByb3BlcnRpZXMiOiB7CisgICAgIm5hbWUiOiB7CisgICAgICAidHlwZSI6ICJzdHJpbmciCisgICAgfSwKKyAgICAiaW5jbHVkZXMiOiB7CisgICAgICAidHlwZSI6ICJhcnJheSIsCisgICAgICAiaXRlbXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0sCisgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlCisgICAgfSwKKyAgICAibmFtZXNwYWNlcyI6IHsKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlbnVtcyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9lbnVtIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGVkZWZzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3R5cGVkZWYiCisgICAgICB9CisgICAgfSwKKyAgICAic3RydWN0cyI6IHsKKyAgICAgICJ0eXBlIjogImFycmF5IiwKKyAgICAgICJpdGVtcyI6IHsKKyAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJ1Y3QiCisgICAgICB9CisgICAgfSwKKyAgICAiY29uc3RhbnRzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbnN0YW50IgorICAgICAgfQorICAgIH0sCisgICAgInNlcnZpY2VzIjogeworICAgICAgInR5cGUiOiAiYXJyYXkiLAorICAgICAgIml0ZW1zIjogeworICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCisgICAgICB9CisgICAgfQorICB9LAorICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4N2E1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qc29uL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwyNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2NoZWNrOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCisjIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCitjbGVhbi1sb2NhbDoKKwlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAorCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2pzb24vdGVzdC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWY2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvanNvbi90ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorIyBKYXIgdmVyc2lvbnMKK212bi5hbnQudGFzay52ZXJzaW9uPTIuMS4zCisKKyMgRGVwZW5kZW5jeSB2ZXJzaW9ucworanNvbi1zY2hlbWEtdmFsaWRhdG9yLnZlcnNpb249Mi4yLjYKKworIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vdGVzdC9idWlsZC54bWwgYi9saWIvanNvbi90ZXN0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTZhMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzb24vdGVzdC9idWlsZC54bWwKQEAgLTAsMCArMSwxNDQgQEAKKzwhLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+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+IEV4VHlwZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmMzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTAsMCArMSwzNSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gICAgIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyAgICAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgICAgLy8vICAgICBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gICAgIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvYnVpbGQuY21kIGIvbGliL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2M0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5zaCBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMThiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworI3NldCAtZQorCit0aHJpZnQgLS12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKyNyZXZpc2lvbj0ke1RSQVZJU19KT0JfSUQ6PTF9ICAKKyNyZXZpc2lvbj0kKHByaW50ZiAiJTA0ZCIgJHJldmlzaW9uKSAKKworI2RvdG5ldCBwYWNrIC4vc3JjL1BST0pFQ1RfTkFNRSAtYyBSZWxlYXNlIC1vIC4vYXJ0aWZhY3RzIC0tdmVyc2lvbi1zdWZmaXg9JHJldmlzaW9uICAKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCkBAIC0wLDAgKzEsMjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuc2ggYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZjYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGVhM2VhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQzIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBXZSBjYWxsIG5wbSB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisKK3N0dWJzOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4ganM6bm9kZSAtbyB0ZXN0LyAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMKKworcHJlY3Jvc3M6IGRlcHMgc3R1YnMKKworIyBUT0RPOiBMaW50IG5vZGVqcyBsaWIgYW5kIGdlbi1jb2RlIGFzIHBhcnQgb2YgYnVpbGQKK2NoZWNrOiBkZXBzCisJY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKE5QTSkgdGVzdCAmJiAkKE5QTSkgcnVuIGxpbnQtdGVzdHMgJiYgY2QgbGliL25vZGVqcworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciB0ZXN0L2dlbi1ub2RlanMKKwkkKFJNKSAtciAkKHRvcF9zcmNkaXIpL25vZGVfbW9kdWxlcworCitFWFRSQV9ESVNUID0gXAorCWV4YW1wbGVzIFwKKwlsaWIgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9SRUFETUUubWQgYi9saWIvbm9kZWpzL1JFQURNRS5tZAppbmRleCAyODMyYzFiLi41MGFjZmJkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL1JFQURNRS5tZAorKysgYi9saWIvbm9kZWpzL1JFQURNRS5tZApAQCAtMSwyNSArMSwyOCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCitUaHJpZnQgTm9kZS5qcyBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CiAKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotTk9URTogeW91IG11c3QgdXNlIHRoZSBmcmFtZWQgdGhyaWZ0IHRyYW5zcG9ydCwgVEZyYW1lZFRyYW5zcG9ydCBpbiBtb3N0Ci1pbXBsZW1lbnRhdGlvbnMsIG9uIHRoZSBzZXJ2ZXIgc2lkZS4gVXNpbmcgYSBwb3B1bGFyIGV4YW1wbGUsIHRoaXMgaXMgZW5hYmxlZAotYnkgZGVmYXVsdCBpbiBDYXNzYW5kcmEgMC43IChidXQgY29uZmlndXJhdGlvbiBtdXN0IGJlIGNoYW5nZWQgaW4gQ2Fzc2FuZHJhCi0wLjYueCBhbmQgZWFybGllcikuCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCisKKyMjIENvbXBhdGliaWxpdHkKKworbm9kZSB2ZXJzaW9uIDYgb3IgbGF0ZXIgaXMgcmVxdWlyZWQKIAogIyMgSW5zdGFsbAogCkBAIC0yNyw3ICszMCw3IEBACiAKICMjIFRocmlmdCBDb21waWxlcgogCi1Zb3UgY2FuIGNvbXBpbGUgbm9kZWpzIHNvdXJjZXMgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nOgorWW91IGNhbiBjb21waWxlIElETCBzb3VyY2VzIGZvciBOb2RlLmpzIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgogCiAgICAgdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgdGhyaWZ0X2ZpbGUKIApAQCAtMzUsMjYgKzM4LDMzIEBACiAKIEhlcmUgaXMgYSBDYXNzYW5kcmEgZXhhbXBsZToKIAotICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKLSAgICAgICAgQ2Fzc2FuZHJhID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0Nhc3NhbmRyYScpCi0gICAgICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9jYXNzYW5kcmFfdHlwZXMnKTsKK2BgYGpzCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCisgICAgQ2Fzc2FuZHJhID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0Nhc3NhbmRyYScpCisgICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL2Nhc3NhbmRyYV90eXBlcycpOwogCi0gICAgdmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTE2MCksCi0gICAgICAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2Fzc2FuZHJhLCBjb25uZWN0aW9uKTsKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkxNjApLAorICAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoQ2Fzc2FuZHJhLCBjb25uZWN0aW9uKTsKIAotICAgIGNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgICBjb25zb2xlLmVycm9yKGVycik7Ci0gICAgfSk7Citjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgeworICBjb25zb2xlLmVycm9yKGVycik7Cit9KTsKIAotICAgIGNsaWVudC5nZXRfc2xpY2UoIktleXNwYWNlIiwgImtleSIsIG5ldyB0dHlwZXMuQ29sdW1uUGFyZW50KHtjb2x1bW5fZmFtaWx5OiAiRXhhbXBsZUNGIn0pLCBuZXcgdHR5cGVzLlNsaWNlUHJlZGljYXRlKHtzbGljZV9yYW5nZTogbmV3IHR0eXBlcy5TbGljZVJhbmdlKHtzdGFydDogJycsIGZpbmlzaDogJyd9KX0pLCB0dHlwZXMuQ29uc2lzdGVuY3lMZXZlbC5PTkUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgewotICAgICAgaWYgKGVycikgewotICAgICAgICAvLyBoYW5kbGUgZXJyCi0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBkYXRhID09IFt0dHlwZXMuQ29sdW1uT3JTdXBlckNvbHVtbiwgLi4uXQotICAgICAgfQotICAgICAgY29ubmVjdGlvbi5lbmQoKTsKLSAgICB9KTsKK2NsaWVudC5nZXRfc2xpY2UoIktleXNwYWNlIiwgImtleSIsIG5ldyB0dHlwZXMuQ29sdW1uUGFyZW50KHtjb2x1bW5fZmFtaWx5OiAiRXhhbXBsZUNGIn0pLCBuZXcgdHR5cGVzLlNsaWNlUHJlZGljYXRlKHtzbGljZV9yYW5nZTogbmV3IHR0eXBlcy5TbGljZVJhbmdlKHtzdGFydDogJycsIGZpbmlzaDogJyd9KX0pLCB0dHlwZXMuQ29uc2lzdGVuY3lMZXZlbC5PTkUsIGZ1bmN0aW9uKGVyciwgZGF0YSkgeworICBpZiAoZXJyKSB7CisgICAgLy8gaGFuZGxlIGVycgorICB9IGVsc2UgeworICAgIC8vIGRhdGEgPT0gW3R0eXBlcy5Db2x1bW5PclN1cGVyQ29sdW1uLCAuLi5dCisgIH0KKyAgY29ubmVjdGlvbi5lbmQoKTsKK30pOworYGBgCiAKLSMjIEN1c3RvbSBjbGllbnQgYW5kIHNlcnZlciBleGFtcGxlCis8YSBuYW1lPSJpbnQ2NCI+PC9hPgorIyMgSW50NjQKIAotQW4gZXhhbXBsZSBiYXNlZCBvbiB0aGUgb25lIHNob3duIG9uIHRoZSBUaHJpZnQgZnJvbnQgcGFnZSBpcyBpbmNsdWRlZCBpbiB0aGUgZXhhbXBsZXMvIGZvbGRlci4KK1NpbmNlIEphdmFTY3JpcHQgcmVwcmVzZW50cyBhbGwgbnVtYmVycyBhcyBkb3VibGVzLCBpbnQ2NCB2YWx1ZXMgY2Fubm90IGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgbmF0dXJhbGx5LiBUbyBzb2x2ZSB0aGlzLCBpbnQ2NCB2YWx1ZXMgaW4gcmVzcG9uc2VzIHdpbGwgYmUgd3JhcHBlZCB3aXRoIFRocmlmdC5JbnQ2NCBvYmplY3RzLiBUaGUgSW50NjQgaW1wbGVtZW50YXRpb24gdXNlZCBpcyBbYnJvb2ZhL25vZGUtaW50NjRdKGh0dHBzOi8vZ2l0aHViLmNvbS9icm9vZmEvbm9kZS1pbnQ2NCkuCisKKyMjIENsaWVudCBhbmQgc2VydmVyIGV4YW1wbGVzCisKK1NldmVyYWwgZXhhbXBsZSBjbGllbnRzIGFuZCBzZXJ2ZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgdGhyaWZ0L2xpYi9ub2RlanMvZXhhbXBsZXMgZm9sZGVyIGFuZCB0aGUgY3Jvc3MgbGFuZ3VhZ2UgdHV0b3JpYWwgdGhyaWZ0L3R1dG9yaWFsL25vZGVqcyBmb2xkZXIuCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvbm9kZWpzL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvTWFrZWZpbGUgYi9saWIvbm9kZWpzL2V4YW1wbGVzL01ha2VmaWxlCmluZGV4IGI0MjgzZGMuLjg3MTU3ZGIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvZXhhbXBsZXMvTWFrZWZpbGUKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9NYWtlZmlsZQpAQCAtMTgsNyArMTgsNyBAQAogCS4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSB1c2VyLnRocmlmdAogCiBzZXJ2ZXI6IGFsbAkKLQlOT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBzZXJ2ZXIuanMKKwlOT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQ6JChOT0RFX1BBVEgpIG5vZGUgc2VydmVyLmpzCiAKIGNsaWVudDogYWxsCQotCU5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIGNsaWVudC5qcworCU5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdDokKE5PREVfUEFUSCkgbm9kZSBjbGllbnQuanMKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvUkVBRE1FLm1kIGIvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQKaW5kZXggYTg3NTgxZi4uNzM1MGMxMCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9SRUFETUUubWQKQEAgLTEsMjkgKzEsNDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIyBSdW5uaW5nIHRoZSB1c2VyIGV4YW1wbGUKKyMgVGhyaWZ0IE5vZGUuanMgRXhhbXBsZXMKIAotI0dlbmVyYXRlIHRoZSBiaW5kaW5nczoKLS4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4ganM6bm9kZSB1c2VyLnRocmlmdAorIyMgTGljZW5zZQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0jVG8gcnVuIHRoZSB1c2VyIGV4YW1wbGUsIGZpcnN0IHN0YXJ0IHVwIHRoZSBzZXJ2ZXIgaW4gb25lIHRlcm1pbmFsOgotTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0IG5vZGUgc2VydmVyLmpzCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCi0jTm93IHJ1biB0aGUgY2xpZW50OgotTk9ERV9QQVRIPS4uL2xpYjouLi9saWIvdGhyaWZ0IG5vZGUgY2xpZW50LmpzCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCiAKKyMjIFJ1bm5pbmcgdGhlIHVzZXIgZXhhbXBsZQogCi0gICAgCitHZW5lcmF0ZSB0aGUgYmluZGluZ3M6CisKKyAgICAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgdXNlci50aHJpZnQKKyAgICAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGpzOm5vZGUgLS1nZW4gcHkgaGVsbG8udGhyaWZ0CisKK1RvIHJ1biB0aGUgdXNlciBleGFtcGxlLCBmaXJzdCBzdGFydCB1cCB0aGUgc2VydmVyIGluIG9uZSB0ZXJtaW5hbDoKKworICAgIE5PREVfUEFUSD0uLi9saWI6Li4vbGliL3RocmlmdCBub2RlIHNlcnZlci5qcworCitOb3cgcnVuIHRoZSBjbGllbnQ6CisKKyAgICBOT0RFX1BBVEg9Li4vbGliOi4uL2xpYi90aHJpZnQgbm9kZSBjbGllbnQuanMKKworRm9yIGFuIGV4YW1wbGUgdXNpbmcgSmF2YVNjcmlwdCBpbiB0aGUgYnJvd3NlciB0byBjb25uZWN0IHRvCithIG5vZGUuanMgc2VydmVyIGxvb2sgYXQgaGVsbG8uaHRtbCwgaGVsbG8uanMgYW5kIGhlbGxvLnRocmlmdAorCitIVFRQIGV4YW1wbGVzIGFyZSBwcm92aWRlZCBhbHNvOiBodHRwQ2xpZW50LmpzIGFuZCBodHRwU2VydmVyLmpzCitZb3UgY2FuIHRlc3QgSFRUUCBjcm9zcyBwbGF0Zm9ybSB3aXRoIHRoZSBodHRwU2VydmVyLnB5IFB5dGhvbiBzZXJ2ZXIKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvY2xpZW50X211bHRpdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnRfbXVsdGl0cmFuc3BvcnQuanMKaW5kZXggNWM5ZTEwOS4uMWUzN2RlMyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnRfbXVsdGl0cmFuc3BvcnQuanMKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9jbGllbnRfbXVsdGl0cmFuc3BvcnQuanMKQEAgLTEsMyArMSwyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAogICAgIHR0cmFuc3BvcnQgPSByZXF1aXJlKCd0aHJpZnQvdHJhbnNwb3J0Jyk7CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbCBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaGVsbG8uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTg1YTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5odG1sCkBAIC0wLDAgKzEsNjUgQEAKKzwhLS0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICA8dGl0bGU+QXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IEJyb3dzZXIgQ2xpZW50IERlbW88L3RpdGxlPgorICAgIDxzY3JpcHQgc3JjPSJ0aHJpZnQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9IZWxsb1N2Yy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RpbWVzVHdvLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+CisgICAgPGgxPkFwYWNoZSBUaHJpZnQgSmF2YVNjcmlwdCBCcm93c2VyIENsaWVudCBEZW1vPC9oMT4KKyAgICA8cD5UaGlzIGh0bWwgZmlsZSBkZW1vbnN0cmF0ZXMgQXBhY2hlIFRocmlmdCBKYXZhU2NycHQgUlBDIGJldHdlZW4gYSBicm93c2VyIGNsaWVudCB0byBhIG5vZGUuanMgc2VydmVyLiBDbGlja2luZyB0aGUgYnV0dG9ucyBiZWxvdyB3aWxsIGNhbGwgdGhlIFJQQyBmdW5jdGlvbnMgaG9zdGVkIGJ5IHRoZSBBcGFjaGUgVGhyaWZ0IHNlcnZlciBhdCBsb2NhbGhvc3Q6ODU4NS4gVGhlIGZpbGUgaGVsbG8uanMgY29udGFpbnMgdGhlIEphdmFTY3JpcHQgbm9kZS5qcyBzZXJ2ZXIgcmVxdWlyZWQuIEhlcmUgYXJlIHRoZSBzdGVwcyB0byBnZXQgdGhlIGV4YW1wbGUgcnVubmluZzo8L3A+CisgICAgPG9sPgorICAgICAgICA8bGk+SW5zdGFsbCBOb2RlLmpzIDxwcmU+PGEgaHJlZj0iaHR0cDovL25vZGVqcy5vcmciPm5vZGVqcy5vcmc8L2E+PC9wcmU+PC9saT4KKyAgICAgICAgPGxpPkluc3RhbGwgQXBhY2hlIFRocmlmdCBmb3Igbm9kZSAobm90ZSB0aGF0IHRoZSBub2RlIHBhY2thZ2UgbWFuYWdlciB3aWxsIGNyZWF0ZSB0aGUgbm9kZV9tb2R1bGVzIGZvbGRlciBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc28gbWFrZSBzdXJlIHRvIHJ1biBucG0gZnJvbSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgaGVsbG8uanMgc28gdGhhdCB0aGUgc2VydmVyIGNhbiBmaW5kIHRoZSBUaHJpZnQgbGlicmFyaWVzLiBUaGlzIGV4YW1wbGUgcmVxdWlyZXMgQXBhY2hlIFRocmlmdCAwLjkuMispIDxwcmU+JCBucG0gaW5zdGFsbCB0aHJpZnQ8L3ByZT48L2xpPgorICAgICAgICA8bGk+Q29tcGlsZSB0aGUgaGVsbG8uaWRsIGZvciBKYXZhU2NyaXB0IGFuZCBOb2RlLmpzICh5b3UnbGwgbmVlZCB0byBoYXZlIHRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIGluc3RhbGxlZCBmb3IgdGhpcyBzdGVwLiBUaGlzIGFsc28gbmVlZHMgdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGhlbGxvLmpzIGJlY2F1c2UgaGVsbG8uanMgYW5kIGhlbGxvLmh0bWwgbG9vayBmb3IgdGhlIGdlbi1ub2RlanMgYW5kIGdlbi1qcyBkaXJlY3RvcmllcyBoZXJlLik8cHJlPiQgdGhyaWZ0IC1nZW4ganMgLWdlbiBqczpub2RlIGhlbGxvLnRocmlmdDwvcHJlPjwvbGk+CisgICAgICAgIDxsaT5SdW4gdGhlIG5vZGUgc2VydmVyIGluIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgaGVsbG8uaHRtbCBmaWxlPHByZT4kIG5vZGUgaGVsbG8uanM8L3ByZT48L2xpPgorICAgICAgICA8bGk+Q29weSB0aGUgQXBhY2hlIFRocmlmdCBKYXZhU2NyaXB0IGxpYnJhcnksIHRocmlmdC5qcywgaW50byB0aGUgZGlyZWN0b3J5IHdpdGggdGhpcyBodG1sIGZpbGUuPHByZT4kIGNwIC4uLi4uL3RocmlmdC5qcyAuICh5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIEJvd2VyIHRvIGluc3RhbGwgdGhlIGJyb3dzZXIgYmFzZWQgQXBhY2hlIFRocmlmdCBsaWJyYXJ5IGluIHRoZSBuZWFyIGZ1dHVyZS4pPC9wcmU+CisgICAgICAgIDxsaT5SZWxvYWQgdGhpcyBwYWdlIGluIGEgYnJvd3NlciB0aHJvdWdoIHRoZSBub2RlIHNlcnZlciB1c2luZyB1c2luZyB0aGUgVVJMOiA8cHJlPmh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9oZWxsby5odG1sPC9wcmU+dGhlbiBjbGljayBhIGJ1dHRvbiBiZWxvdyB0byBtYWtlIGFuIFJQQyBjYWxsPC9saT4KKyAgICA8L29sPgorICAgIDxidXR0b24gaWQ9ImJ0biI+R2V0IE1lc3NhZ2UgZnJvbSBOb2RlIFNlcnZlcjwvYnV0dG9uPgorICAgIDxidXR0b24gaWQ9ImJ0bkRibCI+RG91YmxlIDI1PC9idXR0b24+CisgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBnZXRNZXNzYWdlLCBmYWxzZSk7CisKKyAgICAgICAgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9oZWxsbyIpOworICAgICAgICAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgdmFyIGNsaWVudCA9IG5ldyBIZWxsb1N2Y0NsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICB2YXIgbXNnID0gY2xpZW50LmhlbGxvX2Z1bmMoKTsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKS5pbm5lckhUTUwgPSBtc2c7CisgICAgICAgIH0KKworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuRGJsIikuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBkYmxNZXNzYWdlLCBmYWxzZSk7CisKKyAgICAgICAgZnVuY3Rpb24gZGJsTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRYSFJUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NS9kYmwiKTsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHZhciBjbGllbnQgPSBuZXcgVGltZXNUd29DbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgdmFyIHZhbCA9IGNsaWVudC5kYmwoMjUpOworICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dDIiKS5pbm5lckhUTUwgPSB2YWw7CisgICAgICAgIH0KKyAgICA8L3NjcmlwdD4KKyAgICA8aDI+U2VydmVyIFJlc3BvbnNlOiA8ZGl2IGlkPSJvdXRwdXQiPjwvZGl2PjwvaDI+CisgICAgPGgyPlNlcnZlciBEYmw6IDxkaXYgaWQ9Im91dHB1dDIiPjwvZGl2PjwvaDI+Cis8L2JvZHk+IAorPC9odG1sPgorCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdjNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby5qcwpAQCAtMCwwICsxLDYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgSGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMuanMnKTsKK3ZhciBUaW1lc1R3b1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaW1lc1R3by5qcycpOworCit2YXIgaGVsbG9IYW5kbGVyID0geworCWhlbGxvX2Z1bmM6IGZ1bmN0aW9uKHJlc3VsdCkgeworCQl0aGlzLmNhbGxfY291bnRlciA9IHRoaXMuY2FsbF9jb3VudGVyIHx8IDA7CisJCWNvbnNvbGUubG9nKCJDbGllbnQgY2FsbDogIiArICgrK3RoaXMuY2FsbF9jb3VudGVyKSk7CisJCXJlc3VsdChudWxsLCAiSGVsbG8gQXBhY2hlIFRocmlmdCBmb3IgSmF2YVNjcmlwdCAiICsgdGhpcy5jYWxsX2NvdW50ZXIpOworCX0KK30KKwordmFyIHRpbWVzVHdvSGFuZGxlciA9IHsKKwlkYmw6IGZ1bmN0aW9uKHZhbCwgcmVzdWx0KSB7CisJCWNvbnNvbGUubG9nKCJDbGllbnQgY2FsbDogIiArIHZhbCk7CisJCXJlc3VsdChudWxsLCB2YWwgKiAyKTsKKwl9Cit9CisKK3ZhciBoZWxsb1NlcnZpY2UgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IEhlbGxvU3ZjLAorCWhhbmRsZXI6IGhlbGxvSGFuZGxlcgorfTsKKwordmFyIGRibFNlcnZpY2UgPSB7CisJdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorCXByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKwlwcm9jZXNzb3I6IFRpbWVzVHdvU3ZjLAorCWhhbmRsZXI6IHRpbWVzVHdvSGFuZGxlcgorfTsKKwordmFyIFNlcnZlck9wdGlvbnMgPSB7CisJZmlsZXM6ICIuIiwKKwlzZXJ2aWNlczogeworCQkiL2hlbGxvIjogaGVsbG9TZXJ2aWNlLAorCQkiL2RibCI6IGRibFNlcnZpY2UsCisJfQorfQorCit2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihTZXJ2ZXJPcHRpb25zKTsKK3ZhciBwb3J0ID0gODU4NTsKK3NlcnZlci5saXN0ZW4ocG9ydCk7Citjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2hlbGxvLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFmNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9oZWxsby50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworc2VydmljZSBIZWxsb1N2YyB7CisgICAgc3RyaW5nIGhlbGxvX2Z1bmMoKSwKK30KKworc2VydmljZSBUaW1lc1R3byB7CisgICAgaTY0IGRibCgxOiBpNjQgdmFsKSwKK30KKworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBDbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljYzBjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cENsaWVudC5qcwpAQCAtMCwwICsxLDIzIEBACit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgaGVsbG9TdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvSGVsbG9TdmMuanMnKTsKKwordmFyIG9wdGlvbnMgPSB7CisgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgICBwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgICBwYXRoOiAiL2hlbGxvIiwKKyAgIGhlYWRlcnM6IHsiQ29ubmVjdGlvbiI6ICJjbG9zZSJ9LAorICAgaHR0cHM6IGZhbHNlCit9OworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbigibG9jYWxob3N0IiwgOTA5MCwgb3B0aW9ucyk7Cit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUh0dHBDbGllbnQoaGVsbG9TdmMsIGNvbm5lY3Rpb24pOworCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgeworICAgY29uc29sZS5sb2coIkVycm9yOiAiICsgZXJyKTsKK30pOworCitjbGllbnQuaGVsbG9fZnVuYyhmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7CisgICBjb25zb2xlLmxvZygiTXNnIGZyb20gc2VydmVyOiAiICsgcmVzdWx0KTsKK30pOworCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2FlMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLmpzCkBAIC0wLDAgKzEsMzEgQEAKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsgICAgICAgICAgICAgICAgIAkKK3ZhciBoZWxsb1N2YyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9IZWxsb1N2YycpOworCisvL1NlcnZpY2VIYW5kbGVyOiBJbXBsZW1lbnQgdGhlIGhlbGxvIHNlcnZpY2UgCit2YXIgaGVsbG9IYW5kbGVyID0geworICBoZWxsb19mdW5jOiBmdW5jdGlvbiAocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coIlJlY2VpdmVkIEhlbGxvIGNhbGwiKTsKKyAgICByZXN1bHQobnVsbCwgIkhlbGxvIGZyb20gTm9kZS5qcyIpOworICB9Cit9OworCisvL1NlcnZpY2VPcHRpb25zOiBUaGUgSS9PIHN0YWNrIGZvciB0aGUgc2VydmljZQordmFyIGhlbGxvU3ZjT3B0ID0geyAgICAgICAgICAgICAgICAgICAgICAgCQkKKyAgICBoYW5kbGVyOiBoZWxsb0hhbmRsZXIsICAgICAgICAgICAgICAgICAgICAgIAkKKyAgICBwcm9jZXNzb3I6IGhlbGxvU3ZjLCAgICAgICAgICAgICAgICAgICAgICAgICAJCisgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLCAgICAgICAgICAgICAgICAgCisgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0IAkJCit9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLy9TZXJ2ZXJPcHRpb25zOiBEZWZpbmUgc2VydmVyIGZlYXR1cmVzCit2YXIgc2VydmVyT3B0ID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgCQorICAgc2VydmljZXM6IHsgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAiL2hlbGxvIjogaGVsbG9TdmNPcHQgICAgICAgICAgICAgICAgIAorICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisvL0NyZWF0ZSBhbmQgc3RhcnQgdGhlIHdlYiBzZXJ2ZXIgCit2YXIgcG9ydCA9IDkwOTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCit0aHJpZnQuY3JlYXRlV2ViU2VydmVyKHNlcnZlck9wdCkubGlzdGVuKHBvcnQpOyAgICAgICAgICAgICAgICAgICAgICAgIAkJCitjb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkgYi9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMmZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQpAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgc3lzCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weScpCisKK2Zyb20gaGVsbG8gaW1wb3J0IEhlbGxvU3ZjCitmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEpTT05Qcm90b2NvbAorZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUSHR0cFNlcnZlcgorCitjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6CisgIGRlZiBoZWxsb19mdW5jKHNlbGYpOgorICAgIHByaW50KCJIZWxsbyBDYWxsZWQiKQorICAgIHJldHVybiAiaGVsbG8gZnJvbSBQeXRob24iCisKK3Byb2Nlc3NvciA9IEhlbGxvU3ZjLlByb2Nlc3NvcihIZWxsb1N2Y0hhbmRsZXIoKSkKK3Byb3RvRmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorcG9ydCA9IDkwOTAKK3NlcnZlciA9IFRIdHRwU2VydmVyLlRIdHRwU2VydmVyKHByb2Nlc3NvciwgKCJsb2NhbGhvc3QiLCBwb3J0KSwgcHJvdG9GYWN0b3J5KQorcHJpbnQgIlB5dGhvbiBzZXJ2ZXIgcnVubmluZyBvbiBwb3J0ICIgKyBzdHIocG9ydCkKK3NlcnZlci5zZXJ2ZSgpCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3BhcnNlLmpzIGIvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjhhMWFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9wYXJzZS5qcwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKworICBUaGlzIGlzIGEgc3RhbmRhbG9uZSBkZXNlcmlhbGl6ZS9wYXJzZSBleGFtcGxlIGlmIHlvdSBqdXN0IHdhbnQgdG8gZGVzZXJpYWxpemUKKyAgdGhyaWZ0IGRlY291cGxlZCBmcm9tIGNhc3NhbmRyYSBzZXJ2ZXIKKworICAxLiAgYWNxdWlyZSB0aHJpZnQgdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBmaWxlcyBmcm9tIHdobyBldmVyIGJ1aWx0IGl0IChlZzogRVhBTVBMRS50aHJpZnQpCisKKyAgMi4gIEluc3RhbGwgdGhyaWZ0IG9uIGxvY2FsIG1hY2hpbmUKKworICAzLiAgZ2VuZXJhdGUgdGhyaWZ0IGNsaWVudHMgZm9yIG5vZGVqcyB1c2luZyB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9uIGZpbGVzICgjMSkKKyAgICAgIHRocmlmdCAtLWdlbiBqczpub2RlIHNjaGVtYS9FWEFNUExFLnRocmlmdAorCisgICAgICBUaGlzIGNyZWF0ZXMgY3JlYXRlcyBnZW4tbm9kZS5qcyBkaXJlY3RvcnkgY29udGFpbmluZyBhIG5ldyBmaWxlLCBHRU5FUkFURUQuanMKKworICA0LiAgSW5zaWRlIEdFTkVSQVRFRC5qcyBpcyBhIGNsYXNzIHlvdSB3aWxsIHdhbnQgdG8gaW5zdGFuY2lhdGUuICBGaW5kIHRoaXMgY2xhc3MgbmFtZSBhbmQgcGx1ZyAKKyAgICAgIGl0IGludG8gdGhlIGV4YW1wbGUgY29kZSBiZWxvdyAgKGllLCAiWU9VUl9DTEFTU19OQU1FIikKKyAqLworCitmdW5jdGlvbiBwYXJzZVRocmlmdCh0aHJpZnRFbmNvZGVkRGF0YSwgY2FsbGJhY2spIHsKKyAgdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOworICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHRocmlmdEVuY29kZWREYXRhKTsKKyAgdmFyIHByb3RvY29sICA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgdmFyIGNsaWVudENsYXNzID0gcmVxdWlyZSgnLi4vZ2VuLW5vZGVqcy9HRU5FUkFURUQnKS5ZT1VSX0NMQVNTX05BTUU7CisgIHZhciBjbGllbnQgPSBuZXcgY2xpZW50Q2xhc3MoKTsKKyAgY2xpZW50LnJlYWQocHJvdG9jb2wpOworICBjYWxsYmFjayhudWxsLCBjbGllbnQpOworfQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9leGFtcGxlcy9zZXJ2ZXJfaHR0cC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyZGM4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX2h0dHAuanMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIGNvbm5lY3QgPSByZXF1aXJlKCdjb25uZWN0Jyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisKK3ZhciBVc2VyU3RvcmFnZSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9Vc2VyU3RvcmFnZScpLAorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy91c2VyX3R5cGVzJyk7CisKK3ZhciB1c2VycyA9IHt9OworCit2YXIgc3RvcmUgPSBmdW5jdGlvbih1c2VyLCByZXN1bHQpIHsKKyAgY29uc29sZS5sb2coInN0b3JlZDoiLCB1c2VyLnVpZCk7CisgIHVzZXJzW3VzZXIudWlkXSA9IHVzZXI7CisgIHJlc3VsdChudWxsKTsKK307Cit2YXIgcmV0cmlldmUgPSBmdW5jdGlvbih1aWQsIHJlc3VsdCkgeworICBjb25zb2xlLmxvZygicmV0cmlldmVkOiIsIHVpZCk7CisgIHJlc3VsdChudWxsLCB1c2Vyc1t1aWRdKTsKK307CisKK3ZhciBzZXJ2ZXJfaHR0cCA9IHRocmlmdC5jcmVhdGVIdHRwU2VydmVyKFVzZXJTdG9yYWdlLCB7CisgIHN0b3JlOiBzdG9yZSwKKyAgcmV0cmlldmU6IHJldHJpZXZlCit9KTsKK3NlcnZlcl9odHRwLmxpc3Rlbig5MDkwKTsKKwordmFyIHNlcnZlcl9jb25uZWN0ID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9KSk7CitzZXJ2ZXJfaHR0cC5saXN0ZW4oOTA5MSk7CisKK3ZhciBzZXJ2ZXJfY29ubmVjdF9qc29uID0gY29ubmVjdCh0aHJpZnQuaHR0cE1pZGRsZXdhcmUoVXNlclN0b3JhZ2UsIHsKKyBzdG9yZTogc3RvcmUsCisgcmV0cmlldmU6IHJldHJpZXZlCit9LCB7cHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sfSkpOworc2VydmVyX2Nvbm5lY3RfanNvbi5saXN0ZW4oOTA5Mik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3NlcnZlcl9tdWx0aXRyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCmluZGV4IDdmOWI4ZmIuLmEzNDhlNjggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvc2VydmVyX211bHRpdHJhbnNwb3J0LmpzCkBAIC0xLDMgKzEsMjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKSwKICAgICB0dHJhbnNwb3J0ID0gcmVxdWlyZSgndGhyaWZ0L3RyYW5zcG9ydCcpOwogCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0IGIvbGliL25vZGVqcy9leGFtcGxlcy91c2VyLnRocmlmdAppbmRleCBlZTI2MGU1Li5kMDg3ZmQ0IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL3VzZXIudGhyaWZ0CisrKyBiL2xpYi9ub2RlanMvZXhhbXBsZXMvdXNlci50aHJpZnQKQEAgLTE0LDcgKzE0LDcgQEAKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSAKKwogc3RydWN0IFVzZXJQcm9maWxlIHsKICAgMTogaTMyIHVpZCwKICAgMjogc3RyaW5nIG5hbWUsCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODEzZmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeS5qcwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgUE9XXzggPSBNYXRoLnBvdygyLCA4KTsKK3ZhciBQT1dfMTYgPSBNYXRoLnBvdygyLCAxNik7Cit2YXIgUE9XXzI0ID0gTWF0aC5wb3coMiwgMjQpOwordmFyIFBPV18zMiA9IE1hdGgucG93KDIsIDMyKTsKK3ZhciBQT1dfNDAgPSBNYXRoLnBvdygyLCA0MCk7Cit2YXIgUE9XXzQ4ID0gTWF0aC5wb3coMiwgNDgpOwordmFyIFBPV181MiA9IE1hdGgucG93KDIsIDUyKTsKK3ZhciBQT1dfMTAyMiA9IE1hdGgucG93KDIsIDEwMjIpOworCitleHBvcnRzLnJlYWRCeXRlID0gZnVuY3Rpb24oYil7CisJcmV0dXJuIGIgPiAxMjcgPyBiLTI1NiA6IGI7Cit9OworCitleHBvcnRzLnJlYWRJMTYgPSBmdW5jdGlvbihidWZmLCBvZmYpIHsKKyAgb2ZmID0gb2ZmIHx8IDA7CisgIHZhciB2ID0gYnVmZltvZmYgKyAxXTsKKyAgdiArPSBidWZmW29mZl0gPDwgODsKKyAgaWYgKGJ1ZmZbb2ZmXSAmIDEyOCkgeworICAgIHYgLT0gUE9XXzE2OworICB9CisgIHJldHVybiB2OworfTsKKworZXhwb3J0cy5yZWFkSTMyID0gZnVuY3Rpb24oYnVmZiwgb2ZmKSB7CisgIG9mZiA9IG9mZiB8fCAwOworICB2YXIgdiA9IGJ1ZmZbb2ZmICsgM107CisgIHYgKz0gYnVmZltvZmYgKyAyXSA8PCA4OworICB2ICs9IGJ1ZmZbb2ZmICsgMV0gPDwgMTY7CisgIHYgKz0gYnVmZltvZmZdICogUE9XXzI0OworICBpZiAoYnVmZltvZmZdICYgMHg4MCkgeworICAgIHYgLT0gUE9XXzMyOworICB9CisgIHJldHVybiB2OworfTsKKworZXhwb3J0cy53cml0ZUkxNiA9IGZ1bmN0aW9uKGJ1ZmYsIHYpIHsKKyAgYnVmZlsxXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzBdID0gdiAmIDB4ZmY7CisgIHJldHVybiBidWZmOworfTsKKworZXhwb3J0cy53cml0ZUkzMiA9IGZ1bmN0aW9uKGJ1ZmYsIHYpIHsKKyAgYnVmZlszXSA9IHYgJiAweGZmOworICB2ID4+PSA4OworICBidWZmWzJdID0gdiAmIDB4ZmY7CisgIHYgPj49IDg7CisgIGJ1ZmZbMV0gPSB2ICYgMHhmZjsKKyAgdiA+Pj0gODsKKyAgYnVmZlswXSA9IHYgJiAweGZmOworICByZXR1cm4gYnVmZjsKK307CisKK2V4cG9ydHMucmVhZERvdWJsZSA9IGZ1bmN0aW9uKGJ1ZmYsIG9mZikgeworICBvZmYgPSBvZmYgfHwgMDsKKyAgdmFyIHNpZ25lZCA9IGJ1ZmZbb2ZmXSAmIDB4ODA7CisgIHZhciBlID0gKGJ1ZmZbb2ZmKzFdICYgMHhGMCkgPj4gNDsKKyAgZSArPSAoYnVmZltvZmZdICYgMHg3RikgPDwgNDsKKworICB2YXIgbSA9IGJ1ZmZbb2ZmKzddOworICBtICs9IGJ1ZmZbb2ZmKzZdIDw8IDg7CisgIG0gKz0gYnVmZltvZmYrNV0gPDwgMTY7CisgIG0gKz0gYnVmZltvZmYrNF0gKiBQT1dfMjQ7CisgIG0gKz0gYnVmZltvZmYrM10gKiBQT1dfMzI7CisgIG0gKz0gYnVmZltvZmYrMl0gKiBQT1dfNDA7CisgIG0gKz0gKGJ1ZmZbb2ZmKzFdICYgMHgwRikgKiBQT1dfNDg7CisKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSAwOgorICAgICAgZSA9IC0xMDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ3OgorICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoc2lnbmVkID8gLUluZmluaXR5IDogSW5maW5pdHkpOworICAgIGRlZmF1bHQ6CisgICAgICBtICs9IFBPV181MjsKKyAgICAgIGUgLT0gMTAyMzsKKyAgfQorCisgIGlmIChzaWduZWQpIHsKKyAgICBtICo9IC0xOworICB9CisKKyAgcmV0dXJuIG0gKiBNYXRoLnBvdygyLCBlIC0gNTIpOworfTsKKworLyoKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSB0aGUganNwYWNrIG1vZHVsZToKKyAqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9qc3BhY2svCisgKi8KK2V4cG9ydHMud3JpdGVEb3VibGUgPSBmdW5jdGlvbihidWZmLCB2KSB7CisgIHZhciBtLCBlLCBjOworCisgIGJ1ZmZbMF0gPSAodiA8IDAgPyAweDgwIDogMHgwMCk7CisKKyAgdiA9IE1hdGguYWJzKHYpOworICBpZiAodiAhPT0gdikgeworICAgIC8vIE5hTiwgdXNlIFFOYU4gSUVFRSBmb3JtYXQKKyAgICBtID0gMjI1MTc5OTgxMzY4NTI0ODsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIGlmICh2ID09PSBJbmZpbml0eSkgeworICAgIG0gPSAwOworICAgIGUgPSAyMDQ3OworICB9IGVsc2UgeworICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHYpIC8gTWF0aC5MTjIpOworICAgIGMgPSBNYXRoLnBvdygyLCAtZSk7CisgICAgaWYgKHYgKiBjIDwgMSkgeworICAgICAgZS0tOworICAgICAgYyAqPSAyOworICAgIH0KKworICAgIGlmIChlICsgMTAyMyA+PSAyMDQ3KQorICAgIHsKKyAgICAgIC8vIE92ZXJmbG93CisgICAgICBtID0gMDsKKyAgICAgIGUgPSAyMDQ3OworICAgIH0KKyAgICBlbHNlIGlmIChlICsgMTAyMyA+PSAxKQorICAgIHsKKyAgICAgIC8vIE5vcm1hbGl6ZWQgLSB0ZXJtIG9yZGVyIG1hdHRlcnMsIGFzIE1hdGgucG93KDIsIDUyLWUpIGFuZCB2Kk1hdGgucG93KDIsIDUyKSBjYW4gb3ZlcmZsb3cKKyAgICAgIG0gPSAodipjLTEpICogUE9XXzUyOworICAgICAgZSArPSAxMDIzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLy8gRGVub3JtYWxpemVkIC0gYWxzbyBjYXRjaGVzIHRoZSAnMCcgY2FzZSwgc29tZXdoYXQgYnkgY2hhbmNlCisgICAgICBtID0gKHYgKiBQT1dfMTAyMikgKiBQT1dfNTI7CisgICAgICBlID0gMDsKKyAgICB9CisgIH0KKworICBidWZmWzFdID0gKGUgPDwgNCkgJiAweGYwOworICBidWZmWzBdIHw9IChlID4+IDQpICYgMHg3ZjsKKworICBidWZmWzddID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbNl0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZls1XSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzRdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbM10gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZlsyXSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzFdIHw9IG0gJiAweDBmOworCisgIHJldHVybiBidWZmOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcGFyc2VyLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wYXJzZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzQ0MGIuLjAwMDAwMDAKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wYXJzZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7Ci12YXIgY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZTsKLQotdmFyIHAgPSBleHBvcnRzLkJpbmFyeVBhcnNlciA9IGZ1bmN0aW9uKCBiaWdFbmRpYW4sIGFsbG93RXhjZXB0aW9ucyApewotICB0aGlzLmJpZ0VuZGlhbiA9IGJpZ0VuZGlhbiB8fCB0cnVlOwotICB0aGlzLmFsbG93RXhjZXB0aW9ucyA9IGFsbG93RXhjZXB0aW9uczsKLX07Ci1wLmJpZ0VuZGlhbiA9IHRydWU7Ci0KLXZhciBJQnVmZmVyID0gZXhwb3J0cy5CaW5hcnlQYXJzZXIuSUJ1ZmZlciA9IGZ1bmN0aW9uKCBiaWdFbmRpYW4sIGJ1ZmZlciApewotICB0aGlzLmJpZ0VuZGlhbiA9IGJpZ0VuZGlhbiB8fCAxOwotICB0aGlzLmJ1ZmZlciA9IFtdOwotICB0aGlzLnNldEJ1ZmZlciggYnVmZmVyICk7Ci19OwotCi1JQnVmZmVyLnByb3RvdHlwZS5zZXRCdWZmZXIgPSBmdW5jdGlvbiggZGF0YSApewotICBpZiggZGF0YSApewotICAgIGZvciggdmFyIGwsIGkgPSBsID0gZGF0YS5sZW5ndGgsIGIgPSB0aGlzLmJ1ZmZlciA9IG5ldyBBcnJheSggbCApOyBpOyBiW2wgLSBpXSA9IGRhdGFbLS1pXSApOwotICAgIHRoaXMuYmlnRW5kaWFuICYmIGIucmV2ZXJzZSgpOwotICB9Ci19OwotCi1JQnVmZmVyLnByb3RvdHlwZS5oYXNOZWVkZWRCaXRzID0gZnVuY3Rpb24oIG5lZWRlZEJpdHMgKXsKLSAgcmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aCA+PSAtKCAtbmVlZGVkQml0cyA+PiAzICk7Ci19OwotCi1JQnVmZmVyLnByb3RvdHlwZS5jaGVja0J1ZmZlciA9IGZ1bmN0aW9uKCBuZWVkZWRCaXRzICl7Ci0gIGlmKCAhdGhpcy5oYXNOZWVkZWRCaXRzKCBuZWVkZWRCaXRzICkgKSB7Ci0gICAgY29uc29sZS5sb2coIm1pc3Npbmc6ICIgKyBuZWVkZWRCaXRzICsgIiAiICsgdGhpcy5idWZmZXIubGVuZ3RoKTsKLSAgICB0aHJvdyBuZXcgRXJyb3IoICJjaGVja0J1ZmZlcjo6bWlzc2luZyBieXRlcyIgKTsKLSAgfQotfTsKLQotSUJ1ZmZlci5wcm90b3R5cGUucmVhZEJpdHMgPSBmdW5jdGlvbiggc3RhcnQsIGxlbmd0aCApewotICAvL3NobCBmaXg6IEhlbnJpIFRvcmdlbWFuZSB+MTk5NiAoY29tcHJlc3NlZCBieSBKb25hcyBSYW9uaSkKLSAgZnVuY3Rpb24gc2hsKCBhLCBiICl7Ci0gICAgZm9yKCA7IGItLTsgYSA9ICggKCBhICU9IDB4N2ZmZmZmZmYgKyAxICkgJiAweDQwMDAwMDAwICkgPT0gMHg0MDAwMDAwMCA/IGEgKiAyIDogKCBhIC0gMHg0MDAwMDAwMCApICogMiArIDB4N2ZmZmZmZmYgKyAxICk7Ci0gICAgcmV0dXJuIGE7Ci0gIH0KLSAgaWYoIHN0YXJ0IDwgMCB8fCBsZW5ndGggPD0gMCApCi0gICAgcmV0dXJuIDA7Ci0gIHRoaXMuY2hlY2tCdWZmZXIoIHN0YXJ0ICsgbGVuZ3RoICk7Ci0gIGZvciggdmFyIG9mZnNldExlZnQsIG9mZnNldFJpZ2h0ID0gc3RhcnQgJSA4LCBjdXJCeXRlID0gdGhpcy5idWZmZXIubGVuZ3RoIC0gKCBzdGFydCA+PiAzICkgLSAxLCBsYXN0Qnl0ZSA9IHRoaXMuYnVmZmVyLmxlbmd0aCArICggLSggc3RhcnQgKyBsZW5ndGggKSA+PiAzICksIGRpZmYgPSBjdXJCeXRlIC0gbGFzdEJ5dGUsIHN1bSA9ICggKCB0aGlzLmJ1ZmZlclsgY3VyQnl0ZSBdID4+IG9mZnNldFJpZ2h0ICkgJiAoICggMSA8PCAoIGRpZmYgPyA4IC0gb2Zmc2V0UmlnaHQgOiBsZW5ndGggKSApIC0gMSApICkgKyAoIGRpZmYgJiYgKCBvZmZzZXRMZWZ0ID0gKCBzdGFydCArIGxlbmd0aCApICUgOCApID8gKCB0aGlzLmJ1ZmZlclsgbGFzdEJ5dGUrKyBdICYgKCAoIDEgPDwgb2Zmc2V0TGVmdCApIC0gMSApICkgPDwgKCBkaWZmLS0gPDwgMyApIC0gb2Zmc2V0UmlnaHQgOiAwICk7IGRpZmY7IHN1bSArPSBzaGwoIHRoaXMuYnVmZmVyWyBsYXN0Qnl0ZSsrIF0sICggZGlmZi0tIDw8IDMgKSAtIG9mZnNldFJpZ2h0ICkgKTsKLSAgcmV0dXJuIHN1bTsKLX07Ci0gIAotcC53YXJuID0gZnVuY3Rpb24oIG1zZyApewotICBpZiggdGhpcy5hbGxvd0V4Y2VwdGlvbnMgKQotICAgIHRocm93IG5ldyBFcnJvciggbXNnICk7Ci0gIHJldHVybiAxOwotfTsKLXAuZGVjb2RlRmxvYXQgPSBmdW5jdGlvbiggZGF0YSwgcHJlY2lzaW9uQml0cywgZXhwb25lbnRCaXRzICl7Ci0gIHZhciBiID0gbmV3IHRoaXMuSUJ1ZmZlciggdGhpcy5iaWdFbmRpYW4sIGRhdGEgKTsKLSAgYi5jaGVja0J1ZmZlciggcHJlY2lzaW9uQml0cyArIGV4cG9uZW50Qml0cyArIDEgKTsKLSAgdmFyIGJpYXMgPSBNYXRoLnBvdyggMiwgZXhwb25lbnRCaXRzIC0gMSApIC0gMSwgc2lnbmFsID0gYi5yZWFkQml0cyggcHJlY2lzaW9uQml0cyArIGV4cG9uZW50Qml0cywgMSApLCBleHBvbmVudCA9IGIucmVhZEJpdHMoIHByZWNpc2lvbkJpdHMsIGV4cG9uZW50Qml0cyApLCBzaWduaWZpY2FuZCA9IDAsCi0gIGRpdmlzb3IgPSAyLCBjdXJCeXRlID0gYi5idWZmZXIubGVuZ3RoICsgKCAtcHJlY2lzaW9uQml0cyA+PiAzICkgLSAxOwotICBkb3sKLSAgICBmb3IoIHZhciBieXRlVmFsdWUgPSBiLmJ1ZmZlclsgKytjdXJCeXRlIF0sIHN0YXJ0Qml0ID0gcHJlY2lzaW9uQml0cyAlIDggfHwgOCwgbWFzayA9IDEgPDwgc3RhcnRCaXQ7IG1hc2sgPj49IDE7ICggYnl0ZVZhbHVlICYgbWFzayApICYmICggc2lnbmlmaWNhbmQgKz0gMSAvIGRpdmlzb3IgKSwgZGl2aXNvciAqPSAyICk7Ci0gIH13aGlsZSggcHJlY2lzaW9uQml0cyAtPSBzdGFydEJpdCApOwotICByZXR1cm4gZXhwb25lbnQgPT0gKCBiaWFzIDw8IDEgKSArIDEgPyBzaWduaWZpY2FuZCA/IE5hTiA6IHNpZ25hbCA/IC1JbmZpbml0eSA6ICtJbmZpbml0eSA6ICggMSArIHNpZ25hbCAqIC0yICkgKiAoIGV4cG9uZW50IHx8IHNpZ25pZmljYW5kID8gIWV4cG9uZW50ID8gTWF0aC5wb3coIDIsIC1iaWFzICsgMSApICogc2lnbmlmaWNhbmQgOiBNYXRoLnBvdyggMiwgZXhwb25lbnQgLSBiaWFzICkgKiAoIDEgKyBzaWduaWZpY2FuZCApIDogMCApOwotfTsKLXAuZGVjb2RlSW50ID0gZnVuY3Rpb24oIGRhdGEsIGJpdHMsIHNpZ25lZCwgZm9yY2VCaWdFbmRpYW4gKXsKLSAgLy9jb25zb2xlLmxvZygiZGVjb2RlSW50OiAiLCBkYXRhLCBiaXRzLCBzaWduZWQpOwotICB2YXIgYiA9IG5ldyB0aGlzLklCdWZmZXIoIHRoaXMuYmlnRW5kaWFufHxmb3JjZUJpZ0VuZGlhbiwgZGF0YSApLCB4ID0gYi5yZWFkQml0cyggMCwgYml0cyApLCBtYXggPSBNYXRoLnBvdyggMiwgYml0cyApOwotICByZXR1cm4gc2lnbmVkICYmIHggPj0gbWF4IC8gMiA/IHggLSBtYXggOiB4OwotfTsKLXAuZW5jb2RlRmxvYXQgPSBmdW5jdGlvbiggZGF0YSwgcHJlY2lzaW9uQml0cywgZXhwb25lbnRCaXRzICl7Ci0gIHZhciBiaWFzID0gTWF0aC5wb3coIDIsIGV4cG9uZW50Qml0cyAtIDEgKSAtIDEsIG1pbkV4cCA9IC1iaWFzICsgMSwgbWF4RXhwID0gYmlhcywgbWluVW5ub3JtRXhwID0gbWluRXhwIC0gcHJlY2lzaW9uQml0cywKLSAgc3RhdHVzID0gaXNOYU4oIG4gPSBwYXJzZUZsb2F0KCBkYXRhICkgKSB8fCBuID09IC1JbmZpbml0eSB8fCBuID09ICtJbmZpbml0eSA/IG4gOiAwLAotICBleHAgPSAwLCBsZW4gPSAyICogYmlhcyArIDEgKyBwcmVjaXNpb25CaXRzICsgMywgYmluID0gbmV3IEFycmF5KCBsZW4gKSwKLSAgc2lnbmFsID0gKCBuID0gc3RhdHVzICE9PSAwID8gMCA6IG4gKSA8IDAsIG4gPSBNYXRoLmFicyggbiApLCBpbnRQYXJ0ID0gTWF0aC5mbG9vciggbiApLCBmbG9hdFBhcnQgPSBuIC0gaW50UGFydCwKLSAgaSwgbGFzdEJpdCwgcm91bmRlZCwgaiwgcmVzdWx0OwotICBmb3IoIGkgPSBsZW47IGk7IGJpblstLWldID0gMCApOwotICBmb3IoIGkgPSBiaWFzICsgMjsgaW50UGFydCAmJiBpOyBiaW5bLS1pXSA9IGludFBhcnQgJSAyLCBpbnRQYXJ0ID0gTWF0aC5mbG9vciggaW50UGFydCAvIDIgKSApOwotICBmb3IoIGkgPSBiaWFzICsgMTsgZmxvYXRQYXJ0ID4gMCAmJiBpOyAoIGJpblsrK2ldID0gKCAoIGZsb2F0UGFydCAqPSAyICkgPj0gMSApIC0gMCApICYmIC0tZmxvYXRQYXJ0ICk7Ci0gIGZvciggaSA9IC0xOyArK2kgPCBsZW4gJiYgIWJpbltpXTsgKTsKLSAgaWYoIGJpblsoIGxhc3RCaXQgPSBwcmVjaXNpb25CaXRzIC0gMSArICggaSA9ICggZXhwID0gYmlhcyArIDEgLSBpICkgPj0gbWluRXhwICYmIGV4cCA8PSBtYXhFeHAgPyBpICsgMSA6IGJpYXMgKyAxIC0gKCBleHAgPSBtaW5FeHAgLSAxICkgKSApICsgMV0gKXsKLSAgICBpZiggISggcm91bmRlZCA9IGJpbltsYXN0Qml0XSApICl7Ci0gICAgICBmb3IoIGogPSBsYXN0Qml0ICsgMjsgIXJvdW5kZWQgJiYgaiA8IGxlbjsgcm91bmRlZCA9IGJpbltqKytdICk7Ci0gICAgfQotICAgIGZvciggaiA9IGxhc3RCaXQgKyAxOyByb3VuZGVkICYmIC0taiA+PSAwOyAoIGJpbltqXSA9ICFiaW5bal0gLSAwICkgJiYgKCByb3VuZGVkID0gMCApICk7Ci0gIH0KLSAgZm9yKCBpID0gaSAtIDIgPCAwID8gLTEgOiBpIC0gMzsgKytpIDwgbGVuICYmICFiaW5baV07ICk7Ci0gIGlmKCAoIGV4cCA9IGJpYXMgKyAxIC0gaSApID49IG1pbkV4cCAmJiBleHAgPD0gbWF4RXhwICkKLSAgICArK2k7Ci0gIGVsc2UgaWYoIGV4cCA8IG1pbkV4cCApewotICAgIGV4cCAhPSBiaWFzICsgMSAtIGxlbiAmJiBleHAgPCBtaW5Vbm5vcm1FeHAgJiYgdGhpcy53YXJuKCAiZW5jb2RlRmxvYXQ6OmZsb2F0IHVuZGVyZmxvdyIgKTsKLSAgICBpID0gYmlhcyArIDEgLSAoIGV4cCA9IG1pbkV4cCAtIDEgKTsKLSAgfQotICBpZiggaW50UGFydCB8fCBzdGF0dXMgIT09IDAgKXsKLSAgICB0aGlzLndhcm4oIGludFBhcnQgPyAiZW5jb2RlRmxvYXQ6OmZsb2F0IG92ZXJmbG93IiA6ICJlbmNvZGVGbG9hdDo6IiArIHN0YXR1cyApOwotICAgIGV4cCA9IG1heEV4cCArIDE7Ci0gICAgaSA9IGJpYXMgKyAyOwotICAgIGlmKCBzdGF0dXMgPT0gLUluZmluaXR5ICkKLSAgICAgIHNpZ25hbCA9IDE7Ci0gICAgZWxzZSBpZiggaXNOYU4oIHN0YXR1cyApICkKLSAgICAgIGJpbltpXSA9IDE7Ci0gIH0KLSAgZm9yKCBuID0gTWF0aC5hYnMoIGV4cCArIGJpYXMgKSwgaiA9IGV4cG9uZW50Qml0cyArIDEsIHJlc3VsdCA9ICIiOyAtLWo7IHJlc3VsdCA9ICggbiAlIDIgKSArIHJlc3VsdCwgbiA9IG4gPj49IDEgKTsKLSAgZm9yKCBuID0gMCwgaiA9IDAsIGkgPSAoIHJlc3VsdCA9ICggc2lnbmFsID8gIjEiIDogIjAiICkgKyByZXN1bHQgKyBiaW4uc2xpY2UoIGksIGkgKyBwcmVjaXNpb25CaXRzICkuam9pbiggIiIgKSApLmxlbmd0aCwgciA9IFtdOyBpOyBqID0gKCBqICsgMSApICUgOCApewotICAgIG4gKz0gKCAxIDw8IGogKSAqIHJlc3VsdC5jaGFyQXQoIC0taSApOwotICAgIGlmKCBqID09IDcgKXsKLSAgICAgIHJbci5sZW5ndGhdID0gbjsKLSAgICAgIG4gPSAwOwotICAgIH0KLSAgfQotICBpZiAobikgewotICAgIHJbci5sZW5ndGhdID0gbjsKLSAgfQotICByZXR1cm4gbmV3IEJ1ZmZlciggdGhpcy5iaWdFbmRpYW4gPyByLnJldmVyc2UoKSA6IHIgKTsKLX07Ci1wLmVuY29kZUludCA9IGZ1bmN0aW9uKCBkYXRhLCBiaXRzLCBzaWduZWQsIGZvcmNlQmlnRW5kaWFuICl7Ci0gIHZhciBtYXggPSBNYXRoLnBvdyggMiwgYml0cyApOwotICAoIGRhdGEgPj0gbWF4IHx8IGRhdGEgPCAtKCBtYXggLyAyICkgKSAmJiB0aGlzLndhcm4oICJlbmNvZGVJbnQ6Om92ZXJmbG93IiApICYmICggZGF0YSA9IDAgKTsKLSAgZGF0YSA8IDAgJiYgKCBkYXRhICs9IG1heCApOwotICBmb3IoIHZhciByID0gW107IGRhdGE7IHJbci5sZW5ndGhdID0gZGF0YSAlIDI1NiwgZGF0YSA9IE1hdGguZmxvb3IoIGRhdGEgLyAyNTYgKSApOwotICBmb3IoIGJpdHMgPSAtKCAtYml0cyA+PiAzICkgLSByLmxlbmd0aDsgYml0cy0tOyByW3IubGVuZ3RoXSA9IDAgKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXIoKHRoaXMuYmlnRW5kaWFufHxmb3JjZUJpZ0VuZGlhbikgPyByLnJldmVyc2UoKSA6IHIgKTsKLX07Ci1wLnRvU21hbGwgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsICA4LCB0cnVlICApOyB9OwotcC5mcm9tU21hbGwgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCAgOCwgdHJ1ZSAgKTsgfTsKLXAudG9CeXRlICAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgIDgsIGZhbHNlICk7IH07Ci1wLmZyb21CeXRlICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsICA4LCBmYWxzZSApOyB9OwotcC50b1Nob3J0ICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCAxNiwgdHJ1ZSAgKTsgfTsKLXAuZnJvbVNob3J0ICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgMTYsIHRydWUgICk7IH07Ci1wLnRvV29yZCAgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsIDE2LCBmYWxzZSApOyB9OwotcC5mcm9tV29yZCAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCAxNiwgZmFsc2UgKTsgfTsKLXAudG9JbnQgICAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgMzIsIHRydWUgICk7IH07Ci1wLmZyb21JbnQgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVJbnQoIGRhdGEsIDMyLCB0cnVlICApOyB9OwotcC50b0xvbmcgICAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlSW50KCBkYXRhLCA2NCwgdHJ1ZSAgKTsgfTsKLXAuZnJvbUxvbmcgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgNjQsIHRydWUgICk7IH07Ci1wLnRvRFdvcmQgICAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5kZWNvZGVJbnQoIGRhdGEsIDMyLCBmYWxzZSApOyB9OwotcC5mcm9tRFdvcmQgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZW5jb2RlSW50KCBkYXRhLCAzMiwgZmFsc2UgKTsgfTsKLXAudG9RV29yZCAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUludCggZGF0YSwgNjQsIHRydWUgKTsgfTsKLXAuZnJvbVFXb3JkICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUludCggZGF0YSwgNjQsIHRydWUgKTsgfTsKLXAudG9GbG9hdCAgICA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmRlY29kZUZsb2F0KCBkYXRhLCAyMywgOCAgICk7IH07Ci1wLmZyb21GbG9hdCAgPSBmdW5jdGlvbiggZGF0YSApeyByZXR1cm4gdGhpcy5lbmNvZGVGbG9hdCggZGF0YSwgMjMsIDggICApOyB9OwotcC50b0RvdWJsZSAgID0gZnVuY3Rpb24oIGRhdGEgKXsgcmV0dXJuIHRoaXMuZGVjb2RlRmxvYXQoIGRhdGEsIDUyLCAxMSAgKTsgfTsKLXAuZnJvbURvdWJsZSA9IGZ1bmN0aW9uKCBkYXRhICl7IHJldHVybiB0aGlzLmVuY29kZUZsb2F0KCBkYXRhLCA1MiwgMTEgICk7IH07Ci0KLS8vIEZhY3RvciBvdXQgdGhlIGVuY29kZSBzbyBpdCBjYW4gYmUgc2hhcmVkIGJ5IGFkZF9oZWFkZXIgYW5kIHB1c2hfaW50MzIKLXAuZW5jb2RlX2ludDMyID0gZnVuY3Rpb24obnVtYmVyKSB7Ci0gIHZhciBhLCBiLCBjLCBkLCB1bnNpZ25lZDsKLSAgdW5zaWduZWQgPSAobnVtYmVyIDwgMCkgPyAobnVtYmVyICsgMHgxMDAwMDAwMDApIDogbnVtYmVyOwotICBhID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmZmY7Ci0gIGIgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmOwotICBjID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmYpOwotICB1bnNpZ25lZCAmPSAweGZmOwotICBkID0gTWF0aC5mbG9vcih1bnNpZ25lZCk7Ci0gIHJldHVybiBjaHIoYSkgKyBjaHIoYikgKyBjaHIoYykgKyBjaHIoZCk7Ci19OwotCi1wLmVuY29kZV9pbnQ2NCA9IGZ1bmN0aW9uKG51bWJlcikgewotICB2YXIgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgdW5zaWduZWQ7Ci0gIHVuc2lnbmVkID0gKG51bWJlciA8IDApID8gKG51bWJlciArIDB4MTAwMDAwMDAwMDAwMDAwMDApIDogbnVtYmVyOwotICBhID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZmZmZmZmZmZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmZmZmZmZmZmZmZmOwotICBiID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZmZmZmZmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmZmZmZmZmZmY7Ci0gIGMgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmZmZmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmZmZmZmZmOwotICBkID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZmZmZmYpOwotICB1bnNpZ25lZCAmPSAweGZmZmZmZmZmOwotICBlID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmZmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmZmY7Ci0gIGYgPSBNYXRoLmZsb29yKHVuc2lnbmVkIC8gMHhmZmZmKTsKLSAgdW5zaWduZWQgJj0gMHhmZmZmOwotICBnID0gTWF0aC5mbG9vcih1bnNpZ25lZCAvIDB4ZmYpOwotICB1bnNpZ25lZCAmPSAweGZmOwotICBoID0gTWF0aC5mbG9vcih1bnNpZ25lZCk7Ci0gIHJldHVybiBjaHIoYSkgKyBjaHIoYikgKyBjaHIoYykgKyBjaHIoZCkgKyBjaHIoZSkgKyBjaHIoZikgKyBjaHIoZykgKyBjaHIoaCk7Ci19OwotCi0vKioKLSAgVVRGOCBtZXRob2RzCi0qKi8KLQotLy8gVGFrZSBhIHJhdyBiaW5hcnkgc3RyaW5nIGFuZCByZXR1cm4gYSB1dGY4IHN0cmluZwotcC5kZWNvZGVfdXRmOCA9IGZ1bmN0aW9uKGEpIHsKLSAgdmFyIHN0cmluZyA9ICIiOwotICB2YXIgaSA9IDA7Ci0gIHZhciBjID0gYzEgPSBjMiA9IDA7Ci0KLSAgd2hpbGUgKCBpIDwgYS5sZW5ndGggKSB7Ci0gICAgYyA9IGEuY2hhckNvZGVBdChpKTsKLSAgICBpZiAoYyA8IDEyOCkgewotICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7Ci0gICAgICBpKys7Ci0gICAgfSBlbHNlIGlmKChjID4gMTkxKSAmJiAoYyA8IDIyNCkpIHsKLSAgICAgIGMyID0gYS5jaGFyQ29kZUF0KGkrMSk7Ci0gICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpOwotICAgICAgaSArPSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICBjMiA9IGEuY2hhckNvZGVBdChpKzEpOwotICAgICAgYzMgPSBhLmNoYXJDb2RlQXQoaSsyKTsKLSAgICAgIHN0cmluZyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDE1KSA8PCAxMikgfCAoKGMyICYgNjMpIDw8IDYpIHwgKGMzICYgNjMpKTsKLSAgICAgIGkgKz0gMzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0cmluZzsKLX07Ci0KLS8vIEVuY29kZSBhIGNzdHJpbmcgY29ycmVjdGx5Ci1wLmVuY29kZV9jc3RyaW5nID0gZnVuY3Rpb24ocykgeyAKLSAgcmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSkgKyBwLmZyb21CeXRlKDApOwotfTsKLQotLy8gVGFrZSBhIHV0Zjggc3RyaW5nIGFuZCByZXR1cm4gYSBiaW5hcnkgc3RyaW5nCi1wLmVuY29kZV91dGY4ID0gZnVuY3Rpb24ocykgewotICB2YXIgYT0iIjsKLSAgZm9yICh2YXIgbj0wOyBuPCBzLmxlbmd0aDsgbisrKSB7Ci0gICAgdmFyIGM9cy5jaGFyQ29kZUF0KG4pOwotICAgIGlmIChjPDEyOCkgewotICAgICAgYSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpOwotICAgIH0gZWxzZSBpZiAoKGM+MTI3KSYmKGM8MjA0OCkpIHsKLSAgICAgIGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggKGM+PjYpIHwgMTkyKSA7Ci0gICAgICBhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoIChjJjYzKSB8IDEyOCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGEgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggKGM+PjEyKSB8IDIyNCk7Ci0gICAgICBhICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoICgoYz4+NikgJiA2MykgfCAxMjgpOwotICAgICAgYSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCAoYyY2MykgfCAxMjgpOwotICAgIH0KLSAgfQotICByZXR1cm4gYTsKLX07Ci0KLXAuaHByaW50ID0gZnVuY3Rpb24ocykgewotICBmb3IgKHZhciBpPTA7IGk8cy5sZW5ndGg7IGkrKykgewotICAgIGlmIChzLmNoYXJDb2RlQXQoaSk8MzIpIHsKLSAgICAgIHZhciBudW1iZXIgPSBzLmNoYXJDb2RlQXQoaSkgPD0gMTUgPyAiMCIgKyBzLmNoYXJDb2RlQXQoaSkudG9TdHJpbmcoMTYpIDogcy5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KTsKLSAgICAgIHV0aWwuZGVidWcobnVtYmVyKycgOiAnKTt9Ci0gICAgZWxzZSB7Ci0gICAgICB2YXIgbnVtYmVyID0gcy5jaGFyQ29kZUF0KGkpIDw9IDE1ID8gIjAiICsgcy5jaGFyQ29kZUF0KGkpLnRvU3RyaW5nKDE2KSA6IHMuY2hhckNvZGVBdChpKS50b1N0cmluZygxNik7ICAgICAgCi0gICAgICB1dGlsLmRlYnVnKG51bWJlcisnIDogJysgcy5jaGFyQXQoaSkpO30KLSAgfQotfTsKLQotcC50b19ieXRlX2FycmF5ID0gZnVuY3Rpb24ocykgewotICB2YXIgYXJyYXkgPSBbXTsKLSAgCi0gIGZvciAodmFyIGk9MDsgaTxzLmxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKHMuY2hhckNvZGVBdChpKTwzMikge2FycmF5LnB1c2gocy5jaGFyQ29kZUF0KGkpKTt9Ci0gICAgZWxzZSB7YXJyYXkucHVzaChzLmNoYXJDb2RlQXQoaSkpfSAgICAKLSAgfSAgCi0gIAotICB1dGlsLnB1dHMoYXJyYXkpOwotfQotCi1wLnBwcmludCA9IGZ1bmN0aW9uKHMpIHsKLSAgZm9yICh2YXIgaT0wOyBpPHMubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAocy5jaGFyQ29kZUF0KGkpPDMyKSB7dXRpbC5wdXRzKHMuY2hhckNvZGVBdChpKSsnIDogJyk7fQotICAgIGVsc2Uge3V0aWwucHV0cyhzLmNoYXJDb2RlQXQoaSkrJyA6ICcrIHMuY2hhckF0KGkpKTt9Ci0gIH0KLX07CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTdjOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOworCittb2R1bGUuZXhwb3J0cyA9IFRCaW5hcnlQcm90b2NvbDsKKworLy8gSmF2YVNjcmlwdCBzdXBwb3J0cyBvbmx5IG51bWVyaWMgZG91YmxlcywgdGhlcmVmb3JlIGV2ZW4gaGV4IHZhbHVlcyBhcmUgYWx3YXlzIHNpZ25lZC4KKy8vIFRoZSBsYXJnZXN0IGludGVnZXIgdmFsdWUgd2hpY2ggY2FuIGJlIHJlcHJlc2VudGVkIGluIEphdmFTY3JpcHQgaXMgKy8tMl41My4KKy8vIEJpdHdpc2Ugb3BlcmF0aW9ucyBjb252ZXJ0IG51bWJlcnMgdG8gMzIgYml0IGludGVnZXJzIGJ1dCBwZXJmb3JtIHNpZ24gZXh0ZW5zaW9uCisvLyB1cG9uIGFzc2lnbmluZyB2YWx1ZXMgYmFjayB0byB2YXJpYWJsZXMuCit2YXIgVkVSU0lPTl9NQVNLID0gLTY1NTM2LCAgIC8vIDB4ZmZmZjAwMDAKKyAgICBWRVJTSU9OXzEgPSAtMjE0NzQxODExMiwgLy8gMHg4MDAxMDAwMAorICAgIFRZUEVfTUFTSyA9IDB4MDAwMDAwZmY7CisKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKKyAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKKyAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7CisgICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOworICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisgICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKKyAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOworICAgIH0KKyAgICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKKyAgICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOworICAgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICAgIH0KK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlRW5kID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMuX3NlcWlkICE9PSBudWxsKSB7CisgICAgICAgIHRoaXMuX3NlcWlkID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgICBsb2cud2FybmluZygnTm8gc2VxaWQgdG8gdW5zZXQnKTsKKyAgICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIGlkKSB7CisgIHRoaXMud3JpdGVCeXRlKHR5cGUpOworICB0aGlzLndyaXRlSTE2KGlkKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEJlZ2luID0gZnVuY3Rpb24oa3R5cGUsIHZ0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGt0eXBlKTsKKyAgdGhpcy53cml0ZUJ5dGUodnR5cGUpOworICB0aGlzLndyaXRlSTMyKHNpemUpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7CisgIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKKyAgdGhpcy53cml0ZUkzMihzaXplKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihldHlwZSwgc2l6ZSkgeworICB0aGlzLndyaXRlQnl0ZShldHlwZSk7CisgIHRoaXMud3JpdGVJMzIoc2l6ZSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKGJvb2wpIHsKKyAgaWYgKGJvb2wpIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgxKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgwKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJ5dGUgPSBmdW5jdGlvbihiKSB7CisgIHRoaXMudHJhbnMud3JpdGUobmV3IEJ1ZmZlcihbYl0pKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKKyAgdGhpcy50cmFucy53cml0ZShiaW5hcnkud3JpdGVJMTYobmV3IEJ1ZmZlcigyKSwgaTE2KSk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlSTMyKG5ldyBCdWZmZXIoNCksIGkzMikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUk2NCA9IGZ1bmN0aW9uKGk2NCkgeworICBpZiAoaTY0LmJ1ZmZlcikgeworICAgIHRoaXMudHJhbnMud3JpdGUoaTY0LmJ1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgSW50NjQoaTY0KS5idWZmZXIpOworICB9Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHJhbnMud3JpdGUoYmluYXJ5LndyaXRlRG91YmxlKG5ldyBCdWZmZXIoOCksIGR1YikpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZ09yQmluYXJ5ID0gZnVuY3Rpb24obmFtZSwgZW5jb2RpbmcsIGFyZykgeworICBpZiAodHlwZW9mKGFyZykgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZUkzMihCdWZmZXIuYnl0ZUxlbmd0aChhcmcsIGVuY29kaW5nKSk7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmICgoYXJnIGluc3RhbmNlb2YgQnVmZmVyKSB8fAorICAgICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpKSB7CisgICAgLy8gQnVmZmVycyBpbiBOb2RlLmpzIHVuZGVyIEJyb3dzZXJpZnkgbWF5IGV4dGVuZCBVSW50OEFycmF5IGluc3RlYWQgb2YKKyAgICAvLyBkZWZpbmluZyBhIG5ldyBvYmplY3QuIFdlIGRldGVjdCB0aGVtIGhlcmUgc28gd2UgY2FuIHdyaXRlIHRoZW0KKyAgICAvLyBjb3JyZWN0bHkKKyAgICB0aGlzLndyaXRlSTMyKGFyZy5sZW5ndGgpOworICAgIHRoaXMudHJhbnMud3JpdGUoYXJnKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IobmFtZSArICcgY2FsbGVkIHdpdGhvdXQgYSBzdHJpbmcvQnVmZmVyIGFyZ3VtZW50OiAnICsgYXJnKTsKKyAgfQorfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlU3RyaW5nJywgJ3V0ZjgnLCBhcmcpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHN6ID0gdGhpcy5yZWFkSTMyKCk7CisgIHZhciB0eXBlLCBuYW1lLCBzZXFpZDsKKworICBpZiAoc3ogPCAwKSB7CisgICAgdmFyIHZlcnNpb24gPSBzeiAmIFZFUlNJT05fTUFTSzsKKyAgICBpZiAodmVyc2lvbiAhPSBWRVJTSU9OXzEpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKKyAgICB9CisgICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOworICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKKyAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLkJBRF9WRVJTSU9OLCAiTm8gcHJvdG9jb2wgdmVyc2lvbiBoZWFkZXIiKTsKKyAgICB9CisgICAgbmFtZSA9IHRoaXMudHJhbnMucmVhZChzeik7CisgICAgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOworICB9CisgIHJldHVybiB7Zm5hbWU6IG5hbWUsIG10eXBlOiB0eXBlLCByc2VxaWQ6IHNlcWlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7Zm5hbWU6ICcnfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgdHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgaWYgKHR5cGUgPT0gVHlwZS5TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogMH07CisgIH0KKyAgdmFyIGlkID0gdGhpcy5yZWFkSTE2KCk7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiB0eXBlLCBmaWQ6IGlkfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkRW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgZXR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7CisgIHZhciBzaXplID0gdGhpcy5yZWFkSTMyKCk7CisgIHJldHVybiB7ZXR5cGU6IGV0eXBlLCBzaXplOiBzaXplfTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBldHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKKyAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKKyAgcmV0dXJuIHtldHlwZTogZXR5cGUsIHNpemU6IHNpemV9OworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHZhciBiID0gdGhpcy5yZWFkQnl0ZSgpOworICBpZiAoYiA9PT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy50cmFucy5yZWFkSTE2KCk7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEkzMigpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICByZXR1cm4gbmV3IEludDY0KGJ1ZmYpOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLnJlYWREb3VibGUoKTsKK307CisKK1RCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgbGVuID0gdGhpcy5yZWFkSTMyKCk7CisgIGlmIChsZW4gPT09IDApIHsKKyAgICByZXR1cm4gbmV3IEJ1ZmZlcigwKTsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGJpbmFyeSBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKKyAgaWYgKGxlbiA9PT0gMCkgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIGlmIChsZW4gPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhsZW4pOworfTsKKworVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCitUQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KK307CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2U4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcwpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitleHBvcnRzLlRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK3ZhciB4aHJDb25uZWN0aW9uID0gcmVxdWlyZSgnLi94aHJfY29ubmVjdGlvbicpOworZXhwb3J0cy5YSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5YSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDb25uZWN0aW9uID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDb25uZWN0aW9uOworZXhwb3J0cy5jcmVhdGVYSFJDbGllbnQgPSB4aHJDb25uZWN0aW9uLmNyZWF0ZVhIUkNsaWVudDsKKworZXhwb3J0cy5NdWx0aXBsZXhlciA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKS5NdWx0aXBsZXhlcjsKKworZXhwb3J0cy5UV2ViU29ja2V0VHJhbnNwb3J0ID0gcmVxdWlyZSgnLi93c190cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK2V4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vZnJhbWVkX3RyYW5zcG9ydCcpOworCitleHBvcnRzLlByb3RvY29sID0gZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK21vZHVsZS5leHBvcnRzID0gVEJ1ZmZlcmVkVHJhbnNwb3J0OworCitmdW5jdGlvbiBUQnVmZmVyZWRUcmFuc3BvcnQoYnVmZmVyLCBjYWxsYmFjaykgeworICB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSA9IDEwMjQ7CisgIHRoaXMud3JpdGVCdWZmZXJTaXplID0gNTEyOyAvLyBTb2Z0IExpbWl0CisgIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IDA7IC8vIGZvciBpbnB1dCBidWZmZXIKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5pbkJ1ZiA9IG5ldyBCdWZmZXIodGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpOworICB0aGlzLnJlYWRDdXJzb3IgPSAwOworICB0aGlzLndyaXRlQ3Vyc29yID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfQorCitUQnVmZmVyZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKKyAgdmFyIHJlYWRlciA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoKTsKKworICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgeworICAgIGlmIChyZWFkZXIud3JpdGVDdXJzb3IgKyBkYXRhLmxlbmd0aCA+IHJlYWRlci5pbkJ1Zi5sZW5ndGgpIHsKKyAgICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoKTsKKyAgICAgIHJlYWRlci5pbkJ1Zi5jb3B5KGJ1ZiwgMCwgMCwgcmVhZGVyLndyaXRlQ3Vyc29yKTsKKyAgICAgIHJlYWRlci5pbkJ1ZiA9IGJ1ZjsKKyAgICB9CisgICAgZGF0YS5jb3B5KHJlYWRlci5pbkJ1ZiwgcmVhZGVyLndyaXRlQ3Vyc29yLCAwKTsKKyAgICByZWFkZXIud3JpdGVDdXJzb3IgKz0gZGF0YS5sZW5ndGg7CisKKyAgICBjYWxsYmFjayhyZWFkZXIsIHNlcWlkKTsKKyAgfTsKK307CisKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb21taXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7CisgIHZhciB1bnJlYWRTaXplID0gdGhpcy53cml0ZUN1cnNvciAtIHRoaXMucmVhZEN1cnNvcjsKKyAgdmFyIGJ1ZlNpemUgPSAodW5yZWFkU2l6ZSAqIDIgPiB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSkgPworICAgIHVucmVhZFNpemUgKiAyIDogdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemU7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGJ1ZlNpemUpOworICBpZiAodW5yZWFkU2l6ZSA+IDApIHsKKyAgICB0aGlzLmluQnVmLmNvcHkoYnVmLCAwLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMud3JpdGVDdXJzb3IpOworICB9CisgIHRoaXMucmVhZEN1cnNvciA9IDA7CisgIHRoaXMud3JpdGVDdXJzb3IgPSB1bnJlYWRTaXplOworICB0aGlzLmluQnVmID0gYnVmOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yb2xsYmFja1Bvc2l0aW9uID0gZnVuY3Rpb24oKXsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKK30KKworICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0CitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdHJ1ZTsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkgeworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworfTsKKworICAvLyBTZXQgdGhlIHNlcWlkIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjbGllbnQKKyAgLy8gU28gdGhhdCBjYWxsYmFja3MgY2FuIGJlIGZvdW5kCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnNldEN1cnJTZXFJZCA9IGZ1bmN0aW9uKHNlcWlkKSB7CisgIHRoaXMuX3NlcWlkID0gc2VxaWQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmVuc3VyZUF2YWlsYWJsZSA9IGZ1bmN0aW9uKGxlbikgeworICBpZiAodGhpcy5yZWFkQ3Vyc29yICsgbGVuID4gdGhpcy53cml0ZUN1cnNvcikgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24obGVuKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBidWYgPSBuZXcgQnVmZmVyKGxlbik7CisgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IGxlbjsKKyAgcmV0dXJuIGJ1ZjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMSk7CisgIHJldHVybiBiaW5hcnkucmVhZEJ5dGUodGhpcy5pbkJ1Zlt0aGlzLnJlYWRDdXJzb3IrK10pOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKDIpOworICB2YXIgaTE2ID0gYmluYXJ5LnJlYWRJMTYodGhpcy5pbkJ1ZiwgdGhpcy5yZWFkQ3Vyc29yKTsKKyAgdGhpcy5yZWFkQ3Vyc29yICs9IDI7CisgIHJldHVybiBpMTY7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRJMzIgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoNCk7CisgIHZhciBpMzIgPSBiaW5hcnkucmVhZEkzMih0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gNDsKKyAgcmV0dXJuIGkzMjsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg4KTsKKyAgdmFyIGQgPSBiaW5hcnkucmVhZERvdWJsZSh0aGlzLmluQnVmLCB0aGlzLnJlYWRDdXJzb3IpOworICB0aGlzLnJlYWRDdXJzb3IgKz0gODsKKyAgcmV0dXJuIGQ7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbihsZW4pIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUobGVuKTsKKyAgdmFyIHN0ciA9IHRoaXMuaW5CdWYudG9TdHJpbmcoJ3V0ZjgnLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMucmVhZEN1cnNvciArIGxlbik7CisgIHRoaXMucmVhZEN1cnNvciArPSBsZW47CisgIHJldHVybiBzdHI7Cit9OworCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLmJvcnJvdyA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0ge2J1ZjogdGhpcy5pbkJ1ZiwgcmVhZEluZGV4OiB0aGlzLnJlYWRDdXJzb3IsIHdyaXRlSW5kZXg6IHRoaXMud3JpdGVDdXJzb3J9OworICByZXR1cm4gb2JqOworfTsKKworVEJ1ZmZlcmVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb25zdW1lID0gZnVuY3Rpb24oYnl0ZXNDb25zdW1lZCkgeworICB0aGlzLnJlYWRDdXJzb3IgKz0gYnl0ZXNDb25zdW1lZDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihidWYpIHsKKyAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgeworICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCAndXRmOCcpOworICB9CisgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7CisgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKK307CisKK1RCdWZmZXJlZFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgLy8gSWYgdGhlIHNlcWlkIG9mIHRoZSBjYWxsYmFjayBpcyBhdmFpbGFibGUgcGFzcyBpdCB0byB0aGUgb25GbHVzaAorICAvLyBUaGVuIHJlbW92ZSB0aGUgY3VycmVudCBzZXFpZAorICB2YXIgc2VxaWQgPSB0aGlzLl9zZXFpZDsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworCisgIGlmICh0aGlzLm91dENvdW50IDwgMSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHZhciBtc2cgPSBuZXcgQnVmZmVyKHRoaXMub3V0Q291bnQpLAorICAgICAgcG9zID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7CisgICAgYnVmLmNvcHkobXNnLCBwb3MsIDApOworICAgIHBvcyArPSBidWYubGVuZ3RoOworICB9KTsKKworICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgLy8gUGFzc2luZyBzZXFpZCB0aHJvdWdoIHRoaXMgY2FsbCB0byBnZXQgaXQgdG8gdGhlIGNvbm5lY3Rpb24KKyAgICB0aGlzLm9uRmx1c2gobXNnLCBzZXFpZCk7CisgIH0KKworICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKKyAgdGhpcy5vdXRDb3VudCA9IDA7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTMxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5qcwpAQCAtMCwwICsxLDkxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKK3ZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKKworbW9kdWxlLmV4cG9ydHMgPSBUQ29tcGFjdFByb3RvY29sOworCit2YXIgUE9XXzggPSBNYXRoLnBvdygyLCA4KTsKK3ZhciBQT1dfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPV180MCA9IE1hdGgucG93KDIsIDQwKTsKK3ZhciBQT1dfNDggPSBNYXRoLnBvdygyLCA0OCk7Cit2YXIgUE9XXzUyID0gTWF0aC5wb3coMiwgNTIpOwordmFyIFBPV18xMDIyID0gTWF0aC5wb3coMiwgMTAyMik7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBDb21wYWN0IFByb3RvY29sLgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge29iamVjdH0gW3RyYW5zXSAtIFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCB0byByZWFkL3dyaXRlLgorICogQGNsYXNzZGVzYyBUaGUgQXBhY2hlIFRocmlmdCBQcm90b2NvbCBsYXllciBwZXJmb3JtcyBzZXJpYWxpemF0aW9uCisgKiAgICAgb2YgYmFzZSB0eXBlcywgdGhlIGNvbXBhY3QgcHJvdG9jb2wgc2VyaWFsaXplcyBkYXRhIGluIGJpbmFyeQorICogICAgIGZvcm0gd2l0aCBtaW5pbWFsIHNwYWNlIHVzZWQgZm9yIHNjYWxhciB2YWx1ZXMuCisgKi8KK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50cmFucyA9IHRyYW5zOworICB0aGlzLmxhc3RGaWVsZF8gPSBbXTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworICB0aGlzLnN0cmluZ19saW1pdF8gPSAwOworICB0aGlzLnN0cmluZ19idWZfID0gbnVsbDsKKyAgdGhpcy5zdHJpbmdfYnVmX3NpemVfID0gMDsKKyAgdGhpcy5jb250YWluZXJfbGltaXRfID0gMDsKKyAgdGhpcy5ib29sZWFuRmllbGRfID0geworICAgIG5hbWU6IG51bGwsCisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZQorICB9OworICB0aGlzLmJvb2xWYWx1ZV8gPSB7CisgICAgaGFzQm9vbFZhbHVlOiBmYWxzZSwKKyAgICBib29sVmFsdWU6IGZhbHNlCisgIH07Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIENvbnN0YW50cworLy8KKworLyoqCisgICogQ29tcGFjdCBQcm90b2NvbCBJRCBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFBST1RPQ09MX0lECisgICovCitUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEID0gLTEyNjsgIC8vMTAwMCAwMDEwCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFZFUlNJT05fTgorICAqLworVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX04gPSAxOworCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIHZlcnNpb24gbWFzayBmb3IgY29tYmluaW5nIHByb3RvY29sIHZlcnNpb24gYW5kIG1lc3NhZ2UgdHlwZSBpbiBvbmUgYnl0ZS4KKyAgKiBAcmVhZG9ubHkKKyAgKiBAY29uc3Qge251bWJlcn0gVkVSU0lPTl9NQVNLCisgICovCitUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyA9IDB4MWY7IC8vMDAwMSAxMTExCisKKy8qKgorICAqIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZSB0eXBlIG1hc2sgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfTUFTSworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX01BU0sgPSAtMzI7ICAgICAvLzExMTAgMDAwMAorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBiaXRzIGZvciBlbnN1cmluZyBtZXNzYWdlIHR5cGUgYml0IHNpemUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfQklUUworICAqLworVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMgPSA3OyAvLzAwMDAgMDExMQorCisvKioKKyAgKiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2UgdHlwZSBzaGlmdCBhbW91bnQgZm9yIGNvbWJpbmluZyBwcm90b2NvbCB2ZXJzaW9uIGFuZCBtZXNzYWdlIHR5cGUgaW4gb25lIGJ5dGUuCisgICogQHJlYWRvbmx5CisgICogQGNvbnN0IHtudW1iZXJ9IFRZUEVfU0hJRlRfQU1PVU5UCisgICovCitUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UID0gNTsKKworLyoqCisgKiBDb21wYWN0IFByb3RvY29sIHR5cGUgSURzIHVzZWQgdG8ga2VlcCB0eXBlIGRhdGEgd2l0aGluIG9uZSBuaWJibGUuCisgKiBAcmVhZG9ubHkKKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU1RPUCAgICAgICAgICAtIEVuZCBvZiBhIHNldCBvZiBmaWVsZHMuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fVFJVRSAgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggdHJ1ZSB2YWx1ZSAocGFja2VkIGZpZWxkIGFuZCB2YWx1ZSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0JPT0xFQU5fRkFMU0UgLSBGbGFnIGZvciBCb29sZWFuIGZpZWxkIHdpdGggZmFsc2UgdmFsdWUgKHBhY2tlZCBmaWVsZCBhbmQgdmFsdWUpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CWVRFICAgICAgICAgIC0gU2lnbmVkIDggYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kxNiAgICAgICAgICAgLSBTaWduZWQgMTYgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0kzMiAgICAgICAgICAgLSBTaWduZWQgMzIgYml0IGludGVnZXIuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0k2NCAgICAgICAgICAgLSBTaWduZWQgNjQgYml0IGludGVnZXIgKDJeNTMgbWF4IGluIEphdmFTY3JpcHQpLgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9ET1VCTEUgICAgICAgIC0gNjQgYml0IElFRUUgODU0IGZsb2F0aW5nIHBvaW50LgorICogQHByb3BlcnR5IHtudW1iZXJ9ICBDVF9CSU5BUlkgICAgICAgIC0gQXJyYXkgb2YgYnl0ZXMgKHVzZWQgZm9yIHN0cmluZ3MgYWxzbykuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX0xJU1QgICAgICAgICAgLSBBIGNvbGxlY3Rpb24gdHlwZSAodW5vcmRlcmVkKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfU0VUICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlICh1bm9yZGVyZWQgYW5kIHdpdGhvdXQgcmVwZWF0ZWQgdmFsdWVzKS4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgQ1RfTUFQICAgICAgICAgICAtIEEgY29sbGVjdGlvbiB0eXBlIChtYXAvYXNzb2NpYXRpdmUtYXJyYXkvZGljdGlvbmFyeSkuCisgKiBAcHJvcGVydHkge251bWJlcn0gIENUX1NUUlVDVCAgICAgICAgLSBBIG11bHRpZmllbGQgdHlwZS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5UeXBlcyA9IHsKKyAgQ1RfU1RPUDogICAgICAgICAgIDB4MDAsCisgIENUX0JPT0xFQU5fVFJVRTogICAweDAxLAorICBDVF9CT09MRUFOX0ZBTFNFOiAgMHgwMiwKKyAgQ1RfQllURTogICAgICAgICAgIDB4MDMsCisgIENUX0kxNjogICAgICAgICAgICAweDA0LAorICBDVF9JMzI6ICAgICAgICAgICAgMHgwNSwKKyAgQ1RfSTY0OiAgICAgICAgICAgIDB4MDYsCisgIENUX0RPVUJMRTogICAgICAgICAweDA3LAorICBDVF9CSU5BUlk6ICAgICAgICAgMHgwOCwKKyAgQ1RfTElTVDogICAgICAgICAgIDB4MDksCisgIENUX1NFVDogICAgICAgICAgICAweDBBLAorICBDVF9NQVA6ICAgICAgICAgICAgMHgwQiwKKyAgQ1RfU1RSVUNUOiAgICAgICAgIDB4MEMKK307CisKKy8qKgorICogQXJyYXkgbWFwcGluZyBDb21wYWN0IHR5cGUgSURzIHRvIHN0YW5kYXJkIFRocmlmdCB0eXBlIElEcy4KKyAqIEByZWFkb25seQorICovCitUQ29tcGFjdFByb3RvY29sLlRUeXBlVG9DVHlwZSA9IFsKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QLCAgICAgICAgIC8vIFRfU1RPUAorICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW51c2VkCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFLCAvLyBUX0JPT0wKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFLCAgICAgICAgIC8vIFRfQllURQorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0RPVUJMRSwgICAgICAgLy8gVF9ET1VCTEUKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kxNiwgICAgICAgICAgLy8gVF9JMTYKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0kzMiwgICAgICAgICAgLy8gVF9JMzIKKyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVudXNlZAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NCwgICAgICAgICAgLy8gVF9JNjQKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlksICAgICAgIC8vIFRfU1RSSU5HCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNULCAgICAgICAvLyBUX1NUUlVDVAorICBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUCwgICAgICAgICAgLy8gVF9NQVAKKyAgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQsICAgICAgICAgIC8vIFRfU0VUCisgIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfTElTVCwgICAgICAgICAvLyBUX0xJU1QKK107CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgVXRpbGl0aWVzCisvLworCisvKioKKyAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGxheWVyLgorICogQHJldHVybiB7b2JqZWN0fSBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgbGF5ZXIuCisgKi9UQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUcmFuc3BvcnQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnM7Cit9OworCisvKioKKyAqIExvb2t1cCBhIENvbXBhY3QgUHJvdG9jb2wgVHlwZSB2YWx1ZSBmb3IgYSBnaXZlbiBUaHJpZnQgVHlwZSB2YWx1ZS4KKyAqIE4uQi4gVXNlZCBvbmx5IGludGVybmFsbHkuCisgKiBAcGFyYW0ge251bWJlcn0gdHR5cGUgLSBUaHJpZnQgdHlwZSB2YWx1ZQorICogQHJldHVybnMge251bWJlcn0gQ29tcGFjdCBwcm90b2NvbCB0eXBlIHZhbHVlCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmdldENvbXBhY3RUeXBlID0gZnVuY3Rpb24odHR5cGUpIHsKKyAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVFR5cGVUb0NUeXBlW3R0eXBlXTsKK307CisKKy8qKgorICogTG9va3VwIGEgVGhyaWZ0IFR5cGUgdmFsdWUgZm9yIGEgZ2l2ZW4gQ29tcGFjdCBQcm90b2NvbCBUeXBlIHZhbHVlLgorICogTi5CLiBVc2VkIG9ubHkgaW50ZXJuYWxseS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gQ29tcGFjdCBQcm90b2NvbCB0eXBlIHZhbHVlCisgKiBAcmV0dXJucyB7bnVtYmVyfSBUaHJpZnQgVHlwZSB2YWx1ZQorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5nZXRUVHlwZSA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm4gVHlwZS5TVE9QOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX0ZBTFNFOgorICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUU6CisgICAgICByZXR1cm4gVHlwZS5CT09MOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CWVRFOgorICAgICAgcmV0dXJuIFR5cGUuQllURTsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfSTE2OgorICAgICAgcmV0dXJuIFR5cGUuSTE2OworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9JMzI6CisgICAgICByZXR1cm4gVHlwZS5JMzI7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0k2NDoKKyAgICAgIHJldHVybiBUeXBlLkk2NDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfRE9VQkxFOgorICAgICAgcmV0dXJuIFR5cGUuRE9VQkxFOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CSU5BUlk6CisgICAgICByZXR1cm4gVHlwZS5TVFJJTkc7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0xJU1Q6CisgICAgICByZXR1cm4gVHlwZS5MSVNUOworICAgIGNhc2UgVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TRVQ6CisgICAgICByZXR1cm4gVHlwZS5TRVQ7CisgICAgY2FzZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX01BUDoKKyAgICAgIHJldHVybiBUeXBlLk1BUDsKKyAgICBjYXNlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RSVUNUOgorICAgICAgcmV0dXJuIFR5cGUuU1RSVUNUOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJVbmtub3duIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorICByZXR1cm4gVHlwZS5TVE9QOworfTsKKworCisvLworLy8gQ29tcGFjdCBQcm90b2NvbCB3cml0ZSBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFNlbmQgYW55IGJ1ZmZlcmVkIGJ5dGVzIHRvIHRoZSBlbmQgcG9pbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zLmZsdXNoKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhbiBSUEMgbWVzc2FnZSBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGZvciB0aGUgbWVzc2FnZS4KKyAqIEBwYXJhbSB7bnVtYmVyfSB0eXBlIC0gVGhlIHR5cGUgb2YgbWVzc2FnZSAoQ0FMTCwgUkVQTFksIEVYQ0VQVElPTiwgT05FV0FZKS4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzZXFpZCAtIFRoZSBjYWxsIHNlcXVlbmNlIG51bWJlciAoaWYgYW55KS4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBzZXFpZCkgeworICB0aGlzLndyaXRlQnl0ZShUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEKTsKKyAgdGhpcy53cml0ZUJ5dGUoKFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0spIHwKKyAgICAgICAgICAgICAgICAgICAgICgodHlwZSA8PCBUQ29tcGFjdFByb3RvY29sLlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2wuVFlQRV9NQVNLKSk7CisgIHRoaXMud3JpdGVWYXJpbnQzMihzZXFpZCk7CisgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7CisKKyAgLy8gUmVjb3JkIGNsaWVudCBzZXFpZCB0byBmaW5kIGNhbGxiYWNrIGFnYWluCisgIGlmICh0aGlzLl9zZXFpZCkgeworICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOworICB9IGVsc2UgeworICAgIHRoaXMuX3NlcWlkID0gc2VxaWQ7CisgICAgdGhpcy50cmFucy5zZXRDdXJyU2VxSWQoc2VxaWQpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMubGFzdEZpZWxkXy5wdXNoKHRoaXMubGFzdEZpZWxkSWRfKTsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSAwOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJ1Y3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5sYXN0RmllbGRJZF8gPSB0aGlzLmxhc3RGaWVsZF8ucG9wKCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIHN0cnVjdCBmaWVsZCBoZWFkZXIKKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIGZpZWxkIG5hbWUgKG5vdCB3cml0dGVuIHdpdGggdGhlIGNvbXBhY3QgcHJvdG9jb2wpLgorICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgLSBUaGUgZmllbGQgZGF0YSB0eXBlIChhIG5vcm1hbCBUaHJpZnQgZmllbGQgVHlwZSkuCisgKiBAcGFyYW0ge251bWJlcn0gaWQgLSBUaGUgSURMIGZpZWxkIElkLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCB0eXBlLCBpZCkgeworICBpZiAodHlwZSAhPSBUeXBlLkJPT0wpIHsKKyAgICByZXR1cm4gdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lLCB0eXBlLCBpZCwgLTEpOworICB9CisKKyAgdGhpcy5ib29sZWFuRmllbGRfLm5hbWUgPSBuYW1lOworICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRUeXBlID0gdHlwZTsKKyAgdGhpcy5ib29sZWFuRmllbGRfLmZpZWxkSWQgPSBpZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRTdG9wID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVCeXRlKFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfU1RPUCk7Cit9OworCisvKioKKyAqIFdyaXRlcyBhIG1hcCBjb2xsZWN0aW9uIGhlYWRlcgorICogQHBhcmFtIHtudW1iZXJ9IGtleVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCBrZXlzLgorICogQHBhcmFtIHtudW1iZXJ9IHZhbFR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIG1hcCB2YWx1ZXMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2Ygay92IHBhaXJzIGluIHRoZSBtYXAuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgdGhpcy53cml0ZUJ5dGUoMCk7CisgIH0gZWxzZSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKHNpemUpOworICAgIHRoaXMud3JpdGVCeXRlKHRoaXMuZ2V0Q29tcGFjdFR5cGUoa2V5VHlwZSkgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUodmFsVHlwZSkpOworICB9Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworLyoqCisgKiBXcml0ZXMgYSBsaXN0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIGxpc3QgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogV3JpdGVzIGEgc2V0IGNvbGxlY3Rpb24gaGVhZGVyCisgKiBAcGFyYW0ge251bWJlcn0gZWxlbVR5cGUgLSBUaGUgVGhyaWZ0IHR5cGUgb2YgdGhlIHNldCBlbGVtZW50cy4KKyAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2V0LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy53cml0ZUNvbGxlY3Rpb25CZWdpbihlbGVtVHlwZSwgc2l6ZSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24odmFsdWUpIHsKKyAgaWYgKHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lICE9PSBudWxsKSB7CisgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgdGhpcy53cml0ZUZpZWxkQmVnaW5JbnRlcm5hbCh0aGlzLmJvb2xlYW5GaWVsZF8ubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5maWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJvb2xlYW5GaWVsZF8uZmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkpOworICAgIHRoaXMuYm9vbGVhbkZpZWxkXy5uYW1lID0gbnVsbDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IHdyaXRlIHRoZSB2YWx1ZQorICAgIHRoaXMud3JpdGVCeXRlKCh2YWx1ZSA/IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fRkFMU0UpKTsKKyAgfQorfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYikgeworICB0aGlzLnRyYW5zLndyaXRlKG5ldyBCdWZmZXIoW2JdKSk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUkxNiA9IGZ1bmN0aW9uKGkxNikgeworICB0aGlzLndyaXRlVmFyaW50MzIodGhpcy5pMzJUb1ppZ3phZyhpMTYpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7CisgIHRoaXMud3JpdGVWYXJpbnQzMih0aGlzLmkzMlRvWmlnemFnKGkzMikpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgdGhpcy53cml0ZVZhcmludDY0KHRoaXMuaTY0VG9aaWd6YWcoaTY0KSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKHYpIHsKKyAgdmFyIGJ1ZmYgPSBuZXcgQnVmZmVyKDgpOworICB2YXIgbSwgZSwgYzsKKworICBidWZmWzddID0gKHYgPCAwID8gMHg4MCA6IDB4MDApOworCisgIHYgPSBNYXRoLmFicyh2KTsKKyAgaWYgKHYgIT09IHYpIHsKKyAgICAvLyBOYU4sIHVzZSBRTmFOIElFRUUgZm9ybWF0CisgICAgbSA9IDIyNTE3OTk4MTM2ODUyNDg7CisgICAgZSA9IDIwNDc7CisgIH0gZWxzZSBpZiAodiA9PT0gSW5maW5pdHkpIHsKKyAgICBtID0gMDsKKyAgICBlID0gMjA0NzsKKyAgfSBlbHNlIHsKKyAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2KSAvIE1hdGguTE4yKTsKKyAgICBjID0gTWF0aC5wb3coMiwgLWUpOworICAgIGlmICh2ICogYyA8IDEpIHsKKyAgICAgIGUtLTsKKyAgICAgIGMgKj0gMjsKKyAgICB9CisKKyAgICBpZiAoZSArIDEwMjMgPj0gMjA0NykKKyAgICB7CisgICAgICAvLyBPdmVyZmxvdworICAgICAgbSA9IDA7CisgICAgICBlID0gMjA0NzsKKyAgICB9CisgICAgZWxzZSBpZiAoZSArIDEwMjMgPj0gMSkKKyAgICB7CisgICAgICAvLyBOb3JtYWxpemVkIC0gdGVybSBvcmRlciBtYXR0ZXJzLCBhcyBNYXRoLnBvdygyLCA1Mi1lKSBhbmQgdipNYXRoLnBvdygyLCA1MikgY2FuIG92ZXJmbG93CisgICAgICBtID0gKHYqYy0xKSAqIFBPV181MjsKKyAgICAgIGUgKz0gMTAyMzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8vIERlbm9ybWFsaXplZCAtIGFsc28gY2F0Y2hlcyB0aGUgJzAnIGNhc2UsIHNvbWV3aGF0IGJ5IGNoYW5jZQorICAgICAgbSA9ICh2ICogUE9XXzEwMjIpICogUE9XXzUyOworICAgICAgZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVmZls2XSA9IChlIDw8IDQpICYgMHhmMDsKKyAgYnVmZls3XSB8PSAoZSA+PiA0KSAmIDB4N2Y7CisKKyAgYnVmZlswXSA9IG0gJiAweGZmOworICBtID0gTWF0aC5mbG9vcihtIC8gUE9XXzgpOworICBidWZmWzFdID0gbSAmIDB4ZmY7CisgIG0gPSBNYXRoLmZsb29yKG0gLyBQT1dfOCk7CisgIGJ1ZmZbMl0gPSBtICYgMHhmZjsKKyAgbSA9IE1hdGguZmxvb3IobSAvIFBPV184KTsKKyAgYnVmZlszXSA9IG0gJiAweGZmOworICBtID4+PSA4OworICBidWZmWzRdID0gbSAmIDB4ZmY7CisgIG0gPj49IDg7CisgIGJ1ZmZbNV0gPSBtICYgMHhmZjsKKyAgbSA+Pj0gODsKKyAgYnVmZls2XSB8PSBtICYgMHgwZjsKKworICB0aGlzLnRyYW5zLndyaXRlKGJ1ZmYpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUud3JpdGVTdHJpbmdPckJpbmFyeSA9IGZ1bmN0aW9uKG5hbWUsIGVuY29kaW5nLCBhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdGhpcy53cml0ZVZhcmludDMyKEJ1ZmZlci5ieXRlTGVuZ3RoKGFyZywgZW5jb2RpbmcpKSA7CisgICAgdGhpcy50cmFucy53cml0ZShuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmcpKTsKKyAgfSBlbHNlIGlmIChhcmcgaW5zdGFuY2VvZiBCdWZmZXIgfHwKKyAgICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoYXJnKSA9PSAnW29iamVjdCBVaW50OEFycmF5XScpIHsKKyAgICAvLyBCdWZmZXJzIGluIE5vZGUuanMgdW5kZXIgQnJvd3NlcmlmeSBtYXkgZXh0ZW5kIFVJbnQ4QXJyYXkgaW5zdGVhZCBvZgorICAgIC8vIGRlZmluaW5nIGEgbmV3IG9iamVjdC4gV2UgZGV0ZWN0IHRoZW0gaGVyZSBzbyB3ZSBjYW4gd3JpdGUgdGhlbQorICAgIC8vIGNvcnJlY3RseQorICAgIHRoaXMud3JpdGVWYXJpbnQzMihhcmcubGVuZ3RoKTsKKyAgICB0aGlzLnRyYW5zLndyaXRlKGFyZyk7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyAnIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgIH0KK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RyaW5nID0gZnVuY3Rpb24oYXJnKSB7CisgIHRoaXMud3JpdGVTdHJpbmdPckJpbmFyeSgnd3JpdGVTdHJpbmcnLCAndXRmOCcsIGFyZyk7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZUJpbmFyeSA9IGZ1bmN0aW9uKGFyZykgeworICB0aGlzLndyaXRlU3RyaW5nT3JCaW5hcnkoJ3dyaXRlQmluYXJ5JywgJ2JpbmFyeScsIGFyZyk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIGludGVybmFsIHdyaXRlIG1ldGhvZHMKKy8vCisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRCZWdpbkludGVybmFsID0gZnVuY3Rpb24obmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGUpIHsKKyAgLy9JZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCisgIHZhciB0eXBlVG9Xcml0ZSA9ICh0eXBlT3ZlcnJpZGUgPT0gLTEgPyB0aGlzLmdldENvbXBhY3RUeXBlKGZpZWxkVHlwZSkgOiB0eXBlT3ZlcnJpZGUpOworICAvL0NoZWNrIGlmIHdlIGNhbiBkZWx0YSBlbmNvZGUgdGhlIGZpZWxkIGlkCisgIGlmIChmaWVsZElkID4gdGhpcy5sYXN0RmllbGRJZF8gJiYgZmllbGRJZCAtIHRoaXMubGFzdEZpZWxkSWRfIDw9IDE1KSB7CisgICAgLy9JbmNsdWRlIHRoZSB0eXBlIGRlbHRhIHdpdGggdGhlIGZpZWxkIElECisgICAgdGhpcy53cml0ZUJ5dGUoKGZpZWxkSWQgLSB0aGlzLmxhc3RGaWVsZElkXykgPDwgNCB8IHR5cGVUb1dyaXRlKTsKKyAgfSBlbHNlIHsKKyAgICAvL1dyaXRlIHNlcGFyYXRlIHR5cGUgYW5kIElEIHZhbHVlcworICAgIHRoaXMud3JpdGVCeXRlKHR5cGVUb1dyaXRlKTsKKyAgICB0aGlzLndyaXRlSTE2KGZpZWxkSWQpOworICB9CisgIHRoaXMubGFzdEZpZWxkSWRfID0gZmllbGRJZDsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlQ29sbGVjdGlvbkJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgaWYgKHNpemUgPD0gMTQpIHsKKyAgICAvL0NvbWJpbmUgc2l6ZSBhbmQgdHlwZSBpbiBvbmUgYnl0ZSBpZiBwb3NzaWJsZQorICAgIHRoaXMud3JpdGVCeXRlKHNpemUgPDwgNCB8IHRoaXMuZ2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLndyaXRlQnl0ZSgweGYwIHwgdGhpcy5nZXRDb21wYWN0VHlwZShlbGVtVHlwZSkpOworICAgIHRoaXMud3JpdGVWYXJpbnQzMihzaXplKTsKKyAgfQorfTsKKworLyoqCisgKiBXcml0ZSBhbiBpMzIgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS01IGJ5dGVzIG9uIHRoZSB3aXJlLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS53cml0ZVZhcmludDMyID0gZnVuY3Rpb24obikgeworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcig1KTsKKyAgdmFyIHdzaXplID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAoKG4gJiB+MHg3RikgPT09IDApIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IG47CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgeworICAgICAgYnVmW3dzaXplKytdID0gKChuICYgMHg3RikgfCAweDgwKTsKKyAgICAgIG4gPSBuID4+PiA3OworICAgIH0KKyAgfQorICB2YXIgd2J1ZiA9IG5ldyBCdWZmZXIod3NpemUpOworICBidWYuY29weSh3YnVmLDAsMCx3c2l6ZSk7CisgIHRoaXMudHJhbnMud3JpdGUod2J1Zik7Cit9OworCisvKioKKyAqIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICogTi5CLiBub2RlLWludDY0IGlzIGFsd2F5cyBiaWcgZW5kaWFuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLndyaXRlVmFyaW50NjQgPSBmdW5jdGlvbihuKSB7CisgIGlmICh0eXBlb2YgbiA9PT0gIm51bWJlciIpeworICAgIG4gPSBuZXcgSW50NjQobik7CisgIH0KKyAgaWYgKCEgKG4gaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbik7CisgIH0KKworICB2YXIgYnVmID0gbmV3IEJ1ZmZlcigxMCk7CisgIHZhciB3c2l6ZSA9IDA7CisgIHZhciBoaSA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSgwLCB0cnVlKTsKKyAgdmFyIGxvID0gbi5idWZmZXIucmVhZFVJbnQzMkJFKDQsIHRydWUpOworICB2YXIgbWFzayA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKCgobG8gJiB+MHg3RikgPT09IDApICYmIChoaSA9PT0gMCkpIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9IGxvOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIHsKKyAgICAgIGJ1Zlt3c2l6ZSsrXSA9ICgobG8gJiAweDdGKSB8IDB4ODApOworICAgICAgbWFzayA9IGhpIDw8IDI1OworICAgICAgbG8gPSBsbyA+Pj4gNzsKKyAgICAgIGhpID0gaGkgPj4+IDc7CisgICAgICBsbyA9IGxvIHwgbWFzazsKKyAgICB9CisgIH0KKyAgdmFyIHdidWYgPSBuZXcgQnVmZmVyKHdzaXplKTsKKyAgYnVmLmNvcHkod2J1ZiwwLDAsd3NpemUpOworICB0aGlzLnRyYW5zLndyaXRlKHdidWYpOworfTsKKworLyoqCisgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgKiByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLmk2NFRvWmlnemFnID0gZnVuY3Rpb24obCkgeworICBpZiAodHlwZW9mIGwgPT09ICdzdHJpbmcnKSB7CisgICAgbCA9IG5ldyBJbnQ2NChwYXJzZUludChsLCAxMCkpOworICB9IGVsc2UgaWYgKHR5cGVvZiBsID09PSAnbnVtYmVyJykgeworICAgIGwgPSBuZXcgSW50NjQobCk7CisgIH0KKyAgaWYgKCEgKGwgaW5zdGFuY2VvZiBJbnQ2NCkpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBJbnQ2NCBvciBOdW1iZXIsIGZvdW5kOiAiICsgbCk7CisgIH0KKyAgdmFyIGhpID0gbC5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG8gPSBsLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisgIHZhciBzaWduID0gaGkgPj4+IDMxOworICBoaSA9ICgoaGkgPDwgMSkgfCAobG8gPj4+IDMxKSkgXiAoKCEhc2lnbikgPyAweEZGRkZGRkZGIDogMCk7CisgIGxvID0gKGxvIDw8IDEpIF4gKCghIXNpZ24pID8gMHhGRkZGRkZGRiA6IDApOworICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZQorICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5pMzJUb1ppZ3phZyA9IGZ1bmN0aW9uKG4pIHsKKyAgcmV0dXJuIChuIDw8IDEpIF4gKChuICYgMHg4MDAwMDAwMCkgPyAweEZGRkZGRkZGIDogMCk7Cit9OworCisKKy8vCisvLyBDb21wYWN0IFByb3RvY29sIHJlYWQgb3BlcmF0aW9ucworLy8KKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICAvL1JlYWQgcHJvdG9jb2wgSUQKKyAgdmFyIHByb3RvY29sSWQgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgIGlmIChwcm90b2NvbElkICE9IFRDb21wYWN0UHJvdG9jb2wuUFJPVE9DT0xfSUQpIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5CQURfVkVSU0lPTiwgIkJhZCBwcm90b2NvbCBpZGVudGlmaWVyICIgKyBwcm90b2NvbElkKTsKKyAgfQorCisgIC8vUmVhZCBWZXJzaW9uIGFuZCBUeXBlCisgIHZhciB2ZXJzaW9uQW5kVHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKyAgdmFyIHZlcnNpb24gPSAodmVyc2lvbkFuZFR5cGUgJiBUQ29tcGFjdFByb3RvY29sLlZFUlNJT05fTUFTSyk7CisgIGlmICh2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9OKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgcHJvdG9jb2wgdmVyc2lvbiAiICsgdmVyc2lvbik7CisgIH0KKyAgdmFyIHR5cGUgPSAoKHZlcnNpb25BbmRUeXBlID4+IFRDb21wYWN0UHJvdG9jb2wuVFlQRV9TSElGVF9BTU9VTlQpICYgVENvbXBhY3RQcm90b2NvbC5UWVBFX0JJVFMpOworCisgIC8vUmVhZCBTZXFJZAorICB2YXIgc2VxaWQgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworCisgIC8vUmVhZCBuYW1lCisgIHZhciBuYW1lID0gdGhpcy5yZWFkU3RyaW5nKCk7CisKKyAgcmV0dXJuIHtmbmFtZTogbmFtZSwgbXR5cGU6IHR5cGUsIHJzZXFpZDogc2VxaWR9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZF8ucHVzaCh0aGlzLmxhc3RGaWVsZElkXyk7CisgIHRoaXMubGFzdEZpZWxkSWRfID0gMDsKKyAgcmV0dXJuIHtmbmFtZTogJyd9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmxhc3RGaWVsZElkXyA9IHRoaXMubGFzdEZpZWxkXy5wb3AoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBmaWVsZElkID0gMDsKKyAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKGIpOworICB2YXIgdHlwZSA9IChiICYgMHgwZik7CisKKyAgaWYgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9TVE9QKSB7CisgICAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IFRocmlmdC5UeXBlLlNUT1AsIGZpZDogMH07CisgIH0KKworICAvL01hc2sgb2ZmIHRoZSA0IE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIgdG8gY2hlY2sgZm9yIGZpZWxkIGlkIGRlbHRhLgorICB2YXIgbW9kaWZpZXIgPSAoKGIgJiAweDAwMDAwMGYwKSA+Pj4gNCk7CisgIGlmIChtb2RpZmllciA9PT0gMCkgeworICAgIC8vSWYgbm90IGEgZGVsdGEgcmVhZCB0aGUgZmllbGQgaWQuCisgICAgZmllbGRJZCA9IHRoaXMucmVhZEkxNigpOworICB9IGVsc2UgeworICAgIC8vUmVjb3ZlciB0aGUgZmllbGQgaWQgZnJvbSB0aGUgZGVsdGEKKyAgICBmaWVsZElkID0gKHRoaXMubGFzdEZpZWxkSWRfICsgbW9kaWZpZXIpOworICB9CisgIHZhciBmaWVsZFR5cGUgPSB0aGlzLmdldFRUeXBlKHR5cGUpOworCisgIC8vQm9vbGVhbiBhcmUgZW5jb2RlZCB3aXRoIHRoZSB0eXBlCisgIGlmICh0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9UUlVFIHx8CisgICAgICB0eXBlID09IFRDb21wYWN0UHJvdG9jb2wuVHlwZXMuQ1RfQk9PTEVBTl9GQUxTRSkgeworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSB0cnVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5ib29sVmFsdWUgPQorICAgICAgKHR5cGUgPT0gVENvbXBhY3RQcm90b2NvbC5UeXBlcy5DVF9CT09MRUFOX1RSVUUgPyB0cnVlIDogZmFsc2UpOworICB9CisKKyAgLy9TYXZlIHRoZSBuZXcgZmllbGQgZm9yIHRoZSBuZXh0IGRlbHRhIGNvbXB1dGF0aW9uLgorICB0aGlzLmxhc3RGaWVsZElkXyA9IGZpZWxkSWQ7CisgIHJldHVybiB7Zm5hbWU6IG51bGwsIGZ0eXBlOiBmaWVsZFR5cGUsIGZpZDogZmllbGRJZH07Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgbXNpemUgPSB0aGlzLnJlYWRWYXJpbnQzMigpOworICBpZiAobXNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIG1hcCBzaXplIik7CisgIH0KKworICB2YXIga3ZUeXBlID0gMDsKKyAgaWYgKG1zaXplICE9PSAwKSB7CisgICAga3ZUeXBlID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICB9CisKKyAgdmFyIGtleVR5cGUgPSB0aGlzLmdldFRUeXBlKChrdlR5cGUgJiAweGYwKSA+Pj4gNCk7CisgIHZhciB2YWxUeXBlID0gdGhpcy5nZXRUVHlwZShrdlR5cGUgJiAweGYpOworICByZXR1cm4ge2t0eXBlOiBrZXlUeXBlLCB2dHlwZTogdmFsVHlwZSwgc2l6ZTogbXNpemV9OworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZV9hbmRfdHlwZSA9IHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKKworICB2YXIgbHNpemUgPSAoc2l6ZV9hbmRfdHlwZSA+Pj4gNCkgJiAweDAwMDAwMDBmOworICBpZiAobHNpemUgPT0gMTUpIHsKKyAgICBsc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIH0KKworICBpZiAobHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIGxpc3Qgc2l6ZSIpOworICB9CisKKyAgdmFyIGVsZW1UeXBlID0gdGhpcy5nZXRUVHlwZShzaXplX2FuZF90eXBlICYgMHgwMDAwMDAwZik7CisKKyAgcmV0dXJuIHtldHlwZTogZWxlbVR5cGUsIHNpemU6IGxzaXplfTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7Cit9OworCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RCZWdpbigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgeworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJvb2wgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHZhbHVlID0gZmFsc2U7CisgIHZhciByc2l6ZSA9IDA7CisgIGlmICh0aGlzLmJvb2xWYWx1ZV8uaGFzQm9vbFZhbHVlID09PSB0cnVlKSB7CisgICAgdmFsdWUgPSB0aGlzLmJvb2xWYWx1ZV8uYm9vbFZhbHVlOworICAgIHRoaXMuYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICB2YXIgcmVzID0gdGhpcy50cmFucy5yZWFkQnl0ZSgpOworICAgIHJzaXplID0gcmVzLnJzaXplOworICAgIHZhbHVlID0gKHJlcy52YWx1ZSA9PSBUQ29tcGFjdFByb3RvY29sLlR5cGVzLkNUX0JPT0xFQU5fVFJVRSk7CisgIH0KKyAgcmV0dXJuIHZhbHVlOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZEJ5dGUoKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy56aWd6YWdUb0kzMih0aGlzLnJlYWRWYXJpbnQzMigpKTsKK307CisKK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuemlnemFnVG9JNjQodGhpcy5yZWFkVmFyaW50NjQoKSk7Cit9OworCisvLyBMaXR0bGUtZW5kaWFuLCB1bmxpa2UgVEJpbmFyeVByb3RvY29sCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkRG91YmxlID0gZnVuY3Rpb24oKSB7CisgIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDgpOworICB2YXIgb2ZmID0gMDsKKworICB2YXIgc2lnbmVkID0gYnVmZltvZmYgKyA3XSAmIDB4ODA7CisgIHZhciBlID0gKGJ1ZmZbb2ZmKzZdICYgMHhGMCkgPj4gNDsKKyAgZSArPSAoYnVmZltvZmYrN10gJiAweDdGKSA8PCA0OworCisgIHZhciBtID0gYnVmZltvZmZdOworICBtICs9IGJ1ZmZbb2ZmKzFdIDw8IDg7CisgIG0gKz0gYnVmZltvZmYrMl0gPDwgMTY7CisgIG0gKz0gYnVmZltvZmYrM10gKiBQT1dfMjQ7CisgIG0gKz0gYnVmZltvZmYrNF0gKiBQT1dfMzI7CisgIG0gKz0gYnVmZltvZmYrNV0gKiBQT1dfNDA7CisgIG0gKz0gKGJ1ZmZbb2ZmKzZdICYgMHgwRikgKiBQT1dfNDg7CisKKyAgc3dpdGNoIChlKSB7CisgICAgY2FzZSAwOgorICAgICAgZSA9IC0xMDIyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDQ3OgorICAgICAgcmV0dXJuIG0gPyBOYU4gOiAoc2lnbmVkID8gLUluZmluaXR5IDogSW5maW5pdHkpOworICAgIGRlZmF1bHQ6CisgICAgICBtICs9IFBPV181MjsKKyAgICAgIGUgLT0gMTAyMzsKKyAgfQorCisgIGlmIChzaWduZWQpIHsKKyAgICBtICo9IC0xOworICB9CisKKyAgcmV0dXJuIG0gKiBNYXRoLnBvdygyLCBlIC0gNTIpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuIG5ldyBCdWZmZXIoMCk7CisgIH0KKworICBpZiAoc2l6ZSA8IDApIHsKKyAgICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5ORUdBVElWRV9TSVpFLCAiTmVnYXRpdmUgYmluYXJ5IHNpemUiKTsKKyAgfQorICByZXR1cm4gdGhpcy50cmFucy5yZWFkKHNpemUpOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cmluZyA9IGZ1bmN0aW9uKCkgeworICB2YXIgc2l6ZSA9IHRoaXMucmVhZFZhcmludDMyKCk7CisgIC8vIENhdGNoIGVtcHR5IHN0cmluZyBjYXNlCisgIGlmIChzaXplID09PSAwKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8gQ2F0Y2ggZXJyb3IgY2FzZXMKKyAgaWYgKHNpemUgPCAwKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuTkVHQVRJVkVfU0laRSwgIk5lZ2F0aXZlIHN0cmluZyBzaXplIik7CisgIH0KKyAgcmV0dXJuIHRoaXMudHJhbnMucmVhZFN0cmluZyhzaXplKTsKK307CisKKworLy8KKy8vIENvbXBhY3QgUHJvdG9jb2wgaW50ZXJuYWwgcmVhZCBvcGVyYXRpb25zCisvLworCisvKioKKyAqIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byA1IGJ5dGVzLgorICovCitUQ29tcGFjdFByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFyaW50MzIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZFZhcmludDY0KCkudG9OdW1iZXIoKTsKK307CisKKy8qKgorICogUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gcmVhZCB1cCB0byAxMCBieXRlcy4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUucmVhZFZhcmludDY0ID0gZnVuY3Rpb24oKSB7CisgIHZhciByc2l6ZSA9IDA7CisgIHZhciBsbyA9IDA7CisgIHZhciBoaSA9IDA7CisgIHZhciBzaGlmdCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdmFyIGIgPSB0aGlzLnRyYW5zLnJlYWRCeXRlKCk7CisgICAgcnNpemUgKys7CisgICAgaWYgKHNoaWZ0IDw9IDI1KSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgIH0gZWxzZSBpZiAoMjUgPCBzaGlmdCAmJiBzaGlmdCA8IDMyKSB7CisgICAgICBsbyA9IGxvIHwgKChiICYgMHg3ZikgPDwgc2hpZnQpOworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpID4+PiAoMzItc2hpZnQpKTsKKyAgICB9IGVsc2UgeworICAgICAgaGkgPSBoaSB8ICgoYiAmIDB4N2YpIDw8IChzaGlmdC0zMikpOworICAgIH0KKyAgICBzaGlmdCArPSA3OworICAgIGlmICghKGIgJiAweDgwKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyc2l6ZSA+PSAxMCkgeworICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuSU5WQUxJRF9EQVRBLCAiVmFyaWFibGUtbGVuZ3RoIGludCBvdmVyIDEwIGJ5dGVzLiIpOworICAgIH0KKyAgfQorICByZXR1cm4gbmV3IEludDY0KGhpLCBsbyk7Cit9OworCisvKioKKyAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAqLworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuemlnemFnVG9JMzIgPSBmdW5jdGlvbihuKSB7CisgIHJldHVybiAobiA+Pj4gMSkgXiAoLTEgKiAobiAmIDEpKTsKK307CisKKy8qKgorICogQ29udmVydCBmcm9tIHppZ3phZyBsb25nIHRvIGxvbmcuCisgKi8KK1RDb21wYWN0UHJvdG9jb2wucHJvdG90eXBlLnppZ3phZ1RvSTY0ID0gZnVuY3Rpb24obikgeworICB2YXIgaGkgPSBuLmJ1ZmZlci5yZWFkVUludDMyQkUoMCwgdHJ1ZSk7CisgIHZhciBsbyA9IG4uYnVmZmVyLnJlYWRVSW50MzJCRSg0LCB0cnVlKTsKKworICB2YXIgbmVnID0gbmV3IEludDY0KGhpICYgMCwgbG8gJiAxKTsKKyAgbmVnLl8yc2NvbXAoKTsKKyAgdmFyIGhpX25lZyA9IG5lZy5idWZmZXIucmVhZFVJbnQzMkJFKDAsIHRydWUpOworICB2YXIgbG9fbmVnID0gbmVnLmJ1ZmZlci5yZWFkVUludDMyQkUoNCwgdHJ1ZSk7CisKKyAgdmFyIGhpX2xvID0gKGhpIDw8IDMxKTsKKyAgaGkgPSAoaGkgPj4+IDEpIF4gKGhpX25lZyk7CisgIGxvID0gKChsbyA+Pj4gMSkgfCBoaV9sbykgXiAobG9fbmVnKTsKKyAgcmV0dXJuIG5ldyBJbnQ2NChoaSwgbG8pOworfTsKKworVENvbXBhY3RQcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBUeXBlLlNUT1A6CisgICAgICByZXR1cm47CisgICAgY2FzZSBUeXBlLkJPT0w6CisgICAgICB0aGlzLnJlYWRCb29sKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuQllURToKKyAgICAgIHRoaXMucmVhZEJ5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMTY6CisgICAgICB0aGlzLnJlYWRJMTYoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JMzI6CisgICAgICB0aGlzLnJlYWRJMzIoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5JNjQ6CisgICAgICB0aGlzLnJlYWRJNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5ET1VCTEU6CisgICAgICB0aGlzLnJlYWREb3VibGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJJTkc6CisgICAgICB0aGlzLnJlYWRTdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TVFJVQ1Q6CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIHIgPSB0aGlzLnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChyLmZ0eXBlID09PSBUeXBlLlNUT1ApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNraXAoci5mdHlwZSk7CisgICAgICAgIHRoaXMucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5NQVA6CisgICAgICB2YXIgbWFwQmVnaW4gPSB0aGlzLnJlYWRNYXBCZWdpbigpOworICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXBCZWdpbi5zaXplOyArK2kpIHsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLmt0eXBlKTsKKyAgICAgICAgdGhpcy5za2lwKG1hcEJlZ2luLnZ0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZE1hcEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNFVDoKKyAgICAgIHZhciBzZXRCZWdpbiA9IHRoaXMucmVhZFNldEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMiA9IDA7IGkyIDwgc2V0QmVnaW4uc2l6ZTsgKytpMikgeworICAgICAgICB0aGlzLnNraXAoc2V0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU2V0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTElTVDoKKyAgICAgIHZhciBsaXN0QmVnaW4gPSB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkzID0gMDsgaTMgPCBsaXN0QmVnaW4uc2l6ZTsgKytpMykgeworICAgICAgICB0aGlzLnNraXAobGlzdEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZExpc3RFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyBuZXcgIEVycm9yKCJJbnZhbGlkIHR5cGU6ICIgKyB0eXBlKTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKaW5kZXggY2QzMWE1MC4uOWU1YzA2MyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKQEAgLTE2LDI3ICsxNiw1NiBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpLAotICAgIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlciwKLSAgICBuZXQgPSByZXF1aXJlKCduZXQnKSwKLSAgICB0dHJhbnNwb3J0ID0gcmVxdWlyZSgnLi90cmFuc3BvcnQnKSwKLSAgICB0cHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJyk7Cit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7Cit2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7Cit2YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwogCi12YXIgQmluYXJ5UGFyc2VyID0gcmVxdWlyZSgnLi9iaW5hcnlfcGFyc2VyJykuQmluYXJ5UGFyc2VyOwotQmluYXJ5UGFyc2VyLmJpZ0VuZGlhbiA9IHRydWU7Cit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKwordmFyIGJpbmFyeSA9IHJlcXVpcmUoJy4vYmluYXJ5Jyk7CiAKIHZhciBDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRpb25zKSB7CiAgIHZhciBzZWxmID0gdGhpczsKICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CiAKKyAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CiAgIHRoaXMuY29ubmVjdGlvbiA9IHN0cmVhbTsKKyAgdGhpcy5zc2wgPSAoc3RyZWFtLmVuY3J5cHRlZCk7CiAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307Ci0gIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCB0dHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQ7Ci0gIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgdHByb3RvY29sLlRCaW5hcnlQcm90b2NvbDsKKyAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKKyAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CiAgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOwogICB0aGlzLmNvbm5lY3RlZCA9IGZhbHNlOworICB0aGlzLmluaXRpYWxpemVfcmV0cnlfdmFycygpOwogCi0gIHRoaXMuY29ubmVjdGlvbi5hZGRMaXN0ZW5lcigiY29ubmVjdCIsIGZ1bmN0aW9uKCkgeworICB0aGlzLl9kZWJ1ZyA9IHRoaXMub3B0aW9ucy5kZWJ1ZyB8fCBmYWxzZTsKKyAgaWYgKHRoaXMub3B0aW9ucy5tYXhfYXR0ZW1wdHMgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMubWF4X2F0dGVtcHRzKSAmJgorICAgICAgdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0cyA+IDApIHsKKyAgICAgdGhpcy5tYXhfYXR0ZW1wdHMgPSArdGhpcy5vcHRpb25zLm1heF9hdHRlbXB0czsKKyAgfQorICB0aGlzLnJldHJ5X21heF9kZWxheSA9IG51bGw7CisgIGlmICh0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5ICE9PSB1bmRlZmluZWQgJiYKKyAgICAgICFpc05hTih0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5KSAmJgorICAgICAgdGhpcy5vcHRpb25zLnJldHJ5X21heF9kZWxheSA+IDApIHsKKyAgICAgdGhpcy5yZXRyeV9tYXhfZGVsYXkgPSB0aGlzLm9wdGlvbnMucmV0cnlfbWF4X2RlbGF5OworICB9CisgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gZmFsc2U7CisgIGlmICh0aGlzLm9wdGlvbnMuY29ubmVjdF90aW1lb3V0ICYmCisgICAgICAhaXNOYU4odGhpcy5vcHRpb25zLmNvbm5lY3RfdGltZW91dCkgJiYKKyAgICAgIHRoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPiAwKSB7CisgICAgIHRoaXMuY29ubmVjdF90aW1lb3V0ID0gK3RoaXMub3B0aW9ucy5jb25uZWN0X3RpbWVvdXQ7CisgIH0KKworICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIodGhpcy5zc2wgPyAic2VjdXJlQ29ubmVjdCIgOiAiY29ubmVjdCIsIGZ1bmN0aW9uKCkgewogICAgIHNlbGYuY29ubmVjdGVkID0gdHJ1ZTsKIAogICAgIHRoaXMuc2V0VGltZW91dChzZWxmLm9wdGlvbnMudGltZW91dCB8fCAwKTsKQEAgLTQ0LDYgKzczLDcgQEAKICAgICB0aGlzLmZyYW1lTGVmdCA9IDA7CiAgICAgdGhpcy5mcmFtZVBvcyA9IDA7CiAgICAgdGhpcy5mcmFtZSA9IG51bGw7CisgICAgc2VsZi5pbml0aWFsaXplX3JldHJ5X3ZhcnMoKTsKIAogICAgIHNlbGYub2ZmbGluZV9xdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgIHNlbGYuY29ubmVjdGlvbi53cml0ZShkYXRhKTsKQEAgLTUzLDEyICs4MywxOCBAQAogICB9KTsKIAogICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImVycm9yIiwgZnVuY3Rpb24oZXJyKSB7Ci0gICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgICAgLy8gT25seSBlbWl0IHRoZSBlcnJvciBpZiBuby1vbmUgZWxzZSBpcyBsaXN0ZW5pbmcgb24gdGhlIGNvbm5lY3Rpb24KKyAgICAvLyBvciBpZiBzb21lb25lIGlzIGxpc3RlbmluZyBvbiB1cywgYmVjYXVzZSBOb2RlIHR1cm5zIHVuaGFuZGxlZAorICAgIC8vICdlcnJvcicgZXZlbnRzIGludG8gZXhjZXB0aW9ucy4KKyAgICBpZiAoc2VsZi5jb25uZWN0aW9uLmxpc3RlbmVycygnZXJyb3InKS5sZW5ndGggPT09IDEgfHwKKyAgICAgICAgc2VsZi5saXN0ZW5lcnMoJ2Vycm9yJykubGVuZ3RoID4gMCkgeworICAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgICAgfQogICB9KTsKIAogICAvLyBBZGQgYSBjbG9zZSBsaXN0ZW5lcgogICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKSB7Ci0gICAgc2VsZi5lbWl0KCJjbG9zZSIpOworICAgIHNlbGYuY29ubmVjdGlvbl9nb25lKCk7IC8vIGhhbmRsZSBjbG9zZSBldmVudC4gdHJ5IHRvIHJlY29ubmVjdAogICB9KTsKIAogICB0aGlzLmNvbm5lY3Rpb24uYWRkTGlzdGVuZXIoInRpbWVvdXQiLCBmdW5jdGlvbigpIHsKQEAgLTY4LDI2ICsxMDQsNTcgQEAKICAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJkYXRhIiwgc2VsZi50cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0X3dpdGhfZGF0YSkgewogICAgIHZhciBtZXNzYWdlID0gbmV3IHNlbGYucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CiAgICAgdHJ5IHsKLSAgICAgIHZhciBoZWFkZXIgPSBtZXNzYWdlLnJlYWRNZXNzYWdlQmVnaW4oKTsKLSAgICAgIHZhciBkdW1teV9zZXFpZCA9IGhlYWRlci5yc2VxaWQgKiAtMTsKLSAgICAgIHZhciBjbGllbnQgPSBzZWxmLmNsaWVudDsKLSAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpewotICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7Ci0KLSAgICAgICAgdmFyIGNhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOwotICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOwotICAgICAgICBpZiAoY2FsbGJhY2spIHsKLSAgICAgICAgICBjYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgdmFyIGhlYWRlciA9IG1lc3NhZ2UucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICAgIHZhciBjbGllbnQgPSBzZWxmLmNsaWVudDsKKyAgICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgICAgLy8gIFRoZSBjb25uZWN0aW9uLmNsaWVudCBvYmplY3QgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdAorICAgICAgICAvLyAgbXVsdGlwbGV4aW5nLCB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZAorICAgICAgICAvLyAgaGFzaCBvZiBjbGllbnQgb2JqZWN0cy4KKyAgICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCisgICAgICAgIC8vICBhbmQgbWFrZSB0aGUgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0IHRvIGV4dGVuZCBhbmQgbWFpbnRhaW4uIFdlCisgICAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgorICAgICAgICAvLyAgLS1yYQorICAgICAgICB2YXIgc2VydmljZV9uYW1lID0gc2VsZi5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRbc2VydmljZV9uYW1lXTsKICAgICAgICAgfQotICAgICAgfTsKLSAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShtZXNzYWdlLCBoZWFkZXIubXR5cGUsIGR1bW15X3NlcWlkKTsKKyAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CisgICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworCisgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICAgICAgZGVsZXRlIHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgICAgICBjYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgLypqc2hpbnQgK1cwODMgKi8KKworICAgICAgICBpZihjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0obWVzc2FnZSwgaGVhZGVyLm10eXBlLCBkdW1teV9zZXFpZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgICAgc2VsZi5lbWl0KCJlcnJvciIsCisgICAgICAgICAgICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLldST05HX01FVEhPRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KICAgICBjYXRjaCAoZSkgewotICAgICAgaWYgKGUgaW5zdGFuY2VvZiB0dHJhbnNwb3J0LklucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgaWYgKGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKICAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CiAgICAgICB9CiAgICAgICBlbHNlIHsKLSAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGUpOwogICAgICAgfQogICAgIH0KICAgfSkpOwpAQCAtOTYsNyArMTYzLDE5IEBACiAKIENvbm5lY3Rpb24ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkgewogICB0aGlzLmNvbm5lY3Rpb24uZW5kKCk7Ci19Cit9OworCitDb25uZWN0aW9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuY29ubmVjdGlvbi5kZXN0cm95KCk7Cit9OworCitDb25uZWN0aW9uLnByb3RvdHlwZS5pbml0aWFsaXplX3JldHJ5X3ZhcnMgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOworICB0aGlzLnJldHJ5X3RvdGFsdGltZSA9IDA7CisgIHRoaXMucmV0cnlfZGVsYXkgPSAxNTA7CisgIHRoaXMucmV0cnlfYmFja29mZiA9IDEuNzsKKyAgdGhpcy5hdHRlbXB0cyA9IDA7Cit9OwogCiBDb25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgaWYgKCF0aGlzLmNvbm5lY3RlZCkgewpAQCAtMTA0LDcgKzE4Myw2OCBAQAogICAgIHJldHVybjsKICAgfQogICB0aGlzLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7Ci19Cit9OworCitDb25uZWN0aW9uLnByb3RvdHlwZS5jb25uZWN0aW9uX2dvbmUgPSBmdW5jdGlvbiAoKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTsKKworICAvLyBJZiBhIHJldHJ5IGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIGp1c3QgbGV0IHRoYXQgaGFwcGVuCisgIGlmICh0aGlzLnJldHJ5X3RpbWVyKSB7CisgICAgcmV0dXJuOworICB9CisgIC8vIFdlIGNhbm5vdCByZWNvbm5lY3QgYSBzZWN1cmUgc29ja2V0LgorICBpZiAoIXRoaXMubWF4X2F0dGVtcHRzIHx8IHRoaXMuc3NsKSB7CisgICAgc2VsZi5lbWl0KCJjbG9zZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICh0aGlzLnJldHJ5X21heF9kZWxheSAhPT0gbnVsbCAmJiB0aGlzLnJldHJ5X2RlbGF5ID49IHRoaXMucmV0cnlfbWF4X2RlbGF5KSB7CisgICAgdGhpcy5yZXRyeV9kZWxheSA9IHRoaXMucmV0cnlfbWF4X2RlbGF5OworICB9IGVsc2UgeworICAgIHRoaXMucmV0cnlfZGVsYXkgPSBNYXRoLmZsb29yKHRoaXMucmV0cnlfZGVsYXkgKiB0aGlzLnJldHJ5X2JhY2tvZmYpOworICB9CisKKyAgbG9nLmRlYnVnKCJSZXRyeSBjb25uZWN0aW9uIGluICIgKyB0aGlzLnJldHJ5X2RlbGF5ICsgIiBtcyIpOworCisgIGlmICh0aGlzLm1heF9hdHRlbXB0cyAmJiB0aGlzLmF0dGVtcHRzID49IHRoaXMubWF4X2F0dGVtcHRzKSB7CisgICAgdGhpcy5yZXRyeV90aW1lciA9IG51bGw7CisgICAgY29uc29sZS5lcnJvcigidGhyaWZ0OiBDb3VsZG4ndCBnZXQgdGhyaWZ0IGNvbm5lY3Rpb24gYWZ0ZXIgIiArIHRoaXMubWF4X2F0dGVtcHRzICsgIiBhdHRlbXB0cy4iKTsKKyAgICBzZWxmLmVtaXQoImNsb3NlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhpcy5hdHRlbXB0cyArPSAxOworICB0aGlzLmVtaXQoInJlY29ubmVjdGluZyIsIHsKKyAgICBkZWxheTogc2VsZi5yZXRyeV9kZWxheSwKKyAgICBhdHRlbXB0OiBzZWxmLmF0dGVtcHRzCisgIH0pOworCisgIHRoaXMucmV0cnlfdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKKyAgICBpZiAoc2VsZi5jb25uZWN0aW9uLmRlc3Ryb3llZCkgeworICAgICAgc2VsZi5yZXRyeV90aW1lciA9IG51bGw7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgbG9nLmRlYnVnKCJSZXRyeWluZyBjb25uZWN0aW9uLi4uIik7CisKKyAgICBzZWxmLnJldHJ5X3RvdGFsdGltZSArPSBzZWxmLnJldHJ5X2RlbGF5OworCisgICAgaWYgKHNlbGYuY29ubmVjdF90aW1lb3V0ICYmIHNlbGYucmV0cnlfdG90YWx0aW1lID49IHNlbGYuY29ubmVjdF90aW1lb3V0KSB7CisgICAgICAgc2VsZi5yZXRyeV90aW1lciA9IG51bGw7CisgICAgICAgY29uc29sZS5lcnJvcigidGhyaWZ0OiBDb3VsZG4ndCBnZXQgdGhyaWZ0IGNvbm5lY3Rpb24gYWZ0ZXIgIiArIHNlbGYucmV0cnlfdG90YWx0aW1lICsgIm1zLiIpOworICAgICAgIHNlbGYuZW1pdCgiY2xvc2UiKTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHNlbGYucGF0aCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdChzZWxmLnBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdChzZWxmLnBvcnQsIHNlbGYuaG9zdCk7CisgICAgfQorICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICB9LCB0aGlzLnJldHJ5X2RlbGF5KTsKK307CiAKIGV4cG9ydHMuY3JlYXRlQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKICAgdmFyIHN0cmVhbSA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHBvcnQsIGhvc3QpOwpAQCAtMTEzLDYxICsyNTMsNjcgQEAKICAgY29ubmVjdGlvbi5wb3J0ID0gcG9ydDsKIAogICByZXR1cm4gY29ubmVjdGlvbjsKLX0KK307CiAKLWV4cG9ydHMuY3JlYXRlQ2xpZW50ID0gZnVuY3Rpb24oY2xzLCBjb25uZWN0aW9uKSB7Ci0gIGlmIChjbHMuQ2xpZW50KSB7Ci0gICAgY2xzID0gY2xzLkNsaWVudDsKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKHBhdGgsIG9wdGlvbnMpIHsKKyAgdmFyIHN0cmVhbSA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHBhdGgpOworICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24ucGF0aCA9IHBhdGg7CisKKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9OworCitleHBvcnRzLmNyZWF0ZVNTTENvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIGlmICghKCdzZWN1cmVQcm90b2NvbCcgaW4gb3B0aW9ucykgJiYgISgnc2VjdXJlT3B0aW9ucycgaW4gb3B0aW9ucykpIHsKKyAgICBvcHRpb25zLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgIG9wdGlvbnMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOwogICB9Ci0gIHZhciBjbGllbnQgPSBuZXcgY2xzKG5ldyBjb25uZWN0aW9uLnRyYW5zcG9ydCh1bmRlZmluZWQsIGZ1bmN0aW9uKGJ1ZikgewotICAgIGNvbm5lY3Rpb24ud3JpdGUoYnVmKTsKLSAgfSksIGNvbm5lY3Rpb24ucHJvdG9jb2wpOwogCi0gIC8vIFRPRE8gY2xlYW4gdGhpcyB1cAotICBjb25uZWN0aW9uLmNsaWVudCA9IGNsaWVudDsKKyAgdmFyIHN0cmVhbSA9IHRscy5jb25uZWN0KHBvcnQsIGhvc3QsIG9wdGlvbnMpOworICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKHN0cmVhbSwgb3B0aW9ucyk7CisgIGNvbm5lY3Rpb24uaG9zdCA9IGhvc3Q7CisgIGNvbm5lY3Rpb24ucG9ydCA9IHBvcnQ7CiAKLSAgcmV0dXJuIGNsaWVudDsKLX0KKyAgcmV0dXJuIGNvbm5lY3Rpb247Cit9OworCisKK2V4cG9ydHMuY3JlYXRlQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwogCiB2YXIgY2hpbGRfcHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTsKIHZhciBTdGRJT0Nvbm5lY3Rpb24gPSBleHBvcnRzLlN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsIG9wdGlvbnMpIHsKLQl2YXIgY29tbWFuZF9wYXJ0cyA9IGNvbW1hbmQuc3BsaXQoJyAnKTsKLQljb21tYW5kID0gY29tbWFuZF9wYXJ0c1swXTsKLQl2YXIgYXJncyA9IGNvbW1hbmRfcGFydHMuc3BsaWNlKDEsY29tbWFuZF9wYXJ0cy5sZW5ndGggLTEpOwotCXZhciBjaGlsZCA9IHRoaXMuY2hpbGQgPSBjaGlsZF9wcm9jZXNzLnNwYXduKGNvbW1hbmQsYXJncyk7CisgIHZhciBjb21tYW5kX3BhcnRzID0gY29tbWFuZC5zcGxpdCgnICcpOworICBjb21tYW5kID0gY29tbWFuZF9wYXJ0c1swXTsKKyAgdmFyIGFyZ3MgPSBjb21tYW5kX3BhcnRzLnNwbGljZSgxLGNvbW1hbmRfcGFydHMubGVuZ3RoIC0xKTsKKyAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZCA9IGNoaWxkX3Byb2Nlc3Muc3Bhd24oY29tbWFuZCxhcmdzKTsKIAogICB2YXIgc2VsZiA9IHRoaXM7CiAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOwogCi0JdGhpcy5fZGVidWcgPSBvcHRpb25zLmRlYnVnIHx8IGZhbHNlOwogICB0aGlzLmNvbm5lY3Rpb24gPSBjaGlsZC5zdGRpbjsKICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKLSAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IHR0cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKLSAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCB0cHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOworICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKICAgdGhpcy5vZmZsaW5lX3F1ZXVlID0gW107CiAKLQlpZih0aGlzLl9kZWJ1ZyA9PT0gdHJ1ZSl7CisgIGlmIChsb2cuZ2V0TG9nTGV2ZWwoKSA9PT0gJ2RlYnVnJykgeworICAgIHRoaXMuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGVycikgeworICAgICAgbG9nLmRlYnVnKGVyci50b1N0cmluZygpLCAnQ0hJTEQgRVJST1InKTsKKyAgICB9KTsKIAotICB0aGlzLmNoaWxkLnN0ZGVyci5vbignZGF0YScsZnVuY3Rpb24oZXJyKXsKLQkJCWNvbnNvbGUubG9nKGVyci50b1N0cmluZygpLCdDSElMRCBFUlJPUicpOworICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSxzaWduYWwpIHsKKyAgICAgIGxvZy5kZWJ1Zyhjb2RlICsgJzonICsgc2lnbmFsLCAnQ0hJTEQgRVhJVEVEJyk7CisgICAgfSk7CisgIH0KIAotCQl9KTsKKyAgdGhpcy5mcmFtZUxlZnQgPSAwOworICB0aGlzLmZyYW1lUG9zID0gMDsKKyAgdGhpcy5mcmFtZSA9IG51bGw7CisgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTsKIAotCXRoaXMuY2hpbGQub24oJ2V4aXQnLGZ1bmN0aW9uKGNvZGUsc2lnbmFsKXsKLQkJCWNvbnNvbGUubG9nKGNvZGUrJzonK3NpZ25hbCwnQ0hJTEQgRVhJVEVEJyk7Ci0KLQkJfSk7Ci0KLQl9Ci0KLQl0aGlzLmZyYW1lTGVmdCA9IDA7Ci0JdGhpcy5mcmFtZVBvcyA9IDA7Ci0JdGhpcy5mcmFtZSA9IG51bGw7Ci0JdGhpcy5jb25uZWN0ZWQgPSB0cnVlOwotCi0Jc2VsZi5vZmZsaW5lX3F1ZXVlLmZvckVhY2goZnVuY3Rpb24oZGF0YSkgewotCQkJc2VsZi5jb25uZWN0aW9uLndyaXRlKGRhdGEpOwotCX0pOworICBzZWxmLm9mZmxpbmVfcXVldWUuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7CisgICAgICBzZWxmLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7CisgIH0pOwogCiAKICAgdGhpcy5jb25uZWN0aW9uLmFkZExpc3RlbmVyKCJlcnJvciIsIGZ1bmN0aW9uKGVycikgewpAQCAtMTk3LDcgKzM0Myw3IEBACiAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0obWVzc2FnZSwgaGVhZGVyLm10eXBlLCBkdW1teV9zZXFpZCk7CiAgICAgfQogICAgIGNhdGNoIChlKSB7Ci0gICAgICBpZiAoZSBpbnN0YW5jZW9mIHR0cmFuc3BvcnQuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgewogICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKICAgICAgIH0KICAgICAgIGVsc2UgewpAQCAtMjA1LDE0ICszNTEsMTMgQEAKICAgICAgIH0KICAgICB9CiAgIH0pKTsKLQogfTsKIAotdXRpbC5pbmhlcml0cyhTdGRJT0Nvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7ICAgICAKK3V0aWwuaW5oZXJpdHMoU3RkSU9Db25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOwogCiBTdGRJT0Nvbm5lY3Rpb24ucHJvdG90eXBlLmVuZCA9IGZ1bmN0aW9uKCkgewogICB0aGlzLmNvbm5lY3Rpb24uZW5kKCk7Ci19Cit9OwogCiBTdGRJT0Nvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkgewogICBpZiAoIXRoaXMuY29ubmVjdGVkKSB7CkBAIC0yMjAsMjMgKzM2NSwxMCBAQAogICAgIHJldHVybjsKICAgfQogICB0aGlzLmNvbm5lY3Rpb24ud3JpdGUoZGF0YSk7Ci19Ci1leHBvcnRzLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGNvbW1hbmQsb3B0aW9ucyl7Ci0JcmV0dXJuIG5ldyBTdGRJT0Nvbm5lY3Rpb24oY29tbWFuZCxvcHRpb25zKTsKLQogfTsKIAotZXhwb3J0cy5jcmVhdGVTdGRJT0NsaWVudCA9IGZ1bmN0aW9uKGNscyxjb25uZWN0aW9uKSB7Ci0gIGlmIChjbHMuQ2xpZW50KSB7Ci0gICAgY2xzID0gY2xzLkNsaWVudDsKLSAgfQorZXhwb3J0cy5jcmVhdGVTdGRJT0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihjb21tYW5kLG9wdGlvbnMpeworICByZXR1cm4gbmV3IFN0ZElPQ29ubmVjdGlvbihjb21tYW5kLG9wdGlvbnMpOworfTsKIAotICB2YXIgY2xpZW50ID0gbmV3IGNscyhuZXcgY29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKLQkJY29ubmVjdGlvbi53cml0ZShidWYpOwotCX0pLCBjb25uZWN0aW9uLnByb3RvY29sKTsKLQotICAvLyBUT0RPIGNsZWFuIHRoaXMgdXAKLSAgY29ubmVjdGlvbi5jbGllbnQgPSBjbGllbnQ7Ci0KLSAgcmV0dXJuIGNsaWVudDsKLX0KK2V4cG9ydHMuY3JlYXRlU3RkSU9DbGllbnQgPSBjcmVhdGVDbGllbnQ7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvY3JlYXRlX2NsaWVudC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9jcmVhdGVfY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Yjc3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvY3JlYXRlX2NsaWVudC5qcwpAQCAtMCwwICsxLDU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK21vZHVsZS5leHBvcnRzID0gY3JlYXRlQ2xpZW50OworCisvKioKKyAqIENyZWF0ZXMgYSBuZXcgY2xpZW50IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBUaHJpZnQgc2VydmljZS4KKyAqIEBwYXJhbSB7b2JqZWN0fSBTZXJ2aWNlQ2xpZW50IC0gVGhlIG1vZHVsZSBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBjbGllbnQKKyAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gQ29ubmVjdGlvbiAtIFRoZSBjb25uZWN0aW9uIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtvYmplY3R9IFRoZSBjbGllbnQgb2JqZWN0LgorICovCitmdW5jdGlvbiBjcmVhdGVDbGllbnQoU2VydmljZUNsaWVudCwgY29ubmVjdGlvbikgeworICAvLyBUT0RPIHZhbGlkYXRlIHJlcXVpcmVkIG9wdGlvbnMgYW5kIHRocm93IG90aGVyd2lzZQorICBpZiAoU2VydmljZUNsaWVudC5DbGllbnQpIHsKKyAgICBTZXJ2aWNlQ2xpZW50ID0gU2VydmljZUNsaWVudC5DbGllbnQ7CisgIH0KKyAgLy8gVE9ETyBkZXRhbmdsZSB0aGVzZSBpbml0aWFsaXphdGlvbiBjYWxscworICAvLyBjcmVhdGluZyAiY2xpZW50IiByZXF1aXJlcworICAvLyAgIC0gbmV3IHNlcnZpY2UgY2xpZW50IGluc3RhbmNlCisgIC8vCisgIC8vIE5ldyBzZXJ2aWNlIGNsaWVudCBpbnN0YW5jZSByZXF1aXJlcworICAvLyAgIC0gbmV3IHRyYW5zcG9ydCBpbnN0YW5jZQorICAvLyAgIC0gcHJvdG9jb2wgY2xhc3MgcmVmZXJlbmNlCisgIC8vCisgIC8vIE5ldyB0cmFuc3BvcnQgaW5zdGFuY2UgcmVxdWlyZXMKKyAgLy8gICAtIEJ1ZmZlciB0byB1c2UgKG9yIG5vbmUpCisgIC8vICAgLSBDYWxsYmFjayB0byBjYWxsIG9uIGZsdXNoCisKKyAgLy8gV3JhcCB0aGUgd3JpdGUgbWV0aG9kCisgIHZhciB3cml0ZUNiID0gZnVuY3Rpb24oYnVmLCBzZXFpZCkgeworICAgIGNvbm5lY3Rpb24ud3JpdGUoYnVmLCBzZXFpZCk7CisgIH07CisgIHZhciB0cmFuc3BvcnQgPSBuZXcgY29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCB3cml0ZUNiKTsKKyAgdmFyIGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KHRyYW5zcG9ydCwgY29ubmVjdGlvbi5wcm90b2NvbCk7CisgIHRyYW5zcG9ydC5jbGllbnQgPSBjbGllbnQ7CisgIGNvbm5lY3Rpb24uY2xpZW50ID0gY2xpZW50OworICByZXR1cm4gY2xpZW50OworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk0NzkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBiaW5hcnkgPSByZXF1aXJlKCcuL2JpbmFyeScpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK21vZHVsZS5leHBvcnRzID0gVEZyYW1lZFRyYW5zcG9ydDsKKworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydChidWZmZXIsIGNhbGxiYWNrKSB7CisgIHRoaXMuaW5CdWYgPSBidWZmZXIgfHwgbmV3IEJ1ZmZlcigwKTsKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworICB0aGlzLnJlYWRQb3MgPSAwOworICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaywgc2VxaWQpIHsKKyAgdmFyIHJlc2lkdWFsID0gbnVsbDsKKworICByZXR1cm4gZnVuY3Rpb24oZGF0YSkgeworICAgIC8vIFByZXBlbmQgYW55IHJlc2lkdWFsIGRhdGEgZnJvbSBvdXIgcHJldmlvdXMgcmVhZAorICAgIGlmIChyZXNpZHVhbCkgeworICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW3Jlc2lkdWFsLCBkYXRhXSk7CisgICAgICByZXNpZHVhbCA9IG51bGw7CisgICAgfQorCisgICAgLy8gZnJhbWVkIHRyYW5zcG9ydAorICAgIHdoaWxlIChkYXRhLmxlbmd0aCkgeworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgNCkgeworICAgICAgICAvLyBOb3QgZW5vdWdoIGJ5dGVzIHRvIGNvbnRpbnVlLCBzYXZlIGFuZCByZXN1bWUgb24gbmV4dCBwYWNrZXQKKyAgICAgICAgcmVzaWR1YWwgPSBkYXRhOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB2YXIgZnJhbWVTaXplID0gYmluYXJ5LnJlYWRJMzIoZGF0YSwgMCk7CisgICAgICBpZiAoZGF0YS5sZW5ndGggPCA0ICsgZnJhbWVTaXplKSB7CisgICAgICAgIC8vIE5vdCBlbm91Z2ggYnl0ZXMgdG8gY29udGludWUsIHNhdmUgYW5kIHJlc3VtZSBvbiBuZXh0IHBhY2tldAorICAgICAgICByZXNpZHVhbCA9IGRhdGE7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgdmFyIGZyYW1lID0gZGF0YS5zbGljZSg0LCA0ICsgZnJhbWVTaXplKTsKKyAgICAgIHJlc2lkdWFsID0gZGF0YS5zbGljZSg0ICsgZnJhbWVTaXplKTsKKworICAgICAgY2FsbGJhY2sobmV3IFRGcmFtZWRUcmFuc3BvcnQoZnJhbWUpLCBzZXFpZCk7CisKKyAgICAgIGRhdGEgPSByZXNpZHVhbDsKKyAgICAgIHJlc2lkdWFsID0gbnVsbDsKKyAgICB9CisgIH07Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb21taXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCl7fSwKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLnJvbGxiYWNrUG9zaXRpb24gPSBmdW5jdGlvbigpe30sCisKKyAgLy8gVE9ETzogSW1wbGVtZW50IG9wZW4vY2xvc2Ugc3VwcG9ydAorVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0cnVlOworfTsKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHt9OworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuY2xvc2UgPSAgZnVuY3Rpb24oKSB7fTsKKworICAvLyBTZXQgdGhlIHNlcWlkIG9mIHRoZSBtZXNzYWdlIGluIHRoZSBjbGllbnQKKyAgLy8gU28gdGhhdCBjYWxsYmFja3MgY2FuIGJlIGZvdW5kCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5zZXRDdXJyU2VxSWQgPSBmdW5jdGlvbihzZXFpZCkgeworICB0aGlzLl9zZXFpZCA9IHNlcWlkOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuZW5zdXJlQXZhaWxhYmxlID0gZnVuY3Rpb24obGVuKSB7CisgIGlmICh0aGlzLnJlYWRQb3MgKyBsZW4gPiB0aGlzLmluQnVmLmxlbmd0aCkgeworICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGxlbikgeyAvLyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBmcmFtZXMuCisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBlbmQgPSB0aGlzLnJlYWRQb3MgKyBsZW47CisKKyAgaWYgKHRoaXMuaW5CdWYubGVuZ3RoIDwgZW5kKSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCdyZWFkKCcgKyBsZW4gKyAnKSBmYWlsZWQgLSBub3QgZW5vdWdoIGRhdGEnKTsKKyAgfQorCisgIHZhciBidWYgPSB0aGlzLmluQnVmLnNsaWNlKHRoaXMucmVhZFBvcywgZW5kKTsKKyAgdGhpcy5yZWFkUG9zID0gZW5kOworICByZXR1cm4gYnVmOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEJ5dGUgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5lbnN1cmVBdmFpbGFibGUoMSk7CisgIHJldHVybiBiaW5hcnkucmVhZEJ5dGUodGhpcy5pbkJ1Zlt0aGlzLnJlYWRQb3MrK10pOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEkxNiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSgyKTsKKyAgdmFyIGkxNiA9IGJpbmFyeS5yZWFkSTE2KHRoaXMuaW5CdWYsIHRoaXMucmVhZFBvcyk7CisgIHRoaXMucmVhZFBvcyArPSAyOworICByZXR1cm4gaTE2OworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg0KTsKKyAgdmFyIGkzMiA9IGJpbmFyeS5yZWFkSTMyKHRoaXMuaW5CdWYsIHRoaXMucmVhZFBvcyk7CisgIHRoaXMucmVhZFBvcyArPSA0OworICByZXR1cm4gaTMyOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLmVuc3VyZUF2YWlsYWJsZSg4KTsKKyAgdmFyIGQgPSBiaW5hcnkucmVhZERvdWJsZSh0aGlzLmluQnVmLCB0aGlzLnJlYWRQb3MpOworICB0aGlzLnJlYWRQb3MgKz0gODsKKyAgcmV0dXJuIGQ7Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24obGVuKSB7CisgIHRoaXMuZW5zdXJlQXZhaWxhYmxlKGxlbik7CisgIHZhciBzdHIgPSB0aGlzLmluQnVmLnRvU3RyaW5nKCd1dGY4JywgdGhpcy5yZWFkUG9zLCB0aGlzLnJlYWRQb3MgKyBsZW4pOworICB0aGlzLnJlYWRQb3MgKz0gbGVuOworICByZXR1cm4gc3RyOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuYm9ycm93ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB7CisgICAgYnVmOiB0aGlzLmluQnVmLAorICAgIHJlYWRJbmRleDogdGhpcy5yZWFkUG9zLAorICAgIHdyaXRlSW5kZXg6IHRoaXMuaW5CdWYubGVuZ3RoCisgIH07Cit9OworCitURnJhbWVkVHJhbnNwb3J0LnByb3RvdHlwZS5jb25zdW1lID0gZnVuY3Rpb24oYnl0ZXNDb25zdW1lZCkgeworICB0aGlzLnJlYWRQb3MgKz0gYnl0ZXNDb25zdW1lZDsKK307CisKK1RGcmFtZWRUcmFuc3BvcnQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmLCBlbmNvZGluZykgeworICBpZiAodHlwZW9mKGJ1ZikgPT09ICJzdHJpbmciKSB7CisgICAgYnVmID0gbmV3IEJ1ZmZlcihidWYsIGVuY29kaW5nIHx8ICd1dGY4Jyk7CisgIH0KKyAgdGhpcy5vdXRCdWZmZXJzLnB1c2goYnVmKTsKKyAgdGhpcy5vdXRDb3VudCArPSBidWYubGVuZ3RoOworfTsKKworVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgLy8gSWYgdGhlIHNlcWlkIG9mIHRoZSBjYWxsYmFjayBpcyBhdmFpbGFibGUgcGFzcyBpdCB0byB0aGUgb25GbHVzaAorICAvLyBUaGVuIHJlbW92ZSB0aGUgY3VycmVudCBzZXFpZAorICB2YXIgc2VxaWQgPSB0aGlzLl9zZXFpZDsKKyAgdGhpcy5fc2VxaWQgPSBudWxsOworCisgIHZhciBvdXQgPSBuZXcgQnVmZmVyKHRoaXMub3V0Q291bnQpLAorICAgICAgcG9zID0gMDsKKyAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7CisgICAgYnVmLmNvcHkob3V0LCBwb3MsIDApOworICAgIHBvcyArPSBidWYubGVuZ3RoOworICB9KTsKKworICBpZiAodGhpcy5vbkZsdXNoKSB7CisgICAgLy8gVE9ETzogb3B0aW1pemUgdGhpcyBiZXR0ZXIsIGFsbG9jYXRlIG9uZSBidWZmZXIgaW5zdGVhZCBvZiBib3RoOgorICAgIHZhciBtc2cgPSBuZXcgQnVmZmVyKG91dC5sZW5ndGggKyA0KTsKKyAgICBiaW5hcnkud3JpdGVJMzIobXNnLCBvdXQubGVuZ3RoKTsKKyAgICBvdXQuY29weShtc2csIDQsIDAsIG91dC5sZW5ndGgpOworICAgIGlmICh0aGlzLm9uRmx1c2gpIHsKKyAgICAgIC8vIFBhc3Npbmcgc2VxaWQgdGhyb3VnaCB0aGlzIGNhbGwgdG8gZ2V0IGl0IHRvIHRoZSBjb25uZWN0aW9uCisgICAgICB0aGlzLm9uRmx1c2gobXNnLCBzZXFpZCk7CisgICAgfQorICB9CisKKyAgdGhpcy5vdXRCdWZmZXJzID0gW107CisgIHRoaXMub3V0Q291bnQgPSAwOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmFiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpOwordmFyIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCit2YXIgY3JlYXRlQ2xpZW50ID0gcmVxdWlyZSgnLi9jcmVhdGVfY2xpZW50Jyk7CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBDb25uZWN0T3B0aW9ucworICogQHByb3BlcnR5IHtzdHJpbmd9IHRyYW5zcG9ydCAtIFRoZSBUaHJpZnQgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChUQnVmZmVyZWRUcmFuc3BvcnQsIGV0YykuCisgKiBAcHJvcGVydHkge3N0cmluZ30gcHJvdG9jb2wgLSBUaGUgVGhyaWZ0IHNlcmlhbGl6YXRpb24gcHJvdG9jb2wgdG8gdXNlIChUQmluYXJ5UHJvdG9jb2wsIGV0Yy4pLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBUaGUgVVJMIHBhdGggdG8gUE9TVCB0byAoZS5nLiAiLyIsICIvbXlTdmMiLCAiL3RocmlmdC9xdW90ZVN2YyIsIGV0Yy4pLgorICogQHByb3BlcnR5IHtvYmplY3R9IGhlYWRlcnMgLSBBIHN0YW5kYXJkIE5vZGUuanMgaGVhZGVyIGhhc2gsIGFuIG9iamVjdCBoYXNoIGNvbnRhaW5pbmcga2V5L3ZhbHVlCisgKiAgICAgICAgcGFpcnMgd2hlcmUgdGhlIGtleSBpcyB0aGUgaGVhZGVyIG5hbWUgc3RyaW5nIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGhlYWRlciB2YWx1ZSBzdHJpbmcuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IGh0dHBzIC0gVHJ1ZSBjYXVzZXMgdGhlIGNvbm5lY3Rpb24gdG8gdXNlIGh0dHBzLCBvdGhlcndpc2UgaHR0cCBpcyB1c2VkLgorICogQHByb3BlcnR5IHtvYmplY3R9IG5vZGVPcHRpb25zIC0gT3B0aW9ucyBwYXNzZWQgb24gdG8gbm9kZS4KKyAqIEBleGFtcGxlCisgKiAgICAgLy9Vc2UgYSBjb25uZWN0aW9uIHRoYXQgcmVxdWlyZXMgc3NsL3RscywgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGFmdGVyIGVhY2ggcmVxdWVzdCwKKyAqICAgICAvLyAgdXNlcyB0aGUgYnVmZmVyZWQgdHJhbnNwb3J0IGxheWVyLCB1c2VzIHRoZSBKU09OIHByb3RvY29sIGFuZCBkaXJlY3RzIFJQQyB0cmFmZmljCisgKiAgICAgLy8gIHRvIGh0dHBzOi8vdGhyaWZ0LmV4YW1wbGUuY29tOjkwOTAvaGVsbG8KKyAqICAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7CisgKiAgICAgdmFyIG9wdGlvbnMgPSB7CisgKiAgICAgICAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICogICAgICAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKKyAqICAgICAgICBwYXRoOiAiL2hlbGxvIiwKKyAqICAgICAgICBoZWFkZXJzOiB7IkNvbm5lY3Rpb24iOiAiY2xvc2UifSwKKyAqICAgICAgICBodHRwczogdHJ1ZQorICogICAgIH07CisgKiAgICAgdmFyIGNvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbigidGhyaWZ0LmV4YW1wbGUuY29tIiwgOTA5MCwgb3B0aW9ucyk7CisgKiAgICAgdmFyIGNsaWVudCA9IHRocmlmdC5jcmVhdGVIdHRwQ2xpZW50KG15U2VydmljZSwgY29ubmVjdGlvbik7CisgKiAgICAgY2xpZW50Lm15U2VydmljZUZ1bmN0aW9uKCk7CisgKi8KKworLyoqCisgKiBJbml0aWFsaXplcyBhIFRocmlmdCBIdHRwQ29ubmVjdGlvbiBpbnN0YW5jZSAodXNlIGNyZWF0ZUh0dHBDb25uZWN0aW9uKCkgcmF0aGVyIHRoYW4KKyAqICAgIGluc3RhbnRpYXRpbmcgZGlyZWN0bHkpLgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAdGhyb3dzIHtlcnJvcn0gRXhjZXB0aW9ucyBvdGhlciB0aGFuIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KKyAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKKyAqICAgICByZXF1ZXN0IG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcsIGluIHdoaWNoIGNhc2UgdGhlIG5vZGUgZXJyb3IgaXMgcGFzc2VkIG9uLiBBbiAiZXJyb3IiCisgKiAgICAgZXZlbnQgbWF5IGFsc28gYmUgZmlyZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBjYW4gbm90IG1hcCBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlCisgKiAgICAgYXBwcm9wcmlhdGUgY2xpZW50IChhbiBpbnRlcm5hbCBlcnJvciksIGdlbmVyYXRpbmcgYSBUQXBwbGljYXRpb25FeGNlcHRpb24uCisgKiBAY2xhc3NkZXNjIEh0dHBDb25uZWN0aW9uIG9iamVjdHMgcHJvdmlkZSBUaHJpZnQgZW5kIHBvaW50IHRyYW5zcG9ydAorICogICAgIHNlbWFudGljcyBpbXBsZW1lbnRlZCBvdmVyIHRoZSBOb2RlLmpzIGh0dHAucmVxdWVzdCgpIG1ldGhvZC4KKyAqIEBzZWUge0BsaW5rIGNyZWF0ZUh0dHBDb25uZWN0aW9ufQorICovCit2YXIgSHR0cENvbm5lY3Rpb24gPSBleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24ob3B0aW9ucykgeworICAvL0luaXRpYWxpemUgdGhlIGVtaXR0ZXIgYmFzZSBvYmplY3QKKyAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CisKKyAgLy9TZXQgY29uZmlndXJhdGlvbgorICB2YXIgc2VsZiA9IHRoaXM7CisgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CisgIHRoaXMuaG9zdCA9IHRoaXMub3B0aW9ucy5ob3N0OworICB0aGlzLnBvcnQgPSB0aGlzLm9wdGlvbnMucG9ydDsKKyAgdGhpcy5zb2NrZXRQYXRoID0gdGhpcy5vcHRpb25zLnNvY2tldFBhdGg7CisgIHRoaXMuaHR0cHMgPSB0aGlzLm9wdGlvbnMuaHR0cHMgfHwgZmFsc2U7CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEJpbmFyeVByb3RvY29sOworCisgIC8vUHJlcGFyZSBOb2RlLmpzIG9wdGlvbnMKKyAgdGhpcy5ub2RlT3B0aW9ucyA9IHsKKyAgICBob3N0OiB0aGlzLmhvc3QsCisgICAgcG9ydDogdGhpcy5wb3J0LAorICAgIHNvY2tldFBhdGg6IHRoaXMuc29ja2V0UGF0aCwKKyAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCisgICAgbWV0aG9kOiAnUE9TVCcsCisgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30sCisgICAgcmVzcG9uc2VUeXBlOiB0aGlzLm9wdGlvbnMucmVzcG9uc2VUeXBlIHx8IG51bGwKKyAgfTsKKyAgZm9yICh2YXIgYXR0cm5hbWUgaW4gdGhpcy5vcHRpb25zLm5vZGVPcHRpb25zKSB7CisgICAgdGhpcy5ub2RlT3B0aW9uc1thdHRybmFtZV0gPSB0aGlzLm9wdGlvbnMubm9kZU9wdGlvbnNbYXR0cm5hbWVdOworICB9CisgIC8qanNoaW50IC1XMDY5ICovCisgIGlmICghIHRoaXMubm9kZU9wdGlvbnMuaGVhZGVyc1snQ29ubmVjdGlvbiddKSB7CisgICAgdGhpcy5ub2RlT3B0aW9ucy5oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZSc7CisgIH0KKyAgLypqc2hpbnQgK1cwNjkgKi8KKworICAvL1RoZSBzZXF1ZW5jZSBtYXAgaXMgdXNlZCB0byBtYXAgc2VxSURzIGJhY2sgdG8gdGhlCisgIC8vICBjYWxsaW5nIGNsaWVudCBpbiBtdWx0aXBsZXhlZCBzY2VuYXJpb3MKKyAgdGhpcy5zZXFJZDJTZXJ2aWNlID0ge307CisKKyAgZnVuY3Rpb24gZGVjb2RlQ2FsbGJhY2sodHJhbnNwb3J0X3dpdGhfZGF0YSkgeworICAgIHZhciBwcm90byA9IG5ldyBzZWxmLnByb3RvY29sKHRyYW5zcG9ydF93aXRoX2RhdGEpOworICAgIHRyeSB7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgaGVhZGVyID0gcHJvdG8ucmVhZE1lc3NhZ2VCZWdpbigpOworICAgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICAgIHZhciBjbGllbnQgPSBzZWxmLmNsaWVudDsKKyAgICAgICAgLy9UaGUgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgc3RvcmVzIGEgaGFzaCBvZiBzZXFpZCB0byBzZXJ2aWNlIG5hbWVzCisgICAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgICAgLy8gIFRoZSBjbGllbnQgdmFyIGlzIGEgc2luZ2xlIGNsaWVudCBvYmplY3Qgd2hlbiBub3QgbXVsdGlwbGV4aW5nLAorICAgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgICAgLy8gIG9iamVjdHMuCisgICAgICAgIC8vTk9URTogVGhlIDIgd2F5IGludGVyZGVwZW5kZW5jaWVzIGJldHdlZW4gcHJvdG9jb2xzLCB0cmFuc3BvcnRzLAorICAgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgICAvLyAgYW5kIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdCB0byBleHRlbmQgYW5kIG1haW50YWluLiBXZQorICAgICAgICAvLyAgc2hvdWxkIGJyaW5nIHRoaXMgc3R1ZmYgaW5saW5lIHdpdGggdHlwaWNhbCB0aHJpZnQgSS9PIHN0YWNrCisgICAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgICAgLy8gIC0tcmEKKyAgICAgICAgdmFyIHNlcnZpY2VfbmFtZSA9IHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50W3NlcnZpY2VfbmFtZV07CisgICAgICAgICAgZGVsZXRlIHNlbGYuc2VxSWQyU2VydmljZVtoZWFkZXIucnNlcWlkXTsKKyAgICAgICAgfQorICAgICAgICAvKmpzaGludCAtVzA4MyAqLworICAgICAgICBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdID0gZnVuY3Rpb24oZXJyLCBzdWNjZXNzKXsKKyAgICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICBjbGllbnRDYWxsYmFjayhlcnIsIHN1Y2Nlc3MpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgICBpZihjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0pIHsKKyAgICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbZHVtbXlfc2VxaWRdOworICAgICAgICAgIHNlbGYuZW1pdCgiZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBhIHJlc3BvbnNlIHRvIGFuIHVua25vd24gUlBDIGZ1bmN0aW9uIikpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGNhdGNoIChlKSB7CisgICAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIC8vUmVzcG9uc2UgaGFuZGxlcgorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICB0aGlzLnJlc3BvbnNlQ2FsbGJhY2sgPSBmdW5jdGlvbihyZXNwb25zZSkgeworICAgIHZhciBkYXRhID0gW107CisgICAgdmFyIGRhdGFMZW4gPSAwOworCisgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkgeworICAgICAgdGhpcy5lbWl0KCJlcnJvciIsIG5ldyBUSFRUUEV4Y2VwdGlvbihyZXNwb25zZSkpOworICAgIH0KKworICAgIHJlc3BvbnNlLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlKSB7CisgICAgICBzZWxmLmVtaXQoImVycm9yIiwgZSk7CisgICAgfSk7CisKKyAgICAvLyBXaGVuIHJ1bm5pbmcgZGlyZWN0bHkgdW5kZXIgbm9kZSwgY2h1bmsgd2lsbCBiZSBhIGJ1ZmZlciwKKyAgICAvLyBob3dldmVyLCB3aGVuIHJ1bm5pbmcgaW4gYSBCcm93c2VyIChlLmcuIEJyb3dzZXJpZnkpLCBjaHVuaworICAgIC8vIHdpbGwgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXlCdWZmZXIuCisgICAgcmVzcG9uc2Uub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsKKyAgICAgIGlmICgodHlwZW9mIGNodW5rID09ICdzdHJpbmcnKSB8fAorICAgICAgICAgIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoY2h1bmspID09ICdbb2JqZWN0IFVpbnQ4QXJyYXldJykpIHsKKyAgICAgICAgLy8gV3JhcCBBcnJheUJ1ZmZlci9zdHJpbmcgaW4gYSBCdWZmZXIgc28gZGF0YVtpXS5jb3B5IHdpbGwgd29yaworICAgICAgICBkYXRhLnB1c2gobmV3IEJ1ZmZlcihjaHVuaykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YS5wdXNoKGNodW5rKTsKKyAgICAgIH0KKyAgICAgIGRhdGFMZW4gKz0gY2h1bmsubGVuZ3RoOworICAgIH0pOworCisgICAgcmVzcG9uc2Uub24oJ2VuZCcsIGZ1bmN0aW9uKCl7CisgICAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihkYXRhTGVuKTsKKyAgICAgIGZvciAodmFyIGk9MCwgbGVuPWRhdGEubGVuZ3RoLCBwb3M9MDsgaTxsZW47IGkrKykgeworICAgICAgICBkYXRhW2ldLmNvcHkoYnVmLCBwb3MpOworICAgICAgICBwb3MgKz0gZGF0YVtpXS5sZW5ndGg7CisgICAgICB9CisgICAgICAvL0dldCB0aGUgcmVjZWl2ZXIgZnVuY3Rpb24gZm9yIHRoZSB0cmFuc3BvcnQgYW5kCisgICAgICAvLyAgY2FsbCBpdCB3aXRoIHRoZSBidWZmZXIKKyAgICAgIHNlbGYudHJhbnNwb3J0LnJlY2VpdmVyKGRlY29kZUNhbGxiYWNrKShidWYpOworICAgIH0pOworICB9OworfTsKK3V0aWwuaW5oZXJpdHMoSHR0cENvbm5lY3Rpb24sIEV2ZW50RW1pdHRlcik7CisKKy8qKgorICogV3JpdGVzIFRocmlmdCBtZXNzYWdlIGRhdGEgdG8gdGhlIGNvbm5lY3Rpb24KKyAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gQSBOb2RlLmpzIEJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHdyaXRlCisgKiBAcmV0dXJucyB7dm9pZH0gTm8gcmV0dXJuIHZhbHVlLgorICogQGV2ZW50IHtlcnJvcn0gdGhlICJlcnJvciIgZXZlbnQgaXMgcmFpc2VkIHVwb24gcmVxdWVzdCBmYWlsdXJlIHBhc3NpbmcgdGhlCisgKiAgICAgTm9kZS5qcyBlcnJvciBvYmplY3QgdG8gdGhlIGxpc3RlbmVyLgorICovCitIdHRwQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgdmFyIG9wdHMgPSBzZWxmLm5vZGVPcHRpb25zOworICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtbGVuZ3RoIl0gPSBkYXRhLmxlbmd0aDsKKyAgaWYgKCFvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKQorICAgIG9wdHMuaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24veC10aHJpZnQiOyAgCisgIHZhciByZXEgPSAoc2VsZi5odHRwcykgPworICAgICAgaHR0cHMucmVxdWVzdChvcHRzLCBzZWxmLnJlc3BvbnNlQ2FsbGJhY2spIDoKKyAgICAgIGh0dHAucmVxdWVzdChvcHRzLCBzZWxmLnJlc3BvbnNlQ2FsbGJhY2spOworICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CisgIH0pOworICByZXEud3JpdGUoZGF0YSk7CisgIHJlcS5lbmQoKTsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBIdHRwQ29ubmVjdGlvbiBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7Q29ubmVjdE9wdGlvbnN9IG9wdGlvbnMgLSBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRvIHVzZS4KKyAqIEByZXR1cm5zIHtIdHRwQ29ubmVjdGlvbn0gVGhlIGNvbm5lY3Rpb24gb2JqZWN0LgorICogQHNlZSB7QGxpbmsgQ29ubmVjdE9wdGlvbnN9CisgKi8KK2V4cG9ydHMuY3JlYXRlSHR0cENvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIG9wdGlvbnMuaG9zdCA9IGhvc3Q7CisgIG9wdGlvbnMucG9ydCA9IHBvcnQgfHwgODA7CisgIHJldHVybiBuZXcgSHR0cENvbm5lY3Rpb24ob3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICBvcHRpb25zLnNvY2tldFBhdGggPSBwYXRoOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVIdHRwQ2xpZW50ID0gY3JlYXRlQ2xpZW50CisKKworZnVuY3Rpb24gVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpIHsKKyAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlOworICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgIHRoaXMudHlwZSA9IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlBST1RPQ09MX0VSUk9SOworICB0aGlzLm1lc3NhZ2UgPSAiUmVjZWl2ZWQgYSByZXNwb25zZSB3aXRoIGEgYmFkIEhUVFAgc3RhdHVzIGNvZGU6ICIgKyByZXNwb25zZS5zdGF0dXNDb2RlOworfQordXRpbC5pbmhlcml0cyhUSFRUUEV4Y2VwdGlvbiwgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKaW5kZXggYzdjZWRjMC4uYjA5OTUzZCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcwpAQCAtMTgsMTEgKzE4LDU3IEBACiAgKi8KIGV4cG9ydHMuVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIAordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7CitleHBvcnRzLnNldExvZ0Z1bmMgPSBsb2cuc2V0TG9nRnVuYzsKK2V4cG9ydHMuc2V0TG9nTGV2ZWwgPSBsb2cuc2V0TG9nTGV2ZWw7CitleHBvcnRzLmdldExvZ0xldmVsID0gbG9nLmdldExvZ0xldmVsOworCiB2YXIgY29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vY29ubmVjdGlvbicpOwogZXhwb3J0cy5Db25uZWN0aW9uID0gY29ubmVjdGlvbi5Db25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZUNsaWVudDsKIGV4cG9ydHMuY3JlYXRlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlVURTQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU1NMQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlU3RkSU9DbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ2xpZW50OwogZXhwb3J0cy5jcmVhdGVTdGRJT0Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbjsKIAotZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpLmNyZWF0ZVNlcnZlcjsKK3ZhciBodHRwQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vaHR0cF9jb25uZWN0aW9uJyk7CitleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ2xpZW50OworCit2YXIgd3NDb25uZWN0aW9uID0gcmVxdWlyZSgnLi93c19jb25uZWN0aW9uJyk7CitleHBvcnRzLldTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5XU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ29ubmVjdGlvbiA9IHdzQ29ubmVjdGlvbi5jcmVhdGVXU0Nvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZVdTQ2xpZW50ID0gd3NDb25uZWN0aW9uLmNyZWF0ZVdTQ2xpZW50OworCit2YXIgeGhyQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4veGhyX2Nvbm5lY3Rpb24nKTsKK2V4cG9ydHMuWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ29ubmVjdGlvbiA9IHhockNvbm5lY3Rpb24uY3JlYXRlWEhSQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0geGhyQ29ubmVjdGlvbi5jcmVhdGVYSFJDbGllbnQ7CisKK3ZhciBzZXJ2ZXIgPSByZXF1aXJlKCcuL3NlcnZlcicpOworZXhwb3J0cy5jcmVhdGVTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlU2VydmVyOworZXhwb3J0cy5jcmVhdGVNdWx0aXBsZXhTZXJ2ZXIgPSBzZXJ2ZXIuY3JlYXRlTXVsdGlwbGV4U2VydmVyOworCit2YXIgd2ViX3NlcnZlciA9IHJlcXVpcmUoJy4vd2ViX3NlcnZlcicpOworZXhwb3J0cy5jcmVhdGVXZWJTZXJ2ZXIgPSB3ZWJfc2VydmVyLmNyZWF0ZVdlYlNlcnZlcjsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKK2V4cG9ydHMuUSA9IHJlcXVpcmUoJ3EnKTsKKwordmFyIG1wcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpOwordmFyIG1wcm90b2NvbCA9IHJlcXVpcmUoJy4vbXVsdGlwbGV4ZWRfcHJvdG9jb2wnKTsKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSBtcHJvdG9jb2wuTXVsdGlwbGV4ZXI7CitleHBvcnRzLk11bHRpcGxleGVkUHJvY2Vzc29yID0gbXByb2Nlc3Nvci5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyoKKyAqIEV4cG9ydCB0cmFuc3BvcnQgYW5kIHByb3RvY29sIHNvIHRoZXkgY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiBhCisgKiBjYXNzYW5kcmEvc2VydmVyIGNvbnRleHQKKyAqLworZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9mcmFtZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7CitleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CitleHBvcnRzLlRKU09OUHJvdG9jb2wgPSByZXF1aXJlKCcuL2pzb25fcHJvdG9jb2wnKTsKK2V4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1NTVlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3IuanMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwordmFyIHV0aWwgPSByZXF1aXJlKCJ1dGlsIik7CisKK21vZHVsZS5leHBvcnRzID0gSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yOworCitmdW5jdGlvbiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IobWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKKwordXRpbC5pbmhlcml0cyhJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsIEVycm9yKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2ludDY0X3V0aWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbnQ2NF91dGlsLmpzCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOworCit2YXIgSW50NjRVdGlsID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsKKwordmFyIFBPVzJfMjQgPSBNYXRoLnBvdygyLCAyNCk7Cit2YXIgUE9XMl8zMSA9IE1hdGgucG93KDIsIDMxKTsKK3ZhciBQT1cyXzMyID0gTWF0aC5wb3coMiwgMzIpOwordmFyIFBPVzEwXzExID0gTWF0aC5wb3coMTAsIDExKTsKKworSW50NjRVdGlsLnRvRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKGk2NCkgeworICB2YXIgYiA9IGk2NC5idWZmZXI7CisgIHZhciBvID0gaTY0Lm9mZnNldDsKKyAgaWYgKCghYltvXSAmJiAhKGJbbyArIDFdICYgMHhlMCkpIHx8CisgICAgICAoIX5iW29dICYmICF+KGJbbyArIDFdICYgMHhlMCkpKSB7CisgICAgLy8gVGhlIG1hZ25pdHVkZSBpcyBzbWFsbCBlbm91Z2guCisgICAgcmV0dXJuIGk2NC50b1N0cmluZygpOworICB9IGVsc2UgeworICAgIHZhciBuZWdhdGl2ZSA9IGJbb10gJiAweDgwOworICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIHZhciBpbmNyZW1lbnRlZCA9IGZhbHNlOworICAgICAgdmFyIGJ1ZmZlciA9IG5ldyBCdWZmZXIoOCk7CisgICAgICBmb3IgKHZhciBpID0gNzsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgYnVmZmVyW2ldID0gKH5iW28gKyBpXSArIChpbmNyZW1lbnRlZCA/IDAgOiAxKSkgJiAweGZmOworICAgICAgICBpbmNyZW1lbnRlZCB8PSBiW28gKyBpXTsKKyAgICAgIH0KKyAgICAgIGIgPSBidWZmZXI7CisgICAgfQorICAgIHZhciBoaWdoMiA9IGJbbyArIDFdICsgKGJbb10gPDwgOCk7CisgICAgLy8gTGVzc2VyIDExIGRpZ2l0cyB3aXRoIGV4Y2VlZGluZyB2YWx1ZXMgYnV0IGlzIHVuZGVyIDUzIGJpdHMgY2FwYWNpdHkuCisgICAgdmFyIGxvdyA9IGJbbyArIDddICsgKGJbbyArIDZdIDw8IDgpICsgKGJbbyArIDVdIDw8IDE2KQorICAgICAgICArIGJbbyArIDRdICogUE9XMl8yNCAgLy8gQml0IHNoaWZ0IHJlbmRlcnMgMzJ0aCBiaXQgYXMgc2lnbiwgc28gdXNlIG11bHRpcGxpY2F0aW9uCisgICAgICAgICsgKGJbbyArIDNdICsgKGJbbyArIDJdIDw8IDgpKSAqIFBPVzJfMzIgKyBoaWdoMiAqIDc0OTc2NzEwNjU2OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAlIDEwXjExCisgICAgLy8gMTJ0aCBkaWdpdCBhbmQgZ3JlYXRlci4KKyAgICB2YXIgaGlnaCA9IE1hdGguZmxvb3IobG93IC8gUE9XMTBfMTEpICsgaGlnaDIgKiAyODE0OyAgLy8gVGhlIGxpdGVyYWwgaXMgMl40OCAvIDEwXjExCisgICAgLy8gTWFrZSBpdCBleGFjdGx5IDExIHdpdGggbGVhZGluZyB6ZXJvcy4KKyAgICBsb3cgPSAoJzAwMDAwMDAwMDAwJyArIFN0cmluZyhsb3cgJSBQT1cxMF8xMSkpLnNsaWNlKC0xMSk7CisgICAgcmV0dXJuIChuZWdhdGl2ZSA/ICctJyA6ICcnKSArIFN0cmluZyhoaWdoKSArIGxvdzsKKyAgfQorfTsKKworSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nID0gZnVuY3Rpb24odGV4dCkgeworICB2YXIgbmVnYXRpdmUgPSB0ZXh0LmNoYXJBdCgwKSA9PT0gJy0nOworICBpZiAodGV4dC5sZW5ndGggPCAobmVnYXRpdmUgPyAxNyA6IDE2KSkgeworICAgIC8vIFRoZSBtYWduaXR1ZGUgaXMgc21hbGxlciB0aGFuIDJeNTMuCisgICAgcmV0dXJuIG5ldyBJbnQ2NCgrdGV4dCk7CisgIH0gZWxzZSBpZiAodGV4dC5sZW5ndGggPiAobmVnYXRpdmUgPyAyMCA6IDE5KSkgeworICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUb28gbWFueSBkaWdpdHMgZm9yIEludDY0OiAnICsgdGV4dCk7CisgIH0gZWxzZSB7CisgICAgLy8gTW9zdCBzaWduaWZpY2FudCAodXAgdG8gNSkgZGlnaXRzCisgICAgdmFyIGhpZ2g1ID0gK3RleHQuc2xpY2UobmVnYXRpdmUgPyAxIDogMCwgLTE1KTsKKyAgICB2YXIgbG93ID0gK3RleHQuc2xpY2UoLTE1KSArIGhpZ2g1ICogMjc2NDQ3MjMyMDsgIC8vIFRoZSBsaXRlcmFsIGlzIDEwXjE1ICUgMl4zMgorICAgIHZhciBoaWdoID0gTWF0aC5mbG9vcihsb3cgLyBQT1cyXzMyKSArIGhpZ2g1ICogMjMyODMwOyAgLy8gVGhlIGxpdGVyYWwgaXMgMTBeMTUgLyAyXiYzMgorICAgIGxvdyA9IGxvdyAlIFBPVzJfMzI7CisgICAgaWYgKGhpZ2ggPj0gUE9XMl8zMSAmJgorICAgICAgICAhKG5lZ2F0aXZlICYmIGhpZ2ggPT0gUE9XMl8zMSAmJiBsb3cgPT0gMCkgIC8vIEFsbG93IG1pbmltdW0gSW50NjQKKyAgICAgICApIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgbWFnbml0dWRlIGlzIHRvbyBsYXJnZSBmb3IgSW50NjQuJyk7CisgICAgfQorICAgIGlmIChuZWdhdGl2ZSkgeworICAgICAgLy8gMidzIGNvbXBsZW1lbnQKKyAgICAgIGhpZ2ggPSB+aGlnaDsKKyAgICAgIGlmIChsb3cgPT09IDApIHsKKyAgICAgICAgaGlnaCA9IChoaWdoICsgMSkgJiAweGZmZmZmZmZmOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG93ID0gfmxvdyArIDE7CisgICAgICB9CisgICAgICBoaWdoID0gMHg4MDAwMDAwMCB8IGhpZ2g7CisgICAgfQorICAgIHJldHVybiBuZXcgSW50NjQoaGlnaCwgbG93KTsKKyAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcGFyc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiMGJmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogSW1wb3J0ZWQgZnJvbSBEb3VnbGFzIENyb2NrZm9yZCdzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiB3aXRoIG1pbmltdW0gbW9kaWZpY2F0aW9uCisgKiB0byBoYW5kbGUgSW50NjQuCisgKgorICogaHR0cHM6Ly9naXRodWIuY29tL2RvdWdsYXNjcm9ja2ZvcmQvSlNPTi1qcy9ibG9iL2M5ODk0OGFlMTk0NGEyOGUyZThlYmMzNzE3ODk0ZTU4MGFlYWFhMDUvanNvbl9wYXJzZS5qcworICoKKyAqIE9yaWdpbmFsIGxpY2Vuc2UgaGVhZGVyOgorICoKKyAqIGpzb25fcGFyc2UuanMKKyAqIDIwMTUtMDUtMDIKKyAqIFB1YmxpYyBEb21haW4uCisgKiBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisgKi8KKworCisvKmpzbGludCBmb3IgKi8KKworLypwcm9wZXJ0eQorICAgIGF0LCBiLCBjYWxsLCBjaGFyQXQsIGYsIGZyb21DaGFyQ29kZSwgaGFzT3duUHJvcGVydHksIG1lc3NhZ2UsIG4sIG5hbWUsCisgICAgcHJvdG90eXBlLCBwdXNoLCByLCB0LCB0ZXh0CisqLworCit2YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7Cit2YXIgSW50NjRVdGlsID0gcmVxdWlyZSgnLi9pbnQ2NF91dGlsJyk7CisKK3ZhciBqc29uX3BhcnNlID0gbW9kdWxlLmV4cG9ydHMgPSAoZnVuY3Rpb24gKCkgeworICAgICJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRoYXQgY2FuIHBhcnNlIGEgSlNPTiB0ZXh0LCBwcm9kdWNpbmcgYSBKYXZhU2NyaXB0CisvLyBkYXRhIHN0cnVjdHVyZS4gSXQgaXMgYSBzaW1wbGUsIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4gSXQgZG9lcyBub3QgdXNlCisvLyBldmFsIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgbW9kZWwgZm9yIGltcGxlbWVudGluZworLy8gYSBKU09OIHBhcnNlciBpbiBvdGhlciBsYW5ndWFnZXMuCisKKy8vIFdlIGFyZSBkZWZpbmluZyB0aGUgZnVuY3Rpb24gaW5zaWRlIG9mIGFub3RoZXIgZnVuY3Rpb24gdG8gYXZvaWQgY3JlYXRpbmcKKy8vIGdsb2JhbCB2YXJpYWJsZXMuCisKKyAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGNoLCAgICAgLy8gVGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgIGVzY2FwZWUgPSB7CisgICAgICAgICAgICAnIic6ICciJywKKyAgICAgICAgICAgICdcXCc6ICdcXCcsCisgICAgICAgICAgICAnLyc6ICcvJywKKyAgICAgICAgICAgIGI6ICdcYicsCisgICAgICAgICAgICBmOiAnXGYnLAorICAgICAgICAgICAgbjogJ1xuJywKKyAgICAgICAgICAgIHI6ICdccicsCisgICAgICAgICAgICB0OiAnXHQnCisgICAgICAgIH0sCisgICAgICAgIHRleHQsCisKKyAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgeworCisvLyBDYWxsIGVycm9yIHdoZW4gc29tZXRoaW5nIGlzIHdyb25nLgorCisgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IobSk7CisgICAgICAgIH0sCisKKyAgICAgICAgbmV4dCA9IGZ1bmN0aW9uIChjKSB7CisKKy8vIElmIGEgYyBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQsIHZlcmlmeSB0aGF0IGl0IG1hdGNoZXMgdGhlIGN1cnJlbnQgY2hhcmFjdGVyLgorCisgICAgICAgICAgICBpZiAoYyAmJiBjICE9PSBjaCkgeworICAgICAgICAgICAgICAgIGVycm9yKCJFeHBlY3RlZCAnIiArIGMgKyAiJyBpbnN0ZWFkIG9mICciICsgY2ggKyAiJyIpOworICAgICAgICAgICAgfQorCisvLyBHZXQgdGhlIG5leHQgY2hhcmFjdGVyLiBXaGVuIHRoZXJlIGFyZSBubyBtb3JlIGNoYXJhY3RlcnMsCisvLyByZXR1cm4gdGhlIGVtcHR5IHN0cmluZy4KKworICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CisgICAgICAgICAgICBhdCArPSAxOworICAgICAgICAgICAgcmV0dXJuIGNoOworICAgICAgICB9LAorCisgICAgICAgIG51bWJlciA9IGZ1bmN0aW9uICgpIHsKKworLy8gUGFyc2UgYSBudW1iZXIgdmFsdWUuCisKKyAgICAgICAgICAgIHZhciBudW1iZXIsCisgICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOworICAgICAgICAgICAgICAgIG5leHQoJy0nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJy4nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nICs9ICcuJzsKKyAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ2UnIHx8IGNoID09PSAnRScpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CisgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOworICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bWJlciA9ICtzdHJpbmc7CisgICAgICAgICAgICBpZiAoIWlzRmluaXRlKG51bWJlcikpIHsKKyAgICAgICAgICAgICAgICBlcnJvcigiQmFkIG51bWJlciIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChudW1iZXIgPj0gSW50NjQuTUFYX0lOVCB8fCBudW1iZXIgPD0gSW50NjQuTUlOX0lOVCkgeworICAgICAgICAgICAgICAgIC8vIFJldHVybiByYXcgc3RyaW5nIGZvciBmdXJ0aGVyIHByb2Nlc3MgaW4gVEpTT05Qcm90b2NvbAorICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIHN0cmluZyB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGhleCwKKyAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgIHN0cmluZyA9ICcnLAorICAgICAgICAgICAgICAgIHVmZmZmOworCisvLyBXaGVuIHBhcnNpbmcgZm9yIHN0cmluZyB2YWx1ZXMsIHdlIG11c3QgbG9vayBmb3IgIiBhbmQgXCBjaGFyYWN0ZXJzLgorCisgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd1JykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleCA9IHBhcnNlSW50KG5leHQoKSwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmluaXRlKGhleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVmZmZmID0gdWZmZmYgKiAxNiArIGhleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodWZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXNjYXBlZVtjaF0gPT09ICdzdHJpbmcnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CisgICAgICAgIH0sCisKKyAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFNraXAgd2hpdGVzcGFjZS4KKworICAgICAgICAgICAgd2hpbGUgKGNoICYmIGNoIDw9ICcgJykgeworICAgICAgICAgICAgICAgIG5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgeworCisvLyB0cnVlLCBmYWxzZSwgb3IgbnVsbC4KKworICAgICAgICAgICAgc3dpdGNoIChjaCkgeworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgICAgbmV4dCgndCcpOworICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKKyAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CisgICAgICAgICAgICAgICAgbmV4dCgnZScpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgY2FzZSAnZic6CisgICAgICAgICAgICAgICAgbmV4dCgnZicpOworICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgbmV4dCgncycpOworICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICAgICAgICBuZXh0KCduJyk7CisgICAgICAgICAgICAgICAgbmV4dCgndScpOworICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKKyAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKKyAgICAgICAgfSwKKworICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgorCisgICAgICAgIGFycmF5ID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhbiBhcnJheSB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGFycmF5ID0gW107CisKKyAgICAgICAgICAgIGlmIChjaCA9PT0gJ1snKSB7CisgICAgICAgICAgICAgICAgbmV4dCgnWycpOworICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnXScpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoKSB7CisgICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ10nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVycm9yKCJCYWQgYXJyYXkiKTsKKyAgICAgICAgfSwKKworICAgICAgICBvYmplY3QgPSBmdW5jdGlvbiAoKSB7CisKKy8vIFBhcnNlIGFuIG9iamVjdCB2YWx1ZS4KKworICAgICAgICAgICAgdmFyIGtleSwKKyAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKKworICAgICAgICAgICAgaWYgKGNoID09PSAneycpIHsKKyAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CisgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7ICAgLy8gZW1wdHkgb2JqZWN0CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOworICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignRHVwbGljYXRlIGtleSAiJyArIGtleSArICciJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgnfScpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXh0KCcsJyk7CisgICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyb3IoIkJhZCBvYmplY3QiKTsKKyAgICAgICAgfTsKKworICAgIHZhbHVlID0gZnVuY3Rpb24gKCkgeworCisvLyBQYXJzZSBhIEpTT04gdmFsdWUuIEl0IGNvdWxkIGJlIGFuIG9iamVjdCwgYW4gYXJyYXksIGEgc3RyaW5nLCBhIG51bWJlciwKKy8vIG9yIGEgd29yZC4KKworICAgICAgICB3aGl0ZSgpOworICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpOworICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgIHJldHVybiBhcnJheSgpOworICAgICAgICBjYXNlICciJzoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKKyAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICByZXR1cm4gbnVtYmVyKCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JworICAgICAgICAgICAgICAgID8gbnVtYmVyKCkKKyAgICAgICAgICAgICAgICA6IHdvcmQoKTsKKyAgICAgICAgfQorICAgIH07CisKKy8vIFJldHVybiB0aGUganNvbl9wYXJzZSBmdW5jdGlvbi4gSXQgd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgb2YgdGhlIGFib3ZlCisvLyBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcy4KKworICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlKSB7CisgICAgICAgIHZhciByZXN1bHQ7CisKKyAgICAgICAgdGV4dCA9IHNvdXJjZTsKKyAgICAgICAgYXQgPSAwOworICAgICAgICBjaCA9ICcgJzsKKyAgICAgICAgcmVzdWx0ID0gdmFsdWUoKTsKKyAgICAgICAgd2hpdGUoKTsKKyAgICAgICAgaWYgKGNoKSB7CisgICAgICAgICAgICBlcnJvcigiU3ludGF4IGVycm9yIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH07Cit9KCkpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdhM2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2pzb25fcHJvdG9jb2wuanMKQEAgLTAsMCArMSw4MDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIEludDY0ID0gcmVxdWlyZSgnbm9kZS1pbnQ2NCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7Cit2YXIgVHlwZSA9IFRocmlmdC5UeXBlOwordmFyIHV0aWwgPSByZXF1aXJlKCJ1dGlsIik7CisKK3ZhciBJbnQ2NFV0aWwgPSByZXF1aXJlKCcuL2ludDY0X3V0aWwnKTsKK3ZhciBqc29uX3BhcnNlID0gcmVxdWlyZSgnLi9qc29uX3BhcnNlJyk7CisKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworCittb2R1bGUuZXhwb3J0cyA9IFRKU09OUHJvdG9jb2w7CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBUaHJpZnQgSlNPTiBwcm90b2NvbCBpbnN0YW5jZS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtUaHJpZnQuVHJhbnNwb3J0fSB0cmFucyAtIFRoZSB0cmFuc3BvcnQgdG8gc2VyaWFsaXplIHRvL2Zyb20uCisgKiBAY2xhc3NkZXNjIEFwYWNoZSBUaHJpZnQgUHJvdG9jb2xzIHBlcmZvcm0gc2VyaWFsaXphdGlvbiB3aGljaCBlbmFibGVzIGNyb3NzCisgKiBsYW5ndWFnZSBSUEMuIFRoZSBQcm90b2NvbCB0eXBlIGlzIHRoZSBKYXZhU2NyaXB0IGJyb3dzZXIgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IFRKU09OUHJvdG9jb2wuCisgKiBAZXhhbXBsZQorICogICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgKi8KK2Z1bmN0aW9uIFRKU09OUHJvdG9jb2wodHJhbnMpIHsKKyAgdGhpcy50c3RhY2sgPSBbXTsKKyAgdGhpcy50cG9zID0gW107CisgIHRoaXMudHJhbnMgPSB0cmFuczsKK307CisKKy8qKgorICogVGhyaWZ0IElETCB0eXBlIElkIHRvIHN0cmluZyBtYXBwaW5nLgorICogQHJlYWRvbmx5CisgKiBAc2VlIHtAbGluayBUaHJpZnQuVHlwZX0KKyAqLworVEpTT05Qcm90b2NvbC5UeXBlID0ge307CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5CT09MXSA9ICcidGYiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkJZVEVdID0gJyJpOCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuSTE2XSA9ICciaTE2Iic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5JMzJdID0gJyJpMzIiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLkk2NF0gPSAnImk2NCInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuRE9VQkxFXSA9ICciZGJsIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TVFJVQ1RdID0gJyJyZWMiJzsKK1RKU09OUHJvdG9jb2wuVHlwZVtUeXBlLlNUUklOR10gPSAnInN0ciInOworVEpTT05Qcm90b2NvbC5UeXBlW1R5cGUuTUFQXSA9ICcibWFwIic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5MSVNUXSA9ICcibHN0Iic7CitUSlNPTlByb3RvY29sLlR5cGVbVHlwZS5TRVRdID0gJyJzZXQiJzsKKworLyoqCisgKiBUaHJpZnQgSURMIHR5cGUgc3RyaW5nIHRvIElkIG1hcHBpbmcuCisgKiBAcmVhZG9ubHkKKyAqIEBzZWUge0BsaW5rIFRocmlmdC5UeXBlfQorICovCitUSlNPTlByb3RvY29sLlJUeXBlID0ge307CitUSlNPTlByb3RvY29sLlJUeXBlLnRmID0gVHlwZS5CT09MOworVEpTT05Qcm90b2NvbC5SVHlwZS5pOCA9IFR5cGUuQllURTsKK1RKU09OUHJvdG9jb2wuUlR5cGUuaTE2ID0gVHlwZS5JMTY7CitUSlNPTlByb3RvY29sLlJUeXBlLmkzMiA9IFR5cGUuSTMyOworVEpTT05Qcm90b2NvbC5SVHlwZS5pNjQgPSBUeXBlLkk2NDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuZGJsID0gVHlwZS5ET1VCTEU7CitUSlNPTlByb3RvY29sLlJUeXBlLnJlYyA9IFR5cGUuU1RSVUNUOworVEpTT05Qcm90b2NvbC5SVHlwZS5zdHIgPSBUeXBlLlNUUklORzsKK1RKU09OUHJvdG9jb2wuUlR5cGUubWFwID0gVHlwZS5NQVA7CitUSlNPTlByb3RvY29sLlJUeXBlLmxzdCA9IFR5cGUuTElTVDsKK1RKU09OUHJvdG9jb2wuUlR5cGUuc2V0ID0gVHlwZS5TRVQ7CisKKy8qKgorICogVGhlIFRKU09OUHJvdG9jb2wgdmVyc2lvbiBudW1iZXIuCisgKiBAcmVhZG9ubHkKKyAqIEBjb25zdCB7bnVtYmVyfSBWZXJzaW9uCisgKiBAbWVtYmVyb2YgVGhyaWZ0LlByb3RvY29sCisgKi8KK1RKU09OUHJvdG9jb2wuVmVyc2lvbiA9IDE7CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24oKSB7CisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSA9IGZ1bmN0aW9uKCkgeworICBpZiAodGhpcy50c3RhY2subGVuZ3RoID09PSAxKSB7CisgICAgdGhpcy50cmFucy53cml0ZSh0aGlzLnRzdGFjay5wb3AoKSk7CisgIH0KK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IFJQQyBtZXNzYWdlLgorICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgc2VydmljZSBtZXRob2QgdG8gY2FsbC4KKyAqIEBwYXJhbSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtZXNzYWdlVHlwZSAtIFRoZSB0eXBlIG9mIG1ldGhvZCBjYWxsLgorICogQHBhcmFtIHtudW1iZXJ9IHNlcWlkIC0gVGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGlzIGNhbGwgKGFsd2F5cyAwIGluIEFwYWNoZSBUaHJpZnQpLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIG1lc3NhZ2VUeXBlLCBzZXFpZCkgeworICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlZlcnNpb24sICciJyArIG5hbWUgKyAnIicsIG1lc3NhZ2VUeXBlLCBzZXFpZF0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBUaHJpZnQgUlBDIG1lc3NhZ2UuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUVuZCA9IGZ1bmN0aW9uKCkgeworICB2YXIgb2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgdGhpcy53b2JqID0gdGhpcy50c3RhY2sucG9wKCk7CisgIHRoaXMud29iai5wdXNoKG9iaik7CisKKyAgdGhpcy53YnVmID0gJ1snICsgdGhpcy53b2JqLmpvaW4oJywnKSArICddJzsKKworICAvLyB3ZSBhc3N1bWUgdGhlcmUgaXMgbm90aGluZyBtb3JlIHRvIGNvbWUgc28gd2Ugd3JpdGUKKyAgdGhpcy50cmFucy53cml0ZSh0aGlzLndidWYpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0QmVnaW4gPSBmdW5jdGlvbihuYW1lKSB7CisgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgIHRoaXMudHN0YWNrLnB1c2goe30pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzdHJ1Y3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworICB2YXIgc3RydWN0ID0gdGhpcy50c3RhY2tbcF07CisgIHZhciBzdHIgPSAneyc7CisgIHZhciBmaXJzdCA9IHRydWU7CisgIGZvciAodmFyIGtleSBpbiBzdHJ1Y3QpIHsKKyAgICBpZiAoZmlyc3QpIHsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0ciArPSAnLCc7CisgICAgfQorCisgICAgc3RyICs9IGtleSArICc6JyArIHN0cnVjdFtrZXldOworICB9CisKKyAgc3RyICs9ICd9JzsKKyAgdGhpcy50c3RhY2tbcF0gPSBzdHI7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIHN0cnVjdCBmaWVsZC4KKyAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICogQHBhcmFtIHtUaHJpZnQuUHJvdG9jb2wuVHlwZX0gZmllbGRUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBAcGFyYW0ge251bWJlcn0gZmllbGRJZCAtIFRoZSBmaWVsZCdzIHVuaXF1ZSBpZGVudGlmaWVyLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkQmVnaW4gPSBmdW5jdGlvbihuYW1lLCBmaWVsZFR5cGUsIGZpZWxkSWQpIHsKKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaCh7ICdmaWVsZElkJzogJyInICsKKyAgICBmaWVsZElkICsgJyInLCAnZmllbGRUeXBlJzogVEpTT05Qcm90b2NvbC5UeXBlW2ZpZWxkVHlwZV0KKyAgfSk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGZpZWxkLgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciB2YWx1ZSA9IHRoaXMudHN0YWNrLnBvcCgpOworICB2YXIgZmllbGRJbmZvID0gdGhpcy50c3RhY2sucG9wKCk7CisKKyAgaWYgKCc6JyArIHZhbHVlID09PSAiOltvYmplY3QgT2JqZWN0XSIpIHsKKyAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICd9JzsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnRzdGFja1t0aGlzLnRzdGFjay5sZW5ndGggLSAxXVtmaWVsZEluZm8uZmllbGRJZF0gPSAneycgKworICAgICAgZmllbGRJbmZvLmZpZWxkVHlwZSArICc6JyArIHZhbHVlICsgJ30nOworICB9CisgIHRoaXMudHBvcy5wb3AoKTsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgZmllbGRzIGZvciBhIHN0cnVjdC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZFN0b3AgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogU2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWFwIGNvbGxlY3Rpb24uCisgKiBAcGFyYW0ge1RocmlmdC5UeXBlfSBrZXlUeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUga2V5LgorICogQHBhcmFtIHtUaHJpZnQuVHlwZX0gdmFsVHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICogQHBhcmFtIHtudW1iZXJ9IFtzaXplXSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG1hcCAoaWdub3JlZCkuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrZXlUeXBlLCB2YWxUeXBlLCBzaXplKSB7CisgIC8vc2l6ZSBpcyBpbnZhbGlkLCB3ZSdsbCBzZXQgaXQgb24gZW5kLgorICB0aGlzLnRwb3MucHVzaCh0aGlzLnRzdGFjay5sZW5ndGgpOworICB0aGlzLnRzdGFjay5wdXNoKFtUSlNPTlByb3RvY29sLlR5cGVba2V5VHlwZV0sIFRKU09OUHJvdG9jb2wuVHlwZVt2YWxUeXBlXSwgMF0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtYXAuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwRW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIGlmIChwID09IHRoaXMudHN0YWNrLmxlbmd0aCkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICgodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpICUgMiAhPT0gMCkgeworICAgIHRoaXMudHN0YWNrLnB1c2goJycpOworICB9CisKKyAgdmFyIHNpemUgPSAodGhpcy50c3RhY2subGVuZ3RoIC0gcCAtIDEpIC8gMjsKKworICB0aGlzLnRzdGFja1twXVt0aGlzLnRzdGFja1twXS5sZW5ndGggLSAxXSA9IHNpemU7CisKKyAgdmFyIG1hcCA9ICd9JzsKKyAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgdmFyIHYgPSB0aGlzLnRzdGFjay5wb3AoKTsKKyAgICB2YXIgayA9IHRoaXMudHN0YWNrLnBvcCgpOworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgbWFwID0gJywnICsgbWFwOworICAgIH0KKworICAgIGlmICghIGlzTmFOKGspKSB7IGsgPSAnIicgKyBrICsgJyInOyB9IC8vanNvbiAia2V5cyIgbmVlZCB0byBiZSBzdHJpbmdzCisgICAgbWFwID0gayArICc6JyArIHYgKyBtYXA7CisgIH0KKyAgbWFwID0gJ3snICsgbWFwOworCisgIHRoaXMudHN0YWNrW3BdLnB1c2gobWFwKTsKKyAgdGhpcy50c3RhY2tbcF0gPSAnWycgKyB0aGlzLnRzdGFja1twXS5qb2luKCcsJykgKyAnXSc7CisKKyAgdGhpcy53cml0ZVRvVHJhbnNwb3J0SWZTdGFja0lzRmx1c2hhYmxlKCk7Cit9OworCisvKioKKyAqIFNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QgY29sbGVjdGlvbi4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTGlzdEJlZ2luID0gZnVuY3Rpb24oZWxlbVR5cGUsIHNpemUpIHsKKyAgdGhpcy50cG9zLnB1c2godGhpcy50c3RhY2subGVuZ3RoKTsKKyAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBsaXN0LgorICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHAgPSB0aGlzLnRwb3MucG9wKCk7CisKKyAgd2hpbGUgKHRoaXMudHN0YWNrLmxlbmd0aCA+IHAgKyAxKSB7CisgICAgdmFyIHRtcFZhbCA9IHRoaXMudHN0YWNrW3AgKyAxXTsKKyAgICB0aGlzLnRzdGFjay5zcGxpY2UocCArIDEsIDEpOworICAgIHRoaXMudHN0YWNrW3BdLnB1c2godG1wVmFsKTsKKyAgfQorCisgIHRoaXMudHN0YWNrW3BdID0gJ1snICsgdGhpcy50c3RhY2tbcF0uam9pbignLCcpICsgJ10nOworCisgIHRoaXMud3JpdGVUb1RyYW5zcG9ydElmU3RhY2tJc0ZsdXNoYWJsZSgpOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQgY29sbGVjdGlvbi4KKyAqIEBwYXJhbSB7VGhyaWZ0LlR5cGV9IGVsZW1UeXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZWxlbWVudHMuCisgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3QuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0QmVnaW4gPSBmdW5jdGlvbihlbGVtVHlwZSwgc2l6ZSkgeworICAgIHRoaXMudHBvcy5wdXNoKHRoaXMudHN0YWNrLmxlbmd0aCk7CisgICAgdGhpcy50c3RhY2sucHVzaChbVEpTT05Qcm90b2NvbC5UeXBlW2VsZW1UeXBlXSwgc2l6ZV0pOworfTsKKworLyoqCisgKiBTZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBzZXQuCisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpOworCisgIHdoaWxlICh0aGlzLnRzdGFjay5sZW5ndGggPiBwICsgMSkgeworICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twICsgMV07CisgICAgdGhpcy50c3RhY2suc3BsaWNlKHAgKyAxLCAxKTsKKyAgICB0aGlzLnRzdGFja1twXS5wdXNoKHRtcFZhbCk7CisgIH0KKworICB0aGlzLnRzdGFja1twXSA9ICdbJyArIHRoaXMudHN0YWNrW3BdLmpvaW4oJywnKSArICddJzsKKworICB0aGlzLndyaXRlVG9UcmFuc3BvcnRJZlN0YWNrSXNGbHVzaGFibGUoKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgYm9vbGVhbiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgeworICB0aGlzLnRzdGFjay5wdXNoKGJvb2wgPyAxIDogMCk7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgeworICB0aGlzLnRzdGFjay5wdXNoKGJ5dGUpOworfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTE2ID0gZnVuY3Rpb24oaTE2KSB7CisgIHRoaXMudHN0YWNrLnB1c2goaTE2KTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgbnVtYmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZUkzMiA9IGZ1bmN0aW9uKGkzMikgeworICB0aGlzLnRzdGFjay5wdXNoKGkzMik7Cit9OworCisvKiogU2VyaWFsaXplcyBhIG51bWJlciAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKKyAgaWYgKGk2NCBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgdGhpcy50c3RhY2sucHVzaChJbnQ2NFV0aWwudG9EZWNpbWFsU3RyaW5nKGk2NCkpOworICB9IGVsc2UgeworICAgIHRoaXMudHN0YWNrLnB1c2goaTY0KTsKKyAgfQorfTsKKworLyoqIFNlcmlhbGl6ZXMgYSBudW1iZXIgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLndyaXRlRG91YmxlID0gZnVuY3Rpb24oZHViKSB7CisgIHRoaXMudHN0YWNrLnB1c2goZHViKTsKK307CisKKy8qKiBTZXJpYWxpemVzIGEgc3RyaW5nICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKGFyZykgeworICAvLyBXZSBkbyBub3QgZW5jb2RlIHVyaSBjb21wb25lbnRzIGZvciB3aXJlIHRyYW5zZmVyOgorICBpZiAoYXJnID09PSBudWxsKSB7CisgICAgICB0aGlzLnRzdGFjay5wdXNoKG51bGwpOworICB9IGVsc2UgeworICAgICAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgICAgIHZhciBzdHIgPSBhcmc7CisgICAgICB9IGVsc2UgaWYgKGFyZyBpbnN0YW5jZW9mIEJ1ZmZlcikgeworICAgICAgICB2YXIgc3RyID0gYXJnLnRvU3RyaW5nKCd1dGY4Jyk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dyaXRlU3RyaW5nIGNhbGxlZCB3aXRob3V0IGEgc3RyaW5nL0J1ZmZlciBhcmd1bWVudDogJyArIGFyZyk7CisgICAgICB9CisKKyAgICAgIC8vIGNvbmNhdCBtYXkgYmUgc2xvd2VyIHRoYW4gYnVpbGRpbmcgYSBieXRlIGJ1ZmZlcgorICAgICAgdmFyIGVzY2FwZWRTdHJpbmcgPSAnJzsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgdmFyIGNoID0gc3RyLmNoYXJBdChpKTsgICAgICAvLyBhIHNpbmdsZSBkb3VibGUgcXVvdGU6ICIKKyAgICAgICAgICBpZiAoY2ggPT09ICdcIicpIHsKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxcIic7IC8vIHdyaXRlIG91dCBhczogXCIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXFwnKSB7ICAgIC8vIGEgc2luZ2xlIGJhY2tzbGFzaDogXAorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXFxcJzsgLy8gd3JpdGUgb3V0IGFzOiBcXAorICAgICAgICAgIC8qIEN1cnJlbnRseSBlc2NhcGVkIGZvcndhcmQgc2xhc2hlcyBicmVhayBUSlNPTlByb3RvY29sLgorICAgICAgICAgICAqIEFzIGl0IHN0YW5kcywgd2UgY2FuIHNpbXBseSBwYXNzIGZvcndhcmQgc2xhc2hlcyBpbnRvCisgICAgICAgICAgICogb3VyIHN0cmluZ3MgYWNyb3NzIHRoZSB3aXJlIHdpdGhvdXQgYmVpbmcgZXNjYXBlZC4KKyAgICAgICAgICAgKiBJIHRoaW5rIHRoaXMgaXMgdGhlIHByb3RvY29sJ3MgYnVnLCBub3QgdGhyaWZ0LmpzCisgICAgICAgICAgICogfSBlbHNlIGlmKGNoID09PSAnLycpIHsgICAvLyBhIHNpbmdsZSBmb3J3YXJkIHNsYXNoOiAvCisgICAgICAgICAgICogIGVzY2FwZWRTdHJpbmcgKz0gJ1xcLyc7ICAvLyB3cml0ZSBvdXQgYXMgXC8KKyAgICAgICAgICAgKiB9CisgICAgICAgICAgICovCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xiJykgeyAgICAvLyBhIHNpbmdsZSBiYWNrc3BhY2U6IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXGInOyAgLy8gd3JpdGUgb3V0IGFzOiBcYiIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXGYnKSB7ICAgIC8vIGEgc2luZ2xlIGZvcm1mZWVkOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxmJzsgIC8vIHdyaXRlIG91dCBhczogXGYiCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xuJykgeyAgICAvLyBhIHNpbmdsZSBuZXdsaW5lOiBpbnZpc2libGUKKyAgICAgICAgICAgICAgZXNjYXBlZFN0cmluZyArPSAnXFxuJzsgIC8vIHdyaXRlIG91dCBhczogXG4iCisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xyJykgeyAgICAvLyBhIHNpbmdsZSByZXR1cm46IGludmlzaWJsZQorICAgICAgICAgICAgICBlc2NhcGVkU3RyaW5nICs9ICdcXHInOyAgLy8gd3JpdGUgb3V0IGFzOiBcciIKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAnXHQnKSB7ICAgIC8vIGEgc2luZ2xlIHRhYjogaW52aXNpYmxlCisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gJ1xcdCc7ICAvLyB3cml0ZSBvdXQgYXM6IFx0IgorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGVzY2FwZWRTdHJpbmcgKz0gY2g7ICAgICAvLyBFbHNlIGl0IG5lZWQgbm90IGJlIGVzY2FwZWQKKyAgICAgICAgICB9CisgICAgICB9CisgICAgICB0aGlzLnRzdGFjay5wdXNoKCciJyArIGVzY2FwZWRTdHJpbmcgKyAnIicpOworICB9Cit9OworCisvKiogU2VyaWFsaXplcyBhIHN0cmluZyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUud3JpdGVCaW5hcnkgPSBmdW5jdGlvbihhcmcpIHsKKyAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7CisgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoYXJnLCAnYmluYXJ5Jyk7CisgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgQnVmZmVyIHx8CisgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGFyZykgPT0gJ1tvYmplY3QgVWludDhBcnJheV0nKSAgeworICAgIHZhciBidWYgPSBhcmc7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgbmV3IEVycm9yKCd3cml0ZUJpbmFyeSBjYWxsZWQgd2l0aG91dCBhIHN0cmluZy9CdWZmZXIgYXJndW1lbnQ6ICcgKyBhcmcpOworICB9CisgIHRoaXMudHN0YWNrLnB1c2goJyInICsgYnVmLnRvU3RyaW5nKCdiYXNlNjQnKSArICciJyk7Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRNZXNzYWdlQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIG1ldGhvZC4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0Lk1lc3NhZ2VUeXBlfSBtdHlwZSAtIFRoZSB0eXBlIG9mIG1lc3NhZ2UgY2FsbC4KKyAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByc2VxaWQgLSBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZXNzYWdlICgwIGluIFRocmlmdCBSUEMpLgorICovCisvKioKKyAqIERlc2VyaWFsaXplcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZS4KKyAqIEByZXR1cm5zIHtBbm9uUmVhZE1lc3NhZ2VCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnJzdGFjayA9IFtdOworICB0aGlzLnJwb3MgPSBbXTsKKworICAvL0JvcnJvdyB0aGUgaW5ib3VuZCB0cmFuc3BvcnQgYnVmZmVyIGFuZCBlbnN1cmUgZGF0YSBpcyBwcmVzZW50L2NvbnNpc3RlbnQKKyAgdmFyIHRyYW5zQnVmID0gdGhpcy50cmFucy5ib3Jyb3coKTsKKyAgaWYgKHRyYW5zQnVmLnJlYWRJbmRleCA+PSB0cmFuc0J1Zi53cml0ZUluZGV4KSB7CisgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOworICB9CisgIHZhciBjdXJzb3IgPSB0cmFuc0J1Zi5yZWFkSW5kZXg7CisKKyAgaWYgKHRyYW5zQnVmLmJ1ZltjdXJzb3JdICE9PSAweDVCKSB7IC8vWworICAgIHRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIEpTT04gaW5wdXQsIG5vIG9wZW5pbmcgYnJhY2tldCIpOworICB9CisKKyAgLy9QYXJzZSBhIHNpbmdsZSBtZXNzYWdlICh0aGVyZSBtYXkgYmUgc2V2ZXJhbCBpbiB0aGUgYnVmZmVyKQorICAvLyAgVE9ETzogSGFuZGxlIGNoYXJhY3RlcnMgdXNpbmcgbXVsdGlwbGUgY29kZSB1bml0cworICBjdXJzb3IrKzsKKyAgdmFyIG9wZW5CcmFja2V0Q291bnQgPSAxOworICB2YXIgaW5TdHJpbmcgPSBmYWxzZTsKKyAgZm9yICg7IGN1cnNvciA8IHRyYW5zQnVmLndyaXRlSW5kZXg7IGN1cnNvcisrKSB7CisgICAgdmFyIGNociA9IHRyYW5zQnVmLmJ1ZltjdXJzb3JdOworICAgIC8vd2UgdXNlIGhleGEgY2hhcmNvZGUgaGVyZSBiZWNhdXNlIGRhdGFbaV0gcmV0dXJucyBhbiBpbnQgYW5kIG5vdCBhIGNoYXIKKyAgICBpZiAoaW5TdHJpbmcpIHsKKyAgICAgIGlmIChjaHIgPT09IDB4MjIpIHsgLy8iCisgICAgICAgIGluU3RyaW5nID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGNociA9PT0gMHg1QykgeyAvL1wKKyAgICAgICAgLy9lc2NhcGVkIGNoYXJhY3Rlciwgc2tpcAorICAgICAgICBjdXJzb3IgKz0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGNociA9PT0gMHg1QikgeyAvL1sKKyAgICAgICAgb3BlbkJyYWNrZXRDb3VudCArPSAxOworICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4NUQpIHsgLy9dCisgICAgICAgIG9wZW5CcmFja2V0Q291bnQgLT0gMTsKKyAgICAgICAgaWYgKG9wZW5CcmFja2V0Q291bnQgPT09IDApIHsKKyAgICAgICAgICAvL2VuZCBvZiBqc29uIG1lc3NhZ2UgZGV0ZWN0ZWQKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjaHIgPT09IDB4MjIpIHsgLy8iCisgICAgICAgIGluU3RyaW5nID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAob3BlbkJyYWNrZXRDb3VudCAhPT0gMCkgeworICAgIC8vIE1pc3NpbmcgY2xvc2luZyBicmFja2V0LiBDYW4gYmUgYnVmZmVyIHVuZGVycnVuLgorICAgIHRocm93IG5ldyBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IoKTsKKyAgfQorCisgIC8vUmVjb25zdGl0dXRlIHRoZSBKU09OIG9iamVjdCBhbmQgY29udW1lIHRoZSBuZWNlc3NhcnkgYnl0ZXMKKyAgdGhpcy5yb2JqID0ganNvbl9wYXJzZSh0cmFuc0J1Zi5idWYuc2xpY2UodHJhbnNCdWYucmVhZEluZGV4LCBjdXJzb3IrMSkudG9TdHJpbmcoKSk7CisgIHRoaXMudHJhbnMuY29uc3VtZShjdXJzb3IgKyAxIC0gdHJhbnNCdWYucmVhZEluZGV4KTsKKworICAvL1ZlcmlmeSB0aGUgcHJvdG9jb2wgdmVyc2lvbgorICB2YXIgdmVyc2lvbiA9IHRoaXMucm9iai5zaGlmdCgpOworICBpZiAodmVyc2lvbiAhPSBUSlNPTlByb3RvY29sLlZlcnNpb24pIHsKKyAgICB0aHJvdyBuZXcgRXJyb3IoJ1dyb25nIHRocmlmdCBwcm90b2NvbCB2ZXJzaW9uOiAnICsgdmVyc2lvbik7CisgIH0KKworICAvL09iamVjdGlmeSB0aGUgdGhyaWZ0IG1lc3NhZ2Uge25hbWUvdHlwZS9zZXF1ZW5jZS1udW1iZXJ9IGZvciByZXR1cm4KKyAgLy8gYW5kIHRoZW4gc2F2ZSB0aGUgSlNPTiBvYmplY3QgaW4gcnN0YWNrCisgIHZhciByID0ge307CisgIHIuZm5hbWUgPSB0aGlzLnJvYmouc2hpZnQoKTsKKyAgci5tdHlwZSA9IHRoaXMucm9iai5zaGlmdCgpOworICByLnJzZXFpZCA9IHRoaXMucm9iai5zaGlmdCgpOworICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucm9iai5zaGlmdCgpKTsKKyAgcmV0dXJuIHI7Cit9OworCisvKiogRGVzZXJpYWxpemVzIHRoZSBlbmQgb2YgYSBtZXNzYWdlLiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKK307CisKKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJ1Y3QuCisgKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhlIHN0cnVjdCAoaWdub3JlZCkKKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gQW4gb2JqZWN0IHdpdGggYW4gZW1wdHkgc3RyaW5nIGZuYW1lIHByb3BlcnR5CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJ1Y3RCZWdpbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgciA9IHt9OworICByLmZuYW1lID0gJyc7CisKKyAgLy9pbmNhc2UgdGhpcyBpcyBhbiBhcnJheSBvZiBzdHJ1Y3RzCisgIGlmICh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgdGhpcy5yc3RhY2sucHVzaCh0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXS5zaGlmdCgpKTsKKyAgfQorCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgc3RydWN0LiAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnJzdGFjay5wb3AoKTsKK307CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBBbm9uUmVhZEZpZWxkQmVnaW5SZXR1cm4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCAoYWx3YXlzICcnKS4KKyAqIEBwcm9wZXJ0eSB7VGhyaWZ0LlR5cGV9IGZ0eXBlIC0gVGhlIGRhdGEgdHlwZSBvZiB0aGUgZmllbGQuCisgKiBAcHJvcGVydHkge251bWJlcn0gZmlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBmaWVsZC4KKyAqLworLyoqCisgKiBEZXNlcmlhbGl6ZXMgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLgorICogQHJldHVybnMge0Fub25SZWFkRmllbGRCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEZpZWxkQmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIHIgPSB7fTsKKworICB2YXIgZmlkID0gLTE7CisgIHZhciBmdHlwZSA9IFR5cGUuU1RPUDsKKworICAvL2dldCBhIGZpZWxkSWQKKyAgZm9yICh2YXIgZiBpbiAodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV0pKSB7CisgICAgaWYgKGYgPT09IG51bGwpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZpZCA9IHBhcnNlSW50KGYsIDEwKTsKKyAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworCisgICAgdmFyIGZpZWxkID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1bZmlkXTsKKworICAgIC8vcmVtb3ZlIHNvIHdlIGRvbid0IHNlZSBpdCBhZ2FpbgorICAgIGRlbGV0ZSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXVtmaWRdOworCisgICAgdGhpcy5yc3RhY2sucHVzaChmaWVsZCk7CisKKyAgICBicmVhazsKKyAgfQorCisgIGlmIChmaWQgIT0gLTEpIHsKKyAgICAvL3Nob3VsZCBvbmx5IGJlIDEgb2YgdGhlc2UgYnV0IHRoaXMgaXMgdGhlIG9ubHkKKyAgICAvL3dheSB0byBtYXRjaCBhIGtleQorICAgIGZvciAodmFyIGkgaW4gKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdKSkgeworICAgICAgaWYgKFRKU09OUHJvdG9jb2wuUlR5cGVbaV0gPT09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZ0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtpXTsKKyAgICAgIHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aCAtIDFdID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV1baV07CisgICAgfQorICB9CisKKyAgci5mbmFtZSA9ICcnOworICByLmZ0eXBlID0gZnR5cGU7CisgIHIuZmlkID0gZmlkOworCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgZmllbGQuICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHBvcyA9IHRoaXMucnBvcy5wb3AoKTsKKworICAvL2dldCBiYWNrIHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgc3RhY2sKKyAgd2hpbGUgKHRoaXMucnN0YWNrLmxlbmd0aCA+IHBvcykgeworICAgIHRoaXMucnN0YWNrLnBvcCgpOworICB9Cit9OworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgQW5vblJlYWRNYXBCZWdpblJldHVybgorICogQHByb3BlcnR5IHtUaHJpZnQuVHlwZX0ga3R5cGUgLSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBrZXkuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSB2dHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHZhbHVlLgorICogQHByb3BlcnR5IHtudW1iZXJ9IHNpemUgLSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBtYXAuCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAuCisgKiBAcmV0dXJucyB7QW5vblJlYWRNYXBCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHZhciBtYXAgPSB0aGlzLnJzdGFjay5wb3AoKTsKKyAgdmFyIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgIGlmIChmaXJzdCBpbnN0YW5jZW9mIEFycmF5KSB7CisgICAgdGhpcy5yc3RhY2sucHVzaChtYXApOworICAgIG1hcCA9IGZpcnN0OworICAgIGZpcnN0ID0gbWFwLnNoaWZ0KCk7CisgIH0KKworICB2YXIgciA9IHt9OworICByLmt0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtmaXJzdF07CisgIHIudnR5cGUgPSBUSlNPTlByb3RvY29sLlJUeXBlW21hcC5zaGlmdCgpXTsKKyAgci5zaXplID0gbWFwLnNoaWZ0KCk7CisKKworICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOworICB0aGlzLnJzdGFjay5wdXNoKG1hcC5zaGlmdCgpKTsKKworICByZXR1cm4gcjsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIG1hcC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBFbmQgPSBmdW5jdGlvbigpIHsKKyAgdGhpcy5yZWFkRmllbGRFbmQoKTsKK307CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBBbm9uUmVhZENvbEJlZ2luUmV0dXJuCisgKiBAcHJvcGVydHkge1RocmlmdC5UeXBlfSBldHlwZSAtIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGVsZW1lbnQuCisgKiBAcHJvcGVydHkge251bWJlcn0gc2l6ZSAtIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24uCisgKi8KKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0LgorICogQHJldHVybnMge0Fub25SZWFkQ29sQmVnaW5SZXR1cm59CisgKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKKyAgdmFyIGxpc3QgPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGggLSAxXTsKKworICB2YXIgciA9IHt9OworICByLmV0eXBlID0gVEpTT05Qcm90b2NvbC5SVHlwZVtsaXN0LnNoaWZ0KCldOworICByLnNpemUgPSBsaXN0LnNoaWZ0KCk7CisKKyAgdGhpcy5ycG9zLnB1c2godGhpcy5yc3RhY2subGVuZ3RoKTsKKyAgdGhpcy5yc3RhY2sucHVzaChsaXN0LnNoaWZ0KCkpOworCisgIHJldHVybiByOworfTsKKworLyoqIERlc2VyaWFsaXplcyB0aGUgZW5kIG9mIGEgbGlzdC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0RW5kID0gZnVuY3Rpb24oKSB7CisgIHZhciBwb3MgPSB0aGlzLnJwb3MucG9wKCkgLSAyOworICB2YXIgc3QgPSB0aGlzLnJzdGFjazsKKyAgc3QucG9wKCk7CisgIGlmIChzdCBpbnN0YW5jZW9mIEFycmF5ICYmIHN0Lmxlbmd0aCA+IHBvcyAmJiBzdFtwb3NdLmxlbmd0aCA+IDApIHsKKyAgICBzdC5wdXNoKHN0W3Bvc10uc2hpZnQoKSk7CisgIH0KK307CisKKy8qKgorICogRGVzZXJpYWxpemVzIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgKiBAcmV0dXJucyB7QW5vblJlYWRDb2xCZWdpblJldHVybn0KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEJlZ2luID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRMaXN0QmVnaW4oKTsKK307CisKKy8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIHNldC4gKi8KK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRTZXRFbmQgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZExpc3RFbmQoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpID09ICcxJzsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRJMzIoKTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJMTYgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKGYpIHsKKyAgcmV0dXJuICt0aGlzLnJlYWRWYWx1ZSgpOworfQorCisvKiogUmV0dXJucyB0aGUgbmV4dCB2YWx1ZSBmb3VuZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyICovCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkVmFsdWUgPSBmdW5jdGlvbihmKSB7CisgIGlmIChmID09PSB1bmRlZmluZWQpIHsKKyAgICBmID0gdGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoIC0gMV07CisgIH0KKworICB2YXIgciA9IHt9OworCisgIGlmIChmIGluc3RhbmNlb2YgQXJyYXkpIHsKKyAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKKyAgICAgIHIudmFsdWUgPSB1bmRlZmluZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHIudmFsdWUgPSBmLnNoaWZ0KCk7CisgICAgfQorICB9IGVsc2UgaWYgKCEoZiBpbnN0YW5jZW9mIEludDY0KSAmJiBmIGluc3RhbmNlb2YgT2JqZWN0KSB7CisgICAgZm9yICh2YXIgaSBpbiBmKSB7CisgICAgICBpZiAoaSA9PT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHRoaXMucnN0YWNrLnB1c2goZltpXSk7CisgICAgICBkZWxldGUgZltpXTsKKworICAgICAgci52YWx1ZSA9IGk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgci52YWx1ZSA9IGY7CisgICAgdGhpcy5yc3RhY2sucG9wKCk7CisgIH0KKworICByZXR1cm4gci52YWx1ZTsKK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKKyAgdmFyIG4gPSB0aGlzLnJlYWRWYWx1ZSgpCisgIGlmICh0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKKyAgICAvLyBBc3N1bWluZyBubyBvbmUgaXMgc2VuZGluZyBpbiAxLjExMTExZSszMyBmb3JtYXQKKyAgICByZXR1cm4gSW50NjRVdGlsLmZyb21EZWNpbWFsU3RyaW5nKG4pOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXcgSW50NjQobik7CisgIH0KK307CisKK1RKU09OUHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVhZEkzMigpOworfTsKKworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUucmVhZEJpbmFyeSA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gbmV3IEJ1ZmZlcih0aGlzLnJlYWRWYWx1ZSgpLCAnYmFzZTY0Jyk7Cit9OworCitUSlNPTlByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnJlYWRWYWx1ZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge1RocmlmdC5UcmFuc3BvcnR9IFRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4KKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuZ2V0VHJhbnNwb3J0ID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnRyYW5zOworfTsKKworLyoqCisgKiBNZXRob2QgdG8gYXJiaXRyYXJpbHkgc2tpcCBvdmVyIGRhdGEKKyAqLworVEpTT05Qcm90b2NvbC5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFR5cGUuU1RPUDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFR5cGUuQk9PTDoKKyAgICAgIHRoaXMucmVhZEJvb2woKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5CWVRFOgorICAgICAgdGhpcy5yZWFkQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkxNjoKKyAgICAgIHRoaXMucmVhZEkxNigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkkzMjoKKyAgICAgIHRoaXMucmVhZEkzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkk2NDoKKyAgICAgIHRoaXMucmVhZEk2NCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkRPVUJMRToKKyAgICAgIHRoaXMucmVhZERvdWJsZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUklORzoKKyAgICAgIHRoaXMucmVhZFN0cmluZygpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLlNUUlVDVDoKKyAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKKyAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLk1BUDoKKyAgICAgIHZhciBtYXBCZWdpbiA9IHRoaXMucmVhZE1hcEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcEJlZ2luLnNpemU7ICsraSkgeworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4ua3R5cGUpOworICAgICAgICB0aGlzLnNraXAobWFwQmVnaW4udnR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTWFwRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU0VUOgorICAgICAgdmFyIHNldEJlZ2luID0gdGhpcy5yZWFkU2V0QmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkyID0gMDsgaTIgPCBzZXRCZWdpbi5zaXplOyArK2kyKSB7CisgICAgICAgIHRoaXMuc2tpcChzZXRCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRTZXRFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5MSVNUOgorICAgICAgdmFyIGxpc3RCZWdpbiA9IHRoaXMucmVhZExpc3RCZWdpbigpOworICAgICAgZm9yICh2YXIgaTMgPSAwOyBpMyA8IGxpc3RCZWdpbi5zaXplOyArK2kzKSB7CisgICAgICAgIHRoaXMuc2tpcChsaXN0QmVnaW4uZXR5cGUpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHRocm93IG5ldyAgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOworICB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzZTgxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKKwordmFyIGRpc2FibGVkID0gZnVuY3Rpb24gKCkge307Cit2YXIgbG9nRnVuYyA9IGNvbnNvbGUubG9nOwordmFyIGxvZ0xldmVsID0gJ2Vycm9yJzsgLy8gZGVmYXVsdCBsZXZlbAorCitmdW5jdGlvbiBmYWN0b3J5KGxldmVsKSB7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgLy8gYmV0dGVyIHVzZSBzcHJlYWQgc3ludGF4LCBidXQgZHVlIHRvIGNvbXBhdGliaWxpdHksCisgICAgLy8gdXNlIGxlZ2FjeSBtZXRob2QgaGVyZS4KKyAgICB2YXIgYXJncyA9IFsndGhyaWZ0OiBbJyArIGxldmVsICsgJ10gJ10uY29uY2F0KEFycmF5LmZyb20oYXJndW1lbnRzKSk7CisgICAgcmV0dXJuIGxvZ0Z1bmModXRpbC5mb3JtYXQuYXBwbHkobnVsbCwgYXJncykpOworICB9OworfQorCit2YXIgdHJhY2UgPSBkaXNhYmxlZDsKK3ZhciBkZWJ1ZyA9IGRpc2FibGVkOwordmFyIGVycm9yID0gZGlzYWJsZWQ7Cit2YXIgd2FybmluZyA9IGRpc2FibGVkOwordmFyIGluZm8gPSBkaXNhYmxlZDsKKworZXhwb3J0cy5zZXRMb2dGdW5jID0gZnVuY3Rpb24gKGZ1bmMpIHsKKyAgbG9nRnVuYyA9IGZ1bmM7Cit9OworCit2YXIgc2V0TG9nTGV2ZWwgPSBleHBvcnRzLnNldExvZ0xldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7CisgIHRyYWNlID0gZGVidWcgPSBlcnJvciA9IHdhcm5pbmcgPSBpbmZvID0gZGlzYWJsZWQ7CisgIGxvZ0xldmVsID0gbGV2ZWw7CisgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgY2FzZSAndHJhY2UnOgorICAgIHRyYWNlID0gZmFjdG9yeSgnVFJBQ0UnKTsKKyAgY2FzZSAnZGVidWcnOgorICAgIGRlYnVnID0gZmFjdG9yeSgnREVCVUcnKTsKKyAgY2FzZSAnZXJyb3InOgorICAgIGVycm9yID0gZmFjdG9yeSgnRVJST1InKTsKKyAgY2FzZSAnd2FybmluZyc6CisgICAgd2FybmluZyA9IGZhY3RvcnkoJ1dBUk4nKTsKKyAgY2FzZSAnaW5mbyc6CisgICAgaW5mbyA9IGZhY3RvcnkoJ0lORk8nKTsKKyAgfQorfTsKKworLy8gc2V0IGRlZmF1bHQKK3NldExvZ0xldmVsKGxvZ0xldmVsKTsKKworZXhwb3J0cy5nZXRMb2dMZXZlbCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGxvZ0xldmVsOworfTsKKworZXhwb3J0cy50cmFjZSA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRyYWNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmRlYnVnID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuZXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBlcnJvci5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy53YXJuaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gd2FybmluZy5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5pbmZvID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gaW5mby5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjYyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmpzCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCitleHBvcnRzLk11bHRpcGxleGVkUHJvY2Vzc29yID0gTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CisKK2Z1bmN0aW9uIE11bHRpcGxleGVkUHJvY2Vzc29yKHN0cmVhbSwgb3B0aW9ucykgeworICB0aGlzLnNlcnZpY2VzID0ge307Cit9OworCitNdWx0aXBsZXhlZFByb2Nlc3Nvci5wcm90b3R5cGUucmVnaXN0ZXJQcm9jZXNzb3IgPSBmdW5jdGlvbihuYW1lLCBoYW5kbGVyKSB7CisgIHRoaXMuc2VydmljZXNbbmFtZV0gPSBoYW5kbGVyOworfTsKKworTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHJvdG90eXBlLnByb2Nlc3MgPSBmdW5jdGlvbihpbnAsIG91dCkgeworICB2YXIgYmVnaW4gPSBpbnAucmVhZE1lc3NhZ2VCZWdpbigpOworCisgIGlmIChiZWdpbi5tdHlwZSAhPSBUaHJpZnQuTWVzc2FnZVR5cGUuQ0FMTCAmJiBiZWdpbi5tdHlwZSAhPSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlJyk7CisgIH0KKworICB2YXIgcCA9IGJlZ2luLmZuYW1lLnNwbGl0KCc6Jyk7CisgIHZhciBzbmFtZSA9IHBbMF07CisgIHZhciBmbmFtZSA9IHBbMV07CisKKyAgaWYgKCEgKHNuYW1lIGluIHRoaXMuc2VydmljZXMpKSB7CisgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCdUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6IFVua25vd24gc2VydmljZTogJyArIHNuYW1lKTsKKyAgfQorCisgIC8vY29uc3RydWN0IGEgcHJveHkgb2JqZWN0IHdoaWNoIHN0dWJzIHRoZSByZWFkTWVzc2FnZUJlZ2luCisgIC8vZm9yIHRoZSBzZXJ2aWNlCisgIHZhciBpbnBQcm94eSA9IHt9OworCisgIGZvciAodmFyIGF0dHIgaW4gaW5wKSB7CisgICAgaW5wUHJveHlbYXR0cl0gPSBpbnBbYXR0cl07CisgIH0KKworICBpbnBQcm94eS5yZWFkTWVzc2FnZUJlZ2luID0gZnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIHsKKyAgICAgIGZuYW1lOiBmbmFtZSwKKyAgICAgIG10eXBlOiBiZWdpbi5tdHlwZSwKKyAgICAgIHJzZXFpZDogYmVnaW4ucnNlcWlkCisgICAgfTsKKyAgfTsKKworICB0aGlzLnNlcnZpY2VzW3NuYW1lXS5wcm9jZXNzKGlucFByb3h5LCBvdXQpOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc4YWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwordmFyIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0Jyk7CisKK2V4cG9ydHMuTXVsdGlwbGV4ZXIgPSBNdWx0aXBsZXhlcjsKKworZnVuY3Rpb24gV3JhcHBlcihzZXJ2aWNlTmFtZSwgcHJvdG9jb2wsIGNvbm5lY3Rpb24pIHsKKworICBmdW5jdGlvbiBNdWx0aXBsZXhQcm90b2NvbCh0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKKyAgICBwcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CisgIH07CisKKyAgdXRpbC5pbmhlcml0cyhNdWx0aXBsZXhQcm90b2NvbCwgcHJvdG9jb2wpOworCisgIE11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CisgICAgaWYgKHR5cGUgPT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PSBUaHJpZnQuTWVzc2FnZVR5cGUuT05FV0FZKSB7CisgICAgICBjb25uZWN0aW9uLnNlcUlkMlNlcnZpY2Vbc2VxaWRdID0gc2VydmljZU5hbWU7CisgICAgICBNdWx0aXBsZXhQcm90b2NvbC5zdXBlcl8ucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTmFtZSArICI6IiArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE11bHRpcGxleFByb3RvY29sLnN1cGVyXy5wcm90b3R5cGUud3JpdGVNZXNzYWdlQmVnaW4uY2FsbCh0aGlzLCBuYW1lLCB0eXBlLCBzZXFpZCk7CisgICAgfQorICB9OworCisgIHJldHVybiBNdWx0aXBsZXhQcm90b2NvbDsKK307CisKK2Z1bmN0aW9uIE11bHRpcGxleGVyKCkgeworICB0aGlzLnNlcWlkID0gMDsKK307CisKK011bHRpcGxleGVyLnByb3RvdHlwZS5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbihzZXJ2aWNlTmFtZSwgU2VydmljZUNsaWVudCwgY29ubmVjdGlvbikgeworICBpZiAoU2VydmljZUNsaWVudC5DbGllbnQpIHsKKyAgICBTZXJ2aWNlQ2xpZW50ID0gU2VydmljZUNsaWVudC5DbGllbnQ7CisgIH0KKyAgdmFyIHdyaXRlQ2IgPSBmdW5jdGlvbihidWYsIHNlcWlkKSB7CisgICAgY29ubmVjdGlvbi53cml0ZShidWYsc2VxaWQpOworICB9OworICB2YXIgdHJhbnNwb3J0ID0gbmV3IGNvbm5lY3Rpb24udHJhbnNwb3J0KHVuZGVmaW5lZCwgd3JpdGVDYik7CisgIHZhciBwcm90b2NvbFdyYXBwZXIgPSBuZXcgV3JhcHBlcihzZXJ2aWNlTmFtZSwgY29ubmVjdGlvbi5wcm90b2NvbCwgY29ubmVjdGlvbik7CisgIHZhciBjbGllbnQgPSBuZXcgU2VydmljZUNsaWVudCh0cmFuc3BvcnQsIHByb3RvY29sV3JhcHBlcik7CisgIHZhciBzZWxmID0gdGhpczsKKyAgY2xpZW50Lm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeworICAgIHNlbGYuc2VxaWQgKz0gMTsKKyAgICByZXR1cm4gc2VsZi5zZXFpZDsKKyAgfTsKKworICBpZiAodHlwZW9mIGNvbm5lY3Rpb24uY2xpZW50ICE9PSAnb2JqZWN0JykgeworICAgIGNvbm5lY3Rpb24uY2xpZW50ID0ge307CisgIH0KKyAgY29ubmVjdGlvbi5jbGllbnRbc2VydmljZU5hbWVdID0gY2xpZW50OworCisgIHJldHVybiBjbGllbnQ7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3Byb3RvY29sLmpzCmluZGV4IDFiNmMzNDUuLmE3MGViZTIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvcHJvdG9jb2wuanMKQEAgLTE2LDMyMiArMTYsNyBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLXZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpLAotICAgIFRocmlmdCA9IHJlcXVpcmUoJy4vdGhyaWZ0JyksCi0gICAgVHlwZSA9IFRocmlmdC5UeXBlOwogCi12YXIgQmluYXJ5UGFyc2VyID0gcmVxdWlyZSgnLi9iaW5hcnlfcGFyc2VyJykuQmluYXJ5UGFyc2VyOwotQmluYXJ5UGFyc2VyLmJpZ0VuZGlhbiA9IHRydWU7Ci0KLXZhciBVTktOT1dOID0gMCwKLSAgICBJTlZBTElEX0RBVEEgPSAxLAotICAgIE5FR0FUSVZFX1NJWkUgPSAyLAotICAgIFNJWkVfTElNSVQgPSAzLAotICAgIEJBRF9WRVJTSU9OID0gNDsKLQotdmFyIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKLSAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTsKLSAgdGhpcy5uYW1lID0gJ1RQcm90b2NvbEV4Y2VwdGlvbic7Ci0gIHRoaXMudHlwZSA9IHR5cGU7Ci19Ci11dGlsLmluaGVyaXRzKFRQcm90b2NvbEV4Y2VwdGlvbiwgRXJyb3IpOwotCi12YXIgVEJpbmFyeVByb3RvY29sID0gZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSBmdW5jdGlvbih0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKLSAgdGhpcy50cmFucyA9IHRyYW5zOwotICB0aGlzLnN0cmljdFJlYWQgPSAoc3RyaWN0UmVhZCAhPT0gdW5kZWZpbmVkID8gc3RyaWN0UmVhZCA6IGZhbHNlKTsKLSAgdGhpcy5zdHJpY3RXcml0ZSA9IChzdHJpY3RXcml0ZSAhPT0gdW5kZWZpbmVkID8gc3RyaWN0V3JpdGUgOiB0cnVlKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFucy5mbHVzaCgpOwotfQotCi0vLyBOYXN0eUhheHguIEphdmFTY3JpcHQgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKLS8vIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKLS8vIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KLQotdmFyIFZFUlNJT05fTUFTSyA9IC02NTUzNiwgLy8gMHhmZmZmMDAwMAotICAgIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyLCAvLyAweDgwMDEwMDAwCi0gICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZjsKLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7Ci0gICAgaWYgKHRoaXMuc3RyaWN0V3JpdGUpIHsKLSAgICAgIHRoaXMud3JpdGVJMzIoVkVSU0lPTl8xIHwgdHlwZSk7Ci0gICAgICB0aGlzLndyaXRlU3RyaW5nKG5hbWUpOwotICAgICAgdGhpcy53cml0ZUkzMihzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMud3JpdGVTdHJpbmcobmFtZSk7Ci0gICAgICB0aGlzLndyaXRlQnl0ZSh0eXBlKTsKLSAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOwotICAgIH0KLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cnVjdEJlZ2luID0gZnVuY3Rpb24obmFtZSkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU3RydWN0RW5kID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVGaWVsZEJlZ2luID0gZnVuY3Rpb24obmFtZSwgdHlwZSwgaWQpIHsKLSAgdGhpcy53cml0ZUJ5dGUodHlwZSk7Ci0gIHRoaXMud3JpdGVJMTYoaWQpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlRmllbGRFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUZpZWxkU3RvcCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLndyaXRlQnl0ZShUeXBlLlNUT1ApOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWFwQmVnaW4gPSBmdW5jdGlvbihrdHlwZSwgdnR5cGUsIHNpemUpIHsKLSAgdGhpcy53cml0ZUJ5dGUoa3R5cGUpOwotICB0aGlzLndyaXRlQnl0ZSh2dHlwZSk7Ci0gIHRoaXMud3JpdGVJMzIoc2l6ZSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVNYXBFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RCZWdpbiA9IGZ1bmN0aW9uKGV0eXBlLCBzaXplKSB7Ci0gIHRoaXMud3JpdGVCeXRlKGV0eXBlKTsKLSAgdGhpcy53cml0ZUkzMihzaXplKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZUxpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVNldEJlZ2luID0gZnVuY3Rpb24oZXR5cGUsIHNpemUpIHsKLSAgY29uc29sZS5sb2coJ3dyaXRlIHNldCcsIGV0eXBlLCBzaXplKTsKLSAgdGhpcy53cml0ZUJ5dGUoZXR5cGUpOwotICB0aGlzLndyaXRlSTMyKHNpemUpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlU2V0RW5kID0gZnVuY3Rpb24oKSB7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCb29sID0gZnVuY3Rpb24oYm9vbCkgewotICBpZiAoYm9vbCkgewotICAgIHRoaXMud3JpdGVCeXRlKDEpOwotICB9IGVsc2UgewotICAgIHRoaXMud3JpdGVCeXRlKDApOwotICB9Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVCeXRlID0gZnVuY3Rpb24oYnl0ZSkgewotICB0aGlzLnRyYW5zLndyaXRlKEJpbmFyeVBhcnNlci5mcm9tQnl0ZShieXRlKSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJMTYgPSBmdW5jdGlvbihpMTYpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbVNob3J0KGkxNikpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLndyaXRlSTMyID0gZnVuY3Rpb24oaTMyKSB7Ci0gIHRoaXMudHJhbnMud3JpdGUoQmluYXJ5UGFyc2VyLmZyb21JbnQoaTMyKSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVJNjQgPSBmdW5jdGlvbihpNjQpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbUxvbmcoaTY0KSk7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbihkdWIpIHsKLSAgdGhpcy50cmFucy53cml0ZShCaW5hcnlQYXJzZXIuZnJvbURvdWJsZShkdWIpKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZVN0cmluZyA9IGZ1bmN0aW9uKHN0cikgewotICB0aGlzLndyaXRlSTMyKHN0ci5sZW5ndGgpOwotICB0aGlzLnRyYW5zLndyaXRlKHN0cik7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIgc3ogPSB0aGlzLnJlYWRJMzIoKTsKLSAgdmFyIHR5cGUsIG5hbWUsIHNlcWlkOwotCi0gIGlmIChzeiA8IDApIHsKLSAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgY29uc29sZS5sb2coIkJBRDogIiArIHZlcnNpb24pOwotICAgICAgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uKEJBRF9WRVJTSU9OLCAiQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogIiArIHN6KTsKLSAgICB9Ci0gICAgdHlwZSA9IHN6ICYgVFlQRV9NQVNLOwotICAgIG5hbWUgPSB0aGlzLnJlYWRTdHJpbmcoKTsKLSAgICBzZXFpZCA9IHRoaXMucmVhZEkzMigpOwotICB9IGVsc2UgewotICAgIGlmICh0aGlzLnN0cmljdFJlYWQpIHsKLSAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihCQURfVkVSU0lPTiwgIk5vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyIik7Ci0gICAgfQotICAgIG5hbWUgPSB0aGlzLnRyYW5zLnJlYWQoc3opOwotICAgIHR5cGUgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gICAgc2VxaWQgPSB0aGlzLnJlYWRJMzIoKTsKLSAgfQotICByZXR1cm4ge2ZuYW1lOiBuYW1lLCBtdHlwZTogdHlwZSwgcnNlcWlkOiBzZXFpZH07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU3RydWN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHtmbmFtZTogJyd9Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFN0cnVjdEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEJlZ2luID0gZnVuY3Rpb24oKSB7Ci0gIHZhciB0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAodHlwZSA9PSBUeXBlLlNUT1ApIHsKLSAgICByZXR1cm4ge2ZuYW1lOiBudWxsLCBmdHlwZTogdHlwZSwgZmlkOiAwfTsKLSAgfQotICB2YXIgaWQgPSB0aGlzLnJlYWRJMTYoKTsKLSAgcmV0dXJuIHtmbmFtZTogbnVsbCwgZnR5cGU6IHR5cGUsIGZpZDogaWR9OwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRGaWVsZEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRNYXBCZWdpbiA9IGZ1bmN0aW9uKCkgewotICB2YXIga3R5cGUgPSB0aGlzLnJlYWRCeXRlKCk7Ci0gIHZhciB2dHlwZSA9IHRoaXMucmVhZEJ5dGUoKTsKLSAgdmFyIHNpemUgPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHtrdHlwZToga3R5cGUsIHZ0eXBlOiB2dHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZE1hcEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRMaXN0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZExpc3RFbmQgPSBmdW5jdGlvbigpIHsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkU2V0QmVnaW4gPSBmdW5jdGlvbigpIHsKLSAgdmFyIGV0eXBlID0gdGhpcy5yZWFkQnl0ZSgpOwotICB2YXIgc2l6ZSA9IHRoaXMucmVhZEkzMigpOwotICByZXR1cm4ge2V0eXBlOiBldHlwZSwgc2l6ZTogc2l6ZX07Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZFNldEVuZCA9IGZ1bmN0aW9uKCkgewotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBieXRlID0gdGhpcy5yZWFkQnl0ZSgpOwotICBpZiAoYnl0ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRCeXRlID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDEpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvQnl0ZShidWZmKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkSTE2ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBidWZmID0gdGhpcy50cmFucy5yZWFkKDIpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvU2hvcnQoYnVmZik7Ci19Ci0KLVRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUucmVhZEkzMiA9IGZ1bmN0aW9uKCkgewotICB2YXIgYnVmZiA9IHRoaXMudHJhbnMucmVhZCg0KTsKLSAgLy8gY29uc29sZS5sb2coInJlYWQgYnVmOiAiKTsKLSAgLy8gY29uc29sZS5sb2coYnVmZik7Ci0gIC8vIGNvbnNvbGUubG9nKCJyZXN1bHQ6ICIgKyBCaW5hcnlQYXJzZXIudG9JbnQoYnVmZikpOwotICByZXR1cm4gQmluYXJ5UGFyc2VyLnRvSW50KGJ1ZmYpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRJNjQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBCaW5hcnlQYXJzZXIudG9Mb25nKGJ1ZmYpOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWREb3VibGUgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmYgPSB0aGlzLnRyYW5zLnJlYWQoOCk7Ci0gIHJldHVybiBCaW5hcnlQYXJzZXIudG9GbG9hdChidWZmKTsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5yZWFkQmluYXJ5ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBsZW4gPSB0aGlzLnJlYWRJMzIoKTsKLSAgcmV0dXJuIHRoaXMudHJhbnMucmVhZChsZW4pOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgdmFyIHIgPSB0aGlzLnJlYWRCaW5hcnkoKS50b1N0cmluZygnYmluYXJ5Jyk7Ci0gIC8vIGNvbnNvbGUubG9nKCJyZWFkU3RyaW5nOiAiICsgcik7Ci0gIHJldHVybiByOwotfQotCi1UQmluYXJ5UHJvdG9jb2wucHJvdG90eXBlLmdldFRyYW5zcG9ydCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy50cmFuczsKLX0KLQotVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS5za2lwID0gZnVuY3Rpb24odHlwZSkgewotICAvLyBjb25zb2xlLmxvZygic2tpcDogIiArIHR5cGUpOwotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFR5cGUuU1RPUDoKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFR5cGUuQk9PTDoKLSAgICAgIHRoaXMucmVhZEJvb2woKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5CWVRFOgotICAgICAgdGhpcy5yZWFkQnl0ZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkkxNjoKLSAgICAgIHRoaXMucmVhZEkxNigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkkzMjoKLSAgICAgIHRoaXMucmVhZEkzMigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkk2NDoKLSAgICAgIHRoaXMucmVhZEk2NCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkRPVUJMRToKLSAgICAgIHRoaXMucmVhZERvdWJsZSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLlNUUklORzoKLSAgICAgIHRoaXMucmVhZFN0cmluZygpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLlNUUlVDVDoKLSAgICAgIHRoaXMucmVhZFN0cnVjdEJlZ2luKCk7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICB2YXIgciA9IHRoaXMucmVhZEZpZWxkQmVnaW4oKTsKLSAgICAgICAgaWYgKHIuZnR5cGUgPT09IFR5cGUuU1RPUCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2tpcChyLmZ0eXBlKTsKLSAgICAgICAgdGhpcy5yZWFkRmllbGRFbmQoKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFN0cnVjdEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLk1BUDoKLSAgICAgIHZhciByID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgci5zaXplOyArK2kpIHsKLSAgICAgICAgdGhpcy5za2lwKHIua3R5cGUpOwotICAgICAgICB0aGlzLnNraXAoci52dHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVHlwZS5TRVQ6Ci0gICAgICB2YXIgciA9IHRoaXMucmVhZFNldEJlZ2luKCk7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHIuc2l6ZTsgKytpKSB7Ci0gICAgICAgIHRoaXMuc2tpcChyLmV0eXBlKTsKLSAgICAgIH0KLSAgICAgIHRoaXMucmVhZFNldEVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUeXBlLkxJU1Q6Ci0gICAgICB2YXIgciA9IHRoaXMucmVhZExpc3RCZWdpbigpOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByLnNpemU7ICsraSkgewotICAgICAgICB0aGlzLnNraXAoci5ldHlwZSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgRXJyb3IoIkludmFsaWQgdHlwZTogIiArIHR5cGUpOwotICB9Ci19Cittb2R1bGUuZXhwb3J0cy5UQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVENvbXBhY3RQcm90b2NvbCA9IHJlcXVpcmUoJy4vY29tcGFjdF9wcm90b2NvbCcpOworbW9kdWxlLmV4cG9ydHMuVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKaW5kZXggYWJkZjU3OS4uZTEyNGFjYyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCkBAIC0xNiwzNyArMTYsNjkgQEAKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCisKK3ZhciBjb25zdGFudHMgPSByZXF1aXJlKCdjb25zdGFudHMnKTsKIHZhciBuZXQgPSByZXF1aXJlKCduZXQnKTsKK3ZhciB0bHMgPSByZXF1aXJlKCd0bHMnKTsKIAotdmFyIHR0cmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpOwotdmFyIEJpbmFyeVBhcnNlciA9IHJlcXVpcmUoJy4vYmluYXJ5X3BhcnNlcicpLkJpbmFyeVBhcnNlciwKLSAgICBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL3Byb3RvY29sJykuVEJpbmFyeVByb3RvY29sOwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEJpbmFyeVByb3RvY29sID0gcmVxdWlyZSgnLi9iaW5hcnlfcHJvdG9jb2wnKTsKK3ZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOwogCi1leHBvcnRzLmNyZWF0ZVNlcnZlciA9IGZ1bmN0aW9uKGNscywgaGFuZGxlciwgb3B0aW9ucykgewotICBpZiAoY2xzLlByb2Nlc3NvcikgewotICAgIGNscyA9IGNscy5Qcm9jZXNzb3I7Ci0gIH0KLSAgdmFyIHByb2Nlc3NvciA9IG5ldyBjbHMoaGFuZGxlcik7Ci0gIHZhciB0cmFuc3BvcnQgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zcG9ydCkgPyBvcHRpb25zLnRyYW5zcG9ydCA6IHR0cmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydDsKKy8qKgorICogQ3JlYXRlIGEgVGhyaWZ0IHNlcnZlciB3aGljaCBjYW4gc2VydmUgb25lIG9yIG11bHRpcGxlIHNlcnZpY2VzLgorICogQHBhcmFtIHtvYmplY3R9IHByb2Nlc3NvciAtIEEgbm9ybWFsIG9yIG11bHRpcGxleGVkUHJvY2Vzc29yIChtdXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgcHJlY29uc3RydWN0ZWQgd2l0aCB0aGUgZGVzaXJlZCBoYW5kbGVyKS4KKyAqIEBwYXJhbSB7U2VydmVyT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgc2VydmVyIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJucyB7b2JqZWN0fSAtIFRoZSBBcGFjaGUgVGhyaWZ0IE11bHRpcGxleCBTZXJ2ZXIuCisgKi8KK2V4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyID0gZnVuY3Rpb24ocHJvY2Vzc29yLCBvcHRpb25zKSB7CisgIHZhciB0cmFuc3BvcnQgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zcG9ydCkgPyBvcHRpb25zLnRyYW5zcG9ydCA6IFRCdWZmZXJlZFRyYW5zcG9ydDsKICAgdmFyIHByb3RvY29sID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5wcm90b2NvbCkgPyBvcHRpb25zLnByb3RvY29sIDogVEJpbmFyeVByb3RvY29sOwogCi0gIHJldHVybiBuZXQuY3JlYXRlU2VydmVyKGZ1bmN0aW9uKHN0cmVhbSkgewotICAgIHN0cmVhbS5vbignZGF0YScsIHRyYW5zcG9ydC5yZWNlaXZlcihmdW5jdGlvbih0cmFuc3BvcnRfd2l0aF9kYXRhKSB7Ci0gICAgICB2YXIgaW5wdXQgPSBuZXcgcHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIGZ1bmN0aW9uIHNlcnZlckltcGwoc3RyZWFtKSB7CisgICAgdmFyIHNlbGYgPSB0aGlzOworICAgIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgfSk7CisgICAgc3RyZWFtLm9uKCdkYXRhJywgdHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgcHJvdG9jb2wodHJhbnNwb3J0V2l0aERhdGEpOwogICAgICAgdmFyIG91dHB1dCA9IG5ldyBwcm90b2NvbChuZXcgdHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7Ci0gICAgICAgIHN0cmVhbS53cml0ZShidWYpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKGJ1Zik7CisgICAgICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgICAgICAgICBzdHJlYW0uZW5kKCk7CisgICAgICAgIH0KICAgICAgIH0pKTsKIAogICAgICAgdHJ5IHsKLSAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXQsIG91dHB1dCk7Ci0gICAgICAgIHRyYW5zcG9ydF93aXRoX2RhdGEuY29tbWl0UG9zaXRpb24oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChlKSB7Ci0gICAgICAgIGlmIChlIGluc3RhbmNlb2YgdHRyYW5zcG9ydC5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKLSAgICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICAgICAgZG8geworICAgICAgICAgIHByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIH0gd2hpbGUgKHRydWUpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICAvL1RoZSBsYXN0IGRhdGEgaW4gdGhlIGJ1ZmZlciB3YXMgbm90IGEgY29tcGxldGUgbWVzc2FnZSwgd2FpdCBmb3IgdGhlIHJlc3QKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXJyLm1lc3NhZ2UgPT09ICJJbnZhbGlkIHR5cGU6IHVuZGVmaW5lZCIpIHsKKyAgICAgICAgICAvL05vIG1vcmUgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgLy9UaGlzIHRyYXAgaXMgYSBiaXQgaGFja2lzaAorICAgICAgICAgIC8vVGhlIG5leHQgc3RlcCB0byBpbXByb3ZlIHRoZSBub2RlIGJlaGF2aW9yIGhlcmUgaXMgdG8gaGF2ZQorICAgICAgICAgIC8vICB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIHByb2Nlc3MgbWV0aG9kIHRocm93IGEgbW9yZSBleHBsaWNpdAorICAgICAgICAgIC8vICBlcnJvciB3aGVuIHRoZSBuZXR3b3JrIGJ1ZmZlciBpcyBlbXB0eSAocmVnYXJkbGVzIG9mIHRoZQorICAgICAgICAgIC8vICBwcm90b2NvbC90cmFuc3BvcnQgc3RhY2sgaW4gdXNlKSBhbmQgcmVwbGFjZSB0aGlzIGhldXJpc3RpYy4KKyAgICAgICAgICAvLyAgQWxzbyB0cmFuc3BvcnRzIHNob3VsZCBwcm9iYWJseSBub3QgZm9yY2UgdXBwZXIgbGF5ZXJzIHRvCisgICAgICAgICAgLy8gIG1hbmFnZSB0aGVpciBidWZmZXIgcG9zaXRpb25zIChpLmUuIHJvbGxiYWNrUG9zaXRpb24oKSBhbmQKKyAgICAgICAgICAvLyAgY29tbWl0UG9zaXRpb24oKSBzaG91bGQgYmUgZWxpbWluYXRlZCBpbiBsaWV1IG9mIGEgdHJhbnNwb3J0CisgICAgICAgICAgLy8gIGVuY2Fwc3VsYXRlZCBidWZmZXIgbWFuYWdlbWVudCBzdHJhdGVneS4pCisgICAgICAgICAgdHJhbnNwb3J0V2l0aERhdGEucm9sbGJhY2tQb3NpdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgLy9VbmV4cGVjdGVkIGVycm9yCisgICAgICAgICAgc2VsZi5lbWl0KCdlcnJvcicsIGVycik7CisgICAgICAgICAgc3RyZWFtLmVuZCgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfSkpOwpAQCAtNTQsNSArODYsMjggQEAKICAgICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uKCkgewogICAgICAgc3RyZWFtLmVuZCgpOwogICAgIH0pOwotICB9KTsKKyAgfQorCisgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudGxzKSB7CisgICAgaWYgKCEoJ3NlY3VyZVByb3RvY29sJyBpbiBvcHRpb25zLnRscykgJiYgISgnc2VjdXJlT3B0aW9ucycgaW4gb3B0aW9ucy50bHMpKSB7CisgICAgICBvcHRpb25zLnRscy5zZWN1cmVQcm90b2NvbCA9ICJTU0x2MjNfbWV0aG9kIjsKKyAgICAgIG9wdGlvbnMudGxzLnNlY3VyZU9wdGlvbnMgPSBjb25zdGFudHMuU1NMX09QX05PX1NTTHYyIHwgY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MzsKKyAgICB9CisgICAgcmV0dXJuIHRscy5jcmVhdGVTZXJ2ZXIob3B0aW9ucy50bHMsIHNlcnZlckltcGwpOworICB9IGVsc2UgeworICAgIHJldHVybiBuZXQuY3JlYXRlU2VydmVyKHNlcnZlckltcGwpOworICB9Cit9OworCisvKioKKyAqIENyZWF0ZSBhIHNpbmdsZSBzZXJ2aWNlIEFwYWNoZSBUaHJpZnQgc2VydmVyLgorICogQHBhcmFtIHtvYmplY3R9IHByb2Nlc3NvciAtIEEgc2VydmljZSBjbGFzcyBvciBwcm9jZXNzb3IgZnVuY3Rpb24uCisgKiBAcGFyYW0ge1NlcnZlck9wdGlvbnN9IG9wdGlvbnMgLSBPcHRpb25hbCBhZGRpdGlvbmFsIHNlcnZlciBjb25maWd1cmF0aW9uLgorICogQHJldHVybnMge29iamVjdH0gLSBUaGUgQXBhY2hlIFRocmlmdCBNdWx0aXBsZXggU2VydmVyLgorICovCitleHBvcnRzLmNyZWF0ZVNlcnZlciA9IGZ1bmN0aW9uKHByb2Nlc3NvciwgaGFuZGxlciwgb3B0aW9ucykgeworICBpZiAocHJvY2Vzc29yLlByb2Nlc3NvcikgeworICAgIHByb2Nlc3NvciA9IHByb2Nlc3Nvci5Qcm9jZXNzb3I7CisgIH0KKyAgcmV0dXJuIGV4cG9ydHMuY3JlYXRlTXVsdGlwbGV4U2VydmVyKG5ldyBwcm9jZXNzb3IoaGFuZGxlciksIG9wdGlvbnMpOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdGhyaWZ0LmpzCmluZGV4IDZjNTAwYTUuLmYyYjI4OTYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90aHJpZnQuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RocmlmdC5qcwpAQCAtMzUsMjAgKzM1LDI0IEBACiAgIFNFVDogMTQsCiAgIExJU1Q6IDE1LAogICBVVEY4OiAxNiwKLSAgVVRGMTY6IDE3LAotfQorICBVVEYxNjogMTcKK307CiAKIGV4cG9ydHMuTWVzc2FnZVR5cGUgPSB7CiAgIENBTEw6IDEsCiAgIFJFUExZOiAyLAogICBFWENFUFRJT046IDMsCi0gIE9ORVdBWTogNCwKLX0KKyAgT05FV0FZOiA0Cit9OwogCi12YXIgVEV4Y2VwdGlvbiA9IGV4cG9ydHMuVEV4Y2VwdGlvbiA9IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKLSAgRXJyb3IuY2FsbCh0aGlzLCBtZXNzYWdlKTsKLSAgdGhpcy5uYW1lID0gJ1RFeGNlcHRpb24nOwotfQorZXhwb3J0cy5URXhjZXB0aW9uID0gVEV4Y2VwdGlvbjsKKworZnVuY3Rpb24gVEV4Y2VwdGlvbihtZXNzYWdlKSB7CisgIEVycm9yLmNhbGwodGhpcyk7CisgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpOworICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7CisgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Cit9OwogdXRpbC5pbmhlcml0cyhURXhjZXB0aW9uLCBFcnJvcik7CiAKIHZhciBUQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gZXhwb3J0cy5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gewpAQCAtNTksODIgKzYzLDE3MCBAQAogICBCQURfU0VRVUVOQ0VfSUQ6IDQsCiAgIE1JU1NJTkdfUkVTVUxUOiA1LAogICBJTlRFUk5BTF9FUlJPUjogNiwKLSAgUFJPVE9DT0xfRVJST1I6IDcKLX0KKyAgUFJPVE9DT0xfRVJST1I6IDcsCisgIElOVkFMSURfVFJBTlNGT1JNOiA4LAorICBJTlZBTElEX1BST1RPQ09MOiA5LAorICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRTogMTAKK307CiAKLXZhciBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBleHBvcnRzLlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGZ1bmN0aW9uKHR5cGUsIG1lc3NhZ2UpIHsKLSAgVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIG1lc3NhZ2UpOworZXhwb3J0cy5UQXBwbGljYXRpb25FeGNlcHRpb24gPSBUQXBwbGljYXRpb25FeGNlcHRpb247CisKK2Z1bmN0aW9uIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlLCBtZXNzYWdlKSB7CisgIFRFeGNlcHRpb24uY2FsbCh0aGlzKTsKKyAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7CiAgIHRoaXMudHlwZSA9IHR5cGUgfHwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOOwotICB0aGlzLm5hbWUgPSAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJzsKLX0KKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKIHV0aWwuaW5oZXJpdHMoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBURXhjZXB0aW9uKTsKIAogVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnByb3RvdHlwZS5yZWFkID0gZnVuY3Rpb24oaW5wdXQpIHsKLSAgdmFyIGZ0eXBlCi0gIHZhciBmaWQKLSAgdmFyIHJldCA9IGlucHV0LnJlYWRTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKKyAgdmFyIGZ0eXBlOworICB2YXIgcmV0ID0gaW5wdXQucmVhZFN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKIAogICB3aGlsZSgxKXsKLQotICAgICAgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKQotCisgICAgICByZXQgPSBpbnB1dC5yZWFkRmllbGRCZWdpbigpOwogICAgICAgaWYocmV0LmZ0eXBlID09IFR5cGUuU1RPUCkKLSAgICAgICAgICBicmVhaworICAgICAgICAgIGJyZWFrOwogCi0gICAgICB2YXIgZmlkID0gcmV0LmZpZAotCi0gICAgICBzd2l0Y2goZmlkKXsKKyAgICAgIHN3aXRjaChyZXQuZmlkKXsKICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgIGlmKCByZXQuZnR5cGUgPT0gVHlwZS5TVFJJTkcgKXsKLSAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRTdHJpbmcoKQotICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gcmV0CisgICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSByZXQ7CiAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSkKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgaWYoIHJldC5mdHlwZSA9PSBUeXBlLkkzMiApewotICAgICAgICAgICAgICAgICAgcmV0ID0gaW5wdXQucmVhZEkzMigpCi0gICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSByZXQKKyAgICAgICAgICAgICAgICAgIHJldCA9IGlucHV0LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHJldDsKICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHJldCAgID0gaW5wdXQuc2tpcChyZXQuZnR5cGUpCisgICAgICAgICAgICAgICAgICByZXQgICA9IGlucHV0LnNraXAocmV0LmZ0eXBlKTsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhawotCisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHJldCA9IGlucHV0LnNraXAocmV0LmZ0eXBlKQotICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICByZXQgPSBpbnB1dC5za2lwKHJldC5mdHlwZSk7CisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgaW5wdXQucmVhZEZpZWxkRW5kKCkKKyAgICAgIGlucHV0LnJlYWRGaWVsZEVuZCgpOwogICB9Ci0KLSAgaW5wdXQucmVhZFN0cnVjdEVuZCgpCi19CisgIGlucHV0LnJlYWRTdHJ1Y3RFbmQoKTsKK307CiAKIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpewogICBvdXRwdXQud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CiAKICAgaWYgKHRoaXMubWVzc2FnZSkgewotICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbignbWVzc2FnZScsIFR5cGUuU1RSSU5HLCAxKQotICAgICAgb3V0cHV0LndyaXRlU3RyaW5nKHRoaXMubWVzc2FnZSkKLSAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCkKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUeXBlLlNUUklORywgMSk7CisgICAgICBvdXRwdXQud3JpdGVTdHJpbmcodGhpcy5tZXNzYWdlKTsKKyAgICAgIG91dHB1dC53cml0ZUZpZWxkRW5kKCk7CiAgIH0KIAogICBpZiAodGhpcy5jb2RlKSB7Ci0gICAgICBvdXRwdXQud3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVHlwZS5JMzIsIDIpCi0gICAgICBvdXRwdXQud3JpdGVJMzIodGhpcy5jb2RlKQotICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKQorICAgICAgb3V0cHV0LndyaXRlRmllbGRCZWdpbigndHlwZScsIFR5cGUuSTMyLCAyKTsKKyAgICAgIG91dHB1dC53cml0ZUkzMih0aGlzLmNvZGUpOworICAgICAgb3V0cHV0LndyaXRlRmllbGRFbmQoKTsKICAgfQogCi0gIG91dHB1dC53cml0ZUZpZWxkU3RvcCgpCi0gIG91dHB1dC53cml0ZVN0cnVjdEVuZCgpCi19CisgIG91dHB1dC53cml0ZUZpZWxkU3RvcCgpOworICBvdXRwdXQud3JpdGVTdHJ1Y3RFbmQoKTsKK307CisKK3ZhciBUUHJvdG9jb2xFeGNlcHRpb25UeXBlID0gZXhwb3J0cy5UUHJvdG9jb2xFeGNlcHRpb25UeXBlID0geworICBVTktOT1dOOiAwLAorICBJTlZBTElEX0RBVEE6IDEsCisgIE5FR0FUSVZFX1NJWkU6IDIsCisgIFNJWkVfTElNSVQ6IDMsCisgIEJBRF9WRVJTSU9OOiA0LAorICBOT1RfSU1QTEVNRU5URUQ6IDUsCisgIERFUFRIX0xJTUlUOiA2Cit9OworCisKK2V4cG9ydHMuVFByb3RvY29sRXhjZXB0aW9uID0gVFByb3RvY29sRXhjZXB0aW9uOworCitmdW5jdGlvbiBUUHJvdG9jb2xFeGNlcHRpb24odHlwZSwgbWVzc2FnZSkgeworICBFcnJvci5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLnR5cGUgPSB0eXBlOworICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworfTsKK3V0aWwuaW5oZXJpdHMoVFByb3RvY29sRXhjZXB0aW9uLCBFcnJvcik7CiAKIGV4cG9ydHMub2JqZWN0TGVuZ3RoID0gZnVuY3Rpb24ob2JqKSB7CiAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aDsKLX0KK307CiAKIGV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbihjb25zdHJ1Y3Rvciwgc3VwZXJDb25zdHJ1Y3RvcikgewogICB1dGlsLmluaGVyaXRzKGNvbnN0cnVjdG9yLCBzdXBlckNvbnN0cnVjdG9yKTsKLX0KK307CisKK3ZhciBjb3B5TGlzdCwgY29weU1hcDsKKworY29weUxpc3QgPSBmdW5jdGlvbihsc3QsIHR5cGVzKSB7CisKKyAgaWYgKCFsc3QpIHtyZXR1cm4gbHN0OyB9CisKKyAgdmFyIHR5cGU7CisKKyAgaWYgKHR5cGVzLnNoaWZ0ID09PSB1bmRlZmluZWQpIHsKKyAgICB0eXBlID0gdHlwZXM7CisgIH0KKyAgZWxzZSB7CisgICAgdHlwZSA9IHR5cGVzWzBdOworICB9CisgIHZhciBUeXBlID0gdHlwZTsKKworICB2YXIgbGVuID0gbHN0Lmxlbmd0aCwgcmVzdWx0ID0gW10sIGksIHZhbDsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgdmFsID0gbHN0W2ldOworICAgIGlmICh0eXBlID09PSBudWxsKSB7CisgICAgICByZXN1bHQucHVzaCh2YWwpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICByZXN1bHQucHVzaCh0eXBlKHZhbCwgdHlwZXMuc2xpY2UoMSkpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICByZXN1bHQucHVzaChuZXcgVHlwZSh2YWwpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK2NvcHlNYXAgPSBmdW5jdGlvbihvYmosIHR5cGVzKXsKKworICBpZiAoIW9iaikge3JldHVybiBvYmo7IH0KKworICB2YXIgdHlwZTsKKworICBpZiAodHlwZXMuc2hpZnQgPT09IHVuZGVmaW5lZCkgeworICAgIHR5cGUgPSB0eXBlczsKKyAgfQorICBlbHNlIHsKKyAgICB0eXBlID0gdHlwZXNbMF07CisgIH0KKyAgdmFyIFR5cGUgPSB0eXBlOworCisgIHZhciByZXN1bHQgPSB7fSwgdmFsOworICBmb3IodmFyIHByb3AgaW4gb2JqKSB7CisgICAgaWYob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgICAgICB2YWwgPSBvYmpbcHJvcF07CisgICAgICBpZiAodHlwZSA9PT0gbnVsbCkgeworICAgICAgICByZXN1bHRbcHJvcF0gPSB2YWw7CisgICAgICB9CisgICAgICBlbHNlIGlmICh0eXBlID09PSBjb3B5TWFwIHx8IHR5cGUgPT09IGNvcHlMaXN0KSB7CisgICAgICAgIHJlc3VsdFtwcm9wXSA9IHR5cGUodmFsLCB0eXBlcy5zbGljZSgxKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0W3Byb3BdID0gbmV3IFR5cGUodmFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK307CisKK21vZHVsZS5leHBvcnRzLmNvcHlNYXAgPSBjb3B5TWFwOworbW9kdWxlLmV4cG9ydHMuY29weUxpc3QgPSBjb3B5TGlzdDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvdHJhbnNwb3J0LmpzCmluZGV4IDA2MzUxYTQuLjU5ZGFhOTggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC90cmFuc3BvcnQuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3RyYW5zcG9ydC5qcwpAQCAtMTYsMjI1ICsxNiw3IEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotdmFyIEJpbmFyeVBhcnNlciA9IHJlcXVpcmUoJy4vYmluYXJ5X3BhcnNlcicpLkJpbmFyeVBhcnNlcjsKIAotdmFyIGVtcHR5QnVmID0gbmV3IEJ1ZmZlcigwKTsKLQotdmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IGV4cG9ydHMuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gZnVuY3Rpb24oKSB7Ci19OwotCi12YXIgVEZyYW1lZFRyYW5zcG9ydCA9IGV4cG9ydHMuVEZyYW1lZFRyYW5zcG9ydCA9IGZ1bmN0aW9uKGJ1ZmZlciwgY2FsbGJhY2spIHsKLSAgdGhpcy5pbkJ1ZiA9IGJ1ZmZlciB8fCBlbXB0eUJ1ZjsKLSAgdGhpcy5vdXRCdWZmZXJzID0gW107Ci0gIHRoaXMub3V0Q291bnQgPSAwOwotICB0aGlzLnJlYWRQb3MgPSAwOwotICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKLX07Ci1URnJhbWVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKLSAgdmFyIGZyYW1lTGVmdCA9IDAsCi0gICAgICBmcmFtZVBvcyA9IDAsCi0gICAgICBmcmFtZSA9IG51bGw7Ci0gIHZhciByZXNpZHVhbCA9IG51bGw7Ci0KLSAgcmV0dXJuIGZ1bmN0aW9uKGRhdGEpIHsKLSAgICAvLyBQcmVwZW5kIGFueSByZXNpZHVhbCBkYXRhIGZyb20gb3VyIHByZXZpb3VzIHJlYWQKLSAgICBpZiAocmVzaWR1YWwpIHsKLSAgICAgIHZhciBkYXQgPSBuZXcgQnVmZmVyKGRhdGEubGVuZ3RoICsgcmVzaWR1YWwubGVuZ3RoKTsKLSAgICAgIHJlc2lkdWFsLmNvcHkoZGF0LCAwLCAwKTsKLSAgICAgIGRhdGEuY29weShkYXQsIHJlc2lkdWFsLmxlbmd0aCwgMCk7Ci0gICAgICByZXNpZHVhbCA9IG51bGw7Ci0gICAgfQotCi0gICAgLy8gZnJhbWVkIHRyYW5zcG9ydAotICAgIHdoaWxlIChkYXRhLmxlbmd0aCkgewotICAgICAgaWYgKGZyYW1lTGVmdCA9PT0gMCkgewotICAgICAgICAvLyBUT0RPIGFzc3VtZXMgd2UgaGF2ZSBhbGwgNCBieXRlcwotICAgICAgICBpZiAoZGF0YS5sZW5ndGggPCA0KSB7Ci0gICAgICAgICAgY29uc29sZS5sb2coIkV4cGVjdGluZyA+IDQgYnl0ZXMsIGZvdW5kIG9ubHkgIiArIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgICByZXNpZHVhbCA9IGRhdGE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgLy90aHJvdyBFcnJvcigiRXhwZWN0aW5nID4gNCBieXRlcywgZm91bmQgb25seSAiICsgZGF0YS5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lTGVmdCA9IEJpbmFyeVBhcnNlci50b0ludChkYXRhLnNsaWNlKDAsNCkpOwotICAgICAgICBmcmFtZSA9IG5ldyBCdWZmZXIoZnJhbWVMZWZ0KTsKLSAgICAgICAgZnJhbWVQb3MgPSAwOwotICAgICAgICBkYXRhID0gZGF0YS5zbGljZSg0LCBkYXRhLmxlbmd0aCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChkYXRhLmxlbmd0aCA+PSBmcmFtZUxlZnQpIHsKLSAgICAgICAgZGF0YS5jb3B5KGZyYW1lLCBmcmFtZVBvcywgMCwgZnJhbWVMZWZ0KTsKLSAgICAgICAgZGF0YSA9IGRhdGEuc2xpY2UoZnJhbWVMZWZ0LCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIAotICAgICAgICBmcmFtZUxlZnQgPSAwOwotICAgICAgICBjYWxsYmFjayhuZXcgVEZyYW1lZFRyYW5zcG9ydChmcmFtZSkpOwotICAgICAgfSBlbHNlIGlmIChkYXRhLmxlbmd0aCkgewotICAgICAgICBkYXRhLmNvcHkoZnJhbWUsIGZyYW1lUG9zLCAwLCBkYXRhLmxlbmd0aCk7Ci0gICAgICAgIGZyYW1lTGVmdCAtPSBkYXRhLmxlbmd0aDsKLSAgICAgICAgZnJhbWVQb3MgKz0gZGF0YS5sZW5ndGg7Ci0gICAgICAgIGRhdGEgPSBkYXRhLnNsaWNlKGRhdGEubGVuZ3RoLCBkYXRhLmxlbmd0aCk7Ci0gICAgICB9Ci0gICAgfQotICB9OwotfTsKLQotVEZyYW1lZFRyYW5zcG9ydC5wcm90b3R5cGUgPSB7Ci0gIGNvbW1pdFBvc2l0aW9uOiBmdW5jdGlvbigpe30sCi0gIHJvbGxiYWNrUG9zaXRpb246IGZ1bmN0aW9uKCl7fSwKLQotICAvLyBUT0RPOiBJbXBsZW1lbnQgb3Blbi9jbG9zZSBzdXBwb3J0Ci0gIGlzT3BlbjogZnVuY3Rpb24oKSB7cmV0dXJuIHRydWU7fSwKLSAgb3BlbjogZnVuY3Rpb24oKSB7fSwKLSAgY2xvc2U6IGZ1bmN0aW9uKCkge30sCi0KLSAgcmVhZDogZnVuY3Rpb24obGVuKSB7IC8vIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGZvciBlYWNoIGZyYW1lcy4KLSAgICB2YXIgZW5kID0gdGhpcy5yZWFkUG9zICsgbGVuOwotCi0gICAgaWYgKHRoaXMuaW5CdWYubGVuZ3RoIDwgZW5kKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlYWQoJyArIGxlbiArICcpIGZhaWxlZCAtIG5vdCBlbm91Z2ggZGF0YScpOwotICAgIH0KLQotICAgIHZhciBidWYgPSB0aGlzLmluQnVmLnNsaWNlKHRoaXMucmVhZFBvcywgZW5kKTsKLSAgICB0aGlzLnJlYWRQb3MgPSBlbmQ7Ci0gICAgcmV0dXJuIGJ1ZjsKLSAgfSwKLQotICByZWFkQWxsOiBmdW5jdGlvbigpIHsKLSAgICByZXR1cm4gdGhpcy5pbkJ1ZjsKLSAgfSwKLQotICB3cml0ZTogZnVuY3Rpb24oYnVmLCBlbmNvZGluZykgewotICAgIGlmICh0eXBlb2YoYnVmKSA9PT0gInN0cmluZyIpIHsKLSAgICAgIC8vIERlZmF1bHRpbmcgdG8gYXNjaWkgZW5jb2RpbmcgaGVyZSBzaW5jZSB0aGF0J3MgbW9yZSBsaWtlIHRoZSBvcmlnaW5hbAotICAgICAgLy8gY29kZSwgYnV0IEkgZmVlbCBsaWtlICd1dGY4JyB3b3VsZCBiZSBhIGJldHRlciBjaG9pY2UuCi0gICAgICBidWYgPSBuZXcgQnVmZmVyKGJ1ZiwgZW5jb2RpbmcgfHwgJ2FzY2lpJyk7Ci0gICAgfQotICAgIHRoaXMub3V0QnVmZmVycy5wdXNoKGJ1Zik7Ci0gICAgdGhpcy5vdXRDb3VudCArPSBidWYubGVuZ3RoOwotICB9LAotCi0gIGZsdXNoOiBmdW5jdGlvbigpIHsKLSAgICB2YXIgb3V0ID0gbmV3IEJ1ZmZlcih0aGlzLm91dENvdW50KSwKLSAgICAgICAgcG9zID0gMDsKLSAgICB0aGlzLm91dEJ1ZmZlcnMuZm9yRWFjaChmdW5jdGlvbihidWYpIHsKLSAgICAgIGJ1Zi5jb3B5KG91dCwgcG9zLCAwKTsKLSAgICAgIHBvcyArPSBidWYubGVuZ3RoOwotICAgIH0pOwotICAgIAotICAgIGlmICh0aGlzLm9uRmx1c2gpIHsKLSAgICAgIC8vIFRPRE86IG9wdGltaXplIHRoaXMgYmV0dGVyLCBhbGxvY2F0ZSBvbmUgYnVmZmVyIGluc3RlYWQgb2YgYm90aDoKLSAgICAgIHZhciBtc2cgPSBuZXcgQnVmZmVyKG91dC5sZW5ndGggKyA0KTsKLSAgICAgIEJpbmFyeVBhcnNlci5mcm9tSW50KG91dC5sZW5ndGgpLmNvcHkobXNnLCAwLCAwLCA0KTsKLSAgICAgIG91dC5jb3B5KG1zZywgNCwgMCwgb3V0Lmxlbmd0aCk7Ci0gICAgICB0aGlzLm9uRmx1c2gobXNnKTsKLSAgICB9Ci0KLSAgICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKLSAgICB0aGlzLm91dENvdW50ID0gMDsKLSAgfQotfTsKLQotdmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IGV4cG9ydHMuVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gZnVuY3Rpb24oYnVmZmVyLCBjYWxsYmFjaykgewotICB0aGlzLmRlZmF1bHRSZWFkQnVmZmVyU2l6ZSA9IDEwMjQ7Ci0gIHRoaXMud3JpdGVCdWZmZXJTaXplID0gNTEyOyAvLyBTb2Z0IExpbWl0Ci0gIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKLSAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKLSAgdGhpcy53cml0ZUN1cnNvciA9IDA7IC8vIGZvciBpbnB1dCBidWZmZXIKLSAgdGhpcy5vdXRCdWZmZXJzID0gW107Ci0gIHRoaXMub3V0Q291bnQgPSAwOwotICB0aGlzLm9uRmx1c2ggPSBjYWxsYmFjazsKLX07Ci1UQnVmZmVyZWRUcmFuc3BvcnQucmVjZWl2ZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewotICB2YXIgcmVhZGVyID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCgpOwotCi0gIHJldHVybiBmdW5jdGlvbihkYXRhKSB7Ci0gICAgaWYgKHJlYWRlci53cml0ZUN1cnNvciArIGRhdGEubGVuZ3RoID4gcmVhZGVyLmluQnVmLmxlbmd0aCkgewotICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIocmVhZGVyLndyaXRlQ3Vyc29yICsgZGF0YS5sZW5ndGgpOwotICAgICAgcmVhZGVyLmluQnVmLmNvcHkoYnVmLCAwLCAwLCByZWFkZXIud3JpdGVDdXJzb3IpOwotICAgICAgcmVhZGVyLmluQnVmID0gYnVmOwotICAgIH0KLSAgICBkYXRhLmNvcHkocmVhZGVyLmluQnVmLCByZWFkZXIud3JpdGVDdXJzb3IsIDApOwotICAgIHJlYWRlci53cml0ZUN1cnNvciArPSBkYXRhLmxlbmd0aDsKLQotICAgIGNhbGxiYWNrKHJlYWRlcik7Ci0gIH07Ci19OwotCi1UQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlID0gewotICBjb21taXRQb3NpdGlvbjogZnVuY3Rpb24oKXsKLSAgICB2YXIgdW5yZWFkZWRTaXplID0gdGhpcy53cml0ZUN1cnNvciAtIHRoaXMucmVhZEN1cnNvcjsKLSAgICB2YXIgYnVmU2l6ZSA9ICh1bnJlYWRlZFNpemUgKiAyID4gdGhpcy5kZWZhdWx0UmVhZEJ1ZmZlclNpemUpID8gdW5yZWFkZWRTaXplICogMiA6IHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplOwotICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKGJ1ZlNpemUpOwotICAgIGlmICh1bnJlYWRlZFNpemUgPiAwKSB7Ci0gICAgICB0aGlzLmluQnVmLmNvcHkoYnVmLCAwLCB0aGlzLnJlYWRDdXJzb3IsIHRoaXMud3JpdGVDdXJzb3IpOwotICAgIH0KLSAgICB0aGlzLnJlYWRDdXJzb3IgPSAwOwotICAgIHRoaXMud3JpdGVDdXJzb3IgPSB1bnJlYWRlZFNpemU7Ci0gICAgdGhpcy5pbkJ1ZiA9IGJ1ZjsKLSAgfSwKLSAgcm9sbGJhY2tQb3NpdGlvbjogZnVuY3Rpb24oKXsKLSAgICB0aGlzLnJlYWRDdXJzb3IgPSAwOwotICB9LAotCi0gIC8vIFRPRE86IEltcGxlbWVudCBvcGVuL2Nsb3NlIHN1cHBvcnQKLSAgaXNPcGVuOiBmdW5jdGlvbigpIHtyZXR1cm4gdHJ1ZTt9LAotICBvcGVuOiBmdW5jdGlvbigpIHt9LAotICBjbG9zZTogZnVuY3Rpb24oKSB7fSwKLQotICByZWFkOiBmdW5jdGlvbihsZW4pIHsKLSAgICBpZiAodGhpcy5yZWFkQ3Vyc29yICsgbGVuID4gdGhpcy53cml0ZUN1cnNvcikgewotICAgICAgdGhyb3cgbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcigpOwotICAgIH0KLSAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihsZW4pOwotICAgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy5yZWFkQ3Vyc29yICsgbGVuKTsKLSAgICB0aGlzLnJlYWRDdXJzb3IgKz0gbGVuOwotICAgIHJldHVybiBidWY7Ci0gIH0sCi0KLSAgcmVhZEFsbDogZnVuY3Rpb24oKSB7Ci0gICAgaWYgKHRoaXMucmVhZEN1cnNvciA+PSB0aGlzLndyaXRlQ3Vyc29yKSB7Ci0gICAgICB0aHJvdyBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCk7Ci0gICAgfQotICAgIHZhciBidWYgPSBuZXcgQnVmZmVyKHRoaXMud3JpdGVDdXJzb3IgLSB0aGlzLnJlYWRDdXJzb3IpOwotICAgIHRoaXMuaW5CdWYuY29weShidWYsIDAsIHRoaXMucmVhZEN1cnNvciwgdGhpcy53cml0ZUN1cnNvcik7Ci0gICAgdGhpcy5yZWFkQ3Vyc29yID0gdGhpcy53cml0ZUN1cnNvcjsKLSAgICByZXR1cm4gYnVmOwotICB9LAotCi0gIHdyaXRlOiBmdW5jdGlvbihidWYsIGVuY29kaW5nKSB7Ci0gICAgaWYgKHR5cGVvZihidWYpID09PSAic3RyaW5nIikgewotICAgICAgLy8gRGVmYXVsdGluZyB0byBhc2NpaSBlbmNvZGluZyBoZXJlIHNpbmNlIHRoYXQncyBtb3JlIGxpa2UgdGhlIG9yaWdpbmFsCi0gICAgICAvLyBjb2RlLCBidXQgSSBmZWVsIGxpa2UgJ3V0ZjgnIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZS4KLSAgICAgIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmLCBlbmNvZGluZyB8fCAnYXNjaWknKTsKLSAgICB9Ci0gICAgaWYgKHRoaXMub3V0Q291bnQgKyBidWYubGVuZ3RoID4gdGhpcy53cml0ZUJ1ZmZlclNpemUpIHsKLSAgICAgIHRoaXMuZmx1c2goKTsKLSAgICB9Ci0KLSAgICB0aGlzLm91dEJ1ZmZlcnMucHVzaChidWYpOwotICAgIHRoaXMub3V0Q291bnQgKz0gYnVmLmxlbmd0aDsKLQotICAgIGlmICh0aGlzLm91dENvdW50ID49IHRoaXMud3JpdGVCdWZmZXJTaXplKSB7Ci0gICAgICB0aGlzLmZsdXNoKCk7Ci0gICAgfQotICB9LAotCi0gIGZsdXNoOiBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5vdXRDb3VudCA8IDEpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgdmFyIG1zZyA9IG5ldyBCdWZmZXIodGhpcy5vdXRDb3VudCksCi0gICAgICAgIHBvcyA9IDA7Ci0gICAgdGhpcy5vdXRCdWZmZXJzLmZvckVhY2goZnVuY3Rpb24oYnVmKSB7Ci0gICAgICBidWYuY29weShtc2csIHBvcywgMCk7Ci0gICAgICBwb3MgKz0gYnVmLmxlbmd0aDsKLSAgICB9KTsKLSAgICAKLSAgICBpZiAodGhpcy5vbkZsdXNoKSB7Ci0gICAgICB0aGlzLm9uRmx1c2gobXNnKTsKLSAgICB9Ci0KLSAgICB0aGlzLm91dEJ1ZmZlcnMgPSBbXTsKLSAgICB0aGlzLm91dENvdW50ID0gMDsKLSAgfQotfTsKK21vZHVsZS5leHBvcnRzLlRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cittb2R1bGUuZXhwb3J0cy5URnJhbWVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9mcmFtZWRfdHJhbnNwb3J0Jyk7Cittb2R1bGUuZXhwb3J0cy5JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzNmNDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dlYl9zZXJ2ZXIuanMKQEAgLTAsMCArMSw1NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciBodHRwID0gcmVxdWlyZSgnaHR0cCcpOwordmFyIGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTsKK3ZhciB1cmwgPSByZXF1aXJlKCJ1cmwiKTsKK3ZhciBwYXRoID0gcmVxdWlyZSgicGF0aCIpOwordmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKK3ZhciBjcnlwdG8gPSByZXF1aXJlKCJjcnlwdG8iKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCit2YXIgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgPSByZXF1aXJlKCcuL211bHRpcGxleGVkX3Byb2Nlc3NvcicpLk11bHRpcGxleGVkUHJvY2Vzc29yOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKKy8vIFdTRnJhbWUgY29uc3RydWN0b3IgYW5kIHByb3RvdHlwZQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKiBBcGFjaGUgVGhyaWZ0IFJQQyBXZWIgU29ja2V0IFRyYW5zcG9ydAorICogIEZyYW1lIGxheW91dCBjb25mb3JtaW5nIHRvIFJGQyA2NDU1IGNpcmNhIDEyLzIwMTEKKyAqCisgKiBUaGVvcmV0aWNhbCBmcmFtZSBzaXplIGxpbWl0IGlzIDRHQio0R0IsIGhvd2V2ZXIgdGhlIE5vZGUgQnVmZmVyCisgKiBsaW1pdCBpcyAxR0IgYXMgb2YgdjAuMTAuIFRoZSBmcmFtZSBsZW5ndGggZW5jb2RpbmcgaXMgYWxzbworICogY29uZmlndXJlZCBmb3IgYSBtYXggb2YgNEdCIHByZXNlbnRseSBhbmQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQKKyAqIGlmIE5vZGUvQnJvd3NlcnMgYmVjb21lIGNhcGFiaWxlIG9mID4gNEdCIGZyYW1lcy4KKyAqCisgKiAgLSBGSU4gaXMgMSBpZiB0aGUgbWVzc2FnZSBpcyBjb21wbGV0ZQorICogIC0gUlNWMS8yLzMgYXJlIGFsd2F5cyAwCisgKiAgLSBPcGNvZGUgaXMgMShURVhUKSBmb3IgVEpTT05Qcm90b2NvbCBhbmQgMihCSU4pIGZvciBUQmluYXJ5UHJvdG9jb2wKKyAqICAtIE1hc2sgUHJlc2VudCBiaXQgaXMgMSBzZW5kaW5nIHRvLXNlcnZlciBhbmQgMCBzZW5kaW5nIHRvLWNsaWVudAorICogIC0gUGF5bG9hZCBMZW46CisgKiAgICAgICAgKyBJZiA8IDEyNjogdGhlbiByZXByZXNlbnRlZCBkaXJlY3RseQorICogICAgICAgICsgSWYgPj0xMjY6IGJ1dCB3aXRoaW4gcmFuZ2Ugb2YgYW4gdW5zaWduZWQgMTYgYml0IGludGVnZXIKKyAqICAgICAgICAgICAgIHRoZW4gUGF5bG9hZCBMZW4gaXMgMTI2IGFuZCB0aGUgdHdvIGZvbGxvd2luZyBieXRlcyBzdG9yZQorICogICAgICAgICAgICAgdGhlIGxlbmd0aAorICogICAgICAgICsgRWxzZTogUGF5bG9hZCBMZW4gaXMgMTI3IGFuZCB0aGUgZm9sbG93aW5nIDggYnl0ZXMgc3RvcmUgdGhlCisgKiAgICAgICAgICAgICBsZW5ndGggYXMgYW4gdW5zaWduZWQgNjQgYml0IGludGVnZXIKKyAqICAtIE1hc2tpbmcga2V5IGlzIGEgMzIgYml0IGtleSBvbmx5IHByZXNlbnQgd2hlbiBzZW5kaW5nIHRvIHRoZSBzZXJ2ZXIKKyAqICAtIFBheWxvYWQgZm9sbG93cyB0aGUgbWFza2luZyBrZXkgb3IgbGVuZ3RoCisgKgorICogICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAqICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAqICAgICstKy0rLSstKy0tLS0tLS0rLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8RnxSfFJ8Unwgb3Bjb2RlfE18IFBheWxvYWQgbGVuIHwgICAgRXh0ZW5kZWQgcGF5bG9hZCBsZW5ndGggICAgfAorICogICAgfEl8U3xTfFN8ICAoNCkgIHxBfCAgICAgKDcpICAgICB8ICAgICAgICAgICAgICgxNi82NCkgICAgICAgICAgIHwKKyAqICAgIHxOfFZ8VnxWfCAgICAgICB8U3wgICAgICAgICAgICAgfCAgIChpZiBwYXlsb2FkIGxlbj09MTI2LzEyNykgICB8CisgKiAgICB8IHwxfDJ8M3wgICAgICAgfEt8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgKy0rLSstKy0rLS0tLS0tLSstKy0tLS0tLS0tLS0tLS0rIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIHwgICAgIEV4dGVuZGVkIHBheWxvYWQgbGVuZ3RoIGNvbnRpbnVlZCwgaWYgcGF5bG9hZCBsZW4gPT0gMTI3ICB8CisgKiAgICArIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8TWFza2luZy1rZXksIGlmIE1BU0sgc2V0IHRvIDEgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgICB8IE1hc2tpbmcta2V5IChjb250aW51ZWQpICAgICAgIHwgICAgICAgICAgUGF5bG9hZCBEYXRhICAgICAgICAgfAorICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICsKKyAqICAgIDogICAgICAgICAgICAgICAgICAgICBQYXlsb2FkIERhdGEgY29udGludWVkIC4uLiAgICAgICAgICAgICAgICA6CisgKiAgICArIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKworICogICAgfCAgICAgICAgICAgICAgICAgICAgIFBheWxvYWQgRGF0YSBjb250aW51ZWQgLi4uICAgICAgICAgICAgICAgIHwKKyAqICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKi8KK3ZhciB3c0ZyYW1lID0geworICAvKiogRW5jb2RlcyBhIFdlYlNvY2tldCBmcmFtZQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIFRoZSByYXcgZGF0YSB0byBlbmNvZGUKKyAgICogQHBhcmFtIHtCdWZmZXJ9IG1hc2sgLSBUaGUgbWFzayB0byBhcHBseSB3aGVuIHNlbmRpbmcgdG8gc2VydmVyLCBudWxsIGZvciBubyBtYXNrCisgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYmluRW5jb2RpbmcgLSBUcnVlIGZvciBiaW5hcnkgZW5jb2RpbmcsIGZhbHNlIGZvciB0ZXh0IGVuY29kaW5nCisgICAqIEByZXR1cm5zIHtCdWZmZXJ9IC0gVGhlIFdlYlNvY2tldCBmcmFtZSwgcmVhZHkgdG8gc2VuZAorICAgKi8KKyAgZW5jb2RlOiBmdW5jdGlvbihkYXRhLCBtYXNrLCBiaW5FbmNvZGluZykgeworICAgICAgdmFyIGZyYW1lID0gbmV3IEJ1ZmZlcih3c0ZyYW1lLmZyYW1lU2l6ZUZyb21EYXRhKGRhdGEsIG1hc2spKTsKKyAgICAgIC8vQnl0ZSAwIC0gRklOICYgT1BDT0RFCisgICAgICBmcmFtZVswXSA9IHdzRnJhbWUuZmluLkZJTiArCisgICAgICAgICAgKGJpbkVuY29kaW5nID8gd3NGcmFtZS5mcmFtZU9wQ29kZXMuQklOIDogd3NGcmFtZS5mcmFtZU9wQ29kZXMuVEVYVCk7CisgICAgICAvL0J5dGUgMSBvciAxLTMgb3IgMS05IC0gTUFTSyBGTEFHICYgU0laRQorICAgICAgdmFyIHBheWxvYWRPZmZzZXQgPSAyOworICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgMHg3RSkgeworICAgICAgICBmcmFtZVsxXSA9IGRhdGEubGVuZ3RoICsgKG1hc2sgPyB3c0ZyYW1lLm1hc2suVE9fU0VSVkVSIDogd3NGcmFtZS5tYXNrLlRPX0NMSUVOVCk7CisgICAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoIDwgMHhGRkZGKSB7CisgICAgICAgIGZyYW1lWzFdID0gMHg3RSArIChtYXNrID8gd3NGcmFtZS5tYXNrLlRPX1NFUlZFUiA6IHdzRnJhbWUubWFzay5UT19DTElFTlQpOworICAgICAgICBmcmFtZS53cml0ZVVJbnQxNkJFKGRhdGEubGVuZ3RoLCAyLCB0cnVlKTsKKyAgICAgICAgcGF5bG9hZE9mZnNldCA9IDQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcmFtZVsxXSA9IDB4N0YgKyAobWFzayA/IHdzRnJhbWUubWFzay5UT19TRVJWRVIgOiB3c0ZyYW1lLm1hc2suVE9fQ0xJRU5UKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MzJCRSgwLCAyLCB0cnVlKTsKKyAgICAgICAgZnJhbWUud3JpdGVVSW50MzJCRShkYXRhLmxlbmd0aCwgNiwgdHJ1ZSk7CisgICAgICAgIHBheWxvYWRPZmZzZXQgPSAxMDsKKyAgICAgIH0KKyAgICAgIC8vTUFTSworICAgICAgaWYgKG1hc2spIHsKKyAgICAgICAgbWFzay5jb3B5KGZyYW1lLCBwYXlsb2FkT2Zmc2V0LCAwLCA0KTsKKyAgICAgICAgcGF5bG9hZE9mZnNldCArPSA0OworICAgICAgfQorICAgICAgLy9QYXlsb2FkCisgICAgICBkYXRhLmNvcHkoZnJhbWUsIHBheWxvYWRPZmZzZXQpOworICAgICAgaWYgKG1hc2spIHsKKyAgICAgICAgd3NGcmFtZS5hcHBseU1hc2soZnJhbWUuc2xpY2UocGF5bG9hZE9mZnNldCksIGZyYW1lLnNsaWNlKHBheWxvYWRPZmZzZXQtNCxwYXlsb2FkT2Zmc2V0KSk7CisgICAgICB9CisgICAgICByZXR1cm4gZnJhbWU7CisgIH0sCisKKyAgLyoqCisgICAqIEBjbGFzcworICAgKiBAbmFtZSBXU0RlY29kZVJlc3VsdAorICAgKiBAcHJvcGVydHkge0J1ZmZlcn0gZGF0YSAtIFRoZSBkZWNvZGVkIGRhdGEgZm9yIHRoZSBmaXJzdCBBVFJQQyBtZXNzYWdlCisgICAqIEBwcm9wZXJ0eSB7QnVmZmVyfSBtYXNrIC0gVGhlIGZyYW1lIG1hc2sKKyAgICogQHByb3BlcnR5IHtCb29sZWFufSBiaW5FbmNvZGluZyAtIFRydWUgaWYgYmluYXJ5IChUQmluYXJ5UHJvdG9jb2wpLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UgaWYgdGV4dCAoVEpTT05Qcm90b2NvbCkKKyAgICogQHByb3BlcnR5IHtCdWZmZXJ9IG5leHRGcmFtZSAtIE11bHRpcGxlIEFUUlBDIG1lc3NhZ2VzIG1heSBiZSBzZW50IGluIGEKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBXZWJTb2NrZXQgZnJhbWUsIHRoaXMgQnVmZmVyIGNvbnRhaW5zCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIGRlY29kZWQKKyAgICogQHByb3BlcnR5IHtCb29sZWFufSBGSU4gLSBUcnVlIGlzIHRoZSBtZXNzYWdlIGlzIGNvbXBsZXRlCisgICAqLworCisgICAvKiogRGVjb2RlcyBhIFdlYlNvY2tldCBmcmFtZQorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZnJhbWUgLSBUaGUgcmF3IGluYm91bmQgZnJhbWUsIGlmIHRoaXMgaXMgYSBjb250aW51YXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgaXQgbXVzdCBoYXZlIGEgbWFzayBwcm9wZXJ0eSB3aXRoIHRoZSBtYXNrLgorICAgKiBAcmV0dXJucyB7V1NEZWNvZGVSZXN1bHR9IC0gVGhlIGRlY29kZWQgcGF5bG9hZAorICAgKgorICAgKiBAc2VlIHtAbGluayBXU0RlY29kZVJlc3VsdH0KKyAgICovCisgIGRlY29kZTogZnVuY3Rpb24oZnJhbWUpIHsKKyAgICAgIHZhciByZXN1bHQgPSB7CisgICAgICAgIGRhdGE6IG51bGwsCisgICAgICAgIG1hc2s6IG51bGwsCisgICAgICAgIGJpbkVuY29kaW5nOiBmYWxzZSwKKyAgICAgICAgbmV4dEZyYW1lOiBudWxsLAorICAgICAgICBGSU46IHRydWUKKyAgICAgIH07CisKKyAgICAgIC8vQnl0ZSAwIC0gRklOICYgT1BDT0RFCisgICAgICBpZiAod3NGcmFtZS5maW4uRklOICE9IChmcmFtZVswXSAmIHdzRnJhbWUuZmluLkZJTikpIHsKKyAgICAgICAgcmVzdWx0LkZJTiA9IGZhbHNlOworICAgICAgfQorICAgICAgcmVzdWx0LmJpbkVuY29kaW5nID0gKHdzRnJhbWUuZnJhbWVPcENvZGVzLkJJTiA9PSAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5CSU4pKTsKKyAgICAgIC8vQnl0ZSAxIG9yIDEtMyBvciAxLTkgLSBTSVpFCisgICAgICB2YXIgbGVuQnl0ZSA9IChmcmFtZVsxXSAmIDB4MDAwMDAwN0YpOworICAgICAgdmFyIGxlbiA9IGxlbkJ5dGU7CisgICAgICB2YXIgZGF0YU9mZnNldCA9IDI7CisgICAgICBpZiAobGVuQnl0ZSA9PSAweDdFKSB7CisgICAgICAgIGxlbiA9IGZyYW1lLnJlYWRVSW50MTZCRSgyKTsKKyAgICAgICAgZGF0YU9mZnNldCA9IDQ7CisgICAgICB9IGVsc2UgaWYgKGxlbkJ5dGUgPT0gMHg3RikgeworICAgICAgICBsZW4gPSBmcmFtZS5yZWFkVUludDMyQkUoNik7CisgICAgICAgIGRhdGFPZmZzZXQgPSAxMDsKKyAgICAgIH0KKyAgICAgIC8vTUFTSworICAgICAgaWYgKHdzRnJhbWUubWFzay5UT19TRVJWRVIgPT0gKGZyYW1lWzFdICYgd3NGcmFtZS5tYXNrLlRPX1NFUlZFUikpIHsKKyAgICAgICAgcmVzdWx0Lm1hc2sgPSBuZXcgQnVmZmVyKDQpOworICAgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5tYXNrLCAwLCBkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0ICsgNCk7CisgICAgICAgIGRhdGFPZmZzZXQgKz0gNDsKKyAgICAgIH0KKyAgICAgIC8vUGF5bG9hZAorICAgICAgcmVzdWx0LmRhdGEgPSBuZXcgQnVmZmVyKGxlbik7CisgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5kYXRhLCAwLCBkYXRhT2Zmc2V0LCBkYXRhT2Zmc2V0K2xlbik7CisgICAgICBpZiAocmVzdWx0Lm1hc2spIHsKKyAgICAgICAgd3NGcmFtZS5hcHBseU1hc2socmVzdWx0LmRhdGEsIHJlc3VsdC5tYXNrKTsKKyAgICAgIH0KKyAgICAgIC8vTmV4dCBGcmFtZQorICAgICAgaWYgKGZyYW1lLmxlbmd0aCA+IGRhdGFPZmZzZXQrbGVuKSB7CisgICAgICAgIHJlc3VsdC5uZXh0RnJhbWUgPSBuZXcgQnVmZmVyKGZyYW1lLmxlbmd0aCAtIChkYXRhT2Zmc2V0K2xlbikpOworICAgICAgICBmcmFtZS5jb3B5KHJlc3VsdC5uZXh0RnJhbWUsIDAsIGRhdGFPZmZzZXQrbGVuLCBmcmFtZS5sZW5ndGgpOworICAgICAgfQorICAgICAgLy9Eb24ndCBmb3J3YXJkIGNvbnRyb2wgZnJhbWVzCisgICAgICBpZiAoZnJhbWVbMF0gJiB3c0ZyYW1lLmZyYW1lT3BDb2Rlcy5GSU5DVFJMKSB7CisgICAgICAgIHJlc3VsdC5kYXRhID0gbnVsbDsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSwKKworICAvKiogTWFza3MvVW5tYXNrcyBkYXRhCisgICAqCisgICAqIEBwYXJhbSB7QnVmZmVyfSBkYXRhIC0gZGF0YSB0byBtYXNrL3VubWFzayBpbiBwbGFjZQorICAgKiBAcGFyYW0ge0J1ZmZlcn0gbWFzayAtIHRoZSBtYXNrCisgICAqLworICBhcHBseU1hc2s6IGZ1bmN0aW9uKGRhdGEsIG1hc2speworICAgIC8vVE9ETzogbG9vayBpbnRvIHhvcmluZyB3b3JkcyBhdCBhIHRpbWUKKyAgICB2YXIgZGF0YUxlbiA9IGRhdGEubGVuZ3RoOworICAgIHZhciBtYXNrTGVuID0gbWFzay5sZW5ndGg7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhTGVuOyBpKyspIHsKKyAgICAgIGRhdGFbaV0gPSBkYXRhW2ldIF4gbWFza1tpJW1hc2tMZW5dOworICAgIH0KKyAgfSwKKworICAvKiogQ29tcHV0ZXMgZnJhbWUgc2l6ZSBvbiB0aGUgd2lyZSBmcm9tIGRhdGEgdG8gYmUgc2VudAorICAgKgorICAgKiBAcGFyYW0ge0J1ZmZlcn0gZGF0YSAtIGRhdGEubGVuZ3RoIGlzIHRoZSBhc3N1bWVkIHBheWxvYWQgc2l6ZQorICAgKiBAcGFyYW0ge0Jvb2xlYW59IG1hc2sgLSB0cnVlIGlmIGEgbWFzayB3aWxsIGJlIHNlbnQgKFRPX1NFUlZFUikKKyAgICovCisgIGZyYW1lU2l6ZUZyb21EYXRhOiBmdW5jdGlvbihkYXRhLCBtYXNrKSB7CisgICAgdmFyIGhlYWRlclNpemUgPSAxMDsKKyAgICBpZiAoZGF0YS5sZW5ndGggPCAweDdFKSB7CisgICAgICBoZWFkZXJTaXplID0gMjsKKyAgICB9IGVsc2UgaWYgKGRhdGEubGVuZ3RoIDwgMHhGRkZGKSB7CisgICAgICBoZWFkZXJTaXplID0gNDsKKyAgICB9CisgICAgcmV0dXJuIGhlYWRlclNpemUgKyBkYXRhLmxlbmd0aCArIChtYXNrID8gNCA6IDApOworICB9LAorCisgIGZyYW1lT3BDb2RlczogeworICAgIENPTlQ6ICAgICAweDAwLAorICAgIFRFWFQ6ICAgICAweDAxLAorICAgIEJJTjogICAgICAweDAyLAorICAgIENUUkw6ICAgICAweDgwCisgIH0sCisKKyAgbWFzazogeworICAgIFRPX1NFUlZFUjogMHg4MCwKKyAgICBUT19DTElFTlQ6IDB4MDAKKyAgfSwKKworICBmaW46IHsKKyAgICBDT05UOiAweDAwLAorICAgIEZJTjogMHg4MAorICB9Cit9OworCisKKy8vIGNyZWF0ZVdlYlNlcnZlciBjb25zdHJ1Y3RvciBhbmQgb3B0aW9ucworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBTZXJ2ZXJPcHRpb25zCisgKiBAcHJvcGVydHkge2FycmF5fSBjb3JzIC0gQXJyYXkgb2YgQ09SUyBvcmlnaW4gc3RyaW5ncyB0byBwZXJtaXQgcmVxdWVzdHMgZnJvbS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlcyAtIFBhdGggdG8gc2VydmUgc3RhdGljIGZpbGVzIGZyb20sIGlmIGFic2VudCBvciAiIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGZpbGUgc2VydmljZSBpcyBkaXNhYmxlZC4KKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBoZWFkZXJzIC0gQW4gb2JqZWN0IGhhc2ggbWFwcGluZyBoZWFkZXIgc3RyaW5ncyB0byBoZWFkZXIgdmFsdWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncywgdGhlc2UgaGVhZGVycyBhcmUgdHJhbnNtaXR0ZWQgaW4gcmVzcG9uc2UgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGZpbGUgR0VUIG9wZXJhdGlvbnMuCisgKiBAcHJvcGVydHkge29iamVjdH0gc2VydmljZXMgLSBBbiBvYmplY3QgaGFzaCBtYXBwaW5nIHNlcnZpY2UgVVJJIHN0cmluZ3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFNlcnZpY2VPcHRpb25zIG9iamVjdHMKKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0bHMgLSBOb2RlLmpzIFRMUyBvcHRpb25zIChzZWU6IG5vZGVqcy5vcmcvYXBpL3Rscy5odG1sKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHJlc2VudCBvciBudWxsIHJlZ3VsYXIgaHR0cCBpcyB1c2VkLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IGEga2V5IGFuZCBhIGNlcnQgbXVzdCBiZSBkZWZpbmVkIHRvIHVzZSBTU0wvVExTCisgKiBAc2VlIHtAbGluayBTZXJ2aWNlT3B0aW9uc30KKyAqLworCisvKioKKyAqIEBjbGFzcworICogQG5hbWUgU2VydmljZU9wdGlvbnMKKyAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0cmFuc3BvcnQgLSBUaGUgbGF5ZXJlZCB0cmFuc3BvcnQgdG8gdXNlIChkZWZhdWx0cworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFRCdWZmZXJlZFRyYW5zcG9ydCkuCisgKiBAcHJvcGVydHkge29iamVjdH0gcHJvdG9jb2wgLSBUaGUgc2VyaWFsaXphdGlvbiBQcm90b2NvbCB0byB1c2UgKGRlZmF1bHRzIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wpLgorICogQHByb3BlcnR5IHtvYmplY3R9IHByb2Nlc3NvciAtIFRoZSBUaHJpZnQgU2VydmljZSBjbGFzcy9wcm9jZXNzb3IgZ2VuZXJhdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIElETCBDb21waWxlciBmb3IgdGhlIHNlcnZpY2UgKHRoZSAiY2xzIgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSBjYW4gYWxzbyBiZSB1c2VkIGZvciB0aGlzIGF0dHJpYnV0ZSkuCisgKiBAcHJvcGVydHkge29iamVjdH0gaGFuZGxlciAtIFRoZSBoYW5kbGVyIG1ldGhvZHMgZm9yIHRoZSBUaHJpZnQgU2VydmljZS4KKyAqLworCisvKioKKyAqIENyZWF0ZSBhIFRocmlmdCBzZXJ2ZXIgd2hpY2ggY2FuIHNlcnZlIHN0YXRpYyBmaWxlcyBhbmQvb3Igb25lIG9yCisgKiBtb3JlIFRocmlmdCBTZXJ2aWNlcy4KKyAqIEBwYXJhbSB7U2VydmVyT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm5zIHtvYmplY3R9IC0gVGhlIEFwYWNoZSBUaHJpZnQgV2ViIFNlcnZlci4KKyAqLworZXhwb3J0cy5jcmVhdGVXZWJTZXJ2ZXIgPSBmdW5jdGlvbihvcHRpb25zKSB7CisgIHZhciBiYXNlRGlyID0gb3B0aW9ucy5maWxlczsKKyAgdmFyIGNvbnRlbnRUeXBlc0J5RXh0ZW5zaW9uID0geworICAgICcudHh0JzogJ3RleHQvcGxhaW4nLAorICAgICcuaHRtbCc6ICd0ZXh0L2h0bWwnLAorICAgICcuY3NzJzogJ3RleHQvY3NzJywKKyAgICAnLnhtbCc6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJywKKyAgICAnLmpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLAorICAgICcuanBnJzogJ2ltYWdlL2pwZWcnLAorICAgICcuanBlZyc6ICdpbWFnZS9qcGVnJywKKyAgICAnLmdpZic6ICdpbWFnZS9naWYnLAorICAgICcucG5nJzogJ2ltYWdlL3BuZycsCisgICAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcKKyAgfTsKKworICAvL1NldHVwIGFsbCBvZiB0aGUgc2VydmljZXMKKyAgdmFyIHNlcnZpY2VzID0gb3B0aW9ucy5zZXJ2aWNlczsKKyAgZm9yICh2YXIgdXJpIGluIHNlcnZpY2VzKSB7CisgICAgdmFyIHN2Y09iaiA9IHNlcnZpY2VzW3VyaV07CisKKyAgICAvL1NldHVwIHRoZSBwcm9jZXNzb3IKKyAgICBpZiAoc3ZjT2JqLnByb2Nlc3NvciBpbnN0YW5jZW9mIE11bHRpcGxleGVkUHJvY2Vzc29yKSB7CisgICAgICAvL011bHRpcGxleCBwcm9jZXNzb3JzIGhhdmUgcHJlIGVtYmVkZGVkIHByb2Nlc3Nvci9oYW5kbGVyIHBhaXJzLCBzYXZlIGFzIGlzCisgICAgICBzdmNPYmoucHJvY2Vzc29yID0gc3ZjT2JqLnByb2Nlc3NvcjsKKyAgICB9IGVsc2UgeworICAgICAgLy9Gb3IgaGlzdG9yaWNhbCByZWFzb25zIE5vZGUuanMgc3VwcG9ydHMgcHJvY2Vzc29ycyBwYXNzZWQgaW4gZGlyZWN0bHkgb3IgdmlhIHRoZQorICAgICAgLy8gIElETCBDb21waWxlciBnZW5lcmF0ZWQgY2xhc3MgaG91c2luZyB0aGUgcHJvY2Vzc29yLiBBbHNvLCB0aGUgb3B0aW9ucyBwcm9wZXJ0eQorICAgICAgLy8gIGZvciBhIFByb2Nlc3NvciBoYXMgYmVlbiBjYWxsZWQgYm90aCBjbHMgYW5kIHByb2Nlc3NvciBhdCBkaWZmZXJlbnQgdGltZXMuIFdlCisgICAgICAvLyAgc3VwcG9ydCBhbnkgb2YgdGhlIGZvdXIgcG9zc2liaWxpdGllcyBoZXJlLgorICAgICAgdmFyIHByb2Nlc3NvciA9IChzdmNPYmoucHJvY2Vzc29yKSA/IChzdmNPYmoucHJvY2Vzc29yLlByb2Nlc3NvciB8fCBzdmNPYmoucHJvY2Vzc29yKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN2Y09iai5jbHMuUHJvY2Vzc29yIHx8IHN2Y09iai5jbHMpOworICAgICAgLy9Qcm9jZXNzb3JzIGNhbiBiZSBzdXBwbGllZCBhcyBjb25zdHJ1Y3RlZCBvYmplY3RzIHdpdGggaGFuZGxlcnMgYWxyZWFkeSBlbWJlZGRlZCwKKyAgICAgIC8vICBpZiBhIGhhbmRsZXIgaXMgcHJvdmlkZWQgd2UgY29uc3RydWN0IGEgbmV3IHByb2Nlc3NvciwgaWYgbm90IHdlIHVzZSB0aGUgcHJvY2Vzc29yCisgICAgICAvLyAgb2JqZWN0IGRpcmVjdGx5CisgICAgICBpZiAoc3ZjT2JqLmhhbmRsZXIpIHsKKyAgICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IG5ldyBwcm9jZXNzb3Ioc3ZjT2JqLmhhbmRsZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ZjT2JqLnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICAgIH0KKyAgICB9CisgICAgc3ZjT2JqLnRyYW5zcG9ydCA9IHN2Y09iai50cmFuc3BvcnQgPyBzdmNPYmoudHJhbnNwb3J0IDogVEJ1ZmZlcmVkVHJhbnNwb3J0OworICAgIHN2Y09iai5wcm90b2NvbCA9IHN2Y09iai5wcm90b2NvbCA/IHN2Y09iai5wcm90b2NvbCA6IFRCaW5hcnlQcm90b2NvbDsKKyAgfQorCisgIC8vVmVyaWZ5IENPUlMgcmVxdWlyZW1lbnRzCisgIGZ1bmN0aW9uIFZlcmlmeUNPUlNBbmRTZXRIZWFkZXJzKHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgaWYgKHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gJiYgb3B0aW9ucy5jb3JzKSB7CisgICAgICBpZiAob3B0aW9ucy5jb3JzWyIqIl0gfHwgb3B0aW9ucy5jb3JzW3JlcXVlc3QuaGVhZGVycy5vcmlnaW5dKSB7CisgICAgICAgIC8vQWxsb3csIG9yaWdpbiBhbGxvd2VkCisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2luIiwgcmVxdWVzdC5oZWFkZXJzLm9yaWdpbik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtYWxsb3ctbWV0aG9kcyIsICJHRVQsIFBPU1QsIE9QVElPTlMiKTsKKyAgICAgICAgcmVzcG9uc2Uuc2V0SGVhZGVyKCJhY2Nlc3MtY29udHJvbC1hbGxvdy1oZWFkZXJzIiwgImNvbnRlbnQtdHlwZSwgYWNjZXB0Iik7CisgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiYWNjZXNzLWNvbnRyb2wtbWF4LWFnZSIsICI2MCIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vRGlzYWxsb3csIG9yaWdpbiBkZW5pZWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICAvL0FsbG93LCBDT1JTIGlzIG5vdCBpbiB1c2UKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisKKyAgLy9IYW5kbGUgT1BUSU9OUyBtZXRob2QgKENPUlMpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzT3B0aW9ucyhyZXF1ZXN0LCByZXNwb25zZSkgeworICAgIGlmIChWZXJpZnlDT1JTQW5kU2V0SGVhZGVycyhyZXF1ZXN0LCByZXNwb25zZSkpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgiMjA0IiwgIk5vIENvbnRlbnQiLCB7ImNvbnRlbnQtbGVuZ3RoIjogMH0pOworICAgIH0gZWxzZSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJPcmlnaW4gIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiIG5vdCBhbGxvd2VkIiwge30pOworICAgIH0KKyAgICByZXNwb25zZS5lbmQoKTsKKyAgfQorCisKKyAgLy9IYW5kbGUgUE9TVCBtZXRob2RzIChUWEhSVHJhbnNwb3J0KQorICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgZnVuY3Rpb24gcHJvY2Vzc1Bvc3QocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICAvL0xvb2t1cCBzZXJ2aWNlCisgICAgdmFyIHVyaSA9IHVybC5wYXJzZShyZXF1ZXN0LnVybCkucGF0aG5hbWU7CisgICAgdmFyIHN2YyA9IHNlcnZpY2VzW3VyaV07CisgICAgaWYgKCFzdmMpIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgiNDAzIiwgIk5vIEFwYWNoZSBUaHJpZnQgU2VydmljZSBhdCAiICsgdXJpLCB7fSk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICAgIGlmICghVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJPcmlnaW4gIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiIG5vdCBhbGxvd2VkIiwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9Qcm9jZXNzIFhIUiBwYXlsb2FkCisgICAgcmVxdWVzdC5vbignZGF0YScsIHN2Yy50cmFuc3BvcnQucmVjZWl2ZXIoZnVuY3Rpb24odHJhbnNwb3J0V2l0aERhdGEpIHsKKyAgICAgIHZhciBpbnB1dCA9IG5ldyBzdmMucHJvdG9jb2wodHJhbnNwb3J0V2l0aERhdGEpOworICAgICAgdmFyIG91dHB1dCA9IG5ldyBzdmMucHJvdG9jb2wobmV3IHN2Yy50cmFuc3BvcnQodW5kZWZpbmVkLCBmdW5jdGlvbihidWYpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMjAwKTsKKyAgICAgICAgICByZXNwb25zZS5lbmQoYnVmKTsKKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0pKTsKKworICAgICAgdHJ5IHsKKyAgICAgICAgc3ZjLnByb2Nlc3Nvci5wcm9jZXNzKGlucHV0LCBvdXRwdXQpOworICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CisgICAgICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KSk7CisgIH0KKworCisgIC8vSGFuZGxlIEdFVCBtZXRob2RzIChTdGF0aWMgUGFnZSBTZXJ2ZXIpCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICBmdW5jdGlvbiBwcm9jZXNzR2V0KHJlcXVlc3QsIHJlc3BvbnNlKSB7CisgICAgLy9VbmRlZmluZWQgb3IgZW1wdHkgYmFzZSBkaXJlY3RvcnkgbWVhbnMgZG8gbm90IHNlcnZlIHN0YXRpYyBmaWxlcworICAgIGlmICghYmFzZURpciB8fCAiIiA9PT0gYmFzZURpcikgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL1ZlcmlmeSBDT1JTIHJlcXVpcmVtZW50cworICAgIGlmICghVmVyaWZ5Q09SU0FuZFNldEhlYWRlcnMocmVxdWVzdCwgcmVzcG9uc2UpKSB7CisgICAgICByZXNwb25zZS53cml0ZUhlYWQoIjQwMyIsICJPcmlnaW4gIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiIG5vdCBhbGxvd2VkIiwge30pOworICAgICAgcmVzcG9uc2UuZW5kKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9Mb2NhdGUgdGhlIGZpbGUgcmVxdWVzdGVkIGFuZCBzZW5kIGl0CisgICAgdmFyIHVyaSA9IHVybC5wYXJzZShyZXF1ZXN0LnVybCkucGF0aG5hbWU7CisgICAgdmFyIGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihiYXNlRGlyLCB1cmkpKTsKKworICAgIC8vRW5zdXJlIHRoZSBiYXNlZGlyIHBhdGggaXMgbm90IGFibGUgdG8gYmUgZXNjYXBlZAorICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKGJhc2VEaXIpICE9IDApIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDAsICJJbnZhbGlkIHJlcXVlc3QgcGF0aCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZzLmV4aXN0cyhmaWxlbmFtZSwgZnVuY3Rpb24oZXhpc3RzKSB7CisgICAgICBpZighZXhpc3RzKSB7CisgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOworICAgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBpZiAoZnMuc3RhdFN5bmMoZmlsZW5hbWUpLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgZmlsZW5hbWUgKz0gJy9pbmRleC5odG1sJzsKKyAgICAgIH0KKworICAgICAgZnMucmVhZEZpbGUoZmlsZW5hbWUsICJiaW5hcnkiLCBmdW5jdGlvbihlcnIsIGZpbGUpIHsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg1MDApOworICAgICAgICAgIHJlc3BvbnNlLmVuZChlcnIgKyAiXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmFyIGhlYWRlcnMgPSB7fTsKKyAgICAgICAgdmFyIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVzQnlFeHRlbnNpb25bcGF0aC5leHRuYW1lKGZpbGVuYW1lKV07CisgICAgICAgIGlmIChjb250ZW50VHlwZSkgeworICAgICAgICAgIGhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gY29udGVudFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh2YXIgayBpbiBvcHRpb25zLmhlYWRlcnMpIHsKKyAgICAgICAgICBoZWFkZXJzW2tdID0gb3B0aW9ucy5oZWFkZXJzW2tdOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCgyMDAsIGhlYWRlcnMpOworICAgICAgICByZXNwb25zZS53cml0ZShmaWxlLCAiYmluYXJ5Iik7CisgICAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgfSk7CisgICAgfSk7CisgIH0KKworCisgIC8vSGFuZGxlIFdlYlNvY2tldCBjYWxscyAoVFdlYlNvY2tldFRyYW5zcG9ydCkKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgIGZ1bmN0aW9uIHByb2Nlc3NXUyhkYXRhLCBzb2NrZXQsIHN2YywgYmluRW5jb2RpbmcpIHsKKyAgICBzdmMudHJhbnNwb3J0LnJlY2VpdmVyKGZ1bmN0aW9uKHRyYW5zcG9ydFdpdGhEYXRhKSB7CisgICAgICB2YXIgaW5wdXQgPSBuZXcgc3ZjLnByb3RvY29sKHRyYW5zcG9ydFdpdGhEYXRhKTsKKyAgICAgIHZhciBvdXRwdXQgPSBuZXcgc3ZjLnByb3RvY29sKG5ldyBzdmMudHJhbnNwb3J0KHVuZGVmaW5lZCwgZnVuY3Rpb24oYnVmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgdmFyIGZyYW1lID0gd3NGcmFtZS5lbmNvZGUoYnVmLCBudWxsLCBiaW5FbmNvZGluZyk7CisgICAgICAgICAgc29ja2V0LndyaXRlKGZyYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoZXJyKSB7CisgICAgICAgICAgLy9UT0RPOiBBZGQgYmV0dGVyIGVycm9yIHByb2Nlc3NpbmcKKyAgICAgICAgfQorICAgICAgfSkpOworCisgICAgICB0cnkgeworICAgICAgICBzdmMucHJvY2Vzc29yLnByb2Nlc3MoaW5wdXQsIG91dHB1dCk7CisgICAgICAgIHRyYW5zcG9ydFdpdGhEYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICB9CisgICAgICBjYXRjaCAoZXJyKSB7CisgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IpIHsKKyAgICAgICAgICB0cmFuc3BvcnRXaXRoRGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy9UT0RPOiBBZGQgYmV0dGVyIGVycm9yIHByb2Nlc3NpbmcKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pKGRhdGEpOworICB9CisKKyAgLy9DcmVhdGUgdGhlIHNlcnZlciAoSFRUUCBvciBIVFRQUykKKyAgdmFyIHNlcnZlciA9IG51bGw7CisgIGlmIChvcHRpb25zLnRscykgeworICAgIHNlcnZlciA9IGh0dHBzLmNyZWF0ZVNlcnZlcihvcHRpb25zLnRscyk7CisgIH0gZWxzZSB7CisgICAgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKTsKKyAgfQorCisgIC8vV2lyZSB1cCBsaXN0ZW5lcnMgZm9yIHVwZ3JhZGUodG8gV2ViU29ja2V0KSAmIHJlcXVlc3QgbWV0aG9kcyBmb3I6CisgIC8vICAgLSBHRVQgc3RhdGljIGZpbGVzLAorICAvLyAgIC0gUE9TVCBYSFIgVGhyaWZ0IHNlcnZpY2VzCisgIC8vICAgLSBPUFRJT05TIENPUlMgcmVxdWVzdHMKKyAgc2VydmVyLm9uKCdyZXF1ZXN0JywgZnVuY3Rpb24ocmVxdWVzdCwgcmVzcG9uc2UpIHsKKyAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdQT1NUJykgeworICAgICAgcHJvY2Vzc1Bvc3QocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0gZWxzZSBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdHRVQnKSB7CisgICAgICBwcm9jZXNzR2V0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnT1BUSU9OUycpIHsKKyAgICAgIHByb2Nlc3NPcHRpb25zKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDUwMCk7CisgICAgICByZXNwb25zZS5lbmQoKTsKKyAgICB9CisgIH0pLm9uKCd1cGdyYWRlJywgZnVuY3Rpb24ocmVxdWVzdCwgc29ja2V0LCBoZWFkKSB7CisgICAgLy9Mb29rdXAgc2VydmljZQorICAgIHZhciBzdmM7CisgICAgdHJ5IHsKKyAgICAgIHN2YyA9IHNlcnZpY2VzW09iamVjdC5rZXlzKHNlcnZpY2VzKVswXV07CisgICAgfSBjYXRjaChlKSB7CisgICAgICBzb2NrZXQud3JpdGUoIkhUVFAvMS4xIDQwMyBObyBBcGFjaGUgVGhyaWZ0IFNlcnZpY2UgYXZhaWxhYmxlXHJcblxyXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy9QZXJmb3JtIHVwZ3JhZGUKKyAgICB2YXIgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCJzaGExIik7CisgICAgaGFzaC51cGRhdGUocmVxdWVzdC5oZWFkZXJzWydzZWMtd2Vic29ja2V0LWtleSddICsgIjI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMSIpOworICAgIHNvY2tldC53cml0ZSgiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIiArCisgICAgICAgICAgICAgICAgICAgIlVwZ3JhZGU6IHdlYnNvY2tldFxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6ICIgKyBoYXNoLmRpZ2VzdCgiYmFzZTY0IikgKyAiXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJTZWMtV2ViU29ja2V0LU9yaWdpbjogIiArIHJlcXVlc3QuaGVhZGVycy5vcmlnaW4gKyAiXHJcbiIgKworICAgICAgICAgICAgICAgICAgICJTZWMtV2ViU29ja2V0LUxvY2F0aW9uOiB3czovLyIgKyByZXF1ZXN0LmhlYWRlcnMuaG9zdCArIHJlcXVlc3QudXJsICsgIlxyXG4iICsKKyAgICAgICAgICAgICAgICAgICAiXHJcbiIpOworICAgIC8vSGFuZGxlIFdlYlNvY2tldCB0cmFmZmljCisgICAgdmFyIGRhdGEgPSBudWxsOworICAgIHNvY2tldC5vbignZGF0YScsIGZ1bmN0aW9uKGZyYW1lKSB7CisgICAgICB0cnkgeworICAgICAgICB3aGlsZSAoZnJhbWUpIHsKKyAgICAgICAgICB2YXIgcmVzdWx0ID0gd3NGcmFtZS5kZWNvZGUoZnJhbWUpOworICAgICAgICAgIC8vUHJlcGVuZCBhbnkgZXhpc3RpbmcgZGVjb2RlZCBkYXRhCisgICAgICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZGF0YSkgeworICAgICAgICAgICAgICB2YXIgbmV3RGF0YSA9IG5ldyBCdWZmZXIoZGF0YS5sZW5ndGggKyByZXN1bHQuZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICBkYXRhLmNvcHkobmV3RGF0YSk7CisgICAgICAgICAgICAgIHJlc3VsdC5kYXRhLmNvcHkobmV3RGF0YSwgZGF0YS5sZW5ndGgpOworICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IG5ld0RhdGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgICAgLy9JZiB0aGlzIGNvbXBsZXRlcyBhIG1lc3NhZ2UgcHJvY2VzcyBpdAorICAgICAgICAgIGlmIChyZXN1bHQuRklOKSB7CisgICAgICAgICAgICBwcm9jZXNzV1MocmVzdWx0LmRhdGEsIHNvY2tldCwgc3ZjLCByZXN1bHQuYmluRW5jb2RpbmcpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gcmVzdWx0LmRhdGE7CisgICAgICAgICAgfQorICAgICAgICAgIC8vUHJlcGFyZSBuZXh0IGZyYW1lIGZvciBkZWNvZGluZyAoaWYgYW55KQorICAgICAgICAgIGZyYW1lID0gcmVzdWx0Lm5leHRGcmFtZTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaChlKSB7CisgICAgICAgIGxvZy5lcnJvcignVFdlYlNvY2tldFRyYW5zcG9ydCBFeGNlcHRpb246ICcgKyBlKTsKKyAgICAgICAgc29ja2V0LmRlc3Ryb3koKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfSk7CisKKyAgLy9SZXR1cm4gdGhlIHNlcnZlcgorICByZXR1cm4gc2VydmVyOworfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX2Nvbm5lY3Rpb24uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyY2JkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c19jb25uZWN0aW9uLmpzCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKK3ZhciBXZWJTb2NrZXQgPSByZXF1aXJlKCd3cycpOwordmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjsKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwordmFyIHR0cmFuc3BvcnQgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpOwordmFyIHRwcm90b2NvbCA9IHJlcXVpcmUoJy4vcHJvdG9jb2wnKTsKKwordmFyIFRCdWZmZXJlZFRyYW5zcG9ydCA9IHJlcXVpcmUoJy4vYnVmZmVyZWRfdHJhbnNwb3J0Jyk7Cit2YXIgVEpTT05Qcm90b2NvbCA9IHJlcXVpcmUoJy4vanNvbl9wcm90b2NvbCcpOwordmFyIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoJy4vaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yJyk7CisKK3ZhciBjcmVhdGVDbGllbnQgPSByZXF1aXJlKCcuL2NyZWF0ZV9jbGllbnQnKTsKKworZXhwb3J0cy5XU0Nvbm5lY3Rpb24gPSBXU0Nvbm5lY3Rpb247CisKKy8qKgorICogQGNsYXNzCisgKiBAbmFtZSBXU0Nvbm5lY3RPcHRpb25zCisgKiBAcHJvcGVydHkge3N0cmluZ30gdHJhbnNwb3J0IC0gVGhlIFRocmlmdCBsYXllcmVkIHRyYW5zcG9ydCB0byB1c2UgKFRCdWZmZXJlZFRyYW5zcG9ydCwgZXRjKS4KKyAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm90b2NvbCAtIFRoZSBUaHJpZnQgc2VyaWFsaXphdGlvbiBwcm90b2NvbCB0byB1c2UgKFRKU09OUHJvdG9jb2wsIGV0Yy4pLgorICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBUaGUgVVJMIHBhdGggdG8gY29ubmVjdCB0byAoZS5nLiAiLyIsICIvbXlTdmMiLCAiL3RocmlmdC9xdW90ZVN2YyIsIGV0Yy4pLgorICogQHByb3BlcnR5IHtvYmplY3R9IGhlYWRlcnMgLSBBIHN0YW5kYXJkIE5vZGUuanMgaGVhZGVyIGhhc2gsIGFuIG9iamVjdCBoYXNoIGNvbnRhaW5pbmcga2V5L3ZhbHVlCisgKiAgICAgICAgcGFpcnMgd2hlcmUgdGhlIGtleSBpcyB0aGUgaGVhZGVyIG5hbWUgc3RyaW5nIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGhlYWRlciB2YWx1ZSBzdHJpbmcuCisgKiBAcHJvcGVydHkge2Jvb2xlYW59IHNlY3VyZSAtIFRydWUgY2F1c2VzIHRoZSBjb25uZWN0aW9uIHRvIHVzZSB3c3MsIG90aGVyd2lzZSB3cyBpcyB1c2VkLgorICogQHByb3BlcnR5IHtvYmplY3R9IHdzT3B0aW9ucyAtIE9wdGlvbnMgcGFzc2VkIG9uIHRvIFdlYlNvY2tldC4KKyAqIEBleGFtcGxlCisgKiAgICAgLy9Vc2UgYSBzZWN1cmVkIHdlYnNvY2tldCBjb25uZWN0aW9uCisgKiAgICAgLy8gIHVzZXMgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBsYXllciwgdXNlcyB0aGUgSlNPTiBwcm90b2NvbCBhbmQgZGlyZWN0cyBSUEMgdHJhZmZpYworICogICAgIC8vICB0byB3c3M6Ly90aHJpZnQuZXhhbXBsZS5jb206OTA5MC9oZWxsbworICogICAgIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKKyAqICAgICB2YXIgb3B0aW9ucyA9IHsKKyAqICAgICAgICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgKiAgICAgICAgcHJvdG9jb2w6IHRocmlmdC5USlNPTlByb3RvY29sLAorICogICAgICAgIHBhdGg6ICIvaGVsbG8iLAorICogICAgICAgIHNlY3VyZTogdHJ1ZQorICogICAgIH07CisgKiAgICAgdmFyIGNvbiA9IHRocmlmdC5jcmVhdGVXU0Nvbm5lY3Rpb24oInRocmlmdC5leGFtcGxlLmNvbSIsIDkwOTAsIG9wdGlvbnMpOworICogICAgIGNvbi5vcGVuKCkKKyAqICAgICB2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZVdTQ2xpZW50KG15U2VydmljZSwgY29ubmVjdGlvbik7CisgKiAgICAgY2xpZW50Lm15U2VydmljZUZ1bmN0aW9uKCk7CisgKiAgICAgY29uLmNsb3NlKCkKKyAqLworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVGhyaWZ0IFdTQ29ubmVjdGlvbiBpbnN0YW5jZSAodXNlIGNyZWF0ZVdTQ29ubmVjdGlvbigpIHJhdGhlciB0aGFuCisgKiAgICBpbnN0YW50aWF0aW5nIGRpcmVjdGx5KS4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIG9yIElQIHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBUQ1AgcG9ydCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtXU0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCisgKiBAdGhyb3dzIHtlcnJvcn0gRXhjZXB0aW9ucyBvdGhlciB0aGFuIHR0cmFuc3BvcnQuSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIGFyZSByZXRocm93bgorICogQGV2ZW50IHtlcnJvcn0gVGhlICJlcnJvciIgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIE5vZGUuanMgZXJyb3IgZXZlbnQgb2NjdXJzIGR1cmluZworICogICAgIHJlcXVlc3Qgb3IgcmVzcG9uc2UgcHJvY2Vzc2luZywgaW4gd2hpY2ggY2FzZSB0aGUgbm9kZSBlcnJvciBpcyBwYXNzZWQgb24uIEFuICJlcnJvciIKKyAqICAgICBldmVudCBtYXkgYWxzbyBiZSBmaXJlZCB3aGVuIHRoZSBjb25uZWN0aXNvbiBjYW4gbm90IG1hcCBhIHJlc3BvbnNlIGJhY2sgdG8gdGhlCisgKiAgICAgYXBwcm9wcmlhdGUgY2xpZW50IChhbiBpbnRlcm5hbCBlcnJvciksIGdlbmVyYXRpbmcgYSBUQXBwbGljYXRpb25FeGNlcHRpb24uCisgKiBAY2xhc3NkZXNjIFdTQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgdXNpbmcgV2Vic29ja2V0cy4KKyAqIEBzZWUge0BsaW5rIGNyZWF0ZVdTQ29ubmVjdGlvbn0KKyAqLworZnVuY3Rpb24gV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CisgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOworCisgIC8vU2V0IGNvbmZpZ3VyYXRpb24KKyAgdmFyIHNlbGYgPSB0aGlzOworICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OworICB0aGlzLmhvc3QgPSBob3N0OworICB0aGlzLnBvcnQgPSBwb3J0OworICB0aGlzLnNlY3VyZSA9IHRoaXMub3B0aW9ucy5zZWN1cmUgfHwgZmFsc2U7CisgIHRoaXMudHJhbnNwb3J0ID0gdGhpcy5vcHRpb25zLnRyYW5zcG9ydCB8fCBUQnVmZmVyZWRUcmFuc3BvcnQ7CisgIHRoaXMucHJvdG9jb2wgPSB0aGlzLm9wdGlvbnMucHJvdG9jb2wgfHwgVEpTT05Qcm90b2NvbDsKKyAgdGhpcy5wYXRoID0gdGhpcy5vcHRpb25zLnBhdGg7CisgIHRoaXMuc2VuZF9wZW5kaW5nID0gW107CisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworCisgIC8vUHJlcGFyZSBXZWJTb2NrZXQgb3B0aW9ucworICB0aGlzLndzT3B0aW9ucyA9IHsKKyAgICBob3N0OiB0aGlzLmhvc3QsCisgICAgcG9ydDogdGhpcy5wb3J0IHx8IDgwLAorICAgIHBhdGg6IHRoaXMub3B0aW9ucy5wYXRoIHx8ICcvJywKKyAgICBoZWFkZXJzOiB0aGlzLm9wdGlvbnMuaGVhZGVycyB8fCB7fQorICB9OworICBmb3IgKHZhciBhdHRybmFtZSBpbiB0aGlzLm9wdGlvbnMud3NPcHRpb25zKSB7CisgICAgdGhpcy53c09wdGlvbnNbYXR0cm5hbWVdID0gdGhpcy5vcHRpb25zLndzT3B0aW9uc1thdHRybmFtZV07CisgIH0KK307Cit1dGlsLmluaGVyaXRzKFdTQ29ubmVjdGlvbiwgRXZlbnRFbWl0dGVyKTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX3Jlc2V0ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuc29ja2V0ID0gbnVsbDsgLy9UaGUgd2ViIHNvY2tldAorICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOyAvL0J1ZmZlcnMvQ2FsbGJhY2sgcGFpcnMgd2FpdGluZyB0byBiZSBzZW50Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fb25PcGVuID0gZnVuY3Rpb24oKSB7CisgIHZhciBzZWxmID0gdGhpczsKKyAgdGhpcy5lbWl0KCJvcGVuIik7CisgIGlmICh0aGlzLnNlbmRfcGVuZGluZy5sZW5ndGggPiAwKSB7CisgICAgLy9JZiB0aGUgdXNlciBtYWRlIGNhbGxzIGJlZm9yZSB0aGUgY29ubmVjdGlvbiB3YXMgZnVsbHkKKyAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICB0aGlzLnNlbmRfcGVuZGluZy5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEpIHsKKyAgICAgIHNlbGYuc29ja2V0LnNlbmQoZGF0YSk7CisgICAgfSk7CisgICAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsKKyAgfQorfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uQ2xvc2UgPSBmdW5jdGlvbihldnQpIHsKKyAgdGhpcy5lbWl0KCJjbG9zZSIpOworICB0aGlzLl9fcmVzZXQoKTsKK307CisKK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuX19kZWNvZGVDYWxsYmFjayA9IGZ1bmN0aW9uKHRyYW5zcG9ydF93aXRoX2RhdGEpIHsKKyAgdmFyIHByb3RvID0gbmV3IHRoaXMucHJvdG9jb2wodHJhbnNwb3J0X3dpdGhfZGF0YSk7CisgIHRyeSB7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIHZhciBoZWFkZXIgPSBwcm90by5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICB2YXIgZHVtbXlfc2VxaWQgPSBoZWFkZXIucnNlcWlkICogLTE7CisgICAgICB2YXIgY2xpZW50ID0gdGhpcy5jbGllbnQ7CisgICAgICAvL1RoZSBNdWx0aXBsZXhlZCBQcm90b2NvbCBzdG9yZXMgYSBoYXNoIG9mIHNlcWlkIHRvIHNlcnZpY2UgbmFtZXMKKyAgICAgIC8vICBpbiBzZXFJZDJTZXJ2aWNlLiBJZiB0aGUgU2VxSWQgaXMgZm91bmQgaW4gdGhlIGhhc2ggd2UgbmVlZCB0bworICAgICAgLy8gIGxvb2t1cCB0aGUgYXBwcm9wcmlhdGUgY2xpZW50IGZvciB0aGlzIGNhbGwuCisgICAgICAvLyAgVGhlIGNsaWVudCB2YXIgaXMgYSBzaW5nbGUgY2xpZW50IG9iamVjdCB3aGVuIG5vdCBtdWx0aXBsZXhpbmcsCisgICAgICAvLyAgd2hlbiB1c2luZyBtdWx0aXBsZXhpbmcgaXQgaXMgYSBzZXJ2aWNlIG5hbWUga2V5ZWQgaGFzaCBvZiBjbGllbnQKKyAgICAgIC8vICBvYmplY3RzLgorICAgICAgLy9OT1RFOiBUaGUgMiB3YXkgaW50ZXJkZXBlbmRlbmNpZXMgYmV0d2VlbiBwcm90b2NvbHMsIHRyYW5zcG9ydHMsCisgICAgICAvLyAgY29ubmVjdGlvbnMgYW5kIGNsaWVudHMgaW4gdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gYXJlIGlycmVndWxhcgorICAgICAgLy8gIGFuZCBtYWtlIHRoZSBpbXBsZW1lbnRhdGlvbiBkaWZmaWN1bHQgdG8gZXh0ZW5kIGFuZCBtYWludGFpbi4gV2UKKyAgICAgIC8vICBzaG91bGQgYnJpbmcgdGhpcyBzdHVmZiBpbmxpbmUgd2l0aCB0eXBpY2FsIHRocmlmdCBJL08gc3RhY2sKKyAgICAgIC8vICBvcGVyYXRpb24gc29vbi4KKyAgICAgIC8vICAtLXJhCisgICAgICB2YXIgc2VydmljZV9uYW1lID0gdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgaWYgKHNlcnZpY2VfbmFtZSkgeworICAgICAgICBjbGllbnQgPSB0aGlzLmNsaWVudFtzZXJ2aWNlX25hbWVdOworICAgICAgICBkZWxldGUgdGhpcy5zZXFJZDJTZXJ2aWNlW2hlYWRlci5yc2VxaWRdOworICAgICAgfQorICAgICAgLypqc2hpbnQgLVcwODMgKi8KKyAgICAgIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF0gPSBmdW5jdGlvbihlcnIsIHN1Y2Nlc3MpIHsKKyAgICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5jb21taXRQb3NpdGlvbigpOworICAgICAgICB2YXIgY2xpZW50Q2FsbGJhY2sgPSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGRlbGV0ZSBjbGllbnQuX3JlcXNbaGVhZGVyLnJzZXFpZF07CisgICAgICAgIGlmIChjbGllbnRDYWxsYmFjaykgeworICAgICAgICAgIGNsaWVudENhbGxiYWNrKGVyciwgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICAvKmpzaGludCArVzA4MyAqLworICAgICAgaWYgKGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXSkgeworICAgICAgICBjbGllbnRbJ3JlY3ZfJyArIGhlYWRlci5mbmFtZV0ocHJvdG8sIGhlYWRlci5tdHlwZSwgZHVtbXlfc2VxaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1tkdW1teV9zZXFpZF07CisgICAgICAgIHRoaXMuZW1pdCgiZXJyb3IiLAorICAgICAgICAgIG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUuV1JPTkdfTUVUSE9EX05BTUUsCisgICAgICAgICAgICAiUmVjZWl2ZWQgYSByZXNwb25zZSB0byBhbiB1bmtub3duIFJQQyBmdW5jdGlvbiIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBpZiAoZSBpbnN0YW5jZW9mIElucHV0QnVmZmVyVW5kZXJydW5FcnJvcikgeworICAgICAgdHJhbnNwb3J0X3dpdGhfZGF0YS5yb2xsYmFja1Bvc2l0aW9uKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IGU7CisgICAgfQorICB9Cit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fb25EYXRhID0gZnVuY3Rpb24oZGF0YSkgeworICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGRhdGEpID09ICJbb2JqZWN0IEFycmF5QnVmZmVyXSIpIHsKKyAgICBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7CisgIH0KKyAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIoZGF0YSk7CisgIHRoaXMudHJhbnNwb3J0LnJlY2VpdmVyKHRoaXMuX19kZWNvZGVDYWxsYmFjay5iaW5kKHRoaXMpKShidWYpOworCit9OworCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLl9fb25NZXNzYWdlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuX19vbkRhdGEoZXZ0LmRhdGEpOworfTsKKworV1NDb25uZWN0aW9uLnByb3RvdHlwZS5fX29uRXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgdGhpcy5lbWl0KCJlcnJvciIsIGV2dCk7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge2Jvb2xlYW59CisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlID09IHRoaXMuc29ja2V0Lk9QRU47Cit9OworCisvKioKKyAqIE9wZW5zIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHsKKyAgLy9JZiBPUEVOL0NPTk5FQ1RJTkcvQ0xPU0lORyBpZ25vcmUgYWRkaXRpb25hbCBvcGVucworICBpZiAodGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSAhPSB0aGlzLnNvY2tldC5DTE9TRUQpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy9JZiB0aGVyZSBpcyBubyBzb2NrZXQgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQ6CisgIHRoaXMuc29ja2V0ID0gbmV3IFdlYlNvY2tldCh0aGlzLnVyaSgpLCAiIiwgdGhpcy53c09wdGlvbnMpOworICB0aGlzLnNvY2tldC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJzsKKyAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7CisgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKK307CisKKy8qKgorICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICovCitXU0Nvbm5lY3Rpb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuc29ja2V0LmNsb3NlKCk7Cit9OworCisvKioKKyAqIFJldHVybiBVUkkgZm9yIHRoZSBjb25uZWN0aW9uCisgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkkKKyAqLworV1NDb25uZWN0aW9uLnByb3RvdHlwZS51cmkgPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNjaGVtYSA9IHRoaXMuc2VjdXJlID8gJ3dzcycgOiAnd3MnOworICB2YXIgcG9ydCA9ICcnOworICB2YXIgcGF0aCA9IHRoaXMucGF0aCB8fCAnLyc7CisgIHZhciBob3N0ID0gdGhpcy5ob3N0OworCisgIC8vIGF2b2lkIHBvcnQgaWYgZGVmYXVsdCBmb3Igc2NoZW1hCisgIGlmICh0aGlzLnBvcnQgJiYgKCgnd3NzJyA9PSBzY2hlbWEgJiYgdGhpcy5wb3J0ICE9IDQ0MykgfHwKKyAgICAoJ3dzJyA9PSBzY2hlbWEgJiYgdGhpcy5wb3J0ICE9IDgwKSkpIHsKKyAgICBwb3J0ID0gJzonICsgdGhpcy5wb3J0OworICB9CisKKyAgcmV0dXJuIHNjaGVtYSArICc6Ly8nICsgaG9zdCArIHBvcnQgKyBwYXRoOworfTsKKworLyoqCisgKiBXcml0ZXMgVGhyaWZ0IG1lc3NhZ2UgZGF0YSB0byB0aGUgY29ubmVjdGlvbgorICogQHBhcmFtIHtCdWZmZXJ9IGRhdGEgLSBBIE5vZGUuanMgQnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEByZXR1cm5zIHt2b2lkfSBObyByZXR1cm4gdmFsdWUuCisgKiBAZXZlbnQge2Vycm9yfSB0aGUgImVycm9yIiBldmVudCBpcyByYWlzZWQgdXBvbiByZXF1ZXN0IGZhaWx1cmUgcGFzc2luZyB0aGUKKyAqICAgICBOb2RlLmpzIGVycm9yIG9iamVjdCB0byB0aGUgbGlzdGVuZXIuCisgKi8KK1dTQ29ubmVjdGlvbi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkYXRhKSB7CisgIGlmICh0aGlzLmlzT3BlbigpKSB7CisgICAgLy9TZW5kIGRhdGEgYW5kIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gaW52b2tlIHRoZSBjbGllbnQgY2FsbGJhY2sKKyAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpOworICB9IGVsc2UgeworICAgIC8vUXVldWUgdGhlIHNlbmQgdG8gZ28gb3V0IF9fb25PcGVuCisgICAgdGhpcy5zZW5kX3BlbmRpbmcucHVzaChkYXRhKTsKKyAgfQorfTsKKworLyoqCisgKiBDcmVhdGVzIGEgbmV3IFdTQ29ubmVjdGlvbiBvYmplY3QsIHVzZWQgYnkgVGhyaWZ0IGNsaWVudHMgdG8gY29ubmVjdAorICogICAgdG8gVGhyaWZ0IEhUVFAgYmFzZWQgc2VydmVycy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBob3N0IC0gVGhlIGhvc3QgbmFtZSBvciBJUCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtudW1iZXJ9IHBvcnQgLSBUaGUgVENQIHBvcnQgdG8gY29ubmVjdCB0by4KKyAqIEBwYXJhbSB7V1NDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHJldHVybnMge1dTQ29ubmVjdGlvbn0gVGhlIGNvbm5lY3Rpb24gb2JqZWN0LgorICogQHNlZSB7QGxpbmsgV1NDb25uZWN0T3B0aW9uc30KKyAqLworZXhwb3J0cy5jcmVhdGVXU0Nvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHJldHVybiBuZXcgV1NDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpOworfTsKKworZXhwb3J0cy5jcmVhdGVXU0NsaWVudCA9IGNyZWF0ZUNsaWVudDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93c190cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MTNiODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOworCittb2R1bGUuZXhwb3J0cyA9IFRXZWJTb2NrZXRUcmFuc3BvcnQ7CisKKy8qKgorICogQ29uc3RydWN0b3IgRnVuY3Rpb24gZm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LgorICogQGNvbnN0cnVjdG9yCisgKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCisgKiBAY2xhc3NkZXNjIFRoZSBBcGFjaGUgVGhyaWZ0IFRyYW5zcG9ydCBsYXllciBwZXJmb3JtcyBieXRlIGxldmVsIEkvTworICogYmV0d2VlbiBSUEMgY2xpZW50cyBhbmQgc2VydmVycy4gVGhlIEphdmFTY3JpcHQgVFdlYlNvY2tldFRyYW5zcG9ydCBvYmplY3QKKyAqIHVzZXMgdGhlIFdlYlNvY2tldCBwcm90b2NvbC4gVGFyZ2V0IHNlcnZlcnMgbXVzdCBpbXBsZW1lbnQgV2ViU29ja2V0LgorICogKHNlZTogbm9kZS5qcyBleGFtcGxlIHNlcnZlcl9odHRwLmpzKS4KKyAqIEBleGFtcGxlCisgKiAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRXZWJTb2NrZXRUcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NSIpOworICovCitmdW5jdGlvbiBUV2ViU29ja2V0VHJhbnNwb3J0KHVybCkgeworICAgIHRoaXMuX19yZXNldCh1cmwpOworfTsKKworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX3Jlc2V0ID0gZnVuY3Rpb24odXJsKSB7CisgIHRoaXMudXJsID0gdXJsOyAgICAgICAgICAgICAvL1doZXJlIHRvIGNvbm5lY3QKKyAgdGhpcy5zb2NrZXQgPSBudWxsOyAgICAgICAgIC8vVGhlIHdlYiBzb2NrZXQKKyAgdGhpcy5jYWxsYmFja3MgPSBbXTsgICAgICAgIC8vUGVuZGluZyBjYWxsYmFja3MKKyAgdGhpcy5zZW5kX3BlbmRpbmcgPSBbXTsgICAgIC8vQnVmZmVycy9DYWxsYmFjayBwYWlycyB3YWl0aW5nIHRvIGJlIHNlbnQKKyAgdGhpcy5zZW5kX2J1ZiA9ICcnOyAgICAgICAgIC8vT3V0Ym91bmQgZGF0YSwgaW1tdXRhYmxlIHVudGlsIHNlbnQKKyAgdGhpcy5yZWN2X2J1ZiA9ICcnOyAgICAgICAgIC8vSW5ib3VuZCBkYXRhCisgIHRoaXMucmJfd3BvcyA9IDA7ICAgICAgICAgICAvL05ldHdvcmsgd3JpdGUgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKKyAgdGhpcy5yYl9ycG9zID0gMDsgICAgICAgICAgIC8vQ2xpZW50IHJlYWQgcG9zaXRpb24gaW4gcmVjZWl2ZSBidWZmZXIKK307CisKKy8qKgorICogU2VuZHMgdGhlIGN1cnJlbnQgV1MgcmVxdWVzdCBhbmQgcmVnaXN0ZXJzIGNhbGxiYWNrLiBUaGUgYXN5bmMKKyAqIHBhcmFtZXRlciBpcyBpZ25vcmVkIChXUyBmbHVzaCBpcyBhbHdheXMgYXN5bmMpIGFuZCB0aGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KKyAqIEBwYXJhbSB7b2JqZWN0fSBhc3luYyAtIElnbm9yZWQuCisgKiBAcGFyYW0ge29iamVjdH0gY2FsbGJhY2sgLSBUaGUgY2xpZW50IGNvbXBsZXRpb24gY2FsbGJhY2suCisgKiBAcmV0dXJucyB7dW5kZWZpbmVkfHN0cmluZ30gTm90aGluZyAodW5kZWZpbmVkKQorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5mbHVzaCA9IGZ1bmN0aW9uKGFzeW5jLCBjYWxsYmFjaykgeworICB2YXIgc2VsZiA9IHRoaXM7CisgIGlmICh0aGlzLmlzT3BlbigpKSB7CisgICAgLy9TZW5kIGRhdGEgYW5kIHJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gaW52b2tlIHRoZSBjbGllbnQgY2FsbGJhY2sKKyAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuc2VuZF9idWYpOworICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICByZXR1cm4gZnVuY3Rpb24obXNnKSB7CisgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOworICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgfTsKKyAgICB9KCkpKTsKKyAgfSBlbHNlIHsKKyAgICAvL1F1ZXVlIHRoZSBzZW5kIHRvIGdvIG91dCBfX29uT3BlbgorICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goeworICAgICAgYnVmOiB0aGlzLnNlbmRfYnVmLAorICAgICAgY2I6ICBjYWxsYmFjaworICAgIH0pOworICB9Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uT3BlbiA9IGZ1bmN0aW9uKCkgeworICAgdmFyIHNlbGYgPSB0aGlzOworICAgaWYgKHRoaXMuc2VuZF9wZW5kaW5nLmxlbmd0aCA+IDApIHsKKyAgICAgIC8vSWYgdGhlIHVzZXIgbWFkZSBjYWxscyBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gd2FzIGZ1bGx5CisgICAgICAvL29wZW4sIHNlbmQgdGhlbSBub3cKKyAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24oZWxlbSkgeworICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChlbGVtLmJ1Zik7CisgICAgICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKChmdW5jdGlvbigpIHsKKyAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKKyAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgeworICAgICAgICAgICAgICBzZWxmLnNldFJlY3ZCdWZmZXIobXNnKTsKKyAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgfTsKKyAgICAgICAgIH0oKSkpOworICAgICAgfSk7CisgICAgICB0aGlzLnNlbmRfcGVuZGluZyA9IFtdOworICAgfQorfTsKKworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbkNsb3NlID0gZnVuY3Rpb24oZXZ0KSB7CisgIHRoaXMuX19yZXNldCh0aGlzLnVybCk7Cit9OworCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5fX29uTWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICBpZiAodGhpcy5jYWxsYmFja3MubGVuZ3RoKSB7CisgICAgdGhpcy5jYWxsYmFja3Muc2hpZnQoKShldnQuZGF0YSk7CisgIH0KK307CisKK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLl9fb25FcnJvciA9IGZ1bmN0aW9uKGV2dCkgeworICBsb2cuZXJyb3IoJ3dlYnNvY2tldDogJyArIGV2dC50b1N0cmluZygpKTsKKyAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKK307CisKKy8qKgorICogU2V0cyB0aGUgYnVmZmVyIHRvIHVzZSB3aGVuIHJlY2VpdmluZyBzZXJ2ZXIgcmVzcG9uc2VzLgorICogQHBhcmFtIHtzdHJpbmd9IGJ1ZiAtIFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBzZXJ2ZXIgcmVzcG9uc2VzLgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5zZXRSZWN2QnVmZmVyID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMucmVjdl9idWYgPSBidWY7CisgIHRoaXMucmVjdl9idWZfc3ogPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy53cG9zID0gdGhpcy5yZWN2X2J1Zi5sZW5ndGg7CisgIHRoaXMucnBvcyA9IDA7Cit9OworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIG9wZW4KKyAqIEByZWFkb25seQorICogQHJldHVybnMge2Jvb2xlYW59CisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLmlzT3BlbiA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zb2NrZXQgJiYgdGhpcy5zb2NrZXQucmVhZHlTdGF0ZSA9PSB0aGlzLnNvY2tldC5PUEVOOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24KKyAqLworVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkgeworICAvL0lmIE9QRU4vQ09OTkVDVElORy9DTE9TSU5HIGlnbm9yZSBhZGRpdGlvbmFsIG9wZW5zCisgIGlmICh0aGlzLnNvY2tldCAmJiB0aGlzLnNvY2tldC5yZWFkeVN0YXRlICE9IHRoaXMuc29ja2V0LkNMT1NFRCkgeworICAgIHJldHVybjsKKyAgfQorICAvL0lmIHRoZXJlIGlzIG5vIHNvY2tldCBvciB0aGUgc29ja2V0IGlzIGNsb3NlZDoKKyAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsKTsKKyAgdGhpcy5zb2NrZXQub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcyk7CisgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSB0aGlzLl9fb25FcnJvci5iaW5kKHRoaXMpOworICB0aGlzLnNvY2tldC5vbmNsb3NlID0gdGhpcy5fX29uQ2xvc2UuYmluZCh0aGlzKTsKK307CisKKy8qKgorICogQ2xvc2VzIHRoZSB0cmFuc3BvcnQgY29ubmVjdGlvbgorICovCitUV2ViU29ja2V0VHJhbnNwb3J0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkgeworICB0aGlzLnNvY2tldC5jbG9zZSgpOworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAqIGJ1ZmZlci4KKyAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsKKyAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgIGlmIChhdmFpbCA9PT0gMCkgeworICAgIHJldHVybiAnJzsKKyAgfQorCisgIHZhciBnaXZlID0gbGVuOworCisgIGlmIChhdmFpbCA8IGxlbikgeworICAgIGdpdmUgPSBhdmFpbDsKKyAgfQorCisgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOworICB0aGlzLnJwb3MgKz0gZ2l2ZTsKKworICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPworICByZXR1cm4gcmV0OworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLnJlYWRBbGwgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVjdl9idWY7Cit9OworCisvKioKKyAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMuc2VuZF9idWYgPSBidWY7Cit9OworCisvKioKKyAqIFJldHVybnMgdGhlIHNlbmQgYnVmZmVyLgorICogQHJlYWRvbmx5CisgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2VuZCBidWZmZXIuCisgKi8KK1RXZWJTb2NrZXRUcmFuc3BvcnQucHJvdG90eXBlLmdldFNlbmRCdWZmZXIgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMuc2VuZF9idWY7Cit9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3hocl9jb25uZWN0aW9uLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTljOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQveGhyX2Nvbm5lY3Rpb24uanMKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3ZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwordmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjsKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOworCit2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKK3ZhciBUSlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7Cit2YXIgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yID0gcmVxdWlyZSgnLi9pbnB1dF9idWZmZXJfdW5kZXJydW5fZXJyb3InKTsKKwordmFyIGNyZWF0ZUNsaWVudCA9IHJlcXVpcmUoJy4vY3JlYXRlX2NsaWVudCcpOworCitleHBvcnRzLlhIUkNvbm5lY3Rpb24gPSBYSFJDb25uZWN0aW9uOworCisvKioKKyAqIENvbnN0cnVjdG9yIEZ1bmN0aW9uIGZvciB0aGUgWEhSIENvbm5lY3Rpb24uCisgKiBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBob3N0IGFuZCBwb3J0IHRoZW4gWEhSQ29ubmVjdGlvbiB3aWxsIGRlZmF1bHQgdG8gdGhlCisgKiBob3N0IGFuZCBwb3J0IG9mIHRoZSBwYWdlIGZyb20gd2hpY2ggdGhpcyBqYXZhc2NyaXB0IGlzIHNlcnZlZC4KKyAqIEBjb25zdHJ1Y3RvcgorICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVGhlIFVSTCB0byBjb25uZWN0IHRvLgorICogQGNsYXNzZGVzYyBUWEhSQ29ubmVjdGlvbiBvYmplY3RzIHByb3ZpZGUgVGhyaWZ0IGVuZCBwb2ludCB0cmFuc3BvcnQKKyAqICAgICBzZW1hbnRpY3MgaW1wbGVtZW50ZWQgdXNpbmcgWEhSLgorICogQGV4YW1wbGUKKyAqICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UWEhSQ29ubmVjdGlvbignbG9jYWxob3N0JywgOTA5OSwge30pOworICovCitmdW5jdGlvbiBYSFJDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKKyAgdGhpcy53cG9zID0gMDsKKyAgdGhpcy5ycG9zID0gMDsKKyAgdGhpcy51c2VDT1JTID0gKG9wdGlvbnMgJiYgb3B0aW9ucy51c2VDT1JTKTsKKyAgdGhpcy5zZW5kX2J1ZiA9ICcnOworICB0aGlzLnJlY3ZfYnVmID0gJyc7CisgIHRoaXMudHJhbnNwb3J0ID0gb3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OworICB0aGlzLnByb3RvY29sID0gb3B0aW9ucy5wcm90b2NvbCB8fCBUSlNPTlByb3RvY29sOworICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307CisKKyAgaG9zdCA9IGhvc3QgfHwgd2luZG93LmxvY2F0aW9uLmhvc3Q7CisgIHBvcnQgPSBwb3J0IHx8IHdpbmRvdy5sb2NhdGlvbi5wb3J0OworICB2YXIgcHJlZml4ID0gb3B0aW9ucy5odHRwcyA/ICdodHRwczovLycgOiAnaHR0cDovLyc7CisgIHZhciBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcvJzsKKworICBpZiAocG9ydCA9PT0gJycpIHsKKyAgICBwb3J0ID0gdW5kZWZpbmVkOworICB9CisKKyAgaWYgKCFwb3J0IHx8IHBvcnQgPT09IDgwIHx8IHBvcnQgPT09ICc4MCcpIHsKKyAgICB0aGlzLnVybCA9IHByZWZpeCArIGhvc3QgKyBwYXRoOworICB9IGVsc2UgeworICAgIHRoaXMudXJsID0gcHJlZml4ICsgaG9zdCArICc6JyArIHBvcnQgKyBwYXRoOworICB9CisKKyAgLy9UaGUgc2VxdWVuY2UgbWFwIGlzIHVzZWQgdG8gbWFwIHNlcUlEcyBiYWNrIHRvIHRoZQorICAvLyAgY2FsbGluZyBjbGllbnQgaW4gbXVsdGlwbGV4ZWQgc2NlbmFyaW9zCisgIHRoaXMuc2VxSWQyU2VydmljZSA9IHt9OworfTsKKwordXRpbC5pbmhlcml0cyhYSFJDb25uZWN0aW9uLCBFdmVudEVtaXR0ZXIpOworCisvKioKKyogR2V0cyB0aGUgYnJvd3NlciBzcGVjaWZpYyBYbWxIdHRwUmVxdWVzdCBPYmplY3QuCisqIEByZXR1cm5zIHtvYmplY3R9IHRoZSBicm93c2VyIFhIUiBpbnRlcmZhY2Ugb2JqZWN0CisqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0WG1sSHR0cFJlcXVlc3RPYmplY3QgPSBmdW5jdGlvbigpIHsKKyAgdHJ5IHsgcmV0dXJuIG5ldyBYTUxIdHRwUmVxdWVzdCgpOyB9IGNhdGNoIChlMSkgeyB9CisgIHRyeSB7IHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgnTXN4bWwyLlhNTEhUVFAnKTsgfSBjYXRjaCAoZTIpIHsgfQorICB0cnkgeyByZXR1cm4gbmV3IEFjdGl2ZVhPYmplY3QoJ01pY3Jvc29mdC5YTUxIVFRQJyk7IH0gY2F0Y2ggKGUzKSB7IH0KKworICB0aHJvdyAiWW91ciBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBYSFIuIjsKK307CisKKy8qKgorICogU2VuZHMgdGhlIGN1cnJlbnQgWFJIIHJlcXVlc3QgaWYgdGhlIHRyYW5zcG9ydCB3YXMgY3JlYXRlZCB3aXRoIGEgVVJMCisgKiBhbmQgdGhlIGFzeW5jIHBhcmFtZXRlciBpcyBmYWxzZS4gSWYgdGhlIHRyYW5zcG9ydCB3YXMgbm90IGNyZWF0ZWQgd2l0aAorICogYSBVUkwsIG9yIHRoZSBhc3luYyBwYXJhbWV0ZXIgaXMgVHJ1ZSBhbmQgbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWQsIG9yCisgKiB0aGUgVVJMIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIgaXMgcmV0dXJuZWQuCisgKiBAcGFyYW0ge29iamVjdH0gYXN5bmMgLSBJZiB0cnVlIHRoZSBjdXJyZW50IHNlbmQgYnVmZmVyIGlzIHJldHVybmVkLgorICogQHBhcmFtIHtvYmplY3R9IGNhbGxiYWNrIC0gT3B0aW9uYWwgYXN5bmMgY29tcGxldGlvbiBjYWxsYmFjaworICogQHJldHVybnMge3VuZGVmaW5lZHxzdHJpbmd9IE5vdGhpbmcgb3IgdGhlIGN1cnJlbnQgc2VuZCBidWZmZXIuCisgKiBAdGhyb3dzIHtzdHJpbmd9IElmIFhIUiBmYWlscy4KKyAqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBpZiAodGhpcy51cmwgPT09IHVuZGVmaW5lZCB8fCB0aGlzLnVybCA9PT0gJycpIHsKKyAgICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKKyAgfQorCisgIHZhciB4cmVxID0gdGhpcy5nZXRYbWxIdHRwUmVxdWVzdE9iamVjdCgpOworCisgIGlmICh4cmVxLm92ZXJyaWRlTWltZVR5cGUpIHsKKyAgICB4cmVxLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL2pzb24nKTsKKyAgfQorCisgIHhyZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CisgICAgaWYgKHRoaXMucmVhZHlTdGF0ZSA9PSA0ICYmIHRoaXMuc3RhdHVzID09IDIwMCkgeworICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKHRoaXMucmVzcG9uc2VUZXh0KTsKKyAgICB9CisgIH07CisKKyAgeHJlcS5vcGVuKCdQT1NUJywgdGhpcy51cmwsIHRydWUpOworCisgIE9iamVjdC5rZXlzKHRoaXMuaGVhZGVycykuZm9yRWFjaChmdW5jdGlvbihoZWFkZXJLZXkpIHsKKyAgICB4cmVxLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyS2V5LCBzZWxmLmhlYWRlcnNbaGVhZGVyS2V5XSk7CisgIH0pOworCisgIHhyZXEuc2VuZCh0aGlzLnNlbmRfYnVmKTsKK307CisKKy8qKgorICogU2V0cyB0aGUgYnVmZmVyIHRvIHByb3ZpZGUgdGhlIHByb3RvY29sIHdoZW4gZGVzZXJpYWxpemluZy4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHN1cHBseSB0aGUgcHJvdG9jb2wuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLnNldFJlY3ZCdWZmZXIgPSBmdW5jdGlvbihidWYpIHsKKyAgdGhpcy5yZWN2X2J1ZiA9IGJ1ZjsKKyAgdGhpcy5yZWN2X2J1Zl9zeiA9IHRoaXMucmVjdl9idWYubGVuZ3RoOworICB0aGlzLndwb3MgPSB0aGlzLnJlY3ZfYnVmLmxlbmd0aDsKKyAgdGhpcy5ycG9zID0gMDsKKworICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGJ1ZikgPT0gIltvYmplY3QgQXJyYXlCdWZmZXJdIikgeworICAgIHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYnVmKTsKKyAgfQorICB2YXIgdGhpbmcgPSBuZXcgQnVmZmVyKGRhdGEgfHwgYnVmKTsKKworICB0aGlzLnRyYW5zcG9ydC5yZWNlaXZlcih0aGlzLl9fZGVjb2RlQ2FsbGJhY2suYmluZCh0aGlzKSkodGhpbmcpOworCit9OworCitYSFJDb25uZWN0aW9uLnByb3RvdHlwZS5fX2RlY29kZUNhbGxiYWNrID0gZnVuY3Rpb24odHJhbnNwb3J0X3dpdGhfZGF0YSkgeworICB2YXIgcHJvdG8gPSBuZXcgdGhpcy5wcm90b2NvbCh0cmFuc3BvcnRfd2l0aF9kYXRhKTsKKyAgdHJ5IHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgdmFyIGhlYWRlciA9IHByb3RvLnJlYWRNZXNzYWdlQmVnaW4oKTsKKyAgICAgIHZhciBkdW1teV9zZXFpZCA9IGhlYWRlci5yc2VxaWQgKiAtMTsKKyAgICAgIHZhciBjbGllbnQgPSB0aGlzLmNsaWVudDsKKyAgICAgIC8vVGhlIE11bHRpcGxleGVkIFByb3RvY29sIHN0b3JlcyBhIGhhc2ggb2Ygc2VxaWQgdG8gc2VydmljZSBuYW1lcworICAgICAgLy8gIGluIHNlcUlkMlNlcnZpY2UuIElmIHRoZSBTZXFJZCBpcyBmb3VuZCBpbiB0aGUgaGFzaCB3ZSBuZWVkIHRvCisgICAgICAvLyAgbG9va3VwIHRoZSBhcHByb3ByaWF0ZSBjbGllbnQgZm9yIHRoaXMgY2FsbC4KKyAgICAgIC8vICBUaGUgY2xpZW50IHZhciBpcyBhIHNpbmdsZSBjbGllbnQgb2JqZWN0IHdoZW4gbm90IG11bHRpcGxleGluZywKKyAgICAgIC8vICB3aGVuIHVzaW5nIG11bHRpcGxleGluZyBpdCBpcyBhIHNlcnZpY2UgbmFtZSBrZXllZCBoYXNoIG9mIGNsaWVudAorICAgICAgLy8gIG9iamVjdHMuCisgICAgICAvL05PVEU6IFRoZSAyIHdheSBpbnRlcmRlcGVuZGVuY2llcyBiZXR3ZWVuIHByb3RvY29scywgdHJhbnNwb3J0cywKKyAgICAgIC8vICBjb25uZWN0aW9ucyBhbmQgY2xpZW50cyBpbiB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBhcmUgaXJyZWd1bGFyCisgICAgICAvLyAgYW5kIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIGRpZmZpY3VsdCB0byBleHRlbmQgYW5kIG1haW50YWluLiBXZQorICAgICAgLy8gIHNob3VsZCBicmluZyB0aGlzIHN0dWZmIGlubGluZSB3aXRoIHR5cGljYWwgdGhyaWZ0IEkvTyBzdGFjaworICAgICAgLy8gIG9wZXJhdGlvbiBzb29uLgorICAgICAgLy8gIC0tcmEKKyAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSB0aGlzLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICBpZiAoc2VydmljZV9uYW1lKSB7CisgICAgICAgIGNsaWVudCA9IHRoaXMuY2xpZW50W3NlcnZpY2VfbmFtZV07CisgICAgICAgIGRlbGV0ZSB0aGlzLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICB9CisgICAgICAvKmpzaGludCAtVzA4MyAqLworICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2VzcykgeworICAgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLmNvbW1pdFBvc2l0aW9uKCk7CisgICAgICAgIHZhciBjbGllbnRDYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgZGVsZXRlIGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKKyAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgY2xpZW50Q2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKKyAgICAgICAgfQorICAgICAgfTsKKyAgICAgIC8qanNoaW50ICtXMDgzICovCisgICAgICBpZiAoY2xpZW50WydyZWN2XycgKyBoZWFkZXIuZm5hbWVdKSB7CisgICAgICAgIGNsaWVudFsncmVjdl8nICsgaGVhZGVyLmZuYW1lXShwcm90bywgaGVhZGVyLm10eXBlLCBkdW1teV9zZXFpZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXTsKKyAgICAgICAgdGhpcy5lbWl0KCJlcnJvciIsCisgICAgICAgICAgbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5XUk9OR19NRVRIT0RfTkFNRSwKKyAgICAgICAgICAgICJSZWNlaXZlZCBhIHJlc3BvbnNlIHRvIGFuIHVua25vd24gUlBDIGZ1bmN0aW9uIikpOworICAgICAgfQorICAgIH0KKyAgfSBjYXRjaCAoZSkgeworICAgIGlmIChlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKSB7CisgICAgICB0cmFuc3BvcnRfd2l0aF9kYXRhLnJvbGxiYWNrUG9zaXRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgZTsKKyAgICB9CisgIH0KK307CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgb3BlbiwgWEhSIGFsd2F5cyByZXR1cm5zIHRydWUuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgVHJ1ZS4KKyAqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7CisgIHJldHVybiB0cnVlOworfTsKKworLyoqCisgKiBPcGVucyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIHdpdGggWEhSIHRoaXMgaXMgYSBub3AuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHt9OworCisvKioKKyAqIENsb3NlcyB0aGUgdHJhbnNwb3J0IGNvbm5lY3Rpb24sIHdpdGggWEhSIHRoaXMgaXMgYSBub3AuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7fTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgcmVzcG9uc2UKKyAqIGJ1ZmZlci4KKyAqIEBwYXJhbSB7bnVtYmVyfSBsZW4gLSBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmV0dXJuLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLnJlYWQgPSBmdW5jdGlvbihsZW4pIHsKKyAgdmFyIGF2YWlsID0gdGhpcy53cG9zIC0gdGhpcy5ycG9zOworCisgIGlmIChhdmFpbCA9PT0gMCkgeworICAgIHJldHVybiAnJzsKKyAgfQorCisgIHZhciBnaXZlID0gbGVuOworCisgIGlmIChhdmFpbCA8IGxlbikgeworICAgIGdpdmUgPSBhdmFpbDsKKyAgfQorCisgIHZhciByZXQgPSB0aGlzLnJlYWRfYnVmLnN1YnN0cih0aGlzLnJwb3MsIGdpdmUpOworICB0aGlzLnJwb3MgKz0gZ2l2ZTsKKworICAvL2NsZWFyIGJ1ZiB3aGVuIGNvbXBsZXRlPworICByZXR1cm4gcmV0OworfTsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBlbnRpcmUgcmVzcG9uc2UgYnVmZmVyLgorICogQHJldHVybnMge3N0cmluZ30gQ2hhcmFjdGVycyBzZW50IGJ5IHRoZSBzZXJ2ZXIuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLnJlYWRBbGwgPSBmdW5jdGlvbigpIHsKKyAgcmV0dXJuIHRoaXMucmVjdl9idWY7Cit9OworCisvKioKKyAqIFNldHMgdGhlIHNlbmQgYnVmZmVyIHRvIGJ1Zi4KKyAqIEBwYXJhbSB7c3RyaW5nfSBidWYgLSBUaGUgYnVmZmVyIHRvIHNlbmQuCisgKi8KK1hIUkNvbm5lY3Rpb24ucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmKSB7CisgIHRoaXMuc2VuZF9idWYgPSBidWY7CisgIHRoaXMuZmx1c2goKTsKK307CisKKy8qKgorICogUmV0dXJucyB0aGUgc2VuZCBidWZmZXIuCisgKiBAcmVhZG9ubHkKKyAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzZW5kIGJ1ZmZlci4KKyAqLworWEhSQ29ubmVjdGlvbi5wcm90b3R5cGUuZ2V0U2VuZEJ1ZmZlciA9IGZ1bmN0aW9uKCkgeworICByZXR1cm4gdGhpcy5zZW5kX2J1ZjsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIG5ldyBUWEhSVHJhbnNwb3J0IG9iamVjdCwgdXNlZCBieSBUaHJpZnQgY2xpZW50cyB0byBjb25uZWN0CisgKiAgICB0byBUaHJpZnQgSFRUUCBiYXNlZCBzZXJ2ZXJzLgorICogQHBhcmFtIHtzdHJpbmd9IGhvc3QgLSBUaGUgaG9zdCBuYW1lIG9yIElQIHRvIGNvbm5lY3QgdG8uCisgKiBAcGFyYW0ge251bWJlcn0gcG9ydCAtIFRoZSBUQ1AgcG9ydCB0byBjb25uZWN0IHRvLgorICogQHBhcmFtIHtYSFJDb25uZWN0T3B0aW9uc30gb3B0aW9ucyAtIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gdXNlLgorICogQHJldHVybnMge1hIUkNvbm5lY3Rpb259IFRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAqIEBzZWUge0BsaW5rIFhIUkNvbm5lY3RPcHRpb25zfQorICovCitleHBvcnRzLmNyZWF0ZVhIUkNvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7CisgIHJldHVybiBuZXcgWEhSQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKK307CisKK2V4cG9ydHMuY3JlYXRlWEhSQ2xpZW50ID0gY3JlYXRlQ2xpZW50OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9wYWNrYWdlLmpzb24gYi9saWIvbm9kZWpzL3BhY2thZ2UuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE1NDQ5ZC4uMDAwMDAwMAotLS0gYS9saWIvbm9kZWpzL3BhY2thZ2UuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLXsKLSAgIm5hbWUiOiAidGhyaWZ0IiwKLSAgImRlc2NyaXB0aW9uIjogIm5vZGUuanMgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iLAotICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIsCi0gICJyZXBvc2l0b3J5IjoKLSAgICB7ICJ0eXBlIiA6ICJzdm4iLAotICAgICAgInVybCIgOiAiaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvIgotICAgIH0sCi0gICJ2ZXJzaW9uIjogIjAuOS4wIiwKLSAgImF1dGhvciI6Ci0gICAgeyAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAotICAgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCi0gICAgICAidXJsIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKLSAgICB9LAotICAibGljZW5zZXMiOgotICAgIFsgeyAidHlwZSI6ICJBcGFjaGUtMi4wIiwKLSAgICAgICAgInVybCI6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCi0gICAgICB9Ci0gICAgXSwKLSAgImJ1Z3MiOgotICAgIHsgIm1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKLSAgICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCi0gICAgfSwKLSAgImRpcmVjdG9yaWVzIiA6IHsgImxpYiIgOiAiLi9saWIvdGhyaWZ0IiB9LAotICAibWFpbiI6ICIuL2xpYi90aHJpZnQiLAotICAiZW5naW5lcyI6IHsgIm5vZGUiOiAiPj0gMC4yLjQiIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODdjZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBiaW5hcnkgPSByZXF1aXJlKCJ0aHJpZnQvYmluYXJ5Iik7CisKK2NvbnN0IGNhc2VzID0geworICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRCeXRlKDB4MDEpKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweGZmKSk7CisKKyAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3ZikpOworICAgIGFzc2VydC5lcXVhbCgtMTI4LCBiaW5hcnkucmVhZEJ5dGUoMHg4MCkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKyAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgLy9Qcm90b2NvbCBzaW1wbHkgd3JpdGVzIHRvIHRoZSBidWZmZXIuIE5vdGhpbmcgdG8gdGVzdC4uIHlldC4KKyAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorICAiU2hvdWxkIHJlYWQgSTE2IjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkSTE2KFsweDAwLCAweDAwXSkpOworICAgIGFzc2VydC5lcXVhbCgxLCBiaW5hcnkucmVhZEkxNihbMHgwMCwgMHgwMV0pKTsKKyAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkSTE2KFsweGZmLCAweGZmXSkpOworCisgICAgLy8gTWluIEkxNgorICAgIGFzc2VydC5lcXVhbCgtMzI3NjgsIGJpbmFyeS5yZWFkSTE2KFsweDgwLCAweDAwXSkpOworICAgIC8vIE1heCBJMTYKKyAgICBhc3NlcnQuZXF1YWwoMzI3NjcsIGJpbmFyeS5yZWFkSTE2KFsweDdmLCAweGZmXSkpOworICAgIGFzc2VydC5lbmQoKTsKKyAgfSwKKworICAiU2hvdWxkIHdyaXRlIEkxNiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVJMTYoW10sIDApKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAxKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHhmZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgLTEpKTsKKworICAgIC8vIE1pbiBJMTYKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDgwLCAweDAwXSwgYmluYXJ5LndyaXRlSTE2KFtdLCAtMzI3NjgpKTsKKyAgICAvLyBNYXggSTE2CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmZl0sIGJpbmFyeS53cml0ZUkxNihbXSwgMzI3NjcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCByZWFkIEkzMiI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbCgwLCBiaW5hcnkucmVhZEkzMihbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKTsKKyAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRJMzIoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEkzMihbMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKTsKKworICAgIC8vIE1pbiBJMzIKKyAgICBhc3NlcnQuZXF1YWwoLTIxNDc0ODM2NDgsIGJpbmFyeS5yZWFkSTMyKFsweDgwLCAweDAwLCAweDAwLCAweDAwXSkpOworICAgIC8vIE1heCBJMzIKKyAgICBhc3NlcnQuZXF1YWwoMjE0NzQ4MzY0NywgYmluYXJ5LnJlYWRJMzIoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgd3JpdGUgSTMyIjogZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmRlZXBFcXVhbChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgMCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdLCBiaW5hcnkud3JpdGVJMzIoW10sIDEpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKFsweGZmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAtMSkpOworCisgICAgLy8gTWluIEkzMgorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVJMzIoW10sIC0yMTQ3NDgzNjQ4KQorICAgICk7CisgICAgLy8gTWF4IEkzMgorICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIDIxNDc0ODM2NDcpKTsKKyAgICBhc3NlcnQuZW5kKCk7CisgIH0sCisKKyAgIlNob3VsZCByZWFkIGRvdWJsZXMiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAwLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgzZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLTIsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIE1hdGguUEksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSkKKyAgICApOworCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtSW5maW5pdHksCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKworICAgIGFzc2VydC5vaygKKyAgICAgIGlzTmFOKGJpbmFyeS5yZWFkRG91YmxlKFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCisgICAgKTsKKworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDEgLyAzLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdKQorICAgICk7CisKKyAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDFdKQorICAgICk7CisgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9LAorCisgICJTaG91bGQgd3JpdGUgZG91YmxlcyI6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDApCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMikKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC0yKQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIE1hdGguUEkpCisgICAgKTsKKworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIEluZmluaXR5KQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLUluZmluaXR5KQorICAgICk7CisKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBOYU4pCisgICAgKTsKKworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhkNSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEgLyAzKQorICAgICk7CisKKyAgICAvLyBNaW4gc3Vibm9ybWFsIHBvc2l0aXZlIGRvdWJsZQorICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0KQorICAgICk7CisgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkKKyAgICApOworICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KQorICAgICk7CisgICAgYXNzZXJ0LmVuZCgpOworICB9Cit9OworCitPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgeworICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworfSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRSBiL2xpYi9ub2RlanMvdGVzdC9jZXJ0aWZpY2F0ZXMuUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzUwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvY2VydGlmaWNhdGVzLlJFQURNRQpAQCAtMCwwICsxLDcgQEAKK3NlcnZlci5jcnQgQU5EIHNlcnZlci5rZXkgQVJFIFBST1ZJREVEIEZPUiBURVNUIFBVUlBPU0UgQU5EIFNIT1VMRCAqTkVWRVIqIEJFIFVTRUQgSU4gUFJPRFVDVElPTgorCisKK09yaWdpbiBvZiB0aGUgdGVzdCBrZXkgYW5kIGNlcnQgaXMgdGhlIGZvbGRlciB0ZXN0L2tleXMgb2YgQXBhY2hlIFRocmlmdCBzb3VyY2UgY29kZSBkaXN0cmlidXRpb24KKworV2UgbmVlZCBjb3BpZXMgZm9yIG5wbSBkZXBsb3ltZW50CisKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZTNhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCkBAIC0wLDAgKzEsMTcwIEBACisjIS91c3IvYmluL2VudiBub2RlCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKKworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCIuL3Rlc3RfZHJpdmVyIikuVGhyaWZ0VGVzdERyaXZlcjsKK2NvbnN0IFRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpCisgIC5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7CisKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKKworcHJvZ3JhbQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+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+My44MCAqKioKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgQ29udGVudHMgb2YgdGhpcyBkaXN0cmlidXRpb24KLQotQ2hhbmdlcyAgICAgICAgLSBndWVzcyB3aGF0PyA7LSkKLQotT0NhbWxNYWtlZmlsZSAgLSBNYWtlZmlsZSBmb3IgZWFzeSBoYW5kbGluZyBvZiBjb21waWxhdGlvbiBvZiBub3Qgc28gZWFzeQotICAgICAgICAgICAgICAgICBPQ2FtbC1wcm9qZWN0cy4gIEl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgb2YgT0NhbWwtZmlsZXMKLSAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSwgaXMgYWJsZSB0byBoYW5kbGUgIm9jYW1sbGV4Ii0sCi0gICAgICAgICAgICAgICAgICJvY2FtbHlhY2MiLSwgSURMLSBhbmQgQy1maWxlcywga25vd3MgaG93IHRvIHJ1bgotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3JzIGFuZCBnZW5lcmF0ZXMgbmF0aXZlLSBvciBieXRlLWNvZGUsIGFzCi0gICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgb3IgYXMgbGlicmFyeSAtIHdpdGggdGhyZWFkLXN1cHBvcnQgaWYgeW91Ci0gICAgICAgICAgICAgICAgIHdhbnQhIFByb2ZpbGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQgY2FuIGJlIGFkZGVkIG9uCi0gICAgICAgICAgICAgICAgIHRoZSBmbHkhICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgbGlicmFyaWVzLgotICAgICAgICAgICAgICAgICBBaCwgeWVzLCBhbmQgeW91IGNhbiBhbHNvIGNyZWF0ZSB0b3BsZXZlbHMgZnJvbSBhbnkKLSAgICAgICAgICAgICAgICAgc291cmNlczogdGhpcyBhbGxvd3MgeW91IGltbWVkaWF0ZSBpbnRlcmFjdGl2ZSB0ZXN0aW5nLgotICAgICAgICAgICAgICAgICBBdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBkb2N1bWVudGF0aW9uIGlzIGVhc3kgZHVlIHRvCi0gICAgICAgICAgICAgICAgIGludGVncmF0aW9uIG9mIHN1cHBvcnQgZm9yIE9DYW1sZG9jLgotCi1SRUFETUUgICAgICAgICAtIHRoaXMgZmlsZQotCi1jYWxjLyAgICAgICAgICAtIERpcmVjdG9yeSBjb250YWluaW5nIGEgcXVpdGUgZnVsbHktZmVhdHVyZWQgZXhhbXBsZQotICAgICAgICAgICAgICAgICBvZiB3aGF0ICJPQ2FtbE1ha2VmaWxlIiBjYW4gZG8gZm9yIHlvdS4gVGhpcyBleGFtcGxlCi0gICAgICAgICAgICAgICAgIG1ha2VzIHVzZSBvZiAib2NhbWxsZXgiLCAib2NhbWx5YWNjIiwgSURMICsgQyBhbmQKLSAgICAgICAgICAgICAgICAgdGhyZWFkcy4KLQotY2FtbHA0LyAgICAgICAgLSBUaGlzIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzIGZpbGVzIHdpdGggdGhlIGNhbWxwNC1wcmVwcm9jZXNzb3IuCi0KLWd0ay8gICAgICAgICAgIC0gRGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIE9DYW1sTWFrZWZpbGUgd2l0aCBHVEsKLSAgICAgICAgICAgICAgICAgYW5kIHRocmVhZHMuIENvdXJ0ZXN5IG9mIFRpbSBGcmVlbWFuIDx0aW1AZnVuZ2libGUuY29tPi4KLQotaWRsLyAgICAgICAgICAgLSBDb250YWlucyBhIHZlcnkgc21hbGwgZXhhbXBsZSBvZiBob3cgdG8gdXNlCi0gICAgICAgICAgICAgICAgICJjYW1saWRsIiB0b2dldGhlciB3aXRoICJPQ2FtbE1ha2VmaWxlIi4gQWxzbyBpbnRlbmRlZAotICAgICAgICAgICAgICAgICB0byBzaG93LCBob3cgZWFzeSBpdCBpcyB0byBpbnRlcmZhY2UgT0NhbWwgYW5kIEMuCi0KLXRocmVhZHMvICAgICAgIC0gVHdvIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhyZWFkcyAob3JpZ2luYWxseQotICAgICAgICAgICAgICAgICBwb3N0ZWQgYnkgWGF2aWVyIExlcm95IHNvbWUgdGltZSBhZ28pLiBTaG93cyB0aGUgdXNlIG9mCi0gICAgICAgICAgICAgICAgICJPQ2FtbE1ha2VmaWxlIiBpbiBhbiBlbnZpcm9ubWVudCBvZiBtdWx0aXBsZSBjb21waWxhdGlvbgotICAgICAgICAgICAgICAgICB0YXJnZXRzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgIFdoeSBzaG91bGQgeW91IHVzZSBpdD8KLQotRm9yIHNldmVyYWwgcmVhc29uczoKLQotICAqIEl0IGlzIHdlbGwtdGVzdGVkIChJIHVzZSBpdCBpbiBhbGwgb2YgbXkgcHJvamVjdHMpLgotCi0gICogSW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBhcHByb2FjaGVzIGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMKLSAgICBjb3JyZWN0bHkgYnkgZW5zdXJpbmcgdGhhdCBhbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgT0NhbWwtZmlsZXMKLSAgICBleGlzdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvCi0gICAgZ3VhcmFudGVlIHRoYXQgIm9jYW1sZGVwIiB3b3JrcyBjb3JyZWN0bHkuCi0KLSAgKiBJdCBpcyBleHRyZW1lbHkgY29udmVuaWVudCAoYXQgbGVhc3QgSSB0aGluayBzbyA7LSkuCi0gICAgRXZlbiBxdWl0ZSBjb21wbGV4IGNvbXBpbGF0aW9uIHByb2Nlc3NlcyAoc2VlIGV4YW1wbGUgImNhbGMubWwiKQotICAgIG5lZWQgdmVyeSBsaXR0bGUgaW5mb3JtYXRpb24gdG8gd29yayBjb3JyZWN0bHkgLSBhY3R1YWxseSBqdXN0IGFib3V0Ci0gICAgdGhlIG1pbmltdW0gKGZpbGUgbmFtZXMgb2Ygc291cmNlcykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBXaGVuIHlvdSBzaG91bGRuJ3QgdXNlIGl0Li4uCi0KLUluIHByb2plY3RzIHdoZXJlIGV2ZXJ5IGNvbXBpbGF0aW9uIHVuaXQgbmVlZHMgZGlmZmVyZW50IGZsYWdzIC0gYnV0Ci1pbiBzdWNoIGNvbXBsaWNhdGVkIGNhc2VzIHlvdSB3aWxsIGJlIG9uIHlvdXIgb3duIGFueXdheS4gTHVja2lseSwKLXRoaXMgZG9lc24ndCBoYXBwZW4gdG9vIGZyZXF1ZW50bHkuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICBIb3cgdG8gdXNlICJPQ2FtbE1ha2VmaWxlIiBpbiB5b3VyIG93biBwcm9qZWN0Ci0gICAgICAgICAoVGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGZvciBhIHF1aWNrIGludHJvZHVjdGlvbiEpCi0KLUNyZWF0ZSB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1Ob3cgdGhlcmUgYXJlIHR3byB3YXlzIG9mIG1ha2luZyB1c2Ugb2YgIk9DYW1sTWFrZWZpbGUiOgotCi0gIDEpIEhhdmUgYSBsb29rIGF0IHRoZSBkZWZhdWx0IHNldHRpbmdzIGluICJPQ2FtbE1ha2VmaWxlIiBhbmQgc2V0Ci0gICAgIHRoZW0gdG8gdGhlIHZhbHVlcyB0aGF0IGFyZSB2YWlsZCBvbiB5b3VyIHN5c3RlbSAtIHdoZXRoZXIgdGhlCi0gICAgIHBhdGggdG8gdGhlIHN0YW5kYXJkIGxpYnJhcmllcyBpcyBvaywgd2hhdCBleGVjdXRhYmxlcyBzaGFsbCBiZQotICAgICB1c2VkLCBldGMuLi4KLQotICAyKSBDb3B5IGl0IGludG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCB0byBiZSBjb21waWxlZC4KLSAgICAgQWRkICItaW5jbHVkZSBPQ2FtbE1ha2VmaWxlIiBhcyBhIGxhc3QgbGluZSBvZiB5b3VyICJNYWtlZmlsZSIuCi0KLSAgMykgUHV0IGl0IHNvbWV3aGVyZSBlbHNlIG9uIHRoZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB5b3Ugd2lsbCBoYXZlIHRvCi0gICAgIHNldCBhIHZhcmlhYmxlICJPQ0FNTE1BS0VGSUxFIiBpbiB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIi4KLSAgICAgVGhpcyBpcyB0aGUgd2F5IGluIHdoaWNoIHRoZSBleGFtcGxlcyBhcmUgd3JpdHRlbjogc28geW91IG5lZWQKLSAgICAgb25seSBvbmUgdmVyc2lvbiBvZiAiT0NhbWxNYWtlZmlsZSIgdG8gbWFuYWdlIGFsbCB5b3VyIHByb2plY3RzIQotICAgICBTZWUgdGhlIGV4YW1wbGVzIGZvciBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIHVzdWFsbHkgc3BlY2lmeSB0d28gZnVydGhlciB2YXJpYWJsZXMgZm9yIHlvdXIgcHJvamVjdDoKLQotICAqIFNPVVJDRVMgIChkZWZhdWx0OiBmb28ubWwpCi0gICogUkVTVUxUICAgKGRlZmF1bHQ6IGZvbykKLQotUHV0IGFsbCB0aGUgc291cmNlcyBuZWNlc3NhcnkgZm9yIGEgdGFyZ2V0IGludG8gdmFyaWFibGUgIlNPVVJDRVMiLgotVGhlbiBzZXQgIlJFU1VMVCIgdG8gdGhlIG5hbWUgb2YgdGhlIHRhcmdldC4gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUKLWxpYnJhcmllcywgeW91IHNob3VsZCAqbm90KiBzcGVjaWZ5IHRoZSBzdWZmaXggKCIuY21hIiwgIi5jbXhhIiwgIi5hIikKLS0gaXQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gYnVpbGQKLWEgbGlicmFyeS4KLQotICAgICAgKiogICAgICBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSAiLm1saSItZmlsZXMsIHRvbyEgICAgICAgICoqCi0gICAgICAqKiAgRG9uJ3QgZm9yZ2V0IHRoYXQgb3JkZXIgb2YgdGhlIHNvdXJjZSBmaWxlcyBtYXR0ZXJzISAgKioKLQotVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdCBtYXR0ZXJzIGR1cmluZyBsaW5raW5nIGFueXdheQotZHVlIHRvIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgY2F1c2VkIGF0IHByb2dyYW0gc3RhcnR1cC4gVGhpcyBpcwotd2h5IE9DYW1sTWFrZWZpbGUgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJ0aWFsbHkgb3JkZXIgZGVwZW5kZW5jaWVzIGJ5Ci1pdHNlbGYsIHdoaWNoIG1pZ2h0IGNvbmZ1c2UgdXNlcnMgZXZlbiBtb3JlLiBJdCBqdXN0IGNvbXBpbGVzIGFuZCBsaW5rcwotT0NhbWwtc291cmNlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBldmVuIGlmIGl0IGNvdWxkCi1kZXRlcm1pbmUgYXV0b21hdGljYWxseSB0aGF0IHRoZSBvcmRlciBjYW5ub3QgYmUgY29ycmVjdC4KLQotVGhlIG1pbmltdW0gb2YgeW91ciAiTWFrZWZpbGUiIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhhdAotIk9DYW1sTWFrZWZpbGUiIGlzIGluIHRoZSBzZWFyY2ggcGF0aCBvZiAibWFrZSIpOgotCi0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGFzc3VtZSB0aGF0IHlvdSB3YW50IHRvIGNvbXBpbGUgYSBmaWxlICJmb28ubWwiIHRvIGEgYmluYXJ5Ci0iZm9vIi4KLQotT3RoZXJ3aXNlLCB5b3VyIE1ha2VmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLUJlIGNhcmVmdWwgd2l0aCB0aGUgbmFtZXMgeW91IHB1dCBpbnRvIHRoZXNlIHZhcmlhYmxlczogaWYgdGhleSBhcmUgd3JvbmcsCi1hICJtYWtlIGNsZWFuIiBtaWdodCBlcmFzZSB0aGUgd3JvbmcgZmlsZXMgLSBidXQgSSBrbm93IHlvdSB3aWxsIG5vdCBkbwotdGhhdCA7LSkKLQotQSBzaW1wbGUgIm1ha2UiIHdpbGwgZ2VuZXJhdGUgYSBieXRlLWNvZGUgZXhlY3V0YWJsZS4gSWYgeW91IHdhbnQgdG8KLWNoYW5nZSB0aGlzLCB5b3UgbWF5IGFkZCBhbiAiYWxsIi1ydWxlIHRoYXQgZ2VuZXJhdGVzIHNvbWV0aGluZyBlbHNlLgotCi1FLmcuOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICBhbGw6IG5hdGl2ZS1jb2RlLWxpYnJhcnkKLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1UaGlzIHdpbGwgYnVpbGQgYSBuYXRpdmUtY29kZSBsaWJyYXJ5ICJmb28uY214YSIgKCsgImZvby5hIikgZnJvbSBmaWxlCi0iZm9vLm1sIi4KLQotWW91IG1heSBldmVuIGJ1aWxkIHNldmVyYWwgdGFyZ2V0cyBhdCBvbmNlLiBUbyBwcm9kdWNlIGJ5dGUtIGFuZCBuYXRpdmUtY29kZQotZXhlY3V0YWJsZXMgd2l0aCBvbmUgIm1ha2UiLCBhZGQgdGhlIGZvbGxvd2luZyBydWxlOgotCi0gICAgYWxsOiBieXRlLWNvZGUgbmF0aXZlLWNvZGUKLQotWW91IHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciBlYWNoIG9mIHRoZXNlIHRhcmdldHMKLXNvIHRoYXQgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiAoc2VlIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdwotZm9yIGRldGFpbHMpLgotCi1Zb3UgbWF5IGFsc28gdGVsbCAibWFrZSIgYXQgdGhlIGNvbW1hbmQtbGluZSB3aGF0IGtpbmQgb2YgdGFyZ2V0IHRvCi1wcm9kdWNlIChlLmcuICJtYWtlIG5jIikuICBIZXJlIGFsbCB0aGUgcG9zc2liaWxpdGllcyB3aXRoIHNob3J0Y3V0cwotYmV0d2VlbiBwYXJlbnRoZXNpczoKLQotICAgKiBieXRlLWNvZGUgICAgICAgICAgICAgICAgICAgICAoYmMpCi0gICAqIGJ5dGUtY29kZS1ub2xpbmsgICAgICAgICAgICAgIChiY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBieXRlLWNvZGUtbGlicmFyeSAgICAgICAgICAgICAoYmNsKQotICAgKiBuYXRpdmUtY29kZSAgICAgICAgICAgICAgICAgICAobmMpCi0gICAqIG5hdGl2ZS1jb2RlLW5vbGluayAgICAgICAgICAgIChuY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBuYXRpdmUtY29kZS1saWJyYXJ5ICAgICAgICAgICAobmNsKQotICAgKiBkZWJ1Zy1jb2RlICAgICAgICAgICAgICAgICAgICAoZGMpCi0gICAqIGRlYnVnLWNvZGUtbm9saW5rICAgICAgICAgICAgIChkY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBkZWJ1Zy1jb2RlLWxpYnJhcnkgICAgICAgICAgICAoZGNsKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlICAgICAgICAgICAocGJjKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkgICAocGJjbCkKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlICAgICAgICAgKHBuYykKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnkgKHBuY2wpCi0gICAqIGJ5dGUtY29kZS1kbGwgICAgICAgICAgICAgICAgIChiY2QpCi0gICAqIG5hdGl2ZS1jb2RlLWRsbCAgICAgICAgICAgICAgIChuY2QpCi0gICAqIHBhY2stYnl0ZS1jb2RlICAgICAgICAgICAgICAgIChwYWJjKQotICAgKiBwYWNrLW5hdGl2ZS1jb2RlICAgICAgICAgICAgICAocGFuYykKLSAgICogdG9wbGV2ZWwgaW50ZXJwcmV0ZXIgICAgICAgICAgKHRvcCkKLSAgICogc3VicHJvanMKLQotSGVyZSBhIHNob3J0IG5vdGUgY29uY2VybmluZyBidWlsZGluZyBhbmQgbGlua2luZyBieXRlIGNvZGUgbGlicmFyaWVzCi13aXRoIEMtZmlsZXM6Ci0KLSAgT0NhbWwgbGlua3MgQy1vYmplY3QgZmlsZXMgb25seSB3aGVuIHRoZXkgYXJlIHVzZWQgaW4gYW4gZXhlY3V0YWJsZS4KLSAgQWZ0ZXIgY29tcGlsYXRpb24gdGhleSBzaG91bGQgYmUgcGxhY2VkIGluIHNvbWUgZGlyZWN0b3J5IHRoYXQgaXMgaW4KLSAgeW91ciBpbmNsdWRlIHBhdGggaWYgeW91IGxpbmsgeW91ciBsaWJyYXJ5IGFnYWluc3QgYW4gZXhlY3V0YWJsZS4KLQotICBJdCBpcyBzb21ldGltZXMgbW9yZSBjb252ZW5pZW50IHRvIGxpbmsgYWxsIEMtb2JqZWN0IGZpbGVzIGludG8gYQotICBzaW5nbGUgQy1saWJyYXJ5LiBUaGVuIHlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgbGluayBmbGFncwotICBvZiB5b3VyIGxpYnJhcnkgdXNpbmcgIi1ub2F1dG9saW5rIiBhbmQgYWRkIGFub3RoZXIgbGlua2ZsYWcgdGhhdAotICBsaW5rcyBpbiB5b3VyIEMtbGlicmFyeSBleHBsaWNpdGx5LgotCi1XaGF0IGNvbmNlcm5zIG1haW50YWluYW5jZToKLQotICAibWFrZSBjbGVhbiIgcmVtb3ZlcyBhbGwgKGFsbCEpIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGVzIC0gc28KLSAgYWdhaW46IG1ha2Ugc3VyZSB5b3VyIHZhcmlhYmxlcyBhcmUgb2shCi0KLSAgIm1ha2UgY2xlYW51cCIgaXMgc2ltaWxhciB0byAibWFrZSBjbGVhbiIgYnV0IGxlYXZlcyBleGVjdXRhYmxlcy4KLQotQW5vdGhlciB3YXkgdG8gZGVzdHJveSBzb21lIGltcG9ydGFudCBmaWxlcyBpcyBieSBoYXZpbmcgIk9DYW1sTWFrZWZpbGUiCi1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4gUmVhZCB0aGUgZG9jdW1lbnRhdGlvbgotYWJvdXQgdGhlIHRvb2xzIGluIHRoZSBPQ2FtbC1kaXN0cmlidXRpb24gdG8gc2VlIHdoYXQga2luZCBvZiBmaWxlcyBhcmUKLWdlbmVyYXRlZC4gIk9DYW1sTWFrZWZpbGUiIGFkZGl0aW9uYWxseSBnZW5lcmF0ZXMgKCclJyBpcyBiYXNlbmFtZSBvZgotc291cmNlIGZpbGUpOgotCi0gICVfaWRsLmMgIC0gImNhbWxpZGwiIGdlbmVyYXRlcyBhIGZpbGUgIiUuYyIgZnJvbSAiJS5pZGwiLCBidXQgdGhpcyBpcwotICAgICAgICAgICAgIG5vdCBzdWNoIGEgZ29vZCBpZGVhLCBiZWNhdXNlIHdoZW4gZ2VuZXJhdGluZyBuYXRpdmUtY29kZSwKLSAgICAgICAgICAgICBib3RoIHRoZSBmaWxlICIlLmMiIGFuZCAiJS5tbCIgd291bGQgZ2VuZXJhdGUgZmlsZXMgIiUubyIKLSAgICAgICAgICAgICB3aGljaCB3b3VsZCBvdmVyd3JpdGUgZWFjaCBvdGhlci4gVGh1cywgIk9DYW1sTWFrZWZpbGUiCi0gICAgICAgICAgICAgcmVuYW1lcyAiJS5jIiB0byAiJV9pZGwuYyIgdG8gd29yayBhcm91bmQgdGhpcyBwcm9ibGVtLgotCi1UaGUgZGVwZW5kZW5jaWVzIGFyZSBzdG9yZWQgaW4gdGhyZWUgZGlmZmVyZW50IHN1YmRpcmVjdG9yaWVzIChkb3QgZGlycyk6Ci0KLSAgLl9kICAgIC0gY29udGFpbnMgZGVwZW5kZW5jaWVzIGZvciAubWwtZmlsZXMKLSAgLl9iY2RpIC0gY29udGFpbnMgYnl0ZSBjb2RlIGRlcGVuZGVuY2llcyBmb3IgLm1saS1maWxlcwotICAuX25jZGkgLSBjb250YWlucyBuYXRpdmUgY29kZSBkZXBlbmRlbmNpZXMgZm9yIC5tbGktZmlsZXMKLQotVGhlIGVuZGluZ3Mgb2YgdGhlIGRlcGVuZGVuY3kgZmlsZXMgYXJlOiAiJS5kIiBmb3IgdGhvc2UgZ2VuZXJhdGVkIGZyb20KLSIlLm1sIi1maWxlcywgIiUuZGkiIGZvciBvbmVzIGRlcml2ZWQgZnJvbSAiJS5tbGkiLWZpbGVzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nCi0KLSAgVGhpcyBpcyBlYXN5OiBpZiB5b3UgZGlzY292ZXIgYSBidWcsIGp1c3QgZG8gYSAibWFrZSBjbGVhbjsgbWFrZSBkYyIKLSAgdG8gcmVjb21waWxlIHlvdXIgcHJvamVjdCB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhlbiB5b3UgY2FuCi0gIGltbWVkaWF0ZWx5IGFwcGx5ICJvY2FtbGRlYnVnIiB0byB0aGUgZXhlY3V0YWJsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGluZwotCi0gIEZvciBnZW5lcmF0aW5nIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aCAib2NhbWxwcm9mIiAoYnl0ZSBjb2RlKQotICBvciAiZ3Byb2YiIChuYXRpdmUgY29kZSksIGNvbXBpbGUgeW91ciBwcm9qZWN0IHdpdGggb25lIG9mIHRoZSBwcm9maWxpbmcKLSAgdGFyZ2V0cyAoc2VlIHRhcmdldHMgYWJvdmUpLiBFLmcuOgotCi0gICAgKiAibWFrZSBwYmMiIHdpbGwgYnVpbGQgYnl0ZSBjb2RlIHRoYXQgY2FuIGJlIHByb2ZpbGVkIHdpdGgKLSAgICAgICJvY2FtbHByb2YiLgotCi0gICAgKiAibWFrZSBwbmMiIHdpbGwgYnVpbGQgbmF0aXZlIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aAotICAgICAgImdwcm9mIi4KLQotICBQbGVhc2Ugbm90ZSB0aGF0IGl0IGlzIG5vdCBjdXJyZW50bHkgcG9zc2libGUgdG8gcHJvZmlsZSBieXRlIGNvZGUgd2l0aAotICB0aHJlYWRzLiBPQ2FtbE1ha2VmaWxlIHdpbGwgZm9yY2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBkbyB0aGlzLgotCi0gIEEgc2hvcnQgaGludCBmb3IgREVDIEFscGhhLXVzZXJzICh1bmRlciBEaWdpdGFsIFVuaXgpOiB5b3UgbWF5IGFsc28KLSAgY29tcGlsZSB5b3VyIHNvdXJjZXMgdG8gbmF0aXZlIGNvZGUgd2l0aG91dCBhbnkgZnVydGhlciBwcm9maWxpbmcKLSAgb3B0aW9ucy90YXJnZXRzLiBUaGVuIGNhbGwgInBpeGllIG15X2V4ZWMiLCAibXlfZXhlYyIgYmVpbmcgeW91cgotICBleGVjdXRhYmxlLiBUaGlzIHdpbGwgcHJvZHVjZSAoYW1vbmcgb3RoZXIgZmlsZXMpIGFuIGV4ZWN1dGFibGUKLSAgIm15X2V4ZWMucGl4aWUiLiBDYWxsIGl0IGFuZCBpdCB3aWxsIHByb2R1Y2UgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHdoaWNoCi0gIGNhbiBiZSBhbmFseXNlZCB1c2luZyAicHJvZiAtcGl4aWUgbXlfZXhlYyIuIFRoZSByZXN1bHRpbmcgaW5mb3JtYXRpb24KLSAgaXMgZXh0cmVtZWx5IGRldGFpbGVkIGFuZCBhbGxvd3MgYW5hbHlzaXMgdXAgdG8gdGhlIGNsb2NrIGN5Y2xlIGxldmVsLi4uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzaW5nIFByZXByb2Nlc3NvcnMKLQotICBCZWNhdXNlIG9uZSBjb3VsZCBlbXBsb3kgYW55IGtpbmQgb2YgcHJvZ3JhbSB0aGF0IHJlYWRzIGZyb20gc3RhbmRhcmQKLSAgaW5wdXQgYW5kIHByaW50cyB0byBzdGFuZGFyZCBvdXRwdXQgYXMgcHJlcHJvY2Vzc29yLCB0aGVyZSBjYW5ub3QgYmUgYW55Ci0gIGRlZmF1bHQgd2F5IHRvIGhhbmRsZSBhbGwgb2YgdGhlbSBjb3JyZWN0bHkgd2l0aG91dCBmdXJ0aGVyIGtub3dsZWRnZS4KLQotICBUaGVyZWZvcmUgeW91IGhhdmUgdG8gY29vcGVyYXRlIGEgYml0IHdpdGggT0NhbWxNYWtlZmlsZSB0byBsZXQKLSAgcHJlcHJvY2Vzc2luZyBoYXBwZW4gYXV0b21hdGljYWxseS4gQmFzaWNhbGx5LCB0aGlzIG9ubHkgcmVxdWlyZXMKLSAgdGhhdCB5b3UgcHV0IGEgY29tbWVudCBpbnRvIHRoZSBmaXJzdCBsaW5lIG9mIGZpbGVzIHRoYXQgc2hvdWxkIGJlCi0gIHByZXByb2Nlc3NlZCwgZS5nLjoKLQotICAgICgqcHAgY2F0ICopCi0gICAgLi4uIHJlc3Qgb2YgcHJvZ3JhbSAuLi4KLQotICBPQ2FtbE1ha2VmaWxlIGxvb2tzIGF0IHRoZSBmaXJzdCBsaW5lIG9mIHlvdXIgZmlsZXMsIGFuZCBpZiBpdCBmaW5kcwotICBhIGNvbW1lbnQgdGhhdCBzdGFydHMgd2l0aCAiKCpwcCIsIHRoZW4gaXQgd2lsbCBhc3N1bWUgdGhhdCB0aGUKLSAgcmVzdCBvZiB0aGUgY29tbWVudCB0ZWxscyBpdCBob3cgdG8gY29ycmVjdGx5IGNhbGwgdGhlIGFwcHJvcHJpYXRlCi0gIHByZXByb2Nlc3Nvci4gSW4gdGhpcyBjYXNlIHRoZSBwcm9ncmFtICJjYXQiIHdpbGwgYmUgY2FsbGVkLCB3aGljaCB3aWxsLAotICBvZiBjb3Vyc2UsIGp1c3Qgb3V0cHV0IHRoZSBzb3VyY2UgdGV4dCBhZ2FpbiB3aXRob3V0IGNoYW5naW5nIGl0LgotCi0gIElmIHlvdSBhcmUsIGZvciBleGFtcGxlLCBhbiBhZHZvY2F0ZSBvZiB0aGUgbmV3ICJyZXZpc2VkIHN5bnRheCIsCi0gIHdoaWNoIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtbHA0IHByZXByb2Nlc3NvciwgeW91IGNvdWxkIHNpbXBseSB3cml0ZToKLQotICAgICgqcHAgY2FtbHA0ciAqKQotICAgIC4uLiByZXN0IG9mIHByb2dyYW0gaW4gcmV2aXNlZCBzeW50YXggLi4uCi0KLSAgU2ltcGxlLCBpc24ndCBpdD8KLQotICBJZiB5b3Ugd2FudCB0byB3cml0ZSB5b3VyIG93biBzeW50YXggZXh0ZW5zaW9ucywganVzdCB0YWtlIGEgbG9vayBhdCB0aGUKLSAgZXhhbXBsZSBpbiB0aGUgZGlyZWN0b3J5ICJjYW1scDQiOiBpdCBpbXBsZW1lbnRzIHRoZSAicmVwZWF0IC4uLiB1bnRpbCIKLSAgZXh0ZW5zaW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgY2FtbHA0LXR1dG9yaWFsLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgTGlicmFyeSAoVW4tKUluc3RhbGxhdGlvbiBTdXBwb3J0Ci0KLSAgT0NhbWxNYWtlZmlsZSBjb250YWlucyB0d28gdGFyZ2V0cyB1c2luZyAib2NhbWxmaW5kIiBmb3IgdGhpcyBwdXJwb3NlOgotCi0gICAgKiBsaWJpbnN0YWxsCi0gICAgKiBsaWJ1bmluc3RhbGwKLQotICBUaGVzZSB0d28gdGFyZ2V0cyByZXF1aXJlIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHZhcmlhYmxlCi0gICJMSUJJTlNUQUxMX0ZJTEVTIiwgd2hpY2ggc2hvdWxkIGJlIHNldCB0byBhbGwgdGhlIGZpbGVzIHRoYXQgeW91Ci0gIHdhbnQgdG8gaW5zdGFsbCBpbiB0aGUgbGlicmFyeSBkaXJlY3RvcnkgKHVzdWFsbHkgJS5tbGksICUuY21pLCAlLmNtYSwKLSAgJS5jbXhhLCAlLmEgYW5kIHBvc3NpYmx5IGZ1cnRoZXIgQy1saWJyYXJpZXMpLiBUaGUgdGFyZ2V0ICJsaWJpbnN0YWxsIgotICBoYXMgdGhlIGRlcGVuZGVuY3kgImFsbCIgdG8gZm9yY2UgY29tcGlsYXRpb24gb2YgdGhlIGxpYnJhcnkgc28gbWFrZQotICBzdXJlIHlvdSBkZWZpbmUgdGFyZ2V0ICJhbGwiIGluIHlvdXIgTWFrZWZpbGUgYXBwcm9wcmlhdGVseS4KLQotICBUaGUgdGFyZ2V0cyBpbmZvcm0gdGhlIHVzZXIgYWJvdXQgdGhlIGNvbmZpZ3VyZWQgaW5zdGFsbCBwYXRoIGFuZCBhc2sKLSAgZm9yIGNvbmZpcm1hdGlvbiB0byAodW4paW5zdGFsbCB0aGVyZS4gSWYgeW91IHdhbnQgdG8gdXNlIHRoZW0sIGl0Ci0gIGlzIG9mdGVuIGEgZ29vZCBpZGVhIHRvIGp1c3QgYWxpYXMgdGhlbSBpbiB5b3VyIE1ha2VmaWxlIHRvICJpbnN0YWxsIgotICBhbmQgInVuaW5zdGFsbCIgcmVzcGVjdGl2ZWx5LgotCi0gIFR3byBvdGhlciB0YXJnZXRzIGFsbG93IGluc3RhbGxhdGlvbiBvZiBmaWxlcyBpbnRvIGEgcGFydGljdWxhcgotICBkaXJlY3RvcnkgKHdpdGhvdXQgdXNpbmcgb2NhbWxmaW5kKToKLQotICAgICogcmF3aW5zdGFsbAotICAgICogcmF3dW5pbnN0YWxsCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRpbmcgdG9wbGV2ZWxzCi0KLSAgVGhlcmUgaXMganVzdCBvbmUgdGFyZ2V0IGZvciB0aGlzOgotCi0gICAgKiB0b3AKLQotICBUaGUgZ2VuZXJhdGVkIGZpbGUgY2FuIGJlIHVzZWQgaW1tZWRpYXRlbHkgZm9yIGludGVyYWN0aXZlIHNlc3Npb25zIC0KLSAgZXZlbiB3aXRoIHNjYW5uZXJzLCBwYXJzZXJzLCBDLWZpbGVzLCBldGMuIQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbgotCi0gIFRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgc3VwcG9ydGVkOgotCi0gICAqIGh0ZG9jICAgICAgLSBnZW5lcmF0ZXMgSFRNTC1kb2N1bWVudGF0aW9uCi0gICAqIGxhZG9jICAgICAgLSBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotICAgKiBwc2RvYyAgICAgIC0gZ2VuZXJhdGVzIFBvc3RTY3JpcHQtZG9jdW1lbnRhdGlvbgotICAgKiBwZGZkb2MgICAgIC0gZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi0gICAqIGRvYyAgICAgICAgLSBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi0gICAqIGNsZWFuLWRvYyAgLSBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi0KLSAgQWxsIG9mIHRoZW0gZ2VuZXJhdGUgYSBzdWItZGlyZWN0b3J5ICJkb2MiLiBNb3JlIHByZWNpc2VseSwgZm9yIEhUTUwgaXQKLSAgaXMgImRvYy8kKFJFU1VMVCkvaHRtbCIgYW5kIGZvciBMYXRleCwgUG9zdFNjcmlwdCBhbmQgUERGIHRoZSBkaXJlY3RvcnkKLSAgImRvYy8kKFJFU1VMVCkvbGF0ZXgiLiBTZWUgdGhlIE9DYW1sZG9jLW1hbnVhbCBmb3IgZGV0YWlscyBhbmQgdGhlCi0gIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdyBmb3Igc2V0dGluZ3MgeW91IGNhbiBjb250cm9sLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxpbmcgc3VicHJvamVjdHMKLQotICBZb3UgY2FuIGhhdmUgc2V2ZXJhbCB0YXJnZXRzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgbWFuYWdlIHRoZW0KLSAgZnJvbSB3aXRoaW4gYW4gc2luZ2xlIE1ha2VmaWxlLgotCi0gIEdpdmUgZWFjaCBzdWJwcm9qZWN0IGEgbmFtZSwgZS5nLiAicDEiLCAicDIiLCBldGMuIFRoZW4geW91IGV4cG9ydAotICBzZXR0aW5ncyBzcGVjaWZpYyB0byBlYWNoIHByb2plY3QgYnkgdXNpbmcgdmFyaWFibGVzIG9mIHRoZSBmb3JtCi0gICJQUk9KX3AxIiwgIlBST0pfcDIiLCBldGMuICBFLmcuOgotCi0gICAgZGVmaW5lIFBST0pfcDEKLSAgICAgIFNPVVJDRVM9ImZvby5tbCBtYWluLm1sIgotICAgICAgUkVTVUxUPSJwMSIKLSAgICAgIE9DQU1MRkxBR1M9Ii11bnNhZmUiCi0gICAgZW5kZWYKLSAgICBleHBvcnQgUFJPSl9wMQotCi0gICAgZGVmaW5lIFBST0pfcDIKLSAgICAgIC4uLgotICAgIGVuZGVmCi0gICAgZXhwb3J0IFBST0pfcDIKLQotICBZb3UgbWF5IGFsc28gZXhwb3J0IGNvbW1vbiBzZXR0aW5ncyB1c2VkIGJ5IGFsbCBwcm9qZWN0cyBkaXJlY3RseSwgZS5nLgotICAiZXhwb3J0IFRIUkVBRFMgPSB5Ii4KLQotICBOb3cgaXQgaXMgYSBnb29kIGlkZWEgdG8gZGVmaW5lLCB3aGljaCBwcm9qZWN0cyBzaG91bGQgYmUgYWZmZWN0ZWQgYnkKLSAgY29tbWFuZHMgYnkgZGVmYXVsdC4gIEUuZy46Ci0KLSAgICBpZm5kZWYgU1VCUFJPSlMKLSAgICAgIGV4cG9ydCBTVUJQUk9KUyA9IHAxIHAyCi0gICAgZW5kaWYKLQotICBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIHRob3NlCi0gIHN1YnByb2plY3RzIGlmIHRoaXMgdmFyaWFibGUgaGFzIG5vdCBiZWVuIGRlZmluZWQgaW4gdGhlIHNoZWxsCi0gIGVudmlyb25tZW50IG9yIGluIHRoZSBjb21tYW5kIGxpbmUgb2YgdGhlIG1ha2UtaW52b2NhdGlvbiBieSB0aGUgdXNlci4KLSAgRS5nLiwgIm1ha2UgZGMiIHdpbGwgZ2VuZXJhdGUgZGVidWcgY29kZSBmb3IgYWxsIHN1YnByb2plY3RzLgotCi0gIFRoZW4geW91IG5lZWQgdG8gZGVmaW5lIGEgZGVmYXVsdCBhY3Rpb24gZm9yIHlvdXIgc3VicHJvamVjdHMgaWYgIm1ha2UiCi0gIGhhcyBiZWVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50czoKLQotICAgIGFsbDogYmMKLQotICBUaGlzIHdpbGwgYnVpbGQgYnl0ZSBjb2RlIGJ5IGRlZmF1bHQgZm9yIGFsbCBzdWJwcm9qZWN0cy4KLQotICBGaW5hbGx5LCB5b3UnbGwgaGF2ZSB0byBkZWZpbmUgYSBjYXRjaC1hbGwgdGFyZ2V0IHRoYXQgdXNlcyB0aGUgdGFyZ2V0Ci0gIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGZvciBhbGwgc3VicHJvamVjdHMuIEp1c3QgYWRkIChhc3N1bWluZyB0aGF0Ci0gIE9DQU1MTUFLRUZJTEUgaGFzIGJlZW4gZGVmaW5lZCBhcHByb3ByaWF0ZWx5KToKLQotICAgICU6Ci0gICAgICAgICAgICBAbWFrZSAtZiAkKE9DQU1MTUFLRUZJTEUpIHN1YnByb2pzIFNVQlRBUkdFVD0kQAotCi0gIFNlZSB0aGUgInRocmVhZHMiLWRpcmVjdG9yeSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBhIHNob3J0IGV4YW1wbGUhCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICBPcHRpb25hbCB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgcGFzc2VkIHRvICJPQ2FtbE1ha2VmaWxlIgotCi0gICogTElCX1BBQ0tfTkFNRSAtIHBhY2tzIGFsbCBtb2R1bGVzIG9mIGEgbGlicmFyeSBpbnRvIGEgbW9kdWxlIHdob3NlCi0gICAgICAgICAgICAgICAgICAgIG5hbWUgaXMgZ2l2ZW4gaW4gdmFyaWFibGUgIkxJQl9QQUNLX05BTUUiLgotCi0gICogUkVTX0NMSUJfU1VGICAtIHdoZW4gYnVpbGRpbmcgYSBsaWJyYXJ5IHRoYXQgY29udGFpbnMgQy1zdHVicywgdGhpcwotICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBjb250cm9scyB0aGUgc3VmZml4IGFwcGVuZGVkIHRvIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgIG9mIHRoZSBDLWxpYnJhcnkgKGRlZmF1bHQ6ICJfc3R1YnMiKS4KLQotICAqIFRIUkVBRFMgICAgICAgLSBzYXkgIlRIUkVBRFMgPSB5ZXMiIGlmIHlvdSBuZWVkIHRocmVhZCBzdXBwb3J0IGNvbXBpbGVkIGluLAotICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgbGVhdmUgaXQgYXdheS4KLQotICAqIFZNVEhSRUFEUyAgICAgLSBzYXkgIlZNVEhSRUFEUyA9IHllcyIgaWYgeW91IHdhbnQgdG8gZm9yY2UgVk0tbGV2ZWwKLSAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGluZyBvZiB0aHJlYWRzIChieXRlLWNvZGUgb25seSkuCi0KLSAgKiBBTk5PVEFURSAgICAgIC0gc2F5ICJBTk5PVEFURSA9IHllcyIgdG8gZ2VuZXJhdGUgdHlwZSBhbm5vdGF0aW9uIGZpbGVzCi0gICAgICAgICAgICAgICAgICAgICguYW5ub3QpIHRvIHN1cHBvcnQgZGlzcGxheWluZyBvZiB0eXBlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGluIGVkaXRvcnMuCi0KLSAgKiBVU0VfQ0FNTFA0ICAgIC0gc2F5ICJVU0VfQ0FNTFA0ID0geWVzIiBpbiB5b3VyICJNYWtlZmlsZSIgaWYgeW91Ci0gICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gaW5jbHVkZSB0aGUgY2FtbHA0IGRpcmVjdG9yeSBkdXJpbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkIHByb2Nlc3MsIG90aGVyd2lzZSBsZWF2ZSBpdCBhd2F5LgotCi0gICogSU5DRElSUyAgICAgICAtIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciAiLmNtaSItIGFuZAotICAgICAgICAgICAgICAgICAgICAiLmNtbyItZmlsZXMuICBZb3UgbmVlZCBub3Qgd3JpdGUgIi1JIC4uLiIgLSBqdXN0IHRoZQotICAgICAgICAgICAgICAgICAgICBwbGFpbiBuYW1lcy4KLSAgKiBMSUJESVJTICAgICAgIC0gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGxpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICBBbHNvIGp1c3QgcHV0IHRoZSBwbGFpbiBwYXRocyBpbnRvIHRoaXMgdmFyaWFibGUKLSAgKiBFWFRMSUJESVJTICAgIC0gU2FtZSBhcyAiTElCRElSUyIsIGJ1dCBwYXRocyBpbiB0aGlzIHZhcmlhYmxlIGFyZQotICAgICAgICAgICAgICAgICAgICBhbHNvIGFkZGVkIHRvIHRoZSBiaW5hcnkgdmlhIHRoZSAiLVIiLWZsYWcgc28gdGhhdAotICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpYnJhcmllcyBpbiBub24tc3RhbmRhcmQgcGxhY2VzIGNhbiBiZSBmb3VuZC4KLSAgKiBSRVNVTFRERVBTICAgIC0gVGFyZ2V0cyBvbiB3aGljaCByZXN1bHRzIChleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMpCi0gICAgICAgICAgICAgICAgICAgIHNob3VsZCBhZGRpdGlvbmFsbHkgZGVwZW5kLgotCi0gICogUEFDS1MgICAgICAgICAtIGFkZHMgcGFja2FnZXMgdW5kZXIgY29udHJvbCBvZiAiZmluZGxpYiIuCi0KLSAgKiBQUkVEUyAgICAgICAgIC0gc3BlY2lmaWVzICJmaW5kbGliIi1wcmVkaWNhdGVzLgotCi0gICogTElCUyAgICAgICAgICAtIE9DYW1sLWxpYnJhcmllcyB0aGF0IHNob3VsZCBiZSBsaW5rZWQgKGp1c3QgcGxhaW4gbmFtZXMpLgotICAgICAgICAgICAgICAgICAgICBFLmcuIGlmIHlvdSB3YW50IHRvIGxpbmsgdGhlIFN0ci1saWJyYXJ5LCBqdXN0IHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICJzdHIiICh3aXRob3V0IHF1b3RlcykuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBuZXcgT0NhbWwtY29tcGlsZXIgaGFuZGxlcyBsaWJyYXJpZXMgaW4gc3VjaAotICAgICAgICAgICAgICAgICAgICBhIHdheSB0aGF0IHRoZXkgInJlbWVtYmVyIiB3aGV0aGVyIHRoZXkgaGF2ZSB0bwotICAgICAgICAgICAgICAgICAgICBiZSBsaW5rZWQgYWdhaW5zdCBhIEMtbGlicmFyeSBhbmQgaXQgZ2V0cyBsaW5rZWQKLSAgICAgICAgICAgICAgICAgICAgaW4gYXV0b21hdGljYWxseS4KLSAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgaXMgYSBzbGFzaCBpbiB0aGUgbGlicmFyeSBuYW1lIChzdWNoIGFzCi0gICAgICAgICAgICAgICAgICAgICIuL3N0ciIgb3IgImxpYi9mb28iKSB0aGVuIG1ha2UgaXMgdG9sZCB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQgZmlsZXMgZGVwZW5kIG9uIHRoZSBsaWJyYXJ5LiAgVGhpcwotICAgICAgICAgICAgICAgICAgICBoZWxwcyB0byBlbnN1cmUgdGhhdCBjaGFuZ2VzIHRvIHlvdXIgbGlicmFyaWVzIGFyZQotICAgICAgICAgICAgICAgICAgICB0YWtlbiBpbnRvIGFjY291bnQsIHdoaWNoIGlzIGltcG9ydGFudCBpZiB5b3UgYXJlCi0gICAgICAgICAgICAgICAgICAgIHJlZ2VuZXJhdGluZyB5b3VyIGxpYnJhcmllcyBmcmVxdWVudGx5LgotICAqIENMSUJTICAgICAgICAgLSBDLWxpYnJhcmllcyB0aGF0IHNob3VsZCBiZSBsaW5rZWQgKGp1c3QgcGxhaW4gbmFtZXMpLgotCi0gICogUFJFX1RBUkdFVFMgICAtIHNldCB0aGlzIHRvIGEgbGlzdCBvZiB0YXJnZXQgZmlsZXMgdGhhdCB5b3Ugd2FudAotICAgICAgICAgICAgICAgICAgICB0byBoYXZlIGJ1aWxkdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbiBhY3R1YWxseQotICAgICAgICAgICAgICAgICAgICB0YWtlcyBwbGFjZS4gRS5nLiB1c2UgdGhpcyB0byBhdXRvbWF0aWNhbGx5IGNvbXBpbGUKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyBuZWVkZWQgYnkgY2FtbHA0LCB3aGljaCBoYXZlIHRvIGJlIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBiZWZvcmUgb3RoZXIgbW9kdWxlcyBjYW4gYmUgcGFyc2VkIGF0IGFsbC4KLQotICAgICAgICAgICAgICAgICAgICAqKiBXQVJOSU5HICoqOiB0aGUgZmlsZXMgbWVudGlvbmVkIGluIHRoaXMgdmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIHdoZW4gIm1ha2UgY2xlYW4iIGlzIGV4ZWN1dGVkIQotCi0gICogTElCSU5TVEFMTF9GSUxFUyAtIHRoZSBmaWxlcyBvZiBhIGxpYnJhcnkgdGhhdCBzaG91bGQgYmUgaW5zdGFsbGVkCi0gICAgICAgICAgICAgICAgICAgICAgIHVzaW5nICJmaW5kbGliIi4gRGVmYXVsdDoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLmEgbGliJChSRVNVTFQpLmEKLQotICAqIE9DQU1MX0xJQl9JTlNUQUxMIC0gdGFyZ2V0IGRpcmVjdG9yeSBmb3IgInJhd2luc3RhbGwvcmF3dW5pbnN0YWxsIi4KLSAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAkKE9DQU1MTElCUEFUSCkvY29udHJpYikKLQotICAqIERPQ19GSUxFUyAgICAgLSBuYW1lcyBvZiBmaWxlcyBmcm9tIHdoaWNoIGRvY3VtZW50YXRpb24gaXMgZ2VuZXJhdGVkLgotICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogYWxsIC5tbGktZmlsZXMgaW4geW91ciAkKFNPVVJDRVMpKS4KLQotICAqIERPQ19ESVIgICAgICAgLSBuYW1lIG9mIGRpcmVjdG9yeSB3aGVyZSBkb2N1bWVudGF0aW9uIHNob3VsZCBiZSBzdG9yZWQuCi0KLSAgKiBPQ0FNTEZMQUdTICAgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBjb21waWxlcnMKLSAgKiBPQ0FNTEJDRkxBR1MgIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBieXRlIGNvZGUgY29tcGlsZXIgb25seQotICAqIE9DQU1MTkNGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIG5hdGl2ZSBjb2RlIGNvbXBpbGVyIG9ubHkKLQotICAqIE9DQU1MTERGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlcgotICAqIE9DQU1MQkxERkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gdGhlIE9DYW1sLWxpbmtlciB3aGVuIGxpbmtpbmcgYnl0ZSBjb2RlCi0gICogT0NBTUxOTERGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyIHdoZW4gbGlua2luZwotICAgICAgICAgICAgICAgICAgICBuYXRpdmUgY29kZQotCi0gICogT0NBTUxNS0xJQl9GTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwgbGlicmFyeSB0b29sCi0KLSAgKiBPQ0FNTENQRkxBR1MgIC0gcHJvZmlsaW5nIGZsYWdzIHBhc3NlZCB0byAib2NhbWxjcCIgKGRlZmF1bHQ6ICJhIikKLQotICAqIFBQRkxBR1MgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgcHJlcHJvY2Vzc29yIChkZWZhdWx0OiBub25lKQotCi0gICogTEZMQUdTICAgICAgICAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxsZXgiCi0gICogWUZMQUdTICAgICAgICAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWx5YWNjIgotICAqIElETEZMQUdTICAgICAgLSBmbGFncyBwYXNzZWQgdG8gImNhbWxpZGwiCi0KLSAgKiBPQ0FNTERPQ0ZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGRvYyIKLQotICAqIE9DQU1MRklORF9JTlNURkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sZmluZCIgZHVyaW5nIGluc3RhbGxhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogbm9uZSkKLQotICAqIERWSVBTRkxBR1MgICAgLSBmbGFncyBwYXNzZWQgdG8gZHZpcHMKLSAgICAgICAgICAgICAgICAgICAgKHdoZW4gZ2VuZXJhdGluZyBkb2N1bWVudGF0aW9uIGluIFBvc3RTY3JpcHQpLgotCi0gICogU1RBVElDICAgICAgICAtIHNldCB0aGlzIHZhcmlhYmxlIGlmIHlvdSB3YW50IHRvIGZvcmNlIGNyZWF0aW9uCi0gICAgICAgICAgICAgICAgICAgIG9mIHN0YXRpYyBsaWJyYXJpZXMKLQotICAqIENDICAgICAgICAgICAgLSB0aGUgQy1jb21waWxlciB0byBiZSB1c2VkCi0gICogQ1hYICAgICAgICAgICAtIHRoZSBDKystY29tcGlsZXIgdG8gYmUgdXNlZAotCi0gICogQ0ZMQUdTICAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLWNvbXBpbGVyLgotICAgICAgICAgICAgICAgICAgICBUaGUgZmxhZyAiLUROQVRJVkVfQ09ERSIgd2lsbCBiZSBwYXNzZWQgYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICAgICBpZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIG5hdGl2ZSBjb2RlLiBUaGlzIGFsbG93cyB5b3UKLSAgICAgICAgICAgICAgICAgICAgdG8gY29tcGlsZSB5b3VyIEMtZmlsZXMgY29uZGl0aW9uYWxseS4gQnV0IHBsZWFzZQotICAgICAgICAgICAgICAgICAgICBub3RlOiBZb3Ugc2hvdWxkIGRvIGEgIm1ha2UgY2xlYW4iIG9yIHJlbW92ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZpbGVzIG1hbnVhbGx5IG9yIHRvdWNoIHRoZSAlLmMtZmlsZXM6Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgdGhleSBtYXkgbm90IGJlIGNvcnJlY3RseSByZWNvbXBpbGVkCi0gICAgICAgICAgICAgICAgICAgIGJldHdlZW4gZGlmZmVyZW50IGJ1aWxkcy4KLQotICAqIENYWEZMQUdTICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQysrLWNvbXBpbGVyLgotCi0gICogQ1BQRkxBR1MgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLXByZXByb2Nlc3Nvci4KLQotICAqIENGUkFNRVdPUktTICAgLSBPYmplY3RpdmUtQyBmcmFtZXdvcmsgdG8gcGFzcyB0byBsaW5rZXIgb24gTWFjT1MgWC4KLQotICAqIExERkxBR1MgICAgICAgLSBhZGRpdGlvbmFsIGZsYWdzIHBhc3NlZCB0byB0aGUgQy1saW5rZXIKLQotICAqIFJQQVRIX0ZMQUcgICAgLSBmbGFnIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBDLWxpbmtlciB0byBzZXQgYSBwYXRoIGZvcgotICAgICAgICAgICAgICAgICAgICBkeW5hbWljIGxpYnJhcmllcy4gIE1heSBuZWVkIHRvIGJlIHNldCBieSB1c2VyIG9uCi0gICAgICAgICAgICAgICAgICAgIGV4b3RpYyBwbGF0Zm9ybXMuICAoZGVmYXVsdDogIi1SIikuCi0KLSAgKiBFTEZfUlBBVEhfRkxBRyAtIHRoaXMgZmxhZyBpcyB1c2VkIHRvIHNldCB0aGUgcnBhdGggb24gRUxGLXBsYXRmb3Jtcy4KLSAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiLVIiKQotCi0gICogRUxGX1JQQVRIICAgICAtIGlmIHRoaXMgZmxhZyBpcyAieWVzIiwgdGhlbiB0aGUgUlBBVEhfRkxBRyB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgIHBhc3NlZCBieSAiLVdsIiB0byB0aGUgbGlua2VyIGFzIG5vcm1hbCBvbgotICAgICAgICAgICAgICAgICAgICBFTEYtcGxhdGZvcm1zLgotCi0gICogT0NBTUxMSUJQQVRIICAtIHBhdGggdG8gdGhlIE9DYW1sLXN0YW5kYXJkLWxpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICAoZmlyc3QgZGVmYXVsdDogYCQoT0NBTUxDKSAtd2hlcmVgKQotICAgICAgICAgICAgICAgICAgICAoc2Vjb25kIGRlZmF1bHQ6ICIvdXNyL2xvY2FsL2xpYi9vY2FtbCIpCi0KLSAgKiBPQ0FNTF9ERUZBVUxUX0RJUlMgLSBhZGRpdGlvbmFsIHBhdGggaW4gd2hpY2ggdGhlIHVzZXIgY2FuIHN1cHBseQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgZGlyZWN0b3JpZXMgdG8gaGlzIG93biBjb2xsZWN0aW9uIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLiAgVGhlIGlkZWEgaXMgdG8gcGFzcyB0aGlzIGFzIGFuIGVudmlyb25tZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgc28gdGhhdCB0aGUgTWFrZWZpbGVzIGRvIG5vdCBoYXZlIHRvIGNvbnRhaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhdGggYWxsIHRoZSB0aW1lLgotCi0gICogT0NBTUxGSU5EICAgICAtIG9jYW1sZmluZCBmcm9tIGZpbmRsaWIgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGZpbmQiKQotICAqIE9DQU1MQyAgICAgICAgLSBieXRlLWNvZGUgY29tcGlsZXIgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxjIikKLSAgKiBPQ0FNTE9QVCAgICAgIC0gbmF0aXZlLWNvZGUgY29tcGlsZXIgICAgICAgICAoZGVmYXVsdDogIm9jYW1sb3B0IikKLSAgKiBPQ0FNTE1LVE9QICAgIC0gdG9wLWxldmVsIGNvbXBpbGVyICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sbWt0b3AiKQotICAqIE9DQU1MQ1AgICAgICAgLSBwcm9maWxpbmcgYnl0ZS1jb2RlIGNvbXBpbGVyIChkZWZhdWx0OiAib2NhbWxjcCIpCi0gICogT0NBTUxERVAgICAgICAtIGRlcGVuZGVuY3kgZ2VuZXJhdG9yICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGRlcCIpCi0gICogT0NBTUxMRVggICAgICAtIHNjYW5uZXIgZ2VuZXJhdG9yICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGxleCIpCi0gICogT0NBTUxZQUNDICAgICAtIHBhcnNlciBnZW5lcmF0b3IgICAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbHlhY2MiKQotICAqIE9DQU1MTUtMSUIgICAgLSB0b29sIHRvIGNyZWF0ZSBsaWJyYXJpZXMgICAgIChkZWZhdWx0OiAib2NhbWxta2xpYiIpCi0gICogQ0FNTElETCAgICAgICAtIElETC1jb2RlIGdlbmVyYXRvciAgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1saWRsIikKLSAgKiBDQU1MSURMRExMICAgIC0gSURMLXV0aWxpdHkgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogImNhbWxpZGxkbGwiKQotICAqIENBTUxQNCAgICAgICAgLSBjYW1scDQgcHJlcHJvY2Vzc29yICAgICAgICAgIChkZWZhdWx0OiAiY2FtbHA0IikKLSAgKiBPQ0FNTERPQyAgICAgIC0gT0NhbWxkb2MtY29tbWFuZCAgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sZG9jIikKLQotICAqIExBVEVYICAgICAgICAgLSBMYXRleC1wcm9jZXNzb3IgICAgICAgICAgICAgIChkZWZhdWx0OiAibGF0ZXgiKQotICAqIERWSVBTICAgICAgICAgLSBkdmlwcy1jb21tYW5kICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiZHZpcHMiKQotICAqIFBTMlBERiAgICAgICAgLSBQb3N0U2NyaXB0LXRvLVBERiBjb252ZXJ0ZXIgIChkZWZhdWx0OiAicHMycGRmIikKLQotICAqIENBTUVMRU9OX1JFUE9SVCAtIHJlcG9ydCB0b29sIG9mIENhbWVsZW9uICAoZGVmYXVsdDogInJlcG9ydCIpCi0gICogQ0FNRUxFT05fUkVQT1JUX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSByZXBvcnQgdG9vbCBvZiBDYW1lbGVvbgotCi0gICogQ0FNRUxFT05fWk9HR1kgLSB6b2dneSB0b29sIG9mIENhbWVsZW9uCi0gICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogImNhbWxwNG8gcGFfem9nLmNtYSBwcl9vLmNtbyIpCi0gICogQ0FNRUxFT05fWk9HR1lfRkxBR1MgLSBmbGFncyBmb3IgdGhlIHpvZ2d5IHRvb2wgb2YgQ2FtZWxlb24KLQotICAqIE9DQU1MX0dMQURFQ0MgLSBHbGFkZSBjb21waWxlciBmb3IgT0NhbWwgICAgIChkZWZhdWx0OiAibGFibGdsYWRlY2MyIikKLSAgKiBPQ0FNTF9HTEFERUNDX0ZMQUdTIC0gZmxhZ3MgZm9yIHRoZSBHbGFkZSBjb21waWxlcgotCi0gICogT1hSSURMICAgICAgICAtIE9YUklETC1nZW5lcmF0b3IgIChkZWZhdWx0OiAib3hyaWRsIikKLQotICAqIE5PSURMSEVBREVSICAgLSBzZXQgdG8gInllcyIgdG8gcHJvaGliaXQgIk9DYW1sTWFrZWZpbGUiIGZyb20gdXNpbmcKLSAgICAgICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgY2FtbGlkbC1mbGFnICItaGVhZGVyIi4KLQotICAqIE5PX0NVU1RPTSAgICAgLSBQcmV2ZW50IGxpbmtpbmcgaW4gY3VzdG9tIG1vZGUuCi0KLSAgKiBRVUlFVCAgICAgICAgIC0gdW5zZXR0aW5nIHRoaXMgdmFyaWFibGUgKGUuZy4gIm1ha2UgUVVJRVQ9IikKLSAgICAgICAgICAgICAgICAgICAgd2lsbCBwcmludCBhbGwgZXhlY3V0ZWQgY29tbWFuZHMsIGluY2x1ZGluZwotICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgb25lcy4gVGhpcyBhbGxvd3MgbW9yZSBjb21mb3J0YWJsZQotICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dpbmcgd2hlbiB0aGluZ3MgZ28gd3JvbmcgZHVyaW5nIGEgYnVpbGQuCi0KLSAgKiBSRUFMTFlfUVVJRVQgIC0gd2hlbiBzZXQgdGhpcyBmbGFnIHR1cm5zIG9mZiBvdXRwdXQgZnJvbSBzb21lIGNvbW1hbmRzLgotCi0gICogT0NBTUxNQUtFRklMRSAtIGxvY2F0aW9uIG9mICg9cGF0aCB0bykgdGhpcyAiT0NhbWxNYWtlZmlsZSIuCi0gICAgICAgICAgICAgICAgICAgIEJlY2F1c2UgaXQgY2FsbGVzIGl0c2VsZiByZWN1cnNpdmVseSwgaXQgaGFzIHRvCi0gICAgICAgICAgICAgICAgICAgIGtub3cgd2hlcmUgaXQgaXMuIChkZWZhdWx0OiAiT0NhbWxNYWtlZmlsZSIgPQotICAgICAgICAgICAgICAgICAgICBsb2NhbCBkaXJlY3RvcnkpCi0KLSAgKiBCQ1NVRkZJWCAgICAgIC0gU3VmZml4IGZvciBhbGwgYnl0ZS1jb2RlIGZpbGVzLiBFLmcuOgotCi0gICAgICAgICAgICAgICAgICAgICAgUkVTVUxUICAgPSBmb28KLSAgICAgICAgICAgICAgICAgICAgICBCQ1NVRkZJWCA9IF9iYwotCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgd2lsbCBwcm9kdWNlIGJ5dGUtY29kZSBleGVjdXRhYmxlcy9saWJyYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgd2l0aCBiYXNlbmFtZSAiZm9vX2JjIi4KLQotICAqIE5DU1VGRklYICAgICAgLSBTaW1pbGFyIHRvICJCQ1NVRkZJWCIsIGJ1dCBmb3IgbmF0aXZlLWNvZGUgZmlsZXMuCi0gICogVE9QU1VGRklYICAgICAtIFN1ZmZpeCBhZGRlZCB0byB0b3BsZXZlbCBpbnRlcnByZXRlcnMgKGRlZmF1bHQ6ICIudG9wIikKLQotICAqIFNVQlBST0pTICAgICAgLSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBzdWJwcm9qZWN0cyB0byBiZQotICAgICAgICAgICAgICAgICAgICBjb21waWxlZC4KLQotICAqIFNVQlRBUkdFVCAgICAgLSB0YXJnZXQgdG8gYmUgYnVpbHQgZm9yIGFsbCBwcm9qZWN0cyBpbiB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICBTVUJQUk9KUy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgdmFyaWFibGVzIGZvciBXaW5kb3dzIHVzZXJzCi0KLSAgKiBNSU5HVyAgICAgICAgIC0gdmFyaWFibGUgdG8gZGV0ZWN0IHRoZSBNSU5HVy1lbnZpcm9ubWVudAotICAqIE1TVkMgICAgICAgICAgLSB2YXJpYWJsZSB0byBkZXRlY3QgdGhlIE1TVkMtY29tcGlsZXIKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVwLXRvLWRhdGUgaW5mb3JtYXRpb24gKG5ld2VzdCByZWxlYXNlIG9mIGRpc3RyaWJ1dGlvbikgY2FuIGFsd2F5cyBiZQotZm91bmQgYXQ6Ci0KLSAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FbmpveSEKLQotTmV3IFlvcmssIDIwMDctMDQtMjIKLU1hcmt1cyBNb3R0bAotCi1lLW1haWw6IG1hcmt1cy5tb3R0bEBnbWFpbC5jb20KLVdXVzogICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvUkVBRE1FIGIvbGliL29jYW1sL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL29jYW1sL1JFQURNRQpyZW5hbWUgdG8gbGliL29jYW1sL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL19vYXNpcyBiL2xpYi9vY2FtbC9fb2FzaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkOTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9fb2FzaXMKQEAgLTAsMCArMSwxOSBAQAorTmFtZTogbGlidGhyaWZ0LW9jYW1sCitWZXJzaW9uOiAxLjAuMAorT0FTSVNGb3JtYXQ6IDAuMworU3lub3BzaXM6IE9DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCitBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0xpY2Vuc2U6IEFwYWNoZS0yLjAKK0hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKK0J1aWxkVG9vbHM6IG9jYW1sYnVpbGQKK1BsdWdpbnM6ICAgICBNRVRBICgwLjMpLAorICBEZXZGaWxlcyAoMC4zKQorCitMaWJyYXJ5ICJsaWJ0aHJpZnQtb2NhbWwiCisgIFBhdGg6IHNyYworICBGaW5kbGliTmFtZTogdGhyaWZ0CisgIGJ1aWxkVG9vbHM6IG9jYW1sYnVpbGQKKyAgQnVpbGREZXBlbmRzOiB0aHJlYWRzCisgIE1vZHVsZXM6IFRocmlmdCxUQmluYXJ5UHJvdG9jb2wsVFNvY2tldCxURnJhbWVkVHJhbnNwb3J0LFRDaGFubmVsVHJhbnNwb3J0LFRTZXJ2ZXIsVFNpbXBsZVNlcnZlcixUU2VydmVyU29ja2V0LFRUaHJlYWRlZFNlcnZlcgorICBYTUVUQVJlcXVpcmVzOiB0aHJlYWRzCisKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL29jYW1sL2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMzkwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL2Rlc2NyIGIvbGliL29jYW1sL2Rlc2NyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTc0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvZGVzY3IKQEAgLTAsMCArMSBAQAorT0NhbWwgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9vcGFtIGIvbGliL29jYW1sL29wYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYzNkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vY2FtbC9vcGFtCkBAIC0wLDAgKzEsOCBAQAorb3BhbS12ZXJzaW9uOiAiMSIKK21haW50YWluZXI6ICJYWFgoRklMTCBNRSBJTiBXSVRIIEVNQUlMKSIKK2J1aWxkOiBbCisgIFttYWtlXQorICBbbWFrZSAiaW5zdGFsbCJdCitdCityZW1vdmU6IFtbIm9jYW1sZmluZCIgInJlbW92ZSIgInRocmlmdCJdXQorZGVwZW5kczogWyJvY2FtbGZpbmQiXQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL3NyYy9UaHJpZnQubWwgYi9saWIvb2NhbWwvc3JjL1RocmlmdC5tbAppbmRleCA4ZDQyM2QwLi5mMGQ3YTQyIDEwMDY0NAotLS0gYS9saWIvb2NhbWwvc3JjL1RocmlmdC5tbAorKysgYi9saWIvb2NhbWwvc3JjL1RocmlmdC5tbApAQCAtMjYxLDYgKzI2MSw4IEBACiAgICAgICB8IE5FR0FUSVZFX1NJWkUKICAgICAgIHwgU0laRV9MSU1JVAogICAgICAgfCBCQURfVkVSU0lPTgorICAgICAgfCBOT1RfSU1QTEVNRU5URUQKKyAgICAgIHwgREVQVEhfTElNSVQKIAogICBleGNlcHRpb24gRSBvZiBleG5fdHlwZSAqIHN0cmluZzs7CiAKQEAgLTI5NCw2ICsyOTYsOSBAQAogICAgICAgfCBNSVNTSU5HX1JFU1VMVAogICAgICAgfCBJTlRFUk5BTF9FUlJPUgogICAgICAgfCBQUk9UT0NPTF9FUlJPUgorICAgICAgfCBJTlZBTElEX1RSQU5TRk9STQorICAgICAgfCBJTlZBTElEX1BST1RPQ09MCisgICAgICB8IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFCiAKICAgbGV0IHR5cF9vZl9pID0gZnVuY3Rpb24KICAgICAgIDBsIC0+IFVOS05PV04KQEAgLTMwNCw2ICszMDksOSBAQAogICAgIHwgNWwgLT4gTUlTU0lOR19SRVNVTFQKICAgICB8IDZsIC0+IElOVEVSTkFMX0VSUk9SCiAgICAgfCA3bCAtPiBQUk9UT0NPTF9FUlJPUgorICAgIHwgOGwgLT4gSU5WQUxJRF9UUkFOU0ZPUk0KKyAgICB8IDlsIC0+IElOVkFMSURfUFJPVE9DT0wKKyAgICB8IDEwbCAtPiBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRQogICAgIHwgXyAtPiByYWlzZSBUaHJpZnRfZXJyb3I7OwogICBsZXQgdHlwX3RvX2kgPSBmdW5jdGlvbgogICAgIHwgVU5LTk9XTiAtPiAwbApAQCAtMzE0LDYgKzMyMiw5IEBACiAgICAgfCBNSVNTSU5HX1JFU1VMVCAtPiA1bAogICAgIHwgSU5URVJOQUxfRVJST1IgLT4gNmwKICAgICB8IFBST1RPQ09MX0VSUk9SIC0+IDdsCisgICAgfCBJTlZBTElEX1RSQU5TRk9STSAtPiA4bAorICAgIHwgSU5WQUxJRF9QUk9UT0NPTCAtPiA5bAorICAgIHwgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgLT4gMTBsCiAKICAgY2xhc3MgdCA9CiAgIG9iamVjdCAoc2VsZikKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC91cmwgYi9saWIvb2NhbWwvdXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGQ2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvdXJsCkBAIC0wLDAgKzEsMiBAQAorYXJjaGl2ZTogIlhYWChGSUxMIE1FIElOIFdJVEggVVJMKSIKK2NoZWNrc3VtOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBNRDUpIgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTUFOSUZFU1QuU0tJUCBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2M2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKQEAgLTAsMCArMSwxMyBAQAorYmxpYi8uKiQKK2J1aWxkLWNwYW4tZGlzdC5zaAorRml4dXBEaXN0LnBsCitNQU5JRkVTVC5iYWsKK01BTklGRVNULlNLSVAKK01ZTUVUQS5qc29uCitNYWtlZmlsZQorTWFrZWZpbGUuYW0KK01ha2VmaWxlLmluCitwbV90b19ibGliCit0ZXN0L01ha2VmaWxlLmFtCit0ZXN0L01ha2VmaWxlLmluCit0b29scy9GaXh1cERpc3QucGwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLlBMIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKaW5kZXggOTRlYTM3Yy4uYmRlYWFkMiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuUEwKKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKQEAgLTE3LDEzICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKIHVzZSBFeHRVdGlsczo6TWFrZU1ha2VyOwotV3JpdGVNYWtlZmlsZSggJ05BTUUnID0+ICdUaHJpZnQnLAotICAgICAgICAgICAgICAgJ1ZFUlNJT05fRlJPTScgPT4gJ2xpYi9UaHJpZnQucG0nLAotICAgICAgICAgICAgICAgJ1BSRVJFUV9QTScgICAgICAgICAgICAgID0+IHsKLSAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InID0+IDAsCisKK1dyaXRlTWFrZWZpbGUoIEFCU1RSQUNUID0+ICdBcGFjaGUgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nLAorICAgICAgICAgICAgICAgQVVUSE9SID0+ICdBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+JywKKyAgICAgICAgICAgICAgIExJQ0VOU0UgPT4gJ2FwYWNoZV8yXzAnLAorICAgICAgICAgICAgICAgTUlOX1BFUkxfVkVSU0lPTiA9PiAnNS4wMTAwMDAnLAorICAgICAgICAgICAgICAgTkFNRSA9PiAnVGhyaWZ0JywKKyAgICAgICAgICAgICAgIE5FRURTX0xJTktJTkcgPT4gMCwKKyAgICAgICAgICAgICAgIFBSRVJFUV9QTSA9PiB7CisgICAgICAgICAgICAgICAgICAgJ0JpdDo6VmVjdG9yJyAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAnQ2xhc3M6OkFjY2Vzc29yJyA9PiAwCiAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgKCRdID49IDUuMDA1ID8KLSAoICAgICAgICAgICAgICAgIEFVVEhPUiAgICAgPT4gJ1QgSmFrZSBMdWNpYW5pIDxqYWtlcnNAZ21haWwuY29tPicpIDogKCkpLAotICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgIFZFUlNJT05fRlJPTSA9PiAnbGliL1RocmlmdC5wbScgKTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLmFtIGIvbGliL3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggOGUwY2FhZS4uZmEwZjE2YiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuYW0KQEAgLTIzLDMzICsyMyw4NiBAQAogCSQoUEVSTCkgTWFrZWZpbGUuUEwgTUFLRUZJTEU9TWFrZWZpbGUtcGVybC5tayBJTlNUQUxMRElSUz0kKElOU1RBTExESVJTKSBJTlNUQUxMX0JBU0U9JChQRVJMX1BSRUZJWCkKIAogYWxsLWxvY2FsOiBNYWtlZmlsZS1wZXJsLm1rCi0JJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rCisJJChNQUtFKSAtZiAkPAogCWZpbmQgYmxpYiAtbmFtZSAnTWFrZWZpbGUqJyAtZXhlYyBybSAtZiB7fSBcOwogCi1jaGVjay1sb2NhbDoKLQkkKFBFUkwpIC1JYmxpYi9saWIgLUlAYWJzX3NyY2RpckAgLUlAYnVpbGRkaXJAL3Rlc3QvZ2VuLXBlcmwgXAotCQlAYWJzX3NyY2RpckAvdGVzdC5wbCBAYWJzX3NyY2RpckAvdGVzdC8qLnQKLQogaW5zdGFsbC1leGVjLWxvY2FsOiBNYWtlZmlsZS1wZXJsLm1rCi0JJChNQUtFKSAtZiBNYWtlZmlsZS1wZXJsLm1rIGluc3RhbGwgREVTVERJUj0kKERFU1RESVIpLworCSQoTUFLRSkgLWYgJDwgaW5zdGFsbCBERVNURElSPSQoREVTVERJUikvCiAKIGNsZWFuLWxvY2FsOgogCWlmIHRlc3QgLWYgTWFrZWZpbGUtcGVybC5tayA7IHRoZW4gXAogCQkkKE1BS0UpIC1mIE1ha2VmaWxlLXBlcmwubWsgY2xlYW4gOyBcCiAJZmkKLQlybSAtZiBNYWtlZmlsZS1wZXJsLm1rLm9sZAorCSQoUk0pIE1ha2VmaWxlLXBlcmwubWsub2xkCisJJChSTSkgLXIgZ2VuLXBlcmwgZ2VuLXBlcmwyCiAKIEVYVFJBX0RJU1QgPSBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJYnVpbGQtY3Bhbi1kaXN0LnNoIFwKIAlNYWtlZmlsZS5QTCBcCiAJdGVzdC5wbCBcCiAJbGliL1RocmlmdC5wbSBcCiAJbGliL1RocmlmdC5wbSBcCiAJbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbSBcCiAJbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbSBcCisJbGliL1RocmlmdC9FeGNlcHRpb24ucG0gXAogCWxpYi9UaHJpZnQvRnJhbWVkVHJhbnNwb3J0LnBtIFwKIAlsaWIvVGhyaWZ0L0h0dHBDbGllbnQucG0gXAogCWxpYi9UaHJpZnQvTWVtb3J5QnVmZmVyLnBtIFwKKwlsaWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtIFwKKwlsaWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtIFwKKwlsaWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0gXAogCWxpYi9UaHJpZnQvUHJvdG9jb2wucG0gXAorCWxpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0gXAogCWxpYi9UaHJpZnQvU2VydmVyLnBtIFwKKwlsaWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbSBcCiAJbGliL1RocmlmdC9Tb2NrZXQucG0gXAotCWxpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCisJbGliL1RocmlmdC9TU0xTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIFwKKwlsaWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gXAorCWxpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBcCisJbGliL1RocmlmdC9UeXBlLnBtIFwKKwlsaWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBcCisJUkVBRE1FLm1kCisKK1RIUklGVCA9IEB0b3BfYnVpbGRkaXJAL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RIUklGVF9JRiA9IEB0b3Bfc3JjZGlyQC90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitOQU1FX0JFTkNITUFSS1NFUlZJQ0UgPSAgQHRvcF9zcmNkaXJAL2xpYi9yYi9iZW5jaG1hcmsvQmVuY2htYXJrLnRocmlmdAorTkFNRV9BR0dSID0gQHRvcF9zcmNkaXJAL2NvbnRyaWIvYXN5bmMtdGVzdC9hZ2dyLnRocmlmdAorCitUSFJJRlRURVNUX0dFTiA9IFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L0NvbnN0YW50cy5wbSBcCisJZ2VuLXBlcmwvVGhyaWZ0VGVzdC9TZWNvbmRTZXJ2aWNlLnBtIFwKKwlnZW4tcGVybC9UaHJpZnRUZXN0L1RocmlmdFRlc3QucG0gXAorCWdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG0KKworQkVOQ0hNQVJLX0dFTiA9IFwKKwlnZW4tcGVybC9CZW5jaG1hcmtTZXJ2aWNlLnBtIFwKKwlnZW4tcGVybC9Db25zdGFudHMucG0gXAorCWdlbi1wZXJsL1R5cGVzLnBtCisKK0FHR1JfR0VOID0gXAorCWdlbi1wZXJsMi9BZ2dyLnBtIFwKKwlnZW4tcGVybDIvQ29uc3RhbnRzLnBtIFwKKwlnZW4tcGVybDIvVHlwZXMucG0KKworUEVSTF9HRU4gPSBcCisJJChUSFJJRlRURVNUX0dFTikgXAorCSQoQkVOQ0hNQVJLX0dFTikgXAorCSQoQUdHUl9HRU4pCisKK0JVSUxUX1NPVVJDRVMgPSAkKFBFUkxfR0VOKQorCitjaGVjay1sb2NhbDogJChQRVJMX0dFTikKKwkkKFBFUkwpIC1JYmxpYi9saWIgLUlAYWJzX3NyY2RpckAgLUlAYnVpbGRkaXJAL2dlbi1wZXJsMiAtSUBidWlsZGRpckAvZ2VuLXBlcmwgXAorCQlAYWJzX3NyY2RpckAvdGVzdC5wbCBAYWJzX3NyY2RpckAvdGVzdC8qLnQKKworJChUSFJJRlRURVNUX0dFTik6ICQoVEhSSUZUX0lGKSAkKFRIUklGVCkKKwkkKFRIUklGVCkgLS1nZW4gcGVybCAkPAorCiskKEJFTkNITUFSS19HRU4pOiAkKE5BTUVfQkVOQ0hNQVJLU0VSVklDRSkgJChUSFJJRlQpCisJJChUSFJJRlQpIC0tZ2VuIHBlcmwgJDwKKworJChBR0dSX0dFTik6ICQoTkFNRV9BR0dSKSAkKFRIUklGVCkKKwkkKE1LRElSX1ApIGdlbi1wZXJsMgorCSQoVEhSSUZUKSAtb3V0IGdlbi1wZXJsMiAtLWdlbiBwZXJsICQ8CmRpZmYgLS1naXQgYS9saWIvcGVybC9SRUFETUUgYi9saWIvcGVybC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTQ4OGIuLjAwMDAwMDAKLS0tIGEvbGliL3BlcmwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotVGhyaWZ0IFBlcmwgU29mdHdhcmUgTGlicmFyeQotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1Vc2luZyBUaHJpZnQgd2l0aCBQZXJsCi09PT09PT09PT09PT09PT09PT09PT0KLQotVGhyaWZ0IHJlcXVpcmVzIFBlcmwgPj0gNS42LjAKLQotRXhjZXB0aW9ucyBhcmUgdGhyb3duIHdpdGggZGllIHNvIGJlIHN1cmUgdG8gd3JhcCBldmFse30gc3RhdG1lbnRzCi1hcm91bmQgYW55IGNvZGUgdGhhdCBjb250YWlucyBleGNlcHRpb25zLgotCi1UaGUgNjRiaXQgSW50ZWdlcnMgd29yayBvbmx5IHVwdG8gMl40MiBvbiBteSBtYWNoaW5lIDotPwotTWF0aDo6QmlnSW50IGlzIHByb2JhYmx5IG5lZWRlZC4KLQotUGxlYXNlIHNlZSB0dXRvcmFsIGFuZCB0ZXN0IGRpcnMgZm9yIGV4YW1wbGVzLi4uCi0KLURlcGVuZGVuY2llcwotPT09PT09PT09PT09Ci0KLUJpdDo6VmVjdG9yICAgICAtIGNvbWVzIHdpdGggbW9kZXJuIHBlcmwgaW5zdGFsbGF0aW9ucy4KLUNsYXNzOjpBY2Nlc3NvcgotCmRpZmYgLS1naXQgYS9saWIvcGVybC9SRUFETUUubWQgYi9saWIvcGVybC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZTViMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL1JFQURNRS5tZApAQCAtMCwwICsxLDEyNCBAQAorVGhyaWZ0IFBlcmwgU29mdHdhcmUgTGlicmFyeQorCisjIFN1bW1hcnkKKworQXBhY2hlIFRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuCitJdCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yaworZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIEEgbGFuZ3VhZ2UtbmV1dHJhbCBJREwKK2lzIHVzZWQgdG8gZ2VuZXJhdGUgZnVuY3Rpb25pbmcgY2xpZW50IGxpYnJhcmllcyBhbmQgc2VydmVyLXNpZGUgaGFuZGxpbmcgZnJhbWV3b3Jrcy4KKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIEZvciBNb3JlIEluZm9ybWF0aW9uCisKK1NlZSB0aGUgW0FwYWNoZSBUaHJpZnQgV2ViIFNpdGVdKGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIFBlcmwKKworVGhyaWZ0IHJlcXVpcmVzIFBlcmwgPj0gNS4xMC4wCisKK1VuZXhwZWN0ZWQgZXhjZXB0aW9ucyBpbiBhIHNlcnZpY2UgaGFuZGxlciBhcmUgY29udmVydGVkIHRvCitUQXBwbGljYXRpb25FeGNlcHRpb24gd2l0aCB0eXBlIElOVEVSTkFMIEVSUk9SIGFuZCB0aGUgc3RyaW5nCitvZiB0aGUgZXhjZXB0aW9uIGlzIGRlbGl2ZXJlZCBhcyB0aGUgbWVzc2FnZS4KKworT24gdGhlIGNsaWVudCBzaWRlLCBleGNlcHRpb25zIGFyZSB0aHJvd24gd2l0aCBkaWUsIHNvIGJlIHN1cmUKK3RvIHdyYXAgZXZhbHt9IHN0YXRtZW50cyBhcm91bmQgYW55IGNvZGUgdGhhdCBjb250YWlucyBleGNlcHRpb25zLgorCitQbGVhc2Ugc2VlIHR1dG9yYWwgYW5kIHRlc3QgZGlycyBmb3IgZXhhbXBsZXMuCisKK1RoZSBQZXJsIEZvcmtpbmdTZXJ2ZXIgaWdub3JlcyBTSUdDSExEIGFsbG93aW5nIHRoZSBmb3JrcyB0byBiZQorcmVhcGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hdHVyYWxseSB3aGVuIHRoZXkgZXhpdC4gIFRoaXMgbWVhbnMKK29uZSBjYW5ub3QgdXNlIGEgY3VzdG9tIFNJR0NITEQgaGFuZGxlciBpbiB0aGUgY29uc3VtaW5nIHBlcmwKK2ltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgc2VydmUoKS4gIEl0IGlzIGFjY2VwdGFibGUgdG8gdXNlCithIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgd2l0aGluIGEgdGhyaWZ0IGhhbmRsZXIgaW1wbGVtZW50YXRpb24KK2FzIHRoZSBGb3JraW5nU2VydmVyIHJlc2V0cyB0aGUgZm9ya2VkIGNoaWxkIHByb2Nlc3MgdG8gdXNlCitkZWZhdWx0IHNpZ25hbCBoYW5kbGluZy4KKworIyBEZXBlbmRlbmNpZXMKKworVGhlIGZvbGxvd2luZyBtb2R1bGVzIGFyZSBub3QgcHJvdmlkZWQgYnkgUGVybCA1LjEwLjAgYnV0IGFyZSByZXF1aXJlZAordG8gdXNlIFRocmlmdC4KKworIyMgUnVudGltZQorCisgICogQml0OjpWZWN0b3IKKyAgKiBDbGFzczo6QWNjZXNzb3IKKworIyMjIEh0dHBDbGllbnQgVHJhbnNwb3J0CisKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIFRocmlmdDo6SHR0cENsaWVudDoKKworICAqIEhUVFA6OlJlcXVlc3QKKyAgKiBJTzo6U3RyaW5nCisgICogTFdQOjpVc2VyQWdlbnQKKworIyMjIFNTTC9UTFMKKworVGhlc2UgYXJlIG9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgVGhyaWZ0OjpTU0xTb2NrZXQgb3IgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ6CisKKyAgKiBJTzo6U29ja2V0OjpTU0wKKworIyBCcmVha2luZyBDaGFuZ2VzCisKKyMjIDAuMTAuMAorCitUaGUgc29ja2V0IGNsYXNzZXMgd2VyZSByZWZhY3RvcmVkIGluIDAuMTAuMCBzbyB0aGF0IHRoZXJlIGlzIG9uZSBwYWNrYWdlIHBlcgorZmlsZS4gIFRoaXMgbWVhbnMgYHVzZSBTb2NrZXQ7YCBubyBsb25nZXIgZGVmaW5lcyBTU0xTb2NrZXQuICBZb3UgY2FuIHVzZSB0aGlzCit0ZWNobmlxdWUgdG8gbWFrZSB5b3VyIGFwcGxpY2F0aW9uIHJ1biBhZ2FpbnN0IDAuMTAuMCBhcyB3ZWxsIGFzIGVhcmxpZXIgdmVyc2lvbnM6CisKK2BldmFsIHsgcmVxdWlyZSBUaHJpZnQ6OlNTTFNvY2tldDsgfSBvciBkbyB7IHJlcXVpcmUgVGhyaWZ0OjpTb2NrZXQ7IH1gCisKKyMjIDAuMTEuMAorCisgICogTmFtZXNwYWNlcyBvZiBwYWNrYWdlcyB0aGF0IHdlcmUgbm90IHNjb3BlZCB3aXRoaW4gVGhyaWZ0IGhhdmUgYmVlbiBmaXhlZC4KKyAgKiogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorICAqKiBURXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRFeGNlcHRpb24KKyAgKiogVE1lc3NhZ2VUeXBlIGlzIG5vdyBUaHJpZnQ6OlRNZXNzYWdlVHlwZQorICAqKiBUUHJvdG9jb2xFeGNlcHRpb24gaXMgbm93IFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uCisgICoqIFRQcm90b2NvbEZhY3RvcnkgaXMgbm93IFRocmlmdDo6VFByb3RvY29sRmFjdG9yeQorICAqKiBUVHJhbnNwb3J0RXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24KKyAgKiogVFR5cGUgaXMgbm93IFRocmlmdDo6VFR5cGUKKworSWYgeW91IG5lZWQgYSBzaW5nbGUgdmVyc2lvbiBvZiB5b3VyIGNvZGUgdG8gd29yayB3aXRoIGJvdGggb2xkZXIgYW5kIG5ld2VyIHRocmlmdAorbmFtZXNwYWNlIGNoYW5nZXMsIHlvdSBjYW4gbWFrZSB0aGUgbmV3LCBjb3JyZWN0IG5hbWVzcGFjZXMgYmVoYXZlIGxpa2UgdGhlIG9sZCBvbmVzCitpbiB5b3VyIGZpbGVzIHdpdGggdGhpcyB0ZWNobmlxdWUgdG8gY3JlYXRlIGFuIGFsaWFzLCB3aGljaCB3aWxsIGFsbG93IHlvdSBjb2RlIHRvCitydW4gYWdhaW5zdCBlaXRoZXIgdmVyc2lvbiBvZiB0aGUgcGVybCBydW50aW1lIGZvciB0aHJpZnQ6CisKK2BCRUdJTiB7KlRUeXBlOjogPSAqVGhyaWZ0OjpUVHlwZTo6fWAKKworICAqIFBhY2thZ2VzIGZvdW5kIGluIFRocmlmdC5wbSB3ZXJlIG1vdmVkIGludG8gdGhlIFRocmlmdC8gZGlyZWN0b3J5IGluIHNlcGFyYXRlIGZpbGVzOgorICAqKiBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBub3cgaW4gVGhyaWZ0L0V4Y2VwdGlvbi5wbQorICAqKiBUaHJpZnQ6OlRFeGNlcHRpb24gaXMgbm93IGluIFRocmlmdC9FeGNlcHRpb24ucG0KKyAgKiogVGhyaWZ0OjpUTWVzc2FnZVR5cGUgaXMgbm93IGluIFRocmlmdC9NZXNzYWdlVHlwZS5wbQorICAqKiBUaHJpZnQ6OlRUeXBlIGlzIG5vdyBpbiBUaHJpZnQvVHlwZS5wbQorCitJZiB5b3UgbmVlZCB0byBtb2RpZnkgeW91ciBjb2RlIHRvIHdvcmsgYWdhaW5zdCBib3RoIG9sZGVyIG9yIG5ld2VyIHRocmlmdCB2ZXJzaW9ucywKK3lvdSBjYW4gZGVhbCB3aXRoIHRoZXNlIGNoYW5nZXMgaW4gYSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3YXkgaW4geW91ciBwcm9qZWN0cyB1c2luZyBldmFsOgorCitgZXZhbCAgeyByZXF1aXJlIFRocmlmdDo6RXhjZXB0aW9uOyByZXF1aXJlIFRocmlmdDo6TWVzc2FnZVR5cGU7IHJlcXVpcmUgVGhyaWZ0OjpUeXBlOyB9Cisgb3IgZG8geyByZXF1aXJlIFRocmlmdDsgfWAKKworIyBEZXByZWNhdGlvbnMKKworIyMgMC4xMS4wCisKK1RocmlmdDo6SHR0cENsaWVudCBzZXRSZWN2VGltZW91dCgpIGFuZCBzZXRTZW5kVGltZW91dCgpIGFyZSBkZXByZWNhdGVkLiAKK1VzZSBzZXRUaW1lb3V0IGluc3RlYWQuCisKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaCBiL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZTIyZTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvYnVpbGQtY3Bhbi1kaXN0LnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFRoaXMgc2NyaXB0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgdGFnZ2luZyB0aGUgcmVwb3NpdG9yeSBhbmQgdXBkYXRpbmcKKyMgdGhlIHZlcnNpb24gZmlsZXMgZm9yIGEgcmVsZWFzZS4gIEl0IHdpbGwgY3JlYXRlIGEgQ1BBTiBhcmNoaXZlLiAgUnVuIHRoaXMKKyMgZnJvbSBpbnNpZGUgYSBkb2NrZXIgaW1hZ2UgbGlrZSB1YnVudHUteGVuaWFsLgorIworCitzZXQgLWUKKworcm0gLWYgTUFOSUZFU1QKK3JtIC1yZiBUaHJpZnQtKgorCisjIHNldHVwIGNwYW4gd2l0aG91dCBhIHByb21wdAorZWNobyB8IGNwYW4KK2NwYW4gaW5zdGFsbCBIVFRQOjpEYXRlCitjcGFuIGluc3RhbGwgQ1BBTgorY3BhbiBpbnN0YWxsIENQQU46Ok1ldGEgRXh0VXRpbHM6Ok1ha2VNYWtlciBKU09OOjpQUAorCitwZXJsIE1ha2VmaWxlLlBMCitybSBNWU1FVEEueW1sCittYWtlIG1hbmlmZXN0CittYWtlIGRpc3QKKworIworIyBXZSB1bnBhY2sgdGhlIGFyY2hpdmUgc28gd2UgY2FuIGFkZCB2ZXJzaW9uIG1ldGFkYXRhIGZvciBDUEFOCisjIHNvIHRoYXQgaXQgcHJvcGVybHkgaW5kZXhlcyBUaHJpZnQgYW5kIHJlbW92ZSB1bm5lY2Vzc2FyeSBmaWxlcy4KKyMKKworZWNobyAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCitzZXQgLXgKKworRElTVEZJTEU9JChscyBUaHJpZnQqLmd6KQorTkVXRklMRT0ke0RJU1RGSUxFL3Qtdi90LX0KK2lmIFtbICIkRElTVEZJTEUiICE9ICIkTkVXRklMRSIgXV07IHRoZW4KKyAgICBtdiAkRElTVEZJTEUgJE5FV0ZJTEUKKyAgICBESVNURklMRT0iJE5FV0ZJTEUiCitmaQordGFyIHh6ZiAkRElTVEZJTEUKK3JtICRESVNURklMRQorRElTVERJUj0kKGxzIC1kIFRocmlmdCopCisjIGNwYW4gZG9lc24ndCBsaWtlICJUaHJpZnQtdjAubm4uMCBhcyBhIGRpcmVjdG9yeSBuYW1lCisjIG5lZWRzIHRvIGJlIFRocmlmdC0wLm5uLjAKK05FV0RJUj0ke0RJU1RESVIvdC12L3QtfQoraWYgW1sgIiRESVNURElSIiAhPSAiJE5FV0RJUiIgXV07IHRoZW4KKyAgICBtdiAkRElTVERJUiAkTkVXRElSCisgICAgRElTVERJUj0iJE5FV0RJUiIKK2ZpCitjZCAkRElTVERJUgorY3AgLXAgLi4vTWFrZWZpbGUuUEwgLgorcGVybCAuLi90b29scy9GaXh1cERpc3QucGwKK2NkIC4uCit0YXIgY3Z6ZiAkRElTVEZJTEUgJERJU1RESVIKK3JtIC1yICRESVNURElSCmRpZmYgLS1naXQgYS9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGU4MjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxLDIgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKS4KK0FkZGl0aW9uYWwgcGVybCBjb2Rpbmcgc3RhbmRhcmRzIGNhbiBiZSBmb3VuZCBpbiBbcGVybHN0eWxlXShodHRwOi8vcGVybGRvYy5wZXJsLm9yZy9wZXJsc3R5bGUuaHRtbCkuCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQppbmRleCA1YzJiOTkxLi5hYjQwOTMwIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KQEAgLTE3LDE2MyArMTcsMjAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLW91ciAkVkVSU0lPTiA9ICcwLjkuMCc7Ci0KLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogIwotIyBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorIyBWZXJzaW9uaW5nCiAjCi1wYWNrYWdlIFRUeXBlOwotdXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwotdXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwotdXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwotdXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwotdXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwotdXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwotdXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwotdXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwotdXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKLXVzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Ci11c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwotdXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKLXVzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Ci11c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwotdXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKLXVzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Ci11c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OwotMTsKLQorIyBFdmVyeSBwZXJsIG1vZHVsZSBmb3IgVGhyaWZ0IHdpbGwgaGF2ZSB0aGUgc2FtZSB2ZXJzaW9uCisjIGRlY2xhcmF0aW9uLiAgRm9yIGEgcHJvZHVjdGlvbiBidWlsZCwgY2hhbmdlIGl0IGJlbG93IHRvCisjIHNvbWV0aGluZyBsaWtlICJ2MC4xMS4wIiBhbmQgYWxsIG9mIHRoZSBwYWNrYWdlcyBpbiBhbGwKKyMgb2YgdGhlIGZpbGVzIHdpbGwgcGljayBpdCB1cCBmcm9tIGhlcmUuCiAjCi0jIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQwotIwotcGFja2FnZSBUTWVzc2FnZVR5cGU7Ci11c2UgY29uc3RhbnQgQ0FMTCAgICAgID0+IDE7Ci11c2UgY29uc3RhbnQgUkVQTFkgICAgID0+IDI7Ci11c2UgY29uc3RhbnQgRVhDRVBUSU9OID0+IDM7Ci11c2UgY29uc3RhbnQgT05FV0FZICAgID0+IDQ7Ci0xOwogCi1wYWNrYWdlIFRocmlmdDo6VEV4Y2VwdGlvbjsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0xOwotCi1wYWNrYWdlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLXVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKLQotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgVU5LTk9XTl9NRVRIT0QgICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBJTlZBTElEX01FU1NBR0VfVFlQRSA9PiAyOwotdXNlIGNvbnN0YW50IFdST05HX01FVEhPRF9OQU1FICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1NFUVVFTkNFX0lEICAgICAgPT4gNDsKLXVzZSBjb25zdGFudCBNSVNTSU5HX1JFU1VMVCAgICAgICA9PiA1OwotdXNlIGNvbnN0YW50IElOVEVSTkFMX0VSUk9SICAgICAgID0+IDY7Ci11c2UgY29uc3RhbnQgUFJPVE9DT0xfRVJST1IgICAgICAgPT4gNzsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotCi0gICAgbXkgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCk7Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiByZWFkIHsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkaW5wdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICA9IDA7Ci0gICAgbXkgJGZuYW1lID0gdW5kZWY7Ci0gICAgbXkgJGZ0eXBlID0gMDsKLSAgICBteSAkZmlkICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXCRmbmFtZSk7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXCRmbmFtZSwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OyBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgIFNXSVRDSDogZm9yKCRmaWQpCi0gICAgICB7Ci0gICAgICAgICAgLzEvICYmIGRvewotCi0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUUklORykgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgLzIvICYmIGRvewotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpJMzIpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEkzMihcJHNlbGYtPntjb2RlfSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLQotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiB3cml0ZSB7Ci0gICAgbXkgJHNlbGYgICA9IHNoaWZ0OwotICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0KLSAgICBpZiAoJHNlbGYtPmdldE1lc3NhZ2UoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiBnZXRNZXNzYWdlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OwotfQotCi1zdWIgZ2V0Q29kZQotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKLX0KK3BhY2thZ2UgVGhyaWZ0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgidjEuMC4wIik7CiAKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQppbmRleCBjNjM4ZWFkLi5kNjI1MDlhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KQEAgLTE3LDI4ICsxNywyOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKLQordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXVzZSB1dGY4OwotdXNlIEVuY29kZTsKLQotdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OlByb3RvY29sOwotCiB1c2UgQml0OjpWZWN0b3I7Cit1c2UgRW5jb2RlOwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpUeXBlOwordXNlIHV0Zjg7CiAKICMKICMgQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCiAjCiBwYWNrYWdlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgYmFzZSgnVGhyaWZ0OjpQcm90b2NvbCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiB1c2UgY29uc3RhbnQgVkVSU0lPTl9NQVNLICAgPT4gMHhmZmZmMDAwMDsKIHVzZSBjb25zdGFudCBWRVJTSU9OXzEgICAgICA9PiAweDgwMDEwMDAwOwotdXNlIGNvbnN0YW50IElTX0JJR19FTkRJQU4gID0+IHVucGFjaygiaCoiLCBwYWNrKCJzIiwgMSkpID1+IC8wMS87Cit1c2UgY29uc3RhbnQgSVNfQklHX0VORElBTiAgPT4gdW5wYWNrKCdoKicsIHBhY2soJ3MnLCAxKSkgPX4gbS8wMS87CiAKIHN1YiBuZXcKIHsKQEAgLTY2LDcgKzY3LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3ViIHdyaXRlU3RydWN0QmVnaW57CitzdWIgd3JpdGVTdHJ1Y3RCZWdpbgorewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgICByZXR1cm4gMDsKQEAgLTk3LDcgKzk5LDcgQEAKIHN1YiB3cml0ZUZpZWxkU3RvcAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRocmlmdDo6VFR5cGU6OlNUT1ApOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbgpAQCAtMjUyLDE0ICsyNTQsMTYgQEAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRJMzIoXCR2ZXJzaW9uKTsKICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSA+IDApIHsKICAgICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spICE9IFZFUlNJT05fMSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKQorICAgICAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CiAgICAgICB9CiAgICAgICAkJHR5cGUgPSAkdmVyc2lvbiAmIDB4MDAwMDAwZmY7CiAgICAgICByZXR1cm4KICAgICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgICAkc2VsZi0+cmVhZFN0cmluZygkbmFtZSkgKwogICAgICAgICAgICRzZWxmLT5yZWFkSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQorICAgIH0KKyAgICBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQogICAgICAgcmV0dXJuCiAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAkc2VsZi0+cmVhZFN0cmluZ0JvZHkoJG5hbWUsICR2ZXJzaW9uKSArICMgdmVyc2lvbiBoZXJlIGhvbGRzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKQEAgLTI5Nyw3ICszMDEsNyBAQAogCiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkQnl0ZSgkZmllbGRUeXBlKTsKIAotICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAkJGZpZWxkSWQgPSAwOwogICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQpAQCAtNDI1LDcgKzQyOSw3IEBACiAKICAgICBteSAoJGhpLCRsbyk9dW5wYWNrKCdOTicsJGRhdGEpOwogCi0gICAgbXkgJHZlYyA9IG5ldyBCaXQ6OlZlY3Rvcig2NCk7CisgICAgbXkgJHZlYyA9IEJpdDo6VmVjdG9yLT5uZXcoNjQpOwogCiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMzIsJGhpKTsKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwwLCRsbyk7CkBAIC00NDcsNyArNDUxLDcgQEAKICAgICBlbHNlIHsKICAgICAgICRkYXRhID0gc2NhbGFyIHJldmVyc2UoJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoOCkpOwogICAgIH0KLSAgICAKKwogICAgIG15IEBhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CiAKICAgICAkJHZhbHVlID0gJGFyclswXTsKQEAgLTQ2NSw3ICs0NjksOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ4MCw3ICs0ODUsOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ5MSw3ICs0OTcsOCBAQAogIyBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeTsKLXVzZSBiYXNlKCdUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgYmFzZSgnVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTUwNSw3ICs1MTIsNyBAQAogICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgIG15ICR0cmFucyA9IHNoaWZ0OwogCi0gICAgcmV0dXJuIG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFucyk7CisgICAgcmV0dXJuIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnMpOwogfQogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KaW5kZXggMzg2OGNhMi4uNmI1YmY3YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCkBAIC0xNywxNSArMTcsMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogIyBCdWZmZXJlZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgYnVmZmVyZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRXhjZXB0aW9uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpAQCAtMCwwICsxLDE2MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHlwZTsKKworcGFja2FnZSBUaHJpZnQ6OlRFeGNlcHRpb247Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBvdmVybG9hZCAnIiInID0+IHN1YiB7CisgICAgcmV0dXJuCisgICAgICAgIHNwcmludGYgJyVzIGVycm9yOiAlcyAoY29kZSAlcyknLAorICAgICAgICAgIHJlZiggJF9bMF0gKSwKKyAgICAgICAgICAoICRfWzBdLT57bWVzc2FnZX0gfHwgJ2VtcHR5IG1lc3NhZ2UnICksCisgICAgICAgICAgKCBkZWZpbmVkICRfWzBdLT57Y29kZX0gPyAkX1swXS0+e2NvZGV9IDogJ3VuZGVmaW5lZCcgKTsKKyAgICB9OworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworcGFja2FnZSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6VEV4Y2VwdGlvbic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgICAgICAgICA9PiAwOwordXNlIGNvbnN0YW50IFVOS05PV05fTUVUSE9EICAgICAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgPT4gMjsKK3VzZSBjb25zdGFudCBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA9PiAzOwordXNlIGNvbnN0YW50IEJBRF9TRVFVRU5DRV9JRCAgICAgICAgID0+IDQ7Cit1c2UgY29uc3RhbnQgTUlTU0lOR19SRVNVTFQgICAgICAgICAgPT4gNTsKK3VzZSBjb25zdGFudCBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA9PiA2OwordXNlIGNvbnN0YW50IFBST1RPQ09MX0VSUk9SICAgICAgICAgID0+IDc7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgPT4gODsKK3VzZSBjb25zdGFudCBJTlZBTElEX1BST1RPQ09MICAgICAgICA9PiA5OwordXNlIGNvbnN0YW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0+IDEwOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZCB7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGlucHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgPSAwOworICAgIG15ICRmbmFtZSA9IHVuZGVmOworICAgIG15ICRmdHlwZSA9IDA7CisgICAgbXkgJGZpZCAgID0gMDsKKworICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFwkZm5hbWUpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFwkZm5hbWUsIFwkZnR5cGUsIFwkZmlkKTsKKyAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICBsYXN0OyBuZXh0OworICAgICAgICB9CisKKyAgICAgIFNXSVRDSDogZm9yKCRmaWQpCisgICAgICB7CisgICAgICAgICAgLzEvICYmIGRveworCisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJpbmcoXCRzZWxmLT57bWVzc2FnZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgIH07CisKKyAgICAgICAgICAvMi8gJiYgZG97CisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRJMzIoXCRzZWxmLT57Y29kZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICB9CisKKyAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuICR4ZmVyOworfQorCitzdWIgd3JpdGUgeworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgID0gMDsKKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgICAgaWYgKCRzZWxmLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0OjpUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgeworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQ6OlRUeXBlOjpJMzIsIDIpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIGdldE1lc3NhZ2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Cit9CisKK3N1YiBnZXRDb2RlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQppbmRleCBlOGU4NWRjLi5iYTg5YmEzIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQpAQCAtMTcsNiArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTMwLDggKzMxLDggQEAKICMgQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAogIwogcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTY5LDcgKzcwLDcgQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgaWYgKGRlZmluZWQgJHNlbGYtPnt0cmFuc3BvcnR9KSB7Ci0gICAgICAkc2VsZi0+e3RyYW5zcG9ydH0tPmNsb3NlKCk7CisgICAgICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE2Myw0ICsxNjQsMzEgQEAKIAogfQogCisjCisjIEZyYW1lZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgZnJhbWVkIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cworIworcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0ge307CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCisjCisjIEJ1aWxkIGEgZnJhbWVkIHRyYW5zcG9ydCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydAorIworIyBAcmV0dXJuIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0IHRyYW5zcG9ydAorIworc3ViIGdldFRyYW5zcG9ydAoreworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICR0cmFucyA9IHNoaWZ0OworCisgICAgbXkgJGJ1ZmZlcmVkID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQtPm5ldygkdHJhbnMpOworICAgIHJldHVybiAkYnVmZmVyZWQ7Cit9CisKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KaW5kZXggZDZmYzhiZS4uNDBlYzljZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQpAQCAtMTcsMjYgKzE3LDI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKK3VzZSBIVFRQOjpSZXF1ZXN0OwordXNlIElPOjpTdHJpbmc7Cit1c2UgTFdQOjpVc2VyQWdlbnQ7CiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCi11c2UgSFRUUDo6UmVxdWVzdDsKLXVzZSBMV1A6OlVzZXJBZ2VudDsKLXVzZSBJTzo6U3RyaW5nOwotCiBwYWNrYWdlIFRocmlmdDo6SHR0cENsaWVudDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHVybCAgICAgICA9IHNoaWZ0IHx8ICdodHRwOi8vbG9jYWxob3N0OjkwOTAnOwotICAgIG15ICRkZWJ1Z0hhbmRsZXIgPSBzaGlmdDsKIAogICAgIG15ICRvdXQgPSBJTzo6U3RyaW5nLT5uZXc7CiAgICAgYmlubW9kZSgkb3V0KTsKQEAgLTQ0LDQ0ICs0Myw0NCBAQAogICAgIG15ICRzZWxmID0gewogICAgICAgICB1cmwgICAgICAgICAgPT4gJHVybCwKICAgICAgICAgb3V0ICAgICAgICAgID0+ICRvdXQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMCwKLSAgICAgICAgcmVjdlRpbWVvdXQgID0+IDc1MCwKKyAgICAgICAgdGltZW91dCAgICAgID0+IDEwMCwKICAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmLAorICAgICAgICBoZWFkZXJzICAgICAgPT4ge30sCiAgICAgfTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAorc3ViIHNldFRpbWVvdXQKK3sKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e3RpbWVvdXR9ID0gJHRpbWVvdXQ7Cit9CisKK3N1YiBzZXRSZWN2VGltZW91dAoreworICAgIHdhcm4gJ3NldFJlY3ZUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKyAgICAjIG5vdGU6IHJlY3ZUaW1lb3V0IHdhcyBuZXZlciB1c2VkIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKK30KKwogc3ViIHNldFNlbmRUaW1lb3V0CiB7CiAgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgICBteSAkdGltZW91dCA9IHNoaWZ0OwogCi0gICAgJHNlbGYtPntzZW5kVGltZW91dH0gPSAkdGltZW91dDsKKyAgICB3YXJuICdzZXRTZW5kVGltZW91dCBpcyBkZXByZWNhdGVkIC0gdXNlIHNldFRpbWVvdXQgaW5zdGVhZCc7CisKKyAgICAkc2VsZi0+c2V0VGltZW91dCgkdGltZW91dCk7CiB9CiAKLXN1YiBzZXRSZWN2VGltZW91dAorc3ViIHNldEhlYWRlcgogewotICAgIG15ICRzZWxmICAgID0gc2hpZnQ7Ci0gICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHZhbHVlKSA9IEBfOwogCi0gICAgJHNlbGYtPntyZWN2VGltZW91dH0gPSAkdGltZW91dDsKLX0KLQotCi0jCi0jU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotIwotIyBAcGFyYW0gYm9vbCAkZGVidWcKLSMKLXN1YiBzZXREZWJ1ZwotewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRkZWJ1ZyA9IHNoaWZ0OwotCi0gICAgJHNlbGYtPntkZWJ1Z30gPSAkZGVidWc7CisgICAgJHNlbGYtPntoZWFkZXJzfS0+eyRuYW1lfSA9ICR2YWx1ZTsKIH0KIAogIwpAQCAtMTAzLDggKzEwMiw4IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBpZiAoZGVmaW5lZCgkc2VsZi0+e2lvfSkpIHsKLSAgICAgIGNsb3NlKCRzZWxmLT57aW99KTsKLSAgICAgICRzZWxmLT57aW99ID0gdW5kZWY7CisgICAgICAgIGNsb3NlKCRzZWxmLT57aW99KTsKKyAgICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKICAgICB9CiB9CiAKQEAgLTEyMiw3ICsxMjEsOCBAQAogICAgIG15ICRidWYgPSAkc2VsZi0+cmVhZCgkbGVuKTsKIAogICAgIGlmICghZGVmaW5lZCgkYnVmKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyJyk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiVFNvY2tldDogQ291bGQgbm90IHJlYWQgJGxlbiBieXRlcyBmcm9tIGlucHV0IGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAgICAgcmV0dXJuICRidWY7CiB9CkBAIC0xNDAsMTUgKzE0MCwxOCBAQAogICAgIG15ICRpbiA9ICRzZWxmLT57aW59OwogCiAgICAgaWYgKCFkZWZpbmVkKCRpbikpIHsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygnUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAgICAgZXZhbCB7Ci0gICAgICBteSAkcmV0ID0gc3lzcmVhZCgkaW4sICRidWYsICRsZW4pOwotICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKLSAgICAgIH0KLSAgICB9OyBpZigkQCl7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkQCk7CisgICAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7CisgICAgICAgIGlmICghIGRlZmluZWQoJHJldCkpIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygnTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CisgICAgICAgIH0KKyAgICB9OworICAgIGlmKCRAKXsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCIkQCIsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CiAgICAgfQogCiAgICAgcmV0dXJuICRidWY7CkBAIC0xNzEsOCArMTc0LDkgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygndGltZW91dCcgPT4gKCRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCksCi0gICAgICAnYWdlbnQnID0+ICdQZXJsL1RIdHRwQ2xpZW50JworICAgIG15ICR1YSA9IExXUDo6VXNlckFnZW50LT5uZXcoCisgICAgICAgICd0aW1lb3V0JyA9PiAoJHNlbGYtPnt0aW1lb3V0fSAvIDEwMDApLAorICAgICAgICAnYWdlbnQnICAgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCiAgICAgICk7CiAgICAgJHVhLT5kZWZhdWx0X2hlYWRlcignQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwpAQCAtMTgyLDcgKzE4Niw3IEBACiAgICAgJG91dC0+c2V0cG9zKDApOyAjIHJld2luZAogICAgIG15ICRidWYgPSBqb2luKCcnLCA8JG91dD4pOwogCi0gICAgbXkgJHJlcXVlc3QgPSBuZXcgSFRUUDo6UmVxdWVzdChQT1NUID0+ICRzZWxmLT57dXJsfSwgdW5kZWYsICRidWYpOworICAgIG15ICRyZXF1ZXN0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCAoJHNlbGYtPntoZWFkZXJzfSB8fCB1bmRlZiksICRidWYpOwogICAgIG15ICRyZXNwb25zZSA9ICR1YS0+cmVxdWVzdCgkcmVxdWVzdCk7CiAgICAgbXkgJGNvbnRlbnRfcmVmID0gJHJlc3BvbnNlLT5jb250ZW50X3JlZjsKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQppbmRleCAwYjI4Njg3Li5iZTk3Y2U0IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQpAQCAtMTcsNyArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0yNiw2ICsyNiw3IEBACiAKIHBhY2thZ2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7CiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMzQsMTAgKzM1LDEwIEBACiAgICAgbXkgJGJ1ZmZlclNpemU9IHNoaWZ0IHx8IDEwMjQ7CiAKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgYnVmZmVyICAgID0+ICcnLAotICAgICAgICBidWZmZXJTaXplPT4gJGJ1ZmZlclNpemUsCi0gICAgICAgIHdQb3MgICAgICA9PiAwLAotICAgICAgICByUG9zICAgICAgPT4gMCwKKyAgICAgICAgYnVmZmVyICAgICA9PiAnJywKKyAgICAgICAgYnVmZmVyU2l6ZSA9PiAkYnVmZmVyU2l6ZSwKKyAgICAgICAgd1BvcyAgICAgICA9PiAwLAorICAgICAgICByUG9zICAgICAgID0+IDAsCiAgICAgfTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTExNiw3ICsxMTcsOCBAQAogCiAgICAgbXkgJGF2YWlsID0gKCRzZWxmLT57d1Bvc30gLSAkc2VsZi0+e3JQb3N9KTsKICAgICBpZiAoJGF2YWlsIDwgJGxlbikgewotICAgICAgICBkaWUgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkF0dGVtcHQgdG8gcmVhZEFsbCgkbGVuKSBmb3VuZCBvbmx5ICRhdmFpbCBhdmFpbGFibGUiKTsKKyAgICAgICAgZGllIFRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAKICAgICBteSAkZGF0YSA9ICcnOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1YzJmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KQEAgLTAsMCArMSwzNyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OworCisjCisjIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQworIworcGFja2FnZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IENBTEwgICAgICA9PiAxOwordXNlIGNvbnN0YW50IFJFUExZICAgICA9PiAyOwordXNlIGNvbnN0YW50IEVYQ0VQVElPTiA9PiAzOwordXNlIGNvbnN0YW50IE9ORVdBWSAgICA9PiA0OworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MjVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KQEAgLTAsMCArMSwxMzMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CisKK3BhY2thZ2UgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2w7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKKyAgICBteSAkZm5hbWUgID0gc2hpZnQ7CisgICAgbXkgJG10eXBlICA9IHNoaWZ0OworICAgIG15ICRyc2VxaWQgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wpOworCisgICAgJHNlbGYtPntmbmFtZX0gPSAkZm5hbWU7CisgICAgJHNlbGYtPnttdHlwZX0gPSAkbXR5cGU7CisgICAgJHNlbGYtPntyc2VxaWR9ID0gJHJzZXFpZDsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworc3ViIHJlYWRNZXNzYWdlQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gc2hpZnQ7CisgICAgbXkgJHR5cGUgPSBzaGlmdDsKKyAgICBteSAkc2VxaWQgPSBzaGlmdDsKKworICAgICQkbmFtZSA9ICRzZWxmLT57Zm5hbWV9OworICAgICQkdHlwZSA9ICRzZWxmLT57bXR5cGV9OworICAgICQkc2VxaWQgPSAkc2VsZi0+e3JzZXFpZH07Cit9CisKK3BhY2thZ2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSB7fTsKKworICAgICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0gPSB7fTsKKyAgICAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9ID0gdW5kZWY7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBkZWZhdWx0UHJvY2Vzc29yIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRwcm9jZXNzb3IgPSBzaGlmdDsKKworICAgICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0gPSAkcHJvY2Vzc29yOworfQorCitzdWIgcmVnaXN0ZXJQcm9jZXNzb3IgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNlcnZpY2VOYW1lID0gc2hpZnQ7CisgICAgbXkgJHByb2Nlc3NvciA9IHNoaWZ0OworCisgICAgICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9ID0gJHByb2Nlc3NvcjsKK30KKworc3ViIHByb2Nlc3MgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGlucHV0ID0gc2hpZnQ7CisgICAgbXkgJG91dHB1dCA9IHNoaWZ0OworCisgICAgIworICAgICMgIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCisgICAgIyAgbWVzc2FnZSBoZWFkZXIuIFRoaXMgcHVsbHMgdGhlIG1lc3NhZ2UgIm9mZiB0aGUgd2lyZSIsIHdoaWNoIHdlJ2xsCisgICAgIyAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgIworCisgICAgbXkgKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKKyAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXCRmbmFtZSwgXCRtdHlwZSwgXCRyc2VxaWQpOworCisgICAgaWYgKCRtdHlwZSBuZSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgbmUgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoJ1RoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8nKTsKKyAgICB9CisKKyAgICAjIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIG5ldyBNZXNzYWdlIG5hbWUuCisgICAgaWYgKGluZGV4KCRmbmFtZSwgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IpID09IC0xKSB7CisgICAgICAgIGlmIChkZWZpbmVkICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0pIHsKKyAgICAgICAgICAgIHJldHVybiAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9LT5wcm9jZXNzKAorICAgICAgICAgICAgICAgIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sLT5uZXcoJGlucHV0LCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQgaW4gbWVzc2FnZSBuYW1lOiB7JGZuYW1lfSBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzb3IgZGVmaW5lZC4gRGlkIHlvdSAiIC4KKyAgICAgICAgICAgICAgICAnZm9yZ2V0IHRvIHVzZSBhIE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PycpOworICAgICAgICB9CisgICAgfQorCisgICAgKG15ICRzZXJ2aWNlTmFtZSwgbXkgJG1lc3NhZ2VOYW1lKSA9IHNwbGl0KCc6JywgJGZuYW1lLCAyKTsKKworICAgIGlmICghZXhpc3RzKCRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9KSkgeworICAgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCisgICAgICAgICAgICAndG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPycpOworICAgIH0KKworICAgICMgRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgIG15ICRwcm9jZXNzb3IgPSAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfTsKKyAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKKyAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICk7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1YjYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQpAQCAtMCwwICsxLDY4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CisKK3BhY2thZ2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sOwordXNlIGJhc2UgcXcoVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcik7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBTRVBBUkFUT1IgID0+ICc6JzsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKKyAgICBteSAkc2VydmljZU5hbWUgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoJHByb3RvY29sKTsKKworICAgICRzZWxmLT57c2VydmljZU5hbWV9ID0gJHNlcnZpY2VOYW1lOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCisjCisjIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCisjIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBNdWx0aXBsZXhlZFByb3RvY29sOjpTRVBBUkFUT1IuCisjCisjIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUuCisjIEBwYXJhbSBpbnQgICAgJHR5cGUgIE1lc3NhZ2UgdHlwZS4KKyMgQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZS4KKyMKK3N1YiB3cml0ZU1lc3NhZ2VCZWdpbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOworCisgICAgaWYgKCR0eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMIHx8ICR0eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgbXkgJG5hbWVXaXRoU2VydmljZSA9ICRzZWxmLT57c2VydmljZU5hbWV9LlNFUEFSQVRPUi4kbmFtZTsKKyAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZVdpdGhTZXJ2aWNlLCAkdHlwZSwgJHNlcWlkKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5TVVBFUjo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworICAgIH0KK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCmluZGV4IGUyODAxZmUuLjI2ZWY0NmEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQpAQCAtMTcsMjMgKzE3LDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247Cit1c2UgVGhyaWZ0OjpUeXBlOwogCiAjCiAjIFByb3RvY29sIGV4Y2VwdGlvbnMKICMKLXBhY2thZ2UgVFByb3RvY29sRXhjZXB0aW9uOworcGFja2FnZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjsKIHVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgPT4gMDsKLXVzZSBjb25zdGFudCBJTlZBTElEX0RBVEEgID0+IDE7Ci11c2UgY29uc3RhbnQgTkVHQVRJVkVfU0laRSA9PiAyOwotdXNlIGNvbnN0YW50IFNJWkVfTElNSVQgICAgPT4gMzsKLXVzZSBjb25zdGFudCBCQURfVkVSU0lPTiAgID0+IDQ7Cit1c2UgY29uc3RhbnQgVU5LTk9XTiAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9EQVRBICAgID0+IDE7Cit1c2UgY29uc3RhbnQgTkVHQVRJVkVfU0laRSAgID0+IDI7Cit1c2UgY29uc3RhbnQgU0laRV9MSU1JVCAgICAgID0+IDM7Cit1c2UgY29uc3RhbnQgQkFEX1ZFUlNJT04gICAgID0+IDQ7Cit1c2UgY29uc3RhbnQgTk9UX0lNUExFTUVOVEVEID0+IDU7Cit1c2UgY29uc3RhbnQgREVQVEhfTElNSVQgICAgID0+IDY7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTQ3LDYgKzUyLDcgQEAKICMgUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCiAjCiBwYWNrYWdlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTc1LDM3ICs4MSwzNyBAQAogc3ViIHdyaXRlTWVzc2FnZUJlZ2luCiB7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwogIyBDbG9zZSB0aGUgbWVzc2FnZQogIwogc3ViIHdyaXRlTWVzc2FnZUVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KICMKICMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZVN0cnVjdEJlZ2luIHsKICAgICBteSAoJG5hbWUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgQ2xvc2UgYSBzdHJ1Y3QuCiAjCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVTdHJ1Y3RFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMTQsODUgKzEyMCw4NSBAQAogIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCiAjIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKICMgQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSMgQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisjIEB0aHJvd3MgVFByb3RvY29sRXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCiAjIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KICMKIHN1YiB3cml0ZUZpZWxkQmVnaW4gewogICAgIG15ICgkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CiAKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRmllbGRFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVGaWVsZFN0b3AgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbiB7CiAgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZU1hcEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUxpc3RCZWdpbiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVMaXN0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU2V0QmVnaW4gewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlU2V0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlQm9vbCB7CiAgICAgbXkgKCRib29sKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlQnl0ZSB7CiAgICAgbXkgKCRieXRlKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTE2IHsKICAgICBteSAoJGkxNik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUkzMiB7CiAgICAgbXkgKCRpMzIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJNjQgewogICAgIG15ICgkaTY0KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRG91YmxlIHsKICAgICBteSAoJGR1Yik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVN0cmluZwogewogICAgIG15ICgkc3RyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMjA1LDcgKzIxMSw3IEBACiBzdWIgcmVhZE1lc3NhZ2VCZWdpbgogewogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTIxMywxMDUgKzIxOSwxMDUgQEAKICMKIHN1YiByZWFkTWVzc2FnZUVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cnVjdEJlZ2luCiB7CiAgICAgbXkoJG5hbWUpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RydWN0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRmllbGRCZWdpbgogewogICAgIG15ICgkbmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEZpZWxkRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTWFwQmVnaW4KIHsKICAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTWFwRW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkTGlzdEJlZ2luCiB7CiAgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZExpc3RFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTZXRCZWdpbgogewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTZXRFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRCb29sCiB7CiAgICAgbXkgKCRib29sKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRCeXRlCiB7CiAgICAgbXkgKCRieXRlKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJMTYKIHsKICAgICBteSAoJGkxNik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTMyCiB7CiAgICAgbXkgKCRpMzIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEk2NAogewogICAgIG15ICgkaTY0KTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWREb3VibGUKIHsKICAgICBteSAoJGR1Yik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU3RyaW5nCiB7CiAgICAgbXkgKCRzdHIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0zMjksMzYgKzMzNSwzNiBAQAogICAgIG15ICRyZXN1bHQ7CiAgICAgbXkgJGk7CiAKLSAgICBpZigkdHlwZSA9PSBUVHlwZTo6Qk9PTCkKKyAgICBpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCT09MKQogICAgIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkQm9vbChcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpCWVRFKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCWVRFKXsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkQnl0ZShcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMTYpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkxNil7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEkxNihcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMzIpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMil7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEkzMihcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJNjQpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Okk2NCl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEk2NChcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpET1VCTEUpeworICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkRPVUJMRSl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZERvdWJsZShcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTVFJJTkcpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKQogICAgIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5yZWFkU3RyaW5nKFwkcmVmKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OlNUUlVDVCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpCiAgICAgewogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRTdHJ1Y3RCZWdpbihcJHJlZik7CiAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICBteSAoJGZ0eXBlLCRmaWQpOwogICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZEZpZWxkQmVnaW4oXCRyZWYsIFwkZnR5cGUsIFwkZmlkKTsKLSAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgewogICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwKCRmdHlwZSk7CkBAIC0zNjcsNyArMzczLDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZFN0cnVjdEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Ok1BUCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpNQVApCiAgICAgewogICAgICAgICBteSgka2V5VHlwZSwkdmFsVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZE1hcEJlZ2luKFwka2V5VHlwZSwgXCR2YWxUeXBlLCBcJHNpemUpOwpAQCAtMzc4LDcgKzM4NCw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRNYXBFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTRVQpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U0VUKQogICAgIHsKICAgICAgICAgbXkgKCRlbGVtVHlwZSwkc2l6ZSk7CiAgICAgICAgICRyZXN1bHQgPSAkc2VsZi0+cmVhZFNldEJlZ2luKFwkZWxlbVR5cGUsIFwkc2l6ZSk7CkBAIC0zODgsNyArMzk0LDcgQEAKICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+cmVhZFNldEVuZCgpOwogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkxJU1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TElTVCkKICAgICB7CiAgICAgICAgIG15ICgkZWxlbVR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRMaXN0QmVnaW4oXCRlbGVtVHlwZSwgXCRzaXplKTsKQEAgLTM5OSw3ICs0MDUsOCBAQAogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CiAKLSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiVHlwZSAkdHlwZSBub3QgcmVjb2duaXNlZCAtLS0gY29ycnVwdCBkYXRhPyIpOworICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCJUeXBlICR0eXBlIG5vdCByZWNvZ25pemVkIC0tLSBjb3JydXB0IGRhdGE/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwogCiAgIH0KIApAQCAtNDE1LDMxICs0MjIsMzEgQEAKICAgICBteSAkaXRyYW5zID0gc2hpZnQ7CiAgICAgbXkgJHR5cGUgICA9IHNoaWZ0OwogCi0gICAgaWYoJHR5cGUgPT0gVFR5cGU6OkJPT0wpCi0gICAgewotICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpCWVRFKQorICAgIGlmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkJPT0wpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkxNikKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCWVRFKQorICAgIHsKKyAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgfQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkxNikKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STMyKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkkzMikKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STY0KQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Okk2NCkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6RE9VQkxFKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkRPVUJMRSkKICAgICB7CiAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwogICAgIH0KLSAgICBlbHNpZiggJHR5cGUgPT0gVFR5cGU6OlNUUklORyApCisgICAgZWxzaWYoICR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORyApCiAgICAgewogICAgICAgICBteSBAbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7CiAgICAgICAgIG15ICRsZW4gPSAkbGVuWzBdOwpAQCAtNDQ4LDI1ICs0NTUsMjUgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7CiAgICAgfQotICAgIGVsc2lmKCAkdHlwZSA9PSBUVHlwZTo6U1RSVUNUICkKKyAgICBlbHNpZiggJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSVUNUICkKICAgICB7CiAgICAgICAgIG15ICRyZXN1bHQgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgIG15ICRmdHlwZSA9IDA7Ci0gICAgICAgICAgbXkgJGZpZCA9IDA7Ci0gICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAgIG15IEBhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICAgJGZ0eXBlID0gJGFyclswXTsKLSAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICAjIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5za2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7CisgICAgICAgICAgICBteSAkZnR5cGUgPSAwOworICAgICAgICAgICAgbXkgJGZpZCA9IDA7CisgICAgICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CisgICAgICAgICAgICBteSBAYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgJGZ0eXBlID0gJGFyclswXTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIEkxNiBmaWVsZCBpZAorICAgICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6TUFQKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6Ok1BUCkKICAgICB7CiAgICAgICAgICMgS3R5cGUKICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwpAQCAtNDkwLDcgKzQ5Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTRVQgfHwgJHR5cGUgPT0gVFR5cGU6OkxJU1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U0VUIHx8ICR0eXBlID09IFRocmlmdDo6VFR5cGU6OkxJU1QpCiAgICAgewogICAgICAgICAjIFZ0eXBlCiAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKQEAgLTUxMCwxNCArNTE3LDE1IEBACiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJUeXBlICR0eXBlIG5vdCByZWNvZ25pc2VkIC0tLSBjb3JydXB0IGRhdGE/Iik7CisgICAgZGllIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uLT5uZXcoIlR5cGUgJHR5cGUgbm90IHJlY29nbml6ZWQgLS0tIGNvcnJ1cHQgZGF0YT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CiB9CiAKICMKICMgUHJvdG9jb2wgZmFjdG9yeSBjcmVhdGVzIHByb3RvY29sIG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCi1wYWNrYWdlIFRQcm90b2NvbEZhY3Rvcnk7Ci0KK3BhY2thZ2UgVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC01MzQsNyArNTQyLDcgQEAKIHN1YiBnZXRQcm90b2NvbAogewogICAgIG15ICgkdHJhbnMpOwotICAgIGRpZSAiaW50ZXJmYWNlIjsKKyAgICBkaWUgJ2ludGVyZmFjZSc7CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1YzlkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KQEAgLTAsMCArMSwzNjMgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOworCitwYWNrYWdlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7Cit1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKKworICAgICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0gPSAkcHJvdG9jb2w7CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Cit9CisKKyMKKyMgV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgorIworIyBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyMgQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyMgQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorIworc3ViIHdyaXRlTWVzc2FnZUJlZ2luIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKKworICAgICAgcmV0dXJuICAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7Cit9CisKKyMKKyMgQ2xvc2UgdGhlIG1lc3NhZ2UKKyMKK3N1YiB3cml0ZU1lc3NhZ2VFbmQgeworICAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1lc3NhZ2VFbmQoKTsKK30KKworIworIyBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorIworIyBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQorIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorIworc3ViIHdyaXRlU3RydWN0QmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRuYW1lKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOworfQorCisjCisjIENsb3NlIGEgc3RydWN0LgorIworIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorIworc3ViIHdyaXRlU3RydWN0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RydWN0RW5kKCk7Cit9CisKKyMKKyMgU3RhcnRzIGEgZmllbGQuCisjCisjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIEZpZWxkIG5hbWUKKyMgQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQorIyBAcGFyYW0gaW50ICAgICAgICAkZmlkICBGaWVsZCBpZAorIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorIworc3ViIHdyaXRlRmllbGRCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKK30KKworc3ViIHdyaXRlRmllbGRFbmQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZEVuZCgpOworfQorCitzdWIgd3JpdGVGaWVsZFN0b3AgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVGaWVsZFN0b3AoKTsKK30KKworc3ViIHdyaXRlTWFwQmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKK30KKworc3ViIHdyaXRlTWFwRW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTWFwRW5kKCk7Cit9CisKK3N1YiB3cml0ZUxpc3RCZWdpbiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHdyaXRlTGlzdEVuZCB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RFbmQoKTsKK30KKworc3ViIHdyaXRlU2V0QmVnaW4geworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRlbGVtVHlwZSwgJHNpemUpID0gQF87CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHdyaXRlU2V0RW5kIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlTGlzdEVuZCgpOworfQorCitzdWIgd3JpdGVCb29sIHsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRib29sID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVCb29sKCRib29sKTsKK30KKworc3ViIHdyaXRlQnl0ZSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYnl0ZSA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlQnl0ZSgkYnl0ZSk7Cit9CisKK3N1YiB3cml0ZUkxNiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkaTE2ID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJMTYoJGkxNik7Cit9CisKK3N1YiB3cml0ZUkzMiB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGkzMikgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUkzMigkaTMyKTsKKworfQorCitzdWIgd3JpdGVJNjQgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGk2NCA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlSTY0KCRpNjQpOworfQorCitzdWIgd3JpdGVEb3VibGUgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGR1YiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlRG91YmxlKCRkdWIpOworfQorCitzdWIgd3JpdGVTdHJpbmcgeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0ciA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RyaW5nKCRzdHIpOworfQorCisjCisjIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgorIworIyBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyMgQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyMgQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorIworc3ViIHJlYWRNZXNzYWdlQmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKK30KKworIworIyBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisjCitzdWIgcmVhZE1lc3NhZ2VFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNZXNzYWdlRW5kKCk7Cit9CisKK3N1YiByZWFkU3RydWN0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKK30KKworc3ViIHJlYWRTdHJ1Y3RFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTdHJ1Y3RFbmQoKTsKK30KKworc3ViIHJlYWRGaWVsZEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7Cit9CisKK3N1YiByZWFkRmllbGRFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRGaWVsZEVuZCgpOworfQorCitzdWIgcmVhZE1hcEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Cit9CisKK3N1YiByZWFkTWFwRW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWFwRW5kKCk7Cit9CisKK3N1YiByZWFkTGlzdEJlZ2luCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSkgPSBAXzsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworfQorCitzdWIgcmVhZExpc3RFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRMaXN0RW5kKCk7Cit9CisKK3N1YiByZWFkU2V0QmVnaW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkZWxlbVR5cGUsICRzaXplKSA9IEBfOworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKK30KKworc3ViIHJlYWRTZXRFbmQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTZXRFbmQoKTsKK30KKworc3ViIHJlYWRCb29sCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYm9vbCA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRCb29sKCRib29sKTsKK30KKworc3ViIHJlYWRCeXRlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkYnl0ZSA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRCeXRlKCRieXRlKTsKK30KKworc3ViIHJlYWRJMTYKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRpMTYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkSTE2KCRpMTYpOworfQorCitzdWIgcmVhZEkzMgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGkzMiAgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkSTMyKCRpMzIpOworfQorCitzdWIgcmVhZEk2NAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGk2NCAgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkSTY0KCRpNjQpOworfQorCitzdWIgcmVhZERvdWJsZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGR1YiAgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkRG91YmxlKCRkdWIpOworfQorCitzdWIgcmVhZFN0cmluZworeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0ciA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTdHJpbmcoJHN0cik7Cit9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NTTFNlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDc2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpTU0w7CisKK3BhY2thZ2UgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rvci4KKyMgVGFrZXMgYSBoYXNoOgorIyBTZWUgVGhyaWZ0OjpTb2NrZXQgZm9yIGJhc2UgY2xhc3MgcGFyYW1ldGVycy4KKyMgQHBhcmFtW2luXSAgY2EgICAgIGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlbmFtZSAtIG5vdCByZXF1aXJlZAorIyBAcGFyYW1baW5dICBjZXJ0ICAgY2VydGlmaWNhdGUgZmlsZW5hbWU7IG1heSBjb250YWluIGtleSBpbiB3aGljaCBjYXNlIGtleSBpcyBub3QgcmVxdWlyZWQKKyMgQHBhcmFtW2luXSAga2V5ICAgIHByaXZhdGUga2V5IGZpbGVuYW1lIGZvciB0aGUgY2VydGlmaWNhdGUgaWYgaXQgaXMgbm90IGluc2lkZSB0aGUgY2VydCBmaWxlCisjCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6U1NMU29ja2V0LT5uZXcoKTsKK30KKworc3ViIF9fbGlzdGVuCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkb3B0cyA9IHtMaXN0ZW4gICAgICAgID0+ICRzZWxmLT57cXVldWV9LAorICAgICAgICAgICAgICAgIExvY2FsQWRkciAgICAgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICBMb2NhbFBvcnQgICAgID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICBSZXVzZUFkZHIgICAgID0+IDF9OworCisgICAgbXkgJHZlcmlmeSA9IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9QRUVSIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCisgICAgJG9wdHMtPntTU0xfY2FfZmlsZX0gICAgICA9ICRzZWxmLT57Y2F9ICAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NhfTsKKyAgICAkb3B0cy0+e1NTTF9jZXJ0X2ZpbGV9ICAgID0gJHNlbGYtPntjZXJ0fSAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2VydH07CisgICAgJG9wdHMtPntTU0xfY2lwaGVyX2xpc3R9ICA9ICRzZWxmLT57Y2lwaGVyc30gaWYgZGVmaW5lZCAkc2VsZi0+e2NpcGhlcnN9OworICAgICRvcHRzLT57U1NMX2tleV9maWxlfSAgICAgPSAkc2VsZi0+e2tleX0gICAgIGlmIGRlZmluZWQgJHNlbGYtPntrZXl9OworICAgICRvcHRzLT57U1NMX3VzZV9jZXJ0fSAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e2NlcnR9KSA/IDEgOiAwOworICAgICRvcHRzLT57U1NMX3ZlcmlmeV9tb2RlfSAgPSAoZGVmaW5lZCAkc2VsZi0+e2NhfSkgPyAkdmVyaWZ5IDogSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX05PTkU7CisgICAgJG9wdHMtPntTU0xfdmVyc2lvbn0gICAgICA9IChkZWZpbmVkICRzZWxmLT57dmVyc2lvbn0pID8gJHNlbGYtPnt2ZXJzaW9ufSA6ICdTU0x2MjM6IVNTTHYzOiFTU0x2Mic7CisKKyAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoJSRvcHRzKTsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0OTI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtCkBAIC0wLDAgKzEsMTI2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7CisKK3VzZSBJTzo6U29ja2V0OjpTU0w7CisKK3BhY2thZ2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKworIworIyBDb25zdHJ1Y3Rpb24gYW5kIHVzYWdlCisjCisjIG15ICRvcHRzID0ge30KKyMgbXkgJHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0LT5uZXcoXCVvcHRzKTsKKyMKKyMgb3B0aW9uczoKKyMKKyMgQW55IG9wdGlvbiBmcm9tIFNvY2tldC5wbSBpcyB2YWxpZCwgYW5kIHRoZW46CisjCisjIGNhICAgICAgICAgID0+IGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlIChQRU0gZmlsZSkgdG8gYXV0aGVudGljYXRlIHRoZQorIyAgICAgICAgICAgICAgICBzZXJ2ZXIgYWdhaW5zdDsgaWYgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBzZXJ2ZXIgaXMgbm90CisjICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQKKyMgY2VydCAgICAgICAgPT4gY2VydGlmaWNhdGUgdG8gdXNlIGFzIHRoZSBjbGllbnQ7IGlmIG5vdCBzcGVjaWZpZWQgdGhlbgorIyAgICAgICAgICAgICAgICB0aGUgY2xpZW50IGRvZXMgbm90IHByZXNlbnQgb25lIGJ1dCBzdGlsbCBjb25uZWN0cyB1c2luZworIyAgICAgICAgICAgICAgICBzZWN1cmUgcHJvdG9jb2wKKyMgY2lwaGVycyAgICAgPT4gYWxsb3dlZCBjaXBoZXIgbGlzdAorIyAgICAgICAgICAgICAgICAoc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9hcHBzL2NpcGhlcnMuaHRtbCNDSVBIRVJfU1RSSU5HUykKKyMga2V5ICAgICAgICAgPT4gY2VydGlmaWNhdGUga2V5IGZvciAiY2VydCIgb3B0aW9uCisjIHZlcnNpb24gICAgID0+IGFjY2VwdGFibGUgU1NML1RMUyB2ZXJzaW9ucyAtIGlmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUKKyMgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB0byB1c2UgU1NMdjIzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGUKKyMgICAgICAgICAgICAgICAgYXQgVExTdjEuMCBvciBsYXRlcgorIworCitzdWIgbmV3Cit7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBfX29wZW4KK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRvcHRzID0ge1BlZXJBZGRyICAgICAgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICBQZWVyUG9ydCAgICAgID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICBUaW1lb3V0ICAgICAgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMH07CisKKyAgICBteSAkdmVyaWZ5ID0gSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX1BFRVIgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQgfCBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfQ0xJRU5UX09OQ0U7CisKKyAgICAkb3B0cy0+e1NTTF9jYV9maWxlfSAgICAgID0gJHNlbGYtPntjYX0gICAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2F9OworICAgICRvcHRzLT57U1NMX2NlcnRfZmlsZX0gICAgPSAkc2VsZi0+e2NlcnR9ICAgIGlmIGRlZmluZWQgJHNlbGYtPntjZXJ0fTsKKyAgICAkb3B0cy0+e1NTTF9jaXBoZXJfbGlzdH0gID0gJHNlbGYtPntjaXBoZXJzfSBpZiBkZWZpbmVkICRzZWxmLT57Y2lwaGVyc307CisgICAgJG9wdHMtPntTU0xfa2V5X2ZpbGV9ICAgICA9ICRzZWxmLT57a2V5fSAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2tleX07CisgICAgJG9wdHMtPntTU0xfdXNlX2NlcnR9ICAgICA9IChkZWZpbmVkICRzZWxmLT57Y2VydH0pID8gMSA6IDA7CisgICAgJG9wdHMtPntTU0xfdmVyaWZ5X21vZGV9ICA9IChkZWZpbmVkICRzZWxmLT57Y2F9KSA/ICR2ZXJpZnkgOiBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfTk9ORTsKKyAgICAkb3B0cy0+e1NTTF92ZXJzaW9ufSAgICAgID0gKGRlZmluZWQgJHNlbGYtPnt2ZXJzaW9ufSkgPyAkc2VsZi0+e3ZlcnNpb259IDogJ1NTTHYyMzohU1NMdjM6IVNTTHYyJzsKKworICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyglJG9wdHMpOworfQorCitzdWIgX19jbG9zZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNvY2sgPSAoJHNlbGYtPntoYW5kbGV9LT5oYW5kbGVzKCkpWzBdOworICAgIGlmICgkc29jaykgeworICAgICAgJHNvY2stPmNsb3NlKFNTTF9ub19zaHV0ZG93biA9PiAxKTsKKyAgICB9Cit9CisKK3N1YiBfX3JlY3YKK3sKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHNvY2sgPSBzaGlmdDsKKyAgbXkgJGxlbiA9IHNoaWZ0OworICBteSAkYnVmID0gdW5kZWY7CisgIGlmICgkc29jaykgeworICAgIHN5c3JlYWQoJHNvY2ssICRidWYsICRsZW4pOworICB9CisgIHJldHVybiAkYnVmOworfQorCitzdWIgX19zZW5kCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9IHNoaWZ0OworICAgIG15ICRidWYgPSBzaGlmdDsKKyAgICByZXR1cm4gc3lzd3JpdGUoJHNvY2ssICRidWYpOworfQorCitzdWIgX193YWl0Cit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc29jayA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF07CisgICAgaWYgKCRzb2NrIGFuZCAkc29jay0+cGVuZGluZygpIGVxIDApIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT5TVVBFUjo6X193YWl0KCk7CisgICAgfQorICAgIHJldHVybiAkc29jazsKK30KKworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQppbmRleCA5NjBmYmQxLi4yODgyMmU4IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlci5wbQpAQCAtMTcsMjUgKzE3LDMxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiAKICMKICMgU2VydmVyIGJhc2UgY2xhc3MgbW9kdWxlCiAjCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCisjCiAjIDMgcG9zc2libGUgY29uc3RydWN0b3JzOgogIyAgIDEuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisjICAgICAgIFVzZXMgYSBCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgYW5kIGEgQmluYXJ5UHJvdG9jb2xGYWN0b3J5LgogIyAgIDIuICAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKKyMgICAgICAgVXNlcyB0aGUgc2FtZSBmYWN0b3J5IGZvciBpbnB1dCBhbmQgb3V0cHV0IG9mIGVhY2ggdHlwZS4KICMgICAzLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAogIyAgICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAogIyAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyMKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lICAgID0gc2hpZnQ7CkBAIC00NSw3ICs1MSw3IEBACiAKICAgICBpZiAoc2NhbGFyIEBhcmdzID09IDIpCiAgICAgewotICAgICAgJHNlbGYgPSBfaW5pdCgkYXJnc1swXSwgJGFyZ3NbMV0sCisgICAgICAgICRzZWxmID0gX2luaXQoJGFyZ3NbMF0sICRhcmdzWzFdLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCksCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpLApAQCAtNjEsNyArNjcsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgZGllICJUaHJpZnQ6OlNlcnZlciBleHBlY3RzIGV4YWN0bHkgMiwgNCwgb3IgNiBhcmdzIjsKKyAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygnVGhyaWZ0OjpTZXJ2ZXIgZXhwZWN0cyBleGFjdGx5IDIsIDQsIG9yIDYgYXJncycpOwogICAgIH0KIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTg4LDcgKzk0LDcgQEAKIAogc3ViIHNlcnZlCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiBfY2xpZW50QmVnaW4KQEAgLTEwOSw2MiArMTE1LDY4IEBACiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBteSAkZSAgICA9IHNoaWZ0OwogCi0gICAgaWYgKCRlID1+IG0vVEV4Y2VwdGlvbi8gYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CisgICAgaWYgKCRlLT5pc2EoJ1RocmlmdDo6VEV4Y2VwdGlvbicpIGFuZCBleGlzdHMgJGUtPnttZXNzYWdlfSkgewogICAgICAgICBteSAkbWVzc2FnZSA9ICRlLT57bWVzc2FnZX07CiAgICAgICAgIG15ICRjb2RlICAgID0gJGUtPntjb2RlfTsKICAgICAgICAgbXkgJG91dCAgICAgPSAkY29kZSAuICc6JyAuICRtZXNzYWdlOwogCiAgICAgICAgICRtZXNzYWdlID1+IG0vVFRyYW5zcG9ydEV4Y2VwdGlvbi8gYW5kIGRpZSAkb3V0OwotICAgICAgICBpZiAoJG1lc3NhZ2UgPX4gbS9UU29ja2V0LykgewotICAgICAgICAgICAgIyBzdXBwcmVzcyBUU29ja2V0IG1lc3NhZ2VzCi0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgkbWVzc2FnZSA9fiBtL1NvY2tldC8pIHsKKyAgICAgICAgICAgICMgc3VwcHJlc3MgU29ja2V0IG1lc3NhZ2VzCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3YXJuICRvdXQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICAgd2FybiAkZTsKICAgICB9CiB9CiAKLQogIwogIyBTaW1wbGVTZXJ2ZXIgZnJvbSB0aGUgU2VydmVyIGJhc2UgY2xhc3MgdGhhdCBoYW5kbGVzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZQogIwogcGFja2FnZSBUaHJpZnQ6OlNpbXBsZVNlcnZlcjsKLXVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlciApOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpTZXJ2ZXInOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15IEBhcmdzICAgICAgPSBAXzsKIAotICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBhcmdzKTsKKyAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CisKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CiB9CiAKIHN1YiBzZXJ2ZQogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHN0b3AgPSAwOwogCiAgICAgJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5saXN0ZW4oKTsKLSAgICB3aGlsZSAoMSkKLSAgICB7CisgICAgd2hpbGUgKCEkc3RvcCkgewogICAgICAgICBteSAkY2xpZW50ID0gJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5hY2NlcHQoKTsKLSAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOwotICAgICAgICBteSAkb3RyYW5zID0gJHNlbGYtPntvdXRwdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOwotICAgICAgICBteSAkaXByb3QgID0gJHNlbGYtPntpbnB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRpdHJhbnMpOwotICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKLSAgICAgICAgZXZhbCB7Ci0gICAgICAgICAgICAkc2VsZi0+X2NsaWVudEJlZ2luKCRpcHJvdCwgJG9wcm90KTsKLSAgICAgICAgICAgIHdoaWxlICgxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CisgICAgICAgIGlmIChkZWZpbmVkICRjbGllbnQpIHsKKyAgICAgICAgICAgIG15ICRpdHJhbnMgPSAkc2VsZi0+e2lucHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7CisgICAgICAgICAgICBteSAkaXByb3QgID0gJHNlbGYtPntpbnB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRpdHJhbnMpOworICAgICAgICAgICAgbXkgJG9wcm90ICA9ICRzZWxmLT57b3V0cHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJG90cmFucyk7CisgICAgICAgICAgICBldmFsIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2NsaWVudEJlZ2luKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGlmKCRAKSB7CisgICAgICAgICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgICAgICAgICAgfQotICAgICAgICB9OyBpZigkQCkgewotICAgICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOworICAgICAgICAgICAgJGl0cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkc3RvcCA9IDE7CiAgICAgICAgIH0KLQotICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOwotICAgICAgICAkb3RyYW5zLT5jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTczLDkgKzE4NSw5IEBACiAjIEZvcmtpbmdTZXJ2ZXIgdGhhdCBmb3JrcyBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QKICMKIHBhY2thZ2UgVGhyaWZ0OjpGb3JraW5nU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Ci0KLXVzZSBQT1NJWCAiOnN5c193YWl0X2giOwordXNlIHBhcmVudCAtbm9yZXF1aXJlLCAnVGhyaWZ0OjpTZXJ2ZXInOwordXNlIFBPU0lYICc6c3lzX3dhaXRfaCc7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTE5MSw2ICsyMDMsOSBAQAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKKyAgICAjIFRIUklGVC0zODQ4OiB3aXRob3V0IGlnbm9yaW5nIFNJR0NITEQsIHBlcmwgRm9ya2luZ1NlcnZlciBnb2VzIGludG8gYSB0aWdodCBsb29wCisgICAgJFNJR3tDSExEfSA9ICdJR05PUkUnOworCiAgICAgJHNlbGYtPntzZXJ2ZXJUcmFuc3BvcnR9LT5saXN0ZW4oKTsKICAgICB3aGlsZSAoMSkKICAgICB7CkBAIC0yMTUsMTMgKzIzMCwxNSBAQAogCiAgICAgICAgIG15ICRwaWQgPSBmb3JrKCk7CiAKLSAgICAgICAgaWYgKCRwaWQpICNwYXJlbnQKKyAgICAgICAgaWYgKCRwaWQpCiAgICAgICAgIHsKICAgICAgICAgICAgICRzZWxmLT5fcGFyZW50KCRwaWQsICRpdHJhbnMsICRvdHJhbnMpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgJHNlbGYtPl9jaGlsZCgkaXRyYW5zLCAkb3RyYW5zLCAkaXByb3QsICRvcHJvdCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgeworICAgIH07CisgICAgaWYoJEApIHsKICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgIH0KIH0KQEAgLTIzMywxMCArMjUwLDYgQEAKICAgICBteSAkaXRyYW5zID0gc2hpZnQ7CiAgICAgbXkgJG90cmFucyA9IHNoaWZ0OwogCi0gICAgIyBhZGQgYmVmb3JlIGNvbGxlY3QsIG90aGVyd2lzZSB5b3UgcmFjZSB3LyB3YWl0cGlkCi0gICAgJHNlbGYtPntjaGlsZHJlbn0tPnskcGlkfSA9IDE7Ci0gICAgJHNlbGYtPl9jb2xsZWN0Q2hpbGRyZW4oKTsKLQogICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0IGNsb3NlZCBwcm9tcHRseQogICAgICRzZWxmLT50cnlDbG9zZSgkaXRyYW5zKTsKICAgICAkc2VsZi0+dHJ5Q2xvc2UoJG90cmFucyk7CkBAIC0yNTIsMTEgKzI2NSwxNCBAQAogCiAgICAgbXkgJGVjb2RlID0gMDsKICAgICBldmFsIHsKKyAgICAgICAgIyBUSFJJRlQtNDA2NSBlbnN1cmUgY2hpbGQgcHJvY2VzcyBoYXMgbm9ybWFsIHNpZ25hbCBoYW5kbGluZyBpbiBjYXNlIHRocmlmdCBoYW5kbGVyIHVzZXMgaXQKKyAgICAgICAgJFNJR3tDSExEfSA9ICdERUZBVUxUJzsKICAgICAgICAgd2hpbGUgKDEpCiAgICAgICAgIHsKICAgICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+cHJvY2VzcygkaXByb3QsICRvcHJvdCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgeworICAgIH07CisgICAgaWYoJEApIHsKICAgICAgICAgJGVjb2RlID0gMTsKICAgICAgICAgJHNlbGYtPl9oYW5kbGVFeGNlcHRpb24oJEApOwogICAgIH0KQEAgLTI3NywzNyArMjkzLDE5IEBACiAgICAgICAgIHsKICAgICAgICAgICAkZmlsZS0+Y2xvc2UoKTsKICAgICAgICAgfQotICAgIH07IGlmKCRAKSB7Ci0gICAgICAgIGlmICgkQCA9fiBtL1RFeGNlcHRpb24vIGFuZCBleGlzdHMgJEAtPnttZXNzYWdlfSkgeworICAgIH07CisgICAgaWYoJEApIHsKKyAgICAgICAgaWYgKCRALT5pc2EoJ1RocmlmdDo6VEV4Y2VwdGlvbicpIGFuZCBleGlzdHMgJEAtPnttZXNzYWdlfSkgewogICAgICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkQC0+e21lc3NhZ2V9OwogICAgICAgICAgICAgbXkgJGNvZGUgICAgPSAkQC0+e2NvZGV9OwogICAgICAgICAgICAgbXkgJG91dCAgICAgPSAkY29kZSAuICc6JyAuICRtZXNzYWdlOwogCiAgICAgICAgICAgICB3YXJuICRvdXQ7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICB3YXJuICRAOwogICAgICAgICB9CiAgICAgfQogfQogCi1zdWIgX2NvbGxlY3RDaGlsZHJlbgotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICB3aGlsZSAoc2NhbGFyIGtleXMgJXskc2VsZi0+e2NoaWxkcmVufX0pCi0gICAgewotICAgICAgICBteSAkcGlkICAgID0gd2FpdHBpZCgtMSwgV05PSEFORyk7Ci0KLSAgICAgICAgaWYgKCRwaWQ+MCkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZXRlICRzZWxmLT57Y2hpbGRyZW59LT57JHBpZH07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0KIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzI2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQpAQCAtMCwwICsxLDEyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgSU86OlNvY2tldDo6SU5FVDsKK3VzZSBJTzo6U2VsZWN0OwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKworcGFja2FnZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclRyYW5zcG9ydCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdG9yLgorIyBMZWdhY3kgY29uc3RydWN0aW9uIHRha2VzIG9uZSBhcmd1bWVudCwgcG9ydCBudW1iZXIuCisjIE5ldyBjb25zdHJ1Y3Rpb24gdGFrZXMgYSBoYXNoOgorIyBAcGFyYW1baW5dICBob3N0ICAgaG9zdCBpbnRlcmZhY2UgdG8gbGlzdGVuIG9uICh1bmRlZiA9IGFsbCBpbnRlcmZhY2VzKQorIyBAcGFyYW1baW5dICBwb3J0ICAgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIChyZXF1aXJlZCkKKyMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkIGlzIDEyOCkKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KGhvc3QgPT4gdW5kZWYsIHBvcnQgPT4gcG9ydCkKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJGFyZ3MgICAgICA9IHNoaWZ0OworICAgIG15ICRzZWxmOworCisgICAgIyBTdXBwb3J0IGJvdGggb2xkLXN0eWxlICJwb3J0IG51bWJlciIgY29uc3RydWN0aW9uIGFuZCBuZXdlci4uLgorICAgIGlmIChyZWYoJGFyZ3MpIGVxICdIQVNIJykgeworICAgICAgICAkc2VsZiA9ICRhcmdzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYgPSB7IHBvcnQgPT4gJGFyZ3MgfTsKKyAgICB9CisKKyAgICBpZiAobm90IGRlZmluZWQgJHNlbGYtPntxdWV1ZX0pIHsKKyAgICAgICAgJHNlbGYtPntxdWV1ZX0gPSAxMjg7CisgICAgfQorCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIGxpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc29jayA9ICRzZWxmLT5fX2xpc3RlbigpIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gcmVmKCRzZWxmKSAuICc6IENvdWxkIG5vdCBiaW5kIHRvICcgLiAnKjonIC4gJHNlbGYtPntwb3J0fSAuICcgKCcgLiAkISAuICcpJzsKKworICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKKyAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgJHNlbGYtPntoYW5kbGV9ID0gJHNvY2s7Cit9CisKK3N1YiBhY2NlcHQKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApIHsKKyAgICAgICAgbXkgJGNsaWVudCAgICAgICAgPSAkc2VsZi0+e2hhbmRsZX0tPmFjY2VwdCgpOworICAgICAgICBteSAkcmVzdWx0ICAgICAgICA9ICRzZWxmLT5fX2NsaWVudCgpOworICAgICAgICAkcmVzdWx0LT57aGFuZGxlfSA9IElPOjpTZWxlY3QtPm5ldygkY2xpZW50KTsKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHVuZGVmOworfQorCitzdWIgY2xvc2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCisgICAgeworICAgICAgICAkc2VsZi0+e2hhbmRsZX0tPmNsb3NlKCk7CisgICAgfQorfQorCisjIyMKKyMjIyBPdmVycmlkYWJsZSBtZXRob2RzCisjIyMKKworc3ViIF9fY2xpZW50Cit7CisgIHJldHVybiBUaHJpZnQ6OlNvY2tldC0+bmV3KCk7Cit9CisKK3N1YiBfX2xpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OklORVQtPm5ldyhMb2NhbEFkZHIgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuICAgID0+ICRzZWxmLT57cXVldWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV1c2VBZGRyID0+IDEpOworfQorCisKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCmluZGV4IDdlYmVhMzUuLmJhMGRiNWUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvU29ja2V0LnBtCkBAIC0xNywzNyArMTcsNjMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogdXNlIElPOjpTb2NrZXQ6OklORVQ7CiB1c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlNvY2tldDsKK3VzZSBiYXNlIHF3KCBUaHJpZnQ6OlRyYW5zcG9ydCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKKyMKKyMgQ29uc3RydWN0aW9uIGFuZCB1c2FnZQorIworIyBteSAkb3B0cyA9IHt9CisjIG15ICRzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KFwlb3B0cyk7CisjCisjIG9wdGlvbnM6CisjCisjIGhvc3QgICAgICAgID0+IGhvc3QgdG8gY29ubmVjdCB0bworIyBwb3J0ICAgICAgICA9PiBwb3J0IHRvIGNvbm5lY3QgdG8KKyMgc2VuZFRpbWVvdXQgPT4gdGltZW91dCB1c2VkIGZvciBzZW5kIGFuZCBmb3IgY29ubmVjdAorIyByZWN2VGltZW91dCA9PiB0aW1lb3V0IHVzZWQgZm9yIHJlY3YKKyMKIAogc3ViIG5ldwogewotICAgIG15ICRjbGFzc25hbWUgICAgPSBzaGlmdDsKLSAgICBteSAkaG9zdCAgICAgICAgID0gc2hpZnQgfHwgImxvY2FsaG9zdCI7Ci0gICAgbXkgJHBvcnQgICAgICAgICA9IHNoaWZ0IHx8IDkwOTA7Ci0gICAgbXkgJGRlYnVnSGFuZGxlciA9IHNoaWZ0OworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkb3B0cyAgICAgID0gc2hpZnQ7CiAKKyAgICAjIGRlZmF1bHQgc2V0dGluZ3M6CiAgICAgbXkgJHNlbGYgPSB7Ci0gICAgICAgIGhvc3QgICAgICAgICA9PiAkaG9zdCwKLSAgICAgICAgcG9ydCAgICAgICAgID0+ICRwb3J0LAotICAgICAgICBkZWJ1Z0hhbmRsZXIgPT4gJGRlYnVnSGFuZGxlciwKLSAgICAgICAgZGVidWcgICAgICAgID0+IDAsCi0gICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAwMCwKKyAgICAgICAgaG9zdCAgICAgICAgID0+ICdsb2NhbGhvc3QnLAorICAgICAgICBwb3J0ICAgICAgICAgPT4gOTA5MCwKICAgICAgICAgcmVjdlRpbWVvdXQgID0+IDEwMDAwLAotICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYsCisgICAgICAgIHNlbmRUaW1lb3V0ICA9PiAxMDAwMCwKKworICAgICAgICBoYW5kbGUgICAgICAgPT4gdW5kZWYKICAgICB9OwogCisgICAgaWYgKGRlZmluZWQgJG9wdHMgYW5kIHJlZiAkb3B0cyBlcSByZWYge30pIHsKKworICAgICAgIyBhcmd1bWVudCBpcyBhIGhhc2ggb2Ygb3B0aW9ucyBzbyBvdmVycmlkZSB0aGUgZGVmYXVsdHMKKyAgICAgICRzZWxmLT57JF99ID0gJG9wdHMtPnskX30gZm9yIGtleXMgJSRvcHRzOworCisgICAgfSBlbHNlIHsKKworICAgICAgIyBvbGRlciBzdHlsZSBjb25zdHJ1Y3RvciB0YWtlcyAzIGFyZ3VtZW50cywgbm9uZSBvZiB3aGljaCBhcmUgcmVxdWlyZWQKKyAgICAgICRzZWxmLT57aG9zdH0gPSAkb3B0cyB8fCAnbG9jYWxob3N0JzsKKyAgICAgICRzZWxmLT57cG9ydH0gPSBzaGlmdCB8fCA5MDkwOworCisgICAgfQorCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCkBAIC03MCwxOSArOTYsNiBAQAogCiAKICMKLSNTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCi0jCi0jIEBwYXJhbSBib29sICRkZWJ1ZwotIwotc3ViIHNldERlYnVnCi17Ci0gICAgbXkgJHNlbGYgID0gc2hpZnQ7Ci0gICAgbXkgJGRlYnVnID0gc2hpZnQ7Ci0KLSAgICAkc2VsZi0+e2RlYnVnfSA9ICRkZWJ1ZzsKLX0KLQotIwogIyBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgogIwogIyBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KQEAgLTEwNSwyMyArMTE4LDEyIEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAotICAgIG15ICRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRzZWxmLT57aG9zdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlZXJQb3J0ID0+ICRzZWxmLT57cG9ydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvICAgID0+ICd0Y3AnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fS8xMDAwKQotICAgICAgICB8fCBkbyB7Ci0gICAgICAgICAgICBteSAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LicgKCcuJCEuJyknOworICAgIG15ICRzb2NrID0gJHNlbGYtPl9fb3BlbigpIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gcmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgY29ubmVjdCB0byAnLiRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0uJyAoJy4kIS4nKSc7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygkZXJyb3IsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgIH07CiAKLSAgICAgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgewotICAgICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRlcnJvcik7Ci0KLSAgICAgICAgfTsKLQotCi0gICAgJHNlbGYtPntoYW5kbGV9ID0gbmV3IElPOjpTZWxlY3QoICRzb2NrICk7CisgICAgJHNlbGYtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCAkc29jayApOwogfQogCiAjCkBAIC0xMzAsOSArMTMyLDggQEAKIHN1YiBjbG9zZQogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICBpZiggZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKXsKLSAgICAgICAgQ09SRTo6Y2xvc2UoICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0gKTsKKyAgICBpZiggZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKSB7CisgICAgICAkc2VsZi0+X19jbG9zZSgpOwogICAgIH0KIH0KIApAQCAtMTUzLDMwICsxNTQsMjIgQEAKICAgICBteSAkcHJlID0gIiI7CiAgICAgd2hpbGUgKDEpIHsKIAotICAgICAgICAjY2hlY2sgZm9yIHRpbWVvdXQKLSAgICAgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKLQotICAgICAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9KTsKLSAgICAgICAgfQotCi0gICAgICAgIG15ICRzb2NrID0gJHNvY2tldHNbMF07Ci0KLSAgICAgICAgbXkgKCRidWYsJHN6KTsKLSAgICAgICAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgICAgICAgIG15ICRzb2NrID0gJHNlbGYtPl9fd2FpdCgpOworICAgICAgICBteSAkYnVmID0gJHNlbGYtPl9fcmVjdigkc29jaywgJGxlbik7CiAKICAgICAgICAgaWYgKCFkZWZpbmVkICRidWYgfHwgJGJ1ZiBlcSAnJykgewogCi0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCi0gICAgICAgIH0gZWxzaWYgKCgkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgeworICAgICAgICB9CisgICAgICAgIGVsc2lmICgobXkgJHN6ID0gbGVuZ3RoKCRidWYpKSA8ICRsZW4pIHsKIAogICAgICAgICAgICAgJHByZSAuPSAkYnVmOwogICAgICAgICAgICAgJGxlbiAtPSAkc3o7CiAKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiAkcHJlLiRidWY7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTUsMjMgKzE4OCwxMyBAQAogCiAgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aGFuZGxlfTsKIAotICAgICNjaGVjayBmb3IgdGltZW91dAotICAgIG15IEBzb2NrZXRzID0gJHNlbGYtPntoYW5kbGV9LT5jYW5fcmVhZCggJHNlbGYtPntyZWN2VGltZW91dH0gLyAxMDAwICk7Ci0KLSAgICBpZihAc29ja2V0cyA9PSAwKXsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7Ci0gICAgfQotCi0gICAgbXkgJHNvY2sgPSAkc29ja2V0c1swXTsKLQotICAgIG15ICgkYnVmLCRzeik7Ci0gICAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgICAgbXkgJHNvY2sgPSAkc2VsZi0+X193YWl0KCk7CisgICAgbXkgJGJ1ZiA9ICRzZWxmLT5fX3JlY3YoJHNvY2ssICRsZW4pOwogCiAgICAgaWYgKCFkZWZpbmVkICRidWYgfHwgJGJ1ZiBlcSAnJykgewogCi0gICAgICAgIGRpZSBuZXcgVEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6RU5EX09GX0ZJTEUpOwogCiAgICAgfQogCkBAIC0yMjksMzAgKzIxMiwyNyBAQAogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJGJ1ZiAgPSBzaGlmdDsKIAotCiAgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aGFuZGxlfTsKIAogICAgIHdoaWxlIChsZW5ndGgoJGJ1ZikgPiAwKSB7Ci0KLQogICAgICAgICAjY2hlY2sgZm9yIHRpbWVvdXQKICAgICAgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl93cml0ZSggJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwICk7CiAKICAgICAgICAgaWYoQHNvY2tldHMgPT0gMCl7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHdyaXRpbmcgdG8gYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgd3JpdGluZyB0byBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CiAgICAgICAgIH0KIAotICAgICAgICBteSAkc29jayA9ICRzb2NrZXRzWzBdOworICAgICAgICBteSAkc2VudCA9ICRzZWxmLT5fX3NlbmQoJHNvY2tldHNbMF0sICRidWYpOwogCi0gICAgICAgIG15ICRnb3QgPSAkc29jay0+c2VuZCgkYnVmKTsKKyAgICAgICAgaWYgKCFkZWZpbmVkICRzZW50IHx8ICRzZW50ID09IDAgKSB7CiAKLSAgICAgICAgaWYgKCFkZWZpbmVkICRnb3QgfHwgJGdvdCA9PSAwICkgewotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnLmxlbmd0aCgkYnVmKS4nIGJ5dGVzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e2hvc3R9KTsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCB3cml0ZSAnLmxlbmd0aCgkYnVmKS4nIGJ5dGVzICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e2hvc3R9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKKwogICAgICAgICB9CiAKLSAgICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkZ290KTsKKyAgICAgICAgJGJ1ZiA9IHN1YnN0cigkYnVmLCAkc2VudCk7CiAgICAgfQogfQogCkBAIC0yNjUsNjUgKzI0NSw4MiBAQAogCiAgICAgcmV0dXJuIHVubGVzcyBkZWZpbmVkICRzZWxmLT57aGFuZGxlfTsKIAotICAgIG15ICRyZXQgID0gKCRzZWxmLT57aGFuZGxlfS0+aGFuZGxlcygpKVswXS0+Zmx1c2g7CisgICAgbXkgJHJldCA9ICgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0tPmZsdXNoOwogfQogCisjIyMKKyMjIyBPdmVycmlkYWJsZSBtZXRob2RzCisjIyMKIAogIwotIyBCdWlsZCBhIFNlcnZlclNvY2tldCBmcm9tIHRoZSBTZXJ2ZXJUcmFuc3BvcnQgYmFzZSBjbGFzcworIyBPcGVuIGEgY29ubmVjdGlvbiB0byBhIHNlcnZlci4KICMKLXBhY2thZ2UgIFRocmlmdDo6U2VydmVyU29ja2V0OwotCi11c2UgYmFzZSBxdyggVGhyaWZ0OjpTb2NrZXQgVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQgKTsKLQotdXNlIGNvbnN0YW50IExJU1RFTl9RVUVVRV9TSVpFID0+IDEyODsKLQotc3ViIG5ldwotewotICAgIG15ICRjbGFzc25hbWUgICA9IHNoaWZ0OwotICAgIG15ICRwb3J0ICAgICAgICA9IHNoaWZ0OwotCi0gICAgbXkgJHNlbGYgICAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyh1bmRlZiwgJHBvcnQsIHVuZGVmKTsKLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiBsaXN0ZW4KK3N1YiBfX29wZW4KIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgIyBMaXN0ZW4gdG8gYSBuZXcgc29ja2V0Ci0gICAgbXkgJHNvY2sgPSBJTzo6U29ja2V0OjpJTkVULT5uZXcoTG9jYWxBZGRyID0+IHVuZGVmLCAjIGFueSBhZGRyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxQb3J0ID0+ICRzZWxmLT57cG9ydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgID0+ICd0Y3AnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbiAgICA9PiBMSVNURU5fUVVFVUVfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXVzZUFkZHIgPT4gMSkKLSAgICAgICAgfHwgZG8gewotICAgICAgICAgICAgbXkgJGVycm9yID0gJ1RTZXJ2ZXJTb2NrZXQ6IENvdWxkIG5vdCBiaW5kIHRvICcgLgotICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fSAuICc6JyAuICRzZWxmLT57cG9ydH0gLiAnICgnIC4gJCEgLiAnKSc7Ci0KLSAgICAgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgewotICAgICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgICAgIH07Ci0KLSAgICAkc2VsZi0+e2hhbmRsZX0gPSAkc29jazsKKyAgICByZXR1cm4gSU86OlNvY2tldDo6SU5FVC0+bmV3KFBlZXJBZGRyID0+ICRzZWxmLT57aG9zdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZWVyUG9ydCA9PiAkc2VsZi0+e3BvcnR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gJ3RjcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ICA9PiAkc2VsZi0+e3NlbmRUaW1lb3V0fSAvIDEwMDApOwogfQogCi1zdWIgYWNjZXB0CisjCisjIENsb3NlIHRoZSBjb25uZWN0aW9uCisjCitzdWIgX19jbG9zZQoreworICBteSAkc2VsZiA9IHNoaWZ0OworICAgIENPUkU6OmNsb3NlKCgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0pOworfQorCisjCisjIFJlYWQgZGF0YQorIworIyBAcGFyYW1baW5dICRzb2NrIHRoZSBzb2NrZXQKKyMgQHBhcmFtW2luXSAkbGVuIHRoZSBsZW5ndGggdG8gcmVhZAorIyBAcmV0dXJucyB0aGUgZGF0YSBidWZmZXIgdGhhdCB3YXMgcmVhZAorIworc3ViIF9fcmVjdgoreworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgIHJldHVybiAkYnVmOworfQorCisjCisjIFNlbmQgZGF0YQorIworIyBAcGFyYW1baW5dICRzb2NrIHRoZSBzb2NrZXQKKyMgQHBhcmFtW2luXSAkYnVmIHRoZSBkYXRhIGJ1ZmZlcgorIyBAcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4KKyMKK3N1YiBfX3NlbmQKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzb2NrID0gc2hpZnQ7CisgICAgbXkgJGJ1ZiA9IHNoaWZ0OworICAgIHJldHVybiAkc29jay0+c2VuZCgkYnVmKTsKK30KIAotICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKQotICAgIHsKLSAgICAgICAgbXkgJGNsaWVudCAgICAgICAgPSAkc2VsZi0+e2hhbmRsZX0tPmFjY2VwdCgpOwotICAgICAgICBteSAkcmVzdWx0ICAgICAgICA9IG5ldyBUaHJpZnQ6OlNvY2tldDsKLSAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCgkY2xpZW50KTsKLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisjCisjIFdhaXQgZm9yIGRhdGEgdG8gYmUgcmVhZGFibGUKKyMKKyMgQHJldHVybnMgYSBzb2NrZXQgdGhhdCBjYW4gYmUgcmVhZAorIworc3ViIF9fd2FpdAoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl9yZWFkKCAkc2VsZi0+e3JlY3ZUaW1lb3V0fSAvIDEwMDAgKTsKKworICAgIGlmIChAc29ja2V0cyA9PSAwKSB7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IHRpbWVkIG91dCByZWFkaW5nIGZyb20gJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiAkc29ja2V0c1swXTsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCmluZGV4IDVlYzZmZWUuLjQxYjdlMTUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCkBAIC0xNywxNyArMTcsMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBUcmFuc3BvcnQgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUVHJhbnNwb3J0RXhjZXB0aW9uOworcGFja2FnZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2UgYmFzZSgnVGhyaWZ0OjpURXhjZXB0aW9uJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHVzZSBjb25zdGFudCBVTktOT1dOICAgICAgPT4gMDsKIHVzZSBjb25zdGFudCBOT1RfT1BFTiAgICAgPT4gMTsKQEAgLTM1LDcgKzM3LDcgQEAKIHVzZSBjb25zdGFudCBUSU1FRF9PVVQgICAgPT4gMzsKIHVzZSBjb25zdGFudCBFTkRfT0ZfRklMRSAgPT4gNDsKIAotc3ViIG5ld3sKK3N1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CiAKQEAgLTQzLDYgKzQ1LDcgQEAKIH0KIAogcGFja2FnZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogIwogIyBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCkBAIC01MSw3ICs1NCw3IEBACiAjCiBzdWIgaXNPcGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTYxLDcgKzY0LDcgQEAKICMKIHN1YiBvcGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTY5LDcgKzcyLDcgQEAKICMKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC04MSw4ICs4NCw3IEBACiAjCiBzdWIgcmVhZAogewotICAgIG15ICgkbGVuKTsKLSAgICBkaWUoImFic3RyYWN0Iik7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNCw4ICsxMTYsNyBAQAogIwogc3ViIHdyaXRlCiB7Ci0gICAgbXkgKCRidWYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMzAsNiArMTMxLDcgQEAKICMgVHJhbnNwb3J0RmFjdG9yeSBjcmVhdGVzIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OlRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTE1NiwyMCArMTU4LDIxIEBACiAjICBTZXJ2ZXJUcmFuc3BvcnQgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBsaXN0ZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIGFjY2VwdAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgY2xvc2UKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZGEzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7CisKKyMKKyMgRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyMKK3BhY2thZ2UgVGhyaWZ0OjpUVHlwZTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwordXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwordXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwordXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwordXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwordXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwordXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwordXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwordXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKK3VzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Cit1c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwordXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKK3VzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Cit1c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwordXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKK3VzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Cit1c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWU4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KQEAgLTAsMCArMSw4NCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwordXNlIFRocmlmdDo6VW5peFNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlVOSVg7CisKK3BhY2thZ2UgVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyU29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIElmIGEgc2luZ2xlIGFyZ3VtZW50IGlzIGdpdmVuIHRoYXQgaXMgbm90IGEgaGFzaCwgdGhhdCBpcyB0aGUgdW5peCBkb21haW4gc29ja2V0IHBhdGguCisjIElmIGEgc2luZ2xlIGFyZ3VtZW50IGlzIGdpdmVuIHRoYXQgaXMgYSBoYXNoOgorIyBAcGFyYW1baW5dICBwYXRoICAgdW5peCBkb21haW4gc29ja2V0IGZpbGUgbmFtZQorIyBAcGFyYW1baW5dICBxdWV1ZSAgdGhlIGxpc3RlbiBxdWV1ZSBzaXplIChkZWZhdWx0IGlzIG5vdCBzcGVjaWZpZWQgaXMgc3VwcGxpZWQgYnkgU2VydmVyU29ja2V0KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KCRwYXRoKTsKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldyhwYXRoID0+ICJzb21lcGF0aCIsIHF1ZXVlID0+IDY0KTsKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJGFyZ3MgICAgICA9IHNoaWZ0OworICAgIG15ICRzZWxmOworCisgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CisgICAgICAgICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkYXJncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJHNlbGYgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCk7CisgICAgICAgICRzZWxmLT57cGF0aH0gPSAkYXJnczsKKyAgICB9CisKKyAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOworfQorCitzdWIgX19jbGllbnQKK3sKKyAgcmV0dXJuIFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCk7Cit9CisKK3N1YiBfX2xpc3RlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OlVOSVgtPm5ldygKKyAgICAgICAgVHlwZSAgICAgID0+IElPOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLAorICAgICAgICBMb2NhbCAgICAgPT4gJHNlbGYtPntwYXRofSwKKyAgICAgICAgTGlzdGVuICAgID0+ICRzZWxmLT57cXVldWV9KQorICAgIHx8IGRvIHsKKyAgICAgICAgbXkgJGVycm9yID0gJ1VuaXhTZXJ2ZXJTb2NrZXQ6IENvdWxkIG5vdCBiaW5kIHRvICcgLgorICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e3BhdGh9IC4gJyAoJyAuICQhIC4gJyknOworICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKKyAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgfTsKKworICAgIHJldHVybiAkc29jazsKK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTM4NmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCkBAIC0wLDAgKzEsNjcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIElPOjpTb2NrZXQ6OlVOSVg7CisKK3BhY2thZ2UgVGhyaWZ0OjpVbml4U29ja2V0OwordXNlIGJhc2UgcXcoIFRocmlmdDo6U29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0b3IuCisjIFRha2VzIGEgdW5peCBkb21haW4gc29ja2V0IGZpbGVuYW1lLgorIyBTZWUgVGhyaWZ0OjpTb2NrZXQgZm9yIGJhc2UgY2xhc3MgcGFyYW1ldGVycy4KKyMgQHBhcmFtW2luXSAgcGF0aCAgIHBhdGggdG8gdW5peCBzb2NrZXQgZmlsZQorIyBAZXhhbXBsZSAgICBteSAkc29jayA9IFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCRwYXRoKTsKKyMKK3N1YiBuZXcKK3sKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoKTsKKyAgICAkc2VsZi0+e3BhdGh9ID0gc2hpZnQ7CisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIF9fb3BlbgoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkc29jayA9IElPOjpTb2NrZXQ6OlVOSVgtPm5ldygKKyAgICAgICAgVHlwZSAgICAgID0+IElPOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNLAorICAgICAgICBQZWVyICAgICAgPT4gJHNlbGYtPntwYXRofSkKKyAgICB8fCBkbyB7CisgICAgICAgIG15ICRlcnJvciA9ICdVbml4U29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4KKyAgICAgICAgICAgICRzZWxmLT57cGF0aH0gLiAnICgnIC4gJCEgLiAnKSc7CisgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgeworICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKKyAgICB9OworCisgICAgcmV0dXJuICRzb2NrOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9wZXJsL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNzk1YWFlZC4uZGUwMzk3MSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvcGVybC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNywxNSArMTcsNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gQHRvcF9idWlsZGRpckAvY29tcGlsZXIvY3BwL3RocmlmdAotVEhSSUZUX0lGID0gQHRvcF9zcmNkaXJAL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLQotY2hlY2stbG9jYWw6IGdlbi1wZXJsL1RocmlmdFRlc3QvVHlwZXMucG0KLQotZ2VuLXBlcmwvVGhyaWZ0VGVzdC9UeXBlcy5wbTogJChUSFJJRlRfSUYpCi0JJChUSFJJRlQpIC0tZ2VuIHBlcmwgJChUSFJJRlRfSUYpCi0KLWNsZWFuLWxvY2FsOgotCXJtIC1yZiBnZW4tcGVybAotCi1FWFRSQV9ESVNUID0gbWVtb3J5X2J1ZmZlci50IHByb2Nlc3Nvci50CitFWFRSQV9ESVNUID0gbWVtb3J5X2J1ZmZlci50IHByb2Nlc3Nvci50IG11bHRpcGxleC50CmRpZmYgLS1naXQgYS9saWIvcGVybC90ZXN0L211bHRpcGxleC50IGIvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGE5YjRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudApAQCAtMCwwICsxLDIwMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSBUZXN0OjpNb3JlIHRlc3RzID0+IDY7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwordXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3VzZSBUaHJpZnQ6OlNlcnZlcjsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKKwordXNlIEJlbmNobWFya1NlcnZpY2U7Cit1c2UgQWdncjsKKwordXNlIGNvbnN0YW50IE5BTUVfQkVOQ0hNQVJLU0VSVklDRSA9PiAnQmVuY2htYXJrU2VydmljZSc7Cit1c2UgY29uc3RhbnQgTkFNRV9BR0dSICA9PiAgJ0FnZ3InOworCitteSAkYnVmZmVyICAgID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXItPm5ldygxMDI0KTsKK215ICRhZ2dyX3Byb3RvY29sICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkYnVmZmVyKSwgTkFNRV9BR0dSKTsKK215ICRhZ2dyX2NsaWVudCAgICA9IEFnZ3JDbGllbnQtPm5ldygkYWdncl9wcm90b2NvbCk7CitteSAkYmVuY2htYXJrX3Byb3RvY29sID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCRidWZmZXIpLCBOQU1FX0JFTkNITUFSS1NFUlZJQ0UpOworbXkgJGJlbmNobWFya19jbGllbnQgPSBCZW5jaG1hcmtTZXJ2aWNlQ2xpZW50LT5uZXcoJGJlbmNobWFya19wcm90b2NvbCk7IAorCiskYnVmZmVyLT5vcGVuKCk7CisKK2ZvcihteSAkaSA9IDE7ICRpIDw9IDU7ICRpKyspIHsKKyAgICAkYWdncl9jbGllbnQtPnNlbmRfYWRkVmFsdWUoJGkpOworICAgICRhZ2dyX2NsaWVudC0+e3NlcWlkfSsrOworfQorCiskYWdncl9jbGllbnQtPnNlbmRfZ2V0VmFsdWVzKCk7CisKK2ZvcihteSAkaSA9IDE7ICRpIDw9IDU7ICRpKyspIHsKKyAgICAkYmVuY2htYXJrX2NsaWVudC0+c2VuZF9maWJvbmFjY2koJGkpOworICAgICRiZW5jaG1hcmtfY2xpZW50LT57c2VxaWR9Kys7Cit9CiskYmVuY2htYXJrX2NsaWVudC0+e3NlcWlkfS0tOworCitteSAkY2xpZW50X2NvbW1hbmRfYmluYXJ5ID0gJGJ1ZmZlci0+Z2V0QnVmZmVyOworJGJ1ZmZlci0+cmVzZXRCdWZmZXI7CisKKworIyBQcm9jZXNzIGJ5IHNlcnZlcgorbXkgJHNlcnZlcl9vdXRwdXRfYmluYXJ5OworeworICAgIG15ICRiZW5jaG1hcmtfaGFuZGxlciA9IE15OjpCZW5jaG1hcmtTZXJ2aWNlLT5uZXcoKTsKKyAgICBteSAkYmVuY2htYXJrX3Byb2Nlc3NvciA9IEJlbmNobWFya1NlcnZpY2VQcm9jZXNzb3ItPm5ldygkYmVuY2htYXJrX2hhbmRsZXIpOworICAgIG15ICRhZ2dyX2hhbmRsZXIgPSBNeTo6QWdnci0+bmV3KCk7IAorICAgIG15ICRhZ2dyX3Byb2Nlc3NvciA9IEFnZ3JQcm9jZXNzb3ItPm5ldygkYWdncl9oYW5kbGVyKTsKKyAgICAKKyAgICBteSAkcHJvdG9jb2xfZmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKTsKKworICAgIG15ICRpbnB1dF9idWZmZXIgICAgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlci0+bmV3KCk7CisgICAgJGlucHV0X2J1ZmZlci0+d3JpdGUoJGNsaWVudF9jb21tYW5kX2JpbmFyeSk7CisKKyAgICBteSAkaW5wdXRfcHJvdG9jb2wgID0gJHByb3RvY29sX2ZhY3RvcnktPmdldFByb3RvY29sKCRpbnB1dF9idWZmZXIpOworCisgICAgbXkgJG91dHB1dF9idWZmZXIgICA9IFRocmlmdDo6TWVtb3J5QnVmZmVyLT5uZXcoKTsKKyAgICBteSAkb3V0cHV0X3Byb3RvY29sID0gJHByb3RvY29sX2ZhY3RvcnktPmdldFByb3RvY29sKCRvdXRwdXRfYnVmZmVyKTsKKworICAgIG15ICRwcm9jZXNzb3IgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yLT5uZXcoKTsKKworICAgICRwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKE5BTUVfQkVOQ0hNQVJLU0VSVklDRSwgJGJlbmNobWFya19wcm9jZXNzb3IpOworICAgICRwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKE5BTUVfQUdHUiwgJGFnZ3JfcHJvY2Vzc29yKTsKKyAgICBteSAkcmVzdWx0OworICAgIGZvcihteSAkaSA9IDE7ICRpIDw9IDExOyAkaSsrKSB7CisgICAgICAgICRyZXN1bHQgPSAkcHJvY2Vzc29yLT5wcm9jZXNzKCRpbnB1dF9wcm90b2NvbCwgJG91dHB1dF9wcm90b2NvbCk7CisgICAgICAgIHByaW50ICJwcm9jZXNzIHJlc3VsdGVkIGluICRyZXN1bHRcbiI7CisgICAgfQorCisgICAgJHNlcnZlcl9vdXRwdXRfYmluYXJ5ID0gJG91dHB1dF9idWZmZXItPmdldEJ1ZmZlcigpOworfQorCiskYnVmZmVyLT53cml0ZSgkc2VydmVyX291dHB1dF9iaW5hcnkpOworCisKKworZm9yKG15ICRpID0gMTsgJGkgPD0gNTsgJGkrKykgeworICAgIG15ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKKworICAgICRhZ2dyX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOworCisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgICAgIGRpZTsKKyAgICB9CisgICAgCisgICAgbXkgJGFnZ3JfcmVzdWx0ID0gQWdncl9hZGRWYWx1ZV9yZXN1bHQtPm5ldygpOworICAgICRhZ2dyX3Jlc3VsdC0+cmVhZCgkYWdncl9wcm90b2NvbCk7CisgICAgJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlRW5kKCk7Cit9CisKK215ICgkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkKTsKKworJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CisKK2lmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICBkaWU7Cit9CisgICAgCitteSAkYWdncl9yZXN1bHQgPSBBZ2dyX2dldFZhbHVlc19yZXN1bHQtPm5ldygpOworJGFnZ3JfcmVzdWx0LT5yZWFkKCRhZ2dyX3Byb3RvY29sKTsKKyRhZ2dyX3Byb3RvY29sLT5yZWFkTWVzc2FnZUVuZCgpOworCitpc19kZWVwbHkoJGFnZ3JfcmVzdWx0LT5zdWNjZXNzKCksIFsxLDIsMyw0LDVdKTsKKyAKKworZm9yZWFjaCBteSAkdmFsKCgxLDIsMyw1LDgpKSB7CisgICAgbXkgKCRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWQpOworCisgICAgJGJlbmNobWFya19wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKKworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICAgICAgZGllOworICAgIH0KKyAgICBteSAkYmVuY2htYXJrX3Jlc3VsdCA9IEJlbmNobWFya1NlcnZpY2VfZmlib25hY2NpX3Jlc3VsdC0+bmV3KCk7CisgICAgJGJlbmNobWFya19yZXN1bHQtPnJlYWQoJGJlbmNobWFya19wcm90b2NvbCk7CisgICAgJGJlbmNobWFya19wcm90b2NvbC0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICAKKyAgICBpcygkYmVuY2htYXJrX3Jlc3VsdC0+c3VjY2VzcygpLCAkdmFsKTsKK30KKworCitwYWNrYWdlIE15OjpBZ2dyOwordXNlIGJhc2UgcXcoQWdncklmKTsgCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7IAorCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICA9IHt9OworICAgIAorICAgICRzZWxmLT57dmFsdWVzfSA9ICgpOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgYWRkVmFsdWV7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkdmFsdWUgPSBzaGlmdDsKKworICAgIHB1c2ggKEB7JHNlbGYtPnt2YWx1ZXN9fSwgJHZhbHVlKTsgIAorfQorCitzdWIgZ2V0VmFsdWVzeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgCisgICByZXR1cm4gJHNlbGYtPnt2YWx1ZXN9OworfQorCisKKworcGFja2FnZSBNeTo6QmVuY2htYXJrU2VydmljZTsKK3VzZSBiYXNlIHF3KEJlbmNobWFya1NlcnZpY2VJZik7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIHJldHVybiBibGVzcyB7fSwgJGNsYXNzOworfQorCitzdWIgZmlib25hY2NpIHsKKyAgICBteSAoJHNlbGYsICRuKSA9IEBfOworICAgIAorICAgIG15ICRwcmV2ID0gMDsKKyAgICBteSAkbmV4dDsKKyAgICBteSAkcmVzdWx0ID0gMTsKKyAgICAKKyAgICB3aGlsZSAoJG4gPiAwKSB7CisgICAgICAgICRuZXh0ID0gJHJlc3VsdCArICRwcmV2OworICAgICAgICAkcHJldiA9ICRyZXN1bHQ7CisgICAgICAgICRyZXN1bHQgPSAkbmV4dDsKKyAgICAgICAgLS0kbjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuICRyZXN1bHQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CmluZGV4IDFkOGJlNzMuLmY4MzMwMzUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKKysrIGIvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudApAQCAtMjIsOSArMjIsOSBAQAogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAotdXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwogdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwordXNlIFRocmlmdDo6TWVzc2FnZVR5cGU7CiAKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwpAQCAtNzIsNyArNzIsNyBAQAogICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKICAgICBwcmludCAiICAkZnVuY3Rpb25fbmFtZSwgJG1lc3NhZ2VfdHlwZSwgJHNlcXVlbmNlX2lkXG4iOwogCi0gICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CiAgICAgICAgIGRpZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL3Rvb2xzL0ZpeHVwRGlzdC5wbCBiL2xpYi9wZXJsL3Rvb2xzL0ZpeHVwRGlzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGEyYjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoaXMgd2lsbCBmaXggdXAgdGhlIGRpc3RyaWJ1dGlvbiBzbyB0aGF0IENQQU4gcHJvcGVybHkKKyMgaW5kZXhlcyBUaHJpZnQuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIHV0Zjg7CisKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgQ1BBTjo6TWV0YTsKKworbXkgJG1ldGEgPSBDUEFOOjpNZXRhLT5sb2FkX2ZpbGUoJ01FVEEuanNvbicpOworJG1ldGEtPnsncHJvdmlkZXMnfSA9IHsgJ1RocmlmdCcgPT4geyAnZmlsZScgPT4gJ2xpYi9UaHJpZnQucG0nLCAndmVyc2lvbicgPT4gJG1ldGEtPnZlcnNpb24oKSB9IH07CiskbWV0YS0+c2F2ZSgnTUVUQS5qc29uJyk7CmRpZmYgLS1naXQgYS9saWIvcGhwL01ha2VmaWxlLmFtIGIvbGliL3BocC9NYWtlZmlsZS5hbQppbmRleCBkMzc0Y2JjLi44ZDkwNTBhIDEwMDc1NQotLS0gYS9saWIvcGhwL01ha2VmaWxlLmFtCisrKyBiL2xpYi9waHAvTWFrZWZpbGUuYW0KQEAgLTIyLDc5ICsyMiwxMjggQEAKIFNVQkRJUlMgPSB0ZXN0CiBlbmRpZgogCi0lLnNvOgotCWNkIHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sLyBcCi0JICAmJiAkKE1BS0UpCi0KIGlmIFdJVEhfUEhQX0VYVEVOU0lPTgorJS5zbzoKKwljZCBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC8gJiYgJChNQUtFKQorCiBwaHBjb25mZGlyPSQoUEhQX0NPTkZJR19QUkVGSVgpCiBwaHBjb25mX0RBVEE9dGhyaWZ0X3Byb3RvY29sLmluaQogCiBwaHBtb2R1bGVkaXIgPSBgcGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXJgCiBwaHBtb2R1bGVfU0NSSVBUUyA9IHNyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMvdGhyaWZ0X3Byb3RvY29sLnNvCisKK2Rpc3RjbGVhbi1sb2NhbDoKKwljZCAkKHBocG1vZHVsZV9TQ1JJUFRTKSAmJiAkKFBIUElaRSkgLS1jbGVhbgorCiBlbmRpZgogCi1waHBkaXIgPSAkKFBIUF9QUkVGSVgpL1RocmlmdAorcGhwZGlyID0gJChQSFBfUFJFRklYKS8KK3BocF9EQVRBID0gXAorICBsaWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAogCiBwaHBiYXNlZGlyID0gJChwaHBkaXIpL0Jhc2UKIHBocGJhc2VfREFUQSA9IFwKLSAgbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocAorICBsaWIvQmFzZS9UQmFzZS5waHAKKworcGhwY2xhc3Nsb2FkZXJkaXIgPSAkKHBocGRpcikvQ2xhc3NMb2FkZXIKK3BocGNsYXNzbG9hZGVyX0RBVEEgPSBcCisgIGxpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKIAogcGhwZXhjZXB0aW9uZGlyID0gJChwaHBkaXIpL0V4Y2VwdGlvbgogcGhwZXhjZXB0aW9uX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocCBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgXAotICBsaWIvVGhyaWZ0L0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAorICBsaWIvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgXAorICBsaWIvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwIFwKKyAgbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocAogCiBwaHBmYWN0b3J5ZGlyID0gJChwaHBkaXIpL0ZhY3RvcnkKIHBocGZhY3RvcnlfREFUQSA9IFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCisgIGxpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAgXAorICBsaWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCiAKIHBocHByb3RvY29sZGlyID0gJChwaHBkaXIpL1Byb3RvY29sCiBwaHBwcm90b2NvbF9EQVRBID0gXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCisgIGxpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgXAorICBsaWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVFByb3RvY29sLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIFwKKyAgbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCiAKIHBocHByb3RvY29sanNvbmRpciA9ICQocGhwcHJvdG9jb2xkaXIpL0pTT04KIHBocHByb3RvY29sanNvbl9EQVRBID0gXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAorICBsaWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCisKK3BocHByb3RvY29sc2ltcGxlanNvbmRpciA9ICQocGhwcHJvdG9jb2xkaXIpL1NpbXBsZUpTT04KK3BocHByb3RvY29sc2ltcGxlanNvbl9EQVRBID0gXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocAogCiBwaHBzZXJpYWxpemVyZGlyID0gJChwaHBkaXIpL1NlcmlhbGl6ZXIKIHBocHNlcmlhbGl6ZXJfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAorICBsaWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKKworcGhwc2VydmVyZGlyID0gJChwaHBkaXIpL1NlcnZlcgorcGhwc2VydmVyX0RBVEEgPSBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgXAorICBsaWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlci5waHAgXAorICBsaWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIFwKKyAgbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocAorCitwaHBzdHJpbmdmdW5jZGlyID0gJChwaHBkaXIpL1N0cmluZ0Z1bmMKK3BocHN0cmluZ2Z1bmNfREFUQSA9IFwKKyAgbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIFwKKyAgbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKIAogcGhwdHJhbnNwb3J0ZGlyID0gJChwaHBkaXIpL1RyYW5zcG9ydAogcGhwdHJhbnNwb3J0X0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisgIGxpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKIAogcGhwdHlwZWRpciA9ICQocGhwZGlyKS9UeXBlCiBwaHB0eXBlX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwIFwKLSAgbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocAorICBsaWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwIFwKKyAgbGliL1R5cGUvVFR5cGUucGhwIFwKKyAgbGliL1R5cGUvVENvbnN0YW50LnBocAogCiBFWFRSQV9ESVNUID0gXAotCXNyYyBcCi0JbGliIFwKLQl0aHJpZnRfcHJvdG9jb2wuaW5pIFwKLQlSRUFETUUuYXBhY2hlCisgIGxpYiBcCisgIHNyYy9hdXRvbG9hZC5waHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyIFwKKyAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggXAorICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwIFwKKyAgc3JjL1RocmlmdC5waHAgXAorICBzcmMvVFN0cmluZ1V0aWxzLnBocCBcCisgIGNvZGluZ19zdGFuZGFyZHMubWQgXAorICB0aHJpZnRfcHJvdG9jb2wuaW5pIFwKKyAgUkVBRE1FLmFwYWNoZS5tZCBcCisgIFJFQURNRS5tZAogCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IE1ha2VmaWxlIE1ha2VmaWxlLmluCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKyAgTWFrZWZpbGUgXAorICBNYWtlZmlsZS5pbgorCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRSBiL2xpYi9waHAvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjZjZjg4Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotVGhyaWZ0IFBIUCBTb2Z0d2FyZSBMaWJyYXJ5Ci0KLUxpY2Vuc2UKLT09PT09PT0KLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0KLVVzaW5nIFRocmlmdCB3aXRoIFBIUAotPT09PT09PT09PT09PT09PT09PT09Ci0KLVRocmlmdCByZXF1aXJlcyBQSFAgNS4gVGhyaWZ0IG1ha2VzIGFzIGZldyBhc3N1bXB0aW9ucyBhYm91dCB5b3VyIFBIUAotZW52aXJvbm1lbnQgYXMgcG9zc2libGUgd2hpbGUgdHJ5aW5nIHRvIG1ha2Ugc29tZSBtb3JlIGFkdmFuY2VkIFBIUAotZmVhdHVyZXMgKGkuZS4gQVBDIGNhY2hlaW5nIHVzaW5nIGFzYm9sdXRlIHBhdGggVVJMcykgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLgotCi1UbyB1c2UgVGhyaWZ0IGluIHlvdXIgUEhQIGNvZGViYXNlLCB0YWtlIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLSMxKSBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQotIzIpIENvbmZpZ3VyZSBTeW1mb255IEF1dG9sb2FkZXIgKG9yIHdoYXRldmVyIHlvdSB1c3VhbGx5IHVzZSkKLQotQWZ0ZXIgdGhhaHQsIHlvdSBoYXZlIHRvIG1hbnVhbGx5IGluY2x1ZGUgdGhlIFRocmlmdCBwYWNrYWdlCi1jcmVhdGVkIGJ5IHRoZSBjb21waWxlcjoKLQotcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKLXJlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOwotCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQotCi1QSFBfSU5UX1NJWkUKLQotICBUaGlzIGJ1aWx0LWluIHNpZ25hbHMgd2hldGhlciB5b3VyIGFyY2hpdGVjdHVyZSBpcyAzMiBvciA2NCBiaXQgYW5kIGlzCi0gIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bwotICBzZXJpYWxpemUgZGF0YS4KLQotYXBjX2ZldGNoKCksIGFwY19zdG9yZSgpCi0KLSAgQVBDIGNhY2hlIGlzIHVzZWQgYnkgdGhlIFRTb2NrZXRQb29sIGNsYXNzLiBJZiB5b3UgZG8gbm90IGhhdmUgQVBDIGluc3RhbGxlZCwKLSAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5hcGFjaGUgYi9saWIvcGhwL1JFQURNRS5hcGFjaGUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvUkVBRE1FLmFwYWNoZQpyZW5hbWUgdG8gbGliL3BocC9SRUFETUUuYXBhY2hlLm1kCmRpZmYgLS1naXQgYS9saWIvcGhwL1JFQURNRS5tZCBiL2xpYi9waHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNzAxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL1JFQURNRS5tZApAQCAtMCwwICsxLDYwIEBACitUaHJpZnQgUEhQIFNvZnR3YXJlIExpYnJhcnkKKworIyBMaWNlbnNlCisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisjIFVzaW5nIFRocmlmdCB3aXRoIFBIUAorCitUaHJpZnQgcmVxdWlyZXMgUEhQIDUuIFRocmlmdCBtYWtlcyBhcyBmZXcgYXNzdW1wdGlvbnMgYWJvdXQgeW91ciBQSFAKK2Vudmlyb25tZW50IGFzIHBvc3NpYmxlIHdoaWxlIHRyeWluZyB0byBtYWtlIHNvbWUgbW9yZSBhZHZhbmNlZCBQSFAKK2ZlYXR1cmVzIChpLmUuIEFQQyBjYWNoZWluZyB1c2luZyBhc2JvbHV0ZSBwYXRoIFVSTHMpIGFzIHNpbXBsZSBhcyBwb3NzaWJsZS4KKworVG8gdXNlIFRocmlmdCBpbiB5b3VyIFBIUCBjb2RlYmFzZSwgdGFrZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCisxLiBDb3B5IGFsbCBvZiB0aHJpZnQvbGliL3BocC9saWIgaW50byB5b3VyIFBIUCBjb2RlYmFzZQorMi4gQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQorCitBZnRlciB0aGF0LCB5b3UgaGF2ZSB0byBtYW51YWxseSBpbmNsdWRlIHRoZSBUaHJpZnQgcGFja2FnZQorY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6CisKK2BgYAorcmVxdWlyZV9vbmNlICdwYWNrYWdlcy9TZXJ2aWNlL1NlcnZpY2UucGhwJzsKK3JlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9UeXBlcy5waHAnOworYGBgCisKKyMgRGVwZW5kZW5jaWVzCisKK1BIUF9JTlRfU0laRQorCisgICAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcworICAgIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bworICAgIHNlcmlhbGl6ZSBkYXRhLgorCithcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKKworICAgIEFQQyBjYWNoZSBpcyB1c2VkIGJ5IHRoZSBUU29ja2V0UG9vbCBjbGFzcy4gSWYgeW91IGRvIG5vdCBoYXZlIEFQQyBpbnN0YWxsZWQsCisgICAgVGhyaWZ0IHdpbGwgZmlsbCBpbiBudWxsIHN0dWIgZnVuY3Rpb24gZGVmaW5pdGlvbnMuCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworMS4gW1BTUi00XShodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvKSBsb2FkZXIgaXMgbm93IHRoZSBkZWZhdWx0LiBJZiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgbWFwcyBpbnN0ZWFkLCB1c2UgYC1nZW4gcGhwOmNsYXNzbWFwYC4KKworMi4gSWYgdXNpbmcgUFNSLTQsIHVzZSBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnbmFtZXNwYWNlJywgJzxwYXRoPicpYCBpbnN0ZWFkIG9mIGAkdGhyaWZ0Q2xhc3NMb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignbmFtZXNwYWNlJywgJzxwYXRoPicpYC4KZGlmZiAtLWdpdCBhL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjE3NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNSBAQAorIyMgUEhQIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBbUFNSLTJdKGh0dHA6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci0yLykKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwIGIvbGliL3BocC9saWIvQmFzZS9UQmFzZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxYjYzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCkBAIC0wLDAgKzEsMzgyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEJhc2U7CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZyb20gd2hpY2ggb3RoZXIgVGhyaWZ0IHN0cnVjdHMgZXh0ZW5kLiBUaGlzIGlzIHNvIHRoYXQgd2UgY2FuCisgKiBjdXQgYmFjayBvbiB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggaXMgdHVybmluZyBvdXQgdG8gaGF2ZSBhCisgKiBub250cml2aWFsIGNvc3QganVzdCB0byBsb2FkIHRoYW5rcyB0byB0aGUgd29uZHJvdXNseSBhYnlzbWFsIGltcGxlbWVudGF0aW9uCisgKiBvZiBQSFAuIE5vdGUgdGhhdCBjb2RlIGlzIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBoZXJlIHRvIGF2b2lkIG1ha2luZworICogZnVuY3Rpb24gY2FsbHMgZm9yIGV2ZXJ5IGZpZWxkIG9yIG1lbWJlciBvZiBhIGNvbnRhaW5lci4uCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CisgICAgcHVibGljIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiAnQm9vbCcsCisgICAgICAgIFRUeXBlOjpCWVRFID0+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+c2VydmljZVByb2Nlc3Nvck1hcF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICAgICAidG8gY2FsbCByZWdpc3RlclByb2Nlc3NvcigpPyIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAkcHJvY2Vzc29yID0gJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfWyRzZXJ2aWNlTmFtZV07CisKKyAgICAgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgICAgICBuZXcgU3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLAorICAgICAgICAgICAgJG91dHB1dAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9CYXNlL1RCYXNlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1YjUyNi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxCYXNlOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIFRocmlmdCBzdHJ1Y3RzIGV4dGVuZC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbgotICogY3V0IGJhY2sgb24gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGlzIHR1cm5pbmcgb3V0IHRvIGhhdmUgYQotICogbm9udHJpdmlhbCBjb3N0IGp1c3QgdG8gbG9hZCB0aGFua3MgdG8gdGhlIHdvbmRyb3VzbHkgYWJ5c21hbCBpbXBsZW1lbnRhdGlvbgotICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKLSAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgotICovCi1hYnN0cmFjdCBjbGFzcyBUQmFzZSB7Ci0KLSAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STMyICAgID0+ICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STY0ICAgID0+ICdJNjQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKLQotICBhYnN0cmFjdCBmdW5jdGlvbiByZWFkKCRpbnB1dCk7Ci0KLSAgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCk7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzcGVjPW51bGwsICR2YWxzPW51bGwpIHsKLSAgICBpZiAoaXNfYXJyYXkoJHNwZWMpICYmIGlzX2FycmF5KCR2YWxzKSkgewotICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKLSAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKLSAgICAgICAgICAkdGhpcy0+JHZhciA9ICR2YWxzWyR2YXJdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKLSAgewotICAgICR0aGlzLT5fX2NvbnN0cnVjdChnZXRfb2JqZWN0X3ZhcnMoJHRoaXMpKTsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7Ci0gICAgICAka3JlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKLSAgICB9Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgewotICAgICAgJHZyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOwotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKLSAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgewotICAgICAgJGtleSA9ICR2YWwgPSBudWxsOwotICAgICAgaWYgKCRrcmVhZCAhPT0gbnVsbCkgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAka3NwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOwotICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJHZhbC0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkdmFyWyRrZXldID0gJHZhbDsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7Ci0gICAgICAkZXJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfZXR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRlbGVtID0gbnVsbDsKLSAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZXJlYWQoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRlc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHNldCkgewotICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFyIFtdPSAkZWxlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGZuYW1lID0gbnVsbDsKLSAgICAkZnR5cGUgPSAwOwotICAgICRmaWQgPSAwOwotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKLSAgICAgICAgJGZzcGVjID0gJHNwZWNbJGZpZF07Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7Ci0gICAgICAgICAgJHhmZXIgPSAwOwotICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKLSAgICAgICAgICAgICRmdW5jID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICB9Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgewotICAgICR4ZmVyID0gMDsKLSAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKLSAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKLSAgICAka3dyaXRlID0gJHZ3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGt3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKLSAgICB9Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgewotICAgICAgJHZ3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOwotICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICBpZiAoaXNzZXQoJGt3cml0ZSkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAka2V5LT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGtleSwgJGtzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiR2d3JpdGUoJHZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGV3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGV3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICRlbGVtID0gJHNldCA/ICRrZXkgOiAkdmFsOwotICAgICAgaWYgKGlzc2V0KCRld3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7Ci0gICAgfQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7Ci0gICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKLSAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7Ci0gICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJHZhciwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICRmdW5jID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKLSAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+JHZhci0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgICAgfQotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlOTNmNS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIENsYXNzTG9hZGVyIHRvIGxvYWQgVGhyaWZ0IGxpYnJhcnkgYW5kIGRlZmluaXRpb25zCi0gKiBJbnNwaXJlZCBmcm9tIFVuaXZlcnNhbENsYXNzTG9hZGVyIGZyb20gU3ltZm9ueSAyIAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5jbGFzc2xvYWRlcgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcQ2xhc3NMb2FkZXI7Ci0KLWNsYXNzIFRocmlmdENsYXNzTG9hZGVyCi17Ci0gICAgLyoqCi0gICAgICogTmFtZXNwYWNlcyBwYXRoCi0gICAgICogQHZhciBhcnJheQotICAgICAqLwotICAgIHByb3RlY3RlZCAkbmFtZXNwYWNlcyA9IGFycmF5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBUaHJpZnQgZGVmaW5pdGlvbiBwYXRocwotICAgICAqIEB2YXIgdHlwZQotICAgICAqLwotICAgIHByb3RlY3RlZCAkZGVmaW5pdGlvbnMgPSBhcnJheSgpOwotCi0gICAgLyoqCi0gICAgICogRG8gd2UgdXNlIEFQQyBjYWNoZSA/Ci0gICAgICogQHZhciBib29sZWFuCi0gICAgICovCi0gICAgcHJvdGVjdGVkICRhcGMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIEFQQyBDYWNoZSBwcmVmaXgKLSAgICAgKiBAdmFyIHN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCAkYXBjX3ByZWZpeDsKLQotICAgIC8qKgotICAgICAqIFNldCBhdXRvbG9hZGVyIHRvIHVzZSBBUEMgY2FjaGUKLSAgICAgKiBAcGFyYW0gYm9vbGVhbiAkYXBjCi0gICAgICogQHBhcmFtIHN0cmluZyAkYXBjX3ByZWZpeAotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYXBjID0gZmFsc2UsICRhcGNfcHJlZml4ID0gbnVsbCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5hcGMgPSAkYXBjOwotICAgICAgICAkdGhpcy0+YXBjX3ByZWZpeCA9ICRhcGNfcHJlZml4OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG5hbWVzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgJG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkcGF0aHMgICAgIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyTmFtZXNwYWNlKCRuYW1lc3BhY2UsICRwYXRocykKLSAgICB7Ci0gICAgICAgICR0aGlzLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdID0gKGFycmF5KSAkcGF0aHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgVGhyaWZ0IGRlZmluaXRpb24gbmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAgICAgICAkbmFtZXNwYWNlIFRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQotICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzICAgICBUaGUgbG9jYXRpb24ocykgb2YgdGhlIGRlZmluaXRpb24gbmFtZXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyRGVmaW5pdGlvbigkbmFtZXNwYWNlLCAkcGF0aHMpCi0gICAgewotICAgICAgICAkdGhpcy0+ZGVmaW5pdGlvbnNbJG5hbWVzcGFjZV0gPSAoYXJyYXkpICRwYXRoczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgdGhpcyBpbnN0YW5jZSBhcyBhbiBhdXRvbG9hZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIEJvb2xlYW4gJHByZXBlbmQgV2hldGhlciB0byBwcmVwZW5kIHRoZSBhdXRvbG9hZGVyIG9yIG5vdAotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQotICAgIHsKLSAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCR0aGlzLCAnbG9hZENsYXNzJyksIHRydWUsICRwcmVwZW5kKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3MsIGRlZmluaXRpb24gb3IgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIGxvYWRDbGFzcygkY2xhc3MpCi0gICAgewotICAgICAgICBpZiAoCi0gICAgICAgICAgICAodHJ1ZSA9PT0gJHRoaXMtPmFwYyAmJiAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGVJbkFwYygkY2xhc3MpKSkgb3IKLSAgICAgICAgICAgICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKQotICAgICAgICApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVpcmVfb25jZSAkZmlsZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcyBvciBpbnRlcmZhY2UgaW4gQVBDLgotICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqIEByZXR1cm4gc3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRGaWxlSW5BcGMoJGNsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSA9IGFwY19mZXRjaCgkdGhpcy0+YXBjX3ByZWZpeC4kY2xhc3MpKSB7Ci0gICAgICAgICAgICBhcGNfc3RvcmUoJHRoaXMtPmFwY19wcmVmaXguJGNsYXNzLCAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGNsYXNzIGluIG5hbWVzcGFjZXMgb3IgZGVmaW5pdGlvbnMgZGlyZWN0b3JpZXMKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRjbGFzcwotICAgICAqIEByZXR1cm4gc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIGZpbmRGaWxlKCRjbGFzcykKLSAgICB7Ci0gICAgICAgIC8vIFJlbW92ZSBmaXJzdCBiYWNrc2xhc2gKLSAgICAgICAgaWYgKCdcXCcgPT0gJGNsYXNzWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICAkY2xhc3MgPSBzdWJzdHIoJGNsYXNzLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmYWxzZSAhPT0gJHBvcyA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTmFtZXNwYWNlZCBjbGFzcyBuYW1lCi0gICAgICAgICAgICAkbmFtZXNwYWNlID0gc3Vic3RyKCRjbGFzcywgMCwgJHBvcyk7Ci0KLSAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gbm9ybWFsIG5hbWVzcGFjZXMKLSAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5uYW1lc3BhY2VzIGFzICRucyA9PiAkZGlycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCi0gICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSBzdWJzdHIoJGNsYXNzLCAkcG9zICsgMSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lLicucGhwJzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEl0ZXJhdGUgaW4gVGhyaWZ0IG5hbWVzcGFjZXMKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IHBhcnQgb2YgbmFtZXNwYWNlCi0gICAgICAgICAgICAkbSA9IGV4cGxvZGUoJ1xcJywgJGNsYXNzKTsKLQotICAgICAgICAgICAgLy8gSWdub3JlIHdyb25nIGNhbGwKLSAgICAgICAgICAgIGlmKGNvdW50KCRtKSA8PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgJGNsYXNzID0gYXJyYXlfcG9wKCRtKTsKLSAgICAgICAgICAgICRuYW1lc3BhY2UgPSBpbXBsb2RlKCdcXCcsICRtKTsKLQotICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmRlZmluaXRpb25zIGFzICRucyA9PiAkZGlycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCi0gICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBBdmFpbGFibGUgaW4gc2VydmljZTogSW50ZXJmYWNlLCBDbGllbnQsIFByb2Nlc3NvciwgUmVzdAotICAgICAgICAgICAgICAgICAgICAgKiBBbmQgZXZlcnkgc2VydmljZSBtZXRob2RzIChfLispCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZigKLSAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispKGlmfGNsaWVudHxwcm9jZXNzb3J8cmVzdCkkI2knLCAkY2xhc3MsICRuKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispX1thLXowLTldK18oYXJnc3xyZXN1bHQpJCNpJywgJGNsYXNzLCAkbikKLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJ1R5cGVzJzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAkblsxXTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpci5ESVJFQ1RPUllfU0VQQVJBVE9SIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDQ2ZTYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci0KLWNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gewotICBzdGF0aWMgJF9UU1BFQyA9Ci0gICAgYXJyYXkoMSA9PiBhcnJheSgndmFyJyA9PiAnbWVzc2FnZScsCi0gICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OlNUUklORyksCi0gICAgICAgICAgMiA9PiBhcnJheSgndmFyJyA9PiAnY29kZScsCi0gICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OkkzMikpOwotCi0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBVTktOT1dOX01FVEhPRCA9IDE7Ci0gIGNvbnN0IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKLSAgY29uc3QgV1JPTkdfTUVUSE9EX05BTUUgPSAzOwotICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OwotICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7Ci0gIGNvbnN0IElOVEVSTkFMX0VSUk9SID0gNjsKLSAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OwotCi0gIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtZXNzYWdlPW51bGwsICRjb2RlPTApIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KSB7Ci0gICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRtZXNzYWdlKTsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgaWYgKCRjb2RlID0gJHRoaXMtPmdldENvZGUoKSkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCd0eXBlJywgVFR5cGU6OkkzMiwgMik7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkY29kZSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZThjZDI4Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcQmFzZVxUQmFzZTsKLQotLyoqCi0gKiBOT1RFKG1jc2xlZSk6IFRoaXMgY3VycmVudGx5IGNvbnRhaW5zIGEgdG9uIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIFRCYXNlCi0gKiBiZWNhdXNlIHdlIG5lZWQgdG8gc2F2ZSBDUFUgY3ljbGVzIGFuZCB0aGlzIGlzIG5vdCB5ZXQgaW4gYW4gZXh0ZW5zaW9uLgotICogSWRlYWxseSB3ZSdkIG11bHRpcGx5LWluaGVyaXQgVEV4Y2VwdGlvbiBmcm9tIGJvdGggRXhjZXB0aW9uIGFuZCBCYXNlLCBidXQKLSAqIHRoYXQncyBub3QgcG9zc2libGUgaW4gUEhQIGFuZCB0aGVyZSBhcmUgbm8gbW9kdWxlcyBlaXRoZXIsIHNvIGZvciBub3cgd2UKLSAqIGFwb2xvZ2V0aWNhbGx5IHRha2UgYSB0cmlwIHRvIEhhY2tUb3duLgotICoKLSAqIENhbiBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBFeGNlcHRpb24gY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUpIG9yIHdpdGgKLSAqIFRocmlmdCBCYXNlIG9iamVjdCBjb25zdHJ1Y3RvciAoc3BlYywgdmFscykuCi0gKgotICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCi0gKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCi0gKi8KLWNsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uIHsKLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxPW51bGwsICRwMj0wKSB7Ci0gICAgaWYgKGlzX2FycmF5KCRwMSkgJiYgaXNfYXJyYXkoJHAyKSkgewotICAgICAgJHNwZWMgPSAkcDE7Ci0gICAgICAkdmFscyA9ICRwMjsKLSAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7Ci0gICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwMSwgJHAyKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgJHRtZXRob2QgPSBhcnJheShUVHlwZTo6Qk9PTCAgID0+ICdCb29sJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkJZVEUgICA9PiAnQnl0ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMTYgICAgPT4gJ0kxNicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJMzIgICAgPT4gJ0kzMicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpJNjQgICAgPT4gJ0k2NCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycpOwotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107Ci0gICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107Ci0gICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7Ci0gICAgICAka3JlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKLSAgICB9Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgewotICAgICAgJHZyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskdnR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOwotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEJlZ2luKCRfa3R5cGUsICRfdnR5cGUsICRzaXplKTsKLSAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgKyskaSkgewotICAgICAgJGtleSA9ICR2YWwgPSBudWxsOwotICAgICAgaWYgKCRrcmVhZCAhPT0gbnVsbCkgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRrcmVhZCgka2V5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAka3NwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJGtleSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJGtleSwgJGtzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICgkdnJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJGNsYXNzID0gJHZzcGVjWydjbGFzcyddOwotICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJHZhbC0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHZhbCwgJHZzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAkdmFyWyRrZXldID0gJHZhbDsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwRW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRldHlwZV0pKSB7Ci0gICAgICAkZXJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgICR2YXIgPSBhcnJheSgpOwotICAgICRfZXR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEJlZ2luKCRfZXR5cGUsICRzaXplKTsKLSAgICB9Ci0gICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKLSAgICAgICRlbGVtID0gbnVsbDsKLSAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZXJlYWQoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRlc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAkZWxlbSA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRlbGVtLCAkZXNwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRlbGVtLCAkZXNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoJHNldCkgewotICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFyIFtdPSAkZWxlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEVuZCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGZuYW1lID0gbnVsbDsKLSAgICAkZnR5cGUgPSAwOwotICAgICRmaWQgPSAwOwotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKLSAgICAgICAgJGZzcGVjID0gJHNwZWNbJGZpZF07Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7Ci0gICAgICAgICAgJHhmZXIgPSAwOwotICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKLSAgICAgICAgICAgICRmdW5jID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICB9Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZU1hcCgkdmFyLCAkc3BlYywgJG91dHB1dCkgewotICAgICR4ZmVyID0gMDsKLSAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKLSAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKLSAgICAka3dyaXRlID0gJHZ3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgewotICAgICAgJGt3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKLSAgICB9Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgewotICAgICAgJHZ3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBCZWdpbigka3R5cGUsICR2dHlwZSwgY291bnQoJHZhcikpOwotICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICBpZiAoaXNzZXQoJGt3cml0ZSkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JGt3cml0ZSgka2V5KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAka2V5LT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRrZXksICRrc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGtleSwgJGtzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiR2d3JpdGUoJHZhbCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKCR2dHlwZSkgewotICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR2YWwsICR2c3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdmFsLCAkdnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107Ci0gICAgJGV3cml0ZSA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGV3cml0ZSA9ICd3cml0ZScuVEJhc2U6OiR0bWV0aG9kWyRldHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEJlZ2luKCRldHlwZSwgY291bnQoJHZhcikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgICRlbGVtID0gJHNldCA/ICRrZXkgOiAkdmFsOwotICAgICAgaWYgKGlzc2V0KCRld3JpdGUpKSB7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRld3JpdGUoJGVsZW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRlbGVtLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkZWxlbSwgJGVzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7Ci0gICAgfQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7Ci0gICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKLSAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7Ci0gICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJHZhciwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICRmdW5jID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKLSAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+JHZhci0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgICAgfQotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhOGQ5ZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci0KLS8qKgotICogUHJvdG9jb2wgbW9kdWxlLiBDb250YWlucyBhbGwgdGhlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50Ci0gKiBhIHByb3RvY29sIGVuY29kZXIvZGVjb2Rlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi0vKioKLSAqIFByb3RvY29sIGV4Y2VwdGlvbnMKLSAqLwotY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbiB7Ci0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOwotICBjb25zdCBORUdBVElWRV9TSVpFID0gMjsKLSAgY29uc3QgU0laRV9MSU1JVCA9IDM7Ci0gIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKLQotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2N2ViOS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIFRyYW5zcG9ydCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIHsKLQotICBjb25zdCBVTktOT1dOID0gMDsKLSAgY29uc3QgTk9UX09QRU4gPSAxOwotICBjb25zdCBBTFJFQURZX09QRU4gPSAyOwotICBjb25zdCBUSU1FRF9PVVQgPSAzOwotICBjb25zdCBFTkRfT0ZfRklMRSA9IDQ7Ci0KLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGE1NjcuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUUHJvdG9jb2xGYWN0b3J5OwotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Ci0KLS8qKgotICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkgewotICBwcml2YXRlICRzdHJpY3RSZWFkXyA9IGZhbHNlOwotICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmljdFJlYWQ9ZmFsc2UsICRzdHJpY3RXcml0ZT1mYWxzZSkgewotICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOwotICAgICR0aGlzLT5zdHJpY3RXcml0ZV8gPSAkc3RyaWN0V3JpdGU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdG9jb2woJHRyYW5zKSB7Ci0gICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zLCAkdGhpcy0+c3RyaWN0UmVhZF8sICR0aGlzLT5zdHJpY3RXcml0ZV8pOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjk3MmFhLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7Ci0KLS8qKgotICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeSB7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykgewotICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2U0MzkxLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Ci0KLS8qKgotICogSlNPTiBQcm90b2NvbCBGYWN0b3J5Ci0gKi8KLWNsYXNzIFRKU09OUHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQotewotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjMyMmViLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi0vKioKLSAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwotICovCi1pbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeSB7Ci0gIC8qKgotICAgKiBCdWlsZCBhIHByb3RvY29sIGZyb20gdGhlIGJhc2UgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucyk7Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjMzY0OS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxTdHJpbmdGdW5jXE1ic3RyaW5nOwotdXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Ci0KLWNsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgJF9pbnN0YW5jZTsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgU2luZ2xldG9uIGluc3RhbmNlIG9mIFRTdHJpbmdGdW5jIGltcGxlbWVudGF0aW9uIHRoYXQgaXMKLSAgICAgKiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgc3lzdGVtJ3MgbWJzdHJpbmcuZnVuY19vdmVybG9hZCBzZXR0aW5ncy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpIHsKLSAgICAgICAgaWYoIXNlbGY6OiRfaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQotICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogU2VlOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCi0gICAgICAgICAqLwotICAgICAgICBpZihpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7Ci0gICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IE1ic3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIG1ic3RyaW5nIGlzIG5vdCBpbnN0YWxsZWQgb3IgZG9lcyBub3QgaGF2ZSBmdW5jdGlvbiBvdmVybG9hZGluZwotICAgICAgICAgKiBvZiB0aGUgc3RyKiBmdW5jdGlvbnMgZW5hYmxlZCBzbyB1c2UgUEhQIGNvcmUgc3RyKiBmdW5jdGlvbnMgZm9yCi0gICAgICAgICAqIGJ5dGUgY291bnRpbmcuCi0gICAgICAgICAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgQ29yZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhZTEyMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRUcmFuc3BvcnQ7Ci0KLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5IHsKLSAgLyoqCi0gICAqIEBzdGF0aWMKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VHJhbnNwb3J0KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCkgewotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmU1MDQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxKU09OOwotCi1jbGFzcyBCYXNlQ29udGV4dAotewotICAgIGZ1bmN0aW9uIGVzY2FwZU51bSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZnVuY3Rpb24gd3JpdGUoKQotICAgIHsKLSAgICB9Ci0KLSAgICBmdW5jdGlvbiByZWFkKCkKLSAgICB7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiNzViMS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXEpTT047Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxCYXNlQ29udGV4dDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKLQotY2xhc3MgTGlzdENvbnRleHQgZXh0ZW5kcyBCYXNlQ29udGV4dAotewotICAgIHByaXZhdGUgJGZpcnN0XyA9IHRydWU7Ci0gICAgcHJpdmF0ZSAkcF87Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApIHsKLSAgICAgICAgJHRoaXMtPnBfID0gJHA7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkgewotICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgewotICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoVEpTT05Qcm90b2NvbDo6Q09NTUEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKSB7Ci0gICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7Ci0gICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkdGhpcy0+cF8tPnJlYWRKU09OU3ludGF4Q2hhcihUSlNPTlByb3RvY29sOjpDT01NQSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGI1ZmMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKLQotY2xhc3MgTG9va2FoZWFkUmVhZGVyCi17Ci0gICAgcHJpdmF0ZSAkaGFzRGF0YV8gPSBmYWxzZTsKLSAgICBwcml2YXRlICRkYXRhXyA9IGFycmF5KCk7Ci0gICAgcHJpdmF0ZSAkcF87Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCi0gICAgewotICAgICAgICAkdGhpcy0+cF8gPSAkcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgpIHsKLSAgICAgICAgaWYgKCR0aGlzLT5oYXNEYXRhXykgewotICAgICAgICAgICAgJHRoaXMtPmhhc0RhdGFfID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkdGhpcy0+ZGF0YV8gPSAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT5yZWFkQWxsKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1YnN0cigkdGhpcy0+ZGF0YV8sIDAsIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBwZWVrKCkgewotICAgICAgICBpZiAoISR0aGlzLT5oYXNEYXRhXykgewotICAgICAgICAgICAgJHRoaXMtPmRhdGFfID0gJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+cmVhZEFsbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT5oYXNEYXRhXyA9IHRydWU7Ci0gICAgICAgIHJldHVybiBzdWJzdHIoJHRoaXMtPmRhdGFfLCAwLCAxKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzg3ZGQzLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcSlNPTjsKLQotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXEJhc2VDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwotCi1jbGFzcyBQYWlyQ29udGV4dCBleHRlbmRzIEJhc2VDb250ZXh0IHsKLSAgICBwcml2YXRlICRmaXJzdF8gPSB0cnVlOwotICAgIHByaXZhdGUgJGNvbG9uXyA9IHRydWU7Ci0gICAgcHJpdmF0ZSAkcF8gPSBudWxsOwotCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKSB7Ci0gICAgICAgICR0aGlzLT5wXyA9ICRwOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpIHsKLSAgICAgICAgaWYgKCR0aGlzLT5maXJzdF8pIHsKLSAgICAgICAgICAgICR0aGlzLT5maXJzdF8gPSBmYWxzZTsKLSAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgJHRoaXMtPnBfLT5nZXRUcmFuc3BvcnQoKS0+d3JpdGUoJHRoaXMtPmNvbG9uXyA/IFRKU09OUHJvdG9jb2w6OkNPTE9OIDogVEpTT05Qcm90b2NvbDo6Q09NTUEpOwotICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9ICEkdGhpcy0+Y29sb25fOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoKSB7Ci0gICAgICAgIGlmICgkdGhpcy0+Zmlyc3RfKSB7Ci0gICAgICAgICAgICAkdGhpcy0+Zmlyc3RfID0gZmFsc2U7Ci0gICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICR0aGlzLT5wXy0+cmVhZEpTT05TeW50YXhDaGFyKCR0aGlzLT5jb2xvbl8gPyBUSlNPTlByb3RvY29sOjpDT0xPTiA6IFRKU09OUHJvdG9jb2w6OkNPTU1BKTsKLSAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSAhJHRoaXMtPmNvbG9uXzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBlc2NhcGVOdW0oKSB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29sb25fOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZkZGFjLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbCB7Ci0KLSAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKLSAgY29uc3QgVkVSU0lPTl8xID0gMHg4MDAxMDAwMDsKLQotICBwcm90ZWN0ZWQgJHN0cmljdFJlYWRfID0gZmFsc2U7Ci0gIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zLCAkc3RyaWN0UmVhZD1mYWxzZSwgJHN0cmljdFdyaXRlPXRydWUpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gICAgJHRoaXMtPnN0cmljdFJlYWRfID0gJHN0cmljdFJlYWQ7Ci0gICAgJHRoaXMtPnN0cmljdFdyaXRlXyA9ICRzdHJpY3RXcml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkgewotICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7Ci0gICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOwotICAgICAgcmV0dXJuCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkdmVyc2lvbikgKwotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdHlwZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGZpZWxkVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWVsZElkKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZShUVHlwZTo6U1RPUCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRrZXlUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCi0gICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUgPyAxIDogMCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAyKTsKLSAgICByZXR1cm4gMjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ04nLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpIHsKLSAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7Ci0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKLSAgICAgICRsbyA9IChpbnQpJHZhbHVlOwotCi0gICAgICBpZiAoJG5lZykgewotICAgICAgICAkaGkgPSB+JGhpOwotICAgICAgICAkbG8gPSB+JGxvOwotICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7Ci0gICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOwotICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgOCk7Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKLSAgICByZXR1cm4gODsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkdmFsdWUpIHsKLSAgICAkbGVuID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR2YWx1ZSk7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKLSAgICBpZiAoJHN6IDwgMCkgewotICAgICAgJHZlcnNpb24gPSAoaW50KSAoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKLSAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KSBzZWxmOjpWRVJTSU9OXzEpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHZlcnNpb24gaWRlbnRpZmllcjogJy4kc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOwotICAgICAgfQotICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOwotICAgICAgJHJlc3VsdCArPQotICAgICAgICAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSkgKwotICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoJHRoaXMtPnN0cmljdFJlYWRfKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEhhbmRsZSBwcmUtdmVyc2lvbmVkIGlucHV0Ci0gICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOwotICAgICAgICAkcmVzdWx0ICs9Ci0gICAgICAgICAgJHN6ICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHR5cGUpICsKLSAgICAgICAgICAkdGhpcy0+cmVhZEkzMigkc2VxaWQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgJG5hbWUgPSAnJzsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEJ5dGUoJGZpZWxkVHlwZSk7Ci0gICAgaWYgKCRmaWVsZFR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZElkID0gMDsKLSAgICAgIHJldHVybiAkcmVzdWx0OwotICAgIH0KLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDIpOwotICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICBpZiAoJHZhbHVlID4gMHg3ZmZmKSB7Ci0gICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZik7Ci0gICAgfQotICAgIHJldHVybiAyOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKLSAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgfQotICAgIHJldHVybiA0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKLQotICAgICRhcnIgPSB1bnBhY2soJ04yJywgJGRhdGEpOwotCi0gICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCi0gICAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgewotCi0gICAgICAkaGkgPSAkYXJyWzFdOwotICAgICAgJGxvID0gJGFyclsyXTsKLSAgICAgICRpc05lZyA9ICRoaSAgPCAwOwotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRpc05lZykgewotICAgICAgICAkaGkgPSB+JGhpICYgKGludCkweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOwotCi0gICAgICAgIGlmICgkbG8gPT0gKGludCkweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgotICAgICAgLy8gZXhwbGljaXRseSBiZWxvdwotCi0gICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRoaSArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICBpZiAoJGxvICYgKGludCkweDgwMDAwMDAwKSB7Ci0gICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR2YWx1ZSA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZEkzMigkbGVuKTsKLSAgICBpZiAoJGxlbikgewotICAgICAgJHZhbHVlID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgJHZhbHVlID0gJyc7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmFhMjEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OwotCi0vKioKLSAqIEFjY2VsZXJhdGVkIGJpbmFyeSBwcm90b2NvbDogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB0aHJpZnRfcHJvdG9jb2wKLSAqIGV4dGVuc2lvbiBmb3IgZmFzdGVyIGRlc2VyaWFsaXphdGlvbgotICovCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBleHRlbmRzIFRCaW5hcnlQcm90b2NvbCB7Ci0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9dHJ1ZSkgewotICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCi0gICAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0ICh3aGljaCBkb2VzKQotICAgIGlmICghbWV0aG9kX2V4aXN0cygkdHJhbnMsICdwdXRCYWNrJykpIHsKLSAgICAgICR0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHRyYW5zKTsKLSAgICB9Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkLCAkc3RyaWN0V3JpdGUpOwotICB9Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFJlYWQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5zdHJpY3RSZWFkXzsKLSAgfQotICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RXcml0ZSgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnN0cmljdFdyaXRlXzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzN2E1OS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NjkgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2w7Ci11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIENvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wgewotCi0gIGNvbnN0IENPTVBBQ1RfU1RPUCA9IDB4MDA7Ci0gIGNvbnN0IENPTVBBQ1RfVFJVRSA9IDB4MDE7Ci0gIGNvbnN0IENPTVBBQ1RfRkFMU0UgPSAweDAyOwotICBjb25zdCBDT01QQUNUX0JZVEUgPSAweDAzOwotICBjb25zdCBDT01QQUNUX0kxNiA9IDB4MDQ7Ci0gIGNvbnN0IENPTVBBQ1RfSTMyID0gMHgwNTsKLSAgY29uc3QgQ09NUEFDVF9JNjQgPSAweDA2OwotICBjb25zdCBDT01QQUNUX0RPVUJMRSA9IDB4MDc7Ci0gIGNvbnN0IENPTVBBQ1RfQklOQVJZID0gMHgwODsKLSAgY29uc3QgQ09NUEFDVF9MSVNUID0gMHgwOTsKLSAgY29uc3QgQ09NUEFDVF9TRVQgPSAweDBBOwotICBjb25zdCBDT01QQUNUX01BUCA9IDB4MEI7Ci0gIGNvbnN0IENPTVBBQ1RfU1RSVUNUID0gMHgwQzsKLQotICBjb25zdCBTVEFURV9DTEVBUiA9IDA7Ci0gIGNvbnN0IFNUQVRFX0ZJRUxEX1dSSVRFID0gMTsKLSAgY29uc3QgU1RBVEVfVkFMVUVfV1JJVEUgPSAyOwotICBjb25zdCBTVEFURV9DT05UQUlORVJfV1JJVEUgPSAzOwotICBjb25zdCBTVEFURV9CT09MX1dSSVRFID0gNDsKLSAgY29uc3QgU1RBVEVfRklFTERfUkVBRCA9IDU7Ci0gIGNvbnN0IFNUQVRFX0NPTlRBSU5FUl9SRUFEID0gNjsKLSAgY29uc3QgU1RBVEVfVkFMVUVfUkVBRCA9IDc7Ci0gIGNvbnN0IFNUQVRFX0JPT0xfUkVBRCA9IDg7Ci0KLSAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHgxZjsKLSAgY29uc3QgVkVSU0lPTiA9IDE7Ci0gIGNvbnN0IFBST1RPQ09MX0lEID0gMHg4MjsKLSAgY29uc3QgVFlQRV9NQVNLID0gMHhlMDsKLSAgY29uc3QgVFlQRV9TSElGVF9BTU9VTlQgPSA1OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgJGN0eXBlcyA9IGFycmF5KAotICAgIFRUeXBlOjpTVE9QID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RPUCwKLSAgICBUVHlwZTo6Qk9PTCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KLSAgICBUVHlwZTo6QllURSA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JZVEUsCi0gICAgVFR5cGU6OkkxNiA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kxNiwKLSAgICBUVHlwZTo6STMyID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTMyLAotICAgIFRUeXBlOjpJNjQgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQsCi0gICAgVFR5cGU6OkRPVUJMRSA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0RPVUJMRSwKLSAgICBUVHlwZTo6U1RSSU5HID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQklOQVJZLAotICAgIFRUeXBlOjpTVFJVQ1QgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QsCi0gICAgVFR5cGU6OkxTVCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0xJU1QsCi0gICAgVFR5cGU6OlNFVCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NFVCwKLSAgICBUVHlwZTo6TUFQID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQLAotICApOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgJHR0eXBlcyA9IGFycmF5KAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RPUCA9PiBUVHlwZTo6U1RPUCAsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFID0+IFRUeXBlOjpCT09MLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSA9PiBUVHlwZTo6Qk9PTCwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JZVEUgPT4gVFR5cGU6OkJZVEUsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYgPT4gVFR5cGU6OkkxNiwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kzMiA9PiBUVHlwZTo6STMyLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0ID0+IFRUeXBlOjpJNjQsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUgPT4gVFR5cGU6OkRPVUJMRSwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0JJTkFSWSA9PiBUVHlwZTo6U1RSSU5HLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNUID0+IFRUeXBlOjpTVFJVQ1QsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNUID0+IFRUeXBlOjpMU1QsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TRVQgPT4gVFR5cGU6OlNFVCwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCA9PiBUVHlwZTo6TUFQLAotICApOwotCi0gIHByb3RlY3RlZCAkc3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKLSAgcHJvdGVjdGVkICRsYXN0RmlkID0gMDsKLSAgcHJvdGVjdGVkICRib29sRmlkID0gbnVsbDsKLSAgcHJvdGVjdGVkICRib29sVmFsdWUgPSBudWxsOwotICBwcm90ZWN0ZWQgJHN0cnVjdHMgPSBhcnJheSgpOwotICBwcm90ZWN0ZWQgJGNvbnRhaW5lcnMgPSBhcnJheSgpOwotCi0gIC8vIFNvbWUgdmFyaW50IC8gemlnemFnIGhlbHBlciBtZXRob2RzCi0gIHB1YmxpYyBmdW5jdGlvbiB0b1ppZ1phZygkbiwgJGJpdHMpIHsKLSAgICByZXR1cm4gKCRuIDw8IDEpIF4gKCRuID4+ICgkYml0cyAtIDEpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmcm9tWmlnWmFnKCRuKSB7Ci0gICAgcmV0dXJuICgkbiA+PiAxKSBeIC0oJG4gJiAxKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpbnQoJGRhdGEpIHsKLSAgICAkb3V0ID0gIiI7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGlmICgoJGRhdGEgJiB+MHg3ZikgPT09IDApIHsKLSAgICAgICAgJG91dCAuPSBjaHIoJGRhdGEpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICRvdXQgLj0gY2hyKCgkZGF0YSAmIDB4ZmYpIHwgMHg4MCk7Ci0gICAgICAgICRkYXRhID0gJGRhdGEgPj4gNzsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICRvdXQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVWYXJpbnQoJGRhdGEpIHsKLSAgICAkb3V0ID0gJHRoaXMtPmdldFZhcmludCgkZGF0YSk7Ci0gICAgJHJlc3VsdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmVzdWx0KTsKLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkVmFyaW50KCYkcmVzdWx0KSB7Ci0gICAgJGlkeCA9IDA7Ci0gICAgJHNoaWZ0ID0gMDsKLSAgICAkcmVzdWx0ID0gMDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKLSAgICAgICRieXRlID0gJGFyclsxXTsKLSAgICAgICRpZHggKz0gMTsKLSAgICAgICRyZXN1bHQgfD0gKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0OwotICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgewotICAgICAgICByZXR1cm4gJGlkeDsKLSAgICAgIH0KLSAgICAgICRzaGlmdCArPSA3OwotICAgIH0KLQotICAgIHJldHVybiAkaWR4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkgewotICAgICR3cml0dGVuID0KLSAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSArCi0gICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgkdHlwZSA8PCBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkpICsKLSAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2VxaWQpICsKLSAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSk7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7Ci0gICAgcmV0dXJuICR3cml0dGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKSB7Ci0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOwotICAgICR0aGlzLT5sYXN0RmlkID0gMDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpIHsKLSAgICAkb2xkX3ZhbHVlcyA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7Ci0gICAgJHRoaXMtPnN0YXRlID0gJG9sZF92YWx1ZXNbMF07Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkb2xkX3ZhbHVlc1sxXTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgwKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkSGVhZGVyKCR0eXBlLCAkZmlkKSB7Ci0gICAgJHdyaXR0ZW4gPSAwOwotICAgICRkZWx0YSA9ICRmaWQgLSAkdGhpcy0+bGFzdEZpZDsKLSAgICBpZiAoMCA8ICRkZWx0YSAmJiAkZGVsdGEgPD0gMTUpIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoKCRkZWx0YSA8PCA0KSB8ICR0eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVCeXRlKCR0eXBlKSArCi0gICAgICAgICR0aGlzLT53cml0ZUkxNigkZmlkKTsKLSAgICB9Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkZmlkOwotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkX25hbWUsICRmaWVsZF90eXBlLCAkZmllbGRfaWQpIHsKLSAgICBpZiAoJGZpZWxkX3R5cGUgPT0gVFRZUEU6OkJPT0wpIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEU7Ci0gICAgICAkdGhpcy0+Ym9vbEZpZCA9ICRmaWVsZF9pZDsKLSAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKLSAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcihzZWxmOjokY3R5cGVzWyRmaWVsZF90eXBlXSwgJGZpZWxkX2lkKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25CZWdpbigkZXR5cGUsICRzaXplKSB7Ci0gICAgJHdyaXR0ZW4gPSAwOwotICAgIGlmICgkc2l6ZSA8PSAxNCkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgkc2l6ZSA8PCA0IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoMHhmMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNpemUpOwotICAgIH0KLSAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9XUklURTsKLQotICAgIHJldHVybiAkd3JpdHRlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlfdHlwZSwgJHZhbF90eXBlLCAkc2l6ZSkgewotICAgICR3cml0dGVuID0gMDsKLSAgICBpZiAoJHNpemUgPT0gMCkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVCeXRlKDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSkgKwotICAgICAgICAkdGhpcy0+d3JpdGVVQnl0ZShzZWxmOjokY3R5cGVzWyRrZXlfdHlwZV0gPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJHZhbF90eXBlXSk7Ci0gICAgfQotICAgICR0aGlzLT5jb250YWluZXJzW10gPSAkdGhpcy0+c3RhdGU7Ci0gICAgcmV0dXJuICR3cml0dGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkVuZCgpIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKSB7Ci0gICAgaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFKSB7Ci0gICAgICAkY3R5cGUgPSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFOwotICAgICAgaWYgKCR2YWx1ZSkgewotICAgICAgICAkY3R5cGUgPSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoJGN0eXBlLCAkdGhpcy0+Ym9vbEZpZCk7Ci0gICAgfSBlbHNlIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgkdmFsdWUgPyAxIDogMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVVQnl0ZSgkYnl0ZSkgewotICAgICR0aGlzLT50cmFuc18tPndyaXRlKHBhY2soJ0MnLCAkYnl0ZSksIDEpOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkgewotICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDE2KTsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKSB7Ci0gICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMzIpOwotICAgIHJldHVybiAkdGhpcy0+d3JpdGVWYXJpbnQoJHRoaW5nKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHBhY2soJ2QnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKHN0cnJldigkZGF0YSksIDgpOwotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCR2YWx1ZSkgewotICAgICRsZW4gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHZhbHVlKTsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlVmFyaW50KCRsZW4pOwotICAgIGlmICgkbGVuKSB7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdmFsdWUsICRsZW4pOwotICAgIH0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkX3R5cGUsICYkZmllbGRfaWQpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkZmllbGRfdHlwZSk7Ci0KLSAgICBpZiAoKCRmaWVsZF90eXBlICYgMHgwZikgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICRmaWVsZF9pZCA9IDA7Ci0gICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0gICAgJGRlbHRhID0gJGZpZWxkX3R5cGUgPj4gNDsKLSAgICBpZiAoJGRlbHRhID09IDApIHsKLSAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkX2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgJGZpZWxkX2lkID0gJHRoaXMtPmxhc3RGaWQgKyAkZGVsdGE7Ci0gICAgfQotICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZWxkX2lkOwotICAgICRmaWVsZF90eXBlID0gJHRoaXMtPmdldFRUeXBlKCRmaWVsZF90eXBlICYgMHgwZik7Ci0gICAgaWYgKCRmaWVsZF90eXBlID09IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSkgewotICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOwotICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmICgkZmllbGRfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7Ci0gICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1JFQUQ7Ci0gICAgfQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9SRUFEOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRVQnl0ZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJHZhbHVlKSB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkWmlnWmFnKCYkdmFsdWUpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRWYXJpbnQoJHZhbHVlKTsKLSAgICAkdmFsdWUgPSAkdGhpcy0+ZnJvbVppZ1phZygkdmFsdWUpOwotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpIHsKLSAgICAkcHJvdG9JZCA9IDA7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHByb3RvSWQpOwotICAgIGlmICgkcHJvdG9JZCAhPSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRCkgewotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHByb3RvY29sIGlkIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKLSAgICB9Ci0gICAgJHZlclR5cGUgPSAwOwotICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdmVyVHlwZSk7Ci0gICAgJHR5cGUgPSAoJHZlclR5cGUgJiBUQ29tcGFjdFByb3RvY29sOjpUWVBFX01BU0spID4+Ci0gICAgICBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVDsKLSAgICAkdmVyc2lvbiA9ICR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLOwotICAgIGlmICgkdmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpbiBUQ29tcGFjdCBtZXNzYWdlJyk7Ci0gICAgfQotICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNlcUlkKTsKLSAgICAkbmFtZSArPSAkdGhpcy0+cmVhZFN0cmluZygkbmFtZSk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgJG5hbWUgPSAnJzsgLy8gdW51c2VkCi0gICAgJHRoaXMtPnN0cnVjdHNbXSA9IGFycmF5KCR0aGlzLT5zdGF0ZSwgJHRoaXMtPmxhc3RGaWQpOwotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAwOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKSB7Ci0gICAgJGxhc3QgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOwotICAgICR0aGlzLT5zdGF0ZSA9ICRsYXN0WzBdOwotICAgICR0aGlzLT5sYXN0RmlkID0gJGxhc3RbMV07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb25CZWdpbigmJHR5cGUsICYkc2l6ZSkgewotICAgICRzaXplVHlwZSA9IDA7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHNpemVUeXBlKTsKLSAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OwotICAgICR0eXBlID0gJHRoaXMtPmdldFRUeXBlKCRzaXplVHlwZSk7Ci0gICAgaWYgKCRzaXplID09IDE1KSB7Ci0gICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKLSAgICB9Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleV90eXBlLCAmJHZhbF90eXBlLCAmJHNpemUpIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOwotICAgICR0eXBlcyA9IDA7Ci0gICAgaWYgKCRzaXplID4gMCkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7Ci0gICAgfQotICAgICR2YWxfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMpOwotICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uRW5kKCkgewotICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1fdHlwZSwgJiRzaXplKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5yZWFkQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpIHsKLSAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfUkVBRCkgewotICAgICAgJHZhbHVlID0gJHRoaXMtPmJvb2xWYWx1ZTsKLSAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpIHsKLSAgICAkZGF0YSA9IHN0cnJldigkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpKTsKLSAgICAkYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKSB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRsZW4pOwotICAgIGlmICgkbGVuKSB7Ci0gICAgICAkdmFsdWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdmFsdWUgPSAnJzsKLSAgICB9Ci0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRUeXBlKCRieXRlKSB7Ci0gICAgcmV0dXJuIHNlbGY6OiR0dHlwZXNbJGJ5dGUgJiAweDBmXTsKLSAgfQotCi0gIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCi0gIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgLy8gYXMgc2lnbmVkIGFuZCBhbnkgaW50IG92ZXIgMl4zMSAtIDEgYXMgYSBmbG9hdAotCi0gIC8vIFJlYWQgYW5kIHdyaXRlIEk2NCBhcyB0d28gMzIgYml0IG51bWJlcnMgJGhpIGFuZCAkbG8KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKSB7Ci0gICAgLy8gUmVhZCB2YXJpbnQgZnJvbSB3aXJlCi0gICAgJGhpID0gMDsKLSAgICAkbG8gPSAwOwotCi0gICAgJGlkeCA9IDA7Ci0gICAgJHNoaWZ0ID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAkeCA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgICAkYXJyID0gdW5wYWNrKCdDJywgJHgpOwotICAgICAgJGJ5dGUgPSAkYXJyWzFdOwotICAgICAgJGlkeCArPSAxOwotICAgICAgaWYgKCRzaGlmdCA8IDMyKSB7Ci0gICAgICAgICRsbyB8PSAoKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0KSAmCi0gICAgICAgICAgMHgwMDAwMDAwMGZmZmZmZmZmOwotICAgICAgfQotICAgICAgLy8gU2hpZnQgaGkgYW5kIGxvIHRvZ2V0aGVyLgotICAgICAgaWYgKCRzaGlmdCA+PSAzMikgewotICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICgkc2hpZnQgLSAzMikpOwotICAgICAgfSBlbHNlIGlmICgkc2hpZnQgPiAyNSkgewotICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpID4+ICgkc2hpZnQgLSAyNSkpOwotICAgICAgfQotICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgICRzaGlmdCArPSA3OwotICAgIH0KLQotICAgIC8vIE5vdywgdW56aWcgaXQuCi0gICAgJHhvcmVyID0gMDsKLSAgICBpZiAoJGxvICYgMSkgewotICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gICAgJGxvID0gKCRsbyA+PiAxKSAmIDB4N2ZmZmZmZmY7Ci0gICAgJGxvID0gJGxvIHwgKCgkaGkgJiAxKSA8PCAzMSk7Ci0gICAgJGhpID0gKCRoaSA+PiAxKSBeICR4b3JlcjsKLSAgICAkbG8gPSAkbG8gXiAkeG9yZXI7Ci0KLSAgICAvLyBOb3cgcHV0ICRoaSBhbmQgJGxvIGJhY2sgdG9nZXRoZXIKLSAgICBpZiAodHJ1ZSkgewotICAgICAgJGlzTmVnID0gJGhpICA8IDA7Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICRoaSA9IH4kaGkgJiAoaW50KTB4ZmZmZmZmZmY7Ci0gICAgICAgICRsbyA9IH4kbG8gJiAoaW50KTB4ZmZmZmZmZmY7Ci0KLSAgICAgICAgaWYgKCRsbyA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgICAkbG8gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsbysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZvcmNlIDMyYml0IHdvcmRzIGluIGV4Y2VzcyBvZiAyRyB0byBiZSBwb3NpdGl2ZSAtIHdlIGRlYWwgd2l0aCBzaWduCi0gICAgICAvLyBleHBsaWNpdGx5IGJlbG93Ci0KLSAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKLSAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKLSAgICAgICAgJGhpICs9IDB4ODAwMDAwMDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgkbG8gJiAoaW50KTB4ODAwMDAwMDApIHsKLSAgICAgICAgJGxvICY9IChpbnQpMHg3ZmZmZmZmZjsKLSAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7Ci0gICAgICB9Ci0KLSAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87Ci0KLSAgICAgIGlmICgkaXNOZWcpIHsKLSAgICAgICAgJHZhbHVlID0gMCAtICR2YWx1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBVcGNhc3QgbmVnYXRpdmVzIGluIExTQiBiaXQKLSAgICAgIGlmICgkYXJyWzJdICYgMHg4MDAwMDAwMCkgewotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gJiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzFdID0gJGFyclsxXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKLSAgICAgICAgJHZhbHVlID0gMCAtICRhcnJbMV0gKiA0Mjk0OTY3Mjk2IC0gJGFyclsyXSAtIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAkdmFsdWUgPSAkYXJyWzFdICogNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRpZHg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKSB7Ci0gICAgLy8gSWYgd2UgYXJlIGluIGFuIEkzMiByYW5nZSwgdXNlIHRoZSBlYXN5IG1ldGhvZCBiZWxvdy4KLSAgICBpZiAoKCR2YWx1ZSA+IDQyOTQ5NjcyOTYpIHx8ICgkdmFsdWUgPCAtNDI5NDk2NzI5NikpIHsKLSAgICAgIC8vIENvbnZlcnQgJHZhbHVlIHRvICRoaSBhbmQgJGxvCi0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSR2YWx1ZSA+PiAzMjsKLSAgICAgICRsbyA9IChpbnQpJHZhbHVlICYgMHhmZmZmZmZmZjsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaTsKLSAgICAgICAgJGxvID0gfiRsbzsKLSAgICAgICAgaWYgKCgkbG8gJiAoaW50KTB4ZmZmZmZmZmYpID09IChpbnQpMHhmZmZmZmZmZikgewotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gTm93IGRvIHRoZSB6aWdnaW5nIGFuZCB6YWdnaW5nLgotICAgICAgJHhvcmVyID0gMDsKLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICR4b3JlciA9IDB4ZmZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICAkbG93Yml0ID0gKCRsbyA+PiAzMSkgJiAxOwotICAgICAgJGhpID0gKCRoaSA8PCAxKSB8ICRsb3diaXQ7Ci0gICAgICAkbG8gPSAoJGxvIDw8IDEpOwotICAgICAgJGxvID0gKCRsbyBeICR4b3JlcikgJiAweGZmZmZmZmZmOwotICAgICAgJGhpID0gKCRoaSBeICR4b3JlcikgJiAweGZmZmZmZmZmOwotCi0gICAgICAvLyBub3cgd3JpdGUgb3V0IHRoZSB2YXJpbnQsIGVuc3VyaW5nIHdlIHNoaWZ0IGJvdGggaGkgYW5kIGxvCi0gICAgICAkb3V0ID0gIiI7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAoKCRsbyAmIH4weDdmKSA9PT0gMCAmJgotICAgICAgICAgICAkaGkgPT09IDApIHsKLSAgICAgICAgICAkb3V0IC49IGNocigkbG8pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRvdXQgLj0gY2hyKCgkbG8gJiAweGZmKSB8IDB4ODApOwotICAgICAgICAgICRsbyA9ICRsbyA+PiA3OwotICAgICAgICAgICRsbyA9ICRsbyB8ICgkaGkgPDwgMjUpOwotICAgICAgICAgICRoaSA9ICRoaSA+PiA3OwotICAgICAgICAgIC8vIFJpZ2h0IHNoaWZ0IGNhcnJpZXMgc2lnbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8uCi0gICAgICAgICAgJGhpID0gJGhpICYgKDEyNyA8PCAyNSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkb3V0KTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXQpOwotCi0gICAgICByZXR1cm4gJHJldDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZVZhcmludCgkdGhpcy0+dG9aaWdaYWcoJHZhbHVlLCA2NCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDM5NTgzLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDY5NCArMCwwIEBACi08P3BocAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2w7Ci0KLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXEJhc2VDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExvb2thaGVhZFJlYWRlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxQYWlyQ29udGV4dDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMaXN0Q29udGV4dDsKLQotLyoqCi0gKiBKU09OIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBwcm90b2NvbCwgcG9ydGVkIGZyb20gSmF2YS4KLSAqLwotY2xhc3MgVEpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAotewotICAgIGNvbnN0IENPTU1BID0gJywnOwotICAgIGNvbnN0IENPTE9OID0gJzonOwotICAgIGNvbnN0IExCUkFDRSA9ICd7JzsKLSAgICBjb25zdCBSQlJBQ0UgPSAnfSc7Ci0gICAgY29uc3QgTEJSQUNLRVQgPSAnWyc7Ci0gICAgY29uc3QgUkJSQUNLRVQgPSAnXSc7Ci0gICAgY29uc3QgUVVPVEUgPSAnIic7Ci0gICAgY29uc3QgQkFDS1NMQVNIID0gJ1xcJzsKLSAgICBjb25zdCBaRVJPID0gJzAnOwotICAgIGNvbnN0IEVTQ1NFUSA9ICdcXCc7Ci0gICAgY29uc3QgRE9VQkxFRVNDID0gJ19fRE9VQkxFX0VTQ0FQRV9TRVFVRU5DRV9fJzsKLQotICAgIGNvbnN0IFZFUlNJT04gPSAxOwotCi0gICAgcHVibGljIHN0YXRpYyAkSlNPTl9DSEFSX1RBQkxFID0gYXJyYXkoCi0gICAgICAgIC8qICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGICovCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICdiJywgJ3QnLCAnbicsIDAsICdmJywgJ3InLCAwLCAwLCAvLyAwCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDEKLSAgICAgICAgMSwgMSwgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAyCi0gICAgKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSUyA9IGFycmF5KCciJywgJ1xcJywgImIiLCAiZiIsICJuIiwgInIiLCAidCIpOwotCi0gICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJfVkFMUyA9IGFycmF5KAotICAgICAgICAnIicsICdcXCcsICJceDA4IiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKLSAgICApOwotCi0gICAgY29uc3QgTkFNRV9CT09MID0gInRmIjsKLSAgICBjb25zdCBOQU1FX0JZVEUgPSAiaTgiOwotICAgIGNvbnN0IE5BTUVfSTE2ID0gImkxNiI7Ci0gICAgY29uc3QgTkFNRV9JMzIgPSAiaTMyIjsKLSAgICBjb25zdCBOQU1FX0k2NCA9ICJpNjQiOwotICAgIGNvbnN0IE5BTUVfRE9VQkxFID0gImRibCI7Ci0gICAgY29uc3QgTkFNRV9TVFJVQ1QgPSAicmVjIjsKLSAgICBjb25zdCBOQU1FX1NUUklORyA9ICJzdHIiOwotICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7Ci0gICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7Ci0gICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKLQotICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoJHR5cGVJRCkKLSAgICB7Ci0gICAgICAgIHN3aXRjaCAoJHR5cGVJRCkgewotICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CT09MOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CWVRFOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kxNjsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMzI7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTY0OwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0RPVUJMRTsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJJTkc7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSVUNUOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX01BUDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TRVQ7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTElTVDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlSURGb3JUeXBlTmFtZSgkbmFtZSkKLSAgICB7Ci0gICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RPUDsKLQotICAgICAgICBpZiAoc3RybGVuKCRuYW1lKSA+IDEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAwLCAxKSkgewotICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkRPVUJMRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAxLCAxKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCWVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkzMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzYnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STY0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkxTVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TUFQOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJVQ1Q7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAndCcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSSU5HOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN1YnN0cigkbmFtZSwgMSwgMSkgPT0gJ2UnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNFVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCT09MOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoJHJlc3VsdCA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljICRjb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKLSAgICBwdWJsaWMgJGNvbnRleHRfOwotICAgIHB1YmxpYyAkcmVhZGVyXzsKLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcHVzaENvbnRleHQoJGMpIHsKLSAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29udGV4dFN0YWNrXywgJHRoaXMtPmNvbnRleHRfKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3BDb250ZXh0KCkgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRleHRTdGFja18pOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpIHsKLSAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOwotICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBuZXcgQmFzZUNvbnRleHQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRlcl8gPSBuZXcgTG9va2FoZWFkUmVhZGVyKCR0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7Ci0gICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSAkdG1wYnVmXyA9IGFycmF5KDQpOwotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRKU09OU3ludGF4Q2hhcigkYikgewotICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOwotCi0gICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSAhPSAkYikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4VmFsKCRzKSB7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkcyk7ICRpKyspIHsKLSAgICAgICAgICAgICRjaCA9IHN1YnN0cigkcywgJGksIDEpOwotCi0gICAgICAgICAgICBpZiAoISgkY2ggPj0gImEiICYmICRjaCA8PSAiZiIpICYmICEoJGNoID49ICIwIiAmJiAkY2ggPD0gIjkiKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkV4cGVjdGVkIGhleCBjaGFyYWN0ZXIgIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGhleGRlYygkcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhDaGFyKCR2YWwpIHsKLSAgICAgICAgcmV0dXJuIGRlY2hleCgkdmFsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTlN0cmluZygkYikgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0KLSAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKCRiKSk7Ci0KLSAgICAgICAgaWYgKGlzX251bWVyaWMoJGIpICYmICR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OSW50ZWdlcigkbnVtKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG51bSk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgkbnVtKSk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQmFzZTY0KCRkYXRhKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZShiYXNlNjRfZW5jb2RlKCRkYXRhKSkpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RTdGFydCgpIHsKLSAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7Ci0gICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RFbmQoKSB7Ci0gICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5U3RhcnQoKSB7Ci0gICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7Ci0gICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05BcnJheUVuZCgpIHsKLSAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTlN0cmluZygkc2tpcENvbnRleHQpIHsKLSAgICAgIGlmICghJHNraXBDb250ZXh0KSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotICAgICAgfQotCi0gICAgICAkanNvblN0cmluZyA9ICcnOwotICAgICAgJGxhc3RDaGFyID0gTlVMTDsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0gICAgICAgICRqc29uU3RyaW5nIC49ICRjaDsKLSAgICAgICAgaWYgKCRjaCA9PSBzZWxmOjpRVU9URSAmJgotICAgICAgICAgICRsYXN0Q2hhciAhPT0gTlVMTCAmJgotICAgICAgICAgICAgJGxhc3RDaGFyICE9PSBzZWxmOjpFU0NTRVEpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoJGNoID09IHNlbGY6OkVTQ1NFUSAmJiAkbGFzdENoYXIgPT0gc2VsZjo6RVNDU0VRKSB7Ci0gICAgICAgICAgJGxhc3RDaGFyID0gc2VsZjo6RE9VQkxFRVNDOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsYXN0Q2hhciA9ICRjaDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGpzb25fZGVjb2RlKCRqc29uU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIGlzSlNPTk51bWVyaWMoJGIpIHsKLSAgICAgICAgc3dpdGNoICgkYikgewotICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgIGNhc2UgJzInOgotICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05OdW1lcmljQ2hhcnMoKSB7Ci0gICAgICAgICRzdHJibGQgPSBhcnJheSgpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOwotCi0gICAgICAgICAgICBpZiAoISR0aGlzLT5pc0pTT05OdW1lcmljKCRjaCkpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgJHN0cmJsZFtdID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpbXBsb2RlKCIiLCAkc3RyYmxkKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OSW50ZWdlcigpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHN0ciA9ICR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNfbnVtZXJpYygkc3RyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBkYXRhIGluIG51bWVyaWM6ICIgLiAkc3RyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW50dmFsKCRzdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElkZW50aWNhbCB0byByZWFkSlNPTkludGVnZXIgYnV0IHdpdGhvdXQgdGhlIGZpbmFsIGNhc3QuCi0gICAgICogTmVlZGVkIGZvciBwcm9wZXIgaGFuZGxpbmcgb2YgaTY0IG9uIDMyIGJpdCBtYWNoaW5lcy4gIFdoeSBhCi0gICAgICogc2VwYXJhdGUgZnVuY3Rpb24/ICBTbyB3ZSBkb24ndCBoYXZlIHRvIGZvcmNlIHRoZSByZXN0IG9mIHRoZQotICAgICAqIHVzZSBjYXNlcyB0aHJvdWdoIHRoZSBleHRyYSBjb25kaXRpb25hbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCkgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkc3RyOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05Eb3VibGUoKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotCi0gICAgICAgIGlmIChzdWJzdHIoJHRoaXMtPnJlYWRlcl8tPnBlZWsoKSwgMCwgMSkgPT0gc2VsZjo6UVVPVEUpIHsKLSAgICAgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0KLSAgICAgICAgICAgIGlmICgkYXJyID09ICJOYU4iKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5BTjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoJGFyciA9PSAiSW5maW5pdHkiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElORjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoISR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCAiIC4gJGFyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkYXJyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQmFzZTY0KCkgewotICAgICAgICAkYXJyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgJGRhdGEgPSBiYXNlNjRfZGVjb2RlKCRhcnIsIHRydWUpOwotCi0gICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgYmFzZTY0IGRhdGEgIiAuICRhcnIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkZGF0YTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0U3RhcnQoKSB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OkxCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0RW5kKCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5U3RhcnQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5RW5kKCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDS0VUKTsKLSAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJhbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoc2VsZjo6VkVSU0lPTik7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJG5hbWUpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkdHlwZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzZXFpZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgU3RydWN0IG5hbWUKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgYSBzdHJ1Y3QuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICAgKiBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkZmllbGRJZCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZmllbGRUeXBlKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpzb25PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgka2V5VHlwZSkpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkdmFsVHlwZSkpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RTdGFydCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdEVuZCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGVsZW1UeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJvb2wgPyAxIDogMCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkYnl0ZSkgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkzMik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRzdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlYWRzIHRoZSBtZXNzYWdlIGhlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIGludCAkdHlwZSBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyZW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgIT0gc2VsZjo6VkVSU0lPTikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24iLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgICRuYW1lID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgJHR5cGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgICRzZXFpZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKSB7Ci0gICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5wZWVrKCk7Ci0gICAgICAgICRuYW1lID0gIiI7Ci0KLSAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpID09IHNlbGY6OlJCUkFDRSkgewotICAgICAgICAgICAgJGZpZWxkVHlwZSA9IFRUeXBlOjpTVE9QOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgJGZpZWxkSWQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RTdGFydCgpOwotICAgICAgICAgICAgJGZpZWxkVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRrZXlUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkdmFsVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKSB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOwotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpIHsKLSAgICAgICAgJGJvb2wgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkgewotICAgICAgICAkYnl0ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpIHsKLSAgICAgICAgJGkxNiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpIHsKLSAgICAgICAgJGkzMiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpIHsKLSAgICAgICAgaWYgKCBQSFBfSU5UX1NJWkUgPT09IDQgKSB7Ci0gICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKSB7Ci0gICAgICAgICRkdWIgPSAkdGhpcy0+cmVhZEpTT05Eb3VibGUoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpIHsKLSAgICAgICAgJHN0ciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmZmNDAuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgotICovCi1hYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wgewotICAvLyBUaGUgYmVsb3cgbWF5IHNlZW0gc2lsbHksIGJ1dCBpdCBpcyB0byBnZXQgYXJvdW5kIHRoZSBwcm9ibGVtIHRoYXQgdGhlCi0gIC8vICJpbnN0YW5jZW9mIiBvcGVyYXRvciBjYW4gb25seSB0YWtlIGluIGEgVF9WQVJJQUJMRSBhbmQgbm90IGEgVF9TVFJJTkcKLSAgLy8gb3IgVF9DT05TVEFOVF9FTkNBUFNFRF9TVFJJTkcuIFVzaW5nICJpc19hKCkiIGluc3RlYWQgb2YgImluc3RhbmNlb2YiIGlzCi0gIC8vIGEgd29ya2Fyb3VuZCBidXQgaXMgZGVwcmVjYXRlZCBpbiBQSFA1LiBUaGlzIGlzIHVzZWQgaW4gdGhlIGdlbmVyYXRlZAotICAvLyBkZXNlcmlhbGl6YXRpb24gY29kZS4KLSAgc3RhdGljICRUQklOQVJZUFJPVE9DT0xBQ0NFTEVSQVRFRCA9ICdUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCc7Ci0KLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc187Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKSB7Ci0gICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKLSAgfQotCi0gIC8qKgotICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zXzsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOwotCi0gIC8qKgotICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICoKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIC8qCi0gICAqIFN0YXJ0cyBhIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKLSAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRNYXBFbmQoKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFNldEVuZCgpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7Ci0KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpOwotCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKLQotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7Ci0KLSAgLyoqCi0gICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKLSAgICogY2F1c2luZyBjb3JydXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2tpcCgkdHlwZSkgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJ5dGUoJGJ5dGUpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkxNigkaTE2KTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMzIoJGkzMik7Ci0gICAgY2FzZSBUVHlwZTo6STY0OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTY0KCRpNjQpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZERvdWJsZSgkZHViKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRTdHJpbmcoJHN0cik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RydWN0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgka2V5VHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+c2tpcCgkdmFsVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICB7Ci0gICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU2V0RW5kKCk7Ci0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOwotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignVW5rbm93biBmaWVsZCB0eXBlOiAnLiR0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFV0aWxpdHkgZm9yIHNraXBwaW5nIGJpbmFyeSBkYXRhCi0gICAqCi0gICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKLSAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgICBGaWVsZCB0eXBlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpIHsKLSAgICBzd2l0Y2ggKCR0eXBlKSB7Ci0gICAgY2FzZSBUVHlwZTo6Qk9PTDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICBjYXNlIFRUeXBlOjpJMTY6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICBjYXNlIFRUeXBlOjpJNjQ6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpET1VCTEU6Ci0gICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7Ci0gICAgICAkbGVuID0gJGxlblsxXTsKLSAgICAgIGlmICgkbGVuID4gMHg3ZmZmZmZmZikgewotICAgICAgICAkbGVuID0gMCAtICgoJGxlbiAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAkZnR5cGUgPSAwOwotICAgICAgICAgICRmaWQgPSAwOwotICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAgICRmdHlwZSA9ICRhcnJbMV07Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEkxNiBmaWVsZCBpZAotICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICB7Ci0gICAgICAgIC8vIEt0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJGt0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDY7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDU7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ1Vua25vd24gZmllbGQgdHlwZTogJy4kdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdjYzNlLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICogQGF1dGhvcjogcm1hcmluIChtYXJpbi5yYWR1QGZhY2Vib29rLmNvbSkKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcmlhbGl6ZXI7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwotdXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZwotICogYSB0aHJpZnQgb2JqZWN0IHVzaW5nIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLgotICovCi1jbGFzcyBUQmluYXJ5U2VyaWFsaXplciB7Ci0KLSAgLy8gTk9URShybWFyaW4pOiBCZWNhdXNlIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkKLSAgLy8gYWRkcyBhIGJlZ2luIG1lc3NhZ2UgcHJlZml4LCB5b3UgY2Fubm90IHNwZWNpZnkKLSAgLy8gYSB0cmFuc3BvcnQgaW4gd2hpY2ggdG8gc2VyaWFsaXplIGFuIG9iamVjdC4gSXQgaGFzIHRvCi0gIC8vIGJlIGEgc3RyaW5nLiBPdGhlcndpc2Ugd2Ugd2lsbCBicmVhayB0aGUgY29tcGF0aWJpbGl0eSB3aXRoCi0gIC8vIG5vcm1hbCBkZXNlcmlhbGl6YXRpb24uCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VyaWFsaXplKCRvYmplY3QpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoJHRyYW5zcG9ydCk7Ci0gICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7Ci0gICAgICB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCRwcm90b2NvbCwgJG9iamVjdC0+Z2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJFUExZLCAkb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAkcHJvdG9jb2wtPmlzU3RyaWN0V3JpdGUoKSk7Ci0KLSAgICAgICRwcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbigkdW51c2VkX25hbWUsICR1bnVzZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdW51c2VkX3NlcWlkKTsKLSAgICB9IGVsc2UgewotICAgICAgJG9iamVjdC0+d3JpdGUoJHByb3RvY29sKTsKLSAgICB9Ci0gICAgJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKLSAgICByZXR1cm4gJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSkgewotICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKSkgewotICAgICAgICRwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4oJycsIFRNZXNzYWdlVHlwZTo6UkVQTFksIDApOwotICAgICAgICR0cmFuc3BvcnQtPndyaXRlKCRzdHJpbmdfb2JqZWN0KTsKLSAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCRwcm90b2NvbCwgJGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvdG9jb2wtPmlzU3RyaWN0UmVhZCgpKTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAkdHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgJG9iamVjdCA9IG5ldyAkY2xhc3NfbmFtZSgpOwotICAgICAgICRvYmplY3QtPnJlYWQoJHByb3RvY29sKTsKLSAgICAgICByZXR1cm4gJG9iamVjdDsKLSAgICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNhMzA1Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/cGhwCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XFNlcnZlclxUU2VydmVyOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotCi0vKioKLSAqIEEgZm9ya2luZyBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBURm9ya2luZ1NlcnZlciBleHRlbmRzIFRTZXJ2ZXIgewotICAvKioKLSAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogTGlzdCBvZiBjaGlsZHJlbi4KLSAgICoKLSAgICogQHZhciBhcnJheQotICAgKi8KLSAgcHJvdGVjdGVkICRjaGlsZHJlbl8gPSBhcnJheSgpOwotCi0gIC8qKgotICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAotICAgKiB0cmFuc3BvcnQuIFdlIGZvcmsgd2hlbiBhIG5ldyBjb25uZWN0aW9uCi0gICAqIGFycml2ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7Ci0gICAgICB0cnkgewotICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOwotCi0gICAgICAgICAgaWYgKCRwaWQgPiAwKSB7Ci0gICAgICAgICAgICAkdGhpcy0+aGFuZGxlUGFyZW50KCR0cmFuc3BvcnQsICRwaWQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgkcGlkID09PSAwKSB7Ci0gICAgICAgICAgICAkdGhpcy0+aGFuZGxlQ2hpbGQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ0ZhaWxlZCB0byBmb3JrJyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0KLSAgICAgICR0aGlzLT5jb2xsZWN0Q2hpbGRyZW4oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29kZSBydW4gYnkgdGhlIHBhcmVudAotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEBwYXJhbSBpbnQgJHBpZAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUGFyZW50KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCwgJHBpZCkgewotICAgICR0aGlzLT5jaGlsZHJlbl9bJHBpZF0gPSAkdHJhbnNwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvZGUgcnVuIGJ5IHRoZSBjaGlsZC4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KSB7Ci0gICAgdHJ5IHsKLSAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgfQotICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7IH0KLQotICAgIGV4aXQoMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgYW55IGNoaWxkcmVuIHdlIG1heSBoYXZlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBjb2xsZWN0Q2hpbGRyZW4oKSB7Ci0gICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuXyBhcyAkcGlkID0+ICR0cmFuc3BvcnQpIHsKLSAgICAgIGlmIChwY250bF93YWl0cGlkKCRwaWQsICRzdGF0dXMsIFdOT0hBTkcpID4gMCkgewotICAgICAgICB1bnNldCgkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdKTsKLSAgICAgICAgaWYgKCR0cmFuc3BvcnQpIEAkdHJhbnNwb3J0LT5jbG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0M2JmNGIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxTZXJ2ZXJcVFNlcnZlclRyYW5zcG9ydDsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUVHJhbnNwb3J0RmFjdG9yeTsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUUHJvdG9jb2xGYWN0b3J5OwotCi0vKioKLSAqIEdlbmVyaWMgY2xhc3MgZm9yIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFRTZXJ2ZXIgewotCi0gIC8qKgotICAgKiBQcm9jZXNzb3IgdG8gaGFuZGxlIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEB2YXIgVFByb2Nlc3NvcgotICAgKi8KLSAgcHJvdGVjdGVkICRwcm9jZXNzb3JfOwotCi0gIC8qKgotICAgKiBTZXJ2ZXIgdHJhbnNwb3J0IHRvIGJlIHVzZWQgZm9yIGxpc3RlbmluZwotICAgKiBhbmQgYWNjZXB0aW5nIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEB2YXIgVFNlcnZlclRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc3BvcnRfOwotCi0gIC8qKgotICAgKiBJbnB1dCB0cmFuc3BvcnQgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCB0cmFuc3BvcnQgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqLwotICBwcm90ZWN0ZWQgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBJbnB1dCBwcm90b2NvbCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRpbnB1dFByb3RvY29sRmFjdG9yeV87Ci0KLSAgLyoqCi0gICAqIE91dHB1dCBwcm90b2NvbCBmYWN0b3J5Ci0gICAqCi0gICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBTZXRzIHVwIGFsbCB0aGUgZmFjdG9yaWVzLCBldGMKLSAgICoKLSAgICogQHBhcmFtIG9iamVjdCAkcHJvY2Vzc29yCi0gICAqIEBwYXJhbSBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQKLSAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRpbnB1dFRyYW5zcG9ydEZhY3RvcnkKLSAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqIEBwYXJhbSBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeQotICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0ICR0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeSkgewotICAgICR0aGlzLT5wcm9jZXNzb3JfID0gJHByb2Nlc3NvcjsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5XyA9ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8gPSAkaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8gPSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICB9Ci0KLSAgLyoqCi0gICAqIFNlcnZlcyB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4KLSAgICogdW5sZXNzIGEgcHJvYmxlbSBwZXJtaXRzIGl0IHRvIGRvIHNvIG9yIGl0Ci0gICAqIGlzIGludGVycnVwdGVkIGludGVudGlvbmFsbHkKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCk7Ci0KLSAgLyoqCi0gICAqIFN0b3BzIHRoZSBzZXJ2ZXIgc2VydmluZwotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTZmYjkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyU29ja2V0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/cGhwCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XFNlcnZlclxUU2VydmVyVHJhbnNwb3J0OwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFNvY2tldDsKLQotLyoqCi0gKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIEhhbmRsZSBmb3IgdGhlIGxpc3RlbmVyIHNvY2tldAotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcml2YXRlICRsaXN0ZW5lcl87Ci0KLSAgLyoqCi0gICAqIFBvcnQgZm9yIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaW1lb3V0IHdoZW4gbGlzdGVuaW5nIGZvciBhIG5ldyBjbGllbnQKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJGFjY2VwdFRpbWVvdXRfID0gMzAwMDA7Ci0KLSAgLyoqCi0gICAqIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRob3N0XzsKLQotICAvKioKLSAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGFjY2VwdFRpbWVvdXQKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWNjZXB0VGltZW91dCgkYWNjZXB0VGltZW91dCkgewotICAgICR0aGlzLT5hY2NlcHRUaW1lb3V0XyA9ICRhY2NlcHRUaW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpIHsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKLSAgICoKLSAgICogQHJldHVybiBUU29ja2V0Ci0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpIHsKLSAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7Ci0gICAgaWYoISRoYW5kbGUpIHJldHVybiBudWxsOwotCi0gICAgJHNvY2tldCA9IG5ldyBUU29ja2V0KCk7Ci0gICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOwotCi0gICAgcmV0dXJuICRzb2NrZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI0NzEyLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmljIGNsYXNzIGZvciBTZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0IHsKLSAgLyoqCi0gICAqIExpc3QgZm9yIG5ldyBjbGllbnRzCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHNlcnZlcgotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKTsKLQotICAvKioKLSAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgdG8gaW1wbGVtZW50Ci0gICAqIGFjY2VwdC4KLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGZ1bmN0aW9uIGFjY2VwdEltcGwoKTsKLQotICAvKioKLSAgICogVXNlcyB0aGUgYWNjZXB0IGltcGxlbXRhdGlvbi4gSWYgbnVsbCBpcyByZXR1cm5lZCwgYW4KLSAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpIHsKLSAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPmFjY2VwdEltcGwoKTsKLQotICAgIGlmICgkdHJhbnNwb3J0ID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7Ci0gICAgfQotCi0gICAgcmV0dXJuICR0cmFuc3BvcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBlNDhmLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxTZXJ2ZXJcVFNlcnZlcjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlciB7Ci0gIC8qKgotICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRzdG9wXyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAotICAgKiB0cmFuc3BvcnQuIEl0IGhhbmRsZXMgVFRyYW5zcG9ydEV4Y2VwdGlvbnMKLSAgICogdG8gYXZvaWQgdGltZW91dHMgZXRjIGtpbGxpbmcgaXQKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOwotCi0gICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7Ci0KLSAgICAgICAgaWYgKCR0cmFuc3BvcnQgIT0gbnVsbCkgewotICAgICAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgJG91dHB1dFRyYW5zcG9ydCA9ICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOwotICAgICAgICAgICRpbnB1dFByb3RvY29sID0gJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgd2hpbGUgKCR0aGlzLT5wcm9jZXNzb3JfLT5wcm9jZXNzKCRpbnB1dFByb3RvY29sLCAkb3V0cHV0UHJvdG9jb2wpKSB7IH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvQ29yZS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4YTViMi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7Ci0KLXVzZSBUaHJpZnRcU3RyaW5nRnVuY1xUU3RyaW5nRnVuYzsKLQotY2xhc3MgQ29yZSBpbXBsZW1lbnRzIFRTdHJpbmdGdW5jIHsKLSAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpIHsKLSAgICAgICAgLy8gc3BlY2lmeWluZyBhIG51bGwgJGxlbmd0aCB3b3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCi0gICAgICAgIGlmKCRsZW5ndGggPT09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHN0ciwgJHN0YXJ0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKSB7Ci0gICAgICAgIHJldHVybiBzdHJsZW4oJHN0cik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL01ic3RyaW5nLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhY2UxMy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxTdHJpbmdGdW5jOwotCi11c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcVFN0cmluZ0Z1bmM7Ci0KLWNsYXNzIE1ic3RyaW5nIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMgewotICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkgewotICAgICAgICAvKioKLSAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgc2Vjb25kCi0gICAgICAgICAqIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgdGhlIGZpcnN0IG9wdGlvbmFsIHBhcmFtZXRlciBjYW4ndAotICAgICAgICAgKiBiZSBudWxsIG9yIGZhbHNlIGFzIGEgIm1hZ2ljIiB2YWx1ZSBiZWNhdXNlIHRoYXQgd291bGQKLSAgICAgICAgICogY2F1c2UgYW4gZW1wdHkgc3RyaW5nIHRvIGJlIHJldHVybmVkLCBzbyB3ZSBuZWVkIHRvCi0gICAgICAgICAqIGFjdHVhbGx5IGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGxlbmd0aCB2YWx1ZS4KLSAgICAgICAgICovCi0gICAgICAgIGlmKCRsZW5ndGggPT09IG51bGwpIHsKLSAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+c3RybGVuKCRzdHIpIC0gJHN0YXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1iX3N1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGgsICc4Yml0Jyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKSB7Ci0gICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWJiMzkwLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFN0cmluZ0Z1bmM7Ci0KLWludGVyZmFjZSBUU3RyaW5nRnVuYyB7Ci0gICAgcHVibGljIGZ1bmN0aW9uIHN1YnN0cigkc3RyLCAkc3RhcnQsICRsZW5ndGggPSBudWxsKTsKLSAgICBwdWJsaWMgZnVuY3Rpb24gc3RybGVuKCRzdHIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzYWQ5OC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKLSAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQotICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgYnVmZmVyZWQgdHJhbnNwb3J0IGFyb3VuZCBhbiB1bmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJCdWZTaXplPTUxMiwgJHdCdWZTaXplPTUxMikgewotICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKLSAgICAkdGhpcy0+ckJ1ZlNpemVfID0gJHJCdWZTaXplOwotICAgICR0aGlzLT53QnVmU2l6ZV8gPSAkd0J1ZlNpemU7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc3BvcnRfID0gbnVsbDsKLQotICAvKioKLSAgICogVGhlIHJlY2VpdmUgYnVmZmVyIHNpemUKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkckJ1ZlNpemVfID0gNTEyOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyIHNpemUKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkd0J1ZlNpemVfID0gNTEyOwotCi0gIC8qKgotICAgKiBUaGUgd3JpdGUgYnVmZmVyLgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICR3QnVmXyA9ICcnOwotCi0gIC8qKgotICAgKiBUaGUgcmVhZCBidWZmZXIuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJCdWZfID0gJyc7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKSB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIHJlYXNvbiB0aGF0IHdlIGN1c3RvbWl6ZSByZWFkQWxsIGhlcmUgaXMgdGhhdCB0aGUgbWFqb3JpdHkgb2YgUEhQCi0gICAqIHN0cmVhbXMgYXJlIGFscmVhZHkgaW50ZXJuYWxseSBidWZmZXJlZCBieSBQSFAuIFRoZSBzb2NrZXQgc3RyZWFtLCBmb3IKLSAgICogZXhhbXBsZSwgYnVmZmVycyBpbnRlcm5hbGx5IGFuZCBibG9ja3MgaWYgeW91IGNhbGwgcmVhZCB3aXRoICRsZW4gZ3JlYXRlcgotICAgKiB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUsIHVubGlrZSByZWN2KCkgaW4gQy4KLSAgICoKLSAgICogVGhlcmVmb3JlLCB1c2UgdGhlIHJlYWRBbGwgbWV0aG9kIG9mIHRoZSB3cmFwcGVkIHRyYW5zcG9ydCBpbnNpZGUKLSAgICogdGhlIGJ1ZmZlcmVkIHJlYWRBbGwuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKSB7Ci0gICAgJGhhdmUgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKTsKLSAgICBpZiAoJGhhdmUgPT0gMCkgewotICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgaWYgKCRoYXZlIDwgJGxlbikgewotICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKLSAgICAgICRkYXRhIC49ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4gLSAkaGF2ZSk7Ci0gICAgfSBlbHNlIGlmICgkaGF2ZSA9PSAkbGVuKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgIH0gZWxzZSBpZiAoJGhhdmUgPiAkbGVuKSB7Ci0gICAgICAkZGF0YSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOwotICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgfQotICAgIHJldHVybiAkZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCR0aGlzLT5yQnVmU2l6ZV8pOwotICAgIH0KLQotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgcmV0dXJuICRyZXQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+PSAkdGhpcy0+d0J1ZlNpemVfKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOwotCi0gICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCi0gICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQotICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICAgJHRoaXMtPndCdWZfID0gJyc7Ci0gICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA+IDApIHsKLSAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkdGhpcy0+d0J1Zl8pOwotICAgICAgJHRoaXMtPndCdWZfID0gJyc7Ci0gICAgfQotICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBkNTQ4Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBGcmFtZWQgdHJhbnNwb3J0LiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgaW4gY2h1bmtzIHRoYXQgYXJlIHN0YW1wZWQgd2l0aAotICogdGhlaXIgbGVuZ3RoLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEZyYW1lZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCi0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJpdmF0ZSAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRyQnVmXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJHdCdWZfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmVhZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkd3JpdGVfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJlYWQ9dHJ1ZSwgJHdyaXRlPXRydWUpIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7Ci0gICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQotICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICBpZiAoISR0aGlzLT5yZWFkXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCRsZW4pOwotICAgIH0KLQotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOwotICAgIH0KLQotICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgotICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKLSAgICAgIHJldHVybiAkb3V0OwotICAgIH0KLQotICAgIC8vIFJldHVybiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIKLSAgICAkb3V0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0gICAgcmV0dXJuICRvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogUHV0IHByZXZpb3VzbHkgcmVhZCBkYXRhIGJhY2sgaW50byB0aGUgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgZGF0YSB0byByZXR1cm4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKSB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkZGF0YTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSBjaHVuayBvZiBkYXRhIGludG8gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkRnJhbWUoKSB7Ci0gICAgJGJ1ZiA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKDQpOwotICAgICR2YWwgPSB1bnBhY2soJ04nLCAkYnVmKTsKLSAgICAkc3ogPSAkdmFsWzFdOwotCi0gICAgJHRoaXMtPnJCdWZfID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJHN6KTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIHRvIHRoZSBwZW5kaW5nIG91dHB1dCBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YQotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gTGltaXQgb2YgYnl0ZXMgdG8gd3JpdGUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmLCAkbGVuPW51bGwpIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8pIHsKLSAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJGJ1ZiwgJGxlbik7Ci0gICAgfQotCi0gICAgaWYgKCRsZW4gIT09IG51bGwgJiYgJGxlbiA8IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSkgewotICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAwLCAkbGVuKTsKLSAgICB9Ci0gICAgJHRoaXMtPndCdWZfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm1hdCBvZiBhIDQtYnl0ZSBsZW5ndGgKLSAgICogZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBkYXRhLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIGlmICghJHRoaXMtPndyaXRlXyB8fCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7Ci0gICAgfQotCi0gICAgJG91dCA9IHBhY2soJ04nLCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSk7Ci0gICAgJG91dCAuPSAkdGhpcy0+d0J1Zl87Ci0KLSAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCi0gICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCi0gICAgJHRoaXMtPndCdWZfID0gJyc7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZjI4NzEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bwotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XzsKLQotICAvKioKLSAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XzsKLQotICAvKioKLSAgICogVGhlIFVSSSB0byByZXF1ZXN0Ci0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHVyaV87Ci0KLSAgLyoqCi0gICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcwotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRzY2hlbWVfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRidWZfOwotCi0gIC8qKgotICAgKiBJbnB1dCBzb2NrZXQgc3RyZWFtLgotICAgKgotICAgKiBAdmFyIHJlc291cmNlCi0gICAqLwotICBwcm90ZWN0ZWQgJGhhbmRsZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKSB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7fQotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICgkdGhpcy0+aGFuZGxlXykgewotICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgotICAgKgotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gSG93IG11Y2ggdG8gcmVhZAotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7Ci0gICAgaWYgKCRkYXRhID09PSBGQUxTRSB8fCAkZGF0YSA9PT0gJycpIHsKLSAgICAgICRtZCA9IHN0cmVhbV9nZXRfbWV0YV9kYXRhKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgIGlmICgkbWRbJ3RpbWVkX291dCddKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUSHR0cENsaWVudDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLiR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfLiR0aGlzLT51cmlfLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICR0aGlzLT5idWZfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgotICAgICRob3N0ID0gJHRoaXMtPmhvc3RfLigkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicuJHRoaXMtPnBvcnRfIDogJycpOwotCi0gICAgJGhlYWRlcnMgPSBhcnJheSgnSG9zdDogJy4kaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICdBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdVc2VyLUFnZW50OiBQSFAvVEh0dHBDbGllbnQnLAotICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQnLAotICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAnLlRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXykpOwotCi0gICAgJG9wdGlvbnMgPSBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCi0gICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOwotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICAkb3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOwotICAgIH0KLSAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgnaHR0cCcgPT4gJG9wdGlvbnMpKTsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigkdGhpcy0+c2NoZW1lXy4nOi8vJy4kaG9zdC4kdGhpcy0+dXJpXywgJ3InLCBmYWxzZSwgJGNvbnRleHRpZCk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGhvc3QuJHRoaXMtPnVyaV87Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMWZhYjYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KLSAqIGluLW1lbW9yeSBzdHJpbmcgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkKLSAqIHBsYWNlZCBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0Ci0gKiBidWZmZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUTWVtb3J5QnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBPcHRpb25hbGx5IHBhc3MgYW4gaW5pdGlhbCB2YWx1ZQotICAgKiBmb3IgdGhlIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYnVmID0gJycpIHsKLSAgICAkdGhpcy0+YnVmXyA9ICRidWY7Ci0gIH0KLQotICBwcm90ZWN0ZWQgJGJ1Zl8gPSAnJzsKLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpIHsKLSAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikgewotICAgICRidWZMZW5ndGggPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOwotCi0gICAgaWYgKCRidWZMZW5ndGggPT09IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLiAnIGJ5dGVzIGZyb20gYnVmZmVyLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKLSAgICB9Ci0KLSAgICBpZiAoJGJ1Zkxlbmd0aCA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87Ci0gICAgICAkdGhpcy0+YnVmXyA9ICcnOwotICAgICAgcmV0dXJuICRyZXQ7Ci0gICAgfQotCi0gICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPmJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sICRsZW4pOwotCi0gICAgcmV0dXJuICRyZXQ7Ci0gIH0KLQotICBmdW5jdGlvbiBnZXRCdWZmZXIoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5idWZfOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpIHsKLSAgICByZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmMTBlZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogVHJhbnNwb3J0IHRoYXQgb25seSBhY2NlcHRzIHdyaXRlcyBhbmQgaWdub3JlcyB0aGVtLgotICogVGhpcyBpcyB1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHN0cnVjdHVyZXMuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUTnVsbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQgewotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkge30KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBUTnVsbFRyYW5zcG9ydC4iKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKSB7fQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxZDBjZi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIFBocCBzdHJlYW0gdHJhbnNwb3J0LiBSZWFkcyB0byBhbmQgd3JpdGVzIGZyb20gdGhlIHBocCBzdGFuZGFyZCBzdHJlYW1zCi0gKiBwaHA6Ly9pbnB1dCBhbmQgcGhwOi8vb3V0cHV0Ci0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUUGhwU3RyZWFtIGV4dGVuZHMgVFRyYW5zcG9ydCB7Ci0KLSAgY29uc3QgTU9ERV9SID0gMTsKLSAgY29uc3QgTU9ERV9XID0gMjsKLQotICBwcml2YXRlICRpblN0cmVhbV8gPSBudWxsOwotCi0gIHByaXZhdGUgJG91dFN0cmVhbV8gPSBudWxsOwotCi0gIHByaXZhdGUgJHJlYWRfID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSAkd3JpdGVfID0gZmFsc2U7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtb2RlKSB7Ci0gICAgJHRoaXMtPnJlYWRfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1I7Ci0gICAgJHRoaXMtPndyaXRlXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9XOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7Ci0gICAgaWYgKCR0aGlzLT5yZWFkXykgewotICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IEBmb3BlbihzZWxmOjppblN0cmVhbU5hbWUoKSwgJ3InKTsKLSAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL2lucHV0Jyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICAkdGhpcy0+b3V0U3RyZWFtXyA9IEBmb3BlbigncGhwOi8vb3V0cHV0JywgJ3cnKTsKLSAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKSB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9vdXRwdXQnKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKSB7Ci0gICAgaWYgKCR0aGlzLT5yZWFkXykgewotICAgICAgQGZjbG9zZSgkdGhpcy0+aW5TdHJlYW1fKTsKLSAgICAgICR0aGlzLT5pblN0cmVhbV8gPSBudWxsOwotICAgIH0KLSAgICBpZiAoJHRoaXMtPndyaXRlXykgewotICAgICAgQGZjbG9zZSgkdGhpcy0+b3V0U3RyZWFtXyk7Ci0gICAgICAkdGhpcy0+b3V0U3RyZWFtXyA9IG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpIHsKLSAgICByZXR1cm4KLSAgICAgICghJHRoaXMtPnJlYWRfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSAmJgotICAgICAgKCEkdGhpcy0+d3JpdGVfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKSB7Ci0gICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmluU3RyZWFtXywgJGxlbik7Ci0gICAgaWYgKCRkYXRhID09PSBGQUxTRSB8fCAkZGF0YSA9PT0gJycpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcycpOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAkZ290ID0gQGZ3cml0ZSgkdGhpcy0+b3V0U3RyZWFtXywgJGJ1Zik7Ci0gICAgICBpZiAoJGdvdCA9PT0gMCB8fCAkZ290ID09PSBGQUxTRSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMnKTsKLSAgICAgIH0KLSAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJGdvdCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkgewotICAgIEBmZmx1c2goJHRoaXMtPm91dFN0cmVhbV8pOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5TdHJlYW1OYW1lKCkgewotICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgPT0gJ2NsaScpIHsKLSAgICAgIHJldHVybiAncGhwOi8vc3RkaW4nOwotICAgIH0KLSAgICByZXR1cm4gJ3BocDovL2lucHV0JzsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkM2JmNy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVFRyYW5zcG9ydDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTb2NrZXQgZXh0ZW5kcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJpdmF0ZSAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHNlbmRUaW1lb3V0U2VjXyA9IDA7Ci0KLSAgLyoqCi0gICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkc2VuZFRpbWVvdXRVc2VjXyA9IDEwMDAwMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmVjdlRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcwotICAgKgotICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJHJlY3ZUaW1lb3V0VXNlY18gPSA3NTAwMDA7Ci0KLSAgLyoqCi0gICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkcGVyc2lzdF8gPSBGQUxTRTsKLQotICAvKioKLSAgICogRGVidWdnaW5nIG9uPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByb3RlY3RlZCAkZGVidWdfID0gRkFMU0U7Ci0KLSAgLyoqCi0gICAqIERlYnVnIGhhbmRsZXIKLSAgICoKLSAgICogQHZhciBtaXhlZAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z0hhbmRsZXJfID0gbnVsbDsKLQotICAvKioKLSAgICogU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgICBSZW1vdGUgaG9zdG5hbWUKLSAgICogQHBhcmFtIGludCAgICAkcG9ydCAgICAgICAgIFJlbW90ZSBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBzdHJpbmcgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiB0byBjYWxsIGZvciBlcnJvciBsb2dnaW5nCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3Q9J2xvY2FsaG9zdCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydD05MDkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9RkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKLSAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXyA9ICRkZWJ1Z0hhbmRsZXIgPyAkZGVidWdIYW5kbGVyIDogJ2Vycm9yX2xvZyc7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIHJlc291cmNlICRoYW5kbGUKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0SGFuZGxlKCRoYW5kbGUpIHsKLSAgICAkdGhpcy0+aGFuZGxlXyA9ICRoYW5kbGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgotICAgKgotICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0ICBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRTZW5kVGltZW91dCgkdGltZW91dCkgewotICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOwotICAgICR0aGlzLT5zZW5kVGltZW91dFVzZWNfID0KLSAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZWNlaXZlIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KSB7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7Ci0gICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18gPQotICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5yZWN2VGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJGRlYnVnCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKSB7Ci0gICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgaG9zdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKSB7Ci0gICAgcmV0dXJuICR0aGlzLT5ob3N0XzsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHJlbW90ZSBwb3J0IHRoYXQgdGhpcyBzb2NrZXQgaXMgY29ubmVjdGVkIHRvCi0gICAqCi0gICAqIEByZXR1cm4gaW50IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCkgewotICAgIHJldHVybiAkdGhpcy0+cG9ydF87Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KLSAgICoKLSAgICogQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkgewotICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7Ci0gIH0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOwotICAgIH0KLQotICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0KLSAgICBpZiAoJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IEBwZnNvY2tvcGVuKCR0aGlzLT5ob3N0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigkdGhpcy0+aG9zdF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXJyc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKSk7Ci0gICAgfQotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkgewotICAgIGlmICghJHRoaXMtPnBlcnNpc3RfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBmcm9tIHRoZSBzb2NrZXQgYXQgbW9zdCAkbGVuIGJ5dGVzLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcwotICAgKiBzb29uIGFzIGFueSBkYXRhIGlzIHJlY2VpdmVkLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLSAgICogQHJldHVybiBzdHJpbmcgQmluYXJ5IGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pIHsKLSAgICAkbnVsbCA9IG51bGw7Ci0gICAgJHJlYWQgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0gICAgJHJlYWRhYmxlID0gQHN0cmVhbV9zZWxlY3QoJHJlYWQsICRudWxsLCAkbnVsbCwgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXywgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18pOwotCi0gICAgaWYgKCRyZWFkYWJsZSA+IDApIHsKLSAgICAgICRkYXRhID0gQHN0cmVhbV9zb2NrZXRfcmVjdmZyb20oJHRoaXMtPmhhbmRsZV8sICRsZW4pOwotICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlaWYoJGRhdGEgPT0gJycgJiYgZmVvZigkdGhpcy0+aGFuZGxlXykpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldCByZWFkIDAgYnl0ZXMnKTsKLSAgICAgICAgfQotCi0gICAgICByZXR1cm4gJGRhdGE7Ci0gICAgfSBlbHNlIGlmICgkcmVhZGFibGUgPT09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IHRpbWVkIG91dCByZWFkaW5nICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgfQotICAgIH0KLQotICAvKioKLSAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikgewotICAgICRudWxsID0gbnVsbDsKLSAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7Ci0KLSAgICAvLyBrZWVwIHdyaXRpbmcgdW50aWwgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KLSAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgewotICAgICAgLy8gd2FpdCBmb3Igc3RyZWFtIHRvIGJlY29tZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcKLSAgICAgICR3cml0YWJsZSA9IEBzdHJlYW1fc2VsZWN0KCRudWxsLCAkd3JpdGUsICRudWxsLCAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfLCAkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyk7Ci0gICAgICBpZiAoJHdyaXRhYmxlID4gMCkgewotICAgICAgICAvLyB3cml0ZSBidWZmZXIgdG8gc3RyZWFtCi0gICAgICAgICR3cml0dGVuID0gQHN0cmVhbV9zb2NrZXRfc2VuZHRvKCR0aGlzLT5oYW5kbGVfLCAkYnVmKTsKLSAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9Ci0gICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKLSAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkd3JpdHRlbik7Ci0gICAgICB9IGVsc2UgaWYgKCR3cml0YWJsZSA9PT0gMCkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgd3JpdGluZyAnLlRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKS4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcuVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpLicgYnl0ZXMgJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0Xy4nOicuJHRoaXMtPnBvcnRfKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAvKioKLSAgICogRmx1c2ggb3V0cHV0IHRvIHRoZSBzb2NrZXQuCi0gICAqCi0gICAqIFNpbmNlIHJlYWQoKSwgcmVhZEFsbCgpIGFuZCB3cml0ZSgpIG9wZXJhdGUgb24gdGhlIHNvY2tldHMgZGlyZWN0bHksCi0gICAqIHRoaXMgaXMgYSBuby1vcAotICAgKgotICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGZsdXNoYWJsZSBidWZmZXJpbmcgYmVoYXZpb3VyLCB3cmFwIHRoaXMgVFNvY2tldAotICAgKiBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpIHsKLSAgICAvLyBuby1vcAotICAgIH0KLSAgfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2MTBjYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgbGlicmFyeSBtYWtlcyB1c2Ugb2YgQVBDIGNhY2hlIHRvIG1ha2UgaG9zdHMgYXMgZG93biBpbiBhIHdlYgotICogZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgcnVubmluZyBmcm9tIHRoZSBDTEkgb3Igb24gYSBzeXN0ZW0gd2l0aG91dCBBUEMKLSAqIGluc3RhbGxlZCwgdGhlbiB0aGVzZSBudWxsIGZ1bmN0aW9ucyB3aWxsIHN0ZXAgaW4gYW5kIGFjdCBsaWtlIGNhY2hlCi0gKiBtaXNzZXMuCi0gKi8KLWlmICghZnVuY3Rpb25fZXhpc3RzKCdhcGNfZmV0Y2gnKSkgewotICBmdW5jdGlvbiBhcGNfZmV0Y2goJGtleSkgeyByZXR1cm4gRkFMU0U7IH0KLSAgZnVuY3Rpb24gYXBjX3N0b3JlKCRrZXksICR2YXIsICR0dGw9MCkgeyByZXR1cm4gRkFMU0U7IH0KLX0KLQotLyoqCi0gKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZSB0aGF0IGFsbG93cyBjb25uZWN0aW9uCi0gKiB0byBhIHBvb2wgb2Ygc2VydmVycy4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTb2NrZXRQb29sIGV4dGVuZHMgVFNvY2tldCB7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBzZXJ2ZXJzLiBBcnJheSBvZiBhc3NvY2lhdGl2ZSBhcnJheXMgd2l0aCAnaG9zdCcgYW5kICdwb3J0JyBrZXlzCi0gICAqLwotICBwcml2YXRlICRzZXJ2ZXJzXyA9IGFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0Ci0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRudW1SZXRyaWVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCi0gICAqIG1hcmtlZCBhcyBkb3duLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkcmV0cnlJbnRlcnZhbF8gPSA2MDsKLQotICAvKioKLSAgICogTWF4IGNvbnNlY3V0aXZlIGZhaWx1cmVzIGJlZm9yZSBtYXJraW5nIGEgaG9zdCBkb3duLgotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJpdmF0ZSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAxOwotCi0gIC8qKgotICAgKiBUcnkgaG9zdHMgaW4gb3JkZXI/IG9yIFJhbmRvbWl6ZWQ/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmFuZG9taXplXyA9IFRSVUU7Ci0KLSAgLyoqCi0gICAqIEFsd2F5cyB0cnkgbGFzdCBob3N0LCBldmVuIGlmIG1hcmtlZCBkb3duPwotICAgKgotICAgKiBAdmFyIGJvb2wKLSAgICovCi0gIHByaXZhdGUgJGFsd2F5c1RyeUxhc3RfID0gVFJVRTsKLQotICAvKioKLSAgICogU29ja2V0IHBvb2wgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIGFycmF5ICAkaG9zdHMgICAgICAgIExpc3Qgb2YgcmVtb3RlIGhvc3RuYW1lcwotICAgKiBAcGFyYW0gbWl4ZWQgICRwb3J0cyAgICAgICAgQXJyYXkgb2YgcmVtb3RlIHBvcnRzLCBvciBhIHNpbmdsZSBjb21tb24gcG9ydAotICAgKiBAcGFyYW0gYm9vbCAgICRwZXJzaXN0ICAgICAgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAotICAgKiBAcGFyYW0gbWl4ZWQgICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdHM9YXJyYXkoJ2xvY2FsaG9zdCcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcnRzPWFycmF5KDkwOTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBlcnNpc3Q9RkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGVidWdIYW5kbGVyPW51bGwpIHsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KG51bGwsIDAsICRwZXJzaXN0LCAkZGVidWdIYW5kbGVyKTsKLQotICAgIGlmICghaXNfYXJyYXkoJHBvcnRzKSkgewotICAgICAgJHBvcnQgPSAkcG9ydHM7Ci0gICAgICAkcG9ydHMgPSBhcnJheSgpOwotICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJHZhbCkgewotICAgICAgICAkcG9ydHNbJGtleV0gPSAkcG9ydDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkaG9zdCkgewotICAgICAgJHRoaXMtPnNlcnZlcnNfIFtdPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3J0JyA9PiAkcG9ydHNbJGtleV0pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBZGQgYSBzZXJ2ZXIgdG8gdGhlIHBvb2wKLSAgICoKLSAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGFkZGluZyBhIGR1cGxpY2F0ZSBzZXJ2ZXIgZW50cnkuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgaG9zdG5hbWUgb3IgSVAKLSAgICogQHBhcmFtIGludCAkcG9ydCBwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gYWRkU2VydmVyKCRob3N0LCAkcG9ydCkgewotICAgICR0aGlzLT5zZXJ2ZXJzX1tdID0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LCAncG9ydCcgPT4gJHBvcnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldE51bVJldHJpZXMoJG51bVJldHJpZXMpIHsKLSAgICAkdGhpcy0+bnVtUmV0cmllc18gPSAkbnVtUmV0cmllczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmV0cnlJbnRlcnZhbCgkcmV0cnlJbnRlcnZhbCkgewotICAgICR0aGlzLT5yZXRyeUludGVydmFsXyA9ICRyZXRyeUludGVydmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBiZWZvcmUgbWFya2luZyBpdCBhcyBkb3duLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcygkbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykgewotICAgICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9ICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFR1cm5zIHJhbmRvbWl6YXRpb24gaW4gY29ubmVjdCBvcmRlciBvbiBvciBvZmYuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRyYW5kb21pemUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5kb21pemUoJHJhbmRvbWl6ZSkgewotICAgICR0aGlzLT5yYW5kb21pemVfID0gJHJhbmRvbWl6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkYWx3YXlzVHJ5TGFzdAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldEFsd2F5c1RyeUxhc3QoJGFsd2F5c1RyeUxhc3QpIHsKLSAgICAkdGhpcy0+YWx3YXlzVHJ5TGFzdF8gPSAkYWx3YXlzVHJ5TGFzdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbm5lY3RzIHRoZSBzb2NrZXQgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBzZXJ2ZXJzIGluIHRoZSBwb29sCi0gICAqIGFuZCB0cnlpbmcgdG8gZmluZCBvbmUgdGhhdCB3b3Jrcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkgewotICAgIC8vIENoZWNrIGlmIHdlIHdhbnQgb3JkZXIgcmFuZG9taXphdGlvbgotICAgIGlmICgkdGhpcy0+cmFuZG9taXplXykgewotICAgICAgc2h1ZmZsZSgkdGhpcy0+c2VydmVyc18pOwotICAgIH0KLQotICAgIC8vIENvdW50IHNlcnZlcnMgdG8gaWRlbnRpZnkgdGhlICJsYXN0IiBvbmUKLSAgICAkbnVtU2VydmVycyA9IGNvdW50KCR0aGlzLT5zZXJ2ZXJzXyk7Ci0KLSAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtU2VydmVyczsgKyskaSkgewotCi0gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSAkaG9zdCBhbmQgJHBvcnQgdmFyaWFibGVzCi0gICAgICBleHRyYWN0KCR0aGlzLT5zZXJ2ZXJzX1skaV0pOwotCi0gICAgICAvLyBDaGVjayBBUEMgY2FjaGUgZm9yIGEgcmVjb3JkIG9mIHRoaXMgc2VydmVyIGJlaW5nIGRvd24KLSAgICAgICRmYWlsdGltZUtleSA9ICd0aHJpZnRfZmFpbHRpbWU6Jy4kaG9zdC4nOicuJHBvcnQuJ34nOwotCi0gICAgICAvLyBDYWNoZSBtaXNzPyBBc3N1bWUgaXQncyBPSwotICAgICAgJGxhc3RGYWlsdGltZSA9IGFwY19mZXRjaCgkZmFpbHRpbWVLZXkpOwotICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPT09IEZBTFNFKSB7Ci0gICAgICAgICRsYXN0RmFpbHRpbWUgPSAwOwotICAgICAgfQotCi0gICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IEZBTFNFOwotCi0gICAgICAvLyBDYWNoZSBoaXQuLi5tYWtlIHN1cmUgZW5vdWdoIHRoZSByZXRyeSBpbnRlcnZhbCBoYXMgZWxhcHNlZAotICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7Ci0gICAgICAgICRlbGFwc2VkID0gdGltZSgpIC0gJGxhc3RGYWlsdGltZTsKLSAgICAgICAgaWYgKCRlbGFwc2VkID4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfKSB7Ci0gICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBUUlVFOwotICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogcmV0cnlJbnRlcnZhbCAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnLiR0aGlzLT5yZXRyeUludGVydmFsXy4nKSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBwYXNzZWQgZm9yIGhvc3QgJy4kaG9zdC4nOicuJHBvcnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBPbmx5IGNvbm5lY3QgaWYgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBmYWlsIGludGVydmFsLCBPUiBpZiB0aGlzCi0gICAgICAvLyBpcyB0aGUgTEFTVCBzZXJ2ZXIgd2UgYXJlIHRyeWluZywganVzdCBoYW1tZXIgYXdheSBvbiBpdAotICAgICAgJGlzTGFzdFNlcnZlciA9IEZBTFNFOwotICAgICAgaWYgKCR0aGlzLT5hbHdheXNUcnlMYXN0XykgewotICAgICAgICAkaXNMYXN0U2VydmVyID0gKCRpID09ICgkbnVtU2VydmVycyAtIDEpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCgkbGFzdEZhaWx0aW1lID09PSAwKSB8fAotICAgICAgICAgICgkaXNMYXN0U2VydmVyKSB8fAotICAgICAgICAgICgkbGFzdEZhaWx0aW1lID4gMCAmJiAkcmV0cnlJbnRlcnZhbFBhc3NlZCkpIHsKLQotICAgICAgICAvLyBTZXQgdW5kZXJseWluZyBUU29ja2V0IHBhcmFtcyB0byB0aGlzIG9uZQotICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0KLSAgICAgICAgLy8gVHJ5IHVwIHRvIG51bVJldHJpZXNfIGNvbm5lY3Rpb25zIHBlciBzZXJ2ZXIKLSAgICAgICAgZm9yICgkYXR0ZW1wdCA9IDA7ICRhdHRlbXB0IDwgJHRoaXMtPm51bVJldHJpZXNfOyAkYXR0ZW1wdCsrKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyBUU29ja2V0IG9wZW4gZnVuY3Rpb24KLSAgICAgICAgICAgIHBhcmVudDo6b3BlbigpOwotCi0gICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBmYWlsdXJlIGNvdW50cyBpZiByZXF1aXJlZCB0byBkbyBzbwotICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7Ci0gICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdWNjZXNzZnVsIGNvbm5lY3Rpb24sIHJldHVybiBub3cKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJHR4KSB7Ci0gICAgICAgICAgICAvLyBDb25uZWN0aW9uIGZhaWxlZAotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgZmFpbHVyZSBvZiB0aGlzIGhvc3QgaW4gdGhlIGNhY2hlCi0gICAgICAgICRjb25zZWNmYWlsc0tleSA9ICd0aHJpZnRfY29uc2VjZmFpbHM6Jy4kaG9zdC4nOicuJHBvcnQuJ34nOwotCi0gICAgICAgIC8vIElnbm9yZSBjYWNoZSBtaXNzZXMKLSAgICAgICAgJGNvbnNlY2ZhaWxzID0gYXBjX2ZldGNoKCRjb25zZWNmYWlsc0tleSk7Ci0gICAgICAgIGlmICgkY29uc2VjZmFpbHMgPT09IEZBTFNFKSB7Ci0gICAgICAgICAgJGNvbnNlY2ZhaWxzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluY3JlbWVudCBieSBvbmUKLSAgICAgICAgJGNvbnNlY2ZhaWxzKys7Ci0KLSAgICAgICAgLy8gTG9nIGFuZCBjYWNoZSB0aGlzIGZhaWx1cmUKLSAgICAgICAgaWYgKCRjb25zZWNmYWlscyA+PSAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKLSAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IG1hcmtpbmcgJy4kaG9zdC4nOicuJHBvcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFzIGRvd24gZm9yICcuJHRoaXMtPnJldHJ5SW50ZXJ2YWxfLicgc2VjcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyICcuJGNvbnNlY2ZhaWxzLicgZmFpbGVkIGF0dGVtcHRzLicpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBTdG9yZSB0aGUgZmFpbHVyZSB0aW1lCi0gICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgdGltZSgpKTsKLQotICAgICAgICAgIC8vIENsZWFyIHRoZSBjb3VudCBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcwotICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksICRjb25zZWNmYWlscyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPaCBubzsgd2UgZmFpbGVkIHRoZW0gYWxsLiBUaGUgc3lzdGVtIGlzIHRvdGFsbHkgaWxsIQotICAgICRlcnJvciA9ICdUU29ja2V0UG9vbDogQWxsIGhvc3RzIGluIHBvb2wgYXJlIGRvd24uICc7Ci0gICAgJGhvc3RzID0gYXJyYXkoKTsKLSAgICBmb3JlYWNoICgkdGhpcy0+c2VydmVyc18gYXMgJHNlcnZlcikgewotICAgICAgJGhvc3RzIFtdPSAkc2VydmVyWydob3N0J10uJzonLiRzZXJ2ZXJbJ3BvcnQnXTsKLSAgICB9Ci0gICAgJGhvc3RsaXN0ID0gaW1wbG9kZSgnLCcsICRob3N0cyk7Ci0gICAgJGVycm9yIC49ICcoJy4kaG9zdGxpc3QuJyknOwotICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICB9Ci0gICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDQzNjYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0IHsKLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gaXNPcGVuKCk7Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIG9wZW4oKTsKLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBmdW5jdGlvbiBjbG9zZSgpOwotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgZnVuY3Rpb24gcmVhZCgkbGVuKTsKLQotICAvKioKLSAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuCi0gICAqCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pIHsKLSAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7Ci0KLSAgICAkZGF0YSA9ICcnOwotICAgICRnb3QgPSAwOwotICAgIHdoaWxlICgoJGdvdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkpIDwgJGxlbikgewotICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOwotICAgIH0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBnaXZlbiBkYXRhIG91dC4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmICBUaGUgZGF0YSB0byB3cml0ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGZ1bmN0aW9uIHdyaXRlKCRidWYpOwotCi0gIC8qKgotICAgKiBGbHVzaGVzIGFueSBwZW5kaW5nIGRhdGEgb3V0IG9mIGEgYnVmZmVyCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKSB7fQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVE1lc3NhZ2VUeXBlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWM0NWMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVE1lc3NhZ2VUeXBlLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHlwZTsKLQotLyoqCi0gKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKLSAqLwotY2xhc3MgVE1lc3NhZ2VUeXBlIHsKLSAgY29uc3QgQ0FMTCAgPSAxOwotICBjb25zdCBSRVBMWSA9IDI7Ci0gIGNvbnN0IEVYQ0VQVElPTiA9IDM7Ci0gIGNvbnN0IE9ORVdBWSA9IDQ7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNmMjI4Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHlwZTsKLQotLyoqCi0gKiBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAotICovCi1jbGFzcyBUVHlwZSB7Ci0gIGNvbnN0IFNUT1AgICA9IDA7Ci0gIGNvbnN0IFZPSUQgICA9IDE7Ci0gIGNvbnN0IEJPT0wgICA9IDI7Ci0gIGNvbnN0IEJZVEUgICA9IDM7Ci0gIGNvbnN0IEkwOCAgICA9IDM7Ci0gIGNvbnN0IERPVUJMRSA9IDQ7Ci0gIGNvbnN0IEkxNiAgICA9IDY7Ci0gIGNvbnN0IEkzMiAgICA9IDg7Ci0gIGNvbnN0IEk2NCAgICA9IDEwOwotICBjb25zdCBTVFJJTkcgPSAxMTsKLSAgY29uc3QgVVRGNyAgID0gMTE7Ci0gIGNvbnN0IFNUUlVDVCA9IDEyOwotICBjb25zdCBNQVAgICAgPSAxMzsKLSAgY29uc3QgU0VUICAgID0gMTQ7Ci0gIGNvbnN0IExTVCAgICA9IDE1OyAgICAvLyBOLkIuIGNhbm5vdCB1c2UgTElTVCBrZXl3b3JkIGluIFBIUCEKLSAgY29uc3QgVVRGOCAgID0gMTY7Ci0gIGNvbnN0IFVURjE2ICA9IDE3OwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNjNWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKQEAgLTAsMCArMSwyMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQnVmZmVyZWQgdHJhbnNwb3J0LiBTdG9yZXMgZGF0YSB0byBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCBpdCBkb2Vzbid0CisgKiBhY3R1YWxseSB3cml0ZSBvdXQgdW50aWwgZmx1c2ggaXMgY2FsbGVkLiBGb3IgcmVhZGluZywgd2UgZG8gYSBncmVlZHkKKyAqIHJlYWQgYW5kIHRoZW4gc2VydmUgZGF0YSBvdXQgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRCdWZmZXJlZFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCAkdHJhbnNwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSByZWNlaXZlIGJ1ZmZlciBzaXplCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkckJ1ZlNpemVfID0gNTEyOworCisgICAgLyoqCisgICAgICogVGhlIHdyaXRlIGJ1ZmZlciBzaXplCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkd0J1ZlNpemVfID0gNTEyOworCisgICAgLyoqCisgICAgICogVGhlIHdyaXRlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICR3QnVmXyA9ICcnOworCisgICAgLyoqCisgICAgICogVGhlIHJlYWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJCdWZfID0gJyc7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIGJ1ZmZlcmVkIHRyYW5zcG9ydCBhcm91bmQgYW4gdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydCwgJHJCdWZTaXplID0gNTEyLCAkd0J1ZlNpemUgPSA1MTIpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7CisgICAgICAgICR0aGlzLT5yQnVmU2l6ZV8gPSAkckJ1ZlNpemU7CisgICAgICAgICR0aGlzLT53QnVmU2l6ZV8gPSAkd0J1ZlNpemU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmlzT3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0ZG9jCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAoJGRhdGEgLiAkdGhpcy0+ckJ1Zl8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlYXNvbiB0aGF0IHdlIGN1c3RvbWl6ZSByZWFkQWxsIGhlcmUgaXMgdGhhdCB0aGUgbWFqb3JpdHkgb2YgUEhQCisgICAgICogc3RyZWFtcyBhcmUgYWxyZWFkeSBpbnRlcm5hbGx5IGJ1ZmZlcmVkIGJ5IFBIUC4gVGhlIHNvY2tldCBzdHJlYW0sIGZvcgorICAgICAqIGV4YW1wbGUsIGJ1ZmZlcnMgaW50ZXJuYWxseSBhbmQgYmxvY2tzIGlmIHlvdSBjYWxsIHJlYWQgd2l0aCAkbGVuIGdyZWF0ZXIKKyAgICAgKiB0aGFuIHRoZSBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUsIHVubGlrZSByZWN2KCkgaW4gQy4KKyAgICAgKgorICAgICAqIFRoZXJlZm9yZSwgdXNlIHRoZSByZWFkQWxsIG1ldGhvZCBvZiB0aGUgd3JhcHBlZCB0cmFuc3BvcnQgaW5zaWRlCisgICAgICogdGhlIGJ1ZmZlcmVkIHJlYWRBbGwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEFsbCgkbGVuKQorICAgIHsKKyAgICAgICAgJGhhdmUgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgaWYgKCRoYXZlID09IDApIHsKKyAgICAgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA8ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisgICAgICAgICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPT0gJGxlbikgeworICAgICAgICAgICAgJGRhdGEgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlID4gJGxlbikgeworICAgICAgICAgICAgJGRhdGEgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0ZG9jCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4KKyAgICAgKiBAcmV0dXJuIHN0cmluZworICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCR0aGlzLT5yQnVmU2l6ZV8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pIDw9ICRsZW4pIHsKKyAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAnJzsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0KKworICAgICAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICR0aGlzLT5yQnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sICRsZW4pOworCisgICAgICAgIHJldHVybiAkcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0ZG9jCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPj0gJHRoaXMtPndCdWZTaXplXykgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQGluaGVyaXRkb2MKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPiAwKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPndCdWZfOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgJHRoaXMtPndCdWZfID0gJyc7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyYjQzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAKQEAgLTAsMCArMSwyNzYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEN1cmxDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgJGN1cmxIYW5kbGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICR1cmlfOworCisgICAgLyoqCisgICAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkc2NoZW1lXzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkcmVxdWVzdF87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGRhdGEuCisgICAgICoKKyAgICAgKiBAdmFyIGJpbmFyeSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlc3BvbnNlXzsKKworICAgIC8qKgorICAgICAqIFJlYWQgdGltZW91dAorICAgICAqCisgICAgICogQHZhciBmbG9hdAorICAgICAqLworICAgIHByb3RlY3RlZCAkdGltZW91dF87CisKKyAgICAvKioKKyAgICAgKiBodHRwIGhlYWRlcnMKKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhlYWRlcnNfOworCisgICAgLyoqCisgICAgICogTWFrZSBhIG5ldyBIVFRQIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0CisgICAgICogQHBhcmFtIHN0cmluZyAkdXJpCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0LCAkcG9ydCA9IDgwLCAkdXJpID0gJycsICRzY2hlbWUgPSAnaHR0cCcpCisgICAgeworICAgICAgICBpZiAoKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdXJpKSA+IDApICYmICgkdXJpezB9ICE9ICcvJykpIHsKKyAgICAgICAgICAgICR1cmkgPSAnLycgLiAkdXJpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+dXJpXyA9ICR1cmk7CisgICAgICAgICR0aGlzLT5yZXF1ZXN0XyA9ICcnOworICAgICAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKKyAgICAgICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVhZCB0aW1lb3V0CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxvYXQgJHRpbWVvdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIGlmICgkbGVuID49IHN0cmxlbigkdGhpcy0+cmVzcG9uc2VfKSkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXNwb25zZV87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkcmV0ID0gc3Vic3RyKCR0aGlzLT5yZXNwb25zZV8sIDAsICRsZW4pOworICAgICAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAkbGVuKTsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZ1bGwgYW1vdW50IG9mIGRhdGEgaXMgcmVhZC4gU2luY2UgVEN1cmxDbGllbnQgZ2V0cyBlbnRpcmUgcGF5bG9hZCBhdAorICAgICAqIG9uY2UsIHBhcmVudCByZWFkQWxsIGNhbm5vdCBiZSB1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEsIG9mIGV4YWN0IGxlbmd0aAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnJlYWQoJGxlbik7CisKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkgIT09ICRsZW4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUQ3VybENsaWVudCBjb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcycpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+cmVxdWVzdF8gLj0gJGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhbmQgc2VuZHMgdGhlIGFjdHVhbCByZXF1ZXN0IG92ZXIgdGhlIEhUVFAgY29ubmVjdGlvbgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxmOjokY3VybEhhbmRsZSkgeworICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oYXJyYXkoJ1RocmlmdFxcVHJhbnNwb3J0XFxUQ3VybENsaWVudCcsICdjbG9zZUN1cmxIYW5kbGUnKSk7CisgICAgICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IGN1cmxfaW5pdCgpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIHRydWUpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfQklOQVJZVFJBTlNGRVIsIHRydWUpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVVNFUkFHRU5ULCAnUEhQL1RDdXJsQ2xpZW50Jyk7CisgICAgICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9DVVNUT01SRVFVRVNULCAnUE9TVCcpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfRk9MTE9XTE9DQVRJT04sIHRydWUpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfTUFYUkVESVJTLCAxKTsKKyAgICAgICAgfQorICAgICAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgorICAgICAgICAkaG9zdCA9ICR0aGlzLT5ob3N0XyAuICgkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicgLiAkdGhpcy0+cG9ydF8gOiAnJyk7CisgICAgICAgICRmdWxsVXJsID0gJHRoaXMtPnNjaGVtZV8gLiAiOi8vIiAuICRob3N0IC4gJHRoaXMtPnVyaV87CisKKyAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOworICAgICAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aCcgPT4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yZXF1ZXN0XykpOworICAgICAgICBmb3JlYWNoIChhcnJheV9tZXJnZSgkZGVmYXVsdEhlYWRlcnMsICR0aGlzLT5oZWFkZXJzXykgYXMgJGtleSA9PiAkdmFsdWUpIHsKKyAgICAgICAgICAgICRoZWFkZXJzW10gPSAiJGtleTogJHZhbHVlIjsKKyAgICAgICAgfQorCisgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0hUVFBIRUFERVIsICRoZWFkZXJzKTsKKworICAgICAgICBpZiAoJHRoaXMtPnRpbWVvdXRfID4gMCkgeworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVElNRU9VVCwgJHRoaXMtPnRpbWVvdXRfKTsKKyAgICAgICAgfQorICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9QT1NURklFTERTLCAkdGhpcy0+cmVxdWVzdF8pOworICAgICAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKKworICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsICRmdWxsVXJsKTsKKyAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IGN1cmxfZXhlYyhzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICRyZXNwb25zZUVycm9yID0gY3VybF9lcnJvcihzZWxmOjokY3VybEhhbmRsZSk7CisKKyAgICAgICAgJGNvZGUgPSBjdXJsX2dldGluZm8oc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxJTkZPX0hUVFBfQ09ERSk7CisKKyAgICAgICAgLy8gSGFuZGxlIG5vbiAyMDAgc3RhdHVzIGNvZGUgLyBjb25uZWN0IGZhaWx1cmUKKyAgICAgICAgaWYgKCR0aGlzLT5yZXNwb25zZV8gPT09IGZhbHNlIHx8ICRjb2RlICE9PSAyMDApIHsKKyAgICAgICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBudWxsOworICAgICAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7CisgICAgICAgICAgICAkZXJyb3IgPSAnVEN1cmxDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLiAkZnVsbFVybDsKKyAgICAgICAgICAgIGlmICgkcmVzcG9uc2VFcnJvcikgeworICAgICAgICAgICAgICAgICRlcnJvciAuPSAnLCAnIC4gJHJlc3BvbnNlRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJGNvZGUpIHsKKyAgICAgICAgICAgICAgICAkZXJyb3IgLj0gJywgSFRUUCBzdGF0dXMgY29kZTogJyAuICRjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJGVycm9yLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xvc2VDdXJsSGFuZGxlKCkKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoc2VsZjo6JGN1cmxIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBjdXJsX2Nsb3NlKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFxFeGNlcHRpb24gJHgpIHsKKyAgICAgICAgICAgIGVycm9yX2xvZygnVGhlcmUgd2FzIGFuIGVycm9yIGNsb3NpbmcgdGhlIGN1cmwgaGFuZGxlOiAnIC4gJHgtPmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkSGVhZGVycygkaGVhZGVycykKKyAgICB7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzXywgJGhlYWRlcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQxODY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsMTkyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKKyAqIHRoZWlyIGxlbmd0aC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogVW5kZXJseWluZyB0cmFuc3BvcnQgb2JqZWN0LgorICAgICAqCisgICAgICogQHZhciBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHJpdmF0ZSAkdHJhbnNwb3J0XzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgcmVhZCBkYXRhLgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlICRyQnVmXzsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBmb3IgcXVldWVkIG91dHB1dCBkYXRhCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByaXZhdGUgJHdCdWZfOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmcmFtZSByZWFkcworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkcmVhZF87CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZyYW1lIHdyaXRlcworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkd3JpdGVfOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0IFVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQgPSBudWxsLCAkcmVhZCA9IHRydWUsICR3cml0ZSA9IHRydWUpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7CisgICAgICAgICR0aGlzLT5yZWFkXyA9ICRyZWFkOworICAgICAgICAkdGhpcy0+d3JpdGVfID0gJHdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBmcm9tIHRoZSBidWZmZXIuIFdoZW4gbW9yZSBkYXRhIGlzIHJlcXVpcmVkIHJlYWRzIGFub3RoZXIgZW50aXJlCisgICAgICogY2h1bmsgYW5kIHNlcnZlcyBmdXR1cmUgcmVhZHMgb3V0IG9mIHRoYXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICBpZiAoISR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEZyYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBKdXN0IHJldHVybiBmdWxsIGJ1ZmYKKyAgICAgICAgaWYgKCRsZW4gPj0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykpIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+ckJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBudWxsOworCisgICAgICAgICAgICByZXR1cm4gJG91dDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIKKyAgICAgICAgJG91dCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKworICAgICAgICByZXR1cm4gJG91dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXQgcHJldmlvdXNseSByZWFkIGRhdGEgYmFjayBpbnRvIHRoZSBidWZmZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGRhdGEgZGF0YSB0byByZXR1cm4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAoJGRhdGEgLiAkdGhpcy0+ckJ1Zl8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBjaHVuayBvZiBkYXRhIGludG8gdGhlIGludGVybmFsIHJlYWQgYnVmZmVyLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkKKyAgICB7CisgICAgICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKKyAgICAgICAgJHZhbCA9IHVucGFjaygnTicsICRidWYpOworICAgICAgICAkc3ogPSAkdmFsWzFdOworCisgICAgICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhCisgICAgICogQHBhcmFtIGludCAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYsICRsZW4gPSBudWxsKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCRsZW4gIT09IG51bGwgJiYgJGxlbiA8IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSkgeworICAgICAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAwLCAkbGVuKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIHN0cmVhbSBpbiB0aGUgZm9ybWF0IG9mIGEgNC1ieXRlIGxlbmd0aAorICAgICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+d3JpdGVfIHx8IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgICRvdXQgPSBwYWNrKCdOJywgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykpOworICAgICAgICAkb3V0IC49ICR0aGlzLT53QnVmXzsKKworICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2xlYXIgdGhlIGludGVybmFsIHdCdWZfIHByaW9yIHRvIHRoZSB1bmRlcmx5aW5nIHdyaXRlCisgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgICAgICAgJHRoaXMtPndCdWZfID0gJyc7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1ODgwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAKQEAgLTAsMCArMSwyNTggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfOworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIFVSSSB0byByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkdXJpXzsKKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNjaGVtZV87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGJ1Zl87CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBzb2NrZXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkaGFuZGxlXzsKKworICAgIC8qKgorICAgICAqIFJlYWQgdGltZW91dAorICAgICAqCisgICAgICogQHZhciBmbG9hdAorICAgICAqLworICAgIHByb3RlY3RlZCAkdGltZW91dF87CisKKyAgICAvKioKKyAgICAgKiBodHRwIGhlYWRlcnMKKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhlYWRlcnNfOworCisgICAgLyoqCisgICAgICogQ29udGV4dCBhZGRpdGlvbmFsIG9wdGlvbnMKKyAgICAgKgorICAgICAqIEB2YXIgYXJyYXkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGNvbnRleHRfOworCisgICAgLyoqCisgICAgICogTWFrZSBhIG5ldyBIVFRQIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QKKyAgICAgKiBAcGFyYW0gaW50ICAgICRwb3J0CisgICAgICogQHBhcmFtIHN0cmluZyAkdXJpCisgICAgICogQHBhcmFtIHN0cmluZyAkc2NoZW1lCisgICAgICogQHBhcmFtIGFycmF5ICAkY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCwgJHBvcnQgPSA4MCwgJHVyaSA9ICcnLCAkc2NoZW1lID0gJ2h0dHAnLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCisgICAgeworICAgICAgICBpZiAoKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdXJpKSA+IDApICYmICgkdXJpezB9ICE9ICcvJykpIHsKKyAgICAgICAgICAgICR1cmkgPSAnLycgLiAkdXJpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+dXJpXyA9ICR1cmk7CisgICAgICAgICR0aGlzLT5idWZfID0gJyc7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICAgICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKKyAgICAgICAgJHRoaXMtPmhlYWRlcnNfID0gYXJyYXkoKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlYWQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7CisgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UgfHwgJGRhdGEgPT09ICcnKSB7CisgICAgICAgICAgICAkbWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICBpZiAoJG1kWyd0aW1lZF9vdXQnXSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVEh0dHBDbGllbnQ6IHRpbWVkIG91dCByZWFkaW5nICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAkdGhpcy0+dXJpXywKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUSHR0cENsaWVudDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICR0aGlzLT51cmlfLAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVucyBhbmQgc2VuZHMgdGhlIGFjdHVhbCByZXF1ZXN0IG92ZXIgdGhlIEhUVFAgY29ubmVjdGlvbgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KKyAgICAgICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8gLiAoJHRoaXMtPnBvcnRfICE9IDgwID8gJzonIC4gJHRoaXMtPnBvcnRfIDogJycpOworCisgICAgICAgICRoZWFkZXJzID0gYXJyYXkoKTsKKyAgICAgICAgJGRlZmF1bHRIZWFkZXJzID0gYXJyYXkoJ0hvc3QnID0+ICRob3N0LAorICAgICAgICAgICAgJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdVc2VyLUFnZW50JyA9PiAnUEhQL1RIdHRwQ2xpZW50JywKKyAgICAgICAgICAgICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXykpOworICAgICAgICBmb3JlYWNoIChhcnJheV9tZXJnZSgkZGVmYXVsdEhlYWRlcnMsICR0aGlzLT5oZWFkZXJzXykgYXMgJGtleSA9PiAkdmFsdWUpIHsKKyAgICAgICAgICAgICRoZWFkZXJzW10gPSAiJGtleTogJHZhbHVlIjsKKyAgICAgICAgfQorCisgICAgICAgICRvcHRpb25zID0gJHRoaXMtPmNvbnRleHRfOworCisgICAgICAgICRiYXNlSHR0cE9wdGlvbnMgPSBpc3NldCgkb3B0aW9uc1siaHR0cCJdKSA/ICRvcHRpb25zWyJodHRwIl0gOiBhcnJheSgpOworCisgICAgICAgICRodHRwT3B0aW9ucyA9ICRiYXNlSHR0cE9wdGlvbnMgKyBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCisgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAorICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCisgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOworICAgICAgICBpZiAoJHRoaXMtPnRpbWVvdXRfID4gMCkgeworICAgICAgICAgICAgJGh0dHBPcHRpb25zWyd0aW1lb3V0J10gPSAkdGhpcy0+dGltZW91dF87CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAnJzsKKworICAgICAgICAkb3B0aW9uc1siaHR0cCJdID0gJGh0dHBPcHRpb25zOworICAgICAgICAkY29udGV4dGlkID0gc3RyZWFtX2NvbnRleHRfY3JlYXRlKCRvcHRpb25zKTsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAZm9wZW4oCisgICAgICAgICAgICAkdGhpcy0+c2NoZW1lXyAuICc6Ly8nIC4gJGhvc3QgLiAkdGhpcy0+dXJpXywKKyAgICAgICAgICAgICdyJywKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgJGNvbnRleHRpZAorICAgICAgICApOworCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLiAkaG9zdCAuICR0aGlzLT51cmlfOworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJGVycm9yLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkSGVhZGVycygkaGVhZGVycykKKyAgICB7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzXywgJGhlYWRlcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUwM2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCkBAIC0wLDAgKzEsMTA2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEEgbWVtb3J5IGJ1ZmZlciBpcyBhIHRyYW5wc29ydCB0aGF0IHNpbXBseSByZWFkcyBmcm9tIGFuZCB3cml0ZXMgdG8gYW4KKyAqIGluLW1lbW9yeSBzdHJpbmcgYnVmZmVyLiBBbnl0aW1lIHlvdSBjYWxsIHdyaXRlIG9uIGl0LCB0aGUgZGF0YSBpcyBzaW1wbHkKKyAqIHBsYWNlZCBpbnRvIGEgYnVmZmVyLCBhbmQgYW55dGltZSB5b3UgY2FsbCByZWFkLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGF0CisgKiBidWZmZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUTWVtb3J5QnVmZmVyIGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLiBPcHRpb25hbGx5IHBhc3MgYW4gaW5pdGlhbCB2YWx1ZQorICAgICAqIGZvciB0aGUgYnVmZmVyLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYnVmID0gJycpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyA9ICRidWY7CisgICAgfQorCisgICAgcHJvdGVjdGVkICRidWZfID0gJyc7CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkYnVmTGVuZ3RoID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKTsKKworICAgICAgICBpZiAoJGJ1Zkxlbmd0aCA9PT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgJ1RNZW1vcnlCdWZmZXI6IENvdWxkIG5vdCByZWFkICcgLgorICAgICAgICAgICAgICAgICRsZW4gLiAnIGJ5dGVzIGZyb20gYnVmZmVyLicsCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkYnVmTGVuZ3RoIDw9ICRsZW4pIHsKKyAgICAgICAgICAgICRyZXQgPSAkdGhpcy0+YnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5idWZfID0gJyc7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisKKyAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgMCwgJGxlbik7CisgICAgICAgICR0aGlzLT5idWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAkbGVuKTsKKworICAgICAgICByZXR1cm4gJHJldDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QnVmZmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+YnVmXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gYXZhaWxhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAkZGF0YSAuICR0aGlzLT5idWZfOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDg2YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsNTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBUcmFuc3BvcnQgdGhhdCBvbmx5IGFjY2VwdHMgd3JpdGVzIGFuZCBpZ25vcmVzIHRoZW0uCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWVhc3VyaW5nIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygc3RydWN0dXJlcy4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFROdWxsVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNhbid0IHJlYWQgZnJvbSBUTnVsbFRyYW5zcG9ydC4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODIzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKQEAgLTAsMCArMSwxMjQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogUGhwIHN0cmVhbSB0cmFuc3BvcnQuIFJlYWRzIHRvIGFuZCB3cml0ZXMgZnJvbSB0aGUgcGhwIHN0YW5kYXJkIHN0cmVhbXMKKyAqIHBocDovL2lucHV0IGFuZCBwaHA6Ly9vdXRwdXQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRQaHBTdHJlYW0gZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgY29uc3QgTU9ERV9SID0gMTsKKyAgICBjb25zdCBNT0RFX1cgPSAyOworCisgICAgcHJpdmF0ZSAkaW5TdHJlYW1fID0gbnVsbDsKKworICAgIHByaXZhdGUgJG91dFN0cmVhbV8gPSBudWxsOworCisgICAgcHJpdmF0ZSAkcmVhZF8gPSBmYWxzZTsKKworICAgIHByaXZhdGUgJHdyaXRlXyA9IGZhbHNlOworCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtb2RlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1I7CisgICAgICAgICR0aGlzLT53cml0ZV8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfVzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICAkdGhpcy0+aW5TdHJlYW1fID0gQGZvcGVuKHNlbGY6OmluU3RyZWFtTmFtZSgpLCAncicpOworICAgICAgICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9pbnB1dCcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7CisgICAgICAgICAgICAkdGhpcy0+b3V0U3RyZWFtXyA9IEBmb3BlbigncGhwOi8vb3V0cHV0JywgJ3cnKTsKKyAgICAgICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL291dHB1dCcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPmluU3RyZWFtXyk7CisgICAgICAgICAgICAkdGhpcy0+aW5TdHJlYW1fID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+b3V0U3RyZWFtXyk7CisgICAgICAgICAgICAkdGhpcy0+b3V0U3RyZWFtXyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgKCEkdGhpcy0+cmVhZF8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpICYmCisgICAgICAgICAgICAoISR0aGlzLT53cml0ZV8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmluU3RyZWFtXywgJGxlbik7CisgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UgfHwgJGRhdGEgPT09ICcnKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzJyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgeworICAgICAgICAgICAgJGdvdCA9IEBmd3JpdGUoJHRoaXMtPm91dFN0cmVhbV8sICRidWYpOworICAgICAgICAgICAgaWYgKCRnb3QgPT09IDAgfHwgJGdvdCA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RQaHBTdHJlYW06IENvdWxkIG5vdCB3cml0ZSAnIC4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpIC4gJyBieXRlcycKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJGJ1ZiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkYnVmLCAkZ290KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICBAZmZsdXNoKCR0aGlzLT5vdXRTdHJlYW1fKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpblN0cmVhbU5hbWUoKQorICAgIHsKKyAgICAgICAgaWYgKHBocF9zYXBpX25hbWUoKSA9PSAnY2xpJykgeworICAgICAgICAgICAgcmV0dXJuICdwaHA6Ly9zdGRpbic7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJ3BocDovL2lucHV0JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNTTFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNTTFNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhMGFkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocApAQCAtMCwwICsxLDExNyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU1NMU29ja2V0IGV4dGVuZHMgVFNvY2tldAoreworICAgIC8qKgorICAgICAqIFJlbW90ZSBwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRjb250ZXh0XyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgUmVtb3RlIGhvc3RuYW1lCisgICAgICogQHBhcmFtIGludCAkcG9ydCBSZW1vdGUgcG9ydAorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkY29udGV4dCBTdHJlYW0gY29udGV4dAorICAgICAqIEBwYXJhbSBib29sICRwZXJzaXN0IFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZXJyb3IgbG9nZ2luZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKKyAgICAgICAgJGhvc3QgPSAnbG9jYWxob3N0JywKKyAgICAgICAgJHBvcnQgPSA5MDkwLAorICAgICAgICAkY29udGV4dCA9IG51bGwsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICR0aGlzLT5nZXRTU0xIb3N0KCRob3N0KTsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgICAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXyA9ICRkZWJ1Z0hhbmRsZXIgPyAkZGVidWdIYW5kbGVyIDogJ2Vycm9yX2xvZyc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhvc3QgbmFtZSB3aXRoIFNTTCB0cmFuc3BvcnQgcHJvdG9jb2wKKyAgICAgKiBpZiBubyB0cmFuc3BvcnQgcHJvdG9jb2wgYWxyZWFkeSBzcGVjaWZpZWQgaW4KKyAgICAgKiB0aGUgaG9zdCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqIEByZXR1cm4gc3RyaW5nICRob3N0ICAgSG9zdCBuYW1lIHdpdGggdHJhbnNwb3J0IHByb3RvY29sCisgICAgICovCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRTU0xIb3N0KCRob3N0KQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPSBzdHJwb3MoJGhvc3QsICI6Ly8iKTsKKyAgICAgICAgaWYgKCR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGhvc3QgPSAnc3NsOi8vJyAuICRob3N0OworICAgICAgICB9CisgICAgICAgIHJldHVybiAkaG9zdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5ob3N0XykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiBudWxsIGhvc3QnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJHRoaXMtPnBvcnRfIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBzdHJlYW1fc29ja2V0X2NsaWVudCgKKyAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICRlcnJzdHIsCisgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCksCisgICAgICAgICAgICBTVFJFQU1fQ0xJRU5UX0NPTk5FQ1QsCisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8KKyAgICAgICAgKTsKKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XyAuICcgKCcgLiAkZXJyc3RyIC4gJyBbJyAuICRlcnJubyAuICddKSc7CisgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ3ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXQucGhwCkBAIC0wLDAgKzEsMzY2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTb2NrZXQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogSGFuZGxlIHRvIFBIUCBzb2NrZXQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhhbmRsZV8gPSBudWxsOworCisgICAgLyoqCisgICAgICogUmVtb3RlIGhvc3RuYW1lCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkaG9zdF8gPSAnbG9jYWxob3N0JzsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcG9ydF8gPSAnOTA5MCc7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIHRpbWVvdXQgaW4gc2Vjb25kcy4KKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRzZW5kVGltZW91dFNlY18gPSAwOworCisgICAgLyoqCisgICAgICogU2VuZCB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcy4KKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRTZWMgdGhpcyBpcyB1c2VkIGZvciBzZW5kIHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNlbmRUaW1lb3V0VXNlY18gPSAxMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBSZWN2IHRpbWVvdXQgaW4gc2Vjb25kcworICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFVzZWMgdGhpcyBpcyB1c2VkIGZvciByZWN2IHRpbWVvdXRzLgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlY3ZUaW1lb3V0U2VjXyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWN2IHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyZWN2VGltZW91dFVzZWNfID0gNzUwMDAwOworCisgICAgLyoqCisgICAgICogUGVyc2lzdGVudCBzb2NrZXQgb3IgcGxhaW4/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBlcnNpc3RfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBEZWJ1Z2dpbmcgb24/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlYnVnXyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRGVidWcgaGFuZGxlcgorICAgICAqCisgICAgICogQHZhciBtaXhlZAorICAgICAqLworICAgIHByb3RlY3RlZCAkZGVidWdIYW5kbGVyXyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgUmVtb3RlIGhvc3RuYW1lCisgICAgICogQHBhcmFtIGludCAkcG9ydCBSZW1vdGUgcG9ydAorICAgICAqIEBwYXJhbSBib29sICRwZXJzaXN0IFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gdG8gY2FsbCBmb3IgZXJyb3IgbG9nZ2luZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKKyAgICAgICAgJGhvc3QgPSAnbG9jYWxob3N0JywKKyAgICAgICAgJHBvcnQgPSA5MDkwLAorICAgICAgICAkcGVyc2lzdCA9IGZhbHNlLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgICAgICR0aGlzLT5wZXJzaXN0XyA9ICRwZXJzaXN0OworICAgICAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXyA9ICRkZWJ1Z0hhbmRsZXIgPyAkZGVidWdIYW5kbGVyIDogJ2Vycm9yX2xvZyc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc291cmNlICRoYW5kbGUKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SGFuZGxlKCRoYW5kbGUpCisgICAgeworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9ICRoYW5kbGU7CisgICAgICAgIHN0cmVhbV9zZXRfYmxvY2tpbmcoJHRoaXMtPmhhbmRsZV8sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzZW5kIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICR0aW1lb3V0IFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTZW5kVGltZW91dCgkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gPSBmbG9vcigkdGltZW91dCAvIDEwMDApOworICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyA9CisgICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVjZWl2ZSB0aW1lb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkdGltZW91dCBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVjdlRpbWVvdXQoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfID0gZmxvb3IoJHRpbWVvdXQgLyAxMDAwKTsKKyAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0VXNlY18gPQorICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5yZWN2VGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgZGVidWdnaW5nIG91dHB1dCBvbiBvciBvZmYKKyAgICAgKgorICAgICAqIEBwYXJhbSBib29sICRkZWJ1ZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXREZWJ1ZygkZGVidWcpCisgICAgeworICAgICAgICAkdGhpcy0+ZGVidWdfID0gJGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgaG9zdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3N0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+aG9zdF87CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZW1vdGUgcG9ydCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bworICAgICAqCisgICAgICogQHJldHVybiBpbnQgcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cG9ydF87CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbCB0cnVlIGlmIHRoZSBzb2NrZXQgaXMgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzX3Jlc291cmNlKCR0aGlzLT5oYW5kbGVfKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVtcHR5KCR0aGlzLT5ob3N0XykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiBudWxsIGhvc3QnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJHRoaXMtPnBvcnRfIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiB3aXRob3V0IHBvcnQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJHRoaXMtPnBlcnNpc3RfKSB7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IEBwZnNvY2tvcGVuKAorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XywKKyAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgICAgICRlcnJzdHIsCisgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApCisgICAgICAgICAgICApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAZnNvY2tvcGVuKAorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XywKKyAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAgICAgJGVycm5vLAorICAgICAgICAgICAgICAgICRlcnJzdHIsCisgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAnICgnIC4gJGVycnN0ciAuICcgWycgLiAkZXJybm8gLiAnXSknOworICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdzb2NrZXRfaW1wb3J0X3N0cmVhbScpICYmIGZ1bmN0aW9uX2V4aXN0cygnc29ja2V0X3NldF9vcHRpb24nKSkgeworICAgICAgICAgICAgJHNvY2tldCA9IHNvY2tldF9pbXBvcnRfc3RyZWFtKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgICAgIHNvY2tldF9zZXRfb3B0aW9uKCRzb2NrZXQsIFNPTF9UQ1AsIFRDUF9OT0RFTEFZLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc29ja2V0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZnJvbSB0aGUgc29ja2V0IGF0IG1vc3QgJGxlbiBieXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IHdhaXQgZm9yIGFsbCB0aGUgcmVxdWVzdGVkIGRhdGEsIGl0IHdpbGwgcmV0dXJuIGFzCisgICAgICogc29vbiBhcyBhbnkgZGF0YSBpcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICAgICAqIEByZXR1cm4gc3RyaW5nIEJpbmFyeSBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRudWxsID0gbnVsbDsKKyAgICAgICAgJHJlYWQgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICRyZWFkYWJsZSA9IEBzdHJlYW1fc2VsZWN0KAorICAgICAgICAgICAgJHJlYWQsCisgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXywKKyAgICAgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFVzZWNfCisgICAgICAgICk7CisKKyAgICAgICAgaWYgKCRyZWFkYWJsZSA+IDApIHsKKyAgICAgICAgICAgICRkYXRhID0gZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOworICAgICAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkZGF0YSA9PSAnJyAmJiBmZW9mKCR0aGlzLT5oYW5kbGVfKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0IHJlYWQgMCBieXRlcycpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgICAgIH0gZWxzZWlmICgkcmVhZGFibGUgPT09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiB0aW1lZCBvdXQgcmVhZGluZyAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0byB0aGUgc29ja2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkbnVsbCA9IG51bGw7CisgICAgICAgICR3cml0ZSA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKKworICAgICAgICAvLyBrZWVwIHdyaXRpbmcgdW50aWwgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4KKyAgICAgICAgd2hpbGUgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSA+IDApIHsKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHN0cmVhbSB0byBiZWNvbWUgYXZhaWxhYmxlIGZvciB3cml0aW5nCisgICAgICAgICAgICAkd3JpdGFibGUgPSBAc3RyZWFtX3NlbGVjdCgKKyAgICAgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICAgICAkd3JpdGUsCisgICAgICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXywKKyAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmICgkd3JpdGFibGUgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgYnVmZmVyIHRvIHN0cmVhbQorICAgICAgICAgICAgICAgICR3cml0dGVuID0gZndyaXRlKCR0aGlzLT5oYW5kbGVfLCAkYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAoJHdyaXR0ZW4gPT09IC0xIHx8ICR3cml0dGVuID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJyAuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSAuICcgYnl0ZXMgJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSBidWZmZXIgaXMgbGVmdCB0byB3cml0ZQorICAgICAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJHdyaXR0ZW4pOworICAgICAgICAgICAgfSBlbHNlaWYgKCR3cml0YWJsZSA9PT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogdGltZWQgb3V0IHdyaXRpbmcgJyAuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJyAuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSAuICcgYnl0ZXMgJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBvdXRwdXQgdG8gdGhlIHNvY2tldC4KKyAgICAgKgorICAgICAqIFNpbmNlIHJlYWQoKSwgcmVhZEFsbCgpIGFuZCB3cml0ZSgpIG9wZXJhdGUgb24gdGhlIHNvY2tldHMgZGlyZWN0bHksCisgICAgICogdGhpcyBpcyBhIG5vLW9wCisgICAgICoKKyAgICAgKiBJZiB5b3Ugd2lzaCB0byBoYXZlIGZsdXNoYWJsZSBidWZmZXJpbmcgYmVoYXZpb3VyLCB3cmFwIHRoaXMgVFNvY2tldAorICAgICAqIGluIGEgVEJ1ZmZlcmVkVHJhbnNwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCisgICAgeworICAgICAgICAvLyBuby1vcAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOWU4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwCkBAIC0wLDAgKzEsMzEwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247CisKKy8qKgorICogVGhpcyBsaWJyYXJ5IG1ha2VzIHVzZSBvZiBBUEMgY2FjaGUgdG8gbWFrZSBob3N0cyBhcyBkb3duIGluIGEgd2ViCisgKiBlbnZpcm9ubWVudC4gSWYgeW91IGFyZSBydW5uaW5nIGZyb20gdGhlIENMSSBvciBvbiBhIHN5c3RlbSB3aXRob3V0IEFQQworICogaW5zdGFsbGVkLCB0aGVuIHRoZXNlIG51bGwgZnVuY3Rpb25zIHdpbGwgc3RlcCBpbiBhbmQgYWN0IGxpa2UgY2FjaGUKKyAqIG1pc3Nlcy4KKyAqLworaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FwY19mZXRjaCcpKSB7CisgICAgZnVuY3Rpb24gYXBjX2ZldGNoKCRrZXkpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZnVuY3Rpb24gYXBjX3N0b3JlKCRrZXksICR2YXIsICR0dGwgPSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyoqCisgKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZSB0aGF0IGFsbG93cyBjb25uZWN0aW9uCisgKiB0byBhIHBvb2wgb2Ygc2VydmVycy4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRTb2NrZXRQb29sIGV4dGVuZHMgVFNvY2tldAoreworICAgIC8qKgorICAgICAqIFJlbW90ZSBzZXJ2ZXJzLiBBcnJheSBvZiBhc3NvY2lhdGl2ZSBhcnJheXMgd2l0aCAnaG9zdCcgYW5kICdwb3J0JyBrZXlzCisgICAgICovCisgICAgcHJpdmF0ZSAkc2VydmVyc18gPSBhcnJheSgpOworCisgICAgLyoqCisgICAgICogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QKKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJpdmF0ZSAkbnVtUmV0cmllc18gPSAxOworCisgICAgLyoqCisgICAgICogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KKyAgICAgKiBtYXJrZWQgYXMgZG93bi4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJpdmF0ZSAkcmV0cnlJbnRlcnZhbF8gPSA2MDsKKworICAgIC8qKgorICAgICAqIE1heCBjb25zZWN1dGl2ZSBmYWlsdXJlcyBiZWZvcmUgbWFya2luZyBhIGhvc3QgZG93bi4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJpdmF0ZSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAxOworCisgICAgLyoqCisgICAgICogVHJ5IGhvc3RzIGluIG9yZGVyPyBvciBSYW5kb21pemVkPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkcmFuZG9taXplXyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgdHJ5IGxhc3QgaG9zdCwgZXZlbiBpZiBtYXJrZWQgZG93bj8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJGFsd2F5c1RyeUxhc3RfID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJyYXkgJGhvc3RzIExpc3Qgb2YgcmVtb3RlIGhvc3RuYW1lcworICAgICAqIEBwYXJhbSBtaXhlZCAkcG9ydHMgQXJyYXkgb2YgcmVtb3RlIHBvcnRzLCBvciBhIHNpbmdsZSBjb21tb24gcG9ydAorICAgICAqIEBwYXJhbSBib29sICRwZXJzaXN0IFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKKyAgICAgKiBAcGFyYW0gbWl4ZWQgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiBmb3IgZXJyb3IgbG9nZ2luZworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKKyAgICAgICAgJGhvc3RzID0gYXJyYXkoJ2xvY2FsaG9zdCcpLAorICAgICAgICAkcG9ydHMgPSBhcnJheSg5MDkwKSwKKyAgICAgICAgJHBlcnNpc3QgPSBmYWxzZSwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdChudWxsLCAwLCAkcGVyc2lzdCwgJGRlYnVnSGFuZGxlcik7CisKKyAgICAgICAgaWYgKCFpc19hcnJheSgkcG9ydHMpKSB7CisgICAgICAgICAgICAkcG9ydCA9ICRwb3J0czsKKyAgICAgICAgICAgICRwb3J0cyA9IGFycmF5KCk7CisgICAgICAgICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkdmFsKSB7CisgICAgICAgICAgICAgICAgJHBvcnRzWyRrZXldID0gJHBvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkaG9zdCkgeworICAgICAgICAgICAgJHRoaXMtPnNlcnZlcnNfIFtdID0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LAorICAgICAgICAgICAgICAgICdwb3J0JyA9PiAkcG9ydHNbJGtleV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHByZXZlbnQgeW91IGZyb20gYWRkaW5nIGEgZHVwbGljYXRlIHNlcnZlciBlbnRyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgaG9zdG5hbWUgb3IgSVAKKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU2VydmVyKCRob3N0LCAkcG9ydCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zZXJ2ZXJzX1tdID0gYXJyYXkoJ2hvc3QnID0+ICRob3N0LCAncG9ydCcgPT4gJHBvcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IG1hbnkgdGltZSB0byBrZWVwIHJldHJ5aW5nIGEgaG9zdCBpbiB0aGUgY29ubmVjdCBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TnVtUmV0cmllcygkbnVtUmV0cmllcykKKyAgICB7CisgICAgICAgICR0aGlzLT5udW1SZXRyaWVzXyA9ICRudW1SZXRyaWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCByZXRyeWluZyBhIGhvc3QgaWYgaXQgd2FzIG1hcmtlZCBkb3duCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFJldHJ5SW50ZXJ2YWwoJHJldHJ5SW50ZXJ2YWwpCisgICAgeworICAgICAgICAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gPSAkcmV0cnlJbnRlcnZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgYmVmb3JlIG1hcmtpbmcgaXQgYXMgZG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0TWF4Q29uc2VjdXRpdmVGYWlsdXJlcygkbWF4Q29uc2VjdXRpdmVGYWlsdXJlcykKKyAgICB7CisgICAgICAgICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9ICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR1cm5zIHJhbmRvbWl6YXRpb24gaW4gY29ubmVjdCBvcmRlciBvbiBvciBvZmYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9vbCAkcmFuZG9taXplCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFJhbmRvbWl6ZSgkcmFuZG9taXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJhbmRvbWl6ZV8gPSAkcmFuZG9taXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9vbCAkYWx3YXlzVHJ5TGFzdAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRBbHdheXNUcnlMYXN0KCRhbHdheXNUcnlMYXN0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFsd2F5c1RyeUxhc3RfID0gJGFsd2F5c1RyeUxhc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldCBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgdGhlIHNlcnZlcnMgaW4gdGhlIHBvb2wKKyAgICAgKiBhbmQgdHJ5aW5nIHRvIGZpbmQgb25lIHRoYXQgd29ya3MuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2Ugd2FudCBvcmRlciByYW5kb21pemF0aW9uCisgICAgICAgIGlmICgkdGhpcy0+cmFuZG9taXplXykgeworICAgICAgICAgICAgc2h1ZmZsZSgkdGhpcy0+c2VydmVyc18pOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ291bnQgc2VydmVycyB0byBpZGVudGlmeSB0aGUgImxhc3QiIG9uZQorICAgICAgICAkbnVtU2VydmVycyA9IGNvdW50KCR0aGlzLT5zZXJ2ZXJzXyk7CisKKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG51bVNlcnZlcnM7ICsrJGkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgZXh0cmFjdHMgdGhlICRob3N0IGFuZCAkcG9ydCB2YXJpYWJsZXMKKyAgICAgICAgICAgIGV4dHJhY3QoJHRoaXMtPnNlcnZlcnNfWyRpXSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIEFQQyBjYWNoZSBmb3IgYSByZWNvcmQgb2YgdGhpcyBzZXJ2ZXIgYmVpbmcgZG93bgorICAgICAgICAgICAgJGZhaWx0aW1lS2V5ID0gJ3RocmlmdF9mYWlsdGltZTonIC4gJGhvc3QgLiAnOicgLiAkcG9ydCAuICd+JzsKKworICAgICAgICAgICAgLy8gQ2FjaGUgbWlzcz8gQXNzdW1lIGl0J3MgT0sKKyAgICAgICAgICAgICRsYXN0RmFpbHRpbWUgPSBhcGNfZmV0Y2goJGZhaWx0aW1lS2V5KTsKKyAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID09PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICRsYXN0RmFpbHRpbWUgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBDYWNoZSBoaXQuLi5tYWtlIHN1cmUgZW5vdWdoIHRoZSByZXRyeSBpbnRlcnZhbCBoYXMgZWxhcHNlZAorICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgJGVsYXBzZWQgPSB0aW1lKCkgLSAkbGFzdEZhaWx0aW1lOworICAgICAgICAgICAgICAgIGlmICgkZWxhcHNlZCA+ICR0aGlzLT5yZXRyeUludGVydmFsXykgeworICAgICAgICAgICAgICAgICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IHJldHJ5SW50ZXJ2YWwgJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnIC4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfIC4gJykgJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBwYXNzZWQgZm9yIGhvc3QgJyAuICRob3N0IC4gJzonIC4gJHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE9ubHkgY29ubmVjdCBpZiBub3QgaW4gdGhlIG1pZGRsZSBvZiBhIGZhaWwgaW50ZXJ2YWwsIE9SIGlmIHRoaXMKKyAgICAgICAgICAgIC8vIGlzIHRoZSBMQVNUIHNlcnZlciB3ZSBhcmUgdHJ5aW5nLCBqdXN0IGhhbW1lciBhd2F5IG9uIGl0CisgICAgICAgICAgICAkaXNMYXN0U2VydmVyID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoJHRoaXMtPmFsd2F5c1RyeUxhc3RfKSB7CisgICAgICAgICAgICAgICAgJGlzTGFzdFNlcnZlciA9ICgkaSA9PSAoJG51bVNlcnZlcnMgLSAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoJGxhc3RGYWlsdGltZSA9PT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoJGlzTGFzdFNlcnZlcikgfHwKKyAgICAgICAgICAgICAgICAoJGxhc3RGYWlsdGltZSA+IDAgJiYgJHJldHJ5SW50ZXJ2YWxQYXNzZWQpKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHVuZGVybHlpbmcgVFNvY2tldCBwYXJhbXMgdG8gdGhpcyBvbmUKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKworICAgICAgICAgICAgICAgIC8vIFRyeSB1cCB0byBudW1SZXRyaWVzXyBjb25uZWN0aW9ucyBwZXIgc2VydmVyCisgICAgICAgICAgICAgICAgZm9yICgkYXR0ZW1wdCA9IDA7ICRhdHRlbXB0IDwgJHRoaXMtPm51bVJldHJpZXNfOyAkYXR0ZW1wdCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIHVuZGVybHlpbmcgVFNvY2tldCBvcGVuIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6Om9wZW4oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBjbGVhciB0aGUgZmFpbHVyZSBjb3VudHMgaWYgcmVxdWlyZWQgdG8gZG8gc28KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzZnVsIGNvbm5lY3Rpb24sIHJldHVybiBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAkdHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gZmFpbGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBNYXJrIGZhaWx1cmUgb2YgdGhpcyBob3N0IGluIHRoZSBjYWNoZQorICAgICAgICAgICAgICAgICRjb25zZWNmYWlsc0tleSA9ICd0aHJpZnRfY29uc2VjZmFpbHM6JyAuICRob3N0IC4gJzonIC4gJHBvcnQgLiAnfic7CisKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY2FjaGUgbWlzc2VzCisgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzID0gYXBjX2ZldGNoKCRjb25zZWNmYWlsc0tleSk7CisgICAgICAgICAgICAgICAgaWYgKCRjb25zZWNmYWlscyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgYnkgb25lCisgICAgICAgICAgICAgICAgJGNvbnNlY2ZhaWxzKys7CisKKyAgICAgICAgICAgICAgICAvLyBMb2cgYW5kIGNhY2hlIHRoaXMgZmFpbHVyZQorICAgICAgICAgICAgICAgIGlmICgkY29uc2VjZmFpbHMgPj0gJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVidWdIYW5kbGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IG1hcmtpbmcgJyAuICRob3N0IC4gJzonIC4gJHBvcnQgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgYXMgZG93biBmb3IgJyAuICR0aGlzLT5yZXRyeUludGVydmFsXyAuICcgc2VjcyAnIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWZ0ZXIgJyAuICRjb25zZWNmYWlscyAuICcgZmFpbGVkIGF0dGVtcHRzLicKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGZhaWx1cmUgdGltZQorICAgICAgICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCB0aW1lKCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjb3VudCBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcworICAgICAgICAgICAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhcGNfc3RvcmUoJGNvbnNlY2ZhaWxzS2V5LCAkY29uc2VjZmFpbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE9oIG5vOyB3ZSBmYWlsZWQgdGhlbSBhbGwuIFRoZSBzeXN0ZW0gaXMgdG90YWxseSBpbGwhCisgICAgICAgICRlcnJvciA9ICdUU29ja2V0UG9vbDogQWxsIGhvc3RzIGluIHBvb2wgYXJlIGRvd24uICc7CisgICAgICAgICRob3N0cyA9IGFycmF5KCk7CisgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5zZXJ2ZXJzXyBhcyAkc2VydmVyKSB7CisgICAgICAgICAgICAkaG9zdHMgW10gPSAkc2VydmVyWydob3N0J10gLiAnOicgLiAkc2VydmVyWydwb3J0J107CisgICAgICAgIH0KKyAgICAgICAgJGhvc3RsaXN0ID0gaW1wbG9kZSgnLCcsICRob3N0cyk7CisgICAgICAgICRlcnJvciAuPSAnKCcgLiAkaG9zdGxpc3QgLiAnKSc7CisgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkyMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsOTggQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogQmFzZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNwb3J0IGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcvd3JpdGluZworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIG9wZW4oKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKTsKKworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZnVsbCBhbW91bnQgb2YgZGF0YSBpcyByZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEsIG9mIGV4YWN0IGxlbmd0aAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBkYXRhCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikKKyAgICB7CisgICAgICAgIC8vIHJldHVybiAkdGhpcy0+cmVhZCgkbGVuKTsKKworICAgICAgICAkZGF0YSA9ICcnOworICAgICAgICAkZ290ID0gMDsKKyAgICAgICAgd2hpbGUgKCgkZ290ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSkgPCAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSAuPSAkdGhpcy0+cmVhZCgkbGVuIC0gJGdvdCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBnaXZlbiBkYXRhIG91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB3cml0aW5nIGZhaWxzCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpOworCisgICAgLyoqCisgICAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIGJ1ZmZlcgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RDb25zdGFudC5waHAgYi9saWIvcGhwL2xpYi9UeXBlL1RDb25zdGFudC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1ZGE0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1R5cGUvVENvbnN0YW50LnBocApAQCAtMCwwICsxLDUyIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgY29uc3RhbnQgTWFuYWdlbWVudAorICovCithYnN0cmFjdCBjbGFzcyBUQ29uc3RhbnQKK3sKKyAgICAvKioKKyAgICAgKiBEb24ndCBpbnN0YW5jaWF0ZSB0aGlzIGNsYXNzCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgY29uc3RhbnQgdmFsdWUKKyAgICAgKiBAcGFyYW0gIHN0cmluZyAkY29uc3RhbnQKKyAgICAgKiBAcmV0dXJuIG1peGVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXQoJGNvbnN0YW50KQorICAgIHsKKyAgICAgICAgaWYgKGlzX251bGwoc3RhdGljOjokJGNvbnN0YW50KSkgeworICAgICAgICAgICAgc3RhdGljOjokJGNvbnN0YW50ID0gY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgc3ByaW50Zignc3RhdGljOjppbml0XyVzJywgJGNvbnN0YW50KQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGF0aWM6OiQkY29uc3RhbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwIGIvbGliL3BocC9saWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOWFlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAKQEAgLTAsMCArMSwzNCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQworICovCitjbGFzcyBUTWVzc2FnZVR5cGUKK3sKKyAgICBjb25zdCBDQUxMICA9IDE7CisgICAgY29uc3QgUkVQTFkgPSAyOworICAgIGNvbnN0IEVYQ0VQVElPTiA9IDM7CisgICAgY29uc3QgT05FV0FZID0gNDsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVFR5cGUucGhwIGIvbGliL3BocC9saWIvVHlwZS9UVHlwZS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkYjE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1R5cGUvVFR5cGUucGhwCkBAIC0wLDAgKzEsNDcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAorICovCitjbGFzcyBUVHlwZQoreworICAgIGNvbnN0IFNUT1AgICA9IDA7CisgICAgY29uc3QgVk9JRCAgID0gMTsKKyAgICBjb25zdCBCT09MICAgPSAyOworICAgIGNvbnN0IEJZVEUgICA9IDM7CisgICAgY29uc3QgSTA4ICAgID0gMzsKKyAgICBjb25zdCBET1VCTEUgPSA0OworICAgIGNvbnN0IEkxNiAgICA9IDY7CisgICAgY29uc3QgSTMyICAgID0gODsKKyAgICBjb25zdCBJNjQgICAgPSAxMDsKKyAgICBjb25zdCBTVFJJTkcgPSAxMTsKKyAgICBjb25zdCBVVEY3ICAgPSAxMTsKKyAgICBjb25zdCBTVFJVQ1QgPSAxMjsKKyAgICBjb25zdCBNQVAgICAgPSAxMzsKKyAgICBjb25zdCBTRVQgICAgPSAxNDsKKyAgICBjb25zdCBMU1QgICAgPSAxNTsgICAgLy8gTi5CLiBjYW5ub3QgdXNlIExJU1Qga2V5d29yZCBpbiBQSFAhCisgICAgY29uc3QgVVRGOCAgID0gMTY7CisgICAgY29uc3QgVVRGMTYgID0gMTc7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9UU3RyaW5nVXRpbHMucGhwIGIvbGliL3BocC9zcmMvVFN0cmluZ1V0aWxzLnBocAppbmRleCA2OTY3MmU4Li44OTRiYWY4IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9UU3RyaW5nVXRpbHMucGhwCisrKyBiL2xpYi9waHAvc3JjL1RTdHJpbmdVdGlscy5waHAKQEAgLTEsMjggKzEsMzMgQEAKIDw/cGhwCiAKLWludGVyZmFjZSBUU3RyaW5nRnVuYyB7CitpbnRlcmZhY2UgVFN0cmluZ0Z1bmMKK3sKICAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpOwogICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cik7CiB9CiAKIGNsYXNzIFRTdHJpbmdGdW5jX0NvcmUKIGltcGxlbWVudHMgVFN0cmluZ0Z1bmMgewotICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkgeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoID0gbnVsbCkKKyAgICB7CiAgICAgICAgIC8vIHNwZWNpZnlpbmcgYSBudWxsICRsZW5ndGggd291bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZwotICAgICAgICBpZigkbGVuZ3RoID09PSBudWxsKSB7CisgICAgICAgIGlmICgkbGVuZ3RoID09PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCk7CiAgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCk7CiAgICAgfQogCi0gICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKSB7CisgICAgcHVibGljIGZ1bmN0aW9uIHN0cmxlbigkc3RyKQorICAgIHsKICAgICAgICAgcmV0dXJuIHN0cmxlbigkc3RyKTsKICAgICB9CiB9CiAKIGNsYXNzIFRTdHJpbmdGdW5jX01ic3RyaW5nCiBpbXBsZW1lbnRzIFRTdHJpbmdGdW5jIHsKLSAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpIHsKKyAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3RyKCRzdHIsICRzdGFydCwgJGxlbmd0aCA9IG51bGwpCisgICAgewogICAgICAgICAvKioKICAgICAgICAgICogV2UgbmVlZCB0byBzZXQgdGhlIGNoYXJzZXQgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgc2Vjb25kCiAgICAgICAgICAqIG9wdGlvbmFsIHBhcmFtZXRlciBhbmQgdGhlIGZpcnN0IG9wdGlvbmFsIHBhcmFtZXRlciBjYW4ndApAQCAtMzAsMTkgKzM1LDIxIEBACiAgICAgICAgICAqIGNhdXNlIGFuIGVtcHR5IHN0cmluZyB0byBiZSByZXR1cm5lZCwgc28gd2UgbmVlZCB0bwogICAgICAgICAgKiBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIHByb3BlciBsZW5ndGggdmFsdWUuCiAgICAgICAgICAqLwotICAgICAgICBpZigkbGVuZ3RoID09PSBudWxsKSB7CisgICAgICAgIGlmICgkbGVuZ3RoID09PSBudWxsKSB7CiAgICAgICAgICAgICAkbGVuZ3RoID0gJHRoaXMtPnN0cmxlbigkc3RyKSAtICRzdGFydDsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBtYl9zdWJzdHIoJHN0ciwgJHN0YXJ0LCAkbGVuZ3RoLCAnOGJpdCcpOwogICAgIH0KIAotICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikgeworICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJsZW4oJHN0cikKKyAgICB7CiAgICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKICAgICB9CiB9CiAKLWNsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeSB7CitjbGFzcyBUU3RyaW5nRnVuY0ZhY3RvcnkKK3sKICAgICBwcml2YXRlIHN0YXRpYyAkX2luc3RhbmNlOwogCiAgICAgLyoqCkBAIC01MSwyMiArNTgsMjQgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gVFN0cmluZ0Z1bmMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpIHsKLSAgICAgICAgaWYoIXNlbGY6OiRfaW5zdGFuY2UpIHsKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpCisgICAgeworICAgICAgICBpZiAoIXNlbGY6OiRfaW5zdGFuY2UpIHsKICAgICAgICAgICAgIHNlbGY6Ol9zZXRJbnN0YW5jZSgpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHNlbGY6OiRfaW5zdGFuY2U7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gX3NldEluc3RhbmNlKCkgeworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCisgICAgewogICAgICAgICAvKioKICAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQogICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KICAgICAgICAgICoKICAgICAgICAgICogU2VlOiBodHRwOi8vdXMucGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCiAgICAgICAgICAqLwotICAgICAgICBpZihpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CisgICAgICAgIGlmIChpbmlfZ2V0KCdtYnN0cmluZy5mdW5jX292ZXJsb2FkJykgJiAyKSB7CiAgICAgICAgICAgICBzZWxmOjokX2luc3RhbmNlID0gbmV3IFRTdHJpbmdGdW5jX01ic3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgICAgLyoqCmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9UaHJpZnQucGhwIGIvbGliL3BocC9zcmMvVGhyaWZ0LnBocAppbmRleCBjODQ1Mzk1Li40ZmU0MzkyIDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9UaHJpZnQucGhwCisrKyBiL2xpYi9waHAvc3JjL1RocmlmdC5waHAKQEAgLTIwLDExICsyMCwxMSBAQAogICogQHBhY2thZ2UgdGhyaWZ0CiAgKi8KIAotCiAvKioKICAqIERhdGEgdHlwZXMgdGhhdCBjYW4gYmUgc2VudCB2aWEgVGhyaWZ0CiAgKi8KLWNsYXNzIFRUeXBlIHsKK2NsYXNzIFRUeXBlCit7CiAgIGNvbnN0IFNUT1AgICA9IDA7CiAgIGNvbnN0IFZPSUQgICA9IDE7CiAgIGNvbnN0IEJPT0wgICA9IDI7CkBAIC00Nyw3ICs0Nyw4IEBACiAvKioKICAqIE1lc3NhZ2UgdHlwZXMgZm9yIFJQQwogICovCi1jbGFzcyBUTWVzc2FnZVR5cGUgeworY2xhc3MgVE1lc3NhZ2VUeXBlCit7CiAgIGNvbnN0IENBTEwgID0gMTsKICAgY29uc3QgUkVQTFkgPSAyOwogICBjb25zdCBFWENFUFRJT04gPSAzOwpAQCAtNjcsOCArNjgsMTAgQEAKICAqIEBwYXJhbSBtaXhlZCAkcDEgTWVzc2FnZSAoc3RyaW5nKSBvciB0eXBlLXNwZWMgKGFycmF5KQogICogQHBhcmFtIG1peGVkICRwMiBDb2RlIChpbnRlZ2VyKSBvciB2YWx1ZXMgKGFycmF5KQogICovCi1jbGFzcyBURXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHAxPW51bGwsICRwMj0wKSB7CitjbGFzcyBURXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCit7CisgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcDE9bnVsbCwgJHAyPTApCisgIHsKICAgICBpZiAoaXNfYXJyYXkoJHAxKSAmJiBpc19hcnJheSgkcDIpKSB7CiAgICAgICAkc3BlYyA9ICRwMTsKICAgICAgICR2YWxzID0gJHAyOwpAQCAtOTEsNyArOTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKIAotICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CiAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CkBAIC0xNTQsMTAgKzE1OCwxMiBAQAogICAgICAgJHZhclska2V5XSA9ICR2YWw7CiAgICAgfQogICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZE1hcEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGVyZWFkID0gJHZyZWFkID0gbnVsbDsKQEAgLTIwNywxMCArMjEzLDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KSB7CisgIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGZuYW1lID0gbnVsbDsKICAgICAkZnR5cGUgPSAwOwpAQCAtMjU2LDEwICsyNjQsMTIgQEAKICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CiAgICAgfQogICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVNYXAoJHZhciwgJHNwZWMsICRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGt0eXBlID0gJHNwZWNbJ2t0eXBlJ107CiAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CkBAIC0zMTQsMTAgKzMyNCwxMiBAQAogICAgICAgfQogICAgIH0KICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkZXR5cGUgPSAkc3BlY1snZXR5cGUnXTsKICAgICAkZXdyaXRlID0gbnVsbDsKQEAgLTM1NywxMCArMzY5LDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwogICAgIH0KKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbigkY2xhc3MpOwogICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CkBAIC0zOTIsNiArNDA2LDcgQEAKICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKQEAgLTQwNCw4ICs0MTksOCBAQAogICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKICAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgogICovCi1hYnN0cmFjdCBjbGFzcyBUQmFzZSB7Ci0KK2Fic3RyYWN0IGNsYXNzIFRCYXNlCit7CiAgIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KFRUeXBlOjpCT09MICAgPT4gJ0Jvb2wnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6QllURSAgID0+ICdCeXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkkxNiAgICA9PiAnSTE2JywKQEAgLTQxNCwxMSArNDI5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycpOwogCi0gIGFic3RyYWN0IGZ1bmN0aW9uIHJlYWQoJGlucHV0KTsKKyAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KTsKIAotICBhYnN0cmFjdCBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKKyAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpOwogCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYz1udWxsLCAkdmFscz1udWxsKSB7CisgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYz1udWxsLCAkdmFscz1udWxsKQorICB7CiAgICAgaWYgKGlzX2FycmF5KCRzcGVjKSAmJiBpc19hcnJheSgkdmFscykpIHsKICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CiAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwpAQCAtNDI5LDcgKzQ0NSw4IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkgeworICBwcml2YXRlIGZ1bmN0aW9uIF9yZWFkTWFwKCYkdmFyLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtNDkyLDEwICs1MDksMTIgQEAKICAgICAgICR2YXJbJGtleV0gPSAkdmFsOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwogICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CkBAIC01NDUsMTAgKzU2NCwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CiAgICAgfQorCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiAKLSAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkgeworICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3JlYWQoJGNsYXNzLCAkc3BlYywgJGlucHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRmbmFtZSA9IG51bGw7CiAgICAgJGZ0eXBlID0gMDsKQEAgLTU5NCwxMCArNjE1LDEyIEBACiAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwogICAgIH0KICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KSB7CisgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwogICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwpAQCAtNjUyLDEwICs2NzUsMTIgQEAKICAgICAgIH0KICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKwogICAgIHJldHVybiAkeGZlcjsKICAgfQogCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTGlzdCgkdmFyLCAkc3BlYywgJG91dHB1dCwgJHNldD1mYWxzZSkgeworICBwcml2YXRlIGZ1bmN0aW9uIF93cml0ZUxpc3QoJHZhciwgJHNwZWMsICRvdXRwdXQsICRzZXQ9ZmFsc2UpCisgIHsKICAgICAkeGZlciA9IDA7CiAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CiAgICAgJGV3cml0ZSA9IG51bGw7CkBAIC02OTUsMTAgKzcyMCwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsKICAgICB9CisKICAgICByZXR1cm4gJHhmZXI7CiAgIH0KIAotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX3dyaXRlKCRjbGFzcywgJHNwZWMsICRvdXRwdXQpIHsKKyAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICB7CiAgICAgJHhmZXIgPSAwOwogICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJGNsYXNzKTsKICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewpAQCAtNzMwLDExICs3NTcsMTMgQEAKICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiB9CiAKLWNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24geworY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgorewogICBzdGF0aWMgJF9UU1BFQyA9CiAgICAgYXJyYXkoMSA9PiBhcnJheSgndmFyJyA9PiAnbWVzc2FnZScsCiAgICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OlNUUklORyksCkBAIC03NTAsMTUgKzc3OSwxOCBAQAogICBjb25zdCBJTlRFUk5BTF9FUlJPUiA9IDY7CiAgIGNvbnN0IFBST1RPQ09MX0VSUk9SID0gNzsKIAotICBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKSB7CisgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKQorICB7CiAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwogICB9CiAKLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJG91dHB1dCkgeworICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQorICB7CiAgICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7CiAgIH0KIAotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkgeworICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG91dHB1dCkKKyAgewogICAgICR4ZmVyID0gMDsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCdUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKICAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7CkBAIC03NzMsNiArODA1LDcgQEAKICAgICB9CiAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCiAgICAgcmV0dXJuICR4ZmVyOwogICB9CiB9CkBAIC03ODYsNCArODE5LDMgQEAKIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3Byb3RvY29sL1RQcm90b2NvbC5waHAnOwogaW5jbHVkZV9vbmNlICRHTE9CQUxTWydUSFJJRlRfUk9PVCddLicvdHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwJzsKIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL1RTdHJpbmdVdGlscy5waHAnOwotCmRpZmYgLS1naXQgYS9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAgYi9saWIvcGhwL3NyYy9hdXRvbG9hZC5waHAKaW5kZXggM2EzNTU0NS4uODViZDc5NyAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvYXV0b2xvYWQucGhwCisrKyBiL2xpYi9waHAvc3JjL2F1dG9sb2FkLnBocApAQCAtMjAsNyArMjAsNiBAQAogICogQHBhY2thZ2UgdGhyaWZ0CiAgKi8KIAotCiAvKioKICAqIEluY2x1ZGUgdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVzZSBhdXRvbG9hZCB3aXRoIHlvdXIgUEhQIGdlbmVyYXRlZCBUaHJpZnQKICAqIGNvZGUuIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsICpub3QqIGluY2x1ZGUgYW55IGRlZmluZWQgVGhyaWZ0IGNsYXNzZXMgYnkKQEAgLTM3LDEyICszNiwxMyBAQAogJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10gPSBhcnJheSgpOwogCiBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnX19hdXRvbG9hZCcpKSB7Ci0gIGZ1bmN0aW9uIF9fYXV0b2xvYWQoJGNsYXNzKSB7CisgIGZ1bmN0aW9uIF9fYXV0b2xvYWQoJGNsYXNzKQorICB7CiAgICAgZ2xvYmFsICRUSFJJRlRfQVVUT0xPQUQ7CiAgICAgJGNsYXNzbCA9IHN0cnRvbG93ZXIoJGNsYXNzKTsKICAgICBpZiAoaXNzZXQoJFRIUklGVF9BVVRPTE9BRFskY2xhc3NsXSkpIHsKICAgICAgIGluY2x1ZGVfb25jZSAkR0xPQkFMU1snVEhSSUZUX1JPT1QnXS4nL3BhY2thZ2VzLycuJFRIUklGVF9BVVRPTE9BRFskY2xhc3NsXTsKLSAgICB9IGVsc2UgaWYgKCFlbXB0eSgkR0xPQkFMU1snQVVUT0xPQURfSE9PS1MnXSkpIHsKKyAgICB9IGVsc2VpZiAoIWVtcHR5KCRHTE9CQUxTWydBVVRPTE9BRF9IT09LUyddKSkgewogICAgICAgZm9yZWFjaCAoJEdMT0JBTFNbJ0FVVE9MT0FEX0hPT0tTJ10gYXMgJGhvb2spIHsKICAgICAgICAgJGhvb2soJGNsYXNzKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlnLm00IGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKaW5kZXggMmMzMzhhMC4uZTIxMzhjOCAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQKQEAgLTIsMTQgKzIsMzMgQEAKIGRubCBDb3B5aW5nIGFuZCBkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogZG5sIGFyZSBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodAogZG5sIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4KK2RubAorZG5sIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK2RubCBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZG5sIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCitkbmwgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCitkbmwgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorZG5sICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK2RubCB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK2RubAorZG5sICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK2RubAorZG5sIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK2RubCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorZG5sICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorZG5sIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitkbmwgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworZG5sIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBQSFBfQVJHX0VOQUJMRSh0aHJpZnRfcHJvdG9jb2wsIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uLAotWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgZmJ0aHJpZnRfcHJvdG9jb2wgZXh0ZW5zaW9uXSkKK1sgIC0tZW5hYmxlLXRocmlmdF9wcm90b2NvbAlFbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQogCiBpZiB0ZXN0ICIkUEhQX1RIUklGVF9QUk9UT0NPTCIgIT0gIm5vIjsgdGhlbgogICBQSFBfUkVRVUlSRV9DWFgoKQogICBQSFBfQUREX0xJQlJBUllfV0lUSF9QQVRIKHN0ZGMrKywgIiIsIFRIUklGVF9QUk9UT0NPTF9TSEFSRURfTElCQUREKQogICBQSFBfU1VCU1QoVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCisgIENYWEZMQUdTPSIkQ1hYRkxBR1MgLXN0ZD1jKysxMSIKKwogICBQSFBfTkVXX0VYVEVOU0lPTih0aHJpZnRfcHJvdG9jb2wsIHBocF90aHJpZnRfcHJvdG9jb2wuY3BwLCAkZXh0X3NoYXJlZCkKIGZpCiAKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCmluZGV4IDBkNzQxYzIuLjYzYzg5MDUgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcApAQCAtMTYsMjUgKzE2LDIzIEBACiAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjaWZkZWYgSEFWRV9DT05GSUdfSAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2VuZGlmCiAKKyNpbmNsdWRlICJwaHAuaCIKKyNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKKyNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJwaHBfdGhyaWZ0X3Byb3RvY29sLmgiCisKKyNpZiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMAorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgZGVmaW5lZCggV0lOMzIgKSB8fCBkZWZpbmVkKCBfV0lONjQgKQotdHlwZWRlZiBpbnQgIGludDMyX3Q7IAotdHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIGxvbmcgbG9uZyAgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgICB1aW50MzJfdDsgCi10eXBlZGVmIHNob3J0ICBpbnQxNl90OyAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgdWludDY0X3Q7Ci0jZWxzZQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAKLSNlbmRpZgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaWZuZGVmIGJzd2FwXzY0CiAjZGVmaW5lCWJzd2FwXzY0KHgpICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNTYpIHwgXApAQCAtNTcsMTAgKzU1LDYgQEAKICNlcnJvciBVbmtub3duIF9fQllURV9PUkRFUgogI2VuZGlmCiAKLSNpZm5kZWYgWl9BRERSRUZfUAotI2RlZmluZSBaX0FERFJFRl9QIFpWQUxfQUREUkVGCi0jZW5kaWYKLQogZW51bSBUVHlwZSB7CiAgIFRfU1RPUCAgICAgICA9IDAsCiAgIFRfVk9JRCAgICAgICA9IDEsCkBAIC05MSwyNiArODUsMjIgQEAKIGNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOwogY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKIAotI2luY2x1ZGUgInBocC5oIgotI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgotI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgotI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKLQogc3RhdGljIHplbmRfZnVuY3Rpb25fZW50cnkgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9uc1tdID0gewotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgTlVMTCkKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgTlVMTCkKLSAge05VTEwsIE5VTEwsIE5VTEx9Ci19IDsKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnksIG51bGxwdHIpCisgIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbiwgbnVsbHB0cikKKyAge251bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9Cit9OwogCiB6ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5ID0gewogICBTVEFOREFSRF9NT0RVTEVfSEVBREVSLAogICAidGhyaWZ0X3Byb3RvY29sIiwKICAgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9ucywKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKKyAgbnVsbHB0ciwKICAgIjEuMCIsCiAgIFNUQU5EQVJEX01PRFVMRV9QUk9QRVJUSUVTCiB9OwpAQCAtMTIxLDQyICsxMTEsNjEgQEAKIAogY2xhc3MgUEhQRXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CiBwdWJsaWM6Ci0gIFBIUEV4Y2VwdGlvbldyYXBwZXIoenZhbCogX2V4KSB0aHJvdygpIDogZXgoX2V4KSB7Ci0gICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgZXgpOworICBQSFBFeGNlcHRpb25XcmFwcGVyKHp2YWwqIF9leCkgdGhyb3coKSB7CisgICAgWlZBTF9DT1BZKCZleCwgX2V4KTsKKyAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXgpOwogICB9Ci0gIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIF93aGF0OyB9Ci0gIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7fQotICBvcGVyYXRvciB6dmFsKigpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gY29uc3RfY2FzdDx6dmFsKj4oZXgpOyB9IC8vIFplbmQgQVBJIGRvZXNuJ3QgZG8gJ2NvbnN0Jy4uLgorCisgIFBIUEV4Y2VwdGlvbldyYXBwZXIoemVuZF9vYmplY3QqIF9leG9iaikgdGhyb3coKSB7CisgICAgWlZBTF9PQkooJmV4LCBfZXhvYmopOworICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIF9leG9iaik7CisgIH0KKyAgflBIUEV4Y2VwdGlvbldyYXBwZXIoKSB0aHJvdygpIHsKKyAgICB6dmFsX2R0b3IoJmV4KTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgICByZXR1cm4gX3doYXQ7CisgIH0KKyAgb3BlcmF0b3IgenZhbCooKSBjb25zdCB0aHJvdygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDx6dmFsKj4oJmV4KTsKKyAgfSAvLyBaZW5kIEFQSSBkb2Vzbid0IGRvICdjb25zdCcuLi4KIHByb3RlY3RlZDoKLSAgenZhbCogZXg7CisgIHp2YWwgZXg7CiAgIGNoYXIgX3doYXRbNDBdOwogfSA7CiAKIGNsYXNzIFBIUFRyYW5zcG9ydCB7Ci1wdWJsaWM6Ci0gIHp2YWwqIHByb3RvY29sKCkgeyByZXR1cm4gcDsgfQotICB6dmFsKiB0cmFuc3BvcnQoKSB7IHJldHVybiB0OyB9CiBwcm90ZWN0ZWQ6Ci0gIFBIUFRyYW5zcG9ydCgpIHt9CisgIFBIUFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSkgeworICAgIGFzc2VydChaX1RZUEVfUChfcCkgPT0gSVNfT0JKRUNUKTsKIAotICB2b2lkIGNvbnN0cnVjdF93aXRoX3p2YWwoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUpIHsKKyAgICBaVkFMX1VOREVGKCZ0KTsKKwogICAgIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGVtYWxsb2MoX2J1ZmZlcl9zaXplKSk7CiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKICAgICBidWZmZXJfdXNlZCA9IDA7CiAgICAgYnVmZmVyX3NpemUgPSBfYnVmZmVyX3NpemU7Ci0gICAgcCA9IF9wOwogCiAgICAgLy8gR2V0IHRoZSB0cmFuc3BvcnQgZm9yIHRoZSBwYXNzZWQgcHJvdG9jb2wKICAgICB6dmFsIGdldHRyYW5zcG9ydDsKLSAgICBaVkFMX1NUUklORygmZ2V0dHJhbnNwb3J0LCAiZ2V0VHJhbnNwb3J0IiwgMCk7Ci0gICAgTUFLRV9TVERfWlZBTCh0KTsKLSAgICBaVkFMX05VTEwodCk7Ci0gICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnAsICZnZXR0cmFuc3BvcnQsIHQsIDAsIE5VTEwgVFNSTUxTX0NDKTsKKyAgICBaVkFMX1NUUklORygmZ2V0dHJhbnNwb3J0LCAiZ2V0VHJhbnNwb3J0Iik7CisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKG51bGxwdHIsIF9wLCAmZ2V0dHJhbnNwb3J0LCAmdCwgMCwgbnVsbHB0cik7CisKKyAgICB6dmFsX2R0b3IoJmdldHRyYW5zcG9ydCk7CisKKyAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgfQorCisgICAgYXNzZXJ0KFpfVFlQRSh0KSA9PSBJU19PQkpFQ1QpOwogICB9CisKICAgflBIUFRyYW5zcG9ydCgpIHsKICAgICBlZnJlZShidWZmZXIpOwotICAgIHp2YWxfcHRyX2R0b3IoJnQpOworICAgIHp2YWxfZHRvcigmdCk7CiAgIH0KIAogICBjaGFyKiBidWZmZXI7CkBAIC0xNjQsMjAgKzE3MywxNCBAQAogICBzaXplX3QgYnVmZmVyX3VzZWQ7CiAgIHNpemVfdCBidWZmZXJfc2l6ZTsKIAotICB6dmFsKiBwOwotICB6dmFsKiB0OworICB6dmFsIHQ7CiB9OwogCiAKIGNsYXNzIFBIUE91dHB1dFRyYW5zcG9ydCA6IHB1YmxpYyBQSFBUcmFuc3BvcnQgewogcHVibGljOgotICBQSFBPdXRwdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSB7Ci0gICAgY29uc3RydWN0X3dpdGhfenZhbChfcCwgX2J1ZmZlcl9zaXplKTsKLSAgfQotCi0gIH5QSFBPdXRwdXRUcmFuc3BvcnQoKSB7Ci0gICAgLy9mbHVzaCgpOwotICB9CisgIFBIUE91dHB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsgfQorICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgeyB9CiAKICAgdm9pZCB3cml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7CiAgICAgaWYgKChsZW4gKyBidWZmZXJfdXNlZCkgPiBidWZmZXJfc2l6ZSkgewpAQCAtMjM1LDMyICsyMzgsMzUgQEAKICAgICB9CiAgIH0KICAgdm9pZCBkaXJlY3RGbHVzaCgpIHsKLSAgICB6dmFsIHJldDsKKyAgICB6dmFsIHJldCwgZmx1c2hmbjsKICAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgenZhbCBmbHVzaGZuOwotICAgIFpWQUxfU1RSSU5HKCZmbHVzaGZuLCAiZmx1c2giLCAwKTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJmZsdXNoZm4sICZyZXQsIDAsIE5VTEwgVFNSTUxTX0NDKTsKLSAgICB6dmFsX2R0b3IoJnJldCk7Ci0gIH0KLSAgdm9pZCBkaXJlY3RXcml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7Ci0gICAgenZhbCB3cml0ZWZuOwotICAgIFpWQUxfU1RSSU5HKCZ3cml0ZWZuLCAid3JpdGUiLCAwKTsKLSAgICBjaGFyKiBuZXdidWYgPSAoY2hhciopZW1hbGxvYyhsZW4gKyAxKTsKLSAgICBtZW1jcHkobmV3YnVmLCBkYXRhLCBsZW4pOwotICAgIG5ld2J1ZltsZW5dID0gJ1wwJzsKLSAgICB6dmFsICphcmdzWzFdOwotICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIG5ld2J1ZiwgbGVuLCAwKTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICB6dmFsIHJldDsKLSAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZ3cml0ZWZuLCAmcmV0LCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKyAgICBaVkFMX1NUUklORygmZmx1c2hmbiwgImZsdXNoIik7CisKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmZmx1c2hmbiwgJnJldCwgMCwgbnVsbHB0cik7CisgICAgenZhbF9kdG9yKCZmbHVzaGZuKTsKICAgICB6dmFsX2R0b3IoJnJldCk7CiAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKLSAgICAgIHp2YWwqIGV4ID0gRUcoZXhjZXB0aW9uKTsKLSAgICAgIEVHKGV4Y2VwdGlvbikgPSBOVUxMOworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgfQorICB9CisgIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgeworICAgIHp2YWwgYXJnc1sxXSwgcmV0LCB3cml0ZWZuOworCisgICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIpOworICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgZGF0YSwgbGVuKTsKKworICAgIFpWQUxfTlVMTCgmcmV0KTsKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyk7CisKKyAgICB6dmFsX2R0b3IoJndyaXRlZm4pOworICAgIHp2YWxfZHRvcigmcmV0KTsKKyAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworCisgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOwogICAgIH0KICAgfQpAQCAtMjY4LDggKzI3NCw3IEBACiAKIGNsYXNzIFBIUElucHV0VHJhbnNwb3J0IDogcHVibGljIFBIUFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFBIUElucHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgewotICAgIGNvbnN0cnVjdF93aXRoX3p2YWwoX3AsIF9idWZmZXJfc2l6ZSk7CisgIFBIUElucHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgOiBQSFBUcmFuc3BvcnQoX3AsIF9idWZmZXJfc2l6ZSkgewogICB9CiAKICAgflBIUElucHV0VHJhbnNwb3J0KCkgewpAQCAtMjc4LDI0ICsyODMsMjEgQEAKIAogICB2b2lkIHB1dF9iYWNrKCkgewogICAgIGlmIChidWZmZXJfdXNlZCkgewotICAgICAgenZhbCBwdXRiYWNrZm47Ci0gICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIsIDApOwotCi0gICAgICBjaGFyKiBuZXdidWYgPSAoY2hhciopZW1hbGxvYyhidWZmZXJfdXNlZCArIDEpOwotICAgICAgbWVtY3B5KG5ld2J1ZiwgYnVmZmVyX3B0ciwgYnVmZmVyX3VzZWQpOwotICAgICAgbmV3YnVmW2J1ZmZlcl91c2VkXSA9ICdcMCc7Ci0KLSAgICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICAgICAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIG5ld2J1ZiwgYnVmZmVyX3VzZWQsIDApOwotCi0gICAgICBUU1JNTFNfRkVUQ0goKTsKLQotICAgICAgenZhbCByZXQ7CisgICAgICB6dmFsIGFyZ3NbMV0sIHJldCwgcHV0YmFja2ZuOworICAgICAgWlZBTF9TVFJJTkdMKCZhcmdzWzBdLCBidWZmZXJfcHRyLCBidWZmZXJfdXNlZCk7CisgICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIpOwogICAgICAgWlZBTF9OVUxMKCZyZXQpOwotICAgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZwdXRiYWNrZm4sICZyZXQsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisKKyAgICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZwdXRiYWNrZm4sICZyZXQsIDEsIGFyZ3MpOworCisgICAgICB6dmFsX2R0b3IoJnB1dGJhY2tmbik7CiAgICAgICB6dmFsX2R0b3IoJnJldCk7CisgICAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQogICAgIH0KICAgICBidWZmZXJfdXNlZCA9IDA7CiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKQEAgLTMwMyw3ICszMDUsNyBAQAogCiAgIHZvaWQgc2tpcChzaXplX3QgbGVuKSB7CiAgICAgd2hpbGUgKGxlbikgewotICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSBNSU4obGVuLCBidWZmZXJfdXNlZCk7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IChzdGQ6Om1pbikobGVuLCBidWZmZXJfdXNlZCk7CiAgICAgICBpZiAoY2h1bmtfc2l6ZSkgewogICAgICAgICBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyX3B0cikgKyBjaHVua19zaXplOwogICAgICAgICBidWZmZXJfdXNlZCAtPSBjaHVua19zaXplOwpAQCAtMzE2LDcgKzMxOCw3IEBACiAKICAgdm9pZCByZWFkQnl0ZXModm9pZCogYnVmLCBzaXplX3QgbGVuKSB7CiAgICAgd2hpbGUgKGxlbikgewotICAgICAgc2l6ZV90IGNodW5rX3NpemUgPSBNSU4obGVuLCBidWZmZXJfdXNlZCk7CisgICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IChzdGQ6Om1pbikobGVuLCBidWZmZXJfdXNlZCk7CiAgICAgICBpZiAoY2h1bmtfc2l6ZSkgewogICAgICAgICBtZW1jcHkoYnVmLCBidWZmZXJfcHRyLCBjaHVua19zaXplKTsKICAgICAgICAgYnVmZmVyX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlcl9wdHIpICsgY2h1bmtfc2l6ZTsKQEAgLTM1NywyOSArMzU5LDI5IEBACiAgIHZvaWQgcmVmaWxsKCkgewogICAgIGFzc2VydChidWZmZXJfdXNlZCA9PSAwKTsKICAgICB6dmFsIHJldHZhbDsKLSAgICBaVkFMX05VTEwoJnJldHZhbCk7Ci0KLSAgICB6dmFsICphcmdzWzFdOwotICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgWlZBTF9MT05HKGFyZ3NbMF0sIGJ1ZmZlcl9zaXplKTsKLQotICAgIFRTUk1MU19GRVRDSCgpOwotCisgICAgenZhbCBhcmdzWzFdOwogICAgIHp2YWwgZnVuY25hbWU7Ci0gICAgWlZBTF9TVFJJTkcoJmZ1bmNuYW1lLCAicmVhZCIsIDApOwogCi0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnQsICZmdW5jbmFtZSwgJnJldHZhbCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgIHp2YWxfcHRyX2R0b3IoYXJncyk7CisgICAgWlZBTF9OVUxMKCZyZXR2YWwpOworICAgIFpWQUxfTE9ORygmYXJnc1swXSwgYnVmZmVyX3NpemUpOworCisgICAgWlZBTF9TVFJJTkcoJmZ1bmNuYW1lLCAicmVhZCIpOworCisgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZ1bmNuYW1lLCAmcmV0dmFsLCAxLCBhcmdzKTsKKyAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOworICAgIHp2YWxfZHRvcigmZnVuY25hbWUpOwogCiAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKICAgICAgIHp2YWxfZHRvcigmcmV0dmFsKTsKLSAgICAgIHp2YWwqIGV4ID0gRUcoZXhjZXB0aW9uKTsKLSAgICAgIEVHKGV4Y2VwdGlvbikgPSBOVUxMOworCisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CiAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKICAgICB9CiAKICAgICBidWZmZXJfdXNlZCA9IFpfU1RSTEVOKHJldHZhbCk7CiAgICAgbWVtY3B5KGJ1ZmZlciwgWl9TVFJWQUwocmV0dmFsKSwgYnVmZmVyX3VzZWQpOworCiAgICAgenZhbF9kdG9yKCZyZXR2YWwpOwogCiAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKQEAgLTM4NywyMjIgKzM4OSw2MyBAQAogCiB9OwogCitzdGF0aWMKIHZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7CitzdGF0aWMKIHZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKTsKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpOwotdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KTsKLXZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCAqdHJhbnNwb3J0LCBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKTsKLQorc3RhdGljCit2b2lkIGJpbmFyeV9zZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpOworc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19zY2FsYXIoaW50OF90IHQpOwogCiAvLyBDcmVhdGUgYSBQSFAgb2JqZWN0IGdpdmVuIGEgdHlwZW5hbWUgYW5kIGNhbGwgdGhlIGN0b3IsIG9wdGlvbmFsbHkgcGFzc2luZyB1cCB0byAyIGFyZ3VtZW50cwotdm9pZCBjcmVhdGVPYmplY3QoY2hhciogb2JqX3R5cGVuYW1lLCB6dmFsKiByZXR1cm5fdmFsdWUsIGludCBuYXJncyA9IDAsIHp2YWwqIGFyZzEgPSBOVUxMLCB6dmFsKiBhcmcyID0gTlVMTCkgewotICBUU1JNTFNfRkVUQ0goKTsKLSAgc2l6ZV90IG9ial90eXBlbmFtZV9sZW4gPSBzdHJsZW4ob2JqX3R5cGVuYW1lKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2ZldGNoX2NsYXNzKG9ial90eXBlbmFtZSwgb2JqX3R5cGVuYW1lX2xlbiwgWkVORF9GRVRDSF9DTEFTU19ERUZBVUxUIFRTUk1MU19DQyk7CitzdGF0aWMKK3ZvaWQgY3JlYXRlT2JqZWN0KGNvbnN0IGNoYXIqIG9ial90eXBlbmFtZSwgenZhbCogcmV0dXJuX3ZhbHVlLCBpbnQgbmFyZ3MgPSAwLCB6dmFsKiBhcmcxID0gbnVsbHB0ciwgenZhbCogYXJnMiA9IG51bGxwdHIpIHsKKyAgLyogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoYXQgb24gdGhlIHN0YWNrID8gKi8KKyAgemVuZF9zdHJpbmcgKm9ial9uYW1lID0gemVuZF9zdHJpbmdfaW5pdChvYmpfdHlwZW5hbWUsIHN0cmxlbihvYmpfdHlwZW5hbWUpLCAwKTsKKyAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2ZldGNoX2NsYXNzKG9ial9uYW1lLCBaRU5EX0ZFVENIX0NMQVNTX0RFRkFVTFQpOworICB6ZW5kX3N0cmluZ19yZWxlYXNlKG9ial9uYW1lKTsKKwogICBpZiAoISBjZSkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICJDbGFzcyAlcyBkb2VzIG5vdCBleGlzdCIsIG9ial90eXBlbmFtZSk7CisgICAgcGhwX2Vycm9yX2RvY3JlZihudWxscHRyLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0KIAotICBvYmplY3RfYW5kX3Byb3BlcnRpZXNfaW5pdChyZXR1cm5fdmFsdWUsIGNlLCBOVUxMKTsKLSAgemVuZF9mdW5jdGlvbiogY29uc3RydWN0b3IgPSB6ZW5kX3N0ZF9nZXRfY29uc3RydWN0b3IocmV0dXJuX3ZhbHVlIFRTUk1MU19DQyk7Ci0gIHp2YWwqIGN0b3JfcnYgPSBOVUxMOwotICB6ZW5kX2NhbGxfbWV0aG9kKCZyZXR1cm5fdmFsdWUsIGNlLCAmY29uc3RydWN0b3IsIE5VTEwsIDAsICZjdG9yX3J2LCBuYXJncywgYXJnMSwgYXJnMiBUU1JNTFNfQ0MpOwotICB6dmFsX3B0cl9kdG9yKCZjdG9yX3J2KTsKKyAgb2JqZWN0X2FuZF9wcm9wZXJ0aWVzX2luaXQocmV0dXJuX3ZhbHVlLCBjZSwgbnVsbHB0cik7CisgIHplbmRfZnVuY3Rpb24qIGNvbnN0cnVjdG9yID0gemVuZF9zdGRfZ2V0X2NvbnN0cnVjdG9yKFpfT0JKX1AocmV0dXJuX3ZhbHVlKSk7CisgIHp2YWwgY3Rvcl9ydjsKKyAgemVuZF9jYWxsX21ldGhvZChyZXR1cm5fdmFsdWUsIGNlLCAmY29uc3RydWN0b3IsIE5VTEwsIDAsICZjdG9yX3J2LCBuYXJncywgYXJnMSwgYXJnMik7CisgIHp2YWxfZHRvcigmY3Rvcl9ydik7CisgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgfQogfQogCi12b2lkIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihjaGFyKiB3aGF0LCBsb25nIGVycm9yY29kZSkgewotICBUU1JNTFNfRkVUQ0goKTsKK3N0YXRpYwordm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY29uc3QgY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKKyAgenZhbCB6d2hhdCwgemVycm9yY29kZTsKIAotICB6dmFsICp6d2hhdCwgKnplcnJvcmNvZGU7Ci0gIE1BS0VfU1REX1pWQUwoendoYXQpOwotICBNQUtFX1NURF9aVkFMKHplcnJvcmNvZGUpOworICBaVkFMX1NUUklORygmendoYXQsIHdoYXQpOworICBaVkFMX0xPTkcoJnplcnJvcmNvZGUsIGVycm9yY29kZSk7CiAKLSAgWlZBTF9TVFJJTkcoendoYXQsIHdoYXQsIDEpOwotICBaVkFMX0xPTkcoemVycm9yY29kZSwgZXJyb3Jjb2RlKTsKKyAgenZhbCBleDsKKyAgY3JlYXRlT2JqZWN0KCJcXFRocmlmdFxcRXhjZXB0aW9uXFxUUHJvdG9jb2xFeGNlcHRpb24iLCAmZXgsIDIsICZ6d2hhdCwgJnplcnJvcmNvZGUpOwogCi0gIHp2YWwqIGV4OwotICBNQUtFX1NURF9aVkFMKGV4KTsKLSAgY3JlYXRlT2JqZWN0KCJUUHJvdG9jb2xFeGNlcHRpb24iLCBleCwgMiwgendoYXQsIHplcnJvcmNvZGUpOwotICB6dmFsX3B0cl9kdG9yKCZ6d2hhdCk7Ci0gIHp2YWxfcHRyX2R0b3IoJnplcnJvcmNvZGUpOwotICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgenZhbF9kdG9yKCZ6d2hhdCk7CisgIHp2YWxfZHRvcigmemVycm9yY29kZSk7CisKKyAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwogfQogCiAvLyBTZXRzIEVHKGV4Y2VwdGlvbiksIGNhbGwgdGhpcyBhbmQgdGhlbiBSRVRVUk5fTlVMTCgpOwotdm9pZCB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4IFRTUk1MU19EQykgewotICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdChUU1JNTFNfQyksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDAgVFNSTUxTX0NDKTsKK3N0YXRpYwordm9pZCB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7CisgIHplbmRfdGhyb3dfZXhjZXB0aW9uKHplbmRfZXhjZXB0aW9uX2dldF9kZWZhdWx0KCksIGNvbnN0X2Nhc3Q8Y2hhcio+KGV4LndoYXQoKSksIDApOwogfQogCi0KLXZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCB6dmFsKiByZXR1cm5fdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7Ci0gIHp2YWwqKiB2YWxfcHRyOwotICBaX1RZUEVfUChyZXR1cm5fdmFsdWUpID0gSVNfTlVMTDsgLy8ganVzdCBpbiBjYXNlCi0KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICAgIGlmICh6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIDYsICh2b2lkKiopJnZhbF9wdHIpICE9IFNVQ0NFU1MpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUFAodmFsX3B0cik7Ci0gICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKLSAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOwotICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgInNwZWMgZm9yICVzIGlzIHdyb25nIHR5cGU6ICVkXG4iLCBzdHJ1Y3RUeXBlLCBaX1RZUEVfUChzcGVjKSk7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFRfQk9PTDogewotICAgICAgdWludDhfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7Ci0gICAgICBSRVRVUk5fQk9PTChjICE9IDApOwotICAgIH0KLSAgLy9jYXNlIFRfSTA4OiAvLyBzYW1lIG51bWVyaWMgdmFsdWUgYXMgVF9CWVRFCi0gICAgY2FzZSBUX0JZVEU6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDhfdCljKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kxNjogewotICAgICAgdWludDE2X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDIpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDE2X3QpbnRvaHMoYykpOwotICAgIH0KLSAgICBjYXNlIFRfSTMyOiB7Ci0gICAgICB1aW50MzJfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgNCk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50MzJfdCludG9obChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9VNjQ6Ci0gICAgY2FzZSBUX0k2NDogewotICAgICAgdWludDY0X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDgpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDY0X3QpbnRvaGxsKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0RPVUJMRTogewotICAgICAgdW5pb24gewotICAgICAgICB1aW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJihhLmMpLCA4KTsKLSAgICAgIGEuYyA9IG50b2hsbChhLmMpOwotICAgICAgUkVUVVJOX0RPVUJMRShhLmQpOwotICAgIH0KLSAgICAvL2Nhc2UgVF9VVEY3OiAvLyBhbGlhc2VzIFRfU1RSSU5HCi0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgY2hhciogc3RyYnVmID0gKGNoYXIqKSBlbWFsbG9jKHNpemUgKyAxKTsKLSAgICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyhzdHJidWYsIHNpemUpOwotICAgICAgICBzdHJidWZbc2l6ZV0gPSAnXDAnOwotICAgICAgICBaVkFMX1NUUklOR0wocmV0dXJuX3ZhbHVlLCBzdHJidWYsIHNpemUsIDApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgWlZBTF9FTVBUWV9TVFJJTkcocmV0dXJuX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX01BUDogeyAvLyBhcnJheSBvZiBrZXkgLT4gdmFsdWUKLSAgICAgIHVpbnQ4X3QgdHlwZXNbMl07Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHR5cGVzLCAyKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJrZXkiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsICp2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0KLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICBNQUtFX1NURF9aVkFMKGtleSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsIGtleSwga2V5c3BlYyk7Ci0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCB2YWx1ZSwgdmFsc3BlYyk7Ci0gICAgICAgIGlmIChaX1RZUEVfUChrZXkpID09IElTX0xPTkcpIHsKLSAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfTFZBTF9QKGtleSksICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgIGlmIChaX1RZUEVfUChrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoa2V5KTsKLSAgICAgICAgICB6ZW5kX2hhc2hfdXBkYXRlKHJldHVybl92YWx1ZS0+dmFsdWUuaHQsIFpfU1RSVkFMX1Aoa2V5KSwgWl9TVFJMRU5fUChrZXkpICsgMSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgenZhbF9wdHJfZHRvcigma2V5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCi0gICAgfQotICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKLSAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCB2YWx1ZSwgZWxlbXNwZWMpOwotICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKLSAgICAgIHVpbnQ4X3QgdHlwZTsKLSAgICAgIHVpbnQzMl90IHNpemU7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOwotICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCoga2V5OwotICAgICAgICB6dmFsKiB2YWx1ZTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgWlZBTF9UUlVFKHZhbHVlKTsKLQotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCBrZXksIGVsZW1zcGVjKTsKLQotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9OwotCi0gIGNoYXIgZXJyYnVmWzEyOF07Ci0gIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7Ci0gIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci19Ci0KK3N0YXRpYwogdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KSB7CiAgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewogICAgIGNhc2UgVF9TVE9QOgpAQCAtNjYyLDEwMSArNTA1LDQ3MiBAQAogICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwogfQogCi12b2lkIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHp2YWwqIHRyYW5zcG9ydCwgY29uc3QgY2hhciogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgewotICBUU1JNTFNfRkVUQ0goKTsKLSAgenZhbCAqYXJnc1szXTsKLQotICBNQUtFX1NURF9aVkFMKGFyZ3NbMF0pOwotICBaVkFMX1NUUklOR0woYXJnc1swXSwgKGNoYXIqKW1ldGhvZF9uYW1lLCBzdHJsZW4obWV0aG9kX25hbWUpLCAxKTsKLQotICBNQUtFX1NURF9aVkFMKGFyZ3NbMV0pOwotICBaVkFMX0xPTkcoYXJnc1sxXSwgbXNndHlwZSk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzJdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMl0sIHNlcUlEKTsKLQotICB6dmFsIHJldDsKLSAgWlZBTF9OVUxMKCZyZXQpOwotCi0gIHp2YWwgd3JpdGVNZXNzYWdlZm47Ci0gIFpWQUxfU1RSSU5HKCZ3cml0ZU1lc3NhZ2VmbiwgIndyaXRlTWVzc2FnZUJlZ2luIiwgMCk7Ci0KLSAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJnRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzIFRTUk1MU19DQyk7Ci0KLSAgenZhbF9wdHJfZHRvcigmYXJnc1swXSk7Ci0gIHp2YWxfcHRyX2R0b3IoJmFyZ3NbMV0pOwotICB6dmFsX3B0cl9kdG9yKCZhcmdzWzJdKTsKLSAgenZhbF9kdG9yKCZyZXQpOworc3RhdGljIGlubGluZQorYm9vbCB6dmFsX2lzX2Jvb2woenZhbCogdikgeworICByZXR1cm4gWl9UWVBFX1AodikgPT0gSVNfVFJVRSB8fCBaX1RZUEVfUCh2KSA9PSBJU19GQUxTRTsKIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3Bvcykgeworc3RhdGljCit2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBaVkFMX05VTEwocmV0dXJuX3ZhbHVlKTsKKworICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX1NUUlVDVDogeworICAgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIHNpemVvZigiY2xhc3MiKS0xKTsKKyAgICAgIGlmICh2YWxfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOworICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIGNoYXIqIHN0cnVjdFR5cGUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOworICAgICAgLy8gQ3JlYXRlIGFuIG9iamVjdCBpbiBQSFAgdXNlcmxhbmQgYmFzZWQgb24gb3VyIHNwZWMKKyAgICAgIGNyZWF0ZU9iamVjdChzdHJ1Y3RUeXBlLCByZXR1cm5fdmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPT0gSVNfTlVMTCkgeworICAgICAgICAvLyB1bmFibGUgdG8gY3JlYXRlIGNsYXNzIGVudHJ5CisgICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKworICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CisgICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgICAgcmV0dXJuOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBUX0JPT0w6IHsKKyAgICAgIHVpbnQ4X3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOworICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKKyAgICB9CisgIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQorICAgIGNhc2UgVF9CWVRFOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7CisgICAgfQorICAgIGNhc2UgVF9JMTY6IHsKKyAgICAgIHVpbnQxNl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX0kzMjogeworICAgICAgdWludDMyX3QgYzsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOworICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfVTY0OgorICAgIGNhc2UgVF9JNjQ6IHsKKyAgICAgIHVpbnQ2NF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7CisgICAgfQorICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgYzsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICB9IGE7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7CisgICAgICBhLmMgPSBudG9obGwoYS5jKTsKKyAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKKyAgICB9CisgICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOiB7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGlmIChzaXplKSB7CisgICAgICAgIGNoYXIgc3RyYnVmW3NpemUrMV07CisgICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKKyAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKKyAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCisgICAgICB1aW50OF90IHR5cGVzWzJdOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgenZhbCAqdmFsX3B0cjsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia2V5Iiwgc2l6ZW9mKCJrZXkiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhbCIsIHNpemVvZigidmFsIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMF0sIHRyYW5zcG9ydCwgJmtleSwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1sxXSwgdHJhbnNwb3J0LCAmdmFsdWUsIHZhbHNwZWMpOworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOyAvLyByZXR1cm5fdmFsdWUgYWxyZWFkeSBwb3B1bGF0ZWQKKyAgICB9CisgICAgY2FzZSBUX0xJU1Q6IHsgLy8gYXJyYXkgd2l0aCBhdXRvZ2VuZXJhdGVkIG51bWVyaWMga2V5cworICAgICAgaW50OF90IHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7CisgICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKyAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKKyAgICAgICAgenZhbCB2YWx1ZTsKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJnZhbHVlLCBlbGVtc3BlYyk7CisgICAgICAgIHplbmRfaGFzaF9uZXh0X2luZGV4X2luc2VydChaX0FSUl9QKHJldHVybl92YWx1ZSksICZ2YWx1ZSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgVF9TRVQ6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IFRSVUUKKyAgICAgIHVpbnQ4X3QgdHlwZTsKKyAgICAgIHVpbnQzMl90IHNpemU7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZ0eXBlLCAxKTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnNpemUsIDQpOworICAgICAgc2l6ZSA9IG50b2hsKHNpemUpOworICAgICAgenZhbCAqdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOworCisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwga2V5LCB2YWx1ZTsKKyAgICAgICAgWlZBTF9UUlVFKCZ2YWx1ZSk7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgJmtleSwgZWxlbXNwZWMpOworCisgICAgICAgIGlmIChaX1RZUEUoa2V5KSA9PSBJU19MT05HKSB7CisgICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfTFZBTChrZXkpLCAmdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChaX1RZUEUoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKCZrZXkpOworICAgICAgICAgIHplbmRfc3ltdGFibGVfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9TVFIoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICB6dmFsX2R0b3IoJmtleSk7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNwcmludGYoZXJyYnVmLCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoaW50OF90IGtleXR5cGUsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIGh0LCBIYXNoUG9zaXRpb24mIGh0X3BvcywgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIGJvb2wga2V5dHlwZV9pc19udW1lcmljID0gKCEoKGtleXR5cGUgPT0gVF9TVFJJTkcpIHx8IChrZXl0eXBlID09IFRfVVRGOCkgfHwgKGtleXR5cGUgPT0gVF9VVEYxNikpKTsKIAotICBjaGFyKiBrZXk7CisgIHplbmRfc3RyaW5nKiBrZXk7CiAgIHVpbnQga2V5X2xlbjsKICAgbG9uZyBpbmRleCA9IDA7CiAKLSAgenZhbCogejsKLSAgTUFLRV9TVERfWlZBTCh6KTsKKyAgenZhbCB6OwogCi0gIGludCByZXMgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KGh0LCAma2V5LCAma2V5X2xlbiwgKHVsb25nKikmaW5kZXgsIDAsICZodF9wb3MpOwotICBpZiAoa2V5dHlwZV9pc19udW1lcmljKSB7Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGluZGV4ID0gc3RydG9sKGtleSwgTlVMTCwgMTApOwotICAgIH0KLSAgICBaVkFMX0xPTkcoeiwgaW5kZXgpOworICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgKHplbmRfdWxvbmcqKSZpbmRleCwgJmh0X3Bvcyk7CisgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7CisgICAgWlZBTF9TVFJfQ09QWSgmeiwga2V5KTsKICAgfSBlbHNlIHsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIGtleV9sZW4gLT0gMTsgLy8gc2tpcCB0aGUgbnVsbCB0ZXJtaW5hdG9yCi0gICAgfSBlbHNlIHsKLSAgICAgIHNwcmludGYoYnVmLCAiJWxkIiwgaW5kZXgpOwotICAgICAga2V5ID0gYnVmOyBrZXlfbGVuID0gc3RybGVuKGJ1Zik7Ci0gICAgfQotICAgIFpWQUxfU1RSSU5HTCh6LCBrZXksIGtleV9sZW4sIDEpOworICAgIFpWQUxfTE9ORygmeiwgaW5kZXgpOwogICB9Ci0gIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCAmeiwgTlVMTCk7Ci0gIHp2YWxfcHRyX2R0b3IoJnopOworICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIHNwZWMpOworICB6dmFsX2R0b3IoJnopOwogfQogCi1pbmxpbmUgYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7CisgIGlmICh2YWx1ZSkgeworICAgIFpWQUxfREVSRUYodmFsdWUpOworICB9CisgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHR5cGVJRCAoYW5kIGZpZWxkIG51bSwgaWYgYXBwbGljYWJsZSkgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgd3JpdGUgdGhlIHBheWxvYWQuCisgIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgeworICAgIGNhc2UgVF9TVE9QOgorICAgIGNhc2UgVF9WT0lEOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfT0JKRUNUKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1vYmplY3QgdHlwZSBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUCh2YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgICAgaWYgKHNwZWMgJiYgWl9UWVBFX1Aoc3BlYykgPT0gSVNfUkVGRVJFTkNFKSB7CisgICAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgICB9CisgICAgICBpZiAoIXNwZWMgfHwgWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBiaW5hcnlfc2VyaWFsaXplX3NwZWModmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0JPT0w6CisgICAgICBpZiAoIXp2YWxfaXNfYm9vbCh2YWx1ZSkpIGNvbnZlcnRfdG9fYm9vbGVhbih2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChaX1RZUEVfSU5GT19QKHZhbHVlKSA9PSBJU19UUlVFID8gMSA6IDApOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9CWVRFOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTE2OgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JNjQ6CisgICAgY2FzZSBUX1U2NDogeworICAgICAgaW50NjRfdCBsX2RhdGE7CisjaWYgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfV0lONjQpCisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSBaX0xWQUxfUCh2YWx1ZSk7CisjZWxzZQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QKHZhbHVlKTsKKyNlbmRpZgorICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGxfZGF0YSk7CisgICAgfSByZXR1cm47CisgICAgY2FzZSBUX0RPVUJMRTogeworICAgICAgdW5pb24geworICAgICAgICBpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19ET1VCTEUpIGNvbnZlcnRfdG9fZG91YmxlKHZhbHVlKTsKKyAgICAgIGEuZCA9IFpfRFZBTF9QKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChhLmMpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9VVEY4OgorICAgIGNhc2UgVF9VVEYxNjoKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZVN0cmluZyhaX1NUUlZBTF9QKHZhbHVlKSwgWl9TVFJMRU5fUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9NQVA6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9NQVApIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAia3R5cGUiLCBzaXplb2YoImt0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidnR5cGUiLCBzaXplb2YoInZ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIEhhc2hUYWJsZSoga2V5c3BlYyA9IFpfQVJSVkFMX1AoemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSkpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBrZXlzcGVjKTsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9MSVNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1AodmFsdWUpOworICAgICAgenZhbCogdmFsX3B0cjsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIHNpemVvZigiZXR5cGUiKS0xKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOworICAgICAgfQorICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9TRVQ6IHsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9TRVQpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBIYXNoVGFibGUqIHNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSkpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7CisgICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICAgIGlmKHR0eXBlX2lzX3NjYWxhcihrZXl0eXBlKSl7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKKyAgICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIsIHNwZWMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gcmV0dXJuOworICB9OworCisgIGNoYXIgZXJyYnVmWzEyOF07CisgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiVW5rbm93biB0aHJpZnQgdHlwZUlEICVkIiwgdGhyaWZ0X3R5cGVJRCk7CisgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Cit9CisKK3N0YXRpYwordm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIHplbmRfc3RyaW5nKiBtZXRob2RfbmFtZSwgaW50MzJfdCBtc2d0eXBlLCBpbnQzMl90IHNlcUlEKSB7CisgIHp2YWwgYXJnc1szXTsKKyAgenZhbCByZXQ7CisgIHp2YWwgd3JpdGVNZXNzYWdlZm47CisKKyAgWlZBTF9TVFJfQ09QWSgmYXJnc1swXSwgbWV0aG9kX25hbWUpOworICBaVkFMX0xPTkcoJmFyZ3NbMV0sIG1zZ3R5cGUpOworICBaVkFMX0xPTkcoJmFyZ3NbMl0sIHNlcUlEKTsKKyAgWlZBTF9OVUxMKCZyZXQpOworICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIpOworCisgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksIHRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzKTsKKworICB6dmFsX2R0b3IoJndyaXRlTWVzc2FnZWZuKTsKKyAgenZhbF9kdG9yKCZhcmdzWzJdKTsgenZhbF9kdG9yKCZhcmdzWzFdKTsgenZhbF9kdG9yKCZhcmdzWzBdKTsKKyAgenZhbF9kdG9yKCZyZXQpOworICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIH0KK30KKworc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19pbnQoaW50OF90IHQpIHsKICAgcmV0dXJuICgodCA9PSBUX0JZVEUpIHx8ICgodCA+PSBUX0kxNikgICYmICh0IDw9IFRfSTY0KSkpOwogfQorc3RhdGljIGlubGluZQorYm9vbCB0dHlwZV9pc19zY2FsYXIoaW50OF90IHQpIHsKKyAgcmV0dXJuICEoKHQgPT0gVF9TVFJVQ1QpIHx8ICggdD09IFRfTUFQKSAgfHwgKHQgPT0gVF9TRVQpIHx8ICh0ID09IFRfTElTVCkpOworfQogCi1pbmxpbmUgYm9vbCB0dHlwZXNfYXJlX2NvbXBhdGlibGUoaW50OF90IHQxLCBpbnQ4X3QgdDIpIHsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CiAgIC8vIEludGVnZXIgdHlwZXMgb2YgZGlmZmVyZW50IHdpZHRocyBhcmUgY29uc2lkZXJlZCBjb21wYXRpYmxlOwogICAvLyBvdGhlcndpc2UgdGhlIHR5cGVJRCBtdXN0IG1hdGNoLgogICByZXR1cm4gKCh0MSA9PSB0MikgfHwgKHR0eXBlX2lzX2ludCh0MSkgJiYgdHR5cGVfaXNfaW50KHQyKSkpOwogfQogCisvL2lzIHVzZWQgdG8gdmFsaWRhdGUgb2JqZWN0cyBiZWZvcmUgc2VyaWFsaXphdGlvbiBhbmQgYWZ0ZXIgZGVzZXJpYWxpemF0aW9uLiBGb3Igbm93LCBvbmx5IHJlcXVpcmVkIGZpZWxkcyBhcmUgdmFsaWRhdGVkLgorc3RhdGljCit2b2lkIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenZhbCogb2JqZWN0KSB7CisgICAgemVuZF9jbGFzc19lbnRyeSogb2JqZWN0X2NsYXNzX2VudHJ5ID0gWl9PQkpDRV9QKG9iamVjdCk7CisgICAgenZhbCogaXNfdmFsaWRhdGUgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgImlzVmFsaWRhdGUiLCBzaXplb2YoImlzVmFsaWRhdGUiKS0xLCB0cnVlKTsKKyAgICBpZiAoaXNfdmFsaWRhdGUpIHsKKyAgICAgIFpWQUxfREVSRUYoaXNfdmFsaWRhdGUpOworICAgIH0KKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIH0KKyAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKKyAgICB6dmFsKiB2YWxfcHRyOworCisgICAgaWYgKGlzX3ZhbGlkYXRlICYmIFpfVFlQRV9JTkZPX1AoaXNfdmFsaWRhdGUpID09IElTX1RSVUUpIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgeworCisgICAgICAgICAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgICAgICAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChaX0FSUlZBTF9QKHNwZWMpLCBudWxscHRyLCAmZmllbGRubywgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJCYWQga2V5dHlwZSBpbiBUU1BFQyAoZXhwZWN0ZWQgJ2xvbmcnKSIsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgICAgICAgLy8gZmllbGQgbmFtZQorICAgICAgICAgICAgenZhbCogenZhcm5hbWUgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgICAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHp2YXJuYW1lKTsKKworICAgICAgICAgICAgenZhbCogaXNfcmVxdWlyZWQgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiaXNSZXF1aXJlZCIsIHNpemVvZigiaXNSZXF1aXJlZCIpLTEpOworICAgICAgICAgICAgenZhbCBydjsKKyAgICAgICAgICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCBvYmplY3QsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgZmFsc2UsICZydik7CisKKyAgICAgICAgICAgIGlmIChaX1RZUEVfSU5GT19QKGlzX3JlcXVpcmVkKSA9PSBJU19UUlVFICYmIFpfVFlQRV9QKHByb3ApID09IElTX05VTEwpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAiUmVxdWlyZWQgZmllbGQgJXMuJXMgaXMgdW5zZXQhIiwgWlNUUl9WQUwob2JqZWN0X2NsYXNzX2VudHJ5LT5uYW1lKSwgdmFybmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljCiB2b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKICAgLy8gU0VUIGFuZCBMSVNUIGhhdmUgJ2VsZW0nID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFsXSAnY2xhc3MnKQogICAvLyBNQVAgaGFzICd2YWwnID0+IGFycmF5KCd0eXBlJywgW29wdGlvbmFdICdjbGFzcycpCi0gIFRTUk1MU19GRVRDSCgpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZ2V0X2NsYXNzX2VudHJ5KHp0aGlzIFRTUk1MU19DQyk7CisgIHplbmRfY2xhc3NfZW50cnkqIGNlID0gWl9PQkpDRV9QKHp0aGlzKTsKICAgd2hpbGUgKHRydWUpIHsKLSAgICB6dmFsKiogdmFsX3B0ciA9IE5VTEw7Ci0KICAgICBpbnQ4X3QgdHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7Ci0gICAgaWYgKHR0eXBlID09IFRfU1RPUCkgcmV0dXJuOworICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIHZhbGlkYXRlX3RocmlmdF9vYmplY3QoenRoaXMpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGludDE2X3QgZmllbGRubyA9IHRyYW5zcG9ydC5yZWFkSTE2KCk7Ci0gICAgaWYgKHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8sICh2b2lkKiopJnZhbF9wdHIpID09IFNVQ0NFU1MpIHsKLSAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7CisgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9pbmRleF9maW5kKHNwZWMsIGZpZWxkbm8pOworICAgIGlmICh2YWxfcHRyICE9IG51bGxwdHIpIHsKKyAgICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKICAgICAgIC8vIHB1bGwgdGhlIGZpZWxkIG5hbWUKLSAgICAgIC8vIHplbmQgaGFzaCB0YWJsZXMgdXNlIHRoZSBudWxsIGF0IHRoZSBlbmQgaW4gdGhlIGxlbmd0aC4uLiBzbyBzdHJsZW4oaGFzaCBrZXkpICsgMS4KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhciIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOworICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7CiAKICAgICAgIC8vIGFuZCB0aGUgdHlwZQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CiAKICAgICAgIGlmICh0dHlwZXNfYXJlX2NvbXBhdGlibGUodHR5cGUsIGV4cGVjdGVkX3R0eXBlKSkgewotICAgICAgICB6dmFsKiBydiA9IE5VTEw7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwocnYpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcnYsIGZpZWxkc3BlYyk7Ci0gICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBydiBUU1JNTFNfQ0MpOworICAgICAgICB6dmFsIHJ2OworICAgICAgICBaVkFMX1VOREVGKCZydik7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsICZydiwgZmllbGRzcGVjKTsKKyAgICAgICAgemVuZF91cGRhdGVfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksICZydik7CisKICAgICAgICAgenZhbF9wdHJfZHRvcigmcnYpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgc2tpcF9lbGVtZW50KHR0eXBlLCB0cmFuc3BvcnQpOwpAQCAtNzY3LDIxOSArOTgxLDQ0IEBACiAgIH0KIH0KIAotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCoqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICBaX0FERFJFRl9QKCp2YWx1ZSk7Ci0gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHR5cGVJRCAoYW5kIGZpZWxkIG51bSwgaWYgYXBwbGljYWJsZSkgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgd3JpdGUgdGhlIHBheWxvYWQuCi0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICAgIFRTUk1MU19GRVRDSCgpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1vYmplY3QgdHlwZSBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KCp2YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIGJpbmFyeV9zZXJpYWxpemVfc3BlYygqdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX0JPT0w6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19CT09MKSB7Ci0gICAgICAgIFNFUEFSQVRFX1pWQUwodmFsdWUpOwotICAgICAgICBjb252ZXJ0X3RvX2Jvb2xlYW4oKnZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfQlZBTF9QUCh2YWx1ZSkgPyAxIDogMCk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfQllURToKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIHsKLSAgICAgICAgU0VQQVJBVEVfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgfQotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTE2OgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgewotICAgICAgICBTRVBBUkFURV9aVkFMKHZhbHVlKTsKLSAgICAgICAgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMTYoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTMyOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgewotICAgICAgICBTRVBBUkFURV9aVkFMKHZhbHVlKTsKLSAgICAgICAgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTY0OgotICAgIGNhc2UgVF9VNjQ6IHsKLSAgICAgIGludDY0X3QgbF9kYXRhOwotI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgewotICAgICAgICBTRVBBUkFURV9aVkFMKHZhbHVlKTsKLSAgICAgICAgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBsX2RhdGEgPSBaX0xWQUxfUFAodmFsdWUpOwotI2Vsc2UKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgewotICAgICAgICBTRVBBUkFURV9aVkFMKHZhbHVlKTsKLSAgICAgICAgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QUCh2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgewotICAgICAgICBTRVBBUkFURV9aVkFMKHZhbHVlKTsKLSAgICAgICAgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICAgIHp2YWxfcHRyX2R0b3IodmFsdWUpOwotICAgIH0gcmV0dXJuOwotICAgIC8vY2FzZSBUX1VURjc6Ci0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19TVFJJTkcpIHsKLSAgICAgICAgU0VQQVJBVEVfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIGNvbnZlcnRfdG9fc3RyaW5nKCp2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUFAodmFsdWUpLCBaX1NUUkxFTl9QUCh2YWx1ZSkpOwotICAgICAgenZhbF9wdHJfZHRvcih2YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX01BUDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgU0VQQVJBVEVfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IodmFsdWUpOwotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9NQVApIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAia3R5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidnR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YWwiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOwotICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAodm9pZCoqKSZ2YWxfcHRyLCAma2V5X3B0cikgPT0gU1VDQ0VTUzsgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyKTsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOwotICAgICAgfQotICAgICAgenZhbF9wdHJfZHRvcih2YWx1ZSk7Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX0xJU1Q6IHsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIFNFUEFSQVRFX1pWQUwodmFsdWUpOwotICAgICAgICBjb252ZXJ0X3RvX2FycmF5KCp2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgewotICAgICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOwotICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAodm9pZCoqKSZ2YWxfcHRyLCAma2V5X3B0cikgPT0gU1VDQ0VTUzsgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICAgIHp2YWxfcHRyX2R0b3IodmFsdWUpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9TRVQ6IHsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIFNFUEFSQVRFX1pWQUwodmFsdWUpOwotICAgICAgICBjb252ZXJ0X3RvX2FycmF5KCp2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgewotICAgICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICB9Ci0gICAgICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgICB9IHJldHVybjsKLSAgfTsKLQotICB6dmFsX3B0cl9kdG9yKHZhbHVlKTsKLSAgY2hhciBlcnJidWZbMTI4XTsKLSAgc3ByaW50ZihlcnJidWYsICJVbmtub3duIHRocmlmdCB0eXBlSUQgJWQiLCB0aHJpZnRfdHlwZUlEKTsKLSAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLX0KLQotCitzdGF0aWMKIHZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CisKKyAgdmFsaWRhdGVfdGhyaWZ0X29iamVjdCh6dGhpcyk7CisKICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gIHp2YWwqKiB2YWxfcHRyOworICB6dmFsKiB2YWxfcHRyOwogCi0gIFRTUk1MU19GRVRDSCgpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZ2V0X2NsYXNzX2VudHJ5KHp0aGlzIFRTUk1MU19DQyk7CisgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoc3BlYywgJmtleV9wdHIpOworICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7CiAKLSAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KHNwZWMsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KHNwZWMsICZrZXlfcHRyKSkgewotICAgIHVsb25nIGZpZWxkbm87Ci0gICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgTlVMTCwgTlVMTCwgJmZpZWxkbm8sIDAsICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgIGlmICh6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfa2V5X2V4KHNwZWMsIG51bGxwdHIsICZmaWVsZG5vLCAma2V5X3B0cikgIT0gSEFTSF9LRVlfSVNfTE9ORykgewogICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJCYWQga2V5dHlwZSBpbiBUU1BFQyAoZXhwZWN0ZWQgJ2xvbmcnKSIsIElOVkFMSURfREFUQSk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIEhhc2hUYWJsZSogZmllbGRzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7CisgICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgLy8gZmllbGQgbmFtZQotICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhciIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyB0aHJpZnQgdHlwZQotICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgaW50OF90IHR0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgaW50OF90IHR0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CiAKLSAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBmYWxzZSBUU1JNTFNfQ0MpOworICAgIHp2YWwgcnY7CisgICAgenZhbCogcHJvcCA9IHplbmRfcmVhZF9wcm9wZXJ0eShaX09CSkNFX1AoenRoaXMpLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCBmYWxzZSwgJnJ2KTsKKworICAgIGlmIChaX1RZUEVfUChwcm9wKSA9PSBJU19SRUZFUkVOQ0UpeworICAgICAgWlZBTF9VTlJFRihwcm9wKTsKKyAgICB9CiAgICAgaWYgKFpfVFlQRV9QKHByb3ApICE9IElTX05VTEwpIHsKICAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHR0eXBlKTsKICAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihmaWVsZG5vKTsKLSAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgJnByb3AsIGZpZWxkc3BlYyk7CisgICAgICBiaW5hcnlfc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHByb3AsIGZpZWxkc3BlYyk7CiAgICAgfQogICB9CiAgIHRyYW5zcG9ydC53cml0ZUk4KFRfU1RPUCk7IC8vIHN0cnVjdCBlbmQKQEAgLTk4Nyw5MyArMTAyNiw1OSBAQAogCiAvLyA2IHBhcmFtczogJHRyYW5zcG9ydCAkbWV0aG9kX25hbWUgJHR0eXBlICRyZXF1ZXN0X3N0cnVjdCAkc2VxSUQgJHN0cmljdF93cml0ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkpIHsKLSAgaW50IGFyZ2MgPSBaRU5EX05VTV9BUkdTKCk7Ci0gIGlmIChhcmdjIDwgNikgewotICAgIFdST05HX1BBUkFNX0NPVU5UOworICB6dmFsICpwcm90b2NvbDsKKyAgenZhbCAqcmVxdWVzdF9zdHJ1Y3Q7CisgIHplbmRfc3RyaW5nICptZXRob2RfbmFtZTsKKyAgbG9uZyBtc2d0eXBlLCBzZXFJRDsKKyAgemVuZF9ib29sIHN0cmljdF93cml0ZTsKKworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzX2V4KFpFTkRfUEFSU0VfUEFSQU1TX1FVSUVULCBaRU5EX05VTV9BUkdTKCksICJvU2xvbGIiLAorICAgICZwcm90b2NvbCwgJm1ldGhvZF9uYW1lLCAmbXNndHlwZSwKKyAgICAmcmVxdWVzdF9zdHJ1Y3QsICZzZXFJRCwgJnN0cmljdF93cml0ZSkgPT0gRkFJTFVSRSkgeworICAgICAgcmV0dXJuOwogICB9CiAKLSAgenZhbCAqKiphcmdzID0gKHp2YWwqKiopIGVtYWxsb2MoYXJnYyAqIHNpemVvZih6dmFsKiopKTsKLSAgemVuZF9nZXRfcGFyYW1ldGVyc19hcnJheV9leChhcmdjLCBhcmdzKTsKLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMF0pICE9IElTX09CSkVDVCkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIxc3QgcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3QgKHRyYW5zcG9ydCkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzFdKSAhPSBJU19TVFJJTkcpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMm5kIHBhcmFtZXRlciBpcyBub3QgYSBzdHJpbmcgKG1ldGhvZCBuYW1lKSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbM10pICE9IElTX09CSkVDVCkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICI0dGggcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3QgKHJlcXVlc3Qgc3RydWN0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotCiAgIHRyeSB7Ci0gICAgUEhQT3V0cHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgenZhbCAqcHJvdG9jb2wgPSAqYXJnc1swXTsKLSAgICBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSA9IFpfU1RSVkFMX1BQKGFyZ3NbMV0pOwotICAgIGNvbnZlcnRfdG9fbG9uZygqYXJnc1syXSk7Ci0gICAgaW50MzJfdCBtc2d0eXBlID0gWl9MVkFMX1BQKGFyZ3NbMl0pOwotICAgIHp2YWwqIHJlcXVlc3Rfc3RydWN0ID0gKmFyZ3NbM107Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzRdKTsKLSAgICBpbnQzMl90IHNlcUlEID0gWl9MVkFMX1BQKGFyZ3NbNF0pOwotICAgIGNvbnZlcnRfdG9fYm9vbGVhbigqYXJnc1s1XSk7Ci0gICAgYm9vbCBzdHJpY3RXcml0ZSA9IFpfQlZBTF9QUChhcmdzWzVdKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBhcmdzID0gTlVMTDsKLSAgICBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbihwcm90b2NvbCwgbWV0aG9kX25hbWUsIG1zZ3R5cGUsIHNlcUlEKTsKLSAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXF1ZXN0X3N0cnVjdCBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXF1ZXN0X3N0cnVjdCksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOwogICAgIH0KKworICAgIGlmICghc3BlYyB8fCBaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgeworICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHNlcmlhbGl6ZSBmcm9tIG5vbi1UaHJpZnQgb2JqZWN0IiwgSU5WQUxJRF9EQVRBKTsKKyAgICB9CisKKyAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sKTsKKyAgICBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbihwcm90b2NvbCwgbWV0aG9kX25hbWUsIChpbnQzMl90KSBtc2d0eXBlLCAoaW50MzJfdCkgc2VxSUQpOwogICAgIGJpbmFyeV9zZXJpYWxpemVfc3BlYyhyZXF1ZXN0X3N0cnVjdCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKwogICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgewotICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdChleCBUU1JNTFNfQ0MpOworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIHRha2Ugb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7Ci0gICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4IFRTUk1MU19DQyk7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiB9CiAKLS8vIDMgcGFyYW1zOiAkdHJhbnNwb3J0ICRyZXNwb25zZV9UeXBlbmFtZSAkc3RyaWN0X3JlYWQKKworLy8gNCBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZCAkYnVmZmVyX3NpemUKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkpIHsKLSAgaW50IGFyZ2MgPSBaRU5EX05VTV9BUkdTKCk7CisgIHp2YWwgKnByb3RvY29sOworICB6ZW5kX3N0cmluZyAqb2JqX3R5cGVuYW1lOworICB6ZW5kX2Jvb2wgc3RyaWN0X3JlYWQ7CisgIHNpemVfdCBidWZmZXJfc2l6ZSA9IDgxOTI7CiAKLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7Ci0gIH0KLQotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAodHlwZW5hbWUgb2YgZXhwZWN0ZWQgcmVzcG9uc2Ugc3RydWN0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7CisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpLCAib1NifGwiLCAmcHJvdG9jb2wsICZvYmpfdHlwZW5hbWUsICZzdHJpY3RfcmVhZCwgJmJ1ZmZlcl9zaXplKSA9PSBGQUlMVVJFKSB7CisgICAgcmV0dXJuOwogICB9CiAKICAgdHJ5IHsKLSAgICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQoKmFyZ3NbMF0pOwotICAgIGNoYXIqIG9ial90eXBlbmFtZSA9IFpfU1RSVkFMX1BQKGFyZ3NbMV0pOwotICAgIGNvbnZlcnRfdG9fYm9vbGVhbigqYXJnc1syXSk7Ci0gICAgYm9vbCBzdHJpY3RfcmVhZCA9IFpfQlZBTF9QUChhcmdzWzJdKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBhcmdzID0gTlVMTDsKLQorICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydChwcm90b2NvbCwgYnVmZmVyX3NpemUpOwogICAgIGludDhfdCBtZXNzYWdlVHlwZSA9IDA7CiAgICAgaW50MzJfdCBzeiA9IHRyYW5zcG9ydC5yZWFkSTMyKCk7CiAKQEAgLTEwOTksMjMgKzExMDQsNjkgQEAKICAgICB9CiAKICAgICBpZiAobWVzc2FnZVR5cGUgPT0gVF9FWENFUFRJT04pIHsKLSAgICAgIHp2YWwqIGV4OwotICAgICAgTUFLRV9TVERfWlZBTChleCk7Ci0gICAgICBjcmVhdGVPYmplY3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGV4KTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KGV4IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoZXgsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIHp2YWwgZXg7CisgICAgICBjcmVhdGVPYmplY3QoIlxcVGhyaWZ0XFxFeGNlcHRpb25cXFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICZleCk7CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFKGV4KSwgIl9UU1BFQyIsIHNpemVvZigiX1RQU0VDIiktMSwgZmFsc2UpOworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKCZleCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKICAgICB9CiAKLSAgICBjcmVhdGVPYmplY3Qob2JqX3R5cGVuYW1lLCByZXR1cm5fdmFsdWUpOwotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKKyAgICBjcmVhdGVPYmplY3QoWlNUUl9WQUwob2JqX3R5cGVuYW1lKSwgcmV0dXJuX3ZhbHVlKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmV0dXJuX3ZhbHVlKSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgdHJ1ZSk7CisgICAgaWYgKHNwZWMpIHsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgfQorICAgIGlmICghc3BlYyB8fCBaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgeworICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IGRlc2VyaWFsaXplIHRvIG5vbi1UaHJpZnQgb2JqZWN0IiwgSU5WQUxJRF9EQVRBKTsKKyAgICB9CiAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgewotICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdChleCBUU1JNTFNfQ0MpOworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIG93bmVyc2hpcCBvZgorICAgIHp2YWwgbXlleDsKKyAgICBaVkFMX0NPUFkoJm15ZXgsIGV4KTsKKyAgICB6dmFsX2R0b3IocmV0dXJuX3ZhbHVlKTsKKyAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoJm15ZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgewotICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCBUU1JNTFNfQ0MpOworICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfQogfQogCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQorUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKSB7CisgIHp2YWwgKnByb3RvY29sOworICB6ZW5kX3N0cmluZyAqb2JqX3R5cGVuYW1lOworICB6ZW5kX2Jvb2wgc3RyaWN0X3JlYWQ7CisgIHNpemVfdCBidWZmZXJfc2l6ZSA9IDgxOTI7CisKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0cnkgeworICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydChwcm90b2NvbCwgYnVmZmVyX3NpemUpOworCisgICAgY3JlYXRlT2JqZWN0KFpTVFJfVkFMKG9ial90eXBlbmFtZSksIHJldHVybl92YWx1ZSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKKyAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgfSBjYXRjaCAoY29uc3QgUEhQRXhjZXB0aW9uV3JhcHBlciYgZXgpIHsKKyAgICAvLyBleCB3aWxsIGJlIGRlc3RydWN0ZWQsIHNvIGNvcHkgdG8gYSB6dmFsIHRoYXQgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0IGNhbiB0YWtlIG93bmVyc2hpcCBvZgorICAgIHp2YWwgbXlleDsKKyAgICBaVkFMX0NPUFkoJm15ZXgsIGV4KTsKKyAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoJm15ZXgpOworICAgIFJFVFVSTl9OVUxMKCk7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCk7CisgICAgUkVUVVJOX05VTEwoKTsKKyAgfQorfQorCisjZW5kaWYgLyogUEhQX1ZFUlNJT05fSUQgPj0gNzAwMDAgKi8KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKaW5kZXggNDRkMDNjYy4uMDQyMDk5NyAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkpOwogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSk7CitQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4pOwogCiBleHRlcm4gemVuZF9tb2R1bGVfZW50cnkgdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeTsKICNkZWZpbmUgcGhwZXh0X3RocmlmdF9wcm90b2NvbF9wdHIgJnRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnkKZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9GaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvRml4dHVyZXMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTdkODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsMTk0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCit1c2UgVGhyaWZ0VGVzdFxYdHJ1Y3Q7Cit1c2UgVGhyaWZ0VGVzdFxYdHJ1Y3QyOwordXNlIFRocmlmdFRlc3RcTnVtYmVyejsKK3VzZSBUaHJpZnRUZXN0XEluc2FuaXR5OworCitjbGFzcyBGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJGJ1ZnNpemUgPSA4MTkyOyAvL2JpZyBlbm91Z2ggdG8gcmVhZCBiaWdnZXN0IHNlcmlhbGl6ZWQgRml4dHVyZSBhcmcuCisgICAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3MgPSBhcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ10gPQorICAgICAgICAgICAgInF1b3RlOiBcXFwiIGJhY2tzbGFzaDoiIC4KKyAgICAgICAgICAgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcLyAiIC4KKyAgICAgICAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgLgorICAgICAgICAgICAgIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcL1xiXG5cclx0IiAuCisgICAgICAgICAgICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAI1wkJSYoKSgmJSQje317fTw+PD48IjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ10gPQorICAgICAgICAgICAgInN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcIjsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddID0KKyAgICAgICAgICAgICLguKrguKfguLHguKrguJTguLUv8J2SryI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ10gPSAzLjE0MTU5MjY1MzU4OTg7CisKKyAgICAgICAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddID0gMHgwMTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXSA9IHBvdygyLCAzMCk7CisKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXSA9IHBvdygyLCA2MCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXSA9ICIxMTUyOTIxNTA0NjA2ODQ3MDAwIjsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICd3b3JrZWQnLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gcG93KDIsIDMwKSwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdygyLCAzMCksCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdDIoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnc3RydWN0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10sCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdygyLCAxNSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE1hcCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgIDcgPT4gNzcsCisgICAgICAgICAgICAgICAgOCA9PiA4OCwKKyAgICAgICAgICAgICAgICA5ID0+IDk5CisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICJhIiA9PiAiMTIzIiwKKyAgICAgICAgICAgICAgICAiYSBiIiA9PiAid2l0aCBzcGFjZXMgIiwKKyAgICAgICAgICAgICAgICAic2FtZSIgPT4gInNhbWUiLAorICAgICAgICAgICAgICAgICIwIiA9PiAibnVtZXJpYyBrZXkiLAorICAgICAgICAgICAgICAgICJsb25nVmFsdWUiID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSwKKyAgICAgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPT4gImxvbmcga2V5IgorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXSA9IGFycmF5KDEgPT4gdHJ1ZSwgNSA9PiB0cnVlLCA2ID0+IHRydWUpOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdExpc3QnXSA9IGFycmF5KDEsIDIsIDMpOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEVudW0nXSA9IE51bWJlcno6Ok9ORTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ10gPSA2OTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgIDQgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIDEgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgMiA9PiAyLAorICAgICAgICAgICAgICAgICAgICAzID0+IDMsCisgICAgICAgICAgICAgICAgICAgIDQgPT4gNCwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIC00ID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICAtNCA9PiAtNCwKKyAgICAgICAgICAgICAgICAgICAgLTMgPT4gLTMsCisgICAgICAgICAgICAgICAgICAgIC0yID0+IC0yLAorICAgICAgICAgICAgICAgICAgICAtMSA9PiAtMQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgLy8gdGVzdEluc2FuaXR5IC4uLiB0YWtlcyBhIGZldyBzdGVwcyB0byBzZXQgdXAhCisKKyAgICAgICAgJHh0cnVjdDEgPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ0dvb2RieWU0JywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDQsCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgICR4dHJ1Y3QyID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdIZWxsbzInLAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gMgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJHVzZXJNYXAgPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgTnVtYmVyejo6RklWRSA9PiA1LAorICAgICAgICAgICAgICAgIE51bWJlcno6OkVJR0hUID0+IDgKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgJGluc2FuaXR5MiA9CisgICAgICAgICAgICBuZXcgSW5zYW5pdHkoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiAkdXNlck1hcCwKKyAgICAgICAgICAgICAgICAgICAgJ3h0cnVjdHMnID0+IGFycmF5KCR4dHJ1Y3QxLCAkeHRydWN0MikKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgICRpbnNhbml0eTMgPSAkaW5zYW5pdHkyOworCisgICAgICAgICRpbnNhbml0eTYgPQorICAgICAgICAgICAgbmV3IEluc2FuaXR5KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgJ3h0cnVjdHMnID0+IG51bGwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEluc2FuaXR5RXhwZWN0ZWRSZXN1bHQnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAiMSIgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlRXTyA9PiAkaW5zYW5pdHkyLAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpUSFJFRSA9PiAkaW5zYW5pdHkzCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAiMiIgPT4gYXJyYXkoCisgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlNJWCA9PiAkaW5zYW5pdHk2CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2ODY1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocApAQCAtMCwwICsxLDExNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XEpzb25TZXJpYWxpemU7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBzdGRDbGFzczsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIEpzb25TZXJpYWxpemVUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgaWYgKHZlcnNpb25fY29tcGFyZShwaHB2ZXJzaW9uKCksICc1LjQnLCAnPCcpKSB7CisgICAgICAgICAgICAkdGhpcy0+bWFya1Rlc3RTa2lwcGVkKCdSZXF1aXJlcyBQSFAgNS40IG9yIG5ld2VyIScpOworICAgICAgICB9CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHBqcycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW1wdHlTdHJ1Y3QoKQorICAgIHsKKyAgICAgICAgJGVtcHR5ID0gbmV3IFxUaHJpZnRUZXN0XEVtcHR5U3RydWN0KGFycmF5KCdub25fZXhpc3Rpbmdfa2V5JyA9PiAnYmFyJykpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKG5ldyBzdGRDbGFzcygpLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkZW1wdHkpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdzQW5kSW50cygpCisgICAgeworICAgICAgICAkaW5wdXQgPSBhcnJheSgKKyAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdmb28nLAorICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gMTIzNDU2Nzg5MCwKKyAgICAgICAgKTsKKyAgICAgICAgJHh0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoJGlucHV0KTsKKworICAgICAgICAvLyBYdHJ1Y3QncyAnaTMyX3RoaW5nJyBhbmQgJ2J5dGVfdGhpbmcnIGZpZWxkcyBzaG91bGQgbm90IGJlIHByZXNlbnQgaGVyZSEKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+c3RyaW5nX3RoaW5nID0gJGlucHV0WydzdHJpbmdfdGhpbmcnXTsKKyAgICAgICAgJGV4cGVjdGVkLT5pNjRfdGhpbmcgPSAkaW5wdXRbJ2k2NF90aGluZyddOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZFN0cnVjdHMoKQorICAgIHsKKyAgICAgICAgJHh0cnVjdDIgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0MihhcnJheSgKKyAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0MiwKKyAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoYXJyYXkoCisgICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gMTIzNDU2LAorICAgICAgICAgICAgKSksCisgICAgICAgICkpOworCisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPmJ5dGVfdGhpbmcgPSAkeHRydWN0Mi0+Ynl0ZV90aGluZzsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJ1Y3RfdGhpbmcgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5zdHJ1Y3RfdGhpbmctPmkzMl90aGluZyA9ICR4dHJ1Y3QyLT5zdHJ1Y3RfdGhpbmctPmkzMl90aGluZzsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QyKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHkoKQorICAgIHsKKyAgICAgICAgJHhpbnB1dCA9IGFycmF5KCdzdHJpbmdfdGhpbmcnID0+ICdmb28nKTsKKyAgICAgICAgJHh0cnVjdCA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QoJHhpbnB1dCk7CisgICAgICAgICRpbnNhbml0eSA9IG5ldyBcVGhyaWZ0VGVzdFxJbnNhbml0eShhcnJheSgKKyAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0LCAkeHRydWN0LCAkeHRydWN0KQorICAgICAgICApKTsKKyAgICAgICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+eHRydWN0cyA9IGFycmF5KChvYmplY3QpJHhpbnB1dCwgKG9iamVjdCkkeGlucHV0LCAob2JqZWN0KSR4aW5wdXQpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGluc2FuaXR5KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkTGlzdHMoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uayhhcnJheSgnbWVzc2FnZScgPT4gJ2ZvbycpKTsKKyAgICAgICAgJG5lc3RlZCA9IG5ldyBcVGhyaWZ0VGVzdFxOZXN0ZWRMaXN0c0JvbmsoYXJyYXkoJ2JvbmsnID0+IGFycmF5KGFycmF5KGFycmF5KCRib25rKSkpKSk7CisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPmJvbmsgPSBhcnJheShhcnJheShhcnJheSgob2JqZWN0KWFycmF5KCdtZXNzYWdlJyA9PiAnZm9vJykpKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkbmVzdGVkKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwcygpCisgICAgeworICAgICAgICAkaW50bWFwID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKFsndGhpbmcnID0+IFswID0+ICd6ZXJvJ11dKTsKKyAgICAgICAgJGVtcHR5bWFwID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKFtdKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJ0aGluZyI6eyIwIjoiemVybyJ9fScsIGpzb25fZW5jb2RlKCRpbnRtYXApKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygne30nLCBqc29uX2VuY29kZSgkZW1wdHltYXApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNjYWxhclR5cGVzKCkKKyAgICB7CisgICAgICAgICRiID0gbmV3IFxUaHJpZnRUZXN0XEJvb2xzKFsnaW1fdHJ1ZScgPT4gJzEnLCAnaW1fZmFsc2UnID0+ICcwJ10pOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7ImltX3RydWUiOnRydWUsImltX2ZhbHNlIjpmYWxzZX0nLCBqc29uX2VuY29kZSgkYikpOworICAgICAgICAkcyA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKFsncycgPT4gNDJdKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJzIjoiNDIifScsIGpzb25fZW5jb2RlKCRzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDJmZDdmODEuLjQ4MjQ2ODggMTAwNzU1Ci0tLSBhL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KQEAgLTE3LDE5ICsxNywzNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKK1BIUFVOSVQ9cGhwICQodG9wX3NyY2RpcikvdmVuZG9yL2Jpbi9waHB1bml0CiAKLXN0dWJzOiAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0JbWtkaXIgLXAgLi9wYWNrYWdlcwotCSQoVEhSSUZUKSAtLWdlbiBwaHAgLXIgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CitzdHViczogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHAKKwkkKFRIUklGVCkgLS1nZW4gcGhwIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKwlta2RpciAtcCAuL3BhY2thZ2VzL3BocHYKKwlta2RpciAtcCAuL3BhY2thZ2VzL3BocHZvCisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHBqcworCSQoVEhSSUZUKSAtLWdlbiBwaHA6dmFsaWRhdGUgICAgIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwdiAgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHA6dmFsaWRhdGUsb29wIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwdm8gIFRlc3RWYWxpZGF0b3JzLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBwaHA6anNvbiAgICAgICAgIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwanMgIFRlc3RWYWxpZGF0b3JzLnRocmlmdAogCi1pZiBIQVZFX1BIUFVOSVQKLWNoZWNrOiBzdHVicwotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9cGhwdW5pdC54bWwgVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wucGhwCi1lbmRpZgorZGVwczogJCh0b3Bfc3JjZGlyKS9jb21wb3Nlci5qc29uCisJY29tcG9zZXIgaW5zdGFsbCAtLXdvcmtpbmctZGlyPSQodG9wX3NyY2RpcikKKworYWxsLWxvY2FsOiBkZXBzCisKK2NoZWNrLWpzb24tc2VyaWFsaXplcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctanNvbi1zZXJpYWxpemVyLnhtbCBKc29uU2VyaWFsaXplLworCitjaGVjay12YWxpZGF0b3I6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXZhbGlkYXRvci54bWwgVmFsaWRhdG9yLworCitjaGVjay1wcm90b2NvbDoJZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctcHJvdG9jb2wueG1sIFByb3RvY29sLworCitjaGVjazogZGVwcyBzdHVicyBcCisgIGNoZWNrLXByb3RvY29sIFwKKyAgY2hlY2stdmFsaWRhdG9yIFwKKyAgY2hlY2stanNvbi1zZXJpYWxpemVyCiAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIC4vcGFja2FnZXMKLQotRVhUUkFfRElTVCA9IFRlc3QKLQorCSQoUk0pIFRFU1QtKi54bWwKZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9CaW5hcnlTZXJpYWxpemVyVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjBiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvQmluYXJ5U2VyaWFsaXplclRlc3QucGhwCkBAIC0wLDAgKzEsNjAgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgQmluYXJ5U2VyaWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwJyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgdHJ5IHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUgYSByYW5kb20gb2JqZWN0IHRvIG1ha2Ugc3VyZSBubyBleGNlcHRpb25zIGFyZSB0aHJvd24uCisgICAgICogQHNlZSBUSFJJRlQtMTU3OQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5U2VyaWFsaXplcigpCisgICAgeworICAgICAgICAkc3RydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnYWJjJykpOworICAgICAgICAkc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpzZXJpYWxpemUoJHN0cnVjdCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOworICAgICAgICAkZGVzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKCRzZXJpYWxpemVkLCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJHN0cnVjdCwgJGRlc2VyaWFsaXplZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDkwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKQEAgLTAsMCArMSw3NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKworY2xhc3MgVEpTT05Qcm90b2NvbEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJnc0pTT04oKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXSA9ICd7fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogXC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlXCfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LBcL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIn19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ10gPSAneyIxIjp7InN0ciI6InN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcXFxcXCJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ10gPSAneyIxIjp7InN0ciI6IuC4quC4p+C4seC4quC4lOC4tVwv8J2SryJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3siMSI6eyJkYmwiOjMuMTQxNTkyNjUzNTg5OH19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyIxIjp7ImkzMiI6MTA3Mzc0MTgyNH19JzsKKworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09IDgpIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjonIC4gcG93KDIsIDYwKSAuICd9fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3siMSI6eyJtYXAiOlsiaTMyIiwiaTMyIiwzLHsiNyI6NzcsIjgiOjg4LCI5Ijo5OX1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddID0gJ3siMSI6eyJzZXQiOlsiaTMyIiwzLDEsNSw2XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddID0gJ3siMSI6eyJsc3QiOlsiaTMyIiwzLDEsMiwzXX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXSA9ICd7IjEiOnsiaTY0Ijo2OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10gPSAneyIwIjp7Im1hcCI6WyJpMzIiLCJtYXAiLDIseyI0IjpbImkzMiIsImkzMiIsNCx7IjEiOjEsIjIiOjIsIjMiOjMsIjQiOjR9XSwiLTQiOlsiaTMyIiwiaTMyIiw0LHsiLTQiOi00LCItMyI6LTMsIi0yIjotMiwiLTEiOi0xfV19XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGVjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbFRlc3QucGhwCkBAIC0wLDAgKzEsNTE4IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRKU09OUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioqCisgKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQorICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKKyAqCisgKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKKyAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBUSlNPTlByb3RvY29sVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJpdmF0ZSAkdHJhbnNwb3J0OworICAgIHByaXZhdGUgJHByb3RvY29sOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRVcEJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgJGFjdHVhbCByZXR1cm5zIHVuZXNjYXBlZCBzdHJpbmcuCisgICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRvIHRvIGRlY29kZSB0aGVuIGVuY29kZSBpdCBhZ2FpbgorICAgICAgICAgKiB0byBnZXQgdGhlIGV4cGVjdGVkIGVzY2FwZWQgdW5pY29kZS4KKyAgICAgICAgICovCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2VuY29kZShqc29uX2RlY29kZSgkYWN0dWFsKSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSRUFEIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM1dyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmc0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1SZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZlJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwTWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBNYXBfcmVzdWx0KCk7CisgICAgICAgICRyZXN1bHQtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcE1hcEV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0SW5zYW5pdHlSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXQorICAgICAgICApOworICAgICAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOworICAgICAgICAkcmVzdWx0LT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3ZmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXMucGhwCkBAIC0wLDAgKzEsNjcgQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgdGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcworeworICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCkKKyAgICB7CisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyJ0aGluZyI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUifSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7InRoaW5nIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7InRoaW5nIjozLjE0MTU5MjY1MzU4OTh9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3sidGhpbmciOjF9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyJ0aGluZyI6MTA3Mzc0MTgyNH0nOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ319JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicgLiBwb3coMiwgNjApIC4gJ30sImkzMl90aGluZyI6MzI3Njh9fSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyJ0aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH0nOworCisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyJ0aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyJ0aGluZyI6eyJieXRlX3RoaW5nIjoxLCJzdHJ1Y3RfdGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9LCJpMzJfdGhpbmciOjMyNzY4fX0nOworICAgICAgICB9CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddID0gJ3sidGhpbmciOnsiNyI6NzcsIjgiOjg4LCI5Ijo5OX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10gPSAneyJ0aGluZyI6eyJhIjoiMTIzIiwiYSBiIjoid2l0aCBzcGFjZXMgIiwic2FtZSI6InNhbWUiLCIwIjoibnVtZXJpYyBrZXkiLCJsb25nVmFsdWUiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIiwiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSI6Imxvbmcga2V5In19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyJ0aGluZyI6WzEsNSw2XX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10gPSAneyJ0aGluZyI6WzEsMiwzXX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyJ0aGluZyI6MX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyJ0aGluZyI6Njl9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGExMzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xUZXN0LnBocApAQCAtMCwwICsxLDI1NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwordXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOwordXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKworLyoqKgorICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKKyAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6CisgKgorICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCisgKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQoreworICAgIHByaXZhdGUgJHRyYW5zcG9ydDsKKyAgICBwcml2YXRlICRwcm90b2NvbDsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCisgICAgeworCisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKworICAgICAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOworICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NTaW1wbGVKU09OKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVFNpbXBsZUpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdSSVRFIFRFU1RTCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvRml4dHVyZXMucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjg2ZjU5Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudGVzdAotICovCi0KLW5hbWVzcGFjZSBUZXN0XFRocmlmdDsKLQotdXNlIFRocmlmdFRlc3RcWHRydWN0OwotdXNlIFRocmlmdFRlc3RcWHRydWN0MjsKLXVzZSBUaHJpZnRUZXN0XE51bWJlcno7Ci11c2UgVGhyaWZ0VGVzdFxJbnNhbml0eTsKLQotY2xhc3MgRml4dHVyZXMKLXsKLSAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3MgPSBhcnJheSgpOwotCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJncygpCi0gIHsKLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ10gPQotICAgICAgInF1b3RlOiBcXFwiIGJhY2tzbGFzaDoiIC4KLSAgICAgICIgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcLyAiIC4KLSAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIgLgotICAgICAgIiBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcL1xiXG5cclx0IiAuCi0gICAgICAiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAI1wkJSYoKSgmJSQje317fTw+PD48IjsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXSA9Ci0gICAgICAic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFwiOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ10gPSAzLjE0MTU5MjY1MzU4OTg7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ10gPSAweDAxOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STMyJ10gPSBwb3coIDIsIDMwICk7Ci0KLSAgICBpZiAoIFBIUF9JTlRfU0laRSA9PSA4ICkKLSAgICB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXSA9IHBvdyggMiwgNjAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOwotICAgIH0KLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCi0gICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDMwICksCi0gICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10gPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKLSAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdyggMiwgMzAgKSwKLSAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9Ci0gICAgICBuZXcgWHRydWN0MigKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKLSAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDE1ICkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICA3ID0+IDc3LAotICAgICAgICAgICAgOCA9PiA4OCwKLSAgICAgICAgICAgIDkgPT4gOTkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXSA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgICJhIiA9PiAiMTIzIiwKLSAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAotICAgICAgICAgICAgInNhbWUiID0+ICJzYW1lIiwKLSAgICAgICAgICAgICIwIiA9PiAibnVtZXJpYyBrZXkiLAotICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAotICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0+ICJsb25nIGtleSIKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXSA9IGFycmF5KCAxID0+IHRydWUsIDUgPT4gdHJ1ZSwgNiA9PiB0cnVlICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J10gPSBhcnJheSggMSwgMiwgMyApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddID0gNjk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgNCA9PiBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAyID0+IDIsCi0gICAgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKLSAgICAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAotICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgLTQgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAtNCA9PiAtNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0zID0+IC0zLAotICAgICAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAtMSA9PiAtMQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIC8vIHRlc3RJbnNhbml0eSAuLi4gdGFrZXMgYSBmZXcgc3RlcHMgdG8gc2V0IHVwIQotCi0gICAgJHh0cnVjdDEgPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCi0gICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQsCi0gICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKLSAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0Ci0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICR4dHJ1Y3QyID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKLSAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4yLAotICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCi0gICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gMgotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICAkdXNlck1hcCA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgIE51bWJlcno6OkZJVkUgPT4gNSwKLSAgICAgICAgICAgIE51bWJlcno6OkVJR0hUID0+IDgKLSAgICAgICAgICAgICk7Ci0KLSAgICAkaW5zYW5pdHkyID0KLSAgICAgIG5ldyBJbnNhbml0eSgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiAkdXNlck1hcCwKLSAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsJHh0cnVjdDIpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICRpbnNhbml0eTMgPSAkaW5zYW5pdHkyOwotCi0gICAgJGluc2FuaXR5NiA9Ci0gICAgICBuZXcgSW5zYW5pdHkoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gbnVsbCwKLSAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICAiMSIgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VEhSRUUgPT4gJGluc2FuaXR5MwotICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgIjIiID0+IGFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlNJWCA9PiAkaW5zYW5pdHk2Ci0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzZhYjIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU2MSArMCwwIEBACi08P3BocAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50ZXN0Ci0gKi8KLQotbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKLQotCi1kZWZpbmUoICdCVUZTSVonLCA4MTkyICk7IC8vYmlnIGVub3VnaCB0byByZWFkIGJpZ2dlc3Qgc2VyaWFsaXplZCBGaXh0dXJlIGFyZy4KLQotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi8uLi8uLi9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7Ci0KLSRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi9saWInKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4nKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uL3BhY2thZ2VzJyk7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vKioqCi0gKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQotICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKLSAqCi0gKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKLSAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0gKi8KLQotY2xhc3MgVGVzdFRKU09OUHJvdG9jb2wgZXh0ZW5kcyBcUEhQVW5pdF9GcmFtZXdvcmtfVGVzdENhc2UKLXsKLSAgcHJpdmF0ZSAkdHJhbnNwb3J0OwotICBwcml2YXRlICRwcm90b2NvbDsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQotICB7Ci0gICAgRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3MoKTsKLSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJnc0pTT04oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKLSAgICAkdGhpcy0+cHJvdG9jb2wgPSBuZXcgVEpTT05Qcm90b2NvbCgkdGhpcy0+dHJhbnNwb3J0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT5vcGVuKCk7Ci0gIH0KLQotICAvKioqCi0gICAqIFdSSVRFIFRFU1RTCi0gICAqLwotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Vm9pZF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ107Ci0KLSAgICAjJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdERvdWJsZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RCeXRlJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJNjRfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TmVzdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZ01hcF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIC8qKioKLSAgICogUkVBRCBURVNUUwotICAgKi8KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM19Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddCi0JCQkgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMl9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cnVjdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddCi0JCQkgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdNYXBfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXQotCQkJICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bV9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotCQkJICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddCi0JCQkgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10KLQkJCSAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLQkJCSAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddCi0JCQkgICAgKTsKLSAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcE1hcF9yZXN1bHQoKTsKLSAgICAkcmVzdWx0LT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0JCQkgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddCi0JCQkgICAgKTsKLSAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEluc2FuaXR5X3Jlc3VsdCgpOwotICAgICRyZXN1bHQtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRyZXN1bHQtPnN1Y2Nlc3M7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEluc2FuaXR5RXhwZWN0ZWRSZXN1bHQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLX0KLQotY2xhc3MgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXMKLXsKLSAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBvcHVsYXRlVGVzdEFyZ3NKU09OKCkKLSAgewotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ10gPSAne30nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7IjEiOnsic3RyIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSJ9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3siMSI6eyJzdHIiOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXSA9ICd7IjEiOnsic3RyIjoic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFxcXFxcIn19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXSA9ICd7IjEiOnsiaTMyIjoxMDczNzQxODI0fX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3ROZXN0J10gPSAneyIxIjp7InJlYyI6eyIxIjp7Imk4IjoxfSwiMiI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyIxIjp7InNldCI6WyJpMzIiLDMsMSw1LDZdfX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3siMSI6eyJpNjQiOjY5fX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOwotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0VmFsaWRhdG9ycy50aHJpZnQgYi9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzhkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVGVzdFZhbGlkYXRvcnMudGhyaWZ0CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIHBocCBUZXN0VmFsaWRhdG9ycworCitpbmNsdWRlICIuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IgorCit1bmlvbiBVbmlvbk9mU3RyaW5ncyB7CisgIDE6IHN0cmluZyBhYTsKKyAgMjogc3RyaW5nIGJiOworfQorCitzZXJ2aWNlIFRlc3RTZXJ2aWNlIHsKKyAgICB2b2lkIHRlc3QoKSB0aHJvd3MoMTogVGhyaWZ0VGVzdC5YY2VwdGlvbiB4Y2VwdGlvbik7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvQmFzZVZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjkwODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApAQCAtMCwwICsxLDE1NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK2Fic3RyYWN0IGNsYXNzIEJhc2VWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0VmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcRW1wdHlTdHJ1Y3QnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJvbmtWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxCb25rJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxCb25rJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RBVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XFN0cnVjdEEnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFVuaW9uT2ZTdHJpbmdzVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xVbmlvbk9mU3RyaW5ncycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2VydmljZVJlc3VsdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFJlYWRFbXB0eSgpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigiXDAwMCIpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkYm9uay0+cmVhZCgkcHJvdG9jb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVFbXB0eSgpCisgICAgeworICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgJGJvbmstPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICAgICAkdGhpcy0+ZmFpbCgnQm9uayB3YXMgYWJsZSB0byB3cml0ZSBhbiBlbXB0eSBvYmplY3QnKTsKKyAgICAgICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlV2l0aE1pc3NpbmdSZXF1aXJlZCgpCisgICAgeworICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGFyZSBub3QgYWJsZSB0byB3cml0ZSBTdHJ1Y3RBIHdpdGggYSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkCisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ1N0cnVjdEEgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkU3RydWN0QSgpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoYmFzZTY0X2RlY29kZSgnQ3dBQkFBQUFBMkZpWXdBPScpKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJHN0cnVjdGEgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QSgpOworICAgICAgICAkc3RydWN0YS0+cmVhZCgkcHJvdG9jb2wpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCJhYmMiLCAkc3RydWN0YS0+cyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnMgPSAiYWJjIjsKKyAgICAgICAgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgICR3cml0ZVJlc3VsdCA9IGJhc2U2NF9lbmNvZGUoJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCdDd0FCQUFBQUEyRmlZd0E9JywgJHdyaXRlUmVzdWx0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIGhhdmUgYSByZWFkIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1JlYWRWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRpYzo6aGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgbm90IGhhdmUgYSB3cml0ZSB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCFzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXRpYzo6aGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JSZWFkJyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzV3JpdGVWYWxpZGF0b3IoJGNsYXNzKQorICAgIHsKKyAgICAgICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKKworICAgICAgICByZXR1cm4gJHJjLT5oYXNNZXRob2QoJ192YWxpZGF0ZUZvcldyaXRlJyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2YzdhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSw0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2Jyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9WYWxpZGF0b3JUZXN0T29wLnBocCBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiY2E0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAKQEAgLTAsMCArMSw0MSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OworCityZXF1aXJlX29uY2UgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKK3VzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CisKKy8qKgorICogQ2xhc3MgVGVzdFZhbGlkYXRvcnNPb3AKKyAqIEBwYWNrYWdlIFRlc3RcVGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBWYWxpZGF0b3JUZXN0T29wIGV4dGVuZHMgQmFzZVZhbGlkYXRvclRlc3QKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocHZvJyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L0NNYWtlTGlzdHMudHh0IGIvbGliL3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjkxZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwzMSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtQWVRIT05fSU5DTFVERV9ESVJTfSkKKworYWRkX2N1c3RvbV90YXJnZXQocHl0aG9uX2J1aWxkIEFMTAorICAgIENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gc2V0dXAucHkgYnVpbGQKKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KKyAgICBDT01NRU5UICJCdWlsZGluZyBQeXRob24gbGlicmFyeSIKKykKKworaWYoQlVJTERfVEVTVElORykKKyAgICBhZGRfdGVzdChQeXRob25UZXN0U1NMU29ja2V0ICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5KQorICAgIGFkZF90ZXN0KFB5dGhvblRocmlmdEpzb24gJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3QvdGhyaWZ0X2pzb24ucHkpCitlbmRpZigpCmRpZmYgLS1naXQgYS9saWIvcHkvTUFOSUZFU1QuaW4gYi9saWIvcHkvTUFOSUZFU1QuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9NQU5JRkVTVC5pbgpAQCAtMCwwICsxIEBACitpbmNsdWRlIHNyYy9leHQvKgpkaWZmIC0tZ2l0IGEvbGliL3B5L01ha2VmaWxlLmFtIGIvbGliL3B5L01ha2VmaWxlLmFtCmluZGV4IDRhMWRmNTcuLjU4NjE4NTggMTAwNjQ0Ci0tLSBhL2xpYi9weS9NYWtlZmlsZS5hbQorKysgYi9saWIvcHkvTWFrZWZpbGUuYW0KQEAgLTE2LDExICsxNiwyMSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwotCitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiBERVNURElSID89IC8KLUVYVFJBX0RJU1QgPSBzZXR1cC5weSBzZXR1cC5jZmcgc3JjIGNvbXBhdAogCi1hbGwtbG9jYWw6CitpZiBXSVRIX1BZMworcHkzLWJ1aWxkOgorCSQoUFlUSE9OMykgc2V0dXAucHkgYnVpbGQKK3B5My10ZXN0OiBweTMtYnVpbGQKKwkkKFBZVEhPTjMpIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTjMpIHRlc3QvdGVzdF9zc2xzb2NrZXQucHkKK2Vsc2UKK3B5My1idWlsZDoKK3B5My10ZXN0OgorZW5kaWYKKworYWxsLWxvY2FsOiBweTMtYnVpbGQKIAkkKFBZVEhPTikgc2V0dXAucHkgYnVpbGQKIAogIyBXZSdyZSBpZ25vcmluZyBwcmVmaXggaGVyZSBiZWNhdXNlIHNpdGUtcGFja2FnZXMgc2VlbXMgdG8gYmUKQEAgLTMzLDQgKzQzLDE3IEBACiBjbGVhbi1sb2NhbDoKIAkkKFJNKSAtciBidWlsZAogCi1jaGVjay1sb2NhbDogYWxsCitjaGVjay1sb2NhbDogYWxsIHB5My10ZXN0CisJJChQWVRIT04pIHRlc3QvdGhyaWZ0X2pzb24ucHkKKwkkKFBZVEhPTikgdGVzdC90ZXN0X3NzbHNvY2tldC5weQorCitFWFRSQV9ESVNUID0gXAorCUNNYWtlTGlzdHMudHh0IFwKKwlNQU5JRkVTVC5pbiBcCisJY29kaW5nX3N0YW5kYXJkcy5tZCBcCisJY29tcGF0IFwKKwlzZXR1cC5weSBcCisJc2V0dXAuY2ZnIFwKKwlzcmMgXAorCXRlc3QgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3B5L1JFQURNRSBiL2xpYi9weS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9weS9SRUFETUUKcmVuYW1lIHRvIGxpYi9weS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kIGIvbGliL3B5L2NvZGluZ19zdGFuZGFyZHMubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1NjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEsNyBAQAorIyMgUHl0aG9uIENvZGluZyBTdGFuZGFyZHMKKworUGxlYXNlIGZvbGxvdzoKKyAqIFtUaHJpZnQgR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpCisgKiBDb2RlIFN0eWxlIGZvciBQeXRob24gQ29kZSBbUEVQOF0oaHR0cDovL2xlZ2FjeS5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMDA4LykKKworV2hlbiBpbiBkb3VidCAtIGNoZWNrIHdpdGggPGh0dHA6Ly93d3cucHlsaW50Lm9yZy8+IG9yIG9ubGluZSB3aXRoIDxodHRwOi8vcGVwOG9ubGluZS5jb20+LgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NldHVwLmNmZyBiL2xpYi9weS9zZXR1cC5jZmcKaW5kZXggMmRjYTJmOC4uYzllZDBhZSAxMDA2NDQKLS0tIGEvbGliL3B5L3NldHVwLmNmZworKysgYi9saWIvcHkvc2V0dXAuY2ZnCkBAIC0xLDIgKzEsNiBAQAogW2luc3RhbGxdCiBvcHRpbWl6ZSA9IDEKK1ttZXRhZGF0YV0KK2Rlc2NyaXB0aW9uLWZpbGUgPSBSRUFETUUubWQKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL2xpYi9weS9zZXR1cC5weSBiL2xpYi9weS9zZXR1cC5weQppbmRleCBmMWU3NzVjLi4zY2YxNDY5IDEwMDY0NAotLS0gYS9saWIvcHkvc2V0dXAucHkKKysrIGIvbGliL3B5L3NldHVwLnB5CkBAIC05LDcgKzksNyBAQAogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIwlodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMjIsODMgKzIyLDExOCBAQAogaW1wb3J0IHN5cwogdHJ5OgogICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotZXhjZXB0OgotICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24sIENvbW1hbmQKK2V4Y2VwdCBFeGNlcHRpb246CisgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0CiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKIAotaW5jbHVkZV9kaXJzID0gW10KKyMgRml4IHRvIGJ1aWxkIHNkaXN0IHVuZGVyIHZhZ3JhbnQKK2ltcG9ydCBvcworaWYgJ3ZhZ3JhbnQnIGluIHN0cihvcy5lbnZpcm9uKToKKyAgICB0cnk6CisgICAgICAgIGRlbCBvcy5saW5rCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisKK2luY2x1ZGVfZGlycyA9IFsnc3JjJ10KIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgogICAgIGluY2x1ZGVfZGlycy5hcHBlbmQoJ2NvbXBhdC93aW4zMicpCiAgICAgZXh0X2Vycm9ycyA9IChDQ29tcGlsZXJFcnJvciwgRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBJT0Vycm9yKQogZWxzZToKICAgICBleHRfZXJyb3JzID0gKENDb21waWxlckVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IpCiAKKwogY2xhc3MgQnVpbGRGYWlsZWQoRXhjZXB0aW9uKToKICAgICBwYXNzCiAKKwogY2xhc3MgdmVfYnVpbGRfZXh0KGJ1aWxkX2V4dCk6CiAgICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYnVpbGRfZXh0LnJ1bihzZWxmKQotICAgICAgICBleGNlcHQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgeDoKKyAgICAgICAgZXhjZXB0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCiAKICAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGJ1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQotICAgICAgICBleGNlcHQgZXh0X2Vycm9ycywgeDoKKyAgICAgICAgZXhjZXB0IGV4dF9lcnJvcnM6CiAgICAgICAgICAgICByYWlzZSBCdWlsZEZhaWxlZCgpCiAKKwogZGVmIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSk6CiAgICAgaWYgd2l0aF9iaW5hcnk6CiAgICAgICAgIGV4dGVuc2lvbnMgPSBkaWN0KAotICAgICAgICAgICAgZXh0X21vZHVsZXMgPSBbCi0gICAgICAgICAgICAgICAgIEV4dGVuc2lvbigndGhyaWZ0LnByb3RvY29sLmZhc3RiaW5hcnknLAotICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzID0gWydzcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jJ10sCi0gICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGluY2x1ZGVfZGlycywKLSAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleHRfbW9kdWxlcz1bCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCd0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9WworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvbW9kdWxlLmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC90eXBlcy5jcHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyYy9leHQvYmluYXJ5LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JjL2V4dC9jb21wYWN0LmNwcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICBjbWRjbGFzcz1kaWN0KGJ1aWxkX2V4dD12ZV9idWlsZF9leHQpCiAgICAgICAgICkKICAgICBlbHNlOgogICAgICAgICBleHRlbnNpb25zID0gZGljdCgpCi0gICAgICAgIAotICAgIHNldHVwKG5hbWUgPSAndGhyaWZ0JywKLSAgICAgICAgdmVyc2lvbiA9ICcwLjkuMCcsCi0gICAgICAgIGRlc2NyaXB0aW9uID0gJ1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbScsCi0gICAgICAgIGF1dGhvciA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXSwKLSAgICAgICAgYXV0aG9yX2VtYWlsID0gWydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXSwKLSAgICAgICAgdXJsID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCi0gICAgICAgIGxpY2Vuc2UgPSAnQXBhY2hlIExpY2Vuc2UgMi4wJywKLSAgICAgICAgcGFja2FnZXMgPSBbCi0gICAgICAgICAgICAndGhyaWZ0JywKLSAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAotICAgICAgICAgICAgJ3RocmlmdC50cmFuc3BvcnQnLAotICAgICAgICAgICAgJ3RocmlmdC5zZXJ2ZXInLAotICAgICAgICBdLAotICAgICAgICBwYWNrYWdlX2RpciA9IHsndGhyaWZ0JyA6ICdzcmMnfSwKLSAgICAgICAgY2xhc3NpZmllcnMgPSBbCi0gICAgICAgICAgICAnRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZScsCi0gICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCi0gICAgICAgICAgICAnSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycycsCi0gICAgICAgICAgICAnUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uJywKLSAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCi0gICAgICAgICAgICAnVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzJywKLSAgICAgICAgICAgICdUb3BpYyA6OiBTeXN0ZW0gOjogTmV0d29ya2luZycKLSAgICAgICAgXSwKLSAgICAgICAgKipleHRlbnNpb25zCi0gICAgKQorCisgICAgc3NsX2RlcHMgPSBbXQorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdpcGFkZHJlc3MnKQorICAgIGlmIHN5cy5oZXh2ZXJzaW9uIDwgMHgwMzA1MDAwMDoKKyAgICAgICAgc3NsX2RlcHMuYXBwZW5kKCdiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lPj0zLjUnKQorICAgIHRvcm5hZG9fZGVwcyA9IFsndG9ybmFkbz49NC4wJ10KKyAgICB0d2lzdGVkX2RlcHMgPSBbJ3R3aXN0ZWQnXQorCisgICAgc2V0dXAobmFtZT0ndGhyaWZ0JywKKyAgICAgICAgICB2ZXJzaW9uPScxLjAuMCcsCisgICAgICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbScsCisgICAgICAgICAgYXV0aG9yPSdBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnLAorICAgICAgICAgIGF1dGhvcl9lbWFpbD0nZGV2QHRocmlmdC5hcGFjaGUub3JnJywKKyAgICAgICAgICB1cmw9J2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCisgICAgICAgICAgbGljZW5zZT0nQXBhY2hlIExpY2Vuc2UgMi4wJywKKyAgICAgICAgICBpbnN0YWxsX3JlcXVpcmVzPVsnc2l4Pj0xLjcuMiddLAorICAgICAgICAgIGV4dHJhc19yZXF1aXJlPXsKKyAgICAgICAgICAgICAgJ3NzbCc6IHNzbF9kZXBzLAorICAgICAgICAgICAgICAndG9ybmFkbyc6IHRvcm5hZG9fZGVwcywKKyAgICAgICAgICAgICAgJ3R3aXN0ZWQnOiB0d2lzdGVkX2RlcHMsCisgICAgICAgICAgICAgICdhbGwnOiBzc2xfZGVwcyArIHRvcm5hZG9fZGVwcyArIHR3aXN0ZWRfZGVwcywKKyAgICAgICAgICB9LAorICAgICAgICAgIHBhY2thZ2VzPVsKKyAgICAgICAgICAgICAgJ3RocmlmdCcsCisgICAgICAgICAgICAgICd0aHJpZnQucHJvdG9jb2wnLAorICAgICAgICAgICAgICAndGhyaWZ0LnRyYW5zcG9ydCcsCisgICAgICAgICAgICAgICd0aHJpZnQuc2VydmVyJywKKyAgICAgICAgICBdLAorICAgICAgICAgIHBhY2thZ2VfZGlyPXsndGhyaWZ0JzogJ3NyYyd9LAorICAgICAgICAgIGNsYXNzaWZpZXJzPVsKKyAgICAgICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAorICAgICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCisgICAgICAgICAgICAgICdJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzJywKKyAgICAgICAgICAgICAgJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMicsCisgICAgICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMycsCisgICAgICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAorICAgICAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCisgICAgICAgICAgXSwKKyAgICAgICAgICB6aXBfc2FmZT1GYWxzZSwKKyAgICAgICAgICAqKmV4dGVuc2lvbnMKKyAgICAgICAgICApCisKIAogdHJ5OgotICAgIHJ1bl9zZXR1cChUcnVlKQorICAgIHdpdGhfYmluYXJ5ID0gVHJ1ZQorICAgIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSkKIGV4Y2VwdCBCdWlsZEZhaWxlZDoKLSAgICBwcmludAotICAgIHByaW50ICcqJyAqIDgwCi0gICAgcHJpbnQgIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJ5aW5nIHRvIGNvbXBpbGUgd2l0aCB0aGUgQyBleHRlbnNpb24gZW5hYmxlZCIgCi0gICAgcHJpbnQgIkF0dGVtcHRpbmcgdG8gYnVpbGQgd2l0aG91dCB0aGUgZXh0ZW5zaW9uIG5vdyIKLSAgICBwcmludCAnKicgKiA4MAotICAgIHByaW50CisgICAgcHJpbnQoKQorICAgIHByaW50KCcqJyAqIDgwKQorICAgIHByaW50KCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gY29tcGlsZSB3aXRoIHRoZSBDIGV4dGVuc2lvbiBlbmFibGVkIikKKyAgICBwcmludCgiQXR0ZW1wdGluZyB0byBidWlsZCB3aXRob3V0IHRoZSBleHRlbnNpb24gbm93IikKKyAgICBwcmludCgnKicgKiA4MCkKKyAgICBwcmludCgpCiAKICAgICBydW5fc2V0dXAoRmFsc2UpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weSBiL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYzVhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5weQpAQCAtMCwwICsxLDU0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yLCBUTWVzc2FnZVR5cGUsIFRFeGNlcHRpb24KK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IsIFRNdWx0aXBsZXhlZFByb3RvY29sCisKKworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yKFRQcm9jZXNzb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2aWNlcyA9IHt9CisKKyAgICBkZWYgcmVnaXN0ZXJQcm9jZXNzb3Ioc2VsZiwgc2VydmljZU5hbWUsIHByb2Nlc3Nvcik6CisgICAgICAgIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdID0gcHJvY2Vzc29yCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgorICAgICAgICAobmFtZSwgdHlwZSwgc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgICAgIGlmIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLkNBTEwgYW5kIHR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWToKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlRNdWx0aXBsZXhlZCBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIENBTEwgJiBPTkVXQVkiKQorCisgICAgICAgIGluZGV4ID0gbmFtZS5maW5kKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikKKyAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBuYW1lICsgIi4gRGlkIHlvdSBmb3JnZXQgdG8gdXNlIFRNdWx0aXBsZXhlZFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisKKyAgICAgICAgc2VydmljZU5hbWUgPSBuYW1lWzA6aW5kZXhdCisgICAgICAgIGNhbGwgPSBuYW1lW2luZGV4ICsgbGVuKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik6XQorICAgICAgICBpZiBzZXJ2aWNlTmFtZSBub3QgaW4gc2VsZi5zZXJ2aWNlczoKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6ICIgKyBzZXJ2aWNlTmFtZSArICIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKQorCisgICAgICAgIHN0YW5kYXJkTWVzc2FnZSA9IChjYWxsLCB0eXBlLCBzZXFpZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VydmljZXNbc2VydmljZU5hbWVdLnByb2Nlc3MoU3RvcmVkTWVzc2FnZVByb3RvY29sKGlwcm90LCBzdGFuZGFyZE1lc3NhZ2UpLCBvcHJvdCkKKworCitjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBtZXNzYWdlQmVnaW4pOgorICAgICAgICBzZWxmLm1lc3NhZ2VCZWdpbiA9IG1lc3NhZ2VCZWdpbgorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2VCZWdpbgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5IGIvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjIwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL1RSZWN1cnNpdmUucHkKQEAgLTAsMCArMSw4MyBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlCisKK1RZUEVfSURYID0gMQorU1BFQ19BUkdTX0lEWCA9IDMKK1NQRUNfQVJHU19DTEFTU19SRUZfSURYID0gMAorU1BFQ19BUkdTX1RIUklGVF9TUEVDX0lEWCA9IDEKKworCitkZWYgZml4X3NwZWMoYWxsX3N0cnVjdHMpOgorICAgICIiIldpcmUgdXAgcmVjdXJzaXZlIHJlZmVyZW5jZXMgZm9yIGFsbCBUU3RydWN0IGRlZmluaXRpb25zIGluc2lkZSBvZiBlYWNoIHRocmlmdF9zcGVjLiIiIgorICAgIGZvciBzdHJ1YyBpbiBhbGxfc3RydWN0czoKKyAgICAgICAgc3BlYyA9IHN0cnVjLnRocmlmdF9zcGVjCisgICAgICAgIGZvciB0aHJpZnRfc3BlYyBpbiBzcGVjOgorICAgICAgICAgICAgaWYgdGhyaWZ0X3NwZWMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgICAgIG90aGVyID0gdGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF1bU1BFQ19BUkdTX0NMQVNTX1JFRl9JRFhdLnRocmlmdF9zcGVjCisgICAgICAgICAgICAgICAgdGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF1bU1BFQ19BUkdTX1RIUklGVF9TUEVDX0lEWF0gPSBvdGhlcgorICAgICAgICAgICAgZWxpZiB0aHJpZnRfc3BlY1tUWVBFX0lEWF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgICAgICAgICAgX2ZpeF9saXN0X29yX3NldCh0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXSkKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgICAgICBfZml4X21hcCh0aHJpZnRfc3BlY1tTUEVDX0FSR1NfSURYXSkKKworCitkZWYgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGUpOgorICAgICMgRm9yIGEgbGlzdCBvciBzZXQsIHRoZSB0aHJpZnRfc3BlYyBlbnRyeSBsb29rcyBsaWtlLAorICAgICMgKDEsIFRUeXBlLkxJU1QsICdsaXN0ZXInLCAoVFR5cGUuU1RSVUNULCBbUmVjTGlzdCwgTm9uZV0sIEZhbHNlKSwgTm9uZSwgKSwgICMgMQorICAgICMgc28gYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLlNUUlVDVCwgW1JlY0xpc3QsIE5vbmVdLCBGYWxzZSkKKyAgICBpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbMV1bMV0gPSBlbGVtZW50X3R5cGVbMV1bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbMV0pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbMV0pCisKKworZGVmIF9maXhfbWFwKGVsZW1lbnRfdHlwZSk6CisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IHZhbHVlIHR5cGUsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLlNUUlVDVCwgW1JlY01hcEJhc2ljLCBOb25lXSwgRmFsc2UpLCBOb25lLCApCisgICAgIyB3aGljaCBpcyBqdXN0IGEgbm9ybWFsIHN0cnVjdCBkZWZpbml0aW9uLgorICAgICMKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gbGlzdCAvIHNldCwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuTElTVCwgKFRUeXBlLlNUUlVDVCwgW1JlY01hcExpc3QsIE5vbmVdLCBGYWxzZSksIEZhbHNlKQorICAgICMgYW5kIHdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgM3JkIGVsZW1lbnQgYXMgYSBsaXN0LgorICAgICMKKyAgICAjIEZvciBhIG1hcCBvZiBrZXkgLT4gbWFwLCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5NQVAsIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLlNUUlVDVCwKKyAgICAjICBbUmVjTWFwTWFwLCBOb25lXSwgRmFsc2UpLCBGYWxzZSkKKyAgICAjIGFuZCBuZWVkIHRvIHByb2Nlc3MgM3JkIGVsZW1lbnQgYXMgYSBtYXAuCisKKyAgICAjIElzIHRoZSBtYXAga2V5IGEgc3RydWN0PworICAgIGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgIGVsZW1lbnRfdHlwZVsxXVsxXSA9IGVsZW1lbnRfdHlwZVsxXVswXS50aHJpZnRfc3BlYworICAgIGVsaWYgZWxlbWVudF90eXBlWzBdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICBfZml4X2xpc3Rfb3Jfc2V0KGVsZW1lbnRfdHlwZVsxXSkKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSA9PSBUVHlwZS5NQVA6CisgICAgICAgIF9maXhfbWFwKGVsZW1lbnRfdHlwZVsxXSkKKworICAgICMgSXMgdGhlIG1hcCB2YWx1ZSBhIHN0cnVjdD8KKyAgICBpZiBlbGVtZW50X3R5cGVbMl0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbM11bMV0gPSBlbGVtZW50X3R5cGVbM11bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVsyXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbM10pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMl0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbM10pCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTQ29ucy5weSBiL2xpYi9weS9zcmMvVFNDb25zLnB5CmluZGV4IGRhOGQyODMuLmJjNjdkNzAgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvVFNDb25zLnB5CisrKyBiL2xpYi9weS9zcmMvVFNDb25zLnB5CkBAIC0xOSwxNyArMTksMTggQEAKIAogZnJvbSBvcyBpbXBvcnQgcGF0aAogZnJvbSBTQ29ucy5CdWlsZGVyIGltcG9ydCBCdWlsZGVyCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgbWFwCiAKIAogZGVmIHNjb25zX2VudihlbnYsIGFkZD0nJyk6Ci0gIG9wYXRoID0gcGF0aC5kaXJuYW1lKHBhdGguYWJzcGF0aCgnJFRBUkdFVCcpKQotICBsc3RyID0gJ3RocmlmdCAtLWdlbiBjcHAgLW8gJyArIG9wYXRoICsgJyAnICsgYWRkICsgJyAkU09VUkNFJwotICBjcHBidWlsZCA9IEJ1aWxkZXIoYWN0aW9uPWxzdHIpCi0gIGVudi5BcHBlbmQoQlVJTERFUlM9eydUaHJpZnRDcHAnOiBjcHBidWlsZH0pCisgICAgb3BhdGggPSBwYXRoLmRpcm5hbWUocGF0aC5hYnNwYXRoKCckVEFSR0VUJykpCisgICAgbHN0ciA9ICd0aHJpZnQgLS1nZW4gY3BwIC1vICcgKyBvcGF0aCArICcgJyArIGFkZCArICcgJFNPVVJDRScKKyAgICBjcHBidWlsZCA9IEJ1aWxkZXIoYWN0aW9uPWxzdHIpCisgICAgZW52LkFwcGVuZChCVUlMREVSUz17J1RocmlmdENwcCc6IGNwcGJ1aWxkfSkKIAogCiBkZWYgZ2VuX2NwcChlbnYsIGRpciwgZmlsZSk6Ci0gIHNjb25zX2VudihlbnYpCi0gIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KLSAgdGFyZ2V0cyA9IG1hcChsYW1iZGEgczogJ2dlbi1jcHAvJyArIGZpbGUgKyBzLCBzdWZmaXhlcykKLSAgcmV0dXJuIGVudi5UaHJpZnRDcHAodGFyZ2V0cywgZGlyICsgZmlsZSArICcudGhyaWZ0JykKKyAgICBzY29uc19lbnYoZW52KQorICAgIHN1ZmZpeGVzID0gWydfdHlwZXMuaCcsICdfdHlwZXMuY3BwJ10KKyAgICB0YXJnZXRzID0gbWFwKGxhbWJkYSBzOiAnZ2VuLWNwcC8nICsgZmlsZSArIHMsIHN1ZmZpeGVzKQorICAgIHJldHVybiBlbnYuVGhyaWZ0Q3BwKHRhcmdldHMsIGRpciArIGZpbGUgKyAnLnRocmlmdCcpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5IGIvbGliL3B5L3NyYy9UU2VyaWFsaXphdGlvbi5weQppbmRleCA4YTU4ZDg5Li5mYmJlNzY4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RTZXJpYWxpemF0aW9uLnB5CisrKyBiL2xpYi9weS9zcmMvVFNlcmlhbGl6YXRpb24ucHkKQEAgLTE3LDggKzE3LDggQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWZyb20gcHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gLnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gLnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCiAKIGRlZiBzZXJpYWxpemUodGhyaWZ0X29iamVjdCwKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFRvcm5hZG8ucHkgYi9saWIvcHkvc3JjL1RUb3JuYWRvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL1RUb3JuYWRvLnB5CkBAIC0wLDAgKzEsMTg4IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3RydWN0CisKK2Zyb20gLnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uLCBUVHJhbnNwb3J0QmFzZSwgVE1lbW9yeUJ1ZmZlcgorCitmcm9tIGlvIGltcG9ydCBCeXRlc0lPCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4sIGlvc3RyZWFtLCBpb2xvb3AsIHRjcHNlcnZlciwgY29uY3VycmVudAorCitfX2FsbF9fID0gWydUVG9ybmFkb1NlcnZlcicsICdUVG9ybmFkb1N0cmVhbVRyYW5zcG9ydCddCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKK2NsYXNzIF9Mb2NrKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl93YWl0ZXJzID0gZGVxdWUoKQorCisgICAgZGVmIGFjcXVpcmVkKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3dhaXRlcnMpID4gMAorCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgYWNxdWlyZShzZWxmKToKKyAgICAgICAgYmxvY2tlciA9IHNlbGYuX3dhaXRlcnNbLTFdIGlmIHNlbGYuYWNxdWlyZWQoKSBlbHNlIE5vbmUKKyAgICAgICAgZnV0dXJlID0gY29uY3VycmVudC5GdXR1cmUoKQorICAgICAgICBzZWxmLl93YWl0ZXJzLmFwcGVuZChmdXR1cmUpCisgICAgICAgIGlmIGJsb2NrZXI6CisgICAgICAgICAgICB5aWVsZCBibG9ja2VyCisKKyAgICAgICAgcmFpc2UgZ2VuLlJldHVybihzZWxmLl9sb2NrX2NvbnRleHQoKSkKKworICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5hY3F1aXJlZCgpLCAnTG9jayBub3QgYXF1aXJlZCcKKyAgICAgICAgZnV0dXJlID0gc2VsZi5fd2FpdGVycy5wb3BsZWZ0KCkKKyAgICAgICAgZnV0dXJlLnNldF9yZXN1bHQoTm9uZSkKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiBfbG9ja19jb250ZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworCitjbGFzcyBUVG9ybmFkb1N0cmVhbVRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSk6CisgICAgIiIiYSBmcmFtZWQsIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvdmVyIGEgVG9ybmFkbyBzdHJlYW0iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgc3RyZWFtPU5vbmUsIGlvX2xvb3A9Tm9uZSk6CisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmlvX2xvb3AgPSBpb19sb29wIG9yIGlvbG9vcC5JT0xvb3AuY3VycmVudCgpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCisgICAgICAgIHNlbGYuX3JlYWRfbG9jayA9IF9Mb2NrKCkKKworICAgICAgICAjIHNlcnZlcnMgcHJvdmlkZSBhIHJlYWR5LXRvLWdvIHN0cmVhbQorICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorCisgICAgZGVmIHdpdGhfdGltZW91dChzZWxmLCB0aW1lb3V0LCBmdXR1cmUpOgorICAgICAgICByZXR1cm4gZ2VuLndpdGhfdGltZW91dCh0aW1lb3V0LCBmdXR1cmUsIHNlbGYuaW9fbG9vcCkKKworICAgIEBnZW4uY29yb3V0aW5lCisgICAgZGVmIG9wZW4oc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdzb2NrZXQgY29ubmVjdGluZycpCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0sIDApCisgICAgICAgIHNlbGYuc3RyZWFtID0gaW9zdHJlYW0uSU9TdHJlYW0oc29jaykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb25uZWN0ID0gc2VsZi5zdHJlYW0uY29ubmVjdCgoc2VsZi5ob3N0LCBzZWxmLnBvcnQpKQorICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLndpdGhfdGltZW91dCh0aW1lb3V0LCBjb25uZWN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBjb25uZWN0CisgICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yLCBJT0Vycm9yLCBpb2xvb3AuVGltZW91dEVycm9yKSBhcyBlOgorICAgICAgICAgICAgbWVzc2FnZSA9ICdjb3VsZCBub3QgY29ubmVjdCB0byB7fTp7fSAoe30pJy5mb3JtYXQoc2VsZi5ob3N0LCBzZWxmLnBvcnQsIGUpCisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlPW1lc3NhZ2UpCisKKyAgICAgICAgcmFpc2UgZ2VuLlJldHVybihzZWxmKQorCisgICAgZGVmIHNldF9jbG9zZV9jYWxsYmFjayhzZWxmLCBjYWxsYmFjayk6CisgICAgICAgICIiIgorICAgICAgICBTaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgb3BlbigpIHJldHVybnMKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RyZWFtLnNldF9jbG9zZV9jYWxsYmFjayhjYWxsYmFjaykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIyBkb24ndCByYWlzZSBpZiB3ZSBpbnRlbmQgdG8gY2xvc2UKKyAgICAgICAgc2VsZi5zdHJlYW0uc2V0X2Nsb3NlX2NhbGxiYWNrKE5vbmUpCisgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKworICAgIGRlZiByZWFkKHNlbGYsIF8pOgorICAgICAgICAjIFRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgVG9ybmFkbyBzaG91bGRuJ3QgZG8gaW5kaXZpZHVhbCByZWFkcyAtLSBvbmx5CisgICAgICAgICMgZnJhbWVzIGF0IGEgdGltZQorICAgICAgICBhc3NlcnQgRmFsc2UsICJ5b3UncmUgZG9pbmcgaXQgd3JvbmciCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgaW9fZXhjZXB0aW9uX2NvbnRleHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yLCBJT0Vycm9yKSBhcyBlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgbWVzc2FnZT1zdHIoZSkpCisgICAgICAgIGV4Y2VwdCBpb3N0cmVhbS5TdHJlYW1CdWZmZXJGdWxsRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCisgICAgICAgICAgICAgICAgbWVzc2FnZT1zdHIoZSkpCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiByZWFkRnJhbWUoc2VsZik6CisgICAgICAgICMgSU9TdHJlYW0gcHJvY2Vzc2VzIHJlYWRzIG9uZSBhdCBhIHRpbWUKKyAgICAgICAgd2l0aCAoeWllbGQgc2VsZi5fcmVhZF9sb2NrLmFjcXVpcmUoKSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuaW9fZXhjZXB0aW9uX2NvbnRleHQoKToKKyAgICAgICAgICAgICAgICBmcmFtZV9oZWFkZXIgPSB5aWVsZCBzZWxmLnN0cmVhbS5yZWFkX2J5dGVzKDQpCisgICAgICAgICAgICAgICAgaWYgbGVuKGZyYW1lX2hlYWRlcikgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgaW9zdHJlYW0uU3RyZWFtQ2xvc2VkRXJyb3IoJ1JlYWQgemVybyBieXRlcyBmcm9tIHN0cmVhbScpCisgICAgICAgICAgICAgICAgZnJhbWVfbGVuZ3RoLCA9IHN0cnVjdC51bnBhY2soJyFpJywgZnJhbWVfaGVhZGVyKQorICAgICAgICAgICAgICAgIGZyYW1lID0geWllbGQgc2VsZi5zdHJlYW0ucmVhZF9ieXRlcyhmcmFtZV9sZW5ndGgpCisgICAgICAgICAgICAgICAgcmFpc2UgZ2VuLlJldHVybihmcmFtZSkKKworICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGZyYW1lID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQorICAgICAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQorICAgICAgICBmcmFtZV9sZW5ndGggPSBzdHJ1Y3QucGFjaygnIWknLCBsZW4oZnJhbWUpKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICB3aXRoIHNlbGYuaW9fZXhjZXB0aW9uX2NvbnRleHQoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnN0cmVhbS53cml0ZShmcmFtZV9sZW5ndGggKyBmcmFtZSkKKworCitjbGFzcyBUVG9ybmFkb1NlcnZlcih0Y3BzZXJ2ZXIuVENQU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc29yLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUsCisgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKFRUb3JuYWRvU2VydmVyLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgc2VsZi5fcHJvY2Vzc29yID0gcHJvY2Vzc29yCisgICAgICAgIHNlbGYuX2lwcm90X2ZhY3RvcnkgPSBpcHJvdF9mYWN0b3J5CisgICAgICAgIHNlbGYuX29wcm90X2ZhY3RvcnkgPSAob3Byb3RfZmFjdG9yeSBpZiBvcHJvdF9mYWN0b3J5IGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpcHJvdF9mYWN0b3J5KQorCisgICAgQGdlbi5jb3JvdXRpbmUKKyAgICBkZWYgaGFuZGxlX3N0cmVhbShzZWxmLCBzdHJlYW0sIGFkZHJlc3MpOgorICAgICAgICBob3N0LCBwb3J0ID0gYWRkcmVzc1s6Ml0KKyAgICAgICAgdHJhbnMgPSBUVG9ybmFkb1N0cmVhbVRyYW5zcG9ydChob3N0PWhvc3QsIHBvcnQ9cG9ydCwgc3RyZWFtPXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb19sb29wPXNlbGYuaW9fbG9vcCkKKyAgICAgICAgb3Byb3QgPSBzZWxmLl9vcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIG5vdCB0cmFucy5zdHJlYW0uY2xvc2VkKCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmcmFtZSA9IHlpZWxkIHRyYW5zLnJlYWRGcmFtZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnRFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS50eXBlID09IFRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEU6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICB0ciA9IFRNZW1vcnlCdWZmZXIoZnJhbWUpCisgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLl9pcHJvdF9mYWN0b3J5LmdldFByb3RvY29sKHRyKQorICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuX3Byb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ3RocmlmdCBleGNlcHRpb24gaW4gaGFuZGxlX3N0cmVhbScpCisgICAgICAgICAgICB0cmFucy5jbG9zZSgpCisKKyAgICAgICAgbG9nZ2VyLmluZm8oJ2NsaWVudCBkaXNjb25uZWN0ZWQgJXM6JWQnLCBob3N0LCBwb3J0KQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UaHJpZnQucHkgYi9saWIvcHkvc3JjL1RocmlmdC5weQppbmRleCA3MDdhOGNjLi4wMDk0MWQ4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RocmlmdC5weQorKysgYi9saWIvcHkvc3JjL1RocmlmdC5weQpAQCAtMjAsMTM4ICsyMCwxNzMgQEAKIGltcG9ydCBzeXMKIAogCi1jbGFzcyBUVHlwZToKLSAgU1RPUCAgID0gMAotICBWT0lEICAgPSAxCi0gIEJPT0wgICA9IDIKLSAgQllURSAgID0gMwotICBJMDggICAgPSAzCi0gIERPVUJMRSA9IDQKLSAgSTE2ICAgID0gNgotICBJMzIgICAgPSA4Ci0gIEk2NCAgICA9IDEwCi0gIFNUUklORyA9IDExCi0gIFVURjcgICA9IDExCi0gIFNUUlVDVCA9IDEyCi0gIE1BUCAgICA9IDEzCi0gIFNFVCAgICA9IDE0Ci0gIExJU1QgICA9IDE1Ci0gIFVURjggICA9IDE2Ci0gIFVURjE2ICA9IDE3CitjbGFzcyBUVHlwZShvYmplY3QpOgorICAgIFNUT1AgPSAwCisgICAgVk9JRCA9IDEKKyAgICBCT09MID0gMgorICAgIEJZVEUgPSAzCisgICAgSTA4ID0gMworICAgIERPVUJMRSA9IDQKKyAgICBJMTYgPSA2CisgICAgSTMyID0gOAorICAgIEk2NCA9IDEwCisgICAgU1RSSU5HID0gMTEKKyAgICBVVEY3ID0gMTEKKyAgICBTVFJVQ1QgPSAxMgorICAgIE1BUCA9IDEzCisgICAgU0VUID0gMTQKKyAgICBMSVNUID0gMTUKKyAgICBVVEY4ID0gMTYKKyAgICBVVEYxNiA9IDE3CiAKLSAgX1ZBTFVFU19UT19OQU1FUyA9ICgnU1RPUCcsCi0gICAgICAgICAgICAgICAgICAgICAgJ1ZPSUQnLAotICAgICAgICAgICAgICAgICAgICAgICdCT09MJywKLSAgICAgICAgICAgICAgICAgICAgICAnQllURScsCi0gICAgICAgICAgICAgICAgICAgICAgJ0RPVUJMRScsCi0gICAgICAgICAgICAgICAgICAgICAgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAnSTE2JywKLSAgICAgICAgICAgICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAnSTY0JywKLSAgICAgICAgICAgICAgICAgICAgICdTVFJJTkcnLAotICAgICAgICAgICAgICAgICAgICAgJ1NUUlVDVCcsCi0gICAgICAgICAgICAgICAgICAgICAnTUFQJywKLSAgICAgICAgICAgICAgICAgICAgICdTRVQnLAotICAgICAgICAgICAgICAgICAgICAgJ0xJU1QnLAotICAgICAgICAgICAgICAgICAgICAgJ1VURjgnLAotICAgICAgICAgICAgICAgICAgICAgJ1VURjE2JykKKyAgICBfVkFMVUVTX1RPX05BTUVTID0gKAorICAgICAgICAnU1RPUCcsCisgICAgICAgICdWT0lEJywKKyAgICAgICAgJ0JPT0wnLAorICAgICAgICAnQllURScsCisgICAgICAgICdET1VCTEUnLAorICAgICAgICBOb25lLAorICAgICAgICAnSTE2JywKKyAgICAgICAgTm9uZSwKKyAgICAgICAgJ0kzMicsCisgICAgICAgIE5vbmUsCisgICAgICAgICdJNjQnLAorICAgICAgICAnU1RSSU5HJywKKyAgICAgICAgJ1NUUlVDVCcsCisgICAgICAgICdNQVAnLAorICAgICAgICAnU0VUJywKKyAgICAgICAgJ0xJU1QnLAorICAgICAgICAnVVRGOCcsCisgICAgICAgICdVVEYxNicsCisgICAgKQogCiAKLWNsYXNzIFRNZXNzYWdlVHlwZToKLSAgQ0FMTCA9IDEKLSAgUkVQTFkgPSAyCi0gIEVYQ0VQVElPTiA9IDMKLSAgT05FV0FZID0gNAorY2xhc3MgVE1lc3NhZ2VUeXBlKG9iamVjdCk6CisgICAgQ0FMTCA9IDEKKyAgICBSRVBMWSA9IDIKKyAgICBFWENFUFRJT04gPSAzCisgICAgT05FV0FZID0gNAogCiAKLWNsYXNzIFRQcm9jZXNzb3I6Ci0gICIiIkJhc2UgY2xhc3MgZm9yIHByb2NzZXNzb3IsIHdoaWNoIHdvcmtzIG9uIHR3byBzdHJlYW1zLiIiIgorY2xhc3MgVFByb2Nlc3NvcihvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHByb2Nlc3Nvciwgd2hpY2ggd29ya3Mgb24gdHdvIHN0cmVhbXMuIiIiCiAKLSAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KToKLSAgICBwYXNzCisgICAgZGVmIHByb2Nlc3Moc2VsZiwgaXByb3QsIG9wcm90KToKKyAgICAgICAgcGFzcwogCiAKIGNsYXNzIFRFeGNlcHRpb24oRXhjZXB0aW9uKToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHRocmlmdCBleGNlcHRpb25zLiIiIgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB0aHJpZnQgZXhjZXB0aW9ucy4iIiIKIAotICAjIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkIGluIFB5dGhvbiB2WzIuNiwzLjApCi0gIGlmICgyLCA2LCAwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDApOgotICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5fbWVzc2FnZQorICAgICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQgaW4gUHl0aG9uIHZbMi42LDMuMCkKKyAgICBpZiAoMiwgNiwgMCkgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKKyAgICAgICAgZGVmIF9nZXRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9tZXNzYWdlCiAKLSAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgc2VsZi5fbWVzc2FnZSA9IG1lc3NhZ2UKLSAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCisgICAgICAgIGRlZiBfc2V0X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQorICAgICAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCi0gICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQogCiAKIGNsYXNzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihURXhjZXB0aW9uKToKLSAgIiIiQXBwbGljYXRpb24gbGV2ZWwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCisgICAgIiIiQXBwbGljYXRpb24gbGV2ZWwgdGhyaWZ0IGV4Y2VwdGlvbnMuIiIiCiAKLSAgVU5LTk9XTiA9IDAKLSAgVU5LTk9XTl9NRVRIT0QgPSAxCi0gIElOVkFMSURfTUVTU0FHRV9UWVBFID0gMgotICBXUk9OR19NRVRIT0RfTkFNRSA9IDMKLSAgQkFEX1NFUVVFTkNFX0lEID0gNAotICBNSVNTSU5HX1JFU1VMVCA9IDUKLSAgSU5URVJOQUxfRVJST1IgPSA2Ci0gIFBST1RPQ09MX0VSUk9SID0gNworICAgIFVOS05PV04gPSAwCisgICAgVU5LTk9XTl9NRVRIT0QgPSAxCisgICAgSU5WQUxJRF9NRVNTQUdFX1RZUEUgPSAyCisgICAgV1JPTkdfTUVUSE9EX05BTUUgPSAzCisgICAgQkFEX1NFUVVFTkNFX0lEID0gNAorICAgIE1JU1NJTkdfUkVTVUxUID0gNQorICAgIElOVEVSTkFMX0VSUk9SID0gNgorICAgIFBST1RPQ09MX0VSUk9SID0gNworICAgIElOVkFMSURfVFJBTlNGT1JNID0gOAorICAgIElOVkFMSURfUFJPVE9DT0wgPSA5CisgICAgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMAogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICBpZiBzZWxmLm1lc3NhZ2U6Ci0gICAgICByZXR1cm4gc2VsZi5tZXNzYWdlCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5VTktOT1dOX01FVEhPRDoKLSAgICAgIHJldHVybiAnVW5rbm93biBtZXRob2QnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRToKLSAgICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5XUk9OR19NRVRIT0RfTkFNRToKLSAgICAgIHJldHVybiAnV3JvbmcgbWV0aG9kIG5hbWUnCi0gICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5CQURfU0VRVUVOQ0VfSUQ6Ci0gICAgICByZXR1cm4gJ0JhZCBzZXF1ZW5jZSBJRCcKLSAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUOgotICAgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKLSAgICBlbHNlOgotICAgICAgcmV0dXJuICdEZWZhdWx0ICh1bmtub3duKSBUQXBwbGljYXRpb25FeGNlcHRpb24nCi0KLSAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgotICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCi0gICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgICBicmVhawotICAgICAgaWYgZmlkID09IDE6Ci0gICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKLSAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBpcHJvdC5yZWFkU3RyaW5nKCkKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tZXNzYWdlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOS05PV05fTUVUSE9EOgorICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIG1ldGhvZCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX01FU1NBR0VfVFlQRToKKyAgICAgICAgICAgIHJldHVybiAnSW52YWxpZCBtZXNzYWdlIHR5cGUnCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuV1JPTkdfTUVUSE9EX05BTUU6CisgICAgICAgICAgICByZXR1cm4gJ1dyb25nIG1ldGhvZCBuYW1lJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLkJBRF9TRVFVRU5DRV9JRDoKKyAgICAgICAgICAgIHJldHVybiAnQmFkIHNlcXVlbmNlIElEJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLk1JU1NJTkdfUkVTVUxUOgorICAgICAgICAgICAgcmV0dXJuICdNaXNzaW5nIHJlc3VsdCcKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlRFUk5BTF9FUlJPUjoKKyAgICAgICAgICAgIHJldHVybiAnSW50ZXJuYWwgZXJyb3InCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IHNlbGYuUFJPVE9DT0xfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gJ1Byb3RvY29sIGVycm9yJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLklOVkFMSURfVFJBTlNGT1JNOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIHRyYW5zZm9ybScKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gc2VsZi5JTlZBTElEX1BST1RPQ09MOgorICAgICAgICAgICAgcmV0dXJuICdJbnZhbGlkIHByb3RvY29sJworICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBzZWxmLlVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOgorICAgICAgICAgICAgcmV0dXJuICdVbnN1cHBvcnRlZCBjbGllbnQgdHlwZScKICAgICAgICAgZWxzZToKLSAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgZWxpZiBmaWQgPT0gMjoKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCi0gICAgICBlbHNlOgotICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQotICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKLSAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKyAgICAgICAgICAgIHJldHVybiAnRGVmYXVsdCAodW5rbm93bikgVEFwcGxpY2F0aW9uRXhjZXB0aW9uJwogCi0gIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6Ci0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKLSAgICBpZiBzZWxmLm1lc3NhZ2UgaXMgbm90IE5vbmU6Ci0gICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZS5TVFJJTkcsIDEpCi0gICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2UpCi0gICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKLSAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6Ci0gICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDIpCi0gICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCi0gICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKLSAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCi0gICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorICAgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBmaWQgPT0gMToKKyAgICAgICAgICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IGlwcm90LnJlYWRTdHJpbmcoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICAgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlID0gaXByb3QucmVhZEkzMigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJykKKyAgICAgICAgaWYgc2VsZi5tZXNzYWdlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5tZXNzYWdlKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIGlmIHNlbGYudHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlLkkzMiwgMikKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYudHlwZSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworCitjbGFzcyBURnJvemVuRGljdChkaWN0KToKKyAgICAiIiJBIGRpY3Rpb25hcnkgdGhhdCBpcyAiZnJvemVuIiBsaWtlIGEgZnJvemVuc2V0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3VwZXIoVEZyb3plbkRpY3QsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgIyBTb3J0IHRoZSBpdGVtcyBzbyB0aGV5IHdpbGwgYmUgaW4gYSBjb25zaXN0ZW50IG9yZGVyLgorICAgICAgICAjIFhPUiBpbiB0aGUgaGFzaCBvZiB0aGUgY2xhc3Mgc28gd2UgZG9uJ3QgY29sbGlkZSB3aXRoCisgICAgICAgICMgdGhlIGhhc2ggb2YgYSBsaXN0IG9mIHR1cGxlcy4KKyAgICAgICAgc2VsZi5fX2hhc2h2YWwgPSBoYXNoKFRGcm96ZW5EaWN0KSBeIGhhc2godHVwbGUoc29ydGVkKHNlbGYuaXRlbXMoKSkpKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIFRGcmVlemFibGVEaWN0IikKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBURnJlZXphYmxlRGljdCIpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faGFzaHZhbApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9jb21wYXQucHkgYi9saWIvcHkvc3JjL2NvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTgyNzFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9jb21wYXQucHkKQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBzeXMKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA9PSAyOgorCisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIEJ1ZmZlcklPCisKKyAgICBkZWYgYmluYXJ5X3RvX3N0cihiaW5fdmFsKToKKyAgICAgICAgcmV0dXJuIGJpbl92YWwKKworICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgorICAgICAgICByZXR1cm4gc3RyX3ZhbAorCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIG9yZChieXRlc192YWxbaV0pCisKK2Vsc2U6CisKKyAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPIGFzIEJ1ZmZlcklPICAjIG5vcWEKKworICAgIGRlZiBiaW5hcnlfdG9fc3RyKGJpbl92YWwpOgorICAgICAgICByZXR1cm4gYmluX3ZhbC5kZWNvZGUoJ3V0ZjgnKQorCisgICAgZGVmIHN0cl90b19iaW5hcnkoc3RyX3ZhbCk6CisgICAgICAgIHJldHVybiBieXRlcyhzdHJfdmFsLCAndXRmOCcpCisKKyAgICBkZWYgYnl0ZV9pbmRleChieXRlc192YWwsIGkpOgorICAgICAgICByZXR1cm4gYnl0ZXNfdmFsW2ldCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9iaW5hcnkuY3BwIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWQ4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvYmluYXJ5LmNwcApAQCAtMCwwICsxLDM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQvYmluYXJ5LmgiCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworYm9vbCBCaW5hcnlQcm90b2NvbDo6cmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZykgeworICB1aW50OF90IGIgPSAwOworICBpZiAoIXJlYWRCeXRlKGIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHR5cGUgPSBzdGF0aWNfY2FzdDxUVHlwZT4oYik7CisgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiByZWFkSTE2KHRhZyk7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaCBiL2xpYi9weS9zcmMvZXh0L2JpbmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MGIwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFRIUklGVF9QWV9CSU5BUllfSAorI2RlZmluZSBUSFJJRlRfUFlfQklOQVJZX0gKKworI2luY2x1ZGUgPFB5dGhvbi5oPgorI2luY2x1ZGUgImV4dC9wcm90b2NvbC5oIgorI2luY2x1ZGUgImV4dC9lbmRpYW4uaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2NsYXNzIEJpbmFyeVByb3RvY29sIDogcHVibGljIFByb3RvY29sQmFzZTxCaW5hcnlQcm90b2NvbD4geworcHVibGljOgorICB2aXJ0dWFsIH5CaW5hcnlQcm90b2NvbCgpIHt9CisKKyAgdm9pZCB3cml0ZUk4KGludDhfdCB2YWwpIHsgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnZhbCksIHNpemVvZihpbnQ4X3QpKTsgfQorCisgIHZvaWQgd3JpdGVJMTYoaW50MTZfdCB2YWwpIHsKKyAgICBpbnQxNl90IG5ldCA9IHN0YXRpY19jYXN0PGludDE2X3Q+KGh0b25zKHZhbCkpOworICAgIHdyaXRlQnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZuZXQpLCBzaXplb2YoaW50MTZfdCkpOworICB9CisKKyAgdm9pZCB3cml0ZUkzMihpbnQzMl90IHZhbCkgeworICAgIGludDMyX3QgbmV0ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaHRvbmwodmFsKSk7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm5ldCksIHNpemVvZihpbnQzMl90KSk7CisgIH0KKworICB2b2lkIHdyaXRlSTY0KGludDY0X3QgdmFsKSB7CisgICAgaW50NjRfdCBuZXQgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihodG9ubGwodmFsKSk7CisgICAgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm5ldCksIHNpemVvZihpbnQ2NF90KSk7CisgIH0KKworICB2b2lkIHdyaXRlRG91YmxlKGRvdWJsZSBkdWIpIHsKKyAgICAvLyBVbmZvcnR1bmF0ZWx5LCBiaXR3aXNlX2Nhc3QgZG9lc24ndCB3b3JrIGluIEMuICBCYWQgQyEKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgZjsKKyAgICAgIGludDY0X3QgdDsKKyAgICB9IHRyYW5zZmVyOworICAgIHRyYW5zZmVyLmYgPSBkdWI7CisgICAgd3JpdGVJNjQodHJhbnNmZXIudCk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChpbnQgdikgeyB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4odikpOyB9CisKKyAgdm9pZCB3cml0ZVN0cmluZyhQeU9iamVjdCogdmFsdWUsIGludDMyX3QgbGVuKSB7CisgICAgd3JpdGVJMzIobGVuKTsKKyAgICB3cml0ZUJ1ZmZlcihQeUJ5dGVzX0FTX1NUUklORyh2YWx1ZSksIGxlbik7CisgIH0KKworICBib29sIHdyaXRlTGlzdEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgU2V0TGlzdFR5cGVBcmdzJiBwYXJzZWRhcmdzLCBpbnQzMl90IGxlbikgeworICAgIHdyaXRlQnl0ZShwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSk7CisgICAgd3JpdGVJMzIobGVuKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVNYXBCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IE1hcFR5cGVBcmdzJiBwYXJzZWRhcmdzLCBpbnQzMl90IGxlbikgeworICAgIHdyaXRlQnl0ZShwYXJzZWRhcmdzLmt0YWcpOworICAgIHdyaXRlQnl0ZShwYXJzZWRhcmdzLnZ0YWcpOworICAgIHdyaXRlSTMyKGxlbik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlU3RydWN0QmVnaW4oKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgd3JpdGVTdHJ1Y3RFbmQoKSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgd3JpdGVGaWVsZChQeU9iamVjdCogdmFsdWUsIGNvbnN0IFN0cnVjdEl0ZW1TcGVjJiBwYXJzZWRzcGVjKSB7CisgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBhcnNlZHNwZWMudHlwZSkpOworICAgIHdyaXRlSTE2KHBhcnNlZHNwZWMudGFnKTsKKyAgICByZXR1cm4gZW5jb2RlVmFsdWUodmFsdWUsIHBhcnNlZHNwZWMudHlwZSwgcGFyc2Vkc3BlYy50eXBlYXJncyk7CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeyB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oVF9TVE9QKSk7IH0KKworICBib29sIHJlYWRCb29sKGJvb2wmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCAxKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2YWwgPSBidWZbMF0gPT0gMTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEk4KGludDhfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgcmVhZEkxNihpbnQxNl90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoJnZhbCwgYnVmLCBzaXplb2YoaW50MTZfdCkpOworICAgIHZhbCA9IG50b2hzKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWRJMzIoaW50MzJfdCYgdmFsKSB7CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQzMl90KSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICB2YWwgPSBudG9obCh2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTY0KGludDY0X3QmIHZhbCkgeworICAgIGNoYXIqIGJ1ZjsKKyAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50NjRfdCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQ2NF90KSk7CisgICAgdmFsID0gbnRvaGxsKHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHJlYWREb3VibGUoZG91YmxlJiB2YWwpIHsKKyAgICB1bmlvbiB7CisgICAgICBpbnQ2NF90IGY7CisgICAgICBkb3VibGUgdDsKKyAgICB9IHRyYW5zZmVyOworCisgICAgaWYgKCFyZWFkSTY0KHRyYW5zZmVyLmYpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IHRyYW5zZmVyLnQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpbnQzMl90IHJlYWRTdHJpbmcoY2hhcioqIGJ1ZikgeworICAgIGludDMyX3QgbGVuID0gMDsKKyAgICBpZiAoIXJlYWRJMzIobGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIHN0cmluZ0xpbWl0KCkpIHx8ICFyZWFkQnl0ZXMoYnVmLCBsZW4pKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBsZW47CisgIH0KKworICBpbnQzMl90IHJlYWRMaXN0QmVnaW4oVFR5cGUmIGV0eXBlKSB7CisgICAgaW50MzJfdCBsZW47CisgICAgdWludDhfdCBiID0gMDsKKyAgICBpZiAoIXJlYWRCeXRlKGIpIHx8ICFyZWFkSTMyKGxlbikgfHwgIWNoZWNrTGVuZ3RoTGltaXQobGVuLCBjb250YWluZXJMaW1pdCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBldHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihiKTsKKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTWFwQmVnaW4oVFR5cGUmIGt0eXBlLCBUVHlwZSYgdnR5cGUpIHsKKyAgICBpbnQzMl90IGxlbjsKKyAgICB1aW50OF90IGssIHY7CisgICAgaWYgKCFyZWFkQnl0ZShrKSB8fCAhcmVhZEJ5dGUodikgfHwgIXJlYWRJMzIobGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGt0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KGspOworICAgIHZ0eXBlID0gc3RhdGljX2Nhc3Q8VFR5cGU+KHYpOworICAgIHJldHVybiBsZW47CisgIH0KKworICBib29sIHJlYWRTdHJ1Y3RCZWdpbigpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCByZWFkU3RydWN0RW5kKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGJvb2wgcmVhZEZpZWxkQmVnaW4oVFR5cGUmIHR5cGUsIGludDE2X3QmIHRhZyk7CisKKyNkZWZpbmUgU0tJUEJZVEVTKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXJlYWRCeXRlcygmZHVtbXlfYnVmXywgKG4pKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworICBib29sIHNraXBCb29sKCkgeyBTS0lQQllURVMoMSk7IH0KKyAgYm9vbCBza2lwQnl0ZSgpIHsgU0tJUEJZVEVTKDEpOyB9CisgIGJvb2wgc2tpcEkxNigpIHsgU0tJUEJZVEVTKDIpOyB9CisgIGJvb2wgc2tpcEkzMigpIHsgU0tJUEJZVEVTKDQpOyB9CisgIGJvb2wgc2tpcEk2NCgpIHsgU0tJUEJZVEVTKDgpOyB9CisgIGJvb2wgc2tpcERvdWJsZSgpIHsgU0tJUEJZVEVTKDgpOyB9CisgIGJvb2wgc2tpcFN0cmluZygpIHsKKyAgICBpbnQzMl90IGxlbjsKKyAgICBpZiAoIXJlYWRJMzIobGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTS0lQQllURVMobGVuKTsKKyAgfQorI3VuZGVmIFNLSVBCWVRFUworCitwcml2YXRlOgorICBjaGFyKiBkdW1teV9idWZfOworfTsKK30KK30KK30KKyNlbmRpZiAvLyBUSFJJRlRfUFlfQklOQVJZX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuY3BwIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhOTlhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJleHQvY29tcGFjdC5oIgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKworY29uc3QgdWludDhfdCBDb21wYWN0UHJvdG9jb2w6OlRUeXBlVG9DVHlwZVtdID0geworICAgIENUX1NUT1AsICAgICAgICAgLy8gVF9TVE9QCisgICAgMCwgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICBDVF9CT09MRUFOX1RSVUUsIC8vIFRfQk9PTAorICAgIENUX0JZVEUsICAgICAgICAgLy8gVF9CWVRFCisgICAgQ1RfRE9VQkxFLCAgICAgICAvLyBUX0RPVUJMRQorICAgIDAsICAgICAgICAgICAgICAgLy8gdW51c2VkCisgICAgQ1RfSTE2LCAgICAgICAgICAvLyBUX0kxNgorICAgIDAsICAgICAgICAgICAgICAgLy8gdW51c2VkCisgICAgQ1RfSTMyLCAgICAgICAgICAvLyBUX0kzMgorICAgIDAsICAgICAgICAgICAgICAgLy8gdW51c2VkCisgICAgQ1RfSTY0LCAgICAgICAgICAvLyBUX0k2NAorICAgIENUX0JJTkFSWSwgICAgICAgLy8gVF9TVFJJTkcKKyAgICBDVF9TVFJVQ1QsICAgICAgIC8vIFRfU1RSVUNUCisgICAgQ1RfTUFQLCAgICAgICAgICAvLyBUX01BUAorICAgIENUX1NFVCwgICAgICAgICAgLy8gVF9TRVQKKyAgICBDVF9MSVNULCAgICAgICAgIC8vIFRfTElTVAorfTsKKworYm9vbCBDb21wYWN0UHJvdG9jb2w6OnJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpIHsKKyAgdWludDhfdCBiOworICBpZiAoIXJlYWRCeXRlKGIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVpbnQ4X3QgY3R5cGUgPSBiICYgMHhmOworICB0eXBlID0gZ2V0VFR5cGUoY3R5cGUpOworICBpZiAodHlwZSA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgIHRhZyA9IDA7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdWludDhfdCBkaWZmID0gKGIgJiAweGYwKSA+PiA0OworICBpZiAoZGlmZikgeworICAgIHRhZyA9IHJlYWRUYWdzXy50b3AoKSArIGRpZmY7CisgIH0gZWxzZSBpZiAoIXJlYWRJMTYodGFnKSkgeworICAgIHJlYWRUYWdzXy50b3AoKSA9IC0xOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoY3R5cGUgPT0gQ1RfQk9PTEVBTl9GQUxTRSB8fCBjdHlwZSA9PSBDVF9CT09MRUFOX1RSVUUpIHsKKyAgICByZWFkQm9vbF8uZXhpc3RzID0gdHJ1ZTsKKyAgICByZWFkQm9vbF8udmFsdWUgPSBjdHlwZSA9PSBDVF9CT09MRUFOX1RSVUU7CisgIH0KKyAgcmVhZFRhZ3NfLnRvcCgpID0gdGFnOworICByZXR1cm4gdHJ1ZTsKK30KKworVFR5cGUgQ29tcGFjdFByb3RvY29sOjpnZXRUVHlwZSh1aW50OF90IHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgIGNhc2UgVF9TVE9QOgorICAgIHJldHVybiBUX1NUT1A7CisgIGNhc2UgQ1RfQk9PTEVBTl9GQUxTRToKKyAgY2FzZSBDVF9CT09MRUFOX1RSVUU6CisgICAgcmV0dXJuIFRfQk9PTDsKKyAgY2FzZSBDVF9CWVRFOgorICAgIHJldHVybiBUX0JZVEU7CisgIGNhc2UgQ1RfSTE2OgorICAgIHJldHVybiBUX0kxNjsKKyAgY2FzZSBDVF9JMzI6CisgICAgcmV0dXJuIFRfSTMyOworICBjYXNlIENUX0k2NDoKKyAgICByZXR1cm4gVF9JNjQ7CisgIGNhc2UgQ1RfRE9VQkxFOgorICAgIHJldHVybiBUX0RPVUJMRTsKKyAgY2FzZSBDVF9CSU5BUlk6CisgICAgcmV0dXJuIFRfU1RSSU5HOworICBjYXNlIENUX0xJU1Q6CisgICAgcmV0dXJuIFRfTElTVDsKKyAgY2FzZSBDVF9TRVQ6CisgICAgcmV0dXJuIFRfU0VUOworICBjYXNlIENUX01BUDoKKyAgICByZXR1cm4gVF9NQVA7CisgIGNhc2UgQ1RfU1RSVUNUOgorICAgIHJldHVybiBUX1NUUlVDVDsKKyAgZGVmYXVsdDoKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICVkIiwgdHlwZSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFRUeXBlPigtMSk7CisgIH0KK30KK30KK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuaCBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhkN2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX0NPTVBBQ1RfSAorI2RlZmluZSBUSFJJRlRfUFlfQ09NUEFDVF9ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJleHQvcHJvdG9jb2wuaCIKKyNpbmNsdWRlICJleHQvZW5kaWFuLmgiCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RhY2s+CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitjbGFzcyBDb21wYWN0UHJvdG9jb2wgOiBwdWJsaWMgUHJvdG9jb2xCYXNlPENvbXBhY3RQcm90b2NvbD4geworcHVibGljOgorICBDb21wYWN0UHJvdG9jb2woKSB7IHJlYWRCb29sXy5leGlzdHMgPSBmYWxzZTsgfQorCisgIHZpcnR1YWwgfkNvbXBhY3RQcm90b2NvbCgpIHt9CisKKyAgdm9pZCB3cml0ZUk4KGludDhfdCB2YWwpIHsgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnZhbCksIDEpOyB9CisKKyAgdm9pZCB3cml0ZUkxNihpbnQxNl90IHZhbCkgeyB3cml0ZVZhcmludCh0b1ppZ1phZyh2YWwpKTsgfQorCisgIGludCB3cml0ZUkzMihpbnQzMl90IHZhbCkgeyByZXR1cm4gd3JpdGVWYXJpbnQodG9aaWdaYWcodmFsKSk7IH0KKworICB2b2lkIHdyaXRlSTY0KGludDY0X3QgdmFsKSB7IHdyaXRlVmFyaW50NjQodG9aaWdaYWc2NCh2YWwpKTsgfQorCisgIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgeworICAgIHVuaW9uIHsKKyAgICAgIGRvdWJsZSBmOworICAgICAgaW50NjRfdCB0OworICAgIH0gdHJhbnNmZXI7CisgICAgdHJhbnNmZXIuZiA9IGh0b2xlbGwoZHViKTsKKyAgICB3cml0ZUJ1ZmZlcihyZWludGVycHJldF9jYXN0PGNoYXIqPigmdHJhbnNmZXIudCksIHNpemVvZihpbnQ2NF90KSk7CisgIH0KKworICB2b2lkIHdyaXRlQm9vbChpbnQgdikgeyB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4odiA/IENUX0JPT0xFQU5fVFJVRSA6IENUX0JPT0xFQU5fRkFMU0UpKTsgfQorCisgIHZvaWQgd3JpdGVTdHJpbmcoUHlPYmplY3QqIHZhbHVlLCBpbnQzMl90IGxlbikgeworICAgIHdyaXRlVmFyaW50KGxlbik7CisgICAgd3JpdGVCdWZmZXIoUHlCeXRlc19BU19TVFJJTkcodmFsdWUpLCBsZW4pOworICB9CisKKyAgYm9vbCB3cml0ZUxpc3RCZWdpbihQeU9iamVjdCogdmFsdWUsIGNvbnN0IFNldExpc3RUeXBlQXJncyYgYXJncywgaW50MzJfdCBsZW4pIHsKKyAgICBpbnQgY3R5cGUgPSB0b0NvbXBhY3RUeXBlKGFyZ3MuZWxlbWVudF90eXBlKTsKKyAgICBpZiAobGVuIDw9IDE0KSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4obGVuIDw8IDQgfCBjdHlwZSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoMHhmMCB8IGN0eXBlKTsKKyAgICAgIHdyaXRlVmFyaW50KGxlbik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZU1hcEJlZ2luKFB5T2JqZWN0KiB2YWx1ZSwgY29uc3QgTWFwVHlwZUFyZ3MmIGFyZ3MsIGludDMyX3QgbGVuKSB7CisgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICB3cml0ZUJ5dGUoMCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGN0eXBlID0gdG9Db21wYWN0VHlwZShhcmdzLmt0YWcpIDw8IDQgfCB0b0NvbXBhY3RUeXBlKGFyZ3MudnRhZyk7CisgICAgd3JpdGVWYXJpbnQobGVuKTsKKyAgICB3cml0ZUJ5dGUoY3R5cGUpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCB3cml0ZVN0cnVjdEJlZ2luKCkgeworICAgIHdyaXRlVGFnc18ucHVzaCgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHdyaXRlU3RydWN0RW5kKCkgeworICAgIHdyaXRlVGFnc18ucG9wKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIHdyaXRlRmllbGQoUHlPYmplY3QqIHZhbHVlLCBjb25zdCBTdHJ1Y3RJdGVtU3BlYyYgc3BlYykgeworICAgIGlmIChzcGVjLnR5cGUgPT0gVF9CT09MKSB7CisgICAgICBkb1dyaXRlRmllbGRCZWdpbihzcGVjLCBQeU9iamVjdF9Jc1RydWUodmFsdWUpID8gQ1RfQk9PTEVBTl9UUlVFIDogQ1RfQk9PTEVBTl9GQUxTRSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgZG9Xcml0ZUZpZWxkQmVnaW4oc3BlYywgdG9Db21wYWN0VHlwZShzcGVjLnR5cGUpKTsKKyAgICAgIHJldHVybiBlbmNvZGVWYWx1ZSh2YWx1ZSwgc3BlYy50eXBlLCBzcGVjLnR5cGVhcmdzKTsKKyAgICB9CisgIH0KKworICB2b2lkIHdyaXRlRmllbGRTdG9wKCkgeyB3cml0ZUJ5dGUoMCk7IH0KKworICBib29sIHJlYWRCb29sKGJvb2wmIHZhbCkgeworICAgIGlmIChyZWFkQm9vbF8uZXhpc3RzKSB7CisgICAgICByZWFkQm9vbF8uZXhpc3RzID0gZmFsc2U7CisgICAgICB2YWwgPSByZWFkQm9vbF8udmFsdWU7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2hhciogYnVmOworICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIDEpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhbCA9IGJ1ZlswXSA9PSBDVF9CT09MRUFOX1RSVUU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCByZWFkSTgoaW50OF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gYnVmWzBdOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSTE2KGludDE2X3QmIHZhbCkgeworICAgIHVpbnQxNl90IHV2YWw7CisgICAgaWYgKHJlYWRWYXJpbnQ8dWludDE2X3QsIDM+KHV2YWwpKSB7CisgICAgICB2YWwgPSBmcm9tWmlnWmFnPGludDE2X3QsIHVpbnQxNl90Pih1dmFsKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIHJlYWRJMzIoaW50MzJfdCYgdmFsKSB7CisgICAgdWludDMyX3QgdXZhbDsKKyAgICBpZiAocmVhZFZhcmludDx1aW50MzJfdCwgNT4odXZhbCkpIHsKKyAgICAgIHZhbCA9IGZyb21aaWdaYWc8aW50MzJfdCwgdWludDMyX3Q+KHV2YWwpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgcmVhZEk2NChpbnQ2NF90JiB2YWwpIHsKKyAgICB1aW50NjRfdCB1dmFsOworICAgIGlmIChyZWFkVmFyaW50PHVpbnQ2NF90LCAxMD4odXZhbCkpIHsKKyAgICAgIHZhbCA9IGZyb21aaWdaYWc8aW50NjRfdCwgdWludDY0X3Q+KHV2YWwpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgcmVhZERvdWJsZShkb3VibGUmIHZhbCkgeworICAgIHVuaW9uIHsKKyAgICAgIGludDY0X3QgZjsKKyAgICAgIGRvdWJsZSB0OworICAgIH0gdHJhbnNmZXI7CisKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgOCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KCZ0cmFuc2Zlci5mLCBidWYsIHNpemVvZihpbnQ2NF90KSk7CisgICAgdHJhbnNmZXIuZiA9IGxldG9obGwodHJhbnNmZXIuZik7CisgICAgdmFsID0gdHJhbnNmZXIudDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludDMyX3QgcmVhZFN0cmluZyhjaGFyKiogYnVmKSB7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIHN0cmluZ0xpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChsZW4gPT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghcmVhZEJ5dGVzKGJ1ZiwgbGVuKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgaW50MzJfdCByZWFkTGlzdEJlZ2luKFRUeXBlJiBldHlwZSkgeworICAgIHVpbnQ4X3QgYjsKKyAgICBpZiAoIXJlYWRCeXRlKGIpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGV0eXBlID0gZ2V0VFR5cGUoYiAmIDB4Zik7CisgICAgaWYgKGV0eXBlID09IC0xKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHVpbnQzMl90IGxlbiA9IChiID4+IDQpICYgMHhmOworICAgIGlmIChsZW4gPT0gMTUgJiYgIXJlYWRWYXJpbnQ8dWludDMyX3QsIDU+KGxlbikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFjaGVja0xlbmd0aExpbWl0KGxlbiwgY29udGFpbmVyTGltaXQoKSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGxlbjsKKyAgfQorCisgIGludDMyX3QgcmVhZE1hcEJlZ2luKFRUeXBlJiBrdHlwZSwgVFR5cGUmIHZ0eXBlKSB7CisgICAgdWludDMyX3QgbGVuOworICAgIGlmICghcmVhZFZhcmludDx1aW50MzJfdCwgNT4obGVuKSB8fCAhY2hlY2tMZW5ndGhMaW1pdChsZW4sIGNvbnRhaW5lckxpbWl0KCkpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChsZW4gIT0gMCkgeworICAgICAgdWludDhfdCBrdlR5cGU7CisgICAgICBpZiAoIXJlYWRCeXRlKGt2VHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAga3R5cGUgPSBnZXRUVHlwZShrdlR5cGUgPj4gNCk7CisgICAgICB2dHlwZSA9IGdldFRUeXBlKGt2VHlwZSAmIDB4Zik7CisgICAgICBpZiAoa3R5cGUgPT0gLTEgfHwgdnR5cGUgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGVuOworICB9CisKKyAgYm9vbCByZWFkU3RydWN0QmVnaW4oKSB7CisgICAgcmVhZFRhZ3NfLnB1c2goMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgYm9vbCByZWFkU3RydWN0RW5kKCkgeworICAgIHJlYWRUYWdzXy5wb3AoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHJlYWRGaWVsZEJlZ2luKFRUeXBlJiB0eXBlLCBpbnQxNl90JiB0YWcpOworCisgIGJvb2wgc2tpcEJvb2woKSB7CisgICAgYm9vbCB2YWw7CisgICAgcmV0dXJuIHJlYWRCb29sKHZhbCk7CisgIH0KKyNkZWZpbmUgU0tJUEJZVEVTKG4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXJlYWRCeXRlcygmZHVtbXlfYnVmXywgKG4pKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyAgYm9vbCBza2lwQnl0ZSgpIHsgU0tJUEJZVEVTKDEpOyB9CisgIGJvb2wgc2tpcERvdWJsZSgpIHsgU0tJUEJZVEVTKDgpOyB9CisgIGJvb2wgc2tpcEkxNigpIHsKKyAgICBpbnQxNl90IHZhbDsKKyAgICByZXR1cm4gcmVhZEkxNih2YWwpOworICB9CisgIGJvb2wgc2tpcEkzMigpIHsKKyAgICBpbnQzMl90IHZhbDsKKyAgICByZXR1cm4gcmVhZEkzMih2YWwpOworICB9CisgIGJvb2wgc2tpcEk2NCgpIHsKKyAgICBpbnQ2NF90IHZhbDsKKyAgICByZXR1cm4gcmVhZEk2NCh2YWwpOworICB9CisgIGJvb2wgc2tpcFN0cmluZygpIHsKKyAgICB1aW50MzJfdCBsZW47CisgICAgaWYgKCFyZWFkVmFyaW50PHVpbnQzMl90LCA1PihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFNLSVBCWVRFUyhsZW4pOworICB9CisjdW5kZWYgU0tJUEJZVEVTCisKK3ByaXZhdGU6CisgIGVudW0gVHlwZXMgeworICAgIENUX1NUT1AgPSAweDAwLAorICAgIENUX0JPT0xFQU5fVFJVRSA9IDB4MDEsCisgICAgQ1RfQk9PTEVBTl9GQUxTRSA9IDB4MDIsCisgICAgQ1RfQllURSA9IDB4MDMsCisgICAgQ1RfSTE2ID0gMHgwNCwKKyAgICBDVF9JMzIgPSAweDA1LAorICAgIENUX0k2NCA9IDB4MDYsCisgICAgQ1RfRE9VQkxFID0gMHgwNywKKyAgICBDVF9CSU5BUlkgPSAweDA4LAorICAgIENUX0xJU1QgPSAweDA5LAorICAgIENUX1NFVCA9IDB4MEEsCisgICAgQ1RfTUFQID0gMHgwQiwKKyAgICBDVF9TVFJVQ1QgPSAweDBDCisgIH07CisKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgVFR5cGVUb0NUeXBlW107CisKKyAgVFR5cGUgZ2V0VFR5cGUodWludDhfdCB0eXBlKTsKKworICBpbnQgdG9Db21wYWN0VHlwZShUVHlwZSB0eXBlKSB7CisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KHR5cGUpOworICAgIHJldHVybiBpIDwgMTYgPyBUVHlwZVRvQ1R5cGVbaV0gOiAtMTsKKyAgfQorCisgIHVpbnQzMl90IHRvWmlnWmFnKGludDMyX3QgdmFsKSB7IHJldHVybiAodmFsID4+IDMxKSBeICh2YWwgPDwgMSk7IH0KKworICB1aW50NjRfdCB0b1ppZ1phZzY0KGludDY0X3QgdmFsKSB7IHJldHVybiAodmFsID4+IDYzKSBeICh2YWwgPDwgMSk7IH0KKworICBpbnQgd3JpdGVWYXJpbnQodWludDMyX3QgdmFsKSB7CisgICAgaW50IGNudCA9IDE7CisgICAgd2hpbGUgKHZhbCAmIH4weDdmVSkgeworICAgICAgd3JpdGVCeXRlKHN0YXRpY19jYXN0PGNoYXI+KCh2YWwgJiAweDdmVSkgfCAweDgwVSkpOworICAgICAgdmFsID4+PSA3OworICAgICAgKytjbnQ7CisgICAgfQorICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPih2YWwpKTsKKyAgICByZXR1cm4gY250OworICB9CisKKyAgaW50IHdyaXRlVmFyaW50NjQodWludDY0X3QgdmFsKSB7CisgICAgaW50IGNudCA9IDE7CisgICAgd2hpbGUgKHZhbCAmIH4weDdmVUxMKSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8Y2hhcj4oKHZhbCAmIDB4N2ZVTEwpIHwgMHg4MFVMTCkpOworICAgICAgdmFsID4+PSA3OworICAgICAgKytjbnQ7CisgICAgfQorICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDxjaGFyPih2YWwpKTsKKyAgICByZXR1cm4gY250OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIGludCBNYXg+CisgIGJvb2wgcmVhZFZhcmludChUJiByZXN1bHQpIHsKKyAgICB1aW50OF90IGI7CisgICAgVCB2YWwgPSAwOworICAgIGludCBzaGlmdCA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXg7ICsraSkgeworICAgICAgaWYgKCFyZWFkQnl0ZShiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoYiAmIDB4ODApIHsKKyAgICAgICAgdmFsIHw9IHN0YXRpY19jYXN0PFQ+KGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHZhbCB8PSBzdGF0aWNfY2FzdDxUPihiKSA8PCBzaGlmdDsKKyAgICAgICAgcmVzdWx0ID0gdmFsOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHNoaWZ0ICs9IDc7CisgICAgfQorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLCAidmFyaW50IGV4Y2VlZGVkICVkIGJ5dGVzIiwgTWF4KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUywgdHlwZW5hbWUgVT4KKyAgUyBmcm9tWmlnWmFnKFUgdmFsKSB7CisgICAgcmV0dXJuICh2YWwgPj4gMSkgXiBzdGF0aWNfY2FzdDxVPigtc3RhdGljX2Nhc3Q8Uz4odmFsICYgMSkpOworICB9CisKKyAgdm9pZCBkb1dyaXRlRmllbGRCZWdpbihjb25zdCBTdHJ1Y3RJdGVtU3BlYyYgc3BlYywgaW50IGN0eXBlKSB7CisgICAgaW50IGRpZmYgPSBzcGVjLnRhZyAtIHdyaXRlVGFnc18udG9wKCk7CisgICAgaWYgKGRpZmYgPiAwICYmIGRpZmYgPD0gMTUpIHsKKyAgICAgIHdyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihkaWZmIDw8IDQgfCBjdHlwZSkpOworICAgIH0gZWxzZSB7CisgICAgICB3cml0ZUJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oY3R5cGUpKTsKKyAgICAgIHdyaXRlSTE2KHNwZWMudGFnKTsKKyAgICB9CisgICAgd3JpdGVUYWdzXy50b3AoKSA9IHNwZWMudGFnOworICB9CisKKyAgc3RkOjpzdGFjazxpbnQ+IHdyaXRlVGFnc187CisgIHN0ZDo6c3RhY2s8aW50PiByZWFkVGFnc187CisgIHN0cnVjdCB7CisgICAgYm9vbCBleGlzdHM7CisgICAgYm9vbCB2YWx1ZTsKKyAgfSByZWFkQm9vbF87CisgIGNoYXIqIGR1bW15X2J1Zl87Cit9OworfQorfQorfQorI2VuZGlmIC8vIFRIUklGVF9QWV9DT01QQUNUX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L2VuZGlhbi5oIGIvbGliL3B5L3NyYy9leHQvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzNzJhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L2VuZGlhbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfRU5ESUFOX0gKKyNkZWZpbmUgVEhSSUZUX1BZX0VORElBTl9ICisKKyNpbmNsdWRlIDxQeXRob24uaD4KKworI2lmbmRlZiBfV0lOMzIKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZWxzZQorI2luY2x1ZGUgPFdpblNvY2syLmg+CisjcHJhZ21hIGNvbW1lbnQobGliLCAid3MyXzMyLmxpYiIpCisjZGVmaW5lIEJJR19FTkRJQU4gKDQzMjEpCisjZGVmaW5lIExJVFRMRV9FTkRJQU4gKDEyMzQpCisjZGVmaW5lIEJZVEVfT1JERVIgTElUVExFX0VORElBTgorI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbmRpZgorCisvKiBGaXggZW5kaWFubmVzcyBpc3N1ZXMgb24gU29sYXJpcyAqLworI2lmIGRlZmluZWQoX19TVlI0KSAmJiBkZWZpbmVkKF9fc3VuKQorI2lmIGRlZmluZWQoX19pMzg2KSAmJiAhZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgX19pMzg2X18KKyNlbmRpZgorCisjaWZuZGVmIEJJR19FTkRJQU4KKyNkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKKyNlbmRpZgorI2lmbmRlZiBMSVRUTEVfRU5ESUFOCisjZGVmaW5lIExJVFRMRV9FTkRJQU4gKDEyMzQpCisjZW5kaWYKKworLyogSTM4NiBpcyBMRSwgZXZlbiBvbiBTb2xhcmlzICovCisjaWYgIWRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChfX2kzODZfXykKKyNkZWZpbmUgQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9fQllURV9PUkRFUgorI2lmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKEJJR19FTkRJQU4pCisjZGVmaW5lIF9fQllURV9PUkRFUiBCWVRFX09SREVSCisjZGVmaW5lIF9fTElUVExFX0VORElBTiBMSVRUTEVfRU5ESUFOCisjZGVmaW5lIF9fQklHX0VORElBTiBCSUdfRU5ESUFOCisjZWxzZQorI2Vycm9yICJDYW5ub3QgZGV0ZXJtaW5lIGVuZGlhbm5lc3MiCisjZW5kaWYKKyNlbmRpZgorCisvLyBTYW1lIGNvbW1lbnQgYXMgdGhlIGVudW0uICBTb3JyeS4KKyNpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisjZGVmaW5lIG50b2hsbChuKSAobikKKyNkZWZpbmUgaHRvbmxsKG4pIChuKQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19HTElCQ19fKQorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CisjZGVmaW5lIGxldG9obGwobikgYnN3YXBfNjQobikKKyNkZWZpbmUgaHRvbGVsbChuKSBic3dhcF82NChuKQorI2Vsc2UgLyogR05VQyAmIEdMSUJDICovCisjZGVmaW5lIGxldG9obGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZyludG9obChuKSkgPDwgMzIpICsgbnRvaGwobiA+PiAzMikpCisjZGVmaW5lIGh0b2xlbGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZylodG9ubChuKSkgPDwgMzIpICsgaHRvbmwobiA+PiAzMikpCisjZW5kaWYKKyNlbGlmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKKyNpbmNsdWRlIDxieXRlc3dhcC5oPgorI2RlZmluZSBudG9obGwobikgYnN3YXBfNjQobikKKyNkZWZpbmUgaHRvbmxsKG4pIGJzd2FwXzY0KG4pCisjZWxzZSAvKiBHTlVDICYgR0xJQkMgKi8KKyNkZWZpbmUgbnRvaGxsKG4pICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpbnRvaGwobikpIDw8IDMyKSArIG50b2hsKG4gPj4gMzIpKQorI2RlZmluZSBodG9ubGwobikgKCgoKHVuc2lnbmVkIGxvbmcgbG9uZylodG9ubChuKSkgPDwgMzIpICsgaHRvbmwobiA+PiAzMikpCisjZW5kaWYgLyogR05VQyAmIEdMSUJDICovCisjZGVmaW5lIGxldG9obGwobikgKG4pCisjZGVmaW5lIGh0b2xlbGwobikgKG4pCisjZWxzZSAvKiBfX0JZVEVfT1JERVIgKi8KKyNlcnJvciAiQ2FuJ3QgZGVmaW5lIGh0b25sbCBvciBudG9obGwhIgorI2VuZGlmCisKKyNlbmRpZiAvLyBUSFJJRlRfUFlfRU5ESUFOX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAgYi9saWIvcHkvc3JjL2V4dC9tb2R1bGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNThiOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9tb2R1bGUuY3BwCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxQeXRob24uaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImJpbmFyeS5oIgorI2luY2x1ZGUgImNvbXBhY3QuaCIKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8vIFRPRE8oZHJlaXNzKTogZGVmdmFsIGFwcGVhcnMgdG8gYmUgdW51c2VkLiAgTG9vayBpbnRvIHJlbW92aW5nIGl0LgorLy8gVE9ETyhkcmVpc3MpOiBNYWtlIHBhcnNlX3NwZWNfYXJncyByZWN1cnNpdmUsIGFuZCBjYWNoZSB0aGUgb3V0cHV0CisvLyAgICAgICAgICAgICAgIHBlcm1hbmVudGx5IGluIHRoZSBvYmplY3QuICAoTWFsbG9jIGFuZCBvcnBoYW4uKQorLy8gVE9ETyhkcmVpc3MpOiBXaHkgZG8gd2UgbmVlZCBjU3RyaW5nSU8gZm9yIHJlYWRpbmcsIHdoeSBub3QganVzdCBjaGFyKj8KKy8vICAgICAgICAgICAgICAgQ2FuIGNTdHJpbmdJTyBsZXQgdXMgd29yayB3aXRoIGEgQnVmZmVyZWRUcmFuc3BvcnQ/CisvLyBUT0RPKGRyZWlzcyk6IERvbid0IGlnbm9yZSB0aGUgcnYgZnJvbSBjd3JpdGUgKG1heWJlKS4KKworLy8gRG9pbmcgYSBiZW5jaG1hcmsgc2hvd3MgdGhhdCBpbnRlcm5pbmcgYWN0dWFsbHkgbWFrZXMgYSBkaWZmZXJlbmNlLCBhbWF6aW5nbHkuCisKKy8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLworUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoVEZyb3plbkRpY3QpOworUHlPYmplY3QqIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1Zik7CitQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKK3N0YXRpYyBQeU9iamVjdCogSU5URVJOX1NUUklORyhzdHJpbmdfbGVuZ3RoX2xpbWl0KTsKK3N0YXRpYyBQeU9iamVjdCogSU5URVJOX1NUUklORyhjb250YWluZXJfbGVuZ3RoX2xpbWl0KTsKK3N0YXRpYyBQeU9iamVjdCogSU5URVJOX1NUUklORyh0cmFucyk7CisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBQeU9iamVjdCogZW5jb2RlX2ltcGwoUHlPYmplY3QqIGFyZ3MpIHsKKyAgaWYgKCFhcmdzKQorICAgIHJldHVybiBOVUxMOworCisgIFB5T2JqZWN0KiBlbmNfb2JqID0gTlVMTDsKKyAgUHlPYmplY3QqIHR5cGVfYXJncyA9IE5VTEw7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmZW5jX29iaiwgJnR5cGVfYXJncykpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBpZiAoIWVuY19vYmogfHwgIXR5cGVfYXJncykgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgVCBwcm90b2NvbDsKKyAgaWYgKCFwcm90b2NvbC5wcmVwYXJlRW5jb2RlQnVmZmVyKCkgfHwgIXByb3RvY29sLmVuY29kZVZhbHVlKGVuY19vYmosIFRfU1RSVUNULCB0eXBlX2FyZ3MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcHJvdG9jb2wuZ2V0RW5jb2RlZFZhbHVlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBhc19sb25nX3RoZW5fZGVsZXRlKFB5T2JqZWN0KiB2YWx1ZSwgbG9uZyBkZWZhdWx0X3ZhbHVlKSB7CisgIFNjb3BlZFB5T2JqZWN0IHNjb3BlKHZhbHVlKTsKKyAgbG9uZyB2ID0gUHlJbnRfQXNMb25nKHZhbHVlKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHYpKSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorICByZXR1cm4gdjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgUHlPYmplY3QqIGRlY29kZV9pbXBsKFB5T2JqZWN0KiBhcmdzKSB7CisgIFB5T2JqZWN0KiBvdXRwdXRfb2JqID0gTlVMTDsKKyAgUHlPYmplY3QqIG9wcm90ID0gTlVMTDsKKyAgUHlPYmplY3QqIHR5cGVhcmdzID0gTlVMTDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT08iLCAmb3V0cHV0X29iaiwgJm9wcm90LCAmdHlwZWFyZ3MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBUIHByb3RvY29sOworICBpbnQzMl90IGRlZmF1bHRfbGltaXQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpOworICBwcm90b2NvbC5zZXRTdHJpbmdMZW5ndGhMaW1pdCgKKyAgICAgIGFzX2xvbmdfdGhlbl9kZWxldGUoUHlPYmplY3RfR2V0QXR0cihvcHJvdCwgSU5URVJOX1NUUklORyhzdHJpbmdfbGVuZ3RoX2xpbWl0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfbGltaXQpKTsKKyAgcHJvdG9jb2wuc2V0Q29udGFpbmVyTGVuZ3RoTGltaXQoCisgICAgICBhc19sb25nX3RoZW5fZGVsZXRlKFB5T2JqZWN0X0dldEF0dHIob3Byb3QsIElOVEVSTl9TVFJJTkcoY29udGFpbmVyX2xlbmd0aF9saW1pdCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2xpbWl0KSk7CisgIFNjb3BlZFB5T2JqZWN0IHRyYW5zcG9ydChQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKHRyYW5zKSkpOworICBpZiAoIXRyYW5zcG9ydCkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIXByb3RvY29sLnByZXBhcmVEZWNvZGVCdWZmZXJGcm9tVHJhbnNwb3J0KHRyYW5zcG9ydC5nZXQoKSkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiBwcm90b2NvbC5yZWFkU3RydWN0KG91dHB1dF9vYmosIHBhcnNlZGFyZ3Mua2xhc3MsIHBhcnNlZGFyZ3Muc3BlYyk7Cit9Cit9Cit9Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHk7CisKKy8qIC0tIFBZVEhPTiBNT0RVTEUgU0VUVVAgU1RVRkYgLS0tICovCisKK2V4dGVybiAiQyIgeworCitzdGF0aWMgUHlPYmplY3QqIGVuY29kZV9iaW5hcnkoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZW5jb2RlX2ltcGw8QmluYXJ5UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlPYmplY3QqIGRlY29kZV9iaW5hcnkoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZGVjb2RlX2ltcGw8QmluYXJ5UHJvdG9jb2w+KGFyZ3MpOworfQorCitzdGF0aWMgUHlPYmplY3QqIGVuY29kZV9jb21wYWN0KFB5T2JqZWN0KiwgUHlPYmplY3QqIGFyZ3MpIHsKKyAgcmV0dXJuIGVuY29kZV9pbXBsPENvbXBhY3RQcm90b2NvbD4oYXJncyk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZGVjb2RlX2NvbXBhY3QoUHlPYmplY3QqLCBQeU9iamVjdCogYXJncykgeworICByZXR1cm4gZGVjb2RlX2ltcGw8Q29tcGFjdFByb3RvY29sPihhcmdzKTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzW10gPSB7CisgICAgeyJlbmNvZGVfYmluYXJ5IiwgZW5jb2RlX2JpbmFyeSwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAgeyJkZWNvZGVfYmluYXJ5IiwgZGVjb2RlX2JpbmFyeSwgTUVUSF9WQVJBUkdTLCAiIn0sCisgICAgeyJlbmNvZGVfY29tcGFjdCIsIGVuY29kZV9jb21wYWN0LCBNRVRIX1ZBUkFSR1MsICIifSwKKyAgICB7ImRlY29kZV9jb21wYWN0IiwgZGVjb2RlX2NvbXBhY3QsIE1FVEhfVkFSQVJHUywgIiJ9LAorICAgIHtOVUxMLCBOVUxMLCAwLCBOVUxMfSAvKiBTZW50aW5lbCAqLworfTsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworCitzdGF0aWMgc3RydWN0IFB5TW9kdWxlRGVmIFRocmlmdEZhc3RCaW5hcnlEZWYgPSB7UHlNb2R1bGVEZWZfSEVBRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9OworCisjZGVmaW5lIElOSVRFUlJPUiByZXR1cm4gTlVMTDsKKworUHlPYmplY3QqIFB5SW5pdF9mYXN0YmluYXJ5KCkgeworCisjZWxzZQorCisjZGVmaW5lIElOSVRFUlJPUiByZXR1cm47CisKK3ZvaWQgaW5pdGZhc3RiaW5hcnkoKSB7CisKKyAgUHljU3RyaW5nX0lNUE9SVDsKKyAgaWYgKFB5Y1N0cmluZ0lPID09IE5VTEwpCisgICAgSU5JVEVSUk9SCisKKyNlbmRpZgorCisjZGVmaW5lIElOSVRfSU5URVJOX1NUUklORyh2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSU5URVJOX1NUUklORyh2YWx1ZSkgPSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKCN2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFJTlRFUk5fU1RSSU5HKHZhbHVlKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBJTklURVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpOworICBJTklUX0lOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCk7CisgIElOSVRfSU5URVJOX1NUUklORyhzdHJpbmdfbGVuZ3RoX2xpbWl0KTsKKyAgSU5JVF9JTlRFUk5fU1RSSU5HKGNvbnRhaW5lcl9sZW5ndGhfbGltaXQpOworICBJTklUX0lOVEVSTl9TVFJJTkcodHJhbnMpOworI3VuZGVmIElOSVRfSU5URVJOX1NUUklORworCisgIFB5T2JqZWN0KiBtb2R1bGUgPQorI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworICAgICAgUHlNb2R1bGVfQ3JlYXRlKCZUaHJpZnRGYXN0QmluYXJ5RGVmKTsKKyNlbHNlCisgICAgICBQeV9Jbml0TW9kdWxlKCJ0aHJpZnQucHJvdG9jb2wuZmFzdGJpbmFyeSIsIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzKTsKKyNlbmRpZgorICBpZiAobW9kdWxlID09IE5VTEwpCisgICAgSU5JVEVSUk9SOworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCisgIHJldHVybiBtb2R1bGU7CisjZW5kaWYKK30KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmggYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMWI3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfUFJPVE9DT0xfSAorI2RlZmluZSBUSFJJRlRfUFlfUFJPVE9DT0xfSAorCisjaW5jbHVkZSAiZXh0L3R5cGVzLmgiCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHB5IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitjbGFzcyBQcm90b2NvbEJhc2UgeworCitwdWJsaWM6CisgIFByb3RvY29sQmFzZSgpCisgICAgOiBzdHJpbmdMaW1pdF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSksCisgICAgICBjb250YWluZXJMaW1pdF8oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSksCisgICAgICBvdXRwdXRfKE5VTEwpIHt9CisgIGlubGluZSB2aXJ0dWFsIH5Qcm90b2NvbEJhc2UoKTsKKworICBib29sIHByZXBhcmVEZWNvZGVCdWZmZXJGcm9tVHJhbnNwb3J0KFB5T2JqZWN0KiB0cmFucyk7CisKKyAgUHlPYmplY3QqIHJlYWRTdHJ1Y3QoUHlPYmplY3QqIG91dHB1dCwgUHlPYmplY3QqIGtsYXNzLCBQeU9iamVjdCogc3BlY19zZXEpOworCisgIGJvb2wgcHJlcGFyZUVuY29kZUJ1ZmZlcigpOworCisgIGJvb2wgZW5jb2RlVmFsdWUoUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpOworCisgIFB5T2JqZWN0KiBnZXRFbmNvZGVkVmFsdWUoKTsKKworICBsb25nIHN0cmluZ0xpbWl0KCkgY29uc3QgeyByZXR1cm4gc3RyaW5nTGltaXRfOyB9CisgIHZvaWQgc2V0U3RyaW5nTGVuZ3RoTGltaXQobG9uZyBsaW1pdCkgeyBzdHJpbmdMaW1pdF8gPSBsaW1pdDsgfQorCisgIGxvbmcgY29udGFpbmVyTGltaXQoKSBjb25zdCB7IHJldHVybiBjb250YWluZXJMaW1pdF87IH0KKyAgdm9pZCBzZXRDb250YWluZXJMZW5ndGhMaW1pdChsb25nIGxpbWl0KSB7IGNvbnRhaW5lckxpbWl0XyA9IGxpbWl0OyB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCByZWFkQnl0ZXMoY2hhcioqIG91dHB1dCwgaW50IGxlbik7CisKKyAgYm9vbCByZWFkQnl0ZSh1aW50OF90JiB2YWwpIHsKKyAgICBjaGFyKiBidWY7CisgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgMSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYnVmWzBdKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgd3JpdGVCdWZmZXIoY2hhciogZGF0YSwgc2l6ZV90IGxlbik7CisKKyAgdm9pZCB3cml0ZUJ5dGUodWludDhfdCB2YWwpIHsgd3JpdGVCdWZmZXIocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnZhbCksIDEpOyB9CisKKyAgUHlPYmplY3QqIGRlY29kZVZhbHVlKFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncyk7CisKKyAgYm9vbCBza2lwKFRUeXBlIHR5cGUpOworCisgIGlubGluZSBib29sIGNoZWNrVHlwZShUVHlwZSBnb3QsIFRUeXBlIGV4cGVjdGVkKTsKKyAgaW5saW5lIGJvb2wgY2hlY2tMZW5ndGhMaW1pdChpbnQzMl90IGxlbiwgbG9uZyBsaW1pdCk7CisKKyAgaW5saW5lIGJvb2wgaXNVdGY4KFB5T2JqZWN0KiB0eXBlYXJncyk7CisKK3ByaXZhdGU6CisgIEltcGwqIGltcGwoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxJbXBsKj4odGhpcyk7IH0KKworICBsb25nIHN0cmluZ0xpbWl0XzsKKyAgbG9uZyBjb250YWluZXJMaW1pdF87CisgIEVuY29kZUJ1ZmZlciogb3V0cHV0XzsKKyAgRGVjb2RlQnVmZmVyIGlucHV0XzsKK307Cit9Cit9Cit9CisKKyNpbmNsdWRlICJleHQvcHJvdG9jb2wudGNjIgorCisjZW5kaWYgLy8gVEhSSUZUX1BZX1BST1RPQ09MX0gKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLnRjYyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLnRjYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTVkZjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjCkBAIC0wLDAgKzEsOTEzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEhSSUZUX1BZX1BST1RPQ09MX1RDQworI2RlZmluZSBUSFJJRlRfUFlfUFJPVE9DT0xfVENDCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworI2RlZmluZSBDSEVDS19SQU5HRSh2LCBtaW4sIG1heCkgKCgodikgPD0gKG1heCkpICYmICgodikgPj0gKG1pbikpKQorI2RlZmluZSBJTklUX09VVEJVRl9TSVpFIDEyOAorCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKyNpbmNsdWRlIDxjU3RyaW5nSU8uaD4KKyNlbHNlCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2VuZGlmCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCisjaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK2lubGluZSBib29sIGlucHV0X2NoZWNrKFB5T2JqZWN0KiBpbnB1dCkgeworICByZXR1cm4gUHljU3RyaW5nSU9fSW5wdXRDaGVjayhpbnB1dCk7Cit9CisKK2lubGluZSBFbmNvZGVCdWZmZXIqIG5ld19lbmNvZGVfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICBQeWNTdHJpbmdfSU1QT1JUOworICB9CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gUHljU3RyaW5nSU8tPk5ld091dHB1dChzaXplKTsKK30KKworaW5saW5lIGludCByZWFkX2J1ZmZlcihQeU9iamVjdCogYnVmLCBjaGFyKiogb3V0cHV0LCBpbnQgbGVuKSB7CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICBQeWNTdHJpbmdfSU1QT1JUOworICB9CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJmYWlsZWQgdG8gaW1wb3J0IG5hdGl2ZSBjU3RyaW5nSU8iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIFB5Y1N0cmluZ0lPLT5jcmVhZChidWYsIG91dHB1dCwgbGVuKTsKK30KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgUHJvdG9jb2xCYXNlPEltcGw+Ojp+UHJvdG9jb2xCYXNlKCkgeworICBpZiAob3V0cHV0XykgeworICAgIFB5X0NMRUFSKG91dHB1dF8pOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojppc1V0ZjgoUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIHJldHVybiBQeVN0cmluZ19DaGVjayh0eXBlYXJncykgJiYgIXN0cm5jbXAoUHlTdHJpbmdfQVNfU1RSSU5HKHR5cGVhcmdzKSwgIlVURjgiLCA0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitQeU9iamVjdCogUHJvdG9jb2xCYXNlPEltcGw+OjpnZXRFbmNvZGVkVmFsdWUoKSB7CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICBQeWNTdHJpbmdfSU1QT1JUOworICB9CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICByZXR1cm4gUHljU3RyaW5nSU8tPmNnZXR2YWx1ZShvdXRwdXRfKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OndyaXRlQnVmZmVyKGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICBQeWNTdHJpbmdfSU1QT1JUOworICB9CisgIGlmICghUHljU3RyaW5nSU8pIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJmYWlsZWQgdG8gaW1wb3J0IG5hdGl2ZSBjU3RyaW5nSU8iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50IGxlbiA9IFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0cHV0XywgZGF0YSwgc2l6ZSk7CisgIGlmIChsZW4gPCAwKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0lPRXJyb3IsICJmYWlsZWQgdG8gd3JpdGUgdG8gY1N0cmluZ0lPIG9iamVjdCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW4pICE9IHNpemUpIHsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfRU9GRXJyb3IsICJ3cml0ZSBsZW5ndGggbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSBnb3QgJWQiLCBzaXplLCBsZW4pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworI2Vsc2UKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK2lubGluZSBib29sIGlucHV0X2NoZWNrKFB5T2JqZWN0KiBpbnB1dCkgeworICAvLyBUT0RPOiBDaGVjayBmb3IgQnl0ZXNJTyB0eXBlCisgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgRW5jb2RlQnVmZmVyKiBuZXdfZW5jb2RlX2J1ZmZlcihzaXplX3Qgc2l6ZSkgeworICBFbmNvZGVCdWZmZXIqIGJ1ZmZlciA9IG5ldyBFbmNvZGVCdWZmZXI7CisgIGJ1ZmZlci0+YnVmLnJlc2VydmUoc2l6ZSk7CisgIGJ1ZmZlci0+cG9zID0gMDsKKyAgcmV0dXJuIGJ1ZmZlcjsKK30KKworc3RydWN0IGJ5dGVzaW8geworICBQeU9iamVjdF9IRUFECisjaWYgUFlfTUlOT1JfVkVSU0lPTiA8IDUKKyAgICAgIGNoYXIqIGJ1ZjsKKyNlbHNlCisgICAgICBQeU9iamVjdCogYnVmOworI2VuZGlmCisgIFB5X3NzaXplX3QgcG9zOworICBQeV9zc2l6ZV90IHN0cmluZ19zaXplOworfTsKKworaW5saW5lIGludCByZWFkX2J1ZmZlcihQeU9iamVjdCogYnVmLCBjaGFyKiogb3V0cHV0LCBpbnQgbGVuKSB7CisgIGJ5dGVzaW8qIGJ1ZjIgPSByZWludGVycHJldF9jYXN0PGJ5dGVzaW8qPihidWYpOworI2lmIFBZX01JTk9SX1ZFUlNJT04gPCA1CisgICpvdXRwdXQgPSBidWYyLT5idWYgKyBidWYyLT5wb3M7CisjZWxzZQorICAqb3V0cHV0ID0gUHlCeXRlc19BU19TVFJJTkcoYnVmMi0+YnVmKSArIGJ1ZjItPnBvczsKKyNlbmRpZgorICBQeV9zc2l6ZV90IHBvczAgPSBidWYyLT5wb3M7CisgIGJ1ZjItPnBvcyA9IChzdGQ6Om1pbikoYnVmMi0+cG9zICsgc3RhdGljX2Nhc3Q8UHlfc3NpemVfdD4obGVuKSwgYnVmMi0+c3RyaW5nX3NpemUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihidWYyLT5wb3MgLSBwb3MwKTsKK30KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgUHJvdG9jb2xCYXNlPEltcGw+Ojp+UHJvdG9jb2xCYXNlKCkgeworICBpZiAob3V0cHV0XykgeworICAgIGRlbGV0ZSBvdXRwdXRfOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgoraW5saW5lIGJvb2wgUHJvdG9jb2xCYXNlPEltcGw+Ojppc1V0ZjgoUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIC8vIHdoaWxlIGNvbmRpdGlvbiBmb3IgcHkyIGlzICJhcmcgPT0gJ1VURjgnIiwgaXQgc2hvdWxkIGJlICJhcmcgIT0gJ0JJTkFSWSciIGZvciBweTMuCisgIC8vIEhBQ0s6IGNoZWNrIHRoZSBsZW5ndGggYW5kIGRvbid0IGJvdGhlciByZWFkaW5nIHRoZSB2YWx1ZQorICByZXR1cm4gIVB5VW5pY29kZV9DaGVjayh0eXBlYXJncykgfHwgUHlVbmljb2RlX0dFVF9MRU5HVEgodHlwZWFyZ3MpICE9IDY7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUHlPYmplY3QqIFByb3RvY29sQmFzZTxJbXBsPjo6Z2V0RW5jb2RlZFZhbHVlKCkgeworICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShvdXRwdXRfLT5idWYuZGF0YSgpLCBvdXRwdXRfLT5idWYuc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+CitpbmxpbmUgYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OndyaXRlQnVmZmVyKGNoYXIqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBuZWVkID0gc2l6ZSArIG91dHB1dF8tPnBvczsKKyAgaWYgKG91dHB1dF8tPmJ1Zi5jYXBhY2l0eSgpIDwgbmVlZCkgeworICAgIHRyeSB7CisgICAgICBvdXRwdXRfLT5idWYucmVzZXJ2ZShuZWVkKTsKKyAgICB9IGNhdGNoIChzdGQ6OmJhZF9hbGxvYyYgZXgpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgIkZhaWxlZCB0byBhbGxvY2F0ZSB3cml0ZSBidWZmZXIiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgc3RkOjpjb3B5KGRhdGEsIGRhdGEgKyBzaXplLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIob3V0cHV0Xy0+YnVmKSk7CisgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKyNkZWZpbmUgREVDTEFSRV9PUF9TQ09QRShuYW1lLCBvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RydWN0IG5hbWUjI1Njb3BlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJbXBsKiBpbXBsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBib29sIHZhbGlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuYW1lIyNTY29wZShJbXBsKiB0aGl6KSA6IGltcGwodGhpeiksIHZhbGlkKGltcGwtPm9wIyNCZWdpbigpKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB+bmFtZSMjU2NvcGUoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmICh2YWxpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW1wbC0+b3AjI0VuZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gdmFsaWQ7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEltcGwsIHRlbXBsYXRlIDx0eXBlbmFtZT4gY2xhc3MgVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZSMjU2NvcGU8SW1wbD4gb3AjI1Njb3BlKFQ8SW1wbD4qIHRoaXopIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gbmFtZSMjU2NvcGU8SW1wbD4oc3RhdGljX2Nhc3Q8SW1wbCo+KHRoaXopKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorREVDTEFSRV9PUF9TQ09QRShXcml0ZVN0cnVjdCwgd3JpdGVTdHJ1Y3QpCitERUNMQVJFX09QX1NDT1BFKFJlYWRTdHJ1Y3QsIHJlYWRTdHJ1Y3QpCisjdW5kZWYgREVDTEFSRV9PUF9TQ09QRQorCitpbmxpbmUgYm9vbCBjaGVja19zc2l6ZV90XzMyKFB5X3NzaXplX3QgbGVuKSB7CisgIC8vIGVycm9yIGZyb20gZ2V0dGluZyB0aGUgaW50CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChsZW4pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghQ0hFQ0tfUkFOR0UobGVuLCAwLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAic2l6ZSBvdXQgb2YgcmFuZ2U6IGV4Y2VlZGVkIElOVDMyX01BWCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHBhcnNlX3B5aW50KFB5T2JqZWN0KiBvLCBUKiByZXQsIGludDMyX3QgbWluLCBpbnQzMl90IG1heCkgeworICBsb25nIHZhbCA9IFB5SW50X0FzTG9uZyhvKTsKKworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodmFsKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUNIRUNLX1JBTkdFKHZhbCwgbWluLCBtYXgpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnJldCA9IHN0YXRpY19jYXN0PFQ+KHZhbCk7CisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW1wbD4KK2lubGluZSBib29sIFByb3RvY29sQmFzZTxJbXBsPjo6Y2hlY2tUeXBlKFRUeXBlIGdvdCwgVFR5cGUgZXhwZWN0ZWQpIHsKKyAgaWYgKGV4cGVjdGVkICE9IGdvdCkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJnb3Qgd3JvbmcgdHR5cGUgd2hpbGUgcmVhZGluZyBmaWVsZCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6Y2hlY2tMZW5ndGhMaW1pdChpbnQzMl90IGxlbiwgbG9uZyBsaW1pdCkgeworICBpZiAobGVuIDwgMCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLCAibmVnYXRpdmUgbGVuZ3RoOiAlbGQiLCBsaW1pdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChsZW4gPiBsaW1pdCkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLCAic2l6ZSBleGNlZWRlZCBzcGVjaWZpZWQgbGltaXQ6ICVsZCIsIGxpbWl0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OnJlYWRCeXRlcyhjaGFyKiogb3V0cHV0LCBpbnQgbGVuKSB7CisgIGlmIChsZW4gPCAwKSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJhdHRlbXB0ZWQgdG8gcmVhZCBuZWdhdGl2ZSBsZW5ndGg6ICVkIiwgbGVuKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBmZWFyIHRoZSBtYWxsb2MuICBUaGluayBhYm91dCB0YWtpbmcgYSBjb3B5IG9mCisgIC8vICAgICAgICAgICAgICAgdGhlIHBhcnRpYWwgcmVhZCBpbnN0ZWFkIG9mIGZvcmNpbmcgdGhlIHRyYW5zcG9ydAorICAvLyAgICAgICAgICAgICAgIHRvIHByZXBlbmQgaXQgdG8gaXRzIGJ1ZmZlci4KKworICBpbnQgcmxlbiA9IGRldGFpbDo6cmVhZF9idWZmZXIoaW5wdXRfLnN0cmluZ2lvYnVmLmdldCgpLCBvdXRwdXQsIGxlbik7CisKKyAgaWYgKHJsZW4gPT0gbGVuKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0gZWxzZSBpZiAocmxlbiA9PSAtMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAvLyB1c2luZyBidWlsZGluZyBmdW5jdGlvbnMgYXMgdGhpcyBpcyBhIHJhcmUgY29kZXBhdGgKKyAgICBTY29wZWRQeU9iamVjdCBuZXdpb2J1ZihQeU9iamVjdF9DYWxsRnVuY3Rpb24oaW5wdXRfLnJlZmlsbF9jYWxsYWJsZS5nZXQoKSwgcmVmaWxsX3NpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgcmxlbiwgbGVuLCBOVUxMKSk7CisgICAgaWYgKCFuZXdpb2J1ZikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIG11c3QgZG8gdGhpcyAqQUZURVIqIHRoZSBjYWxsIHNvIHRoYXQgd2UgZG9uJ3QgZGVyZWYgdGhlIGlvIGJ1ZmZlcgorICAgIGlucHV0Xy5zdHJpbmdpb2J1Zi5yZXNldChuZXdpb2J1Zi5yZWxlYXNlKCkpOworCisgICAgcmxlbiA9IGRldGFpbDo6cmVhZF9idWZmZXIoaW5wdXRfLnN0cmluZ2lvYnVmLmdldCgpLCBvdXRwdXQsIGxlbik7CisKKyAgICBpZiAocmxlbiA9PSBsZW4pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocmxlbiA9PSAtMSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPKGRyZWlzcyk6IFRoaXMgY291bGQgYmUgYSB2YWxpZCBjb2RlIHBhdGggZm9yIGJpZyBiaW5hcnkgYmxvYnMuCisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVmaWxsIGNsYWltZWQgdG8gaGF2ZSByZWZpbGxlZCB0aGUgYnVmZmVyLCBidXQgZGlkbid0ISEiKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6cHJlcGFyZURlY29kZUJ1ZmZlckZyb21UcmFuc3BvcnQoUHlPYmplY3QqIHRyYW5zKSB7CisgIGlmIChpbnB1dF8uc3RyaW5naW9idWYpIHsKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRlY29kZSBidWZmZXIgaXMgYWxyZWFkeSBpbml0aWFsaXplZCIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFNjb3BlZFB5T2JqZWN0IHN0cmluZ2lvYnVmKFB5T2JqZWN0X0dldEF0dHIodHJhbnMsIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX2J1ZikpKTsKKyAgaWYgKCFzdHJpbmdpb2J1ZikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIWRldGFpbDo6aW5wdXRfY2hlY2soc3RyaW5naW9idWYuZ2V0KCkpKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBzdHJpbmdpbyBpbnB1dF8iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTY29wZWRQeU9iamVjdCByZWZpbGxfY2FsbGFibGUoUHlPYmplY3RfR2V0QXR0cih0cmFucywgSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKSkpOworICBpZiAoIXJlZmlsbF9jYWxsYWJsZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2socmVmaWxsX2NhbGxhYmxlLmdldCgpKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgY2FsbGFibGUiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbnB1dF8uc3RyaW5naW9idWYuc3dhcChzdHJpbmdpb2J1Zik7CisgIGlucHV0Xy5yZWZpbGxfY2FsbGFibGUuc3dhcChyZWZpbGxfY2FsbGFibGUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6cHJlcGFyZUVuY29kZUJ1ZmZlcigpIHsKKyAgb3V0cHV0XyA9IGRldGFpbDo6bmV3X2VuY29kZV9idWZmZXIoSU5JVF9PVVRCVUZfU0laRSk7CisgIHJldHVybiBvdXRwdXRfICE9IE5VTEw7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorYm9vbCBQcm90b2NvbEJhc2U8SW1wbD46OmVuY29kZVZhbHVlKFB5T2JqZWN0KiB2YWx1ZSwgVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIC8qCisgICAqIFJlZmNvdW50aW5nIFN0cmF0ZWd5OgorICAgKgorICAgKiBXZSBhc3N1bWUgdGhhdCBlbGVtZW50cyBvZiB0aGUgdGhyaWZ0X3NwZWMgdHVwbGUgYXJlIG5vdCBnb2luZyB0byBiZQorICAgKiBtdXRhdGVkLCBzbyB3ZSBkb24ndCByZWYgY291bnQgdGhvc2UgYXQgYWxsLiBPdGhlciB0aGFuIHRoYXQsIHdlIHRyeSB0bworICAgKiBrZWVwIGEgcmVmZXJlbmNlIHRvIGFsbCB0aGUgdXNlci1jcmVhdGVkIG9iamVjdHMgd2hpbGUgd2Ugd29yayB3aXRoIHRoZW0uCisgICAqIGVuY29kZVZhbHVlIGFzc3VtZXMgdGhhdCBhIHJlZmVyZW5jZSBpcyBhbHJlYWR5IGhlbGQuIFRoZSAqY2FsbGVyKiBpcworICAgKiByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgcmVmZXJlbmNlcworICAgKi8KKworICBzd2l0Y2ggKHR5cGUpIHsKKworICBjYXNlIFRfQk9PTDogeworICAgIGludCB2ID0gUHlPYmplY3RfSXNUcnVlKHZhbHVlKTsKKyAgICBpZiAodiA9PSAtMSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbXBsKCktPndyaXRlQm9vbCh2KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTA4OiB7CisgICAgaW50OF90IHZhbDsKKworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTgodmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBjYXNlIFRfSTE2OiB7CisgICAgaW50MTZfdCB2YWw7CisKKyAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCkoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbXBsKCktPndyaXRlSTE2KHZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgY2FzZSBUX0kzMjogeworICAgIGludDMyX3QgdmFsOworCisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZUkzMih2YWwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNhc2UgVF9JNjQ6IHsKKyAgICBpbnQ2NF90IG52YWwgPSBQeUxvbmdfQXNMb25nTG9uZyh2YWx1ZSk7CisKKyAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQobnZhbCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKSkgeworICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJpbnQgb3V0IG9mIHJhbmdlIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZUk2NChudmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICBkb3VibGUgbnZhbCA9IFB5RmxvYXRfQXNEb3VibGUodmFsdWUpOworICAgIGlmIChudmFsID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGltcGwoKS0+d3JpdGVEb3VibGUobnZhbCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjYXNlIFRfU1RSSU5HOiB7CisgICAgU2NvcGVkUHlPYmplY3QgbnZhbDsKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CisgICAgICBudmFsLnJlc2V0KFB5VW5pY29kZV9Bc1VURjhTdHJpbmcodmFsdWUpKTsKKyAgICAgIGlmICghbnZhbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgICBudmFsLnJlc2V0KHZhbHVlKTsKKyAgICB9CisKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfU2l6ZShudmFsLmdldCgpKTsKKyAgICBpZiAoIWRldGFpbDo6Y2hlY2tfc3NpemVfdF8zMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW1wbCgpLT53cml0ZVN0cmluZyhudmFsLmdldCgpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsZW4pKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9MSVNUOgorICBjYXNlIFRfU0VUOiB7CisgICAgU2V0TGlzdFR5cGVBcmdzIHBhcnNlZGFyZ3M7CisgICAgaWYgKCFwYXJzZV9zZXRfbGlzdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5T2JqZWN0X0xlbmd0aCh2YWx1ZSk7CisgICAgaWYgKCFkZXRhaWw6OmNoZWNrX3NzaXplX3RfMzIobGVuKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghaW1wbCgpLT53cml0ZUxpc3RCZWdpbih2YWx1ZSwgcGFyc2VkYXJncywgc3RhdGljX2Nhc3Q8aW50MzJfdD4obGVuKSkgfHwgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBTY29wZWRQeU9iamVjdCBpdGVyYXRvcihQeU9iamVjdF9HZXRJdGVyKHZhbHVlKSk7CisgICAgaWYgKCFpdGVyYXRvcikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHdoaWxlIChQeU9iamVjdCogcmF3SXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXJhdG9yLmdldCgpKSkgeworICAgICAgU2NvcGVkUHlPYmplY3QgaXRlbShyYXdJdGVtKTsKKyAgICAgIGlmICghZW5jb2RlVmFsdWUoaXRlbS5nZXQoKSwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUsIHBhcnNlZGFyZ3MudHlwZWFyZ3MpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9NQVA6IHsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5RGljdF9TaXplKHZhbHVlKTsKKyAgICBpZiAoIWRldGFpbDo6Y2hlY2tfc3NpemVfdF8zMihsZW4pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTWFwVHlwZUFyZ3MgcGFyc2VkYXJnczsKKyAgICBpZiAoIXBhcnNlX21hcF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWltcGwoKS0+d3JpdGVNYXBCZWdpbih2YWx1ZSwgcGFyc2VkYXJncywgc3RhdGljX2Nhc3Q8aW50MzJfdD4obGVuKSkgfHwgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgUHlPYmplY3QqIGsgPSBOVUxMOworICAgIFB5T2JqZWN0KiB2ID0gTlVMTDsKKyAgICAvLyBUT0RPKGJtYXVyZXIpOiBzaG91bGQgc3VwcG9ydCBhbnkgbWFwcGluZywgbm90IGp1c3QgZGljdHMKKyAgICB3aGlsZSAoUHlEaWN0X05leHQodmFsdWUsICZwb3MsICZrLCAmdikpIHsKKyAgICAgIGlmICghZW5jb2RlVmFsdWUoaywgcGFyc2VkYXJncy5rdGFnLCBwYXJzZWRhcmdzLmt0eXBlYXJncykKKyAgICAgICAgICB8fCAhZW5jb2RlVmFsdWUodiwgcGFyc2VkYXJncy52dGFnLCBwYXJzZWRhcmdzLnZ0eXBlYXJncykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFB5X3NzaXplX3QgbnNwZWMgPSBQeVR1cGxlX1NpemUocGFyc2VkYXJncy5zcGVjKTsKKyAgICBpZiAobnNwZWMgPT0gLTEpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJzcGVjIGlzIG5vdCBhIHR1cGxlIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZGV0YWlsOjpXcml0ZVN0cnVjdFNjb3BlPEltcGw+IHNjb3BlID0gZGV0YWlsOjp3cml0ZVN0cnVjdFNjb3BlKHRoaXMpOworICAgIGlmICghc2NvcGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgbnNwZWM7IGkrKykgeworICAgICAgUHlPYmplY3QqIHNwZWNfdHVwbGUgPSBQeVR1cGxlX0dFVF9JVEVNKHBhcnNlZGFyZ3Muc3BlYywgaSk7CisgICAgICBpZiAoc3BlY190dXBsZSA9PSBQeV9Ob25lKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBTdHJ1Y3RJdGVtU3BlYyBwYXJzZWRzcGVjOworICAgICAgaWYgKCFwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKCZwYXJzZWRzcGVjLCBzcGVjX3R1cGxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGluc3R2YWwoUHlPYmplY3RfR2V0QXR0cih2YWx1ZSwgcGFyc2Vkc3BlYy5hdHRybmFtZSkpOworCisgICAgICBpZiAoIWluc3R2YWwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoaW5zdHZhbC5nZXQoKSA9PSBQeV9Ob25lKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBib29sIHJlcyA9IGltcGwoKS0+d3JpdGVGaWVsZChpbnN0dmFsLmdldCgpLCBwYXJzZWRzcGVjKTsKKyAgICAgIGlmICghcmVzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgaW1wbCgpLT53cml0ZUZpZWxkU3RvcCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUT1A6CisgIGNhc2UgVF9WT0lEOgorICBjYXNlIFRfVVRGMTY6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVTY0OgorICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIGZvciBlbmNvZGVWYWx1ZTogJWQiLCB0eXBlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltcGw+Citib29sIFByb3RvY29sQmFzZTxJbXBsPjo6c2tpcChUVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICBjYXNlIFRfQk9PTDoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwQm9vbCgpOworICBjYXNlIFRfSTA4OgorICAgIHJldHVybiBpbXBsKCktPnNraXBCeXRlKCk7CisgIGNhc2UgVF9JMTY6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcEkxNigpOworICBjYXNlIFRfSTMyOgorICAgIHJldHVybiBpbXBsKCktPnNraXBJMzIoKTsKKyAgY2FzZSBUX0k2NDoKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwSTY0KCk7CisgIGNhc2UgVF9ET1VCTEU6CisgICAgcmV0dXJuIGltcGwoKS0+c2tpcERvdWJsZSgpOworCisgIGNhc2UgVF9TVFJJTkc6IHsKKyAgICByZXR1cm4gaW1wbCgpLT5za2lwU3RyaW5nKCk7CisgIH0KKworICBjYXNlIFRfTElTVDoKKyAgY2FzZSBUX1NFVDogeworICAgIFRUeXBlIGV0eXBlID0gVF9TVE9QOworICAgIGludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTGlzdEJlZ2luKGV0eXBlKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgaWYgKCFza2lwKGV0eXBlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX01BUDogeworICAgIFRUeXBlIGt0eXBlID0gVF9TVE9QOworICAgIFRUeXBlIHZ0eXBlID0gVF9TVE9QOworICAgIGludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTWFwQmVnaW4oa3R5cGUsIHZ0eXBlKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgaWYgKCFza2lwKGt0eXBlKSB8fCAhc2tpcCh2dHlwZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICBkZXRhaWw6OlJlYWRTdHJ1Y3RTY29wZTxJbXBsPiBzY29wZSA9IGRldGFpbDo6cmVhZFN0cnVjdFNjb3BlKHRoaXMpOworICAgIGlmICghc2NvcGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFRUeXBlIHR5cGUgPSBUX1NUT1A7CisgICAgICBpbnQxNl90IHRhZzsKKyAgICAgIGlmICghaW1wbCgpLT5yZWFkRmllbGRCZWdpbih0eXBlLCB0YWcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmICh0eXBlID09IFRfU1RPUCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY2FzZSBUX1NUT1A6CisgIGNhc2UgVF9WT0lEOgorICBjYXNlIFRfVVRGMTY6CisgIGNhc2UgVF9VVEY4OgorICBjYXNlIFRfVTY0OgorICBkZWZhdWx0OgorICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJVbmV4cGVjdGVkIFRUeXBlIGZvciBza2lwOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUHlPYmplY3QqIFByb3RvY29sQmFzZTxJbXBsPjo6ZGVjb2RlVmFsdWUoVFR5cGUgdHlwZSwgUHlPYmplY3QqIHR5cGVhcmdzKSB7CisgIHN3aXRjaCAodHlwZSkgeworCisgIGNhc2UgVF9CT09MOiB7CisgICAgYm9vbCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEJvb2wodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodikgeworICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5X1JFVFVSTl9GQUxTRTsKKyAgICB9CisgIH0KKyAgY2FzZSBUX0kwODogeworICAgIGludDhfdCB2ID0gMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZEk4KHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOworICB9CisgIGNhc2UgVF9JMTY6IHsKKyAgICBpbnQxNl90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTE2KHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOworICB9CisgIGNhc2UgVF9JMzI6IHsKKyAgICBpbnQzMl90IHYgPSAwOworICAgIGlmICghaW1wbCgpLT5yZWFkSTMyKHYpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOworICB9CisKKyAgY2FzZSBUX0k2NDogeworICAgIGludDY0X3QgdiA9IDA7CisgICAgaWYgKCFpbXBsKCktPnJlYWRJNjQodikpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHdlIGNhbiB0YWtlIHRoaXMgZmFzdHBhdGggYWx3YXlzIHdoZW4KKyAgICAvLyAgICAgICAgICAgICAgIHNpemVvZihsb25nKSA9PSBzaXplb2YobG9uZyBsb25nKS4KKyAgICBpZiAoQ0hFQ0tfUkFOR0UodiwgTE9OR19NSU4sIExPTkdfTUFYKSkgeworICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXYpOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2KTsKKyAgfQorCisgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICBkb3VibGUgdiA9IDAuMDsKKyAgICBpZiAoIWltcGwoKS0+cmVhZERvdWJsZSh2KSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodik7CisgIH0KKworICBjYXNlIFRfU1RSSU5HOiB7CisgICAgY2hhciogYnVmID0gTlVMTDsKKyAgICBpbnQgbGVuID0gaW1wbCgpLT5yZWFkU3RyaW5nKCZidWYpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGlzVXRmOCh0eXBlYXJncykpIHsKKyAgICAgIHJldHVybiBQeVVuaWNvZGVfRGVjb2RlVVRGOChidWYsIGxlbiwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKGJ1ZiwgbGVuKTsKKyAgICB9CisgIH0KKworICBjYXNlIFRfTElTVDoKKyAgY2FzZSBUX1NFVDogeworICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBUVHlwZSBldHlwZSA9IFRfU1RPUDsKKyAgICBpbnQzMl90IGxlbiA9IGltcGwoKS0+cmVhZExpc3RCZWdpbihldHlwZSk7CisgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAobGVuID4gMCAmJiAhY2hlY2tUeXBlKGV0eXBlLCBwYXJzZWRhcmdzLmVsZW1lbnRfdHlwZSkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJvb2wgdXNlX3R1cGxlID0gdHlwZSA9PSBUX0xJU1QgJiYgcGFyc2VkYXJncy5pbW11dGFibGU7CisgICAgU2NvcGVkUHlPYmplY3QgcmV0KHVzZV90dXBsZSA/IFB5VHVwbGVfTmV3KGxlbikgOiBQeUxpc3RfTmV3KGxlbikpOworICAgIGlmICghcmV0KSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICBQeU9iamVjdCogaXRlbSA9IGRlY29kZVZhbHVlKGV0eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKTsKKyAgICAgIGlmICghaXRlbSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGlmICh1c2VfdHVwbGUpIHsKKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXQuZ2V0KCksIGksIGl0ZW0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHJldC5nZXQoKSwgaSwgaXRlbSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyhkcmVpc3MpOiBDb25zaWRlciBiaXRpbmcgdGhlIGJ1bGxldCBhbmQgbWFraW5nIHR3byBzZXBhcmF0ZSBjYXNlcworICAgIC8vICAgICAgICAgICAgICAgZm9yIGxpc3QgYW5kIHNldCwgYXZvaWRpbmcgdGhpcyBwb3N0IGZhY3RvIGNvbnZlcnNpb24uCisgICAgaWYgKHR5cGUgPT0gVF9TRVQpIHsKKyAgICAgIFB5T2JqZWN0KiBzZXRyZXQ7CisgICAgICBzZXRyZXQgPSBwYXJzZWRhcmdzLmltbXV0YWJsZSA/IFB5RnJvemVuU2V0X05ldyhyZXQuZ2V0KCkpIDogUHlTZXRfTmV3KHJldC5nZXQoKSk7CisgICAgICByZXR1cm4gc2V0cmV0OworICAgIH0KKyAgICByZXR1cm4gcmV0LnJlbGVhc2UoKTsKKyAgfQorCisgIGNhc2UgVF9NQVA6IHsKKyAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgVFR5cGUga3R5cGUgPSBUX1NUT1A7CisgICAgVFR5cGUgdnR5cGUgPSBUX1NUT1A7CisgICAgdWludDMyX3QgbGVuID0gaW1wbCgpLT5yZWFkTWFwQmVnaW4oa3R5cGUsIHZ0eXBlKTsKKyAgICBpZiAobGVuID4gMCAmJiAoIWNoZWNrVHlwZShrdHlwZSwgcGFyc2VkYXJncy5rdGFnKSB8fCAhY2hlY2tUeXBlKHZ0eXBlLCBwYXJzZWRhcmdzLnZ0YWcpKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgU2NvcGVkUHlPYmplY3QgcmV0KFB5RGljdF9OZXcoKSk7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgU2NvcGVkUHlPYmplY3QgayhkZWNvZGVWYWx1ZShrdHlwZSwgcGFyc2VkYXJncy5rdHlwZWFyZ3MpKTsKKyAgICAgIGlmICghaykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIFNjb3BlZFB5T2JqZWN0IHYoZGVjb2RlVmFsdWUodnR5cGUsIHBhcnNlZGFyZ3MudnR5cGVhcmdzKSk7CisgICAgICBpZiAoIXYpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0ocmV0LmdldCgpLCBrLmdldCgpLCB2LmdldCgpKSA9PSAtMSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyc2VkYXJncy5pbW11dGFibGUpIHsKKyAgICAgIGlmICghVGhyaWZ0TW9kdWxlKSB7CisgICAgICAgIFRocmlmdE1vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgidGhyaWZ0LlRocmlmdCIpOworICAgICAgfQorICAgICAgaWYgKCFUaHJpZnRNb2R1bGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisKKyAgICAgIFNjb3BlZFB5T2JqZWN0IGNscyhQeU9iamVjdF9HZXRBdHRyKFRocmlmdE1vZHVsZSwgSU5URVJOX1NUUklORyhURnJvemVuRGljdCkpKTsKKyAgICAgIGlmICghY2xzKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICBTY29wZWRQeU9iamVjdCBhcmcoUHlUdXBsZV9OZXcoMSkpOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmcuZ2V0KCksIDAsIHJldC5yZWxlYXNlKCkpOworICAgICAgcmV0LnJlc2V0KFB5T2JqZWN0X0NhbGxPYmplY3QoY2xzLmdldCgpLCBhcmcuZ2V0KCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0LnJlbGVhc2UoKTsKKyAgfQorCisgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICBTdHJ1Y3RUeXBlQXJncyBwYXJzZWRhcmdzOworICAgIGlmICghcGFyc2Vfc3RydWN0X2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZWFkU3RydWN0KFB5X05vbmUsIHBhcnNlZGFyZ3Mua2xhc3MsIHBhcnNlZGFyZ3Muc3BlYyk7CisgIH0KKworICBjYXNlIFRfU1RPUDoKKyAgY2FzZSBUX1ZPSUQ6CisgIGNhc2UgVF9VVEYxNjoKKyAgY2FzZSBUX1VURjg6CisgIGNhc2UgVF9VNjQ6CisgIGRlZmF1bHQ6CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUgZm9yIGRlY29kZVZhbHVlOiAlZCIsIHR5cGUpOworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsPgorUHlPYmplY3QqIFByb3RvY29sQmFzZTxJbXBsPjo6cmVhZFN0cnVjdChQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCoga2xhc3MsIFB5T2JqZWN0KiBzcGVjX3NlcSkgeworICBpbnQgc3BlY19zZXFfbGVuID0gUHlUdXBsZV9TaXplKHNwZWNfc2VxKTsKKyAgYm9vbCBpbW11dGFibGUgPSBvdXRwdXQgPT0gUHlfTm9uZTsKKyAgU2NvcGVkUHlPYmplY3Qga3dhcmdzOworICBpZiAoc3BlY19zZXFfbGVuID09IC0xKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoaW1tdXRhYmxlKSB7CisgICAga3dhcmdzLnJlc2V0KFB5RGljdF9OZXcoKSk7CisgICAgaWYgKCFrd2FyZ3MpIHsKKyAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJmYWlsZWQgdG8gcHJlcGFyZSBrd2FyZ3VtZW50IHN0b3JhZ2UiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorCisgIGRldGFpbDo6UmVhZFN0cnVjdFNjb3BlPEltcGw+IHNjb3BlID0gZGV0YWlsOjpyZWFkU3RydWN0U2NvcGUodGhpcyk7CisgIGlmICghc2NvcGUpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB3aGlsZSAodHJ1ZSkgeworICAgIFRUeXBlIHR5cGUgPSBUX1NUT1A7CisgICAgaW50MTZfdCB0YWc7CisgICAgaWYgKCFpbXBsKCktPnJlYWRGaWVsZEJlZ2luKHR5cGUsIHRhZykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodHlwZSA9PSBUX1NUT1ApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAodGFnIDwgMCB8fCB0YWcgPj0gc3BlY19zZXFfbGVuKSB7CisgICAgICBpZiAoIXNraXAodHlwZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkVycm9yIHdoaWxlIHNraXBwaW5nIHVua25vd24gZmllbGQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBQeU9iamVjdCogaXRlbV9zcGVjID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3NlcSwgdGFnKTsKKyAgICBpZiAoaXRlbV9zcGVjID09IFB5X05vbmUpIHsKKyAgICAgIGlmICghc2tpcCh0eXBlKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXJyb3Igd2hpbGUgc2tpcHBpbmcgdW5rbm93biBmaWVsZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBTdHJ1Y3RJdGVtU3BlYyBwYXJzZWRzcGVjOworICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYygmcGFyc2Vkc3BlYywgaXRlbV9zcGVjKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChwYXJzZWRzcGVjLnR5cGUgIT0gdHlwZSkgeworICAgICAgaWYgKCFza2lwKHR5cGUpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdHJ1Y3QgZmllbGQgaGFkIHdyb25nIHR5cGU6IGV4cGVjdGVkICVkIGJ1dCBnb3QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgcGFyc2Vkc3BlYy50eXBlLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBTY29wZWRQeU9iamVjdCBmaWVsZHZhbChkZWNvZGVWYWx1ZShwYXJzZWRzcGVjLnR5cGUsIHBhcnNlZHNwZWMudHlwZWFyZ3MpKTsKKyAgICBpZiAoIWZpZWxkdmFsKSB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKGltbXV0YWJsZSAmJiBQeURpY3RfU2V0SXRlbShrd2FyZ3MuZ2V0KCksIHBhcnNlZHNwZWMuYXR0cm5hbWUsIGZpZWxkdmFsLmdldCgpKSA9PSAtMSkKKyAgICAgICAgfHwgKCFpbW11dGFibGUgJiYgUHlPYmplY3RfU2V0QXR0cihvdXRwdXQsIHBhcnNlZHNwZWMuYXR0cm5hbWUsIGZpZWxkdmFsLmdldCgpKSA9PSAtMSkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgfQorICBpZiAoaW1tdXRhYmxlKSB7CisgICAgU2NvcGVkUHlPYmplY3QgYXJncyhQeVR1cGxlX05ldygwKSk7CisgICAgaWYgKCFhcmdzKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmFpbGVkIHRvIHByZXBhcmUgYXJndW1lbnQgc3RvcmFnZSIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeU9iamVjdF9DYWxsKGtsYXNzLCBhcmdzLmdldCgpLCBrd2FyZ3MuZ2V0KCkpOworICB9CisgIFB5X0lOQ1JFRihvdXRwdXQpOworICByZXR1cm4gb3V0cHV0OworfQorfQorfQorfQorI2VuZGlmIC8vIFRIUklGVF9QWV9QUk9UT0NPTF9ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC90eXBlcy5jcHAgYi9saWIvcHkvc3JjL2V4dC90eXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NDNmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcApAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZXh0L3R5cGVzLmgiCisjaW5jbHVkZSAiZXh0L3Byb3RvY29sLmgiCisKK25hbWVzcGFjZSBhcGFjaGUgeworbmFtZXNwYWNlIHRocmlmdCB7CituYW1lc3BhY2UgcHkgeworCitQeU9iamVjdCogVGhyaWZ0TW9kdWxlID0gTlVMTDsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCitjaGFyIHJlZmlsbF9zaWduYXR1cmVbXSA9IHsncycsICcjJywgJ2knfTsKKyNlbHNlCitjb25zdCBjaGFyKiByZWZpbGxfc2lnbmF0dXJlID0gInkjaSI7CisjZW5kaWYKKworYm9vbCBwYXJzZV9zdHJ1Y3RfaXRlbV9zcGVjKFN0cnVjdEl0ZW1TcGVjKiBkZXN0LCBQeU9iamVjdCogc3BlY190dXBsZSkgeworICAvLyBpJ2QgbGlrZSB0byB1c2UgUGFyc2VBcmdzIGhlcmUsIGJ1dCBpdCBzZWVtcyB0byBiZSBhIGJvdHRsZW5lY2suCisgIGlmIChQeVR1cGxlX1NpemUoc3BlY190dXBsZSkgIT0gNSkgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNSBhcmd1bWVudHMgZm9yIHNwZWMgdHVwbGUgYnV0IGdvdCAlZCIsCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oUHlUdXBsZV9TaXplKHNwZWNfdHVwbGUpKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+dGFnID0gc3RhdGljX2Nhc3Q8VFR5cGU+KFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDApKSk7CisgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50YWcpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+dHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAxKSkpOworICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+dHlwZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5hdHRybmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMik7CisgIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAzKTsKKyAgZGVzdC0+ZGVmdmFsID0gUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCA0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFyc2Vfc2V0X2xpc3RfYXJncyhTZXRMaXN0VHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSAzKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyB0dXBsZSBvZiBzaXplIDMgZm9yIGxpc3Qvc2V0IHR5cGUgYXJncyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGRlc3QtPmVsZW1lbnRfdHlwZSA9IHN0YXRpY19jYXN0PFRUeXBlPihQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPmVsZW1lbnRfdHlwZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT50eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOworCisgIGRlc3QtPmltbXV0YWJsZSA9IFB5X1RydWUgPT0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcGFyc2VfbWFwX2FyZ3MoTWFwVHlwZUFyZ3MqIGRlc3QsIFB5T2JqZWN0KiB0eXBlYXJncykgeworICBpZiAoUHlUdXBsZV9TaXplKHR5cGVhcmdzKSAhPSA1KSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyA1IGFyZ3VtZW50cyBmb3IgdHlwZWFyZ3MgdG8gbWFwIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+a3RhZyA9IHN0YXRpY19jYXN0PFRUeXBlPihQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPmt0YWcpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+dnRhZyA9IHN0YXRpY19jYXN0PFRUeXBlPihQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMikpKTsKKyAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnZ0YWcpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZGVzdC0+a3R5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisgIGRlc3QtPnZ0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDMpOworICBkZXN0LT5pbW11dGFibGUgPSBQeV9UcnVlID09IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDQpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIHBhcnNlX3N0cnVjdF9hcmdzKFN0cnVjdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKKyAgaWYgKFB5TGlzdF9TaXplKHR5cGVhcmdzKSAhPSAyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBsaXN0IG9mIHNpemUgMiBmb3Igc3RydWN0IGFyZ3MiKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkZXN0LT5rbGFzcyA9IFB5TGlzdF9HRVRfSVRFTSh0eXBlYXJncywgMCk7CisgIGRlc3QtPnNwZWMgPSBQeUxpc3RfR0VUX0lURU0odHlwZWFyZ3MsIDEpOworCisgIHJldHVybiB0cnVlOworfQorfQorfQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvdHlwZXMuaCBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkOGRkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBUSFJJRlRfUFlfVFlQRVNfSAorI2RlZmluZSBUSFJJRlRfUFlfVFlQRVNfSAorCisjaW5jbHVkZSA8UHl0aG9uLmg+CisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUworI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMworCisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBUT0RPOiBiZXR0ZXIgbWFjcm9zCisjZGVmaW5lIFB5SW50X0FzTG9uZyh2KSBQeUxvbmdfQXNMb25nKHYpCisjZGVmaW5lIFB5SW50X0Zyb21Mb25nKHYpIFB5TG9uZ19Gcm9tTG9uZyh2KQorCisjZGVmaW5lIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcodikgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcodikKKworI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOX1NUUklORyh2YWx1ZSkgX2ludGVybl8jI3ZhbHVlCisKKyNkZWZpbmUgSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikgKCgodikgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisKK2V4dGVybiAiQyIgeworZXh0ZXJuIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKFRGcm96ZW5EaWN0KTsKK2V4dGVybiBQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKK2V4dGVybiBQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fcmVmaWxsKTsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSBweSB7CisKK2V4dGVybiBQeU9iamVjdCogVGhyaWZ0TW9kdWxlOworCisvLyBTdG9sZW4gb3V0IG9mIFRQcm90b2NvbC5oLgorLy8gSXQgd291bGQgYmUgYSBodWdlIHBhaW4gdG8gaGF2ZSBib3RoIGdldCB0aGlzIGZyb20gb25lIHBsYWNlLgorZW51bSBUVHlwZSB7CisgIFRfSU5WQUxJRCA9IC0xLAorICBUX1NUT1AgPSAwLAorICBUX1ZPSUQgPSAxLAorICBUX0JPT0wgPSAyLAorICBUX0JZVEUgPSAzLAorICBUX0kwOCA9IDMsCisgIFRfSTE2ID0gNiwKKyAgVF9JMzIgPSA4LAorICBUX1U2NCA9IDksCisgIFRfSTY0ID0gMTAsCisgIFRfRE9VQkxFID0gNCwKKyAgVF9TVFJJTkcgPSAxMSwKKyAgVF9VVEY3ID0gMTEsCisgIFRfU1RSVUNUID0gMTIsCisgIFRfTUFQID0gMTMsCisgIFRfU0VUID0gMTQsCisgIFRfTElTVCA9IDE1LAorICBUX1VURjggPSAxNiwKKyAgVF9VVEYxNiA9IDE3Cit9OworCisvLyByZXBsYWNlIHdpdGggdW5pcXVlX3B0ciB3aGVuIHdlJ3JlIE9LIHdpdGggQysrMTEKK2NsYXNzIFNjb3BlZFB5T2JqZWN0IHsKK3B1YmxpYzoKKyAgU2NvcGVkUHlPYmplY3QoKSA6IG9ial8oTlVMTCkge30KKyAgZXhwbGljaXQgU2NvcGVkUHlPYmplY3QoUHlPYmplY3QqIHB5X29iamVjdCkgOiBvYmpfKHB5X29iamVjdCkge30KKyAgflNjb3BlZFB5T2JqZWN0KCkgeworICAgIGlmIChvYmpfKQorICAgICAgUHlfREVDUkVGKG9ial8pOworICB9CisgIFB5T2JqZWN0KiBnZXQoKSB0aHJvdygpIHsgcmV0dXJuIG9ial87IH0KKyAgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIG9ial87IH0KKyAgdm9pZCByZXNldChQeU9iamVjdCogcHlfb2JqZWN0KSB0aHJvdygpIHsKKyAgICBpZiAob2JqXykKKyAgICAgIFB5X0RFQ1JFRihvYmpfKTsKKyAgICBvYmpfID0gcHlfb2JqZWN0OworICB9CisgIFB5T2JqZWN0KiByZWxlYXNlKCkgdGhyb3coKSB7CisgICAgUHlPYmplY3QqIHRtcCA9IG9ial87CisgICAgb2JqXyA9IE5VTEw7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorICB2b2lkIHN3YXAoU2NvcGVkUHlPYmplY3QmIG90aGVyKSB0aHJvdygpIHsKKyAgICBTY29wZWRQeU9iamVjdCB0bXAob3RoZXIucmVsZWFzZSgpKTsKKyAgICBvdGhlci5yZXNldChyZWxlYXNlKCkpOworICAgIHJlc2V0KHRtcC5yZWxlYXNlKCkpOworICB9CisKK3ByaXZhdGU6CisgIFNjb3BlZFB5T2JqZWN0KGNvbnN0IFNjb3BlZFB5T2JqZWN0Jikge30KKyAgU2NvcGVkUHlPYmplY3QmIG9wZXJhdG9yPShjb25zdCBTY29wZWRQeU9iamVjdCYpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgUHlPYmplY3QqIG9ial87Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIHR3byBrZXkgYXR0cmlidXRlcyBvZiBhIENSZWFkYWJsZVRyYW5zcG9ydCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5T2JqZWN0X0dldEF0dHIuCisgKi8KK3N0cnVjdCBEZWNvZGVCdWZmZXIgeworICBTY29wZWRQeU9iamVjdCBzdHJpbmdpb2J1ZjsKKyAgU2NvcGVkUHlPYmplY3QgcmVmaWxsX2NhbGxhYmxlOworfTsKKworI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCitleHRlcm4gY2hhciByZWZpbGxfc2lnbmF0dXJlWzNdOwordHlwZWRlZiBQeU9iamVjdCBFbmNvZGVCdWZmZXI7CisjZWxzZQorZXh0ZXJuIGNvbnN0IGNoYXIqIHJlZmlsbF9zaWduYXR1cmU7CitzdHJ1Y3QgRW5jb2RlQnVmZmVyIHsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOworICBzaXplX3QgcG9zOworfTsKKyNlbmRpZgorCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzZXQgb3IgbGlzdCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBTZXRMaXN0VHlwZUFyZ3MgeworICBUVHlwZSBlbGVtZW50X3R5cGU7CisgIFB5T2JqZWN0KiB0eXBlYXJnczsKKyAgYm9vbCBpbW11dGFibGU7Cit9OworCisvKioKKyAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBtYXAsCisgKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgorICovCitzdHJ1Y3QgTWFwVHlwZUFyZ3MgeworICBUVHlwZSBrdGFnOworICBUVHlwZSB2dGFnOworICBQeU9iamVjdCoga3R5cGVhcmdzOworICBQeU9iamVjdCogdnR5cGVhcmdzOworICBib29sIGltbXV0YWJsZTsKK307CisKKy8qKgorICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHN0cnVjdCwKKyAqIHNvIHdlIGRvbid0IGhhdmUgdG8ga2VlcCBjYWxsaW5nIFB5VHVwbGVfR0VUX0lURU0uCisgKi8KK3N0cnVjdCBTdHJ1Y3RUeXBlQXJncyB7CisgIFB5T2JqZWN0KiBrbGFzczsKKyAgUHlPYmplY3QqIHNwZWM7CisgIGJvb2wgaW1tdXRhYmxlOworfTsKKworLyoqCisgKiBBIGNhY2hlIG9mIHRoZSBpdGVtIHNwZWMgZnJvbSBhIHN0cnVjdCBzcGVjaWZpY2F0aW9uLAorICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KKyAqLworc3RydWN0IFN0cnVjdEl0ZW1TcGVjIHsKKyAgaW50IHRhZzsKKyAgVFR5cGUgdHlwZTsKKyAgUHlPYmplY3QqIGF0dHJuYW1lOworICBQeU9iamVjdCogdHlwZWFyZ3M7CisgIFB5T2JqZWN0KiBkZWZ2YWw7Cit9OworCitib29sIHBhcnNlX3NldF9saXN0X2FyZ3MoU2V0TGlzdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpOworCitib29sIHBhcnNlX21hcF9hcmdzKE1hcFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpOworCitib29sIHBhcnNlX3N0cnVjdF9hcmdzKFN0cnVjdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpOworCitib29sIHBhcnNlX3N0cnVjdF9pdGVtX3NwZWMoU3RydWN0SXRlbVNwZWMqIGRlc3QsIFB5T2JqZWN0KiBzcGVjX3R1cGxlKTsKK30KK30KK30KKworI2VuZGlmIC8vIFRIUklGVF9QWV9UWVBFU19ICmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weQppbmRleCA2Y2JkNWYzLi45YWUxYjExIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKQEAgLTE3LDY1ICsxNyw2NiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCAqCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIAotdHJ5OgotICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQotZXhjZXB0OgotICBmYXN0YmluYXJ5ID0gTm9uZQotCiAKIGNsYXNzIFRCYXNlKG9iamVjdCk6Ci0gIF9fc2xvdHNfXyA9IFtdCisgICAgX19zbG90c19fID0gKCkKIAotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKQotICAgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXQotICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgTCA9IFsnJXM9JXInICUgKGtleSwgZ2V0YXR0cihzZWxmLCBrZXkpKSBmb3Iga2V5IGluIHNlbGYuX19zbG90c19fXQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKIAotICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgZm9yIGF0dHIgaW4gc2VsZi5fX3Nsb3RzX186Ci0gICAgICBteV92YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCi0gICAgICBvdGhlcl92YWwgPSBnZXRhdHRyKG90aGVyLCBhdHRyKQotICAgICAgaWYgbXlfdmFsICE9IG90aGVyX3ZhbDoKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9fc2xvdHNfXzoKKyAgICAgICAgICAgIG15X3ZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIG90aGVyX3ZhbCA9IGdldGF0dHIob3RoZXIsIGF0dHIpCisgICAgICAgICAgICBpZiBteV92YWwgIT0gb3RoZXJfdmFsOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQogCi0gIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgotICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCiAKLSAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgotICAgIGlmIChpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZAotICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCi0gICAgICAgIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kCi0gICAgICAgIGZhc3RiaW5hcnkgaXMgbm90IE5vbmUpOgotICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXByb3QudHJhbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKLSAgICAgIHJldHVybgotICAgIGlwcm90LnJlYWRTdHJ1Y3Qoc2VsZiwgc2VsZi50aHJpZnRfc3BlYykKKyAgICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgICAgIGlmIChpcHJvdC5fZmFzdF9kZWNvZGUgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgaXByb3QuX2Zhc3RfZGVjb2RlKHNlbGYsIGlwcm90LCBbc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXByb3QucmVhZFN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQogCi0gIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6Ci0gICAgaWYgKG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kCi0gICAgICAgIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kCi0gICAgICAgIGZhc3RiaW5hcnkgaXMgbm90IE5vbmUpOgotICAgICAgb3Byb3QudHJhbnMud3JpdGUoCi0gICAgICAgIGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKLSAgICAgIHJldHVybgotICAgIG9wcm90LndyaXRlU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCisgICAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICAgICAgaWYgKG9wcm90Ll9mYXN0X2VuY29kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBvcHJvdC50cmFucy53cml0ZSgKKyAgICAgICAgICAgICAgICBvcHJvdC5fZmFzdF9lbmNvZGUoc2VsZiwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQogCiAKLWNsYXNzIFRFeGNlcHRpb25CYXNlKEV4Y2VwdGlvbik6Ci0gICMgb2xkIHN0eWxlIGNsYXNzIHNvIHB5dGhvbjIuNCBjYW4gcmFpc2UgZXhjZXB0aW9ucyBkZXJpdmVkIGZyb20gdGhpcwotICAjICBUaGlzIGNhbid0IGluaGVyaXQgZnJvbSBUQmFzZSBiZWNhdXNlIG9mIHRoYXQgbGltaXRhdGlvbi4KLSAgX19zbG90c19fID0gW10KK2NsYXNzIFRFeGNlcHRpb25CYXNlKFRCYXNlLCBFeGNlcHRpb24pOgorICAgIHBhc3MKIAotICBfX3JlcHJfXyA9IFRCYXNlLl9fcmVwcl9fLmltX2Z1bmMKLSAgX19lcV9fID0gVEJhc2UuX19lcV9fLmltX2Z1bmMKLSAgX19uZV9fID0gVEJhc2UuX19uZV9fLmltX2Z1bmMKLSAgcmVhZCA9IFRCYXNlLnJlYWQuaW1fZnVuYwotICB3cml0ZSA9IFRCYXNlLndyaXRlLmltX2Z1bmMKKworY2xhc3MgVEZyb3plbkJhc2UoVEJhc2UpOgorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgbW9kaWZ5IGZyb3plbiBzdHJ1Y3QiKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW4ndCBtb2RpZnkgZnJvemVuIHN0cnVjdCIpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9fY2xhc3NfXykgXiBoYXNoKHNlbGYuX19zbG90c19fKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHJlYWQoY2xzLCBpcHJvdCk6CisgICAgICAgIGlmIChpcHJvdC5fZmFzdF9kZWNvZGUgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZAorICAgICAgICAgICAgICAgIGNscy50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICBzZWxmID0gY2xzKCkKKyAgICAgICAgICAgIHJldHVybiBpcHJvdC5fZmFzdF9kZWNvZGUoTm9uZSwgaXByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaXByb3QucmVhZFN0cnVjdChjbHMsIGNscy50aHJpZnRfc3BlYywgVHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkKaW5kZXggNmZkZDA4Yy4uZjZiZTc3MiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucHkKQEAgLTE3LDI0NCArMTcsMjg1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIFRQcm90b2NvbCBpbXBvcnQgKgorZnJvbSAuVFByb3RvY29sIGltcG9ydCBUVHlwZSwgVFByb3RvY29sQmFzZSwgVFByb3RvY29sRXhjZXB0aW9uCiBmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiAKIAogY2xhc3MgVEJpbmFyeVByb3RvY29sKFRQcm90b2NvbEJhc2UpOgotICAiIiJCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCisgICAgIiIiQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgogCi0gICMgTmFzdHlIYXh4LiBQeXRob24gMi40KyBvbiAzMi1iaXQgbWFjaGluZXMgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKLSAgIyBwb3NpdGl2ZSwgY29udmVydGluZyB0aGlzIGludG8gYSBsb25nLiBJZiB3ZSBoYXJkY29kZSB0aGUgaW50IHZhbHVlCi0gICMgaW5zdGVhZCBpdCdsbCBzdGF5IGluIDMyIGJpdC1sYW5kLgorICAgICMgTmFzdHlIYXh4LiBQeXRob24gMi40KyBvbiAzMi1iaXQgbWFjaGluZXMgZm9yY2VzIGhleCBjb25zdGFudHMgdG8gYmUKKyAgICAjIHBvc2l0aXZlLCBjb252ZXJ0aW5nIHRoaXMgaW50byBhIGxvbmcuIElmIHdlIGhhcmRjb2RlIHRoZSBpbnQgdmFsdWUKKyAgICAjIGluc3RlYWQgaXQnbGwgc3RheSBpbiAzMiBiaXQtbGFuZC4KIAotICAjIFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDAKLSAgVkVSU0lPTl9NQVNLID0gLTY1NTM2CisgICAgIyBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwCisgICAgVkVSU0lPTl9NQVNLID0gLTY1NTM2CiAKLSAgIyBWRVJTSU9OXzEgPSAweDgwMDEwMDAwCi0gIFZFUlNJT05fMSA9IC0yMTQ3NDE4MTEyCisgICAgIyBWRVJTSU9OXzEgPSAweDgwMDEwMDAwCisgICAgVkVSU0lPTl8xID0gLTIxNDc0MTgxMTIKIAotICBUWVBFX01BU0sgPSAweDAwMDAwMGZmCisgICAgVFlQRV9NQVNLID0gMHgwMDAwMDBmZgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucywgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnN0cmljdFJlYWQgPSBzdHJpY3RSZWFkCi0gICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlLCAqKmt3YXJncyk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICAgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ3N0cmluZ19sZW5ndGhfbGltaXQnLCBOb25lKQorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdjb250YWluZXJfbGVuZ3RoX2xpbWl0JywgTm9uZSkKIAotICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgotICAgIGlmIHNlbGYuc3RyaWN0V3JpdGU6Ci0gICAgICBzZWxmLndyaXRlSTMyKFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OXzEgfCB0eXBlKQotICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQotICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKLSAgICBlbHNlOgotICAgICAgc2VsZi53cml0ZVN0cmluZyhuYW1lKQotICAgICAgc2VsZi53cml0ZUJ5dGUodHlwZSkKLSAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCisgICAgZGVmIF9jaGVja19zdHJpbmdfbGVuZ3RoKHNlbGYsIGxlbmd0aCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2xlbmd0aChzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQsIGxlbmd0aCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY2hlY2tfbGVuZ3RoKHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCwgbGVuZ3RoKQogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgc2VxaWQpOgorICAgICAgICBpZiBzZWxmLnN0cmljdFdyaXRlOgorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xIHwgdHlwZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVTdHJpbmcobmFtZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVJMzIoc2VxaWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlU3RyaW5nKG5hbWUpCisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQorICAgICAgICAgICAgc2VsZi53cml0ZUkzMihzZXFpZCkKIAotICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGlkKToKLSAgICBzZWxmLndyaXRlQnl0ZSh0eXBlKQotICAgIHNlbGYud3JpdGVJMTYoaWQpCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgotICAgIHNlbGYud3JpdGVCeXRlKFRUeXBlLlNUT1ApCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKHR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMTYoaWQpCiAKLSAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKLSAgICBzZWxmLndyaXRlQnl0ZShrdHlwZSkKLSAgICBzZWxmLndyaXRlQnl0ZSh2dHlwZSkKLSAgICBzZWxmLndyaXRlSTMyKHNpemUpCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUoVFR5cGUuU1RPUCkKIAotICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQotICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlQnl0ZShrdHlwZSkKKyAgICAgICAgc2VsZi53cml0ZUJ5dGUodnR5cGUpCisgICAgICAgIHNlbGYud3JpdGVJMzIoc2l6ZSkKIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgc2VsZi53cml0ZUJ5dGUoZXR5cGUpCi0gICAgc2VsZi53cml0ZUkzMihzaXplKQorICAgIGRlZiB3cml0ZUxpc3RCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sKToKLSAgICBpZiBib29sOgotICAgICAgc2VsZi53cml0ZUJ5dGUoMSkKLSAgICBlbHNlOgotICAgICAgc2VsZi53cml0ZUJ5dGUoMCkKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVCeXRlKGV0eXBlKQorICAgICAgICBzZWxmLndyaXRlSTMyKHNpemUpCiAKLSAgZGVmIHdyaXRlQnl0ZShzZWxmLCBieXRlKToKLSAgICBidWZmID0gcGFjaygiIWIiLCBieXRlKQotICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKLSAgICBidWZmID0gcGFjaygiIWgiLCBpMTYpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICBzZWxmLndyaXRlQnl0ZSgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZUJ5dGUoMCkKIAotICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKLSAgICBidWZmID0gcGFjaygiIWkiLCBpMzIpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGJ1ZmYgPSBwYWNrKCIhYiIsIGJ5dGUpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKLSAgICBidWZmID0gcGFjaygiIXEiLCBpNjQpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBidWZmID0gcGFjaygiIWgiLCBpMTYpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBidWZmID0gcGFjaygiIWQiLCBkdWIpCi0gICAgc2VsZi50cmFucy53cml0ZShidWZmKQorICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBidWZmID0gcGFjaygiIWkiLCBpMzIpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyKToKLSAgICBzZWxmLndyaXRlSTMyKGxlbihzdHIpKQotICAgIHNlbGYudHJhbnMud3JpdGUoc3RyKQorICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBidWZmID0gcGFjaygiIXEiLCBpNjQpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoYnVmZikKIAotICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKLSAgICBzeiA9IHNlbGYucmVhZEkzMigpCi0gICAgaWYgc3ogPCAwOgotICAgICAgdmVyc2lvbiA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSwotICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgotICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCi0gICAgICAgICAgdHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCi0gICAgICAgICAgbWVzc2FnZT0nQmFkIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbjogJWQnICUgKHN6KSkKLSAgICAgIHR5cGUgPSBzeiAmIFRCaW5hcnlQcm90b2NvbC5UWVBFX01BU0sKLSAgICAgIG5hbWUgPSBzZWxmLnJlYWRTdHJpbmcoKQotICAgICAgc2VxaWQgPSBzZWxmLnJlYWRJMzIoKQotICAgIGVsc2U6Ci0gICAgICBpZiBzZWxmLnN0cmljdFJlYWQ6Ci0gICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyJykKLSAgICAgIG5hbWUgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc3opCi0gICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgYnVmZiA9IHBhY2soIiFkIiwgZHViKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKGJ1ZmYpCiAKLSAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCaW5hcnkoc2VsZiwgc3RyKToKKyAgICAgICAgc2VsZi53cml0ZUkzMihsZW4oc3RyKSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShzdHIpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHN6ID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgaWYgc3ogPCAwOgorICAgICAgICAgICAgdmVyc2lvbiA9IHN6ICYgVEJpbmFyeVByb3RvY29sLlZFUlNJT05fTUFTSworICAgICAgICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2wuVkVSU0lPTl8xOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgdHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0JhZCB2ZXJzaW9uIGluIHJlYWRNZXNzYWdlQmVnaW46ICVkJyAlIChzeikpCisgICAgICAgICAgICB0eXBlID0gc3ogJiBUQmluYXJ5UHJvdG9jb2wuVFlQRV9NQVNLCisgICAgICAgICAgICBuYW1lID0gc2VsZi5yZWFkU3RyaW5nKCkKKyAgICAgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0UmVhZDoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIHByb3RvY29sIHZlcnNpb24gaGVhZGVyJykKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc3opCisgICAgICAgICAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgICAgICBzZXFpZCA9IHNlbGYucmVhZEkzMigpCisgICAgICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCiAKLSAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICB0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCAwKQotICAgIGlkID0gc2VsZi5yZWFkSTE2KCkKLSAgICByZXR1cm4gKE5vbmUsIHR5cGUsIGlkKQorICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAga3R5cGUgPSBzZWxmLnJlYWRCeXRlKCkKLSAgICB2dHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICByZXR1cm4gKE5vbmUsIHR5cGUsIDApCisgICAgICAgIGlkID0gc2VsZi5yZWFkSTE2KCkKKyAgICAgICAgcmV0dXJuIChOb25lLCB0eXBlLCBpZCkKIAotICBkZWYgcmVhZE1hcEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgotICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgc2l6ZSA9IHNlbGYucmVhZEkzMigpCi0gICAgcmV0dXJuIChldHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBrdHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICB2dHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKIAotICBkZWYgcmVhZExpc3RFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTWFwRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKLSAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQotICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQotICAgIHJldHVybiAoZXR5cGUsIHNpemUpCisgICAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6CisgICAgICAgIGV0eXBlID0gc2VsZi5yZWFkQnl0ZSgpCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19jb250YWluZXJfbGVuZ3RoKHNpemUpCisgICAgICAgIHJldHVybiAoZXR5cGUsIHNpemUpCiAKLSAgZGVmIHJlYWRTZXRFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBieXRlID0gc2VsZi5yZWFkQnl0ZSgpCi0gICAgaWYgYnl0ZSA9PSAwOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgcmV0dXJuIFRydWUKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICBldHlwZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBzaXplID0gc2VsZi5yZWFkSTMyKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICByZXR1cm4gKGV0eXBlLCBzaXplKQogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDEpCi0gICAgdmFsLCA9IHVucGFjaygnIWInLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTE2KHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMikKLSAgICB2YWwsID0gdW5wYWNrKCchaCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgYnl0ZSA9IHNlbGYucmVhZEJ5dGUoKQorICAgICAgICBpZiBieXRlID09IDA6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBkZWYgcmVhZEkzMihzZWxmKToKLSAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDQpCi0gICAgdmFsLCA9IHVucGFjaygnIWknLCBidWZmKQotICAgIHJldHVybiB2YWwKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMSkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWInLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIHJlYWRJNjQoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQotICAgIHZhbCwgPSB1bnBhY2soJyFxJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRJMTYoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoMikKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWgnLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIHJlYWREb3VibGUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQotICAgIHZhbCwgPSB1bnBhY2soJyFkJywgYnVmZikKLSAgICByZXR1cm4gdmFsCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoNCkKKyAgICAgICAgdmFsLCA9IHVucGFjaygnIWknLCBidWZmKQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIHJlYWRTdHJpbmcoc2VsZik6Ci0gICAgbGVuID0gc2VsZi5yZWFkSTMyKCkKLSAgICBzdHIgPSBzZWxmLnRyYW5zLnJlYWRBbGwobGVuKQotICAgIHJldHVybiBzdHIKKyAgICBkZWYgcmVhZEk2NChzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYudHJhbnMucmVhZEFsbCg4KQorICAgICAgICB2YWwsID0gdW5wYWNrKCchcScsIGJ1ZmYpCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJyFkJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRJMzIoKQorICAgICAgICBzZWxmLl9jaGVja19zdHJpbmdfbGVuZ3RoKHNpemUpCisgICAgICAgIHMgPSBzZWxmLnRyYW5zLnJlYWRBbGwoc2l6ZSkKKyAgICAgICAgcmV0dXJuIHMKIAogCi1jbGFzcyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5OgotICBkZWYgX19pbml0X18oc2VsZiwgc3RyaWN0UmVhZD1GYWxzZSwgc3RyaWN0V3JpdGU9VHJ1ZSk6Ci0gICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAotICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpY3RSZWFkPUZhbHNlLCBzdHJpY3RXcml0ZT1UcnVlLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuc3RyaWN0UmVhZCA9IHN0cmljdFJlYWQKKyAgICAgICAgc2VsZi5zdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlCisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IGt3YXJncy5nZXQoJ3N0cmluZ19sZW5ndGhfbGltaXQnLCBOb25lKQorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBrd2FyZ3MuZ2V0KCdjb250YWluZXJfbGVuZ3RoX2xpbWl0JywgTm9uZSkKIAotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSkKLSAgICByZXR1cm4gcHJvdAorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHNlbGYuc3RyaWN0UmVhZCwgc2VsZi5zdHJpY3RXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfbGVuZ3RoX2xpbWl0PXNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCkKKyAgICAgICAgcmV0dXJuIHByb3QKIAogCiBjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZChUQmluYXJ5UHJvdG9jb2wpOgotICAiIiJDLUFjY2VsZXJhdGVkIHZlcnNpb24gb2YgVEJpbmFyeVByb3RvY29sLgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQmluYXJ5UHJvdG9jb2wuCiAKLSAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcywKLSAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bwotICBvdXIgQyBtb2R1bGUgdG8gZG8gdGhlIGVuY29kaW5nLCBieXBhc3NpbmcgdGhpcyBvYmplY3QgZW50aXJlbHkuCi0gIFdlIGluaGVyaXQgZnJvbSBUQmluYXJ5UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRCaW5hcnlQcm90b2NvbAotICBlbmNvZGluZyBjYW4gaGFwcGVuIGlmIHRoZSBmYXN0YmluYXJ5IG1vZHVsZSBkb2Vzbid0IHdvcmsgZm9yIHNvbWUKLSAgcmVhc29uLiAgKFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIGhhcHBlbiBzYW5lbHkgaW4gbW9yZSBjYXNlcy4pCisgICAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVEJpbmFyeVByb3RvY29sJ3MgbWV0aG9kcywKKyAgICBidXQgdGhlIGdlbmVyYXRlZCBjb2RlIHJlY29nbml6ZXMgaXQgZGlyZWN0bHkgYW5kIHdpbGwgY2FsbCBpbnRvCisgICAgb3VyIEMgbW9kdWxlIHRvIGRvIHRoZSBlbmNvZGluZywgYnlwYXNzaW5nIHRoaXMgb2JqZWN0IGVudGlyZWx5LgorICAgIFdlIGluaGVyaXQgZnJvbSBUQmluYXJ5UHJvdG9jb2wgc28gdGhhdCB0aGUgbm9ybWFsIFRCaW5hcnlQcm90b2NvbAorICAgIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQorICAgIHJlYXNvbi4gIChUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyBoYXBwZW4gc2FuZWx5IGluIG1vcmUgY2FzZXMuKQorICAgIFRvIGRpc2FibGUgdGhpcyBiZWhhdmlvciwgcGFzcyBmYWxsYmFjaz1GYWxzZSBjb25zdHJ1Y3RvciBhcmd1bWVudC4KIAotICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCi0gIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVEJpbmFyeVByb3RvY29sLgorICAgIEluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDIG1vZHVsZSwganVzdCB1c2UKKyAgICBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBpbnN0ZWFkIG9mIFRCaW5hcnlQcm90b2NvbC4KIAotICBOT1RFOiAgVGhpcyBjb2RlIHdhcyBjb250cmlidXRlZCBieSBhbiBleHRlcm5hbCBkZXZlbG9wZXIuCi0gICAgICAgICBUaGUgaW50ZXJuYWwgVGhyaWZ0IHRlYW0gaGFzIHJldmlld2VkIGFuZCB0ZXN0ZWQgaXQsCi0gICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCi0gICAgICAgICBQbGVhc2UgZmVlbCBmcmVlIHRvIHJlcG9ydCBidWdzIGFuZC9vciBzdWNjZXNzIHN0b3JpZXMKLSAgICAgICAgIHRvIHRoZSBwdWJsaWMgbWFpbGluZyBsaXN0LgotICAiIiIKLSAgcGFzcworICAgIE5PVEU6ICBUaGlzIGNvZGUgd2FzIGNvbnRyaWJ1dGVkIGJ5IGFuIGV4dGVybmFsIGRldmVsb3Blci4KKyAgICAgICAgICAgVGhlIGludGVybmFsIFRocmlmdCB0ZWFtIGhhcyByZXZpZXdlZCBhbmQgdGVzdGVkIGl0LAorICAgICAgICAgICBidXQgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IGlzIHByb2R1Y3Rpb24tcmVhZHkuCisgICAgICAgICAgIFBsZWFzZSBmZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3MgYW5kL29yIHN1Y2Nlc3Mgc3RvcmllcworICAgICAgICAgICB0byB0aGUgcHVibGljIG1haWxpbmcgbGlzdC4KKyAgICAiIiIKKyAgICBwYXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZmFsbGJhY2sgPSBrd2FyZ3MucG9wKCdmYWxsYmFjaycsIFRydWUpCisgICAgICAgIHN1cGVyKFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBmYXN0YmluYXJ5CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIG5vdCBmYWxsYmFjazoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5CiAKIAotY2xhc3MgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5OgotICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFucykKK2NsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLl9mYWxsYmFjayA9IGZhbGxiYWNrCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCisgICAgICAgICAgICB0cmFucywKKyAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9c2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1zZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQsCisgICAgICAgICAgICBmYWxsYmFjaz1zZWxmLl9mYWxsYmFjaykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQppbmRleCBjZGVjNjA3Li5lNDg1Y2ZmIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CkBAIC0xNyw5ICsxNywxMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBUUHJvdG9jb2wgaW1wb3J0ICoKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgVFR5cGUsIFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbiwgY2hlY2tJbnRlZ2VyTGltaXRzCiBmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiAKK2Zyb20gLi5jb21wYXQgaW1wb3J0IGJpbmFyeV90b19zdHIsIHN0cl90b19iaW5hcnkKKwogX19hbGxfXyA9IFsnVENvbXBhY3RQcm90b2NvbCcsICdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSddCiAKIENMRUFSID0gMApAQCAtMzQsMzcwICszNiw0NDAgQEAKIAogCiBkZWYgbWFrZV9oZWxwZXIodl9mcm9tLCBjb250YWluZXIpOgotICBkZWYgaGVscGVyKGZ1bmMpOgotICAgIGRlZiBuZXN0ZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluICh2X2Zyb20sIGNvbnRhaW5lciksIChzZWxmLnN0YXRlLCB2X2Zyb20sIGNvbnRhaW5lcikKLSAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKLSAgICByZXR1cm4gbmVzdGVkCi0gIHJldHVybiBoZWxwZXIKKyAgICBkZWYgaGVscGVyKGZ1bmMpOgorICAgICAgICBkZWYgbmVzdGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAodl9mcm9tLCBjb250YWluZXIpLCAoc2VsZi5zdGF0ZSwgdl9mcm9tLCBjb250YWluZXIpCisgICAgICAgICAgICByZXR1cm4gZnVuYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHJldHVybiBuZXN0ZWQKKyAgICByZXR1cm4gaGVscGVyCisKKwogd3JpdGVyID0gbWFrZV9oZWxwZXIoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSkKIHJlYWRlciA9IG1ha2VfaGVscGVyKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKQogCiAKIGRlZiBtYWtlWmlnWmFnKG4sIGJpdHMpOgotICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAoYml0cyAtIDEpKQorICAgIGNoZWNrSW50ZWdlckxpbWl0cyhuLCBiaXRzKQorICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IChiaXRzIC0gMSkpCiAKIAogZGVmIGZyb21aaWdaYWcobik6Ci0gIHJldHVybiAobiA+PiAxKSBeIC0obiAmIDEpCisgICAgcmV0dXJuIChuID4+IDEpIF4gLShuICYgMSkKIAogCiBkZWYgd3JpdGVWYXJpbnQodHJhbnMsIG4pOgotICBvdXQgPSBbXQotICB3aGlsZSBUcnVlOgotICAgIGlmIG4gJiB+MHg3ZiA9PSAwOgotICAgICAgb3V0LmFwcGVuZChuKQotICAgICAgYnJlYWsKLSAgICBlbHNlOgotICAgICAgb3V0LmFwcGVuZCgobiAmIDB4ZmYpIHwgMHg4MCkKLSAgICAgIG4gPSBuID4+IDcKLSAgdHJhbnMud3JpdGUoJycuam9pbihtYXAoY2hyLCBvdXQpKSkKKyAgICBvdXQgPSBieXRlYXJyYXkoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGlmIG4gJiB+MHg3ZiA9PSAwOgorICAgICAgICAgICAgb3V0LmFwcGVuZChuKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dC5hcHBlbmQoKG4gJiAweGZmKSB8IDB4ODApCisgICAgICAgICAgICBuID0gbiA+PiA3CisgICAgdHJhbnMud3JpdGUoYnl0ZXMob3V0KSkKIAogCiBkZWYgcmVhZFZhcmludCh0cmFucyk6Ci0gIHJlc3VsdCA9IDAKLSAgc2hpZnQgPSAwCi0gIHdoaWxlIFRydWU6Ci0gICAgeCA9IHRyYW5zLnJlYWRBbGwoMSkKLSAgICBieXRlID0gb3JkKHgpCi0gICAgcmVzdWx0IHw9IChieXRlICYgMHg3ZikgPDwgc2hpZnQKLSAgICBpZiBieXRlID4+IDcgPT0gMDoKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICBzaGlmdCArPSA3CisgICAgcmVzdWx0ID0gMAorICAgIHNoaWZ0ID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHggPSB0cmFucy5yZWFkQWxsKDEpCisgICAgICAgIGJ5dGUgPSBvcmQoeCkKKyAgICAgICAgcmVzdWx0IHw9IChieXRlICYgMHg3ZikgPDwgc2hpZnQKKyAgICAgICAgaWYgYnl0ZSA+PiA3ID09IDA6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHNoaWZ0ICs9IDcKIAogCi1jbGFzcyBDb21wYWN0VHlwZToKLSAgU1RPUCA9IDB4MDAKLSAgVFJVRSA9IDB4MDEKLSAgRkFMU0UgPSAweDAyCi0gIEJZVEUgPSAweDAzCi0gIEkxNiA9IDB4MDQKLSAgSTMyID0gMHgwNQotICBJNjQgPSAweDA2Ci0gIERPVUJMRSA9IDB4MDcKLSAgQklOQVJZID0gMHgwOAotICBMSVNUID0gMHgwOQotICBTRVQgPSAweDBBCi0gIE1BUCA9IDB4MEIKLSAgU1RSVUNUID0gMHgwQworY2xhc3MgQ29tcGFjdFR5cGUob2JqZWN0KToKKyAgICBTVE9QID0gMHgwMAorICAgIFRSVUUgPSAweDAxCisgICAgRkFMU0UgPSAweDAyCisgICAgQllURSA9IDB4MDMKKyAgICBJMTYgPSAweDA0CisgICAgSTMyID0gMHgwNQorICAgIEk2NCA9IDB4MDYKKyAgICBET1VCTEUgPSAweDA3CisgICAgQklOQVJZID0gMHgwOAorICAgIExJU1QgPSAweDA5CisgICAgU0VUID0gMHgwQQorICAgIE1BUCA9IDB4MEIKKyAgICBTVFJVQ1QgPSAweDBDCiAKLUNUWVBFUyA9IHtUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAotICAgICAgICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KLSAgICAgICAgICBUVHlwZS5CWVRFOiBDb21wYWN0VHlwZS5CWVRFLAotICAgICAgICAgIFRUeXBlLkkxNjogQ29tcGFjdFR5cGUuSTE2LAotICAgICAgICAgIFRUeXBlLkkzMjogQ29tcGFjdFR5cGUuSTMyLAotICAgICAgICAgIFRUeXBlLkk2NDogQ29tcGFjdFR5cGUuSTY0LAotICAgICAgICAgIFRUeXBlLkRPVUJMRTogQ29tcGFjdFR5cGUuRE9VQkxFLAotICAgICAgICAgIFRUeXBlLlNUUklORzogQ29tcGFjdFR5cGUuQklOQVJZLAotICAgICAgICAgIFRUeXBlLlNUUlVDVDogQ29tcGFjdFR5cGUuU1RSVUNULAotICAgICAgICAgIFRUeXBlLkxJU1Q6IENvbXBhY3RUeXBlLkxJU1QsCi0gICAgICAgICAgVFR5cGUuU0VUOiBDb21wYWN0VHlwZS5TRVQsCi0gICAgICAgICAgVFR5cGUuTUFQOiBDb21wYWN0VHlwZS5NQVAKLSAgICAgICAgICB9CisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAorICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICBUVHlwZS5CWVRFOiBDb21wYWN0VHlwZS5CWVRFLAorICAgIFRUeXBlLkkxNjogQ29tcGFjdFR5cGUuSTE2LAorICAgIFRUeXBlLkkzMjogQ29tcGFjdFR5cGUuSTMyLAorICAgIFRUeXBlLkk2NDogQ29tcGFjdFR5cGUuSTY0LAorICAgIFRUeXBlLkRPVUJMRTogQ29tcGFjdFR5cGUuRE9VQkxFLAorICAgIFRUeXBlLlNUUklORzogQ29tcGFjdFR5cGUuQklOQVJZLAorICAgIFRUeXBlLlNUUlVDVDogQ29tcGFjdFR5cGUuU1RSVUNULAorICAgIFRUeXBlLkxJU1Q6IENvbXBhY3RUeXBlLkxJU1QsCisgICAgVFR5cGUuU0VUOiBDb21wYWN0VHlwZS5TRVQsCisgICAgVFR5cGUuTUFQOiBDb21wYWN0VHlwZS5NQVAsCit9CiAKIFRUWVBFUyA9IHt9CiBmb3IgaywgdiBpbiBDVFlQRVMuaXRlbXMoKToKLSAgVFRZUEVTW3ZdID0gaworICAgIFRUWVBFU1t2XSA9IGsKIFRUWVBFU1tDb21wYWN0VHlwZS5GQUxTRV0gPSBUVHlwZS5CT09MCiBkZWwgawogZGVsIHYKIAogCiBjbGFzcyBUQ29tcGFjdFByb3RvY29sKFRQcm90b2NvbEJhc2UpOgotICAiIiJDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorICAgICIiIkNvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgUFJPVE9DT0xfSUQgPSAweDgyCi0gIFZFUlNJT04gPSAxCi0gIFZFUlNJT05fTUFTSyA9IDB4MWYKLSAgVFlQRV9NQVNLID0gMHhlMAotICBUWVBFX1NISUZUX0FNT1VOVCA9IDUKKyAgICBQUk9UT0NPTF9JRCA9IDB4ODIKKyAgICBWRVJTSU9OID0gMQorICAgIFZFUlNJT05fTUFTSyA9IDB4MWYKKyAgICBUWVBFX01BU0sgPSAweGUwCisgICAgVFlQRV9CSVRTID0gMHgwNworICAgIFRZUEVfU0hJRlRfQU1PVU5UID0gNQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFucyk6Ci0gICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKLSAgICBzZWxmLnN0YXRlID0gQ0xFQVIKLSAgICBzZWxmLl9fbGFzdF9maWQgPSAwCi0gICAgc2VsZi5fX2Jvb2xfZmlkID0gTm9uZQotICAgIHNlbGYuX19ib29sX3ZhbHVlID0gTm9uZQotICAgIHNlbGYuX19zdHJ1Y3RzID0gW10KLSAgICBzZWxmLl9fY29udGFpbmVycyA9IFtdCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSk6CisgICAgICAgIFRQcm90b2NvbEJhc2UuX19pbml0X18oc2VsZiwgdHJhbnMpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDTEVBUgorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSAwCisgICAgICAgIHNlbGYuX19ib29sX2ZpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2Jvb2xfdmFsdWUgPSBOb25lCisgICAgICAgIHNlbGYuX19zdHJ1Y3RzID0gW10KKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMgPSBbXQorICAgICAgICBzZWxmLnN0cmluZ19sZW5ndGhfbGltaXQgPSBzdHJpbmdfbGVuZ3RoX2xpbWl0CisgICAgICAgIHNlbGYuY29udGFpbmVyX2xlbmd0aF9saW1pdCA9IGNvbnRhaW5lcl9sZW5ndGhfbGltaXQKIAotICBkZWYgX193cml0ZVZhcmludChzZWxmLCBuKToKLSAgICB3cml0ZVZhcmludChzZWxmLnRyYW5zLCBuKQorICAgIGRlZiBfY2hlY2tfc3RyaW5nX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgotICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuUFJPVE9DT0xfSUQpCi0gICAgc2VsZi5fX3dyaXRlVUJ5dGUoc2VsZi5WRVJTSU9OIHwgKHR5cGUgPDwgc2VsZi5UWVBFX1NISUZUX0FNT1VOVCkpCi0gICAgc2VsZi5fX3dyaXRlVmFyaW50KHNlcWlkKQotICAgIHNlbGYuX193cml0ZVN0cmluZyhuYW1lKQotICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQorICAgIGRlZiBfY2hlY2tfY29udGFpbmVyX2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jaGVja19sZW5ndGgoc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LCBsZW5ndGgpCiAKLSAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBWQUxVRV9XUklURQotICAgIHNlbGYuc3RhdGUgPSBDTEVBUgorICAgIGRlZiBfX3dyaXRlVmFyaW50KHNlbGYsIG4pOgorICAgICAgICB3cml0ZVZhcmludChzZWxmLnRyYW5zLCBuKQogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1dSSVRFLCBWQUxVRV9XUklURSksIHNlbGYuc3RhdGUKLSAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCi0gICAgc2VsZi5zdGF0ZSA9IEZJRUxEX1dSSVRFCi0gICAgc2VsZi5fX2xhc3RfZmlkID0gMAorICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuUFJPVE9DT0xfSUQpCisgICAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNlbGYuVkVSU0lPTiB8ICh0eXBlIDw8IHNlbGYuVFlQRV9TSElGVF9BTU9VTlQpKQorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQoc2VxaWQpCisgICAgICAgIHNlbGYuX193cml0ZUJpbmFyeShzdHJfdG9fYmluYXJ5KG5hbWUpKQorICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfV1JJVEUKIAotICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfV1JJVEUKLSAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQorICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IFZBTFVFX1dSSVRFCisgICAgICAgIHNlbGYuc3RhdGUgPSBDTEVBUgogCi0gIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKLSAgICBzZWxmLl9fd3JpdGVCeXRlKDApCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1dSSVRFLCBWQUxVRV9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKKyAgICAgICAgc2VsZi5fX2xhc3RfZmlkID0gMAogCi0gIGRlZiBfX3dyaXRlRmllbGRIZWFkZXIoc2VsZiwgdHlwZSwgZmlkKToKLSAgICBkZWx0YSA9IGZpZCAtIHNlbGYuX19sYXN0X2ZpZAotICAgIGlmIDAgPCBkZWx0YSA8PSAxNToKLSAgICAgIHNlbGYuX193cml0ZVVCeXRlKGRlbHRhIDw8IDQgfCB0eXBlKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9fd3JpdGVCeXRlKHR5cGUpCi0gICAgICBzZWxmLl9fd3JpdGVJMTYoZmlkKQotICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAorICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfV1JJVEUKKyAgICAgICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKIAotICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGZpZCk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfV1JJVEUsIHNlbGYuc3RhdGUKLSAgICBpZiB0eXBlID09IFRUeXBlLkJPT0w6Ci0gICAgICBzZWxmLnN0YXRlID0gQk9PTF9XUklURQotICAgICAgc2VsZi5fX2Jvb2xfZmlkID0gZmlkCi0gICAgZWxzZToKLSAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQotICAgICAgc2VsZi5fX3dyaXRlRmllbGRIZWFkZXIoQ1RZUEVTW3R5cGVdLCBmaWQpCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKDApCiAKLSAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBCT09MX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9XUklURQorICAgIGRlZiBfX3dyaXRlRmllbGRIZWFkZXIoc2VsZiwgdHlwZSwgZmlkKToKKyAgICAgICAgZGVsdGEgPSBmaWQgLSBzZWxmLl9fbGFzdF9maWQKKyAgICAgICAgaWYgMCA8IGRlbHRhIDw9IDE1OgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoZGVsdGEgPDwgNCB8IHR5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKHR5cGUpCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVJMTYoZmlkKQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKIAotICBkZWYgX193cml0ZVVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIUInLCBieXRlKSkKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIGZpZCk6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IEZJRUxEX1dSSVRFLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1dSSVRFCisgICAgICAgICAgICBzZWxmLl9fYm9vbF9maWQgPSBmaWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBWQUxVRV9XUklURQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlRmllbGRIZWFkZXIoQ1RZUEVTW3R5cGVdLCBmaWQpCiAKLSAgZGVmIF9fd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIWInLCBieXRlKSkKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBCT09MX1dSSVRFKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfV1JJVEUKIAotICBkZWYgX193cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkxNiwgMTYpKQorICAgIGRlZiBfX3dyaXRlVUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHNlbGYudHJhbnMud3JpdGUocGFjaygnIUInLCBieXRlKSkKIAotICBkZWYgX193cml0ZVNpemUoc2VsZiwgaTMyKToKLSAgICBzZWxmLl9fd3JpdGVWYXJpbnQoaTMyKQorICAgIGRlZiBfX3dyaXRlQnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCchYicsIGJ5dGUpKQogCi0gIGRlZiB3cml0ZUNvbGxlY3Rpb25CZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCi0gICAgaWYgc2l6ZSA8PSAxNDoKLSAgICAgIHNlbGYuX193cml0ZVVCeXRlKHNpemUgPDwgNCB8IENUWVBFU1tldHlwZV0pCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX193cml0ZVVCeXRlKDB4ZjAgfCBDVFlQRVNbZXR5cGVdKQotICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKLSAgd3JpdGVTZXRCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCi0gIHdyaXRlTGlzdEJlZ2luID0gd3JpdGVDb2xsZWN0aW9uQmVnaW4KKyAgICBkZWYgX193cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBzZWxmLl9fd3JpdGVWYXJpbnQobWFrZVppZ1phZyhpMTYsIDE2KSkKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKSwgc2VsZi5zdGF0ZQotICAgIGlmIHNpemUgPT0gMDoKLSAgICAgIHNlbGYuX193cml0ZUJ5dGUoMCkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQotICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoQ1RZUEVTW2t0eXBlXSA8PCA0IHwgQ1RZUEVTW3Z0eXBlXSkKLSAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKLSAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCisgICAgZGVmIF9fd3JpdGVTaXplKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChpMzIpCiAKLSAgZGVmIHdyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEUsIHNlbGYuc3RhdGUKLSAgICBzZWxmLnN0YXRlID0gc2VsZi5fX2NvbnRhaW5lcnMucG9wKCkKLSAgd3JpdGVNYXBFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKLSAgd3JpdGVTZXRFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKLSAgd3JpdGVMaXN0RW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgZGVmIHdyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1dSSVRFLCBDT05UQUlORVJfV1JJVEUpLCBzZWxmLnN0YXRlCisgICAgICAgIGlmIHNpemUgPD0gMTQ6CisgICAgICAgICAgICBzZWxmLl9fd3JpdGVVQnl0ZShzaXplIDw8IDQgfCBDVFlQRVNbZXR5cGVdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoMHhmMCB8IENUWVBFU1tldHlwZV0pCisgICAgICAgICAgICBzZWxmLl9fd3JpdGVTaXplKHNpemUpCisgICAgICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQorICAgICAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1dSSVRFCisgICAgd3JpdGVTZXRCZWdpbiA9IHdyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgd3JpdGVMaXN0QmVnaW4gPSB3cml0ZUNvbGxlY3Rpb25CZWdpbgogCi0gIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6Ci0gICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1dSSVRFOgotICAgICAgaWYgYm9vbDoKLSAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5UUlVFCi0gICAgICBlbHNlOgotICAgICAgICBjdHlwZSA9IENvbXBhY3RUeXBlLkZBTFNFCi0gICAgICBzZWxmLl9fd3JpdGVGaWVsZEhlYWRlcihjdHlwZSwgc2VsZi5fX2Jvb2xfZmlkKQotICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEU6Ci0gICAgICBpZiBib29sOgotICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLlRSVUUpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLl9fd3JpdGVCeXRlKENvbXBhY3RUeXBlLkZBTFNFKQotICAgIGVsc2U6Ci0gICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sIikKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfV1JJVEUsIENPTlRBSU5FUl9XUklURSksIHNlbGYuc3RhdGUKKyAgICAgICAgaWYgc2l6ZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZSgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3dyaXRlU2l6ZShzaXplKQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlVUJ5dGUoQ1RZUEVTW2t0eXBlXSA8PCA0IHwgQ1RZUEVTW3Z0eXBlXSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfV1JJVEUKIAotICB3cml0ZUJ5dGUgPSB3cml0ZXIoX193cml0ZUJ5dGUpCi0gIHdyaXRlSTE2ID0gd3JpdGVyKF9fd3JpdGVJMTYpCisgICAgZGVmIHdyaXRlQ29sbGVjdGlvbkVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1dSSVRFLCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQorICAgIHdyaXRlTWFwRW5kID0gd3JpdGVDb2xsZWN0aW9uRW5kCisgICAgd3JpdGVTZXRFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZUxpc3RFbmQgPSB3cml0ZUNvbGxlY3Rpb25FbmQKIAotICBAd3JpdGVyCi0gIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgotICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkzMiwgMzIpKQorICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbCk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gQk9PTF9XUklURToKKyAgICAgICAgICAgIGlmIGJvb2w6CisgICAgICAgICAgICAgICAgY3R5cGUgPSBDb21wYWN0VHlwZS5UUlVFCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gQ29tcGFjdFR5cGUuRkFMU0UKKyAgICAgICAgICAgIHNlbGYuX193cml0ZUZpZWxkSGVhZGVyKGN0eXBlLCBzZWxmLl9fYm9vbF9maWQpCisgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfV1JJVEU6CisgICAgICAgICAgICBpZiBib29sOgorICAgICAgICAgICAgICAgIHNlbGYuX193cml0ZUJ5dGUoQ29tcGFjdFR5cGUuVFJVRSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fX3dyaXRlQnl0ZShDb21wYWN0VHlwZS5GQUxTRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wiKQogCi0gIEB3cml0ZXIKLSAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6Ci0gICAgc2VsZi5fX3dyaXRlVmFyaW50KG1ha2VaaWdaYWcoaTY0LCA2NCkpCisgICAgd3JpdGVCeXRlID0gd3JpdGVyKF9fd3JpdGVCeXRlKQorICAgIHdyaXRlSTE2ID0gd3JpdGVyKF9fd3JpdGVJMTYpCiAKLSAgQHdyaXRlcgotICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKLSAgICBzZWxmLnRyYW5zLndyaXRlKHBhY2soJyFkJywgZHViKSkKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGkzMiwgMzIpKQogCi0gIGRlZiBfX3dyaXRlU3RyaW5nKHNlbGYsIHMpOgotICAgIHNlbGYuX193cml0ZVNpemUobGVuKHMpKQotICAgIHNlbGYudHJhbnMud3JpdGUocykKLSAgd3JpdGVTdHJpbmcgPSB3cml0ZXIoX193cml0ZVN0cmluZykKKyAgICBAd3JpdGVyCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHNlbGYuX193cml0ZVZhcmludChtYWtlWmlnWmFnKGk2NCwgNjQpKQogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFELCBzZWxmLnN0YXRlCi0gICAgdHlwZSA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIGlmIHR5cGUgJiAweDBmID09IFRUeXBlLlNUT1A6Ci0gICAgICByZXR1cm4gKE5vbmUsIDAsIDApCi0gICAgZGVsdGEgPSB0eXBlID4+IDQKLSAgICBpZiBkZWx0YSA9PSAwOgotICAgICAgZmlkID0gc2VsZi5fX3JlYWRJMTYoKQotICAgIGVsc2U6Ci0gICAgICBmaWQgPSBzZWxmLl9fbGFzdF9maWQgKyBkZWx0YQotICAgIHNlbGYuX19sYXN0X2ZpZCA9IGZpZAotICAgIHR5cGUgPSB0eXBlICYgMHgwZgotICAgIGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuVFJVRToKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKLSAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gVHJ1ZQotICAgIGVsaWYgdHlwZSA9PSBDb21wYWN0VHlwZS5GQUxTRToKLSAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKLSAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gRmFsc2UKLSAgICBlbHNlOgotICAgICAgc2VsZi5zdGF0ZSA9IFZBTFVFX1JFQUQKLSAgICByZXR1cm4gKE5vbmUsIHNlbGYuX19nZXRUVHlwZSh0eXBlKSwgZmlkKQorICAgIEB3cml0ZXIKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShwYWNrKCc8ZCcsIGR1YikpCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQk9PTF9SRUFEKSwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECisgICAgZGVmIF9fd3JpdGVCaW5hcnkoc2VsZiwgcyk6CisgICAgICAgIHNlbGYuX193cml0ZVNpemUobGVuKHMpKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKHMpCisgICAgd3JpdGVCaW5hcnkgPSB3cml0ZXIoX193cml0ZUJpbmFyeSkKIAotICBkZWYgX19yZWFkVUJ5dGUoc2VsZik6Ci0gICAgcmVzdWx0LCA9IHVucGFjaygnIUInLCBzZWxmLnRyYW5zLnJlYWRBbGwoMSkpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRCwgc2VsZi5zdGF0ZQorICAgICAgICB0eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCisgICAgICAgIGlmIHR5cGUgJiAweDBmID09IFRUeXBlLlNUT1A6CisgICAgICAgICAgICByZXR1cm4gKE5vbmUsIDAsIDApCisgICAgICAgIGRlbHRhID0gdHlwZSA+PiA0CisgICAgICAgIGlmIGRlbHRhID09IDA6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fcmVhZEkxNigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWQgPSBzZWxmLl9fbGFzdF9maWQgKyBkZWx0YQorICAgICAgICBzZWxmLl9fbGFzdF9maWQgPSBmaWQKKyAgICAgICAgdHlwZSA9IHR5cGUgJiAweDBmCisgICAgICAgIGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuVFJVRToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBCT09MX1JFQUQKKyAgICAgICAgICAgIHNlbGYuX19ib29sX3ZhbHVlID0gVHJ1ZQorICAgICAgICBlbGlmIHR5cGUgPT0gQ29tcGFjdFR5cGUuRkFMU0U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gQk9PTF9SRUFECisgICAgICAgICAgICBzZWxmLl9fYm9vbF92YWx1ZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gVkFMVUVfUkVBRAorICAgICAgICByZXR1cm4gKE5vbmUsIHNlbGYuX19nZXRUVHlwZSh0eXBlKSwgZmlkKQogCi0gIGRlZiBfX3JlYWRCeXRlKHNlbGYpOgotICAgIHJlc3VsdCwgPSB1bnBhY2soJyFiJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQotICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQk9PTF9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLnN0YXRlID0gRklFTERfUkVBRAogCi0gIGRlZiBfX3JlYWRWYXJpbnQoc2VsZik6Ci0gICAgcmV0dXJuIHJlYWRWYXJpbnQoc2VsZi50cmFucykKKyAgICBkZWYgX19yZWFkVUJ5dGUoc2VsZik6CisgICAgICAgIHJlc3VsdCwgPSB1bnBhY2soJyFCJywgc2VsZi50cmFucy5yZWFkQWxsKDEpKQorICAgICAgICByZXR1cm4gcmVzdWx0CiAKLSAgZGVmIF9fcmVhZFppZ1phZyhzZWxmKToKLSAgICByZXR1cm4gZnJvbVppZ1phZyhzZWxmLl9fcmVhZFZhcmludCgpKQorICAgIGRlZiBfX3JlYWRCeXRlKHNlbGYpOgorICAgICAgICByZXN1bHQsID0gdW5wYWNrKCchYicsIHNlbGYudHJhbnMucmVhZEFsbCgxKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAogCi0gIGRlZiBfX3JlYWRTaXplKHNlbGYpOgotICAgIHJlc3VsdCA9IHNlbGYuX19yZWFkVmFyaW50KCkKLSAgICBpZiByZXN1bHQgPCAwOgotICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiTGVuZ3RoIDwgMCIpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiBfX3JlYWRWYXJpbnQoc2VsZik6CisgICAgICAgIHJldHVybiByZWFkVmFyaW50KHNlbGYudHJhbnMpCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKLSAgICBwcm90b19pZCA9IHNlbGYuX19yZWFkVUJ5dGUoKQotICAgIGlmIHByb3RvX2lkICE9IHNlbGYuUFJPVE9DT0xfSUQ6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAotICAgICAgICAgICdCYWQgcHJvdG9jb2wgaWQgaW4gdGhlIG1lc3NhZ2U6ICVkJyAlIHByb3RvX2lkKQotICAgIHZlcl90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgdHlwZSA9ICh2ZXJfdHlwZSAmIHNlbGYuVFlQRV9NQVNLKSA+PiBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UCi0gICAgdmVyc2lvbiA9IHZlcl90eXBlICYgc2VsZi5WRVJTSU9OX01BU0sKLSAgICBpZiB2ZXJzaW9uICE9IHNlbGYuVkVSU0lPTjoKLSAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCi0gICAgICAgICAgJ0JhZCB2ZXJzaW9uOiAlZCAoZXhwZWN0ICVkKScgJSAodmVyc2lvbiwgc2VsZi5WRVJTSU9OKSkKLSAgICBzZXFpZCA9IHNlbGYuX19yZWFkVmFyaW50KCkKLSAgICBuYW1lID0gc2VsZi5fX3JlYWRTdHJpbmcoKQotICAgIHJldHVybiAobmFtZSwgdHlwZSwgc2VxaWQpCisgICAgZGVmIF9fcmVhZFppZ1phZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGZyb21aaWdaYWcoc2VsZi5fX3JlYWRWYXJpbnQoKSkKIAotICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6Ci0gICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gQ0xFQVIKLSAgICBhc3NlcnQgbGVuKHNlbGYuX19zdHJ1Y3RzKSA9PSAwCisgICAgZGVmIF9fcmVhZFNpemUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19yZWFkVmFyaW50KCkKKyAgICAgICAgaWYgcmVzdWx0IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigiTGVuZ3RoIDwgMCIpCisgICAgICAgIHJldHVybiByZXN1bHQKIAotICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChDTEVBUiwgQ09OVEFJTkVSX1JFQUQsIFZBTFVFX1JFQUQpLCBzZWxmLnN0YXRlCi0gICAgc2VsZi5fX3N0cnVjdHMuYXBwZW5kKChzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQpKQotICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECi0gICAgc2VsZi5fX2xhc3RfZmlkID0gMAorICAgIGRlZiByZWFkTWVzc2FnZUJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDTEVBUgorICAgICAgICBwcm90b19pZCA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICBpZiBwcm90b19pZCAhPSBzZWxmLlBST1RPQ09MX0lEOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFkIHByb3RvY29sIGlkIGluIHRoZSBtZXNzYWdlOiAlZCcgJSBwcm90b19pZCkKKyAgICAgICAgdmVyX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgdHlwZSA9ICh2ZXJfdHlwZSA+PiBzZWxmLlRZUEVfU0hJRlRfQU1PVU5UKSAmIHNlbGYuVFlQRV9CSVRTCisgICAgICAgIHZlcnNpb24gPSB2ZXJfdHlwZSAmIHNlbGYuVkVSU0lPTl9NQVNLCisgICAgICAgIGlmIHZlcnNpb24gIT0gc2VsZi5WRVJTSU9OOgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQmFkIHZlcnNpb246ICVkIChleHBlY3QgJWQpJyAlICh2ZXJzaW9uLCBzZWxmLlZFUlNJT04pKQorICAgICAgICBzZXFpZCA9IHNlbGYuX19yZWFkVmFyaW50KCkKKyAgICAgICAgbmFtZSA9IGJpbmFyeV90b19zdHIoc2VsZi5fX3JlYWRCaW5hcnkoKSkKKyAgICAgICAgcmV0dXJuIChuYW1lLCB0eXBlLCBzZXFpZCkKIAotICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBGSUVMRF9SRUFECi0gICAgc2VsZi5zdGF0ZSwgc2VsZi5fX2xhc3RfZmlkID0gc2VsZi5fX3N0cnVjdHMucG9wKCkKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENMRUFSCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5fX3N0cnVjdHMpID09IDAKIAotICBkZWYgcmVhZENvbGxlY3Rpb25CZWdpbihzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpLCBzZWxmLnN0YXRlCi0gICAgc2l6ZV90eXBlID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgc2l6ZSA9IHNpemVfdHlwZSA+PiA0Ci0gICAgdHlwZSA9IHNlbGYuX19nZXRUVHlwZShzaXplX3R5cGUpCi0gICAgaWYgc2l6ZSA9PSAxNToKLSAgICAgIHNpemUgPSBzZWxmLl9fcmVhZFNpemUoKQotICAgIHNlbGYuX19jb250YWluZXJzLmFwcGVuZChzZWxmLnN0YXRlKQotICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAotICAgIHJldHVybiB0eXBlLCBzaXplCi0gIHJlYWRTZXRCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KLSAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGF0ZSBpbiAoQ0xFQVIsIENPTlRBSU5FUl9SRUFELCBWQUxVRV9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLl9fc3RydWN0cy5hcHBlbmQoKHNlbGYuc3RhdGUsIHNlbGYuX19sYXN0X2ZpZCkpCisgICAgICAgIHNlbGYuc3RhdGUgPSBGSUVMRF9SRUFECisgICAgICAgIHNlbGYuX19sYXN0X2ZpZCA9IDAKIAotICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgotICAgIGFzc2VydCBzZWxmLnN0YXRlIGluIChWQUxVRV9SRUFELCBDT05UQUlORVJfUkVBRCksIHNlbGYuc3RhdGUKLSAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKLSAgICB0eXBlcyA9IDAKLSAgICBpZiBzaXplID4gMDoKLSAgICAgIHR5cGVzID0gc2VsZi5fX3JlYWRVQnl0ZSgpCi0gICAgdnR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMpCi0gICAga3R5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMgPj4gNCkKLSAgICBzZWxmLl9fY29udGFpbmVycy5hcHBlbmQoc2VsZi5zdGF0ZSkKLSAgICBzZWxmLnN0YXRlID0gQ09OVEFJTkVSX1JFQUQKLSAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgPT0gRklFTERfUkVBRAorICAgICAgICBzZWxmLnN0YXRlLCBzZWxmLl9fbGFzdF9maWQgPSBzZWxmLl9fc3RydWN0cy5wb3AoKQogCi0gIGRlZiByZWFkQ29sbGVjdGlvbkVuZChzZWxmKToKLSAgICBhc3NlcnQgc2VsZi5zdGF0ZSA9PSBDT05UQUlORVJfUkVBRCwgc2VsZi5zdGF0ZQotICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQotICByZWFkU2V0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKLSAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAotICByZWFkTWFwRW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25CZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzaXplX3R5cGUgPSBzZWxmLl9fcmVhZFVCeXRlKCkKKyAgICAgICAgc2l6ZSA9IHNpemVfdHlwZSA+PiA0CisgICAgICAgIHR5cGUgPSBzZWxmLl9fZ2V0VFR5cGUoc2l6ZV90eXBlKQorICAgICAgICBpZiBzaXplID09IDE1OgorICAgICAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRhaW5lcl9sZW5ndGgoc2l6ZSkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAorICAgICAgICByZXR1cm4gdHlwZSwgc2l6ZQorICAgIHJlYWRTZXRCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkTGlzdEJlZ2luID0gcmVhZENvbGxlY3Rpb25CZWdpbgogCi0gIGRlZiByZWFkQm9vbChzZWxmKToKLSAgICBpZiBzZWxmLnN0YXRlID09IEJPT0xfUkVBRDoKLSAgICAgIHJldHVybiBzZWxmLl9fYm9vbF92YWx1ZSA9PSBDb21wYWN0VHlwZS5UUlVFCi0gICAgZWxpZiBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFEOgotICAgICAgcmV0dXJuIHNlbGYuX19yZWFkQnl0ZSgpID09IENvbXBhY3RUeXBlLlRSVUUKLSAgICBlbHNlOgotICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbDogJWQiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUpCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhdGUgaW4gKFZBTFVFX1JFQUQsIENPTlRBSU5FUl9SRUFEKSwgc2VsZi5zdGF0ZQorICAgICAgICBzaXplID0gc2VsZi5fX3JlYWRTaXplKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGFpbmVyX2xlbmd0aChzaXplKQorICAgICAgICB0eXBlcyA9IDAKKyAgICAgICAgaWYgc2l6ZSA+IDA6CisgICAgICAgICAgICB0eXBlcyA9IHNlbGYuX19yZWFkVUJ5dGUoKQorICAgICAgICB2dHlwZSA9IHNlbGYuX19nZXRUVHlwZSh0eXBlcykKKyAgICAgICAga3R5cGUgPSBzZWxmLl9fZ2V0VFR5cGUodHlwZXMgPj4gNCkKKyAgICAgICAgc2VsZi5fX2NvbnRhaW5lcnMuYXBwZW5kKHNlbGYuc3RhdGUpCisgICAgICAgIHNlbGYuc3RhdGUgPSBDT05UQUlORVJfUkVBRAorICAgICAgICByZXR1cm4gKGt0eXBlLCB2dHlwZSwgc2l6ZSkKIAotICByZWFkQnl0ZSA9IHJlYWRlcihfX3JlYWRCeXRlKQotICBfX3JlYWRJMTYgPSBfX3JlYWRaaWdaYWcKLSAgcmVhZEkxNiA9IHJlYWRlcihfX3JlYWRaaWdaYWcpCi0gIHJlYWRJMzIgPSByZWFkZXIoX19yZWFkWmlnWmFnKQotICByZWFkSTY0ID0gcmVhZGVyKF9fcmVhZFppZ1phZykKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YXRlID09IENPTlRBSU5FUl9SRUFELCBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLl9fY29udGFpbmVycy5wb3AoKQorICAgIHJlYWRTZXRFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorICAgIHJlYWRMaXN0RW5kID0gcmVhZENvbGxlY3Rpb25FbmQKKyAgICByZWFkTWFwRW5kID0gcmVhZENvbGxlY3Rpb25FbmQKIAotICBAcmVhZGVyCi0gIGRlZiByZWFkRG91YmxlKHNlbGYpOgotICAgIGJ1ZmYgPSBzZWxmLnRyYW5zLnJlYWRBbGwoOCkKLSAgICB2YWwsID0gdW5wYWNrKCchZCcsIGJ1ZmYpCi0gICAgcmV0dXJuIHZhbAorICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBCT09MX1JFQUQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2Jvb2xfdmFsdWUgPT0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gQ09OVEFJTkVSX1JFQUQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3JlYWRCeXRlKCkgPT0gQ29tcGFjdFR5cGUuVFJVRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbDogJWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUpCiAKLSAgZGVmIF9fcmVhZFN0cmluZyhzZWxmKToKLSAgICBsZW4gPSBzZWxmLl9fcmVhZFNpemUoKQotICAgIHJldHVybiBzZWxmLnRyYW5zLnJlYWRBbGwobGVuKQotICByZWFkU3RyaW5nID0gcmVhZGVyKF9fcmVhZFN0cmluZykKKyAgICByZWFkQnl0ZSA9IHJlYWRlcihfX3JlYWRCeXRlKQorICAgIF9fcmVhZEkxNiA9IF9fcmVhZFppZ1phZworICAgIHJlYWRJMTYgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIHJlYWRJMzIgPSByZWFkZXIoX19yZWFkWmlnWmFnKQorICAgIHJlYWRJNjQgPSByZWFkZXIoX19yZWFkWmlnWmFnKQogCi0gIGRlZiBfX2dldFRUeXBlKHNlbGYsIGJ5dGUpOgotICAgIHJldHVybiBUVFlQRVNbYnl0ZSAmIDB4MGZdCisgICAgQHJlYWRlcgorICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICBidWZmID0gc2VsZi50cmFucy5yZWFkQWxsKDgpCisgICAgICAgIHZhbCwgPSB1bnBhY2soJzxkJywgYnVmZikKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIF9fcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgc2l6ZSA9IHNlbGYuX19yZWFkU2l6ZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX3N0cmluZ19sZW5ndGgoc2l6ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnMucmVhZEFsbChzaXplKQorICAgIHJlYWRCaW5hcnkgPSByZWFkZXIoX19yZWFkQmluYXJ5KQorCisgICAgZGVmIF9fZ2V0VFR5cGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHJldHVybiBUVFlQRVNbYnl0ZSAmIDB4MGZdCiAKIAotY2xhc3MgVENvbXBhY3RQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHN0cmluZ19sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29udGFpbmVyX2xlbmd0aF9saW1pdD1Ob25lKToKKyAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0ID0gc3RyaW5nX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBjb250YWluZXJfbGVuZ3RoX2xpbWl0CisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpbmdfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRhaW5lcl9sZW5ndGhfbGltaXQpCisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKFRDb21wYWN0UHJvdG9jb2wpOgorICAgICIiIkMtQWNjZWxlcmF0ZWQgdmVyc2lvbiBvZiBUQ29tcGFjdFByb3RvY29sLgorCisgICAgVGhpcyBjbGFzcyBkb2VzIG5vdCBvdmVycmlkZSBhbnkgb2YgVENvbXBhY3RQcm90b2NvbCdzIG1ldGhvZHMsCisgICAgYnV0IHRoZSBnZW5lcmF0ZWQgY29kZSByZWNvZ25pemVzIGl0IGRpcmVjdGx5IGFuZCB3aWxsIGNhbGwgaW50bworICAgIG91ciBDIG1vZHVsZSB0byBkbyB0aGUgZW5jb2RpbmcsIGJ5cGFzc2luZyB0aGlzIG9iamVjdCBlbnRpcmVseS4KKyAgICBXZSBpbmhlcml0IGZyb20gVENvbXBhY3RQcm90b2NvbCBzbyB0aGF0IHRoZSBub3JtYWwgVENvbXBhY3RQcm90b2NvbAorICAgIGVuY29kaW5nIGNhbiBoYXBwZW4gaWYgdGhlIGZhc3RiaW5hcnkgbW9kdWxlIGRvZXNuJ3Qgd29yayBmb3Igc29tZQorICAgIHJlYXNvbi4KKyAgICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHBhc3MgZmFsbGJhY2s9RmFsc2UgY29uc3RydWN0b3IgYXJndW1lbnQuCisKKyAgICBJbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQyBtb2R1bGUsIGp1c3QgdXNlCisgICAgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkIGluc3RlYWQgb2YgVENvbXBhY3RQcm90b2NvbC4KKyAgICAiIiIKICAgICBwYXNzCiAKLSAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKLSAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbCh0cmFucykKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZmFsbGJhY2sgPSBrd2FyZ3MucG9wKCdmYWxsYmFjaycsIFRydWUpCisgICAgICAgIHN1cGVyKFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgZmFzdGJpbmFyeQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiBub3QgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gZmFzdGJpbmFyeS5kZWNvZGVfY29tcGFjdAorICAgICAgICAgICAgc2VsZi5fZmFzdF9lbmNvZGUgPSBmYXN0YmluYXJ5LmVuY29kZV9jb21wYWN0CisKKworY2xhc3MgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCA9IHN0cmluZ19sZW5ndGhfbGltaXQKKyAgICAgICAgc2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gY29udGFpbmVyX2xlbmd0aF9saW1pdAorICAgICAgICBzZWxmLl9mYWxsYmFjayA9IGZhbGxiYWNrCisKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkKAorICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICBzdHJpbmdfbGVuZ3RoX2xpbWl0PXNlbGYuc3RyaW5nX2xlbmd0aF9saW1pdCwKKyAgICAgICAgICAgIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQ9c2VsZi5jb250YWluZXJfbGVuZ3RoX2xpbWl0LAorICAgICAgICAgICAgZmFsbGJhY2s9c2VsZi5fZmFsbGJhY2spCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyN2E3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5weQpAQCAtMCwwICsxLDIyNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24KK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5USGVhZGVyVHJhbnNwb3J0IGltcG9ydCBUSGVhZGVyVHJhbnNwb3J0LCBUSGVhZGVyU3VicHJvdG9jb2xJRCwgVEhlYWRlckNsaWVudFR5cGUKKworCitQUk9UT0NPTFNfQllfSUQgPSB7CisgICAgVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZOiBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5DT01QQUNUOiBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQsCit9CisKKworY2xhc3MgVEhlYWRlclByb3RvY29sKFRQcm90b2NvbEJhc2UpOgorICAgICIiIkEgZnJhbWVkIHByb3RvY29sIHdpdGggaGVhZGVycyBhbmQgcGF5bG9hZCB0cmFuc2Zvcm1zLgorCisgICAgVEhlYWRlclByb3RvY29sIGZyYW1lcyBvdGhlciBUaHJpZnQgcHJvdG9jb2xzIGFuZCBhZGRzIHN1cHBvcnQgZm9yIG9wdGlvbmFsCisgICAgb3V0LW9mLWJhbmQgaGVhZGVycy4gVGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgc3VicHJvdG9jb2xzIGFyZQorICAgIFRCaW5hcnlQcm90b2NvbCBhbmQgVENvbXBhY3RQcm90b2NvbC4KKworICAgIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBhcHBseSB0cmFuc2Zvcm1zIHRvIHRoZSBlbmNvZGVkIG1lc3NhZ2UgcGF5bG9hZC4gVGhlCisgICAgb25seSB0cmFuc2Zvcm0gY3VycmVudGx5IHN1cHBvcnRlZCBpcyB0byBnemlwLgorCisgICAgV2hlbiB1c2VkIGluIGEgc2VydmVyLCBUSGVhZGVyUHJvdG9jb2wgY2FuIGFjY2VwdCBtZXNzYWdlcyBmcm9tCisgICAgbm9uLVRIZWFkZXJQcm90b2NvbCBjbGllbnRzIGlmIGFsbG93ZWQgKHNlZSBgYWxsb3dlZF9jbGllbnRfdHlwZXNgKS4gVGhpcworICAgIGluY2x1ZGVzIGZyYW1lZCBhbmQgdW5mcmFtZWQgdHJhbnNwb3J0cyBhbmQgYm90aCBUQmluYXJ5UHJvdG9jb2wgYW5kCisgICAgVENvbXBhY3RQcm90b2NvbC4gVGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxlY3QgZm9yCisgICAgdGhlIGNvbm5lY3RlZCBjbGllbnQuIEhUVFAgY2xpZW50cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgVEhUVFBTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwKKyAgICBvciBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuCisKKyAgICBTZWUgZG9jL3NwZWNzL0hlYWRlckZvcm1hdC5tZCBmb3IgZGV0YWlscyBvZiB0aGUgd2lyZSBmb3JtYXQuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKToKKyAgICAgICAgIyBtdWNoIG9mIHRoZSBhY3R1YWwgd29yayBmb3IgVEhlYWRlclByb3RvY29sIGhhcHBlbnMgZG93biBpbgorICAgICAgICAjIFRIZWFkZXJUcmFuc3BvcnQgc2luY2Ugd2UgbmVlZCB0byBkbyBsb3ctbGV2ZWwgc2hlbmFuaWdhbnMgdG8gZGV0ZWN0CisgICAgICAgICMgaWYgdGhlIGNsaWVudCBpcyBzZW5kaW5nIHVzIGhlYWRlcnMgb3Igb25lIG9mIHRoZSBoZWFkZXJsZXNzIGZvcm1hdHMKKyAgICAgICAgIyB3ZSBzdXBwb3J0LiB0aGlzIHdyYXBzIHRoZSByZWFsIHRyYW5zcG9ydCB3aXRoIHRoZSBvbmUgdGhhdCBkb2VzIGFsbAorICAgICAgICAjIHRoZSBtYWdpYy4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodHJhbnNwb3J0LCBUSGVhZGVyVHJhbnNwb3J0KToKKyAgICAgICAgICAgIHRyYW5zcG9ydCA9IFRIZWFkZXJUcmFuc3BvcnQodHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcykKKyAgICAgICAgc3VwZXIoVEhlYWRlclByb3RvY29sLCBzZWxmKS5fX2luaXRfXyh0cmFuc3BvcnQpCisgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisKKyAgICBkZWYgZ2V0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zLmdldF9oZWFkZXJzKCkKKworICAgIGRlZiBzZXRfaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLnRyYW5zLnNldF9oZWFkZXIoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBjbGVhcl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zLmNsZWFyX2hlYWRlcnMoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgc2VsZi50cmFucy5hZGRfdHJhbnNmb3JtKHRyYW5zZm9ybV9pZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnRyYW5zLnNlcXVlbmNlX2lkID0gc2VxaWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWUsIHR0eXBlLCBzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWUpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWUsIHR0eXBlLCBmaWQpCisKKyAgICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRmllbGRFbmQoKQorCisgICAgZGVmIHdyaXRlRmllbGRTdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZFN0b3AoKQorCisgICAgZGVmIHdyaXRlTWFwQmVnaW4oc2VsZiwga3R5cGUsIHZ0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWFwQmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTGlzdEVuZCgpCisKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEJlZ2luKGV0eXBlLCBzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVTZXRFbmQoKQorCisgICAgZGVmIHdyaXRlQm9vbChzZWxmLCBib29sX3ZhbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJvb2woYm9vbF92YWwpCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCeXRlKGJ5dGUpCisKKyAgICBkZWYgd3JpdGVJMTYoc2VsZiwgaTE2KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTE2KGkxNikKKworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMzIoaTMyKQorCisgICAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUk2NChpNjQpCisKKyAgICBkZWYgd3JpdGVEb3VibGUoc2VsZiwgZHViKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlRG91YmxlKGR1YikKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQmluYXJ5KHN0cl92YWwpCisKKyAgICBkZWYgX3NldF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvdG9jb2xfY2xzID0gUFJPVE9DT0xTX0JZX0lEW3NlbGYudHJhbnMucHJvdG9jb2xfaWRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9QUk9UT0NPTCwKKyAgICAgICAgICAgICAgICAiVW5rbm93biBwcm90b2NvbCByZXF1ZXN0ZWQuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl9wcm90b2NvbCA9IHByb3RvY29sX2NscyhzZWxmLnRyYW5zKQorICAgICAgICBzZWxmLl9mYXN0X2VuY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2VuY29kZQorICAgICAgICBzZWxmLl9mYXN0X2RlY29kZSA9IHNlbGYuX3Byb3RvY29sLl9mYXN0X2RlY29kZQorCisgICAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudHJhbnMucmVhZEZyYW1lKDApCisgICAgICAgICAgICBzZWxmLl9zZXRfcHJvdG9jb2woKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKGIiIiwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgMCkKKyAgICAgICAgICAgIGV4Yy53cml0ZShzZWxmLl9wcm90b2NvbCkKKyAgICAgICAgICAgIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisgICAgICAgICAgICBzZWxmLnRyYW5zLmZsdXNoKCkKKworICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKworICAgIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwQmVnaW4oKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWFwRW5kKCkKKworICAgIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZExpc3RCZWdpbigpCisKKyAgICBkZWYgcmVhZExpc3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEVuZCgpCisKKyAgICBkZWYgcmVhZFNldEJlZ2luKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEJlZ2luKCkKKworICAgIGRlZiByZWFkU2V0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZFNldEVuZCgpCisKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQm9vbCgpCisKKyAgICBkZWYgcmVhZEJ5dGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQnl0ZSgpCisKKyAgICBkZWYgcmVhZEkxNihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMTYoKQorCisgICAgZGVmIHJlYWRJMzIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTMyKCkKKworICAgIGRlZiByZWFkSTY0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEk2NCgpCisKKyAgICBkZWYgcmVhZERvdWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWREb3VibGUoKQorCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkQmluYXJ5KCkKKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbG93ZWRfY2xpZW50X3R5cGVzPShUSGVhZGVyQ2xpZW50VHlwZS5IRUFERVJTLCkpOgorICAgICAgICBzZWxmLmFsbG93ZWRfY2xpZW50X3R5cGVzID0gYWxsb3dlZF9jbGllbnRfdHlwZXMKKworICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUSGVhZGVyUHJvdG9jb2wodHJhbnMsIHNlbGYuYWxsb3dlZF9jbGllbnRfdHlwZXMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RKU09OUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyMDk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5weQpAQCAtMCwwICsxLDY3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLlRQcm90b2NvbCBpbXBvcnQgKFRUeXBlLCBUUHJvdG9jb2xCYXNlLCBUUHJvdG9jb2xFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMpCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgbWF0aAoraW1wb3J0IHN5cworCitmcm9tIC4uY29tcGF0IGltcG9ydCBzdHJfdG9fYmluYXJ5CisKKworX19hbGxfXyA9IFsnVEpTT05Qcm90b2NvbCcsCisgICAgICAgICAgICdUSlNPTlByb3RvY29sRmFjdG9yeScsCisgICAgICAgICAgICdUU2ltcGxlSlNPTlByb3RvY29sJywKKyAgICAgICAgICAgJ1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5J10KKworVkVSU0lPTiA9IDEKKworQ09NTUEgPSBiJywnCitDT0xPTiA9IGInOicKK0xCUkFDRSA9IGIneycKK1JCUkFDRSA9IGInfScKK0xCUkFDS0VUID0gYidbJworUkJSQUNLRVQgPSBiJ10nCitRVU9URSA9IGInIicKK0JBQ0tTTEFTSCA9IGInXFwnCitaRVJPID0gYicwJworCitFU0NTRVEwID0gb3JkKCdcXCcpCitFU0NTRVExID0gb3JkKCd1JykKK0VTQ0FQRV9DSEFSX1ZBTFMgPSB7CisgICAgJyInOiAnXFwiJywKKyAgICAnXFwnOiAnXFxcXCcsCisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1x0JzogJ1xcdCcsCisgICAgIyAnLyc6ICdcXC8nLAorfQorRVNDQVBFX0NIQVJTID0geworICAgIGInIic6ICciJywKKyAgICBiJ1xcJzogJ1xcJywKKyAgICBiJ2InOiAnXGInLAorICAgIGInZic6ICdcZicsCisgICAgYiduJzogJ1xuJywKKyAgICBiJ3InOiAnXHInLAorICAgIGIndCc6ICdcdCcsCisgICAgYicvJzogJy8nLAorfQorTlVNRVJJQ19DSEFSID0gYicrLS4wMTIzNDU2Nzg5RWUnCisKK0NUWVBFUyA9IHsKKyAgICBUVHlwZS5CT09MOiAndGYnLAorICAgIFRUeXBlLkJZVEU6ICdpOCcsCisgICAgVFR5cGUuSTE2OiAnaTE2JywKKyAgICBUVHlwZS5JMzI6ICdpMzInLAorICAgIFRUeXBlLkk2NDogJ2k2NCcsCisgICAgVFR5cGUuRE9VQkxFOiAnZGJsJywKKyAgICBUVHlwZS5TVFJJTkc6ICdzdHInLAorICAgIFRUeXBlLlNUUlVDVDogJ3JlYycsCisgICAgVFR5cGUuTElTVDogJ2xzdCcsCisgICAgVFR5cGUuU0VUOiAnc2V0JywKKyAgICBUVHlwZS5NQVA6ICdtYXAnLAorfQorCitKVFlQRVMgPSB7fQorZm9yIGtleSBpbiBDVFlQRVMua2V5cygpOgorICAgIEpUWVBFU1tDVFlQRVNba2V5XV0gPSBrZXkKKworCitjbGFzcyBKU09OQmFzZUNvbnRleHQob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLmZpcnN0ID0gVHJ1ZQorCisgICAgZGVmIGRvSU8oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd3JpdGUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworCitjbGFzcyBKU09OTGlzdENvbnRleHQoSlNPTkJhc2VDb250ZXh0KToKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdCBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5maXJzdCA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdW5jdGlvbihDT01NQSkKKworICAgIGRlZiB3cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wudHJhbnMud3JpdGUpCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5kb0lPKHNlbGYucHJvdG9jb2wucmVhZEpTT05TeW50YXhDaGFyKQorCisKK2NsYXNzIEpTT05QYWlyQ29udGV4dChKU09OQmFzZUNvbnRleHQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgc3VwZXIoSlNPTlBhaXJDb250ZXh0LCBzZWxmKS5fX2luaXRfXyhwcm90b2NvbCkKKyAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKworICAgIGRlZiBkb0lPKHNlbGYsIGZ1bmN0aW9uKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvbiA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bmN0aW9uKENPTE9OIGlmIHNlbGYuY29sb24gZWxzZSBDT01NQSkKKyAgICAgICAgICAgIHNlbGYuY29sb24gPSBub3Qgc2VsZi5jb2xvbgorCisgICAgZGVmIHdyaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC50cmFucy53cml0ZSkKKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmRvSU8oc2VsZi5wcm90b2NvbC5yZWFkSlNPTlN5bnRheENoYXIpCisKKyAgICBkZWYgZXNjYXBlTnVtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2xvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJXMsIGNvbG9uPSVzJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5jb2xvbikKKworCitjbGFzcyBMb29rYWhlYWRSZWFkZXIoKToKKyAgICBoYXNEYXRhID0gRmFsc2UKKyAgICBkYXRhID0gJycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzRGF0YSBpcyBUcnVlOgorICAgICAgICAgICAgc2VsZi5oYXNEYXRhID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYucHJvdG9jb2wudHJhbnMucmVhZCgxKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisKKyAgICBkZWYgcGVlayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oYXNEYXRhIGlzIEZhbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5wcm90b2NvbC50cmFucy5yZWFkKDEpCisgICAgICAgIHNlbGYuaGFzRGF0YSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorCisKK2NsYXNzIFRKU09OUHJvdG9jb2xCYXNlKFRQcm90b2NvbEJhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKKyAgICAgICAgVFByb3RvY29sQmFzZS5fX2luaXRfXyhzZWxmLCB0cmFucykKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVzZXRSZWFkQ29udGV4dCgpCisKKyAgICAjIFdlIGRvbid0IGhhdmUgbGVuZ3RoIGxpbWl0IGltcGxlbWVudGF0aW9uIGZvciBKU09OIHByb3RvY29scworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVzZXRXcml0ZUNvbnRleHQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorICAgICAgICBzZWxmLmNvbnRleHRTdGFjayA9IFtzZWxmLmNvbnRleHRdCisKKyAgICBkZWYgcmVzZXRSZWFkQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFdyaXRlQ29udGV4dCgpCisgICAgICAgIHNlbGYucmVhZGVyID0gTG9va2FoZWFkUmVhZGVyKHNlbGYpCisKKyAgICBkZWYgcHVzaENvbnRleHQoc2VsZiwgY3R4KToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2suYXBwZW5kKGN0eCkKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gY3R4CisKKyAgICBkZWYgcG9wQ29udGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0U3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0U3RhY2s6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBzZWxmLmNvbnRleHRTdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IEpTT05CYXNlQ29udGV4dChzZWxmKQorCisgICAgZGVmIHdyaXRlSlNPTlN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLmNvbnRleHQud3JpdGUoKQorICAgICAgICBqc29uX3N0ciA9IFsnIiddCisgICAgICAgIGZvciBzIGluIHN0cmluZzoKKyAgICAgICAgICAgIGVzY2FwZWQgPSBFU0NBUEVfQ0hBUl9WQUxTLmdldChzLCBzKQorICAgICAgICAgICAganNvbl9zdHIuYXBwZW5kKGVzY2FwZWQpCisgICAgICAgIGpzb25fc3RyLmFwcGVuZCgnIicpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoc3RyX3RvX2JpbmFyeSgnJy5qb2luKGpzb25fc3RyKSkpCisKKyAgICBkZWYgd3JpdGVKU09OTnVtYmVyKHNlbGYsIG51bWJlciwgZm9ybWF0dGVyPSd7MH0nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAganNOdW1iZXIgPSBzdHIoZm9ybWF0dGVyLmZvcm1hdChudW1iZXIpKS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgICAgIHNlbGYudHJhbnMud3JpdGUoanNOdW1iZXIpCisgICAgICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFFVT1RFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50cmFucy53cml0ZShqc051bWJlcikKKworICAgIGRlZiB3cml0ZUpTT05CYXNlNjQoc2VsZiwgYmluYXJ5KToKKyAgICAgICAgc2VsZi5jb250ZXh0LndyaXRlKCkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShRVU9URSkKKyAgICAgICAgc2VsZi50cmFucy53cml0ZShiYXNlNjQuYjY0ZW5jb2RlKGJpbmFyeSkpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUVVPVEUpCisKKyAgICBkZWYgd3JpdGVKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiB3cml0ZUpTT05PYmplY3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoUkJSQUNFKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC53cml0ZSgpCisgICAgICAgIHNlbGYudHJhbnMud3JpdGUoTEJSQUNLRVQpCisgICAgICAgIHNlbGYucHVzaENvbnRleHQoSlNPTkxpc3RDb250ZXh0KHNlbGYpKQorCisgICAgZGVmIHdyaXRlSlNPTkFycmF5RW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorICAgICAgICBzZWxmLnRyYW5zLndyaXRlKFJCUkFDS0VUKQorCisgICAgZGVmIHJlYWRKU09OU3ludGF4Q2hhcihzZWxmLCBjaGFyYWN0ZXIpOgorICAgICAgICBjdXJyZW50ID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgIGlmIGNoYXJhY3RlciAhPSBjdXJyZW50OgorICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAlcyIgJSBjdXJyZW50KQorCisgICAgZGVmIF9pc0hpZ2hTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkODAwIGFuZCBjb2RldW5pdCA8PSAweGRiZmYKKworICAgIGRlZiBfaXNMb3dTdXJyb2dhdGUoc2VsZiwgY29kZXVuaXQpOgorICAgICAgICByZXR1cm4gY29kZXVuaXQgPj0gMHhkYzAwIGFuZCBjb2RldW5pdCA8PSAweGRmZmYKKworICAgIGRlZiBfdG9DaGFyKHNlbGYsIGhpZ2gsIGxvdz1Ob25lKToKKyAgICAgICAgaWYgbm90IGxvdzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJcXHUlMDR4IiAlIGhpZ2gpLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihoaWdoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZXBvaW50ID0gKDEgPDwgMTYpICsgKChoaWdoICYgMHgzZmYpIDw8IDEwKQorICAgICAgICAgICAgY29kZXBvaW50ICs9IGxvdyAmIDB4M2ZmCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICAgICAgcyA9ICJcXFUlMDh4IiAlIGNvZGVwb2ludAorICAgICAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgndW5pY29kZS1lc2NhcGUnKS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihjb2RlcG9pbnQpCisKKyAgICBkZWYgcmVhZEpTT05TdHJpbmcoc2VsZiwgc2tpcENvbnRleHQpOgorICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICBzdHJpbmcgPSBbXQorICAgICAgICBpZiBza2lwQ29udGV4dCBpcyBGYWxzZToKKyAgICAgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgIGlmIGNoYXJhY3RlciA9PSBRVU9URToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgb3JkKGNoYXJhY3RlcikgPT0gRVNDU0VRMDoKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiBvcmQoY2hhcmFjdGVyKSA9PSBFU0NTRVExOgorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLnRyYW5zLnJlYWQoNCkuZGVjb2RlKCdhc2NpaScpCisgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0ID0gaW50KGNoYXJhY3RlciwgMTYpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzSGlnaFN1cnJvZ2F0ZShjb2RldW5pdCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoaWdoU3Vycm9nYXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gY29kZXVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5faXNMb3dTdXJyb2dhdGUoY29kZXVuaXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGhpZ2hTdXJyb2dhdGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaGlnaCBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSBzZWxmLl90b0NoYXIoaGlnaFN1cnJvZ2F0ZSwgY29kZXVuaXQpCisgICAgICAgICAgICAgICAgICAgICAgICBoaWdoU3Vycm9nYXRlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyID0gc2VsZi5fdG9DaGFyKGNvZGV1bml0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXJhY3RlciBub3QgaW4gRVNDQVBFX0NIQVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IEVTQ0FQRV9DSEFSU1tjaGFyYWN0ZXJdCisgICAgICAgICAgICBlbGlmIGNoYXJhY3RlciBpbiBFU0NBUEVfQ0hBUl9WQUxTOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5lc2NhcGVkIGNvbnRyb2wgY2hhciIpCisgICAgICAgICAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPiAyOgorICAgICAgICAgICAgICAgIHV0ZjhfYnl0ZXMgPSBieXRlYXJyYXkoW29yZChjaGFyYWN0ZXIpXSkKKyAgICAgICAgICAgICAgICB3aGlsZSBvcmQoc2VsZi5yZWFkZXIucGVlaygpKSA+PSAweDgwOgorICAgICAgICAgICAgICAgICAgICB1dGY4X2J5dGVzLmFwcGVuZChvcmQoc2VsZi5yZWFkZXIucmVhZCgpKSkKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB1dGY4X2J5dGVzLmRlY29kZSgndXRmOCcpCisgICAgICAgICAgICBzdHJpbmcuYXBwZW5kKGNoYXJhY3RlcikKKworICAgICAgICAgICAgaWYgaGlnaFN1cnJvZ2F0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpCisgICAgICAgIHJldHVybiAnJy5qb2luKHN0cmluZykKKworICAgIGRlZiBpc0pTT05OdW1lcmljKHNlbGYsIGNoYXJhY3Rlcik6CisgICAgICAgIHJldHVybiAoVHJ1ZSBpZiBOVU1FUklDX0NIQVIuZmluZChjaGFyYWN0ZXIpICE9IC0gMSBlbHNlIEZhbHNlKQorCisgICAgZGVmIHJlYWRKU09OUXVvdGVzKHNlbGYpOgorICAgICAgICBpZiAoc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpKToKKyAgICAgICAgICAgIHNlbGYucmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKQorCisgICAgZGVmIHJlYWRKU09OTnVtZXJpY0NoYXJzKHNlbGYpOgorICAgICAgICBudW1lcmljID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICAgICAgaWYgc2VsZi5pc0pTT05OdW1lcmljKGNoYXJhY3RlcikgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG51bWVyaWMuYXBwZW5kKHNlbGYucmVhZGVyLnJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGInJy5qb2luKG51bWVyaWMpLmRlY29kZSgnYXNjaWknKQorCisgICAgZGVmIHJlYWRKU09OSW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgbnVtZXJpYyA9IHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICBzZWxmLnJlYWRKU09OUXVvdGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGludChudW1lcmljKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZGF0YSBlbmNvdW50ZWQgaW4gbnVtZXJpYyBkYXRhIikKKworICAgIGRlZiByZWFkSlNPTkRvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBpZiBzZWxmLnJlYWRlci5wZWVrKCkgPT0gUVVPVEU6CisgICAgICAgICAgICBzdHJpbmcgPSBzZWxmLnJlYWRKU09OU3RyaW5nKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZG91YmxlID0gZmxvYXQoc3RyaW5nKQorICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbnRleHQuZXNjYXBlTnVtIGlzIEZhbHNlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1hdGguaXNpbmYoZG91YmxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtYXRoLmlzbmFuKGRvdWJsZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZXh0LmVzY2FwZU51bSgpIGlzIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYucmVhZEpTT05OdW1lcmljQ2hhcnMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpCisKKyAgICBkZWYgcmVhZEpTT05CYXNlNjQoc2VsZik6CisgICAgICAgIHN0cmluZyA9IHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisgICAgICAgIHNpemUgPSBsZW4oc3RyaW5nKQorICAgICAgICBtID0gc2l6ZSAlIDQKKyAgICAgICAgIyBGb3JjZSBwYWRkaW5nIHNpbmNlIGI2NGVuY29kZSBtZXRob2QgZG9lcyBub3QgYWxsb3cgaXQKKyAgICAgICAgaWYgbSAhPSAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCAtIG0pOgorICAgICAgICAgICAgICAgIHN0cmluZyArPSAnPScKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5iNjRkZWNvZGUoc3RyaW5nKQorCisgICAgZGVmIHJlYWRKU09OT2JqZWN0U3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoTEJSQUNFKQorICAgICAgICBzZWxmLnB1c2hDb250ZXh0KEpTT05QYWlyQ29udGV4dChzZWxmKSkKKworICAgIGRlZiByZWFkSlNPTk9iamVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNFKQorICAgICAgICBzZWxmLnBvcENvbnRleHQoKQorCisgICAgZGVmIHJlYWRKU09OQXJyYXlTdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJlYWQoKQorICAgICAgICBzZWxmLnJlYWRKU09OU3ludGF4Q2hhcihMQlJBQ0tFVCkKKyAgICAgICAgc2VsZi5wdXNoQ29udGV4dChKU09OTGlzdENvbnRleHQoc2VsZikpCisKKyAgICBkZWYgcmVhZEpTT05BcnJheUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTlN5bnRheENoYXIoUkJSQUNLRVQpCisgICAgICAgIHNlbGYucG9wQ29udGV4dCgpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldFJlYWRDb250ZXh0KCkKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBpZiBzZWxmLnJlYWRKU09OSW50ZWdlcigpICE9IFZFUlNJT046CisgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSkKKyAgICAgICAgdHlwZW4gPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlcWlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICByZXR1cm4gKG5hbWUsIHR5cGVuLCBzZXFpZCkKKworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgcmVhZEZpZWxkQmVnaW4oc2VsZik6CisgICAgICAgIGNoYXJhY3RlciA9IHNlbGYucmVhZGVyLnBlZWsoKQorICAgICAgICB0dHlwZSA9IDAKKyAgICAgICAgaWQgPSAwCisgICAgICAgIGlmIGNoYXJhY3RlciA9PSBSQlJBQ0U6CisgICAgICAgICAgICB0dHlwZSA9IFRUeXBlLlNUT1AKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlkID0gc2VsZi5yZWFkSlNPTkludGVnZXIoKQorICAgICAgICAgICAgc2VsZi5yZWFkSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgICAgIHR0eXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICByZXR1cm4gKE5vbmUsIHR0eXBlLCBpZCkKKworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBrZXlUeXBlID0gSlRZUEVTW3NlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpXQorICAgICAgICB2YWx1ZVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgICAgIHJldHVybiAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKQorCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05PYmplY3RFbmQoKQorICAgICAgICBzZWxmLnJlYWRKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHJlYWRDb2xsZWN0aW9uQmVnaW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgZWxlbVR5cGUgPSBKVFlQRVNbc2VsZi5yZWFkSlNPTlN0cmluZyhGYWxzZSldCisgICAgICAgIHNpemUgPSBzZWxmLnJlYWRKU09OSW50ZWdlcigpCisgICAgICAgIHJldHVybiAoZWxlbVR5cGUsIHNpemUpCisgICAgcmVhZExpc3RCZWdpbiA9IHJlYWRDb2xsZWN0aW9uQmVnaW4KKyAgICByZWFkU2V0QmVnaW4gPSByZWFkQ29sbGVjdGlvbkJlZ2luCisKKyAgICBkZWYgcmVhZENvbGxlY3Rpb25FbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZEpTT05BcnJheUVuZCgpCisgICAgcmVhZFNldEVuZCA9IHJlYWRDb2xsZWN0aW9uRW5kCisgICAgcmVhZExpc3RFbmQgPSByZWFkQ29sbGVjdGlvbkVuZAorCisgICAgZGVmIHJlYWRCb29sKHNlbGYpOgorICAgICAgICByZXR1cm4gKEZhbHNlIGlmIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkgPT0gMCBlbHNlIFRydWUpCisKKyAgICBkZWYgcmVhZE51bWJlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05JbnRlZ2VyKCkKKyAgICByZWFkQnl0ZSA9IHJlYWROdW1iZXIKKyAgICByZWFkSTE2ID0gcmVhZE51bWJlcgorICAgIHJlYWRJMzIgPSByZWFkTnVtYmVyCisgICAgcmVhZEk2NCA9IHJlYWROdW1iZXIKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkSlNPTkRvdWJsZSgpCisKKyAgICBkZWYgcmVhZFN0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05TdHJpbmcoRmFsc2UpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZEpTT05CYXNlNjQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHJlcXVlc3RfdHlwZSwgc2VxaWQpOgorICAgICAgICBzZWxmLnJlc2V0V3JpdGVDb250ZXh0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoVkVSU0lPTikKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcobmFtZSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIocmVxdWVzdF90eXBlKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzZXFpZCkKKworICAgIGRlZiB3cml0ZU1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBpZCk6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGlkKQorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdFN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW3R0eXBlXSkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlTdGFydCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1trdHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKENUWVBFU1t2dHlwZV0pCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKHNpemUpCisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlTGlzdEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoQ1RZUEVTW2V0eXBlXSkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoc2l6ZSkKKworICAgIGRlZiB3cml0ZUxpc3RFbmQoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVKU09OQXJyYXlFbmQoKQorCisgICAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhDVFlQRVNbZXR5cGVdKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihzaXplKQorCisgICAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhieXRlLCA4KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihieXRlKQorCisgICAgZGVmIHdyaXRlSTE2KHNlbGYsIGkxNik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMTYsIDE2KQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMTYpCisKKyAgICBkZWYgd3JpdGVJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGkzMiwgMzIpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGkzMikKKworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTY0LCA2NCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTY0KQorCisgICAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGRibCk6CisgICAgICAgICMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIHNob3VsZCBiZSBqdXN0IGVub3VnaCBmb3IgYW55IGRvdWJsZSBwcmVjaXNpb24KKyAgICAgICAgIyB2YWx1ZS4KKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoZGJsLCAnezA6LjE3Z30nKQorCisgICAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHNlbGYud3JpdGVKU09OU3RyaW5nKHN0cmluZykKKworICAgIGRlZiB3cml0ZUJpbmFyeShzZWxmLCBiaW5hcnkpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkJhc2U2NChiaW5hcnkpCisKKworY2xhc3MgVEpTT05Qcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgZ2V0UHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbCh0cmFucykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzdHJpbmdfbGVuZ3RoX2xpbWl0KHNlbmYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbnRhaW5lcl9sZW5ndGhfbGltaXQoc2VuZik6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbChUSlNPTlByb3RvY29sQmFzZSk6CisgICAgIiIiU2ltcGxlLCByZWFkYWJsZSwgd3JpdGUtb25seSBKU09OIHByb3RvY29sLgorCisgICAgVXNlZnVsIGZvciBpbnRlcmFjdGluZyB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZXMuCisgICAgIiIiCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VFbmQoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgcmVhZFN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgcmVxdWVzdF90eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYucmVzZXRXcml0ZUNvbnRleHQoKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdyaXRlU3RydWN0QmVnaW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZEJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBmaWQpOgorICAgICAgICBzZWxmLndyaXRlSlNPTlN0cmluZyhuYW1lKQorCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OT2JqZWN0U3RhcnQoKQorCisgICAgZGVmIHdyaXRlTWFwRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk9iamVjdEVuZCgpCisKKyAgICBkZWYgX3dyaXRlQ29sbGVjdGlvbkJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05BcnJheVN0YXJ0KCkKKworICAgIGRlZiBfd3JpdGVDb2xsZWN0aW9uRW5kKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB3cml0ZUxpc3RCZWdpbiA9IF93cml0ZUNvbGxlY3Rpb25CZWdpbgorICAgIHdyaXRlTGlzdEVuZCA9IF93cml0ZUNvbGxlY3Rpb25FbmQKKyAgICB3cml0ZVNldEJlZ2luID0gX3dyaXRlQ29sbGVjdGlvbkJlZ2luCisgICAgd3JpdGVTZXRFbmQgPSBfd3JpdGVDb2xsZWN0aW9uRW5kCisKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoYnl0ZSwgOCkKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBjaGVja0ludGVnZXJMaW1pdHMoaTE2LCAxNikKKyAgICAgICAgc2VsZi53cml0ZUpTT05OdW1iZXIoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIGNoZWNrSW50ZWdlckxpbWl0cyhpMzIsIDMyKQorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgY2hlY2tJbnRlZ2VyTGltaXRzKGk2NCwgNjQpCisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKGk2NCkKKworICAgIGRlZiB3cml0ZUJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIHNlbGYud3JpdGVKU09OTnVtYmVyKDEgaWYgYm9vbGVhbiBpcyBUcnVlIGVsc2UgMCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkYmwpOgorICAgICAgICBzZWxmLndyaXRlSlNPTk51bWJlcihkYmwpCisKKyAgICBkZWYgd3JpdGVTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi53cml0ZUpTT05TdHJpbmcoc3RyaW5nKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIGJpbmFyeSk6CisgICAgICAgIHNlbGYud3JpdGVKU09OQmFzZTY0KGJpbmFyeSkKKworCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeShvYmplY3QpOgorCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjgzOTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUTWVzc2FnZVR5cGUKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUUHJvdG9jb2xEZWNvcmF0b3IKKworU0VQQVJBVE9SID0gIjoiCisKKworY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2woVFByb3RvY29sRGVjb3JhdG9yLlRQcm90b2NvbERlY29yYXRvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sLCBzZXJ2aWNlTmFtZSk6CisgICAgICAgIHNlbGYuc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR5cGUsIHNlcWlkKToKKyAgICAgICAgaWYgKHR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwgb3IKKyAgICAgICAgICAgICAgICB0eXBlID09IFRNZXNzYWdlVHlwZS5PTkVXQVkpOgorICAgICAgICAgICAgc3VwZXIoVE11bHRpcGxleGVkUHJvdG9jb2wsIHNlbGYpLndyaXRlTWVzc2FnZUJlZ2luKAorICAgICAgICAgICAgICAgIHNlbGYuc2VydmljZU5hbWUgKyBTRVBBUkFUT1IgKyBuYW1lLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgc2VxaWQKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKaW5kZXggNTE3NzIyOS4uODMxNGNmNiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKQEAgLTE3LDM5MCArMTcsNDA0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0ICoKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEV4Y2VwdGlvbiwgVFR5cGUsIFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorZnJvbSAuLmNvbXBhdCBpbXBvcnQgYmluYXJ5X3RvX3N0ciwgc3RyX3RvX2JpbmFyeQorCitpbXBvcnQgc2l4CitpbXBvcnQgc3lzCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgemlwCiAKIAogY2xhc3MgVFByb3RvY29sRXhjZXB0aW9uKFRFeGNlcHRpb24pOgotICAiIiJDdXN0b20gUHJvdG9jb2wgRXhjZXB0aW9uIGNsYXNzIiIiCisgICAgIiIiQ3VzdG9tIFByb3RvY29sIEV4Y2VwdGlvbiBjbGFzcyIiIgogCi0gIFVOS05PV04gPSAwCi0gIElOVkFMSURfREFUQSA9IDEKLSAgTkVHQVRJVkVfU0laRSA9IDIKLSAgU0laRV9MSU1JVCA9IDMKLSAgQkFEX1ZFUlNJT04gPSA0CisgICAgVU5LTk9XTiA9IDAKKyAgICBJTlZBTElEX0RBVEEgPSAxCisgICAgTkVHQVRJVkVfU0laRSA9IDIKKyAgICBTSVpFX0xJTUlUID0gMworICAgIEJBRF9WRVJTSU9OID0gNAorICAgIE5PVF9JTVBMRU1FTlRFRCA9IDUKKyAgICBERVBUSF9MSU1JVCA9IDYKKyAgICBJTlZBTElEX1BST1RPQ09MID0gNwogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAogCi1jbGFzcyBUUHJvdG9jb2xCYXNlOgotICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgcHJvdG9jb2wgZHJpdmVyLiIiIgorY2xhc3MgVFByb3RvY29sQmFzZShvYmplY3QpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRocmlmdCBwcm90b2NvbCBkcml2ZXIuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zKToKLSAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMpOgorICAgICAgICBzZWxmLnRyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fZmFzdF9kZWNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gTm9uZQogCi0gIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6Ci0gICAgcGFzcworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2NoZWNrX2xlbmd0aChsaW1pdCwgbGVuZ3RoKToKKyAgICAgICAgaWYgbGVuZ3RoIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5ORUdBVElWRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTmVnYXRpdmUgbGVuZ3RoOiAlZCcgJSBsZW5ndGgpCisgICAgICAgIGlmIGxpbWl0IGlzIG5vdCBOb25lIGFuZCBsZW5ndGggPiBsaW1pdDoKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGVuZ3RoIGV4Y2VlZGVkIG1heCBhbGxvd2VkOiAlZCcgJSBsaW1pdCkKIAotICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIHNlcWlkKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZVN0cnVjdEJlZ2luKHNlbGYsIG5hbWUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHlwZSwgaWQpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRCZWdpbihzZWxmLCBuYW1lLCB0dHlwZSwgZmlkKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUZpZWxkU3RvcChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlRmllbGRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZU1hcEJlZ2luKHNlbGYsIGt0eXBlLCB2dHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU2V0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRCZWdpbihzZWxmLCBldHlwZSwgc2l6ZSk6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2wpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xfdmFsKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGVCeXRlKHNlbGYsIGJ5dGUpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlSTY0KHNlbGYsIGk2NCk6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUkzMihzZWxmLCBpMzIpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlRG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZUk2NChzZWxmLCBpNjQpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHdyaXRlU3RyaW5nKHNlbGYsIHN0cik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNZXNzYWdlQmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiB3cml0ZVN0cmluZyhzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgc2VsZi53cml0ZUJpbmFyeShzdHJfdG9fYmluYXJ5KHN0cl92YWwpKQogCi0gIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHdyaXRlVXRmOChzZWxmLCBzdHJfdmFsKToKKyAgICAgICAgc2VsZi53cml0ZVN0cmluZyhzdHJfdmFsLmVuY29kZSgndXRmOCcpKQogCi0gIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNZXNzYWdlRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRGaWVsZEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTdHJ1Y3RCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTWFwQmVnaW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkU3RydWN0RW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRNYXBFbmQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkTGlzdEJlZ2luKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEZpZWxkRW5kKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRMaXN0RW5kKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZE1hcEJlZ2luKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRNYXBFbmQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZFNldEVuZChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEJvb2woc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQnl0ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRTZXRCZWdpbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTE2KHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZFNldEVuZChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkSTMyKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgcmVhZEJvb2woc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEk2NChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIHJlYWRCeXRlKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWREb3VibGUoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHJlYWRTdHJpbmcoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkSTMyKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIHNraXAoc2VsZiwgdHlwZSk6Ci0gICAgaWYgdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgcmV0dXJuCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLkJPT0w6Ci0gICAgICBzZWxmLnJlYWRCb29sKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuQllURToKLSAgICAgIHNlbGYucmVhZEJ5dGUoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5JMTY6Ci0gICAgICBzZWxmLnJlYWRJMTYoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICBzZWxmLnJlYWRJMzIoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5JNjQ6Ci0gICAgICBzZWxmLnJlYWRJNjQoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5ET1VCTEU6Ci0gICAgICBzZWxmLnJlYWREb3VibGUoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICBzZWxmLnJlYWRTdHJpbmcoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6Ci0gICAgICBuYW1lID0gc2VsZi5yZWFkU3RydWN0QmVnaW4oKQotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgKG5hbWUsIHR5cGUsIGlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQotICAgICAgICBpZiB0eXBlID09IFRUeXBlLlNUT1A6Ci0gICAgICAgICAgYnJlYWsKLSAgICAgICAgc2VsZi5za2lwKHR5cGUpCi0gICAgICAgIHNlbGYucmVhZEZpZWxkRW5kKCkKLSAgICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCi0gICAgZWxpZiB0eXBlID09IFRUeXBlLk1BUDoKLSAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQotICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6Ci0gICAgICAgIHNlbGYuc2tpcChrdHlwZSkKLSAgICAgICAgc2VsZi5za2lwKHZ0eXBlKQotICAgICAgc2VsZi5yZWFkTWFwRW5kKCkKLSAgICBlbGlmIHR5cGUgPT0gVFR5cGUuU0VUOgotICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKLSAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgotICAgICAgICBzZWxmLnNraXAoZXR5cGUpCi0gICAgICBzZWxmLnJlYWRTZXRFbmQoKQotICAgIGVsaWYgdHlwZSA9PSBUVHlwZS5MSVNUOgotICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZExpc3RCZWdpbigpCi0gICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKLSAgICAgICAgc2VsZi5za2lwKGV0eXBlKQotICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisgICAgZGVmIHJlYWRJNjQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICAjIHR1cGxlIG9mOiAoICdyZWFkZXIgbWV0aG9kJyBuYW1lLCBpc19jb250YWluZXIgYm9vbCwgJ3dyaXRlcl9tZXRob2QnIG5hbWUgKQotICBfVFRZUEVfSEFORExFUlMgPSAoCi0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMCBUVHlwZS5TVE9QCi0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMSBUVHlwZS5WT0lEICMgVE9ETzogaGFuZGxlIHZvaWQ/Ci0gICAgICAgKCdyZWFkQm9vbCcsICd3cml0ZUJvb2wnLCBGYWxzZSksICAjIDIgVFR5cGUuQk9PTAotICAgICAgICgncmVhZEJ5dGUnLCAgJ3dyaXRlQnl0ZScsIEZhbHNlKSwgICMgMyBUVHlwZS5CWVRFIGFuZCBJMDgKLSAgICAgICAoJ3JlYWREb3VibGUnLCAnd3JpdGVEb3VibGUnLCBGYWxzZSksICAjIDQgVFR5cGUuRE9VQkxFCi0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNSB1bmRlZmluZWQKLSAgICAgICAoJ3JlYWRJMTYnLCAnd3JpdGVJMTYnLCBGYWxzZSksICAjIDYgVFR5cGUuSTE2Ci0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgNyB1bmRlZmluZWQKLSAgICAgICAoJ3JlYWRJMzInLCAnd3JpdGVJMzInLCBGYWxzZSksICAjIDggVFR5cGUuSTMyCi0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgOSB1bmRlZmluZWQKLSAgICAgICAoJ3JlYWRJNjQnLCAnd3JpdGVJNjQnLCBGYWxzZSksICAjIDEwIFRUeXBlLkk2NAotICAgICAgICgncmVhZFN0cmluZycsICd3cml0ZVN0cmluZycsIEZhbHNlKSwgICMgMTEgVFR5cGUuU1RSSU5HIGFuZCBVVEY3Ci0gICAgICAgKCdyZWFkQ29udGFpbmVyU3RydWN0JywgJ3dyaXRlQ29udGFpbmVyU3RydWN0JywgVHJ1ZSksICAjIDEyICouU1RSVUNUCi0gICAgICAgKCdyZWFkQ29udGFpbmVyTWFwJywgJ3dyaXRlQ29udGFpbmVyTWFwJywgVHJ1ZSksICAjIDEzIFRUeXBlLk1BUAotICAgICAgICgncmVhZENvbnRhaW5lclNldCcsICd3cml0ZUNvbnRhaW5lclNldCcsIFRydWUpLCAgIyAxNCBUVHlwZS5TRVQKLSAgICAgICAoJ3JlYWRDb250YWluZXJMaXN0JywgJ3dyaXRlQ29udGFpbmVyTGlzdCcsIFRydWUpLCAgIyAxNSBUVHlwZS5MSVNUCi0gICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgMTYgVFR5cGUuVVRGOCAjIFRPRE86IGhhbmRsZSB1dGY4IHR5cGVzPwotICAgICAgIChOb25lLCBOb25lLCBGYWxzZSkgICMgMTcgVFR5cGUuVVRGMTYgIyBUT0RPOiBoYW5kbGUgdXRmMTYgdHlwZXM/Ci0gICAgICApCisgICAgZGVmIHJlYWREb3VibGUoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6Ci0gICAgdHJ5OgotICAgICAgKHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIpID0gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgZmllbGQgdHlwZSAlZCcgJSAodHR5cGUpKQotICAgIGlmIHJfaGFuZGxlciBpcyBOb25lOgotICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdJbnZhbGlkIGZpZWxkIHR5cGUgJWQnICUgKHR0eXBlKSkKLSAgICByZWFkZXIgPSBnZXRhdHRyKHNlbGYsIHJfaGFuZGxlcikKLSAgICBpZiBub3QgaXNfY29udGFpbmVyOgotICAgICAgcmV0dXJuIHJlYWRlcigpCi0gICAgcmV0dXJuIHJlYWRlcihzcGVjKQorICAgIGRlZiByZWFkU3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gYmluYXJ5X3RvX3N0cihzZWxmLnJlYWRCaW5hcnkoKSkKIAotICBkZWYgcmVhZENvbnRhaW5lckxpc3Qoc2VsZiwgc3BlYyk6Ci0gICAgcmVzdWx0cyA9IFtdCi0gICAgdHR5cGUsIHRzcGVjID0gc3BlY1swXSwgc3BlY1sxXQotICAgIHJfaGFuZGxlciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXVswXQotICAgIHJlYWRlciA9IGdldGF0dHIoc2VsZiwgcl9oYW5kbGVyKQotICAgIChsaXN0X3R5cGUsIGxpc3RfbGVuKSA9IHNlbGYucmVhZExpc3RCZWdpbigpCi0gICAgaWYgdHNwZWMgaXMgTm9uZToKLSAgICAgICMgbGlzdCB2YWx1ZXMgYXJlIHNpbXBsZSB0eXBlcwotICAgICAgZm9yIGlkeCBpbiB4cmFuZ2UobGlzdF9sZW4pOgotICAgICAgICByZXN1bHRzLmFwcGVuZChyZWFkZXIoKSkKLSAgICBlbHNlOgotICAgICAgIyB0aGlzIGlzIGxpa2UgYW4gaW5saW5lZCByZWFkRmllbGRCeVRUeXBlCi0gICAgICBjb250YWluZXJfcmVhZGVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbbGlzdF90eXBlXVswXQotICAgICAgdmFsX3JlYWRlciA9IGdldGF0dHIoc2VsZiwgY29udGFpbmVyX3JlYWRlcikKLSAgICAgIGZvciBpZHggaW4geHJhbmdlKGxpc3RfbGVuKToKLSAgICAgICAgdmFsID0gdmFsX3JlYWRlcih0c3BlYykKLSAgICAgICAgcmVzdWx0cy5hcHBlbmQodmFsKQotICAgIHNlbGYucmVhZExpc3RFbmQoKQotICAgIHJldHVybiByZXN1bHRzCisgICAgZGVmIHJlYWRCaW5hcnkoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZENvbnRhaW5lclNldChzZWxmLCBzcGVjKToKLSAgICByZXN1bHRzID0gc2V0KCkKLSAgICB0dHlwZSwgdHNwZWMgPSBzcGVjWzBdLCBzcGVjWzFdCi0gICAgcl9oYW5kbGVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdWzBdCi0gICAgcmVhZGVyID0gZ2V0YXR0cihzZWxmLCByX2hhbmRsZXIpCi0gICAgKHNldF90eXBlLCBzZXRfbGVuKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKLSAgICBpZiB0c3BlYyBpcyBOb25lOgotICAgICAgIyBzZXQgbWVtYmVycyBhcmUgc2ltcGxlIHR5cGVzCi0gICAgICBmb3IgaWR4IGluIHhyYW5nZShzZXRfbGVuKToKLSAgICAgICAgcmVzdWx0cy5hZGQocmVhZGVyKCkpCi0gICAgZWxzZToKLSAgICAgIGNvbnRhaW5lcl9yZWFkZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzZXRfdHlwZV1bMF0KLSAgICAgIHZhbF9yZWFkZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnRhaW5lcl9yZWFkZXIpCi0gICAgICBmb3IgaWR4IGluIHhyYW5nZShzZXRfbGVuKToKLSAgICAgICAgcmVzdWx0cy5hZGQodmFsX3JlYWRlcih0c3BlYykpCi0gICAgc2VsZi5yZWFkU2V0RW5kKCkKLSAgICByZXR1cm4gcmVzdWx0cworICAgIGRlZiByZWFkVXRmOChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZFN0cmluZygpLmRlY29kZSgndXRmOCcpCiAKLSAgZGVmIHJlYWRDb250YWluZXJTdHJ1Y3Qoc2VsZiwgc3BlYyk6Ci0gICAgKG9ial9jbGFzcywgb2JqX3NwZWMpID0gc3BlYwotICAgIG9iaiA9IG9ial9jbGFzcygpCi0gICAgb2JqLnJlYWQoc2VsZikKLSAgICByZXR1cm4gb2JqCisgICAgZGVmIHNraXAoc2VsZiwgdHR5cGUpOgorICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICAgIHNlbGYucmVhZEJvb2woKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkJZVEU6CisgICAgICAgICAgICBzZWxmLnJlYWRCeXRlKCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5JMTY6CisgICAgICAgICAgICBzZWxmLnJlYWRJMTYoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICAgIHNlbGYucmVhZEkzMigpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuSTY0OgorICAgICAgICAgICAgc2VsZi5yZWFkSTY0KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgICBzZWxmLnJlYWREb3VibGUoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICAgIHNlbGYucmVhZFN0cmluZygpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYucmVhZFN0cnVjdEJlZ2luKCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgKG5hbWUsIHR0eXBlLCBpZCkgPSBzZWxmLnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgICAgICAgICAgICBpZiB0dHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh0dHlwZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgICAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgICAgICBlbGlmIHR0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICAgIChrdHlwZSwgdnR5cGUsIHNpemUpID0gc2VsZi5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGt0eXBlKQorICAgICAgICAgICAgICAgIHNlbGYuc2tpcCh2dHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZE1hcEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuU0VUOgorICAgICAgICAgICAgKGV0eXBlLCBzaXplKSA9IHNlbGYucmVhZFNldEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcChldHlwZSkKKyAgICAgICAgICAgIHNlbGYucmVhZFNldEVuZCgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICAgIChldHlwZSwgc2l6ZSkgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGV0eXBlKQorICAgICAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCiAKLSAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6Ci0gICAgcmVzdWx0cyA9IGRpY3QoKQotICAgIGtleV90dHlwZSwga2V5X3NwZWMgPSBzcGVjWzBdLCBzcGVjWzFdCi0gICAgdmFsX3R0eXBlLCB2YWxfc3BlYyA9IHNwZWNbMl0sIHNwZWNbM10KLSAgICAobWFwX2t0eXBlLCBtYXBfdnR5cGUsIG1hcF9sZW4pID0gc2VsZi5yZWFkTWFwQmVnaW4oKQotICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKLSAgICAjIGFib3J0L3NraXAgaWYgdHlwZXMgZGlzYWdyZWUKLSAgICBrZXlfcmVhZGVyID0gZ2V0YXR0cihzZWxmLCBzZWxmLl9UVFlQRV9IQU5ETEVSU1trZXlfdHR5cGVdWzBdKQotICAgIHZhbF9yZWFkZXIgPSBnZXRhdHRyKHNlbGYsIHNlbGYuX1RUWVBFX0hBTkRMRVJTW3ZhbF90dHlwZV1bMF0pCi0gICAgIyBsaXN0IHZhbHVlcyBhcmUgc2ltcGxlIHR5cGVzCi0gICAgZm9yIGlkeCBpbiB4cmFuZ2UobWFwX2xlbik6Ci0gICAgICBpZiBrZXlfc3BlYyBpcyBOb25lOgotICAgICAgICBrX3ZhbCA9IGtleV9yZWFkZXIoKQotICAgICAgZWxzZToKLSAgICAgICAga192YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoa2V5X3R0eXBlLCBrZXlfc3BlYykKLSAgICAgIGlmIHZhbF9zcGVjIGlzIE5vbmU6Ci0gICAgICAgIHZfdmFsID0gdmFsX3JlYWRlcigpCi0gICAgICBlbHNlOgotICAgICAgICB2X3ZhbCA9IHNlbGYucmVhZEZpZWxkQnlUVHlwZSh2YWxfdHR5cGUsIHZhbF9zcGVjKQotICAgICAgIyB0aGlzIHJhaXNlcyBhIFR5cGVFcnJvciB3aXRoIHVuaGFzaGFibGUga2V5cyB0eXBlcwotICAgICAgIyBpLmUuIHRoaXMgZmFpbHM6IGQ9ZGljdCgpOyBkW1swLDFdXSA9IDIKLSAgICAgIHJlc3VsdHNba192YWxdID0gdl92YWwKLSAgICBzZWxmLnJlYWRNYXBFbmQoKQotICAgIHJldHVybiByZXN1bHRzCisgICAgIyB0dXBsZSBvZjogKCAncmVhZGVyIG1ldGhvZCcgbmFtZSwgaXNfY29udGFpbmVyIGJvb2wsICd3cml0ZXJfbWV0aG9kJyBuYW1lICkKKyAgICBfVFRZUEVfSEFORExFUlMgPSAoCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDAgVFR5cGUuU1RPUAorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyAxIFRUeXBlLlZPSUQgIyBUT0RPOiBoYW5kbGUgdm9pZD8KKyAgICAgICAgKCdyZWFkQm9vbCcsICd3cml0ZUJvb2wnLCBGYWxzZSksICAjIDIgVFR5cGUuQk9PTAorICAgICAgICAoJ3JlYWRCeXRlJywgJ3dyaXRlQnl0ZScsIEZhbHNlKSwgICMgMyBUVHlwZS5CWVRFIGFuZCBJMDgKKyAgICAgICAgKCdyZWFkRG91YmxlJywgJ3dyaXRlRG91YmxlJywgRmFsc2UpLCAgIyA0IFRUeXBlLkRPVUJMRQorICAgICAgICAoTm9uZSwgTm9uZSwgRmFsc2UpLCAgIyA1IHVuZGVmaW5lZAorICAgICAgICAoJ3JlYWRJMTYnLCAnd3JpdGVJMTYnLCBGYWxzZSksICAjIDYgVFR5cGUuSTE2CisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDcgdW5kZWZpbmVkCisgICAgICAgICgncmVhZEkzMicsICd3cml0ZUkzMicsIEZhbHNlKSwgICMgOCBUVHlwZS5JMzIKKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSwgICMgOSB1bmRlZmluZWQKKyAgICAgICAgKCdyZWFkSTY0JywgJ3dyaXRlSTY0JywgRmFsc2UpLCAgIyAxMCBUVHlwZS5JNjQKKyAgICAgICAgKCdyZWFkU3RyaW5nJywgJ3dyaXRlU3RyaW5nJywgRmFsc2UpLCAgIyAxMSBUVHlwZS5TVFJJTkcgYW5kIFVURjcKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyU3RydWN0JywgJ3dyaXRlQ29udGFpbmVyU3RydWN0JywgVHJ1ZSksICAjIDEyICouU1RSVUNUCisgICAgICAgICgncmVhZENvbnRhaW5lck1hcCcsICd3cml0ZUNvbnRhaW5lck1hcCcsIFRydWUpLCAgIyAxMyBUVHlwZS5NQVAKKyAgICAgICAgKCdyZWFkQ29udGFpbmVyU2V0JywgJ3dyaXRlQ29udGFpbmVyU2V0JywgVHJ1ZSksICAjIDE0IFRUeXBlLlNFVAorICAgICAgICAoJ3JlYWRDb250YWluZXJMaXN0JywgJ3dyaXRlQ29udGFpbmVyTGlzdCcsIFRydWUpLCAgIyAxNSBUVHlwZS5MSVNUCisgICAgICAgIChOb25lLCBOb25lLCBGYWxzZSksICAjIDE2IFRUeXBlLlVURjggIyBUT0RPOiBoYW5kbGUgdXRmOCB0eXBlcz8KKyAgICAgICAgKE5vbmUsIE5vbmUsIEZhbHNlKSAgIyAxNyBUVHlwZS5VVEYxNiAjIFRPRE86IGhhbmRsZSB1dGYxNiB0eXBlcz8KKyAgICApCiAKLSAgZGVmIHJlYWRTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYyk6Ci0gICAgc2VsZi5yZWFkU3RydWN0QmVnaW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gc2VsZi5yZWFkRmllbGRCZWdpbigpCi0gICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgotICAgICAgICBicmVhawotICAgICAgdHJ5OgotICAgICAgICBmaWVsZCA9IHRocmlmdF9zcGVjW2ZpZF0KLSAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICBzZWxmLnNraXAoZnR5cGUpCi0gICAgICBlbHNlOgotICAgICAgICBpZiBmaWVsZCBpcyBub3QgTm9uZSBhbmQgZnR5cGUgPT0gZmllbGRbMV06Ci0gICAgICAgICAgZm5hbWUgPSBmaWVsZFsyXQotICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KLSAgICAgICAgICB2YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoZnR5cGUsIGZzcGVjKQotICAgICAgICAgIHNldGF0dHIob2JqLCBmbmFtZSwgdmFsKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHNlbGYuc2tpcChmdHlwZSkKLSAgICAgIHNlbGYucmVhZEZpZWxkRW5kKCkKLSAgICBzZWxmLnJlYWRTdHJ1Y3RFbmQoKQorICAgIGRlZiBfdHR5cGVfaGFuZGxlcnMoc2VsZiwgdHR5cGUsIHNwZWMpOgorICAgICAgICBpZiBzcGVjID09ICdCSU5BUlknOgorICAgICAgICAgICAgaWYgdHR5cGUgIT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgYmluYXJ5IGZpZWxkIHR5cGUgJWQnICUgdHR5cGUpCisgICAgICAgICAgICByZXR1cm4gKCdyZWFkQmluYXJ5JywgJ3dyaXRlQmluYXJ5JywgRmFsc2UpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgc3BlYyA9PSAnVVRGOCc6CisgICAgICAgICAgICBpZiB0dHlwZSAhPSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKHR5cGU9VFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCBzdHJpbmcgZmllbGQgdHlwZSAlZCcgJSB0dHlwZSkKKyAgICAgICAgICAgIHJldHVybiAoJ3JlYWRVdGY4JywgJ3dyaXRlVXRmOCcsIEZhbHNlKQorICAgICAgICByZXR1cm4gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdIGlmIHR0eXBlIDwgbGVuKHNlbGYuX1RUWVBFX0hBTkRMRVJTKSBlbHNlIChOb25lLCBOb25lLCBGYWxzZSkKIAotICBkZWYgd3JpdGVDb250YWluZXJTdHJ1Y3Qoc2VsZiwgdmFsLCBzcGVjKToKLSAgICB2YWwud3JpdGUoc2VsZikKKyAgICBkZWYgX3JlYWRfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgcmVhZGVyX25hbWUsIF8sIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgaWYgcmVhZGVyX25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbih0eXBlPVRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSW52YWxpZCB0eXBlICVkJyAlICh0dHlwZSkpCisgICAgICAgIHJlYWRlcl9mdW5jID0gZ2V0YXR0cihzZWxmLCByZWFkZXJfbmFtZSkKKyAgICAgICAgcmVhZCA9IChsYW1iZGE6IHJlYWRlcl9mdW5jKGVzcGVjKSkgaWYgaXNfY29udGFpbmVyIGVsc2UgcmVhZGVyX2Z1bmMKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHlpZWxkIHJlYWQoKQogCi0gIGRlZiB3cml0ZUNvbnRhaW5lckxpc3Qoc2VsZiwgdmFsLCBzcGVjKToKLSAgICBzZWxmLndyaXRlTGlzdEJlZ2luKHNwZWNbMF0sIGxlbih2YWwpKQotICAgIHJfaGFuZGxlciwgd19oYW5kbGVyLCBpc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1tzcGVjWzBdXQotICAgIGVfd3JpdGVyID0gZ2V0YXR0cihzZWxmLCB3X2hhbmRsZXIpCi0gICAgaWYgbm90IGlzX2NvbnRhaW5lcjoKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSkKLSAgICBlbHNlOgotICAgICAgZm9yIGVsZW0gaW4gdmFsOgotICAgICAgICBlX3dyaXRlcihlbGVtLCBzcGVjWzFdKQotICAgIHNlbGYud3JpdGVMaXN0RW5kKCkKKyAgICBkZWYgcmVhZEZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgc3BlYyk6CisgICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3JlYWRfYnlfdHR5cGUodHR5cGUsIHNwZWMsIHNwZWMpKQogCi0gIGRlZiB3cml0ZUNvbnRhaW5lclNldChzZWxmLCB2YWwsIHNwZWMpOgotICAgIHNlbGYud3JpdGVTZXRCZWdpbihzcGVjWzBdLCBsZW4odmFsKSkKLSAgICByX2hhbmRsZXIsIHdfaGFuZGxlciwgaXNfY29udGFpbmVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNbc3BlY1swXV0KLSAgICBlX3dyaXRlciA9IGdldGF0dHIoc2VsZiwgd19oYW5kbGVyKQotICAgIGlmIG5vdCBpc19jb250YWluZXI6Ci0gICAgICBmb3IgZWxlbSBpbiB2YWw6Ci0gICAgICAgIGVfd3JpdGVyKGVsZW0pCi0gICAgZWxzZToKLSAgICAgIGZvciBlbGVtIGluIHZhbDoKLSAgICAgICAgZV93cml0ZXIoZWxlbSwgc3BlY1sxXSkKLSAgICBzZWxmLndyaXRlU2V0RW5kKCkKKyAgICBkZWYgcmVhZENvbnRhaW5lckxpc3Qoc2VsZiwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgaXNfaW1tdXRhYmxlID0gc3BlYworICAgICAgICAobGlzdF90eXBlLCBsaXN0X2xlbikgPSBzZWxmLnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAjIFRPRE86IGNvbXBhcmUgdHlwZXMgd2UganVzdCBkZWNvZGVkIHdpdGggdGhyaWZ0X3NwZWMKKyAgICAgICAgZWxlbXMgPSBpc2xpY2Uoc2VsZi5fcmVhZF9ieV90dHlwZSh0dHlwZSwgc3BlYywgdHNwZWMpLCBsaXN0X2xlbikKKyAgICAgICAgcmVzdWx0cyA9ICh0dXBsZSBpZiBpc19pbW11dGFibGUgZWxzZSBsaXN0KShlbGVtcykKKyAgICAgICAgc2VsZi5yZWFkTGlzdEVuZCgpCisgICAgICAgIHJldHVybiByZXN1bHRzCiAKLSAgZGVmIHdyaXRlQ29udGFpbmVyTWFwKHNlbGYsIHZhbCwgc3BlYyk6Ci0gICAga190eXBlID0gc3BlY1swXQotICAgIHZfdHlwZSA9IHNwZWNbMl0KLSAgICBpZ25vcmUsIGt0eXBlX25hbWUsIGtfaXNfY29udGFpbmVyID0gc2VsZi5fVFRZUEVfSEFORExFUlNba190eXBlXQotICAgIGlnbm9yZSwgdnR5cGVfbmFtZSwgdl9pc19jb250YWluZXIgPSBzZWxmLl9UVFlQRV9IQU5ETEVSU1t2X3R5cGVdCi0gICAga193cml0ZXIgPSBnZXRhdHRyKHNlbGYsIGt0eXBlX25hbWUpCi0gICAgdl93cml0ZXIgPSBnZXRhdHRyKHNlbGYsIHZ0eXBlX25hbWUpCi0gICAgc2VsZi53cml0ZU1hcEJlZ2luKGtfdHlwZSwgdl90eXBlLCBsZW4odmFsKSkKLSAgICBmb3IgbV9rZXksIG1fdmFsIGluIHZhbC5pdGVyaXRlbXMoKToKLSAgICAgIGlmIG5vdCBrX2lzX2NvbnRhaW5lcjoKLSAgICAgICAga193cml0ZXIobV9rZXkpCi0gICAgICBlbHNlOgotICAgICAgICBrX3dyaXRlcihtX2tleSwgc3BlY1sxXSkKLSAgICAgIGlmIG5vdCB2X2lzX2NvbnRhaW5lcjoKLSAgICAgICAgdl93cml0ZXIobV92YWwpCi0gICAgICBlbHNlOgotICAgICAgICB2X3dyaXRlcihtX3ZhbCwgc3BlY1szXSkKLSAgICBzZWxmLndyaXRlTWFwRW5kKCkKKyAgICBkZWYgcmVhZENvbnRhaW5lclNldChzZWxmLCBzcGVjKToKKyAgICAgICAgdHR5cGUsIHRzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChzZXRfdHlwZSwgc2V0X2xlbikgPSBzZWxmLnJlYWRTZXRCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYworICAgICAgICBlbGVtcyA9IGlzbGljZShzZWxmLl9yZWFkX2J5X3R0eXBlKHR0eXBlLCBzcGVjLCB0c3BlYyksIHNldF9sZW4pCisgICAgICAgIHJlc3VsdHMgPSAoZnJvemVuc2V0IGlmIGlzX2ltbXV0YWJsZSBlbHNlIHNldCkoZWxlbXMpCisgICAgICAgIHNlbGYucmVhZFNldEVuZCgpCisgICAgICAgIHJldHVybiByZXN1bHRzCiAKLSAgZGVmIHdyaXRlU3RydWN0KHNlbGYsIG9iaiwgdGhyaWZ0X3NwZWMpOgotICAgIHNlbGYud3JpdGVTdHJ1Y3RCZWdpbihvYmouX19jbGFzc19fLl9fbmFtZV9fKQotICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKLSAgICAgIGlmIGZpZWxkIGlzIE5vbmU6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBmbmFtZSA9IGZpZWxkWzJdCi0gICAgICB2YWwgPSBnZXRhdHRyKG9iaiwgZm5hbWUpCi0gICAgICBpZiB2YWwgaXMgTm9uZToKLSAgICAgICAgIyBza2lwIHdyaXRpbmcgb3V0IHVuc2V0IGZpZWxkcwotICAgICAgICBjb250aW51ZQotICAgICAgZmlkID0gZmllbGRbMF0KLSAgICAgIGZ0eXBlID0gZmllbGRbMV0KLSAgICAgIGZzcGVjID0gZmllbGRbM10KLSAgICAgICMgZ2V0IHRoZSB3cml0ZXIgbWV0aG9kIGZvciB0aGlzIHZhbHVlCi0gICAgICBzZWxmLndyaXRlRmllbGRCZWdpbihmbmFtZSwgZnR5cGUsIGZpZCkKLSAgICAgIHNlbGYud3JpdGVGaWVsZEJ5VFR5cGUoZnR5cGUsIHZhbCwgZnNwZWMpCi0gICAgICBzZWxmLndyaXRlRmllbGRFbmQoKQotICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQotICAgIHNlbGYud3JpdGVTdHJ1Y3RFbmQoKQorICAgIGRlZiByZWFkQ29udGFpbmVyU3RydWN0KHNlbGYsIHNwZWMpOgorICAgICAgICAob2JqX2NsYXNzLCBvYmpfc3BlYykgPSBzcGVjCisgICAgICAgIG9iaiA9IG9ial9jbGFzcygpCisgICAgICAgIG9iai5yZWFkKHNlbGYpCisgICAgICAgIHJldHVybiBvYmoKIAotICBkZWYgd3JpdGVGaWVsZEJ5VFR5cGUoc2VsZiwgdHR5cGUsIHZhbCwgc3BlYyk6Ci0gICAgcl9oYW5kbGVyLCB3X2hhbmRsZXIsIGlzX2NvbnRhaW5lciA9IHNlbGYuX1RUWVBFX0hBTkRMRVJTW3R0eXBlXQotICAgIHdyaXRlciA9IGdldGF0dHIoc2VsZiwgd19oYW5kbGVyKQotICAgIGlmIGlzX2NvbnRhaW5lcjoKLSAgICAgIHdyaXRlcih2YWwsIHNwZWMpCi0gICAgZWxzZToKLSAgICAgIHdyaXRlcih2YWwpCisgICAgZGVmIHJlYWRDb250YWluZXJNYXAoc2VsZiwgc3BlYyk6CisgICAgICAgIGt0eXBlLCBrc3BlYywgdnR5cGUsIHZzcGVjLCBpc19pbW11dGFibGUgPSBzcGVjCisgICAgICAgIChtYXBfa3R5cGUsIG1hcF92dHlwZSwgbWFwX2xlbikgPSBzZWxmLnJlYWRNYXBCZWdpbigpCisgICAgICAgICMgVE9ETzogY29tcGFyZSB0eXBlcyB3ZSBqdXN0IGRlY29kZWQgd2l0aCB0aHJpZnRfc3BlYyBhbmQKKyAgICAgICAgIyBhYm9ydC9za2lwIGlmIHR5cGVzIGRpc2FncmVlCisgICAgICAgIGtleXMgPSBzZWxmLl9yZWFkX2J5X3R0eXBlKGt0eXBlLCBzcGVjLCBrc3BlYykKKyAgICAgICAgdmFscyA9IHNlbGYuX3JlYWRfYnlfdHR5cGUodnR5cGUsIHNwZWMsIHZzcGVjKQorICAgICAgICBrZXl2YWxzID0gaXNsaWNlKHppcChrZXlzLCB2YWxzKSwgbWFwX2xlbikKKyAgICAgICAgcmVzdWx0cyA9IChURnJvemVuRGljdCBpZiBpc19pbW11dGFibGUgZWxzZSBkaWN0KShrZXl2YWxzKQorICAgICAgICBzZWxmLnJlYWRNYXBFbmQoKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHJlYWRTdHJ1Y3Qoc2VsZiwgb2JqLCB0aHJpZnRfc3BlYywgaXNfaW1tdXRhYmxlPUZhbHNlKToKKyAgICAgICAgaWYgaXNfaW1tdXRhYmxlOgorICAgICAgICAgICAgZmllbGRzID0ge30KKyAgICAgICAgc2VsZi5yZWFkU3RydWN0QmVnaW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IHNlbGYucmVhZEZpZWxkQmVnaW4oKQorICAgICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpZWxkID0gdGhyaWZ0X3NwZWNbZmlkXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwKGZ0eXBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBmaWVsZCBpcyBub3QgTm9uZSBhbmQgZnR5cGUgPT0gZmllbGRbMV06CisgICAgICAgICAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgICAgICAgICAgZnNwZWMgPSBmaWVsZFszXQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBzZWxmLnJlYWRGaWVsZEJ5VFR5cGUoZnR5cGUsIGZzcGVjKQorICAgICAgICAgICAgICAgICAgICBpZiBpc19pbW11dGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHNbZm5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG9iaiwgZm5hbWUsIHZhbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXAoZnR5cGUpCisgICAgICAgICAgICBzZWxmLnJlYWRGaWVsZEVuZCgpCisgICAgICAgIHNlbGYucmVhZFN0cnVjdEVuZCgpCisgICAgICAgIGlmIGlzX2ltbXV0YWJsZToKKyAgICAgICAgICAgIHJldHVybiBvYmooKipmaWVsZHMpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJTdHJ1Y3Qoc2VsZiwgdmFsLCBzcGVjKToKKyAgICAgICAgdmFsLndyaXRlKHNlbGYpCisKKyAgICBkZWYgd3JpdGVDb250YWluZXJMaXN0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZUxpc3RCZWdpbih0dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHR0eXBlLCB2YWwsIHNwZWMsIHRzcGVjKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53cml0ZUxpc3RFbmQoKQorCisgICAgZGVmIHdyaXRlQ29udGFpbmVyU2V0KHNlbGYsIHZhbCwgc3BlYyk6CisgICAgICAgIHR0eXBlLCB0c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZVNldEJlZ2luKHR0eXBlLCBsZW4odmFsKSkKKyAgICAgICAgZm9yIF8gaW4gc2VsZi5fd3JpdGVfYnlfdHR5cGUodHR5cGUsIHZhbCwgc3BlYywgdHNwZWMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlU2V0RW5kKCkKKworICAgIGRlZiB3cml0ZUNvbnRhaW5lck1hcChzZWxmLCB2YWwsIHNwZWMpOgorICAgICAgICBrdHlwZSwga3NwZWMsIHZ0eXBlLCB2c3BlYywgXyA9IHNwZWMKKyAgICAgICAgc2VsZi53cml0ZU1hcEJlZ2luKGt0eXBlLCB2dHlwZSwgbGVuKHZhbCkpCisgICAgICAgIGZvciBfIGluIHppcChzZWxmLl93cml0ZV9ieV90dHlwZShrdHlwZSwgc2l4Lml0ZXJrZXlzKHZhbCksIHNwZWMsIGtzcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J5X3R0eXBlKHZ0eXBlLCBzaXguaXRlcnZhbHVlcyh2YWwpLCBzcGVjLCB2c3BlYykpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndyaXRlTWFwRW5kKCkKKworICAgIGRlZiB3cml0ZVN0cnVjdChzZWxmLCBvYmosIHRocmlmdF9zcGVjKToKKyAgICAgICAgc2VsZi53cml0ZVN0cnVjdEJlZ2luKG9iai5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGZvciBmaWVsZCBpbiB0aHJpZnRfc3BlYzoKKyAgICAgICAgICAgIGlmIGZpZWxkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZmllbGRbMl0KKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCBmbmFtZSkKKyAgICAgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgc2tpcCB3cml0aW5nIG91dCB1bnNldCBmaWVsZHMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlkID0gZmllbGRbMF0KKyAgICAgICAgICAgIGZ0eXBlID0gZmllbGRbMV0KKyAgICAgICAgICAgIGZzcGVjID0gZmllbGRbM10KKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEJlZ2luKGZuYW1lLCBmdHlwZSwgZmlkKQorICAgICAgICAgICAgc2VsZi53cml0ZUZpZWxkQnlUVHlwZShmdHlwZSwgdmFsLCBmc3BlYykKKyAgICAgICAgICAgIHNlbGYud3JpdGVGaWVsZEVuZCgpCisgICAgICAgIHNlbGYud3JpdGVGaWVsZFN0b3AoKQorICAgICAgICBzZWxmLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiBfd3JpdGVfYnlfdHR5cGUoc2VsZiwgdHR5cGUsIHZhbHMsIHNwZWMsIGVzcGVjKToKKyAgICAgICAgXywgd3JpdGVyX25hbWUsIGlzX2NvbnRhaW5lciA9IHNlbGYuX3R0eXBlX2hhbmRsZXJzKHR0eXBlLCBlc3BlYykKKyAgICAgICAgd3JpdGVyX2Z1bmMgPSBnZXRhdHRyKHNlbGYsIHdyaXRlcl9uYW1lKQorICAgICAgICB3cml0ZSA9IChsYW1iZGEgdjogd3JpdGVyX2Z1bmModiwgZXNwZWMpKSBpZiBpc19jb250YWluZXIgZWxzZSB3cml0ZXJfZnVuYworICAgICAgICBmb3IgdiBpbiB2YWxzOgorICAgICAgICAgICAgeWllbGQgd3JpdGUodikKKworICAgIGRlZiB3cml0ZUZpZWxkQnlUVHlwZShzZWxmLCB0dHlwZSwgdmFsLCBzcGVjKToKKyAgICAgICAgbmV4dChzZWxmLl93cml0ZV9ieV90dHlwZSh0dHlwZSwgW3ZhbF0sIHNwZWMsIHNwZWMpKQogCiAKLWNsYXNzIFRQcm90b2NvbEZhY3Rvcnk6Ci0gIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6Ci0gICAgcGFzcworZGVmIGNoZWNrSW50ZWdlckxpbWl0cyhpLCBiaXRzKToKKyAgICBpZiBiaXRzID09IDggYW5kIChpIDwgLTEyOCBvciBpID4gMTI3KToKKyAgICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTggcmVxdWlyZXMgLTEyOCA8PSBudW1iZXIgPD0gMTI3IikKKyAgICBlbGlmIGJpdHMgPT0gMTYgYW5kIChpIDwgLTMyNzY4IG9yIGkgPiAzMjc2Nyk6CisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImkxNiByZXF1aXJlcyAtMzI3NjggPD0gbnVtYmVyIDw9IDMyNzY3IikKKyAgICBlbGlmIGJpdHMgPT0gMzIgYW5kIChpIDwgLTIxNDc0ODM2NDggb3IgaSA+IDIxNDc0ODM2NDcpOgorICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMzIgcmVxdWlyZXMgLTIxNDc0ODM2NDggPD0gbnVtYmVyIDw9IDIxNDc0ODM2NDciKQorICAgIGVsaWYgYml0cyA9PSA2NCBhbmQgKGkgPCAtOTIyMzM3MjAzNjg1NDc3NTgwOCBvciBpID4gOTIyMzM3MjAzNjg1NDc3NTgwNyk6CisgICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImk2NCByZXF1aXJlcyAtOTIyMzM3MjAzNjg1NDc3NTgwOCA8PSBudW1iZXIgPD0gOTIyMzM3MjAzNjg1NDc3NTgwNyIpCisKKworY2xhc3MgVFByb3RvY29sRmFjdG9yeShvYmplY3QpOgorICAgIGRlZiBnZXRQcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NDZjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisKK2NsYXNzIFRQcm90b2NvbERlY29yYXRvcihvYmplY3QpOgorICAgIGRlZiBfX25ld19fKGNscywgcHJvdG9jb2wsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGRlY29yYXRlZF9jbHMgPSB0eXBlKCcnLmpvaW4oWydEZWNvcmF0ZWQnLCBwcm90b2NvbC5fX2NsYXNzX18uX19uYW1lX19dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNscywgcHJvdG9jb2wuX19jbGFzc19fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wuX19kaWN0X18pCisgICAgICAgIHJldHVybiBvYmplY3QuX19uZXdfXyhkZWNvcmF0ZWRfY2xzKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvX19pbml0X18ucHkKaW5kZXggZDUzMzU5Yi4uNzE0OGY2NiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9fX2luaXRfXy5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL19faW5pdF9fLnB5CkBAIC0xNyw0ICsxNyw1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1fX2FsbF9fID0gWydUUHJvdG9jb2wnLCAnVEJpbmFyeVByb3RvY29sJywgJ2Zhc3RiaW5hcnknLCAnVEJhc2UnXQorX19hbGxfXyA9IFsnZmFzdGJpbmFyeScsICdUQmFzZScsICdUQmluYXJ5UHJvdG9jb2wnLCAnVENvbXBhY3RQcm90b2NvbCcsCisgICAgICAgICAgICdUSlNPTlByb3RvY29sJywgJ1RQcm90b2NvbCddCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3Byb3RvY29sL2Zhc3RiaW5hcnkuYyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U1NjYwLi4wMDAwMDAwCi0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvZmFzdGJpbmFyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLSNpbmNsdWRlICJjU3RyaW5nSU8uaCIKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpZm5kZWYgX1dJTjMyCi0jIGluY2x1ZGUgPHN0ZGJvb2wuaD4KLSMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8V2luU29jazIuaD4KLSMgcHJhZ21hIGNvbW1lbnQgKGxpYiwgIndzMl8zMi5saWIiKQotIyBkZWZpbmUgQklHX0VORElBTiAoNDMyMSkKLSMgZGVmaW5lIExJVFRMRV9FTkRJQU4gKDEyMzQpCi0jIGRlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSMgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNjAwCi0gICB0eXBlZGVmIGludCBfQm9vbDsKLSMgIGRlZmluZSBib29sIF9Cb29sCi0jICBkZWZpbmUgZmFsc2UgMCAKLSMgIGRlZmluZSB0cnVlIDEKLSMgZW5kaWYKLSMgZGVmaW5lIGlubGluZSBfX2lubGluZQotI2VuZGlmCi0KLS8qIEZpeCBlbmRpYW5uZXNzIGlzc3VlcyBvbiBTb2xhcmlzICovCi0jaWYgZGVmaW5lZCAoX19TVlI0KSAmJiBkZWZpbmVkIChfX3N1bikKLSAjaWYgZGVmaW5lZChfX2kzODYpICYmICFkZWZpbmVkKF9faTM4Nl9fKQotICAjZGVmaW5lIF9faTM4Nl9fCi0gI2VuZGlmCi0KLSAjaWZuZGVmIEJJR19FTkRJQU4KLSAgI2RlZmluZSBCSUdfRU5ESUFOICg0MzIxKQotICNlbmRpZgotICNpZm5kZWYgTElUVExFX0VORElBTgotICAjZGVmaW5lIExJVFRMRV9FTkRJQU4gKDEyMzQpCi0gI2VuZGlmCi0KLSAvKiBJMzg2IGlzIExFLCBldmVuIG9uIFNvbGFyaXMgKi8KLSAjaWYgIWRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChfX2kzODZfXykKLSAgI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KLSAjZW5kaWYKLSNlbmRpZgotCi0vLyBUT0RPKGRyZWlzcyk6IGRlZnZhbCBhcHBlYXJzIHRvIGJlIHVudXNlZC4gIExvb2sgaW50byByZW1vdmluZyBpdC4KLS8vIFRPRE8oZHJlaXNzKTogTWFrZSBwYXJzZV9zcGVjX2FyZ3MgcmVjdXJzaXZlLCBhbmQgY2FjaGUgdGhlIG91dHB1dAotLy8gICAgICAgICAgICAgICBwZXJtYW5lbnRseSBpbiB0aGUgb2JqZWN0LiAgKE1hbGxvYyBhbmQgb3JwaGFuLikKLS8vIFRPRE8oZHJlaXNzKTogV2h5IGRvIHdlIG5lZWQgY1N0cmluZ0lPIGZvciByZWFkaW5nLCB3aHkgbm90IGp1c3QgY2hhcio/Ci0vLyAgICAgICAgICAgICAgIENhbiBjU3RyaW5nSU8gbGV0IHVzIHdvcmsgd2l0aCBhIEJ1ZmZlcmVkVHJhbnNwb3J0PwotLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBpZ25vcmUgdGhlIHJ2IGZyb20gY3dyaXRlIChtYXliZSkuCi0KLS8qID09PT09PSBCRUdJTiBVVElMSVRJRVMgPT09PT09ICovCi0KLSNkZWZpbmUgSU5JVF9PVVRCVUZfU0laRSAxMjgKLQotLy8gU3RvbGVuIG91dCBvZiBUUHJvdG9jb2wuaC4KLS8vIEl0IHdvdWxkIGJlIGEgaHVnZSBwYWluIHRvIGhhdmUgYm90aCBnZXQgdGhpcyBmcm9tIG9uZSBwbGFjZS4KLXR5cGVkZWYgZW51bSBUVHlwZSB7Ci0gIFRfU1RPUCAgICAgICA9IDAsCi0gIFRfVk9JRCAgICAgICA9IDEsCi0gIFRfQk9PTCAgICAgICA9IDIsCi0gIFRfQllURSAgICAgICA9IDMsCi0gIFRfSTA4ICAgICAgICA9IDMsCi0gIFRfSTE2ICAgICAgICA9IDYsCi0gIFRfSTMyICAgICAgICA9IDgsCi0gIFRfVTY0ICAgICAgICA9IDksCi0gIFRfSTY0ICAgICAgICA9IDEwLAotICBUX0RPVUJMRSAgICAgPSA0LAotICBUX1NUUklORyAgICAgPSAxMSwKLSAgVF9VVEY3ICAgICAgID0gMTEsCi0gIFRfU1RSVUNUICAgICA9IDEyLAotICBUX01BUCAgICAgICAgPSAxMywKLSAgVF9TRVQgICAgICAgID0gMTQsCi0gIFRfTElTVCAgICAgICA9IDE1LAotICBUX1VURjggICAgICAgPSAxNiwKLSAgVF9VVEYxNiAgICAgID0gMTcKLX0gVFR5cGU7Ci0KLSNpZm5kZWYgX19CWVRFX09SREVSCi0jIGlmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChMSVRUTEVfRU5ESUFOKSAmJiBkZWZpbmVkKEJJR19FTkRJQU4pCi0jICBkZWZpbmUgX19CWVRFX09SREVSIEJZVEVfT1JERVIKLSMgIGRlZmluZSBfX0xJVFRMRV9FTkRJQU4gTElUVExFX0VORElBTgotIyAgZGVmaW5lIF9fQklHX0VORElBTiBCSUdfRU5ESUFOCi0jIGVsc2UKLSMgIGVycm9yICJDYW5ub3QgZGV0ZXJtaW5lIGVuZGlhbm5lc3MiCi0jIGVuZGlmCi0jZW5kaWYKLQotLy8gU2FtZSBjb21tZW50IGFzIHRoZSBlbnVtLiAgU29ycnkuCi0jaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotIyBkZWZpbmUgbnRvaGxsKG4pIChuKQotIyBkZWZpbmUgaHRvbmxsKG4pIChuKQotI2VsaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgotIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR0xJQkNfXykKLSMgIGluY2x1ZGUgPGJ5dGVzd2FwLmg+Ci0jICBkZWZpbmUgbnRvaGxsKG4pIGJzd2FwXzY0KG4pCi0jICBkZWZpbmUgaHRvbmxsKG4pIGJzd2FwXzY0KG4pCi0jIGVsc2UgLyogR05VQyAmIEdMSUJDICovCi0jICBkZWZpbmUgbnRvaGxsKG4pICggKCgodW5zaWduZWQgbG9uZyBsb25nKW50b2hsKG4pKSA8PCAzMikgKyBudG9obChuID4+IDMyKSApCi0jICBkZWZpbmUgaHRvbmxsKG4pICggKCgodW5zaWduZWQgbG9uZyBsb25nKWh0b25sKG4pKSA8PCAzMikgKyBodG9ubChuID4+IDMyKSApCi0jIGVuZGlmIC8qIEdOVUMgJiBHTElCQyAqLwotI2Vsc2UgLyogX19CWVRFX09SREVSICovCi0jIGVycm9yICJDYW4ndCBkZWZpbmUgaHRvbmxsIG9yIG50b2hsbCEiCi0jZW5kaWYKLQotLy8gRG9pbmcgYSBiZW5jaG1hcmsgc2hvd3MgdGhhdCBpbnRlcm5pbmcgYWN0dWFsbHkgbWFrZXMgYSBkaWZmZXJlbmNlLCBhbWF6aW5nbHkuCi0jZGVmaW5lIElOVEVSTl9TVFJJTkcodmFsdWUpIF9pbnRlcm5fICMjIHZhbHVlCi0KLSNkZWZpbmUgSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikgKCAoKHYpID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpICkKLSNkZWZpbmUgQ0hFQ0tfUkFOR0UodiwgbWluLCBtYXgpICggKCh2KSA8PSAobWF4KSkgJiYgKCh2KSA+PSAobWluKSkgKQotCi0vLyBQeV9zc2l6ZV90IHdhcyBub3QgZGVmaW5lZCBiZWZvcmUgUHl0aG9uIDIuNQotI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi10eXBlZGVmIGludCBQeV9zc2l6ZV90OwotI2VuZGlmCi0KLS8qKgotICogQSBjYWNoZSBvZiB0aGUgc3BlY19hcmdzIGZvciBhIHNldCBvciBsaXN0LAotICogc28gd2UgZG9uJ3QgaGF2ZSB0byBrZWVwIGNhbGxpbmcgUHlUdXBsZV9HRVRfSVRFTS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBUVHlwZSBlbGVtZW50X3R5cGU7Ci0gIFB5T2JqZWN0KiB0eXBlYXJnczsKLX0gU2V0TGlzdFR5cGVBcmdzOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBtYXAsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFRUeXBlIGt0YWc7Ci0gIFRUeXBlIHZ0YWc7Ci0gIFB5T2JqZWN0KiBrdHlwZWFyZ3M7Ci0gIFB5T2JqZWN0KiB2dHlwZWFyZ3M7Ci19IE1hcFR5cGVBcmdzOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIHNwZWNfYXJncyBmb3IgYSBzdHJ1Y3QsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFB5T2JqZWN0KiBrbGFzczsKLSAgUHlPYmplY3QqIHNwZWM7Ci19IFN0cnVjdFR5cGVBcmdzOwotCi0vKioKLSAqIEEgY2FjaGUgb2YgdGhlIGl0ZW0gc3BlYyBmcm9tIGEgc3RydWN0IHNwZWNpZmljYXRpb24sCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeVR1cGxlX0dFVF9JVEVNLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB0YWc7Ci0gIFRUeXBlIHR5cGU7Ci0gIFB5T2JqZWN0KiBhdHRybmFtZTsKLSAgUHlPYmplY3QqIHR5cGVhcmdzOwotICBQeU9iamVjdCogZGVmdmFsOwotfSBTdHJ1Y3RJdGVtU3BlYzsKLQotLyoqCi0gKiBBIGNhY2hlIG9mIHRoZSB0d28ga2V5IGF0dHJpYnV0ZXMgb2YgYSBDUmVhZGFibGVUcmFuc3BvcnQsCi0gKiBzbyB3ZSBkb24ndCBoYXZlIHRvIGtlZXAgY2FsbGluZyBQeU9iamVjdF9HZXRBdHRyLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFB5T2JqZWN0KiBzdHJpbmdpb2J1ZjsKLSAgUHlPYmplY3QqIHJlZmlsbF9jYWxsYWJsZTsKLX0gRGVjb2RlQnVmZmVyOwotCi0vKiogUG9pbnRlciB0byBpbnRlcm5lZCBzdHJpbmcgdG8gc3BlZWQgdXAgYXR0cmlidXRlIGxvb2t1cC4gKi8KLXN0YXRpYyBQeU9iamVjdCogSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKLS8qKiBQb2ludGVyIHRvIGludGVybmVkIHN0cmluZyB0byBzcGVlZCB1cCBhdHRyaWJ1dGUgbG9va3VwLiAqLwotc3RhdGljIFB5T2JqZWN0KiBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOwotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWNoZWNrX3NzaXplX3RfMzIoUHlfc3NpemVfdCBsZW4pIHsKLSAgLy8gZXJyb3IgZnJvbSBnZXR0aW5nIHRoZSBpbnQKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIElOVDMyX01BWCkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInN0cmluZyBzaXplIG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1wYXJzZV9weWludChQeU9iamVjdCogbywgaW50MzJfdCogcmV0LCBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgpIHsKLSAgbG9uZyB2YWwgPSBQeUludF9Bc0xvbmcobyk7Ci0KLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKHZhbCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFDSEVDS19SQU5HRSh2YWwsIG1pbiwgbWF4KSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpyZXQgPSAoaW50MzJfdCkgdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAtLS0gRlVOQ1RJT05TIFRPIFBBUlNFIFNUUlVDVCBTUEVDSUZJQ0FUT0lOUyAtLS0gKi8KLQotc3RhdGljIGJvb2wKLXBhcnNlX3NldF9saXN0X2FyZ3MoU2V0TGlzdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gMikgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgdHVwbGUgb2Ygc2l6ZSAyIGZvciBsaXN0L3NldCB0eXBlIGFyZ3MiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5lbGVtZW50X3R5cGUgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCkpOwotICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQoZGVzdC0+ZWxlbWVudF90eXBlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPnR5cGVhcmdzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1wYXJzZV9tYXBfYXJncyhNYXBUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDQpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIDQgYXJndW1lbnRzIGZvciB0eXBlYXJncyB0byBtYXAiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT5rdGFnID0gUHlJbnRfQXNMb25nKFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPmt0YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dnRhZyA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAyKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT52dGFnKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmt0eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDEpOwotICBkZXN0LT52dHlwZWFyZ3MgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXBhcnNlX3N0cnVjdF9hcmdzKFN0cnVjdFR5cGVBcmdzKiBkZXN0LCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZSh0eXBlYXJncykgIT0gMikgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgdHVwbGUgb2Ygc2l6ZSAyIGZvciBzdHJ1Y3QgYXJncyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGRlc3QtPmtsYXNzID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMCk7Ci0gIGRlc3QtPnNwZWMgPSBQeVR1cGxlX0dFVF9JVEVNKHR5cGVhcmdzLCAxKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyhTdHJ1Y3RJdGVtU3BlYyogZGVzdCwgUHlPYmplY3QqIHNwZWNfdHVwbGUpIHsKLQotICAvLyBpJ2QgbGlrZSB0byB1c2UgUGFyc2VBcmdzIGhlcmUsIGJ1dCBpdCBzZWVtcyB0byBiZSBhIGJvdHRsZW5lY2suCi0gIGlmIChQeVR1cGxlX1NpemUoc3BlY190dXBsZSkgIT0gNSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgNSBhcmd1bWVudHMgZm9yIHNwZWMgdHVwbGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBkZXN0LT50YWcgPSBQeUludF9Bc0xvbmcoUHlUdXBsZV9HRVRfSVRFTShzcGVjX3R1cGxlLCAwKSk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChkZXN0LT50YWcpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+dHlwZSA9IFB5SW50X0FzTG9uZyhQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDEpKTsKLSAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGRlc3QtPnR5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+YXR0cm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKHNwZWNfdHVwbGUsIDIpOwotICBkZXN0LT50eXBlYXJncyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgMyk7Ci0gIGRlc3QtPmRlZnZhbCA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY190dXBsZSwgNCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiA9PT09PT0gRU5EIFVUSUxJVElFUyA9PT09PT0gKi8KLQotCi0vKiA9PT09PT0gQkVHSU4gV1JJVElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLS8qIC0tLSBMT1ctTEVWRUwgV1JJVElORyBGVU5DVElPTlMgLS0tICovCi0KLXN0YXRpYyB2b2lkIHdyaXRlQnl0ZShQeU9iamVjdCogb3V0YnVmLCBpbnQ4X3QgdmFsKSB7Ci0gIGludDhfdCBuZXQgPSB2YWw7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDhfdCkpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZUkxNihQeU9iamVjdCogb3V0YnVmLCBpbnQxNl90IHZhbCkgewotICBpbnQxNl90IG5ldCA9IChpbnQxNl90KWh0b25zKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDE2X3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVJMzIoUHlPYmplY3QqIG91dGJ1ZiwgaW50MzJfdCB2YWwpIHsKLSAgaW50MzJfdCBuZXQgPSAoaW50MzJfdClodG9ubCh2YWwpOwotICBQeWNTdHJpbmdJTy0+Y3dyaXRlKG91dGJ1ZiwgKGNoYXIqKSZuZXQsIHNpemVvZihpbnQzMl90KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlSTY0KFB5T2JqZWN0KiBvdXRidWYsIGludDY0X3QgdmFsKSB7Ci0gIGludDY0X3QgbmV0ID0gKGludDY0X3QpaHRvbmxsKHZhbCk7Ci0gIFB5Y1N0cmluZ0lPLT5jd3JpdGUob3V0YnVmLCAoY2hhciopJm5ldCwgc2l6ZW9mKGludDY0X3QpKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVEb3VibGUoUHlPYmplY3QqIG91dGJ1ZiwgZG91YmxlIGR1YikgewotICAvLyBVbmZvcnR1bmF0ZWx5LCBiaXR3aXNlX2Nhc3QgZG9lc24ndCB3b3JrIGluIEMuICBCYWQgQyEKLSAgdW5pb24gewotICAgIGRvdWJsZSBmOwotICAgIGludDY0X3QgdDsKLSAgfSB0cmFuc2ZlcjsKLSAgdHJhbnNmZXIuZiA9IGR1YjsKLSAgd3JpdGVJNjQob3V0YnVmLCB0cmFuc2Zlci50KTsKLX0KLQotCi0vKiAtLS0gTUFJTiBSRUNVUlNJVkUgT1VUUFVUIEZVQ05USU9OIC0tICovCi0KLXN0YXRpYyBpbnQKLW91dHB1dF92YWwoUHlPYmplY3QqIG91dHB1dCwgUHlPYmplY3QqIHZhbHVlLCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpIHsKLSAgLyoKLSAgICogUmVmY291bnRpbmcgU3RyYXRlZ3k6Ci0gICAqCi0gICAqIFdlIGFzc3VtZSB0aGF0IGVsZW1lbnRzIG9mIHRoZSB0aHJpZnRfc3BlYyB0dXBsZSBhcmUgbm90IGdvaW5nIHRvIGJlCi0gICAqIG11dGF0ZWQsIHNvIHdlIGRvbid0IHJlZiBjb3VudCB0aG9zZSBhdCBhbGwuIE90aGVyIHRoYW4gdGhhdCwgd2UgdHJ5IHRvCi0gICAqIGtlZXAgYSByZWZlcmVuY2UgdG8gYWxsIHRoZSB1c2VyLWNyZWF0ZWQgb2JqZWN0cyB3aGlsZSB3ZSB3b3JrIHdpdGggdGhlbS4KLSAgICogb3V0cHV0X3ZhbCBhc3N1bWVzIHRoYXQgYSByZWZlcmVuY2UgaXMgYWxyZWFkeSBoZWxkLiBUaGUgKmNhbGxlciogaXMKLSAgICogcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHJlZmVyZW5jZXMKLSAgICovCi0KLSAgc3dpdGNoICh0eXBlKSB7Ci0KLSAgY2FzZSBUX0JPT0w6IHsKLSAgICBpbnQgdiA9IFB5T2JqZWN0X0lzVHJ1ZSh2YWx1ZSk7Ci0gICAgaWYgKHYgPT0gLTEpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUJ5dGUob3V0cHV0LCAoaW50OF90KSB2KTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTA4OiB7Ci0gICAgaW50MzJfdCB2YWw7Ci0KLSAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCBJTlQ4X01JTiwgSU5UOF9NQVgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgKGludDhfdCkgdmFsKTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTE2OiB7Ci0gICAgaW50MzJfdCB2YWw7Ci0KLSAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCBJTlQxNl9NSU4sIElOVDE2X01BWCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZUkxNihvdXRwdXQsIChpbnQxNl90KSB2YWwpOwotICAgIGJyZWFrOwotICB9Ci0gIGNhc2UgVF9JMzI6IHsKLSAgICBpbnQzMl90IHZhbDsKLQotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIElOVDMyX01JTiwgSU5UMzJfTUFYKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTMyKG91dHB1dCwgdmFsKTsKLSAgICBicmVhazsKLSAgfQotICBjYXNlIFRfSTY0OiB7Ci0gICAgaW50NjRfdCBudmFsID0gUHlMb25nX0FzTG9uZ0xvbmcodmFsdWUpOwotCi0gICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKG52YWwpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFDSEVDS19SQU5HRShudmFsLCBJTlQ2NF9NSU4sIElOVDY0X01BWCkpIHsKLSAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTY0KG91dHB1dCwgbnZhbCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfRE9VQkxFOiB7Ci0gICAgZG91YmxlIG52YWwgPSBQeUZsb2F0X0FzRG91YmxlKHZhbHVlKTsKLSAgICBpZiAobnZhbCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3cml0ZURvdWJsZShvdXRwdXQsIG52YWwpOwotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX1NUUklORzogewotICAgIFB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfU2l6ZSh2YWx1ZSk7Ci0KLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlSTMyKG91dHB1dCwgKGludDMyX3QpIGxlbik7Ci0gICAgUHljU3RyaW5nSU8tPmN3cml0ZShvdXRwdXQsIFB5U3RyaW5nX0FzU3RyaW5nKHZhbHVlKSwgKGludDMyX3QpIGxlbik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfTElTVDoKLSAgY2FzZSBUX1NFVDogewotICAgIFB5X3NzaXplX3QgbGVuOwotICAgIFNldExpc3RUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIFB5T2JqZWN0ICppdGVtOwotICAgIFB5T2JqZWN0ICppdGVyYXRvcjsKLQotICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gUHlPYmplY3RfTGVuZ3RoKHZhbHVlKTsKLQotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy5lbGVtZW50X3R5cGUpOwotICAgIHdyaXRlSTMyKG91dHB1dCwgKGludDMyX3QpIGxlbik7Ci0KLSAgICBpdGVyYXRvciA9ICBQeU9iamVjdF9HZXRJdGVyKHZhbHVlKTsKLSAgICBpZiAoaXRlcmF0b3IgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0ZXJhdG9yKSkpIHsKLSAgICAgIGlmICghb3V0cHV0X3ZhbChvdXRwdXQsIGl0ZW0sIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVyYXRvcik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICB9Ci0KLSAgICBQeV9ERUNSRUYoaXRlcmF0b3IpOwotCi0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9NQVA6IHsKLSAgICBQeU9iamVjdCAqaywgKnY7Ci0gICAgUHlfc3NpemVfdCBwb3MgPSAwOwotICAgIFB5X3NzaXplX3QgbGVuOwotCi0gICAgTWFwVHlwZUFyZ3MgcGFyc2VkYXJnczsKLQotICAgIGxlbiA9IFB5RGljdF9TaXplKHZhbHVlKTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghcGFyc2VfbWFwX2FyZ3MoJnBhcnNlZGFyZ3MsIHR5cGVhcmdzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIHBhcnNlZGFyZ3Mua3RhZyk7Ci0gICAgd3JpdGVCeXRlKG91dHB1dCwgcGFyc2VkYXJncy52dGFnKTsKLSAgICB3cml0ZUkzMihvdXRwdXQsIGxlbik7Ci0KLSAgICAvLyBUT0RPKGJtYXVyZXIpOiBzaG91bGQgc3VwcG9ydCBhbnkgbWFwcGluZywgbm90IGp1c3QgZGljdHMKLSAgICB3aGlsZSAoUHlEaWN0X05leHQodmFsdWUsICZwb3MsICZrLCAmdikpIHsKLSAgICAgIC8vIFRPRE8oZHJlaXNzKTogVGhpbmsgaGFyZCBhYm91dCB3aGV0aGVyIHRoZXNlIElOQ1JFRnMgYWN0dWFsbHkKLSAgICAgIC8vICAgICAgICAgICAgICAgdHVybiBhbnkgdW5zYWZlIHNjZW5hcmlvcyBpbnRvIHNhZmUgc2NlbmFyaW9zLgotICAgICAgUHlfSU5DUkVGKGspOwotICAgICAgUHlfSU5DUkVGKHYpOwotCi0gICAgICBpZiAoIW91dHB1dF92YWwob3V0cHV0LCBrLCBwYXJzZWRhcmdzLmt0YWcsIHBhcnNlZGFyZ3Mua3R5cGVhcmdzKQotICAgICAgICAgIHx8ICFvdXRwdXRfdmFsKG91dHB1dCwgdiwgcGFyc2VkYXJncy52dGFnLCBwYXJzZWRhcmdzLnZ0eXBlYXJncykpIHsKLSAgICAgICAgUHlfREVDUkVGKGspOwotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFB5X0RFQ1JFRihrKTsKLSAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJyZWFraW5nIHRoaXMgb3V0IGFzIGEgZnVuY3Rpb24KLSAgLy8gICAgICAgICAgICAgICB0aGUgd2F5IHdlIGRpZCBmb3IgZGVjb2RlX3N0cnVjdC4KLSAgY2FzZSBUX1NUUlVDVDogewotICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0gICAgUHlfc3NpemVfdCBuc3BlYzsKLSAgICBQeV9zc2l6ZV90IGk7Ci0KLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBuc3BlYyA9IFB5VHVwbGVfU2l6ZShwYXJzZWRhcmdzLnNwZWMpOwotCi0gICAgaWYgKG5zcGVjID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG5zcGVjOyBpKyspIHsKLSAgICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7Ci0gICAgICBQeU9iamVjdCogc3BlY190dXBsZTsKLSAgICAgIFB5T2JqZWN0KiBpbnN0dmFsID0gTlVMTDsKLQotICAgICAgc3BlY190dXBsZSA9IFB5VHVwbGVfR0VUX0lURU0ocGFyc2VkYXJncy5zcGVjLCBpKTsKLSAgICAgIGlmIChzcGVjX3R1cGxlID09IFB5X05vbmUpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYyAoJnBhcnNlZHNwZWMsIHNwZWNfdHVwbGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaW5zdHZhbCA9IFB5T2JqZWN0X0dldEF0dHIodmFsdWUsIHBhcnNlZHNwZWMuYXR0cm5hbWUpOwotCi0gICAgICBpZiAoIWluc3R2YWwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAoaW5zdHZhbCA9PSBQeV9Ob25lKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpbnN0dmFsKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpIHBhcnNlZHNwZWMudHlwZSk7Ci0gICAgICB3cml0ZUkxNihvdXRwdXQsIHBhcnNlZHNwZWMudGFnKTsKLQotICAgICAgaWYgKCFvdXRwdXRfdmFsKG91dHB1dCwgaW5zdHZhbCwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKSkgewotICAgICAgICBQeV9ERUNSRUYoaW5zdHZhbCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgUHlfREVDUkVGKGluc3R2YWwpOwotICAgIH0KLQotICAgIHdyaXRlQnl0ZShvdXRwdXQsIChpbnQ4X3QpVF9TVE9QKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9TVE9QOgotICBjYXNlIFRfVk9JRDoKLSAgY2FzZSBUX1VURjE2OgotICBjYXNlIFRfVVRGODoKLSAgY2FzZSBUX1U2NDoKLSAgZGVmYXVsdDoKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVW5leHBlY3RlZCBUVHlwZSIpOwotICAgIHJldHVybiBmYWxzZTsKLQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogLS0tIFRPUC1MRVZFTCBXUkFQUEVSIEZPUiBPVVRQVVQgLS0gKi8KLQotc3RhdGljIFB5T2JqZWN0ICoKLWVuY29kZV9iaW5hcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSB7Ci0gIFB5T2JqZWN0KiBlbmNfb2JqOwotICBQeU9iamVjdCogdHlwZV9hcmdzOwotICBQeU9iamVjdCogYnVmOwotICBQeU9iamVjdCogcmV0ID0gTlVMTDsKLQotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PIiwgJmVuY19vYmosICZ0eXBlX2FyZ3MpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBidWYgPSBQeWNTdHJpbmdJTy0+TmV3T3V0cHV0KElOSVRfT1VUQlVGX1NJWkUpOwotICBpZiAob3V0cHV0X3ZhbChidWYsIGVuY19vYmosIFRfU1RSVUNULCB0eXBlX2FyZ3MpKSB7Ci0gICAgcmV0ID0gUHljU3RyaW5nSU8tPmNnZXR2YWx1ZShidWYpOwotICB9Ci0KLSAgUHlfREVDUkVGKGJ1Zik7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qID09PT09PSBFTkQgV1JJVElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLQotLyogPT09PT09IEJFR0lOIFJFQURJTkcgRlVOQ1RJT05TID09PT09PSAqLwotCi0vKiAtLS0gTE9XLUxFVkVMIFJFQURJTkcgRlVOQ1RJT05TIC0tLSAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9kZWNvZGVidWYoRGVjb2RlQnVmZmVyKiBkKSB7Ci0gIFB5X1hERUNSRUYoZC0+c3RyaW5naW9idWYpOwotICBQeV9YREVDUkVGKGQtPnJlZmlsbF9jYWxsYWJsZSk7Ci19Ci0KLXN0YXRpYyBib29sCi1kZWNvZGVfYnVmZmVyX2Zyb21fb2JqKERlY29kZUJ1ZmZlciogZGVzdCwgUHlPYmplY3QqIG9iaikgewotICBkZXN0LT5zdHJpbmdpb2J1ZiA9IFB5T2JqZWN0X0dldEF0dHIob2JqLCBJTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19idWYpKTsKLSAgaWYgKCFkZXN0LT5zdHJpbmdpb2J1ZikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghUHljU3RyaW5nSU9fSW5wdXRDaGVjayhkZXN0LT5zdHJpbmdpb2J1ZikpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZihkZXN0KTsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHN0cmluZ2lvIGlucHV0Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZGVzdC0+cmVmaWxsX2NhbGxhYmxlID0gUHlPYmplY3RfR2V0QXR0cihvYmosIElOVEVSTl9TVFJJTkcoY3N0cmluZ2lvX3JlZmlsbCkpOwotCi0gIGlmKCFkZXN0LT5yZWZpbGxfY2FsbGFibGUpIHsKLSAgICBmcmVlX2RlY29kZWJ1ZihkZXN0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soZGVzdC0+cmVmaWxsX2NhbGxhYmxlKSkgewotICAgIGZyZWVfZGVjb2RlYnVmKGRlc3QpOwotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJleHBlY3RpbmcgY2FsbGFibGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgcmVhZEJ5dGVzKERlY29kZUJ1ZmZlciogaW5wdXQsIGNoYXIqKiBvdXRwdXQsIGludCBsZW4pIHsKLSAgaW50IHJlYWQ7Ci0KLSAgLy8gVE9ETyhkcmVpc3MpOiBEb24ndCBmZWFyIHRoZSBtYWxsb2MuICBUaGluayBhYm91dCB0YWtpbmcgYSBjb3B5IG9mCi0gIC8vICAgICAgICAgICAgICAgdGhlIHBhcnRpYWwgcmVhZCBpbnN0ZWFkIG9mIGZvcmNpbmcgdGhlIHRyYW5zcG9ydAotICAvLyAgICAgICAgICAgICAgIHRvIHByZXBlbmQgaXQgdG8gaXRzIGJ1ZmZlci4KLQotICByZWFkID0gUHljU3RyaW5nSU8tPmNyZWFkKGlucHV0LT5zdHJpbmdpb2J1Ziwgb3V0cHV0LCBsZW4pOwotCi0gIGlmIChyZWFkID09IGxlbikgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKHJlYWQgPT0gLTEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgUHlPYmplY3QqIG5ld2lvYnVmOwotCi0gICAgLy8gdXNpbmcgYnVpbGRpbmcgZnVuY3Rpb25zIGFzIHRoaXMgaXMgYSByYXJlIGNvZGVwYXRoCi0gICAgbmV3aW9idWYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oCi0gICAgICAgIGlucHV0LT5yZWZpbGxfY2FsbGFibGUsICJzI2kiLCAqb3V0cHV0LCByZWFkLCBsZW4sIE5VTEwpOwotICAgIGlmIChuZXdpb2J1ZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gbXVzdCBkbyB0aGlzICpBRlRFUiogdGhlIGNhbGwgc28gdGhhdCB3ZSBkb24ndCBkZXJlZiB0aGUgaW8gYnVmZmVyCi0gICAgUHlfQ0xFQVIoaW5wdXQtPnN0cmluZ2lvYnVmKTsKLSAgICBpbnB1dC0+c3RyaW5naW9idWYgPSBuZXdpb2J1ZjsKLQotICAgIHJlYWQgPSBQeWNTdHJpbmdJTy0+Y3JlYWQoaW5wdXQtPnN0cmluZ2lvYnVmLCBvdXRwdXQsIGxlbik7Ci0KLSAgICBpZiAocmVhZCA9PSBsZW4pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAocmVhZCA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUT0RPKGRyZWlzcyk6IFRoaXMgY291bGQgYmUgYSB2YWxpZCBjb2RlIHBhdGggZm9yIGJpZyBiaW5hcnkgYmxvYnMuCi0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICJyZWZpbGwgY2xhaW1lZCB0byBoYXZlIHJlZmlsbGVkIHRoZSBidWZmZXIsIGJ1dCBkaWRuJ3QhISIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgaW50OF90IHJlYWRCeXRlKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDhfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuICooaW50OF90KikgYnVmOwotfQotCi1zdGF0aWMgaW50MTZfdCByZWFkSTE2KERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgY2hhciogYnVmOwotICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmJ1Ziwgc2l6ZW9mKGludDE2X3QpKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiAoaW50MTZfdCkgbnRvaHMoKihpbnQxNl90KikgYnVmKTsKLX0KLQotc3RhdGljIGludDMyX3QgcmVhZEkzMihEZWNvZGVCdWZmZXIqIGlucHV0KSB7Ci0gIGNoYXIqIGJ1ZjsKLSAgaWYgKCFyZWFkQnl0ZXMoaW5wdXQsICZidWYsIHNpemVvZihpbnQzMl90KSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIChpbnQzMl90KSBudG9obCgqKGludDMyX3QqKSBidWYpOwotfQotCi0KLXN0YXRpYyBpbnQ2NF90IHJlYWRJNjQoRGVjb2RlQnVmZmVyKiBpbnB1dCkgewotICBjaGFyKiBidWY7Ci0gIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBzaXplb2YoaW50NjRfdCkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIChpbnQ2NF90KSBudG9obGwoKihpbnQ2NF90KikgYnVmKTsKLX0KLQotc3RhdGljIGRvdWJsZSByZWFkRG91YmxlKERlY29kZUJ1ZmZlciogaW5wdXQpIHsKLSAgdW5pb24gewotICAgIGludDY0X3QgZjsKLSAgICBkb3VibGUgdDsKLSAgfSB0cmFuc2ZlcjsKLQotICB0cmFuc2Zlci5mID0gcmVhZEk2NChpbnB1dCk7Ci0gIGlmICh0cmFuc2Zlci5mID09IC0xKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiB0cmFuc2Zlci50OwotfQotCi1zdGF0aWMgYm9vbAotY2hlY2tUeXBlQnl0ZShEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSBleHBlY3RlZCkgewotICBUVHlwZSBnb3QgPSByZWFkQnl0ZShpbnB1dCk7Ci0gIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRChnb3QpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGV4cGVjdGVkICE9IGdvdCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJnb3Qgd3JvbmcgdHR5cGUgd2hpbGUgcmVhZGluZyBmaWVsZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wKLXNraXAoRGVjb2RlQnVmZmVyKiBpbnB1dCwgVFR5cGUgdHlwZSkgewotI2RlZmluZSBTS0lQQllURVMobikgXAotICBkbyB7IFwKLSAgICBpZiAoIXJlYWRCeXRlcyhpbnB1dCwgJmR1bW15X2J1ZiwgKG4pKSkgeyBcCi0gICAgICByZXR1cm4gZmFsc2U7IFwKLSAgICB9IFwKLSAgfSB3aGlsZSgwKQotCi0gIGNoYXIqIGR1bW15X2J1ZjsKLQotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDoKLSAgY2FzZSBUX0kwODogU0tJUEJZVEVTKDEpOyBicmVhazsKLSAgY2FzZSBUX0kxNjogU0tJUEJZVEVTKDIpOyBicmVhazsKLSAgY2FzZSBUX0kzMjogU0tJUEJZVEVTKDQpOyBicmVhazsKLSAgY2FzZSBUX0k2NDoKLSAgY2FzZSBUX0RPVUJMRTogU0tJUEJZVEVTKDgpOyBicmVhazsKLQotICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgLy8gVE9ETyhkcmVpc3MpOiBGaW5kIG91dCBpZiB0aGVzZSBjaGVja19zc2l6ZV90MzJzIGFyZSByZWFsbHkgbmVjZXNzYXJ5LgotICAgIGludCBsZW4gPSByZWFkSTMyKGlucHV0KTsKLSAgICBpZiAoIWNoZWNrX3NzaXplX3RfMzIobGVuKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBTS0lQQllURVMobGVuKTsKLSAgICBicmVhazsKLSAgfQotCi0gIGNhc2UgVF9MSVNUOgotICBjYXNlIFRfU0VUOiB7Ci0gICAgVFR5cGUgZXR5cGU7Ci0gICAgaW50IGxlbiwgaTsKLQotICAgIGV0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChldHlwZSA9PSAtMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBpZiAoIXNraXAoaW5wdXQsIGV0eXBlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgY2FzZSBUX01BUDogewotICAgIFRUeXBlIGt0eXBlLCB2dHlwZTsKLSAgICBpbnQgbGVuLCBpOwotCi0gICAga3R5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKGt0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdnR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgaWYgKHZ0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmICghKHNraXAoaW5wdXQsIGt0eXBlKSAmJiBza2lwKGlucHV0LCB2dHlwZSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIFRUeXBlIHR5cGU7Ci0KLSAgICAgIHR5cGUgPSByZWFkQnl0ZShpbnB1dCk7Ci0gICAgICBpZiAodHlwZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0eXBlID09IFRfU1RPUCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIFNLSVBCWVRFUygyKTsgLy8gdGFnCi0gICAgICBpZiAoIXNraXAoaW5wdXQsIHR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBjYXNlIFRfU1RPUDoKLSAgY2FzZSBUX1ZPSUQ6Ci0gIGNhc2UgVF9VVEYxNjoKLSAgY2FzZSBUX1VURjg6Ci0gIGNhc2UgVF9VNjQ6Ci0gIGRlZmF1bHQ6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotCi0jdW5kZWYgU0tJUEJZVEVTCi19Ci0KLQotLyogLS0tIEhFTFBFUiBGVU5DVElPTiBGT1IgREVDT0RFX1ZBTCAtLS0gKi8KLQotc3RhdGljIFB5T2JqZWN0KgotZGVjb2RlX3ZhbChEZWNvZGVCdWZmZXIqIGlucHV0LCBUVHlwZSB0eXBlLCBQeU9iamVjdCogdHlwZWFyZ3MpOwotCi1zdGF0aWMgYm9vbAotZGVjb2RlX3N0cnVjdChEZWNvZGVCdWZmZXIqIGlucHV0LCBQeU9iamVjdCogb3V0cHV0LCBQeU9iamVjdCogc3BlY19zZXEpIHsKLSAgaW50IHNwZWNfc2VxX2xlbiA9IFB5VHVwbGVfU2l6ZShzcGVjX3NlcSk7Ci0gIGlmIChzcGVjX3NlcV9sZW4gPT0gLTEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB3aGlsZSAodHJ1ZSkgewotICAgIFRUeXBlIHR5cGU7Ci0gICAgaW50MTZfdCB0YWc7Ci0gICAgUHlPYmplY3QqIGl0ZW1fc3BlYzsKLSAgICBQeU9iamVjdCogZmllbGR2YWwgPSBOVUxMOwotICAgIFN0cnVjdEl0ZW1TcGVjIHBhcnNlZHNwZWM7Ci0KLSAgICB0eXBlID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmICh0eXBlID09IC0xKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh0eXBlID09IFRfU1RPUCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHRhZyA9IHJlYWRJMTYoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh0YWcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh0YWcgPj0gMCAmJiB0YWcgPCBzcGVjX3NlcV9sZW4pIHsKLSAgICAgIGl0ZW1fc3BlYyA9IFB5VHVwbGVfR0VUX0lURU0oc3BlY19zZXEsIHRhZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGl0ZW1fc3BlYyA9IFB5X05vbmU7Ci0gICAgfQotCi0gICAgaWYgKGl0ZW1fc3BlYyA9PSBQeV9Ob25lKSB7Ci0gICAgICBpZiAoIXNraXAoaW5wdXQsIHR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghcGFyc2Vfc3RydWN0X2l0ZW1fc3BlYygmcGFyc2Vkc3BlYywgaXRlbV9zcGVjKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAocGFyc2Vkc3BlYy50eXBlICE9IHR5cGUpIHsKLSAgICAgIGlmICghc2tpcChpbnB1dCwgdHlwZSkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInN0cnVjdCBmaWVsZCBoYWQgd3JvbmcgdHlwZSB3aGlsZSByZWFkaW5nIGFuZCBjYW4ndCBiZSBza2lwcGVkIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgIH0KLQotICAgIGZpZWxkdmFsID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2Vkc3BlYy50eXBlLCBwYXJzZWRzcGVjLnR5cGVhcmdzKTsKLSAgICBpZiAoZmllbGR2YWwgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyKG91dHB1dCwgcGFyc2Vkc3BlYy5hdHRybmFtZSwgZmllbGR2YWwpID09IC0xKSB7Ci0gICAgICBQeV9ERUNSRUYoZmllbGR2YWwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBQeV9ERUNSRUYoZmllbGR2YWwpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIC0tLSBNQUlOIFJFQ1VSU0lWRSBJTlBVVCBGVUNOVElPTiAtLS0gKi8KLQotLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCi1zdGF0aWMgUHlPYmplY3QqCi1kZWNvZGVfdmFsKERlY29kZUJ1ZmZlciogaW5wdXQsIFRUeXBlIHR5cGUsIFB5T2JqZWN0KiB0eXBlYXJncykgewotICBzd2l0Y2ggKHR5cGUpIHsKLQotICBjYXNlIFRfQk9PTDogewotICAgIGludDhfdCB2ID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3dpdGNoICh2KSB7Ci0gICAgY2FzZSAwOiBQeV9SRVRVUk5fRkFMU0U7Ci0gICAgY2FzZSAxOiBQeV9SRVRVUk5fVFJVRTsKLSAgICAvLyBEb24ndCBsYXVnaC4gIFRoaXMgaXMgYSBwb3RlbnRpYWxseSBzZXJpb3VzIGlzc3VlLgotICAgIGRlZmF1bHQ6IFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJib29sZWFuIG91dCBvZiByYW5nZSIpOyByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgY2FzZSBUX0kwODogewotICAgIGludDhfdCB2ID0gcmVhZEJ5dGUoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHYpOwotICB9Ci0gIGNhc2UgVF9JMTY6IHsKLSAgICBpbnQxNl90IHYgPSByZWFkSTE2KGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodik7Ci0gIH0KLSAgY2FzZSBUX0kzMjogewotICAgIGludDMyX3QgdiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmIChJTlRfQ09OVl9FUlJPUl9PQ0NVUlJFRCh2KSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2KTsKLSAgfQotCi0gIGNhc2UgVF9JNjQ6IHsKLSAgICBpbnQ2NF90IHYgPSByZWFkSTY0KGlucHV0KTsKLSAgICBpZiAoSU5UX0NPTlZfRVJST1JfT0NDVVJSRUQodikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IEZpbmQgb3V0IGlmIHdlIGNhbiB0YWtlIHRoaXMgZmFzdHBhdGggYWx3YXlzIHdoZW4KLSAgICAvLyAgICAgICAgICAgICAgIHNpemVvZihsb25nKSA9PSBzaXplb2YobG9uZyBsb25nKS4KLSAgICBpZiAoQ0hFQ0tfUkFOR0UodiwgTE9OR19NSU4sIExPTkdfTUFYKSkgewotICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSB2KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh2KTsKLSAgfQotCi0gIGNhc2UgVF9ET1VCTEU6IHsKLSAgICBkb3VibGUgdiA9IHJlYWREb3VibGUoaW5wdXQpOwotICAgIGlmICh2ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHYpOwotICB9Ci0KLSAgY2FzZSBUX1NUUklORzogewotICAgIFB5X3NzaXplX3QgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgY2hhciogYnVmOwotICAgIGlmICghcmVhZEJ5dGVzKGlucHV0LCAmYnVmLCBsZW4pKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoYnVmLCBsZW4pOwotICB9Ci0KLSAgY2FzZSBUX0xJU1Q6Ci0gIGNhc2UgVF9TRVQ6IHsKLSAgICBTZXRMaXN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBQeU9iamVjdCogcmV0ID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIGlmICghcGFyc2Vfc2V0X2xpc3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlKSkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbGVuID0gcmVhZEkzMihpbnB1dCk7Ci0gICAgaWYgKCFjaGVja19zc2l6ZV90XzMyKGxlbikpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldCA9IFB5TGlzdF9OZXcobGVuKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBQeU9iamVjdCogaXRlbSA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZGFyZ3MuZWxlbWVudF90eXBlLCBwYXJzZWRhcmdzLnR5cGVhcmdzKTsKLSAgICAgIGlmICghaXRlbSkgewotICAgICAgICBQeV9ERUNSRUYocmV0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBQeUxpc3RfU0VUX0lURU0ocmV0LCBpLCBpdGVtKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGRyZWlzcyk6IENvbnNpZGVyIGJpdGluZyB0aGUgYnVsbGV0IGFuZCBtYWtpbmcgdHdvIHNlcGFyYXRlIGNhc2VzCi0gICAgLy8gICAgICAgICAgICAgICBmb3IgbGlzdCBhbmQgc2V0LCBhdm9pZGluZyB0aGlzIHBvc3QgZmFjdG8gY29udmVyc2lvbi4KLSAgICBpZiAodHlwZSA9PSBUX1NFVCkgewotICAgICAgUHlPYmplY3QqIHNldHJldDsKLSNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQotICAgICAgLy8gaGFjayBuZWVkZWQgZm9yIG9sZGVyIHZlcnNpb25zCi0gICAgICBzZXRyZXQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCopJlB5U2V0X1R5cGUsIHJldCwgTlVMTCk7Ci0jZWxzZQotICAgICAgLy8gb2ZmaWNpYWwgdmVyc2lvbgotICAgICAgc2V0cmV0ID0gUHlTZXRfTmV3KHJldCk7Ci0jZW5kaWYKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIHNldHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIGNhc2UgVF9NQVA6IHsKLSAgICBpbnQzMl90IGxlbjsKLSAgICBpbnQgaTsKLSAgICBNYXBUeXBlQXJncyBwYXJzZWRhcmdzOwotICAgIFB5T2JqZWN0KiByZXQgPSBOVUxMOwotCi0gICAgaWYgKCFwYXJzZV9tYXBfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3Mua3RhZykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIWNoZWNrVHlwZUJ5dGUoaW5wdXQsIHBhcnNlZGFyZ3MudnRhZykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxlbiA9IHJlYWRJMzIoaW5wdXQpOwotICAgIGlmICghY2hlY2tfc3NpemVfdF8zMihsZW4pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0ID0gUHlEaWN0X05ldygpOwotICAgIGlmICghcmV0KSB7Ci0gICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgUHlPYmplY3QqIGsgPSBOVUxMOwotICAgICAgUHlPYmplY3QqIHYgPSBOVUxMOwotICAgICAgayA9IGRlY29kZV92YWwoaW5wdXQsIHBhcnNlZGFyZ3Mua3RhZywgcGFyc2VkYXJncy5rdHlwZWFyZ3MpOwotICAgICAgaWYgKGsgPT0gTlVMTCkgewotICAgICAgICBnb3RvIGxvb3BfZXJyb3I7Ci0gICAgICB9Ci0gICAgICB2ID0gZGVjb2RlX3ZhbChpbnB1dCwgcGFyc2VkYXJncy52dGFnLCBwYXJzZWRhcmdzLnZ0eXBlYXJncyk7Ci0gICAgICBpZiAodiA9PSBOVUxMKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLSAgICAgIGlmIChQeURpY3RfU2V0SXRlbShyZXQsIGssIHYpID09IC0xKSB7Ci0gICAgICAgIGdvdG8gbG9vcF9lcnJvcjsKLSAgICAgIH0KLQotICAgICAgUHlfREVDUkVGKGspOwotICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgY29udGludWU7Ci0KLSAgICAgIC8vIFl1Y2shICBEZXN0cnVjdG9ycywgYW55b25lPwotICAgICAgbG9vcF9lcnJvcjoKLSAgICAgIFB5X1hERUNSRUYoayk7Ci0gICAgICBQeV9YREVDUkVGKHYpOwotICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotCi0gICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZXQpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY2FzZSBUX1NUUlVDVDogewotICAgIFN0cnVjdFR5cGVBcmdzIHBhcnNlZGFyZ3M7Ci0JUHlPYmplY3QqIHJldDsKLSAgICBpZiAoIXBhcnNlX3N0cnVjdF9hcmdzKCZwYXJzZWRhcmdzLCB0eXBlYXJncykpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldCA9IFB5T2JqZWN0X0NhbGxPYmplY3QocGFyc2VkYXJncy5rbGFzcywgTlVMTCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghZGVjb2RlX3N0cnVjdChpbnB1dCwgcmV0LCBwYXJzZWRhcmdzLnNwZWMpKSB7Ci0gICAgICBQeV9ERUNSRUYocmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBjYXNlIFRfU1RPUDoKLSAgY2FzZSBUX1ZPSUQ6Ci0gIGNhc2UgVF9VVEYxNjoKLSAgY2FzZSBUX1VURjg6Ci0gIGNhc2UgVF9VNjQ6Ci0gIGRlZmF1bHQ6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVuZXhwZWN0ZWQgVFR5cGUiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi0KLS8qIC0tLSBUT1AtTEVWRUwgV1JBUFBFUiBGT1IgSU5QVVQgLS0gKi8KLQotc3RhdGljIFB5T2JqZWN0KgotZGVjb2RlX2JpbmFyeShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgUHlPYmplY3QqIG91dHB1dF9vYmogPSBOVUxMOwotICBQeU9iamVjdCogdHJhbnNwb3J0ID0gTlVMTDsKLSAgUHlPYmplY3QqIHR5cGVhcmdzID0gTlVMTDsKLSAgU3RydWN0VHlwZUFyZ3MgcGFyc2VkYXJnczsKLSAgRGVjb2RlQnVmZmVyIGlucHV0ID0gezAsIDB9OwotICAKLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT08iLCAmb3V0cHV0X29iaiwgJnRyYW5zcG9ydCwgJnR5cGVhcmdzKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKCFwYXJzZV9zdHJ1Y3RfYXJncygmcGFyc2VkYXJncywgdHlwZWFyZ3MpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIWRlY29kZV9idWZmZXJfZnJvbV9vYmooJmlucHV0LCB0cmFuc3BvcnQpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIWRlY29kZV9zdHJ1Y3QoJmlucHV0LCBvdXRwdXRfb2JqLCBwYXJzZWRhcmdzLnNwZWMpKSB7Ci0gICAgZnJlZV9kZWNvZGVidWYoJmlucHV0KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGZyZWVfZGVjb2RlYnVmKCZpbnB1dCk7Ci0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLS8qID09PT09PSBFTkQgUkVBRElORyBGVU5DVElPTlMgPT09PT09ICovCi0KLQotLyogLS0gUFlUSE9OIE1PRFVMRSBTRVRVUCBTVFVGRiAtLS0gKi8KLQotc3RhdGljIFB5TWV0aG9kRGVmIFRocmlmdEZhc3RCaW5hcnlNZXRob2RzW10gPSB7Ci0KLSAgeyJlbmNvZGVfYmluYXJ5IiwgIGVuY29kZV9iaW5hcnksIE1FVEhfVkFSQVJHUywgIiJ9LAotICB7ImRlY29kZV9iaW5hcnkiLCAgZGVjb2RlX2JpbmFyeSwgTUVUSF9WQVJBUkdTLCAiIn0sCi0KLSAge05VTEwsIE5VTEwsIDAsIE5VTEx9ICAgICAgICAvKiBTZW50aW5lbCAqLwotfTsKLQotUHlNT0RJTklUX0ZVTkMKLWluaXRmYXN0YmluYXJ5KHZvaWQpIHsKLSNkZWZpbmUgSU5JVF9JTlRFUk5fU1RSSU5HKHZhbHVlKSBcCi0gIGRvIHsgXAotICAgIElOVEVSTl9TVFJJTkcodmFsdWUpID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygjdmFsdWUpOyBcCi0gICAgaWYoIUlOVEVSTl9TVFJJTkcodmFsdWUpKSByZXR1cm47IFwKLSAgfSB3aGlsZSgwKQotCi0gIElOSVRfSU5URVJOX1NUUklORyhjc3RyaW5naW9fYnVmKTsKLSAgSU5JVF9JTlRFUk5fU1RSSU5HKGNzdHJpbmdpb19yZWZpbGwpOwotI3VuZGVmIElOSVRfSU5URVJOX1NUUklORwotCi0gIFB5Y1N0cmluZ19JTVBPUlQ7Ci0gIGlmIChQeWNTdHJpbmdJTyA9PSBOVUxMKSByZXR1cm47Ci0KLSAgKHZvaWQpIFB5X0luaXRNb2R1bGUoInRocmlmdC5wcm90b2NvbC5mYXN0YmluYXJ5IiwgVGhyaWZ0RmFzdEJpbmFyeU1ldGhvZHMpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQppbmRleCA2ZjkyMTczLi44NWNmNDAwIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQpAQCAtMTcsNzEgKzE3LDkwIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKK2ltcG9ydCBzc2wKKworZnJvbSBzaXgubW92ZXMgaW1wb3J0IEJhc2VIVFRQU2VydmVyCiAKIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFNlcnZlcgogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiAKIAogY2xhc3MgUmVzcG9uc2VFeGNlcHRpb24oRXhjZXB0aW9uKToKLSAgIiIiQWxsb3dzIGhhbmRsZXJzIHRvIG92ZXJyaWRlIHRoZSBIVFRQIHJlc3BvbnNlCisgICAgIiIiQWxsb3dzIGhhbmRsZXJzIHRvIG92ZXJyaWRlIHRoZSBIVFRQIHJlc3BvbnNlCiAKLSAgTm9ybWFsbHksIFRIdHRwU2VydmVyIGFsd2F5cyBzZW5kcyBhIDIwMCByZXNwb25zZS4gIElmIGEgaGFuZGxlciB3YW50cwotICB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIChlLmcuLCB0byBzaW11bGF0ZSBhIG1pc2NvbmZpZ3VyZWQgb3IKLSAgb3ZlcmxvYWRlZCB3ZWIgc2VydmVyIGR1cmluZyB0ZXN0aW5nKSwgaXQgY2FuIHJhaXNlIGEgUmVzcG9uc2VFeGNlcHRpb24uCi0gIFRoZSBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCi0gIFJlcXVlc3RIYW5kbGVyIGFzIGl0cyBvbmx5IGFyZ3VtZW50LgotICAiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXIpOgotICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKKyAgICBOb3JtYWxseSwgVEh0dHBTZXJ2ZXIgYWx3YXlzIHNlbmRzIGEgMjAwIHJlc3BvbnNlLiAgSWYgYSBoYW5kbGVyIHdhbnRzCisgICAgdG8gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciAoZS5nLiwgdG8gc2ltdWxhdGUgYSBtaXNjb25maWd1cmVkIG9yCisgICAgb3ZlcmxvYWRlZCB3ZWIgc2VydmVyIGR1cmluZyB0ZXN0aW5nKSwgaXQgY2FuIHJhaXNlIGEgUmVzcG9uc2VFeGNlcHRpb24uCisgICAgVGhlIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICBSZXF1ZXN0SGFuZGxlciBhcyBpdHMgb25seSBhcmd1bWVudC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcik6CisgICAgICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKIAogCiBjbGFzcyBUSHR0cFNlcnZlcihUU2VydmVyLlRTZXJ2ZXIpOgotICAiIiJBIHNpbXBsZSBIVFRQLWJhc2VkIFRocmlmdCBzZXJ2ZXIKKyAgICAiIiJBIHNpbXBsZSBIVFRQLWJhc2VkIFRocmlmdCBzZXJ2ZXIKIAotICBUaGlzIGNsYXNzIGlzIG5vdCB2ZXJ5IHBlcmZvcm1hbnQsIGJ1dCBpdCBpcyB1c2VmdWwgKGZvciBleGFtcGxlKSBmb3IKLSAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LgotICAiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgICAgICAgICBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICBzZXJ2ZXJfYWRkcmVzcywKLSAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5PU5vbmUsCi0gICAgICAgICAgICAgICBzZXJ2ZXJfY2xhc3M9QmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcik6Ci0gICAgIiIiU2V0IHVwIHByb3RvY29sIGZhY3RvcmllcyBhbmQgSFRUUCBzZXJ2ZXIuCi0KLSAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgotICAgIFNlZSBUU2VydmVyIGZvciBwcm90b2NvbCBmYWN0b3JpZXMuCisgICAgVGhpcyBjbGFzcyBpcyBub3QgdmVyeSBwZXJmb3JtYW50LCBidXQgaXQgaXMgdXNlZnVsIChmb3IgZXhhbXBsZSkgZm9yCisgICAgYWN0aW5nIGFzIGEgbW9jayB2ZXJzaW9uIG9mIGFuIEFwYWNoZS1iYXNlZCBQSFAgVGhyaWZ0IGVuZHBvaW50LgogICAgICIiIgotICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgotICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzZXJ2ZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lLAorICAgICAgICAgICAgICAgICBzZXJ2ZXJfY2xhc3M9QmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgKiprd2FyZ3MpOgorICAgICAgICAiIiJTZXQgdXAgcHJvdG9jb2wgZmFjdG9yaWVzIGFuZCBIVFRQIChvciBIVFRQUykgc2VydmVyLgogCi0gICAgVFNlcnZlci5UU2VydmVyLl9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgTm9uZSwgTm9uZSwgTm9uZSwKLSAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgU2VlIEJhc2VIVFRQU2VydmVyIGZvciBzZXJ2ZXJfYWRkcmVzcy4KKyAgICAgICAgU2VlIFRTZXJ2ZXIgZm9yIHByb3RvY29sIGZhY3Rvcmllcy4KIAotICAgIHRodHRwc2VydmVyID0gc2VsZgorICAgICAgICBUbyBtYWtlIGEgc2VjdXJlIHNlcnZlciwgcHJvdmlkZSB0aGUgbmFtZWQgYXJndW1lbnRzOgorICAgICAgICAqIGNhZmlsZSAgICAtIHRvIHZhbGlkYXRlIGNsaWVudHMgW29wdGlvbmFsXQorICAgICAgICAqIGNlcnRfZmlsZSAtIHRoZSBzZXJ2ZXIgY2VydAorICAgICAgICAqIGtleV9maWxlICAtIHRoZSBzZXJ2ZXIncyBrZXkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkKIAotICAgIGNsYXNzIFJlcXVlc3RIYW5kZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6Ci0gICAgICBkZWYgZG9fUE9TVChzZWxmKToKLSAgICAgICAgIyBEb24ndCBjYXJlIGFib3V0IHRoZSByZXF1ZXN0IHBhdGguCi0gICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEZpbGVPYmplY3RUcmFuc3BvcnQoc2VsZi5yZmlsZSkKLSAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLndmaWxlKQotICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCgKLSAgICAgICAgICBpdHJhbnMsIGludChzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10pKQotICAgICAgICBvdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgICAgICBpcHJvdCA9IHRodHRwc2VydmVyLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgb3Byb3QgPSB0aHR0cHNlcnZlci5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgdGh0dHBzZXJ2ZXIucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgICBleGNlcHQgUmVzcG9uc2VFeGNlcHRpb24gYXMgZXhuOgotICAgICAgICAgIGV4bi5oYW5kbGVyKHNlbGYpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJjb250ZW50LXR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQotICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUob3RyYW5zLmdldHZhbHVlKCkpCisgICAgICAgIFRTZXJ2ZXIuVFNlcnZlci5fX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIE5vbmUsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQogCi0gICAgc2VsZi5odHRwZCA9IHNlcnZlcl9jbGFzcyhzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRlcikKKyAgICAgICAgdGh0dHBzZXJ2ZXIgPSBzZWxmCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGNsYXNzIFJlcXVlc3RIYW5kZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgZG9fUE9TVChzZWxmKToKKyAgICAgICAgICAgICAgICAjIERvbid0IGNhcmUgYWJvdXQgdGhlIHJlcXVlc3QgcGF0aC4KKyAgICAgICAgICAgICAgICBpdHJhbnMgPSBUVHJhbnNwb3J0LlRGaWxlT2JqZWN0VHJhbnNwb3J0KHNlbGYucmZpbGUpCisgICAgICAgICAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5URmlsZU9iamVjdFRyYW5zcG9ydChzZWxmLndmaWxlKQorICAgICAgICAgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgICAgICBpdHJhbnMsIGludChzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10pKQorICAgICAgICAgICAgICAgIG90cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgICAgICAgICAgaXByb3QgPSB0aHR0cHNlcnZlci5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisgICAgICAgICAgICAgICAgb3Byb3QgPSB0aHR0cHNlcnZlci5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGh0dHBzZXJ2ZXIucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNwb25zZUV4Y2VwdGlvbiBhcyBleG46CisgICAgICAgICAgICAgICAgICAgIGV4bi5oYW5kbGVyKHNlbGYpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiY29udGVudC10eXBlIiwgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUob3RyYW5zLmdldHZhbHVlKCkpCisKKyAgICAgICAgc2VsZi5odHRwZCA9IHNlcnZlcl9jbGFzcyhzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRlcikKKworICAgICAgICBpZiAoa3dhcmdzLmdldCgnY2FmaWxlJykgb3Iga3dhcmdzLmdldCgnY2VydF9maWxlJykgb3Iga3dhcmdzLmdldCgna2V5X2ZpbGUnKSk6CisgICAgICAgICAgICBjb250ZXh0ID0gc3NsLmNyZWF0ZV9kZWZhdWx0X2NvbnRleHQoY2FmaWxlPWt3YXJncy5nZXQoJ2NhZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC5jaGVja19ob3N0bmFtZSA9IEZhbHNlCisgICAgICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSwga3dhcmdzLmdldCgna2V5X2ZpbGUnKSkKKyAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBlbHNlIHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIHNlbGYuaHR0cGQuc29ja2V0ID0gY29udGV4dC53cmFwX3NvY2tldChzZWxmLmh0dHBkLnNvY2tldCwgc2VydmVyX3NpZGU9VHJ1ZSkKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zZXJ2ZV9mb3JldmVyKCkKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgc2VsZi5odHRwZC5zb2NrZXQuY2xvc2UoKQorICAgICAgICAjIHNlbGYuaHR0cGQuc2h1dGRvd24oKSAjIGhhbmdzIGZvcmV2ZXIsIHB5dGhvbiBkb2Vzbid0IGhhbmRsZSBQT0xMTlZBTCBwcm9wZXJseSEKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQppbmRleCBmYTQ3OGQwLi5mNjJkNDg2IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CkBAIC0yNCwxOCArMjQsMjMgQEAKIFRoZSB0aHJlYWQgcG9vb2wgc2hvdWxkIGJlIHNpemVkIGZvciBjb25jdXJyZW50IHRhc2tzLCBub3QKIG1heGltdW0gY29ubmVjdGlvbnMKICIiIgotaW1wb3J0IHRocmVhZGluZwotaW1wb3J0IHNvY2tldAotaW1wb3J0IFF1ZXVlCi1pbXBvcnQgc2VsZWN0Ci1pbXBvcnQgc3RydWN0CisKIGltcG9ydCBsb2dnaW5nCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3RydWN0CitpbXBvcnQgdGhyZWFkaW5nCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CiBmcm9tIHRocmlmdC5wcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkKIAogX19hbGxfXyA9IFsnVE5vbmJsb2NraW5nU2VydmVyJ10KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCisKIAogY2xhc3MgV29ya2VyKHRocmVhZGluZy5UaHJlYWQpOgogICAgICIiIldvcmtlciBpcyBhIHNtYWxsIGhlbHBlciB0byBwcm9jZXNzIGluY29taW5nIGNvbm5lY3Rpb24uIiIiCkBAIC01NCw4ICs1OSw5IEBACiAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICAgICAgICAgIGNhbGxiYWNrKFRydWUsIG90cmFucy5nZXR2YWx1ZSgpKQogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgcmVxdWVzdCIpCi0gICAgICAgICAgICAgICAgY2FsbGJhY2soRmFsc2UsICcnKQorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBwcm9jZXNzaW5nIHJlcXVlc3QiLCBleGNfaW5mbz1UcnVlKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrKEZhbHNlLCBiJycpCisKIAogV0FJVF9MRU4gPSAwCiBXQUlUX01FU1NBR0UgPSAxCkBAIC04MSwxMSArODcsMjQgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdpZ25vcmluZyBzb2NrZXQgZXhjZXB0aW9uJywgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgIHJldHVybiByZWFkCiAKIAotY2xhc3MgQ29ubmVjdGlvbjoKK2NsYXNzIE1lc3NhZ2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBsZW5fLCBoZWFkZXIpOgorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLmxlbiA9IGxlbl8KKyAgICAgICAgc2VsZi5idWZmZXIgPSBOb25lCisgICAgICAgIHNlbGYuaXNfaGVhZGVyID0gaGVhZGVyCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQgKyBzZWxmLmxlbgorCisKK2NsYXNzIENvbm5lY3Rpb24ob2JqZWN0KToKICAgICAiIiJCYXNpYyBjbGFzcyBpcyByZXByZXNlbnRlZCBjb25uZWN0aW9uLgogCiAgICAgSXQgY2FuIGJlIGluIHN0YXRlOgpAQCAtMTAyLDY4ICsxMjEsNjAgQEAKICAgICAgICAgc2VsZi5zb2NrZXQuc2V0YmxvY2tpbmcoRmFsc2UpCiAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgc2VsZi5sZW4gPSAwCi0gICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCisgICAgICAgIHNlbGYucmVjZWl2ZWQgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgIHNlbGYuX3JidWYgPSBiJycKKyAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgIHNlbGYud2FrZV91cCA9IHdha2VfdXAKLQotICAgIGRlZiBfcmVhZF9sZW4oc2VsZik6Ci0gICAgICAgICIiIlJlYWRzIGxlbmd0aCBvZiByZXF1ZXN0LgotCi0gICAgICAgIEl0J3MgYSBzYWZlciBhbHRlcm5hdGl2ZSB0byBzZWxmLnNvY2tldC5yZWN2KDQpCi0gICAgICAgICIiIgotICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdig0IC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgIyBpZiB3ZSByZWFkIDAgYnl0ZXMgYW5kIHNlbGYubWVzc2FnZSBpcyBlbXB0eSwgdGhlbgotICAgICAgICAgICAgIyB0aGUgY2xpZW50IGNsb3NlZCB0aGUgY29ubmVjdGlvbgotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgIT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJjYW4ndCByZWFkIGZyYW1lIHNpemUgZnJvbSBzb2NrZXQiKQotICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gNDoKLSAgICAgICAgICAgIHNlbGYubGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5tZXNzYWdlKQotICAgICAgICAgICAgaWYgc2VsZi5sZW4gPCAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoIm5lZ2F0aXZlIGZyYW1lIHNpemUsIGl0IHNlZW1zIGNsaWVudCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCB1c2UgRnJhbWVkVHJhbnNwb3J0IikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsaWYgc2VsZi5sZW4gPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnaW5nLmVycm9yKCJlbXB0eSBmcmFtZSwgaXQncyByZWFsbHkgc3RyYW5nZSIpCi0gICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9ICcnCi0gICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBGYWxzZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgcmVhZChzZWxmKToKICAgICAgICAgIiIiUmVhZHMgZGF0YSBmcm9tIHN0cmVhbSBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgaW4gKFdBSVRfTEVOLCBXQUlUX01FU1NBR0UpCi0gICAgICAgIGlmIHNlbGYuc3RhdHVzID09IFdBSVRfTEVOOgotICAgICAgICAgICAgc2VsZi5fcmVhZF9sZW4oKQotICAgICAgICAgICAgIyBnbyBiYWNrIHRvIHRoZSBtYWluIGxvb3AgaGVyZSBmb3Igc2ltcGxpY2l0eSBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAjIGZhbGxpbmcgdGhyb3VnaCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0Ci0gICAgICAgICAgICAjIHRoZSBtZXNzYWdlIGlzIGFscmVhZHkgYXZhaWxhYmxlCi0gICAgICAgIGVsaWYgc2VsZi5zdGF0dXMgPT0gV0FJVF9NRVNTQUdFOgotICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3Yoc2VsZi5sZW4gLSBsZW4oc2VsZi5tZXNzYWdlKSkKLSAgICAgICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgZnJvbSBzb2NrZXQgKGdldCAlZCBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQgYnl0ZXMpIiAlIChsZW4oc2VsZi5tZXNzYWdlKSwgc2VsZi5sZW4pKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYucmVjZWl2ZWQKKyAgICAgICAgYnVmX3NpemUgPSA4MTkyCisgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICBkb25lID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGRvbmU6CisgICAgICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdihidWZfc2l6ZSkKKyAgICAgICAgICAgIHJsZW4gPSBsZW4ocmVhZCkKKyAgICAgICAgICAgIGRvbmUgPSBybGVuIDwgYnVmX3NpemUKKyAgICAgICAgICAgIHNlbGYuX3JidWYgKz0gcmVhZAorICAgICAgICAgICAgaWYgZmlyc3QgYW5kIHJsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0YXR1cyAhPSBXQUlUX0xFTiBvciBzZWxmLl9yYnVmOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ2NvdWxkIG5vdCByZWFkIGZyYW1lIGZyb20gc29ja2V0JykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ3JlYWQgemVybyBsZW5ndGguIGNsaWVudCBtaWdodCBoYXZlIGRpc2Nvbm5lY3RlZCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgPT0gc2VsZi5sZW46CisgICAgICAgICAgICB3aGlsZSBsZW4oc2VsZi5fcmJ1ZikgPj0gc2VsZi5fcmVhZGluZy5lbmQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmVhZGluZy5pc19oZWFkZXI6CisgICAgICAgICAgICAgICAgICAgIG1sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLl9yYnVmWzo0XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGluZyA9IE1lc3NhZ2Uoc2VsZi5fcmVhZGluZy5lbmQsIG1sZW4sIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfTUVTU0FHRQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcuYnVmZmVyID0gc2VsZi5fcmJ1ZgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY2VpdmVkLmFwcGVuZChzZWxmLl9yZWFkaW5nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gc2VsZi5fcmJ1ZltzZWxmLl9yZWFkaW5nLmVuZDpdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBzZWxmLnJlY2VpdmVkOgogICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBub3QgZG9uZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgd3JpdGUoc2VsZik6CiAgICAgICAgICIiIldyaXRlcyBkYXRhIGZyb20gc29ja2V0IGFuZCBzd2l0Y2ggc3RhdGUuIiIiCiAgICAgICAgIGFzc2VydCBzZWxmLnN0YXR1cyA9PSBTRU5EX0FOU1dFUgotICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLm1lc3NhZ2UpCi0gICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYubWVzc2FnZSk6CisgICAgICAgIHNlbnQgPSBzZWxmLnNvY2tldC5zZW5kKHNlbGYuX3didWYpCisgICAgICAgIGlmIHNlbnQgPT0gbGVuKHNlbGYuX3didWYpOgogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5tZXNzYWdlW3NlbnQ6XQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IHNlbGYuX3didWZbc2VudDpdCiAKICAgICBAbG9ja2VkCiAgICAgZGVmIHJlYWR5KHNlbGYsIGFsbF9vaywgbWVzc2FnZSk6CkBAIC0xODMsMTMgKzE5NCwxMyBAQAogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLndha2VfdXAoKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubGVuID0gJycKKyAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGlmIGxlbihtZXNzYWdlKSA9PSAwOgogICAgICAgICAgICAgIyBpdCB3YXMgYSBvbmV3YXkgcmVxdWVzdCwgZG8gbm90IHdyaXRlIGFuc3dlcgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBiJycKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IHN0cnVjdC5wYWNrKCchaScsIGxlbihtZXNzYWdlKSkgKyBtZXNzYWdlCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gU0VORF9BTlNXRVIKICAgICAgICAgc2VsZi53YWtlX3VwKCkKIApAQCAtMjE5LDcgKzIzMCw3IEBACiAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKIAogCi1jbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXI6CitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXIob2JqZWN0KToKICAgICAiIiJOb24tYmxvY2tpbmcgc2VydmVyLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsCkBAIC0yMzQsNyArMjQ1LDcgQEAKICAgICAgICAgc2VsZi5vdXRfcHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnkgb3Igc2VsZi5pbl9wcm90b2NvbAogICAgICAgICBzZWxmLnRocmVhZHMgPSBpbnQodGhyZWFkcykKICAgICAgICAgc2VsZi5jbGllbnRzID0ge30KLSAgICAgICAgc2VsZi50YXNrcyA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi50YXNrcyA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICAgc2VsZi5fcmVhZCwgc2VsZi5fd3JpdGUgPSBzb2NrZXQuc29ja2V0cGFpcigpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQogICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKQEAgLTI1MCw3ICsyNjEsNyBAQAogICAgICAgICBpZiBzZWxmLnByZXBhcmVkOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuc29ja2V0Lmxpc3RlbigpCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgdGhyZWFkID0gV29ya2VyKHNlbGYudGFza3MpCiAgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKQpAQCAtMjU5LDcgKzI3MCw3IEBACiAgICAgZGVmIHdha2VfdXAoc2VsZik6CiAgICAgICAgICIiIldha2UgdXAgbWFpbiB0aHJlYWQuCiAKLSAgICAgICAgVGhlIHNlcnZlciB1c3VhbHkgd2FpdHMgaW4gc2VsZWN0IGNhbGwgaW4gd2Ugc2hvdWxkIHRlcm1pbmF0ZSBvbmUuCisgICAgICAgIFRoZSBzZXJ2ZXIgdXN1YWxseSB3YWl0cyBpbiBzZWxlY3QgY2FsbCBpbiB3ZSBzaG91bGQgdGVybWluYXRlIG9uZS4KICAgICAgICAgVGhlIHNpbXBsZXN0IHdheSBpcyB1c2luZyBzb2NrZXRwYWlyLgogCiAgICAgICAgIFNlbGVjdCBhbHdheXMgd2FpdCB0byByZWFkIGZyb20gdGhlIGZpcnN0IHNvY2tldCBvZiBzb2NrZXRwYWlyLgpAQCAtMjY3LDcgKzI3OCw3IEBACiAgICAgICAgIEluIHRoaXMgY2FzZSwgd2UgY2FuIGp1c3Qgd3JpdGUgYW55dGhpbmcgdG8gdGhlIHNlY29uZCBzb2NrZXQgZnJvbQogICAgICAgICBzb2NrZXRwYWlyLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fd3JpdGUuc2VuZCgnMScpCisgICAgICAgIHNlbGYuX3dyaXRlLnNlbmQoYicxJykKIAogICAgIGRlZiBzdG9wKHNlbGYpOgogICAgICAgICAiIiJTdG9wIHRoZSBzZXJ2ZXIuCkBAIC0yODgsMTQgKzI5OSwyMCBAQAogICAgICAgICAiIiJEb2VzIHNlbGVjdCBvbiBvcGVuIGNvbm5lY3Rpb25zLiIiIgogICAgICAgICByZWFkYWJsZSA9IFtzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCksIHNlbGYuX3JlYWQuZmlsZW5vKCldCiAgICAgICAgIHdyaXRhYmxlID0gW10KLSAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gc2VsZi5jbGllbnRzLml0ZW1zKCk6CisgICAgICAgIHJlbWFpbmluZyA9IFtdCisgICAgICAgIGZvciBpLCBjb25uZWN0aW9uIGluIGxpc3Qoc2VsZi5jbGllbnRzLml0ZW1zKCkpOgogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc19yZWFkYWJsZSgpOgogICAgICAgICAgICAgICAgIHJlYWRhYmxlLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVtYWluaW5nIG9yIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfd3JpdGVhYmxlKCk6CiAgICAgICAgICAgICAgICAgd3JpdGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX2Nsb3NlZCgpOgogICAgICAgICAgICAgICAgIGRlbCBzZWxmLmNsaWVudHNbaV0KLSAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkKKyAgICAgICAgaWYgcmVtYWluaW5nOgorICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZywgW10sIFtdLCBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QocmVhZGFibGUsIHdyaXRhYmxlLCByZWFkYWJsZSkgKyAoVHJ1ZSwpCiAKICAgICBkZWYgaGFuZGxlKHNlbGYpOgogICAgICAgICAiIiJIYW5kbGUgcmVxdWVzdHMuCkBAIC0zMDMsMjAgKzMyMCwyNyBAQAogICAgICAgICBXQVJOSU5HISBZb3UgbXVzdCBjYWxsIHByZXBhcmUoKSBCRUZPUkUgY2FsbGluZyBoYW5kbGUoKQogICAgICAgICAiIiIKICAgICAgICAgYXNzZXJ0IHNlbGYucHJlcGFyZWQsICJZb3UgaGF2ZSB0byBjYWxsIHByZXBhcmUgYmVmb3JlIGhhbmRsZSIKLSAgICAgICAgcnNldCwgd3NldCwgeHNldCA9IHNlbGYuX3NlbGVjdCgpCisgICAgICAgIHJzZXQsIHdzZXQsIHhzZXQsIHNlbGVjdGVkID0gc2VsZi5fc2VsZWN0KCkKICAgICAgICAgZm9yIHJlYWRhYmxlIGluIHJzZXQ6CiAgICAgICAgICAgICBpZiByZWFkYWJsZSA9PSBzZWxmLl9yZWFkLmZpbGVubygpOgogICAgICAgICAgICAgICAgICMgZG9uJ3QgY2FyZSBpIGp1c3QgbmVlZCB0byBjbGVhbiByZWFkYWJsZSBmbGFnCiAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZC5yZWN2KDEwMjQpCiAgICAgICAgICAgICBlbGlmIHJlYWRhYmxlID09IHNlbGYuc29ja2V0LmhhbmRsZS5maWxlbm8oKToKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKS5oYW5kbGUKLSAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndha2VfdXApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBpZiBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHNbY2xpZW50LmhhbmRsZS5maWxlbm8oKV0gPSBDb25uZWN0aW9uKGNsaWVudC5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2Vycm9yIHdoaWxlIGFjY2VwdGluZycsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBzZWxmLmNsaWVudHNbcmVhZGFibGVdCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5yZWFkKCkKLSAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLnN0YXR1cyA9PSBXQUlUX1BST0NFU1M6Ci0gICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoY29ubmVjdGlvbi5tZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24ucmVjZWl2ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc3RhdHVzID0gV0FJVF9QUk9DRVNTCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNvbm5lY3Rpb24ucmVjZWl2ZWQucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgIGl0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIobXNnLmJ1ZmZlciwgbXNnLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgb3RyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCiAgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbl9wcm90b2NvbC5nZXRQcm90b2NvbChpdHJhbnNwb3J0KQogICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0X3Byb3RvY29sLmdldFByb3RvY29sKG90cmFuc3BvcnQpCkBAIC0zMzAsNyArMzU0LDcgQEAKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgIiIiQ2xvc2VzIHRoZSBzZXJ2ZXIuIiIiCi0gICAgICAgIGZvciBfIGluIHhyYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICBmb3IgXyBpbiByYW5nZShzZWxmLnRocmVhZHMpOgogICAgICAgICAgICAgc2VsZi50YXNrcy5wdXQoW05vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmVdKQogICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCiAgICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFByb2Nlc3NQb29sU2VydmVyLnB5CmluZGV4IDg2YzQzMTIuLmZlNmRjODEgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RQcm9jZXNzUG9vbFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UUHJvY2Vzc1Bvb2xTZXJ2ZXIucHkKQEAgLTE5LDExICsxOSwxNCBAQAogCiAKIGltcG9ydCBsb2dnaW5nCi1mcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgIFByb2Nlc3MsIFZhbHVlLCBDb25kaXRpb24sIHJlZHVjdGlvbgogCi1mcm9tIFRTZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBWYWx1ZSwgQ29uZGl0aW9uCisKK2Zyb20gLlRTZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCiAKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCiAKIGNsYXNzIFRQcm9jZXNzUG9vbFNlcnZlcihUU2VydmVyKToKICAgICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB3b3JrZXIgc3VicHJvY2Vzc2VzIHRvIHNlcnZpY2UgcmVxdWVzdHMKQEAgLTU2LDExICs1OSwxMyBAQAogICAgICAgICB3aGlsZSBzZWxmLmlzUnVubmluZy52YWx1ZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCiAgICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCiAgICAgZGVmIHNlcnZlQ2xpZW50KHNlbGYsIGNsaWVudCk6CiAgICAgICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKQEAgLTcyLDEwICs3NywxMCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgICBleGNlcHQgVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6CisgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCiAgICAgICAgIGl0cmFucy5jbG9zZSgpCiAgICAgICAgIG90cmFucy5jbG9zZSgpCkBAIC05NSw4ICsxMDAsOCBAQAogICAgICAgICAgICAgICAgIHcuZGFlbW9uID0gVHJ1ZQogICAgICAgICAgICAgICAgIHcuc3RhcnQoKQogICAgICAgICAgICAgICAgIHNlbGYud29ya2Vycy5hcHBlbmQodykKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKICAgICAgICAgIyB3YWl0IHVudGlsIHRoZSBjb25kaXRpb24gaXMgc2V0IGJ5IHN0b3AoKQogICAgICAgICB3aGlsZSBUcnVlOgpAQCAtMTA3LDcgKzExMiw3IEBACiAgICAgICAgICAgICBleGNlcHQgKFN5c3RlbUV4aXQsIEtleWJvYXJkSW50ZXJydXB0KToKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCiAgICAgICAgIHNlbGYuaXNSdW5uaW5nLnZhbHVlID0gRmFsc2UKIApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weSBiL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKaW5kZXggOTcwOTdjYy4uZGYyYTdiYiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CkBAIC0xNywyNTMgKzE3LDMwNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IFF1ZXVlCitmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgcXVldWUKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCB0aHJlYWRpbmcKLWltcG9ydCB0cmFjZWJhY2sKIAotZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5USGVhZGVyUHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCitsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKIAotY2xhc3MgVFNlcnZlcjoKLSAgIiIiQmFzZSBpbnRlcmZhY2UgZm9yIGEgc2VydmVyLCB3aGljaCBtdXN0IGhhdmUgYSBzZXJ2ZSgpIG1ldGhvZC4KIAotICBUaHJlZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCBzZXJ2ZXJzOgotICAxKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCi0gIDIpIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQotICAzKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQotICAiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBpZiAobGVuKGFyZ3MpID09IDIpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEZhY3RvcnlCYXNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCi0gICAgZWxpZiAobGVuKGFyZ3MpID09IDQpOgotICAgICAgc2VsZi5fX2luaXRBcmdzX18oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1szXSkKLSAgICBlbGlmIChsZW4oYXJncykgPT0gNik6Ci0gICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKQorY2xhc3MgVFNlcnZlcihvYmplY3QpOgorICAgICIiIkJhc2UgaW50ZXJmYWNlIGZvciBhIHNlcnZlciwgd2hpY2ggbXVzdCBoYXZlIGEgc2VydmUoKSBtZXRob2QuCiAKLSAgZGVmIF9faW5pdEFyZ3NfXyhzZWxmLCBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSk6Ci0gICAgc2VsZi5wcm9jZXNzb3IgPSBwcm9jZXNzb3IKLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydAotICAgIHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAgc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQotICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQotICAgIHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5CisgICAgVGhyZWUgY29uc3RydWN0b3JzIGZvciBhbGwgc2VydmVyczoKKyAgICAxKSAocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgMikgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisgICAgMykgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgKGxlbihhcmdzKSA9PSAyKToKKyAgICAgICAgICAgIHNlbGYuX19pbml0QXJnc19fKGFyZ3NbMF0sIGFyZ3NbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5QmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RmFjdG9yeUJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBlbGlmIChsZW4oYXJncykgPT0gNCk6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzNdKQorICAgICAgICBlbGlmIChsZW4oYXJncykgPT0gNik6CisgICAgICAgICAgICBzZWxmLl9faW5pdEFyZ3NfXyhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIF9faW5pdEFyZ3NfXyhzZWxmLCBwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydCA9IHNlcnZlclRyYW5zcG9ydAorICAgICAgICBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeQorICAgICAgICBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQorICAgICAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeQorCisgICAgICAgIGlucHV0X2lzX2hlYWRlciA9IGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgb3V0cHV0X2lzX2hlYWRlciA9IGlzaW5zdGFuY2Uoc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIGlmIGFueSgoaW5wdXRfaXNfaGVhZGVyLCBvdXRwdXRfaXNfaGVhZGVyKSkgYW5kIGlucHV0X2lzX2hlYWRlciAhPSBvdXRwdXRfaXNfaGVhZGVyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVEhlYWRlclByb3RvY29sIHNlcnZlcnMgcmVxdWlyZSB0aGF0IGJvdGggdGhlIGlucHV0IGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgcHJvdG9jb2xzIGFyZSBUSGVhZGVyUHJvdG9jb2wuIikKKworICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgcGFzcwogCiAKIGNsYXNzIFRTaW1wbGVTZXJ2ZXIoVFNlcnZlcik6Ci0gICIiIlNpbXBsZSBzaW5nbGUtdGhyZWFkZWQgc2VydmVyIHRoYXQganVzdCBwdW1wcyBhcm91bmQgb25lIHRyYW5zcG9ydC4iIiIKKyAgICAiIiJTaW1wbGUgc2luZ2xlLXRocmVhZGVkIHNlcnZlciB0aGF0IGp1c3QgcHVtcHMgYXJvdW5kIG9uZSB0cmFuc3BvcnQuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCi0gICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgICB0cnk6CisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICAgIHBhc3MKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgIGl0cmFucy5jbG9zZSgpCi0gICAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCisKKyAgICAgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yCisgICAgICAgICAgICAjIGlucHV0IGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0CisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzIGluLgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgb3Byb3QgPSBpcHJvdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgICAgICBpdHJhbnMuY2xvc2UoKQorICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKIAogY2xhc3MgVFRocmVhZGVkU2VydmVyKFRTZXJ2ZXIpOgotICAiIiJUaHJlYWRlZCBzZXJ2ZXIgdGhhdCBzcGF3bnMgYSBuZXcgdGhyZWFkIHBlciBlYWNoIGNvbm5lY3Rpb24uIiIiCisgICAgIiIiVGhyZWFkZWQgc2VydmVyIHRoYXQgc3Bhd25zIGEgbmV3IHRocmVhZCBwZXIgZWFjaCBjb25uZWN0aW9uLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgIFRTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCi0gICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5kYWVtb24gPSBrd2FyZ3MuZ2V0KCJkYWVtb24iLCBGYWxzZSkKIAotICBkZWYgc2VydmUoc2VsZik6Ci0gICAgc2VsZi5zZXJ2ZXJUcmFuc3BvcnQubGlzdGVuKCkKLSAgICB3aGlsZSBUcnVlOgotICAgICAgdHJ5OgotICAgICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5oYW5kbGUsIGFyZ3M9KGNsaWVudCwpKQotICAgICAgICB0LnNldERhZW1vbihzZWxmLmRhZW1vbikKLSAgICAgICAgdC5zdGFydCgpCi0gICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHJhaXNlCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5oYW5kbGUsIGFyZ3M9KGNsaWVudCwpKQorICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gIGRlZiBoYW5kbGUoc2VsZiwgY2xpZW50KToKLSAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgdHJ5OgotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICBwYXNzCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6CisgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgICBpdHJhbnMuY2xvc2UoKQotICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgICMgZm9yIFRIZWFkZXJQcm90b2NvbCwgd2UgbXVzdCB1c2UgdGhlIHNhbWUgcHJvdG9jb2wgaW5zdGFuY2UgZm9yIGlucHV0CisgICAgICAgICMgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQgdGhlCisgICAgICAgICMgc2VydmVyIGRldGVjdGVkIHRoZSByZXF1ZXN0IHdhcyBpbi4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KToKKyAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgIG9wcm90ID0gaXByb3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKKyAgICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQorCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCiAKIAogY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIoVFNlcnZlcik6Ci0gICIiIlNlcnZlciB3aXRoIGEgZml4ZWQgc2l6ZSBwb29sIG9mIHRocmVhZHMgd2hpY2ggc2VydmljZSByZXF1ZXN0cy4iIiIKKyAgICAiIiJTZXJ2ZXIgd2l0aCBhIGZpeGVkIHNpemUgcG9vbCBvZiB0aHJlYWRzIHdoaWNoIHNlcnZpY2UgcmVxdWVzdHMuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNsaWVudHMgPSBRdWV1ZS5RdWV1ZSgpCi0gICAgc2VsZi50aHJlYWRzID0gMTAKLSAgICBzZWxmLmRhZW1vbiA9IGt3YXJncy5nZXQoImRhZW1vbiIsIEZhbHNlKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBUU2VydmVyLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLmNsaWVudHMgPSBxdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYudGhyZWFkcyA9IDEwCisgICAgICAgIHNlbGYuZGFlbW9uID0ga3dhcmdzLmdldCgiZGFlbW9uIiwgRmFsc2UpCiAKLSAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKLSAgICAiIiJTZXQgdGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkIiIiCi0gICAgc2VsZi50aHJlYWRzID0gbnVtCisgICAgZGVmIHNldE51bVRocmVhZHMoc2VsZiwgbnVtKToKKyAgICAgICAgIiIiU2V0IHRoZSBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCIiIgorICAgICAgICBzZWxmLnRocmVhZHMgPSBudW0KIAotICBkZWYgc2VydmVUaHJlYWQoc2VsZik6Ci0gICAgIiIiTG9vcCBhcm91bmQgZ2V0dGluZyBjbGllbnRzIGZyb20gdGhlIHNoYXJlZCBxdWV1ZSBhbmQgcHJvY2VzcyB0aGVtLiIiIgotICAgIHdoaWxlIFRydWU6Ci0gICAgICB0cnk6Ci0gICAgICAgIGNsaWVudCA9IHNlbGYuY2xpZW50cy5nZXQoKQotICAgICAgICBzZWxmLnNlcnZlQ2xpZW50KGNsaWVudCkKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgZGVmIHNlcnZlVGhyZWFkKHNlbGYpOgorICAgICAgICAiIiJMb29wIGFyb3VuZCBnZXR0aW5nIGNsaWVudHMgZnJvbSB0aGUgc2hhcmVkIHF1ZXVlIGFuZCBwcm9jZXNzIHRoZW0uIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5jbGllbnRzLmdldCgpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZUNsaWVudChjbGllbnQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbih4KQogCi0gIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgotICAgICIiIlByb2Nlc3MgaW5wdXQvb3V0cHV0IGZyb20gYSBjbGllbnQgZm9yIGFzIGxvbmcgYXMgcG9zc2libGUiIiIKLSAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQotICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCi0gICAgdHJ5OgotICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCi0gICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICBwYXNzCi0gICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICBkZWYgc2VydmVDbGllbnQoc2VsZiwgY2xpZW50KToKKyAgICAgICAgIiIiUHJvY2VzcyBpbnB1dC9vdXRwdXQgZnJvbSBhIGNsaWVudCBmb3IgYXMgbG9uZyBhcyBwb3NzaWJsZSIiIgorICAgICAgICBpdHJhbnMgPSBzZWxmLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQogCi0gICAgaXRyYW5zLmNsb3NlKCkKLSAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvciBpbnB1dAorICAgICAgICAjIGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZQorICAgICAgICAjIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCi0gIGRlZiBzZXJ2ZShzZWxmKToKLSAgICAiIiJTdGFydCBhIGZpeGVkIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgcHV0IGNsaWVudCBpbnRvIGEgcXVldWUiIiIKLSAgICBmb3IgaSBpbiByYW5nZShzZWxmLnRocmVhZHMpOgotICAgICAgdHJ5OgotICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZVRocmVhZCkKLSAgICAgICAgdC5zZXREYWVtb24oc2VsZi5kYWVtb24pCi0gICAgICAgIHQuc3RhcnQoKQotICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgotICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbih4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKLSAgICAjIFB1bXAgdGhlIHNvY2tldCBmb3IgY2xpZW50cwotICAgIHNlbGYuc2VydmVyVHJhbnNwb3J0Lmxpc3RlbigpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKLSAgICAgICAgc2VsZi5jbGllbnRzLnB1dChjbGllbnQpCi0gICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHg6Ci0gICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKHgpCisgICAgICAgIGl0cmFucy5jbG9zZSgpCisgICAgICAgIGlmIG90cmFuczoKKyAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCisKKyAgICBkZWYgc2VydmUoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IGEgZml4ZWQgbnVtYmVyIG9mIHdvcmtlciB0aHJlYWRzIGFuZCBwdXQgY2xpZW50IGludG8gYSBxdWV1ZSIiIgorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnRocmVhZHMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnNlcnZlVGhyZWFkKQorICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKHNlbGYuZGFlbW9uKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgICAgICAjIFB1bXAgdGhlIHNvY2tldCBmb3IgY2xpZW50cworICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmNsaWVudHMucHV0KGNsaWVudCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKHgpCiAKIAogY2xhc3MgVEZvcmtpbmdTZXJ2ZXIoVFNlcnZlcik6Ci0gICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAorICAgICIiIkEgVGhyaWZ0IHNlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogCi0gIFRoaXMgaXMgbW9yZSBzY2FsYWJsZSB0aGFuIHRoZSB0aHJlYWRlZCBzZXJ2ZXIgYXMgaXQgZG9lcyBub3QgY2F1c2UKLSAgR0lMIGNvbnRlbnRpb24uCisgICAgVGhpcyBpcyBtb3JlIHNjYWxhYmxlIHRoYW4gdGhlIHRocmVhZGVkIHNlcnZlciBhcyBpdCBkb2VzIG5vdCBjYXVzZQorICAgIEdJTCBjb250ZW50aW9uLgogCi0gIE5vdGUgdGhhdCB0aGlzIGhhcyBkaWZmZXJlbnQgc2VtYW50aWNzIGZyb20gdGhlIHRocmVhZGluZyBzZXJ2ZXIuCi0gIFNwZWNpZmljYWxseSwgdXBkYXRlcyB0byBzaGFyZWQgdmFyaWFibGVzIHdpbGwgbm8gbG9uZ2VyIGJlIHNoYXJlZC4KLSAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCisgICAgTm90ZSB0aGF0IHRoaXMgaGFzIGRpZmZlcmVudCBzZW1hbnRpY3MgZnJvbSB0aGUgdGhyZWFkaW5nIHNlcnZlci4KKyAgICBTcGVjaWZpY2FsbHksIHVwZGF0ZXMgdG8gc2hhcmVkIHZhcmlhYmxlcyB3aWxsIG5vIGxvbmdlciBiZSBzaGFyZWQuCisgICAgSXQgd2lsbCBhbHNvIG5vdCB3b3JrIG9uIHdpbmRvd3MuCiAKLSAgVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiBpbiB0aGUKLSAgUHl0aG9uIHN0ZGxpYi4KLSAgIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKLSAgICBzZWxmLmNoaWxkcmVuID0gW10KKyAgICBUaGlzIGNvZGUgaXMgaGVhdmlseSBpbnNwaXJlZCBieSBTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluIGluIHRoZQorICAgIFB5dGhvbiBzdGRsaWIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgVFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCiAKLSAgZGVmIHNlcnZlKHNlbGYpOgotICAgIGRlZiB0cnlfY2xvc2UoZmlsZSk6Ci0gICAgICB0cnk6Ci0gICAgICAgIGZpbGUuY2xvc2UoKQotICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgbG9nZ2luZy53YXJuaW5nKGUsIGV4Y19pbmZvPVRydWUpCi0KLSAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBjbGllbnQgPSBzZWxmLnNlcnZlclRyYW5zcG9ydC5hY2NlcHQoKQotICAgICAgdHJ5OgotICAgICAgICBwaWQgPSBvcy5mb3JrKCkKLQotICAgICAgICBpZiBwaWQ6ICAjIHBhcmVudAotICAgICAgICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAotICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKHBpZCkKLSAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQotCi0gICAgICAgICAgIyBQYXJlbnQgbXVzdCBjbG9zZSBzb2NrZXQgb3IgdGhlIGNvbm5lY3Rpb24gbWF5IG5vdCBnZXQKLSAgICAgICAgICAjIGNsb3NlZCBwcm9tcHRseQotICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgdHJ5X2Nsb3NlKGl0cmFucykKLSAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0KLSAgICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQotCi0gICAgICAgICAgZWNvZGUgPSAwCi0gICAgICAgICAgdHJ5OgorICAgIGRlZiBzZXJ2ZShzZWxmKToKKyAgICAgICAgZGVmIHRyeV9jbG9zZShmaWxlKToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3Nvci5wcm9jZXNzKGlwcm90LCBvcHJvdCkKLSAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIHR4OgotICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGUpCi0gICAgICAgICAgICAgIGVjb2RlID0gMQotICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQotICAgICAgICAgICAgdHJ5X2Nsb3NlKG90cmFucykKKyAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoZSwgZXhjX2luZm89VHJ1ZSkKIAotICAgICAgICAgIG9zLl9leGl0KGVjb2RlKQorICAgICAgICBzZWxmLnNlcnZlclRyYW5zcG9ydC5saXN0ZW4oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5zZXJ2ZXJUcmFuc3BvcnQuYWNjZXB0KCkKKyAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKIAotICAgICAgZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgdHg6Ci0gICAgICAgIHBhc3MKLSAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeDoKLSAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oeCkKKyAgICAgICAgICAgICAgICBpZiBwaWQ6ICAjIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAjIGFkZCBiZWZvcmUgY29sbGVjdCwgb3RoZXJ3aXNlIHlvdSByYWNlIHcvIHdhaXRwaWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQocGlkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQogCi0gIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgotICAgIHdoaWxlIHNlbGYuY2hpbGRyZW46Ci0gICAgICB0cnk6Ci0gICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCBvcy5XTk9IQU5HKQotICAgICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICBwaWQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICMgUGFyZW50IG11c3QgY2xvc2Ugc29ja2V0IG9yIHRoZSBjb25uZWN0aW9uIG1heSBub3QgZ2V0CisgICAgICAgICAgICAgICAgICAgICMgY2xvc2VkIHByb21wdGx5CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCiAKLSAgICAgIGlmIHBpZDoKLSAgICAgICAgc2VsZi5jaGlsZHJlbi5yZW1vdmUocGlkKQotICAgICAgZWxzZToKLSAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzCisgICAgICAgICAgICAgICAgICAgICMgaW4uCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCisgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvZGUgPSAxCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2UoaXRyYW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCisKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCisKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKKworICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZCgwLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBpZCA9IE5vbmUKKworICAgICAgICAgICAgaWYgcGlkOgorICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKHBpZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5CkBAIC0wLDAgKzEsMzUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHpsaWIKKworZnJvbSB0aHJpZnQuY29tcGF0IGltcG9ydCBCdWZmZXJJTywgYnl0ZV9pbmRleAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIHJlYWRWYXJpbnQsIHdyaXRlVmFyaW50Citmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0ICgKKyAgICBDUmVhZGFibGVUcmFuc3BvcnQsCisgICAgVE1lbW9yeUJ1ZmZlciwKKyAgICBUVHJhbnNwb3J0QmFzZSwKKyAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLAorKQorCisKK1UxNiA9IHN0cnVjdC5TdHJ1Y3QoIiFIIikKK0kzMiA9IHN0cnVjdC5TdHJ1Y3QoIiFpIikKK0hFQURFUl9NQUdJQyA9IDB4MEZGRgorSEFSRF9NQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkYKKworCitjbGFzcyBUSGVhZGVyQ2xpZW50VHlwZShvYmplY3QpOgorICAgIEhFQURFUlMgPSAweDAwCisKKyAgICBGUkFNRURfQklOQVJZID0gMHgwMQorICAgIFVORlJBTUVEX0JJTkFSWSA9IDB4MDIKKworICAgIEZSQU1FRF9DT01QQUNUID0gMHgwMworICAgIFVORlJBTUVEX0NPTVBBQ1QgPSAweDA0CisKKworY2xhc3MgVEhlYWRlclN1YnByb3RvY29sSUQob2JqZWN0KToKKyAgICBCSU5BUlkgPSAweDAwCisgICAgQ09NUEFDVCA9IDB4MDIKKworCitjbGFzcyBUSW5mb0hlYWRlclR5cGUob2JqZWN0KToKKyAgICBLRVlfVkFMVUUgPSAweDAxCisKKworY2xhc3MgVEhlYWRlclRyYW5zZm9ybUlEKG9iamVjdCk6CisgICAgWkxJQiA9IDB4MDEKKworCitSRUFEX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuZGVjb21wcmVzcywKK30KKworCitXUklURV9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmNvbXByZXNzLAorfQorCisKK2RlZiBfcmVhZFN0cmluZyh0cmFucyk6CisgICAgc2l6ZSA9IHJlYWRWYXJpbnQodHJhbnMpCisgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoIgorICAgICAgICApCisgICAgcmV0dXJuIHRyYW5zLnJlYWQoc2l6ZSkKKworCitkZWYgX3dyaXRlU3RyaW5nKHRyYW5zLCB2YWx1ZSk6CisgICAgd3JpdGVWYXJpbnQodHJhbnMsIGxlbih2YWx1ZSkpCisgICAgdHJhbnMud3JpdGUodmFsdWUpCisKKworY2xhc3MgVEhlYWRlclRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oYiIiKQorICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSB7fQorCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMgPSBbXQorCisgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQgPSAwCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gSEFSRF9NQVhfRlJBTUVfU0laRQorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5pc09wZW4oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQub3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuY2xvc2UoKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9oZWFkZXJzCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgbmFtZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgdmFsdWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMuY2xlYXIoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBXUklURV9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB0cmFuc2Zvcm0iKQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgc2V0X21heF9mcmFtZV9zaXplKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBub3QgMCA8IHNpemUgPCBIQVJEX01BWF9GUkFNRV9TSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWF4aW11bSBmcmFtZSBzaXplIHNob3VsZCBiZSA8ICVkIGFuZCA+IDAiICUgSEFSRF9NQVhfRlJBTUVfU0laRSkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBzaXplCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvdG9jb2xfaWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2xfaWQKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QsIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJQcm90b2NvbCBJRCBub3Qga25vdyBmb3IgY2xpZW50IHR5cGUgJWQiICUgc2VsZi5fY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICMgaWYgdGhlcmUgYXJlIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciwgcHJvZHVjZSB0aG9zZSBmaXJzdC4KKyAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoc3opCisgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHN6IC0gbGVuKGJ5dGVzX3JlYWQpCisgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQKKworICAgICAgICAjIGlmIHdlJ3ZlIGRldGVybWluZWQgdGhpcyBpcyBhbiB1bmZyYW1lZCBjbGllbnQsIGp1c3QgcGFzcyB0aGUgcmVhZAorICAgICAgICAjIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVudGlsIHdlJ3JlIHJlc2V0IGFnYWluIGF0IHRoZQorICAgICAgICAjIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZXNzYWdlLgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgICAgICMgd2UncmUgZW1wdHkgYW5kIChtYXliZSkgZnJhbWVkLiBmaWxsIHRoZSBidWZmZXJzIHdpdGggdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHNlbGYucmVhZEZyYW1lKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgIGRlZiBfc2V0X2NsaWVudF90eXBlKHNlbGYsIGNsaWVudF90eXBlKToKKyAgICAgICAgaWYgY2xpZW50X3R5cGUgbm90IGluIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNsaWVudCB0eXBlICVkIG5vdCBhbGxvd2VkIGJ5IHNlcnZlci4iICUgY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gY2xpZW50X3R5cGUKKworICAgIGRlZiByZWFkRnJhbWUoc2VsZiwgcmVxX3N6KToKKyAgICAgICAgIyB0aGUgZmlyc3Qgd29yZCBjb3VsZCBlaXRoZXIgYmUgdGhlIGxlbmd0aCBmaWVsZCBvZiBhIGZyYW1lZCBtZXNzYWdlCisgICAgICAgICMgb3IgdGhlIGZpcnN0IGJ5dGVzIG9mIGFuIHVuZnJhbWVkIG1lc3NhZ2UuCisgICAgICAgIGZpcnN0X3dvcmQgPSBzZWxmLl90cmFuc3BvcnQucmVhZEFsbChJMzIuc2l6ZSkKKyAgICAgICAgZnJhbWVfc2l6ZSwgPSBJMzIudW5wYWNrKGZpcnN0X3dvcmQpCisgICAgICAgIGlzX3VuZnJhbWVkID0gRmFsc2UKKyAgICAgICAgaWYgZnJhbWVfc2l6ZSAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChmaXJzdF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KGZpcnN0X3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisKKyAgICAgICAgaWYgaXNfdW5mcmFtZWQ6CisgICAgICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSByZXFfc3ogLSBJMzIuc2l6ZQorICAgICAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID4gMDoKKyAgICAgICAgICAgICAgICByZXN0ID0gc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN0ID0gYiIiCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGZpcnN0X3dvcmQgKyByZXN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBvaywgd2UncmUgc3RpbGwgaGVyZSBzbyB3ZSdyZSBmcmFtZWQuCisgICAgICAgIGlmIGZyYW1lX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJGcmFtZSB3YXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisgICAgICAgIHJlYWRfYnVmZmVyID0gQnVmZmVySU8oc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoZnJhbWVfc2l6ZSkpCisKKyAgICAgICAgIyB0aGUgbmV4dCB3b3JkIGlzIGVpdGhlciBnb2luZyB0byBiZSB0aGUgdmVyc2lvbiBmaWVsZCBvZiBhCisgICAgICAgICMgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgbWVzc2FnZSBvciB0aGUgbWFnaWMgdmFsdWUgKyBmbGFncyBvZiBhCisgICAgICAgICMgaGVhZGVyIHByb3RvY29sIG1lc3NhZ2UuCisgICAgICAgIHNlY29uZF93b3JkID0gcmVhZF9idWZmZXIucmVhZChJMzIuc2l6ZSkKKyAgICAgICAgdmVyc2lvbiwgPSBJMzIudW5wYWNrKHNlY29uZF93b3JkKQorICAgICAgICByZWFkX2J1ZmZlci5zZWVrKDApCisgICAgICAgIGlmIHZlcnNpb24gPj4gMTYgPT0gSEVBREVSX01BR0lDOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHNlbGYuX3BhcnNlX2hlYWRlcl9mb3JtYXQocmVhZF9idWZmZXIpCisgICAgICAgIGVsaWYgdmVyc2lvbiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbGlmIChieXRlX2luZGV4KHNlY29uZF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KHNlY29uZF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVyX2Zvcm1hdChzZWxmLCBidWZmZXIpOgorICAgICAgICAjIG1ha2UgQnVmZmVySU8gbG9vayBsaWtlIFRUcmFuc3BvcnQgZm9yIHZhcmludCBoZWxwZXJzCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydC5fYnVmZmVyID0gYnVmZmVyCisKKyAgICAgICAgYnVmZmVyLnJlYWQoMikgICMgZGlzY2FyZCB0aGUgbWFnaWMgYnl0ZXMKKyAgICAgICAgc2VsZi5mbGFncywgPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSkKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCwgPSBJMzIudW5wYWNrKGJ1ZmZlci5yZWFkKEkzMi5zaXplKSkKKworICAgICAgICBoZWFkZXJfbGVuZ3RoID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpWzBdICogNAorICAgICAgICBlbmRfb2ZfaGVhZGVycyA9IGJ1ZmZlci50ZWxsKCkgKyBoZWFkZXJfbGVuZ3RoCisgICAgICAgIGlmIGVuZF9vZl9oZWFkZXJzID4gbGVuKGJ1ZmZlci5nZXR2YWx1ZSgpKToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbiB3aG9sZSBmcmFtZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorCisgICAgICAgIHRyYW5zZm9ybXMgPSBbXQorICAgICAgICB0cmFuc2Zvcm1fY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgIGZvciBfIGluIHJhbmdlKHRyYW5zZm9ybV9jb3VudCk6CisgICAgICAgICAgICB0cmFuc2Zvcm1faWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFJFQURfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gdHJhbnNmb3JtOiAlZCIgJSB0cmFuc2Zvcm1faWQsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorICAgICAgICB0cmFuc2Zvcm1zLnJldmVyc2UoKQorCisgICAgICAgIGhlYWRlcnMgPSB7fQorICAgICAgICB3aGlsZSBidWZmZXIudGVsbCgpIDwgZW5kX29mX2hlYWRlcnM6CisgICAgICAgICAgICBoZWFkZXJfdHlwZSA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIGhlYWRlcl90eXBlID09IFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUU6CisgICAgICAgICAgICAgICAgY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGlnbm9yZSB1bmtub3duIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0gaGVhZGVycworCisgICAgICAgICMgc2tpcCBwYWRkaW5nIC8gYW55dGhpbmcgd2UgZGlkbid0IHVuZGVyc3RhbmQKKyAgICAgICAgYnVmZmVyLnNlZWsoZW5kX29mX2hlYWRlcnMpCisKKyAgICAgICAgcGF5bG9hZCA9IGJ1ZmZlci5yZWFkKCkKKyAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiB0cmFuc2Zvcm1zOgorICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcklPKHBheWxvYWQpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX3dyaXRlX2J1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKworICAgICAgICBidWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gV1JJVEVfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorCisgICAgICAgICAgICBoZWFkZXJzID0gQnVmZmVySU8oKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgc2VsZi5fcHJvdG9jb2xfaWQpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfdHJhbnNmb3JtcykpCisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgdHJhbnNmb3JtX2lkKQorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGVfaGVhZGVyczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFKQorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV9oZWFkZXJzKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl93cml0ZV9oZWFkZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCBrZXkpCisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgICAgIHBhZGRpbmdfbmVlZGVkID0gKDQgLSAobGVuKGhlYWRlcnMuZ2V0dmFsdWUoKSkgJSA0KSkgJSA0CisgICAgICAgICAgICBoZWFkZXJzLndyaXRlKGIiXHgwMCIgKiBwYWRkaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGhlYWRlcl9ieXRlcyA9IGhlYWRlcnMuZ2V0dmFsdWUoKQorCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soMTAgKyBsZW4oaGVhZGVyX2J5dGVzKSArIGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soSEVBREVSX01BR0lDKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhzZWxmLmZsYWdzKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhzZWxmLnNlcXVlbmNlX2lkKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhsZW4oaGVhZGVyX2J5dGVzKSAvLyA0KSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShoZWFkZXJfYnl0ZXMpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlVua25vd24gY2xpZW50IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIHRoZSBmcmFtZSBsZW5ndGggZmllbGQgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSBmcmFtZSBwYXlsb2FkIHNpemUKKyAgICAgICAgZnJhbWVfYnl0ZXMgPSBidWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBmcmFtZV9wYXlsb2FkX3NpemUgPSBsZW4oZnJhbWVfYnl0ZXMpIC0gNAorICAgICAgICBpZiBmcmFtZV9wYXlsb2FkX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNlbmQgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl90cmFuc3BvcnQud3JpdGUoZnJhbWVfYnl0ZXMpCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmVzdWx0ID0gYnl0ZWFycmF5KHBhcnRpYWxyZWFkKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJlc3VsdCArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJlc3VsdCkpCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8ocmVzdWx0KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKaW5kZXggZWE4MGExYS4uMzdiMGE0ZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKQEAgLTE3LDEzMyArMTcsMTcxIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgaHR0cGxpYgorZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IG9zCi1pbXBvcnQgc29ja2V0CitpbXBvcnQgc3NsCiBpbXBvcnQgc3lzCi1pbXBvcnQgdXJsbGliCi1pbXBvcnQgdXJscGFyc2UKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IGJhc2U2NAogCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIKK2Zyb20gc2l4Lm1vdmVzIGltcG9ydCBodHRwX2NsaWVudAogCi1mcm9tIFRUcmFuc3BvcnQgaW1wb3J0ICoKK2Zyb20gLlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRCYXNlCitpbXBvcnQgc2l4CiAKIAogY2xhc3MgVEh0dHBDbGllbnQoVFRyYW5zcG9ydEJhc2UpOgotICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICAiIiJIdHRwIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc3BvcnQgYmFzZS4iIiIKIAotICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lKToKLSAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSwgY2FmaWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLCBrZXlfZmlsZT1Ob25lLCBzc2xfY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiVEh0dHBDbGllbnQgc3VwcG9ydHMgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb25zdHJ1Y3Rpb246CiAKLSAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKLSAgICBUSHR0cENsaWVudCh1cmkpCisgICAgICAgIFRIdHRwQ2xpZW50KGhvc3QsIHBvcnQsIHBhdGgpIC0gZGVwcmVjYXRlZAorICAgICAgICBUSHR0cENsaWVudCh1cmksIFtwb3J0PTxuPiwgcGF0aD08cz4sIGNhZmlsZT08ZmlsZW5hbWU+LCBjZXJ0X2ZpbGU9PGZpbGVuYW1lPiwga2V5X2ZpbGU9PGZpbGVuYW1lPiwgc3NsX2NvbnRleHQ9PGNvbnRleHQ+XSkKIAotICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4KLSAgICAiIiIKLSAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgotICAgICAgd2FybmluZ3Mud2FybigKLSAgICAgICAgIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwOi8vaG9zdDpwb3J0L3BhdGgnKSBzeW50YXgiLAotICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgIHN0YWNrbGV2ZWw9MikKLSAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0Ci0gICAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgICBhc3NlcnQgcGF0aAotICAgICAgc2VsZi5wYXRoID0gcGF0aAotICAgICAgc2VsZi5zY2hlbWUgPSAnaHR0cCcKLSAgICBlbHNlOgotICAgICAgcGFyc2VkID0gdXJscGFyc2UudXJscGFyc2UodXJpX29yX2hvc3QpCi0gICAgICBzZWxmLnNjaGVtZSA9IHBhcnNlZC5zY2hlbWUKLSAgICAgIGFzc2VydCBzZWxmLnNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKQotICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBfUE9SVAotICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgotICAgICAgICBzZWxmLnBvcnQgPSBwYXJzZWQucG9ydCBvciBodHRwbGliLkhUVFBTX1BPUlQKLSAgICAgIHNlbGYuaG9zdCA9IHBhcnNlZC5ob3N0bmFtZQotICAgICAgc2VsZi5wYXRoID0gcGFyc2VkLnBhdGgKLSAgICAgIGlmIHBhcnNlZC5xdWVyeToKLSAgICAgICAgc2VsZi5wYXRoICs9ICc/JXMnICUgcGFyc2VkLnF1ZXJ5Ci0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX2h0dHAgPSBOb25lCi0gICAgc2VsZi5fX3RpbWVvdXQgPSBOb25lCi0gICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gTm9uZQorICAgICAgICBPbmx5IHRoZSBzZWNvbmQgc3VwcG9ydHMgaHR0cHMuICBUbyBwcm9wZXJseSBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgc2VydmVyLAorICAgICAgICBwcm92aWRlIHRoZSBjbGllbnQncyBpZGVudGl0eSBieSBzcGVjaWZ5aW5nIGNlcnRfZmlsZSBhbmQga2V5X2ZpbGUuICBUbyBwcm9wZXJseQorICAgICAgICBhdXRoZW50aWNhdGUgdGhlIHNlcnZlciwgc3BlY2lmeSBlaXRoZXIgY2FmaWxlIG9yIHNzbF9jb250ZXh0IHdpdGggYSBDQSBkZWZpbmVkLgorICAgICAgICBOT1RFOiBpZiBib3RoIGNhZmlsZSBhbmQgc3NsX2NvbnRleHQgYXJlIGRlZmluZWQsIHNzbF9jb250ZXh0IHdpbGwgb3ZlcnJpZGUgY2FmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcG9ydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwe3N9Oi8vaG9zdDpwb3J0L3BhdGgnKSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0CisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgICAgICBhc3NlcnQgcGF0aAorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICAgICAgc2VsZi5zY2hlbWUgPSAnaHR0cCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmlfb3JfaG9zdCkKKyAgICAgICAgICAgIHNlbGYuc2NoZW1lID0gcGFyc2VkLnNjaGVtZQorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpCisgICAgICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6CisgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cF9jbGllbnQuSFRUUF9QT1JUCisgICAgICAgICAgICBlbGlmIHNlbGYuc2NoZW1lID09ICdodHRwcyc6CisgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cF9jbGllbnQuSFRUUFNfUE9SVAorICAgICAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlfZmlsZQorICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1jYWZpbGUpIGlmIChjYWZpbGUgYW5kIG5vdCBzc2xfY29udGV4dCkgZWxzZSBzc2xfY29udGV4dAorICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCisgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXJzZWQucGF0aAorICAgICAgICAgICAgaWYgcGFyc2VkLnF1ZXJ5OgorICAgICAgICAgICAgICAgIHNlbGYucGF0aCArPSAnPyVzJyAlIHBhcnNlZC5xdWVyeQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm94eSA9IHVybGxpYi5yZXF1ZXN0LmdldHByb3hpZXMoKVtzZWxmLnNjaGVtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB1cmxsaWIucmVxdWVzdC5wcm94eV9ieXBhc3Moc2VsZi5ob3N0KToKKyAgICAgICAgICAgICAgICBwcm94eSA9IE5vbmUKKyAgICAgICAgaWYgcHJveHk6CisgICAgICAgICAgICBwYXJzZWQgPSB1cmxsaWIucGFyc2UudXJscGFyc2UocHJveHkpCisgICAgICAgICAgICBzZWxmLnJlYWxob3N0ID0gc2VsZi5ob3N0CisgICAgICAgICAgICBzZWxmLnJlYWxwb3J0ID0gc2VsZi5wb3J0CisgICAgICAgICAgICBzZWxmLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWUKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHBhcnNlZC5wb3J0CisgICAgICAgICAgICBzZWxmLnByb3h5X2F1dGggPSBzZWxmLmJhc2ljX3Byb3h5X2F1dGhfaGVhZGVyKHBhcnNlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVhbGhvc3QgPSBzZWxmLnJlYWxwb3J0ID0gc2VsZi5wcm94eV9hdXRoID0gTm9uZQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ5dGVzSU8oKQorICAgICAgICBzZWxmLl9faHR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2h0dHBfcmVzcG9uc2UgPSBOb25lCisgICAgICAgIHNlbGYuX190aW1lb3V0ID0gTm9uZQorICAgICAgICBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgPSBOb25lCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgotICAgICAgc2VsZi5fX2h0dHAgPSBodHRwbGliLkhUVFAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX19odHRwID0gaHR0cGxpYi5IVFRQUyhzZWxmLmhvc3QsIHNlbGYucG9ydCkKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGJhc2ljX3Byb3h5X2F1dGhfaGVhZGVyKHByb3h5KToKKyAgICAgICAgaWYgcHJveHkgaXMgTm9uZSBvciBub3QgcHJveHkudXNlcm5hbWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBhcCA9ICIlczolcyIgJSAodXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkudXNlcm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnBhcnNlLnVucXVvdGUocHJveHkucGFzc3dvcmQpKQorICAgICAgICBjciA9IGJhc2U2NC5iNjRlbmNvZGUoYXApLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuICJCYXNpYyAiICsgY3IKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5fX2h0dHAuY2xvc2UoKQotICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgIGRlZiB1c2luZ19wcm94eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhbGhvc3QgaXMgbm90IE5vbmUKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6CisgICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYuX190aW1lb3V0KQorICAgICAgICBlbGlmIHNlbGYuc2NoZW1lID09ICdodHRwcyc6CisgICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9maWxlPXNlbGYua2V5ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZT1zZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ9c2VsZi5jb250ZXh0KQorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCk6CisgICAgICAgICAgICBzZWxmLl9faHR0cC5zZXRfdHVubmVsKHNlbGYucmVhbGhvc3QsIHNlbGYucmVhbHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiUHJveHktQXV0aG9yaXphdGlvbiI6IHNlbGYucHJveHlfYXV0aH0pCiAKLSAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2dldGRlZmF1bHR0aW1lb3V0Jyk6Ci0gICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9faHR0cC5jbG9zZSgpCisgICAgICAgIHNlbGYuX19odHRwID0gTm9uZQorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IE5vbmUKIAotICAgIGlmIG1zIGlzIE5vbmU6Ci0gICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgc2VsZi5fX3RpbWVvdXQgPSBtcyAvIDEwMDAuMAorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQogCi0gIGRlZiBzZXRDdXN0b21IZWFkZXJzKHNlbGYsIGhlYWRlcnMpOgotICAgIHNlbGYuX19jdXN0b21faGVhZGVycyA9IGhlYWRlcnMKKyAgICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6CisgICAgICAgIGlmIG1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX190aW1lb3V0ID0gbXMgLyAxMDAwLjAKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcmV0dXJuIHNlbGYuX19odHRwLmZpbGUucmVhZChzeikKKyAgICBkZWYgc2V0Q3VzdG9tSGVhZGVycyhzZWxmLCBoZWFkZXJzKToKKyAgICAgICAgc2VsZi5fX2N1c3RvbV9oZWFkZXJzID0gaGVhZGVycwogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLl9faHR0cF9yZXNwb25zZS5yZWFkKHN6KQogCi0gIGRlZiBfX3dpdGhUaW1lb3V0KGYpOgotICAgIGRlZiBfZigqYXJncywgKiprd2FyZ3MpOgotICAgICAgb3JpZ190aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKLSAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChhcmdzWzBdLl9fdGltZW91dCkKLSAgICAgIHJlc3VsdCA9IGYoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9yaWdfdGltZW91dCkKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICByZXR1cm4gX2YKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBpZiBzZWxmLmlzT3BlbigpOgotICAgICAgc2VsZi5jbG9zZSgpCi0gICAgc2VsZi5vcGVuKCkKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuaXNPcGVuKCk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5vcGVuKCkKIAotICAgICMgUHVsbCBkYXRhIG91dCBvZiBidWZmZXIKLSAgICBkYXRhID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQorICAgICAgICAjIFB1bGwgZGF0YSBvdXQgb2YgYnVmZmVyCisgICAgICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKLSAgICAjIEhUVFAgcmVxdWVzdAotICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCisgICAgICAgICMgSFRUUCByZXF1ZXN0CisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKSBhbmQgc2VsZi5zY2hlbWUgPT0gImh0dHAiOgorICAgICAgICAgICAgIyBuZWVkIGZ1bGwgVVJMIG9mIHJlYWwgaG9zdCBmb3IgSFRUUCBwcm94eSBoZXJlIChIVFRQUyB1c2VzIENPTk5FQ1QgdHVubmVsKQorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0cmVxdWVzdCgnUE9TVCcsICJodHRwOi8vJXM6JXMlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwgc2VsZi5wYXRoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxmLnBhdGgpCiAKLSAgICAjIFdyaXRlIGhlYWRlcnMKLSAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoJ0hvc3QnLCBzZWxmLmhvc3QpCi0gICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKQotICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCBzdHIobGVuKGRhdGEpKSkKKyAgICAgICAgIyBXcml0ZSBoZWFkZXJzCisgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JykKKyAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHN0cihsZW4oZGF0YSkpKQorICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCkgYW5kIHNlbGYuc2NoZW1lID09ICJodHRwIiBhbmQgc2VsZi5wcm94eV9hdXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKCJQcm94eS1BdXRob3JpemF0aW9uIiwgc2VsZi5wcm94eV9hdXRoKQogCi0gICAgaWYgbm90IHNlbGYuX19jdXN0b21faGVhZGVycyBvciAnVXNlci1BZ2VudCcgbm90IGluIHNlbGYuX19jdXN0b21faGVhZGVyczoKLSAgICAgIHVzZXJfYWdlbnQgPSAnUHl0aG9uL1RIdHRwQ2xpZW50JwotICAgICAgc2NyaXB0ID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKLSAgICAgIGlmIHNjcmlwdDoKLSAgICAgICAgdXNlcl9hZ2VudCA9ICclcyAoJXMpJyAlICh1c2VyX2FnZW50LCB1cmxsaWIucXVvdGUoc2NyaXB0KSkKLSAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCisgICAgICAgIGlmIG5vdCBzZWxmLl9fY3VzdG9tX2hlYWRlcnMgb3IgJ1VzZXItQWdlbnQnIG5vdCBpbiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6CisgICAgICAgICAgICB1c2VyX2FnZW50ID0gJ1B5dGhvbi9USHR0cENsaWVudCcKKyAgICAgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgICAgICBpZiBzY3JpcHQ6CisgICAgICAgICAgICAgICAgdXNlcl9hZ2VudCA9ICclcyAoJXMpJyAlICh1c2VyX2FnZW50LCB1cmxsaWIucGFyc2UucXVvdGUoc2NyaXB0KSkKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnB1dGhlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCiAKLSAgICBpZiBzZWxmLl9fY3VzdG9tX2hlYWRlcnM6Ci0gICAgICAgIGZvciBrZXksIHZhbCBpbiBzZWxmLl9fY3VzdG9tX2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLl9faHR0cC5wdXRoZWFkZXIoa2V5LCB2YWwpCisgICAgICAgIGlmIHNlbGYuX19jdXN0b21faGVhZGVyczoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBzaXguaXRlcml0ZW1zKHNlbGYuX19jdXN0b21faGVhZGVycyk6CisgICAgICAgICAgICAgICAgc2VsZi5fX2h0dHAucHV0aGVhZGVyKGtleSwgdmFsKQogCi0gICAgc2VsZi5fX2h0dHAuZW5kaGVhZGVycygpCisgICAgICAgIHNlbGYuX19odHRwLmVuZGhlYWRlcnMoKQogCi0gICAgIyBXcml0ZSBwYXlsb2FkCi0gICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQorICAgICAgICAjIFdyaXRlIHBheWxvYWQKKyAgICAgICAgc2VsZi5fX2h0dHAuc2VuZChkYXRhKQogCi0gICAgIyBHZXQgcmVwbHkgdG8gZmx1c2ggdGhlIHJlcXVlc3QKLSAgICBzZWxmLmNvZGUsIHNlbGYubWVzc2FnZSwgc2VsZi5oZWFkZXJzID0gc2VsZi5fX2h0dHAuZ2V0cmVwbHkoKQotCi0gICMgRGVjb3JhdGUgaWYgd2Uga25vdyBob3cgdG8gdGltZW91dAotICBpZiBoYXNhdHRyKHNvY2tldCwgJ2dldGRlZmF1bHR0aW1lb3V0Jyk6Ci0gICAgZmx1c2ggPSBfX3dpdGhUaW1lb3V0KGZsdXNoKQorICAgICAgICAjIEdldCByZXBseSB0byBmbHVzaCB0aGUgcmVxdWVzdAorICAgICAgICBzZWxmLl9faHR0cF9yZXNwb25zZSA9IHNlbGYuX19odHRwLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5jb2RlID0gc2VsZi5fX2h0dHBfcmVzcG9uc2Uuc3RhdHVzCisgICAgICAgIHNlbGYubWVzc2FnZSA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLnJlYXNvbgorICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5tc2cKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CmluZGV4IGUwZmY0ZjkuLmI1NGNhNWQgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQpAQCAtMTcsMTg2ICsxNywzODAgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2ltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzc2wKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncwogCitmcm9tIC5zc2xjb21wYXQgaW1wb3J0IF9tYXRjaF9ob3N0bmFtZSwgX21hdGNoX2hhc19pcGFkZHJlc3MKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAogZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAorbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygKKyAgICAnZGVmYXVsdCcsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPV9fbmFtZV9fKQogCi1jbGFzcyBUU1NMU29ja2V0KFRTb2NrZXQuVFNvY2tldCk6Ci0gICIiIgotICBTU0wgaW1wbGVtZW50YXRpb24gb2YgY2xpZW50LXNpZGUgVFNvY2tldAogCi0gIFRoaXMgY2xhc3MgY3JlYXRlcyBvdXRib3VuZCBzb2NrZXRzIHdyYXBwZWQgdXNpbmcgdGhlCi0gIHB5dGhvbiBzdGFuZGFyZCBzc2wgbW9kdWxlIGZvciBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuCitjbGFzcyBUU1NMQmFzZShvYmplY3QpOgorICAgICMgU1NMQ29udGV4dCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuOQorICAgIF9oYXNfc3NsX2NvbnRleHQgPSBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwOUYwCiAKLSAgVGhlIHByb3RvY29sIHVzZWQgaXMgc2V0IHVzaW5nIHRoZSBjbGFzcyB2YXJpYWJsZQotICBTU0xfVkVSU0lPTiwgd2hpY2ggbXVzdCBiZSBvbmUgb2Ygc3NsLlBST1RPQ09MXyogYW5kCi0gIGRlZmF1bHRzIHRvICBzc2wuUFJPVE9DT0xfVExTdjEgZm9yIGdyZWF0ZXN0IHNlY3VyaXR5LgotICAiIiIKLSAgU1NMX1ZFUlNJT04gPSBzc2wuUFJPVE9DT0xfVExTdjEKKyAgICAjIGNpcGhlcnMgYXJndW1lbnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDwgMi43LjAKKyAgICBfaGFzX2NpcGhlcnMgPSBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDcwMEYwCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgICAgICAgICBob3N0PSdsb2NhbGhvc3QnLAotICAgICAgICAgICAgICAgcG9ydD05MDkwLAotICAgICAgICAgICAgICAgdmFsaWRhdGU9VHJ1ZSwKLSAgICAgICAgICAgICAgIGNhX2NlcnRzPU5vbmUsCi0gICAgICAgICAgICAgICB1bml4X3NvY2tldD1Ob25lKToKLSAgICAiIiJDcmVhdGUgU1NMIFRTb2NrZXQKKyAgICAjIEZvciBweXRob24gPj0gMi43LjksIHVzZSBsYXRlc3QgVExTIHRoYXQgYm90aCBjbGllbnQgYW5kIHNlcnZlcgorICAgICMgc3VwcG9ydHMuCisgICAgIyBTU0wgMi4wIGFuZCAzLjAgYXJlIGRpc2FibGVkIHZpYSBzc2wuT1BfTk9fU1NMdjIgYW5kIHNzbC5PUF9OT19TU0x2My4KKyAgICAjIEZvciBweXRob24gPCAyLjcuOSwgdXNlIFRMUyAxLjAgc2luY2UgVExTdjFfWCBub3IgT1BfTk9fU1NMdlggaXMKKyAgICAjIHVuYXZhaWxhYmxlLgorICAgIF9kZWZhdWx0X3Byb3RvY29sID0gc3NsLlBST1RPQ09MX1NTTHYyMyBpZiBfaGFzX3NzbF9jb250ZXh0IGVsc2UgXAorICAgICAgICBzc2wuUFJPVE9DT0xfVExTdjEKIAotICAgIEBwYXJhbSB2YWxpZGF0ZTogU2V0IHRvIEZhbHNlIHRvIGRpc2FibGUgU1NMIGNlcnRpZmljYXRlIHZhbGlkYXRpb24KLSAgICBAdHlwZSB2YWxpZGF0ZTogYm9vbAotICAgIEBwYXJhbSBjYV9jZXJ0czogRmlsZW5hbWUgdG8gdGhlIENlcnRpZmljYXRlIEF1dGhvcml0eSBwZW0gZmlsZSwgcG9zc2libHkgYQotICAgIGZpbGUgZG93bmxvYWRlZCBmcm9tOiBodHRwOi8vY3VybC5oYXh4LnNlL2NhL2NhY2VydC5wZW0gIFRoaXMgaXMgcGFzc2VkIHRvCi0gICAgdGhlIHNzbF93cmFwIGZ1bmN0aW9uIGFzIHRoZSAnY2FfY2VydHMnIHBhcmFtZXRlci4KLSAgICBAdHlwZSBjYV9jZXJ0czogc3RyCisgICAgZGVmIF9pbml0X2NvbnRleHQoc2VsZiwgc3NsX3ZlcnNpb24pOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBzZWxmLl9jb250ZXh0ID0gc3NsLlNTTENvbnRleHQoc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBpZiBzZWxmLl9jb250ZXh0LnByb3RvY29sID09IHNzbC5QUk9UT0NPTF9TU0x2MjM6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udGV4dC5vcHRpb25zIHw9IHNzbC5PUF9OT19TU0x2MgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NvbnRleHQgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCiAKLSAgICBSYWlzZXMgYW4gSU9FcnJvciBleGNlcHRpb24gaWYgdmFsaWRhdGUgaXMgVHJ1ZSBhbmQgdGhlIGNhX2NlcnRzIGZpbGUgaXMKLSAgICBOb25lLCBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfc2hvdWxkX3ZlcmlmeShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRleHQudmVyaWZ5X21vZGUgIT0gc3NsLkNFUlRfTk9ORQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2VydF9yZXFzICE9IHNzbC5DRVJUX05PTkUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzc2xfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzX3NzbF9jb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX2NvbnRleHQucHJvdG9jb2wKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zc2xfdmVyc2lvbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNzbF9jb250ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29udGV4dAorCisgICAgU1NMX1ZFUlNJT04gPSBfZGVmYXVsdF9wcm90b2NvbAogICAgICIiIgotICAgIHNlbGYudmFsaWRhdGUgPSB2YWxpZGF0ZQotICAgIHNlbGYuaXNfdmFsaWQgPSBGYWxzZQotICAgIHNlbGYucGVlcmNlcnQgPSBOb25lCi0gICAgaWYgbm90IHZhbGlkYXRlOgotICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBzc2wuQ0VSVF9OT05FCi0gICAgZWxzZToKLSAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMKLSAgICBpZiB2YWxpZGF0ZToKLSAgICAgIGlmIGNhX2NlcnRzIGlzIE5vbmUgb3Igbm90IG9zLmFjY2VzcyhjYV9jZXJ0cywgb3MuUl9PSyk6Ci0gICAgICAgIHJhaXNlIElPRXJyb3IoJ0NlcnRpZmljYXRlIEF1dGhvcml0eSBjYV9jZXJ0cyBmaWxlICIlcyIgJwotICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgcmVhZGFibGUsIGNhbm5vdCB2YWxpZGF0ZSBTU0wgJwotICAgICAgICAgICAgICAgICAgICAgICdjZXJ0aWZpY2F0ZXMuJyAlIChjYV9jZXJ0cykpCi0gICAgVFNvY2tldC5UU29ja2V0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0KQorICBEZWZhdWx0IFNTTCB2ZXJzaW9uLgorICBGb3IgYmFja3dvcmQgY29tcGF0aWJpbGl0eSwgaXQgY2FuIGJlIG1vZGlmaWVkLgorICBVc2UgX19pbml0X18ga2V5d29hcmQgYXJndW1lbnQgInNzbF92ZXJzaW9uIiBpbnN0ZWFkLgorICAiIiIKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICB0cnk6Ci0gICAgICByZXMwID0gc2VsZi5fcmVzb2x2ZUFkZHIoKQotICAgICAgZm9yIHJlcyBpbiByZXMwOgotICAgICAgICBzb2NrX2ZhbWlseSwgc29ja190eXBlID0gcmVzWzA6Ml0KLSAgICAgICAgaXBfcG9ydCA9IHJlc1s0XQotICAgICAgICBwbGFpbl9zb2NrID0gc29ja2V0LnNvY2tldChzb2NrX2ZhbWlseSwgc29ja190eXBlKQotICAgICAgICBzZWxmLmhhbmRsZSA9IHNzbC53cmFwX3NvY2tldChwbGFpbl9zb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zZWxmLlNTTF9WRVJTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1UcnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c2VsZi5jZXJ0X3JlcXMpCi0gICAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICBkZWYgX2RlcHJlY2F0ZWRfYXJnKHNlbGYsIGFyZ3MsIGt3YXJncywgcG9zLCBrZXkpOgorICAgICAgICBpZiBsZW4oYXJncykgPD0gcG9zOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlYWxfcG9zID0gcG9zICsgMworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJyVkdGggcG9zaXRpb25hbCBhcmd1bWVudCBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICdwbGVhc2UgdXNlIGtleXdhcmQgYXJndW1lbnQgaW5zdGVhbmQuJworICAgICAgICAgICAgJSByZWFsX3BvcywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTMpCisKKyAgICAgICAgaWYga2V5IGluIGt3YXJnczoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAnRHVwbGljYXRlIGFyZ3VtZW50OiAlZHRoIGFyZ3VtZW50IGFuZCAlcyBrZXl3YXJkIGFyZ3VtZW50LicKKyAgICAgICAgICAgICAgICAlIChyZWFsX3Bvcywga2V5KSkKKyAgICAgICAga3dhcmdzW2tleV0gPSBhcmdzW3Bvc10KKworICAgIGRlZiBfdW5peF9zb2NrZXRfYXJnKHNlbGYsIGhvc3QsIHBvcnQsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIGtleSA9ICd1bml4X3NvY2tldCcKKyAgICAgICAgaWYgaG9zdCBpcyBOb25lIGFuZCBwb3J0IGlzIE5vbmUgYW5kIGxlbihhcmdzKSA9PSAxIGFuZCBrZXkgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgIGt3YXJnc1trZXldID0gYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5ID09ICdTU0xfVkVSU0lPTic6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBhdHRyaWJ1dGUgaW5zdGVhZC4nLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsX3ZlcnNpb24KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfc2lkZSwgaG9zdCwgc3NsX29wdHMpOgorICAgICAgICBzZWxmLl9zZXJ2ZXJfc2lkZSA9IHNlcnZlcl9zaWRlCisgICAgICAgIGlmIFRTU0xCYXNlLlNTTF9WRVJTSU9OICE9IHNlbGYuX2RlZmF1bHRfcHJvdG9jb2w6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdTU0xfVkVSU0lPTiBpcyBkZXByZWNhdGVkLicKKyAgICAgICAgICAgICAgICAncGxlYXNlIHVzZSBzc2xfdmVyc2lvbiBrZXl3YXJkIGFyZ3VtZW50IGluc3RlYWQuJywKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5fY29udGV4dCA9IHNzbF9vcHRzLnBvcCgnc3NsX2NvbnRleHQnLCBOb25lKQorICAgICAgICBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZXJ2ZXJfc2lkZToKKyAgICAgICAgICAgIHNlbGYuX3NlcnZlcl9ob3N0bmFtZSA9IHNzbF9vcHRzLnBvcCgnc2VydmVyX2hvc3RuYW1lJywgaG9zdCkKKyAgICAgICAgaWYgc2VsZi5fY29udGV4dDoKKyAgICAgICAgICAgIHNlbGYuX2N1c3RvbV9jb250ZXh0ID0gVHJ1ZQorICAgICAgICAgICAgaWYgc3NsX29wdHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ0luY29tcGF0aWJsZSBhcmd1bWVudHM6IHNzbF9jb250ZXh0IGFuZCAlcycKKyAgICAgICAgICAgICAgICAgICAgJSAnICcuam9pbihzc2xfb3B0cy5rZXlzKCkpKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnc3NsX2NvbnRleHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jdXN0b21fY29udGV4dCA9IEZhbHNlCisgICAgICAgICAgICBzc2xfdmVyc2lvbiA9IHNzbF9vcHRzLnBvcCgnc3NsX3ZlcnNpb24nLCBUU1NMQmFzZS5TU0xfVkVSU0lPTikKKyAgICAgICAgICAgIHNlbGYuX2luaXRfY29udGV4dChzc2xfdmVyc2lvbikKKyAgICAgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsX29wdHMucG9wKCdjZXJ0X3JlcXMnLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKyAgICAgICAgICAgIHNlbGYuY2FfY2VydHMgPSBzc2xfb3B0cy5wb3AoJ2NhX2NlcnRzJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IHNzbF9vcHRzLnBvcCgna2V5ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gc3NsX29wdHMucG9wKCdjZXJ0ZmlsZScsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNpcGhlcnMgPSBzc2xfb3B0cy5wb3AoJ2NpcGhlcnMnLCBOb25lKQorCisgICAgICAgICAgICBpZiBzc2xfb3B0czoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBrZXl3b3JkIGFyZ3VtZW50czogJywgJyAnLmpvaW4oc3NsX29wdHMua2V5cygpKSkKKworICAgICAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3ZlcmlmeToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICdjYV9jZXJ0cyBpcyBuZWVkZWQgd2hlbiBjZXJ0X3JlcXMgaXMgbm90IHNzbC5DRVJUX05PTkUnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3Moc2VsZi5jYV9jZXJ0cywgb3MuUl9PSyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0NlcnRpZmljYXRlIEF1dGhvcml0eSBjYV9jZXJ0cyBmaWxlICIlcyIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgcmVhZGFibGUsIGNhbm5vdCB2YWxpZGF0ZSBTU0wgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZXJ0aWZpY2F0ZXMuJyAlIChzZWxmLmNhX2NlcnRzKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjZXJ0ZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NlcnRmaWxlCisKKyAgICBAY2VydGZpbGUuc2V0dGVyCisgICAgZGVmIGNlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgaWYgc2VsZi5fc2VydmVyX3NpZGUgYW5kIG5vdCBjZXJ0ZmlsZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2NlcnRmaWxlIGlzIG5lZWRlZCBmb3Igc2VydmVyLXNpZGUnKQorICAgICAgICBpZiBjZXJ0ZmlsZSBhbmQgbm90IG9zLmFjY2VzcyhjZXJ0ZmlsZSwgb3MuUl9PSyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdObyBzdWNoIGNlcnRmaWxlIGZvdW5kOiAlcycgJSAoY2VydGZpbGUpKQorICAgICAgICBzZWxmLl9jZXJ0ZmlsZSA9IGNlcnRmaWxlCisKKyAgICBkZWYgX3dyYXBfc29ja2V0KHNlbGYsIHNvY2spOgorICAgICAgICBpZiBzZWxmLl9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY3VzdG9tX2NvbnRleHQ6CisgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNlbGYuY2VydF9yZXFzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jZXJ0ZmlsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX2NlcnRfY2hhaW4oc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXlmaWxlKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2lwaGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5zZXRfY2lwaGVycyhzZWxmLmNpcGhlcnMpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jYV9jZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2VsZi5jYV9jZXJ0cykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbF9jb250ZXh0LndyYXBfc29ja2V0KAorICAgICAgICAgICAgICAgIHNvY2ssIHNlcnZlcl9zaWRlPXNlbGYuX3NlcnZlcl9zaWRlLAorICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1zZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzc2xfb3B0cyA9IHsKKyAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nOiBzZWxmLl9zc2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAnc2VydmVyX3NpZGUnOiBzZWxmLl9zZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICAnY2FfY2VydHMnOiBzZWxmLmNhX2NlcnRzLAorICAgICAgICAgICAgICAgICdrZXlmaWxlJzogc2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICdjZXJ0ZmlsZSc6IHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgJ2NlcnRfcmVxcyc6IHNlbGYuY2VydF9yZXFzLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgc2VsZi5jaXBoZXJzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2hhc19jaXBoZXJzOgorICAgICAgICAgICAgICAgICAgICBzc2xfb3B0c1snY2lwaGVycyddID0gc2VsZi5jaXBoZXJzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAnY2lwaGVycyBpcyBzcGVjaWZpZWQgYnV0IGlnbm9yZWQgZHVlIHRvIG9sZCBQeXRob24gdmVyc2lvbicpCisgICAgICAgICAgICByZXR1cm4gc3NsLndyYXBfc29ja2V0KHNvY2ssICoqc3NsX29wdHMpCisKKworY2xhc3MgVFNTTFNvY2tldChUU29ja2V0LlRTb2NrZXQsIFRTU0xCYXNlKToKKyAgICAiIiIKKyAgICBTU0wgaW1wbGVtZW50YXRpb24gb2YgVFNvY2tldAorCisgICAgVGhpcyBjbGFzcyBjcmVhdGVzIG91dGJvdW5kIHNvY2tldHMgd3JhcHBlZCB1c2luZyB0aGUKKyAgICBweXRob24gc3RhbmRhcmQgc3NsIG1vZHVsZSBmb3IgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgorICAgICIiIgorCisgICAgIyBOZXcgc2lnbmF0dXJlCisgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLAorICAgICMgICAgICAgICAgICAgICoqc3NsX2FyZ3MpOgorICAgICMgRGVwcmVjYXRlZCBzaWduYXR1cmUKKyAgICAjIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHZhbGlkYXRlPVRydWUsCisgICAgIyAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLAorICAgICMgICAgICAgICAgICAgIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBgYHNzbF92ZXJzaW9uYGAsIGBgY2FfY2VydHNgYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2lwaGVyc2BgIChQeXRob24gMi43LjAgb3IgbGF0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYCAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICBQYXNzZWQgdG8gc3NsLndyYXBfc29ja2V0LiBTZWUgc3NsLndyYXBfc29ja2V0IGRvY3VtZW50YXRpb24uCisKKyAgICAgICAgQWx0ZXJuYXRpdmUga2V5d29yZCBhcmd1bWVudHM6IChQeXRob24gMi43Ljkgb3IgbGF0ZXIpCisgICAgICAgICAgYGBzc2xfY29udGV4dGBgOiBzc2wuU1NMQ29udGV4dCB0byBiZSB1c2VkIGZvciBTU0xDb250ZXh0LndyYXBfc29ja2V0CisgICAgICAgICAgYGBzZXJ2ZXJfaG9zdG5hbWVgYDogUGFzc2VkIHRvIFNTTENvbnRleHQud3JhcF9zb2NrZXQKKworICAgICAgICBDb21tb24ga2V5d29yZCBhcmd1bWVudDoKKyAgICAgICAgICBgYHZhbGlkYXRlX2NhbGxiYWNrYGAgKGNlcnQsIGhvc3RuYW1lKSAtPiBOb25lOgorICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgU1NMIGhhbmRzaGFrZS4gQ2FuIHJhaXNlIHdoZW4gaG9zdG5hbWUgZG9lcyBub3QKKyAgICAgICAgICAgICAgbWF0Y2ggdGhlIGNlcnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlzX3ZhbGlkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wZWVyY2VydCA9IE5vbmUKKworICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID4gNjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuaXhfc29ja2V0X2FyZyhob3N0LCBwb3J0LCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMCwgJ3ZhbGlkYXRlJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMSwgJ2NhX2NlcnRzJykKKyAgICAgICAgICAgIHNlbGYuX2RlcHJlY2F0ZWRfYXJnKGFyZ3MsIGt3YXJncywgMiwgJ2tleWZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCAzLCAnY2VydGZpbGUnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA0LCAndW5peF9zb2NrZXQnKQorICAgICAgICAgICAgc2VsZi5fZGVwcmVjYXRlZF9hcmcoYXJncywga3dhcmdzLCA1LCAnY2lwaGVycycpCisKKyAgICAgICAgdmFsaWRhdGUgPSBrd2FyZ3MucG9wKCd2YWxpZGF0ZScsIE5vbmUpCisgICAgICAgIGlmIHZhbGlkYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2VydF9yZXFzX25hbWUgPSAnQ0VSVF9SRVFVSVJFRCcgaWYgdmFsaWRhdGUgZWxzZSAnQ0VSVF9OT05FJworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXM9c3NsLiVzIGluc3RlYWQnCisgICAgICAgICAgICAgICAgJSBjZXJ0X3JlcXNfbmFtZSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIGlmICdjZXJ0X3JlcXMnIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBzcGVjaWZ5IGJvdGggdmFsaWRhdGUgYW5kIGNlcnRfcmVxcycpCisgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRfcmVxcyddID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsaWRhdGUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICAgICAgdW5peF9zb2NrZXQgPSBrd2FyZ3MucG9wKCd1bml4X3NvY2tldCcsIE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlX2NhbGxiYWNrID0ga3dhcmdzLnBvcCgndmFsaWRhdGVfY2FsbGJhY2snLCBfbWF0Y2hfaG9zdG5hbWUpCisgICAgICAgIFRTU0xCYXNlLl9faW5pdF9fKHNlbGYsIEZhbHNlLCBob3N0LCBrd2FyZ3MpCisgICAgICAgIFRTb2NrZXQuVFNvY2tldC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCB1bml4X3NvY2tldCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBzZWxmLmNlcnRfcmVxcyAhPSBzc2wuQ0VSVF9OT05FCisKKyAgICBAdmFsaWRhdGUuc2V0dGVyCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgd2FybmluZ3Mud2FybigndmFsaWRhdGUgaXMgZGVwcmVjYXRlZC4gcGxlYXNlIHVzZSBjZXJ0X3JlcXMgaW5zdGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQgaWYgdmFsdWUgZWxzZSBzc2wuQ0VSVF9OT05FCisKKyAgICBkZWYgX2RvX29wZW4oc2VsZiwgZmFtaWx5LCBzb2NrdHlwZSk6CisgICAgICAgIHBsYWluX3NvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCiAgICAgICAgIHRyeToKLSAgICAgICAgICBzZWxmLmhhbmRsZS5jb25uZWN0KGlwX3BvcnQpCi0gICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgICAgICBpZiByZXMgaXMgbm90IHJlczBbLTFdOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgZQotICAgICAgICBicmVhawotICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKLSAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHNlY3VyZSBzb2NrZXQgJXMnICUgc2VsZi5fdW5peF9zb2NrZXQKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1lc3NhZ2UgPSAnQ291bGQgbm90IGNvbm5lY3QgdG8gJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9bWVzc2FnZSkKLSAgICBpZiBzZWxmLnZhbGlkYXRlOgotICAgICAgc2VsZi5fdmFsaWRhdGVfY2VydCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9zb2NrZXQocGxhaW5fc29jaykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBsYWluX3NvY2suY2xvc2UoKQorICAgICAgICAgICAgbXNnID0gJ2ZhaWxlZCB0byBpbml0aWFsaXplIFNTTCcKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24obXNnKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCiAKLSAgZGVmIF92YWxpZGF0ZV9jZXJ0KHNlbGYpOgotICAgICIiImludGVybmFsIG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcGVlcidzIFNTTCBjZXJ0aWZpY2F0ZSwgYW5kIHRvIGNoZWNrIHRoZQotICAgIGNvbW1vbk5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSBob3N0bmFtZSB3ZQotICAgIHVzZWQgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uICBEb2VzIG5vdCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIHJlY29yZHMKLSAgICBpbiBjZXJ0aWZpY2F0ZXMuCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHN1cGVyKFRTU0xTb2NrZXQsIHNlbGYpLm9wZW4oKQorICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgc2VsZi5wZWVyY2VydCA9IHNlbGYuaGFuZGxlLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayhzZWxmLnBlZXJjZXJ0LCBzZWxmLl9zZXJ2ZXJfaG9zdG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5pc192YWxpZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLCBzdHIoZXgpKQogCi0gICAgcmFpc2VzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIGNlcnRpZmljYXRlIGZhaWxzIHZhbGlkYXRpb24uCisKK2NsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0LCBUU1NMQmFzZSk6CisgICAgIiIiU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQKKworICAgIFRoaXMgdXNlcyB0aGUgc3NsIG1vZHVsZSdzIHdyYXBfc29ja2V0KCkgbWV0aG9kIHRvIHByb3ZpZGUgU1NMCisgICAgbmVnb3RpYXRlZCBlbmNyeXB0aW9uLgogICAgICIiIgotICAgIGNlcnQgPSBzZWxmLmhhbmRsZS5nZXRwZWVyY2VydCgpCi0gICAgc2VsZi5wZWVyY2VydCA9IGNlcnQKLSAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6Ci0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCi0gICAgICAgIG1lc3NhZ2U9J05vIFNTTCBjZXJ0aWZpY2F0ZSBmb3VuZCBmcm9tICVzOiVzJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCi0gICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCi0gICAgZm9yIGZpZWxkIGluIGZpZWxkczoKLSAgICAgICMgZW5zdXJlIHN0cnVjdHVyZSB3ZSBnZXQgYmFjayBpcyB3aGF0IHdlIGV4cGVjdAotICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmllbGQsIHR1cGxlKToKLSAgICAgICAgY29udGludWUKLSAgICAgIGNlcnRfcGFpciA9IGZpZWxkWzBdCi0gICAgICBpZiBsZW4oY2VydF9wYWlyKSA8IDI6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBjZXJ0X2tleSwgY2VydF92YWx1ZSA9IGNlcnRfcGFpclswOjJdCi0gICAgICBpZiBjZXJ0X2tleSAhPSAnY29tbW9uTmFtZSc6Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBjZXJ0aG9zdCA9IGNlcnRfdmFsdWUKLSAgICAgIGlmIGNlcnRob3N0ID09IHNlbGYuaG9zdDoKLSAgICAgICAgIyBzdWNjZXNzLCBjZXJ0IGNvbW1vbk5hbWUgbWF0Y2hlcyBkZXNpcmVkIGhvc3RuYW1lCi0gICAgICAgIHNlbGYuaXNfdmFsaWQgPSBUcnVlCi0gICAgICAgIHJldHVybgotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKLSAgICAgICAgICB0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKLSAgICAgICAgICBtZXNzYWdlPSdIb3N0bmFtZSB3ZSBjb25uZWN0ZWQgdG8gIiVzIiBkb2VzblwndCBtYXRjaCBjZXJ0aWZpY2F0ZSAnCi0gICAgICAgICAgICAgICAgICAncHJvdmlkZWQgY29tbW9uTmFtZSAiJXMiJyAlIChzZWxmLmhvc3QsIGNlcnRob3N0KSkKLSAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAotICAgICAgdHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLlVOS05PV04sCi0gICAgICBtZXNzYWdlPSdDb3VsZCBub3QgdmFsaWRhdGUgU1NMIGNlcnRpZmljYXRlIGZyb20gJwotICAgICAgICAgICAgICAnaG9zdCAiJXMiLiAgQ2VydD0lcycgJSAoc2VsZi5ob3N0LCBjZXJ0KSkKIAorICAgICMgTmV3IHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSwgKipzc2xfYXJncyk6CisgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICMgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCBjZXJ0ZmlsZT0nY2VydC5wZW0nLCB1bml4X3NvY2tldD1Ob25lLCBjaXBoZXJzPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiUG9zaXRpb25hbCBhcmd1bWVudHM6IGBgaG9zdGBgLCBgYHBvcnRgYCwgYGB1bml4X3NvY2tldGBgCiAKLWNsYXNzIFRTU0xTZXJ2ZXJTb2NrZXQoVFNvY2tldC5UU2VydmVyU29ja2V0KToKLSAgIiIiU1NMIGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJTb2NrZXQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6IGBga2V5ZmlsZWBgLCBgYGNlcnRmaWxlYGAsIGBgY2VydF9yZXFzYGAsIGBgc3NsX3ZlcnNpb25gYCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgY2FfY2VydHNgYCwgYGBjaXBoZXJzYGAgKFB5dGhvbiAyLjcuMCBvciBsYXRlcikKKyAgICAgICAgU2VlIHNzbC53cmFwX3NvY2tldCBkb2N1bWVudGF0aW9uLgogCi0gIFRoaXMgdXNlcyB0aGUgc3NsIG1vZHVsZSdzIHdyYXBfc29ja2V0KCkgbWV0aG9kIHRvIHByb3ZpZGUgU1NMCi0gIG5lZ290aWF0ZWQgZW5jcnlwdGlvbi4KLSAgIiIiCi0gIFNTTF9WRVJTSU9OID0gc3NsLlBST1RPQ09MX1RMU3YxCisgICAgICAgIEFsdGVybmF0aXZlIGtleXdvcmQgYXJndW1lbnRzOiAoUHl0aG9uIDIuNy45IG9yIGxhdGVyKQorICAgICAgICAgIGBgc3NsX2NvbnRleHRgYDogc3NsLlNTTENvbnRleHQgdG8gYmUgdXNlZCBmb3IgU1NMQ29udGV4dC53cmFwX3NvY2tldAorICAgICAgICAgIGBgc2VydmVyX2hvc3RuYW1lYGA6IFBhc3NlZCB0byBTU0xDb250ZXh0LndyYXBfc29ja2V0CiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsCi0gICAgICAgICAgICAgICBob3N0PU5vbmUsCi0gICAgICAgICAgICAgICBwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICBjZXJ0ZmlsZT0nY2VydC5wZW0nLAotICAgICAgICAgICAgICAgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIFRTU0xTZXJ2ZXJTb2NrZXQKKyAgICAgICAgQ29tbW9uIGtleXdvcmQgYXJndW1lbnQ6CisgICAgICAgICAgYGB2YWxpZGF0ZV9jYWxsYmFja2BgIChjZXJ0LCBob3N0bmFtZSkgLT4gTm9uZToKKyAgICAgICAgICAgICAgQ2FsbGVkIGFmdGVyIFNTTCBoYW5kc2hha2UuIENhbiByYWlzZSB3aGVuIGhvc3RuYW1lIGRvZXMgbm90CisgICAgICAgICAgICAgIG1hdGNoIHRoZSBjZXJ0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUb28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50JykKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl91bml4X3NvY2tldF9hcmcoaG9zdCwgcG9ydCwgYXJncywga3dhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDAsICdjZXJ0ZmlsZScpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDEsICd1bml4X3NvY2tldCcpCisgICAgICAgICAgICBzZWxmLl9kZXByZWNhdGVkX2FyZyhhcmdzLCBrd2FyZ3MsIDIsICdjaXBoZXJzJykKIAotICAgIEBwYXJhbSBjZXJ0ZmlsZTogZmlsZW5hbWUgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwgZGVmYXVsdHMgdG8gY2VydC5wZW0KLSAgICBAdHlwZSBjZXJ0ZmlsZTogc3RyCi0gICAgQHBhcmFtIGhvc3Q6IFRoZSBob3N0bmFtZSBvciBJUCB0byBiaW5kIHRoZSBsaXN0ZW4gc29ja2V0IHRvLAotICAgICAgICAgICAgICAgICBpLmUuICdsb2NhbGhvc3QnIGZvciBvbmx5IGFsbG93aW5nIGxvY2FsIG5ldHdvcmsgY29ubmVjdGlvbnMuCi0gICAgICAgICAgICAgICAgIFBhc3MgTm9uZSB0byBiaW5kIHRvIGFsbCBpbnRlcmZhY2VzLgotICAgIEB0eXBlIGhvc3Q6IHN0cgotICAgIEBwYXJhbSBwb3J0OiBUaGUgcG9ydCB0byBsaXN0ZW4gb24gZm9yIGluYm91bmQgY29ubmVjdGlvbnMuCi0gICAgQHR5cGUgcG9ydDogaW50Ci0gICAgIiIiCi0gICAgc2VsZi5zZXRDZXJ0ZmlsZShjZXJ0ZmlsZSkKLSAgICBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKKyAgICAgICAgaWYgJ3NzbF9jb250ZXh0JyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgIyBQcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvcnMgZm9yIGRlZmF1bHQgdmFsdWVzCisgICAgICAgICAgICBpZiAnY2VydF9yZXFzJyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snY2VydF9yZXFzJ10gPSBzc2wuQ0VSVF9OT05FCisgICAgICAgICAgICBpZidjZXJ0ZmlsZScgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2NlcnRmaWxlJ10gPSAnY2VydC5wZW0nCiAKLSAgZGVmIHNldENlcnRmaWxlKHNlbGYsIGNlcnRmaWxlKToKLSAgICAiIiJTZXQgb3IgY2hhbmdlIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgZmlsZSB1c2VkIHRvIHdyYXAgbmV3IGNvbm5lY3Rpb25zLgorICAgICAgICB1bml4X3NvY2tldCA9IGt3YXJncy5wb3AoJ3VuaXhfc29ja2V0JywgTm9uZSkKKyAgICAgICAgc2VsZi5fdmFsaWRhdGVfY2FsbGJhY2sgPSBcCisgICAgICAgICAgICBrd2FyZ3MucG9wKCd2YWxpZGF0ZV9jYWxsYmFjaycsIF9tYXRjaF9ob3N0bmFtZSkKKyAgICAgICAgVFNTTEJhc2UuX19pbml0X18oc2VsZiwgVHJ1ZSwgTm9uZSwga3dhcmdzKQorICAgICAgICBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgdW5peF9zb2NrZXQpCisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF92ZXJpZnkgYW5kIG5vdCBfbWF0Y2hfaGFzX2lwYWRkcmVzczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05lZWQgaXBhZGRyZXNzIGFuZCBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZSB0byB2ZXJpZnkgY2xpZW50IGNlcnRpZmljYXRlJykKIAotICAgIEBwYXJhbSBjZXJ0ZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICBpLmUuICcvZXRjL2NlcnRzL3NlcnZlci5wZW0nCi0gICAgQHR5cGUgY2VydGZpbGU6IHN0cgorICAgIGRlZiBzZXRDZXJ0ZmlsZShzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgICIiIlNldCBvciBjaGFuZ2UgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmaWxlIHVzZWQgdG8gd3JhcCBuZXcKKyAgICAgICAgY29ubmVjdGlvbnMuCiAKLSAgICBSYWlzZXMgYW4gSU9FcnJvciBleGNlcHRpb24gaWYgdGhlIGNlcnRmaWxlIGlzIG5vdCBwcmVzZW50IG9yIHVucmVhZGFibGUuCi0gICAgIiIiCi0gICAgaWYgbm90IG9zLmFjY2VzcyhjZXJ0ZmlsZSwgb3MuUl9PSyk6Ci0gICAgICByYWlzZSBJT0Vycm9yKCdObyBzdWNoIGNlcnRmaWxlIGZvdW5kOiAlcycgJSAoY2VydGZpbGUpKQotICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICBAcGFyYW0gY2VydGZpbGU6IFRoZSBmaWxlbmFtZSBvZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gJy9ldGMvY2VydHMvc2VydmVyLnBlbScKKyAgICAgICAgQHR5cGUgY2VydGZpbGU6IHN0cgogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgcGxhaW5fY2xpZW50LCBhZGRyID0gc2VsZi5oYW5kbGUuYWNjZXB0KCkKLSAgICB0cnk6Ci0gICAgICBjbGllbnQgPSBzc2wud3JhcF9zb2NrZXQocGxhaW5fY2xpZW50LCBjZXJ0ZmlsZT1zZWxmLmNlcnRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPVRydWUsIHNzbF92ZXJzaW9uPXNlbGYuU1NMX1ZFUlNJT04pCi0gICAgZXhjZXB0IHNzbC5TU0xFcnJvciBhcyBzc2xfZXhjOgotICAgICAgIyBmYWlsZWQgaGFuZHNoYWtlL3NzbCB3cmFwLCBjbG9zZSBzb2NrZXQgdG8gY2xpZW50Ci0gICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQotICAgICAgIyByYWlzZSBzc2xfZXhjCi0gICAgICAjIFdlIGNhbid0IHJhaXNlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgaXQga2lsbHMgbW9zdCBUU2VydmVyIGRlcml2ZWQKLSAgICAgICMgc2VydmUoKSBtZXRob2RzLgotICAgICAgIyBJbnN0ZWFkLCByZXR1cm4gTm9uZSwgYW5kIGxldCB0aGUgVFNlcnZlciBpbnN0YW5jZSBkZWFsIHdpdGggaXQgaW4KLSAgICAgICMgb3RoZXIgZXhjZXB0aW9uIGhhbmRsaW5nLiAgKGJ1dCBUU2ltcGxlU2VydmVyIGRpZXMgYW55d2F5KQotICAgICAgcmV0dXJuIE5vbmUKLSAgICByZXN1bHQgPSBUU29ja2V0LlRTb2NrZXQoKQotICAgIHJlc3VsdC5zZXRIYW5kbGUoY2xpZW50KQotICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgUmFpc2VzIGFuIElPRXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBjZXJ0ZmlsZSBpcyBub3QgcHJlc2VudCBvciB1bnJlYWRhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICdzZXRDZXJ0ZmlsZSBpcyBkZXByZWNhdGVkLiBwbGVhc2UgdXNlIGNlcnRmaWxlIHByb3BlcnR5IGluc3RlYWQuJywKKyAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBsYWluX2NsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuX3dyYXBfc29ja2V0KHBsYWluX2NsaWVudCkKKyAgICAgICAgZXhjZXB0IChzc2wuU1NMRXJyb3IsIHNvY2tldC5lcnJvciwgT1NFcnJvcik6CisgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdFcnJvciB3aGlsZSBhY2NlcHRpbmcgZnJvbSAlcycsIGFkZHIpCisgICAgICAgICAgICAjIGZhaWxlZCBoYW5kc2hha2Uvc3NsIHdyYXAsIGNsb3NlIHNvY2tldCB0byBjbGllbnQKKyAgICAgICAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAjIHJhaXNlCisgICAgICAgICAgICAjIFdlIGNhbid0IHJhaXNlIHRoZSBleGNlcHRpb24sIGJlY2F1c2UgaXQga2lsbHMgbW9zdCBUU2VydmVyIGRlcml2ZWQKKyAgICAgICAgICAgICMgc2VydmUoKSBtZXRob2RzLgorICAgICAgICAgICAgIyBJbnN0ZWFkLCByZXR1cm4gTm9uZSwgYW5kIGxldCB0aGUgVFNlcnZlciBpbnN0YW5jZSBkZWFsIHdpdGggaXQgaW4KKyAgICAgICAgICAgICMgb3RoZXIgZXhjZXB0aW9uIGhhbmRsaW5nLiAgKGJ1dCBUU2ltcGxlU2VydmVyIGRpZXMgYW55d2F5KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiBzZWxmLl9zaG91bGRfdmVyaWZ5OgorICAgICAgICAgICAgY2xpZW50LnBlZXJjZXJ0ID0gY2xpZW50LmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9jYWxsYmFjayhjbGllbnQucGVlcmNlcnQsIGFkZHJbMF0pCisgICAgICAgICAgICAgICAgY2xpZW50LmlzX3ZhbGlkID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRmFpbGVkIHRvIHZhbGlkYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBhZGRyZXNzOiAlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkclswXSwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHBsYWluX2NsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXN1bHQgPSBUU29ja2V0LlRTb2NrZXQoKQorICAgICAgICByZXN1bHQuaGFuZGxlID0gY2xpZW50CisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CmluZGV4IDllMmIzODQuLmE3ZDY2MTcgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQpAQCAtMTgsMTU5ICsxOCwxODQgQEAKICMKIAogaW1wb3J0IGVycm5vCitpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc3lzCiAKLWZyb20gVFRyYW5zcG9ydCBpbXBvcnQgKgorZnJvbSAuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEJhc2UsIFRUcmFuc3BvcnRFeGNlcHRpb24sIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCiAKIGNsYXNzIFRTb2NrZXRCYXNlKFRUcmFuc3BvcnRCYXNlKToKLSAgZGVmIF9yZXNvbHZlQWRkcihzZWxmKToKLSAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKLSAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsCi0gICAgICAgICAgICAgICBzZWxmLl91bml4X3NvY2tldCldCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBzb2NrZXQuZ2V0YWRkcmluZm8oc2VsZi5ob3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BRl9VTlNQRUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5TT0NLX1NUUkVBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFJX1BBU1NJVkUgfCBzb2NrZXQuQUlfQUREUkNPTkZJRykKKyAgICBkZWYgX3Jlc29sdmVBZGRyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl91bml4X3NvY2tldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbKHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0sIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl91bml4X3NvY2tldCldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc29ja2V0LmdldGFkZHJpbmZvKHNlbGYuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09DS19TVFJFQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5BSV9QQVNTSVZFIHwgc29ja2V0LkFJX0FERFJDT05GSUcpCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIGlmIHNlbGYuaGFuZGxlOgotICAgICAgc2VsZi5oYW5kbGUuY2xvc2UoKQotICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlID0gTm9uZQogCiAKIGNsYXNzIFRTb2NrZXQoVFNvY2tldEJhc2UpOgotICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgorICAgICIiIlNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUVHJhbnNwb3J0IGJhc2UuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIFRTb2NrZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgVFNvY2tldAogCi0gICAgQHBhcmFtIGhvc3Qoc3RyKSAgVGhlIGhvc3QgdG8gY29ubmVjdCB0by4KLSAgICBAcGFyYW0gcG9ydChpbnQpICBUaGUgKFRDUCkgcG9ydCB0byBjb25uZWN0IHRvLgotICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaG9zdCBhbmQgcG9ydCB3aWxsIGJlIGlnbm9yZWQuKQotICAgICIiIgotICAgIHNlbGYuaG9zdCA9IGhvc3QKLSAgICBzZWxmLnBvcnQgPSBwb3J0Ci0gICAgc2VsZi5oYW5kbGUgPSBOb25lCi0gICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAotICAgIHNlbGYuX3RpbWVvdXQgPSBOb25lCisgICAgICAgIEBwYXJhbSBob3N0KHN0cikgIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgIEBwYXJhbSBwb3J0KGludCkgIFRoZSAoVENQKSBwb3J0IHRvIGNvbm5lY3QgdG8uCisgICAgICAgIEBwYXJhbSB1bml4X3NvY2tldChzdHIpICBUaGUgZmlsZW5hbWUgb2YgYSB1bml4IHNvY2tldCB0byBjb25uZWN0IHRvLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhvc3QgYW5kIHBvcnQgd2lsbCBiZSBpZ25vcmVkLikKKyAgICAgICAgQHBhcmFtIHNvY2tldF9mYW1pbHkoaW50KSAgVGhlIHNvY2tldCBmYW1pbHkgdG8gdXNlIHdpdGggdGhpcyBzb2NrZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKKyAgICAgICAgc2VsZi5fdGltZW91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKIAotICBkZWYgc2V0SGFuZGxlKHNlbGYsIGgpOgotICAgIHNlbGYuaGFuZGxlID0gaAorICAgIGRlZiBzZXRIYW5kbGUoc2VsZiwgaCk6CisgICAgICAgIHNlbGYuaGFuZGxlID0gaAogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlIGlzIG5vdCBOb25lCiAKLSAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgIGlmIG1zIGlzIE5vbmU6Ci0gICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl90aW1lb3V0ID0gbXMgLyAxMDAwLjAKKyAgICBkZWYgc2V0VGltZW91dChzZWxmLCBtcyk6CisgICAgICAgIGlmIG1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl90aW1lb3V0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdGltZW91dCA9IG1zIC8gMTAwMC4wCiAKLSAgICBpZiBzZWxmLmhhbmRsZSBpcyBub3QgTm9uZToKLSAgICAgIHNlbGYuaGFuZGxlLnNldHRpbWVvdXQoc2VsZi5fdGltZW91dCkKKyAgICAgICAgaWYgc2VsZi5oYW5kbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgdHJ5OgotICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKLSAgICAgIGZvciByZXMgaW4gcmVzMDoKLSAgICAgICAgc2VsZi5oYW5kbGUgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQotICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgZGVmIF9kb19vcGVuKHNlbGYsIGZhbWlseSwgc29ja3R5cGUpOgorICAgICAgICByZXR1cm4gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9hZGRyZXNzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdW5peF9zb2NrZXQgaWYgc2VsZi5fdW5peF9zb2NrZXQgZWxzZSAnJXM6JWQnICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkFMUkVBRFlfT1BFTikKICAgICAgICAgdHJ5OgotICAgICAgICAgIHNlbGYuaGFuZGxlLmNvbm5lY3QocmVzWzRdKQotICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgICAgIGlmIHJlcyBpcyBub3QgcmVzMFstMV06Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBlCi0gICAgICAgIGJyZWFrCi0gICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKLSAgICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgICBtZXNzYWdlID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIHNvY2tldCAlcycgJSBzZWxmLl91bml4X3NvY2tldAotICAgICAgZWxzZToKLSAgICAgICAgbWVzc2FnZSA9ICdDb3VsZCBub3QgY29ubmVjdCB0byAlczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlKQorICAgICAgICAgICAgYWRkcnMgPSBzZWxmLl9yZXNvbHZlQWRkcigpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBtc2cgPSAnZmFpbGVkIHRvIHJlc29sdmUgc29ja2FkZHIgZm9yICcgKyBzdHIoc2VsZi5fYWRkcmVzcykKKyAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24obXNnKQorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBtc2cpCisgICAgICAgIGZvciBmYW1pbHksIHNvY2t0eXBlLCBfLCBfLCBzb2NrYWRkciBpbiBhZGRyczoKKyAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuX2RvX29wZW4oZmFtaWx5LCBzb2NrdHlwZSkKKyAgICAgICAgICAgIGhhbmRsZS5zZXR0aW1lb3V0KHNlbGYuX3RpbWVvdXQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlLmNvbm5lY3Qoc29ja2FkZHIpCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGUgPSBoYW5kbGUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgaGFuZGxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQ291bGQgbm90IGNvbm5lY3QgdG8gJXMnLCBzb2NrYWRkciwgZXhjX2luZm89VHJ1ZSkKKyAgICAgICAgbXNnID0gJ0NvdWxkIG5vdCBjb25uZWN0IHRvIGFueSBvZiAlcycgJSBsaXN0KG1hcChsYW1iZGEgYTogYVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRycykpCisgICAgICAgIGxvZ2dlci5lcnJvcihtc2cpCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwgbXNnKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICB0cnk6Ci0gICAgICBidWZmID0gc2VsZi5oYW5kbGUucmVjdihzeikKLSAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgotICAgICAgaWYgKGUuYXJnc1swXSA9PSBlcnJuby5FQ09OTlJFU0VUIGFuZAotICAgICAgICAgIChzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbicgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSkpOgotICAgICAgICAjIGZyZWVic2QgYW5kIE1hY2ggZG9uJ3QgZm9sbG93IFBPU0lYIHNlbWFudGljIG9mIHJlY3YKLSAgICAgICAgIyBhbmQgZmFpbCB3aXRoIEVDT05OUkVTRVQgaWYgcGVlciBwZXJmb3JtZWQgc2h1dGRvd24uCi0gICAgICAgICMgU2VlIGNvcnJlc3BvbmRpbmcgY29tbWVudCBhbmQgY29kZSBpbiBUU29ja2V0OjpyZWFkKCkKLSAgICAgICAgIyBpbiBsaWIvY3BwL3NyYy90cmFuc3BvcnQvVFNvY2tldC5jcHAuCi0gICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAjIFRyaWdnZXIgdGhlIGNoZWNrIHRvIHJhaXNlIHRoZSBFTkRfT0ZfRklMRSBleGNlcHRpb24gYmVsb3cuCi0gICAgICAgIGJ1ZmYgPSAnJwotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UKLSAgICBpZiBsZW4oYnVmZikgPT0gMDoKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHJlYWQgMCBieXRlcycpCi0gICAgcmV0dXJuIGJ1ZmYKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1ZmYgPSBzZWxmLmhhbmRsZS5yZWN2KHN6KQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CisgICAgICAgICAgICBpZiAoZS5hcmdzWzBdID09IGVycm5vLkVDT05OUkVTRVQgYW5kCisgICAgICAgICAgICAgICAgICAgIChzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbicgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSkpOgorICAgICAgICAgICAgICAgICMgZnJlZWJzZCBhbmQgTWFjaCBkb24ndCBmb2xsb3cgUE9TSVggc2VtYW50aWMgb2YgcmVjdgorICAgICAgICAgICAgICAgICMgYW5kIGZhaWwgd2l0aCBFQ09OTlJFU0VUIGlmIHBlZXIgcGVyZm9ybWVkIHNodXRkb3duLgorICAgICAgICAgICAgICAgICMgU2VlIGNvcnJlc3BvbmRpbmcgY29tbWVudCBhbmQgY29kZSBpbiBUU29ja2V0OjpyZWFkKCkKKyAgICAgICAgICAgICAgICAjIGluIGxpYi9jcHAvc3JjL3RyYW5zcG9ydC9UU29ja2V0LmNwcC4KKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAjIFRyaWdnZXIgdGhlIGNoZWNrIHRvIHJhaXNlIHRoZSBFTkRfT0ZfRklMRSBleGNlcHRpb24gYmVsb3cuCisgICAgICAgICAgICAgICAgYnVmZiA9ICcnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIGxlbihidWZmKSA9PSAwOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RTb2NrZXQgcmVhZCAwIGJ5dGVzJykKKyAgICAgICAgcmV0dXJuIGJ1ZmYKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmZik6Ci0gICAgaWYgbm90IHNlbGYuaGFuZGxlOgotICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RyYW5zcG9ydCBub3Qgb3BlbicpCi0gICAgc2VudCA9IDAKLSAgICBoYXZlID0gbGVuKGJ1ZmYpCi0gICAgd2hpbGUgc2VudCA8IGhhdmU6Ci0gICAgICBwbHVzID0gc2VsZi5oYW5kbGUuc2VuZChidWZmKQotICAgICAgaWYgcGx1cyA9PSAwOgotICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKHR5cGU9VFRyYW5zcG9ydEV4Y2VwdGlvbi5FTkRfT0ZfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdUU29ja2V0IHNlbnQgMCBieXRlcycpCi0gICAgICBzZW50ICs9IHBsdXMKLSAgICAgIGJ1ZmYgPSBidWZmW3BsdXM6XQorICAgIGRlZiB3cml0ZShzZWxmLCBidWZmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFuZGxlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbih0eXBlPVRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RyYW5zcG9ydCBub3Qgb3BlbicpCisgICAgICAgIHNlbnQgPSAwCisgICAgICAgIGhhdmUgPSBsZW4oYnVmZikKKyAgICAgICAgd2hpbGUgc2VudCA8IGhhdmU6CisgICAgICAgICAgICBwbHVzID0gc2VsZi5oYW5kbGUuc2VuZChidWZmKQorICAgICAgICAgICAgaWYgcGx1cyA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24odHlwZT1UVHJhbnNwb3J0RXhjZXB0aW9uLkVORF9PRl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVFNvY2tldCBzZW50IDAgYnl0ZXMnKQorICAgICAgICAgICAgc2VudCArPSBwbHVzCisgICAgICAgICAgICBidWZmID0gYnVmZltwbHVzOl0KIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCiAKIGNsYXNzIFRTZXJ2ZXJTb2NrZXQoVFNvY2tldEJhc2UsIFRTZXJ2ZXJUcmFuc3BvcnRCYXNlKToKLSAgIiIiU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJUcmFuc3BvcnQgYmFzZS4iIiIKKyAgICAiIiJTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVFNlcnZlclRyYW5zcG9ydCBiYXNlLiIiIgogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PU5vbmUsIHBvcnQ9OTA5MCwgdW5peF9zb2NrZXQ9Tm9uZSk6Ci0gICAgc2VsZi5ob3N0ID0gaG9zdAotICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICBzZWxmLl91bml4X3NvY2tldCA9IHVuaXhfc29ja2V0Ci0gICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD05MDkwLCB1bml4X3NvY2tldD1Ob25lLCBzb2NrZXRfZmFtaWx5PXNvY2tldC5BRl9VTlNQRUMpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5fdW5peF9zb2NrZXQgPSB1bml4X3NvY2tldAorICAgICAgICBzZWxmLl9zb2NrZXRfZmFtaWx5ID0gc29ja2V0X2ZhbWlseQorICAgICAgICBzZWxmLmhhbmRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fYmFja2xvZyA9IDEyOAogCi0gIGRlZiBsaXN0ZW4oc2VsZik6Ci0gICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKLSAgICBmb3IgcmVzIGluIHJlczA6Ci0gICAgICBpZiByZXNbMF0gaXMgc29ja2V0LkFGX0lORVQ2IG9yIHJlcyBpcyByZXMwWy0xXToKLSAgICAgICAgYnJlYWsKKyAgICBkZWYgc2V0QmFja2xvZyhzZWxmLCBiYWNrbG9nPU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYW5kbGU6CisgICAgICAgICAgICBzZWxmLl9iYWNrbG9nID0gYmFja2xvZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXZSBjYW5uJ3QgdXBkYXRlIGJhY2tsb2cgd2hlbiBpdCBpcyBhbHJlYWR5IGxpc3RlbmluZywgc2luY2UgdGhlCisgICAgICAgICAgICAjIGhhbmRsZSBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1lvdSBoYXZlIHRvIHNldCBiYWNrbG9nIGJlZm9yZSBsaXN0ZW4uJykKIAotICAgICMgV2UgbmVlZCByZW1vdmUgdGhlIG9sZCB1bml4IHNvY2tldCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kCi0gICAgIyBub2JvZHkgaXMgbGlzdGVuaW5nIG9uIGl0LgotICAgIGlmIHNlbGYuX3VuaXhfc29ja2V0OgotICAgICAgdG1wID0gc29ja2V0LnNvY2tldChyZXNbMF0sIHJlc1sxXSkKLSAgICAgIHRyeToKLSAgICAgICAgdG1wLmNvbm5lY3QocmVzWzRdKQotICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgotICAgICAgICBlbm8sIG1lc3NhZ2UgPSBlcnIuYXJncwotICAgICAgICBpZiBlbm8gPT0gZXJybm8uRUNPTk5SRUZVU0VEOgotICAgICAgICAgIG9zLnVubGluayhyZXNbNF0pCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKKyAgICAgICAgc29ja2V0X2ZhbWlseSA9IHNlbGYuX3NvY2tldF9mYW1pbHkgPT0gc29ja2V0LkFGX1VOU1BFQyBhbmQgc29ja2V0LkFGX0lORVQ2IG9yIHNlbGYuX3NvY2tldF9mYW1pbHkKKyAgICAgICAgZm9yIHJlcyBpbiByZXMwOgorICAgICAgICAgICAgaWYgcmVzWzBdIGlzIHNvY2tldF9mYW1pbHkgb3IgcmVzIGlzIHJlczBbLTFdOgorICAgICAgICAgICAgICAgIGJyZWFrCiAKLSAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCi0gICAgc2VsZi5oYW5kbGUuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKLSAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgotICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQotICAgIHNlbGYuaGFuZGxlLmJpbmQocmVzWzRdKQotICAgIHNlbGYuaGFuZGxlLmxpc3RlbigxMjgpCisgICAgICAgICMgV2UgbmVlZCByZW1vdmUgdGhlIG9sZCB1bml4IHNvY2tldCBpZiB0aGUgZmlsZSBleGlzdHMgYW5kCisgICAgICAgICMgbm9ib2R5IGlzIGxpc3RlbmluZyBvbiBpdC4KKyAgICAgICAgaWYgc2VsZi5fdW5peF9zb2NrZXQ6CisgICAgICAgICAgICB0bXAgPSBzb2NrZXQuc29ja2V0KHJlc1swXSwgcmVzWzFdKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRtcC5jb25uZWN0KHJlc1s0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgIGVubywgbWVzc2FnZSA9IGVyci5hcmdzCisgICAgICAgICAgICAgICAgaWYgZW5vID09IGVycm5vLkVDT05OUkVGVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHJlc1s0XSkKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgIGNsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCi0gICAgcmVzdWx0ID0gVFNvY2tldCgpCi0gICAgcmVzdWx0LnNldEhhbmRsZShjbGllbnQpCi0gICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBzZWxmLmhhbmRsZSA9IHNvY2tldC5zb2NrZXQocmVzWzBdLCByZXNbMV0pCisgICAgICAgIHNlbGYuaGFuZGxlLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5oYW5kbGUsICdzZXR0aW1lb3V0Jyk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZS5zZXR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuaGFuZGxlLmJpbmQocmVzWzRdKQorICAgICAgICBzZWxmLmhhbmRsZS5saXN0ZW4oc2VsZi5fYmFja2xvZykKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIGNsaWVudCwgYWRkciA9IHNlbGYuaGFuZGxlLmFjY2VwdCgpCisgICAgICAgIHJlc3VsdCA9IFRTb2NrZXQoKQorICAgICAgICByZXN1bHQuc2V0SGFuZGxlKGNsaWVudCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKaW5kZXggNDQ4MTM3MS4uZDEzMDYwZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CkBAIC0xNywzMTQgKzE3LDQzOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KK2Zyb20gLi5jb21wYXQgaW1wb3J0IEJ1ZmZlcklPCiAKIAogY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbihURXhjZXB0aW9uKToKLSAgIiIiQ3VzdG9tIFRyYW5zcG9ydCBFeGNlcHRpb24gY2xhc3MiIiIKKyAgICAiIiJDdXN0b20gVHJhbnNwb3J0IEV4Y2VwdGlvbiBjbGFzcyIiIgogCi0gIFVOS05PV04gPSAwCi0gIE5PVF9PUEVOID0gMQotICBBTFJFQURZX09QRU4gPSAyCi0gIFRJTUVEX09VVCA9IDMKLSAgRU5EX09GX0ZJTEUgPSA0CisgICAgVU5LTk9XTiA9IDAKKyAgICBOT1RfT1BFTiA9IDEKKyAgICBBTFJFQURZX09QRU4gPSAyCisgICAgVElNRURfT1VUID0gMworICAgIEVORF9PRl9GSUxFID0gNAorICAgIE5FR0FUSVZFX1NJWkUgPSA1CisgICAgU0laRV9MSU1JVCA9IDYKKyAgICBJTlZBTElEX0NMSUVOVF9UWVBFID0gNwogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6Ci0gICAgVEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQotICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKIAogCi1jbGFzcyBUVHJhbnNwb3J0QmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKK2NsYXNzIFRUcmFuc3BvcnRCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHRyYW5zcG9ydCBsYXllci4iIiIKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgaXNPcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgcGFzcworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcGFzcwogCi0gIGRlZiByZWFkQWxsKHNlbGYsIHN6KToKLSAgICBidWZmID0gJycKLSAgICBoYXZlID0gMAotICAgIHdoaWxlIChoYXZlIDwgc3opOgotICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3ogLSBoYXZlKQotICAgICAgaGF2ZSArPSBsZW4oY2h1bmspCi0gICAgICBidWZmICs9IGNodW5rCisgICAgZGVmIHJlYWRBbGwoc2VsZiwgc3opOgorICAgICAgICBidWZmID0gYicnCisgICAgICAgIGhhdmUgPSAwCisgICAgICAgIHdoaWxlIChoYXZlIDwgc3opOgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJlYWQoc3ogLSBoYXZlKQorICAgICAgICAgICAgY2h1bmtMZW4gPSBsZW4oY2h1bmspCisgICAgICAgICAgICBoYXZlICs9IGNodW5rTGVuCisgICAgICAgICAgICBidWZmICs9IGNodW5rCiAKLSAgICAgIGlmIGxlbihjaHVuaykgPT0gMDoKLSAgICAgICAgcmFpc2UgRU9GRXJyb3IoKQorICAgICAgICAgICAgaWYgY2h1bmtMZW4gPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcigpCiAKLSAgICByZXR1cm4gYnVmZgorICAgICAgICByZXR1cm4gYnVmZgogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHBhc3MKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCiAKIAogIyBUaGlzIGNsYXNzIHNob3VsZCBiZSB0aG91Z2h0IG9mIGFzIGFuIGludGVyZmFjZS4KLWNsYXNzIENSZWFkYWJsZVRyYW5zcG9ydDoKLSAgIiIiYmFzZSBjbGFzcyBmb3IgdHJhbnNwb3J0cyB0aGF0IGFyZSByZWFkYWJsZSBmcm9tIEMiIiIKK2NsYXNzIENSZWFkYWJsZVRyYW5zcG9ydChvYmplY3QpOgorICAgICIiImJhc2UgY2xhc3MgZm9yIHRyYW5zcG9ydHMgdGhhdCBhcmUgcmVhZGFibGUgZnJvbSBDIiIiCiAKLSAgIyBUT0RPKGRyZWlzcyk6IFRoaW5rIGFib3V0IGNoYW5naW5nIHRoaXMgaW50ZXJmYWNlIHRvIGFsbG93IHVzIHRvIHVzZQotICAjICAgICAgICAgICAgICAgYSAoUHl0aG9uLCBub3QgYykgU3RyaW5nSU8gaW5zdGVhZCwgYmVjYXVzZSBpdCBhbGxvd3MKLSAgIyAgICAgICAgICAgICAgIHlvdSB0byB3cml0ZSBhZnRlciByZWFkaW5nLgorICAgICMgVE9ETyhkcmVpc3MpOiBUaGluayBhYm91dCBjaGFuZ2luZyB0aGlzIGludGVyZmFjZSB0byBhbGxvdyB1cyB0byB1c2UKKyAgICAjICAgICAgICAgICAgICAgYSAoUHl0aG9uLCBub3QgYykgU3RyaW5nSU8gaW5zdGVhZCwgYmVjYXVzZSBpdCBhbGxvd3MKKyAgICAjICAgICAgICAgICAgICAgeW91IHRvIHdyaXRlIGFmdGVyIHJlYWRpbmcuCiAKLSAgIyBOT1RFOiBUaGlzIGlzIGEgY2xhc3NpYyBjbGFzcywgc28gcHJvcGVydGllcyB3aWxsIE5PVCB3b3JrCi0gICMgICAgICAgY29ycmVjdGx5IGZvciBzZXR0aW5nLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgIiIiQSBjU3RyaW5nSU8gYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnQgY2h1bmsgd2UgYXJlIHJlYWRpbmcuIiIiCi0gICAgcGFzcworICAgICMgTk9URTogVGhpcyBpcyBhIGNsYXNzaWMgY2xhc3MsIHNvIHByb3BlcnRpZXMgd2lsbCBOT1Qgd29yaworICAgICMgICAgICAgY29ycmVjdGx5IGZvciBzZXR0aW5nLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICAiIiJBIGNTdHJpbmdJTyBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBjaHVuayB3ZSBhcmUgcmVhZGluZy4iIiIKKyAgICAgICAgcGFzcwogCi0gIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgotICAgICIiIlJlZmlsbHMgY3N0cmluZ2lvX2J1Zi4KKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgIiIiUmVmaWxscyBjc3RyaW5naW9fYnVmLgogCi0gICAgUmV0dXJucyB0aGUgY3VycmVudGx5IHVzZWQgYnVmZmVyICh3aGljaCBjYW4gYnV0IG5lZWQgbm90IGJlIHRoZSBzYW1lIGFzCi0gICAgdGhlIG9sZCBjc3RyaW5naW9fYnVmKS4gcGFydGlhbHJlYWQgaXMgd2hhdCB0aGUgQyBjb2RlIGhhcyByZWFkIGZyb20gdGhlCi0gICAgYnVmZmVyLCBhbmQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgYW55IG1vcmUgcmVhZHMuICBUaGUKLSAgICByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIG5ldywgbm90IGJvcnJvd2VkIHJlZmVyZW5jZS4gIFNvbWV0aGluZyBhbG9uZyB0aGUKLSAgICBsaW5lcyBvZiBzZWxmLl9idWYgc2hvdWxkIGJlIGZpbmUuCisgICAgICAgIFJldHVybnMgdGhlIGN1cnJlbnRseSB1c2VkIGJ1ZmZlciAod2hpY2ggY2FuIGJ1dCBuZWVkIG5vdCBiZSB0aGUgc2FtZSBhcworICAgICAgICB0aGUgb2xkIGNzdHJpbmdpb19idWYpLiBwYXJ0aWFscmVhZCBpcyB3aGF0IHRoZSBDIGNvZGUgaGFzIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgYnVmZmVyLCBhbmQgc2hvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgYW55IG1vcmUgcmVhZHMuICBUaGUKKyAgICAgICAgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBuZXcsIG5vdCBib3Jyb3dlZCByZWZlcmVuY2UuICBTb21ldGhpbmcgYWxvbmcgdGhlCisgICAgICAgIGxpbmVzIG9mIHNlbGYuX2J1ZiBzaG91bGQgYmUgZmluZS4KIAotICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KLSAgICAiIiIKLSAgICBwYXNzCisgICAgICAgIElmIHJlcWxlbiBieXRlcyBjYW4ndCBiZSByZWFkLCB0aHJvdyBFT0ZFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKIAogCi1jbGFzcyBUU2VydmVyVHJhbnNwb3J0QmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgVGhyaWZ0IHNlcnZlciB0cmFuc3BvcnRzLiIiIgorY2xhc3MgVFNlcnZlclRyYW5zcG9ydEJhc2Uob2JqZWN0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUaHJpZnQgc2VydmVyIHRyYW5zcG9ydHMuIiIiCiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICBwYXNzCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBhY2NlcHQoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHBhc3MKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcwogCiAKLWNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5QmFzZToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYSBUcmFuc3BvcnQgRmFjdG9yeSIiIgorY2xhc3MgVFRyYW5zcG9ydEZhY3RvcnlCYXNlKG9iamVjdCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYSBUcmFuc3BvcnQgRmFjdG9yeSIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIHJldHVybiB0cmFucworICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gdHJhbnMKIAogCi1jbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OgotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyBidWZmZXJlZCB0cmFuc3BvcnRzIiIiCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgYnVmZmVyZWQgdHJhbnNwb3J0cyIiIgogCi0gIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgotICAgIGJ1ZmZlcmVkID0gVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBidWZmZXJlZAorICAgIGRlZiBnZXRUcmFuc3BvcnQoc2VsZiwgdHJhbnMpOgorICAgICAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucykKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcmVkCiAKIAogY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBidWZmZXJzIGl0cyBJL08uCisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhbm90aGVyIHRyYW5zcG9ydCBhbmQgYnVmZmVycyBpdHMgSS9PLgogCi0gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgKGNvbmZpZ3VyYWJsZSkgZml4ZWQtc2l6ZSByZWFkIGJ1ZmZlcgotICBidXQgYnVmZmVycyBhbGwgd3JpdGVzIHVudGlsIGEgZmx1c2ggaXMgcGVyZm9ybWVkLgotICAiIiIKLSAgREVGQVVMVF9CVUZGRVIgPSA0MDk2CisgICAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYSAoY29uZmlndXJhYmxlKSBmaXhlZC1zaXplIHJlYWQgYnVmZmVyCisgICAgYnV0IGJ1ZmZlcnMgYWxsIHdyaXRlcyB1bnRpbCBhIGZsdXNoIGlzIHBlcmZvcm1lZC4KKyAgICAiIiIKKyAgICBERUZBVUxUX0JVRkZFUiA9IDQwOTYKIAotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZT1ERUZBVUxUX0JVRkZFUik6Ci0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCIiKQotICAgIHNlbGYuX19yYnVmX3NpemUgPSByYnVmX3NpemUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIHJidWZfc2l6ZT1ERUZBVUxUX0JVRkZFUik6CisgICAgICAgIHNlbGYuX190cmFucyA9IHRyYW5zCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAjIFBhc3Mgc3RyaW5nIGFyZ3VtZW50IHRvIGluaXRpYWxpemUgcmVhZCBidWZmZXIgYXMgY1N0cmluZ0lPLklucHV0VHlwZQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKGInJykKKyAgICAgICAgc2VsZi5fX3JidWZfc2l6ZSA9IHJidWZfc2l6ZQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkKG1heChzeiwgc2VsZi5fX3JidWZfc2l6ZSkpKQorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYucmVhZChzeikKIAotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oc2VsZi5fX3RyYW5zLnJlYWQobWF4KHN6LCBzZWxmLl9fcmJ1Zl9zaXplKSkpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgIyBvbiBleGNlcHRpb24gcmVzZXQgd2J1ZiBzbyBpdCBkb2Vzbid0IGNvbnRhaW4gYSBwYXJ0aWFsIGZ1bmN0aW9uIGNhbGwKKyAgICAgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAgICAgcmFpc2UgZQogCi0gIGRlZiB3cml0ZShzZWxmLCBidWYpOgotICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgIyByZXNldCB3YnVmIGJlZm9yZSB3cml0ZS9mbHVzaCB0byBwcmVzZXJ2ZSBzdGF0ZSBvbiB1bmRlcmx5aW5nIGZhaWx1cmUKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX190cmFucy53cml0ZShvdXQpCisgICAgICAgIHNlbGYuX190cmFucy5mbHVzaCgpCiAKLSAgZGVmIGZsdXNoKHNlbGYpOgotICAgIG91dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX190cmFucy53cml0ZShvdXQpCi0gICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKKyAgICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKLSAgIyBJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UuCi0gIEBwcm9wZXJ0eQotICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3JidWYKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKKyAgICAgICAgaWYgcmVxbGVuIDwgc2VsZi5fX3JidWZfc2l6ZToKKyAgICAgICAgICAgICMgdHJ5IHRvIG1ha2UgYSByZWFkIG9mIGFzIG11Y2ggYXMgd2UgY2FuLgorICAgICAgICAgICAgcmV0c3RyaW5nICs9IHNlbGYuX190cmFucy5yZWFkKHNlbGYuX19yYnVmX3NpemUpCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgcmV0c3RyaW5nID0gcGFydGlhbHJlYWQKLSAgICBpZiByZXFsZW4gPCBzZWxmLl9fcmJ1Zl9zaXplOgotICAgICAgIyB0cnkgdG8gbWFrZSBhIHJlYWQgb2YgYXMgbXVjaCBhcyB3ZSBjYW4uCi0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5fX3RyYW5zLnJlYWQoc2VsZi5fX3JidWZfc2l6ZSkKKyAgICAgICAgIyBidXQgbWFrZSBzdXJlIHdlIGRvIHJlYWQgcmVxbGVuIGJ5dGVzLgorICAgICAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKIAotICAgICMgYnV0IG1ha2Ugc3VyZSB3ZSBkbyByZWFkIHJlcWxlbiBieXRlcy4KLSAgICBpZiBsZW4ocmV0c3RyaW5nKSA8IHJlcWxlbjoKLSAgICAgIHJldHN0cmluZyArPSBzZWxmLl9fdHJhbnMucmVhZEFsbChyZXFsZW4gLSBsZW4ocmV0c3RyaW5nKSkKLQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocmV0c3RyaW5nKQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCiAKIAogY2xhc3MgVE1lbW9yeUJ1ZmZlcihUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKLSAgIiIiV3JhcHMgYSBjU3RyaW5nSU8gb2JqZWN0IGFzIGEgVFRyYW5zcG9ydC4KKyAgICAiIiJXcmFwcyBhIGNCeXRlc0lPIG9iamVjdCBhcyBhIFRUcmFuc3BvcnQuCiAKLSAgTk9URTogVW5saWtlIHRoZSBDKysgdmVyc2lvbiBvZiB0aGlzIGNsYXNzLCB5b3UgY2Fubm90IHdyaXRlIHRvIGl0Ci0gICAgICAgIHRoZW4gaW1tZWRpYXRlbHkgcmVhZCBmcm9tIGl0LiAgSWYgeW91IHdhbnQgdG8gcmVhZCBmcm9tIGEKLSAgICAgICAgVE1lbW9yeUJ1ZmZlciwgeW91IG11c3QgZWl0aGVyIHBhc3MgYSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLgotICBUT0RPKGRyZWlzcyk6IE1ha2UgdGhpcyB3b3JrIGxpa2UgdGhlIEMrKyB2ZXJzaW9uLgotICAiIiIKKyAgICBOT1RFOiBVbmxpa2UgdGhlIEMrKyB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MsIHlvdSBjYW5ub3Qgd3JpdGUgdG8gaXQKKyAgICAgICAgICB0aGVuIGltbWVkaWF0ZWx5IHJlYWQgZnJvbSBpdC4gIElmIHlvdSB3YW50IHRvIHJlYWQgZnJvbSBhCisgICAgICAgICAgVE1lbW9yeUJ1ZmZlciwgeW91IG11c3QgZWl0aGVyIHBhc3MgYSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgIFRPRE8oZHJlaXNzKTogTWFrZSB0aGlzIHdvcmsgbGlrZSB0aGUgQysrIHZlcnNpb24uCisgICAgIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPU5vbmUpOgotICAgICIiInZhbHVlIC0tIGEgdmFsdWUgdG8gcmVhZCBmcm9tIGZvciBzdHJpbmdpbworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lLCBvZmZzZXQ9MCk6CisgICAgICAgICIiInZhbHVlIC0tIGEgdmFsdWUgdG8gcmVhZCBmcm9tIGZvciBzdHJpbmdpbwogCi0gICAgSWYgdmFsdWUgaXMgc2V0LCB0aGlzIHdpbGwgYmUgYSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcsCi0gICAgb3RoZXJ3aXNlLCBpdCBpcyBmb3Igd3JpdGluZyIiIgotICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgotICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8odmFsdWUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX2J1ZmZlciA9IFN0cmluZ0lPKCkKKyAgICAgICAgSWYgdmFsdWUgaXMgc2V0LCB0aGlzIHdpbGwgYmUgYSB0cmFuc3BvcnQgZm9yIHJlYWRpbmcsCisgICAgICAgIG90aGVyd2lzZSwgaXQgaXMgZm9yIHdyaXRpbmciIiIKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBCdWZmZXJJTyh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgaWYgb2Zmc2V0OgorICAgICAgICAgICAgc2VsZi5fYnVmZmVyLnNlZWsob2Zmc2V0KQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIG5vdCBzZWxmLl9idWZmZXIuY2xvc2VkCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9idWZmZXIuY2xvc2VkCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBwYXNzCiAKLSAgZGVmIGNsb3NlKHNlbGYpOgotICAgIHNlbGYuX2J1ZmZlci5jbG9zZSgpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9idWZmZXIuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyLnJlYWQoc3opCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyLnJlYWQoc3opCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgc2VsZi5fYnVmZmVyLndyaXRlKGJ1ZikKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fYnVmZmVyLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgcGFzcworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGFzcwogCi0gIGRlZiBnZXR2YWx1ZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fYnVmZmVyLmdldHZhbHVlKCkKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIuZ2V0dmFsdWUoKQogCi0gICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgotICBAcHJvcGVydHkKLSAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2J1ZmZlcgorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyCiAKLSAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6Ci0gICAgIyBvbmx5IG9uZSBzaG90IGF0IHJlYWRpbmcuLi4KLSAgICByYWlzZSBFT0ZFcnJvcigpCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcGFydGlhbHJlYWQsIHJlcWxlbik6CisgICAgICAgICMgb25seSBvbmUgc2hvdCBhdCByZWFkaW5nLi4uCisgICAgICAgIHJhaXNlIEVPRkVycm9yKCkKIAogCi1jbGFzcyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeToKLSAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgZnJhbWVkIHRyYW5zcG9ydHMiIiIKK2NsYXNzIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KG9iamVjdCk6CisgICAgIiIiRmFjdG9yeSB0cmFuc3BvcnQgdGhhdCBidWlsZHMgZnJhbWVkIHRyYW5zcG9ydHMiIiIKIAotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKLSAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKQotICAgIHJldHVybiBmcmFtZWQKKyAgICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zKToKKyAgICAgICAgZnJhbWVkID0gVEZyYW1lZFRyYW5zcG9ydCh0cmFucykKKyAgICAgICAgcmV0dXJuIGZyYW1lZAogCiAKIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydEJhc2UsIENSZWFkYWJsZVRyYW5zcG9ydCk6Ci0gICIiIkNsYXNzIHRoYXQgd3JhcHMgYW5vdGhlciB0cmFuc3BvcnQgYW5kIGZyYW1lcyBpdHMgSS9PIHdoZW4gd3JpdGluZy4iIiIKKyAgICAiIiJDbGFzcyB0aGF0IHdyYXBzIGFub3RoZXIgdHJhbnNwb3J0IGFuZCBmcmFtZXMgaXRzIEkvTyB3aGVuIHdyaXRpbmcuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCk6Ci0gICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9fcmJ1ZiA9IFN0cmluZ0lPKCkKLSAgICBzZWxmLl9fd2J1ZiA9IFN0cmluZ0lPKCkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsKToKKyAgICAgICAgc2VsZi5fX3RyYW5zID0gdHJhbnMKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhiJycpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQogCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX190cmFucy5pc09wZW4oKQorICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgb3BlbihzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuY2xvc2UoKQogCi0gIGRlZiByZWFkKHNlbGYsIHN6KToKLSAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQotICAgIGlmIGxlbihyZXQpICE9IDA6Ci0gICAgICByZXR1cm4gcmV0CisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICByZXQgPSBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBpZiBsZW4ocmV0KSAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHJldAogCi0gICAgc2VsZi5yZWFkRnJhbWUoKQotICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQorICAgICAgICBzZWxmLnJlYWRGcmFtZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1Zi5yZWFkKHN6KQogCi0gIGRlZiByZWFkRnJhbWUoc2VsZik6Ci0gICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCi0gICAgc3osID0gdW5wYWNrKCchaScsIGJ1ZmYpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhzZWxmLl9fdHJhbnMucmVhZEFsbChzeikpCisgICAgZGVmIHJlYWRGcmFtZShzZWxmKToKKyAgICAgICAgYnVmZiA9IHNlbGYuX190cmFucy5yZWFkQWxsKDQpCisgICAgICAgIHN6LCA9IHVucGFjaygnIWknLCBidWZmKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHNlbGYuX190cmFucy5yZWFkQWxsKHN6KSkKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICB3c3ogPSBsZW4od291dCkKLSAgICAjIHJlc2V0IHdidWYgYmVmb3JlIHdyaXRlL2ZsdXNoIHRvIHByZXNlcnZlIHN0YXRlIG9uIHVuZGVybHlpbmcgZmFpbHVyZQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICMgTi5CLjogRG9pbmcgdGhpcyBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBXQVkgY2hlYXBlciB0aGFuIG1ha2luZwotICAgICMgdHdvIHNlcGFyYXRlIGNhbGxzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuIFNvY2tldCB3cml0ZXMgaW4KLSAgICAjIFB5dGhvbiB0dXJuIG91dCB0byBiZSBSRUFMTFkgZXhwZW5zaXZlLCBidXQgaXQgc2VlbXMgdG8gZG8gYSBwcmV0dHkKLSAgICAjIGdvb2Qgam9iIG9mIG1hbmFnaW5nIHN0cmluZyBidWZmZXIgb3BlcmF0aW9ucyB3aXRob3V0IGV4Y2Vzc2l2ZSBjb3BpZXMKLSAgICBidWYgPSBwYWNrKCIhaSIsIHdzeikgKyB3b3V0Ci0gICAgc2VsZi5fX3RyYW5zLndyaXRlKGJ1ZikKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgd3N6ID0gbGVuKHdvdXQpCisgICAgICAgICMgcmVzZXQgd2J1ZiBiZWZvcmUgd3JpdGUvZmx1c2ggdG8gcHJlc2VydmUgc3RhdGUgb24gdW5kZXJseWluZyBmYWlsdXJlCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQorICAgICAgICAjIE4uQi46IERvaW5nIHRoaXMgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgV0FZIGNoZWFwZXIgdGhhbiBtYWtpbmcKKyAgICAgICAgIyB0d28gc2VwYXJhdGUgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdC4gU29ja2V0IHdyaXRlcyBpbgorICAgICAgICAjIFB5dGhvbiB0dXJuIG91dCB0byBiZSBSRUFMTFkgZXhwZW5zaXZlLCBidXQgaXQgc2VlbXMgdG8gZG8gYSBwcmV0dHkKKyAgICAgICAgIyBnb29kIGpvYiBvZiBtYW5hZ2luZyBzdHJpbmcgYnVmZmVyIG9wZXJhdGlvbnMgd2l0aG91dCBleGNlc3NpdmUgY29waWVzCisgICAgICAgIGJ1ZiA9IHBhY2soIiFpIiwgd3N6KSArIHdvdXQKKyAgICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5fX3RyYW5zLmZsdXNoKCkKIAotICAjIEltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZS4KLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgICMgSW1wbGVtZW50IHRoZSBDUmVhZGFibGVUcmFuc3BvcnQgaW50ZXJmYWNlLgorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwcmVmaXgsIHJlcWxlbik6Ci0gICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAotICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAotICAgICMgd2UgY2FuIHN0YXJ0IHJlYWRpbmcgbmV3IGZyYW1lcyBpbW1lZGlhdGVseS4KLSAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKLSAgICAgIHNlbGYucmVhZEZyYW1lKCkKLSAgICAgIHByZWZpeCArPSBzZWxmLl9fcmJ1Zi5nZXR2YWx1ZSgpCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTyhwcmVmaXgpCi0gICAgcmV0dXJuIHNlbGYuX19yYnVmCisgICAgZGVmIGNzdHJpbmdpb19yZWZpbGwoc2VsZiwgcHJlZml4LCByZXFsZW4pOgorICAgICAgICAjIHNlbGYuX19yYnVmIHdpbGwgYWxyZWFkeSBiZSBlbXB0eSBoZXJlIGJlY2F1c2UgZmFzdGJpbmFyeSBkb2Vzbid0CisgICAgICAgICMgYXNrIGZvciBhIHJlZmlsbCB1bnRpbCB0aGUgcHJldmlvdXMgYnVmZmVyIGlzIGVtcHR5LiAgVGhlcmVmb3JlLAorICAgICAgICAjIHdlIGNhbiBzdGFydCByZWFkaW5nIG5ldyBmcmFtZXMgaW1tZWRpYXRlbHkuCisgICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgcmVxbGVuOgorICAgICAgICAgICAgc2VsZi5yZWFkRnJhbWUoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgogCiAKIGNsYXNzIFRGaWxlT2JqZWN0VHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlKToKLSAgIiIiV3JhcHMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIG1ha2UgaXQgd29yayBhcyBhIFRocmlmdCB0cmFuc3BvcnQuIiIiCisgICAgIiIiV3JhcHMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIG1ha2UgaXQgd29yayBhcyBhIFRocmlmdCB0cmFuc3BvcnQuIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgotICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgIHJldHVybiBUcnVlCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKIAotICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAKLSAgZGVmIHJlYWQoc2VsZiwgc3opOgotICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzeikKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzeikKIAotICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKLSAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogCi0gIGRlZiBmbHVzaChzZWxmKToKLSAgICBzZWxmLmZpbGVvYmouZmx1c2goKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmZsdXNoKCkKKworCitjbGFzcyBUU2FzbENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICAiIiIKKyAgICBTQVNMIHRyYW5zcG9ydAorICAgICIiIgorCisgICAgU1RBUlQgPSAxCisgICAgT0sgPSAyCisgICAgQkFEID0gMworICAgIEVSUk9SID0gNAorICAgIENPTVBMRVRFID0gNQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgaG9zdCwgc2VydmljZSwgbWVjaGFuaXNtPSdHU1NBUEknLAorICAgICAgICAgICAgICAgICAqKnNhc2xfa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIHRyYW5zcG9ydDogYW4gdW5kZXJseWluZyB0cmFuc3BvcnQgdG8gdXNlLCB0eXBpY2FsbHkganVzdCBhIFRTb2NrZXQKKyAgICAgICAgaG9zdDogdGhlIG5hbWUgb2YgdGhlIHNlcnZlciwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgc2VydmljZTogdGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHNlcnZpY2UsIGZyb20gYSBTQVNMIHBlcnNwZWN0aXZlCisgICAgICAgIG1lY2hhbmlzbTogdGhlIG5hbWUgb2YgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gdG8gdXNlCisKKyAgICAgICAgQWxsIG90aGVyIGt3YXJncyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgcHVyZXNhc2wuY2xpZW50LlNBU0xDbGllbnQKKyAgICAgICAgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorCisgICAgICAgIGZyb20gcHVyZXNhc2wuY2xpZW50IGltcG9ydCBTQVNMQ2xpZW50CisKKyAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICAgICAgc2VsZi5zYXNsID0gU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCisKKyAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oYicnKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnRyYW5zcG9ydC5pc09wZW4oKToKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0Lm9wZW4oKQorCisgICAgICAgIHNlbGYuc2VuZF9zYXNsX21zZyhzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBzZWxmLnNlbmRfc2FzbF9tc2coc2VsZi5PSywgc2VsZi5zYXNsLnByb2Nlc3MoKSkKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgc3RhdHVzLCBjaGFsbGVuZ2UgPSBzZWxmLnJlY3Zfc2FzbF9tc2coKQorICAgICAgICAgICAgaWYgc3RhdHVzID09IHNlbGYuT0s6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Nhc2xfbXNnKHNlbGYuT0ssIHNlbGYuc2FzbC5wcm9jZXNzKGNoYWxsZW5nZSkpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBzZXJ2ZXIgZXJyb25lb3VzbHkgaW5kaWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IFNBU0wgbmVnb3RpYXRpb24gd2FzIGNvbXBsZXRlIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAiQmFkIFNBU0wgbmVnb3RpYXRpb24gc3RhdHVzOiAlZCAoJXMpIgorICAgICAgICAgICAgICAgICAgICAlIChzdGF0dXMsIGNoYWxsZW5nZSkpCisKKyAgICBkZWYgc2VuZF9zYXNsX21zZyhzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBoZWFkZXIgPSBwYWNrKCI+QkkiLCBzdGF0dXMsIGxlbihib2R5KSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGUoaGVhZGVyICsgYm9keSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorCisgICAgZGVmIHJlY3Zfc2FzbF9tc2coc2VsZik6CisgICAgICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNSkKKyAgICAgICAgc3RhdHVzLCBsZW5ndGggPSB1bnBhY2soIj5CSSIsIGhlYWRlcikKKyAgICAgICAgaWYgbGVuZ3RoID4gMDoKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheWxvYWQgPSAiIgorICAgICAgICByZXR1cm4gc3RhdHVzLCBwYXlsb2FkCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGRhdGEpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGRhdGEgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGVuY29kZWQgPSBzZWxmLnNhc2wud3JhcChkYXRhKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZSgnJy5qb2luKChwYWNrKCIhaSIsIGxlbihlbmNvZGVkKSksIGVuY29kZWQpKSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKworICAgIGRlZiByZWFkKHNlbGYsIHN6KToKKyAgICAgICAgcmV0ID0gc2VsZi5fX3JidWYucmVhZChzeikKKyAgICAgICAgaWYgbGVuKHJldCkgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgICAgICBzZWxmLl9yZWFkX2ZyYW1lKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmLnJlYWQoc3opCisKKyAgICBkZWYgX3JlYWRfZnJhbWUoc2VsZik6CisgICAgICAgIGhlYWRlciA9IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoNCkKKyAgICAgICAgbGVuZ3RoLCA9IHVucGFjaygnIWknLCBoZWFkZXIpCisgICAgICAgIGVuY29kZWQgPSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKGxlbmd0aCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhzZWxmLnNhc2wudW53cmFwKGVuY29kZWQpKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNhc2wuZGlzcG9zZSgpCisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKKworICAgICMgYmFzZWQgb24gVEZyYW1lZFRyYW5zcG9ydAorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHByZWZpeCwgcmVxbGVuKToKKyAgICAgICAgIyBzZWxmLl9fcmJ1ZiB3aWxsIGFscmVhZHkgYmUgZW1wdHkgaGVyZSBiZWNhdXNlIGZhc3RiaW5hcnkgZG9lc24ndAorICAgICAgICAjIGFzayBmb3IgYSByZWZpbGwgdW50aWwgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBlbXB0eS4gIFRoZXJlZm9yZSwKKyAgICAgICAgIyB3ZSBjYW4gc3RhcnQgcmVhZGluZyBuZXcgZnJhbWVzIGltbWVkaWF0ZWx5LgorICAgICAgICB3aGlsZSBsZW4ocHJlZml4KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfZnJhbWUoKQorICAgICAgICAgICAgcHJlZml4ICs9IHNlbGYuX19yYnVmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTyhwcmVmaXgpCisgICAgICAgIHJldHVybiBzZWxmLl9fcmJ1ZgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQppbmRleCAzY2UzZWIyLi5hMjdmMGFkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQpAQCAtMTcsMTQgKzE3LDE1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gaW8gaW1wb3J0IEJ5dGVzSU8KK2ltcG9ydCBzdHJ1Y3QKIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cywgSW50ZXJmYWNlLCBBdHRyaWJ1dGUKLWZyb20gdHdpc3RlZC5pbnRlcm5ldC5wcm90b2NvbCBpbXBvcnQgUHJvdG9jb2wsIFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKK2Zyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IGltcGxlbWVudGVyLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQorZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBTZXJ2ZXJGYWN0b3J5LCBDbGllbnRGYWN0b3J5LCBcCiAgICAgY29ubmVjdGlvbkRvbmUKIGZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIKK2Zyb20gdHdpc3RlZC5pbnRlcm5ldC50aHJlYWRzIGltcG9ydCBkZWZlclRvVGhyZWFkCiBmcm9tIHR3aXN0ZWQucHJvdG9jb2xzIGltcG9ydCBiYXNpYwotZnJvbSB0d2lzdGVkLnB5dGhvbiBpbXBvcnQgbG9nCiBmcm9tIHR3aXN0ZWQud2ViIGltcG9ydCBzZXJ2ZXIsIHJlc291cmNlLCBodHRwCiAKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydApAQCAtMzMsMTUgKzM0LDE1IEBACiBjbGFzcyBUTWVzc2FnZVNlbmRlclRyYW5zcG9ydChUVHJhbnNwb3J0LlRUcmFuc3BvcnRCYXNlKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnl0ZXNJTygpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKICAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCiAgICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgICBtc2cgPSBzZWxmLl9fd2J1Zi5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLnNlbmRNZXNzYWdlKG1zZykKKyAgICAgICAgc2VsZi5fX3didWYgPSBCeXRlc0lPKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VuZE1lc3NhZ2UobXNnKQogCiAgICAgZGVmIHNlbmRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCkBAIC01NCw3ICs1NSw3IEBACiAgICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKIAogICAgIGRlZiBzZW5kTWVzc2FnZShzZWxmLCBtZXNzYWdlKToKLSAgICAgICAgc2VsZi5mdW5jKG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBzZWxmLmZ1bmMobWVzc2FnZSkKIAogCiBjbGFzcyBUaHJpZnRDbGllbnRQcm90b2NvbChiYXNpYy5JbnQzMlN0cmluZ1JlY2VpdmVyKToKQEAgLTgxLDExICs4MiwxOCBAQAogICAgICAgICBzZWxmLnN0YXJ0ZWQuY2FsbGJhY2soc2VsZi5jbGllbnQpCiAKICAgICBkZWYgY29ubmVjdGlvbkxvc3Qoc2VsZiwgcmVhc29uPWNvbm5lY3Rpb25Eb25lKToKLSAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5jbGllbnQuX3JlcXMuaXRlcml0ZW1zKCk6CisgICAgICAgICMgdGhlIGNhbGxlZCBlcnJiYWNrcyBjYW4gYWRkIGl0ZW1zIHRvIG91ciBjbGllbnQncyBfcmVxcywKKyAgICAgICAgIyBzbyB3ZSBuZWVkIHRvIHVzZSBhIHRtcCwgYW5kIGl0ZXJhdGUgdW50aWwgbm8gbW9yZSByZXF1ZXN0cworICAgICAgICAjIGFyZSBhZGRlZCBkdXJpbmcgZXJyYmFja3MKKyAgICAgICAgaWYgc2VsZi5jbGllbnQ6CiAgICAgICAgICAgICB0ZXggPSBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgdHlwZT1UVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24uRU5EX09GX0ZJTEUsCi0gICAgICAgICAgICAgICAgbWVzc2FnZT0nQ29ubmVjdGlvbiBjbG9zZWQnKQotICAgICAgICAgICAgdi5lcnJiYWNrKHRleCkKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSdDb25uZWN0aW9uIGNsb3NlZCAoJXMpJyAlIHJlYXNvbikKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuY2xpZW50Ll9yZXFzOgorICAgICAgICAgICAgICAgIF8sIHYgPSBzZWxmLmNsaWVudC5fcmVxcy5wb3BpdGVtKCkKKyAgICAgICAgICAgICAgICB2LmVycmJhY2sodGV4KQorICAgICAgICAgICAgZGVsIHNlbGYuY2xpZW50Ll9yZXFzCisgICAgICAgICAgICBzZWxmLmNsaWVudCA9IE5vbmUKIAogICAgIGRlZiBzdHJpbmdSZWNlaXZlZChzZWxmLCBmcmFtZSk6CiAgICAgICAgIHRyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGZyYW1lKQpAQCAtMTAxLDYgKzEwOSwxMDggQEAKICAgICAgICAgbWV0aG9kKGlwcm90LCBtdHlwZSwgcnNlcWlkKQogCiAKK2NsYXNzIFRocmlmdFNBU0xDbGllbnRQcm90b2NvbChUaHJpZnRDbGllbnRQcm90b2NvbCk6CisKKyAgICBTVEFSVCA9IDEKKyAgICBPSyA9IDIKKyAgICBCQUQgPSAzCisgICAgRVJST1IgPSA0CisgICAgQ09NUExFVEUgPSA1CisKKyAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaG9zdD1Ob25lLCBzZXJ2aWNlPU5vbmUsIG1lY2hhbmlzbT0nR1NTQVBJJywgKipzYXNsX2t3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBob3N0OiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyLCBmcm9tIGEgU0FTTCBwZXJzcGVjdGl2ZQorICAgICAgICBzZXJ2aWNlOiB0aGUgbmFtZSBvZiB0aGUgc2VydmVyJ3Mgc2VydmljZSwgZnJvbSBhIFNBU0wgcGVyc3BlY3RpdmUKKyAgICAgICAgbWVjaGFuaXNtOiB0aGUgbmFtZSBvZiB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSB0byB1c2UKKworICAgICAgICBBbGwgb3RoZXIga3dhcmdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBwdXJlc2FzbC5jbGllbnQuU0FTTENsaWVudAorICAgICAgICBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZnJvbSBwdXJlc2FzbC5jbGllbnQgaW1wb3J0IFNBU0xDbGllbnQKKyAgICAgICAgc2VsZi5TQVNMQ0xpZW50ID0gU0FTTENsaWVudAorCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLl9faW5pdF9fKHNlbGYsIGNsaWVudF9jbGFzcywgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeSkKKworICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkID0gTm9uZQorICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cyA9IE5vbmUKKyAgICAgICAgc2VsZi5jbGllbnQgPSBOb25lCisKKyAgICAgICAgaWYgaG9zdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlU0FTTENsaWVudChob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqc2FzbF9rd2FyZ3MpCisKKyAgICBkZWYgY3JlYXRlU0FTTENsaWVudChzZWxmLCBob3N0LCBzZXJ2aWNlLCBtZWNoYW5pc20sICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5zYXNsID0gc2VsZi5TQVNMQ2xpZW50KGhvc3QsIHNlcnZpY2UsIG1lY2hhbmlzbSwgKiprd2FyZ3MpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgbXNnKToKKyAgICAgICAgZW5jb2RlZCA9IHNlbGYuc2FzbC53cmFwKG1zZykKKyAgICAgICAgbGVuX2FuZF9lbmNvZGVkID0gJycuam9pbigoc3RydWN0LnBhY2soJyFpJywgbGVuKGVuY29kZWQpKSwgZW5jb2RlZCkpCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmRpc3BhdGNoKHNlbGYsIGxlbl9hbmRfZW5jb2RlZCkKKworICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKKyAgICBkZWYgY29ubmVjdGlvbk1hZGUoc2VsZik6CisgICAgICAgIHNlbGYuX3NlbmRTQVNMTWVzc2FnZShzZWxmLlNUQVJULCBzZWxmLnNhc2wubWVjaGFuaXNtKQorICAgICAgICBpbml0aWFsX21lc3NhZ2UgPSB5aWVsZCBkZWZlclRvVGhyZWFkKHNlbGYuc2FzbC5wcm9jZXNzKQorICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5PSywgaW5pdGlhbF9tZXNzYWdlKQorCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzdGF0dXMsIGNoYWxsZW5nZSA9IHlpZWxkIHNlbGYuX3JlY2VpdmVTQVNMTWVzc2FnZSgpCisgICAgICAgICAgICBpZiBzdGF0dXMgPT0gc2VsZi5PSzoKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHlpZWxkIGRlZmVyVG9UaHJlYWQoc2VsZi5zYXNsLnByb2Nlc3MsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kU0FTTE1lc3NhZ2Uoc2VsZi5PSywgcmVzcG9uc2UpCisgICAgICAgICAgICBlbGlmIHN0YXR1cyA9PSBzZWxmLkNPTVBMRVRFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNhc2wuY29tcGxldGU6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJUaGUgc2VydmVyIGVycm9uZW91c2x5IGluZGljYXRlZCB0aGF0IFNBU0wgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWdvdGlhdGlvbiB3YXMgY29tcGxldGUiCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbihtc2csIG1lc3NhZ2U9bXNnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1zZyA9ICJCYWQgU0FTTCBuZWdvdGlhdGlvbiBzdGF0dXM6ICVkICglcykiICUgKHN0YXR1cywgY2hhbGxlbmdlKQorICAgICAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbihtc2csIG1lc3NhZ2U9bXNnKQorCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBOb25lCisgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLmNvbm5lY3Rpb25NYWRlKHNlbGYpCisKKyAgICBkZWYgX3NlbmRTQVNMTWVzc2FnZShzZWxmLCBzdGF0dXMsIGJvZHkpOgorICAgICAgICBpZiBib2R5IGlzIE5vbmU6CisgICAgICAgICAgICBib2R5ID0gIiIKKyAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soIj5CSSIsIHN0YXR1cywgbGVuKGJvZHkpKQorICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZShoZWFkZXIgKyBib2R5KQorCisgICAgZGVmIF9yZWNlaXZlU0FTTE1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fZGVmZXJyZWQgPSBkZWZlci5EZWZlcnJlZCgpCisgICAgICAgIHNlbGYuX3Nhc2xfbmVnb3RpYXRpb25fc3RhdHVzID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZAorCisgICAgZGVmIGNvbm5lY3Rpb25Mb3N0KHNlbGYsIHJlYXNvbj1jb25uZWN0aW9uRG9uZSk6CisgICAgICAgIGlmIHNlbGYuY2xpZW50OgorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuY29ubmVjdGlvbkxvc3Qoc2VsZiwgcmVhc29uKQorCisgICAgZGVmIGRhdGFSZWNlaXZlZChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9kZWZlcnJlZDoKKyAgICAgICAgICAgICMgd2UgZ290IGEgc2FzbCBjaGFsbGVuZ2UgaW4gdGhlIGZvcm1hdCAoc3RhdHVzLCBsZW5ndGgsIGNoYWxsZW5nZSkKKyAgICAgICAgICAgICMgc2F2ZSB0aGUgc3RhdHVzLCBsZXQgSW50TlN0cmluZ1JlY2VpdmVyIHBpZWNlIHRoZSBjaGFsbGVuZ2UgZGF0YSB0b2dldGhlcgorICAgICAgICAgICAgc2VsZi5fc2FzbF9uZWdvdGlhdGlvbl9zdGF0dXMsID0gc3RydWN0LnVucGFjaygiQiIsIGRhdGFbMF0pCisgICAgICAgICAgICBUaHJpZnRDbGllbnRQcm90b2NvbC5kYXRhUmVjZWl2ZWQoc2VsZiwgZGF0YVsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5vcm1hbCBmcmFtZSwgbGV0IEludE5TdHJpbmdSZWNlaXZlciBwaWVjZSBpdCB0b2dldGhlcgorICAgICAgICAgICAgVGhyaWZ0Q2xpZW50UHJvdG9jb2wuZGF0YVJlY2VpdmVkKHNlbGYsIGRhdGEpCisKKyAgICBkZWYgc3RyaW5nUmVjZWl2ZWQoc2VsZiwgZnJhbWUpOgorICAgICAgICBpZiBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkOgorICAgICAgICAgICAgIyB0aGUgZnJhbWUgaXMganVzdCBhIFNBU0wgY2hhbGxlbmdlCisgICAgICAgICAgICByZXNwb25zZSA9IChzZWxmLl9zYXNsX25lZ290aWF0aW9uX3N0YXR1cywgZnJhbWUpCisgICAgICAgICAgICBzZWxmLl9zYXNsX25lZ290aWF0aW9uX2RlZmVycmVkLmNhbGxiYWNrKHJlc3BvbnNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGVyZSdzIGEgc2Vjb25kIDQgYnl0ZSBsZW5ndGggcHJlZml4IGluc2lkZSB0aGUgZnJhbWUKKyAgICAgICAgICAgIGRlY29kZWRfZnJhbWUgPSBzZWxmLnNhc2wudW53cmFwKGZyYW1lWzQ6XSkKKyAgICAgICAgICAgIFRocmlmdENsaWVudFByb3RvY29sLnN0cmluZ1JlY2VpdmVkKHNlbGYsIGRlY29kZWRfZnJhbWUpCisKKwogY2xhc3MgVGhyaWZ0U2VydmVyUHJvdG9jb2woYmFzaWMuSW50MzJTdHJpbmdSZWNlaXZlcik6CiAKICAgICBNQVhfTEVOR1RIID0gMiAqKiAzMSAtIDEKQEAgLTEyNiw3ICsyMzYsNyBAQAogCiAgICAgICAgIGQgPSBzZWxmLmZhY3RvcnkucHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICBkLmFkZENhbGxiYWNrcyhzZWxmLnByb2Nlc3NPaywgc2VsZi5wcm9jZXNzRXJyb3IsCi0gICAgICAgICAgICBjYWxsYmFja0FyZ3M9KHRtbywpKQorICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0FyZ3M9KHRtbywpKQogCiAKIGNsYXNzIElUaHJpZnRTZXJ2ZXJGYWN0b3J5KEludGVyZmFjZSk6CkBAIC0xNDcsMTAgKzI1Nyw5IEBACiAgICAgb3Byb3RfZmFjdG9yeSA9IEF0dHJpYnV0ZSgiT3V0cHV0IHByb3RvY29sIGZhY3RvcnkiKQogCiAKK0BpbXBsZW1lbnRlcihJVGhyaWZ0U2VydmVyRmFjdG9yeSkKIGNsYXNzIFRocmlmdFNlcnZlckZhY3RvcnkoU2VydmVyRmFjdG9yeSk6CiAKLSAgICBpbXBsZW1lbnRzKElUaHJpZnRTZXJ2ZXJGYWN0b3J5KQotCiAgICAgcHJvdG9jb2wgPSBUaHJpZnRTZXJ2ZXJQcm90b2NvbAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3NvciwgaXByb3RfZmFjdG9yeSwgb3Byb3RfZmFjdG9yeT1Ob25lKToKQEAgLTE2MiwxMCArMjcxLDkgQEAKICAgICAgICAgICAgIHNlbGYub3Byb3RfZmFjdG9yeSA9IG9wcm90X2ZhY3RvcnkKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdENsaWVudEZhY3RvcnkpCiBjbGFzcyBUaHJpZnRDbGllbnRGYWN0b3J5KENsaWVudEZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0Q2xpZW50RmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0Q2xpZW50UHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbGllbnRfY2xhc3MsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0xNzgsNyArMjg2LDcgQEAKIAogICAgIGRlZiBidWlsZFByb3RvY29sKHNlbGYsIGFkZHIpOgogICAgICAgICBwID0gc2VsZi5wcm90b2NvbChzZWxmLmNsaWVudF9jbGFzcywgc2VsZi5pcHJvdF9mYWN0b3J5LAotICAgICAgICAgICAgc2VsZi5vcHJvdF9mYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkpCiAgICAgICAgIHAuZmFjdG9yeSA9IHNlbGYKICAgICAgICAgcmV0dXJuIHAKIApAQCAtMTg4LDcgKzI5Niw3IEBACiAgICAgYWxsb3dlZE1ldGhvZHMgPSAoJ1BPU1QnLCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSk6CisgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeT1Ob25lKToKICAgICAgICAgcmVzb3VyY2UuUmVzb3VyY2UuX19pbml0X18oc2VsZikKICAgICAgICAgc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIGlmIG91dHB1dFByb3RvY29sRmFjdG9yeSBpcyBOb25lOgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQppbmRleCBhMmY0MmE1Li5lODQ4NTc5IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5weQpAQCAtMjQsMjI1ICsyNCwyMjUgQEAKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgogaW1wb3J0IHpsaWIKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSBUVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0Citmcm9tIC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0Citmcm9tIC4uY29tcGF0IGltcG9ydCBCdWZmZXJJTwogCiAKIGNsYXNzIFRabGliVHJhbnNwb3J0RmFjdG9yeShvYmplY3QpOgotICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyB6bGliIGNvbXByZXNzZWQgdHJhbnNwb3J0cy4KKyAgICAiIiJGYWN0b3J5IHRyYW5zcG9ydCB0aGF0IGJ1aWxkcyB6bGliIGNvbXByZXNzZWQgdHJhbnNwb3J0cy4KIAotICBUaGlzIGZhY3RvcnkgY2FjaGVzIHRoZSBsYXN0IHNpbmdsZSBjbGllbnQvdHJhbnNwb3J0IHRoYXQgaXQgd2FzIHBhc3NlZAotICBhbmQgcmV0dXJucyB0aGUgc2FtZSBUWmxpYlRyYW5zcG9ydCBvYmplY3QgdGhhdCB3YXMgY3JlYXRlZC4KKyAgICBUaGlzIGZhY3RvcnkgY2FjaGVzIHRoZSBsYXN0IHNpbmdsZSBjbGllbnQvdHJhbnNwb3J0IHRoYXQgaXQgd2FzIHBhc3NlZAorICAgIGFuZCByZXR1cm5zIHRoZSBzYW1lIFRabGliVHJhbnNwb3J0IG9iamVjdCB0aGF0IHdhcyBjcmVhdGVkLgogCi0gIFRoaXMgY2FjaGluZyBtZWFucyB0aGUgVFNlcnZlciBjbGFzcyB3aWxsIGdldCB0aGUgX3NhbWVfIHRyYW5zcG9ydAotICBvYmplY3QgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIGZyb20gdGhpcyBmYWN0b3J5LgotICAoRm9yIG5vbi10aHJlYWRlZCBzY2VuYXJpb3Mgb25seSwgc2luY2UgdGhlIGNhY2hlIG9ubHkgaG9sZHMgb25lIG9iamVjdCkKKyAgICBUaGlzIGNhY2hpbmcgbWVhbnMgdGhlIFRTZXJ2ZXIgY2xhc3Mgd2lsbCBnZXQgdGhlIF9zYW1lXyB0cmFuc3BvcnQKKyAgICBvYmplY3QgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCB0cmFuc3BvcnRzIGZyb20gdGhpcyBmYWN0b3J5LgorICAgIChGb3Igbm9uLXRocmVhZGVkIHNjZW5hcmlvcyBvbmx5LCBzaW5jZSB0aGUgY2FjaGUgb25seSBob2xkcyBvbmUgb2JqZWN0KQogCi0gIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2FjaGluZyBpcyB0byBhbGxvY2F0ZSBvbmx5IG9uZSBUWmxpYlRyYW5zcG9ydCB3aGVyZQotICBvbmx5IG9uZSBpcyByZWFsbHkgbmVlZGVkIChzaW5jZSBpdCBtdXN0IGhhdmUgc2VwYXJhdGUgcmVhZC93cml0ZSBidWZmZXJzKSwKLSAgYW5kIG1ha2VzIHRoZSBzdGF0aXN0aWNzIGZyb20gZ2V0Q29tcFNhdmluZ3MoKSBhbmQgZ2V0Q29tcFJhdGlvKCkKLSAgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCi0gICIiIgotICAjIGNsYXNzIHNjb3BlZCBjYWNoZSBvZiBsYXN0IHRyYW5zcG9ydCBnaXZlbiBhbmQgemxpYnRyYW5zcG9ydCByZXR1cm5lZAotICBfbGFzdF90cmFucyA9IE5vbmUKLSAgX2xhc3RfeiA9IE5vbmUKLQotICBkZWYgZ2V0VHJhbnNwb3J0KHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgotICAgICIiIldyYXAgYSB0cmFuc3BvcnQsIHRyYW5zLCB3aXRoIHRoZSBUWmxpYlRyYW5zcG9ydAotICAgIGNvbXByZXNzZWQgdHJhbnNwb3J0IGNsYXNzLCByZXR1cm5pbmcgYSBuZXcKLSAgICB0cmFuc3BvcnQgdG8gdGhlIGNhbGxlci4KLQotICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZwotICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdHMgdG8gOS4KLSAgICBAdHlwZSBjb21wcmVzc2xldmVsOiBpbnQKLQotICAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBUWmxpYlRyYW5zcG9ydCB3aGljaCB3cmFwcyB0aGUKLSAgICBwYXNzZWQgQ3t0cmFuc30gVFRyYW5zcG9ydCBkZXJpdmVkIGluc3RhbmNlLgorICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2FjaGluZyBpcyB0byBhbGxvY2F0ZSBvbmx5IG9uZSBUWmxpYlRyYW5zcG9ydCB3aGVyZQorICAgIG9ubHkgb25lIGlzIHJlYWxseSBuZWVkZWQgKHNpbmNlIGl0IG11c3QgaGF2ZSBzZXBhcmF0ZSByZWFkL3dyaXRlIGJ1ZmZlcnMpLAorICAgIGFuZCBtYWtlcyB0aGUgc3RhdGlzdGljcyBmcm9tIGdldENvbXBTYXZpbmdzKCkgYW5kIGdldENvbXBSYXRpbygpCisgICAgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCiAgICAgIiIiCi0gICAgaWYgdHJhbnMgPT0gc2VsZi5fbGFzdF90cmFuczoKLSAgICAgIHJldHVybiBzZWxmLl9sYXN0X3oKLSAgICB6dHJhbnMgPSBUWmxpYlRyYW5zcG9ydCh0cmFucywgY29tcHJlc3NsZXZlbCkKLSAgICBzZWxmLl9sYXN0X3RyYW5zID0gdHJhbnMKLSAgICBzZWxmLl9sYXN0X3ogPSB6dHJhbnMKLSAgICByZXR1cm4genRyYW5zCisgICAgIyBjbGFzcyBzY29wZWQgY2FjaGUgb2YgbGFzdCB0cmFuc3BvcnQgZ2l2ZW4gYW5kIHpsaWJ0cmFuc3BvcnQgcmV0dXJuZWQKKyAgICBfbGFzdF90cmFucyA9IE5vbmUKKyAgICBfbGFzdF96ID0gTm9uZQorCisgICAgZGVmIGdldFRyYW5zcG9ydChzZWxmLCB0cmFucywgY29tcHJlc3NsZXZlbD05KToKKyAgICAgICAgIiIiV3JhcCBhIHRyYW5zcG9ydCwgdHJhbnMsIHdpdGggdGhlIFRabGliVHJhbnNwb3J0CisgICAgICAgIGNvbXByZXNzZWQgdHJhbnNwb3J0IGNsYXNzLCByZXR1cm5pbmcgYSBuZXcKKyAgICAgICAgdHJhbnNwb3J0IHRvIHRoZSBjYWxsZXIuCisKKyAgICAgICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCisgICAgICAgIGZyb20gMCAobm8gY29tcHJlc3Npb24pIHRvIDkgKGJlc3QgY29tcHJlc3Npb24pLiAgRGVmYXVsdHMgdG8gOS4KKyAgICAgICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50CisKKyAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBhIFRabGliVHJhbnNwb3J0IHdoaWNoIHdyYXBzIHRoZQorICAgICAgICBwYXNzZWQgQ3t0cmFuc30gVFRyYW5zcG9ydCBkZXJpdmVkIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdHJhbnMgPT0gc2VsZi5fbGFzdF90cmFuczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9sYXN0X3oKKyAgICAgICAgenRyYW5zID0gVFpsaWJUcmFuc3BvcnQodHJhbnMsIGNvbXByZXNzbGV2ZWwpCisgICAgICAgIHNlbGYuX2xhc3RfdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLl9sYXN0X3ogPSB6dHJhbnMKKyAgICAgICAgcmV0dXJuIHp0cmFucwogCiAKIGNsYXNzIFRabGliVHJhbnNwb3J0KFRUcmFuc3BvcnRCYXNlLCBDUmVhZGFibGVUcmFuc3BvcnQpOgotICAiIiJDbGFzcyB0aGF0IHdyYXBzIGEgdHJhbnNwb3J0IHdpdGggemxpYiwgY29tcHJlc3Npbmcgd3JpdGVzCi0gIGFuZCBkZWNvbXByZXNzZXMgcmVhZHMsIHVzaW5nIHRoZSBweXRob24gc3RhbmRhcmQKLSAgbGlicmFyeSB6bGliIG1vZHVsZS4KLSAgIiIiCi0gICMgUmVhZCBidWZmZXIgc2l6ZSBmb3IgdGhlIHB5dGhvbiBmYXN0YmluYXJ5IEMgZXh0ZW5zaW9uLAotICAjIHRoZSBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBjbGFzcy4KLSAgREVGQVVMVF9CVUZGU0laRSA9IDQwOTYKLQotICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnMsIGNvbXByZXNzbGV2ZWw9OSk6Ci0gICAgIiIiQ3JlYXRlIGEgbmV3IFRabGliVHJhbnNwb3J0LCB3cmFwcGluZyBDe3RyYW5zfSwgYW5vdGhlcgotICAgIFRUcmFuc3BvcnQgZGVyaXZlZCBvYmplY3QuCi0KLSAgICBAcGFyYW0gdHJhbnM6IEEgdGhyaWZ0IHRyYW5zcG9ydCBvYmplY3QsIGkuZS4gYSBUU29ja2V0KCkgb2JqZWN0LgotICAgIEB0eXBlIHRyYW5zOiBUVHJhbnNwb3J0Ci0gICAgQHBhcmFtIGNvbXByZXNzbGV2ZWw6IFRoZSB6bGliIGNvbXByZXNzaW9uIGxldmVsLCByYW5naW5nCi0gICAgZnJvbSAwIChubyBjb21wcmVzc2lvbikgdG8gOSAoYmVzdCBjb21wcmVzc2lvbikuICBEZWZhdWx0IGlzIDkuCi0gICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50CisgICAgIiIiQ2xhc3MgdGhhdCB3cmFwcyBhIHRyYW5zcG9ydCB3aXRoIHpsaWIsIGNvbXByZXNzaW5nIHdyaXRlcworICAgIGFuZCBkZWNvbXByZXNzZXMgcmVhZHMsIHVzaW5nIHRoZSBweXRob24gc3RhbmRhcmQKKyAgICBsaWJyYXJ5IHpsaWIgbW9kdWxlLgogICAgICIiIgotICAgIHNlbGYuX190cmFucyA9IHRyYW5zCi0gICAgc2VsZi5jb21wcmVzc2xldmVsID0gY29tcHJlc3NsZXZlbAotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX2luaXRfemxpYigpCi0gICAgc2VsZi5faW5pdF9zdGF0cygpCisgICAgIyBSZWFkIGJ1ZmZlciBzaXplIGZvciB0aGUgcHl0aG9uIGZhc3RiaW5hcnkgQyBleHRlbnNpb24sCisgICAgIyB0aGUgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgY2xhc3MuCisgICAgREVGQVVMVF9CVUZGU0laRSA9IDQwOTYKIAotICBkZWYgX3JlaW5pdF9idWZmZXJzKHNlbGYpOgotICAgICIiIkludGVybmFsIG1ldGhvZCB0byBpbml0aWFsaXplL3Jlc2V0IHRoZSBpbnRlcm5hbCBTdHJpbmdJTyBvYmplY3RzCi0gICAgZm9yIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMuCi0gICAgIiIiCi0gICAgc2VsZi5fX3JidWYgPSBTdHJpbmdJTygpCi0gICAgc2VsZi5fX3didWYgPSBTdHJpbmdJTygpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zLCBjb21wcmVzc2xldmVsPTkpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgVFpsaWJUcmFuc3BvcnQsIHdyYXBwaW5nIEN7dHJhbnN9LCBhbm90aGVyCisgICAgICAgIFRUcmFuc3BvcnQgZGVyaXZlZCBvYmplY3QuCiAKLSAgZGVmIF9pbml0X3N0YXRzKHNlbGYpOgotICAgICIiIkludGVybmFsIG1ldGhvZCB0byByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGlzdGljcyBjb3VudGVycwotICAgIGZvciBjb21wcmVzc2lvbiByYXRpb3MgYW5kIGJhbmR3aWR0aCBzYXZpbmdzLgotICAgICIiIgotICAgIHNlbGYuYnl0ZXNfaW4gPSAwCi0gICAgc2VsZi5ieXRlc19vdXQgPSAwCi0gICAgc2VsZi5ieXRlc19pbl9jb21wID0gMAotICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgPSAwCisgICAgICAgIEBwYXJhbSB0cmFuczogQSB0aHJpZnQgdHJhbnNwb3J0IG9iamVjdCwgaS5lLiBhIFRTb2NrZXQoKSBvYmplY3QuCisgICAgICAgIEB0eXBlIHRyYW5zOiBUVHJhbnNwb3J0CisgICAgICAgIEBwYXJhbSBjb21wcmVzc2xldmVsOiBUaGUgemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgcmFuZ2luZworICAgICAgICBmcm9tIDAgKG5vIGNvbXByZXNzaW9uKSB0byA5IChiZXN0IGNvbXByZXNzaW9uKS4gIERlZmF1bHQgaXMgOS4KKyAgICAgICAgQHR5cGUgY29tcHJlc3NsZXZlbDogaW50CisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fdHJhbnMgPSB0cmFucworICAgICAgICBzZWxmLmNvbXByZXNzbGV2ZWwgPSBjb21wcmVzc2xldmVsCisgICAgICAgIHNlbGYuX19yYnVmID0gQnVmZmVySU8oKQorICAgICAgICBzZWxmLl9fd2J1ZiA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5faW5pdF96bGliKCkKKyAgICAgICAgc2VsZi5faW5pdF9zdGF0cygpCiAKLSAgZGVmIF9pbml0X3psaWIoc2VsZik6Ci0gICAgIiIiSW50ZXJuYWwgbWV0aG9kIGZvciBzZXR0aW5nIHVwIHRoZSB6bGliIGNvbXByZXNzaW9uIGFuZAotICAgIGRlY29tcHJlc3Npb24gb2JqZWN0cy4KLSAgICAiIiIKLSAgICBzZWxmLl96Y29tcF9yZWFkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKLSAgICBzZWxmLl96Y29tcF93cml0ZSA9IHpsaWIuY29tcHJlc3NvYmooc2VsZi5jb21wcmVzc2xldmVsKQorICAgIGRlZiBfcmVpbml0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZCB0byBpbml0aWFsaXplL3Jlc2V0IHRoZSBpbnRlcm5hbCBTdHJpbmdJTyBvYmplY3RzCisgICAgICAgIGZvciByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3JidWYgPSBCdWZmZXJJTygpCisgICAgICAgIHNlbGYuX193YnVmID0gQnVmZmVySU8oKQogCi0gIGRlZiBnZXRDb21wUmF0aW8oc2VsZik6Ci0gICAgIiIiR2V0IHRoZSBjdXJyZW50IG1lYXN1cmVkIGNvbXByZXNzaW9uIHJhdGlvcyAoaW4sb3V0KSBmcm9tCi0gICAgdGhpcyB0cmFuc3BvcnQuCisgICAgZGVmIF9pbml0X3N0YXRzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QgdG8gcmVzZXQgdGhlIGludGVybmFsIHN0YXRpc3RpY3MgY291bnRlcnMKKyAgICAgICAgZm9yIGNvbXByZXNzaW9uIHJhdGlvcyBhbmQgYmFuZHdpZHRoIHNhdmluZ3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmJ5dGVzX2luID0gMAorICAgICAgICBzZWxmLmJ5dGVzX291dCA9IDAKKyAgICAgICAgc2VsZi5ieXRlc19pbl9jb21wID0gMAorICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wID0gMAogCi0gICAgUmV0dXJucyBhIHR1cGxlIG9mOgotICAgIChpbmJvdW5kX2NvbXByZXNzaW9uX3JhdGlvLCBvdXRib3VuZF9jb21wcmVzc2lvbl9yYXRpbykKKyAgICBkZWYgX2luaXRfemxpYihzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kIGZvciBzZXR0aW5nIHVwIHRoZSB6bGliIGNvbXByZXNzaW9uIGFuZAorICAgICAgICBkZWNvbXByZXNzaW9uIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl96Y29tcF9yZWFkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgc2VsZi5femNvbXBfd3JpdGUgPSB6bGliLmNvbXByZXNzb2JqKHNlbGYuY29tcHJlc3NsZXZlbCkKIAotICAgIFRoZSBjb21wcmVzc2lvbiByYXRpb3MgYXJlIGNvbXB1dGVkIGFzOgotICAgICAgICBjb21wcmVzc2VkIC8gdW5jb21wcmVzc2VkCisgICAgZGVmIGdldENvbXBSYXRpbyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IG1lYXN1cmVkIGNvbXByZXNzaW9uIHJhdGlvcyAoaW4sb3V0KSBmcm9tCisgICAgICAgIHRoaXMgdHJhbnNwb3J0LgogCi0gICAgRS5nLiwgZGF0YSB0aGF0IGNvbXByZXNzZXMgYnkgMTB4IHdpbGwgaGF2ZSBhIHJhdGlvIG9mOiAwLjEwCi0gICAgYW5kIGRhdGEgdGhhdCBjb21wcmVzc2VzIHRvIGhhbGYgb2YgdHMgb3JpZ2luYWwgc2l6ZSB3aWxsCi0gICAgaGF2ZSBhIHJhdGlvIG9mIDAuNQorICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2Y6CisgICAgICAgIChpbmJvdW5kX2NvbXByZXNzaW9uX3JhdGlvLCBvdXRib3VuZF9jb21wcmVzc2lvbl9yYXRpbykKIAotICAgIE5vbmUgaXMgcmV0dXJuZWQgaWYgbm8gYnl0ZXMgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQgaW4KLSAgICBhIHBhcnRpY3VsYXIgZGlyZWN0aW9uLgotICAgICIiIgotICAgIHJfcGVyY2VudCwgd19wZXJjZW50ID0gKE5vbmUsIE5vbmUpCi0gICAgaWYgc2VsZi5ieXRlc19pbiA+IDA6Ci0gICAgICByX3BlcmNlbnQgPSBzZWxmLmJ5dGVzX2luX2NvbXAgLyBzZWxmLmJ5dGVzX2luCi0gICAgaWYgc2VsZi5ieXRlc19vdXQgPiAwOgotICAgICAgd19wZXJjZW50ID0gc2VsZi5ieXRlc19vdXRfY29tcCAvIHNlbGYuYnl0ZXNfb3V0Ci0gICAgcmV0dXJuIChyX3BlcmNlbnQsIHdfcGVyY2VudCkKKyAgICAgICAgVGhlIGNvbXByZXNzaW9uIHJhdGlvcyBhcmUgY29tcHV0ZWQgYXM6CisgICAgICAgICAgICBjb21wcmVzc2VkIC8gdW5jb21wcmVzc2VkCiAKLSAgZGVmIGdldENvbXBTYXZpbmdzKHNlbGYpOgotICAgICIiIkdldCB0aGUgY3VycmVudCBjb3VudCBvZiBzYXZlZCBieXRlcyBkdWUgdG8gZGF0YQotICAgIGNvbXByZXNzaW9uLgorICAgICAgICBFLmcuLCBkYXRhIHRoYXQgY29tcHJlc3NlcyBieSAxMHggd2lsbCBoYXZlIGEgcmF0aW8gb2Y6IDAuMTAKKyAgICAgICAgYW5kIGRhdGEgdGhhdCBjb21wcmVzc2VzIHRvIGhhbGYgb2YgdHMgb3JpZ2luYWwgc2l6ZSB3aWxsCisgICAgICAgIGhhdmUgYSByYXRpbyBvZiAwLjUKIAotICAgIFJldHVybnMgYSB0dXBsZSBvZjoKLSAgICAoaW5ib3VuZF9zYXZlZF9ieXRlcywgb3V0Ym91bmRfc2F2ZWRfYnl0ZXMpCisgICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaWYgbm8gYnl0ZXMgaGF2ZSB5ZXQgYmVlbiBwcm9jZXNzZWQgaW4KKyAgICAgICAgYSBwYXJ0aWN1bGFyIGRpcmVjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJfcGVyY2VudCwgd19wZXJjZW50ID0gKE5vbmUsIE5vbmUpCisgICAgICAgIGlmIHNlbGYuYnl0ZXNfaW4gPiAwOgorICAgICAgICAgICAgcl9wZXJjZW50ID0gc2VsZi5ieXRlc19pbl9jb21wIC8gc2VsZi5ieXRlc19pbgorICAgICAgICBpZiBzZWxmLmJ5dGVzX291dCA+IDA6CisgICAgICAgICAgICB3X3BlcmNlbnQgPSBzZWxmLmJ5dGVzX291dF9jb21wIC8gc2VsZi5ieXRlc19vdXQKKyAgICAgICAgcmV0dXJuIChyX3BlcmNlbnQsIHdfcGVyY2VudCkKIAotICAgIE5vdGU6IGlmIGNvbXByZXNzaW9uIGlzIGFjdHVhbGx5IGV4cGFuZGluZyB5b3VyCi0gICAgZGF0YSAob25seSBsaWtlbHkgd2l0aCB2ZXJ5IHRpbnkgdGhyaWZ0IG9iamVjdHMpLCB0aGVuCi0gICAgdGhlIHZhbHVlcyByZXR1cm5lZCB3aWxsIGJlIG5lZ2F0aXZlLgotICAgICIiIgotICAgIHJfc2F2ZWQgPSBzZWxmLmJ5dGVzX2luIC0gc2VsZi5ieXRlc19pbl9jb21wCi0gICAgd19zYXZlZCA9IHNlbGYuYnl0ZXNfb3V0IC0gc2VsZi5ieXRlc19vdXRfY29tcAotICAgIHJldHVybiAocl9zYXZlZCwgd19zYXZlZCkKKyAgICBkZWYgZ2V0Q29tcFNhdmluZ3Moc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY3VycmVudCBjb3VudCBvZiBzYXZlZCBieXRlcyBkdWUgdG8gZGF0YQorICAgICAgICBjb21wcmVzc2lvbi4KIAotICBkZWYgaXNPcGVuKHNlbGYpOgotICAgICIiIlJldHVybiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQncyBvcGVuIHN0YXR1cyIiIgotICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mOgorICAgICAgICAoaW5ib3VuZF9zYXZlZF9ieXRlcywgb3V0Ym91bmRfc2F2ZWRfYnl0ZXMpCiAKLSAgZGVmIG9wZW4oc2VsZik6Ci0gICAgIiIiT3BlbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKLSAgICBzZWxmLl9pbml0X3N0YXRzKCkKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQorICAgICAgICBOb3RlOiBpZiBjb21wcmVzc2lvbiBpcyBhY3R1YWxseSBleHBhbmRpbmcgeW91cgorICAgICAgICBkYXRhIChvbmx5IGxpa2VseSB3aXRoIHZlcnkgdGlueSB0aHJpZnQgb2JqZWN0cyksIHRoZW4KKyAgICAgICAgdGhlIHZhbHVlcyByZXR1cm5lZCB3aWxsIGJlIG5lZ2F0aXZlLgorICAgICAgICAiIiIKKyAgICAgICAgcl9zYXZlZCA9IHNlbGYuYnl0ZXNfaW4gLSBzZWxmLmJ5dGVzX2luX2NvbXAKKyAgICAgICAgd19zYXZlZCA9IHNlbGYuYnl0ZXNfb3V0IC0gc2VsZi5ieXRlc19vdXRfY29tcAorICAgICAgICByZXR1cm4gKHJfc2F2ZWQsIHdfc2F2ZWQpCiAKLSAgZGVmIGxpc3RlbihzZWxmKToKLSAgICAiIiJJbnZva2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0J3MgbGlzdGVuKCkgbWV0aG9kIiIiCi0gICAgc2VsZi5fX3RyYW5zLmxpc3RlbigpCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIG9wZW4gc3RhdHVzIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnMuaXNPcGVuKCkKIAotICBkZWYgYWNjZXB0KHNlbGYpOgotICAgICIiIkFjY2VwdCBjb25uZWN0aW9ucyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKLSAgICByZXR1cm4gc2VsZi5fX3RyYW5zLmFjY2VwdCgpCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgICIiIk9wZW4gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IiIiCisgICAgICAgIHNlbGYuX2luaXRfc3RhdHMoKQorICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zLm9wZW4oKQogCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICAiIiJDbG9zZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIiIiCi0gICAgc2VsZi5fcmVpbml0X2J1ZmZlcnMoKQotICAgIHNlbGYuX2luaXRfemxpYigpCi0gICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCisgICAgZGVmIGxpc3RlbihzZWxmKToKKyAgICAgICAgIiIiSW52b2tlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIGxpc3RlbigpIG1ldGhvZCIiIgorICAgICAgICBzZWxmLl9fdHJhbnMubGlzdGVuKCkKIAotICBkZWYgcmVhZChzZWxmLCBzeik6Ci0gICAgIiIiUmVhZCB1cCB0byBzeiBieXRlcyBmcm9tIHRoZSBkZWNvbXByZXNzZWQgYnl0ZXMgYnVmZmVyLCBhbmQKLSAgICByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlmIHRoZSBkZWNvbXByZXNzaW9uCi0gICAgYnVmZmVyIGlzIGVtcHR5LgotICAgICIiIgotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgaWYgbGVuKHJldCkgPiAwOgotICAgICAgcmV0dXJuIHJldAotICAgICMga2VlcCByZWFkaW5nIGZyb20gdHJhbnNwb3J0IHVudGlsIHNvbWV0aGluZyBjb21lcyBiYWNrCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIGlmIHNlbGYucmVhZENvbXAoc3opOgotICAgICAgICBicmVhawotICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCi0gICAgcmV0dXJuIHJldAorICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgICIiIkFjY2VwdCBjb25uZWN0aW9ucyBvbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5hY2NlcHQoKQogCi0gIGRlZiByZWFkQ29tcChzZWxmLCBzeik6Ci0gICAgIiIiUmVhZCBjb21wcmVzc2VkIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIHRoZW4KLSAgICBkZWNvbXByZXNzIGl0IGFuZCBhcHBlbmQgaXQgdG8gdGhlIGludGVybmFsIFN0cmluZ0lPIHJlYWQgYnVmZmVyCi0gICAgIiIiCi0gICAgemJ1ZiA9IHNlbGYuX190cmFucy5yZWFkKHN6KQotICAgIHpidWYgPSBzZWxmLl96Y29tcF9yZWFkLnVuY29uc3VtZWRfdGFpbCArIHpidWYKLSAgICBidWYgPSBzZWxmLl96Y29tcF9yZWFkLmRlY29tcHJlc3MoemJ1ZikKLSAgICBzZWxmLmJ5dGVzX2luICs9IGxlbih6YnVmKQotICAgIHNlbGYuYnl0ZXNfaW5fY29tcCArPSBsZW4oYnVmKQotICAgIG9sZCA9IHNlbGYuX19yYnVmLnJlYWQoKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ob2xkICsgYnVmKQotICAgIGlmIGxlbihvbGQpICsgbGVuKGJ1ZikgPT0gMDoKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQsIiIiCisgICAgICAgIHNlbGYuX3JlaW5pdF9idWZmZXJzKCkKKyAgICAgICAgc2VsZi5faW5pdF96bGliKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX190cmFucy5jbG9zZSgpCiAKLSAgZGVmIHdyaXRlKHNlbGYsIGJ1Zik6Ci0gICAgIiIiV3JpdGUgc29tZSBieXRlcywgcHV0dGluZyB0aGVtIGludG8gdGhlIGludGVybmFsIHdyaXRlCi0gICAgYnVmZmVyIGZvciBldmVudHVhbCBjb21wcmVzc2lvbi4KLSAgICAiIiIKLSAgICBzZWxmLl9fd2J1Zi53cml0ZShidWYpCisgICAgZGVmIHJlYWQoc2VsZiwgc3opOgorICAgICAgICAiIiJSZWFkIHVwIHRvIHN6IGJ5dGVzIGZyb20gdGhlIGRlY29tcHJlc3NlZCBieXRlcyBidWZmZXIsIGFuZAorICAgICAgICByZWFkIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IGlmIHRoZSBkZWNvbXByZXNzaW9uCisgICAgICAgIGJ1ZmZlciBpcyBlbXB0eS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIGlmIGxlbihyZXQpID4gMDoKKyAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgIyBrZWVwIHJlYWRpbmcgZnJvbSB0cmFuc3BvcnQgdW50aWwgc29tZXRoaW5nIGNvbWVzIGJhY2sKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNlbGYucmVhZENvbXAoc3opOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldCA9IHNlbGYuX19yYnVmLnJlYWQoc3opCisgICAgICAgIHJldHVybiByZXQKIAotICBkZWYgZmx1c2goc2VsZik6Ci0gICAgIiIiRmx1c2ggYW55IHF1ZXVlZCB1cCBkYXRhIGluIHRoZSB3cml0ZSBidWZmZXIgYW5kIGVuc3VyZSB0aGUKLSAgICBjb21wcmVzc2lvbiBidWZmZXIgaXMgZmx1c2hlZCBvdXQgdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAgIiIiCi0gICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKLSAgICBpZiBsZW4od291dCkgPiAwOgotICAgICAgemJ1ZiA9IHNlbGYuX3pjb21wX3dyaXRlLmNvbXByZXNzKHdvdXQpCi0gICAgICBzZWxmLmJ5dGVzX291dCArPSBsZW4od291dCkKLSAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHpidWYpCi0gICAgZWxzZToKLSAgICAgIHpidWYgPSAnJwotICAgIHp0YWlsID0gc2VsZi5femNvbXBfd3JpdGUuZmx1c2goemxpYi5aX1NZTkNfRkxVU0gpCi0gICAgc2VsZi5ieXRlc19vdXRfY29tcCArPSBsZW4oenRhaWwpCi0gICAgaWYgKGxlbih6YnVmKSArIGxlbih6dGFpbCkpID4gMDoKLSAgICAgIHNlbGYuX193YnVmID0gU3RyaW5nSU8oKQotICAgICAgc2VsZi5fX3RyYW5zLndyaXRlKHpidWYgKyB6dGFpbCkKLSAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorICAgIGRlZiByZWFkQ29tcChzZWxmLCBzeik6CisgICAgICAgICIiIlJlYWQgY29tcHJlc3NlZCBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LCB0aGVuCisgICAgICAgIGRlY29tcHJlc3MgaXQgYW5kIGFwcGVuZCBpdCB0byB0aGUgaW50ZXJuYWwgU3RyaW5nSU8gcmVhZCBidWZmZXIKKyAgICAgICAgIiIiCisgICAgICAgIHpidWYgPSBzZWxmLl9fdHJhbnMucmVhZChzeikKKyAgICAgICAgemJ1ZiA9IHNlbGYuX3pjb21wX3JlYWQudW5jb25zdW1lZF90YWlsICsgemJ1ZgorICAgICAgICBidWYgPSBzZWxmLl96Y29tcF9yZWFkLmRlY29tcHJlc3MoemJ1ZikKKyAgICAgICAgc2VsZi5ieXRlc19pbiArPSBsZW4oemJ1ZikKKyAgICAgICAgc2VsZi5ieXRlc19pbl9jb21wICs9IGxlbihidWYpCisgICAgICAgIG9sZCA9IHNlbGYuX19yYnVmLnJlYWQoKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKG9sZCArIGJ1ZikKKyAgICAgICAgaWYgbGVuKG9sZCkgKyBsZW4oYnVmKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCiAKLSAgQHByb3BlcnR5Ci0gIGRlZiBjc3RyaW5naW9fYnVmKHNlbGYpOgotICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSIiIgotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICAiIiJXcml0ZSBzb21lIGJ5dGVzLCBwdXR0aW5nIHRoZW0gaW50byB0aGUgaW50ZXJuYWwgd3JpdGUKKyAgICAgICAgYnVmZmVyIGZvciBldmVudHVhbCBjb21wcmVzc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX193YnVmLndyaXRlKGJ1ZikKIAotICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKLSAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIHJlZmlsbCIiIgotICAgIHJldHN0cmluZyA9IHBhcnRpYWxyZWFkCi0gICAgaWYgcmVxbGVuIDwgc2VsZi5ERUZBVUxUX0JVRkZTSVpFOgotICAgICAgcmV0c3RyaW5nICs9IHNlbGYucmVhZChzZWxmLkRFRkFVTFRfQlVGRlNJWkUpCi0gICAgd2hpbGUgbGVuKHJldHN0cmluZykgPCByZXFsZW46Ci0gICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQotICAgIHNlbGYuX19yYnVmID0gU3RyaW5nSU8ocmV0c3RyaW5nKQotICAgIHJldHVybiBzZWxmLl9fcmJ1ZgorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW55IHF1ZXVlZCB1cCBkYXRhIGluIHRoZSB3cml0ZSBidWZmZXIgYW5kIGVuc3VyZSB0aGUKKyAgICAgICAgY29tcHJlc3Npb24gYnVmZmVyIGlzIGZsdXNoZWQgb3V0IHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICAiIiIKKyAgICAgICAgd291dCA9IHNlbGYuX193YnVmLmdldHZhbHVlKCkKKyAgICAgICAgaWYgbGVuKHdvdXQpID4gMDoKKyAgICAgICAgICAgIHpidWYgPSBzZWxmLl96Y29tcF93cml0ZS5jb21wcmVzcyh3b3V0KQorICAgICAgICAgICAgc2VsZi5ieXRlc19vdXQgKz0gbGVuKHdvdXQpCisgICAgICAgICAgICBzZWxmLmJ5dGVzX291dF9jb21wICs9IGxlbih6YnVmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemJ1ZiA9ICcnCisgICAgICAgIHp0YWlsID0gc2VsZi5femNvbXBfd3JpdGUuZmx1c2goemxpYi5aX1NZTkNfRkxVU0gpCisgICAgICAgIHNlbGYuYnl0ZXNfb3V0X2NvbXAgKz0gbGVuKHp0YWlsKQorICAgICAgICBpZiAobGVuKHpidWYpICsgbGVuKHp0YWlsKSkgPiAwOgorICAgICAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCisgICAgICAgICAgICBzZWxmLl9fdHJhbnMud3JpdGUoemJ1ZiArIHp0YWlsKQorICAgICAgICBzZWxmLl9fdHJhbnMuZmx1c2goKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNzdHJpbmdpb19idWYoc2VsZik6CisgICAgICAgICIiIkltcGxlbWVudCB0aGUgQ1JlYWRhYmxlVHJhbnNwb3J0IGludGVyZmFjZSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3JidWYKKworICAgIGRlZiBjc3RyaW5naW9fcmVmaWxsKHNlbGYsIHBhcnRpYWxyZWFkLCByZXFsZW4pOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhlIENSZWFkYWJsZVRyYW5zcG9ydCBpbnRlcmZhY2UgZm9yIHJlZmlsbCIiIgorICAgICAgICByZXRzdHJpbmcgPSBwYXJ0aWFscmVhZAorICAgICAgICBpZiByZXFsZW4gPCBzZWxmLkRFRkFVTFRfQlVGRlNJWkU6CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHNlbGYuREVGQVVMVF9CVUZGU0laRSkKKyAgICAgICAgd2hpbGUgbGVuKHJldHN0cmluZykgPCByZXFsZW46CisgICAgICAgICAgICByZXRzdHJpbmcgKz0gc2VsZi5yZWFkKHJlcWxlbiAtIGxlbihyZXRzdHJpbmcpKQorICAgICAgICBzZWxmLl9fcmJ1ZiA9IEJ1ZmZlcklPKHJldHN0cmluZykKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yYnVmCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwMGNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weQpAQCAtMCwwICsxLDEwMCBAQAorIworIyBsaWNlbnNlZCB0byB0aGUgYXBhY2hlIHNvZnR3YXJlIGZvdW5kYXRpb24gKGFzZikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBzZWUgdGhlIG5vdGljZSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiB0aGUgYXNmIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIGFwYWNoZSBsaWNlbnNlLCB2ZXJzaW9uIDIuMCAodGhlCisjICJsaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgbGljZW5zZS4geW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL2xpY2Vuc2UtMi4wCisjCisjIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIGxpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgImFzIGlzIiBiYXNpcywgd2l0aG91dCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgYW55CisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3lzCisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0RXhjZXB0aW9uCisKK2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKK2RlZiBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2soY2VydCwgaG9zdG5hbWUpOgorICAgICIiImxlZ2FjeSBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHBlZXIncyBTU0wgY2VydGlmaWNhdGUsIGFuZCB0byBjaGVjaworICAgIHRoZSBjb21tb25OYW1lIG9mIHRoZSBjZXJ0aWZpY2F0ZSB0byBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgaG9zdG5hbWUgd2UKKyAgICB1c2VkIHRvIG1ha2UgdGhpcyBjb25uZWN0aW9uLiAgRG9lcyBub3Qgc3VwcG9ydCBzdWJqZWN0QWx0TmFtZSByZWNvcmRzCisgICAgaW4gY2VydGlmaWNhdGVzLgorCisgICAgcmFpc2VzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlIGNlcnRpZmljYXRlIGZhaWxzIHZhbGlkYXRpb24uCisgICAgIiIiCisgICAgaWYgJ3N1YmplY3QnIG5vdCBpbiBjZXJ0OgorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5OT1RfT1BFTiwKKyAgICAgICAgICAgICdObyBTU0wgY2VydGlmaWNhdGUgZm91bmQgZnJvbSAlcycgJSBob3N0bmFtZSkKKyAgICBmaWVsZHMgPSBjZXJ0WydzdWJqZWN0J10KKyAgICBmb3IgZmllbGQgaW4gZmllbGRzOgorICAgICAgICAjIGVuc3VyZSBzdHJ1Y3R1cmUgd2UgZ2V0IGJhY2sgaXMgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmllbGQsIHR1cGxlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRfcGFpciA9IGZpZWxkWzBdCisgICAgICAgIGlmIGxlbihjZXJ0X3BhaXIpIDwgMjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNlcnRfa2V5LCBjZXJ0X3ZhbHVlID0gY2VydF9wYWlyWzA6Ml0KKyAgICAgICAgaWYgY2VydF9rZXkgIT0gJ2NvbW1vbk5hbWUnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY2VydGhvc3QgPSBjZXJ0X3ZhbHVlCisgICAgICAgICMgdGhpcyBjaGVjayBzaG91bGQgYmUgcGVyZm9ybWVkIGJ5IHNvbWUgc29ydCBvZiBBY2Nlc3MgTWFuYWdlcgorICAgICAgICBpZiBjZXJ0aG9zdCA9PSBob3N0bmFtZToKKyAgICAgICAgICAgICMgc3VjY2VzcywgY2VydCBjb21tb25OYW1lIG1hdGNoZXMgZGVzaXJlZCBob3N0bmFtZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAnSG9zdG5hbWUgd2UgY29ubmVjdGVkIHRvICIlcyIgZG9lc25cJ3QgbWF0Y2ggY2VydGlmaWNhdGUgJworICAgICAgICAgICAgICAgICdwcm92aWRlZCBjb21tb25OYW1lICIlcyInICUgKGhvc3RuYW1lLCBjZXJ0aG9zdCkpCisgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAorICAgICAgICAnQ291bGQgbm90IHZhbGlkYXRlIFNTTCBjZXJ0aWZpY2F0ZSBmcm9tIGhvc3QgIiVzIi4gIENlcnQ9JXMnCisgICAgICAgICUgKGhvc3RuYW1lLCBjZXJ0KSkKKworCitkZWYgX29wdGlvbmFsX2RlcGVuZGVuY2llcygpOgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGlwYWRkcmVzcyAgIyBub3FhCisgICAgICAgIGxvZ2dlci5kZWJ1ZygnaXBhZGRyZXNzIG1vZHVsZSBpcyBhdmFpbGFibGUnKQorICAgICAgICBpcGFkZHIgPSBUcnVlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBsb2dnZXIud2FybignaXBhZGRyZXNzIG1vZHVsZSBpcyB1bmF2YWlsYWJsZScpCisgICAgICAgIGlwYWRkciA9IEZhbHNlCisKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA8IDB4MDMwNTAwRjA6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUsIF9fdmVyc2lvbl9fIGFzIHZlcgorICAgICAgICAgICAgdmVyID0gbGlzdChtYXAoaW50LCB2ZXIuc3BsaXQoJy4nKSkpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgbW9kdWxlIGlzIGF2YWlsYWJsZScpCisgICAgICAgICAgICBtYXRjaCA9IG1hdGNoX2hvc3RuYW1lCisgICAgICAgICAgICBpZiB2ZXJbMF0gKiAxMCArIHZlclsxXSA+PSAzNToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXBhZGRyLCBtYXRjaAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybignYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBtb2R1bGUgaXMgdG9vIG9sZCcpCisgICAgICAgICAgICAgICAgaXBhZGRyID0gRmFsc2UKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ2JhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXMgdW5hdmFpbGFibGUnKQorICAgICAgICAgICAgaXBhZGRyID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIGZyb20gc3NsIGltcG9ydCBtYXRjaF9ob3N0bmFtZQorICAgICAgICBsb2dnZXIuZGVidWcoJ3NzbC5tYXRjaF9ob3N0bmFtZSBpcyBhdmFpbGFibGUnKQorICAgICAgICBtYXRjaCA9IG1hdGNoX2hvc3RuYW1lCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBsb2dnZXIud2FybigndXNpbmcgbGVnYWN5IHZhbGlkYXRpb24gY2FsbGJhY2snKQorICAgICAgICBtYXRjaCA9IGxlZ2FjeV92YWxpZGF0ZV9jYWxsYmFjaworICAgIHJldHVybiBpcGFkZHIsIG1hdGNoCisKKworX21hdGNoX2hhc19pcGFkZHJlc3MsIF9tYXRjaF9ob3N0bmFtZSA9IF9vcHRpb25hbF9kZXBlbmRlbmNpZXMoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkgYi9saWIvcHkvdGVzdC9faW1wb3J0X2xvY2FsX3RocmlmdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjIzMTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3Rlc3QvX2ltcG9ydF9sb2NhbF90aHJpZnQucHkKQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworU0NSSVBUX0RJUiA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUikpKQorCitmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2Iob3MucGF0aC5qb2luKFJPT1RfRElSLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykpOgorICAgIGlmIGxpYnBhdGguZW5kc3dpdGgoJy0lZC4lZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgbGlicGF0aCkKKyAgICAgICAgYnJlYWsKZGlmZiAtLWdpdCBhL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5IGIvbGliL3B5L3Rlc3QvdGVzdF9zc2xzb2NrZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzNDRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CkBAIC0wLDAgKzEsMzQ2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGluc3BlY3QKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHNzbAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorCitpbXBvcnQgX2ltcG9ydF9sb2NhbF90aHJpZnQgICMgbm9xYQorCitTQ1JJUFRfRElSID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShTQ1JJUFRfRElSKSkpCitTRVJWRVJfUEVNID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5wZW0nKQorU0VSVkVSX0NFUlQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnc2VydmVyLmNydCcpCitTRVJWRVJfS0VZID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ3NlcnZlci5rZXknKQorQ0xJRU5UX0NFUlRfTk9fSVAgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50LmNydCcpCitDTElFTlRfS0VZX05PX0lQID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudC5rZXknKQorQ0xJRU5UX0NFUlQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICd0ZXN0JywgJ2tleXMnLCAnY2xpZW50X3YzLmNydCcpCitDTElFTlRfS0VZID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5rZXknKQorQ0xJRU5UX0NBID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ0NBLnBlbScpCisKK1RFU1RfQ0lQSEVSUyA9ICdERVMtQ0JDMy1TSEE6RUNESEUtUlNBLUFFUzEyOC1HQ00tU0hBMjU2JworCisKK2NsYXNzIFNlcnZlckFjY2VwdG9yKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlPUZhbHNlKToKKyAgICAgICAgc3VwZXIoU2VydmVyQWNjZXB0b3IsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5kYWVtb24gPSBUcnVlCisgICAgICAgIHNlbGYuX3NlcnZlciA9IHNlcnZlcgorICAgICAgICBzZWxmLl9saXN0ZW5pbmcgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9wb3J0ID0gTm9uZQorICAgICAgICBzZWxmLl9wb3J0X2JvdW5kID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fY2xpZW50ID0gTm9uZQorICAgICAgICBzZWxmLl9jbGllbnRfYWNjZXB0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9leHBlY3RfZmFpbHVyZSA9IGV4cGVjdF9mYWlsdXJlCisgICAgICAgIGZyYW1lID0gaW5zcGVjdC5zdGFjaygzKVsyXQorICAgICAgICBzZWxmLm5hbWUgPSBmcmFtZVszXQorICAgICAgICBkZWwgZnJhbWUKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuX3NlcnZlci5saXN0ZW4oKQorICAgICAgICBzZWxmLl9saXN0ZW5pbmcuc2V0KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBhZGRyZXNzID0gc2VsZi5fc2VydmVyLmhhbmRsZS5nZXRzb2NrbmFtZSgpCisgICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgorICAgICAgICAgICAgICAgICMgQUZfSU5FVCBhZGRyZXNzZXMgYXJlIDItdHVwbGVzIChob3N0LCBwb3J0KSBhbmQgQUZfSU5FVDYgYXJlCisgICAgICAgICAgICAgICAgIyA0LXR1cGxlcyAoaG9zdCwgcG9ydCwgLi4uKSwgYnV0IGluIGVhY2ggY2FzZSBwb3J0IGlzIGluIHRoZSBzZWNvbmQgc2xvdC4KKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0ID0gYWRkcmVzc1sxXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fcG9ydF9ib3VuZC5zZXQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NsaWVudCA9IHNlbGYuX3NlcnZlci5hY2NlcHQoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oJ2Vycm9yIG9uIHNlcnZlciBzaWRlICglcyk6JyAlIHNlbGYubmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHBlY3RfZmFpbHVyZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY2xpZW50X2FjY2VwdGVkLnNldCgpCisKKyAgICBkZWYgYXdhaXRfbGlzdGVuaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9saXN0ZW5pbmcud2FpdCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5fcG9ydF9ib3VuZC53YWl0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BvcnQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbGllbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC53YWl0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NsaWVudAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jbGllbnQ6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQuY2xvc2UoKQorICAgICAgICBzZWxmLl9zZXJ2ZXIuY2xvc2UoKQorCisKKyMgUHl0aG9uIDIuNiBjb21wYXQKK2NsYXNzIEFzc2VydFJhaXNlcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuX2V4cGVjdGVkID0gZXhwZWN0ZWQKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICBpZiBub3QgZXhjX3R5cGUgb3Igbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuX2V4cGVjdGVkKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignZmFpbCcpCisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgVFNTTFNvY2tldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfc2VydmVyX3NvY2tldChzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBUU1NMU2VydmVyU29ja2V0KHBvcnQ9MCwgKiprd2FyZ3MpCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgX2Nvbm5lY3RhYmxlX2NsaWVudChzZWxmLCBzZXJ2ZXIsIGV4cGVjdF9mYWlsdXJlPUZhbHNlLCBwYXRoPU5vbmUsICoqY2xpZW50X2t3YXJncyk6CisgICAgICAgIGFjYyA9IFNlcnZlckFjY2VwdG9yKHNlcnZlciwgZXhwZWN0X2ZhaWx1cmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFjYy5zdGFydCgpCisgICAgICAgICAgICBhY2MuYXdhaXRfbGlzdGVuaW5nKCkKKworICAgICAgICAgICAgaG9zdCwgcG9ydCA9ICgnbG9jYWxob3N0JywgYWNjLnBvcnQpIGlmIHBhdGggaXMgTm9uZSBlbHNlIChOb25lLCBOb25lKQorICAgICAgICAgICAgY2xpZW50ID0gVFNTTFNvY2tldChob3N0LCBwb3J0LCB1bml4X3NvY2tldD1wYXRoLCAqKmNsaWVudF9rd2FyZ3MpCisgICAgICAgICAgICB5aWVsZCBhY2MsIGNsaWVudAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgYWNjLmNsb3NlKCkKKworICAgIGRlZiBfYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZWxmLCBzZXJ2ZXIsIHBhdGg9Tm9uZSwgKipjbGllbnRfYXJncyk6CisgICAgICAgIGxvZ2dpbmcuZGlzYWJsZShsb2dnaW5nLkNSSVRJQ0FMKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuX2Nvbm5lY3RhYmxlX2NsaWVudChzZXJ2ZXIsIFRydWUsIHBhdGg9cGF0aCwgKipjbGllbnRfYXJncykgYXMgKGFjYywgY2xpZW50KToKKyAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gd2FpdCBmb3IgYSBjb25uZWN0aW9uIGZhaWx1cmUsIGJ1dCBub3QgdG9vIGxvbmcuICAyMG1zIGlzIGEgdHVuYWJsZQorICAgICAgICAgICAgICAgICMgY29tcHJvbWlzZSBiZXR3ZWVuIHRlc3Qgc3BlZWQgYW5kIHN0YWJpbGl0eQorICAgICAgICAgICAgICAgIGNsaWVudC5zZXRUaW1lb3V0KDIwKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fYXNzZXJ0X3JhaXNlcyhUVHJhbnNwb3J0RXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50Lm9wZW4oKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY2MuY2xpZW50IGlzIE5vbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5OT1RTRVQpCisKKyAgICBkZWYgX2Fzc2VydF9yYWlzZXMoc2VsZiwgZXhjKToKKyAgICAgICAgaWYgc3lzLmhleHZlcnNpb24gPj0gMHgwMjA3MDBGMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydFJhaXNlcyhleGMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gQXNzZXJ0UmFpc2VzKGV4YykKKworICAgIGRlZiBfYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZWxmLCBzZXJ2ZXIsIHBhdGg9Tm9uZSwgKipjbGllbnRfYXJncyk6CisgICAgICAgIHdpdGggc2VsZi5fY29ubmVjdGFibGVfY2xpZW50KHNlcnZlciwgcGF0aD1wYXRoLCAqKmNsaWVudF9hcmdzKSBhcyAoYWNjLCBjbGllbnQpOgorICAgICAgICAgICAgY2xpZW50Lm9wZW4oKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY2MuY2xpZW50IGlzIG5vdCBOb25lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9kZXByZWNhdGlvbihzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdhbHdheXMnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsIG1vZHVsZT1zZWxmLl9fbW9kdWxlX18pCisgICAgICAgICAgICBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAxKQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICAgICAgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB2YWxpZGF0ZT1UcnVlLCBjYV9jZXJ0cz1Ob25lLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgICAgICAgICBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBUcnVlLCBTRVJWRVJfQ0VSVCwgQ0xJRU5UX0tFWSwgQ0xJRU5UX0NFUlQsIE5vbmUsIFRFU1RfQ0lQSEVSUykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCA3KQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgIyBEZXByZWNhdGVkIHNpZ25hdHVyZQorICAgICAgICAgICAgIyBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTkwOTAsIGNlcnRmaWxlPSdjZXJ0LnBlbScsIHVuaXhfc29ja2V0PU5vbmUsIGNpcGhlcnM9Tm9uZSk6CisgICAgICAgICAgICBUU1NMU2VydmVyU29ja2V0KE5vbmUsIDAsIFNFUlZFUl9QRU0sIE5vbmUsIFRFU1RfQ0lQSEVSUykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAzKQorCisgICAgIyBkZXByZWNhdGVkIGZlYXR1cmUKKyAgICBkZWYgdGVzdF9zZXRfY2VydF9yZXFzX2J5X3ZhbGlkYXRlKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywgbW9kdWxlPXNlbGYuX19tb2R1bGVfXykKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9VHJ1ZSwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLmNlcnRfcmVxcywgc3NsLkNFUlRfUkVRVUlSRUQpCisKKyAgICAgICAgICAgIGMxID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgdmFsaWRhdGU9RmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLmNlcnRfcmVxcywgc3NsLkNFUlRfTk9ORSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDIpCisKKyAgICAjIGRlcHJlY2F0ZWQgZmVhdHVyZQorICAgIGRlZiB0ZXN0X3NldF92YWxpZGF0ZV9ieV9jZXJ0X3JlcXMoc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLCBtb2R1bGU9c2VsZi5fX21vZHVsZV9fKQorICAgICAgICAgICAgYzEgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYzEudmFsaWRhdGUpCisKKyAgICAgICAgICAgIGMyID0gVFNTTFNvY2tldCgnbG9jYWxob3N0JywgMCwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMi52YWxpZGF0ZSkKKworICAgICAgICAgICAgYzMgPSBUU1NMU29ja2V0KCdsb2NhbGhvc3QnLCAwLCBjZXJ0X3JlcXM9c3NsLkNFUlRfT1BUSU9OQUwsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMzLnZhbGlkYXRlKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMykKKworICAgIGRlZiB0ZXN0X3VuaXhfZG9tYWluX3NvY2tldChzZWxmKToKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfdW5peF9kb21haW5fc29ja2V0JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmZCwgcGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCh1bml4X3NvY2tldD1wYXRoLCBrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIHBhdGg9cGF0aCwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKworICAgIGRlZiB0ZXN0X3NlcnZlcl9jZXJ0KHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCkKKyAgICAgICAgIyBzZXJ2ZXIgY2VydCBub3QgaW4gY2FfY2VydHMKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9Q0xJRU5UX0NFUlQpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisKKyAgICBkZWYgdGVzdF9zZXRfc2VydmVyX2NlcnQoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCkKKyAgICAgICAgd2l0aCBzZWxmLl9hc3NlcnRfcmFpc2VzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZXJ2ZXIuY2VydGZpbGUgPSAnZm9vJworICAgICAgICB3aXRoIHNlbGYuX2Fzc2VydF9yYWlzZXMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlcnZlci5jZXJ0ZmlsZSA9IE5vbmUKKyAgICAgICAgc2VydmVyLmNlcnRmaWxlID0gU0VSVkVSX0NFUlQKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICBkZWYgdGVzdF9jbGllbnRfY2VydChzZWxmKToKKyAgICAgICAgaWYgbm90IF9tYXRjaF9oYXNfaXBhZGRyZXNzOgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfY2xpZW50X2NlcnQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0VSVCkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwga2V5ZmlsZT1TRVJWRVJfS0VZKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoCisgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsIGtleWZpbGU9U0VSVkVSX0tFWSwKKyAgICAgICAgICAgIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjYV9jZXJ0cz1DTElFTlRfQ0EpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2VydGZpbGU9Q0xJRU5UX0NFUlRfTk9fSVAsIGtleWZpbGU9Q0xJRU5UX0tFWV9OT19JUCkKKworICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KAorICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBrZXlmaWxlPVNFUlZFUl9LRVksCisgICAgICAgICAgICBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2FfY2VydHM9Q0xJRU5UX0NBKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNlcnRmaWxlPUNMSUVOVF9DRVJULCBrZXlmaWxlPUNMSUVOVF9LRVkpCisKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKKyAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9PUFRJT05BTCwga2V5ZmlsZT1TRVJWRVJfS0VZLAorICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DQSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjZXJ0ZmlsZT1DTElFTlRfQ0VSVCwga2V5ZmlsZT1DTElFTlRfS0VZKQorCisgICAgZGVmIHRlc3RfY2lwaGVycyhzZWxmKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKyAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fc3VjY2VzcyhzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBjaXBoZXJzPVRFU1RfQ0lQSEVSUykKKworICAgICAgICBpZiBub3QgVFNTTFNvY2tldC5faGFzX2NpcGhlcnM6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfY2lwaGVycycpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIGNpcGhlcnM9J05VTEwnKQorCisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgY2lwaGVycz1URVNUX0NJUEhFUlMpCisgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgY2lwaGVycz0nTlVMTCcpCisKKyAgICBkZWYgdGVzdF9zc2wyX2FuZF9zc2wzX2Rpc2FibGVkKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MycpOgorICAgICAgICAgICAgcHJpbnQoJ1BST1RPQ09MX1NTTHYzIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJUKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjMpCisKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYzKQorICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X2Nvbm5lY3Rpb25fZmFpbHVyZShzZXJ2ZXIsIGNhX2NlcnRzPVNFUlZFUl9DRVJUKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYyJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfU1NMdjIgaXMgbm90IGF2YWlsYWJsZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzZWxmLl9zZXJ2ZXJfc29ja2V0KGtleWZpbGU9U0VSVkVSX0tFWSwgY2VydGZpbGU9U0VSVkVSX0NFUlQpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MikKKworICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9mYWlsdXJlKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQpCisKKyAgICBkZWYgdGVzdF9uZXdlcl90bHMoc2VsZik6CisgICAgICAgIGlmIG5vdCBUU1NMU29ja2V0Ll9oYXNfc3NsX2NvbnRleHQ6CisgICAgICAgICAgICAjIHVuaXR0ZXN0LnNraXAgaXMgbm90IGF2YWlsYWJsZSBmb3IgUHl0aG9uIDIuNgorICAgICAgICAgICAgcHJpbnQoJ3NraXBwaW5nIHRlc3RfbmV3ZXJfdGxzJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8yJyk6CisgICAgICAgICAgICBwcmludCgnUFJPVE9DT0xfVExTdjFfMiBpcyBub3QgYXZhaWxhYmxlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoa2V5ZmlsZT1TRVJWRVJfS0VZLCBjZXJ0ZmlsZT1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzIpCisgICAgICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2FfY2VydHM9U0VSVkVSX0NFUlQsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MV8yKQorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzEnKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8xIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMSkKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMScpIG9yIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1RMU3YxXzInKToKKyAgICAgICAgICAgIHByaW50KCdQUk9UT0NPTF9UTFN2MV8xIGFuZC9vciBQUk9UT0NPTF9UTFN2MV8yIGlzIG5vdCBhdmFpbGFibGUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldChrZXlmaWxlPVNFUlZFUl9LRVksIGNlcnRmaWxlPVNFUlZFUl9DRVJULCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjFfMikKKyAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VydmVyLCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCwgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxXzEpCisKKyAgICBkZWYgdGVzdF9zc2xfY29udGV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IFRTU0xTb2NrZXQuX2hhc19zc2xfY29udGV4dDoKKyAgICAgICAgICAgICMgdW5pdHRlc3Quc2tpcCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gMi42CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9zc2xfY29udGV4dCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VydmVyX2NvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChzc2wuUHVycG9zZS5DTElFTlRfQVVUSCkKKyAgICAgICAgc2VydmVyX2NvbnRleHQubG9hZF9jZXJ0X2NoYWluKFNFUlZFUl9DRVJULCBTRVJWRVJfS0VZKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoQ0xJRU5UX0NBKQorICAgICAgICBzZXJ2ZXJfY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIHNlcnZlciA9IHNlbGYuX3NlcnZlcl9zb2NrZXQoc3NsX2NvbnRleHQ9c2VydmVyX2NvbnRleHQpCisKKyAgICAgICAgY2xpZW50X2NvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChzc2wuUHVycG9zZS5TRVJWRVJfQVVUSCkKKyAgICAgICAgY2xpZW50X2NvbnRleHQubG9hZF9jZXJ0X2NoYWluKENMSUVOVF9DRVJULCBDTElFTlRfS0VZKQorICAgICAgICBjbGllbnRfY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU0VSVkVSX0NFUlQpCisgICAgICAgIGNsaWVudF9jb250ZXh0LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKworICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgc3NsX2NvbnRleHQ9Y2xpZW50X2NvbnRleHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuV0FSTikKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFNTTFNvY2tldCBpbXBvcnQgVFNTTFNvY2tldCwgVFNTTFNlcnZlclNvY2tldCwgX21hdGNoX2hhc19pcGFkZHJlc3MKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydEV4Y2VwdGlvbgorCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weSBiL2xpYi9weS90ZXN0L3RocmlmdF9qc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTdhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQpAQCAtMCwwICsxLDUxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBfaW1wb3J0X2xvY2FsX3RocmlmdCAgIyBub3FhCitmcm9tIHRocmlmdC5wcm90b2NvbC5USlNPTlByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKworIworIyBJbiBvcmRlciB0byBydW4gdGhlIHRlc3QgdW5kZXIgV2luZG93cy4gV2UgbmVlZCB0byBjcmVhdGUgc3ltYm9saWMgbGluaworIyBuYW1lICd0aHJpZnQnIHRvICcuLi9zcmMnIGZvbGRlciBieSB1c2luZzoKKyMKKyMgbWtsaW5rIC9EIHRocmlmdCAuLlxzcmMKKyMKKworCitjbGFzcyBUZXN0SlNPTlN0cmluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lc2NhcGVkX3VuaWNvZGVfc3RyaW5nKHNlbGYpOgorICAgICAgICB1bmljb2RlX2pzb24gPSBiJyJoZWxsbyBcXHUwZTAxXFx1MGUwMlxcdTBlMDNcXHVkODM1XFx1ZGNhYlxcdWRiNDBcXHVkYzcwIHVuaWNvZGUiJworICAgICAgICB1bmljb2RlX3RleHQgPSB1J2hlbGxvIFx1MGUwMVx1MGUwMlx1MGUwM1xVMDAwMUQ0QUJcVTAwMEUwMDcwIHVuaWNvZGUnCisKKyAgICAgICAgYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHVuaWNvZGVfanNvbikKKyAgICAgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkuZ2V0VHJhbnNwb3J0KGJ1ZikKKyAgICAgICAgcHJvdG9jb2wgPSBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgICAgICAgICB1bmljb2RlX3RleHQgPSB1bmljb2RlX3RleHQuZW5jb2RlKCd1dGY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm90b2NvbC5yZWFkU3RyaW5nKCksIHVuaWNvZGVfdGV4dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3JiL0NIQU5HRUxPRyBiL2xpYi9yYi9DSEFOR0VMT0cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGNlMmEuLjAwMDAwMDAKLS0tIGEvbGliL3JiL0NIQU5HRUxPRworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXYwLjAuMS4gSW5pdGlhbCByZWxlYXNlCmRpZmYgLS1naXQgYS9saWIvcmIvTWFrZWZpbGUuYW0gYi9saWIvcmIvTWFrZWZpbGUuYW0Kb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAwZjEwMzU3Li4xMzdlZGI0Ci0tLSBhL2xpYi9yYi9NYWtlZmlsZS5hbQorKysgYi9saWIvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDI5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitERVNURElSID89IC8KKworaWYgSEFWRV9CVU5ETEVSCisKK2FsbC1sb2NhbDoKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBidWlsZF9leHQKKworaW5zdGFsbC1leGVjLWhvb2s6CisJJChCVU5ETEVSKSBleGVjIHJha2UgaW5zdGFsbAorCitjbGVhbi1sb2NhbDoKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgcmFrZSBjbGVhbgorCitjaGVjay1sb2NhbDogYWxsCisJJChCVU5ETEVSKSBpbnN0YWxsCisJJChCVU5ETEVSKSBleGVjIHJha2UKKworZW5kaWYKKwogRVhUUkFfRElTVCA9IFwKLQlDSEFOR0VMT0cgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAogCVJha2VmaWxlIFwKIAlHZW1maWxlIFwKIAl0aHJpZnQuZ2Vtc3BlYyBcCkBAIC0yNiwyMiArNDcsNSBAQAogCWV4dCBcCiAJYmVuY2htYXJrIFwKIAlzY3JpcHQgXAotCXNwZWMKLQotREVTVERJUiA/PSAvCi0KLWFsbC1sb2NhbDoKLQkkKFJBS0UpIAotCi1pbnN0YWxsLWV4ZWMtaG9vazoKLQkkKFJBS0UpIGluc3RhbGwKLQotY2xlYW4tbG9jYWw6Ci0JJChSQUtFKSBjbGVhbgotCi1jaGVjay1sb2NhbDogYWxsCi1pZiBIQVZFX0JVTkRMRVIKLQkkKEJVTkRMRVIpIGluc3RhbGwKLQkkKEJVTkRMRVIpIGV4ZWMgcmFrZQotZW5kaWYKLQorCXNwZWMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvbGliL3JiL1JFQURNRSBiL2xpYi9yYi9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9yYi9SRUFETUUKcmVuYW1lIHRvIGxpYi9yYi9SRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9yYi9SYWtlZmlsZSBiL2xpYi9yYi9SYWtlZmlsZQppbmRleCAxMzJjNjM1Li41ZTVlNWFjIDEwMDY0NAotLS0gYS9saWIvcmIvUmFrZWZpbGUKKysrIGIvbGliL3JiL1Jha2VmaWxlCkBAIC0zOCwxMyArMzgsMjYgQEAKIGVuZAogCiBkZXNjICdDb21waWxlIHRoZSAudGhyaWZ0IGZpbGVzIGZvciB0aGUgc3BlY3MnCi10YXNrIDonZ2VuLXJiJyA9PiBbOidnZW4tcmI6c3BlYycsIDonZ2VuLXJiOmJlbmNobWFyaycsIDonZ2VuLXJiOmRlYnVnX3Byb3RvJ10KK3Rhc2sgOidnZW4tcmInID0+IFs6J2dlbi1yYjpzcGVjJywgOidnZW4tcmI6bmFtZXNwYWNlZF9zcGVjJywgOidnZW4tcmI6ZmxhdF9zcGVjJywgOidnZW4tcmI6YmVuY2htYXJrJywgOidnZW4tcmI6ZGVidWdfcHJvdG8nXQogbmFtZXNwYWNlIDonZ2VuLXJiJyBkbwogICB0YXNrIDonc3BlYycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9zcGVjJwogICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiJywgJy1vJywgZGlyLCAiI3tkaXJ9L1RocmlmdFNwZWMudGhyaWZ0IgogICBlbmQKIAorICB0YXNrIDonbmFtZXNwYWNlZF9zcGVjJyBkbworICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWMnCisgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmI6bmFtZXNwYWNlZCcsICctLXJlY3Vyc2UnLCAnLW8nLCBkaXIsICIje2Rpcn0vVGhyaWZ0TmFtZXNwYWNlZFNwZWMudGhyaWZ0IgorICAgIHNoIFRIUklGVCwgJy0tZ2VuJywgJ3JiOm5hbWVzcGFjZWQnLCAnLS1yZWN1cnNlJywgJy1vJywgZGlyLCAiI3tkaXJ9L0Jhc2VTZXJ2aWNlLnRocmlmdCIKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYjpuYW1lc3BhY2VkJywgJy0tcmVjdXJzZScsICctbycsIGRpciwgIiN7ZGlyfS9FeHRlbmRlZFNlcnZpY2UudGhyaWZ0IgorICBlbmQKKworICB0YXNrIDonZmxhdF9zcGVjJyBkbworICAgIGRpciA9IEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnL3NwZWMnCisgICAgbWtkaXJfcCgiI3tkaXJ9L2dlbi1yYi9mbGF0IikKKyAgICBzaCBUSFJJRlQsICctLWdlbicsICdyYicsICctLXJlY3Vyc2UnLCAnLW91dCcsICIje2Rpcn0vZ2VuLXJiL2ZsYXQiLCAiI3tkaXJ9L1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdCIKKyAgZW5kCisKICAgdGFzayA6J2JlbmNobWFyaycgZG8KICAgICBkaXIgPSBGaWxlLmRpcm5hbWUoX19GSUxFX18pICsgJy9iZW5jaG1hcmsnCiAgICAgc2ggVEhSSUZULCAnLS1nZW4nLCAncmInLCAnLW8nLCBkaXIsICIje2Rpcn0vQmVuY2htYXJrLnRocmlmdCIKQEAgLTU4LDYgKzcxLDcgQEAKIAogZGVzYyAiQnVpbGQgdGhlIG5hdGl2ZSBsaWJyYXJ5IgogdGFzayA6YnVpbGRfZXh0ID0+IDonZ2VuLXJiJyBkbworICAgbmV4dCBpZiBkZWZpbmVkPyhSVUJZX0VOR0lORSkgJiYgUlVCWV9FTkdJTkUgPX4gL2pydWJ5LwogICAgRGlyOjpjaGRpcihGaWxlOjpkaXJuYW1lKCdleHQvZXh0Y29uZi5yYicpKSBkbwogICAgICAgdW5sZXNzIHNoICJydWJ5ICN7RmlsZTo6YmFzZW5hbWUoJ2V4dC9leHRjb25mLnJiJyl9IgogICAgICAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBydW4gZXh0Y29uZiIKQEAgLTczLDcgKzg3LDcgQEAKIGRlc2MgJ1J1biB0aGUgY29tcGlsZXIgdGVzdHMgKHJlcXVpcmVzIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0KScKIHRhc2sgOnRlc3QgZG8KICAgIyBlbnN1cmUgdGhpcyBpcyBhIGZ1bGwgdGhyaWZ0IGNoZWNrb3V0IGFuZCBub3QgYSB0YXJiYWxsIG9mIHRoZSBydWJ5IGxpYnMKLSAgY21kID0gJ2hlYWQgLTEgLi4vLi4vUkVBRE1FIDI+L2Rldi9udWxsIHwgZ3JlcCBUaHJpZnQgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCcKKyAgY21kID0gJ2hlYWQgLTEgLi4vLi4vUkVBRE1FLm1kIDI+L2Rldi9udWxsIHwgZ3JlcCBUaHJpZnQgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCcKICAgc3lzdGVtKGNtZCkgb3IgZmFpbCAicmFrZSB0ZXN0IHJlcXVpcmVzIGEgZnVsbCB0aHJpZnQgY2hlY2tvdXQiCiAgIHNoICdtYWtlJywgJy1DJywgRmlsZS5kaXJuYW1lKF9fRklMRV9fKSArICIvLi4vLi4vdGVzdC9yYiIsICJjaGVjayIKIGVuZApAQCAtOTMsNyArMTA3LDcgQEAKIAogZGVzYyAnSW5zdGFsbCB0aGUgdGhyaWZ0IGdlbScKIHRhc2sgOmluc3RhbGwgPT4gWzpnZW1dIGRvCi0gIHVubGVzcyBzaCAnZ2VtJywgJ2luc3RhbGwnLCAndGhyaWZ0LSouZ2VtJworICB1bmxlc3Mgc2ggJ2dlbScsICdpbnN0YWxsJywgRGlyLmdsb2IoJ3RocmlmdC0qLmdlbScpLmxhc3QKICAgICAkc3RkZXJyLnB1dHMgIkZhaWxlZCB0byBpbnN0YWxsIHRocmlmdCBnZW0iCiAgICAgYnJlYWsKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9yYi9jb2Rpbmdfc3RhbmRhcmRzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMCwwICsxIEBACitQbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMgYi9saWIvcmIvZXh0L2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5jCmluZGV4IGE4ZWJlN2YuLjY1Y2JlNWYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLmMKKysrIGIvbGliL3JiL2V4dC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuYwpAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgdm9pZCB3cml0ZV9zdHJpbmdfZGlyZWN0KFZBTFVFIHRyYW5zLCBWQUxVRSBzdHIpIHsKICAgaWYgKFRZUEUoc3RyKSAhPSBUX1NUUklORykgewotICAgIHJiX3JhaXNlKHJiX2VTdGFuZGFyZEVycm9yLCAiVmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nIik7ICAgIAorICAgIHJiX3JhaXNlKHJiX2VTdGFuZGFyZEVycm9yLCAiVmFsdWUgc2hvdWxkIGJlIGEgc3RyaW5nIik7CiAgIH0KICAgc3RyID0gY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyKHN0cik7CiAgIHdyaXRlX2kzMl9kaXJlY3QodHJhbnMsIFJTVFJJTkdfTEVOKHN0cikpOwpAQCAtMjE5LDExICsyMTksMjEgQEAKICAgcmV0dXJuIFFuaWw7CiB9CiAKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1ZikgeworICBDSEVDS19OSUwoYnVmKTsKKyAgVkFMVUUgdHJhbnMgPSBHRVRfVFJBTlNQT1JUKHNlbGYpOworICBidWYgPSBmb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKTsKKyAgd3JpdGVfaTMyX2RpcmVjdCh0cmFucywgUlNUUklOR19MRU4oYnVmKSk7CisgIHJiX2Z1bmNhbGwodHJhbnMsIHdyaXRlX21ldGhvZF9pZCwgMSwgYnVmKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBpbnRlcmZhY2UgcmVhZGluZyBtZXRob2RzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RyaW5nKFZBTFVFIHNlbGYpOworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9ieXRlKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2kzMihWQUxVRSBzZWxmKTsKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pMTYoVkFMVUUgc2VsZik7CkBAIC0yNzMsMjcgKzI4MywyNyBAQAogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4oVkFMVUUgc2VsZikgewogICByZXR1cm4gUW5pbDsKIH0KIAotVkFMVUUgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CitWQUxVRSByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQoVkFMVUUgc2VsZikgeworVkFMVUUgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKLVZBTFVFIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7CiAgIHJldHVybiBRbmlsOwogfQogCi1WQUxVRSByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CiB9CiAKQEAgLTM4MSwxMSArMzkxLDE1IEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJpbmcoVkFMVUUgc2VsZikgewotICBpbnQgc2l6ZSA9IHJlYWRfaTMyX2RpcmVjdChzZWxmKTsKLSAgVkFMVUUgYnVmZmVyID0gUkVBRChzZWxmLCBzaXplKTsKKyAgVkFMVUUgYnVmZmVyID0gcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2JpbmFyeShzZWxmKTsKICAgcmV0dXJuIGNvbnZlcnRfdG9fc3RyaW5nKGJ1ZmZlcik7CiB9CiAKK1ZBTFVFIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnkoVkFMVUUgc2VsZikgeworICBpbnQgc2l6ZSA9IHJlYWRfaTMyX2RpcmVjdChzZWxmKTsKKyAgcmV0dXJuIFJFQUQoc2VsZiwgc2l6ZSk7Cit9CisKIHZvaWQgSW5pdF9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQoKSB7CiAgIFZBTFVFIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJCaW5hcnlQcm90b2NvbCIpKTsKIApAQCAtNDEwLDYgKzQyNCw3IEBACiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfaTY0IiwgICAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfaTY0LCAxKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9kb3VibGUiLCAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b193cml0ZV9kb3VibGUsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX3N0cmluZyIsICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3dyaXRlX3N0cmluZywgMSk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAid3JpdGVfYmluYXJ5IiwgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfYmluYXJ5LCAxKTsKICAgLy8gdW51c2VkIG1ldGhvZHMKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJ3cml0ZV9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfbWVzc2FnZV9lbmQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgIndyaXRlX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fd3JpdGVfc3RydWN0X2JlZ2luLCAxKTsKQEAgLTQzMSwxNCArNDQ2LDE1IEBACiAgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9pNjQiLCAgICAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9pNjQsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfZG91YmxlIiwgICAgICAgICByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfZG91YmxlLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cmluZyIsICAgICAgICAgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX3N0cmluZywgMCk7CisgIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9iaW5hcnkiLCAgICAgICAgIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9iaW5hcnksIDApOwogICAvLyB1bnVzZWQgbWV0aG9kcwogICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2JlZ2luIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9tYXBfZW5kIiwgcmJfdGhpZnRfYmluYXJ5X3Byb3RvX3JlYWRfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoYnBhX2NsYXNzLCAicmVhZF9saXN0X2VuZCIsIHJiX3RoaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aGlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zZXRfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfYmVnaW4sIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfc3RydWN0X2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9zdHJ1Y3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2ZpZWxkX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9maWVsZF9lbmQsIDApOworICByYl9kZWZpbmVfbWV0aG9kKGJwYV9jbGFzcywgInJlYWRfbWFwX2VuZCIsIHJiX3RocmlmdF9iaW5hcnlfcHJvdG9fcmVhZF9tYXBfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX2xpc3RfZW5kIiwgcmJfdGhyaWZ0X2JpbmFyeV9wcm90b19yZWFkX2xpc3RfZW5kLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZChicGFfY2xhc3MsICJyZWFkX3NldF9lbmQiLCByYl90aHJpZnRfYmluYXJ5X3Byb3RvX3JlYWRfc2V0X2VuZCwgMCk7CiAKICAgcmJ1Zl9pdmFyX2lkID0gcmJfaW50ZXJuKCJAcmJ1ZiIpOwogfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwppbmRleCAwYzA1NDgxLi5jMGY0NmI5IDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYworKysgYi9saWIvcmIvZXh0L2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtNDAsNiArNDAsNyBAQAogc3RhdGljIGludCBWRVJTSU9OOwogc3RhdGljIGludCBWRVJTSU9OX01BU0s7CiBzdGF0aWMgaW50IFRZUEVfTUFTSzsKK3N0YXRpYyBpbnQgVFlQRV9CSVRTOwogc3RhdGljIGludCBUWVBFX1NISUZUX0FNT1VOVDsKIHN0YXRpYyBpbnQgUFJPVE9DT0xfSUQ7CiAKQEAgLTE2Nyw2ICsxNjgsNyBAQAogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9pMzIoVkFMVUUgc2VsZiwgVkFMVUUgaTMyKTsKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cmluZyhWQUxVRSBzZWxmLCBWQUxVRSBzdHIpOworVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfYmluYXJ5KFZBTFVFIHNlbGYsIFZBTFVFIGJ1Zik7CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kKFZBTFVFIHNlbGYpIHsKICAgcmV0dXJuIFFuaWw7CkBAIC0zMDUsMTAgKzMwNywxNiBAQAogfQogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9zdHJpbmcoVkFMVUUgc2VsZiwgVkFMVUUgc3RyKSB7Ci0gIFZBTFVFIHRyYW5zcG9ydCA9IEdFVF9UUkFOU1BPUlQoc2VsZik7CiAgIHN0ciA9IGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpOwotICB3cml0ZV92YXJpbnQzMih0cmFuc3BvcnQsIFJTVFJJTkdfTEVOKHN0cikpOwotICBXUklURSh0cmFuc3BvcnQsIFJTVFJJTkdfUFRSKHN0ciksIFJTVFJJTkdfTEVOKHN0cikpOworICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9iaW5hcnkoc2VsZiwgc3RyKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKK1ZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2JpbmFyeShWQUxVRSBzZWxmLCBWQUxVRSBidWYpIHsKKyAgYnVmID0gZm9yY2VfYmluYXJ5X2VuY29kaW5nKGJ1Zik7CisgIFZBTFVFIHRyYW5zcG9ydCA9IEdFVF9UUkFOU1BPUlQoc2VsZik7CisgIHdyaXRlX3ZhcmludDMyKHRyYW5zcG9ydCwgUlNUUklOR19MRU4oYnVmKSk7CisgIFdSSVRFKHRyYW5zcG9ydCwgU3RyaW5nVmFsdWVQdHIoYnVmKSwgUlNUUklOR19MRU4oYnVmKSk7CiAgIHJldHVybiBRbmlsOwogfQogCkBAIC0zMTksNiArMzI3LDcgQEAKICNkZWZpbmUgaXNfYm9vbF90eXBlKGN0eXBlKSAoKChjdHlwZSkgJiAweDBGKSA9PSBDVFlQRV9CT09MRUFOX1RSVUUgfHwgKChjdHlwZSkgJiAweDBGKSA9PSBDVFlQRV9CT09MRUFOX0ZBTFNFKQogCiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX3N0cmluZyhWQUxVRSBzZWxmKTsKK1ZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfYmluYXJ5KFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9ieXRlKFZBTFVFIHNlbGYpOwogVkFMVUUgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9pMzIoVkFMVUUgc2VsZik7CiBWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2kxNihWQUxVRSBzZWxmKTsKQEAgLTQ0Miw3ICs0NTEsNyBAQAogICAgIHJiX2V4Y19yYWlzZShnZXRfcHJvdG9jb2xfZXhjZXB0aW9uKElOVDJGSVgoLTEpLCByYl9zdHJfbmV3MihidWYpKSk7CiAgIH0KICAgCi0gIGludDhfdCB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgMHgwMzsKKyAgaW50OF90IHR5cGUgPSAodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFM7CiAgIGludDMyX3Qgc2VxaWQgPSByZWFkX3ZhcmludDY0KHNlbGYpOwogICBWQUxVRSBtZXNzYWdlTmFtZSA9IHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nKHNlbGYpOwogICByZXR1cm4gcmJfYXJ5X25ldzMoMywgbWVzc2FnZU5hbWUsIElOVDJGSVgodHlwZSksIElOVDJOVU0oc2VxaWQpKTsKQEAgLTU0NywyMCArNTU2LDI1IEBACiB9CiAKIFZBTFVFIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nKFZBTFVFIHNlbGYpIHsKLSAgaW50NjRfdCBzaXplID0gcmVhZF92YXJpbnQ2NChzZWxmKTsKLSAgVkFMVUUgYnVmZmVyID0gUkVBRChzZWxmLCBzaXplKTsKKyAgVkFMVUUgYnVmZmVyID0gcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9iaW5hcnkoc2VsZik7CiAgIHJldHVybiBjb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpOwogfQogCitWQUxVRSByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2JpbmFyeShWQUxVRSBzZWxmKSB7CisgIGludDY0X3Qgc2l6ZSA9IHJlYWRfdmFyaW50NjQoc2VsZik7CisgIHJldHVybiBSRUFEKHNlbGYsIHNpemUpOworfQorCiBzdGF0aWMgdm9pZCBJbml0X2NvbnN0YW50cygpIHsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MgPSByYl9jb25zdF9nZXQodGhyaWZ0X21vZHVsZSwgcmJfaW50ZXJuKCJDb21wYWN0UHJvdG9jb2wiKSk7Ci0gIAorCiAgIFZFUlNJT04gPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlZFUlNJT04iKSkpOwogICBWRVJTSU9OX01BU0sgPSByYl9udW0ybGwocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlZFUlNJT05fTUFTSyIpKSk7CiAgIFRZUEVfTUFTSyA9IHJiX251bTJsbChyYl9jb25zdF9nZXQodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsIHJiX2ludGVybigiVFlQRV9NQVNLIikpKTsKKyAgVFlQRV9CSVRTID0gcmJfbnVtMmxsKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJUWVBFX0JJVFMiKSkpOwogICBUWVBFX1NISUZUX0FNT1VOVCA9IEZJWDJJTlQocmJfY29uc3RfZ2V0KHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCByYl9pbnRlcm4oIlRZUEVfU0hJRlRfQU1PVU5UIikpKTsKICAgUFJPVE9DT0xfSUQgPSBGSVgySU5UKHJiX2NvbnN0X2dldCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgcmJfaW50ZXJuKCJQUk9UT0NPTF9JRCIpKSk7Ci0gIAorCiAgIGxhc3RfZmllbGRfaWQgPSByYl9pbnRlcm4oIkBsYXN0X2ZpZWxkIik7CiAgIGJvb2xlYW5fZmllbGRfaWQgPSByYl9pbnRlcm4oIkBib29sZWFuX2ZpZWxkIik7CiAgIGJvb2xfdmFsdWVfaWQgPSByYl9pbnRlcm4oIkBib29sX3ZhbHVlIik7CkBAIC01ODMsNiArNTk3LDcgQEAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX2k2NCIsICAgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9pNjQsIDEpOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAid3JpdGVfZG91YmxlIiwgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX2RvdWJsZSwgMSk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9zdHJpbmciLCAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fd3JpdGVfc3RyaW5nLCAxKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX2JpbmFyeSIsICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b193cml0ZV9iaW5hcnksIDEpOwogCiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJ3cml0ZV9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgIndyaXRlX3N0cnVjdF9iZWdpbiIsIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3dyaXRlX3N0cnVjdF9iZWdpbiwgMSk7CkBAIC02MDUsNiArNjIwLDcgQEAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfaTY0IiwgICAgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2k2NCwgMCk7CiAgIHJiX2RlZmluZV9tZXRob2QodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfY2xhc3MsICJyZWFkX2RvdWJsZSIsICAgICAgICAgcmJfdGhyaWZ0X2NvbXBhY3RfcHJvdG9fcmVhZF9kb3VibGUsIDApOwogICByYl9kZWZpbmVfbWV0aG9kKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX2NsYXNzLCAicmVhZF9zdHJpbmciLCAgICAgICAgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RyaW5nLCAwKTsKKyAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfYmluYXJ5IiwgICAgICAgICByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX2JpbmFyeSwgMCk7CiAKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfY29tcGFjdF9wcm90b19yZWFkX21lc3NhZ2VfZW5kLCAwKTsKICAgcmJfZGVmaW5lX21ldGhvZCh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9jbGFzcywgInJlYWRfc3RydWN0X2JlZ2luIiwgIHJiX3RocmlmdF9jb21wYWN0X3Byb3RvX3JlYWRfc3RydWN0X2JlZ2luLCAwKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvY29uc3RhbnRzLmggYi9saWIvcmIvZXh0L2NvbnN0YW50cy5oCmluZGV4IDNiZmFjODguLmU3YWVjNDQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvY29uc3RhbnRzLmgKKysrIGIvbGliL3JiL2V4dC9jb25zdGFudHMuaApAQCAtNDIsMTkgKzQyLDIwIEBACiBleHRlcm4gSUQgd3JpdGVfaTY0X21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9kb3VibGVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX3N0cmluZ19tZXRob2RfaWQ7CitleHRlcm4gSUQgd3JpdGVfYmluYXJ5X21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9tYXBfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX21hcF9lbmRfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2xpc3RfZW5kX21ldGhvZF9pZDsKIGV4dGVybiBJRCB3cml0ZV9zZXRfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX3NldF9lbmRfbWV0aG9kX2lkOwotZXh0ZXJuIElEIHNpemVfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfYm9vbF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9ieXRlX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2kxNl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9pMzJfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfaTY0X21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX3N0cmluZ19tZXRob2RfaWQ7CitleHRlcm4gSUQgcmVhZF9iaW5hcnlfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfZG91YmxlX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX21hcF9iZWdpbl9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9tYXBfZW5kX21ldGhvZF9pZDsKQEAgLTY3LDE1ICs2OCwxMiBAQAogZXh0ZXJuIElEIHJlYWRfZmllbGRfYmVnaW5fbWV0aG9kX2lkOwogZXh0ZXJuIElEIHJlYWRfZmllbGRfZW5kX21ldGhvZF9pZDsKIGV4dGVybiBJRCBrZXlzX21ldGhvZF9pZDsKLWV4dGVybiBJRCBlbnRyaWVzX21ldGhvZF9pZDsgCi1leHRlcm4gSUQgbmFtZV9tZXRob2RfaWQ7IAotZXh0ZXJuIElEIHNvcnRfbWV0aG9kX2lkOworZXh0ZXJuIElEIGVudHJpZXNfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX2ZpZWxkX3N0b3BfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHNraXBfbWV0aG9kX2lkOwogZXh0ZXJuIElEIHdyaXRlX21ldGhvZF9pZDsKIGV4dGVybiBJRCByZWFkX2FsbF9tZXRob2RfaWQ7CiBleHRlcm4gSUQgcmVhZF9pbnRvX2J1ZmZlcl9tZXRob2RfaWQ7Ci1leHRlcm4gSUQgbmF0aXZlX3FtYXJrX21ldGhvZF9pZDsKIGV4dGVybiBJRCBmb3JjZV9iaW5hcnlfZW5jb2RpbmdfaWQ7CiBleHRlcm4gSUQgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkOwogZXh0ZXJuIElEIGNvbnZlcnRfdG9fc3RyaW5nX2lkOwpAQCAtOTEsNiArODksNyBAQAogZXh0ZXJuIFZBTFVFIHZhbHVlX3N5bTsKIGV4dGVybiBWQUxVRSBlbGVtZW50X3N5bTsKIGV4dGVybiBWQUxVRSBjbGFzc19zeW07CitleHRlcm4gVkFMVUUgYmluYXJ5X3N5bTsKIAogZXh0ZXJuIFZBTFVFIHJiX2NTZXQ7CiBleHRlcm4gVkFMVUUgdGhyaWZ0X21vZHVsZTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvZXh0Y29uZi5yYiBiL2xpYi9yYi9leHQvZXh0Y29uZi5yYgppbmRleCBlZDIwZjU2Li5iMzVmNjBiIDEwMDY0NAotLS0gYS9saWIvcmIvZXh0L2V4dGNvbmYucmIKKysrIGIvbGliL3JiL2V4dC9leHRjb25mLnJiCkBAIC0yMSwxMCArMjEsMTIgQEAKICAgRmlsZS5vcGVuKCdNYWtlZmlsZScsICd3Jyl7fGZ8IGYucHV0cyAiYWxsOlxuXG5pbnN0YWxsOlxuIiB9CiBlbHNlCiAgIHJlcXVpcmUgJ21rbWYnCisgIHJlcXVpcmUgJ3JiY29uZmlnJwogCi0gICRBUkNIX0ZMQUdTID0gQ29uZmlnOjpDT05GSUdbJ0NGTEFHUyddLnNjYW4oIC8oLWFyY2ggKShcUyspLyApLm1hcHt8eCx5fCB4ICsgeSArICcgJyB9LmpvaW4oJycpCisgICRBUkNIX0ZMQUdTID0gUmJDb25maWc6OkNPTkZJR1snQ0ZMQUdTJ10uc2NhbiggLygtYXJjaCApKFxTKykvICkubWFwe3x4LHl8IHggKyB5ICsgJyAnIH0uam9pbignJykKIAotICAkQ0ZMQUdTID0gIi1nIC1PMiAtV2FsbCAtV2Vycm9yICIgKyAkQVJDSF9GTEFHUworCisgICRDRkxBR1MgPSAiLWZzaWduZWQtY2hhciAtZyAtTzIgLVdhbGwgLVdlcnJvciAiICsgJEFSQ0hfRkxBR1MKIAogICBoYXZlX2Z1bmMoInN0cmxjcHkiLCAic3RyaW5nLmgiKQogCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L21lbW9yeV9idWZmZXIuYyBiL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCmluZGV4IGU3MjUzZGMuLjhiNTJjNGEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCisrKyBiL2xpYi9yYi9leHQvbWVtb3J5X2J1ZmZlci5jCkBAIC0zOSw3ICszOSw3IEBACiBWQUxVRSByYl90aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZShWQUxVRSBzZWxmLCBWQUxVRSBzdHIpIHsKICAgVkFMVUUgYnVmID0gR0VUX0JVRihzZWxmKTsKICAgc3RyID0gZm9yY2VfYmluYXJ5X2VuY29kaW5nKHN0cik7Ci0gIHJiX3N0cl9idWZfY2F0KGJ1ZiwgUlNUUklOR19QVFIoc3RyKSwgUlNUUklOR19MRU4oc3RyKSk7CisgIHJiX3N0cl9idWZfY2F0KGJ1ZiwgU3RyaW5nVmFsdWVQdHIoc3RyKSwgUlNUUklOR19MRU4oc3RyKSk7CiAgIHJldHVybiBRbmlsOwogfQogCmRpZmYgLS1naXQgYS9saWIvcmIvZXh0L3Byb3RvY29sLmMgYi9saWIvcmIvZXh0L3Byb3RvY29sLmMKaW5kZXggYzE4NzY1NC4uZTY5ZGUyOSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9wcm90b2NvbC5jCisrKyBiL2xpYi9yYi9leHQvcHJvdG9jb2wuYwpAQCAtMSwxODUgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHJ1YnkuaD4KLSNpbmNsdWRlIDxwcm90b2NvbC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxjb25zdGFudHMuaD4KLSNpbmNsdWRlIDxzdHJ1Y3QuaD4KLQotc3RhdGljIFZBTFVFIHNraXAoVkFMVUUgc2VsZiwgaW50IHR0eXBlKSB7Ci0gIGlmICh0dHlwZSA9PSBUVFlQRV9TVE9QKSB7Ci0gICAgcmV0dXJuIFFuaWw7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfQk9PTCkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9ib29sX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfQllURSkgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9ieXRlX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfSTE2KSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2kxNl9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0kzMikgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9pMzJfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JNjQpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfaTY0X21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfRE9VQkxFKSB7Ci0gICAgcmJfZnVuY2FsbChzZWxmLCByZWFkX2RvdWJsZV9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX1NUUklORykgewotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9zdHJpbmdfbWV0aG9kX2lkLCAwKTsKLSAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJVQ1QpIHsKLSAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfc3RydWN0X2JlZ2luX21ldGhvZF9pZCwgMCk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIFZBTFVFIGZpZWxkX2hlYWRlciA9IHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9maWVsZF9iZWdpbl9tZXRob2RfaWQsIDApOwotICAgICAgaWYgKE5JTF9QKGZpZWxkX2hlYWRlcikgfHwgRklYMklOVChyYl9hcnlfZW50cnkoZmllbGRfaGVhZGVyLCAxKSkgPT0gVFRZUEVfU1RPUCApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IAotICAgICAgc2tpcChzZWxmLCBGSVgySU5UKHJiX2FyeV9lbnRyeShmaWVsZF9oZWFkZXIsIDEpKSk7Ci0gICAgICByYl9mdW5jYWxsKHNlbGYsIHJlYWRfZmllbGRfZW5kX21ldGhvZF9pZCwgMCk7Ci0gICAgfQotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9zdHJ1Y3RfZW5kX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfTUFQKSB7Ci0gICAgaW50IGk7Ci0gICAgVkFMVUUgbWFwX2hlYWRlciA9IHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9tYXBfYmVnaW5fbWV0aG9kX2lkLCAwKTsKLSAgICBpbnQga3R5cGUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShtYXBfaGVhZGVyLCAwKSk7Ci0gICAgaW50IHZ0eXBlID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMSkpOwotICAgIGludCBzaXplID0gRklYMklOVChyYl9hcnlfZW50cnkobWFwX2hlYWRlciwgMikpOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIHNraXAoc2VsZiwga3R5cGUpOwotICAgICAgc2tpcChzZWxmLCB2dHlwZSk7Ci0gICAgfQotICAgIHJiX2Z1bmNhbGwoc2VsZiwgcmVhZF9tYXBfZW5kX21ldGhvZF9pZCwgMCk7Ci0gIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfTElTVCB8fCB0dHlwZSA9PSBUVFlQRV9TRVQpIHsKLSAgICBpbnQgaTsKLSAgICBWQUxVRSBjb2xsZWN0aW9uX2hlYWRlciA9IHJiX2Z1bmNhbGwoc2VsZiwgdHR5cGUgPT0gVFRZUEVfTElTVCA/IHJlYWRfbGlzdF9iZWdpbl9tZXRob2RfaWQgOiByZWFkX3NldF9iZWdpbl9tZXRob2RfaWQsIDApOwotICAgIGludCBldHlwZSA9IEZJWDJJTlQocmJfYXJ5X2VudHJ5KGNvbGxlY3Rpb25faGVhZGVyLCAwKSk7Ci0gICAgaW50IHNpemUgPSBGSVgySU5UKHJiX2FyeV9lbnRyeShjb2xsZWN0aW9uX2hlYWRlciwgMSkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIHNraXAoc2VsZiwgZXR5cGUpOwotICAgIH0KLSAgICByYl9mdW5jYWxsKHNlbGYsIHR0eXBlID09IFRUWVBFX0xJU1QgPyByZWFkX2xpc3RfZW5kX21ldGhvZF9pZCA6IHJlYWRfc2V0X2VuZF9tZXRob2RfaWQsIDApOwotICB9IGVsc2UgewotICAgIHJiX3JhaXNlKHJiX2VOb3RJbXBFcnJvciwgImRvbid0IGtub3cgaG93IHRvIHNraXAgdHlwZSAlZCIsIHR0eXBlKTsKLSAgfQotCi0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfcHJvdG9jb2xfbmF0aXZlX3FtYXJrKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFmYWxzZTsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3Byb3RvY29sX3NraXAoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIHR0eXBlKSB7Ci0gIHJldHVybiBza2lwKHByb3RvY29sLCBGSVgySU5UKHR0eXBlKSk7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9tZXNzYWdlX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aHJpZnRfd3JpdGVfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYsIFZBTFVFIG5hbWUpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9maWVsZF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX21hcF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhyaWZ0X3dyaXRlX2xpc3RfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF93cml0ZV9zZXRfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RocmlmdF9yZWFkX21lc3NhZ2VfZW5kKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfc3RydWN0X2JlZ2luKFZBTFVFIHNlbGYpIHsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLVZBTFVFIHJiX3RoaWZ0X3JlYWRfc3RydWN0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX2ZpZWxkX2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX21hcF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotVkFMVUUgcmJfdGhpZnRfcmVhZF9saXN0X2VuZChWQUxVRSBzZWxmKSB7Ci0gIHJldHVybiBRbmlsOwotfQotCi1WQUxVRSByYl90aGlmdF9yZWFkX3NldF9lbmQoVkFMVUUgc2VsZikgewotICByZXR1cm4gUW5pbDsKLX0KLQotdm9pZCBJbml0X3Byb3RvY29sKCkgewotICBWQUxVRSBjX3Byb3RvY29sID0gcmJfY29uc3RfZ2V0KHRocmlmdF9tb2R1bGUsIHJiX2ludGVybigiQmFzZVByb3RvY29sIikpOwotICAKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAic2tpcCIsIHJiX3RocmlmdF9wcm90b2NvbF9za2lwLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfbWVzc2FnZV9lbmQiLCByYl90aHJpZnRfd3JpdGVfbWVzc2FnZV9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJ3cml0ZV9zdHJ1Y3RfYmVnaW4iLCByYl90aHJpZnRfd3JpdGVfc3RydWN0X2JlZ2luLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfc3RydWN0X2VuZCIsIHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfZmllbGRfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX2ZpZWxkX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX21hcF9lbmQiLCByYl90aHJpZnRfd3JpdGVfbWFwX2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIndyaXRlX2xpc3RfZW5kIiwgcmJfdGhyaWZ0X3dyaXRlX2xpc3RfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAid3JpdGVfc2V0X2VuZCIsIHJiX3RocmlmdF93cml0ZV9zZXRfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9tZXNzYWdlX2VuZCIsIHJiX3RocmlmdF9yZWFkX21lc3NhZ2VfZW5kLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChjX3Byb3RvY29sLCAicmVhZF9zdHJ1Y3RfYmVnaW4iLCByYl90aGlmdF9yZWFkX3N0cnVjdF9iZWdpbiwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfc3RydWN0X2VuZCIsIHJiX3RoaWZ0X3JlYWRfc3RydWN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfZmllbGRfZW5kIiwgcmJfdGhpZnRfcmVhZF9maWVsZF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX21hcF9lbmQiLCByYl90aGlmdF9yZWFkX21hcF9lbmQsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGNfcHJvdG9jb2wsICJyZWFkX2xpc3RfZW5kIiwgcmJfdGhpZnRfcmVhZF9saXN0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgInJlYWRfc2V0X2VuZCIsIHJiX3RoaWZ0X3JlYWRfc2V0X2VuZCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2QoY19wcm90b2NvbCwgIm5hdGl2ZT8iLCByYl90aHJpZnRfcHJvdG9jb2xfbmF0aXZlX3FtYXJrLCAwKTsKLSAgCi0gIC8vIG5hdGl2ZV9wcm90b19tZXRob2RfdGFibGUgKm5wbXQ7Ci0gIC8vIG5wbXQgPSBBTExPQyhuYXRpdmVfcHJvdG9fbWV0aG9kX3RhYmxlKTsKLSAgLy8gbnBtdC0+d3JpdGVfbWVzc2FnZV9lbmQgPSByYl90aHJpZnRfd3JpdGVfbWVzc2FnZV9lbmQ7Ci0gIC8vIG5wbXQtPndyaXRlX3N0cnVjdF9iZWdpbiA9IHJiX3RocmlmdF93cml0ZV9zdHJ1Y3RfYmVnaW47Ci0gIC8vIG5wbXQtPndyaXRlX3N0cnVjdF9lbmQgPSByYl90aHJpZnRfd3JpdGVfc3RydWN0X2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfZmllbGRfZW5kID0gcmJfdGhyaWZ0X3dyaXRlX2ZpZWxkX2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfbWFwX2VuZCA9IHJiX3RocmlmdF93cml0ZV9tYXBfZW5kOwotICAvLyBucG10LT53cml0ZV9saXN0X2VuZCA9IHJiX3RocmlmdF93cml0ZV9saXN0X2VuZDsKLSAgLy8gbnBtdC0+d3JpdGVfc2V0X2VuZCA9IHJiX3RocmlmdF93cml0ZV9zZXRfZW5kOwotICAvLyBucG10LT5yZWFkX21lc3NhZ2VfZW5kID0gcmJfdGhyaWZ0X3JlYWRfbWVzc2FnZV9lbmQ7Ci0gIC8vIG5wbXQtPnJlYWRfc3RydWN0X2JlZ2luID0gcmJfdGhpZnRfcmVhZF9zdHJ1Y3RfYmVnaW47Ci0gIC8vIG5wbXQtPnJlYWRfc3RydWN0X2VuZCA9IHJiX3RoaWZ0X3JlYWRfc3RydWN0X2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9maWVsZF9lbmQgPSByYl90aGlmdF9yZWFkX2ZpZWxkX2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9tYXBfZW5kID0gcmJfdGhpZnRfcmVhZF9tYXBfZW5kOwotICAvLyBucG10LT5yZWFkX2xpc3RfZW5kID0gcmJfdGhpZnRfcmVhZF9saXN0X2VuZDsKLSAgLy8gbnBtdC0+cmVhZF9zZXRfZW5kID0gcmJfdGhpZnRfcmVhZF9zZXRfZW5kOwotICAvLyAKLSAgLy8gVkFMVUUgbWV0aG9kX3RhYmxlX29iamVjdCA9IERhdGFfV3JhcF9TdHJ1Y3QocmJfY09iamVjdCwgMCwgZnJlZSwgbnBtdCk7Ci0gIC8vIHJiX2NvbnN0X3NldChjX3Byb3RvY29sLCByYl9pbnRlcm4oIkBuYXRpdmVfbWV0aG9kX3RhYmxlIiksIG1ldGhvZF90YWJsZV9vYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9wcm90b2NvbC5oIGIvbGliL3JiL2V4dC9wcm90b2NvbC5oCmluZGV4IDUzNjk1MzAuLmU2OWRlMjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9leHQvcHJvdG9jb2wuaAorKysgYi9saWIvcmIvZXh0L3Byb3RvY29sLmgKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi12b2lkIEluaXRfcHJvdG9jb2woKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvc3RybGNweS5oIGIvbGliL3JiL2V4dC9zdHJsY3B5LmgKaW5kZXggYzZmNTA4Zi4uZjZmZTBmZSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9zdHJsY3B5LmgKKysrIGIvbGliL3JiL2V4dC9zdHJsY3B5LmgKQEAgLTE3LDE0ICsxNywxOCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpZm5kZWYgX19oYXNfYnVpbHRpbgorI2RlZmluZSBfX2hhc19idWlsdGluKHgpIDAKKyNlbmRpZgorCiAjaWZuZGVmIEhBVkVfU1RSTENQWQotc2l6ZV90Ci1zdHJsY3B5IChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGRzdF9zeik7CitzaXplX3Qgc3RybGNweSAoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBkc3Rfc3opOwogI2Vsc2UKKyNpZiAhX19oYXNfYnVpbHRpbihzdHJsY3B5KQogZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwogI2VuZGlmCisjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGliL3JiL2V4dC9zdHJ1Y3QuYyBiL2xpYi9yYi9leHQvc3RydWN0LmMKaW5kZXggNWE5YTY3OS4uZTNhYTg1NSAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC9zdHJ1Y3QuYworKysgYi9saWIvcmIvZXh0L3N0cnVjdC5jCkBAIC03NSw2ICs3NSwxMSBAQAogICByZXR1cm4gUW5pbDsKIH0KIAorVkFMVUUgZGVmYXVsdF93cml0ZV9iaW5hcnkoVkFMVUUgcHJvdG9jb2wsIFZBTFVFIHZhbHVlKSB7CisgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHdyaXRlX2JpbmFyeV9tZXRob2RfaWQsIDEsIHZhbHVlKTsKKyAgcmV0dXJuIFFuaWw7Cit9CisKIFZBTFVFIGRlZmF1bHRfd3JpdGVfbGlzdF9iZWdpbihWQUxVRSBwcm90b2NvbCwgVkFMVUUgZXR5cGUsIFZBTFVFIGxlbmd0aCkgewogICByYl9mdW5jYWxsKHByb3RvY29sLCB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZCwgMiwgZXR5cGUsIGxlbmd0aCk7CiAgIHJldHVybiBRbmlsOwpAQCAtMTkwLDYgKzE5NSwxMCBAQAogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJpbmdfbWV0aG9kX2lkLCAwKTsKIH0KIAorVkFMVUUgZGVmYXVsdF9yZWFkX2JpbmFyeShWQUxVRSBwcm90b2NvbCkgeworICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9iaW5hcnlfbWV0aG9kX2lkLCAwKTsKK30KKwogVkFMVUUgZGVmYXVsdF9yZWFkX3N0cnVjdF9iZWdpbihWQUxVRSBwcm90b2NvbCkgewogICByZXR1cm4gcmJfZnVuY2FsbChwcm90b2NvbCwgcmVhZF9zdHJ1Y3RfYmVnaW5fbWV0aG9kX2lkLCAwKTsKIH0KQEAgLTI4MSw3ICsyOTAsNyBAQAogCiAgICAgaWYgKFRZUEUodmFsdWUpID09IFRfQVJSQVkpIHsKICAgICAgIGl0ZW1zID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsgICAgICAgIAorICAgIH0gZWxzZSB7CiAgICAgICBpZiAocmJfY1NldCA9PSBDTEFTU19PRih2YWx1ZSkpIHsKICAgICAgICAgaXRlbXMgPSByYl9mdW5jYWxsKHZhbHVlLCBlbnRyaWVzX21ldGhvZF9pZCwgMCk7CiAgICAgICB9IGVsc2UgewpAQCAtMzI3LDcgKzMzNiwxMiBAQAogICB9IGVsc2UgaWYgKHR0eXBlID09IFRUWVBFX0RPVUJMRSkgewogICAgIGRlZmF1bHRfd3JpdGVfZG91YmxlKHByb3RvY29sLCB2YWx1ZSk7CiAgIH0gZWxzZSBpZiAodHR5cGUgPT0gVFRZUEVfU1RSSU5HKSB7Ci0gICAgZGVmYXVsdF93cml0ZV9zdHJpbmcocHJvdG9jb2wsIHZhbHVlKTsKKyAgICBWQUxVRSBpc19iaW5hcnkgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgYmluYXJ5X3N5bSk7CisgICAgaWYgKGlzX2JpbmFyeSAhPSBRdHJ1ZSkgeworICAgICAgZGVmYXVsdF93cml0ZV9zdHJpbmcocHJvdG9jb2wsIHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVmYXVsdF93cml0ZV9iaW5hcnkocHJvdG9jb2wsIHZhbHVlKTsKKyAgICB9CiAgIH0gZWxzZSBpZiAoSVNfQ09OVEFJTkVSKHR0eXBlKSkgewogICAgIHdyaXRlX2NvbnRhaW5lcih0dHlwZSwgZmllbGRfaW5mbywgdmFsdWUsIHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJVQ1QpIHsKQEAgLTQzMCw3ICs0NDQsMTIgQEAKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9JNjQpIHsKICAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfaTY0KHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJJTkcpIHsKLSAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfc3RyaW5nKHByb3RvY29sKTsKKyAgICBWQUxVRSBpc19iaW5hcnkgPSByYl9oYXNoX2FyZWYoZmllbGRfaW5mbywgYmluYXJ5X3N5bSk7CisgICAgaWYgKGlzX2JpbmFyeSAhPSBRdHJ1ZSkgeworICAgICAgcmVzdWx0ID0gZGVmYXVsdF9yZWFkX3N0cmluZyhwcm90b2NvbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IGRlZmF1bHRfcmVhZF9iaW5hcnkocHJvdG9jb2wpOworICAgIH0KICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9ET1VCTEUpIHsKICAgICByZXN1bHQgPSBkZWZhdWx0X3JlYWRfZG91YmxlKHByb3RvY29sKTsKICAgfSBlbHNlIGlmICh0dHlwZSA9PSBUVFlQRV9TVFJVQ1QpIHsKQEAgLTYwNyw3ICs2MjYsNyBAQAogICAgIGlmIChmaWVsZF90eXBlID09IHNwZWNpZmllZF90eXBlKSB7CiAgICAgICAvLyByZWFkIHRoZSB2YWx1ZQogICAgICAgVkFMVUUgbmFtZSA9IHJiX2hhc2hfYXJlZihmaWVsZF9pbmZvLCBuYW1lX3N5bSk7Ci0gICAgICByYl9pdl9zZXQoc2VsZiwgIkBzZXRmaWVsZCIsIElEMlNZTShyYl9pbnRlcm4oUlNUUklOR19QVFIobmFtZSkpKSk7CisgICAgICByYl9pdl9zZXQoc2VsZiwgIkBzZXRmaWVsZCIsIHJiX3N0cl9pbnRlcm4obmFtZSkpOwogICAgICAgcmJfaXZfc2V0KHNlbGYsICJAdmFsdWUiLCByZWFkX2FueXRoaW5nKHByb3RvY29sLCBmaWVsZF90eXBlLCBmaWVsZF9pbmZvKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHJiX2Z1bmNhbGwocHJvdG9jb2wsIHNraXBfbWV0aG9kX2lkLCAxLCBmaWVsZF90eXBlX3ZhbHVlKTsKQEAgLTYyNyw5ICs2NDYsNiBAQAogICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJ0b28gbWFueSBmaWVsZHMgaW4gdW5pb24hIik7CiAgIH0KIAotICAvLyByZWFkIGZpZWxkIGVuZAotICBkZWZhdWx0X3JlYWRfZmllbGRfZW5kKHByb3RvY29sKTsKLQogICAvLyByZWFkIHN0cnVjdCBlbmQKICAgZGVmYXVsdF9yZWFkX3N0cnVjdF9lbmQocHJvdG9jb2wpOwogCkBAIC02NTQsNiArNjcwLDEwIEBACiAKICAgVkFMVUUgZmllbGRfaW5mbyA9IHJiX2hhc2hfYXJlZihzdHJ1Y3RfZmllbGRzLCBmaWVsZF9pZCk7CiAKKyAgaWYoTklMX1AoZmllbGRfaW5mbykpIHsKKyAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKTsKKyAgfQorCiAgIFZBTFVFIHR0eXBlX3ZhbHVlID0gcmJfaGFzaF9hcmVmKGZpZWxkX2luZm8sIHR5cGVfc3ltKTsKICAgaW50IHR0eXBlID0gRklYMklOVCh0dHlwZV92YWx1ZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9yYi9leHQvdGhyaWZ0X25hdGl2ZS5jIGIvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKaW5kZXggZjA2NmQ2Yy4uMzQzMGI3YyAxMDA2NDQKLS0tIGEvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKKysrIGIvbGliL3JiL2V4dC90aHJpZnRfbmF0aXZlLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxzdHJ1Y3QuaD4KICNpbmNsdWRlIDxiaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQuaD4KICNpbmNsdWRlIDxjb21wYWN0X3Byb3RvY29sLmg+Ci0jaW5jbHVkZSA8cHJvdG9jb2wuaD4KICNpbmNsdWRlIDxtZW1vcnlfYnVmZmVyLmg+CiAKIC8vIGNhY2hlZCBjbGFzc2VzL21vZHVsZXMKQEAgLTU4LDE5ICs1NywyMCBAQAogSUQgd3JpdGVfaTY0X21ldGhvZF9pZDsKIElEIHdyaXRlX2RvdWJsZV9tZXRob2RfaWQ7CiBJRCB3cml0ZV9zdHJpbmdfbWV0aG9kX2lkOworSUQgd3JpdGVfYmluYXJ5X21ldGhvZF9pZDsKIElEIHdyaXRlX21hcF9iZWdpbl9tZXRob2RfaWQ7CiBJRCB3cml0ZV9tYXBfZW5kX21ldGhvZF9pZDsKIElEIHdyaXRlX2xpc3RfYmVnaW5fbWV0aG9kX2lkOwogSUQgd3JpdGVfbGlzdF9lbmRfbWV0aG9kX2lkOwogSUQgd3JpdGVfc2V0X2JlZ2luX21ldGhvZF9pZDsKIElEIHdyaXRlX3NldF9lbmRfbWV0aG9kX2lkOwotSUQgc2l6ZV9tZXRob2RfaWQ7CiBJRCByZWFkX2Jvb2xfbWV0aG9kX2lkOwogSUQgcmVhZF9ieXRlX21ldGhvZF9pZDsKIElEIHJlYWRfaTE2X21ldGhvZF9pZDsKIElEIHJlYWRfaTMyX21ldGhvZF9pZDsKIElEIHJlYWRfaTY0X21ldGhvZF9pZDsKIElEIHJlYWRfc3RyaW5nX21ldGhvZF9pZDsKK0lEIHJlYWRfYmluYXJ5X21ldGhvZF9pZDsKIElEIHJlYWRfZG91YmxlX21ldGhvZF9pZDsKIElEIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZDsKIElEIHJlYWRfbWFwX2VuZF9tZXRob2RfaWQ7CkBAIC04MywxNSArODMsMTIgQEAKIElEIHJlYWRfZmllbGRfYmVnaW5fbWV0aG9kX2lkOwogSUQgcmVhZF9maWVsZF9lbmRfbWV0aG9kX2lkOwogSUQga2V5c19tZXRob2RfaWQ7Ci1JRCBlbnRyaWVzX21ldGhvZF9pZDsgCi1JRCBuYW1lX21ldGhvZF9pZDsgCi1JRCBzb3J0X21ldGhvZF9pZDsKK0lEIGVudHJpZXNfbWV0aG9kX2lkOwogSUQgd3JpdGVfZmllbGRfc3RvcF9tZXRob2RfaWQ7CiBJRCBza2lwX21ldGhvZF9pZDsKIElEIHdyaXRlX21ldGhvZF9pZDsKIElEIHJlYWRfYWxsX21ldGhvZF9pZDsKIElEIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkOwotSUQgbmF0aXZlX3FtYXJrX21ldGhvZF9pZDsKIElEIGZvcmNlX2JpbmFyeV9lbmNvZGluZ19pZDsKIElEIGNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcl9pZDsKIElEIGNvbnZlcnRfdG9fc3RyaW5nX2lkOwpAQCAtMTA5LDYgKzEwNiw3IEBACiBWQUxVRSB2YWx1ZV9zeW07CiBWQUxVRSBlbGVtZW50X3N5bTsKIFZBTFVFIGNsYXNzX3N5bTsKK1ZBTFVFIGJpbmFyeV9zeW07CiBWQUxVRSBwcm90b2NvbF9leGNlcHRpb25fY2xhc3M7CiAKIHZvaWQgSW5pdF90aHJpZnRfbmF0aXZlKCkgewpAQCAtMTQ1LDE5ICsxNDMsMjAgQEAKICAgd3JpdGVfaTY0X21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfaTY0Iik7CiAgIHdyaXRlX2RvdWJsZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2RvdWJsZSIpOwogICB3cml0ZV9zdHJpbmdfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZV9zdHJpbmciKTsKKyAgd3JpdGVfYmluYXJ5X21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfYmluYXJ5Iik7CiAgIHdyaXRlX21hcF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX21hcF9iZWdpbiIpOwogICB3cml0ZV9tYXBfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfbWFwX2VuZCIpOwogICB3cml0ZV9saXN0X2JlZ2luX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfbGlzdF9iZWdpbiIpOwogICB3cml0ZV9saXN0X2VuZF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2xpc3RfZW5kIik7CiAgIHdyaXRlX3NldF9iZWdpbl9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX3NldF9iZWdpbiIpOwogICB3cml0ZV9zZXRfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigid3JpdGVfc2V0X2VuZCIpOwotICBzaXplX21ldGhvZF9pZCA9IHJiX2ludGVybigic2l6ZSIpOwogICByZWFkX2Jvb2xfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2Jvb2wiKTsKICAgcmVhZF9ieXRlX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9ieXRlIik7CiAgIHJlYWRfaTE2X21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9pMTYiKTsKICAgcmVhZF9pMzJfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2kzMiIpOwogICByZWFkX2k2NF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfaTY0Iik7CiAgIHJlYWRfc3RyaW5nX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9zdHJpbmciKTsKKyAgcmVhZF9iaW5hcnlfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2JpbmFyeSIpOwogICByZWFkX2RvdWJsZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfZG91YmxlIik7CiAgIHJlYWRfbWFwX2JlZ2luX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9tYXBfYmVnaW4iKTsKICAgcmVhZF9tYXBfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9tYXBfZW5kIik7ICAKQEAgLTE3MSwxNCArMTcwLDExIEBACiAgIHJlYWRfZmllbGRfZW5kX21ldGhvZF9pZCA9IHJiX2ludGVybigicmVhZF9maWVsZF9lbmQiKTsKICAga2V5c19tZXRob2RfaWQgPSByYl9pbnRlcm4oImtleXMiKTsKICAgZW50cmllc19tZXRob2RfaWQgPSByYl9pbnRlcm4oImVudHJpZXMiKTsKLSAgbmFtZV9tZXRob2RfaWQgPSByYl9pbnRlcm4oIm5hbWUiKTsKLSAgc29ydF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInNvcnQiKTsKICAgd3JpdGVfZmllbGRfc3RvcF9tZXRob2RfaWQgPSByYl9pbnRlcm4oIndyaXRlX2ZpZWxkX3N0b3AiKTsKICAgc2tpcF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInNraXAiKTsKICAgd3JpdGVfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJ3cml0ZSIpOwogICByZWFkX2FsbF9tZXRob2RfaWQgPSByYl9pbnRlcm4oInJlYWRfYWxsIik7CiAgIHJlYWRfaW50b19idWZmZXJfbWV0aG9kX2lkID0gcmJfaW50ZXJuKCJyZWFkX2ludG9fYnVmZmVyIik7Ci0gIG5hdGl2ZV9xbWFya19tZXRob2RfaWQgPSByYl9pbnRlcm4oIm5hdGl2ZT8iKTsKICAgZm9yY2VfYmluYXJ5X2VuY29kaW5nX2lkID0gcmJfaW50ZXJuKCJmb3JjZV9iaW5hcnlfZW5jb2RpbmciKTsKICAgY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyX2lkID0gcmJfaW50ZXJuKCJjb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIiKTsKICAgY29udmVydF90b19zdHJpbmdfaWQgPSByYl9pbnRlcm4oImNvbnZlcnRfdG9fc3RyaW5nIik7CkBAIC0xOTYsOCArMTkyLDggQEAKICAgdmFsdWVfc3ltID0gSUQyU1lNKHJiX2ludGVybigidmFsdWUiKSk7CiAgIGVsZW1lbnRfc3ltID0gSUQyU1lNKHJiX2ludGVybigiZWxlbWVudCIpKTsKICAgY2xhc3Nfc3ltID0gSUQyU1lNKHJiX2ludGVybigiY2xhc3MiKSk7CisgIGJpbmFyeV9zeW0gPSBJRDJTWU0ocmJfaW50ZXJuKCJiaW5hcnkiKSk7CiAKLSAgSW5pdF9wcm90b2NvbCgpOwogICBJbml0X3N0cnVjdCgpOwogICBJbml0X2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZCgpOwogICBJbml0X2NvbXBhY3RfcHJvdG9jb2woKTsKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQucmIKaW5kZXggZmI5ZTA0YS4uMGY1ODEyMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQucmIKQEAgLTEsNCArMSw0IEBACi0jIAorIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCkBAIC02LDE2ICs2LDE2IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCisjCiAjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAorIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQogIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgotIyAKKyMKICMgQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KICMgUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKICMgZGV0YWlscy4KQEAgLTI3LDYgKzI3LDcgQEAKIHJlcXVpcmUgJ3RocmlmdC9leGNlcHRpb25zJwogcmVxdWlyZSAndGhyaWZ0L3R5cGVzJwogcmVxdWlyZSAndGhyaWZ0L3Byb2Nlc3NvcicKK3JlcXVpcmUgJ3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3InCiByZXF1aXJlICd0aHJpZnQvY2xpZW50JwogcmVxdWlyZSAndGhyaWZ0L3N0cnVjdCcKIHJlcXVpcmUgJ3RocmlmdC91bmlvbicKQEAgLTQyLDEyICs0MywxNSBAQAogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZCcKIHJlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sJwogcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wnCityZXF1aXJlICd0aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wnCiAKICMgdHJhbnNwb3J0CiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3NvY2tldCcKK3JlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldCcKIHJlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldCcKK3JlcXVpcmUgJ3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0JwogcmVxdWlyZSAndGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQnCiByZXF1aXJlICd0aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydCcKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L2NsaWVudC5yYgppbmRleCA1YjMwZjAxLi42NGVmMDU5IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9jbGllbnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvY2xpZW50LnJiCkBAIC0xLDQgKzEsNCBAQAotIyAKKyMKICMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtNiwxNiArNiwxNiBAQAogIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAorIwogIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKKyMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KLSMgCisjCiAKIG1vZHVsZSBUaHJpZnQKICAgbW9kdWxlIENsaWVudApAQCAtMjcsNiArMjcsMTUgQEAKIAogICAgIGRlZiBzZW5kX21lc3NhZ2UobmFtZSwgYXJnc19jbGFzcywgYXJncyA9IHt9KQogICAgICAgQG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpDQUxMLCBAc2VxaWQpCisgICAgICBzZW5kX21lc3NhZ2VfYXJncyhhcmdzX2NsYXNzLCBhcmdzKQorICAgIGVuZAorCisgICAgZGVmIHNlbmRfb25ld2F5X21lc3NhZ2UobmFtZSwgYXJnc19jbGFzcywgYXJncyA9IHt9KQorICAgICAgQG9wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgTWVzc2FnZVR5cGVzOjpPTkVXQVksIEBzZXFpZCkKKyAgICAgIHNlbmRfbWVzc2FnZV9hcmdzKGFyZ3NfY2xhc3MsIGFyZ3MpCisgICAgZW5kCisKKyAgICBkZWYgc2VuZF9tZXNzYWdlX2FyZ3MoYXJnc19jbGFzcywgYXJncykKICAgICAgIGRhdGEgPSBhcmdzX2NsYXNzLm5ldwogICAgICAgYXJncy5lYWNoIGRvIHxrLCB2fAogICAgICAgICBkYXRhLnNlbmQoIiN7ay50b19zfT0iLCB2KQpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L2V4Y2VwdGlvbnMucmIKaW5kZXggMmNjYzdjZS4uNjhjYjllMCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvZXhjZXB0aW9ucy5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9leGNlcHRpb25zLnJiCkBAIC0zNyw2ICszNyw5IEBACiAgICAgTUlTU0lOR19SRVNVTFQgPSA1CiAgICAgSU5URVJOQUxfRVJST1IgPSA2CiAgICAgUFJPVE9DT0xfRVJST1IgPSA3CisgICAgSU5WQUxJRF9UUkFOU0ZPUk0gPSA4CisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDkKKyAgICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwCiAKICAgICBhdHRyX3JlYWRlciA6dHlwZQogCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm9jZXNzb3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczNGMwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb2Nlc3Nvci5yYgpAQCAtMCwwICsxLDc2IEBACisjIAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVxdWlyZSAndGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvcicKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sJworCittb2R1bGUgVGhyaWZ0CisgIGNsYXNzIE11bHRpcGxleGVkUHJvY2Vzc29yCisgICAgZGVmIGluaXRpYWxpemUKKyAgICAgIEBhY3R1YWxfcHJvY2Vzc29ycyA9IHt9CisgICAgZW5kCisgCisgICAgZGVmIHJlZ2lzdGVyX3Byb2Nlc3NvcihzZXJ2aWNlX25hbWUsIHByb2Nlc3NvcikKKyAgICAgIEBhY3R1YWxfcHJvY2Vzc29yc1tzZXJ2aWNlX25hbWVdID0gcHJvY2Vzc29yCisgICAgZW5kCisgCisgICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KQorICAgICAgbmFtZSwgdHlwZSwgc2VxaWQgPSBpcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4KKyAgICAgIGNoZWNrX3R5cGUodHlwZSkKKyAgICAgIGNoZWNrX3NlcGFyYXRvcihuYW1lKQorICAgICAgc2VydmljZV9uYW1lLCBtZXRob2QgPSBuYW1lLnNwbGl0KCc6JykKKyAgICAgIHByb2Nlc3NvcihzZXJ2aWNlX25hbWUpLnByb2Nlc3MoU3RvcmVkTWVzc2FnZVByb3RvY29sLm5ldyhpcHJvdCwgW21ldGhvZCwgdHlwZSwgc2VxaWRdKSwgb3Byb3QpCisgICAgZW5kCisKKyAgICBwcm90ZWN0ZWQKKworICAgIGRlZiBwcm9jZXNzb3Ioc2VydmljZV9uYW1lKQorICAgICAgaWYgQGFjdHVhbF9wcm9jZXNzb3JzLmhhc19rZXk/KHNlcnZpY2VfbmFtZSkKKyAgICAgICAgQGFjdHVhbF9wcm9jZXNzb3JzW3NlcnZpY2VfbmFtZV0KKyAgICAgIGVsc2UKKyAgICAgICAgcmFpc2UgVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiAje3NlcnZpY2VfbmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgI3tzZWxmLmNsYXNzLm5hbWV9I3JlZ2lzdGVyX3Byb2Nlc3Nvcj8iKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY2hlY2tfdHlwZSh0eXBlKQorICAgICAgdW5sZXNzIFtNZXNzYWdlVHlwZXM6OkNBTEwsIE1lc3NhZ2VUeXBlczo6T05FV0FZXS5pbmNsdWRlPyh0eXBlKQorICAgICAgICByYWlzZSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoJ1RoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8nKQorICAgICAgZW5kCisgICAgZW5kCisKKyAgICBkZWYgY2hlY2tfc2VwYXJhdG9yKG5hbWUpCisgICAgICBpZiBuYW1lLmNvdW50KCc6JykgPCAxCisgICAgICAgIHJhaXNlIFRocmlmdDo6RXhjZXB0aW9uLm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICN7bmFtZX0uIERpZCB5b3UgZm9yZ2V0IHRvIHVzZSBhIFRocmlmdDo6UHJvdG9jb2w6Ok11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKKyAgICAgIGVuZAorICAgIGVuZAorICBlbmQKKworICBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPCBCYXNlUHJvdG9jb2wKKworICAgIGluY2x1ZGUgUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCwgbWVzc2FnZV9iZWdpbikKKyAgICAgIHN1cGVyKHByb3RvY29sKQorICAgICAgQG1lc3NhZ2VfYmVnaW4gPSBtZXNzYWdlX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9tZXNzYWdlX2JlZ2luCisgICAgICBAbWVzc2FnZV9iZWdpbgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCmluZGV4IDVkOWUwYTEuLmNlMjFlMTIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKQEAgLTE3LDI1ICsxNywzNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMgCiAKK3JlcXVpcmUgJ2xvZ2dlcicKKwogbW9kdWxlIFRocmlmdAogICBtb2R1bGUgUHJvY2Vzc29yCi0gICAgZGVmIGluaXRpYWxpemUoaGFuZGxlcikKKyAgICBkZWYgaW5pdGlhbGl6ZShoYW5kbGVyLCBsb2dnZXI9bmlsKQogICAgICAgQGhhbmRsZXIgPSBoYW5kbGVyCisgICAgICBpZiBsb2dnZXIubmlsPworICAgICAgICBAbG9nZ2VyID0gTG9nZ2VyLm5ldyhTVERFUlIpCisgICAgICAgIEBsb2dnZXIubGV2ZWwgPSBMb2dnZXI6OldBUk4KKyAgICAgIGVsc2UKKyAgICAgICAgQGxvZ2dlciA9IGxvZ2dlcgorICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZWYgcHJvY2VzcyhpcHJvdCwgb3Byb3QpCiAgICAgICBuYW1lLCB0eXBlLCBzZXFpZCAgPSBpcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4KICAgICAgIGlmIHJlc3BvbmRfdG8/KCJwcm9jZXNzXyN7bmFtZX0iKQotICAgICAgICBzZW5kKCJwcm9jZXNzXyN7bmFtZX0iLCBzZXFpZCwgaXByb3QsIG9wcm90KQorICAgICAgICBiZWdpbgorICAgICAgICAgIHNlbmQoInByb2Nlc3NfI3tuYW1lfSIsIHNlcWlkLCBpcHJvdCwgb3Byb3QpCisgICAgICAgIHJlc2N1ZSA9PiBlCisgICAgICAgICAgeCA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgICAgICAgQGxvZ2dlci5kZWJ1ZyAiSW50ZXJuYWwgZXJyb3IgOiAje2UubWVzc2FnZX1cbiN7ZS5iYWNrdHJhY2Uuam9pbigiXG4iKX0iCisgICAgICAgICAgd3JpdGVfZXJyb3IoeCwgb3Byb3QsIG5hbWUsIHNlcWlkKQorICAgICAgICBlbmQKICAgICAgICAgdHJ1ZQogICAgICAgZWxzZQogICAgICAgICBpcHJvdC5za2lwKFR5cGVzOjpTVFJVQ1QpCiAgICAgICAgIGlwcm90LnJlYWRfbWVzc2FnZV9lbmQKICAgICAgICAgeCA9IEFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICdVbmtub3duIGZ1bmN0aW9uICcrbmFtZSkKLSAgICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgc2VxaWQpCi0gICAgICAgIHgud3JpdGUob3Byb3QpCi0gICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfZW5kCi0gICAgICAgIG9wcm90LnRyYW5zLmZsdXNoCisgICAgICAgIHdyaXRlX2Vycm9yKHgsIG9wcm90LCBuYW1lLCBzZXFpZCkKICAgICAgICAgZmFsc2UKICAgICAgIGVuZAogICAgIGVuZApAQCAtNTMsNSArNjQsMTIgQEAKICAgICAgIG9wcm90LndyaXRlX21lc3NhZ2VfZW5kCiAgICAgICBvcHJvdC50cmFucy5mbHVzaAogICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2Vycm9yKGVyciwgb3Byb3QsIG5hbWUsIHNlcWlkKQorICAgICAgb3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCBNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgc2VxaWQpCisgICAgICBlcnIud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZV9tZXNzYWdlX2VuZAorICAgICAgb3Byb3QudHJhbnMuZmx1c2gKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCmluZGV4IGE1YTE3NGQuLjVjNjkzZTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgpAQCAtMjgsNiArMjgsOCBAQAogICAgIE5FR0FUSVZFX1NJWkUgPSAyCiAgICAgU0laRV9MSU1JVCA9IDMKICAgICBCQURfVkVSU0lPTiA9IDQKKyAgICBOT1RfSU1QTEVNRU5URUQgPSA1CisgICAgREVQVEhfTElNSVQgPSA2CiAKICAgICBhdHRyX3JlYWRlciA6dHlwZQogCkBAIC0xMjUsNiArMTI3LDE2IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAKKyAgICAjIFdyaXRlcyBhIFRocmlmdCBCaW5hcnkgKFRocmlmdCBTdHJpbmcgd2l0aCBubyBlbmNvZGluZykuIEluIFJ1YnkgMS45KywgdGhlIFN0cmluZyBwYXNzZWQKKyAgICAjIHdpbGwgZm9yY2VkIGludG8gQklOQVJZIGVuY29kaW5nLgorICAgICMKKyAgICAjIGJ1ZiAtIFRoZSBTdHJpbmcgdG8gd3JpdGUuCisgICAgIworICAgICMgUmV0dXJucyBub3RoaW5nLgorICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGVuZAorCiAgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZApAQCAtMTg1LDIxICsxOTcsNjcgQEAKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKIAotICAgICMgUmVhZHMgYSBUaHJpZnQgU3RyaW5nLiBJbiBSdWJ5IDEuOSssIGFsbCBTdHJpbmcgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGFuIEVuY29kaW5nIG9mIFVURi04LgorICAgICMgUmVhZHMgYSBUaHJpZnQgU3RyaW5nLiBJbiBSdWJ5IDEuOSssIGFsbCBTdHJpbmdzIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhbiBFbmNvZGluZyBvZiBVVEYtOC4KICAgICAjCiAgICAgIyBSZXR1cm5zIGEgU3RyaW5nLgogICAgIGRlZiByZWFkX3N0cmluZwogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogCi0gICAgZGVmIHdyaXRlX2ZpZWxkKG5hbWUsIHR5cGUsIGZpZCwgdmFsdWUpCi0gICAgICB3cml0ZV9maWVsZF9iZWdpbihuYW1lLCB0eXBlLCBmaWQpCi0gICAgICB3cml0ZV90eXBlKHR5cGUsIHZhbHVlKQorICAgICMgUmVhZHMgYSBUaHJpZnQgQmluYXJ5IChUaHJpZnQgU3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLiBJbiBSdWJ5IDEuOSssIGFsbCBTdHJpbmdzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAjIHdpdGggYW4gRW5jb2Rpbmcgb2YgQklOQVJZLgorICAgICMKKyAgICAjIFJldHVybnMgYSBTdHJpbmcuCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZW5kCisKKyAgICAjIFdyaXRlcyBhIGZpZWxkIGJhc2VkIG9uIHRoZSBmaWVsZCBpbmZvcm1hdGlvbiwgZmllbGQgSUQgYW5kIHZhbHVlLgorICAgICMKKyAgICAjIGZpZWxkX2luZm8gLSBBIEhhc2ggY29udGFpbmluZyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZmllbGQ6CisgICAgIyAgICAgICAgICAgICAgOm5hbWUgICAtIFRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAjICAgICAgICAgICAgICA6dHlwZSAgIC0gVGhlIHR5cGUgb2YgdGhlIGZpZWxkLCB3aGljaCBtdXN0IGJlIGEgVGhyaWZ0OjpUeXBlcyBjb25zdGFudC4KKyAgICAjICAgICAgICAgICAgICA6YmluYXJ5IC0gQSBCb29sZWFuIGZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgVGhyaWZ0OjpUeXBlczo6U1RSSU5HIGlzIGEgYmluYXJ5IHN0cmluZyAoc3RyaW5nIHdpdGhvdXQgZW5jb2RpbmcpLgorICAgICMgZmlkICAgICAgICAtIFRoZSBJRCBvZiB0aGUgZmllbGQuCisgICAgIyB2YWx1ZSAgICAgIC0gVGhlIGZpZWxkJ3MgdmFsdWUgdG8gd3JpdGU7IG9iamVjdCB0eXBlIHZhcmllcyBiYXNlZCBvbiA6dHlwZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHdyaXRlX2ZpZWxkKCphcmdzKQorICAgICAgaWYgYXJncy5zaXplID09IDMKKyAgICAgICAgIyBoYW5kbGVzIHRoZSBkb2N1bWVudGVkIG1ldGhvZCBzaWduYXR1cmUgLSB3cml0ZV9maWVsZChmaWVsZF9pbmZvLCBmaWQsIHZhbHVlKQorICAgICAgICBmaWVsZF9pbmZvID0gYXJnc1swXQorICAgICAgICBmaWQgPSBhcmdzWzFdCisgICAgICAgIHZhbHVlID0gYXJnc1syXQorICAgICAgZWxzaWYgYXJncy5zaXplID09IDQKKyAgICAgICAgIyBoYW5kbGVzIHRoZSBkZXByZWNhdGVkIG1ldGhvZCBzaWduYXR1cmUgLSB3cml0ZV9maWVsZChuYW1lLCB0eXBlLCBmaWQsIHZhbHVlKQorICAgICAgICBmaWVsZF9pbmZvID0gezpuYW1lID0+IGFyZ3NbMF0sIDp0eXBlID0+IGFyZ3NbMV19CisgICAgICAgIGZpZCA9IGFyZ3NbMl0KKyAgICAgICAgdmFsdWUgPSBhcmdzWzNdCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IsICJ3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzICgje2FyZ3Muc2l6ZX0gZm9yIDMpIgorICAgICAgZW5kCisKKyAgICAgIHdyaXRlX2ZpZWxkX2JlZ2luKGZpZWxkX2luZm9bOm5hbWVdLCBmaWVsZF9pbmZvWzp0eXBlXSwgZmlkKQorICAgICAgd3JpdGVfdHlwZShmaWVsZF9pbmZvLCB2YWx1ZSkKICAgICAgIHdyaXRlX2ZpZWxkX2VuZAogICAgIGVuZAogCi0gICAgZGVmIHdyaXRlX3R5cGUodHlwZSwgdmFsdWUpCi0gICAgICBjYXNlIHR5cGUKKyAgICAjIFdyaXRlcyBhIGZpZWxkIHZhbHVlIGJhc2VkIG9uIHRoZSBmaWVsZCBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyBmaWVsZF9pbmZvIC0gQSBIYXNoIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb24gb2YgdGhlIGZpZWxkOgorICAgICMgICAgICAgICAgICAgIDp0eXBlICAgLSBUaGUgVGhyaWZ0OjpUeXBlcyBjb25zdGFudCB0aGF0IGRldGVybWluZXMgaG93IHRoZSB2YWx1ZSBpcyB3cml0dGVuLgorICAgICMgICAgICAgICAgICAgIDpiaW5hcnkgLSBBIEJvb2xlYW4gZmxhZyB0aGF0IGluZGljYXRlcyBpZiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcgaXMgYSBiaW5hcnkgc3RyaW5nIChzdHJpbmcgd2l0aG91dCBlbmNvZGluZykuCisgICAgIyB2YWx1ZSAgICAgIC0gVGhlIGZpZWxkJ3MgdmFsdWUgdG8gd3JpdGU7IG9iamVjdCB0eXBlIHZhcmllcyBiYXNlZCBvbiBmaWVsZF9pbmZvWzp0eXBlXS4KKyAgICAjCisgICAgIyBSZXR1cm5zIG5vdGhpbmcuCisgICAgZGVmIHdyaXRlX3R5cGUoZmllbGRfaW5mbywgdmFsdWUpCisgICAgICAjIGlmIGZpZWxkX2luZm8gaXMgYSBGaXhudW0sIGFzc3VtZSBpdCBpcyBhIFRocmlmdDo6VHlwZXMgY29uc3RhbnQKKyAgICAgICMgY29udmVydCBpdCBpbnRvIGEgZmllbGRfaW5mbyBIYXNoIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAgaWYgZmllbGRfaW5mby5pc19hPyBGaXhudW0KKyAgICAgICAgZmllbGRfaW5mbyA9IHs6dHlwZSA9PiBmaWVsZF9pbmZvfQorICAgICAgZW5kCisKKyAgICAgIGNhc2UgZmllbGRfaW5mb1s6dHlwZV0KICAgICAgIHdoZW4gVHlwZXM6OkJPT0wKICAgICAgICAgd3JpdGVfYm9vbCh2YWx1ZSkKICAgICAgIHdoZW4gVHlwZXM6OkJZVEUKQEAgLTIxMyw3ICsyNzEsMTEgQEAKICAgICAgIHdoZW4gVHlwZXM6Okk2NAogICAgICAgICB3cml0ZV9pNjQodmFsdWUpCiAgICAgICB3aGVuIFR5cGVzOjpTVFJJTkcKLSAgICAgICAgd3JpdGVfc3RyaW5nKHZhbHVlKQorICAgICAgICBpZiBmaWVsZF9pbmZvWzpiaW5hcnldCisgICAgICAgICAgd3JpdGVfYmluYXJ5KHZhbHVlKQorICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGVfc3RyaW5nKHZhbHVlKQorICAgICAgICBlbmQKICAgICAgIHdoZW4gVHlwZXM6OlNUUlVDVAogICAgICAgICB2YWx1ZS53cml0ZShzZWxmKQogICAgICAgZWxzZQpAQCAtMjIxLDggKzI4MywyMSBAQAogICAgICAgZW5kCiAgICAgZW5kCiAKLSAgICBkZWYgcmVhZF90eXBlKHR5cGUpCi0gICAgICBjYXNlIHR5cGUKKyAgICAjIFJlYWRzIGEgZmllbGQgdmFsdWUgYmFzZWQgb24gdGhlIGZpZWxkIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIGZpZWxkX2luZm8gLSBBIEhhc2ggY29udGFpbmluZyB0aGUgcGVydGluZW50IGRhdGEgdG8gd3JpdGU6CisgICAgIyAgICAgICAgICAgICAgOnR5cGUgICAtIFRoZSBUaHJpZnQ6OlR5cGVzIGNvbnN0YW50IHRoYXQgZGV0ZXJtaW5lcyBob3cgdGhlIHZhbHVlIGlzIHdyaXR0ZW4uCisgICAgIyAgICAgICAgICAgICAgOmJpbmFyeSAtIEEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcgaXMgYSBiaW5hcnkgc3RyaW5nIChzdHJpbmcgd2l0aG91dCBlbmNvZGluZykuCisgICAgIworICAgICMgUmV0dXJucyB0aGUgdmFsdWUgcmVhZDsgb2JqZWN0IHR5cGUgdmFyaWVzIGJhc2VkIG9uIGZpZWxkX2luZm9bOnR5cGVdLgorICAgIGRlZiByZWFkX3R5cGUoZmllbGRfaW5mbykKKyAgICAgICMgaWYgZmllbGRfaW5mbyBpcyBhIEZpeG51bSwgYXNzdW1lIGl0IGlzIGEgVGhyaWZ0OjpUeXBlcyBjb25zdGFudAorICAgICAgIyBjb252ZXJ0IGl0IGludG8gYSBmaWVsZF9pbmZvIEhhc2ggZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICBpZiBmaWVsZF9pbmZvLmlzX2E/IEZpeG51bQorICAgICAgICBmaWVsZF9pbmZvID0gezp0eXBlID0+IGZpZWxkX2luZm99CisgICAgICBlbmQKKworICAgICAgY2FzZSBmaWVsZF9pbmZvWzp0eXBlXQogICAgICAgd2hlbiBUeXBlczo6Qk9PTAogICAgICAgICByZWFkX2Jvb2wKICAgICAgIHdoZW4gVHlwZXM6OkJZVEUKQEAgLTIzNiw3ICszMTEsMTEgQEAKICAgICAgIHdoZW4gVHlwZXM6Okk2NAogICAgICAgICByZWFkX2k2NAogICAgICAgd2hlbiBUeXBlczo6U1RSSU5HCi0gICAgICAgIHJlYWRfc3RyaW5nCisgICAgICAgIGlmIGZpZWxkX2luZm9bOmJpbmFyeV0KKyAgICAgICAgICByZWFkX2JpbmFyeQorICAgICAgICBlbHNlCisgICAgICAgICAgcmVhZF9zdHJpbmcKKyAgICAgICAgZW5kCiAgICAgICBlbHNlCiAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgIGVuZApAQCAtMjkwLDExICszNjksMTkgQEAKICAgICAgICAgcmVhZF9saXN0X2VuZAogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICIje3RyYW5zLnRvX3N9IgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKaW5kZXggMjUyODI3Ni4uZDgyNzlkYiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgpAQCAtMTA3LDkgKzEwNywxMyBAQAogICAgIGVuZAogCiAgICAgZGVmIHdyaXRlX3N0cmluZyhzdHIpCi0gICAgICBzdHIgPSBCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKQotICAgICAgd3JpdGVfaTMyKHN0ci5sZW5ndGgpCi0gICAgICB0cmFucy53cml0ZShzdHIpCisgICAgICBidWYgPSBCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIoc3RyKQorICAgICAgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9iaW5hcnkoYnVmKQorICAgICAgd3JpdGVfaTMyKGJ1Zi5ieXRlc2l6ZSkKKyAgICAgIHRyYW5zLndyaXRlKGJ1ZikKICAgICBlbmQKIAogICAgIGRlZiByZWFkX21lc3NhZ2VfYmVnaW4KQEAgLTIxNCwxNiArMjE4LDI3IEBACiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9zdHJpbmcKLSAgICAgIHNpemUgPSByZWFkX2kzMgotICAgICAgYnVmZmVyID0gdHJhbnMucmVhZF9hbGwoc2l6ZSkKKyAgICAgIGJ1ZmZlciA9IHJlYWRfYmluYXJ5CiAgICAgICBCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpCiAgICAgZW5kCiAKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIHNpemUgPSByZWFkX2kzMgorICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiaW5hcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKaW5kZXggNzBlYTY1Mi4uMDliMDI2NCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgpAQCAtMzUsNSArMzUsMTMgQEAKICAgICAgICAgQmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgaWYgKGRlZmluZWQ/IEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgICJiaW5hcnktYWNjZWwiCisgICAgICBlbHNlCisgICAgICAgICJiaW5hcnkiCisgICAgICBlbmQKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCmluZGV4IDc1OGUxYWUuLjFmOWJkMzAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgpAQCAtMjQsNiArMjQsNyBAQAogICAgIFZFUlNJT04gPSAxCiAgICAgVkVSU0lPTl9NQVNLID0gMHgxZgogICAgIFRZUEVfTUFTSyA9IDB4RTAKKyAgICBUWVBFX0JJVFMgPSAweDA3CiAgICAgVFlQRV9TSElGVF9BTU9VTlQgPSA1CiAKICAgICBUU1RPUCA9IFsiIiwgVHlwZXM6OlNUT1AsIDBdCkBAIC0yMTAsOSArMjExLDEzIEBACiAgICAgZW5kCiAKICAgICBkZWYgd3JpdGVfc3RyaW5nKHN0cikKLSAgICAgIHN0ciA9IEJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpCi0gICAgICB3cml0ZV92YXJpbnQzMihzdHIubGVuZ3RoKQotICAgICAgQHRyYW5zLndyaXRlKHN0cikKKyAgICAgIGJ1ZiA9IEJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcihzdHIpCisgICAgICB3cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2JpbmFyeShidWYpCisgICAgICB3cml0ZV92YXJpbnQzMihidWYuYnl0ZXNpemUpCisgICAgICBAdHJhbnMud3JpdGUoYnVmKQogICAgIGVuZAogCiAgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgpAQCAtMjI3LDcgKzIzMiw3IEBACiAgICAgICAgIHJhaXNlIFByb3RvY29sRXhjZXB0aW9uLm5ldygiRXhwZWN0ZWQgdmVyc2lvbiAje1ZFUlNJT059IGJ1dCBnb3QgI3t2ZXJzaW9ufSIpOwogICAgICAgZW5kCiAgICAgICAKLSAgICAgIHR5cGUgPSAodmVyc2lvbl9hbmRfdHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiAweDAzCisgICAgICB0eXBlID0gKHZlcnNpb25fYW5kX3R5cGUgPj4gVFlQRV9TSElGVF9BTU9VTlQpICYgVFlQRV9CSVRTCiAgICAgICBzZXFpZCA9IHJlYWRfdmFyaW50MzIoKQogICAgICAgbWVzc2FnZU5hbWUgPSByZWFkX3N0cmluZygpCiAgICAgICBbbWVzc2FnZU5hbWUsIHR5cGUsIHNlcWlkXQpAQCAtMzMyLDEyICszMzcsMTkgQEAKICAgICBlbmQKIAogICAgIGRlZiByZWFkX3N0cmluZwotICAgICAgc2l6ZSA9IHJlYWRfdmFyaW50MzIoKQotICAgICAgYnVmZmVyID0gdHJhbnMucmVhZF9hbGwoc2l6ZSkKKyAgICAgIGJ1ZmZlciA9IHJlYWRfYmluYXJ5CiAgICAgICBCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyhidWZmZXIpCiAgICAgZW5kCisKKyAgICBkZWYgcmVhZF9iaW5hcnkKKyAgICAgIHNpemUgPSByZWFkX3ZhcmludDMyKCkKKyAgICAgIHRyYW5zLnJlYWRfYWxsKHNpemUpCisgICAgZW5kCiAgICAgCi0gICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJjb21wYWN0KCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorCiAgICAgcHJpdmF0ZQogICAgIAogICAgICMgCkBAIC00MjMsNSArNDM1LDkgQEAKICAgICBkZWYgZ2V0X3Byb3RvY29sKHRyYW5zKQogICAgICAgQ29tcGFjdFByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImNvbXBhY3QiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgppbmRleCA2ZjhkMWQxLi45MWU3NGU0IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKQEAgLTE4LDIxICsxOCw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIyAKIAotQEBrSlNPTk9iamVjdFN0YXJ0ID0gJ3snCi1AQGtKU09OT2JqZWN0RW5kID0gJ30nCi1AQGtKU09OQXJyYXlTdGFydCA9ICdbJwotQEBrSlNPTkFycmF5RW5kID0gJ10nCi1AQGtKU09OTmV3bGluZSA9ICdcbicKLUBAa0pTT05FbGVtU2VwYXJhdG9yID0gJywnCi1AQGtKU09OUGFpclNlcGFyYXRvciA9ICc6JwotQEBrSlNPTkJhY2tzbGFzaCA9ICdcXCcKLUBAa0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIicKLQotQEBrVGhyaWZ0VmVyc2lvbjEgPSAxCi0KLUBAa1RocmlmdE5hbiA9ICJOYU4iCi1AQGtUaHJpZnRJbmZpbml0eSA9ICJJbmZpbml0eSIKLUBAa1RocmlmdE5lZ2F0aXZlSW5maW5pdHkgPSAiLUluZmluaXR5IgorcmVxdWlyZSAnYmFzZTY0JwogCiBtb2R1bGUgVGhyaWZ0CiAgIGNsYXNzIExvb2thaGVhZFJlYWRlcgpAQCAtNjYsNiArNTIsNyBAQAogICAjIGltcGxlbWVudGF0aW9ucwogICAjCiAgIGNsYXNzIEpTT05Db250ZXh0CisgICAgQEBrSlNPTkVsZW1TZXBhcmF0b3IgPSAnLCcKICAgICAjCiAgICAgIyBXcml0ZSBjb250ZXh0IGRhdGEgdG8gdGhlIHRyYW5zLiBEZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuCiAgICAgIwpAQCAtODksNiArNzYsOCBAQAogCiAgICMgQ29udGV4dCBjbGFzcyBmb3Igb2JqZWN0IG1lbWJlciBrZXktdmFsdWUgcGFpcnMKICAgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDwgSlNPTkNvbnRleHQKKyAgICBAQGtKU09OUGFpclNlcGFyYXRvciA9ICc6JworCiAgICAgZGVmIGluaXRpYWxpemUKICAgICAgIEBmaXJzdCA9IHRydWUKICAgICAgIEBjb2xvbiA9IHRydWUKQEAgLTE0Niw2ICsxMzUsMjEgQEAKICAgZW5kCiAKICAgY2xhc3MgSnNvblByb3RvY29sIDwgQmFzZVByb3RvY29sCisKKyAgICBAQGtKU09OT2JqZWN0U3RhcnQgPSAneycKKyAgICBAQGtKU09OT2JqZWN0RW5kID0gJ30nCisgICAgQEBrSlNPTkFycmF5U3RhcnQgPSAnWycKKyAgICBAQGtKU09OQXJyYXlFbmQgPSAnXScKKyAgICBAQGtKU09OTmV3bGluZSA9ICdcbicKKyAgICBAQGtKU09OQmFja3NsYXNoID0gJ1xcJworICAgIEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIgPSAnIicKKworICAgIEBAa1RocmlmdFZlcnNpb24xID0gMQorCisgICAgQEBrVGhyaWZ0TmFuID0gIk5hTiIKKyAgICBAQGtUaHJpZnRJbmZpbml0eSA9ICJJbmZpbml0eSIKKyAgICBAQGtUaHJpZnROZWdhdGl2ZUluZmluaXR5ID0gIi1JbmZpbml0eSIKKwogICAgIGRlZiBpbml0aWFsaXplKHRyYW5zKQogICAgICAgc3VwZXIodHJhbnMpCiAgICAgICBAY29udGV4dCA9IEpTT05Db250ZXh0Lm5ldwpAQCAtMzA3LDcgKzMxMSw3IEBACiAgICAgZGVmIHdyaXRlX2pzb25fYmFzZTY0KHN0cikKICAgICAgIEBjb250ZXh0LndyaXRlKHRyYW5zKQogICAgICAgdHJhbnMud3JpdGUoQEBrSlNPTlN0cmluZ0RlbGltaXRlcikKLSAgICAgIHdyaXRlX2pzb25fc3RyaW5nKFtzdHJdLnBhY2soIm0iKSkKKyAgICAgIHRyYW5zLndyaXRlKEJhc2U2NC5zdHJpY3RfZW5jb2RlNjQoc3RyKSkKICAgICAgIHRyYW5zLndyaXRlKEBAa0pTT05TdHJpbmdEZWxpbWl0ZXIpCiAgICAgZW5kCiAKQEAgLTMyOSw3ICszMzMsNyBAQAogICAgICMgIk5hTiIgb3IgIkluZmluaXR5IiBvciAiLUluZmluaXR5Ii4KICAgICBkZWYgd3JpdGVfanNvbl9kb3VibGUobnVtKQogICAgICAgQGNvbnRleHQud3JpdGUodHJhbnMpCi0gICAgICAjIE5vcm1hbGl6ZSBvdXRwdXQgb2YgYm9vc3Q6OmxleGljYWxfY2FzdCBmb3IgTmFOcyBhbmQgSW5maW5pdGllcworICAgICAgIyBOb3JtYWxpemUgb3V0cHV0IG9mIHRocmlmdDo6dG9fc3RyaW5nIGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCiAgICAgICBzcGVjaWFsID0gZmFsc2U7CiAgICAgICBpZiAobnVtLm5hbj8pCiAgICAgICAgIHNwZWNpYWwgPSB0cnVlOwpAQCAtNTA0LDEzICs1MDgsMTMgQEAKICAgICBkZWYgcmVhZF9qc29uX3N0cmluZyhza2lwQ29udGV4dCA9IGZhbHNlKQogICAgICAgIyBUaGlzIHN0cmluZydzIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBlbGVtZW50cyBpbiBlc2NhcGVfY2hhcl92YWxzLgogICAgICAgIyBJIGRvbid0IGhhdmUgJy8nIG9uIHRoaXMgbGlzdCBldmVuIHRob3VnaCBpdCBhcHBlYXJzIG9uIHd3dy5qc29uLm9yZyAtLQotICAgICAgIyBpdCBpcyBub3QgaW4gdGhlIFJGQwotICAgICAgZXNjYXBlX2NoYXJzID0gIlwiXFxiZm5ydCIKKyAgICAgICMgaXQgaXMgbm90IGluIHRoZSBSRkMgLT4gaXQgaXMuIFNlZSBSRkMgNDYyNworICAgICAgZXNjYXBlX2NoYXJzID0gIlwiXFwvYmZucnQiCiAKICAgICAgICMgVGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgbXVzdCBtYXRjaCB1cCB3aXRoIHRoZSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluCiAgICAgICAjIGVzY2FwZV9jaGFycwogICAgICAgZXNjYXBlX2NoYXJfdmFscyA9IFsKLSAgICAgICAgJyInLCAnXFwnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLAorICAgICAgICAiXCIiLCAiXFwiLCAiXC8iLCAiXGIiLCAiXGYiLCAiXG4iLCAiXHIiLCAiXHQiLAogICAgICAgXQogCiAgICAgICBpZiAhc2tpcENvbnRleHQKQEAgLTU0Myw3ICs1NDcsMTUgQEAKIAogICAgICMgUmVhZHMgYSBibG9jayBvZiBiYXNlNjQgY2hhcmFjdGVycywgZGVjb2RpbmcgaXQsIGFuZCByZXR1cm5zIHZpYSBzdHIKICAgICBkZWYgcmVhZF9qc29uX2Jhc2U2NAotICAgICAgcmVhZF9qc29uX3N0cmluZy51bnBhY2soIm0iKVswXQorICAgICAgc3RyID0gcmVhZF9qc29uX3N0cmluZworICAgICAgbSA9IHN0ci5sZW5ndGggJSA0CisgICAgICBpZiBtICE9IDAKKyAgICAgICAgIyBBZGQgbWlzc2luZyBwYWRkaW5nCisgICAgICAgICg0IC0gbSkudGltZXMgZG8KKyAgICAgICAgICBzdHIgKz0gJz0nCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBCYXNlNjQuc3RyaWN0X2RlY29kZTY0KHN0cikKICAgICBlbmQKIAogICAgICMgUmVhZHMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzLCBzdG9wcGluZyBhdCB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgbm90CkBAIC03MTcsNiArNzI5LDcgQEAKIAogICAgIGRlZiByZWFkX3NldF9iZWdpbgogICAgICAgcmVhZF9qc29uX2FycmF5X3N0YXJ0CisgICAgICBbZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZShyZWFkX2pzb25fc3RyaW5nKSwgcmVhZF9qc29uX2ludGVnZXJdCiAgICAgZW5kCiAKICAgICBkZWYgcmVhZF9zZXRfZW5kCkBAIC03NTUsMTEgKzc2OCwxOSBAQAogICAgIGRlZiByZWFkX2JpbmFyeQogICAgICAgcmVhZF9qc29uX2Jhc2U2NAogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBKc29uUHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KHRyYW5zKQogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uIgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQyOGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIKQEAgLTAsMCArMSw0NCBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUgJ3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3InCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgTXVsdGlwbGV4ZWRQcm90b2NvbCA8IEJhc2VQcm90b2NvbAorCisgICAgaW5jbHVkZSBQcm90b2NvbERlY29yYXRvcgorCisgICAgZGVmIGluaXRpYWxpemUocHJvdG9jb2wsIHNlcnZpY2VfbmFtZSkKKyAgICAgIHN1cGVyKHByb3RvY29sKQorICAgICAgQHNlcnZpY2VfbmFtZSA9IHNlcnZpY2VfbmFtZQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBjYXNlIHR5cGUKKyAgICAgIHdoZW4gTWVzc2FnZVR5cGVzOjpDQUxMLCBNZXNzYWdlVHlwZXM6Ok9ORVdBWQorICAgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbigiI3tAc2VydmljZV9uYW1lfToje25hbWV9IiwgdHlwZSwgc2VxaWQpCisgICAgICBlbHNlCisgICAgICAgIEBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKG5hbWUsIHR5cGUsIHNlcWlkKQorICAgICAgZW5kIAorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAibXVsdGlwbGV4ZWQoI3tAc2VydmljZV9uYW1lPUBwcm90b2NvbC50b19zfSkiCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9wcm90b2NvbF9kZWNvcmF0b3IucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlM2MxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL3Byb3RvY29sX2RlY29yYXRvci5yYgpAQCAtMCwwICsxLDE5NCBAQAorIyAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK21vZHVsZSBUaHJpZnQKKyAgbW9kdWxlIFByb3RvY29sRGVjb3JhdG9yCisKKyAgICBkZWYgaW5pdGlhbGl6ZShwcm90b2NvbCkKKyAgICAgIEBwcm90b2NvbCA9IHByb3RvY29sCisgICAgZW5kCisKKyAgICBkZWYgdHJhbnMKKyAgICAgIEBwcm90b2NvbC50cmFucworICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfYmVnaW4obmFtZSwgdHlwZSwgc2VxaWQpCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21lc3NhZ2VfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zdHJ1Y3RfYmVnaW4obmFtZSkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJ1Y3RfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfc3RydWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX2JlZ2luKG5hbWUsIHR5cGUsIGlkKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX2VuZAorICAgICAgQHByb3RvY29sLndyaXRlX2ZpZWxkX2VuZAorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2ZpZWxkX3N0b3AKKyAgICAgIEBwcm90b2NvbC53cml0ZV9maWVsZF9zdG9wCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbWFwX2JlZ2luKGt0eXBlLCB2dHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tYXBfYmVnaW4oa3R5cGUsIHZ0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX21hcF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9tYXBfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfbGlzdF9iZWdpbihldHlwZSwgc2l6ZSkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9saXN0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2xpc3RfZW5kCisgICAgICBAcHJvdG9jb2wud3JpdGVfbGlzdF9lbmQKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zZXRfYmVnaW4oZXR5cGUsIHNpemUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfc2V0X2JlZ2luKGV0eXBlLCBzaXplKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX3NldF9lbmQKKyAgICAgIEBwcm90b2NvbC53cml0ZV9zZXRfZW5kCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYm9vbChib29sKQorICAgICAgQHByb3RvY29sLndyaXRlX2Jvb2woYm9vbCkKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9ieXRlKGJ5dGUpCisgICAgICBAcHJvdG9jb2wud3JpdGVfYnl0ZShieXRlKQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2kxNihpMTYpCisgICAgICBAcHJvdG9jb2wud3JpdGVfaTE2KGkxNikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9pMzIoaTMyKQorICAgICAgQHByb3RvY29sLndyaXRlX2kzMihpMzIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfaTY0KGk2NCkKKyAgICAgIEBwcm90b2NvbC53cml0ZV9pNjQoaTY0KQorICAgIGVuZAorCisgICAgZGVmIHdyaXRlX2RvdWJsZShkdWIpCisgICAgICBAcHJvdG9jb2wud3JpdGVfZG91YmxlKGR1YikKKyAgICBlbmQKKworICAgIGRlZiB3cml0ZV9zdHJpbmcoc3RyKQorICAgICAgQHByb3RvY29sLndyaXRlX3N0cmluZyhzdHIpCisgICAgZW5kCisKKyAgICBkZWYgd3JpdGVfYmluYXJ5KGJ1ZikKKyAgICAgIEBwcm90b2NvbC53cml0ZV9iaW5hcnkoYnVmKQorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9iZWdpbgorICAgICAgQHByb3RvY29sLnJlYWRfbWVzc2FnZV9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWVzc2FnZV9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX21lc3NhZ2VfZW5kCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJ1Y3RfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cnVjdF9iZWdpbgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc3RydWN0X2VuZAorICAgICAgQHByb3RvY29sLnJlYWRfc3RydWN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfZmllbGRfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9maWVsZF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfbWFwX2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9tYXBfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX21hcF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX21hcF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfYmVnaW4KKyAgICAgIEBwcm90b2NvbC5yZWFkX2xpc3RfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX2xpc3RfZW5kCisgICAgICBAcHJvdG9jb2wucmVhZF9saXN0X2VuZAorICAgIGVuZAorCisgICAgZGVmIHJlYWRfc2V0X2JlZ2luCisgICAgICBAcHJvdG9jb2wucmVhZF9zZXRfYmVnaW4KKyAgICBlbmQKKworICAgIGRlZiByZWFkX3NldF9lbmQKKyAgICAgIEBwcm90b2NvbC5yZWFkX3NldF9lbmQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2Jvb2wKKyAgICAgIEBwcm90b2NvbC5yZWFkX2Jvb2wKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2J5dGUKKyAgICAgIEBwcm90b2NvbC5yZWFkX2J5dGUKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2kxNgorICAgICAgQHByb3RvY29sLnJlYWRfaTE2CisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9pMzIKKyAgICAgIEBwcm90b2NvbC5yZWFkX2kzMgorICAgIGVuZAorCisgICAgZGVmIHJlYWRfaTY0CisgICAgICBAcHJvdG9jb2wucmVhZF9pNjQKKyAgICBlbmQKKworICAgIGRlZiByZWFkX2RvdWJsZQorICAgICAgQHByb3RvY29sLnJlYWRfZG91YmxlCisgICAgZW5kCisKKyAgICBkZWYgcmVhZF9zdHJpbmcKKyAgICAgIEBwcm90b2NvbC5yZWFkX3N0cmluZworICAgIGVuZAorCisgICAgZGVmIHJlYWRfYmluYXJ5CisgICAgICBAcHJvdG9jb2wucmVhZF9iaW5hcnkKKyAgICBlbmQKKyAgZW5kCitlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKaW5kZXggMWVlMTIxMy4uYWE0ZDA5YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgpAQCAtMjYsNiArMjYsMTIgQEAKICAgICAgIEBwcm90b2NvbF9mYWN0b3J5ID0gcHJvdG9jb2xfZmFjdG9yeSA/IHByb3RvY29sX2ZhY3RvcnkgOiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKICAgICBlbmQKIAotICAgIGRlZiBzZXJ2ZTsgbmlsOyBlbmQKKyAgICBkZWYgc2VydmUKKyAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAic2VydmVyKCN7QHByb3RvY29sX2ZhY3RvcnkudG9fc30oI3tAdHJhbnNwb3J0X2ZhY3RvcnkudG9fc30oI3tAc2VydmVyX3RyYW5zcG9ydC50b19zfSkpKSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9tb25ncmVsX2h0dHBfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKaW5kZXggODRlYWNmMC4uZGUzNTRjOCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXIucmIKQEAgLTIwLDYgKzIwLDcgQEAKIHJlcXVpcmUgJ21vbmdyZWwnCiAKICMjIFN0aWNrcyBhIHNlcnZpY2Ugb24gYSBVUkwsIHVzaW5nIG1vbmdyZWwgdG8gZG8gdGhlIEhUVFAgd29yaworIyA8Yj5ERVBSRUNBVEVEOjwvYj4gUGxlYXNlIHVzZSA8dHQ+VGhyaWZ0OjpUaGluSFRUUFNlcnZlcjwvdHQ+IGluc3RlYWQuCiBtb2R1bGUgVGhyaWZ0CiAgIGNsYXNzIE1vbmdyZWxIVFRQU2VydmVyIDwgQmFzZVNlcnZlcgogICAgIGNsYXNzIEhhbmRsZXIgPCBNb25ncmVsOjpIdHRwSGFuZGxlcgpAQCAtNDMsNiArNDQsNyBAQAogICAgIGVuZAogCiAgICAgZGVmIGluaXRpYWxpemUocHJvY2Vzc29yLCBvcHRzPXt9KQorICAgICAgS2VybmVsLndhcm4gIltERVBSRUNBVElPTiBXQVJOSU5HXSBgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlcmAgaXMgZGVwcmVjYXRlZC4gIFBsZWFzZSB1c2UgYFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXJgIGluc3RlYWQuIgogICAgICAgcG9ydCA9IG9wdHNbOnBvcnRdIHx8IDgwCiAgICAgICBpcCA9IG9wdHNbOmlwXSB8fCAiMC4wLjAuMCIKICAgICAgIHBhdGggPSBvcHRzWzpwYXRoXSB8fCAiIgpkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3NpbXBsZV9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgppbmRleCAyMWU4NjU5Li45MDVmZTliIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYgpAQCAtMzksNSArMzksOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJzaW1wbGUoI3tzdXBlci50b19zfSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aGluX2h0dHBfc2VydmVyLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODFjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlci5yYgpAQCAtMCwwICsxLDkxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAncmFjaycKK3JlcXVpcmUgJ3RoaW4nCisKKyMjCisjIFdyYXBzIHRoZSBUaGluIHdlYiBzZXJ2ZXIgdG8gcHJvdmlkZSBhIFRocmlmdCBzZXJ2ZXIgb3ZlciBIVFRQLgorbW9kdWxlIFRocmlmdAorICBjbGFzcyBUaGluSFRUUFNlcnZlciA8IEJhc2VTZXJ2ZXIKKworICAgICMjCisgICAgIyBBY2NlcHRzIGEgVGhyaWZ0OjpQcm9jZXNzb3IKKyAgICAjIE9wdGlvbnMgaW5jbHVkZToKKyAgICAjICogOnBvcnQKKyAgICAjICogOmlwCisgICAgIyAqIDpwYXRoCisgICAgIyAqIDpwcm90b2NvbF9mYWN0b3J5CisgICAgZGVmIGluaXRpYWxpemUocHJvY2Vzc29yLCBvcHRpb25zPXt9KQorICAgICAgcG9ydCA9IG9wdGlvbnNbOnBvcnRdIHx8IDgwCisgICAgICBpcCA9IG9wdGlvbnNbOmlwXSB8fCAiMC4wLjAuMCIKKyAgICAgIHBhdGggPSBvcHRpb25zWzpwYXRoXSB8fCAiLyIKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBvcHRpb25zWzpwcm90b2NvbF9mYWN0b3J5XSB8fCBCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CisgICAgICBhcHAgPSBSYWNrQXBwbGljYXRpb24uZm9yKHBhdGgsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgICAgIEBzZXJ2ZXIgPSBUaGluOjpTZXJ2ZXIubmV3KGlwLCBwb3J0LCBhcHApCisgICAgZW5kCisKKyAgICAjIworICAgICMgU3RhcnRzIHRoZSBzZXJ2ZXIKKyAgICBkZWYgc2VydmUKKyAgICAgIEBzZXJ2ZXIuc3RhcnQKKyAgICBlbmQKKworICAgIGNsYXNzIFJhY2tBcHBsaWNhdGlvbgorCisgICAgICBUSFJJRlRfSEVBREVSID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IgorCisgICAgICBkZWYgc2VsZi5mb3IocGF0aCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICBSYWNrOjpCdWlsZGVyLm5ldyBkbworICAgICAgICAgIHVzZSBSYWNrOjpDb21tb25Mb2dnZXIKKyAgICAgICAgICB1c2UgUmFjazo6U2hvd0V4Y2VwdGlvbnMKKyAgICAgICAgICB1c2UgUmFjazo6TGludAorICAgICAgICAgIG1hcCBwYXRoIGRvCisgICAgICAgICAgICBydW4gbGFtYmRhIHsgfGVudnwKKyAgICAgICAgICAgICAgcmVxdWVzdCA9IFJhY2s6OlJlcXVlc3QubmV3KGVudikKKyAgICAgICAgICAgICAgaWYgUmFja0FwcGxpY2F0aW9uLnZhbGlkX3RocmlmdF9yZXF1ZXN0PyhyZXF1ZXN0KQorICAgICAgICAgICAgICAgIFJhY2tBcHBsaWNhdGlvbi5zdWNjZXNzZnVsX3JlcXVlc3QocmVxdWVzdCwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUmFja0FwcGxpY2F0aW9uLmZhaWxlZF9yZXF1ZXN0CisgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgfQorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5zdWNjZXNzZnVsX3JlcXVlc3QocmFja19yZXF1ZXN0LCBwcm9jZXNzb3IsIHByb3RvY29sX2ZhY3RvcnkpCisgICAgICAgIHJlc3BvbnNlID0gUmFjazo6UmVzcG9uc2UubmV3KFtdLCAyMDAsIHsnQ29udGVudC1UeXBlJyA9PiBUSFJJRlRfSEVBREVSfSkKKyAgICAgICAgdHJhbnNwb3J0ID0gSU9TdHJlYW1UcmFuc3BvcnQubmV3IHJhY2tfcmVxdWVzdC5ib2R5LCByZXNwb25zZQorICAgICAgICBwcm90b2NvbCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0X3Byb3RvY29sIHRyYW5zcG9ydAorICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyBwcm90b2NvbCwgcHJvdG9jb2wKKyAgICAgICAgcmVzcG9uc2UKKyAgICAgIGVuZAorCisgICAgICBkZWYgc2VsZi5mYWlsZWRfcmVxdWVzdAorICAgICAgICBSYWNrOjpSZXNwb25zZS5uZXcoWydOb3QgRm91bmQnXSwgNDA0LCB7J0NvbnRlbnQtVHlwZScgPT4gVEhSSUZUX0hFQURFUn0pCisgICAgICBlbmQKKworICAgICAgZGVmIHNlbGYudmFsaWRfdGhyaWZ0X3JlcXVlc3Q/KHJhY2tfcmVxdWVzdCkKKyAgICAgICAgcmFja19yZXF1ZXN0LnBvc3Q/ICYmIHJhY2tfcmVxdWVzdC5lbnZbIkNPTlRFTlRfVFlQRSJdID09IFRIUklGVF9IRUFERVIKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCmluZGV4IDhjZWM4MDUuLmJiNzU0YWQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgpAQCAtNzEsNSArNzEsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRwb29sKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKaW5kZXggYTJjOTE3Yy4uODhlZTE4MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCkBAIC00Myw1ICs0Myw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInRocmVhZGVkKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0LnJiCmluZGV4IDM1MTI0NjMuLmRmOWQ2NTYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3QucmIKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgd3JpdGVfY29udGFpbmVyKG9wcm90LCB2YWx1ZSwgZmllbGRfaW5mbykKICAgICAgICAgICAgIG9wcm90LndyaXRlX2ZpZWxkX2VuZAogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wcm90LndyaXRlX2ZpZWxkKG5hbWUsIHR5cGUsIGZpZCwgdmFsdWUpCisgICAgICAgICAgICBvcHJvdC53cml0ZV9maWVsZChmaWVsZF9pbmZvLCBmaWQsIHZhbHVlKQogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc3RydWN0X3VuaW9uLnJiCmluZGV4IDRlMGFmY2YuLmUyMWIzOWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3N0cnVjdF91bmlvbi5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zdHJ1Y3RfdW5pb24ucmIKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICBlbmQKICAgICAgICAgaXByb3QucmVhZF9zZXRfZW5kCiAgICAgICBlbHNlCi0gICAgICAgIHZhbHVlID0gaXByb3QucmVhZF90eXBlKGZpZWxkWzp0eXBlXSkKKyAgICAgICAgdmFsdWUgPSBpcHJvdC5yZWFkX3R5cGUoZmllbGQpCiAgICAgICBlbmQKICAgICAgIHZhbHVlCiAgICAgZW5kCkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICAgIGlmIGlzX2NvbnRhaW5lcj8gZmllbGRbOnR5cGVdCiAgICAgICAgIHdyaXRlX2NvbnRhaW5lcihvcHJvdCwgdmFsdWUsIGZpZWxkKQogICAgICAgZWxzZQotICAgICAgICBvcHJvdC53cml0ZV90eXBlKGZpZWxkWzp0eXBlXSwgdmFsdWUpCisgICAgICAgIG9wcm90LndyaXRlX3R5cGUoZmllbGQsIHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCmluZGV4IDY4YzVhZjAuLjAxMDU0NjMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgpAQCAtMzQsNCArMzQsNCBAQAogICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCmluZGV4IDg3OTAzMjYuLjk3ZTU5MzUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKQEAgLTk5LDExICs5OSwxOSBAQAogICAgIGFsaWFzX21ldGhvZCA6PDwsIDp3cml0ZQogCiAgICAgZGVmIGZsdXNoOyBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYmFzZSIKKyAgICBlbmQKICAgZW5kCiAgIAogICBjbGFzcyBCYXNlVHJhbnNwb3J0RmFjdG9yeQogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zKQogICAgICAgcmV0dXJuIHRyYW5zCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKaW5kZXggNzgxZDNjNi4uNGZlOWM0MSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCkBAIC0xMDQsMTEgKzEwNCwxOSBAQAogICAgICAgCiAgICAgICBAdHJhbnNwb3J0LmZsdXNoCiAgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkKCN7QHRyYW5zcG9ydC50b19zfSkiCisgICAgZW5kCiAgIGVuZAogCiAgIGNsYXNzIEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSA8IEJhc2VUcmFuc3BvcnRGYWN0b3J5CiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFuc3BvcnQpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJidWZmZXJlZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9mcmFtZWRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKaW5kZXggZDgwNmNlMC4uOTUzMTc3OCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIKQEAgLTk5LDYgKzk5LDEwIEBACiAgICAgICBAd2J1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgZW5kCiAKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCgje0B0cmFuc3BvcnQudG9fc30pIgorICAgIGVuZAorCiAgICAgcHJpdmF0ZQogCiAgICAgZGVmIHJlYWRfZnJhbWUKQEAgLTExMyw1ICsxMTcsOSBAQAogICAgIGRlZiBnZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkKICAgICAgIHJldHVybiBGcmFtZWRUcmFuc3BvcnQubmV3KHRyYW5zcG9ydCkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImZyYW1lZCIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCmluZGV4IDA3Zjc0YmMuLjVjMWRkNWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgpAQCAtMjAsMTYgKzIwLDE4IEBACiAKIHJlcXVpcmUgJ25ldC9odHRwJwogcmVxdWlyZSAnbmV0L2h0dHBzJworcmVxdWlyZSAnb3BlbnNzbCcKIHJlcXVpcmUgJ3VyaScKIHJlcXVpcmUgJ3N0cmluZ2lvJwogCiBtb2R1bGUgVGhyaWZ0CiAgIGNsYXNzIEhUVFBDbGllbnRUcmFuc3BvcnQgPCBCYXNlVHJhbnNwb3J0CiAKLSAgICBkZWYgaW5pdGlhbGl6ZSh1cmwpCisgICAgZGVmIGluaXRpYWxpemUodXJsLCBvcHRzID0ge30pCiAgICAgICBAdXJsID0gVVJJIHVybAogICAgICAgQGhlYWRlcnMgPSB7J0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0J30KICAgICAgIEBvdXRidWYgPSBCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgorICAgICAgQHNzbF92ZXJpZnlfbW9kZSA9IG9wdHMuZmV0Y2goOnNzbF92ZXJpZnlfbW9kZSwgT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUikKICAgICBlbmQKIAogICAgIGRlZiBvcGVuPzsgdHJ1ZSBlbmQKQEAgLTQzLDExICs0NSwxNyBAQAogICAgIGRlZiBmbHVzaAogICAgICAgaHR0cCA9IE5ldDo6SFRUUC5uZXcgQHVybC5ob3N0LCBAdXJsLnBvcnQKICAgICAgIGh0dHAudXNlX3NzbCA9IEB1cmwuc2NoZW1lID09ICdodHRwcycKKyAgICAgIGh0dHAudmVyaWZ5X21vZGUgPSBAc3NsX3ZlcmlmeV9tb2RlIGlmIEB1cmwuc2NoZW1lID09ICdodHRwcycKICAgICAgIHJlc3AgPSBodHRwLnBvc3QoQHVybC5yZXF1ZXN0X3VyaSwgQG91dGJ1ZiwgQGhlYWRlcnMpCiAgICAgICBkYXRhID0gcmVzcC5ib2R5CiAgICAgICBkYXRhID0gQnl0ZXMuZm9yY2VfYmluYXJ5X2VuY29kaW5nKGRhdGEpCiAgICAgICBAaW5idWYgPSBTdHJpbmdJTy5uZXcgZGF0YQorICAgIGVuc3VyZQogICAgICAgQG91dGJ1ZiA9IEJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJAe3NlbGYudXJsfSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9pb19zdHJlYW1fdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKaW5kZXggZTNjODM3OS4uY2NlYzY4ZiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIKQEAgLTM1LDUgKzM1LDggQEAKICAgICBkZWYgd3JpdGUoYnVmKTsgQG91dHB1dC53cml0ZShCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcoYnVmKSkgZW5kCiAgICAgZGVmIGNsb3NlOyBAaW5wdXQuY2xvc2U7IEBvdXRwdXQuY2xvc2UgZW5kCiAgICAgZGVmIHRvX2lvOyBAaW5wdXQgZW5kICMgd2UncmUgYXNzdW1pbmcgdGhpcyBpcyB1c2VkIGluIGEgSU8uc2VsZWN0IGZvciByZWFkaW5nCisgICAgZGVmIHRvX3MKKyAgICAgICJpb3N0cmVhbShpbnB1dD0je0BpbnB1dC50b19zfSxvdXRwdXQ9I3tAb3V0cHV0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgppbmRleCBhZDVhZDg1Li40NjllYTczIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCkBAIC0xMjEsNSArMTIxLDkgQEAKICAgICAgIGVuZAogICAgICAgb3V0LmpvaW4oIiAiKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAibWVtb3J5IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgppbmRleCA3ZmViOWFiLi41MDAwMjMyIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYgpAQCAtNTksNSArNTksMTAgQEAKICAgICBlbmQKIAogICAgIGFsaWFzIHRvX2lvIGhhbmRsZQorCisgICAgZGVmIHRvX3MKKyAgICAgICJzb2NrZXQoI3tAaG9zdH06I3tAcG9ydH0pIgorICAgIGVuZAorCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgppbmRleCAyYjdjYTA5Li5mNWU2ZjNiIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKQEAgLTMzLDI2ICszMywyOCBAQAogICAgIGF0dHJfYWNjZXNzb3IgOmhhbmRsZSwgOnRpbWVvdXQKIAogICAgIGRlZiBvcGVuCi0gICAgICBiZWdpbgotICAgICAgICBhZGRyaW5mbyA9IDo6U29ja2V0OjpnZXRhZGRyaW5mbyhAaG9zdCwgQHBvcnQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5maXJzdAotICAgICAgICBAaGFuZGxlID0gOjpTb2NrZXQubmV3KGFkZHJpbmZvWzRdLCA6OlNvY2tldDo6U09DS19TVFJFQU0sIDApCi0gICAgICAgIEBoYW5kbGUuc2V0c29ja29wdCg6OlNvY2tldDo6SVBQUk9UT19UQ1AsIDo6U29ja2V0OjpUQ1BfTk9ERUxBWSwgMSkKLSAgICAgICAgc29ja2FkZHIgPSA6OlNvY2tldC5zb2NrYWRkcl9pbihhZGRyaW5mb1sxXSwgYWRkcmluZm9bM10pCisgICAgICBmb3IgYWRkcmluZm8gaW4gOjpTb2NrZXQ6OmdldGFkZHJpbmZvKEBob3N0LCBAcG9ydCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pIGRvCiAgICAgICAgIGJlZ2luCi0gICAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrKHNvY2thZGRyKQotICAgICAgICByZXNjdWUgRXJybm86OkVJTlBST0dSRVNTCi0gICAgICAgICAgdW5sZXNzIElPLnNlbGVjdChuaWwsIFsgQGhhbmRsZSBdLCBuaWwsIEB0aW1lb3V0KQotICAgICAgICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ29ubmVjdGlvbiB0aW1lb3V0IHRvICN7QGRlc2N9IikKLSAgICAgICAgICBlbmQKKyAgICAgICAgICBzb2NrZXQgPSA6OlNvY2tldC5uZXcoYWRkcmluZm9bNF0sIDo6U29ja2V0OjpTT0NLX1NUUkVBTSwgMCkKKyAgICAgICAgICBzb2NrZXQuc2V0c29ja29wdCg6OlNvY2tldDo6SVBQUk9UT19UQ1AsIDo6U29ja2V0OjpUQ1BfTk9ERUxBWSwgMSkKKyAgICAgICAgICBzb2NrYWRkciA9IDo6U29ja2V0LnNvY2thZGRyX2luKGFkZHJpbmZvWzFdLCBhZGRyaW5mb1szXSkKICAgICAgICAgICBiZWdpbgotICAgICAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrKHNvY2thZGRyKQotICAgICAgICAgIHJlc2N1ZSBFcnJubzo6RUlTQ09OTgorICAgICAgICAgICAgc29ja2V0LmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCisgICAgICAgICAgcmVzY3VlIEVycm5vOjpFSU5QUk9HUkVTUworICAgICAgICAgICAgdW5sZXNzIElPLnNlbGVjdChuaWwsIFsgc29ja2V0IF0sIG5pbCwgQHRpbWVvdXQpCisgICAgICAgICAgICAgIG5leHQKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgYmVnaW4KKyAgICAgICAgICAgICAgc29ja2V0LmNvbm5lY3Rfbm9uYmxvY2soc29ja2FkZHIpCisgICAgICAgICAgICByZXNjdWUgRXJybm86OkVJU0NPTk4KKyAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAorICAgICAgICAgIHJldHVybiBAaGFuZGxlID0gc29ja2V0CisgICAgICAgIHJlc2N1ZSBTdGFuZGFyZEVycm9yID0+IGUKKyAgICAgICAgICBuZXh0CiAgICAgICAgIGVuZAotICAgICAgICBAaGFuZGxlCi0gICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlCi0gICAgICAgIHJhaXNlIFRyYW5zcG9ydEV4Y2VwdGlvbi5uZXcoVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBjb25uZWN0IHRvICN7QGRlc2N9OiAje2V9IikKICAgICAgIGVuZAorICAgICAgcmFpc2UgVHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IGNvbm5lY3QgdG8gI3tAZGVzY306ICN7ZX0iKQogICAgIGVuZAogCiAgICAgZGVmIG9wZW4/CkBAIC0xMzIsOCArMTM0LDEwIEBACiAgICAgICBAaGFuZGxlID0gbmlsCiAgICAgZW5kCiAKLSAgICBkZWYgdG9faW8KLSAgICAgIEBoYW5kbGUKKyAgICBhbGlhcyB0b19pbyBoYW5kbGUKKworICAgIGRlZiB0b19zCisgICAgICAic29ja2V0KCN7QGhvc3R9OiN7QHBvcnR9KSIKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJkNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCkBAIC0wLDAgKzEsNDEgQEAKKyMgZW5jb2Rpbmc6IGFzY2lpLThiaXQKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzb2NrZXQnCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgU1NMU2VydmVyU29ja2V0IDwgU2VydmVyU29ja2V0CisgICAgZGVmIGluaXRpYWxpemUoaG9zdF9vcl9wb3J0LCBwb3J0ID0gbmlsLCBzc2xfY29udGV4dCA9IG5pbCkKKyAgICAgIHN1cGVyKGhvc3Rfb3JfcG9ydCwgcG9ydCkKKyAgICAgIEBzc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CisgICAgZW5kCisKKyAgICBhdHRyX2FjY2Vzc29yIDpzc2xfY29udGV4dAorCisgICAgZGVmIGxpc3RlbgorICAgICAgc29ja2V0ID0gVENQU2VydmVyLm5ldyhAaG9zdCwgQHBvcnQpCisgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTZXJ2ZXIubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQorICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI5NmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIKQEAgLTAsMCArMSw1MSBAQAorIyBlbmNvZGluZzogYXNjaWktOGJpdAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK21vZHVsZSBUaHJpZnQKKyAgY2xhc3MgU1NMU29ja2V0IDwgU29ja2V0CisgICAgZGVmIGluaXRpYWxpemUoaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCB0aW1lb3V0PW5pbCwgc3NsX2NvbnRleHQ9bmlsKQorICAgICAgc3VwZXIoaG9zdCwgcG9ydCwgdGltZW91dCkKKyAgICAgIEBzc2xfY29udGV4dCA9IHNzbF9jb250ZXh0CisgICAgZW5kCisKKyAgICBhdHRyX2FjY2Vzc29yIDpzc2xfY29udGV4dAorCisgICAgZGVmIG9wZW4KKyAgICAgIHNvY2tldCA9IHN1cGVyCisgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQorICAgICAgYmVnaW4KKyAgICAgICAgQGhhbmRsZS5jb25uZWN0X25vbmJsb2NrCisgICAgICAgIEBoYW5kbGUucG9zdF9jb25uZWN0aW9uX2NoZWNrKEBob3N0KQorICAgICAgICBAaGFuZGxlCisgICAgICByZXNjdWUgSU86OldhaXRSZWFkYWJsZQorICAgICAgICBJTy5zZWxlY3QoWyBAaGFuZGxlIF0sIG5pbCwgbmlsLCBAdGltZW91dCkKKyAgICAgICAgcmV0cnkKKyAgICAgIHJlc2N1ZSBJTzo6V2FpdFdyaXRhYmxlCisgICAgICAgIElPLnNlbGVjdChuaWwsIFsgQGhhbmRsZSBdLCBuaWwsIEB0aW1lb3V0KQorICAgICAgICByZXRyeQorICAgICAgcmVzY3VlIFN0YW5kYXJkRXJyb3IgPT4gZQorICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCisgICAgICBlbmQKKyAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNzbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IGExMzVkMjUuLjA1N2QxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgpAQCAtNTYsNSArNTYsOSBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKaW5kZXggOGY2OTJlNC4uNWRmZmQ1OSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgpAQCAtMzYsNSArMzYsOSBAQAogICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgb3BlbiBVTklYIHNvY2tldCBhdCAje0BwYXRofSIpCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC91bmlvbi5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiCmluZGV4IGE3MDU4ZjIuLjQ5MGM1NWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3VuaW9uLnJiCkBAIC04NywxMiArODcsOSBAQAogICAgIGVuZAogCiAgICAgZGVmID09KG90aGVyKQotICAgICAgb3RoZXIgIT0gbmlsICYmIEBzZXRmaWVsZCA9PSBvdGhlci5nZXRfc2V0X2ZpZWxkICYmIEB2YWx1ZSA9PSBvdGhlci5nZXRfdmFsdWUKKyAgICAgIG90aGVyLmVxdWFsPyhzZWxmKSB8fCBvdGhlci5pbnN0YW5jZV9vZj8oc2VsZi5jbGFzcykgJiYgQHNldGZpZWxkID09IG90aGVyLmdldF9zZXRfZmllbGQgJiYgQHZhbHVlID09IG90aGVyLmdldF92YWx1ZQogICAgIGVuZAotCi0gICAgZGVmIGVxbD8ob3RoZXIpCi0gICAgICBzZWxmLmNsYXNzID09IG90aGVyLmNsYXNzICYmIHNlbGYgPT0gb3RoZXIKLSAgICBlbmQKKyAgICBhbGlhc19tZXRob2QgOmVxbD8sIDo9PQogCiAgICAgZGVmIGhhc2gKICAgICAgIFtzZWxmLmNsYXNzLm5hbWUsIEBzZXRmaWVsZCwgQHZhbHVlXS5oYXNoCkBAIC0xNzYsNCArMTczLDQgQEAKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvQmFzZVNlcnZpY2UudGhyaWZ0IGIvbGliL3JiL3NwZWMvQmFzZVNlcnZpY2UudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2QzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9CYXNlU2VydmljZS50aHJpZnQKQEAgLTAsMCArMSwyNyBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBCYXNlCisKK3N0cnVjdCBIZWxsbyB7CisgIDE6IHN0cmluZyBncmVldGluZyA9ICJoZWxsbyB3b3JsZCIKK30KKworc2VydmljZSBCYXNlU2VydmljZSB7CisgIEhlbGxvIGdyZWV0aW5nKDE6Ym9vbCBlbmdsaXNoKQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvRXh0ZW5kZWRTZXJ2aWNlLnRocmlmdCBiL2xpYi9yYi9zcGVjL0V4dGVuZGVkU2VydmljZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2YjcwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL0V4dGVuZGVkU2VydmljZS50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK25hbWVzcGFjZSByYiBFeHRlbmRlZAorCitpbmNsdWRlICJCYXNlU2VydmljZS50aHJpZnQiCisKK3NlcnZpY2UgRXh0ZW5kZWRTZXJ2aWNlIGV4dGVuZHMgQmFzZVNlcnZpY2UuQmFzZVNlcnZpY2UgeworICB2b2lkIHBpbmcoKQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvUmVmZXJlbmNlZC50aHJpZnQgYi9saWIvcmIvc3BlYy9SZWZlcmVuY2VkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGYxODNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvUmVmZXJlbmNlZC50aHJpZnQKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworbmFtZXNwYWNlIHJiIE90aGVyTmFtZXNwYWNlCisKK2VudW0gU29tZUVudW0geworICBPTkUKKyAgVFdPCit9CmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQgYi9saWIvcmIvc3BlYy9UaHJpZnROYW1lc3BhY2VkU3BlYy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMjg4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL1RocmlmdE5hbWVzcGFjZWRTcGVjLnRocmlmdApAQCAtMCwwICsxLDUzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCituYW1lc3BhY2UgcmIgTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2UKKworaW5jbHVkZSAiUmVmZXJlbmNlZC50aHJpZnQiCisKK3N0cnVjdCBIZWxsbyB7CisgIDE6IHN0cmluZyBncmVldGluZyA9ICJoZWxsbyB3b3JsZCIKK30KKworc2VydmljZSBOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlIHsKKyAgSGVsbG8gZ3JlZXRpbmcoMTpib29sIGVuZ2xpc2gpCisgIGJvb2wgYmxvY2soKQorICBvbmV3YXkgdm9pZCB1bmJsb2NrKDE6aTMyIG4pCisgIG9uZXdheSB2b2lkIHNodXRkb3duKCkKKyAgdm9pZCBzbGVlcCgxOmRvdWJsZSBzZWNvbmRzKQorfQpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCmluZGV4IGMwZjljZmMuLmVjYTkzNmIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKQEAgLTIyLDM0ICsyMiw0NiBAQAogZGVzY3JpYmUgJ0Jhc2VQcm90b2NvbCcgZG8KIAogICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgQHRyYW5zID0gbW9jaygiTW9ja1RyYW5zcG9ydCIpCisgICAgQHRyYW5zID0gZG91YmxlKCJNb2NrVHJhbnNwb3J0IikKICAgICBAcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhAdHJhbnMpCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVByb3RvY29sIGRvCiAgICAgIyBtb3N0IG9mIHRoZSBtZXRob2RzIGFyZSBzdHVicywgc28gd2UgY2FuIGlnbm9yZSB0aGVtCiAKLSAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KLSAgICAgIEBwcm90LnRyYW5zLnNob3VsZCBlcWwoQHRyYW5zKQorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJ0cmFucyIpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHdyaXRlIG91dCBhIGZpZWxkIG5pY2VseSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCgndHlwZScsICd2YWx1ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50cmFucykudG8gZXFsKEB0cmFucykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IGEgZmllbGQgbmljZWx5IChkZXByZWNhdGVkIHdyaXRlX2ZpZWxkIHNpZ25hdHVyZSknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnfSwgJ3ZhbHVlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX2ZpZWxkKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcsICd2YWx1ZScpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHdyaXRlIG91dCB0aGUgZGlmZmVyZW50IHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoJ2Jvb2wnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoJ2kxNicpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ3N0cmluZycpLm9yZGVyZWQKLSAgICAgIHN0cnVjdCA9IG1vY2soJ1N0cnVjdCcpCi0gICAgICBzdHJ1Y3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCisgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdmaWVsZCcsICd0eXBlJywgJ2ZpZCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnLCA6YmluYXJ5ID0+IGZhbHNlfSwgJ3ZhbHVlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIEBwcm90LndyaXRlX2ZpZWxkKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAnZmlkJywgJ3ZhbHVlJykKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgd3JpdGVfdHlwZSBzaWduYXR1cmUpJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBzdHJ1Y3QgPSBkb3VibGUoJ1N0cnVjdCcpCisgICAgICBleHBlY3Qoc3RydWN0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MLCAnYm9vbCcpCiAgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUsICdieXRlJykKICAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAnZG91YmxlJykKQEAgLTYwLDE4ICs3Miw0NCBAQAogICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIHN0cnVjdCkKICAgICAgICMgYWxsIG90aGVyIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQKICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVE9QLCBUaHJpZnQ6OlR5cGVzOjpWT0lELCBUaHJpZnQ6OlR5cGVzOjpNQVAsIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVF0uZWFjaCBkbyB8dHlwZXwKLSAgICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfdHlwZSh0eXBlLCB0eXBlLnRvX3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX3R5cGUodHlwZSwgdHlwZS50b19zKSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBlbmQKICAgICBlbmQKIAotICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgZGlmZmVyZW50IHR5cGVzIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICBpdCAnc2hvdWxkIHdyaXRlIG91dCB0aGUgZGlmZmVyZW50IHR5cGVzJyBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKCdib29sJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoJ2RvdWJsZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKCdpMTYnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pNjQpLndpdGgoJ2k2NCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdzdHJpbmcnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2JpbmFyeSkud2l0aCgnYmluYXJ5Jykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAnYm9vbCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgJ2J5dGUnKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgJ2RvdWJsZScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAnaTE2JykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICdpMzInKQorICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgJ2k2NCcpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCAnc3RyaW5nJykKKyAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklORywgOmJpbmFyeSA9PiB0cnVlfSwgJ2JpbmFyeScpCisgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCBzdHJ1Y3QpCisgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8CisgICAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IHR5cGV9LCB0eXBlLnRvX3MpIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgcmVhZF90eXBlIHNpZ25hdHVyZSknIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKICAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCT09MKQogICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkJZVEUpCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6STE2KQpAQCAtODAsMTkgKzExOCw0NCBAQAogICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkKICAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCiAgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCi0gICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1RdLmVhY2ggZG8gfHR5cGV8Ci0gICAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfdHlwZSh0eXBlKSB9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgW1RocmlmdDo6VHlwZXM6OlNUT1AsIFRocmlmdDo6VHlwZXM6OlZPSUQsIFRocmlmdDo6VHlwZXM6Ok1BUCwKKyAgICAgICBUaHJpZnQ6OlR5cGVzOjpTRVQsIFRocmlmdDo6VHlwZXM6OkxJU1QsIFRocmlmdDo6VHlwZXM6OlNUUlVDVF0uZWFjaCBkbyB8dHlwZXwKKyAgICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF90eXBlKHR5cGUpIH0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICAgIGVuZAorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMnIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9iaW5hcnkpLm9yZGVyZWQKKyAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0pCisgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9KQorICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDpiaW5hcnkgPT4gdHJ1ZX0pCisgICAgICAjIGFsbCBvdGhlciB0eXBlcyBhcmUgbm90IGltcGxlbWVudGVkCisgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RPUCwgVGhyaWZ0OjpUeXBlczo6Vk9JRCwgVGhyaWZ0OjpUeXBlczo6TUFQLAorICAgICAgIFRocmlmdDo6VHlwZXM6OlNFVCwgVGhyaWZ0OjpUeXBlczo6TElTVCwgVGhyaWZ0OjpUeXBlczo6U1RSVUNUXS5lYWNoIGRvIHx0eXBlfAorICAgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IHR5cGV9KSB9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCB0aGUgYmFzaWMgdHlwZXMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCiAgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkJPT0wpCiAgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkJZVEUpCiAgICAgICBAcHJvdC5za2lwKFRocmlmdDo6VHlwZXM6OkkxNikKQEAgLTEwNSw0NyArMTY4LDQ3IEBACiAKICAgICBpdCAic2hvdWxkIHNraXAgc3RydWN0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNCkudGltZXMuYW5kX3JldHVybigKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAogICAgICAgICBbJ2ZpZWxkIDEnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAogICAgICAgICBbJ2ZpZWxkIDInLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAogICAgICAgICBbJ2ZpZWxkIDMnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDNdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdKQogICAgICAgIyBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmV4YWN0bHkoMikudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIG1hcHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDFdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbInNvbWVfc3RydWN0Il0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIG5pbF0pOwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oWyJzb21lX3N0cnVjdCJdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgbmlsXSk7CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKICAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6Ok1BUCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzZXRzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6Okk2NCwgOV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STY0LCA5XSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQuZXhhY3RseSg5KS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9lbmQpCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTRVQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbGlzdHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgMTFdKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkLmV4YWN0bHkoMTEpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgMTFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZC5leGFjdGx5KDExKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TElTVCkKICAgICBlbmQKICAgZW5kCkBAIC0xNTMsNyArMjE2LDExIEBACiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciIgZG8KICAgICAgICMgcmV0dXJuaW5nIG5pbCBzaW5jZSBQcm90b2NvbCBpcyBqdXN0IGFuIGFic3RyYWN0IGNsYXNzCi0gICAgICBsYW1iZGEge1RocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSl9LnNob3VsZCByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgICAgZXhwZWN0IHtUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgppbmRleCA0MTk2NTcyLi5kMmY2MGFhIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKQEAgLTI0LDEwNSArMjQsMTE5IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBtYWtlIHR5cGUgYWNjZXNzaWJsZSIgZG8KICAgICAgIGV4YyA9IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOLCAibXNnIikKLSAgICAgIGV4Yy50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOCi0gICAgICBleGMubWVzc2FnZS5zaG91bGQgPT0gIm1zZyIKKyAgICAgIGV4cGVjdChleGMudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTikKKyAgICAgIGV4cGVjdChleGMubWVzc2FnZSkudG8gZXEoIm1zZyIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgcmVhZCB0aGUgc3BlY2lmaWVkIHNpemUiIGRvCiAgICAgICB0cmFuc3BvcnQgPSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubmV3Ci0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoNDApLm9yZGVyZWQuYW5kX3JldHVybigiMTAgbGV0dGVycyIpCi0gICAgICB0cmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMzApLm9yZGVyZWQuYW5kX3JldHVybigiZmlmdGVlbiBsZXR0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNSkub3JkZXJlZC5hbmRfcmV0dXJuKCJtb3JlIGNoYXJhY3RlcnMiKQotICAgICAgdHJhbnNwb3J0LnJlYWRfYWxsKDQwKS5zaG91bGQgPT0gIjEwIGxldHRlcnNmaWZ0ZWVuIGxldHRlcnNtb3JlIGNoYXJhY3RlcnMiCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDQwKS5vcmRlcmVkLmFuZF9yZXR1cm4oIjEwIGxldHRlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgzMCkub3JkZXJlZC5hbmRfcmV0dXJuKCJmaWZ0ZWVuIGxldHRlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNSkub3JkZXJlZC5hbmRfcmV0dXJuKCJtb3JlIGNoYXJhY3RlcnMiKQorICAgICAgZXhwZWN0KHRyYW5zcG9ydC5yZWFkX2FsbCg0MCkpLnRvIGVxKCIxMCBsZXR0ZXJzZmlmdGVlbiBsZXR0ZXJzbW9yZSBjaGFyYWN0ZXJzIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3R1YiBvdXQgdGhlIHJlc3Qgb2YgdGhlIG1ldGhvZHMiIGRvCiAgICAgICAjIGNhbid0IHRlc3QgZm9yIHN0dWJiaW5lc3MsIHNvIGp1c3QgbWFrZSBzdXJlIHRoZXkncmUgZGVmaW5lZAogICAgICAgWzpvcGVuPywgOm9wZW4sIDpjbG9zZSwgOnJlYWQsIDp3cml0ZSwgOmZsdXNoXS5lYWNoIGRvIHxzeW18Ci0gICAgICAgIFRocmlmdDo6QmFzZVRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pKS50byBiZV90cnV0aHkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbGlhcyA8PCB0byB3cml0ZSIgZG8KLSAgICAgIFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOjw8KS5zaG91bGQgPT0gVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6d3JpdGUpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6PDwpKS50byBlcShUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDp3cml0ZSkpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydC5uZXcudG9fcykudG8gZXEoImJhc2UiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQgZG8KICAgICBpdCAic2hvdWxkIHN0dWIgb3V0IGl0cyBtZXRob2RzIiBkbwogICAgICAgWzpsaXN0ZW4sIDphY2NlcHQsIDpjbG9zZV0uZWFjaCBkbyB8c3ltfAotICAgICAgICBUaHJpZnQ6OkJhc2VTZXJ2ZXJUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkuc2hvdWxkIGJlX3RydWUKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKSkudG8gYmVfdHJ1dGh5CiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSB0cmFuc3BvcnQgaXQncyBnaXZlbiIgZG8KLSAgICAgIHRyYW5zcG9ydCA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkuc2hvdWxkIGVxbCh0cmFuc3BvcnQpCisgICAgICB0cmFuc3BvcnQgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpKS50byBlcWwodHJhbnNwb3J0KQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQgZG8KKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKS50b19zKS50byBlcSgiYnVmZmVyZWQobW9jaykiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggZXZlcnl0aGluZyBidXQgd3JpdGUvZmx1c2gvcmVhZCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuPykub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4/IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkICMgZnJvbSB0aGUgY2xvc2UKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5vcGVuPy5zaG91bGQgPT0gIisgb3Blbj8iCi0gICAgICBidHJhbnMub3Blbi5zaG91bGQgPT0gIisgb3BlbiIKLSAgICAgIGJ0cmFucy5jbG9zZS5zaG91bGQgPT0gIisgY2xvc2UiCisgICAgICBleHBlY3QoYnRyYW5zLm9wZW4/KS50byBlcSgiKyBvcGVuPyIpCisgICAgICBleHBlY3QoYnRyYW5zLm9wZW4pLnRvIGVxKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KGJ0cmFucy5jbG9zZSkudG8gZXEoIisgY2xvc2UiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgcmVhZHMgaW4gY2h1bmtzIG9mICN7VGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVJ9IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVIpLmFuZF9yZXR1cm4oImxvcnVtIGlwc3VtIGRvbG9yIGVtZXQiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDo6REVGQVVMVF9CVUZGRVIpLmFuZF9yZXR1cm4oImxvcnVtIGlwc3VtIGRvbG9yIGVtZXQiKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImxvcnVtICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiaXBzdW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJkb2xvciAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImVtZXQiCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJsb3J1bSAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiaXBzdW0gIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImRvbG9yICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJlbWV0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHdyaXRlcyBhbmQgc2VuZCB0aGVtIG9uIGZsdXNoIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBidHJhbnMud3JpdGUoInR3by8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0aHJlZS8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpLm9yZGVyZWQKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKS5vcmRlcmVkCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb25seSBzZW5kIGJ1ZmZlcmVkIGRhdGEgb25jZSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGJ0cmFucy53cml0ZSgidGhyZWUvIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKQotICAgICAgdHJhbnMuc3R1YiEoOmZsdXNoKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgib25lL3R3by90aHJlZS8iKQorICAgICAgYWxsb3codHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgICAjIE5vdGhpbmcgdG8gZmx1c2ggd2l0aCBubyBkYXRhCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZmx1c2ggb24gY2xvc2UiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoYnRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucy5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3Qgd3JpdGUgdG8gc29ja2V0IGlmIHRoZXJlJ3Mgbm8gZGF0YSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLmZsdXNoCiAgICAgZW5kCkBAIC0xMzAsODAgKzE0NCw5MCBAQAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCB3cmFwIHRoZSBnaXZlbiB0cmFuc3BvcnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIGJ0cmFucyA9IG1vY2soIkJ1ZmZlcmVkVHJhbnNwb3J0IikKLSAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCi0gICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykuc2hvdWxkID09IGJ0cmFucworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBidHJhbnMgPSBkb3VibGUoIkJ1ZmZlcmVkVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpLmFuZF9yZXR1cm4oYnRyYW5zKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKSkudG8gZXEoYnRyYW5zKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJ1ZmZlcmVkIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgdG9fcyB0aGF0IGRlc2NyaWJlcyB0aGUgZW5jYXBzdWxhdGlvbiIgZG8KKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrIikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJmcmFtZWQobW9jaykiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggb3Blbj8vb3Blbi9jbG9zZSIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgY2xvc2UiKQotICAgICAgZnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGZ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgZnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6b3Blbikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCisgICAgICBleHBlY3QoZnRyYW5zLm9wZW4/KS50byBlcSgiKyBvcGVuPyIpCisgICAgICBleHBlY3QoZnRyYW5zLm9wZW4pLnRvIGVxKCIrIG9wZW4iKQorICAgICAgZXhwZWN0KGZ0cmFucy5jbG9zZSkudG8gZXEoIisgY2xvc2UiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZCB3aGVuIHJlYWQgaXMgdHVybmVkIG9mZiIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIGZhbHNlLCB0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBmdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE3KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTcpKS50byBlcSgiKyByZWFkIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyB0aHJvdWdoIHdyaXRlL2ZsdXNoIHdoZW4gd3JpdGUgaXMgdHVybmVkIG9mZiIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vIikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHdyaXRlIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQuYW5kX3JldHVybigiKyBmbHVzaCIpCi0gICAgICBmdHJhbnMud3JpdGUoImZvbyIpLnNob3VsZCA9PSAiKyB3cml0ZSIKLSAgICAgIGZ0cmFucy5mbHVzaC5zaG91bGQgPT0gIisgZmx1c2giCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vIikub3JkZXJlZC5hbmRfcmV0dXJuKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgZmx1c2giKQorICAgICAgZXhwZWN0KGZ0cmFucy53cml0ZSgiZm9vIikpLnRvIGVxKCIrIHdyaXRlIikKKyAgICAgIGV4cGVjdChmdHJhbnMuZmx1c2gpLnRvIGVxKCIrIGZsdXNoIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIGEgZnVsbCBmcmFtZSBpZiBhc2tlZCBmb3IgPj0gdGhlIGZyYW1lJ3MgbGVuZ3RoIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZChmcmFtZS5sZW5ndGggKyAxMCkuc2hvdWxkID09IGZyYW1lCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKSkudG8gZXEoZnJhbWUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBzbGljZXMgb2YgdGhlIGZyYW1lIHdoZW4gYXNrZWQgZm9yIDwgdGhlIGZyYW1lJ3MgbGVuZ3RoIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgotICAgICAgZnRyYW5zLnJlYWQoNCkuc2hvdWxkID09ICIgaXMgIgotICAgICAgZnRyYW5zLnJlYWQoMTYpLnNob3VsZCA9PSAiYSBmcmFtZSIKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg0KSkudG8gZXEoInRoaXMiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgiIGlzICIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTYpKS50byBlcSgiYSBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBub3RoaW5nIGlmIGFza2VkIGZvciA8PSAwIiBkbwotICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZCgtMikuc2hvdWxkID09ICIiCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykucmVhZCgtMikpLnRvIGVxKCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwdWxsIGEgbmV3IGZyYW1lIHdoZW4gdGhlIGZpcnN0IGlzIGV4aGF1c3RlZCIgZG8KICAgICAgIGZyYW1lID0gInRoaXMgaXMgYSBmcmFtZSIKICAgICAgIGZyYW1lMiA9ICJ5ZXQgYW5vdGhlciBmcmFtZSIKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZTIubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lMikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciLCAiXDAwMFwwMDBcMDAwXDAyMSIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZTIubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lMikKICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg4KS5zaG91bGQgPT0gIiBpcyBhIGZyIgotICAgICAgZnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJhbWUiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInlldCAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhbm90aGVyIGZyYW1lIgorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgidGhpcyIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoOCkpLnRvIGVxKCIgaXMgYSBmciIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNikpLnRvIGVxKCJhbWUiKQorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgieWV0ICIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoMTYpKS50byBlcSgiYW5vdGhlciBmcmFtZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciB3cml0ZXMiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGUpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGUpCiAgICAgICBmdHJhbnMud3JpdGUoImZvbyIpCiAgICAgICBmdHJhbnMud3JpdGUoImJhciIpCiAgICAgICBmdHJhbnMud3JpdGUoInRoaXMgaXMgYSBmcmFtZSIpCkBAIC0yMTMsMTUgKzIzNywxNSBAQAogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vYmFyIiwgMykKICAgICAgIGZ0cmFucy53cml0ZSgiYmFyZm9vIiwgMSkKLSAgICAgIEB0cmFucy5zdHViISg6Zmx1c2gpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA0Zm9vYiIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKICAgICAgIGZ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBmbHVzaCBmcmFtZXMgd2l0aCBhIDQtYnl0ZSBoZWFkZXIiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZAorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMzVvbmUvdHdvL3RocmVlL3RoaXMgaXMgYSBmcmFtZSIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCiAgICAgICBmdHJhbnMud3JpdGUoIm9uZS8iKQogICAgICAgZnRyYW5zLndyaXRlKCJ0d28vIikKICAgICAgIGZ0cmFucy53cml0ZSgidGhyZWUvIikKQEAgLTIzMSwyMiArMjU1LDI2IEBACiAKICAgICBpdCAic2hvdWxkIG5vdCBmbHVzaCB0aGUgc2FtZSBidWZmZXJlZCBkYXRhIHR3aWNlIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDdmb28vYmFyIikKLSAgICAgIEB0cmFucy5zdHViISg6Zmx1c2gpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwN2Zvby9iYXIiKQorICAgICAgYWxsb3coQHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikKICAgICAgIGZ0cmFucy53cml0ZSgiL2JhciIpCiAgICAgICBmdHJhbnMuZmx1c2gKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDAiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDAiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgd3JhcCB0aGUgZ2l2ZW4gdHJhbnNwb3J0IGluIGEgRnJhbWVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCh0cmFucykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0KS50byByZWNlaXZlKDpuZXcpLndpdGgodHJhbnMpCiAgICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpCiAgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcudG9fcykudG8gZXEoImZyYW1lZCIpCisgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0IGRvCkBAIC0yNTQsOTYgKzI4MiwxMDYgQEAKICAgICAgIEBidWZmZXIgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAYnVmZmVyLnRvX3MpLnRvIGVxKCJtZW1vcnkiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYSBidWZmZXIgb24gaW5wdXQgYW5kIHVzZSBpdCBkaXJlY3RseSIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCiAgICAgICBAYnVmZmVyID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KHMpCi0gICAgICBAYnVmZmVyLnJlYWQoNCkuc2hvdWxkID09ICJ0aGlzIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZCg0KSkudG8gZXEoInRoaXMiKQogICAgICAgcy5zbGljZSEoLTQuLi0xKQotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiBpcyBhICIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGlzIGEgIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWx3YXlzIHJlbWFpbiBvcGVuIiBkbwotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICAgIEBidWZmZXIuY2xvc2UKLSAgICAgIEBidWZmZXIuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAYnVmZmVyKS50byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlc3BvbmQgdG8gcGVlayBhbmQgYXZhaWxhYmxlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAic29tZSBkYXRhIgotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gOQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDkpCiAgICAgICBAYnVmZmVyLnJlYWQoNCkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfdHJ1ZQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDUKKyAgICAgIGV4cGVjdChAYnVmZmVyLnBlZWspLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSg1KQogICAgICAgQGJ1ZmZlci5yZWFkKDUpCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX2ZhbHNlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfZmFsc2V5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJlIGFibGUgdG8gcmVzZXQgdGhlIGJ1ZmZlciIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInRlc3QgZGF0YSIKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCJmb29iYXIiKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDYKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb29iYXIiCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDYpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoImZvb2JhciIpCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcgotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDAKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29weSB0aGUgZ2l2ZW4gc3RyaW5nIHdoZW4gcmVzZXR0aW5nIHRoZSBidWZmZXIiIGRvCiAgICAgICBzID0gInRoaXMgaXMgYSB0ZXN0IgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIocykKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAxNAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgxNCkKICAgICAgIEBidWZmZXIucmVhZCgxMCkKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA0Ci0gICAgICBzLnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3QiCisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDQpCisgICAgICBleHBlY3QocykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIGZyb20gcmVhZCB3aGF0IHdhcyBnaXZlbiBpbiB3cml0ZSIgZG8KICAgICAgIEBidWZmZXIud3JpdGUgInRlc3QgZGF0YSIKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRlc3QiCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGRhdGEiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGVzdCIpCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKSkudG8gZXEoIiBkYXRhIikKICAgICAgIEBidWZmZXIud3JpdGUgImZvbyIKICAgICAgIEBidWZmZXIud3JpdGUgIiBiYXIiCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiZm9vIGJhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vIGJhciIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHRocm93IGFuIEVPRkVycm9yIHdoZW4gdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEgaW4gdGhlIGJ1ZmZlciIgZG8KICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCIiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCgxKX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCgxKX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyKCIxMjM0IikKLSAgICAgIGxhbWJkYXtAYnVmZmVyLnJlYWQoNSl9LnNob3VsZCByYWlzZV9lcnJvcihFT0ZFcnJvcikKKyAgICAgIGV4cGVjdHtAYnVmZmVyLnJlYWQoNSl9LnRvIHJhaXNlX2Vycm9yKEVPRkVycm9yKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0IGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQGlucHV0ID0gbW9jaygiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBvdXRwdXQgPSBtb2NrKCJPdXRwdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEBpbnB1dCA9IGRvdWJsZSgiSW5wdXQiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIEBvdXRwdXQgPSBkb3VibGUoIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQogICAgICAgQHRyYW5zID0gVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5uZXcoQGlucHV0LCBAb3V0cHV0KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19pbnB1dCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9ja19vdXRwdXQiKQorICAgICAgZXhwZWN0KEB0cmFucy50b19zKS50byBlcSgiaW9zdHJlYW0oaW5wdXQ9bW9ja19pbnB1dCxvdXRwdXQ9bW9ja19vdXRwdXQpIikKKyAgICBlbmQKKwogICAgIGl0ICJzaG91bGQgYmUgb3BlbiBhcyBsb25nIGFzIGJvdGggaW5wdXQgb3Igb3V0cHV0IGFyZSBvcGVuIiBkbwotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGQgYmVfb3BlbgotICAgICAgQGlucHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQotICAgICAgQG91dHB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIEB0cmFucy5zaG91bGRfbm90IGJlX29wZW4KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIGJlX29wZW4KKyAgICAgIGFsbG93KEBpbnB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKGZhbHNlKQorICAgICAgYWxsb3coQG91dHB1dCkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS5ub3RfdG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggcmVhZC93cml0ZSB0byBpbnB1dC9vdXRwdXQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCi0gICAgICBAdHJhbnMucmVhZCgxNykuc2hvdWxkID09ICIrIHJlYWQiCi0gICAgICBAdHJhbnMud3JpdGUoImZvb2JhciIpLnNob3VsZCA9PSAiKyB3cml0ZSIKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLmFuZF9yZXR1cm4oIisgcmVhZCIpCisgICAgICBleHBlY3QoQG91dHB1dCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDE3KSkudG8gZXEoIisgcmVhZCIpCisgICAgICBleHBlY3QoQHRyYW5zLndyaXRlKCJmb29iYXIiKSkudG8gZXEoIisgd3JpdGUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSBib3RoIGlucHV0IGFuZCBvdXRwdXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBAaW5wdXQuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgQG91dHB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEB0cmFucy5jbG9zZQogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKaW5kZXggYmFjOWVhNy4uYjJjZDA0YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIKQEAgLTMzLDEwICszMywxNCBAQAogCiAgICAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSBkbwogICAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIiBkbwotICAgICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKS5zaG91bGQgYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKQorICAgICAgZW5kCisKKyAgICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnktYWNjZWwiKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZAogZWxzZQogICBwdXRzICJza2lwcGluZyBCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIHNwZWMgYmVjYXVzZSBpdCBpcyBub3QgZGVmaW5lZC4iCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKaW5kZXggMzI3NzJkMy4uMDY1ZjVjZSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIKQEAgLTM4LDI5ICszOCwzNyBAQAogICAgIGl0ICJzaG91bGQgcmVhZCBhIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgICAgQHRyYW5zLndyaXRlKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFldLnBhY2soJ04nKSkKICAgICAgIEB0cmFucy53cml0ZShbNDJdLnBhY2soJ04nKSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OlJFUExZLCA0Ml0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oJ3Rlc3RNZXNzYWdlJykKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4pLnRvIGVxKFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGhlYWRlciBoYXMgdGhlIHdyb25nIHZlcnNpb24iIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oLTEpCi0gICAgICBsYW1iZGEgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKC0xKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ01pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyJykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBoZWFkZXIgZG9lcyBub3QgZXhpc3QgYW5kIHN0cmljdF9yZWFkIGlzIGVuYWJsZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycpIGRvIHxlfAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c3RyaWN0X3JlYWQpLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdCB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JykgZG8gfGV8CiAgICAgICAgIGUudHlwZSA9PSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTgogICAgICAgZW5kCiAgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHByb3QudG9fcykudG8gZXEoImJpbmFyeShtZW1vcnkpIikKKyAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sIiBkbwotICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sKQorICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYmluYXJ5IikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYiBiL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgppbmRleCBjNDlmZjFmLi41OGQ2NWYwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKKysrIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCkBAIC0yNywzNCArMjcsMzQgQEAKICAgZW5kCiAKICAgaXQgInNob3VsZCBkZWZpbmUgdGhlIHByb3BlciBWRVJTSU9OXzEsIFZFUlNJT05fTUFTSyBBTkQgVFlQRV9NQVNLIiBkbwotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKS5zaG91bGQgPT0gMHhmZmZmMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKS5zaG91bGQgPT0gMHg4MDAxMDAwMAotICAgIHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VFlQRV9NQVNLKS5zaG91bGQgPT0gMHgwMDAwMDBmZgorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fTUFTSykpLnRvIGVxKDB4ZmZmZjAwMDApCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSkudG8gZXEoMHg4MDAxMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spKS50byBlcSgweDAwMDAwMGZmKQogICBlbmQKIAogICBpdCAic2hvdWxkIG1ha2Ugc3RyaWN0X3JlYWQgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3JlYWQuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3RfcmVhZCkudG8gZXFsKHRydWUpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3Rfd3JpdGUgcmVhZGFibGUiIGRvCi0gICAgQHByb3Quc3RyaWN0X3dyaXRlLnNob3VsZCBlcWwodHJ1ZSkKKyAgICBleHBlY3QoQHByb3Quc3RyaWN0X3dyaXRlKS50byBlcWwodHJ1ZSkKICAgZW5kICAgIAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpIHwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsICJ0ZXN0TWVzc2FnZSIuc2l6ZSwgInRlc3RNZXNzYWdlIiwgMTddLnBhY2soIk5OYTExTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aCBhIHZlcnNpb24gd2hlbiB3cml0ZXMgYXJlIHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMpICMgc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDFcMDAwXDAwMVwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogCkBAIC02Miw2NCArNjIsNjcgQEAKIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oJ2ZvbycsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgM10ucGFjaygiY24iKSkKICAgZW5kCiAgIAogICAjIGZpZWxkIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIFNUT1AgZmllbGQiIGRvCiAgICAgQHByb3Qud3JpdGVfZmllbGRfc3RvcAotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtYXAgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIik7CisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAxN10ucGFjaygiY2NOIikpOwogICBlbmQKICAgIAogICAjIG1hcCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBsaXN0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OkkxNiwgNDIpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKSkKICAgZW5kCiAgIAogICAjIGxpc3QgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgc2V0IGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYSBib29sIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wodHJ1ZSkKICAgICBAcHJvdC53cml0ZV9ib29sKGZhbHNlKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMVwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMVwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgdHJlYXQgYSBuaWwgYm9vbCBhcyBmYWxzZSIgZG8KICAgICBAcHJvdC53cml0ZV9ib29sKG5pbCkKLSAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gIlwwMDAiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcSgiXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJ5dGUiIGRvCiAgICAgIyBieXRlIGlzIHNtYWxsIGVub3VnaCwgbGV0J3MgY2hlY2sgLTEyOC4uMTI3CiAgICAgKC0xMjguLjEyNykuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBoYW5kaW5nIGl0IG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yc3BlY192ZXJpZnkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBjbGlwIG51bWJlcnMgb3V0IG9mIHNpZ25lZCByYW5nZSIgZG8KICAgICAoMTI4Li4yNTUpLmVhY2ggZG8gfGl8CiAgICAgICBAcHJvdC53cml0ZV9ieXRlKGkpCi0gICAgICBAdHJhbnMucmVhZCgxKS5zaG91bGQgPT0gW2ldLnBhY2soJ2MnKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKDEpKS50byBlcShbaV0ucGFjaygnYycpKQogICAgIGVuZAotICAgICMgYW5kIGxhc3RseSwgYSBCaWdudW0gaXMgZ29pbmcgdG8gZXJyb3Igb3V0Ci0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZSgyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgZW5kCisKKyAgaXQgImVycm9ycyBvdXQgd2l0aCBhIEJpZ251bSIgZG8KKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGJ5dGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfYnl0ZShuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkxNiIgZG8KQEAgLTEzMSwxNCArMTM0LDE0IEBACiAgICAgIyBhbmQgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAogICAgIEBwcm90LndyaXRlX2kxNigyKioxNSArIDUpCiAgICAgCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMjAwXDAwMFwzNzRcMDAwXDAwMFwwMjFcMDAwXDAwMFwzMzBcMzYwXDAwNlwyNzNcMTc3XDM3N1wyMDBcMDA1IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiKQogICAgIAogICAgICMgYSBCaWdudW0gc2hvdWxkIGVycm9yCiAgICAgIyBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYoMioqNjUpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGkxNiIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMTYobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGFuIGkzMiIgZG8KQEAgLTE0OCwxNCArMTUxLDE0IEBACiAgICAgICBAcHJvdC53cml0ZV9pMzIoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwyMDBcMDAwXDAwMFwwMDAiICsgIlwzNzdcMzc2XDAzN1xyIiArICJcMzc3XDM3N1wzNjZcMDM0IiArICJcMzc3XDM3N1wzNzdcMzc1IiArICJcMDAwXDAwMFwwMDBcMDAwIiArICJcMDAwI1wzNDBcMjAzIiArICJcMDAwXDAwMDArIiArICJcMTc3XDM3N1wzNzdcMzc3IikKICAgICBbMiAqKiAzMSArIDUsIDIgKiogNjUgKyA1XS5lYWNoIGRvIHxpfAotICAgICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKGkpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKKyAgICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2kzMihpKSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpICAKICAgICBlbmQKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTMyIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kzMihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTY0IiBkbwpAQCAtMTY1LDcgKzE2OCw3IEBACiAgICAgICBAcHJvdC53cml0ZV9pNjQoaSkKICAgICBlbmQKICAgICAjIHRyeSBzb21ldGhpbmcgb3V0IG9mIHNpZ25lZCByYW5nZSwgaXQgc2hvdWxkIGNsaXAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gWyJcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCIsCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKICAgICAgICJcMzc3XDM3N1wzNjRcMzAzXDAzNVwyNDQrXSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzZcMjMxOlwzNDEiLAogICAgICAgIlwzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMDI2IiwKQEAgLTE3MywxMiArMTc2LDEyIEBACiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwNFwzMTciLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDBcMDAwI1wzNDBcMjA0IiwKICAgICAgICJcMDAwXDAwMFwwMDBcMDAyXDM0MFwzMTF+XDM2NSIsCi0gICAgICAiXDE3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzciXS5qb2luKCIiKQotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKKyAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpKQorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NCgyICoqIDY1ICsgNSkgfS50byByYWlzZV9lcnJvcihSYW5nZUVycm9yKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpNjQiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGRvdWJsZSIgZG8KQEAgLTE4NiwxMiArMTg5LDEyIEBACiAgICAgdmFsdWVzID0gW0Zsb2F0OjpNSU4sLTEyMzEuMTUzMjUsIC0xMjMxMjMuMjMsIC0yMy4yMzUxNTEyMywgMCwgMTIzNTEuMTMyNSwgNTIzLjIzLCBGbG9hdDo6TUFYXQogICAgIHZhbHVlcy5lYWNoIGRvIHxmfAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKGYpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW2ZdLnBhY2soIkciKQorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbZl0ucGFjaygiRyIpKQogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBkb3VibGUiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfZG91YmxlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9kb3VibGUobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogCiAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JwpAQCAtMTk5LDk2ICsyMDIsMTExIEBACiAgICAgICBzdHIgPSAnYWJjJwogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCiAgICAgICBzdHIgPSAiYWJjIFx1MjBBQyBcdTIwQUQiLmVuY29kZSgnVVRGLTgnKQogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDYxLCAweDYyLCAweDYzLCAweDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyLCAweDgyLCAweEFDLCAweDIwLCAweEUyLCAweDgyLCAweEFEXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDYxLCAweDYyLCAweDYzLCAweDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyLCAweDgyLCAweEFDLCAweDIwLCAweEUyLCAweDgyLCAweEFEXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgc2hvdWxkIHdyaXRlIGEgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzIGFuZCB0cmFuc2NvZGluZycgZG8KICAgICAgIHN0ciA9ICJhYmMgXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykKICAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBQ10pCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHdyaXRlIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFswLCAxLCAyLCAzXS5wYWNrKCdDKicpCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoYnVmZmVyKQorICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKQogICAgIGVuZAogICBlbHNlCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZycgZG8KICAgICAgIHN0ciA9ICdhYmMnCiAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXSkKKyAgICBlbmQKKworICAgIGl0ICdzaG91bGQgd3JpdGUgYSBiaW5hcnkgc3RyaW5nJyBkbworICAgICAgYnVmZmVyID0gWzAsIDEsIDIsIDNdLnBhY2soJ0MqJykKKyAgICAgIEBwcm90LndyaXRlX2JpbmFyeShidWZmZXIpCisgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKQogICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgc3RyaW5nIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX3N0cmluZyhuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAgICMgbWVzc2FnZSBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLnBhY2soImNuIikpCi0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgc3RvcCBmaWVsZCIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUT1BdLnBhY2soImMiKSk7Ci0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KKyAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmVhZCBhIG1hcCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdLnBhY2soImNjTiIpKQotICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0pCiAgIGVuZAogICAKICAgIyBtYXAgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgbGlzdCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzZXQgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10ucGFjaygiY04iKSkKLSAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBzZXQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYm9vbCIgZG8KICAgICBAdHJhbnMud3JpdGUoIlwwMDFcMDAwIik7Ci0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCi0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYnl0ZSIgZG8KICAgICBbLTEyOCwgLTU3LCAtMywgMCwgMTcsIDI0LCAxMjddLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soImMiKSkKLSAgICAgIEBwcm90LnJlYWRfYnl0ZS5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMjk2LDcgKzMxNCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjE1LCAtNTIzNywgLTM1MywgMCwgMTUyNywgMjIzNCwgMioqMTUtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygibiIpKTsKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTMwNCw3ICszMjIsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKiozMSwgLTIzNTEyNSwgLTYyMzYsIDAsIDIzNTEsIDEyMzEyMywgMioqMzEtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiTiIpKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzEyLDcgKzMzMCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjYzLCAtMTIzNTEyMzEyLCAtNjM0NiwgMCwgMzIsIDIzNDYzMjIzMjMsIDIqKjYzLTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2kgPj4gMzIsIGkgJiAweEZGRkZGRkZGXS5wYWNrKCJOTiIpKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzIwLDcgKzMzOCw3IEBACiAgICAgIyB0cnkgYSByYW5kb20gc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgW0Zsb2F0OjpNSU4sIC0yMzEyMzEuMTIzNTEsIC0zMjMuMjMzNTEzLCAwLCAxMjMuMjM1MTIzNSwgMjM1MTIzNS4xMjM1MTIzNSwgRmxvYXQ6Ok1BWF0uZWFjaCBkbyB8ZnwKICAgICAgIEB0cmFucy53cml0ZShbZl0ucGFjaygiRyIpKTsKLSAgICAgIEBwcm90LnJlYWRfZG91YmxlLnNob3VsZCA9PSBmCisgICAgICBleHBlY3QoQHByb3QucmVhZF9kb3VibGUpLnRvIGVxKGYpCiAgICAgZW5kCiAgIGVuZAogCkBAIC0zMzAsOCArMzQ4LDggQEAKICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICBhLnNob3VsZCA9PSAnYWJjJy5lbmNvZGUoJ1VURi04JykKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgZXhwZWN0KGEpLnRvIGVxKCdhYmMnLmVuY29kZSgnVVRGLTgnKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcgY29udGFpbmluZyB1bmljb2RlIGNoYXJhY3RlcnMgZnJvbSBVVEYtOCBlbmNvZGVkIGJ1ZmZlcicgZG8KQEAgLTMzOSwyOSArMzU3LDQ0IEBACiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgYS5zaG91bGQgPT0gIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgIGVuZAorCisgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KKyAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCisgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQorICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5CisgICAgICBleHBlY3QoYSkudG8gZXEoWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICBlbmQKICAgZWxzZQogICAgIGl0ICdzaG91bGQgcmVhZCBhIHN0cmluZycgZG8KICAgICAgICMgaTMyIG9mIHZhbHVlIDMsIGZvbGxvd2VkIGJ5IHRocmVlIGNoYXJhY3RlcnMvVVRGLTggYnl0ZXMgJ2EnLCAnYicsICdjJwogICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdLnBhY2soJ0MqJykKICAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCi0gICAgICBAcHJvdC5yZWFkX3N0cmluZy5zaG91bGQgPT0gJ2FiYycKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ2FiYycpCisgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlYWQgYSBiaW5hcnkgc3RyaW5nJyBkbworICAgICAgYnVmZmVyID0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdLnBhY2soJ0MqJykKKyAgICAgIEB0cmFucy53cml0ZShidWZmZXIpCisgICAgICBhID0gQHByb3QucmVhZF9iaW5hcnkKKyAgICAgIGV4cGVjdChhKS50byBlcShbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKSkKICAgICBlbmQKICAgZW5kCiAKICAgaXQgInNob3VsZCBwZXJmb3JtIGEgY29tcGxldGUgcnBjIHdpdGggbm8gYXJncyBvciByZXR1cm4iIGRvCiAgICAgc3J2X3Rlc3QoCiAgICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQuc2VuZF92b2lkTWV0aG9kKCl9LAotICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnJlY3Zfdm9pZE1ldGhvZC5zaG91bGQgPT0gbmlsfQorICAgICAgcHJvYyB7fGNsaWVudHwgZXhwZWN0KGNsaWVudC5yZWN2X3ZvaWRNZXRob2QpLnRvIGVxKG5pbCl9CiAgICAgKQogICBlbmQKIAogICBpdCAic2hvdWxkIHBlcmZvcm0gYSBjb21wbGV0ZSBycGMgd2l0aCBhIHByaW1pdGl2ZSByZXR1cm4gdHlwZSIgZG8KICAgICBzcnZfdGVzdCgKICAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5zZW5kX3ByaW1pdGl2ZU1ldGhvZCgpfSwKLSAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5yZWN2X3ByaW1pdGl2ZU1ldGhvZC5zaG91bGQgPT0gMX0KKyAgICAgIHByb2Mge3xjbGllbnR8IGV4cGVjdChjbGllbnQucmVjdl9wcmltaXRpdmVNZXRob2QpLnRvIGVxKDEpfQogICAgICkKICAgZW5kCiAKQEAgLTM3Miw3ICs0MDUsNyBAQAogICAgICAgICByZXN1bHQgPSBjbGllbnQucmVjdl9zdHJ1Y3RNZXRob2QKICAgICAgICAgcmVzdWx0LnNldF9ieXRlX21hcCA9IG5pbAogICAgICAgICByZXN1bHQubWFwX2J5dGVfbWFwID0gbmlsCi0gICAgICAgIHJlc3VsdC5zaG91bGQgPT0gRml4dHVyZXM6OkNPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QKKyAgICAgICAgZXhwZWN0KHJlc3VsdCkudG8gZXEoRml4dHVyZXM6OkNPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QpCiAgICAgICB9CiAgICAgKQogICBlbmQKQEAgLTM5Myw5ICs0MjYsOSBAQAogICAgIGNsaWVudHByb3RvID0gcHJvdG9jb2xfY2xhc3MubmV3KGNsaWVudHNpZGUpCiAgICAgc2VydmVycHJvdG8gPSBwcm90b2NvbF9jbGFzcy5uZXcoc2VydmVyc2lkZSkKIAotICAgIHByb2Nlc3NvciA9IFNydjo6UHJvY2Vzc29yLm5ldyhTcnZIYW5kbGVyLm5ldykKKyAgICBwcm9jZXNzb3IgPSBUaHJpZnQ6OlRlc3Q6OlNydjo6UHJvY2Vzc29yLm5ldyhTcnZIYW5kbGVyLm5ldykKIAotICAgIGNsaWVudCA9IFNydjo6Q2xpZW50Lm5ldyhjbGllbnRwcm90bywgY2xpZW50cHJvdG8pCisgICAgY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpTcnY6OkNsaWVudC5uZXcoY2xpZW50cHJvdG8sIGNsaWVudHByb3RvKQogCiAgICAgIyBmaXJzdCBibG9jawogICAgIGZpcnN0YmxvY2suY2FsbChjbGllbnQpCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYgppbmRleCBiODJlMzA0Li4yZTg2NTNjIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKQEAgLTI1LDMzICsyNSwzMyBAQAogICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCi0gICAgICAgIGIubGVuZ3RoLnNob3VsZCA9PSAwCi0gICAgICAgIGIuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KICAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMgotICAgICAgICBiLmdldGJ5dGUoMCkuc2hvdWxkID09IDAKLSAgICAgICAgYi5nZXRieXRlKDEpLnNob3VsZCA9PSAwCi0gICAgICAgIGIuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgyKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDApKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5nZXRieXRlKDEpKS50byBlcSgwKQorICAgICAgICBleHBlY3QoYi5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcnIGRvCiAgICAgICBpdCAnc2hvdWxkIGNoYW5nZSBlbmNvZGluZycgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnLmVuY29kZSgnVVRGLTgnKQotICAgICAgICBlLmVuY29kaW5nLnNob3VsZF9ub3QgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoZS5lbmNvZGluZykubm90X3RvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuZ2V0X3N0cmluZ19ieXRlJyBkbwogICAgICAgaXQgJ3Nob3VsZCBnZXQgdGhlIGJ5dGUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCi0gICAgICAgIFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApLnNob3VsZCA9PSAweDQxCi0gICAgICAgIFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpLnNob3VsZCA9PSAweDQyCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKSkudG8gZXEoMHg0MSkKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDEpKS50byBlcSgweDQyKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTU5LDQyICs1OSw0MiBAQAogICAgICAgaXQgJ3Nob3VsZCBzZXQgYnl0ZSB2YWx1ZSBhdCBpbmRleCcgZG8KICAgICAgICAgcyA9ICJceDQxXHg0MiIKICAgICAgICAgVGhyaWZ0OjpCeXRlcy5zZXRfc3RyaW5nX2J5dGUocywgMCwgMHg0MykKLSAgICAgICAgcy5nZXRieXRlKDApLnNob3VsZCA9PSAweDQzCi0gICAgICAgIHMuc2hvdWxkID09ICdDQicKKyAgICAgICAgZXhwZWN0KHMuZ2V0Ynl0ZSgwKSkudG8gZXEoMHg0MykKKyAgICAgICAgZXhwZWN0KHMpLnRvIGVxKCdDQicpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IFVURi04IFN0cmluZyB0byBieXRlIGJ1ZmZlcicgZG8KICAgICAgICAgZSA9ICJcdTIwQUMiLmVuY29kZSgnVVRGLTgnKSAjIGEgc3RyaW5nIHdpdGggZXVybyBzaWduIGNoYXJhY3RlciBVKzIwQUMKLSAgICAgICAgZS5sZW5ndGguc2hvdWxkID09IDEKKyAgICAgICAgZXhwZWN0KGUubGVuZ3RoKS50byBlcSgxKQogCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgICAgYS5sZW5ndGguc2hvdWxkID09IDMKLSAgICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweEUyLCAweDgyLCAweEFDXQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZXhwZWN0KGEubGVuZ3RoKS50byBlcSgzKQorICAgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEUyLCAweDgyLCAweEFDXSkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgSVNPLTg4NTktMTUgU3RyaW5nIHRvIFVURi04IGJ5dGUgYnVmZmVyJyBkbwogICAgICAgICAjIEFzc3VtcHRpb25zCiAgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDLCB0aGVuIGNvbnZlcnRlZCB0byBJU08tODg1OS0xNQotICAgICAgICBlLmxlbmd0aC5zaG91bGQgPT0gMQotICAgICAgICBlLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4QTRdICMgZXVybyBzaWduIGlzIGEgZGlmZmVyZW50IGNvZGUgcG9pbnQgaW4gSVNPLTg4NTktMTUKKyAgICAgICAgZXhwZWN0KGUubGVuZ3RoKS50byBlcSgxKQorICAgICAgICBleHBlY3QoZS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEE0XSkgIyBldXJvIHNpZ24gaXMgYSBkaWZmZXJlbnQgY29kZSBwb2ludCBpbiBJU08tODg1OS0xNQogCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlciBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgICAgYS5sZW5ndGguc2hvdWxkID09IDMKLSAgICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweEUyLCAweDgyLCAweEFDXQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgICAgZXhwZWN0KGEubGVuZ3RoKS50byBlcSgzKQorICAgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweEUyLCAweDgyLCAweEFDXSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5jb252ZXJ0X3RvX3N0cmluZycgZG8KICAgICAgIGl0ICdzaG91bGQgY29udmVydCBVVEYtOCBieXRlIGJ1ZmZlciB0byBhIFVURi04IFN0cmluZycgZG8KICAgICAgICAgZSA9IFsweEUyLCAweDgyLCAweEFDXS5wYWNrKCJDKiIpCi0gICAgICAgIGUuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGUuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84Ci0gICAgICAgIGEuc2hvdWxkID09ICJcdTIwQUMiCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMDIsMTQgKzEwMiwxNCBAQAogICAgIGRlc2NyaWJlICcuZW1wdHlfYnl0ZV9idWZmZXInIGRvCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXInIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyCi0gICAgICAgIGIubGVuZ3RoLnNob3VsZCA9PSAwCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIGNyZWF0ZSBhbiBlbXB0eSBidWZmZXIgb2YgZ2l2ZW4gc2l6ZScgZG8KICAgICAgICAgYiA9IFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIgMgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMgotICAgICAgICBiWzBdLnNob3VsZCA9PSAwCi0gICAgICAgIGJbMV0uc2hvdWxkID09IDAKKyAgICAgICAgZXhwZWN0KGIubGVuZ3RoKS50byBlcSgyKQorICAgICAgICBleHBlY3QoYlswXSkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGJbMV0pLnRvIGVxKDApCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTE3LDE2ICsxMTcsMTYgQEAKICAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyBlCi0gICAgICAgIGEuc2hvdWxkID09IGUKLSAgICAgICAgYS5zaG91bGQgYmUoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmdldF9zdHJpbmdfYnl0ZScgZG8KICAgICAgIGl0ICdzaG91bGQgZ2V0IHRoZSBieXRlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKS5zaG91bGQgPT0gMHg0MQotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKS5zaG91bGQgPT0gMHg0MgorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkpLnRvIGVxKDB4NDEpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKSkudG8gZXEoMHg0MikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMzQsOCArMTM0LDggQEAKICAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCiAgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCi0gICAgICAgIHNbMF0uc2hvdWxkID09IDB4NDMKLSAgICAgICAgcy5zaG91bGQgPT0gJ0NCJworICAgICAgICBleHBlY3Qoc1swXSkudG8gZXEoMHg0MykKKyAgICAgICAgZXhwZWN0KHMpLnRvIGVxKCdDQicpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTQzLDggKzE0Myw4IEBACiAgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJwogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQotICAgICAgICBhLnNob3VsZCA9PSBlCi0gICAgICAgIGEuc2hvdWxkIGJlKGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNTIsOCArMTUyLDggQEAKICAgICAgIGl0ICdzaG91bGQgYmUgYSBuby1vcCcgZG8KICAgICAgICAgZSA9ICdTVFJJTkcnCiAgICAgICAgIGEgPSBUaHJpZnQ6OkJ5dGVzLmNvbnZlcnRfdG9fc3RyaW5nIGUKLSAgICAgICAgYS5zaG91bGQgPT0gZQotICAgICAgICBhLnNob3VsZCBiZShlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCmluZGV4IGY4ZmZlOGEuLmQ1ZDRjZWUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NsaWVudF9zcGVjLnJiCkBAIC0yNiw3NCArMjYsNzMgQEAKICAgZW5kCiAKICAgYmVmb3JlKDplYWNoKSBkbwotICAgIEBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKKyAgICBAcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKICAgICBAY2xpZW50ID0gQ2xpZW50U3BlYy5uZXcoQHByb3QpCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6Q2xpZW50IGRvCiAgICAgaXQgInNob3VsZCByZS11c2UgaXByb3QgZm9yIG9wcm90IGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkIiBkbwotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAaXByb3QnKS5zaG91bGQgZXFsKEBwcm90KQotICAgICAgQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKS5zaG91bGQgZXFsKEBwcm90KQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90JykpLnRvIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BvcHJvdCcpKS50byBlcWwoQHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkKLSAgICAgIG1vY2tfYXJncyA9IG1vY2soJyM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPicpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOmZvbz0pLndpdGgoJ2ZvbycpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOmJhcj0pLndpdGgoNDIpCi0gICAgICBtb2NrX2FyZ3Muc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnRyYW5zKSBkbwotICAgICAgICBtb2NrKCd0cmFucycpLnRhcCBkbyB8dHJhbnN8Ci0gICAgICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwKQorICAgICAgbW9ja19hcmdzID0gZG91YmxlKCcjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4nKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6Zm9vPSkud2l0aCgnZm9vJykKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOmJhcj0pLndpdGgoNDIpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRyYW5zKSBkbworICAgICAgICBkb3VibGUoJ3RyYW5zJykudGFwIGRvIHx0cmFuc3wKKyAgICAgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAga2xhc3MgPSBzdHViKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCisgICAgICBrbGFzcyA9IGRvdWJsZSgiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQogICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywga2xhc3MsIDpmb28gPT4gJ2ZvbycsIDpiYXIgPT4gNDIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluY3JlbWVudCB0aGUgc2VxdWVuY2UgaWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIiBkbwotICAgICAgcGVuZGluZyAiaXQgc2VlbXMgc2VxdWVuY2UgaWRzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgcmlnaHQgbm93IiBkbwotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCAgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlMicsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMikub3JkZXJlZAotICAgICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybiBtb2NrKCJ0cmFucyIpLmFzX251bGxfb2JqZWN0Ci0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIG1vY2soImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMicsIG1vY2soImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKLSAgICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMycsIG1vY2soImFyZ3MgY2xhc3MiKS5hc19udWxsX29iamVjdCkKLSAgICAgIGVuZAorICAgICAgcGVuZGluZyAiaXQgc2VlbXMgc2VxdWVuY2UgaWRzIGFyZSBjb21wbGV0ZWx5IGlnbm9yZWQgcmlnaHQgbm93IgorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsICBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTInLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAorICAgICAgQHByb3QuZXhwZWN0KDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTMnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMikub3JkZXJlZAorICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuIGRvdWJsZSgidHJhbnMiKS5hc19udWxsX29iamVjdAorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UyJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCisgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UzJywgZG91YmxlKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlY2VpdmUgYSB0ZXN0IG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwXQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCi0gICAgICBtb2NrX2tsYXNzID0gbW9jaygiIzxNb2NrQ2xhc3M6bW9jaz4iKQotICAgICAgbW9ja19rbGFzcy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKLSAgICAgIEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKHN0dWIoIk1vY2tDbGFzcyIsIDpuZXcgPT4gbW9ja19rbGFzcykpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKKyAgICAgIG1vY2tfa2xhc3MgPSBkb3VibGUoIiM8TW9ja0NsYXNzOm1vY2s+IikKKyAgICAgIGV4cGVjdChtb2NrX2tsYXNzKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQorICAgICAgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UoZG91YmxlKCJNb2NrQ2xhc3MiLCA6bmV3ID0+IG1vY2tfa2xhc3MpKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYW5kbGUgcmVjZWl2ZWQgZXhjZXB0aW9ucyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6RVhDRVBUSU9OLCAwXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykgZG8KICAgICAgICAgU3RhbmRhcmRFcnJvci5uZXcudGFwIGRvIHxtb2NrX2V4Y3wKLSAgICAgICAgICBtb2NrX2V4Yy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKKyAgICAgICAgICBleHBlY3QobW9ja19leGMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShuaWwpIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIHRyYW5zcG9ydCBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgc2VuZGluZyBhIG1lc3NhZ2UiIGRvCi0gICAgICBAcHJvdC5zdHViISg6d3JpdGVfbWVzc2FnZV9iZWdpbikKLSAgICAgIEBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgICB0cmFucyA9IG1vY2soIk1vY2tUcmFuc3BvcnQiKQotICAgICAgQHByb3Quc3R1YiEoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAga2xhc3MgPSBtb2NrKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCi0gICAgICBsYW1iZGEgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS5zaG91bGQgcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvcikKKyAgICAgIGFsbG93KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKQorICAgICAgZXhwZWN0KEBwcm90KS5ub3RfdG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2FyZ3MgPSBkb3VibGUoIiM8VGVzdE1lc3NhZ2VfYXJnczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgICB0cmFucyA9IGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6dHJhbnMpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKKyAgICAgIGV4cGVjdCB7IEBjbGllbnQuc2VuZF9tZXNzYWdlKCJ0ZXN0TWVzc2FnZSIsIGtsYXNzKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKaW5kZXggOTFkZmU0NC4uNTEzZGQ2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBwcm90by5zZW5kKHdyaXRlcihwcmltaXRpdmVfdHlwZSksIHZhbHVlKQogICAgICAgICAjIHB1dHMgImJ1ZjogI3t0cmFucy5pbnNwZWN0X2J1ZmZlcn0iIGlmIHByaW1pdGl2ZV90eXBlID09IDppNjQKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApAQCAtNjIsMTAgKzYyLDEwIEBACiAKICAgICAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICAgIG5hbWUsIHR5cGUsIGlkID0gcHJvdG8ucmVhZF9maWVsZF9iZWdpbgotICAgICAgICB0eXBlLnNob3VsZCA9PSB0aHJpZnRfdHlwZQotICAgICAgICBpZC5zaG91bGQgPT0gMTUKKyAgICAgICAgZXhwZWN0KHR5cGUpLnRvIGVxKHRocmlmdF90eXBlKQorICAgICAgICBleHBlY3QoaWQpLnRvIGVxKDE1KQogICAgICAgICByZWFkX2JhY2sgPSBwcm90by5zZW5kKHJlYWRlcihwcmltaXRpdmVfdHlwZSkpCi0gICAgICAgIHJlYWRfYmFjay5zaG91bGQgPT0gdmFsdWUKKyAgICAgICAgZXhwZWN0KHJlYWRfYmFjaykudG8gZXEodmFsdWUpCiAgICAgICAgIHByb3RvLnJlYWRfZmllbGRfZW5kCiAgICAgICBlbmQKICAgICBlbmQKQEAgLTc1LDEzICs3NSwxMyBAQAogICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcodHJhbnMpCiAKLSAgICBzdHJ1Y3QgPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6Q29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKICAgICAjIHNldHMgYW5kIG1hcHMgZG9uJ3QgaGFzaCB3ZWxsLi4uIG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZS4KICAgICBzdHJ1Y3Qud3JpdGUocHJvdG8pCiAKLSAgICBzdHJ1Y3QyID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdC5uZXcKKyAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldwogICAgIHN0cnVjdDIucmVhZChwcm90bykgICAgCi0gICAgc3RydWN0Mi5zaG91bGQgPT0gc3RydWN0CisgICAgZXhwZWN0KHN0cnVjdDIpLnRvIGVxKHN0cnVjdCkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIG1ldGhvZCBjYWxscyBjb3JyZWN0bHkiIGRvCkBAIC05MSwxOSArOTEsMTkgQEAKICAgICBjbGllbnRfaW5fdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKICAgICBjbGllbnRfaW5fcHJvdG8gPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbC5uZXcoY2xpZW50X2luX3RyYW5zKQogCi0gICAgcHJvY2Vzc29yID0gU3J2OjpQcm9jZXNzb3IubmV3KEphbmt5SGFuZGxlci5uZXcpCisgICAgcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpTcnY6OlByb2Nlc3Nvci5uZXcoSmFua3lIYW5kbGVyLm5ldykKIAotICAgIGNsaWVudCA9IFNydjo6Q2xpZW50Lm5ldyhjbGllbnRfaW5fcHJvdG8sIGNsaWVudF9vdXRfcHJvdG8pCisgICAgY2xpZW50ID0gVGhyaWZ0OjpUZXN0OjpTcnY6OkNsaWVudC5uZXcoY2xpZW50X2luX3Byb3RvLCBjbGllbnRfb3V0X3Byb3RvKQogICAgIGNsaWVudC5zZW5kX0phbmt5KDEpCiAgICAgIyBwdXRzIGNsaWVudF9vdXRfdHJhbnMuaW5zcGVjdF9idWZmZXIKICAgICBwcm9jZXNzb3IucHJvY2VzcyhjbGllbnRfb3V0X3Byb3RvLCBjbGllbnRfaW5fcHJvdG8pCi0gICAgY2xpZW50LnJlY3ZfSmFua3kuc2hvdWxkID09IDIKKyAgICBleHBlY3QoY2xpZW50LnJlY3ZfSmFua3kpLnRvIGVxKDIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBkZWFsIHdpdGggZmllbGRzIGZvbGxvd2luZyBmaWVsZHMgdGhhdCBoYXZlIG5vbi1kZWx0YSBpZHMiIGRvCi0gICAgYnJjcCA9IEJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAorICAgIGJyY3AgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3KAogICAgICAgOmZpZWxkMSA9PiAiYmxhaCIsIAotICAgICAgOmZpZWxkMiA9PiBCaWdGaWVsZElkU3RydWN0Lm5ldygKKyAgICAgIDpmaWVsZDIgPT4gVGhyaWZ0OjpUZXN0OjpCaWdGaWVsZElkU3RydWN0Lm5ldygKICAgICAgICAgOmZpZWxkMSA9PiAic3RyaW5nMSIsIAogICAgICAgICA6ZmllbGQyID0+ICJzdHJpbmcyIiksIAogICAgICAgOmZpZWxkMyA9PiAzKQpAQCAtMTExLDIwICsxMTEsMjUgQEAKICAgICBieXRlcyA9IHNlci5zZXJpYWxpemUoYnJjcCkKIAogICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCi0gICAgYnJjcDIgPSBCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldworICAgIGJyY3AyID0gVGhyaWZ0OjpUZXN0OjpCcmVha3NSdWJ5Q29tcGFjdFByb3RvY29sLm5ldwogICAgIGRlc2VyLmRlc2VyaWFsaXplKGJyY3AyLCBieXRlcykKLSAgICBicmNwMi5zaG91bGQgPT0gYnJjcAorICAgIGV4cGVjdChicmNwMikudG8gZXEoYnJjcCkKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGRlc2VyaWFsaXplIGFuIGVtcHR5IG1hcCB0byBhbiBlbXB0eSBoYXNoIiBkbwotICAgIHN0cnVjdCA9IFNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3KDppMzJfbWFwID0+IHt9KQorICAgIHN0cnVjdCA9IFRocmlmdDo6VGVzdDo6U2luZ2xlTWFwVGVzdFN0cnVjdC5uZXcoOmkzMl9tYXAgPT4ge30pCiAgICAgc2VyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQogICAgIGJ5dGVzID0gc2VyLnNlcmlhbGl6ZShzdHJ1Y3QpCiAKICAgICBkZXNlciA9IFRocmlmdDo6RGVzZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3KQotICAgIHN0cnVjdDIgPSBTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldworICAgIHN0cnVjdDIgPSBUaHJpZnQ6OlRlc3Q6OlNpbmdsZU1hcFRlc3RTdHJ1Y3QubmV3CiAgICAgZGVzZXIuZGVzZXJpYWxpemUoc3RydWN0MiwgYnl0ZXMpCi0gICAgc3RydWN0LnNob3VsZCA9PSBzdHJ1Y3QyCisgICAgZXhwZWN0KHN0cnVjdCkudG8gZXEoc3RydWN0MikKKyAgZW5kCisgIAorICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgdHJhbnMgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcKKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKS50b19zKS50byBlcSgiY29tcGFjdChtZW1vcnkpIikKICAgZW5kCiAgIAogICBjbGFzcyBKYW5reUhhbmRsZXIKQEAgLTEzNCwxMiArMTM5LDIwIEBACiAgIGVuZAogICAKICAgZGVmIHdyaXRlcihzeW0pCi0gICAgc3ltID0gc3ltID09IDpiaW5hcnkgPyA6c3RyaW5nIDogc3ltCiAgICAgIndyaXRlXyN7c3ltLnRvX3N9IgogICBlbmQKICAgCiAgIGRlZiByZWFkZXIoc3ltKQotICAgIHN5bSA9IHN5bSA9PSA6YmluYXJ5ID8gOnN0cmluZyA6IHN5bQogICAgICJyZWFkXyN7c3ltLnRvX3N9IgogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZAorCitkZXNjcmliZSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkgZG8KKyAgaXQgInNob3VsZCBjcmVhdGUgYSBDb21wYWN0UHJvdG9jb2wiIGRvCisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKSkudG8gYmVfaW5zdGFuY2Vfb2YoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wpCisgIGVuZAorCisgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiY29tcGFjdCIpCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9leGNlcHRpb25fc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCmluZGV4IGQxZGE2MjEuLjM3OWFlNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiCkBAIC0yNCwxMDcgKzI0LDEwNyBAQAogICBkZXNjcmliZSBUaHJpZnQ6OkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaGF2ZSBhbiBhY2Nlc3NpYmxlIG1lc3NhZ2UiIGRvCiAgICAgICBlID0gVGhyaWZ0OjpFeGNlcHRpb24ubmV3KCJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGluaGVyaXQgZnJvbSBUaHJpZnQ6OkV4Y2VwdGlvbiIgZG8KLSAgICAgIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc3VwZXJjbGFzcy5zaG91bGQgPT0gVGhyaWZ0OjpFeGNlcHRpb24KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnN1cGVyY2xhc3MpLnRvIGVxKFRocmlmdDo6RXhjZXB0aW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgdHlwZSBhbmQgbWVzc2FnZSIgZG8KICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTikKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9ELCAidGVzdCBtZXNzYWdlIikKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInRlc3QgbWVzc2FnZSIKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYSBzdHJ1Y3Qgb2ZmIG9mIGEgcHJvdG9jb2wiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKAogICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAogICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQuYW5kX3JldHVybiAidGVzdCBtZXNzYWdlIgotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDIpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQuYW5kX3JldHVybiBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgyKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKICAgICAgIGUucmVhZChwcm90KQotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJ0ZXN0IG1lc3NhZ2UiKQorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIGJhZCBmaWVsZHMgd2hlbiByZWFkaW5nIGEgc3RydWN0IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg1KS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoNSkudGltZXMuYW5kX3JldHVybigKICAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyXSwKICAgICAgICAgWyJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKICAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAxXSwKICAgICAgICAgWyJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXSwKICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORykudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNCkudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3CiAgICAgICBlLnJlYWQocHJvdCkKLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCi0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OklOVkFMSURfTUVTU0FHRV9UWVBFKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBhIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24gc3RydWN0IHRvIHRoZSBvcHJvdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInRlc3QgbWVzc2FnZSIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQogICAgICAgZS53cml0ZShwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIG5pbCBmaWVsZHMgd2hlbiB3cml0aW5nIHRvIHRoZSBvcHJvdCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhuaWwsICJ0ZXN0IG1lc3NhZ2UiKQogICAgICAgZS53cml0ZShwcm90KQogCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCiAgICAgICBlLndyaXRlKHByb3QpCiAKLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCkKICAgICAgIGUud3JpdGUocHJvdCkKQEAgLTEzNCw4ICsxMzQsOCBAQAogICBkZXNjcmliZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgdHlwZSIgZG8KICAgICAgIHByb3QgPSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlULCAibWVzc2FnZSIpCi0gICAgICBwcm90LnR5cGUuc2hvdWxkID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQKLSAgICAgIHByb3QubWVzc2FnZS5zaG91bGQgPT0gIm1lc3NhZ2UiCisgICAgICBleHBlY3QocHJvdC50eXBlKS50byBlcShUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uOjpTSVpFX0xJTUlUKQorICAgICAgZXhwZWN0KHByb3QubWVzc2FnZSkudG8gZXEoIm1lc3NhZ2UiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzA1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKQEAgLTAsMCArMSw2MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworCitkZXNjcmliZSAnZ2VuZXJhdGlvbicgZG8KKyAgYmVmb3JlIGRvCisgICAgcmVxdWlyZSAnbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZGlkIG5vdCBnZW5lcmF0ZSB0aGUgd3JvbmcgZmlsZXMiIGRvCisgICAgcHJlZml4ID0gRmlsZS5leHBhbmRfcGF0aCgiLi4vZ2VuLXJiL2ZsYXQiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJnZW5lcmF0ZWQgdGhlIHJpZ2h0IGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYi9mbGF0IiwgX19GSUxFX18pCisgICAgWyJuYW1lc3BhY2VkX25vbmJsb2NraW5nX3NlcnZpY2UucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAidGhyaWZ0X25hbWVzcGFjZWRfc3BlY190eXBlcy5yYiIsCisgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgorICAgIF0uZWFjaCBkbyB8bmFtZXwKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQorICAgIGVuZAorICBlbmQKKworICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbworICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgInJlcXVpcmVkIGFuIGluY2x1ZGVkIGZpbGUiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKaW5kZXggMDg5MGE4Yi4uZGY0NzJhYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCkBAIC0yNSwyOCArMjUsMzIgQEAKICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAY2xpZW50ID0gVGhyaWZ0OjpIVFRQQ2xpZW50VHJhbnNwb3J0Lm5ldygiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIikKICAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBAY2xpZW50LnRvX3MgPT0gImh0dHA6Ly9teS5kb21haW4uY29tL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIKKyAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWx3YXlzIGJlIG9wZW4iIGRvCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgICAgQGNsaWVudC5jbG9zZQotICAgICAgQGNsaWVudC5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBjbGllbnQpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcG9zdCB2aWEgSFRUUCBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIiBkbwogICAgICAgQGNsaWVudC53cml0ZSAiYSB0ZXN0IgogICAgICAgQGNsaWVudC53cml0ZSAiIGZyYW1lIgotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJhIHRlc3QgZnJhbWUiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJhIHRlc3QgZnJhbWUiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKICAgICAgICAgICAgIGVuZAogICAgICAgICAgIGVuZAogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgICAgQGNsaWVudC5mbHVzaAotICAgICAgQGNsaWVudC5yZWFkKDEwKS5zaG91bGQgPT0gImRhdGEiCisgICAgICBleHBlY3QoQGNsaWVudC5yZWFkKDEwKSkudG8gZXEoImRhdGEiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZW5kIGN1c3RvbSBoZWFkZXJzIGlmIGRlZmluZWQiIGRvCkBAIC01NSwxNyArNTksODEgQEAKICAgICAgIGhlYWRlcnMgPSB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9Lm1lcmdlKGN1c3RvbV9oZWFkZXJzKQogCiAgICAgICBAY2xpZW50LmFkZF9oZWFkZXJzKGN1c3RvbV9oZWFkZXJzKQotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJ0ZXN0IiwgaGVhZGVycykuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAotICAgICAgICAgICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIGhlYWRlcnMpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCiAgICAgZW5kCisKKyAgICBpdCAnc2hvdWxkIHJlc2V0IHRoZSBvdXRidWYgb24gSFRUUCBmYWlsdXJlcycgZG8KKyAgICAgIEBjbGllbnQud3JpdGUgInRlc3QiCisKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgoZmFsc2UpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIHsgcmFpc2UgTmV0OjpSZWFkVGltZW91dCB9CisgICAgICAgIGVuZAorICAgICAgZW5kCisKKyAgICAgIEBjbGllbnQuZmx1c2ggIHJlc2N1ZQorICAgICAgZXhwZWN0KEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAb3V0YnVmKSkudG8gZXEoVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcikKKyAgICBlbmQKKworICBlbmQKKworICBkZXNjcmliZSAnc3NsIGVuYWJsZWQnIGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNlcnZpY2VfcGF0aCA9ICIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgorICAgICAgQHNlcnZlcl91cmkgPSAiaHR0cHM6Ly9teS5kb21haW4uY29tIgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCB1c2UgU1NMIGZvciBodHRwcyIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIpCisKKyAgICAgIGNsaWVudC53cml0ZSAidGVzdCIKKworICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgNDQzKSBkbworICAgICAgICBkb3VibGUoIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX1BFRVIpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnBvc3QpLndpdGgoQHNlcnZpY2VfcGF0aCwgInRlc3QiLAorICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIiA9PiAiYXBwbGljYXRpb24veC10aHJpZnQiKSBkbworICAgICAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8CisgICAgICAgICAgICAgIGV4cGVjdChyZXNwb25zZSkudG8gcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgICAgICAgIGVuZAorICAgICAgICAgIGVuZAorICAgICAgICBlbmQKKyAgICAgIGVuZAorICAgICAgY2xpZW50LmZsdXNoCisgICAgICBleHBlY3QoY2xpZW50LnJlYWQoNCkpLnRvIGVxKCJkYXRhIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgc2V0IFNTTCB2ZXJpZnkgbW9kZSB3aGVuIHNwZWNpZmllZCIgZG8KKyAgICAgIGNsaWVudCA9IFRocmlmdDo6SFRUUENsaWVudFRyYW5zcG9ydC5uZXcoIiN7QHNlcnZlcl91cml9I3tAc2VydmljZV9wYXRofSIsCisgICAgICAgICAgOnNzbF92ZXJpZnlfbW9kZSA9PiBPcGVuU1NMOjpTU0w6OlZFUklGWV9OT05FKQorCisgICAgICBjbGllbnQud3JpdGUgInRlc3QiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgICAgICAgZW5kCisgICAgICAgICAgZW5kCisgICAgICAgIGVuZAorICAgICAgZW5kCisgICAgICBjbGllbnQuZmx1c2gKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCmluZGV4IGEyOTRhYzUuLmZlMWFmN2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKQEAgLTMwLDI1MiArMzAsMjU3IEBACiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZXNjYXBlZCBjaGFyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9lc2NhcGVfY2hhcigiXG4iKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICdcdTAwMGEnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMGEnKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCIgIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnXHUwMDIwJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXHUwMDIwJykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBjaGFyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcbiIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJ1xcbicKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1xcbicpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiICIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJyAnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCcgJykKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcXCIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlxcXFwiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcXFxcIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJAIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnQCcKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ0AnKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIHN0cmluZyIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fc3RyaW5nKCJ0aGlzIGlzIGEgXFwganNvblxuc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcInRoaXMgaXMgYSBcXFxcIGpzb25cXG5zdHJpbmdcIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYmFzZTY0IiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9iYXNlNjQoInRoaXMgaXMgYSBiYXNlNjQgc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJcImRHaHBjeUJwY3lCaElHSmhjMlUyTkNCemRISnBibWM9XFxuXCJcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gaW50ZWdlciIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcig0NSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiNDUiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI0NSIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMzAwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMzMwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMzAwMCIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcigzMDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzAwMDAwMDAwMCIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25faW50ZWdlcig2MDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICI2MDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNjAwMDAwMDAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZG91YmxlIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoMTIuMykKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMTIuMyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEyLjMiKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgtMy4yMSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiLTMuMjEiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMy4yMSIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgoKzEuMC8wLjApLygrMS4wLzAuMCkpKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIk5hTlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJOYU5cIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgrMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiSW5maW5pdHlcIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKCgtMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiLUluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIi1JbmZpbml0eVwiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3Qgc3RhcnQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX29iamVjdF9zdGFydAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ7IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgieyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gb2JqZWN0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYXJyYXkgc3RhcnQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2FycmF5X3N0YXJ0Ci0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2FycmF5X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG1lc3NhZ2UgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCJuYW1lIiwgMTIsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbMSxcIm5hbWVcIiwxMiwzMiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsxLFwibmFtZVwiLDEyLDMyIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHN0cnVjdCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX3N0cnVjdF9iZWdpbigibmFtZSIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gInsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc3RydWN0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX3N0cnVjdF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBmaWVsZCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX2ZpZWxkX2JlZ2luKCJuYW1lIiwgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMzJ7XCJyZWNcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMye1wicmVjXCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBmaWVsZCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9maWVsZF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBmaWVsZCBzdG9wIiBkbwogICAgICAgQHByb3Qud3JpdGVfZmllbGRfc3RvcAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtYXAgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9tYXBfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCBUaHJpZnQ6OlR5cGVzOjpMSVNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiW1wicmVjXCIsXCJsc3RcIiwzMix7IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsXCJsc3RcIiwzMix7IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWFwIGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX21hcF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAifV0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9XSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGxpc3QgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9saXN0X2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIltcInJlY1wiLDMyIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBsaXN0IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2xpc3RfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc2V0IGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfc2V0X2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIltcInJlY1wiLDMyIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiW1wicmVjXCIsMzIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfc2V0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJdIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGJvb2wiIGRvCiAgICAgICBAcHJvdC53cml0ZV9ib29sKHRydWUpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxIikKIAogICAgICAgQHByb3Qud3JpdGVfYm9vbChmYWxzZSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBieXRlIiBkbwogICAgICAgQHByb3Qud3JpdGVfYnl0ZSgxMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGkxNiIgZG8KICAgICAgIEBwcm90LndyaXRlX2kxNigxMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGkzMiIgZG8KICAgICAgIEBwcm90LndyaXRlX2kzMigzMDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzAwMDAwMDAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGk2NCIgZG8KICAgICAgIEBwcm90LndyaXRlX2k2NCg2MDAwMDAwMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICI2MDAwMDAwMDAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiNjAwMDAwMDAwMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGRvdWJsZSIgZG8KICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgxLjIzKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxLjIzIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMS4yMyIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgtMzIuMSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiLTMyLjEiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCItMzIuMSIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKCsxLjAvMC4wKS8oKzEuMC8wLjApKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJOYU5cIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiTmFOXCIiKQogCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKCsxLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJJbmZpbml0eVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKCgtMS4wLzAuMCkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiLUluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIi1JbmZpbml0eVwiIikKICAgICBlbmQKIAogICAgIGlmIFJVQllfVkVSU0lPTiA+PSAnMS45JwogICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCiAgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKICAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICAgIGEuc2hvdWxkID09ICcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgICBleHBlY3QoYSkudG8gZXEoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCiAgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIikKICAgICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICAgIGEuc2hvdWxkID09ICJcInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRFwiIi5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChhKS50byBlcSgiXCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQURcIiIuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAgICAgZWxzZQogICAgICAgaXQgJ3Nob3VsZCB3cml0ZSBzdHJpbmcnIGRvCiAgICAgICAgIEBwcm90LndyaXRlX3N0cmluZygndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKLSAgICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicKKyAgICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGJpbmFyeSIgZG8KICAgICAgIEBwcm90LndyaXRlX2JpbmFyeSgidGhpcyBpcyBhIGJhc2U2NCBzdHJpbmciKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cXG5cIlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgd3JpdGUgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoKDAuLi4yNTYpLnRvX2EucGFjaygnQyonKSkKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdldCB0eXBlIG5hbWUgZm9yIHR5cGUgaWQiIGRvCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RPUCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Vk9JRCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJPT0wpLnNob3VsZCA9PSAidGYiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpLnNob3VsZCA9PSAiaTgiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkuc2hvdWxkID09ICJkYmwiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkxNikuc2hvdWxkID09ICJpMTYiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikuc2hvdWxkID09ICJpMzIiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkuc2hvdWxkID09ICJpNjQiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUklORykuc2hvdWxkID09ICJzdHIiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkuc2hvdWxkID09ICJyZWMiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkuc2hvdWxkID09ICJtYXAiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNFVCkuc2hvdWxkID09ICJzZXQiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpLnNob3VsZCA9PSAibHN0IgorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Qk9PTCkpLnRvIGVxKCJ0ZiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCWVRFKSkudG8gZXEoImk4IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkpLnRvIGVxKCJkYmwiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoImkxNiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMzIpKS50byBlcSgiaTMyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkpLnRvIGVxKCJpNjQiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKSkudG8gZXEoInN0ciIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpKS50byBlcSgicmVjIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkpLnRvIGVxKCJtYXAiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U0VUKSkudG8gZXEoInNldCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoImxzdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdldCB0eXBlIGlkIGZvciB0eXBlIG5hbWUiIGRvCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInBwIil9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpCT09MCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpOCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpCWVRFCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJkYmwiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6RE9VQkxFCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STE2Ci0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMzIiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STMyCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpNjQiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STY0Ci0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U1RSSU5HCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJyZWMiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U1RSVUNUCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJtYXAiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6TUFQCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U0VUCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJsc3QiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6TElTVAorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInRmIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJPT0wpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTgiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6QllURSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJkYmwiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkxNiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMTYpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTMyIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpNjQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STY0KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInN0ciIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicmVjIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJtYXAiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInNldCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTRVQpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibHN0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkxJU1QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzeW50YXggY2hhciIgZG8KQEAgLTI4Nyw0NyArMjkyLDY4IEBACiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBlc2NhcGUgY2hhciIgZG8KICAgICAgIEB0cmFucy53cml0ZSgnMDA1NCcpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZXNjYXBlX2NoYXIuc2hvdWxkID09ICdUJworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhcikudG8gZXEoJ1QnKQorCisgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlwiIikKKworICAgICAgQHRyYW5zLndyaXRlKCJcIlxcXFxcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcXCIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXC9cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcLyIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcYiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXGZcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcZiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcbiIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHJcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcciIpCisKKyAgICAgIEB0cmFucy53cml0ZSgiXCJcXHRcIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzdHJpbmciIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlwiXFxQIikKICAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSl9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCiAKLSAgICAgIEB0cmFucy53cml0ZSgiXCJcXG5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKS5zaG91bGQgPT0gIlxcbiIKLQogICAgICAgQHRyYW5zLndyaXRlKCJcInRoaXMgaXMgYSB0ZXN0IHN0cmluZ1wiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9zdHJpbmcuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZykudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBiYXNlNjQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9iYXNlNjQuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2Jhc2U2NCkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGlzIGpzb24gbnVtZXJpYyIgZG8KLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpLnNob3VsZCA9PSBmYWxzZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIrIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiLSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIwIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiMSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIzIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNCIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI2Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNyIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI5Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiRSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoImUiKS5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiQSIpKS50byBlcShmYWxzZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIisiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi0iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIi4iKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjEiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjIiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjQiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjciKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjgiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoIkUiKSkudG8gZXEodHJ1ZSkKKyAgICAgIGV4cGVjdChAcHJvdC5pc19qc29uX251bWVyaWMoImUiKSkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG51bWVyaWMgY2hhcnMiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzRTQ1VCIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fbnVtZXJpY19jaGFycy5zaG91bGQgPT0gIjEuNDUzRTQ1IgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9udW1lcmljX2NoYXJzKS50byBlcSgiMS40NTNFNDUiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gaW50ZWdlciIgZG8KQEAgLTMzNiw3ICszNjIsNyBAQAogICAgICAgQHByb3QucmVhZF9zdHJpbmcKIAogICAgICAgQHRyYW5zLndyaXRlKCIxNDUzVCIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25faW50ZWdlci5zaG91bGQgPT0gMTQ1MworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9pbnRlZ2VyKS50byBlcSgxNDUzKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gZG91YmxlIiBkbwpAQCAtMzQ4LDM3ICszNzQsMzcgQEAKICAgICAgIGV4cGVjdCB7QHByb3QucmVhZF9qc29uX2RvdWJsZX0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKIAogICAgICAgQHRyYW5zLndyaXRlKCIxLjQ1M2UwMVwiXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2RvdWJsZS5zaG91bGQgPT0gMTQuNTMKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgxNC41MykKICAgICAgIEBwcm90LnJlYWRfc3RyaW5nCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJOYU5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLm5hbj8uc2hvdWxkID09IHRydWUKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlLm5hbj8pLnRvIGVxKHRydWUpCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJJbmZpbml0eVwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUuc2hvdWxkID09ICsxLjAvMC4wCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoKzEuMC8wLjApCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCItSW5maW5pdHlcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLnNob3VsZCA9PSAtMS4wLzAuMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKC0xLjAvMC4wKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IHN0YXJ0IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ7IikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9vYmplY3Rfc3RhcnQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9vYmplY3Rfc3RhcnQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIG9iamVjdCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn0iKQotICAgICAgQHByb3QucmVhZF9qc29uX29iamVjdF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9vYmplY3RfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBhcnJheSBzdGFydCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiWyIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fYXJyYXlfc3RhcnQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gYXJyYXkgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9hcnJheV9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9hcnJheV9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZF9tZXNzYWdlX2JlZ2luIiBkbwpAQCAtMzg2LDEyOCArNDEyLDE0MSBAQAogICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW59LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24pCiAKICAgICAgIEB0cmFucy53cml0ZSgiWzEsXCJuYW1lXCIsMTIsMzJcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbi5zaG91bGQgPT0gWyJuYW1lIiwgMTIsIDMyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbikudG8gZXEoWyJuYW1lIiwgMTIsIDMyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBtZXNzYWdlIGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXSIpCi0gICAgICBAcHJvdC5yZWFkX21lc3NhZ2VfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21lc3NhZ2VfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ7IikKLSAgICAgIEBwcm90LnJlYWRfc3RydWN0X2JlZ2luLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9iZWdpbikudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHN0cnVjdCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn0iKQotICAgICAgQHByb3QucmVhZF9zdHJ1Y3RfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cnVjdF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBiZWdpbiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMXtcInJlY1wiIikKLSAgICAgIEBwcm90LnJlYWRfZmllbGRfYmVnaW4uc2hvdWxkID09IFtuaWwsIDEyLCAxXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfYmVnaW4pLnRvIGVxKFtuaWwsIDEyLCAxXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBmaWVsZCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIn0iKQotICAgICAgQHByb3QucmVhZF9maWVsZF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfZmllbGRfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIixcImxzdFwiLDIseyIpCi0gICAgICBAcHJvdC5yZWFkX21hcF9iZWdpbi5zaG91bGQgPT0gWzEyLCAxNSwgMl0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoWzEyLCAxNSwgMl0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbWFwIGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifV0iKQotICAgICAgQHByb3QucmVhZF9tYXBfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2xpc3RfYmVnaW4uc2hvdWxkID09IFsxMiwgMl0KKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfYmVnaW4pLnRvIGVxKFsxMiwgMl0pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgbGlzdCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9saXN0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9saXN0X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHNldCBiZWdpbiIgZG8KLSAgICAgIEB0cmFucy53cml0ZSgiWyIpCi0gICAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gbmlsCisgICAgICBAdHJhbnMud3JpdGUoIltcInJlY1wiLDJcIlwiIikKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3NldF9iZWdpbikudG8gZXEoWzEyLCAyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBzZXQgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfc2V0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zZXRfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYm9vbCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgICAgICBAcHJvdC5yZWFkX3N0cmluZwogCiAgICAgICBAdHJhbnMud3JpdGUoIjFcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfYm9vbC5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEodHJ1ZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBieXRlIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCI2MFwiXCIiKQotICAgICAgQHByb3QucmVhZF9ieXRlLnNob3VsZCA9PSA2MAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoNjApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaTE2IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxMDAwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2kxNi5zaG91bGQgPT0gMTAwMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTE2KS50byBlcSgxMDAwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGkzMiIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMzAwMDAwMDAwMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IDMwMDAwMDAwMDAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoMzAwMDAwMDAwMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpNjQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjYwMDAwMDAwMDBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfaTY0LnNob3VsZCA9PSA2MDAwMDAwMDAwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pNjQpLnRvIGVxKDYwMDAwMDAwMDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgZG91YmxlIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxMi4yM1wiXCIiKQotICAgICAgQHByb3QucmVhZF9kb3VibGUuc2hvdWxkID09IDEyLjIzCisgICAgICBleHBlY3QoQHByb3QucmVhZF9kb3VibGUpLnRvIGVxKDEyLjIzKQogICAgIGVuZAogCiAgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCiAgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nJyBkbwogICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKICAgICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICAgIGEuc2hvdWxkID09ICd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgICBleHBlY3QoYSkudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KICAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIicuZm9yY2VfZW5jb2RpbmcoRW5jb2Rpbmc6OkJJTkFSWSkpCiAgICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgICBhLnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEIgotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQogICAgICAgZW5kCiAgICAgZWxzZQogICAgICAgaXQgJ3Nob3VsZCByZWFkIHN0cmluZycgZG8KICAgICAgICAgQHRyYW5zLndyaXRlKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCi0gICAgICAgIEBwcm90LnJlYWRfc3RyaW5nLnNob3VsZCA9PSAndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJworICAgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgYmluYXJ5IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJcImRHaHBjeUJwY3lCaElIUmxjM1FnYzNSeWFXNW5cIiIpCi0gICAgICBAcHJvdC5yZWFkX2JpbmFyeS5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2JpbmFyeSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHJlYWQgbG9uZyBiaW5hcnkiIGRvCisgICAgICBAdHJhbnMud3JpdGUoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkuYnl0ZXMudG9fYSkudG8gZXEoKDAuLi4yNTYpLnRvX2EpCisgICAgZW5kCisgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgianNvbihtZW1vcnkpIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBKc29uUHJvdG9jb2wiIGRvCi0gICAgICBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImpzb24iKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbW9uZ3JlbF9odHRwX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbW9uZ3JlbF9odHRwX3NlcnZlcl9zcGVjLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTExYjM1Li4wMDAwMDAwCi0tLSBhL2xpYi9yYi9zcGVjL21vbmdyZWxfaHR0cF9zZXJ2ZXJfc3BlYy5yYgorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotcmVxdWlyZSAnc3BlY19oZWxwZXInCi1yZXF1aXJlICd0aHJpZnQvc2VydmVyL21vbmdyZWxfaHR0cF9zZXJ2ZXInCi0KLWRlc2NyaWJlICdIVFRQU2VydmVyJyBkbwotCi0gIGRlc2NyaWJlIFRocmlmdDo6TW9uZ3JlbEhUVFBTZXJ2ZXIgZG8KLSAgICBpdCAic2hvdWxkIGhhdmUgYXBwcm9wcmlhdGUgZGVmYXVsdHMiIGRvCi0gICAgICBtb2NrX2ZhY3RvcnkgPSBtb2NrKCJCaW5hcnlQcm90b2NvbEZhY3RvcnkiKQotICAgICAgbW9ja19wcm9jID0gbW9jaygiUHJvY2Vzc29yIikKLSAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4obW9ja19mYWN0b3J5KQotICAgICAgTW9uZ3JlbDo6SHR0cFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCIwLjAuMC4wIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlciIpLnRhcCBkbyB8bW9ja3wKLSAgICAgICAgICBoYW5kbGVyID0gbW9jaygiSGFuZGxlciIpCi0gICAgICAgICAgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG1vY2tfcHJvYywgbW9ja19mYWN0b3J5KS5hbmRfcmV0dXJuKGhhbmRsZXIpCi0gICAgICAgICAgbW9jay5zaG91bGRfcmVjZWl2ZSg6cmVnaXN0ZXIpLndpdGgoIi8iLCBoYW5kbGVyKQotICAgICAgICBlbmQKLSAgICAgIGVuZAotICAgICAgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlci5uZXcobW9ja19wcm9jKQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCB1bmRlcnN0YW5kIDppcCwgOnBvcnQsIDpwYXRoLCBhbmQgOnByb3RvY29sX2ZhY3RvcnkiIGRvCi0gICAgICBtb2NrX3Byb2MgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgbW9ja19mYWN0b3J5ID0gbW9jaygiUHJvdG9jb2xGYWN0b3J5IikKLSAgICAgIE1vbmdyZWw6Okh0dHBTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgiMS4yLjMuNCIsIDEyMzQpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlciIpLnRhcCBkbyB8bW9ja3wKLSAgICAgICAgICBoYW5kbGVyID0gbW9jaygiSGFuZGxlciIpCi0gICAgICAgICAgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG1vY2tfcHJvYywgbW9ja19mYWN0b3J5KS5hbmRfcmV0dXJuKGhhbmRsZXIpCi0gICAgICAgICAgbW9jay5zaG91bGRfcmVjZWl2ZSg6cmVnaXN0ZXIpLndpdGgoIi9mb28iLCBoYW5kbGVyKQotICAgICAgICBlbmQKLSAgICAgIGVuZAotICAgICAgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlci5uZXcobW9ja19wcm9jLCA6aXAgPT4gIjEuMi4zLjQiLCA6cG9ydCA9PiAxMjM0LCA6cGF0aCA9PiAiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IG1vY2tfZmFjdG9yeSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgTW9uZ3JlbDo6SHR0cFNlcnZlciIgZG8KLSAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LnN0dWIhKDpuZXcpCi0gICAgICBNb25ncmVsOjpIdHRwU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTW9uZ3JlbDo6SHR0cFNlcnZlciIpLnRhcCBkbyB8bW9ja3wKLSAgICAgICAgICBUaHJpZnQ6Ok1vbmdyZWxIVFRQU2VydmVyOjpIYW5kbGVyLnN0dWIhKDpuZXcpCi0gICAgICAgICAgbW9jay5zdHViISg6cmVnaXN0ZXIpCi0gICAgICAgICAgbW9jay5zaG91bGRfcmVjZWl2ZSg6cnVuKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJNb25ncmVsOjpIdHRwU2VydmVyLnJ1biIpLnRhcCBkbyB8cnVubmVyfAotICAgICAgICAgICAgICBydW5uZXIuc2hvdWxkX3JlY2VpdmUoOmpvaW4pCi0gICAgICAgICAgICBlbmQKLSAgICAgICAgICBlbmQKLSAgICAgICAgZW5kCi0gICAgICBlbmQKLSAgICAgIFRocmlmdDo6TW9uZ3JlbEhUVFBTZXJ2ZXIubmV3KG5pbCkuc2VydmUKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVzY3JpYmUgVGhyaWZ0OjpNb25ncmVsSFRUUFNlcnZlcjo6SGFuZGxlciBkbwotICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQGZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgQGhhbmRsZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBmYWN0b3J5KQotICAgIGVuZAotCi0gICAgaXQgInNob3VsZCByZXR1cm4gNDA0IGZvciBub24tUE9TVCByZXF1ZXN0cyIgZG8KLSAgICAgIHJlcXVlc3QgPSBtb2NrKCJyZXF1ZXN0IiwgOnBhcmFtcyA9PiB7IlJFUVVFU1RfTUVUSE9EIiA9PiAiR0VUIn0pCi0gICAgICByZXNwb25zZSA9IG1vY2soInJlc3BvbnNlIikKLSAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpzdGFydCkud2l0aCg0MDQpCi0gICAgICByZXNwb25zZS5zaG91bGRfbm90X3JlY2VpdmUoOnN0YXJ0KS53aXRoKDIwMCkKLSAgICAgIEBoYW5kbGVyLnByb2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgZW5kCi0KLSAgICBpdCAic2hvdWxkIHNlcnZlIHVzaW5nIGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiBkbwotICAgICAgcmVxdWVzdCA9IG1vY2soInJlcXVlc3QiLCA6cGFyYW1zID0+IHsiUkVRVUVTVF9NRVRIT0QiID0+ICJQT1NUIn0sIDpib2R5ID0+IG5pbCkKLSAgICAgIHJlc3BvbnNlID0gbW9jaygicmVzcG9uc2UiKQotICAgICAgaGVhZCA9IG1vY2soImhlYWQiKQotICAgICAgaGVhZC5zaG91bGRfcmVjZWl2ZSg6W109KS53aXRoKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQotICAgICAgVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5zdHViISg6bmV3KQotICAgICAgQGZhY3Rvcnkuc3R1YiEoOmdldF9wcm90b2NvbCkKLSAgICAgIEBwcm9jZXNzb3Iuc3R1YiEoOnByb2Nlc3MpCi0gICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6c3RhcnQpLndpdGgoMjAwKS5hbmRfeWllbGQoaGVhZCwgbmlsKQotICAgICAgQGhhbmRsZXIucHJvY2VzcyhyZXF1ZXN0LCByZXNwb25zZSkKLSAgICBlbmQKLQotICAgIGl0ICJzaG91bGQgdXNlIHRoZSBJT1N0cmVhbVRyYW5zcG9ydCIgZG8KLSAgICAgIGJvZHkgPSBtb2NrKCJib2R5IikKLSAgICAgIHJlcXVlc3QgPSBtb2NrKCJyZXF1ZXN0IiwgOnBhcmFtcyA9PiB7IlJFUVVFU1RfTUVUSE9EIiA9PiAiUE9TVCJ9LCA6Ym9keSA9PiBib2R5KQotICAgICAgcmVzcG9uc2UgPSBtb2NrKCJyZXNwb25zZSIpCi0gICAgICBoZWFkID0gbW9jaygiaGVhZCIpCi0gICAgICBoZWFkLnN0dWIhKDpbXT0pCi0gICAgICBvdXQgPSBtb2NrKCJvdXQiKQotICAgICAgcHJvdG9jb2wgPSBtb2NrKCJwcm90b2NvbCIpCi0gICAgICB0cmFuc3BvcnQgPSBtb2NrKCJ0cmFuc3BvcnQiKQotICAgICAgVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGJvZHksIG91dCkuYW5kX3JldHVybih0cmFuc3BvcnQpCi0gICAgICBAZmFjdG9yeS5zaG91bGRfcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKHRyYW5zcG9ydCkuYW5kX3JldHVybihwcm90b2NvbCkKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLndpdGgocHJvdG9jb2wsIHByb3RvY29sKQotICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KS53aXRoKDIwMCkuYW5kX3lpZWxkKGhlYWQsIG91dCkKLSAgICAgIEBoYW5kbGVyLnByb2Nlc3MocmVxdWVzdCwgcmVzcG9uc2UpCi0gICAgZW5kCi0gIGVuZAotZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2ZDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgpAQCAtMCwwICsxLDY3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCisKK2Rlc2NyaWJlICduYW1lc3BhY2VkIGdlbmVyYXRpb24nIGRvCisgIGJlZm9yZSBkbworICAgIHJlcXVpcmUgJ25hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlJworICBlbmQKKworICBpdCAiZ2VuZXJhdGVkIHRoZSByaWdodCBmaWxlcyIgZG8KKyAgICBwcmVmaXggPSBGaWxlLmV4cGFuZF9wYXRoKCIuLi9nZW4tcmIiLCBfX0ZJTEVfXykKKyAgICBbIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvbmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgIm5hbWVzcGFjZWRfc3BlY19uYW1lc3BhY2UvdGhyaWZ0X25hbWVzcGFjZWRfc3BlY19jb25zdGFudHMucmIiLAorICAgICAibmFtZXNwYWNlZF9zcGVjX25hbWVzcGFjZS90aHJpZnRfbmFtZXNwYWNlZF9zcGVjX3R5cGVzLnJiIiwKKyAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCisgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS50byBiZV90cnV0aHkKKyAgICBlbmQKKyAgZW5kCisKKyAgaXQgImRpZCBub3QgZ2VuZXJhdGUgdGhlIHdyb25nIGZpbGVzIiBkbworICAgIHByZWZpeCA9IEZpbGUuZXhwYW5kX3BhdGgoIi4uL2dlbi1yYiIsIF9fRklMRV9fKQorICAgIFsibmFtZXNwYWNlZF9ub25ibG9ja2luZ19zZXJ2aWNlLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfY29uc3RhbnRzLnJiIiwKKyAgICAgInRocmlmdF9uYW1lc3BhY2VkX3NwZWNfdHlwZXMucmIiLAorICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAorICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKKyAgICBdLmVhY2ggZG8gfG5hbWV8CisgICAgICBleHBlY3QoRmlsZS5leGlzdD8oRmlsZS5qb2luKHByZWZpeCwgbmFtZSkpKS5ub3RfdG8gYmVfdHJ1dGh5CisgICAgZW5kCisgIGVuZAorCisgIGl0ICJoYXMgYSBzZXJ2aWNlIGNsYXNzIGluIHRoZSByaWdodCBwbGFjZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpKS50byBiZV90cnV0aHkKKyAgZW5kCisKKyAgaXQgImhhcyBhIHN0cnVjdCBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQorICBlbmQKKworICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CisgIGVuZAorCisgIGl0ICJleHRlbmRlZCBhIHNlcnZpY2UiIGRvCisgICAgcmVxdWlyZSAiZXh0ZW5kZWQvZXh0ZW5kZWRfc2VydmljZSIKKyAgZW5kCisKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgppbmRleCA3MTJjZjQ1Li42MTNkODgzIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgpAQCAtMTc2LDggKzE3Niw4IEBACiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSBiYXNpYyBtZXNzYWdlIHBhc3NpbmciIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyhmYWxzZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpKQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgIGVuZAogICAgICAgNC50aW1lcyB7IHRyYW5zX3F1ZXVlLnBvcCB9CiAgICAgICBzZXR1cF9jbGllbnQudW5ibG9jayg0KQotICAgICAgNC50aW1lcyB7IHF1ZXVlLnBvcC5zaG91bGQgYmVfdHJ1ZSB9CisgICAgICA0LnRpbWVzIHsgZXhwZWN0KHF1ZXVlLnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjEyLDE1ICsyMTIsMTUgQEAKICAgICAgIHF1ZXVlc1s0XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s1XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s2XSA8PCA6aGVsbG8KLSAgICAgIDMudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKKyAgICAgIDMudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KSB9CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBxdWV1ZXNbNV0gPDwgWzp1bmJsb2NrLCA0XQotICAgICAgNC50aW1lcyB7IHJlc3VsdC5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChyZXN1bHQucG9wKS50byBiZV90cnV0aHkgfQogICAgICAgcXVldWVzWzJdIDw8IDpoZWxsbwotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIDcudGltZXMgeyBxdWV1ZXMuc2hpZnQgPDwgOmV4aXQgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKICAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkgIyBmb3JjZSBhIG1lc3NhZ2UgcGFzcwogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyBhY3RpdmUgbWVzc2FnZXMgd2hlbiBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjM4LDggKzIzOCw4IEBACiAgICAgICBjbGllbnQgPDwgOnNsZWVwCiAgICAgICBzbGVlcCAwLjEgIyBnaXZlIHRoZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBjbGllbnQncyBtZXNzYWdlCiAgICAgICBAc2VydmVyLnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCi0gICAgICByZXN1bHQucG9wLnNob3VsZCA9PSA6c2xlcHQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCisgICAgICBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoOnNsZXB0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBraWxsIGFjdGl2ZSBtZXNzYWdlcyB3aGVuIHRoZXkgZG9uJ3QgZXhwaXJlIHdoaWxlIHNodXR0aW5nIGRvd24iIGRvCkBAIC0yNDksMTUgKzI0OSwxNSBAQAogICAgICAgc2xlZXAgMC4xICMgc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bigxKQogICAgICAgQGNhdGNoX2V4Y2VwdGlvbnMgPSB0cnVlCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDMpLnNob3VsZF9ub3QgYmVfbmlsCi0gICAgICByZXN1bHQuc2hvdWxkIGJlX2VtcHR5CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigzKSkubm90X3RvIGJlX25pbAorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfZW1wdHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxsb3cgc2h1dHRpbmcgZG93biBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UiIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBjbGllbnQuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkX25vdCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS5ub3RfdG8gYmVfbmlsCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCmluZGV4IDk4OWY1Y2MuLmQzMDU1M2YgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCkBAIC0yNyw1MiArMjcsNTIgQEAKIAogICBkZXNjcmliZSBUaHJpZnQ6OlByb2Nlc3NvciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhtb2NrKCJNb2NrSGFuZGxlciIpKQotICAgICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgICAgQHByb2Nlc3NvciA9IFByb2Nlc3NvclNwZWMubmV3KGRvdWJsZSgiTW9ja0hhbmRsZXIiKSkKKyAgICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIGVuZAogCiAgICAgZGVmIG1vY2tfdHJhbnMob2JqKQotICAgICAgb2JqLnNob3VsZF9yZWNlaXZlKDp0cmFucykub3JkZXJlZC5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soInRyYW5zIikudGFwIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChvYmopLnRvIHJlY2VpdmUoOnRyYW5zKS5vcmRlcmVkIGRvCisgICAgICAgIGRvdWJsZSgidHJhbnMiKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2FsbCBwcm9jZXNzXzxtZXNzYWdlPiB3aGVuIGl0IHJlY2VpdmVzIHRoYXQgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3XQotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2Vzc190ZXN0TWVzc2FnZSkud2l0aCgxNywgQHByb3QsIEBwcm90KS5vcmRlcmVkCi0gICAgICBAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KS5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3XQorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IucHJvY2VzcyhAcHJvdCwgQHByb3QpKS50byBlcSh0cnVlKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSByZWNlaXZlZCBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCA0XQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgNCkub3JkZXJlZAotICAgICAgZSA9IG1vY2soVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikKLSAgICAgIGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJVbmtub3duIGZ1bmN0aW9uIHRlc3RNZXNzYWdlIikuYW5kX3JldHVybihlKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgNF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKKyAgICAgIGUgPSBkb3VibGUoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgIGV4cGVjdChlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgIlVua25vd24gZnVuY3Rpb24gdGVzdE1lc3NhZ2UiKS5hbmRfcmV0dXJuKGUpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCiAgICAgICBtb2NrX3RyYW5zKEBwcm90KQogICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyBhcmdzIG9mZiB0byB0aGUgYXJncyBjbGFzcyIgZG8KLSAgICAgIGFyZ3NfY2xhc3MgPSBtb2NrKCJNb2NrQXJnc0NsYXNzIikKLSAgICAgIGFyZ3MgPSBtb2NrKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50YXAgZG8gfGFyZ3N8Ci0gICAgICAgIGFyZ3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGFyZ3NfY2xhc3MgPSBkb3VibGUoIk1vY2tBcmdzQ2xhc3MiKQorICAgICAgYXJncyA9IGRvdWJsZSgiIzxNb2NrQXJnc0NsYXNzOm1vY2s+IikudGFwIGRvIHxhcmdzfAorICAgICAgICBleHBlY3QoYXJncykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAogICAgICAgZW5kCi0gICAgICBhcmdzX2NsYXNzLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm9jZXNzb3IucmVhZF9hcmdzKEBwcm90LCBhcmdzX2NsYXNzKS5zaG91bGQgZXFsKGFyZ3MpCisgICAgICBleHBlY3QoYXJnc19jbGFzcykudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGFyZ3MKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IucmVhZF9hcmdzKEBwcm90LCBhcmdzX2NsYXNzKSkudG8gZXFsKGFyZ3MpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG91dCBhIHJlcGx5IHdoZW4gYXNrZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCi0gICAgICByZXN1bHQgPSBtb2NrKCJNb2NrUmVzdWx0IikKLSAgICAgIHJlc3VsdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgMjMpLm9yZGVyZWQKKyAgICAgIHJlc3VsdCA9IGRvdWJsZSgiTW9ja1Jlc3VsdCIpCisgICAgICBleHBlY3QocmVzdWx0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3Iud3JpdGVfcmVzdWx0KHJlc3VsdCwgQHByb3QsICd0ZXN0TWVzc2FnZScsIDIzKQogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCmluZGV4IDU5OWI0NTQuLjJhN2RjNmQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKQEAgLTI1LDE5ICsyNSwxOSBAQAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCiAgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKICAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQotICAgICAgZGF0YS5zaG91bGQgPT0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCisgICAgICBleHBlY3QoZGF0YSkudG8gZXEoIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgc3RydWN0cyB0byB0aGUgZ2l2ZW4gcHJvdG9jb2wiIGRvCi0gICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBkb3VibGUoIlByb3RvY29sRmFjdG9yeSIpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCiAgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQogICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKQEAgLTQ3LDIxICs0NywyMSBAQAogICAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgc3RydWN0cyBmcm9tIGJpbmFyeSBieSBkZWZhdWx0IiBkbwogICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3CiAgICAgICBkYXRhID0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCi0gICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCBkYXRhKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKQorICAgICAgZXhwZWN0KGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsIGRhdGEpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybihbImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IG1vY2soIlByb3RvY29sRmFjdG9yeSIpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnN0dWIhKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQogICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCi0gICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCAiIikuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikKKyAgICAgIGV4cGVjdChkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCAiIikpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKaW5kZXggMTMwMWQ1NC4uZWM5ZTU1MCAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpAQCAtMjgsNTIgKzI4LDU3IEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBob3N0IGFyZ3VtZW50IiBkbwogICAgICAgQHNvY2tldCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldygnbG9jYWxob3N0JywgMTIzNCkKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCdsb2NhbGhvc3QnLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCdsb2NhbGhvc3QnLCAxMjM0KQorICAgICAgQHNvY2tldC50b19zID09ICJzZXJ2ZXIobG9jYWxob3N0OjEyMzQpIgogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgVGhyaWZ0OjpTb2NrZXQgdG8gd3JhcCBhY2NlcHRlZCBzb2NrZXRzIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIikKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBzb2NrID0gbW9jaygic29jayIpCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQotICAgICAgdHJhbnMgPSBtb2NrKCJTb2NrZXQiKQotICAgICAgVGhyaWZ0OjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgPT0gdHJhbnMKKyAgICAgIHNvY2sgPSBkb3VibGUoInNvY2siKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCisgICAgICB0cmFucyA9IGRvdWJsZSgiU29ja2V0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGVxKHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgaGFuZGxlIHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB3aGVuIGFjY2VwdGluZyBpZiB0aGVyZSBpcyBubyBoYW5kbGUiIGRvCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgY2xvc2VkPyB3aGVuIGFwcHJvcHJpYXRlIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBUQ1BTZXJ2ZXIuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgic29ja2V0KDoxMjM0KSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCmluZGV4IGVhZWNiZGEuLjU3ZjUyMzcgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCkBAIC0yMSw5NSArMjEsMTM1IEBACiBkZXNjcmliZSAnU2VydmVyJyBkbwogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVNlcnZlciBkbwotICAgIGl0ICJzaG91bGQgZGVmYXVsdCB0byBCYXNlVHJhbnNwb3J0RmFjdG9yeSBhbmQgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHdoZW4gbm90IHNwZWNpZmllZCIgZG8KLSAgICAgIHNlcnZlciA9IFRocmlmdDo6QmFzZVNlcnZlci5uZXcobW9jaygiUHJvY2Vzc29yIiksIG1vY2soIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAcHJvdG9jb2xfZmFjdG9yeScpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkKKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCi0gICAgIyBzZXJ2ZSBpcyBhIG5vb3AsIHNvIGNhbid0IHRlc3QgdGhhdAorICAgIGl0ICJzaG91bGQgZGVmYXVsdCB0byBCYXNlVHJhbnNwb3J0RmFjdG9yeSBhbmQgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHdoZW4gbm90IHNwZWNpZmllZCIgZG8KKyAgICAgIEBzZXJ2ZXIgPSBUaHJpZnQ6OkJhc2VTZXJ2ZXIubmV3KGRvdWJsZSgiUHJvY2Vzc29yIiksIGRvdWJsZSgiQmFzZVNlcnZlclRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRyYW5zcG9ydF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAcHJvdG9jb2xfZmFjdG9yeScpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgbm90IHNlcnZlIiBkbworICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSgpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgic2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkiKQorICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OlNpbXBsZVNlcnZlciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQHNlcnZlclRyYW5zID0gbW9jaygiU2VydmVyVHJhbnNwb3J0IikKLSAgICAgIEB0cmFucyA9IG1vY2soIkJhc2VUcmFuc3BvcnQiKQotICAgICAgQHByb3QgPSBtb2NrKCJCYXNlUHJvdG9jb2wiKQotICAgICAgQGNsaWVudCA9IG1vY2soIkNsaWVudCIpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKICAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKICAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNpbXBsZShzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW4gdGhlIG1haW4gdGhyZWFkIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gdGhyb3cgOnN0b3AKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8gdGhyb3dfc3ltYm9sKDpzdG9wKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBAc2VydmVyVHJhbnMgPSBtb2NrKCJTZXJ2ZXJUcmFuc3BvcnQiKQotICAgICAgQHRyYW5zID0gbW9jaygiQmFzZVRyYW5zcG9ydCIpCi0gICAgICBAcHJvdCA9IG1vY2soIkJhc2VQcm90b2NvbCIpCi0gICAgICBAY2xpZW50ID0gbW9jaygiQ2xpZW50IikKKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQogICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRlZChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgdGhyZWFkcyIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcHJvdCwgQHRyYW5zKS5leGFjdGx5KDMpLnRpbWVzLmFuZF95aWVsZChAcHJvdCwgQHRyYW5zKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBAc2VydmVyX3RyYW5zID0gbW9jaygiU2VydmVyVHJhbnNwb3J0IikKLSAgICAgIEB0cmFucyA9IG1vY2soIkJhc2VUcmFuc3BvcnQiKQotICAgICAgQHByb3QgPSBtb2NrKCJCYXNlUHJvdG9jb2wiKQotICAgICAgQGNsaWVudCA9IG1vY2soIkNsaWVudCIpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlcl90cmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCiAgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyX3RyYW5zLCBAdHJhbnMsIEBwcm90KQorICAgICAgc2xlZXAoMC4xNSkKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlcl90cmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRwb29sKHNlcnZlcihwcm90KHRyYW5zKHNlcnZlcl90cmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkIiBkbwogICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQotICAgICAgZGVzY3JpYmVkX2NsYXNzLmFueV9pbnN0YW5jZS5zaG91bGRfcmVjZWl2ZSg6c2VydmUpIGRvIAorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKICAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1InKSkKICAgICAgIGVuZAogICAgICAgZXhwZWN0IHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS50byhyYWlzZV9lcnJvcignRVJST1InKSkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGF2b2lkIHJ1bm5pbmcgdGhlIHNlcnZlciB0d2ljZSB3aGVuIHJldHJ5aW5nIHJlc2N1YWJsZV9zZXJ2ZSIgZG8KICAgICAgIGV4Y2VwdGlvbl9xID0gQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBleGNlcHRpb25fcSkKLSAgICAgIGRlc2NyaWJlZF9jbGFzcy5hbnlfaW5zdGFuY2Uuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgIGV4cGVjdF9hbnlfaW5zdGFuY2Vfb2YoZGVzY3JpYmVkX2NsYXNzKS50byByZWNlaXZlKDpzZXJ2ZSkgZG8gCiAgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SMScpKQogICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjInKSkKICAgICAgIGVuZApAQCAtMTE4LDI5ICsxNTgsMjkgQEAKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgYSB0aHJlYWQgcG9vbCIgZG8KLSAgICAgIHRocmVhZF9xID0gbW9jaygiU2l6ZWRRdWV1ZSIpCi0gICAgICBleGNlcHRpb25fcSA9IG1vY2soIlF1ZXVlIikKKyAgICAgIHRocmVhZF9xID0gZG91YmxlKCJTaXplZFF1ZXVlIikKKyAgICAgIGV4Y2VwdGlvbl9xID0gZG91YmxlKCJRdWV1ZSIpCiAgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHRocmVhZF9xLCB0aHJlYWRfcSkKICAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAZXhjZXB0aW9uX3EsIGV4Y2VwdGlvbl9xKQotICAgICAgQHNlcnZlcl90cmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICB0aHJlYWRfcS5zaG91bGRfcmVjZWl2ZSg6cHVzaCkud2l0aCg6dG9rZW4pCi0gICAgICB0aHJlYWRfcS5zaG91bGRfcmVjZWl2ZSg6cG9wKQotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF95aWVsZAotICAgICAgQHNlcnZlcl90cmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cHVzaCkud2l0aCg6dG9rZW4pCisgICAgICBleHBlY3QodGhyZWFkX3EpLnRvIHJlY2VpdmUoOnBvcCkKKyAgICAgIGV4cGVjdChUaHJlYWQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3lpZWxkCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKICAgICAgIGVycm9yID0gUnVudGltZUVycm9yLm5ldygiU3RvcHBlZCIpCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHJhaXNlIGVycm9yCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBleGNlcHRpb25fcS5zaG91bGRfcmVjZWl2ZSg6cHVzaCkud2l0aChlcnJvcikuYW5kX3Rocm93KDpzdG9wKQotICAgICAgQHNlcnZlcl90cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KGV4Y2VwdGlvbl9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8odGhyb3dfc3ltYm9sKDpzdG9wKSkKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCmluZGV4IGU2YjY3MzIuLjIwMmM3NDUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCkBAIC0yNSwzNyArMjUsNDQgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQubmV3Ci0gICAgICBAaGFuZGxlID0gbW9jaygiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNvbm5lY3Rfbm9uYmxvY2spCi0gICAgICBAaGFuZGxlLnN0dWIhKDpzZXRzb2Nrb3B0KQotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoImxvY2FsaG9zdCIsIDkwOTAsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KGxvY2FsaG9zdDo5MDkwKSIKICAgICAgIEBzb2NrZXQub3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKG1vY2soIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoIm15LmRvbWFpbiIsIDEyMzQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCi0gICAgICBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKGRvdWJsZSgiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoIm15LmRvbWFpbiIsIDEyMzQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCkub3BlbgorICAgICAgQHNvY2tldC50b19zID09ICJzb2NrZXQobXkuZG9tYWluOjEyMzQpIgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KLSAgICAgIDo6U29ja2V0LnN0dWIhKDpuZXcpCi0gICAgICBUaHJpZnQ6OlNvY2tldC5uZXcoJ2xvY2FsaG9zdCcsIDgwODAsIDUpLnRpbWVvdXQuc2hvdWxkID09IDUKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0KS50byBlcSg1KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldC5uZXcoJ215aG9zdCcsIDgwOTApLnRvX3MpLnRvIGVxKCJzb2NrZXQobXlob3N0OjgwOTApIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYiBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgppbmRleCA1ZmRkYzE2Li4zMmJkYjcxIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKKysrIGIvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCkBAIC0yMSw4NCArMjEsODQgQEAKIAogc2hhcmVkX2V4YW1wbGVzX2ZvciAiYSBzb2NrZXQiIGRvCiAgIGl0ICJzaG91bGQgb3BlbiBhIHNvY2tldCIgZG8KLSAgICBAc29ja2V0Lm9wZW4uc2hvdWxkID09IEBoYW5kbGUKKyAgICBleHBlY3QoQHNvY2tldC5vcGVuKS50byBlcShAaGFuZGxlKQogICBlbmQKIAogICBpdCAic2hvdWxkIGJlIG9wZW4gd2hlbmV2ZXIgaXQgaGFzIGEgaGFuZGxlIiBkbwotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQHNvY2tldC5zaG91bGQgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9vcGVuCiAgICAgQHNvY2tldC5oYW5kbGUgPSBuaWwKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICAgIEBzb2NrZXQuaGFuZGxlID0gQGhhbmRsZQogICAgIEBzb2NrZXQuY2xvc2UKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICBlbmQKIAogICBpdCAic2hvdWxkIHdyaXRlIGRhdGEgdG8gdGhlIGhhbmRsZSIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpCiAgICAgQHNvY2tldC53cml0ZSgiZm9vYmFyIikKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZmFpbCIpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIGl0IGNhbm5vdCByZWFkIGZyb20gdGhlIGhhbmRsZSIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDE3KSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDE3KSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgZW5kCiAKICAgaXQgInNob3VsZCByZXR1cm4gdGhlIGRhdGEgcmVhZCB3aGVuIHJlYWRpbmcgZnJvbSB0aGUgaGFuZGxlIHdvcmtzIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQotICAgIEBzb2NrZXQucmVhZCgxNykuc2hvdWxkID09ICJ0ZXN0IGRhdGEiCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQorICAgIGV4cGVjdChAc29ja2V0LnJlYWQoMTcpKS50byBlcSgidGVzdCBkYXRhIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBkZWNsYXJlIGl0c2VsZiBhcyBjbG9zZWQgd2hlbiBpdCBoYXMgYW4gZXJyb3IiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBAc29ja2V0LnNob3VsZCBiZV9vcGVuCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgiZmFpbCIpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfb3BlbgorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHRoZSBzdHJlYW0gaXMgY2xvc2VkIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCi0gICAgbGFtYmRhIHsgQHNvY2tldC5yZWFkKDEwKSB9LnNob3VsZCByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCisgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnRvIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTApIH0udG8gcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQogICBlbmQKIAogICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHRpbWVvdXQgYWNjZXNzb3IgZm9yIHJlYWQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMwogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgoW0BoYW5kbGVdLCBuaWwsIG5pbCwgMykuYW5kX3JldHVybihbW0BoYW5kbGVdLCBbXSwgW11dKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOnJlYWRwYXJ0aWFsKS53aXRoKDE3KS5hbmRfcmV0dXJuKCJ0ZXN0IGRhdGEiKQotICAgIEBzb2NrZXQucmVhZCgxNykuc2hvdWxkID09ICJ0ZXN0IGRhdGEiCisgICAgZXhwZWN0KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgoW0BoYW5kbGVdLCBuaWwsIG5pbCwgMykuYW5kX3JldHVybihbW0BoYW5kbGVdLCBbXSwgW11dKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKKyAgICBleHBlY3QoQHNvY2tldC5yZWFkKDE3KSkudG8gZXEoInRlc3QgZGF0YSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgc3VwcG9ydCB0aGUgdGltZW91dCBhY2Nlc3NvciBmb3Igd3JpdGUiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMwogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMykudHdpY2UuYW5kX3JldHVybihbW10sIFtAaGFuZGxlXSwgW11dKQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCJ0ZXN0IGRhdGEiKS5hbmRfcmV0dXJuKDQpCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoIiBkYXRhIikuYW5kX3JldHVybig1KQotICAgIEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpLnNob3VsZCA9PSA5CisgICAgZXhwZWN0KElPKS50byByZWNlaXZlKDpzZWxlY3QpLndpdGgobmlsLCBbQGhhbmRsZV0sIG5pbCwgMykudHdpY2UuYW5kX3JldHVybihbW10sIFtAaGFuZGxlXSwgW11dKQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgidGVzdCBkYXRhIikuYW5kX3JldHVybig0KQorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgiIGRhdGEiKS5hbmRfcmV0dXJuKDUpCisgICAgZXhwZWN0KEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpKS50byBlcSg5KQogICBlbmQKIAogICBpdCAic2hvdWxkIHJhaXNlIGFuIGVycm9yIHdoZW4gcmVhZCB0aW1lcyBvdXQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMC41CiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkub25jZSB7c2xlZXAoMC41KTsgbmlsfQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxNykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCB9CisgICAgZXhwZWN0KElPKS50byByZWNlaXZlKDpzZWxlY3QpLm9uY2Uge3NsZWVwKDAuNSk7IG5pbH0KKyAgICBleHBlY3QgeyBAc29ja2V0LnJlYWQoMTcpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIH0KICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHdyaXRlIHRpbWVzIG91dCIgZG8KICAgICBAc29ja2V0LnRpbWVvdXQgPSAwLjUKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDAuNSkuYW55X251bWJlcl9vZl90aW1lcy5hbmRfcmV0dXJuKG5pbCkKLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUIH0KKyAgICBhbGxvdyhJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDAuNSkuYW5kX3JldHVybihuaWwpCisgICAgZXhwZWN0IHsgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCkgfQogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3BlY19oZWxwZXIucmIgYi9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYgppbmRleCA4NjY0YjY2Li41YmY5OGQwIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYgorKysgYi9saWIvcmIvc3BlYy9zcGVjX2hlbHBlci5yYgpAQCAtNTQsOCArNTQsMTEgQEAKIHJlcXVpcmUgJ25vbmJsb2NraW5nX3NlcnZpY2UnCiAKIG1vZHVsZSBGaXh0dXJlcwotICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUID0gQ09NUEFDVF9URVNULmR1cAorICBDT01QQUNUX1BST1RPQ09MX1RFU1RfU1RSVUNUID0gVGhyaWZ0OjpUZXN0OjpDT01QQUNUX1RFU1QuZHVwCiAgIENPTVBBQ1RfUFJPVE9DT0xfVEVTVF9TVFJVQ1QuYV9iaW5hcnkgPSBbMCwxLDIsMyw0LDUsNiw3LDhdLnBhY2soJ2MqJykKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5zZXRfYnl0ZV9tYXAgPSBuaWwKICAgQ09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVC5tYXBfYnl0ZV9tYXAgPSBuaWwKIGVuZAorCiskOi51bnNoaWZ0IEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAqJXdbZ2VuLXJiL2ZsYXRdKQorCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmU2NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JiL3NwZWMvc3NsX3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpAQCAtMCwwICsxLDM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworcmVxdWlyZSAnc3BlY19oZWxwZXInCityZXF1aXJlIEZpbGUuZXhwYW5kX3BhdGgoIiN7RmlsZS5kaXJuYW1lKF9fRklMRV9fKX0vc29ja2V0X3NwZWNfc2hhcmVkIikKKworZGVzY3JpYmUgJ1NTTFNlcnZlclNvY2tldCcgZG8KKworICBkZXNjcmliZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldCBkbworICAgIGJlZm9yZSg6ZWFjaCkgZG8KKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC5uZXcoMTIzNCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJzc2woc29ja2V0KDoxMjM0KSkiKQorICAgIGVuZAorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOGQ4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKQEAgLTAsMCArMSw3OCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgJ3NwZWNfaGVscGVyJworcmVxdWlyZSBGaWxlLmV4cGFuZF9wYXRoKCIje0ZpbGUuZGlybmFtZShfX0ZJTEVfXyl9L3NvY2tldF9zcGVjX3NoYXJlZCIpCisKK2Rlc2NyaWJlICdTU0xTb2NrZXQnIGRvCisKKyAgZGVzY3JpYmUgVGhyaWZ0OjpTU0xTb2NrZXQgZG8KKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAY29udGV4dCA9IE9wZW5TU0w6OlNTTDo6U1NMQ29udGV4dC5uZXcKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC5uZXcKKyAgICAgIEBzaW1wbGVfc29ja2V0X2hhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAc2ltcGxlX3NvY2tldF9oYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorCisgICAgICBAaGFuZGxlID0gZG91YmxlKGRvdWJsZSgiU1NMSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnBvc3RfY29ubmVjdGlvbl9jaGVjayA9PiB0cnVlKSwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spCisKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oQHNpbXBsZV9zb2NrZXRfaGFuZGxlKQorICAgICAgYWxsb3coT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgIGVuZAorCisgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKKworICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNzbCBzb2NrZXQiIGRvCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBvcGVuIGEgOjpTb2NrZXQgd2l0aCBkZWZhdWx0IGFyZ3MiIGRvCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAc2ltcGxlX3NvY2tldF9oYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbG9jYWxob3N0JykKKyAgICAgIEBzb2NrZXQub3BlbgorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBhY2NlcHQgaG9zdC9wb3J0IG9wdGlvbnMiIGRvCisgICAgICBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChoYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbXkuZG9tYWluJykKKyAgICAgIFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCwgNjAwMCwgbmlsKS5vcGVuCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIGNvbnRleHQiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1LCBAY29udGV4dCkuc3NsX2NvbnRleHQpLnRvIGVxKEBjb250ZXh0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXlob3N0JywgODA5MCkudG9fcykudG8gZXEoInNzbChzb2NrZXQobXlob3N0OjgwOTApKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCmluZGV4IGRjOGNlNWYuLmQwNjM1NjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19zcGVjLnJiCkBAIC0zOSw5ICszOSw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUucHVzaCBbMywgNCwgNV0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTUyLDkgKzUyLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10sIFsyLCAzLCA0XSBdLnRvX3NldAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUuYWRkIFszLCA0LCA1XQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtNjUsOSArNjUsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IFsxLCAyLCAzXSA9PiAxLCBbMiwgMywgNF0gPT4gMiB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVtbMywgNCwgNV1dID0gMwotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtNzgsOSArNzgsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLCAyID0+IFsyLCAzLCA0XSB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtOTEsOSArOTEsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUucHVzaChbMywgNCwgNV0udG9fc2V0KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTA0LDkgKzEwNCw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLnRvX3NldCwgWzIsIDMsIDRdLnRvX3NldCBdLnRvX3NldAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUuYWRkKFszLCA0LCA1XS50b19zZXQpCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMTcsOSArMTE3LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyBbMSwgMiwgM10udG9fc2V0ID0+IDEsIFsyLCAzLCA0XS50b19zZXQgPT4gMiB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVtbMywgNCwgNV0udG9fc2V0XSA9IDMKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTEzMCw5ICsxMzAsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4gWzEsIDIsIDNdLnRvX3NldCwgMiA9PiBbMiwgMywgNF0udG9fc2V0IH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlWzNdID0gWzMsIDQsIDVdLnRvX3NldAotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTQzLDkgKzE0Myw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgezEgPT4gMiwgMyA9PiA0fSwgezIgPT4gMywgNCA9PiA1fSBdCiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5wdXNoKHsgMyA9PiA0LCA1ID0+IDYgfSkKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE1Niw5ICsxNTYsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXS50b19zZXQKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLmFkZCh7IDMgPT4gNCwgNSA9PiA2IH0pCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNjksOSArMTY5LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyB7IDEgPT4gMiwgMyA9PiA0fSA9PiAxLCB7MiA9PiAzLCA0ID0+IDV9ICA9PiAyIH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlW3szID0+IDQsIDUgPT4gNn1dID0gMwotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTgyLDkgKzE4Miw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgMSA9PiB7IDEgPT4gMiwgMyA9PiA0fSwgMiA9PiB7MiA9PiAzLCA0ID0+IDV9IH0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlWzNdID0geyAzID0+IDQsIDUgPT4gNiB9Ci0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKaW5kZXggNjUzNGQ2MS4uYmJkNTAyYiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvc3RydWN0X3NwZWMucmIKQEAgLTI1LDcgKzI1LDcgQEAKICAgICBpdCAic2hvdWxkIGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHByb3Blcmx5IiBkbwogICAgICAgZmllbGRzID0ge30KICAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuZWFjaF9maWVsZCB7IHxmaWQsZmllbGRfaW5mb3wgZmllbGRzW2ZpZF0gPSBmaWVsZF9pbmZvIH0KLSAgICAgIGZpZWxkcy5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFMKKyAgICAgIGV4cGVjdChmaWVsZHMpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbml0aWFsaXplIGFsbCBmaWVsZHMgdG8gZGVmYXVsdHMiIGRvCkBAIC0zOSwxOSArMzksMTkgQEAKICAgICBlbmQKIAogICAgIGRlZiB2YWxpZGF0ZV9kZWZhdWx0X2FyZ3VtZW50cyhvYmplY3QpCi0gICAgICBvYmplY3Quc2ltcGxlLnNob3VsZCA9PSA1MwotICAgICAgb2JqZWN0LndvcmRzLnNob3VsZCA9PSAid29yZHMiCi0gICAgICBvYmplY3QuaGVsbG8uc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgb2JqZWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgb2JqZWN0LmNvbXBsZXguc2hvdWxkIGJlX25pbAotICAgICAgb2JqZWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICBleHBlY3Qob2JqZWN0LnNpbXBsZSkudG8gZXEoNTMpCisgICAgICBleHBlY3Qob2JqZWN0LndvcmRzKS50byBlcSgid29yZHMiKQorICAgICAgZXhwZWN0KG9iamVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpKQorICAgICAgZXhwZWN0KG9iamVjdC5pbnRzKS50byBlcShbMSwgMiwgMiwgM10pCisgICAgICBleHBlY3Qob2JqZWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KG9iamVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IHNoYXJlIGRlZmF1bHQgdmFsdWVzIGJldHdlZW4gaW5zdGFuY2VzIiBkbwogICAgICAgYmVnaW4KICAgICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwogICAgICAgICBzdHJ1Y3QuaW50cyA8PCAxNwotICAgICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmludHMuc2hvdWxkID09IFsxLDIsMiwzXQorICAgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5pbnRzKS50byBlcShbMSwyLDIsM10pCiAgICAgICBlbnN1cmUKICAgICAgICAgIyBlbnN1cmUgbm8gbGVha2FnZSB0byBvdGhlciB0ZXN0cwogICAgICAgICBTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEU1s0XVs6ZGVmYXVsdF0gPSBbMSwyLDIsM10KQEAgLTYwLDQ4ICs2MCw0OCBAQAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBpbml0aWFsaXplIGJvb2xlYW4gdmFsdWVzIiBkbwogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Qm9vbFN0cnVjdC5uZXcoOnllc25vID0+IGZhbHNlKQotICAgICAgc3RydWN0Lnllc25vLnNob3VsZCBiZV9mYWxzZQorICAgICAgZXhwZWN0KHN0cnVjdC55ZXNubykudG8gYmVfZmFsc2V5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhdmUgcHJvcGVyID09IHNlbWFudGljcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuc2hvdWxkX25vdCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2hvdWxkX25vdCA9PSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykubm90X3RvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KS50byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1MikpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpGb28ubmV3KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWVzIGluIGluc3BlY3QiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bSBzb21lX2VudW06T05FICgwKT4iKQogCi0gICAgICBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcC5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwIG15X21hcDp7T05FICgwKTogW1RXTyAoMSldfT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJldHR5IHByaW50IGJpbmFyeSBmaWVsZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28yLm5ldyg6bXlfYmluYXJ5ID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OkZvbzIgbXlfYmluYXJ5OjAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Lm9wdF9zdHJpbmc/LnNob3VsZCBiZV9mYWxzZQotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6c2ltcGxlID0+IDUyKS5zaW1wbGU/LnNob3VsZCBiZV90cnVlCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IGZhbHNlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiB0cnVlKS5teV9ib29sPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcub3B0X3N0cmluZz8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwogICAgICAgczEgPSBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkKICAgICAgIHMyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV08pCiAKLSAgICAgIChzMSA8PT4gczIpLnNob3VsZCA9PSAtMQotICAgICAgKHMyIDw9PiBzMSkuc2hvdWxkID09IDEKLSAgICAgIChzMSA8PT4gczEpLnNob3VsZCA9PSAwCi0gICAgICAoczEgPD0+IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoKSkuc2hvdWxkID09IC0xCisgICAgICBleHBlY3QoczEgPD0+IHMyKS50byBlcSgtMSkKKyAgICAgIGV4cGVjdChzMiA8PT4gczEpLnRvIGVxKDEpCisgICAgICBleHBlY3QoczEgPD0+IHMxKS50byBlcSgwKQorICAgICAgZXhwZWN0KHMxIDw9PiBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KCkpLnRvIGVxKC0xKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGl0c2VsZiBvZmYgdGhlIHdpcmUiIGRvCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zcG9ydCIpKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKAogICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDVdLCAjIEZvbwogICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwgIyBGb28KICAgICAgICAgWydoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgM10sICMgRm9vCkBAIC0xMTIsNDkgKzExMiw0OSBAQAogICAgICAgICBbJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNl0sICMgRm9vCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdICMgSGVsbG8KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDcpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKAogICAgICAgICBbVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDJdLCAjIGNvbXBsZXgKICAgICAgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDJdLCAjIGNvbXBsZXgvMS92YWx1ZQogICAgICAgICAgIFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMV0gIyBjb21wbGV4LzIvdmFsdWUKICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIDRdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDJdKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9saXN0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIDRdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OkkxNiwgMl0pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAogICAgICAgICAxLCAxNCwgICAgICAgICMgY29tcGxleCBrZXlzCiAgICAgICAgIDQyLCAgICAgICAgICAgIyBzaW1wbGUKICAgICAgICAgNCwgMjMsIDQsIDI5ICAjIGludHMKICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJwaSIsICJlIiwgImZlaWdlbmJhdW0iLCAiYXBwbGUgYmFuYW5hIiwgIndoYXQncyB1cD8iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLmFuZF9yZXR1cm4oTWF0aDo6UEksIE1hdGg6OkUsIDQuNjY5MjAxNjA5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKLSAgICAgIHByb3Quc2hvdWxkX25vdF9yZWNlaXZlKDpza2lwKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJwaSIsICJlIiwgImZlaWdlbmJhdW0iLCAiYXBwbGUgYmFuYW5hIiwgIndoYXQncyB1cD8iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikuYW5kX3JldHVybigyLCAzKQorICAgICAgZXhwZWN0KHByb3QpLm5vdF90byByZWNlaXZlKDpza2lwKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCA9PSB7MSA9PiB7InBpIiA9PiBNYXRoOjpQSSwgImUiID0+IE1hdGg6OkV9LCAxNCA9PiB7ImZlaWdlbmJhdW0iID0+IDQuNjY5MjAxNjA5fX0KLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpCi0gICAgICBzdHJ1Y3Qud29yZHMuc2hvdWxkID09ICJhcHBsZSBiYW5hbmEiCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzQsIDIzLCA0LCAyOV0KLSAgICAgIHN0cnVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzMsIDJdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaW1wbGUpLnRvIGVxKDQyKQorICAgICAgZXhwZWN0KHN0cnVjdC5jb21wbGV4KS50byBlcSh7MSA9PiB7InBpIiA9PiBNYXRoOjpQSSwgImUiID0+IE1hdGg6OkV9LCAxNCA9PiB7ImZlaWdlbmJhdW0iID0+IDQuNjY5MjAxNjA5fX0pCisgICAgICBleHBlY3Qoc3RydWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICJ3aGF0J3MgdXA/IikpCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiYXBwbGUgYmFuYW5hIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzQsIDIzLCA0LCAyOV0pCisgICAgICBleHBlY3Qoc3RydWN0LnNob3J0cykudG8gZXEoU2V0Lm5ldyhbMywgMl0pKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgZmFsc2UgYm9vbGVhbiBmaWVsZHMgY29ycmVjdGx5IiBkbwogICAgICAgYiA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKICAgICAgIHByb3QgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyhUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2Jvb2wpLndpdGgoZmFsc2UpCiAgICAgICBiLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgdW5leHBlY3RlZCBmaWVsZHMgaW4gc3RydWN0cyBhbmQgdXNlIGRlZmF1bHQgdmFsdWVzIiBkbwogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwotICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKICAgICAgICAgWydzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDFdLAogICAgICAgICBbJ2NvbXBsZXgnLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDVdLAogICAgICAgICBbJ3RoaW56JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA3XSwKQEAgLTE2Miw1NSArMTYyLDU1IEBACiAgICAgICAgIFsnd29yZHMnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNSkudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oImZvb2JhciIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oNDIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLmFuZF9yZXR1cm4oImZvb2JhciIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCiAgICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMF0pCiAgICAgICAjIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyKQogICAgICAgc3RydWN0LnJlYWQocHJvdCkKIAotICAgICAgc3RydWN0LnNpbXBsZS5zaG91bGQgPT0gNDIKLSAgICAgIHN0cnVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIHN0cnVjdC53b3Jkcy5zaG91bGQgPT0gImZvb2JhciIKLSAgICAgIHN0cnVjdC5oZWxsby5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAnaGVsbG8sIHdvcmxkIScpCi0gICAgICBzdHJ1Y3QuaW50cy5zaG91bGQgPT0gWzEsIDIsIDIsIDNdCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFs1LCAxNywgMjM5XSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gYmVfbmlsCisgICAgICBleHBlY3Qoc3RydWN0LndvcmRzKS50byBlcSgiZm9vYmFyIikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChzdHJ1Y3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzUsIDE3LCAyMzldKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaXRzZWxmIHRvIHRoZSB3aXJlIiBkbwotICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkgI21vY2soIlByb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDIpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDYpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgxNykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgyMzkpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5leGFjdGx5KDYpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2dyZWV0aW5nJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9saXN0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgNCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2xpc3RfZW5kKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkxNiwgMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3NldF9lbmQpCisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpGb28iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6SGVsbG8iKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ludHMnLCBUaHJpZnQ6OlR5cGVzOjpMSVNULCA0KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgyKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnZm9vJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9kb3VibGUpLndpdGgoMS4yMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCg1KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgxNykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5leGFjdGx5KDYpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNTMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2hlbGxvJywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdncmVldGluZycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2hlbGxvLCB3b3JsZCEnKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIFRocmlmdDo6VHlwZXM6Ok1BUCwgMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2VuZCkudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9saXN0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMiwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9saXN0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STE2LCAzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3NldF9lbmQpCiAKICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKICAgICAgIHN0cnVjdC53b3JkcyA9IG5pbApAQCAtMjIxLDUwICsyMjEsNTAgQEAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBwcmVzZW50ZWQgd2l0aCBhbiB1bmtub3duIGNvbnRhaW5lciIgZG8KICAgICAgICMgeWVhaCB0aGlzIGlzIHNpbGx5LCBidXQgSSdtIGdvaW5nIGZvciBjb2RlIGNvdmVyYWdlIGhlcmUKICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIGxhbWJkYSB7IHN0cnVjdC5zZW5kIDp3cml0ZV9jb250YWluZXIsIG5pbCwgbmlsLCB7OnR5cGUgPT4gImZvbyJ9IH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKKyAgICAgIGV4cGVjdCB7IHN0cnVjdC5zZW5kIDp3cml0ZV9jb250YWluZXIsIG5pbCwgbmlsLCB7OnR5cGUgPT4gImZvbyJ9IH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIk5vdCBhIGNvbnRhaW5lciB0eXBlOiBmb28iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gVGhyaWZ0OjpTdHJ1Y3QubmV3IiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgotICAgICAgICBsYW1iZGEgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGdyZWV0aW5nLykKICAgICAgIGVuc3VyZQogICAgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCiAgICAgICBlbmQKLSAgICAgIGxhbWJkYSB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9wdGlvbmFsIHR5cGUtY2hlY2tpbmcgaW4gZmllbGQgYWNjZXNzb3JzIiBkbwogICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSB0cnVlCiAgICAgICBiZWdpbgogICAgICAgICBoZWxsbyA9IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGdyZWV0aW5nIikKKyAgICAgICAgZXhwZWN0IHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBncmVldGluZy8pCiAgICAgICBlbnN1cmUKICAgICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBoZWxsby5ncmVldGluZyA9IDMgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHVua25vd24gdHlwZXMgYXJlIGdpdmVuIHRvIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KLSAgICAgIGxhbWJkYSB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6ZmlzaCA9PiAnc2FsbW9uJykgfS5zaG91bGQgcmFpc2VfZXJyb3IoRXhjZXB0aW9uLCAiVW5rbm93biBrZXkgZ2l2ZW4gdG8gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3OiBmaXNoIikKKyAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6ZmlzaCA9PiAnc2FsbW9uJykgfS50byByYWlzZV9lcnJvcihFeGNlcHRpb24sICJVbmtub3duIGtleSBnaXZlbiB0byBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXc6IGZpc2giKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IGByYWlzZSBYY2VwdGlvbiwgJ21lc3NhZ2UnYCBmb3IgRXhjZXB0aW9uIHN0cnVjdHMiIGRvCiAgICAgICBiZWdpbgogICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgInNvbWV0aGluZyBoYXBwZW5lZCIKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSAxCisgICAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGVxKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QoZS5jb2RlKS50byBlcSgxKQogICAgICAgICAjIGVuc3VyZSBpdCBnZXRzIHNlcmlhbGl6ZWQgcHJvcGVybHksIHRoaXMgaXMgdGhlIHJlYWxseSBpbXBvcnRhbnQgcGFydAotICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zIikpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkjLCAic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikjLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnMiKSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKSMsICJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpIywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCgxKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKQEAgLTI3NCwxNyArMjc0LDE3IEBACiAgICAgICBiZWdpbgogICAgICAgICByYWlzZSBTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiwgOm1lc3NhZ2UgPT4gInNvbWV0aGluZyBoYXBwZW5lZCIsIDpjb2RlID0+IDUKICAgICAgIHJlc2N1ZSBUaHJpZnQ6OkV4Y2VwdGlvbiA9PiBlCi0gICAgICAgIGUubWVzc2FnZS5zaG91bGQgPT0gInNvbWV0aGluZyBoYXBwZW5lZCIKLSAgICAgICAgZS5jb2RlLnNob3VsZCA9PSA1Ci0gICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnMiKSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdtZXNzYWdlJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KGUuY29kZSkudG8gZXEoNSkKKyAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zIikpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQogCiAgICAgICAgIGUud3JpdGUocHJvdCkKICAgICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTM5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKQEAgLTAsMCArMSwxNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgJ3JhY2svdGVzdCcKK3JlcXVpcmUgJ3RocmlmdC9zZXJ2ZXIvdGhpbl9odHRwX3NlcnZlcicKKworZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlciBkbworCisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQorCisgIGRlc2NyaWJlICIjaW5pdGlhbGl6ZSIgZG8KKworICAgIGNvbnRleHQgIndoZW4gdXNpbmcgdGhlIGRlZmF1bHRzIiBkbworCisgICAgICBpdCAiYmluZHMgdG8gcG9ydCA4MCwgd2l0aCBob3N0IDAuMC4wLjAsIGEgcGF0aCBvZiAnLyciIGRvCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aCgnMC4wLjAuMCcsIDgwLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKKyAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQnIGRvCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQorICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisgICAgICBlbmQKKworICAgICAgaXQgInVzZXMgdGhlIEJpbmFyeVByb3RvY29sRmFjdG9yeSIgZG8KKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KS50byByZWNlaXZlKDpuZXcpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKKyAgICAgIGVuZAorCisgICAgZW5kCisKKyAgICBjb250ZXh0ICJ3aGVuIHVzaW5nIHRoZSBvcHRpb25zIiBkbworCisgICAgICBpdCAnYWNjZXB0cyA6aXAsIDpwb3J0LCA6cGF0aCcgZG8KKyAgICAgICAgaXAgPSAiMTkyLjE2OC4wLjEiCisgICAgICAgIHBvcnQgPSAzMDAwCisgICAgICAgIHBhdGggPSAiL3RoaW4iCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChpcCwgcG9ydCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppcCA9PiBpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwb3J0ID0+IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6cGF0aCA9PiBwYXRoKQorICAgICAgZW5kCisKKyAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQgd2l0aCBhIGRpZmZlcmVudCBwcm90b2NvbCBmYWN0b3J5JyBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uKS50byByZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcpCisgICAgICBlbmQKKworICAgIGVuZAorCisgIGVuZAorCisgIGRlc2NyaWJlICIjc2VydmUiIGRvCisKKyAgICBpdCAnc3RhcnRzIHRoZSBUaGluIHNlcnZlcicgZG8KKyAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIgPSBkb3VibGUoJ3RoaW4gc2VydmVyJywgOnN0YXJ0ID0+IHRydWUpCisgICAgICBhbGxvdyhUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih1bmRlcmx5aW5nX3RoaW5fc2VydmVyKQorCisgICAgICB0aGluX3RocmlmdF9zZXJ2ZXIgPSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCisKKyAgICAgIGV4cGVjdCh1bmRlcmx5aW5nX3RoaW5fc2VydmVyKS50byByZWNlaXZlKDpzdGFydCkKKyAgICAgIHRoaW5fdGhyaWZ0X3NlcnZlci5zZXJ2ZQorICAgIGVuZAorICBlbmQKKworZW5kCisKK2Rlc2NyaWJlIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbiBkbworICBpbmNsdWRlIFJhY2s6OlRlc3Q6Ok1ldGhvZHMKKworICBsZXQoOnByb2Nlc3NvcikgeyBkb3VibGUoJ3Byb2Nlc3NvcicpIH0KKyAgbGV0KDpwcm90b2NvbF9mYWN0b3J5KSB7IGRvdWJsZSgncHJvdG9jb2wgZmFjdG9yeScpIH0KKworICBkZWYgYXBwCisgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uLmZvcigiLyIsIHByb2Nlc3NvciwgcHJvdG9jb2xfZmFjdG9yeSkKKyAgZW5kCisKKyAgY29udGV4dCAiNDA0IHJlc3BvbnNlIiBkbworCisgICAgaXQgJ3JlY2VpdmVzIGEgbm9uLVBPU1QnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICBnZXQgIi8iCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAorICAgIGVuZAorCisgICAgaXQgJ3JlY2VpdmVzIGEgaGVhZGVyIG90aGVyIHRoYW4gYXBwbGljYXRpb24veC10aHJpZnQnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgIHBvc3QgIi8iCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAorICAgIGVuZAorCisgIGVuZAorCisgIGNvbnRleHQgIjIwMCByZXNwb25zZSIgZG8KKworICAgIGJlZm9yZSBkbworICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKQorICAgICAgYWxsb3cocHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKQorICAgIGVuZAorCisgICAgaXQgJ2NyZWF0ZXMgYW4gSU9TdHJlYW1UcmFuc3BvcnQnIGRvCisgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKGFuX2luc3RhbmNlX29mKFJhY2s6OkxpbnQ6OklucHV0V3JhcHBlciksIGFuX2luc3RhbmNlX29mKFJhY2s6OlJlc3BvbnNlKSkKKyAgICAgIHBvc3QgIi8iCisgICAgZW5kCisKKyAgICBpdCAnZmV0Y2hlcyB0aGUgcmlnaHQgcHJvdG9jb2wgYmFzZWQgb24gdGhlIFRyYW5zcG9ydCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIGV4cGVjdChwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLndpdGgoYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkpCisgICAgICBwb3N0ICIvIgorICAgIGVuZAorCisgICAgaXQgJ3N0YXR1cyBjb2RlIDIwMCcgZG8KKyAgICAgIGhlYWRlcignQ29udGVudC1UeXBlJywgImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKyAgICAgIHBvc3QgIi8iCisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5vaz8pLnRvIGJlX3RydXRoeQorICAgIGVuZAorCisgIGVuZAorCitlbmQKKwpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKaW5kZXggYjJjM2EyMC4uZDU5NWFiNSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCkBAIC0zMSw4NSArMzEsODggQEAKIAogICBjb250ZXh0ICd0eXBlIGNoZWNraW5nJyBkbwogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSBwcm9wZXIgbmFtZSBmb3IgZWFjaCB0eXBlIiBkbwotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpJMTYpLnNob3VsZCA9PSAiVHlwZXM6OkkxNiIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6Vk9JRCkuc2hvdWxkID09ICJUeXBlczo6Vk9JRCIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6TElTVCkuc2hvdWxkID09ICJUeXBlczo6TElTVCIKLSAgICAgIFRocmlmdC50eXBlX25hbWUoNDIpLnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkkxNikpLnRvIGVxKCJUeXBlczo6STE2IikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OlZPSUQpKS50byBlcSgiVHlwZXM6OlZPSUQiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6TElTVCkpLnRvIGVxKCJUeXBlczo6TElTVCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZSg0MikpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjaGVjayB0eXBlcyBwcm9wZXJseSIgZG8KICAgICAgICMgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RPUH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlZPSUR9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh0cnVlLCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgiMyIsICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUT1B9LCAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlZPSUR9LCAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlZPSUR9LCAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh0cnVlLCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLjE0LCAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgiMyIsICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCAgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgICBoZWxsbyA9IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldwotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoaGVsbG8sICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30sIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKCJmb28iLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1R9LCAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLDJdKSwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLDJdLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiB0cnVlfSwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoaGVsbG8sICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30sIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgiZm9vIiwgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUifSwgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsMl0pLCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLDJdLCAgICAgICAgICBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IHRydWV9LCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZXJyb3Igb3V0IGlmIG5pbCBpcyBwYXNzZWQgYW5kIHNraXBfdHlwZXMgaXMgZmFsc2UiIGRvCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCWVRFfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJNjR9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVB9LCAgICA6Zm9vLCBmYWxzZSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjaGVjayBlbGVtZW50IHR5cGVzIG9uIGNvbnRhaW5lcnMiIGRvCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLCAyXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxLCBuaWwsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgMl0sIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIG5pbCwgMl0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLCA6a2V5ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCA6dmFsdWUgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR319Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgbmlsID0+ICJuaWwifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gbmlsLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCBuaWwgPT4gIm5pbCJ9LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHsxID0+IG5pbCwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDJdKSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIG5pbCwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyLjMsIDJdKSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMl0pLCBmaWVsZCwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIG5pbCwgMl0pLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDIuMywgMl0pLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKIAogICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA6Y2xhc3MgPT4gU3BlY05hbWVzcGFjZTo6SGVsbG99Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0LCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZ2l2ZSB0aGUgVGhyaWZ0OjpUeXBlRXJyb3IgYSByZWFkYWJsZSBtZXNzYWdlIiBkbwotICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZm9vIgotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCi0gICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBmb28uZWxlbWVudCIKKyAgICAgIG1zZyA9IC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBmb28vCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQorICAgICAgbXNnID0gL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGZvby5lbGVtZW50LwogICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR319Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbM10sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzNdLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpJMzIsIHJlY2VpdmVkIE5pbENsYXNzIGZvciBmaWVsZCBmb28uZWxlbWVudC5rZXkiCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULAogICAgICAgICAgICAgICAgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6a2V5ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfX19Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShbe25pbCA9PiAzfV0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3tuaWwgPT4gM31dLCBmaWVsZCwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgbXNnKQogICAgICAgbXNnID0gIkV4cGVjdGVkIFR5cGVzOjpJMzIsIHJlY2VpdmVkIE5pbENsYXNzIGZvciBmaWVsZCBmb28uZWxlbWVudC52YWx1ZSIKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbezEgPT4gbmlsfV0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgppbmRleCBkYjA4Y2FiLi4wY2U2MzA2IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKQEAgLTI0LDc2ICsyNCw4OCBAQAogICBkZXNjcmliZSBUaHJpZnQ6OlVuaW9uIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHZhbHVlIGluIHVuc2V0IHVuaW9uIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IG5pbAotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcShuaWwpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNldCBhIGZpZWxkIGFuZCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggZ2V0X3ZhbHVlIGFuZCB0aGUgbmFtZWQgZmllbGQgYWNjZXNzb3IiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjUKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gMjUKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjUpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSgyNSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd29yayBjb3JyZWN0bHkgd2hlbiBpbnN0YW50aWF0ZWQgd2l0aCBzdGF0aWMgZmllbGQgY29uc3RydWN0b3JzIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5pbnRlZ2VyMzIoNSkKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmludGVnZXIzMi5zaG91bGQgPT0gNQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uaW50ZWdlcjMyKS50byBlcSg1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKICAgICAgIHVuaW9uLmludGVnZXIzMiA9IDI1Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0IHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0udG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCByYWlzZSBmb3Igd3Jvbmcgc2V0IGZpZWxkIHdoZW4gaGFzaCBpbml0aWFsaXplZCBhbmQgdHlwZSBjaGVja2luZyBpcyBvZmYiIGRvCisgICAgICBUaHJpZnQudHlwZV9jaGVja2luZyA9IGZhbHNlCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyh7aW5jb3JyZWN0X2ZpZWxkOiA6aW5jb3JyZWN0fSkKKyAgICAgIGV4YW1wbGUgPSBsYW1iZGEgeyBUaHJpZnQ6OlNlcmlhbGl6ZXIubmV3LnNlcmlhbGl6ZSh1bmlvbikgfQorICAgICAgZXhwZWN0KGV4YW1wbGUpLnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNldF9maWVsZCBpcyBub3QgdmFsaWQgZm9yIHRoaXMgdW5pb24hIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGJlIGVxdWFsIHRvIG5pbCIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG5pbAorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEobmlsKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgd2l0aCBhbiBlbXB0eSBTdHJpbmciIGRvCisgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldworICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEoJycpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMsIGkzMiB2cy4gc3RyaW5nIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiYmxhaCEiKQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByb3Blcmx5IHJlc2V0IHNldGZpZWxkIGFuZCBzZXR2YWx1ZSIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCiAgICAgICB1bmlvbi5zb21lX2NoYXJhY3RlcnMgPSAiYmxhaCEiCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6c29tZV9jaGFyYWN0ZXJzCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09ICJibGFoISIKLSAgICAgIGxhbWJkYSB7IHVuaW9uLmludGVnZXIzMiB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJpbnRlZ2VyMzIgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOnNvbWVfY2hhcmFjdGVycykKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKCJibGFoISIpCisgICAgICBleHBlY3QgeyB1bmlvbi5pbnRlZ2VyMzIgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJpbnRlZ2VyMzIgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBlcXVhdGUgdHdvIGRpZmZlcmVudCB1bmlvbnMgd2l0aCBkaWZmZXJlbnQgdmFsdWVzIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCA0MDApCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCBmaWVsZHMiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpvdGhlcl9pMzIsIDI1KQotICAgICAgdW5pb24uc2hvdWxkX25vdCA9PSBvdGhlcl91bmlvbgorICAgICAgZXhwZWN0KHVuaW9uKS5ub3RfdG8gZXEob3RoZXJfdW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGluc3BlY3QgcHJvcGVybHkiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKLSAgICAgIHVuaW9uLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gaW50ZWdlcjMyOiAyNT4iCisgICAgICBleHBlY3QodW5pb24uaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHdpdGggaW5zdGFuY2VfdmFyaWFibGVfc2V0IiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjcpCiAgICAgICB1bmlvbi5pbnN0YW5jZV92YXJpYWJsZV9zZXQoOkBzb21lX2NoYXJhY3RlcnMsICJoYWxsbyEiKQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNwotICAgICAgbGFtYmRhIHsgdW5pb24uc29tZV9jaGFyYWN0ZXJzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjcpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKLSAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSBjb3JyZWN0bHkiIGRvCisgICAgaXQgInNob3VsZCBzZXJpYWxpemUgdG8gYmluYXJ5IGNvcnJlY3RseSIgZG8KICAgICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CiAgICAgICBwcm90byA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wubmV3KHRyYW5zKQogCkBAIC0xMDIsMjQgKzExNCwzNiBAQAogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCi0gICAgICBvdGhlcl91bmlvbi5zaG91bGQgPT0gdW5pb24KKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHNlcmlhbGl6ZSB0byBqc29uIGNvcnJlY3RseSIgZG8KKyAgICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgICBwcm90byA9IFRocmlmdDo6SnNvblByb3RvY29sLm5ldyh0cmFucykKKworICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICB1bmlvbi53cml0ZShwcm90bykKKworICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCisgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQorICAgICAgZXhwZWN0KG90aGVyX3VuaW9uKS50byBlcSh1bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2Ugd2hlbiB2YWxpZGF0aW5nIHVuc2V0IHVuaW9uIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnZhbGlkYXRlIH0udG8gcmFpc2VfZXJyb3IoU3RhbmRhcmRFcnJvciwgIlVuaW9uIGZpZWxkcyBhcmUgbm90IHNldC4iKQogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAxKQotICAgICAgbGFtYmRhIHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKKyAgICAgIGV4cGVjdCB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHZhbGlkYXRlIGFuIGVudW0gZmllbGQgcHJvcGVybHkiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDMpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6ZW51bV9maWVsZAotICAgICAgbGFtYmRhIHsgdW5pb24udmFsaWRhdGUgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDplbnVtX2ZpZWxkKQorICAgICAgZXhwZWN0IHsgdW5pb24udmFsaWRhdGUgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCiAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6ZW51bV9maWVsZCwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAiSW52YWxpZCB2YWx1ZSBvZiBmaWVsZCBlbnVtX2ZpZWxkISIpCisgICAgICBleHBlY3QgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcm9wZXJseSBzZXJpYWxpemUgYW5kIG1hdGNoIHN0cnVjdHMgd2l0aCBhIHVuaW9uIiBkbwpAQCAtMTM0LDM3ICsxNTgsMzcgQEAKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJoZWxsbyB0aGVyZSIpCiAgICAgICBzd3UyID0gU3BlY05hbWVzcGFjZTo6U3RydWN0X3dpdGhfdW5pb24ubmV3KDpmdW5fdW5pb24gPT4gb3RoZXJfdW5pb24pCiAKLSAgICAgIHN3dTIuc2hvdWxkX25vdCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS5ub3RfdG8gZXEoc3d1KQogCiAgICAgICBzd3UyLnJlYWQocHJvdG8pCi0gICAgICBzd3UyLnNob3VsZCA9PSBzd3UKKyAgICAgIGV4cGVjdChzd3UyKS50byBlcShzd3UpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHN1cHBvcnQgb2xkIHN0eWxlIGNvbnN0cnVjdG9yIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiA9PiAyNikKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDppbnRlZ2VyMzIKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gMjYKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6aW50ZWdlcjMyKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoMjYpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvciB3aGVuIGluc3BlY3RlZCBhbmQgdW5zZXQiIGRvCi0gICAgICBsYW1iZGF7U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdHtTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KCkuaW5zcGVjdH0ubm90X3RvIHJhaXNlX2Vycm9yCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByaW50IGVudW0gdmFsdWUgbmFtZSB3aGVuIGluc3BlY3RlZCIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gc29tZV9lbnVtOiBPTkUgKDApPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iKQogCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIG15X21hcDoge09ORSAoMCk6IFtUV08gKDEpXX0+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6TXlfdW5pb24gbXlfbWFwOiB7T05FICgwKTogW1RXTyAoMSldfT4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvZmZlciBmaWVsZD8gbWV0aG9kcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldy5zb21lX2VudW0/LnNob3VsZCBiZV9mYWxzZQotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuc29tZV9lbnVtPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IGZhbHNlKS5pbV90cnVlPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbV90cnVlID0+IHRydWUpLmltX3RydWU/LnNob3VsZCBiZV90cnVlCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3LnNvbWVfZW51bT8pLnRvIGJlX2ZhbHNleQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLnNvbWVfZW51bT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiBmYWxzZSkuaW1fdHJ1ZT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiB0cnVlKS5pbV90cnVlPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByZXR0eSBwcmludCBiaW5hcnkgZmllbGRzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6YmluYXJ5X2ZpZWxkID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbiBiaW5hcnlfZmllbGQ6IDAxMDIwMz4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldyg6YmluYXJ5X2ZpZWxkID0+ICJcMDAxXDAwMlwwMDMiKS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbiBiaW5hcnlfZmllbGQ6IDAxMDIwMz4iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBiZSBjb21wYXJhYmxlIiBkbwpAQCAtMTgzLDcgKzIwNyw3IEBACiAgICAgICBmb3IgeSBpbiAwLi4zCiAgICAgICAgIGZvciB4IGluIDAuLjMKICAgICAgICAgICAjIHB1dHMgIiN7b2Jqc1t5XS5pbnNwZWN0fSA8PT4gI3tvYmpzW3hdLmluc3BlY3R9IHNob3VsZCA9PSAje3JlbGF0aW9uc2hpcHNbeV1beF19IgotICAgICAgICAgIChvYmpzW3ldIDw9PiBvYmpzW3hdKS5zaG91bGQgPT0gcmVsYXRpb25zaGlwc1t5XVt4XQorICAgICAgICAgIGV4cGVjdChvYmpzW3ldIDw9PiBvYmpzW3hdKS50byBlcShyZWxhdGlvbnNoaXBzW3ldW3hdKQogICAgICAgICBlbmQKICAgICAgIGVuZAogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKaW5kZXggY2I2Y2ZmMy4uODYyM2U5NSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCkBAIC0yNiwyMSArMjYsMjYgQEAKICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAcGF0aCA9ICcvdG1wL3RocmlmdF9zcGVjX3NvY2tldCcKICAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKQotICAgICAgQGhhbmRsZSA9IG1vY2soIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICA6OlVOSVhTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCiAgICAgZW5kCiAKICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgogCiAgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc29ja2V0IiBkbwotICAgICAgOjpVTklYU29ja2V0LnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgbGFtYmRhIHsgQHNvY2tldC5vcGVuIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiB9CisgICAgICBleHBlY3QoOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQHNvY2tldC5vcGVuIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTikgfQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgdGltZW91dCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zdHViISg6bmV3KQotICAgICAgVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCwgNSkudGltZW91dC5zaG91bGQgPT0gNQorICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQubmV3KEBwYXRoKS50b19zKS50byBlcSgiZG9tYWluKCN7QHBhdGh9KSIpCiAgICAgZW5kCiAgIGVuZAogCkBAIC01MSw1NyArNTYsNjEgQEAKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgaGFuZGxlIHdoZW4gY2FsbGluZyBsaXN0ZW4iIGRvCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgVGhyaWZ0OjpVTklYU29ja2V0IHRvIHdyYXAgYWNjZXB0ZWQgc29ja2V0cyIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBzb2NrID0gbW9jaygic29jayIpCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQotICAgICAgdHJhbnMgPSBtb2NrKCJVTklYU29ja2V0IikKLSAgICAgIFRocmlmdDo6VU5JWFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCA9PSB0cmFucworICAgICAgc29jayA9IGRvdWJsZSgic29jayIpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKKyAgICAgIHRyYW5zID0gZG91YmxlKCJVTklYU29ja2V0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6aGFuZGxlPSkud2l0aChzb2NrKQorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBlcSh0cmFucykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2xvc2UgdGhlIGhhbmRsZSB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBGaWxlLnN0dWIhKDpkZWxldGUpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEZpbGUpLnRvIHJlY2VpdmUoOmRlbGV0ZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgZGVsZXRlIHRoZSBzb2NrZXQgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgRmlsZS5zaG91bGRfcmVjZWl2ZSg6ZGVsZXRlKS53aXRoKEBwYXRoKQorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChGaWxlKS50byByZWNlaXZlKDpkZWxldGUpLndpdGgoQHBhdGgpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgd2hlbiBhY2NlcHRpbmcgaWYgdGhlcmUgaXMgbm8gaGFuZGxlIiBkbwotICAgICAgQHNvY2tldC5hY2NlcHQuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KEBzb2NrZXQuYWNjZXB0KS50byBiZV9uaWwKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHRydWUgZm9yIGNsb3NlZD8gd2hlbiBhcHByb3ByaWF0ZSIgZG8KLSAgICAgIGhhbmRsZSA9IG1vY2soIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIFVOSVhTZXJ2ZXIuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCi0gICAgICBGaWxlLnN0dWIhKDpkZWxldGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGFsbG93KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBhbGxvdyhGaWxlKS50byByZWNlaXZlKDpkZWxldGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHNvY2tldC5jbG9zZQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgQHNvY2tldC5zaG91bGRfbm90IGJlX2Nsb3NlZAotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAc29ja2V0LnNob3VsZCBiZV9jbG9zZWQKKyAgICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfY2xvc2VkCisgICAgICBhbGxvdyhoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAc29ja2V0KS50byBiZV9jbG9zZWQKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc29ja2V0LnRvX3MpLnRvIGVxKCJkb21haW4oI3tAcGF0aH0pIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYyBiL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYwppbmRleCAyOTlkYjA4Li5lNTMxOTRlIDEwMDY0NAotLS0gYS9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKKysrIGIvbGliL3JiL3RocmlmdC5nZW1zcGVjCkBAIC0zLDE0ICszLDE0IEBACiAKIEdlbTo6U3BlY2lmaWNhdGlvbi5uZXcgZG8gfHN8CiAgIHMubmFtZSAgICAgICAgPSAndGhyaWZ0JwotICBzLnZlcnNpb24gICAgID0gJzAuOS4wLjEnCi0gIHMuYXV0aG9ycyAgICAgPSBbJ1RocmlmdCBEZXZlbG9wZXJzJ10KKyAgcy52ZXJzaW9uICAgICA9ICcxLjAuMCcKKyAgcy5hdXRob3JzICAgICA9IFsnQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJ10KICAgcy5lbWFpbCAgICAgICA9IFsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10KICAgcy5ob21lcGFnZSAgICA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnCiAgIHMuc3VtbWFyeSAgICAgPSAlcXtSdWJ5IGJpbmRpbmdzIGZvciBBcGFjaGUgVGhyaWZ0fQogICBzLmRlc2NyaXB0aW9uID0gJXF7UnVieSBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbX0KLSAgcy5saWNlbnNlID0gJ0FwYWNoZSAyLjAnCi0gIHMuZXh0ZW5zaW9ucyA9IFsnZXh0L2V4dGNvbmYucmInXQorICBzLmxpY2Vuc2UgICAgID0gJ0FwYWNoZS0yLjAnCisgIHMuZXh0ZW5zaW9ucyAgPSBbJ2V4dC9leHRjb25mLnJiJ10KIAogICBzLmhhc19yZG9jICAgICAgPSB0cnVlCiAgIHMucmRvY19vcHRpb25zICA9ICV3Wy0tbGluZS1udW1iZXJzIC0taW5saW5lLXNvdXJjZSAtLXRpdGxlIFRocmlmdCAtLW1haW4gUkVBRE1FXQpAQCAtMjMsMTIgKzIzLDE4IEBACiAgIHMudGVzdF9maWxlcyA9IERpci5nbG9iKCJ7dGVzdCxzcGVjLGJlbmNobWFya30vKiovKiIpCiAgIHMuZXhlY3V0YWJsZXMgPSAgRGlyLmdsb2IoIntiaW59LyoqLyoiKQogCi0gIHMuZXh0cmFfcmRvY19maWxlcyAgPSAld1tDSEFOR0VMT0cgUkVBRE1FXSArIERpci5nbG9iKCJ7ZXh0LGxpYn0vKiovKi57YyxoLHJifSIpCisgIHMuZXh0cmFfcmRvY19maWxlcyAgPSAld1tSRUFETUUubWRdICsgRGlyLmdsb2IoIntleHQsbGlifS8qKi8qLntjLGgscmJ9IikKIAogICBzLnJlcXVpcmVfcGF0aHMgPSAld1tsaWIgZXh0XQogCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3Jha2UnCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JzcGVjJywgJ34+IDIuMTAuMCcKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAnbW9uZ3JlbCcsICIxLjIuMC5wcmUyIgorICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdidW5kbGVyJywgICAgICAgICAgICAnfj4gMS4xMScKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5JywgICAgICAgICAgICAgICAgJ34+IDAuMTEuMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5LWJ5ZWJ1ZycsICAgICAgICAgJ34+IDMuNicKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5LXN0YWNrX2V4cGxvcmVyJywgJ34+IDAuNC45LjInCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JhY2snLCAgICAgICAgICAgICAgICd+PiAyLjAnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JhY2stdGVzdCcsICAgICAgICAgICd+PiAwLjguMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZScsICAgICAgICAgICAgICAgJ34+IDEyLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JzcGVjJywgICAgICAgICAgICAgICd+PiAzLjcnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3RoaW4nLCAgICAgICAgICAgICAgICd+PiAxLjcnCiBlbmQKIApkaWZmIC0tZ2l0IGEvbGliL3JzL0NhcmdvLnRvbWwgYi9saWIvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDMyMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxOSBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdCIKK2Rlc2NyaXB0aW9uID0gIlJ1c3QgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iCit2ZXJzaW9uID0gIjEuMC4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+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+IGNwcGNoZWNrLXJlc3VsdC54bWwKK3NvbmFyLmN4eC5jcHBjaGVjay5yZXBvcnRQYXRoPWNwcGNoZWNrLXJlc3VsdC54bWwKKworIyBMaXN0IG9mIHRoZSBtb2R1bGUgaWRlbnRpZmllcnMKK3NvbmFyLm1vZHVsZXM9bW9kdWxlMSxtb2R1bGUzLG1vZHVsZTQsbW9kdWxlNSxtb2R1bGU2LG1vZHVsZTcsbW9kdWxlOCxtb2R1bGU5LG1vZHVsZTEwLG1vZHVsZTExLG1vZHVsZTEyLG1vZHVsZTE0CisKKworCisjIHdlIG5lZWQgc29uYXItcnVubmVyIDIuMSBmb3IgdGhpcywgc2VlIGh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvU09OQVJQTFVHSU5TLTI0MjEKKyNzb25hci5tb2R1bGVzPW1vZHVsZTIKKworIyBkZWxwaCBwbHVnaW4gaXMgYnJva2VuCisjc29uYXIubW9kdWxlcz1tb2R1bGUxMworCisjIHBocHVuaXQgcGx1Z2luIGlzIGJyb2tlbgorI3NvbmFyLm1vZHVsZXM9bW9kdWxlMTUKKworbW9kdWxlMS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YSBMaWJyYXJ5Cittb2R1bGUxLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9qYXZhCittb2R1bGUxLnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxLnNvbmFyLnRlc3RzPXRlc3QKK21vZHVsZTEuc29uYXIuYmluYXJpZXM9YnVpbGQvbGlicy9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUxLnNvbmFyLmxpYnJhcmllcz1idWlsZC9kZXBzLyouamFyCittb2R1bGUxLnNvbmFyLmxhbmd1YWdlPWphdmEKKworbW9kdWxlMi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YSBUdXRvcmlhbAorbW9kdWxlMi5zb25hci5wcm9qZWN0QmFzZURpcj0uCittb2R1bGUyLnNvbmFyLnNvdXJjZXM9dHV0b3JpYWwvamF2YS9zcmMsIHR1dG9yaWFsL2phdmEvZ2VuLWphdmEKK21vZHVsZTIuc29uYXIuYmluYXJpZXM9dHV0b3JpYWwvamF2YS90dXRvcmlhbC5qYXIKK21vZHVsZTIuc29uYXIubGlicmFyaWVzPWxpYi9qYXZhL2J1aWxkL2RlcHMvKi5qYXIsbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUyLnNvbmFyLmxhbmd1YWdlPWphdmEKKworbW9kdWxlMy5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YVNjcmlwdCBMaWJyYXJ5Cittb2R1bGUzLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9qcworbW9kdWxlMy5zb25hci5zb3VyY2VzPS4KK21vZHVsZTMuc29uYXIuZXhjbHVzaW9ucz10ZXN0LyoqLyoKK21vZHVsZTMuc29uYXIubGFuZ3VhZ2U9anMKKworbW9kdWxlNC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YVNjcmlwdCBUdXRvcmlhbAorbW9kdWxlNC5zb25hci5wcm9qZWN0QmFzZURpcj10dXRvcmlhbC9qcworbW9kdWxlNC5zb25hci5zb3VyY2VzPS4KK21vZHVsZTQuc29uYXIubGFuZ3VhZ2U9d2ViCisKK21vZHVsZTUuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEMrKyBMaWJyYXJ5Cittb2R1bGU1LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9jcHAKK21vZHVsZTUuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTUuc29uYXIudGVzdHM9dGVzdAorbW9kdWxlNS5zb25hci5sYW5ndWFnZT1jKysKKworbW9kdWxlNi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gQysrIFR1dG9yaWFsCittb2R1bGU2LnNvbmFyLnByb2plY3RCYXNlRGlyPXR1dG9yaWFsL2NwcAorbW9kdWxlNi5zb25hci5zb3VyY2VzPS4KK21vZHVsZTYuc29uYXIuZXhjbHVzaW9ucz1nZW4tY3BwLyoqLyoKK21vZHVsZTYuc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTcuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEMrKyBDcm9zcyBMYW5ndWFnZSBUZXN0Cittb2R1bGU3LnNvbmFyLnByb2plY3RCYXNlRGlyPXRlc3QvY3BwCittb2R1bGU3LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGU3LnNvbmFyLmxhbmd1YWdlPWMrKworCittb2R1bGU4LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBDb21waWxlcgorbW9kdWxlOC5zb25hci5wcm9qZWN0QmFzZURpcj1jb21waWxlci9jcHAKK21vZHVsZTguc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTguc29uYXIubGFuZ3VhZ2U9YysrCisKK21vZHVsZTkuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIFB5dGhvbiBMaWJyYXJ5Cittb2R1bGU5LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9weQorbW9kdWxlOS5zb25hci5zb3VyY2VzPXNyYworbW9kdWxlOS5zb25hci5sYW5ndWFnZT1weQorCittb2R1bGUxMC5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUHl0aG9uIFR1dG9yaWFsCittb2R1bGUxMC5zb25hci5wcm9qZWN0QmFzZURpcj10dXRvcmlhbC9weQorbW9kdWxlMTAuc29uYXIuc291cmNlcz0uCittb2R1bGUxMC5zb25hci5leGNsdXNpb25zPWdlbi1weS8qKi8qCittb2R1bGUxMC5zb25hci5sYW5ndWFnZT1weQorCittb2R1bGUxMS5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gUHl0aG9uIENyb3NzIExhbmd1YWdlIFRlc3QKK21vZHVsZTExLnNvbmFyLnByb2plY3RCYXNlRGlyPXRlc3QvcHkKK21vZHVsZTExLnNvbmFyLnNvdXJjZXM9LgorbW9kdWxlMTEuc29uYXIuZXhjbHVzaW9ucz1nZW4tKi8qKi8qCittb2R1bGUxMS5zb25hci5sYW5ndWFnZT1weQorCittb2R1bGUxMi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gY19nbGliIExpYnJhcnkKK21vZHVsZTEyLnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9jX2dsaWIKK21vZHVsZTEyLnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxMi5zb25hci5sYW5ndWFnZT1jCisKK21vZHVsZTEzLnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBEZWxwaGkgTGlicmFyeQorbW9kdWxlMTMuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL2RlbHBoaQorbW9kdWxlMTMuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTEzLnNvbmFyLnRlc3RzPXRlc3QKK21vZHVsZTEzLnNvbmFyLmxhbmd1YWdlPWRlbHBoCisKK21vZHVsZTE0LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBGbGV4IChhczMpIExpYnJhcnkKK21vZHVsZTE0LnNvbmFyLnByb2plY3RCYXNlRGlyPWxpYi9hczMKK21vZHVsZTE0LnNvbmFyLnNvdXJjZXM9c3JjCittb2R1bGUxNC5zb25hci5sYW5ndWFnZT1mbGV4CisKK21vZHVsZTE1LnNvbmFyLnByb2plY3ROYW1lPUFwYWNoZSBUaHJpZnQgLSBQSFAgTGlicmFyeQorbW9kdWxlMTUuc29uYXIucHJvamVjdEJhc2VEaXI9bGliL3BocAorbW9kdWxlMTUuc29uYXIuc291cmNlcz1zcmMKK21vZHVsZTE1LnNvbmFyLmxhbmd1YWdlPXBocAorCisjIFRPRE8gYWRkIHNvbWUgbW9yZSBsYW5ndWFnZXMgaGVyZQorCmRpZmYgLS1naXQgYS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdCBiL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CmluZGV4IGRhYzQ3NmYuLjdlMjRlMWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvQW5ub3RhdGlvblRlc3QudGhyaWZ0CkBAIC0yOCw2ICsyOCw3IEBACiAgIGNwcC50eXBlID0gIkRlbnNlRm9vIiwKICAgcHl0aG9uLnR5cGUgPSAiRGVuc2VGb28iLAogICBqYXZhLmZpbmFsID0gIiIsCisgIGFubm90YXRpb24ud2l0aG91dC52YWx1ZSwKICkKIAogZXhjZXB0aW9uIGZvb19lcnJvciB7CkBAIC01MSwxMSArNTIsMjAgQEAKIC8qIE5vdGUgdGhhdCBhbm5vdGF0aW9ucyBvbiBzZW51bSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICovCiBzZW51bSBzZWFzb25zIHsKICAgIlNwcmluZyIsCi0gICJTdW1tZXIiLCAKKyAgIlN1bW1lciIsCiAgICJGYWxsIiwKICAgIldpbnRlciIKIH0gKCBmb28gPSAiYmFyIiApCiAKK3N0cnVjdCBvc3RyX2RlZmF1bHQgeworICAxOiBpMzIgYmFyOworfQorCitzdHJ1Y3Qgb3N0cl9jdXN0b20geworICAxOiBpMzIgYmFyOworfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKKwogc2VydmljZSBmb29fc2VydmljZSB7CiAgIHZvaWQgZm9vKCkgKCBmb28gPSAiYmFyIiApCiB9IChhLmI9ImMiKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdCBiL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKaW5kZXggN2Q5NzFlNi4uYTU0NTM0ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorKysgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogbmFtZXNwYWNlIGNwcCB5b3pvbmUKK25hbWVzcGFjZSBlcmwgY29uc3RzXwogCiBzdHJ1Y3QgdGhpbmcgewogICAxOiBpMzIgaGVsbG8sCkBAIC00MCwxMiArNDEsMTYgQEAKIC8vY29uc3QgbWFwPGVudW1jb25zdGFudHMsc3RyaW5nPiBHRU5fRU5VTV9OQU1FUyA9IHtPTkUgOiAiSE9XRFkiLCBUV086ICJQQVJUTkVSIn0KIAogY29uc3QgaTMyIGhleF9jb25zdCA9IDB4MDAwMUYKK2NvbnN0IGkzMiBuZWdhdGl2ZV9oZXhfY29uc3RhbnQgPSAtMHgwMDAxRgogCiBjb25zdCBpMzIgR0VOX01FID0gLTM1MjM1NTMKIGNvbnN0IGRvdWJsZSBHRW5fRFVCID0gMzI1LjUzMgogY29uc3QgZG91YmxlIEdFbl9EVSA9IDA4NS4yMzU1CiBjb25zdCBzdHJpbmcgR0VOX1NUUklORyA9ICJhc2xka2phc2ZkIgogCitjb25zdCBkb3VibGUgZTEwID0gMWUxMCAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKK2NvbnN0IGRvdWJsZSBlMTEgPSAtMWUxMCAgCisKIGNvbnN0IG1hcDxpMzIsaTMyPiBHRU5fTUFQID0geyAzNTUzMiA6IDIzMywgNDM1MjMgOiA4NTMgfQogY29uc3QgbGlzdDxpMzI+IEdFTl9MSVNUID0gWyAyMzUyMzUsIDIzNTk4MzUyLCAzMjUzNTIzIF0KIApkaWZmIC0tZ2l0IGEvdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAppbmRleCBlMmJiYTQwLi5iNmE3NjU5IDEwMDY0NAotLS0gYS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorKysgYi90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdApAQCAtMjAsNiArMjAsNyBAQAogbmFtZXNwYWNlIGNfZ2xpYiBUVGVzdAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdC5kZWJ1ZwogbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKK25hbWVzcGFjZSByYiB0aHJpZnQudGVzdAogCiBzdHJ1Y3QgRG91YmxlcyB7CiAgMTogZG91YmxlIG5hbiwKQEAgLTI3LDcgKzI4LDcgQEAKICAzOiBkb3VibGUgbmVnaW5mLAogIDQ6IGRvdWJsZSByZXBlYXRpbmcsCiAgNTogZG91YmxlIGJpZywKLSA2OiBkb3VibGUgc21hbGwsCisgNjogZG91YmxlIHRpbnksCiAgNzogZG91YmxlIHplcm8sCiAgODogZG91YmxlIG5lZ3plcm8sCiB9CkBAIC0zNSw3ICszNiw3IEBACiBzdHJ1Y3QgT25lT2ZFYWNoIHsKICAgMTogYm9vbCBpbV90cnVlLAogICAyOiBib29sIGltX2ZhbHNlLAotICAzOiBieXRlIGFfYml0ZSA9IDB4N2YsCisgIDM6IGk4IGFfYml0ZSA9IDB4N2YsCiAgIDQ6IGkxNiBpbnRlZ2VyMTYgPSAweDdmZmYsCiAgIDU6IGkzMiBpbnRlZ2VyMzIsCiAgIDY6IGk2NCBpbnRlZ2VyNjQgPSAxMDAwMDAwMDAwMCwKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKICAgMTA6IGJvb2wgd2hhdF93aG8sCiAgIDExOiBiaW5hcnkgYmFzZTY0LAotICAxMjogbGlzdDxieXRlPiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCisgIDEyOiBsaXN0PGk4PiBieXRlX2xpc3QgPSBbMSwgMiwgM10sCiAgIDEzOiBsaXN0PGkxNj4gaTE2X2xpc3QgPSBbMSwyLDNdLAogICAxNDogbGlzdDxpNjQ+IGk2NF9saXN0ID0gWzEsMiwzXQogfQpAQCAtNjEsNyArNjIsNyBAQAogCiBzdHJ1Y3QgSG9seU1vbGV5IHsKICAgMTogbGlzdDxPbmVPZkVhY2g+IGJpZywKLSAgMjogc2V0PGxpc3Q8c3RyaW5nPj4gY29udGFpbiwKKyAgMjogc2V0PGxpc3Q8c3RyaW5nPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4gY29udGFpbiwKICAgMzogbWFwPHN0cmluZyxsaXN0PEJvbms+PiBib25rcywKIH0KIApAQCAtNzEsMTEgKzcyLDE1IEBACiB9CiAKIHN0cnVjdCBFbXB0eSB7Ci19Cit9ICgKKyAgcHl0aG9uLmltbXV0YWJsZSA9ICIiLAorKQogCiBzdHJ1Y3QgV3JhcHBlciB7CiAgIDE6IEVtcHR5IGZvbwotfQorfSAoCisgIHB5dGhvbi5pbW11dGFibGUgPSAiIiwKKykKIAogc3RydWN0IFJhbmRvbVN0dWZmIHsKICAgMTogaTMyIGEsCkBAIC0xMDAsNyArMTA1LDcgQEAKIAogc3RydWN0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QgewogICAvLyBwcmltaXRpdmUgZmllbGRzCi0gIDE6IGJ5dGUgICBhX2J5dGU7CisgIDE6IGk4ICAgICBhX2J5dGU7CiAgIDI6IGkxNiAgICBhX2kxNjsKICAgMzogaTMyICAgIGFfaTMyOwogICA0OiBpNjQgICAgYV9pNjQ7CkBAIC0xMTAsOSArMTE1LDkgQEAKICAgODogYm9vbCAgIHRydWVfZmllbGQ7CiAgIDk6IGJvb2wgICBmYWxzZV9maWVsZDsKICAgMTA6IEVtcHR5IGVtcHR5X3N0cnVjdF9maWVsZDsKLSAgCisKICAgLy8gcHJpbWl0aXZlcyBpbiBsaXN0cwotICAxMTogbGlzdDxieXRlPiAgICBieXRlX2xpc3Q7CisgIDExOiBsaXN0PGk4PiAgICAgIGJ5dGVfbGlzdDsKICAgMTI6IGxpc3Q8aTE2PiAgICAgaTE2X2xpc3Q7CiAgIDEzOiBsaXN0PGkzMj4gICAgIGkzMl9saXN0OwogICAxNDogbGlzdDxpNjQ+ICAgICBpNjRfbGlzdDsKQEAgLTEyMSw5ICsxMjYsOSBAQAogICAxNzogbGlzdDxiaW5hcnk+ICBiaW5hcnlfbGlzdDsKICAgMTg6IGxpc3Q8Ym9vbD4gICAgYm9vbGVhbl9saXN0OwogICAxOTogbGlzdDxFbXB0eT4gICBzdHJ1Y3RfbGlzdDsKLSAgCisKICAgLy8gcHJpbWl0aXZlcyBpbiBzZXRzCi0gIDIwOiBzZXQ8Ynl0ZT4gICAgIGJ5dGVfc2V0OworICAyMDogc2V0PGk4PiAgICAgICBieXRlX3NldDsKICAgMjE6IHNldDxpMTY+ICAgICAgaTE2X3NldDsKICAgMjI6IHNldDxpMzI+ICAgICAgaTMyX3NldDsKICAgMjM6IHNldDxpNjQ+ICAgICAgaTY0X3NldDsKQEAgLTEzMiwzMyArMTM3LDMzIEBACiAgIDI2OiBzZXQ8YmluYXJ5PiAgIGJpbmFyeV9zZXQ7CiAgIDI3OiBzZXQ8Ym9vbD4gICAgIGJvb2xlYW5fc2V0OwogICAyODogc2V0PEVtcHR5PiAgICBzdHJ1Y3Rfc2V0OwotICAKKwogICAvLyBtYXBzCiAgIC8vIHByaW1pdGl2ZXMgYXMga2V5cwotICAyOTogbWFwPGJ5dGUsIGJ5dGU+ICAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA7Ci0gIDMwOiBtYXA8aTE2LCBieXRlPiAgICAgICAgICAgICAgaTE2X2J5dGVfbWFwOwotICAzMTogbWFwPGkzMiwgYnl0ZT4gICAgICAgICAgICAgIGkzMl9ieXRlX21hcDsKLSAgMzI6IG1hcDxpNjQsIGJ5dGU+ICAgICAgICAgICAgICBpNjRfYnl0ZV9tYXA7Ci0gIDMzOiBtYXA8ZG91YmxlLCBieXRlPiAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwOwotICAzNDogbWFwPHN0cmluZywgYnl0ZT4gICAgICAgICAgIHN0cmluZ19ieXRlX21hcDsKLSAgMzU6IG1hcDxiaW5hcnksIGJ5dGU+ICAgICAgICAgICBiaW5hcnlfYnl0ZV9tYXA7Ci0gIDM2OiBtYXA8Ym9vbCwgYnl0ZT4gICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcDsKKyAgMjk6IG1hcDxpOCwgaTg+ICAgICAgICAgICAgICAgYnl0ZV9ieXRlX21hcDsKKyAgMzA6IG1hcDxpMTYsIGk4PiAgICAgICAgICAgICAgaTE2X2J5dGVfbWFwOworICAzMTogbWFwPGkzMiwgaTg+ICAgICAgICAgICAgICBpMzJfYnl0ZV9tYXA7CisgIDMyOiBtYXA8aTY0LCBpOD4gICAgICAgICAgICAgIGk2NF9ieXRlX21hcDsKKyAgMzM6IG1hcDxkb3VibGUsIGk4PiAgICAgICAgICAgZG91YmxlX2J5dGVfbWFwOworICAzNDogbWFwPHN0cmluZywgaTg+ICAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA7CisgIDM1OiBtYXA8YmluYXJ5LCBpOD4gICAgICAgICAgIGJpbmFyeV9ieXRlX21hcDsKKyAgMzY6IG1hcDxib29sLCBpOD4gICAgICAgICAgICAgYm9vbGVhbl9ieXRlX21hcDsKICAgLy8gcHJpbWl0aXZlcyBhcyB2YWx1ZXMKLSAgMzc6IG1hcDxieXRlLCBpMTY+ICAgICAgICAgICAgICBieXRlX2kxNl9tYXA7Ci0gIDM4OiBtYXA8Ynl0ZSwgaTMyPiAgICAgICAgICAgICAgYnl0ZV9pMzJfbWFwOwotICAzOTogbWFwPGJ5dGUsIGk2ND4gICAgICAgICAgICAgIGJ5dGVfaTY0X21hcDsKLSAgNDA6IG1hcDxieXRlLCBkb3VibGU+ICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA7Ci0gIDQxOiBtYXA8Ynl0ZSwgc3RyaW5nPiAgICAgICAgICAgYnl0ZV9zdHJpbmdfbWFwOwotICA0MjogbWFwPGJ5dGUsIGJpbmFyeT4gICAgICAgICAgIGJ5dGVfYmluYXJ5X21hcDsKLSAgNDM6IG1hcDxieXRlLCBib29sPiAgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwOworICAzNzogbWFwPGk4LCBpMTY+ICAgICAgICAgICAgICBieXRlX2kxNl9tYXA7CisgIDM4OiBtYXA8aTgsIGkzMj4gICAgICAgICAgICAgIGJ5dGVfaTMyX21hcDsKKyAgMzk6IG1hcDxpOCwgaTY0PiAgICAgICAgICAgICAgYnl0ZV9pNjRfbWFwOworICA0MDogbWFwPGk4LCBkb3VibGU+ICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA7CisgIDQxOiBtYXA8aTgsIHN0cmluZz4gICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcDsKKyAgNDI6IG1hcDxpOCwgYmluYXJ5PiAgICAgICAgICAgYnl0ZV9iaW5hcnlfbWFwOworICA0MzogbWFwPGk4LCBib29sPiAgICAgICAgICAgICBieXRlX2Jvb2xlYW5fbWFwOwogICAvLyBjb2xsZWN0aW9ucyBhcyBrZXlzCi0gIDQ0OiBtYXA8bGlzdDxieXRlPiwgYnl0ZT4gICAgICAgbGlzdF9ieXRlX21hcDsKLSAgNDU6IG1hcDxzZXQ8Ynl0ZT4sIGJ5dGU+ICAgICAgICBzZXRfYnl0ZV9tYXA7Ci0gIDQ2OiBtYXA8bWFwPGJ5dGUsYnl0ZT4sIGJ5dGU+ICAgbWFwX2J5dGVfbWFwOworICA0NDogbWFwPGxpc3Q8aTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgICAgbGlzdF9ieXRlX21hcDsKKyAgNDU6IG1hcDxzZXQ8aTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgICAgIHNldF9ieXRlX21hcDsKKyAgNDY6IG1hcDxtYXA8aTgsaTg+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBpOD4gICAgIG1hcF9ieXRlX21hcDsKICAgLy8gY29sbGVjdGlvbnMgYXMgdmFsdWVzCi0gIDQ3OiBtYXA8Ynl0ZSwgbWFwPGJ5dGUsYnl0ZT4+ICAgYnl0ZV9tYXBfbWFwOwotICA0ODogbWFwPGJ5dGUsIHNldDxieXRlPj4gICAgICAgIGJ5dGVfc2V0X21hcDsKLSAgNDk6IG1hcDxieXRlLCBsaXN0PGJ5dGU+PiAgICAgICBieXRlX2xpc3RfbWFwOworICA0NzogbWFwPGk4LCBtYXA8aTgsaTg+PiAgICAgYnl0ZV9tYXBfbWFwOworICA0ODogbWFwPGk4LCBzZXQ8aTg+PiAgICAgICAgYnl0ZV9zZXRfbWFwOworICA0OTogbWFwPGk4LCBsaXN0PGk4Pj4gICAgICAgYnl0ZV9saXN0X21hcDsKIH0KIAogLy8gVG8gYmUgdXNlZCB0byB0ZXN0IHRoZSBzZXJpYWxpemF0aW9uIG9mIGFuIGVtcHR5IG1hcApAQCAtMjQzLDYgKzI0OCw4IEBACiAgIHZvaWQgbWV0aG9kV2l0aERlZmF1bHRBcmdzKDE6IGkzMiBzb21ldGhpbmcgPSBNWUNPTlNUKTsKIAogICBvbmV3YXkgdm9pZCBvbmV3YXlNZXRob2QoKTsKKworICBib29sIGRlY2xhcmVkRXhjZXB0aW9uTWV0aG9kKDE6IGJvb2wgc2hvdWxkVGhyb3cpIHRocm93cyAoMTogRXhjZXB0aW9uV2l0aEFNYXAgeHdhbWFwKTsKIH0KIAogc2VydmljZSBJbmhlcml0ZWQgZXh0ZW5kcyBTcnYgewpAQCAtMjU0LDEwICsyNjEsMTAgQEAKIC8vIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhpcyB0aGluZyBpcyB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUKIC8vIHNvIHRoYXQgWmxpYlRlc3QgaGFzIG1vcmUgaGlnaGx5IGNvbXByZXNzaWJsZSBkYXRhIHRvIHBsYXkgd2l0aC4KIHN0cnVjdCBCbG93VXAgewotICAxOiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiMTsKLSAgMjogbWFwPGxpc3Q8aTMyPixzZXQ8bWFwPGkzMixzdHJpbmc+Pj4gYjI7Ci0gIDM6IG1hcDxsaXN0PGkzMj4sc2V0PG1hcDxpMzIsc3RyaW5nPj4+IGIzOwotICA0OiBtYXA8bGlzdDxpMzI+LHNldDxtYXA8aTMyLHN0cmluZz4+PiBiNDsKKyAgMTogbWFwPGxpc3Q8aTMyPihweXRob24uaW1tdXRhYmxlID0gIiIpLHNldDxtYXA8aTMyLHN0cmluZz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+PiBiMTsKKyAgMjogbWFwPGxpc3Q8aTMyPihweXRob24uaW1tdXRhYmxlID0gIiIpLHNldDxtYXA8aTMyLHN0cmluZz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+PiBiMjsKKyAgMzogbWFwPGxpc3Q8aTMyPihweXRob24uaW1tdXRhYmxlID0gIiIpLHNldDxtYXA8aTMyLHN0cmluZz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+PiBiMzsKKyAgNDogbWFwPGxpc3Q8aTMyPihweXRob24uaW1tdXRhYmxlID0gIiIpLHNldDxtYXA8aTMyLHN0cmluZz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIik+PiBiNDsKIH0KIAogCkBAIC0zNjQsNCArMzcxLDggQEAKICAgb3B0aW9uYWwgaTMyIGZpZWxkMTA7CiAgIG9wdGlvbmFsIGkzMiBmaWVsZDExOwogICBvcHRpb25hbCBpMzIgZmllbGQxMjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CisKK3N0cnVjdCBMaXN0RG91YmxlUGVyZiB7CisgIDE6IGxpc3Q8ZG91YmxlPiBmaWVsZDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQgYi90ZXN0L0RlbnNlTGlua2luZ1Rlc3QudGhyaWZ0CmluZGV4IGNmNjE0OTYuLjNhNWI5NTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvRGVuc2VMaW5raW5nVGVzdC50aHJpZnQKKysrIGIvdGVzdC9EZW5zZUxpbmtpbmdUZXN0LnRocmlmdApAQCAtMzQsNiArMzQsNyBAQAogKi8KIAogbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKIAogc3RydWN0IE9uZU9mRWFjaFpaIHsKICAgMTogYm9vbCBpbV90cnVlLApAQCAtOTAsMyArOTEsOCBAQAogc2VydmljZSBTcnYgewogICBpMzIgSmFua3koMTogaTMyIGFyZykKIH0KKworc2VydmljZSBVbmRlcnNjb3JlU3J2IHsKKyAgaTY0IHNvbWVfcnBjX2NhbGwoMTogc3RyaW5nIG1lc3NhZ2UpCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvRG9jVGVzdC50aHJpZnQgYi90ZXN0L0RvY1Rlc3QudGhyaWZ0CmluZGV4IGNiMzU1YWUuLmQ3MDJiMmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvRG9jVGVzdC50aHJpZnQKKysrIGIvdGVzdC9Eb2NUZXN0LnRocmlmdApAQCAtNTgsNyArNTgsNyBAQAogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZwogCiAgIC8qKiBkb2N0IHRleHQgZ29lcyBiZWZvcmUgYSBjb21tYSAqLwotICA0OiAgYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDQ6ICBpOCAgICAgYnl0ZV90aGluZywKIAogICA5OiAgaTMyICAgIGkzMl90aGluZywKICAgMTE6IGk2NCAgICBpNjRfdGhpbmcKQEAgLTc0LDcgKzc0LDcgQEAKIAogc3RydWN0IFh0cnVjdDIKIHsKLSAgMTogYnl0ZSAgIGJ5dGVfdGhpbmcsCisgIDE6IGk4ICAgICBieXRlX3RoaW5nLAogICAyOiBYdHJ1Y3Qgc3RydWN0X3RoaW5nLAogICAzOiBpMzIgICAgaTMyX3RoaW5nCiB9CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgLyoqIEFuZCB0aGlzIGlzIGhvdyB5b3Ugd291bGQgZG9jdW1lbnQgZnVuY3Rpb25zIGluIGEgc2VydmljZSAqLwogICB2b2lkICAgICAgICAgdGVzdFZvaWQoKSwKICAgc3RyaW5nICAgICAgIHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKSwKLSAgYnl0ZSAgICAgICAgIHRlc3RCeXRlKDE6IGJ5dGUgdGhpbmcpLAorICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCiAgIGkzMiAgICAgICAgICB0ZXN0STMyKDE6IGkzMiB0aGluZyksCiAKICAgLyoqIExpa2UgdGhpcyBvbmUgKi8KQEAgLTE1NSw3ICsxNTUsNyBAQAogdHlwZWRlZiBpMzIgVHJpdmlhbE11bHRpTGluZQogCiAvKioKLSAqIFRoaXMgaXMgdGhlIGNhbm5vbmljYWwgZXhhbXBsZQorICogVGhpcyBpcyB0aGUgY2Fub25pY2FsIGV4YW1wbGUKICAqIG9mIGEgbXVsdGlsaW5lIGRvY3N0cmluZy4KICAqLwogdHlwZWRlZiBpMzIgU3RhbmRhcmRNdWx0aUxpbmUKQEAgLTI0NCw0ICsyNDQsNDQgQEAKICovCiB0eXBlZGVmIGkzMiBUb3RhbGx5RGVnZW5lcmF0ZQogCisvKipubyByb29tIGZvciBuZXdsaW5lIGhlcmUqLworCisvKiAqIC8gKi8KK3R5cGVkZWYgaTMyIFRlc3RGb3IzNTAxYQorCisvKioKKyAqIC8KKyAqLwordHlwZWRlZiBpMzIgVGVzdEZvcjM1MDFiCisKKworLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDAgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyogQ29tbWVudC1lbmQgdG9rZW5zIGNhbiBvZiBjb3Vyc2UgaGF2ZSBtb3JlIHRoYW4gb25lIGFzdGVyaXNrICoqLworc3RydWN0IFRlc3RGb3IzNzA5XzAxIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDIgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqLworc3RydWN0IFRlc3RGb3IzNzA5XzAzIHsgLyogPyAqLyAxOiBpMzIgZm9vIH0KKy8qKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDQgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDUgeyAvKiA/ICovIDE6IGkzMiBmb28gfQorLyoqKiBDb21tZW50LWVuZCB0b2tlbnMgY2FuIG9mIGNvdXJzZSBoYXZlIG1vcmUgdGhhbiBvbmUgYXN0ZXJpc2sgKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNiB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKi8KK3N0cnVjdCBUZXN0Rm9yMzcwOV8wNyB7IC8qID8gKi8gMTogaTMyIGZvbyB9CisvKioqIENvbW1lbnQtZW5kIHRva2VucyBjYW4gb2YgY291cnNlIGhhdmUgbW9yZSB0aGFuIG9uZSBhc3RlcmlzayAqKiovCitzdHJ1Y3QgVGVzdEZvcjM3MDlfMDggeyAvKiA/ICovIDE6IGkzMiBmb28gfQorCitzdHJ1Y3QgVGVzdEZvcjM3MDkgeworICAvKiogVGhpcyBpcyBhIGNvbW1lbnQgKi8KKyAgMTogcmVxdWlyZWQgc3RyaW5nIGlkLAorICAvKiogVGhpcyBpcyBhbHNvIGEgY29tbWVudCAqKi8KKyAgMjogcmVxdWlyZWQgc3RyaW5nIHR5cGVJZCwKKyAgLyoqIFlldCBhbm90aGVyIGNvbW1lbnQhICovCisgIDM6IHJlcXVpcmVkIGkzMiBlbmRUaW1lc3RhbXAKK30KKworCiAvKiBUSEUgRU5EICovCmRpZmYgLS1naXQgYS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIxMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDE3IEBACituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCisvLyBtb3JlIHRlc3RzIG9uIGRvdWJsZSBjb25zdGFudHMgKHByZWNpc2lvbiBhbmQgdHlwZSBjaGVja3MpCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUID0gMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCA9IC0xMDAKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QgPSAzLjE0MTU5MjY1MzU5Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAxMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC0xMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QgPSAxLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCA9IC0xLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisKK2NvbnN0IGxpc3Q8ZG91YmxlPiBET1VCTEVfTElTVF9URVNUID0gWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjQwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycworCitlbnVtIEdyZWVrR29kR29kZGVzcyB7CisgICAgQVJFUywKKyAgICBBUEhST0RJVEUsCisgICAgWkVVUywKKyAgICBQT1NFSURPTiwKKyAgICBIRVJBLAorfQorCit0eXBlZGVmIEdyZWVrR29kR29kZGVzcyBHcmVla0dvZEdvZGRlc3NUeXBlCit0eXBlZGVmIGkzMiBQb3dlcgorCitzdHJ1Y3QgR29kQmVhbiB7CisgICAgMTogb3B0aW9uYWwgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIFBvd2VyPiBwb3dlciwKKyAgICAyOiBvcHRpb25hbCBzZXQ8R3JlZWtHb2RHb2RkZXNzVHlwZT4gZ29kZGVzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBHcmVla0dvZEdvZGRlc3M+IGJ5QWxpYXMsCisgICAgNDogb3B0aW9uYWwgc2V0PHN0cmluZz4gaW1hZ2VzLAorfQorCitjb25zdCBtYXA8R3JlZWtHb2RHb2RkZXNzVHlwZSwgc3RyaW5nPiBBVFRSSUJVVEVTID0KK3sKKyAgICBHcmVla0dvZEdvZGRlc3MuWkVVUzogImxpZ2h0bmluZyBib2x0IiwKKyAgICBHcmVla0dvZEdvZGRlc3MuUE9TRUlET046ICJ0cmlkZW50IiwKK30KKworY29uc3Qgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IEJFQVVUWSA9IFsgR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSwgR3JlZWtHb2RHb2RkZXNzLkhFUkEgXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtVGVzdC50aHJpZnQgYi90ZXN0L0VudW1UZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTYxZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9FbnVtVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK25hbWVzcGFjZSBjX2dsaWIgVFRlc3QKKworZW51bSBNeUVudW0xIHsKKyAgTUUxXzAgPSAwLAorICBNRTFfMSA9IDEsCisgIE1FMV8yLAorICBNRTFfMywKKyAgTUUxXzUgPSA1LAorICBNRTFfNiwKK30KKworZW51bSBNeUVudW0yIHsKKyAgTUUyXzAsCisgIE1FMl8xLAorICBNRTJfMiwKK30KKworZW51bSBNeUVudW0yX2FnYWluIHsKKyAgLy8gZW51bSB2YWx1ZSBpZGVudGlmaWVycyBtYXkgYXBwZWFyIGFnYWluIGluIGFub3RoZXIgZW51bSB0eXBlCisgIE1FMF8xLAorICBNRTFfMSwKKyAgTUUyXzEsCisgIE1FM18xLAorfQorCitlbnVtIE15RW51bTMgeworICBNRTNfMCwKKyAgTUUzXzEsCisgIE1FM19OMiA9IC0yLAorICBNRTNfTjEsCisgIE1FM19EMCwKKyAgTUUzX0QxLAorICBNRTNfOSA9IDksCisgIE1FM18xMCwKK30KKworZW51bSBNeUVudW00IHsKKyAgTUU0X0EgPSAweDdmZmZmZmZkCisgIE1FNF9CCisgIE1FNF9DCisgIC8vIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGFub3RoZXIgZW51bSB2YWx1ZSBoZXJlIGZhaWxzCisgIC8vIHdpdGggYW4gb3ZlcmZsb3cgZXJyb3IsIGFzIHdlIG92ZXJmbG93IHZhbHVlcyB0aGF0IGNhbiBiZQorICAvLyByZXByZXNlbnRlZCB3aXRoIGFuIGkzMi4KK30KKworZW51bSBNeUVudW01IHsKKyAgZTEgICAgICAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKKyAgZTIgPSA0MiAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKK30KKworZW51bSBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbSB7CisgIGN1c3RvbTEgPSAxLAorICBDdXN0b00yCit9IChjcHAuY3VzdG9tb3N0cmVhbSkKKworc3RydWN0IE15U3RydWN0IHsKKyAgMTogTXlFbnVtMiBtZTJfMiA9IE15RW51bTEuTUUyXzIKKyAgMjogTXlFbnVtMyBtZTNfbjIgPSBNeUVudW0zLk1FM19OMgorICAzOiBNeUVudW0zIG1lM19kMSA9IE15RW51bTMuTUUzX0QxCit9CisKK3N0cnVjdCBFbnVtVGVzdFN0cnVjdCB7CisgIDE6IE15RW51bTMgYV9lbnVtOworICAyOiBsaXN0PE15RW51bTM+IGVudW1fbGlzdDsKKyAgMzogc2V0PE15RW51bTM+IGVudW1fc2V0OworICA0OiBtYXA8TXlFbnVtMywgTXlFbnVtMz4gZW51bV9lbnVtX21hcDsKKyAgLy8gY29sbGVjdGlvbnMgYXMga2V5cworICA0NDogbWFwPGxpc3Q8TXlFbnVtMz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIE15RW51bTM+IGxpc3RfZW51bV9tYXA7CisgIDQ1OiBtYXA8c2V0PE15RW51bTM+IChweXRob24uaW1tdXRhYmxlID0gIiIpLCBNeUVudW0zPiBzZXRfZW51bV9tYXA7CisgIDQ2OiBtYXA8bWFwPE15RW51bTMsTXlFbnVtMz4gKHB5dGhvbi5pbW11dGFibGUgPSAiIiksIE15RW51bTM+IG1hcF9lbnVtX21hcDsKKyAgLy8gY29sbGVjdGlvbnMgYXMgdmFsdWVzCisgIDQ3OiBtYXA8TXlFbnVtMywgbWFwPE15RW51bTMsIE15RW51bTM+PiBlbnVtX21hcF9tYXA7CisgIDQ4OiBtYXA8TXlFbnVtMywgc2V0PE15RW51bTM+PiBlbnVtX3NldF9tYXA7CisgIDQ5OiBtYXA8TXlFbnVtMywgbGlzdDxNeUVudW0zPj4gZW51bV9saXN0X21hcDsKK30KKworY29uc3QgRW51bVRlc3RTdHJ1Y3QgRU5VTV9URVNUID0geworICAnYV9lbnVtJzogTXlFbnVtMy5NRTNfRDEsCisgICdlbnVtX2xpc3QnOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzXzAsIE15RW51bTMuTUUzX04yXSwKKyAgJ2VudW1fc2V0JzogW015RW51bTMuTUUzX0QxLCBNeUVudW0zLk1FM19OMV0sCisgICdlbnVtX2VudW1fbWFwJzoge015RW51bTMuTUUzX0QxOiBNeUVudW0zLk1FM18wLCBNeUVudW0zLk1FM18wOiBNeUVudW0zLk1FM19EMX0sCisgICdsaXN0X2VudW1fbWFwJzoge1tNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzXzAsIFtNeUVudW0zLk1FM19EMV06IE15RW51bTMuTUUzXzAsIFtNeUVudW0zLk1FM18wXTogTXlFbnVtMy5NRTNfRDF9LAorICAnc2V0X2VudW1fbWFwJzoge1tNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfMF06IE15RW51bTMuTUUzXzAsIFtNeUVudW0zLk1FM19EMV06IE15RW51bTMuTUUzXzB9LAorICAnbWFwX2VudW1fbWFwJzoge3tNeUVudW0zLk1FM19OMTogTXlFbnVtMy5NRTNfMTB9OiBNeUVudW0zLk1FM18xfSwKKyAgJ2VudW1fbWFwX21hcCc6IHtNeUVudW0zLk1FM19OMToge015RW51bTMuTUUzX0QxOiBNeUVudW0zLk1FM19EMX19LAorICAnZW51bV9zZXRfbWFwJzoge015RW51bTMuTUUzX04yOiBbTXlFbnVtMy5NRTNfRDEsIE15RW51bTMuTUUzX04xXSwgTXlFbnVtMy5NRTNfMTA6IFtNeUVudW0zLk1FM19EMSwgTXlFbnVtMy5NRTNfTjFdfSwKKyAgJ2VudW1fbGlzdF9tYXAnOiB7TXlFbnVtMy5NRTNfRDE6IFtNeUVudW0zLk1FM18xMF0sIE15RW51bTMuTUUzXzA6IFtNeUVudW0zLk1FM185LCBNeUVudW0zLk1FM18xMF19LAorfQorCitzZXJ2aWNlIEVudW1UZXN0U2VydmljZSB7CisgIE15RW51bTMgdGVzdEVudW0oMTogTXlFbnVtMyBlbnVtMSksCisgIGxpc3Q8TXlFbnVtMz4gdGVzdEVudW1MaXN0KDE6IGxpc3Q8TXlFbnVtMz4gZW51bTEpLAorICBzZXQ8TXlFbnVtMz4gdGVzdEVudW1TZXQoMTogc2V0PE15RW51bTM+IGVudW0xKSwKKyAgbWFwPE15RW51bTMsIE15RW51bTM+IHRlc3RFbnVtTWFwKDE6IG1hcDxNeUVudW0zLCBNeUVudW0zPiBlbnVtMSksCisgIEVudW1UZXN0U3RydWN0IHRlc3RFbnVtU3RydWN0KDE6IEVudW1UZXN0U3RydWN0IGVudW0xKSwKK30KZGlmZiAtLWdpdCBhL3Rlc3QvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L0Zhc3RiaW5hcnlUZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZjZlZmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvRmFzdGJpbmFyeVRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1yIiIiCi10aHJpZnQgLS1nZW4gcHkgRGVidWdQcm90b1Rlc3QudGhyaWZ0Ci0uL0Zhc3RiaW5hcnlUZXN0LnB5Ci0iIiIKLQotIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgotCi1pbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4vZ2VuLXB5JykKLQotaW1wb3J0IG1hdGgKLWZyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgotZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotCi1pbXBvcnQgdGltZWl0Ci1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKLWZyb20gcHByaW50IGltcG9ydCBwcHJpbnQKLQotY2xhc3MgVERldk51bGxUcmFuc3BvcnQoVFRyYW5zcG9ydC5UVHJhbnNwb3J0QmFzZSk6Ci0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBwYXNzCi0gIGRlZiBpc09wZW4oc2VsZik6Ci0gICAgcmV0dXJuIFRydWUKLQotb29lMSA9IE9uZU9mRWFjaCgpCi1vb2UxLmltX3RydWUgICA9IFRydWU7Ci1vb2UxLmltX2ZhbHNlICA9IEZhbHNlOwotb29lMS5hX2JpdGUgICAgPSAweGQ2Owotb29lMS5pbnRlZ2VyMTYgPSAyNzAwMDsKLW9vZTEuaW50ZWdlcjMyID0gMTw8MjQ7Ci1vb2UxLmludGVnZXI2NCA9IDYwMDAgKiAxMDAwICogMTAwMDsKLW9vZTEuZG91YmxlX3ByZWNpc2lvbiA9IG1hdGgucGk7Ci1vb2UxLnNvbWVfY2hhcmFjdGVycyAgPSAiRGVidWcgVEhJUyEiOwotb29lMS56b21nX3VuaWNvZGUgICAgID0gIlx4ZDdcblxhXHQiOwotCi1vb2UyID0gT25lT2ZFYWNoKCk7Ci1vb2UyLmludGVnZXIxNiA9IDE2Owotb29lMi5pbnRlZ2VyMzIgPSAzMjsKLW9vZTIuaW50ZWdlcjY0ID0gNjQ7Ci1vb2UyLmRvdWJsZV9wcmVjaXNpb24gPSAobWF0aC5zcXJ0KDUpKzEpLzI7Ci1vb2UyLnNvbWVfY2hhcmFjdGVycyAgPSAiOlIgKG1lIGdvaW5nIFwicnJyclwiKSI7Ci1vb2UyLnpvbWdfdW5pY29kZSAgICAgPSAiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAotICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHhjN1x4ODNceGUyXHg4MFx4YmMiOwotCi1obSA9IEhvbHlNb2xleSh7ImJpZyI6W10sICJjb250YWluIjpzZXQoKSwgImJvbmtzIjp7fX0pCi1obS5iaWcuYXBwZW5kKG9vZTEpCi1obS5iaWcuYXBwZW5kKG9vZTIpCi1obS5iaWdbMF0uYV9iaXRlID0gMHgyMjsKLWhtLmJpZ1sxXS5hX2JpdGUgPSAweDIyOwotCi1obS5jb250YWluLmFkZCgoImFuZCBhIG9uZSIsICJhbmQgYSB0d28iKSkKLWhtLmNvbnRhaW4uYWRkKCgidGhlbiBhIG9uZSwgdHdvIiwgInRocmVlISIsICJGT1VSISIpKQotaG0uY29udGFpbi5hZGQoKCkpCi0KLWhtLmJvbmtzWyJub3RoaW5nIl0gPSBbXTsKLWhtLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKLSAgQm9uayh7InR5cGUiOjEsICJtZXNzYWdlIjoiV2FpdC4ifSksCi0gIEJvbmsoeyJ0eXBlIjoyLCAibWVzc2FnZSI6IldoYXQ/In0pLAotXQotaG0uYm9ua3NbInBvZSJdID0gWwotICBCb25rKHsidHlwZSI6MywgIm1lc3NhZ2UiOiJxdW90aCJ9KSwKLSAgQm9uayh7InR5cGUiOjQsICJtZXNzYWdlIjoidGhlIHJhdmVuIn0pLAotICBCb25rKHsidHlwZSI6NSwgIm1lc3NhZ2UiOiJuZXZlcm1vcmUifSksCi1dCi0KLXJzID0gUmFuZG9tU3R1ZmYoKQotcnMuYSA9IDEKLXJzLmIgPSAyCi1ycy5jID0gMwotcnMubXlpbnRsaXN0ID0gcmFuZ2UoMjApCi1ycy5tYXBzID0gezE6V3JhcHBlcih7ImZvbyI6RW1wdHkoKX0pLDI6V3JhcHBlcih7ImZvbyI6RW1wdHkoKX0pfQotcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1TAotcnMudHJpcGxlID0gMy4xNAotCi0jIG1ha2Ugc3VyZSB0aGlzIHNwbGl0cyB0d28gYnVmZmVycyBpbiBhIGJ1ZmZlcmVkIHByb3RvY29sCi1yc2h1Z2UgPSBSYW5kb21TdHVmZigpCi1yc2h1Z2UubXlpbnRsaXN0PXJhbmdlKDEwMDAwKQotCi1teV96ZXJvID0gU3J2Lkphbmt5X3Jlc3VsdCh7ImFyZyI6NX0pCi0KLWRlZiBjaGVja1dyaXRlKG8pOgotICB0cmFuc19mYXN0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgdHJhbnNfc2xvdyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHByb3RfZmFzdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFuc19mYXN0KQotICBwcm90X3Nsb3cgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zX3Nsb3cpCi0KLSAgby53cml0ZShwcm90X2Zhc3QpCi0gIG8ud3JpdGUocHJvdF9zbG93KQotICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCi0gIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKLSAgaWYgT1JJRyAhPSBNSU5FOgotICAgIHByaW50ICJtaW5lOiAlc1xub3JpZzogJXMiICUgKHJlcHIoTUlORSksIHJlcHIoT1JJRykpCi0KLWRlZiBjaGVja1JlYWQobyk6Ci0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpKQotICBvLndyaXRlKHByb3QpCi0KLSAgc2xvd192ZXJzaW9uX2JpbmFyeSA9IHByb3QudHJhbnMuZ2V0dmFsdWUoKQotCi0gIHByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQoCi0gICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSkKLSAgYyA9IG8uX19jbGFzc19fKCkKLSAgYy5yZWFkKHByb3QpCi0gIGlmIGMgIT0gbzoKLSAgICBwcmludCAiY29weTogIgotICAgIHBwcmludChldmFsKHJlcHIoYykpKQotICAgIHByaW50ICJvcmlnOiAiCi0gICAgcHByaW50KGV2YWwocmVwcihvKSkpCi0KLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgKLSAgICAgICAgICAgVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoCi0gICAgICAgICAgICAgVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNsb3dfdmVyc2lvbl9iaW5hcnkpKSkKLSAgYyA9IG8uX19jbGFzc19fKCkKLSAgYy5yZWFkKHByb3QpCi0gIGlmIGMgIT0gbzoKLSAgICBwcmludCAiY29weTogIgotICAgIHBwcmludChldmFsKHJlcHIoYykpKQotICAgIHByaW50ICJvcmlnOiAiCi0gICAgcHByaW50KGV2YWwocmVwcihvKSkpCi0KLQotZGVmIGRvVGVzdCgpOgotICBjaGVja1dyaXRlKGhtKQotICBub19zZXQgPSBkZWVwY29weShobSkKLSAgbm9fc2V0LmNvbnRhaW4gPSBzZXQoKQotICBjaGVja1JlYWQobm9fc2V0KQotICBjaGVja1dyaXRlKHJzKQotICBjaGVja1JlYWQocnMpCi0gIGNoZWNrV3JpdGUocnNodWdlKQotICBjaGVja1JlYWQocnNodWdlKQotICBjaGVja1dyaXRlKG15X3plcm8pCi0gIGNoZWNrUmVhZChteV96ZXJvKQotICBjaGVja1JlYWQoQmFja3dhcmRzKHsiZmlyc3RfdGFnMiI6NCwgInNlY29uZF90YWcxIjoyfSkpCi0KLSAgIyBPbmUgY2FzZSB3aGVyZSB0aGUgc2VyaWFsaXplZCBmb3JtIGNoYW5nZXMsIGJ1dCBvbmx5IHN1cGVyZmljaWFsbHkuCi0gIG8gPSBCYWNrd2FyZHMoeyJmaXJzdF90YWcyIjo0LCAic2Vjb25kX3RhZzEiOjJ9KQotICB0cmFuc19mYXN0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKLSAgdHJhbnNfc2xvdyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gIHByb3RfZmFzdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCh0cmFuc19mYXN0KQotICBwcm90X3Nsb3cgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zX3Nsb3cpCi0KLSAgby53cml0ZShwcm90X2Zhc3QpCi0gIG8ud3JpdGUocHJvdF9zbG93KQotICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCi0gIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKLSAgaWYgT1JJRyA9PSBNSU5FOgotICAgIHByaW50ICJUaGF0IHNob3VsZG4ndCBoYXBwZW4uIgotCi0KLSAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKLSAgby53cml0ZShwcm90KQotICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCgKLSAgICAgICAgICAgVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKAotICAgICAgICAgICAgIHByb3QudHJhbnMuZ2V0dmFsdWUoKSkpCi0gIGMgPSBvLl9fY2xhc3NfXygpCi0gIGMucmVhZChwcm90KQotICBpZiBjICE9IG86Ci0gICAgcHJpbnQgImNvcHk6ICIKLSAgICBwcHJpbnQoZXZhbChyZXByKGMpKSkKLSAgICBwcmludCAib3JpZzogIgotICAgIHBwcmludChldmFsKHJlcHIobykpKQotCi0KLQotZGVmIGRvQmVuY2htYXJrKCk6Ci0KLSAgaXRlcnMgPSAyNTAwMAotCi0gIHNldHVwID0gIiIiCi1mcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi10cmFucyA9IFREZXZOdWxsVHJhbnNwb3J0KCkKLXByb3QgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sJXModHJhbnMpCi0iIiIKLQotICBzZXR1cF9mYXN0ID0gc2V0dXAgJSAiQWNjZWxlcmF0ZWQiCi0gIHNldHVwX3Nsb3cgPSBzZXR1cCAlICIiCi0KLSAgcHJpbnQgIlN0YXJ0aW5nIEJlbmNobWFya3MiCi0KLSAgcHJpbnQgIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlIFwKLSAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKQotICBwcmludCAiSG9seU1vbGV5IEFjY2VsZXIuID0gJWYiICUgXAotICAgICAgdGltZWl0LlRpbWVyKCdobS53cml0ZShwcm90KScsIHNldHVwX2Zhc3QpLnRpbWVpdChudW1iZXI9aXRlcnMpCi0KLSAgcHJpbnQgIkZhc3RTdHJ1Y3QgU3RhbmRhcmQgPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ3JzLndyaXRlKHByb3QpJywgc2V0dXBfc2xvdykudGltZWl0KG51bWJlcj1pdGVycykKLSAgcHJpbnQgIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJSBcCi0gICAgICB0aW1laXQuVGltZXIoJ3JzLndyaXRlKHByb3QpJywgc2V0dXBfZmFzdCkudGltZWl0KG51bWJlcj1pdGVycykKLQotCi0KLWRvVGVzdCgpCi1kb0JlbmNobWFyaygpCi0KZGlmZiAtLWdpdCBhL3Rlc3QvRnVsbENhbWVsVGVzdC50aHJpZnQgYi90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZTRkZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0Z1bGxDYW1lbFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QuZnVsbGNhbWVsCisKK3N0cnVjdCBPbmVPZkVhY2haWiB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogYnl0ZSBhX2JpdGUsCisgIDQ6IGkxNiBpbnRlZ2VyMTYsCisgIDU6IGkzMiBpbnRlZ2VyMzIsCisgIDY6IGk2NCBpbnRlZ2VyNjQsCisgIDc6IGRvdWJsZSBkb3VibGVfcHJlY2lzaW9uLAorICA4OiBzdHJpbmcgc29tZV9jaGFyYWN0ZXJzLAorICA5OiBzdHJpbmcgem9tZ191bmljb2RlLAorICAxMDogYm9vbCB3aGF0X3dobywKK30KKworc2VydmljZSBVbmRlcnNjb3JlU3J2IHsKKyAgaTY0IHNvbWVfcnBjX2NhbGwoMTogc3RyaW5nIG1lc3NhZ2UpCit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvSW5jbHVkZS50aHJpZnQgYi90ZXN0L0luY2x1ZGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjMxOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0luY2x1ZGUudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCisKK3N0cnVjdCBJbmNsdWRlVGVzdCB7CisgIDE6IHJlcXVpcmVkIFRocmlmdFRlc3QuQm9vbHMgYm9vbHMKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L0phdmFEZWVwQ29weVRlc3QudGhyaWZ0IGIvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk3NGFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdApAQCAtMCwwICsxLDE5IEBACitpbmNsdWRlICJKYXZhVHlwZXMudGhyaWZ0IgorCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgRGVlcENvcHlGb28geworICAxOiBvcHRpb25hbCBsaXN0PERlZXBDb3B5QmFyPiBsLAorICAyOiBvcHRpb25hbCBzZXQ8RGVlcENvcHlCYXI+IHMsCisgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIERlZXBDb3B5QmFyPiBtLAorICA0OiBvcHRpb25hbCBsaXN0PEphdmFUeXBlcy5PYmplY3Q+IGxpLAorICA1OiBvcHRpb25hbCBzZXQ8SmF2YVR5cGVzLk9iamVjdD4gc2ksCisgIDY6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIEphdmFUeXBlcy5PYmplY3Q+IG1pLAorICA3OiBvcHRpb25hbCBEZWVwQ29weUJhciBiYXIsCit9CisKK3N0cnVjdCBEZWVwQ29weUJhciB7CisgIDE6IG9wdGlvbmFsIHN0cmluZyBhLAorICAyOiBvcHRpb25hbCBpMzIgYiwKKyAgMzogb3B0aW9uYWwgYm9vbCBjLAorfQpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhVHlwZXMudGhyaWZ0IGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzMzYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0phdmFUeXBlcy50aHJpZnQKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IEludGVnZXIgeworICAxOiBpMzIgdmFsCit9CisKK3N0cnVjdCBTdHJpbmcgeworICAxOiBzdHJpbmcgdmFsCit9CisKK3N0cnVjdCBCb29sZWFuIHsKKyAgMTogYm9vbCB2YWwKK30KKworc3RydWN0IERvdWJsZSB7CisgIDE6IGRvdWJsZSB2YWwKK30KKworc3RydWN0IExvbmcgeworICAxOiBpNjQgdmFsCit9CisKK3N0cnVjdCBCeXRlIHsKKyAgMTogYnl0ZSB2YWwKK30KKworc3RydWN0IEZsb2F0IHsKKyAgMTogZG91YmxlIHZhbAorfQorCitzdHJ1Y3QgTGlzdCB7CisgIDE6IGxpc3Q8c3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBBcnJheUxpc3QgeworICAxOiBsaXN0PHN0cmluZz4gdmFscworfQorCitzdHJ1Y3QgU29ydGVkTWFwIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBUcmVlTWFwIHsKKyAgMTogbWFwPHN0cmluZywgc3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBIYXNoTWFwIHsKKyAgMTogbWFwPHN0cmluZywgU3RyaW5nPiB2YWxzCit9CisKK3N0cnVjdCBNYXAgeworICAxOiBtYXA8ZG91YmxlLCBEb3VibGU+IHZhbHMKK30KKworc3RydWN0IE9iamVjdCB7CisgIDE6IEludGVnZXIgaW50ZWdlciwKKyAgMjogU3RyaW5nIHN0ciwKKyAgMzogQm9vbGVhbiBib29sZWFuX2ZpZWxkLAorICA0OiBEb3VibGUgZGJsLAorICA1OiBCeXRlIGJpdGUsCisgIDY6IG1hcDxpMzIsIEludGVnZXI+IGludG1hcCwKKyAgNzogTWFwIHNvbWVtYXAsCit9CisKK2V4Y2VwdGlvbiBFeGNlcHRpb24geworICAxOiBzdHJpbmcgbXNnCit9CisKK3NlcnZpY2UgQXN5bmNOb25ibG9ja2luZ1NlcnZpY2UgeworICBPYmplY3QgbXltZXRob2QoCisgICAgMTogSW50ZWdlciBpbnRlZ2VyLAorICAgIDI6IFN0cmluZyBzdHIsCisgICAgMzogQm9vbGVhbiBib29sZWFuX2ZpZWxkLAorICAgIDQ6IERvdWJsZSBkYmwsCisgICAgNTogQnl0ZSBiaXRlLAorICAgIDY6IG1hcDxpMzIsIEludGVnZXI+IGludG1hcCwKKyAgICA3OiBNYXAgc29tZW1hcCwKKyAgKSB0aHJvd3MgKDE6RXhjZXB0aW9uIGV4KTsKK30KKworc3RydWN0IFNhZmVCeXRlcyB7CisgIDE6IGJpbmFyeSBieXRlczsKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0IGIvdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTEyNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorc3RydWN0IFNpbXBsZSB7CisgIDE6IHN0cmluZyB2YWx1ZQorfQorCitzdHJ1Y3QgQ29tcGxleCB7CisgIDE6IFNpbXBsZSBzdHJ1Y3RfZmllbGQKKyAgMjogbGlzdDxTaW1wbGU+IHN0cnVjdF9saXN0X2ZpZWxkCisgIDM6IHNldDxTaW1wbGU+IHN0cnVjdF9zZXRfZmllbGQKKyAgNDogbWFwPHN0cmluZyxTaW1wbGU+IHN0cnVjdF9tYXBfZmllbGQKKyAgNTogbGlzdDxzZXQ8bWFwPHN0cmluZyxsaXN0PFNpbXBsZT4+Pj4gc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkCisgIDY6IG1hcDxzdHJpbmcsIGxpc3Q8bWFwPHN0cmluZyxTaW1wbGU+PiA+IHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIKKyAgNzogbGlzdDxsaXN0PHN0cmluZz4+IGxpc3Rfb2ZfbGlzdF9maWVsZAorICA4OiBsaXN0PGxpc3Q8bGlzdDxzdHJpbmc+Pj4gbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQKK30KKworc3RydWN0IENvbXBsZXhMaXN0IHsKKyAgMTogbGlzdDxDb21wbGV4PiBzdHJ1Y3RfbGlzdF9maWVsZDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUuYW0gYi90ZXN0L01ha2VmaWxlLmFtCmluZGV4IGFhYTQ5N2YuLjY4ZjE5ODYgMTAwNzU1Ci0tLSBhL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsNjMgKzE3LDE1NCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotU1VCRElSUyA9IG5vZGVqcworU1VCRElSUyA9IGZlYXR1cmVzCitQUkVDUk9TU19UQVJHRVQgPQorCitpZiBXSVRIX0NfR0xJQgorU1VCRElSUyArPSBjX2dsaWIKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jX2dsaWIKK2VuZGlmCisKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jbAorZW5kaWYKKworaWYgV0lUSF9NT05PCitTVUJESVJTICs9IGNzaGFycAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNzaGFycAorZW5kaWYKIAogaWYgV0lUSF9DUFAKIFNVQkRJUlMgKz0gY3BwCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtY3BwCiBlbmRpZgogCiBpZiBXSVRIX1BFUkwKIFNVQkRJUlMgKz0gcGVybAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXBlcmwKIGVuZGlmCiAKIGlmIFdJVEhfUEhQCiBTVUJESVJTICs9IHBocAorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXBocAorZW5kaWYKKworaWYgV0lUSF9EQVJUCitTVUJESVJTICs9IGRhcnQKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1kYXJ0CiBlbmRpZgogCiBpZiBXSVRIX1BZVEhPTgogU1VCRElSUyArPSBweQorUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLXB5CitTVUJESVJTICs9IHB5LnRvcm5hZG8KK2lmIFdJVEhfVFdJU1RFRF9URVNUCiBTVUJESVJTICs9IHB5LnR3aXN0ZWQKIGVuZGlmCitlbmRpZgogCiBpZiBXSVRIX1JVQlkKIFNVQkRJUlMgKz0gcmIKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1yYgogZW5kaWYKIAogaWYgV0lUSF9IQVNLRUxMCiBTVUJESVJTICs9IGhzCiBlbmRpZgogCitpZiBXSVRIX0hBWEUKK1NVQkRJUlMgKz0gaGF4ZQorZW5kaWYKKworaWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKK2lmIFdJVEhfR08KK1NVQkRJUlMgKz0gZ28KK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1nbworZW5kaWYKKworaWYgV0lUSF9FUkxBTkcKK1NVQkRJUlMgKz0gZXJsCitQUkVDUk9TU19UQVJHRVQgKz0gcHJlY3Jvc3MtZXJsCitlbmRpZgorCitpZiBXSVRIX0xVQQorU1VCRElSUyArPSBsdWEKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1sdWEKK2VuZGlmCisKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ycworZW5kaWYKKwogIwogIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAogIwogY2hlY2stbG9jYWw6CiAJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAorY2xlYW4tbG9jYWw6CisJcm0gLXJmICQodG9wX3NyY2RpcikvdGVzdC9nZW4taHRtbAorCiBFWFRSQV9ESVNUID0gXAotCXRlc3Quc2ggXAorCWF1ZGl0IFwKKwljcm9zc3J1bm5lciBcCisJa2V5cyBcCisJY19nbGliIFwKKwljbCBcCiAJY3BwIFwKLQljc2hhcnAgXAorCWRhcnQgXAorCWVybCBcCiAJaHMgXAotCW5vZGVqcyBcCisJbHVhIFwKIAlvY2FtbCBcCiAJcGVybCBcCiAJcGhwIFwKIAlweSBcCiAJcHkudHdpc3RlZCBcCisJcHkudG9ybmFkbyBcCiAJcmIgXAorCXJzIFwKIAl0aHJlYWRzIFwKIAlBbm5vdGF0aW9uVGVzdC50aHJpZnQgXAogCUJyb2tlbkNvbnN0YW50cy50aHJpZnQgXAogCUNvbnN0YW50c0RlbW8udGhyaWZ0IFwKIAlEZWJ1Z1Byb3RvVGVzdC50aHJpZnQgXAorCURvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKIAlEZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBcCiAJRG9jVGVzdC50aHJpZnQgXAorCUVudW1UZXN0LnRocmlmdCBcCisJRnVsbENhbWVsVGVzdC50aHJpZnQgXAorCUluY2x1ZGUudGhyaWZ0IFwKIAlKYXZhQmVhbnNUZXN0LnRocmlmdCBcCisJSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgXAorCUphdmFUeXBlcy50aHJpZnQgXAorCUpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgXAogCU1hbnlPcHRpb25hbHMudGhyaWZ0IFwKIAlNYW55VHlwZWRlZnMudGhyaWZ0IFwKKwlOYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBcCiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IFwKKwlSZWN1cnNpdmUudGhyaWZ0IFwKKwlSZXVzZU9iamVjdHMudGhyaWZ0IFwKKwlFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IFwKIAlTbWFsbFRlc3QudGhyaWZ0IFwKIAlTdHJlc3NUZXN0LnRocmlmdCBcCiAJVGhyaWZ0VGVzdC50aHJpZnQgXAotCUZhc3RiaW5hcnlUZXN0LnB5CisJVHlwZWRlZlRlc3QudGhyaWZ0IFwKKwlVbnNhZmVUeXBlcy50aHJpZnQgXAorCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAorCXRlc3QucHkgXAorCXRlc3RzLmpzb24gXAorCXJlYnVpbGRfa25vd25fZmFpbHVyZXMuc2ggXAorCXJlc3VsdC5qcyBcCisJaW5kZXguaHRtbCBcCisJUkVBRE1FLm1kIFwKKwl2YWxncmluZC5zdXBwcmVzcworCitwcmVjcm9zcy0lOgorCSQoTUFLRSkgLUMgJCogcHJlY3Jvc3MKK3ByZWNyb3NzOiAkKFBSRUNST1NTX1RBUkdFVCkKZGlmZiAtLWdpdCBhL3Rlc3QvTmFtZUNvbmZsaWN0VGVzdC50aHJpZnQgYi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWZiNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L05hbWVDb25mbGljdFRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMTEwIEBACisvLyBOYW1pbmcgdGVzdGNhc2VzLCBzZXBjaWZpY2FsbHkgZm9yIHRoZXNlIHRpY2tldHMgKGJ1dCBub3QgbGltaXRlZCB0byB0aGVtKQorLy8gVEhSSUZULTI1MDggVW5jb21waWxlYWJsZSBDIyBjb2RlIGR1ZSB0byBsYW5ndWFnZSBrZXl3b3JkcyBpbiBJREwKKy8vIFRIUklGVC0yNTU3IGVycm9yIENTMDU0MiBtZW1iZXIgbmFtZXMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZWlyIGVuY2xvc2luZyB0eXBlCisKKworc3RydWN0IHVzaW5nIHsKKyAgICAxOiBkb3VibGUgc2luZ2xlCisgICAgMjogZG91YmxlIGludGVnZXIKK30KKworc3RydWN0IGRlbGVnYXRlIHsKKyAgICAxOiBzdHJpbmcgcGFydGlhbAorICAgIDI6IGRlbGVnYXRlIGRlbGVnYXRlCit9CisKK3N0cnVjdCBnZXQgeworICAgIDE6IGJvb2wgc2J5dGUKK30KKworc3RydWN0IHBhcnRpYWwgeworICAgIDE6IHVzaW5nIHVzaW5nCisgICAgMjogYm9vbCByZWFkCisgICAgMzogYm9vbCB3cml0ZQorfQorCitlbnVtIE1heWJlIHsKKyAgSlVTVCA9IDEsCisgIFRSVUUgPSAyLAorICBGQUxTRSA9IDMKK30KKworZW51bSBFaXRoZXIgeworICBMRUZUID0gMSwKKyAgUklHSFQgPSAyCit9CisKK3N0cnVjdCBmb2xkciB7CisgIDE6IHN0cmluZyBpZAorfQorCitzdHJ1Y3Qgb2YgeworICAxOiBzdHJpbmcgbGV0CisgIDI6IHN0cmluZyB3aGVyZQorfQorCitzdHJ1Y3Qgb2ZPZiB7CisgIDE6IG9mIE9mCit9CisKKworc3RydWN0IENsYXNzQW5kUHJvcCB7CisgIDE6IGJvb2wgQ2xhc3NBbmRQcm9wCisgIDI6IGJvb2wgQ2xhc3NBbmRQcm9wXworICAzOiBib29sIENsYXNzQW5kUHJvcF9fCisgIDQ6IGJvb2wgQ2xhc3NBbmRQcm9wZXIKK30KKworc3RydWN0IHNlY29uZF9jaGFuY2UgeworICAxOiBib29sIFNFQ09ORF9DSEFOQ0UKKyAgMjogYm9vbCBTRUNPTkRfQ0hBTkNFXworICAzOiBib29sIFNFQ09ORF9DSEFOQ0VfXworICA0OiBib29sIFNFQ09ORF9DSEFOQ0VTCit9CisKK3N0cnVjdCBOT1dfRUFUX1RISVMgeworICAxOiBib29sIG5vd19lYXRfdGhpcworICAyOiBib29sIG5vd19lYXRfdGhpc18KKyAgMzogYm9vbCBub3dfZWF0X3RoaXNfXworICA0OiBib29sIG5vd19lYXRfdGhpc19hbmRfdGhpcworfQorCitzdHJ1Y3QgVGhlRWRnZUNhc2UgeworICAxOiBib29sIHRoZUVkZ2VDYXNlCisgIDI6IGJvb2wgdGhlRWRnZUNhc2VfCisgIDM6IGJvb2wgdGhlRWRnZUNhc2VfXworICA0OiBib29sIFRoZUVkZ2VDYXNlCisgIDU6IGJvb2wgVGhlRWRnZUNhc2VfCisgIDY6IGJvb2wgVGhlRWRnZUNhc2VfXworfQorCitzdHJ1Y3QgVHJpY2t5XyB7CisgIDE6IGJvb2wgdHJpY2t5CisgIDI6IGJvb2wgVHJpY2t5Cit9CisKK3N0cnVjdCBOZXN0ZWQgeworICAxOiBDbGFzc0FuZFByb3AgQ2xhc3NBbmRQcm9wCisgIDI6IHNlY29uZF9jaGFuY2Ugc2Vjb25kX2NoYW5jZQorICAzOiBOT1dfRUFUX1RISVMgTk9XX0VBVF9USElTCisgIDQ6IFRoZUVkZ2VDYXNlIFRoZUVkZ2VDYXNlCisgIDU6IFRyaWNreV8gVHJpY2t5XworICA2OiBOZXN0ZWQgTmVzdGVkCit9CisKK2V4Y2VwdGlvbiBQcm9ibGVtXyB7CisgIDE6IGJvb2wgcHJvYmxlbQorICAyOiBib29sIFByb2JsZW0KK30KKworCitzZXJ2aWNlIGV4dGVybiB7CisgICAgZGVsZWdhdGUgZXZlbnQoMTogcGFydGlhbCBnZXQpCisgICAgdm9pZCBGb28oMTogTmVzdGVkIEZvb19hcmdzKSB0aHJvd3MgKDE6IFByb2JsZW1fIEZvb19yZXN1bHQpCit9CisKK3NlcnZpY2UgcXVhbGlmaWVkIHsKKyAgICBNYXliZSBtYXliZSgxOiBNYXliZSBmb2xkcikKKyAgICBFaXRoZXIgZWl0aGVyKDE6IGZvbGRyIG9mKQorfQorLy8gZW9mCmRpZmYgLS1naXQgYS90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CmluZGV4IGRjZGQwZjIuLmE2MDg4OTggMTAwNjQ0Ci0tLSBhL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CisrKyBiL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0CkBAIC04MCwzICs4MCw5IEBACiAgIDU6IHJlcXVpcmVkIGJpbmFyeSByZXFfYmluOwogICA2OiBvcHRpb25hbCBiaW5hcnkgb3B0X2JpbjsKIH0KKworc3RydWN0IEJpbmFyaWVzIHsKKyAgNDogYmluYXJ5IGJpbjsKKyAgNTogcmVxdWlyZWQgYmluYXJ5IHJlcV9iaW47CisgIDY6IG9wdGlvbmFsIGJpbmFyeSBvcHRfYmluOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9SRUFETUUubWQgYi90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjgyZjVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwxODUgQEAKKyMgQXBhY2hlIFRocmlmdCAtIGludGVncmF0aW9uIHRlc3Qgc3VpdGUKKworVGhpcyBpcyB0aGUgY3Jvc3MgZXZlcnl0aGluZyBpbnRlZ3JhdGlvbiB0ZXN0IHN1aXRlIGZvciBBcGFjaGUgVGhyaWZ0LgorCisjIyBSdW4KKworIyMjIEEuIFVzaW5nIE1ha2UKKworVGhlIHRlc3QgY2FuIGJlIGV4ZWN1dGVkIGJ5OgorCisgICAgbWFrZSBjcm9zcworCitUaGlzIHN0YXJ0cyB0aGUgW3Rlc3QucHldKHRlc3QucHkpIHNjcmlwdCB3aGljaCBkb2VzIHRoZSByZWFsIGNyb3NzIHRlc3Qgd2l0aAorZGlmZmVyZW50IHRyYW5zcG9ydHMsIHByb3RvY29scyBhbmQgbGFuZ3VhZ2VzLgorCitOb3RlIHRoYXQgdGhpcyBza2lwcyBhbnkgbGFuZ3VhZ2UgdGhhdCBpcyBub3QgYnVpbHQgbG9jYWxseS4gSXQgYWxzbyBza2lwcwordGVzdHMgdGhhdCBhcmUga25vd24gdG8gYmUgZmFpbGluZy4gSWYgeW91IG5lZWQgbW9yZSBjb250cm9sIG92ZXIgd2hpY2ggdGVzdHMKK3RvIHJ1biwgcmVhZCBmb2xsb3dpbmcgc2VjdGlvbi4KKworIyMjIEIuIFVzaW5nIHRlc3Qgc2NyaXB0IGRpcmVjdGx5CisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gaW52b2tlIFt0ZXN0LnB5XSh0ZXN0LnB5KSBkaXJlY3RseS4gWW91IG5lZWQgdG8gcnVuYG1ha2UKK3ByZWNyb3NzYCBvbmNlIGJlZm9yZSBleGVjdXRpbmcgaXQgZm9yIHRoZSBmaXJzdCB0aW1lLgorCitGb3IgZXhhbXBsZSwgaWYgeW91IGNoYW5nZWQgc29tZXRoaW5nIGluIGBub2RlanNgIGxpYnJhcnkgYW5kIG5lZWQgdG8gdmVyaWZ5Cit0aGUgcGF0Y2gsIHlvdSBjYW4gc2tpcCBldmVyeXRoaW5nIGV4Y2VwdCBgbm9kZWpzYCBpdHNlbGYgYW5kIHNvbWUgcmVmZXJlbmNlCitpbXBsZW1lbnRhdGlvbiAoY3VycmVudGx5IGBjcHBgIGFuZCBgamF2YWAgYXJlIHJlY29tbWVuZGVkKSBsaWtlIHRoaXM6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtY19nbGliIC13aXRob3V0LWNzaGFycCAtLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1sdWEgLi4uCisgICAgbWFrZSBwcmVjcm9zcyAtajgKKyAgICB0ZXN0L3Rlc3QucHkgLS1zZXJ2ZXIgY3BwLGphdmEgLS1jbGllbnQgbm9kZWpzCisgICAgdGVzdC90ZXN0LnB5IC0tc2VydmVyIG5vZGVqcyAtLWNsaWVudCBjcHAsamF2YQorCitBbm90aGVyIHVzZWZ1bCBmbGFnIGlzIC0tcmVnZXguIEZvciBleGFtcGxlLCB0byBydW4gYWxsIHRlc3RzIHRoYXQgaW52b2x2ZQorSmF2YSBUQmluYXJ5UHJvdG9jb2w6CisKKyAgICB0ZXN0L3Rlc3QucHkgLS1yZWdleCAiamF2YS4qYmluYXJ5IgorCisjIyBUZXN0IGNhc2UgZGVmaW5pdGlvbiBmaWxlCisKK1RoZSBjcm9zcyB0ZXN0IGNhc2VzIGFyZSBkZWZpbmVkIGluIFt0ZXN0cy5qc29uXSh0ZXN0cy5qc29uKS4KK1RoZSByb290IGVsZW1lbnQgaXMgY29sbGVjdGlvbiBvZiB0ZXN0IHRhcmdldCBkZWZpbml0aW9ucy4KK0VhY2ggdGVzdCB0YXJnZXQgZGVmaW5pdGlvbiBsb29rcyBsaWtlIHRoaXM6CisKKyAgICB7CisgICAgICAibmFtZSI6ICJzb21lbGliIiwKKworICAgICAgImNsaWVudCI6IHsKKyAgICAgICAgImNvbW1hbmQiOiBbInNvbWVsaWJfY2xpZW50X2V4ZWN1dGFibGUiXSwKKyAgICAgICAgIndvcmtkaXIiOiAic29tZWxpYi9iaW4iLAorICAgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgICAgICJzb2NrZXRzIjogWyJpcCJdLAorICAgICAgfSwKKyAgICAgICJzZXJ2ZXIiOiB7CisgICAgICAgICJjb21tYW5kIjogWyJzb21lbGliX3NlcnZlcl9leGVjdXRhYmxlIl0sCisgICAgICAgICJ3b3JrZGlyIjogInNvbWVsaWIvYmluIiwKKyAgICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAorICAgICAgICAic29ja2V0cyI6IFsiaXAiLCAiaXAtc3NsIl0sCisgICAgICB9CisgICAgfQorCitFaXRoZXIgY2xpZW50IG9yIHNlcnZlciBkZWZpbml0aW9uIG9yIGJvdGggc2hvdWxkIGJlIHByZXNlbnQuCisKK1BhcmFtZXRlcnMgdGhhdCBhcmUgY29tbW9uIHRvIGJvdGggYGNsaWVudGAgYW5kIGBzZXJ2ZXJgIGNhbiBiZSBwdXQgdG8gdGFyZ2V0CitkZWZpbml0aW9uIHJvb3Q6CisKKyAgICB7CisgICAgICAibmFtZSI6ICJzb21lbGliIiwKKworICAgICAgIndvcmtkaXIiOiAic29tZWxpYi9iaW4iLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdLAorCisgICAgICAiY2xpZW50IjogeyAiY29tbWFuZCI6IFsic29tZWxpYl9jbGllbnRfZXhlY3V0YWJsZSJdIH0sCisgICAgICAic2VydmVyIjogeworICAgICAgICAiY29tbWFuZCI6IFsic29tZWxpYl9zZXJ2ZXJfZXhlY3V0YWJsZSJdLAorICAgICAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0KKyAgICAgIH0KKyAgICB9CisKK0ZvciB0aGUgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQga2V5cyBhbmQgdGhlaXIgZWZmZWN0LCBzZWUgc291cmNlIGNvZGUKK2NvbW1lbnQgYXQgdGhlIG9wdCBvZiBbY3Jvc3NydW5uZXIvY29sbGVjdC5weV0oY3Jvc3NydW5uZXIvY29sbGVjdC5weSkuCisKKworIyMgTGlzdCBvZiBrbm93biBmYWlsdXJlcworCitTaW5jZSBtYW55IGNyb3NzIHRlc3RzIGN1cnJlbnRseSBmYWlsIChtYWlubHkgZHVlIHRvIHBhcnRpYWwgaW5jb21wYXRpYmlsaXR5Cithcm91bmQgZXhjZXB0aW9uIGhhbmRsaW5nKSwgdGhlIHRlc3Qgc2NyaXB0IHNwZWNpZmljYWxseSByZXBvcnQgZm9yICJub3Qga25vd24KK2JlZm9yZSIgZmFpbHVyZXMuCisKK0ZvciB0aGlzIHB1cnBvc2UsIHRlc3QgY2FzZXMga25vd24gdG8gKG9jY2FzaW9uYWxseSkgZmFpbCBhcmUgbGlzdGVkIGluCitga25vd25fZmFpbHVyZXNfPHBsYXRmb3JtPi5qc29uYCB3aGVyZSBgPHBsYXRmb3JtPmAgbWF0Y2hlcyB3aXRoIHB5dGhvbgorYHBsYXRmb3JtLnN5c3RlbSgpYCBzdHJpbmcuCisKK0N1cnJlbnRseSwgb25seSBMaW51eCB2ZXJzaW9uIGlzIGluY2x1ZGVkLgorCitGWUksIHRoZSBmaWxlIGlzIGluaXRpYWxseSBnZW5lcmF0ZWQgYnkKKworICAgIHRlc3QvdGVzdC5weSAtLXVwZGF0ZS1leHBlY3RlZC1mYWlsdXJlcz1vdmVyd3JpdGUKKworYWZ0ZXIgYSBmdWxsIHRlc3QgcnVuLCB0aGVuIHJlcGVhdGVkbHkKKworICAgIHRlc3QvdGVzdC5weSAtLXNraXAta25vd24tZmFpbHVyZXMKKyAgICB0ZXN0L3Rlc3QucHkgLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXM9bWVyZ2UKKwordG8gdXBkYXRlIHRoZSBrbm93biBmYWlsdXJlcywgcnVuCisKKyAgICBtYWtlIGZhaWwKKworIyMgVGVzdCBleGVjdXRhYmxlIHNwZWNpZmljYXRpb24KKworIyMjIENvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisKK1VuaXQgdGVzdHMgZm9yIGxhbmd1YWdlcyBhcmUgdXN1YWxseSBsb2NhdGVkIHVuZGVyIGxpYi88bGFuZz4vdGVzdC8KK2Nyb3NzIGxhbmd1YWdlIHRlc3RzIGFjY29yZGluZyB0byBbVGhyaWZ0VGVzdC50aHJpZnRdKFRocmlmdFRlc3QudGhyaWZ0KSBzaGFsbCBiZQorcHJvdmlkZWQgZm9yIGV2ZXJ5IGxhbmd1YWdlIGluY2x1ZGluZyBleGVjdXRhYmxlcyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZAorbGluZSBpbnRlcmZhY2U6CisKKyoqU2VydmVyIGNvbW1hbmQgbGluZSBpbnRlcmZhY2U6KioKKworICAgICQgLi9jcHAvVGVzdFNlcnZlciAtaAorICAgIEFsbG93ZWQgb3B0aW9uczoKKyAgICAgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGxpc3RlbgorICAgICAgLS1kb21haW4tc29ja2V0IGFyZyAgICAgICAgIFVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KQorICAgICAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAtLXNlcnZlci10eXBlIGFyZyAoPXNpbXBsZSkgdHlwZSBvZiBzZXJ2ZXIsICJzaW1wbGUiLCAidGhyZWFkLXBvb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRlZCIsIG9yICJub25ibG9ja2luZyIKKyAgICAgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGFub25waXBlCisgICAgICAtLXByb3RvY29sIGFyZyAoPWJpbmFyeSkgICAgcHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbgorICAgICAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCisgICAgICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50cworICAgICAgLW4gWyAtLXdvcmtlcnMgXSBhcmcgKD00KSAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC1wb29sIHNlcnZlciB0eXBlCisKKyoqQ2xpZW50IGNvbW1hbmQgbGluZSBpbnRlcmZhY2U6KioKKworICAgICQgLi9jcHAvVGVzdENsaWVudCAtaAorICAgIEFsbG93ZWQgb3B0aW9uczoKKyAgICAgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZQorICAgICAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdAorICAgICAgLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QKKyAgICAgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydAorICAgICAgLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCisgICAgICAtLWFub24tcGlwZXMgaFJlYWQgaFdyaXRlICAgV2luZG93cyBBbm9ueW1vdXMgUGlwZXMgcGFpciAoaGFuZGxlcykKKyAgICAgIC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSBUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cAorICAgICAgLS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpICAgIFByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGpzb24KKyAgICAgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTAorICAgICAgLW4gWyAtLXRlc3Rsb29wcyBdIGFyZyAoPTEpIE51bWJlciBvZiBUZXN0cworICAgICAgLXQgWyAtLXRocmVhZHMgXSBhcmcgKD0xKSAgIE51bWJlciBvZiBUZXN0IHRocmVhZHMKKworSWYgeW91IGhhdmUgZXhlY3V0ZWQgdGhlICoqbWFrZSBjaGVjayoqIG9yICoqbWFrZSBjcm9zcyoqIHRoZW4geW91IHdpbGwgYmUgYWJsZSB0byBicm93c2UKK1tnZW4taHRtbC9UaHJpZnRUZXN0Lmh0bWxdKGdlbi1odG1sL1RocmlmdFRlc3QuaHRtbCkgd2l0aCB0aGUgdGVzdCBkb2N1bWVudGF0aW9uLgorCisjIyMgUmV0dXJuIGNvZGUKKworVGhlIHJldHVybiBjb2RlIChleGl0IGNvZGUpIHNoYWxsIGJlIDAgb24gc3VjY2Vzcywgb3IgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgMSAtIDI1NSBvbiBlcnJvcnMuCitJbiBvcmRlciB0byBzaWduYWwgZmFpbGVkIHRlc3RzLCB0aGUgcmV0dXJuIGNvZGUgc2hhbGwgYmUgY29tcG9zZWQgZnJvbSB0aGVzZSBiaXRzIHRvIGluZGljYXRlCitmYWlsaW5nIHRlc3RzOgorCisgICAgICAjZGVmaW5lIFRFU1RfQkFTRVRZUEVTICAgICAxICAvLyAwMDAwIDAwMDEKKyAgICAgICNkZWZpbmUgVEVTVF9TVFJVQ1RTICAgICAgIDIgIC8vIDAwMDAgMDAxMAorICAgICAgI2RlZmluZSBURVNUX0NPTlRBSU5FUlMgICAgNCAgLy8gMDAwMCAwMTAwCisgICAgICAjZGVmaW5lIFRFU1RfRVhDRVBUSU9OUyAgICA4ICAvLyAwMDAwIDEwMDAKKyAgICAgICNkZWZpbmUgVEVTVF9VTktOT1dOICAgICAgNjQgIC8vIDAxMDAgMDAwMCAoRmFpbGVkIHRvIHByZXBhcmUgZW52aXJvbmVtdCBldGMuKQorICAgICAgI2RlZmluZSBURVNUX1RJTUVPVVQgICAgIDEyOCAgLy8gMTAwMCAwMDAwCisgICAgICAjZGVmaW5lIFRFU1RfTk9UVVNFRCAgICAgIDQ4ICAvLyAwMDExIDAwMDAgKHJlc2VydmVkIGJpdHMpCisKK1Rlc3RzIHRoYXQgaGF2ZSBub3QgYmVlbiBleGVjdXRlZCBhdCBhbGwgY291bnQgYXMgZXJyb3JzLgorCisqKkV4YW1wbGU6KioKKworRHVyaW5nIHRlc3RzLCB0aGUgdGVzdCBjbGllbnQgbm90aWNlcyB0aGF0IHNvbWUgb2YgdGhlIFN0cnVjdCB0ZXN0cyBmYWlsLgorRnVydGhlcm1vcmUsIGR1ZSB0byBzb21lIG90aGVyIHByb2JsZW0gbm9uZSBvZiB0aGUgRXhjZXB0aW9uIHRlc3RzIGlzIGV4ZWN1dGVkLgorVGhlcmVmb3JlLCB0aGUgdGVzdCBjbGllbnQgcmV0dXJucyB0aGUgY29kZSBgMTAgPSAyIHwgOGAsIGluZGljYXRpbmcgdGhlIGZhaWx1cmUKK29mIGJvdGggdGVzdCAyIChURVNUX1NUUlVDVFMpIGFuZCB0ZXN0IDggKFRFU1RfRVhDRVBUSU9OUykuCisKKworIyMgU1NMCitUZXN0IEtleXMgYW5kIENlcnRpZmljYXRlcyBhcmUgcHJvdmlkZWQgaW4gbXVsdGlwbGUgZm9ybWF0cyB1bmRlciB0aGUgZm9sbG93aW5nCitkaXJlY3RvcnkgW3Rlc3Qva2V5c10oa2V5cykKZGlmZiAtLWdpdCBhL3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBiL3Rlc3QvUmVjdXJzaXZlLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTgyNTgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9SZWN1cnNpdmUudGhyaWZ0CkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3RydWN0IFJlY1RyZWUgeworICAxOiBsaXN0PFJlY1RyZWU+IGNoaWxkcmVuCisgIDI6IGkxNiBpdGVtCit9CisKK3N0cnVjdCBSZWNMaXN0IHsKKyAgMTogUmVjTGlzdCAmIG5leHRpdGVtCisgIDM6IGkxNiBpdGVtCit9CisKK3N0cnVjdCBDb1JlYyB7CisgIDE6ICBDb1JlYzIgJiBvdGhlcgorfQorCitzdHJ1Y3QgQ29SZWMyIHsKKyAgMTogQ29SZWMgb3RoZXIKK30KKworc3RydWN0IFZlY3RvclRlc3QgeworICAxOiBsaXN0PFJlY0xpc3Q+IGxpc3RlcjsKK30KKworc2VydmljZSBUZXN0U2VydmljZQoreworICBSZWNUcmVlIGVjaG9UcmVlKDE6UmVjVHJlZSB0cmVlKQorICBSZWNMaXN0IGVjaG9MaXN0KDE6UmVjTGlzdCBsc3QpCisgIENvUmVjIGVjaG9Db1JlYygxOkNvUmVjIGl0ZW0pCit9CmRpZmYgLS1naXQgYS90ZXN0L1JldXNlT2JqZWN0cy50aHJpZnQgYi90ZXN0L1JldXNlT2JqZWN0cy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkNmM2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvUmV1c2VPYmplY3RzLnRocmlmdApAQCAtMCwwICsxLDMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoZSBqYXZhIGNvZGVnZW5lcmF0b3IgaGFzIG9wdGlvbiB0byByZXVzZSBvYmplY3RzIGZvciBkZXNlcmlhbGl6YXRpb24KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworaW5jbHVkZSAiVGhyaWZ0VGVzdC50aHJpZnQiCisKK3N0cnVjdCBSZXVzZSB7CisgIDE6IGkzMiB2YWwxOworICAyOiBzZXQ8c3RyaW5nPiB2YWwyOworfQorCmRpZmYgLS1naXQgYS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0IGIvdGVzdC9TdHJlc3NUZXN0LnRocmlmdAppbmRleCBlMDlhMWZjLi40MzE4MTFiIDEwMDY0NAotLS0gYS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CisrKyBiL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKQEAgLTE5LDE2ICsxOSwxNyBAQAogCiBuYW1lc3BhY2UgY3BwIHRlc3Quc3RyZXNzCiBuYW1lc3BhY2UgZCB0aHJpZnQudGVzdC5zdHJlc3MKK25hbWVzcGFjZSBnbyBzdHJlc3MKIAogc2VydmljZSBTZXJ2aWNlIHsKIAogICB2b2lkIGVjaG9Wb2lkKCksCi0gIGJ5dGUgZWNob0J5dGUoMTogYnl0ZSBhcmcpLAorICBpOCBlY2hvQnl0ZSgxOiBpOCBhcmcpLAogICBpMzIgZWNob0kzMigxOiBpMzIgYXJnKSwKICAgaTY0IGVjaG9JNjQoMTogaTY0IGFyZyksCiAgIHN0cmluZyBlY2hvU3RyaW5nKDE6IHN0cmluZyBhcmcpLAotICBsaXN0PGJ5dGU+ICBlY2hvTGlzdCgxOiBsaXN0PGJ5dGU+IGFyZyksCi0gIHNldDxieXRlPiAgZWNob1NldCgxOiBzZXQ8Ynl0ZT4gYXJnKSwKLSAgbWFwPGJ5dGUsIGJ5dGU+ICBlY2hvTWFwKDE6IG1hcDxieXRlLCBieXRlPiBhcmcpLAorICBsaXN0PGk4PiAgZWNob0xpc3QoMTogbGlzdDxpOD4gYXJnKSwKKyAgc2V0PGk4PiAgZWNob1NldCgxOiBzZXQ8aTg+IGFyZyksCisgIG1hcDxpOCwgaTg+ICBlY2hvTWFwKDE6IG1hcDxpOCwgaTg+IGFyZyksCiB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CmluZGV4IDJiZTUzZmEuLjM0OTlhYjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKysrIGIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdApAQCAtMzEsMTAgKzMxLDE5IEBACiBuYW1lc3BhY2Ugc3QgVGhyaWZ0VGVzdAogbmFtZXNwYWNlIHB5IFRocmlmdFRlc3QKIG5hbWVzcGFjZSBweS50d2lzdGVkIFRocmlmdFRlc3QKLW5hbWVzcGFjZSBnbyBUaHJpZnRUZXN0CituYW1lc3BhY2UgZ28gdGhyaWZ0dGVzdAogbmFtZXNwYWNlIHBocCBUaHJpZnRUZXN0CiBuYW1lc3BhY2UgZGVscGhpIFRocmlmdC5UZXN0CiBuYW1lc3BhY2UgY29jb2EgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGx1YSBUaHJpZnRUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvVGhyaWZ0VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRUZXN0CisKKy8vIFByZXNlbmNlIG9mIG5hbWVzcGFjZXMgYW5kIHN1Yi1uYW1lc3BhY2VzIGZvciB3aGljaCB0aGVyZSBpcworLy8gbm8gZ2VuZXJhdG9yIHNob3VsZCBjb21waWxlIHdpdGggd2FybmluZ3Mgb25seQorbmFtZXNwYWNlIG5vZXhpc3QgVGhyaWZ0VGVzdAorbmFtZXNwYWNlIGNwcC5ub2V4aXN0IFRocmlmdFRlc3QKKwogbmFtZXNwYWNlICogdGhyaWZ0LnRlc3QKIAogLyoqCkBAIC02Miw2ICs3MSw4IEBACiAgIDI6IGkzMiB0eXBlCiB9CiAKK3R5cGVkZWYgbWFwPHN0cmluZyxCb25rPiBNYXBUeXBlCisKIHN0cnVjdCBCb29scyB7CiAgIDE6IGJvb2wgaW1fdHJ1ZSwKICAgMjogYm9vbCBpbV9mYWxzZSwKQEAgLTcwLDE0ICs4MSwxNCBAQAogc3RydWN0IFh0cnVjdAogewogICAxOiAgc3RyaW5nIHN0cmluZ190aGluZywKLSAgNDogIGJ5dGUgICBieXRlX3RoaW5nLAorICA0OiAgaTggICAgIGJ5dGVfdGhpbmcsCiAgIDk6ICBpMzIgICAgaTMyX3RoaW5nLAogICAxMTogaTY0ICAgIGk2NF90aGluZwogfQogCiBzdHJ1Y3QgWHRydWN0MgogewotICAxOiBieXRlICAgYnl0ZV90aGluZywKKyAgMTogaTggICAgIGJ5dGVfdGhpbmcsICAvLyB1c2VkIHRvIGJlIGJ5dGUsIGhlbmNlIHRoZSBuYW1lCiAgIDI6IFh0cnVjdCBzdHJ1Y3RfdGhpbmcsCiAgIDM6IGkzMiAgICBpMzJfdGhpbmcKIH0KQEAgLTk1LDE1ICsxMDYsMjQgQEAKIHsKICAgMTogbWFwPE51bWJlcnosIFVzZXJJZD4gdXNlck1hcCwKICAgMjogbGlzdDxYdHJ1Y3Q+IHh0cnVjdHMKLX0KK30gKHB5dGhvbi5pbW11dGFibGU9ICIiKQogCiBzdHJ1Y3QgQ3JhenlOZXN0aW5nIHsKICAgMTogc3RyaW5nIHN0cmluZ19maWVsZCwKICAgMjogb3B0aW9uYWwgc2V0PEluc2FuaXR5PiBzZXRfZmllbGQsCi0gIDM6IHJlcXVpcmVkIGxpc3Q8IG1hcDxzZXQ8aTMyPixtYXA8aTMyLHNldDxsaXN0PG1hcDxJbnNhbml0eSxzdHJpbmc+Pj4+Pj4gbGlzdF9maWVsZCwKKyAgLy8gRG8gbm90IGluc2VydCBsaW5lIGJyZWFrIGFzIHRlc3QvZ28vTWFrZWZpbGUuYW0gaXMgcmVtb3ZpbmcgdGhpcyBsaW5lIHdpdGggcGF0dGVybiBtYXRjaAorICAzOiByZXF1aXJlZCBsaXN0PG1hcDxzZXQ8aTMyPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKSwgbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPihweXRob24uaW1tdXRhYmxlID0gIiIpPiAocHl0aG9uLmltbXV0YWJsZSA9ICIiKT4+Pj4gbGlzdF9maWVsZCwKICAgNDogYmluYXJ5IGJpbmFyeV9maWVsZAogfQogCit1bmlvbiBTb21lVW5pb24geworICAxOiBtYXA8TnVtYmVyeiwgVXNlcklkPiBtYXBfdGhpbmcsCisgIDI6IHN0cmluZyBzdHJpbmdfdGhpbmcsCisgIDM6IGkzMiBpMzJfdGhpbmcsCisgIDQ6IFh0cnVjdDMgeHRydWN0X3RoaW5nLAorICA1OiBJbnNhbml0eSBpbnNhbml0eV90aGluZworfQorCiBleGNlcHRpb24gWGNlcHRpb24gewogICAxOiBpMzIgZXJyb3JDb2RlLAogICAyOiBzdHJpbmcgbWVzc2FnZQpAQCAtMTI2LDg4ICsxNDYsMTAzIEBACiAgICAqIFByaW50cyAidGVzdFZvaWQoKSIgYW5kIHJldHVybnMgbm90aGluZy4KICAgICovCiAgIHZvaWQgICAgICAgICB0ZXN0Vm9pZCgpLAotICAKKwogICAvKioKICAgICogUHJpbnRzICd0ZXN0U3RyaW5nKCIlcyIpJyB3aXRoIHRoaW5nIGFzICclcycKICAgICogQHBhcmFtIHN0cmluZyB0aGluZyAtIHRoZSBzdHJpbmcgdG8gcHJpbnQKICAgICogQHJldHVybiBzdHJpbmcgLSByZXR1cm5zIHRoZSBzdHJpbmcgJ3RoaW5nJwogICAgKi8KICAgc3RyaW5nICAgICAgIHRlc3RTdHJpbmcoMTogc3RyaW5nIHRoaW5nKSwKLSAgCisKKyAgLyoqCisgICAqIFByaW50cyAndGVzdEJvb2woIiVzIiknIHdoZXJlICclcycgd2l0aCB0aGluZyBhcyAndHJ1ZScgb3IgJ2ZhbHNlJworICAgKiBAcGFyYW0gYm9vbCAgdGhpbmcgLSB0aGUgYm9vbCBkYXRhIHRvIHByaW50CisgICAqIEByZXR1cm4gYm9vbCAgLSByZXR1cm5zIHRoZSBib29sICd0aGluZycKKyAgICovCisgIGJvb2wgICAgICAgICB0ZXN0Qm9vbCgxOiBib29sIHRoaW5nKSwKKwogICAvKioKICAgICogUHJpbnRzICd0ZXN0Qnl0ZSgiJWQiKScgd2l0aCB0aGluZyBhcyAnJWQnCi0gICAqIEBwYXJhbSBieXRlIHRoaW5nIC0gdGhlIGJ5dGUgdG8gcHJpbnQKLSAgICogQHJldHVybiBieXRlIC0gcmV0dXJucyB0aGUgYnl0ZSAndGhpbmcnCisgICAqIFRoZSB0eXBlcyBpOCBhbmQgYnl0ZSBhcmUgc3lub255bXMsIHVzZSBvZiBpOCBpcyBlbmNvdXJhZ2VkLCBieXRlIHN0aWxsIGV4aXN0cyBmb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eS4KKyAgICogQHBhcmFtIGJ5dGUgdGhpbmcgLSB0aGUgaTgvYnl0ZSB0byBwcmludAorICAgKiBAcmV0dXJuIGk4IC0gcmV0dXJucyB0aGUgaTgvYnl0ZSAndGhpbmcnCiAgICAqLwotICBieXRlICAgICAgICAgdGVzdEJ5dGUoMTogYnl0ZSB0aGluZyksCi0gIAorICBpOCAgICAgICAgICAgdGVzdEJ5dGUoMTogaTggdGhpbmcpLAorCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RJMzIoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwogICAgKiBAcGFyYW0gaTMyIHRoaW5nIC0gdGhlIGkzMiB0byBwcmludAogICAgKiBAcmV0dXJuIGkzMiAtIHJldHVybnMgdGhlIGkzMiAndGhpbmcnCiAgICAqLwogICBpMzIgICAgICAgICAgdGVzdEkzMigxOiBpMzIgdGhpbmcpLAotIAorCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RJNjQoIiVkIiknIHdpdGggdGhpbmcgYXMgJyVkJwogICAgKiBAcGFyYW0gaTY0IHRoaW5nIC0gdGhlIGk2NCB0byBwcmludAogICAgKiBAcmV0dXJuIGk2NCAtIHJldHVybnMgdGhlIGk2NCAndGhpbmcnCiAgICAqLwogICBpNjQgICAgICAgICAgdGVzdEk2NCgxOiBpNjQgdGhpbmcpLAotICAKKwogICAvKioKICAgICogUHJpbnRzICd0ZXN0RG91YmxlKCIlZiIpJyB3aXRoIHRoaW5nIGFzICclZicKICAgICogQHBhcmFtIGRvdWJsZSB0aGluZyAtIHRoZSBkb3VibGUgdG8gcHJpbnQKICAgICogQHJldHVybiBkb3VibGUgLSByZXR1cm5zIHRoZSBkb3VibGUgJ3RoaW5nJwogICAgKi8KICAgZG91YmxlICAgICAgIHRlc3REb3VibGUoMTogZG91YmxlIHRoaW5nKSwKLSAgCisKICAgLyoqCi0gICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBlcmF0ZWQgdmFsdWVzCisgICAqIFByaW50cyAndGVzdEJpbmFyeSgiJXMiKScgd2hlcmUgJyVzJyBpcyBhIGhleC1mb3JtYXR0ZWQgc3RyaW5nIG9mIHRoaW5nJ3MgZGF0YQorICAgKiBAcGFyYW0gYmluYXJ5ICB0aGluZyAtIHRoZSBiaW5hcnkgZGF0YSB0byBwcmludAorICAgKiBAcmV0dXJuIGJpbmFyeSAgLSByZXR1cm5zIHRoZSBiaW5hcnkgJ3RoaW5nJworICAgKi8KKyAgYmluYXJ5ICAgICAgIHRlc3RCaW5hcnkoMTogYmluYXJ5IHRoaW5nKSwKKworICAvKioKKyAgICogUHJpbnRzICd0ZXN0U3RydWN0KCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMKICAgICogQHBhcmFtIFh0cnVjdCB0aGluZyAtIHRoZSBYdHJ1Y3QgdG8gcHJpbnQKICAgICogQHJldHVybiBYdHJ1Y3QgLSByZXR1cm5zIHRoZSBYdHJ1Y3QgJ3RoaW5nJwogICAgKi8KICAgWHRydWN0ICAgICAgIHRlc3RTdHJ1Y3QoMTogWHRydWN0IHRoaW5nKSwKLSAgCisKICAgLyoqCiAgICAqIFByaW50cyAndGVzdE5lc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgdGhlIG5lc3RlZCBzdHJ1Y3QKICAgICogQHBhcmFtIFh0cnVjdDIgdGhpbmcgLSB0aGUgWHRydWN0MiB0byBwcmludAogICAgKiBAcmV0dXJuIFh0cnVjdDIgLSByZXR1cm5zIHRoZSBYdHJ1Y3QyICd0aGluZycKICAgICovCiAgIFh0cnVjdDIgICAgICB0ZXN0TmVzdCgxOiBYdHJ1Y3QyIHRoaW5nKSwKLSAKKwogICAvKioKICAgICogUHJpbnRzICd0ZXN0TWFwKCJ7JXMiKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgICdrZXkgPT4gdmFsdWUnIHBhaXJzCi0gICAqICBzZXBlcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcwogICAgKiBAcGFyYW0gbWFwPGkzMixpMzI+IHRoaW5nIC0gdGhlIG1hcDxpMzIsaTMyPiB0byBwcmludAogICAgKiBAcmV0dXJuIG1hcDxpMzIsaTMyPiAtIHJldHVybnMgdGhlIG1hcDxpMzIsaTMyPiAndGhpbmcnCiAgICAqLwogICBtYXA8aTMyLGkzMj4gdGVzdE1hcCgxOiBtYXA8aTMyLGkzMj4gdGhpbmcpLAotICAKKwogICAvKioKICAgICogUHJpbnRzICd0ZXN0U3RyaW5nTWFwKCJ7JXN9IiknIHdoZXJlIHRoaW5nIGhhcyBiZWVuIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nIG9mICAna2V5ID0+IHZhbHVlJyBwYWlycwotICAgKiAgc2VwZXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKICAgICogQHBhcmFtIG1hcDxzdHJpbmcsc3RyaW5nPiB0aGluZyAtIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gdG8gcHJpbnQKICAgICogQHJldHVybiBtYXA8c3RyaW5nLHN0cmluZz4gLSByZXR1cm5zIHRoZSBtYXA8c3RyaW5nLHN0cmluZz4gJ3RoaW5nJwogICAgKi8KICAgbWFwPHN0cmluZyxzdHJpbmc+IHRlc3RTdHJpbmdNYXAoMTogbWFwPHN0cmluZyxzdHJpbmc+IHRoaW5nKSwKLSAgCisKICAgLyoqCiAgICAqIFByaW50cyAndGVzdFNldCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiAgdmFsdWVzCi0gICAqICBzZXBlcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKKyAgICogIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIG5ldyBsaW5lcwogICAgKiBAcGFyYW0gc2V0PGkzMj4gdGhpbmcgLSB0aGUgc2V0PGkzMj4gdG8gcHJpbnQKICAgICogQHJldHVybiBzZXQ8aTMyPiAtIHJldHVybnMgdGhlIHNldDxpMzI+ICd0aGluZycKICAgICovCiAgIHNldDxpMzI+ICAgICB0ZXN0U2V0KDE6IHNldDxpMzI+IHRoaW5nKSwKLSAgCisKICAgLyoqCiAgICAqIFByaW50cyAndGVzdExpc3QoInslc30iKScgd2hlcmUgdGhpbmcgaGFzIGJlZW4gZm9ybWF0dGVkIGludG8gYSBzdHJpbmcgb2YgIHZhbHVlcwotICAgKiAgc2VwZXJhdGVkIGJ5IGNvbW1hcyBhbmQgbmV3IGxpbmVzCisgICAqICBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBuZXcgbGluZXMKICAgICogQHBhcmFtIGxpc3Q8aTMyPiB0aGluZyAtIHRoZSBsaXN0PGkzMj4gdG8gcHJpbnQKICAgICogQHJldHVybiBsaXN0PGkzMj4gLSByZXR1cm5zIHRoZSBsaXN0PGkzMj4gJ3RoaW5nJwogICAgKi8KICAgbGlzdDxpMzI+ICAgIHRlc3RMaXN0KDE6IGxpc3Q8aTMyPiB0aGluZyksCi0gIAorCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RFbnVtKCIlZCIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBpdCdzIG51bWVyaWMgdmFsdWUKICAgICogQHBhcmFtIE51bWJlcnogdGhpbmcgLSB0aGUgTnVtYmVyeiB0byBwcmludApAQCAtMjM0LDI3ICsyNjksMjcgQEAKICAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CiAgICAqCiAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgotICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsIAotICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsIAorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKICAgICogICAgICAgICAgfSwKICAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAogICAgKiAgIH0KLSAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzIAorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKICAgICovCiAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KDE6IEluc2FuaXR5IGFyZ3VtZW50KSwKIAogICAvKioKICAgICogUHJpbnRzICd0ZXN0TXVsdGkoKScKLSAgICogQHBhcmFtIGJ5dGUgYXJnMCAtIAotICAgKiBAcGFyYW0gaTMyIGFyZzEgLSAKLSAgICogQHBhcmFtIGk2NCBhcmcyIC0gCi0gICAqIEBwYXJhbSBtYXA8aTE2LCBzdHJpbmc+IGFyZzMgLSAKLSAgICogQHBhcmFtIE51bWJlcnogYXJnNCAtIAotICAgKiBAcGFyYW0gVXNlcklkIGFyZzUgLSAKKyAgICogQHBhcmFtIGk4IGFyZzAgLQorICAgKiBAcGFyYW0gaTMyIGFyZzEgLQorICAgKiBAcGFyYW0gaTY0IGFyZzIgLQorICAgKiBAcGFyYW0gbWFwPGkxNiwgc3RyaW5nPiBhcmczIC0KKyAgICogQHBhcmFtIE51bWJlcnogYXJnNCAtCisgICAqIEBwYXJhbSBVc2VySWQgYXJnNSAtCiAgICAqIEByZXR1cm4gWHRydWN0IC0gcmV0dXJucyBhbiBYdHJ1Y3Qgd2l0aCBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yLCBieXRlX3RoaW5nID0gYXJnMCwgaTMyX3RoaW5nID0gYXJnMQogICAgKiAgICBhbmQgaTY0X3RoaW5nID0gYXJnMgogICAgKi8KLSAgWHRydWN0IHRlc3RNdWx0aSgxOiBieXRlIGFyZzAsIDI6IGkzMiBhcmcxLCAzOiBpNjQgYXJnMiwgNDogbWFwPGkxNiwgc3RyaW5nPiBhcmczLCA1OiBOdW1iZXJ6IGFyZzQsIDY6IFVzZXJJZCBhcmc1KSwKKyAgWHRydWN0IHRlc3RNdWx0aSgxOiBpOCBhcmcwLCAyOiBpMzIgYXJnMSwgMzogaTY0IGFyZzIsIDQ6IG1hcDxpMTYsIHN0cmluZz4gYXJnMywgNTogTnVtYmVyeiBhcmc0LCA2OiBVc2VySWQgYXJnNSksCiAKICAgLyoqCiAgICAqIFByaW50ICd0ZXN0RXhjZXB0aW9uKCVzKScgd2l0aCBhcmcgYXMgJyVzJwpAQCAtMjY5LDcgKzMwNCw3IEBACiAgICAqIFByaW50ICd0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKScgd2l0aCBhcmcwIGFzICclcycgYW5kIGFyZzEgYXMgJyVzJwogICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdwogICAgKiBpZiBhcmcwID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCi0gICAqIGVsc2VuIGlmIGFyZzAgPT0gIlhjZXB0aW9uMiIgdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICogZWxzZW4gaWYgYXJnMCA9PSAiWGNlcHRpb24yIiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBzdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgogICAgKiBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZwogICAgKiBAcmV0dXJuIFh0cnVjdCAtIGFuIFh0cnVjdCB3aXRoIHN0cmluZ190aGluZyA9IGFyZzEKICAgICovCkBAIC0yODYsNyArMzIxLDEyIEBACiAKIHNlcnZpY2UgU2Vjb25kU2VydmljZQogewotICB2b2lkIGJsYWhCbGFoKCkKKyAgLyoqCisgICAqIFByaW50cyAndGVzdFN0cmluZygiJXMiKScgd2l0aCB0aGluZyBhcyAnJXMnCisgICAqIEBwYXJhbSBzdHJpbmcgdGhpbmcgLSB0aGUgc3RyaW5nIHRvIHByaW50CisgICAqIEByZXR1cm4gc3RyaW5nIC0gcmV0dXJucyB0aGUgc3RyaW5nICd0aGluZycKKyAgICovCisgIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKDE6IHN0cmluZyB0aGluZykKIH0KIAogc3RydWN0IFZlcnNpb25pbmdUZXN0VjEgewpAQCAtMjk5LDcgKzMzOSw3IEBACiAgICAgICAgMTogaTMyIGJlZ2luX2luX2JvdGgsCiAKICAgICAgICAyOiBpMzIgbmV3aW50LAotICAgICAgIDM6IGJ5dGUgbmV3Ynl0ZSwKKyAgICAgICAzOiBpOCBuZXdieXRlLAogICAgICAgIDQ6IGkxNiBuZXdzaG9ydCwKICAgICAgICA1OiBpNjQgbmV3bG9uZywKICAgICAgICA2OiBkb3VibGUgbmV3ZG91YmxlCkBAIC0zNjgsNCArNDA4LDQgQEAKIHN0cnVjdCBTdHJ1Y3RCIHsKICAgMTogb3B0aW9uYWwgU3RydWN0QSBhYTsKICAgMjogcmVxdWlyZWQgU3RydWN0QSBhYjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdCBiL3Rlc3QvVHlwZWRlZlRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Mzc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L1R5cGVkZWZUZXN0LnRocmlmdApAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY3BwIHRocmlmdC50ZXN0CisKK3R5cGVkZWYgaTMyIE15SW50MzIKK3R5cGVkZWYgc3RyaW5nIE15U3RyaW5nOworCitzdHJ1Y3QgVHlwZWRlZlRlc3RTdHJ1Y3QgeworICAxOiBNeUludDMyIGZpZWxkX015SW50MzI7CisgIDI6IE15U3RyaW5nIGZpZWxkX015U3RyaW5nOworICAzOiBpMzIgZmllbGRfSW50MzI7CisgIDQ6IHN0cmluZyBmaWVsZF9TdHJpbmc7Cit9CisKK3R5cGVkZWYgVHlwZWRlZlRlc3RTdHJ1Y3QgTXlTdHJ1Y3QsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQgYi90ZXN0L1Vuc2FmZVR5cGVzLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhjOTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorCitzdHJ1Y3QgVW5zYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CmRpZmYgLS1naXQgYS90ZXN0L2F1ZGl0L1JFQURNRS5tZCBiL3Rlc3QvYXVkaXQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMmY4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2F1ZGl0L1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACitUeXBpY2FsIHVzYWdlCis9PT09PT09PT09PT09CitgYGAKK3RocmlmdC5leGUgLS1hdWRpdCA8b2xkRmlsZT4gPG5ld0ZpbGU+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+PD48IiAjXGJhY2tzcGFjZSkpCisKKyhkZWZjb25zdGFudCAqYmluYXJ5LXNlcXVlbmNlKiAjKDEyOCAxMjkgMTMwIDEzMSAxMzIgMTMzIDEzNCAxMzUgMTM2IDEzNyAxMzggMTM5IDE0MCAxNDEgMTQyIDE0MyAxNDQgMTQ1IDE0NiAxNDcgMTQ4IDE0OSAxNTAgMTUxIDE1MiAxNTMgMTU0IDE1NSAxNTYgMTU3IDE1OCAxNTkgMTYwIDE2MSAxNjIgMTYzIDE2NCAxNjUgMTY2IDE2NyAxNjggMTY5IDE3MCAxNzEgMTcyIDE3MyAxNzQgMTc1IDE3NiAxNzcgMTc4IDE3OSAxODAgMTgxIDE4MiAxODMgMTg0IDE4NSAxODYgMTg3IDE4OCAxODkgMTkwIDE5MSAxOTIgMTkzIDE5NCAxOTUgMTk2IDE5NyAxOTggMTk5IDIwMCAyMDEgMjAyIDIwMyAyMDQgMjA1IDIwNiAyMDcgMjA4IDIwOSAyMTAgMjExIDIxMiAyMTMgMjE0IDIxNSAyMTYgMjE3IDIxOCAyMTkgMjIwIDIyMSAyMjIgMjIzIDIyNCAyMjUgMjI2IDIyNyAyMjggMjI5IDIzMCAyMzEgMjMyIDIzMyAyMzQgMjM1IDIzNiAyMzcgMjM4IDIzOSAyNDAgMjQxIDI0MiAyNDMgMjQ0IDI0NSAyNDYgMjQ3IDI0OCAyNDkgMjUwIDI1MSAyNTIgMjUzIDI1NCAyNTUgMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNSAxNiAxNyAxOCAxOSAyMCAyMSAyMiAyMyAyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA0NSA0NiA0NyA0OCA0OSA1MCA1MSA1MiA1MyA1NCA1NSA1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyA2NCA2NSA2NiA2NyA2OCA2OSA3MCA3MSA3MiA3MyA3NCA3NSA3NiA3NyA3OCA3OSA4MCA4MSA4MiA4MyA4NCA4NSA4NiA4NyA4OCA4OSA5MCA5MSA5MiA5MyA5NCA5NSA5NiA5NyA5OCA5OSAxMDAgMTAxIDEwMiAxMDMgMTA0IDEwNSAxMDYgMTA3IDEwOCAxMDkgMTEwIDExMSAxMTIgMTEzIDExNCAxMTUgMTE2IDExNyAxMTggMTE5IDEyMCAxMjEgMTIyIDEyMyAxMjQgMTI1IDEyNiAxMjcpKQorCisoZGVmdGVzdCB2b2lkLXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXZvaWQgdGhyaWZ0LWNyb3NzOjoqcHJvdCopKSkpCisKKyhkZWZ0ZXN0IGJvb2xlYW4tdGVzdCAoKQorICAoaXMgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYm9vbCB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0KSkKKyAgKGlzIChub3QgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYm9vbCB0aHJpZnQtY3Jvc3M6Oipwcm90KiBuaWwpKSkpCisKKyhkZWZ0ZXN0IGludGVnZXItdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAxMjcpIDEyNykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIC0xMjgpIC0xMjgpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0MikgNDIpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtYnl0ZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAwKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAyMTQ3NDgzNjQ3KSAyMTQ3NDgzNjQ3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWkzMiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtMjE0NzQ4MzY0OCkgLTIxNDc0ODM2NDgpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIDkyMjMzNzIwMzY4NTQ3NzU4MDcpIDkyMjMzNzIwMzY4NTQ3NzU4MDcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTY0IHRocmlmdC1jcm9zczo6KnByb3QqIC05MjIzMzcyMDM2ODU0Nzc1ODA4KSAtOTIyMzM3MjAzNjg1NDc3NTgwOCkpKQorCisoZGVmdGVzdCBkb3VibGUtdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIDAuMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogNDIuMCkgNDIpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZG91YmxlIHRocmlmdC1jcm9zczo6KnByb3QqIC01NTUuMCkgLTU1NSkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTUyLjM2NzgpIC01Mi4zNjc4KSkpCisKKyhkZWZ0ZXN0IHN0cmluZy10ZXN0ICgpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIiIpICIiKSkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiKGRlZnVuIGJvdHNidWlsZGJvdHMgKCkgKGJvdHNidWlsc2JvdHMpKSIpCisgICAgICAgICAgICAgICAiKGRlZnVuIGJvdHNidWlsZGJvdHMgKCkgKGJvdHNidWlsc2JvdHMpKSIpKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICpsYW5nLXN0cmluZyopICpsYW5nLXN0cmluZyopKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICp0cmljay1zdHJpbmcqKSAqdHJpY2stc3RyaW5nKikpKQorCisoZGVmdGVzdCBiaW5hcnktdGVzdCAoKQorICAoaXMgKGVxdWFscCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1iaW5hcnkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogIygpKSAjKCkpKQorICAoaXMgKGVxdWFscCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1iaW5hcnkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKmJpbmFyeS1zZXF1ZW5jZSopICpiaW5hcnktc2VxdWVuY2UqKSkpCisKKyhkZWZ0ZXN0IGVudW0tdGVzdCAoKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6LmZpdmUpIHRocmlmdC50ZXN0Om51bWJlcnouZml2ZSkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnouZWlnaHQpIHRocmlmdC50ZXN0Om51bWJlcnouZWlnaHQpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZW51bSB0aHJpZnQtY3Jvc3M6Oipwcm90KiB0aHJpZnQudGVzdDpudW1iZXJ6Lm9uZSkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5vbmUpKSkKKworKGRlZnRlc3QgdHlwZWRlZi10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC10eXBlZGVmIHRocmlmdC1jcm9zczo6KnByb3QqIDMwOTg1ODIzNTA4MjUyMykgMzA5ODU4MjM1MDgyNTIzKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOnN0cnVjdHMpCisKKyhpbi1wYWNrYWdlICM6c3RydWN0cykKKworKGRlZnBhcmFtZXRlciAqdGVzdC1zdHJ1Y3QqICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdCA6c3RyaW5nLXRoaW5nICJIZWxsIGlzIGVtcHR5LiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgLTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDQyNDI0MjQyKSkKKworKGRlZnBhcmFtZXRlciAqdGVzdC1uZXN0KiAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QyIDpieXRlLXRoaW5nIDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0cnVjdC10aGluZyAqdGVzdC1zdHJ1Y3QqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAtNDIpKQorCisoZGVmdGVzdCBzdHJ1Y3QtdGVzdCAoKQorICAobGV0ICgocmVjLXN0cnVjdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJ1Y3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRlc3Qtc3RydWN0KikpKQorICAgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nIHJlYy1zdHJ1Y3QpKSkpKQorCisoZGVmdGVzdCBuZXN0LXRlc3QgKCkKKyAgKGxldCogKChyZWMtbmVzdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1uZXN0IHRocmlmdC1jcm9zczo6KnByb3QqICp0ZXN0LW5lc3QqKSkKKyAgICAgICAgIChyZWMtc3RydWN0ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLXN0cnVjdC10aGluZyByZWMtbmVzdCkpKQorICAgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWJ5dGUtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyAqdGVzdC1zdHJ1Y3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0LWkzMi10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTY0LXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdDItYnl0ZS10aGluZyAqdGVzdC1uZXN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdDItYnl0ZS10aGluZyByZWMtbmVzdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1pMzItdGhpbmcgKnRlc3QtbmVzdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWkzMi10aGluZyByZWMtbmVzdCkpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmNvbnRhaW5lcnMpCisKKyhpbi1wYWNrYWdlICM6Y29udGFpbmVycykKKworKGRlZnRlc3QgbGlzdC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1saXN0IHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKGVxdWFsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWxpc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogJyg0MiAtNDIgMCA1KSkgJyg0MiAtNDIgMCA1KSkpKQorCisoZGVmdGVzdCBzZXQtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc2V0IHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKGVxdWFsIChzb3J0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXNldCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAobGlzdCA0MiAtNDIgMCA1KSkgIyc8KQorICAgICAgICAgICAgICcoLTQyIDAgNSA0MikpKSkKKworKGRlZnVuIG1hcD0gKG1hcDEgbWFwMiAma2V5IChjYXItcHJlZGljYXRlICMnZXF1YWwpIChjZHItcHJlZGljYXRlICMnZXF1YWwpKQorICAiQ29tcGFyZSB0d28gYXNzb2MgbWFwcyBhY2NvcmRpbmcgdG8gdGhlIHByZWRpY2F0ZXMgZ2l2ZW4uIgorICAobm90IChzZXQtZXhjbHVzaXZlLW9yIG1hcDEgbWFwMiA6dGVzdCAobGFtYmRhIChlbDEgZWwyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKGZ1bmNhbGwgY2FyLXByZWRpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhciBlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGVsMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY2FsbCBjZHItcHJlZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2RyIGVsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgZWwyKSkpKSkpKQorCisoZGVmdGVzdCBtYXAtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKQorICAoaXMgKG1hcD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqICcoKDAgLiAxKSAoNDIgLiAtNDIpICg1IC4gNSkpKQorICAgICAgICAgICAgJygoMCAuIDEpICg0MiAuIC00MikgKDUgLiA1KSkpKQorICAoaXMgKG1hcD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbWFwLW1hcCB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0MikKKyAgICAgICAgICAgICcoKC00IC4gKCgtNCAuIC00KSAoLTMgLiAtMykgKC0yIC4gLTIpICgtMSAuIC0xKSkpCisgICAgICAgICAgICAgICg0IC4gKCgxIC4gMSkgKDIgLiAyKSAoMyAuIDMpICg0IC4gNCkpKSkKKyAgICAgICAgICAgIDpjZHItcHJlZGljYXRlICMnbWFwPSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpleGNlcHRpb25zKQorCisoaW4tcGFja2FnZSAjOmV4Y2VwdGlvbnMpCisKKyhkZWZ1biB0ZXN0LXhjZXB0aW9uIChleHBlY3RlZC1jb2RlIGV4cGVjdGVkLW1lc3NhZ2UgZnVuY3Rpb24gJnJlc3QgYXJncykKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciB4Y2VwdGlvbiBpcyBzaWduYWxsZWQsIGFuZCB3aGV0aGVyIGl0cyBmaWVsZHMgaGF2ZSB0aGUgZXhwZWN0ZWQgdmFsdWVzLiIKKyAgKGhhbmRsZXItY2FzZSAocHJvZ24gKGFwcGx5IGZ1bmN0aW9uIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgIG5pbCkKKyAgICAodGhyaWZ0LnRlc3Q6eGNlcHRpb24gKGV4KSAoYW5kICg9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24tZXJyb3ItY29kZSBleCkgZXhwZWN0ZWQtY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmc9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24tbWVzc2FnZSBleCkgZXhwZWN0ZWQtbWVzc2FnZSkpKSkpCisKKyhkZWZ1biB0ZXN0LXhjZXB0aW9uMiAoZXhwZWN0ZWQtY29kZSBleHBlY3RlZC1tZXNzYWdlIGZ1bmN0aW9uICZyZXN0IGFyZ3MpCisgICJBIGhlbHBlciBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgeGNlcHRpb24yIGlzIHNpZ25hbGxlZCwgYW5kIHdoZXRoZXIgaXRzIGZpZWxkcyBoYXZlIHRoZSBleHBlY3RlZCB2YWx1ZXMuIgorICAoaGFuZGxlci1jYXNlIChwcm9nbiAoYXBwbHkgZnVuY3Rpb24gYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgbmlsKQorICAgICh0aHJpZnQudGVzdDp4Y2VwdGlvbjIgKGV4KSAoYW5kICg9ICh0aHJpZnQudGVzdDo6eGNlcHRpb24yLWVycm9yLWNvZGUgZXgpIGV4cGVjdGVkLWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHRocmlmdC50ZXN0Ojp4dHJ1Y3Qtc3RyaW5nLXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDo6eGNlcHRpb24yLXN0cnVjdC10aGluZyBleCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtbWVzc2FnZSkpKSkpCisKKyhkZWZ0ZXN0IGV4Y2VwdGlvbi10ZXN0ICgpCisgIChpcyAodGVzdC14Y2VwdGlvbiAxMDAxICJYY2VwdGlvbiIgIyd0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiWGNlcHRpb24iKSkKKyAgKHNpZ25hbHMgdGhyaWZ0OmFwcGxpY2F0aW9uLWVycm9yICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiVEV4Y2VwdGlvbiIpKQorICAoZmluaXNoZXMgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJzdWNjZXNzIikpKQorCisoZGVmdGVzdCBtdWx0aS1leGNlcHRpb24tdGVzdCAoKQorICAoaXMgKHRlc3QteGNlcHRpb24gMTAwMQorICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgIlhjZXB0aW9uIgorICAgICAgICAgICAgICAgICAgICAgIm1lYW5pbmdsZXNzIikpCisgIChpcyAodGVzdC14Y2VwdGlvbjIgMjAwMgorICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAgICAgICAgICAgICAgICAgICAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0LWNyb3NzOjoqcHJvdCoKKyAgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICJtZWFuaW5nbGVzcyB0b28hIikpCisgIChpcyAoc3RyaW5nPSAiZm9vYmFyIiAodGhyaWZ0LnRlc3Q6eHRydWN0LXN0cmluZy10aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW11bHRpLWV4Y2VwdGlvbiB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VzcyEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29iYXIiKSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6bWlzYykKKworKGluLXBhY2thZ2UgIzptaXNjKQorCisoZGVmdGVzdCBvbmV3YXktdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtb25ld2F5IHRocmlmdC1jcm9zczo6KnByb3QqIDEpKSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOm11bHRpcGxleCkKKworKGluLXBhY2thZ2UgIzptdWx0aXBsZXgpCisKKyhkZWZ0ZXN0IG11bHRpcGxleC10ZXN0ICgpCisgIDs7IFJlbW92ZWQgZnJvbSB0aGUgSURMIGRlZmluaXRpb24uCisgIDs7IChmaW5pc2hlcyAodGhyaWZ0LnRlc3Quc2Vjb25kLXNlcnZpY2U6YmxhaC1ibGFoIHRocmlmdC1jcm9zczo6KnByb3QqKSkKKyAgKGlzIChzdHJpbmc9ICJhc2QiICh0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZTpzZWNvbmR0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiYXNkIikpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0IGIvdGVzdC9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVkMjk5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIENvbnRhaW5zIHRoZSB0aHJpZnQgc3BlY2lmaWMgTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZCitpbmNsdWRlKFRocmlmdE1hY3JvcykKKworaW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7Qm9vc3RfSU5DTFVERV9ESVJTfSIpCisKK2ZpbmRfcGFja2FnZShPcGVuU1NMIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gIiR7T1BFTlNTTF9JTkNMVURFX0RJUn0iKQorCitmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmcm9tIHVwc3RyZWFtCitpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisKK2ZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtaTElCX0lOQ0xVREVfRElSU30pCisKKyNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKK2luY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQorCitzZXQoY3Jvc3N0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcAorICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIHNyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKKykKK2FkZF9saWJyYXJ5KGNyb3NzdGVzdGdlbmNwcCBTVEFUSUMgJHtjcm9zc3Rlc3RnZW5jcHBfU09VUkNFU30pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoY3Jvc3N0ZXN0Z2VuY3BwIHRocmlmdCkKKworc2V0KGNyb3Nzc3RyZXNzZ2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL1NlcnZpY2UuY3BwCisgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwCispCithZGRfbGlicmFyeShjcm9zc3N0cmVzc2dlbmNwcCBTVEFUSUMgJHtjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShjcm9zc3N0cmVzc2dlbmNwcCB0aHJpZnQpCisKK2FkZF9leGVjdXRhYmxlKFRlc3RTZXJ2ZXIgc3JjL1Rlc3RTZXJ2ZXIuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRlc3RTZXJ2ZXIgY3Jvc3N0ZXN0Z2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdFNlcnZlciB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0U2VydmVyIHRocmlmdHopCisKK2FkZF9leGVjdXRhYmxlKFRlc3RDbGllbnQgc3JjL1Rlc3RDbGllbnQuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRlc3RDbGllbnQgY3Jvc3N0ZXN0Z2VuY3BwICR7Qm9vc3RfTElCUkFSSUVTfSAke0xJQkVWRU5UX0xJQn0pCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVGVzdENsaWVudCB0aHJpZnRuYikKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUZXN0Q2xpZW50IHRocmlmdHopCisKK2FkZF9leGVjdXRhYmxlKFN0cmVzc1Rlc3Qgc3JjL1N0cmVzc1Rlc3QuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFN0cmVzc1Rlc3QgY3Jvc3NzdHJlc3NnZW5jcHAgJHtCb29zdF9MSUJSQVJJRVN9ICR7TElCRVZFTlRfTElCfSkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0IHRocmlmdCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShTdHJlc3NUZXN0IHRocmlmdG5iKQorYWRkX3Rlc3QoTkFNRSBTdHJlc3NUZXN0IENPTU1BTkQgU3RyZXNzVGVzdCkKKworYWRkX2V4ZWN1dGFibGUoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKFN0cmVzc1Rlc3ROb25CbG9ja2luZyBjcm9zc3N0cmVzc2dlbmNwcCAke0Jvb3N0X0xJQlJBUklFU30gJHtMSUJFVkVOVF9MSUJ9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnQpCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoU3RyZXNzVGVzdE5vbkJsb2NraW5nIHRocmlmdG5iKQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKFN0cmVzc1Rlc3ROb25CbG9ja2luZyB0aHJpZnR6KQorYWRkX3Rlc3QoTkFNRSBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcgQ09NTUFORCBTdHJlc3NUZXN0Tm9uQmxvY2tpbmcpCisKKyMKKyMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKKyMKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5oIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0LmggZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcDp0ZW1wbGF0ZXMsY29iX3N0eWxlIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CispCisKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlcnZpY2UuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0CispCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCmluZGV4IDk1NTc0ZmMuLmU4YmU4MGEgMTAwNzU1Ci0tLSBhL3Rlc3QvY3BwL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCkBAIC0xNiwxNCArMTYsMzAgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIFwKKyAgICAgICAgICAgICAgICBnZW4tY3BwL1N0cmVzc1Rlc3RfY29uc3RhbnRzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAorCiBub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhIGxpYnN0cmVzc3Rlc3RnZW5jcHAubGEKIG5vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBcCisJZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS50Y2MgXAogCWdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIFwKLQlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5oIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMudGNjIFwKLQlnZW4tY3BwL1RocmlmdFRlc3QudGNjCisJZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBcCisJZ2VuLWNwcC9UaHJpZnRUZXN0LmggXAorCWdlbi1jcHAvVGhyaWZ0VGVzdC50Y2MgXAorCXNyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKIAogbGlidGVzdGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKIApAQCAtMzcsNiArNTMsOCBAQAogCiBsaWJzdHJlc3N0ZXN0Z2VuY3BwX2xhX0xJQkFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQogCitwcmVjcm9zczogVGVzdFNlcnZlciBUZXN0Q2xpZW50CisKIGNoZWNrX1BST0dSQU1TID0gXAogCVRlc3RTZXJ2ZXIgXAogCVRlc3RDbGllbnQgXApAQCAtNTUsNyArNzMsNyBAQAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAotCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMKKwktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbSAkKFpMSUJfTElCUykKIAogVGVzdENsaWVudF9TT1VSQ0VTID0gXAogCXNyYy9UZXN0Q2xpZW50LmNwcApAQCAtNjUsNyArODMsNyBAQAogCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0ei5sYSBcCiAJJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAotCS1sZXZlbnQgLWxib29zdF9wcm9ncmFtX29wdGlvbnMKKwktbGV2ZW50IC1sYm9vc3RfcHJvZ3JhbV9vcHRpb25zIC1sYm9vc3Rfc3lzdGVtIC1sYm9vc3RfZmlsZXN5c3RlbSAkKFpMSUJfTElCUykKIAogU3RyZXNzVGVzdF9TT1VSQ0VTID0gXAogCXNyYy9TdHJlc3NUZXN0LmNwcApAQCAtODQsMjggKzEwMiwyNCBAQAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwOiAkKHRvcF9zcmNkaXIpL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK2dlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5oIGdlbi1jcHAvU2Vjb25kU2VydmljZS50Y2M6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgLXIgJDwKIAotZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwOiAkKHRvcF9zcmNkaXIpL3Rlc3QvU3RyZXNzVGVzdC50aHJpZnQKK2dlbi1jcHAvU3RyZXNzVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9TZXJ2aWNlLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1N0cmVzc1Rlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAotSU5DTFVERVMgPSBcCi0JLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAotCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoTElCRVZFTlRfQ1BQRkxBR1MpCi1BTV9DWFhGTEFHUyA9IC1XYWxsCi1BTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpCitBTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoTElCRVZFTlRfQ1BQRkxBR1MpIC1JJCh0b3Bfc3JjZGlyKS9saWIvY3BwL3NyYyAtSWdlbi1jcHAKK0FNX0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MKK0FNX0xERkxBR1MgPSAkKEJPT1NUX0xERkxBR1MpICQoTElCRVZFTlRfTERGTEFHUykgJChaTElCX0xJQlMpCiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1jcHAKKwkkKFJNKSBnZW4tY3BwLyoKKworc3R5bGUtbG9jYWw6CisJJChDUFBTVFlMRV9DTUQpCiAKIEVYVFJBX0RJU1QgPSBcCiAJc3JjL1Rlc3RDbGllbnQuY3BwIFwKIAlzcmMvVGVzdFNlcnZlci5jcHAgXAogCXNyYy9TdHJlc3NUZXN0LmNwcCBcCi0Jc3JjL1N0cmVzc1Rlc3ROb25CbG9ja2luZy5jcHAgXAotCXJlYWxsb2MvcmVhbGxvY190ZXN0LmMgXAotCXJlYWxsb2MvTWFrZWZpbGUKKwlzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZSBiL3Rlc3QvY3BwL3JlYWxsb2MvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWJiYjMuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgcHJvYmFibHkgc2hvdWxkIG5vdCBnbyBpbnRvICJtYWtlIGNoZWNrIiwgYmVjYXVzZSBpdCBpcyBhbiBleHBlcmltZW50LAotIyBub3QgYSB0ZXN0LiAgU3BlY2lmaWNhbGx5LCBpdCBpcyBtZWFudCB0byBkZXRlcm1pbmUgaG93IGxpa2VseSByZWFsbG9jIGlzCi0jIHRvIGF2b2lkIGEgY29weS4gIFRoaXMgaXMgcG9vcmx5IGRvY3VtZW50ZWQuCi0KLXJ1bjogcmVhbGxvY190ZXN0Ci0JZm9yIGl0IGluIDEgNCA2NCA7IGRvIFwKLQkJZm9yIG5iIGluIDEgOCA2NCA1MTIgOyBkbyBcCi0JCQlmb3IgbWlucyBpbiA2NCA1MTIgOyBkbyBcCi0JCQkJZm9yIG1heHMgaW4gMjA0OCAyNjIxNDQgOyBkbyBcCi0JCQkJCWZvciBkYiBpbiA4IDY0IDsgZG8gXAotCQkJCQkJLi9yZWFsbG9jX3Rlc3QgJCRuYiAkJG1pbnMgJCRtYXhzICQkZGIgJCRpdCBcCi0JCQkJCTsgZG9uZSBcCi0JCQkJOyBkb25lIFwKLQkJCTsgZG9uZSBcCi0JCTsgZG9uZSBcCi0JOyBkb25lIFwKLQk+IHJhd19zdGF0cwotCi1DRkxBR1MgPSAtV2FsbCAtZyAtc3RkPWM5OQotTERMSUJTID0gLWxkbAotcmVhbGxvY190ZXN0OiByZWFsbG9jX3Rlc3QuYwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYyBiL3Rlc3QvY3BwL3JlYWxsb2MvcmVhbGxvY190ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzYzYWQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxkbGZjbi5oPgotCi1pbnQgY29waWVzOwotaW50IG5vbl9jb3BpZXM7Ci0KLXZvaWQgKnJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICBzdGF0aWMgdm9pZCAqKCpyZWFsX3JlYWxsb2MpKHZvaWQqLCBzaXplX3QpID0gTlVMTDsKLSAgaWYgKHJlYWxfcmVhbGxvYyA9PSBOVUxMKSB7Ci0gICAgcmVhbF9yZWFsbG9jID0gKHZvaWQqICgqKSAodm9pZCosIHNpemVfdCkpIGRsc3ltKFJUTERfTkVYVCwgInJlYWxsb2MiKTsKLSAgfQotCi0gIHZvaWQgKnJldF9wdHIgPSAoKnJlYWxfcmVhbGxvYykocHRyLCBzaXplKTsKLQotICBpZiAocmV0X3B0ciA9PSBwdHIpIHsKLSAgICBub25fY29waWVzKys7Ci0gIH0gZWxzZSB7Ci0gICAgY29waWVzKys7Ci0gIH0KLQotICByZXR1cm4gcmV0X3B0cjsKLX0KLQotCi1zdHJ1Y3QgVE1lbW9yeUJ1ZmZlciB7Ci0gIHZvaWQqIHB0cjsKLSAgaW50IHNpemU7Ci19OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gIGludCBudW1fYnVmZmVyczsKLSAgaW50IGluaXRfc2l6ZTsKLSAgaW50IG1heF9zaXplOwotICBpbnQgZG91YmxpbmdzOwotICBpbnQgaXRlcmF0aW9uczsKLQotICBpZiAoYXJnYyA8IDYgfHwKLSAgICAgIGFyZ2MgPiA3IHx8Ci0gICAgICAobnVtX2J1ZmZlcnMgPSBhdG9pKGFyZ3ZbMV0pKSA9PSAwIHx8Ci0gICAgICAoaW5pdF9zaXplID0gYXRvaShhcmd2WzJdKSkgPT0gMCB8fAotICAgICAgKG1heF9zaXplID0gYXRvaShhcmd2WzNdKSkgPT0gMCB8fAotICAgICAgaW5pdF9zaXplID4gbWF4X3NpemUgfHwKLSAgICAgIChpdGVyYXRpb25zID0gYXRvaShhcmd2WzRdKSkgPT0gMCB8fAotICAgICAgKGRvdWJsaW5ncyA9IGF0b2koYXJndls1XSkpID09IDAgfHwKLSAgICAgIChhcmdjID09IDcgJiYgYXRvaShhcmd2WzZdKSA9PSAwKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6IHJlYWxsb2NfdGVzdCA8bnVtX2J1ZmZlcnM+IDxpbml0X3NpemU+IDxtYXhfc2l6ZT4gPGRvdWJsaW5ncz4gPGl0ZXJhdGlvbnM+IFtzZWVkXVxuIik7Ci0gICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICB9Ci0KLSAgZm9yICggaW50IGkgPSAwIDsgaSA8IGFyZ2MgOyBpKysgKSB7Ci0gICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKLSAgfQotICBwcmludGYoIlxuIik7Ci0KLSAgaWYgKGFyZ2MgPT0gNykgewotICAgIHNyYW5kKGF0b2koYXJndls2XSkpOwotICB9IGVsc2UgewotICAgIHNyYW5kKHRpbWUoTlVMTCkpOwotICB9Ci0KLSAgc3RydWN0IFRNZW1vcnlCdWZmZXIqIGJ1ZmZlcnMgPSBjYWxsb2MobnVtX2J1ZmZlcnMsIHNpemVvZigqYnVmZmVycykpOwotICBpZiAoYnVmZmVycyA9PSBOVUxMKSBhYm9ydCgpOwotCi0gIGZvciAoIGludCBpID0gMCA7IGkgPCBudW1fYnVmZmVycyA7IGkrKyApIHsKLSAgICBidWZmZXJzW2ldLnNpemUgPSBtYXhfc2l6ZTsKLSAgfQotCi0gIHdoaWxlIChpdGVyYXRpb25zIC0tPiAwKSB7Ci0gICAgZm9yICggaW50IGkgPSAwIDsgaSA8IGRvdWJsaW5ncyAqIG51bV9idWZmZXJzIDsgaSsrICkgewotICAgICAgc3RydWN0IFRNZW1vcnlCdWZmZXIqIGJ1ZiA9ICZidWZmZXJzW3JhbmQoKSAlIG51bV9idWZmZXJzXTsKLSAgICAgIGJ1Zi0+c2l6ZSAqPSAyOwotICAgICAgaWYgKGJ1Zi0+c2l6ZSA8PSBtYXhfc2l6ZSkgewotICAgICAgICBidWYtPnB0ciA9IHJlYWxsb2MoYnVmLT5wdHIsIGJ1Zi0+c2l6ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmcmVlKGJ1Zi0+cHRyKTsKLSAgICAgICAgYnVmLT5zaXplID0gaW5pdF9zaXplOwotICAgICAgICBidWYtPnB0ciA9IG1hbGxvYyhidWYtPnNpemUpOwotICAgICAgfQotICAgICAgaWYgKGJ1Zi0+cHRyID09IE5VTEwpIGFib3J0KCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpbnRmKCJOb24tY29waWVkICVkLyVkICglLjJmJSUpXG4iLCBub25fY29waWVzLCBjb3BpZXMgKyBub25fY29waWVzLCAxMDAuMCAqIG5vbl9jb3BpZXMgLyAoY29waWVzICsgbm9uX2NvcGllcykpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcCBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcAppbmRleCA3ZGEzZGIwLi41ODVmODlhIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCkBAIC0zMywxNSArMzMsMTYgQEAKICNpbmNsdWRlIDx0aHJpZnQvVExvZ2dpbmcuaD4KIAogI2luY2x1ZGUgIlNlcnZpY2UuaCIKLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxtYXA+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwpAQCAtNTIsMjMgKzUzLDE4IEBACiB1c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOwogCiBzdHJ1Y3QgZXFzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Ci0gIH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsgfQogfTsKIAogc3RydWN0IGx0c3RyIHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7Ci0gIH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOyB9CiB9OwogCi0KIC8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7CiB0eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOwogCiBjbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFNlcnZlcigpIHt9CiAKICAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKQEAgLTg3LDY3ICs4Myw5MiBAQAogICAgIHJldHVybiBjb3VudHNfOwogICB9CiAKLSAgaW50OF90IGVjaG9CeXRlKGNvbnN0IGludDhfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykge3JldHVybiBhcmc7fQotICB2b2lkIGVjaG9TdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyAmYXJnKSB7CisgIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50MzJfdCBlY2hvSTMyKGNvbnN0IGludDMyX3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgaW50NjRfdCBlY2hvSTY0KGNvbnN0IGludDY0X3QgYXJnKSB7IHJldHVybiBhcmc7IH0KKyAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcmIGFyZykgewogICAgIGlmIChhcmcgIT0gImhlbGxvIikgewogICAgICAgVF9FUlJPUl9BQk9SVCgiV1JPTkcgU1RSSU5HICglcykhISEhIiwgYXJnLmNfc3RyKCkpOwogICAgIH0KICAgICBvdXQgPSBhcmc7CiAgIH0KLSAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQotICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4gJm91dCwgY29uc3Qgc2V0PGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4gJm91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiAmYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9MaXN0KHZlY3RvcjxpbnQ4X3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CisgIHZvaWQgZWNob1NldChzZXQ8aW50OF90PiYgb3V0LCBjb25zdCBzZXQ8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9NYXAobWFwPGludDhfdCwgaW50OF90PiYgb3V0LCBjb25zdCBtYXA8aW50OF90LCBpbnQ4X3Q+JiBhcmcpIHsgb3V0ID0gYXJnOyB9CiAKIHByaXZhdGU6CiAgIGNvdW50X21hcCBjb3VudHNfOwogICBNdXRleCBsb2NrXzsKLQogfTsKIAotY2xhc3MgQ2xpZW50VGhyZWFkOiBwdWJsaWMgUnVubmFibGUgeworZW51bSBUcmFuc3BvcnRPcGVuQ2xvc2VCZWhhdmlvciB7CisgIE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkLAorICBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQKK307CitjbGFzcyBDbGllbnRUaHJlYWQgOiBwdWJsaWMgUnVubmFibGUgewogcHVibGljOgotCi0gIENsaWVudFRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PnRyYW5zcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LCBNb25pdG9yJiBtb25pdG9yLCBzaXplX3QmIHdvcmtlckNvdW50LCBzaXplX3QgbG9vcENvdW50LCBUVHlwZSBsb29wVHlwZSkgOgotICAgIF90cmFuc3BvcnQodHJhbnNwb3J0KSwKLSAgICBfY2xpZW50KGNsaWVudCksCi0gICAgX21vbml0b3IobW9uaXRvciksCi0gICAgX3dvcmtlckNvdW50KHdvcmtlckNvdW50KSwKLSAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCi0gICAgX2xvb3BUeXBlKGxvb3BUeXBlKQotICB7fQorICBDbGllbnRUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IGNsaWVudCwKKyAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCisgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAorICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgIFRUeXBlIGxvb3BUeXBlLAorICAgICAgICAgICAgICAgVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgYmVoYXZpb3IpCisgICAgOiBfdHJhbnNwb3J0KHRyYW5zcG9ydCksCisgICAgICBfY2xpZW50KGNsaWVudCksCisgICAgICBfbW9uaXRvcihtb25pdG9yKSwKKyAgICAgIF93b3JrZXJDb3VudCh3b3JrZXJDb3VudCksCisgICAgICBfbG9vcENvdW50KGxvb3BDb3VudCksCisgICAgICBfbG9vcFR5cGUobG9vcFR5cGUpLAorICAgICAgX2JlaGF2aW9yKGJlaGF2aW9yKSB7fQogCiAgIHZvaWQgcnVuKCkgewogCiAgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0CiAKLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgd2hpbGUoX3dvcmtlckNvdW50ID09IDApIHsKKyAgICB7CisgICAgICBTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgICB3aGlsZSAoX3dvcmtlckNvdW50ID09IDApIHsKICAgICAgICAgX21vbml0b3Iud2FpdCgpOwogICAgICAgfQogICAgIH0KIAogICAgIF9zdGFydFRpbWUgPSBVdGlsOjpjdXJyZW50VGltZSgpOworICAgIGlmKF9iZWhhdmlvciA9PSBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkgeworICAgICAgX3RyYW5zcG9ydC0+b3BlbigpOworICAgIH0KIAotICAgIF90cmFuc3BvcnQtPm9wZW4oKTsKLQotICAgIHN3aXRjaChfbG9vcFR5cGUpIHsKLSAgICBjYXNlIFRfVk9JRDogbG9vcEVjaG9Wb2lkKCk7IGJyZWFrOwotICAgIGNhc2UgVF9CWVRFOiBsb29wRWNob0J5dGUoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0kzMjogbG9vcEVjaG9JMzIoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX0k2NDogbG9vcEVjaG9JNjQoKTsgYnJlYWs7Ci0gICAgY2FzZSBUX1NUUklORzogbG9vcEVjaG9TdHJpbmcoKTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogY2VyciA8PCAiVW5leHBlY3RlZCBsb29wIHR5cGUiIDw8IF9sb29wVHlwZSA8PCBlbmRsOyBicmVhazsKKyAgICBzd2l0Y2ggKF9sb29wVHlwZSkgeworICAgIGNhc2UgVF9WT0lEOgorICAgICAgbG9vcEVjaG9Wb2lkKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGxvb3BFY2hvQnl0ZSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0kzMjoKKyAgICAgIGxvb3BFY2hvSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfSTY0OgorICAgICAgbG9vcEVjaG9JNjQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICBsb29wRWNob1N0cmluZygpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsKKyAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIF9lbmRUaW1lID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKIAotICAgIF90cmFuc3BvcnQtPmNsb3NlKCk7CisgICAgaWYoX2JlaGF2aW9yID09IE9wZW5BbmRDbG9zZVRyYW5zcG9ydEluVGhyZWFkKSB7CisgICAgICBfdHJhbnNwb3J0LT5jbG9zZSgpOworICAgIH0KIAogICAgIF9kb25lID0gdHJ1ZTsKIAotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwogCiAgICAgICBfd29ya2VyQ291bnQtLTsKIApAQCAtMTY4LDcgKzE4OSw4IEBACiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKICAgICAgIGludDhfdCBhcmcgPSAxOwogICAgICAgaW50OF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CiAgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CiAgICAgfQogICB9CkBAIC0xNzcsNyArMTk5LDggQEAKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewogICAgICAgaW50MzJfdCBhcmcgPSAxOwogICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKICAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKICAgICB9CiAgIH0KQEAgLTE4Niw3ICsyMDksOCBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ2NF90IGFyZyA9IDE7CiAgICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KICAgfQpAQCAtMjAwLDggKzIyNCw4IEBACiAgICAgfQogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IF9jbGllbnQ7CiAgIE1vbml0b3ImIF9tb25pdG9yOwogICBzaXplX3QmIF93b3JrZXJDb3VudDsKICAgc2l6ZV90IF9sb29wQ291bnQ7CkBAIC0yMTAsMTggKzIzNCw0MSBAQAogICBpbnQ2NF90IF9lbmRUaW1lOwogICBib29sIF9kb25lOwogICBNb25pdG9yIF9zbGVlcDsKKyAgVHJhbnNwb3J0T3BlbkNsb3NlQmVoYXZpb3IgX2JlaGF2aW9yOwogfTsKIAorY2xhc3MgVFN0YXJ0T2JzZXJ2ZXIgOiBwdWJsaWMgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlciB7CitwdWJsaWM6CisgIFRTdGFydE9ic2VydmVyKCkgOiBhd2FrZV8oZmFsc2UpIHt9CisgIHZpcnR1YWwgdm9pZCBwcmVTZXJ2ZSgpIHsKKyAgICBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlN5bmNocm9uaXplZCBzKG1fKTsKKyAgICBhd2FrZV8gPSB0cnVlOworICAgIG1fLm5vdGlmeUFsbCgpOworICB9CisgIHZvaWQgd2FpdEZvclNlcnZpY2UoKSB7CisgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQgcyhtXyk7CisgICAgd2hpbGUgKCFhd2FrZV8pCisgICAgICBtXy53YWl0Rm9yZXZlcigpOworICB9CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworcHJpdmF0ZToKKyAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIG1fOworICBib29sIGF3YWtlXzsKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogCiAgIGludCBwb3J0ID0gOTA5MTsKKyAgc3RyaW5nIGNsaWVudFR5cGUgPSAicmVndWxhciI7CiAgIHN0cmluZyBzZXJ2ZXJUeXBlID0gInRocmVhZC1wb29sIjsKICAgc3RyaW5nIHByb3RvY29sVHlwZSA9ICJiaW5hcnkiOwogICBzaXplX3Qgd29ya2VyQ291bnQgPSA0OwogICBzaXplX3QgY2xpZW50Q291bnQgPSAyMDsKICAgc2l6ZV90IGxvb3BDb3VudCA9IDUwMDAwOwotICBUVHlwZSBsb29wVHlwZSAgPSBUX1ZPSUQ7CisgIFRUeXBlIGxvb3BUeXBlID0gVF9WT0lEOwogICBzdHJpbmcgY2FsbE5hbWUgPSAiZWNob1ZvaWQiOwogICBib29sIHJ1blNlcnZlciA9IHRydWU7CiAgIGJvb2wgbG9nUmVxdWVzdHMgPSBmYWxzZTsKQEAgLTIzMCwyOCArMjc3LDM0IEBACiAKICAgb3N0cmluZ3N0cmVhbSB1c2FnZTsKIAotICB1c2FnZSA8PAotICAgIGFyZ3ZbMF0gPDwgIiBbLS1wb3J0PTxwb3J0IG51bWJlcj5dIFstLXNlcnZlcl0gWy0tc2VydmVyLXR5cGU9PHNlcnZlci10eXBlPl0gWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dIFstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSIgPDwgZW5kbCA8PAotICAgICJcdGNsaWVudHMgICAgICAgIE51bWJlciBvZiBjbGllbnQgdGhyZWFkcyB0byBjcmVhdGUgLSAwIGltcGxpZXMgbm8gY2xpZW50cywgaS5lLiBzZXJ2ZXIgb25seS4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRDb3VudCA8PCBlbmRsIDw8Ci0gICAgIlx0aGVscCAgICAgICAgICAgUHJpbnRzIHRoaXMgaGVscCB0ZXh0LiIgPDwgZW5kbCA8PAotICAgICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbCA8PAotICAgICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbCA8PAotICAgICJcdHBvcnQgICAgICAgICAgIFRoZSBwb3J0IHRoZSBzZXJ2ZXIgYW5kIGNsaWVudHMgc2hvdWxkIGJpbmQgdG8gZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbCA8PAotICAgICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyIDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsIDw8Ci0gICAgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMgPDwgZW5kbCA8PAotICAgICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkIGZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsOworICB1c2FnZSA8PCBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tcHJvdG9jb2wtdHlwZT08cHJvdG9jb2wtdHlwZT5dIFstLXdvcmtlcnM9PHdvcmtlci1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50cz08Y2xpZW50LWNvdW50Pl0gWy0tbG9vcD08bG9vcC1jb3VudD5dICIKKyAgICAgICAgICAgICAgICAgICAgICAiWy0tY2xpZW50LXR5cGU9PGNsaWVudC10eXBlPl0iIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0Y2xpZW50cyAgICAgICAgTnVtYmVyIG9mIGNsaWVudCB0aHJlYWRzIHRvIGNyZWF0ZSAtIDAgaW1wbGllcyBubyBjbGllbnRzLCBpLmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwKKyAgICAgICAgPDwgIlx0c2VydmVyICAgICAgICAgUnVuIHRoZSBUaHJpZnQgc2VydmVyIGluIHRoaXMgcHJvY2Vzcy4gIERlZmF1bHQgaXMgIiA8PCBydW5TZXJ2ZXIgPDwgZW5kbAorICAgICAgICA8PCAiXHRzZXJ2ZXItdHlwZSAgICBUeXBlIG9mIHNlcnZlciwgXCJzaW1wbGVcIiBvciBcInRocmVhZC1wb29sXCIuICBEZWZhdWx0IGlzICIgPDwgc2VydmVyVHlwZSA8PCBlbmRsCisgICAgICAgIDw8ICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIiA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb2ctcmVxdWVzdCAgICBMb2cgYWxsIHJlcXVlc3QgdG8gLi9yZXF1ZXN0bG9nLnRsb2cuIERlZmF1bHQgaXMgIiA8PCBsb2dSZXF1ZXN0cyA8PCBlbmRsCisgICAgICAgIDw8ICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciB0aHJlYWQtcG9vbCBzZXJ2ZXIgdHlwZS4gIERlZmF1bHQgaXMgIiA8PCB3b3JrZXJDb3VudCA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNsaWVudC10eXBlICAgIFR5cGUgb2YgY2xpZW50LCBcInJlZ3VsYXJcIiBvciBcImNvbmN1cnJlbnRcIi4gIERlZmF1bHQgaXMgIiA8PCBjbGllbnRUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKIAotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gIGFyZ3M7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gYXJnczsKIAogICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgewogCiAgICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7CiAKLSAgICBpZiAoYXJnLmNvbXBhcmUoMCwyLCAiLS0iKSA9PSAwKSB7CisgICAgaWYgKGFyZy5jb21wYXJlKDAsIDIsICItLSIpID09IDApIHsKIAogICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7CiAKQEAgLTI2Myw3ICszMTYsNyBAQAogICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIiArIGFyZyk7CiAgICAgfQogICB9CiAKQEAgLTMxMywxNDUgKzM2NiwxODkgQEAKIAogICAgICAgfSBlbHNlIHsKIAotICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZlciB0eXBlICIrc2VydmVyVHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIiArIHNlcnZlclR5cGUpOwogICAgICAgfQogICAgIH0KKyAgICBpZiAoIWFyZ3NbImNsaWVudC10eXBlIl0uZW1wdHkoKSkgeworICAgICAgY2xpZW50VHlwZSA9IGFyZ3NbImNsaWVudC10eXBlIl07CiAKKyAgICAgIGlmIChjbGllbnRUeXBlID09ICJyZWd1bGFyIikgeworCisgICAgICB9IGVsc2UgaWYgKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7CisKKyAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBjbGllbnQgdHlwZSAiICsgY2xpZW50VHlwZSk7CisgICAgICB9CisgICAgfQogICAgIGlmICghYXJnc1sid29ya2VycyJdLmVtcHR5KCkpIHsKICAgICAgIHdvcmtlckNvdW50ID0gYXRvaShhcmdzWyJ3b3JrZXJzIl0uY19zdHIoKSk7CiAgICAgfQogCi0gIH0gY2F0Y2goc3RkOjpleGNlcHRpb24mIGUpIHsKKyAgfSBjYXRjaCAoc3RkOjpleGNlcHRpb24mIGUpIHsKICAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY2VyciA8PCB1c2FnZTsKKyAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2ZXI+IHNlcnZpY2VIYW5kbGVyKG5ldyBTZXJ2ZXIoKSk7CiAKICAgaWYgKHJlcGxheVJlcXVlc3RzKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CiAKICAgICAvLyBUcmFuc3BvcnRzCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogICAgIGZpbGVUcmFuc3BvcnQtPnNlZWtUb0VuZCgpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCi0gICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVRyYW5zcG9ydCk7CisgICAgVEZpbGVQcm9jZXNzb3IgZmlsZVByb2Nlc3NvcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIGZpbGVUcmFuc3BvcnQpOwogCiAgICAgZmlsZVByb2Nlc3Nvci5wcm9jZXNzKDAsIHRydWUpOwogICAgIGV4aXQoMCk7CiAgIH0KIAotCiAgIGlmIChydW5TZXJ2ZXIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKIAogICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkobmV3IFRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOwogCiAgICAgLy8gUHJvdG9jb2wgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOwogCiAgICAgaWYgKGxvZ1JlcXVlc3RzKSB7CiAgICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogCi0gICAgICB0cmFuc3BvcnRGYWN0b3J5ID0KLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICAgIHRyYW5zcG9ydEZhY3RvcnkKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPiBzZXJ2ZXI7CiAKICAgICBpZiAoc2VydmVyVHlwZSA9PSAic2ltcGxlIikgewogCi0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFRTaW1wbGVTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKSk7CisgICAgICBzZXJ2ZXIucmVzZXQoCisgICAgICAgICAgbmV3IFRTaW1wbGVTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkZWQiKSB7CiAKLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVFRocmVhZGVkU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSkpOworICAgICAgc2VydmVyLnJlc2V0KAorICAgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIoc2VydmljZVByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKIAogICAgIH0gZWxzZSBpZiAoc2VydmVyVHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKIAogICAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0gICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFRUaHJlYWRQb29sU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgc2VydmVyLnJlc2V0KG5ldyBUVGhyZWFkUG9vbFNlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICAgIH0KIAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUU3RhcnRPYnNlcnZlcj4gb2JzZXJ2ZXIobmV3IFRTdGFydE9ic2VydmVyKTsKKyAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihvYnNlcnZlcik7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHNlcnZlcik7CisKICAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8IGVuZGw7CiAKICAgICBzZXJ2ZXJUaHJlYWQtPnN0YXJ0KCk7CisgICAgb2JzZXJ2ZXItPndhaXRGb3JTZXJ2aWNlKCk7CiAKICAgICAvLyBJZiB3ZSBhcmVuJ3QgcnVubmluZyBjbGllbnRzLCBqdXN0IHdhaXQgZm9yZXZlciBmb3IgZXh0ZXJuYWwgY2xpZW50cwotCiAgICAgaWYgKGNsaWVudENvdW50ID09IDApIHsKICAgICAgIHNlcnZlclRocmVhZC0+am9pbigpOwogICAgIH0KICAgfQogCi0gIGlmIChjbGllbnRDb3VudCA+IDApIHsKKyAgaWYgKGNsaWVudENvdW50ID4gMCkgeyAvL0ZJWE1FOiBzdGFydCBoZXJlIGZvciBjbGllbnQgdHlwZT8KIAogICAgIE1vbml0b3IgbW9uaXRvcjsKIAogICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7CiAKLSAgICBzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CisgICAgc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKIAotICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7IGxvb3BUeXBlID0gVF9WT0lEO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7IGxvb3BUeXBlID0gVF9CWVRFO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsgbG9vcFR5cGUgPSBUX0kzMjt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7IGxvb3BUeXBlID0gVF9JNjQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeyBsb29wVHlwZSA9IFRfU1RSSU5HO30KLSAgICBlbHNlIHt0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiK2NhbGxOYW1lKTt9Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKLQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKLQotICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4obmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKKyAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeworICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7CisgICAgICBsb29wVHlwZSA9IFRfQllURTsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeworICAgICAgbG9vcFR5cGUgPSBUX0kzMjsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeworICAgICAgbG9vcFR5cGUgPSBUX0k2NDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeworICAgICAgbG9vcFR5cGUgPSBUX1NUUklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIiArIGNhbGxOYW1lKTsKICAgICB9CiAKLSAgICBmb3IgKHN0ZDo6c2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKKyAgICBpZihjbGllbnRUeXBlID09ICJyZWd1bGFyIikgeworICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOworICAgICAgLy9zdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDb25jdXJyZW50Q2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ29uY3VycmVudENsaWVudChwcm90b2NvbCkpOworICAgICAgc29ja2V0LT5vcGVuKCk7CisgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpKSkpOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgdGhyZWFkICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICB0aHJlYWQrKykgewogICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZTAwOwogICAgIGludDY0X3QgdGltZTAxOwogCi0gICAge1N5bmNocm9uaXplZCBzKG1vbml0b3IpOworICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKG1vbml0b3IpOwogICAgICAgdGhyZWFkQ291bnQgPSBjbGllbnRDb3VudDsKIAotICAgICAgY2VyciA8PCAiTGF1bmNoICI8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOworICAgICAgY2VyciA8PCAiTGF1bmNoICIgPDwgY2xpZW50Q291bnQgPDwgIiAiIDw8IGNsaWVudFR5cGUgPDwgIiBjbGllbnQgdGhyZWFkcyIgPDwgZW5kbDsKIAotICAgICAgdGltZTAwID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICB0aW1lMDAgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogCiAgICAgICBtb25pdG9yLm5vdGlmeUFsbCgpOwogCi0gICAgICB3aGlsZSh0aHJlYWRDb3VudCA+IDApIHsKKyAgICAgIHdoaWxlICh0aHJlYWRDb3VudCA+IDApIHsKICAgICAgICAgbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIHRpbWUwMSA9ICBVdGlsOjpjdXJyZW50VGltZSgpOworICAgICAgdGltZTAxID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKICAgICB9CiAKICAgICBpbnQ2NF90IGZpcnN0VGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKQEAgLTQ2MSw5ICs1NTgsMTIgQEAKICAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CiAgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKIAotICAgIGZvciAoc2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7IGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7IGl4KyspIHsKKyAgICBmb3IgKHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICAgICAgIGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CisgICAgICAgICBpeCsrKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50ID0gZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKKyAgICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CiAKICAgICAgIGludDY0X3QgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOwogCkBAIC00ODUsMTMgKzU4NSwxMyBAQAogICAgICAgICBtYXhUaW1lID0gZGVsdGE7CiAgICAgICB9CiAKLSAgICAgIGF2ZXJhZ2VUaW1lKz0gZGVsdGE7CisgICAgICBhdmVyYWdlVGltZSArPSBkZWx0YTsKICAgICB9CiAKICAgICBhdmVyYWdlVGltZSAvPSBjbGllbnRDb3VudDsKIAotCi0gICAgY291dCA8PCAgIndvcmtlcnMgOiIgPDwgd29ya2VyQ291bnQgPDwgIiwgY2xpZW50IDogIiA8PCBjbGllbnRDb3VudCA8PCAiLCBsb29wcyA6ICIgPDwgbG9vcENvdW50IDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7CisgICAgY291dCA8PCAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQKKyAgICAgICAgIDw8ICIsIHJhdGUgOiAiIDw8IChjbGllbnRDb3VudCAqIGxvb3BDb3VudCAqIDEwMDApIC8gKChkb3VibGUpKHRpbWUwMSAtIHRpbWUwMCkpIDw8IGVuZGw7CiAKICAgICBjb3VudF9tYXAgY291bnQgPSBzZXJ2aWNlSGFuZGxlci0+Z2V0Q291bnQoKTsKICAgICBjb3VudF9tYXA6Oml0ZXJhdG9yIGl0ZXI7CmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmluZGV4IGMyMzBjODQuLjFkM2VkNzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCkBAIC0yOSwyMyArMjksMjMgQEAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CiAKICNpbmNsdWRlICJTZXJ2aWNlLmgiCiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxtYXA+CisjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwogCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwpAQCAtNTYsMjMgKzU2LDE4IEBACiB1c2luZyBuYW1lc3BhY2UgdGVzdDo6c3RyZXNzOwogCiBzdHJ1Y3QgZXFzdHIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7Ci0gIH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPT0gMDsgfQogfTsKIAogc3RydWN0IGx0c3RyIHsKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoczEsIHMyKSA8IDA7Ci0gIH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHMxLCBjb25zdCBjaGFyKiBzMikgY29uc3QgeyByZXR1cm4gc3RyY21wKHMxLCBzMikgPCAwOyB9CiB9OwogCi0KIC8vIHR5cGVkZWYgaGFzaF9tYXA8Y29uc3QgY2hhciosIGludCwgaGFzaDxjb25zdCBjaGFyKj4sIGVxc3RyPiBjb3VudF9tYXA7CiB0eXBlZGVmIG1hcDxjb25zdCBjaGFyKiwgaW50LCBsdHN0cj4gY291bnRfbWFwOwogCiBjbGFzcyBTZXJ2ZXIgOiBwdWJsaWMgU2VydmljZUlmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFNlcnZlcigpIHt9CiAKICAgdm9pZCBjb3VudChjb25zdCBjaGFyKiBtZXRob2QpIHsKQEAgLTg0LDcgKzc5LDcgQEAKICAgdm9pZCBlY2hvVm9pZCgpIHsKICAgICBjb3VudCgiZWNob1ZvaWQiKTsKICAgICAvLyBTbGVlcCB0byBzaW11bGF0ZSB3b3JrCi0gICAgdXNsZWVwKDUwMDApOworICAgIFRIUklGVF9TTEVFUF9VU0VDKDEpOwogICAgIHJldHVybjsKICAgfQogCkBAIC05Myw1OCArODgsNzMgQEAKICAgICByZXR1cm4gY291bnRzXzsKICAgfQogCi0gIGludDhfdCBlY2hvQnl0ZShjb25zdCBpbnQ4X3QgYXJnKSB7cmV0dXJuIGFyZzt9Ci0gIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykge3JldHVybiBhcmc7fQotICBpbnQ2NF90IGVjaG9JNjQoY29uc3QgaW50NjRfdCBhcmcpIHtyZXR1cm4gYXJnO30KLSAgdm9pZCBlY2hvU3RyaW5nKHN0cmluZyYgb3V0LCBjb25zdCBzdHJpbmcgJmFyZykgeworICBpbnQ4X3QgZWNob0J5dGUoY29uc3QgaW50OF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDMyX3QgZWNob0kzMihjb25zdCBpbnQzMl90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIGludDY0X3QgZWNob0k2NChjb25zdCBpbnQ2NF90IGFyZykgeyByZXR1cm4gYXJnOyB9CisgIHZvaWQgZWNob1N0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nJiBhcmcpIHsKICAgICBpZiAoYXJnICE9ICJoZWxsbyIpIHsKICAgICAgIFRfRVJST1JfQUJPUlQoIldST05HIFNUUklORyAoJXMpISEhISIsIGFyZy5jX3N0cigpKTsKICAgICB9CiAgICAgb3V0ID0gYXJnOwogICB9Ci0gIHZvaWQgZWNob0xpc3QodmVjdG9yPGludDhfdD4gJm91dCwgY29uc3QgdmVjdG9yPGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KLSAgdm9pZCBlY2hvU2V0KHNldDxpbnQ4X3Q+ICZvdXQsIGNvbnN0IHNldDxpbnQ4X3Q+ICZhcmcpIHsgb3V0ID0gYXJnOyB9Ci0gIHZvaWQgZWNob01hcChtYXA8aW50OF90LCBpbnQ4X3Q+ICZvdXQsIGNvbnN0IG1hcDxpbnQ4X3QsIGludDhfdD4gJmFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTGlzdCh2ZWN0b3I8aW50OF90PiYgb3V0LCBjb25zdCB2ZWN0b3I8aW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQorICB2b2lkIGVjaG9TZXQoc2V0PGludDhfdD4mIG91dCwgY29uc3Qgc2V0PGludDhfdD4mIGFyZykgeyBvdXQgPSBhcmc7IH0KKyAgdm9pZCBlY2hvTWFwKG1hcDxpbnQ4X3QsIGludDhfdD4mIG91dCwgY29uc3QgbWFwPGludDhfdCwgaW50OF90PiYgYXJnKSB7IG91dCA9IGFyZzsgfQogCiBwcml2YXRlOgogICBjb3VudF9tYXAgY291bnRzXzsKICAgTXV0ZXggbG9ja187Ci0KIH07CiAKLWNsYXNzIENsaWVudFRocmVhZDogcHVibGljIFJ1bm5hYmxlIHsKK2NsYXNzIENsaWVudFRocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CiBwdWJsaWM6Ci0KLSAgQ2xpZW50VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+dHJhbnNwb3J0LCBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBjbGllbnQsIE1vbml0b3ImIG1vbml0b3IsIHNpemVfdCYgd29ya2VyQ291bnQsIHNpemVfdCBsb29wQ291bnQsIFRUeXBlIGxvb3BUeXBlKSA6Ci0gICAgX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAotICAgIF9jbGllbnQoY2xpZW50KSwKLSAgICBfbW9uaXRvcihtb25pdG9yKSwKLSAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAotICAgIF9sb29wQ291bnQobG9vcENvdW50KSwKLSAgICBfbG9vcFR5cGUobG9vcFR5cGUpCi0gIHt9CisgIENsaWVudFRocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgICAgIE1vbml0b3ImIG1vbml0b3IsCisgICAgICAgICAgICAgICBzaXplX3QmIHdvcmtlckNvdW50LAorICAgICAgICAgICAgICAgc2l6ZV90IGxvb3BDb3VudCwKKyAgICAgICAgICAgICAgIFRUeXBlIGxvb3BUeXBlKQorICAgIDogX3RyYW5zcG9ydCh0cmFuc3BvcnQpLAorICAgICAgX2NsaWVudChjbGllbnQpLAorICAgICAgX21vbml0b3IobW9uaXRvciksCisgICAgICBfd29ya2VyQ291bnQod29ya2VyQ291bnQpLAorICAgICAgX2xvb3BDb3VudChsb29wQ291bnQpLAorICAgICAgX2xvb3BUeXBlKGxvb3BUeXBlKSB7fQogCiAgIHZvaWQgcnVuKCkgewogCiAgICAgLy8gV2FpdCBmb3IgYWxsIHdvcmtlciB0aHJlYWRzIHRvIHN0YXJ0CiAKLSAgICB7U3luY2hyb25pemVkIHMoX21vbml0b3IpOwotICAgICAgICB3aGlsZShfd29ya2VyQ291bnQgPT0gMCkgewotICAgICAgICAgIF9tb25pdG9yLndhaXQoKTsKLSAgICAgICAgfQorICAgIHsKKyAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKyAgICAgIHdoaWxlIChfd29ya2VyQ291bnQgPT0gMCkgeworICAgICAgICBfbW9uaXRvci53YWl0KCk7CisgICAgICB9CiAgICAgfQogCiAgICAgX3N0YXJ0VGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgICBfdHJhbnNwb3J0LT5vcGVuKCk7CiAKLSAgICBzd2l0Y2goX2xvb3BUeXBlKSB7Ci0gICAgY2FzZSBUX1ZPSUQ6IGxvb3BFY2hvVm9pZCgpOyBicmVhazsKLSAgICBjYXNlIFRfQllURTogbG9vcEVjaG9CeXRlKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JMzI6IGxvb3BFY2hvSTMyKCk7IGJyZWFrOwotICAgIGNhc2UgVF9JNjQ6IGxvb3BFY2hvSTY0KCk7IGJyZWFrOwotICAgIGNhc2UgVF9TVFJJTkc6IGxvb3BFY2hvU3RyaW5nKCk7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGNlcnIgPDwgIlVuZXhwZWN0ZWQgbG9vcCB0eXBlIiA8PCBfbG9vcFR5cGUgPDwgZW5kbDsgYnJlYWs7CisgICAgc3dpdGNoIChfbG9vcFR5cGUpIHsKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIGxvb3BFY2hvVm9pZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0JZVEU6CisgICAgICBsb29wRWNob0J5dGUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVF9JMzI6CisgICAgICBsb29wRWNob0kzMigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUX0k2NDoKKyAgICAgIGxvb3BFY2hvSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRfU1RSSU5HOgorICAgICAgbG9vcEVjaG9TdHJpbmcoKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBjZXJyIDw8ICJVbmV4cGVjdGVkIGxvb3AgdHlwZSIgPDwgX2xvb3BUeXBlIDw8IGVuZGw7CisgICAgICBicmVhazsKICAgICB9CiAKICAgICBfZW5kVGltZSA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CkBAIC0xNTMsNyArMTYzLDggQEAKIAogICAgIF9kb25lID0gdHJ1ZTsKIAotICAgIHtTeW5jaHJvbml6ZWQgcyhfbW9uaXRvcik7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOwogCiAgICAgICBfd29ya2VyQ291bnQtLTsKIApAQCAtMTc0LDcgKzE4NSw4IEBACiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IF9sb29wQ291bnQ7IGl4KyspIHsKICAgICAgIGludDhfdCBhcmcgPSAxOwogICAgICAgaW50OF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0J5dGUoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9CeXRlKGFyZyk7CisgICAgICAodm9pZClyZXN1bHQ7CiAgICAgICBhc3NlcnQocmVzdWx0ID09IGFyZyk7CiAgICAgfQogICB9CkBAIC0xODMsNyArMTk1LDggQEAKICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgX2xvb3BDb3VudDsgaXgrKykgewogICAgICAgaW50MzJfdCBhcmcgPSAxOwogICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICByZXN1bHQgPV9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgIHJlc3VsdCA9IF9jbGllbnQtPmVjaG9JMzIoYXJnKTsKKyAgICAgICh2b2lkKXJlc3VsdDsKICAgICAgIGFzc2VydChyZXN1bHQgPT0gYXJnKTsKICAgICB9CiAgIH0KQEAgLTE5Miw3ICsyMDUsOCBAQAogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBfbG9vcENvdW50OyBpeCsrKSB7CiAgICAgICBpbnQ2NF90IGFyZyA9IDE7CiAgICAgICBpbnQ2NF90IHJlc3VsdDsKLSAgICAgIHJlc3VsdCA9X2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgcmVzdWx0ID0gX2NsaWVudC0+ZWNob0k2NChhcmcpOworICAgICAgKHZvaWQpcmVzdWx0OwogICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBhcmcpOwogICAgIH0KICAgfQpAQCAtMjA2LDggKzIyMCw4IEBACiAgICAgfQogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OwogICBNb25pdG9yJiBfbW9uaXRvcjsKICAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CiAgIHNpemVfdCBfbG9vcENvdW50OwpAQCAtMjE4LDE2ICsyMzIsMTggQEAKICAgTW9uaXRvciBfc2xlZXA7CiB9OwogCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAKICAgaW50IHBvcnQgPSA5MDkxOwogICBzdHJpbmcgc2VydmVyVHlwZSA9ICJzaW1wbGUiOwogICBzdHJpbmcgcHJvdG9jb2xUeXBlID0gImJpbmFyeSI7Ci0gIHNpemVfdCB3b3JrZXJDb3VudCA9IDQ7Ci0gIHNpemVfdCBjbGllbnRDb3VudCA9IDIwOwotICBzaXplX3QgbG9vcENvdW50ID0gNTAwMDA7Ci0gIFRUeXBlIGxvb3BUeXBlICA9IFRfVk9JRDsKKyAgdWludDMyX3Qgd29ya2VyQ291bnQgPSA0OworICB1aW50MzJfdCBjbGllbnRDb3VudCA9IDIwOworICB1aW50MzJfdCBsb29wQ291bnQgPSAxMDAwOworICBUVHlwZSBsb29wVHlwZSA9IFRfVk9JRDsKICAgc3RyaW5nIGNhbGxOYW1lID0gImVjaG9Wb2lkIjsKICAgYm9vbCBydW5TZXJ2ZXIgPSB0cnVlOwogICBib29sIGxvZ1JlcXVlc3RzID0gZmFsc2U7CkBAIC0yMzYsMjggKzI1MiwzNCBAQAogCiAgIG9zdHJpbmdzdHJlYW0gdXNhZ2U7CiAKLSAgdXNhZ2UgPDwKLSAgICBhcmd2WzBdIDw8ICIgWy0tcG9ydD08cG9ydCBudW1iZXI+XSBbLS1zZXJ2ZXJdIFstLXNlcnZlci10eXBlPTxzZXJ2ZXItdHlwZT5dIFstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSBbLS1jbGllbnRzPTxjbGllbnQtY291bnQ+XSBbLS1sb29wPTxsb29wLWNvdW50Pl0iIDw8IGVuZGwgPDwKLSAgICAiXHRjbGllbnRzICAgICAgICBOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gc2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbCA8PAotICAgICJcdGhlbHAgICAgICAgICAgIFByaW50cyB0aGlzIGhlbHAgdGV4dC4iIDw8IGVuZGwgPDwKLSAgICAiXHRjYWxsICAgICAgICAgICBTZXJ2aWNlIG1ldGhvZCB0byBjYWxsLiAgRGVmYXVsdCBpcyAiIDw8IGNhbGxOYW1lIDw8IGVuZGwgPDwKLSAgICAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwgPDwKLSAgICAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvIGZvciB0aHJpZnQgbmV0d29yayBjb25uZWN0aW9ucy4gIERlZmF1bHQgaXMgIiA8PCBwb3J0IDw8IGVuZGwgPDwKLSAgICAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsIDw8Ci0gICAgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHNlcnZlclR5cGUgPDwgZW5kbCA8PAotICAgICJcdHByb3RvY29sLXR5cGUgIFR5cGUgb2YgcHJvdG9jb2wsIFwiYmluYXJ5XCIsIFwiYXNjaWlcIiwgb3IgXCJ4bWxcIi4gIERlZmF1bHQgaXMgIiA8PCBwcm90b2NvbFR5cGUgPDwgZW5kbCA8PAotICAgICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwgPDwKLSAgICAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIiA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsIDw8Ci0gICAgIlx0d29ya2VycyAgICAgICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiAgT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQgPDwgZW5kbDsKKyAgdXNhZ2UgPDwgYXJndlswXSA8PCAiIFstLXBvcnQ9PHBvcnQgbnVtYmVyPl0gWy0tc2VydmVyXSBbLS1zZXJ2ZXItdHlwZT08c2VydmVyLXR5cGU+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLXByb3RvY29sLXR5cGU9PHByb3RvY29sLXR5cGU+XSBbLS13b3JrZXJzPTx3b3JrZXItY291bnQ+XSAiCisgICAgICAgICAgICAgICAgICAgICAgIlstLWNsaWVudHM9PGNsaWVudC1jb3VudD5dIFstLWxvb3A9PGxvb3AtY291bnQ+XSIgPDwgZW5kbAorICAgICAgICA8PCAiXHRjbGllbnRzICAgICAgICBOdW1iZXIgb2YgY2xpZW50IHRocmVhZHMgdG8gY3JlYXRlIC0gMCBpbXBsaWVzIG5vIGNsaWVudHMsIGkuZS4gIgorICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAorICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCisgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAorICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgbG9vcENvdW50IDw8IGVuZGwgPDwgIlx0cG9ydCAgICAgICAgICAgVGhlIHBvcnQgdGhlIHNlcnZlciBhbmQgY2xpZW50cyBzaG91bGQgYmluZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyaWZ0IG5ldHdvcmsgY29ubmVjdGlvbnMuICBEZWZhdWx0IGlzICIgPDwgcG9ydCA8PCBlbmRsCisgICAgICAgIDw8ICJcdHNlcnZlciAgICAgICAgIFJ1biB0aGUgVGhyaWZ0IHNlcnZlciBpbiB0aGlzIHByb2Nlc3MuICBEZWZhdWx0IGlzICIgPDwgcnVuU2VydmVyCisgICAgICAgIDw8IGVuZGwgPDwgIlx0c2VydmVyLXR5cGUgICAgVHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIgb3IgXCJ0aHJlYWQtcG9vbFwiLiAgRGVmYXVsdCBpcyAiCisgICAgICAgIDw8IHNlcnZlclR5cGUgPDwgZW5kbAorICAgICAgICA8PCAiXHRwcm90b2NvbC10eXBlICBUeXBlIG9mIHByb3RvY29sLCBcImJpbmFyeVwiLCBcImFzY2lpXCIsIG9yIFwieG1sXCIuICBEZWZhdWx0IGlzICIKKyAgICAgICAgPDwgcHJvdG9jb2xUeXBlIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0bG9nLXJlcXVlc3QgICAgTG9nIGFsbCByZXF1ZXN0IHRvIC4vcmVxdWVzdGxvZy50bG9nLiBEZWZhdWx0IGlzICIgPDwgbG9nUmVxdWVzdHMKKyAgICAgICAgPDwgZW5kbCA8PCAiXHRyZXBsYXktcmVxdWVzdCBSZXBsYXkgcmVxdWVzdHMgZnJvbSBsb2cgZmlsZSAoLi9yZXF1ZXN0bG9nLnRsb2cpIERlZmF1bHQgaXMgIgorICAgICAgICA8PCByZXBsYXlSZXF1ZXN0cyA8PCBlbmRsIDw8ICJcdHdvcmtlcnMgICAgICAgIE51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gIE9ubHkgdmFsaWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUuICBEZWZhdWx0IGlzICIgPDwgd29ya2VyQ291bnQKKyAgICAgICAgPDwgZW5kbDsKIAotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gIGFyZ3M7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gYXJnczsKIAogICBmb3IgKGludCBpeCA9IDE7IGl4IDwgYXJnYzsgaXgrKykgewogCiAgICAgc3RyaW5nIGFyZyhhcmd2W2l4XSk7CiAKLSAgICBpZiAoYXJnLmNvbXBhcmUoMCwyLCAiLS0iKSA9PSAwKSB7CisgICAgaWYgKGFyZy5jb21wYXJlKDAsIDIsICItLSIpID09IDApIHsKIAogICAgICAgc2l6ZV90IGVuZCA9IGFyZy5maW5kX2ZpcnN0X29mKCI9IiwgMik7CiAKQEAgLTI2OSw3ICsyOTEsNyBAQAogICAgICAgICBhcmdzW2tleV0gPSAidHJ1ZSI7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVuZXhjZXB0ZWQgY29tbWFuZCBsaW5lIHRva2VuOiAiK2FyZyk7CisgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmV4Y2VwdGVkIGNvbW1hbmQgbGluZSB0b2tlbjogIiArIGFyZyk7CiAgICAgfQogICB9CiAKQEAgLTMxNiw3NCArMzM4LDgzIEBACiAgICAgICB3b3JrZXJDb3VudCA9IGF0b2koYXJnc1sid29ya2VycyJdLmNfc3RyKCkpOwogICAgIH0KIAotICB9IGNhdGNoKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CiAgICAgY2VyciA8PCBlLndoYXQoKSA8PCBlbmRsOwotICAgIGNlcnIgPDwgdXNhZ2U7CisgICAgY2VyciA8PCB1c2FnZS5zdHIoKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSA9IGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogCiAgIC8vIERpc3BhdGNoZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwogCiAgIGlmIChyZXBsYXlSZXF1ZXN0cykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0cwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAotICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUcmFuc3BvcnQpOworICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKIAogICAgIGZpbGVQcm9jZXNzb3IucHJvY2VzcygwLCB0cnVlKTsKICAgICBleGl0KDApOwogICB9CiAKLQogICBpZiAocnVuU2VydmVyKSB7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+ICAgICAgdHJhbnNwb3J0RmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CiAKICAgICBpZiAobG9nUmVxdWVzdHMpIHsKICAgICAgIC8vIGluaXRpYWxpemUgdGhlIGxvZyBmaWxlCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldENodW5rU2l6ZSgyICogMTAyNCAqIDEwMjQpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0TWF4RXZlbnRTaXplKDEwMjQgKiAxNik7CiAKLSAgICAgIHRyYW5zcG9ydEZhY3RvcnkgPQotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOworICAgICAgdHJhbnNwb3J0RmFjdG9yeQorICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CiAgICAgfQogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQyOworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gbmJTb2NrZXQxOworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gbmJTb2NrZXQyOwogCiAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKIAotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0KSkpOwotICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCsxKSkpOworICAgICAgbmJTb2NrZXQxLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDEpKSk7CisgICAgICBuYlNvY2tldDIucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQgKyAxKSk7CisgICAgICBzZXJ2ZXJUaHJlYWQyID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQyKSkpOwogCiAgICAgfSBlbHNlIGlmIChzZXJ2ZXJUeXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIKKyAgICAgICAgICA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2VyQ291bnQpOwogCiAgICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwogICAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKLSAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPihuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCwgdGhyZWFkTWFuYWdlcikpKTsKLSAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlcj4obmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIHBvcnQrMSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIG5iU29ja2V0MS5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyPigKKyAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQxLCB0aHJlYWRNYW5hZ2VyKSkpOworICAgICAgbmJTb2NrZXQyLnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0ICsgMSkpOworICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MiwgdGhyZWFkTWFuYWdlcikpKTsKICAgICB9CiAKICAgICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiA8PCBwb3J0IDw8ICIgYW5kICIgPDwgKHBvcnQgKyAxKSA8PCBlbmRsOwpAQCAtMzk3LDcgKzQyOCw3IEBACiAgICAgICBzZXJ2ZXJUaHJlYWQyLT5qb2luKCk7CiAgICAgfQogICB9Ci0gIHNsZWVwKDEpOworICBUSFJJRlRfU0xFRVBfU0VDKDEpOwogCiAgIGlmIChjbGllbnRDb3VudCA+IDApIHsKIApAQCAtNDA1LDQ2ICs0MzYsNTcgQEAKIAogICAgIHNpemVfdCB0aHJlYWRDb3VudCA9IDA7CiAKLSAgICBzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CisgICAgc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKIAotICAgIGlmIChjYWxsTmFtZSA9PSAiZWNob1ZvaWQiKSB7IGxvb3BUeXBlID0gVF9WT0lEO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7IGxvb3BUeXBlID0gVF9CWVRFO30KLSAgICBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0kzMiIpIHsgbG9vcFR5cGUgPSBUX0kzMjt9Ci0gICAgZWxzZSBpZiAoY2FsbE5hbWUgPT0gImVjaG9JNjQiKSB7IGxvb3BUeXBlID0gVF9JNjQ7fQotICAgIGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeyBsb29wVHlwZSA9IFRfU1RSSU5HO30KLSAgICBlbHNlIHt0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHNlcnZpY2UgY2FsbCAiK2NhbGxOYW1lKTt9Ci0KLSAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKLQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0ICsgKGl4ICUgMikpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IGZyYW1lZFNvY2tldChuZXcgVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChmcmFtZWRTb2NrZXQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKLQotICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4obmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKKyAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgeworICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CisgICAgfSBlbHNlIGlmIChjYWxsTmFtZSA9PSAiZWNob0J5dGUiKSB7CisgICAgICBsb29wVHlwZSA9IFRfQllURTsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTMyIikgeworICAgICAgbG9vcFR5cGUgPSBUX0kzMjsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvSTY0IikgeworICAgICAgbG9vcFR5cGUgPSBUX0k2NDsKKyAgICB9IGVsc2UgaWYgKGNhbGxOYW1lID09ICJlY2hvU3RyaW5nIikgeworICAgICAgbG9vcFR5cGUgPSBUX1NUUklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2aWNlIGNhbGwgIiArIGNhbGxOYW1lKTsKICAgICB9CiAKLSAgICBmb3IgKHN0ZDo6c2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOyB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgdGhyZWFkKyspIHsKKyAgICBmb3IgKHVpbnQzMl90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgeworCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0ICsgKGl4ICUgMikpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKKworICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAorICAgICAgICAgIG5ldyBDbGllbnRUaHJlYWQoc29ja2V0LCBzZXJ2aWNlQ2xpZW50LCBtb25pdG9yLCB0aHJlYWRDb3VudCwgbG9vcENvdW50LCBsb29wVHlwZSkpKSk7CisgICAgfQorCisgICAgZm9yIChzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgICAgICB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIHRocmVhZCsrKSB7CiAgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7CiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lMDA7CiAgICAgaW50NjRfdCB0aW1lMDE7CiAKLSAgICB7U3luY2hyb25pemVkIHMobW9uaXRvcik7CisgICAgeworICAgICAgU3luY2hyb25pemVkIHMobW9uaXRvcik7CiAgICAgICB0aHJlYWRDb3VudCA9IGNsaWVudENvdW50OwogCi0gICAgICBjZXJyIDw8ICJMYXVuY2ggIjw8IGNsaWVudENvdW50IDw8ICIgY2xpZW50IHRocmVhZHMiIDw8IGVuZGw7CisgICAgICBjZXJyIDw8ICJMYXVuY2ggIiA8PCBjbGllbnRDb3VudCA8PCAiIGNsaWVudCB0aHJlYWRzIiA8PCBlbmRsOwogCi0gICAgICB0aW1lMDAgPSAgVXRpbDo6Y3VycmVudFRpbWUoKTsKKyAgICAgIHRpbWUwMCA9IFV0aWw6OmN1cnJlbnRUaW1lKCk7CiAKICAgICAgIG1vbml0b3Iubm90aWZ5QWxsKCk7CiAKLSAgICAgIHdoaWxlKHRocmVhZENvdW50ID4gMCkgeworICAgICAgd2hpbGUgKHRocmVhZENvdW50ID4gMCkgewogICAgICAgICBtb25pdG9yLndhaXQoKTsKICAgICAgIH0KIAotICAgICAgdGltZTAxID0gIFV0aWw6OmN1cnJlbnRUaW1lKCk7CisgICAgICB0aW1lMDEgPSBVdGlsOjpjdXJyZW50VGltZSgpOwogICAgIH0KIAogICAgIGludDY0X3QgZmlyc3RUaW1lID0gOTIyMzM3MjAzNjg1NDc3NTgwN0xMOwpAQCAtNDU0LDkgKzQ5NiwxMiBAQAogICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwogCi0gICAgZm9yIChzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsgaXgrKykgeworICAgIGZvciAoc2V0PHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID46Oml0ZXJhdG9yIGl4ID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgICAgICAgaXggIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKKyAgICAgICAgIGl4KyspIHsKIAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQgPSBkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAorICAgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxDbGllbnRUaHJlYWQ+KCgqaXgpLT5ydW5uYWJsZSgpKTsKIAogICAgICAgaW50NjRfdCBkZWx0YSA9IGNsaWVudC0+X2VuZFRpbWUgLSBjbGllbnQtPl9zdGFydFRpbWU7CiAKQEAgLTQ3OCwxMyArNTIzLDEzIEBACiAgICAgICAgIG1heFRpbWUgPSBkZWx0YTsKICAgICAgIH0KIAotICAgICAgYXZlcmFnZVRpbWUrPSBkZWx0YTsKKyAgICAgIGF2ZXJhZ2VUaW1lICs9IGRlbHRhOwogICAgIH0KIAogICAgIGF2ZXJhZ2VUaW1lIC89IGNsaWVudENvdW50OwogCi0KLSAgICBjb3V0IDw8ICAid29ya2VycyA6IiA8PCB3b3JrZXJDb3VudCA8PCAiLCBjbGllbnQgOiAiIDw8IGNsaWVudENvdW50IDw8ICIsIGxvb3BzIDogIiA8PCBsb29wQ291bnQgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJ3b3JrZXJzIDoiIDw8IHdvcmtlckNvdW50IDw8ICIsIGNsaWVudCA6ICIgPDwgY2xpZW50Q291bnQgPDwgIiwgbG9vcHMgOiAiIDw8IGxvb3BDb3VudAorICAgICAgICAgPDwgIiwgcmF0ZSA6ICIgPDwgKGNsaWVudENvdW50ICogbG9vcENvdW50ICogMTAwMCkgLyAoKGRvdWJsZSkodGltZTAxIC0gdGltZTAwKSkgPDwgZW5kbDsKIAogICAgIGNvdW50X21hcCBjb3VudCA9IHNlcnZpY2VIYW5kbGVyLT5nZXRDb3VudCgpOwogICAgIGNvdW50X21hcDo6aXRlcmF0b3IgaXRlcjsKZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcAppbmRleCBmYmYwNGYwLi44OWYzZmQxIDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLyoKK++7vy8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQogICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE3LDIyNiArMTcsMzU1IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxsb2NhbGU+CisjaW5jbHVkZSA8aW9zPgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4gLy8gPGV2ZW50Lmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgotI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgorI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKIAorI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvcmFuZG9tL3JhbmRvbV9kZXZpY2UuaHBwPgorI2lmIF9XSU4zMgorI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIHRocmlmdDo6dGVzdDsKLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7Ci0KLS8vZXh0ZXJuIHVpbnQzMl90IGdfc29ja2V0X3N5c2NhbGxzOwogCiAvLyBDdXJyZW50IHRpbWUsIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gKLXVpbnQ2NF90IG5vdygpCi17Cit1aW50NjRfdCBub3coKSB7CiAgIGludDY0X3QgcmV0OwogICBzdHJ1Y3QgdGltZXZhbCB0djsKIAotICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmdHYsIE5VTEwpOwogICByZXQgPSB0di50dl9zZWM7Ci0gIHJldCA9IHJldCoxMDAwKjEwMDAgKyB0di50dl91c2VjOworICByZXQgPSByZXQgKiAxMDAwICogMTAwMCArIHR2LnR2X3VzZWM7CiAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuKGNvbnN0IGNoYXIqIGhvc3QsIGludCBwb3J0LCBldmVudF9iYXNlICpiYXNlLCBUUHJvdG9jb2xGYWN0b3J5KiBwcm90b2NvbEZhY3RvcnksIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgewotICAodm9pZCkgaG9zdDsKLSAgKHZvaWQpIHBvcnQ7Ci0gICh2b2lkKSBwcm90b2NvbEZhY3Rvcnk7CitzdGF0aWMgdm9pZCB0ZXN0U3RyaW5nX2NsaWVudFJldHVybihldmVudF9iYXNlKiBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRlc3ROciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3RDb2JDbGllbnQqIGNsaWVudCkgewogICB0cnkgewogICAgIHN0cmluZyBzOwogICAgIGNsaWVudC0+cmVjdl90ZXN0U3RyaW5nKHMpOwotICAgIGNvdXQgPDwgInRlc3RTdHJpbmc6ICIgPDwgcyA8PCBlbmRsOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICBvcyA8PCAidGVzdCIgPDwgdGVzdE5yOworICAgIGNvbnN0IGJvb2wgb2sgPSAocyA9PSBvcy5zdHIoKSk7CisgICAgY291dCA8PCAidGVzdFN0cmluZzogIiA8PCBzIDw8ICIgIiA8PCAoKG9rKSA/ICJvayIgOiAiZmFpbGVkIikgPDwgZW5kbDsKICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZXhuKSB7Ci0gICAgY291dCA8PCAiRXJyb3I6ICIgPDwgZXhuLndoYXQoKSA8PCBlbmRsOyAgICAKKyAgICBjb3V0IDw8ICJFcnJvcjogIiA8PCBleG4ud2hhdCgpIDw8IGVuZGw7CiAgIH0KIAotICBldmVudF9iYXNlX2xvb3BicmVhayhiYXNlKTsgLy8gZW5kIHRlc3QKKyAgaWYgKHRlc3ROciA9PSA5KQorICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGJhc2UpOyAvLyBlbmQgdGVzdAogfQogCi1zdGF0aWMgdm9pZCB0ZXN0Vm9pZF9jbGllbnRSZXR1cm4oY29uc3QgY2hhciogaG9zdCwgaW50IHBvcnQsIGV2ZW50X2Jhc2UgKmJhc2UsIFRQcm90b2NvbEZhY3RvcnkqIHByb3RvY29sRmFjdG9yeSwgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7CitzdGF0aWMgdm9pZCB0ZXN0Vm9pZF9jbGllbnRSZXR1cm4oZXZlbnRfYmFzZSogYmFzZSwgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50KSB7CiAgIHRyeSB7CiAgICAgY2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CiAgICAgY291dCA8PCAidGVzdFZvaWQiIDw8IGVuZGw7CiAKLSAgICAvLyBuZXh0IHRlc3QKLSAgICBkZWxldGUgY2xpZW50OwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwobmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QsICIvIiwgaG9zdCwgcG9ydCwgYmFzZSkpOwotICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0Q29iQ2xpZW50KGNoYW5uZWwsIHByb3RvY29sRmFjdG9yeSk7Ci0gICAgY2xpZW50LT50ZXN0U3RyaW5nKHRyMTo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwgaG9zdCwgcG9ydCwgYmFzZSwgcHJvdG9jb2xGYWN0b3J5LCBzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMSksICJUZXN0Iik7CisgICAgZm9yIChpbnQgdGVzdE5yID0gMDsgdGVzdE5yIDwgMTA7ICsrdGVzdE5yKSB7CisgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3M7CisgICAgICBvcyA8PCAidGVzdCIgPDwgdGVzdE5yOworICAgICAgY2xpZW50LT50ZXN0U3RyaW5nKHN0ZDo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICBvcy5zdHIoKSk7CisgICAgfQogICB9IGNhdGNoIChURXhjZXB0aW9uJiBleG4pIHsKLSAgICBjb3V0IDw8ICJFcnJvcjogIiA8PCBleG4ud2hhdCgpIDw8IGVuZGw7ICAgIAorICAgIGNvdXQgPDwgIkVycm9yOiAiIDw8IGV4bi53aGF0KCkgPDwgZW5kbDsKICAgfQogfQogCisvLyBXb3JrYXJvdW5kIGZvciBhYnNlbnNlIG9mIEMrKzExICJhdXRvIiBrZXl3b3JkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIHByaW50X2VxKFQgZXhwZWN0ZWQsIFQgYWN0dWFsKSB7CisgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgeworICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisjZGVmaW5lIEJBU0VUWVBFX0lERU5USVRZX1RFU1QoZnVuYywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvdXQgPDwgI2Z1bmMgIigiIDw8IHZhbHVlIDw8ICIpID0gIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFwcmludF9lcSh2YWx1ZSwgdGVzdENsaWVudC5mdW5jKHZhbHVlKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGhyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeik7CisKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0JBU0VUWVBFUyA9IDE7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9TVFJVQ1RTID0gMjsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfRVhDRVBUSU9OUyA9IDg7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9VTktOT1dOID0gNjQ7CisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBjb3V0LnByZWNpc2lvbigxOSk7CisKKyAgc3RyaW5nIHRlc3REaXIgID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5zdHJpbmcoKTsKKyAgc3RyaW5nIGNhUGF0aCAgID0gdGVzdERpciArICIva2V5cy9DQS5wZW0iOworICBzdHJpbmcgY2VydFBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5jcnQiOworICBzdHJpbmcga2V5UGF0aCAgPSB0ZXN0RGlyICsgIi9rZXlzL2NsaWVudC5rZXkiOworCisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CiAgIGludCBwb3J0ID0gOTA5MDsKICAgaW50IG51bVRlc3RzID0gMTsKICAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB6bGliID0gZmFsc2U7CiAgIHN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CiAgIHN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CiAgIHN0cmluZyBkb21haW5fc29ja2V0ID0gIiI7CisgIGJvb2wgYWJzdHJhY3RfbmFtZXNwYWNlID0gZmFsc2U7CisgIGJvb2wgbm9pbnNhbmUgPSBmYWxzZTsKIAotICBwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7CisgIGludCByZXR1cm5fY29kZSA9IDA7CisKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6b3B0aW9uc19kZXNjcmlwdGlvbiBkZXNjKCJBbGxvd2VkIG9wdGlvbnMiKTsKICAgZGVzYy5hZGRfb3B0aW9ucygpCiAgICAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCi0gICAgICAoImhvc3QiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmhvc3QpLT5kZWZhdWx0X3ZhbHVlKGhvc3QpLCAiSG9zdCB0byBjb25uZWN0IikKLSAgICAgICgicG9ydCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKLQkgICgiZG9tYWluLXNvY2tldCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQotICAgICAgKCJ0cmFuc3BvcnQiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCIpCi0gICAgICAoInByb3RvY29sIiwgcHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZwcm90b2NvbF90eXBlKS0+ZGVmYXVsdF92YWx1ZShwcm90b2NvbF90eXBlKSwgIlByb3RvY29sOiBiaW5hcnksIGpzb24iKQotCSAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQotICAgICAgKCJ0ZXN0bG9vcHMsbiIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwgIk51bWJlciBvZiBUZXN0cyIpCi0gIDsKKyAgICAgICgiaG9zdCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmaG9zdCktPmRlZmF1bHRfdmFsdWUoaG9zdCksCisgICAgICAgICAgIkhvc3QgdG8gY29ubmVjdCIpCisgICAgICAoInBvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAorICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikKKyAgICAgICgiZG9tYWluLXNvY2tldCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCktPmRlZmF1bHRfdmFsdWUoZG9tYWluX3NvY2tldCksCisgICAgICAgICAgIkRvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdCksIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydCIpCisgICAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsCisgICAgICAgICAgIkxvb2sgZm9yIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UiCisgICAgICAgICAgIiAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCisgICAgICAoInRyYW5zcG9ydCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKKyAgICAgICAgICAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCBldmh0dHAsIHpsaWIiKQorICAgICAgKCJwcm90b2NvbCIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCisgICAgICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYywgbXVsdGloLCBtdWx0aWoiKQorICAgICAgKCJzc2wiLAorICAgICAgICAgICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgICAoInpsaWIiLAorICAgICAgICAgICJXcmFwIFRyYW5zcG9ydCB3aXRoIFpsaWIiKQorICAgICAgKCJ0ZXN0bG9vcHMsbiIsCisgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmbnVtVGVzdHMpLT5kZWZhdWx0X3ZhbHVlKG51bVRlc3RzKSwKKyAgICAgICAgICAiTnVtYmVyIG9mIFRlc3RzIikKKyAgICAgICgibm9pbnNhbmUiLAorICAgICAgICAgICJEbyBub3QgcnVuIGluc2FuaXR5IHRlc3QiKTsKIAotICBwcm9ncmFtX29wdGlvbnM6OnZhcmlhYmxlc19tYXAgdm07Ci0gIHByb2dyYW1fb3B0aW9uczo6c3RvcmUocHJvZ3JhbV9vcHRpb25zOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKLSAgcHJvZ3JhbV9vcHRpb25zOjpub3RpZnkodm0pOyAgICAKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFyaWFibGVzX21hcCB2bTsKKyAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6c3RvcmUoYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7CisgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6Om5vdGlmeSh2bSk7CiAKICAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKLSAgICBjb3V0IDw8IGRlc2MgPDwgIlxuIjsKLSAgICByZXR1cm4gMTsKKyAgICBjb3V0IDw8IGRlc2MgPDwgZW5kbDsKKyAgICByZXR1cm4gRVJSX1VOS05PV047CiAgIH0KIAotICB0cnkgeyAgIAorICB0cnkgewogICAgIGlmICghcHJvdG9jb2xfdHlwZS5lbXB0eSgpKSB7CiAgICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWMiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgewogICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIitwcm90b2NvbF90eXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIgKyBwcm90b2NvbF90eXBlKTsKICAgICAgIH0KICAgICB9CiAKLQlpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKKyAgICBpZiAoIXRyYW5zcG9ydF90eXBlLmVtcHR5KCkpIHsKICAgICAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiYnVmZmVyZWQiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZXZodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiemxpYiIpIHsKKyAgICAgICAgLy8gY3Jvc3N0ZXN0IHdpbGwgcGFzcyB6bGliIGFzIGEgdHJhbnNwb3J0IGFuZCBhcyBhIGZsYWcgcmlnaHQgbm93Li4KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiK3RyYW5zcG9ydF90eXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOwogICAgICAgfQogICAgIH0KIAotICB9IGNhdGNoIChzdGQ6OmV4Y2VwdGlvbiYgZSkgeworICB9IGNhdGNoIChleGNlcHRpb24mIGUpIHsKICAgICBjZXJyIDw8IGUud2hhdCgpIDw8IGVuZGw7Ci0gICAgY291dCA8PCBkZXNjIDw8ICJcbiI7Ci0gICAgcmV0dXJuIDE7CisgICAgY291dCA8PCBkZXNjIDw8IGVuZGw7CisgICAgcmV0dXJuIEVSUl9VTktOT1dOOwogICB9CiAKICAgaWYgKHZtLmNvdW50KCJzc2wiKSkgewogICAgIHNzbCA9IHRydWU7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7CisgIGlmICh2bS5jb3VudCgiemxpYiIpKSB7CisgICAgemxpYiA9IHRydWU7CisgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5OworICBpZiAodm0uY291bnQoImFic3RyYWN0LW5hbWVzcGFjZSIpKSB7CisgICAgYWJzdHJhY3RfbmFtZXNwYWNlID0gdHJ1ZTsKKyAgfQorCisgIGlmICh2bS5jb3VudCgibm9pbnNhbmUiKSkgeworICAgIG5vaW5zYW5lID0gdHJ1ZTsKKyAgfQorCisgIC8vIFRIUklGVC00MTY0OiBUaGUgZmFjdG9yeSBNVVNUIG91dGxpdmUgYW55IHNvY2tldHMgaXQgY3JlYXRlcyBmb3IgY29ycmVjdCBiZWhhdmlvciEKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wyOyAgLy8gU2Vjb25kU2VydmljZSBmb3IgbXVsdGlwbGV4ZWQKIAogICBpZiAoc3NsKSB7Ci0gICAgZmFjdG9yeSA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgY291dCA8PCAiQ2xpZW50IENlcnRpZmljYXRlIEZpbGU6ICIgPDwgY2VydFBhdGggPDwgZW5kbDsKKyAgICBjb3V0IDw8ICJDbGllbnQgS2V5ICAgICAgICAgRmlsZTogIiA8PCBrZXlQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ0EgICAgICAgICAgICAgICAgIEZpbGU6ICIgPDwgY2FQYXRoIDw8IGVuZGw7CisKKyAgICBmYWN0b3J5ID0gc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CiAgICAgZmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7Ci0gICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoIi4vdHJ1c3RlZC1jYS1jZXJ0aWZpY2F0ZS5wZW0iKTsKKyAgICBmYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjYVBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGtleVBhdGguY19zdHIoKSk7CiAgICAgZmFjdG9yeS0+YXV0aGVudGljYXRlKHRydWUpOwogICAgIHNvY2tldCA9IGZhY3RvcnktPmNyZWF0ZVNvY2tldChob3N0LCBwb3J0KTsKICAgfSBlbHNlIHsKICAgICBpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgewotICAgICAgc29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CisgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQogICAgICAgcG9ydCA9IDA7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgc29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOworICAgIH0gZWxzZSB7CisgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpOwogICAgIH0KICAgfQogCiAgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJodHRwIikgPT0gMCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGh0dHBTb2NrZXQobmV3IFRIdHRwQ2xpZW50KHNvY2tldCwgaG9zdCwgIi9zZXJ2aWNlIikpOwotICAgIHRyYW5zcG9ydCA9IGh0dHBTb2NrZXQ7Ci0gIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUuY29tcGFyZSgiZnJhbWVkIikgPT0gMCl7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gZnJhbWVkU29ja2V0KG5ldyBURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkpOwotICAgIHRyYW5zcG9ydCA9IGZyYW1lZFNvY2tldDsKLSAgfSBlbHNlewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKLSAgICB0cmFuc3BvcnQgPSBidWZmZXJlZFNvY2tldDsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwQ2xpZW50Pihzb2NrZXQsIGhvc3QsICIvc2VydmljZSIpOworICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImZyYW1lZCIpID09IDApIHsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRGcmFtZWRUcmFuc3BvcnQ+KHNvY2tldCk7CisgIH0gZWxzZSB7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnQ+KHNvY2tldCk7CiAgIH0KIAotICBpZiAocHJvdG9jb2xfdHlwZS5jb21wYXJlKCJqc29uIikgPT0gMCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ganNvblByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0ganNvblByb3RvY29sOwotICB9IGVsc2V7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gYmluYXJ5UHJvdG9jb2w7CisgIGlmICh6bGliKSB7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQ29tcGFjdFByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSGVhZGVyUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgcHJvdG9jb2wyID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgIC8vIHdlIGRvbid0IG5lZWQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBwcm90b2NvbCBhbnkgbW9yZSwgc28uLi4KKyAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlRocmlmdFRlc3QiKTsKICAgfQogCiAgIC8vIENvbm5lY3Rpb24gaW5mbwotICBjb3V0IDw8ICJDb25uZWN0aW5nICgiIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIHRvOiAiIDw8IGRvbWFpbl9zb2NrZXQ7CisgIGNvdXQgPDwgIkNvbm5lY3RpbmcgKCIgPDwgdHJhbnNwb3J0X3R5cGUgPDwgIi8iIDw8IHByb3RvY29sX3R5cGUgPDwgIikgdG86ICI7CisgIGlmIChhYnN0cmFjdF9uYW1lc3BhY2UpIHsKKyAgICBjb3V0IDw8ICdAJzsKKyAgfQorICBjb3V0IDw8IGRvbWFpbl9zb2NrZXQ7CiAgIGlmIChwb3J0ICE9IDApIHsKICAgICBjb3V0IDw8IGhvc3QgPDwgIjoiIDw8IHBvcnQ7CiAgIH0KICAgY291dCA8PCBlbmRsOwogCiAgIGlmICh0cmFuc3BvcnRfdHlwZS5jb21wYXJlKCJldmh0dHAiKSA9PSAwKSB7Ci0gICAgZXZlbnRfYmFzZSAqYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CisgICAgZXZlbnRfYmFzZSogYmFzZSA9IGV2ZW50X2Jhc2VfbmV3KCk7CiAgICAgY291dCA8PCAiTGliZXZlbnQgVmVyc2lvbjogIiA8PCBldmVudF9nZXRfdmVyc2lvbigpIDw8IGVuZGw7CiAgICAgY291dCA8PCAiTGliZXZlbnQgTWV0aG9kOiAiIDw8IGV2ZW50X2Jhc2VfZ2V0X21ldGhvZChiYXNlKSA8PCBlbmRsOwogI2lmIExJQkVWRU5UX1ZFUlNJT05fTlVNQkVSID49IDB4MDIwMDAwMDAKICAgICBjb3V0IDw8ICJMaWJldmVudCBGZWF0dXJlczogMHgiIDw8IGhleCA8PCBldmVudF9iYXNlX2dldF9mZWF0dXJlcyhiYXNlKSA8PCBlbmRsOwogI2VuZGlmCiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwobmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QuY19zdHIoKSwgIi8iLCBob3N0LmNfc3RyKCksIHBvcnQsIGJhc2UpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQ2hhbm5lbD4gY2hhbm5lbCgKKyAgICAgICAgbmV3IFRFdmh0dHBDbGllbnRDaGFubmVsKGhvc3QuY19zdHIoKSwgIi8iLCBob3N0LmNfc3RyKCksIHBvcnQsIGJhc2UpKTsKICAgICBUaHJpZnRUZXN0Q29iQ2xpZW50KiBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENvYkNsaWVudChjaGFubmVsLCBwcm90b2NvbEZhY3RvcnkuZ2V0KCkpOwotICAgIGNsaWVudC0+dGVzdFZvaWQodHIxOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwgaG9zdC5jX3N0cigpLCBwb3J0LCBiYXNlLCBwcm90b2NvbEZhY3RvcnkuZ2V0KCksIHN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8xKSk7Ci0gICAgCisgICAgY2xpZW50LT50ZXN0Vm9pZChzdGQ6OmJpbmQodGVzdFZvaWRfY2xpZW50UmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKKwogICAgIGV2ZW50X2Jhc2VfbG9vcChiYXNlLCAwKTsKICAgICByZXR1cm4gMDsKICAgfQogCi0KICAgVGhyaWZ0VGVzdENsaWVudCB0ZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICB1aW50NjRfdCB0aW1lX21pbiA9IDA7CiAgIHVpbnQ2NF90IHRpbWVfbWF4ID0gMDsKICAgdWludDY0X3QgdGltZV90b3QgPSAwOwogCi0gIGludCBmYWlsQ291bnQgPSAwOwogICBpbnQgdGVzdCA9IDA7CiAgIGZvciAodGVzdCA9IDA7IHRlc3QgPCBudW1UZXN0czsgKyt0ZXN0KSB7CiAKICAgICB0cnkgewogICAgICAgdHJhbnNwb3J0LT5vcGVuKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7Ci0gICAgICBwcmludGYoIkNvbm5lY3QgZmFpbGVkOiAlc1xuIiwgdHR4LndoYXQoKSk7Ci0gICAgICByZXR1cm4gMTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiQ29ubmVjdCBmYWlsZWQ6ICIgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm4gRVJSX1VOS05PV047CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ09OTkVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJUZXN0ICMlZCwgY29ubmVjdCAlczolZFxuIiwgdGVzdCsxLCBob3N0LmNfc3RyKCksIHBvcnQpOworICAgIHByaW50ZigiVGVzdCAjJWQsIGNvbm5lY3QgJXM6JWRcbiIsIHRlc3QgKyAxLCBob3N0LmNfc3RyKCksIHBvcnQpOwogCiAgICAgdWludDY0X3Qgc3RhcnQgPSBub3coKTsKIApAQCAtMjQ0LDYzICszNzMsMjI1IEBACiAgICAgICogVk9JRCBURVNUCiAgICAgICovCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdFZvaWQoKSIpOworICAgICAgY291dCA8PCAidGVzdFZvaWQoKSIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RWb2lkKCk7Ci0gICAgICBwcmludGYoIiA9IHZvaWRcbiIpOwotICAgIH0gY2F0Y2ggKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiYgdGF4KSB7Ci0gICAgICBwcmludGYoIiVzXG4iLCB0YXgud2hhdCgpKTsKLSAgICAgIGZhaWxDb3VudCsrOworICAgICAgY291dCA8PCAiID0gdm9pZCIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgLy8gU3RvcCBoZXJlIGlmIHRyYW5zcG9ydCBnb3QgYnJva2VuCisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU1RSSU5HIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgY291dCA8PCAidGVzdFN0cmluZyhcIlRlc3RcIikiIDw8IGZsdXNoOwogICAgIHN0cmluZyBzOwogICAgIHRlc3RDbGllbnQudGVzdFN0cmluZyhzLCAiVGVzdCIpOwotICAgIHByaW50ZigiID0gXCIlc1wiXG4iLCBzLmNfc3RyKCkpOwotICAgIGlmIChzICE9ICJUZXN0IikKLSAgICAgICAgZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCBzIDw8IGVuZGw7CisgICAgaWYgKHMgIT0gIlRlc3QiKSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNdWx0aXBsZXhlZCBwcm90b2NvbCAtIGNhbGwgYW5vdGhlciBzZXJ2aWNlIG1ldGhvZAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIFRocmlmdFRlc3QKKyAgICAvLworICAgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBTZWNvbmRTZXJ2aWNlQ2xpZW50IHNzYyhwcm90b2NvbDIpOworICAgIC8vIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4uLi4KKworICAgICAgICB0cnkgeworICAgICAgICAgIGNvdXQgPDwgInNlY29uZFNlcnZpY2Uuc2Vjb25kVGVzdFN0cmluZyhcImZvb1wiKSA9PiAiIDw8IGZsdXNoOworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzc2Muc2Vjb25kdGVzdFN0cmluZyhyZXN1bHQsICJmb28iKTsKKyAgICAgIGNvdXQgPDwgInsiIDw8IHJlc3VsdCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgICoqKiBGQUlMRUQgKioqICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0KKyAgICB9CisKKyAgICB0cnkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU2NiApCisjZW5kaWYKKyAgICAgIHN0cmluZyBzdHIoCisgICAgICAgICAgIn17QWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIKKyAgICAgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIKKyAgICAgICAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiCisgICAgICAgICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIgorICAgICAgICAgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIKKyAgICAgICAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiCisgICAgICAgICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIgorICAgICAgICAgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIKKyAgICAgICAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIgorICAgICAgICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiCisgICAgICAgICAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIgorICAgICAgICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIKKyAgICAgICAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiCisgICAgICAgICAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIKKyAgICAgICAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIKKyAgICAgICAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIgorICAgICAgICAgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIKKyAgICAgICAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIKKyAgICAgICAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIKKyAgICAgICAgICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiCisgICAgICAgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIgorICAgICAgICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIKKyAgICAgICAgICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIgorICAgICAgICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiCisgICAgICAgICAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgIkV4cGVjdGVkIHN0cmluZzogIiA8PCBzdHIgPDwgIiBidXQgZ290OiAiIDw8IHMgPDwgZW5kbCA8PCAiQ0xFQVIiOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorICAgIHRyeSB7CisgICAgICBzdHJpbmcgc3RyKAorICAgICAgICAgICJxdW90ZTogXCIgYmFja3NsYXNoOiIKKyAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIgorICAgICAgICAgICIgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICIKKyAgICAgICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcL1xiXG5cclx0IgorICAgICAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCIKKyAgICAgICAgICAiIGNoYXItdG8tdGVzdC1qc29uLXBhcnNpbmc6IF1dIFwiXV0gXFxcIiB9fX17IFtbWyAiKTsKKyAgICAgIGNvdXQgPDwgInRlc3RTdHJpbmcoIiA8PCBzdHIgPDwgIikgPSAiIDw8IGZsdXNoOworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nKHMsIHN0cik7CisgICAgICBjb3V0IDw8IHMgPDwgZW5kbDsKKyAgICAgIGlmIChzICE9IHN0cikgeworICAgICAgICBjb3V0LmltYnVlKGxvY2FsZSgiZW5fVVMuVVRGOCIpKTsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgc3RyaW5nOiAiIDw8IHN0ciA8PCAiIGJ1dCBnb3Q6ICIgPDwgcyA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIkNMRUFSIjsKKyAgICAgICAgOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICByZXR1cm4gcmV0dXJuX2NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQk9PTCBURVNUCisgICAgICovCisgICAgY291dCA8PCBib29sYWxwaGE7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgdHJ1ZSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qm9vbCwgZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogQllURSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0Qnl0ZSgxKSIpOwotICAgIHVpbnQ4X3QgdTggPSB0ZXN0Q2xpZW50LnRlc3RCeXRlKDEpOwotICAgIHByaW50ZigiID0gJWRcbiIsIChpbnQpdTgpOwotICAgIGlmICh1OCAhPSAxKQotICAgICAgICBmYWlsQ291bnQrKzsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpNDIpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEJ5dGUsIChpbnQ4X3QpLTQyKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RCeXRlLCAoaW50OF90KTEyNyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0Qnl0ZSwgKGludDhfdCktMTI4KTsKIAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0STMyKC0xKSIpOwotICAgIGludDMyX3QgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOwotICAgIGlmIChpMzIgIT0gLTEpCi0gICAgICAgIGZhaWxDb3VudCsrOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAxOTAwMDAwMTMpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgLTE5MDAwMDAxMyk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAobnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSk7CiAKICAgICAvKioKICAgICAgKiBJNjQgVEVTVAogICAgICAqLwotICAgIHByaW50ZigidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7Ci0gICAgaW50NjRfdCBpNjQgPSB0ZXN0Q2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4TEwpOwotICAgIHByaW50ZigiID0gJSJQUklkNjQiXG4iLCBpNjQpOwotICAgIGlmIChpNjQgIT0gLTM0MzU5NzM4MzY4TEwpCi0gICAgICAgIGZhaWxDb3VudCsrOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCk3MDAwMDAwMDAwMDAwMDAwMTIzTEwpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLTcwMDAwMDAwMDAwMDAwMDAxMjNMTCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdClwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdClwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikgKyAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyTEwpLCAzMikgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KSgpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpKTsKKwogICAgIC8qKgogICAgICAqIERPVUJMRSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0RG91YmxlKC01LjIwOTg1MjMpIik7Ci0gICAgZG91YmxlIGR1YiA9IHRlc3RDbGllbnQudGVzdERvdWJsZSgtNS4yMDk4NTIzKTsKLSAgICBwcmludGYoIiA9ICVmXG4iLCBkdWIpOwotICAgIGlmICgoZHViIC0gKC01LjIwOTg1MjMpKSA+IDAuMDAxKQotICAgICAgICBmYWlsQ291bnQrKzsKKyAgICAvLyBDb21wYXJpbmcgZG91YmxlIHZhbHVlcyB3aXRoIHBsYWluIGVxdWFsaXR5IGJlY2F1c2UgVGhyaWZ0IGhhbmRsZXMgZnVsbCBwcmVjaXNpb24gb2YgZG91YmxlCisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAwLjApOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTEuMCk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtNS4yMDk4NTIzKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikgKyAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCA1MykgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDUzKSArIDEpOworCisgICAgdHJ5IHsKKyAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgMzA3KTsKKyAgICAgIGNvdXQgPDwgInRlc3REb3VibGUoIiA8PCBleHBlY3RlZCA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICBkb3VibGUgYWN0dWFsID0gdGVzdENsaWVudC50ZXN0RG91YmxlKGV4cGVjdGVkKTsKKyAgICAgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGlmIChleHBlY3RlZCAtIGFjdHVhbCA+IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgMjkyKSkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgZG91YmxlIGV4cGVjdGVkID0gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAtMjkyKTsKKyAgICAgIGNvdXQgPDwgInRlc3REb3VibGUoIiA8PCBleHBlY3RlZCA8PCAiKSA9ICIgPDwgZmx1c2g7CisgICAgICBkb3VibGUgYWN0dWFsID0gdGVzdENsaWVudC50ZXN0RG91YmxlKGV4cGVjdGVkKTsKKyAgICAgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIGlmIChleHBlY3RlZCAtIGFjdHVhbCA+IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgLTMwNykpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwKKyAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQ6ICIgPDwgZXhwZWN0ZWQgPDwgIiBidXQgZ290OiAiIDw8IGFjdHVhbCA8PCBlbmRsOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQklOQVJZIFRFU1QKKyAgICAgKi8KKyAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgMTMxMDczICYmICFyZXR1cm5fY29kZTsgKSB7CisgICAgICByZXR1cm5fY29kZSB8PSBiaW5hcnlfdGVzdCh0ZXN0Q2xpZW50LCBpKTsKKyAgICAgIGlmIChpID4gMCkgeyBpICo9IDI7IH0gZWxzZSB7ICsraTsgfQorICAgIH0KKwogCiAgICAgLyoqCiAgICAgICogU1RSVUNUIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgIGNvdXQgPDwgInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIgPDwgZmx1c2g7CiAgICAgWHRydWN0IG91dDsKICAgICBvdXQuc3RyaW5nX3RoaW5nID0gIlplcm8iOwogICAgIG91dC5ieXRlX3RoaW5nID0gMTsKQEAgLTMwOCwxOCArNTk5LDIwIEBACiAgICAgb3V0Lmk2NF90aGluZyA9IC01OwogICAgIFh0cnVjdCBpbjsKICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJ1Y3QoaW4sIG91dCk7Ci0gICAgcHJpbnRmKCIgPSB7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In1cbiIsCisgICAgcHJpbnRmKCIgPSB7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifVxuIiwKICAgICAgICAgICAgaW4uc3RyaW5nX3RoaW5nLmNfc3RyKCksCiAgICAgICAgICAgIChpbnQpaW4uYnl0ZV90aGluZywKICAgICAgICAgICAgaW4uaTMyX3RoaW5nLAogICAgICAgICAgICBpbi5pNjRfdGhpbmcpOwotICAgIGlmIChpbiAhPSBvdXQpCi0gICAgCWZhaWxDb3VudCsrOworICAgIGlmIChpbiAhPSBvdXQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogTkVTVEVEIFNUUlVDVCBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9KSwgNX0iIDw8IGZsdXNoOwogICAgIFh0cnVjdDIgb3V0MjsKICAgICBvdXQyLmJ5dGVfdGhpbmcgPSAxOwogICAgIG91dDIuc3RydWN0X3RoaW5nID0gb3V0OwpAQCAtMzI3LDU1ICs2MjAsODUgQEAKICAgICBYdHJ1Y3QyIGluMjsKICAgICB0ZXN0Q2xpZW50LnRlc3ROZXN0KGluMiwgb3V0Mik7CiAgICAgaW4gPSBpbjIuc3RydWN0X3RoaW5nOwotICAgIHByaW50ZigiID0geyVkLCB7XCIlc1wiLCAlZCwgJWQsICUiUFJJZDY0In0sICVkfVxuIiwKKyAgICBwcmludGYoIiA9IHslZCwge1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0sICVkfVxuIiwKICAgICAgICAgICAgaW4yLmJ5dGVfdGhpbmcsCiAgICAgICAgICAgIGluLnN0cmluZ190aGluZy5jX3N0cigpLAogICAgICAgICAgICAoaW50KWluLmJ5dGVfdGhpbmcsCiAgICAgICAgICAgIGluLmkzMl90aGluZywKICAgICAgICAgICAgaW4uaTY0X3RoaW5nLAogICAgICAgICAgICBpbjIuaTMyX3RoaW5nKTsKLSAgICBpZiAoaW4yICE9IG91dDIpCi0gICAgCWZhaWxDb3VudCsrOworICAgIGlmIChpbjIgIT0gb3V0MikgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBNQVAgVEVTVAogICAgICAqLwotICAgIG1hcDxpbnQzMl90LGludDMyX3Q+IG1hcG91dDsKKyAgICBtYXA8aW50MzJfdCwgaW50MzJfdD4gbWFwb3V0OwogICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDU7ICsraSkgewotICAgICAgbWFwb3V0Lmluc2VydChtYWtlX3BhaXIoaSwgaS0xMCkpOworICAgICAgbWFwb3V0Lmluc2VydChtYWtlX3BhaXIoaSwgaSAtIDEwKSk7CiAgICAgfQotICAgIHByaW50ZigidGVzdE1hcCh7Iik7CisgICAgY291dCA8PCAidGVzdE1hcCh7IiA8PCBmbHVzaDsKICAgICBtYXA8aW50MzJfdCwgaW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKG1faXRlciA9IG1hcG91dC5iZWdpbigpOyBtX2l0ZXIgIT0gbWFwb3V0LmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgICAgIGNvdXQgPDwgIiwiOwogICAgICAgfQotICAgICAgcHJpbnRmKCIlZCA9PiAlZCIsIG1faXRlci0+Zmlyc3QsIG1faXRlci0+c2Vjb25kKTsKKyAgICAgIGNvdXQgPDwgbV9pdGVyLT5maXJzdCA8PCAiID0+ICIgPDwgbV9pdGVyLT5zZWNvbmQ7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBtYXBpbjsKKyAgICBjb3V0IDw8ICJ9KSI7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG1hcGluOwogICAgIHRlc3RDbGllbnQudGVzdE1hcChtYXBpbiwgbWFwb3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChtX2l0ZXIgPSBtYXBpbi5iZWdpbigpOyBtX2l0ZXIgIT0gbWFwaW4uZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkID0+ICVkIiwgbV9pdGVyLT5maXJzdCwgbV9pdGVyLT5zZWNvbmQpOworICAgICAgY291dCA8PCBtX2l0ZXItPmZpcnN0IDw8ICIgPT4gIiA8PCBtX2l0ZXItPnNlY29uZDsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKLSAgICBpZiAobWFwaW4gIT0gbWFwb3V0KQotICAgIAlmYWlsQ291bnQrKzsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChtYXBpbiAhPSBtYXBvdXQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU1RSSU5HIE1BUCBURVNUCi0gICAgICogIG1pc3NpbmcKICAgICAgKi8KKyAgICBjb3V0IDw8ICJ0ZXN0U3RyaW5nTWFwKHthID0+IDIsIGIgPT4gYmxhaCwgc29tZSA9PiB0aGluZ30pID0geyIgPDwgZmx1c2g7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzbWFwaW47CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBzbWFwb3V0OworICAgIHNtYXBpblsiYSJdID0gIjIiOworICAgIHNtYXBpblsiYiJdID0gImJsYWgiOworICAgIHNtYXBpblsic29tZSJdID0gInRoaW5nIjsKKyAgICB0cnkgeworICAgICAgdGVzdENsaWVudC50ZXN0U3RyaW5nTWFwKHNtYXBvdXQsIHNtYXBpbik7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc21hcG91dC5iZWdpbigpOyBpdCAhPSBzbWFwb3V0LmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICBjb3V0IDw8ICIsIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIGNvdXQgPDwgaXQtPmZpcnN0IDw8ICIgPT4gIiA8PCBpdC0+c2Vjb25kOworICAgICAgfQorICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGlmIChzbWFwaW4gIT0gc21hcG91dCkgeworICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgICB9CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKKyAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU0VUIFRFU1QKQEAgLTM4NCwyNTQgKzcwNywzNjcgQEAKICAgICBmb3IgKGludDMyX3QgaSA9IC0yOyBpIDwgMzsgKytpKSB7CiAgICAgICBzZXRvdXQuaW5zZXJ0KGkpOwogICAgIH0KLSAgICBwcmludGYoInRlc3RTZXQoeyIpOworICAgIGNvdXQgPDwgInRlc3RTZXQoeyIgPDwgZmx1c2g7CiAgICAgc2V0PGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBzX2l0ZXI7CiAgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc19pdGVyID0gc2V0b3V0LmJlZ2luKCk7IHNfaXRlciAhPSBzZXRvdXQuZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifSkiKTsKKyAgICBjb3V0IDw8ICJ9KSI7CiAgICAgc2V0PGludDMyX3Q+IHNldGluOwogICAgIHRlc3RDbGllbnQudGVzdFNldChzZXRpbiwgc2V0b3V0KTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChzX2l0ZXIgPSBzZXRpbi5iZWdpbigpOyBzX2l0ZXIgIT0gc2V0aW4uZW5kKCk7ICsrc19pdGVyKSB7CiAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgY291dCA8PCAiLCI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIiVkIiwgKnNfaXRlcik7CisgICAgICBjb3V0IDw8ICpzX2l0ZXI7CiAgICAgfQotICAgIHByaW50ZigifVxuIik7Ci0gICAgaWYgKHNldGluICE9IHNldG91dCkKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICBpZiAoc2V0aW4gIT0gc2V0b3V0KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9DT05UQUlORVJTOworICAgIH0KIAogICAgIC8qKgogICAgICAqIExJU1QgVEVTVAogICAgICAqLwotICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OwotICAgIGZvciAoaW50MzJfdCBpID0gLTI7IGkgPCAzOyArK2kpIHsKLSAgICAgIGxpc3RvdXQucHVzaF9iYWNrKGkpOwotICAgIH0KLSAgICBwcmludGYoInRlc3RMaXN0KHsiKTsKLSAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKLSAgICBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChsX2l0ZXIgPSBsaXN0b3V0LmJlZ2luKCk7IGxfaXRlciAhPSBsaXN0b3V0LmVuZCgpOyArK2xfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgY291dCA8PCAidGVzdExpc3QoZW1wdHkpIiA8PCBmbHVzaDsKKyAgICB0cnkgeworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RvdXQ7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RMaXN0KGxpc3RvdXQsIHZlY3RvcjxpbnQzMl90PigpKTsKKyAgICAgIGlmICghbGlzdG91dC5lbXB0eSgpKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICBjb3V0IDw8ICJpbnZhbGlkIGxlbmd0aDogIiA8PCBsaXN0b3V0LnNpemUoKSA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqbF9pdGVyKTsKKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9Ci0gICAgcHJpbnRmKCJ9KSIpOwotICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0aW47Ci0gICAgdGVzdENsaWVudC50ZXN0TGlzdChsaXN0aW4sIGxpc3RvdXQpOwotICAgIHByaW50ZigiID0geyIpOwotICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGxfaXRlciA9IGxpc3Rpbi5iZWdpbigpOyBsX2l0ZXIgIT0gbGlzdGluLmVuZCgpOyArK2xfaXRlcikgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIiwgIik7CisgICAgdHJ5IHsKKyAgICAgIHZlY3RvcjxpbnQzMl90PiBsaXN0b3V0OworICAgICAgZm9yIChpbnQzMl90IGkgPSAtMjsgaSA8IDM7ICsraSkgeworICAgICAgICBsaXN0b3V0LnB1c2hfYmFjayhpKTsKICAgICAgIH0KLSAgICAgIHByaW50ZigiJWQiLCAqbF9pdGVyKTsKKyAgICAgIGNvdXQgPDwgInRlc3RMaXN0KHsiIDw8IGZsdXNoOworICAgICAgdmVjdG9yPGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBsX2l0ZXI7CisgICAgICBmaXJzdCA9IHRydWU7CisgICAgICBmb3IgKGxfaXRlciA9IGxpc3RvdXQuYmVnaW4oKTsgbF9pdGVyICE9IGxpc3RvdXQuZW5kKCk7ICsrbF9pdGVyKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY291dCA8PCAiLCI7CisgICAgICAgIH0KKyAgICAgICAgY291dCA8PCAqbF9pdGVyOworICAgICAgfQorICAgICAgY291dCA8PCAifSkiOworICAgICAgdmVjdG9yPGludDMyX3Q+IGxpc3RpbjsKKyAgICAgIHRlc3RDbGllbnQudGVzdExpc3QobGlzdGluLCBsaXN0b3V0KTsKKyAgICAgIGNvdXQgPDwgIiA9IHsiOworICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChsX2l0ZXIgPSBsaXN0aW4uYmVnaW4oKTsgbF9pdGVyICE9IGxpc3Rpbi5lbmQoKTsgKytsX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb3V0IDw8ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICpsX2l0ZXI7CisgICAgICB9CisgICAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgICAgaWYgKGxpc3RpbiAhPSBsaXN0b3V0KSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgdGhyb3c7CisgICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKLSAgICBpZiAobGlzdGluICE9IGxpc3RvdXQpCi0gICAgCWZhaWxDb3VudCsrOwogCiAgICAgLyoqCiAgICAgICogRU5VTSBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShPTkUpIik7CisgICAgY291dCA8PCAidGVzdEVudW0oT05FKSIgPDwgZmx1c2g7CiAgICAgTnVtYmVyejo6dHlwZSByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6Ok9ORSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKLSAgICBpZiAocmV0ICE9IE51bWJlcno6Ok9ORSkKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6Ok9ORSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKFRXTykiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0RW51bShUV08pIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OlRXTyk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKLSAgICBpZiAocmV0ICE9IE51bWJlcno6OlRXTykKLSAgICAJZmFpbENvdW50Kys7CisgICAgY291dCA8PCAiID0gIiA8PCByZXQgPDwgZW5kbDsKKyAgICBpZiAocmV0ICE9IE51bWJlcno6OlRXTykgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKFRIUkVFKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKFRIUkVFKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpUSFJFRSk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKLSAgICBpZiAocmV0ICE9IE51bWJlcno6OlRIUkVFKQotICAgIAlmYWlsQ291bnQrKzsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6VEhSRUUpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCi0gICAgcHJpbnRmKCJ0ZXN0RW51bShGSVZFKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKEZJVkUpIiA8PCBmbHVzaDsKICAgICByZXQgPSB0ZXN0Q2xpZW50LnRlc3RFbnVtKE51bWJlcno6OkZJVkUpOwotICAgIHByaW50ZigiID0gJWRcbiIsIHJldCk7Ci0gICAgaWYgKHJldCAhPSBOdW1iZXJ6OjpGSVZFKQotICAgIAlmYWlsQ291bnQrKzsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6RklWRSkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKLSAgICBwcmludGYoInRlc3RFbnVtKEVJR0hUKSIpOworICAgIGNvdXQgPDwgInRlc3RFbnVtKEVJR0hUKSIgPDwgZmx1c2g7CiAgICAgcmV0ID0gdGVzdENsaWVudC50ZXN0RW51bShOdW1iZXJ6OjpFSUdIVCk7Ci0gICAgcHJpbnRmKCIgPSAlZFxuIiwgcmV0KTsKLSAgICBpZiAocmV0ICE9IE51bWJlcno6OkVJR0hUKQotICAgIAlmYWlsQ291bnQrKzsKKyAgICBjb3V0IDw8ICIgPSAiIDw8IHJldCA8PCBlbmRsOworICAgIGlmIChyZXQgIT0gTnVtYmVyejo6RUlHSFQpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX1NUUlVDVFM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogVFlQRURFRiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgY291dCA8PCAidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIgPDwgZmx1c2g7CiAgICAgVXNlcklkIHVpZCA9IHRlc3RDbGllbnQudGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzTEwpOwotICAgIHByaW50ZigiID0gJSJQUklkNjQiXG4iLCB1aWQpOwotICAgIGlmICh1aWQgIT0gMzA5ODU4MjM1MDgyNTIzTEwpCi0gICAgCWZhaWxDb3VudCsrOworICAgIGNvdXQgPDwgIiA9ICIgPDwgdWlkIDw8IGVuZGw7CisgICAgaWYgKHVpZCAhPSAzMDk4NTgyMzUwODI1MjNMTCkgeworICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBORVNURUQgTUFQIFRFU1QKICAgICAgKi8KLSAgICBwcmludGYoInRlc3RNYXBNYXAoMSkiKTsKKyAgICBjb3V0IDw8ICJ0ZXN0TWFwTWFwKDEpIiA8PCBmbHVzaDsKICAgICBtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID4gbW07CiAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKG1tLCAxKTsKLSAgICBwcmludGYoIiA9IHsiKTsKKyAgICBjb3V0IDw8ICIgPSB7IjsKICAgICBtYXA8aW50MzJfdCwgbWFwPGludDMyX3QsIGludDMyX3Q+ID46OmNvbnN0X2l0ZXJhdG9yIG1pOwogICAgIGZvciAobWkgPSBtbS5iZWdpbigpOyBtaSAhPSBtbS5lbmQoKTsgKyttaSkgewogICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgbWktPmZpcnN0KTsKICAgICAgIG1hcDxpbnQzMl90LCBpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgbWkyOwogICAgICAgZm9yIChtaTIgPSBtaS0+c2Vjb25kLmJlZ2luKCk7IG1pMiAhPSBtaS0+c2Vjb25kLmVuZCgpOyArK21pMikgewotICAgICAgICBwcmludGYoIiVkID0+ICVkLCAiLCBtaTItPmZpcnN0LCBtaTItPnNlY29uZCk7CisgICAgICAgIGNvdXQgPDwgbWkyLT5maXJzdCA8PCAiID0+ICIgPDwgbWkyLT5zZWNvbmQ7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSwgIjsKICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKyAgICBjb3V0IDw8ICJ9IiA8PCBlbmRsOworICAgIGlmIChtbS5zaXplKCkgIT0gMiB8fAorICAgICAgICBtbVstNF1bLTRdICE9IC00IHx8CisgICAgICAgIG1tWy00XVstM10gIT0gLTMgfHwKKyAgICAgICAgbW1bLTRdWy0yXSAhPSAtMiB8fAorICAgICAgICBtbVstNF1bLTFdICE9IC0xIHx8CisgICAgICAgIG1tWzRdWzRdICE9IDQgfHwKKyAgICAgICAgbW1bNF1bM10gIT0gMyB8fAorICAgICAgICBtbVs0XVsyXSAhPSAyIHx8CisgICAgICAgIG1tWzRdWzFdICE9IDEpIHsKKyAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0NPTlRBSU5FUlM7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSU5TQU5JVFkgVEVTVAogICAgICAqLwotICAgIEluc2FuaXR5IGluc2FuZTsKLSAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUwMDApKTsKLSAgICBYdHJ1Y3QgdHJ1Y2s7Ci0gICAgdHJ1Y2suc3RyaW5nX3RoaW5nID0gIlRydWNrIjsKLSAgICB0cnVjay5ieXRlX3RoaW5nID0gODsKLSAgICB0cnVjay5pMzJfdGhpbmcgPSA4OwotICAgIHRydWNrLmk2NF90aGluZyA9IDg7Ci0gICAgaW5zYW5lLnh0cnVjdHMucHVzaF9iYWNrKHRydWNrKTsKLSAgICBwcmludGYoInRlc3RJbnNhbml0eSgpIik7Ci0gICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+ID4gd2hvYTsKLSAgICB0ZXN0Q2xpZW50LnRlc3RJbnNhbml0eSh3aG9hLCBpbnNhbmUpOwotICAgIHByaW50ZigiID0geyIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7Ci0gICAgZm9yIChpX2l0ZXIgPSB3aG9hLmJlZ2luKCk7IGlfaXRlciAhPSB3aG9hLmVuZCgpOyArK2lfaXRlcikgewotICAgICAgcHJpbnRmKCIlIlBSSWQ2NCIgPT4geyIsIGlfaXRlci0+Zmlyc3QpOwotICAgICAgbWFwPE51bWJlcno6OnR5cGUsSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOwotICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsKLSAgICAgICAgICAgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsKLSAgICAgICAgICAgKytpMl9pdGVyKSB7Ci0gICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKLSAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwotICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07Ci0gICAgICAgIHByaW50ZigieyIpOwotICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7Ci0gICAgICAgICAgcHJpbnRmKCIlZCA9PiAlIlBSSWQ2NCIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICBpZiAoIW5vaW5zYW5lKSB7CisgICAgICBJbnNhbml0eSBpbnNhbmU7CisgICAgICBpbnNhbmUudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUpKTsKKyAgICAgIGluc2FuZS51c2VyTWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6RUlHSFQsIDgpKTsKKyAgICAgIFh0cnVjdCB0cnVjazsKKyAgICAgIHRydWNrLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7CisgICAgICB0cnVjay5ieXRlX3RoaW5nID0gNDsKKyAgICAgIHRydWNrLmkzMl90aGluZyA9IDQ7CisgICAgICB0cnVjay5pNjRfdGhpbmcgPSA0OworICAgICAgWHRydWN0IHRydWNrMjsKKyAgICAgIHRydWNrMi5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgIHRydWNrMi5ieXRlX3RoaW5nID0gMjsKKyAgICAgIHRydWNrMi5pMzJfdGhpbmcgPSAyOworICAgICAgdHJ1Y2syLmk2NF90aGluZyA9IDI7CisgICAgICBpbnNhbmUueHRydWN0cy5wdXNoX2JhY2sodHJ1Y2spOworICAgICAgaW5zYW5lLnh0cnVjdHMucHVzaF9iYWNrKHRydWNrMik7CisgICAgICBjb3V0IDw8ICJ0ZXN0SW5zYW5pdHkoKSIgPDwgZmx1c2g7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gd2hvYTsKKyAgICAgIHRlc3RDbGllbnQudGVzdEluc2FuaXR5KHdob2EsIGluc2FuZSk7CisgICAgICBjb3V0IDw8ICIgPSB7IjsKKyAgICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPjo6Y29uc3RfaXRlcmF0b3IgaV9pdGVyOworICAgICAgZm9yIChpX2l0ZXIgPSB3aG9hLmJlZ2luKCk7IGlfaXRlciAhPSB3aG9hLmVuZCgpOyArK2lfaXRlcikgeworICAgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKKyAgICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsgKytpMl9pdGVyKSB7CisgICAgICAgICAgcHJpbnRmKCIlZCA9PiB7IiwgaTJfaXRlci0+Zmlyc3QpOworICAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBVc2VySWQ+IHVzZXJNYXAgPSBpMl9pdGVyLT5zZWNvbmQudXNlck1hcDsKKyAgICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07CisgICAgICAgICAgY291dCA8PCAieyI7CisgICAgICAgICAgZm9yICh1bSA9IHVzZXJNYXAuYmVnaW4oKTsgdW0gIT0gdXNlck1hcC5lbmQoKTsgKyt1bSkgeworICAgICAgICAgICAgY291dCA8PCB1bS0+Zmlyc3QgPDwgIiA9PiAiIDw8IHVtLT5zZWNvbmQ7CisgICAgICAgICAgfQorICAgICAgICAgIGNvdXQgPDwgIn0sICI7CiAKLSAgICAgICAgdmVjdG9yPFh0cnVjdD4geHRydWN0cyA9IGkyX2l0ZXItPnNlY29uZC54dHJ1Y3RzOwotICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKLSAgICAgICAgcHJpbnRmKCJ7Iik7Ci0gICAgICAgIGZvciAoeCA9IHh0cnVjdHMuYmVnaW4oKTsgeCAhPSB4dHJ1Y3RzLmVuZCgpOyArK3gpIHsKLSAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSwgIiwKLSAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIChpbnQpeC0+Ynl0ZV90aGluZywKLSAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAotICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigifSIpOworICAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+IHh0cnVjdHMgPSBpMl9pdGVyLT5zZWNvbmQueHRydWN0czsKKyAgICAgICAgICB2ZWN0b3I8WHRydWN0Pjo6Y29uc3RfaXRlcmF0b3IgeDsKKyAgICAgICAgICBjb3V0IDw8ICJ7IjsKKyAgICAgICAgICBmb3IgKHggPSB4dHJ1Y3RzLmJlZ2luKCk7IHggIT0geHRydWN0cy5lbmQoKTsgKyt4KSB7CisgICAgICAgICAgICBwcmludGYoIntcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAiLAorICAgICAgICAgICAgICAgICAgIHgtPnN0cmluZ190aGluZy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgIChpbnQpeC0+Ynl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICB4LT5pMzJfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgeC0+aTY0X3RoaW5nKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY291dCA8PCAifSI7CiAKLSAgICAgICAgcHJpbnRmKCJ9LCAiKTsKKyAgICAgICAgICBjb3V0IDw8ICJ9LCAiOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgIn0sICI7CiAgICAgICB9Ci0gICAgICBwcmludGYoIn0sICIpOworICAgICAgY291dCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGJvb2wgZmFpbGVkID0gZmFsc2U7CisgICAgICBtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID46OmNvbnN0X2l0ZXJhdG9yIGl0MSA9IHdob2EuZmluZChVc2VySWQoMSkpOworICAgICAgaWYgKHdob2Euc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChpdDEgPT0gd2hvYS5lbmQoKSkgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQxMiA9IGl0MS0+c2Vjb25kLmZpbmQoTnVtYmVyejo6VFdPKTsKKyAgICAgICAgaWYgKGl0MTIgPT0gaXQxLT5zZWNvbmQuZW5kKCkgfHwgaXQxMi0+c2Vjb25kICE9IGluc2FuZSkgeworICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQxMyA9IGl0MS0+c2Vjb25kLmZpbmQoTnVtYmVyejo6VEhSRUUpOworICAgICAgICBpZiAoaXQxMyA9PSBpdDEtPnNlY29uZC5lbmQoKSB8fCBpdDEzLT5zZWNvbmQgIT0gaW5zYW5lKSB7CisgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpdDIgPSB3aG9hLmZpbmQoVXNlcklkKDIpKTsKKyAgICAgIGlmIChpdDIgPT0gd2hvYS5lbmQoKSkgeworICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaXQyNiA9IGl0Mi0+c2Vjb25kLmZpbmQoTnVtYmVyejo6U0lYKTsKKyAgICAgICAgaWYgKGl0MjYgPT0gaXQyLT5zZWNvbmQuZW5kKCkgfHwgaXQyNi0+c2Vjb25kICE9IEluc2FuaXR5KCkpIHsKKyAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmFpbGVkKSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfU1RSVUNUUzsKKyAgICAgIH0KICAgICB9Ci0gICAgcHJpbnRmKCJ9XG4iKTsKKworICAgIC8qKgorICAgICAqIE1VTFRJIFRFU1QKKyAgICAgKi8KKyAgICBjb3V0IDw8ICJ0ZXN0TXVsdGkoKSIgPDwgZW5kbDsKKyAgICB0cnkgeworICAgICAgbWFwPGludDE2X3QsIHN0cmluZz4gbXVsX21hcDsKKyAgICAgIFh0cnVjdCBtdWxfcmVzdWx0OworICAgICAgbXVsX21hcFsxXSA9ICJibGFoIjsKKyAgICAgIG11bF9tYXBbMl0gPSAidGhpbmciOworICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGkobXVsX3Jlc3VsdCwgNDIsIDQyNDIsIDQyNDI0MiwgbXVsX21hcCwgTnVtYmVyejo6RUlHSFQsIFVzZXJJZCgyNCkpOworICAgICAgWHRydWN0IHh4czsKKyAgICAgIHh4cy5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgIHh4cy5ieXRlX3RoaW5nID0gNDI7CisgICAgICB4eHMuaTMyX3RoaW5nID0gNDI0MjsKKyAgICAgIHh4cy5pNjRfdGhpbmcgPSA0MjQyNDI7CisgICAgICBpZiAobXVsX3Jlc3VsdCAhPSB4eHMpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9TVFJVQ1RTOworICAgIH0KIAogICAgIC8qIHRlc3QgZXhjZXB0aW9uICovCiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikgPT4iIDw8IGZsdXNoOwogICAgICAgdGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpOwotICAgICAgcHJpbnRmKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwotICAgICAgZmFpbENvdW50Kys7CisgICAgICBjb3V0IDw8ICIgIHZvaWRcbioqKiBGQUlMRUQgKioqIiA8PCBlbmRsOworICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0VYQ0VQVElPTlM7CiAKLSAgICB9IGNhdGNoKFhjZXB0aW9uJiBlKSB7CisgICAgfSBjYXRjaCAoWGNlcHRpb24mIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIFwiJXNcIn1cbiIsIGUuZXJyb3JDb2RlLCBlLm1lc3NhZ2UuY19zdHIoKSk7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpID0+Iik7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpOwotICAgICAgICBwcmludGYoIiAgdm9pZFxuRkFJTFVSRVxuIik7Ci0gICAgICAgIGZhaWxDb3VudCsrOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSA9PiIgPDwgZmx1c2g7CisgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZFxuKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKIAotICAgICAgfSBjYXRjaChURXhjZXB0aW9uJiBlKSB7Ci0gICAgICAgIHByaW50ZigiICBDYXVnaHQgVEV4Y2VwdGlvblxuIik7Ci0gICAgICB9CisgICAgfSBjYXRjaCAoY29uc3QgVEV4Y2VwdGlvbiYpIHsKKyAgICAgIGNvdXQgPDwgIiAgQ2F1Z2h0IFRFeGNlcHRpb24iIDw8IGVuZGw7CisgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0RXhjZXB0aW9uKFwic3VjY2Vzc1wiKSA9PiIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RFeGNlcHRpb24oInN1Y2Nlc3MiKTsKLSAgICAgIHByaW50ZigiICB2b2lkXG4iKTsKLSAgICB9IGNhdGNoKC4uLikgewotICAgICAgcHJpbnRmKCIgIGV4Y2VwdGlvblxuRkFJTFVSRVxuIik7Ci0gICAgICBmYWlsQ291bnQrKzsKKyAgICAgIGNvdXQgPDwgIiAgdm9pZCIgPDwgZW5kbDsKKyAgICB9IGNhdGNoIChleGNlcHRpb24gJiBleCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfRVhDRVBUSU9OUzsKICAgICB9CiAKICAgICAvKiB0ZXN0IG11bHRpIGV4Y2VwdGlvbiAqLwogCiAgICAgdHJ5IHsKLSAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIpOworICAgICAgY291dCA8PCAidGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCBcInRlc3QgMVwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAiWGNlcHRpb24iLCAidGVzdCAxIik7Ci0gICAgICBwcmludGYoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKLSAgICAgIGZhaWxDb3VudCsrOwotICAgIH0gY2F0Y2goWGNlcHRpb24mIGUpIHsKKyAgICAgIGNvdXQgPDwgIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0gY2F0Y2ggKFhjZXB0aW9uJiBlKSB7CiAgICAgICBwcmludGYoIiAgeyV1LCBcIiVzXCJ9XG4iLCBlLmVycm9yQ29kZSwgZS5tZXNzYWdlLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHRyeSB7Ci0gICAgICBwcmludGYoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIFwidGVzdCAyXCIpID0+Iik7CisgICAgICBjb3V0IDw8ICJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCBcInRlc3QgMlwiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAiWGNlcHRpb24yIiwgInRlc3QgMiIpOwotICAgICAgcHJpbnRmKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7Ci0gICAgICBmYWlsQ291bnQrKzsKKyAgICAgIGNvdXQgPDwgIiAgcmVzdWx0XG4qKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogCi0gICAgfSBjYXRjaChYY2VwdGlvbjImIGUpIHsKKyAgICB9IGNhdGNoIChYY2VwdGlvbjImIGUpIHsKICAgICAgIHByaW50ZigiICB7JXUsIHtcIiVzXCJ9fVxuIiwgZS5lcnJvckNvZGUsIGUuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZy5jX3N0cigpKTsKICAgICB9CiAKICAgICB0cnkgewotICAgICAgcHJpbnRmKCJ0ZXN0Q2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJ0ZXN0IDNcIikgPT4iKTsKKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIgPDwgZmx1c2g7CiAgICAgICBYdHJ1Y3QgcmVzdWx0OwogICAgICAgdGVzdENsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24ocmVzdWx0LCAic3VjY2VzcyIsICJ0ZXN0IDMiKTsKICAgICAgIHByaW50ZigiICB7e1wiJXNcIn19XG4iLCByZXN1bHQuc3RyaW5nX3RoaW5nLmNfc3RyKCkpOwotICAgIH0gY2F0Y2goLi4uKSB7Ci0gICAgICBwcmludGYoIiAgZXhjZXB0aW9uXG5GQUlMVVJFXG4iKTsKLSAgICAgIGZhaWxDb3VudCsrOworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiAmIGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbCA8PCBleC53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOwogICAgIH0KIAogICAgIC8qIHRlc3Qgb25ld2F5IHZvaWQgKi8KICAgICB7Ci0gICAgICAgIHByaW50ZigidGVzdENsaWVudC50ZXN0T25ld2F5KDMpID0+Iik7Ci0gICAgICAgIHVpbnQ2NF90IHN0YXJ0T25ld2F5ID0gbm93KCk7Ci0gICAgICAgIHRlc3RDbGllbnQudGVzdE9uZXdheSgzKTsKLSAgICAgICAgdWludDY0X3QgZWxhcHNlZCA9IG5vdygpIC0gc3RhcnRPbmV3YXk7Ci0gICAgICAgIGlmIChlbGFwc2VkID4gMjAwICogMTAwMCkgeyAvLyAwLjIgc2Vjb25kcwotICAgICAgICAgICAgcHJpbnRmKCIgIEZBSUxVUkUgLSB0b29rICUuMmYgbXNcbiIsIChkb3VibGUpZWxhcHNlZC8xMDAwLjApOwotICAgICAgICAgICAgZmFpbENvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkLzEwMDAuMCk7Ci0gICAgICAgIH0KKyAgICAgIGNvdXQgPDwgInRlc3RDbGllbnQudGVzdE9uZXdheSgxKSA9PiIgPDwgZmx1c2g7CisgICAgICB1aW50NjRfdCBzdGFydE9uZXdheSA9IG5vdygpOworICAgICAgdGVzdENsaWVudC50ZXN0T25ld2F5KDEpOworICAgICAgdWludDY0X3QgZWxhcHNlZCA9IG5vdygpIC0gc3RhcnRPbmV3YXk7CisgICAgICBpZiAoZWxhcHNlZCA+IDIwMCAqIDEwMDApIHsgLy8gMC4yIHNlY29uZHMKKyAgICAgICAgcHJpbnRmKCIqKiogRkFJTEVEICoqKiAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkIC8gMTAwMC4wKTsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIiAgc3VjY2VzcyAtIHRvb2sgJS4yZiBtc1xuIiwgKGRvdWJsZSllbGFwc2VkIC8gMTAwMC4wKTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTY0NSwxNyArMTA4MSwxOCBAQAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgcHJpbnRmKCJyZS10ZXN0IHRlc3RJMzIoLTEpIik7Ci0gICAgaTMyID0gdGVzdENsaWVudC50ZXN0STMyKC0xKTsKLSAgICBwcmludGYoIiA9ICVkXG4iLCBpMzIpOworICAgIGNvdXQgPDwgInJlLXRlc3QgdGVzdEkzMigtMSkiIDw8IGZsdXNoOworICAgIGludCBpMzIgPSB0ZXN0Q2xpZW50LnRlc3RJMzIoLTEpOworICAgIGNvdXQgPDwgIiA9ICIgPDwgaTMyIDw8IGVuZGw7CiAgICAgaWYgKGkzMiAhPSAtMSkKLSAgICAgICAgZmFpbENvdW50Kys7CisgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwogCisgICAgY291dCA8PCBlbmRsIDw8ICJBbGwgdGVzdHMgZG9uZS4iIDw8IGVuZGwgPDwgZmx1c2g7CiAKICAgICB1aW50NjRfdCBzdG9wID0gbm93KCk7Ci0gICAgdWludDY0X3QgdG90ID0gc3RvcC1zdGFydDsKKyAgICB1aW50NjRfdCB0b3QgPSBzdG9wIC0gc3RhcnQ7CiAKLSAgICBwcmludGYoIlRvdGFsIHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgc3RvcC1zdGFydCk7CisgICAgY291dCA8PCAiVG90YWwgdGltZTogIiA8PCBzdG9wIC0gc3RhcnQgPDwgIiB1cyIgPDwgZW5kbDsKIAogICAgIHRpbWVfdG90ICs9IHRvdDsKICAgICBpZiAodGltZV9taW4gPT0gMCB8fCB0b3QgPCB0aW1lX21pbikgewpAQCAtNjY1LDE3ICsxMTAyLDc5IEBACiAgICAgICB0aW1lX21heCA9IHRvdDsKICAgICB9CiAKKyAgICBjb3V0IDw8IGZsdXNoOwogICAgIHRyYW5zcG9ydC0+Y2xvc2UoKTsKICAgfQogCi0gIC8vICBwcmludGYoIlxuU29ja2V0IHN5c2NhbGxzOiAldSIsIGdfc29ja2V0X3N5c2NhbGxzKTsKLSAgcHJpbnRmKCJcbkFsbCB0ZXN0cyBkb25lLlxuIik7CiAKICAgdWludDY0X3QgdGltZV9hdmcgPSB0aW1lX3RvdCAvIG51bVRlc3RzOwogCi0gIHByaW50ZigiTWluIHRpbWU6ICUiUFJJdTY0IiB1c1xuIiwgdGltZV9taW4pOwotICBwcmludGYoIk1heCB0aW1lOiAlIlBSSXU2NCIgdXNcbiIsIHRpbWVfbWF4KTsKLSAgcHJpbnRmKCJBdmcgdGltZTogJSJQUkl1NjQiIHVzXG4iLCB0aW1lX2F2Zyk7CisgIGNvdXQgPDwgIk1pbiB0aW1lOiAiIDw8IHRpbWVfbWluIDw8ICIgdXMiIDw8IGVuZGw7CisgIGNvdXQgPDwgIk1heCB0aW1lOiAiIDw8IHRpbWVfbWF4IDw8ICIgdXMiIDw8IGVuZGw7CisgIGNvdXQgPDwgIkF2ZyB0aW1lOiAiIDw8IHRpbWVfYXZnIDw8ICIgdXMiIDw8IGVuZGw7CiAKLSAgcmV0dXJuIGZhaWxDb3VudDsKKyAgcmV0dXJuIHJldHVybl9jb2RlOworfQorCit2b2lkIGJpbmFyeV9maWxsKHN0ZDo6c3RyaW5nJiBzdHIsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgYmluX2RhdGFbMjU2XQorICAgICAgICA9IHstMTI4LCAtMTI3LCAtMTI2LCAtMTI1LCAtMTI0LCAtMTIzLCAtMTIyLCAtMTIxLCAtMTIwLCAtMTE5LCAtMTE4LCAtMTE3LCAtMTE2LCAtMTE1LCAtMTE0LAorICAgICAgICAgICAtMTEzLCAtMTEyLCAtMTExLCAtMTEwLCAtMTA5LCAtMTA4LCAtMTA3LCAtMTA2LCAtMTA1LCAtMTA0LCAtMTAzLCAtMTAyLCAtMTAxLCAtMTAwLCAtOTksCisgICAgICAgICAgIC05OCwgIC05NywgIC05NiwgIC05NSwgIC05NCwgIC05MywgIC05MiwgIC05MSwgIC05MCwgIC04OSwgIC04OCwgIC04NywgIC04NiwgIC04NSwgIC04NCwKKyAgICAgICAgICAgLTgzLCAgLTgyLCAgLTgxLCAgLTgwLCAgLTc5LCAgLTc4LCAgLTc3LCAgLTc2LCAgLTc1LCAgLTc0LCAgLTczLCAgLTcyLCAgLTcxLCAgLTcwLCAgLTY5LAorICAgICAgICAgICAtNjgsICAtNjcsICAtNjYsICAtNjUsICAtNjQsICAtNjMsICAtNjIsICAtNjEsICAtNjAsICAtNTksICAtNTgsICAtNTcsICAtNTYsICAtNTUsICAtNTQsCisgICAgICAgICAgIC01MywgIC01MiwgIC01MSwgIC01MCwgIC00OSwgIC00OCwgIC00NywgIC00NiwgIC00NSwgIC00NCwgIC00MywgIC00MiwgIC00MSwgIC00MCwgIC0zOSwKKyAgICAgICAgICAgLTM4LCAgLTM3LCAgLTM2LCAgLTM1LCAgLTM0LCAgLTMzLCAgLTMyLCAgLTMxLCAgLTMwLCAgLTI5LCAgLTI4LCAgLTI3LCAgLTI2LCAgLTI1LCAgLTI0LAorICAgICAgICAgICAtMjMsICAtMjIsICAtMjEsICAtMjAsICAtMTksICAtMTgsICAtMTcsICAtMTYsICAtMTUsICAtMTQsICAtMTMsICAtMTIsICAtMTEsICAtMTAsICAtOSwKKyAgICAgICAgICAgLTgsICAgLTcsICAgLTYsICAgLTUsICAgLTQsICAgLTMsICAgLTIsICAgLTEsICAgMCwgICAgMSwgICAgMiwgICAgMywgICAgNCwgICAgNSwgICAgNiwKKyAgICAgICAgICAgNywgICAgOCwgICAgOSwgICAgMTAsICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTUsICAgMTYsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjEsCisgICAgICAgICAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDM2LAorICAgICAgICAgICAzNywgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0NCwgICA0NSwgICA0NiwgICA0NywgICA0OCwgICA0OSwgICA1MCwgICA1MSwKKyAgICAgICAgICAgNTIsICAgNTMsICAgNTQsICAgNTUsICAgNTYsICAgNTcsICAgNTgsICAgNTksICAgNjAsICAgNjEsICAgNjIsICAgNjMsICAgNjQsICAgNjUsICAgNjYsCisgICAgICAgICAgIDY3LCAgIDY4LCAgIDY5LCAgIDcwLCAgIDcxLCAgIDcyLCAgIDczLCAgIDc0LCAgIDc1LCAgIDc2LCAgIDc3LCAgIDc4LCAgIDc5LCAgIDgwLCAgIDgxLAorICAgICAgICAgICA4MiwgICA4MywgICA4NCwgICA4NSwgICA4NiwgICA4NywgICA4OCwgICA4OSwgICA5MCwgICA5MSwgICA5MiwgICA5MywgICA5NCwgICA5NSwgICA5NiwKKyAgICAgICAgICAgOTcsICAgOTgsICAgOTksICAgMTAwLCAgMTAxLCAgMTAyLCAgMTAzLCAgMTA0LCAgMTA1LCAgMTA2LCAgMTA3LCAgMTA4LCAgMTA5LCAgMTEwLCAgMTExLAorICAgICAgICAgICAxMTIsICAxMTMsICAxMTQsICAxMTUsICAxMTYsICAxMTcsICAxMTgsICAxMTksICAxMjAsICAxMjEsICAxMjIsICAxMjMsICAxMjQsICAxMjUsICAxMjYsCisgICAgICAgICAgIDEyN307CisKKyAgICBzdHIucmVzaXplKHNpeik7CisgICAgY2hhciAqcHRyID0gJnN0clswXTsKKyAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSAwOworICAgIGZvciAoc3RyaW5nOjpzaXplX3R5cGUgaSA9IDA7IGkgPCBzaXo7ICsraSkKKyAgICB7CisgICAgICAgIGlmIChwb3MgPT0gMjU1KSB7IHBvcyA9IDA7IH0gZWxzZSB7ICsrcG9zOyB9CisgICAgICAgICpwdHIrKyA9IGJpbl9kYXRhW3Bvc107CisgICAgfQorfQorCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KQoreworICAgIHN0cmluZyBiaW5fcmVxdWVzdDsKKyAgICBzdHJpbmcgYmluX3Jlc3VsdDsKKworICAgIGNvdXQgPDwgInRlc3RCaW5hcnkoc2l6ID0gIiA8PCBzaXogPDwgIikiIDw8IGVuZGw7CisgICAgYmluYXJ5X2ZpbGwoYmluX3JlcXVlc3QsIHNpeik7CisgICAgdHJ5IHsKKyAgICAgICAgdGVzdENsaWVudC50ZXN0QmluYXJ5KGJpbl9yZXN1bHQsIGJpbl9yZXF1ZXN0KTsKKworICAgICAgICBpZiAoYmluX3JlcXVlc3Quc2l6ZSgpICE9IGJpbl9yZXN1bHQuc2l6ZSgpKSB7CisgICAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEOiByZXF1ZXN0IHNpemUgIiA8PCBiaW5fcmVxdWVzdC5zaXplKCkgPDwgIjsgcmVzdWx0IHNpemUgIiA8PCBiaW5fcmVzdWx0LnNpemUoKSA8PCBlbmRsOworICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChiaW5fcmVxdWVzdC5hdChpKSAhPSBiaW5fcmVzdWx0LmF0KGkpKSB7CisgICAgICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogYXQgcG9zaXRpb24gIiA8PCBpIDw8ICIgcmVxdWVzdFtpXSBpcyBoIiA8PCBoZXggPDwgYmluX3JlcXVlc3QuYXQoaSkgPDwgIiByZXN1bHRbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXN1bHQuYXQoaSkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIHRocm93OworICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKKyAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7CisgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgIH0KKworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCmluZGV4IGM5OWZiYWMuLjYyMjIwMTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKQEAgLTE3LDYxICsxNyw5MyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KLSNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgIlNlY29uZFNlcnZpY2UuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0LmgiCiAKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgPGJvb3N0L2FsZ29yaXRobS9zdHJpbmcuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+CiAKLSNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZiBfV0lOMzIKKyNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgorI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci11c2luZyBuYW1lc3BhY2UgYm9vc3Q7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKKwogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKLSBwdWJsaWM6CitwdWJsaWM6CiAgIFRlc3RIYW5kbGVyKCkge30KIAotICB2b2lkIHRlc3RWb2lkKCkgewotICAgIHByaW50ZigidGVzdFZvaWQoKVxuIik7Ci0gIH0KKyAgdm9pZCB0ZXN0Vm9pZCgpIHsgcHJpbnRmKCJ0ZXN0Vm9pZCgpXG4iKTsgfQogCi0gIHZvaWQgdGVzdFN0cmluZyhzdHJpbmcmIG91dCwgY29uc3Qgc3RyaW5nICZ0aGluZykgeworICB2b2lkIHRlc3RTdHJpbmcoc3RyaW5nJiBvdXQsIGNvbnN0IHN0cmluZyYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTdHJpbmcoXCIlc1wiKVxuIiwgdGhpbmcuY19zdHIoKSk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAorICBib29sIHRlc3RCb29sKGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RCb29sKCVzKVxuIiwgdGhpbmcgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICByZXR1cm4gdGhpbmc7CisgIH0KKwogICBpbnQ4X3QgdGVzdEJ5dGUoY29uc3QgaW50OF90IHRoaW5nKSB7CiAgICAgcHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIChpbnQpdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKQEAgLTgzLDcgKzExNSw3IEBACiAgIH0KIAogICBpbnQ2NF90IHRlc3RJNjQoY29uc3QgaW50NjRfdCB0aGluZykgewotICAgIHByaW50ZigidGVzdEk2NCglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0STY0KCUiIFBSSWQ2NCAiKVxuIiwgdGhpbmcpOwogICAgIHJldHVybiB0aGluZzsKICAgfQogCkBAIC05MiwxOCArMTI0LDM1IEBACiAgICAgcmV0dXJuIHRoaW5nOwogICB9CiAKLSAgdm9pZCB0ZXN0U3RydWN0KFh0cnVjdCYgb3V0LCBjb25zdCBYdHJ1Y3QgJnRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJSJQUklkNjQifSlcbiIsIHRoaW5nLnN0cmluZ190aGluZy5jX3N0cigpLCAoaW50KXRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKTsKKyAgdm9pZCB0ZXN0QmluYXJ5KHN0ZDo6c3RyaW5nJiBfcmV0dXJuLCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gaGV4c3RyOworICAgIGhleHN0ciA8PCBzdGQ6OmhleCA8PCB0aGluZzsKKyAgICBwcmludGYoInRlc3RCaW5hcnkoJWx1OiAlcylcbiIsIHNhZmVfbnVtZXJpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHRoaW5nLnNpemUoKSksIGhleHN0ci5zdHIoKS5jX3N0cigpKTsKKyAgICBfcmV0dXJuID0gdGhpbmc7CisgIH0KKworICB2b2lkIHRlc3RTdHJ1Y3QoWHRydWN0JiBvdXQsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgICBwcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlIiBQUklkNjQgIn0pXG4iLAorICAgICAgICAgICB0aGluZy5zdHJpbmdfdGhpbmcuY19zdHIoKSwKKyAgICAgICAgICAgKGludCl0aGluZy5ieXRlX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pMzJfdGhpbmcsCisgICAgICAgICAgIHRoaW5nLmk2NF90aGluZyk7CiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAogICB2b2lkIHRlc3ROZXN0KFh0cnVjdDImIG91dCwgY29uc3QgWHRydWN0MiYgbmVzdCkgewotICAgIGNvbnN0IFh0cnVjdCAmdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKLSAgICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAlZH0pXG4iLCAoaW50KW5lc3QuYnl0ZV90aGluZywgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksIChpbnQpdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcsIG5lc3QuaTMyX3RoaW5nKTsKKyAgICBjb25zdCBYdHJ1Y3QmIHRoaW5nID0gbmVzdC5zdHJ1Y3RfdGhpbmc7CisgICAgcHJpbnRmKCJ0ZXN0TmVzdCh7JWQsIHtcIiVzXCIsICVkLCAlZCwgJSIgUFJJZDY0ICJ9LCAlZH0pXG4iLAorICAgICAgICAgICAoaW50KW5lc3QuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuc3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgIChpbnQpdGhpbmcuYnl0ZV90aGluZywKKyAgICAgICAgICAgdGhpbmcuaTMyX3RoaW5nLAorICAgICAgICAgICB0aGluZy5pNjRfdGhpbmcsCisgICAgICAgICAgIG5lc3QuaTMyX3RoaW5nKTsKICAgICBvdXQgPSBuZXN0OwogICB9CiAKLSAgdm9pZCB0ZXN0TWFwKG1hcDxpbnQzMl90LCBpbnQzMl90PiAmb3V0LCBjb25zdCBtYXA8aW50MzJfdCwgaW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdE1hcChtYXA8aW50MzJfdCwgaW50MzJfdD4mIG91dCwgY29uc3QgbWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHByaW50ZigidGVzdE1hcCh7Iik7CiAgICAgbWFwPGludDMyX3QsIGludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMTksNyArMTY4LDggQEAKICAgICBvdXQgPSB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFN0cmluZ01hcChtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmb3V0LCBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAmdGhpbmcpIHsKKyAgdm9pZCB0ZXN0U3RyaW5nTWFwKG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBvdXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RNYXAoeyIpOwogICAgIG1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CkBAIC0xMzUsNyArMTg1LDcgQEAKICAgICBvdXQgPSB0aGluZzsKICAgfQogCi0gIHZvaWQgdGVzdFNldChzZXQ8aW50MzJfdD4gJm91dCwgY29uc3Qgc2V0PGludDMyX3Q+ICZ0aGluZykgeworICB2b2lkIHRlc3RTZXQoc2V0PGludDMyX3Q+JiBvdXQsIGNvbnN0IHNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RTZXQoeyIpOwogICAgIHNldDxpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTUxLDcgKzIwMSw3IEBACiAgICAgb3V0ID0gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RMaXN0KHZlY3RvcjxpbnQzMl90PiAmb3V0LCBjb25zdCB2ZWN0b3I8aW50MzJfdD4gJnRoaW5nKSB7CisgIHZvaWQgdGVzdExpc3QodmVjdG9yPGludDMyX3Q+JiBvdXQsIGNvbnN0IHZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBwcmludGYoInRlc3RMaXN0KHsiKTsKICAgICB2ZWN0b3I8aW50MzJfdD46OmNvbnN0X2l0ZXJhdG9yIGxfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKQEAgLTE3Myw1NCArMjIzLDMzIEBACiAgIH0KIAogICBVc2VySWQgdGVzdFR5cGVkZWYoY29uc3QgVXNlcklkIHRoaW5nKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIlBSSWQ2NCIpXG4iLCB0aGluZyk7CisgICAgcHJpbnRmKCJ0ZXN0VHlwZWRlZiglIiBQUklkNjQgIilcbiIsIHRoaW5nKTsKICAgICByZXR1cm4gdGhpbmc7CiAgIH0KIAotICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LGludDMyX3Q+ID4gJm1hcG1hcCwgY29uc3QgaW50MzJfdCBoZWxsbykgeworICB2b2lkIHRlc3RNYXBNYXAobWFwPGludDMyX3QsIG1hcDxpbnQzMl90LCBpbnQzMl90PiA+JiBtYXBtYXAsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKICAgICBwcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbyk7CiAKLSAgICBtYXA8aW50MzJfdCxpbnQzMl90PiBwb3M7Ci0gICAgbWFwPGludDMyX3QsaW50MzJfdD4gbmVnOworICAgIG1hcDxpbnQzMl90LCBpbnQzMl90PiBwb3M7CisgICAgbWFwPGludDMyX3QsIGludDMyX3Q+IG5lZzsKICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewotICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSxpKSk7Ci0gICAgICBuZWcuaW5zZXJ0KG1ha2VfcGFpcigtaSwtaSkpOworICAgICAgcG9zLmluc2VydChtYWtlX3BhaXIoaSwgaSkpOworICAgICAgbmVnLmluc2VydChtYWtlX3BhaXIoLWksIC1pKSk7CiAgICAgfQogCiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoNCwgcG9zKSk7CiAgICAgbWFwbWFwLmluc2VydChtYWtlX3BhaXIoLTQsIG5lZykpOwotCiAgIH0KIAotICB2b2lkIHRlc3RJbnNhbml0eShtYXA8VXNlcklkLCBtYXA8TnVtYmVyejo6dHlwZSxJbnNhbml0eT4gPiAmaW5zYW5lLCBjb25zdCBJbnNhbml0eSAmYXJndW1lbnQpIHsKLSAgICAodm9pZCkgYXJndW1lbnQ7CisgIHZvaWQgdGVzdEluc2FuaXR5KG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiYgaW5zYW5lLCBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIHsKICAgICBwcmludGYoInRlc3RJbnNhbml0eSgpXG4iKTsKIAotICAgIFh0cnVjdCBoZWxsbzsKLSAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLSAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0KLSAgICBYdHJ1Y3QgZ29vZGJ5ZTsKLSAgICBnb29kYnllLnN0cmluZ190aGluZyA9ICJHb29kYnllNCI7Ci0gICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKLSAgICBnb29kYnllLmkzMl90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pNjRfdGhpbmcgPSA0OwotCi0gICAgSW5zYW5pdHkgY3Jhenk7Ci0gICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkVJR0hULCA4KSk7Ci0gICAgY3JhenkueHRydWN0cy5wdXNoX2JhY2soZ29vZGJ5ZSk7Ci0KICAgICBJbnNhbml0eSBsb29uZXk7Ci0gICAgY3JhenkudXNlck1hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OkZJVkUsIDUpKTsKLSAgICBjcmF6eS54dHJ1Y3RzLnB1c2hfYmFjayhoZWxsbyk7Ci0KICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IGZpcnN0X21hcDsKICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+IHNlY29uZF9tYXA7CiAKLSAgICBmaXJzdF9tYXAuaW5zZXJ0KG1ha2VfcGFpcihOdW1iZXJ6OjpUV08sIGNyYXp5KSk7Ci0gICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VEhSRUUsIGNyYXp5KSk7CisgICAgZmlyc3RfbWFwLmluc2VydChtYWtlX3BhaXIoTnVtYmVyejo6VFdPLCBhcmd1bWVudCkpOworICAgIGZpcnN0X21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlRIUkVFLCBhcmd1bWVudCkpOwogCiAgICAgc2Vjb25kX21hcC5pbnNlcnQobWFrZV9wYWlyKE51bWJlcno6OlNJWCwgbG9vbmV5KSk7CiAKQEAgLTIyOSwxOSArMjU4LDE3IEBACiAKICAgICBwcmludGYoInJldHVybiIpOwogICAgIHByaW50ZigiID0geyIpOwotICAgIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CisgICAgbWFwPFVzZXJJZCwgbWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+Ojpjb25zdF9pdGVyYXRvciBpX2l0ZXI7CiAgICAgZm9yIChpX2l0ZXIgPSBpbnNhbmUuYmVnaW4oKTsgaV9pdGVyICE9IGluc2FuZS5lbmQoKTsgKytpX2l0ZXIpIHsKLSAgICAgIHByaW50ZigiJSJQUklkNjQiID0+IHsiLCBpX2l0ZXItPmZpcnN0KTsKLSAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLEluc2FuaXR5Pjo6Y29uc3RfaXRlcmF0b3IgaTJfaXRlcjsKLSAgICAgIGZvciAoaTJfaXRlciA9IGlfaXRlci0+c2Vjb25kLmJlZ2luKCk7Ci0gICAgICAgICAgIGkyX2l0ZXIgIT0gaV9pdGVyLT5zZWNvbmQuZW5kKCk7Ci0gICAgICAgICAgICsraTJfaXRlcikgeworICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIiA9PiB7IiwgaV9pdGVyLT5maXJzdCk7CisgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+Ojpjb25zdF9pdGVyYXRvciBpMl9pdGVyOworICAgICAgZm9yIChpMl9pdGVyID0gaV9pdGVyLT5zZWNvbmQuYmVnaW4oKTsgaTJfaXRlciAhPSBpX2l0ZXItPnNlY29uZC5lbmQoKTsgKytpMl9pdGVyKSB7CiAgICAgICAgIHByaW50ZigiJWQgPT4geyIsIGkyX2l0ZXItPmZpcnN0KTsKICAgICAgICAgbWFwPE51bWJlcno6OnR5cGUsIFVzZXJJZD4gdXNlck1hcCA9IGkyX2l0ZXItPnNlY29uZC51c2VyTWFwOwogICAgICAgICBtYXA8TnVtYmVyejo6dHlwZSwgVXNlcklkPjo6Y29uc3RfaXRlcmF0b3IgdW07CiAgICAgICAgIHByaW50ZigieyIpOwogICAgICAgICBmb3IgKHVtID0gdXNlck1hcC5iZWdpbigpOyB1bSAhPSB1c2VyTWFwLmVuZCgpOyArK3VtKSB7Ci0gICAgICAgICAgcHJpbnRmKCIlZCA9PiAlIlBSSWQ2NCIsICIsIHVtLT5maXJzdCwgdW0tPnNlY29uZCk7CisgICAgICAgICAgcHJpbnRmKCIlZCA9PiAlIiBQUklkNjQgIiwgIiwgdW0tPmZpcnN0LCB1bS0+c2Vjb25kKTsKICAgICAgICAgfQogICAgICAgICBwcmludGYoIn0sICIpOwogCkBAIC0yNDksNyArMjc2LDExIEBACiAgICAgICAgIHZlY3RvcjxYdHJ1Y3Q+Ojpjb25zdF9pdGVyYXRvciB4OwogICAgICAgICBwcmludGYoInsiKTsKICAgICAgICAgZm9yICh4ID0geHRydWN0cy5iZWdpbigpOyB4ICE9IHh0cnVjdHMuZW5kKCk7ICsreCkgewotICAgICAgICAgIHByaW50Zigie1wiJXNcIiwgJWQsICVkLCAlIlBSSWQ2NCJ9LCAiLCB4LT5zdHJpbmdfdGhpbmcuY19zdHIoKSwgKGludCl4LT5ieXRlX3RoaW5nLCB4LT5pMzJfdGhpbmcsIHgtPmk2NF90aGluZyk7CisgICAgICAgICAgcHJpbnRmKCJ7XCIlc1wiLCAlZCwgJWQsICUiIFBSSWQ2NCAifSwgIiwKKyAgICAgICAgICAgICAgICAgeC0+c3RyaW5nX3RoaW5nLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIChpbnQpeC0+Ynl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgeC0+aTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICB4LT5pNjRfdGhpbmcpOwogICAgICAgICB9CiAgICAgICAgIHByaW50ZigifSIpOwogCkBAIC0yNTgsMTUgKzI4OSwxOSBAQAogICAgICAgcHJpbnRmKCJ9LCAiKTsKICAgICB9CiAgICAgcHJpbnRmKCJ9XG4iKTsKLQotCiAgIH0KIAotICB2b2lkIHRlc3RNdWx0aShYdHJ1Y3QgJmhlbGxvLCBjb25zdCBpbnQ4X3QgYXJnMCwgY29uc3QgaW50MzJfdCBhcmcxLCBjb25zdCBpbnQ2NF90IGFyZzIsIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiAgJmFyZzMsIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwgY29uc3QgVXNlcklkIGFyZzUpIHsKLSAgICAodm9pZCkgYXJnMzsKLSAgICAodm9pZCkgYXJnNDsKLSAgICAodm9pZCkgYXJnNTsKLSAgICAKKyAgdm9pZCB0ZXN0TXVsdGkoWHRydWN0JiBoZWxsbywKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IGFyZzAsCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYXJnMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhcmcyLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQxNl90LCBzdGQ6OnN0cmluZz4mIGFyZzMsCisgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwKKyAgICAgICAgICAgICAgICAgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgICAodm9pZClhcmczOworICAgICh2b2lkKWFyZzQ7CisgICAgKHZvaWQpYXJnNTsKKwogICAgIHByaW50ZigidGVzdE11bHRpKClcbiIpOwogCiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CkBAIC0yNzUsOSArMzEwLDcgQEAKICAgICBoZWxsby5pNjRfdGhpbmcgPSAoaW50NjRfdClhcmcyOwogICB9CiAKLSAgdm9pZCB0ZXN0RXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcpCi0gICAgdGhyb3coWGNlcHRpb24sIGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uKQotICB7CisgIHZvaWQgdGVzdEV4Y2VwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgYXJnKSB7CiAgICAgcHJpbnRmKCJ0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnLmNfc3RyKCkpOwogICAgIGlmIChhcmcuY29tcGFyZSgiWGNlcHRpb24iKSA9PSAwKSB7CiAgICAgICBYY2VwdGlvbiBlOwpAQCAtMjk0LDcgKzMyNyw5IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oWHRydWN0ICZyZXN1bHQsIGNvbnN0IHN0ZDo6c3RyaW5nICZhcmcwLCBjb25zdCBzdGQ6OnN0cmluZyAmYXJnMSkgdGhyb3coWGNlcHRpb24sIFhjZXB0aW9uMikgeworICB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihYdHJ1Y3QmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcxKSB7CiAKICAgICBwcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLmNfc3RyKCksIGFyZzEuY19zdHIoKSk7CiAKQEAgLTMxNCwzNSArMzQ5LDM1IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCB0ZXN0T25ld2F5KGludCBzbGVlcEZvcikgewotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IFNsZWVwaW5nLi4uXG4iLCBzbGVlcEZvcik7Ci0gICAgc2xlZXAoc2xlZXBGb3IpOwotICAgIHByaW50ZigidGVzdE9uZXdheSglZCk6IGRvbmUgc2xlZXBpbmchXG4iLCBzbGVlcEZvcik7CisgIHZvaWQgdGVzdE9uZXdheShjb25zdCBpbnQzMl90IGFOdW0pIHsKKyAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBjYWxsIHJlY2VpdmVkXG4iLCBhTnVtKTsKICAgfQogfTsKIAorY2xhc3MgU2Vjb25kSGFuZGxlciA6IHB1YmxpYyBTZWNvbmRTZXJ2aWNlSWYKK3sKKyAgcHVibGljOgorICAgIHZvaWQgc2Vjb25kdGVzdFN0cmluZyhzdGQ6OnN0cmluZyYgcmVzdWx0LCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpCisgICAgeyByZXN1bHQgPSAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9Cit9OwogCiBjbGFzcyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyIDogcHVibGljIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgewogICB2aXJ0dWFsIHZvaWQqIGdldENvbnRleHQoY29uc3QgY2hhciogZm5fbmFtZSwgdm9pZCogc2VydmVyQ29udGV4dCkgewotICAgICh2b2lkKSBzZXJ2ZXJDb250ZXh0OworICAgICh2b2lkKXNlcnZlckNvbnRleHQ7CiAgICAgcmV0dXJuIG5ldyBzdGQ6OnN0cmluZyhmbl9uYW1lKTsKICAgfQogICB2aXJ0dWFsIHZvaWQgZnJlZUNvbnRleHQodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lKSB7Ci0gICAgKHZvaWQpIGZuX25hbWU7CisgICAgKHZvaWQpZm5fbmFtZTsKICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihjdHgpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCBwcmVSZWFkKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgIGNvbW11bmljYXRlKCJwcmVSZWFkIiwgY3R4LCBmbl9uYW1lKTsKLSAgfQorICB2aXJ0dWFsIHZvaWQgcHJlUmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsgY29tbXVuaWNhdGUoInByZVJlYWQiLCBjdHgsIGZuX25hbWUpOyB9CiAgIHZpcnR1YWwgdm9pZCBwb3N0UmVhZCh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUsIHVpbnQzMl90IGJ5dGVzKSB7Ci0gICAgKHZvaWQpIGJ5dGVzOworICAgICh2b2lkKWJ5dGVzOwogICAgIGNvbW11bmljYXRlKCJwb3N0UmVhZCIsIGN0eCwgZm5fbmFtZSk7CiAgIH0KLSAgdmlydHVhbCB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgewotICAgIGNvbW11bmljYXRlKCJwcmVXcml0ZSIsIGN0eCwgZm5fbmFtZSk7Ci0gIH0KKyAgdmlydHVhbCB2b2lkIHByZVdyaXRlKHZvaWQqIGN0eCwgY29uc3QgY2hhciogZm5fbmFtZSkgeyBjb21tdW5pY2F0ZSgicHJlV3JpdGUiLCBjdHgsIGZuX25hbWUpOyB9CiAgIHZpcnR1YWwgdm9pZCBwb3N0V3JpdGUodm9pZCogY3R4LCBjb25zdCBjaGFyKiBmbl9uYW1lLCB1aW50MzJfdCBieXRlcykgewotICAgICh2b2lkKSBieXRlczsKKyAgICAodm9pZClieXRlczsKICAgICBjb21tdW5pY2F0ZSgicG9zdFdyaXRlIiwgY3R4LCBmbl9uYW1lKTsKICAgfQogICB2aXJ0dWFsIHZvaWQgYXN5bmNDb21wbGV0ZSh2b2lkKiBjdHgsIGNvbnN0IGNoYXIqIGZuX25hbWUpIHsKQEAgLTM1NywxNzUgKzM5MiwyMjAgQEAKICAgfQogfTsKIAotCiBjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogcHVibGljIFRocmlmdFRlc3RDb2JTdklmIHsKIHB1YmxpYzoKLSAgVGVzdEhhbmRsZXJBc3luYyhib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4mIGhhbmRsZXIpIDogX2RlbGVnYXRlKGhhbmRsZXIpIHt9CisgIFRlc3RIYW5kbGVyQXN5bmMoc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiYgaGFuZGxlcikgOiBfZGVsZWdhdGUoaGFuZGxlcikge30KICAgdmlydHVhbCB+VGVzdEhhbmRsZXJBc3luYygpIHt9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RWb2lkKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgeworICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgewogICAgIF9kZWxlZ2F0ZS0+dGVzdFZvaWQoKTsKICAgICBjb2IoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmcoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKICAgICBzdGQ6OnN0cmluZyByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U3RyaW5nKHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RCeXRlKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGludDhfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50OF90IHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0Qm9vbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgYm9vbCB0aGluZykgeworICAgIGJvb2wgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qm9vbCh0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdEJ5dGUoc3RkOjpmdW5jdGlvbjx2b2lkKGludDhfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50OF90IHRoaW5nKSB7CiAgICAgaW50OF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEJ5dGUodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RJMzIoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50MzJfdCB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEkzMihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50MzJfdCB0aGluZykgewogICAgIGludDMyX3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0STMyKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0STY0KHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RJNjQoc3RkOjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKICAgICBpbnQ2NF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEk2NCh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdERvdWJsZShzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChkb3VibGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGRvdWJsZSB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdERvdWJsZShzdGQ6OmZ1bmN0aW9uPHZvaWQoZG91YmxlIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBkb3VibGUgdGhpbmcpIHsKICAgICBkb3VibGUgcmVzID0gX2RlbGVnYXRlLT50ZXN0RG91YmxlKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U3RydWN0KHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEJpbmFyeShzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0aGluZykgeworICAgIHN0ZDo6c3RyaW5nIHJlczsKKyAgICBfZGVsZWdhdGUtPnRlc3RCaW5hcnkocmVzLCB0aGluZyk7CisgICAgY29iKHJlcyk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cnVjdChzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QmIHRoaW5nKSB7CiAgICAgWHRydWN0IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJ1Y3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE5lc3Qoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoWHRydWN0MiBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0MiYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QyIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QyJiB0aGluZykgewogICAgIFh0cnVjdDIgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE5lc3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE1hcChzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ICYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RNYXAoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TWFwKHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmdNYXAoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFN0cmluZ01hcCgKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgdGhpbmcpIHsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RTdHJpbmdNYXAocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdFNldChzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChzdGQ6OnNldDxpbnQzMl90PiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IHN0ZDo6c2V0PGludDMyX3Q+ICYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RTZXQoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6OnNldDxpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U2V0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RMaXN0KHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludDMyX3Q+ICBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gJiB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdExpc3Qoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIHRoaW5nKSB7CiAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdExpc3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEVudW0oc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoTnVtYmVyejo6dHlwZSBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgTnVtYmVyejo6dHlwZSB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdEVudW0oc3RkOjpmdW5jdGlvbjx2b2lkKE51bWJlcno6OnR5cGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOdW1iZXJ6Ojp0eXBlIHRoaW5nKSB7CiAgICAgTnVtYmVyejo6dHlwZSByZXMgPSBfZGVsZWdhdGUtPnRlc3RFbnVtKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0VHlwZWRlZihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChVc2VySWQgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFVzZXJJZCB0aGluZykgeworICB2aXJ0dWFsIHZvaWQgdGVzdFR5cGVkZWYoc3RkOjpmdW5jdGlvbjx2b2lkKFVzZXJJZCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgVXNlcklkIHRoaW5nKSB7CiAgICAgVXNlcklkIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdFR5cGVkZWYodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNYXBNYXAoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiAgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RNYXBNYXAoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIGNvbnN0IGludDMyX3QgaGVsbG8pIHsKICAgICBzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNYXBNYXAocmVzLCBoZWxsbyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEluc2FuaXR5KHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBJbnNhbml0eSYgYXJndW1lbnQpIHsKLSAgICBzdGQ6Om1hcDxVc2VySWQsIHN0ZDo6bWFwPE51bWJlcno6OnR5cGUsIEluc2FuaXR5PiA+IHJlczsgCisgIHZpcnR1YWwgdm9pZCB0ZXN0SW5zYW5pdHkoCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgICAgIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgeworICAgIHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdEluc2FuaXR5KHJlcywgYXJndW1lbnQpOwogICAgIGNvYihyZXMpOwotIH0KKyAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGkoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgYXJnMCwgY29uc3QgaW50MzJfdCBhcmcxLCBjb25zdCBpbnQ2NF90IGFyZzIsIGNvbnN0IHN0ZDo6bWFwPGludDE2X3QsIHN0ZDo6c3RyaW5nPiAmIGFyZzMsIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwgY29uc3QgVXNlcklkIGFyZzUpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aShzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8aW50MTZfdCwgc3RkOjpzdHJpbmc+JiBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVc2VySWQgYXJnNSkgewogICAgIFh0cnVjdCByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TXVsdGkocmVzLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RXhjZXB0aW9uKHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RFeGNlcHRpb24oCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZykgewogICAgIHRyeSB7CiAgICAgICBfZGVsZWdhdGUtPnRlc3RFeGNlcHRpb24oYXJnKTsKLSAgICB9IGNhdGNoKGNvbnN0IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uJiBlKSB7CisgICAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKICAgICAgIGV4bl9jb2IoYXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihlKSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvYigpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbihzdGQ6OnRyMTo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIHN0ZDo6dHIxOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzEpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aUV4Y2VwdGlvbigKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMCwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcxKSB7CiAgICAgWHRydWN0IHJlczsKICAgICB0cnkgewogICAgICAgX2RlbGVnYXRlLT50ZXN0TXVsdGlFeGNlcHRpb24ocmVzLCBhcmcwLCBhcmcxKTsKLSAgICB9IGNhdGNoKGNvbnN0IGFwYWNoZTo6dGhyaWZ0OjpURXhjZXB0aW9uJiBlKSB7CisgICAgfSBjYXRjaCAoY29uc3QgYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24mIGUpIHsKICAgICAgIGV4bl9jb2IoYXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uOjpkZWxheUV4Y2VwdGlvbihlKSk7CiAgICAgICByZXR1cm47CiAgICAgfQogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkoc3RkOjp0cjE6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBpbnQzMl90IHNlY29uZHNUb1NsZWVwKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0T25ld2F5KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKICAgICBfZGVsZWdhdGUtPnRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXApOwogICAgIGNvYigpOwogICB9CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IF9kZWxlZ2F0ZTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiBfZGVsZWdhdGU7CiB9OwogCituYW1lc3BhY2UgcG8gPSBib29zdDo6cHJvZ3JhbV9vcHRpb25zOwogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworCisgIHN0cmluZyB0ZXN0RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnN5c3RlbV9jb21wbGV0ZShhcmd2WzBdKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5zdHJpbmcoKTsKKyAgc3RyaW5nIGNlcnRQYXRoID0gdGVzdERpciArICIva2V5cy9zZXJ2ZXIuY3J0IjsKKyAgc3RyaW5nIGtleVBhdGggPSB0ZXN0RGlyICsgIi9rZXlzL3NlcnZlci5rZXkiOworCisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIGludCBwb3J0ID0gOTA5MDsKICAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB6bGliID0gZmFsc2U7CiAgIHN0cmluZyB0cmFuc3BvcnRfdHlwZSA9ICJidWZmZXJlZCI7CiAgIHN0cmluZyBwcm90b2NvbF90eXBlID0gImJpbmFyeSI7CiAgIHN0cmluZyBzZXJ2ZXJfdHlwZSA9ICJzaW1wbGUiOwogICBzdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOworICBib29sIGFic3RyYWN0X25hbWVzcGFjZSA9IGZhbHNlOwogICBzaXplX3Qgd29ya2VycyA9IDQ7CisgIGludCBzdHJpbmdfbGltaXQgPSAwOworICBpbnQgY29udGFpbmVyX2xpbWl0ID0gMDsKIAotIAotICBwcm9ncmFtX29wdGlvbnM6Om9wdGlvbnNfZGVzY3JpcHRpb24gZGVzYygiQWxsb3dlZCBvcHRpb25zIik7CisgIHBvOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOwogICBkZXNjLmFkZF9vcHRpb25zKCkKLSAgICAgICgiaGVscCxoIiwgInByb2R1Y2UgaGVscCBtZXNzYWdlIikKLSAgICAgICgicG9ydCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigmcG9ydCktPmRlZmF1bHRfdmFsdWUocG9ydCksICJQb3J0IG51bWJlciB0byBsaXN0ZW4iKQotCSAgKCJkb21haW4tc29ja2V0IiwgcHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KS0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwKLQkgICAgIlVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSIpCi0gICAgICAoInNlcnZlci10eXBlIiwgcHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZzZXJ2ZXJfdHlwZSktPmRlZmF1bHRfdmFsdWUoc2VydmVyX3R5cGUpLAotICAgICAgICAidHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIiKQotICAgICAgKCJ0cmFuc3BvcnQiLCBwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksCi0gICAgICAgICJ0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQotICAgICAgKCJwcm90b2NvbCIsIHByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksCi0gICAgICAgICJwcm90b2NvbDogYmluYXJ5LCBqc29uIikKLQkgICgic3NsIiwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKLQkgICgicHJvY2Vzc29yLWV2ZW50cyIsICJwcm9jZXNzb3ItZXZlbnRzIikKLSAgICAgICgid29ya2VycyxuIiwgcHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzaXplX3Q+KCZ3b3JrZXJzKS0+ZGVmYXVsdF92YWx1ZSh3b3JrZXJzKSwKLSAgICAgICAgIk51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiKQotICA7CisgICAgKCJoZWxwLGgiLCAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKQorICAgICgicG9ydCIsIHBvOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwgIlBvcnQgbnVtYmVyIHRvIGxpc3RlbiIpCisgICAgKCJkb21haW4tc29ja2V0IiwgcG86OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpIC0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwgIlVuaXggRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSIpCisgICAgKCJhYnN0cmFjdC1uYW1lc3BhY2UiLCAiQ3JlYXRlIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKQorICAgICgic2VydmVyLXR5cGUiLCBwbzo6dmFsdWU8c3RyaW5nPigmc2VydmVyX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHNlcnZlcl90eXBlKSwgInR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsIFwidGhyZWFkZWRcIiwgb3IgXCJub25ibG9ja2luZ1wiIikKKyAgICAoInRyYW5zcG9ydCIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZ0cmFuc3BvcnRfdHlwZSktPmRlZmF1bHRfdmFsdWUodHJhbnNwb3J0X3R5cGUpLCAidHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKKyAgICAoInByb3RvY29sIiwgcG86OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLCAicHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWgsIG11bHRpaiIpCisgICAgKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQorICAgICgiemxpYiIsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKKyAgICAoInByb2Nlc3Nvci1ldmVudHMiLCAicHJvY2Vzc29yLWV2ZW50cyIpCisgICAgKCJ3b3JrZXJzLG4iLCBwbzo6dmFsdWU8c2l6ZV90Pigmd29ya2VycyktPmRlZmF1bHRfdmFsdWUod29ya2VycyksICJOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuIE9ubHkgdmFsaWQgZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlIikKKyAgICAoInN0cmluZy1saW1pdCIsIHBvOjp2YWx1ZTxpbnQ+KCZzdHJpbmdfbGltaXQpKQorICAgICgiY29udGFpbmVyLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJmNvbnRhaW5lcl9saW1pdCkpOwogCi0gIHByb2dyYW1fb3B0aW9uczo6dmFyaWFibGVzX21hcCB2bTsKLSAgcHJvZ3JhbV9vcHRpb25zOjpzdG9yZShwcm9ncmFtX29wdGlvbnM6OnBhcnNlX2NvbW1hbmRfbGluZShhcmdjLCBhcmd2LCBkZXNjKSwgdm0pOwotICBwcm9ncmFtX29wdGlvbnM6Om5vdGlmeSh2bSk7ICAgIAorICBwbzo6dmFyaWFibGVzX21hcCB2bTsKKyAgcG86OnN0b3JlKHBvOjpwYXJzZV9jb21tYW5kX2xpbmUoYXJnYywgYXJndiwgZGVzYyksIHZtKTsKKyAgcG86Om5vdGlmeSh2bSk7CiAKICAgaWYgKHZtLmNvdW50KCJoZWxwIikpIHsKLSAgICAgIGNvdXQgPDwgZGVzYyA8PCAiXG4iOwotICAgICAgcmV0dXJuIDE7CisgICAgY291dCA8PCBkZXNjIDw8ICJcbiI7CisgICAgcmV0dXJuIDE7CiAgIH0KLSAgCisKICAgdHJ5IHsKICAgICBpZiAoIXNlcnZlcl90eXBlLmVtcHR5KCkpIHsKICAgICAgIGlmIChzZXJ2ZXJfdHlwZSA9PSAic2ltcGxlIikgewpAQCAtNTMzLDI0ICs2MTMsMzIgQEAKICAgICAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gInRocmVhZGVkIikgewogICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAibm9uYmxvY2tpbmciKSB7CiAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gc2VydmVyIHR5cGUgIitzZXJ2ZXJfdHlwZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghcHJvdG9jb2xfdHlwZS5lbXB0eSgpKSB7Ci0gICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgewotICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgewotICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIitwcm90b2NvbF90eXBlKTsKKyAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBzZXJ2ZXIgdHlwZSAiICsgc2VydmVyX3R5cGUpOwogICAgICAgfQogICAgIH0KIAotCWlmICghdHJhbnNwb3J0X3R5cGUuZW1wdHkoKSkgeworICAgIGlmICghcHJvdG9jb2xfdHlwZS5lbXB0eSgpKSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZSA9PSAiYmluYXJ5IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJjb21wYWN0IikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpIikgeyAgLy8gbXVsdGlwbGV4ZWQgYmluYXJ5CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsgLy8gbXVsdGlwbGV4ZWQgY29tcGFjdAorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWgiKSB7IC8vIG11bHRpcGxleGVkIGhlYWRlcgorICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7IC8vIG11bHRpcGxleGVkIGpzb24KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gcHJvdG9jb2wgdHlwZSAiICsgcHJvdG9jb2xfdHlwZSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0cmFuc3BvcnRfdHlwZS5lbXB0eSgpKSB7CiAgICAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImJ1ZmZlcmVkIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIpIHsKKyAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gInpsaWIiKSB7CisgICAgICAgIC8vIGNyb3NzdGVzdGVyIHdpbGwgcGFzcyB6bGliIGFzIGEgZmxhZyBhbmQgYSB0cmFuc3BvcnQgcmlnaHQgbm93Li4uCiAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIit0cmFuc3BvcnRfdHlwZSk7CisgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIiArIHRyYW5zcG9ydF90eXBlKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTU2MiwxMjMgKzY1MCwxOTYgQEAKIAogICBpZiAodm0uY291bnQoInNzbCIpKSB7CiAgICAgc3NsID0gdHJ1ZTsKLSAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgIH0KKworICBpZiAodm0uY291bnQoInpsaWIiKSkgeworICAgIHpsaWIgPSB0cnVlOworICB9CisKKyNpZiBkZWZpbmVkKEhBVkVfU0lHTkFMX0gpICYmIGRlZmluZWQoU0lHUElQRSkKKyAgaWYgKHNzbCkgeworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLy8gZm9yIE9wZW5TU0wsIG90aGVyd2lzZSB3ZSBlbmQgYWJydXB0bHkKKyAgfQorI2VuZGlmCisKKyAgaWYgKHZtLmNvdW50KCJhYnN0cmFjdC1uYW1lc3BhY2UiKSkgeworICAgIGFic3RyYWN0X25hbWVzcGFjZSA9IHRydWU7CiAgIH0KIAogICAvLyBEaXNwYXRjaGVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeTsKLSAgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4ganNvblByb3RvY29sRmFjdG9yeShuZXcgVEpTT05Qcm90b2NvbEZhY3RvcnkoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7CisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGpzb25Qcm90b2NvbEZhY3RvcnkobmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCkpOwogICAgIHByb3RvY29sRmFjdG9yeSA9IGpzb25Qcm90b2NvbEZhY3Rvcnk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4gKmNvbXBhY3RQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOworICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldENvbnRhaW5lclNpemVMaW1pdChjb250YWluZXJfbGltaXQpOworICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOworICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChjb21wYWN0UHJvdG9jb2xGYWN0b3J5KTsKKyAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiIHx8IHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaGVhZGVyUHJvdG9jb2xGYWN0b3J5KG5ldyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkpOworICAgIHByb3RvY29sRmFjdG9yeSA9IGhlYWRlclByb3RvY29sRmFjdG9yeTsKICAgfSBlbHNlIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBiaW5hcnlQcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpKTsKLSAgICBwcm90b2NvbEZhY3RvcnkgPSBiaW5hcnlQcm90b2NvbEZhY3Rvcnk7CisgICAgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KiBiaW5hcnlQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeVQ8VEJ1ZmZlckJhc2U+KCk7CisgICAgYmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5zZXRDb250YWluZXJTaXplTGltaXQoY29udGFpbmVyX2xpbWl0KTsKKyAgICBiaW5hcnlQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOworICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChiaW5hcnlQcm90b2NvbEZhY3RvcnkpOwogICB9CiAKLSAgLy8gUHJvY2Vzc29yCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKLSAgCisgIC8vIFByb2Nlc3NvcnMKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CisKICAgaWYgKHZtLmNvdW50KCJwcm9jZXNzb3ItZXZlbnRzIikpIHsKLSAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4oCi0gICAgICAgICAgbmV3IFRlc3RQcm9jZXNzb3JFdmVudEhhbmRsZXIoKSkpOworICAgIHRlc3RQcm9jZXNzb3ItPnNldEV2ZW50SGFuZGxlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKICAgfQotICAKKwogICAvLyBUcmFuc3BvcnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHNzbFNvY2tldEZhY3Rvcnk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBzc2xTb2NrZXRGYWN0b3J5OworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OwogCiAgIGlmIChzc2wpIHsKLSAgICBzc2xTb2NrZXRGYWN0b3J5ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKLSAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoIi4vc2VydmVyLWNlcnRpZmljYXRlLnBlbSIpOwotICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KCIuL3NlcnZlci1wcml2YXRlLWtleS5wZW0iKTsKKyAgICBzc2xTb2NrZXRGYWN0b3J5ID0gc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PihuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRQYXRoLmNfc3RyKCkpOworICAgIHNzbFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGtleVBhdGguY19zdHIoKSk7CiAgICAgc3NsU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7Ci0gICAgc2VydmVyU29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIGlmIChzZXJ2ZXJfdHlwZSAhPSAibm9uYmxvY2tpbmciKSB7CisgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkpOworICAgIH0KICAgfSBlbHNlIHsKLQlpZiAoZG9tYWluX3NvY2tldCAhPSAiIikgewotCSAgdW5saW5rKGRvbWFpbl9zb2NrZXQuY19zdHIoKSk7Ci0JICBzZXJ2ZXJTb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChkb21haW5fc29ja2V0KSk7Ci0JICBwb3J0ID0gMDsKLQl9Ci0JZWxzZSB7Ci0gICAgICBzZXJ2ZXJTb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0JfQorICAgIGlmIChkb21haW5fc29ja2V0ICE9ICIiKSB7CisgICAgICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGFic3RyYWN0X3NvY2tldCgiXDAiLCAxKTsKKyAgICAgICAgYWJzdHJhY3Rfc29ja2V0ICs9IGRvbWFpbl9zb2NrZXQ7CisgICAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChhYnN0cmFjdF9zb2NrZXQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVubGluayhkb21haW5fc29ja2V0LmNfc3RyKCkpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgfQorICAgICAgcG9ydCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgfQogICB9CiAKICAgLy8gRmFjdG9yeQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKLSAgCisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKwogICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiICYmIHNlcnZlcl90eXBlICE9ICJub25ibG9ja2luZyIpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gaHR0cFRyYW5zcG9ydEZhY3RvcnkobmV3IFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeSgpKTsgCi0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGh0dHBUcmFuc3BvcnRGYWN0b3J5OworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKTsKICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZnJhbWVkIikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBmcmFtZWRUcmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpKTsgCi0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsgCi0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpOworICB9CisKKyAgaWYgKHpsaWIpIHsKKyAgICAvLyBobW0uLiBkb2Vzbid0IHNlZW0gdG8gYmUgYSB3YXkgdG8gbWFrZSBpdCB3cmFwIHRoZSBvdGhlcnMuLi4KKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0KIAogICAvLyBTZXJ2ZXIgSW5mbwotICBjb3V0IDw8ICJTdGFydGluZyBcIiIgPDwgc2VydmVyX3R5cGUgPDwgIlwiIHNlcnZlciAoIgotICAgIDw8IHRyYW5zcG9ydF90eXBlIDw8ICIvIiA8PCBwcm90b2NvbF90eXBlIDw8ICIpIGxpc3RlbiBvbjogIiA8PCBkb21haW5fc29ja2V0OworICBjb3V0IDw8ICJTdGFydGluZyBcIiIgPDwgc2VydmVyX3R5cGUgPDwgIlwiIHNlcnZlciAoIiA8PCB0cmFuc3BvcnRfdHlwZSA8PCAiLyIgPDwgcHJvdG9jb2xfdHlwZQorICAgICAgIDw8ICIpIGxpc3RlbiBvbjogIjsKKyAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgeworICAgIGNvdXQgPDwgJ0AnOworICB9CisgIGNvdXQgPDwgZG9tYWluX3NvY2tldDsKICAgaWYgKHBvcnQgIT0gMCkgewogICAgIGNvdXQgPDwgcG9ydDsKICAgfQogICBjb3V0IDw8IGVuZGw7CiAKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvY2Vzc29yIGlmIG5lZWRlZAorICBpZiAoYm9vc3Q6OnN0YXJ0c193aXRoKHByb3RvY29sX3R5cGUsICJtdWx0aSIpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlY29uZEhhbmRsZXI+IHNlY29uZEhhbmRsZXIobmV3IFNlY29uZEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlY29uZFNlcnZpY2VQcm9jZXNzb3I+IHNlY29uZFByb2Nlc3NvcihuZXcgU2Vjb25kU2VydmljZVByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE11bHRpcGxleGVkUHJvY2Vzc29yPiBtdWx0aXBsZXhlZFByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOworICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlckRlZmF1bHQodGVzdFByb2Nlc3Nvcik7IC8vIG5vbi1tdWx0aSBjbGllbnRzIGdvIHRvIHRoZSBkZWZhdWx0IHByb2Nlc3NvciAobXVsdGk6YmluYXJ5LCBtdWx0aWM6Y29tcGFjdCwgLi4uKQorICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsIHRlc3RQcm9jZXNzb3IpOworICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsIHNlY29uZFByb2Nlc3Nvcik7CisgICAgdGVzdFByb2Nlc3NvciA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFByb2Nlc3Nvcj4obXVsdGlwbGV4ZWRQcm9jZXNzb3IpOworICB9CisKICAgLy8gU2VydmVyCisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyPiBzZXJ2ZXI7CisKICAgaWYgKHNlcnZlcl90eXBlID09ICJzaW1wbGUiKSB7Ci0gICAgVFNpbXBsZVNlcnZlciBzaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkpOwotCi0gICAgc2ltcGxlU2VydmVyLnNlcnZlKCk7Ci0KKyAgICBzZXJ2ZXIucmVzZXQobmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkLXBvb2wiKSB7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KLSAgICAgIFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIod29ya2Vycyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwotCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlcnMpOwogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCi0gICAgVFRocmVhZFBvb2xTZXJ2ZXIgdGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLAorICAgIHNlcnZlci5yZXNldChuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodGVzdFByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclNvY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRNYW5hZ2VyKTsKLQotICAgIHRocmVhZFBvb2xTZXJ2ZXIuc2VydmUoKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWRlZCIpIHsKLQotICAgIFRUaHJlYWRlZFNlcnZlciB0aHJlYWRlZFNlcnZlcih0ZXN0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KLSAgICB0aHJlYWRlZFNlcnZlci5zZXJ2ZSgpOwotCisgICAgc2VydmVyLnJlc2V0KAorICAgICAgICBuZXcgVFRocmVhZGVkU2VydmVyKHRlc3RQcm9jZXNzb3IsIHNlcnZlclNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0gZWxzZSBpZiAoc2VydmVyX3R5cGUgPT0gIm5vbmJsb2NraW5nIikgewotICAgIGlmKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yQXN5bmMobmV3IFRocmlmdFRlc3RBc3luY1Byb2Nlc3Nvcih0ZXN0SGFuZGxlckFzeW5jKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHRlc3RCdWZmZXJQcm9jZXNzb3IobmV3IFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHRlc3RQcm9jZXNzb3JBc3luYywgcHJvdG9jb2xGYWN0b3J5KSk7Ci0gICAgICAKKyAgICBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKAorICAgICAgICAgIG5ldyBUaHJpZnRUZXN0QXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXJBc3luYykpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gdGVzdEJ1ZmZlclByb2Nlc3NvcigKKyAgICAgICAgICBuZXcgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IodGVzdFByb2Nlc3NvckFzeW5jLCBwcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgLy8gbm90IGxvYWRpbmcgbm9uYmxvY2tpbmdTZXJ2ZXIgaW50byAic2VydmVyIiBiZWNhdXNlCisgICAgICAvLyBURXZodHRwU2VydmVyIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIFRTZXJ2ZXIsIGFuZCBkb2Vzbid0CisgICAgICAvLyBwcm92aWRlIGEgc3RvcCBtZXRob2QuCiAgICAgICBURXZodHRwU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RCdWZmZXJQcm9jZXNzb3IsIHBvcnQpOwogICAgICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKLX0gZWxzZSB7Ci0gICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIgbm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcG9ydCk7Ci0gICAgICBub25ibG9ja2luZ1NlcnZlci5zZXJ2ZSgpOworICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4gbmJTb2NrZXQ7CisgICAgICBuYlNvY2tldC5yZXNldCgKKyAgICAgICAgICBzc2wgPyBuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQocG9ydCwgc3NsU29ja2V0RmFjdG9yeSkKKyAgICAgICAgICAgICAgOiBuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgc2VydmVyLnJlc2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldCkpOworICAgIH0gZWxzZSB7CisgICAgICBjZXJyIDw8ICJzZXJ2ZXItdHlwZSBub25ibG9ja2luZyByZXF1aXJlcyB0cmFuc3BvcnQgb2YgaHR0cCBvciBmcmFtZWQiIDw8IGVuZGw7CisgICAgICBleGl0KDEpOwogICAgIH0KICAgfQogCisgIGlmIChzZXJ2ZXIuZ2V0KCkgIT0gTlVMTCkgeworICAgIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CisgICAgICAvLyBUZWxsIHRoZSBzZXJ2ZXIgdG8gdXNlIHRoZSBzYW1lIHByb3RvY29sIGZvciBpbnB1dCAvIG91dHB1dAorICAgICAgLy8gaWYgdXNpbmcgaGVhZGVyCisgICAgICBzZXJ2ZXItPnNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4oKSk7CisgICAgfQorICAgIAorICAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IGZhY3Rvcnk7CisgICAgZmFjdG9yeS5zZXREZXRhY2hlZChmYWxzZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU+IHNlcnZlclRocmVhZFJ1bm5lcihzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkCisgICAgICAgID0gZmFjdG9yeS5uZXdUaHJlYWQoc2VydmVyVGhyZWFkUnVubmVyKTsKKworI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBzaWduYWxfaGFuZGxlcik7CisjZW5kaWYKKworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBnTW9uaXRvci53YWl0Rm9yZXZlcigpOyAgICAgICAgIC8vIHdhaXQgZm9yIGEgc2h1dGRvd24gc2lnbmFsCisgICAgCisjaWZkZWYgSEFWRV9TSUdOQUxfSAorICAgIHNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworI2VuZGlmCisKKyAgICBzZXJ2ZXItPnN0b3AoKTsKKyAgICB0aHJlYWQtPmpvaW4oKTsKKyAgICBzZXJ2ZXIucmVzZXQoKTsKKyAgfQorCiAgIGNvdXQgPDwgImRvbmUuIiA8PCBlbmRsOwogICByZXR1cm4gMDsKIH0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1RocmlmdFRlc3RfZXh0cmFzLmNwcCBiL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1NjA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3BwL3NyYy9UaHJpZnRUZXN0X2V4dHJhcy5jcHAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yaworCisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCisKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRlc3QgeworCitib29sIEluc2FuaXR5OjpvcGVyYXRvcjwodGhyaWZ0Ojp0ZXN0OjpJbnNhbml0eSBjb25zdCYgb3RoZXIpIGNvbnN0IHsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRocmlmdERlYnVnU3RyaW5nOworICByZXR1cm4gVGhyaWZ0RGVidWdTdHJpbmcoKnRoaXMpIDwgVGhyaWZ0RGVidWdTdHJpbmcob3RoZXIpOworfQorfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9fX2luaXRfXy5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwYjgzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2Zyb20gLnRlc3QgaW1wb3J0IHRlc3RfbmFtZSAgIyBub3FhCitmcm9tIC5jb2xsZWN0IGltcG9ydCBjb2xsZWN0X2Nyb3NzX3Rlc3RzLCBjb2xsZWN0X2ZlYXR1cmVfdGVzdHMgICMgbm9xYQorZnJvbSAucnVuIGltcG9ydCBUZXN0RGlzcGF0Y2hlciAgIyBub3FhCitmcm9tIC5yZXBvcnQgaW1wb3J0IGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzLCBsb2FkX2tub3duX2ZhaWx1cmVzICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ4OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CkBAIC0wLDAgKzEsMTY0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0CisKK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QKK2Zyb20gLnRlc3QgaW1wb3J0IFRlc3RFbnRyeQorCisjIFRob3NlIGtleXMgYXJlIHBhc3NlZCB0byBleGVjdXRpb24gYXMgaXMuCisjIE5vdGUgdGhhdCB0aGVyZSBhcmUga2V5cyBvdGhlciB0aGFuIHRoZXNlLCBuYW1lbHk6CisjIGRlbGF5OiBBZnRlciBzZXJ2ZXIgaXMgc3RhcnRlZCwgY2xpZW50IHN0YXJ0IGlzIGRlbGF5ZWQgZm9yIHRoZSB2YWx1ZQorIyAoc2Vjb25kcykuCisjIHRpbWVvdXQ6IFRlc3QgdGltZW91dCBhZnRlciBjbGllbnQgaXMgc3RhcnRlZCAoc2Vjb25kcykuCisjIHBsYXRmb3JtczogU3VwcG9ydGVkIHBsYXRmb3Jtcy4gU2hvdWxkIG1hdGNoIHBsYXRmb3JtLnN5c3RlbSgpIHZhbHVlLgorIyBwcm90b2NvbHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHByb3RvY29scworIyB0cmFuc3BvcnRzOiBsaXN0IG9mIHN1cHBvcnRlZCB0cmFuc3BvcnRzCisjIHNvY2tldHM6IGxpc3Qgb2Ygc3VwcG9ydGVkIHNvY2tldHMKKyMKKyMgcHJvdG9jb2xzIGFuZCB0cmFuc3BvcnRzIGVudHJpZXMgY2FuIGJlIGNvbG9uIHNlcGFyYXRlZCAic3BlYzppbXBsIiBwYWlyCisjIChlLmcuIGJpbmFyeTphY2NlbCkgd2hlcmUgdGVzdCBpcyBydW4gZm9yIGFueSBtYXRjaGluZyAic3BlYyIgd2hpbGUgYWN0dWFsCisjIGFyZ3VtZW50IHBhc3NlZCB0byB0ZXN0IGV4ZWN1dGFibGUgaXMgImltcGwiLgorIyBPdGhlcndpc2UgInNwZWMiIGlzIGVxdWl2YWxlbnQgdG8gInNwZWM6c3BlYyIgcGFpci4KKyMgKGUuZy4gImJpbmFyeSIgaXMgZXF1aXZhbGVudCB0byAiYmluYXJ5OmJpbmFyeSIgaW4gdGVzdHMuanNvbikKKyMKK1ZBTElEX0pTT05fS0VZUyA9IFsKKyAgICAnbmFtZScsICAjIG5hbWUgb2YgdGhlIGxpYnJhcnksIHR5cGljYWxseSBhIGxhbmd1YWdlIG5hbWUKKyAgICAnd29ya2RpcicsICAjIHdvcmsgZGlyZWN0b3J5IHdoZXJlIGNvbW1hbmQgaXMgZXhlY3V0ZWQKKyAgICAnY29tbWFuZCcsICAjIHRlc3QgY29tbWFuZAorICAgICdleHRyYV9hcmdzJywgICMgYXJncyBhcHBlbmRlZCB0byBjb21tYW5kIGFmdGVyIG90aGVyIGFyZ3MgYXJlIGFwcGVuZGVkCisgICAgJ3JlbW90ZV9hcmdzJywgICMgYXJncyBhZGRlZCB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgcHJvZ3JhbQorICAgICdqb2luX2FyZ3MnLCAgIyB3aGV0aGVyIGFyZ3Mgc2hvdWxkIGJlIHBhc3NlZCBhcyBzaW5nbGUgY29uY2F0ZW5hdGVkIHN0cmluZworICAgICdlbnYnLCAgIyBhZGRpdGlvbmFsIGVudmlyb25tZW50YWwgdmFyaWFibGUKK10KKworREVGQVVMVF9NQVhfREVMQVkgPSA1CitERUZBVUxUX1NJR05BTCA9IDEKK0RFRkFVTFRfVElNRU9VVCA9IDUKKworCitkZWYgX2NvbGxlY3RfdGVzdGxpYnMoY29uZmlnLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaD1bTm9uZV0pOgorICAgICIiIkNvbGxlY3RzIHNlcnZlci9jbGllbnQgY29uZmlndXJhdGlvbnMgZnJvbSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb25zIiIiCisgICAgZGVmIGV4cGFuZF9saWJzKGNvbmZpZyk6CisgICAgICAgIGZvciBsaWIgaW4gY29uZmlnOgorICAgICAgICAgICAgc3YgPSBsaWIucG9wKCdzZXJ2ZXInLCBOb25lKQorICAgICAgICAgICAgY2wgPSBsaWIucG9wKCdjbGllbnQnLCBOb25lKQorICAgICAgICAgICAgeWllbGQgbGliLCBzdiwgY2wKKworICAgIGRlZiB5aWVsZF90ZXN0bGlicyhiYXNlX2NvbmZpZ3MsIGNvbmZpZ3MsIG1hdGNoKToKKyAgICAgICAgZm9yIGJhc2UsIGNvbmYgaW4gemlwKGJhc2VfY29uZmlncywgY29uZmlncyk6CisgICAgICAgICAgICBpZiBjb25mOgorICAgICAgICAgICAgICAgIGlmIG5vdCBtYXRjaCBvciBiYXNlWyduYW1lJ10gaW4gbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtcyA9IGNvbmYuZ2V0KCdwbGF0Zm9ybXMnKSBvciBiYXNlLmdldCgncGxhdGZvcm1zJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBsYXRmb3JtcyBvciBwbGF0Zm9ybS5zeXN0ZW0oKSBpbiBwbGF0Zm9ybXM6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBtZXJnZV9kaWN0KGJhc2UsIGNvbmYpCisKKyAgICBsaWJzLCBzdnMsIGNscyA9IHppcCgqZXhwYW5kX2xpYnMoY29uZmlnKSkKKyAgICBzZXJ2ZXJzID0gbGlzdCh5aWVsZF90ZXN0bGlicyhsaWJzLCBzdnMsIHNlcnZlcl9tYXRjaCkpCisgICAgY2xpZW50cyA9IGxpc3QoeWllbGRfdGVzdGxpYnMobGlicywgY2xzLCBjbGllbnRfbWF0Y2gpKQorICAgIHJldHVybiBzZXJ2ZXJzLCBjbGllbnRzCisKKworZGVmIGNvbGxlY3RfZmVhdHVyZXMoY29uZmlnLCBtYXRjaCk6CisgICAgcmVzID0gbGlzdChtYXAocmUuY29tcGlsZSwgbWF0Y2gpKQorICAgIHJldHVybiBsaXN0KGZpbHRlcihsYW1iZGEgYzogYW55KG1hcChsYW1iZGEgcjogci5zZWFyY2goY1snbmFtZSddKSwgcmVzKSksIGNvbmZpZykpCisKKworZGVmIF9kb19jb2xsZWN0X3Rlc3RzKHNlcnZlcnMsIGNsaWVudHMpOgorICAgIGRlZiBpbnRlcnNlY3Rpb24oa2V5LCBvMSwgbzIpOgorICAgICAgICAiIiJpbnRlcnNlY3Rpb24gb2YgdHdvIGNvbGxlY3Rpb25zLgorICAgICAgICBjb2xsZWN0aW9ucyBhcmUgcmVwbGFjZWQgd2l0aCBzZXRzIHRoZSBmaXJzdCB0aW1lIiIiCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8sIGtleSk6CisgICAgICAgICAgICB2ID0gb1trZXldCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2LCBzZXQpOgorICAgICAgICAgICAgICAgIHYgPSBzZXQodikKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gY2FjaGVkX3NldChvMSwga2V5KSAmIGNhY2hlZF9zZXQobzIsIGtleSkKKworICAgIGRlZiBpbnRlcnNlY3Rfd2l0aF9zcGVjKGtleSwgbzEsIG8yKToKKyAgICAgICAgIyBzdG9yZSBhcyBzZXQgb2YgKHNwZWMsIGltcGwpIHR1cGxlCisgICAgICAgIGRlZiBjYWNoZWRfc2V0KG8pOgorICAgICAgICAgICAgZGVmIHRvX3NwZWNfaW1wbF90dXBsZXModmFsdWVzKToKKyAgICAgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIHNwZWMsIF8sIGltcGwgPSB2LnBhcnRpdGlvbignOicpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNwZWMsIGltcGwgb3Igc3BlYworICAgICAgICAgICAgdiA9IG9ba2V5XQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uodiwgc2V0KToKKyAgICAgICAgICAgICAgICB2ID0gc2V0KHRvX3NwZWNfaW1wbF90dXBsZXMoc2V0KHYpKSkKKyAgICAgICAgICAgICAgICBvW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3Igc3BlYzEsIGltcGwxIGluIGNhY2hlZF9zZXQobzEpOgorICAgICAgICAgICAgZm9yIHNwZWMyLCBpbXBsMiBpbiBjYWNoZWRfc2V0KG8yKToKKyAgICAgICAgICAgICAgICBpZiBzcGVjMSA9PSBzcGVjMjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGltcGwxIGlmIGltcGwxID09IGltcGwyIGVsc2UgJyVzLSVzJyAlIChpbXBsMSwgaW1wbDIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUsIGltcGwxLCBpbXBsMgorCisgICAgZGVmIG1heWJlX21heChrZXksIG8xLCBvMiwgZGVmYXVsdCk6CisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCisgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKKyAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQorICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdAorCisgICAgZGVmIGZpbHRlcl93aXRoX3ZhbGlka2V5cyhvKToKKyAgICAgICAgcmV0ID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBWQUxJRF9KU09OX0tFWVM6CisgICAgICAgICAgICBpZiBrZXkgaW4gbzoKKyAgICAgICAgICAgICAgICByZXRba2V5XSA9IG9ba2V5XQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgbWVyZ2VfbWV0YWRhdGEobywgKipyZXQpOgorICAgICAgICBmb3Iga2V5IGluIFZBTElEX0pTT05fS0VZUzoKKyAgICAgICAgICAgIGlmIGtleSBpbiBvOgorICAgICAgICAgICAgICAgIHJldFtrZXldID0gb1trZXldCisgICAgICAgIHJldHVybiByZXQKKworICAgIGZvciBzdiwgY2wgaW4gcHJvZHVjdChzZXJ2ZXJzLCBjbGllbnRzKToKKyAgICAgICAgZm9yIHByb3RvLCBwcm90bzEsIHByb3RvMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCdwcm90b2NvbHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgZm9yIHRyYW5zLCB0cmFuczEsIHRyYW5zMiBpbiBpbnRlcnNlY3Rfd2l0aF9zcGVjKCd0cmFuc3BvcnRzJywgc3YsIGNsKToKKyAgICAgICAgICAgICAgICBmb3Igc29jayBpbiBpbnRlcnNlY3Rpb24oJ3NvY2tldHMnLCBzdiwgY2wpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB7CisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAnc29ja2V0Jzogc29jaworICAgICAgICAgICAgICAgICAgICB9CisKKworZGVmIF9maWx0ZXJfZW50cmllcyh0ZXN0cywgcmVnZXgpOgorICAgIGlmIHJlZ2V4OgorICAgICAgICByZXR1cm4gZmlsdGVyKGxhbWJkYSB0OiByZS5zZWFyY2gocmVnZXgsIFRlc3RFbnRyeS5nZXRfbmFtZSgqKnQpKSwgdGVzdHMpCisgICAgcmV0dXJuIHRlc3RzCisKKworZGVmIGNvbGxlY3RfY3Jvc3NfdGVzdHModGVzdHNfZGljdCwgc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIHJlZ2V4KToKKyAgICBzdiwgY2wgPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCkKKyAgICByZXR1cm4gbGlzdChfZmlsdGVyX2VudHJpZXMoX2RvX2NvbGxlY3RfdGVzdHMoc3YsIGNsKSwgcmVnZXgpKQorCisKK2RlZiBjb2xsZWN0X2ZlYXR1cmVfdGVzdHModGVzdHNfZGljdCwgZmVhdHVyZXNfZGljdCwgc2VydmVyX21hdGNoLCBmZWF0dXJlX21hdGNoLCByZWdleCk6CisgICAgc3YsIF8gPSBfY29sbGVjdF90ZXN0bGlicyh0ZXN0c19kaWN0LCBzZXJ2ZXJfbWF0Y2gpCisgICAgZnQgPSBjb2xsZWN0X2ZlYXR1cmVzKGZlYXR1cmVzX2RpY3QsIGZlYXR1cmVfbWF0Y2gpCisgICAgcmV0dXJuIGxpc3QoX2ZpbHRlcl9lbnRyaWVzKF9kb19jb2xsZWN0X3Rlc3RzKHN2LCBmdCksIHJlZ2V4KSkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9jb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYTkxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29tcGF0LnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDI6CisgICAgX0VOQ09ERSA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCisgICAgZGVmIHBhdGhfam9pbigqYXJncyk6CisgICAgICAgIGJpbl9hcmdzID0gbWFwKGxhbWJkYSBhOiBhLmRlY29kZShfRU5DT0RFKSwgYXJncykKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqYmluX2FyZ3MpLmVuY29kZShfRU5DT0RFKQorCisgICAgZGVmIHN0cl9qb2luKHMsIGwpOgorICAgICAgICBiaW5fYXJncyA9IG1hcChsYW1iZGEgYTogYS5kZWNvZGUoX0VOQ09ERSksIGwpCisgICAgICAgIGIgPSBzLmRlY29kZShfRU5DT0RFKQorICAgICAgICByZXR1cm4gYi5qb2luKGJpbl9hcmdzKS5lbmNvZGUoX0VOQ09ERSkKKworICAgIGxvZ2ZpbGVfb3BlbiA9IG9wZW4KKworZWxzZToKKworICAgIHBhdGhfam9pbiA9IG9zLnBhdGguam9pbgorICAgIHN0cl9qb2luID0gc3RyLmpvaW4KKworICAgIGRlZiBsb2dmaWxlX29wZW4oKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3BlbigqYXJncywgZXJyb3JzPSdyZXBsYWNlJykKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5IGIvdGVzdC9jcm9zc3J1bm5lci9yZXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhZjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CkBAIC0wLDAgKzEsNDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQganNvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCisKK2Zyb20gLmNvbXBhdCBpbXBvcnQgbG9nZmlsZV9vcGVuLCBwYXRoX2pvaW4sIHN0cl9qb2luCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKKworTE9HX0RJUiA9ICdsb2cnCitSRVNVTFRfSFRNTCA9ICdpbmRleC5odG1sJworUkVTVUxUX0pTT04gPSAncmVzdWx0cy5qc29uJworRkFJTF9KU09OID0gJ2tub3duX2ZhaWx1cmVzXyVzLmpzb24nCisKKworZGVmIGdlbmVyYXRlX2tub3duX2ZhaWx1cmVzKHRlc3RkaXIsIG92ZXJ3cml0ZSwgc2F2ZSwgb3V0KToKKyAgICBkZWYgY29sbGVjdF9mYWlsdXJlcyhyZXN1bHRzKToKKyAgICAgICAgc3VjY2Vzc19pbmRleCA9IDUKKyAgICAgICAgZm9yIHIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGlmIG5vdCByW3N1Y2Nlc3NfaW5kZXhdOgorICAgICAgICAgICAgICAgIHlpZWxkIFRlc3RFbnRyeS5nZXRfbmFtZSgqcikKKyAgICB0cnk6CisgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGhfam9pbih0ZXN0ZGlyLCBSRVNVTFRfSlNPTiksICdyJykgYXMgZnA6CisgICAgICAgICAgICByZXN1bHRzID0ganNvbi5sb2FkKGZwKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVbmFibGUgdG8gbG9hZCBsYXN0IHJlc3VsdC4gRGlkIHlvdSBydW4gdGVzdHMgP1xuJykKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbHMgPSBjb2xsZWN0X2ZhaWx1cmVzKHJlc3VsdHNbJ3Jlc3VsdHMnXSkKKyAgICBpZiBub3Qgb3ZlcndyaXRlOgorICAgICAgICBrbm93biA9IGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcikKKyAgICAgICAga25vd24uZXh0ZW5kKGZhaWxzKQorICAgICAgICBmYWlscyA9IGtub3duCisgICAgZmFpbHNfanNvbiA9IGpzb24uZHVtcHMoc29ydGVkKHNldChmYWlscykpLCBpbmRlbnQ9Miwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICBpZiBzYXZlOgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3Blbihvcy5wYXRoLmpvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGZhaWxzX2pzb24pCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1N1Y2Nlc3NmdWxseSB1cGRhdGVkIGtub3duIGZhaWx1cmVzLlxuJykKKyAgICBpZiBvdXQ6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZmFpbHNfanNvbikKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgIHJldHVybiBUcnVlCisKKworZGVmIGxvYWRfa25vd25fZmFpbHVyZXModGVzdGRpcik6CisgICAgdHJ5OgorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihwYXRoX2pvaW4odGVzdGRpciwgRkFJTF9KU09OICUgcGxhdGZvcm0uc3lzdGVtKCkpLCAncicpIGFzIGZwOgorICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZChmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIFtdCisKKworY2xhc3MgVGVzdFJlcG9ydGVyKG9iamVjdCk6CisgICAgIyBVbmZvcnR1bmF0ZWx5LCBzdGFuZGFyZCBsaWJyYXJ5IGRvZXNuJ3QgaGFuZGxlIHRpbWV6b25lIHdlbGwKKyAgICAjIERBVEVUSU1FX0ZPUk1BVCA9ICclYSAlYiAlZCAlSDolTTolUyAlWiAlWScKKyAgICBEQVRFVElNRV9GT1JNQVQgPSAnJWEgJWIgJWQgJUg6JU06JVMgJVknCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZXN0X2xvZ2ZpbGUoY2xzLCB0ZXN0X25hbWUsIHByb2dfa2luZCwgZGlyPU5vbmUpOgorICAgICAgICByZWxwYXRoID0gcGF0aF9qb2luKCdsb2cnLCAnJXNfJXMubG9nJyAlICh0ZXN0X25hbWUsIHByb2dfa2luZCkpCisgICAgICAgIHJldHVybiByZWxwYXRoIGlmIG5vdCBkaXIgZWxzZSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihkaXIsIHJlbHBhdGgpKQorCisgICAgZGVmIF9zdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5fc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2VsYXBzZWQoc2VsZik6CisgICAgICAgIHJldHVybiB0aW1lLnRpbWUoKSAtIHNlbGYuX3N0YXJ0X3RpbWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZm9ybWF0X2RhdGUoY2xzKToKKyAgICAgICAgcmV0dXJuICclcycgJSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZShjbHMuREFURVRJTUVfRk9STUFUKQorCisgICAgZGVmIF9wcmludF9kYXRlKHNlbGYpOgorICAgICAgICBwcmludChzZWxmLl9mb3JtYXRfZGF0ZSgpLCBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9iYXIoc2VsZiwgb3V0PU5vbmUpOgorICAgICAgICBwcmludCgKKyAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09JywKKyAgICAgICAgICAgIGZpbGU9KG91dCBvciBzZWxmLm91dCkpCisKKyAgICBkZWYgX3ByaW50X2V4ZWNfdGltZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ1Rlc3QgZXhlY3V0aW9uIHRvb2sgezouMWZ9IHNlY29uZHMuJy5mb3JtYXQoc2VsZi5fZWxhcHNlZCksIGZpbGU9c2VsZi5vdXQpCisKKworY2xhc3MgRXhlY1JlcG9ydGVyKFRlc3RSZXBvcnRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIHRlc3QsIHByb2cpOgorICAgICAgICBzdXBlcihFeGVjUmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5sb2dwYXRoID0gc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCBwcm9nLmtpbmQsIHRlc3RkaXIpCisgICAgICAgIHNlbGYub3V0ID0gTm9uZQorCisgICAgZGVmIGJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLl9zdGFydCgpCisgICAgICAgIHNlbGYuX29wZW4oKQorICAgICAgICBpZiBzZWxmLm91dCBhbmQgbm90IHNlbGYub3V0LmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2hlYWRlcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorCisgICAgZGVmIGVuZChzZWxmLCByZXR1cm5jb2RlKToKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5vdXQgYW5kIG5vdCBzZWxmLm91dC5jbG9zZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJpbnRfZm9vdGVyKHJldHVybmNvZGUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYub3V0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ091dHB1dCBzdHJlYW0gaXMgbm90IGF2YWlsYWJsZS4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBraWxsZWQoc2VsZik6CisgICAgICAgIHByaW50KGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdTZXJ2ZXIgcHJvY2VzcyBpcyBzdWNjZXNzZnVsbHkga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuZW5kKE5vbmUpCisKKyAgICBkZWYgZGllZChzZWxmKToKKyAgICAgICAgcHJpbnQoZmlsZT1zZWxmLm91dCkKKyAgICAgICAgcHJpbnQoJyoqKiBTZXJ2ZXIgcHJvY2VzcyBoYXMgZGllZCB1bmV4cGVjdGVkbHkgKioqJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5lbmQoTm9uZSkKKworICAgIF9pbml0X2ZhaWx1cmVfZXhwcnMgPSB7CisgICAgICAgICdzZXJ2ZXInOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0FhXWRkcmVzcyBhbHJlYWR5IGluIHVzZScsCisgICAgICAgICAgICAnQ291bGQgbm90IGJpbmQnLAorICAgICAgICAgICAgJ0VBRERSSU5VU0UnLAorICAgICAgICBdKSksCisgICAgICAgICdjbGllbnQnOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCisgICAgICAgICAgICAnW0NjXW9ubmVjdGlvbiByZWZ1c2VkJywKKyAgICAgICAgICAgICdDb3VsZCBub3QgY29ubmVjdCB0bycsCisgICAgICAgICAgICAnQ291bGQgbm90IG9wZW4gVU5JWCAnLCAgICAgICAjIGRvbWFpbiBzb2NrZXQgKHJiKQorICAgICAgICAgICAgJ0VDT05OUkVGVVNFRCcsCisgICAgICAgICAgICAnZWNvbm5yZWZ1c2VkJywgICAgICAgICAgICAgICAjIGVybAorICAgICAgICAgICAgJ0NPTk5FQ1RJT04tUkVGVVNFRC1FUlJPUicsICAgIyBjbAorICAgICAgICAgICAgJ2Nvbm5lY3QgRU5PRU5UJywgICAgICAgICAgICAgIyBub2RlanMgZG9tYWluIHNvY2tldAorICAgICAgICAgICAgJ05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknLCAgIyBkb21haW4gc29ja2V0CisgICAgICAgICAgICAnU29ja2V0cy5UY3BDbGllbnQuQ29ubmVjdCcsICAjIGNzaGFycAorICAgICAgICBdKSksCisgICAgfQorCisgICAgZGVmIG1heWJlX2ZhbHNlX3Bvc2l0aXZlKHNlbGYpOgorICAgICAgICAiIiJTZWFyY2hlcyB0aHJvdWdoIGxvZyBmaWxlIGZvciBzb2NrZXQgYmluZCBlcnJvci4KKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHN1c3BpY2lvdXMgZXhwcmVzc2lvbiBpcyBmb3VuZCwgb3RoZXJ3aXNlIEZhbHNlIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYub3V0IGFuZCBub3Qgc2VsZi5vdXQuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LmZsdXNoKCkKKyAgICAgICAgICAgIGV4cHJzID0gc2VsZi5faW5pdF9mYWlsdXJlX2V4cHJzW3NlbGYuX3Byb2cua2luZF0KKworICAgICAgICAgICAgZGVmIG1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGZvciBleHByIGluIGV4cHJzOgorICAgICAgICAgICAgICAgICAgICBpZiBleHByLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCJtYXliZSBmYWxzZSBwb3NpdGl2ZTogJXMiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBpZiBhbnkobWFwKG1hdGNoLCBmcCkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLl9sb2cud2FybignWyVzXTogRXJyb3Igd2hpbGUgZGV0ZWN0aW5nIGZhbHNlIHBvc2l0aXZlOiAlcycgJSAoc2VsZi5fdGVzdC5uYW1lLCBzdHIoZXgpKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKHRyYWNlYmFjay5wcmludF9leGMoKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX29wZW4oc2VsZik6CisgICAgICAgIHNlbGYub3V0ID0gbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3crJykKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYub3V0LmNsb3NlKCkKKworICAgIGRlZiBfcHJpbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9kYXRlKCkKKyAgICAgICAgcHJpbnQoJ0V4ZWN1dGluZzogJXMnICUgc3RyX2pvaW4oJyAnLCBzZWxmLl9wcm9nLmNvbW1hbmQpLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBwcmludCgnRGlyZWN0b3J5OiAlcycgJSBzZWxmLl9wcm9nLndvcmtkaXIsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6ZGVsYXk6ICVzJyAlIHNlbGYuX3Rlc3QuZGVsYXksIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHByaW50KCdjb25maWc6dGltZW91dDogJXMnICUgc2VsZi5fdGVzdC50aW1lb3V0LCBmaWxlPXNlbGYub3V0KQorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBzZWxmLm91dC5mbHVzaCgpCisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmLCByZXR1cm5jb2RlPU5vbmUpOgorICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBpZiByZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ1JldHVybiBjb2RlOiAlZCAobmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGtpbGwgYnkgc2lnbmFsKScgJSByZXR1cm5jb2RlLCBmaWxlPXNlbGYub3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ1Byb2Nlc3MgaXMga2lsbGVkLicsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgIHNlbGYuX3ByaW50X2V4ZWNfdGltZSgpCisgICAgICAgIHNlbGYuX3ByaW50X2RhdGUoKQorCisKK2NsYXNzIFN1bW1hcnlSZXBvcnRlcihUZXN0UmVwb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXNlZGlyLCB0ZXN0ZGlyX3JlbGF0aXZlLCBjb25jdXJyZW50PVRydWUpOgorICAgICAgICBzdXBlcihTdW1tYXJ5UmVwb3J0ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fYmFzZWRpciA9IGJhc2VkaXIKKyAgICAgICAgc2VsZi5fdGVzdGRpcl9yZWwgPSB0ZXN0ZGlyX3JlbGF0aXZlCisgICAgICAgIHNlbGYubG9nZGlyID0gcGF0aF9qb2luKHNlbGYudGVzdGRpciwgTE9HX0RJUikKKyAgICAgICAgc2VsZi5vdXRfcGF0aCA9IHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIFJFU1VMVF9KU09OKQorICAgICAgICBzZWxmLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50CisgICAgICAgIHNlbGYub3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wbGF0Zm9ybSA9IHBsYXRmb3JtLnN5c3RlbSgpCisgICAgICAgIHNlbGYuX3JldmlzaW9uID0gc2VsZi5fZ2V0X3JldmlzaW9uKCkKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5sb2dkaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2dkaXIpCisgICAgICAgIHNlbGYuX2tub3duX2ZhaWx1cmVzID0gbG9hZF9rbm93bl9mYWlsdXJlcyhzZWxmLnRlc3RkaXIpCisgICAgICAgIHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcyA9IFtdCisgICAgICAgIHNlbGYuX2ZsYWt5X3N1Y2Nlc3MgPSBbXQorICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUgPSBbXQorICAgICAgICBzZWxmLl9leHBlY3RlZF9mYWlsdXJlID0gW10KKyAgICAgICAgc2VsZi5fcHJpbnRfaGVhZGVyKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0ZXN0ZGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gcGF0aF9qb2luKHNlbGYuX2Jhc2VkaXIsIHNlbGYuX3Rlc3RkaXJfcmVsKQorCisgICAgZGVmIF9yZXN1bHRfc3RyaW5nKHNlbGYsIHRlc3QpOgorICAgICAgICBpZiB0ZXN0LnN1Y2Nlc3M6CisgICAgICAgICAgICBpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdzdWNjZXNzJworICAgICAgICAgICAgZWxpZiB0ZXN0LnJldHJ5X2NvdW50ID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSgxIHJldHJ5KScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmbGFreSglZCByZXRyaWVzKScgJSB0ZXN0LnJldHJ5X2NvdW50CisgICAgICAgIGVsaWYgdGVzdC5leHBpcmVkOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKHRpbWVvdXQpJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdmYWlsdXJlKCVkKScgJSB0ZXN0LnJldHVybmNvZGUKKworICAgIGRlZiBfZ2V0X3JldmlzaW9uKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1zaG9ydCcsICdIRUFEJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnRlc3RkaXIsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgXyA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICByZXR1cm4gb3V0LnN0cmlwKCkKKworICAgIGRlZiBfZm9ybWF0X3Rlc3Qoc2VsZiwgdGVzdCwgd2l0aF9yZXN1bHQ9VHJ1ZSk6CisgICAgICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCisgICAgICAgIHRyYW5zID0gJyVzLSVzJyAlICh0ZXN0LnRyYW5zcG9ydCwgdGVzdC5zb2NrZXQpCisgICAgICAgIGlmIG5vdCB3aXRoX3Jlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxOHN9ezoyNXN9Jy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxN10sIHRyYW5zWzoyNF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfXs6c31cbicuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1s6MjRdLCBzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpKQorCisgICAgZGVmIF9wcmludF90ZXN0X2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fcHJpbnRfYmFyKCkKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAnezoyNHN9ezoxOHN9ezoyNXN9ezpzfScuZm9ybWF0KCdzZXJ2ZXItY2xpZW50OicsICdwcm90b2NvbDonLCAndHJhbnNwb3J0OicsICdyZXN1bHQ6JyksCisgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorCisgICAgZGVmIF9wcmludF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3N0YXJ0KCkKKyAgICAgICAgcHJpbnQoJ0FwYWNoZSBUaHJpZnQgLSBJbnRlZ3JhdGlvbiBUZXN0IFN1aXRlJywgZmlsZT1zZWxmLm91dCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKworICAgIGRlZiBfcHJpbnRfdW5leHBlY3RlZF9mYWlsdXJlKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fdW5leHBlY3RlZF9mYWlsdXJlKSA+IDA6CisgICAgICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICAgICAnKioqIEZvbGxvd2luZyAlZCBmYWlsdXJlcyB3ZXJlIHVuZXhwZWN0ZWQgKioqOlxuJyAlIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpLAorICAgICAgICAgICAgICAgICdJZiBpdCBpcyBpbnRyb2R1Y2VkIGJ5IHlvdSwgcGxlYXNlIGZpeCBpdCBiZWZvcmUgc3VibWl0dGluZyB0aGUgY29kZS5cbicsCisgICAgICAgICAgICAgICAgIyAnSWYgbm90LCBwbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUXG4nLAorICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X3Rlc3RfaGVhZGVyKCkKKyAgICAgICAgICAgIGZvciBpIGluIHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdChzZWxmLl90ZXN0c1tpXSkpCisgICAgICAgICAgICBzZWxmLl9wcmludF9iYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoJ05vIHVuZXhwZWN0ZWQgZmFpbHVyZXMuJywgZmlsZT1zZWxmLm91dCkKKworICAgIGRlZiBfcHJpbnRfZmxha3lfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpID4gMDoKKyAgICAgICAgICAgIHByaW50KAorICAgICAgICAgICAgICAgICdGb2xsb3dpbmcgJWQgdGVzdHMgd2VyZSBleHBlY3RlZCB0byBjbGVhbmx5IHN1Y2NlZWQgYnV0IG5lZWRlZCByZXRyeTonICUgbGVuKHNlbGYuX2ZsYWt5X3N1Y2Nlc3MpLAorICAgICAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCisgICAgICAgICAgICBzZWxmLl9wcmludF90ZXN0X2hlYWRlcigpCisgICAgICAgICAgICBmb3IgaSBpbiBzZWxmLl9mbGFreV9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VuZXhwZWN0ZWRfc3VjY2VzcykgPiAwOgorICAgICAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAgICAgJ0ZvbGxvd2luZyAlZCB0ZXN0cyB3ZXJlIGtub3duIHRvIGZhaWwgYnV0IHN1Y2NlZWRlZCAobWF5YmUgZmxha3kpOicgJSBsZW4oc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzKSwKKyAgICAgICAgICAgICAgICBmaWxlPXNlbGYub3V0KQorICAgICAgICAgICAgc2VsZi5fcHJpbnRfdGVzdF9oZWFkZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LndyaXRlKHNlbGYuX2Zvcm1hdF90ZXN0KHNlbGYuX3Rlc3RzW2ldKSkKKyAgICAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisKKyAgICBkZWYgX2h0dHBfc2VydmVyX2NvbW1hbmQoc2VsZiwgcG9ydCk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgorICAgICAgICAgICAgcmV0dXJuICdweXRob24gLW0gU2ltcGxlSFRUUFNlcnZlciAlZCcgJSBwb3J0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ3B5dGhvbiAtbSBodHRwLnNlcnZlciAlZCcgJSBwb3J0CisKKyAgICBkZWYgX3ByaW50X2Zvb3RlcihzZWxmKToKKyAgICAgICAgZmFpbF9jb3VudCA9IGxlbihzZWxmLl9leHBlY3RlZF9mYWlsdXJlKSArIGxlbihzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCisgICAgICAgIHNlbGYuX3ByaW50X3VuZXhwZWN0ZWRfc3VjY2VzcygpCisgICAgICAgIHNlbGYuX3ByaW50X2ZsYWt5X3N1Y2Nlc3MoKQorICAgICAgICBzZWxmLl9wcmludF91bmV4cGVjdGVkX2ZhaWx1cmUoKQorICAgICAgICBzZWxmLl93cml0ZV9odG1sX2RhdGEoKQorICAgICAgICBzZWxmLl9hc3NlbWJsZV9sb2coJ3VuZXhwZWN0ZWQgZmFpbHVyZXMnLCBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUpCisgICAgICAgIHNlbGYuX2Fzc2VtYmxlX2xvZygna25vd24gZmFpbHVyZXMnLCBzZWxmLl9leHBlY3RlZF9mYWlsdXJlKQorICAgICAgICBzZWxmLm91dC53cml0ZWxpbmVzKFsKKyAgICAgICAgICAgICdZb3UgY2FuIGJyb3dzZSByZXN1bHRzIGF0OlxuJywKKyAgICAgICAgICAgICdcdGZpbGU6Ly8lcy8lc1xuJyAlIChzZWxmLnRlc3RkaXIsIFJFU1VMVF9IVE1MKSwKKyAgICAgICAgICAgICcjIElmIHlvdSB1c2UgQ2hyb21lLCBydW46XG4nLAorICAgICAgICAgICAgJyMgXHRjZCAlc1xuI1x0JXNcbicgJSAoc2VsZi5fYmFzZWRpciwgc2VsZi5faHR0cF9zZXJ2ZXJfY29tbWFuZCg4MDAxKSksCisgICAgICAgICAgICAnIyB0aGVuIGJyb3dzZTpcbicsCisgICAgICAgICAgICAnIyBcdGh0dHA6Ly9sb2NhbGhvc3Q6JWQvJXMvXG4nICUgKDgwMDEsIHNlbGYuX3Rlc3RkaXJfcmVsKSwKKyAgICAgICAgICAgICdGdWxsIGxvZyBmb3IgZWFjaCB0ZXN0IGlzIGhlcmU6XG4nLAorICAgICAgICAgICAgJ1x0dGVzdC9sb2cvc2VydmVyX2NsaWVudF9wcm90b2NvbF90cmFuc3BvcnRfY2xpZW50LmxvZ1xuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X3NlcnZlci5sb2dcbicsCisgICAgICAgICAgICAnJWQgZmFpbGVkIG9mICVkIHRlc3RzIGluIHRvdGFsLlxuJyAlIChmYWlsX2NvdW50LCBsZW4oc2VsZi5fdGVzdHMpKSwKKyAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKKyAgICAgICAgc2VsZi5fcHJpbnRfZGF0ZSgpCisKKyAgICBkZWYgX3JlbmRlcl9yZXN1bHQoc2VsZiwgdGVzdCk6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICB0ZXN0LnNlcnZlci5uYW1lLAorICAgICAgICAgICAgdGVzdC5jbGllbnQubmFtZSwKKyAgICAgICAgICAgIHRlc3QucHJvdG9jb2wsCisgICAgICAgICAgICB0ZXN0LnRyYW5zcG9ydCwKKyAgICAgICAgICAgIHRlc3Quc29ja2V0LAorICAgICAgICAgICAgdGVzdC5zdWNjZXNzLAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCwKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAnc2VydmVyJzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LnNlcnZlci5raW5kKSwKKyAgICAgICAgICAgICAgICAnY2xpZW50Jzogc2VsZi50ZXN0X2xvZ2ZpbGUodGVzdC5uYW1lLCB0ZXN0LmNsaWVudC5raW5kKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIF0KKworICAgIGRlZiBfd3JpdGVfaHRtbF9kYXRhKHNlbGYpOgorICAgICAgICAiIiJXcml0ZXMgSlNPTiBkYXRhIHRvIGJlIHJlYWQgYnkgcmVzdWx0IGh0bWwiIiIKKyAgICAgICAgcmVzdWx0cyA9IFtzZWxmLl9yZW5kZXJfcmVzdWx0KHIpIGZvciByIGluIHNlbGYuX3Rlc3RzXQorICAgICAgICB3aXRoIGxvZ2ZpbGVfb3BlbihzZWxmLm91dF9wYXRoLCAndysnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGpzb24uZHVtcHMoeworICAgICAgICAgICAgICAgICdkYXRlJzogc2VsZi5fZm9ybWF0X2RhdGUoKSwKKyAgICAgICAgICAgICAgICAncmV2aXNpb24nOiBzdHIoc2VsZi5fcmV2aXNpb24pLAorICAgICAgICAgICAgICAgICdwbGF0Zm9ybSc6IHNlbGYuX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgICdkdXJhdGlvbic6ICd7Oi4xZn0nLmZvcm1hdChzZWxmLl9lbGFwc2VkKSwKKyAgICAgICAgICAgICAgICAncmVzdWx0cyc6IHJlc3VsdHMsCisgICAgICAgICAgICB9LCBpbmRlbnQ9MikpCisKKyAgICBkZWYgX2Fzc2VtYmxlX2xvZyhzZWxmLCB0aXRsZSwgaW5kZXhlcyk6CisgICAgICAgIGlmIGxlbihpbmRleGVzKSA+IDA6CisgICAgICAgICAgICBkZWYgYWRkX3Byb2dfbG9nKGZwLCB0ZXN0LCBwcm9nX2tpbmQpOgorICAgICAgICAgICAgICAgIHByaW50KCcqKioqKioqKioqKioqKioqKioqKioqKioqKiogJXMgbWVzc2FnZSAqKioqKioqKioqKioqKioqKioqKioqKioqKionICUgcHJvZ19raW5kLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9ZnApCisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdF9sb2dmaWxlKHRlc3QubmFtZSwgcHJvZ19raW5kLCBzZWxmLnRlc3RkaXIpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHBhdGgsICdyJykgYXMgcHJvZ19mcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KHByb2dfZnAucmVhZCgpLCBmaWxlPWZwKQorICAgICAgICAgICAgZmlsZW5hbWUgPSB0aXRsZS5yZXBsYWNlKCcgJywgJ18nKSArICcubG9nJworICAgICAgICAgICAgd2l0aCBsb2dmaWxlX29wZW4ob3MucGF0aC5qb2luKHNlbGYubG9nZGlyLCBmaWxlbmFtZSksICd3KycpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIG1hcChzZWxmLl90ZXN0cy5fX2dldGl0ZW1fXywgaW5kZXhlcyk6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKCdURVNUOiBbJXNdXG4nICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBhZGRfcHJvZ19sb2coZnAsIHRlc3QsIHRlc3Quc2VydmVyLmtpbmQpCisgICAgICAgICAgICAgICAgICAgIGFkZF9wcm9nX2xvZyhmcCwgdGVzdCwgdGVzdC5jbGllbnQua2luZCkKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuJykKKyAgICAgICAgICAgIHByaW50KCclcyBhcmUgbG9nZ2VkIHRvICVzLyVzLyVzJyAlICh0aXRsZS5jYXBpdGFsaXplKCksIHNlbGYuX3Rlc3RkaXJfcmVsLCBMT0dfRElSLCBmaWxlbmFtZSkpCisKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICBzZWxmLl9wcmludF9mb290ZXIoKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3VuZXhwZWN0ZWRfZmFpbHVyZSkgPT0gMAorCisgICAgZGVmIGFkZF90ZXN0KHNlbGYsIHRlc3RfZGljdCk6CisgICAgICAgIHRlc3QgPSBUZXN0RW50cnkoc2VsZi50ZXN0ZGlyLCAqKnRlc3RfZGljdCkKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9mb3JtYXRfdGVzdCh0ZXN0LCBGYWxzZSkpCisgICAgICAgICAgICAgICAgc2VsZi5vdXQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3Rlc3RzKSAtIDEKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgYWRkX3Jlc3VsdChzZWxmLCBpbmRleCwgcmV0dXJuY29kZSwgZXhwaXJlZCwgcmV0cnlfY291bnQpOgorICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmYWlsZWQgPSByZXR1cm5jb2RlIGlzIE5vbmUgb3IgcmV0dXJuY29kZSAhPSAwCisgICAgICAgICAgICBmbGFreSA9IG5vdCBmYWlsZWQgYW5kIHJldHJ5X2NvdW50ICE9IDAKKyAgICAgICAgICAgIHRlc3QgPSBzZWxmLl90ZXN0c1tpbmRleF0KKyAgICAgICAgICAgIGtub3duID0gdGVzdC5uYW1lIGluIHNlbGYuX2tub3duX2ZhaWx1cmVzCisgICAgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgaWYga25vd246CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnJXMgZmFpbGVkIGFzIGV4cGVjdGVkJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfZmFpbHVyZS5hcHBlbmQoaW5kZXgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nLmluZm8oJ3VuZXhwZWN0ZWQgZmFpbHVyZTogJXMnICUgdGVzdC5uYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl91bmV4cGVjdGVkX2ZhaWx1cmUuYXBwZW5kKGluZGV4KQorICAgICAgICAgICAgZWxpZiBmbGFreSBhbmQgbm90IGtub3duOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCd1bmV4cGVjdGVkIGZsYWt5IHN1Y2Nlc3M6ICVzJyAlIHRlc3QubmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFreV9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIGVsaWYgbm90IGZsYWt5IGFuZCBrbm93bjoKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygndW5leHBlY3RlZCBzdWNjZXNzOiAlcycgJSB0ZXN0Lm5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fdW5leHBlY3RlZF9zdWNjZXNzLmFwcGVuZChpbmRleCkKKyAgICAgICAgICAgIHRlc3Quc3VjY2VzcyA9IG5vdCBmYWlsZWQKKyAgICAgICAgICAgIHRlc3QucmV0dXJuY29kZSA9IHJldHVybmNvZGUKKyAgICAgICAgICAgIHRlc3QucmV0cnlfY291bnQgPSByZXRyeV9jb3VudAorICAgICAgICAgICAgdGVzdC5leHBpcmVkID0gZXhwaXJlZAorICAgICAgICAgICAgdGVzdC5hc19leHBlY3RlZCA9IGtub3duID09IGZhaWxlZAorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29uY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLm91dC53cml0ZShzZWxmLl9yZXN1bHRfc3RyaW5nKHRlc3QpICsgJ1xuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQud3JpdGUoc2VsZi5fZm9ybWF0X3Rlc3QodGVzdCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3J1bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjhmYjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTAsMCArMSw0MjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2VycworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIC5jb21wYXQgaW1wb3J0IHN0cl9qb2luCitmcm9tIC5yZXBvcnQgaW1wb3J0IEV4ZWNSZXBvcnRlciwgU3VtbWFyeVJlcG9ydGVyCitmcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnkKK2Zyb20gLnV0aWwgaW1wb3J0IGRvbWFpbl9zb2NrZXRfcGF0aAorCitSRVNVTFRfRVJST1IgPSA2NAorUkVTVUxUX1RJTUVPVVQgPSAxMjgKK1NJR05PTkUgPSAwCitTSUdLSUxMID0gMTUKKworIyBnbG9iYWxzCitwb3J0cyA9IE5vbmUKK3N0b3AgPSBOb25lCisKKworY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGN3ZCwgZW52LCBzdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpOgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHNlbGYuY3dkID0gY3dkCisgICAgICAgIHNlbGYuZW52ID0gZW52CisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmlzX3NlcnZlciA9IGlzX3NlcnZlcgorICAgICAgICBzZWxmLnJlcG9ydCA9IHJlcG9ydAorICAgICAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmtpbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvYyA9IE5vbmUKKworICAgIGRlZiBfcG9wZW5fYXJncyhzZWxmKToKKyAgICAgICAgYXJncyA9IHsKKyAgICAgICAgICAgICdjd2QnOiBzZWxmLmN3ZCwKKyAgICAgICAgICAgICdlbnYnOiBzZWxmLmVudiwKKyAgICAgICAgICAgICdzdGRvdXQnOiBzZWxmLnJlcG9ydC5vdXQsCisgICAgICAgICAgICAnc3RkZXJyJzogc3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgIH0KKyAgICAgICAgIyBtYWtlIHN1cmUgY2hpbGQgcHJvY2Vzc2VzIGRvZXNuJ3QgcmVtYWluIGFmdGVyIGtpbGxpbmcKKyAgICAgICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgorICAgICAgICAgICAgREVUQUNIRURfUFJPQ0VTUyA9IDB4MDAwMDAwMDgKKyAgICAgICAgICAgIGFyZ3MudXBkYXRlKGNyZWF0aW9uZmxhZ3M9REVUQUNIRURfUFJPQ0VTUyB8IHN1YnByb2Nlc3MuQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCisgICAgICAgIHJldHVybiBhcmdzCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCisgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKKyAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgIFBJRDogJWQnLCBzZWxmLnByb2MucGlkKQorICAgICAgICBzZWxmLl9sb2cuZGVidWcoJyAgIFBHSUQ6ICVkJywgb3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Njb3BlZCgpCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBfc2NvcGVkKHNlbGYpOgorICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKworICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKKworICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJldHVybmNvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByb2MucmV0dXJuY29kZSBpZiBzZWxmLnByb2MgZWxzZSBOb25lCisKKworZGVmIGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHByb2csIGlzX3NlcnZlcik6CisgICAgcmVwb3J0ID0gRXhlY1JlcG9ydGVyKGxvZ2RpciwgdGVzdCwgcHJvZykKKyAgICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKKyAgICByZXR1cm4gRXhlY3V0aW9uQ29udGV4dChwcm9nLmNvbW1hbmQsIHByb2cud29ya2RpciwgcHJvZy5lbnYsIHByb2cuc3RvcF9zaWduYWwsIGlzX3NlcnZlciwgcmVwb3J0KQorCisKK2RlZiBydW5fdGVzdCh0ZXN0ZGlyLCBsb2dkaXIsIHRlc3RfZGljdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPVRydWUpOgorICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKworICAgIGRlZiBlbnN1cmVfc29ja2V0X29wZW4oc3YsIHBvcnQsIHRlc3QpOgorICAgICAgICBzbGVwdCA9IDAuMQorICAgICAgICB0aW1lLnNsZWVwKHNsZXB0KQorICAgICAgICBzbGVlcF9zdGVwID0gMC4xCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzbGVwdCA+IHRlc3QuZGVsYXk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1t7MH1dIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBidXQgc2VydmVyIGlzIG5vdCBvcGVuJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHRlc3Quc29ja2V0ID09ICdkb21haW4nOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkb21haW5fc29ja2V0X3BhdGgocG9ydCkpOgorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIGRvbWFpbih1bml4KSBzb2NrZXQgbm90IGF2YWlsYWJsZSB5ZXQuIHNsZXB0IGZvciB7MX0gc2Vjb25kcyBzbyBmYXInLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCisgICAgICAgICAgICAgICAgICAgIHNsZXB0ICs9IHNsZWVwX3N0ZXAKKyAgICAgICAgICAgIGVsaWYgdGVzdC5zb2NrZXQgPT0gJ2Fic3RyYWN0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBzb2NrZXRzIGV2ZXJ5IGl0ZXJhdGlvbiBiZWNhdXNlIHJlZnVzZWQgc29ja2V0cyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgICAjIHJldXNlZCBvbiBzb21lIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgc29jazQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgICAgICBzb2NrNiA9IHNvY2tldC5zb2NrZXQoZmFtaWx5PXNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNvY2s0LmNvbm5lY3RfZXgoKCcxMjcuMC4wLjEnLCBwb3J0KSkgPT0gMCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc29jazYuY29ubmVjdF9leCgoJzo6MScsIHBvcnQpKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignW3swfV0gc2VydmVyIHByb2Nlc3MgaXMgZXhpdGVkJy5mb3JtYXQoc3YucHJvYy5waWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnW3swfV0gc29ja2V0IG5vdCBhdmFpbGFibGUgeWV0LiBzbGVwdCBmb3IgezF9IHNlY29uZHMgc28gZmFyJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBzbGVwdCArPSBzbGVlcF9zdGVwCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc29jazQuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIHNlcnZlciByZWFkeSAtIHdhaXRlZCBmb3IgezF9IHNlY29uZHMnLmZvcm1hdChzdi5wcm9jLnBpZCwgc2xlcHQpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHRyeToKKyAgICAgICAgbWF4X2JpbmRfcmV0cnkgPSAzCisgICAgICAgIHJldHJ5X2NvdW50ID0gMAorICAgICAgICBiaW5kX3JldHJ5X2NvdW50ID0gMAorICAgICAgICB0ZXN0ID0gVGVzdEVudHJ5KHRlc3RkaXIsICoqdGVzdF9kaWN0KQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgc3RvcC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGJlY2F1c2Ugc2h1dHRpbmcgZG93bicpCisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgTm9uZSkKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnQnKQorICAgICAgICAgICAgd2l0aCBQb3J0QWxsb2NhdG9yLmFsbG9jX3BvcnRfc2NvcGVkKHBvcnRzLCB0ZXN0LnNvY2tldCkgYXMgcG9ydDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQorICAgICAgICAgICAgICAgIHN2ID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5zZXJ2ZXIsIFRydWUpCisgICAgICAgICAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCB0ZXN0LmNsaWVudCwgRmFsc2UpCisKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIHNlcnZlcicpCisgICAgICAgICAgICAgICAgd2l0aCBzdi5zdGFydCgpOgorICAgICAgICAgICAgICAgICAgICBwb3J0X29rID0gZW5zdXJlX3NvY2tldF9vcGVuKHN2LCBwb3J0LCB0ZXN0KQorICAgICAgICAgICAgICAgICAgICBpZiBwb3J0X29rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9jb25uZWN0X3JldHJ5ID0gMTIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfd2FpdCA9IDAuMjUKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3YucHJvYy5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdub3Qgc3RhcnRpbmcgY2xpZW50IGJlY2F1c2Ugc2VydmVyIHByb2Nlc3MgaXMgYWJzZW50JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIGNsaWVudCcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQgKHVwIHRvICVkIHNlY3MpJyAlIHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC53YWl0KHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY29ubmVjdF9yZXRyeV9jb3VudCA+PSBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ubmVjdF9yZXRyeV9jb3VudCA+IDAgYW5kIGNvbm5lY3RfcmV0cnlfY291bnQgPCBtYXhfY29ubmVjdF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjb25uZWN0X3JldHJ5X2NvdW50LCBjb25uZWN0X3JldHJ5X3dhaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIDUwbXMgdG8gc2VlIGlmIHNlcnZlciBkb2VzIG5vdCBkaWUgYXQgdGhlIGVuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2VydmVyIG1heSBub3QgYmUgcmVhZHksIHdhaXRpbmcgJS4yZiBzZWNvbmQuLi4nICUgY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoY29ubmVjdF9yZXRyeV93YWl0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgKz0gMQorCisgICAgICAgICAgICBpZiBzdi5yZXBvcnQubWF5YmVfZmFsc2VfcG9zaXRpdmUoKSBhbmQgYmluZF9yZXRyeV9jb3VudCA8IG1heF9iaW5kX3JldHJ5OgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBEZXRlY3RlZCBzb2NrZXQgYmluZCBmYWlsdXJlLCByZXRyeWluZy4uLicsIHRlc3Quc2VydmVyLm5hbWUpCisgICAgICAgICAgICAgICAgYmluZF9yZXRyeV9jb3VudCArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJFU1VMVF9USU1FT1VUIGlmIGNsLmV4cGlyZWQgZWxzZSBjbC5yZXR1cm5jb2RlIGlmIChjbC5wcm9jIGFuZCBjbC5wcm9jLnBvbGwoKSkgaXMgbm90IE5vbmUgZWxzZSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgICMgRm9yIHNlcnZlcnMgdGhhdCBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duIGJ5IHNpZ25hbAorICAgICAgICAgICAgICAgICMgaWYgdGhleSBhcmUga2lsbGVkLCBvciByZXR1cm4gYW4gZXJyb3IgY29kZSwgdGhhdCBpcyBhCisgICAgICAgICAgICAgICAgIyBwcm9ibGVtLiAgRm9yIHNlcnZlcnMgdGhhdCBhcmUgbm90IHNpZ25hbC1hd2FyZSwgd2Ugc2ltcGx5CisgICAgICAgICAgICAgICAgIyBraWxsIHRoZW0gb2ZmOyBpZiB3ZSBkaWRuJ3Qga2lsbCB0aGVtIG9mZiwgc29tZXRoaW5nIGVsc2UKKyAgICAgICAgICAgICAgICAjIGhhcHBlbmVkIChjcmFzaGVkPykKKyAgICAgICAgICAgICAgICBpZiB0ZXN0LnNlcnZlci5zdG9wX3NpZ25hbCAhPSAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzdi5raWxsZWQgb3Igc3YucmV0dXJuY29kZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gUkVTVUxUX0VSUk9SCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN2LmtpbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKKworICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSAwIG9yIHJldHJ5X2NvdW50ID49IG1heF9yZXRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXMtJXNdOiB0ZXN0IGZhaWxlZCwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCArPSAxCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBsb2dnZXIud2FybignRXJyb3IgZXhlY3V0aW5nIFslc10nLCB0ZXN0Lm5hbWUsIGV4Y19pbmZvPVRydWUpCisgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKKyAgICBleGNlcHQ6CisgICAgICAgIGxvZ2dlci5pbmZvKCdJbnRlcnJ1cHRlZCBleGVjdXRpb24nLCBleGNfaW5mbz1UcnVlKQorICAgICAgICBpZiBub3QgYXN5bmNfbW9kZToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHN0b3Auc2V0KCkKKyAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgUkVTVUxUX0VSUk9SKQorCisKK2NsYXNzIFBvcnRBbGxvY2F0b3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvZyA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9kb21fcG9ydHMgPSBzZXQoKQorICAgICAgICBzZWxmLl9sYXN0X2FsbG9jID0gMAorCisgICAgZGVmIF9nZXRfdGNwX3BvcnQoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc29jay5iaW5kKCgnJywgMCkpCisgICAgICAgIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2sgPSBwb3J0IG5vdCBpbiBzZWxmLl9wb3J0cworICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9hbGxvYyA9IHRpbWUudGltZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHJldHVybiBwb3J0IGlmIG9rIGVsc2Ugc2VsZi5fZ2V0X3RjcF9wb3J0KCkKKworICAgIGRlZiBfZ2V0X2RvbWFpbl9wb3J0KHNlbGYpOgorICAgICAgICBwb3J0ID0gcmFuZG9tLnJhbmRpbnQoMTAyNCwgNjU1MzYpCisgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9rID0gcG9ydCBub3QgaW4gc2VsZi5fZG9tX3BvcnRzCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb21fcG9ydHMuYWRkKHBvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gcG9ydCBpZiBvayBlbHNlIHNlbGYuX2dldF9kb21haW5fcG9ydCgpCisKKyAgICBkZWYgYWxsb2NfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIGlmIHNvY2tldF90eXBlIGluICgnZG9tYWluJywgJ2Fic3RyYWN0Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RvbWFpbl9wb3J0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfdGNwX3BvcnQoKQorCisgICAgIyBzdGF0aWMgbWV0aG9kIGZvciBpbnRlci1wcm9jZXNzIGludm9rYXRpb24KKyAgICBAc3RhdGljbWV0aG9kCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgYWxsb2NfcG9ydF9zY29wZWQoYWxsb2NhdG9yLCBzb2NrZXRfdHlwZSk6CisgICAgICAgIHBvcnQgPSBhbGxvY2F0b3IuYWxsb2NfcG9ydChzb2NrZXRfdHlwZSkKKyAgICAgICAgeWllbGQgcG9ydAorICAgICAgICBhbGxvY2F0b3IuZnJlZV9wb3J0KHNvY2tldF90eXBlLCBwb3J0KQorCisgICAgZGVmIGZyZWVfcG9ydChzZWxmLCBzb2NrZXRfdHlwZSwgcG9ydCk6CisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZV9wb3J0JykKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc29ja2V0X3R5cGUgPT0gJ2RvbWFpbic6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgICAgIHBhdGggPSBkb21haW5fc29ja2V0X3BhdGgocG9ydCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgICAgICBlbGlmIHNvY2tldF90eXBlID09ICdhYnN0cmFjdCc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9tX3BvcnRzLnJlbW92ZShwb3J0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3J0cy5yZW1vdmUocG9ydCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnRXJyb3Igd2hpbGUgZnJlZWluZyBwb3J0JywgZXhjX2luZm89c3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisKK2NsYXNzIE5vbkFzeW5jUmVzdWx0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIGdldChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWFkeShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdWNjZXNzZnVsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUgPT0gMAorCisKK2NsYXNzIFRlc3REaXNwYXRjaGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RkaXIsIGJhc2VkaXIsIGxvZ2Rpcl9yZWwsIGNvbmN1cnJlbmN5KToKKyAgICAgICAgc2VsZi5fbG9nID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBzZWxmLnRlc3RkaXIgPSB0ZXN0ZGlyCisgICAgICAgIHNlbGYuX3JlcG9ydCA9IFN1bW1hcnlSZXBvcnRlcihiYXNlZGlyLCBsb2dkaXJfcmVsLCBjb25jdXJyZW5jeSA+IDEpCisgICAgICAgIHNlbGYubG9nZGlyID0gc2VsZi5fcmVwb3J0LnRlc3RkaXIKKyAgICAgICAgIyBzZWVtcyBuZWVkZWQgZm9yIHB5dGhvbiAyLnggdG8gaGFuZGxlIGtleWJvYXJkIGludGVycnVwdAorICAgICAgICBzZWxmLl9zdG9wID0gbXVsdGlwcm9jZXNzaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fYXN5bmMgPSBjb25jdXJyZW5jeSA+IDEKKyAgICAgICAgaWYgbm90IHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbCA9IE5vbmUKKyAgICAgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgICAgICBnbG9iYWwgcG9ydHMKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9zdG9wCisgICAgICAgICAgICBwb3J0cyA9IFBvcnRBbGxvY2F0b3IoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbSA9IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5CYXNlTWFuYWdlcigpCisgICAgICAgICAgICBzZWxmLl9tLnJlZ2lzdGVyKCdwb3J0cycsIFBvcnRBbGxvY2F0b3IpCisgICAgICAgICAgICBzZWxmLl9tLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuX3Bvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChjb25jdXJyZW5jeSwgc2VsZi5fcG9vbF9pbml0LCAoc2VsZi5fbS5hZGRyZXNzLCkpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygKKyAgICAgICAgICAgICdUZXN0RGlzcGF0Y2hlciBzdGFydGVkIHdpdGggJWQgY29uY3VycmVudCBqb2JzJyAlIGNvbmN1cnJlbmN5KQorCisgICAgZGVmIF9wb29sX2luaXQoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIGdsb2JhbCBzdG9wCisgICAgICAgIGdsb2JhbCBtCisgICAgICAgIGdsb2JhbCBwb3J0cworICAgICAgICBzdG9wID0gc2VsZi5fc3RvcAorICAgICAgICBtID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLkJhc2VNYW5hZ2VyKGFkZHJlc3MpCisgICAgICAgIG0uY29ubmVjdCgpCisgICAgICAgIHBvcnRzID0gbS5wb3J0cygpCisKKyAgICBkZWYgX2Rpc3BhdGNoX3N5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgciA9IHJ1bl90ZXN0KHNlbGYudGVzdGRpciwgc2VsZi5sb2dkaXIsIHRlc3QsIG1heF9yZXRyeSwgYXN5bmNfbW9kZT1GYWxzZSkKKyAgICAgICAgY29udChyKQorICAgICAgICByZXR1cm4gTm9uQXN5bmNSZXN1bHQocikKKworICAgIGRlZiBfZGlzcGF0Y2hfYXN5bmMoc2VsZiwgdGVzdCwgY29udCwgbWF4X3JldHJ5KToKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdfZGlzcGF0Y2hfYXN5bmMnKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9vbC5hcHBseV9hc3luYyhmdW5jPXJ1bl90ZXN0LCBhcmdzPShzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnkpLCBjYWxsYmFjaz1jb250KQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIHRlc3QsIG1heF9yZXRyeSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5fcmVwb3J0LmFkZF90ZXN0KHRlc3QpCisKKyAgICAgICAgZGVmIGNvbnQocmVzdWx0KToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdG9wLmlzX3NldCgpOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBhbmQgbGVuKHJlc3VsdCkgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQsIHJldHVybmNvZGUgPSByZXN1bHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuY29kZSA9IFJFU1VMVF9FUlJPUgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnZnJlZWluZyBwb3J0JykKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2FkZGluZyByZXN1bHQnKQorICAgICAgICAgICAgICAgIHNlbGYuX3JlcG9ydC5hZGRfcmVzdWx0KGluZGV4LCByZXR1cm5jb2RlLCByZXR1cm5jb2RlID09IFJFU1VMVF9USU1FT1VULCByZXRyeV9jb3VudCkKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ2ZpbmlzaCBjb250aW51YXRpb24nKQorICAgICAgICBmbiA9IHNlbGYuX2Rpc3BhdGNoX2FzeW5jIGlmIHNlbGYuX2FzeW5jIGVsc2Ugc2VsZi5fZGlzcGF0Y2hfc3luYworICAgICAgICByZXR1cm4gZm4odGVzdCwgY29udCwgbWF4X3JldHJ5KQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2FzeW5jOgorICAgICAgICAgICAgc2VsZi5fcG9vbC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXBvcnQuZW5kKCkKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHNlbGYuX3N0b3Auc2V0KCkKKyAgICAgICAgaWYgc2VsZi5fYXN5bmM6CisgICAgICAgICAgICBzZWxmLl9wb29sLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICBzZWxmLl9wb29sLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5fbS5zaHV0ZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZyBiL3Rlc3QvY3Jvc3NydW5uZXIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Nyb3NzcnVubmVyL3NldHVwLmNmZwpAQCAtMCwwICsxLDIgQEAKK1tmbGFrZThdCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTkxMjg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CkBAIC0wLDAgKzEsMTQ5IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSAuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KK2Zyb20gLnV0aWwgaW1wb3J0IG1lcmdlX2RpY3QsIGRvbWFpbl9zb2NrZXRfcGF0aAorCisKK2NsYXNzIFRlc3RQcm9ncmFtKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtpbmQsIG5hbWUsIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCwgd29ya2Rpciwgc3RvcF9zaWduYWwsIGNvbW1hbmQsIGVudj1Ob25lLAorICAgICAgICAgICAgICAgICBleHRyYV9hcmdzPVtdLCBleHRyYV9hcmdzMj1bXSwgam9pbl9hcmdzPUZhbHNlLCAqKmt3YXJncyk6CisKKyAgICAgICAgc2VsZi5raW5kID0ga2luZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAorICAgICAgICBzZWxmLndvcmtkaXIgPSB3b3JrZGlyCisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCisgICAgICAgIHNlbGYuX2Jhc2VfY29tbWFuZCA9IHNlbGYuX2ZpeF9jbWRfcGF0aChjb21tYW5kKQorICAgICAgICBpZiBlbnY6CisgICAgICAgICAgICBzZWxmLmVudiA9IGNvcHkuY29weShvcy5lbnZpcm9uKQorICAgICAgICAgICAgc2VsZi5lbnYudXBkYXRlKGVudikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW52ID0gb3MuZW52aXJvbgorICAgICAgICBzZWxmLl9leHRyYV9hcmdzID0gZXh0cmFfYXJncworICAgICAgICBzZWxmLl9leHRyYV9hcmdzMiA9IGV4dHJhX2FyZ3MyCisgICAgICAgIHNlbGYuX2pvaW5fYXJncyA9IGpvaW5fYXJncworCisgICAgZGVmIF9maXhfY21kX3BhdGgoc2VsZiwgY21kKToKKyAgICAgICAgIyBpZiB0aGUgYXJnIGlzIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG1ha2UgaXQgcGF0aAorICAgICAgICBkZWYgYWJzX2lmX2V4aXN0cyhhcmcpOgorICAgICAgICAgICAgcCA9IHBhdGhfam9pbihzZWxmLndvcmtkaXIsIGFyZykKKyAgICAgICAgICAgIHJldHVybiBwIGlmIG9zLnBhdGguZXhpc3RzKHApIGVsc2UgYXJnCisKKyAgICAgICAgaWYgY21kWzBdID09ICdweXRob24nOgorICAgICAgICAgICAgY21kWzBdID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZFswXSA9IGFic19pZl9leGlzdHMoY21kWzBdKQorICAgICAgICByZXR1cm4gY21kCisKKyAgICBkZWYgX3NvY2tldF9hcmdzKHNlbGYsIHNvY2tldCwgcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnaXAtc3NsJzogWyctLXNzbCddLAorICAgICAgICAgICAgJ2RvbWFpbic6IFsnLS1kb21haW4tc29ja2V0PSVzJyAlIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KV0sCisgICAgICAgICAgICAnYWJzdHJhY3QnOiBbJy0tYWJzdHJhY3QtbmFtZXNwYWNlJywgJy0tZG9tYWluLXNvY2tldD0lcycgJSBkb21haW5fc29ja2V0X3BhdGgocG9ydCldLAorICAgICAgICB9LmdldChzb2NrZXQsIE5vbmUpCisKKyAgICBkZWYgX3RyYW5zcG9ydF9hcmdzKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAnemxpYic6IFsnLS16bGliJ10sCisgICAgICAgIH0uZ2V0KHRyYW5zcG9ydCwgTm9uZSkKKworICAgIGRlZiBidWlsZF9jb21tYW5kKHNlbGYsIHBvcnQpOgorICAgICAgICBjbWQgPSBjb3B5LmNvcHkoc2VsZi5fYmFzZV9jb21tYW5kKQorICAgICAgICBhcmdzID0gY29weS5jb3B5KHNlbGYuX2V4dHJhX2FyZ3MyKQorICAgICAgICBhcmdzLmFwcGVuZCgnLS1wcm90b2NvbD0nICsgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgYXJncy5hcHBlbmQoJy0tdHJhbnNwb3J0PScgKyBzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgdHJhbnNwb3J0X2FyZ3MgPSBzZWxmLl90cmFuc3BvcnRfYXJncyhzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgaWYgdHJhbnNwb3J0X2FyZ3M6CisgICAgICAgICAgICBhcmdzICs9IHRyYW5zcG9ydF9hcmdzCisgICAgICAgIHNvY2tldF9hcmdzID0gc2VsZi5fc29ja2V0X2FyZ3Moc2VsZi5zb2NrZXQsIHBvcnQpCisgICAgICAgIGlmIHNvY2tldF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSBzb2NrZXRfYXJncworICAgICAgICBhcmdzLmFwcGVuZCgnLS1wb3J0PSVkJyAlIHBvcnQpCisgICAgICAgIGlmIHNlbGYuX2pvaW5fYXJnczoKKyAgICAgICAgICAgIGNtZC5hcHBlbmQoJyVzJyAlICIgIi5qb2luKGFyZ3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kLmV4dGVuZChhcmdzKQorICAgICAgICBpZiBzZWxmLl9leHRyYV9hcmdzOgorICAgICAgICAgICAgY21kLmV4dGVuZChzZWxmLl9leHRyYV9hcmdzKQorICAgICAgICBzZWxmLmNvbW1hbmQgPSBjbWQKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZAorCisKK2NsYXNzIFRlc3RFbnRyeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZGlyLCBzZXJ2ZXIsIGNsaWVudCwgZGVsYXksIHRpbWVvdXQsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gdGVzdGRpcgorICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHNlbGYuX2NvbmZpZyA9IGt3YXJncworICAgICAgICBzZWxmLnByb3RvY29sID0ga3dhcmdzWydwcm90b2NvbCddCisgICAgICAgIHNlbGYudHJhbnNwb3J0ID0ga3dhcmdzWyd0cmFuc3BvcnQnXQorICAgICAgICBzZWxmLnNvY2tldCA9IGt3YXJnc1snc29ja2V0J10KKyAgICAgICAgc3J2X2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgc2VydmVyKSkKKyAgICAgICAgY2xpX2RpY3QgPSBzZWxmLl9maXhfd29ya2RpcihtZXJnZV9kaWN0KHNlbGYuX2NvbmZpZywgY2xpZW50KSkKKyAgICAgICAgY2xpX2RpY3RbJ2V4dHJhX2FyZ3MyJ10gPSBzcnZfZGljdC5wb3AoJ3JlbW90ZV9hcmdzJywgW10pCisgICAgICAgIHNydl9kaWN0WydleHRyYV9hcmdzMiddID0gY2xpX2RpY3QucG9wKCdyZW1vdGVfYXJncycsIFtdKQorICAgICAgICBzZWxmLnNlcnZlciA9IFRlc3RQcm9ncmFtKCdzZXJ2ZXInLCAqKnNydl9kaWN0KQorICAgICAgICBzZWxmLmNsaWVudCA9IFRlc3RQcm9ncmFtKCdjbGllbnQnLCAqKmNsaV9kaWN0KQorICAgICAgICBzZWxmLmRlbGF5ID0gZGVsYXkKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLl9uYW1lID0gTm9uZQorICAgICAgICAjIHJlc3VsdHMKKyAgICAgICAgc2VsZi5zdWNjZXNzID0gTm9uZQorICAgICAgICBzZWxmLmFzX2V4cGVjdGVkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuZXhwaXJlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucmV0cnlfY291bnQgPSAwCisKKyAgICBkZWYgX2ZpeF93b3JrZGlyKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIGtleSA9ICd3b3JrZGlyJworICAgICAgICBwYXRoID0gY29uZmlnLmdldChrZXksIE5vbmUpCisgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgcGF0aCA9IHNlbGYudGVzdGRpcgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGgpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGhfam9pbihzZWxmLnRlc3RkaXIsIHBhdGgpKQorICAgICAgICBjb25maWcudXBkYXRlKHtrZXk6IHBhdGh9KQorICAgICAgICByZXR1cm4gY29uZmlnCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZ2V0X25hbWUoY2xzLCBzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gJyVzLSVzXyVzXyVzLSVzJyAlIChzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uYW1lOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IHNlbGYuZ2V0X25hbWUoCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIubmFtZSwgc2VsZi5jbGllbnQubmFtZSwgc2VsZi5wcm90b2NvbCwgc2VsZi50cmFuc3BvcnQsIHNlbGYuc29ja2V0KQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRyYW5zcG9ydF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzLSVzJyAlIChzZWxmLnRyYW5zcG9ydCwgc2VsZi5zb2NrZXQpCisKKworZGVmIHRlc3RfbmFtZShzZXJ2ZXIsIGNsaWVudCwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCAqKmt3YXJncyk6CisgICAgcmV0dXJuIFRlc3RFbnRyeS5nZXRfbmFtZShzZXJ2ZXJbJ25hbWUnXSwgY2xpZW50WyduYW1lJ10sIHByb3RvY29sLCB0cmFuc3BvcnQsIHNvY2tldCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjE0ZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgY29weQorCisKK2RlZiBkb21haW5fc29ja2V0X3BhdGgocG9ydCk6CisgICAgcmV0dXJuICcvdG1wL1RocmlmdFRlc3QudGhyaWZ0LiVkJyAlIHBvcnQKKworCitkZWYgbWVyZ2VfZGljdChiYXNlLCB1cGRhdGUpOgorICAgICIiIlVwZGF0ZSBkaWN0IGNvbmNhdGVuYXRpbmcgbGlzdCB2YWx1ZXMiIiIKKyAgICByZXMgPSBjb3B5LmRlZXBjb3B5KGJhc2UpCisgICAgZm9yIGssIHYgaW4gbGlzdCh1cGRhdGUuaXRlbXMoKSk6CisgICAgICAgIGlmIGsgaW4gbGlzdChyZXMua2V5cygpKSBhbmQgaXNpbnN0YW5jZSh2LCBsaXN0KToKKyAgICAgICAgICAgIHJlc1trXS5leHRlbmQodikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc1trXSA9IHYKKyAgICByZXR1cm4gcmVzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3NoYXJwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDk1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworR0VORVJBVEVEID0gXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvQm9uay5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb29scy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9Cb29sVGVzdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9DcmF6eU5lc3RpbmcuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvRW1wdHlTdHJ1Y3QuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvR3Vlc3NQcm90b2NvbFN0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9JbnNhbml0eS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MYXJnZURlbHRhcy5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9MaXN0Qm9ua3MuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdFR5cGVWZXJzaW9uaW5nVjEuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTGlzdFR5cGVWZXJzaW9uaW5nVjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNCb25rLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L05lc3RlZExpc3RzSTMyeDIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvTmVzdGVkTGlzdHNJMzJ4My5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9OZXN0ZWRNaXhlZHgyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L051bWJlcnouY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvT25lRmllbGQuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvU2Vjb25kU2VydmljZS5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9TdHJ1Y3RBLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1N0cnVjdEIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVGhyaWZ0VGVzdC5Db25zdGFudHMuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvVGhyaWZ0VGVzdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9WZXJzaW9uaW5nVGVzdFYxLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1ZlcnNpb25pbmdUZXN0VjIuY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWGNlcHRpb24uY3MgXAorCWdlbi1jc2hhcnAvVGhyaWZ0L1Rlc3QvWGNlcHRpb24yLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdC5jcyBcCisJZ2VuLWNzaGFycC9UaHJpZnQvVGVzdC9YdHJ1Y3QyLmNzIFwKKwlnZW4tY3NoYXJwL1RocmlmdC9UZXN0L1h0cnVjdDMuY3MKKworQlVJTFRfU09VUkNFUyA9ICQoR0VORVJBVEVEKQorCitpZiBNT05PX01DUworQ1NDID0gbWNzCitlbHNlCitDU0MgPSBnbWNzCitlbmRpZgorCitpZiBORVRfMl8wCitDU0NfREVGSU5FUyA9IC1kOk5FVF8yXzAKK2VuZGlmCisKK0xJQkRJUiA9ICQodG9wX2J1aWxkZGlyKS9saWIvY3NoYXJwCisKK1RIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKKyQoR0VORVJBVEVEKTogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBjc2hhcnAgLW8gLiAkPAorCitwcmVjcm9zczogVGVzdENsaWVudFNlcnZlci5leGUKKworVGhyaWZ0SW1wbC5kbGw6ICQoR0VORVJBVEVEKSAkKExJQkRJUikvVGhyaWZ0LmRsbAorCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtdDpsaWJyYXJ5IC1vdXQ6JEAgLXJlZmVyZW5jZTokKExJQkRJUikvVGhyaWZ0LmRsbCAkKEdFTkVSQVRFRCkKKworU1JDUyA9IFRlc3RDbGllbnQuY3MgVGVzdFNlcnZlci5jcyBQcm9ncmFtLmNzCisKK1Rlc3RDbGllbnRTZXJ2ZXIuZXhlOiAkKFNSQ1MpIFRocmlmdEltcGwuZGxsCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXJlZmVyZW5jZTokKExJQkRJUikvVGhyaWZ0LmRsbCAtcmVmZXJlbmNlOlRocmlmdEltcGwuZGxsICQoU1JDUykKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIGdlbi1jc2hhcnAgKi5leGUgKi5kbGwKKworVEVTVFBPUlQgPSA5NTAwCitjaGVjay1sb2NhbDogVGVzdENsaWVudFNlcnZlci5leGUKKwlNT05PX1BBVEg9JChMSUJESVIpIHRpbWVvdXQgMTAgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBzZXJ2ZXIgLS1wb3J0PSQoVEVTVFBPUlQpICYKKwlzbGVlcCAxCisJTU9OT19QQVRIPSQoTElCRElSKSBtb25vIFRlc3RDbGllbnRTZXJ2ZXIuZXhlIGNsaWVudCAtLXBvcnQ9JChURVNUUE9SVCkKKworRVhUUkFfRElTVCA9IFwKKwlQcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisJVGhyaWZ0VGVzdC5jc3Byb2ogXAorCVRocmlmdFRlc3Quc2xuIFwKKwlQcm9ncmFtLmNzIFwKKwlUZXN0U2VydmVyLmNzIFwKKwlUZXN0Q2xpZW50LmNzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9ncmFtLmNzIGIvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWMwMGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jc2hhcnAvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQorLy8KKy8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKKy8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuVGVzdDsgLy9nZW5lcmF0ZWQgY29kZQorCituYW1lc3BhY2UgVGVzdAoreworICAgIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5TZXRCdWZmZXJTaXplKENvbnNvbGUuQnVmZmVyV2lkdGgsIDQwOTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRmFpbGVkIHRvIGdyb3cgc2Nyb2xsLWJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmluZ1tdIHN1YkFyZ3MgPSBuZXcgc3RyaW5nW2FyZ3MuTGVuZ3RoIC0gMV07CisgICAgICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdWJBcmdzW2ktMV0gPSBhcmdzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT0gImNsaWVudCIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbMF0gPT0gInNlcnZlciIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKSA/IDAgOiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJmaXJzdCBhcmd1bWVudCBtdXN0IGJlICdzZXJ2ZXInIG9yICdjbGllbnQnIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9jc2hhcnAvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMDFhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRUZXN0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZjQxYjE5M2ItZjFhYi00OGVlLTg4NDMtZjg4ZTQzMDg0ZTI2IildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1Rlc3RDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OWMwNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsODcwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKK3VzaW5nIFRocmlmdC5UZXN0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOworCituYW1lc3BhY2UgVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdFBhcmFtcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBob3N0ID0gImxvY2FsaG9zdCI7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIHN0cmluZyB1cmw7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHBpcGU7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBidWZmZXJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGZyYW1lZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvdG9jb2w7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBlbmNyeXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIG11bHRpcGxleGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNGaXJzdFRyYW5zcG9ydCA9IHRydWU7CisKKworICAgICAgICAgICAgcHVibGljIFRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNlcnRQYXRoID0gIi4uL2tleXMvY2xpZW50LnAxMiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0UGF0aCwgInRocmlmdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRUTFNTb2NrZXQoaG9zdCwgcG9ydCwgMCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvLCBjLCBjaGFpbiwgZXJyb3JzKSA9PiB0cnVlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX2lzRmlyc3RUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZW5zdXJlIHByb3BlciBvcGVuL2Nsb3NlIG9mIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuT3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pc0ZpcnN0VHJhbnNwb3J0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50KG5ldyBVcmkodXJsKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIENyZWF0ZVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAiY29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByb3RvY29sID09ICJqc29uIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQmFzZVR5cGVzID0gMTsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JTdHJ1Y3RzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JDb250YWluZXJzID0gNDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JFeGNlcHRpb25zID0gODsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JQcm90b2NvbCA9IDE2OworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclVua25vd24gPSA2NDsKKworICAgICAgICBwcml2YXRlIGNsYXNzIENsaWVudFRlc3QKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUZXN0UGFyYW1zIHBhcmFtOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW1pbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHBhcmFtaW47CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIHByb3RvY29sID0gcGFyYW0uQ3JlYXRlUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0ubXVsdGlwbGV4ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmQgPSBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHByb3RvY29sKTsKKyAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gcGFyYW0ubnVtSXRlcmF0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkb25lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4ZWN1dGUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEV4ZWN1dGVDbGllbnRUZXN0KGNsaWVudCwgc2Vjb25kLCBwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlIGNsb3NpbmcgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZXN0UGFyYW1zIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKyAgICAgICAgICAgICAgICBpbnQgbnVtVGhyZWFkcyA9IDE7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldID09ICItdSIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0udXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLm51bUl0ZXJhdGlvbnMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1waXBlIikgIC8vIC1waXBlIDxuYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnBpcGUgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIG5hbWVkIHBpcGVzIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1ob3N0PSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmhvc3QgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5Db250YWlucygiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikrMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5idWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tY29tcGFjdCIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPW11bHRpYyIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucHJvdG9jb2wgPSAiY29tcGFjdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPW11bHRpaiIpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucHJvdG9jb2wgPSAianNvbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIEpTT04gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5lbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBlbmNyeXB0ZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcHJvdG9jb2w9bXVsdGkiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5tdWx0aXBsZXhlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgIHBhcnNpbmcgYXJndW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gRW51bWVyYWJsZS5SYW5nZSgwLCBudW1UaHJlYWRzKS5TZWxlY3QoXyA9PiBuZXcgQ2xpZW50VGVzdChwYXJhbSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUaHJlYWQodGVzdC5FeGVjdXRlKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIERhdGVUaW1lIHN0YXJ0ID0gRGF0ZVRpbWUuTm93OworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgICAgICB0LkpvaW4oKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0LCBib29sIGh1Z2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGh1Z2UgPSB0cnVlIHRlc3RzIGZvciBUSFJJRlQtNDM3MgorICAgICAgICAgICAgYnl0ZVtdIHJldHZhbCA9IG5ldyBieXRlW2h1Z2UgPyAweDEyMzQ1IDogMHgxMDBdOworICAgICAgICAgICAgaW50IGluaXRMZW4gPSByZXR2YWwuTGVuZ3RoOworCisgICAgICAgICAgICAvLyBsaW5lYXIgZGlzdHJpYnV0aW9uLCB1bmxlc3MgcmFuZG9tIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKCFyYW5kb21EaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsW2ldID0gKGJ5dGUpaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbgorICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgd2hpbGUoIHRydWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZUNsaWVudFRlc3QoVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50LCBTZWNvbmRTZXJ2aWNlLkNsaWVudCBzZWNvbmQsIFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gMDsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gdm9pZCIpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RyaW5nKFwiVGVzdFwiKSIpOworICAgICAgICAgICAgc3RyaW5nIHMgPSBjbGllbnQudGVzdFN0cmluZygiVGVzdCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgIGlmICgiVGVzdCIgIT0gcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW0ubXVsdGlwbGV4ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInNlY29uZFRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgICAgICAgIHMgPSBzZWNvbmQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IFwiIiArIHMgKyAiXCIiKTsKKyAgICAgICAgICAgICAgaWYgKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiICE9IHMpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclByb3RvY29sOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICBib29sIHQgPSBjbGllbnQudGVzdEJvb2woKGJvb2wpdHJ1ZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHQpOworICAgICAgICAgICAgaWYgKCF0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0Qm9vbChmYWxzZSkiKTsKKyAgICAgICAgICAgIGJvb2wgZiA9IGNsaWVudC50ZXN0Qm9vbCgoYm9vbClmYWxzZSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGYpOworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgICAgIHNieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChzYnl0ZSkxKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTgpOworICAgICAgICAgICAgaWYgKDEgIT0gaTgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEkzMigtMSkiKTsKKyAgICAgICAgICAgIGludCBpMzIgPSBjbGllbnQudGVzdEkzMigtMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGkzMik7CisgICAgICAgICAgICBpZiAoLTEgIT0gaTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOworICAgICAgICAgICAgbG9uZyBpNjQgPSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpNjQpOworICAgICAgICAgICAgaWYgKC0zNDM1OTczODM2OCAhPSBpNjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgICAgIGRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoNS4zMjUwOTgyMzUgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkiKTsKKyAgICAgICAgICAgIGR1YiA9IGNsaWVudC50ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkzMiA9IDA7IGkzMiA8IDI7ICsraTMyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBodWdlID0gKGkzMiA+IDApOworICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEoZmFsc2UsaHVnZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW4uTGVuZ3RoICE9IGJpbk91dC5MZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5JbltvZnNdICE9IGJpbk91dFtvZnNdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIGlmKCB0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpLkRlY2xhcmluZ1R5cGUgPT0gdHlwZW9mKENyYXp5TmVzdGluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3JhenlOZXN0aW5nIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgICAgICBDcmF6eU5lc3RpbmcgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgICAgIG9uZS5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVsxMF0geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgICAgICBpZiAoIW9uZS5FcXVhbHModHdvKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQ29udGFpbmVyczsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ3JhenlOZXN0aW5nLkVxdWFscyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOworICAgICAgICAgICAgWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICBvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKKyAgICAgICAgICAgIG8uQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgby5JMzJfdGhpbmcgPSAtMzsKKyAgICAgICAgICAgIG8uSTY0X3RoaW5nID0gLTU7CisgICAgICAgICAgICBYdHJ1Y3QgaSA9IGNsaWVudC50ZXN0U3RydWN0KG8pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9KSIpOworICAgICAgICAgICAgWHRydWN0MiBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgICAgICBvMi5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvMi5TdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICAgICAgbzIuSTMyX3RoaW5nID0gNTsKKyAgICAgICAgICAgIFh0cnVjdDIgaTIgPSBjbGllbnQudGVzdE5lc3QobzIpOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG1hcG91dCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFwb3V0W2pdID0gaiAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcCh7Iik7CisgICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBpbiA9IGNsaWVudC50ZXN0TWFwKG1hcG91dCk7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBrZXkgaW4gbWFwaW4uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcGluW2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgTGlzdDxpbnQ+IGxpc3RvdXQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBsaXN0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBMaXN0PGludD4gbGlzdGluID0gY2xpZW50LnRlc3RMaXN0KGxpc3RvdXQpOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBsaXN0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vc2V0CisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBUSGFzaFNldDxpbnQ+IHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKGludCBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICBUSGFzaFNldDxpbnQ+IHNldGluID0gY2xpZW50LnRlc3RTZXQoc2V0b3V0KTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oT05FKSIpOworICAgICAgICAgICAgTnVtYmVyeiByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouT05FICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRXTyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVEhSRUUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICAgICAgcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouRklWRSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5GSVZFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgICAgICByZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5FSUdIVCAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgICAgIGxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7CisgICAgICAgICAgICBYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICB0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgICAgICAgICAgdHJ1Y2suQnl0ZV90aGluZyA9IChzYnl0ZSk4OworICAgICAgICAgICAgdHJ1Y2suSTMyX3RoaW5nID0gODsKKyAgICAgICAgICAgIHRydWNrLkk2NF90aGluZyA9IDg7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzLkFkZCh0cnVjayk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICAgICAgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gd2hvYSA9IGNsaWVudC50ZXN0SW5zYW5pdHkoaW5zYW5lKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGxvbmcga2V5IGluIHdob2EuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PiB2YWwgPSB3aG9hW2tleV07CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKE51bWJlcnogazIgaW4gdmFsLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJbnNhbml0eSB2MiA9IHZhbFtrMl07CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMiArICIgPT4geyIpOworICAgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+IHVzZXJNYXAgPSB2Mi5Vc2VyTWFwOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoTnVtYmVyeiBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWHRydWN0IHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgaW50IGFyZzEgPSAyOworICAgICAgICAgICAgbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKKyAgICAgICAgICAgIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIG11bHRpRGljdFsxXSA9ICJvbmUiOworICAgICAgICAgICAgTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICAgICAgbG9uZyBhcmc1ID0gNTAwMDAwMDsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIFh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiWGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwiVEV4Y2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0RXhjZXB0aW9uKFwib2tcIikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigib2siKTsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb25cIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZSIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwiWGNlcHRpb24yXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24yIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMjAwMiB8fCBleC5TdHJ1Y3RfdGhpbmcuU3RyaW5nX3RoaW5nICE9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcInN1Y2Nlc3NcIiwgXCJPS1wiKSIpOworICAgICAgICAgICAgICAgIGlmICgiT0siICE9IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oInN1Y2Nlc3MiLCAiT0siKS5TdHJpbmdfdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdG9wd2F0Y2ggc3cgPSBuZXcgU3RvcHdhdGNoKCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgT25ld2F5KDEpIik7CisgICAgICAgICAgICBjbGllbnQudGVzdE9uZXdheSgxKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIGlmIChzdy5FbGFwc2VkTWlsbGlzZWNvbmRzID4gMTAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciB0aW1lcyA9IDUwOworICAgICAgICAgICAgc3cuUmVzZXQoKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IHRpbWVzOyArK2spCisgICAgICAgICAgICAgICAgY2xpZW50LnRlc3RWb2lkKCk7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gezB9IG1zIGEgdGVzdFZvaWQoKSBjYWxsIiwgc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyAvIHRpbWVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXR1cm5Db2RlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGVzdFNlcnZlci5jcyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2NDVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCisvLworLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgorLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlRlc3Q7IC8vZ2VuZXJhdGVkIGNvZGUKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2w7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOworCituYW1lc3BhY2UgVGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0U2VydmVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBfY2xpZW50SUQgPSAtMTsKKyAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgVGVzdExvZ0RlbGVnYXRlKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpOworCisgICAgICAgIHB1YmxpYyBjbGFzcyBUcmFkZVNlcnZlckV2ZW50SGFuZGxlciA6IFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBjYWxsQ291bnQgPSAwOworICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlU2VydmUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGVDb250ZXh0KFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlRyYW5zcG9ydC5UVHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlciA6IFRocmlmdFRlc3QuSWZhY2UsIFRocmlmdC5UQ29udHJvbGxpbmdIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcmV1c2FibGVTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHByaXZhdGUgVGVzdExvZ0RlbGVnYXRlIHRlc3RMb2dEZWxlZ2F0ZTsKKworICAgICAgICAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySUQgPSBJbnRlcmxvY2tlZC5JbmNyZW1lbnQocmVmIF9jbGllbnRJRCk7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlICs9IHRlc3RDb25zb2xlTG9nZ2VyOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoIk5ldyBUZXN0SGFuZGxlciBpbnN0YW5jZSBjcmVhdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zb2xlTG9nZ2VyKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdCgiaGFuZGxlcnswOkQzfToiLGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZEZvcm1hdChtc2csIHZhbHVlcyk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZExpbmUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCByZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHRlc3RTdHJpbmcoc3RyaW5nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RTdHJpbmcoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sIHRlc3RCb29sKGJvb2wgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzYnl0ZSB0ZXN0Qnl0ZShzYnl0ZSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0Qnl0ZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0STMyKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RG91YmxlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIHRlc3RCaW5hcnkoYnl0ZVtdIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmluZyBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RCaW5hcnkoezA6WH0pIiwgaGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QyIHRlc3ROZXN0KFh0cnVjdDIgbmVzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgdGhpbmcgPSBuZXN0LlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TmVzdCh7e3swfSwge3tcInsxfVwiLCB7Mn0sIHszfSwgezR9LCB7NX19fX19KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0LkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGluZy5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVzdC5JMzJfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIGludD4gdGVzdE1hcChEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0TWFwKHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGVzdFN0cmluZ01hcChEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVEhhc2hTZXQ8aW50PiB0ZXN0U2V0KFRIYXNoU2V0PGludD4gdGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgidGVzdFNldCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kKCJ0ZXN0TGlzdCh7eyIpOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXVzYWJsZVN0cmluZ0J1aWxkZXIuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV1c2FibGVTdHJpbmdCdWlsZGVyLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZShyZXVzYWJsZVN0cmluZ0J1aWxkZXIuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgTnVtYmVyeiB0ZXN0RW51bShOdW1iZXJ6IHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RFbnVtKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyB0ZXN0VHlwZWRlZihsb25nIHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RUeXBlZGVmKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiBtYXBtYXAgPQorICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4oKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IHBvcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcG1hcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5zYW5pdHkKKyAgICAgICAgICAgIC8vIHJldHVybnM6CisgICAgICAgICAgICAvLyB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgLy8gICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICB9LAorICAgICAgICAgICAgLy8gICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAgICAgICAgIC8vIH0KKyAgICAgICAgICAgIHB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdEluc2FuaXR5KCkiKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IGluc2FuZSA9CisgICAgICAgICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4oKTsKKyAgICAgICAgICAgICAgICBpbnNhbmVbKGxvbmcpMV0gPSBmaXJzdF9tYXA7CisgICAgICAgICAgICAgICAgaW5zYW5lWyhsb25nKTJdID0gc2Vjb25kX21hcDsKKworICAgICAgICAgICAgICAgIHJldHVybiBpbnNhbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKHNieXRlIGFyZzAsIGludCBhcmcxLCBsb25nIGFyZzIsIERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVzdExvZ0RlbGVnYXRlLkludm9rZSgidGVzdE11bHRpKCkiKTsKKworICAgICAgICAgICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOworICAgICAgICAgICAgICAgIGhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICAgICAgICAgIGhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOworICAgICAgICAgICAgICAgIGhlbGxvLkkzMl90aGluZyA9IGFyZzE7CisgICAgICAgICAgICAgICAgaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGVsbG87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAgICAgICAgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICAgICAgICAgICogaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgICAgICAgICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAgICAgICAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0RXhjZXB0aW9uKHswfSkiLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFhjZXB0aW9uIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgeC5FcnJvckNvZGUgPSAxMDAxOworICAgICAgICAgICAgICAgICAgICB4Lk1lc3NhZ2UgPSBhcmc7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRocmlmdC5URXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFh0cnVjdCB0ZXN0TXVsdGlFeGNlcHRpb24oc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RNdWx0aUV4Y2VwdGlvbih7MH0sIHsxfSkiLCBhcmcwLGFyZzEpOworICAgICAgICAgICAgICAgIGlmIChhcmcwID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgICAgICAgICAgeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWGNlcHRpb24yIHggPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICAgICAgICAgICAgICAgIHguRXJyb3JDb2RlID0gMjAwMjsKKyAgICAgICAgICAgICAgICAgICAgeC5TdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuU3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IGFyZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0T25ld2F5KHswfSksIHNsZWVwaW5nLi4uIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uVGhyZWFkaW5nLlRocmVhZC5TbGVlcChhcmcgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICB0ZXN0TG9nRGVsZWdhdGUuSW52b2tlKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSAvLyBjbGFzcyBUZXN0SGFuZGxlcgorCisgICAgICAgIHByaXZhdGUgZW51bSBTZXJ2ZXJUeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFRTaW1wbGVTZXJ2ZXIsCisgICAgICAgICAgICBUVGhyZWFkZWRTZXJ2ZXIsCisgICAgICAgICAgICBUVGhyZWFkUG9vbFNlcnZlciwKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBQcm9jZXNzb3JGYWN0b3J5VHlwZQorICAgICAgICB7CisgICAgICAgICAgICBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZSwgdXNlRnJhbWVkID0gZmFsc2UsIHVzZUVuY3J5cHRpb24gPSBmYWxzZSwgY29tcGFjdCA9IGZhbHNlLCBqc29uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gU2VydmVyVHlwZS5UU2ltcGxlU2VydmVyOworICAgICAgICAgICAgICAgIFByb2Nlc3NvckZhY3RvcnlUeXBlIHByb2Nlc3NvckZhY3RvcnlUeXBlID0gUHJvY2Vzc29yRmFjdG9yeVR5cGUuVFNpbmdsZXRvblByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgICAgIHN0cmluZyBwaXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MuTGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXBpcGUiKSAgLy8gLXBpcGUgbmFtZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uQ29udGFpbnMoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlRnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRlZCIgfHwgYXJnc1tpXSA9PSAiLS1zZXJ2ZXItdHlwZT10aHJlYWRlZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRUaHJlYWRlZFNlcnZlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZHBvb2wiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclR5cGUgPSBTZXJ2ZXJUeXBlLlRUaHJlYWRQb29sU2VydmVyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tcHJvdG90eXBlIiB8fCBhcmdzW2ldID09ICItLXByb2Nlc3Nvcj1wcm90b3R5cGUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5VHlwZSA9IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tc3NsIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwaXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodXNlRW5jcnlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNlcnRQYXRoID0gIi4uL2tleXMvc2VydmVyLnAxMiI7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cywgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBTc2xQcm90b2NvbHMuVGxzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCwgMCwgdXNlQnVmZmVyZWRTb2NrZXRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG87CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhY3QpCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpzb24pCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRKU09OUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKworICAgICAgICAgICAgICAgIFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaWYgKHByb2Nlc3NvckZhY3RvcnlUeXBlID09IFByb2Nlc3NvckZhY3RvcnlUeXBlLlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeTxUaHJpZnRUZXN0LlByb2Nlc3NvciwgVGVzdEhhbmRsZXI+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICBUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOworICAgICAgICAgICAgICAgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSh0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3Rvcnk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUZyYW1lZCkKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5ID0gbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBUU2VydmVyIHNlcnZlckVuZ2luZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlcnZlclR5cGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNlcnZlclR5cGUuVFRocmVhZFBvb2xTZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU2VydmVyVHlwZS5UVGhyZWFkZWRTZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHByb3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgcHJvdG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIHNlcnZlckV2ZW50cyA9IG5ldyBUcmFkZVNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5zZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKworICAgICAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgICAgIHN0cmluZyB3aGVyZSA9IChwaXBlICE9IG51bGwgPyAib24gcGlwZSAiICsgcGlwZSA6ICJvbiBwb3J0ICIgKyBwb3J0KTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlICIgKyBzZXJ2ZXJUeXBlLlRvU3RyaW5nKCkgKyAiICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzb3JGYWN0b3J5VHlwZSA9PSBQcm9jZXNzb3JGYWN0b3J5VHlwZS5UUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSA/ICIgd2l0aCBwcm9jZXNzb3IgcHJvdG90eXBlIGZhY3RvcnkgIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICh1c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAodXNlRW5jcnlwdGlvbiA/ICIgd2l0aCBlbmNyeXB0aW9uIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgIChjb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgKGpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAiLi4uIik7CisgICAgICAgICAgICAgICAgc2VydmVyRW5naW5lLlNlcnZlKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlKHgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvaiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjI5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvagpAQCAtMCwwICsxLDE0MSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFByb2plY3QgVG9vbHNWZXJzaW9uPSI0LjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgorICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KKyAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4KKyAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+CisgICAgPFByb2plY3RHdWlkPns0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9PC9Qcm9qZWN0R3VpZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPgorICAgIDxSb290TmFtZXNwYWNlPlRocmlmdFRlc3Q8L1Jvb3ROYW1lc3BhY2U+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRUZXN0PC9Bc3NlbWJseU5hbWU+CisgICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djMuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KKyAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+CisgICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4KKyAgICA8RmlsZVVwZ3JhZGVGbGFncz4KKyAgICA8L0ZpbGVVcGdyYWRlRmxhZ3M+CisgICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4KKyAgICA8VXBncmFkZUJhY2t1cExvY2F0aW9uIC8+CisgICAgPFB1Ymxpc2hVcmw+cHVibGlzaFw8L1B1Ymxpc2hVcmw+CisgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8SW5zdGFsbEZyb20+RGlzazwvSW5zdGFsbEZyb20+CisgICAgPFVwZGF0ZUVuYWJsZWQ+ZmFsc2U8L1VwZGF0ZUVuYWJsZWQ+CisgICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4KKyAgICA8VXBkYXRlSW50ZXJ2YWw+NzwvVXBkYXRlSW50ZXJ2YWw+CisgICAgPFVwZGF0ZUludGVydmFsVW5pdHM+RGF5czwvVXBkYXRlSW50ZXJ2YWxVbml0cz4KKyAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+CisgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KKyAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CisgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8VXNlQXBwbGljYXRpb25UcnVzdD5mYWxzZTwvVXNlQXBwbGljYXRpb25UcnVzdD4KKyAgICA8Qm9vdHN0cmFwcGVyRW5hYmxlZD50cnVlPC9Cb290c3RyYXBwZXJFbmFibGVkPgorICA8L1Byb3BlcnR5R3JvdXA+CisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1N5bWJvbHM+dHJ1ZTwvRGVidWdTeW1ib2xzPgorICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+CisgICAgPE91dHB1dFBhdGg+YmluXERlYnVnXDwvT3V0cHV0UGF0aD4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CisgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CisgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgorICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KKyAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgorICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgorICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgorICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KKyAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdEltcGwsIFZlcnNpb249MC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+CisgICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+CisgICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4KKyAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0U2VydmVyLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkNsaWVudC4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4KKyAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPgorICAgICAgPFByb2R1Y3ROYW1lPi5ORVQgRnJhbWV3b3JrIDIuMCAlMjh4ODYlMjk8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuMCI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjAgJTI4eDg2JTI5PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPmZhbHNlPC9JbnN0YWxsPgorICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4KKyAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuTmV0LkZyYW1ld29yay4zLjUiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4KKyAgICAgIDxJbnN0YWxsPnRydWU8L0luc3RhbGw+CisgICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPgorICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPgorICAgICAgPFZpc2libGU+RmFsc2U8L1Zpc2libGU+CisgICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMTwvUHJvZHVjdE5hbWU+CisgICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0LldpbmRvd3MuSW5zdGFsbGVyLjMuMSI+CisgICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4KKyAgICAgIDxQcm9kdWN0TmFtZT5XaW5kb3dzIEluc3RhbGxlciAzLjE8L1Byb2R1Y3ROYW1lPgorICAgICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4KKyAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGxpYlxjc2hhcnBcVGhyaWZ0LmNzcHJvaiI+CisgICAgICA8UHJvamVjdD57NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfTwvUHJvamVjdD4KKyAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+CisgIDwvSXRlbUdyb3VwPgorICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKK2RlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgorU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQorU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cVGhyaWZ0VGVzdC50aHJpZnQKK2ZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQorZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQorIiQoUHJvamVjdERpcilcLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CiskKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cbGliXGNzaGFycFxiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CisgIDwvUHJvcGVydHlHcm91cD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2NWEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3Quc2xuCkBAIC0wLDAgKzEsMTcgQEAKK++7vworTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDAKKyMgVmlzdWFsIFN0dWRpbyAyMDEwCitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlRocmlmdFRlc3QiLCAiVGhyaWZ0VGVzdC5jc3Byb2oiLCAiezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs0OERENzU3Ri1DQTk1LTRERDctQkRBNC01OERCNkYxMDhDMkN9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NDhERDc1N0YtQ0E5NS00REQ3LUJEQTQtNThEQjZGMTA4QzJDfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9ncmFtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYzY2E0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvZ3JhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlCi0vLwotLy8gU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0Ugb3IgdmlzaXQgdGhlIFRocmlmdCBzaXRlIGF0OgotLy8gaHR0cDovL2RldmVsb3BlcnMuZmFjZWJvb2suY29tL3RocmlmdC8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5Qcm90b2NvbDsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi0KLW5hbWVzcGFjZSBUZXN0Ci17Ci0JY2xhc3MgUHJvZ3JhbQotCXsKLQkJc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQotCQl7Ci0JCQlpZiAoYXJncy5MZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgibXVzdCBwcm92aWRlICdzZXJ2ZXInIG9yICdjbGllbnQnIGFyZyIpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJc3RyaW5nW10gc3ViQXJncyA9IG5ldyBzdHJpbmdbYXJncy5MZW5ndGggLSAxXTsKLQkJCWZvcihpbnQgaSA9IDE7IGkgPCBhcmdzLkxlbmd0aDsgaSsrKQotCQkJewotCQkJCXN1YkFyZ3NbaS0xXSA9IGFyZ3NbaV07Ci0JCQl9Ci0JCQlpZiAoYXJnc1swXSA9PSAiY2xpZW50IikKLQkJCXsKLQkJCQlUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhcmdzWzBdID09ICJzZXJ2ZXIiKQotCQkJewotCQkJCVRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSAnc2VydmVyJyBvciAnY2xpZW50JyIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNGNhOGQuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnRUZXN0IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdFRlc3QiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDA5IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLS8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgotW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCi1bYXNzZW1ibHk6IEd1aWQoImY0MWIxOTNiLWYxYWItNDhlZS04ODQzLWY4OGU0MzA4NGUyNiIpXQotCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgotLy8KLS8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uCi0vLyAgICAgIEJ1aWxkIE51bWJlcgotLy8gICAgICBSZXZpc2lvbgotLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MgYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1Rlc3RDbGllbnQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZmM5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0Q2xpZW50LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwotdXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKLXVzaW5nIFRocmlmdC5UZXN0OwotCi1uYW1lc3BhY2UgVGVzdAotewotCXB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50Ci0JewotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtSXRlcmF0aW9ucyA9IDE7Ci0KLQkJcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKLQkJCQlpbnQgcG9ydCA9IDkwOTA7Ci0JCQkJc3RyaW5nIHVybCA9IG51bGw7Ci0JCQkJaW50IG51bVRocmVhZHMgPSAxOwotCQkJCWJvb2wgYnVmZmVyZWQgPSBmYWxzZSwgZnJhbWVkID0gZmFsc2U7Ci0KLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5MZW5ndGg7IGkrKykKLQkJCQkJewotCQkJCQkJaWYgKGFyZ3NbaV0gPT0gIi1oIikKLQkJCQkJCXsKLQkJCQkJCQlzdHJpbmdbXSBob3N0cG9ydCA9IGFyZ3NbKytpXS5TcGxpdCgnOicpOwotCQkJCQkJCWhvc3QgPSBob3N0cG9ydFswXTsKLQkJCQkJCQlpZiAoaG9zdHBvcnQuTGVuZ3RoID4gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXBvcnQgPSBDb252ZXJ0LlRvSW50MzIoaG9zdHBvcnRbMV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGFyZ3NbaV0gPT0gIi11IikKLQkJCQkJCXsKLQkJCQkJCQl1cmwgPSBhcmdzWysraV07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItbiIpCi0JCQkJCQl7Ci0JCQkJCQkJbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi1idWZmZXJlZCIpCi0JCQkJCQl7Ci0JCQkJCQkJYnVmZmVyZWQgPSB0cnVlOwotCQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBidWZmZXJlZCBzb2NrZXRzIik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLWZyYW1lZCIpCi0JCQkJCQl7Ci0JCQkJCQkJZnJhbWVkID0gdHJ1ZTsKLQkJCQkJCQlDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQotCQkJCQkJewotCQkJCQkJCW51bVRocmVhZHMgPSBDb252ZXJ0LlRvSW50MzIoYXJnc1srK2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlTGluZShlLlN0YWNrVHJhY2UpOwotCQkJCX0KLQotCi0KLQkJCQkvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKLQkJCQlUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1UaHJlYWRzXTsKLQkJCQlEYXRlVGltZSBzdGFydCA9IERhdGVUaW1lLk5vdzsKLQkJCQlmb3IgKGludCB0ZXN0ID0gMDsgdGVzdCA8IG51bVRocmVhZHM7IHRlc3QrKykKLQkJCQl7Ci0JCQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUGFyYW1ldGVyaXplZFRocmVhZFN0YXJ0KENsaWVudFRocmVhZCkpOwotCQkJCQl0aHJlYWRzW3Rlc3RdID0gdDsKLQkJCQkJaWYgKHVybCA9PSBudWxsKQotCQkJCQl7Ci0JCQkJCQlUVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQkJCQlpZiAoYnVmZmVyZWQpCi0JCQkJCQkJdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zIGFzIFRTdHJlYW1UcmFuc3BvcnQpOwotCQkJCQkJaWYgKGZyYW1lZCkKLQkJCQkJCQl0cmFucyA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KHRyYW5zKTsKLQkJCQkJCQkKLQkJCQkJCXQuU3RhcnQodHJhbnMpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJVEh0dHBDbGllbnQgaHR0cCA9IG5ldyBUSHR0cENsaWVudChuZXcgVXJpKHVybCkpOwotCQkJCQkJdC5TdGFydChodHRwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IHRlc3QgPSAwOyB0ZXN0IDwgbnVtVGhyZWFkczsgdGVzdCsrKQotCQkJCXsKLQkJCQkJdGhyZWFkc1t0ZXN0XS5Kb2luKCk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIlRvdGFsIHRpbWU6ICIgKyAoRGF0ZVRpbWUuTm93IC0gc3RhcnQpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gb3V0ZXJFeCkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKLQkJCX0KLQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGhyZWFkKG9iamVjdCBvYmopCi0JCXsKLQkJCVRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gKFRUcmFuc3BvcnQpb2JqOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JdGVyYXRpb25zOyBpKyspCi0JCQl7Ci0JCQkJQ2xpZW50VGVzdCh0cmFuc3BvcnQpOwotCQkJfQotCQkJdHJhbnNwb3J0LkNsb3NlKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIHZvaWQgQ2xpZW50VGVzdChUVHJhbnNwb3J0IHRyYW5zcG9ydCkKLQkJewotCQkJVEJpbmFyeVByb3RvY29sIGJpbmFyeVByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwotCi0JCQlUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQoYmluYXJ5UHJvdG9jb2wpOwotCQkJdHJ5Ci0JCQl7Ci0JCQkJaWYgKCF0cmFuc3BvcnQuSXNPcGVuKQotCQkJCXsKLQkJCQkJdHJhbnNwb3J0Lk9wZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgdHR4Lk1lc3NhZ2UpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJbG9uZyBzdGFydCA9IERhdGVUaW1lLk5vdy5Ub0ZpbGVUaW1lKCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKLQkJCWNsaWVudC50ZXN0Vm9pZCgpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLQkJCXN0cmluZyBzID0gY2xpZW50LnRlc3RTdHJpbmcoIlRlc3QiKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7Ci0JCQlieXRlIGk4ID0gY2xpZW50LnRlc3RCeXRlKChieXRlKTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7Ci0JCQlpbnQgaTMyID0gY2xpZW50LnRlc3RJMzIoLTEpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKLQkJCWxvbmcgaTY0ID0gY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKLQkJCWRvdWJsZSBkdWIgPSBjbGllbnQudGVzdERvdWJsZSg1LjMyNTA5ODIzNSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotCQkJWHRydWN0IG8gPSBuZXcgWHRydWN0KCk7Ci0JCQlvLlN0cmluZ190aGluZyA9ICJaZXJvIjsKLQkJCW8uQnl0ZV90aGluZyA9IChieXRlKTE7Ci0JCQlvLkkzMl90aGluZyA9IC0zOwotCQkJby5JNjRfdGhpbmcgPSAtNTsKLQkJCVh0cnVjdCBpID0gY2xpZW50LnRlc3RTdHJ1Y3Qobyk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7Ci0JCQlYdHJ1Y3QyIG8yID0gbmV3IFh0cnVjdDIoKTsKLQkJCW8yLkJ5dGVfdGhpbmcgPSAoYnl0ZSkxOwotCQkJbzIuU3RydWN0X3RoaW5nID0gbzsKLQkJCW8yLkkzMl90aGluZyA9IDU7Ci0JCQlYdHJ1Y3QyIGkyID0gY2xpZW50LnRlc3ROZXN0KG8yKTsKLQkJCWkgPSBpMi5TdHJ1Y3RfdGhpbmc7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0geyIgKyBpMi5CeXRlX3RoaW5nICsgIiwge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0sICIgKyBpMi5JMzJfdGhpbmcgKyAifSIpOwotCi0JCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgaisrKQotCQkJewotCQkJCW1hcG91dFtqXSA9IGogLSAxMDsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOwotCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcG91dC5LZXlzKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiAiICsgbWFwb3V0W2tleV0pOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJRGljdGlvbmFyeTxpbnQsIGludD4gbWFwaW4gPSBjbGllbnQudGVzdE1hcChtYXBvdXQpOwotCi0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmaXJzdCA9IHRydWU7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1hcGluLktleXMpCi0JCQl7Ci0JCQkJaWYgKGZpcnN0KQotCQkJCXsKLQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQ29uc29sZS5Xcml0ZSgiLCAiKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKLQkJCX0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7Ci0KLQkJCUxpc3Q8aW50PiBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCWxpc3RvdXQuQWRkKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJTGlzdDxpbnQ+IGxpc3RpbiA9IGNsaWVudC50ZXN0TGlzdChsaXN0b3V0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZmlyc3QgPSB0cnVlOwotCQkJZm9yZWFjaCAoaW50IGogaW4gbGlzdGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0JCQkvL3NldAotCQkJVEhhc2hTZXQ8aW50PiBzZXRvdXQgPSBuZXcgVEhhc2hTZXQ8aW50PigpOwotCQkJZm9yIChpbnQgaiA9IC0yOyBqIDwgMzsgaisrKQotCQkJewotCQkJCXNldG91dC5BZGQoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0U2V0KHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldG91dCkKLQkJCXsKLQkJCQlpZiAoZmlyc3QpCi0JCQkJewotCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKCIsICIpOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlKGopOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZSgifSkiKTsKLQotCQkJVEhhc2hTZXQ8aW50PiBzZXRpbiA9IGNsaWVudC50ZXN0U2V0KHNldG91dCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIiA9IHsiKTsKLQkJCWZpcnN0ID0gdHJ1ZTsKLQkJCWZvcmVhY2ggKGludCBqIGluIHNldGluKQotCQkJewotCQkJCWlmIChmaXJzdCkKLQkJCQl7Ci0JCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUNvbnNvbGUuV3JpdGUoIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoaik7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgifSIpOwotCi0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKLQkJCU51bWJlcnogcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouT05FKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOwotCQkJcmV0ID0gY2xpZW50LnRlc3RFbnVtKE51bWJlcnouVFdPKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVEhSRUUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5USFJFRSk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEZJVkUpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5GSVZFKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKLQotCQkJQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7Ci0JCQlyZXQgPSBjbGllbnQudGVzdEVudW0oTnVtYmVyei5FSUdIVCk7Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKLQkJCWxvbmcgdWlkID0gY2xpZW50LnRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyM0wpOwotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOwotCi0JCQlDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7Ci0JCQlEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+IG1tID0gY2xpZW50LnRlc3RNYXBNYXAoMSk7Ci0JCQlDb25zb2xlLldyaXRlKCIgPSB7Iik7Ci0JCQlmb3JlYWNoIChpbnQga2V5IGluIG1tLktleXMpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+IHsiKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBtMiA9IG1tW2tleV07Ci0JCQkJZm9yZWFjaCAoaW50IGsyIGluIG0yLktleXMpCi0JCQkJewotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCQkJSW5zYW5pdHkgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7Ci0JCQlpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQlpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7Ci0JCQlYdHJ1Y3QgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7Ci0JCQl0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOwotCQkJdHJ1Y2suQnl0ZV90aGluZyA9IChieXRlKTg7Ci0JCQl0cnVjay5JMzJfdGhpbmcgPSA4OwotCQkJdHJ1Y2suSTY0X3RoaW5nID0gODsKLQkJCWluc2FuZS5YdHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOwotCQkJaW5zYW5lLlh0cnVjdHMuQWRkKHRydWNrKTsKLQkJCUNvbnNvbGUuV3JpdGUoInRlc3RJbnNhbml0eSgpIik7Ci0JCQlEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB3aG9hID0gY2xpZW50LnRlc3RJbnNhbml0eShpbnNhbmUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0geyIpOwotCQkJZm9yZWFjaCAobG9uZyBrZXkgaW4gd2hvYS5LZXlzKQotCQkJewotCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHZhbCA9IHdob2Fba2V5XTsKLQkJCQlDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOwotCi0JCQkJZm9yZWFjaCAoTnVtYmVyeiBrMiBpbiB2YWwuS2V5cykKLQkJCQl7Ci0JCQkJCUluc2FuaXR5IHYyID0gdmFsW2syXTsKLQotCQkJCQlDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7Ci0JCQkJCURpY3Rpb25hcnk8TnVtYmVyeiwgbG9uZz4gdXNlck1hcCA9IHYyLlVzZXJNYXA7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAodXNlck1hcCAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChOdW1iZXJ6IGszIGluIHVzZXJNYXAuS2V5cykKLQkJCQkJCXsKLQkJCQkJCQlDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9LCAiKTsKLQotCQkJCQlMaXN0PFh0cnVjdD4geHRydWN0cyA9IHYyLlh0cnVjdHM7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgieyIpOwotCQkJCQlpZiAoeHRydWN0cyAhPSBudWxsKQotCQkJCQl7Ci0JCQkJCQlmb3JlYWNoIChYdHJ1Y3QgeCBpbiB4dHJ1Y3RzKQotCQkJCQkJewotCQkJCQkJCUNvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGUoIm51bGwiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlKCJ9Iik7Ci0KLQkJCQkJQ29uc29sZS5Xcml0ZSgifSwgIik7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGUoIn0sICIpOwotCQkJfQotCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKLQotCi0JCQlieXRlIGFyZzAgPSAxOwotCQkJaW50IGFyZzEgPSAyOwotCQkJbG9uZyBhcmcyID0gbG9uZy5NYXhWYWx1ZTsKLQkJCURpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4gbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKLQkJCW11bHRpRGljdFsxXSA9ICJvbmUiOwotCQkJTnVtYmVyeiBhcmc0ID0gTnVtYmVyei5GSVZFOwotCQkJbG9uZyBhcmc1ID0gNTAwMDAwMDsKLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIsIiArIG11bHRpRGljdCArICIsIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKLQkJCVh0cnVjdCBtdWx0aVJlc3BvbnNlID0gY2xpZW50LnRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBtdWx0aURpY3QsIGFyZzQsIGFyZzUpOwotCQkJQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZwotCQkJCQkJKyAiLGkzMl90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JMzJfdGhpbmcgKyAiLGk2NF90aGluZzoiICsgbXVsdGlSZXNwb25zZS5JNjRfdGhpbmcgKyAiKVxuIik7Ci0KLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOwotCQkJY2xpZW50LnRlc3RPbmV3YXkoMSk7Ci0KLQkJCUNvbnNvbGUuV3JpdGUoIlRlc3QgQ2FsbHRpbWUoKSIpOwotCQkJdmFyIHN0YXJ0dCA9IERhdGVUaW1lLlV0Y05vdzsKLQkJCWZvciAoIGludCBrPTA7IGs8MTAwMDsgKytrICkKLQkJCQljbGllbnQudGVzdFZvaWQoKTsKLQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgKERhdGVUaW1lLlV0Y05vdyAtIHN0YXJ0dCkuVG90YWxTZWNvbmRzLlRvU3RyaW5nKCkgKyAiIG1zIGEgdGVzdFZvaWQoKSBjYWxsIiApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9UZXN0U2VydmVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI3NWY0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGVzdFNlcnZlci5jcworKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZQotLy8KLS8vIFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFIG9yIHZpc2l0IHRoZSBUaHJpZnQgc2l0ZSBhdDoKLS8vIGh0dHA6Ly9kZXZlbG9wZXJzLmZhY2Vib29rLmNvbS90aHJpZnQvCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKLXVzaW5nIFRocmlmdC5UZXN0OyAvL2dlbmVyYXRlZCBjb2RlCi11c2luZyBUaHJpZnQuVHJhbnNwb3J0OwotdXNpbmcgVGhyaWZ0LlByb3RvY29sOwotdXNpbmcgVGhyaWZ0LlNlcnZlcjsKLQotbmFtZXNwYWNlIFRlc3QKLXsKLQlwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgotCXsKLQkJcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdC5JZmFjZQotCQl7Ci0JCQlwdWJsaWMgVFNlcnZlciBzZXJ2ZXI7Ci0KLQkJCXB1YmxpYyBUZXN0SGFuZGxlcigpIHsgfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RWb2lkKCkiKTsKLQkJCX0KLQotCQkJcHVibGljIHN0cmluZyB0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdHN0cmluZyhcIiIgKyB0aGluZyArICJcIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBieXRlIHRlc3RCeXRlKGJ5dGUgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RCeXRlKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IHRlc3RJMzIoaW50IHRoaW5nKQotCQkJewotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0STMyKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgbG9uZyB0ZXN0STY0KGxvbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJNjQoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBkb3VibGUgdGVzdERvdWJsZShkb3VibGUgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3REb3VibGUoIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdFN0cnVjdChYdHJ1Y3QgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RTdHJ1Y3QoeyIgKwotCQkJCQkJCQkgIlwiIiArIHRoaW5nLlN0cmluZ190aGluZyArICJcIiwgIiArCi0JCQkJCQkJCSB0aGluZy5CeXRlX3RoaW5nICsgIiwgIiArCi0JCQkJCQkJCSB0aGluZy5JMzJfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkk2NF90aGluZyArICJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KQotCQkJewotCQkJCVh0cnVjdCB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOwotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TmVzdCh7IiArCi0JCQkJCQkJCSBuZXN0LkJ5dGVfdGhpbmcgKyAiLCB7IiArCi0JCQkJCQkJCSAiXCIiICsgdGhpbmcuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkJ5dGVfdGhpbmcgKyAiLCAiICsKLQkJCQkJCQkJIHRoaW5nLkkzMl90aGluZyArICIsICIgKwotCQkJCQkJCQkgdGhpbmcuSTY0X3RoaW5nICsgIn0sICIgKwotCQkJCQkJCQkgbmVzdC5JMzJfdGhpbmcgKyAifSkiKTsKLQkJCQlyZXR1cm4gbmVzdDsKLQkJCX0KLQotCQkJcHVibGljIERpY3Rpb25hcnk8aW50LCBpbnQ+IHRlc3RNYXAoRGljdGlvbmFyeTxpbnQsIGludD4gdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNYXAoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBrZXkgaW4gdGhpbmcuS2V5cykKLQkJCQl7Ci0JCQkJCWlmIChmaXJzdCkKLQkJCQkJewotCQkJCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCIsICIpOwotCQkJCQl9Ci0JCQkJCUNvbnNvbGUuV3JpdGVMaW5lKGtleSArICIgPT4gIiArIHRoaW5nW2tleV0pOwotCQkJCX0KLQkJCQlDb25zb2xlLldyaXRlTGluZSgifSkiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9DQotDQotICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IHRlc3RTdHJpbmdNYXAoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdFN0cmluZ01hcCh7Iik7DQotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOw0KLSAgICAgICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcga2V5IGluIHRoaW5nLktleXMpDQotICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIsICIpOw0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoa2V5ICsgIiA9PiAiICsgdGhpbmdba2V5XSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7DQotICAgICAgICAgICAgICAgIHJldHVybiB0aGluZzsNCi0gICAgICAgICAgICB9Ci0KLQkJCXB1YmxpYyBUSGFzaFNldDxpbnQ+IHRlc3RTZXQoVEhhc2hTZXQ8aW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdFNldCh7Iik7Ci0JCQkJYm9vbCBmaXJzdCA9IHRydWU7Ci0JCQkJZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCi0JCQkJewotCQkJCQlpZiAoZmlyc3QpCi0JCQkJCXsKLQkJCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlDb25zb2xlLldyaXRlTGluZSgiLCAiKTsKLQkJCQkJfQotCQkJCQlDb25zb2xlLldyaXRlTGluZShlbGVtKTsKLQkJCQl9Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoIn0pIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgTGlzdDxpbnQ+IHRlc3RMaXN0KExpc3Q8aW50PiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdExpc3QoeyIpOwotCQkJCWJvb2wgZmlyc3QgPSB0cnVlOwotCQkJCWZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQotCQkJCXsKLQkJCQkJaWYgKGZpcnN0KQotCQkJCQl7Ci0JCQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIiwgIik7Ci0JCQkJCX0KLQkJCQkJQ29uc29sZS5Xcml0ZUxpbmUoZWxlbSk7Ci0JCQkJfQotCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCJ9KSIpOwotCQkJCXJldHVybiB0aGluZzsKLQkJCX0KLQotCQkJcHVibGljIE51bWJlcnogdGVzdEVudW0oTnVtYmVyeiB0aGluZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEVudW0oIiArIHRoaW5nICsgIikiKTsKLQkJCQlyZXR1cm4gdGhpbmc7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBsb25nIHRlc3RUeXBlZGVmKGxvbmcgdGhpbmcpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RUeXBlZGVmKCIgKyB0aGluZyArICIpIik7Ci0JCQkJcmV0dXJuIHRoaW5nOwotCQkJfQotCi0JCQlwdWJsaWMgRGljdGlvbmFyeTxpbnQsIERpY3Rpb25hcnk8aW50LCBpbnQ+PiB0ZXN0TWFwTWFwKGludCBoZWxsbykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE1hcE1hcCgiICsgaGVsbG8gKyAiKSIpOwotCQkJCURpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4gbWFwbWFwID0KLQkJCQkgIG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7Ci0KLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCQlEaWN0aW9uYXJ5PGludCwgaW50PiBuZWcgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKLQkJCQlmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKLQkJCQl7Ci0JCQkJCXBvc1tpXSA9IGk7Ci0JCQkJCW5lZ1staV0gPSAtaTsKLQkJCQl9Ci0KLQkJCQltYXBtYXBbNF0gPSBwb3M7Ci0JCQkJbWFwbWFwWy00XSA9IG5lZzsKLQotCQkJCXJldHVybiBtYXBtYXA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiB0ZXN0SW5zYW5pdHkoSW5zYW5pdHkgYXJndW1lbnQpCi0JCQl7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RJbnNhbml0eSgpIik7Ci0KLQkJCQlYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0JCQkJaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0JCQkJaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0JCQkJaGVsbG8uSTMyX3RoaW5nID0gMjsKLQkJCQloZWxsby5JNjRfdGhpbmcgPSAyOwotCi0JCQkJWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0JCQkJZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotCQkJCWdvb2RieWUuQnl0ZV90aGluZyA9IChieXRlKTQ7Ci0JCQkJZ29vZGJ5ZS5JMzJfdGhpbmcgPSA0OwotCQkJCWdvb2RieWUuSTY0X3RoaW5nID0gKGxvbmcpNDsKLQotCQkJCUluc2FuaXR5IGNyYXp5ID0gbmV3IEluc2FuaXR5KCk7Ci0JCQkJY3JhenkuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7Ci0JCQkJY3JhenkuVXNlck1hcFtOdW1iZXJ6LkVJR0hUXSA9IChsb25nKTg7Ci0JCQkJY3JhenkuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKLQkJCQljcmF6eS5YdHJ1Y3RzLkFkZChnb29kYnllKTsKLQotCQkJCUluc2FuaXR5IGxvb25leSA9IG5ldyBJbnNhbml0eSgpOwotCQkJCWNyYXp5LlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IChsb25nKTU7Ci0JCQkJY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOwotCi0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7Ci0JCQkJRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOyA7Ci0KLQkJCQlmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gY3Jhenk7Ci0JCQkJZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gY3Jhenk7Ci0KLQkJCQlzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IGxvb25leTsKLQotCQkJCURpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+IGluc2FuZSA9Ci0JCQkJICBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4oKTsKLQkJCQlpbnNhbmVbKGxvbmcpMV0gPSBmaXJzdF9tYXA7Ci0JCQkJaW5zYW5lWyhsb25nKTJdID0gc2Vjb25kX21hcDsKLQotCQkJCXJldHVybiBpbnNhbmU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpKCkiKTsKLQotCQkJCVh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTsgOwotCQkJCWhlbGxvLlN0cmluZ190aGluZyA9ICJIZWxsbzIiOwotCQkJCWhlbGxvLkJ5dGVfdGhpbmcgPSBhcmcwOwotCQkJCWhlbGxvLkkzMl90aGluZyA9IGFyZzE7Ci0JCQkJaGVsbG8uSTY0X3RoaW5nID0gYXJnMjsKLQkJCQlyZXR1cm4gaGVsbG87Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oc3RyaW5nIGFyZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbigiICsgYXJnICsgIikiKTsKLQkJCQlpZiAoYXJnID09ICJYY2VwdGlvbiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMTAwMTsKLQkJCQkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpRXhjZXB0aW9uKHN0cmluZyBhcmcwLCBzdHJpbmcgYXJnMSkKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKCIgKyBhcmcwICsgIiwgIiArIGFyZzEgKyAiKSIpOwotCQkJCWlmIChhcmcwID09ICJYY2VwdGlvbiIpCi0JCQkJewotCQkJCQlYY2VwdGlvbiB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMTAwMTsKLQkJCQkJeC5NZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iOwotCQkJCQl0aHJvdyB4OwotCQkJCX0KLQkJCQllbHNlIGlmIChhcmcwID09ICJYY2VwdGlvbjIiKQotCQkJCXsKLQkJCQkJWGNlcHRpb24yIHggPSBuZXcgWGNlcHRpb24yKCk7Ci0JCQkJCXguRXJyb3JDb2RlID0gMjAwMjsKLQkJCQkJeC5TdHJ1Y3RfdGhpbmcgPSBuZXcgWHRydWN0KCk7Ci0JCQkJCXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7Ci0JCQkJCXRocm93IHg7Ci0JCQkJfQotCi0JCQkJWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKLQkJCQlyZXN1bHQuU3RyaW5nX3RoaW5nID0gYXJnMTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB0ZXN0U3RvcCgpCi0JCQl7Ci0JCQkJaWYgKHNlcnZlciAhPSBudWxsKQotCQkJCXsKLQkJCQkJc2VydmVyLlN0b3AoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3RPbmV3YXkoaW50IGFyZykKLQkJCXsKLQkJCQlDb25zb2xlLldyaXRlTGluZSgidGVzdE9uZXdheSgiICsgYXJnICsgIiksIHNsZWVwaW5nLi4uIik7Ci0JCQkJU3lzdGVtLlRocmVhZGluZy5UaHJlYWQuU2xlZXAoYXJnICogMTAwMCk7Ci0JCQkJQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKLQkJCX0KLQotCQl9IC8vIGNsYXNzIFRlc3RIYW5kbGVyCi0KLQkJcHVibGljIHN0YXRpYyB2b2lkIEV4ZWN1dGUoc3RyaW5nW10gYXJncykKLQkJewotCQkJdHJ5Ci0JCQl7Ci0JCQkJYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZSwgdXNlRnJhbWVkID0gZmFsc2U7Ci0JCQkJaW50IHBvcnQgPSA5MDkwOwotCQkJCWlmIChhcmdzLkxlbmd0aCA+IDApCi0JCQkJewotCQkJCQlwb3J0ID0gaW50LlBhcnNlKGFyZ3NbMF0pOwotCi0JCQkJCWlmIChhcmdzLkxlbmd0aCA+IDEpCi0JCQkJCXsKLQkJCQkJCWlmICggYXJnc1sxXSA9PSAicmF3IiApCi0JCQkJCQl7Ci0JCQkJCQkJLy8gYXMgZGVmYXVsdAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIGFyZ3NbMV0gPT0gImJ1ZmZlcmVkIiApCi0JCQkJCQl7Ci0JCQkJCQkJdXNlQnVmZmVyZWRTb2NrZXRzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKCBhcmdzWzFdID09ICJmcmFtZWQiICkKLQkJCQkJCXsKLQkJCQkJCQl1c2VGcmFtZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCS8vIEZhbGwgYmFjayB0byB0aGUgb2xkZXIgYm9vbGVhbiBzeW50YXgKLQkJCQkJCQlib29sLlRyeVBhcnNlKGFyZ3NbMV0sIG91dCB1c2VCdWZmZXJlZFNvY2tldHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gUHJvY2Vzc29yCi0JCQkJVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLQkJCQlUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKLQotCQkJCS8vIFRyYW5zcG9ydAotCQkJCVRTZXJ2ZXJTb2NrZXQgdFNlcnZlclNvY2tldCA9IG5ldyBUU2VydmVyU29ja2V0KHBvcnQsIDAsIHVzZUJ1ZmZlcmVkU29ja2V0cyk7Ci0KLQkJCQkvLyBTaW1wbGUgU2VydmVyCi0JCQkJVFNlcnZlciBzZXJ2ZXJFbmdpbmU7Ci0JCQkJaWYgKCB1c2VGcmFtZWQgKQotCQkJCQlzZXJ2ZXJFbmdpbmUgPSBuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0LCBuZXcgVEZyYW1lZFRyYW5zcG9ydC5GYWN0b3J5KCkpOwotCQkJCWVsc2UKLQkJCQkJc2VydmVyRW5naW5lID0gbmV3IFRTaW1wbGVTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQkvLyBUaHJlYWRQb29sIFNlcnZlcgotCQkJCS8vIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLCB0U2VydmVyU29ja2V0KTsKLQotCQkJCS8vIFRocmVhZGVkIFNlcnZlcgotCQkJCS8vIHNlcnZlckVuZ2luZSA9IG5ldyBUVGhyZWFkZWRTZXJ2ZXIodGVzdFByb2Nlc3NvciwgdFNlcnZlclNvY2tldCk7Ci0KLQkJCQl0ZXN0SGFuZGxlci5zZXJ2ZXIgPSBzZXJ2ZXJFbmdpbmU7Ci0KLQkJCQkvLyBSdW4gaXQKLQkJCQlDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgKyBwb3J0ICsgCi0JCQkJCSh1c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArIAotCQkJCQkodXNlRnJhbWVkID8gIiB3aXRoIGZyYW1lZCB0cmFuc3BvcnQiIDogIiIpICsgCi0JCQkJCSIuLi4iKTsKLQkJCQlzZXJ2ZXJFbmdpbmUuU2VydmUoKTsKLQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiB4KQotCQkJewotCQkJCUNvbnNvbGUuRXJyb3IuV3JpdGUoeCk7Ci0JCQl9Ci0JCQlDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2ogYi90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L1RocmlmdFRlc3QuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VjODY4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QvVGhyaWZ0VGVzdC5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4NCi08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4NCi0gIDxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCi0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPg0KLSAgICA8UHJvZHVjdFZlcnNpb24+OS4wLjIxMDIyPC9Qcm9kdWN0VmVyc2lvbj4NCi0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPg0KLSAgICA8UHJvamVjdEd1aWQ+ezQ4REQ3NTdGLUNBOTUtNERENy1CREE0LTU4REI2RjEwOEMyQ308L1Byb2plY3RHdWlkPg0KLSAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+DQotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4NCi0gICAgPFJvb3ROYW1lc3BhY2U+VGhyaWZ0VGVzdDwvUm9vdE5hbWVzcGFjZT4NCi0gICAgPEFzc2VtYmx5TmFtZT5UaHJpZnRUZXN0PC9Bc3NlbWJseU5hbWU+DQotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCi0gICAgPElzV2ViQm9vdHN0cmFwcGVyPmZhbHNlPC9Jc1dlYkJvb3RzdHJhcHBlcj4NCi0gICAgPEZpbGVVcGdyYWRlRmxhZ3M+DQotICAgIDwvRmlsZVVwZ3JhZGVGbGFncz4NCi0gICAgPE9sZFRvb2xzVmVyc2lvbj4zLjU8L09sZFRvb2xzVmVyc2lvbj4NCi0gICAgPFVwZ3JhZGVCYWNrdXBMb2NhdGlvbiAvPg0KLSAgICA8UHVibGlzaFVybD5wdWJsaXNoXDwvUHVibGlzaFVybD4NCi0gICAgPEluc3RhbGw+dHJ1ZTwvSW5zdGFsbD4NCi0gICAgPEluc3RhbGxGcm9tPkRpc2s8L0luc3RhbGxGcm9tPg0KLSAgICA8VXBkYXRlRW5hYmxlZD5mYWxzZTwvVXBkYXRlRW5hYmxlZD4NCi0gICAgPFVwZGF0ZU1vZGU+Rm9yZWdyb3VuZDwvVXBkYXRlTW9kZT4NCi0gICAgPFVwZGF0ZUludGVydmFsPjc8L1VwZGF0ZUludGVydmFsPg0KLSAgICA8VXBkYXRlSW50ZXJ2YWxVbml0cz5EYXlzPC9VcGRhdGVJbnRlcnZhbFVuaXRzPg0KLSAgICA8VXBkYXRlUGVyaW9kaWNhbGx5PmZhbHNlPC9VcGRhdGVQZXJpb2RpY2FsbHk+DQotICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+DQotICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4NCi0gICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4NCi0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4NCi0gICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+DQotICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4NCi0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+DQotICAgIDxEZWJ1Z1R5cGU+ZnVsbDwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPg0KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+DQotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPg0KLSAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4NCi0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPg0KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4NCi0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+DQotICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+DQotICA8L1Byb3BlcnR5R3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJUaHJpZnRJbXBsLCBWZXJzaW9uPTAuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPg0KLSAgICAgIDxTcGVjaWZpY1ZlcnNpb24+RmFsc2U8L1NwZWNpZmljVmVyc2lvbj4NCi0gICAgICA8SGludFBhdGg+LlxUaHJpZnRJbXBsLmRsbDwvSGludFBhdGg+DQotICAgIDwvUmVmZXJlbmNlPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SXRlbUdyb3VwPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9ncmFtLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdENsaWVudC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFNlcnZlci5jcyIgLz4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5DbGllbnQuMy41Ij4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41IFNQMSBDbGllbnQgUHJvZmlsZTwvUHJvZHVjdE5hbWU+DQotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMi4wIj4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMi4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+DQotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy4wIj4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy4wICUyOHg4NiUyOTwvUHJvZHVjdE5hbWU+DQotICAgICAgPEluc3RhbGw+ZmFsc2U8L0luc3RhbGw+DQotICAgIDwvQm9vdHN0cmFwcGVyUGFja2FnZT4NCi0gICAgPEJvb3RzdHJhcHBlclBhY2thZ2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5ldC5GcmFtZXdvcmsuMy41Ij4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+Lk5FVCBGcmFtZXdvcmsgMy41PC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuRnJhbWV3b3JrLjMuNS5TUDEiPg0KLSAgICAgIDxWaXNpYmxlPkZhbHNlPC9WaXNpYmxlPg0KLSAgICAgIDxQcm9kdWN0TmFtZT4uTkVUIEZyYW1ld29yayAzLjUgU1AxPC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD5mYWxzZTwvSW5zdGFsbD4NCi0gICAgPC9Cb290c3RyYXBwZXJQYWNrYWdlPg0KLSAgICA8Qm9vdHN0cmFwcGVyUGFja2FnZSBJbmNsdWRlPSJNaWNyb3NvZnQuV2luZG93cy5JbnN0YWxsZXIuMy4xIj4NCi0gICAgICA8VmlzaWJsZT5GYWxzZTwvVmlzaWJsZT4NCi0gICAgICA8UHJvZHVjdE5hbWU+V2luZG93cyBJbnN0YWxsZXIgMy4xPC9Qcm9kdWN0TmFtZT4NCi0gICAgICA8SW5zdGFsbD50cnVlPC9JbnN0YWxsPg0KLSAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+DQotICA8L0l0ZW1Hcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiPg0KLSAgICAgIDxQcm9qZWN0Pns0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9PC9Qcm9qZWN0Pg0KLSAgICAgIDxOYW1lPlRocmlmdDwvTmFtZT4NCi0gICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4KLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgotICA8L1RhcmdldD4KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIC0tPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxQcmVCdWlsZEV2ZW50PnJtZGlyIC9zIC9xICIkKFByb2plY3REaXIpZ2VuLWNzaGFycCIKLWRlbCAvZiAvcSAiJChQcm9qZWN0RGlyKVRocmlmdEltcGwuZGxsIgotU0VUIE9VVFBVVF9ESVI9JChQcm9qZWN0RGlyKQotU0VUIFRIUklGVF9GSUxFPSQoUHJvamVjdERpcilcLi5cLi5cVGhyaWZ0VGVzdC50aHJpZnQKLWZvciAlMjUlMjVJIGluICgiJTI1T1VUUFVUX0RJUiUyNSIpIGRvIHNldCBTSE9SVF9ESVI9JTI1JTI1fmZzSQotZm9yICUyNSUyNUkgaW4gKCIlMjVUSFJJRlRfRklMRSUyNSIpIGRvIHNldCBUSFJJRlRfU0hPUlQ9JTI1JTI1fmZzSQotIiQoUHJvamVjdERpcilcLi5cLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1Ci0kKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cLi5cbGliXGNzaGFycFxzcmNcYmluXERlYnVnXFRocmlmdC5kbGwiPC9QcmVCdWlsZEV2ZW50Pg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoIGIvdGVzdC9jc2hhcnAvVGhyaWZ0VGVzdC9tYWtldGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTExYjViMi4uMDAwMDAwMAotLS0gYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0L21ha2V0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIGNzaGFycCAtbyAuIC4uLy4uL1RocmlmdFRlc3QudGhyaWZ0Ci1nbWNzIC90OmxpYnJhcnkgL291dDouL1RocmlmdEltcGwuZGxsIC9yZWN1cnNlOi4vZ2VuLWNzaGFycC8qIC9yZWZlcmVuY2U6Li4vLi4vLi4vbGliL2NzaGFycC9UaHJpZnQuZGxsCi1nbWNzICAvb3V0OlRlc3RDbGllbnRTZXJ2ZXIuZXhlIC9yZWZlcmVuY2U6Li4vLi4vLi4vbGliL2NzaGFycC9UaHJpZnQuZGxsIC9yZWZlcmVuY2U6VGhyaWZ0SW1wbC5kbGwgVGVzdENsaWVudC5jcyBUZXN0U2VydmVyLmNzIFByb2dyYW0uY3MKLQotZXhwb3J0IE1PTk9fUEFUSD0uLi8uLi8uLi9saWIvY3NoYXJwLwotCi10aW1lb3V0IDEyMCAuL1Rlc3RDbGllbnRTZXJ2ZXIuZXhlIHNlcnZlciAmCi0uL1Rlc3RDbGllbnRTZXJ2ZXIuZXhlIGNsaWVudApkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L01ha2VmaWxlLmFtIGIvdGVzdC9kYXJ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTBlYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0MiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1kYXJ0L3RocmlmdF90ZXN0L2xpYi90aHJpZnRfdGVzdC5kYXJ0OiAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBkYXJ0IC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK3B1Yi1nZXQtZ2VuOiBnZW4tZGFydC90aHJpZnRfdGVzdC9saWIvdGhyaWZ0X3Rlc3QuZGFydAorCWNkIGdlbi1kYXJ0L3RocmlmdF90ZXN0OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0OiBwdWItZ2V0LWdlbgorCWNkIHRlc3RfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitzdHViczogZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQgcHViLWdldAorCitwcmVjcm9zczogc3R1YnMKKworY2hlY2s6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1kYXJ0IHRlc3RfY2xpZW50Ly5wdWIKKwlmaW5kIC4gLXR5cGUgZCAtbmFtZSAicGFja2FnZXMiIHwgeGFyZ3MgJChSTSkgLXIKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGYgLW5hbWUgInB1YnNwZWMubG9jayIgfCB4YXJncyAkKFJNKQorCitjbGllbnQ6IHN0dWJzCisJJHtEQVJUfSB0ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwZDRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQgYi90ZXN0L2RhcnQvdGVzdF9jbGllbnQvYmluL21haW4uZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY4NDRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwzMzcgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmNvbnZlcnQnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpjb2xsZWN0aW9uL2NvbGxlY3Rpb24uZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6aHR0cC9odHRwLmRhcnQnIGFzIGh0dHA7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0X3Rlc3QvdGhyaWZ0X3Rlc3QuZGFydCc7CisKK2NvbnN0IFRFU1RfQkFTRVRZUEVTID0gMTsgLy8gMDAwMCAwMDAxCitjb25zdCBURVNUX1NUUlVDVFMgPSAyOyAvLyAwMDAwIDAwMTAKK2NvbnN0IFRFU1RfQ09OVEFJTkVSUyA9IDQ7IC8vIDAwMDAgMDEwMAorY29uc3QgVEVTVF9FWENFUFRJT05TID0gODsgLy8gMDAwMCAxMDAwCitjb25zdCBURVNUX1VOS05PV04gPSA2NDsgLy8gMDEwMCAwMDAwIChGYWlsZWQgdG8gcHJlcGFyZSBlbnZpcm9uZW10IGV0Yy4pCitjb25zdCBURVNUX1RJTUVPVVQgPSAxMjg7IC8vIDEwMDAgMDAwMAorY29uc3QgVEVTVF9OT1RVU0VEID0gNDg7IC8vIDAwMTEgMDAwMCAocmVzZXJ2ZWQgYml0cykKKwordHlwZWRlZiBGdXR1cmUgRnV0dXJlRnVuY3Rpb24oKTsKKworY2xhc3MgVFRlc3QgeworICBmaW5hbCBpbnQgZXJyb3JDb2RlOworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgRnV0dXJlRnVuY3Rpb24gZnVuYzsKKworICBUVGVzdCh0aGlzLmVycm9yQ29kZSwgdGhpcy5uYW1lLCB0aGlzLmZ1bmMpOworfQorCitjbGFzcyBUVGVzdEVycm9yIGV4dGVuZHMgRXJyb3IgeworICBmaW5hbCBhY3R1YWw7CisgIGZpbmFsIGV4cGVjdGVkOworCisgIFRUZXN0RXJyb3IodGhpcy5hY3R1YWwsIHRoaXMuZXhwZWN0ZWQpOworCisgIFN0cmluZyB0b1N0cmluZygpID0+ICckYWN0dWFsICE9ICRleHBlY3RlZCc7Cit9CisKK0xpc3Q8VFRlc3Q+IF90ZXN0czsKK1RocmlmdFRlc3RDbGllbnQgY2xpZW50OworYm9vbCB2ZXJib3NlOworCisvLy8gQWRhcHRlZCBmcm9tIFRlc3RDbGllbnQucGhwCittYWluKExpc3Q8U3RyaW5nPiBhcmdzKSBhc3luYyB7CisgIEFyZ1Jlc3VsdHMgcmVzdWx0cyA9IF9wYXJzZUFyZ3MoYXJncyk7CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIGV4aXQoVEVTVF9VTktOT1dOKTsKKyAgfQorCisgIHZlcmJvc2UgPSByZXN1bHRzWyd2ZXJib3NlJ10gPT0gdHJ1ZTsKKworICBhd2FpdCBfaW5pdFRlc3RDbGllbnQoCisgICAgICBob3N0OiByZXN1bHRzWydob3N0J10sCisgICAgICBwb3J0OiBpbnQucGFyc2UocmVzdWx0c1sncG9ydCddKSwKKyAgICAgIHRyYW5zcG9ydFR5cGU6IHJlc3VsdHNbJ3RyYW5zcG9ydCddLAorICAgICAgcHJvdG9jb2xUeXBlOiByZXN1bHRzWydwcm90b2NvbCddKS5jYXRjaEVycm9yKChlKSB7CisgICAgc3Rkb3V0LndyaXRlbG4oJ0Vycm9yOicpOworICAgIHN0ZG91dC53cml0ZWxuKCckZScpOworICAgIGlmIChlIGlzIEVycm9yKSB7CisgICAgICBzdGRvdXQud3JpdGVsbignJHtlLnN0YWNrVHJhY2V9Jyk7CisgICAgfQorICAgIGV4aXQoVEVTVF9VTktOT1dOKTsKKyAgfSk7CisKKyAgLy8gcnVuIHRlc3RzCisgIF90ZXN0cyA9IF9jcmVhdGVUZXN0cygpOworCisgIGludCByZXN1bHQgPSAwOworCisgIGZvciAoVFRlc3QgdGVzdCBpbiBfdGVzdHMpIHsKKyAgICBpZiAodmVyYm9zZSkgc3Rkb3V0LndyaXRlKCcke3Rlc3QubmFtZX0uLi4gJyk7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IHRlc3QuZnVuYygpOworICAgICAgaWYgKHZlcmJvc2UpIHN0ZG91dC53cml0ZWxuKCdzdWNjZXNzIScpOworICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgIGlmICh2ZXJib3NlKSBzdGRvdXQud3JpdGVsbignJGUnKTsKKyAgICAgIHJlc3VsdCA9IHJlc3VsdCB8IHRlc3QuZXJyb3JDb2RlOworICAgIH0KKyAgfQorCisgIGV4aXQocmVzdWx0KTsKK30KKworQXJnUmVzdWx0cyBfcGFyc2VBcmdzKExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgIHZhciBwYXJzZXIgPSBuZXcgQXJnUGFyc2VyKCk7CisgIHBhcnNlci5hZGRPcHRpb24oJ2hvc3QnLCBkZWZhdWx0c1RvOiAnbG9jYWxob3N0JywgaGVscDogJ1RoZSBzZXJ2ZXIgaG9zdCcpOworICBwYXJzZXIuYWRkT3B0aW9uKCdwb3J0JywgZGVmYXVsdHNUbzogJzkwOTAnLCBoZWxwOiAnVGhlIHBvcnQgdG8gY29ubmVjdCB0bycpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0cmFuc3BvcnQnLAorICAgICAgZGVmYXVsdHNUbzogJ2J1ZmZlcmVkJywKKyAgICAgIGFsbG93ZWQ6IFsnYnVmZmVyZWQnLCAnZnJhbWVkJywgJ2h0dHAnXSwKKyAgICAgIGhlbHA6ICdUaGUgdHJhbnNwb3J0IG5hbWUnLAorICAgICAgYWxsb3dlZEhlbHA6IHsKKyAgICAgICAgJ2J1ZmZlcmVkJzogJ1RCdWZmZXJlZFRyYW5zcG9ydCcsCisgICAgICAgICdmcmFtZWQnOiAnVEZyYW1lZFRyYW5zcG9ydCcKKyAgICAgIH0pOworICBwYXJzZXIuYWRkT3B0aW9uKCdwcm90b2NvbCcsCisgICAgICBkZWZhdWx0c1RvOiAnYmluYXJ5JywKKyAgICAgIGFsbG93ZWQ6IFsnYmluYXJ5JywgJ2NvbXBhY3QnLCAnanNvbiddLAorICAgICAgaGVscDogJ1RoZSBwcm90b2NvbCBuYW1lJywKKyAgICAgIGFsbG93ZWRIZWxwOiB7CisgICAgICAgICdiaW5hcnknOiAnVEJpbmFyeVByb3RvY29sJywKKyAgICAgICAgJ2NvbXBhY3QnOiAnVENvbXBhY3RQcm90b2NvbCcsCisgICAgICAgICdqc29uJzogJ1RKc29uUHJvdG9jb2wnCisgICAgICB9KTsKKyAgcGFyc2VyLmFkZEZsYWcoJ3ZlcmJvc2UnLCBkZWZhdWx0c1RvOiBmYWxzZSk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICBzdGRvdXQud3JpdGVsbignJGVcbicpOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgc3Rkb3V0LndyaXRlKHBhcnNlci51c2FnZSk7CisKKyAgcmV0dXJuIHJlc3VsdHM7Cit9CisKK1RQcm90b2NvbEZhY3RvcnkgZ2V0UHJvdG9jb2xGYWN0b3J5KFN0cmluZyBwcm90b2NvbFR5cGUpIHsKKyAgaWYgKHByb3RvY29sVHlwZSA9PSAnYmluYXJ5JykgeworICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpOworICB9IGVsc2UgaWYgKHByb3RvY29sVHlwZSA9PSAnY29tcGFjdCcpIHsKKyAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xUeXBlID09ICdqc29uJykgeworICAgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbEZhY3RvcnkoKTsKKyAgfQorCisgIHRocm93IG5ldyBBcmd1bWVudEVycm9yLnZhbHVlKHByb3RvY29sVHlwZSk7Cit9CisKK0Z1dHVyZSBfaW5pdFRlc3RDbGllbnQoCisgICAge1N0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHRyYW5zcG9ydFR5cGUsIFN0cmluZyBwcm90b2NvbFR5cGV9KSBhc3luYyB7CisgIFRUcmFuc3BvcnQgdHJhbnNwb3J0OworICB2YXIgcHJvdG9jb2xGYWN0b3J5ID0gZ2V0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sVHlwZSk7CisKKyAgaWYgKHRyYW5zcG9ydFR5cGUgPT0gJ2h0dHAnKSB7CisgICAgdmFyIGh0dHBDbGllbnQgPSBuZXcgaHR0cC5JT0NsaWVudCgpOworICAgIHZhciB1cmkgPSBVcmkucGFyc2UoJ2h0dHA6Ly8kaG9zdDokcG9ydCcpOworICAgIHZhciBjb25maWcgPSBuZXcgVEh0dHBDb25maWcodXJpLCB7fSk7CisgICAgdHJhbnNwb3J0ID0gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KGh0dHBDbGllbnQsIGNvbmZpZyk7CisgIH0gZWxzZSB7CisgICAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KGhvc3QsIHBvcnQpOworICAgIHRyYW5zcG9ydCA9IG5ldyBUQ2xpZW50U29ja2V0VHJhbnNwb3J0KG5ldyBUVGNwU29ja2V0KHNvY2tldCkpOworICAgIGlmICh0cmFuc3BvcnRUeXBlID09ICdmcmFtZWQnKSB7CisgICAgICB0cmFuc3BvcnQgPSBuZXcgVEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQpOworICAgIH0KKyAgfQorCisgIHZhciBwcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpOworICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisKKyAgYXdhaXQgdHJhbnNwb3J0Lm9wZW4oKTsKK30KKworTGlzdDxUVGVzdD4gX2NyZWF0ZVRlc3RzKCkgeworICBMaXN0PFRUZXN0PiB0ZXN0cyA9IFtdOworCisgIHZhciB4dHJ1Y3QgPSBuZXcgWHRydWN0KCkKKyAgICAuLnN0cmluZ190aGluZyA9ICdaZXJvJworICAgIC4uYnl0ZV90aGluZyA9IDEKKyAgICAuLmkzMl90aGluZyA9IC0zCisgICAgLi5pNjRfdGhpbmcgPSAtNTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdFZvaWQnLCAoKSBhc3luYyB7CisgICAgYXdhaXQgY2xpZW50LnRlc3RWb2lkKCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdFN0cmluZycsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAnVGVzdCc7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IGlucHV0KSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0Qm9vbCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSB0cnVlOworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEJvb2woaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RCeXRlJywgKCkgYXN5bmMgeworICAgIHZhciBpbnB1dCA9IDY0OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEJ5dGUoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RJMzInLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gMjE0NzQ4MzY0NzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RJMzIoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3RJNjQnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjQoaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0JBU0VUWVBFUywgJ3Rlc3REb3VibGUnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gMy4xNDE1OTI2OworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZShpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQkFTRVRZUEVTLCAndGVzdEJpbmFyeScsICgpIGFzeW5jIHsKKyAgICB2YXIgdXRmOENvZGVjID0gY29uc3QgVXRmOENvZGVjKCk7CisgICAgdmFyIGlucHV0ID0gdXRmOENvZGVjLmVuY29kZSgnZm9vJyk7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0QmluYXJ5KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBMaXN0RXF1YWxpdHkoKTsKKyAgICBpZiAoIWVxdWFsaXR5LmVxdWFscyhyZXN1bHQsIGlucHV0KSkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RTdHJ1Y3QnLCAoKSBhc3luYyB7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0U3RydWN0KHh0cnVjdCk7CisgICAgaWYgKCckcmVzdWx0JyAhPSAnJHh0cnVjdCcpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgeHRydWN0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE5lc3QnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IFh0cnVjdDIoKQorICAgICAgLi5ieXRlX3RoaW5nID0gMQorICAgICAgLi5zdHJ1Y3RfdGhpbmcgPSB4dHJ1Y3QKKyAgICAgIC4uaTMyX3RoaW5nID0gLTM7CisKKyAgICB2YXIgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3ROZXN0KGlucHV0KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckaW5wdXQnKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdE1hcCcsICgpIGFzeW5jIHsKKyAgICBNYXA8aW50LCBpbnQ+IGlucHV0ID0gezE6IC0xMCwgMjogLTksIDM6IC04LCA0OiAtNywgNTogLTZ9OworCisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TWFwKGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBNYXBFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdFNldCcsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgU2V0PGludD4uZnJvbShbLTIsIC0xLCAwLCAxLCAyXSk7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0U2V0KGlucHV0KTsKKyAgICB2YXIgZXF1YWxpdHkgPSBjb25zdCBTZXRFcXVhbGl0eSgpOworICAgIGlmICghZXF1YWxpdHkuZXF1YWxzKHJlc3VsdCwgaW5wdXQpKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9DT05UQUlORVJTLCAndGVzdExpc3QnLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gWy0yLCAtMSwgMCwgMSwgMl07CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdChpbnB1dCk7CisgICAgdmFyIGVxdWFsaXR5ID0gY29uc3QgTGlzdEVxdWFsaXR5KCk7CisgICAgaWYgKCFlcXVhbGl0eS5lcXVhbHMocmVzdWx0LCBpbnB1dCkpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0RW51bScsICgpIGFzeW5jIHsKKyAgICBhd2FpdCBfdGVzdEVudW0oTnVtYmVyei5PTkUpOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LlRXTyk7CisgICAgYXdhaXQgX3Rlc3RFbnVtKE51bWJlcnouVEhSRUUpOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LkZJVkUpOworICAgIGF3YWl0IF90ZXN0RW51bShOdW1iZXJ6LkVJR0hUKTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9CQVNFVFlQRVMsICd0ZXN0VHlwZWRlZicsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSAzMDk4NTgyMzUwODI1MjM7CisgICAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0VHlwZWRlZihpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBpbnB1dCkgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCBpbnB1dCk7CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RNYXBNYXAnLCAoKSBhc3luYyB7CisgICAgTWFwPGludCwgTWFwPGludCwgaW50Pj4gcmVzdWx0ID0gYXdhaXQgY2xpZW50LnRlc3RNYXBNYXAoMSk7CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5IHx8IHJlc3VsdFtyZXN1bHQua2V5cy5maXJzdF0uaXNFbXB0eSkgeworICAgICAgdGhyb3cgbmV3IFRUZXN0RXJyb3IocmVzdWx0LCAnTWFwPGludCwgTWFwPGludCwgaW50Pj4nKTsKKyAgICB9CisgIH0pKTsKKworICB0ZXN0cy5hZGQobmV3IFRUZXN0KFRFU1RfQ09OVEFJTkVSUywgJ3Rlc3RJbnNhbml0eScsICgpIGFzeW5jIHsKKyAgICB2YXIgaW5wdXQgPSBuZXcgSW5zYW5pdHkoKTsKKyAgICBpbnB1dC51c2VyTWFwID0ge051bWJlcnouRklWRTogNTAwMH07CisgICAgaW5wdXQueHRydWN0cyA9IFt4dHJ1Y3RdOworCisgICAgTWFwPGludCwgTWFwPGludCwgSW5zYW5pdHk+PiByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdEluc2FuaXR5KGlucHV0KTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkgfHwgcmVzdWx0W3Jlc3VsdC5rZXlzLmZpcnN0XS5pc0VtcHR5KSB7CisgICAgICB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsICdNYXA8aW50LCBNYXA8aW50LCBJbnNhbml0eT4+Jyk7CisgICAgfQorICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0NPTlRBSU5FUlMsICd0ZXN0TXVsdGknLCAoKSBhc3luYyB7CisgICAgdmFyIGlucHV0ID0gbmV3IFh0cnVjdCgpCisgICAgICAuLnN0cmluZ190aGluZyA9ICdIZWxsbzInCisgICAgICAuLmJ5dGVfdGhpbmcgPSAxMjMKKyAgICAgIC4uaTMyX3RoaW5nID0gNDU2CisgICAgICAuLmk2NF90aGluZyA9IDc4OTsKKworICAgIHZhciByZXN1bHQgPSBhd2FpdCBjbGllbnQudGVzdE11bHRpKGlucHV0LmJ5dGVfdGhpbmcsIGlucHV0LmkzMl90aGluZywKKyAgICAgICAgaW5wdXQuaTY0X3RoaW5nLCB7MTogJ29uZSd9LCBOdW1iZXJ6LkVJR0hULCA1Njc4KTsKKyAgICBpZiAoJyRyZXN1bHQnICE9ICckaW5wdXQnKSB0aHJvdyBuZXcgVFRlc3RFcnJvcihyZXN1bHQsIGlucHV0KTsKKyAgfSkpOworCisgIHRlc3RzLmFkZChuZXcgVFRlc3QoVEVTVF9FWENFUFRJT05TLCAndGVzdEV4Y2VwdGlvbicsICgpIGFzeW5jIHsKKyAgICB0cnkgeworICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CisgICAgfSBvbiBYY2VwdGlvbiBjYXRjaCAoXykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRocm93IG5ldyBUVGVzdEVycm9yKG51bGwsICdYY2VwdGlvbicpOworICB9KSk7CisKKyAgdGVzdHMuYWRkKG5ldyBUVGVzdChURVNUX0VYQ0VQVElPTlMsICd0ZXN0TXVsdGlFeGNlcHRpb24nLCAoKSBhc3luYyB7CisgICAgdHJ5IHsKKyAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb24oJ1hjZXB0aW9uMicsICdmb28nKTsKKyAgICB9IG9uIFhjZXB0aW9uMiBjYXRjaCAoXykgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRocm93IG5ldyBUVGVzdEVycm9yKG51bGwsICdYY2VwdGlvbjInKTsKKyAgfSkpOworCisgIHJldHVybiB0ZXN0czsKK30KKworRnV0dXJlIF90ZXN0RW51bShpbnQgaW5wdXQpIGFzeW5jIHsKKyAgdmFyIHJlc3VsdCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bShpbnB1dCk7CisgIGlmIChyZXN1bHQgIT0gaW5wdXQpIHRocm93IG5ldyBUVGVzdEVycm9yKHJlc3VsdCwgaW5wdXQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbCBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2NDJmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0aHJpZnRfdGVzdF9jbGllbnQKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBjbGllbnQgaW50ZWdyYXRpb24gdGVzdCBmb3IgdGhlIERhcnQgVGhyaWZ0IGxpYnJhcnkKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYXJnczogXjAuMTMuMAorICBodHRwOiBeMC4xMS4wCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0aHJpZnRfdGVzdDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90aHJpZnRfdGVzdAorCitkZXZfZGVwZW5kZW5jaWVzOgorICB0ZXN0OiAiXjAuMTIuMCIKZGlmZiAtLWdpdCBhL3Rlc3QvZXJsL01ha2VmaWxlLmFtIGIvdGVzdC9lcmwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNWU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlRfRklMRVMgPSAkKHdpbGRjYXJkIC4uLyoudGhyaWZ0KQorCitpZiBFUkxBTkdfT1RQMTYKK0VSTF9GTEFHID0gZXJsOm90cDE2CitlbHNlCitFUkxfRkxBRyA9IGVybAorZW5kaWYKKyMgbWFrZSBzdXJlIFRocmlmdFRlc3QudGhyaWZ0IGlzIGdlbmVyYXRlZCBsYXN0IHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggb3RoZXIgKi50aHJpZnQgZmlsZXMKKy5nZW5lcmF0ZWQ6ICQoVEhSSUZUX0ZJTEVTKQorCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKKwkgICQoVEhSSUZUKSAtLWdlbiAkKEVSTF9GTEFHKSAtbyBzcmMgJCRmIDsgXAorCWRvbmUgOyBcCisJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHNyYyAuLi9UaHJpZnRUZXN0LnRocmlmdAorCXRvdWNoIC5nZW5lcmF0ZWQKKworcHJlY3Jvc3M6IC5nZW5lcmF0ZWQKKwkkKFJFQkFSKSBjb21waWxlCisKK2NsZWFuOgorCXJtIC1mIC5nZW5lcmF0ZWQKKwlybSAtcmYgc3JjL2dlbi1lcmwKKwkkKFJFQkFSKSBjbGVhbgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvcmViYXIuY29uZmlnIGIvdGVzdC9lcmwvcmViYXIuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YTA3ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9yZWJhci5jb25maWcKQEAgLTAsMCArMSw2IEBACit7c3ViX2RpcnMsIFsiLi4vLi4vbGliL2VybCJdfS4KKwore2VybF9vcHRzLCBbCisgIGRlYnVnX2luZm8sCisgIHtpLCAiLi4vLi4vbGliL2VybC9pbmNsdWRlIn0KK119LgpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhZDU5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwKQEAgLTAsMCArMSwxNzQgQEAKKyUlCislJSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCislJSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorJSUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyUlIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorJSUgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorJSUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorJSUgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CislJQorJSUgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyUlCislJSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCislJSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorJSUgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCislJSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorJSUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworJSUgdW5kZXIgdGhlIExpY2Vuc2UuCislJQorCistbW9kdWxlKHRlc3RfY2xpZW50KS4KKworLWV4cG9ydChbc3RhcnQvMCwgc3RhcnQvMV0pLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfdGVzdF90eXBlcy5ocmwiKS4KKworLXJlY29yZChvcHRpb25zLCB7cG9ydCA9IDkwOTAsCisgICAgICAgICAgICAgICAgICBjbGllbnRfb3B0cyA9IFtdfSkuCisKK3BhcnNlX2FyZ3MoQXJncykgLT4gcGFyc2VfYXJncyhBcmdzLCAjb3B0aW9uc3t9KS4KK3BhcnNlX2FyZ3MoW10sIE9wdHMpIC0+CisgIE9wdHM7CitwYXJzZV9hcmdzKFtIZWFkIHwgUmVzdF0sIE9wdHMpIC0+CisgICAgTmV3T3B0cyA9CisgICAgICAgIGNhc2UgSGVhZCBvZgorICAgICAgICAgICAgIi0tcG9ydD0iICsrIFBvcnQgLT4KKyAgICAgICAgICAgICAgICBjYXNlIHN0cmluZzp0b19pbnRlZ2VyKFBvcnQpIG9mCisgICAgICAgICAgICAgICAgICB7SW50UG9ydCxffSB3aGVuIGlzX2ludGVnZXIoSW50UG9ydCkgLT4KKyAgICAgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze3BvcnQgPSBJbnRQb3J0fTsKKyAgICAgICAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgICAgICAgICAgZW5kOworICAgICAgICAgICAgIi0tdHJhbnNwb3J0PSIgKysgVHJhbnMgLT4KKyAgICAgICAgICAgICAgICAlIFRPRE86IEVuYWJsZSBCdWZmZXJlZCBhbmQgSFRUUCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zIG9mCisgICAgICAgICAgICAgICAgICAgICJmcmFtZWQiIC0+CisgICAgICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7Y2xpZW50X29wdHMgPSBbe2ZyYW1lZCwgdHJ1ZX0gfCBPcHRzI29wdGlvbnMuY2xpZW50X29wdHNdfTsKKyAgICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS1zc2wiIC0+CisgICAgICAgICAgICAgICAgc3NsOnN0YXJ0KCksCisgICAgICAgICAgICAgICAgU3NsT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHtzc2xvcHRpb25zLCBbCisgICAgICAgICAgICAgICAgICAgICAgICB7Y2FjZXJ0ZmlsZSwgIi4uL2tleXMvQ0EucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7Y2VydGZpbGUsICIuLi9rZXlzL2NsaWVudC5wZW0ifSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtrZXlmaWxlLCAiLi4va2V5cy9jbGllbnQua2V5In0KKyAgICAgICAgICAgICAgICAgICAgXX0sCisgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3tzc2x0cmFuc3BvcnQsIHRydWV9IHwgW1NzbE9wdGlvbnMgfCBPcHRzI29wdGlvbnMuY2xpZW50X29wdHNdXX07CisgICAgICAgICAgICAiLS1wcm90b2NvbD0iICsrIFByb3RvIC0+CisgICAgICAgICAgICAgICAgT3B0cyNvcHRpb25ze2NsaWVudF9vcHRzID0gW3twcm90b2NvbCwgbGlzdF90b19hdG9tKFByb3RvKX1dfTsKKyAgICAgICAgICAgIF9FbHNlIC0+CisgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgZW5kLAorICAgIHBhcnNlX2FyZ3MoUmVzdCwgTmV3T3B0cykuCisKK3N0YXJ0KCkgLT4gc3RhcnQoaW5pdDpnZXRfcGxhaW5fYXJndW1lbnRzKCkpLgorc3RhcnQoQXJncykgLT4KKyAgI29wdGlvbnN7cG9ydCA9IFBvcnQsIGNsaWVudF9vcHRzID0gQ2xpZW50T3B0c30gPSBwYXJzZV9hcmdzKEFyZ3MpLAorICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygKKyAgICAiMTI3LjAuMC4xIiwgUG9ydCwgdGhyaWZ0X3Rlc3RfdGhyaWZ0LCBDbGllbnRPcHRzKSwKKworICBEZW1vWHRydWN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QneworICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nID0gPDwiWmVybyI+PiwKKyAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmcgPSAxLAorICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nID0gOTEyODM2MSwKKyAgICAgICAgICAgICAgICAgIGk2NF90aGluZyA9IDkyMjMzNzIwMzY4NTQ3NzU4MDd9LAorCisgIERlbW9OZXN0ID0gIyd0aHJpZnQudGVzdC5YdHJ1Y3QyJ3sKKyAgICBieXRlX3RoaW5nID0gNywKKyAgICBzdHJ1Y3RfdGhpbmcgPSBEZW1vWHRydWN0LAorICAgICUgTm90ZSB0aGF0IHdlIGRvbid0IHNldCBpMzJfdGhpbmcsIGl0IHdpbGwgY29tZSBiYWNrIGFzIHVuZGVmaW5lZAorICAgICUgZnJvbSB0aGUgUHl0aG9uIHNlcnZlciwgYnV0IDAgZnJvbSB0aGUgQysrIHNlcnZlciwgc2luY2UgaXQgaXMgbm90CisgICAgJSBvcHRpb25hbAorICAgIGkzMl90aGluZyA9IDJ9LAorCisgICUgSXMgaXQgc2FmZSB0byBtYXRjaCB0aGVzZSB0aGluZ3M/CisgIERlbW9EaWN0ID0gZGljdDpmcm9tX2xpc3QoWyB7S2V5LCBLZXktMTB9IHx8IEtleSA8LSBsaXN0czpzZXEoMCwxMCkgXSksCisgIERlbW9TZXQgPSBzZXRzOmZyb21fbGlzdChbIEtleSB8fCBLZXkgPC0gbGlzdHM6c2VxKC0zLDMpIF0pLAorCisgIERlbW9JbnNhbmUgPSAjJ3RocmlmdC50ZXN0Lkluc2FuaXR5J3sKKyAgICB1c2VyTWFwID0gZGljdDpmcm9tX2xpc3QoW3s/VEhSSUZUX1RFU1RfTlVNQkVSWl9GSVZFLCA1MDAwfV0pLAorICAgIHh0cnVjdHMgPSBbIyd0aHJpZnQudGVzdC5YdHJ1Y3QneyBzdHJpbmdfdGhpbmcgPSA8PCJUcnVjayI+PiwgYnl0ZV90aGluZyA9IDgsIGkzMl90aGluZyA9IDgsIGk2NF90aGluZyA9IDh9XX0sCisKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0Vm9pZCIpLAorICB7Q2xpZW50MDEsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwLCB0ZXN0Vm9pZCwgW10pLAorCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cmluZyIpLAorICB7Q2xpZW50MDIsIHtvaywgPDwiVGVzdCI+Pn19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDEsIHRlc3RTdHJpbmcsIFsiVGVzdCJdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0U3RyaW5nIiksCisgIHtDbGllbnQwMywge29rLCA8PCJUZXN0Ij4+fX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwMiwgdGVzdFN0cmluZywgWzw8IlRlc3QiPj5dKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0Qnl0ZSIpLAorICB7Q2xpZW50MDQsIHtvaywgNjN9fSAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDMsIHRlc3RCeXRlLCBbNjNdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0STMyIiksCisgIHtDbGllbnQwNSwge29rLCAtMX19ICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNCwgdGVzdEkzMiwgWy0xXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEkzMiIpLAorICB7Q2xpZW50MDYsIHtvaywgMH19ICAgICAgICAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDUsIHRlc3RJMzIsIFswXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEk2NCIpLAorICB7Q2xpZW50MDcsIHtvaywgLTM0MzU5NzM4MzY4fX0gICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDYsIHRlc3RJNjQsIFstMzQzNTk3MzgzNjhdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0RG91YmxlIiksCisgIHtDbGllbnQwOCwge29rLCAtNS4yMDk4NTIzfX0gICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQwNywgdGVzdERvdWJsZSwgWy01LjIwOTg1MjNdKSwKKyAgJSUgVE9ETzogYWRkIHRlc3RCaW5hcnkoKSBjYWxsCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdFN0cnVjdCIpLAorICB7Q2xpZW50MDksIHtvaywgRGVtb1h0cnVjdH19ICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MDgsIHRlc3RTdHJ1Y3QsIFtEZW1vWHRydWN0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE5lc3QiKSwKKyAge0NsaWVudDEwLCB7b2ssIERlbW9OZXN0fX0gICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDA5LCB0ZXN0TmVzdCwgW0RlbW9OZXN0XSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE1hcCIpLAorICB7Q2xpZW50MTEsIHtvaywgRGVtb0RpY3R9fSAgICAgICAgPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTAsIHRlc3RNYXAsIFtEZW1vRGljdF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RTZXQiKSwKKyAge0NsaWVudDEyLCB7b2ssIERlbW9TZXR9fSAgICAgICAgID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDExLCB0ZXN0U2V0LCBbRGVtb1NldF0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RMaXN0IiksCisgIHtDbGllbnQxMywge29rLCBbLTEsMiwzXX19ICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMiwgdGVzdExpc3QsIFtbLTEsMiwzXV0pLAorICBlcnJvcl9sb2dnZXI6aW5mb19tc2coInRlc3RFbnVtIiksCisgIHtDbGllbnQxNCwge29rLCAxfX0gICAgICAgICAgICAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxMywgdGVzdEVudW0sIFs/VEhSSUZUX1RFU1RfTlVNQkVSWl9PTkVdKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0VHlwZWRlZiIpLAorICB7Q2xpZW50MTUsIHtvaywgMzA5ODU4MjM1MDgyNTIzfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTQsIHRlc3RUeXBlZGVmLCBbMzA5ODU4MjM1MDgyNTIzXSksCisgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdEluc2FuaXR5IiksCisgIHtDbGllbnQxNiwge29rLCBJbnNhbmVSZXN1bHR9fSAgICA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNSwgdGVzdEluc2FuaXR5LCBbRGVtb0luc2FuZV0pLAorICBpbzpmb3JtYXQoIn5wfm4iLCBbSW5zYW5lUmVzdWx0XSksCisKKyAge0NsaWVudDE3LCB7b2ssICMndGhyaWZ0LnRlc3QuWHRydWN0J3tzdHJpbmdfdGhpbmcgPSA8PCJNZXNzYWdlIj4+fX19ID0KKyAgICB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTYsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJTYWZlIiwgIk1lc3NhZ2UiXSksCisKKyAgQ2xpZW50MTggPQorICAgIHRyeQorICAgICAge0NsaWVudFMxLCBSZXN1bHQxfSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxNywgdGVzdE11bHRpRXhjZXB0aW9uLCBbIlhjZXB0aW9uIiwgIk1lc3NhZ2UiXSksCisgICAgICBpbzpmb3JtYXQoIlVuZXhwZWN0ZWQgcmV0dXJuISB+cH5uIiwgW1Jlc3VsdDFdKSwKKyAgICAgIENsaWVudFMxCisgICAgY2F0Y2gKKyAgICAgIHRocm93OntDbGllbnRTMiwge2V4Y2VwdGlvbiwgRXhuUzEgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3t9fX0gLT4KKyAgICAgICAgIyd0aHJpZnQudGVzdC5YY2VwdGlvbid7ZXJyb3JDb2RlID0gMTAwMSwgbWVzc2FnZSA9IDw8IlRoaXMgaXMgYW4gWGNlcHRpb24iPj59ID0gRXhuUzEsCisgICAgICAgIENsaWVudFMyOworICAgICAgdGhyb3c6e0NsaWVudFMyLCB7ZXhjZXB0aW9uLCBfRXhuUzEgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7fX19IC0+CisgICAgICAgIGlvOmZvcm1hdCgiV3JvbmcgZXhjZXB0aW9uIHR5cGUhfm4iLCBbXSksCisgICAgICAgIENsaWVudFMyCisgICAgZW5kLAorCisgIENsaWVudDE5ID0KKyAgICB0cnkKKyAgICAgIHtDbGllbnRTMywgUmVzdWx0Mn0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MTgsIHRlc3RNdWx0aUV4Y2VwdGlvbiwgWyJYY2VwdGlvbjIiLCAiTWVzc2FnZSJdKSwKKyAgICAgIGlvOmZvcm1hdCgiVW5leHBlY3RlZCByZXR1cm4hIH5wfm4iLCBbUmVzdWx0Ml0pLAorICAgICAgQ2xpZW50UzMKKyAgICBjYXRjaAorICAgICAgdGhyb3c6e0NsaWVudFM0LCB7ZXhjZXB0aW9uLCBfRXhuUzIgPSAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uJ3t9fX0gLT4KKyAgICAgICAgaW86Zm9ybWF0KCJXcm9uZyBleGNlcHRpb24gdHlwZSF+biIsIFtdKSwKKyAgICAgICAgQ2xpZW50UzQ7CisgICAgICB0aHJvdzp7Q2xpZW50UzQsIHtleGNlcHRpb24sIEV4blMyID0gIyd0aHJpZnQudGVzdC5YY2VwdGlvbjIne319fSAtPgorICAgICAgICAjJ3RocmlmdC50ZXN0LlhjZXB0aW9uMid7ZXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmcgPSAjJ3RocmlmdC50ZXN0Llh0cnVjdCd7CisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmcgPSA8PCJUaGlzIGlzIGFuIFhjZXB0aW9uMiI+Pn19ID0gRXhuUzIsCisgICAgICAgIENsaWVudFM0CisgICAgZW5kLAorCisgICUlIFN0YXJ0ZWQgPSBlcmxhbmc6bW9ub3RvbmljX3RpbWUobWlsbGlfc2Vjb25kcyksCisgIHtfLCBTdGFydFNlYywgU3RhcnRVU2VjfSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgZXJyb3JfbG9nZ2VyOmluZm9fbXNnKCJ0ZXN0T25ld2F5IiksCisgIHtDbGllbnQyMCwge29rLCBva319ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDE5LCB0ZXN0T25ld2F5LCBbMV0pLAorICB7XywgRW5kU2VjLCBFbmRVU2VjfSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKKyAgRWxhcHNlZCA9IChFbmRTZWMgLSBTdGFydFNlYykgKiAxMDAwICsgKEVuZFVTZWMgLSBTdGFydFVTZWMpIC8gMTAwMCwKKyAgaWYKKyAgICBFbGFwc2VkID4gMTAwMCAtPiBleGl0KDEpOworICAgIHRydWUgLT4gdHJ1ZQorICBlbmQsCisKKyAgdGhyaWZ0X2NsaWVudDpjbG9zZShDbGllbnQyMCkuCmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDhkZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybApAQCAtMCwwICsxLDIzMyBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF90aHJpZnRfc2VydmVyKS4KKworLWV4cG9ydChbc3RhcnQvMCwgc3RhcnQvMSwgc3RhcnRfbGluay8yLCBoYW5kbGVfZnVuY3Rpb24vMl0pLgorCistaW5jbHVkZSgidGhyaWZ0X2NvbnN0YW50cy5ocmwiKS4KKy1pbmNsdWRlKCJnZW4tZXJsL3RocmlmdF90ZXN0X3R5cGVzLmhybCIpLgorCistcmVjb3JkKG9wdGlvbnMsIHtwb3J0ID0gOTA5MCwKKyAgICAgICAgICAgICAgICAgIHNlcnZlcl9vcHRzID0gW119KS4KKworcGFyc2VfYXJncyhBcmdzKSAtPiBwYXJzZV9hcmdzKEFyZ3MsICNvcHRpb25ze30pLgorcGFyc2VfYXJncyhbXSwgT3B0cykgLT4KKyAgT3B0czsKK3BhcnNlX2FyZ3MoW0hlYWQgfCBSZXN0XSwgT3B0cykgLT4KKyAgICBOZXdPcHRzID0KKyAgICAgICAgY2FzZSBIZWFkIG9mCisgICAgICAgICAgICAiLS1wb3J0PSIgKysgUG9ydCAtPgorICAgICAgICAgICAgICAgIGNhc2Ugc3RyaW5nOnRvX2ludGVnZXIoUG9ydCkgb2YKKyAgICAgICAgICAgICAgICAgIHtJbnRQb3J0LF99IHdoZW4gaXNfaW50ZWdlcihJbnRQb3J0KSAtPgorICAgICAgICAgICAgICAgICAgICBPcHRzI29wdGlvbnN7cG9ydCA9IEludFBvcnR9OworICAgICAgICAgICAgICAgICAgX0Vsc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgZXJsYW5nOmVycm9yKHtiYWRfYXJnLCBIZWFkfSkKKyAgICAgICAgICAgICAgICBlbmQ7CisgICAgICAgICAgICAiLS10cmFuc3BvcnQ9IiArKyBUcmFucyAtPgorICAgICAgICAgICAgICAgIGNhc2UgVHJhbnMgb2YKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lZCIgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7ZnJhbWVkLCB0cnVlfSB8IE9wdHMjb3B0aW9ucy5zZXJ2ZXJfb3B0c119OworICAgICAgICAgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgT3B0cworICAgICAgICAgICAgICAgIGVuZDsKKyAgICAgICAgICAgICItLXNzbCIgLT4KKyAgICAgICAgICAgICAgICBzc2w6c3RhcnQoKSwKKyAgICAgICAgICAgICAgICBTc2xPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAge3NzbG9wdGlvbnMsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VydGZpbGUsICIuLi9rZXlzL3NlcnZlci5wZW0ifQorICAgICAgICAgICAgICAgICAgICAgICAgLHtrZXlmaWxlLCAgIi4uL2tleXMvc2VydmVyLmtleSJ9CisgICAgICAgICAgICAgICAgICAgIF19LAorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXV19OworICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgorICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7cHJvdG9jb2wsIGxpc3RfdG9fYXRvbShQcm90byl9IHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXX07CisgICAgICAgICAgICBfRWxzZSAtPgorICAgICAgICAgICAgICAgIGVybGFuZzplcnJvcih7YmFkX2FyZywgSGVhZH0pCisgICAgICAgIGVuZCwKKyAgICBwYXJzZV9hcmdzKFJlc3QsIE5ld09wdHMpLgorCitzdGFydCgpIC0+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+LCBhcmc0OkludCwgYXJnNTpoYXhlLkludDY0KTpYdHJ1Y3QKKyAgICB7CisgICAgICAgIHRyYWNlKCJ0ZXN0TXVsdGkoKSIpOworICAgICAgICB2YXIgaGVsbG8gPSBuZXcgWHRydWN0KCk7CisgICAgICAgIGhlbGxvLnN0cmluZ190aGluZyA9ICJIZWxsbzIiOworICAgICAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgaGVsbG8uaTY0X3RoaW5nID0gYXJnMjsKKyAgICAgICAgcmV0dXJuIGhlbGxvOworICAgIH0KKworICAgIC8qKgorICAgICogUHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyB3aXRoIGFyZyBhcyAnJXMnCisgICAgKiBAcGFyYW0gc3RyaW5nIGFyZyAtIGEgc3RyaW5nIGluZGljYXRpb24gd2hhdCB0eXBlIG9mIGV4Y2VwdGlvbiB0byB0aHJvdworICAgICogaWYgYXJnID09ICJYY2VwdGlvbiIgdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gYXJnCisgICAgKiBlbHNlbiBpZiBhcmcgPT0gIlRFeGNlcHRpb24iIHRocm93IFRFeGNlcHRpb24KKyAgICAqIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCisgICAgKgorICAgICogQHBhcmFtIGFyZworICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFeGNlcHRpb24oYXJnOlN0cmluZyk6Vm9pZAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RFeGNlcHRpb24oIiArIGFyZyArICIpIik7CisgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH07CisgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigpOworICAgICAgICB9OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgKiBQcmludCAndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknIHdpdGggYXJnMCBhcyAnJXMnIGFuZCBhcmcxIGFzICclcycKKyAgICAqIEBwYXJhbSBzdHJpbmcgYXJnIC0gYSBzdHJpbmcgaW5kaWNhdGlvbiB3aGF0IHR5cGUgb2YgZXhjZXB0aW9uIHRvIHRocm93CisgICAgKiBpZiBhcmcwID09ICJYY2VwdGlvbiIKKyAgICAqIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIgorICAgICogZWxzZSBpZiBhcmcwID09ICJYY2VwdGlvbjIiCisgICAgKiB0aHJvdyBYY2VwdGlvbjIgd2l0aCBlcnJvckNvZGUgPSAyMDAyIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICogZWxzZSBkbyBub3QgdGhyb3cgYW55dGhpbmcKKyAgICAqIEByZXR1cm4gWHRydWN0IC0gYW4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQorICAgICoKKyAgICAqIEBwYXJhbSBhcmcwCisgICAgKiBAcGFyYW0gYXJnMQorICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwOlN0cmluZywgYXJnMTpTdHJpbmcpOlh0cnVjdAorICAgIHsKKyAgICAgICAgdHJhY2UoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIikiKTsKKyAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24oKTsKKyAgICAgICAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgICAgICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKKyAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0gZWxzZSBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikgeworICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24yKCk7CisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDIwMDI7CisgICAgICAgICAgICB4LnN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIHguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiI7CisgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICB9OworICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOworICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnMTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAqIFByaW50ICd0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi4nIHdpdGggc2Vjb25kc1RvU2xlZXAgYXMgJyVkJworICAgICogc2xlZXAgJ3NlY29uZHNUb1NsZWVwJworICAgICogUHJpbnQgJ3Rlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIScgd2l0aCBzZWNvbmRzVG9TbGVlcCBhcyAnJWQnCisgICAgKiBAcGFyYW0gaTMyIHNlY29uZHNUb1NsZWVwIC0gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNsZWVwCisgICAgKgorICAgICogQHBhcmFtIHNlY29uZHNUb1NsZWVwCisgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcDpoYXhlLkludDMyKTpWb2lkCisgICAgeworICAgICAgICB0cmFjZSgidGVzdE9uZXdheSgiICsgc2Vjb25kc1RvU2xlZXAgKyAiKSwgc2xlZXBpbmcuLi4iKTsKKyAgICAgICAgU3lzLnNsZWVwKHNlY29uZHNUb1NsZWVwKTsKKyAgICAgICAgdHJhY2UoInRlc3RPbmV3YXkgZmluaXNoZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0b3AoKTpWb2lkCisgICAgeworICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNlcnZlci5TdG9wKCk7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9DTWFrZUxpc3RzLnR4dCBiL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjYTNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSwxMTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQoaHNfdGVzdF9nZW4KKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0NvbnN0YW50c0RlbW9fQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Db25zdGFudHNEZW1vX1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9EZWJ1Z1Byb3RvVGVzdF9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0RlYnVnUHJvdG9UZXN0X1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2VfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9FbXB0eVNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0VtcHR5U2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5jbHVkZV9Db25zdHMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luY2x1ZGVfVHlwZXMuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL0luaGVyaXRlZC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvSW5oZXJpdGVkX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9SZXZlcnNlT3JkZXJTZXJ2aWNlX0NsaWVudC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvUmV2ZXJzZU9yZGVyU2VydmljZV9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2Vjb25kU2VydmljZV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlY29uZFNlcnZpY2VfSWZhY2UuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1NlcnZpY2VGb3JFeGNlcHRpb25XaXRoQU1hcC5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvU2VydmljZUZvckV4Y2VwdGlvbldpdGhBTWFwX0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnZfQ2xpZW50LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9TcnYuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1Nydl9JZmFjZS5ocworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9nZW4taHMvVGhyaWZ0VGVzdF9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1RocmlmdFRlc3RfQ29uc3RzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0LmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X0lmYWNlLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9UaHJpZnRUZXN0X1R5cGVzLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YV9DbGllbnQuaHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzL1lvd3phLmhzCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1ocy9Zb3d6YV9JZmFjZS5ocworKQorCitzZXQoaHNfY3Jvc3N0ZXN0X2FwcHMKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vVGVzdFNlcnZlcgorICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9UZXN0Q2xpZW50CispCitzZXQoaHNfY3Jvc3N0ZXN0X2FyZ3MKKyAgICAtaWdlbi1ocworICAgIC1vZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfQorICAgIC1oaWRpcj0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKykKKworaWYgKENNQUtFX0JVSUxEX1RZUEUgU1RSRVFVQUwgIkRlYnVnIikKKyAgc2V0KGhzX29wdGltaXplIC1PMCkKK2Vsc2UoKQorICBzZXQoaHNfb3B0aW1pemUgLU8xKQorZW5kaWYoKQorCithZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICR7aHNfY3Jvc3N0ZXN0X2FwcHN9CisgICAgQ09NTUFORCAke0dIQ30gJHtoc19vcHRpbWl6ZX0gJHtoc19jcm9zc3Rlc3RfYXJnc30gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L1Rlc3RTZXJ2ZXIuaHMgLW8gVGVzdFNlcnZlcgorICAgIENPTU1BTkQgJHtHSEN9ICR7aHNfb3B0aW1pemV9ICR7aHNfY3Jvc3N0ZXN0X2FyZ3N9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9UZXN0Q2xpZW50LmhzIC1vIFRlc3RDbGllbnQKKyAgICBERVBFTkRTICR7aHNfdGVzdF9nZW59IGhhc2tlbGxfbGlicmFyeSBUZXN0U2VydmVyLmhzIFRlc3RDbGllbnQuaHMKKykKK2FkZF9jdXN0b21fdGFyZ2V0KGhhc2tlbGxfY3Jvc3N0ZXN0IEFMTAorICAgIENPTU1FTlQgIkJ1aWxkaW5nIEhhc2tlbGwgY3Jvc3MgdGVzdCBleGVjdXRhYmxlcyIKKyAgICBERVBFTkRTICR7aHNfY3Jvc3N0ZXN0X2FwcHN9CispCisKK3NldChoc190ZXN0X3NvdXJjZXMKKyAgICBDb25zdGFudHNEZW1vX01haW4uaHMKKyAgICBEZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCisgICAgSW5jbHVkZV9NYWluLmhzCisgICAgVGhyaWZ0VGVzdF9NYWluLmhzCispCitzZXQoaHNfdGVzdF9hcmdzCisgICAgLVdhbGwKKyAgICAtWFNjb3BlZFR5cGVWYXJpYWJsZXMKKyAgICAtaSR7UFJPSkVDVF9TT1VSQ0VfRElSfS9saWIvaHMvc3JjCisgICAgLWkke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWhzCispCithZGRfY3VzdG9tX3RhcmdldChoYXNrZWxsX3Rlc3RzIEFMTCBERVBFTkRTICR7aHNfdGVzdF9nZW59KQorZm9yZWFjaChTUkMgJHtoc190ZXN0X3NvdXJjZXN9KQorICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoQkFTRSAke1NSQ30gTkFNRV9XRSkKKyAgICBhZGRfdGVzdChOQU1FIEhhc2tlbGxUZXN0cy0ke0JBU0V9CisgICAgICAgIENPTU1BTkQgJHtSVU5fSEFTS0VMTH0gJHtoc190ZXN0X2FyZ3N9ICR7U1JDfQorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCitlbmRmb3JlYWNoKCkKKworc2V0KGhzX3Rlc3RfZ2VuX3NvdXJjZXMKKyAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvSW5jbHVkZS50aHJpZnQKKykKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgJHtoc190ZXN0X2dlbn0KKyAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBocyAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGhzICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gaHMgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvSW5jbHVkZS50aHJpZnQKKyAgICBERVBFTkRTICR7aHNfdGVzdF9nZW5fc291cmNlc30KKykKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocyBiL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGY2YTAzMWMuLmZiMjg5NjMKLS0tIGEvdGVzdC9ocy9EZWJ1Z1Byb3RvVGVzdF9NYWluLmhzCisrKyBiL3Rlc3QvaHMvRGVidWdQcm90b1Rlc3RfTWFpbi5ocwpAQCAtMjQsNyArMjQsOSBAQAogCiBpbXBvcnQgcXVhbGlmaWVkIENvbnRyb2wuRXhjZXB0aW9uCiBpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIERCTAotaW1wb3J0IHF1YWxpZmllZCBNYXliZQoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgogaW1wb3J0IHF1YWxpZmllZCBOZXR3b3JrCiAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CkBAIC02MSw2MSArNjMsNjEgQEAKICAgICBzdHJ1Y3RNZXRob2QgXyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgIkdvdCBzdHJ1Y3RNZXRob2QgY2FsbCIKICAgICAgICAgcmV0dXJuICQgVHlwZXMuQ29tcGFjdFByb3RvVGVzdFN0cnVjdCB7Ci0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9ieXRlID0gSnVzdCAweDAxLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTE2ID0gSnVzdCAweDAyLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTMyID0gSnVzdCAweDAzLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTY0ID0gSnVzdCAweDA0LAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfZG91YmxlID0gSnVzdCAwLjEsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9zdHJpbmcgPSBKdXN0ICJhYmNkZWYiLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYmluYXJ5ID0gSnVzdCBEQkwuZW1wdHksCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfdHJ1ZV9maWVsZCA9IEp1c3QgVHJ1ZSwKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9mYWxzZV9maWVsZCA9IEp1c3QgRmFsc2UsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZW1wdHlfc3RydWN0X2ZpZWxkID0gSnVzdCBUeXBlcy5FbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9ieXRlID0gMHgwMSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9pMTYgPSAweDAyLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9hX2kzMiA9IDB4MDMsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfaTY0ID0gMHgwNCwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYV9kb3VibGUgPSAwLjEsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Ffc3RyaW5nID0gImFiY2RlZiIsCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2FfYmluYXJ5ID0gREJMLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF90cnVlX2ZpZWxkID0gVHJ1ZSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZmFsc2VfZmllbGQgPSBGYWxzZSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZW1wdHlfc3RydWN0X2ZpZWxkID0gVHlwZXMuRW1wdHksCiAgICAgICAgICAgICAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9saXN0ID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2xpc3QgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fbGlzdCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RydWN0X2xpc3QgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2kxNl9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2RvdWJsZV9saXN0ID0gVmVjdG9yLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2xpc3QgPSBWZWN0b3IuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2Jvb2xlYW5fbGlzdCA9IFZlY3Rvci5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RydWN0X2xpc3QgPSBWZWN0b3IuZW1wdHksCiAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTMyX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc3RyaW5nX3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X3NldCA9IFNldC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9zZXQgPSBTZXQuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cnVjdF9zZXQgPSBTZXQuZW1wdHksCiAKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMTZfYnl0ZV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2kzMl9ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTY0X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9kb3VibGVfYnl0ZV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X3N0cmluZ19ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYmluYXJ5X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ib29sZWFuX2J5dGVfbWFwID0gTm90aGluZywKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfaTE2X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9pMzJfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2k2NF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfZG91YmxlX2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zdHJpbmdfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2JpbmFyeV9ieXRlX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYm9vbGVhbl9ieXRlX21hcCA9IE1hcC5lbXB0eSwKIAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTE2X21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pMzJfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2k2NF9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfZG91YmxlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zdHJpbmdfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2JpbmFyeV9tYXAgPSBOb3RoaW5nLAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfYm9vbGVhbl9tYXAgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2kxNl9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfaTMyX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9pNjRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2RvdWJsZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfc3RyaW5nX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9iaW5hcnlfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2Jvb2xlYW5fbWFwID0gTWFwLmVtcHR5LAogCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfbGlzdF9ieXRlX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Rfc2V0X2J5dGVfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9tYXBfYnl0ZV9tYXAgPSBOb3RoaW5nLAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9saXN0X2J5dGVfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9zZXRfYnl0ZV9tYXAgPSBNYXAuZW1wdHksCisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X21hcF9ieXRlX21hcCA9IE1hcC5lbXB0eSwKIAotICAgICAgICAgICAgVHlwZXMuZl9Db21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE5vdGhpbmcsCi0gICAgICAgICAgICBUeXBlcy5mX0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTm90aGluZywKLSAgICAgICAgICAgIFR5cGVzLmZfQ29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTm90aGluZyB9CisgICAgICAgICAgICBUeXBlcy5jb21wYWN0UHJvdG9UZXN0U3RydWN0X2J5dGVfbWFwX21hcCA9IE1hcC5lbXB0eSwKKyAgICAgICAgICAgIFR5cGVzLmNvbXBhY3RQcm90b1Rlc3RTdHJ1Y3RfYnl0ZV9zZXRfbWFwID0gTWFwLmVtcHR5LAorICAgICAgICAgICAgVHlwZXMuY29tcGFjdFByb3RvVGVzdFN0cnVjdF9ieXRlX2xpc3RfbWFwID0gTWFwLmVtcHR5IH0KIAogICAgIG1ldGhvZFdpdGhEZWZhdWx0QXJncyBfIGFyZyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IG1ldGhvZFdpdGhEZWZhdWx0QXJnczogIiArKyBzaG93IGFyZwpAQCAtMTI3LDcgKzEyOSw3IEBACiBpbnN0YW5jZSBJSWZhY2UuSW5oZXJpdGVkX0lmYWNlIEluaGVyaXRlZEhhbmRsZXIgd2hlcmUKICAgICBpZGVudGl0eSBfIGFyZyA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCAiR290IGlkZW50aXR5IG1ldGhvZDogIiArKyBzaG93IGFyZwotICAgICAgICByZXR1cm4gJCBNYXliZS5mcm9tSnVzdCBhcmcKKyAgICAgICAgcmV0dXJuIGFyZwogCiBjbGllbnQgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCiBjbGllbnQgYWRkciA9IGRvCmRpZmYgLS1naXQgYS90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocyBiL3Rlc3QvaHMvSW5jbHVkZV9NYWluLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzOTc3YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL0luY2x1ZGVfTWFpbi5ocwpAQCAtMCwwICsxLDcgQEAKK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBJbmNsdWRlX1R5cGVzCitpbXBvcnQgVGhyaWZ0VGVzdF9UeXBlcworCittYWluIDo6IElPICgpCittYWluID0gcHV0U3RyTG4gKCJJbmNsdWRlcyB3b3JrOiAiICsrIChzaG93IChJbmNsdWRlVGVzdCAkIEJvb2xzIFRydWUgRmFsc2UpKSkKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0gYi90ZXN0L2hzL01ha2VmaWxlLmFtCmluZGV4IGQ2ZDhmZjQuLjE3NDg5MDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9ocy9NYWtlZmlsZS5hbQpAQCAtMTcsMTQgKzE3LDI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotc3R1YnM6IC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdAorc3R1YnM6ICQoVEhSSUZUKSAuLi9Db25zdGFudHNEZW1vLnRocmlmdCAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQgLi4vSW5jbHVkZS50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vQ29uc3RhbnRzRGVtby50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaHMgLi4vRGVidWdQcm90b1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGhzIC4uL0luY2x1ZGUudGhyaWZ0CiAKIGNoZWNrOiBzdHVicwogCXNoIHJ1bi10ZXN0LnNoIENvbnN0YW50c0RlbW8KIAlzaCBydW4tdGVzdC5zaCBEZWJ1Z1Byb3RvVGVzdAogCXNoIHJ1bi10ZXN0LnNoIFRocmlmdFRlc3QKKwlzaCBydW4tdGVzdC5zaCBJbmNsdWRlCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1ocworCSQoUk0pICouaGkKKwkkKFJNKSAqLm8KKworYWxsLWxvY2FsOiBzdHVicworCWdoYyAtaWdlbi1ocyBUZXN0U2VydmVyLmhzCisJZ2hjIC1pZ2VuLWhzIFRlc3RDbGllbnQuaHMKKworcHJlY3Jvc3M6IGFsbC1sb2NhbApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0Q2xpZW50LmhzIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZmI1OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKQEAgLTAsMCArMSwzMDYgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MsIFJlY29yZFdpbGRDYXJkcywgU2NvcGVkVHlwZVZhcmlhYmxlcyAjLX0KK21vZHVsZSBNYWluIHdoZXJlCisKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbgoraW1wb3J0IENvbnRyb2wuTW9uYWQKK2ltcG9ydCBEYXRhLkZ1bmN0b3IKK2ltcG9ydCBEYXRhLkxpc3QuU3BsaXQKK2ltcG9ydCBEYXRhLlN0cmluZworaW1wb3J0IE5ldHdvcmsKK2ltcG9ydCBOZXR3b3JrLlVSSQoraW1wb3J0IFN5c3RlbS5FbnZpcm9ubWVudAoraW1wb3J0IFN5c3RlbS5FeGl0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hNYXAuU3RyaWN0IGFzIE1hcAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkhhc2hTZXQgYXMgU2V0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgoraW1wb3J0IHF1YWxpZmllZCBTeXN0ZW0uSU8gYXMgSU8KKworaW1wb3J0IFRocmlmdFRlc3RfSWZhY2UKK2ltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCitpbXBvcnQgcXVhbGlmaWVkIFRocmlmdFRlc3RfQ2xpZW50IGFzIENsaWVudAorCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuRnJhbWVkCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Lkh0dHBDbGllbnQKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KKworZGF0YSBPcHRpb25zID0gT3B0aW9ucworICB7IGhvc3QgICAgICAgICA6OiBTdHJpbmcKKyAgLCBwb3J0ICAgICAgICAgOjogSW50CisgICwgZG9tYWluU29ja2V0IDo6IFN0cmluZworICAsIHRyYW5zcG9ydCAgICA6OiBTdHJpbmcKKyAgLCBwcm90b2NvbCAgICAgOjogUHJvdG9jb2xUeXBlCisgIC0tIFRPRE86IEhhc2tlbGwgbGliIGRvZXMgbm90IGhhdmUgU1NMIHN1cHBvcnQKKyAgLCBzc2wgICAgICAgICAgOjogQm9vbAorICAsIHRlc3RMb29wcyAgICA6OiBJbnQKKyAgfQorICBkZXJpdmluZyAoU2hvdywgRXEpCisKK2RhdGEgVHJhbnNwb3J0VHlwZSA9IEJ1ZmZlcmVkIElPLkhhbmRsZQorICAgICAgICAgICAgICAgICAgIHwgRnJhbWVkIChGcmFtZWRUcmFuc3BvcnQgSU8uSGFuZGxlKQorICAgICAgICAgICAgICAgICAgIHwgSHR0cCBIdHRwQ2xpZW50CisgICAgICAgICAgICAgICAgICAgfCBOb1RyYW5zcG9ydCBTdHJpbmcKKworZ2V0VHJhbnNwb3J0IDo6IFN0cmluZyAtPiBTdHJpbmcgLT4gSW50IC0+IChJTyBUcmFuc3BvcnRUeXBlKQorZ2V0VHJhbnNwb3J0ICJidWZmZXJlZCIgaG9zdCBwb3J0ID0gZG8KKyAgaCA8LSBoT3BlbiAoaG9zdCwgUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQorICBJTy5oU2V0QnVmZmVyaW5nIGggJCBJTy5CbG9ja0J1ZmZlcmluZyBOb3RoaW5nCisgIHJldHVybiAkIEJ1ZmZlcmVkIGgKK2dldFRyYW5zcG9ydCAiZnJhbWVkIiBob3N0IHBvcnQgPSBkbworICBoIDwtIGhPcGVuIChob3N0LCBQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCisgIHQgPC0gb3BlbkZyYW1lZFRyYW5zcG9ydCBoCisgIHJldHVybiAkIEZyYW1lZCB0CitnZXRUcmFuc3BvcnQgImh0dHAiIGhvc3QgcG9ydCA9IGxldCB1cmlTdHIgPSAiaHR0cDovLyIgKysgaG9zdCArKyAiOiIgKysgc2hvdyBwb3J0IGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgcGFyc2VVUkkgdXJpU3RyIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aGluZyAtPiBkbyByZXR1cm4gKE5vVHJhbnNwb3J0ICQgIkZhaWxlZCB0byBwYXJzZSBVUkk6ICIgKysgdXJpU3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1c3QodXJpKSAtPiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA8LSBvcGVuSHR0cENsaWVudCB1cmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkIEh0dHAgdAorZ2V0VHJhbnNwb3J0IHQgaG9zdCBwb3J0ID0gZG8gcmV0dXJuIChOb1RyYW5zcG9ydCAkICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQ6ICIgKysgdCkKKworZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKKyAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAorICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgorICAgICAgICAgICAgICAgICAgZGVyaXZpbmcgKFNob3csIEVxKQorCitnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCitnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKK2dldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKK2dldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiID0gSGVhZGVyCitnZXRQcm90b2NvbCBwID0gZXJyb3IgJCAiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAorCitkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCitkZWZhdWx0T3B0aW9ucyA9IE9wdGlvbnMKKyAgeyBwb3J0ICAgICAgICAgPSA5MDkwCisgICwgZG9tYWluU29ja2V0ID0gIiIKKyAgLCBob3N0ICAgICAgICAgPSAibG9jYWxob3N0IgorICAsIHRyYW5zcG9ydCAgICA9ICJidWZmZXJlZCIKKyAgLCBwcm90b2NvbCAgICAgPSBCaW5hcnkKKyAgLCBzc2wgICAgICAgICAgPSBGYWxzZQorICAsIHRlc3RMb29wcyAgICA9IDEKKyAgfQorCitydW5DbGllbnQgOjogUHJvdG9jb2wgcCA9PiBwIC0+IElPICgpCitydW5DbGllbnQgcCA9IGRvCisgIGxldCBwcm90ID0gKHAscCkKKyAgcHV0U3RyTG4gIlN0YXJ0aW5nIFRlc3RzIgorCisgIC0tIFZPSUQgVGVzdAorICBwdXRTdHJMbiAidGVzdFZvaWQiCisgIENsaWVudC50ZXN0Vm9pZCBwcm90CisKKyAgLS0gU3RyaW5nIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RTdHJpbmciCisgIHMgPC0gQ2xpZW50LnRlc3RTdHJpbmcgcHJvdCAiVGVzdCIKKyAgd2hlbiAocyAvPSAiVGVzdCIpIGV4aXRGYWlsdXJlCisKKyAgLS0gQm9vbCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0Qm9vbCIKKyAgYm9vbCA8LSBDbGllbnQudGVzdEJvb2wgcHJvdCBUcnVlCisgIHdoZW4gKG5vdCBib29sKSBleGl0RmFpbHVyZQorICBwdXRTdHJMbiAidGVzdEJvb2wiCisgIGJvb2wgPC0gQ2xpZW50LnRlc3RCb29sIHByb3QgRmFsc2UKKyAgd2hlbiAoYm9vbCkgZXhpdEZhaWx1cmUKKworICAtLSBCeXRlIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RCeXRlIgorICBieXRlIDwtIENsaWVudC50ZXN0Qnl0ZSBwcm90IDEKKyAgd2hlbiAoYnl0ZSAvPSAxKSBleGl0RmFpbHVyZQorCisgIC0tIEkzMiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0STMyIgorICBpMzIgPC0gQ2xpZW50LnRlc3RJMzIgcHJvdCAoLTEpCisgIHdoZW4gKGkzMiAvPSAtMSkgZXhpdEZhaWx1cmUKKworICAtLSBJNjQgVGVzdAorICBwdXRTdHJMbiAidGVzdEk2NCIKKyAgaTY0IDwtIENsaWVudC50ZXN0STY0IHByb3QgKC0zNDM1OTczODM2OCkKKyAgd2hlbiAoaTY0IC89IC0zNDM1OTczODM2OCkgZXhpdEZhaWx1cmUKKworICAtLSBEb3VibGUgVGVzdAorICBwdXRTdHJMbiAidGVzdERvdWJsZSIKKyAgZHViIDwtIENsaWVudC50ZXN0RG91YmxlIHByb3QgKC01LjIwOTg1MjMpCisgIHdoZW4gKGFicyAoZHViICsgNS4yMDk4NTIzKSA+IDAuMDAxKSBleGl0RmFpbHVyZQorCisgIC0tIEJpbmFyeSBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0QmluYXJ5IgorICBiaW4gPC0gQ2xpZW50LnRlc3RCaW5hcnkgcHJvdCAoTEJTLnBhY2sgLiByZXZlcnNlICQgWy0xMjguLjEyN10pCisgIHdoZW4gKChyZXZlcnNlIFstMTI4Li4xMjddKSAvPSBMQlMudW5wYWNrIGJpbikgZXhpdEZhaWx1cmUKKyAgCisgIC0tIFN0cnVjdCBUZXN0CisgIGxldCBzdHJ1Y3RJbiA9IFh0cnVjdHsgeHRydWN0X3N0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICAgICAgICAgICAgICAgICAsIHh0cnVjdF9ieXRlX3RoaW5nICAgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2kzMl90aGluZyAgICA9IC0zCisgICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0X2k2NF90aGluZyAgICA9IC01CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgcHV0U3RyTG4gInRlc3RTdHJ1Y3QiCisgIHN0cnVjdE91dCA8LSBDbGllbnQudGVzdFN0cnVjdCBwcm90IHN0cnVjdEluCisgIHdoZW4gKHN0cnVjdEluIC89IHN0cnVjdE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBOZXN0ZWQgU3RydWN0IFRlc3QKKyAgbGV0IG5lc3RJbiA9IFh0cnVjdDJ7IHh0cnVjdDJfYnl0ZV90aGluZyAgID0gMQorICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0Ml9zdHJ1Y3RfdGhpbmcgPSBzdHJ1Y3RJbgorICAgICAgICAgICAgICAgICAgICAgICwgeHRydWN0Ml9pMzJfdGhpbmcgICAgPSA1CisgICAgICAgICAgICAgICAgICAgICAgfQorICBwdXRTdHJMbiAidGVzdE5lc3QiCisgIG5lc3RPdXQgPC0gQ2xpZW50LnRlc3ROZXN0IHByb3QgbmVzdEluCisgIHdoZW4gKG5lc3RJbiAvPSBuZXN0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIE1hcCBUZXN0CisgIGxldCBtYXBJbiA9IE1hcC5mcm9tTGlzdCAkIG1hcCAoXGkgLT4gKGksIGktMTApKSBbMS4uNV0KKyAgcHV0U3RyTG4gInRlc3RNYXAiCisgIG1hcE91dCA8LSBDbGllbnQudGVzdE1hcCBwcm90IG1hcEluCisgIHdoZW4gKG1hcEluIC89IG1hcE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBTZXQgVGVzdAorICBsZXQgc2V0SW4gPSBTZXQuZnJvbUxpc3QgWy0yLi4zXQorICBwdXRTdHJMbiAidGVzdFNldCIKKyAgc2V0T3V0IDwtIENsaWVudC50ZXN0U2V0IHByb3Qgc2V0SW4KKyAgd2hlbiAoc2V0SW4gLz0gc2V0T3V0KSBleGl0RmFpbHVyZQorCisgIC0tIExpc3QgVGVzdAorICBsZXQgbGlzdEluID0gVmVjdG9yLmZyb21MaXN0IFstMi4uM10KKyAgcHV0U3RyTG4gInRlc3RMaXN0IgorICBsaXN0T3V0IDwtIENsaWVudC50ZXN0TGlzdCBwcm90IGxpc3RJbgorICB3aGVuIChsaXN0SW4gLz0gbGlzdE91dCkgZXhpdEZhaWx1cmUKKworICAtLSBFbnVtIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RFbnVtIgorICBudW16MSA8LSBDbGllbnQudGVzdEVudW0gcHJvdCBPTkUKKyAgd2hlbiAobnVtejEgLz0gT05FKSBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0RW51bSIKKyAgbnVtejIgPC0gQ2xpZW50LnRlc3RFbnVtIHByb3QgVFdPCisgIHdoZW4gKG51bXoyIC89IFRXTykgZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEVudW0iCisgIG51bXo1IDwtIENsaWVudC50ZXN0RW51bSBwcm90IEZJVkUKKyAgd2hlbiAobnVtejUgLz0gRklWRSkgZXhpdEZhaWx1cmUKKworICAtLSBUeXBlZGVmIFRlc3QKKyAgcHV0U3RyTG4gInRlc3RUeXBlZGVmIgorICB1aWQgPC0gQ2xpZW50LnRlc3RUeXBlZGVmIHByb3QgMzA5ODU4MjM1MDgyNTIzCisgIHdoZW4gKHVpZCAvPSAzMDk4NTgyMzUwODI1MjMpIGV4aXRGYWlsdXJlCisKKyAgLS0gTmVzdGVkIE1hcCBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0TWFwTWFwIgorICBfIDwtIENsaWVudC50ZXN0TWFwTWFwIHByb3QgMQorCisgIC0tIEV4Y2VwdGlvbiBUZXN0CisgIHB1dFN0ckxuICJ0ZXN0RXhjZXB0aW9uIgorICBleG4xIDwtIHRyeSAkIENsaWVudC50ZXN0RXhjZXB0aW9uIHByb3QgIlhjZXB0aW9uIgorICBjYXNlIGV4bjEgb2YKKyAgICBMZWZ0IChYY2VwdGlvbiBfIF8pIC0+IHJldHVybiAoKQorICAgIF8gLT4gcHV0U3RyTG4gKHNob3cgZXhuMSkgPj4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKKyAgZXhuMiA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJURXhjZXB0aW9uIgorICBjYXNlIGV4bjIgb2YKKyAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IHJldHVybiAoKQorICAgIFJpZ2h0IF8gLT4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdEV4Y2VwdGlvbiIKKyAgZXhuMyA8LSB0cnkgJCBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcm90ICJzdWNjZXNzIgorICBjYXNlIGV4bjMgb2YKKyAgICBMZWZ0IChfIDo6IFNvbWVFeGNlcHRpb24pIC0+IGV4aXRGYWlsdXJlCisgICAgUmlnaHQgXyAtPiByZXR1cm4gKCkKKworICAtLSBNdWx0aSBFeGNlcHRpb24gVGVzdAorICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgorICBtdWx0aTEgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbiIgInRlc3QgMSIKKyAgY2FzZSBtdWx0aTEgb2YKKyAgICBMZWZ0IChYY2VwdGlvbiBfIF8pIC0+IHJldHVybiAoKQorICAgIF8gLT4gZXhpdEZhaWx1cmUKKworICBwdXRTdHJMbiAidGVzdE11bHRpRXhjZXB0aW9uIgorICBtdWx0aTIgPC0gdHJ5ICQgQ2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbiBwcm90ICJYY2VwdGlvbjIiICJ0ZXN0IDIiCisgIGNhc2UgbXVsdGkyIG9mCisgICAgTGVmdCAoWGNlcHRpb24yIF8gXykgLT4gcmV0dXJuICgpCisgICAgXyAtPiBleGl0RmFpbHVyZQorCisgIHB1dFN0ckxuICJ0ZXN0TXVsdGlFeGNlcHRpb24iCisgIG11bHRpMyA8LSB0cnkgJCBDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uIHByb3QgInN1Y2Nlc3MiICJ0ZXN0IDMiCisgIGNhc2UgbXVsdGkzIG9mCisgICAgTGVmdCAoXyA6OiBTb21lRXhjZXB0aW9uKSAtPiBleGl0RmFpbHVyZQorICAgIFJpZ2h0IF8gLT4gcmV0dXJuICgpCisKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGRvCisgIG9wdGlvbnMgPC0gZmxpcCBwYXJzZUZsYWdzIGRlZmF1bHRPcHRpb25zIDwkPiBnZXRBcmdzCisgIGNhc2Ugb3B0aW9ucyBvZgorICAgIE5vdGhpbmcgLT4gc2hvd0hlbHAKKyAgICBKdXN0IE9wdGlvbnN7Li59IC0+IGRvCisgICAgICB0cmFucyA8LSBNYWluLmdldFRyYW5zcG9ydCB0cmFuc3BvcnQgaG9zdCBwb3J0CisgICAgICBjYXNlIHRyYW5zIG9mCisgICAgICAgIEJ1ZmZlcmVkIHQgLT4gcnVuVGVzdCB0ZXN0TG9vcHMgcHJvdG9jb2wgdAorICAgICAgICBGcmFtZWQgdCAgIC0+IHJ1blRlc3QgdGVzdExvb3BzIHByb3RvY29sIHQKKyAgICAgICAgSHR0cCB0ICAgICAtPiBydW5UZXN0IHRlc3RMb29wcyBwcm90b2NvbCB0CisgICAgICAgIE5vVHJhbnNwb3J0IGVyciAtPiBwdXRTdHJMbiBlcnIKKyAgd2hlcmUKKyAgICBtYWtlQ2xpZW50IHAgdCA9IGNhc2UgcCBvZgorICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnkgIC0+IHJ1bkNsaWVudCAkIEJpbmFyeVByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdCAtPiBydW5DbGllbnQgJCBDb21wYWN0UHJvdG9jb2wgdAorICAgICAgICAgICAgICAgICAgICAgICBKU09OICAgIC0+IHJ1bkNsaWVudCAkIEpTT05Qcm90b2NvbCB0CisgICAgICAgICAgICAgICAgICAgICAgIEhlYWRlciAgLT4gY3JlYXRlSGVhZGVyUHJvdG9jb2wgdCB0ID4+PSBydW5DbGllbnQKKyAgICBydW5UZXN0IGxvb3BzIHAgdCA9IGRvCisgICAgICBsZXQgY2xpZW50ID0gbWFrZUNsaWVudCBwIHQKKyAgICAgIHJlcGxpY2F0ZU1fIGxvb3BzIGNsaWVudAorICAgICAgcHV0U3RyTG4gIkNPTVBMRVRFRCBTVUNDRVNTRlVMTFkiCisKK3BhcnNlRmxhZ3MgOjogW1N0cmluZ10gLT4gT3B0aW9ucyAtPiBNYXliZSBPcHRpb25zCitwYXJzZUZsYWdzIChmbGFnIDogZmxhZ3MpIG9wdHMgPSBkbworICBsZXQgcGllY2VzID0gc3BsaXRPbiAiPSIgZmxhZworICBjYXNlIHBpZWNlcyBvZgorICAgICItLXBvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHBvcnQgPSByZWFkIGFyZyB9CisgICAgIi0tZG9tYWluLXNvY2tldCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgZG9tYWluU29ja2V0ID0gcmVhZCBhcmcgfQorICAgICItLWhvc3QiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IGhvc3QgPSBhcmcgfQorICAgICItLXRyYW5zcG9ydCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgdHJhbnNwb3J0ID0gYXJnIH0KKyAgICAiLS1wcm90b2NvbCIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCBhcmcgfQorICAgICItbiIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgdGVzdExvb3BzID0gcmVhZCBhcmcgfQorICAgICItLWgiIDogXyAtPiBOb3RoaW5nCisgICAgIi0taGVscCIgOiBfIC0+IE5vdGhpbmcKKyAgICAiLS1zc2wiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHNzbCA9IFRydWUgfQorICAgICItLXByb2Nlc3Nvci1ldmVudHMiIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHMKKyAgICBfIC0+IE5vdGhpbmcKK3BhcnNlRmxhZ3MgW10gb3B0cyA9IEp1c3Qgb3B0cworCitzaG93SGVscCA6OiBJTyAoKQorc2hvd0hlbHAgPSBwdXRTdHJMbgorICAiQWxsb3dlZCBvcHRpb25zOlxuXAorICBcICAtaCBbIC0taGVscCBdICAgICAgICAgICAgICAgcHJvZHVjZSBoZWxwIG1lc3NhZ2VcblwKKyAgXCAgLS1ob3N0IGFyZyAoPWxvY2FsaG9zdCkgICAgIEhvc3QgdG8gY29ubmVjdFxuXAorICBcICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gY29ubmVjdFxuXAorICBcICAtLWRvbWFpbi1zb2NrZXQgYXJnICAgICAgICAgRG9tYWluIFNvY2tldCAoZS5nLiAvdG1wL1RocmlmdFRlc3QudGhyaWZ0KSxcblwKKyAgXCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaG9zdCBhbmQgcG9ydFxuXAorICBcICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwXG5cCisgIFwgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG5cCisgIFwgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuXAorICBcICAtbiBbIC0tdGVzdGxvb3BzIF0gYXJnICg9MSkgTnVtYmVyIG9mIFRlc3RzIgpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9UZXN0U2VydmVyLmhzIGIvdGVzdC9ocy9UZXN0U2VydmVyLmhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NzMxYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKQEAgLTAsMCArMSwzMTIgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCit7LSMgTEFOR1VBR0UgT3ZlcmxvYWRlZFN0cmluZ3MsUmVjb3JkV2lsZENhcmRzICMtfQorbW9kdWxlIE1haW4gd2hlcmUKKworaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCitpbXBvcnQgQ29udHJvbC5Nb25hZAoraW1wb3J0IERhdGEuRnVuY3RvcgoraW1wb3J0IERhdGEuSGFzaE1hcC5TdHJpY3QgKEhhc2hNYXApCitpbXBvcnQgRGF0YS5MaXN0CitpbXBvcnQgRGF0YS5MaXN0LlNwbGl0CitpbXBvcnQgRGF0YS5TdHJpbmcKK2ltcG9ydCBOZXR3b3JrCitpbXBvcnQgU3lzdGVtLkVudmlyb25tZW50CitpbXBvcnQgU3lzdGVtLkV4aXQKK2ltcG9ydCBTeXN0ZW0uSU8KK2ltcG9ydCBDb250cm9sLkNvbmN1cnJlbnQgKHRocmVhZERlbGF5KQoraW1wb3J0IHF1YWxpZmllZCBTeXN0ZW0uSU8gYXMgSU8KK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoU2V0IGFzIFNldAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLlRleHQuTGF6eSBhcyBUZXh0CitpbXBvcnQgcXVhbGlmaWVkIERhdGEuVmVjdG9yIGFzIFZlY3RvcgorCitpbXBvcnQgVGhyaWZ0VGVzdAoraW1wb3J0IFRocmlmdFRlc3RfSWZhY2UKK2ltcG9ydCBUaHJpZnRUZXN0X1R5cGVzCisKK2ltcG9ydCBUaHJpZnQKK2ltcG9ydCBUaHJpZnQuU2VydmVyCitpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhhbmRsZQoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5Qcm90b2NvbC5IZWFkZXIKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuSlNPTgorCitkYXRhIE9wdGlvbnMgPSBPcHRpb25zCisgIHsgcG9ydCAgICAgICAgIDo6IEludAorICAsIGRvbWFpblNvY2tldCA6OiBTdHJpbmcKKyAgLCBzZXJ2ZXJUeXBlICAgOjogU2VydmVyVHlwZQorICAsIHRyYW5zcG9ydCAgICA6OiBTdHJpbmcKKyAgLCBwcm90b2NvbCAgICAgOjogUHJvdG9jb2xUeXBlCisgICwgc3NsICAgICAgICAgIDo6IEJvb2wKKyAgLCB3b3JrZXJzICAgICAgOjogSW50CisgIH0KKworZGF0YSBTZXJ2ZXJUeXBlID0gU2ltcGxlCisgICAgICAgICAgICAgICAgfCBUaHJlYWRQb29sCisgICAgICAgICAgICAgICAgfCBUaHJlYWRlZAorICAgICAgICAgICAgICAgIHwgTm9uQmxvY2tpbmcKKyAgICAgICAgICAgICAgICBkZXJpdmluZyAoU2hvdywgRXEpCisKK2luc3RhbmNlIElzU3RyaW5nIFNlcnZlclR5cGUgd2hlcmUKKyAgZnJvbVN0cmluZyAic2ltcGxlIiAgICAgID0gU2ltcGxlCisgIGZyb21TdHJpbmcgInRocmVhZC1wb29sIiA9IFRocmVhZFBvb2wKKyAgZnJvbVN0cmluZyAidGhyZWFkZWQiICAgID0gVGhyZWFkZWQKKyAgZnJvbVN0cmluZyAibm9uYmxvY2tpbmciID0gTm9uQmxvY2tpbmcKKyAgZnJvbVN0cmluZyBfID0gZXJyb3IgIm5vdCBhIHZhbGlkIHNlcnZlciB0eXBlIgorCitkYXRhIFRyYW5zcG9ydFR5cGUgPSBCdWZmZXJlZCAoU29ja2V0IC0+IChJTyBJTy5IYW5kbGUpKQorICAgICAgICAgICAgICAgICAgIHwgRnJhbWVkIChTb2NrZXQgLT4gKElPIChGcmFtZWRUcmFuc3BvcnQgSU8uSGFuZGxlKSkpCisgICAgICAgICAgICAgICAgICAgfCBOb1RyYW5zcG9ydCBTdHJpbmcKKworZ2V0VHJhbnNwb3J0IDo6IFN0cmluZyAtPiBUcmFuc3BvcnRUeXBlCitnZXRUcmFuc3BvcnQgImJ1ZmZlcmVkIiA9IEJ1ZmZlcmVkICQgXHMgLT4gZG8KKyAgKGgsIF8sIF8pIDwtIChhY2NlcHQgcykKKyAgSU8uaFNldEJ1ZmZlcmluZyBoICQgSU8uQmxvY2tCdWZmZXJpbmcgTm90aGluZworICByZXR1cm4gaAorZ2V0VHJhbnNwb3J0ICJmcmFtZWQiID0gRnJhbWVkICQgXHMgLT4gZG8KKyAgKGgsIF8sIF8pIDwtIChhY2NlcHQgcykKKyAgb3BlbkZyYW1lZFRyYW5zcG9ydCBoCitnZXRUcmFuc3BvcnQgdCA9IE5vVHJhbnNwb3J0ICQgIlVuc3VwcG9ydGVkIHRyYW5zcG9ydDogIiArKyB0CisKK2RhdGEgUHJvdG9jb2xUeXBlID0gQmluYXJ5CisgICAgICAgICAgICAgICAgICB8IENvbXBhY3QKKyAgICAgICAgICAgICAgICAgIHwgSlNPTgorICAgICAgICAgICAgICAgICAgfCBIZWFkZXIKKworZ2V0UHJvdG9jb2wgOjogU3RyaW5nIC0+IFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2wgImJpbmFyeSIgID0gQmluYXJ5CitnZXRQcm90b2NvbCAiY29tcGFjdCIgPSBDb21wYWN0CitnZXRQcm90b2NvbCAianNvbiIgICAgPSBKU09OCitnZXRQcm90b2NvbCAiaGVhZGVyIiAgPSBIZWFkZXIKK2dldFByb3RvY29sIHAgPSBlcnJvciAkIlVuc3VwcG9ydGVkIFByb3RvY29sOiAiICsrIHAKKworZGVmYXVsdE9wdGlvbnMgOjogT3B0aW9ucworZGVmYXVsdE9wdGlvbnMgPSBPcHRpb25zCisgIHsgcG9ydCAgICAgICAgID0gOTA5MAorICAsIGRvbWFpblNvY2tldCA9ICIiCisgICwgc2VydmVyVHlwZSAgID0gVGhyZWFkZWQKKyAgLCB0cmFuc3BvcnQgICAgPSAiYnVmZmVyZWQiCisgICwgcHJvdG9jb2wgICAgID0gQmluYXJ5CisgIC0tIFRPRE86IEhhc2tlbGwgbGliIGRvZXMgbm90IGhhdmUgU1NMIHN1cHBvcnQKKyAgLCBzc2wgICAgICAgICAgPSBGYWxzZQorICAsIHdvcmtlcnMgICAgICA9IDQKKyAgfQorCitzdHJpbmdpZnlNYXAgOjogKFNob3cgYSwgU2hvdyBiKSA9PiBNYXAuSGFzaE1hcCBhIGIgLT4gU3RyaW5nCitzdHJpbmdpZnlNYXAgPSBEYXRhLkxpc3QuaW50ZXJjYWxhdGUgIiwgIiAuIERhdGEuTGlzdC5tYXAgam9pbktWIC4gTWFwLnRvTGlzdAorICB3aGVyZSBqb2luS1YgKGssIHYpID0gc2hvdyBrICsrICIgPT4gIiArKyBzaG93IHYKKworc3RyaW5naWZ5U2V0IDo6IFNob3cgYSA9PiBTZXQuSGFzaFNldCBhIC0+IFN0cmluZworc3RyaW5naWZ5U2V0ID0gRGF0YS5MaXN0LmludGVyY2FsYXRlICIsICIgLiBEYXRhLkxpc3QubWFwIHNob3cgLiBTZXQudG9MaXN0CisKK3N0cmluZ2lmeUxpc3QgOjogU2hvdyBhID0+IFZlY3Rvci5WZWN0b3IgYSAtPiBTdHJpbmcKK3N0cmluZ2lmeUxpc3QgPSBEYXRhLkxpc3QuaW50ZXJjYWxhdGUgIiwgIiAuIERhdGEuTGlzdC5tYXAgc2hvdyAuIFZlY3Rvci50b0xpc3QKKworZGF0YSBUZXN0SGFuZGxlciA9IFRlc3RIYW5kbGVyCitpbnN0YW5jZSBUaHJpZnRUZXN0X0lmYWNlIFRlc3RIYW5kbGVyIHdoZXJlCisgIHRlc3RWb2lkIF8gPSBTeXN0ZW0uSU8ucHV0U3RyTG4gInRlc3RWb2lkKCkiCisKKyAgdGVzdFN0cmluZyBfIHMgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0U3RyaW5nKCIgKysgc2hvdyBzICsrICIpIgorICAgIHJldHVybiBzCisKKyAgdGVzdEJvb2wgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJvb2woIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0Qnl0ZSBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0Qnl0ZSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RJMzIgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEkzMigiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RJNjQgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEk2NCgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3REb3VibGUgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdERvdWJsZSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RCaW5hcnkgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEJpbmFyeSgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RTdHJ1Y3QgXyBzdHJ1Y3RAWHRydWN0ey4ufSA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJ1Y3QoeyIgKysgc2hvdyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIiwgIiArKyBzaG93IHh0cnVjdF9ieXRlX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgKysgIiwgIiArKyBzaG93IHh0cnVjdF9pMzJfdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICArKyAiLCAiICsrIHNob3cgeHRydWN0X2k2NF90aGluZworICAgICAgICAgICAgICAgICAgICAgICsrICJ9KSIKKyAgICByZXR1cm4gc3RydWN0CisKKyAgdGVzdE5lc3QgXyBuZXN0QFh0cnVjdDJ7Li59ID0gZG8KKyAgICBsZXQgWHRydWN0ey4ufSA9IHh0cnVjdDJfc3RydWN0X3RoaW5nCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3ROZXN0KHsiICsrIHNob3cgeHRydWN0Ml9ieXRlX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgInssICIgKysgc2hvdyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgKysgICIsICIgKysgc2hvdyB4dHJ1Y3RfYnl0ZV90aGluZworICAgICAgICAgICAgICAgICAgICsrICAiLCAiICsrIHNob3cgeHRydWN0X2kzMl90aGluZworICAgICAgICAgICAgICAgICAgICsrICAiLCAiICsrIHNob3cgeHRydWN0X2k2NF90aGluZworICAgICAgICAgICAgICAgICAgICsrICJ9LCAiICsrIHNob3cgeHRydWN0Ml9pMzJfdGhpbmcKKyAgICByZXR1cm4gbmVzdAorCisgIHRlc3RNYXAgXyBtID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE1hcCh7IiArKyBzdHJpbmdpZnlNYXAgbSArKyAifSkiCisgICAgcmV0dXJuIG0KKworICB0ZXN0U3RyaW5nTWFwIF8gbSA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTdHJpbmdNYXAoIiArKyBzdHJpbmdpZnlNYXAgbSArKyAifSkiCisgICAgcmV0dXJuIG0KKworICB0ZXN0U2V0IF8geCA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RTZXQoeyIgKysgc3RyaW5naWZ5U2V0IHggKysgIn0pIgorICAgIHJldHVybiB4CisKKyAgdGVzdExpc3QgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdExpc3QoIiArKyBzdHJpbmdpZnlMaXN0IHggKysgIn0pIgorICAgIHJldHVybiB4CisKKyAgdGVzdEVudW0gXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdEVudW0oIiArKyBzaG93IHggKysgIikiCisgICAgcmV0dXJuIHgKKworICB0ZXN0VHlwZWRlZiBfIHggPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0VHlwZWRlZigiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4geAorCisgIHRlc3RNYXBNYXAgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE1hcE1hcCgiICsrIHNob3cgeCArKyAiKSIKKyAgICByZXR1cm4gJCBNYXAuZnJvbUxpc3QgWyAoLTQsIE1hcC5mcm9tTGlzdCBbICgtNCwgLTQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoLTMsIC0zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKC0yLCAtMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICgtMSwgLTEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoNCwgIE1hcC5mcm9tTGlzdCBbICgxLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDIsIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAoMywgMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICg0LCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKworICB0ZXN0SW5zYW5pdHkgXyB4ID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gInRlc3RJbnNhbml0eSgpIgorICAgIHJldHVybiAkIE1hcC5mcm9tTGlzdCBbICgxLCBNYXAuZnJvbUxpc3QgWyAoVFdPICAsIHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIChUSFJFRSwgeCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICwgKDIsIE1hcC5mcm9tTGlzdCBbIChTSVgsIGRlZmF1bHRfSW5zYW5pdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgdGVzdE11bHRpIF8gYnl0ZSBpMzIgaTY0IF8gXyBfID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gInRlc3RNdWx0aSgpIgorICAgIHJldHVybiBYdHJ1Y3R7IHh0cnVjdF9zdHJpbmdfdGhpbmcgPSBUZXh0LnBhY2sgIkhlbGxvMiIKKyAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfYnl0ZV90aGluZyAgID0gYnl0ZQorICAgICAgICAgICAgICAgICAsIHh0cnVjdF9pMzJfdGhpbmcgICAgPSBpMzIKKyAgICAgICAgICAgICAgICAgLCB4dHJ1Y3RfaTY0X3RoaW5nICAgID0gaTY0CisgICAgICAgICAgICAgICAgIH0KKworICB0ZXN0RXhjZXB0aW9uIF8gcyA9IGRvCisgICAgU3lzdGVtLklPLnB1dFN0ckxuICQgInRlc3RFeGNlcHRpb24oIiArKyBzaG93IHMgKysgIikiCisgICAgY2FzZSBzIG9mCisgICAgICAiWGNlcHRpb24iICAgLT4gdGhyb3cgJCBYY2VwdGlvbiAxMDAxIHMKKyAgICAgICJURXhjZXB0aW9uIiAtPiB0aHJvdyBUaHJpZnRFeGNlcHRpb24KKyAgICAgIF8gLT4gcmV0dXJuICgpCisKKyAgdGVzdE11bHRpRXhjZXB0aW9uIF8gczEgczIgPSBkbworICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0TXVsdGlFeGNlcHRpb24oIiArKyBzaG93IHMxICsrICIsICIgKysgc2hvdyBzMiArKyAgIikiCisgICAgY2FzZSBzMSBvZgorICAgICAgIlhjZXB0aW9uIiAgIC0+IHRocm93ICQgWGNlcHRpb24gMTAwMSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAgICJYY2VwdGlvbjIiICAtPiB0aHJvdyAkIFhjZXB0aW9uMiAyMDAyICQgWHRydWN0ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIgMCAwIDAKKyAgICAgICJURXhjZXB0aW9uIiAtPiB0aHJvdyBUaHJpZnRFeGNlcHRpb24KKyAgICAgIF8gLT4gcmV0dXJuIGRlZmF1bHRfWHRydWN0eyB4dHJ1Y3Rfc3RyaW5nX3RoaW5nID0gczIgfQorCisgIHRlc3RPbmV3YXkgXyBpID0gZG8KKyAgICBTeXN0ZW0uSU8ucHV0U3RyTG4gJCAidGVzdE9uZXdheSgiICsrIHNob3cgaSArKyAiKTogU2xlZXBpbmcuLi4iCisgICAgdGhyZWFkRGVsYXkgJCAoZnJvbUludGVncmFsIGkpICogMTAwMDAwMAorICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJ0ZXN0T25ld2F5KCIgKysgc2hvdyBpICsrICIpOiBkb25lIHNsZWVwaW5nISIKKworbWFpbiA6OiBJTyAoKQorbWFpbiA9IGRvCisgIG9wdGlvbnMgPC0gZmxpcCBwYXJzZUZsYWdzIGRlZmF1bHRPcHRpb25zIDwkPiBnZXRBcmdzCisgIGNhc2Ugb3B0aW9ucyBvZgorICAgIE5vdGhpbmcgLT4gc2hvd0hlbHAKKyAgICBKdXN0IE9wdGlvbnN7Li59IC0+IGRvCisgICAgICBjYXNlIE1haW4uZ2V0VHJhbnNwb3J0IHRyYW5zcG9ydCBvZgorICAgICAgICBCdWZmZXJlZCBmIC0+IHJ1blNlcnZlciBwcm90b2NvbCBmIHBvcnQKKyAgICAgICAgRnJhbWVkICAgZiAtPiBydW5TZXJ2ZXIgcHJvdG9jb2wgZiBwb3J0CisgICAgICAgIE5vVHJhbnNwb3J0IGVyciAtPiBwdXRTdHJMbiBlcnIKKyAgICAgIFN5c3RlbS5JTy5wdXRTdHJMbiAkICJTdGFydGluZyBcIiIgKysgc2hvdyBzZXJ2ZXJUeXBlICsrICJcIiBzZXJ2ZXIgKCIgKysKKyAgICAgICAgc2hvdyB0cmFuc3BvcnQgKysgIikgbGlzdGVuIG9uOiAiICsrIGRvbWFpblNvY2tldCArKyBzaG93IHBvcnQKKyAgICAgIHdoZXJlCisgICAgICAgIGFjY2VwdG9yIHAgZiBzb2NrZXQgPSBkbworICAgICAgICAgIHQgPC0gZiBzb2NrZXQKKyAgICAgICAgICByZXR1cm4gKHAgdCwgcCB0KQorCisgICAgICAgIGhlYWRlckFjY2VwdG9yIGYgc29ja2V0ID0gZG8KKyAgICAgICAgICB0IDwtIGYgc29ja2V0CisgICAgICAgICAgcCA8LSBjcmVhdGVIZWFkZXJQcm90b2NvbDEgdAorICAgICAgICAgIHJldHVybiAocCwgcCkKKworICAgICAgICBkb1J1blNlcnZlciBwIGYgPSBkbworICAgICAgICAgIHJ1blRocmVhZGVkU2VydmVyIChhY2NlcHRvciBwIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAuIFBvcnROdW1iZXIgLiBmcm9tSW50ZWdyYWwKKworICAgICAgICBydW5TZXJ2ZXIgcCBmIHBvcnQgPSBjYXNlIHAgb2YKKyAgICAgICAgICBCaW5hcnkgIC0+IGRvUnVuU2VydmVyIEJpbmFyeVByb3RvY29sIGYgcG9ydAorICAgICAgICAgIENvbXBhY3QgLT4gZG9SdW5TZXJ2ZXIgQ29tcGFjdFByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEpTT04gICAgLT4gZG9SdW5TZXJ2ZXIgSlNPTlByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEhlYWRlciAgLT4gcnVuVGhyZWFkZWRTZXJ2ZXIgKGhlYWRlckFjY2VwdG9yIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAoUG9ydE51bWJlciAkIGZyb21JbnRlZ3JhbCBwb3J0KQorCitwYXJzZUZsYWdzIDo6IFtTdHJpbmddIC0+IE9wdGlvbnMgLT4gTWF5YmUgT3B0aW9ucworcGFyc2VGbGFncyAoZmxhZyA6IGZsYWdzKSBvcHRzID0gZG8KKyAgbGV0IHBpZWNlcyA9IHNwbGl0T24gIj0iIGZsYWcKKyAgY2FzZSBwaWVjZXMgb2YKKyAgICAiLS1wb3J0IiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBwb3J0ID0gcmVhZCBhcmcgfQorICAgICItLWRvbWFpbi1zb2NrZXQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IGRvbWFpblNvY2tldCA9IHJlYWQgYXJnIH0KKyAgICAiLS1zZXJ2ZXItdHlwZSIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgc2VydmVyVHlwZSA9IGZyb21TdHJpbmcgYXJnIH0KKyAgICAiLS10cmFuc3BvcnQiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHRyYW5zcG9ydCA9IGFyZyB9CisgICAgIi0tcHJvdG9jb2wiIDogYXJnIDogXyAtPiBwYXJzZUZsYWdzIGZsYWdzIG9wdHN7IHByb3RvY29sID0gZ2V0UHJvdG9jb2wgYXJnIH0KKyAgICAiLS13b3JrZXJzIiA6IGFyZyA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyB3b3JrZXJzID0gcmVhZCBhcmcgfQorICAgICItbiIgOiBhcmcgOiBfIC0+IHBhcnNlRmxhZ3MgZmxhZ3Mgb3B0c3sgd29ya2VycyA9IHJlYWQgYXJnIH0KKyAgICAiLS1oIiA6IF8gLT4gTm90aGluZworICAgICItLWhlbHAiIDogXyAtPiBOb3RoaW5nCisgICAgIi0tc3NsIiA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzeyBzc2wgPSBUcnVlIH0KKyAgICAiLS1wcm9jZXNzb3ItZXZlbnRzIiA6IF8gLT4gcGFyc2VGbGFncyBmbGFncyBvcHRzCisgICAgXyAtPiBOb3RoaW5nCitwYXJzZUZsYWdzIFtdIG9wdHMgPSBKdXN0IG9wdHMKKworc2hvd0hlbHAgOjogSU8gKCkKK3Nob3dIZWxwID0gU3lzdGVtLklPLnB1dFN0ckxuCisgICJBbGxvd2VkIG9wdGlvbnM6XG5cCisgIFwgIC1oIFsgLS1oZWxwIF0gICAgICAgICAgICAgICBwcm9kdWNlIGhlbHAgbWVzc2FnZVxuXAorICBcICAtLXBvcnQgYXJnICg9OTA5MCkgICAgICAgICAgUG9ydCBudW1iZXIgdG8gbGlzdGVuXG5cCisgIFwgIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBVbml4IERvbWFpbiBTb2NrZXQgKGUuZy4gL3RtcC9UaHJpZnRUZXN0LnRocmlmdClcblwKKyAgXCAgLS1zZXJ2ZXItdHlwZSBhcmcgKD1zaW1wbGUpIHR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiLCBcInRocmVhZC1wb29sXCIsXG5cCisgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInRocmVhZGVkXCIsIG9yIFwibm9uYmxvY2tpbmdcIlxuXAorICBcICAtLXRyYW5zcG9ydCBhcmcgKD1idWZmZXJlZCkgdHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkXG5cCisgIFwgIC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSAgICBwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uXG5cCisgIFwgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTFxuXAorICBcICAtLXByb2Nlc3Nvci1ldmVudHMgICAgICAgICAgcHJvY2Vzc29yLWV2ZW50c1xuXAorICBcICAtbiBbIC0td29ya2VycyBdIGFyZyAoPTQpICAgTnVtYmVyIG9mIHRocmVhZCBwb29scyB3b3JrZXJzLiBPbmx5IHZhbGlkIGZvclxuXAorICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1RocmlmdFRlc3RVdGlscy5ocyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCmluZGV4IDkzZmExMjIuLjljMTliNTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCisrKyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdFV0aWxzLmhzCkBAIC02MCw2ICs2MCw2IEBACiAgICAgQ29udHJvbC5Db25jdXJyZW50LnRocmVhZERlbGF5ICQgNTAwICogMTAwMCAtLSB1bml0IGlzIGluIF9taWNyb19zZWNvbmRzCiAgICAgQ29udHJvbC5Db25jdXJyZW50LnlpZWxkCiAKLSAgICBfIDwtIGNsaWVudCBzZXJ2ZXJBZGRyZXNzCisgICAgY2xpZW50IHNlcnZlckFkZHJlc3MKIAogICAgIHRlc3RMb2cgIlNVQ0NFU1MiCmRpZmYgLS1naXQgYS90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocyBiL3Rlc3QvaHMvVGhyaWZ0VGVzdF9NYWluLmhzCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMzYxMjkzNS4uNjcwMDIzZQotLS0gYS90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocworKysgYi90ZXN0L2hzL1RocmlmdFRlc3RfTWFpbi5ocwpAQCAtNDcsMTI0ICs0Nyw4MCBAQAogaW5zdGFuY2UgSWZhY2UuVGhyaWZ0VGVzdF9JZmFjZSBUZXN0SGFuZGxlciB3aGVyZQogICAgIHRlc3RWb2lkIF8gPSByZXR1cm4gKCkKIAotICAgIHRlc3RTdHJpbmcgXyAoSnVzdCBzKSA9IGRvCisgICAgdGVzdFN0cmluZyBfIHMgPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyBzCiAgICAgICAgIHJldHVybiBzCiAKLSAgICB0ZXN0U3RyaW5nIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RTdHJpbmcgZm9ybSIKLQotICAgIHRlc3RCeXRlIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RCeXRlIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RCeXRlIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RCeXRlIGZvcm0iCi0KLSAgICB0ZXN0STMyIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RJMzIgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdEkzMiBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0STMyIGZvcm0iCi0KLSAgICB0ZXN0STY0IF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RJNjQgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdEk2NCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0STY0IGZvcm0iCi0KLSAgICB0ZXN0RG91YmxlIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3REb3VibGUgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdERvdWJsZSBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0RG91YmxlIGZvcm0iCi0KLSAgICB0ZXN0U3RydWN0IF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RCaW5hcnkgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdFN0cnVjdCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0U3RydWN0IGZvcm0iCi0KLSAgICB0ZXN0TmVzdCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0U3RydWN0IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3ROZXN0IF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3ROZXN0IGZvcm0iCi0KLSAgICB0ZXN0TWFwIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3ROZXN0IF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RNYXAgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdE1hcCBmb3JtIgotCi0gICAgdGVzdFN0cmluZ01hcCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0TWFwIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RTdHJpbmdNYXAgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdE1hcCBmb3JtIgotCi0gICAgdGVzdFNldCBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0U3RyaW5nTWFwIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RTZXQgXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdFNldCBmb3JtIgotCi0gICAgdGVzdExpc3QgXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdFNldCBfIHggPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyB4CiAgICAgICAgIHJldHVybiB4CiAKLSAgICB0ZXN0TGlzdCBfIE5vdGhpbmcgPSBkbwotICAgICAgICBlcnJvciAkICJVbnN1cHBvcnRlZCB0ZXN0TGlzdCBmb3JtIgotCi0gICAgdGVzdEVudW0gXyAoSnVzdCB4KSA9IGRvCisgICAgdGVzdExpc3QgXyB4ID0gZG8KICAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAogICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdEVudW0gXyBOb3RoaW5nID0gZG8KLSAgICAgICAgZXJyb3IgJCAiVW5zdXBwb3J0ZWQgdGVzdEVudW0gZm9ybSIKLQotICAgIHRlc3RUeXBlZGVmIF8gKEp1c3QgeCkgPSBkbworICAgIHRlc3RFbnVtIF8geCA9IGRvCiAgICAgICAgIFRocmlmdFRlc3RVdGlscy5zZXJ2ZXJMb2cgJCBzaG93IHgKICAgICAgICAgcmV0dXJuIHgKIAotICAgIHRlc3RUeXBlZGVmIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RUeXBlZGVmIGZvcm0iCisgICAgdGVzdFR5cGVkZWYgXyB4ID0gZG8KKyAgICAgICAgVGhyaWZ0VGVzdFV0aWxzLnNlcnZlckxvZyAkIHNob3cgeAorICAgICAgICByZXR1cm4geAogCi0gICAgdGVzdE1hcE1hcCBfIChKdXN0IF8pID0gZG8KKyAgICB0ZXN0TWFwTWFwIF8gXyA9IGRvCiAgICAgICAgIHJldHVybiAoTWFwLmZyb21MaXN0IFsoMSwgTWFwLmZyb21MaXN0IFsoMiwgMildKV0pCiAKLSAgICB0ZXN0TWFwTWFwIF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RNYXBNYXAgZm9ybSIKLQotICAgIHRlc3RJbnNhbml0eSBfIChKdXN0IHgpID0gZG8KKyAgICB0ZXN0SW5zYW5pdHkgXyB4ID0gZG8KICAgICAgICAgcmV0dXJuIChNYXAuZnJvbUxpc3QgWygxLCBNYXAuZnJvbUxpc3QgWyhUeXBlcy5PTkUsIHgpXSldKQogCi0gICAgdGVzdEluc2FuaXR5IF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RJbnNhbml0eSBmb3JtIgotCiAgICAgdGVzdE11bHRpIF8gXyBfIF8gXyBfIF8gPSBkbwotICAgICAgICByZXR1cm4gKFR5cGVzLlh0cnVjdCBOb3RoaW5nIE5vdGhpbmcgTm90aGluZyBOb3RoaW5nKQorICAgICAgICByZXR1cm4gKFR5cGVzLlh0cnVjdCAiIiAwIDAgMCkKIAogICAgIHRlc3RFeGNlcHRpb24gXyBfID0gZG8KLSAgICAgICAgQ29udHJvbC5FeGNlcHRpb24udGhyb3cgKFR5cGVzLlhjZXB0aW9uIChKdXN0IDEpIChKdXN0ICJieWEiKSkKKyAgICAgICAgQ29udHJvbC5FeGNlcHRpb24udGhyb3cgKFR5cGVzLlhjZXB0aW9uIDEgImJ5YSIpCiAKICAgICB0ZXN0TXVsdGlFeGNlcHRpb24gXyBfIF8gPSBkbwotICAgICAgICBDb250cm9sLkV4Y2VwdGlvbi50aHJvdyAoVHlwZXMuWGNlcHRpb24gKEp1c3QgMSkgKEp1c3QgInh5eiIpKQorICAgICAgICBDb250cm9sLkV4Y2VwdGlvbi50aHJvdyAoVHlwZXMuWGNlcHRpb24gMSAieHl6IikKIAotICAgIHRlc3RPbmV3YXkgXyAoSnVzdCBpKSA9IGRvCisgICAgdGVzdE9uZXdheSBfIGkgPSBkbwogICAgICAgICBUaHJpZnRUZXN0VXRpbHMuc2VydmVyTG9nICQgc2hvdyBpCiAKLSAgICB0ZXN0T25ld2F5IF8gTm90aGluZyA9IGRvCi0gICAgICAgIGVycm9yICQgIlVuc3VwcG9ydGVkIHRlc3RPbmV3YXkgZm9ybSIKLQogCiBjbGllbnQgOjogKFN0cmluZywgTmV0d29yay5Qb3J0SUQpIC0+IElPICgpCiBjbGllbnQgYWRkciA9IGRvCkBAIC0xOTgsNiArMTU0LDggQEAKICAgICB2OSA8LSBDbGllbnQudGVzdERvdWJsZSBwcyAoLTMuMTQpCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjkKIAorICAgIC0tIFRPRE86IENsaWVudC50ZXN0QmluYXJ5IC4uLgorCQogICAgIHYxMCA8LSBDbGllbnQudGVzdE1hcCBwcyAoTWFwLmZyb21MaXN0IFsoMSwxKSwoMiwyKSwoMywzKV0pCiAgICAgVGhyaWZ0VGVzdFV0aWxzLmNsaWVudExvZyAkIHNob3cgdjEwCiAKQEAgLTIxMCw3ICsxNjgsNyBAQAogICAgIHYxMyA8LSBDbGllbnQudGVzdFNldCBwcyAoU2V0LmZyb21MaXN0IFsxLDIsMyw0LDVdKQogICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxMwogCi0gICAgdjE0IDwtIENsaWVudC50ZXN0U3RydWN0IHBzIChUeXBlcy5YdHJ1Y3QgKEp1c3QgImhpIikgKEp1c3QgNCkgKEp1c3QgNSkgTm90aGluZykKKyAgICB2MTQgPC0gQ2xpZW50LnRlc3RTdHJ1Y3QgcHMgKFR5cGVzLlh0cnVjdCAiaGkiIDQgNSAwKQogICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgJCBzaG93IHYxNAogCiAgICAgKHRlc3RFeGNlcHRpb24gcHMgImJhZCIpIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgdGVzdEV4Y2VwdGlvbkhhbmRsZXIKQEAgLTIyMiw3ICsxODAsNyBAQAogCiAgICAgdENsb3NlIHRvCiAgIHdoZXJlIHRlc3RFeGNlcHRpb24gcHMgbXNnID0gZG8KLSAgICAgICAgICAgIENsaWVudC50ZXN0RXhjZXB0aW9uIHBzICJlIgorICAgICAgICAgICAgXyA8LSBDbGllbnQudGVzdEV4Y2VwdGlvbiBwcyAiZSIKICAgICAgICAgICAgIFRocmlmdFRlc3RVdGlscy5jbGllbnRMb2cgbXNnCiAgICAgICAgICAgICByZXR1cm4gKCkKIApkaWZmIC0tZ2l0IGEvdGVzdC9ocy9ydW4tdGVzdC5zaCBiL3Rlc3QvaHMvcnVuLXRlc3Quc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhYzUxOTBkLi5lY2FmYzE4Ci0tLSBhL3Rlc3QvaHMvcnVuLXRlc3Quc2gKKysrIGIvdGVzdC9ocy9ydW4tdGVzdC5zaApAQCAtMjksMzAgKzI5LDYgQEAKICAgICBCQVNFPS4uLy4uCiBmaQogCi1pZiBbIC16ICRUSFJJRlRfQklOIF07IHRoZW4KLSAgICBUSFJJRlRfQklOPSRCQVNFL2NvbXBpbGVyL2NwcC90aHJpZnQgCi1maQotCi1pZiBbICEgLXggIiRUSFJJRlRfQklOIiBdOyB0aGVuCi0gICAgcHJpbnRmICJDb3VsZCBub3QgZmluZCB0aHJpZnQgYmluYXJ5OyBwYXNzIGl0IGFzIGVudmlyb25tZW50IHZhcmlhYmxlIFRIUklGVF9CSU5cbiIKLSAgICBleGl0IDEKLWZpCi0KLSMgRmlndXJlIG91dCB3aGF0IGZpbGUgdG8gZ2VuZXJhdGUgYmluZGluZ3MgZnJvbQotaWYgWyAteiAkVEhSSUZUX0ZJTEUgXTsgdGhlbgotICAgIFRIUklGVF9GSUxFPSRCQVNFL3Rlc3QvJDEudGhyaWZ0Ci1maQotCi1pZiBbICEgLWUgJFRIUklGVF9GSUxFIF07IHRoZW4KLSAgICBwcmludGYgIk1pc3NpbmcgdGhyaWZ0IGZpbGUgJFRIUklGVF9GSUxFIFxuIgotICAgIGV4aXQgMgotZmkKLQotaWYgWyAhIC1lICIkVEhSSUZUX0ZJTEUiIF07IHRoZW4KLSAgICBwcmludGYgIkNvdWxkIG5vdCBmaW5kIHRocmlmdCBmaWxlIHRvIHJ1bjsgcGFzcyBpdCBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBUSFJJRlRfRklMRVxuIgotICAgIGV4aXQgMQotZmkKLQogIyBGaWd1cmUgb3V0IHdoYXQgZmlsZSB0byBydW4gaGFzIGEgc2VydmVyCiBpZiBbIC16ICRURVNUX1NPVVJDRV9GSUxFIF07IHRoZW4KICAgICBURVNUX1NPVVJDRV9GSUxFPSRCQVNFL3Rlc3QvaHMvJDFfTWFpbi5ocwpAQCAtNjMsOSArMzksNSBAQAogICAgIGV4aXQgMwogZmkKIAotIyBBY3R1YWxseSBydW4gdGhlIHNlcnZlciBiaXRzCi1wcmludGYgIkdlbmVyYXRpbmcgYmluZGluZ3MuLi4gXG4iCi0kVEhSSUZUX0JJTiAtLWdlbiBocyAkVEhSSUZUX0ZJTEUKLQogcHJpbnRmICJSdW5uaW5nIHRlc3QuLi4gXG4iCi1ydW5oYXNrZWxsIC1XYWxsIC1pJEJBU0UvbGliL2hzL3NyYyAtaWdlbi1ocyAkVEVTVF9TT1VSQ0VfRklMRQorcnVuaGFza2VsbCAtV2FsbCAtWFNjb3BlZFR5cGVWYXJpYWJsZXMgLWkkQkFTRS9saWIvaHMvc3JjIC1pZ2VuLWhzICRURVNUX1NPVVJDRV9GSUxFCmRpZmYgLS1naXQgYS90ZXN0L2luZGV4Lmh0bWwgYi90ZXN0L2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxMWE5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvaW5kZXguaHRtbApAQCAtMCwwICsxLDUxIEBACis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorCistLT4KKzwhRE9DVFlQRSBIVE1MPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KKzx0aXRsZT5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTwvdGl0bGU+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vY2RuLmRhdGF0YWJsZXMubmV0LzEuMTAuNC9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuY3NzIj4KKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCIgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjEuMy5taW4uanMiPjwvc2NyaXB0PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04IiBzcmM9Imh0dHA6Ly9jZG4uZGF0YXRhYmxlcy5uZXQvMS4xMC40L2pzL2pxdWVyeS5kYXRhVGFibGVzLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXN1bHQuanMiPgorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMj5BcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZTogUmVzdWx0czwvaDI+Cis8dGFibGUgaWQ9InRlc3RfcmVzdWx0cyIgY2xhc3M9ImRpc3BsYXkiPgorICAgIDx0aGVhZD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPlNlcnZlcjwvdGg+CisgICAgICAgICAgICA8dGg+Q2xpZW50PC90aD4KKyAgICAgICAgICAgIDx0aD5Qcm90b2NvbDwvdGg+CisgICAgICAgICAgICA8dGg+VHJhbnNwb3J0PC90aD4KKyAgICAgICAgICAgIDx0aD5SZXN1bHQgKGxvZyk8L3RoPgorICAgICAgICAgICAgPHRoPkV4cGVjdGVkPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RoZWFkPgorPC90YWJsZT4KKzxoMj5UZXN0IEluZm9ybWF0aW9uPC9oMj4KKzxwcmUgaWQ9InRlc3RfaW5mbyI+PC9wcmU+CisKKzxhIGhyZWY9ImxvZyI+YnJvd3NlIHJhdyBsb2c8L2E+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9DQS5wZW0gYi90ZXN0L2tleXMvQ0EucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NDdiOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvQ0EucGVtCkBAIC0wLDAgKzEsODIgQEAKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMTY1ODIwODAwODg5NTQzODEyMTIgKDB4ZTYxZjYxZmMzYjM0MjM5YykKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyAgICAgICAgSXNzdWVyOiBDPVVTLCBTVD1NYXJ5bGFuZCwgTD1Gb3Jlc3QgSGlsbCwgTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIE9VPUFwYWNoZSBUaHJpZnQsIENOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBBcHIgIDcgMTg6NTg6MDAgMjAxNCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IEp1biAyNCAxODo1ODowMCAyMDIyIEdNVAorICAgICAgICBTdWJqZWN0OiBDPVVTLCBTVD1NYXJ5bGFuZCwgTD1Gb3Jlc3QgSGlsbCwgTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIE9VPUFwYWNoZSBUaHJpZnQsIENOPWxvY2FsaG9zdC9lbWFpbEFkZHJlc3M9ZGV2QHRocmlmdC5hcGFjaGUub3JnCisgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOgorICAgICAgICAgICAgUHVibGljIEtleSBBbGdvcml0aG06IHJzYUVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICBQdWJsaWMtS2V5OiAoMjA0OCBiaXQpCisgICAgICAgICAgICAgICAgTW9kdWx1czoKKyAgICAgICAgICAgICAgICAgICAgMDA6YWE6MTM6ZDQ6YzQ6Zjc6MDE6MTc6YTc6OTI6ZDE6YjQ6YjQ6MTU6MGQ6CisgICAgICAgICAgICAgICAgICAgIDIxOjkwOjE5OjVlOmZjOmZiOmI2OjZkOjNmOmYyOjNmOjY1OmEyOjdhOjQzOgorICAgICAgICAgICAgICAgICAgICBhNjo0Njo5NTpmYzo0MzoxNjpmNjo2MzoxNDo1ZTpmNzpiMTplMzo2MTowMjoKKyAgICAgICAgICAgICAgICAgICAgZjk6NGE6OTU6ODk6YmY6OGQ6Zjk6NDg6MWQ6ODI6ZTc6MzQ6ZTA6YjI6NDg6CisgICAgICAgICAgICAgICAgICAgIGRmOjA4OmQ5OjdjOjNhOjJmOmQzOjFiOjBiOmU4OmVmOmMyOjQxOjBhOjdkOgorICAgICAgICAgICAgICAgICAgICAwYTozODo3ODozYTozMTo2Njo3Mzo5OTo4YzpkMTo3OToyNzo1ZjplNTo2NjoKKyAgICAgICAgICAgICAgICAgICAgZDA6NWU6M2E6OGM6MGM6OTI6MTg6NzM6MDQ6YzE6ZjU6NDU6ZGI6Mzc6ZTc6CisgICAgICAgICAgICAgICAgICAgIDVmOmM3OjhjOmEzOjYwOmU5OjkyOmEwOmQ4OjI5OjVkOjc3OjQ4OmZiOjFkOgorICAgICAgICAgICAgICAgICAgICBiMDplZDoxMjoyYzo0ZToyZTowMjpkYjozZDoxYTo0MTo3MTphNjoyYjoyZToKKyAgICAgICAgICAgICAgICAgICAgYjM6NGM6NmE6Yzc6Zjc6MWQ6YTk6N2U6Yzc6Y2Y6ZGI6ZjI6ZTc6YjY6ZjM6CisgICAgICAgICAgICAgICAgICAgIDFmOjc3OjFkOjI0OjAxOjFhOjY2OjY2OjMwOjg1OjMwOjAyOjI5OmM0OmJiOgorICAgICAgICAgICAgICAgICAgICBmNzpjZDozZjo4OTo0YjoxYTo1ZjpmNDo5MTo5NjpmYjplOTozOTpmMjo0NjoKKyAgICAgICAgICAgICAgICAgICAgOTY6MTI6M2Q6OGE6MjM6YjU6MmU6ODI6OWU6NDE6ZmU6NDA6YjY6Mjc6YjE6CisgICAgICAgICAgICAgICAgICAgIDE0OjQ0OjVjOjk2OjMwOjBmOjU1OmU0OmJiOmFkOjhiOjhhOjk5OjE3OmMwOgorICAgICAgICAgICAgICAgICAgICAyOToxMTo0ZTo3Njo3OTo5ZDo0YjowMzozMTo3ZTo4NTozYzphODoyMzo0MDoKKyAgICAgICAgICAgICAgICAgICAgNTQ6MDI6NTg6MzU6YzY6ZmM6ZGQ6M2Q6ZWI6ZTM6ZDE6NTE6MDA6MDI6ODY6CisgICAgICAgICAgICAgICAgICAgIDFhOmQ3OmIwOjlmOmEwOjE3OjczOjZhOjVhOmQwOmU2OmI2OmI4OjU1OjQwOgorICAgICAgICAgICAgICAgICAgICA1ZToyNworICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcjogCisgICAgICAgICAgICAgICAgMjg6RjI6RkQ6MzA6Q0Q6MDM6RjE6REM6NDE6MUU6QzQ6OTM6QzY6OTc6MTM6Q0E6RDQ6RkE6NjA6MkEKKyAgICAgICAgICAgIFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6IAorICAgICAgICAgICAgICAgIGtleWlkOjI4OkYyOkZEOjMwOkNEOjAzOkYxOkRDOjQxOjFFOkM0OjkzOkM2Ojk3OjEzOkNBOkQ0OkZBOjYwOjJBCisKKyAgICAgICAgICAgIFg1MDl2MyBCYXNpYyBDb25zdHJhaW50czogCisgICAgICAgICAgICAgICAgQ0E6VFJVRQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IHNoYTFXaXRoUlNBRW5jcnlwdGlvbgorICAgICAgICAgNDY6MTU6MTg6ODk6YjI6NTc6MTc6ZDE6YTI6NjQ6YzE6OWE6NzM6NGY6MDQ6OTQ6NzY6MDc6CisgICAgICAgICAxZjoyOTpiYTo2ZjozNDo0NjpjMjozNjpkNTo2ODo4NTpmNDoxNTo0Yzo4ZToxYTpmZTo4MzoKKyAgICAgICAgIDc5OjUzOmVjOmFhOjBkOjkyOjYwOmRlOmYzOjlhOjNhOmU4OjgwOjY2OmFjOjg3OjcwOjg5OgorICAgICAgICAgNTk6ZjI6YWM6OWU6YjA6Mjg6MTE6Mzc6N2Q6Nzg6NGU6NWU6M2Y6MjU6MGY6YmU6MDk6NmY6CisgICAgICAgICAyNjoyYTozZDo2Njo3OTozODoyODplNTo4MTo3MTo3MTo5NjoyNjo0ZjpkYjplYzoyMzo3MDoKKyAgICAgICAgIGJlOjM3OjM5OmZjOmUwOjMyOjBkOjgwOjhmOjY2OmM3OmFjOmE0OmI0OjhiOjc3OjQwOmUyOgorICAgICAgICAgOTk6NDQ6M2E6NzM6Yzg6Zjk6MTQ6Y2Y6MWI6MzI6Mjc6YzI6Nzg6ZGI6YjA6ZGE6OGE6NjA6CisgICAgICAgICBlYjo4ZDozNDo3ZTo3ZDozYzowMzpkNDozODo3NDpmNzoxNzo5ZTozMjo3NDo5YTplNzozNzoKKyAgICAgICAgIDk1OmQ0OjcxOjAzOmM4Ojk0OmVhOjA5OjdiOmFkOjJkOmViOjcwOjQzOmYyOjMyOjdlOjYzOgorICAgICAgICAgMDE6ODQ6OGM6N2U6OWU6ZjA6Nzk6N2Y6YWU6ZTk6Y2Y6Zjk6YmU6MGU6ZmU6OTU6ZDI6YmQ6CisgICAgICAgICBjODphNzo4MTpjMjo3MTpkOTpjMzo1MDozMTo4OTo2ZDpmYTphZDphMjphYjowMDowMTozNDoKKyAgICAgICAgIDEwOjU4OmVmOjk2OjVhOmViOjMwOjA3OmE5OjhlOjg0OjM2OmVmOjNkOjNjOjYxOjQ2Ojk2OgorICAgICAgICAgNmE6ZTg6MDk6MjA6NWE6YWI6Zjg6NGI6ZWI6Yjc6MzM6NjE6OGU6YWY6OWE6N2Q6MTY6YjA6CisgICAgICAgICA2MDo2YTpmMDozMDplNTpiMjo4ZTplNzo4MDpiNDphMTowMjphOTozNzpmZTo1ZjpiNTphZToKKyAgICAgICAgIDY1OmU5OjZiOjM0CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL1JFQURNRS5tZCBiL3Rlc3Qva2V5cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDEwODM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9SRUFETUUubWQKQEAgLTAsMCArMSwxMDIgQEAKKyMgVGVzdCBLZXlzIGFuZCBDZXJ0aWZpY2F0ZXMKK1RoaXMgZm9sZGVyIGlzIGRlZGljYXRlZCB0byB0ZXN0IGtleXMgYW5kIGNlcnRpZmljYXRlcyBwcm92aWRlZCBpbiBtdWx0aXBsZSBmb3JtYXRzLgorUHJpbWFyeSB1c2UgYXJlIHVuaXQgdGVzdCBzdWl0ZXMgYW5kIGNyb3NzIGxhbmd1YWdlIHRlc3RzLgorCisgICAgdGVzdC9rZXlzCisKKyoqVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IG11c3QgbmV2ZXIgYmUgdXNlZCBvbiBwcm9kdWN0aW9uIHN5c3RlbXMuKioKKworIyMgU1NMIEtleXMgYW5kIENlcnRpZmljYXRlcworCisKKyMjIGNyZWF0ZSBjZXJ0aWZpY2F0ZXMKKword2UgdXNlIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBmb3IgdGVzdCBrZXkgYW5kIGNlcnRpZmljYXRlIGNyZWF0aW9uCisKKyAgICBDPVVTLAorICAgIFNUPU1hcnlsYW5kLAorICAgIEw9Rm9yZXN0IEhpbGwsCisgICAgTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICAgT1U9QXBhY2hlIFRocmlmdCwKKyAgICBDTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworCisjIyMgY3JlYXRlIHNlbGYtc2lnbmVkIHNlcnZlciBrZXkgYW5kIGNlcnRpZmljYXRlCisKKyAgICBvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1ub2RlcyAgLWRheXMgMzAwMCAtb3V0IHNlcnZlci5jcnQgLWtleW91dCBzZXJ2ZXIua2V5CisgICAgb3BlbnNzbCB4NTA5IC1pbiBzZXJ2ZXIuY3J0IC10ZXh0ID4gQ0EucGVtCisgICAgY2F0IHNlcnZlci5jcnQgc2VydmVyLmtleSA+IHNlcnZlci5wZW0KKworRXhwb3J0IHBhc3N3b3JkIGlzICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcworCisgICAgb3BlbnNzbCBwa2NzMTIgLWV4cG9ydCAtY2xjZXJ0cyAtaW4gc2VydmVyLmNydCAtaW5rZXkgc2VydmVyLmtleSAtb3V0IHNlcnZlci5wMTIKKworIyMjIGNyZWF0ZSBjbGllbnQga2V5IGFuZCBjZXJ0aWZpY2F0ZQorCisgICAgb3BlbnNzbCBnZW5yc2EgLW91dCBjbGllbnQua2V5CisKK2NyZWF0ZSBhIHNpZ25pbmcgcmVxdWVzdDoKKworICAgIG9wZW5zc2wgcmVxIC1uZXcgLWtleSBjbGllbnQua2V5IC1vdXQgY2xpZW50LmNzcgorCitzaWduIHRoZSBjbGllbnQgY2VydGlmaWNhdGUgd2l0aCB0aGUgc2VydmVyLmtleQorCisgICAgb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzAwMCAtaW4gY2xpZW50LmNzciAtQ0EgQ0EucGVtIC1DQWtleSBzZXJ2ZXIua2V5IC1zZXRfc2VyaWFsIDAxIC1vdXQgY2xpZW50LmNydAorCitleHBvcnQgY2VydGlmaWNhdGUgaW4gUEtDUzEyIGZvcm1hdCAoRXhwb3J0IHBhc3N3b3JkIGlzICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcykKKworICAgIG9wZW5zc2wgcGtjczEyIC1leHBvcnQgLWNsY2VydHMgLWluIGNsaWVudC5jcnQgLWlua2V5IGNsaWVudC5rZXkgLW91dCBjbGllbnQucDEyCisKK2V4cG9ydCBjZXJ0aWZpY2F0ZSBpbiBQRU0gZm9ybWF0IGZvciBPcGVuU1NMIHVzYWdlCisKKyAgICBvcGVuc3NsIHBrY3MxMiAtaW4gY2xpZW50LnAxMiAtb3V0IGNsaWVudC5wZW0gLWNsY2VydHMKKworIyMjIGNyZWF0ZSBjbGllbnQga2V5IGFuZCBjZXJ0aWZpY2F0ZSB3aXRoIGFsdG5hbWVzCisKK2NvcHkgb3BlbnNzbC5jbmYgZnJvbSB5b3VyIHN5c3RlbSBlLmcuIC9ldGMvc3NsL29wZW5zc2wuY25mIGFuZCBhcHBlbmQgZm9sbG93aW5nIHRvIHRoZSBlbmQgb2YgWyB2M19yZXEgXQorCisgICAgc3ViamVjdEFsdE5hbWU9QGFsdGVybmF0ZV9uYW1lcworCisgICAgWyBhbHRlcm5hdGVfbmFtZXMgXQorICAgIElQLjE9MTI3LjAuMC4xCisgICAgSVAuMj06OjEKKyAgICBJUC4zPTo6ZmZmZjoxMjcuMC4wLjEKKworY3JlYXRlIGEgc2lnbmluZyByZXF1ZXN0OgorCisgICAgb3BlbnNzbCByZXEgLW5ldyAta2V5IGNsaWVudF92My5rZXkgLW91dCBjbGllbnRfdjMuY3NyIC1jb25maWcgb3BlbnNzbC5jbmYgXAorICAgICAgICAtc3ViaiAiL0M9VVMvU1Q9TWFyeWxhbmQvTD1Gb3Jlc3QgSGlsbC9PPVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi9PVT1BcGFjaGUgVGhyaWZ0L0NOPWxvY2FsaG9zdCIgLWV4dGVuc2lvbnMgdjNfcmVxCisKK3NpZ24gdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIua2V5CisKKyAgICBvcGVuc3NsIHg1MDkgLXJlcSAtZGF5cyAzMDAwIC1pbiBjbGllbnRfdjMuY3NyIC1DQSBDQS5wZW0gLUNBa2V5IHNlcnZlci5rZXkgLXNldF9zZXJpYWwgMDEgLW91dCBjbGllbnRfdjMuY3J0IC1leHRlbnNpb25zIHYzX3JlcSAtZXh0ZmlsZSBvcGVuc3NsLmNuZgorCisjIyBKYXZhIGtleSBhbmQgY2VydGlmaWNhdGUgaW1wb3J0CitKYXZhIFRlc3QgRW52aXJvbm1lbnQgdXNlcyBrZXkgYW5kIHRydXN0IHN0b3JlIHBhc3N3b3JkICJ0aHJpZnQiIHdpdGhvdXQgdGhlIHF1b3RlcworCitsaXN0IGtleXN0b3JlIGVudHJpZXMKKworICAgIGtleXRvb2wgLWxpc3QgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLmtleXN0b3JlCisKK2xpc3QgdHJ1c3RzdG9yZSBlbnRyaWVzCisKKyAgICBrZXl0b29sIC1saXN0IC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlCisKKworZGVsZXRlIGFuIGVudHJ5CisKKyAgICBrZXl0b29sIC1kZWxldGUgLXN0b3JlcGFzcyB0aHJpZnQgLWtleXN0b3JlIC4uLy4uL2xpYi9qYXZhL3Rlc3QvLnRydXN0c3RvcmUgLWFsaWFzIHNzbHRlc3QKKworCitpbXBvcnQgY2VydGlmaWNhdGUgaW50byB0cnVzdHN0b3JlCisKKyAgICBrZXl0b29sIC1pbXBvcnRjZXJ0IC1zdG9yZXBhc3MgdGhyaWZ0IC1rZXlzdG9yZSAuLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlIC1hbGlhcyBsb2NhbGhvc3QgLS1maWxlIHNlcnZlci5jcnQKKworaW1wb3J0IGtleSBpbnRvIGtleXN0b3JlCisKKyAgICBrZXl0b29sIC1pbXBvcnRrZXlzdG9yZSAtc3RvcmVwYXNzIHRocmlmdCAta2V5c3RvcmUgLi4vLi4vbGliL2phdmEvdGVzdC8ua2V5c3RvcmUgLXNyY3N0b3JldHlwZSBwa2NzMTIgLXNyY2tleXN0b3JlIHNlcnZlci5wMTIKKworIyBUZXN0IFNTTCBzZXJ2ZXIgYW5kIGNsaWVudHMKKworICAgIG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgbG9jYWxob3N0OjkwOTAKKyAgICBvcGVuc3NsIHNfc2VydmVyIC1hY2NlcHQgOTA5MCAtd3d3CisKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQuY3J0IGIvdGVzdC9rZXlzL2NsaWVudC5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhOWFkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQuY3J0CkBAIC0wLDAgKzEsMjMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRDJEQ0NBc0FDQVFFd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JFeEN6QUpCZ05WQkFZVEFsVlRNUkV3RHdZRAorVlFRSURBaE5ZWEo1YkdGdVpERVVNQklHQTFVRUJ3d0xSbTl5WlhOMElFaHBiR3d4SnpBbEJnTlZCQW9NSGxSbworWlNCQmNHRmphR1VnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFV01CUUdBMVVFQ3d3TlFYQmhZMmhsSUZSbworY21sbWRERVNNQkFHQTFVRUF3d0piRzlqWVd4b2IzTjBNU1F3SWdZSktvWklodmNOQVFrQkZoVmtaWFpBZEdoeQorYVdaMExtRndZV05vWlM1dmNtY3dIaGNOTVRVeE1qSXpNRGN3TnpVd1doY05NalF3TXpFd01EY3dOelV3V2pDQgorc1RFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ01DRTFoY25sc1lXNWtNUlF3RWdZRFZRUUhEQXRHYjNKbAorYzNRZ1NHbHNiREVuTUNVR0ExVUVDZ3dlVkdobElFRndZV05vWlNCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dQorTVJZd0ZBWURWUVFMREExQmNHRmphR1VnVkdoeWFXWjBNUkl3RUFZRFZRUUREQWxzYjJOaGJHaHZjM1F4SkRBaQorQmdrcWhraUc5dzBCQ1FFV0ZXUmxka0IwYUhKcFpuUXVZWEJoWTJobExtOXlaekNDQVNJd0RRWUpLb1pJaHZjTgorQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUxsL2JKaGcxN1B1MXQ3ODVKSXV3bGg3ZTJFNTFlb1dGdnV4TVdmSAorZHNVQVZxRGFPejk5TzVzdjhwZ1dLWHJrUEJ0dEU5OFQrTXgvUHd6NUpIczRRY3JlM0E1YWRtNmNkYWIwQUt1ZworZVZHMVB2SHJXelY0YWhlZzRLVWZWU2lNejhCRzJLM1ExVkd2WmtnTVJhL1E0MDlGS2pVNlo0RDl2Qkc0UGFzMworUE41RnhuQUw2UDcweVdDRXIyVnUvdFdKbENOK3FyUkRmU2FFMmhxbVQxaXJ4YW9QYTYxR3Z1UlZzR1EzVGVvRQorbUdmRU50dkZxQzZxUVd1U0NiRzVhSTQ3UnY2NnBxb1dXeHFrcmNvbE5jNyt2aHg2clcrd2RGTzNJbHFJVDhJRworc2RRVnArWTRpci9kR3AyZWp6cUdaQ3JlbVBKMXVFS2pMTXBJdWtkZzI1eW1IQzBDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJjUmR3YzltZFk5ek92VGl4dFRoSHJjaVZ2cXdwNlJhaVFxTUVWb21vellpbFpEUgorSjkwTTNINktubEFESmJDdjBGWHVqc2FBcEI1M2F3cTVJN3NPYkFZV0ZoREpaOUxLbHcwbERGN0tjaExYaUFsaworWFZ5dkwybkpqdUpjeFBDRlBXa3R3cnc1YlRndVJDQnpHMTJIemlrbit4czZ1UHVyN1ZRWU0zM2piWEVkYTVQUworVUVxdkFWV2FPTkpDWDhNRFlPc2NWb0pGMEVTeUkrZk45MmlwRmFYUjdmR2Fqb2QvcmMwQWZlTjJHVk1aRVR2ZQorMjFwa1V5RHd3Q0dBNDR1dk5VQ2QxZTMyTnhFM2FoOVVBcENSbjVzR0o2NFI2dXJwRlRYVDNJQUxGM2thT083VQorVnNNaEZyVWlaNytCdzVuSWVpSzBRT0Y2RWlwaitiSnZyTFpwU2c9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudC5rZXkgYi90ZXN0L2tleXMvY2xpZW50LmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRjZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudC5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRW93SUJBQUtDQVFFQXVYOXNtR0RYcys3VzN2emtraTdDV0h0N1lUblY2aFlXKzdFeFo4ZDJ4UUJXb05vNworUDMwN215L3ltQllwZXVROEcyMFQzeFA0ekg4L0RQa2tlemhCeXQ3Y0RscDJicHgxcHZRQXE2QjVVYlUrOGV0YgorTlhocUY2RGdwUjlWS0l6UHdFYllyZERWVWE5bVNBeEZyOURqVDBVcU5UcG5nUDI4RWJnOXF6Yzgza1hHY0F2bworL3ZUSllJU3ZaVzcrMVltVUkzNnF0RU45Sm9UYUdxWlBXS3ZGcWc5cnJVYSs1Rld3WkRkTjZnU1laOFEyMjhXbworTHFwQmE1SUpzYmxvamp0Ry9ycW1xaFpiR3FTdHlpVTF6djYrSEhxdGI3QjBVN2NpV29oUHdnYXgxQlduNWppSwordjkwYW5aNlBPb1prS3Q2WThuVzRRcU1zeWtpNlIyRGJuS1ljTFFJREFRQUJBb0lCQUZvdGJDbVh5c1VhY3pMcworVm1JS2dVaHFuMHhneFhHTFU1a0FSemhnYTRqUjVVdEZURkJOSFZFUU9pdGRlc1RYZDdFTmtmOTh3aE1JT1NxaAorWSs3VEpvanRWcVZUclFlUTRGRk5oWlhwNlpDalAvcHpwRitXTGwxV1JGK0JuL0NhbzlTaG5HekRmVEM4eUVoMgorVHRwdC9sTm5HR0hRQnNsYWtMYzhqaDVTT0RFRmZidWdYOFNkVEN3WllzZXNLTnJYbTFwUy81SUV1blBxYVJpMAorSUkwRWNucUhFc2dxU28rQ2xqcFc3dU54U3J5QTJ2U0FWZGxQZWo2KzlGWmpkSUhMUDVBRUtZdms3ZTlEMkNNVgorMStnck5lL1FrUXBwU2hpelBpcmJiOTN0SG04NnY1YmtERkNNOXlXcmhjTWNqdklMTVhFVHhJcHBNR1BtYWNSdQoranF0WWNBRUNnWUVBOFZEenlsVHo0a1MzK0QzbjNoVGdiNDFYVllhN2ZlVXNoOTlHV1JPMXdYSUZwSGpDSVJqQQorOXIvQlhXOStSeDNwdVZQaFM4aHdMUTRCTGRBN2xGcFYxQzhhZzBlMyt2bjZ6VmlybnoxanRJK3VITXZTdHpoTworZDZpMG5mK3c0SFlYbzdtTjZvOVpkSEVmQzhTRk5ieW1oQ29WS2gyRElMRHdiNEVYOVJYTnB5MENnWUVBeE1qNAorK3Zya2xKL2lsSCtSeTF6c3Q0elFZSXdtbTNRV2phckRyeXBHdWNIZ2Q0amc1djlBL0NKSUtVaTh4ME1qcmN1Tgord1ZiN1I4WEp5WXpGUVJYSVVYUjZHbkxlZVNuZnB4enQ0WWxpZkN2WHhuT2k4dzRmdjdLZUdCVjVucDFFZ3BvOAorbldOeVpGeGR2UUR1Q29wcjNTVW9TOUpJOEpQd1ZnQTdUKzdEYVFFQ2dZQUdvYXZoYm80NU5KdzlwUzNmQzRIVAorYnZYc2NzUnFSRWNDQU4vRkNPYWd4MHBpWjdNbUI3RWQxczB3alNUU1BYOHp5WnRTWXRLNldqMHNEaUhsQk1xQgorQno1YVJ6bEdHMktLREJyRFNJT1o3YXppTzdPeHQwbG92bWtnUW11UTc0M2N3UGVtYjRRTTBDTURSc1pHWU1YTworc2YxYzUreTNsRVUzT3p2MlQwQVVqUUtCZ0JsbnpPVXlNUUtUSmNDQU84VmlpTmtsbjkxbkdyRGxLdWc5VEtnMworc0F2WllPNXR5SU5xSHV5dVRGeXdIRmNwYnRqSU45UG5NK2ZQUEQ3K0lwVkZoNmdrZm9NZG8yVkhKNjIraVdPZAoreGc0NzVzNmpMVDF0N0dGbVlRekE4UU91VUNNQVlLVDlLczZVTWpIdGhjM3Nrd0pwQXF2UFNVVnVCQkJHVldINworZEZVQkFvR0JBTDY3QVJMdWppQUVWTkh0NXJhaml4QjZuY2w3L1IrWjJ1YXdJMUpmbWRuQ1pvbkFLVlpZSHVYVQorLzRqMitvNFFoSklQTHRXSW9heEFrTWlnUXRBa2VzcWlybjNLay9jN2taUklvTjU0OUhUSnV3WnFZcU5wN0NCLwora1ZpNVIzMzUrTTl6NDlpNnFBMFJac0pHU29TQms3UHVmRzRSbUxpbWNSYkd3clk5M3NQRAorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQucDEyIGIvdGVzdC9rZXlzL2NsaWVudC5wMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNjY5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQucDEyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnQucGVtIGIvdGVzdC9rZXlzL2NsaWVudC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlZjYyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnQucGVtCkBAIC0wLDAgKzEsNjAgQEAKK0JhZyBBdHRyaWJ1dGVzCisgICAgbG9jYWxLZXlJRDogMzkgRUMgM0QgNUIgMjggMTcgREEgREQgMDkgN0EgNjIgNjggRDUgNDQgMUYgQzcgRTIgRjggRTAgQ0QgCitzdWJqZWN0PS9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworaXNzdWVyPS9DPVVTL1NUPU1hcnlsYW5kL0w9Rm9yZXN0IEhpbGwvTz1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24vT1U9QXBhY2hlIFRocmlmdC9DTj1sb2NhbGhvc3QvZW1haWxBZGRyZXNzPWRldkB0aHJpZnQuYXBhY2hlLm9yZworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEMkRDQ0FzQUNBUUV3RFFZSktvWklodmNOQVFFTEJRQXdnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lECitWUVFJREFoTllYSjViR0Z1WkRFVU1CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvCitaU0JCY0dGamFHVWdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvCitjbWxtZERFU01CQUdBMVVFQXd3SmJHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5CithV1owTG1Gd1lXTm9aUzV2Y21jd0hoY05NVFV4TWpJek1EY3dOelV3V2hjTk1qUXdNekV3TURjd056VXdXakNCCitzVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnTUNFMWhjbmxzWVc1a01SUXdFZ1lEVlFRSERBdEdiM0psCitjM1FnU0dsc2JERW5NQ1VHQTFVRUNnd2VWR2hsSUVGd1lXTm9aU0JUYjJaMGQyRnlaU0JHYjNWdVpHRjBhVzl1CitNUll3RkFZRFZRUUxEQTFCY0dGamFHVWdWR2h5YVdaME1SSXdFQVlEVlFRRERBbHNiMk5oYkdodmMzUXhKREFpCitCZ2txaGtpRzl3MEJDUUVXRldSbGRrQjBhSEpwWm5RdVlYQmhZMmhsTG05eVp6Q0NBU0l3RFFZSktvWklodmNOCitBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGwvYkpoZzE3UHUxdDc4NUpJdXdsaDdlMkU1MWVvV0Z2dXhNV2ZICitkc1VBVnFEYU96OTlPNXN2OHBnV0tYcmtQQnR0RTk4VCtNeC9Qd3o1SkhzNFFjcmUzQTVhZG02Y2RhYjBBS3VnCitlVkcxUHZIcld6VjRhaGVnNEtVZlZTaU16OEJHMkszUTFWR3Zaa2dNUmEvUTQwOUZLalU2WjREOXZCRzRQYXMzCitQTjVGeG5BTDZQNzB5V0NFcjJWdS90V0psQ04rcXJSRGZTYUUyaHFtVDFpcnhhb1BhNjFHdnVSVnNHUTNUZW9FCittR2ZFTnR2RnFDNnFRV3VTQ2JHNWFJNDdSdjY2cHFvV1d4cWtyY29sTmM3K3ZoeDZyVyt3ZEZPM0lscUlUOElHCitzZFFWcCtZNGlyL2RHcDJlanpxR1pDcmVtUEoxdUVLakxNcEl1a2RnMjV5bUhDMENBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFzRkFBT0NBUUVBQmNSZHdjOW1kWTl6T3ZUaXh0VGhIcmNpVnZxd3A2UmFpUXFNRVZvbW96WWlsWkRSCitKOTBNM0g2S25sQURKYkN2MEZYdWpzYUFwQjUzYXdxNUk3c09iQVlXRmhESlo5TEtsdzBsREY3S2NoTFhpQWxrCitYVnl2TDJuSmp1SmN4UENGUFdrdHdydzViVGd1UkNCekcxMkh6aWtuK3hzNnVQdXI3VlFZTTMzamJYRWRhNVBTCitVRXF2QVZXYU9OSkNYOE1EWU9zY1ZvSkYwRVN5SStmTjkyaXBGYVhSN2ZHYWpvZC9yYzBBZmVOMkdWTVpFVHZlCisyMXBrVXlEd3dDR0E0NHV2TlVDZDFlMzJOeEUzYWg5VUFwQ1JuNXNHSjY0UjZ1cnBGVFhUM0lBTEYza2FPTzdVCitWc01oRnJVaVo3K0J3NW5JZWlLMFFPRjZFaXBqK2JKdnJMWnBTZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitCYWcgQXR0cmlidXRlcworICAgIGxvY2FsS2V5SUQ6IDM5IEVDIDNEIDVCIDI4IDE3IERBIEREIDA5IDdBIDYyIDY4IEQ1IDQ0IDFGIEM3IEUyIEY4IEUwIENEIAorS2V5IEF0dHJpYnV0ZXM6IDxObyBBdHRyaWJ1dGVzPgorLS0tLS1CRUdJTiBFTkNSWVBURUQgUFJJVkFURSBLRVktLS0tLQorTUlJRkRqQkFCZ2txaGtpRzl3MEJCUTB3TXpBYkJna3Foa2lHOXcwQkJRd3dEZ1FJUktvbDQyYkFTM0FDQWdnQQorTUJRR0NDcUdTSWIzRFFNSEJBak91bGN5SE1hV3NRU0NCTWdiZVhROHBJWVRFTkttMDhVUGVxeGtDUjJuTHhTTworZ3RSbUJ4RFlqcVl2MzV5NEs4S2h5YkJ2U0JsSVBnRTVqRVd4VUNjYzFRdnk1eWRVUS9YOXBta1U4ZG5tQW1EQworbzB6d2QzbHQyZU5QeSs0V2xpcUZEVm1IckxmWVFGT29JckhqdXpDMGxJNEMyaVBPanhoZmExekZ1bWVkZ3dHUworR3gxMFg1dUVWSDVONjRmVzZCM0J2elFNMHJuMnFyME9OdVNSbXRlUnRJOE5zem5ma2dlSjlhNENJQUY3RTVaMgorSlRHSTEyZWROenpVSjFKaFg0N1pXNG1pUXdDVTVMY3kwMVVacVRGdVVwbUs3RlVRZWd0THkzZTVlREtxK2JJZworWllxNkh4N2x1OGhqVDVrV1pHS3k3MWFZbUhLRWpJMGY3MjdjQWJxRFRHNXVaQkhCandLLzNwL3puUVZRWHhCYgorMStFOUNpS2VGZFhqMkVscHRzbkR5b1R2clN3Si9KcXUxd2tYQmNINUVtYmc3YUpNb2QxSU9zNk9RQjFyUER2ZAorRkZhODR6YnFSTldIU3h4eFlaeGNCOFlaaW5MNi9kUUpuaXNLdTlMTVFkM0JCR3NHV3FIOFp6NXRFdlhqUzVLdgorM2c5SlJhN1FEa1NGMDA1eDZVK3EvNjc4RzJNRytXK05XcWplM05aeDlQc2gvUHRtK2grcTluMkdTdm5pYmlLNQorbUVqOUZJd0dxdUdwYlpVVEs1YVhIY0tONjU3ZEtpSUNzRUplTmFyMWlaem5SbXpyTWJaSitEeHFKblR3K0dBdgorN1liNjMvQ05BdHFTeGl5TkhHWjZOTTJaQTl2QUtZMUhYbjBSVkMweTErOUZtTnBTUnd2M3UvK3lkU0NuSm9uUgorR0VLanpPcU05RG43cXhkK2g0VW5uQTdoWFd4SVRhZ2VCNkc2S21maVhSeGhpV3lxdE9JQ2RDbmVDd3BxOFVaNAorZTBmbTA1TlJXNk0ybXFHUUhzTU5TdlRXZGR3ejViOHdndzRlVnNiK3hReXR4VmRqOWxwQnVCOUt5alFqeFVnVQorM29aeDRLeVdMb0VXamt6dFBBaUszdXY1R2ZvdE5JTWR6blJmT04xK3htMU01c3d0bjN5M1J1MWY2U1RaQzdTcAorcXZiRzdqUG1wQjVnTEVVcmkrY2h3K2FLVVliSjBiODIwT2Q0RkxRWW53TFdyNDZWZWxZbVY0NHh1UjA2d2dxUAorMUhjaE1Tc0h0UytabElpUVFVOWpoZHlUcmw4NkVRSEgzM2RoK1N1YThBaGZld1BSeTJWRnAzWmszNEFVc1djWAorRWZJWUdlbWhxVUQzZHJHMFNNVmJGRk5PYUZHcDllMHRRb3VZT0M2L3FGQnYvU05nUXozbUFFa2NpSlliVXVVWgorVjRZUVB2dGR2U3JJU1YwZTdiakZnZFNFakc3UDdGNkNGcldUcmpVbEhadVdqNi9ySjMrLzFQSGVKVml5aHNySgorWllGZTE0Vy80OFBEeEJSbDRJRUFteGNOMUViMkV6OWVDcXYwSFc3N0h2aUc2eklnbmtQcmhXSGpGR1VweEtrNAorakxmdUIyVGZxOUY3b3p2NEwyUUFuK0YveUt0MVJtMkhoNUo2MWVVSnRBVDYwcGFqZytnSnRqbXB1NVByNEhEbgorYjZwM3htWXdhTDVMZXQxekNBYmJNZmRsREsxNFlqZE9kTS9CRUtwWGI5eTRFSXViWDVBTVk0bGpYZUc5Z3grVAorQjFUdVFWZEowUDV3SUsvRDEwVFF6QVdES2FtMGt2M1JYaWRselJ4cFozc25Sbk4vTDNFVmQ1OFJudGoxT2MweQorRmlJaVNLUnN6RGJQektEeFFFMnNOZ1FjZE8yNEpOTFNhL3NaWXRxMmdSZ3NwbC9ZcUlEbzRaWXFpOXg4RjVPUworcmRQVTVEL0g4TFdSNHZwSkxMOERZckhoNXFGRzNCWDJPSkloUFJTKzQ4cERZdHJSanA3Uy8xWlU2NE9KQXl0aworOTloRHFTcm4xajJhNnlGRThMMlB0eis0VUNGMk9RWEVjOVJxcWViOFFFVXVNU2tOSDRvUStBMkY2dXpMcFppMAorWEg2NFIybmlOQzU2THhWMmkrM1Q1S1JFRkxhaHlrOGVwTFpsdjhZZHhZUjRTYjdKLzV5aW9vSzNnOWhtWVZLTworekxjPQorLS0tLS1FTkQgRU5DUllQVEVEIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0IGIvdGVzdC9rZXlzL2NsaWVudF92My5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3ZjE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9jbGllbnRfdjMuY3J0CkBAIC0wLDAgKzEsMjQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRUNEQ0NBdkNnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JzVEVMTUFrR0ExVUVCaE1DVlZNeAorRVRBUEJnTlZCQWdNQ0UxaGNubHNZVzVrTVJRd0VnWURWUVFIREF0R2IzSmxjM1FnU0dsc2JERW5NQ1VHQTFVRQorQ2d3ZVZHaGxJRUZ3WVdOb1pTQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXVNUll3RkFZRFZRUUxEQTFCY0dGagorYUdVZ1ZHaHlhV1owTVJJd0VBWURWUVFEREFsc2IyTmhiR2h2YzNReEpEQWlCZ2txaGtpRzl3MEJDUUVXRldSbAorZGtCMGFISnBablF1WVhCaFkyaGxMbTl5WnpBZUZ3MHhOakF5TWpJeE1UVTROREZhRncweU5EQTFNVEF4TVRVNAorTkRGYU1JR0xNUXN3Q1FZRFZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTQorQzBadmNtVnpkQ0JJYVd4c01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1aworWVhScGIyNHhGakFVQmdOVkJBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5egorZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTFowd2lRblhnNVFNWlpXdWdkLworTzN3b2F0eUh1Y3pKdUZTbVlpUkdXTHIzUHVnQit4dHZqeTByVGNFMk1OeC9iZHNWeHJhcENLQSt0TUZPUmJFbAorc0Y2amswSCtCN0J6R29Jd0hyNk44R1AxVk9vQTJlc3Joc05FejIyYUpJMDBWYUZURkU4Ry9xZ0ZjaWh5YVZXSAorWnNMYTNNYWtPekZVbU9CYVYydExCakNqYXpucVh3M2VvM1h3VUkwQmtnUzliOXZxWGpTY21mV1hEdzUrMWlzNAorYkNndW1HMnpqOUVwTHlwYzlxQ0dOS0ZCTzJZSWcwWHNJSUo4UnBybGlhbmpMNlA0TWZDNkdQT3lXNE5iWmFMZAorRVN2L2J1bXBWeXVWL0MveHFrUGFodk93QnVQRTFsb3haWlB4NlF2MzY4cW43U1ZOVlpPTHlYNzIyc3Bvb0E1RworNmNzQ0F3RUFBYU5QTUUwd0NRWURWUjBUQkFJd0FEQUxCZ05WSFE4RUJBTUNCZUF3TXdZRFZSMFJCQ3d3S29jRQorZndBQUFZY1FBQUFBQUFBQUFBQUFBQUFBQUFBQUFZY1FBQUFBQUFBQUFBQUFBUC8vZndBQUFUQU5CZ2txaGtpRworOXcwQkFRc0ZBQU9DQVFFQUJVRW1lUWtHL1BTOTM1ak1IRHJnLzV6bTRYMnhybkZ0bVR3YjBqZHhmYXU2ei83aAorQWJ4RDVpb3lZN0ZVVE5Dekk2U3lNbzl2Skp0WUNUQ3VFR3I4NEpqVDJSNzIzMno2MGs0YzF6L2F2MDFXM09ydgorRXhIZkFaOGxsaGtmdTAyMDlUNVRhSVlDQjdoREZqNUtEYnRhOGM2ZkVjd3RtbEhRV2ozTTMxbFNOc3I0WnRXVword09iaEszc3FUc09sdUhiaEtOd2xORWF0NDhsYk9RVUMxOUkxV2kzZEFTNm44bHIwbEVoZkdLdnF4dTBWaUFTUworTjFuTGZka1JFR3AzOWJZcEtnMG42RUZ3NWJZeVY0cUUzY25JZWRGSnA3TklPTS82eG5kSk1oL2M1bDZOMnV5WgordXBBclJRcHcvM2orSGtMMXg5YnMrOTAwUUswR0k2QXhnamJvcEE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL2NsaWVudF92My5rZXkgYi90ZXN0L2tleXMvY2xpZW50X3YzLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTg5ZjczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL2NsaWVudF92My5rZXkKQEAgLTAsMCArMSwyNyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJRXBBSUJBQUtDQVFFQXRuVENKQ2RlRGxBeGxsYTZCMzg3ZkNocTNJZTV6TW00VktaaUpFWll1dmMrNkFINworRzIrUExTdE53VFl3M0g5dDJ4WEd0cWtJb0Q2MHdVNUZzU1d3WHFPVFFmNEhzSE1hZ2pBZXZvM3dZL1ZVNmdEWgorNnl1R3cwVFBiWm9ralRSVm9WTVVUd2IrcUFWeUtISnBWWWRtd3RyY3hxUTdNVlNZNEZwWGEwc0dNS05yT2VwZgorRGQ2amRmQlFqUUdTQkwxdjIrcGVOSnlaOVpjUERuN1dLemhzS0M2WWJiT1AwU2t2S2x6Mm9JWTBvVUU3WmdpRAorUmV3Z2dueEdtdVdKcWVNdm8vZ3g4TG9ZODdKYmcxdGxvdDBSSy85dTZhbFhLNVg4TC9HcVE5cUc4N0FHNDhUVworV2pGbGsvSHBDL2ZyeXFmdEpVMVZrNHZKZnZiYXltaWdEa2JweXdJREFRQUJBb0lCQVFDSnB5VWhhYUlJWW5CRworNEQrUmtHZ3NqOEd2aDZhaDNqNTNmdC9rUmo2RE1DNEJsQjBDNGZPL1BFQjVXSTBjamZjdnB3bzRuT2FwSHlYNAorQVRtTElNZ2pYbjJtK0NTTTl3bzAxbUVibXJLV2QyME03bjk2Y1doR3dnOU12VkorUmRHazJLMGx3ajAyUG9XVworQmx0NTc2R1R1Tk4vK2orK1Evamlxc1h4YUxUTzAvV2orNGIyZ1FoM244STB1NmJrb2xETG9FUktJZHJMR0hIKworRlUzc2s4YnBVaEhtZWlVVGZ3d2NpK2p1aHRPWTllMzBBRXN0Nnhha0NIYnExbFJSeUVZUHRXTDdvTGRzNnl2MAorVUFLUDd3UzlZbDZkY2VrWFNGMVJacEIrZm92VFcrcVBZbjhhRXVrc2FNejB3Szk2RkNPalZOR1l4TXArWG52bAorc0t4NjNVWkJBb0dCQU9DYkNiSnRPMEhzZ0lhdXZDdkdaNTBhWjF2RHZRUmVDd3JpNGlvdXRFZzRKQ0FYSEVzWAorK2F4ejJKNWozVUVRaEdLcjBFWDlCRzZZYnhHVzBNbWpmM1F4ZVJCKzBXTHBNTVkyU0Z0OTNvQzJSMUFYOWwwSQoraDUwTzZ0WXY1U1htOTZwS3h3UnowMWQ4NG1DSmd3bi9HK2NaL0VKajRyZlpzTmJRc3Q2SlFGdnpBb0dCQU0vMQorZ0xWUXQ1bCtJSys2czY4RW5BREk2Nmk3Y0tlNnNqM3JGUlRhaFpKeEwydlkyOEo5RUIybUYvWEVnQVJTTkpRVgorWC9IOXpEcndLbTlNWDg3L2VDSDJuRWJjKzVxU0dwRFBRbTQ4MkM5RHFzTWl0eENLRDhiYmxlMUJscGpGYjhocgorUjBRM3Y1cTh1NXVvbUxCZHM1ZVVCZVJLTXR1OXRPTUE5S1JTREdqSkFvR0FGNDRLMlV4OVQyK1hGd2pTTVNFUQora3JoSEtLZUJkaWpLcmF5WG5XYmlmMFJyL1hXUEFRMFZvUkZSSVdORnUrSVlrQ1NHcGlCZnk1MXU0SUJaaXh2NworYk5zWFlEUjhqd3Yza29IMDJxdDduekgranBiRXZvTDdmZXdua3FqWk5qMWZzZHMvdmViTHZqd1puWmd1UnVrYgorS3dSZG9UVEtmUTkyYlVEYjBWekJoQ01DZ1lCN0grM09iRFhvQ1FjdFJDc3lpbFliR05wK0VreEc0b0M1ckQvVgorRXZSV21mRHJ0MytWalJwSGs1bElCOG1MeFdnZjdPL2JoTnF3WXBXZFErak4wKys2bkJvMjBvdWRIcmZmMlBhSgorOGpoRTg1bGM0MmJqd2ZwSlVLVlp6YVZ1V2ljdTBHVm5mR0pUS1Q4aWtCV25Cak5Zb1dsRG1ySzE2NEgzalE5TAorWXRDNkVRS0JnUUNhYkZYWEh4NWNJSjJYT200Sy9uVE9HN0NsdkQ4MHhhcHF5R3JvUWQ5RS9jSlVISFBwL3dRNAorYzFkTU81RVZpTTdKUnNLZnhrbDl2TTVvOUlNN3N3bFloNEVNRlNMSk5qemdPWTlYVmt2UWgwdUdiaUpPQk80ZgoraW5VdVduMVlXVWovSEZ0clQrME5vK2NZdlpWY01LckZBeTNLL0F3cFRiZktDazZyb3VsbE5BPT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0L2tleXMvc2VydmVyLmNydCBiL3Rlc3Qva2V5cy9zZXJ2ZXIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNWVmM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tleXMvc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rZXlzL3NlcnZlci5rZXkgYi90ZXN0L2tleXMvc2VydmVyLmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNjZmNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9rZXlzL3NlcnZlci5rZXkKQEAgLTAsMCArMSwyOCBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIucDEyIGIvdGVzdC9rZXlzL3NlcnZlci5wMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MDhhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIucDEyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtIGIvdGVzdC9rZXlzL3NlcnZlci5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1YTlmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3Qva2V5cy9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsNTMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRU56Q0NBeCtnQXdJQkFnSUpBT1lmWWZ3N05DT2NNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3hNUXN3Q1FZRAorVlFRR0V3SlZVekVSTUE4R0ExVUVDQXdJVFdGeWVXeGhibVF4RkRBU0JnTlZCQWNNQzBadmNtVnpkQ0JJYVd4cworTVNjd0pRWURWUVFLREI1VWFHVWdRWEJoWTJobElGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhGakFVQmdOVgorQkFzTURVRndZV05vWlNCVWFISnBablF4RWpBUUJnTlZCQU1NQ1d4dlkyRnNhRzl6ZERFa01DSUdDU3FHU0liMworRFFFSkFSWVZaR1YyUUhSb2NtbG1kQzVoY0dGamFHVXViM0puTUI0WERURTBNRFF3TnpFNE5UZ3dNRm9YRFRJeQorTURZeU5ERTROVGd3TUZvd2diRXhDekFKQmdOVkJBWVRBbFZUTVJFd0R3WURWUVFJREFoTllYSjViR0Z1WkRFVQorTUJJR0ExVUVCd3dMUm05eVpYTjBJRWhwYkd3eEp6QWxCZ05WQkFvTUhsUm9aU0JCY0dGamFHVWdVMjltZEhkaAorY21VZ1JtOTFibVJoZEdsdmJqRVdNQlFHQTFVRUN3d05RWEJoWTJobElGUm9jbWxtZERFU01CQUdBMVVFQXd3SgorYkc5allXeG9iM04wTVNRd0lnWUpLb1pJaHZjTkFRa0JGaFZrWlhaQWRHaHlhV1owTG1Gd1lXTm9aUzV2Y21jdworZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FFOVRFOXdFWHA1TFJ0TFFWRFNHUQorR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3lTTjhJMlh3NgorTDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0hqS05nNlpLZworMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUJHbVptTUlVdworQWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGt1NjJMaXBrWAord0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG10cmhWUUY0bgorQWdNQkFBR2pVREJPTUIwR0ExVWREZ1FXQkJRbzh2MHd6UVB4M0VFZXhKUEdseFBLMVBwZ0tqQWZCZ05WSFNNRQorR0RBV2dCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFNQmdOVkhSTUVCVEFEQVFIL01BMEdDU3FHU0liMworRFFFQkJRVUFBNElCQVFCR0ZSaUpzbGNYMGFKa3dacHpUd1NVZGdjZkticHZORWJDTnRWb2hmUVZUSTRhL29ONQorVSt5cURaSmczdk9hT3VpQVpxeUhjSWxaOHF5ZXNDZ1JOMzE0VGw0L0pRKytDVzhtS2oxbWVUZ281WUZ4Y1pZbQorVDl2c0kzQytOem44NERJTmdJOW14NnlrdEl0M1FPS1pSRHB6eVBrVXp4c3lKOEo0MjdEYWltRHJqVFIrZlR3RAorMURoMDl4ZWVNblNhNXplVjFIRUR5SlRxQ1h1dExldHdRL0l5Zm1NQmhJeCtudkI1ZjY3cHovbStEdjZWMHIzSQorcDRIQ2NkbkRVREdKYmZxdG9xc0FBVFFRV08rV1d1c3dCNm1PaERidlBUeGhScFpxNkFrZ1dxdjRTK3UzTTJHTworcjVwOUZyQmdhdkF3NWJLTzU0QzBvUUtwTi81ZnRhNWw2V3MwCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUV2QUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktZd2dnU2lBZ0VBQW9JQkFRQ3FFOVRFOXdFWHA1TFIKK3RMUVZEU0dRR1Y3OCs3WnRQL0kvWmFKNlE2WkdsZnhERnZaakZGNzNzZU5oQXZsS2xZbS9qZmxJSFlMbk5PQ3kKK1NOOEkyWHc2TDlNYkMranZ3a0VLZlFvNGVEb3habk9aak5GNUoxL2xadEJlT293TWtoaHpCTUgxUmRzMzUxL0gKK2pLTmc2WktnMkNsZGQwajdIYkR0RWl4T0xnTGJQUnBCY2FZckxyTk1hc2YzSGFsK3g4L2I4dWUyOHg5M0hTUUIKK0dtWm1NSVV3QWluRXUvZk5QNGxMR2wvMGtaYjc2VG55UnBZU1BZb2p0UzZDbmtIK1FMWW5zUlJFWEpZd0QxWGsKK3U2MkxpcGtYd0NrUlRuWjVuVXNETVg2RlBLZ2pRRlFDV0RYRy9OMDk2K1BSVVFBQ2hoclhzSitnRjNOcVd0RG0KK3RyaFZRRjRuQWdNQkFBRUNnZ0VBVy95NTJZWVc2eXBST0diWjk0RFFwRlYwa0xPN3FUOHEwS3N4dzVzUE5hSXQKK2ZFUFJJeW1EYThpa3lIV0pTNU94bXc4NHdvNWpuSlYyNmphTG13ZTJMdXBxN1hmMWxxZWo4ZjVMSnR1djdjUVIKK3hmenAxdk02NUtKRkZKSHA2V3FqR3FKNkhTU1pPcFZEc25RWWNYUWpRQ2RweUFtYVNXZDNwK0ZxWVNaMW1RbUQKK2JGTkk3anFwY3pXU1poVGRvdFE3cDdIbjlUVkNlaGZsUDN5R0lCM2JRK3dDY0NCODVkT0J6MjAxTCtZZ2FJY2sKK1N6NDNBNE52V2FRSVJMUkR3N3M5R1c0alk1VDBKdjI4MldJZUFsVnBWeExJd3U0OHI0UjR5R1RJeDlZZG93dnEKKzU3K1k1aVBQakFYeHUwVjl0MDBvUzNiWXhEYUtoMkRVZmMvNXpvd3E4UUtCZ1FEWU5WUFhtYUcwYUlINHZqUTkKKzdmUmR3L1VEa1ljUWJuNkNuZ2xRT3U3Ny9TOG9nUXpwS0NWSmdKZ2taTnFPVnRRTUVQemVrR0VjTFRiamUxZ1UKKzhCa3kyaytQTDlVd2JGeTBlbW5PVmg0cnFyTlhIc1J2SmNlaE5UL1BSYjVoakYzTVVNRlYvMGlENGIrbmFGYUUKK2pyU1dpWjJaWGoycWZ3QUs1MkdGYnRPdUJRS0JnUURKWVF1R2lZMHIyMkU0d2FKbUNTS2N6b0JUM2N3bFZ6V2oKK1YybGpnQTlSSExOVFZrdk5OWVFMR3UycW5nRnJ0d3BlYVNuc01EZXJWRzR3S0FRV3lDbll6eFZybG5DNHVEckoKK0hYdUZFbHRCV2k5RmZiZ2ZzbmQzNzQ5QVQwb0JQMU5UMnRNbGVndXlmNURGZ2pDUjNWUkpMZHJWYWFaOHJvdy8KK0xxS2NGTXFuT3dLQmdCK09JTzk5bDdFNTg0WTNWRzZaZFNuZU9MdE5tUlhYMnBUN3RjWkU0NjVaZEhHSDdEZDMKK1NZSGh4OUsvK1huK3lESCtwTGxpL3hsYXJBRWxkbVNQNmsyV3VUZmZ0bEM3OEFmVE9mQUlkNXpON0NEUjk3OTEKK0Z4NjdJOVgvaXRxMzN0UzhFSXVabDU3UDZ1WG0vNEdYUmxvV09hOHhwdlJrVnNCQXB1WVBsOHQxQW9HQVRRRFMKK3kyc2xsRE9iQlh6bGdHYlYyV2dOSWdTWjMxMXRvVHYzakppWFFzamF1Vzh5SlJIbG4rbDRIOW16YVdEZ2tpRmMKK2FuZzFrVW9EcUY1azBlRlFQeHRRY1lkaEt3RW5XV2Z3cDMzUmJ6ZnhBMzJEUG51YnV6emJaaGZya0hhS2duSVcKK2N5b3I5dUZZbG0ybDdPRFpMZkplejJSS3lUcGxYbk9Tc21RdzZha0NnWUF6M2RqOUhza3lqK0hWSitodDFPY0UKK2M3YWkvRVNrU0E3VmFqcDB0akpwMEVLalcvenE4RHZVU1hPdGNkbkpna0t5Y0ZsdUx3Ym1uYU40dHhCZHMxQzEKK1FyOFJ0MnNVQ0NCTlplMUw2REhlM1hCZGJrSmU5c2daVk5UanRVU1Fyenk4VWh2c0NxRzRZV2VDdTA3U3pjYmMKK3JkUFVWOS91UWtkeDhWclNoeGxEOEE9PQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjJhZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KQEAgLTAsMCArMSw0OTQgQEAKK1sKKyAgImNfZ2xpYi1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpY19mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfZnJhbWVkLWlwIiwKKyAgImNsLWdvX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1nb19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImNsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImNsLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWRhcnRfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19qc29uX2h0dHAtaXAiLAorICAiY3BwLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWdvX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImNwcC1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcCIsCisgICJjcHAtamF2YV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfanNvbl9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfanNvbl9odHRwLWlwIiwKKyAgImNwcC1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aS1tdWx0aWFfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWMtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWNvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aWgtaGVhZGVyX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2hlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcCIsCisgICJjcHAtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1hY2NlbGNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtbXVsdGlhY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWgtaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWotanNvbl9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwLXNzbCIsCisgICJjcHAtcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY3BwLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jbF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1jbF9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtY3BwX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1jcHBfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1jcHBfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1jcHBfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1jcHBfanNvbl9mcmFtZWQtaXAiLAorICAiZC1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY3BwX2pzb25faHR0cC1pcCIsCisgICJkLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJkLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZF9qc29uX2h0dHAtaXAiLAorICAiZC1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJkLWdvX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgImQtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWdvX2pzb25faHR0cC1pcCIsCisgICJkLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZC1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImQtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtanNfanNvbl9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1ub2RlanNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1ub2RlanNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1ub2RlanNfanNvbl9mcmFtZWQtaXAiLAorICAiZC1ub2RlanNfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2pzb25faHR0cC1pcCIsCisgICJkLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImQtbm9kZXRzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImQtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5M19iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtcHkzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHkzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHkzX2pzb25fZnJhbWVkLWlwIiwKKyAgImQtcHkzX2pzb25fZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19qc29uX2h0dHAtaXAiLAorICAiZC1weTNfanNvbl9odHRwLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJkLXB5X2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImQtcHlfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJkLXB5X2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiZC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImQtcHlfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImQtcHlfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJkLXB5X2pzb25fYnVmZmVyZWQtaXAiLAorICAiZC1weV9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJkLXB5X2pzb25fZnJhbWVkLWlwIiwKKyAgImQtcHlfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfanNvbl9odHRwLWlwIiwKKyAgImQtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJlcmwtY3BwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtY3BwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNzaGFycF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiZXJsLWNzaGFycF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtbm9kZXRzX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKKyAgImVybC1yYl9iaW5hcnlfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJlcmwtcmJfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAorICAiZXJsLXJiX2NvbXBhY3RfZnJhbWVkLWlwIiwKKyAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZ28tY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJnby1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJnby1jcHBfanNvbl9odHRwLWlwIiwKKyAgImdvLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tZF9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWRfanNvbl9odHRwLWlwIiwKKyAgImdvLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgImdvLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgImdvLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAiZ28tamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiZ28tamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAiZ28tamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImdvLWphdmFfanNvbl9odHRwLWlwIiwKKyAgImdvLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJnby1weTNfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5M19jb21wYWN0LWFjY2VsY196bGliLWlwLXNzbCIsCisgICJnby1weV9iaW5hcnktYWNjZWxfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiaHMtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJocy1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAiLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9idWZmZXJlZC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtZG9tYWluIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZ29fYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZ29fY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1nb19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1oc19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWhzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWphdmFfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWpzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5M19qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAicGVybC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJwZXJsLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHktY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWNwcF9oZWFkZXJfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2pzb25faHR0cC1pcCIsCisgICJweS1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1kX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHktZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktZF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfanNvbl9odHRwLWlwIiwKKyAgInB5LWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRhcnRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kYXJ0X2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRhcnRfanNvbl9odHRwLWlwIiwKKyAgInB5LWhzX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktaHNfYmluYXJ5X2h0dHAtaXAiLAorICAicHktaHNfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5LWhzX2pzb25faHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAicHktamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwIiwKKyAgInB5LWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJweS1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktbHVhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHktbHVhX2pzb25faHR0cC1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwIiwKKyAgInB5My1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcC1zc2wiLAorICAicHkzLWNwcF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtY3BwX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9oZWFkZXJfaHR0cC1pcCIsCisgICJweTMtY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2pzb25faHR0cC1pcCIsCisgICJweTMtY3BwX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1kX2pzb25faHR0cC1pcCIsCisgICJweTMtZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1kYXJ0X2FjY2VsLWJpbmFyeV9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJweTMtaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWhzX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWhzX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1oc19qc29uX2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgInB5My1qYXZhX2pzb25faHR0cC1pcCIsCisgICJweTMtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5My1sdWFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWx1YV9qc29uX2h0dHAtaXAiLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtZG9tYWluIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWlwIiwKKyAgInJiLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtZG9tYWluIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1pcCIsCisgICJyYi1jcHBfanNvbl9mcmFtZWQtaXAtc3NsIgorXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL01ha2VmaWxlLmFtIGIvdGVzdC9sdWEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4YzVhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCisjIFJlbW92ZSAiTWFwVHlwZSA9IiBsaW5lIHRvIGlnbm9yZSBzb21lIG1hcCBidWcgZm9yIG5vdworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorCSQoVEhSSUZUKSAtLWdlbiBsdWEgJDwKKwkkKFNFRCkgLWkuYmFrICdzL01hcFR5cGUgPS8vZycgZ2VuLWx1YS9UaHJpZnRUZXN0X3R0eXBlcy5sdWEKKwkkKFJNKSBnZW4tbHVhL1RocmlmdFRlc3RfdHR5cGVzLmx1YS5iYWsKKworcHJlY3Jvc3M6IHN0dWJzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1sdWEKZGlmZiAtLWdpdCBhL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YSBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfY2xpZW50Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Q4ZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9sdWEvdGVzdF9iYXNpY19jbGllbnQubHVhCkBAIC0wLDAgKzEsMTc5IEBACistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKy0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCistLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCistLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCistLSB1bmRlciB0aGUgTGljZW5zZS4KKworCityZXF1aXJlKCdUU29ja2V0JykKK3JlcXVpcmUoJ1RCdWZmZXJlZFRyYW5zcG9ydCcpCityZXF1aXJlKCdURnJhbWVkVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RIdHRwVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RDb21wYWN0UHJvdG9jb2wnKQorcmVxdWlyZSgnVEpzb25Qcm90b2NvbCcpCityZXF1aXJlKCdUQmluYXJ5UHJvdG9jb2wnKQorcmVxdWlyZSgnVGhyaWZ0VGVzdF9UaHJpZnRUZXN0JykKK3JlcXVpcmUoJ2xpYmx1YWxvbmdudW1iZXInKQorCitsb2NhbCBjbGllbnQKKworZnVuY3Rpb24gdGVhcmRvd24oKQorICBpZiBjbGllbnQgdGhlbgorICAgIC0tIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgICAgY2xpZW50OmNsb3NlKCkKKyAgZW5kCitlbmQKKworZnVuY3Rpb24gcGFyc2VBcmdzKHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHsKKyAgICBwcm90b2NvbD0nYmluYXJ5JywKKyAgICB0cmFuc3BvcnQ9J2J1ZmZlcmVkJywKKyAgICBwb3J0PSc5MDkwJywKKyAgfQorICBmb3IgaSwgc3RyIGluIHBhaXJzKHJhd0FyZ3MpIGRvCisgICAgaWYgaSA+IDAgdGhlbgorICAgICAgaywgdiA9IHN0cmluZy5tYXRjaChzdHIsICctLSgldyspPSgldyspJykKKyAgICAgIGFzc2VydChvcHRba10gfj0gbmlsLCAnVW5rbm93biBhcmd1bWVudCcpCisgICAgICBvcHRba10gPSB2CisgICAgZW5kCisgIGVuZAorICByZXR1cm4gb3B0CitlbmQKKworZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsMSwgdmFsMiwgbXNnKQorICBhc3NlcnQodmFsMSA9PSB2YWwyLCBtc2cpCitlbmQKKworZnVuY3Rpb24gdGVzdEJhc2ljQ2xpZW50KHJhd0FyZ3MpCisgIGxvY2FsIG9wdCA9IHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBzb2NrZXQgPSBUU29ja2V0Om5ld3sKKyAgICBwb3J0ID0gdG9udW1iZXIob3B0LnBvcnQpCisgIH0KKyAgYXNzZXJ0KHNvY2tldCwgJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50IHNvY2tldCcpCisgIHNvY2tldDpzZXRUaW1lb3V0KDUwMDApCisKKyAgbG9jYWwgdHJhbnNwb3J0cyA9IHsKKyAgICBidWZmZXJlZCA9IFRCdWZmZXJlZFRyYW5zcG9ydCwKKyAgICBmcmFtZWQgPSBURnJhbWVkVHJhbnNwb3J0LAorICAgIGh0dHAgPSBUSHR0cFRyYW5zcG9ydCwKKyAgfQorICBhc3NlcnQodHJhbnNwb3J0c1tvcHQudHJhbnNwb3J0XSB+PSBuaWwpCisgIGxvY2FsIHRyYW5zcG9ydCA9IHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF06bmV3eworICAgIHRyYW5zID0gc29ja2V0LAorICAgIGlzU2VydmVyID0gZmFsc2UKKyAgfQorCisgIGxvY2FsIHByb3RvY29scyA9IHsKKyAgICBiaW5hcnkgPSBUQmluYXJ5UHJvdG9jb2wsCisgICAgY29tcGFjdCA9IFRDb21wYWN0UHJvdG9jb2wsCisgICAganNvbiA9IFRKU09OUHJvdG9jb2wsCisgIH0KKyAgYXNzZXJ0KHByb3RvY29sc1tvcHQucHJvdG9jb2xdIH49IG5pbCkKKyAgbG9jYWwgcHJvdG9jb2wgPSBwcm90b2NvbHNbb3B0LnByb3RvY29sXTpuZXd7CisgICAgdHJhbnMgPSB0cmFuc3BvcnQKKyAgfQorICBhc3NlcnQocHJvdG9jb2wsICdGYWlsZWQgdG8gY3JlYXRlIGJpbmFyeSBwcm90b2NvbCcpCisKKyAgY2xpZW50ID0gVGhyaWZ0VGVzdENsaWVudDpuZXd7CisgICAgcHJvdG9jb2wgPSBwcm90b2NvbAorICB9CisgIGFzc2VydChjbGllbnQsICdGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCcpCisKKyAgLS0gT3BlbiB0aGUgdHJhbnNwb3J0CisgIGxvY2FsIHN0YXR1cywgXyA9IHBjYWxsKHRyYW5zcG9ydC5vcGVuLCB0cmFuc3BvcnQpCisgIGFzc2VydChzdGF0dXMsICdGYWlsZWQgdG8gY29ubmVjdCB0byBzZXJ2ZXInKQorCisgIC0tIFN0cmluZworICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdFN0cmluZygnbGFsYScpLCAgJ2xhbGEnLCAgJ0ZhaWxlZCB0ZXN0U3RyaW5nJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RTdHJpbmcoJ3dhaG9vJyksICd3YWhvbycsICdGYWlsZWQgdGVzdFN0cmluZycpCisKKyAgLS0gQm9vbAorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJvb2wodHJ1ZSksIHRydWUsICdGYWlsZWQgdGVzdEJvb2wgdHJ1ZScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qm9vbChmYWxzZSksIGZhbHNlLCAnRmFpbGVkIHRlc3RCb29sIGZhbHNlJykKKworICAtLSBCeXRlCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDAxKSwgMSwgICAgJ0ZhaWxlZCB0ZXN0Qnl0ZSAxJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4NDApLCA2NCwgICAnRmFpbGVkIHRlc3RCeXRlIDInKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHg3ZiksIDEyNywgICdGYWlsZWQgdGVzdEJ5dGUgMycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgweDgwKSwgLTEyOCwgJ0ZhaWxlZCB0ZXN0Qnl0ZSA0JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDB4YmYpLCAtNjUsICAnRmFpbGVkIHRlc3RCeXRlIDUnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEJ5dGUoMHhmZiksIC0xLCAgICdGYWlsZWQgdGVzdEJ5dGUgNicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0Qnl0ZSgxMjgpLCAtMTI4LCAgJ0ZhaWxlZCB0ZXN0Qnl0ZSA3JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RCeXRlKDI1NSksIC0xLCAgICAnRmFpbGVkIHRlc3RCeXRlIDgnKQorCisgIC0tIEkzMgorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDAwMDAwMDAxKSwgMSwgICAgICAgICAgICdGYWlsZWQgdGVzdEkzMiAxJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHg0MDAwMDAwMCksIDEwNzM3NDE4MjQsICAnRmFpbGVkIHRlc3RJMzIgMicpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4N2ZmZmZmZmYpLCAyMTQ3NDgzNjQ3LCAgJ0ZhaWxlZCB0ZXN0STMyIDMnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigweDgwMDAwMDAwKSwgLTIxNDc0ODM2NDgsICdGYWlsZWQgdGVzdEkzMiA0JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoMHhiZmZmZmZmZiksIC0xMDczNzQxODI1LCAnRmFpbGVkIHRlc3RJMzIgNScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STMyKDB4ZmZmZmZmZmYpLCAtMSwgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STMyIDYnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEkzMigyMTQ3NDgzNjQ4KSwgLTIxNDc0ODM2NDgsICdGYWlsZWQgdGVzdEkzMiA3JykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJMzIoNDI5NDk2NzI5NSksIC0xLCAgICAgICAgICAnRmFpbGVkIHRlc3RJMzIgOCcpCisKKyAgLS0gSTY0IChsdWEgb25seSBzdXBwb3J0cyAxNiBkZWNpbWFsIHByZWNpc2lvbiBzbyBsYXJnZXIgbnVtYmVycyBhcmUKKyAgLS0gaW5pdGlhbGl6ZWQgYnkgdGhlaXIgc3RyaW5nIHZhbHVlKQorICBsb2NhbCBsb25nID0gbGlibHVhbG9uZ251bWJlci5uZXcKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygweDAwMDAwMDAwMDAwMDAwMDEpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKDEpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCAxJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygweDQwMDAwMDAwMDAwMDAwMDApKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKDQ2MTE2ODYwMTg0MjczODc5MDQpLAorICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdGVzdEk2NCAyJykKKyAgYXNzZXJ0RXF1YWwoY2xpZW50OnRlc3RJNjQobG9uZygnMHg3ZmZmZmZmZmZmZmZmZmZmJykpLAorICAgICAgICAgICAgICAgICAgIGxvbmcoJzkyMjMzNzIwMzY4NTQ3NzU4MDcnKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgMycpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoMHg4MDAwMDAwMDAwMDAwMDAwKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygtOTIyMzM3MjAzNjg1NDc3NTgwOCksCisgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0ZXN0STY0IDQnKQorICBhc3NlcnRFcXVhbChjbGllbnQ6dGVzdEk2NChsb25nKCcweGJmZmZmZmZmZmZmZmZmZmYnKSksCisgICAgICAgICAgICAgICAgICAgbG9uZygnLTQ2MTE2ODYwMTg0MjczODc5MDUnKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgNScpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0STY0KGxvbmcoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKSwKKyAgICAgICAgICAgICAgICAgICBsb25nKC0xKSwKKyAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRlc3RJNjQgNicpCisKKyAgLS0gRG91YmxlCisgIGFzc2VydEVxdWFsKAorICAgICAgY2xpZW50OnRlc3REb3VibGUoMS4yMzQ1Njc4OSksIDEuMjM0NTY3ODksICdGYWlsZWQgdGVzdERvdWJsZSAxJykKKyAgYXNzZXJ0RXF1YWwoCisgICAgICBjbGllbnQ6dGVzdERvdWJsZSgwLjEyMzQ1Njc4OSksIDAuMTIzNDU2Nzg5LCAnRmFpbGVkIHRlc3REb3VibGUgMicpCisgIGFzc2VydEVxdWFsKAorICAgICAgY2xpZW50OnRlc3REb3VibGUoMC4xMjM0NTY3ODkpLCAwLjEyMzQ1Njc4OSwgJ0ZhaWxlZCB0ZXN0RG91YmxlIDMnKQorCisgIC0tIFRPRE8gdGVzdEJpbmFyeSgpIC4uLgorCSAgCisgIC0tIEFjY3VyYWN5IG9mIDE2IGRlY2ltYWwgZGlnaXRzIChyb3VuZHMpCisgIGxvY2FsIGEsIGIgPSAxLjEyMzQ1Njc4OTA2NjY2NjYzLCAxLjEyMzQ1Njc4OTA2NjY2NjYxCisgIGFzc2VydEVxdWFsKGEsIGIpCisgIGFzc2VydEVxdWFsKGNsaWVudDp0ZXN0RG91YmxlKGEpLCBiLCAnRmFpbGVkIHRlc3REb3VibGUgNScpCisKKyAgLS0gU3RydWN0CisgIGxvY2FsIG8gPSBYdHJ1Y3Q6bmV3eworICAgIHN0cmluZ190aGluZyA9ICdaZXJvJywKKyAgICBieXRlX3RoaW5nID0gMSwKKyAgICBpMzJfdGhpbmcgPSAtMywKKyAgICBpNjRfdGhpbmcgPSBsb25nKC01KQorICB9CisgIGxvY2FsIHIgPSBjbGllbnQ6dGVzdFN0cnVjdChvKQorICBhc3NlcnRFcXVhbChvLnN0cmluZ190aGluZywgci5zdHJpbmdfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCAxJykKKyAgYXNzZXJ0RXF1YWwoby5ieXRlX3RoaW5nLCByLmJ5dGVfdGhpbmcsICdGYWlsZWQgdGVzdFN0cnVjdCAyJykKKyAgYXNzZXJ0RXF1YWwoby5pMzJfdGhpbmcsIHIuaTMyX3RoaW5nLCAnRmFpbGVkIHRlc3RTdHJ1Y3QgMycpCisgIGFzc2VydEVxdWFsKG8uaTY0X3RoaW5nLCByLmk2NF90aGluZywgJ0ZhaWxlZCB0ZXN0U3RydWN0IDQnKQorCisgIC0tIFRPRE8gYWRkIGxpc3QgbWFwIHNldCBleGNlcHRpb24gZXRjIGV0YworZW5kCisKK3Rlc3RCYXNpY0NsaWVudChhcmcpCit0ZWFyZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEgYi90ZXN0L2x1YS90ZXN0X2Jhc2ljX3NlcnZlci5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkMmQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbHVhL3Rlc3RfYmFzaWNfc2VydmVyLmx1YQpAQCAtMCwwICsxLDE0MiBAQAorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCistLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlcXVpcmUoJ1RocmlmdFRlc3RfVGhyaWZ0VGVzdCcpCityZXF1aXJlKCdUU29ja2V0JykKK3JlcXVpcmUoJ1RCdWZmZXJlZFRyYW5zcG9ydCcpCityZXF1aXJlKCdURnJhbWVkVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RIdHRwVHJhbnNwb3J0JykKK3JlcXVpcmUoJ1RDb21wYWN0UHJvdG9jb2wnKQorcmVxdWlyZSgnVEpzb25Qcm90b2NvbCcpCityZXF1aXJlKCdUQmluYXJ5UHJvdG9jb2wnKQorcmVxdWlyZSgnVFNlcnZlcicpCityZXF1aXJlKCdsaWJsdWFsb25nbnVtYmVyJykKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEhhbmRsZXIKK1Rlc3RIYW5kbGVyID0gVGhyaWZ0VGVzdElmYWNlOm5ld3t9CisKKy0tIFN0b3BzIHRoZSBzZXJ2ZXIKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RWb2lkKCkKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0U3RyaW5nKHN0cikKKyAgcmV0dXJuIHN0cgorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCb29sKGJvb2wpCisgIHJldHVybiBib29sCitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdEJ5dGUoYnl0ZSkKKyAgcmV0dXJuIGJ5dGUKK2VuZAorCitmdW5jdGlvbiBUZXN0SGFuZGxlcjp0ZXN0STMyKGkzMikKKyAgcmV0dXJuIGkzMgorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RJNjQoaTY0KQorICByZXR1cm4gaTY0CitlbmQKKworZnVuY3Rpb24gVGVzdEhhbmRsZXI6dGVzdERvdWJsZShkKQorICByZXR1cm4gZAorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RCaW5hcnkoYnkpCisgIHJldHVybiBieQorZW5kCisKK2Z1bmN0aW9uIFRlc3RIYW5kbGVyOnRlc3RTdHJ1Y3QodGhpbmcpCisgIHJldHVybiB0aGluZworZW5kCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUZXN0Citsb2NhbCBzZXJ2ZXIKKworZnVuY3Rpb24gdGVhcmRvd24oKQorICBpZiBzZXJ2ZXIgdGhlbgorICAgIHNlcnZlcjpjbG9zZSgpCisgIGVuZAorZW5kCisKK2Z1bmN0aW9uIHBhcnNlQXJncyhyYXdBcmdzKQorICBsb2NhbCBvcHQgPSB7CisgICAgcHJvdG9jb2w9J2JpbmFyeScsCisgICAgdHJhbnNwb3J0PSdidWZmZXJlZCcsCisgICAgcG9ydD0nOTA5MCcsCisgIH0KKyAgZm9yIGksIHN0ciBpbiBwYWlycyhyYXdBcmdzKSBkbworICAgIGlmIGkgPiAwIHRoZW4KKyAgICAgIGssIHYgPSBzdHJpbmcubWF0Y2goc3RyLCAnLS0oJXcrKT0oJXcrKScpCisgICAgICBhc3NlcnQob3B0W2tdIH49IG5pbCwgJ1Vua25vd24gYXJndW1lbnQnKQorICAgICAgb3B0W2tdID0gdgorICAgIGVuZAorICBlbmQKKyAgcmV0dXJuIG9wdAorZW5kCisKK2Z1bmN0aW9uIHRlc3RCYXNpY1NlcnZlcihyYXdBcmdzKQorICBsb2NhbCBvcHQgPSBwYXJzZUFyZ3MocmF3QXJncykKKyAgLS0gSGFuZGxlciAmIFByb2Nlc3NvcgorICBsb2NhbCBoYW5kbGVyID0gVGVzdEhhbmRsZXI6bmV3e30KKyAgYXNzZXJ0KGhhbmRsZXIsICdGYWlsZWQgdG8gY3JlYXRlIGhhbmRsZXInKQorICBsb2NhbCBwcm9jZXNzb3IgPSBUaHJpZnRUZXN0UHJvY2Vzc29yOm5ld3sKKyAgICBoYW5kbGVyID0gaGFuZGxlcgorICB9CisgIGFzc2VydChwcm9jZXNzb3IsICdGYWlsZWQgdG8gY3JlYXRlIHByb2Nlc3NvcicpCisKKyAgLS0gU2VydmVyIFNvY2tldAorICBsb2NhbCBzb2NrZXQgPSBUU2VydmVyU29ja2V0Om5ld3sKKyAgICBwb3J0ID0gb3B0LnBvcnQKKyAgfQorICBhc3NlcnQoc29ja2V0LCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0JykKKworICAtLSBUcmFuc3BvcnQgJiBGYWN0b3J5CisgIGxvY2FsIHRyYW5zcG9ydHMgPSB7CisgICAgYnVmZmVyZWQgPSBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIGZyYW1lZCA9IFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LAorICAgIGh0dHAgPSBUSHR0cFRyYW5zcG9ydEZhY3RvcnksCisgIH0KKyAgYXNzZXJ0KHRyYW5zcG9ydHNbb3B0LnRyYW5zcG9ydF0sICdGYWlsZWQgdG8gY3JlYXRlIGZyYW1lZCB0cmFuc3BvcnQgZmFjdG9yeScpCisgIGxvY2FsIHRyYW5zX2ZhY3RvcnkgPSB0cmFuc3BvcnRzW29wdC50cmFuc3BvcnRdOm5ld3t9CisgIGxvY2FsIHByb3RvY29scyA9IHsKKyAgICBiaW5hcnkgPSBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5LAorICAgIGNvbXBhY3QgPSBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSwKKyAgICBqc29uID0gVEpTT05Qcm90b2NvbEZhY3RvcnksCisgIH0KKyAgbG9jYWwgcHJvdF9mYWN0b3J5ID0gcHJvdG9jb2xzW29wdC5wcm90b2NvbF06bmV3e30KKyAgYXNzZXJ0KHByb3RfZmFjdG9yeSwgJ0ZhaWxlZCB0byBjcmVhdGUgYmluYXJ5IHByb3RvY29sIGZhY3RvcnknKQorCisgIC0tIFNpbXBsZSBTZXJ2ZXIKKyAgc2VydmVyID0gVFNpbXBsZVNlcnZlcjpuZXd7CisgICAgcHJvY2Vzc29yID0gcHJvY2Vzc29yLAorICAgIHNlcnZlclRyYW5zcG9ydCA9IHNvY2tldCwKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gdHJhbnNfZmFjdG9yeSwKKyAgICBwcm90b2NvbEZhY3RvcnkgPSBwcm90X2ZhY3RvcnkKKyAgfQorICBhc3NlcnQoc2VydmVyLCAnRmFpbGVkIHRvIGNyZWF0ZSBzZXJ2ZXInKQorCisgIC0tIFNlcnZlCisgIHNlcnZlcjpzZXJ2ZSgpCisgIHNlcnZlciA9IG5pbAorZW5kCisKK3Rlc3RCYXNpY1NlcnZlcihhcmcpCit0ZWFyZG93bigpCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvVGhyaWZ0VGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNmFmMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwzMSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5DbGllbnQ8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XaW5IdHRwSGFuZGxlciIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5UaHJlYWRpbmciIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSImcXVvdDskKFBhdGhUb1RocmlmdCkmcXVvdDsgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTM5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0VGVzdDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcGxpdCBtb2RlIGFuZCBvcHRpb25zCisgICAgICAgICAgICB2YXIgc3ViQXJncyA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoc3ViQXJncy5Db3VudCA+IDApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGZpcnN0QXJnID0gc3ViQXJnc1swXTsKKyAgICAgICAgICAgICAgICBzdWJBcmdzLlJlbW92ZUF0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBydW4gd2hhdGV2ZXIgbW9kZSBpcyBjaG9vc2VuCisgICAgICAgICAgICBzd2l0Y2goZmlyc3RBcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiY2xpZW50IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RDbGllbnQuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgICAgICBjYXNlICItLWhlbHAiOgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzYWdlOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgQ2xpZW50ICBjbGllbnQgIFtvcHRpb25zXSciKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgLS1oZWxwIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisKKyAgICAgICAgICAgIFRlc3RDbGllbnQuUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzE1MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJCMEMxM0RBMC0zMTE3LTQ4NDQtOEFFOC1CMTc3NUU0NjIyM0QiKV0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTE5OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50L1Rlc3RDbGllbnQuY3MKQEAgLTAsMCArMSw5NDMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkF1dGhlbnRpY2F0aW9uOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgcHVibGljIGNsYXNzIFRlc3RDbGllbnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY2xhc3MgVGVzdFBhcmFtcworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bUl0ZXJhdGlvbnMgPSAxOworICAgICAgICAgICAgcHVibGljIElQQWRkcmVzcyBob3N0ID0gSVBBZGRyZXNzLkFueTsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcG9ydCA9IDkwOTA7CisgICAgICAgICAgICBwdWJsaWMgaW50IG51bVRocmVhZHMgPSAxOworICAgICAgICAgICAgcHVibGljIHN0cmluZyB1cmw7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHBpcGU7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBidWZmZXJlZDsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIGZyYW1lZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvdG9jb2w7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBlbmNyeXB0ZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBQYXJzZSggTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLkNvdW50OyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSAiLXUiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBhcmdzWysraV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLW4iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1JdGVyYXRpb25zID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBpcGU9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIG5hbWVkIHBpcGVzIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1ob3N0PSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGVyZSBmb3IgaXBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgICBob3N0ID0gbmV3IElQQWRkcmVzcyhFbmNvZGluZy5Vbmljb2RlLkdldEJ5dGVzKGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItYiIgfHwgYXJnc1tpXSA9PSAiLS1idWZmZXJlZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9YnVmZmVyZWQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYnVmZmVyZWQgc29ja2V0cyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBmcmFtZWQgdHJhbnNwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLXQiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzID0gQ29udmVydC5Ub0ludDMyKGFyZ3NbKytpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1iaW5hcnkiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9YmluYXJ5IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wgPSAiYmluYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBiaW5hcnkgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImNvbXBhY3QiOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGNvbXBhY3QgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9anNvbiIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImpzb24iOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIEpTT04gcHJvdG9jb2wiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZW5jcnlwdGVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2xpZW50Q2VydCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGNsaWVudENlcnROYW1lID0gImNsaWVudC5wMTIiOworICAgICAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgIi4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAgICAgImtleXMvIiwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgc3RyaW5nIGV4aXN0aW5nUGF0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBvc3NpYmxlUGF0aCBpbiBwb3NzaWJsZVBhdGhzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGggPSBQYXRoLkdldEZ1bGxQYXRoKHBvc3NpYmxlUGF0aCArIGNsaWVudENlcnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBhdGgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1BhdGggPSBwYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhpc3RpbmdQYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oJCJDYW5ub3QgZmluZCBmaWxlOiB7Y2xpZW50Q2VydE5hbWV9Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgVENsaWVudFRyYW5zcG9ydCBDcmVhdGVUcmFuc3BvcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGVuZHBvaW50IHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHBpcGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuY3J5cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gR2V0Q2xpZW50Q2VydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNlcnRpZmljYXRlIGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZGVyLCBjZXJ0aWZpY2F0ZSwgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyB8IFNzbFByb3RvY29scy5UbHMxMSB8IFNzbFByb3RvY29scy5UbHMxMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEh0dHBDbGllbnRUcmFuc3BvcnQobmV3IFVyaSh1cmwpLCBudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBDcmVhdGVQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2wgPT0gImNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJqc29uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQmFzZVR5cGVzID0gMTsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JTdHJ1Y3RzID0gMjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JDb250YWluZXJzID0gNDsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JFeGNlcHRpb25zID0gODsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JVbmtub3duID0gNjQ7CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDbGllbnRUZXN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICBwcml2YXRlIGJvb2wgZG9uZTsKKworICAgICAgICAgICAgcHVibGljIGludCBSZXR1cm5Db2RlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAgICAgcHVibGljIENsaWVudFRlc3QoVGVzdFBhcmFtcyBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBwYXJhbS5DcmVhdGVUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocGFyYW0uQ3JlYXRlUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IHBhcmFtLm51bUl0ZXJhdGlvbnM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIEV4ZWN1dGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisKKyAgICAgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFeGVjdXRlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtSXRlcmF0aW9uczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuT3BlbkFzeW5jKHRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNvbm5lY3QgZmFpbGVkOiAiICsgZXguTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlIHw9IEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdEFzeW5jKGNsaWVudCkuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOyA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSBjbG9zaW5nIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50T3B0aW9uc0hlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2xpZW50IG9wdGlvbnM6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtdSA8VVJMPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXQgPCMgb2YgdGhyZWFkcyB0byBydW4+ICAgICAgICBkZWZhdWx0ID0gMSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLW4gPCMgb2YgaXRlcmF0aW9ucz4gICAgICAgICAgICBwZXIgdGhyZWFkIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBpcGU9PHBpcGUgbmFtZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0taG9zdD08SVAgYWRkcmVzcz4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcG9ydD08cG9ydCBudW1iZXI+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXRyYW5zcG9ydD08dHJhbnNwb3J0IG5hbWU+ICAgIG9uZSBvZiBidWZmZXJlZCxmcmFtZWQgIChkZWZhdWx0cyB0byBub25lKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm90b2NvbD08cHJvdG9jb2wgbmFtZT4gICAgICBvbmUgb2YgY29tcGFjdCxqc29uICAoZGVmYXVsdHMgdG8gYmluYXJ5KSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zc2wiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYW0gPSBuZXcgVGVzdFBhcmFtcygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwYXJhbS5QYXJzZShhcmdzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgIHBhcnNpbmcgYXJndW1lbnRzIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIHRlc3RzID0gRW51bWVyYWJsZS5SYW5nZSgwLCBwYXJhbS5udW1UaHJlYWRzKS5TZWxlY3QoXyA9PiBuZXcgQ2xpZW50VGVzdChwYXJhbSkpLlRvQXJyYXkoKTsKKworICAgICAgICAgICAgICAgIC8vaXNzdWUgdGVzdHMgb24gc2VwYXJhdGUgdGhyZWFkcyBzaW11bHRhbmVvdXNseQorICAgICAgICAgICAgICAgIHZhciB0aHJlYWRzID0gdGVzdHMuU2VsZWN0KHRlc3QgPT4gbmV3IFRhc2sodGVzdC5FeGVjdXRlKSkuVG9BcnJheSgpOworICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IERhdGVUaW1lLk5vdzsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiB0aHJlYWRzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0aHJlYWRzKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUb3RhbCB0aW1lOiAiICsgKERhdGVUaW1lLk5vdyAtIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdHMuU2VsZWN0KHQgPT4gdC5SZXR1cm5Db2RlKS5BZ2dyZWdhdGUoKHIxLCByMikgPT4gcjEgfCByMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIG91dGVyRXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVuZXhwZWN0ZWQgZXJyb3IiKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShvdXRlckV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgb3V0ZXJFeC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgQnl0ZXNUb0hleChieXRlW10gZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub1N0cmluZyhkYXRhKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIFByZXBhcmVUZXN0RGF0YShib29sIHJhbmRvbURpc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXR2YWwgPSBuZXcgYnl0ZVsweDEwMF07CisgICAgICAgICAgICB2YXIgaW5pdExlbiA9IE1hdGguTWluKDB4MTAwLCByZXR2YWwuTGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gbGluZWFyIGRpc3RyaWJ1dGlvbiwgdW5sZXNzIHJhbmRvbSBpcyByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmICghcmFuZG9tRGlzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJhbmRvbSBkaXN0cmlidXRpb24KKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHZhbFtpXSA9IChieXRlKTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YXIgcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dFBvcyA9IHJuZC5OZXh0KCkgJSBpbml0TGVuOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsW25leHRQb3NdID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbFtuZXh0UG9zXSA9IChieXRlKWk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8aW50PiBFeGVjdXRlQ2xpZW50VGVzdEFzeW5jKFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTsKKyAgICAgICAgICAgIHZhciByZXR1cm5Db2RlID0gMDsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFZvaWQoKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RWb2lkQXN5bmModG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHZvaWQiKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKKyAgICAgICAgICAgIHZhciBzID0gYXdhaXQgY2xpZW50LnRlc3RTdHJpbmdBc3luYygiVGVzdCIsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSBcIiIgKyBzICsgIlwiIik7CisgICAgICAgICAgICBpZiAoIlRlc3QiICE9IHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2wodHJ1ZSkiKTsKKyAgICAgICAgICAgIHZhciB0ID0gYXdhaXQgY2xpZW50LnRlc3RCb29sQXN5bmMoKGJvb2wpdHJ1ZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB0KTsKKyAgICAgICAgICAgIGlmICghdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2woZmFsc2UpIik7CisgICAgICAgICAgICB2YXIgZiA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKWZhbHNlLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGYpOworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJ5dGUoMSkiKTsKKyAgICAgICAgICAgIHZhciBpOCA9IGF3YWl0IGNsaWVudC50ZXN0Qnl0ZUFzeW5jKChzYnl0ZSkxLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGk4KTsKKyAgICAgICAgICAgIGlmICgxICE9IGk4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RJMzIoLTEpIik7CisgICAgICAgICAgICB2YXIgaTMyID0gYXdhaXQgY2xpZW50LnRlc3RJMzJBc3luYygtMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpMzIpOworICAgICAgICAgICAgaWYgKC0xICE9IGkzMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKKyAgICAgICAgICAgIHZhciBpNjQgPSBhd2FpdCBjbGllbnQudGVzdEk2NEFzeW5jKC0zNDM1OTczODM2OCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpNjQpOworICAgICAgICAgICAgaWYgKC0zNDM1OTczODM2OCAhPSBpNjQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSg1LjMyNTA5ODIzNSkiKTsKKyAgICAgICAgICAgIHZhciBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKDUuMzI1MDk4MjM1LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoNS4zMjUwOTgyMzUgIT0gZHViKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RG91YmxlKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSkiKTsKKyAgICAgICAgICAgIGR1YiA9IGF3YWl0IGNsaWVudC50ZXN0RG91YmxlQXN5bmMoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIGR1Yik7CisgICAgICAgICAgICBpZiAoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYmluT3V0ID0gUHJlcGFyZVRlc3REYXRhKHRydWUpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBiaW5JbiA9IGF3YWl0IGNsaWVudC50ZXN0QmluYXJ5QXN5bmMoYmluT3V0LCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBCeXRlc1RvSGV4KGJpbkluKSk7CisgICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAodmFyIG9mcyA9IDA7IG9mcyA8IE1hdGguTWluKGJpbkluLkxlbmd0aCwgYmluT3V0Lkxlbmd0aCk7ICsrb2ZzKQorICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW5bb2ZzXSAhPSBiaW5PdXRbb2ZzXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGJpbmFyeSBlcXVhbHM/IG9ubHkgd2l0aCBoYXNoY29kZSBvcHRpb24gZW5hYmxlZCAuLi4KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IENyYXp5TmVzdGluZyIpOworICAgICAgICAgICAgdmFyIG9uZSA9IG5ldyBDcmF6eU5lc3RpbmcoKTsKKyAgICAgICAgICAgIHZhciB0d28gPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICBvbmUuU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIHR3by5TdHJpbmdfZmllbGQgPSAiY3JhenkiOworICAgICAgICAgICAgb25lLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlW10geyAweDAwLCAweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweEZGIH07CisgICAgICAgICAgICB0d28uQmluYXJ5X2ZpZWxkID0gbmV3IGJ5dGVbMTBdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgaWYgKHR5cGVvZihDcmF6eU5lc3RpbmcpLkdldE1ldGhvZCgiRXF1YWxzIik/LkRlY2xhcmluZ1R5cGUgPT0gdHlwZW9mKENyYXp5TmVzdGluZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFvbmUuRXF1YWxzKHR3bykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckNvbnRhaW5lcnM7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNyYXp5TmVzdGluZy5FcXVhbHMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKKyAgICAgICAgICAgIHZhciBvID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgby5TdHJpbmdfdGhpbmcgPSAiWmVybyI7CisgICAgICAgICAgICBvLkJ5dGVfdGhpbmcgPSAoc2J5dGUpMTsKKyAgICAgICAgICAgIG8uSTMyX3RoaW5nID0gLTM7CisgICAgICAgICAgICBvLkk2NF90aGluZyA9IC01OworICAgICAgICAgICAgdmFyIGkgPSBhd2FpdCBjbGllbnQudGVzdFN0cnVjdEFzeW5jKG8sIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSkiKTsKKyAgICAgICAgICAgIHZhciBvMiA9IG5ldyBYdHJ1Y3QyKCk7CisgICAgICAgICAgICBvMi5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvMi5TdHJ1Y3RfdGhpbmcgPSBvOworICAgICAgICAgICAgbzIuSTMyX3RoaW5nID0gNTsKKyAgICAgICAgICAgIHZhciBpMiA9IGF3YWl0IGNsaWVudC50ZXN0TmVzdEFzeW5jKG8yLCB0b2tlbik7CisgICAgICAgICAgICBpID0gaTIuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHsiICsgaTIuQnl0ZV90aGluZyArICIsIHtcIiIgKyBpLlN0cmluZ190aGluZyArICJcIiwgIiArIGkuQnl0ZV90aGluZyArICIsICIgKyBpLkkzMl90aGluZyArICIsICIgKyBpLkk2NF90aGluZyArICJ9LCAiICsgaTIuSTMyX3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgdmFyIG1hcG91dCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCA1OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFwb3V0W2pdID0gaiAtIDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE1hcCh7Iik7CisgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiBtYXBvdXQuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcG91dFtrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIHZhciBtYXBpbiA9IGF3YWl0IGNsaWVudC50ZXN0TWFwQXN5bmMobWFwb3V0LCB0b2tlbik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwaW4uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4gIiArIG1hcGluW2tleV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGxpc3RvdXQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGlzdG91dC5BZGQoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TGlzdCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaiBpbiBsaXN0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbGlzdGluID0gYXdhaXQgY2xpZW50LnRlc3RMaXN0QXN5bmMobGlzdG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgaiBpbiBsaXN0aW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vc2V0CisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICB2YXIgc2V0b3V0ID0gbmV3IFRIYXNoU2V0PGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAtMjsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXRvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFNldCh7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRvdXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0pIik7CisKKyAgICAgICAgICAgIHZhciBzZXRpbiA9IGF3YWl0IGNsaWVudC50ZXN0U2V0QXN5bmMoc2V0b3V0LCB0b2tlbik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKGludCBqIGluIHNldGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKE9ORSkiKTsKKyAgICAgICAgICAgIHZhciByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6Lk9ORSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouT05FICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oVFdPKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5UV08sIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRXTyAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRIUkVFKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5USFJFRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouVEhSRUUgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShGSVZFKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5GSVZFLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5GSVZFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRUlHSFQpIik7CisgICAgICAgICAgICByZXQgPSBhd2FpdCBjbGllbnQudGVzdEVudW1Bc3luYyhOdW1iZXJ6LkVJR0hULCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5FSUdIVCAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMykiKTsKKyAgICAgICAgICAgIHZhciB1aWQgPSBhd2FpdCBjbGllbnQudGVzdFR5cGVkZWZBc3luYygzMDk4NTgyMzUwODI1MjNMLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHVpZCk7CisgICAgICAgICAgICBpZiAoMzA5ODU4MjM1MDgyNTIzTCAhPSB1aWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXBNYXAoMSkiKTsKKyAgICAgICAgICAgIHZhciBtbSA9IGF3YWl0IGNsaWVudC50ZXN0TWFwTWFwQXN5bmMoMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiBtbS5LZXlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgdmFyIG0yID0gbW1ba2V5XTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgazIgaW4gbTIuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+ICIgKyBtMltrMl0gKyAiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICB2YXIgaW5zYW5lID0gbmV3IEluc2FuaXR5KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIGxvbmc+KCk7CisgICAgICAgICAgICBpbnNhbmUuVXNlck1hcFtOdW1iZXJ6LkZJVkVdID0gNTAwMEw7CisgICAgICAgICAgICB2YXIgdHJ1Y2sgPSBuZXcgWHRydWN0KCk7CisgICAgICAgICAgICB0cnVjay5TdHJpbmdfdGhpbmcgPSAiVHJ1Y2siOworICAgICAgICAgICAgdHJ1Y2suQnl0ZV90aGluZyA9IChzYnl0ZSk4OworICAgICAgICAgICAgdHJ1Y2suSTMyX3RoaW5nID0gODsKKyAgICAgICAgICAgIHRydWNrLkk2NF90aGluZyA9IDg7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cyA9IG5ldyBMaXN0PFh0cnVjdD4oKTsKKyAgICAgICAgICAgIGluc2FuZS5YdHJ1Y3RzLkFkZCh0cnVjayk7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0SW5zYW5pdHkoKSIpOworICAgICAgICAgICAgdmFyIHdob2EgPSBhd2FpdCBjbGllbnQudGVzdEluc2FuaXR5QXN5bmMoaW5zYW5lLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHdob2EuS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gd2hvYVtrZXldOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoa2V5ICsgIiA9PiB7Iik7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgazIgaW4gdmFsLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgdjIgPSB2YWxbazJdOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoazIgKyAiID0+IHsiKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHVzZXJNYXAgPSB2Mi5Vc2VyTWFwOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVzZXJNYXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGszIGluIHVzZXJNYXAuS2V5cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGszICsgIiA9PiAiICsgdXNlck1hcFtrM10gKyAiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgeHRydWN0cyA9IHYyLlh0cnVjdHM7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgieyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoeHRydWN0cyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgeCBpbiB4dHJ1Y3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIntcIiIgKyB4LlN0cmluZ190aGluZyArICJcIiwgIiArIHguQnl0ZV90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICIsICIgKyB4LkkzMl90aGluZyArICJ9LCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIm51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgc2J5dGUgYXJnMCA9IDE7CisgICAgICAgICAgICB2YXIgYXJnMSA9IDI7CisgICAgICAgICAgICB2YXIgYXJnMiA9IGxvbmcuTWF4VmFsdWU7CisgICAgICAgICAgICB2YXIgbXVsdGlEaWN0ID0gbmV3IERpY3Rpb25hcnk8c2hvcnQsIHN0cmluZz4oKTsKKyAgICAgICAgICAgIG11bHRpRGljdFsxXSA9ICJvbmUiOworCisgICAgICAgICAgICB2YXIgdG1wTXVsdGlEaWN0ID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhaXIgaW4gbXVsdGlEaWN0KQorICAgICAgICAgICAgICAgIHRtcE11bHRpRGljdC5BZGQocGFpci5LZXkgKyIgPT4gIisgcGFpci5WYWx1ZSk7CisKKyAgICAgICAgICAgIHZhciBhcmc0ID0gTnVtYmVyei5GSVZFOworICAgICAgICAgICAgbG9uZyBhcmc1ID0gNTAwMDAwMDsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlRlc3QgTXVsdGkoIiArIGFyZzAgKyAiLCIgKyBhcmcxICsgIiwiICsgYXJnMiArICIseyIgKyBzdHJpbmcuSm9pbigiLCIsIHRtcE11bHRpRGljdCkgKyAifSwiICsgYXJnNCArICIsIiArIGFyZzUgKyAiKSIpOworICAgICAgICAgICAgdmFyIG11bHRpUmVzcG9uc2UgPSBhd2FpdCBjbGllbnQudGVzdE11bHRpQXN5bmMoYXJnMCwgYXJnMSwgYXJnMiwgbXVsdGlEaWN0LCBhcmc0LCBhcmc1LCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSBYdHJ1Y3QoYnl0ZV90aGluZzoiICsgbXVsdGlSZXNwb25zZS5CeXRlX3RoaW5nICsgIixTdHJpbmdfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuU3RyaW5nX3RoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIixpMzJfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTMyX3RoaW5nICsgIixpNjRfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuSTY0X3RoaW5nICsgIilcbiIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiWGNlcHRpb24iLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIlRFeGNlcHRpb25cIikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdEV4Y2VwdGlvbkFzeW5jKCJURXhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5URXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdEV4Y2VwdGlvbihcIm9rXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygib2siLCB0b2tlbik7CisgICAgICAgICAgICAgICAgLy8gT0sKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uXCIsIC4uLikiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDEwMDEgfHwgZXguTWVzc2FnZSAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RNdWx0aUV4Y2VwdGlvbihcIlhjZXB0aW9uMlwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbjIiLCAiaWdub3JlIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uMiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguRXJyb3JDb2RlICE9IDIwMDIgfHwgZXguU3RydWN0X3RoaW5nLlN0cmluZ190aGluZyAhPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJzdWNjZXNzXCIsIFwiT0tcIikiKTsKKyAgICAgICAgICAgICAgICBpZiAoIk9LIiAhPSAoYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJzdWNjZXNzIiwgIk9LIiwgdG9rZW4pKS5TdHJpbmdfdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc3cgPSBuZXcgU3RvcHdhdGNoKCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlRlc3QgT25ld2F5KDEpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQudGVzdE9uZXdheUFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIGlmIChzdy5FbGFwc2VkTWlsbGlzZWNvbmRzID4gMTAwMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IENhbGx0aW1lKCkiKTsKKyAgICAgICAgICAgIHZhciB0aW1lcyA9IDUwOworICAgICAgICAgICAgc3cuUmVzZXQoKTsKKyAgICAgICAgICAgIHN3LlN0YXJ0KCk7CisgICAgICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IHRpbWVzOyArK2spCisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RWb2lkQXN5bmModG9rZW4pOworICAgICAgICAgICAgc3cuU3RvcCgpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9IHswfSBtcyBhIHRlc3RWb2lkKCkgY2FsbCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMgLyB0aW1lcyk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzZmZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworcHJlY3Jvc3M6CisJJChET1RORVRDT1JFKSBidWlsZAorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgU2VydmVyL2JpbgorCSQoUk0pIC1yIENsaWVudC9vYmoKKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgVGhyaWZ0VGVzdC9UaHJpZnRUZXN0CisKK0VYVFJBX0RJU1QgPSBcCisJQ2xpZW50IFwKKwlSRUFETUUubWQgXAorCVNlcnZlciBcCisJVGhyaWZ0VGVzdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9SRUFETUUubWQgYi90ZXN0L25ldGNvcmUvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNzI4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjAgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXQtY29yZS1saWIgdGVzdHMKKworVGVzdHMgZm9yIFRocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRocmlmdFRlc3QgLSB0ZXN0cyBmb3IgVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIE5FVCBDb3JlIFN0YW5kYXJkIDEuNiAoU0RLIDIuMC4wKQorCisjIEhvdyB0byBidWlsZCBvbiBXaW5kb3dzCistIEdldCBUaHJpZnQgSURMIGNvbXBpbGVyIGV4ZWN1dGFibGUsIGFkZCB0byBzb21lIGZvbGRlciBhbmQgYWRkIHBhdGggdG8gdGhpcyBmb2xkZXIgaW50byBQQVRIIHZhcmlhYmxlCistIE9wZW4gVGhyaWZ0VGVzdC5zbG4gaW4gVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQKK29yIAorLSBCdWlsZCB3aXRoIHNjcmlwdHMKKworIyBIb3cgdG8gYnVpbGQgb24gVW5peAorLSBFbnN1cmUgeW91IGhhdmUgLk5FVCBDb3JlIDIuMC4wIFNESyBpbnN0YWxsZWQgb3IgdXNlIHRoZSBVYnVudHUgWGVuaWFsIGRvY2tlciBpbWFnZQorLSBGb2xsb3cgY29tbW9uIGJ1aWxkIHByYWN0aWNlIGZvciBUaHJpZnQ6IGJvb3RzdHJhcCwgY29uZmlndXJlLCBhbmQgbWFrZSBwcmVjcm9zcworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvVGhyaWZ0VGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDdlNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw3MiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgVGhyaWZ0VGVzdDsKKworbmFtZXNwYWNlIFNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuU2V0QnVmZmVyU2l6ZShDb25zb2xlLkJ1ZmZlcldpZHRoLCA0MDk2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkZhaWxlZCB0byBncm93IHNjcm9sbC1iYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzcGxpdCBtb2RlIGFuZCBvcHRpb25zCisgICAgICAgICAgICB2YXIgc3ViQXJncyA9IG5ldyBMaXN0PHN0cmluZz4oYXJncyk7CisgICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICBpZiAoc3ViQXJncy5Db3VudCA+IDApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGZpcnN0QXJnID0gc3ViQXJnc1swXTsKKyAgICAgICAgICAgICAgICBzdWJBcmdzLlJlbW92ZUF0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBydW4gd2hhdGV2ZXIgbW9kZSBpcyBjaG9vc2VuCisgICAgICAgICAgICBzd2l0Y2goZmlyc3RBcmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAic2VydmVyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RTZXJ2ZXIuRXhlY3V0ZShzdWJBcmdzKTsKKyAgICAgICAgICAgICAgICBjYXNlICItLWhlbHAiOgorICAgICAgICAgICAgICAgICAgICBQcmludEhlbHAoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgUHJpbnRIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzYWdlOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgU2VydmVyICBzZXJ2ZXIgIFtvcHRpb25zXSciKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgLS1oZWxwIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIik7CisKKyAgICAgICAgICAgIFRlc3RTZXJ2ZXIuUHJpbnRPcHRpb25zSGVscCgpOworICAgICAgICB9CisgICAgfQorfQorCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NTQ5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlNlcnZlciIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJCMEMxM0RBMC0zMTE3LTQ4NDQtOEFFOC1CMTc3NUU0NjIyM0QiKV0KKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWI0YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwzMSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuSHR0cC5XaW5IdHRwSGFuZGxlciIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb24uUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5UaHJlYWRpbmciIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSImcXVvdDskKFBhdGhUb1RocmlmdCkmcXVvdDsgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmQzMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9UZXN0U2VydmVyLmNzCkBAIC0wLDAgKzEsNTk0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjsKKworbmFtZXNwYWNlIFRocmlmdFRlc3QKK3sKKyAgICBpbnRlcm5hbCBjbGFzcyBTZXJ2ZXJQYXJhbQorICAgIHsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCB1c2VGcmFtZWQgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCB1c2VFbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgY29tcGFjdCA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIGpzb24gPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgaW50IHBvcnQgPSA5MDkwOworICAgICAgICBpbnRlcm5hbCBzdHJpbmcgcGlwZSA9IG51bGw7CisKKyAgICAgICAgaW50ZXJuYWwgdm9pZCBQYXJzZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLkNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGlwZSA9IGFyZ3NbaV0uU3Vic3RyaW5nKGFyZ3NbaV0uSW5kZXhPZigiPSIpICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1wb3J0PSIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludC5QYXJzZShhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1mIiB8fCBhcmdzW2ldID09ICItLWZyYW1lZCIgfHwgYXJnc1tpXSA9PSAiLS10cmFuc3BvcnQ9ZnJhbWVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzZUZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIG5lZWRlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9Y29tcGFjdCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb21wYWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAganNvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tdGhyZWFkZWQiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkZWQiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZHBvb2wiIHx8IGFyZ3NbaV0gPT0gIi0tc2VydmVyLXR5cGU9dGhyZWFkcG9vbCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tcHJvdG90eXBlIiB8fCBhcmdzW2ldID09ICItLXByb2Nlc3Nvcj1wcm90b3R5cGUiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXNzbCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VFbmNyeXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oYXJnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgX2NsaWVudElEID0gLTE7CisgICAgICAgIHB1YmxpYyBkZWxlZ2F0ZSB2b2lkIFRlc3RMb2dEZWxlZ2F0ZShzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKTsKKworICAgICAgICBwdWJsaWMgY2xhc3MgTXlTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKworICAgICAgICAgICAgcHVibGljIFRhc2sgUHJlU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxvYmplY3Q+IENyZWF0ZUNvbnRleHRBc3luYyhUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQ8b2JqZWN0PihudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgRGVsZXRlQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByb2Nlc3NDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFRlc3RIYW5kbGVyQXN5bmMgOiBUaHJpZnRUZXN0LklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVEJhc2VTZXJ2ZXIgc2VydmVyIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IGhhbmRsZXJJRDsKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBwcml2YXRlIFRlc3RMb2dEZWxlZ2F0ZSBsb2dnZXI7CisKKyAgICAgICAgICAgIHB1YmxpYyBUZXN0SGFuZGxlckFzeW5jKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVySUQgPSBJbnRlcmxvY2tlZC5JbmNyZW1lbnQocmVmIF9jbGllbnRJRCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyICs9IHRlc3RDb25zb2xlTG9nZ2VyOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoIk5ldyBUZXN0SGFuZGxlciBpbnN0YW5jZSBjcmVhdGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zb2xlTG9nZ2VyKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoImhhbmRsZXJ7MDpEM306IiwgaGFuZGxlcklEKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQobXNnLCB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZExpbmUoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0Vm9pZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxzdHJpbmc+IHRlc3RTdHJpbmdBc3luYyhzdHJpbmcgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RTdHJpbmcoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8Ym9vbD4gdGVzdEJvb2xBc3luYyhib29sIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Qm9vbCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxzYnl0ZT4gdGVzdEJ5dGVBc3luYyhzYnl0ZSB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJ5dGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8aW50PiB0ZXN0STMyQXN5bmMoaW50IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0STMyKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGxvbmc+IHRlc3RJNjRBc3luYyhsb25nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0STY0KHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGRvdWJsZT4gdGVzdERvdWJsZUFzeW5jKGRvdWJsZSB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdERvdWJsZSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxieXRlW10+IHRlc3RCaW5hcnlBc3luYyhieXRlW10gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBoZXggPSBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcodGhpbmcpLlJlcGxhY2UoIi0iLCBzdHJpbmcuRW1wdHkpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCaW5hcnkoezA6WH0pIiwgaGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0PiB0ZXN0U3RydWN0QXN5bmMoWHRydWN0IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0U3RydWN0KHt7XCJ7MH1cIiwgezF9LCB7Mn0sIHszfX19KSIsIHRoaW5nLlN0cmluZ190aGluZywgdGhpbmcuQnl0ZV90aGluZywgdGhpbmcuSTMyX3RoaW5nLCB0aGluZy5JNjRfdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxYdHJ1Y3QyPiB0ZXN0TmVzdEFzeW5jKFh0cnVjdDIgbmVzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRoaW5nID0gbmVzdC5TdHJ1Y3RfdGhpbmc7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE5lc3Qoe3t7MH0sIHt7XCJ7MX1cIiwgezJ9LCB7M30sIHs0fSwgezV9fX19fSkiLAorICAgICAgICAgICAgICAgICAgICBuZXN0LkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLlN0cmluZ190aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuQnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTMyX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5JNjRfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIG5lc3QuSTMyX3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG5lc3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGludCwgaW50Pj4gdGVzdE1hcEFzeW5jKERpY3Rpb25hcnk8aW50LCBpbnQ+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdE1hcCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB0aGluZy5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9ID0+IHsxfSIsIGtleSwgdGhpbmdba2V5XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4+IHRlc3RTdHJpbmdNYXBBc3luYyhEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RTdHJpbmdNYXAoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFRIYXNoU2V0PGludD4+IHRlc3RTZXRBc3luYyhUSGFzaFNldDxpbnQ+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdFNldCh7eyIpOworICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAoaW50IGVsZW0gaW4gdGhpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0iLCBlbGVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxMaXN0PGludD4+IHRlc3RMaXN0QXN5bmMoTGlzdDxpbnQ+IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5DbGVhcigpOworICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgidGVzdExpc3Qoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8TnVtYmVyej4gdGVzdEVudW1Bc3luYyhOdW1iZXJ6IHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0RW51bSh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxsb25nPiB0ZXN0VHlwZWRlZkFzeW5jKGxvbmcgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RUeXBlZGVmKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4+IHRlc3RNYXBNYXBBc3luYyhpbnQgaGVsbG8sIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RNYXBNYXAoezB9KSIsIGhlbGxvKTsKKyAgICAgICAgICAgICAgICB2YXIgbWFwbWFwID0gbmV3IERpY3Rpb25hcnk8aW50LCBEaWN0aW9uYXJ5PGludCwgaW50Pj4oKTsKKworICAgICAgICAgICAgICAgIHZhciBwb3MgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgICAgICB2YXIgbmVnID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwb3NbaV0gPSBpOworICAgICAgICAgICAgICAgICAgICBuZWdbLWldID0gLWk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWFwbWFwWzRdID0gcG9zOworICAgICAgICAgICAgICAgIG1hcG1hcFstNF0gPSBuZWc7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KG1hcG1hcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+PiB0ZXN0SW5zYW5pdHlBc3luYyhJbnNhbml0eSBhcmd1bWVudCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEluc2FuaXR5KCkiKTsKKworICAgICAgICAgICAgICAgIC8qKiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0OgorICAgICAgICAgICAgICAgICAqIFNvIHlvdSB0aGluayB5b3UndmUgZ290IHRoaXMgYWxsIHdvcmtlZCwgb3V0IGVoPworICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAgICAgICAgICAgICAgICogICB7IDEgPT4geyAyID0+IGFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAqICAgICAyID0+IHsgNiA9PiA8ZW1wdHkgSW5zYW5pdHkgc3RydWN0PiwgfSwKKyAgICAgICAgICAgICAgICAgKiAgIH0KKyAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHZhciBmaXJzdF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKKyAgICAgICAgICAgICAgICB2YXIgc2Vjb25kX21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOyA7CisKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5UV09dID0gYXJndW1lbnQ7CisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisKKyAgICAgICAgICAgICAgICBzZWNvbmRfbWFwW051bWJlcnouU0lYXSA9IG5ldyBJbnNhbml0eSgpOworCisgICAgICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgWzFdID0gZmlyc3RfbWFwLAorICAgICAgICAgICAgICAgICAgICBbMl0gPSBzZWNvbmRfbWFwCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQoaW5zYW5lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0PiB0ZXN0TXVsdGlBc3luYyhzYnl0ZSBhcmcwLCBpbnQgYXJnMSwgbG9uZyBhcmcyLCBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+IGFyZzMsIE51bWJlcnogYXJnNCwgbG9uZyBhcmc1LAorICAgICAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RNdWx0aSgpIik7CisKKyAgICAgICAgICAgICAgICB2YXIgaGVsbG8gPSBuZXcgWHRydWN0KCk7IDsKKyAgICAgICAgICAgICAgICBoZWxsby5TdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKKyAgICAgICAgICAgICAgICBoZWxsby5CeXRlX3RoaW5nID0gYXJnMDsKKyAgICAgICAgICAgICAgICBoZWxsby5JMzJfdGhpbmcgPSBhcmcxOworICAgICAgICAgICAgICAgIGhlbGxvLkk2NF90aGluZyA9IGFyZzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChoZWxsbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RFeGNlcHRpb25Bc3luYyhzdHJpbmcgYXJnLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0RXhjZXB0aW9uKHswfSkiLCBhcmcpOworICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0gYXJnCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhcmcgPT0gIlRFeGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0PiB0ZXN0TXVsdGlFeGNlcHRpb25Bc3luYyhzdHJpbmcgYXJnMCwgc3RyaW5nIGFyZzEsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RNdWx0aUV4Y2VwdGlvbih7MH0sIHsxfSkiLCBhcmcwLCBhcmcxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHggPSBuZXcgWGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMTAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXJnMCA9PSAiWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uMgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAyMDAyLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCB7IFN0cmluZ190aGluZyA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgWHRydWN0IHsgU3RyaW5nX3RoaW5nID0gYXJnMSB9OworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdE9uZXdheUFzeW5jKGludCBzZWNvbmRzVG9TbGVlcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE9uZXdheSh7MH0pLCBzbGVlcGluZy4uLiIsIHNlY29uZHNUb1NsZWVwKTsKKyAgICAgICAgICAgICAgICBUYXNrLkRlbGF5KHNlY29uZHNUb1NsZWVwICogMTAwMCwgY2FuY2VsbGF0aW9uVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0T25ld2F5IGZpbmlzaGVkIik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgUHJpbnRPcHRpb25zSGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTZXJ2ZXIgb3B0aW9uczoiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcGlwZT08cGlwZSBuYW1lPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wb3J0PTxwb3J0IG51bWJlcj4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tdHJhbnNwb3J0PTx0cmFuc3BvcnQgbmFtZT4gICAgb25lIG9mIGJ1ZmZlcmVkLGZyYW1lZCAgKGRlZmF1bHRzIHRvIG5vbmUpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXByb3RvY29sPTxwcm90b2NvbCBuYW1lPiAgICAgIG9uZSBvZiBjb21wYWN0LGpzb24gIChkZWZhdWx0cyB0byBiaW5hcnkpIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNlcnZlci10eXBlPTx0eXBlPiAgICAgICAgICAgIG9uZSBvZiB0aHJlYWRlZCx0aHJlYWRwb29sICAoZGVmYXVsdHMgdG8gc2ltcGxlKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm9jZXNzb3I9PHByb3RvdHlwZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRTZXJ2ZXJDZXJ0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHNlcnZlckNlcnROYW1lID0gInNlcnZlci5wMTIiOworICAgICAgICAgICAgdmFyIHBvc3NpYmxlUGF0aHMgPSBuZXcgTGlzdDxzdHJpbmc+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIi4uLy4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4vLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgImtleXMvIiwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBvc3NpYmxlUGF0aCBpbiBwb3NzaWJsZVBhdGhzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBzZXJ2ZXJDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKHBhdGgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZXhpc3RpbmdQYXRoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge3NlcnZlckNlcnROYW1lfSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB2YXIgY2VydCA9IG5ldyBYNTA5Q2VydGlmaWNhdGUyKGV4aXN0aW5nUGF0aCwgInRocmlmdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGUoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsb2dnZXJGYWN0b3J5ID0gbmV3IExvZ2dlckZhY3RvcnkoKTsvLy5BZGRDb25zb2xlKCkuQWRkRGVidWcoKTsKKyAgICAgICAgICAgIHZhciBsb2dnZXIgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkNyZWF0ZUxvZ2dlcigiVGVzdCIpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGFyYW0gPSBuZXcgU2VydmVyUGFyYW0oKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIC8vIFRyYW5zcG9ydAorICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgdHJhbnM7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQocGFyYW0ucGlwZSk7CisgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0udXNlRnJhbWVkKQorLy8gICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQocGFyYW0ucG9ydCk7CisvLyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnVzZUVuY3J5cHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gR2V0U2VydmVyQ2VydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VydCA9PSBudWxsIHx8ICFjZXJ0Lkhhc1ByaXZhdGVLZXkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNlcnRpZmljYXRlIGRvZXNuJ3QgY29udGFpbiBwcml2YXRlIGtleSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KHBhcmFtLnBvcnQsIHBhcmFtLnVzZUJ1ZmZlcmVkU29ja2V0cywgcGFyYW0udXNlRnJhbWVkLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZGVyLCBjZXJ0aWZpY2F0ZSwgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyB8IFNzbFByb3RvY29scy5UbHMxMSB8IFNzbFByb3RvY29scy5UbHMxMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHBhcmFtLnBvcnQsIDAsIHBhcmFtLnVzZUJ1ZmZlcmVkU29ja2V0cywgcGFyYW0udXNlRnJhbWVkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IHByb3RvOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5jb21wYWN0KQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbS5qc29uKQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb3RvID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICBJVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTsKKworICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHZhciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlckFzeW5jKCk7CisgICAgICAgICAgICAgICAgdmFyIHRlc3RQcm9jZXNzb3IgPSBuZXcgVGhyaWZ0VGVzdC5Bc3luY1Byb2Nlc3Nvcih0ZXN0SGFuZGxlcik7CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeSh0ZXN0UHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpOyAKKworICAgICAgICAgICAgICAgIFRCYXNlU2VydmVyIHNlcnZlckVuZ2luZSA9IG5ldyBBc3luY0Jhc2VTZXJ2ZXIocHJvY2Vzc29yRmFjdG9yeSwgdHJhbnMsIHRyYW5zRmFjdG9yeSwgdHJhbnNGYWN0b3J5LCBwcm90bywgcHJvdG8sIGxvZ2dlcik7CisKKyAgICAgICAgICAgICAgICAvL1NlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAgICAgICAgICAgdmFyIHNlcnZlckV2ZW50cyA9IG5ldyBNeVNlcnZlckV2ZW50SGFuZGxlcigpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXRFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRzKTsKKworICAgICAgICAgICAgICAgIC8vIFJ1biBpdAorICAgICAgICAgICAgICAgIHZhciB3aGVyZSA9ICghIHN0cmluZy5Jc051bGxPckVtcHR5KHBhcmFtLnBpcGUpKSA/ICJvbiBwaXBlICIgKyBwYXJhbS5waXBlIDogIm9uIHBvcnQgIiArIHBhcmFtLnBvcnQ7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlN0YXJ0aW5nIHRoZSBBc3luY0Jhc2VTZXJ2ZXIgIiArIHdoZXJlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggcHJvY2Vzc29yIFRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5IHByb3RvdHlwZSBmYWN0b3J5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMgPyAiIHdpdGggYnVmZmVyZWQgc29ja2V0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLnVzZUZyYW1lZCA/ICIgd2l0aCBmcmFtZWQgdHJhbnNwb3J0IiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLnVzZUVuY3J5cHRpb24gPyAiIHdpdGggZW5jcnlwdGlvbiIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS5jb21wYWN0ID8gIiB3aXRoIGNvbXBhY3QgcHJvdG9jb2wiIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0uanNvbiA/ICIgd2l0aCBqc29uIHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlckVuZ2luZS5TZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZSh4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJkb25lLiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbiBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWIyNDFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1RocmlmdFRlc3Quc2xuCkBAIC0wLDAgKzEsNjQgQEAKK++7v01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2NzMwLjEyCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiLCAie0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNsaWVudCIsICJDbGllbnRcQ2xpZW50LmNzcHJvaiIsICJ7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiU2VydmVyIiwgIlNlcnZlclxTZXJ2ZXIuY3Nwcm9qIiwgInswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9IgorRW5kUHJvamVjdAorR2xvYmFsCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKwkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKwkJRGVidWd8eDY0ID0gRGVidWd8eDY0CisJCURlYnVnfHg4NiA9IERlYnVnfHg4NgorCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUKKwkJUmVsZWFzZXx4NjQgPSBSZWxlYXNlfHg2NAorCQlSZWxlYXNlfHg4NiA9IFJlbGVhc2V8eDg2CisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7NTJDRTlBMTItRjZDQi00RjBDLUJCNDItMDEwNTYxMkY1RkY0fQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL2J1aWxkLmNtZCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NGVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNSBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKKworOmVvZgpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL2J1aWxkLnNoIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5N2UzMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKK3NldCAtZQorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKZGlmZiAtLWdpdCBhL3Rlc3Qvbm9kZWpzL01ha2VmaWxlLmFtIGIvdGVzdC9ub2RlanMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZjOGU3ZDAuLjAwMDAwMDAKLS0tIGEvdGVzdC9ub2RlanMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQotc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0JJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLi4vVGhyaWZ0VGVzdC50aHJpZnQKLQotY2hlY2s6IHN0dWJzCi0KLWNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1ub2RlanMKLQotc2VydmVyOiBzdHVicwotCU5PREVfUEFUSD0uLi8uLi9saWIvbm9kZWpzL2xpYjouLi8uLi9saWIvbm9kZWpzL2xpYi90aHJpZnQgbm9kZSBzZXJ2ZXIuanMKLQotY2xpZW50OiBzdHVicwotCU5PREVfUEFUSD0uLi8uLi9saWIvbm9kZWpzL2xpYjouLi8uLi9saWIvbm9kZWpzL2xpYi90aHJpZnQgbm9kZSBjbGllbnQuanMKZGlmZiAtLWdpdCBhL3Rlc3Qvbm9kZWpzL2NsaWVudC5qcyBiL3Rlc3Qvbm9kZWpzL2NsaWVudC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E4MmE4My4uMDAwMDAwMAotLS0gYS90ZXN0L25vZGVqcy9jbGllbnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotCi12YXIgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0JyksCi0gICAgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKLQotdmFyIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbignbG9jYWxob3N0JywgOTA5MCksCi0gICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKLQotdmFyIHRmYWlsZWQgPSAwOwotdmFyIHRwYXNzZWQgPSAwOwotCi1mdW5jdGlvbiBmYWlsZWQoZXJyKSB7Ci0gIGNvbnNvbGUudHJhY2UoZXJyKTsKLQlyZXR1cm4gdGZhaWxlZCsrOwotfQotZnVuY3Rpb24gcGFzc2VkKCkgewotCXJldHVybiB0cGFzc2VkKys7Ci19Ci0KLWNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gIGZhaWxlZChlcnIpOwotfSk7Ci0KLWNvbnNvbGUudGltZSgiVGVzdHMgY29tcGxldGVkIGluIik7Ci0KLWNsaWVudC50ZXN0Vm9pZChmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gIGlmIChlcnIpIHsgcmV0dXJuIGZhaWxlZChlcnIpOyB9Ci0gIGNvbnNvbGUubG9nKCJ0ZXN0Vm9pZCgpID0gIiwgcmVzcG9uc2UpOwotCXBhc3NlZCgpOwotfSk7Ci0KLWNsaWVudC50ZXN0U3RyaW5nKCJUZXN0IiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICBpZiAoZXJyKSB7IHJldHVybiBmYWlsZWQoZXJyKTsgfQotICBjb25zb2xlLmxvZygidGVzdFN0cmluZygnVGVzdCcpID0gIiwgcmVzcG9uc2UpOwotCXBhc3NlZCgpOwotfSk7Ci0KLWNsaWVudC50ZXN0Qnl0ZSgxLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gIGlmIChlcnIpIHsgcmV0dXJuIGZhaWxlZChlcnIpOyB9Ci0gIGNvbnNvbGUubG9nKCJ0ZXN0Qnl0ZSgxKSA9ICIsIHJlc3BvbnNlKTsKLQlwYXNzZWQoKTsKLX0pOwotCi1jbGllbnQudGVzdEkzMigtMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICBpZiAoZXJyKSB7IHJldHVybiBmYWlsZWQoZXJyKTsgfQotICBjb25zb2xlLmxvZygidGVzdEkzMigtMSkgPSAiLCByZXNwb25zZSk7Ci0JcGFzc2VkKCk7Ci19KTsKLQotY2xpZW50LnRlc3RJNjQoNSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICBpZiAoZXJyKSB7IHJldHVybiBmYWlsZWQoZXJyKTsgfQotICBjb25zb2xlLmxvZygidGVzdEk2NCg1KSA9ICIsIHJlc3BvbnNlKTsKLQlwYXNzZWQoKTsKLX0pOwotCi0vKgotICogRkFUQUwgRVJST1I6IENBTExfQU5EX1JFVFJZXzIgQWxsb2NhdGlvbiBmYWlsZWQgLSBwcm9jZXNzIG91dCBvZiBtZW1vcnkKLWNsaWVudC50ZXN0STY0KC01LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gIGlmIChlcnIpIHsgcmV0dXJuIGZhaWxlZChlcnIpOyB9Ci0gIGNvbnNvbGUubG9nKCJ0ZXN0STY0KC01KSA9ICIsIHJlc3BvbnNlKTsKLQlwYXNzZWQoKTsKLX0pOwotICovCi0KLWNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICBpZiAoZXJyKSB7IHJldHVybiBmYWlsZWQoZXJyKTsgfQotICBjb25zb2xlLmxvZygidGVzdEk2NCgtMzQzNTk3MzgzNjgpID0gIiwgcmVzcG9uc2UpOwotCXBhc3NlZCgpOwotfSk7Ci0KLWNsaWVudC50ZXN0RG91YmxlKC01LjIwOTg1MjMsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgaWYgKGVycikgeyByZXR1cm4gZmFpbGVkKGVycik7IH0KLSAgY29uc29sZS5sb2coInRlc3REb3VibGUoLTUuMjA5ODUyMykgPSAiLCByZXNwb25zZSk7Ci0JcGFzc2VkKCk7Ci19KTsKLQotdmFyIG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKLQlzdHJpbmdfdGhpbmc6ICdaZXJvJywKLQlieXRlX3RoaW5nOiAxLAotCWkzMl90aGluZzogLTMsCi0JaTY0X3RoaW5nOiAxMDAwMDAwCi19KTsKLWNsaWVudC50ZXN0U3RydWN0KG91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICBpZiAoZXJyKSB7IHJldHVybiBmYWlsZWQoZXJyKTsgfQotICBjb25zb2xlLmxvZygidGVzdFN0cnVjdCgiLCBvdXQsICIpID0gXG4iLCByZXNwb25zZSk7Ci0JcGFzc2VkKCk7Ci19KTsKLQotdmFyIG91dDIgPSBuZXcgdHR5cGVzLlh0cnVjdDIoKTsKLW91dDIuYnl0ZV90aGluZyA9IDE7Ci1vdXQyLnN0cnVjdF90aGluZyA9IG91dDsKLW91dDIuaTMyX3RoaW5nID0gNTsKLWNsaWVudC50ZXN0TmVzdChvdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gIGlmIChlcnIpIHsgcmV0dXJuIGZhaWxlZChlcnIpOyB9Ci0gIGNvbnNvbGUubG9nKCJ0ZXN0TmVzdCgiLCBvdXQyLCAiKSA9IFxuIiwgcmVzcG9uc2UpOwotCXBhc3NlZCgpOwotfSk7Ci0KLXZhciBtYXBvdXQgPSB7fTsKLWZvciAodmFyIGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0gIG1hcG91dFtpXSA9IGktMTA7Ci19Ci1jbGllbnQudGVzdE1hcChtYXBvdXQsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgaWYgKGVycikgeyByZXR1cm4gZmFpbGVkKGVycik7IH0KLSAgY29uc29sZS5sb2coInRlc3RNYXAoIiwgbWFwb3V0LCAiKSA9IFxuIiwgcmVzcG9uc2UpOwotCXBhc3NlZCgpOwotfSk7Ci0KLS8qCi0gKiBUT0RPOiB0ZXN0U2V0LCB0ZXN0TGlzdCwgdGVzdEVudW0sIHRlc3RUeXBlZGVmLCB0ZXN0TWFwTWFwLCB0ZXN0SW5zYW5pdHkKLSAqLwotCi0KLWNsaWVudC50ZXN0RXhjZXB0aW9uKCdBcHBsaWNhdGlvbkV4Y2VwdGlvbicsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgY29uc29sZS5sb2coInRlc3RFeGNlcHRpb24oJ0FwcGxpY2F0aW9uRXhjZXB0aW9uJykgPSAiLCBlcnIpOwotICBpZiAocmVzcG9uc2UpIHsgcmV0dXJuIGZhaWxlZChyZXNwb25zZSk7IH0KLQlwYXNzZWQoKTsKLX0pOwotCi1jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gIGNvbnNvbGUubG9nKCJ0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpID0gIiwgZXJyKTsKLSAgaWYgKHJlc3BvbnNlKSB7IHJldHVybiBmYWlsZWQocmVzcG9uc2UpOyB9Ci0JcGFzc2VkKCk7Ci19KTsKLQotY2xpZW50LnRlc3RFeGNlcHRpb24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gIGlmIChlcnIpIHsgcmV0dXJuIGZhaWxlZChlcnIpOyB9Ci0gIGNvbnNvbGUubG9nKCJ0ZXN0RXhjZXB0aW9uKCdzdWNjZXNzJykgPSAiLCByZXNwb25zZSk7Ci0JcGFzc2VkKCk7Ci19KTsKLQotc2V0VGltZW91dChmdW5jdGlvbigpewotICBjb25zb2xlLnRpbWVFbmQoIlRlc3RzIGNvbXBsZXRlZCBpbiIpOwotCWNvbnNvbGUubG9nKHRwYXNzZWQgKyAiIHBhc3NlZCwgIiArIHRmYWlsZWQgKyAiIGZhaWxlZCIpOwotCWNvbm5lY3Rpb24uZW5kKCk7Ci19LCAyMDApOwpkaWZmIC0tZ2l0IGEvdGVzdC9ub2RlanMvcGFja2FnZS5qc29uIGIvdGVzdC9ub2RlanMvcGFja2FnZS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjdhYmI0Li4wMDAwMDAwCi0tLSBhL3Rlc3Qvbm9kZWpzL3BhY2thZ2UuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXsKLSAgIm5hbWUiOiAidGhyaWZ0LW5vZGVqcy10ZXN0IiwKLSAgInZlcnNpb24iOiAiMC45LjAiLAotICAiZGVzY3JpcHRpb24iOiAibm9kZS5qcyB0ZXN0IHNlcnZlciBhbmQgY2xpZW50IGZvciB0aGUgQXBhY2hlIFRocmlmdCIsCi0gICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIiwKLSAgInJlcG9zaXRvcnkiOgotICAgIHsgInR5cGUiIDogInN2biIsCi0gICAgICAidXJsIiA6ICJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC90cnVuay8iCi0gICAgfSwKLSAgImF1dGhvciI6Ci0gICAgeyAibmFtZSI6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMiLAotICAgICAgImVtYWlsIjogImRldkB0aHJpZnQuYXBhY2hlLm9yZyIsCi0gICAgICAidXJsIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKLSAgICB9LAotICAibGljZW5zZXMiOgotICAgIFsgeyAidHlwZSI6ICJBcGFjaGUtMi4wIiwKLSAgICAgICAgInVybCI6ICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiCi0gICAgICB9Ci0gICAgXSwKLSAgImJ1Z3MiOgotICAgIHsgIm1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKLSAgICAgICJ1cmwiOiAiaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQiCi0gICAgfSwKLSAgImRpcmVjdG9yaWVzIiA6IHsgImxpYiIgOiAiLi4vbGliL25vZGVqcy9saWIvdGhyaWZ0IiB9LAotICAibWFpbiI6ICIuLi9saWIvbm9kZWpzL2xpYi90aHJpZnQiLAotICAic2NyaXB0cyI6IHsKLSAgICAic3RhcnQiOiAibm9kZSAuL2h0dHAtc2VydmVyIgotICB9LAotICAiZW5naW5lcyI6IHsgIm5vZGUiOiAiPj0gMC4yLjQiIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3Qvbm9kZWpzL3NlcnZlci5qcyBiL3Rlc3Qvbm9kZWpzL3NlcnZlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2MjA5ZC4uMDAwMDAwMAotLS0gYS90ZXN0L25vZGVqcy9zZXJ2ZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7Ci0KLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKSwKLSAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotCi0KLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QsIHsKLSAgdGVzdFZvaWQ6IGZ1bmN0aW9uKHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7Ci0gICAgcmVzdWx0KG51bGwpOwotICB9LAotCi0gIHRlc3RTdHJpbmc6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZyhcJycgKyB0aGluZyArICdcJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotCi0gIHRlc3RCeXRlOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RCeXRlKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLQotICB0ZXN0STMyOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RJMzIoJyArIHRoaW5nICsgJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotCi0gIHRlc3RJNjQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdEk2NCgnICsgdGhpbmcgKyAnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0sCi0KLSAgdGVzdERvdWJsZTogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0RG91YmxlKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLQotICB0ZXN0U3RydWN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RTdHJ1Y3QoJyk7Ci0gICAgY29uc29sZS5sb2codGhpbmcpOwotICAgIGNvbnNvbGUubG9nKCcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLQotICB0ZXN0TmVzdDogZnVuY3Rpb24obmVzdCwgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3ROZXN0KCcpOwotICAgIGNvbnNvbGUubG9nKG5lc3QpOwotICAgIGNvbnNvbGUubG9nKCcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIG5lc3QpOwotICB9LAotCi0gIHRlc3RNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdE1hcCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotCi0gIHRlc3RTdHJpbmdNYXA6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdFN0cmluZ01hcCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotCi0gIHRlc3RTZXQ6IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdFNldCgnKTsKLSAgICBjb25zb2xlLmxvZyh0aGluZyk7Ci0gICAgY29uc29sZS5sb2coJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotCi0gIHRlc3RMaXN0OiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RMaXN0KCcpOwotICAgIGNvbnNvbGUubG9nKHRoaW5nKTsKLSAgICBjb25zb2xlLmxvZygnKScpOwotICAgIHJlc3VsdChudWxsLCB0aGluZyk7Ci0gIH0sCi0KLSAgdGVzdEVudW06IGZ1bmN0aW9uKHRoaW5nLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdEVudW0oJyArIHRoaW5nICsgJyknKTsKLSAgICByZXN1bHQobnVsbCwgdGhpbmcpOwotICB9LAotCi0gIHRlc3RUeXBlZGVmOiBmdW5jdGlvbih0aGluZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RUeXBlZGVmKCcgKyB0aGluZyArICcpJyk7Ci0gICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfSwKLQotICB0ZXN0TWFwTWFwOiBmdW5jdGlvbihoZWxsbywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKLQotICAgIHZhciBtYXBtYXAgPSBbXTsKLSAgICB2YXIgcG9zID0gW107Ci0gICAgdmFyIG5lZyA9IFtdOwotICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKSB7Ci0gICAgICBwb3NbaV0gPSBpOwotICAgICAgbmVnWy1pXSA9IC1pOwotICAgIH0KLSAgICBtYXBtYXBbNF0gPSBwb3M7Ci0gICAgbWFwbWFwWy00XSA9IG5lZzsKLQotICAgIHJlc3VsdChudWxsLCBtYXBtYXApOwotICB9LAotCi0gIHRlc3RJbnNhbml0eTogZnVuY3Rpb24oYXJndW1lbnQsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0SW5zYW5pdHkoKScpOwotCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKLSAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKLSAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwotICAgIGhlbGxvLmk2NF90aGluZyA9IDI7Ci0KLSAgICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7Ci0gICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOwotICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7Ci0gICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKLQotICAgIHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKLSAgICBjcmF6eS51c2VyTWFwID0gW107Ci0gICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5FSUdIVF0gPSA4OwotICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRklWRV0gPSA1OwotICAgIGNyYXp5Lnh0cnVjdHMgPSBbXTsKLSAgICBjcmF6eS54dHJ1Y3RzLmFkZChnb29kYnllKTsKLSAgICBjcmF6eS54dHJ1Y3RzLmFkZChoZWxsbyk7Ci0KLSAgICB2YXIgZmlyc3RfbWFwID0gW107Ci0gICAgdmFyIHNlY29uZF9tYXAgPSBbXTsKLQotICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5UV09dID0gY3Jhenk7Ci0gICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OwotCi0gICAgdmFyIGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKLSAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7Ci0KLSAgICB2YXIgaW5zYW5lID0gW107Ci0gICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOwotICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7Ci0KLSAgICByZXN1bHQobnVsbCwgaW5zYW5lKTsKLSAgfSwKLQotICB0ZXN0TXVsdGk6IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgewotICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOwotCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTs7Ci0gICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7Ci0gICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7Ci0gICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKLSAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOwotICAgIHJlc3VsdChudWxsLCBoZWxsbyk7Ci0gIH0sCi0KLSAgdGVzdEV4Y2VwdGlvbjogZnVuY3Rpb24oYXJnLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOwotICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKLSAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwotICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwotICAgICAgeC5tZXNzYWdlID0gYXJnOwotICAgICAgcmVzdWx0KHgpOwotICAgIH0gZWxzZSBpZiAoYXJnID09PSAnQXBwbGljYXRpb25FeGNlcHRpb24nKSB7Ci0gICAgICByZXN1bHQobmV3IFRocmlmdC5URXhjZXB0aW9uKGFyZykpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmc7Ci0JCQlyZXN1bHQobnVsbCwgcmVzKTsKLSAgICB9Ci0gIH0sCi0KLSAgdGVzdE11bHRpRXhjZXB0aW9uOiBmdW5jdGlvbihhcmcwLCBhcmcxLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOwotICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKLSAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uKCk7Ci0gICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgICB4Lm1lc3NhZ2UgPSAnVGhpcyBpcyBhbiBYY2VwdGlvbic7Ci0gICAgICByZXN1bHQoeCk7Ci0gICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7Ci0gICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIoKTsKLSAgICAgIHguZXJyb3JDb2RlID0gMjAwMjsKLSAgICAgIHguc3RydWN0X3RoaW5nID0gbmV3IFh0cnVjdCgpOwotICAgICAgeC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKLSAgICAgIHJlc3VsdCh4KTsKLSAgICB9Ci0KLSAgICB2YXIgcmVzID0gbmV3IFh0cnVjdCgpOwotICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOwotICAgIHJlc3VsdChudWxsLCByZXMpOwotICB9LAotCi0gIHRlc3RPbmV3YXk6IGZ1bmN0aW9uKHNsZWVwRm9yLCByZXN1bHQpIHsKLSAgICBjb25zb2xlLmxvZygndGVzdE9uZXdheSgnICsgc2xlZXBGb3IgKyAnKSA9PiBzbGVlcGluZy4uLicpOwotICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKLSAgICAgIGNvbnNvbGUubG9nKCdEb25lIHNsZWVwaW5nIScpOwotICAgIH0sIHNsZWVwRm9yKTsKLQkJcmVzdWx0KG51bGwpOwotICB9Ci19KTsKLQotc2VydmVyLmxpc3Rlbig5MDkwKTsKZGlmZiAtLWdpdCBhL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwgYi90ZXN0L29jYW1sL3NlcnZlci9UZXN0U2VydmVyLm1sCmluZGV4IDNmNWM5ZWUuLmVmZTBmNGIgMTAwNjQ0Ci0tLSBhL3Rlc3Qvb2NhbWwvc2VydmVyL1Rlc3RTZXJ2ZXIubWwKKysrIGIvdGVzdC9vY2FtbC9zZXJ2ZXIvVGVzdFNlcnZlci5tbApAQCAtMzYsNiArMzYsNyBAQAogICBtZXRob2QgdGVzdEkzMiB4ID0gcCAidGVzdEkzMiglZClcbiIgKHNvZCB4KTsgKHNvZCB4KQogICBtZXRob2QgdGVzdEk2NCB4ID0gcCAidGVzdEk2NCglcylcbiIgKEludDY0LnRvX3N0cmluZyAoc29kIHgpKTsgKHNvZCB4KQogICBtZXRob2QgdGVzdERvdWJsZSB4ID0gcCAidGVzdERvdWJsZSglZilcbiIgKHNvZCB4KTsgKHNvZCB4KQorICBtZXRob2QgdGVzdEJpbmFyeSB4ID0gcCAidGVzdEJpbmFyeSglcylcbiIgKHNvZCB4KTsgKHNvZCB4KQogICBtZXRob2QgdGVzdFN0cnVjdCB4ID0gcCAidGVzdFN0cnVjdCgtLS0pXG4iOyAoc29kIHgpCiAgIG1ldGhvZCB0ZXN0TmVzdCB4ID0gcCAidGVzdE5lc3QoLS0tKVxuIjsgKHNvZCB4KQogICBtZXRob2QgdGVzdE1hcCB4ID0gcCAidGVzdE1hcCgtLS0pXG4iOyAoc29kIHgpCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUuYW0gYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggMjkxMTA2Yi4uMTY1YjlhNyAxMDA2NDQKLS0tIGEvdGVzdC9wZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpAQCAtMTcsMTEgKzE3LDExIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAorcHJlY3Jvc3M6IHN0dWJzCisKIGNoZWNrOiBzdHVicwogCiBjbGVhbi1sb2NhbDoKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsIGIvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBhZjgwZDQ2Li45NmUzYmVjCi0tLSBhL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCisrKyBiL3Rlc3QvcGVybC9UZXN0Q2xpZW50LnBsCkBAIC0xOSwxMCArMTksMTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIHVzZSBEYXRhOjpEdW1wZXI7Cit1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnMpOwogdXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CiAKIHVzZSBsaWIgJy4uLy4uL2xpYi9wZXJsL2xpYic7CkBAIC0zMCwxMDQgKzMxLDIyNyBAQAogCiB1c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7Ci11c2UgVGhyaWZ0OjpTb2NrZXQ7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpVbml4U29ja2V0OwogCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwogCiAkfCsrOwogCi1teSAkaG9zdCA9ICdsb2NhbGhvc3QnOwotbXkgJHBvcnQgPSA5MDkwOworc3ViIHVzYWdlIHsKKyAgICBwcmludCA8PCJFT0YiOworVXNhZ2U6ICQwIFtPUFRJT05TXQogCitPcHRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQpCisgIC0tY2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBIHRvIHZhbGlkYXRlIHNlcnZlciB3aXRoLgorICAtLWNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSB0byB1c2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsLgorICAtLWNpcGhlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIGNpcGhlciBsaXN0LgorICAtLWRvbWFpbi1zb2NrZXQgPGZpbGU+ICAgICAgICAgICAgICAgICAgICAgICBVc2UgYSB1bml4IGRvbWFpbiBzb2NrZXQuCisgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgdXNhZ2UuCisgIC0ta2V5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGtleS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tcG9ydCA8cG9ydG51bT4gICAgICAgICAgICAgICAgOTA5MCAgICAgICAgIFBvcnQgdG8gdXNlLgorICAtLXByb3RvY29sIHtiaW5hcnl9ICAgICAgICAgICAgIGJpbmFyeSAgICAgICBQcm90b2NvbCB0byB1c2UuCisgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHByZXNlbnQsIHVzZSBTU0wuCisgIC0tdHJhbnNwb3J0IHtidWZmZXJlZHxmcmFtZWR9ICAgYnVmZmVyZWQgICAgIFRyYW5zcG9ydCB0byB1c2UuCiAKLW15ICRzb2NrZXQgPSBuZXcgVGhyaWZ0OjpTb2NrZXQoJGhvc3QsICRwb3J0KTsKK0VPRgorfQogCi1teSAkYnVmZmVyZWRTb2NrZXQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LCAxMDI0LCAxMDI0KTsKLW15ICR0cmFuc3BvcnQgPSAkYnVmZmVyZWRTb2NrZXQ7Ci1teSAkcHJvdG9jb2wgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLW15ICR0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKK215ICVvcHRzID0gKAorICAgICdwb3J0JyA9PiA5MDkwLAorICAgICdwcm90b2NvbCcgPT4gJ2JpbmFyeScsCisgICAgJ3RyYW5zcG9ydCcgPT4gJ2J1ZmZlcmVkJworKTsKIAotZXZhbHsKLSR0cmFuc3BvcnQtPm9wZW4oKTsKLX07IGlmKCRAKXsKK0dldE9wdGlvbnMoXCVvcHRzLCBxdyAoCisgICAgY2E9cworICAgIGNlcnQ9cworICAgIGNpcGhlcnM9cworICAgIGtleT1zCisgICAgZG9tYWluLXNvY2tldD1zCisgICAgaGVscAorICAgIGhvc3Q9cworICAgIHBvcnQ9aQorICAgIHByb3RvY29sPXMKKyAgICBzc2wKKyAgICB0cmFuc3BvcnQ9cworKSkgfHwgZXhpdCAxOworCitpZiAoJG9wdHN7aGVscH0pIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMDsKK30KKworbXkgJHNvY2tldCA9IHVuZGVmOworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkc29ja2V0ID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSk7Cit9CitlbHNpZiAoJG9wdHN7c3NsfSkgeworICAkc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldyhcJW9wdHMpOworfQorZWxzZSB7CisgICRzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KCRvcHRze2hvc3R9LCAkb3B0c3twb3J0fSk7Cit9CisKK215ICR0cmFuc3BvcnQ7CitpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnYnVmZmVyZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0LCAxMDI0LCAxMDI0KTsKK30KK2Vsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCk7Cit9CitlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJHByb3RvY29sOworbXkgJHByb3RvY29sMjsKK2lmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScgfHwgJG9wdHN7cHJvdG9jb2x9IGVxICdtdWx0aScpIHsKKyAgICAkcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLT5uZXcoJHRyYW5zcG9ydCk7Cit9CitlbHNlIHsKKyAgICB1c2FnZSgpOworICAgIGV4aXQgMTsKK30KKworbXkgJHNlY29uZFNlcnZpY2UgPSB1bmRlZjsKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgJHByb3RvY29sMiAgICAgPSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2wtPm5ldygkcHJvdG9jb2wsICdTZWNvbmRTZXJ2aWNlJyk7CisgICRwcm90b2NvbCAgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnVGhyaWZ0VGVzdCcpOworICAkc2Vjb25kU2VydmljZSA9IFRocmlmdFRlc3Q6OlNlY29uZFNlcnZpY2VDbGllbnQtPm5ldygkcHJvdG9jb2wyKTsKK30KKworbXkgJHRlc3RDbGllbnQgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0Q2xpZW50LT5uZXcoJHByb3RvY29sKTsKKworZXZhbCB7CisgICR0cmFuc3BvcnQtPm9wZW4oKTsKK307CitpZigkQCl7CiAgICAgZGllKER1bXBlcigkQCkpOwogfQorCit1c2UgY29uc3RhbnQgRVJSX0JBU0VUWVBFUyA9PiAxOwordXNlIGNvbnN0YW50IEVSUl9TVFJVQ1RTID0+IDI7Cit1c2UgY29uc3RhbnQgRVJSX0NPTlRBSU5FUlMgPT4gNDsKK3VzZSBjb25zdGFudCBFUlJfRVhDRVBUSU9OUyA9PiA4OwordXNlIGNvbnN0YW50IEVSUl9QUk9UT0NPTCA9PiAxNjsKK3VzZSBjb25zdGFudCBFUlJfVU5LTk9XTiA9PiA2NDsKKwogbXkgJHN0YXJ0ID0gZ2V0dGltZW9mZGF5KCk7CiAKICMKICMgVk9JRCBURVNUCiAjCi1wcmludCgidGVzdFZvaWQoKSIpOworcHJpbnQoJ3Rlc3RWb2lkKCknKTsKICR0ZXN0Q2xpZW50LT50ZXN0Vm9pZCgpOwogcHJpbnQoIiA9IHZvaWRcbiIpOwogCiAjCiAjIFNUUklORyBURVNUCiAjCi1wcmludCgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLW15ICRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoIlRlc3QiKTsKLXByaW50KCIgPSBcIiRzXCJcbiIpOworcHJpbnQoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOworbXkgJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygnVGVzdCcpOworcHJpbnQocXF8ID0gIiRzIlxufCk7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkcyBuZSAnVGVzdCcpOworCisjCisjIE1VTFRJUExFWEVEIFRFU1QKKyMKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgICBwcmludCgnc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKScpOworICAgICRzID0gJHNlY29uZFNlcnZpY2UtPnNlY29uZHRlc3RTdHJpbmcoJ1Rlc3QyJyk7CisgICAgcHJpbnQocXF8ID0gIiRzIlxufCk7CisgICAgZXhpdChFUlJfUFJPVE9DT0wpIGlmICgkcyBuZSAndGVzdFN0cmluZygiVGVzdDIiKScpOworfQorCisjCisjIEJPT0wgVEVTVAorIworcHJpbnQoJ3Rlc3RCb29sKDEpJyk7CitteSAkdCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qm9vbCgxKTsKK3ByaW50KCIgPSAkdFxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkdCBuZSAxKTsKK3ByaW50KCd0ZXN0Qm9vbCgwKScpOworbXkgJGYgPSAkdGVzdENsaWVudC0+dGVzdEJvb2woMCk7CitwcmludCgiID0gJGZcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGYgbmUgcXx8KTsKKwogCiAjCiAjIEJZVEUgVEVTVAogIwotcHJpbnQoInRlc3RCeXRlKDEpIik7CitwcmludCgndGVzdEJ5dGUoMSknKTsKIG15ICR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKIHByaW50KCIgPSAkdThcbiIpOwogCiAjCiAjIEkzMiBURVNUCiAjCi1wcmludCgidGVzdEkzMigtMSkiKTsKK3ByaW50KCd0ZXN0STMyKC0xKScpOwogbXkgJGkzMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKC0xKTsKIHByaW50KCIgPSAkaTMyXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpMzIgbmUgLTEpOwogCiAjCi0jSTY0IFRFU1QKKyMgSTY0IFRFU1QKICMKLXByaW50KCJ0ZXN0STY0KC0zNDM1OTczODM2OCkiKTsKK3ByaW50KCd0ZXN0STY0KC0zNDM1OTczODM2OCknKTsKIG15ICRpNjQgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogcHJpbnQoIiA9ICRpNjRcbiIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJGk2NCBuZSAtMzQzNTk3MzgzNjgpOwogCiAjCiAjIERPVUJMRSBURVNUCiAjCi1wcmludCgidGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCkiKTsKK3ByaW50KCd0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KScpOwogbXkgJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKIHByaW50KCIgPSAkZHViXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRkdWIgbmUgLTg1Mi4yMzQyMzQyMzQpOworCisjCisjIEJJTkFSWSBURVNUICAgLS0tICBUT0RPCisjCisKIAogIwogIyBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3RTdHJ1Y3Qoe1wiWmVyb1wiLCAxLCAtMywgLTV9KSIpOwotbXkgJG91dCA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QoKTsKLSRvdXQtPnN0cmluZ190aGluZygiWmVybyIpOworcHJpbnQoJ3Rlc3RTdHJ1Y3QoeyJaZXJvIiwgMSwgLTMsIC01fSknKTsKK215ICRvdXQgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJG91dC0+c3RyaW5nX3RoaW5nKCdaZXJvJyk7CiAkb3V0LT5ieXRlX3RoaW5nKDEpOwogJG91dC0+aTMyX3RoaW5nKC0zKTsKICRvdXQtPmk2NF90aGluZygtNSk7CiBteSAkaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cnVjdCgkb3V0KTsKLXByaW50KCIgPSB7XCIiLiRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICAgJGluLT5ieXRlX3RoaW5nLiIsICIuCi0gICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCitwcmludCgnID0geyInLiRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICAgJGluLT5pMzJfdGhpbmcuJywgJy4KICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn1cbiIpOwogCiAjCiAjIE5FU1RFRCBTVFJVQ1QgVEVTVAogIwotcHJpbnQoInRlc3ROZXN0KHsxLCB7XCJaZXJvXCIsIDEsIC0zLCAtNX0sIDV9Iik7Ci1teSAkb3V0MiA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3QyKCk7CitwcmludCgndGVzdE5lc3QoezEsIHsiWmVybyIsIDEsIC0zLCAtNX0sIDV9Jyk7CitteSAkb3V0MiA9IFRocmlmdFRlc3Q6Olh0cnVjdDItPm5ldygpOwogJG91dDItPmJ5dGVfdGhpbmcoMSk7CiAkb3V0Mi0+c3RydWN0X3RoaW5nKCRvdXQpOwogJG91dDItPmkzMl90aGluZyg1KTsKIG15ICRpbjIgPSAkdGVzdENsaWVudC0+dGVzdE5lc3QoJG91dDIpOwogJGluID0gJGluMi0+c3RydWN0X3RoaW5nOwotcHJpbnQoIiA9IHsiLiRpbjItPmJ5dGVfdGhpbmcuIiwge1wiIi4KLSAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiJcIiwgIi4KLSAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgJGluLT5pMzJfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTY0X3RoaW5nLiJ9LCAiLgorcHJpbnQoJyA9IHsnLiRpbjItPmJ5dGVfdGhpbmcuJywgeyInLgorICAgICAgJGluLT5zdHJpbmdfdGhpbmcuJyIsICcuCisgICAgICAkaW4tPmJ5dGVfdGhpbmcuJywgJy4KKyAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCisgICAgICAkaW4tPmk2NF90aGluZy4nfSwgJy4KICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKICMKQEAgLTEzNywyOCArMjYxLDMwIEBACiBmb3IgKG15ICRpID0gMDsgJGkgPCA1OyArKyRpKSB7CiAgICRtYXBvdXQtPnskaX0gPSAkaS0xMDsKIH0KLXByaW50KCJ0ZXN0TWFwKHsiKTsKK3ByaW50KCd0ZXN0TWFwKHsnKTsKIG15ICRmaXJzdCA9IDE7CiB3aGlsZSggbXkoJGtleSwkdmFsKSA9IGVhY2ggJSRtYXBvdXQpIHsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQotcHJpbnQoIn0pIik7CitwcmludCgnfSknKTsKIAogCiBteSAkbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdE1hcCgkbWFwb3V0KTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogCiAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwaW4pewogICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50KCcsICcpOwogICAgIH0KICAgICBwcmludCgiJGtleSA9PiAkdmFsIik7CiB9CkBAIC0xNzIsMTEgKzI5OCwxMSBAQAogICAgIHB1c2goQCRzZXRvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RTZXQoeyIuam9pbigiLCIsQCRzZXRvdXQpLiJ9KSIpOworcHJpbnQoJ3Rlc3RTZXQoeycuam9pbignLCcsQCRzZXRvdXQpLid9KScpOwogCiBteSAkc2V0aW4gPSAkdGVzdENsaWVudC0+dGVzdFNldCgkc2V0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRzZXRvdXQpLiJ9XG4iKTsKIAogIwogIyBMSVNUIFRFU1QKQEAgLTE4NiwxMDUgKzMxMiwxMTEgQEAKICAgICBwdXNoKEAkbGlzdG91dCwgJGkpOwogfQogCi1wcmludCgidGVzdExpc3QoeyIuam9pbigiLCIsQCRsaXN0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0TGlzdCh7Jy5qb2luKCcsJyxAJGxpc3RvdXQpLid9KScpOwogCiBteSAkbGlzdGluID0gJHRlc3RDbGllbnQtPnRlc3RMaXN0KCRsaXN0b3V0KTsKIAotcHJpbnQoIiA9IHsiLmpvaW4oIiwiLEAkbGlzdGluKS4ifVxuIik7CitwcmludCgnID0geycuam9pbignLCcsQCRsaXN0aW4pLiJ9XG4iKTsKIAogIwogIyBFTlVNIFRFU1QKICMKLXByaW50KCJ0ZXN0RW51bShPTkUpIik7CitwcmludCgndGVzdEVudW0oT05FKScpOwogbXkgJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpPTkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oVFdPKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRXTyknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VFdPKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRIUkVFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKFRIUkVFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpUSFJFRSk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShGSVZFKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEZJVkUpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkZJVkUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRUlHSFQpIik7CitwcmludCgndGVzdEVudW0oRUlHSFQpJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAogIwogIyBUWVBFREVGIFRFU1QKICMKLXByaW50KCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CitwcmludCgndGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKScpOwogbXkgJHVpZCA9ICR0ZXN0Q2xpZW50LT50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpOwogcHJpbnQoIiA9ICR1aWRcbiIpOwogCiAjCiAjIE5FU1RFRCBNQVAgVEVTVAogIwotcHJpbnQoInRlc3RNYXBNYXAoMSkiKTsKK3ByaW50KCd0ZXN0TWFwTWFwKDEpJyk7CiBteSAkbW0gPSAkdGVzdENsaWVudC0+dGVzdE1hcE1hcCgxKTsKLXByaW50KCIgPSB7Iik7CitwcmludCgnID0geycpOwogd2hpbGUoIG15ICgka2V5LCR2YWwpID0gZWFjaCAlJG1tKSB7CiAgICAgcHJpbnQoIiRrZXkgPT4geyIpOwogICAgIHdoaWxlKCBteSgkazIsJHYyKSA9IGVhY2ggJSR2YWwpIHsKICAgICAgICAgcHJpbnQoIiRrMiA9PiAkdjIsICIpOwogICAgIH0KLSAgICBwcmludCgifSwgIik7CisgICAgcHJpbnQoJ30sICcpOwogfQogcHJpbnQoIn1cbiIpOwogCiAjCiAjIElOU0FOSVRZIFRFU1QKICMKLW15ICRpbnNhbmUgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKK215ICRpbnNhbmUgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KCk7CiAkaW5zYW5lLT57dXNlck1hcH0tPntUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFfSA9IDUwMDA7Ci1teSAkdHJ1Y2sgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kdHJ1Y2stPnN0cmluZ190aGluZygiVHJ1Y2siKTsKLSR0cnVjay0+Ynl0ZV90aGluZyg4KTsKLSR0cnVjay0+aTMyX3RoaW5nKDgpOwotJHRydWNrLT5pNjRfdGhpbmcoOCk7CitteSAkdHJ1Y2sgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJHRydWNrLT5zdHJpbmdfdGhpbmcoJ0hlbGxvMicpOworJHRydWNrLT5ieXRlX3RoaW5nKDIpOworJHRydWNrLT5pMzJfdGhpbmcoMik7CiskdHJ1Y2stPmk2NF90aGluZygyKTsKK215ICR0cnVjazIgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldygpOworJHRydWNrMi0+c3RyaW5nX3RoaW5nKCdHb29kYnllNCcpOworJHRydWNrMi0+Ynl0ZV90aGluZyg0KTsKKyR0cnVjazItPmkzMl90aGluZyg0KTsKKyR0cnVjazItPmk2NF90aGluZyg0KTsKIHB1c2goQHskaW5zYW5lLT57eHRydWN0c319LCAkdHJ1Y2spOworcHVzaChAeyRpbnNhbmUtPnt4dHJ1Y3RzfX0sICR0cnVjazIpOwogCi1wcmludCgidGVzdEluc2FuaXR5KCkiKTsKK3ByaW50KCd0ZXN0SW5zYW5pdHkoKScpOwogbXkgJHdob2EgPSAkdGVzdENsaWVudC0+dGVzdEluc2FuaXR5KCRpbnNhbmUpOwotcHJpbnQoIiA9IHsiKTsKK3ByaW50KCcgPSB7Jyk7CiB3aGlsZSggbXkgKCRrZXksJHZhbCkgPSBlYWNoICUkd2hvYSkgewogICAgIHByaW50KCIka2V5ID0+IHsiKTsKICAgICB3aGlsZSggbXkoJGsyLCR2MikgPSBlYWNoICUkdmFsKSB7CiAgICAgICAgIHByaW50KCIkazIgPT4geyIpOwogICAgICAgICBteSAkdXNlck1hcCA9ICR2Mi0+e3VzZXJNYXB9OwotICAgICAgICBwcmludCgieyIpOwotICAgICAgICBpZiAocmVmKCR1c2VyTWFwKSBlcSAiSEFTSCIpIHsKKyAgICAgICAgcHJpbnQoJ3snKTsKKyAgICAgICAgaWYgKHJlZigkdXNlck1hcCkgZXEgJ0hBU0gnKSB7CiAgICAgICAgICAgICB3aGlsZSggbXkoJGszLCR2MykgPSBlYWNoICUkdXNlck1hcCkgewogICAgICAgICAgICAgICAgIHByaW50KCIkazMgPT4gJHYzLCAiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwcmludCgifSwgIik7CisgICAgICAgIHByaW50KCd9LCAnKTsKIAogICAgICAgICBteSAkeHRydWN0cyA9ICR2Mi0+e3h0cnVjdHN9OwotICAgICAgICBwcmludCgieyIpOwotICAgICAgICBpZiAocmVmKCR4dHJ1Y3RzKSBlcSAiQVJSQVkiKSB7CisgICAgICAgIHByaW50KCd7Jyk7CisgICAgICAgIGlmIChyZWYoJHh0cnVjdHMpIGVxICdBUlJBWScpIHsKICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHggKEAkeHRydWN0cykgewotICAgICAgICAgICAgICAgIHByaW50KCJ7XCIiLiR4LT57c3RyaW5nX3RoaW5nfS4iXCIsICIuCi0gICAgICAgICAgICAgICAgICAgICAgJHgtPntieXRlX3RoaW5nfS4iLCAiLiR4LT57aTMyX3RoaW5nfS4iLCAiLiR4LT57aTY0X3RoaW5nfS4ifSwgIik7CisgICAgICAgICAgICAgICAgcHJpbnQoJ3siJy4keC0+e3N0cmluZ190aGluZ30uJyIsICcuCisgICAgICAgICAgICAgICAgICAgICAgJHgtPntieXRlX3RoaW5nfS4nLCAnLiR4LT57aTMyX3RoaW5nfS4nLCAnLiR4LT57aTY0X3RoaW5nfS4nfSwgJyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnQoIn0iKTsKKyAgICAgICAgcHJpbnQoJ30nKTsKIAotICAgICAgICBwcmludCgifSwgIik7CisgICAgICAgIHByaW50KCd9LCAnKTsKICAgICB9Ci0gICAgcHJpbnQoIn0sICIpOworICAgIHByaW50KCd9LCAnKTsKIH0KIHByaW50KCJ9XG4iKTsKIAogIwogIyBFWENFUFRJT04gVEVTVAogIwotcHJpbnQoInRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykiKTsKK3ByaW50KHF8dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKXwpOwogZXZhbCB7CiAgICAgJHRlc3RDbGllbnQtPnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CiAgICAgcHJpbnQoIiAgdm9pZFxuRkFJTFVSRVxuIik7CkBAIC0yOTcsNyArNDI5LDcgQEAKICMgTm9ybWFsIHRlc3RzIGRvbmUuCiAjCiBteSAkc3RvcCA9IGdldHRpbWVvZmRheSgpOwotbXkgJGVscCAgPSBzcHJpbnRmKCIlZCIsMTAwMCooJHN0b3AgLSAkc3RhcnQpLCAwKTsKK215ICRlbHAgID0gc3ByaW50ZignJWQnLDEwMDAqKCRzdG9wIC0gJHN0YXJ0KSwgMCk7CiBwcmludCgiVG90YWwgdGltZTogJGVscCBtc1xuIik7CiAKICMKZGlmZiAtLWdpdCBhL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsIGIvdGVzdC9wZXJsL1Rlc3RTZXJ2ZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiOWEzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGVybC9UZXN0U2VydmVyLnBsCkBAIC0wLDAgKzEsNDExIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit1c2UgNS4xMC4wOwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2UgR2V0b3B0OjpMb25nIHF3KEdldE9wdGlvbnMpOwordXNlIFRpbWU6OkhpUmVzIHF3KGdldHRpbWVvZmRheSk7CisKKyRTSUd7SU5UfSA9IFwmc2lnaW50X2hhbmRsZXI7CisKK3VzZSBsaWIgJy4uLy4uL2xpYi9wZXJsL2xpYic7Cit1c2UgbGliICdnZW4tcGVybCc7CisKK3VzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3I7Cit1c2UgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQ7Cit1c2UgVGhyaWZ0OjpTZXJ2ZXI7Cit1c2UgVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0OworCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKK3VzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwordXNlIFRocmlmdFRlc3Q6OlR5cGVzOworCiskfCsrOworCitzdWIgdXNhZ2UgeworICAgIHByaW50IDw8IkVPRiI7CitVc2FnZTogJDAgW09QVElPTlNdCisKK09wdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCkKKyAgLS1jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgYXV0aG9yaXR5IGZpbGUgKG9wdGlvbmFsKS4KKyAgLS1jZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tY2lwaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdGFibGUgY2lwaGVyIGxpc3QuCisgIC0tZG9tYWluLXNvY2tldCA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHVuaXggZG9tYWluIHNvY2tldC4KKyAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB1c2FnZS4KKyAgLS1rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpdmF0ZSBrZXkgZmlsZSBmb3IgY2VydGlmaWNhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVpcmVkIGlmIHVzaW5nIC0tc3NsIGFuZCBwcml2YXRlIGtleSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaW4gdGhlIGNlcnRpZmljYXRlIGZpbGUuCisgIC0tcG9ydCA8cG9ydG51bT4gICAgICAgICAgICAgICAgOTA5MCAgICAgICAgIFBvcnQgdG8gdXNlLgorICAtLXByb3RvY29sIHtiaW5hcnl9ICAgICAgICAgICAgIGJpbmFyeSAgICAgICBQcm90b2NvbCB0byB1c2UuCisgIC0tc3NsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHByZXNlbnQsIHVzZSBTU0wvVExTLgorICAtLXRyYW5zcG9ydCB7YnVmZmVyZWR8ZnJhbWVkfSAgIGJ1ZmZlcmVkICAgICBUcmFuc3BvcnQgdG8gdXNlLgorCitFT0YKK30KKworbXkgJW9wdHMgPSAoCisgICAgJ3BvcnQnID0+IDkwOTAsCisgICAgJ3Byb3RvY29sJyA9PiAnYmluYXJ5JywKKyAgICAndHJhbnNwb3J0JyA9PiAnYnVmZmVyZWQnCispOworCitHZXRPcHRpb25zKFwlb3B0cywgcXcgKAorICAgIGNhPXMKKyAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKKyAgICBkb21haW4tc29ja2V0PXMKKyAgICBoZWxwCisgICAgaG9zdD1zCisgICAga2V5PXMKKyAgICBwb3J0PWkKKyAgICBwcm90b2NvbD1zCisgICAgc3NsCisgICAgdHJhbnNwb3J0PXMKKykpIHx8IGV4aXQgMTsKKworaWYgKCRvcHRze2hlbHB9KSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDA7Cit9CisKK2lmICgkb3B0c3tzc2x9IGFuZCBub3QgZGVmaW5lZCAkb3B0c3tjZXJ0fSkgeworICAgIHVzYWdlKCk7CisgICAgZXhpdCAxOworfQorCitteSAkaGFuZGxlciAgICA9IFRocmlmdFRlc3RIYW5kbGVyLT5uZXcoKTsKK215ICRoYW5kbGVyMiAgID0gU2Vjb25kU2VydmljZUhhbmRsZXItPm5ldygpOworbXkgJHByb2Nlc3NvciAgPSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0UHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIpOworbXkgJHByb2Nlc3NvcjIgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yLT5uZXcoJGhhbmRsZXIyKTsKKworbXkgJHNlcnZlcnNvY2tldDsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgdW5saW5rKCRvcHRzeydkb21haW4tc29ja2V0J30pOworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKK30KK2Vsc2lmICgkb3B0c3tzc2x9KSB7CisgICAgJHNlcnZlcnNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitteSAkdHJhbnNwb3J0OworaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCk7Cit9CitlbHNpZiAoJG9wdHN7dHJhbnNwb3J0fSBlcSAnZnJhbWVkJykgeworICAgICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CitteSAkcHJvdG9jb2w7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnktPm5ldygpOworfQorZWxzZSB7CisgICAgdXNhZ2UoKTsKKyAgICBleGl0IDE7Cit9CisKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgbXkgJG5ld1Byb2Nlc3NvciA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3ItPm5ldygkcHJvdG9jb2wpOworICAkbmV3UHJvY2Vzc29yLT5kZWZhdWx0UHJvY2Vzc29yKCRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignVGhyaWZ0VGVzdCcsICRwcm9jZXNzb3IpOworICAkbmV3UHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcignU2Vjb25kU2VydmljZScsICRwcm9jZXNzb3IyKTsKKyAgJHByb2Nlc3NvciA9ICRuZXdQcm9jZXNzb3I7Cit9CisKK215ICRzc2x0YWcgPSAnJzsKK2lmICgkb3B0c3tzc2x9KSB7CisgICAgJHNzbHRhZyA9ICcoU1NMKSc7Cit9CitteSAkbGlzdGVuaW5nX29uID0gIiRvcHRze3BvcnR9ICRzc2x0YWciOworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkbGlzdGVuaW5nX29uID0gJG9wdHN7J2RvbWFpbi1zb2NrZXQnfTsKK30KK215ICRzZXJ2ZXIgPSBUaHJpZnQ6OlNpbXBsZVNlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7CitwcmludCBxcXxTdGFydGluZyAic2ltcGxlIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRsaXN0ZW5pbmdfb25cbnw7Ciskc2VydmVyLT5zZXJ2ZSgpOworcHJpbnQgImRvbmUuXG4iOworCitzdWIgc2lnaW50X2hhbmRsZXIgeworICBwcmludCAicmVjZWl2ZWQgU0lHSU5ULCBzdG9wcGluZy4uLlxuIjsKKyAgJHNlcnZlci0+c3RvcCgpOworfQorCisjIyMKKyMjIyBUZXN0IHNlcnZlciBpbXBsZW1lbnRhdGlvbgorIyMjCisKK3BhY2thZ2UgVGhyaWZ0VGVzdEhhbmRsZXI7CisKK3VzZSBiYXNlIHF3KCBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0SWYgKTsKKworc3ViIG5ldyB7CisgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OworICAgIG15ICRzZWxmID0ge307CisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKK30KKworc3ViIHRlc3RWb2lkIHsKKyAgcHJpbnQoInRlc3RWb2lkKClcbiIpOworfQorCitzdWIgdGVzdFN0cmluZyB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdFN0cmluZygkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RCb29sIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIG15ICRzdHIgPSAkdGhpbmcgPyAndHJ1ZScgOiAnZmFsc2UnOworICBwcmludCgidGVzdEJvb2woJHN0cilcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEJ5dGUgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RCeXRlKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEkzMiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludCgidGVzdEkzMigkdGhpbmcpXG4iKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RJNjQgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RJNjQoJHRoaW5nKVxuIik7CisgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0RG91YmxlIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0RG91YmxlKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdEJpbmFyeSB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgICBteSBAYnl0ZXMgPSBzcGxpdCAvLywgJHRoaW5nOworICAgIHByaW50ICd0ZXN0QmluYXJ5KCc7CisgICAgcHJpbnRmKCAnJTAybHgnLCBvcmQgJF8gKSBmb3JlYWNoIChAYnl0ZXMpOworICAgIHByaW50ICIpXG4iOworICAgIHJldHVybiAkdGhpbmc7Cit9CisKK3N1YiB0ZXN0U3RydWN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ZihxcXx0ZXN0U3RydWN0KHsiJXMiLCAlZCwgJWQsICVsbGR9KVxufCwKKyAgICAgICAgICAgJHRoaW5nLT57c3RyaW5nX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57Ynl0ZV90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2kzMl90aGluZ30sCisgICAgICAgICAgICR0aGluZy0+e2k2NF90aGluZ30pOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdE5lc3QgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkbmVzdCA9IHNoaWZ0OworICBteSAkdGhpbmcgPSAkbmVzdC0+e3N0cnVjdF90aGluZ307CisgIHByaW50ZihxcXx0ZXN0TmVzdCh7JWQsIHsiJXMiLCAlZCwgJWQsICVsbGR9LCAlZH0pXG58LAorICAgICAgICAgICAkbmVzdC0+e2J5dGVfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntzdHJpbmdfdGhpbmd9LAorICAgICAgICAgICAkdGhpbmctPntieXRlX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57aTMyX3RoaW5nfSwKKyAgICAgICAgICAgJHRoaW5nLT57aTY0X3RoaW5nfSwKKyAgICAgICAgICAgJG5lc3QtPntpMzJfdGhpbmd9KTsKKyAgcmV0dXJuICRuZXN0OworfQorCitzdWIgdGVzdE1hcCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYgInRlc3RNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFN0cmluZ01hcCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBwcmludGYgInRlc3RTdHJpbmdNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFNldCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICR0aGluZyA9IHNoaWZ0OworICBteSBAcmVzdWx0ID0gc29ydCBrZXlzICUkdGhpbmc7CisgIHByaW50ZiAidGVzdFNldCh7JXN9KVxuIiwgam9pbignLCAnLCBAcmVzdWx0ICk7CisgIHJldHVybiBcQHJlc3VsdDsKK30KKworc3ViIHRlc3RMaXN0IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ICJ0ZXN0TGlzdCh7JXN9KVxuIiwgam9pbignLCAnLCBAJHRoaW5nKTsKKyAgcmV0dXJuICR0aGluZzsKK30KKworc3ViIHRlc3RFbnVtIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50ICJ0ZXN0RW51bSgkdGhpbmcpXG4iOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdFR5cGVkZWYgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkdGhpbmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RUeXBlZGVmKCR0aGluZylcbiIpOworICByZXR1cm4gJHRoaW5nOworfQorCitzdWIgdGVzdE1hcE1hcCB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRoZWxsbyA9IHNoaWZ0OworCisgIHByaW50ZigidGVzdE1hcE1hcCglZClcbiIsICRoZWxsbyk7CisgIG15ICRyZXN1bHQgPSB7IDQgPT4geyAxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQgfSwgLTQgPT4geyAtMSA9PiAtMSwgLTIgPT4gLTIsIC0zID0+IC0zLCAtNCA9PiAtNCB9IH07CisgIHJldHVybiAkcmVzdWx0OworfQorCitzdWIgdGVzdEluc2FuaXR5IHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJGFyZ3VtZW50ID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0SW5zYW5pdHkoKVxuIik7CisKKyAgbXkgJGhlbGxvID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKKyAgbXkgQGhlbGxvczsKKyAgcHVzaChAaGVsbG9zLCAkaGVsbG8pOworICBteSAkZ29vZGJ5ZSA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0dvb2RieWU0JywgYnl0ZV90aGluZyA9PiA0LCBpMzJfdGhpbmcgPT4gNCwgaTY0X3RoaW5nID0+IDR9KTsKKyAgbXkgQGdvb2RieWVzOworICBwdXNoKEBnb29kYnllcywgJGdvb2RieWUpOworICBteSAkY3JhenkgPSBUaHJpZnRUZXN0OjpJbnNhbml0eS0+bmV3KHt1c2VyTWFwID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6RUlHSFQgPT4gOCB9LCB4dHJ1Y3RzID0+IFxAZ29vZGJ5ZXN9KTsKKyAgbXkgJGxvb255ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldygpOworICBteSAkcmVzdWx0ID0geyAxID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6VFdPID0+ICRhcmd1bWVudCwgVGhyaWZ0VGVzdDo6TnVtYmVyejo6VEhSRUUgPT4gJGFyZ3VtZW50IH0sCisgICAgICAgICAgICAgICAgIDIgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpTSVggPT4gJGxvb255IH0gfTsKKyAgcmV0dXJuICRyZXN1bHQ7Cit9CisKK3N1YiB0ZXN0TXVsdGkgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkYXJnMCA9IHNoaWZ0OworICBteSAkYXJnMSA9IHNoaWZ0OworICBteSAkYXJnMiA9IHNoaWZ0OworICBteSAkYXJnMyA9IHNoaWZ0OworICBteSAkYXJnNCA9IHNoaWZ0OworICBteSAkYXJnNSA9IHNoaWZ0OworCisgIHByaW50KCJ0ZXN0TXVsdGkoKVxuIik7CisgIHJldHVybiBUaHJpZnRUZXN0OjpYdHJ1Y3QtPm5ldyh7c3RyaW5nX3RoaW5nID0+ICdIZWxsbzInLCBieXRlX3RoaW5nID0+ICRhcmcwLCBpMzJfdGhpbmcgPT4gJGFyZzEsIGk2NF90aGluZyA9PiAkYXJnMn0pOworfQorCitzdWIgdGVzdEV4Y2VwdGlvbiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmcgPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RFeGNlcHRpb24oJGFyZylcbiIpOworICBpZiAoJGFyZyBlcSAnWGNlcHRpb24nKSB7CisgICAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOworICB9CisgIGVsc2lmICgkYXJnIGVxICdURXhjZXB0aW9uJykgeworICAgICAgZGllICdhc3RyaW5nJzsgIyBhbGwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYmVjb21lIFRFeGNlcHRpb25zCisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAkYXJnfSk7CisgIH0KK30KKworc3ViIHRlc3RNdWx0aUV4Y2VwdGlvbiB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRhcmcwID0gc2hpZnQ7CisgIG15ICRhcmcxID0gc2hpZnQ7CisKKyAgcHJpbnRmKCJ0ZXN0TXVsdGlFeGNlcHRpb24oJXMsICVzKVxuIiwgJGFyZzAsICRhcmcxKTsKKyAgaWYgKCRhcmcwIGVxICdYY2VwdGlvbicpIHsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nfSk7CisgIH0KKyAgZWxzaWYgKCRhcmcwIGVxICdYY2VwdGlvbjInKSB7CisgICAgbXkgJHN0cnVjdF90aGluZyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJ30pOworICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbjItPm5ldyh7ZXJyb3JDb2RlID0+IDIwMDIsIHN0cnVjdF90aGluZyA9PiAkc3RydWN0X3RoaW5nfSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKKyAgfQorfQorCitzdWIgdGVzdE9uZXdheSB7CisgIG15ICRzZWxmID0gc2hpZnQ7CisgIG15ICRudW0gPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RPbmV3YXkoJG51bSk6IHJlY2VpdmVkXG4iKTsKK30KKworIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFNlY29uZFNlcnZpY2VIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZUlmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBzZWNvbmR0ZXN0U3RyaW5nIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOworICByZXR1cm4gcXF8dGVzdFN0cmluZygiJHRoaW5nIil8OworfQorCisxOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvTWFrZWZpbGUuYW0gYi90ZXN0L3BocC9NYWtlZmlsZS5hbQppbmRleCAxNjI1OTAzLi43MmY3ZmM1IDEwMDc1NQotLS0gYS90ZXN0L3BocC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpAQCAtMTcsMTYgKzE3LDIzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBwaHA6aW5saW5lZCAuLi9UaHJpZnRUZXN0LnRocmlmdAorCSQoTUtESVJfUCkgZ2VuLXBocC1jbGFzc21hcAorCSQoVEhSSUZUKSAtb3V0IGdlbi1waHAtY2xhc3NtYXAgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAKLWNoZWNrOiBzdHVicworcGhwX2V4dF9kaXI6CisJbWtkaXIgLXAgcGhwX2V4dF9kaXIKKwlsbiAtcyAuLi8uLi8uLi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMvdGhyaWZ0X3Byb3RvY29sLnNvIHBocF9leHRfZGlyLworCWxuIC1zICIkJChwaHAtY29uZmlnIC0tZXh0ZW5zaW9uLWRpcikvc29ja2V0cy5zbyIgcGhwX2V4dF9kaXIvCisKK3ByZWNyb3NzOiBzdHVicyBwaHBfZXh0X2RpcgorCitjaGVjazogc3R1YnMgcGhwX2V4dF9kaXIKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLXBocCBnZW4tcGhwaQorCSQoUk0pIC1yIGdlbi1waHAgZ2VuLXBocGkgZ2VuLXBocC1jbGFzc21hcCBwaHBfZXh0X2RpcgogCi1jbGllbnQ6IHN0dWJzCitjbGllbnQ6IHN0dWJzIHBocF9leHRfZGlyCiAJcGhwIFRlc3RDbGllbnQucGhwCmRpZmYgLS1naXQgYS90ZXN0L3BocC9UZXN0Q2xhc3NtYXAucGhwIGIvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQxNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocApAQCAtMCwwICsxLDIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKzw/cGhwCiskR0VOX0RJUiA9ICdnZW4tcGhwLWNsYXNzbWFwJzsKK2luY2x1ZGVfb25jZSgnVGVzdENsaWVudC5waHAnKTsKKz8+CmRpZmYgLS1naXQgYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCmluZGV4IDRkZjQ5OGMuLmFjZDkwMWQgMTAwNzU1Ci0tLSBhL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCisrKyBiL3Rlc3QvcGhwL1Rlc3RDbGllbnQucGhwCkBAIC0yLDcgKzIsOCBAQAogCiBuYW1lc3BhY2UgdGVzdFxwaHA7CiAKLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CisvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CiAKIHVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CiAKQEAgLTEzLDEwICsxNCwxNCBAQAogICAkTU9ERSA9ICdub3JtYWwnOwogfQogCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vbGliL3BocC9saWInKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsICRHRU5fRElSKTsKLSRsb2FkZXItPnJlZ2lzdGVyKCk7CisKK2lmICgkR0VOX0RJUiA9PSAnZ2VuLXBocCcpIHsKKyAgJGxvYWRlci0+YWRkUHNyNCgnJywgJEdFTl9ESVIpOworfSBlbHNlIHsKKyAgJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOworICAkbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCAkR0VOX0RJUik7CisgICRsb2FkZXItPnJlZ2lzdGVyKCk7Cit9CiAKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0zOCw4ICs0MywxMSBAQAogICovCiAKIC8qKiBJbmNsdWRlIHRoZSBUaHJpZnQgYmFzZSAqLwotLyoqIEluY2x1ZGUgdGhlIGJpbmFyeSBwcm90b2NvbCAqLworLyoqIEluY2x1ZGUgdGhlIHByb3RvY29scyAqLwogdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkOwordXNlIFRocmlmdFxQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sOwordXNlIFRocmlmdFxQcm90b2NvbFxUSlNPTlByb3RvY29sOwogCiAvKiogSW5jbHVkZSB0aGUgc29ja2V0IGxheWVyICovCiB1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OwpAQCAtNDksNiArNTcsMjYgQEAKIHVzZSBUaHJpZnRcVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQ7CiB1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7CiAKK2Z1bmN0aW9uIG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pCit7CisgIGlmICgkUFJPVE8gPT0gJ2JpbmFyeScpIHsKKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgfSBlbHNlIGlmICgkUFJPVE8gPT0gJ2NvbXBhY3QnKSB7CisgICAgcmV0dXJuIG5ldyBUQ29tcGFjdFByb3RvY29sKCR0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKCRQUk9UTyA9PSAnanNvbicpIHsKKyAgICByZXR1cm4gbmV3IFRKU09OUHJvdG9jb2woJHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoJFBST1RPID09ICdhY2NlbCcpIHsKKyAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpKSB7CisgICAgICBlY2hvICJBY2NlbGVyYXRpb24gZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWRcbiI7CisgICAgICBleGl0KDEpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOworICB9CisKKyAgZWNobyAiLS1wcm90b2NvbCBtdXN0IGJlIG9uZSBvZiB7YmluYXJ5fGNvbXBhY3R8anNvbnxhY2NlbH1cbiI7CisgIGV4aXQoMSk7Cit9CisKICRob3N0ID0gJ2xvY2FsaG9zdCc7CiAkcG9ydCA9IDkwOTA7CiAKQEAgLTYwLDYgKzg4LDE2IEBACiAgICRob3N0ID0gJGFyZ3ZbMV07CiB9CiAKK2ZvcmVhY2ggKCRhcmd2IGFzICRhcmcpIHsKKyAgaWYgKHN1YnN0cigkYXJnLCAwLCA3KSA9PSAnLS1wb3J0PScpIHsKKyAgICAkcG9ydCA9IHN1YnN0cigkYXJnLCA3KTsKKyAgfSBlbHNlIGlmIChzdWJzdHIoJGFyZywgMCwgMTIpID09ICctLXRyYW5zcG9ydD0nKSB7CisgICAgJE1PREUgPSBzdWJzdHIoJGFyZywgMTIpOworICB9IGVsc2UgaWYgKHN1YnN0cigkYXJnLCAwLCAxMSkgPT0gJy0tcHJvdG9jb2w9JykgeworICAgICRQUk9UTyA9IHN1YnN0cigkYXJnLCAxMSk7CisgIH0KK30KKwogJGhvc3RzID0gYXJyYXkoJ2xvY2FsaG9zdCcpOwogCiAkc29ja2V0ID0gbmV3IFRTb2NrZXQoJGhvc3QsICRwb3J0KTsKQEAgLTcyLDEyICsxMTAsMTIgQEAKIH0gZWxzZSBpZiAoJE1PREUgPT0gJ2ZyYW1lZCcpIHsKICAgJGZyYW1lZFNvY2tldCA9IG5ldyBURnJhbWVkVHJhbnNwb3J0KCRzb2NrZXQpOwogICAkdHJhbnNwb3J0ID0gJGZyYW1lZFNvY2tldDsKLSAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgJHByb3RvY29sID0gbWFrZVByb3RvY29sKCR0cmFuc3BvcnQsICRQUk9UTyk7CiAgICR0ZXN0Q2xpZW50ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKIH0gZWxzZSB7CiAgICRidWZmZXJlZFNvY2tldCA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7CiAgICR0cmFuc3BvcnQgPSAkYnVmZmVyZWRTb2NrZXQ7Ci0gICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICRwcm90b2NvbCA9IG1ha2VQcm90b2NvbCgkdHJhbnNwb3J0LCAkUFJPVE8pOwogICAkdGVzdENsaWVudCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0Q2xpZW50KCRwcm90b2NvbCk7CiB9CiAKQEAgLTg1LDYgKzEyMywxMiBAQAogCiAkc3RhcnQgPSBtaWNyb3RpbWUodHJ1ZSk7CiAKK2RlZmluZSgnRVJSX0JBU0VUWVBFUycsIDEpOworZGVmaW5lKCdFUlJfU1RSVUNUUycsIDIpOworZGVmaW5lKCdFUlJfQ09OVEFJTkVSUycsIDQpOworZGVmaW5lKCdFUlJfRVhDRVBUSU9OUycsIDgpOworZGVmaW5lKCdFUlJfVU5LTk9XTicsIDY0KTsKKyRleGl0Y29kZSA9IDA7CiAvKioKICAqIFZPSUQgVEVTVAogICovCkBAIC05Miw0MCArMTM2LDU3IEBACiAkdGVzdENsaWVudC0+dGVzdFZvaWQoKTsKIHByaW50X3IoIiA9IHZvaWRcbiIpOwogCitmdW5jdGlvbiByb3VuZHRyaXAoJHRlc3RDbGllbnQsICRtZXRob2QsICR2YWx1ZSkgeworICBnbG9iYWwgJGV4aXRjb2RlOworICBwcmludF9yKCIkbWV0aG9kKCR2YWx1ZSkiKTsKKyAgJHJldCA9ICR0ZXN0Q2xpZW50LT4kbWV0aG9kKCR2YWx1ZSk7CisgIHByaW50X3IoIiA9IFwiJHJldFwiXG4iKTsKKyAgaWYgKCR2YWx1ZSAhPT0gJHJldCkgeworICAgIHByaW50X3IoIioqKiBGQUlMRUQgKioqXG4iKTsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgfQorfQorCiAvKioKICAqIFNUUklORyBURVNUCiAgKi8KLXByaW50X3IoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7Ci0kcyA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nKCJUZXN0Iik7Ci1wcmludF9yKCIgPSBcIiRzXCJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdFN0cmluZycsICJUZXN0Iik7CisKKy8qKgorICogQk9PTCBURVNUCisgKi8KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RCb29sJywgdHJ1ZSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qm9vbCcsIGZhbHNlKTsKIAogLyoqCiAgKiBCWVRFIFRFU1QKICAqLwotcHJpbnRfcigidGVzdEJ5dGUoMSkiKTsKLSR1OCA9ICR0ZXN0Q2xpZW50LT50ZXN0Qnl0ZSgxKTsKLXByaW50X3IoIiA9ICR1OFxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIDEpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEJ5dGUnLCAtMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIDEyNyk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0Qnl0ZScsIC0xMjgpOwogCiAvKioKICAqIEkzMiBURVNUCiAgKi8KLXByaW50X3IoInRlc3RJMzIoLTEpIik7Ci0kaTMyID0gJHRlc3RDbGllbnQtPnRlc3RJMzIoLTEpOwotcHJpbnRfcigiID0gJGkzMlxuIik7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgLTEpOwogCiAvKioKICAqIEk2NCBURVNUCiAgKi8KLXByaW50X3IoInRlc3RJNjQoLTM0MzU5NzM4MzY4KSIpOwotJGk2NCA9ICR0ZXN0Q2xpZW50LT50ZXN0STY0KC0zNDM1OTczODM2OCk7Ci1wcmludF9yKCIgPSAkaTY0XG4iKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAwKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAxKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAtMSk7Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STY0JywgLTM0MzU5NzM4MzY4KTsKIAogLyoqCiAgKiBET1VCTEUgVEVTVAogICovCi1wcmludF9yKCJ0ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KSIpOwotJGR1YiA9ICR0ZXN0Q2xpZW50LT50ZXN0RG91YmxlKC04NTIuMjM0MjM0MjM0KTsKLXByaW50X3IoIiA9ICRkdWJcbiIpOworcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdERvdWJsZScsIC04NTIuMjM0MjM0MjM0KTsKKworLyoqCisgKiBCSU5BUlkgVEVTVCAgLS0gIFRPRE8KKyAqLwogCiAvKioKICAqIFNUUlVDVCBURVNUCkBAIC0xNDIsNiArMjAzLDExIEBACiAgICAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAoraWYgKCRpbiAhPSAkb3V0KSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTkVTVEVEIFNUUlVDVCBURVNUCiAgKi8KQEAgLTE1OSw2ICsyMjUsMTEgQEAKICAgICAgICAgJGluLT5pNjRfdGhpbmcuIn0sICIuCiAgICAgICAgICRpbjItPmkzMl90aGluZy4ifVxuIik7CiAKK2lmICgkaW4yICE9ICRvdXQyKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CisKIC8qKgogICogTUFQIFRFU1QKICAqLwpAQCAtMTkxLDM2ICsyNjIsNjkgQEAKIH0KIHByaW50X3IoIn1cbiIpOwogCitpZiAoJG1hcGluICE9ICRtYXBvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKworJG1hcG91dCA9IGFycmF5KCk7Citmb3IgKCRpID0gMDsgJGkgPCAxMDsgJGkrKykgeworICAgICRtYXBvdXRbImtleSRpIl0gPSAidmFsJGkiOworfQorcHJpbnRfcigndGVzdFN0cmluZ01hcCh7Jyk7CiskZmlyc3QgPSB0cnVlOworZm9yZWFjaCAoJG1hcG91dCBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn0pIik7CiskbWFwaW4gPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZ01hcCgkbWFwb3V0KTsKK3ByaW50X3IoIiA9IHsiKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwaW4gYXMgJGtleSA9PiAkdmFsKSB7CisgIGlmICgkZmlyc3QpIHsKKyAgICAkZmlyc3QgPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBwcmludF9yKCIsICIpOworICB9CisgIHByaW50X3IoIlwiJGtleVwiID0+IFwiJHZhbFwiIik7Cit9CitwcmludF9yKCJ9XG4iKTsKK2tzb3J0KCRtYXBpbik7CitpZiAoJG1hcGluICE9ICRtYXBvdXQpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KKwogLyoqCiAgKiBTRVQgVEVTVAogICovCiAkc2V0b3V0ID0gYXJyYXkoKTs7CiBmb3IgKCRpID0gLTI7ICRpIDwgMzsgKyskaSkgewotICAkc2V0b3V0IFtdPSAkaTsKKyAgJHNldG91dFskaV09IHRydWU7CiB9CiBwcmludF9yKCJ0ZXN0U2V0KHsiKTsKLSRmaXJzdCA9IHRydWU7Ci1mb3JlYWNoICgkc2V0b3V0IGFzICR2YWwpIHsKLSAgaWYgKCRmaXJzdCkgewotICAgICRmaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHByaW50X3IoIiwgIik7Ci0gIH0KLSAgcHJpbnRfcigkdmFsKTsKLX0KK2VjaG8gaW1wbG9kZSgnLCcsIGFycmF5X2tleXMoJHNldG91dCkpOwogcHJpbnRfcigifSkiKTsKICRzZXRpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U2V0KCRzZXRvdXQpOwogcHJpbnRfcigiID0geyIpOwotJGZpcnN0ID0gdHJ1ZTsKLWZvcmVhY2ggKCRzZXRpbiBhcyAkdmFsKSB7Ci0gIGlmICgkZmlyc3QpIHsKLSAgICAkZmlyc3QgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBwcmludF9yKCIsICIpOwotICB9Ci0gIHByaW50X3IoJHZhbCk7Ci19CitlY2hvIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cygkc2V0aW4pKTsKIHByaW50X3IoIn1cbiIpOworLy8gT3JkZXIgb2Yga2V5cyBpbiBzZXQgZG9lcyBub3QgbWF0dGVyCitrc29ydCgkc2V0aW4pOworaWYgKCRzZXRvdXQgIT09ICRzZXRpbikgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBjb3JydXB0ZWQgYXJyYXkKK2lmICgkc2V0aW5bMl0gIT09ICRzZXRvdXRbMl0gfHwgaXNfaW50KCRzZXRpblsyXSkpIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfQ09OVEFJTkVSUzsKK30KIAogLyoqCiAgKiBMSVNUIFRFU1QKQEAgLTI1MiwyOSArMzU2LDUzIEBACiAgIHByaW50X3IoJHZhbCk7CiB9CiBwcmludF9yKCJ9XG4iKTsKK2lmICgkbGlzdGluICE9PSAkbGlzdG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQogCiAvKioKICAqIEVOVU0gVEVTVAogICovCiBwcmludF9yKCJ0ZXN0RW51bShPTkUpIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3RfTnVtYmVyejo6T05FKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKTsKIHByaW50X3IoIiA9ICRyZXRcbiIpOworaWYgKCRyZXQgIT0gXFRocmlmdFRlc3RcTnVtYmVyejo6T05FKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKFRXTykiKTsKLSRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdF9OdW1iZXJ6OjpUV08pOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUV08pOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUV08pIHsKKyAgICBlY2hvICIqKkZBSUxFRCoqXG4iOworICAgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30KIAogcHJpbnRfcigidGVzdEVudW0oVEhSRUUpIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3RfTnVtYmVyejo6VEhSRUUpOworJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpUSFJFRSk7CiBwcmludF9yKCIgPSAkcmV0XG4iKTsKK2lmICgkcmV0ICE9IFxUaHJpZnRUZXN0XE51bWJlcno6OlRIUkVFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEZJVkUpIik7Ci0kcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3RfTnVtYmVyejo6RklWRSk7CiskcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFxUaHJpZnRUZXN0XE51bWJlcno6OkZJVkUpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIHByaW50X3IoInRlc3RFbnVtKEVJR0hUKSIpOwotJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0X051bWJlcno6OkVJR0hUKTsKKyRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oXFRocmlmdFRlc3RcTnVtYmVyejo6RUlHSFQpOwogcHJpbnRfcigiID0gJHJldFxuIik7CitpZiAoJHJldCAhPSBcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpFSUdIVCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfQogCiAvKioKICAqIFRZUEVERUYgVEVTVApAQCAtMjgyLDYgKzQxMCwxMCBAQAogcHJpbnRfcigidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOwogJHVpZCA9ICR0ZXN0Q2xpZW50LT50ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpOwogcHJpbnRfcigiID0gJHVpZFxuIik7CitpZiAoJHVpZCAhPT0gMzA5ODU4MjM1MDgyNTIzKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX1NUUlVDVFM7Cit9CiAKIC8qKgogICogTkVTVEVEIE1BUCBURVNUCkBAIC0yOTcsMTIgKzQyOSwyMCBAQAogICBwcmludF9yKCJ9LCAiKTsKIH0KIHByaW50X3IoIn1cbiIpOworJGV4cGVjdGVkX21tID0gWworICAtNCA9PiBbLTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTFdLAorICA0ID0+IFs0ID0+IDQsIDMgPT4gMywgMiA9PiAyLCAxID0+IDFdLAorXTsKK2lmICgkbW0gIT0gJGV4cGVjdGVkX21tKSB7CisgICAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgICAkZXhpdGNvZGUgfD0gRVJSX0NPTlRBSU5FUlM7Cit9CiAKIC8qKgogICogSU5TQU5JVFkgVEVTVAogICovCiAkaW5zYW5lID0gbmV3IFxUaHJpZnRUZXN0XEluc2FuaXR5KCk7Ci0kaW5zYW5lLT51c2VyTWFwW1RocmlmdFRlc3RfTnVtYmVyejo6RklWRV0gPSA1MDAwOworJGluc2FuZS0+dXNlck1hcFtcVGhyaWZ0VGVzdFxOdW1iZXJ6OjpGSVZFXSA9IDUwMDA7CiAkdHJ1Y2sgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCk7CiAkdHJ1Y2stPnN0cmluZ190aGluZyA9ICJUcnVjayI7CiAkdHJ1Y2stPmJ5dGVfdGhpbmcgPSA4OwpAQCAtMzQ4LDEwICs0ODgsMjkgQEAKIHRyeSB7CiAgICR0ZXN0Q2xpZW50LT50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpOwogICBwcmludF9yKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwotfSBjYXRjaCAoVGhyaWZ0VGVzdF9YY2VwdGlvbiAkeCkgeworICAkZXhpdGNvZGUgfD0gRVJSX0VYQ0VQVElPTlM7Cit9IGNhdGNoIChcVGhyaWZ0VGVzdFxYY2VwdGlvbiAkeCkgewogICBwcmludF9yKCcgY2F1Z2h0IHhjZXB0aW9uICcuJHgtPmVycm9yQ29kZS4nOiAnLiR4LT5tZXNzYWdlLiJcbiIpOwogfQogCisvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIFRIUklGVC00MjYzCitwcmludF9yKCJ0ZXN0QmluYXJ5U2VyaWFsaXplcl9EZXNlcmlhbGl6ZSgnZm9vJykiKTsKK3RyeSB7CisgIFxUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoYmFzZTY0X2RlY29kZSgnZm9vJyksIFxUaHJpZnRUZXN0XFh0cnVjdDI6OmNsYXNzKTsKKyAgZWNobyAiKipGQUlMRUQqKlxuIjsKKyAgJGV4aXRjb2RlIHw9IEVSUl9TVFJVQ1RTOworfSBjYXRjaCAoXFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbiAkaGFwcHlfZXhjZXB0aW9uKSB7CisgIC8vIFdlIGV4cGVjdGVkIHRoaXMgZHVlIHRvIGJpbmFyeSBkYXRhIG9mIGJhc2U2NF9kZWNvZGUoJ2ZvbycpIGlzIGxlc3MgdGhlbiA0CisgIC8vIGJ5dGVzIGFuZCBpdCB0cmllcyB0byBmaW5kIHRocmlmdCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgdHJhbnNwb3J0IGJ5CisgIC8vIHJlYWRpbmcgaTMyKCkgYXQgdGhlIGJlZ2lubmluZy4gIENhc3RpbmcgdG8gc3RyaW5nIHZhbGlkYXRlcyB0aGF0CisgIC8vIGV4Y2VwdGlvbiBpcyBzdGlsbCBhY2Nlc3NpYmxlIGluIG1lbW9yeSBhbmQgbm90IGNvcnJ1cHRlZC4gIFdpdGhvdXQgcGF0Y2gsCisgIC8vIFBIUCB3aWxsIGVycm9yIGxvZyB0aGF0IHRoZSBleGNlcHRpb24gZG9lc24ndCBoYXZlIGFueSB0b3N0cmluZyBtZXRob2QsCisgIC8vIHdoaWNoIGlzIGEgbGllIGR1ZSB0byBjb3JydXB0ZWQgbWVtb3J5LgorICBmb3IoJGk9OTk7ICRpID4gMDsgJGktLSkgeworICAgIChzdHJpbmcpJGhhcHB5X2V4Y2VwdGlvbjsKKyAgfQorICBwcmludF9yKCIgIFNVQ0NFU1NcbiIpOworfQogCiAvKioKICAqIE5vcm1hbCB0ZXN0cyBkb25lLgpAQCAtMzY1LDM0ICs1MjQsMzQgQEAKICAqIEV4dHJhbmVvdXMgIkkgZG9uJ3QgdHJ1c3QgUEhQIHRvIHBhY2svdW5wYWNrIGludGVnZXIiIHRlc3RzCiAgKi8KIAoraWYgKCRwcm90b2NvbCBpbnN0YW5jZW9mIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSB7CisgICAgLy8gUmVncmVzc2lvbiBjaGVjazogY2hlY2sgdGhhdCBtZXRob2QgbmFtZSBpcyBub3QgZG91YmxlLWZyZWVkCisgICAgLy8gTWV0aG9kIG5hbWUgc2hvdWxkIG5vdCBiZSBhbiBpbnRlcm5lZCBzdHJpbmcuCisgICAgJG1ldGhvZF9uYW1lID0gIlZvaWQiOworICAgICRtZXRob2RfbmFtZSA9ICJ0ZXN0JG1ldGhvZF9uYW1lIjsKKworICAgICRzZXFpZCA9IDA7CisgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRtZXRob2RfbmFtZSwgXFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICRzZXFpZCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOworICAgICR0ZXN0Q2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CisKK30KKwogLy8gTWF4IEkzMgogJG51bSA9IHBvdygyLCAzMCkgKyAocG93KDIsIDMwKSAtIDEpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwogCiAvLyBNaW4gSTMyCiAkbnVtID0gMCAtIHBvdygyLCAzMSk7Ci0kbnVtMiA9ICR0ZXN0Q2xpZW50LT50ZXN0STMyKCRudW0pOwotaWYgKCRudW0gIT0gJG51bTIpIHsKLSAgcHJpbnQgIk1pc3NlZCAkbnVtID0gJG51bTJcbiI7Ci19Cityb3VuZHRyaXAoJHRlc3RDbGllbnQsICd0ZXN0STMyJywgJG51bSk7CiAKIC8vIE1heCBJNjQKICRudW0gPSBwb3coMiwgNjIpICsgKHBvdygyLCA2MikgLSAxKTsKLSRudW0yID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoJG51bSk7Ci1pZiAoJG51bSAhPSAkbnVtMikgewotICBwcmludCAiTWlzc2VkICRudW0gPSAkbnVtMlxuIjsKLX0KK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogLy8gTWluIEk2NAotJG51bSA9IDAgLSBwb3coMiwgNjMpOwotJG51bTIgPSAkdGVzdENsaWVudC0+dGVzdEk2NCgkbnVtKTsKLWlmICgkbnVtICE9ICRudW0yKSB7Ci0gIHByaW50ICJNaXNzZWQgJG51bSA9ICRudW0yXG4iOwotfQorJG51bSA9IDAgLSBwb3coMiwgNjIpIC0gcG93KDIsIDYyKTsKK3JvdW5kdHJpcCgkdGVzdENsaWVudCwgJ3Rlc3RJNjQnLCAkbnVtKTsKIAogJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLXJldHVybjsKLQorZXhpdCgkZXhpdGNvZGUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvdGVzdF9waHAuaW5pIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC90ZXN0X3BocC5pbmkKQEAgLTAsMCArMSwyIEBACitleHRlbnNpb249dGhyaWZ0X3Byb3RvY29sLnNvCitleHRlbnNpb249c29ja2V0cy5zbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdGVzdC9weS50b3JuYWRvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZTY4MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzMCBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1RIUklGVCA9ICQodG9wX3NyY2RpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCit0aHJpZnRfZ2VuOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcHk6dG9ybmFkbyAuLi9TbWFsbFRlc3QudGhyaWZ0CisKK2NoZWNrOiB0aHJpZnRfZ2VuCisJLi90ZXN0X3N1aXRlLnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1weS50b3JuYWRvCmRpZmYgLS1naXQgYS90ZXN0L3B5LnRvcm5hZG8vc2V0dXAuY2ZnIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTU4N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS50b3JuYWRvL3NldHVwLmNmZwpAQCAtMCwwICsxLDMgQEAKK1tmbGFrZThdCitpZ25vcmUgPSBFNDAyCittYXgtbGluZS1sZW5ndGggPSAxMDAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5IGIvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDQ3ZmRlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkudG9ybmFkby90ZXN0X3N1aXRlLnB5CkBAIC0wLDAgKzEsMjM2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCitiYXNlcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorc3lzLnBhdGguaW5zZXJ0KDAsIGJhc2VwYXRoICsgJy9nZW4tcHkudG9ybmFkbycpCitzeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKG9zLnBhdGguam9pbihiYXNlcGF0aCwgJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJykpWzBdKQorCit0cnk6CisgICAgX19pbXBvcnRfXygndG9ybmFkbycpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIm1vZHVsZSBgdG9ybmFkb2Agbm90IGZvdW5kLCBza2lwcGluZyB0ZXN0IikKKyAgICBzeXMuZXhpdCgwKQorCitmcm9tIHRvcm5hZG8gaW1wb3J0IGdlbgorZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCitmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKKworCitjbGFzcyBUZXN0SGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2luc3RhbmNlKToKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlID0gdGVzdF9pbnN0YW5jZQorCisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzKToKKyAgICAgICAgaWYgcyA9PSAndW5leHBlY3RlZF9lcnJvcic6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24ocykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIGIKKworICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIHJldHVybiBpMTYKKworICAgIGRlZiB0ZXN0STMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBpMzIKKworICAgIGRlZiB0ZXN0STY0KHNlbGYsIGk2NCk6CisgICAgICAgIHJldHVybiBpNjQKKworICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIHJldHVybiBkdWIKKworICAgIGRlZiB0ZXN0QmluYXJ5KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFN0cnVjdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgcyk6CisgICAgICAgIGlmIHMgPT0gJ1hjZXB0aW9uJzoKKyAgICAgICAgICAgIHggPSBYY2VwdGlvbigpCisgICAgICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDEKKyAgICAgICAgICAgIHgubWVzc2FnZSA9IHMKKyAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgZWxpZiBzID09ICd0aHJvd191bmRlY2xhcmVkJzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rlc3RpbmcgdW5kZWNsYXJlZCBleGNlcHRpb24nKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKworICAgICAgICBkZWYgZmlyZV9vbmV3YXkoKToKKyAgICAgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzZWxmLnRlc3RfaW5zdGFuY2Uuc3RvcCgoc3RhcnQsIGVuZCwgc2Vjb25kcykpCisKKyAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlLmlvX2xvb3AuYWRkX3RpbWVvdXQoCisgICAgICAgICAgICBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1zZWNvbmRzKSwKKyAgICAgICAgICAgIGZpcmVfb25ld2F5KQorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3Rlc3RpbmcgZXhjZXB0aW9uIGluIG9uZXdheSBtZXRob2QnKQorCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBAZ2VuLmNvcm91dGluZQorICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgeWllbGQgZ2VuLm1vbWVudAorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKHRoaW5nKQorCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCisgICAgZGVmIHRlc3RFbnVtKHNlbGYsIHRoaW5nKToKKyAgICAgICAgcmV0dXJuIHRoaW5nCisKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICByZXR1cm4gdGhpbmcKKworCitjbGFzcyBUaHJpZnRUZXN0Q2FzZShBc3luY1Rlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRocmlmdFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisKKyAgICAgICAgc2VsZi5wb3J0ID0gZ2V0X3VudXNlZF9wb3J0KCkKKworICAgICAgICAjIHNlcnZlcgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBUZXN0SGFuZGxlcihzZWxmKQorICAgICAgICBzZWxmLnByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKHNlbGYuaGFuZGxlcikKKyAgICAgICAgc2VsZi5wZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKworICAgICAgICBzZWxmLnNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHNlbGYucHJvY2Vzc29yLCBzZWxmLnBmYWN0b3J5LCBpb19sb29wPXNlbGYuaW9fbG9vcCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuYmluZChzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KDEpCisKKyAgICAgICAgIyBjbGllbnQKKyAgICAgICAgdHJhbnNwb3J0ID0gVFRvcm5hZG8uVFRvcm5hZG9TdHJlYW1UcmFuc3BvcnQoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCwgaW9fbG9vcD1zZWxmLmlvX2xvb3ApCisgICAgICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgICAgICBzZWxmLmlvX2xvb3AucnVuX3N5bmModHJhbnNwb3J0Lm9wZW4pCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQodHJhbnNwb3J0LCBwZmFjdG9yeSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3ZvaWQoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0Vm9pZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgTm9uZSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgJ1B5dGhvbicpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9ieXRlKHNlbGYpOgorICAgICAgICB2ID0geWllbGQgc2VsZi5jbGllbnQudGVzdEJ5dGUoNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgNjMpCisKKyAgICBAZ2VuX3Rlc3QKKyAgICBkZWYgdGVzdF9pMzIoc2VsZik6CisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgMCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2k2NChzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJNjQoLTM0MzU5NzM4MzY4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0zNDM1OTczODM2OCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC01LjIzNTA5ODIzNSkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeC5pMzJfdGhpbmcgPSAtMworICAgICAgICB4Lmk2NF90aGluZyA9IC01CisgICAgICAgIHkgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYnl0ZV90aGluZywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmkzMl90aGluZywgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5pNjRfdGhpbmcsIC01KQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3Rfb25ld2F5KHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpCisgICAgICAgIHYgPSB5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIC0xKQorCisgICAgQGdlbl90ZXN0CisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdEhhbmRsZXIudGVzdE1hcCBpcyBhIGNvcm91dGluZSwgdGhpcyB0ZXN0IGNoZWNrcyBpZiBnZW4uUmV0dXJuKCkgZnJvbSBhIGNvcm91dGluZSB3b3Jrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdGVkID0gezE6IDF9CisgICAgICAgIHJlcyA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RNYXAoZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBleHBlY3RlZCkKKworICAgIEBnZW5fdGVzdAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1hjZXB0aW9uJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ3Rocm93X3VuZGVjbGFyZWQnKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKKworICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRocmlmdFRlc3RDYXNlKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtKGRlZmF1bHRUZXN0PSdzdWl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MSkpCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggNDcyM2I3ZC4uZDExOTA4YyAxMDA2NDQKLS0tIGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpAQCAtMTcsMTQgKzE3LDE0IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9zcmNkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKK1RSSUFMID89IHRyaWFsCiAKIHN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcHk6dHdpc3RlZCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAKIGNoZWNrOiBzdHVicwotCSQoVFJJQUwpIHRlc3Rfc3VpdGUucHkKKwkkKFRSSUFMKSAuL3Rlc3Rfc3VpdGUucHkKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgZ2VuLXB5LnR3aXN0ZWQKZGlmZiAtLWdpdCBhL3Rlc3QvcHkudHdpc3RlZC9zZXR1cC5jZmcgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5LnR3aXN0ZWQvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMyBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKK21heC1saW5lLWxlbmd0aCA9IDEwMApkaWZmIC0tZ2l0IGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAyODlkZTUuLjAyZWI3ZjEKLS0tIGEvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKKysrIGIvdGVzdC9weS50d2lzdGVkL3Rlc3Rfc3VpdGUucHkKQEAgLTEsMyArMSw1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKwogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNywxMiArMTksMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCAnLi9nZW4tcHkudHdpc3RlZCcpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKK2ltcG9ydCBnbG9iCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Jhc2VwYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnZ2VuLXB5LnR3aXN0ZWQnKSkKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGJhc2VwYXRoLCAnLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJykpWzBdKQorCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogCiBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFhjZXB0aW9uLCBYdHJ1Y3QKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIApAQCAtMzAsNDAgKzM5LDQxIEBACiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyLCByZWFjdG9yCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IENsaWVudENyZWF0b3IKIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIKIAotaW1wb3J0IHJhbmRvbQogCitAaW1wbGVtZW50ZXIoVGhyaWZ0VGVzdC5JZmFjZSkKIGNsYXNzIFRlc3RIYW5kbGVyOgotICAgIGltcGxlbWVudHMoVGhyaWZ0VGVzdC5JZmFjZSkKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUgPSBkZWZlci5EZWZlcnJlZFF1ZXVlKCkKIAogICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKICAgICAgICAgcGFzcwotIAorCiAgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgcyk6CiAgICAgICAgIHJldHVybiBzCi0gCisKICAgICBkZWYgdGVzdEJ5dGUoc2VsZiwgYik6CiAgICAgICAgIHJldHVybiBiCi0gCisKICAgICBkZWYgdGVzdEkxNihzZWxmLCBpMTYpOgogICAgICAgICByZXR1cm4gaTE2Ci0gCisKICAgICBkZWYgdGVzdEkzMihzZWxmLCBpMzIpOgogICAgICAgICByZXR1cm4gaTMyCi0gCisKICAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgogICAgICAgICByZXR1cm4gaTY0Ci0gCisKICAgICBkZWYgdGVzdERvdWJsZShzZWxmLCBkdWIpOgogICAgICAgICByZXR1cm4gZHViCi0gCisKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmLCB0aGluZyk6CisgICAgICAgIHJldHVybiB0aGluZworCiAgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0RXhjZXB0aW9uKHNlbGYsIHMpOgogICAgICAgICBpZiBzID09ICdYY2VwdGlvbic6CiAgICAgICAgICAgICB4ID0gWGNlcHRpb24oKQpAQCAtNzIsMzEgKzgyLDMyIEBACiAgICAgICAgICAgICByYWlzZSB4CiAgICAgICAgIGVsaWYgcyA9PSAidGhyb3dfdW5kZWNsYXJlZCI6CiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmb28iKQotIAorCiAgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CiAgICAgICAgIGRlZiBmaXJlT25ld2F5KHQpOgogICAgICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUucHV0KCh0LCB0aW1lLnRpbWUoKSwgc2Vjb25kcykpCiAgICAgICAgIHJlYWN0b3IuY2FsbExhdGVyKHNlY29uZHMsIGZpcmVPbmV3YXksIHRpbWUudGltZSgpKQotICAgICAgICByZXR1cm4gZAotIAorICAgICAgICByYWlzZSBFeGNlcHRpb24oJycpCisKICAgICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCi0gCisKICAgICBkZWYgdGVzdFNldChzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwotIAorCiAgICAgZGVmIHRlc3RMaXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCi0gCisKICAgICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgogICAgICAgICByZXR1cm4gdGhpbmcKLSAKKwogICAgIGRlZiB0ZXN0VHlwZWRlZihzZWxmLCB0aGluZyk6CiAgICAgICAgIHJldHVybiB0aGluZwogCisKIGNsYXNzIFRocmlmdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKQEAgLTEwNSwxNiArMTE2LDE1IEBACiAgICAgICAgIHNlbGYucHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3Ioc2VsZi5oYW5kbGVyKQogICAgICAgICBzZWxmLnBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCi0gICAgICAgIHNlbGYuc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoMCwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3Rvcnkoc2VsZi5wcm9jZXNzb3IsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KSwgaW50ZXJmYWNlPSIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLnNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKAorICAgICAgICAgICAgMCwgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShzZWxmLnByb2Nlc3Nvciwgc2VsZi5wZmFjdG9yeSksIGludGVyZmFjZT0iMTI3LjAuMC4xIikKIAogICAgICAgICBzZWxmLnBvcnRObyA9IHNlbGYuc2VydmVyLmdldEhvc3QoKS5wb3J0CiAKICAgICAgICAgc2VsZi50eGNsaWVudCA9IHlpZWxkIENsaWVudENyZWF0b3IocmVhY3RvciwKLSAgICAgICAgICAgIFRUd2lzdGVkLlRocmlmdENsaWVudFByb3RvY29sLAotICAgICAgICAgICAgVGhyaWZ0VGVzdC5DbGllbnQsCi0gICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0Q2xpZW50UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFRlc3QuQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBmYWN0b3J5KS5jb25uZWN0VENQKCIxMjcuMC4wLjEiLCBzZWxmLnBvcnRObykKICAgICAgICAgc2VsZi5jbGllbnQgPSBzZWxmLnR4Y2xpZW50LmNsaWVudAogCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwpAQCAtMTI5LDcgKzEzOSw3IEBACiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJykpLCAnUHl0aG9uJykKLSAKKwogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKICAgICBkZWYgdGVzdEJ5dGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MykpLCA2MykKQEAgLTE0Nyw3ICsxNTcsOSBAQAogICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdERvdWJsZSgtNS4yMzUwOTgyMzUpKSwgLTUuMjM1MDk4MjM1KQogCi0gICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcyAKKyAgICAjIFRPRE86IGRlZiB0ZXN0QmluYXJ5KHNlbGYpIC4uLgorCisgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgogICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5zdHJpbmdfdGhpbmcgPSAiWmVybyIKQEAgLTE1NSwzMCArMTY3LDMyIEBACiAgICAgICAgIHguaTMyX3RoaW5nID0gLTMKICAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQogICAgICAgICB5ID0geWllbGQgc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQotIAorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuc3RyaW5nX3RoaW5nLCAiWmVybyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHkuYnl0ZV90aGluZywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeS5pMzJfdGhpbmcsIC0zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh5Lmk2NF90aGluZywgLTUpCi0gCisKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCiAgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6Ci0gICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgWGNlcHRpb24sIHg6CisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5lcnJvckNvZGUsIDEwMDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4Lm1lc3NhZ2UsICdYY2VwdGlvbicpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAjIHR5cGUgaXMgdW5kZWZpbmVkCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwotIAorCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1NhZmUnKQorCiAgICAgQGRlZmVyLmlubGluZUNhbGxiYWNrcwogICAgIGRlZiB0ZXN0T25ld2F5KHNlbGYpOgotICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDIpCisgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkKICAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHlpZWxkIHNlbGYuaGFuZGxlci5vbmV3YXlzUXVldWUuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoc2Vjb25kcywgKGVuZCAtIHN0YXJ0KSwgcGxhY2VzPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKHNlY29uZHMsIChlbmQgLSBzdGFydCksIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygoeWllbGQgc2VsZi5jbGllbnQudGVzdEkzMigtMSkpLCAtMSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvQ01ha2VMaXN0cy50eHQgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzIyMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCithZGRfdGVzdChOQU1FIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9CisgICAgICAgICAgICAtRFRIUklGVENPTVBJTEVSPSQ8VEFSR0VUX0ZJTEU6dGhyaWZ0LWNvbXBpbGVyPgorICAgICAgICAgICAgLURNWV9QUk9KRUNUX0RJUj0ke1BST0pFQ1RfU09VUkNFX0RJUn0KKyAgICAgICAgICAgIC1ETVlfQ1VSUkVOVF9TT1VSQ0VfRElSPSR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfQorICAgICAgICAgICAgLURNWV9DVVJSRU5UX0JJTkFSWV9ESVI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9CisgICAgLVAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2dlbmVyYXRlLmNtYWtlCispCisKK2FkZF90ZXN0KE5BTUUgcHl0aG9uX3Rlc3QKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9SdW5DbGllbnRTZXJ2ZXIucHkgLS1nZW4tYmFzZT0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIHB5dGhvbl90ZXN0X2dlbmVyYXRlCisgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CispCisKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YzBiYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3IiIiIKK1BZVEhPTlBBVEg9Li9nZW4tcHk6Li4vLi4vbGliL3B5L2J1aWxkL2xpYi4uLiAuL0Zhc3RiaW5hcnlUZXN0LnB5CisiIiIKKworIyBUT0RPKGRyZWlzcyk6IFRlc3QgZXJyb3IgY2FzZXMuICBDaGVjayBmb3IgbWVtb3J5IGxlYWtzLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1laXQKKworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRCaW5hcnlQcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sLCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCisKK2Zyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IFNydgorZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IEJhY2t3YXJkcywgQm9uaywgRW1wdHksIEhvbHlNb2xleSwgT25lT2ZFYWNoLCBSYW5kb21TdHVmZiwgV3JhcHBlcgorCisKK2NsYXNzIFREZXZOdWxsVHJhbnNwb3J0KFRUcmFuc3BvcnQuVFRyYW5zcG9ydEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitvb2UxID0gT25lT2ZFYWNoKCkKK29vZTEuaW1fdHJ1ZSA9IFRydWUKK29vZTEuaW1fZmFsc2UgPSBGYWxzZQorb29lMS5hX2JpdGUgPSAweGQ2Citvb2UxLmludGVnZXIxNiA9IDI3MDAwCitvb2UxLmludGVnZXIzMiA9IDEgPDwgMjQKK29vZTEuaW50ZWdlcjY0ID0gNjAwMCAqIDEwMDAgKiAxMDAwCitvb2UxLmRvdWJsZV9wcmVjaXNpb24gPSBtYXRoLnBpCitvb2UxLnNvbWVfY2hhcmFjdGVycyA9ICJEZWJ1ZyBUSElTISIKK29vZTEuem9tZ191bmljb2RlID0gdSJceGQ3XG5cYVx0IgorCitvb2UyID0gT25lT2ZFYWNoKCkKK29vZTIuaW50ZWdlcjE2ID0gMTYKK29vZTIuaW50ZWdlcjMyID0gMzIKK29vZTIuaW50ZWdlcjY0ID0gNjQKK29vZTIuZG91YmxlX3ByZWNpc2lvbiA9IChtYXRoLnNxcnQoNSkgKyAxKSAvIDIKK29vZTIuc29tZV9jaGFyYWN0ZXJzID0gIjpSIChtZSBnb2luZyBcInJycnJcIikiCitvb2UyLnpvbWdfdW5pY29kZSA9IHUiXHhkM1x4ODBceGUyXHg4NVx4YWVceGNlXHg5ZFx4MjAiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4ZDBceDlkXHhjZVx4YmZceGUyXHg4NVx4YmZceGQwXHhiZSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjOVx4YTFceGQwXHhiM1x4ZDBceGIwXHhjZlx4ODFceGUyXHg4NFx4OGUiXAorICAgICAgICAgICAgICAgICAgICB1Ilx4MjBceGNlXHg5MVx4NzRceDc0XHhjZVx4YjFceGUyXHg4NVx4YmRceGNlXHhiYSJcCisgICAgICAgICAgICAgICAgICAgIHUiXHhjN1x4ODNceGUyXHg4MFx4YmMiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgb29lMS56b21nX3VuaWNvZGUgPSBvb2UxLnpvbWdfdW5pY29kZS5lbmNvZGUoJ3V0ZjgnKQorICAgIG9vZTIuem9tZ191bmljb2RlID0gb29lMi56b21nX3VuaWNvZGUuZW5jb2RlKCd1dGY4JykKKworaG0gPSBIb2x5TW9sZXkoKip7ImJpZyI6IFtdLCAiY29udGFpbiI6IHNldCgpLCAiYm9ua3MiOiB7fX0pCitobS5iaWcuYXBwZW5kKG9vZTEpCitobS5iaWcuYXBwZW5kKG9vZTIpCitobS5iaWdbMF0uYV9iaXRlID0gMHgyMgoraG0uYmlnWzFdLmFfYml0ZSA9IDB4MjIKKworaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCitobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKK2htLmNvbnRhaW4uYWRkKCgpKQorCitobS5ib25rc1sibm90aGluZyJdID0gW10KK2htLmJvbmtzWyJzb21ldGhpbmciXSA9IFsKKyAgICBCb25rKCoqeyJ0eXBlIjogMSwgIm1lc3NhZ2UiOiAiV2FpdC4ifSksCisgICAgQm9uaygqKnsidHlwZSI6IDIsICJtZXNzYWdlIjogIldoYXQ/In0pLAorXQoraG0uYm9ua3NbInBvZSJdID0gWworICAgIEJvbmsoKip7InR5cGUiOiAzLCAibWVzc2FnZSI6ICJxdW90aCJ9KSwKKyAgICBCb25rKCoqeyJ0eXBlIjogNCwgIm1lc3NhZ2UiOiAidGhlIHJhdmVuIn0pLAorICAgIEJvbmsoKip7InR5cGUiOiA1LCAibWVzc2FnZSI6ICJuZXZlcm1vcmUifSksCitdCisKK3JzID0gUmFuZG9tU3R1ZmYoKQorcnMuYSA9IDEKK3JzLmIgPSAyCitycy5jID0gMworcnMubXlpbnRsaXN0ID0gbGlzdChyYW5nZSgyMCkpCitycy5tYXBzID0gezE6IFdyYXBwZXIoKip7ImZvbyI6IEVtcHR5KCl9KSwgMjogV3JhcHBlcigqKnsiZm9vIjogRW1wdHkoKX0pfQorcnMuYmlnaW50ID0gMTI0NTIzNDUyNDM1Citycy50cmlwbGUgPSAzLjE0CisKKyMgbWFrZSBzdXJlIHRoaXMgc3BsaXRzIHR3byBidWZmZXJzIGluIGEgYnVmZmVyZWQgcHJvdG9jb2wKK3JzaHVnZSA9IFJhbmRvbVN0dWZmKCkKK3JzaHVnZS5teWludGxpc3QgPSBsaXN0KHJhbmdlKDEwMDAwKSkKKworbXlfemVybyA9IFNydi5KYW5reV9yZXN1bHQoKip7InN1Y2Nlc3MiOiA1fSkKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhc3QsIHNsb3cpOgorICAgICAgICBzZWxmLl9mYXN0ID0gZmFzdAorICAgICAgICBzZWxmLl9zbG93ID0gc2xvdworCisgICAgZGVmIF9jaGVja193cml0ZShzZWxmLCBvKToKKyAgICAgICAgdHJhbnNfZmFzdCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHRyYW5zX3Nsb3cgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90X2Zhc3QgPSBzZWxmLl9mYXN0KHRyYW5zX2Zhc3QsIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBwcm90X3Nsb3cgPSBzZWxmLl9zbG93KHRyYW5zX3Nsb3cpCisKKyAgICAgICAgby53cml0ZShwcm90X2Zhc3QpCisgICAgICAgIG8ud3JpdGUocHJvdF9zbG93KQorICAgICAgICBPUklHID0gdHJhbnNfc2xvdy5nZXR2YWx1ZSgpCisgICAgICAgIE1JTkUgPSB0cmFuc19mYXN0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgT1JJRyAhPSBNSU5FOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAlc1xuZXhwZWN0ZWQ6ICVzIiAlIChyZXByKE1JTkUpLCByZXByKE9SSUcpKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignd3JpdGUgdmFsdWUgbWlzbWF0Y2gnKQorCisgICAgZGVmIF9jaGVja19yZWFkKHNlbGYsIG8pOgorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdyhUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKSkKKyAgICAgICAgby53cml0ZShwcm90KQorCisgICAgICAgIHNsb3dfdmVyc2lvbl9iaW5hcnkgPSBwcm90LnRyYW5zLmdldHZhbHVlKCkKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSwgZmFsbGJhY2s9RmFsc2UpCisgICAgICAgIGMgPSBvLl9fY2xhc3NfXygpCisgICAgICAgIGMucmVhZChwcm90KQorICAgICAgICBpZiBjICE9IG86CisgICAgICAgICAgICBwcmludCgiYWN0dWFsICA6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJleHBlY3RlZDogIikKKyAgICAgICAgICAgIHBwcmludChyZXByKG8pKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdyZWFkIHZhbHVlIG1pc21hdGNoJykKKworICAgICAgICBwcm90ID0gc2VsZi5fZmFzdCgKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzbG93X3ZlcnNpb25fYmluYXJ5KSksIGZhbGxiYWNrPUZhbHNlKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImFjdHVhbCAgOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIoYykpCisgICAgICAgICAgICBwcmludCgiZXhwZWN0ZWQ6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihvKSkKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigncmVhZCB2YWx1ZSBtaXNtYXRjaCcpCisKKyAgICBkZWYgZG9fdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoSG9seU1vbGV5KCkpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoSG9seU1vbGV5KCkpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUoaG0pCisgICAgICAgIG5vX3NldCA9IGRlZXBjb3B5KGhtKQorICAgICAgICBub19zZXQuY29udGFpbiA9IHNldCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQobm9fc2V0KQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKGhtKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzKQorICAgICAgICBzZWxmLl9jaGVja19yZWFkKHJzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3dyaXRlKHJzaHVnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChyc2h1Z2UpCisKKyAgICAgICAgc2VsZi5fY2hlY2tfd3JpdGUobXlfemVybykKKyAgICAgICAgc2VsZi5fY2hlY2tfcmVhZChteV96ZXJvKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3JlYWQoQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pKQorCisgICAgICAgICMgT25lIGNhc2Ugd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZm9ybSBjaGFuZ2VzLCBidXQgb25seSBzdXBlcmZpY2lhbGx5LgorICAgICAgICBvID0gQmFja3dhcmRzKCoqeyJmaXJzdF90YWcyIjogNCwgInNlY29uZF90YWcxIjogMn0pCisgICAgICAgIHRyYW5zX2Zhc3QgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICB0cmFuc19zbG93ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdF9mYXN0ID0gc2VsZi5fZmFzdCh0cmFuc19mYXN0LCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgcHJvdF9zbG93ID0gc2VsZi5fc2xvdyh0cmFuc19zbG93KQorCisgICAgICAgIG8ud3JpdGUocHJvdF9mYXN0KQorICAgICAgICBvLndyaXRlKHByb3Rfc2xvdykKKyAgICAgICAgT1JJRyA9IHRyYW5zX3Nsb3cuZ2V0dmFsdWUoKQorICAgICAgICBNSU5FID0gdHJhbnNfZmFzdC5nZXR2YWx1ZSgpCisgICAgICAgIGFzc2VydCBpZChPUklHKSAhPSBpZChNSU5FKQorCisgICAgICAgIHByb3QgPSBzZWxmLl9mYXN0KFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpLCBmYWxsYmFjaz1GYWxzZSkKKyAgICAgICAgby53cml0ZShwcm90KQorICAgICAgICBwcm90ID0gc2VsZi5fc2xvdygKKyAgICAgICAgICAgIFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihwcm90LnRyYW5zLmdldHZhbHVlKCkpKQorICAgICAgICBjID0gby5fX2NsYXNzX18oKQorICAgICAgICBjLnJlYWQocHJvdCkKKyAgICAgICAgaWYgYyAhPSBvOgorICAgICAgICAgICAgcHJpbnQoImNvcHk6ICIpCisgICAgICAgICAgICBwcHJpbnQocmVwcihjKSkKKyAgICAgICAgICAgIHByaW50KCJvcmlnOiAiKQorICAgICAgICAgICAgcHByaW50KHJlcHIobykpCisKKworZGVmIGRvX3Rlc3QoZmFzdCwgc2xvdyk6CisgICAgVGVzdChmYXN0LCBzbG93KS5kb190ZXN0KCkKKworCitkZWYgZG9fYmVuY2htYXJrKHByb3RvY29sLCBpdGVycz01MDAwLCBza2lwX3Nsb3c9RmFsc2UpOgorICAgIHNldHVwID0gIiIiCitmcm9tIF9fbWFpbl9fIGltcG9ydCBobSwgcnMsIFREZXZOdWxsVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbC57MH0gaW1wb3J0IHswfXsxfQordHJhbnMgPSBURGV2TnVsbFRyYW5zcG9ydCgpCitwcm90ID0gezB9ezF9KHRyYW5zezJ9KQorIiIiCisKKyAgICBzZXR1cF9mYXN0ID0gc2V0dXAuZm9ybWF0KHByb3RvY29sLCAnQWNjZWxlcmF0ZWQnLCAnLCBmYWxsYmFjaz1GYWxzZScpCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgc2V0dXBfc2xvdyA9IHNldHVwLmZvcm1hdChwcm90b2NvbCwgJycsICcnKQorCisgICAgcHJpbnQoIlN0YXJ0aW5nIEJlbmNobWFya3MiKQorCisgICAgaWYgbm90IHNraXBfc2xvdzoKKyAgICAgICAgcHJpbnQoIkhvbHlNb2xleSBTdGFuZGFyZCA9ICVmIiAlCisgICAgICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9zbG93KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIHByaW50KCJIb2x5TW9sZXkgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcignaG0ud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworICAgIGlmIG5vdCBza2lwX3Nsb3c6CisgICAgICAgIHByaW50KCJGYXN0U3RydWN0IFN0YW5kYXJkID0gJWYiICUKKyAgICAgICAgICAgICAgdGltZWl0LlRpbWVyKCdycy53cml0ZShwcm90KScsIHNldHVwX3Nsb3cpLnRpbWVpdChudW1iZXI9aXRlcnMpKQorCisgICAgcHJpbnQoIkZhc3RTdHJ1Y3QgQWNjZWxlci4gPSAlZiIgJQorICAgICAgICAgIHRpbWVpdC5UaW1lcigncnMud3JpdGUocHJvdCknLCBzZXR1cF9mYXN0KS50aW1laXQobnVtYmVyPWl0ZXJzKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50KCdUZXN0aW5nIFRCaW5hcnlBY2NlbGVyYXRlZCcpCisgICAgZG9fdGVzdChUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCwgVEJpbmFyeVByb3RvY29sKQorICAgIGRvX2JlbmNobWFyaygnVEJpbmFyeVByb3RvY29sJykKKyAgICBwcmludCgnVGVzdGluZyBUQ29tcGFjdEFjY2VsZXJhdGVkJykKKyAgICBkb190ZXN0KFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwgVENvbXBhY3RQcm90b2NvbCkKKyAgICBkb19iZW5jaG1hcmsoJ1RDb21wYWN0UHJvdG9jb2wnKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9NYWtlZmlsZS5hbSBiL3Rlc3QvcHkvTWFrZWZpbGUuYW0KaW5kZXggMjMxN2VmNi4uODI5NjIwMCAxMDA2NDQKLS0tIGEvdGVzdC9weS9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3B5L01ha2VmaWxlLmFtCkBAIC0xNiwyNiArMTYsNDMgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKLQotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiAKIHB5X3VuaXRfdGVzdHMgPSBSdW5DbGllbnRTZXJ2ZXIucHkKIAogdGhyaWZ0X2dlbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnZW4tcHkvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHkvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHkvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktZGVmYXVsdC9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1kZWZhdWx0L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1zbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1zbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZS9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCi0gICAgICAgIGdlbi1weS1uZXdzdHlsZXNsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5LW5ld3N0eWxlc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktc2xvdHMvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1zbG90cy9SZWN1cnNpdmUvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1vbGRzdHlsZS9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9UaHJpZnRUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LWR5bmFtaWMvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHktZHluYW1pYy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pYy9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL1RocmlmdFRlc3QvX19pbml0X18ucHkgICAgICAgICAgIFwKLSAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weQorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWNzbG90cy9SZWN1cnNpdmUvX19pbml0X18ucHkKKworCitwcmVjcm9zczogJCh0aHJpZnRfZ2VuKQorQlVJTFRfU09VUkNFUyA9ICQodGhyaWZ0X2dlbikKIAogaGVscGVyX3NjcmlwdHM9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBUZXN0Q2xpZW50LnB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDksMzAgKzY2LDMyIEBACiBURVNUUz0gJChweV91bml0X3Rlc3RzKQogCiAKLWdlbi1weS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAorZ2VuLXB5LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBweSAgJDwKLQl0ZXN0IC1kIGdlbi1weS1kZWZhdWx0IHx8IG1rZGlyIGdlbi1weS1kZWZhdWx0CisKK2dlbi1weS1kZWZhdWx0LyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LWRlZmF1bHQgfHwgJChNS0RJUl9QKSBnZW4tcHktZGVmYXVsdAogCSQoVEhSSUZUKSAtLWdlbiBweSAtb3V0IGdlbi1weS1kZWZhdWx0ICQ8CiAKLWdlbi1weS1zbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAotCXRlc3QgLWQgZ2VuLXB5LXNsb3RzIHx8IG1rZGlyIGdlbi1weS1zbG90cworZ2VuLXB5LXNsb3RzLyUvX19pbml0X18ucHk6IC4uLyUudGhyaWZ0ICQoVEhSSUZUKQorCXRlc3QgLWQgZ2VuLXB5LXNsb3RzIHx8ICQoTUtESVJfUCkgZ2VuLXB5LXNsb3RzCiAJJChUSFJJRlQpIC0tZ2VuIHB5OnNsb3RzIC1vdXQgZ2VuLXB5LXNsb3RzICQ8CiAKLWdlbi1weS1uZXdzdHlsZS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdAotCXRlc3QgLWQgZ2VuLXB5LW5ld3N0eWxlIHx8IG1rZGlyIGdlbi1weS1uZXdzdHlsZQotCSQoVEhSSUZUKSAtLWdlbiBweTpuZXdfc3R5bGUgLW91dCBnZW4tcHktbmV3c3R5bGUgJDwKK2dlbi1weS1vbGRzdHlsZS8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1vbGRzdHlsZSB8fCAkKE1LRElSX1ApIGdlbi1weS1vbGRzdHlsZQorCSQoVEhSSUZUKSAtLWdlbiBweTpvbGRfc3R5bGUgLW91dCBnZW4tcHktb2xkc3R5bGUgJDwKIAotZ2VuLXB5LW5ld3N0eWxlc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQl0ZXN0IC1kIGdlbi1weS1uZXdzdHlsZXNsb3RzIHx8IG1rZGlyIGdlbi1weS1uZXdzdHlsZXNsb3RzCi0JJChUSFJJRlQpIC0tZ2VuIHB5Om5ld19zdHlsZSxzbG90cyAtb3V0IGdlbi1weS1uZXdzdHlsZXNsb3RzICQ8CitnZW4tcHktbm9fdXRmOHN0cmluZ3MvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQgJChUSFJJRlQpCisJdGVzdCAtZCBnZW4tcHktbm9fdXRmOHN0cmluZ3MgfHwgJChNS0RJUl9QKSBnZW4tcHktbm9fdXRmOHN0cmluZ3MKKwkkKFRIUklGVCkgLS1nZW4gcHk6bm9fdXRmOHN0cmluZ3MgLW91dCBnZW4tcHktbm9fdXRmOHN0cmluZ3MgJDwKIAotZ2VuLXB5LWR5bmFtaWMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQl0ZXN0IC1kIGdlbi1weS1keW5hbWljIHx8IG1rZGlyIGdlbi1weS1keW5hbWljCitnZW4tcHktZHluYW1pYy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1keW5hbWljIHx8ICQoTUtESVJfUCkgZ2VuLXB5LWR5bmFtaWMKIAkkKFRIUklGVCkgLS1nZW4gcHk6ZHluYW1pYyAtb3V0IGdlbi1weS1keW5hbWljICQ8CiAKLWdlbi1weS1keW5hbWljc2xvdHMvJS9fX2luaXRfXy5weTogLi4vJS50aHJpZnQKLQl0ZXN0IC1kIGdlbi1weS1keW5hbWljc2xvdHMgfHwgbWtkaXIgZ2VuLXB5LWR5bmFtaWNzbG90cworZ2VuLXB5LWR5bmFtaWNzbG90cy8lL19faW5pdF9fLnB5OiAuLi8lLnRocmlmdCAkKFRIUklGVCkKKwl0ZXN0IC1kIGdlbi1weS1keW5hbWljc2xvdHMgfHwgJChNS0RJUl9QKSBnZW4tcHktZHluYW1pY3Nsb3RzCiAJJChUSFJJRlQpIC0tZ2VuIHB5OmR5bmFtaWMsc2xvdHMgLW91dCBnZW4tcHktZHluYW1pY3Nsb3RzICQ8CiAKIGNsZWFuLWxvY2FsOgotCSQoUk0pIC1yIGdlbi1weSBnZW4tcHktc2xvdHMgZ2VuLXB5LWRlZmF1bHQgZ2VuLXB5LW5ld3N0eWxlIGdlbi1weS1uZXdzdHlsZXNsb3RzIGdlbi1weS1keW5hbWljIGdlbi1weS1keW5hbWljc2xvdHMKKwkkKFJNKSAtciBnZW4tcHkgZ2VuLXB5LXNsb3RzIGdlbi1weS1kZWZhdWx0IGdlbi1weS1vbGRzdHlsZSBnZW4tcHktbm9fdXRmOHN0cmluZ3MgZ2VuLXB5LWR5bmFtaWMgZ2VuLXB5LWR5bmFtaWNzbG90cwpkaWZmIC0tZ2l0IGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQppbmRleCA4YTdmZGE2Li41NmE0MDhlIDEwMDc1NQotLS0gYS90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQorKysgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQpAQCAtMjAsMTY4ICsyMCwzMDQgQEAKICMKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotaW1wb3J0IHRpbWUKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBjb3B5CiBpbXBvcnQgb3MKIGltcG9ydCBzaWduYWwKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCiAKLXBhcnNlciA9IE9wdGlvblBhcnNlcigpCi1wYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcnMnLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcnMnLAotICAgIGRlZmF1bHQ9J2RlZmF1bHQsc2xvdHMsbmV3c3R5bGUsbmV3c3R5bGVzbG90cyxkeW5hbWljLGR5bmFtaWNzbG90cycsCi0gICAgaGVscD0nZGlyZWN0b3J5IGV4dGVuc2lvbnMgZm9yIGdlbmVyYXRlZCBjb2RlLCB1c2VkIGFzIHN1ZmZpeGVzIGZvciBcImdlbi1weS0qXCIgYWRkZWQgc3lzLnBhdGggZm9yIGluZGl2aWR1YWwgdGVzdHMnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLCBkZWZhdWx0PTkwOTAsCi0gICAgaGVscD0icG9ydCBudW1iZXIgZm9yIHNlcnZlciB0byBsaXN0ZW4gb24iKQotcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKLSAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCi1wYXJzZXIuc2V0X2RlZmF1bHRzKHZlcmJvc2U9MSkKLW9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCitmcm9tIHV0aWwgaW1wb3J0IGxvY2FsX2xpYnBhdGgKIAotZ2VuZXJhdGVkX2RpcnMgPSBbXQotZm9yIGdwX2RpciBpbiBvcHRpb25zLmdlbnB5ZGlycy5zcGxpdCgnLCcpOgotICBnZW5lcmF0ZWRfZGlycy5hcHBlbmQoJ2dlbi1weS0lcycgJSAoZ3BfZGlyKSkKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAotU0NSSVBUUyA9IFsnU2VyaWFsaXphdGlvblRlc3QucHknLCAnVGVzdEVvZi5weScsICdUZXN0U3ludGF4LnB5JywgJ1Rlc3RTb2NrZXQucHknXQorU0NSSVBUUyA9IFsKKyAgICAnRmFzdGJpbmFyeVRlc3QucHknLAorICAgICdUZXN0RnJvemVuLnB5JywKKyAgICAnVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5JywKKyAgICAnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAorICAgICdTZXJpYWxpemF0aW9uVGVzdC5weScsCisgICAgJ1Rlc3RFb2YucHknLAorICAgICdUZXN0U3ludGF4LnB5JywKKyAgICAnVGVzdFNvY2tldC5weScsCitdCiBGUkFNRUQgPSBbIlROb25ibG9ja2luZ1NlcnZlciJdCiBTS0lQX1pMSUIgPSBbJ1ROb25ibG9ja2luZ1NlcnZlcicsICdUSHR0cFNlcnZlciddCi1TS0lQX1NTTCA9IFsnVE5vbmJsb2NraW5nU2VydmVyJywgJ1RIdHRwU2VydmVyJ10KLUVYVFJBX0RFTEFZID0gZGljdChUUHJvY2Vzc1Bvb2xTZXJ2ZXI9My41KQorU0tJUF9TU0wgPSBbJ1RIdHRwU2VydmVyJ10KK0VYVFJBX0RFTEFZID0gZGljdChUUHJvY2Vzc1Bvb2xTZXJ2ZXI9NS41KQogCi1QUk9UT1M9IFsKK1BST1RPUyA9IFsKICAgICAnYWNjZWwnLAorICAgICdhY2NlbGMnLAogICAgICdiaW5hcnknLAotICAgICdjb21wYWN0JyBdCisgICAgJ2NvbXBhY3QnLAorICAgICdqc29uJywKKyAgICAnaGVhZGVyJywKK10KIAotU0VSVkVSUyA9IFsKLSAgIlRTaW1wbGVTZXJ2ZXIiLAotICAiVFRocmVhZGVkU2VydmVyIiwKLSAgIlRUaHJlYWRQb29sU2VydmVyIiwKLSAgIlRQcm9jZXNzUG9vbFNlcnZlciIsICMgbmV3IQotICAiVEZvcmtpbmdTZXJ2ZXIiLAotICAiVE5vbmJsb2NraW5nU2VydmVyIiwKLSAgIlRIdHRwU2VydmVyIiBdCiAKLSMgVGVzdCBmb3IgcHJlc2VuY2Ugb2YgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSwgYW5kIGlmIGl0IGlzIG5vdCBwcmVzZW50LCB0aGVuCi0jIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzZXJ2ZXJzLgotdHJ5OgotICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCi1leGNlcHQ6Ci0gIHByaW50ICdXYXJuaW5nOiB0aGUgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSBpcyB1bmF2YWlsYWJsZS4gU2tpcHBpbmcgdGVzdHMgZm9yIFRQcm9jZXNzUG9vbFNlcnZlcicKLSAgU0VSVkVSUy5yZW1vdmUoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCi0KLXRyeToKLSAgaW1wb3J0IHNzbAotZXhjZXB0OgotICBwcmludCAnV2FybmluZywgbm8gc3NsIG1vZHVsZSBhdmFpbGFibGUuIFNraXBwaW5nIGFsbCBTU0wgdGVzdHMuJwotICBTS0lQX1NTTC5leHRlbmQoU0VSVkVSUykKLQotIyBjb21tYW5kbGluZSBwZXJtaXRzIGEgc2luZ2xlIGNsYXNzIG5hbWUgdG8gYmUgc3BlY2lmaWVkIHRvIG92ZXJyaWRlIFNFUlZFUlM9Wy4uLl0KLWlmIGxlbihhcmdzKSA9PSAxOgotICBpZiBhcmdzWzBdIGluIFNFUlZFUlM6Ci0gICAgU0VSVkVSUyA9IGFyZ3MKLSAgZWxzZToKLSAgICBwcmludCAnVW5hdmFpbGFibGUgc2VydmVyIHR5cGUgIiVzIiwgcGxlYXNlIGNob29zZSBvbmUgb2Y6ICVzJyAlIChhcmdzWzBdLCBTRVJWRVJTKQotICAgIHN5cy5leGl0KDApCitkZWYgZGVmYXVsdF9zZXJ2ZXJzKCk6CisgICAgc2VydmVycyA9IFsKKyAgICAgICAgJ1RTaW1wbGVTZXJ2ZXInLAorICAgICAgICAnVFRocmVhZGVkU2VydmVyJywKKyAgICAgICAgJ1RUaHJlYWRQb29sU2VydmVyJywKKyAgICAgICAgJ1ROb25ibG9ja2luZ1NlcnZlcicsCisgICAgICAgICdUSHR0cFNlcnZlcicsCisgICAgXQorICAgIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJzoKKyAgICAgICAgc2VydmVycy5hcHBlbmQoJ1RQcm9jZXNzUG9vbFNlcnZlcicpCisgICAgICAgIHNlcnZlcnMuYXBwZW5kKCdURm9ya2luZ1NlcnZlcicpCisgICAgcmV0dXJuIHNlcnZlcnMKIAogCiBkZWYgcmVsZmlsZShmbmFtZSk6Ci0gICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBmbmFtZSkKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIGZuYW1lKQogCi1kZWYgcnVuU2NyaXB0VGVzdChnZW5weWRpciwgc2NyaXB0KToKLSAgc2NyaXB0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoc2NyaXB0KSBdCi0gIHNjcmlwdF9hcmdzLmFwcGVuZCgnLS1nZW5weWRpcj0lcycgJSBnZW5weWRpcikKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2NyaXB0X2FyZ3MpCi0gIHByaW50ICdcblRlc3Rpbmcgc2NyaXB0OiAlc1xuLS0tLScgJSAoJyAnLmpvaW4oc2NyaXB0X2FyZ3MpKQotICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoc2NyaXB0X2FyZ3MpCi0gIGlmIHJldCAhPSAwOgotICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQotICAKLWRlZiBydW5TZXJ2aWNlVGVzdChnZW5weWRpciwgc2VydmVyX2NsYXNzLCBwcm90bywgcG9ydCwgdXNlX3psaWIsIHVzZV9zc2wpOgotICAjIEJ1aWxkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSAgc2VydmVyX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoJ1Rlc3RTZXJ2ZXIucHknKSBdCi0gIGNsaV9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCByZWxmaWxlKCdUZXN0Q2xpZW50LnB5JykgXQotICBmb3Igd2hpY2ggaW4gKHNlcnZlcl9hcmdzLCBjbGlfYXJncyk6Ci0gICAgd2hpY2guYXBwZW5kKCctLWdlbnB5ZGlyPSVzJyAlIGdlbnB5ZGlyKQotICAgIHdoaWNoLmFwcGVuZCgnLS1wcm90bz0lcycgJSBwcm90bykgIyBhY2NlbCwgYmluYXJ5IG9yIGNvbXBhY3QKLSAgICB3aGljaC5hcHBlbmQoJy0tcG9ydD0lZCcgJSBwb3J0KSAjIGRlZmF1bHQgdG8gOTA5MAotICAgIGlmIHVzZV96bGliOgotICAgICAgd2hpY2guYXBwZW5kKCctLXpsaWInKQotICAgIGlmIHVzZV9zc2w6Ci0gICAgICB3aGljaC5hcHBlbmQoJy0tc3NsJykKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPT0gMDoKLSAgICAgIHdoaWNoLmFwcGVuZCgnLXEnKQotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA9PSAyOgotICAgICAgd2hpY2guYXBwZW5kKCctdicpCi0gICMgc2VydmVyLXNwZWNpZmljIG9wdGlvbiB0byBzZWxlY3Qgc2VydmVyIGNsYXNzCi0gIHNlcnZlcl9hcmdzLmFwcGVuZChzZXJ2ZXJfY2xhc3MpCi0gICMgY2xpZW50LXNwZWNpZmljIGNtZGxpbmUgb3B0aW9ucwotICBpZiBzZXJ2ZXJfY2xhc3MgaW4gRlJBTUVEOgotICAgIGNsaV9hcmdzLmFwcGVuZCgnLS1mcmFtZWQnKQotICBpZiBzZXJ2ZXJfY2xhc3MgPT0gJ1RIdHRwU2VydmVyJzoKLSAgICBjbGlfYXJncy5hcHBlbmQoJy0taHR0cD0vJykKLSAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICBwcmludCAnVGVzdGluZyBzZXJ2ZXIgJXM6ICVzJyAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkKLSAgc2VydmVycHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VydmVyX2FyZ3MpCi0gIHRpbWUuc2xlZXAoMC4xNSkKLSAgdHJ5OgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICBwcmludCAnVGVzdGluZyBjbGllbnQ6ICVzJyAlICgnICcuam9pbihjbGlfYXJncykpCi0gICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKGNsaV9hcmdzKQorCitkZWYgc2V0dXBfcHlwYXRoKGxpYmRpciwgZ2VuZGlyKToKKyAgICBkaXJzID0gW2xpYmRpciwgZ2VuZGlyXQorICAgIGVudiA9IGNvcHkuZGVlcGNvcHkob3MuZW52aXJvbikKKyAgICBweXBhdGggPSBlbnYuZ2V0KCdQWVRIT05QQVRIJywgTm9uZSkKKyAgICBpZiBweXBhdGg6CisgICAgICAgIGRpcnMuYXBwZW5kKHB5cGF0aCkKKyAgICBlbnZbJ1BZVEhPTlBBVEgnXSA9IG9zLnBhdGhzZXAuam9pbihkaXJzKQorICAgIGlmIGdlbmRpci5lbmRzd2l0aCgnZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzJyk6CisgICAgICAgIGVudlsnVEhSSUZUX1RFU1RfUFlfTk9fVVRGOFNUUklOR1MnXSA9ICcxJworICAgIHJldHVybiBlbnYKKworCitkZWYgcnVuU2NyaXB0VGVzdChsaWJkaXIsIGdlbmJhc2UsIGdlbnB5ZGlyLCBzY3JpcHQpOgorICAgIGVudiA9IHNldHVwX3B5cGF0aChsaWJkaXIsIG9zLnBhdGguam9pbihnZW5iYXNlLCBnZW5weWRpcikpCisgICAgc2NyaXB0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoc2NyaXB0KV0KKyAgICBwcmludCgnXG5UZXN0aW5nIHNjcmlwdDogJXNcbi0tLS0nICUgKCcgJy5qb2luKHNjcmlwdF9hcmdzKSkpCisgICAgcmV0ID0gc3VicHJvY2Vzcy5jYWxsKHNjcmlwdF9hcmdzLCBlbnY9ZW52KQogICAgIGlmIHJldCAhPSAwOgotICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDbGllbnQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKGNsaV9hcmdzKSkpCi0gIGZpbmFsbHk6Ci0gICAgIyBjaGVjayB0aGF0IHNlcnZlciBkaWRuJ3QgZGllCi0gICAgc2VydmVycHJvYy5wb2xsKCkKLSAgICBpZiBzZXJ2ZXJwcm9jLnJldHVybmNvZGUgaXMgbm90IE5vbmU6Ci0gICAgICBwcmludCAnRkFJTDogU2VydmVyIHByb2Nlc3MgKCVzKSBmYWlsZWQgd2l0aCByZXRjb2RlICVkJyAlICgnICcuam9pbihzZXJ2ZXJfYXJncyksIHNlcnZlcnByb2MucmV0dXJuY29kZSkKLSAgICAgIHJhaXNlIEV4Y2VwdGlvbignU2VydmVyIHN1YnByb2Nlc3MgJXMgZGllZCwgYXJnczogJXMnICUgKHNlcnZlcl9jbGFzcywgJyAnLmpvaW4oc2VydmVyX2FyZ3MpKSkKLSAgICBlbHNlOgotICAgICAgZXh0cmFfc2xlZXAgPSBFWFRSQV9ERUxBWS5nZXQoc2VydmVyX2NsYXNzLCAwKQotICAgICAgaWYgZXh0cmFfc2xlZXAgPiAwIGFuZCBvcHRpb25zLnZlcmJvc2UgPiAwOgotICAgICAgICBwcmludCAnR2l2aW5nICVzIChwcm90bz0lcyx6bGliPSVzLHNzbD0lcykgYW4gZXh0cmEgJWQgc2Vjb25kcyBmb3IgY2hpbGQgcHJvY2Vzc2VzIHRvIHRlcm1pbmF0ZSB2aWEgYWxhcm0nICUgKHNlcnZlcl9jbGFzcywKLSAgICAgICAgICAgICAgcHJvdG8sIHVzZV96bGliLCB1c2Vfc3NsLCBleHRyYV9zbGVlcCkKLSAgICAgICAgdGltZS5zbGVlcChleHRyYV9zbGVlcCkKLSAgICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZ25hbC5TSUdLSUxMKQotICAjIHdhaXQgZm9yIHNodXRkb3duCi0gIHRpbWUuc2xlZXAoMC4wNSkKKyAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnTElCRElSOiAlcycgJSBsaWJkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1BZX0dFTjogJXMnICUgZ2VucHlkaXIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ1NDUklQVDogJXMnICUgc2NyaXB0LCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiU2NyaXB0IHN1YnByb2Nlc3MgZmFpbGVkLCByZXRjb2RlPSVkLCBhcmdzOiAlcyIgJSAocmV0LCAnICcuam9pbihzY3JpcHRfYXJncykpKQogCi10ZXN0X2NvdW50ID0gMAotIyBydW4gdGVzdHMgd2l0aG91dCBhIGNsaWVudC9zZXJ2ZXIgZmlyc3QKLXByaW50ICctLS0tLS0tLS0tLS0tLS0tJwotcHJpbnQgJyBFeGVjdXRpbmcgaW5kaXZpZHVhbCB0ZXN0IHNjcmlwdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJwotcHJpbnQgJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpCi1wcmludCAnIFNjcmlwdHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNDUklQVFMpCi1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLWZvciBnZW5weWRpciBpbiBnZW5lcmF0ZWRfZGlyczoKLSAgZm9yIHNjcmlwdCBpbiBTQ1JJUFRTOgotICAgIHJ1blNjcmlwdFRlc3QoZ2VucHlkaXIsIHNjcmlwdCkKLSAgCi1wcmludCAnLS0tLS0tLS0tLS0tLS0tLScKLXByaW50ICcgRXhlY3V0aW5nIENsaWVudC9TZXJ2ZXIgdGVzdHMgd2l0aCB2YXJpb3VzIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzJwotcHJpbnQgJyBTZXJ2ZXJzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihTRVJWRVJTKQotcHJpbnQgJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpCi1wcmludCAnIFByb3RvY29scyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oUFJPVE9TKQotcHJpbnQgJyBPcHRpb25zIHRvIGJlIHRlc3RlZDogWkxJQih5ZXMvbm8pLCBTU0woeWVzL25vKScKLXByaW50ICctLS0tLS0tLS0tLS0tLS0tJwotZm9yIHRyeV9zZXJ2ZXIgaW4gU0VSVkVSUzoKLSAgZm9yIGdlbnB5ZGlyIGluIGdlbmVyYXRlZF9kaXJzOgotICAgIGZvciB0cnlfcHJvdG8gaW4gUFJPVE9TOgotICAgICAgZm9yIHdpdGhfemxpYiBpbiAoRmFsc2UsIFRydWUpOgorCitkZWYgcnVuU2VydmljZVRlc3QobGliZGlyLCBnZW5iYXNlLCBnZW5weWRpciwgc2VydmVyX2NsYXNzLCBwcm90bywgcG9ydCwgdXNlX3psaWIsIHVzZV9zc2wsIHZlcmJvc2UpOgorICAgIGVudiA9IHNldHVwX3B5cGF0aChsaWJkaXIsIG9zLnBhdGguam9pbihnZW5iYXNlLCBnZW5weWRpcikpCisgICAgIyBCdWlsZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgc2VydmVyX2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsIHJlbGZpbGUoJ1Rlc3RTZXJ2ZXIucHknKV0KKyAgICBjbGlfYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgcmVsZmlsZSgnVGVzdENsaWVudC5weScpXQorICAgIGZvciB3aGljaCBpbiAoc2VydmVyX2FyZ3MsIGNsaV9hcmdzKToKKyAgICAgICAgd2hpY2guYXBwZW5kKCctLXByb3RvY29sPSVzJyAlIHByb3RvKSAgIyBhY2NlbCwgYmluYXJ5LCBjb21wYWN0IG9yIGpzb24KKyAgICAgICAgd2hpY2guYXBwZW5kKCctLXBvcnQ9JWQnICUgcG9ydCkgICMgZGVmYXVsdCB0byA5MDkwCisgICAgICAgIGlmIHVzZV96bGliOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctLXpsaWInKQorICAgICAgICBpZiB1c2Vfc3NsOgorICAgICAgICAgICAgd2hpY2guYXBwZW5kKCctLXNzbCcpCisgICAgICAgIGlmIHZlcmJvc2UgPT0gMDoKKyAgICAgICAgICAgIHdoaWNoLmFwcGVuZCgnLXEnKQorICAgICAgICBpZiB2ZXJib3NlID09IDI6CisgICAgICAgICAgICB3aGljaC5hcHBlbmQoJy12JykKKyAgICAjIHNlcnZlci1zcGVjaWZpYyBvcHRpb24gdG8gc2VsZWN0IHNlcnZlciBjbGFzcworICAgIHNlcnZlcl9hcmdzLmFwcGVuZChzZXJ2ZXJfY2xhc3MpCisgICAgIyBjbGllbnQtc3BlY2lmaWMgY21kbGluZSBvcHRpb25zCisgICAgaWYgc2VydmVyX2NsYXNzIGluIEZSQU1FRDoKKyAgICAgICAgY2xpX2FyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD1mcmFtZWQnKQorICAgIGVsc2U6CisgICAgICAgIGNsaV9hcmdzLmFwcGVuZCgnLS10cmFuc3BvcnQ9YnVmZmVyZWQnKQorICAgIGlmIHNlcnZlcl9jbGFzcyA9PSAnVEh0dHBTZXJ2ZXInOgorICAgICAgICBjbGlfYXJncy5hcHBlbmQoJy0taHR0cD0vJykKKyAgICBpZiB2ZXJib3NlID4gMDoKKyAgICAgICAgcHJpbnQoJ1Rlc3Rpbmcgc2VydmVyICVzOiAlcycgJSAoc2VydmVyX2NsYXNzLCAnICcuam9pbihzZXJ2ZXJfYXJncykpKQorICAgIHNlcnZlcnByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKHNlcnZlcl9hcmdzLCBlbnY9ZW52KQorCisgICAgZGVmIGVuc3VyZVNlcnZlckFsaXZlKCk6CisgICAgICAgIGlmIHNlcnZlcnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoKCdGQUlMOiBTZXJ2ZXIgcHJvY2VzcyAoJXMpIGZhaWxlZCB3aXRoIHJldGNvZGUgJWQnKQorICAgICAgICAgICAgICAgICAgJSAoJyAnLmpvaW4oc2VydmVyX2FyZ3MpLCBzZXJ2ZXJwcm9jLnJldHVybmNvZGUpKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdTZXJ2ZXIgc3VicHJvY2VzcyAlcyBkaWVkLCBhcmdzOiAlcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZXJ2ZXJfY2xhc3MsICcgJy5qb2luKHNlcnZlcl9hcmdzKSkpCisKKyAgICAjIFdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc3RhcnQgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIG9uIHRoZSBnaXZlbiBwb3J0LgorICAgIHNsZWVwX3RpbWUgPSAwLjEgICMgU2Vjb25kcworICAgIG1heF9hdHRlbXB0cyA9IDEwMAorICAgIGF0dGVtcHQgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgc29jazQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc29jazYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc29jazQuY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSA9PSAwIFwKKyAgICAgICAgICAgICAgICAgICAgb3Igc29jazYuY29ubmVjdF9leCgoJzo6MScsIHBvcnQpKSA9PSAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhdHRlbXB0ICs9IDEKKyAgICAgICAgICAgIGlmIGF0dGVtcHQgPj0gbWF4X2F0dGVtcHRzOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGVzdFNlcnZlciBub3QgcmVhZHkgb24gcG9ydCAlZCBhZnRlciAlLjJmIHNlY29uZHMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHBvcnQsIHNsZWVwX3RpbWUgKiBhdHRlbXB0KSkKKyAgICAgICAgICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfdGltZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2s0LmNsb3NlKCkKKyAgICAgICAgICAgIHNvY2s2LmNsb3NlKCkKKworICAgIHRyeToKKyAgICAgICAgaWYgdmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnVGVzdGluZyBjbGllbnQ6ICVzJyAlICgnICcuam9pbihjbGlfYXJncykpKQorICAgICAgICByZXQgPSBzdWJwcm9jZXNzLmNhbGwoY2xpX2FyZ3MsIGVudj1lbnYpCisgICAgICAgIGlmIHJldCAhPSAwOgorICAgICAgICAgICAgcHJpbnQoJyoqKiBGQUlMRUQgKioqJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcHJpbnQoJ0xJQkRJUjogJXMnICUgbGliZGlyLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBwcmludCgnUFlfR0VOOiAlcycgJSBnZW5weWRpciwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDbGllbnQgc3VicHJvY2VzcyBmYWlsZWQsIHJldGNvZGU9JWQsIGFyZ3M6ICVzIiAlIChyZXQsICcgJy5qb2luKGNsaV9hcmdzKSkpCisgICAgZmluYWxseToKKyAgICAgICAgIyBjaGVjayB0aGF0IHNlcnZlciBkaWRuJ3QgZGllCisgICAgICAgIGVuc3VyZVNlcnZlckFsaXZlKCkKKyAgICAgICAgZXh0cmFfc2xlZXAgPSBFWFRSQV9ERUxBWS5nZXQoc2VydmVyX2NsYXNzLCAwKQorICAgICAgICBpZiBleHRyYV9zbGVlcCA+IDAgYW5kIHZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ0dpdmluZyAlcyAocHJvdG89JXMsemxpYj0lcyxzc2w9JXMpIGFuIGV4dHJhICVkIHNlY29uZHMgZm9yIGNoaWxkJworICAgICAgICAgICAgICAgICAgJ3Byb2Nlc3NlcyB0byB0ZXJtaW5hdGUgdmlhIGFsYXJtJworICAgICAgICAgICAgICAgICAgJSAoc2VydmVyX2NsYXNzLCBwcm90bywgdXNlX3psaWIsIHVzZV9zc2wsIGV4dHJhX3NsZWVwKSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoZXh0cmFfc2xlZXApCisgICAgICAgIHNpZyA9IHNpZ25hbC5TSUdLSUxMIGlmIHBsYXRmb3JtLnN5c3RlbSgpICE9ICdXaW5kb3dzJyBlbHNlIHNpZ25hbC5TSUdBQlJUCisgICAgICAgIG9zLmtpbGwoc2VydmVycHJvYy5waWQsIHNpZykKKyAgICAgICAgc2VydmVycHJvYy53YWl0KCkKKworCitjbGFzcyBUZXN0Q2FzZXMob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuYmFzZSwgbGliZGlyLCBwb3J0LCBnZW5kaXJzLCBzZXJ2ZXJzLCB2ZXJib3NlKToKKyAgICAgICAgc2VsZi5nZW5iYXNlID0gZ2VuYmFzZQorICAgICAgICBzZWxmLmxpYmRpciA9IGxpYmRpcgorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5nZW5kaXJzID0gZ2VuZGlycworICAgICAgICBzZWxmLnNlcnZlcnMgPSBzZXJ2ZXJzCisKKyAgICBkZWYgZGVmYXVsdF9jb25mKHNlbGYpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ2dlbmRpcic6IHNlbGYuZ2VuZGlyc1swXSwKKyAgICAgICAgICAgICdzZXJ2ZXInOiBzZWxmLnNlcnZlcnNbMF0sCisgICAgICAgICAgICAncHJvdG8nOiBQUk9UT1NbMF0sCisgICAgICAgICAgICAnemxpYic6IEZhbHNlLAorICAgICAgICAgICAgJ3NzbCc6IEZhbHNlLAorICAgICAgICB9CisKKyAgICBkZWYgcnVuKHNlbGYsIGNvbmYsIHRlc3RfY291bnQpOgorICAgICAgICB3aXRoX3psaWIgPSBjb25mWyd6bGliJ10KKyAgICAgICAgd2l0aF9zc2wgPSBjb25mWydzc2wnXQorICAgICAgICB0cnlfc2VydmVyID0gY29uZlsnc2VydmVyJ10KKyAgICAgICAgdHJ5X3Byb3RvID0gY29uZlsncHJvdG8nXQorICAgICAgICBnZW5weWRpciA9IGNvbmZbJ2dlbmRpciddCiAgICAgICAgICMgc2tpcCBhbnkgc2VydmVycyB0aGF0IGRvbid0IHdvcmsgd2l0aCB0aGUgWmxpYiB0cmFuc3BvcnQKICAgICAgICAgaWYgd2l0aF96bGliIGFuZCB0cnlfc2VydmVyIGluIFNLSVBfWkxJQjoKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igd2l0aF9zc2wgaW4gKEZhbHNlLCBUcnVlKToKLSAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCi0gICAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgIHRlc3RfY291bnQgKz0gMQotICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgICBwcmludCAnXG5UZXN0IHJ1biAjJWQ6ICAoaW5jbHVkZXMgJXMpIFNlcnZlcj0lcywgIFByb3RvPSVzLCAgemxpYj0lcywgIFNTTD0lcycgJSAodGVzdF9jb3VudCwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCkKLSAgICAgICAgICBydW5TZXJ2aWNlVGVzdChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCBvcHRpb25zLnBvcnQsIHdpdGhfemxpYiwgd2l0aF9zc2wpCi0gICAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgICAgIHByaW50ICdPSzogRmluaXNoZWQgKGluY2x1ZGVzICVzKSAgJXMgLyAlcyBwcm90byAvIHpsaWI9JXMgLyBTU0w9JXMuICAgJWQgY29tYmluYXRpb25zIHRlc3RlZC4nICUgKGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wsIHRlc3RfY291bnQpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgIyBza2lwIGFueSBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgd29yayB3aXRoIFNTTAorICAgICAgICBpZiB3aXRoX3NzbCBhbmQgdHJ5X3NlcnZlciBpbiBTS0lQX1NTTDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgcHJpbnQoJ1xuVGVzdCBydW4gIyVkOiAgKGluY2x1ZGVzICVzKSBTZXJ2ZXI9JXMsICBQcm90bz0lcywgIHpsaWI9JXMsICBTU0w9JXMnCisgICAgICAgICAgICAgICAgICAlICh0ZXN0X2NvdW50LCBnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsKSkKKyAgICAgICAgcnVuU2VydmljZVRlc3Qoc2VsZi5saWJkaXIsIHNlbGYuZ2VuYmFzZSwgZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgc2VsZi5wb3J0LCB3aXRoX3psaWIsIHdpdGhfc3NsLCBzZWxmLnZlcmJvc2UpCisgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDA6CisgICAgICAgICAgICBwcmludCgnT0s6IEZpbmlzaGVkIChpbmNsdWRlcyAlcykgICVzIC8gJXMgcHJvdG8gLyB6bGliPSVzIC8gU1NMPSVzLiAgICVkIGNvbWJpbmF0aW9ucyB0ZXN0ZWQuJworICAgICAgICAgICAgICAgICAgJSAoZ2VucHlkaXIsIHRyeV9zZXJ2ZXIsIHRyeV9wcm90bywgd2l0aF96bGliLCB3aXRoX3NzbCwgdGVzdF9jb3VudCkpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgdGVzdF9mZWF0dXJlKHNlbGYsIG5hbWUsIHZhbHVlcyk6CisgICAgICAgIHRlc3RfY291bnQgPSAwCisgICAgICAgIGNvbmYgPSBzZWxmLmRlZmF1bHRfY29uZigpCisgICAgICAgIGZvciB0cnlfc2VydmVyIGluIHZhbHVlczoKKyAgICAgICAgICAgIGNvbmZbbmFtZV0gPSB0cnlfc2VydmVyCisgICAgICAgICAgICBpZiBzZWxmLnJ1bihjb25mLCB0ZXN0X2NvdW50KToKKyAgICAgICAgICAgICAgICB0ZXN0X2NvdW50ICs9IDEKKyAgICAgICAgcmV0dXJuIHRlc3RfY291bnQKKworICAgIGRlZiBydW5fYWxsX3Rlc3RzKHNlbGYpOgorICAgICAgICB0ZXN0X2NvdW50ID0gMAorICAgICAgICBmb3IgdHJ5X3NlcnZlciBpbiBzZWxmLnNlcnZlcnM6CisgICAgICAgICAgICBmb3IgZ2VucHlkaXIgaW4gc2VsZi5nZW5kaXJzOgorICAgICAgICAgICAgICAgIGZvciB0cnlfcHJvdG8gaW4gUFJPVE9TOgorICAgICAgICAgICAgICAgICAgICBmb3Igd2l0aF96bGliIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggdGhlIFpsaWIgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3aXRoX3psaWIgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9aTElCOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igd2l0aF9zc2wgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgYW55IHNlcnZlcnMgdGhhdCBkb24ndCB3b3JrIHdpdGggU1NMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2l0aF9zc2wgYW5kIHRyeV9zZXJ2ZXIgaW4gU0tJUF9TU0w6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1xuVGVzdCBydW4gIyVkOiAgKGluY2x1ZGVzICVzKSBTZXJ2ZXI9JXMsICBQcm90bz0lcywgIHpsaWI9JXMsICBTU0w9JXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHRlc3RfY291bnQsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHdpdGhfemxpYiwgd2l0aF9zc2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1blNlcnZpY2VUZXN0KHNlbGYubGliZGlyLCBzZWxmLmdlbmJhc2UsIGdlbnB5ZGlyLCB0cnlfc2VydmVyLCB0cnlfcHJvdG8sIHNlbGYucG9ydCwgd2l0aF96bGliLCB3aXRoX3NzbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnT0s6IEZpbmlzaGVkIChpbmNsdWRlcyAlcykgICVzIC8gJXMgcHJvdG8gLyB6bGliPSVzIC8gU1NMPSVzLiAgICVkIGNvbWJpbmF0aW9ucyB0ZXN0ZWQuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChnZW5weWRpciwgdHJ5X3NlcnZlciwgdHJ5X3Byb3RvLCB3aXRoX3psaWIsIHdpdGhfc3NsLCB0ZXN0X2NvdW50KSkKKyAgICAgICAgcmV0dXJuIHRlc3RfY291bnQKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tYWxsJywgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0nYWxsJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nZW5weWRpcnMnLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcnMnLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2RlZmF1bHQsc2xvdHMsb2xkc3R5bGUsbm9fdXRmOHN0cmluZ3MsZHluYW1pYyxkeW5hbWljc2xvdHMnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSBleHRlbnNpb25zIGZvciBnZW5lcmF0ZWQgY29kZSwgdXNlZCBhcyBzdWZmaXhlcyBmb3IgXCJnZW4tcHktKlwiIGFkZGVkIHN5cy5wYXRoIGZvciBpbmRpdmlkdWFsIHRlc3RzJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1wb3J0IiwgdHlwZT0iaW50IiwgZGVzdD0icG9ydCIsIGRlZmF1bHQ9OTA5MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0yLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InZlcmJvc2Ugb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLUwnLCAnLS1saWJkaXInLCBkZXN0PSJsaWJkaXIiLCBkZWZhdWx0PWxvY2FsX2xpYnBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXJlY3RvcnkgcGF0aCB0aGF0IGNvbnRhaW5zIFRocmlmdCBQeXRob24gbGlicmFyeSIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VuLWJhc2UnLCBkZXN0PSJnZW5fYmFzZSIsIGRlZmF1bHQ9U0NSSVBUX0RJUiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaXJlY3RvcnkgcGF0aCB0aGF0IGNvbnRhaW5zIFRocmlmdCBQeXRob24gbGlicmFyeSIpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh2ZXJib3NlPTEpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGdlbmVyYXRlZF9kaXJzID0gW10KKyAgICBmb3IgZ3BfZGlyIGluIG9wdGlvbnMuZ2VucHlkaXJzLnNwbGl0KCcsJyk6CisgICAgICAgIGdlbmVyYXRlZF9kaXJzLmFwcGVuZCgnZ2VuLXB5LSVzJyAlIChncF9kaXIpKQorCisgICAgIyBjb21tYW5kbGluZSBwZXJtaXRzIGEgc2luZ2xlIGNsYXNzIG5hbWUgdG8gYmUgc3BlY2lmaWVkIHRvIG92ZXJyaWRlIFNFUlZFUlM9Wy4uLl0KKyAgICBzZXJ2ZXJzID0gZGVmYXVsdF9zZXJ2ZXJzKCkKKyAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgaWYgYXJnc1swXSBpbiBzZXJ2ZXJzOgorICAgICAgICAgICAgc2VydmVycyA9IGFyZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCdVbmF2YWlsYWJsZSBzZXJ2ZXIgdHlwZSAiJXMiLCBwbGVhc2UgY2hvb3NlIG9uZSBvZjogJXMnICUgKGFyZ3NbMF0sIHNlcnZlcnMpKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIHRlc3RzID0gVGVzdENhc2VzKG9wdGlvbnMuZ2VuX2Jhc2UsIG9wdGlvbnMubGliZGlyLCBvcHRpb25zLnBvcnQsIGdlbmVyYXRlZF9kaXJzLCBzZXJ2ZXJzLCBvcHRpb25zLnZlcmJvc2UpCisKKyAgICAjIHJ1biB0ZXN0cyB3aXRob3V0IGEgY2xpZW50L3NlcnZlciBmaXJzdAorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBwcmludCgnIEV4ZWN1dGluZyBpbmRpdmlkdWFsIHRlc3Qgc2NyaXB0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnKQorICAgIHByaW50KCcgRGlyZWN0b3JpZXMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKGdlbmVyYXRlZF9kaXJzKSkKKyAgICBwcmludCgnIFNjcmlwdHMgdG8gYmUgdGVzdGVkOiAnICsgJywgJy5qb2luKFNDUklQVFMpKQorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKyAgICBmb3IgZ2VucHlkaXIgaW4gZ2VuZXJhdGVkX2RpcnM6CisgICAgICAgIGZvciBzY3JpcHQgaW4gU0NSSVBUUzoKKyAgICAgICAgICAgIHJ1blNjcmlwdFRlc3Qob3B0aW9ucy5saWJkaXIsIG9wdGlvbnMuZ2VuX2Jhc2UsIGdlbnB5ZGlyLCBzY3JpcHQpCisKKyAgICBwcmludCgnLS0tLS0tLS0tLS0tLS0tLScpCisgICAgcHJpbnQoJyBFeGVjdXRpbmcgQ2xpZW50L1NlcnZlciB0ZXN0cyB3aXRoIHZhcmlvdXMgZ2VuZXJhdGVkIGNvZGUgZGlyZWN0b3JpZXMnKQorICAgIHByaW50KCcgU2VydmVycyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oc2VydmVycykpCisgICAgcHJpbnQoJyBEaXJlY3RvcmllcyB0byBiZSB0ZXN0ZWQ6ICcgKyAnLCAnLmpvaW4oZ2VuZXJhdGVkX2RpcnMpKQorICAgIHByaW50KCcgUHJvdG9jb2xzIHRvIGJlIHRlc3RlZDogJyArICcsICcuam9pbihQUk9UT1MpKQorICAgIHByaW50KCcgT3B0aW9ucyB0byBiZSB0ZXN0ZWQ6IFpMSUIoeWVzL25vKSwgU1NMKHllcy9ubyknKQorICAgIHByaW50KCctLS0tLS0tLS0tLS0tLS0tJykKKworICAgIGlmIG9wdGlvbnMuYWxsOgorICAgICAgICB0ZXN0cy5ydW5fYWxsX3Rlc3RzKCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ2dlbmRpcicsIGdlbmVyYXRlZF9kaXJzKQorICAgICAgICB0ZXN0cy50ZXN0X2ZlYXR1cmUoJ3NlcnZlcicsIHNlcnZlcnMpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgncHJvdG8nLCBQUk9UT1MpCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnemxpYicsIFtGYWxzZSwgVHJ1ZV0pCisgICAgICAgIHRlc3RzLnRlc3RfZmVhdHVyZSgnc3NsJywgW0ZhbHNlLCBUcnVlXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CmluZGV4IDA2NjQxNDYuLmVmNzk4MzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKKysrIGIvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQpAQCAtMTksMzM5ICsxOSw0MzkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMsIGdsb2IKLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgotcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKLXBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLCBkZWZhdWx0PSdnZW4tcHknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKLWRlbCBzeXMuYXJndlsxOl0gIyBjbGVhbiB1cCBoYWNrIHNvIHVuaXR0ZXN0IGRvZXNuJ3QgY29tcGxhaW4KLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQotc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYi4qJylbMF0pCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAoCisgICAgQm9uaywKKyAgICBCb29scywKKyAgICBMYXJnZURlbHRhcywKKyAgICBMaXN0Qm9ua3MsCisgICAgTmVzdGVkTGlzdHNCb25rLAorICAgIE5lc3RlZExpc3RzSTMyeDIsCisgICAgTmVzdGVkTGlzdHNJMzJ4MywKKyAgICBOZXN0ZWRNaXhlZHgyLAorICAgIE51bWJlcnosCisgICAgVmVyc2lvbmluZ1Rlc3RWMSwKKyAgICBWZXJzaW9uaW5nVGVzdFYyLAorICAgIFh0cnVjdCwKKyAgICBYdHJ1Y3QyLAorKQogCi1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFJlY1RyZWUKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjTGlzdAorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYworZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYzIKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgVmVjdG9yVGVzdAogZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbCwgVENvbXBhY3RQcm90b2NvbCwgVEpTT05Qcm90b2NvbAogZnJvbSB0aHJpZnQuVFNlcmlhbGl6YXRpb24gaW1wb3J0IHNlcmlhbGl6ZSwgZGVzZXJpYWxpemUKK2ltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHRpbWUKKwogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICAgIHNlbGYudjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAotICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCi0gICAgICAgICAgb2xkX3N0cmluZz0nYWFhJywKLSAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSwKLSAgICAgICAgICApCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnYxb2JqID0gVmVyc2lvbmluZ1Rlc3RWMSgKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBvbGRfc3RyaW5nPSdhYWEnLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICAgICAgc2VsZi52Mm9iaiA9IFZlcnNpb25pbmdUZXN0VjIoCi0gICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKLSAgICAgICAgICBuZXdpbnQ9MSwKLSAgICAgICAgICBuZXdieXRlPTIsCi0gICAgICAgICAgbmV3c2hvcnQ9MywKLSAgICAgICAgICBuZXdsb25nPTQsCi0gICAgICAgICAgbmV3ZG91YmxlPTUuMCwKLSAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCi0gICAgICAgICAgbmV3bGlzdD1bNyw4LDldLAotICAgICAgICAgIG5ld3NldD1zZXQoWzQyLDEsOF0pLAotICAgICAgICAgIG5ld21hcD17MToyLDI6M30sCi0gICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCi0gICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCi0gICAgICAgICAgKQorICAgICAgICBzZWxmLnYyb2JqID0gVmVyc2lvbmluZ1Rlc3RWMigKKyAgICAgICAgICAgIGJlZ2luX2luX2JvdGg9MTIzNDUsCisgICAgICAgICAgICBuZXdpbnQ9MSwKKyAgICAgICAgICAgIG5ld2J5dGU9MiwKKyAgICAgICAgICAgIG5ld3Nob3J0PTMsCisgICAgICAgICAgICBuZXdsb25nPTQsCisgICAgICAgICAgICBuZXdkb3VibGU9NS4wLAorICAgICAgICAgICAgbmV3c3RydWN0PUJvbmsobWVzc2FnZT0iSGVsbG8hIiwgdHlwZT0xMjMpLAorICAgICAgICAgICAgbmV3bGlzdD1bNywgOCwgOV0sCisgICAgICAgICAgICBuZXdzZXQ9c2V0KFs0MiwgMSwgOF0pLAorICAgICAgICAgICAgbmV3bWFwPXsxOiAyLCAyOiAzfSwKKyAgICAgICAgICAgIG5ld3N0cmluZz0iSG9sYSEiLAorICAgICAgICAgICAgZW5kX2luX2JvdGg9NTQzMjEsCisgICAgICAgICkKIAotICAgICAgc2VsZi5ib29scyA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCi0gICAgICBzZWxmLmJvb2xzX2ZsaXBwZWQgPSBCb29scyhpbV90cnVlPUZhbHNlLCBpbV9mYWxzZT1UcnVlKQorICAgICAgICBzZWxmLmJvb2xzID0gQm9vbHMoaW1fdHJ1ZT1UcnVlLCBpbV9mYWxzZT1GYWxzZSkKKyAgICAgICAgc2VsZi5ib29sc19mbGlwcGVkID0gQm9vbHMoaW1fdHJ1ZT1GYWxzZSwgaW1fZmFsc2U9VHJ1ZSkKIAotICAgICAgc2VsZi5sYXJnZV9kZWx0YXMgPSBMYXJnZURlbHRhcyAoCi0gICAgICAgICAgYjE9c2VsZi5ib29scywKLSAgICAgICAgICBiMTA9c2VsZi5ib29sc19mbGlwcGVkLAotICAgICAgICAgIGIxMDA9c2VsZi5ib29scywKLSAgICAgICAgICBjaGVja190cnVlPVRydWUsCi0gICAgICAgICAgYjEwMDA9c2VsZi5ib29sc19mbGlwcGVkLAotICAgICAgICAgIGNoZWNrX2ZhbHNlPUZhbHNlLAotICAgICAgICAgIHZlcnR3bzIwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSdXb3JsZCEnLCB0eXBlPTMxNCkpLAotICAgICAgICAgIGFfc2V0MjUwMD1zZXQoWydsYXp5JywgJ2Jyb3duJywgJ2NvdyddKSwKLSAgICAgICAgICB2ZXJ0d28zMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c2V0PXNldChbMiwgMywgNSwgNywgMTFdKSksCi0gICAgICAgICAgYmlnX251bWJlcnM9WzIqKjgsIDIqKjE2LCAyKiozMS0xLCAtKDIqKjMxLTEpXQotICAgICAgICAgICkKKyAgICAgICAgc2VsZi5sYXJnZV9kZWx0YXMgPSBMYXJnZURlbHRhcygKKyAgICAgICAgICAgIGIxPXNlbGYuYm9vbHMsCisgICAgICAgICAgICBiMTA9c2VsZi5ib29sc19mbGlwcGVkLAorICAgICAgICAgICAgYjEwMD1zZWxmLmJvb2xzLAorICAgICAgICAgICAgY2hlY2tfdHJ1ZT1UcnVlLAorICAgICAgICAgICAgYjEwMDA9c2VsZi5ib29sc19mbGlwcGVkLAorICAgICAgICAgICAgY2hlY2tfZmFsc2U9RmFsc2UsCisgICAgICAgICAgICB2ZXJ0d28yMDAwPVZlcnNpb25pbmdUZXN0VjIobmV3c3RydWN0PUJvbmsobWVzc2FnZT0nV29ybGQhJywgdHlwZT0zMTQpKSwKKyAgICAgICAgICAgIGFfc2V0MjUwMD1zZXQoWydsYXp5JywgJ2Jyb3duJywgJ2NvdyddKSwKKyAgICAgICAgICAgIHZlcnR3bzMwMDA9VmVyc2lvbmluZ1Rlc3RWMihuZXdzZXQ9c2V0KFsyLCAzLCA1LCA3LCAxMV0pKSwKKyAgICAgICAgICAgIGJpZ19udW1iZXJzPVsyICoqIDgsIDIgKiogMTYsIDIgKiogMzEgLSAxLCAtKDIgKiogMzEgLSAxKV0KKyAgICAgICAgKQogCi0gICAgICBzZWxmLmNvbXBhY3Rfc3RydWN0ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgKLSAgICAgICAgICBhX2J5dGUgPSAxMjcsCi0gICAgICAgICAgYV9pMTY9MzIwMDAsCi0gICAgICAgICAgYV9pMzI9MTAwMDAwMDAwMCwKLSAgICAgICAgICBhX2k2ND0weGZmZmZmZmZmZmYsCi0gICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAotICAgICAgICAgIGFfc3RyaW5nPSJteSBzdHJpbmciLAotICAgICAgICAgIHRydWVfZmllbGQ9VHJ1ZSwKLSAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKLSAgICAgICAgICBlbXB0eV9zdHJ1Y3RfZmllbGQ9RW1wdHkoKSwKLSAgICAgICAgICBieXRlX2xpc3Q9Wy0xMjcsIC0xLCAwLCAxLCAxMjddLAotICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKLSAgICAgICAgICBpMzJfbGlzdD0gWy0xLCAwLCAweGZmLCAweGZmZmYsIDB4ZmZmZmZmLCAweDdmZmZmZmZmXSwKLSAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCi0gICAgICAgICAgZG91YmxlX2xpc3Q9WzAuMSwgMC4yLCAwLjNdLAotICAgICAgICAgIHN0cmluZ19saXN0PVsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0sCi0gICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKLSAgICAgICAgICBzdHJ1Y3RfbGlzdD1bRW1wdHkoKSwgRW1wdHkoKV0sCi0gICAgICAgICAgYnl0ZV9zZXQ9c2V0KFstMTI3LCAtMSwgMCwgMSwgMTI3XSksCi0gICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKLSAgICAgICAgICBpMzJfc2V0PXNldChbMSwgMiwgM10pLAotICAgICAgICAgIGk2NF9zZXQ9c2V0KFstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZiwgMHg3ZmZmZmZmZmZmZmZmZmZmXSksCi0gICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKLSAgICAgICAgICBzdHJpbmdfc2V0PXNldChbImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdKSwKLSAgICAgICAgICBib29sZWFuX3NldD1zZXQoW1RydWUsIEZhbHNlXSksCi0gICAgICAgICAgI3N0cnVjdF9zZXQ9c2V0KFtFbXB0eSgpXSksICMgdW5oYXNoYWJsZSBpbnN0YW5jZQotICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezEgOiAyfSwKLSAgICAgICAgICBpMTZfYnl0ZV9tYXA9ezEgOiAxLCAtMSA6IDEsIDB4N2ZmZiA6IDF9LAotICAgICAgICAgIGkzMl9ieXRlX21hcD17MSA6IDEsIC0xIDogMSwgMHg3ZmZmZmZmZiA6IDF9LAotICAgICAgICAgIGk2NF9ieXRlX21hcD17MCA6IDEsICAxIDogMSwgLTEgOiAxLCAweDdmZmZmZmZmZmZmZmZmZmYgOiAxfSwKLSAgICAgICAgICBkb3VibGVfYnl0ZV9tYXA9ey0xLjEgOiAxLCAxLjEgOiAxfSwKLSAgICAgICAgICBzdHJpbmdfYnl0ZV9tYXA9eyJmaXJzdCIgOiAxLCAic2Vjb25kIiA6IDIsICJ0aGlyZCIgOiAzLCAiIiA6IDB9LAotICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWUgOiAxLCBGYWxzZTogMH0sCi0gICAgICAgICAgYnl0ZV9pMTZfbWFwPXsxIDogMSwgMiA6IC0xLCAzIDogMHg3ZmZmfSwKLSAgICAgICAgICBieXRlX2kzMl9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZmZmZmfSwKLSAgICAgICAgICBieXRlX2k2NF9tYXA9ezEgOiAxLCAyIDogLTEsIDMgOiAweDdmZmZmZmZmZmZmZmZmZmZ9LAotICAgICAgICAgIGJ5dGVfZG91YmxlX21hcD17MSA6IDAuMSwgMiA6IC0wLjEsIDMgOiAxMDAwMDAwLjF9LAotICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MSA6ICIiLCAyIDogImJsYWgiLCAzIDogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAotICAgICAgICAgIGJ5dGVfYm9vbGVhbl9tYXA9ezEgOiBUcnVlLCAyIDogRmFsc2V9LAotICAgICAgICAgICNsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQotICAgICAgICAgICNzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQotICAgICAgICAgICNtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCi0gICAgICAgICAgYnl0ZV9tYXBfbWFwPXswIDoge30sIDEgOiB7MSA6IDF9LCAyIDogezEgOiAxLCAyIDogMn19LAotICAgICAgICAgIGJ5dGVfc2V0X21hcD17MCA6IHNldChbXSksIDEgOiBzZXQoWzFdKSwgMiA6IHNldChbMSwgMl0pfSwKLSAgICAgICAgICBieXRlX2xpc3RfbWFwPXswIDogW10sIDEgOiBbMV0sIDIgOiBbMSwgMl19LAotICAgICAgICAgICkKKyAgICAgICAgc2VsZi5jb21wYWN0X3N0cnVjdCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoCisgICAgICAgICAgICBhX2J5dGU9MTI3LAorICAgICAgICAgICAgYV9pMTY9MzIwMDAsCisgICAgICAgICAgICBhX2kzMj0xMDAwMDAwMDAwLAorICAgICAgICAgICAgYV9pNjQ9MHhmZmZmZmZmZmZmLAorICAgICAgICAgICAgYV9kb3VibGU9NS42Nzg5LAorICAgICAgICAgICAgYV9zdHJpbmc9Im15IHN0cmluZyIsCisgICAgICAgICAgICB0cnVlX2ZpZWxkPVRydWUsCisgICAgICAgICAgICBmYWxzZV9maWVsZD1GYWxzZSwKKyAgICAgICAgICAgIGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpLAorICAgICAgICAgICAgYnl0ZV9saXN0PVstMTI3LCAtMSwgMCwgMSwgMTI3XSwKKyAgICAgICAgICAgIGkxNl9saXN0PVstMSwgMCwgMSwgMHg3ZmZmXSwKKyAgICAgICAgICAgIGkzMl9saXN0PVstMSwgMCwgMHhmZiwgMHhmZmZmLCAweGZmZmZmZiwgMHg3ZmZmZmZmZl0sCisgICAgICAgICAgICBpNjRfbGlzdD1bLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0sCisgICAgICAgICAgICBkb3VibGVfbGlzdD1bMC4xLCAwLjIsIDAuM10sCisgICAgICAgICAgICBzdHJpbmdfbGlzdD1bImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCJdLAorICAgICAgICAgICAgYm9vbGVhbl9saXN0PVtUcnVlLCBUcnVlLCBUcnVlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgIHN0cnVjdF9saXN0PVtFbXB0eSgpLCBFbXB0eSgpXSwKKyAgICAgICAgICAgIGJ5dGVfc2V0PXNldChbLTEyNywgLTEsIDAsIDEsIDEyN10pLAorICAgICAgICAgICAgaTE2X3NldD1zZXQoWy0xLCAwLCAxLCAweDdmZmZdKSwKKyAgICAgICAgICAgIGkzMl9zZXQ9c2V0KFsxLCAyLCAzXSksCisgICAgICAgICAgICBpNjRfc2V0PXNldChbLTEsIDAsIDB4ZmYsIDB4ZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmYsIDB4ZmZmZmZmZmZmZmZmZmYsIDB4N2ZmZmZmZmZmZmZmZmZmZl0pLAorICAgICAgICAgICAgZG91YmxlX3NldD1zZXQoWzAuMSwgMC4yLCAwLjNdKSwKKyAgICAgICAgICAgIHN0cmluZ19zZXQ9c2V0KFsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIl0pLAorICAgICAgICAgICAgYm9vbGVhbl9zZXQ9c2V0KFtUcnVlLCBGYWxzZV0pLAorICAgICAgICAgICAgIyBzdHJ1Y3Rfc2V0PXNldChbRW1wdHkoKV0pLCAjIHVuaGFzaGFibGUgaW5zdGFuY2UKKyAgICAgICAgICAgIGJ5dGVfYnl0ZV9tYXA9ezE6IDJ9LAorICAgICAgICAgICAgaTE2X2J5dGVfbWFwPXsxOiAxLCAtMTogMSwgMHg3ZmZmOiAxfSwKKyAgICAgICAgICAgIGkzMl9ieXRlX21hcD17MTogMSwgLTE6IDEsIDB4N2ZmZmZmZmY6IDF9LAorICAgICAgICAgICAgaTY0X2J5dGVfbWFwPXswOiAxLCAxOiAxLCAtMTogMSwgMHg3ZmZmZmZmZmZmZmZmZmZmOiAxfSwKKyAgICAgICAgICAgIGRvdWJsZV9ieXRlX21hcD17LTEuMTogMSwgMS4xOiAxfSwKKyAgICAgICAgICAgIHN0cmluZ19ieXRlX21hcD17ImZpcnN0IjogMSwgInNlY29uZCI6IDIsICJ0aGlyZCI6IDMsICIiOiAwfSwKKyAgICAgICAgICAgIGJvb2xlYW5fYnl0ZV9tYXA9e1RydWU6IDEsIEZhbHNlOiAwfSwKKyAgICAgICAgICAgIGJ5dGVfaTE2X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZn0sCisgICAgICAgICAgICBieXRlX2kzMl9tYXA9ezE6IDEsIDI6IC0xLCAzOiAweDdmZmZmZmZmfSwKKyAgICAgICAgICAgIGJ5dGVfaTY0X21hcD17MTogMSwgMjogLTEsIDM6IDB4N2ZmZmZmZmZmZmZmZmZmZn0sCisgICAgICAgICAgICBieXRlX2RvdWJsZV9tYXA9ezE6IDAuMSwgMjogLTAuMSwgMzogMTAwMDAwMC4xfSwKKyAgICAgICAgICAgIGJ5dGVfc3RyaW5nX21hcD17MTogIiIsIDI6ICJibGFoIiwgMzogImxvb29vb29vb29vb29vb25nIHN0cmluZyJ9LAorICAgICAgICAgICAgYnl0ZV9ib29sZWFuX21hcD17MTogVHJ1ZSwgMjogRmFsc2V9LAorICAgICAgICAgICAgIyBsaXN0X2J5dGVfbWFwICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBzZXRfYnl0ZV9tYXA9e3NldChbMSwgMiwgM10pIDogMSwgc2V0KFswLCAxXSkgOiAyLCBzZXQoW10pIDogMH0sICMgdW5oYXNoYWJsZQorICAgICAgICAgICAgIyBtYXBfYnl0ZV9tYXAgIyB1bmhhc2hhYmxlCisgICAgICAgICAgICBieXRlX21hcF9tYXA9ezA6IHt9LCAxOiB7MTogMX0sIDI6IHsxOiAxLCAyOiAyfX0sCisgICAgICAgICAgICBieXRlX3NldF9tYXA9ezA6IHNldChbXSksIDE6IHNldChbMV0pLCAyOiBzZXQoWzEsIDJdKX0sCisgICAgICAgICAgICBieXRlX2xpc3RfbWFwPXswOiBbXSwgMTogWzFdLCAyOiBbMSwgMl19LAorICAgICAgICApCiAKLSAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2kzMngyID0gTmVzdGVkTGlzdHNJMzJ4MigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDEsIDEsIDIgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMiwgNywgOSBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAzLCA1LCA4IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIgPSBOZXN0ZWRMaXN0c0kzMngyKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwKKyAgICAgICAgICAgICAgICBbMiwgNywgOV0sCisgICAgICAgICAgICAgICAgWzMsIDUsIDhdCisgICAgICAgICAgICBdCisgICAgICAgICkKIAotICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMgPSBOZXN0ZWRMaXN0c0kzMngzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAyLCA3LCA5IF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgMywgNSwgOCBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIDEsIDEsIDIgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAxLCA0LCA5IF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMgPSBOZXN0ZWRMaXN0c0kzMngzKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgWzIsIDcsIDldLAorICAgICAgICAgICAgICAgICAgICBbMywgNSwgOF0KKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgWzEsIDEsIDJdLAorICAgICAgICAgICAgICAgICAgICBbMSwgNCwgOV0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBdCisgICAgICAgICkKIAotICAgICAgc2VsZi5uZXN0ZWRfbWl4ZWR4MiA9IE5lc3RlZE1peGVkeDIoIGludF9zZXRfbGlzdD1bCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChbMSwyLDNdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KFsxLDQsOV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWzEsMiwzLDUsOCwxMywyMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWy0xLCAwLCAxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3RlLCB0aGUgc2V0cyBiZWxvdyBhcmUgc2V0cyBvZiBjaGFycywgc2luY2UgdGhlIHN0cmluZ3MgYXJlIGl0ZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9pbnRfc3Ryc2V0PXsgMTA6c2V0KCdhYmMnKSwgMjA6c2V0KCdkZWYnKSwgMzA6c2V0KCdHSEknKSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PVsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAxMDpzZXQoJ2FiYycpLCAyMDpzZXQoJ2RlZicpLCAzMDpzZXQoJ0dISScpIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgMTAwOnNldCgnbG1uJyksIDIwMDpzZXQoJ29wcScpLCAzMDA6c2V0KCdSU1QnKSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDEwMDA6c2V0KCd1dncnKSwgMjAwMDpzZXQoJ3d4eScpLCAzMDAwOnNldCgnWFlaJykgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHNlbGYubmVzdGVkX21peGVkeDIgPSBOZXN0ZWRNaXhlZHgyKGludF9zZXRfbGlzdD1bCisgICAgICAgICAgICBzZXQoWzEsIDIsIDNdKSwKKyAgICAgICAgICAgIHNldChbMSwgNCwgOV0pLAorICAgICAgICAgICAgc2V0KFsxLCAyLCAzLCA1LCA4LCAxMywgMjFdKSwKKyAgICAgICAgICAgIHNldChbLTEsIDAsIDFdKQorICAgICAgICBdLAorICAgICAgICAgICAgIyBub3RlLCB0aGUgc2V0cyBiZWxvdyBhcmUgc2V0cyBvZiBjaGFycywgc2luY2UgdGhlIHN0cmluZ3MgYXJlIGl0ZXJhdGVkCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldD17MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICBtYXBfaW50X3N0cnNldF9saXN0PVsKKyAgICAgICAgICAgICAgICB7MTA6IHNldCgnYWJjJyksIDIwOiBzZXQoJ2RlZicpLCAzMDogc2V0KCdHSEknKX0sCisgICAgICAgICAgICAgICAgezEwMDogc2V0KCdsbW4nKSwgMjAwOiBzZXQoJ29wcScpLCAzMDA6IHNldCgnUlNUJyl9LAorICAgICAgICAgICAgICAgIHsxMDAwOiBzZXQoJ3V2dycpLCAyMDAwOiBzZXQoJ3d4eScpLCAzMDAwOiBzZXQoJ1hZWicpfV0KKyAgICAgICAgKQogCi0gICAgICBzZWxmLm5lc3RlZF9saXN0c19ib25rID0gTmVzdGVkTGlzdHNCb25rKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQSBmaXJzdCcsIHR5cGU9MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBIHNlY29uZCcsIHR5cGU9MSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgZmlyc3QnLCB0eXBlPTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEIgc2Vjb25kJywgdHlwZT0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHNlbGYubmVzdGVkX2xpc3RzX2JvbmsgPSBOZXN0ZWRMaXN0c0JvbmsoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEgZmlyc3QnLCB0eXBlPTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBIHNlY29uZCcsIHR5cGU9MSkKKyAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBCIGZpcnN0JywgdHlwZT0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQiBzZWNvbmQnLCB0eXBlPTIpCisgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBdCisgICAgICAgICkKIAotICAgICAgc2VsZi5saXN0X2JvbmtzID0gTGlzdEJvbmtzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEEnLCB0eXBlPTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEInLCB0eXBlPTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEMnLCB0eXBlPTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmxpc3RfYm9ua3MgPSBMaXN0Qm9ua3MoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgQm9uayhtZXNzYWdlPSdpbm5lciBBJywgdHlwZT0xKSwKKyAgICAgICAgICAgICAgICBCb25rKG1lc3NhZ2U9J2lubmVyIEInLCB0eXBlPTIpLAorICAgICAgICAgICAgICAgIEJvbmsobWVzc2FnZT0naW5uZXIgQycsIHR5cGU9MCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQogCi0gIGRlZiBfc2VyaWFsaXplKHNlbGYsIG9iaik6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgb2JqLndyaXRlKHByb3QpCi0gICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKyAgICBkZWYgX3NlcmlhbGl6ZShzZWxmLCBvYmopOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgICAgIG9iai53cml0ZShwcm90KQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQogCi0gIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6Ci0gICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCi0gICAgcmV0ID0gb2JqdHlwZSgpCi0gICAgcmV0LnJlYWQocHJvdCkKLSAgICByZXR1cm4gcmV0CisgICAgZGVmIF9kZXNlcmlhbGl6ZShzZWxmLCBvYmp0eXBlLCBkYXRhKToKKyAgICAgICAgcHJvdCA9IHNlbGYucHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZGF0YSkpCisgICAgICAgIHJldCA9IG9ianR5cGUoKQorICAgICAgICByZXQucmVhZChwcm90KQorICAgICAgICByZXR1cm4gcmV0CiAKLSAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52MW9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmJlZ2luX2luX2JvdGgsIHNlbGYudjFvYmouYmVnaW5faW5fYm90aCkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCisgICAgZGVmIHRlc3RGb3J3YXJkcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMiwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouYmVnaW5faW5fYm90aCwgc2VsZi52MW9iai5iZWdpbl9pbl9ib3RoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmouZW5kX2luX2JvdGgsIHNlbGYudjFvYmouZW5kX2luX2JvdGgpCiAKLSAgZGVmIHRlc3RCYWNrd2FyZHMoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjJvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLmVuZF9pbl9ib3RoLCBzZWxmLnYyb2JqLmVuZF9pbl9ib3RoKQorICAgIGRlZiB0ZXN0QmFja3dhcmRzKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYxLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5iZWdpbl9pbl9ib3RoLCBzZWxmLnYyb2JqLmJlZ2luX2luX2JvdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iai5lbmRfaW5fYm90aCwgc2VsZi52Mm9iai5lbmRfaW5fYm90aCkKIAotICBkZWYgdGVzdFNlcmlhbGl6ZVYxKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjEsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYxb2JqKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjFvYmopCisgICAgZGVmIHRlc3RTZXJpYWxpemVWMShzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoVmVyc2lvbmluZ1Rlc3RWMSwgc2VsZi5fc2VyaWFsaXplKHNlbGYudjFvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYudjFvYmopCiAKLSAgZGVmIHRlc3RTZXJpYWxpemVWMihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShWZXJzaW9uaW5nVGVzdFYyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi52Mm9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYyb2JqKQorICAgIGRlZiB0ZXN0U2VyaWFsaXplVjIoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlcnNpb25pbmdUZXN0VjIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLnYyb2JqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLnYyb2JqKQogCi0gIGRlZiB0ZXN0Qm9vbHMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi5ib29sc19mbGlwcGVkKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYudjFvYmopCi0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuYm9vbHMpCi0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzX2ZsaXBwZWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29sc19mbGlwcGVkKQotICAgIHJlcCA9IHJlcHIoc2VsZi5ib29scykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorICAgIGRlZiB0ZXN0Qm9vbHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKHNlbGYuYm9vbHMsIHNlbGYuYm9vbHNfZmxpcHBlZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoc2VsZi5ib29scywgc2VsZi52MW9iaikKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoQm9vbHMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmJvb2xzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmJvb2xzKQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShCb29scywgc2VsZi5fc2VyaWFsaXplKHNlbGYuYm9vbHNfZmxpcHBlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5ib29sc19mbGlwcGVkKQorICAgICAgICByZXAgPSByZXByKHNlbGYuYm9vbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCiAKLSAgZGVmIHRlc3RMYXJnZURlbHRhcyhzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5sYXJnZV9kZWx0YXMpCi0gICAgcmVwID0gcmVwcihzZWxmLmxhcmdlX2RlbHRhcykKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorICAgIGRlZiB0ZXN0TGFyZ2VEZWx0YXMoc2VsZik6CisgICAgICAgICMgdGVzdCBsYXJnZSBmaWVsZCBkZWx0YXMgKG1lYW5pbmdmdWwgaW4gQ29tcGFjdFByb3RvIG9ubHkpCisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExhcmdlRGVsdGFzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5sYXJnZV9kZWx0YXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubGFyZ2VfZGVsdGFzKQorICAgICAgICByZXAgPSByZXByKHNlbGYubGFyZ2VfZGVsdGFzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQogCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MihzZWxmKToKLSAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRMaXN0c0kzMngyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDIpCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKLSAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorICAgIGRlZiB0ZXN0TmVzdGVkTGlzdHNJMzJ4MihzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNJMzJ4Miwgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2kzMngyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19pMzJ4MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKIAotICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6Ci0gICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNJMzJ4Mywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX2xpc3RzX2kzMngzKQotICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzSTMyeDMoc2VsZik6CisgICAgICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzSTMyeDMsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9saXN0c19pMzJ4MykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5uZXN0ZWRfbGlzdHNfaTMyeDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCiAKLSAgZGVmIHRlc3ROZXN0ZWRNaXhlZHgyKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZE1peGVkeDIsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLm5lc3RlZF9taXhlZHgyKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYubmVzdGVkX21peGVkeDIpCi0gICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9taXhlZHgyKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisgICAgZGVmIHRlc3ROZXN0ZWRNaXhlZHgyKHNlbGYpOgorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShOZXN0ZWRNaXhlZHgyLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbWl4ZWR4MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbWl4ZWR4MikKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9taXhlZHgyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQogCi0gIGRlZiB0ZXN0TmVzdGVkTGlzdHNCb25rKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKE5lc3RlZExpc3RzQm9uaywgc2VsZi5fc2VyaWFsaXplKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKLSAgICByZXAgPSByZXByKHNlbGYubmVzdGVkX2xpc3RzX2JvbmspCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKyAgICBkZWYgdGVzdE5lc3RlZExpc3RzQm9uayhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTmVzdGVkTGlzdHNCb25rLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5uZXN0ZWRfbGlzdHNfYm9uaykKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLm5lc3RlZF9saXN0c19ib25rKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQogCi0gIGRlZiB0ZXN0TGlzdEJvbmtzKHNlbGYpOgotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKExpc3RCb25rcywgc2VsZi5fc2VyaWFsaXplKHNlbGYubGlzdF9ib25rcykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmxpc3RfYm9ua3MpCi0gICAgcmVwID0gcmVwcihzZWxmLmxpc3RfYm9ua3MpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXApID4gMCkKKyAgICBkZWYgdGVzdExpc3RCb25rcyhzZWxmKToKKyAgICAgICAgb2JqID0gc2VsZi5fZGVzZXJpYWxpemUoTGlzdEJvbmtzLCBzZWxmLl9zZXJpYWxpemUoc2VsZi5saXN0X2JvbmtzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBzZWxmLmxpc3RfYm9ua3MpCisgICAgICAgIHJlcCA9IHJlcHIoc2VsZi5saXN0X2JvbmtzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQogCi0gIGRlZiB0ZXN0Q29tcGFjdFN0cnVjdChzZWxmKToKLSAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQotICAgIG9iaiA9IHNlbGYuX2Rlc2VyaWFsaXplKENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIHNlbGYuX3NlcmlhbGl6ZShzZWxmLmNvbXBhY3Rfc3RydWN0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIHNlbGYuY29tcGFjdF9zdHJ1Y3QpCi0gICAgcmVwID0gcmVwcihzZWxmLmNvbXBhY3Rfc3RydWN0KQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwKSA+IDApCisgICAgZGVmIHRlc3RDb21wYWN0U3RydWN0KHNlbGYpOgorICAgICAgICAjIHRlc3QgbGFyZ2UgZmllbGQgZGVsdGFzIChtZWFuaW5nZnVsIGluIENvbXBhY3RQcm90byBvbmx5KQorICAgICAgICBvYmogPSBzZWxmLl9kZXNlcmlhbGl6ZShDb21wYWN0UHJvdG9UZXN0U3RydWN0LCBzZWxmLl9zZXJpYWxpemUoc2VsZi5jb21wYWN0X3N0cnVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgc2VsZi5jb21wYWN0X3N0cnVjdCkKKyAgICAgICAgcmVwID0gcmVwcihzZWxmLmNvbXBhY3Rfc3RydWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcCkgPiAwKQorCisgICAgZGVmIHRlc3RJbnRlZ2VyTGltaXRzKHNlbGYpOgorICAgICAgICBpZiAoc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBzeXMudmVyc2lvbl9pbmZvWzFdIDw9IDYpOgorICAgICAgICAgICAgcHJpbnQoJ1NraXBwaW5nIHRlc3RJbnRlZ2VyTGltaXRzIGZvciBQeXRob24gMi42JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBiYWRfdmFsdWVzID0gW0NvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9ieXRlPTEyOCksIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9ieXRlPS0xMjkpLAorICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QoYV9pMTY9MzI3NjgpLCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGFfaTE2PS0zMjc2OSksCisgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kzMj0yMTQ3NDgzNjQ4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2kzMj0tMjE0NzQ4MzY0OSksCisgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2k2ND05MjIzMzcyMDM2ODU0Nzc1ODA4KSwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdChhX2k2ND0tOTIyMzM3MjAzNjg1NDc3NTgwOSkKKyAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIHZhbHVlIGluIGJhZF92YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIHNlbGYuX3NlcmlhbGl6ZSwgdmFsdWUpCisKKyAgICBkZWYgdGVzdFJlY1RyZWUoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgdHJlZSBub2RlIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGZvciBpZHggaW4gcmFuZ2UoMSwgNSk6CisgICAgICAgICAgICBub2RlID0gUmVjVHJlZShpdGVtPWlkeCwgY2hpbGRyZW49Tm9uZSkKKyAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChub2RlKQorCisgICAgICAgIHBhcmVudCA9IFJlY1RyZWUoaXRlbT0wLCBjaGlsZHJlbj1jaGlsZHJlbikKKyAgICAgICAgc2VyZGVfcGFyZW50ID0gc2VsZi5fZGVzZXJpYWxpemUoUmVjVHJlZSwgc2VsZi5fc2VyaWFsaXplKHBhcmVudCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIHNlcmRlX3BhcmVudC5pdGVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0LCBsZW4oc2VyZGVfcGFyZW50LmNoaWxkcmVuKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlcmRlX3BhcmVudC5jaGlsZHJlbjoKKyAgICAgICAgICAgICMgQ2Fubm90IHVzZSBhc3NlcnRJc0luc3RhbmNlIGluIHB5dGhvbiAyLjY/CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjaGlsZCwgUmVjVHJlZSkpCisKKyAgICBkZWYgX2J1aWxkTGlua2VkTGlzdChzZWxmKToKKyAgICAgICAgaGVhZCA9IGN1ciA9IFJlY0xpc3QoaXRlbT0wKQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY0xpc3QoaXRlbT1pZHgpCisgICAgICAgICAgICBjdXIubmV4dGl0ZW0gPSBub2RlCisgICAgICAgICAgICBjdXIgPSBub2RlCisgICAgICAgIHJldHVybiBoZWFkCisKKyAgICBkZWYgX2NvbGxhcHNlTGlua2VkTGlzdChzZWxmLCBoZWFkKToKKyAgICAgICAgb3V0X2xpc3QgPSBbXQorICAgICAgICBjdXIgPSBoZWFkCisgICAgICAgIHdoaWxlIGN1ciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dF9saXN0LmFwcGVuZChjdXIuaXRlbSkKKyAgICAgICAgICAgIGN1ciA9IGN1ci5uZXh0aXRlbQorICAgICAgICByZXR1cm4gb3V0X2xpc3QKKworICAgIGRlZiB0ZXN0UmVjTGlzdChzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHJlY3Vyc2l2ZSBsaW5rZWQgbGlzdCBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgcmVjX2xpc3QgPSBzZWxmLl9idWlsZExpbmtlZExpc3QoKQorICAgICAgICBzZXJkZV9saXN0ID0gc2VsZi5fZGVzZXJpYWxpemUoUmVjTGlzdCwgc2VsZi5fc2VyaWFsaXplKHJlY19saXN0KSkKKyAgICAgICAgb3V0X2xpc3QgPSBzZWxmLl9jb2xsYXBzZUxpbmtlZExpc3Qoc2VyZGVfbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoWzAsIDEsIDIsIDMsIDRdLCBvdXRfbGlzdCkKKworICAgIGRlZiB0ZXN0Q29SZWMoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBjby1yZWN1cnNpdmUgc3RydWN0dXJlcyBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgaXRlbTEgPSBDb1JlYygpCisgICAgICAgIGl0ZW0yID0gQ29SZWMyKCkKKworICAgICAgICBpdGVtMS5vdGhlciA9IGl0ZW0yCisgICAgICAgIGl0ZW0yLm90aGVyID0gaXRlbTEKKworICAgICAgICAjIE5PVEUgW2Vjb25uZXI3MjQsMjAxNy0wNi0yMV06IFRoZXNlIG9iamVjdHMgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYXMgc2VyaWFsaXphdGlvbgorICAgICAgICAjIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcC4gZmJ0aHJpZnQgYWxzbyBzdWZmZXJzIGZyb20gdGhpcworICAgICAgICAjIHByb2JsZW0uCisKKyAgICBkZWYgdGVzdFJlY1ZlY3RvcihzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGEgbGlzdCBvZiByZWN1cnNpdmUgbm9kZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIG15bGlzdCA9IFtzZWxmLl9idWlsZExpbmtlZExpc3QoKSwgc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCldCisgICAgICAgIG15dmVjID0gVmVjdG9yVGVzdChsaXN0ZXI9bXlsaXN0KQorCisgICAgICAgIHNlcmRlX3ZlYyA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlY3RvclRlc3QsIHNlbGYuX3NlcmlhbGl6ZShteXZlYykpCisgICAgICAgIGdvbGRlbl9saXN0ID0gWzAsIDEsIDIsIDMsIDRdCisgICAgICAgIGZvciBjdXJfbGlzdCBpbiBzZXJkZV92ZWMubGlzdGVyOgorICAgICAgICAgICAgb3V0X2xpc3QgPSBzZWxmLl9jb2xsYXBzZUxpbmtlZExpc3QoY3VyX2xpc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9saXN0LCBvdXRfbGlzdCkKKwogCiBjbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKKwogCiBjbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKQorCiAKIGNsYXNzIENvbXBhY3RQcm90b2NvbFRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKQorICAgIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkKKworCitjbGFzcyBKU09OUHJvdG9jb2xUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKQorCiAKIGNsYXNzIEFjY2VsZXJhdGVkRnJhbWVkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gIGRlZiB0ZXN0U3BsaXQoc2VsZik6Ci0gICAgIiIiVGVzdCBGcmFtZWRUcmFuc3BvcnQgYW5kIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQKKyAgICBkZWYgdGVzdFNwbGl0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IEZyYW1lZFRyYW5zcG9ydCBhbmQgQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAogCi0gICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAotICAgIHBsYXkgbmljZWx5IHRvZ2V0aGVyIHdoZW4gYSByZWFkIHNwYW5zIGEgZnJhbWUiIiIKKyAgICAgICAgVGVzdHMgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgVEZyYW1lZFRyYW5zcG9ydAorICAgICAgICBwbGF5IG5pY2VseSB0b2dldGhlciB3aGVuIGEgcmVhZCBzcGFucyBhIGZyYW1lIiIiCiAKLSAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCi0gICAgYmlnc3RyaW5nID0gIiIuam9pbihjaHIoYnl0ZSkgZm9yIGJ5dGUgaW4gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpCisgICAgICAgIGJpZ3N0cmluZyA9ICIiLmpvaW4oY2hyKGJ5dGUpIGZvciBieXRlIGluIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSArIDEpKQogCi0gICAgZGF0YWJ1ZiA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCi0gICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKLSAgICBwcm90LndyaXRlSTMyKDQyKQotICAgIHByb3Qud3JpdGVTdHJpbmcoYmlnc3RyaW5nKQotICAgIHByb3Qud3JpdGVJMTYoMjQpCi0gICAgZGF0YSA9IGRhdGFidWYuZ2V0dmFsdWUoKQotICAgIGN1dHBvaW50ID0gbGVuKGRhdGEpLzIKLSAgICBwYXJ0cyA9IFsgZGF0YVs6Y3V0cG9pbnRdLCBkYXRhW2N1dHBvaW50Ol0gXQorICAgICAgICBkYXRhYnVmID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgcHJvdCA9IHByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woZGF0YWJ1ZikKKyAgICAgICAgcHJvdC53cml0ZUkzMig0MikKKyAgICAgICAgcHJvdC53cml0ZVN0cmluZyhiaWdzdHJpbmcpCisgICAgICAgIHByb3Qud3JpdGVJMTYoMjQpCisgICAgICAgIGRhdGEgPSBkYXRhYnVmLmdldHZhbHVlKCkKKyAgICAgICAgY3V0cG9pbnQgPSBsZW4oZGF0YSkgLy8gMgorICAgICAgICBwYXJ0cyA9IFtkYXRhWzpjdXRwb2ludF0sIGRhdGFbY3V0cG9pbnQ6XV0KIAotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGZyYW1lZF93cml0ZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBmb3IgcGFydCBpbiBwYXJ0czoKLSAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKLSAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihmcmFtZWRfYnVmZmVyLmdldHZhbHVlKCkpLCBsZW4oZGF0YSkgKyA4KQorICAgICAgICBmcmFtZWRfYnVmZmVyID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgZnJhbWVkX3dyaXRlciA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChmcmFtZWRfYnVmZmVyKQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIud3JpdGUocGFydCkKKyAgICAgICAgICAgIGZyYW1lZF93cml0ZXIuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKSwgbGVuKGRhdGEpICsgOCkKIAotICAgICMgUmVjcmVhdGUgZnJhbWVkX2J1ZmZlciBzbyB3ZSBjYW4gcmVhZCBmcm9tIGl0LgotICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQotICAgIGZyYW1lZF9yZWFkZXIgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoZnJhbWVkX2J1ZmZlcikKLSAgICBwcm90ID0gcHJvdG9jb2xfZmFjdG9yeS5nZXRQcm90b2NvbChmcmFtZWRfcmVhZGVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkU3RyaW5nKCksIGJpZ3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZEkxNigpLCAyNCkKKyAgICAgICAgIyBSZWNyZWF0ZSBmcmFtZWRfYnVmZmVyIHNvIHdlIGNhbiByZWFkIGZyb20gaXQuCisgICAgICAgIGZyYW1lZF9idWZmZXIgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoZnJhbWVkX2J1ZmZlci5nZXR2YWx1ZSgpKQorICAgICAgICBmcmFtZWRfcmVhZGVyID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0KGZyYW1lZF9idWZmZXIpCisgICAgICAgIHByb3QgPSBwcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKGZyYW1lZF9yZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTMyKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3QucmVhZFN0cmluZygpLCBiaWdzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdC5yZWFkSTE2KCksIDI0KQorCiAKIGNsYXNzIFNlcmlhbGl6ZXJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgZGVmIHRlc3RTZXJpYWxpemVUaGVuRGVzZXJpYWxpemUoc2VsZik6Ci0gICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKLSAgICAgICAgICAgICAgICAgIHN0cnVjdF90aGluZz1YdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJmb28iKSkKKyAgICBkZWYgdGVzdFNlcmlhbGl6ZVRoZW5EZXNlcmlhbGl6ZShzZWxmKToKKyAgICAgICAgb2JqID0gWHRydWN0MihpMzJfdGhpbmc9MSwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0iZm9vIikpCiAKLSAgICBzMSA9IHNlcmlhbGl6ZShvYmopCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQotICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQotICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisgICAgICAgIHMxID0gc2VyaWFsaXplKG9iaikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoczEsIHNlcmlhbGl6ZShvYmopKQorICAgICAgICAgICAgb2JqY29weSA9IFh0cnVjdDIoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICBvYmogPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJiYXIiKQotICAgIG9iamNvcHkgPSBYdHJ1Y3QoKQotICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iaiwgb2JqY29weSkKKyAgICAgICAgb2JqID0gWHRydWN0KHN0cmluZ190aGluZz0iYmFyIikKKyAgICAgICAgb2JqY29weSA9IFh0cnVjdCgpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCiAKLSAgICAjIHRlc3QgYm9vbGVhbnMKLSAgICBvYmogPSBCb29scyhpbV90cnVlPVRydWUsIGltX2ZhbHNlPUZhbHNlKQotICAgIG9iamNvcHkgPSBCb29scygpCi0gICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAgIAotICAgICMgdGVzdCBlbnVtcwotICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZXJpdGVtcygpOgotICAgICAgb2JqID0gQm9uayhtZXNzYWdlPSdlbnVtIE51bWJlcnogdmFsdWUgJWQgaXMgc3RyaW5nICVzJyAlIChudW0sIG5hbWUpLCB0eXBlPW51bSkKLSAgICAgIG9iamNvcHkgPSBCb25rKCkKLSAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob2JqLCBvYmpjb3B5KQotICAKKyAgICAgICAgIyB0ZXN0IGJvb2xlYW5zCisgICAgICAgIG9iaiA9IEJvb2xzKGltX3RydWU9VHJ1ZSwgaW1fZmFsc2U9RmFsc2UpCisgICAgICAgIG9iamNvcHkgPSBCb29scygpCisgICAgICAgIGRlc2VyaWFsaXplKG9iamNvcHksIHNlcmlhbGl6ZShvYmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKKyAgICAgICAgIyB0ZXN0IGVudW1zCisgICAgICAgIGZvciBudW0sIG5hbWUgaW4gTnVtYmVyei5fVkFMVUVTX1RPX05BTUVTLml0ZW1zKCk6CisgICAgICAgICAgICBvYmogPSBCb25rKG1lc3NhZ2U9J2VudW0gTnVtYmVyeiB2YWx1ZSAlZCBpcyBzdHJpbmcgJXMnICUgKG51bSwgbmFtZSksIHR5cGU9bnVtKQorICAgICAgICAgICAgb2JqY29weSA9IEJvbmsoKQorICAgICAgICAgICAgZGVzZXJpYWxpemUob2JqY29weSwgc2VyaWFsaXplKG9iaikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvYmosIG9iamNvcHkpCisKIAogZGVmIHN1aXRlKCk6Ci0gIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKLSAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQogCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShOb3JtYWxCaW5hcnlUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKLSAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCi0gIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0UHJvdG9jb2xUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlByb3RvY29sVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkRnJhbWVkVGVzdCkpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFNlcmlhbGl6ZXJzVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5weSBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5ODc2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcHkvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHkKQEAgLTAsMCArMSwxMDggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgQm9uaywgVmVyc2lvbmluZ1Rlc3RWMSwgVmVyc2lvbmluZ1Rlc3RWMgorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorCitpbXBvcnQganNvbgoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgU2ltcGxlSlNPTlByb3RvY29sVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRKU09OUHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbEZhY3RvcnkoKQorCisgICAgZGVmIF9hc3NlcnREaWN0RXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdhc3NlcnREaWN0RXF1YWwnKToKKyAgICAgICAgICAgICMgYXNzZXJ0RGljdEVxdWFsIG9ubHkgaW4gUHl0aG9uIDIuNy4gRGVwZW5kcyBvbiB5b3VyIG1hY2hpbmUuCisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbChhLCBiLCBtc2cpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFN1YnN0aXR1dGUgaW1wbGVtZW50YXRpb24gbm90IGFzIGdvb2QgYXMgdW5pdHRlc3QgbGlicmFyeSdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhKSwgbGVuKGIpLCBtc2cpCisgICAgICAgIGZvciBrLCB2IGluIGEuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBiLCBtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhiLmdldChrKSwgdiwgbXNnKQorCisgICAgZGVmIF9zZXJpYWxpemUoc2VsZiwgb2JqKToKKyAgICAgICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQorICAgICAgICBwcm90ID0gc2VsZi5wcm90b2NvbF9mYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBvYmoud3JpdGUocHJvdCkKKyAgICAgICAgcmV0dXJuIHRyYW5zLmdldHZhbHVlKCkKKworICAgIGRlZiBfZGVzZXJpYWxpemUoc2VsZiwgb2JqdHlwZSwgZGF0YSk6CisgICAgICAgIHByb3QgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGEpKQorICAgICAgICByZXQgPSBvYmp0eXBlKCkKKyAgICAgICAgcmV0LnJlYWQocHJvdCkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHRlc3RXcml0ZU9ubHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rlc2VyaWFsaXplLCBWZXJzaW9uaW5nVGVzdFYxLCBiJ3t9JykKKworICAgIGRlZiB0ZXN0U2ltcGxlTWVzc2FnZShzZWxmKToKKyAgICAgICAgdjFvYmogPSBWZXJzaW9uaW5nVGVzdFYxKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG9sZF9zdHJpbmc9J2FhYScsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djFvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9zdHJpbmc9djFvYmoub2xkX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9pbl9ib3RoPXYxb2JqLmVuZF9pbl9ib3RoKQorICAgICAgICBhY3R1YWwgPSBqc29uLmxvYWRzKHNlbGYuX3NlcmlhbGl6ZSh2MW9iaikuZGVjb2RlKCdhc2NpaScpKQorCisgICAgICAgIHNlbGYuX2Fzc2VydERpY3RFcXVhbChleHBlY3RlZCwgYWN0dWFsKQorCisgICAgZGVmIHRlc3RDb21wbGljYXRlZChzZWxmKToKKyAgICAgICAgdjJvYmogPSBWZXJzaW9uaW5nVGVzdFYyKAorICAgICAgICAgICAgYmVnaW5faW5fYm90aD0xMjM0NSwKKyAgICAgICAgICAgIG5ld2ludD0xLAorICAgICAgICAgICAgbmV3Ynl0ZT0yLAorICAgICAgICAgICAgbmV3c2hvcnQ9MywKKyAgICAgICAgICAgIG5ld2xvbmc9NCwKKyAgICAgICAgICAgIG5ld2RvdWJsZT01LjAsCisgICAgICAgICAgICBuZXdzdHJ1Y3Q9Qm9uayhtZXNzYWdlPSJIZWxsbyEiLCB0eXBlPTEyMyksCisgICAgICAgICAgICBuZXdsaXN0PVs3LCA4LCA5XSwKKyAgICAgICAgICAgIG5ld3NldD1zZXQoWzQyLCAxLCA4XSksCisgICAgICAgICAgICBuZXdtYXA9ezE6IDIsIDI6IDN9LAorICAgICAgICAgICAgbmV3c3RyaW5nPSJIb2xhISIsCisgICAgICAgICAgICBlbmRfaW5fYm90aD01NDMyMSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkaWN0KGJlZ2luX2luX2JvdGg9djJvYmouYmVnaW5faW5fYm90aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2ludD12Mm9iai5uZXdpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdieXRlPXYyb2JqLm5ld2J5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzaG9ydD12Mm9iai5uZXdzaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xvbmc9djJvYmoubmV3bG9uZywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RvdWJsZT12Mm9iai5uZXdkb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJ1Y3Q9ZGljdChtZXNzYWdlPXYyb2JqLm5ld3N0cnVjdC5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT12Mm9iai5uZXdzdHJ1Y3QudHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaXN0PXYyb2JqLm5ld2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdzZXQ9bGlzdCh2Mm9iai5uZXdzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3bWFwPXYyb2JqLm5ld21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3N0cmluZz12Mm9iai5uZXdzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRfaW5fYm90aD12Mm9iai5lbmRfaW5fYm90aCkKKworICAgICAgICAjIE5lZWQgdG8gbG9hZC9kdW1wIGJlY2F1c2UgbWFwIGtleXMgZ2V0IGVzY2FwZWQuCisgICAgICAgIGV4cGVjdGVkID0ganNvbi5sb2Fkcyhqc29uLmR1bXBzKGV4cGVjdGVkKSkKKyAgICAgICAgYWN0dWFsID0ganNvbi5sb2FkcyhzZWxmLl9zZXJpYWxpemUodjJvYmopLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgc2VsZi5fYXNzZXJ0RGljdEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdENsaWVudC5weSBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQppbmRleCA3MTAwMWIxLi5kZGNjZThkIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkKKysrIGIvdGVzdC9weS9UZXN0Q2xpZW50LnB5CkBAIC0xLDUgKzEsNSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KKyMgLSotIGNvZGluZzogdXRmLTggLSotCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDIxOCArMTksNDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1pbXBvcnQgc3lzLCBnbG9iCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PSdnZW4tcHknLAotICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGxvY2FsIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAotICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIGF0IHBvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0taG9zdCIsIHR5cGU9InN0cmluZyIsIGRlc3Q9Imhvc3QiLAotICAgIGhlbHA9ImNvbm5lY3QgdG8gc2VydmVyIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKLSAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAotICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tZnJhbWVkIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iZnJhbWVkIiwKLSAgICBoZWxwPSJ1c2UgZnJhbWVkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1odHRwIiwgZGVzdD0iaHR0cF9wYXRoIiwKLSAgICBoZWxwPSJVc2UgdGhlIEhUVFAgdHJhbnNwb3J0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIikKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCi0gICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwgCi0gICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCi0gICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG8nLCAgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAotICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0IikKLXBhcnNlci5zZXRfZGVmYXVsdHMoZnJhbWVkPUZhbHNlLCBodHRwX3BhdGg9Tm9uZSwgdmVyYm9zZT0xLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHByb3RvPSdiaW5hcnknKQotb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKK2Zyb20gdXRpbCBpbXBvcnQgbG9jYWxfbGlicGF0aAogCi1zeXMucGF0aC5pbnNlcnQoMCwgb3B0aW9ucy5nZW5weWRpcikKK1NDUklQVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIAotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSHR0cENsaWVudAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUWmxpYlRyYW5zcG9ydAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKIAogY2xhc3MgQWJzdHJhY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgotICAgICAgc2VsZi50cmFuc3BvcnQgPSBUSHR0cENsaWVudC5USHR0cENsaWVudChvcHRpb25zLmhvc3QsIHBvcnQ9b3B0aW9ucy5wb3J0LCBwYXRoPW9wdGlvbnMuaHR0cF9wYXRoKQotICAgIGVsc2U6Ci0gICAgICBpZiBvcHRpb25zLnNzbDoKLSAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0Ci0gICAgICAgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCwgdmFsaWRhdGU9RmFsc2UpCi0gICAgICBlbHNlOgotICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQob3B0aW9ucy5ob3N0LCBvcHRpb25zLnBvcnQpCi0gICAgICAjIGZyYW1lIG9yIGJ1ZmZlciBkZXBlbmRpbmcgdXBvbiBhcmdzCi0gICAgICBpZiBvcHRpb25zLmZyYW1lZDoKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpCi0gICAgICBpZiBvcHRpb25zLnpsaWI6Ci0gICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQoc2VsZi50cmFuc3BvcnQsIDkpCi0gICAgc2VsZi50cmFuc3BvcnQub3BlbigpCi0gICAgcHJvdG9jb2wgPSBzZWxmLnByb3RvY29sX2ZhY3RvcnkuZ2V0UHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCi0gICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2h0dHAnOgorICAgICAgICAgICAgdXJpID0gJ3swfTovL3sxfTp7Mn17M30nLmZvcm1hdCgoJ2h0dHBzJyBpZiBvcHRpb25zLnNzbCBlbHNlICdodHRwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5odHRwX3BhdGggaWYgb3B0aW9ucy5odHRwX3BhdGggZWxzZSAnLycpKQorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgX19jYWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJDQS5wZW0iKQorICAgICAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQuY3J0IikKKyAgICAgICAgICAgICAgICBfX2tleWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQua2V5IikKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSwgY2FmaWxlPV9fY2FmaWxlLCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG9wdGlvbnMuc3NsOgorICAgICAgICAgICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAorICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTU0xTb2NrZXQuVFNTTFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCwgdmFsaWRhdGU9RmFsc2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNvY2tldCA9IFRTb2NrZXQuVFNvY2tldChvcHRpb25zLmhvc3QsIG9wdGlvbnMucG9ydCkKKyAgICAgICAgICAgICMgZnJhbWUgb3IgYnVmZmVyIGRlcGVuZGluZyB1cG9uIGFyZ3MKKyAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KQorICAgICAgICAgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnZnJhbWVkJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisgICAgICAgICAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2J1ZmZlcmVkJzoKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkKKyAgICAgICAgICAgIGVsaWYgb3B0aW9ucy50cmFucyA9PSAnJzoKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCisgICAgICAgICAgICBpZiBvcHRpb25zLnpsaWI6CisgICAgICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydChzZWxmLnRyYW5zcG9ydCwgOSkKKyAgICAgICAgc2VsZi50cmFuc3BvcnQub3BlbigpCisgICAgICAgIHByb3RvY29sID0gc2VsZi5nZXRfcHJvdG9jb2woc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHNlbGYuY2xpZW50ID0gVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpCisgICAgICAgICMgZm9yIG11bHRpcGxleGVkIHNlcnZpY2VzOgorICAgICAgICBwcm90b2NvbDIgPSBzZWxmLmdldF9wcm90b2NvbDIoc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHNlbGYuY2xpZW50MiA9IFNlY29uZFNlcnZpY2UuQ2xpZW50KHByb3RvY29sMikgaWYgcHJvdG9jb2wyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogCi0gIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAjIENsb3NlIQotICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKIAotICBkZWYgdGVzdFZvaWQoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQorICAgIGRlZiB0ZXN0Vm9pZChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RWb2lkJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdFZvaWQoKQogCi0gIGRlZiB0ZXN0U3RyaW5nKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyAqIDIwKSwgJ1B5dGhvbicgKiAyMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJykKKyAgICBkZWYgdGVzdFN0cmluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicgKiAyMCksICdQeXRob24nICogMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnJyksICcnKQorICAgICAgICBzMSA9IHUnXGJcdFxuL1xcXFxccnt9OuODkeOCpOOCveODsyInCisgICAgICAgIHMyID0gdSIiIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLAorICAgICAgICBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwKKyAgICAgICAg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLAorICAgICAgICDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sCisgICAgICAgIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywKKyAgICAgICAgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLAorICAgICAgICBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsCisgICAgICAgIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywKKyAgICAgICAgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwKKyAgICAgICAgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwKKyAgICAgICAgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLAorICAgICAgICDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsCisgICAgICAgIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywKKyAgICAgICAgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EKKyAgICAgICAgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhCisgICAgICAgIE1lbGF5dSwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqgorICAgICAgICBOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsCisgICAgICAgIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILAorICAgICAgICBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywKKyAgICAgICAg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZQorICAgICAgICBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssCisgICAgICAgIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywKKyAgICAgICAgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywKKyAgICAgICAgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywKKyAgICAgICAgQsOibi1sw6JtLWfDuiwg57K16KqeIiIiCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgICAgICAgICBzMSA9IHMxLmVuY29kZSgndXRmOCcpCisgICAgICAgICAgICBzMiA9IHMyLmVuY29kZSgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZyhzMSksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczIpLCBzMikKIAotICBkZWYgdGVzdEJ5dGUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0Qnl0ZSg2MyksIDYzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCisgICAgZGVmIHRlc3RNdWx0aXBsZXhlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbGllbnQyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ3Rlc3RNdWx0aXBsZXhlZCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50Mi5zZWNvbmR0ZXN0U3RyaW5nKCdmb29iYXInKSwgJ3Rlc3RTdHJpbmcoImZvb2JhciIpJykKIAotICBkZWYgdGVzdEkzMihzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpLCAtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RJMzIoMCksIDApCisgICAgZGVmIHRlc3RCb29sKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJvb2wnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKFRydWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKEZhbHNlKSwgRmFsc2UpCiAKLSAgZGVmIHRlc3RJNjQoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KDEpLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpLCAtMzQzNTk3MzgzNjgpCisgICAgZGVmIHRlc3RCeXRlKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEJ5dGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCeXRlKDYzKSwgNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEJ5dGUoLTEyNyksIC0xMjcpCiAKLSAgZGVmIHRlc3REb3VibGUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC01LjIzNTA5ODIzNSksIC01LjIzNTA5ODIzNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpCisgICAgZGVmIHRlc3RJMzIoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0STMyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STMyKC0xKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEkzMigwKSwgMCkKIAotICBkZWYgdGVzdFN0cnVjdChzZWxmKToKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDEKLSAgICB4LmkzMl90aGluZyA9IC0zCi0gICAgeC5pNjRfdGhpbmcgPSAtNQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U3RydWN0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0STY0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdEk2NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdEk2NCgxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0STY0KC0zNDM1OTczODM2OCksIC0zNDM1OTczODM2OCkKIAotICBkZWYgdGVzdE5lc3Qoc2VsZik6Ci0gICAgaW5uZXIgPSBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSJaZXJvIiwgYnl0ZV90aGluZz0xLCBpMzJfdGhpbmc9LTMsCi0gICAgICBpNjRfdGhpbmc9LTUpCi0gICAgeCA9IFh0cnVjdDIoc3RydWN0X3RoaW5nPWlubmVyKQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TmVzdCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdERvdWJsZShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3REb3VibGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTUuMjM1MDk4MjM1KSwgLTUuMjM1MDk4MjM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdERvdWJsZSgtMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3REb3VibGUoLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KQogCi0gIGRlZiB0ZXN0TWFwKHNlbGYpOgotICAgIHggPSB7MDoxLCAxOjIsIDI6MywgMzo0LCAtMTotMn0KLSAgICB5ID0gc2VsZi5jbGllbnQudGVzdE1hcCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdEJpbmFyeShzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RCaW5hcnknKQorICAgICAgICB2YWwgPSBieXRlYXJyYXkoW2kgZm9yIGkgaW4gcmFuZ2UoMCwgMjU2KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZWFycmF5KHNlbGYuY2xpZW50LnRlc3RCaW5hcnkoYnl0ZXModmFsKSkpLCB2YWwpCiAKLSAgZGVmIHRlc3RTZXQoc2VsZik6Ci0gICAgeCA9IHNldChbOCwgMSwgNDJdKQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdFN0cnVjdCcpCisgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgorICAgICAgICB4LmJ5dGVfdGhpbmcgPSAxCisgICAgICAgIHguaTMyX3RoaW5nID0gLTMKKyAgICAgICAgeC5pNjRfdGhpbmcgPSAtNQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFN0cnVjdCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RMaXN0KHNlbGYpOgotICAgIHggPSBbMSwgNCwgOSwgLTQyXQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TGlzdCh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdE5lc3Qoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0TmVzdCcpCisgICAgICAgIGlubmVyID0gWHRydWN0KHN0cmluZ190aGluZz0iWmVybyIsIGJ5dGVfdGhpbmc9MSwgaTMyX3RoaW5nPS0zLCBpNjRfdGhpbmc9LTUpCisgICAgICAgIHggPSBYdHJ1Y3QyKHN0cnVjdF90aGluZz1pbm5lciwgYnl0ZV90aGluZz0wLCBpMzJfdGhpbmc9MCkKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3ROZXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEVudW0oc2VsZik6Ci0gICAgeCA9IE51bWJlcnouRklWRQotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0RW51bSh4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXAnKQorICAgICAgICB4ID0gezA6IDEsIDE6IDIsIDI6IDMsIDM6IDQsIC0xOiAtMn0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNYXAoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gIGRlZiB0ZXN0VHlwZWRlZihzZWxmKToKLSAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZiAjIDcgYnl0ZXMgb2YgMHhmZgotICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0VHlwZWRlZih4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICBkZWYgdGVzdFNldChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RTZXQnKQorICAgICAgICB4ID0gc2V0KFs4LCAxLCA0Ml0pCisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0U2V0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE1hcE1hcChzZWxmKToKLSAgICAjIGRvZXMgbm90IHdvcms6IGRpY3QoKSBpcyBub3QgYSBoYXNoYWJsZSB0eXBlLCBzbyBhIGRpY3QoKSBjYW5ub3QgYmUgdXNlZCBhcyBhIGtleSBpbiBhbm90aGVyIGRpY3QoKQotICAgICN4ID0geyB7MToxMCwgMjoyMH0sIHsxOjEwMCwgMjoyMDAsIDM6MzAwfSwgezE6MTAwMCwgMjoyMDAwLCAzOjMwMDAsIDQ6NDAwMH0gfQotICAgIHRyeToKLSAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwTWFwKCkKLSAgICBleGNlcHQ6Ci0gICAgICBwYXNzCisgICAgZGVmIHRlc3RMaXN0KHNlbGYpOgorICAgICAgICBwcmludCgndGVzdExpc3QnKQorICAgICAgICB4ID0gWzEsIDQsIDksIC00Ml0KKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RMaXN0KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdE11bHRpKHNlbGYpOgotICAgIHhwZWN0ZWQgPSBYdHJ1Y3QoYnl0ZV90aGluZz03NCwgaTMyX3RoaW5nPTB4ZmYwMGZmLCBpNjRfdGhpbmc9MHhmZmZmZmZmZmQwZDApCi0gICAgeSA9IHNlbGYuY2xpZW50LnRlc3RNdWx0aSh4cGVjdGVkLmJ5dGVfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pMzJfdGhpbmcsCi0gICAgICAgICAgeHBlY3RlZC5pNjRfdGhpbmcsCi0gICAgICAgICAgeyAwOidhYmMnIH0sCi0gICAgICAgICAgTnVtYmVyei5GSVZFLAotICAgICAgICAgIDB4ZjBmMGYwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeHBlY3RlZCkKKyAgICBkZWYgdGVzdEVudW0oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RW51bScpCisgICAgICAgIHggPSBOdW1iZXJ6LkZJVkUKKyAgICAgICAgeSA9IHNlbGYuY2xpZW50LnRlc3RFbnVtKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKIAotICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKLSAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKLSAgICB0cnk6Ci0gICAgICBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBYY2VwdGlvbiwgeDoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5lcnJvckNvZGUsIDEwMDEpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWVzc2FnZSwgJ1hjZXB0aW9uJykKLSAgICAgICMgVE9ETyBlbnN1cmUgc2FtZSBiZWhhdmlvciBmb3IgcmVwciB3aXRoaW4gZ2VuZXJhdGVkIHB5dGhvbiB2YXJpYW50cwotICAgICAgIyBlbnN1cmUgZXhjZXB0aW9uJ3MgcmVwciBtZXRob2Qgd29ya3MKLSAgICAgICN4X3JlcHIgPSByZXByKHgpCi0gICAgICAjc2VsZi5hc3NlcnRFcXVhbCh4X3JlcHIsICdYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1cJ1hjZXB0aW9uXCcpJykKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0VHlwZWRlZicpCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmICAjIDcgYnl0ZXMgb2YgMHhmZgorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdFR5cGVkZWYoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogCi0gICAgdHJ5OgotICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigidGhyb3dfdW5kZWNsYXJlZCIpCi0gICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHRocm93biBleGNlcHRpb24iKQotICAgIGV4Y2VwdCBFeGNlcHRpb246ICMgdHlwZSBpcyB1bmRlZmluZWQKLSAgICAgIHBhc3MKKyAgICBkZWYgdGVzdE1hcE1hcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RNYXBNYXAnKQorICAgICAgICB4ID0geworICAgICAgICAgICAgLTQ6IHstNDogLTQsIC0zOiAtMywgLTI6IC0yLCAtMTogLTF9LAorICAgICAgICAgICAgNDogezQ6IDQsIDM6IDMsIDI6IDIsIDE6IDF9LAorICAgICAgICB9CisgICAgICAgIHkgPSBzZWxmLmNsaWVudC50ZXN0TWFwTWFwKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCiAKLSAgZGVmIHRlc3RPbmV3YXkoc2VsZik6Ci0gICAgc3RhcnQgPSB0aW1lLnRpbWUoKQotICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0Ci0gICAgZW5kID0gdGltZS50aW1lKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW5kIC0gc3RhcnQgPCAzLAotICAgICAgICAgICAgICAgICAgICAib25ld2F5IHNsZWVwIHRvb2sgJWYgc2VjIiAlIChlbmQgLSBzdGFydCkpCi0gIAotICBkZWYgdGVzdE9uZXdheVRoZW5Ob3JtYWwoc2VsZik6Ci0gICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoJ1B5dGhvbicpLCAnUHl0aG9uJykKKyAgICBkZWYgdGVzdE11bHRpKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE11bHRpJykKKyAgICAgICAgeHBlY3RlZCA9IFh0cnVjdChzdHJpbmdfdGhpbmc9J0hlbGxvMicsIGJ5dGVfdGhpbmc9NzQsIGkzMl90aGluZz0weGZmMDBmZiwgaTY0X3RoaW5nPTB4ZmZmZmZmZmZkMGQwKQorICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE11bHRpKHhwZWN0ZWQuYnl0ZV90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGVjdGVkLmkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGVjdGVkLmk2NF90aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogJ2FiYyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcnouRklWRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYwZjBmMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4cGVjdGVkKQogCi1jbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0RXhjZXB0aW9uJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tZXNzYWdlLCAnWGNlcHRpb24nKQorICAgICAgICAgICAgIyBUT0RPIGVuc3VyZSBzYW1lIGJlaGF2aW9yIGZvciByZXByIHdpdGhpbiBnZW5lcmF0ZWQgcHl0aG9uIHZhcmlhbnRzCisgICAgICAgICAgICAjIGVuc3VyZSBleGNlcHRpb24ncyByZXByIG1ldGhvZCB3b3JrcworICAgICAgICAgICAgIyB4X3JlcHIgPSByZXByKHgpCisgICAgICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwoeF9yZXByLCAnWGNlcHRpb24oZXJyb3JDb2RlPTEwMDEsIG1lc3NhZ2U9XCdYY2VwdGlvblwnKScpCiAKLWNsYXNzIENvbXBhY3RUZXN0KEFic3RyYWN0VGVzdCk6Ci0gIHByb3RvY29sX2ZhY3RvcnkgPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIGdvdHRlbiBleGNlcHRpb24iKQorICAgICAgICBleGNlcHQgVEV4Y2VwdGlvbiBhcyB4OgorICAgICAgICAgICAgcGFzcwogCi1jbGFzcyBBY2NlbGVyYXRlZEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKLSAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoKQorICAgICAgICAjIFNob3VsZCBub3QgdGhyb3cKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignc3VjY2VzcycpCisKKyAgICBkZWYgdGVzdE11bHRpRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBwcmludCgndGVzdE11bHRpRXhjZXB0aW9uJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdYY2VwdGlvbicsICdpZ25vcmUnKQorICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMTAwMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgubWVzc2FnZSwgJ1RoaXMgaXMgYW4gWGNlcHRpb24nKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbignWGNlcHRpb24yJywgJ2lnbm9yZScpCisgICAgICAgIGV4Y2VwdCBYY2VwdGlvbjIgYXMgZXg6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmVycm9yQ29kZSwgMjAwMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXguc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgJ1RoaXMgaXMgYW4gWGNlcHRpb24yJykKKworICAgICAgICB5ID0gc2VsZi5jbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKCdzdWNjZXNzJywgJ2Zvb2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5zdHJpbmdfdGhpbmcsICdmb29iYXInKQorCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZik6CisgICAgICAgIHByaW50KCd0ZXN0T25ld2F5JykKKyAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmNsaWVudC50ZXN0T25ld2F5KDEpICAjIHR5cGUgaXMgaW50LCBub3QgZmxvYXQKKyAgICAgICAgZW5kID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVuZCAtIHN0YXJ0IDwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICJvbmV3YXkgc2xlZXAgdG9vayAlZiBzZWMiICUgKGVuZCAtIHN0YXJ0KSkKKworICAgIGRlZiB0ZXN0T25ld2F5VGhlbk5vcm1hbChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3Rlc3RPbmV3YXlUaGVuTm9ybWFsJykKKyAgICAgICAgc2VsZi5jbGllbnQudGVzdE9uZXdheSgxKSAgIyB0eXBlIGlzIGludCwgbm90IGZsb2F0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQorCisKK2NsYXNzIE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBBY2NlbGVyYXRlZENvbXBhY3RUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKworCitjbGFzcyBNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlRocmlmdFRlc3QiKQorCisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEpTT05UZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKK2NsYXNzIE11bHRpcGxleGVkSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJTZWNvbmRTZXJ2aWNlIikKKworCitjbGFzcyBIZWFkZXJUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKKyAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIGZhY3RvcnkgPSBUSGVhZGVyUHJvdG9jb2wuVEhlYWRlclByb3RvY29sRmFjdG9yeSgpCisgICAgICAgIHJldHVybiBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zcG9ydCkKKwogCiBkZWYgc3VpdGUoKToKLSAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogIyBsb29rIGZvciAtLXByb3RvIG9uIGNtZGxpbmUKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm9ybWFsQmluYXJ5VGVzdCkpCi0gIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnYWNjZWwnOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2NvbXBhY3QnOgotICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCi0gIGVsc2U6Ci0gICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvOiAlcycgJSBvcHRpb25zLnByb3RvKQotICByZXR1cm4gc3VpdGUKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgaWYgb3B0aW9ucy5wcm90byA9PSAnYmluYXJ5JzogICMgbG9vayBmb3IgLS1wcm90byBvbiBjbWRsaW5lCisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2FjY2VsJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbGMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdjb21wYWN0JzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2hlYWRlcic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShIZWFkZXJUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2pzb24nOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGknOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYSc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWFjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWonOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRKU09OVGVzdCkpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvY29sOiAlcycgJSBvcHRpb25zLnByb3RvKQorICAgIHJldHVybiBzdWl0ZQorCiAKIGNsYXNzIE93bkFyZ3NUZXN0UHJvZ3JhbSh1bml0dGVzdC5UZXN0UHJvZ3JhbSk6CiAgICAgZGVmIHBhcnNlQXJncyhzZWxmLCBhcmd2KToKICAgICAgICAgaWYgYXJnczoKICAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gYXJncwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSAoc2VsZi5kZWZhdWx0VGVzdCwpCisgICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChbc2VsZi5kZWZhdWx0VGVzdF0pCiAgICAgICAgIHNlbGYuY3JlYXRlVGVzdHMoKQogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIE93bkFyZ3NUZXN0UHJvZ3JhbShkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0xKSkKKyAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWxpYnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nbGlicHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2luY2x1ZGUgdGhpcyBkaXJlY3RvcnkgaW4gc3lzLnBhdGggZm9yIGxvY2F0aW5nIGxpYnJhcnkgY29kZScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjb25uZWN0IHRvIHNlcnZlciBhdCBwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1ob3N0IiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iaG9zdCIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iY29ubmVjdCB0byBzZXJ2ZXIiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc3NsIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0ic3NsIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ1c2UgU1NMIGZvciBlbmNyeXB0ZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1odHRwIiwgZGVzdD0iaHR0cF9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJVc2UgdGhlIEhUVFAgdHJhbnNwb3J0IHdpdGggdGhlIHNwZWNpZmllZCBwYXRoIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idmVyYm9zZSBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcScsICctLXF1aWV0JywgYWN0aW9uPSJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYWNjZWxjLCBiaW5hcnksIGNvbXBhY3QsIGhlYWRlciwganNvbiwgbXVsdGksIG11bHRpYSwgbXVsdGlhYywgbXVsdGljLCBtdWx0aWoiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXRyYW5zcG9ydCcsIGRlc3Q9InRyYW5zIiwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ0cmFuc3BvcnQgdG8gdXNlLCBvbmUgb2Y6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQorICAgIHBhcnNlci5zZXRfZGVmYXVsdHMoZnJhbWVkPUZhbHNlLCBodHRwX3BhdGg9Tm9uZSwgdmVyYm9zZT0xLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTkwOTAsIHByb3RvPSdiaW5hcnknKQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBpZiBvcHRpb25zLmdlbnB5ZGlyOgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKFNDUklQVF9ESVIsIG9wdGlvbnMuZ2VucHlkaXIpKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBsb2NhbF9saWJwYXRoKCkpCisKKyAgICBpZiBvcHRpb25zLmh0dHBfcGF0aDoKKyAgICAgICAgb3B0aW9ucy50cmFucyA9ICdodHRwJworCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBTZWNvbmRTZXJ2aWNlCisgICAgZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CisgICAgZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWHRydWN0LCBYdHJ1Y3QyLCBOdW1iZXJ6LCBYY2VwdGlvbiwgWGNlcHRpb24yCisgICAgZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBURXhjZXB0aW9uCisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUSHR0cENsaWVudAorICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVE11bHRpcGxleGVkUHJvdG9jb2wKKworICAgIE93bkFyZ3NUZXN0UHJvZ3JhbShkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0xKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdEVvZi5weSBiL3Rlc3QvcHkvVGVzdEVvZi5weQppbmRleCBhOWQ4MWYxLi4wYjRhODI5IDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RFb2YucHkKKysrIGIvdGVzdC9weS9UZXN0RW9mLnB5CkBAIC0xOSwxMTggKzE5LDExNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCitmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGltZQorCiAKIGNsYXNzIFRlc3RFb2YodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gIGRlZiBtYWtlX2RhdGEoc2VsZiwgcGZhY3Rvcnk9Tm9uZSk6Ci0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoKQotICAgIGlmIHBmYWN0b3J5OgotICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQotICAgIGVsc2U6Ci0gICAgICBwcm90ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFucykKKyAgICBkZWYgbWFrZV9kYXRhKHNlbGYsIHBmYWN0b3J5PU5vbmUpOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcigpCisgICAgICAgIGlmIHBmYWN0b3J5OgorICAgICAgICAgICAgcHJvdCA9IHBmYWN0b3J5LmdldFByb3RvY29sKHRyYW5zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvdCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnMpCiAKLSAgICB4ID0gWHRydWN0KCkKLSAgICB4LnN0cmluZ190aGluZyA9ICJaZXJvIgotICAgIHguYnl0ZV90aGluZyA9IDAKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIlplcm8iCisgICAgICAgIHguYnl0ZV90aGluZyA9IDAKIAotICAgIHgud3JpdGUocHJvdCkKKyAgICAgICAgeC53cml0ZShwcm90KQogCi0gICAgeCA9IFh0cnVjdCgpCi0gICAgeC5zdHJpbmdfdGhpbmcgPSAiT25lIgotICAgIHguYnl0ZV90aGluZyA9IDEKKyAgICAgICAgeCA9IFh0cnVjdCgpCisgICAgICAgIHguc3RyaW5nX3RoaW5nID0gIk9uZSIKKyAgICAgICAgeC5ieXRlX3RoaW5nID0gMQogCi0gICAgeC53cml0ZShwcm90KQorICAgICAgICB4LndyaXRlKHByb3QpCiAKLSAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQorICAgICAgICByZXR1cm4gdHJhbnMuZ2V0dmFsdWUoKQogCi0gIGRlZiB0ZXN0VHJhbnNwb3J0UmVhZEFsbChzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgcmVhZEFsbCBvbiBhbnkgdHlwZSBvZiB0cmFuc3BvcnQgdGhyb3dzIGFuIEVPRkVycm9yIiIiCi0gICAgdHJhbnMgPSBUVHJhbnNwb3J0LlRNZW1vcnlCdWZmZXIoc2VsZi5tYWtlX2RhdGEoKSkKLSAgICB0cmFucy5yZWFkQWxsKDEpCisgICAgZGVmIHRlc3RUcmFuc3BvcnRSZWFkQWxsKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgcmVhZEFsbCBvbiBhbnkgdHlwZSBvZiB0cmFuc3BvcnQgdGhyb3dzIGFuIEVPRkVycm9yIiIiCisgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKCkpCisgICAgICAgIHRyYW5zLnJlYWRBbGwoMSkKIAotICAgIHRyeToKLSAgICAgIHRyYW5zLnJlYWRBbGwoMTAwMDApCi0gICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyYW5zLnJlYWRBbGwoMTAwMDApCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgogCi0gICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gRU9GRXJyb3IiKQorICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIGdvdHRlbiBFT0ZFcnJvciIpCiAKLSAgZGVmIGVvZlRlc3RIZWxwZXIoc2VsZiwgcGZhY3RvcnkpOgotICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KSkKLSAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCisgICAgZGVmIGVvZlRlc3RIZWxwZXIoc2VsZiwgcGZhY3RvcnkpOgorICAgICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkpCisgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKIAotICAgIHggPSBYdHJ1Y3QoKQotICAgIHgucmVhZChwcm90KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJaZXJvIikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMCkKLQotICAgIHggPSBYdHJ1Y3QoKQotICAgIHgucmVhZChwcm90KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHJpbmdfdGhpbmcsICJPbmUiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ieXRlX3RoaW5nLCAxKQotCi0gICAgdHJ5OgotICAgICAgeCA9IFh0cnVjdCgpCi0gICAgICB4LnJlYWQocHJvdCkKLSAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICByZXR1cm4KLQotICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKLQotICBkZWYgZW9mVGVzdEhlbHBlclN0cmVzcyhzZWxmLCBwZmFjdG9yeSk6Ci0gICAgIiIiVGVlc3QgdGhlIGFiaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sIHRvIGRlYWwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBldmVyeSBieXRlIGluIHRoZSBmaWxlIiIiCi0gICAgIyBUT0RPOiB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoaXMgY292ZXJzIG1vcmUgb2YgdGhlIGNvZGUgcGF0aHMKLQotICAgIGRhdGEgPSBzZWxmLm1ha2VfZGF0YShwZmFjdG9yeSkKLSAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKGRhdGEpICsgMSk6Ci0gICAgICB0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihkYXRhWzA6aV0pCi0gICAgICBwcm90ID0gcGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnMpCi0gICAgICB0cnk6CiAgICAgICAgIHggPSBYdHJ1Y3QoKQogICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0cmluZ190aGluZywgIlplcm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYnl0ZV90aGluZywgMCkKKworICAgICAgICB4ID0gWHRydWN0KCkKICAgICAgICAgeC5yZWFkKHByb3QpCi0gICAgICAgIHgucmVhZChwcm90KQotICAgICAgZXhjZXB0IEVPRkVycm9yOgotICAgICAgICBjb250aW51ZQotICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gRU9GRXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyaW5nX3RoaW5nLCAiT25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmJ5dGVfdGhpbmcsIDEpCiAKLSAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEVvZihzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sIHRocm93cyBhbiBFT0ZFcnJvciB3aGVuIGl0IHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIiIiCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSBYdHJ1Y3QoKQorICAgICAgICAgICAgeC5yZWFkKHByb3QpCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgogCi0gIGRlZiB0ZXN0QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEVvZihzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKLSAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpKQotICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCkpCisgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgZ290dGVuIEVPRkVycm9yIikKIAotICBkZWYgdGVzdENvbXBhY3RQcm90b2NvbEVvZihzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgotICAgIHNlbGYuZW9mVGVzdEhlbHBlcihUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCi0gICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSkKKyAgICBkZWYgZW9mVGVzdEhlbHBlclN0cmVzcyhzZWxmLCBwZmFjdG9yeSk6CisgICAgICAgICIiIlRlc3QgdGhlIGFiaWxpdHkgb2YgVEJpbmFyeVByb3RvY29sIHRvIGRlYWwgd2l0aCB0aGUgcmVtb3ZhbCBvZiBldmVyeSBieXRlIGluIHRoZSBmaWxlIiIiCisgICAgICAgICMgVE9ETzogd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGlzIGNvdmVycyBtb3JlIG9mIHRoZSBjb2RlIHBhdGhzCisKKyAgICAgICAgZGF0YSA9IHNlbGYubWFrZV9kYXRhKHBmYWN0b3J5KQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSkgKyAxKToKKyAgICAgICAgICAgIHRyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKGRhdGFbMDppXSkKKyAgICAgICAgICAgIHByb3QgPSBwZmFjdG9yeS5nZXRQcm90b2NvbCh0cmFucykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gWHRydWN0KCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgICAgICB4LnJlYWQocHJvdCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSBnb3R0ZW4gYW4gRU9GRXJyb3IiKQorCisgICAgZGVmIHRlc3RCaW5hcnlQcm90b2NvbEVvZihzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IFRCaW5hcnlQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyU3RyZXNzKFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpCisKKyAgICBkZWYgdGVzdEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRCaW5hcnlFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKSkKKworICAgIGRlZiB0ZXN0Q29tcGFjdFByb3RvY29sRW9mKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgVENvbXBhY3RQcm90b2NvbCB0aHJvd3MgYW4gRU9GRXJyb3Igd2hlbiBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSIiIgorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXIoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorICAgICAgICBzZWxmLmVvZlRlc3RIZWxwZXJTdHJlc3MoVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpKQorCisgICAgZGVmIHRlc3RDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZENvbXBhY3RFb2Yoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBUQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWQgdGhyb3dzIGFuIEVPRkVycm9yIHdoZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0iIiIKKyAgICAgICAgc2VsZi5lb2ZUZXN0SGVscGVyKFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkpCisgICAgICAgIHNlbGYuZW9mVGVzdEhlbHBlclN0cmVzcyhUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpKQorCiAKIGRlZiBzdWl0ZSgpOgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQotICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCi0gIHJldHVybiBzdWl0ZQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCisgICAgcmV0dXJuIHN1aXRlCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RnJvemVuLnB5IGIvdGVzdC9weS9UZXN0RnJvemVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkMjU5NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5LCBXcmFwcGVyCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRGcm96ZW5EaWN0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdEZyb3plbkJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfcm91bmR0cmlwKHNlbGYsIHNyYywgZHN0KToKKyAgICAgICAgb3RyYW5zID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgb3B0b3JvID0gc2VsZi5wcm90b2NvbChvdHJhbnMpCisgICAgICAgIHNyYy53cml0ZShvcHRvcm8pCisgICAgICAgIGl0cmFucyA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihvdHJhbnMuZ2V0dmFsdWUoKSkKKyAgICAgICAgaXByb3RvID0gc2VsZi5wcm90b2NvbChpdHJhbnMpCisgICAgICAgIHJldHVybiBkc3QucmVhZChpcHJvdG8pIG9yIGRzdAorCisgICAgZGVmIHRlc3RfZGljdF9pc19oYXNoYWJsZV9vbmx5X2FmdGVyX2Zyb3plbihzZWxmKToKKyAgICAgICAgZDAgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoZDAsIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSkKKyAgICAgICAgZDEgPSBURnJvemVuRGljdChkMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZDEsIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF93aXRoX2NvbGxlY3Rpb25fZmllbGRzKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zZXQoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhbm5vdGF0ZWQgc2V0IGZpZWxkIGNhbiBiZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQiIiIKKyAgICAgICAgeCA9IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3Qoc2V0X2J5dGVfbWFwPXsKKyAgICAgICAgICAgIGZyb3plbnNldChbNDIsIDEwMCwgLTEwMF0pOiA5OSwKKyAgICAgICAgICAgIGZyb3plbnNldChbMF0pOiAxMDAsCisgICAgICAgICAgICBmcm96ZW5zZXQoW10pOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbNDIsIDEwMCwgLTEwMF0pXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuc2V0X2J5dGVfbWFwW2Zyb3plbnNldChbMF0pXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLnNldF9ieXRlX21hcFtmcm96ZW5zZXQoW10pXSwgMCkKKworICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGFubm90YXRlZCBtYXAgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChtYXBfYnl0ZV9tYXA9eworICAgICAgICAgICAgVEZyb3plbkRpY3QoezQyOiA0MiwgMTAwOiAtMTAwfSk6IDk5LAorICAgICAgICAgICAgVEZyb3plbkRpY3QoezA6IDB9KTogMTAwLAorICAgICAgICAgICAgVEZyb3plbkRpY3Qoe30pOiAwLAorICAgICAgICB9KQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHs0MjogNDIsIDEwMDogLTEwMH0pXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHswOiAwfSldLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubWFwX2J5dGVfbWFwW1RGcm96ZW5EaWN0KHt9KV0sIDApCisKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIGxpc3QgZmllbGQgY2FuIGJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCIiIgorICAgICAgICB4ID0gQ29tcGFjdFByb3RvVGVzdFN0cnVjdChsaXN0X2J5dGVfbWFwPXsKKyAgICAgICAgICAgICg0MiwgMTAwLCAtMTAwKTogOTksCisgICAgICAgICAgICAoMCwpOiAxMDAsCisgICAgICAgICAgICAoKTogMCwKKyAgICAgICAgfSkKKyAgICAgICAgeDIgPSBzZWxmLl9yb3VuZHRyaXAoeCwgQ29tcGFjdFByb3RvVGVzdFN0cnVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKDQyLCAxMDAsIC0xMDApXSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIubGlzdF9ieXRlX21hcFsoMCwpXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmxpc3RfYnl0ZV9tYXBbKCldLCAwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RydWN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIGVtcHR5IHN0cnVjdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBDb21wYWN0UHJvdG9UZXN0U3RydWN0KGVtcHR5X3N0cnVjdF9maWVsZD1FbXB0eSgpKQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBDb21wYWN0UHJvdG9UZXN0U3RydWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIuZW1wdHlfc3RydWN0X2ZpZWxkLCBFbXB0eSgpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYW5ub3RhdGVkIHN0cnVjdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIiIiCisgICAgICAgIHggPSBXcmFwcGVyKGZvbz1FbXB0eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCBFbXB0eSgpKQorICAgICAgICB4MiA9IHNlbGYuX3JvdW5kdHJpcCh4LCBXcmFwcGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLmZvbywgRW1wdHkoKSkKKworCitjbGFzcyBUZXN0RnJvemVuKFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFucykKKworCitjbGFzcyBUZXN0RnJvemVuQWNjZWxlcmF0ZWRCaW5hcnkoVGVzdEZyb3plbkJhc2UpOgorICAgIGRlZiBwcm90b2NvbChzZWxmLCB0cmFucyk6CisgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFucykKKworCitjbGFzcyBUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KFRlc3RGcm96ZW5CYXNlKToKKyAgICBkZWYgcHJvdG9jb2woc2VsZiwgdHJhbnMpOgorICAgICAgICByZXR1cm4gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFucykKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RGcm96ZW4pKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRCaW5hcnkpKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weSBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTAzZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weQpAQCAtMCwwICsxLDE3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIERvdWJsZUNvbnN0YW50c1Rlc3QgaW1wb3J0IGNvbnN0YW50cworCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9IFwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBkb3VibGUgY29uc3RhbnQgZ2VuZXJhdGVkIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID1cCisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyA9ICJ0aGUgcmVuZGVyZWQgdmFyaWFibGUgd2l0aCBuYW1lICVzIGlzIG5vdCBvZiBkb3VibGUgdHlwZSIKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDgKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9saXN0KHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfTElTVCA9IFsxLjAsIC0xMDAuMCwgMTAwLjAsIDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgMy4xNDE1OTI2NTM1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMC4xLCAtMTAwMDAwMC4xLCAxLjdlKzMwOCwgLTEuN2UrMzA4LCA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QpLCBsZW4oRVhQRUNURURfRE9VQkxFX0xJU1QpKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWRWYWx1ZSBpbiBlbnVtZXJhdGUoRVhQRUNURURfRE9VQkxFX0xJU1QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVFtpXSwgZXhwZWN0ZWRWYWx1ZSwgcGxhY2VzPTcpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weSBiL3Rlc3QvcHkvVGVzdFNlcnZlci5weQppbmRleCA2ZjRhZjQ0Li5hYmEwZDQyIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CkBAIC0xOSwyMDcgKzE5LDMyNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KLWltcG9ydCBzeXMsIGdsb2IsIHRpbWUKLXN5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIuKicpWzBdKQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgogCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0PSdnZW4tcHknLAotICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGxvY2FsIGRpcmVjdG9yeSBpbiBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcG9ydCIsIHR5cGU9ImludCIsIGRlc3Q9InBvcnQiLAotICAgIGhlbHA9InBvcnQgbnVtYmVyIGZvciBzZXJ2ZXIgdG8gbGlzdGVuIG9uIikKLXBhcnNlci5hZGRfb3B0aW9uKCItLXpsaWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ6bGliIiwKLSAgICBoZWxwPSJ1c2UgemxpYiB3cmFwcGVyIGZvciBjb21wcmVzc2VkIHRyYW5zcG9ydCIpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAotICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQotcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKLSAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0ic3RvcmVfY29uc3QiLCAKLSAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKLSAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCi1wYXJzZXIuYWRkX29wdGlvbignLS1wcm90bycsICBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCi0gICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBiaW5hcnksIGNvbXBhY3QiKQotcGFyc2VyLnNldF9kZWZhdWx0cyhwb3J0PTkwOTAsIHZlcmJvc2U9MSwgcHJvdG89J2JpbmFyeScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorZnJvbSB1dGlsIGltcG9ydCBsb2NhbF9saWJwYXRoCiAKLXN5cy5wYXRoLmluc2VydCgwLCBvcHRpb25zLmdlbnB5ZGlyKQorU0NSSVBUX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQogCi1mcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKLWZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0ICoKLWZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAotZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0Ci1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0Ci1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbAotZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCiAKLVBST1RfRkFDVE9SSUVTID0geydiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSwKLSAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5LAotICAgICdjb21wYWN0JzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeX0KK2NsYXNzIFRlc3RIYW5kbGVyKG9iamVjdCk6CisgICAgZGVmIHRlc3RWb2lkKHNlbGYpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0Vm9pZCgpJykKIAotY2xhc3MgVGVzdEhhbmRsZXI6CisgICAgZGVmIHRlc3RTdHJpbmcoc2VsZiwgc3RyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdFN0cmluZyglcyknICUgc3RyKQorICAgICAgICByZXR1cm4gc3RyCiAKLSAgZGVmIHRlc3RWb2lkKHNlbGYpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdFZvaWQoKScKKyAgICBkZWYgdGVzdEJvb2woc2VsZiwgYm9vbGVhbik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RCb29sKCVzKScgJSBzdHIoYm9vbGVhbikubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIGJvb2xlYW4KIAotICBkZWYgdGVzdFN0cmluZyhzZWxmLCBzdHIpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdFN0cmluZyglcyknICUgc3RyCi0gICAgcmV0dXJuIHN0cgorICAgIGRlZiB0ZXN0Qnl0ZShzZWxmLCBieXRlKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEJ5dGUoJWQpJyAlIGJ5dGUpCisgICAgICAgIHJldHVybiBieXRlCiAKLSAgZGVmIHRlc3RCeXRlKHNlbGYsIGJ5dGUpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdEJ5dGUoJWQpJyAlIGJ5dGUKLSAgICByZXR1cm4gYnl0ZQorICAgIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJMTYoJWQpJyAlIGkxNikKKyAgICAgICAgcmV0dXJuIGkxNgogCi0gIGRlZiB0ZXN0STE2KHNlbGYsIGkxNik6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0STE2KCVkKScgJSBpMTYKLSAgICByZXR1cm4gaTE2CisgICAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdEkzMiglZCknICUgaTMyKQorICAgICAgICByZXR1cm4gaTMyCiAKLSAgZGVmIHRlc3RJMzIoc2VsZiwgaTMyKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RJMzIoJWQpJyAlIGkzMgotICAgIHJldHVybiBpMzIKKyAgICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0STY0KCVkKScgJSBpNjQpCisgICAgICAgIHJldHVybiBpNjQKIAotICBkZWYgdGVzdEk2NChzZWxmLCBpNjQpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdEk2NCglZCknICUgaTY0Ci0gICAgcmV0dXJuIGk2NAorICAgIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3REb3VibGUoJWYpJyAlIGR1YikKKyAgICAgICAgcmV0dXJuIGR1YgogCi0gIGRlZiB0ZXN0RG91YmxlKHNlbGYsIGR1Yik6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0RG91YmxlKCVmKScgJSBkdWIKLSAgICByZXR1cm4gZHViCisgICAgZGVmIHRlc3RCaW5hcnkoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0QmluYXJ5KCknKSAgIyBUT0RPOiBoZXggb3V0cHV0CisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0U3RydWN0KHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RTdHJ1Y3QoeyVzLCAlZCwgJWQsICVkfSknICUgKHRoaW5nLnN0cmluZ190aGluZywgdGhpbmcuYnl0ZV90aGluZywgdGhpbmcuaTMyX3RoaW5nLCB0aGluZy5pNjRfdGhpbmcpCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RTdHJ1Y3Qoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U3RydWN0KHslcywgJXMsICVzLCAlc30pJyAlICh0aGluZy5zdHJpbmdfdGhpbmcsIHRoaW5nLmJ5dGVfdGhpbmcsIHRoaW5nLmkzMl90aGluZywgdGhpbmcuaTY0X3RoaW5nKSkKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgc3RyKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RFeGNlcHRpb24oJXMpJyAlIHN0cgotICAgIGlmIHN0ciA9PSAnWGNlcHRpb24nOgotICAgICAgeCA9IFhjZXB0aW9uKCkKLSAgICAgIHguZXJyb3JDb2RlID0gMTAwMQotICAgICAgeC5tZXNzYWdlID0gc3RyCi0gICAgICByYWlzZSB4Ci0gICAgZWxpZiBzdHIgPT0gInRocm93X3VuZGVjbGFyZWQiOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXhjZXB0aW9uIHRlc3QgUEFTU0VTLiIpCisgICAgZGVmIHRlc3RFeGNlcHRpb24oc2VsZiwgYXJnKToKKyAgICAgICAgIyBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RFeGNlcHRpb24oJXMpJyAlIGFyZykKKyAgICAgICAgaWYgYXJnID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT1hcmcpCisgICAgICAgIGVsaWYgYXJnID09ICdURXhjZXB0aW9uJzoKKyAgICAgICAgICAgIHJhaXNlIFRFeGNlcHRpb24obWVzc2FnZT0nVGhpcyBpcyBhIFRFeGNlcHRpb24nKQogCi0gIGRlZiB0ZXN0T25ld2F5KHNlbGYsIHNlY29uZHMpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE9uZXdheSglZCkgPT4gc2xlZXBpbmcuLi4nICUgc2Vjb25kcwotICAgIHRpbWUuc2xlZXAoc2Vjb25kcyAvIDMpICMgYmUgcXVpY2sKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ2RvbmUgc2xlZXBpbmcnCisgICAgZGVmIHRlc3RNdWx0aUV4Y2VwdGlvbihzZWxmLCBhcmcwLCBhcmcxKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcyknICUgKGFyZzAsIGFyZzEpKQorICAgICAgICBpZiBhcmcwID09ICdYY2VwdGlvbic6CisgICAgICAgICAgICByYWlzZSBYY2VwdGlvbihlcnJvckNvZGU9MTAwMSwgbWVzc2FnZT0nVGhpcyBpcyBhbiBYY2VwdGlvbicpCisgICAgICAgIGVsaWYgYXJnMCA9PSAnWGNlcHRpb24yJzoKKyAgICAgICAgICAgIHJhaXNlIFhjZXB0aW9uMigKKyAgICAgICAgICAgICAgICBlcnJvckNvZGU9MjAwMiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc9WHRydWN0KHN0cmluZ190aGluZz0nVGhpcyBpcyBhbiBYY2VwdGlvbjInKSkKKyAgICAgICAgcmV0dXJuIFh0cnVjdChzdHJpbmdfdGhpbmc9YXJnMSkKIAotICBkZWYgdGVzdE5lc3Qoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE5lc3QoJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RPbmV3YXkoJWQpID0+IHNsZWVwaW5nLi4uJyAlIHNlY29uZHMpCisgICAgICAgIHRpbWUuc2xlZXAoc2Vjb25kcyAvIDMpICAjIGJlIHF1aWNrCisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ2RvbmUgc2xlZXBpbmcnKQogCi0gIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RNYXAoJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE5lc3QoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdFNldChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0U2V0KCVzKScgJSB0aGluZwotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TWFwKHNlbGYsIHRoaW5nKToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE1hcCglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0TGlzdCglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdFN0cmluZ01hcChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RTdHJpbmdNYXAoJXMpJyAlIHRoaW5nKQorICAgICAgICByZXR1cm4gdGhpbmcKIAotICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdEVudW0oJXMpJyAlIHRoaW5nCi0gICAgcmV0dXJuIHRoaW5nCisgICAgZGVmIHRlc3RTZXQoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0U2V0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RUeXBlZGVmKHNlbGYsIHRoaW5nKToKLSAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgotICAgICAgcHJpbnQgJ3Rlc3RUeXBlZGVmKCVzKScgJSB0aGluZwotICAgIHJldHVybiB0aGluZworICAgIGRlZiB0ZXN0TGlzdChzZWxmLCB0aGluZyk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RMaXN0KCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHRoaW5nCiAKLSAgZGVmIHRlc3RNYXBNYXAoc2VsZiwgdGhpbmcpOgotICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6Ci0gICAgICBwcmludCAndGVzdE1hcE1hcCglcyknICUgdGhpbmcKLSAgICByZXR1cm4gdGhpbmcKKyAgICBkZWYgdGVzdEVudW0oc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0RW51bSglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0gIGRlZiB0ZXN0TXVsdGkoc2VsZiwgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk6Ci0gICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKLSAgICAgIHByaW50ICd0ZXN0TXVsdGkoJXMpJyAlIFthcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1XQotICAgIHggPSBYdHJ1Y3QoYnl0ZV90aGluZz1hcmcwLCBpMzJfdGhpbmc9YXJnMSwgaTY0X3RoaW5nPWFyZzIpCi0gICAgcmV0dXJuIHgKKyAgICBkZWYgdGVzdFR5cGVkZWYoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0VHlwZWRlZiglcyknICUgdGhpbmcpCisgICAgICAgIHJldHVybiB0aGluZwogCi0jIHNldCB1cCB0aGUgcHJvdG9jb2wgZmFjdG9yeSBmb3JtIHRoZSAtLXByb3RvIG9wdGlvbgotcGZhY3RvcnlfY2xzID0gUFJPVF9GQUNUT1JJRVMuZ2V0KG9wdGlvbnMucHJvdG8sIE5vbmUpCi1pZiBwZmFjdG9yeV9jbHMgaXMgTm9uZToKLSAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gLS1wcm90byBvcHRpb246ICVzJyAlIG9wdGlvbnMucHJvdG8pCi1wZmFjdG9yeSA9IHBmYWN0b3J5X2NscygpCisgICAgZGVmIHRlc3RNYXBNYXAoc2VsZiwgdGhpbmcpOgorICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCd0ZXN0TWFwTWFwKCVzKScgJSB0aGluZykKKyAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgIC00OiB7CisgICAgICAgICAgICAgICAgLTQ6IC00LAorICAgICAgICAgICAgICAgIC0zOiAtMywKKyAgICAgICAgICAgICAgICAtMjogLTIsCisgICAgICAgICAgICAgICAgLTE6IC0xLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIDQ6IHsKKyAgICAgICAgICAgICAgICA0OiA0LAorICAgICAgICAgICAgICAgIDM6IDMsCisgICAgICAgICAgICAgICAgMjogMiwKKyAgICAgICAgICAgICAgICAxOiAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfQogCi0jIGdldCB0aGUgc2VydmVyIHR5cGUgKFRTaW1wbGVTZXJ2ZXIsIFROb25ibG9ja2luZ1NlcnZlciwgZXRjLi4uKQotaWYgbGVuKGFyZ3MpID4gMToKLSAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ09ubHkgb25lIHNlcnZlciB0eXBlIG1heSBiZSBzcGVjaWZpZWQsIG5vdCBtdWx0aXBsZSB0eXBlcy4nKQotc2VydmVyX3R5cGUgPSBhcmdzWzBdCisgICAgZGVmIHRlc3RJbnNhbml0eShzZWxmLCBhcmd1bWVudCk6CisgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDE6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ3Rlc3RJbnNhbml0eSglcyknICUgYXJndW1lbnQpCisgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAxOiB7CisgICAgICAgICAgICAgICAgMjogYXJndW1lbnQsCisgICAgICAgICAgICAgICAgMzogYXJndW1lbnQsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgMjogezY6IEluc2FuaXR5KCl9LAorICAgICAgICB9CiAKLSMgU2V0IHVwIHRoZSBoYW5kbGVyIGFuZCBwcm9jZXNzb3Igb2JqZWN0cwotaGFuZGxlciA9IFRlc3RIYW5kbGVyKCkKLXByb2Nlc3NvciA9IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgZGVmIHRlc3RNdWx0aShzZWxmLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KToKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMToKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygndGVzdE11bHRpKCVzKScgJSBbYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNV0pCisgICAgICAgIHJldHVybiBYdHJ1Y3Qoc3RyaW5nX3RoaW5nPSdIZWxsbzInLAorICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc9YXJnMCwgaTMyX3RoaW5nPWFyZzEsIGk2NF90aGluZz1hcmcyKQogCi0jIEhhbmRsZSBUSHR0cFNlcnZlciBhcyBhIHNwZWNpYWwgY2FzZQotaWYgc2VydmVyX3R5cGUgPT0gJ1RIdHRwU2VydmVyJzoKLSAgc2VydmVyID1USHR0cFNlcnZlci5USHR0cFNlcnZlcihwcm9jZXNzb3IsICgnJywgb3B0aW9ucy5wb3J0KSwgcGZhY3RvcnkpCi0gIHNlcnZlci5zZXJ2ZSgpCi0gIHN5cy5leGl0KDApCiAKLSMgc2V0IHVwIHNlcnZlciB0cmFuc3BvcnQgYW5kIHRyYW5zcG9ydCBmYWN0b3J5Ci1ob3N0ID0gTm9uZQotaWYgb3B0aW9ucy5zc2w6Ci0gIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldAotICB0cmFuc3BvcnQgPSBUU1NMU29ja2V0LlRTU0xTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0LCBjZXJ0ZmlsZT0ndGVzdF9jZXJ0LnBlbScpCi1lbHNlOgotICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0KQotdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotCi0jIGlmIC0temxpYiwgdGhlbiB3cmFwIHNlcnZlciB0cmFuc3BvcnQsIGFuZCB1c2UgYSBkaWZmZXJlbnQgdHJhbnNwb3J0IGZhY3RvcnkKLWlmIG9wdGlvbnMuemxpYjoKLSAgdHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQodHJhbnNwb3J0KSAjIHdyYXAgIHdpdGggemxpYgotICB0ZmFjdG9yeSA9IFRabGliVHJhbnNwb3J0LlRabGliVHJhbnNwb3J0RmFjdG9yeSgpCi0KLSMgZG8gc2VydmVyLXNwZWNpZmljIHNldHVwIGhlcmU6Ci1pZiBzZXJ2ZXJfdHlwZSA9PSAiVE5vbmJsb2NraW5nU2VydmVyIjoKLSAgc2VydmVyID0gVE5vbmJsb2NraW5nU2VydmVyLlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3Rvcnk9cGZhY3RvcnkpCi1lbGlmIHNlcnZlcl90eXBlID09ICJUUHJvY2Vzc1Bvb2xTZXJ2ZXIiOgotICBpbXBvcnQgc2lnbmFsCi0gIGZyb20gdGhyaWZ0LnNlcnZlciBpbXBvcnQgVFByb2Nlc3NQb29sU2VydmVyCi0gIHNlcnZlciA9IFRQcm9jZXNzUG9vbFNlcnZlci5UUHJvY2Vzc1Bvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKLSAgc2VydmVyLnNldE51bVdvcmtlcnMoNSkKLSAgZGVmIHNldF9hbGFybSgpOgotICAgIGRlZiBjbGVhbl9zaHV0ZG93bihzaWdudW0sIGZyYW1lKToKLSAgICAgIGZvciB3b3JrZXIgaW4gc2VydmVyLndvcmtlcnM6Ci0gICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6Ci0gICAgICAgICAgcHJpbnQgJ1Rlcm1pbmF0aW5nIHdvcmtlcjogJXMnICUgd29ya2VyCi0gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKQotICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID4gMDoKLSAgICAgICAgcHJpbnQgJ1JlcXVlc3Rpbmcgc2VydmVyIHRvIHN0b3AoKScKLSAgICAgIHRyeToKLSAgICAgICAgc2VydmVyLnN0b3AoKQotICAgICAgZXhjZXB0OgorZGVmIG1haW4ob3B0aW9ucyk6CisgICAgIyBzZXQgdXAgdGhlIHByb3RvY29sIGZhY3RvcnkgZm9ybSB0aGUgLS1wcm90b2NvbCBvcHRpb24KKyAgICBwcm90X2ZhY3RvcmllcyA9IHsKKyAgICAgICAgJ2FjY2VsJzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpLAorICAgICAgICAnYWNjZWxjJzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgJ2hlYWRlcic6IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KGFsbG93ZWRfY2xpZW50X3R5cGVzPVsKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUywKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCwKKyAgICAgICAgXSksCisgICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLAorICAgIH0KKyAgICBwZmFjdG9yeSA9IHByb3RfZmFjdG9yaWVzLmdldChvcHRpb25zLnByb3RvLCBOb25lKQorICAgIGlmIHBmYWN0b3J5IGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tcHJvdG9jb2wgb3B0aW9uOiAlcycgJSBvcHRpb25zLnByb3RvKQorICAgIHRyeToKKyAgICAgICAgcGZhY3Rvcnkuc3RyaW5nX2xlbmd0aF9saW1pdCA9IG9wdGlvbnMuc3RyaW5nX2xpbWl0CisgICAgICAgIHBmYWN0b3J5LmNvbnRhaW5lcl9sZW5ndGhfbGltaXQgPSBvcHRpb25zLmNvbnRhaW5lcl9saW1pdAorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICMgSWdub3JlIGVycm9ycyBmb3IgdGhvc2UgcHJvdG9jb2xzIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBsZW5ndGggbGltaXQKICAgICAgICAgcGFzcwotICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGNsZWFuX3NodXRkb3duKQotICAgIHNpZ25hbC5hbGFybSgyKQotICBzZXRfYWxhcm0oKQotZWxzZToKLSAgIyBsb29rIHVwIHNlcnZlciBjbGFzcyBkeW5hbWljYWxseSB0byBpbnN0YW50aWF0ZSBzZXJ2ZXIKLSAgU2VydmVyQ2xhc3MgPSBnZXRhdHRyKFRTZXJ2ZXIsIHNlcnZlcl90eXBlKQotICBzZXJ2ZXIgPSBTZXJ2ZXJDbGFzcyhwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQotIyBlbnRlciBzZXJ2ZXIgbWFpbiBsb29wCi1zZXJ2ZXIuc2VydmUoKQorCisgICAgIyBnZXQgdGhlIHNlcnZlciB0eXBlIChUU2ltcGxlU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGV0Yy4uLikKKyAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignT25seSBvbmUgc2VydmVyIHR5cGUgbWF5IGJlIHNwZWNpZmllZCwgbm90IG11bHRpcGxlIHR5cGVzLicpCisgICAgc2VydmVyX3R5cGUgPSBhcmdzWzBdCisgICAgaWYgb3B0aW9ucy50cmFucyA9PSAnaHR0cCc6CisgICAgICAgIHNlcnZlcl90eXBlID0gJ1RIdHRwU2VydmVyJworCisgICAgIyBTZXQgdXAgdGhlIGhhbmRsZXIgYW5kIHByb2Nlc3NvciBvYmplY3RzCisgICAgaGFuZGxlciA9IFRlc3RIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBUaHJpZnRUZXN0LlByb2Nlc3NvcihoYW5kbGVyKQorCisgICAgZ2xvYmFsIHNlcnZlcgorCisgICAgIyBIYW5kbGUgVEh0dHBTZXJ2ZXIgYXMgYSBzcGVjaWFsIGNhc2UKKyAgICBpZiBzZXJ2ZXJfdHlwZSA9PSAnVEh0dHBTZXJ2ZXInOgorICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJzZXJ2ZXIuY3J0IikKKyAgICAgICAgICAgIF9fa2V5ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5rZXkiKQorICAgICAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5LCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5KQorICAgICAgICBzZXJ2ZXIuc2VydmUoKQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgIyBzZXQgdXAgc2VydmVyIHRyYW5zcG9ydCBhbmQgdHJhbnNwb3J0IGZhY3RvcnkKKworICAgIGFic19rZXlfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICdrZXlzJywgJ3NlcnZlci5wZW0nKQorCisgICAgaG9zdCA9IE5vbmUKKyAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU1NMU29ja2V0CisgICAgICAgIHRyYW5zcG9ydCA9IFRTU0xTb2NrZXQuVFNTTFNlcnZlclNvY2tldChob3N0LCBvcHRpb25zLnBvcnQsIGNlcnRmaWxlPWFic19rZXlfcGF0aCkKKyAgICBlbHNlOgorICAgICAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdCwgb3B0aW9ucy5wb3J0KQorICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBpZiBvcHRpb25zLnRyYW5zID09ICdidWZmZXJlZCc6CisgICAgICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkKKyAgICBlbGlmIG9wdGlvbnMudHJhbnMgPT0gJ2ZyYW1lZCc6CisgICAgICAgIHRmYWN0b3J5ID0gVFRyYW5zcG9ydC5URnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgZWxpZiBvcHRpb25zLnRyYW5zID09ICcnOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignVW5rbm93biAtLXRyYW5zcG9ydCBvcHRpb246ICVzJyAlIG9wdGlvbnMudHJhbnMpCisgICAgZWxzZToKKyAgICAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgICMgaWYgLS16bGliLCB0aGVuIHdyYXAgc2VydmVyIHRyYW5zcG9ydCwgYW5kIHVzZSBhIGRpZmZlcmVudCB0cmFuc3BvcnQgZmFjdG9yeQorICAgIGlmIG9wdGlvbnMuemxpYjoKKyAgICAgICAgdHJhbnNwb3J0ID0gVFpsaWJUcmFuc3BvcnQuVFpsaWJUcmFuc3BvcnQodHJhbnNwb3J0KSAgIyB3cmFwICB3aXRoIHpsaWIKKyAgICAgICAgdGZhY3RvcnkgPSBUWmxpYlRyYW5zcG9ydC5UWmxpYlRyYW5zcG9ydEZhY3RvcnkoKQorCisgICAgIyBkbyBzZXJ2ZXItc3BlY2lmaWMgc2V0dXAgaGVyZToKKyAgICBpZiBzZXJ2ZXJfdHlwZSA9PSAiVE5vbmJsb2NraW5nU2VydmVyIjoKKyAgICAgICAgc2VydmVyID0gVE5vbmJsb2NraW5nU2VydmVyLlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3Rvcnk9cGZhY3RvcnkpCisgICAgZWxpZiBzZXJ2ZXJfdHlwZSA9PSAiVFByb2Nlc3NQb29sU2VydmVyIjoKKyAgICAgICAgaW1wb3J0IHNpZ25hbAorICAgICAgICBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRQcm9jZXNzUG9vbFNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSBUUHJvY2Vzc1Bvb2xTZXJ2ZXIuVFByb2Nlc3NQb29sU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgICAgIHNlcnZlci5zZXROdW1Xb3JrZXJzKDUpCisKKyAgICAgICAgZGVmIHNldF9hbGFybSgpOgorICAgICAgICAgICAgZGVmIGNsZWFuX3NodXRkb3duKHNpZ251bSwgZnJhbWUpOgorICAgICAgICAgICAgICAgIGZvciB3b3JrZXIgaW4gc2VydmVyLndvcmtlcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbnMudmVyYm9zZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ1Rlcm1pbmF0aW5nIHdvcmtlcjogJXMnICUgd29ya2VyKQorICAgICAgICAgICAgICAgICAgICB3b3JrZXIudGVybWluYXRlKCkKKyAgICAgICAgICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2UgPiAwOgorICAgICAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oJ1JlcXVlc3Rpbmcgc2VydmVyIHRvIHN0b3AoKScpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgY2xlYW5fc2h1dGRvd24pCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oNCkKKyAgICAgICAgc2V0X2FsYXJtKCkKKyAgICBlbHNlOgorICAgICAgICAjIGxvb2sgdXAgc2VydmVyIGNsYXNzIGR5bmFtaWNhbGx5IHRvIGluc3RhbnRpYXRlIHNlcnZlcgorICAgICAgICBTZXJ2ZXJDbGFzcyA9IGdldGF0dHIoVFNlcnZlciwgc2VydmVyX3R5cGUpCisgICAgICAgIHNlcnZlciA9IFNlcnZlckNsYXNzKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgIyBlbnRlciBzZXJ2ZXIgbWFpbiBsb29wCisgICAgc2VydmVyLnNlcnZlKCkKKworCitkZWYgZXhpdF9ncmFjZWZ1bGx5KHNpZ251bSwgZnJhbWUpOgorICAgIHByaW50KCJTSUdJTlQgcmVjZWl2ZWRcbiIpCisgICAgc2VydmVyLnNodXRkb3duKCkgICAjIGRvZXNuJ3Qgd29yayBwcm9wZXJseSwgeWV0CisgICAgc3lzLmV4aXQoMCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgZXhpdF9ncmFjZWZ1bGx5KQorCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1saWJweWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2xpYnB5ZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpbmNsdWRlIHRoaXMgZGlyZWN0b3J5IHRvIHN5cy5wYXRoIGZvciBsb2NhdGluZyBsaWJyYXJ5IGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWdlbnB5ZGlyJywgdHlwZT0nc3RyaW5nJywgZGVzdD0nZ2VucHlkaXInLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2dlbi1weScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSB0byBzeXMucGF0aCBmb3IgbG9jYXRpbmcgZ2VuZXJhdGVkIGNvZGUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLXBvcnQiLCB0eXBlPSJpbnQiLCBkZXN0PSJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwb3J0IG51bWJlciBmb3Igc2VydmVyIHRvIGxpc3RlbiBvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0temxpYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InpsaWIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSB6bGliIHdyYXBwZXIgZm9yIGNvbXByZXNzZWQgdHJhbnNwb3J0IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1zc2wiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJzc2wiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InVzZSBTU0wgZm9yIGVuY3J5cHRlZCB0cmFuc3BvcnQiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ2ZXJib3NlIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249InN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJtaW5pbWFsIG91dHB1dCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tcHJvdG9jb2wnLCBkZXN0PSJwcm90byIsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwganNvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tY29udGFpbmVyLWxpbWl0JywgZGVzdD0nY29udGFpbmVyX2xpbWl0JywgdHlwZT0naW50JywgZGVmYXVsdD1Ob25lKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXN0cmluZy1saW1pdCcsIGRlc3Q9J3N0cmluZ19saW1pdCcsIHR5cGU9J2ludCcsIGRlZmF1bHQ9Tm9uZSkKKyAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHBvcnQ9OTA5MCwgdmVyYm9zZT0xLCBwcm90bz0nYmluYXJ5JywgdHJhbnNwb3J0PSdidWZmZXJlZCcpCisgICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgICMgUHJpbnQgVFNlcnZlciBsb2cgdG8gc3Rkb3V0IHNvIHRoYXQgdGhlIHRlc3QtcnVubmVyIGNhbiByZWRpcmVjdCBpdCB0byBsb2cgZmlsZXMKKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPW9wdGlvbnMudmVyYm9zZSkKKworICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgb3B0aW9ucy5nZW5weWRpcikpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxvY2FsX2xpYnBhdGgoKSkKKworICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAorICAgIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdCwgWGNlcHRpb24sIFhjZXB0aW9uMiwgSW5zYW5pdHkKKyAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIZWFkZXJUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0CisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbAorICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCisgICAgZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCisKKyAgICBzeXMuZXhpdChtYWluKG9wdGlvbnMpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0U29ja2V0LnB5IGIvdGVzdC9weS9UZXN0U29ja2V0LnB5CmluZGV4IGI5YmRmMjcuLjYxOWViMTAgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdFNvY2tldC5weQorKysgYi90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKQEAgLTE5LDI5ICsxOSwxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQotZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0Ci1mcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCAqCi1mcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAotZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdGltZQogaW1wb3J0IHNvY2tldAogaW1wb3J0IHJhbmRvbQotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKIAogY2xhc3MgVGltZW91dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgZm9yIGkgaW4geHJhbmdlKDUwKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTApOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICMgZmluZCBhIHBvcnQgd2UgY2FuIHVzZQogICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuX3NvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCkBAIC00OSw3ICszNiw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jay5iaW5kKCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KSkKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmxpc3Rlbig1KQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIGlmIGkgPT0gNDk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAKQEAgLTU4LDEyICs0NSwxMiBAQAogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGxlYWt5ID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKICAgICAgICAgICAgICAgICBzb2NrZXQgPSBUU29ja2V0LlRTb2NrZXQoJ2xvY2FsaG9zdCcsIHNlbGYucG9ydCkKICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCgxMCkKICAgICAgICAgICAgICAgICBzb2NrZXQub3BlbigpCiAgICAgICAgICAgICAgICAgbGVha3kuYXBwZW5kKHNvY2tldCkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCiAgICAgZGVmIHRlc3RXcml0ZVRpbWVvdXQoc2VsZik6CkBAIC03NSwxNSArNjIsMTcgQEAKICAgICAgICAgICAgIHNvY2tldC5vcGVuKCkKICAgICAgICAgICAgIGxzb2NrID0gc2VsZi5saXN0ZW5fc29jay5hY2NlcHQoKQogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBzb2NrZXQud3JpdGUoImhpIiAqIDEwMCkKKyAgICAgICAgICAgICAgICBsc29jay53cml0ZSgiaGkiICogMTAwKQogCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lLnRpbWUoKSAtIHN0YXJ0dGltZSA8IDUuMCkKIAotc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQotbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCiAKLXN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUaW1lb3V0VGVzdCkpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKIAotdGVzdFJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKQotdGVzdFJ1bm5lci5ydW4oc3VpdGUpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRpbWVvdXRUZXN0KSkKKworICAgIHRlc3RSdW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikKKyAgICB0ZXN0UnVubmVyLnJ1bihzdWl0ZSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFN5bnRheC5weSBiL3Rlc3QvcHkvVGVzdFN5bnRheC5weQppbmRleCA5ZjcxY2Y1Li5kYmU3OTc1IDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTeW50YXgucHkKKysrIGIvdGVzdC9weS9UZXN0U3ludGF4LnB5CkBAIC0xOSwxNSArMTksNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHN5cywgZ2xvYgotZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCi1wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tZ2VucHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdnZW5weWRpcicsIGRlZmF1bHQ9J2dlbi1weScpCi1vcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQotZGVsIHN5cy5hcmd2WzE6XSAjIGNsZWFuIHVwIGhhY2sgc28gdW5pdHRlc3QgZG9lc24ndCBjb21wbGFpbgotc3lzLnBhdGguaW5zZXJ0KDAsIG9wdGlvbnMuZ2VucHlkaXIpCi1zeXMucGF0aC5pbnNlcnQoMCwgZ2xvYi5nbG9iKCcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKVswXSkKLQogIyBKdXN0IGltcG9ydCB0aGVzZSBnZW5lcmF0ZWQgZmlsZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHN5bnRhY3RpY2FsbHkgdmFsaWQKLWZyb20gRGVidWdQcm90b1Rlc3QgaW1wb3J0IEVtcHR5U2VydmljZQotZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgSW5oZXJpdGVkCitmcm9tIERlYnVnUHJvdG9UZXN0IGltcG9ydCBFbXB0eVNlcnZpY2UgICMgbm9xYQorZnJvbSBEZWJ1Z1Byb3RvVGVzdCBpbXBvcnQgSW5oZXJpdGVkICAjIG5vcWEKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2ggYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS9ydW50ZXN0LnNoCmluZGV4IDJlNWE0ZjEuLjZkNzM0NjIgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvZXhwbGljaXRfbW9kdWxlL3J1bnRlc3Quc2gKKysrIGIvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvcnVudGVzdC5zaApAQCAtMjIsNiArMjIsNyBAQAogcm0gLXJmIGdlbi1weQogLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBweSB0ZXN0MS50aHJpZnQgfHwgZXhpdCAxCiAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHB5IHRlc3QyLnRocmlmdCB8fCBleGl0IDEKKy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcHkgdGVzdDMudGhyaWZ0ICYmIGV4aXQgMSAgIyBGYWlsIHNpbmNlIHRlc3QzLnRocmlmdCBoYXMgcHl0aG9uIGtleXdvcmRzCiBQWVRIT05QQVRIPS4vZ2VuLXB5IHB5dGhvbiAtYyAnaW1wb3J0IGZvby5iYXIuYmF6JyB8fCBleGl0IDEKIFBZVEhPTlBBVEg9Li9nZW4tcHkgcHl0aG9uIC1jICdpbXBvcnQgdGVzdDInIHx8IGV4aXQgMQogUFlUSE9OUEFUSD0uL2dlbi1weSBweXRob24gLWMgJ2ltcG9ydCB0ZXN0MScgJj4vZGV2L251bGwgJiYgZXhpdCAxICAjIFNob3VsZCBmYWlsLgpkaWZmIC0tZ2l0IGEvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvdGVzdDMudGhyaWZ0IGIvdGVzdC9weS9leHBsaWNpdF9tb2R1bGUvdGVzdDMudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDc4NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L2V4cGxpY2l0X21vZHVsZS90ZXN0My50aHJpZnQKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgcHkgdmFsaWRhdGlvbnMKKworc3RydWN0IGZyb20geworICAxOiBpMzIgZGVmOworfQorCmRpZmYgLS1naXQgYS90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQxNGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpAQCAtMCwwICsxLDM2IEBACittYWNybyhHRU5FUkFURSBGSUxFTkFNRSBHRU5FUkFUT1IgT1VUUFVURElSKQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7TVlfQ1VSUkVOVF9CSU5BUllfRElSfS8ke09VVFBVVERJUn0pCisgIGV4ZWN1dGVfcHJvY2VzcyhDT01NQU5EICR7VEhSSUZUQ09NUElMRVJ9IC0tZ2VuICR7R0VORVJBVE9SfSAtb3V0ICR7TVlfQ1VSUkVOVF9CSU5BUllfRElSfS8ke09VVFBVVERJUn0gJHtGSUxFTkFNRX0KKyAgICAgICAgICAgICAgICAgIFJFU1VMVF9WQVJJQUJMRSBDTURfUkVTVUxUKQorICBpZihDTURfUkVTVUxUKQorICAgICAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJFcnJvciBnZW5lcmF0aW5nICR7RklMRU5BTUV9IHdpdGggZ2VuZXJhdG9yICR7R0VORVJBVE9SfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKEdFTkVSQVRFKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5IGdlbi1weS1kZWZhdWx0KQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQorCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6c2xvdHMgZ2VuLXB5LXNsb3RzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5Om9sZF9zdHlsZSBnZW4tcHktb2xkc3R5bGUpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9SZWN1cnNpdmUudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyxzbG90cyBnZW4tcHktZHluYW1pY3Nsb3RzKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9zZXR1cC5jZmcgYi90ZXN0L3B5L3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGExZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS9zZXR1cC5jZmcKQEAgLTAsMCArMSwyIEBACitbZmxha2U4XQorbWF4LWxpbmUtbGVuZ3RoID0gMTAwCmRpZmYgLS1naXQgYS90ZXN0L3B5L3Rlc3RfY2VydC5wZW0gYi90ZXN0L3B5L3Rlc3RfY2VydC5wZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWE1MWYuLjAwMDAwMDAKLS0tIGEvdGVzdC9weS90ZXN0X2NlcnQucGVtCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlCK3pDQ0FXUUNDUUR5cSsrbzdLMHJwVEFOQmdrcWhraUc5dzBCQVFVRkFEQkNNUXN3Q1FZRFZRUUdFd0pWCi1VekVWTUJNR0ExVUVCd3dNUkdWbVlYVnNkQ0JEYVhSNU1Sd3dHZ1lEVlFRS0RCTkVaV1poZFd4MElFTnZiWEJoCi1ibmtnVEhSa01CNFhEVEV4TURNeE5qRXpNVFExTlZvWERUSXhNRE14TXpFek1UUTFOVm93UWpFTE1Ba0dBMVVFCi1CaE1DVlZNeEZUQVRCZ05WQkFjTURFUmxabUYxYkhRZ1EybDBlVEVjTUJvR0ExVUVDZ3dUUkdWbVlYVnNkQ0JECi1iMjF3WVc1NUlFeDBaRENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBOWxtQ3VWUVJxUkJSCi1PWVZIK0ZNQ2hTb0Y4SWpNd2ZycG5DNjVKOVJSODhkVUlaYmpDMmIrSlBUNXFpVVZRZnQyTnpQUHdpQm5YSTJzCi1qNkFtSFlWS29XR0IyNGhOWDhiajJjanR4ZFBwVDJydmZBbElLMHBhdDFDK2tDeGdSSElnKytTN282R0VKT2t3Ci1PUWlvcHNVcm9Bc0liU1JUL0lyZC9BMCtLZVNxUTBzQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFVRkFBT0JnUURmCi1Xc2VFaDYvM2dXbC9HNDRNeWpsakJ2Z1JBYTBjK2VxRkwvY1ZsN1pmaDAzL0tPWE1sUFY1L3NuVlVZQk9KQ0NJCi1xUHVRd1dUb1QrUTM2a05ReU1uRzRlNGdoK0Rtc2lJaGdRZ0EzbFZTTkRoUFBmUnJHMXZEZWVYWHR5YnBFb2tlCi1mSTZvOWE5b2x6cktXTnZXKy84UDl4SURsUDBTUlp4TDY2NDY0TEFRbnc9PQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQotTUlJQ1h3SUJBQUtCZ1FEMldZSzVWQkdwRUZFNWhVZjRVd0tGS2dYd2lNekIrdW1jTHJrbjFGSHp4MVFobHVNTAotWnY0azlQbXFKUlZCKzNZM004L0NJR2RjamF5UG9DWWRoVXFoWVlIYmlFMWZ4dVBaeU8zRjArbFBhdTk4Q1VncgotU2xxM1VMNlFMR0JFY2lENzVMdWpvWVFrNlRBNUNLaW14U3VnQ3dodEpGUDhpdDM4RFQ0cDVLcERTd0lEQVFBQgotQW9HQkFNY25BN1E1VDNHaWZGZUk5TzYraExvTWgvSzFWUHE0a21TdHJRZVM4SkdvSWM1cHdiQzFHVjNkSVh5NAotTCtCQW5vZnYvZFFOQ0NKZGNoUkdQcW44MkovYU9BL3NNc0pKNlZ6VFNyOU5OVmw5bGdRSGRMakVEb1oxNXl4VAotdlZTYzRuRzJ4QnM3dVovMjRmTi9TSlpWRk8zK0VkcGhPdnJwN3VFWExpWGxxdm9wQWtFQS9oN1hHbHJVTEJJTgotZWtqQXpFSkVjaGxaYjR4SmRQckgzUDRMWnM5MlpsY084OEdGcjV3Zk96MXl0YWZMaVpBOUV6WXdMSVFUUGRzawotSEh5bkplWld0d0pCQVBncjlQWVVKT2RraFVlV1ZTTjJQeXF2V0tyZFFWS3ZNMVZ3TmdSRmFTUFhnQmQwV0dJTgotRXltMWI3d3Q2bmd3TnRmTHg5RlVPUjZubDdNa2xzRkxCQTBDUVFEblNpaWJxeW5MeHM2UGl5STNodVVIT0gxSAotWXRjRTZxLzRPeDBqZ1JZUmhaRnRXS2tWc2JKWFY5Rk05eUR3M3VCSDJSMDFseXh3TTBHRjBBck9HdnkzQWtFQQotN2VFY2poL2krOVd6bDFuM1ErV2RTS29KQU1iU1RaSllUMFllME50RG03SitPbjB3RnRSWGtQdzBIUm1hRFJpUwotQ1NsdzRDcXVFYjh0UHU4TWZqME1wUUpCQUt3VExTZEhzeTB2eFFRSlhtMGxUSStDazlLSlVNOXZKekZ1Q0wveAotRzZmbXNxRXR0eGpoeUxuemUraUlJUkF1L0lWK0E1VXJXbkkxaDcyOHkvd1Jlanc9Ci0tLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvdGVzdC9weS90ZXN0X2NlcnQucmVhZG1lIGIvdGVzdC9weS90ZXN0X2NlcnQucmVhZG1lCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGJiYmM5Li4wMDAwMDAwCi0tLSBhL3Rlc3QvcHkvdGVzdF9jZXJ0LnJlYWRtZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTk9URToKLVRoZSB0ZXN0X2NlcnQucGVtIGZpbGUgaW4gdGhpcyBkaXJlY3RvcnkgbXVzdCBuZXZlciBiZSB1c2VkIG9uIHByb2R1Y3Rpb24gc3lzdGVtcy4KLQotVGhlIGtleSBpdCByZXByZXNlbnRzIGlzIGEgc2VsZi1zaWduZWQga2V5IGludGVuZGVkIG9ubHkgZm9yIHVzZSBieSB0aGUgdW5pdAotdGVzdGluZyBmcmFtZXdvcmsuICBJdCBpcyBhIHB1YmxpY2x5IGV4cG9zZWQgcHJpdmF0ZSBrZXkuCi0KLURvIG5vdCB1c2UgdGVzdF9jZXJ0LnBlbSBpbiBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy4KZGlmZiAtLWdpdCBhL3Rlc3QvcHkvdXRpbC5weSBiL3Rlc3QvcHkvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmIzZjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9weS91dGlsLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK19TQ1JJUFRfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCitfUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9TQ1JJUFRfRElSKSkKKworCitkZWYgbG9jYWxfbGlicGF0aCgpOgorICAgIGdsb2JkaXIgPSBvcy5wYXRoLmpvaW4oX1JPT1RfRElSLCAnbGliJywgJ3B5JywgJ2J1aWxkJywgJ2xpYi4qJykKKyAgICBmb3IgbGlicGF0aCBpbiBnbG9iLmdsb2IoZ2xvYmRpcik6CisgICAgICAgIGlmIGxpYnBhdGguZW5kc3dpdGgoJy0lZC4lZCcgJSAoc3lzLnZlcnNpb25faW5mb1swXSwgc3lzLnZlcnNpb25faW5mb1sxXSkpOgorICAgICAgICAgICAgcmV0dXJuIGxpYnBhdGgKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvR2VtZmlsZSBiL3Rlc3QvcmIvR2VtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYwNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9HZW1maWxlCkBAIC0wLDAgKzEsNyBAQAorc291cmNlICJodHRwOi8vcnVieWdlbXMub3JnIgorCityZXF1aXJlICJydWJ5Z2VtcyIKKworZ2VtICdyYWNrJywgJ34+IDIuMCcsICc+PSAyLjAuNCcKK2dlbSAndGhpbicsICd+PiAxLjcnLCAnPj0gMS43LjInCitnZW0gJ3Rlc3QtdW5pdCcsICd+PiAzLjInLCAnPj0gMy4yLjcnCmRpZmYgLS1naXQgYS90ZXN0L3JiL01ha2VmaWxlLmFtIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQppbmRleCA1OGIxMWYyLi5jZmRjMTQ5IDEwMDY0NAotLS0gYS90ZXN0L3JiL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDEyICsxNywxNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3Bfc3JjZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLXN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CitzdHViczogJChUSFJJRlQpIC4uL1RocmlmdFRlc3QudGhyaWZ0IC4uL1NtYWxsVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcmIgLi4vU21hbGxUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiByYiAuLi9SZWN1cnNpdmUudGhyaWZ0CisKK3ByZWNyb3NzOiBzdHVicwogCiBjaGVjazogc3R1YnMKLQkkKFJVQlkpIC1JLiB0ZXN0X3N1aXRlLnJiCitpZiBIQVZFX0JVTkRMRVIKKwkkKEJVTkRMRVIpIGluc3RhbGwKKwkkKEJVTkRMRVIpIGV4ZWMgJChSVUJZKSAtSS4gdGVzdF9zdWl0ZS5yYgorZW5kaWYKIApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYiBiL3Rlc3QvcmIvY29yZS90cmFuc3BvcnQvdGVzdF90cmFuc3BvcnQucmIKaW5kZXggNTI3NTVjMS4uMzdhZmE4NSAxMDA2NDQKLS0tIGEvdGVzdC9yYi9jb3JlL3RyYW5zcG9ydC90ZXN0X3RyYW5zcG9ydC5yYgorKysgYi90ZXN0L3JiL2NvcmUvdHJhbnNwb3J0L3Rlc3RfdHJhbnNwb3J0LnJiCkBAIC01MSw3ICs1MSw3IEBACiAgIAogICAjIFRPRE86CiAgICMgVGhpcyBkb2Vzbid0IG5lY2Vzc2FyaWx5IHRlc3QgaGUgcmlnaHQgdGhpbmcuCi0gICMgSXQgX2xvb2tzXyBsaWtlIHJlYWQgaXNuJ3QgZ3VhcmVudGVlZCB0byByZXR1cm4gdGhlIGxlbmd0aAorICAjIEl0IF9sb29rc18gbGlrZSByZWFkIGlzbid0IGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGgKICAgIyB5b3UgYXNrIGZvciBhbmQgcmVhZF9hbGwgaXMuIFRoaXMgbWVhbnMgb3VyIHRlc3QgbmVlZHMgdG8gY2hlY2sKICAgIyBmb3IgYmxvY2tpbmcuIC0tIEtldmluIENsYXJrIDMvMjcvMDgKICAgZGVmIHRlc3RfcmVhZF9hbGwKZGlmZiAtLWdpdCBhL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYiBiL3Rlc3QvcmIvZ2VuZXJhdGlvbi90ZXN0X3JlY3Vyc2l2ZS5yYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTEyZjcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiCkBAIC0wLDAgKzEsNDEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlIEZpbGUuam9pbihGaWxlLmRpcm5hbWUoX19GSUxFX18pLCAnLi4vdGVzdF9oZWxwZXInKQorcmVxdWlyZSAncmVjdXJzaXZlX3R5cGVzJworCitjbGFzcyBUZXN0UmVjdXJzaXZlR2VuZXJhdGlvbiA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCisgIENISUxEX0lURU0gPSAiY2hpbGQgaXRlbSIKKyAgUEFSRU5UX0lURU0gPSAicGFyZW50IGl0ZW0iCisKKyAgZGVmIHRlc3RfY2FuX2NyZWF0ZV9yZWN1cnNpdmVfdHJlZQorCisgICAgY2hpbGRfdHJlZSA9IFJlY1RyZWUubmV3CisgICAgY2hpbGRfdHJlZS5pdGVtID0gQ0hJTERfSVRFTQorCisgICAgcGFyZW50X3RyZWUgPSBSZWNUcmVlLm5ldworICAgIHBhcmVudF90cmVlLml0ZW0gPSBQQVJFTlRfSVRFTQorICAgIHBhcmVudF90cmVlLmNoaWxkcmVuID0gW2NoaWxkX3RyZWVdCisKKyAgICBhc3NlcnRfZXF1YWwoUEFSRU5UX0lURU0sIHBhcmVudF90cmVlLml0ZW0pCisgICAgYXNzZXJ0X2VxdWFsKDEsIHBhcmVudF90cmVlLmNoaWxkcmVuLmxlbmd0aCkKKyAgICBhc3NlcnRfZXF1YWwoQ0hJTERfSVRFTSwgcGFyZW50X3RyZWUuY2hpbGRyZW4uZmlyc3QuaXRlbSkKKyAgICBhc3NlcnRfbmlsKHBhcmVudF90cmVlLmNoaWxkcmVuLmZpcnN0LmNoaWxkcmVuKQorICBlbmQKK2VuZApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIGIvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzOWFjYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKQEAgLTAsMCArMSwzODEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKyMgZW5jb2Rpbmc6IHV0Zi04CisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCiskOi5wdXNoIEZpbGUuZGlybmFtZShfX0ZJTEVfXykgKyAnLy4uJworCityZXF1aXJlICd0ZXN0X2hlbHBlcicKK3JlcXVpcmUgJ3RocmlmdCcKK3JlcXVpcmUgJ3RocmlmdF90ZXN0JworCiskZG9tYWluX3NvY2tldCA9IG5pbAorJGhvc3QgPSAibG9jYWxob3N0IgorJHBvcnQgPSA5MDkwCiskcHJvdG9jb2xUeXBlID0gImJpbmFyeSIKKyRzc2wgPSBmYWxzZQorJHRyYW5zcG9ydCA9ICJidWZmZXJlZCIKKworQVJHVi5lYWNoIGRvfGF8CisgIGlmIGEgPT0gIi0taGVscCIKKyAgICBwdXRzICJBbGxvd2VkIG9wdGlvbnM6IgorICAgIHB1dHMgIlx0IC1oIFsgLS1oZWxwIF0gXHQgcHJvZHVjZSBoZWxwIG1lc3NhZ2UiCisgICAgcHV0cyAiXHQtLWRvbWFpbi1zb2NrZXQgYXJnICg9KSBcdCBVbml4IGRvbWFpbiBzb2NrZXQgcGF0aCIKKyAgICBwdXRzICJcdC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpIFx0IEhvc3QgdG8gY29ubmVjdCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKKyAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgJGRvbWFpbl9zb2NrZXQgPSBhLnNwbGl0KCI9IilbMV0KKyAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1ob3N0IikKKyAgICAkaG9zdCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhLnN0YXJ0X3dpdGg/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+IHsKKyAgICAgICAgaW5mbyEoIihzZWNvbmQpdGVzdFN0cmluZyh7fSkiLCAmdGhpbmcpOworICAgICAgICBsZXQgcmV0ID0gZm9ybWF0ISgidGVzdFN0cmluZyhcInt9XCIpIiwgJnRoaW5nKTsKKyAgICAgICAgT2socmV0KQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2xpYi5ycyBiL3Rlc3QvcnMvc3JjL2xpYi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzliZjkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCittb2QgdGhyaWZ0X3Rlc3Q7CitwdWIgdXNlIHRocmlmdF90ZXN0OjoqOwpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0LnB5IGIvdGVzdC90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY1OTI1NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3QucHkKQEAgLTAsMCArMSwxOTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIEFwYWNoZSBUaHJpZnQgLSBpbnRlZ3JhdGlvbiAoY3Jvc3MpIHRlc3Qgc3VpdGUKKyMKKyMgdGVzdHMgZGlmZmVyZW50IHNlcnZlci1jbGllbnQsIHByb3RvY29sIGFuZCB0cmFuc3BvcnQgY29tYmluYXRpb25zCisjCisjIFRoaXMgc2NyaXB0IHJlcXVpcmVzIHB5dGhvbiAzLnggZHVlIHRvIHRoZSBpbXByb3ZlbWVudHMgaW4KKyMgc3VicHJvY2VzcyBtYW5hZ2VtZW50IHRoYXQgYXJlIG5lZWRlZCBmb3IgcmVsaWFiaWxpdHkuCisjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgoraW1wb3J0IGpzb24KK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitpbXBvcnQgY3Jvc3NydW5uZXIKK2Zyb20gY3Jvc3NydW5uZXIuY29tcGF0IGltcG9ydCBwYXRoX2pvaW4KKworIyAzLjMgaW50cm9kdWNlZCBzdWJwcm9jZXNzIHRpbWVvdXRzIG9uIHdhaXRpbmcgZm9yIGNoaWxkCityZXFfdmVyc2lvbiA9ICgzLCAzKQorY3VyX3ZlcnNpb24gPSBzeXMudmVyc2lvbl9pbmZvCithc3NlcnQgKGN1cl92ZXJzaW9uID49IHJlcV92ZXJzaW9uKSwgIlB5dGhvbiAzLjMgb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciBvcGVyYXRpb24uIgorCisKK1JPT1RfRElSID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkpCitURVNUX0RJUl9SRUxBVElWRSA9ICd0ZXN0JworVEVTVF9ESVIgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIFRFU1RfRElSX1JFTEFUSVZFKQorRkVBVFVSRV9ESVJfUkVMQVRJVkUgPSBwYXRoX2pvaW4oVEVTVF9ESVJfUkVMQVRJVkUsICdmZWF0dXJlcycpCitDT05GSUdfRklMRSA9ICd0ZXN0cy5qc29uJworCisKK2RlZiBydW5fY3Jvc3NfdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMsIG9ubHlfa25vd25fZmFpbHVyZXMsIHJldHJ5X2NvdW50LCByZWdleCk6CisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGluZyB0ZXN0cycpCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihURVNUX0RJUiwgQ09ORklHX0ZJTEUpLCAncicpIGFzIGZwOgorICAgICAgICBqID0ganNvbi5sb2FkKGZwKQorICAgIHRlc3RzID0gY3Jvc3NydW5uZXIuY29sbGVjdF9jcm9zc190ZXN0cyhqLCBzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgcmVnZXgpCisgICAgaWYgbm90IHRlc3RzOgorICAgICAgICBwcmludCgnTm8gdGVzdCBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGNyaXRlcmlhJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgnICBzZXJ2ZXJzOiAlcycgJSBzZXJ2ZXJfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgY2xpZW50czogJXMnICUgY2xpZW50X21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG9ubHlfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnT25seSBydW5uaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKFRFU1RfRElSKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBpbiBrbm93biwgdGVzdHMpKQorICAgIGlmIHNraXBfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoVEVTVF9ESVIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIG5vdCBpbiBrbm93biwgdGVzdHMpKQorCisgICAgZGlzcGF0Y2hlciA9IGNyb3NzcnVubmVyLlRlc3REaXNwYXRjaGVyKFRFU1RfRElSLCBST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUsIGpvYnMpCisgICAgbG9nZ2VyLmRlYnVnKCdFeGVjdXRpbmcgJWQgdGVzdHMnICUgbGVuKHRlc3RzKSkKKyAgICB0cnk6CisgICAgICAgIGZvciByIGluIFtkaXNwYXRjaGVyLmRpc3BhdGNoKHRlc3QsIHJldHJ5X2NvdW50KSBmb3IgdGVzdCBpbiB0ZXN0c106CisgICAgICAgICAgICByLndhaXQoKQorICAgICAgICBsb2dnZXIuZGVidWcoJ1dhaXRpbmcgZm9yIGNvbXBsZXRpb24nKQorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlci53YWl0KCkKKyAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdJbnRlcnJ1cHRlZCwgc2h1dHRpbmcgZG93bicpCisgICAgICAgIGRpc3BhdGNoZXIudGVybWluYXRlKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJ1bl9mZWF0dXJlX3Rlc3RzKHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcywgb25seV9rbm93bl9mYWlsdXJlcywgcmV0cnlfY291bnQsIHJlZ2V4KToKKyAgICBiYXNlZGlyID0gcGF0aF9qb2luKFJPT1RfRElSLCBGRUFUVVJFX0RJUl9SRUxBVElWRSkKKyAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgbG9nZ2VyLmRlYnVnKCdDb2xsZWN0aW5nIHRlc3RzJykKKyAgICB3aXRoIG9wZW4ocGF0aF9qb2luKFRFU1RfRElSLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGogPSBqc29uLmxvYWQoZnApCisgICAgd2l0aCBvcGVuKHBhdGhfam9pbihiYXNlZGlyLCBDT05GSUdfRklMRSksICdyJykgYXMgZnA6CisgICAgICAgIGoyID0ganNvbi5sb2FkKGZwKQorICAgIHRlc3RzID0gY3Jvc3NydW5uZXIuY29sbGVjdF9mZWF0dXJlX3Rlc3RzKGosIGoyLCBzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIHJlZ2V4KQorICAgIGlmIG5vdCB0ZXN0czoKKyAgICAgICAgcHJpbnQoJ05vIHRlc3QgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBjcml0ZXJpYScsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJyAgc2VydmVyczogJXMnICUgc2VydmVyX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCcgIGZlYXR1cmVzOiAlcycgJSBmZWF0dXJlX21hdGNoLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG9ubHlfa25vd25fZmFpbHVyZXM6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnT25seSBydW5uaW5nIGtub3duIGZhaWx1cmVzJykKKyAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIGluIGtub3duLCB0ZXN0cykpCisgICAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBrbm93biBmYWlsdXJlcycpCisgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhiYXNlZGlyKQorICAgICAgICB0ZXN0cyA9IGxpc3QoZmlsdGVyKGxhbWJkYSB0OiBjcm9zc3J1bm5lci50ZXN0X25hbWUoKip0KSBub3QgaW4ga25vd24sIHRlc3RzKSkKKworICAgIGRpc3BhdGNoZXIgPSBjcm9zc3J1bm5lci5UZXN0RGlzcGF0Y2hlcihURVNUX0RJUiwgUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFLCBqb2JzKQorICAgIGxvZ2dlci5kZWJ1ZygnRXhlY3V0aW5nICVkIHRlc3RzJyAlIGxlbih0ZXN0cykpCisgICAgdHJ5OgorICAgICAgICBmb3IgciBpbiBbZGlzcGF0Y2hlci5kaXNwYXRjaCh0ZXN0LCByZXRyeV9jb3VudCkgZm9yIHRlc3QgaW4gdGVzdHNdOgorICAgICAgICAgICAgci53YWl0KCkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGZvciBjb21wbGV0aW9uJykKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIud2FpdCgpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgIGxvZ2dlci5kZWJ1ZygnSW50ZXJydXB0ZWQsIHNodXR0aW5nIGRvd24nKQorICAgICAgICBkaXNwYXRjaGVyLnRlcm1pbmF0ZSgpCisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2RlZiBkZWZhdWx0X2NvbmN1cnJlbnR5KCk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gaW50KG9zLmVudmlyb24uZ2V0KCdUSFJJRlRfQ1JPU1NURVNUX0NPTkNVUlJFTkNZJykpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAjIFNpbmNlIG11Y2ggdGltZSBpcyBzcGVudCBzbGVlcGluZywgdXNlIG1hbnkgdGhyZWFkcworICAgICAgICByZXR1cm4gaW50KG11bHRpcHJvY2Vzc2luZy5jcHVfY291bnQoKSAqIDEuMjUpICsgMQorCisKK2RlZiBtYWluKGFyZ3YpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlcnZlcicsIGRlZmF1bHQ9JycsIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2Ygc2VydmVycyB0byB0ZXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNsaWVudCcsIGRlZmF1bHQ9JycsIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2xpc3Qgb2YgY2xpZW50cyB0byB0ZXN0JykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctRicsICctLWZlYXR1cmVzJywgbmFyZ3M9JyonLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gc2VydmVyIGZlYXR1cmUgdGVzdHMgaW5zdGVhZCBvZiBjcm9zcyBsYW5ndWFnZSB0ZXN0cycpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLVInLCAnLS1yZWdleCcsIGhlbHA9J3Rlc3QgbmFtZSBwYXR0ZXJuIHRvIHJ1bicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCAnLS1vbmx5LWtub3duX2ZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nb25seV9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdvbmx5IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1za2lwLWtub3duLWZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nc2tpcF9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkbyBub3QgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcicsICctLXJldHJ5LWNvdW50JywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTAsIGhlbHA9J21heGltdW0gcmV0cnkgb24gZmFpbHVyZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWonLCAnLS1qb2JzJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHRfY29uY3VycmVudHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J251bWJlciBvZiBjb25jdXJyZW50IHRlc3QgZXhlY3V0aW9ucycpCisKKyAgICBnID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCh0aXRsZT0nQWR2YW5jZWQnKQorICAgIGcuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J3N0b3JlX2NvbnN0JywKKyAgICAgICAgICAgICAgICAgICBkZXN0PSdsb2dfbGV2ZWwnLCBjb25zdD1sb2dnaW5nLkRFQlVHLCBkZWZhdWx0PWxvZ2dpbmcuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSdzaG93IGRlYnVnIG91dHB1dCBmb3IgdGVzdCBydW5uZXInKQorICAgIGcuYWRkX2FyZ3VtZW50KCctUCcsICctLXByaW50LWV4cGVjdGVkLWZhaWx1cmVzJywgY2hvaWNlcz1bJ21lcmdlJywgJ292ZXJ3cml0ZSddLAorICAgICAgICAgICAgICAgICAgIGRlc3Q9J3ByaW50X2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgcHJpbnQgdG8gc3Rkb3V0IikKKyAgICBnLmFkZF9hcmd1bWVudCgnLVUnLCAnLS11cGRhdGUtZXhwZWN0ZWQtZmFpbHVyZXMnLCBjaG9pY2VzPVsnbWVyZ2UnLCAnb3ZlcndyaXRlJ10sCisgICAgICAgICAgICAgICAgICAgZGVzdD0ndXBkYXRlX2ZhaWx1cmVzJywKKyAgICAgICAgICAgICAgICAgICBoZWxwPSJnZW5lcmF0ZSBleHBlY3RlZCBmYWlsdXJlcyBiYXNlZCBvbiBsYXN0IHJlc3VsdCBhbmQgc2F2ZSB0byBkZWZhdWx0IGZpbGUgbG9jYXRpb24iKQorICAgIG9wdGlvbnMgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorCisgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmxvZ190b19zdGRlcnIoKQorICAgIGxvZ2dlci5zZXRMZXZlbChvcHRpb25zLmxvZ19sZXZlbCkKKworICAgIGlmIG9wdGlvbnMuZmVhdHVyZXMgaXMgbm90IE5vbmUgYW5kIG9wdGlvbnMuY2xpZW50OgorICAgICAgICBwcmludCgnQ2Fubm90IHNwZWNpZnkgYm90aCAtLWZlYXR1cmVzIGFuZCAtLWNsaWVudCAnLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiAxCisKKyAgICAjIEFsbG93IG11bHRpcGxlIGFyZ3Mgc2VwYXJhdGVkIHdpdGggJywnIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgc2VydmVyX21hdGNoID0gbGlzdChjaGFpbigqW3guc3BsaXQoJywnKSBmb3IgeCBpbiBvcHRpb25zLnNlcnZlcl0pKQorICAgIGNsaWVudF9tYXRjaCA9IGxpc3QoY2hhaW4oKlt4LnNwbGl0KCcsJykgZm9yIHggaW4gb3B0aW9ucy5jbGllbnRdKSkKKworICAgIGlmIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzIG9yIG9wdGlvbnMucHJpbnRfZmFpbHVyZXM6CisgICAgICAgIGRpcmUgPSBwYXRoX2pvaW4oUk9PVF9ESVIsIEZFQVRVUkVfRElSX1JFTEFUSVZFKSBpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lIGVsc2UgVEVTVF9ESVIKKyAgICAgICAgcmVzID0gY3Jvc3NydW5uZXIuZ2VuZXJhdGVfa25vd25fZmFpbHVyZXMoCisgICAgICAgICAgICBkaXJlLCBvcHRpb25zLnVwZGF0ZV9mYWlsdXJlcyA9PSAnb3ZlcndyaXRlJywKKyAgICAgICAgICAgIG9wdGlvbnMudXBkYXRlX2ZhaWx1cmVzLCBvcHRpb25zLnByaW50X2ZhaWx1cmVzKQorICAgIGVsaWYgb3B0aW9ucy5mZWF0dXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgZmVhdHVyZXMgPSBvcHRpb25zLmZlYXR1cmVzIG9yIFsnLionXQorICAgICAgICByZXMgPSBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVzLCBvcHRpb25zLmpvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIGVsc2U6CisgICAgICAgIHJlcyA9IHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLm9ubHlfa25vd25fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgIHJldHVybiAwIGlmIHJlcyBlbHNlIDEKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC5zaCBiL3Rlc3QvdGVzdC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzBhMzcwOS4uMDAwMDAwMAotLS0gYS90ZXN0L3Rlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZQotIwotIyB0ZXN0cyBkaWZmZXJlbnQgY2xpZW50LXNlcnZlciwgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydCBjb21iaW5hdGlvbnMKLQotIyByZWxhdGVkIGlzc3VlczoKLSMgVEhSSUZULTg0NyBUZXN0IEZyYW1ld29yayBoYXJtb25pemF0aW9uIGFjcm9zcyBhbGwgbGFuZ3VhZ2VzCi0jIFRIUklGVC04MTkgYWRkIEVudW1lcmF0aW9uIGZvciBwcm90b2NvbCwgdHJhbnNwb3J0IGFuZCBzZXJ2ZXIgdHlwZXMKLQotCi1wcmludF9oZWFkZXIoKSB7Ci0gIHByaW50ZiAiJS0xNnMgJS0xMXMgJS0xN3MgJS1zXG4iICJjbGllbnQtc2VydmVyOiIgInByb3RvY29sOiIgInRyYW5zcG9ydDoiICJyZXN1bHQ6IgotfQotCi1kb190ZXN0ICgpIHsKLSAgICBjbGllbnRfc2VydmVyPSQxCi0gICAgcHJvdG9jb2w9JDIKLSAgICB0cmFuc3BvcnQ9JDMKLSAgICBjbGllbnRfZXhlYz0kNAotICAgIHNlcnZlcl9leGVjPSQ1Ci0gICAgc2VydmVyX3N0YXJ0dXBfdGltZT0kNgotICAgIAotICAgIHRlc3RuYW1lPSR7Y2xpZW50X3NlcnZlcn1fJHtwcm90b2NvbH1fJHt0cmFuc3BvcnR9Ci0gICAgc2VydmVyX3RpbWVvdXQ9JCgoJHtzZXJ2ZXJfc3RhcnR1cF90aW1lfSsxMCkpCi0gICAgcHJpbnRmICIlLTE2cyAlLTExcyAlLTE3cyIgJHtjbGllbnRfc2VydmVyfSAke3Byb3RvY29sfSAke3RyYW5zcG9ydH0gCi0gICAgdGltZW91dCAkc2VydmVyX3RpbWVvdXQgJHNlcnZlcl9leGVjID4gbG9nLyR7dGVzdG5hbWV9X3NlcnZlci5sb2cgMj4mMSAmCi0gICAgc2xlZXAgJHNlcnZlcl9zdGFydHVwX3RpbWUKLSAgICAkY2xpZW50X2V4ZWMgPiBsb2cvJHt0ZXN0bmFtZX1fY2xpZW50LmxvZyAyPiYxCi0gICAgCi0gICAgaWYgWyAiJD8iIC1lcSAiMCIgXTsgdGhlbgotICAgICAgZWNobyAiIHN1Y2Nlc3MiCi0gICAgZWxzZQotICAgICAgZWNobyAiIGZhaWx1cmUiCi0gICAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09IHNlcnZlciBtZXNzYWdlID09PT09PT09PT09PT09PT09PT0iCi0gICAgICB0YWlsIGxvZy8ke3Rlc3RuYW1lfV9zZXJ2ZXIubG9nIAotICAgICAgZWNobyAiPT09PT09PT09PT09PT09PT09PSBjbGllbnQgbWVzc2FnZSA9PT09PT09PT09PT09PT09PT09IgotICAgICAgdGFpbCBsb2cvJHt0ZXN0bmFtZX1fY2xpZW50LmxvZwotICAgICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgotICAgICAgcHJpbnRfaGVhZGVyCi0gICAgZmkKLSAgICBzbGVlcCAxMAotfQotCi1lY2hvICJBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZSIKLWRhdGUKLWVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKLQotcm0gLXJmIGxvZwotbWtkaXIgLXAgbG9nCi0KLXByaW50X2hlYWRlcgotCi0KLXByb3RvY29scz0iYmluYXJ5IGpzb24iCi10cmFuc3BvcnRzPSJidWZmZXJlZCBmcmFtZWQgaHR0cCIKLXNvY2tldHM9ImlwIGRvbWFpbiIKLSMgd2UgbmVlZCBhIHRlc3QgY2VydGlmaWNhdGUgZmlyc3QKLSNzb2NrZXRzPSJpcCBpcC1zc2wgZG9tYWluIgotCi0KLWZvciBwcm90byBpbiAkcHJvdG9jb2xzOyBkbwotICBmb3IgdHJhbnMgaW4gJHRyYW5zcG9ydHM7IGRvCi0gICAgZm9yIHNvY2sgaW4gJHNvY2tldHM7IGRvCi0gICAgICBjYXNlICIkc29jayIgaW4KLSAgICAgICAiaXAiICkgICAgIGV4dHJhcGFyYW09IiI7OwotICAgICAgICJpcC1zc2wiICkgZXh0cmFwYXJhbT0iLS1zc2wiOzsKLSAgICAgICAiZG9tYWluIiApIGV4dHJhcGFyYW09Ii0tZG9tYWluLXNvY2tldD0vdG1wL1RocmlmdFRlc3QudGhyaWZ0Ijs7Ci0gICAgICBlc2FjCi0gICAgICBkb190ZXN0ICJjcHAtY3BwIiAgICIke3Byb3RvfSIgIiR7dHJhbnN9LSR7c29ja30iIFwKLSAgICAgICAgICAgICAgImNwcC9UZXN0Q2xpZW50IC0tcHJvdG9jb2w9JHtwcm90b30gLS10cmFuc3BvcnQ9JHt0cmFuc30gJHtleHRyYXBhcmFtfSIgXAotICAgICAgICAgICAgICAiY3BwL1Rlc3RTZXJ2ZXIgLS1wcm90b2NvbD0ke3Byb3RvfSAtLXRyYW5zcG9ydD0ke3RyYW5zfSAke2V4dHJhcGFyYW19IiBcCi0gICAgICAgICAgICAgICIxMCIKLSAgICBkb25lOwotICBkb25lOwotZG9uZTsKLQotCi1kb190ZXN0ICJqYXZhLWphdmEiICJiaW5hcnkiICJidWZmZXJlZC1pcCIgXAotICAgICAgICAiYW50IC1mICAuLi9saWIvamF2YS9idWlsZC54bWwgdGVzdGNsaWVudCIgXAotICAgICAgICAiYW50IC1mICAuLi9saWIvamF2YS9idWlsZC54bWwgdGVzdHNlcnZlciIgXAotICAgICAgICAiMTAwIgotZG9fdGVzdCAiY3BwLWphdmEiICAiYmluYXJ5IiAiYnVmZmVyZWQtaXAiIFwKLSAgICAgICAgImNwcC9UZXN0Q2xpZW50IiBcCi0gICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCB0ZXN0c2VydmVyIiBcCi0gICAgICAgICIxMDAiCi1kb190ZXN0ICJjcHAtamF2YSIgICJqc29uIiAgICJidWZmZXJlZC1pcCIgXAotICAgICAgICAiY3BwL1Rlc3RDbGllbnQiIFwKLSAgICAgICAgImFudCAtZiAgLi4vbGliL2phdmEvYnVpbGQueG1sIHRlc3RzZXJ2ZXIiIFwKLSAgICAgICAgIjEwMCIKLWRvX3Rlc3QgImpzLWphdmEiICAgImpzb24gIiAgImh0dHAtaXAiIFwKLSAgICAgICAgIiIgXAotICAgICAgICAiYW50IC1mICAuLi9saWIvanMvdGVzdC9idWlsZC54bWwgdW5pdHRlc3QiIFwKLSAgICAgICAgIjEwMCIKLWRvX3Rlc3QgImphdmEtY3BwIiAgImJpbmFyeSIgImJ1ZmZlcmVkLWlwIiBcCi0gICAgICAgICJhbnQgLWYgIC4uL2xpYi9qYXZhL2J1aWxkLnhtbCB0ZXN0Y2xpZW50IiBcCi0gICAgICAgICJjcHAvVGVzdFNlcnZlciIgXAotICAgICAgICAiMTAiCi1kb190ZXN0ICJwZXJsLWNwcCIgICJiaW5hcnkiICJidWZmZXJlZC1pcCIgXAotICAgICAgICAicGVybCAtSSBwZXJsL2dlbi1wZXJsLyAtSS4uL2xpYi9wZXJsL2xpYi8gcGVybC9UZXN0Q2xpZW50LnBsIiBcCi0gICAgICAgICJjcHAvVGVzdFNlcnZlciIgXAotICAgICAgICAiMTAiCi1kb190ZXN0ICJwaHAtY3BwIiAgImJpbmFyeSIgImJ1ZmZlcmVkLWlwIiBcCi0gICAgICAgICJtYWtlIC1DIHBocC8gY2xpZW50IiBcCi0gICAgICAgICJjcHAvVGVzdFNlcnZlciIgXAotICAgICAgICAiMTAiCi1kb190ZXN0ICJub2RlanMtbm9kZWpzIiAiYmluYXJ5IiAiZnJhbWVkLWlwIiBcCi0gICAgICAgICJtYWtlIC1DIG5vZGVqcy8gY2xpZW50IiBcCi0gICAgICAgICJtYWtlIC1DIG5vZGVqcy8gc2VydmVyIiBcCi0gICAgICAgICIxIgotZG9fdGVzdCAiY3BwLW5vZGVqcyIgImJpbmFyeSIgImZyYW1lZC1pcCIgXAotICAgICAgICAiY3BwL1Rlc3RDbGllbnQgLS10cmFuc3BvcnQ9ZnJhbWVkIiBcCi0gICAgICAgICJtYWtlIC1DIG5vZGVqcy8gc2VydmVyIiBcCi0gICAgICAgICIxIgpkaWZmIC0tZ2l0IGEvdGVzdC90ZXN0cy5qc29uIGIvdGVzdC90ZXN0cy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDZkZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3Rlc3RzLmpzb24KQEAgLTAsMCArMSw3NDkgQEAKK1sKKyAgeworICAgICJuYW1lIjogImNfZ2xpYiIsCisgICAgInBsYXRmb3JtcyI6IFsKKyAgICAgICJMaW51eCIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0sCisgICAgICAic29ja2V0cyI6IFsKKyAgICAgICAgImlwLXNzbCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiY19nbGliIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY2wiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsiVGVzdFNlcnZlciJdLAorICAgICAgIndvcmtkaXIiOiAiY2wiLAorICAgICAgInByb3RvY29scyI6IFsiYmluYXJ5IiwgIm11bHRpIl0sCisgICAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiLCAiZnJhbWVkIl0sCisgICAgICAic29ja2V0cyI6IFsiaXAiXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0Q2xpZW50Il0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfQorICB9LAorICB7CisgICAgIm5hbWUiOiAiZCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGhyaWZ0X3Rlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tdHJhY2UiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0aHJpZnRfdGVzdF9jbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJodHRwIiwKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2QvdGVzdCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImdvIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0c2VydmVyIiwKKyAgICAgICAgIi0tY2VydFBhdGg9Li4vLi4va2V5cyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RjbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIiwKKyAgICAgICJ6bGliIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiZ28vYmluIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiamF2YSIsCisgICAgImpvaW5fYXJncyI6IGZhbHNlLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZGVsYXkiOiAxNSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuc2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAianNvbjptdWx0aWoiCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiAxMywKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuY2xpZW50IgorICAgICAgXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpajpqc29uIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiZnJhbWVkOmZhc3RmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9qYXZhIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9kZWpzIiwKKyAgICAiZW52IjogeworICAgICAgIk5PREVfUEFUSCI6ICIuLi9saWIiCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJub2RlIiwKKyAgICAgICAgInNlcnZlci5qcyIsCisgICAgICAgICItLXR5cGU9dGNwIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAibm9kZSIsCisgICAgICAgICJjbGllbnQuanMiLAorICAgICAgICAiLS10eXBlPXRjcCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIiwKKyAgICAgICJkb21haW4iCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogIi4uL2xpYi9ub2RlanMvdGVzdCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImhzIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQiCisgICAgICBdCisgICAgfSwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImhlYWRlciIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiaHMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJweSIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJleHRyYV9hcmdzIjogWyJUU2ltcGxlU2VydmVyIl0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAorICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpOm11bHRpYSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGljOm11bHRpYWMiLAorICAgICAgICAibXVsdGlqIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImNvbXBhY3QiLAorICAgICAgImJpbmFyeSIsCisgICAgICAianNvbiIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0OmFjY2VsYyIsCisgICAgICAiaGVhZGVyIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicHkiCisgIH0sCisgIHsKKyAgICAiY29tbWVudCI6ICJVc2luZyAncHl0aG9uMycgZXhlY3V0YWJsZSB0byB0ZXN0IHB5MiBhbmQgMyBhdCBvbmNlIiwKKyAgICAibmFtZSI6ICJweTMiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiZXh0cmFfYXJncyI6IFsiVFNpbXBsZVNlcnZlciJdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJweXRob24zIiwKKyAgICAgICAgIlRlc3RTZXJ2ZXIucHkiLAorICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInB5dGhvbjMiLAorICAgICAgICAiVGVzdENsaWVudC5weSIsCisgICAgICAgICItLWhvc3Q9bG9jYWxob3N0IiwKKyAgICAgICAgIi0tZ2VucHlkaXI9Z2VuLXB5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aTptdWx0aWEiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpYzptdWx0aWFjIiwKKyAgICAgICAgIm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJiaW5hcnkiLAorICAgICAgImpzb24iLAorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInB5IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY3BwIiwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJUZXN0U2VydmVyIgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiLAorICAgICAgICAiY29tcGFjdDptdWx0aWMiLAorICAgICAgICAiaGVhZGVyOm11bHRpaCIsCisgICAgICAgICJqc29uOm11bHRpaiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDgsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIlRlc3RDbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIsCisgICAgICAgICJtdWx0aWg6aGVhZGVyIiwKKyAgICAgICAgIm11bHRpajpqc29uIgorICAgICAgXQorICAgIH0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImh0dHAiLAorICAgICAgImZyYW1lZCIsCisgICAgICAiemxpYiIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiY29tcGFjdCIsCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJqc29uIiwKKyAgICAgICJoZWFkZXIiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiLAorICAgICAgIm11bHRpaCIsCisgICAgICAibXVsdGlqIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiY3BwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicmIiLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1YnkiLAorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYiIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDUsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInJ1YnkiLAorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiIsCisgICAgICAgICItLSIKKyAgICAgIF0KKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJkb21haW4iLAorICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiYmluYXJ5OmFjY2VsIiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJqc29uIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicmIvZ2VuLXJiIgorICB9LAorICB7CisgICAgIm5hbWUiOiAiY3NoYXJwIiwKKyAgICAiZW52IjogeworICAgICAgIk1PTk9fUEFUSCI6ICIuLi8uLi9saWIvY3NoYXJwLyIKKyAgICB9LAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJtb25vIiwKKyAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKKyAgICAgICAgInNlcnZlciIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDksCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgIm1vbm8iLAorICAgICAgICAiVGVzdENsaWVudFNlcnZlci5leGUiLAorICAgICAgICAiY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiY3NoYXJwIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibmV0Y29yZSIsCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJzZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRvdG5ldCIsCisgICAgICAgICJydW4iLAorICAgICAgICAiLS1uby1idWlsZCIsCisgICAgICAgICItLXByb2plY3Q9U2VydmVyL1NlcnZlci5jc3Byb2oiLAorICAgICAgICAic2VydmVyIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogMTAsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImRvdG5ldCIsCisgICAgICAgICJydW4iLAorICAgICAgICAiLS1uby1idWlsZCIsCisgICAgICAgICItLXByb2plY3Q9Q2xpZW50L0NsaWVudC5jc3Byb2oiLAorICAgICAgICAiY2xpZW50IgorICAgICAgXQorICAgIH0sCisgICAgICAgICJ3b3JrZGlyIjogIm5ldGNvcmUiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJwZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIsCisgICAgICAiZG9tYWluIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgIm11bHRpIgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGVybCIsCisgICAgICAgICItSWdlbi1wZXJsLyIsCisgICAgICAgICItSS4uLy4uL2xpYi9wZXJsL2xpYi8iLAorICAgICAgICAiVGVzdENsaWVudC5wbCIsCisgICAgICAgICItLWNhPS4uL2tleXMvQ0EucGVtIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL2NsaWVudC5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9jbGllbnQua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiCisgICAgICBdCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJwZXJsIiwKKyAgICAgICAgIi1JZ2VuLXBlcmwvIiwKKyAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCisgICAgICAgICJUZXN0U2VydmVyLnBsIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL3NlcnZlci5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9zZXJ2ZXIua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJiaW5hcnk6bXVsdGkiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJwZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAicGhwIiwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAgICJidWZmZXJlZCIsCisgICAgICAgICJmcmFtZWQiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAiYmluYXJ5OmFjY2VsIgorICAgICAgXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicGhwIiwKKyAgICAgICAgIi1kZXh0ZW5zaW9uX2Rpcj1waHBfZXh0X2RpciIsCisgICAgICAgICItLXBocC1pbmk9dGVzdF9waHAuaW5pIiwKKyAgICAgICAgIi0tbm8tcGhwLWluaSIsCisgICAgICAgICItZGRpc3BsYXlfZXJyb3JzPXN0ZGVyciIsCisgICAgICAgICItZGxvZ19lcnJvcnM9MCIsCisgICAgICAgICItZGVycm9yX3JlcG9ydGluZz1FX0FMTCIsCisgICAgICAgICJUZXN0Q2xpZW50LnBocCIKKyAgICAgIF0KKyAgICB9LAorICAgICJ3b3JrZGlyIjogInBocCIKKyAgfSwKKyAgeworICAgICJuYW1lIjogImRhcnQiLAorICAgICJjbGllbnQiOiB7CisgICAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICAgImZyYW1lZCIsCisgICAgICAgICJodHRwIgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeSIsCisgICAgICAgICJjb21wYWN0IiwKKyAgICAgICAgImpzb24iCisgICAgICBdLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkYXJ0IiwKKyAgICAgICAgInRlc3RfY2xpZW50L2Jpbi9tYWluLmRhcnQiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJkYXJ0IgorICB9LAorICB7CisgICAgIm5hbWUiOiAiZXJsIiwKKyAgICAidHJhbnNwb3J0cyI6IFsKKyAgICAgICJidWZmZXJlZCIsCisgICAgICAiZnJhbWVkIgorICAgIF0sCisgICAgInNvY2tldHMiOiBbCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IgorICAgIF0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X2NsaWVudCIsCisgICAgICAgICItcyIsCisgICAgICAgICJpbml0IiwKKyAgICAgICAgInN0b3AiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiZXJsIiwKKyAgICAgICAgIitLIiwKKyAgICAgICAgInRydWUiLAorICAgICAgICAiLW5vc2hlbGwiLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4uLy4uL2xpYi9lcmwvZWJpbi8iLAorICAgICAgICAiLXBhIiwKKyAgICAgICAgIi4vZWJpbiIsCisgICAgICAgICItcyIsCisgICAgICAgICJ0ZXN0X3RocmlmdF9zZXJ2ZXIiLAorICAgICAgICAiLWV4dHJhIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiZXJsIgorICB9LAorICB7CisgICAgIm5hbWUiOiAianMiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImh0dHAiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAianNvbiIKKyAgICBdLAorICAgICJjbGllbnQiOiB7CisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInBoYW50b21qcyIsCisgICAgICAgICJ0ZXN0L3BoYW50b20tY2xpZW50LmpzIgorICAgICAgXQorICAgIH0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL2pzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibHVhIiwKKyAgICAiVE9ETyI6ICJBZGQgZGxsIHRvIExVQV9DUEFUSCIsCisgICAgImVudiI6IHsKKyAgICAgICJMVUFfUEFUSCI6ICI7O2dlbi1sdWEvPy5sdWE7Li4vLi4vbGliL2x1YS8/Lmx1YSIsCisgICAgICAiTFVBX0NQQVRIIjogIjs7Li4vLi4vbGliL2x1YS8ubGlicy8/LnNvIgorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgICAiYnVmZmVyZWQiLAorICAgICAgICAiZnJhbWVkIiwKKyAgICAgICAgImh0dHAiCisgICAgICBdLAorICAgICAgInNvY2tldHMiOiBbCisgICAgICAgICJpcCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5IiwKKyAgICAgICAgImNvbXBhY3QiLAorICAgICAgICAianNvbiIKKyAgICAgIF0sCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImx1YSIsCisgICAgICAgICJ0ZXN0X2Jhc2ljX2NsaWVudC5sdWEiCisgICAgICBdCisgICAgfSwKKyAgICAid29ya2RpciI6ICJsdWEiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJycyIsCisgICAgImVudiI6IHsKKyAgICAgICJSVVNUX0JBQ0tUUkFDRSI6ICIxIiwKKyAgICAgICJSVVNUX0xPRyI6ICJpbmZvIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9zZXJ2ZXIiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDYsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgInRlc3RfY2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiCisgICAgICBdCisgICAgfSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIKKyAgICBdLAorICAgICJ3b3JrZGlyIjogInJzL2JpbiIKKyAgfSwKKyAgeworICAgICJuYW1lIjogIm5vZGV0cyIsCisgICAgImVudiI6IHsKKyAgICAgICJOT0RFX1BBVEgiOiAiLi4vbGliIgorICAgIH0sCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuU2VydmVyLnNoIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAicnVuQ2xpZW50LnNoIgorICAgICAgXQorICAgIH0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIKKyAgICBdLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAiLi4vbGliL25vZGV0cy90ZXN0IgorICB9CitdCmRpZmYgLS1naXQgYS90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAgYi90ZXN0L3RocmVhZHMvVGhyZWFkc0NsaWVudC5jcHAKaW5kZXggNzBiMDhhZC4uOTMwNmEzZiAxMDA2NDQKLS0tIGEvdGVzdC90aHJlYWRzL1RocmVhZHNDbGllbnQuY3BwCisrKyBiL3Rlc3QvdGhyZWFkcy9UaHJlYWRzQ2xpZW50LmNwcApAQCAtMjgsNiArMjgsOSBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaWYgX1dJTjMyCisgICAjaW5jbHVkZSA8dGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaD4KKyNlbmRpZgogCiB1c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKQEAgLTM3LDYgKzQwLDkgQEAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworI2lmIF9XSU4zMgorICB0cmFuc3BvcnQ6OlRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKKyNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIHN0ZDo6c3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKIApkaWZmIC0tZ2l0IGEvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwIGIvdGVzdC90aHJlYWRzL1RocmVhZHNTZXJ2ZXIuY3BwCmluZGV4IDljMWE3ZDkuLmEyNjdjM2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvdGhyZWFkcy9UaHJlYWRzU2VydmVyLmNwcAorKysgYi90ZXN0L3RocmVhZHMvVGhyZWFkc1NlcnZlci5jcHAKQEAgLTI5LDYgKzI5LDkgQEAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgorI2lmIF9XSU4zMgorICAgI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CisjZW5kaWYKIAogdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CkBAIC04NSwxMSArODgsMTIgQEAKIHByb3RlY3RlZDoKICAgdm9pZCBnbzJzbGVlcChpbnQgdGhyZWFkLCBpbnQgc2Vjb25kcykgewogICAgIE1vbml0b3IgbTsKKyAgICBTeW5jaHJvbml6ZWQgcyhtKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY29uZHM7ICsraSkgewogICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgJWQ6IHNsZWVwICVkXG4iLCB0aHJlYWQsIGkpOwogICAgICAgdHJ5IHsKICAgICAgICAgbS53YWl0KDEwMDApOwotICAgICAgfSBjYXRjaChUaW1lZE91dEV4Y2VwdGlvbiYgZSkgeworICAgICAgfSBjYXRjaChjb25zdCBUaW1lZE91dEV4Y2VwdGlvbiYpIHsKICAgICAgIH0KICAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsICJUSFJFQUQgJWQgRE9ORVxuIiwgdGhyZWFkKTsKQEAgLTEwMSw2ICsxMDUsOSBAQAogfTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisjaWYgX1dJTjMyCisgIHRyYW5zcG9ydDo6VFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSgpOworI2VuZGlmCiAgIGludCBwb3J0ID0gOTA5MDsKICAgc2hhcmVkX3B0cjxUaHJlYWRzVGVzdEhhbmRsZXI+IGhhbmRsZXIobmV3IFRocmVhZHNUZXN0SGFuZGxlcigpKTsKICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3IFRocmVhZHNUZXN0UHJvY2Vzc29yKGhhbmRsZXIpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTdjYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCkBAIC0wLDAgKzEsNTMgQEAKK3sKKyAgIGJvb3N0L2dldF9vbmNlX3Blcl90aHJlYWRfZXBvY2gvaWdub3JlCisgICBNZW1jaGVjazpMZWFrCisgICBtYXRjaC1sZWFrLWtpbmRzOiByZWFjaGFibGUKKyAgIGZ1bjptYWxsb2MKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjVnZXRfb25jZV9wZXJfdGhyZWFkX2Vwb2NoRXYKK30KK3sKKyAgIGJvb3N0dGhyZWFkcy9vbmNlL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOl9aTjVib29zdDEzdGhyZWFkX2RldGFpbDE3ZW50ZXJfb25jZV9yZWdpb25FUk5TXzlvbmNlX2ZsYWdFCisgICBmdW46X1pONWJvb3N0NmRldGFpbDIzZ2V0X2N1cnJlbnRfdGhyZWFkX2RhdGFFdgorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyMGludGVycnVwdGlvbl9jaGVja2VyQzFFUDE1cHRocmVhZF9tdXRleF90UDE0cHRocmVhZF9jb25kX3QKKyAgIGZ1bjpfWk41Ym9vc3QyMmNvbmRpdGlvbl92YXJpYWJsZV9hbnk0d2FpdElOU18xMXVuaXF1ZV9sb2NrSU5TXzExdGltZWRfbXV0ZXhFRUVFRXZSVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k3TW9uaXRvcjRJbXBsMTF3YWl0Rm9yZXZlckV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDE5d2FpdEZvclRpbWVSZWxhdGl2ZUVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDR3YWl0RWwKKyAgIGZ1bjpfWk5LNmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0d2FpdEVsCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgcHRocmVhZC9jcmVhdGlvbi10bHMvaWdub3JlCisgICBIZWxncmluZDpSYWNlCisgICBmdW46bWVtcGNweQorICAgZnVuOl9kbF9hbGxvY2F0ZV90bHNfaW5pdAorICAgZnVuOmdldF9jYWNoZWRfc3RhY2sKKyAgIGZ1bjphbGxvY2F0ZV9zdGFjaworICAgZnVuOnB0aHJlYWRfY3JlYXRlQEBHTElCQ18yLjIqCisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTNQdGhyZWFkVGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9Cit7CisgICBib29zdC10aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yLjUKKyAgIG9iajovdXNyL2xpYi92YWxncmluZC92Z3ByZWxvYWRfaGVsZ3JpbmQtYW1kNjQtbGludXguc28KKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMjFzdGFydF90aHJlYWRfbm9leGNlcHRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWQxMnN0YXJ0X3RocmVhZEV2CisgICBmdW46X1pONWJvb3N0NnRocmVhZEMxSVN0NV9CaW5kSUZQRlB2UzNfRVMzX0VFRUVPVF8KKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3kxMUJvb3N0VGhyZWFkNXN0YXJ0RXYKKyAgIGZ1bjpfWk42YXBhY2hlNnRocmlmdDExY29uY3VycmVuY3k0dGVzdDE4VGhyZWFkRmFjdG9yeVRlc3RzMTJyZWFwTlRocmVhZHNFaWkKKyAgIGZ1bjptYWluCit9CisKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDk5NDYwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTAgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0KKworaWYgTUlOR1cKKyMgZG8gbm90aGluZywganVzdCBidWlsZCB0aGUgY29tcGlsZXIKK2Vsc2UKKworaWYgV0lUSF9DX0dMSUIKK1NVQkRJUlMgKz0gY19nbGliCitlbmRpZgorCitpZiBXSVRIX0NQUAorU1VCRElSUyArPSBjcHAKK2VuZGlmCisKK2lmIFdJVEhfRAorU1VCRElSUyArPSBkCitlbmRpZgorCitpZiBXSVRIX0pBVkEKK1NVQkRJUlMgKz0gamF2YQorU1VCRElSUyArPSBqcworZW5kaWYKKworaWYgV0lUSF9QWVRIT04KK1NVQkRJUlMgKz0gcHkKK1NVQkRJUlMgKz0gcHkudHdpc3RlZAorU1VCRElSUyArPSBweS50b3JuYWRvCitlbmRpZgorCitpZiBXSVRIX1JVQlkKK1NVQkRJUlMgKz0gcmIKK2VuZGlmCisKK2lmIFdJVEhfSEFTS0VMTAorU1VCRElSUyArPSBocworZW5kaWYKKworaWYgV0lUSF9IQVhFCitTVUJESVJTICs9IGhheGUKK2VuZGlmCisKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCitpZiBXSVRIX0dPCitTVUJESVJTICs9IGdvCitlbmRpZgorCitpZiBXSVRIX05PREVKUworU1VCRElSUyArPSBub2RlanMKK2VuZGlmCisKK2lmIFdJVEhfREFSVAorU1VCRElSUyArPSBkYXJ0CitlbmRpZgorCitpZiBXSVRIX1JTCitTVUJESVJTICs9IHJzCitlbmRpZgorCitpZiBXSVRIX0NMCitTVUJESVJTICs9IGNsCitlbmRpZgorCisjCisjIGdlbmVyYXRlIGh0bWwgZm9yIFRocmlmdFRlc3QudGhyaWZ0CisjCithbGwtbG9jYWw6CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gaHRtbCAtciAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCitjbGVhbi1sb2NhbDoKKwlybSAtcmYgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC9nZW4taHRtbAorCitlbmRpZgorCisjIEFueSBmb2xkZXJzIG9yIGZpbGVzIG5vdCBsaXN0ZWQgYWJvdmUgYmVpbmcgYWRkZWQgdG8gU1VCRElSIG5lZWQgdG8gYmUgcGxhY2VkIGhlcmUgaW4KKyMgRVhUUkFfRElTVCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZQorRVhUUkFfRElTVCA9IFwKKwlhczMgXAorCWNzaGFycCBcCisJZCBcCisJZGVscGhpIFwKKwllcmwgXAorCWhzIFwKKwlvY2FtbCBcCisJcGVybCBcCisJcGhwIFwKKwlzaGFyZWQudGhyaWZ0IFwKKwl0dXRvcmlhbC50aHJpZnQgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvUkVBRE1FIGIvdHV0b3JpYWwvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjlmOTc3Li4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLVRocmlmdCBUdXRvcmlhbAotCi1MaWNlbnNlCi09PT09PT09Ci0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotCi1UdXRvcmlhbAotPT09PT09PT0KLQotMSkgRmlyc3QgdGhpbmdzIGZpcnN0LCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIHRoZQotICAgbGFuZ3VhZ2UgbGlicmFyaWVzLiBEbyB0aGF0IHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRvcCBsZXZlbAotICAgUkVBRE1FIGZpbGUuCi0KLTIpIFJlYWQgdHV0b3JpYWwudGhyaWZ0IHRvIGxlYXJuIGFib3V0IHRoZSBzeW50YXggb2YgYSBUaHJpZnQgZmlsZQotCi0zKSBDb21waWxlIHRoZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2U6Ci0KLSAgICAgJCB0aHJpZnQKLSAgICAgJCB0aHJpZnQgLXIgLS1nZW4gY3BwIHR1dG9yaWFsLnRocmlmdAotCi00KSBUYWtlIGEgbG9vayBhdCB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0KLTUpIExvb2sgaW4gdGhlIGxhbmd1YWdlIGRpcmVjdG9yaWVzIGZvciBzYW1wbGUgY2xpZW50L3NlcnZlciBjb2RlLgotCi02KSBUaGF0J3MgYWJvdXQgaXQgZm9yIG5vdy4gVGhpcyB0dXRvcmlhbCBpcyBpbnRlbnRpb25hbGx5IGJyaWVmLiBJdCBzaG91bGQgYmUKLSAgIGp1c3QgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZCBhbmQgcmVhZHkgdG8gYnVpbGQgeW91ciBvd24gcHJvamVjdC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL1JFQURNRS5tZCBiL3R1dG9yaWFsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzcyYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDIgQEAKK1RocmlmdCBUdXRvcmlhbAorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitUdXRvcmlhbAorPT09PT09PT0KKworMSkgRmlyc3QgdGhpbmdzIGZpcnN0LCB5b3UnbGwgbmVlZCB0byBpbnN0YWxsIHRoZSBUaHJpZnQgY29tcGlsZXIgYW5kIHRoZQorICAgbGFuZ3VhZ2UgbGlicmFyaWVzLiBEbyB0aGF0IHVzaW5nIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHRvcCBsZXZlbAorICAgUkVBRE1FLm1kIGZpbGUuCisKKzIpIFJlYWQgdHV0b3JpYWwudGhyaWZ0IHRvIGxlYXJuIGFib3V0IHRoZSBzeW50YXggb2YgYSBUaHJpZnQgZmlsZQorCiszKSBDb21waWxlIHRoZSBjb2RlIGZvciB0aGUgbGFuZ3VhZ2Ugb2YgeW91ciBjaG9pY2U6CisKKyAgICAgJCB0aHJpZnQKKyAgICAgJCB0aHJpZnQgLXIgLS1nZW4gY3BwIHR1dG9yaWFsLnRocmlmdAorCis0KSBUYWtlIGEgbG9vayBhdCB0aGUgZ2VuZXJhdGVkIGNvZGUuCisKKzUpIExvb2sgaW4gdGhlIGxhbmd1YWdlIGRpcmVjdG9yaWVzIGZvciBzYW1wbGUgY2xpZW50L3NlcnZlciBjb2RlLgorCis2KSBUaGF0J3MgYWJvdXQgaXQgZm9yIG5vdy4gVGhpcyB0dXRvcmlhbCBpcyBpbnRlbnRpb25hbGx5IGJyaWVmLiBJdCBzaG91bGQgYmUKKyAgIGp1c3QgZW5vdWdoIHRvIGdldCB5b3Ugc3RhcnRlZCBhbmQgcmVhZHkgdG8gYnVpbGQgeW91ciBvd24gcHJvamVjdC4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2FzMy9idWlsZC54bWwgYi90dXRvcmlhbC9hczMvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWQzMmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9hczMvYnVpbGQueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzxwcm9qZWN0IG5hbWU9InR1dG9yaWFsIiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIj4KKworICA8ZGVzY3JpcHRpb24+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+JSIpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0IGIvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzRiNDEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw1NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2luY2x1ZGVfZGlyZWN0b3JpZXMoU1lTVEVNICIke0Jvb3N0X0lOQ0xVREVfRElSU30iKQorCisjTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCitpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2dlbi1jcHAiKQoraW5jbHVkZV9kaXJlY3RvcmllcygiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2xpYi9jcHAvc3JjIikKKworaW5jbHVkZShUaHJpZnRNYWNyb3MpCisKK3NldCh0dXRvcmlhbGdlbmNwcF9TT1VSQ0VTCisgICAgZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcAorICAgIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAKKyAgICBnZW4tY3BwL3NoYXJlZF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwCisgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKykKK2FkZF9saWJyYXJ5KHR1dG9yaWFsZ2VuY3BwIFNUQVRJQyAke3R1dG9yaWFsZ2VuY3BwX1NPVVJDRVN9KQorTElOS19BR0FJTlNUX1RIUklGVF9MSUJSQVJZKHR1dG9yaWFsZ2VuY3BwIHRocmlmdCkKKworYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwIC1yICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKykKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxTZXJ2ZXIgQ3BwU2VydmVyLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbFNlcnZlciB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKKworYWRkX2V4ZWN1dGFibGUoVHV0b3JpYWxDbGllbnQgQ3BwQ2xpZW50LmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCB0dXRvcmlhbGdlbmNwcCkKK0xJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUdXRvcmlhbENsaWVudCB0aHJpZnQpCitpZiAoWkxJQl9GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50ICR7WkxJQl9MSUJSQVJJRVN9KQorZW5kaWYgKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKaW5kZXggNmI3ZTk3NC4uNTIwODQxMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcENsaWVudC5jcHAKQEAgLTE3LDkgKzE3LDcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CkBAIC0zNSwyMiArMzMsMTkgQEAKIHVzaW5nIG5hbWVzcGFjZSB0dXRvcmlhbDsKIHVzaW5nIG5hbWVzcGFjZSBzaGFyZWQ7CiAKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7Ci0gIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworaW50IG1haW4oKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwogICBDYWxjdWxhdG9yQ2xpZW50IGNsaWVudChwcm90b2NvbCk7CiAKICAgdHJ5IHsKICAgICB0cmFuc3BvcnQtPm9wZW4oKTsKIAogICAgIGNsaWVudC5waW5nKCk7Ci0gICAgcHJpbnRmKCJwaW5nKClcbiIpOworICAgIGNvdXQgPDwgInBpbmcoKSIgPDwgZW5kbDsKIAotICAgIGludDMyX3Qgc3VtID0gY2xpZW50LmFkZCgxLDEpOwotICAgIHByaW50ZigiMSsxPSVkXG4iLCBzdW0pOworICAgIGNvdXQgPDwgIjEgKyAxID0gIiA8PCBjbGllbnQuYWRkKDEsIDEpIDw8IGVuZGw7CiAKICAgICBXb3JrIHdvcms7CiAgICAgd29yay5vcCA9IE9wZXJhdGlvbjo6RElWSURFOwpAQCAtNTgsMjcgKzUzLDI4IEBACiAgICAgd29yay5udW0yID0gMDsKIAogICAgIHRyeSB7Ci0gICAgICBpbnQzMl90IHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICAgIHByaW50ZigiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvIVxuIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiAmaW8pIHsKLSAgICAgIHByaW50ZigiSW52YWxpZE9wZXJhdGlvbjogJXNcbiIsIGlvLndoeS5jX3N0cigpKTsKKyAgICAgIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICBjb3V0IDw8ICJXaG9hPyBXZSBjYW4gZGl2aWRlIGJ5IHplcm8hIiA8PCBlbmRsOworICAgIH0gY2F0Y2ggKEludmFsaWRPcGVyYXRpb24mIGlvKSB7CisgICAgICBjb3V0IDw8ICJJbnZhbGlkT3BlcmF0aW9uOiAiIDw8IGlvLndoeSA8PCBlbmRsOworICAgICAgLy8gb3IgdXNpbmcgZ2VuZXJhdGVkIG9wZXJhdG9yPDw6IGNvdXQgPDwgaW8gPDwgZW5kbDsKKyAgICAgIC8vIG9yIGJ5IHVzaW5nIHN0ZDo6ZXhjZXB0aW9uIG5hdGl2ZSBtZXRob2Qgd2hhdCgpOiBjb3V0IDw8IGlvLndoYXQoKSA8PCBlbmRsOwogICAgIH0KIAogICAgIHdvcmsub3AgPSBPcGVyYXRpb246OlNVQlRSQUNUOwogICAgIHdvcmsubnVtMSA9IDE1OwogICAgIHdvcmsubnVtMiA9IDEwOwogICAgIGludDMyX3QgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgcHJpbnRmKCIxNS0xMD0lZFxuIiwgZGlmZik7CisgICAgY291dCA8PCAiMTUgLSAxMCA9ICIgPDwgZGlmZiA8PCBlbmRsOwogCiAgICAgLy8gTm90ZSB0aGF0IEMrKyB1c2VzIHJldHVybiBieSByZWZlcmVuY2UgZm9yIGNvbXBsZXggdHlwZXMgdG8gYXZvaWQKICAgICAvLyBjb3N0bHkgY29weSBjb25zdHJ1Y3Rpb24KICAgICBTaGFyZWRTdHJ1Y3Qgc3M7CiAgICAgY2xpZW50LmdldFN0cnVjdChzcywgMSk7Ci0gICAgcHJpbnRmKCJDaGVjayBsb2c6ICVzXG4iLCBzcy52YWx1ZS5jX3N0cigpKTsKKyAgICBjb3V0IDw8ICJSZWNlaXZlZCBsb2c6ICIgPDwgc3MgPDwgZW5kbDsKIAogICAgIHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgfSBjYXRjaCAoVEV4Y2VwdGlvbiAmdHgpIHsKLSAgICBwcmludGYoIkVSUk9SOiAlc1xuIiwgdHgud2hhdCgpKTsKKyAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgdHgpIHsKKyAgICBjb3V0IDw8ICJFUlJPUjogIiA8PCB0eC53aGF0KCkgPDwgZW5kbDsKICAgfQotCiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ3BwU2VydmVyLmNwcCBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCmluZGV4IGQwZGJhZDkuLmY3Mzc5ZDUgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCisrKyBiL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwCkBAIC0xOCwxMyArMTgsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KQEAgLTM0LDYgKzM2LDcgQEAKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKQEAgLTQxLDIzICs0NCwxOSBAQAogdXNpbmcgbmFtZXNwYWNlIHR1dG9yaWFsOwogdXNpbmcgbmFtZXNwYWNlIHNoYXJlZDsKIAotdXNpbmcgbmFtZXNwYWNlIGJvb3N0OwotCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IHB1YmxpYyBDYWxjdWxhdG9ySWYgewotIHB1YmxpYzoKK3B1YmxpYzoKICAgQ2FsY3VsYXRvckhhbmRsZXIoKSB7fQogCi0gIHZvaWQgcGluZygpIHsKLSAgICBwcmludGYoInBpbmcoKVxuIik7Ci0gIH0KKyAgdm9pZCBwaW5nKCkgeyBjb3V0IDw8ICJwaW5nKCkiIDw8IGVuZGw7IH0KIAogICBpbnQzMl90IGFkZChjb25zdCBpbnQzMl90IG4xLCBjb25zdCBpbnQzMl90IG4yKSB7Ci0gICAgcHJpbnRmKCJhZGQoJWQsJWQpXG4iLCBuMSwgbjIpOworICAgIGNvdXQgPDwgImFkZCgiIDw8IG4xIDw8ICIsICIgPDwgbjIgPDwgIikiIDw8IGVuZGw7CiAgICAgcmV0dXJuIG4xICsgbjI7CiAgIH0KIAotICBpbnQzMl90IGNhbGN1bGF0ZShjb25zdCBpbnQzMl90IGxvZ2lkLCBjb25zdCBXb3JrICZ3b3JrKSB7Ci0gICAgcHJpbnRmKCJjYWxjdWxhdGUoJWQseyVkLCVkLCVkfSlcbiIsIGxvZ2lkLCB3b3JrLm9wLCB3b3JrLm51bTEsIHdvcmsubnVtMik7CisgIGludDMyX3QgY2FsY3VsYXRlKGNvbnN0IGludDMyX3QgbG9naWQsIGNvbnN0IFdvcmsmIHdvcmspIHsKKyAgICBjb3V0IDw8ICJjYWxjdWxhdGUoIiA8PCBsb2dpZCA8PCAiLCAiIDw8IHdvcmsgPDwgIikiIDw8IGVuZGw7CiAgICAgaW50MzJfdCB2YWw7CiAKICAgICBzd2l0Y2ggKHdvcmsub3ApIHsKQEAgLTczLDcgKzcyLDcgQEAKICAgICBjYXNlIE9wZXJhdGlvbjo6RElWSURFOgogICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CiAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW87Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOwogICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgdGhyb3cgaW87CiAgICAgICB9CkBAIC04MSw3NCArODAsMTAwIEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbzsKLSAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcDsKICAgICAgIGlvLndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CiAgICAgICB0aHJvdyBpbzsKICAgICB9CiAKICAgICBTaGFyZWRTdHJ1Y3Qgc3M7CiAgICAgc3Mua2V5ID0gbG9naWQ7Ci0gICAgY2hhciBidWZmZXJbMTJdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCIsIHZhbCk7Ci0gICAgc3MudmFsdWUgPSBidWZmZXI7CisgICAgc3MudmFsdWUgPSB0b19zdHJpbmcodmFsKTsKIAogICAgIGxvZ1tsb2dpZF0gPSBzczsKIAogICAgIHJldHVybiB2YWw7CiAgIH0KIAotICB2b2lkIGdldFN0cnVjdChTaGFyZWRTdHJ1Y3QgJnJldCwgY29uc3QgaW50MzJfdCBsb2dpZCkgewotICAgIHByaW50ZigiZ2V0U3RydWN0KCVkKVxuIiwgbG9naWQpOworICB2b2lkIGdldFN0cnVjdChTaGFyZWRTdHJ1Y3QmIHJldCwgY29uc3QgaW50MzJfdCBsb2dpZCkgeworICAgIGNvdXQgPDwgImdldFN0cnVjdCgiIDw8IGxvZ2lkIDw8ICIpIiA8PCBlbmRsOwogICAgIHJldCA9IGxvZ1tsb2dpZF07CiAgIH0KIAotICB2b2lkIHppcCgpIHsKLSAgICBwcmludGYoInppcCgpXG4iKTsKLSAgfQorICB2b2lkIHppcCgpIHsgY291dCA8PCAiemlwKCkiIDw8IGVuZGw7IH0KIAogcHJvdGVjdGVkOgogICBtYXA8aW50MzJfdCwgU2hhcmVkU3RydWN0PiBsb2c7Ci0KIH07CiAKLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworLyoKKyAgQ2FsY3VsYXRvcklmRmFjdG9yeSBpcyBjb2RlIGdlbmVyYXRlZC4KKyAgQ2FsY3VsYXRvckNsb25lRmFjdG9yeSBpcyB1c2VmdWwgZm9yIGdldHRpbmcgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIgc2lkZSBvZiB0aGUKKyAgdHJhbnNwb3J0LiAgSXQgaXMgYWxzbyB1c2VmdWwgZm9yIG1ha2luZyBwZXItY29ubmVjdGlvbiBzdGF0ZS4gIFdpdGhvdXQgdGhpcworICBDbG9uZUZhY3RvcnksIGFsbCBjb25uZWN0aW9ucyB3aWxsIGVuZCB1cCBzaGFyaW5nIHRoZSBzYW1lIGhhbmRsZXIgaW5zdGFuY2UuCisqLworY2xhc3MgQ2FsY3VsYXRvckNsb25lRmFjdG9yeSA6IHZpcnR1YWwgcHVibGljIENhbGN1bGF0b3JJZkZhY3RvcnkgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q2FsY3VsYXRvckNsb25lRmFjdG9yeSgpIHt9CisgIHZpcnR1YWwgQ2FsY3VsYXRvcklmKiBnZXRIYW5kbGVyKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pCisgIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29jayA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNvY2tldD4oY29ubkluZm8udHJhbnNwb3J0KTsKKyAgICBjb3V0IDw8ICJJbmNvbWluZyBjb25uZWN0aW9uXG4iOworICAgIGNvdXQgPDwgIlx0U29ja2V0SW5mbzogIiAgPDwgc29jay0+Z2V0U29ja2V0SW5mbygpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVySG9zdDogIiAgICA8PCBzb2NrLT5nZXRQZWVySG9zdCgpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVyQWRkcmVzczogIiA8PCBzb2NrLT5nZXRQZWVyQWRkcmVzcygpIDw8ICJcbiI7CisgICAgY291dCA8PCAiXHRQZWVyUG9ydDogIiAgICA8PCBzb2NrLT5nZXRQZWVyUG9ydCgpIDw8ICJcbiI7CisgICAgcmV0dXJuIG5ldyBDYWxjdWxhdG9ySGFuZGxlcjsKKyAgfQorICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIDo6c2hhcmVkOjpTaGFyZWRTZXJ2aWNlSWYqIGhhbmRsZXIpIHsKKyAgICBkZWxldGUgaGFuZGxlcjsKKyAgfQorfTsKIAotICBzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKLSAgc2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4gaGFuZGxlcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSk7Ci0gIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKGhhbmRsZXIpKTsKLSAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCkpOwotICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworaW50IG1haW4oKSB7CisgIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKIAotICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5KTsKLQotCi0gIC8qKgotICAgKiBPciB5b3UgY291bGQgZG8gb25lIG9mIHRoZXNlCi0KLSAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KLSAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKLSAgc2hhcmVkX3B0cjxQb3NpeFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkgPQotICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PihuZXcgUG9zaXhUaHJlYWRGYWN0b3J5KCkpOwotICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwotICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpOwotCi0gIFRUaHJlYWRlZFNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSk7Ci0KKyAgLyoKKyAgLy8gaWYgeW91IGRvbid0IG5lZWQgcGVyLWNvbm5lY3Rpb24gc3RhdGUsIGRvIHRoZSBmb2xsb3dpbmcgaW5zdGVhZAorICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAgICovCiAKLSAgcHJpbnRmKCJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iKTsKKyAgLyoqCisgICAqIEhlcmUgYXJlIHNvbWUgYWx0ZXJuYXRlIHNlcnZlciB0eXBlcy4uLgorCisgIC8vIFRoaXMgc2VydmVyIG9ubHkgYWxsb3dzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZSwgYnV0IHNwYXducyBubyB0aHJlYWRzCisgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBjb25zdCBpbnQgd29ya2VyQ291bnQgPSA0OworCisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KKyAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKKyAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSgKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4oKSk7CisgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CisKKyAgLy8gVGhpcyBzZXJ2ZXIgYWxsb3dzICJ3b3JrZXJDb3VudCIgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGFuZCByZXVzZXMgdGhyZWFkcworICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIoCisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yQ2xvbmVGYWN0b3J5PigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCksCisgICAgdGhyZWFkTWFuYWdlcik7CisgICovCisKKyAgY291dCA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIgPDwgZW5kbDsKICAgc2VydmVyLnNlcnZlKCk7Ci0gIHByaW50ZigiZG9uZS5cbiIpOworICBjb3V0IDw8ICJEb25lLiIgPDwgZW5kbDsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUgYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzRkZWUuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLUJPT1NUX0RJUiA9IC91c3IvbG9jYWwvYm9vc3QvaW5jbHVkZS9ib29zdC0xXzMzXzEvCi1USFJJRlRfRElSID0gL3Vzci9sb2NhbC9pbmNsdWRlL3RocmlmdAotTElCX0RJUiA9IC91c3IvbG9jYWwvbGliCi0KLUdFTl9TUkMgPSAuLi9nZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIC4uL2dlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCAuLi9nZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcCAuLi9nZW4tY3BwL0NhbGN1bGF0b3IuY3BwCi0KLWRlZmF1bHQ6IHNlcnZlciBjbGllbnQKLQotc2VydmVyOiBDcHBTZXJ2ZXIuY3BwCi0JZysrIC1vIENwcFNlcnZlciAtSSR7VEhSSUZUX0RJUn0gLUkke0JPT1NUX0RJUn0gIC1JLi4vZ2VuLWNwcCAtTCR7TElCX0RJUn0gLWx0aHJpZnQgQ3BwU2VydmVyLmNwcCAke0dFTl9TUkN9Ci0KLWNsaWVudDogQ3BwQ2xpZW50LmNwcAotCWcrKyAtbyBDcHBDbGllbnQgLUkke1RIUklGVF9ESVJ9IC1JJHtCT09TVF9ESVJ9ICAtSS4uL2dlbi1jcHAgLUwke0xJQl9ESVJ9IC1sdGhyaWZ0IENwcENsaWVudC5jcHAgJHtHRU5fU1JDfQotCi1jbGVhbjoKLQkkKFJNKSAtciBDcHBDbGllbnQgQ3BwU2VydmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDljZjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDg2IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKK0FVVE9NQUtFX09QVElPTlMgPSBzdWJkaXItb2JqZWN0cyBzZXJpYWwtdGVzdHMKKworQlVJTFRfU09VUkNFUyA9IGdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5jcHAKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidHV0b3JpYWxnZW5jcHAubGEKK25vZGlzdF9saWJ0dXRvcmlhbGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvQ2FsY3VsYXRvci5jcHAgXAorCWdlbi1jcHAvQ2FsY3VsYXRvci5oIFwKKwlnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIFwKKwlnZW4tY3BwL1NoYXJlZFNlcnZpY2UuaCBcCisJZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBcCisJZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmggXAorCWdlbi1jcHAvc2hhcmVkX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC9zaGFyZWRfdHlwZXMuaCBcCisJZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL3R1dG9yaWFsX2NvbnN0YW50cy5oIFwKKwlnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcCBcCisJZ2VuLWNwcC90dXRvcmlhbF90eXBlcy5oCisKKworCitsaWJ0dXRvcmlhbGdlbmNwcF9sYV9MSUJBREQgPSAkKHRvcF9idWlsZGRpcikvbGliL2NwcC9saWJ0aHJpZnQubGEKKworbm9pbnN0X1BST0dSQU1TID0gXAorCVR1dG9yaWFsU2VydmVyIFwKKwlUdXRvcmlhbENsaWVudAorCitUdXRvcmlhbFNlcnZlcl9TT1VSQ0VTID0gXAorCUNwcFNlcnZlci5jcHAKKworVHV0b3JpYWxTZXJ2ZXJfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCitUdXRvcmlhbENsaWVudF9TT1VSQ0VTID0gXAorCUNwcENsaWVudC5jcHAKKworVHV0b3JpYWxDbGllbnRfTERBREQgPSBcCisJbGlidHV0b3JpYWxnZW5jcHAubGEgXAorCSQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYQorCisjCisjIENvbW1vbiB0aHJpZnQgY29kZSBnZW5lcmF0aW9uIHJ1bGVzCisjCitnZW4tY3BwL0NhbGN1bGF0b3IuY3BwIGdlbi1jcHAvU2hhcmVkU2VydmljZS5jcHAgZ2VuLWNwcC9zaGFyZWRfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3NoYXJlZF90eXBlcy5jcHAgZ2VuLWNwcC90dXRvcmlhbF9jb25zdGFudHMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfdHlwZXMuY3BwOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgLXIgJDwKKworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKExJQkVWRU5UX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUlnZW4tY3BwCitBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCitBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKSAkKExJQkVWRU5UX0xERkxBR1MpCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIGdlbi1jcHAvKgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJLi9UdXRvcmlhbFNlcnZlcgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJLi9UdXRvcmlhbENsaWVudAorCitzdHlsZS1sb2NhbDoKKwkkKENQUFNUWUxFX0NNRCkKKworRVhUUkFfRElTVCA9IFwKKwlDTWFrZUxpc3RzLnR4dCBcCisJQ3BwQ2xpZW50LmNwcCBcCisJQ3BwU2VydmVyLmNwcApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcwppbmRleCA4Y2UxMDg1Li4xMTNhNDcyIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jcwpAQCAtMzcsNDUgKzM3LDUwIEBACiAgICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KHByb3RvY29sKTsKIAogICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5PcGVuKCk7Ci0KLSAgICAgICAgICAgICAgICBjbGllbnQucGluZygpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKLQotICAgICAgICAgICAgICAgIGludCBzdW0gPSBjbGllbnQuYWRkKDEsIDEpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxKzE9ezB9Iiwgc3VtKTsKLQotICAgICAgICAgICAgICAgIFdvcmsgd29yayA9IG5ldyBXb3JrKCk7Ci0KLSAgICAgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRJVklERTsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTEgPSAxOwotICAgICAgICAgICAgICAgIHdvcmsuTnVtMiA9IDA7CiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgcXVvdGllbnQgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiSW52YWxpZCBvcGVyYXRpb246ICIgKyBpby5XaHkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LnBpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInBpbmcoKSIpOwogCi0gICAgICAgICAgICAgICAgd29yay5PcCA9IE9wZXJhdGlvbi5TVUJUUkFDVDsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKLSAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjE1LTEwPXswfSIsIGRpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvLldoeSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQgc3VtID0gY2xpZW50LmFkZCgxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIjErMT17MH0iLCBzdW0pOwogCi0gICAgICAgICAgICAgICAgU2hhcmVkU3RydWN0IGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNoZWNrIGxvZzogezB9IiwgbG9nLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKIAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLkRJVklERTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0xID0gMTsKKyAgICAgICAgICAgICAgICAgICAgd29yay5OdW0yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICAgICAgICAgIHdvcmsuTnVtMSA9IDE1OworICAgICAgICAgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWZmID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIxNS0xMD17MH0iLCBkaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8uV2h5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBsb2cgPSBjbGllbnQuZ2V0U3RydWN0KDEpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ2hlY2sgbG9nOiB7MH0iLCBsb2cuVmFsdWUpOworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvQ3NoYXJwQ2xpZW50LmNzcHJvagppbmRleCA1MTdhZDgzLi4xZWE3ZmY2IDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L0NzaGFycENsaWVudC5jc3Byb2oKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Dc2hhcnBDbGllbnQuY3Nwcm9qCkBAIC0xLDg4ICsxLDExMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQotICAgIDxQcm9qZWN0R3VpZD57MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfTwvUHJvamVjdEd1aWQ+DQotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4NCi0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KLSAgICA8Um9vdE5hbWVzcGFjZT5Dc2hhcnBDbGllbnQ8L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwQ2xpZW50PC9Bc3NlbWJseU5hbWU+DQotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCi0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+DQotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCi0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCi0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPg0KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCi0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQotICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXGJpblxSZWxlYXNlXFRocmlmdC5kbGw8L0hpbnRQYXRoPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwQ2xpZW50LmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXENvbnN0YW50cy5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxXb3JrLmNzIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICAtLT4NCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/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+CisgIC0tPgogPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGZmYmM0MGQuLjFmZjY1OGMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMSw1NSArMSw1NSBAQAotLyoNCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotDQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247DQotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7DQotDQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZw0KLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uDQotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5Lg0KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwQ2xpZW50IildDQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJDc2hhcnBDbGllbnQiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildDQotDQotLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlDQotLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQ0KLS8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4NCi1bYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQ0KLQ0KLS8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQ0KLVthc3NlbWJseTogR3VpZCgiMWE0NjEyMTQtZmEyOC00NTJhLWJkMWQtZDIzY2E4ZTk0N2UzIildDQotDQotLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoNCi0vLw0KLS8vICAgICAgTWFqb3IgVmVyc2lvbg0KLS8vICAgICAgTWlub3IgVmVyc2lvbg0KLS8vICAgICAgQnVpbGQgTnVtYmVyDQotLy8gICAgICBSZXZpc2lvbg0KLS8vDQotLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMNCi0vLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93Og0KLS8vIFthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuKiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildDQorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCitbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIkNzaGFycENsaWVudCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCitbYXNzZW1ibHk6IEd1aWQoIjFhNDYxMjE0LWZhMjgtNDUyYS1iZDFkLWQyM2NhOGU5NDdlMyIpXQorCisvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgorLy8KKy8vICAgICAgTWFqb3IgVmVyc2lvbgorLy8gICAgICBNaW5vciBWZXJzaW9uCisvLyAgICAgIEJ1aWxkIE51bWJlcgorLy8gICAgICBSZXZpc2lvbgorLy8KKy8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCisvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgorLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jcyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCmluZGV4IDBkMzdjOTkuLjQzOTc5MGEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCisrKyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzCkBAIC0xNSwxMTUgKzE1LDExNSBAQAogICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovDQotDQotdXNpbmcgU3lzdGVtOw0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOw0KLXVzaW5nIFRocmlmdC5TZXJ2ZXI7DQotdXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsNCi0NCi1uYW1lc3BhY2UgQ1NoYXJwVHV0b3JpYWwNCi17DQotICAgIHB1YmxpYyBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlciA6IENhbGN1bGF0b3IuSWZhY2UNCi0gICAgew0KLSAgICAgICAgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gbG9nOw0KLQ0KLSAgICAgICAgcHVibGljIENhbGN1bGF0b3JIYW5kbGVyKCkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBsb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHBpbmcoKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKQ0KLSAgICAgICAgew0KLSAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJhZGQoezB9LHsxfSkiLCBuMSwgbjIpOw0KLSAgICAgICAgICAgIHJldHVybiBuMSArIG4yOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspDQotICAgICAgICB7DQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImNhbGN1bGF0ZSh7MH0sIFt7MX0sezJ9LHszfV0pIiwgbG9naWQsIHdvcmsuT3AsIHdvcmsuTnVtMSwgd29yay5OdW0yKTsNCi0gICAgICAgICAgICBpbnQgdmFsID0gMDsNCi0gICAgICAgICAgICBzd2l0Y2ggKHdvcmsuT3ApDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKyB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uU1VCVFJBQ1Q6DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLSB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOg0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmsuTnVtMiA9PSAwKQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoYXQgPSAoaW50KXdvcmsuT3A7DQotICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLyB3b3JrLk51bTI7DQotICAgICAgICAgICAgICAgICAgICBicmVhazsNCi0NCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoNCi0gICAgICAgICAgICAgICAgICAgIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0ID0gKGludCl3b3JrLk9wOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlvLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiI7DQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87DQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgfQ0KLQ0KLSAgICAgICAgICAgIFNoYXJlZFN0cnVjdCBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsNCi0gICAgICAgICAgICBlbnRyeS5LZXkgPSBsb2dpZDsNCi0gICAgICAgICAgICBlbnRyeS5WYWx1ZSA9IHZhbC5Ub1N0cmluZygpOw0KLSAgICAgICAgICAgIGxvZ1tsb2dpZF0gPSBlbnRyeTsNCi0NCi0gICAgICAgICAgICByZXR1cm4gdmFsOw0KLSAgICAgICAgfQ0KLQ0KLSAgICAgICAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkNCi0gICAgICAgIHsNCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZ2V0U3RydWN0KHswfSkiLCBrZXkpOw0KLSAgICAgICAgICAgIHJldHVybiBsb2dba2V5XTsNCi0gICAgICAgIH0NCi0NCi0gICAgICAgIHB1YmxpYyB2b2lkIHppcCgpDQotICAgICAgICB7DQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInppcCgpIik7DQotICAgICAgICB9DQotICAgIH0NCi0NCi0gICAgcHVibGljIGNsYXNzIENTaGFycFNlcnZlcg0KLSAgICB7DQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpDQotICAgICAgICB7DQotICAgICAgICAgICAgdHJ5DQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7DQotICAgICAgICAgICAgICAgIENhbGN1bGF0b3IuUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKTsNCi0gICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsNCi0gICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7DQotDQotICAgICAgICAgICAgICAgIC8vIFVzZSB0aGlzIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyDQotICAgICAgICAgICAgICAgIC8vIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7DQotDQotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7DQotICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSh4LlN0YWNrVHJhY2UpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsNCi0gICAgICAgIH0NCi0gICAgfQ0KLX0NCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydDsKKworbmFtZXNwYWNlIENTaGFycFR1dG9yaWFsCit7CisgICAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JIYW5kbGVyIDogQ2FsY3VsYXRvci5JZmFjZQorICAgIHsKKyAgICAgICAgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gbG9nOworCisgICAgICAgIHB1YmxpYyBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJwaW5nKCkiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgYWRkKGludCBuMSwgaW50IG4yKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiYWRkKHswfSx7MX0pIiwgbjEsIG4yKTsKKyAgICAgICAgICAgIHJldHVybiBuMSArIG4yOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBjYWxjdWxhdGUoaW50IGxvZ2lkLCBXb3JrIHdvcmspCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJjYWxjdWxhdGUoezB9LCBbezF9LHsyfSx7M31dKSIsIGxvZ2lkLCB3b3JrLk9wLCB3b3JrLk51bTEsIHdvcmsuTnVtMik7CisgICAgICAgICAgICBpbnQgdmFsID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAod29yay5PcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSArIHdvcmsuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgICAgICBpZiAod29yay5OdW0yID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRPcGVyYXRpb24gaW8gPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2hhdE9wID0gKGludCl3b3JrLk9wOworICAgICAgICAgICAgICAgICAgICAgICAgaW8uV2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCI7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLyB3b3JrLk51bTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaGF0T3AgPSAoaW50KXdvcmsuT3A7CisgICAgICAgICAgICAgICAgICAgICAgICBpby5XaHkgPSAiVW5rbm93biBvcGVyYXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgaW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2hhcmVkU3RydWN0IGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgICAgICAgICAgZW50cnkuS2V5ID0gbG9naWQ7CisgICAgICAgICAgICBlbnRyeS5WYWx1ZSA9IHZhbC5Ub1N0cmluZygpOworICAgICAgICAgICAgbG9nW2xvZ2lkXSA9IGVudHJ5OworCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNoYXJlZFN0cnVjdCBnZXRTdHJ1Y3QoaW50IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoImdldFN0cnVjdCh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgIHJldHVybiBsb2dba2V5XTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHppcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ6aXAoKSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENTaGFycFNlcnZlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDYWxjdWxhdG9ySGFuZGxlciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgQ2FsY3VsYXRvci5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7CisgICAgICAgICAgICAgICAgVFNlcnZlciBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhpcyBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICAgICAgICAgICAgIC8vIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvQ3NoYXJwU2VydmVyLmNzcHJvagppbmRleCBhYTJhYzE1Li4wNzQ4MTgwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL0NzaGFycFNlcnZlci5jc3Byb2oKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Dc2hhcnBTZXJ2ZXIuY3Nwcm9qCkBAIC0xLDg4ICsxLDExMSBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tDQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iMy41IiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KLSAgPFByb3BlcnR5R3JvdXA+DQotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPg0KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+DQotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPg0KLSAgICA8U2NoZW1hVmVyc2lvbj4yLjA8L1NjaGVtYVZlcnNpb24+DQotICAgIDxQcm9qZWN0R3VpZD57NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fTwvUHJvamVjdEd1aWQ+DQotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4NCi0gICAgPEFwcERlc2lnbmVyRm9sZGVyPlByb3BlcnRpZXM8L0FwcERlc2lnbmVyRm9sZGVyPg0KLSAgICA8Um9vdE5hbWVzcGFjZT5Dc2hhcnBTZXJ2ZXI8L1Jvb3ROYW1lc3BhY2U+DQotICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwU2VydmVyPC9Bc3NlbWJseU5hbWU+DQotICAgIDxUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPnYzLjU8L1RhcmdldEZyYW1ld29ya1ZlcnNpb24+DQotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnRGVidWd8QW55Q1BVJyAiPg0KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4NCi0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT5mYWxzZTwvT3B0aW1pemU+DQotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1Z1w8L091dHB1dFBhdGg+DQotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4NCi0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+DQotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPg0KLSAgPC9Qcm9wZXJ0eUdyb3VwPg0KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4NCi0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+DQotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4NCi0gICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPg0KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+DQotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0Pg0KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4NCi0gIDwvUHJvcGVydHlHcm91cD4NCi0gIDxJdGVtR3JvdXA+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db3JlIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbC5MaW5xIj4NCi0gICAgICA8UmVxdWlyZWRUYXJnZXRGcmFtZXdvcms+My41PC9SZXF1aXJlZFRhcmdldEZyYW1ld29yaz4NCi0gICAgPC9SZWZlcmVuY2U+DQotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRhdGEuRGF0YVNldEV4dGVuc2lvbnMiPg0KLSAgICAgIDxSZXF1aXJlZFRhcmdldEZyYW1ld29yaz4zLjU8L1JlcXVpcmVkVGFyZ2V0RnJhbWV3b3JrPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRGF0YSIgLz4NCi0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uWG1sIiAvPg0KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlRocmlmdCwgVmVyc2lvbj0wLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIHByb2Nlc3NvckFyY2hpdGVjdHVyZT1NU0lMIj4NCi0gICAgICA8U3BlY2lmaWNWZXJzaW9uPkZhbHNlPC9TcGVjaWZpY1ZlcnNpb24+DQotICAgICAgPEhpbnRQYXRoPi4uXC4uXC4uXGxpYlxjc2hhcnBcc3JjXGJpblxSZWxlYXNlXFRocmlmdC5kbGw8L0hpbnRQYXRoPg0KLSAgICA8L1JlZmVyZW5jZT4NCi0gIDwvSXRlbUdyb3VwPg0KLSAgPEl0ZW1Hcm91cD4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwU2VydmVyLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxDYWxjdWxhdG9yLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXENvbnN0YW50cy5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxJbnZhbGlkT3BlcmF0aW9uLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXE9wZXJhdGlvbi5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxTaGFyZWRTZXJ2aWNlLmNzIiAvPg0KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSIuLlwuLlxnZW4tY3NoYXJwXFNoYXJlZFN0cnVjdC5jcyIgLz4NCi0gICAgPENvbXBpbGUgSW5jbHVkZT0iLi5cLi5cZ2VuLWNzaGFycFxXb3JrLmNzIiAvPg0KLSAgPC9JdGVtR3JvdXA+DQotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPg0KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gDQotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4NCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPg0KLSAgPC9UYXJnZXQ+DQotICAtLT4NCivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8UHJvamVjdCBUb29sc1ZlcnNpb249IjMuNSIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CisgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KKyAgICA8UHJvamVjdEd1aWQ+ezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH08L1Byb2plY3RHdWlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+CisgICAgPFJvb3ROYW1lc3BhY2U+Q3NoYXJwU2VydmVyPC9Sb290TmFtZXNwYWNlPgorICAgIDxBc3NlbWJseU5hbWU+Q3NoYXJwU2VydmVyPC9Bc3NlbWJseU5hbWU+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+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iQ3NoYXJwU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcY3NoYXJwXHNyY1xUaHJpZnQuY3Nwcm9qIj4KKyAgICAgIDxQcm9qZWN0Pns0OTllYjYzYy1kNzRjLTQ3ZTgtYWU0OC1hMmZjOTQ1MzhlOWR9PC9Qcm9qZWN0PgorICAgICAgPE5hbWU+VGhyaWZ0PC9OYW1lPgorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KKyAgPC9JdGVtR3JvdXA+CisgIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxQcmVCdWlsZEV2ZW50PnB1c2hkICIkKFNvbHV0aW9uRGlyKSIKK3RocmlmdCAgLWdlbiBjc2hhcnAgICAtciAgLi4vdHV0b3JpYWwudGhyaWZ0Citwb3BkCisKKzwvUHJlQnVpbGRFdmVudD4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LgorICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KKyAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+CisgIDwvVGFyZ2V0PgorICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgorICA8L1RhcmdldD4KKyAgLS0+CiA8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggOTk4MTE2My4uNzRmYTQ3NiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0xLDU1ICsxLDU1IEBACi0vKg0KLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKg0KLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICoNCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi0NCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsNCi11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOw0KLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsNCi0NCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nDQotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24NCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuDQotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkNzaGFycFNlcnZlciIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAyMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQ0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0NCi0NCi0vLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUNCi0vLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tDQotLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLg0KLVthc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldDQotDQotLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NDQotW2Fzc2VtYmx5OiBHdWlkKCJlM2I0MjhmNC1iMmU5LTRmYzEtOGEzNC04NGFiYzQzMzk4NjAiKV0NCi0NCi0vLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOg0KLS8vDQotLy8gICAgICBNYWpvciBWZXJzaW9uDQotLy8gICAgICBNaW5vciBWZXJzaW9uDQotLy8gICAgICBCdWlsZCBOdW1iZXINCi0vLyAgICAgIFJldmlzaW9uDQotLy8NCi0vLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycw0KLS8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6DQotLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildDQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0NCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0NCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KK1thc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQ3NoYXJwU2VydmVyIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KK1thc3NlbWJseTogR3VpZCgiZTNiNDI4ZjQtYjJlOS00ZmMxLThhMzQtODRhYmM0MzM5ODYwIildCisKKy8vIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGFuIGFzc2VtYmx5IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZm91ciB2YWx1ZXM6CisvLworLy8gICAgICBNYWpvciBWZXJzaW9uCisvLyAgICAgIE1pbm9yIFZlcnNpb24KKy8vICAgICAgQnVpbGQgTnVtYmVyCisvLyAgICAgIFJldmlzaW9uCisvLworLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKKy8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CisvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4gYi90dXRvcmlhbC9jc2hhcnAvdHV0b3JpYWwuc2xuCmluZGV4IDVjMDNlN2MuLmVjNTdhMTggMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC90dXRvcmlhbC5zbG4KKysrIGIvdHV0b3JpYWwvY3NoYXJwL3R1dG9yaWFsLnNsbgpAQCAtMSwzOSArMSwzOSBAQAot77u/DQotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTEuMDANCi0jIFZpc3VhbCBTdHVkaW8gMjAxMA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iDQotRW5kUHJvamVjdA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQ3NoYXJwQ2xpZW50IiwgIkNzaGFycENsaWVudFxDc2hhcnBDbGllbnQuY3Nwcm9qIiwgInsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9Ig0KLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9DQotCQl7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fSA9IHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9DQotCUVuZFByb2plY3RTZWN0aW9uDQotRW5kUHJvamVjdA0KLVByb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiQ3NoYXJwU2VydmVyIiwgIkNzaGFycFNlcnZlclxDc2hhcnBTZXJ2ZXIuY3Nwcm9qIiwgIns2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9Ig0KLQlQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0DQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfSA9IHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9DQotCUVuZFByb2plY3RTZWN0aW9uDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUNCi0JCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotCUdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uDQotCQl7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCi0JCXsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCi0JCXsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQotCQl7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCi0JCXs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCi0JCXs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUNCi0JCXs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQor77u/CitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMS4wMAorIyBWaXN1YWwgU3R1ZGlvIDIwMTAKK1Byb2plY3QoIntGQUUwNEVDMC0zMDFGLTExRDMtQkY0Qi0wMEMwNEY3OUVGQkN9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxjc2hhcnBcc3JjXFRocmlmdC5jc3Byb2oiLCAiezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNzaGFycENsaWVudCIsICJDc2hhcnBDbGllbnRcQ3NoYXJwQ2xpZW50LmNzcHJvaiIsICJ7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfSIKKyAgICBQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0KKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0gPSB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fQorICAgIEVuZFByb2plY3RTZWN0aW9uCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIkNzaGFycFNlcnZlciIsICJDc2hhcnBTZXJ2ZXJcQ3NoYXJwU2VydmVyLmNzcHJvaiIsICJ7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fSIKKyAgICBQcm9qZWN0U2VjdGlvbihQcm9qZWN0RGVwZW5kZW5jaWVzKSA9IHBvc3RQcm9qZWN0CisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9ID0gezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0KKyAgICBFbmRQcm9qZWN0U2VjdGlvbgorRW5kUHJvamVjdAorR2xvYmFsCisgICAgR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24KKyAgICAgICAgRGVidWd8QW55IENQVSA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgRW5kR2xvYmFsU2VjdGlvbgorICAgIEdsb2JhbFNlY3Rpb24oUHJvamVjdENvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcG9zdFNvbHV0aW9uCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorICAgICAgICB7NDk5RUI2M0MtRDc0Qy00N0U4LUFFNDgtQTJGQzk0NTM4RTlEfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHs0OTlFQjYzQy1ENzRDLTQ3RTgtQUU0OC1BMkZDOTQ1MzhFOUR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezQ5OUVCNjNDLUQ3NEMtNDdFOC1BRTQ4LUEyRkM5NDUzOEU5RH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisgICAgICAgIHsxOEYyNDA4Ny00NzYwLTQzREEtQUNBQi03QjlGMEUwOTZCMTF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezE4RjI0MDg3LTQ3NjAtNDNEQS1BQ0FCLTdCOUYwRTA5NkIxMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7MThGMjQwODctNDc2MC00M0RBLUFDQUItN0I5RjBFMDk2QjExfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKyAgICAgICAgezY2NzA3QkFFLUJCRjktNEYwMy1CNTNFLUJFM0FENTgzMjJGOH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorICAgICAgICB7NjY3MDdCQUUtQkJGOS00RjAzLUI1M0UtQkUzQUQ1ODMyMkY4fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgICAgIHs2NjcwN0JBRS1CQkY5LTRGMDMtQjUzRS1CRTNBRDU4MzIyRjh9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisgICAgRW5kR2xvYmFsU2VjdGlvbgorICAgIEdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisgICAgICAgIEhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorICAgIEVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZC9NYWtlZmlsZSBiL3R1dG9yaWFsL2QvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZWU5YWYuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1MSUJfRF9ESVIgPSAuLi8uLi9saWIvZAotCi1HRU5fU1JDID0gLi4vZ2VuLWQvc2hhcmUvU2hhcmVkU2VydmljZS5kIC4uL2dlbi1kL3NoYXJlL3NoYXJlZF90eXBlcy5kIFwKLQkuLi9nZW4tZC90dXRvcmlhbC90dXRvcmlhbF90eXBlcy5kIC4uL2dlbi1kL3R1dG9yaWFsL0NhbGN1bGF0b3IuZAotCi1kZWZhdWx0OiBzZXJ2ZXIgY2xpZW50IGFzeW5jX2NsaWVudAotCi1zZXJ2ZXI6IHNlcnZlci5kCi0JZG1kIC1JJHtMSUJfRF9ESVJ9L3NyYyAtTC1MJHtMSUJfRF9ESVJ9IC1MLWx0aHJpZnRkIHNlcnZlci5kICR7R0VOX1NSQ30KLQotY2xpZW50OiBjbGllbnQuZAotCWRtZCAtSSR7TElCX0RfRElSfS9zcmMgLUwtTCR7TElCX0RfRElSfSAtTC1sdGhyaWZ0ZCBjbGllbnQuZCAke0dFTl9TUkN9Ci0KLWFzeW5jX2NsaWVudDogYXN5bmNfY2xpZW50LmQKLQlkbWQgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQtZXZlbnQgLUwtbHRocmlmdGQgLUwtbGV2ZW50IGFzeW5jX2NsaWVudC5kICR7R0VOX1NSQ30KLQotY2xlYW46Ci0JJChSTSkgLWYgc2VydmVyIGNsaWVudCBhc3luY19jbGllbnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2QvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzhiMjkKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitMSUJfRF9ESVIgPSAkKHRvcF9zcmNkaXIpL2xpYi9kCisKK0dFTl9TUkMgPSBnZW4tZC9zaGFyZS9TaGFyZWRTZXJ2aWNlLmQgZ2VuLWQvc2hhcmUvc2hhcmVkX3R5cGVzLmQgXAorCWdlbi1kL3R1dG9yaWFsL3R1dG9yaWFsX3R5cGVzLmQgZ2VuLWQvdHV0b3JpYWwvQ2FsY3VsYXRvci5kCisKKyQoR0VOX1NSQyk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gZCAtciAkPAorCitzZXJ2ZXI6IHNlcnZlci5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgc2VydmVyLmQgJHtHRU5fU1JDfQorCitjbGllbnQ6IGNsaWVudC5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQgY2xpZW50LmQgJHtHRU5fU1JDfQorCitQUk9HUyA9IHNlcnZlciBjbGllbnQKKworaWYgV0lUSF9EX0VWRU5UX1RFU1RTCithc3luY19jbGllbnQ6IGFzeW5jX2NsaWVudC5kICQoR0VOX1NSQykKKwkkKERNRCkgLUkke0xJQl9EX0RJUn0vc3JjIC1MLUwke0xJQl9EX0RJUn0gLUwtbHRocmlmdGQtZXZlbnQgLUwtbHRocmlmdGQgLUwtbGV2ZW50IGFzeW5jX2NsaWVudC5kICR7R0VOX1NSQ30KKworUFJPR1MgKz0gYXN5bmNfY2xpZW50CitlbmRpZgorCithbGwtbG9jYWw6ICQoUFJPR1MpCisKK2NsZWFuOgorCSQoUk0pIC1mICQoUFJPR1MpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kL3NlcnZlci5kIGIvdHV0b3JpYWwvZC9zZXJ2ZXIuZAppbmRleCBkMzJiOTM3Li5jYmNlZGNjIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kL3NlcnZlci5kCisrKyBiL3R1dG9yaWFsL2Qvc2VydmVyLmQKQEAgLTYyLDcgKzYyLDcgQEAKICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CiAgICAgICBpZiAod29yay5udW0yID09IDApIHsKICAgICAgICAgYXV0byBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICAgIGlvLndoYXQgPSB3b3JrLm9wOworICAgICAgICBpby53aGF0T3AgPSB3b3JrLm9wOwogICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgdGhyb3cgaW87CiAgICAgICB9CkBAIC03MCw3ICs3MCw3IEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgYXV0byBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICBpby53aGF0ID0gd29yay5vcDsKKyAgICAgIGlvLndoYXRPcCA9IHdvcmsub3A7CiAgICAgICBpby53aHkgPSAiSW52YWxpZCBPcGVyYXRpb24iOwogICAgICAgdGhyb3cgaW87CiAgICAgfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5NWFjYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw3MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JVSUxUX1NPVVJDRVMgPSBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0CisKK2dlbi1kYXJ0L3R1dG9yaWFsL2xpYi90dXRvcmlhbC5kYXJ0IGdlbi1kYXJ0L3NoYXJlZC9saWIvc2hhcmVkLmRhcnQ6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBwdWItZ2V0CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisJZmluZCAuIC10eXBlIGQgLW5hbWUgInBhY2thZ2VzIiB8IHhhcmdzICQoUk0pIC1yCisJZmluZCAuIC10eXBlIGYgLW5hbWUgIi5wYWNrYWdlcyIgfCB4YXJncyAkKFJNKQorCWZpbmQgLiAtdHlwZSBmIC1uYW1lICJwdWJzcGVjLmxvY2siIHwgeGFyZ3MgJChSTSkKKworcHViLWdldDogcHViLWdldC1nZW4gcHViLWdldC1jbGllbnQgcHViLWdldC1jb25zb2xlLWNsaWVudCBwdWItZ2V0LXNlcnZlcgorCitwdWItZ2V0LWdlbjogcHViLWdldC10dXRvcmlhbCBwdWItZ2V0LXNoYXJlZAorCitwdWItZ2V0LXR1dG9yaWFsOiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydAorCWNkIGdlbi1kYXJ0L3R1dG9yaWFsOyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNoYXJlZDogZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAorCWNkIGdlbi1kYXJ0L3NoYXJlZDsgJHtEQVJUUFVCfSBnZXQKKworcHViLWdldC1jbGllbnQ6CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LWNvbnNvbGUtY2xpZW50OgorCWNkIGNvbnNvbGVfY2xpZW50OyAke0RBUlRQVUJ9IGdldAorCitwdWItZ2V0LXNlcnZlcjoKKwljZCBzZXJ2ZXI7ICR7REFSVFBVQn0gZ2V0CisKK3R1dG9yaWFsc2VydmVyOiBwdWItZ2V0LWdlbiBwdWItZ2V0LXNlcnZlcgorCSR7REFSVH0gc2VydmVyL2Jpbi9tYWluLmRhcnQKKwordHV0b3JpYWxjbGllbnQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50CisJY2QgY2xpZW50OyAke0RBUlRQVUJ9IHNlcnZlCisKK3R1dG9yaWFsY29uc29sZWNsaWVudDogcHViLWdldC1jb25zb2xlLWNsaWVudAorCSR7REFSVH0gY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydAorCitFWFRSQV9ESVNUID0gXAorCWNsaWVudC93ZWIvY2xpZW50LmRhcnQgXAorCWNsaWVudC93ZWIvaW5kZXguaHRtbCBcCisJY2xpZW50L3dlYi9zdHlsZXMuY3NzIFwKKwljbGllbnQvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IFwKKwljb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgXAorCXNlcnZlci9iaW4vbWFpbi5kYXJ0IFwKKwlzZXJ2ZXIvcHVic3BlYy55YW1sIFwKKwljb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucyBcCisJY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwlzZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2J1aWxkLnNoIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJlMDRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9idWlsZC5zaApAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXQgLWU7CitybSAtciBnZW4tZGFydCB8fCB0cnVlOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi9zaGFyZWQudGhyaWZ0OworY2QgZ2VuLWRhcnQvc2hhcmVkOworcHViIGdldDsKK2NkIC4uLy4uOworCit0aHJpZnQgLS1nZW4gZGFydCAuLi90dXRvcmlhbC50aHJpZnQ7CitjZCBnZW4tZGFydC90dXRvcmlhbDsKK3B1YiBnZXQ7CitjZCAuLi8uLjsKKworY2QgY2xpZW50OworcHViIGdldDsKK2NkIC4uOworCitjZCBjb25zb2xlX2NsaWVudDsKK3B1YiBnZXQ7CitjZCAuLjsKKworY2Qgc2VydmVyOworcHViIGdldDsKK2NkIC4uOworCitkYXJ0Zm10IC13IGdlbi1kYXJ0OworCitlY2hvICJcbkVuam95IHRoZSBEYXJ0IHR1dG9yaWFsISI7CitlY2hvICJcblRvIHJ1biB0aGUgc2VydmVyOiI7CitlY2hvICI+IGRhcnQgc2VydmVyL2Jpbi9tYWluLmRhcnQiOworZWNobyAiXG5UbyBydW4gdGhlIGNsaWVudDoiOworZWNobyAiIyBTZXJ2ZSB0aGUgYXBwIGZyb20gdGhlIGNsaWVudCBkaXJlY3RvcnkgYW5kIHZpZXcgaW4gYSBicm93c2VyIjsKK2VjaG8gIj4gY2QgY2xpZW50OyI7CitlY2hvICI+IHB1YiBzZXJ2ZTsiOworZWNobyAiXG5UbyBydW4gdGhlIGNvbnNvbGUgY2xpZW50OiI7CitlY2hvICI+IGRhcnQgY29uc29sZV9jbGllbnQvYmluL21haW4uZGFydCI7CitlY2hvICIiOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0wLDAgKzEsMzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZTogdHV0b3JpYWxfY2xpZW50Cit2ZXJzaW9uOiAxLjAuMAorZGVzY3JpcHRpb246IEEgRGFydCBjbGllbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKK2F1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Citob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCisKK2Vudmlyb25tZW50OgorICBzZGs6ICI+PTEuMTMuMCA8Mi4wLjAiCisKK2RlcGVuZGVuY2llczoKKyAgYnJvd3NlcjogXjAuMTAuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2NsaWVudC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDJkMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvY2xpZW50LmRhcnQKQEAgLTAsMCArMSwyNzggQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6aHRtbCc7CisKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnRfYnJvd3Nlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpzaGFyZWQvc2hhcmVkLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworCisvLy8gQWRhcHRlZCBmcm9tIHRoZSBBUzMgdHV0b3JpYWwKK3ZvaWQgbWFpbigpIHsKKyAgbmV3IENhbGN1bGF0b3JVSShxdWVyeVNlbGVjdG9yKCcjb3V0cHV0JykpLnN0YXJ0KCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JVSSB7CisgIGZpbmFsIERpdkVsZW1lbnQgb3V0cHV0OworCisgIENhbGN1bGF0b3JVSSh0aGlzLm91dHB1dCk7CisKKyAgVFRyYW5zcG9ydCBfdHJhbnNwb3J0OworICBDYWxjdWxhdG9yIF9jYWxjdWxhdG9yQ2xpZW50OworCisgIHZvaWQgc3RhcnQoKSB7CisgICAgX2J1aWxkSW50ZXJmYWNlKCk7CisgICAgX2luaXRDb25uZWN0aW9uKCk7CisgIH0KKworICB2b2lkIF92YWxpZGF0ZSgpIHsKKyAgICBpZiAoIV90cmFuc3BvcnQuaXNPcGVuKSB7CisgICAgICB3aW5kb3cuYWxlcnQoIlRoZSB0cmFuc3BvcnQgaXMgbm90IG9wZW4hIik7CisgICAgfQorICB9CisKKyAgdm9pZCBfaW5pdENvbm5lY3Rpb24oKSB7CisgICAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgIG5ldyBUV2ViU29ja2V0KFVyaS5wYXJzZSgnd3M6Ly8xMjcuMC4wLjE6OTA5MC93cycpKSwKKyAgICAgICAgbmV3IFRNZXNzYWdlUmVhZGVyKG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICAgIF90cmFuc3BvcnQub3BlbigpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQgPSBuZXcgQ2FsY3VsYXRvckNsaWVudChwcm90b2NvbCk7CisgIH0KKworICB2b2lkIF9idWlsZEludGVyZmFjZSgpIHsKKyAgICBvdXRwdXQuY2hpbGRyZW4uZm9yRWFjaCgoZSkgeworICAgICAgZS5yZW1vdmUoKTsKKyAgICB9KTsKKworICAgIF9idWlsZFBpbmdDb21wb25lbnQoKTsKKworICAgIF9idWlsZEFkZENvbXBvbmVudCgpOworCisgICAgX2J1aWxkQ2FsY3VsYXRvckNvbXBvbmVudCgpOworCisgICAgX2J1aWxkR2V0U3RydWN0Q29tcG9uZW50KCk7CisgIH0KKworICB2b2lkIF9idWlsZFBpbmdDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJQaW5nIik7CisgICAgQnV0dG9uRWxlbWVudCBwaW5nQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIlBJTkciCisgICAgICAuLm9uQ2xpY2subGlzdGVuKF9vblBpbmdDbGljayk7CisgICAgb3V0cHV0LmFwcGVuZChwaW5nQnV0dG9uKTsKKyAgfQorCisgIHZvaWQgX29uUGluZ0NsaWNrKE1vdXNlRXZlbnQgZSkgeworICAgIF92YWxpZGF0ZSgpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQucGluZygpOworICB9CisKKyAgdm9pZCBfYnVpbGRBZGRDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJBZGQiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMSA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQxIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0xKTsKKyAgICBTcGFuRWxlbWVudCBvcCA9IG5ldyBTcGFuRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGQyIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTIpOworICAgIEJ1dHRvbkVsZW1lbnQgYWRkQnV0dG9uID0gbmV3IEJ1dHRvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIj0iCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uQWRkQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoYWRkQnV0dG9uKTsKKyAgICBTcGFuRWxlbWVudCByZXN1bHQgPSBuZXcgU3BhbkVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJhZGRSZXN1bHQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25BZGRDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2FkZDEiKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IHF1ZXJ5U2VsZWN0b3IoIiNhZGQyIik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gcXVlcnlTZWxlY3RvcigiI2FkZFJlc3VsdCIpOworCisgICAgX2NhbGN1bGF0b3JDbGllbnQKKyAgICAgICAgLmFkZChpbnQucGFyc2UobnVtMS52YWx1ZSksIGludC5wYXJzZShudW0yLnZhbHVlKSkKKyAgICAgICAgLnRoZW4oKGludCBuKSB7CisgICAgICByZXN1bHQudGV4dCA9ICIkbiI7CisgICAgfSk7CisgIH0KKworICB2b2lkIF9idWlsZENhbGN1bGF0b3JDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJDYWxjdWxhdG9yIik7CisgICAgSW5wdXRFbGVtZW50IG51bTEgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsYzEiCisgICAgICAuLnR5cGUgPSAibnVtYmVyIgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICI1MHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKG51bTEpOworICAgIFNlbGVjdEVsZW1lbnQgb3AgPSBuZXcgU2VsZWN0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNhbGNPcCIKKyAgICAgIC4ubXVsdGlwbGUgPSBmYWxzZQorICAgICAgLi5zZWxlY3RlZEluZGV4ID0gMAorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNnB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiOworICAgIE9wdGlvbkVsZW1lbnQgYWRkT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiKyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uQURELnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGFkZE9wLCAwKTsKKyAgICBPcHRpb25FbGVtZW50IHN1YnRyYWN0T3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLSIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uU1VCVFJBQ1QudG9TdHJpbmcoKTsKKyAgICBvcC5hZGQoc3VidHJhY3RPcCwgMSk7CisgICAgT3B0aW9uRWxlbWVudCBtdWx0aXBseU9wID0gbmV3IE9wdGlvbkVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIioiCisgICAgICAuLnZhbHVlID0gT3BlcmF0aW9uLk1VTFRJUExZLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKG11bHRpcGx5T3AsIDIpOworICAgIE9wdGlvbkVsZW1lbnQgZGl2aWRlT3AgPSBuZXcgT3B0aW9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiLyIKKyAgICAgIC4udmFsdWUgPSBPcGVyYXRpb24uRElWSURFLnRvU3RyaW5nKCk7CisgICAgb3AuYWRkKGRpdmlkZU9wLCAzKTsKKyAgICBvdXRwdXQuYXBwZW5kKG9wKTsKKyAgICBJbnB1dEVsZW1lbnQgbnVtMiA9IG5ldyBJbnB1dEVsZW1lbnQoKQorICAgICAgLi5pZCA9ICJjYWxjMiIKKyAgICAgIC4udHlwZSA9ICJudW1iZXIiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChudW0yKTsKKyAgICBCdXR0b25FbGVtZW50IGNhbGNCdXR0b24gPSBuZXcgQnV0dG9uRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiPSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IgorICAgICAgLi5vbkNsaWNrLmxpc3Rlbihfb25DYWxjQ2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoY2FsY0J1dHRvbik7CisgICAgU3BhbkVsZW1lbnQgcmVzdWx0ID0gbmV3IFNwYW5FbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiY2FsY1Jlc3VsdCIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKHJlc3VsdCk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIG91dHB1dC5hcHBlbmQobmV3IEJSRWxlbWVudCgpKTsKKyAgICBMYWJlbEVsZW1lbnQgbG9nSWRMYWJlbCA9IG5ldyBMYWJlbEVsZW1lbnQoKQorICAgICAgLi50ZXh0ID0gIkxvZyBJRDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiOworICAgIG91dHB1dC5hcHBlbmQobG9nSWRMYWJlbCk7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImxvZ0lkIgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBMYWJlbEVsZW1lbnQgY29tbWVudExhYmVsID0gbmV3IExhYmVsRWxlbWVudCgpCisgICAgICAuLnRleHQgPSAiQ29tbWVudDoiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChjb21tZW50TGFiZWwpOworICAgIElucHV0RWxlbWVudCBjb21tZW50ID0gbmV3IElucHV0RWxlbWVudCgpCisgICAgICAuLmlkID0gImNvbW1lbnQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLndpZHRoID0gIjEwMHB4IgorICAgICAgLi5zdHlsZS5tYXJnaW5MZWZ0ID0gIjEwcHgiOworICAgIG91dHB1dC5hcHBlbmQoY29tbWVudCk7CisgIH0KKworICB2b2lkIF9vbkNhbGNDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBudW0xID0gcXVlcnlTZWxlY3RvcigiI2NhbGMxIik7CisgICAgSW5wdXRFbGVtZW50IG51bTIgPSBxdWVyeVNlbGVjdG9yKCIjY2FsYzIiKTsKKyAgICBTZWxlY3RFbGVtZW50IG9wID0gcXVlcnlTZWxlY3RvcigiI2NhbGNPcCIpOworICAgIFNwYW5FbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNjYWxjUmVzdWx0Iik7CisgICAgSW5wdXRFbGVtZW50IGxvZ0lkID0gcXVlcnlTZWxlY3RvcigiI2xvZ0lkIik7CisgICAgSW5wdXRFbGVtZW50IGNvbW1lbnQgPSBxdWVyeVNlbGVjdG9yKCIjY29tbWVudCIpOworCisgICAgaW50IGxvZ0lkVmFsdWUgPSBpbnQucGFyc2UobG9nSWQudmFsdWUpOworICAgIGxvZ0lkLnZhbHVlID0gKGxvZ0lkVmFsdWUgKyAxKS50b1N0cmluZygpOworCisgICAgV29yayB3b3JrID0gbmV3IFdvcmsoKTsKKyAgICB3b3JrLm51bTEgPSBpbnQucGFyc2UobnVtMS52YWx1ZSk7CisgICAgd29yay5udW0yID0gaW50LnBhcnNlKG51bTIudmFsdWUpOworICAgIHdvcmsub3AgPSBpbnQucGFyc2Uob3Aub3B0aW9uc1tvcC5zZWxlY3RlZEluZGV4XS52YWx1ZSk7CisgICAgd29yay5jb21tZW50ID0gY29tbWVudC52YWx1ZTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50LmNhbGN1bGF0ZShsb2dJZFZhbHVlLCB3b3JrKS50aGVuKChpbnQgbikgeworICAgICAgcmVzdWx0LnRleHQgPSAiJG4iOworICAgIH0pOworICB9CisKKyAgdm9pZCBfYnVpbGRHZXRTdHJ1Y3RDb21wb25lbnQoKSB7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgSGVhZGluZ0VsZW1lbnQuaDMoKS4udGV4dCA9ICJHZXQgU3RydWN0Iik7CisgICAgTGFiZWxFbGVtZW50IGxvZ0lkTGFiZWwgPSBuZXcgTGFiZWxFbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJTdHJ1Y3QgS2V5OiIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCI7CisgICAgb3V0cHV0LmFwcGVuZChsb2dJZExhYmVsKTsKKyAgICBJbnB1dEVsZW1lbnQgbG9nSWQgPSBuZXcgSW5wdXRFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAic3RydWN0S2V5IgorICAgICAgLi50eXBlID0gIm51bWJlciIKKyAgICAgIC4udmFsdWUgPSAiMSIKKyAgICAgIC4uc3R5bGUuZm9udFNpemUgPSAiMTRweCIKKyAgICAgIC4uc3R5bGUud2lkdGggPSAiNTBweCIKKyAgICAgIC4uc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKKyAgICBvdXRwdXQuYXBwZW5kKGxvZ0lkKTsKKyAgICBCdXR0b25FbGVtZW50IGdldFN0cnVjdEJ1dHRvbiA9IG5ldyBCdXR0b25FbGVtZW50KCkKKyAgICAgIC4udGV4dCA9ICJHRVQiCisgICAgICAuLnN0eWxlLmZvbnRTaXplID0gIjE0cHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCIKKyAgICAgIC4ub25DbGljay5saXN0ZW4oX29uR2V0U3RydWN0Q2xpY2spOworICAgIG91dHB1dC5hcHBlbmQoZ2V0U3RydWN0QnV0dG9uKTsKKyAgICBvdXRwdXQuYXBwZW5kKG5ldyBCUkVsZW1lbnQoKSk7CisgICAgb3V0cHV0LmFwcGVuZChuZXcgQlJFbGVtZW50KCkpOworICAgIFRleHRBcmVhRWxlbWVudCByZXN1bHQgPSBuZXcgVGV4dEFyZWFFbGVtZW50KCkKKyAgICAgIC4uaWQgPSAiZ2V0U3RydWN0UmVzdWx0IgorICAgICAgLi5zdHlsZS5mb250U2l6ZSA9ICIxNHB4IgorICAgICAgLi5zdHlsZS53aWR0aCA9ICIzMDBweCIKKyAgICAgIC4uc3R5bGUuaGVpZ2h0ID0gIjUwcHgiCisgICAgICAuLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CisgICAgb3V0cHV0LmFwcGVuZChyZXN1bHQpOworICB9CisKKyAgdm9pZCBfb25HZXRTdHJ1Y3RDbGljayhNb3VzZUV2ZW50IGUpIHsKKyAgICBfdmFsaWRhdGUoKTsKKworICAgIElucHV0RWxlbWVudCBzdHJ1Y3RLZXkgPSBxdWVyeVNlbGVjdG9yKCIjc3RydWN0S2V5Iik7CisgICAgVGV4dEFyZWFFbGVtZW50IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3IoIiNnZXRTdHJ1Y3RSZXN1bHQiKTsKKworICAgIF9jYWxjdWxhdG9yQ2xpZW50CisgICAgICAgIC5nZXRTdHJ1Y3QoaW50LnBhcnNlKHN0cnVjdEtleS52YWx1ZSkpCisgICAgICAgIC50aGVuKChTaGFyZWRTdHJ1Y3QgcykgeworICAgICAgcmVzdWx0LnRleHQgPSAiJHtzLnRvU3RyaW5nKCl9IjsKKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGIxODRlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwzNiBAQAorPCEtLQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+CisgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+CisgICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgorICAgIDx0aXRsZT5UaHJpZnQgVHV0b3JpYWw8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ic3R5bGVzLmNzcyI+CisgICAgPHNjcmlwdCBhc3luYyBzcmM9ImNsaWVudC5kYXJ0IiB0eXBlPSJhcHBsaWNhdGlvbi9kYXJ0Ij48L3NjcmlwdD4KKyAgICA8c2NyaXB0IGFzeW5jIHNyYz0icGFja2FnZXMvYnJvd3Nlci9kYXJ0LmpzIj48L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisKKyAgPGRpdiBpZD0ib3V0cHV0Ij48L2Rpdj4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MgYi90dXRvcmlhbC9kYXJ0L2NsaWVudC93ZWIvc3R5bGVzLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMxNTAyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvd2ViL3N0eWxlcy5jc3MKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90byk7CisKK2h0bWwsIGJvZHkgeworICAgIHdpZHRoOiAxMDAlOworICAgIGhlaWdodDogMTAwJTsKKyAgICBtYXJnaW46IDA7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7Cit9CisKK2gzIHsKKyAgICBib3JkZXItYm90dG9tOiBzb2xpZDsKKyAgICBib3JkZXItd2lkdGg6IHRoaW47CisgICAgcGFkZGluZy10b3A6IDIwcHg7Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC8uYW5hbHlzaXNfb3B0aW9ucwpAQCAtMCwwICsxLDIgQEAKK2FuYWx5emVyOgorICBzdHJvbmctbW9kZTogdHJ1ZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0IGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTIwNmEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L2Jpbi9tYWluLmRhcnQKQEAgLTAsMCArMSwxNDkgQEAKKy8vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLy8KKy8vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vLworLy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworaW1wb3J0ICdkYXJ0OmlvJzsKKworaW1wb3J0ICdwYWNrYWdlOmFyZ3MvYXJncy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0X2NvbnNvbGUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHV0b3JpYWwvdHV0b3JpYWwuZGFydCc7CisKK1RUcmFuc3BvcnQgX3RyYW5zcG9ydDsKK0NhbGN1bGF0b3IgX2NhbGN1bGF0b3I7CitpbnQgbG9naWQgPSAwOworCitjb25zdCBNYXA8U3RyaW5nLCBpbnQ+IG9wZXJhdGlvbkxvb2t1cCA9IGNvbnN0IHsKKyAgJysnOiBPcGVyYXRpb24uQURELAorICAnLSc6IE9wZXJhdGlvbi5TVUJUUkFDVCwKKyAgJyonOiBPcGVyYXRpb24uTVVMVElQTFksCisgICcvJzogT3BlcmF0aW9uLkRJVklERQorfTsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGNvbm5lY3QgdG8nKTsKKworICBBcmdSZXN1bHRzIHJlc3VsdHM7CisgIHRyeSB7CisgICAgcmVzdWx0cyA9IHBhcnNlci5wYXJzZShhcmdzKTsKKyAgfSBjYXRjaCAoZSkgeworICAgIHJlc3VsdHMgPSBudWxsOworICB9CisKKyAgaWYgKHJlc3VsdHMgPT0gbnVsbCkgeworICAgIHByaW50KHBhcnNlci51c2FnZSk7CisgICAgZXhpdCgwKTsKKyAgfQorCisgIGludCBwb3J0ID0gaW50LnBhcnNlKHJlc3VsdHNbJ3BvcnQnXSk7CisKKyAgX2luaXRDb25uZWN0aW9uKHBvcnQpLnRoZW4oKF8pID0+IF9ydW4oKSk7Cit9CisKK0Z1dHVyZSBfaW5pdENvbm5lY3Rpb24oaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNvY2tldCA9IGF3YWl0IFNvY2tldC5jb25uZWN0KCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgX3RyYW5zcG9ydCA9IG5ldyBUQXN5bmNDbGllbnRTb2NrZXRUcmFuc3BvcnQoCisgICAgICBuZXcgVFRjcFNvY2tldChzb2NrZXQpLCBuZXcgVE1lc3NhZ2VSZWFkZXIobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKF90cmFuc3BvcnQpOworICBhd2FpdCBfdHJhbnNwb3J0Lm9wZW4oKTsKKworICBfY2FsY3VsYXRvciA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKK30KKworRnV0dXJlIF9ydW4oKSBhc3luYyB7CisgIF9oZWxwKCk7CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGRvdXQud3JpdGUoIj4gIik7CisgICAgdmFyIGlucHV0ID0gc3RkaW4ucmVhZExpbmVTeW5jKCk7CisgICAgdmFyIHBhcnRzID0gaW5wdXQuc3BsaXQoJyAnKTsKKyAgICB2YXIgY29tbWFuZCA9IHBhcnRzWzBdOworICAgIHZhciBhcmdzID0gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnN1Ymxpc3QoMSkgOiBbXTsKKworICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgICAgY2FzZSAncGluZyc6CisgICAgICAgIGF3YWl0IF9waW5nKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdhZGQnOgorICAgICAgICBhd2FpdCBfYWRkKGludC5wYXJzZShhcmdzWzBdKSwgaW50LnBhcnNlKGFyZ3NbMV0pKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ2NhbGMnOgorICAgICAgICBpbnQgb3AgPSBvcGVyYXRpb25Mb29rdXBbYXJnc1sxXV07CisgICAgICAgIGlmICghT3BlcmF0aW9uLlZBTElEX1ZBTFVFUy5jb250YWlucyhvcCkpIHsKKyAgICAgICAgICBzdGRvdXQud3JpdGVsbignVW5rbm93biBvcGVyYXRvciAke2FyZ3NbMV19Jyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrKCkKKyAgICAgICAgICAuLm51bTEgPSBpbnQucGFyc2UoYXJnc1swXSkKKyAgICAgICAgICAuLm9wID0gb3AKKyAgICAgICAgICAuLm51bTIgPSBpbnQucGFyc2UoYXJnc1syXSkKKyAgICAgICAgICAuLmNvbW1lbnQgPSBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogJyc7CisKKyAgICAgICAgYXdhaXQgX2NhbGMod29yayk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdzdHJ1Y3QnOgorICAgICAgICBhd2FpdCBfc3RydWN0KGludC5wYXJzZShhcmdzWzBdKSk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdoZWxwJzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIF9oZWxwKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIF9oZWxwKCkgeworICBzdGRvdXQud3JpdGVsbignQ29tbWFuZHM6Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGhlbHAnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJyAgcGluZycpOworICBzdGRvdXQud3JpdGVsbignICBhZGQgeCB5Jyk7CisgIHN0ZG91dC53cml0ZWxuKCcgIGNhbGMgeCBvcCB5IFtjb21tZW50XScpOworICBzdGRvdXQud3JpdGVsbignICBzdHJ1Y3QgaWQnKTsKKyAgc3Rkb3V0LndyaXRlbG4oJycpOworfQorCitGdXR1cmUgX3BpbmcoKSBhc3luYyB7CisgIGF3YWl0IF9jYWxjdWxhdG9yLnBpbmcoKTsKKyAgc3Rkb3V0LndyaXRlbG4oJ3Bpbmcgc3VjY2VlZGVkJyk7Cit9CisKK0Z1dHVyZSBfYWRkKGludCB4LCBpbnQgeSkgYXN5bmMgeworICBpbnQgcmVzdWx0ID0gYXdhaXQgX2NhbGN1bGF0b3IuYWRkKHgsIHkpOworICBzdGRvdXQud3JpdGVsbignPSAkcmVzdWx0Jyk7Cit9CisKK0Z1dHVyZSBfY2FsYyhXb3JrIHdvcmspIGFzeW5jIHsKKyAgaW50IHJlc3VsdCA9IGF3YWl0IF9jYWxjdWxhdG9yLmNhbGN1bGF0ZShsb2dpZCsrLCB3b3JrKTsKKyAgc3Rkb3V0LndyaXRlbG4oJz0gJHJlc3VsdCcpOworfQorCitGdXR1cmUgX3N0cnVjdChpbnQga2V5KSBhc3luYyB7CisgIHZhciBzdHJ1Y3QgPSBhd2FpdCBfY2FsY3VsYXRvci5nZXRTdHJ1Y3Qoa2V5KTsKKyAgc3Rkb3V0LndyaXRlbG4oc3RydWN0LnRvU3RyaW5nKCkpOworfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRlMjZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNiBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9jb25zb2xlX2NsaWVudAordmVyc2lvbjogMS4wLjAKK2Rlc2NyaXB0aW9uOiA+CisgIEEgRGFydCBjb25zb2xlIGNsaWVudCB0byBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAorYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK2hvbWVwYWdlOiBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKKworZW52aXJvbm1lbnQ6CisgIHNkazogIj49MS4xMy4wIDwyLjAuMCIKKworZGVwZW5kZW5jaWVzOgorICBhcmdzOiBeMC4xMy4wCisgIGNvbGxlY3Rpb246IF4xLjEuMAorICBzaGFyZWQ6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvc2hhcmVkCisgIHRocmlmdDoKKyAgICBwYXRoOiAuLi8uLi8uLi9saWIvZGFydAorICB0dXRvcmlhbDoKKyAgICBwYXRoOiAuLi9nZW4tZGFydC90dXRvcmlhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci8uYW5hbHlzaXNfb3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTBkNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvLmFuYWx5c2lzX29wdGlvbnMKQEAgLTAsMCArMSwyIEBACithbmFseXplcjoKKyAgc3Ryb25nLW1vZGU6IHRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL2Jpbi9tYWluLmRhcnQgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWMzMGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9iaW4vbWFpbi5kYXJ0CkBAIC0wLDAgKzEsMTYzIEBACisvLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8vCisvLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLy8KKy8vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vLyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDppbyc7CisKK2ltcG9ydCAncGFja2FnZTphcmdzL2FyZ3MuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6bG9nZ2luZy9sb2dnaW5nLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnRocmlmdC90aHJpZnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dGhyaWZ0L3RocmlmdF9jb25zb2xlLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnR1dG9yaWFsL3R1dG9yaWFsLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnNoYXJlZC9zaGFyZWQuZGFydCc7CisKK1RQcm90b2NvbCBfcHJvdG9jb2w7CitUUHJvY2Vzc29yIF9wcm9jZXNzb3I7CitXZWJTb2NrZXQgX3dlYlNvY2tldDsKKworbWFpbihMaXN0PFN0cmluZz4gYXJncykgeworICBMb2dnZXIucm9vdC5sZXZlbCA9IExldmVsLkFMTDsKKyAgTG9nZ2VyLnJvb3Qub25SZWNvcmQubGlzdGVuKChMb2dSZWNvcmQgcmVjKSB7CisgICAgcHJpbnQoJyR7cmVjLmxldmVsLm5hbWV9OiAke3JlYy50aW1lfTogJHtyZWMubWVzc2FnZX0nKTsKKyAgfSk7CisKKyAgdmFyIHBhcnNlciA9IG5ldyBBcmdQYXJzZXIoKTsKKyAgcGFyc2VyLmFkZE9wdGlvbigncG9ydCcsIGRlZmF1bHRzVG86ICc5MDkwJywgaGVscDogJ1RoZSBwb3J0IHRvIGxpc3RlbiBvbicpOworICBwYXJzZXIuYWRkT3B0aW9uKCd0eXBlJywKKyAgICAgIGRlZmF1bHRzVG86ICd3cycsCisgICAgICBhbGxvd2VkOiBbJ3dzJywgJ3RjcCddLAorICAgICAgaGVscDogJ1RoZSB0eXBlIG9mIHNvY2tldCcsCisgICAgICBhbGxvd2VkSGVscDogeyd3cyc6ICdXZWJTb2NrZXQnLCAndGNwJzogJ1RDUCBTb2NrZXQnfSk7CisKKyAgQXJnUmVzdWx0cyByZXN1bHRzOworICB0cnkgeworICAgIHJlc3VsdHMgPSBwYXJzZXIucGFyc2UoYXJncyk7CisgIH0gY2F0Y2ggKGUpIHsKKyAgICByZXN1bHRzID0gbnVsbDsKKyAgfQorCisgIGlmIChyZXN1bHRzID09IG51bGwpIHsKKyAgICBwcmludChwYXJzZXIudXNhZ2UpOworICAgIGV4aXQoMCk7CisgIH0KKworICBpbnQgcG9ydCA9IGludC5wYXJzZShyZXN1bHRzWydwb3J0J10pOworICBTdHJpbmcgc29ja2V0VHlwZSA9IHJlc3VsdHNbJ3R5cGUnXTsKKworICBpZiAoc29ja2V0VHlwZSA9PSAndGNwJykgeworICAgIF9ydW5UY3BTZXJ2ZXIocG9ydCk7CisgIH0gZWxzZSBpZiAoc29ja2V0VHlwZSA9PSAnd3MnKSB7CisgICAgX3J1bldlYlNvY2tldFNlcnZlcihwb3J0KTsKKyAgfQorfQorCitGdXR1cmUgX3J1bldlYlNvY2tldFNlcnZlcihpbnQgcG9ydCkgYXN5bmMgeworICB2YXIgaHR0cFNlcnZlciA9IGF3YWl0IEh0dHBTZXJ2ZXIuYmluZCgnMTI3LjAuMC4xJywgcG9ydCk7CisgIHByaW50KCdsaXN0ZW5pbmcgZm9yIFdlYlNvY2tldCBjb25uZWN0aW9ucyBvbiAkcG9ydCcpOworCisgIGh0dHBTZXJ2ZXIubGlzdGVuKChIdHRwUmVxdWVzdCByZXF1ZXN0KSBhc3luYyB7CisgICAgaWYgKHJlcXVlc3QudXJpLnBhdGggPT0gJy93cycpIHsKKyAgICAgIF93ZWJTb2NrZXQgPSBhd2FpdCBXZWJTb2NrZXRUcmFuc2Zvcm1lci51cGdyYWRlKHJlcXVlc3QpOworICAgICAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRXZWJTb2NrZXQoX3dlYlNvY2tldCkpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludCgnSW52YWxpZCBwYXRoOiAke3JlcXVlc3QudXJpLnBhdGh9Jyk7CisgICAgfQorICB9KTsKK30KKworRnV0dXJlIF9ydW5UY3BTZXJ2ZXIoaW50IHBvcnQpIGFzeW5jIHsKKyAgdmFyIHNlcnZlclNvY2tldCA9IGF3YWl0IFNlcnZlclNvY2tldC5iaW5kKCcxMjcuMC4wLjEnLCBwb3J0KTsKKyAgcHJpbnQoJ2xpc3RlbmluZyBmb3IgVENQIGNvbm5lY3Rpb25zIG9uICRwb3J0Jyk7CisKKyAgU29ja2V0IHNvY2tldCA9IGF3YWl0IHNlcnZlclNvY2tldC5maXJzdDsKKyAgYXdhaXQgX2luaXRQcm9jZXNzb3IobmV3IFRUY3BTb2NrZXQoc29ja2V0KSk7Cit9CisKK0Z1dHVyZSBfaW5pdFByb2Nlc3NvcihUU29ja2V0IHNvY2tldCkgYXN5bmMgeworICBUU2VydmVyU29ja2V0VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHNvY2tldCk7CisgIHRyYW5zcG9ydC5vbkluY29taW5nTWVzc2FnZS5saXN0ZW4oX3Byb2Nlc3NNZXNzYWdlKTsKKyAgX3Byb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9yU2VydmVyKCkpOworICBfcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGF3YWl0IF9wcm90b2NvbC50cmFuc3BvcnQub3BlbigpOworCisgIHByaW50KCdjb25uZWN0ZWQnKTsKK30KKworRnV0dXJlIF9wcm9jZXNzTWVzc2FnZShfKSBhc3luYyB7CisgIF9wcm9jZXNzb3IucHJvY2VzcyhfcHJvdG9jb2wsIF9wcm90b2NvbCk7Cit9CisKK2NsYXNzIENhbGN1bGF0b3JTZXJ2ZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKKyAgZmluYWwgTWFwPGludCwgU2hhcmVkU3RydWN0PiBfbG9nID0ge307CisKKyAgRnV0dXJlIHBpbmcoKSBhc3luYyB7CisgICAgcHJpbnQoJ3BpbmcoKScpOworICB9CisKKyAgRnV0dXJlPGludD4gYWRkKGludCBudW0xLCBpbnQgbnVtMikgYXN5bmMgeworICAgIHByaW50KCdhZGQoJG51bTEsICRudW0yKScpOworCisgICAgcmV0dXJuIG51bTEgKyBudW0yOworICB9CisKKyAgRnV0dXJlPGludD4gY2FsY3VsYXRlKGludCBsb2dpZCwgV29yayB3b3JrKSBhc3luYyB7CisgICAgcHJpbnQoJ2NhbHVsYXRlKCRsb2dpZCwgJHt3b3JrLnRvU3RyaW5nKCl9KScpOworCisgICAgaW50IHZhbDsKKworICAgIHN3aXRjaCAod29yay5vcCkgeworICAgICAgY2FzZSBPcGVyYXRpb24uQUREOgorICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgT3BlcmF0aW9uLkRJVklERToKKyAgICAgICAgaWYgKHdvcmsubnVtMiA9PSAwKSB7CisgICAgICAgICAgdmFyIHggPSBuZXcgSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgICB4LndoeSA9ICdDYW5ub3QgZGl2aWRlIGJ5IDAnOworICAgICAgICAgIHRocm93IHg7CisgICAgICAgIH0KKyAgICAgICAgdmFsID0gKHdvcmsubnVtMSAvIHdvcmsubnVtMikuZmxvb3IoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgdmFyIGxvZyA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBsb2cua2V5ID0gbG9naWQ7CisgICAgbG9nLnZhbHVlID0gJyR2YWwgIiR7d29yay5jb21tZW50fSInOworICAgIHRoaXMuX2xvZ1tsb2dpZF0gPSBsb2c7CisKKyAgICByZXR1cm4gdmFsOworICB9CisKKyAgRnV0dXJlIHppcCgpIGFzeW5jIHsKKyAgICBwcmludCgnemlwKCknKTsKKyAgfQorCisgIEZ1dHVyZTxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdChpbnQga2V5KSBhc3luYyB7CisgICAgcHJpbnQoJ2dldFN0cnVjdCgka2V5KScpOworCisgICAgcmV0dXJuIF9sb2dba2V5XTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDA3MzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKQEAgLTAsMCArMSwzNCBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lOiB0dXRvcmlhbF9zZXJ2ZXIKK3ZlcnNpb246IDEuMC4wCitkZXNjcmlwdGlvbjogQSBEYXJ0IHNlcnZlciB0byBzdXBwb3J0IHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCithdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgoraG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworCitlbnZpcm9ubWVudDoKKyAgc2RrOiAiPj0xLjEzLjAgPDIuMC4wIgorCitkZXBlbmRlbmNpZXM6CisgIGFyZ3M6IF4wLjEzLjAKKyAgc2hhcmVkOgorICAgIHBhdGg6IC4uL2dlbi1kYXJ0L3NoYXJlZAorICB0aHJpZnQ6CisgICAgcGF0aDogLi4vLi4vLi4vbGliL2RhcnQKKyAgdHV0b3JpYWw6CisgICAgcGF0aDogLi4vZ2VuLWRhcnQvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgppbmRleCAwZjM4MGIwLi43NGQwZDQ1IDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCkBAIC0yNiw3ICsyNiw3IEBACiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCkBAIC02MiwxMCArNjIsMTAgQEAKICAgICB0cmFuc3BvcnQuT3BlbjsKIAogICAgIGNsaWVudC5waW5nOwotICAgIENvbnNvbGUuV3JpdGVMaW5lKCdwaW5nKCknKTsKKyAgICBXcml0ZUxuKCdwaW5nKCknKTsKIAogICAgIHN1bSA6PSBjbGllbnQuYWRkKCAxLCAxKTsKLSAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnMSsxPSVkJywgW3N1bV0pKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoICcxKzE9JWQnLCBbc3VtXSkpOwogCiAgICAgd29yayA6PSBUV29ya0ltcGwuQ3JlYXRlOwogCkBAIC03NCwxMSArNzQsMTEgQEAKICAgICB3b3JrLk51bTIgOj0gMDsKICAgICB0cnkKICAgICAgIHF1b3RpZW50IDo9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yayk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggJ1dob2Egd2UgY2FuIGRpdmlkZSBieSAwJyk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCcxLzA9JWQnLFtxdW90aWVudF0pKTsKKyAgICAgIFdyaXRlTG4oICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxLzA9JWQnLFtxdW90aWVudF0pKTsKICAgICBleGNlcHQKICAgICAgIG9uIGlvOiBUSW52YWxpZE9wZXJhdGlvbgotICAgICAgZG8gQ29uc29sZS5Xcml0ZUxpbmUoICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CisgICAgICBkbyBXcml0ZUxuKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOwogICAgIGVuZDsKIAogICAgIHdvcmsuT3AgICA6PSBUT3BlcmF0aW9uLlNVQlRSQUNUOwpAQCAtODYsMjAgKzg2LDIwIEBACiAgICAgd29yay5OdW0yIDo9IDEwOwogICAgIHRyeQogICAgICAgZGlmZiA6PSBjbGllbnQuY2FsY3VsYXRlKCAxLCB3b3JrKTsKLSAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoJzE1LTEwPSVkJywgW2RpZmZdKSk7CisgICAgICBXcml0ZUxuKCBGb3JtYXQoJzE1LTEwPSVkJywgW2RpZmZdKSk7CiAgICAgZXhjZXB0CiAgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KLSAgICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKICAgICBlbmQ7CiAKICAgICBsb2cgOj0gY2xpZW50LmdldFN0cnVjdCgxKTsKLSAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnQ2hlY2sgbG9nOiAlcycsIFtsb2cuVmFsdWVdKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnQ2hlY2sgbG9nOiAlcycsIFtsb2cuVmFsdWVdKSk7CiAKICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKIAogICBleGNlcHQKICAgICBvbiBlIDogRXhjZXB0aW9uCi0gICAgZG8gQ29uc29sZS5Xcml0ZUxpbmUoIGUuQ2xhc3NOYW1lKyc6ICcrZS5NZXNzYWdlKTsKKyAgICBkbyBXcml0ZUxuKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIGVuZDsKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2ogYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagppbmRleCBhYjBhMWMxLi5kMDY3OTkyIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagorKysgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHJvagpAQCAtNTIsNyArNTIsNyBAQAogCQkJPC9EZWxwaGlDb21waWxlPgogCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzIi8+CiAJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMiLz4KLQkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CiAJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KIAkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KIAkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgpAQCAtODIsOCArODIsOCBAQAogCQkJCQk8VmVyc2lvbkluZm8+CiAJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgogCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KLQkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4xMjwvVmVyc2lvbkluZm8+CiAJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CiAJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgogCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKaW5kZXggOWQ1NGEyZS4uNWY0MmU3ZSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgpAQCAtMjgsNyArMjgsNyBAQAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtODYsMTMgKzg2LDEzIEBACiAKIHByb2NlZHVyZSBUQ2FsY3VsYXRvckhhbmRsZXIucGluZzsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCAncGluZygpJyk7CisgIFdyaXRlTG4oICdwaW5nKCknKTsKIGVuZDsKIAogCiBmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuYWRkKG51bTE6IEludGVnZXI7IG51bTI6IEludGVnZXIpOiBJbnRlZ2VyOwogYmVnaW4KLSAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJ2FkZCggJWQsICVkKScsIFtudW0xLCBudW0yXSkpOworICBXcml0ZUxuKCBGb3JtYXQoICdhZGQoICVkLCAlZCknLCBbbnVtMSwgbnVtMl0pKTsKICAgcmVzdWx0IDo9IG51bTEgKyBudW0yOwogZW5kOwogCkBAIC0xMDEsNyArMTAxLDcgQEAKIHZhciBlbnRyeSA6IElTaGFyZWRTdHJ1Y3Q7CiBiZWdpbgogICB0cnkKLSAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCdjYWxjdWxhdGUoICVkLCBbJWQsJWQsJWRdKScsIFtsb2dpZCwgT3JkKHcuT3ApLCB3Lk51bTEsIHcuTnVtMl0pKTsKKyAgICBXcml0ZUxuKCBGb3JtYXQoJ2NhbGN1bGF0ZSggJWQsIFslZCwlZCwlZF0pJywgW2xvZ2lkLCBPcmQody5PcCksIHcuTnVtMSwgdy5OdW0yXSkpOwogCiAgICAgY2FzZSB3Lk9wIG9mCiAgICAgICBUT3BlcmF0aW9uLkFERCAgICAgIDogIHJlc3VsdCA6PSB3Lk51bTEgKyB3Lk51bTI7CkBAIC0xMjYsMTQgKzEyNiwxNCBAQAogCiBmdW5jdGlvbiBUQ2FsY3VsYXRvckhhbmRsZXIuZ2V0U3RydWN0KGtleTogSW50ZWdlcik6IElTaGFyZWRTdHJ1Y3Q7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnZ2V0U3RydWN0KCVkKScsIFtrZXldKSk7CisgIFdyaXRlTG4oIEZvcm1hdCggJ2dldFN0cnVjdCglZCknLCBba2V5XSkpOwogICByZXN1bHQgOj0gRkxvZ1trZXldOwogZW5kOwogCiAKIHByb2NlZHVyZSBUQ2FsY3VsYXRvckhhbmRsZXIuemlwOwogYmVnaW4KLSAgQ29uc29sZS5Xcml0ZUxpbmUoICd6aXAoKScpOworICBXcml0ZUxuKCAnemlwKCknKTsKIGVuZDsKIAogCkBAIC0xNTIsMTQgKzE1MiwxNCBAQAogICAgIHRyYW5zcG9ydCA6PSBUU2VydmVyU29ja2V0SW1wbC5DcmVhdGUoIDkwOTApOwogICAgIHNlcnZlciAgICA6PSBUU2ltcGxlU2VydmVyLkNyZWF0ZSggcHJvY2Vzc29yLCB0cmFuc3BvcnQpOwogCi0gICAgQ29uc29sZS5Xcml0ZUxpbmUoICdTdGFydGluZyB0aGUgc2VydmVyLi4uJyk7CisgICAgV3JpdGVMbiggJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKTsKICAgICBzZXJ2ZXIuU2VydmUoKTsKIAogICBleGNlcHQKLSAgICBvbiBlOiBFeGNlcHRpb24gZG8gQ29uc29sZS5Xcml0ZUxpbmUoIGUuTWVzc2FnZSk7CisgICAgb24gZTogRXhjZXB0aW9uIGRvIFdyaXRlTG4oIGUuTWVzc2FnZSk7CiAgIGVuZDsKIAotICBDb25zb2xlLldyaXRlTGluZSgnZG9uZS4nKTsKKyAgV3JpdGVMbignZG9uZS4nKTsKIGVuZDsKIAogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJvaiBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qCmluZGV4IGM1MDcxYTMuLmUzNGE2YTEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qCkBAIC01MSw3ICs1MSw3IEBACiAJCQk8L0RlbHBoaUNvbXBpbGU+CiAJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KIAkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgotCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMiLz4KIAkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgogCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgogCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+CkBAIC04MSw4ICs4MSw4IEBACiAJCQkJCTxWZXJzaW9uSW5mbz4KIAkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+CiAJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0JCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPgotCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjEyPC9WZXJzaW9uSW5mbz4KIAkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KIAkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+CiAJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9UdXRvcmlhbC5ncm91cHByb2ogYi90dXRvcmlhbC9kZWxwaGkvVHV0b3JpYWwuZ3JvdXBwcm9qCmluZGV4IDQ4NmU2MTIuLjNhMmEyMzcgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2RlbHBoaS9UdXRvcmlhbC5ncm91cHByb2oKKysrIGIvdHV0b3JpYWwvZGVscGhpL1R1dG9yaWFsLmdyb3VwcHJvagpAQCAtMSw0OCArMSw0OCBAQAot77u/CTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotCQk8UHJvcGVydHlHcm91cD4KLQkJCTxQcm9qZWN0R3VpZD57M0QwNDJDN0YtM0VGMi00NTc0LTgzMDQtQUI3RkI3OUY4MTRDfTwvUHJvamVjdEd1aWQ+Ci0JCTwvUHJvcGVydHlHcm91cD4KLQkJPEl0ZW1Hcm91cD4KLQkJCTxQcm9qZWN0cyBJbmNsdWRlPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIj4KLQkJCQk8RGVwZW5kZW5jaWVzLz4KLQkJCTwvUHJvamVjdHM+Ci0JCQk8UHJvamVjdHMgSW5jbHVkZT0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+Ci0JCQkJPERlcGVuZGVuY2llcy8+Ci0JCQk8L1Byb2plY3RzPgotCQk8L0l0ZW1Hcm91cD4KLQkJPFByb2plY3RFeHRlbnNpb25zPgotCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KLQkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KLQkJCTxCb3JsYW5kUHJvamVjdD4KLQkJCQk8RGVmYXVsdC5QZXJzb25hbGl0eS8+Ci0JCQk8L0JvcmxhbmRQcm9qZWN0PgotCQk8L1Byb2plY3RFeHRlbnNpb25zPgotCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+Ci0JCQk8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIvPgotCQk8L1RhcmdldD4KLQkJPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6Q2xlYW4iPgotCQkJPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+Ci0JCTwvVGFyZ2V0PgotCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlcjpNYWtlIj4KLQkJCTxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+Ci0JCTwvVGFyZ2V0PgotCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+Ci0JCQk8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIvPgotCQk8L1RhcmdldD4KLQkJPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6Q2xlYW4iPgotCQkJPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+Ci0JCTwvVGFyZ2V0PgotCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudDpNYWtlIj4KLQkJCTxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+Ci0JCTwvVGFyZ2V0PgotCQk8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KLQkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQiLz4KLQkJPC9UYXJnZXQ+Ci0JCTxUYXJnZXQgTmFtZT0iQ2xlYW4iPgotCQkJPENhbGxUYXJnZXQgVGFyZ2V0cz0iRGVscGhpU2VydmVyOkNsZWFuO0RlbHBoaUNsaWVudDpDbGVhbiIvPgotCQk8L1RhcmdldD4KLQkJPFRhcmdldCBOYW1lPSJNYWtlIj4KLQkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjpNYWtlO0RlbHBoaUNsaWVudDpNYWtlIi8+Ci0JCTwvVGFyZ2V0PgotCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+Ci0JPC9Qcm9qZWN0Pgor77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgorICAgICAgICA8UHJvcGVydHlHcm91cD4KKyAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57M0QwNDJDN0YtM0VGMi00NTc0LTgzMDQtQUI3RkI3OUY4MTRDfTwvUHJvamVjdEd1aWQ+CisgICAgICAgIDwvUHJvcGVydHlHcm91cD4KKyAgICAgICAgPEl0ZW1Hcm91cD4KKyAgICAgICAgICAgIDxQcm9qZWN0cyBJbmNsdWRlPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIj4KKyAgICAgICAgICAgICAgICA8RGVwZW5kZW5jaWVzLz4KKyAgICAgICAgICAgIDwvUHJvamVjdHM+CisgICAgICAgICAgICA8UHJvamVjdHMgSW5jbHVkZT0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+CisgICAgICAgICAgICAgICAgPERlcGVuZGVuY2llcy8+CisgICAgICAgICAgICA8L1Byb2plY3RzPgorICAgICAgICA8L0l0ZW1Hcm91cD4KKyAgICAgICAgPFByb2plY3RFeHRlbnNpb25zPgorICAgICAgICAgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKyAgICAgICAgICAgIDxCb3JsYW5kLlByb2plY3RUeXBlLz4KKyAgICAgICAgICAgIDxCb3JsYW5kUHJvamVjdD4KKyAgICAgICAgICAgICAgICA8RGVmYXVsdC5QZXJzb25hbGl0eS8+CisgICAgICAgICAgICA8L0JvcmxhbmRQcm9qZWN0PgorICAgICAgICA8L1Byb2plY3RFeHRlbnNpb25zPgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlTZXJ2ZXI6Q2xlYW4iPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlcjpNYWtlIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+CisgICAgICAgICAgICA8TVNCdWlsZCBQcm9qZWN0cz0iRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJEZWxwaGlDbGllbnQ6Q2xlYW4iPgorICAgICAgICAgICAgPE1TQnVpbGQgUHJvamVjdHM9IkRlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudDpNYWtlIj4KKyAgICAgICAgICAgIDxNU0J1aWxkIFByb2plY3RzPSJEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KKyAgICAgICAgICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQiLz4KKyAgICAgICAgPC9UYXJnZXQ+CisgICAgICAgIDxUYXJnZXQgTmFtZT0iQ2xlYW4iPgorICAgICAgICAgICAgPENhbGxUYXJnZXQgVGFyZ2V0cz0iRGVscGhpU2VydmVyOkNsZWFuO0RlbHBoaUNsaWVudDpDbGVhbiIvPgorICAgICAgICA8L1RhcmdldD4KKyAgICAgICAgPFRhcmdldCBOYW1lPSJNYWtlIj4KKyAgICAgICAgICAgIDxDYWxsVGFyZ2V0IFRhcmdldHM9IkRlbHBoaVNlcnZlcjpNYWtlO0RlbHBoaUNsaWVudDpNYWtlIi8+CisgICAgICAgIDwvVGFyZ2V0PgorICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+CisgICAgPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL1JFQURNRSBiL3R1dG9yaWFsL2VybC9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHR1dG9yaWFsL2VybC9SRUFETUUKcmVuYW1lIHRvIHR1dG9yaWFsL2VybC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKaW5kZXggNWQ0MDkxNi4uMDM3NDIyMCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKKysrIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5lcmwKQEAgLTI4LDcgKzI4LDcgQEAKICAgICBvay4KIAogdCgpIC0+Ci0gICAgUG9ydCA9IDk5OTksCisgICAgUG9ydCA9IDkwOTAsCiAKICAgICB7b2ssIENsaWVudDB9ID0gdGhyaWZ0X2NsaWVudF91dGlsOm5ldygiMTI3LjAuMC4xIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0LApAQCAtNDQsNyArNDQsNyBAQAogICAgIHtDbGllbnQzLCB7b2ssIFN1bTF9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQyLCBhZGQsIFsxLCA0XSksCiAgICAgaW86Zm9ybWF0KCIxKzQ9fnB+biIsIFtTdW0xXSksCiAKLSAgICBXb3JrID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9TVUJUUkFDVCwKKyAgICBXb3JrID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNULAogICAgICAgICAgICAgICAgICBudW0xPTE1LAogICAgICAgICAgICAgICAgICBudW0yPTEwfSwKICAgICB7Q2xpZW50NCwge29rLCBEaWZmfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MywgY2FsY3VsYXRlLCBbMSwgV29ya10pLApAQCAtNTUsNyArNTUsNyBAQAogCiAgICAgQ2xpZW50NiA9CiAgICAgICAgIHRyeQotICAgICAgICAgICAgV29yazEgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSwKKyAgICAgICAgICAgIFdvcmsxID0gIydXb3JrJ3tvcD0/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMT0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0yPTB9LAogICAgICAgICAgICAge0NsaWVudFMxLCB7b2ssIF9RdW90fX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50NSwgY2FsY3VsYXRlLCBbMiwgV29yazFdKSwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2ggYi90dXRvcmlhbC9lcmwvY2xpZW50LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhNDE3ZTBkLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZXJ2ZXIuc2gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzVhZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0VSTF9USFJJRlQ9Li4vLi4vbGliL2VybAorCitpZiAhIFsgLWQgJHtFUkxfVEhSSUZUfS9lYmluIF07IHRoZW4KKyAgICBlY2hvICJQbGVhc2UgYnVpbGQgdGhlIFRocmlmdCBsaWJyYXJ5IGJ5IHJ1bm5pbmcgXGBtYWtlJyBpbiAke0VSTF9USFJJRlR9IgorICAgIGV4aXQgMQorZmkKKworaWYgISBbIC1kIGdlbi1lcmwgXTsgdGhlbgorICAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1yIC0tZ2VuIGVybCAuLi90dXRvcmlhbC50aHJpZnQKK2ZpCisKKworZXJsYyAtSSAke0VSTF9USFJJRlR9L2luY2x1ZGUgLUkgJHtFUkxfVEhSSUZUfS9lYmluIFwKKyAgICAgLUkgZ2VuLWVybCAtbyBnZW4tZXJsIGdlbi1lcmwvKi5lcmwgJiYKKyAgZXJsYyAtSSAke0VSTF9USFJJRlR9L2luY2x1ZGUgLUkgZ2VuLWVybCAqLmVybCAmJgorICBlcmwgK0sgdHJ1ZSAtcGEgJHtFUkxfVEhSSUZUfS9lYmluIC1wYSBnZW4tZXJsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsIGIvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybAppbmRleCA1MjRlOWFlLi4wYjM5Y2VkIDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKQEAgLTI3LDggKzI3LDggQEAKIAogLWV4cG9ydChbdC8wXSkuCiAKLSUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbW1vbi1jYXNlIG9mIHNvY2tldCB0cmFuc3BvcnRzCi0lJSB3aXRoIHRoZSBiaW5hcnkgcHJvdG9jb2wKKyUlIENsaWVudCBjb25zdHJ1Y3RvciBmb3IgdGhlIGh0dHAgdHJhbnNwb3J0cworJSUgd2l0aCB0aGUganNvbiBwcm90b2NvbAogbmV3X2NsaWVudChIb3N0LCBQYXRoLCBTZXJ2aWNlLCBfT3B0aW9ucykgLT4KICAgICB7UHJvdG9PcHRzLCBUcmFuc09wdHN9ID0ge1tdLFtdfSwKICAgICBUcmFuc3BvcnRGYWN0b3J5ID0gZnVuKCkgLT4gdGhyaWZ0X2h0dHBfdHJhbnNwb3J0Om5ldyhIb3N0LCBQYXRoLCBUcmFuc09wdHMpIGVuZCwKQEAgLTU1LDcgKzU1LDcgQEAKICAgICB7Q2xpZW50Mywge29rLCBTdW0xfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgYWRkLCBbMSwgNF0pLAogICAgIGlvOmZvcm1hdCgiMSs0PX5wfm4iLCBbU3VtMV0pLAogCi0gICAgV29yayA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fU1VCVFJBQ1QsCisgICAgV29yayA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCwKICAgICAgICAgICAgICAgICAgbnVtMT0xNSwKICAgICAgICAgICAgICAgICAgbnVtMj0xMH0sCiAgICAge0NsaWVudDQsIHtvaywgRGlmZn19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDMsIGNhbGN1bGF0ZSwgWzEsIFdvcmtdKSwKQEAgLTY2LDcgKzY2LDcgQEAKIAogICAgIENsaWVudDYgPQogICAgICAgICB0cnkKLSAgICAgICAgICAgIFdvcmsxID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9ESVZJREUsCisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKICAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybCBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCmluZGV4IDQ5MTU2MDYuLjY0N2NjMjQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9zZXJ2ZXIuZXJsCkBAIC0zNiwyNSArMzYsMjUgQEAKICAgICBOMStOMi4KIAogY2FsY3VsYXRlKExvZ2lkLCBXb3JrKSAtPgotICAgIHsgT3AsIE51bTEsIE51bTIgfSA9IHsgV29yayN3b3JrLm9wLCBXb3JrI3dvcmsubnVtMSwgV29yayN3b3JrLm51bTIgfSwKKyAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjJ1dvcmsnLm9wLCBXb3JrIydXb3JrJy5udW0xLCBXb3JrIydXb3JrJy5udW0yIH0sCiAgICAgZGVidWcoImNhbGN1bGF0ZSh+cCwge35wLH5wLH5wfSkiLCBbTG9naWQsIE9wLCBOdW0xLCBOdW0yXSksCiAgICAgY2FzZSBPcCBvZgotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0FERCAgICAgIC0+IE51bTEgKyBOdW0yOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX1NVQlRSQUNUIC0+IE51bTEgLSBOdW0yOwotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX01VTFRJUExZIC0+IE51bTEgKiBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0FERCAgICAgIC0+IE51bTEgKyBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX1NVQlRSQUNUIC0+IE51bTEgLSBOdW0yOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX01VTFRJUExZIC0+IE51bTEgKiBOdW0yOwogCi0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFIHdoZW4gTnVtMiA9PSAwIC0+Ci0gICAgICAgICAgdGhyb3coI2ludmFsaWRPcGVyYXRpb257d2hhdD1PcCwgd2h5PSJDYW5ub3QgZGl2aWRlIGJ5IDAifSk7Ci0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFIC0+CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFIHdoZW4gTnVtMiA9PSAwIC0+CisgICAgICAgICAgdGhyb3coIydJbnZhbGlkT3BlcmF0aW9uJ3t3aGF0T3A9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSAtPgogICAgICAgICAgIE51bTEgZGl2IE51bTI7CiAKICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICB0aHJvdygjaW52YWxpZE9wZXJhdGlvbnt3aGF0PU9wLCB3aHk9IkludmFsaWQgb3BlcmF0aW9uIn0pCisgICAgICAgICAgdGhyb3coIydJbnZhbGlkT3BlcmF0aW9uJ3t3aGF0T3A9T3AsIHdoeT0iSW52YWxpZCBvcGVyYXRpb24ifSkKICAgICBlbmQuCiAKIGdldFN0cnVjdChLZXkpIC0+CiAgICAgZGVidWcoImdldFN0cnVjdCh+cCkiLCBbS2V5XSksCi0gICAgI3NoYXJlZFN0cnVjdHtrZXk9S2V5LCB2YWx1ZT0iUkFSRyJ9LgorICAgICMnU2hhcmVkU3RydWN0J3trZXk9S2V5LCB2YWx1ZT0iUkFSRyJ9LgogCiB6aXAoKSAtPgogICAgIGRlYnVnKCJ6aXAiLCBbXSksCkBAIC02Myw3ICs2Myw3IEBACiAlJQogCiBzdGFydCgpIC0+Ci0gICAgc3RhcnQoOTk5OSkuCisgICAgc3RhcnQoOTA5MCkuCiAKIHN0YXJ0KFBvcnQpIC0+CiAgICAgSGFuZGxlciAgID0gP01PRFVMRSwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL01ha2UuZGVwcyBiL3R1dG9yaWFsL2dvL01ha2UuZGVwcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMmIyMC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9nby9NYWtlLmRlcHMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotc3JjLmluc3RhbGw6IGZtdC5pbnN0YWxsIG5ldC5pbnN0YWxsIG9zLmluc3RhbGwgc3RyY29udi5pbnN0YWxsIHRocmlmdC5pbnN0YWxsCi1hcmNoaXZlL3Rhci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2FyY2hpdmUvdGFyLmEKLWFyY2hpdmUvemlwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYXJjaGl2ZS96aXAuYQotYXNuMS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2FzbjEuYQotYmlnLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYmlnLmEKLWJ1ZmlvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vYnVmaW8uYQotYnl0ZXMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ieXRlcy5hCi1jbWF0aC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NtYXRoLmEKLWNvbXByZXNzL2ZsYXRlLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29tcHJlc3MvZmxhdGUuYQotY29tcHJlc3MvZ3ppcC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL2d6aXAuYQotY29tcHJlc3MvemxpYi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbXByZXNzL3psaWIuYQotY29udGFpbmVyL2hlYXAuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jb250YWluZXIvaGVhcC5hCi1jb250YWluZXIvbGlzdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbnRhaW5lci9saXN0LmEKLWNvbnRhaW5lci9yaW5nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY29udGFpbmVyL3JpbmcuYQotY29udGFpbmVyL3ZlY3Rvci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NvbnRhaW5lci92ZWN0b3IuYQotY3J5cHRvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvLmEKLWNyeXB0by9hZXMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vYWVzLmEKLWNyeXB0by9ibG9jay5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9ibG9jay5hCi1jcnlwdG8vYmxvd2Zpc2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vYmxvd2Zpc2guYQotY3J5cHRvL2Nhc3Q1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL2Nhc3Q1LmEKLWNyeXB0by9jaXBoZXIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vY2lwaGVyLmEKLWNyeXB0by9kc2EuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vZHNhLmEKLWNyeXB0by9lbGxpcHRpYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9lbGxpcHRpYy5hCi1jcnlwdG8vaG1hYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9obWFjLmEKLWNyeXB0by9tZDQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vbWQ0LmEKLWNyeXB0by9tZDUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vbWQ1LmEKLWNyeXB0by9vY3NwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL29jc3AuYQotY3J5cHRvL3JhbmQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vcmFuZC5hCi1jcnlwdG8vcmM0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JjNC5hCi1jcnlwdG8vcmlwZW1kMTYwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JpcGVtZDE2MC5hCi1jcnlwdG8vcnNhLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3JzYS5hCi1jcnlwdG8vc2hhMS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by9zaGExLmEKLWNyeXB0by9zaGEyNTYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc2hhMjU2LmEKLWNyeXB0by9zaGE1MTIuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc2hhNTEyLmEKLWNyeXB0by9zdWJ0bGUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vc3VidGxlLmEKLWNyeXB0by90bHMuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8vdGxzLmEKLWNyeXB0by90d29maXNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vY3J5cHRvL3R3b2Zpc2guYQotY3J5cHRvL3g1MDkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9jcnlwdG8veDUwOS5hCi1jcnlwdG8veHRlYS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2NyeXB0by94dGVhLmEKLWRlYnVnL2R3YXJmLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZGVidWcvZHdhcmYuYQotZGVidWcvbWFjaG8uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9tYWNoby5hCi1kZWJ1Zy9lbGYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9lbGYuYQotZGVidWcvZ29zeW0uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9nb3N5bS5hCi1kZWJ1Zy9wZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2RlYnVnL3BlLmEKLWRlYnVnL3Byb2MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9kZWJ1Zy9wcm9jLmEKLWVibmYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lYm5mLmEKLWVuY29kaW5nL2FzY2lpODUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9hc2NpaTg1LmEKLWVuY29kaW5nL2Jhc2UzMi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL2Jhc2UzMi5hCi1lbmNvZGluZy9iYXNlNjQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9iYXNlNjQuYQotZW5jb2RpbmcvYmluYXJ5Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvYmluYXJ5LmEKLWVuY29kaW5nL2dpdDg1Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvZ2l0ODUuYQotZW5jb2RpbmcvaGV4Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZW5jb2RpbmcvaGV4LmEKLWVuY29kaW5nL2xpbmUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9lbmNvZGluZy9saW5lLmEKLWVuY29kaW5nL3BlbS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2VuY29kaW5nL3BlbS5hCi1leGVjLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZXhlYy5hCi1leHAvZGF0YWZtdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2V4cC9kYXRhZm10LmEKLWV4cC9kcmF3Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZXhwL2RyYXcuYQotZXhwL2RyYXcveDExLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZXhwL2RyYXcveDExLmEKLWV4cC9ldmFsLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZXhwL2V2YWwuYQotZXhwdmFyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZXhwdmFyLmEKLWZsYWcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9mbGFnLmEKLWZtdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ZtdC5hCi1nby9hc3QuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9nby9hc3QuYQotZ28vZG9jLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vZG9jLmEKLWdvL3BhcnNlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3BhcnNlci5hCi1nby9wcmludGVyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vcHJpbnRlci5hCi1nby9zY2FubmVyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vc2Nhbm5lci5hCi1nby90b2tlbi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2dvL3Rva2VuLmEKLWdvL3R5cGVjaGVja2VyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ28vdHlwZWNoZWNrZXIuYQotZ29iLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vZ29iLmEKLWhhc2guaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9oYXNoLmEKLWhhc2gvYWRsZXIzMi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2hhc2gvYWRsZXIzMi5hCi1oYXNoL2NyYzMyLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaGFzaC9jcmMzMi5hCi1oYXNoL2NyYzY0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaGFzaC9jcmM2NC5hCi1odG1sLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHRtbC5hCi1odHRwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC5hCi1odHRwL3Bwcm9mLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaHR0cC9wcHJvZi5hCi1pbWFnZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlLmEKLWltYWdlL2pwZWcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9pbWFnZS9qcGVnLmEKLWltYWdlL3BuZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2ltYWdlL3BuZy5hCi1pbmRleC9zdWZmaXhhcnJheS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2luZGV4L3N1ZmZpeGFycmF5LmEKLWlvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW8uYQotaW8vaW91dGlsLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vaW8vaW91dGlsLmEKLWpzb24uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9qc29uLmEKLWxvZy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L2xvZy5hCi1tYXRoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbWF0aC5hCi1taW1lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vbWltZS5hCi1taW1lL211bHRpcGFydC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L21pbWUvbXVsdGlwYXJ0LmEKLW5ldC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L25ldC5hCi1uZXQvZGljdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L25ldC9kaWN0LmEKLW5ldC90ZXh0cHJvdG8uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9uZXQvdGV4dHByb3RvLmEKLW5ldGNoYW4uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9uZXRjaGFuLmEKLW9zLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vb3MuYQotb3Mvc2lnbmFsLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vb3Mvc2lnbmFsLmEKLXBhdGNoLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcGF0Y2guYQotcGF0aC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3BhdGguYQotcmFuZC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3JhbmQuYQotcmVmbGVjdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3JlZmxlY3QuYQotcmVnZXhwLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcmVnZXhwLmEKLXJwYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3JwYy5hCi1ycGMvanNvbnJwYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3JwYy9qc29ucnBjLmEKLXJ1bnRpbWUuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS9ydW50aW1lLmEKLXJ1bnRpbWUvY2dvLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vcnVudGltZS9jZ28uYQotcnVudGltZS9kZWJ1Zy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3J1bnRpbWUvZGVidWcuYQotcnVudGltZS9wcHJvZi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3J1bnRpbWUvcHByb2YuYQotc2Nhbm5lci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3NjYW5uZXIuYQotc210cC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3NtdHAuYQotc29ydC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3NvcnQuYQotc3RyY29udi5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N0cmNvbnYuYQotc3RyaW5ncy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N0cmluZ3MuYQotc3luYy5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N5bmMuYQotc3lzY2FsbC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3N5c2NhbGwuYQotc3lzbG9nLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vc3lzbG9nLmEKLXRhYndyaXRlci5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RhYndyaXRlci5hCi10ZW1wbGF0ZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RlbXBsYXRlLmEKLXRlc3RpbmcuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZXN0aW5nLmEKLXRlc3RpbmcvaW90ZXN0Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGVzdGluZy9pb3Rlc3QuYQotdGVzdGluZy9xdWljay5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3Rlc3RpbmcvcXVpY2suYQotdGVzdGluZy9zY3JpcHQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90ZXN0aW5nL3NjcmlwdC5hCi10aW1lLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdGltZS5hCi10cnkuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS90cnkuYQotdW5pY29kZS5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3VuaWNvZGUuYQotdXRmMTYuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS91dGYxNi5hCi11dGY4Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vdXRmOC5hCi13ZWJzb2NrZXQuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS93ZWJzb2NrZXQuYQoteG1sLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0veG1sLmEKLS4uL2NtZC9jZ28uaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvY2dvLmEKLS4uL2NtZC9lYm5mbGludC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9lYm5mbGludC5hCi0uLi9jbWQvZ29kb2MuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ29kb2MuYQotLi4vY21kL2dvZm10Lmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dvZm10LmEKLS4uL2NtZC9nb2luc3RhbGwuaW5zdGFsbDogJHtHT1JPT1R9L3BrZy8ke0dPT1N9XyR7R09BUkNIfS8uLi9jbWQvZ29pbnN0YWxsLmEKLS4uL2NtZC9nb3ZldC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9nb3ZldC5hCi0uLi9jbWQvZ295YWNjLmluc3RhbGw6ICR7R09ST09UfS9wa2cvJHtHT09TfV8ke0dPQVJDSH0vLi4vY21kL2dveWFjYy5hCi0uLi9jbWQvaGdwYXRjaC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9Ly4uL2NtZC9oZ3BhdGNoLmEKLXRocmlmdC5pbnN0YWxsOiAke0dPUk9PVH0vcGtnLyR7R09PU31fJHtHT0FSQ0h9L3RocmlmdC5hCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9NYWtlZmlsZSBiL3R1dG9yaWFsL2dvL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM1ZGZlLi4wMDAwMDAwCi0tLSBhL3R1dG9yaWFsL2dvL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLSMgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1pbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5pbmMKLQotYWxsOiBNYWtlLmRlcHMgaW5zdGFsbAotCi1UQVJHPXRocmlmdGxpYi90dXRvcmlhbGNhbGN1bGF0b3IKLQotRElSUz1cCi0gIHNyYy9cCi0KLUdPRklMRVM9XAotCi0KLWNsZWFuLmRpcnM6ICQoYWRkc3VmZml4IC5jbGVhbiwgJChESVJTKSkKLWluc3RhbGwuZGlyczogJChhZGRzdWZmaXggLmluc3RhbGwsICQoRElSUykpCi10ZXN0LmRpcnM6ICQoYWRkc3VmZml4IC50ZXN0LCAkKERJUlMpKQotCi0KLSUuY2xlYW46Ci0JK2NkICQqICYmICQoTUFLRSkgY2xlYW4KLQotJS5pbnN0YWxsOgotCStjZCAkKiAmJiAkKE1BS0UpIGluc3RhbGwKLQotJS50ZXN0OgotCStjZCAkKiAmJiAkKE1BS0UpIHRlc3QKLQotCi0KLU1ha2UuZGVwczoKLQkuL2RlcHMuYmFzaAotCi1kZXBzOgotCS4vZGVwcy5iYXNoCi0KLWNsZWFuOiBjbGVhbi5kaXJzCi0KLWluc3RhbGw6IGluc3RhbGwuZGlycwotCi10ZXN0Ogl0ZXN0LmRpcnMKLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9nby9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU3ZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1OSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvIGdlbi1nby9zaGFyZWQvc2hhcmVkX3NlcnZpY2UuZ286ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGdvJChDT01QSUxFUl9FWFRSQUZMQUcpIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLWdvL3R1dG9yaWFsL2NhbGN1bGF0b3IuZ28KKworY2hlY2s6IHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCB0aGlyZHBhcnR5LWRlcAorCSQoVEhSSUZUKSAtciAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCWNwIC1yIGdlbi1nby8qIHNyYy8KKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gZ28tdHV0b3JpYWwgLi9zcmMKKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLW8gY2FsY3VsYXRvci1yZW1vdGUgc3JjL3R1dG9yaWFsL2NhbGN1bGF0b3ItcmVtb3RlL2NhbGN1bGF0b3ItcmVtb3RlLmdvCisKK3NyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdDoKKwlta2RpciAtcCBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nbworCWxuIC1zZiAkKHJlYWxwYXRoICQodG9wX3NyY2RpcikvbGliL2dvL3RocmlmdCkgc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0CisKK3RoaXJkcGFydHktZGVwOgorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAtc2VydmVyPXRydWUKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28KKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAorCUdPUEFUSD1gcHdkYCAkKEdPKSBydW4gc3JjLyouZ28gLXNlcnZlcj10cnVlIC1zZWN1cmU9dHJ1ZQorCit0dXRvcmlhbHNlY3VyZWNsaWVudDogYWxsCisJR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAtc2VjdXJlPXRydWUKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLSogc3JjL3NoYXJlZCBzcmMvdHV0b3JpYWwgc3JjL2dpdC5hcGFjaGUub3JnIGdvLXR1dG9yaWFsIGNhbGN1bGF0b3ItcmVtb3RlCisKK0VYVFJBX0RJU1QgPSBcCisJc3JjL2NsaWVudC5nbyBcCisJc3JjL2hhbmRsZXIuZ28gXAorCXNyYy9zZXJ2ZXIuZ28gXAorCXNyYy9tYWluLmdvIFwKKwlzZXJ2ZXIuY3J0IFwKKwlzZXJ2ZXIua2V5CisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL2RlcHMuYmFzaCBiL3R1dG9yaWFsL2dvL2RlcHMuYmFzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjNmVjMi4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9nby9kZXBzLmJhc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIS91c3IvYmluL2VudiBiYXNoCi0jIENvcHlyaWdodCAyMDA5IFRoZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQotIyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLU9VVD0iTWFrZS5kZXBzIgotVE1QPSJNYWtlLmRlcHMudG1wIgotCi1pZiBbIC1mICRPVVQgXSAmJiAhIFsgLXcgJE9VVCBdOyB0aGVuCi0JZWNobyAiJDA6ICRPVVQgaXMgcmVhZC1vbmx5OyBhYm9ydGluZy4iIDE+JjIKLQlleGl0IDEKLWZpCi0KLSMgR2V0IGxpc3Qgb2YgZGlyZWN0b3JpZXMgZnJvbSBNYWtlZmlsZQotZGlycz0kKHNlZCAnMSwvXkRJUlM9L2Q7IC9eJC8sJGQ7IHMvXFwvL2cnIE1ha2VmaWxlKQotZGlyczI9JChzZWQgJzEsL15ESVJTPS9kOyAvXiQvLCRkOyBzL1xcLy9nJyAkR09ST09UL3NyYy9wa2cvTWFrZWZpbGUpCi1kaXJzMz0idGhyaWZ0IgotZGlycGF0PSQoZWNobyAkZGlycyAkZGlyczIgJGRpcnMzIHwgc2VkICdzLyAvfC9nOyBzLy4qL14oJikkLycpCi0KLWZvciBkaXIgaW4gJGRpcnM7IGRvICgKLQljZCAkZGlyIHx8IGV4aXQgMQotCi0Jc291cmNlcz0kKHNlZCAtbiAncy9cLmdvXFwvLmdvL3AnIE1ha2VmaWxlKQotCXNvdXJjZXM9JChscyAkc291cmNlcyAyPiAvZGV2L251bGwpICAjIHJlbW92ZSAucywgLmMsIGV0Yy4KLQotCWRlcHM9JCgKLQkJc2VkIC1uICcvXmltcG9ydC4qIi9wOyAvXmltcG9ydFsgXHRdKigvLC9eKS9wJyAkc291cmNlcyAvZGV2L251bGwgfAotCQljdXQgLWQgJyInIC1mMiB8Ci0JCWVncmVwICIkZGlycGF0IiB8Ci0JCWdyZXAgLXYgIl4kZGlyXCQiIHwKLQkJc2VkICdzLyQvLmluc3RhbGwvJyB8Ci0JCXNvcnQgLXUKLQkpCi0KLQllY2hvICRkaXIuaW5zdGFsbDogJGRlcHMKLSkgZG9uZSA+ICRUTVAKLQotZm9yIGRpciBpbiAkZGlyczI7IGRvICgKLSAgZWNobyAkZGlyLmluc3RhbGw6IFwke0dPUk9PVH0vcGtnL1wke0dPT1N9X1wke0dPQVJDSH0vJHtkaXJ9LmEKLSkgZG9uZSA+PiAkVE1QCi1mb3IgZGlyIGluICRkaXJzMzsgZG8gKAotICBlY2hvICRkaXIuaW5zdGFsbDogXCR7R09ST09UfS9wa2cvXCR7R09PU31fXCR7R09BUkNIfS8ke2Rpcn0uYQotKSBkb25lID4+ICRUTVAKLQotbXYgJFRNUCAkT1VUCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zZXJ2ZXIuY3J0IGIvdHV0b3JpYWwvZ28vc2VydmVyLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTVlZjNjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvZ28vc2VydmVyLmNydApAQCAtMCwwICsxLDI1IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVOekNDQXgrZ0F3SUJBZ0lKQU9ZZllmdzdOQ09jTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUd4TVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0F3SVRXRnllV3hoYm1ReEZEQVNCZ05WQkFjTUMwWnZjbVZ6ZENCSWFXeHMKK01TY3dKUVlEVlFRS0RCNVVhR1VnUVhCaFkyaGxJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RmpBVUJnTlYKK0JBc01EVUZ3WVdOb1pTQlVhSEpwWm5ReEVqQVFCZ05WQkFNTUNXeHZZMkZzYUc5emRERWtNQ0lHQ1NxR1NJYjMKK0RRRUpBUllWWkdWMlFIUm9jbWxtZEM1aGNHRmphR1V1YjNKbk1CNFhEVEUwTURRd056RTROVGd3TUZvWERUSXkKK01EWXlOREU0TlRnd01Gb3dnYkV4Q3pBSkJnTlZCQVlUQWxWVE1SRXdEd1lEVlFRSURBaE5ZWEo1YkdGdVpERVUKK01CSUdBMVVFQnd3TFJtOXlaWE4wSUVocGJHd3hKekFsQmdOVkJBb01IbFJvWlNCQmNHRmphR1VnVTI5bWRIZGgKK2NtVWdSbTkxYm1SaGRHbHZiakVXTUJRR0ExVUVDd3dOUVhCaFkyaGxJRlJvY21sbWRERVNNQkFHQTFVRUF3d0oKK2JHOWpZV3hvYjNOME1TUXdJZ1lKS29aSWh2Y05BUWtCRmhWa1pYWkFkR2h5YVdaMExtRndZV05vWlM1dmNtY3cKK2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNxRTlURTl3RVhwNUxSdExRVkRTR1EKK0dWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5U044STJYdzYKK0w5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9IaktOZzZaS2cKKzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCR21abU1JVXcKK0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrdTYyTGlwa1gKK3dDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtdHJoVlFGNG4KK0FnTUJBQUdqVURCT01CMEdBMVVkRGdRV0JCUW84djB3elFQeDNFRWV4SlBHbHhQSzFQcGdLakFmQmdOVkhTTUUKK0dEQVdnQlFvOHYwd3pRUHgzRUVleEpQR2x4UEsxUHBnS2pBTUJnTlZIUk1FQlRBREFRSC9NQTBHQ1NxR1NJYjMKK0RRRUJCUVVBQTRJQkFRQkdGUmlKc2xjWDBhSmt3WnB6VHdTVWRnY2ZLYnB2TkViQ050Vm9oZlFWVEk0YS9vTjUKK1UreXFEWkpnM3ZPYU91aUFacXlIY0lsWjhxeWVzQ2dSTjMxNFRsNC9KUSsrQ1c4bUtqMW1lVGdvNVlGeGNaWW0KK1Q5dnNJM0MrTnpuODRESU5nSTlteDZ5a3RJdDNRT0taUkRwenlQa1V6eHN5SjhKNDI3RGFpbURyalRSK2ZUd0QKKzFEaDA5eGVlTW5TYTV6ZVYxSEVEeUpUcUNYdXRMZXR3US9JeWZtTUJoSXgrbnZCNWY2N3B6L20rRHY2VjByM0kKK3A0SENjZG5EVURHSmJmcXRvcXNBQVRRUVdPK1dXdXN3QjZtT2hEYnZQVHhoUnBacTZBa2dXcXY0Uyt1M00yR08KK3I1cDlGckJnYXZBdzViS081NEMwb1FLcE4vNWZ0YTVsNldzMAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc2VydmVyLmtleSBiL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYzY2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NlcnZlci5rZXkKQEAgLTAsMCArMSwyOCBAQAorLS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCitNSUlFdkFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLWXdnZ1NpQWdFQUFvSUJBUUNxRTlURTl3RVhwNUxSCit0TFFWRFNHUUdWNzgrN1p0UC9JL1phSjZRNlpHbGZ4REZ2WmpGRjczc2VOaEF2bEtsWW0vamZsSUhZTG5OT0N5CitTTjhJMlh3Nkw5TWJDK2p2d2tFS2ZRbzRlRG94Wm5PWmpORjVKMS9sWnRCZU9vd01raGh6Qk1IMVJkczM1MS9ICitqS05nNlpLZzJDbGRkMGo3SGJEdEVpeE9MZ0xiUFJwQmNhWXJMck5NYXNmM0hhbCt4OC9iOHVlMjh4OTNIU1FCCitHbVptTUlVd0FpbkV1L2ZOUDRsTEdsLzBrWmI3NlRueVJwWVNQWW9qdFM2Q25rSCtRTFluc1JSRVhKWXdEMVhrCit1NjJMaXBrWHdDa1JUblo1blVzRE1YNkZQS2dqUUZRQ1dEWEcvTjA5NitQUlVRQUNoaHJYc0orZ0YzTnFXdERtCit0cmhWUUY0bkFnTUJBQUVDZ2dFQVcveTUyWVlXNnlwUk9HYlo5NERRcEZWMGtMTzdxVDhxMEtzeHc1c1BOYUl0CitmRVBSSXltRGE4aWt5SFdKUzVPeG13ODR3bzVqbkpWMjZqYUxtd2UyTHVwcTdYZjFscWVqOGY1TEp0dXY3Y1FSCit4ZnpwMXZNNjVLSkZGSkhwNldxakdxSjZIU1NaT3BWRHNuUVljWFFqUUNkcHlBbWFTV2QzcCtGcVlTWjFtUW1ECitiRk5JN2pxcGN6V1NaaFRkb3RRN3A3SG45VFZDZWhmbFAzeUdJQjNiUSt3Q2NDQjg1ZE9CejIwMUwrWWdhSWNrCitTejQzQTROdldhUUlSTFJEdzdzOUdXNGpZNVQwSnYyODJXSWVBbFZwVnhMSXd1NDhyNFI0eUdUSXg5WWRvd3ZxCis1NytZNWlQUGpBWHh1MFY5dDAwb1MzYll4RGFLaDJEVWZjLzV6b3dxOFFLQmdRRFlOVlBYbWFHMGFJSDR2alE5Cis3ZlJkdy9VRGtZY1FibjZDbmdsUU91NzcvUzhvZ1F6cEtDVkpnSmdrWk5xT1Z0UU1FUHpla0dFY0xUYmplMWdVCis4Qmt5MmsrUEw5VXdiRnkwZW1uT1ZoNHJxck5YSHNSdkpjZWhOVC9QUmI1aGpGM01VTUZWLzBpRDRiK25hRmFFCitqclNXaVoyWlhqMnFmd0FLNTJHRmJ0T3VCUUtCZ1FESllRdUdpWTByMjJFNHdhSm1DU0tjem9CVDNjd2xWeldqCitWMmxqZ0E5UkhMTlRWa3ZOTllRTEd1MnFuZ0ZydHdwZWFTbnNNRGVyVkc0d0tBUVd5Q25ZenhWcmxuQzR1RHJKCitIWHVGRWx0QldpOUZmYmdmc25kMzc0OUFUMG9CUDFOVDJ0TWxlZ3V5ZjVERmdqQ1IzVlJKTGRyVmFhWjhyb3cvCitMcUtjRk1xbk93S0JnQitPSU85OWw3RTU4NFkzVkc2WmRTbmVPTHRObVJYWDJwVDd0Y1pFNDY1WmRIR0g3RGQzCitTWUhoeDlLLytYbit5REgrcExsaS94bGFyQUVsZG1TUDZrMld1VGZmdGxDNzhBZlRPZkFJZDV6TjdDRFI5NzkxCitGeDY3STlYL2l0cTMzdFM4RUl1Wmw1N1A2dVhtLzRHWFJsb1dPYTh4cHZSa1ZzQkFwdVlQbDh0MUFvR0FUUURTCit5MnNsbERPYkJYemxnR2JWMldnTklnU1ozMTF0b1R2M2pKaVhRc2phdVc4eUpSSGxuK2w0SDltemFXRGdraUZjCithbmcxa1VvRHFGNWswZUZRUHh0UWNZZGhLd0VuV1dmd3AzM1JiemZ4QTMyRFBudWJ1enpiWmhmcmtIYUtnbklXCitjeW9yOXVGWWxtMmw3T0RaTGZKZXoyUkt5VHBsWG5PU3NtUXc2YWtDZ1lBejNkajlIc2t5aitIVkoraHQxT2NFCitjN2FpL0VTa1NBN1ZhanAwdGpKcDBFS2pXL3pxOER2VVNYT3RjZG5KZ2tLeWNGbHVMd2JtbmFONHR4QmRzMUMxCitRcjhSdDJzVUNDQk5aZTFMNkRIZTNYQmRia0plOXNnWlZOVGp0VVNRcnp5OFVodnNDcUc0WVdlQ3UwN1N6Y2JjCityZFBVVjkvdVFrZHg4VnJTaHhsRDhBPT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5nbyBiL3R1dG9yaWFsL2dvL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWViMjgzOC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9nby9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotcGFja2FnZSBtYWluOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCAoCi0gICJmbXQiCi0gICJvcyIKLSAgInN0cmNvbnYiCi0gICJ0aHJpZnRsaWIvdHV0b3JpYWwiCi0gICJ0aHJpZnRsaWIvc2hhcmVkIgotKQotCi10eXBlIENhbGN1bGF0b3JIYW5kbGVyIHN0cnVjdCB7Ci0gIGxvZyBtYXBbaW50XSpzaGFyZWQuU2hhcmVkU3RydWN0Ci19Ci0KLWZ1bmMgTmV3Q2FsY3VsYXRvckhhbmRsZXIoKSAqQ2FsY3VsYXRvckhhbmRsZXIgewotICByZXR1cm4gJkNhbGN1bGF0b3JIYW5kbGVye2xvZzptYWtlKG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QpfQotfQotCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgUGluZygpIChlcnIgb3MuRXJyb3IpIHsKLSAgZm10LlByaW50KCJwaW5nKClcbiIpCi0gIHJldHVybiBuaWwKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEFkZChudW0xIGludDMyLCBudW0yIGludDMyKSAocmV0dmFsMTcgaW50MzIsIGVyciBvcy5FcnJvcikgewotICBmbXQuUHJpbnQoImFkZCgiLCBudW0xLCAiLCIsIG51bTIsICIpXG4iKQotICByZXR1cm4gbnVtMSArIG51bTIsIG5pbAotfQotCi1mdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBvdWNoICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uLCBlcnIgb3MuRXJyb3IpIHsKLSAgZm10LlByaW50KCJjYWxjdWxhdGUoIiwgbG9naWQsICIsIHsiLCB3Lk9wLCAiLCIsIHcuTnVtMSwgIiwiLCB3Lk51bTIsICJ9KVxuIikKLSAgc3dpdGNoKHcuT3ApIHsKLSAgY2FzZSB0dXRvcmlhbC5BREQ6Ci0gICAgdmFsID0gdy5OdW0xICsgdy5OdW0yCi0gICAgYnJlYWsKLSAgY2FzZSB0dXRvcmlhbC5TVUJUUkFDVDoKLSAgICB2YWwgPSB3Lk51bTEgLSB3Lk51bTIKLSAgICBicmVhawotICBjYXNlIHR1dG9yaWFsLk1VTFRJUExZOgotICAgIHZhbCA9IHcuTnVtMSAqIHcuTnVtMgotICAgIGJyZWFrCi0gIGNhc2UgdHV0b3JpYWwuRElWSURFOgotICAgIGlmIHcuTnVtMiA9PSAwIHsKLSAgICAgIG91Y2ggPSB0dXRvcmlhbC5OZXdJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIG91Y2guV2hhdCA9IGludDMyKHcuT3ApCi0gICAgICBvdWNoLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCi0gICAgICByZXR1cm4KLSAgICB9Ci0gICAgdmFsID0gdy5OdW0xIC8gdy5OdW0yCi0gICAgYnJlYWsKLSAgZGVmYXVsdDoKLSAgICBvdWNoID0gdHV0b3JpYWwuTmV3SW52YWxpZE9wZXJhdGlvbigpCi0gICAgb3VjaC5XaGF0ID0gaW50MzIody5PcCkKLSAgICBvdWNoLldoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKLSAgICByZXR1cm4KLSAgfQotICBlbnRyeSA6PSBzaGFyZWQuTmV3U2hhcmVkU3RydWN0KCkKLSAgZW50cnkuS2V5ID0gbG9naWQKLSAgZW50cnkuVmFsdWUgPSBzdHJjb252Lkl0b2EoaW50KHZhbCkpCi0gIGsgOj0gaW50KGxvZ2lkKQotICAvKgotICBvbGR2YWx1ZSwgZXhpc3RzIDo9IHAubG9nW2tdCi0gIGlmIGV4aXN0cyB7Ci0gICAgZm10LlByaW50KCJSZXBsYWNpbmcgIiwgb2xkdmFsdWUsICIgd2l0aCAiLCBlbnRyeSwgIiBmb3Iga2V5ICIsIGssICJcbiIpCi0gIH0gZWxzZSB7Ci0gICAgZm10LlByaW50KCJBZGRpbmcgIiwgZW50cnksICIgZm9yIGtleSAiLCBrLCAiXG4iKQotICB9Ci0gICovCi0gIHAubG9nW2tdID0gZW50cnksIHRydWUKLSAgcmV0dXJuIHZhbCwgb3VjaCwgZXJyCi19Ci0KLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBHZXRTdHJ1Y3Qoa2V5IGludDMyKSAoKnNoYXJlZC5TaGFyZWRTdHJ1Y3QsIG9zLkVycm9yKSB7Ci0gIGZtdC5QcmludCgiZ2V0U3RydWN0KCIsIGtleSwgIilcbiIpCi0gIHYsIF8gOj0gcC5sb2dbaW50KGtleSldCi0gIHJldHVybiB2LCBuaWwKLX0KLQotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcCgpIChlcnIgb3MuRXJyb3IpIHsKLSAgZm10LlByaW50KCJ6aXAoKVxuIikKLSAgcmV0dXJuIG5pbAotfQotCmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvR29DbGllbnQuZ28gYi90dXRvcmlhbC9nby9zcmMvR29DbGllbnQuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NDA1MzAuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL0dvQ2xpZW50LmdvCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotcGFja2FnZSBtYWluOwotCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQgKAotICAiZm10IgotICAibmV0IgotICAib3MiCi0gICJ0aHJpZnQiCi0gICJ0aHJpZnRsaWIvdHV0b3JpYWwiCi0pCi0KLWZ1bmMgUGVyZm9ybShjbGllbnQgKnR1dG9yaWFsLkNhbGN1bGF0b3JDbGllbnQpIChlcnIgb3MuRXJyb3IpIHsKLSAgY2xpZW50LlBpbmcoKQotICBmbXQuUHJpbnQoInBpbmcoKVxuIikKLSAgCi0gIHN1bSwgXyA6PSBjbGllbnQuQWRkKDEsIDEpCi0gIGZtdC5QcmludCgiMSsxPSIsIHN1bSwgIlxuIikKLSAgCi0gIHdvcmsgOj0gdHV0b3JpYWwuTmV3V29yaygpCi0gIHdvcmsuT3AgPSB0dXRvcmlhbC5ESVZJREUKLSAgd29yay5OdW0xID0gMQotICB3b3JrLk51bTIgPSAwCi0gIHF1b3RpZW50LCBvdWNoLCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICBmbXQuUHJpbnQoIkVycm9yIGR1cmluZyBvcGVyYXRpb246ICIsIGVyci5TdHJpbmcoKSwgIlxuIikKLSAgICByZXR1cm4gZXJyCi0gIH0gZWxzZSBpZiBvdWNoICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJJbnZhbGlkIG9wZXJhdGlvbjogIiwgb3VjaC5TdHJpbmcoKSwgIlxuIikKLSAgfSBlbHNlIHsKLSAgICBmbXQuUHJpbnQoIldob2Egd2UgY2FuIGRpdmlkZSBieSAwIHdpdGggbmV3IHZhbHVlOiAiLCBxdW90aWVudCwgIlxuIikKLSAgfQotICAKLSAgd29yay5PcCA9IHR1dG9yaWFsLlNVQlRSQUNUCi0gIHdvcmsuTnVtMSA9IDE1Ci0gIHdvcmsuTnVtMiA9IDEwCi0gIGRpZmYsIG91Y2gsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCi0gIGlmIGVyciAhPSBuaWwgewotICAgIGZtdC5QcmludCgiRXJyb3IgZHVyaW5nIG9wZXJhdGlvbjogIiwgZXJyLlN0cmluZygpLCAiXG4iKQotICAgIHJldHVybiBlcnIKLSAgfSBlbHNlIGlmIG91Y2ggIT0gbmlsIHsKLSAgICBmbXQuUHJpbnQoIkludmFsaWQgb3BlcmF0aW9uOiAiLCBvdWNoLlN0cmluZygpLCAiXG4iKQotICB9IGVsc2UgewotICAgIGZtdC5QcmludCgiMTUtMTA9IiwgZGlmZiwgIlxuIikKLSAgfQotICAKLSAgbG9nLCBlcnIgOj0gY2xpZW50LkdldFN0cnVjdCgxKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICBmbXQuUHJpbnQoIlVuYWJsZSB0byBnZXQgc3RydWN0OiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgcmV0dXJuIGVycgotICB9IGVsc2UgewotICAgIGZtdC5QcmludCgiQ2hlY2sgbG9nOiAiLCBsb2cuVmFsdWUsICJcbiIpCi0gIH0KLSAgcmV0dXJuIGVycgotfQotCi0KLWZ1bmMgUnVuQ2xpZW50KHRyYW5zcG9ydEZhY3RvcnkgdGhyaWZ0LlRUcmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkpIG9zLkVycm9yIHsKLSAgYWRkciwgZXJyIDo9IG5ldC5SZXNvbHZlVENQQWRkcigibG9jYWxob3N0OjkwOTAiKQotICBpZiBlcnIgIT0gbmlsIHsKLSAgICBmbXQuUHJpbnQoIkVycm9yIHJlc29sdmluZyBhZGRyZXNzOiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgcmV0dXJuIGVycgotICB9Ci0gIHRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VFNvY2tldEFkZHIoYWRkcikKLSAgaWYgZXJyID0gdHJhbnNwb3J0Lk9wZW4oKTsgZXJyICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJFcnJvciBvcGVuaW5nIGNvbm5lY3Rpb24gZm9yIHByb3RvY29sICIsIGFkZHIuTmV0d29yaygpLCAiIHRvICIsIGFkZHIuU3RyaW5nKCksICI6ICIsIGVyci5TdHJpbmcoKSwgIlxuIikKLSAgICByZXR1cm4gZXJyCi0gIH0KLSAgdXNlVHJhbnNwb3J0IDo9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKLSAgY2xpZW50IDo9IHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JDbGllbnRGYWN0b3J5KHVzZVRyYW5zcG9ydCwgcHJvdG9jb2xGYWN0b3J5KQotICBQZXJmb3JtKGNsaWVudCkKLSAgcmV0dXJuIHRyYW5zcG9ydC5DbG9zZSgpCi19CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvR29TZXJ2ZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvR29TZXJ2ZXIuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MGEyYTkuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL0dvU2VydmVyLmdvCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBtYWluOwotCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQgKAotICAiZm10IgotICAibmV0IgotICAidGhyaWZ0IgotICAidGhyaWZ0bGliL3R1dG9yaWFsIgotKQotCi0KLXR5cGUgR29TZXJ2ZXIgc3RydWN0IHsKLSAgaGFuZGxlciB0dXRvcmlhbC5JQ2FsY3VsYXRvcgotICBwcm9jZXNzb3IgKnR1dG9yaWFsLkNhbGN1bGF0b3JQcm9jZXNzb3IKLX0KLQotZnVuYyBOZXdHb1NlcnZlcigpICpHb1NlcnZlciB7Ci0gIGhhbmRsZXIgOj0gTmV3Q2FsY3VsYXRvckhhbmRsZXIoKQotICBwcm9jZXNzb3IgOj0gdHV0b3JpYWwuTmV3Q2FsY3VsYXRvclByb2Nlc3NvcihoYW5kbGVyKQotICByZXR1cm4gJkdvU2VydmVye2hhbmRsZXI6aGFuZGxlciwgcHJvY2Vzc29yOnByb2Nlc3Nvcn0KLX0KLQotZnVuYyBTaW1wbGUocHJvY2Vzc29yICp0dXRvcmlhbC5DYWxjdWxhdG9yUHJvY2Vzc29yLCB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LCBjaCBjaGFuIGludCkgewotICBhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJsb2NhbGhvc3Q6OTA5MCIpCi0gIGlmIGVyciAhPSBuaWwgewotICAgIGZtdC5QcmludCgiRXJyb3IgcmVzb2x2aW5nIGFkZHJlc3M6ICIsIGVyci5TdHJpbmcoKSwgIlxuIikKLSAgICByZXR1cm4KLSAgfQotICBzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldEFkZHIoYWRkcikKLSAgaWYgZXJyICE9IG5pbCB7Ci0gICAgZm10LlByaW50KCJFcnJvciBjcmVhdGluZyBzZXJ2ZXIgc29ja2V0OiAiLCBlcnIuU3RyaW5nKCksICJcbiIpCi0gICAgcmV0dXJuCi0gIH0KLSAgc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQotICAvLyBVc2UgdGhpcyBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgotICAvLyBUU2VydmVyIHNlcnZlciA9IG5ldyBUVGhyZWFkUG9vbFNlcnZlcihuZXcgVFRocmVhZFBvb2xTZXJ2ZXIuQXJncyhzZXJ2ZXJUcmFuc3BvcnQpLnByb2Nlc3Nvcihwcm9jZXNzb3IpKTsKLSAgCi0gIGZtdC5QcmludCgiU3RhcnRpbmcgdGhlIHNpbXBsZSBzZXJ2ZXIuLi4gb24gIiwgYWRkciwgIlxuIikKLSAgZm9yIHsKLSAgICBlcnIgPSBzZXJ2ZXIuU2VydmUoKQotICAgIGlmIGVyciAhPSBuaWwgewotICAgICAgZm10LlByaW50KCJFcnJvciBkdXJpbmcgc2ltcGxlIHNlcnZlcjogIiwgZXJyLlN0cmluZygpLCAiXG4iKQotICAgICAgcmV0dXJuCi0gICAgfQotICB9Ci0gIGZtdC5QcmludCgiRG9uZSB3aXRoIHRoZSBzaW1wbGUgc2VydmVyXG4iKQotICBjaCA8LSAxCi19Ci0KLWZ1bmMgU2VjdXJlKHByb2Nlc3NvciAqdHV0b3JpYWwuQ2FsY3VsYXRvclByb2Nlc3NvcikgewotICBhZGRyLCBfIDo9IG5ldC5SZXNvbHZlVENQQWRkcigibG9jYWxob3N0OjkwOTEiKQotICBzZXJ2ZXJUcmFuc3BvcnQsIF8gOj0gdGhyaWZ0Lk5ld1ROb25ibG9ja2luZ1NlcnZlclNvY2tldEFkZHIoYWRkcikKLSAgc2VydmVyIDo9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyMihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCkKLSAgZm10LlByaW50KCJTdGFydGluZyB0aGUgc2VjdXJlIHNlcnZlci4uLiBvbiAiLCBhZGRyLCAiXG4iKQotICBzZXJ2ZXIuU2VydmUoKQotICBmbXQuUHJpbnQoIkRvbmUgd2l0aCB0aGUgc2VjdXJlIHNlcnZlclxuIikKLX0KLQotZnVuYyBSdW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSB0aHJpZnQuVFRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgewotICBzZXJ2ZXIgOj0gTmV3R29TZXJ2ZXIoKQotICBjaCA6PSBtYWtlKGNoYW4gaW50KQotICBnbyBTaW1wbGUoc2VydmVyLnByb2Nlc3NvciwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBjaCkKLSAgLy9nbyBTZWN1cmUoc2VydmVyLnByb2Nlc3NvcikKLSAgXyA9IDwtIGNoCi19CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvTWFrZWZpbGUgYi90dXRvcmlhbC9nby9zcmMvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YWNiY2EuLjAwMDAwMDAKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAwOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKLSMgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1pbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5pbmMKLQotYWxsOiBpbnN0YWxsCi0KLVRBUkc9VHV0b3JpYWxTZXJ2ZXJDbGllbnQKLQotRElSUz1cCi0KLUdPRklMRVM9XAotICBDYWxjdWxhdG9ySGFuZGxlci5nb1wKLSAgR29DbGllbnQuZ29cCi0gIEdvU2VydmVyLmdvXAotICBtYWluLmdvCi0KLS1pbmNsdWRlIC4uL01ha2UuZGVwcwotCi1pbmNsdWRlICQoR09ST09UKS9zcmMvTWFrZS5jbWQKLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlYmUwMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KQEAgLTAsMCArMSwxMDggQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImNyeXB0by90bHMiCisJImZtdCIKKwkidHV0b3JpYWwiCisKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCispCisKK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKKworZnVuYyBoYW5kbGVDbGllbnQoY2xpZW50ICp0dXRvcmlhbC5DYWxjdWxhdG9yQ2xpZW50KSAoZXJyIGVycm9yKSB7CisJY2xpZW50LlBpbmcoZGVmYXVsdEN0eCkKKwlmbXQuUHJpbnRsbigicGluZygpIikKKworCXN1bSwgXyA6PSBjbGllbnQuQWRkKGRlZmF1bHRDdHgsIDEsIDEpCisJZm10LlByaW50KCIxKzE9Iiwgc3VtLCAiXG4iKQorCisJd29yayA6PSB0dXRvcmlhbC5OZXdXb3JrKCkKKwl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX0RJVklERQorCXdvcmsuTnVtMSA9IDEKKwl3b3JrLk51bTIgPSAwCisJcXVvdGllbnQsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCisJaWYgZXJyICE9IG5pbCB7CisJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgeworCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgorCQkJZm10LlByaW50bG4oIkludmFsaWQgb3BlcmF0aW9uOiIsIHYpCisJCWRlZmF1bHQ6CisJCQlmbXQuUHJpbnRsbigiRXJyb3IgZHVyaW5nIG9wZXJhdGlvbjoiLCBlcnIpCisJCX0KKwkJcmV0dXJuIGVycgorCX0gZWxzZSB7CisJCWZtdC5QcmludGxuKCJXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCB3aXRoIG5ldyB2YWx1ZToiLCBxdW90aWVudCkKKwl9CisKKwl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX1NVQlRSQUNUCisJd29yay5OdW0xID0gMTUKKwl3b3JrLk51bTIgPSAxMAorCWRpZmYsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKGRlZmF1bHRDdHgsIDEsIHdvcmspCisJaWYgZXJyICE9IG5pbCB7CisJCXN3aXRjaCB2IDo9IGVyci4odHlwZSkgeworCQljYXNlICp0dXRvcmlhbC5JbnZhbGlkT3BlcmF0aW9uOgorCQkJZm10LlByaW50bG4oIkludmFsaWQgb3BlcmF0aW9uOiIsIHYpCisJCWRlZmF1bHQ6CisJCQlmbXQuUHJpbnRsbigiRXJyb3IgZHVyaW5nIG9wZXJhdGlvbjoiLCBlcnIpCisJCX0KKwkJcmV0dXJuIGVycgorCX0gZWxzZSB7CisJCWZtdC5QcmludCgiMTUtMTA9IiwgZGlmZiwgIlxuIikKKwl9CisKKwlsb2csIGVyciA6PSBjbGllbnQuR2V0U3RydWN0KGRlZmF1bHRDdHgsIDEpCisJaWYgZXJyICE9IG5pbCB7CisJCWZtdC5QcmludGxuKCJVbmFibGUgdG8gZ2V0IHN0cnVjdDoiLCBlcnIpCisJCXJldHVybiBlcnIKKwl9IGVsc2UgeworCQlmbXQuUHJpbnRsbigiQ2hlY2sgbG9nOiIsIGxvZy5WYWx1ZSkKKwl9CisJcmV0dXJuIGVycgorfQorCitmdW5jIHJ1bkNsaWVudCh0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LCBhZGRyIHN0cmluZywgc2VjdXJlIGJvb2wpIGVycm9yIHsKKwl2YXIgdHJhbnNwb3J0IHRocmlmdC5UVHJhbnNwb3J0CisJdmFyIGVyciBlcnJvcgorCWlmIHNlY3VyZSB7CisJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKKwkJY2ZnLkluc2VjdXJlU2tpcFZlcmlmeSA9IHRydWUKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNvY2tldChhZGRyLCBjZmcpCisJfSBlbHNlIHsKKwkJdHJhbnNwb3J0LCBlcnIgPSB0aHJpZnQuTmV3VFNvY2tldChhZGRyKQorCX0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJZm10LlByaW50bG4oIkVycm9yIG9wZW5pbmcgc29ja2V0OiIsIGVycikKKwkJcmV0dXJuIGVycgorCX0KKwl0cmFuc3BvcnQsIGVyciA9IHRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KHRyYW5zcG9ydCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCWlmIGVyciA6PSB0cmFuc3BvcnQuT3BlbigpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCW9wcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCisJcmV0dXJuIGhhbmRsZUNsaWVudCh0dXRvcmlhbC5OZXdDYWxjdWxhdG9yQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkpCit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbyBiL3R1dG9yaWFsL2dvL3NyYy9oYW5kbGVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGVlZDAKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwpAQCAtMCwwICsxLDEwMiBAQAorcGFja2FnZSBtYWluCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJzaGFyZWQiCisJInN0cmNvbnYiCisJInR1dG9yaWFsIgorKQorCit0eXBlIENhbGN1bGF0b3JIYW5kbGVyIHN0cnVjdCB7CisJbG9nIG1hcFtpbnRdKnNoYXJlZC5TaGFyZWRTdHJ1Y3QKK30KKworZnVuYyBOZXdDYWxjdWxhdG9ySGFuZGxlcigpICpDYWxjdWxhdG9ySGFuZGxlciB7CisJcmV0dXJuICZDYWxjdWxhdG9ySGFuZGxlcntsb2c6IG1ha2UobWFwW2ludF0qc2hhcmVkLlNoYXJlZFN0cnVjdCl9Cit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBQaW5nKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoInBpbmcoKVxuIikKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBBZGQoY3R4IGNvbnRleHQuQ29udGV4dCwgbnVtMSBpbnQzMiwgbnVtMiBpbnQzMikgKHJldHZhbDE3IGludDMyLCBlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImFkZCgiLCBudW0xLCAiLCIsIG51bTIsICIpXG4iKQorCXJldHVybiBudW0xICsgbnVtMiwgbmlsCit9CisKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBDYWxjdWxhdGUoY3R4IGNvbnRleHQuQ29udGV4dCwgbG9naWQgaW50MzIsIHcgKnR1dG9yaWFsLldvcmspICh2YWwgaW50MzIsIGVyciBlcnJvcikgeworCWZtdC5QcmludCgiY2FsY3VsYXRlKCIsIGxvZ2lkLCAiLCB7Iiwgdy5PcCwgIiwiLCB3Lk51bTEsICIsIiwgdy5OdW0yLCAifSlcbiIpCisJc3dpdGNoIHcuT3AgeworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX0FERDoKKwkJdmFsID0gdy5OdW0xICsgdy5OdW0yCisJCWJyZWFrCisJY2FzZSB0dXRvcmlhbC5PcGVyYXRpb25fU1VCVFJBQ1Q6CisJCXZhbCA9IHcuTnVtMSAtIHcuTnVtMgorCQlicmVhaworCWNhc2UgdHV0b3JpYWwuT3BlcmF0aW9uX01VTFRJUExZOgorCQl2YWwgPSB3Lk51bTEgKiB3Lk51bTIKKwkJYnJlYWsKKwljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREU6CisJCWlmIHcuTnVtMiA9PSAwIHsKKwkJCW91Y2ggOj0gdHV0b3JpYWwuTmV3SW52YWxpZE9wZXJhdGlvbigpCisJCQlvdWNoLldoYXRPcCA9IGludDMyKHcuT3ApCisJCQlvdWNoLldoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisJCQllcnIgPSBvdWNoCisJCQlyZXR1cm4KKwkJfQorCQl2YWwgPSB3Lk51bTEgLyB3Lk51bTIKKwkJYnJlYWsKKwlkZWZhdWx0OgorCQlvdWNoIDo9IHR1dG9yaWFsLk5ld0ludmFsaWRPcGVyYXRpb24oKQorCQlvdWNoLldoYXRPcCA9IGludDMyKHcuT3ApCisJCW91Y2guV2h5ID0gIlVua25vd24gb3BlcmF0aW9uIgorCQllcnIgPSBvdWNoCisJCXJldHVybgorCX0KKwllbnRyeSA6PSBzaGFyZWQuTmV3U2hhcmVkU3RydWN0KCkKKwllbnRyeS5LZXkgPSBsb2dpZAorCWVudHJ5LlZhbHVlID0gc3RyY29udi5JdG9hKGludCh2YWwpKQorCWsgOj0gaW50KGxvZ2lkKQorCS8qCisJICAgb2xkdmFsdWUsIGV4aXN0cyA6PSBwLmxvZ1trXQorCSAgIGlmIGV4aXN0cyB7CisJICAgICBmbXQuUHJpbnQoIlJlcGxhY2luZyAiLCBvbGR2YWx1ZSwgIiB3aXRoICIsIGVudHJ5LCAiIGZvciBrZXkgIiwgaywgIlxuIikKKwkgICB9IGVsc2UgeworCSAgICAgZm10LlByaW50KCJBZGRpbmcgIiwgZW50cnksICIgZm9yIGtleSAiLCBrLCAiXG4iKQorCSAgIH0KKwkqLworCXAubG9nW2tdID0gZW50cnkKKwlyZXR1cm4gdmFsLCBlcnIKK30KKworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEdldFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCBrZXkgaW50MzIpICgqc2hhcmVkLlNoYXJlZFN0cnVjdCwgZXJyb3IpIHsKKwlmbXQuUHJpbnQoImdldFN0cnVjdCgiLCBrZXksICIpXG4iKQorCXYsIF8gOj0gcC5sb2dbaW50KGtleSldCisJcmV0dXJuIHYsIG5pbAorfQorCitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgWmlwKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlmbXQuUHJpbnQoInppcCgpXG4iKQorCXJldHVybiBuaWwKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9tYWluLmdvIGIvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KaW5kZXggMzBiNWQ1Mi4uNzczMGQ3YiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KKysrIGIvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28KQEAgLTEsNSArMSw0IEBACi1wYWNrYWdlIG1haW47Ci0KK3BhY2thZ2UgbWFpbgogCiAvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQpAQCAtMjAsNjcgKzE5LDY0IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KIGltcG9ydCAoCi0gICJmbGFnIgotICAiZm10IgotICAib3MiCi0gICJ0aHJpZnQiCisJImZsYWciCisJImZtdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCisJIm9zIgogKQogCiBmdW5jIFVzYWdlKCkgewotICBmbXQuRnByaW50KG9zLlN0ZGVyciwgIlVzYWdlIG9mICIsIG9zLkFyZ3NbMF0sICIgPC0tc2VydmVyIHwgLS1jbGllbnQ+OlxuIikKLSAgZmxhZy5QcmludERlZmF1bHRzKCkKLSAgZm10LkZwcmludChvcy5TdGRlcnIsICJcbiIpCi0gIG9zLkV4aXQoMCkKKwlmbXQuRnByaW50KG9zLlN0ZGVyciwgIlVzYWdlIG9mICIsIG9zLkFyZ3NbMF0sICI6XG4iKQorCWZsYWcuUHJpbnREZWZhdWx0cygpCisJZm10LkZwcmludChvcy5TdGRlcnIsICJcbiIpCiB9CiAKIGZ1bmMgbWFpbigpIHsKLSAgZmxhZy5Vc2FnZSA9IFVzYWdlCi0gIHZhciBjbGllbnQgYm9vbAotICB2YXIgc2VydmVyIGJvb2wKLSAgdmFyIHByb3RvY29sIHN0cmluZwotICB2YXIgZnJhbWVkIGJvb2wKLSAgdmFyIHVzZUh0dHAgYm9vbAotICB2YXIgaGVscCBib29sCi0gIAotICBmbGFnLkJvb2xWYXIoJmNsaWVudCwgImNsaWVudCIsIGZhbHNlLCAiUnVuIGNsaWVudCIpCi0gIGZsYWcuQm9vbFZhcigmc2VydmVyLCAic2VydmVyIiwgZmFsc2UsICJSdW4gc2VydmVyIikKLSAgZmxhZy5TdHJpbmdWYXIoJnByb3RvY29sLCAiUCIsICJiaW5hcnkiLCAiU3BlY2lmeSB0aGUgcHJvdG9jb2wgKGJpbmFyeSwgY29tcGFjdCwgc2ltcGxlanNvbikiKQotICBmbGFnLkJvb2xWYXIoJmZyYW1lZCwgImZyYW1lZCIsIGZhbHNlLCAiVXNlIGZyYW1lZCB0cmFuc3BvcnQiKQotICBmbGFnLkJvb2xWYXIoJnVzZUh0dHAsICJodHRwIiwgZmFsc2UsICJVc2UgaHR0cCIpCi0gIGZsYWcuQm9vbFZhcigmaGVscCwgImhlbHAiLCBmYWxzZSwgIlNlZSB1c2FnZSBzdHJpbmciKQotICBmbGFnLlBhcnNlKCkKLSAgaWYgaGVscCB8fCAoY2xpZW50ICYmIHNlcnZlcikgfHwgIShjbGllbnQgfHwgc2VydmVyKSB7Ci0gICAgZm10LlByaW50KCJmbGFnLk5BcmcoKSA9PSAiLCBmbGFnLk5BcmcoKSwgIlxuIikKLSAgICBmbGFnLlVzYWdlKCkKLSAgfQotICB2YXIgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5Ci0gIHN3aXRjaCBwcm90b2NvbCB7Ci0gIGNhc2UgImNvbXBhY3QiOgotICAgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpCi0gIGNhc2UgInNpbXBsZWpzb24iOgotICAgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpCi0gIGNhc2UgImpzb24iOgotICAgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUSlNPTlByb3RvY29sRmFjdG9yeSgpCi0gIGNhc2UgImJpbmFyeSIsICIiOgotICAgIHByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xGYWN0b3J5RGVmYXVsdCgpCi0gIGRlZmF1bHQ6Ci0gICAgZm10LkZwcmludChvcy5TdGRlcnIsICJJbnZhbGlkIHByb3RvY29sIHNwZWNpZmllZCIsIHByb3RvY29sLCAiXG4iKQotICAgIFVzYWdlKCkKLSAgICBvcy5FeGl0KDEpCi0gIH0KLSAgdHJhbnNwb3J0RmFjdG9yeSA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQotICBpZiBmcmFtZWQgewotICAgIHRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkodHJhbnNwb3J0RmFjdG9yeSkKLSAgfQotICAKLSAgaWYoY2xpZW50KSB7Ci0gICAgUnVuQ2xpZW50KHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkKLSAgfSBlbHNlIGlmKHNlcnZlcikgewotICAgIFJ1blNlcnZlcih0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCi0gIH0gZWxzZSB7Ci0gICAgZmxhZy5Vc2FnZSgpCi0gIH0KLSAgb3MuRXhpdCgwKQorCWZsYWcuVXNhZ2UgPSBVc2FnZQorCXNlcnZlciA6PSBmbGFnLkJvb2woInNlcnZlciIsIGZhbHNlLCAiUnVuIHNlcnZlciIpCisJcHJvdG9jb2wgOj0gZmxhZy5TdHJpbmcoIlAiLCAiYmluYXJ5IiwgIlNwZWNpZnkgdGhlIHByb3RvY29sIChiaW5hcnksIGNvbXBhY3QsIGpzb24sIHNpbXBsZWpzb24pIikKKwlmcmFtZWQgOj0gZmxhZy5Cb29sKCJmcmFtZWQiLCBmYWxzZSwgIlVzZSBmcmFtZWQgdHJhbnNwb3J0IikKKwlidWZmZXJlZCA6PSBmbGFnLkJvb2woImJ1ZmZlcmVkIiwgZmFsc2UsICJVc2UgYnVmZmVyZWQgdHJhbnNwb3J0IikKKwlhZGRyIDo9IGZsYWcuU3RyaW5nKCJhZGRyIiwgImxvY2FsaG9zdDo5MDkwIiwgIkFkZHJlc3MgdG8gbGlzdGVuIHRvIikKKwlzZWN1cmUgOj0gZmxhZy5Cb29sKCJzZWN1cmUiLCBmYWxzZSwgIlVzZSB0bHMgc2VjdXJlIHRyYW5zcG9ydCIpCisKKwlmbGFnLlBhcnNlKCkKKworCXZhciBwcm90b2NvbEZhY3RvcnkgdGhyaWZ0LlRQcm90b2NvbEZhY3RvcnkKKwlzd2l0Y2ggKnByb3RvY29sIHsKKwljYXNlICJjb21wYWN0IjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJzaW1wbGVqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJqc29uIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkKKwljYXNlICJiaW5hcnkiLCAiIjoKKwkJcHJvdG9jb2xGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwlkZWZhdWx0OgorCQlmbXQuRnByaW50KG9zLlN0ZGVyciwgIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkIiwgcHJvdG9jb2wsICJcbiIpCisJCVVzYWdlKCkKKwkJb3MuRXhpdCgxKQorCX0KKworCXZhciB0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeQorCWlmICpidWZmZXJlZCB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSg4MTkyKQorCX0gZWxzZSB7CisJCXRyYW5zcG9ydEZhY3RvcnkgPSB0aHJpZnQuTmV3VFRyYW5zcG9ydEZhY3RvcnkoKQorCX0KKworCWlmICpmcmFtZWQgeworCQl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJfQorCisJaWYgKnNlcnZlciB7CisJCWlmIGVyciA6PSBydW5TZXJ2ZXIodHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCAqYWRkciwgKnNlY3VyZSk7IGVyciAhPSBuaWwgeworCQkJZm10LlByaW50bG4oImVycm9yIHJ1bm5pbmcgc2VydmVyOiIsIGVycikKKwkJfQorCX0gZWxzZSB7CisJCWlmIGVyciA6PSBydW5DbGllbnQodHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCAqYWRkciwgKnNlY3VyZSk7IGVyciAhPSBuaWwgeworCQkJZm10LlByaW50bG4oImVycm9yIHJ1bm5pbmcgY2xpZW50OiIsIGVycikKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NzA4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCkBAIC0wLDAgKzEsNTQgQEAKK3BhY2thZ2UgbWFpbgorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCAoCisJImNyeXB0by90bHMiCisJImZtdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCisJInR1dG9yaWFsIgorKQorCitmdW5jIHJ1blNlcnZlcih0cmFuc3BvcnRGYWN0b3J5IHRocmlmdC5UVHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5LCBhZGRyIHN0cmluZywgc2VjdXJlIGJvb2wpIGVycm9yIHsKKwl2YXIgdHJhbnNwb3J0IHRocmlmdC5UU2VydmVyVHJhbnNwb3J0CisJdmFyIGVyciBlcnJvcgorCWlmIHNlY3VyZSB7CisJCWNmZyA6PSBuZXcodGxzLkNvbmZpZykKKwkJaWYgY2VydCwgZXJyIDo9IHRscy5Mb2FkWDUwOUtleVBhaXIoInNlcnZlci5jcnQiLCAic2VydmVyLmtleSIpOyBlcnIgPT0gbmlsIHsKKwkJCWNmZy5DZXJ0aWZpY2F0ZXMgPSBhcHBlbmQoY2ZnLkNlcnRpZmljYXRlcywgY2VydCkKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBlcnIKKwkJfQorCQl0cmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU1NMU2VydmVyU29ja2V0KGFkZHIsIGNmZykKKwl9IGVsc2UgeworCQl0cmFuc3BvcnQsIGVyciA9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0KGFkZHIpCisJfQorCQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWZtdC5QcmludGYoIiVUXG4iLCB0cmFuc3BvcnQpCisJaGFuZGxlciA6PSBOZXdDYWxjdWxhdG9ySGFuZGxlcigpCisJcHJvY2Vzc29yIDo9IHR1dG9yaWFsLk5ld0NhbGN1bGF0b3JQcm9jZXNzb3IoaGFuZGxlcikKKwlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmbXQuUHJpbnRsbigiU3RhcnRpbmcgdGhlIHNpbXBsZSBzZXJ2ZXIuLi4gb24gIiwgYWRkcikKKwlyZXR1cm4gc2VydmVyLlNlcnZlKCkKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjI3MTMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOTcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitCSU5fQ1BQID0gYmluL01haW4tZGVidWcKK0JJTl9QSFAgPSBiaW4vcGhwL01haW4tZGVidWcucGhwCitCSU5fUEhQX1dFQiA9IGJpbi9waHAtd2ViLXNlcnZlci9NYWluLWRlYnVnLnBocAorCitnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4IGdlbi1oYXhlL3NoYXJlZC9zaGFyZWRfc2VydmljZS5oeDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gaGF4ZSAtciAkPAorCithbGwtbG9jYWw6ICQoQklOX0NQUCkgJChCSU5fUEhQKSAkKEJJTl9QSFBfV0VCKQorCitjaGVjazogZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCiskKEJJTl9DUFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBjcHAuaHhtbAorCiskKEJJTl9QSFApOiBcCisJCXNyYy8qLmh4IFwKKwkJLi4vLi4vbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0LyoqLyouaHggXAorCQlnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4CisJJChIQVhFKSAtLWN3ZCAuICBwaHAuaHhtbAorCiskKEJJTl9QSFBfV0VCKTogXAorCQlzcmMvKi5oeCBcCisJCS4uLy4uL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC8qKi8qLmh4IFwKKwkJZ2VuLWhheGUvdHV0b3JpYWwvY2FsY3VsYXRvci5oeAorCSQoSEFYRSkgLS1jd2QgLiAgcGhwLXdlYi1zZXJ2ZXIuaHhtbAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJChCSU5fQ1BQKSBzZXJ2ZXIKKwordHV0b3JpYWxzZXJ2ZXJfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSBzZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCSQoQklOX0NQUCkKKwordHV0b3JpYWxjbGllbnRfcGhwOiBhbGwKKwlwaHAgLWYgJChCSU5fUEhQKSAKKwordHV0b3JpYWxzZWN1cmVzZXJ2ZXI6IGFsbAorCSQoQklOX0NQUCkgc2VydmVyIHNlY3VyZQorCit0dXRvcmlhbHNlY3VyZXNlcnZlcl9waHA6IGFsbAorCXBocCAtZiAkKEJJTl9QSFApIHNlcnZlciBzZWN1cmUKKwordHV0b3JpYWxzZWN1cmVjbGllbnQ6IGFsbAorCSQoQklOX0NQUCkgc2VjdXJlCisKK3R1dG9yaWFsc2VjdXJlY2xpZW50X3BocDogYWxsCisJcGhwIC1mICQoQklOX1BIUCkgc2VjdXJlCisKK3R1dG9yaWFsc2VydmVyX3BocF9odHRwOiBhbGwKKwlwaHAgLVMgMTI3LjAuMC4xOjkwOTAgcm91dGVyLnBocAorCit0dXRvcmlhbGNsaWVudF9odHRwOiBhbGwKKwkkKEJJTl9DUFApIGNsaWVudCBodHRwCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi1oYXhlIGJpbgorCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJVHV0b3JpYWwuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvaiBiL3R1dG9yaWFsL2hheGUvVHV0b3JpYWwuaHhwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NmY2NDgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9oYXhlL1R1dG9yaWFsLmh4cHJvagpAQCAtMCwwICsxLDY3IEBACivvu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/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+PSAyLjYsIG5ldHdvcmsgPj0gMi42CisgIGVsc2UKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yayA8IDIuNgogICBFeHRlbnNpb25zOgotICAgIERlcml2ZURhdGFUeXBlYWJsZQorICAgIERlcml2ZURhdGFUeXBlYWJsZSwKKyAgICBFeGlzdGVudGlhbFF1YW50aWZpY2F0aW9uLAorICAgIEZsZXhpYmxlSW5zdGFuY2VzLAorICAgIEtpbmRTaWduYXR1cmVzLAorICAgIE1hZ2ljSGFzaCwKKyAgICBSYW5rTlR5cGVzLAorICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCisgICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvSmF2YUNsaWVudCBiL3R1dG9yaWFsL2phdmEvSmF2YUNsaWVudApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGFlNTE1ZS4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9qYXZhL0phdmFDbGllbnQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLWphdmEgLWNwIC4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYi8qOi4uLy4uL2xpYi9qYXZhL2J1aWxkLyo6dHV0b3JpYWwuamFyIEphdmFDbGllbnQgJDEKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvSmF2YVNlcnZlciBiL3R1dG9yaWFsL2phdmEvSmF2YVNlcnZlcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Y5NzdjYS4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9qYXZhL0phdmFTZXJ2ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgT3B0aW9uYWxseSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgY291bGQgYmUgc2V0IGZvciBTU0wgaW5zdGVhZAotIyBvZiBjb25maWd1cmluZyBpdCBpbiB0aGUgY29kZQotIyAtRGphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZT0uLi8uLi9saWIvamF2YS90ZXN0Ly50cnVzdHN0b3JlCi0jIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9dGhyaWZ0Ci0jIC1EamF2YXgubmV0LnNzbC5rZXlTdG9yZT0uLi8uLi9saWIvamF2YS90ZXN0Ly5rZXlzdG9yZQotIyAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD10aHJpZnQKLQotamF2YSAtY3AgLi4vLi4vbGliL2phdmEvYnVpbGQvbGliLyo6Li4vLi4vbGliL2phdmEvYnVpbGQvKjp0dXRvcmlhbC5qYXIgSmF2YVNlcnZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL2phdmEvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTU5MDhiMQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2phdmEvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2V4cG9ydCBDTEFTU1BBVEgKKworIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgorY2xlYW4tbG9jYWw6CisJQU5UPSQoQU5UKSA7IGlmIHRlc3QgLXogIiQkQU5UIiA7IHRoZW4gQU5UPTogOyBmaSA7IFwKKwkkJEFOVCAkKEFOVF9GTEFHUykgY2xlYW4KKworYWxsLWxvY2FsOgorCSQoQU5UKSAkKEFOVF9GTEFHUykgY29tcGlsZQorCitjaGVjay1sb2NhbDogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0ZXN0CisKK3R1dG9yaWFsOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsc2VydmVyCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkkKEFOVCkgJChBTlRfRkxBR1MpIHR1dG9yaWFsY2xpZW50CisKK0VYVFJBX0RJU1QgPSBcCisJYnVpbGQueG1sIFwKKwlzcmMgXAorCVJFQURNRS5tZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9SRUFETUUgYi90dXRvcmlhbC9qYXZhL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwM2JhNy4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9qYXZhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVN0ZXBzIGZvciBKYXZhIHR1dG9yaWFsCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0xKSBNYWtlIHN1cmUgdGhyaWZ0IGlzIGNvbXBpbGVkLCBib3RoIHRoZSBjb21waWxlciBhbmQgdGhlIEphdmEgbGlicmFyeS4gWW91IHNob3VsZAotYmUgYWJsZSB0byB2ZXJpZnkgdGhlIGZvbGxvd2luZzoKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGZpbGUgLi4vLi4vbGliL2phdmEvYnVpbGQvbGlidGhyaWZ0LSR7dmVyc2lvbn0tJHtyZWxlYXNlfS5qYXIgCi0uLi8uLi9saWIvamF2YS9saWJ0aHJpZnQuamFyOiBaaXAgYXJjaGl2ZSBkYXRhLCBhdCBsZWFzdCB2MS4wIHRvIGV4dHJhY3QKLQotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGZpbGUgLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdAotLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdDogRUxGIDY0LWJpdCBMU0IgZXhlY3V0YWJsZSwgeDg2LTY0LCB2ZXJzaW9uIDEgKFNZU1YpLCBkeW5hbWljYWxseSBsaW5rZWQgKHVzZXMgc2hhcmVkIGxpYnMpLCBmb3IgR05VL0xpbnV4IDIuNi4xNSwgbm90IHN0cmlwcGVkCi0KLXRocmlmdC90dXRvcmlhbC9qYXZhJCBscyAuLi8uLi9saWIvamF2YS9idWlsZC9pdnkvbGliLwotY29tbW9ucy1sYW5nLTIuNS5qYXIgIGp1bml0LTQuNC5qYXIgIHNlcnZsZXQtYXBpLTIuNS5qYXIgIHNsZjRqLWFwaS0xLjUuOC5qYXIgIHNsZjRqLXNpbXBsZS0xLjUuOC5qYXIKLQotCi0yKSBHZW5lcmF0ZSBjb2RlIGZvciBqYXZhOgotCi10aHJpZnQvdHV0b3JpYWwvamF2YSQgY2QgLi4KLXRocmlmdC90dXRvcmlhbCQgdGhyaWZ0IC1yIC1nZW4gamF2YSB0dXRvcmlhbC50aHJpZnQKLQotMykgQ29tcGlsZSBleGFtcGxlCi0KLXRocmlmdC90dXRvcmlhbC9qYXZhJCBhbnQKLQotNCkgUnVuIGV4YW1wbGU6Ci0KLXRocmlmdC90dXRvcmlhbC9qYXZhJCAuL0phdmFTZXJ2ZXIgJgotdGhyaWZ0L3R1dG9yaWFsL2phdmEkIC4vSmF2YUNsaWVudApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvamF2YS9SRUFETUUubWQgYi90dXRvcmlhbC9qYXZhL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTA5ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvamF2YS9SRUFETUUubWQKQEAgLTAsMCArMSwyNCBAQAorVGhyaWZ0IEphdmEgVHV0b3JpYWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisxKSBDb21waWxlIHRoZSBKYXZhIGxpYnJhcnkKKworICAgIHRocmlmdC9saWIvamF2YSQgbWFrZQorb3I6CisKKyAgICB0aHJpZnQvbGliL2phdmEkIGFudAorCis0KSBSdW4gdGhlIHR1dG9yaWFsOgorCitzdGFydCBzZXJ2ZXIgYW5kIGNsaWVudCB3aXRoIG9uZSBzdGVwOgorCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIG1ha2UgdHV0b3JpYWwKKworb3I6CisKKyAgICB0aHJpZnQvdHV0b3JpYWwvamF2YSQgbWFrZSB0dXRvcmlhbHNlcnZlcgorICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBtYWtlIHR1dG9yaWFsY2xpZW50CisKK29yOgorCisgICAgdGhyaWZ0L3R1dG9yaWFsL2phdmEkIGFudCB0dXRvcmlhbHNlcnZlcgorICAgIHRocmlmdC90dXRvcmlhbC9qYXZhJCBhbnQgdHV0b3JpYWxjbGllbnQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sIGIvdHV0b3JpYWwvamF2YS9idWlsZC54bWwKaW5kZXggMmVlMTFjMC4uNTVjZGI4ZiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvamF2YS9idWlsZC54bWwKKysrIGIvdHV0b3JpYWwvamF2YS9idWlsZC54bWwKQEAgLTE4LDE4ICsxOCwyMCBAQAogLS0+CiA8cHJvamVjdCBuYW1lPSJ0dXRvcmlhbCIgZGVmYXVsdD0idHV0b3JpYWwiIGJhc2VkaXI9Ii4iPgogCi0gIDxkZXNjcmlwdGlvbj5UaHJpZnQgVHV0b3JpYWw8L2Rlc2NyaXB0aW9uPgorICA8ZGVzY3JpcHRpb24+VGhyaWZ0IEphdmEgVHV0b3JpYWw8L2Rlc2NyaXB0aW9uPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSJzcmMiIC8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW4iIGxvY2F0aW9uPSIuLi9nZW4tamF2YSIgLz4KKyAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Imdlbi1qYXZhIiAvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQiIGxvY2F0aW9uPSJidWlsZCIgLz4KIAogICA8cGF0aCBpZD0ibGlicy5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQiPgotICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiIC8+Ci0gICAgICA8ZXhjbHVkZSBuYW1lPSItdGVzdC5qYXIiIC8+CisgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWJzIj4KKyAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnRlc3QuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KmphdmFkb2MuamFyIiAvPgorICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgogICAgIDwvZmlsZXNldD4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkL2xpYiI+CisgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgPC9wYXRoPgpAQCAtMzcsMjMgKzM5LDc2IEBACiAgICAgPHBhdGggcmVmaWQ9ImxpYnMuY2xhc3NwYXRoIiAvPgogICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2dlbn0iIC8+CiAgIDwvcGF0aD4KKyAgPHBhdGggaWQ9InR1dG9yaWFsLmNsYXNzcGF0aCI+CisgICAgPHBhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZH0iIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9InR1dG9yaWFsLmphciIgLz4KKyAgPC9wYXRoPgogCiAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CiAgICAgPHRzdGFtcCAvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vbG9nIi8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSI+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiIC8+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0idHV0b3JpYWwiIGRlcGVuZHM9ImNvbXBpbGUiPgorICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9InR1dG9yaWFsIiAvPgorCisgIDx0YXJnZXQgbmFtZT0idHV0b3JpYWwiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIHR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KICAgICA8amFyIGphcmZpbGU9InR1dG9yaWFsLmphciIgYmFzZWRpcj0iJHtidWlsZH0iLz4KKyAgICA8cGFyYWxsZWw+CisgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFTZXJ2ZXIiIGZvcms9InRydWUiIHRpbWVvdXQ9IjEwMDAwIgorICAgICAgICBjbGFzc3BhdGhyZWY9InR1dG9yaWFsLmNsYXNzcGF0aCIgZmFpbG9uZXJyb3I9ImZhbHNlIiBvdXRwdXQ9IiR7YnVpbGR9L2xvZy90dXRvcmlhbC5sb2ciPgorICAgICAgPC9qYXZhPgorICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgIDxzbGVlcCBzZWNvbmRzPSIyIi8+CisgICAgICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzaW1wbGU6PC9lY2hvPgorICAgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICA8YXJnIGxpbmU9InNpbXBsZSIvPgorICAgICAgICA8L2phdmE+CisgICAgICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzZWN1cmU6PC9lY2hvPgorICAgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFDbGllbnQiCisgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICA8YXJnIGxpbmU9InNlY3VyZSIvPgorICAgICAgICA8L2phdmE+CisgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9wYXJhbGxlbD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZSI+CisgICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZSAtLT4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgLXIgIC4uL3R1dG9yaWFsLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHR1dG9yaWFsIGNsaWVudCIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgPGVjaG8+dHV0b3JpYWwgY2xpZW50IHNpbXBsZTo8L2VjaG8+CisgICAgPGphdmEgY2xhc3NuYW1lPSJKYXZhQ2xpZW50IgorICAgICAgY2xhc3NwYXRocmVmPSJ0dXRvcmlhbC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0ic2ltcGxlIi8+CisgICAgPC9qYXZhPgorICAgIDxlY2hvPnR1dG9yaWFsIGNsaWVudCBzZWN1cmU6PC9lY2hvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0iSmF2YUNsaWVudCIKKyAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9InNlY3VyZSIvPgorICAgIDwvamF2YT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0dXRvcmlhbHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHR1dG9yaWFsIHNlcnZlciIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgICA8amF2YSBjbGFzc25hbWU9IkphdmFTZXJ2ZXIiIGZvcms9InRydWUiCisgICAgICAgIGNsYXNzcGF0aHJlZj0idHV0b3JpYWwuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0iZmFsc2UiIG91dHB1dD0iJHtidWlsZH0vbG9nL3R1dG9yaWFsLmxvZyI+CisgICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgogICAgIDxkZWxldGUgZGlyPSIke2J1aWxkfSIgLz4KKyAgICA8ZGVsZXRlIGRpcj0iJHtnZW59Ii8+CiAgICAgPGRlbGV0ZSBmaWxlPSJ0dXRvcmlhbC5qYXIiIC8+CiAgIDwvdGFyZ2V0PgogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5qYXZhIGIvdHV0b3JpYWwvamF2YS9zcmMvQ2FsY3VsYXRvckhhbmRsZXIuamF2YQppbmRleCA0MjE2YmU1Li45Mjk0NGIwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qYXZhL3NyYy9DYWxjdWxhdG9ySGFuZGxlci5qYXZhCisrKyBiL3R1dG9yaWFsL2phdmEvc3JjL0NhbGN1bGF0b3JIYW5kbGVyLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBjYXNlIERJVklERToKICAgICAgIGlmICh3b3JrLm51bTIgPT0gMCkgewogICAgICAgICBJbnZhbGlkT3BlcmF0aW9uIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24oKTsKLSAgICAgICAgaW8ud2hhdCA9IHdvcmsub3AuZ2V0VmFsdWUoKTsKKyAgICAgICAgaW8ud2hhdE9wID0gd29yay5vcC5nZXRWYWx1ZSgpOwogICAgICAgICBpby53aHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIjsKICAgICAgICAgdGhyb3cgaW87CiAgICAgICB9CkBAIC02Niw3ICs2Niw3IEBACiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgSW52YWxpZE9wZXJhdGlvbiBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uKCk7Ci0gICAgICBpby53aGF0ID0gd29yay5vcC5nZXRWYWx1ZSgpOworICAgICAgaW8ud2hhdE9wID0gd29yay5vcC5nZXRWYWx1ZSgpOwogICAgICAgaW8ud2h5ID0gIlVua25vd24gb3BlcmF0aW9uIjsKICAgICAgIHRocm93IGlvOwogICAgIH0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvanMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZlMDg4OAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2pzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitleHBvcnQgQ0xBU1NQQVRICisKKyMgTWFrZSBzdXJlIHRoaXMgZG9lc24ndCBmYWlsIGlmIGFudCBpcyBub3QgY29uZmlndXJlZC4KK2NsZWFuLWxvY2FsOgorCUFOVD0kKEFOVCkgOyBpZiB0ZXN0IC16ICIkJEFOVCIgOyB0aGVuIEFOVD06IDsgZmkgOyBcCisJJCRBTlQgJChBTlRfRkxBR1MpIGNsZWFuCisKK2FsbC1sb2NhbDoKKwkkKEFOVCkgJChBTlRfRkxBR1MpIGNvbXBpbGUKKworY2hlY2stbG9jYWw6IGFsbAorCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJChBTlQpICQoQU5UX0ZMQUdTKSB0dXRvcmlhbHNlcnZlcgorCitFWFRSQV9ESVNUID0gXAorCWJ1aWxkLnhtbCBcCisJc3JjIFwKKwl0dXRvcmlhbC5odG1sCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qcy9idWlsZC54bWwgYi90dXRvcmlhbC9qcy9idWlsZC54bWwKaW5kZXggZjc1Nzc4OS4uMDNhNmU3YyAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvanMvYnVpbGQueG1sCisrKyBiL3R1dG9yaWFsL2pzL2J1aWxkLnhtbApAQCAtMjIsMTkgKzIyLDIyIEBACiAKICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249InNyYyIgLz4KICAgPHByb3BlcnR5IG5hbWU9ImphdmFzcmMiIGxvY2F0aW9uPSIuLi9qYXZhL3NyYyIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Ii4uL2dlbi1qYXZhIiAvPgorICA8cHJvcGVydHkgbmFtZT0iZ2VuIiBsb2NhdGlvbj0iLi4vamF2YS9nZW4tamF2YSIgLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CiAKICAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuIHRocmlmdC0wLngueC50YXIuZ3opIC0tPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLyIgLz4KKyAgPCEtLSBKYXZhU2NyaXB0IHR1dG9yaWFsIGRlcGVuZHMgb24gdGhlIGphdmEgdHV0b3JpYWwgdGhyaWZ0IGhhbmRsZXIgYW5kIHNlcnZlciBpbmZyYXN0cnVjdHVyZSAtLT4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vbGliL2phdmEiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgPC9wYXRoPgpAQCAtNTAsMzAgKzUzLDM5IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KLSAgICA8amF2YWMgc3JjZGlyPSIke2phdmFzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7amF2YXNyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCI+CiAgICAgICA8ZXhjbHVkZSBuYW1lPSJKYXZhQ2xpZW50LmphdmEiLz4KICAgICAgIDxleGNsdWRlIG5hbWU9IkphdmFTZXJ2ZXIuamF2YSIvPgogICAgICAgPGluY2x1ZGUgbmFtZT0iQ2FsY3VsYXRvckhhbmRsZXIuamF2YSIvPgogICAgIDwvamF2YWM+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6YWxsIi8+CiAgICAgPC9qYXZhYz4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KKwogICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsIiBkZXBlbmRzPSJjb21waWxlIj4KICAgICA8amFyIGphcmZpbGU9InR1dG9yaWFsLWpzLmphciIgYmFzZWRpcj0iJHtidWlsZH0iLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXNjcmlwdGlvbj0icnVuIHRoZSB0ZXN0IHNlcnZlciIgZGVwZW5kcz0idHV0b3JpYWwiPgorICA8dGFyZ2V0IG5hbWU9InR1dG9yaWFsc2VydmVyIiBkZXNjcmlwdGlvbj0icnVuIHRoZSB0ZXN0IHNlcnZlciIgZGVwZW5kcz0idHV0b3JpYWwsIGdlbmVyYXRlIj4KICAgICA8amF2YSBjbGFzc25hbWU9Ikh0dHBkIiBmb3JrPSJ0cnVlIgogICAgICAgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgdmFsdWU9Ii4uLy4uLyIgLz4KICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgorICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgIDxhcmcgbGluZT0iLS1nZW4ganMgLXIgIC4uL3R1dG9yaWFsLnRocmlmdCIvPgorICAgIDwvZXhlYz4KKyAgPC90YXJnZXQ+CisKICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+CiAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGR9IiAvPgorICAgIDxkZWxldGUgZGlyPSJnZW4tanMiLz4KICAgICA8ZGVsZXRlIGZpbGU9InR1dG9yaWFsLWpzLmphciIgLz4KICAgPC90YXJnZXQ+CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggYTM0YzlmMy4uZDAyMGJlZAotLS0gYS90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCisrKyBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKQEAgLTIyLDExICsyMiwxMSBAQAogICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KICAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzIC0gVHV0b3JpYWwgRXhhbXBsZTwvdGl0bGU+CiAKLSAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9qcy90aHJpZnQuanMiICAgICAgICAgICAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSIuLi9nZW4tanMvdHV0b3JpYWxfdHlwZXMuanMiICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSIuLi9nZW4tanMvc2hhcmVkX3R5cGVzLmpzIiAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSIuLi9nZW4tanMvU2hhcmVkU2VydmljZS5qcyIgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSIuLi9nZW4tanMvQ2FsY3VsYXRvci5qcyIgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvanMvc3JjL3RocmlmdC5qcyIgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvdHV0b3JpYWxfdHlwZXMuanMiICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvc2hhcmVkX3R5cGVzLmpzIiAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvU2hhcmVkU2VydmljZS5qcyIgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvQ2FsY3VsYXRvci5qcyIgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAKICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjQuMi9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KIApAQCAtNDksNyArNDksNyBAQAogICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CiAgICAgdmFyIGNsaWVudCAgICA9IG5ldyBDYWxjdWxhdG9yQ2xpZW50KHByb3RvY29sKTsKIAotICAgIHZhciB3b3JrID0gbmV3IFdvcmsoKQorICAgIHZhciB3b3JrID0gbmV3IFdvcmsoKTsKICAgICB3b3JrLm51bTEgPSAkKCIjbnVtMSIpLnZhbCgpOwogICAgIHdvcmsubnVtMiA9ICQoIiNudW0yIikudmFsKCk7CiAgICAgd29yay5vcCA9ICQoIiNvcCIpLnZhbCgpOwpAQCAtOTgsNyArOTgsNyBAQAogICA8L3RhYmxlPgogICA8L2Zvcm0+CiAgIAotICA8cD5UaGlzIEphdmEgU2NyaXB0IGV4YW1wbGUgdXNlcyA8YSBocmVmPSJodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQvdHJ1bmsvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ij50dXRvcmlhbC50aHJpZnQ8L2E+IGFuZCBhIFRocmlmdCBzZXJ2ZXIgdXNpbmcgSlNPTiBwcm90b2NvbCBhbmQgSFRUUCB0cmFuc3BvcnQuCisgIDxwPlRoaXMgSmF2YSBTY3JpcHQgZXhhbXBsZSB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCI+dHV0b3JpYWwudGhyaWZ0PC9hPiBhbmQgYSBUaHJpZnQgc2VydmVyIHVzaW5nIEpTT04gcHJvdG9jb2wgYW5kIEhUVFAgdHJhbnNwb3J0LgogICA8L3A+CiAgICAgPHA+CiAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldGNvcmUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM4YmIyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEgQEAKKyEqKi8qLnBmeApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2ogYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTI3MmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMTkgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+Q2xpZW50PC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5DbGllbnQ8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEludGVyZmFjZXNcSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVkOGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDM1NSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OwordXNpbmcgdHV0b3JpYWw7Cit1c2luZyBzaGFyZWQ7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXIgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoKS5BZGREZWJ1ZygpLkNyZWF0ZUxvZ2dlcihuYW1lb2YoQ2xpZW50KSk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBEaXNwbGF5SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbihAIgorVXNhZ2U6IAorICAgIENsaWVudC5leGUgLWhlbHAKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIENsaWVudC5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IC1tYzo8bnVtQ2xpZW50cz4KKyAgICAgICAgd2lsbCBydW4gY2xpZW50IHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpIGFuZCB3aXRoIDEgY2xpZW50CisKK09wdGlvbnM6CisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gYnVmZmVyZWQgdHJhbnNwb3J0IG92ZXIgdGNwIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChhZGRyZXNzIC0gIiJodHRwOi8vbG9jYWxob3N0OjkwOTAiIikgICAgICAgIAorICAgICAgICB0Y3B0bHMgLSB0Y3AgdGxzIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgbXVsdGlwbGV4ZWQgLSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKworICAgIC1tYyAobXVsdGlwbGUgY2xpZW50cyk6CisgICAgICAgIDxudW1DbGllbnRzPiAtIG51bWJlciBvZiBtdWx0aXBsZSBjbGllbnRzIHRvIGNvbm5lY3QgdG8gc2VydmVyIChtYXggMTAwLCBkZWZhdWx0IDEpCisKK1NhbXBsZToKKyAgICBDbGllbnQuZXhlIC10cjp0Y3AgLXA6YmluYXJ5CisiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzID8/IG5ldyBzdHJpbmdbMF07CisKKyAgICAgICAgICAgIGlmIChhcmdzLkFueSh4ID0+IHguU3RhcnRzV2l0aCgiLWhlbHAiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlzcGxheUhlbHAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU3RhcnRpbmcgY2xpZW50Li4uIik7CisKKyAgICAgICAgICAgIHVzaW5nICh2YXIgc291cmNlID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUnVuQXN5bmMoYXJncywgc291cmNlLlRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkFzeW5jKHN0cmluZ1tdIGFyZ3MsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbnVtQ2xpZW50cyA9IEdldE51bWJlck9mQ2xpZW50cyhhcmdzKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydHMgPSBuZXcgVENsaWVudFRyYW5zcG9ydFtudW1DbGllbnRzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2xpZW50czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0ID0gR2V0VHJhbnNwb3J0KGFyZ3MpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydHNbaV0gPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgdHJhbnNwb3J0OiB7dHJhbnNwb3J0c1swXX0iKTsKKworICAgICAgICAgICAgdmFyIHByb3RvY29scyA9IG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPltudW1DbGllbnRzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2xpZW50czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwID0gR2V0UHJvdG9jb2woYXJncywgdHJhbnNwb3J0c1tpXSk7CisgICAgICAgICAgICAgICAgcHJvdG9jb2xzW2ldID0gcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgY2xpZW50IHByb3RvY29sOiB7cHJvdG9jb2xzWzBdLkl0ZW0xfSIpOworCisgICAgICAgICAgICB2YXIgdGFza3MgPSBuZXcgVGFza1tudW1DbGllbnRzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2xpZW50czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0YXNrID0gUnVuQ2xpZW50QXN5bmMocHJvdG9jb2xzW2ldLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgdGFza3NbaV0gPSB0YXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUYXNrLldhaXRBbGwodGFza3MpOworCisgICAgICAgICAgICBhd2FpdCBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXRyIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgVHJhbnNwb3J0IHNlbGVjdGVkVHJhbnNwb3J0OworICAgICAgICAgICAgaWYgKEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgc2VsZWN0ZWRUcmFuc3BvcnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3A6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuTmFtZWRQaXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KCIudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5IdHRwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSHR0cENsaWVudFRyYW5zcG9ydChuZXcgVXJpKCJodHRwOi8vbG9jYWxob3N0OjkwOTAiKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcEJ1ZmZlcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzLkxvb3BiYWNrLCA5MDkwKSk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcFRsczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTAsIEdldENlcnRpZmljYXRlKCksIENlcnRWYWxpZGF0b3IsIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldE51bWJlck9mQ2xpZW50cyhzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbnVtQ2xpZW50cyA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1tYyIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkICMgb2YgY2xpZW50czoge251bUNsaWVudHN9Iik7CisKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgaWYoIGludC5UcnlQYXJzZShudW1DbGllbnRzLCBvdXQgYykgJiYgKDAgPCBjKSAmJiAoYyA8PSAxMDApKQorCQkJCXJldHVybiBjOworCQkJZWxzZQorCQkJCXJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRDZXJ0aWZpY2F0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGR1ZSB0byBmaWxlcyBsb2NhdGlvbiBpbiBuZXQgY29yZSBiZXR0ZXIgdG8gdGFrZSBjZXJ0cyBmcm9tIHRvcCBmb2xkZXIKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9IEdldENlcnRQYXRoKERpcmVjdG9yeS5HZXRQYXJlbnQoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRGaWxlLCAiVGhyaWZ0VGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldENlcnRQYXRoKERpcmVjdG9yeUluZm8gZGksIGludCBtYXhDb3VudCA9IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b3BEaXIgPSBkaTsKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9CisgICAgICAgICAgICAgICAgdG9wRGlyLkVudW1lcmF0ZUZpbGVzKCJUaHJpZnRUZXN0LnBmeCIsIFNlYXJjaE9wdGlvbi5BbGxEaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoY2VydEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4Q291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSBpbiBkaXJlY3RvcmllcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0UGF0aChkaS5QYXJlbnQsIG1heENvdW50IC0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjZXJ0RmlsZS5GdWxsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sob2JqZWN0IHNlbmRlciwKKyAgICAgICAgICAgIHN0cmluZyB0YXJnZXRIb3N0LCBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIGxvY2FsQ2VydGlmaWNhdGVzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJlbW90ZUNlcnRpZmljYXRlLCBzdHJpbmdbXSBhY2NlcHRhYmxlSXNzdWVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldENlcnRpZmljYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIENlcnRWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsUG9saWN5RXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+IEdldFByb3RvY29sKHN0cmluZ1tdIGFyZ3MsIFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItcHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBQcm90b2NvbCBzZWxlY3RlZFByb3RvY29sOworICAgICAgICAgICAgaWYgKEVudW0uVHJ5UGFyc2UocHJvdG9jb2wsIHRydWUsIG91dCBzZWxlY3RlZFByb3RvY29sKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHNlbGVjdGVkUHJvdG9jb2wpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Db21wYWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Kc29uOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEpzb25Qcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5NdWx0aXBsZXhlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHJldHVybnMgQmluYXJ5UHJvdG9jb2wgdG8gYXZvaWQgbWFraW5nIHdyYXBwZWQgcHJvdG9jb2wgYXMgcHVibGljIGluIFRQcm90b2NvbERlY29yYXRvciAoaW4gUnVuQ2xpZW50QXN5bmMgaXQgd2lsbCBiZSB3cmFwcGVkIGludG8gTXVsdGlwbGV4ZWQgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkNsaWVudEFzeW5jKFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+IHByb3RvY29sVHVwbGUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSBwcm90b2NvbFR1cGxlLkl0ZW0yOworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbFR5cGUgPSBwcm90b2NvbFR1cGxlLkl0ZW0xOworCisgICAgICAgICAgICAgICAgVEJhc2VDbGllbnQgY2xpZW50ID0gbnVsbDsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sVHlwZSAhPSBQcm90b2NvbC5NdWx0aXBsZXhlZCkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoQ2FsY3VsYXRvci5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHVzZXMgYmluYXJ5IHByb3RvY29sIHRoZXJlICB0byBjcmVhdGUgTXVsdGlwbGV4ZWQgcHJvdG9jb2xzCisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXVsdGlwbGV4ID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCBuYW1lb2YoQ2FsY3VsYXRvcikpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IENhbGN1bGF0b3IuQ2xpZW50KG11bHRpcGxleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihTaGFyZWRTZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgU2hhcmVkU2VydmljZS5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKFNoYXJlZFNlcnZpY2UuQ2xpZW50KWNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcigkIntjbGllbnQ/LkNsaWVudElkfSAiICsgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcm90b2NvbC5UcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgQ2FsY3VsYXRvci5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBQaW5nQXN5bmMoKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnBpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEFkZEFzeW5jKDEsMSkiKTsKKyAgICAgICAgICAgIHZhciBzdW0gPSBhd2FpdCBjbGllbnQuYWRkQXN5bmMoMSwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKT17c3VtfSIpOworCisgICAgICAgICAgICB2YXIgd29yayA9IG5ldyBXb3JrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3AgPSBPcGVyYXRpb24uRElWSURFLAorICAgICAgICAgICAgICAgIE51bTEgPSAxLAorICAgICAgICAgICAgICAgIE51bTIgPSAwCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC5jYWxjdWxhdGVBc3luYygxLCB3b3JrLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JrLk9wID0gT3BlcmF0aW9uLlNVQlRSQUNUOworICAgICAgICAgICAgd29yay5OdW0xID0gMTU7CisgICAgICAgICAgICB3b3JrLk51bTIgPSAxMDsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQ2FsY3VsYXRlQXN5bmMoMSkiKTsKKyAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGF3YWl0IGNsaWVudC5jYWxjdWxhdGVBc3luYygxLCB3b3JrLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gMTUtMTA9e2RpZmZ9Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbiBpbykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBJbnZhbGlkIG9wZXJhdGlvbjogIiArIGlvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gR2V0U3RydWN0QXN5bmMoMSkiKTsKKyAgICAgICAgICAgIHZhciBsb2cgPSBhd2FpdCBjbGllbnQuZ2V0U3RydWN0QXN5bmMoMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQ2hlY2sgbG9nOiB7bG9nLlZhbHVlfSIpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBaaXBBc3luYygpIHdpdGggZGVsYXkgMTAwbWMgb24gc2VydmVyIHNpZGUiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC56aXBBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBFeGVjdXRlU2hhcmVkU2VydmljZUNsaWVudE9wZXJhdGlvbnMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4sIFNoYXJlZFNlcnZpY2UuQ2xpZW50IGNsaWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgY2xpZW50Lk9wZW5UcmFuc3BvcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIC8vIEFzeW5jIHZlcnNpb24KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gU2hhcmVkU2VydmljZSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIFZhbHVlOiB7bG9nLlZhbHVlfSIpOworICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGVudW0gVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcCwKKyAgICAgICAgICAgIE5hbWVkUGlwZSwKKyAgICAgICAgICAgIEh0dHAsCisgICAgICAgICAgICBUY3BCdWZmZXJlZCwKKyAgICAgICAgICAgIEZyYW1lZCwKKyAgICAgICAgICAgIFRjcFRscworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFByb3RvY29sCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpbmFyeSwKKyAgICAgICAgICAgIENvbXBhY3QsCisgICAgICAgICAgICBKc29uLAorICAgICAgICAgICAgTXVsdGlwbGV4ZWQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4MzgyZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImRlNzhhMDFiLWY3YzYtNDlkMS05N2RhLTY2OWQyZWQzNzY0MSIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbiBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiNjBkCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsOCBAQAoreworICAicHJvZmlsZXMiOiB7CisgICAgIkNsaWVudCI6IHsKKyAgICAgICJjb21tYW5kTmFtZSI6ICJQcm9qZWN0IiwKKyAgICAgICJjb21tYW5kTGluZUFyZ3MiOiAiLXA6bXVsdGlwbGV4ZWQiCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvVGhyaWZ0VGVzdC5wZnggYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvVGhyaWZ0VGVzdC5wZngKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzLy5naXRpZ25vcmUgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc0NDZlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzLy5naXRpZ25vcmUKQEAgLTAsMCArMSwzIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL3NoYXJlZAorL3R1dG9yaWFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2ogYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI5N2EwNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvagpAQCAtMCwwICsxLDMwIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldHN0YW5kYXJkMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5JbnRlcmZhY2VzPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5JbnRlcmZhY2VzPC9QYWNrYWdlSWQ+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uLy4uLy4uL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZXJ2aWNlTW9kZWwuUHJpbWl0aXZlcyIgVmVyc2lvbj0iWzQuNCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0JykiIENvbW1hbmQ9Ii4vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyNmIxNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCI0ZDEzMTYzZC05MDY3LTRjOWMtOGFmMC02NGUwODQ1MTM5N2QiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzA1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIEludGVyZmFjZXMuZGxsCisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIENsaWVudC9vYmoKKwkkKFJNKSAtciBTZXJ2ZXIvYmluCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIEludGVyZmFjZXMvYmluCisJJChSTSkgLXIgSW50ZXJmYWNlcy9vYmoKKworRVhUUkFfRElTVCA9IFwKKwlDbGllbnQgXAorCUludGVyZmFjZXMgXAorCVJFQURNRS5tZCBcCisJU2VydmVyIFwKKwlUdXRvcmlhbC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2gKKwkJCSAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvUkVBRE1FLm1kIGIvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI2ZWY5MgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjc4IEBACisjIEJ1aWxkaW5nIG9mIHNhbXBsZXMgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIE5FVCBDb3JlIFN0YW5kYXJkIDIuMAorLSBORVQgQ29yZSBBcHAgMi4wCisKKyMgSG93IHRvIGJ1aWxkCistIERvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBsYXRlc3QgLk5FVCBDb3JlIFNESyBmb3IgeW91ciBwbGF0Zm9ybSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9jb3JlI3dpbmRvd3N2czIwMTUgKGFyY2hpdmUgZm9yIFNESyAxLjAuMC1wcmV2aWV3Mi0wMDMxMjEgbG9jYXRlZCBieTogaHR0cHM6Ly9naXRodWIuY29tL2RvdG5ldC9jb3JlL2Jsb2IvbWFzdGVyL3JlbGVhc2Utbm90ZXMvZG93bmxvYWQtYXJjaGl2ZS5tZCkKKy0gRW5zdXJlIHRoYXQgeW91IGhhdmUgdGhyaWZ0LmV4ZSB3aGljaCBzdXBwb3J0cyBuZXRjb3JlIGxpYiBhbmQgaXQgYWRkZWQgdG8gUEFUSCAKKy0gR28gdG8gY3VycmVudCBmb2xkZXIgCistIFJ1biAqKmJ1aWxkLnNoKiogb3IgKipidWlsZC5jbWQqKiBmcm9tIHRoZSByb290IG9mIGNsb25lZCByZXBvc2l0b3J5CistIENoZWNrIHRlc3RzIGluICoqc3JjL1Rlc3RzKiogZm9sZGVyCistIENvbnRpbnVlIHdpdGggL3R1dG9yaWFscy9uZXRjb3JlIAorCisjIEhvdyB0byBydW4gCisKK05vdGVzOiBkb3RuZXQgcnVuIHN1cHBvcnRzIHBhc3NpbmcgYXJndW1lbnRzIHRvIGFwcCBhZnRlciAtLSBzeW1ib2xzIChodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvYXJ0aWNsZXMvY29yZS90b29scy9kb3RuZXQtcnVuKSAtIGV4YW1wbGU6ICoqZG90bmV0IHJ1biAtLSAtaCoqIHdpbGwgc2hvdyBoZWxwIGZvciBhcHAKKworLSBidWlsZCAKKy0gZ28gdG8gZm9sZGVyIChDbGllbnQvU2VydmVyKSAKKy0gcnVuIHdpdGggc3BlY2lmeWluZyBvZiBjb3JyZWN0IHBhcmFtZXRlcnMgKipkb3RuZXQgcnVuIC10cjp0Y3AgLXByOm11bHRpcGxleGVkKiosICoqZG90bmV0IHJ1biAtaGVscCoqIChsYXRlciwgYWZ0ZXIgbWlncmF0aW9uIHRvIGNzcHJvaiBhbmQgbGF0ZXN0IFNESyB3aWxsIGJlIHBvc3NpYmlsaXR5IHRvIHVzZSBtb3JlIHVzYWJsZSBmb3JtICoqZG90bmV0IHJ1biAtLSBhcmd1bWVudHMqKikKKworI05vdGVzCistIFBvc3NpYmxlIGFkZGluZyBhZGRpdGlvbmFsIHBsYXRmb3JtcyBhZnRlciBzdGFiaWxpemF0aW9uIG9mIC5ORVQgQ29yZSAocnVudGltZXMsIHBsYXRmb3JtcyAoUmVkIEhhdCBMaW51eCwgT3BlblN1c2UsIGV0Yy4pIAorCisjS25vd24gaXNzdWVzCistIEluIHRyYWNlIGxvZ2dpbmcgbW9kZSB5b3UgY2FuIHNlZSBzb21lIG5vdCBpbXBvcnRhbnQgaW50ZXJuYWwgZXhjZXB0aW9ucworCisjIFJ1bm5pbmcgb2Ygc2FtcGxlcyAKK1BsZWFzZSBpbnN0YWxsIFRocmlmdCBDIyAuTkVUIENvcmUgbGlicmFyeSBvciBjb3B5IHNvdXJjZXMgYW5kIGJ1aWxkIHRoZW0gdG8gY29ycmVjbHkgYnVpbGQgYW5kIHJ1biBzYW1wbGVzIAorCisjIE5ldENvcmUgU2VydmVyCisKK1VzYWdlOiAKKworICAgIFNlcnZlci5leGUgLWgKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIFNlcnZlci5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IAorICAgICAgICB3aWxsIHJ1biBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKworICAgIC10ciAodHJhbnNwb3J0KTogCisgICAgICAgIHRjcCAtIChkZWZhdWx0KSB0Y3AgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICB0Y3BidWZmZXJlZCAtIHRjcCBidWZmZXJlZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGh0dHAgYWRkcmVzcyAtICIibG9jYWxob3N0OjkwOTAiIikKKyAgICAgICAgdGNwdGxzIC0gdGNwIHRyYW5zcG9ydCB3aXRoIHRscyB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKwkJCitTYW1wbGU6CisKKyAgICBTZXJ2ZXIuZXhlIC10cjp0Y3AKKworKipSZW1hcmtzKio6CisKKyAgICBGb3IgVGNwVGxzIG1vZGUgY2VydGlmaWNhdGUncyBmaWxlIFRocmlmdFRlc3QucGZ4IHNob3VsZCBiZSBpbiBkaXJlY3Rvcnkgd2l0aCBiaW5hcmllcyBpbiBjYXNlIG9mIGNvbW1hbmQgbGluZSB1c2FnZSAob3IgYXQgcHJvamVjdCBsZXZlbCBpbiBjYXNlIG9mIGRlYnVnZ2luZyBmcm9tIElERSkuCisgICAgUGFzc3dvcmQgZm9yIGNlcnRpZmljYXRlIC0gIlRocmlmdFRlc3QiLgorCisKKworIyBOZXRDb3JlIENsaWVudAorCitVc2FnZTogCisKKyAgICBDbGllbnQuZXhlIC1oCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBDbGllbnQuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPiAtbWM6PG51bUNsaWVudHM+CisgICAgICAgIHdpbGwgcnVuIGNsaWVudCB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorCisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gYnVmZmVyZWQgdHJhbnNwb3J0IG92ZXIgdGNwIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChhZGRyZXNzIC0gIiJodHRwOi8vbG9jYWxob3N0OjkwOTAiIikgICAgICAgIAorICAgICAgICB0Y3B0bHMgLSB0Y3AgdGxzIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgZnJhbWVkIC0gdGNwIGZyYW1lZCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisKKyAgICAtcHIgKHByb3RvY29sKTogCisgICAgICAgIGJpbmFyeSAtIChkZWZhdWx0KSBiaW5hcnkgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGNvbXBhY3QgLSBjb21wYWN0IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBqc29uIC0ganNvbiBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorCisgICAgQ2xpZW50LmV4ZSAtdHI6dGNwIC1wcjpiaW5hcnkgLW1jOjEwCisKK1JlbWFya3M6CisKKyAgICBGb3IgVGNwVGxzIG1vZGUgY2VydGlmaWNhdGUncyBmaWxlIFRocmlmdFRlc3QucGZ4IHNob3VsZCBiZSBpbiBkaXJlY3RvcnkgCisJd2l0aCBiaW5hcmllcyBpbiBjYXNlIG9mIGNvbW1hbmQgbGluZSB1c2FnZSAob3IgYXQgcHJvamVjdCBsZXZlbCBpbiBjYXNlIG9mIGRlYnVnZ2luZyBmcm9tIElERSkuCisgICAgUGFzc3dvcmQgZm9yIGNlcnRpZmljYXRlIC0gIlRocmlmdFRlc3QiLgorCisjIEhvdyB0byB0ZXN0IGNvbW11bmljYXRpb24gYmV0d2VlbiBOZXRDb3JlIGFuZCBQeXRob24KKworKiBHZW5lcmF0ZSBjb2RlIHdpdGggdGhlIGxhdGVzdCAqKnRocmlmdC5leGUqKiB1dGlsCisqIEVuc3VyZSB0aGF0ICoqdGhyaWZ0LmV4ZSoqIHV0aWwgZ2VuZXJhdGVkIGZvbGRlciAqKmdlbi1weSoqIHdpdGggZ2VuZXJhdGVkIGNvZGUgZm9yIFB5dGhvbgorKiBDcmVhdGUgKipjbGllbnQucHkqKiBhbmQgKipzZXJ2ZXIucHkqKiBmcm9tIHRoZSBjb2RlIGV4YW1wbGVzIGJlbG93IGFuZCBzYXZlIHRoZW0gdG8gdGhlIGZvbGRlciB3aXRoIHByZXZpb3NseSBnZW5lcmF0ZWQgZm9sZGVyICoqZ2VuLXB5KioKKyogUnVuIG5ldGNvcmUgc2FtcGxlcyAoY2xpZW50IGFuZCBzZXJ2ZXIpIGFuZCBweXRob24gc2FtcGxlcyAoY2xpZW50IGFuZCBzZXJ2ZXIpCisKK1JlbWFya3M6CisKK1NhbXBsZXMgb2YgY2xpZW50IGFuZCBzZXJ2ZXIgY29kZSBiZWxvdyB1c2UgY29ycmVjdCBtZXRob2RzIChvcGVyYXRpb25zKSAKK2FuZCBmaWVsZHMgKHByb3BlcnRpZXMpIGFjY29yZGluZyB0byBnZW5lcmF0ZWQgY29udHJhY3RzIGZyb20gKi50aHJpZnQgZmlsZXMKKworQXQgV2luZG93cyAxMCBhZGQgcmVjb3JkICoqMTI3LjAuMC4xIHRlc3RzZXJ2ZXIqKiB0byAqKkM6XFdpbmRvd3NcU3lzdGVtMzJcZHJpdmVyc1xldGNcaG9zdHMqKiBmaWxlCitmb3IgY29ycmVjdCB3b3JrIG9mIHB5dGhvbiBzZXJ2ZXIKKworCisqKlB5dGhvbiBDbGllbnQ6KioKKwkKK2BgYHB5dGhvbgoraW1wb3J0IHN5cworaW1wb3J0IGdsb2IKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbiwgV29yaworCitmcm9tIHRocmlmdCBpbXBvcnQgVGhyaWZ0Citmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorCisKK2RlZiBtYWluKCk6CisgICAgIyBNYWtlIHNvY2tldAorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNvY2tldCgnMTI3LjAuMC4xJywgOTA5MCkKKworICAgICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93CisgICAgdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UQnVmZmVyZWRUcmFuc3BvcnQodHJhbnNwb3J0KQorCisgICAgIyBXcmFwIGluIGEgcHJvdG9jb2wKKyAgICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQorCisgICAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCisKKyAgICAjIENvbm5lY3QhCisgICAgdHJhbnNwb3J0Lm9wZW4oKQorCisgICAgY2xpZW50LlBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQorCisgICAgc3VtID0gY2xpZW50LkFkZCgxLCAxKQorICAgIHByaW50KCgnMSsxPSVkJyAlIChzdW0pKSkKKworICAgIHdvcmsgPSBXb3JrKCkKKworICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uRGl2aWRlCisgICAgd29yay5OdW0xID0gMQorICAgIHdvcmsuTnVtMiA9IDAKKworICAgIHRyeToKKyAgICAgICAgcXVvdGllbnQgPSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisgICAgICAgIHByaW50KCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JykKKyAgICAgICAgcHJpbnQoJ0ZZSSB0aGUgYW5zd2VyIGlzICVkJyAlIHF1b3RpZW50KQorICAgIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uIGFzIGU6CisgICAgICAgIHByaW50KCgnSW52YWxpZE9wZXJhdGlvbjogJXInICUgZSkpCisKKyAgICB3b3JrLk9wID0gT3BlcmF0aW9uLlN1YnN0cmFjdAorICAgIHdvcmsuTnVtMSA9IDE1CisgICAgd29yay5OdW0yID0gMTAKKworICAgIGRpZmYgPSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoKCcxNS0xMD0lZCcgJSAoZGlmZikpKQorCisgICAgbG9nID0gY2xpZW50LkdldFN0cnVjdCgxKQorICAgIHByaW50KCgnQ2hlY2sgbG9nOiAlcycgJSAobG9nLlZhbHVlKSkpCisKKyAgICBjbGllbnQuWmlwKCkKKyAgICBwcmludCgnemlwKCknKQorCisgICAgIyBDbG9zZSEKKyAgICB0cmFuc3BvcnQuY2xvc2UoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB0cnk6CisgICAgbWFpbigpCisgIGV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiBhcyB0eDoKKyAgICBwcmludCgnJXMnICUgdHgubWVzc2FnZSkKK2BgYAorCisKKyoqUHl0aG9uIFNlcnZlcjoqKgorCisKK2BgYHB5dGhvbgoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5JykKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IEludmFsaWRPcGVyYXRpb24sIE9wZXJhdGlvbgorCitmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAorCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAorZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAorZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCisKKworY2xhc3MgQ2FsY3VsYXRvckhhbmRsZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CisKKyAgICBkZWYgUGluZyhzZWxmKToKKyAgICAgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBkZWYgQWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCdhZGQoJWQsJWQpJyAlIChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgorCisgICAgZGVmIENhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQorCisgICAgICAgIGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLkFkZDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSArIHdvcmsuTnVtMgorICAgICAgICBlbGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLlN1YnN0cmFjdDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAtIHdvcmsuTnVtMgorICAgICAgICBlbGlmIHdvcmsuT3AgPT0gT3BlcmF0aW9uLk11bHRpcGx5OgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICogd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uRGl2aWRlOgorICAgICAgICAgICAgaWYgd29yay5OdW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHguV2hhdE9wID0gd29yay5PcAorICAgICAgICAgICAgICAgIHguV2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgLyB3b3JrLk51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHguV2hhdE9wID0gd29yay5PcAorICAgICAgICAgICAgeC5XaHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCisgICAgICAgICAgICByYWlzZSB4CisKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLktleSA9IGxvZ2lkCisgICAgICAgIGxvZy5WYWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKworICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgR2V0U3RydWN0KHNlbGYsIGtleSk6CisgICAgICAgIHByaW50KCdnZXRTdHJ1Y3QoJWQpJyAlIChrZXkpKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorCisgICAgZGVmIFppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3Q9InRlc3RzZXJ2ZXIiLCBwb3J0PTkwOTApCisgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorCisgICAgc2VydmVyID0gVFNlcnZlci5UU2ltcGxlU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCisgICAgcHJpbnQoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKQorICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgcHJpbnQoJ2RvbmUuJykKKworICAgICMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkZWRTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICAjIHNlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZFBvb2xTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKK2BgYApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExODFiYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb2dyYW0uY3MKQEAgLTAsMCArMSw0MjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0LlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5CdWlsZGVyOwordXNpbmcgTWljcm9zb2Z0LkFzcE5ldENvcmUuSG9zdGluZzsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkNvbmZpZ3VyYXRpb247Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5EZXBlbmRlbmN5SW5qZWN0aW9uOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIFNlcnZlcgoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZShMb2dMZXZlbC5UcmFjZSkuQWRkRGVidWcoTG9nTGV2ZWwuVHJhY2UpLkNyZWF0ZUxvZ2dlcihuYW1lb2YoU2VydmVyKSk7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiUHJlc3MgYW55IGtleSB0byBzdG9wLi4uIik7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLlJlYWRMaW5lKCk7CisgICAgICAgICAgICAgICAgc291cmNlLkNhbmNlbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlNlcnZlciBzdG9wcGVkIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgU2VydmVyLmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgU2VydmVyLmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4KKyAgICAgICAgd2lsbCBydW4gc2VydmVyIHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gdGNwIGJ1ZmZlcmVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaHR0cCBhZGRyZXNzIC0gIiJsb2NhbGhvc3Q6OTA5MCIiKQorICAgICAgICB0Y3B0bHMgLSB0Y3AgdHJhbnNwb3J0IHdpdGggdGxzIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCitTYW1wbGU6CisgICAgU2VydmVyLmV4ZSAtdHI6dGNwIAorIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIFJ1bkFzeW5jKHN0cmluZ1tdIGFyZ3MsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRUcmFuc3BvcnQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICB2YXIgc2VsZWN0ZWRQcm90b2NvbCA9IEdldFByb3RvY29sKGFyZ3MpOworCisgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUcmFuc3BvcnQgPT0gVHJhbnNwb3J0Lkh0dHApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEh0dHBTZXJ2ZXJTYW1wbGUoKS5SdW4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJ1blNlbGVjdGVkQ29uZmlndXJhdGlvbkFzeW5jKHNlbGVjdGVkVHJhbnNwb3J0LCBzZWxlY3RlZFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBQcm90b2NvbCBHZXRQcm90b2NvbChzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0ID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLXByIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBQcm90b2NvbCBzZWxlY3RlZFByb3RvY29sKTsKKworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IFRyYW5zcG9ydCBzZWxlY3RlZFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFRyYW5zcG9ydDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuU2VsZWN0ZWRDb25maWd1cmF0aW9uQXN5bmMoVHJhbnNwb3J0IHRyYW5zcG9ydCwgUHJvdG9jb2wgcHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZmFicmljID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKExvZ0xldmVsLlRyYWNlKS5BZGREZWJ1ZyhMb2dMZXZlbC5UcmFjZSk7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7CisKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0ID0gbnVsbDsKKworICAgICAgICAgICAgc3dpdGNoICh0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwOgorICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydCg5MDkwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KHBvcnQ6IDkwOTAsIGNsaWVudFRpbWVvdXQ6IDEwMDAwLCB1c2VCdWZmZXJlZFNvY2tldHM6IHRydWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KCIudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BUbHM6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KDkwOTAsIGZhbHNlLCBHZXRDZXJ0aWZpY2F0ZSgpLCBDbGllbnRDZXJ0VmFsaWRhdG9yLCBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5GcmFtZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KDkwOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgICAgIHN3aXRjaCAocHJvdG9jb2wpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5CaW5hcnk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQ29tcGFjdFByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuSnNvbjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRKc29uUHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5NdWx0aXBsZXhlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBjYWxjSGFuZGxlciA9IG5ldyBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBjYWxjUHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoY2FsY0hhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTZXJ2aWNlSGFuZGxlciA9IG5ldyBTaGFyZWRTZXJ2aWNlQXN5bmNIYW5kbGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzaGFyZWRTZXJ2aWNlUHJvY2Vzc29yID0gbmV3IFNoYXJlZFNlcnZpY2UuQXN5bmNQcm9jZXNzb3Ioc2hhcmVkU2VydmljZUhhbmRsZXIpOworCisgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IobmFtZW9mKENhbGN1bGF0b3IpLCBjYWxjUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IobmFtZW9mKFNoYXJlZFNlcnZpY2UpLCBzaGFyZWRTZXJ2aWNlUHJvY2Vzc29yKTsKKworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBtdWx0aXBsZXhlZFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSwgcHJvdG9jb2wsIG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oCisgICAgICAgICAgICAgICAgICAgICQiU2VsZWN0ZWQgVEFzeW5jU2VydmVyIHdpdGgge3NlcnZlclRyYW5zcG9ydH0gdHJhbnNwb3J0LCB7cHJvY2Vzc29yfSBwcm9jZXNzb3IgYW5kIHtpbnB1dFByb3RvY29sRmFjdG9yeX0gcHJvdG9jb2wgZmFjdG9yaWVzIik7CisKKyAgICAgICAgICAgICAgICB2YXIgc2VydmVyID0gbmV3IEFzeW5jQmFzZVNlcnZlcihwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwgZmFicmljKTsKKworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpOworICAgICAgICAgICAgICAgIGF3YWl0IHNlcnZlci5TZXJ2ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0Q2VydGlmaWNhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkdWUgdG8gZmlsZXMgbG9jYXRpb24gaW4gbmV0IGNvcmUgYmV0dGVyIHRvIHRha2UgY2VydHMgZnJvbSB0b3AgZm9sZGVyCisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPSBHZXRDZXJ0UGF0aChEaXJlY3RvcnkuR2V0UGFyZW50KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgWDUwOUNlcnRpZmljYXRlMihjZXJ0RmlsZSwgIlRocmlmdFRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRDZXJ0UGF0aChEaXJlY3RvcnlJbmZvIGRpLCBpbnQgbWF4Q291bnQgPSA2KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG9wRGlyID0gZGk7CisgICAgICAgICAgICB2YXIgY2VydEZpbGUgPQorICAgICAgICAgICAgICAgIHRvcERpci5FbnVtZXJhdGVGaWxlcygiVGhyaWZ0VGVzdC5wZngiLCBTZWFyY2hPcHRpb24uQWxsRGlyZWN0b3JpZXMpCisgICAgICAgICAgICAgICAgICAgIC5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgICAgICAgaWYgKGNlcnRGaWxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1heENvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIGZpbGUgaW4gZGlyZWN0b3JpZXMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q2VydFBhdGgoZGkuUGFyZW50LCBtYXhDb3VudCAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2VydEZpbGUuRnVsbE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKG9iamVjdCBzZW5kZXIsCisgICAgICAgICAgICBzdHJpbmcgdGFyZ2V0SG9zdCwgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBsb2NhbENlcnRpZmljYXRlcywKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSByZW1vdGVDZXJ0aWZpY2F0ZSwgc3RyaW5nW10gYWNjZXB0YWJsZUlzc3VlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0aWZpY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBDbGllbnRDZXJ0VmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFBvbGljeUVycm9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gVHJhbnNwb3J0CisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcFRscywKKyAgICAgICAgICAgIEZyYW1lZAorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIFByb3RvY29sCisgICAgICAgIHsKKyAgICAgICAgICAgIEJpbmFyeSwKKyAgICAgICAgICAgIENvbXBhY3QsCisgICAgICAgICAgICBKc29uLAorICAgICAgICAgICAgTXVsdGlwbGV4ZWQKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBIdHRwU2VydmVyU2FtcGxlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIFJ1bihDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb25CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLkFkZEVudmlyb25tZW50VmFyaWFibGVzKHByZWZpeDogIkFTUE5FVENPUkVfIikKKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICB2YXIgaG9zdCA9IG5ldyBXZWJIb3N0QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VDb25maWd1cmF0aW9uKGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgLlVzZUtlc3RyZWwoKQorICAgICAgICAgICAgICAgICAgICAuVXNlVXJscygiaHR0cDovL2xvY2FsaG9zdDo5MDkwIikKKyAgICAgICAgICAgICAgICAgICAgLlVzZUNvbnRlbnRSb290KERpcmVjdG9yeS5HZXRDdXJyZW50RGlyZWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VTdGFydHVwPFN0YXJ0dXA+KCkKKyAgICAgICAgICAgICAgICAgICAgLkJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICBob3N0LlJ1bkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBTdGFydHVwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIFN0YXJ0dXAoSUhvc3RpbmdFbnZpcm9ubWVudCBlbnYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBDb25maWd1cmF0aW9uQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuU2V0QmFzZVBhdGgoZW52LkNvbnRlbnRSb290UGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5BZGRFbnZpcm9ubWVudFZhcmlhYmxlcygpOworCisgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gPSBidWlsZGVyLkJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIElDb25maWd1cmF0aW9uUm9vdCBDb25maWd1cmF0aW9uIHsgZ2V0OyB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBieSB0aGUgcnVudGltZS4gVXNlIHRoaXMgbWV0aG9kIHRvIGFkZCBzZXJ2aWNlcyB0byB0aGUgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZVNlcnZpY2VzKElTZXJ2aWNlQ29sbGVjdGlvbiBzZXJ2aWNlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxDYWxjdWxhdG9yLklBc3luYywgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PElUQXN5bmNQcm9jZXNzb3IsIENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3I+KCk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VzLkFkZFRyYW5zaWVudDxUSHR0cFNlcnZlclRyYW5zcG9ydCwgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUuIFVzZSB0aGlzIG1ldGhvZCB0byBjb25maWd1cmUgdGhlIEhUVFAgcmVxdWVzdCBwaXBlbGluZS4KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBDb25maWd1cmUoSUFwcGxpY2F0aW9uQnVpbGRlciBhcHAsIElIb3N0aW5nRW52aXJvbm1lbnQgZW52LAorICAgICAgICAgICAgICAgICAgICBJTG9nZ2VyRmFjdG9yeSBsb2dnZXJGYWN0b3J5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwLlVzZU1pZGRsZXdhcmU8VEh0dHBTZXJ2ZXJUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIENhbGN1bGF0b3JBc3luY0hhbmRsZXIgOiBDYWxjdWxhdG9yLklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8aW50LCBTaGFyZWRTdHJ1Y3Q+IF9sb2cgPSBuZXcgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4oKTsKKworICAgICAgICAgICAgcHVibGljIENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdEFzeW5jKGludCBrZXksCisgICAgICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJHZXRTdHJ1Y3RBc3luYyh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KF9sb2dba2V5XSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIHBpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIlBpbmdBc3luYygpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxpbnQ+IGFkZEFzeW5jKGludCBudW0xLCBpbnQgbnVtMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiQWRkQXN5bmMoe251bTF9LHtudW0yfSkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG51bTEgKyBudW0yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8aW50PiBjYWxjdWxhdGVBc3luYyhpbnQgbG9naWQsIFdvcmsgdywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiQ2FsY3VsYXRlQXN5bmMoe2xvZ2lkfSwgW3t3Lk9wfSx7dy5OdW0xfSx7dy5OdW0yfV0pIik7CisKKyAgICAgICAgICAgICAgICB2YXIgdmFsID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHcuT3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgKyB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAtIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xICogdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHcuTnVtMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0T3AgPSAoaW50KSB3Lk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaHkgPSAiQ2Fubm90IGRpdmlkZSBieSAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSAvIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbyA9IG5ldyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hhdE9wID0gKGludCkgdy5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaHkgPSAiVW5rbm93biBvcGVyYXRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleSA9IGxvZ2lkLAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IHZhbC5Ub1N0cmluZygpCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIF9sb2dbbG9naWRdID0gZW50cnk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KHZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIHppcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiWmlwQXN5bmMoKSB3aXRoIGRlbGF5IDEwMG1jIik7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheSgxMDAsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIFNoYXJlZFNlcnZpY2VBc3luY0hhbmRsZXIgOiBTaGFyZWRTZXJ2aWNlLklBc3luYworICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxTaGFyZWRTdHJ1Y3Q+IGdldFN0cnVjdEFzeW5jKGludCBrZXksIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiR2V0U3RydWN0QXN5bmMoezB9KSIsIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbVJlc3VsdChuZXcgU2hhcmVkU3RydWN0KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtleSA9IGtleSwKKyAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAiR2V0U3RydWN0QXN5bmMiCisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDQyMzUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQwIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Cit1c2luZyBTeXN0ZW0uUnVudGltZS5JbnRlcm9wU2VydmljZXM7CisKKy8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKKy8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCisvLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCisKK1thc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCisKKy8vIFNldHRpbmcgQ29tVmlzaWJsZSB0byBmYWxzZSBtYWtlcyB0aGUgdHlwZXMgaW4gdGhpcyBhc3NlbWJseSBub3QgdmlzaWJsZQorLy8gdG8gQ09NIGNvbXBvbmVudHMuICBJZiB5b3UgbmVlZCB0byBhY2Nlc3MgYSB0eXBlIGluIHRoaXMgYXNzZW1ibHkgZnJvbQorLy8gQ09NLCBzZXQgdGhlIENvbVZpc2libGUgYXR0cmlidXRlIHRvIHRydWUgb24gdGhhdCB0eXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJlMjEwZmMxMC01YWZmLTRiMDQtYWMyMS01OGFmYzdiNzRiMGMiKV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24gYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwNzZmZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpAQCAtMCwwICsxLDggQEAKK3sKKyAgInByb2ZpbGVzIjogeworICAgICJTZXJ2ZXIiOiB7CisgICAgICAiY29tbWFuZE5hbWUiOiAiUHJvamVjdCIsCisgICAgICAiY29tbWFuZExpbmVBcmdzIjogIi1wOm11bHRpcGxleGVkIgorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2ogYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmQzMDMKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMjYgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsuV2ViIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+U2VydmVyPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qIiAvPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uLy4uLy4uL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5Bc3BOZXRDb3JlIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUuU2VydmVyLklJU0ludGVncmF0aW9uIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUuU2VydmVyLktlc3RyZWwiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Db25maWd1cmF0aW9uLkZpbGVFeHRlbnNpb25zIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeCBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbiBiL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGNkNDYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL1R1dG9yaWFsLnNsbgpAQCAtMCwwICsxLDc4IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjExNC4yCitNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDEwLjAuNDAyMTkuMQorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQiLCAiLi5cLi5cbGliXG5ldGNvcmVcVGhyaWZ0XFRocmlmdC5jc3Byb2oiLCAie0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIkludGVyZmFjZXMiLCAiSW50ZXJmYWNlc1xJbnRlcmZhY2VzLmNzcHJvaiIsICJ7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiQ2xpZW50IiwgIkNsaWVudFxDbGllbnQuY3Nwcm9qIiwgIntFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJTZXJ2ZXIiLCAiU2VydmVyXFNlcnZlci5jc3Byb2oiLCAie0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0iCitFbmRQcm9qZWN0CitHbG9iYWwKKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbgorCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQorCQlEZWJ1Z3x4NjQgPSBEZWJ1Z3x4NjQKKwkJRGVidWd8eDg2ID0gRGVidWd8eDg2CisJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQorCQlSZWxlYXNlfHg2NCA9IFJlbGVhc2V8eDY0CisJCVJlbGVhc2V8eDg2ID0gUmVsZWFzZXx4ODYKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbgorCQlTb2x1dGlvbkd1aWQgPSB7MDcwQTVEMUQtQjI5RC00NjAzLTk5OUQtNjkzREI0NDRBRDBEfQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg0ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNSBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCitzZXRsb2NhbAorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKKworOmVvZgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaCBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk3ZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworI2V4aXQgaWYgYW55IGNvbW1hbmQgZmFpbHMKK3NldCAtZQorCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTE2ZmVjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tbm9kZWpzL0NhbGN1bGF0b3IuanMgZ2VuLW5vZGVqcy9TaGFyZWRTZXJ2aWNlLmpzOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLW5vZGVqcy9DYWxjdWxhdG9yLmpzCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwlOT0RFX1BBVEg9IiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzOiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzL2xpYjokKE5PREVQQVRIKSIgJChOT0RFSlMpIE5vZGVTZXJ2ZXIuanMKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZUNsaWVudC5qcworCit0dXRvcmlhbHNlcnZlcl9wcm9taXNlOiBhbGwKKwlOT0RFX1BBVEg9IiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzOiQodG9wX2J1aWxkZGlyKS9saWIvbm9kZWpzL2xpYjokKE5PREVQQVRIKSIgJChOT0RFSlMpIE5vZGVTZXJ2ZXJQcm9taXNlLmpzCisKK3R1dG9yaWFsY2xpZW50X3Byb21pc2U6IGFsbAorCU5PREVfUEFUSD0iJCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanM6JCh0b3BfYnVpbGRkaXIpL2xpYi9ub2RlanMvbGliOiQoTk9ERVBBVEgpIiAkKE5PREVKUykgTm9kZUNsaWVudFByb21pc2UuanMKKworCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCU5vZGVTZXJ2ZXIuanMgXAorCU5vZGVDbGllbnQuanMgXAorCU5vZGVTZXJ2ZXJQcm9taXNlLmpzIFwKKwlOb2RlQ2xpZW50UHJvbWlzZS5qcwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDg4NmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yJyk7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKKwordmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Cit2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7CisgIHRyYW5zcG9ydCA6IHRyYW5zcG9ydCwKKyAgcHJvdG9jb2wgOiBwcm90b2NvbAorfSk7CisKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCisvLyBDcmVhdGUgYSBDYWxjdWxhdG9yIGNsaWVudCB3aXRoIHRoZSBjb25uZWN0aW9uCit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYWxjdWxhdG9yLCBjb25uZWN0aW9uKTsKKworCitjbGllbnQucGluZyhmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgIGNvbnNvbGUubG9nKCdwaW5nKCknKTsKK30pOworCisKK2NsaWVudC5hZGQoMSwxLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgIGNvbnNvbGUubG9nKCIxKzE9IiArIHJlc3BvbnNlKTsKK30pOworCisKK3dvcmsgPSBuZXcgdHR5cGVzLldvcmsoKTsKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERTsKK3dvcmsubnVtMSA9IDE7Cit3b3JrLm51bTIgPSAwOworCitjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmssIGZ1bmN0aW9uKGVyciwgbWVzc2FnZSkgeworICBpZiAoZXJyKSB7CisgICAgY29uc29sZS5sb2coIkludmFsaWRPcGVyYXRpb24gIiArIGVycik7CisgIH0gZWxzZSB7CisgICAgY29uc29sZS5sb2coJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKTsKKyAgfQorfSk7CisKK3dvcmsub3AgPSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUOword29yay5udW0xID0gMTU7Cit3b3JrLm51bTIgPSAxMDsKKworY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrLCBmdW5jdGlvbihlcnIsIG1lc3NhZ2UpIHsKKyAgY29uc29sZS5sb2coJzE1LTEwPScgKyBtZXNzYWdlKTsKKworICBjbGllbnQuZ2V0U3RydWN0KDEsIGZ1bmN0aW9uKGVyciwgbWVzc2FnZSl7CisgICAgY29uc29sZS5sb2coJ0NoZWNrIGxvZzogJyArIG1lc3NhZ2UudmFsdWUpOworCisgICAgLy9jbG9zZSB0aGUgY29ubmVjdGlvbiBvbmNlIHdlJ3JlIGRvbmUKKyAgICBjb25uZWN0aW9uLmVuZCgpOworICB9KTsKK30pOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGMxODQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Cit2YXIgQ2FsY3VsYXRvciA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYWxjdWxhdG9yJyk7Cit2YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL3R1dG9yaWFsX3R5cGVzJyk7Citjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKKwordmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7Cit2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOworCit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7CisgIHRyYW5zcG9ydCA6IHRyYW5zcG9ydCwKKyAgcHJvdG9jb2wgOiBwcm90b2NvbAorfSk7CisKK2Nvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CisgIGFzc2VydChmYWxzZSwgZXJyKTsKK30pOworCisvLyBDcmVhdGUgYSBDYWxjdWxhdG9yIGNsaWVudCB3aXRoIHRoZSBjb25uZWN0aW9uCit2YXIgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUNsaWVudChDYWxjdWxhdG9yLCBjb25uZWN0aW9uKTsKKworCitjbGllbnQucGluZygpCisgIC50aGVuKGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCdwaW5nKCknKTsKKyAgfSk7CisKK2NsaWVudC5hZGQoMSwxKQorICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworCSAgY29uc29sZS5sb2coIjErMT0iICsgcmVzcG9uc2UpOworICB9KTsKKword29yayA9IG5ldyB0dHlwZXMuV29yaygpOword29yay5vcCA9IHR0eXBlcy5PcGVyYXRpb24uRElWSURFOword29yay5udW0xID0gMTsKK3dvcmsubnVtMiA9IDA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgLnRoZW4oZnVuY3Rpb24obWVzc2FnZSkgeworCWNvbnNvbGUubG9nKCdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/Jyk7CisgIH0pCisgIC5mYWlsKGZ1bmN0aW9uKGVycikgeworICAgIGNvbnNvbGUubG9nKCJJbnZhbGlkT3BlcmF0aW9uICIgKyBlcnIpOworICB9KTsKKworCit3b3JrLm9wID0gdHR5cGVzLk9wZXJhdGlvbi5TVUJUUkFDVDsKK3dvcmsubnVtMSA9IDE1Oword29yay5udW0yID0gMTA7CisKK2NsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgLnRoZW4oZnVuY3Rpb24odmFsdWUpIHsKKwkgIGNvbnNvbGUubG9nKCcxNS0xMD0nICsgdmFsdWUpOworCSAgcmV0dXJuIGNsaWVudC5nZXRTdHJ1Y3QoMSk7CisgIH0pCisgIC50aGVuKGZ1bmN0aW9uKG1lc3NhZ2UpIHsKKyAgICAgIGNvbnNvbGUubG9nKCdDaGVjayBsb2c6ICcgKyBtZXNzYWdlLnZhbHVlKTsKKyAgfSkKKyAgLmZpbihmdW5jdGlvbigpIHsKKwkgIC8vY2xvc2UgdGhlIGNvbm5lY3Rpb24gb25jZSB3ZSdyZSBkb25lCisgICAgICBjb25uZWN0aW9uLmVuZCgpOworICB9KTsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVTZXJ2ZXIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkMzgxNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyLmpzCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordmFyIHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOwordmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvQ2FsY3VsYXRvciIpOwordmFyIHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcyIpOwordmFyIFNoYXJlZFN0cnVjdCA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9zaGFyZWRfdHlwZXMiKS5TaGFyZWRTdHJ1Y3Q7CisKK3ZhciBkYXRhID0ge307CisKK3ZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKENhbGN1bGF0b3IsIHsKKyAgcGluZzogZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coInBpbmcoKSIpOworICAgIHJlc3VsdChudWxsKTsKKyAgfSwKKworICBhZGQ6IGZ1bmN0aW9uKG4xLCBuMiwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coImFkZCgiLCBuMSwgIiwiLCBuMiwgIikiKTsKKyAgICByZXN1bHQobnVsbCwgbjEgKyBuMik7CisgIH0sCisKKyAgY2FsY3VsYXRlOiBmdW5jdGlvbihsb2dpZCwgd29yaywgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwiLCB3b3JrLCAiKSIpOworCisgICAgdmFyIHZhbCA9IDA7CisgICAgaWYgKHdvcmsub3AgPT0gdHR5cGVzLk9wZXJhdGlvbi5BREQpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uU1VCVFJBQ1QpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uTVVMVElQTFkpIHsKKyAgICAgIHZhbCA9IHdvcmsubnVtMSAqIHdvcmsubnVtMjsKKyAgICB9IGVsc2UgaWYgKHdvcmsub3AgPT09IHR0eXBlcy5PcGVyYXRpb24uRElWSURFKSB7CisgICAgICBpZiAod29yay5udW0yID09PSAwKSB7CisgICAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICAgIHgud2hhdE9wID0gd29yay5vcDsKKyAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJzsKKyAgICAgICAgcmVzdWx0KHgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTI7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbic7CisgICAgICByZXN1bHQoeCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdCgpOworICAgIGVudHJ5LmtleSA9IGxvZ2lkOworICAgIGVudHJ5LnZhbHVlID0gIiIrdmFsOworICAgIGRhdGFbbG9naWRdID0gZW50cnk7CisKKyAgICByZXN1bHQobnVsbCwgdmFsKTsKKyAgfSwKKworICBnZXRTdHJ1Y3Q6IGZ1bmN0aW9uKGtleSwgcmVzdWx0KSB7CisgICAgY29uc29sZS5sb2coImdldFN0cnVjdCgiLCBrZXksICIpIik7CisgICAgcmVzdWx0KG51bGwsIGRhdGFba2V5XSk7CisgIH0sCisKKyAgemlwOiBmdW5jdGlvbigpIHsKKyAgICBjb25zb2xlLmxvZygiemlwKCkiKTsKKyAgICByZXN1bHQobnVsbCk7CisgIH0KKworfSk7CisKK3NlcnZlci5saXN0ZW4oOTA5MCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlclByb21pc2UuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZVNlcnZlclByb21pc2UuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmMjg3YgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25vZGVqcy9Ob2RlU2VydmVyUHJvbWlzZS5qcwpAQCAtMCwwICsxLDgwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3ZhciB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3IiKTsKK3ZhciB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMiKTsKK3ZhciBTaGFyZWRTdHJ1Y3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvc2hhcmVkX3R5cGVzIikuU2hhcmVkU3RydWN0OworCit2YXIgZGF0YSA9IHt9OworCit2YXIgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihDYWxjdWxhdG9yLCB7CisgIHBpbmc6IGZ1bmN0aW9uKCkgeworICAgIGNvbnNvbGUubG9nKCJwaW5nKCkiKTsKKyAgfSwKKworICBhZGQ6IGZ1bmN0aW9uKG4xLCBuMikgeworICAgIGNvbnNvbGUubG9nKCJhZGQoIiwgbjEsICIsIiwgbjIsICIpIik7CisgICAgcmV0dXJuIG4xICsgbjI7CisgIH0sCisKKyAgY2FsY3VsYXRlOiBmdW5jdGlvbihsb2dpZCwgd29yaykgeworICAgIGNvbnNvbGUubG9nKCJjYWxjdWxhdGUoIiwgbG9naWQsICIsIiwgd29yaywgIikiKTsKKworICAgIHZhciB2YWwgPSAwOworICAgIGlmICh3b3JrLm9wID09IHR0eXBlcy5PcGVyYXRpb24uQUREKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLlNVQlRSQUNUKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLk1VTFRJUExZKSB7CisgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTI7CisgICAgfSBlbHNlIGlmICh3b3JrLm9wID09PSB0dHlwZXMuT3BlcmF0aW9uLkRJVklERSkgeworICAgICAgaWYgKHdvcmsubnVtMiA9PT0gMCkgeworICAgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuSW52YWxpZE9wZXJhdGlvbigpOworICAgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCc7CisJCXRocm93IHg7CisgICAgICB9CisgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTI7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5JbnZhbGlkT3BlcmF0aW9uKCk7CisgICAgICB4LndoYXRPcCA9IHdvcmsub3A7CisgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbic7CisgICAgICB0aHJvdyB4OworICAgIH0KKworICAgIHZhciBlbnRyeSA9IG5ldyBTaGFyZWRTdHJ1Y3QoKTsKKyAgICBlbnRyeS5rZXkgPSBsb2dpZDsKKyAgICBlbnRyeS52YWx1ZSA9ICIiK3ZhbDsKKyAgICBkYXRhW2xvZ2lkXSA9IGVudHJ5OworICAgIHJldHVybiB2YWw7CisgIH0sCisKKyAgZ2V0U3RydWN0OiBmdW5jdGlvbihrZXkpIHsKKyAgICBjb25zb2xlLmxvZygiZ2V0U3RydWN0KCIsIGtleSwgIikiKTsKKyAgICByZXR1cm4gZGF0YVtrZXldOworICB9LAorCisgIHppcDogZnVuY3Rpb24oKSB7CisgICAgY29uc29sZS5sb2coInppcCgpIik7CisgIH0KKworfSk7CisKK3NlcnZlci5saXN0ZW4oOTA5MCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9vY2FtbC9DYWxjQ2xpZW50Lm1sIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY0NsaWVudC5tbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YTg0NjdiCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvQ2FsY0NsaWVudC5tbApAQCAtMCwwICsxLDc0IEBACisoKgorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyB1bmRlciB0aGUgTGljZW5zZS4KKyopCisKK29wZW4gQXJnCitvcGVuIFRocmlmdAorb3BlbiBUdXRvcmlhbF90eXBlcworb3BlbiBTaGFyZWRfdHlwZXMKKworZXhjZXB0aW9uIERpZTs7CitsZXQgc29kID0gZnVuY3Rpb24KKyAgICBTb21lIHYgLT4gdgorICB8IE5vbmUgLT4gcmFpc2UgRGllOzsKKwordHlwZSBjb25uZWN0aW9uID0geworICB0cmFucyA6IFRyYW5zcG9ydC50IDsKKyAgcHJvdG8gOiBUaHJpZnQuUHJvdG9jb2wudDsKKyAgY2FsYyA6IENhbGN1bGF0b3IuY2xpZW50IDsKK30KKworbGV0IGNvbm5lY3Qgfmhvc3QgcG9ydCA9CisgIGxldCB0eCA9IG5ldyBUU29ja2V0LnQgaG9zdCBwb3J0IGluCisgIGxldCBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wudCB0eCBpbgorICBsZXQgY2FsYyA9IG5ldyBDYWxjdWxhdG9yLmNsaWVudCBwcm90byBwcm90byBpbgorICAgIHR4I29wbjsKKyAgICB7IHRyYW5zID0gdHggOyBwcm90byA9IHByb3RvOyBjYWxjID0gY2FsYyB9Cis7OworCitsZXQgZG9jbGllbnQgKCkgPQorICBsZXQgY2xpID0gY29ubmVjdCB+aG9zdDoiMTI3LjAuMC4xIiA5MDkwIGluCisgIHRyeQorICAgIGNsaS5jYWxjI3BpbmcgOworICAgIFByaW50Zi5wcmludGYgInBpbmcoKVxuIiA7IGZsdXNoIHN0ZG91dCA7CisgICAgKGxldCBzdW0gPSBjbGkuY2FsYyNhZGQgKEludDMyLm9mX2ludCAxKSAoSW50MzIub2ZfaW50IDEpIGluCisgICAgICAgUHJpbnRmLnByaW50ZiAiMSsxPSVsZFxuIiBzdW0gOworICAgICAgIGZsdXNoIHN0ZG91dCkgOworICAgIChsZXQgdyA9IG5ldyB3b3JrIGluCisgICAgICAgdyNzZXRfb3AgT3BlcmF0aW9uLkRJVklERSA7CisgICAgICAgdyNzZXRfbnVtMSAoSW50MzIub2ZfaW50IDEpIDsKKyAgICAgICB3I3NldF9udW0yIChJbnQzMi5vZl9pbnQgMCkgOworICAgICAgIHRyeQorCSBsZXQgcXVvdGllbnQgPSBjbGkuY2FsYyNjYWxjdWxhdGUgKEludDMyLm9mX2ludCAxKSB3IGluCisJICAgUHJpbnRmLnByaW50ZiAiV2hvYT8gV2UgY2FuIGRpdmlkZSBieSB6ZXJvIVxuIiA7IGZsdXNoIHN0ZG91dAorICAgICAgIHdpdGggSW52YWxpZE9wZXJhdGlvbiBpbyAtPgorCSBQcmludGYucHJpbnRmICJJbnZhbGlkT3BlcmF0aW9uOiAlc1xuIiBpbyNncmFiX3doeSA7IGZsdXNoIHN0ZG91dCkgOworICAgIChsZXQgdyA9IG5ldyB3b3JrIGluCisgICAgICAgdyNzZXRfb3AgT3BlcmF0aW9uLlNVQlRSQUNUIDsKKyAgICAgICB3I3NldF9udW0xIChJbnQzMi5vZl9pbnQgMTUpIDsKKyAgICAgICB3I3NldF9udW0yIChJbnQzMi5vZl9pbnQgMTApIDsKKyAgICAgICBsZXQgZGlmZiA9IGNsaS5jYWxjI2NhbGN1bGF0ZSAoSW50MzIub2ZfaW50IDEpIHcgaW4KKwkgUHJpbnRmLnByaW50ZiAiMTUtMTA9JWxkXG4iIGRpZmYgOyBmbHVzaCBzdGRvdXQpIDsKKyAgICAobGV0IHNzID0gY2xpLmNhbGMjZ2V0U3RydWN0IChJbnQzMi5vZl9pbnQgMSkgaW4KKyAgICAgICBQcmludGYucHJpbnRmICJDaGVjayBsb2c6ICVzXG4iIHNzI2dyYWJfdmFsdWUgOyBmbHVzaCBzdGRvdXQpIDsKKyAgICBjbGkudHJhbnMjY2xvc2UKKyAgd2l0aCBUcmFuc3BvcnQuRSAoXyx3aGF0KSAtPgorICAgIFByaW50Zi5wcmludGYgIkVSUk9SOiAlc1xuIiB3aGF0IDsgZmx1c2ggc3Rkb3V0Cis7OworCitkb2NsaWVudCgpOzsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL0NhbGNTZXJ2ZXIubWwgYi90dXRvcmlhbC9vY2FtbC9DYWxjU2VydmVyLm1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1ZmFjYjcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9vY2FtbC9DYWxjU2VydmVyLm1sCkBAIC0wLDAgKzEsODkgQEAKKygqCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIHVuZGVyIHRoZSBMaWNlbnNlLgorKikKKworb3BlbiBBcmcKK29wZW4gVGhyaWZ0CitvcGVuIFR1dG9yaWFsX3R5cGVzCitvcGVuIFNoYXJlZF90eXBlcworCitleGNlcHRpb24gRGllOzsKK2xldCBzb2QgPSBmdW5jdGlvbgorICAgIFNvbWUgdiAtPiB2CisgIHwgTm9uZSAtPiByYWlzZSBEaWU7OworCitjbGFzcyBjYWxjX2hhbmRsZXIgPQorb2JqZWN0IChzZWxmKQorICBpbmhlcml0IENhbGN1bGF0b3IuaWZhY2UKKyAgdmFsIGxvZyA9IEhhc2h0YmwuY3JlYXRlIDIzCisgIG1ldGhvZCBwaW5nICA9IFByaW50Zi5wcmludGYgInBpbmcoKVxuIiA7IGZsdXNoIHN0ZG91dAorICBtZXRob2QgYWRkIGEgYiA9CisgICAgUHJpbnRmLnByaW50ZiJhZGQoJWxkLCVsZClcbiIgKHNvZCBhKSAoc29kIGIpOyBmbHVzaCBzdGRvdXQgOworICAgIEludDMyLmFkZCAoc29kIGEpIChzb2QgYikKKyAgbWV0aG9kIGNhbGN1bGF0ZSBsb2dpZCB3ID0KKyAgICBsZXQgdyA9IHNvZCB3IGluCisgICAgICBQcmludGYucHJpbnRmICJjYWxjdWxhdGUoJWxkLHslbGQsJWxkLCVsZH0pXG4iIChzb2QgbG9naWQpIChPcGVyYXRpb24udG9faSB3I2dyYWJfb3ApIHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yOyBmbHVzaCBzdGRvdXQgOworICAgIGxldCBydiA9CisgICAgICBtYXRjaCB3I2dyYWJfb3Agd2l0aAorCSAgT3BlcmF0aW9uLkFERCAtPgorCSAgICBJbnQzMi5hZGQgdyNncmFiX251bTEgdyNncmFiX251bTIKKwl8IE9wZXJhdGlvbi5TVUJUUkFDVCAtPgorCSAgICBJbnQzMi5zdWIgdyNncmFiX251bTEgdyNncmFiX251bTIKKwl8IE9wZXJhdGlvbi5NVUxUSVBMWSAtPgorCSAgICBJbnQzMi5tdWwgdyNncmFiX251bTEgdyNncmFiX251bTIKKwl8IE9wZXJhdGlvbi5ESVZJREUgLT4KKwkgICAgaWYgdyNncmFiX251bTIgPSBJbnQzMi56ZXJvIHRoZW4KKwkgICAgICBsZXQgaW8gPSBuZXcgaW52YWxpZE9wZXJhdGlvbiBpbgorCQlpbyNzZXRfd2hhdE9wIChPcGVyYXRpb24udG9faSB3I2dyYWJfb3ApIDsKKwkJaW8jc2V0X3doeSAiQ2Fubm90IGRpdmlkZSBieSAwIiA7CisJCXJhaXNlIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorCSAgICBlbHNlCisJICAgICAgSW50MzIuZGl2IHcjZ3JhYl9udW0xIHcjZ3JhYl9udW0yIGluCisKKyAgICBsZXQgc3MgPSBuZXcgc2hhcmVkU3RydWN0IGluCisgICAgICBzcyNzZXRfa2V5IChzb2QgbG9naWQpIDsKKyAgICBsZXQgYnVmZmVyID0gSW50MzIudG9fc3RyaW5nIHJ2IGluCisgICAgICBzcyNzZXRfdmFsdWUgYnVmZmVyIDsKKyAgICAgIEhhc2h0YmwuYWRkIGxvZyAoc29kIGxvZ2lkKSBzcyA7CisgICAgICBydgorCisgIG1ldGhvZCB6aXAgPQorICAgIFByaW50Zi5wcmludGYgInppcCgpXG4iOyBmbHVzaCBzdGRvdXQKKworICBtZXRob2QgZ2V0U3RydWN0IGxvZ2lkID0KKyAgICBQcmludGYucHJpbnRmICJnZXRTdHJ1Y3QoJWxkKVxuIiAoc29kIGxvZ2lkKSA7IGZsdXNoIHN0ZG91dCA7CisgICAgSGFzaHRibC5maW5kIGxvZyAoc29kIGxvZ2lkKQorCitlbmQKKworbGV0IGRvc2VydmVyICgpID0KKyAgbGV0IGggPSBuZXcgY2FsY19oYW5kbGVyIGluCisgIGxldCBwcm9jID0gbmV3IENhbGN1bGF0b3IucHJvY2Vzc29yIGggaW4KKyAgbGV0IHBvcnQgPSA5MDkwIGluCisgIGxldCBwZiA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuZmFjdG9yeSBpbgorICBsZXQgc2VydmVyID0gbmV3IFRUaHJlYWRlZFNlcnZlci50CisJCSBwcm9jCisJCSAobmV3IFRTZXJ2ZXJTb2NrZXQudCBwb3J0KQorCQkgKG5ldyBUcmFuc3BvcnQuZmFjdG9yeSkKKwkJIHBmCisJCSBwZgorICBpbgorICAgIHNlcnZlciNzZXJ2ZQorOzsKKworZG9zZXJ2ZXIoKTs7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9vY2FtbC9SRUFETUUubWQgYi90dXRvcmlhbC9vY2FtbC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4ZTgzNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL29jYW1sL1JFQURNRS5tZApAQCAtMCwwICsxLDE1IEBACisKK1RoaXMgaXMgdGhlIG9jYW1sIHR1dG9yaWFsIGV4YW1wbGUuICBJdCBhc3N1bWVzIHRoYXQgeW91J3ZlIGFscmVhZHkKK2J1aWx0IGFuZCBpbnN0YWxsZWQgdGhlIHRocmlmdCBvY2FtbCBydW50aW1lIGxpYnJhcmllcyBpbiBsaWIvb2NhbWwuCisKK1RvIGNvbXBpbGUgdGhpcywgeW91IHdpbGwgbmVlZCB0byBnZW5lcmF0ZSB0aGUgVGhyaWZ0IHNvdXJjZXMgZm9yCitvY2FtbCBpbiB0aGlzIGRpcmVjdG9yeSAoZHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBPQVNJUyBidWlsZC10b29sKToKKworICAlIHRocmlmdCAtciAtLWdlbiBvY2FtbCAuLi90dXRvcmlhbC50aHJpZnQKKyAgJSBvYXNpcyBzZXR1cAorICAlIG1ha2UKKworVGhpcyB3aWxsIHByb2R1Y2UgdHdvIGV4ZWN1dGFibGVzIENhbGN7U2VydmVyLENsaWVudH0uPHR5cGU+IHdoZXJlCis8dHlwZT4gaXMgb25lIG9mICJieXRlIiBvciAibmF0aXZlIiwgZGVwZW5kaW5nIG9uIHlvdXIgb2NhbWwKK2luc3RhbGxhdGlvbi4gIEp1c3QgcnVuIHRoZSBzZXJ2ZXIgaW4gdGhlIGJhY2tncm91bmQsIHRoZW4gdGhlIGNsaWVudAorKGFzIHlvdSB3b3VsZCBkbyBmb3IgdGhlIEMrKyBleGFtcGxlKS4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL19vYXNpcyBiL3R1dG9yaWFsL29jYW1sL19vYXNpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDVjMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCkBAIC0wLDAgKzEsMzIgQEAKK05hbWU6IHR1dG9yaWFsCitWZXJzaW9uOiAxLjAuMAorT0FTSVNGb3JtYXQ6IDAuMworU3lub3BzaXM6IE9DYW1sIFR1dG9yaWFsIGV4YW1wbGUKK0F1dGhvcnM6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorTGljZW5zZTogQXBhY2hlLTIuMAorSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZworQnVpbGRUb29sczogb2NhbWxidWlsZAorUGx1Z2luczogICAgIE1FVEEgKDAuMyksCisgIERldkZpbGVzICgwLjMpCisKK0xpYnJhcnkgdHV0b3JpYWxfdGhyaWZ0CisgIFBhdGg6IGdlbi1vY2FtbAorICBGaW5kbGliTmFtZTogdHV0b3JpYWxfdGhyaWZ0CisgIGJ1aWxkVG9vbHM6IG9jYW1sYnVpbGQKKyAgQnVpbGREZXBlbmRzOiB0aHJlYWRzLHRocmlmdAorICBNb2R1bGVzOiBDYWxjdWxhdG9yLFNoYXJlZF9jb25zdHMsVHV0b3JpYWxfY29uc3RzLFNoYXJlZFNlcnZpY2UsU2hhcmVkX3R5cGVzLFR1dG9yaWFsX3R5cGVzCisgIFhNRVRBUmVxdWlyZXM6IHRocmVhZHMKKworRXhlY3V0YWJsZSBDYWxjQ2xpZW50CisgIFBhdGg6IC4KKyAgTWFpbklzOiBDYWxjQ2xpZW50Lm1sCisgIEJ1aWxkJDogdHJ1ZQorICBDb21waWxlZE9iamVjdDogYmVzdAorICBCdWlsZERlcGVuZHM6IHRocmlmdCwgdHV0b3JpYWxfdGhyaWZ0LCB0aHJlYWRzCisKK0V4ZWN1dGFibGUgQ2FsY1NlcnZlcgorICBQYXRoOiAuCisgIE1haW5JczogQ2FsY1NlcnZlci5tbAorICBCdWlsZCQ6IHRydWUKKyAgQ29tcGlsZWRPYmplY3Q6IGJlc3QKKyAgQnVpbGREZXBlbmRzOiB0aHJpZnQsIHR1dG9yaWFsX3RocmlmdCwgdGhyZWFkcwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsIGIvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCmluZGV4IDFkNTk2NTYuLjdjMjMyODkgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbAorKysgYi90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKQEAgLTM3LDEwICszNywxMCBAQAogCiB1c2UgRGF0YTo6RHVtcGVyOwogCi1teSAkc29ja2V0ICAgID0gbmV3IFRocmlmdDo6U29ja2V0KCdsb2NhbGhvc3QnLDkwOTApOwotbXkgJHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0KCRzb2NrZXQsMTAyNCwxMDI0KTsKLW15ICRwcm90b2NvbCAgPSBuZXcgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLW15ICRjbGllbnQgICAgPSBuZXcgdHV0b3JpYWw6OkNhbGN1bGF0b3JDbGllbnQoJHByb3RvY29sKTsKK215ICRzb2NrZXQgICAgPSBUaHJpZnQ6OlNvY2tldC0+bmV3KCdsb2NhbGhvc3QnLDkwOTApOworbXkgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0LDEwMjQsMTAyNCk7CitteSAkcHJvdG9jb2wgID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworbXkgJGNsaWVudCAgICA9IHR1dG9yaWFsOjpDYWxjdWxhdG9yQ2xpZW50LT5uZXcoJHByb3RvY29sKTsKIAogCiBldmFsewpAQCAtNTMsNyArNTMsNyBAQAogICAgIG15ICRzdW0gPSAkY2xpZW50LT5hZGQoMSwxKTsKICAgICBwcmludCAiMSsxPSRzdW1cbiI7CiAKLSAgICBteSAkd29yayA9IG5ldyB0dXRvcmlhbDo6V29yaygpOworICAgIG15ICR3b3JrID0gdHV0b3JpYWw6OldvcmstPm5ldygpOwogCiAgICAgJHdvcmstPm9wKHR1dG9yaWFsOjpPcGVyYXRpb246OkRJVklERSk7CiAgICAgJHdvcmstPm51bTEoMSk7CkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICRjbGllbnQtPmNhbGN1bGF0ZSgxLCAkd29yayk7CiAgICAgICAgIHByaW50ICJXaG9hISBXZSBjYW4gZGl2aWRlIGJ5IHplcm8/XG4iOwogICAgIH07IGlmKCRAKSB7Ci0gICAgICAgIHdhcm4gIkludmFsaWRPcGVyYXRpb246ICIuRHVtcGVyKCRAKTsKKyAgICAgICAgd2FybiAnSW52YWxpZE9wZXJhdGlvbjogJy5EdW1wZXIoJEApOwogICAgIH0KIAogICAgICR3b3JrLT5vcCh0dXRvcmlhbDo6T3BlcmF0aW9uOjpTVUJUUkFDVCk7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwgYi90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKaW5kZXggYTQwZWM2OS4uZGZlNmI4OSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCisrKyBiL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbApAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcGVybAorIyEvdXNyL2Jpbi9lbnYgcGVybAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTY3LDIwICs2NywyMCBAQAogICB9IGVsc2lmICgkb3AgPT0gdHV0b3JpYWw6Ok9wZXJhdGlvbjo6RElWSURFKSB7CiAgICAgaWYgKCRudW0yID09IDApCiAgICAgewotICAgICAgbXkgJHggPSBuZXcgdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb247Ci0gICAgICAkeC0+d2hhdCgkb3ApOworICAgICAgbXkgJHggPSB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbi0+bmV3KCk7CisgICAgICAkeC0+d2hhdE9wKCRvcCk7CiAgICAgICAkeC0+d2h5KCdDYW5ub3QgZGl2aWRlIGJ5IDAnKTsKICAgICAgIGRpZSAkeDsKICAgICB9CiAgICAgJHZhbCA9ICRudW0xIC8gJG51bTI7CiAgIH0gZWxzZSB7Ci0gICAgbXkgJHggPSBuZXcgdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb247Ci0gICAgJHgtPndoYXQoJG9wKTsKKyAgICBteSAkeCA9IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uLT5uZXcoKTsKKyAgICAkeC0+d2hhdE9wKCRvcCk7CiAgICAgJHgtPndoeSgnSW52YWxpZCBvcGVyYXRpb24nKTsKICAgICBkaWUgJHg7CiAgIH0KIAotICBteSAkbG9nID0gbmV3IHNoYXJlZDo6U2hhcmVkU3RydWN0OworICBteSAkbG9nID0gc2hhcmVkOjpTaGFyZWRTdHJ1Y3QtPm5ldygpOwogICAkbG9nLT5rZXkoJGxvZ2lkKTsKICAgJGxvZy0+dmFsdWUoaW50KCR2YWwpKTsKICAgJHNlbGYtPntsb2d9LT57JGxvZ2lkfSA9ICRsb2c7CkBAIC0xMDQsMTAgKzEwNCwxMCBAQAogCiAKIGV2YWwgewotICBteSAkaGFuZGxlciAgICAgICA9IG5ldyBDYWxjdWxhdG9ySGFuZGxlcjsKLSAgbXkgJHByb2Nlc3NvciAgICAgPSBuZXcgdHV0b3JpYWw6OkNhbGN1bGF0b3JQcm9jZXNzb3IoJGhhbmRsZXIpOwotICBteSAkc2VydmVyc29ja2V0ICA9IG5ldyBUaHJpZnQ6OlNlcnZlclNvY2tldCg5MDkwKTsKLSAgbXkgJGZvcmtpbmdzZXJ2ZXIgPSBuZXcgVGhyaWZ0OjpGb3JraW5nU2VydmVyKCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQpOworICBteSAkaGFuZGxlciAgICAgICA9IENhbGN1bGF0b3JIYW5kbGVyLT5uZXcoKTsKKyAgbXkgJHByb2Nlc3NvciAgICAgPSB0dXRvcmlhbDo6Q2FsY3VsYXRvclByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKKyAgbXkgJHNlcnZlcnNvY2tldCAgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KDkwOTApOworICBteSAkZm9ya2luZ3NlcnZlciA9IFRocmlmdDo6Rm9ya2luZ1NlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQpOwogICBwcmludCAiU3RhcnRpbmcgdGhlIHNlcnZlci4uLlxuIjsKICAgJGZvcmtpbmdzZXJ2ZXItPnNlcnZlKCk7CiAgIHByaW50ICJkb25lLlxuIjsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwIGIvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKaW5kZXggZDI2MmI4Zi4uOTJkYzNjYiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKKysrIGIvdHV0b3JpYWwvcGhwL1BocENsaWVudC5waHAKQEAgLTUsNyArNSw3IEBACiAKIGVycm9yX3JlcG9ydGluZyhFX0FMTCk7CiAKLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CityZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CiAKIHVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwIGIvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKaW5kZXggNGFmNzBhNC4uNWE5YjQ5YiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKKysrIGIvdHV0b3JpYWwvcGhwL1BocFNlcnZlci5waHAKQEAgLTUsNyArNSw3IEBACiAKIGVycm9yX3JlcG9ydGluZyhFX0FMTCk7CiAKLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vbGliL3BocC9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CityZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7CiAKIHVzZSBUaHJpZnRcQ2xhc3NMb2FkZXJcVGhyaWZ0Q2xhc3NMb2FkZXI7CiAKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgIGNhc2UgXHR1dG9yaWFsXE9wZXJhdGlvbjo6RElWSURFOgogICAgICAgICBpZiAoJHctPm51bTIgPT0gMCkgewogICAgICAgICAgICRpbyA9IG5ldyBcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAgICRpby0+d2hhdCA9ICR3LT5vcDsKKyAgICAgICAgICAkaW8tPndoYXRPcCA9ICR3LT5vcDsKICAgICAgICAgICAkaW8tPndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiOwogICAgICAgICAgIHRocm93ICRpbzsKICAgICAgICAgfQpAQCAtODcsNyArODcsNyBAQAogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICRpbyA9IG5ldyBcdHV0b3JpYWxcSW52YWxpZE9wZXJhdGlvbigpOwotICAgICAgICAkaW8tPndoYXQgPSAkdy0+b3A7CisgICAgICAgICRpby0+d2hhdE9wID0gJHctPm9wOwogICAgICAgICAkaW8tPndoeSA9ICJJbnZhbGlkIE9wZXJhdGlvbiI7CiAgICAgICAgIHRocm93ICRpbzsKICAgICB9CmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5IGIvdHV0b3JpYWwvcGhwL3J1bnNlcnZlci5weQppbmRleCBhZTI5ZmVkLi4wNzdkYWExIDEwMDc1NQotLS0gYS90dXRvcmlhbC9waHAvcnVuc2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3BocC9ydW5zZXJ2ZXIucHkKQEAgLTI2LDcgKzI2LDggQEAKICMgY2hkaXIoMikgaW50byB0aGUgdHV0b3JpYWwgZGlyZWN0b3J5Lgogb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpKQogCisKIGNsYXNzIEhhbmRsZXIoQ0dJSFRUUFNlcnZlci5DR0lIVFRQUmVxdWVzdEhhbmRsZXIpOgotICBjZ2lfZGlyZWN0b3JpZXMgID0gWycvcGhwJ10KKyAgICBjZ2lfZGlyZWN0b3JpZXMgPSBbJy9waHAnXQogCiBCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKCgnJywgODA4MCksIEhhbmRsZXIpLnNlcnZlX2ZvcmV2ZXIoKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGI3M2MxZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2dlbi1weS50b3JuYWRvL3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5LnRvcm5hZG8vc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkudG9ybmFkby90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25DbGllbnQucHkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25DbGllbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDI2MTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uQ2xpZW50LnB5CkBAIC0wLDAgKzEsMTA4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN5cworCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50b3JuYWRvJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCisKK2Zyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBPcGVyYXRpb24sIFdvcmssIEludmFsaWRPcGVyYXRpb24KKworZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0b3JuYWRvIGltcG9ydCBnZW4KK2Zyb20gdG9ybmFkbyBpbXBvcnQgaW9sb29wCisKKworQGdlbi5jb3JvdXRpbmUKK2RlZiBjb21tdW5pY2F0ZSgpOgorICAgICMgY3JlYXRlIGNsaWVudAorICAgIHRyYW5zcG9ydCA9IFRUb3JuYWRvLlRUb3JuYWRvU3RyZWFtVHJhbnNwb3J0KCdsb2NhbGhvc3QnLCA5MDkwKQorICAgICMgb3BlbiB0aGUgdHJhbnNwb3J0LCBiYWlsIG9uIGVycm9yCisgICAgdHJ5OgorICAgICAgICB5aWVsZCB0cmFuc3BvcnQub3BlbigpCisgICAgICAgIHByaW50KCdUcmFuc3BvcnQgaXMgb3BlbmVkJykKKyAgICBleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGV4OgorICAgICAgICBsb2dnaW5nLmVycm9yKGV4KQorICAgICAgICByYWlzZSBnZW4uUmV0dXJuKCkKKworICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIGNsaWVudCA9IENhbGN1bGF0b3IuQ2xpZW50KHRyYW5zcG9ydCwgcGZhY3RvcnkpCisKKyAgICAjIHBpbmcKKyAgICB5aWVsZCBjbGllbnQucGluZygpCisgICAgcHJpbnQoInBpbmcoKSIpCisKKyAgICAjIGFkZAorICAgIHN1bV8gPSB5aWVsZCBjbGllbnQuYWRkKDEsIDEpCisgICAgcHJpbnQoIjEgKyAxID0gezB9Ii5mb3JtYXQoc3VtXykpCisKKyAgICAjIG1ha2UgYSBvbmV3YXkgY2FsbCB3aXRob3V0IGEgY2FsbGJhY2sgKHNjaGVkdWxlIHRoZSB3cml0ZSBhbmQgY29udGludWUKKyAgICAjIHdpdGhvdXQgYmxvY2tpbmcpCisgICAgY2xpZW50LnppcCgpCisgICAgcHJpbnQoInppcCgpIHdpdGhvdXQgY2FsbGJhY2siKQorCisgICAgIyBtYWtlIGEgb25ld2F5IGNhbGwgd2l0aCBhIGNhbGxiYWNrICh3ZSdsbCB3YWl0IGZvciB0aGUgc3RyZWFtIHdyaXRlIHRvCisgICAgIyBjb21wbGV0ZSBiZWZvcmUgY29udGludWluZykKKyAgICBjbGllbnQuemlwKCkKKyAgICBwcmludCgiemlwKCkgd2l0aCBjYWxsYmFjayIpCisKKyAgICAjIGNhbGN1bGF0ZSAxLzAKKyAgICB3b3JrID0gV29yaygpCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5ESVZJREUKKyAgICB3b3JrLm51bTEgPSAxCisgICAgd29yay5udW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IHlpZWxkIGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoIldob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybyA/IC0+IHswfSIuZm9ybWF0KHF1b3RpZW50KSkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBpbzoKKyAgICAgICAgcHJpbnQoIkludmFsaWRPcGVyYXRpb246IHswfSIuZm9ybWF0KGlvKSkKKworICAgICMgY2FsY3VsYXRlIDE1LTEwCisgICAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAorICAgIHdvcmsubnVtMSA9IDE1CisgICAgd29yay5udW0yID0gMTAKKworICAgIGRpZmYgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoIjE1IC0gMTAgPSB7MH0iLmZvcm1hdChkaWZmKSkKKworICAgICMgZ2V0U3RydWN0CisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCJDaGVjayBsb2c6IHswfSIuZm9ybWF0KGxvZy52YWx1ZSkpCisKKyAgICAjIGNsb3NlIHRoZSB0cmFuc3BvcnQKKyAgICBjbGllbnQuX3RyYW5zcG9ydC5jbG9zZSgpCisgICAgcmFpc2UgZ2VuLlJldHVybigpCisKKworZGVmIG1haW4oKToKKyAgICAjIGNyZWF0ZSBhbiBpb2xvb3AsIGRvIHRoZSBhYm92ZSwgdGhlbiBzdG9wCisgICAgaW9sb29wLklPTG9vcC5jdXJyZW50KCkucnVuX3N5bmMoY29tbXVuaWNhdGUpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5IGIvdHV0b3JpYWwvcHkudG9ybmFkby9QeXRob25TZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTAyMjlhMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vUHl0aG9uU2VydmVyLnB5CkBAIC0wLDAgKzEsMTAwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCBnbG9iCitpbXBvcnQgc3lzCisKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnRvcm5hZG8nKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKKworZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgorZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0IE9wZXJhdGlvbiwgSW52YWxpZE9wZXJhdGlvbgorCitmcm9tIHNoYXJlZC50dHlwZXMgaW1wb3J0IFNoYXJlZFN0cnVjdAorCitmcm9tIHRocmlmdCBpbXBvcnQgVFRvcm5hZG8KK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKworZnJvbSB0b3JuYWRvIGltcG9ydCBpb2xvb3AKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5sb2cgPSB7fQorCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCJwaW5nKCkiKQorCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgiYWRkKHt9LCB7fSkiLmZvcm1hdChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgorCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCJjYWxjdWxhdGUoe30sIHt9KSIuZm9ybWF0KGxvZ2lkLCB3b3JrKSkKKworICAgICAgICBpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5BREQ6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKyB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uRElWSURFOgorICAgICAgICAgICAgaWYgd29yay5udW0yID09IDA6CisgICAgICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgICAgIHgud2h5ID0gIkNhbm5vdCBkaXZpZGUgYnkgMCIKKyAgICAgICAgICAgICAgICByYWlzZSB4CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKKyAgICAgICAgICAgIHgud2hhdE9wID0gd29yay5vcAorICAgICAgICAgICAgeC53aHkgPSAiSW52YWxpZCBvcGVyYXRpb24iCisgICAgICAgICAgICByYWlzZSB4CisKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgiZ2V0U3RydWN0KHt9KSIuZm9ybWF0KGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgemlwKHNlbGYpOgorICAgICAgICBwcmludCgiemlwKCkiKQorCisKK2RlZiBtYWluKCk6CisgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKKyAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQorICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQorICAgIHNlcnZlciA9IFRUb3JuYWRvLlRUb3JuYWRvU2VydmVyKHByb2Nlc3NvciwgcGZhY3RvcnkpCisKKyAgICBwcmludCgiU3RhcnRpbmcgdGhlIHNlcnZlci4uLiIpCisgICAgc2VydmVyLmJpbmQoOTA5MCkKKyAgICBzZXJ2ZXIuc3RhcnQoMSkKKyAgICBpb2xvb3AuSU9Mb29wLmluc3RhbmNlKCkuc3RhcnQoKQorICAgIHByaW50KCJkb25lLiIpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUwY2QzNDIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weQorCit0dXRvcmlhbHNlcnZlcjogYWxsCisJJHtQWVRIT059IFB5dGhvblNlcnZlci5weQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtQWVRIT059IFB5dGhvbkNsaWVudC5weQorCitjbGVhbi1sb2NhbDoKKwkkKFJNKSAtciBnZW4tKgorCitFWFRSQV9ESVNUID0gXAorCVB5dGhvbkNsaWVudC5weSBcCisJUHl0aG9uU2VydmVyLnB5IFwKKwlQeXRob25TZXJ2ZXIudGFjCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvbkNsaWVudC5weSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5CmluZGV4IDM1MWM3ZjIuLjYzZGRlN2UgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uQ2xpZW50LnB5CkBAIC0xOSw1MCArMTksNTMgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2ltcG9ydCBnbG9iCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKIAogZnJvbSB0d2lzdGVkLmludGVybmV0LmRlZmVyIGltcG9ydCBpbmxpbmVDYWxsYmFja3MKIGZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgcmVhY3RvcgogZnJvbSB0d2lzdGVkLmludGVybmV0LnByb3RvY29sIGltcG9ydCBDbGllbnRDcmVhdG9yCiAKLWZyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFR3aXN0ZWQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIAorCiBAaW5saW5lQ2FsbGJhY2tzCiBkZWYgbWFpbihjbGllbnQpOgotICB5aWVsZCBjbGllbnQucGluZygpCi0gIHByaW50ICdwaW5nKCknCisgICAgeWllbGQgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQogCi0gIHN1bSA9IHlpZWxkIGNsaWVudC5hZGQoMSwxKQotICBwcmludCAnMSsxPSVkJyAlIChzdW0pCisgICAgc3VtID0geWllbGQgY2xpZW50LmFkZCgxLCAxKQorICAgIHByaW50KCgnMSsxPSVkJyAlIChzdW0pKSkKIAotICB3b3JrID0gV29yaygpCisgICAgd29yayA9IFdvcmsoKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCi0gIHdvcmsubnVtMSA9IDEKLSAgd29yay5udW0yID0gMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uRElWSURFCisgICAgd29yay5udW0xID0gMQorICAgIHdvcmsubnVtMiA9IDAKIAotICB0cnk6Ci0gICAgcXVvdGllbnQgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gICAgcHJpbnQgJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nCi0gIGV4Y2VwdCBJbnZhbGlkT3BlcmF0aW9uLCBpbzoKLSAgICBwcmludCAnSW52YWxpZE9wZXJhdGlvbjogJXInICUgaW8KKyAgICB0cnk6CisgICAgICAgIHF1b3RpZW50ID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgICAgICBwcmludCgnV2hvYT8gWW91IGtub3cgaG93IHRvIGRpdmlkZSBieSB6ZXJvPycpCisgICAgICAgIHByaW50KCdGWUkgdGhlIGFuc3dlciBpcyAlZCcgJSBxdW90aWVudCkKKyAgICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiBhcyBlOgorICAgICAgICBwcmludCgoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpKQogCi0gIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKLSAgd29yay5udW0xID0gMTUKLSAgd29yay5udW0yID0gMTAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLlNVQlRSQUNUCisgICAgd29yay5udW0xID0gMTUKKyAgICB3b3JrLm51bTIgPSAxMAogCi0gIGRpZmYgPSB5aWVsZCBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCi0gIHByaW50ICcxNS0xMD0lZCcgJSAoZGlmZikKKyAgICBkaWZmID0geWllbGQgY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQorICAgIHByaW50KCgnMTUtMTA9JWQnICUgKGRpZmYpKSkKIAotICBsb2cgPSB5aWVsZCBjbGllbnQuZ2V0U3RydWN0KDEpCi0gIHByaW50ICdDaGVjayBsb2c6ICVzJyAlIChsb2cudmFsdWUpCi0gIHJlYWN0b3Iuc3RvcCgpCisgICAgbG9nID0geWllbGQgY2xpZW50LmdldFN0cnVjdCgxKQorICAgIHByaW50KCgnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKSkpCisgICAgcmVhY3Rvci5zdG9wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBkID0gQ2xpZW50Q3JlYXRvcihyZWFjdG9yLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQppbmRleCA2MTMwYjkyLi4xYjBlMmQ1IDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci5weQpAQCAtMTksMTEgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgZ2xvYgogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHkudHdpc3RlZCcpCitzeXMucGF0aC5hcHBlbmQoJ2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmluc2VydCgwLCBnbG9iLmdsb2IoJy4uLy4uL2xpYi9weS9idWlsZC9saWIqJylbMF0pCiAKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCiAKIGZyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CiAKQEAgLTMyLDYxICszNCw2MyBAQAogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCi1mcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKwogCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgaW1wbGVtZW50cyhDYWxjdWxhdG9yLklmYWNlKSAgCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmxvZyA9IHt9CisgICAgaW1wbGVtZW50cyhDYWxjdWxhdG9yLklmYWNlKQogCi0gIGRlZiBwaW5nKHNlbGYpOgotICAgIHByaW50ICdwaW5nKCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvZyA9IHt9CiAKLSAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgotICAgIHByaW50ICdhZGQoJWQsJWQpJyAlIChuMSwgbjIpCi0gICAgcmV0dXJuIG4xK24yCisgICAgZGVmIHBpbmcoc2VsZik6CisgICAgICAgIHByaW50KCdwaW5nKCknKQogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGFkZChzZWxmLCBuMSwgbjIpOgorICAgICAgICBwcmludCgnYWRkKCVkLCVkKScgJSAobjEsIG4yKSkKKyAgICAgICAgcmV0dXJuIG4xICsgbjIKIAotICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uU1VCVFJBQ1Q6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLSB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLk1VTFRJUExZOgotICAgICAgdmFsID0gd29yay5udW0xICogd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6Ci0gICAgICBpZiB3b3JrLm51bTIgPT0gMDoKLSAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgICB4LndoYXQgPSB3b3JrLm9wCi0gICAgICAgIHgud2h5ID0gJ0Nhbm5vdCBkaXZpZGUgYnkgMCcKLSAgICAgICAgcmFpc2UgeAotICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCi0gICAgZWxzZToKLSAgICAgIHggPSBJbnZhbGlkT3BlcmF0aW9uKCkKLSAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgIHgud2h5ID0gJ0ludmFsaWQgb3BlcmF0aW9uJwotICAgICAgcmFpc2UgeAorICAgIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgorICAgICAgICBwcmludCgnY2FsY3VsYXRlKCVkLCAlciknICUgKGxvZ2lkLCB3b3JrKSkKIAotICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCi0gICAgbG9nLmtleSA9IGxvZ2lkCi0gICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCi0gICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKIAotICAgIHJldHVybiB2YWwKKyAgICAgICAgbG9nID0gU2hhcmVkU3RydWN0KCkKKyAgICAgICAgbG9nLmtleSA9IGxvZ2lkCisgICAgICAgIGxvZy52YWx1ZSA9ICclZCcgJSAodmFsKQorICAgICAgICBzZWxmLmxvZ1tsb2dpZF0gPSBsb2cKIAotICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6Ci0gICAgcHJpbnQgJ2dldFN0cnVjdCglZCknICUgKGtleSkKLSAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorICAgICAgICByZXR1cm4gdmFsCiAKLSAgZGVmIHppcChzZWxmKToKLSAgICBwcmludCAnemlwKCknCisgICAgZGVmIGdldFN0cnVjdChzZWxmLCBrZXkpOgorICAgICAgICBwcmludCgnZ2V0U3RydWN0KCVkKScgJSAoa2V5KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nW2tleV0KKworICAgIGRlZiB6aXAoc2VsZik6CisgICAgICAgIHByaW50KCd6aXAoKScpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKICAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQogICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQotICAgIHNlcnZlciA9IHJlYWN0b3IubGlzdGVuVENQKDkwOTAsCi0gICAgICAgICAgICAgICAgVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeShwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgcGZhY3RvcnkpLCBpbnRlcmZhY2U9IjEyNy4wLjAuMSIpCisgICAgc2VydmVyID0gcmVhY3Rvci5saXN0ZW5UQ1AoCisgICAgICAgIDkwOTAsCisgICAgICAgIFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLCBwZmFjdG9yeSksCisgICAgICAgIGludGVyZmFjZT0iMTI3LjAuMC4xIikKICAgICByZWFjdG9yLnJ1bigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMgYi90dXRvcmlhbC9weS50d2lzdGVkL1B5dGhvblNlcnZlci50YWMKaW5kZXggMTFmMGY4Zi4uMDQ3OTYzNiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9QeXRob25TZXJ2ZXIudGFjCisrKyBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvUHl0aG9uU2VydmVyLnRhYwpAQCAtMjIsMTEgKzIyLDE0IEBACiBmcm9tIHR3aXN0ZWQuYXBwbGljYXRpb24gaW1wb3J0IGludGVybmV0LCBzZXJ2aWNlCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkCiAKK2ltcG9ydCBnbG9iCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weS50d2lzdGVkJykKK3N5cy5wYXRoLmFwcGVuZCgnZ2VuLXB5LnR3aXN0ZWQnKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIGZyb20gdHV0b3JpYWwgaW1wb3J0IENhbGN1bGF0b3IKLWZyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCAqCiBmcm9tIFB5dGhvblNlcnZlciBpbXBvcnQgQ2FsY3VsYXRvckhhbmRsZXIKK2Zyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKKwogCiBkZWYgbWFrZV9hcHBsaWNhdGlvbigpOgogICAgIGFwcGxpY2F0aW9uID0gc2VydmljZS5BcHBsaWNhdGlvbignQ2FsY1NlcnZlcicpCkBAIC0zNCw4ICszNyw5IEBACiAgICAgaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKICAgICBwcm9jZXNzb3IgPSBDYWxjdWxhdG9yLlByb2Nlc3NvcihoYW5kbGVyKQogCi0gICAgc2VydmVyRmFjdG9yeSA9IFRUd2lzdGVkLlRocmlmdFNlcnZlckZhY3RvcnkocHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkKKyAgICBzZXJ2ZXJGYWN0b3J5ID0gVFR3aXN0ZWQuVGhyaWZ0U2VydmVyRmFjdG9yeSgKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKQogCiAgICAgY2FsY1NlcnZpY2UgPSBpbnRlcm5ldC5UQ1BTZXJ2ZXIoOTA5MCwgc2VydmVyRmFjdG9yeSkKIApAQCAtNDUsNCArNDksNSBAQAogCiAgICAgcmV0dXJuIGFwcGxpY2F0aW9uCiAKLWFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGFwcGxpY2F0aW9uID0gbWFrZV9hcHBsaWNhdGlvbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkYjgxNmQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDM3IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5L3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBweSAtciAkPAorCithbGwtbG9jYWw6IGdlbi1weS90dXRvcmlhbC9DYWxjdWxhdG9yLnB5CisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uU2VydmVyLnB5CisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwkke1BZVEhPTn0gUHl0aG9uQ2xpZW50LnB5CisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJc2V0dXAuY2ZnIFwKKwlQeXRob25TZXJ2ZXIucHkgXAorCVB5dGhvbkNsaWVudC5weQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5IGIvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CmluZGV4IDkxNmU5MTUuLmE2YzE5NjYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQorKysgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKQEAgLTIwLDYzICsyMCw3MCBAQAogIwogCiBpbXBvcnQgc3lzCi1zeXMucGF0aC5hcHBlbmQoJy4uL2dlbi1weScpCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmsKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRocmlmdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUU29ja2V0CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKIAotdHJ5OgogCi0gICMgTWFrZSBzb2NrZXQKLSAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQorZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCdsb2NhbGhvc3QnLCA5MDkwKQogCi0gICMgQnVmZmVyaW5nIGlzIGNyaXRpY2FsLiBSYXcgc29ja2V0cyBhcmUgdmVyeSBzbG93Ci0gIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKKyAgICAjIEJ1ZmZlcmluZyBpcyBjcml0aWNhbC4gUmF3IHNvY2tldHMgYXJlIHZlcnkgc2xvdworICAgIHRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zcG9ydCkKIAotICAjIFdyYXAgaW4gYSBwcm90b2NvbAotICBwcm90b2NvbCA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICMgV3JhcCBpbiBhIHByb3RvY29sCisgICAgcHJvdG9jb2wgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkKIAotICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKLSAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCisgICAgIyBDcmVhdGUgYSBjbGllbnQgdG8gdXNlIHRoZSBwcm90b2NvbCBlbmNvZGVyCisgICAgY2xpZW50ID0gQ2FsY3VsYXRvci5DbGllbnQocHJvdG9jb2wpCiAKLSAgIyBDb25uZWN0IQotICB0cmFuc3BvcnQub3BlbigpCisgICAgIyBDb25uZWN0IQorICAgIHRyYW5zcG9ydC5vcGVuKCkKIAotICBjbGllbnQucGluZygpCi0gIHByaW50ICdwaW5nKCknCisgICAgY2xpZW50LnBpbmcoKQorICAgIHByaW50KCdwaW5nKCknKQogCi0gIHN1bSA9IGNsaWVudC5hZGQoMSwxKQotICBwcmludCAnMSsxPSVkJyAlIChzdW0pCisgICAgc3VtXyA9IGNsaWVudC5hZGQoMSwgMSkKKyAgICBwcmludCgnMSsxPSVkJyAlIHN1bV8pCiAKLSAgd29yayA9IFdvcmsoKQorICAgIHdvcmsgPSBXb3JrKCkKIAotICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQotICB3b3JrLm51bTEgPSAxCi0gIHdvcmsubnVtMiA9IDAKKyAgICB3b3JrLm9wID0gT3BlcmF0aW9uLkRJVklERQorICAgIHdvcmsubnVtMSA9IDEKKyAgICB3b3JrLm51bTIgPSAwCiAKLSAgdHJ5OgotICAgIHF1b3RpZW50ID0gY2xpZW50LmNhbGN1bGF0ZSgxLCB3b3JrKQotICAgIHByaW50ICdXaG9hPyBZb3Uga25vdyBob3cgdG8gZGl2aWRlIGJ5IHplcm8/JwotICBleGNlcHQgSW52YWxpZE9wZXJhdGlvbiwgaW86Ci0gICAgcHJpbnQgJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGlvCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoJ0ludmFsaWRPcGVyYXRpb246ICVyJyAlIGUpCiAKLSAgd29yay5vcCA9IE9wZXJhdGlvbi5TVUJUUkFDVAotICB3b3JrLm51bTEgPSAxNQotICB3b3JrLm51bTIgPSAxMAorICAgIHdvcmsub3AgPSBPcGVyYXRpb24uU1VCVFJBQ1QKKyAgICB3b3JrLm51bTEgPSAxNQorICAgIHdvcmsubnVtMiA9IDEwCiAKLSAgZGlmZiA9IGNsaWVudC5jYWxjdWxhdGUoMSwgd29yaykKLSAgcHJpbnQgJzE1LTEwPSVkJyAlIChkaWZmKQorICAgIGRpZmYgPSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspCisgICAgcHJpbnQoJzE1LTEwPSVkJyAlIGRpZmYpCiAKLSAgbG9nID0gY2xpZW50LmdldFN0cnVjdCgxKQotICBwcmludCAnQ2hlY2sgbG9nOiAlcycgJSAobG9nLnZhbHVlKQorICAgIGxvZyA9IGNsaWVudC5nZXRTdHJ1Y3QoMSkKKyAgICBwcmludCgnQ2hlY2sgbG9nOiAlcycgJSBsb2cudmFsdWUpCiAKLSAgIyBDbG9zZSEKLSAgdHJhbnNwb3J0LmNsb3NlKCkKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCiAKLWV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiwgdHg6Ci0gIHByaW50ICclcycgJSAodHgubWVzc2FnZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0cnk6CisgICAgICAgIG1haW4oKQorICAgIGV4Y2VwdCBUaHJpZnQuVEV4Y2VwdGlvbiBhcyB0eDoKKyAgICAgICAgcHJpbnQoJyVzJyAlIHR4Lm1lc3NhZ2UpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKaW5kZXggY2YyYWFiMi4uZTY0MjFlZiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQpAQCAtMTksMTEgKzE5LDEzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCitpbXBvcnQgZ2xvYgogaW1wb3J0IHN5cwotc3lzLnBhdGguYXBwZW5kKCcuLi9nZW4tcHknKQorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYignLi4vLi4vbGliL3B5L2J1aWxkL2xpYionKVswXSkKIAogZnJvbSB0dXRvcmlhbCBpbXBvcnQgQ2FsY3VsYXRvcgotZnJvbSB0dXRvcmlhbC50dHlwZXMgaW1wb3J0ICoKK2Zyb20gdHV0b3JpYWwudHR5cGVzIGltcG9ydCBJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24KIAogZnJvbSBzaGFyZWQudHR5cGVzIGltcG9ydCBTaGFyZWRTdHJ1Y3QKIApAQCAtMzIsNjUgKzM0LDcwIEBACiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiBmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKIAorCiBjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYubG9nID0ge30KKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KIAotICBkZWYgcGluZyhzZWxmKToKLSAgICBwcmludCAncGluZygpJworICAgIGRlZiBwaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKIAotICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6Ci0gICAgcHJpbnQgJ2FkZCglZCwlZCknICUgKG4xLCBuMikKLSAgICByZXR1cm4gbjErbjIKKyAgICBkZWYgYWRkKHNlbGYsIG4xLCBuMik6CisgICAgICAgIHByaW50KCdhZGQoJWQsJWQpJyAlIChuMSwgbjIpKQorICAgICAgICByZXR1cm4gbjEgKyBuMgogCi0gIGRlZiBjYWxjdWxhdGUoc2VsZiwgbG9naWQsIHdvcmspOgotICAgIHByaW50ICdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspCisgICAgZGVmIGNhbGN1bGF0ZShzZWxmLCBsb2dpZCwgd29yayk6CisgICAgICAgIHByaW50KCdjYWxjdWxhdGUoJWQsICVyKScgJSAobG9naWQsIHdvcmspKQogCi0gICAgaWYgd29yay5vcCA9PSBPcGVyYXRpb24uQUREOgotICAgICAgdmFsID0gd29yay5udW0xICsgd29yay5udW0yCi0gICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5TVUJUUkFDVDoKLSAgICAgIHZhbCA9IHdvcmsubnVtMSAtIHdvcmsubnVtMgotICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKLSAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkRJVklERToKLSAgICAgIGlmIHdvcmsubnVtMiA9PSAwOgotICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCi0gICAgICAgIHgud2hhdCA9IHdvcmsub3AKLSAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJwotICAgICAgICByYWlzZSB4Ci0gICAgICB2YWwgPSB3b3JrLm51bTEgLyB3b3JrLm51bTIKLSAgICBlbHNlOgotICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQotICAgICAgeC53aGF0ID0gd29yay5vcAotICAgICAgeC53aHkgPSAnSW52YWxpZCBvcGVyYXRpb24nCi0gICAgICByYWlzZSB4CisgICAgICAgIGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSArIHdvcmsubnVtMgorICAgICAgICBlbGlmIHdvcmsub3AgPT0gT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgdmFsID0gd29yay5udW0xIC0gd29yay5udW0yCisgICAgICAgIGVsaWYgd29yay5vcCA9PSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLm51bTEgKiB3b3JrLm51bTIKKyAgICAgICAgZWxpZiB3b3JrLm9wID09IE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICBpZiB3b3JrLm51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICAgICAgeC53aHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsubnVtMSAvIHdvcmsubnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC53aGF0T3AgPSB3b3JrLm9wCisgICAgICAgICAgICB4LndoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKIAotICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCi0gICAgbG9nLmtleSA9IGxvZ2lkCi0gICAgbG9nLnZhbHVlID0gJyVkJyAlICh2YWwpCi0gICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCisgICAgICAgIGxvZyA9IFNoYXJlZFN0cnVjdCgpCisgICAgICAgIGxvZy5rZXkgPSBsb2dpZAorICAgICAgICBsb2cudmFsdWUgPSAnJWQnICUgKHZhbCkKKyAgICAgICAgc2VsZi5sb2dbbG9naWRdID0gbG9nCiAKLSAgICByZXR1cm4gdmFsCisgICAgICAgIHJldHVybiB2YWwKIAotICBkZWYgZ2V0U3RydWN0KHNlbGYsIGtleSk6Ci0gICAgcHJpbnQgJ2dldFN0cnVjdCglZCknICUgKGtleSkKLSAgICByZXR1cm4gc2VsZi5sb2dba2V5XQorICAgIGRlZiBnZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCiAKLSAgZGVmIHppcChzZWxmKToKLSAgICBwcmludCAnemlwKCknCisgICAgZGVmIHppcChzZWxmKToKKyAgICAgICAgcHJpbnQoJ3ppcCgpJykKIAotaGFuZGxlciA9IENhbGN1bGF0b3JIYW5kbGVyKCkKLXByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCi10cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQocG9ydD05MDkwKQotdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQotcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLXNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBoYW5kbGVyID0gQ2FsY3VsYXRvckhhbmRsZXIoKQorICAgIHByb2Nlc3NvciA9IENhbGN1bGF0b3IuUHJvY2Vzc29yKGhhbmRsZXIpCisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU2VydmVyU29ja2V0KGhvc3Q9JzEyNy4wLjAuMScsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCiAKLSMgWW91IGNvdWxkIGRvIG9uZSBvZiB0aGVzZSBmb3IgYSBtdWx0aXRocmVhZGVkIHNlcnZlcgotI3NlcnZlciA9IFRTZXJ2ZXIuVFRocmVhZGVkU2VydmVyKHByb2Nlc3NvciwgdHJhbnNwb3J0LCB0ZmFjdG9yeSwgcGZhY3RvcnkpCi0jc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgIHNlcnZlciA9IFRTZXJ2ZXIuVFNpbXBsZVNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQogCi1wcmludCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicKLXNlcnZlci5zZXJ2ZSgpCi1wcmludCAnZG9uZS4nCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcigKKyAgICAjICAgICBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcigKKyAgICAjICAgICBwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorCisgICAgcHJpbnQoJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKQorICAgIHNlcnZlci5zZXJ2ZSgpCisgICAgcHJpbnQoJ2RvbmUuJykKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3B5L3NldHVwLmNmZyBiL3R1dG9yaWFsL3B5L3NldHVwLmNmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxMjBhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcHkvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsMiBAQAorW2ZsYWtlOF0KK2lnbm9yZSA9IEU0MDIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcmIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTM3MjQxMwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitnZW4tcHkvY2FsY3VsYXRvci5yYiBnZW4tcHkvc2hhcmVkX3NlcnZpY2UucmI6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIHJiIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXB5L2NhbGN1bGF0b3IucmIKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCSR7UlVCWX0gUnVieVNlcnZlci5yYgorCit0dXRvcmlhbGNsaWVudDogYWxsCisJJHtSVUJZfSBSdWJ5Q2xpZW50LnJiCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIGdlbi0qCisKK0VYVFJBX0RJU1QgPSBcCisJUnVieVNlcnZlci5yYiBcCisJUnVieUNsaWVudC5yYgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYiBiL3R1dG9yaWFsL3JiL1J1YnlDbGllbnQucmIKaW5kZXggZmQ3MjY5OS4uOWE1YWE0MyAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcmIvUnVieUNsaWVudC5yYgorKysgYi90dXRvcmlhbC9yYi9SdWJ5Q2xpZW50LnJiCkBAIC0xOSw3ICsxOSw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0kOi5wdXNoKCcuLi9nZW4tcmInKQorJDoucHVzaCgnZ2VuLXJiJykKICQ6LnVuc2hpZnQgJy4uLy4uL2xpYi9yYi9saWInCiAKIHJlcXVpcmUgJ3RocmlmdCcKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIgYi90dXRvcmlhbC9yYi9SdWJ5U2VydmVyLnJiCmluZGV4IDMwYWE3ZjIuLjFkNzA3ZDcgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL1J1YnlTZXJ2ZXIucmIKKysrIGIvdHV0b3JpYWwvcmIvUnVieVNlcnZlci5yYgpAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotJDoucHVzaCgnLi4vZ2VuLXJiJykKKyQ6LnB1c2goJ2dlbi1yYicpCiAkOi51bnNoaWZ0ICcuLi8uLi9saWIvcmIvbGliJwogCiByZXF1aXJlICd0aHJpZnQnCkBAIC01MiwxNCArNTIsMTQgQEAKICAgICBlbHNpZiB3b3JrLm9wID09IE9wZXJhdGlvbjo6RElWSURFCiAgICAgICBpZiB3b3JrLm51bTIgPT0gMAogICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbi5uZXcoKQotICAgICAgICB4LndoYXQgPSB3b3JrLm9wCisgICAgICAgIHgud2hhdE9wID0gd29yay5vcAogICAgICAgICB4LndoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCiAgICAgICAgIHJhaXNlIHgKICAgICAgIGVuZAogICAgICAgdmFsID0gd29yay5udW0xIC8gd29yay5udW0yCiAgICAgZWxzZQogICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24ubmV3KCkKLSAgICAgIHgud2hhdCA9IHdvcmsub3AKKyAgICAgIHgud2hhdE9wID0gd29yay5vcAogICAgICAgeC53aHkgPSAiSW52YWxpZCBvcGVyYXRpb24iCiAgICAgICByYWlzZSB4CiAgICAgZW5kCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9DYXJnby50b21sIGIvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBhMGRhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE2IEBACitbcGFja2FnZV0KK25hbWUgPSAidGhyaWZ0LXR1dG9yaWFsIgordmVyc2lvbiA9ICIwLjEuMCIKK2xpY2Vuc2UgPSAiQXBhY2hlLTIuMCIKK2F1dGhvcnMgPSBbIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiJdCitleGNsdWRlID0gWyJNYWtlZmlsZSoiLCAic2hhcmVkLnJzIiwgInR1dG9yaWFsLnJzIl0KK3B1Ymxpc2ggPSBmYWxzZQorCitbZGVwZW5kZW5jaWVzXQorY2xhcCA9ICI8Mi4yOC4wIgorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vLi4vbGliL3JzIgorCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjMzMWUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworZ2VuLXJzL3R1dG9yaWFsLnJzIGdlbi1ycy9zaGFyZWQucnM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC1vdXQgc3JjIC0tZ2VuIHJzIC1yICQ8CisKK2FsbC1sb2NhbDogZ2VuLXJzL3R1dG9yaWFsLnJzCisJJChDQVJHTykgYnVpbGQKKwlbIC1kIGJpbiBdIHx8IG1rZGlyIGJpbgorCWNwIHRhcmdldC9kZWJ1Zy90dXRvcmlhbF9zZXJ2ZXIgYmluL3R1dG9yaWFsX3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy90dXRvcmlhbF9jbGllbnQgYmluL3R1dG9yaWFsX2NsaWVudAorCitjaGVjazogYWxsCisKK3R1dG9yaWFsc2VydmVyOiBhbGwKKwliaW4vdHV0b3JpYWxfc2VydmVyCQorCit0dXRvcmlhbGNsaWVudDogYWxsCisJYmluL3R1dG9yaWFsX2NsaWVudAorCitjbGVhbi1sb2NhbDoKKwkkKENBUkdPKSBjbGVhbgorCS0kKFJNKSBDYXJnby5sb2NrCisJLSQoUk0pIHNyYy9zaGFyZWQucnMKKwktJChSTSkgc3JjL3R1dG9yaWFsLnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorCXNyYy9saWIucnMgXAorCXNyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzIFwKKwlzcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycyBcCisJUkVBRE1FLm1kCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL1JFQURNRS5tZCBiL3R1dG9yaWFsL3JzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRlOWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzE3IEBACisjIFJ1c3QgTGFuZ3VhZ2UgQmluZGluZ3MgZm9yIFRocmlmdAorCisjIyBHZXR0aW5nIFN0YXJ0ZWQKKworMS4gR2V0IHRoZSBbVGhyaWZ0IGNvbXBpbGVyXShodHRwczovL3RocmlmdC5hcGFjaGUub3JnKS4KKworMi4gQWRkIHRoZSBmb2xsb3dpbmcgY3JhdGVzIHRvIHlvdXIgYENhcmdvLnRvbWxgLgorCitgYGB0b21sCit0aHJpZnQgPSAieC55LnoiICMgeC55LnogaXMgdGhlIHZlcnNpb24gb2YgdGhlIHRocmlmdCBjb21waWxlcgorb3JkZXJlZF9mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorYGBgCisKKzMuIEFkZCB0aGUgc2FtZSBjcmF0ZXMgdG8geW91ciBgbGliLnJzYCBvciBgbWFpbi5yc2AuCisKK2BgYHJ1c3QKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKK2BgYAorCis0LiBHZW5lcmF0ZSBSdXN0IHNvdXJjZXMgZm9yIHlvdXIgSURMIChmb3IgZXhhbXBsZSwgYFR1dG9yaWFsLnRocmlmdGApLgorCitgYGBzaGVsbAordGhyaWZ0IC1vdXQgbXlfcnVzdF9wcm9ncmFtL3NyYyAtLWdlbiBycyAtciBUdXRvcmlhbC50aHJpZnQKK2BgYAorCis1LiBVc2UgdGhlIGdlbmVyYXRlZCBzb3VyY2UgaW4geW91ciBjb2RlLgorCitgYGBydXN0CisvLyBhZGQgZXh0ZXJuIGNyYXRlcyBoZXJlLCBvciBpbiB5b3VyIGxpYi5ycworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCisvLyBnZW5lcmF0ZWQgUnVzdCBtb2R1bGUKK3VzZSB0dXRvcmlhbDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnR9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFRjcENoYW5uZWx9OwordXNlIHR1dG9yaWFsOjp7Q2FsY3VsYXRvclN5bmNDbGllbnQsIFRDYWxjdWxhdG9yU3luY0NsaWVudH07Cit1c2UgdHV0b3JpYWw6OntPcGVyYXRpb24sIFdvcmt9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+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+IE9rKG51bTEgKyBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpTdWJ0cmFjdCA9PiBPayhudW0xIC0gbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6TXVsdGlwbHkgPT4gT2sobnVtMSAqIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OkRpdmlkZSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAqbnVtMiA9PSAwIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXRfb3A6IFNvbWUoKm9wIGFzIGkzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoeTogU29tZSgiZGl2aWRlIGJ5IDAiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9rKG51bTEgLyBudW0yKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb246Om5ldygKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICJubyBvcGVyYXRpb24gc3BlY2lmaWVkIi50b19vd25lZCgpLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfTsKKworICAgICAgICAvLyBpZiB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGxvZyBpdAorICAgICAgICBpZiBsZXQgT2socmVmIHYpID0gcmVzIHsKKyAgICAgICAgICAgIGxldCBtdXQgbG9nID0gc2VsZi5sb2cubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgbG9nLmluc2VydChsb2dpZCwgU2hhcmVkU3RydWN0OjpuZXcobG9naWQsIGZvcm1hdCEoInt9IiwgdikpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSB0cnkhIG1hY3JvIGF1dG9tYXRpY2FsbHkgbWFwcyBlcnJvcnMKKyAgICAgICAgLy8gYnV0LCBzaW5jZSB3ZSBhcmVuJ3QgdXNpbmcgdGhhdCBoZXJlIHdlIGhhdmUgdG8gbWFwIGVycm9ycyBtYW51YWxseQorICAgICAgICAvLworICAgICAgICAvLyBleGNlcHRpb24gc3RydWN0cyBkZWZpbmVkIGluIHRoZSBJREwgaGF2ZSBhbiBhdXRvLWdlbmVyYXRlZAorICAgICAgICAvLyBpbXBsIG9mIEZyb206OmZyb20KKyAgICAgICAgcmVzLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfemlwKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICBwcmludGxuISgiaGFuZGxpbmcgemlwIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL3NyYy9saWIucnMgYi90dXRvcmlhbC9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDA3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9zcmMvbGliLnJzCkBAIC0wLDAgKzEsMjMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCitwdWIgbW9kIHNoYXJlZDsKK3B1YiBtb2QgdHV0b3JpYWw7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9zaGFyZWQudGhyaWZ0IGIvdHV0b3JpYWwvc2hhcmVkLnRocmlmdAppbmRleCBkYjRiNjk0Li5mMTY4NWJkIDEwMDY0NAotLS0gYS90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CisrKyBiL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKQEAgLTIyLDExICsyMiwxNSBAQAogICogdGhlc2UgZGVmaW5pdGlvbnMuCiAgKi8KIAorbmFtZXNwYWNlIGNsIHNoYXJlZAogbmFtZXNwYWNlIGNwcCBzaGFyZWQKIG5hbWVzcGFjZSBkIHNoYXJlIC8vICJzaGFyZWQiIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZXBvbnltb3VzIEQga2V5d29yZC4KK25hbWVzcGFjZSBkYXJ0IHNoYXJlZAogbmFtZXNwYWNlIGphdmEgc2hhcmVkCiBuYW1lc3BhY2UgcGVybCBzaGFyZWQKIG5hbWVzcGFjZSBwaHAgc2hhcmVkCituYW1lc3BhY2UgaGF4ZSBzaGFyZWQKK25hbWVzcGFjZSBuZXRjb3JlIHNoYXJlZAogCiBzdHJ1Y3QgU2hhcmVkU3RydWN0IHsKICAgMTogaTMyIGtleQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0IGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CmluZGV4IDMxNTAxNTEuLmUwMjc1NDYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAorKysgYi90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKQEAgLTMyLDcgKzMyLDcgQEAKICAqIFRoZSBmaXJzdCB0aGluZyB0byBrbm93IGFib3V0IGFyZSB0eXBlcy4gVGhlIGF2YWlsYWJsZSB0eXBlcyBpbiBUaHJpZnQgYXJlOgogICoKICAqICBib29sICAgICAgICBCb29sZWFuLCBvbmUgYnl0ZQotICogIGJ5dGUgICAgICAgIFNpZ25lZCBieXRlCisgKiAgaTggKGJ5dGUpICAgU2lnbmVkIDgtYml0IGludGVnZXIKICAqICBpMTYgICAgICAgICBTaWduZWQgMTYtYml0IGludGVnZXIKICAqICBpMzIgICAgICAgICBTaWduZWQgMzItYml0IGludGVnZXIKICAqICBpNjQgICAgICAgICBTaWduZWQgNjQtYml0IGludGVnZXIKQEAgLTYyLDExICs2MiwxNiBAQAogICogVGhyaWZ0IGZpbGVzIGNhbiBuYW1lc3BhY2UsIHBhY2thZ2UsIG9yIHByZWZpeCB0aGVpciBvdXRwdXQgaW4gdmFyaW91cwogICogdGFyZ2V0IGxhbmd1YWdlcy4KICAqLworCituYW1lc3BhY2UgY2wgdHV0b3JpYWwKIG5hbWVzcGFjZSBjcHAgdHV0b3JpYWwKIG5hbWVzcGFjZSBkIHR1dG9yaWFsCituYW1lc3BhY2UgZGFydCB0dXRvcmlhbAogbmFtZXNwYWNlIGphdmEgdHV0b3JpYWwKIG5hbWVzcGFjZSBwaHAgdHV0b3JpYWwKIG5hbWVzcGFjZSBwZXJsIHR1dG9yaWFsCituYW1lc3BhY2UgaGF4ZSB0dXRvcmlhbAorbmFtZXNwYWNlIG5ldGNvcmUgdHV0b3JpYWwKIAogLyoqCiAgKiBUaHJpZnQgbGV0cyB5b3UgZG8gdHlwZWRlZnMgdG8gZ2V0IHByZXR0eSBuYW1lcyBmb3IgeW91ciB0eXBlcy4gU3RhbmRhcmQKQEAgLTExMiw3ICsxMTcsNyBAQAogICogU3RydWN0cyBjYW4gYWxzbyBiZSBleGNlcHRpb25zLCBpZiB0aGV5IGFyZSBuYXN0eS4KICAqLwogZXhjZXB0aW9uIEludmFsaWRPcGVyYXRpb24gewotICAxOiBpMzIgd2hhdCwKKyAgMTogaTMyIHdoYXRPcCwKICAgMjogc3RyaW5nIHdoeQogfQogCg==